From 75de955577d2d937de69869f7d60a6d973751913 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sat, 5 Sep 2026 20:49:22 -0700 Subject: [PATCH 001/831] Align external stream input and output replay schedules --- CHANGELOG.md | 12 ++++ temporalio/bridge/sdk-core | 2 +- .../external_workflow_streams/_runtime.py | 28 ++++++-- temporalio/worker/_workflow_instance.py | 10 +++ .../test_output_runtime.py | 65 +++++++++++++++++++ 5 files changed, 109 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed9ded4a5..61ea270dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,18 @@ to include examples, links to docs, or any other relevant information. ## [Unreleased] +### Fixed + +- Preserve empty activations in the shared External Workflow Streams input and + output replay schedule. Workflows that read input, publish decisions, and + schedule Activities now reproduce that schedule during replay. Inconsistent + prerelease markers are rejected explicitly rather than guessing where omitted + activations belonged. +- Resume external input waits when cold replay encounters a wake in an already + loaded History page, including Workers with workflow caching disabled. +- Avoid an unnecessary output replacement Workflow Task after stream input has + resumed the Workflow and it is waiting on an Activity or timer. + ### Added - Added experimental External Workflow Streams in diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 271c0474f..f88293a9d 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 271c0474fd8ab0459ed5a022923a0fc700525e12 +Subproject commit f88293a9da09cfb8ac3f1988579dc3f98e84cf6b diff --git a/temporalio/contrib/external_workflow_streams/_runtime.py b/temporalio/contrib/external_workflow_streams/_runtime.py index d3e091445..09b38bab0 100644 --- a/temporalio/contrib/external_workflow_streams/_runtime.py +++ b/temporalio/contrib/external_workflow_streams/_runtime.py @@ -327,8 +327,10 @@ def __init__( #: refused for: a fresh annotation is the most room there will ever be, so #: refusing there rolls over to an annotation that refuses identically. self._segments_in_annotation = 0 - #: Set when a subscription is registered or a record delivered, so an - #: activation that changed nothing at all emits nothing. + #: A late first subscription must preserve the earlier empty drains in + #: the same task, without making unrelated workflows write markers. + self._unobserved_segments = 0 + self._segment_pending = True self._observed_this_activation = False #: `wait_id -> Future`, awaited by Workflow code and resolved by the #: readiness activation. It lives here rather than on either side alone @@ -428,12 +430,14 @@ def begin_activation(self, history_floor_event_id: int | None = None) -> None: ) if self._output_history_floor_event_id != history_floor_event_id: self._output_segments = [] + self._unobserved_segments = 0 self._output_history_floor_event_id = history_floor_event_id for waiter in self._output_capacity_waiters: if not waiter.done(): waiter.set_result(None) self._output_capacity_waiters = [] self._output_segments.append({}) + self._segment_pending = True def delivery_budget_remaining(self) -> int: """How many more records this activation may hand to Workflow code. @@ -1638,11 +1642,21 @@ def close_segment(self, reason: SegmentEndReason | None = None) -> None: nothing still ran one event-loop drain, and replay must reproduce that drain or ``wait_condition`` predicates fire a different number of times. """ - if not self._observed_this_activation: + if not self._observed_this_activation and not self._segment_pending: + return + self._segment_pending = False + if not self._observed_this_activation and not self._subscriptions: + self._unobserved_segments += 1 return if reason is None: reason = self._segment_end_reason() accumulator = self._ensure_accumulator() + for _ in range(self._unobserved_segments): + self._pending_deltas.append( + accumulator.add_segment(Segment((), SegmentEndReason.NO_DATA_AVAILABLE)) + ) + self._segments_in_annotation += 1 + self._unobserved_segments = 0 self._pending_deltas.append( accumulator.add_segment(Segment(tuple(self._runs), reason)) ) @@ -1686,10 +1700,9 @@ def _segment_end_reason(self) -> SegmentEndReason: def take_observation_delta(self) -> bytes | None: """The bytes to put on this completion's `WorkflowStreamProgress`. - ``None`` means nothing replay-visible changed, which is the only case - where a completion legitimately carries no progress command -- and a - replay delivery is exactly that case, since everything it delivered is - already recorded in the marker being replayed. + Once an input subscription exists, even an empty activation belongs to + the shared input/output replay schedule. Workflows that never subscribe + still emit nothing, and replay does not rewrite its existing marker. """ if self._replay_ready is not None: return None @@ -1786,6 +1799,7 @@ def start_new_annotation(self) -> None: self._run_sizes = [] self._max_run_bytes = 0 self._segments_in_annotation = 0 + self._unobserved_segments = 0 self._observed_this_activation = False self._annotation_start = { wait_id: state.delivery_cursor diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index c3db3f3ce..7dcf7cd78 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -936,6 +936,16 @@ def _apply_replay_external_streams( runtime.begin_output_replay(output) self._pending_output_replay_finish = True plan = runtime.take_replay_plan() + if ( + has_output + and plan is not None + and len(plan.segments) != len(output_segments) + ): + raise temporalio.workflow.NondeterminismError( + "External stream History has incompatible input and output " + "activation schedules. This prerelease marker omitted empty " + "input activations, whose positions cannot be recovered safely." + ) if plan is None: if has_output: # An output-only marker deliberately has no input ReplayPlan. diff --git a/tests/contrib/external_workflow_streams/test_output_runtime.py b/tests/contrib/external_workflow_streams/test_output_runtime.py index 1c58854a7..049f78a2a 100644 --- a/tests/contrib/external_workflow_streams/test_output_runtime.py +++ b/tests/contrib/external_workflow_streams/test_output_runtime.py @@ -16,6 +16,7 @@ import temporalio.bridge.proto.workflow_completion import temporalio.converter import temporalio.workflow +from temporalio.contrib.external_workflow_streams._annotation import decode_annotation from temporalio.contrib.external_workflow_streams._backend import StreamKey from temporalio.contrib.external_workflow_streams._errors import ( ExternalStreamCapacityError, @@ -1064,3 +1065,67 @@ def test_input_and_output_share_one_replay_segment_drain_schedule() -> None: "abandon-output", "end-input", ] + + +def test_ambiguous_legacy_combined_schedule_is_rejected_before_drain() -> None: + runtime = _CombinedReplayRuntime() + driver = _CombinedReplayDriver(runtime) + output = SimpleNamespace(segments=(object(), object(), object(), object())) + job = SimpleNamespace(output=output, HasField=lambda field: field == "output") + + apply_replay = cast(Any, _WorkflowInstanceImpl._apply_replay_external_streams) + with pytest.raises( + temporalio.workflow.NondeterminismError, match="incompatible input and output" + ): + apply_replay(driver, job) + + assert runtime.events == ["begin-output"] + + +@pytest.mark.parametrize("subscription_exists", [False, True]) +async def test_combined_marker_preserves_empty_input_activations( + runtime: WorkflowStreamRuntime, subscription_exists: bool +) -> None: + key = runtime.stream_key("inputs") + if subscription_exists: + runtime.begin_activation(1) + runtime.register(wait_id=1, stream_key=key) + runtime.take_observation_delta() + runtime.add_terminal() + + deltas = [] + try: + for index in range(4): + runtime.begin_activation(7) + if index == 1 and not subscription_exists: + runtime.register(wait_id=1, stream_key=key) + if index in (1, 3): + record = StreamRecord( + RecordKind.DATA, b"input", "producer", index + ).placed_at(Offset(f"{index}-0")) + runtime.record_delivery(1, record) + await runtime.publish_output( + topic="events", + value=str(index), + value_type=str, + kind=RecordKind.DATA, + max_publish_latency=timedelta(seconds=1), + max_records=10, + max_logical_bytes=10_000, + ) + delta = runtime.take_observation_delta() + if delta is not None: + deltas.append(delta) + deltas.append(runtime.add_terminal()) + staged = await runtime.stage_output(7) + annotation = decode_annotation(b"".join(deltas)) + + assert [bool(segment.runs) for segment in annotation.segments] == [ + False, + True, + False, + True, + ] + assert staged.segment_record_counts == ((0,), (1,), (0,), (1,)) + finally: + await runtime._manager.shutdown() From c00339e6ea5138c496984ece4da8e4c2c8bcedfc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sat, 5 Sep 2026 21:10:22 -0700 Subject: [PATCH 002/831] Preserve stream task retention with zero workflow cache --- CHANGELOG.md | 3 +++ temporalio/bridge/sdk-core | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61ea270dd..6f1441833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,9 @@ to include examples, links to docs, or any other relevant information. loaded History page, including Workers with workflow caching disabled. - Avoid an unnecessary output replacement Workflow Task after stream input has resumed the Workflow and it is waiting on an Activity or timer. +- Keep an incomplete retained external stream task alive when workflow caching + is disabled; evict it after its normal task boundary instead of repeatedly + interrupting input readiness with shutdown markers. ### Added diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index f88293a9d..975bf0e96 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit f88293a9da09cfb8ac3f1988579dc3f98e84cf6b +Subproject commit 975bf0e96a9951d7279886be7d837bf09376f617 From 632e16f8d698bc67884615bf1ecb3916f53cd579 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:51:50 -0700 Subject: [PATCH 003/831] Put the shared stream interface on the repaired external SDK. --- .gitmodules | 4 +- streams_demo/agent_loop.py | 92 ++ streams_demo/provider_setup.py | 50 + streams_demo/results-external/history.json | 1209 +++++++++++++++++ streams_demo/results-external/results.json | 107 ++ streams_demo/run_demo.py | 154 +++ .../contrib/external_workflow_streams/_api.py | 15 +- temporalio/streams/__init__.py | 135 ++ temporalio/streams/_binding.py | 356 +++++ temporalio/streams/_frame.py | 72 + temporalio/streams/_handles.py | 215 +++ temporalio/streams/_policy.py | 56 + temporalio/streams/_record.py | 90 ++ 13 files changed, 2552 insertions(+), 3 deletions(-) create mode 100644 streams_demo/agent_loop.py create mode 100644 streams_demo/provider_setup.py create mode 100644 streams_demo/results-external/history.json create mode 100644 streams_demo/results-external/results.json create mode 100644 streams_demo/run_demo.py create mode 100644 temporalio/streams/__init__.py create mode 100644 temporalio/streams/_binding.py create mode 100644 temporalio/streams/_frame.py create mode 100644 temporalio/streams/_handles.py create mode 100644 temporalio/streams/_policy.py create mode 100644 temporalio/streams/_record.py diff --git a/.gitmodules b/.gitmodules index 0c2f5d5bf..ca2f7cff0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/mfateev/sdk-core.git - branch = task/python-sdk-streaming + url = https://github.com/moedash/sdk-rust.git + branch = moe/AI-198-external-core-repairs diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py new file mode 100644 index 000000000..afbb7ea4c --- /dev/null +++ b/streams_demo/agent_loop.py @@ -0,0 +1,92 @@ +"""One agent loop, written once, run on both stream providers. + +Reads input, decides on it, publishes the decision, and runs an ordinary +Activity in the same workflow task. Also handles the two control records the +contract defines, so a retried producer and a finished topic are exercised +rather than described. + +This file is byte-identical in the server-side tree and the client-side tree. +Only the worker that runs it differs, and only in which provider it is given. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any + +from temporalio import activity, streams, workflow + +DECISIONS = "decisions" +INPUTS = "inputs" + + +@activity.defn(name="AI198RecordDecision") +async def record_decision(decision: dict[str, Any]) -> str: + """An ordinary command in the same task as the publish.""" + return f"recorded:{decision['source']}:{decision['branch']}" + + +def decide(token: dict[str, Any]) -> dict[str, Any]: + """The decision the workflow is here to make.""" + if token["value"] % 2 == 0: + return {"source": token["id"], "branch": "even", "computed": token["value"] * 10} + return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} + + +@workflow.defn(name="AI198StreamContractDemo", sandboxed=False) +class AgentLoop: + """Read, decide, write, until the producer says it has finished.""" + + @workflow.run + async def run(self, limit: int) -> list[dict[str, Any]]: + inputs = streams.reader( + INPUTS, type=dict, idle_timeout=timedelta(seconds=1) + ) + decisions = streams.writer(DECISIONS) + trace: list[dict[str, Any]] = [] + accepted = 0 + try: + async for record in inputs: + if record.kind is streams.RecordKind.SUPERSEDED: + # A newer attempt of the same producer started writing. The + # decisions already published stand, so the workflow says so + # rather than pretending they can be withdrawn. + trace.append( + { + "kind": "superseded", + "producer": record.producer, + "replaced": record.value.previous_attempt, + "attempt": record.value.attempt, + } + ) + await decisions.publish( + {"retracting_attempt": record.value.previous_attempt} + ) + continue + if record.kind is streams.RecordKind.FINISH: + # The producer says it is done, which is what ends the loop. + # Counting decisions instead would leave the terminal record + # unread and let the workflow finish while its producer is + # still writing. + trace.append({"kind": "finish", "producer": record.producer}) + break + decision = decide(record.value) + await decisions.publish(decision) + receipt = await workflow.execute_activity( + record_decision, + decision, + activity_id=f"decision-{decision['source']}", + start_to_close_timeout=timedelta(seconds=10), + ) + trace.append( + {"kind": "decision", "value": decision, "receipt": receipt} + ) + accepted += 1 + if accepted >= limit: + # A bound so a stuck producer cannot run this forever. The + # terminal record above is the ordinary way out. + break + finally: + inputs.close() + await decisions.finish() + return trace diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py new file mode 100644 index 000000000..1b9d5c03f --- /dev/null +++ b/streams_demo/provider_setup.py @@ -0,0 +1,50 @@ +"""Choose the client-side provider. + +The store is a Redis the customer runs, so this process constructs the backend +and is responsible for closing it. +""" + +from __future__ import annotations + +import json +import os +from pathlib import Path +from typing import Any + +import redis.asyncio +from temporalio.contrib.external_workflow_streams._redis import RedisStreamBackend + +NAME = "external" + +WORKFLOW_CACHE = int(os.environ.get("AI198_CACHE", "2")) +"""The smallest cache this provider runs on. + +It holds the workflow task open between records, which a run that can be +evicted cannot do. Below two, a consuming workflow stops with no error and no +failed task. Recovery has to be tested by killing the worker rather than by +shrinking the cache. +""" + +_backend: RedisStreamBackend | None = None + + +async def open() -> tuple[str, dict[str, Any]]: + """The server to connect to, and the provider options.""" + global _backend + ready = Path(__file__).resolve().parents[2] / "verify/ready.json" + url = os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399") + # redis-py defaults to a socket timeout equal to this provider's own + # blocking read, so an idle read would abandon a healthy socket. + _backend = RedisStreamBackend( + client=redis.asyncio.from_url(url, decode_responses=False, socket_timeout=30), + key_prefix=os.environ.get("AI198_REDIS_PREFIX", "ai198-contract"), + ) + return json.loads(ready.read_text())["target"], {"backend": _backend} + + +async def close() -> None: + """Release the store this process opened.""" + global _backend + if _backend is not None: + await _backend.aclose() + _backend = None diff --git a/streams_demo/results-external/history.json b/streams_demo/results-external/history.json new file mode 100644 index 000000000..75295aa6b --- /dev/null +++ b/streams_demo/results-external/history.json @@ -0,0 +1,1209 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2026-09-06T18:11:22.157533Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1050382", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "AI198StreamContractDemo" + }, + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "OA==" + } + ] + }, + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "01a077ea-f5ad-781e-b17e-b21618fa7a7f", + "identity": "26823@Mac.lan", + "firstExecutionRunId": "01a077ea-f5ad-781e-b17e-b21618fa7a7f", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "workflowId": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "priority": {} + } + }, + { + "eventId": "2", + "eventTime": "2026-09-06T18:11:22.157567Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050383", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2026-09-06T18:11:22.160155Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050388", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "26823@Mac.lan", + "requestId": "4af9762f-b065-4f3e-bbb0-17a6546a7ee6", + "historySizeBytes": "404", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "4", + "eventTime": "2026-09-06T18:11:22.174162Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050393", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "startedEventId": "3", + "identity": "26823@Mac.lan", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + }, + "sdkMetadata": { + "coreUsedFlags": [ + 2, + 1, + 3 + ], + "sdkName": "temporal-python", + "sdkVersion": "1.31.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2026-09-06T18:11:22.174189Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050394", + "markerRecordedEventAttributes": { + "markerName": "core_external_stream", + "details": { + "external_stream": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAEQARoECAEQASK+AQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAA1yZWRpcy1zdHJlYW1zAQIAAQIBAQ8xNzg4NzE4MjgyMTcxLTAPMTc4ODcxODI4MjE3MS0wAQABAwEBAQ8xNzg4NzE4MjgyMTcxLTAoBjKdAQgBEAEaIFNsYVBscXRXTmF5Y2VpSDByRlVqRElLVE1XTTVYUk1FIAEqJDAxYTA3N2VhLWY1YWQtNzgxZS1iMTdlLWIyMTYxOGZhN2E3ZjIyCglkZWNpc2lvbnMQARi0ASIgjBxO69u2MphhOmkhkT4NDYD9yThaPpqKHcAWa2oslZg6AwoBADoDCgEBQg1yZWRpcy1zdHJlYW1zSAE=" + } + ] + } + }, + "workflowTaskCompletedEventId": "4" + } + }, + { + "eventId": "6", + "eventTime": "2026-09-06T18:11:22.174198Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1050395", + "activityTaskScheduledEventAttributes": { + "activityId": "decision-r1", + "activityType": { + "name": "AI198RecordDecision" + }, + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJicmFuY2giOiJvZGQiLCJjb21wdXRlZCI6MTAxLCJzb3VyY2UiOiJyMSJ9" + } + ] + }, + "scheduleToCloseTimeout": "0s", + "scheduleToStartTimeout": "0s", + "startToCloseTimeout": "10s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "4", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2.0, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true, + "priority": {} + } + }, + { + "eventId": "7", + "eventTime": "2026-09-06T18:11:22.174212Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1050399", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "6", + "identity": "26823@Mac.lan", + "requestId": "58663e42-9843-4b02-82cd-bf5176975d5c", + "attempt": 1, + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "8", + "eventTime": "2026-09-06T18:11:22.175897Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1050400", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "InJlY29yZGVkOnIxOm9kZCI=" + } + ] + }, + "scheduledEventId": "6", + "startedEventId": "7", + "identity": "26823@Mac.lan" + } + }, + { + "eventId": "9", + "eventTime": "2026-09-06T18:11:22.175903Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050401", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "10", + "eventTime": "2026-09-06T18:11:22.176609Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050404", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "9", + "identity": "26823@Mac.lan", + "requestId": "c04f1c35-feda-443d-9764-f1b9d9308366", + "historySizeBytes": "1653", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "11", + "eventTime": "2026-09-06T18:11:22.183152Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050410", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "9", + "startedEventId": "10", + "identity": "26823@Mac.lan", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "12", + "eventTime": "2026-09-06T18:11:22.183168Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050411", + "markerRecordedEventAttributes": { + "markerName": "core_external_stream", + "details": { + "external_stream": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAEQARoECAEQAiLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAQ8xNzg4NzE4MjgyMTcxLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODI4MjE4MS0wDzE3ODg3MTgyODIxODEtMAEAAQMBAQEPMTc4ODcxODI4MjE4MS0wKAYynQEIARABGiB0cFZkaG9qaW0wUTBtLWlkSzNrV3Z3N2poQkU5MmFORSAIKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YyMgoJZGVjaXNpb25zEAEYtAEiIEG2KSpLbvL+t7NXgoIazG7djtT9TCEi2Caa1YjB4xlZOgMKAQA6AwoBAUINcmVkaXMtc3RyZWFtc0gB" + } + ] + } + }, + "workflowTaskCompletedEventId": "11" + } + }, + { + "eventId": "13", + "eventTime": "2026-09-06T18:11:22.183175Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1050412", + "activityTaskScheduledEventAttributes": { + "activityId": "decision-r2", + "activityType": { + "name": "AI198RecordDecision" + }, + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJicmFuY2giOiJldmVuIiwiY29tcHV0ZWQiOjIwLCJzb3VyY2UiOiJyMiJ9" + } + ] + }, + "scheduleToCloseTimeout": "0s", + "scheduleToStartTimeout": "0s", + "startToCloseTimeout": "10s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "11", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2.0, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true, + "priority": {} + } + }, + { + "eventId": "14", + "eventTime": "2026-09-06T18:11:22.180649Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050413", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMx" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "1df2f713-fd2d-53fb-baa7-c57b9f5793a8" + } + }, + { + "eventId": "15", + "eventTime": "2026-09-06T18:11:22.183190Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050414", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "16", + "eventTime": "2026-09-06T18:11:22.183924Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050418", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "15", + "identity": "26823@Mac.lan", + "requestId": "9efbed6e-9cfb-4854-896d-bac0d1f26f81", + "historySizeBytes": "2936", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "17", + "eventTime": "2026-09-06T18:11:22.188413Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050424", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "15", + "startedEventId": "16", + "identity": "26823@Mac.lan", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "18", + "eventTime": "2026-09-06T18:11:22.183185Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1050425", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "13", + "identity": "26823@Mac.lan", + "requestId": "2ef67959-882a-4107-8539-d5196556c9f8", + "attempt": 1, + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "19", + "eventTime": "2026-09-06T18:11:22.187585Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050426", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "e43a9981-456e-5236-9b51-9ab044957092" + } + }, + { + "eventId": "20", + "eventTime": "2026-09-06T18:11:22.184543Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1050427", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "InJlY29yZGVkOnIyOmV2ZW4i" + } + ] + }, + "scheduledEventId": "13", + "startedEventId": "18", + "identity": "26823@Mac.lan" + } + }, + { + "eventId": "21", + "eventTime": "2026-09-06T18:11:22.188436Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050428", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "22", + "eventTime": "2026-09-06T18:11:22.189479Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050431", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "21", + "identity": "26823@Mac.lan", + "requestId": "a7e422ab-0ccb-400b-b202-9cb14c072dbe", + "historySizeBytes": "3696", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "23", + "eventTime": "2026-09-06T18:11:22.705946Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050437", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "21", + "startedEventId": "22", + "identity": "26823@Mac.lan", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "24", + "eventTime": "2026-09-06T18:11:22.705975Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050438", + "markerRecordedEventAttributes": { + "markerName": "core_external_stream", + "details": { + "external_stream": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAEQARoECAEQAyLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAQ8xNzg4NzE4MjgyMTgxLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODI4MjcwMS0wDzE3ODg3MTgyODI3MDEtMAEAAQMBAQEPMTc4ODcxODI4MjcwMS0wKAYynQEIARABGiB1UENKbTNlcWEwa2dqS25xMHhlTUZYeHlJSHU4bWVHUSAUKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YyMgoJZGVjaXNpb25zEAIY0wIiIMlkAX98qOr68/irYtiKi0b09uWIahOZe6Q558yOXlphOgMKAQA6AwoBAkINcmVkaXMtc3RyZWFtc0gB" + } + ] + } + }, + "workflowTaskCompletedEventId": "23" + } + }, + { + "eventId": "25", + "eventTime": "2026-09-06T18:11:22.705985Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1050439", + "activityTaskScheduledEventAttributes": { + "activityId": "decision-r3", + "activityType": { + "name": "AI198RecordDecision" + }, + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJicmFuY2giOiJvZGQiLCJjb21wdXRlZCI6MTAzLCJzb3VyY2UiOiJyMyJ9" + } + ] + }, + "scheduleToCloseTimeout": "0s", + "scheduleToStartTimeout": "0s", + "startToCloseTimeout": "10s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "23", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2.0, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true, + "priority": {} + } + }, + { + "eventId": "26", + "eventTime": "2026-09-06T18:11:22.191345Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050440", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMx" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "37d1b402-38c8-5dda-8645-d585db292a63" + } + }, + { + "eventId": "27", + "eventTime": "2026-09-06T18:11:22.706006Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050441", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "28", + "eventTime": "2026-09-06T18:11:22.706861Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050445", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "27", + "identity": "26823@Mac.lan", + "requestId": "25930a39-9163-4f47-8e21-cb2b48d61d84", + "historySizeBytes": "4983", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "29", + "eventTime": "2026-09-06T18:11:22.715797Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050451", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "27", + "startedEventId": "28", + "identity": "26823@Mac.lan", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "30", + "eventTime": "2026-09-06T18:11:22.705999Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1050452", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "25", + "identity": "26823@Mac.lan", + "requestId": "a725c165-a214-4892-916c-76e1ea839d7c", + "attempt": 1, + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "31", + "eventTime": "2026-09-06T18:11:22.715327Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050453", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "2fbd7436-ef53-5aea-a0a0-f5580216293b" + } + }, + { + "eventId": "32", + "eventTime": "2026-09-06T18:11:22.707608Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1050454", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "InJlY29yZGVkOnIzOm9kZCI=" + } + ] + }, + "scheduledEventId": "25", + "startedEventId": "30", + "identity": "26823@Mac.lan" + } + }, + { + "eventId": "33", + "eventTime": "2026-09-06T18:11:22.715826Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050455", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "34", + "eventTime": "2026-09-06T18:11:22.716505Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050458", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMy" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "8399a538-2d53-53ec-8373-46b5609feb7b" + } + }, + { + "eventId": "35", + "eventTime": "2026-09-06T18:11:22.716835Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050460", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "33", + "identity": "26823@Mac.lan", + "requestId": "b3544f16-128d-491f-8ecf-d7f185abaa08", + "historySizeBytes": "6008", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "36", + "eventTime": "2026-09-06T18:11:22.727247Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050467", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "33", + "startedEventId": "35", + "identity": "26823@Mac.lan", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "37", + "eventTime": "2026-09-06T18:11:22.727270Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050468", + "markerRecordedEventAttributes": { + "markerName": "core_external_stream", + "details": { + "external_stream": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAEQARoECAEQBCLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAQ8xNzg4NzE4MjgyNzAxLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODI4MjcxOC0wDzE3ODg3MTgyODI3MTgtMAEAAQMBAQEPMTc4ODcxODI4MjcxOC0wKAYynQEIARABGiA0WXNrdDcwVHNsUWVLRUdCVVV1Y3NTZDJnZjZIWk10SyAgKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YyMgoJZGVjaXNpb25zEAEYtAEiID5nSwItjUt3xrIwLwmnksCGdUXwRytSYqhf4/HFL9GVOgMKAQA6AwoBAUINcmVkaXMtc3RyZWFtc0gB" + } + ] + } + }, + "workflowTaskCompletedEventId": "36" + } + }, + { + "eventId": "38", + "eventTime": "2026-09-06T18:11:22.727280Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "taskId": "1050469", + "activityTaskScheduledEventAttributes": { + "activityId": "decision-r4", + "activityType": { + "name": "AI198RecordDecision" + }, + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJicmFuY2giOiJldmVuIiwiY29tcHV0ZWQiOjQwLCJzb3VyY2UiOiJyNCJ9" + } + ] + }, + "scheduleToCloseTimeout": "0s", + "scheduleToStartTimeout": "0s", + "startToCloseTimeout": "10s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "36", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2.0, + "maximumInterval": "100s" + }, + "useWorkflowBuildId": true, + "priority": {} + } + }, + { + "eventId": "39", + "eventTime": "2026-09-06T18:11:22.722015Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050470", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "39da5ac8-0f7a-5872-9d15-165c2b32f2cf" + } + }, + { + "eventId": "40", + "eventTime": "2026-09-06T18:11:22.724282Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050471", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "46ea13fa-03d0-56b3-971f-658b3c5b2dea" + } + }, + { + "eventId": "41", + "eventTime": "2026-09-06T18:11:22.727305Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050472", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "42", + "eventTime": "2026-09-06T18:11:22.728358Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050476", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "41", + "identity": "26823@Mac.lan", + "requestId": "bf6b249a-a171-4571-b49a-2dd98bc0d8a6", + "historySizeBytes": "7543", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "43", + "eventTime": "2026-09-06T18:11:22.737729Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050485", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "41", + "startedEventId": "42", + "identity": "26823@Mac.lan", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "44", + "eventTime": "2026-09-06T18:11:22.727297Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "taskId": "1050486", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "38", + "identity": "26823@Mac.lan", + "requestId": "e9cf5853-0b8f-425c-92f7-6eccfc1585e3", + "attempt": 1, + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "45", + "eventTime": "2026-09-06T18:11:22.730443Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050487", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMy" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "46cf9d72-14a4-5d2c-a6df-6ef2fa8f0975" + } + }, + { + "eventId": "46", + "eventTime": "2026-09-06T18:11:22.733340Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050488", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "4eeaeff4-edb1-5ad1-aa05-14d5fe21efd9" + } + }, + { + "eventId": "47", + "eventTime": "2026-09-06T18:11:22.735277Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050489", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "c5856df4-2d45-5a5f-a25a-ac5656b800bb" + } + }, + { + "eventId": "48", + "eventTime": "2026-09-06T18:11:22.737445Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050490", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "c817c883-d225-5657-9320-5685eee70ab4" + } + }, + { + "eventId": "49", + "eventTime": "2026-09-06T18:11:22.729071Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "taskId": "1050491", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "InJlY29yZGVkOnI0OmV2ZW4i" + } + ] + }, + "scheduledEventId": "38", + "startedEventId": "44", + "identity": "26823@Mac.lan" + } + }, + { + "eventId": "50", + "eventTime": "2026-09-06T18:11:22.737758Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050492", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "51", + "eventTime": "2026-09-06T18:11:22.738595Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050495", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "50", + "identity": "26823@Mac.lan", + "requestId": "8645299a-6b83-48a4-b193-fa6477e6a412", + "historySizeBytes": "9075", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "52", + "eventTime": "2026-09-06T18:11:22.748540Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_FAILED", + "taskId": "1050503", + "workflowTaskFailedEventAttributes": { + "scheduledEventId": "50", + "startedEventId": "51", + "cause": "WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND", + "failure": { + "message": "UnhandledCommand", + "serverFailureInfo": {} + }, + "identity": "26823@Mac.lan" + } + }, + { + "eventId": "53", + "eventTime": "2026-09-06T18:11:22.741945Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050504", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMy" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "8645d950-0d4c-5660-b6c7-24ffd557507f" + } + }, + { + "eventId": "54", + "eventTime": "2026-09-06T18:11:22.743630Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050505", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "dbf5475f-1e51-56f5-a094-57adb5e5d7c3" + } + }, + { + "eventId": "55", + "eventTime": "2026-09-06T18:11:22.745447Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050506", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "44d26222-20e8-5363-b60f-7d315980020d" + } + }, + { + "eventId": "56", + "eventTime": "2026-09-06T18:11:22.747175Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "taskId": "1050507", + "workflowExecutionSignaledEventAttributes": { + "signalName": "__temporal_external_stream_wake", + "input": { + "payloads": [ + { + "metadata": { + "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + } + ] + }, + "identity": "26823@Mac.lan", + "requestId": "8206e1fa-6e16-5e8c-9467-67fa2a3aa353" + } + }, + { + "eventId": "57", + "eventTime": "2026-09-06T18:11:22.748568Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1050508", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "58", + "eventTime": "2026-09-06T18:11:22.749316Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1050511", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "57", + "identity": "26823@Mac.lan", + "requestId": "8beba935-535b-42df-970d-a1ad3d0a885f", + "historySizeBytes": "10377", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + } + } + }, + { + "eventId": "59", + "eventTime": "2026-09-06T18:11:27.755216Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1050515", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "57", + "startedEventId": "58", + "identity": "26823@Mac.lan", + "workerVersion": { + "buildId": "5876163392d8546a76682b853febd140" + }, + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "60", + "eventTime": "2026-09-06T18:11:27.755239Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1050516", + "markerRecordedEventAttributes": { + "markerName": "core_external_stream", + "details": { + "external_stream": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAEQBRoECAEQBSLaAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAQ8xNzg4NzE4MjgyNzE4LTANcmVkaXMtc3RyZWFtcwECAAECAAECAAECAAECAAECAQEPMTc4ODcxODI4MjczMS0wDzE3ODg3MTgyODI3MzEtMAEAAQMBAQEPMTc4ODcxODI4MjczMS0wKAcysAEIARABGiB1S0JESWJiX3pEYnlqUFNZZXloXzlJSDAxeVZhbnR2XyA4KiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YyMQoJZGVjaXNpb25zEAEYbSIg3ClteUJUVTZweyuvvwlOF9DoWSLrxmpqEsPbZESWN6I6AwoBADoDCgEAOgMKAQA6AwoBADoDCgEAOgMKAQFCDXJlZGlzLXN0cmVhbXNIAQ==" + } + ] + } + }, + "workflowTaskCompletedEventId": "59" + } + }, + { + "eventId": "61", + "eventTime": "2026-09-06T18:11:27.755243Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "taskId": "1050517", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "W3sia2luZCI6ImRlY2lzaW9uIiwicmVjZWlwdCI6InJlY29yZGVkOnIxOm9kZCIsInZhbHVlIjp7ImJyYW5jaCI6Im9kZCIsImNvbXB1dGVkIjoxMDEsInNvdXJjZSI6InIxIn19LHsia2luZCI6ImRlY2lzaW9uIiwicmVjZWlwdCI6InJlY29yZGVkOnIyOmV2ZW4iLCJ2YWx1ZSI6eyJicmFuY2giOiJldmVuIiwiY29tcHV0ZWQiOjIwLCJzb3VyY2UiOiJyMiJ9fSx7ImF0dGVtcHQiOjIsImtpbmQiOiJzdXBlcnNlZGVkIiwicHJvZHVjZXIiOiJtb2RlbCIsInJlcGxhY2VkIjoxfSx7ImtpbmQiOiJkZWNpc2lvbiIsInJlY2VpcHQiOiJyZWNvcmRlZDpyMzpvZGQiLCJ2YWx1ZSI6eyJicmFuY2giOiJvZGQiLCJjb21wdXRlZCI6MTAzLCJzb3VyY2UiOiJyMyJ9fSx7ImtpbmQiOiJkZWNpc2lvbiIsInJlY2VpcHQiOiJyZWNvcmRlZDpyNDpldmVuIiwidmFsdWUiOnsiYnJhbmNoIjoiZXZlbiIsImNvbXB1dGVkIjo0MCwic291cmNlIjoicjQifX0seyJraW5kIjoiZmluaXNoIiwicHJvZHVjZXIiOiJtb2RlbCJ9XQ==" + } + ] + }, + "workflowTaskCompletedEventId": "59" + } + } + ] +} \ No newline at end of file diff --git a/streams_demo/results-external/results.json b/streams_demo/results-external/results.json new file mode 100644 index 000000000..e902198c8 --- /dev/null +++ b/streams_demo/results-external/results.json @@ -0,0 +1,107 @@ +{ + "provider": "external", + "workflow_id": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "target": "127.0.0.1:53266", + "max_cached_workflows": 0, + "outcome": "completed", + "trace": [ + { + "kind": "decision", + "receipt": "recorded:r1:odd", + "value": { + "branch": "odd", + "computed": 101, + "source": "r1" + } + }, + { + "kind": "decision", + "receipt": "recorded:r2:even", + "value": { + "branch": "even", + "computed": 20, + "source": "r2" + } + }, + { + "attempt": 2, + "kind": "superseded", + "producer": "model", + "replaced": 1 + }, + { + "kind": "decision", + "receipt": "recorded:r3:odd", + "value": { + "branch": "odd", + "computed": 103, + "source": "r3" + } + }, + { + "kind": "decision", + "receipt": "recorded:r4:even", + "value": { + "branch": "even", + "computed": 40, + "source": "r4" + } + }, + { + "kind": "finish", + "producer": "model" + } + ], + "task_failures": [ + { + "event_id": 52, + "cause": 1, + "message": "UnhandledCommand" + } + ], + "observed_output": [ + { + "kind": "DATA", + "value": { + "branch": "odd", + "computed": 101, + "source": "r1" + } + }, + { + "kind": "DATA", + "value": { + "branch": "even", + "computed": 20, + "source": "r2" + } + }, + { + "kind": "DATA", + "value": { + "retracting_attempt": 1 + } + }, + { + "kind": "DATA", + "value": { + "branch": "odd", + "computed": 103, + "source": "r3" + } + }, + { + "kind": "DATA", + "value": { + "branch": "even", + "computed": 40, + "source": "r4" + } + }, + { + "kind": "FINISH", + "value": null + } + ], + "history_events": 61 +} diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py new file mode 100644 index 000000000..027a95103 --- /dev/null +++ b/streams_demo/run_demo.py @@ -0,0 +1,154 @@ +"""Run the shared agent loop against whichever provider is configured. + +Three cases, the same on both providers: + +- read, decide, publish and an ordinary Activity in the same workflow task, + with the smallest workflow cache the provider supports, so that as much of + the run as it allows is rebuilt rather than remembered; +- a producer whose second attempt supersedes its first, which the reader has + to report and the workflow has to act on; +- an outside consumer reading what the workflow published. + +Byte-identical in both trees. ``provider_setup`` is what differs, and it is +the only import here that names a provider. +""" + +from __future__ import annotations + +import asyncio +import json +from pathlib import Path +import sys +import time +import uuid +from typing import Any + +from temporalio import streams +from temporalio.api.enums.v1 import EventType +from temporalio.client import Client +from temporalio.worker import Worker + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 +import provider_setup # noqa: E402 + +DECISION_LIMIT = 8 +EXPECTED_OUTPUT = 6 + + +async def collect_output(client: Client, workflow_id: str, want: int) -> list[dict]: + reader = await streams.consumer(client, workflow_id=workflow_id) + seen: list[dict] = [] + async for record in reader.read(type=dict, topic="decisions"): + seen.append({"kind": record.kind.name, "value": record.value}) + if len(seen) >= want: + break + return seen + + +async def main() -> int: + out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" + out.mkdir(exist_ok=True) + target, options = await provider_setup.open() + client = await Client.connect(target, namespace="default") + streams.configure(**options) + + uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex + record: dict[str, Any] = { + "provider": provider_setup.NAME, + "workflow_id": uid, + "target": target, + "max_cached_workflows": provider_setup.WORKFLOW_CACHE, + } + + async with Worker( + client, + task_queue=uid, + workflows=[AgentLoop], + activities=[record_decision], + max_cached_workflows=provider_setup.WORKFLOW_CACHE, + **streams.worker_options(), + ): + handle = await client.start_workflow( + AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid + ) + output = asyncio.create_task(collect_output(client, uid, EXPECTED_OUTPUT)) + + # The first attempt writes two records and then stops, as a failed + # activity would. The second writes different inputs under the same + # logical producer, which is what the reader has to report. + first = await streams.producer( + client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=1 + ) + await first.append({"id": "r1", "value": 1}, {"id": "r2", "value": 2}) + await asyncio.sleep(0.5) + second = await streams.producer( + client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=2 + ) + await second.append({"id": "r3", "value": 3}, {"id": "r4", "value": 4}) + await second.finish() + + # A failed Workflow Task is not an outcome. The server rejects a + # completion that raced newly buffered events, and the retry usually + # gets through, so reading the first failure as the result reports a + # working run as a broken one. Wait for a terminal event, then report + # the retries separately so they are neither the headline nor hidden. + deadline = time.monotonic() + 120 + # Taken from the enum rather than written out, because guessing these + # numbers is how a run that completed gets reported as terminated. + terminal = { + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: "completed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: "workflow_failed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: "execution_timed_out", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: "canceled", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: "terminated", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: "continued_as_new", + } + while time.monotonic() < deadline: + history = await handle.fetch_history() + reached = [ + terminal[e.event_type] + for e in history.events + if e.event_type in terminal + ] + if reached: + record["outcome"] = reached[-1] + if record["outcome"] == "completed": + record["trace"] = await handle.result() + break + await asyncio.sleep(0.1) + else: + record["outcome"] = "timed_out_waiting" + history = await handle.fetch_history() + + retried = [ + e + for e in history.events + if e.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_FAILED + ] + record["task_failures"] = [ + { + "event_id": e.event_id, + "cause": int(e.workflow_task_failed_event_attributes.cause), + "message": e.workflow_task_failed_event_attributes.failure.message, + } + for e in retried + ] + + try: + record["observed_output"] = await asyncio.wait_for(output, timeout=20) + except asyncio.TimeoutError: + output.cancel() + record["observed_output"] = "timed_out" + + history = await handle.fetch_history() + record["history_events"] = len(history.events) + (out / "history.json").write_text(history.to_json()) + await provider_setup.close() + (out / "results.json").write_text(json.dumps(record, indent=2) + "\n") + print(json.dumps(record, indent=2)) + return 0 if record["outcome"] == "completed" else 1 + + +if __name__ == "__main__": + sys.exit(asyncio.run(main())) diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index 2ae02d391..af33bed81 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -35,6 +35,7 @@ classify_read_failure, ) from temporalio.contrib.external_workflow_streams._record import ( + Offset, StreamRecord, ) from temporalio.types import AnyType @@ -594,6 +595,16 @@ def __aiter__(self) -> AsyncIterator[AnyType]: return self._iterate() async def _iterate(self) -> AsyncIterator[AnyType]: + async for _offset, value in self.records(): + yield value + + async def records(self) -> AsyncIterator[tuple[Offset, AnyType]]: + """Each value with the provider offset it was read from. + + Same delivery, same consumption, same commit order as iterating values. + A reader that has to name where it got to, or hand a position to + something outside the Workflow, cannot do it from the values alone. + """ while not self._finished: # Re-filled before *every* record rather than once per batch. A # record buffered while Workflow code was doing something else -- a @@ -623,8 +634,10 @@ async def _iterate(self) -> AsyncIterator[AnyType]: # becomes a value or raises, and neither outcome can leave the # ready list half-consumed. value = self._decode(record) + offset = record.offset self._commit(record) - yield value + assert offset is not None + yield offset, value continue await self._await_readiness() diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py new file mode 100644 index 000000000..14fcd4e41 --- /dev/null +++ b/temporalio/streams/__init__.py @@ -0,0 +1,135 @@ +"""A stream a workflow can read, decide on, and write. + +The contract, in five statements: + +1. **A workflow publishes only to its own stream, and it publishes + transactionally.** :meth:`StreamWriter.publish` returns without the record + being visible. The record appears when the workflow task is accepted, and + never if the task fails, so no reader can see a decision the workflow did + not commit. +2. **Reading is an observation, and the SDK records it.** What + :class:`StreamReader` handed to workflow code, including the boundary where + it found nothing, is committed with the commands that reading produced. + Recovery re-supplies the same records in the same order. +3. **Anything that does I/O publishes on its own account.** An activity, a + local activity, or an outside process writes through :func:`producer`, and + its records are visible as soon as they are written. It carries a producer + id, an attempt and a sequence so a retry can be told from a new generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume. + Do not compare two cursors or do arithmetic on one: one provider numbers + records with integers and another with a millisecond-and-sequence pair. +5. **A workflow names its streams relative to itself, and the provider + resolves them.** ``reader("inputs")`` is this workflow's inbound stream + called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One + provider stores that as a namespace-level stream id and the other as a name + under the run's chain key, and workflow code does not have to know which. + The provider itself is chosen when the worker is built. + +Outside a workflow there is no worker to carry the choice, so a process calls +:func:`configure` once before it opens a :func:`producer` or a +:func:`consumer`, and passes :func:`worker_options` to its ``Worker`` and +``Replayer``. Those two calls are where a provider is named. Nothing else in +this module mentions one. + +Reading somebody else's stream is out of scope for the first release. It is +the topology neither prototype has evidence for, and leaving it out is what +lets both of them implement the rest. + +What the contract does not promise: that a :attr:`RecordKind.FINISH` record +means the writing activity succeeded, that a superseded attempt's records can +be withdrawn, or that a stream outlives the retention its provider is +configured for. + +Prototype support for AI-198. The public names are the proposal; the module +behind them (``_binding``) is the only file that differs between the +server-side and the client-side implementation. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any, TypeVar + +from temporalio.streams._binding import ( + Consumer, + Producer, + configure, + consumer, + open_read, + open_write, + producer, + worker_options, +) +from temporalio.streams._handles import ReadSource, StreamReader, StreamWriter, WriteSink +from temporalio.streams._record import ( + BEGINNING, + Cursor, + RecordKind, + StreamRecord, + Supersession, +) + +__all__ = [ + "BEGINNING", + "Consumer", + "Cursor", + "Producer", + "ReadSource", + "RecordKind", + "StreamReader", + "StreamRecord", + "StreamWriter", + "Supersession", + "WriteSink", + "configure", + "consumer", + "producer", + "worker_options", + "reader", + "writer", +] + +T = TypeVar("T") + + +def reader( + stream: str, + *, + type: type | None = None, + topic: str | None = None, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, +) -> StreamReader[Any]: + """Subscribe this workflow to its inbound stream ``stream``. + + Each call is a separate subscription with its own cursor, so adding, + removing or reordering one renumbers the waits after it. Gate a change + behind :func:`temporalio.workflow.patched` as you would for a timer. + + Args: + stream: The inbound stream's name, relative to this workflow. + type: The value type, used as the decode hint. + topic: Only records on this topic, or every topic when omitted. + start: Where to start. Only honoured on the first subscription of a + run, because after that the recorded cursor decides. + idle_timeout: How long the workflow waits with nothing arriving before + the provider is allowed to release the worker. ``None`` takes the + provider's default. + """ + return StreamReader( + open_read(stream, start=start, idle_timeout=idle_timeout), + topic=topic, + type=type, + ) + + +def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: + """Publish to ``topic`` on the stream this workflow owns. + + Args: + topic: The topic name. + type: Declared for symmetry with :func:`reader` and for documentation. + Encoding follows the value. + """ + del type + return StreamWriter(open_write(topic), topic) diff --git a/temporalio/streams/_binding.py b/temporalio/streams/_binding.py new file mode 100644 index 000000000..879ee632d --- /dev/null +++ b/temporalio/streams/_binding.py @@ -0,0 +1,356 @@ +"""The client-side binding of the stream interface. + +Streams live in a store the customer runs, Redis here. A workflow's publish is +buffered by the worker, staged invisibly under a token, and promoted only once +a marker in History proves the workflow task that produced it was accepted. +Consumption is recorded the same way, as ranges and boundaries in History. + +This is the only module of the package that differs between the two +implementations. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.contrib.external_workflow_streams import ( + BEGINNING as PROVIDER_BEGINNING, + AFTER, + ExternalOutputStreamClient, + ExternalStreamProducer, + WakeNotAcknowledgedError, + WorkflowChainKey, + external_output_stream, + external_stream, +) +from temporalio.streams import _frame +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +__all__ = [ + "Consumer", + "Producer", + "configure", + "consumer", + "open_read", + "open_write", + "producer", + "worker_options", +] + +PROVIDER = "external" + +_backend: Any = None + + +def configure(**options: Any) -> None: + """Name the provider for this process. + + Args: + backend: A ``StreamBackend`` instance, such as ``RedisStreamBackend``. + There is no registry to name one from out here, so the caller + constructs it and hands it over. + """ + global _backend + unknown = sorted(set(options) - {"backend"}) + if unknown: + raise TypeError(f"unknown provider options {unknown}") + if "backend" not in options: + raise TypeError("the client-side provider needs a backend") + _backend = options["backend"] + + +def worker_options() -> dict[str, Any]: + """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + return {"external_stream_backend": _require_backend()} + + +def _require_backend() -> Any: + if _backend is None: + raise RuntimeError( + "no stream provider configured; call temporalio.streams.configure(" + "backend=...) before opening a producer, a consumer or a worker" + ) + return _backend + + +class _ExternalReadSource: + def __init__(self, subscription: Any) -> None: + self._subscription = subscription + self._records = subscription.records() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + # One record per batch. The provider reports readiness per record, so a + # batch here would be this binding inventing a boundary the provider + # never observed, and replay records boundaries. + offset, body = await self._records.__anext__() + return [(Cursor(str(offset)), body)] + + def close(self) -> None: + self._subscription.close() + + +class _ExternalWriteSink: + def __init__(self, topic: Any) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Awaited for real here. The worker holds a bounded output batch, and a + # publisher that has filled it waits for room rather than growing it. + await self._topic.publish(frame) + + +def open_read( + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, +) -> ReadSource: + """Subscribe the running workflow to its inbound stream ``stream``.""" + # The provider resolves the name under this run's chain key, so a start + # position is only meaningful to a reader that already has one, and this + # provider's first subscription always starts at the beginning of the + # stream it minted. + if start is not BEGINNING and start.token: + raise ValueError( + "the client-side provider starts a new subscription at the " + "beginning of the stream it owns; resuming elsewhere is not " + "supported yet" + ) + options = external_stream + if idle_timeout is not None: + options = options.with_options(idle_timeout=idle_timeout) + return _ExternalReadSource(options.topic(stream, type=bytes).subscribe()) + + +def open_write(topic: str) -> WriteSink: + """Bind ``topic`` on the stream the running workflow owns.""" + return _ExternalWriteSink(external_output_stream.topic(topic, type=bytes)) + + +async def _chain_key(client: Client, workflow_id: str) -> WorkflowChainKey: + description = await client.get_workflow_handle(workflow_id).describe() + return WorkflowChainKey( + client.namespace, + workflow_id, + description.raw_description.workflow_execution_info.first_run_id, + ) + + +class Producer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + topic: Any, + converter: Any, + stream: str, + producer_id: str, + attempt: int, + client: Client | None = None, + workflow_id: str = "", + ) -> None: + """Prefer :func:`producer`.""" + self._topic = topic + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._client = client + self._workflow_id = workflow_id + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + first: Any = None + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + offset = await self._topic.publish(frame) + if first is None: + first = offset + return Cursor(str(first)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + try: + await self._topic.publish(frame) + except WakeNotAcknowledgedError: + # The record is appended; what failed is telling a consumer that is + # no longer there to be told. A terminal record most often races the + # consumer acting on it, so treating an absent consumer as a failed + # publish would make the ordinary ending look like an error. + if not await self._consumer_has_gone(): + raise + + async def _consumer_has_gone(self) -> bool: + """Whether the consuming execution has closed. Asked, not assumed.""" + if self._client is None or not self._workflow_id: + return False + description = await self._client.get_workflow_handle( + self._workflow_id + ).describe() + return description.status is not None and description.status.value != 1 + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +async def producer( + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, +) -> Producer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + session = await ExternalStreamProducer.connect( + backend=_require_backend(), + workflow=await _chain_key(client, workflow_id), + client=client, + # The attempt is part of it. Deduplication answers "is this the same + # append again", and a second attempt writing different words at the + # same sequence is not: this provider rejects that outright. Folding + # the attempt in keeps a retried append idempotent without letting a + # new generation be refused as a conflicting duplicate. + session_id=f"{producer_id}#{attempt}", + ) + return Producer( + session.topic(stream, type=bytes), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + client, + workflow_id, + ) + + +class Consumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, client: Any, converter: Any) -> None: + """Prefer :func:`consumer`.""" + self._client = client + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + if topic is None: + raise ValueError( + "this provider stores each topic separately, so an outside " + "reader has to name one" + ) + attempts = AttemptTracker() + after = PROVIDER_BEGINNING if not start.token else AFTER(start.token) + handle = self._client.topic(topic, type=bytes) + async for item in handle.subscribe(after=after): + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data + ) + except ValueError: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +async def consumer( + client: Client, *, workflow_id: str, stream: str = "" +) -> Consumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. This provider keeps inbound and outbound + records in separate stores, so naming an inbound stream is not supported + from here yet. + """ + if stream: + raise ValueError( + "this provider separates inbound and outbound storage, so an " + "outside reader cannot follow an inbound stream yet" + ) + return Consumer( + await ExternalOutputStreamClient.connect( + backend=_require_backend(), + workflow=await _chain_key(client, workflow_id), + client=client, + ), + client.data_converter.payload_converter, + ) diff --git a/temporalio/streams/_frame.py b/temporalio/streams/_frame.py new file mode 100644 index 000000000..c32811d32 --- /dev/null +++ b/temporalio/streams/_frame.py @@ -0,0 +1,72 @@ +"""The record envelope both bindings put on the wire. + +A provider stores an opaque body. The contract needs more than a body: which +topic a record belongs to, whether it is data or a terminal marker, and which +producer attempt wrote it. Neither prototype carries all of that in a channel +of its own, so the interface carries it here and each binding stores the result +as an ordinary body. + +Encoding is synchronous and deterministic because a workflow publishes on the +workflow thread. The header is JSON with sorted keys for that reason, and +because a stored record that a person can read is worth more during an +incident than a few saved bytes. +""" + +from __future__ import annotations + +import json +from typing import Any + +from temporalio.streams._record import RecordKind + +__all__ = ["decode", "encode"] + +_MAGIC = b"tsf1" + + +def encode( + *, + topic: str, + kind: RecordKind, + producer: str, + attempt: int, + sequence: int, + body: bytes, +) -> bytes: + """Wrap one already-encoded body with the contract's metadata.""" + header: dict[str, Any] = {"k": int(kind), "t": topic} + # Omitted rather than written as a default, so a workflow's own publish + # does not carry three fields that only mean something for a producer. + if producer: + header["p"] = producer + if attempt: + header["a"] = attempt + if sequence >= 0: + header["s"] = sequence + raw = json.dumps(header, sort_keys=True, separators=(",", ":")).encode() + return _MAGIC + len(raw).to_bytes(4, "big") + raw + body + + +def decode(frame: bytes) -> tuple[RecordKind, str, str, int, int, bytes]: + """Split a frame into ``(kind, topic, producer, attempt, sequence, body)``. + + Raises: + ValueError: The bytes are not a frame this interface wrote. Reading a + stream someone else populated is a real case, so it fails with a + name rather than an index error. + """ + if len(frame) < 8 or frame[:4] != _MAGIC: + raise ValueError( + "this record was not written through the stream interface, so its " + "topic and producer are unknown" + ) + size = int.from_bytes(frame[4:8], "big") + header = json.loads(frame[8 : 8 + size]) + return ( + RecordKind(header.get("k", int(RecordKind.DATA))), + header.get("t", ""), + header.get("p", ""), + int(header.get("a", 0)), + int(header.get("s", -1)), + frame[8 + size :], + ) diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py new file mode 100644 index 000000000..a6dc9a073 --- /dev/null +++ b/temporalio/streams/_handles.py @@ -0,0 +1,215 @@ +"""The handles workflow code holds. + +Everything provider-specific sits behind the two protocols at the top. A +handle converts values, frames records, filters topics and synthesizes +supersession; a binding only moves bytes. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from typing import Any, Generic, Protocol, TypeVar + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import Cursor, RecordKind, StreamRecord + +__all__ = ["ReadSource", "StreamReader", "StreamWriter", "WriteSink"] + +T = TypeVar("T") + + +class ReadSource(Protocol): + """One subscription, as a provider supplies it.""" + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + """The next records, waiting until there is at least one. + + A batch rather than a record because delivery boundaries are what a + provider actually records, and flattening them here keeps that out of + the contract. + + Raises: + StopAsyncIteration: This subscription has ended. + """ + ... + + def close(self) -> None: + """End the subscription. Idempotent.""" + ... + + +class WriteSink(Protocol): + """One topic on the stream the running workflow owns.""" + + async def publish(self, frame: bytes) -> None: + """Accept one framed record into this workflow task's output. + + Awaitable because a provider may hold the publisher back when its + batch is full. It does not mean the record is visible: it becomes + visible when the workflow task is accepted. + """ + ... + + +def _encode_value(value: Any) -> bytes: + converter = workflow.payload_converter() + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _decode_value(body: bytes, as_type: type | None) -> Any: + converter = workflow.payload_converter() + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class StreamWriter(Generic[T]): + """Publishes to a topic on the stream this workflow owns. + + A workflow can only publish transactionally to a stream it owns, on both + providers. Writing to somebody else's stream is an activity's job, and it + gets the weaker guarantee that goes with doing I/O. + """ + + def __init__(self, sink: WriteSink, topic: str) -> None: + """Prefer :func:`temporalio.streams.writer`.""" + self._sink = sink + self._topic = topic + self._finished = False + + @property + def topic(self) -> str: + """The topic this writer is bound to.""" + return self._topic + + async def publish(self, value: T) -> None: + """Append ``value`` to this topic. + + Returning does not mean the record is visible. It becomes visible when + this workflow task is accepted, and never at all if the task fails, so + a reader cannot see a decision the workflow did not commit. + """ + if self._finished: + raise RuntimeError(f"topic {self._topic!r} was already finished") + await self._sink.publish( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer="", + attempt=0, + sequence=-1, + body=_encode_value(value), + ) + ) + + async def finish(self) -> None: + """Declare this topic complete. + + Says the writer has nothing more to send. It does not say the workflow + or the activity behind it succeeded, and a reader that treats it that + way will accept output from an attempt that later timed out. + """ + if self._finished: + return + self._finished = True + await self._sink.publish( + _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer="", + attempt=0, + sequence=-1, + body=b"", + ) + ) + + +class StreamReader(Generic[T]): + """Reads a stream from inside workflow code. + + Iterating yields every kind of record, including the supersession the + reader synthesizes when a producer's newer attempt appears. Check + ``record.kind``, or use :meth:`values` when the workflow genuinely only + wants data. + """ + + def __init__( + self, + source: ReadSource, + *, + topic: str | None = None, + type: type | None = None, + ) -> None: + """Prefer :func:`temporalio.streams.reader`.""" + self._source = source + self._topic = topic + self._type = type + self._pending: list[StreamRecord[Any]] = [] + self._attempts = AttemptTracker() + self._closed = False + + def __aiter__(self) -> AsyncIterator[StreamRecord[T]]: + """Iterate records until the reader is closed.""" + return self._iterate() + + async def _iterate(self) -> AsyncIterator[StreamRecord[T]]: + while not self._closed: + try: + record = await self.next() + except StopAsyncIteration: + # The provider ended the subscription. Iteration stops rather + # than raising, so a workflow that reads to the end of a + # finished stream leaves the loop instead of failing its task. + return + yield record + + async def values(self) -> AsyncIterator[T]: + """Iterate the data values, dropping control records.""" + async for record in self: + if record.kind is RecordKind.DATA: + yield record.value + + async def next(self) -> StreamRecord[T]: + """The next record, waiting for one if there is none buffered. + + Raises: + StopAsyncIteration: The provider ended the subscription. + """ + while not self._pending: + await self._fill() + return self._pending.pop(0) + + async def _fill(self) -> None: + for cursor, frame in await self._source.next_batch(): + kind, topic, producer, attempt, sequence, body = _frame.decode(frame) + if self._topic is not None and topic != self._topic: + continue + superseded = self._attempts.note(producer, attempt, cursor) + if superseded is not None: + self._pending.append(superseded) + self._pending.append( + StreamRecord( + value=( + _decode_value(body, self._type) + if kind is RecordKind.DATA + else None + ), + cursor=cursor, + kind=kind, + topic=topic, + producer=producer, + attempt=attempt, + sequence=sequence, + ) + ) + + def close(self) -> None: + """End the subscription. Idempotent.""" + self._closed = True + self._source.close() diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py new file mode 100644 index 000000000..24e20ab2f --- /dev/null +++ b/temporalio/streams/_policy.py @@ -0,0 +1,56 @@ +"""Turning a producer's newer attempt into something a reader can act on. + +An activity that streams half an answer and then fails leaves those records in +the stream. Its retry calls the model again and writes different words. No +provider can undo the first half, and a workflow that already acted on it has +committed that decision, so the honest thing is to tell the reader that a new +attempt began and let the application decide. + +This runs in the reader over records it already observed, so it costs no round +trip and replays without the provider being involved. +""" + +from __future__ import annotations + +from temporalio.streams._record import ( + Cursor, + RecordKind, + StreamRecord, + Supersession, +) + +__all__ = ["AttemptTracker"] + + +class AttemptTracker: + """Watches producer attempts on one subscription.""" + + def __init__(self) -> None: + self._attempts: dict[str, int] = {} + + def note( + self, producer: str, attempt: int, cursor: Cursor + ) -> StreamRecord[Supersession] | None: + """A supersession record when this record starts a newer attempt. + + A producer that declares no attempt supersedes nothing, because there + is no generation to compare. That is the same answer as an unnumbered + record: the interface reports what it was told and invents nothing. + """ + if not producer or attempt <= 0: + return None + previous = self._attempts.get(producer, 0) + if attempt <= previous: + return None + self._attempts[producer] = attempt + if previous == 0: + return None + return StreamRecord( + value=Supersession( + producer=producer, previous_attempt=previous, attempt=attempt + ), + cursor=cursor, + kind=RecordKind.SUPERSEDED, + producer=producer, + attempt=attempt, + ) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py new file mode 100644 index 000000000..d458ef0c4 --- /dev/null +++ b/temporalio/streams/_record.py @@ -0,0 +1,90 @@ +"""The value types the stream contract is expressed in. + +Nothing here touches Temporal or a provider, so both bindings share it +unchanged. +""" + +from __future__ import annotations + +import enum +from dataclasses import dataclass +from typing import Generic, TypeVar + +__all__ = [ + "BEGINNING", + "Cursor", + "RecordKind", + "StreamRecord", + "Supersession", +] + +T = TypeVar("T") + + +@enum.unique +class RecordKind(enum.IntEnum): + """What a record is.""" + + DATA = 1 + """Carries a value published by a workflow or a producer.""" + + FINISH = 2 + """The writer of this topic declared it complete. + + Separate from the activity or workflow that wrote it having succeeded. A + reader that treats it as proof of success is wrong: the activity can still + time out after writing it. + """ + + SUPERSEDED = 3 + """A later attempt of the same producer started writing. + + Synthesized by the reader from what it observed, so both providers deliver + it identically and replay reproduces it without the provider's help. + """ + + +@dataclass(frozen=True) +class Cursor: + """A position in a stream, ordered by its provider rather than by value. + + Opaque on purpose. One provider numbers records with integers and another + with a millisecond-and-sequence pair, so comparing tokens here would be + right for one and wrong for the other. Hand a cursor back to resume from + it; ask the reader to compare two. + """ + + token: str + + def __str__(self) -> str: + """The provider's position token.""" + return self.token + + +BEGINNING = Cursor("") +"""Read from the oldest record the stream still retains.""" + + +@dataclass(frozen=True) +class Supersession: + """The body of a :attr:`RecordKind.SUPERSEDED` record.""" + + producer: str + previous_attempt: int + attempt: int + + +@dataclass(frozen=True) +class StreamRecord(Generic[T]): + """One record as workflow code sees it.""" + + value: T + cursor: Cursor + kind: RecordKind = RecordKind.DATA + topic: str = "" + producer: str = "" + """Who wrote it, or empty when the owning workflow wrote it itself.""" + attempt: int = 0 + """The producer's attempt, or 0 when it did not declare one.""" + sequence: int = -1 + """The producer's position within its attempt, or -1 when unnumbered.""" From 66f353c75d330adaeccb5a97e6c132e48913c634 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Sun, 6 Sep 2026 11:26:03 -0700 Subject: [PATCH 004/831] Let a terminal record land on a consumer that is closing. The server refuses the wake while the execution is closing, and at that moment its status is still the running one, so a single look read "running" and turned the ordinary ending into an error. --- streams_demo/results-external/history.json | 813 ++++++++------------- streams_demo/results-external/results.json | 8 +- temporalio/streams/_binding.py | 26 +- 3 files changed, 346 insertions(+), 501 deletions(-) diff --git a/streams_demo/results-external/history.json b/streams_demo/results-external/history.json index 75295aa6b..1013bf0e7 100644 --- a/streams_demo/results-external/history.json +++ b/streams_demo/results-external/history.json @@ -2,15 +2,15 @@ "events": [ { "eventId": "1", - "eventTime": "2026-09-06T18:11:22.157533Z", + "eventTime": "2026-09-06T18:23:04.307989Z", "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", - "taskId": "1050382", + "taskId": "1052794", "workflowExecutionStartedEventAttributes": { "workflowType": { "name": "AI198StreamContractDemo" }, "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "kind": "TASK_QUEUE_KIND_NORMAL" }, "input": { @@ -24,23 +24,23 @@ ] }, "workflowTaskTimeout": "10s", - "originalExecutionRunId": "01a077ea-f5ad-781e-b17e-b21618fa7a7f", - "identity": "26823@Mac.lan", - "firstExecutionRunId": "01a077ea-f5ad-781e-b17e-b21618fa7a7f", + "originalExecutionRunId": "01a077f5-ac73-7f13-9fa6-ebc5c0821a69", + "identity": "34059@Mac.lan", + "firstExecutionRunId": "01a077f5-ac73-7f13-9fa6-ebc5c0821a69", "attempt": 1, "firstWorkflowTaskBackoff": "0s", - "workflowId": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "workflowId": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "priority": {} } }, { "eventId": "2", - "eventTime": "2026-09-06T18:11:22.157567Z", + "eventTime": "2026-09-06T18:23:04.308024Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050383", + "taskId": "1052795", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "kind": "TASK_QUEUE_KIND_NORMAL" }, "startToCloseTimeout": "10s", @@ -49,35 +49,35 @@ }, { "eventId": "3", - "eventTime": "2026-09-06T18:11:22.160155Z", + "eventTime": "2026-09-06T18:23:04.310387Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050388", + "taskId": "1052800", "workflowTaskStartedEventAttributes": { "scheduledEventId": "2", - "identity": "26823@Mac.lan", - "requestId": "4af9762f-b065-4f3e-bbb0-17a6546a7ee6", - "historySizeBytes": "404", + "identity": "34059@Mac.lan", + "requestId": "26ca0dc2-9c92-4899-9736-a16e48687a91", + "historySizeBytes": "406", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { "eventId": "4", - "eventTime": "2026-09-06T18:11:22.174162Z", + "eventTime": "2026-09-06T18:23:04.324822Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1050393", + "taskId": "1052805", "workflowTaskCompletedEventAttributes": { "scheduledEventId": "2", "startedEventId": "3", - "identity": "26823@Mac.lan", + "identity": "34059@Mac.lan", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" }, "sdkMetadata": { "coreUsedFlags": [ - 2, 1, + 2, 3 ], "sdkName": "temporal-python", @@ -88,9 +88,9 @@ }, { "eventId": "5", - "eventTime": "2026-09-06T18:11:22.174189Z", + "eventTime": "2026-09-06T18:23:04.324847Z", "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1050394", + "taskId": "1052806", "markerRecordedEventAttributes": { "markerName": "core_external_stream", "details": { @@ -100,7 +100,7 @@ "metadata": { "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAEQARoECAEQASK+AQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAA1yZWRpcy1zdHJlYW1zAQIAAQIBAQ8xNzg4NzE4MjgyMTcxLTAPMTc4ODcxODI4MjE3MS0wAQABAwEBAQ8xNzg4NzE4MjgyMTcxLTAoBjKdAQgBEAEaIFNsYVBscXRXTmF5Y2VpSDByRlVqRElLVE1XTTVYUk1FIAEqJDAxYTA3N2VhLWY1YWQtNzgxZS1iMTdlLWIyMTYxOGZhN2E3ZjIyCglkZWNpc2lvbnMQARi0ASIgjBxO69u2MphhOmkhkT4NDYD9yThaPpqKHcAWa2oslZg6AwoBADoDCgEBQg1yZWRpcy1zdHJlYW1zSAE=" + "data": "CAEQARoECAEQASK+AQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAA1yZWRpcy1zdHJlYW1zAQIAAQIBAQ8xNzg4NzE4OTg0MzIyLTAPMTc4ODcxODk4NDMyMi0wAQABAwEBAQ8xNzg4NzE4OTg0MzIyLTAoBjKdAQgBEAEaIGV1MFlKZjgxdXJfTDZ0YU9lZUlxRVVJUzNsQnVGNzBaIAEqJDAxYTA3N2Y1LWFjNzMtN2YxMy05ZmE2LWViYzVjMDgyMWE2OTIyCglkZWNpc2lvbnMQARi0ASIgjBxO69u2MphhOmkhkT4NDYD9yThaPpqKHcAWa2oslZg6AwoBADoDCgEBQg1yZWRpcy1zdHJlYW1zSAE=" } ] } @@ -110,16 +110,16 @@ }, { "eventId": "6", - "eventTime": "2026-09-06T18:11:22.174198Z", + "eventTime": "2026-09-06T18:23:04.324856Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", - "taskId": "1050395", + "taskId": "1052807", "activityTaskScheduledEventAttributes": { "activityId": "decision-r1", "activityType": { "name": "AI198RecordDecision" }, "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "kind": "TASK_QUEUE_KIND_NORMAL" }, "header": {}, @@ -149,24 +149,24 @@ }, { "eventId": "7", - "eventTime": "2026-09-06T18:11:22.174212Z", + "eventTime": "2026-09-06T18:23:04.324868Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", - "taskId": "1050399", + "taskId": "1052811", "activityTaskStartedEventAttributes": { "scheduledEventId": "6", - "identity": "26823@Mac.lan", - "requestId": "58663e42-9843-4b02-82cd-bf5176975d5c", + "identity": "34059@Mac.lan", + "requestId": "47dd481e-e301-4a50-b342-23ff777038be", "attempt": 1, "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { "eventId": "8", - "eventTime": "2026-09-06T18:11:22.175897Z", + "eventTime": "2026-09-06T18:23:04.326319Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", - "taskId": "1050400", + "taskId": "1052812", "activityTaskCompletedEventAttributes": { "result": { "payloads": [ @@ -180,18 +180,19 @@ }, "scheduledEventId": "6", "startedEventId": "7", - "identity": "26823@Mac.lan" + "identity": "34059@Mac.lan" } }, { "eventId": "9", - "eventTime": "2026-09-06T18:11:22.175903Z", + "eventTime": "2026-09-06T18:23:04.326325Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050401", + "taskId": "1052813", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", - "kind": "TASK_QUEUE_KIND_NORMAL" + "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" }, "startToCloseTimeout": "10s", "attempt": 1 @@ -199,30 +200,30 @@ }, { "eventId": "10", - "eventTime": "2026-09-06T18:11:22.176609Z", + "eventTime": "2026-09-06T18:23:04.326970Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050404", + "taskId": "1052817", "workflowTaskStartedEventAttributes": { "scheduledEventId": "9", - "identity": "26823@Mac.lan", - "requestId": "c04f1c35-feda-443d-9764-f1b9d9308366", - "historySizeBytes": "1653", + "identity": "34059@Mac.lan", + "requestId": "bd8c44cb-8931-4f15-be7f-9c0ef23bebf0", + "historySizeBytes": "1711", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { "eventId": "11", - "eventTime": "2026-09-06T18:11:22.183152Z", + "eventTime": "2026-09-06T18:23:04.334247Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1050410", + "taskId": "1052823", "workflowTaskCompletedEventAttributes": { "scheduledEventId": "9", "startedEventId": "10", - "identity": "26823@Mac.lan", + "identity": "34059@Mac.lan", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" }, "sdkMetadata": {}, "meteringMetadata": {} @@ -230,9 +231,9 @@ }, { "eventId": "12", - "eventTime": "2026-09-06T18:11:22.183168Z", + "eventTime": "2026-09-06T18:23:04.334266Z", "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1050411", + "taskId": "1052824", "markerRecordedEventAttributes": { "markerName": "core_external_stream", "details": { @@ -242,7 +243,7 @@ "metadata": { "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAEQARoECAEQAiLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAQ8xNzg4NzE4MjgyMTcxLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODI4MjE4MS0wDzE3ODg3MTgyODIxODEtMAEAAQMBAQEPMTc4ODcxODI4MjE4MS0wKAYynQEIARABGiB0cFZkaG9qaW0wUTBtLWlkSzNrV3Z3N2poQkU5MmFORSAIKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YyMgoJZGVjaXNpb25zEAEYtAEiIEG2KSpLbvL+t7NXgoIazG7djtT9TCEi2Caa1YjB4xlZOgMKAQA6AwoBAUINcmVkaXMtc3RyZWFtc0gB" + "data": "CAEQAhoECAEQAiLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0MzIyLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODk4NDMzMi0wDzE3ODg3MTg5ODQzMzItMAEAAQMBAQEPMTc4ODcxODk4NDMzMi0wKAYynQEIARABGiAxUTNvYU1sREF6aXVQNkNwR3l5U1BRa3J2bVhuNGotUSAIKiQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkyMgoJZGVjaXNpb25zEAEYtAEiIEG2KSpLbvL+t7NXgoIazG7djtT9TCEi2Caa1YjB4xlZOgMKAQA6AwoBAUINcmVkaXMtc3RyZWFtc0gB" } ] } @@ -252,16 +253,16 @@ }, { "eventId": "13", - "eventTime": "2026-09-06T18:11:22.183175Z", + "eventTime": "2026-09-06T18:23:04.334272Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", - "taskId": "1050412", + "taskId": "1052825", "activityTaskScheduledEventAttributes": { "activityId": "decision-r2", "activityType": { "name": "AI198RecordDecision" }, "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "kind": "TASK_QUEUE_KIND_NORMAL" }, "header": {}, @@ -291,9 +292,9 @@ }, { "eventId": "14", - "eventTime": "2026-09-06T18:11:22.180649Z", + "eventTime": "2026-09-06T18:23:04.331874Z", "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050413", + "taskId": "1052826", "workflowExecutionSignaledEventAttributes": { "signalName": "__temporal_external_stream_wake", "input": { @@ -303,23 +304,24 @@ "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMx" + "data": "CAESBmlucHV0cyokMDFhMDc3ZjUtYWM3My03ZjEzLTlmYTYtZWJjNWMwODIxYTY5Mgdtb2RlbCMx" } ] }, - "identity": "26823@Mac.lan", - "requestId": "1df2f713-fd2d-53fb-baa7-c57b9f5793a8" + "identity": "34059@Mac.lan", + "requestId": "c70d6ed3-a072-5673-8c23-4d7fb2864d3f" } }, { "eventId": "15", - "eventTime": "2026-09-06T18:11:22.183190Z", + "eventTime": "2026-09-06T18:23:04.334287Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050414", + "taskId": "1052827", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", - "kind": "TASK_QUEUE_KIND_NORMAL" + "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" }, "startToCloseTimeout": "10s", "attempt": 1 @@ -327,30 +329,30 @@ }, { "eventId": "16", - "eventTime": "2026-09-06T18:11:22.183924Z", + "eventTime": "2026-09-06T18:23:04.334301Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050418", + "taskId": "1052828", "workflowTaskStartedEventAttributes": { "scheduledEventId": "15", - "identity": "26823@Mac.lan", - "requestId": "9efbed6e-9cfb-4854-896d-bac0d1f26f81", - "historySizeBytes": "2936", + "identity": "34059@Mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "1831", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { "eventId": "17", - "eventTime": "2026-09-06T18:11:22.188413Z", + "eventTime": "2026-09-06T18:23:04.336066Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1050424", + "taskId": "1052833", "workflowTaskCompletedEventAttributes": { "scheduledEventId": "15", "startedEventId": "16", - "identity": "26823@Mac.lan", + "identity": "34059@Mac.lan", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" }, "sdkMetadata": {}, "meteringMetadata": {} @@ -358,46 +360,46 @@ }, { "eventId": "18", - "eventTime": "2026-09-06T18:11:22.183185Z", + "eventTime": "2026-09-06T18:23:04.336077Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1052834", + "markerRecordedEventAttributes": { + "markerName": "core_external_stream", + "details": { + "external_stream": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAEQAhoECAEQAiKoAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0MzMyLTANcmVkaXMtc3RyZWFtcwECAAEDAQEBDzE3ODg3MTg5ODQzMzItMCgI" + } + ] + } + }, + "workflowTaskCompletedEventId": "17" + } + }, + { + "eventId": "19", + "eventTime": "2026-09-06T18:23:04.334282Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", - "taskId": "1050425", + "taskId": "1052835", "activityTaskStartedEventAttributes": { "scheduledEventId": "13", - "identity": "26823@Mac.lan", - "requestId": "2ef67959-882a-4107-8539-d5196556c9f8", + "identity": "34059@Mac.lan", + "requestId": "9fc0cd1b-60de-4c07-b64d-b2b9e8cd3c8e", "attempt": 1, "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, - { - "eventId": "19", - "eventTime": "2026-09-06T18:11:22.187585Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050426", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "e43a9981-456e-5236-9b51-9ab044957092" - } - }, { "eventId": "20", - "eventTime": "2026-09-06T18:11:22.184543Z", + "eventTime": "2026-09-06T18:23:04.335841Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", - "taskId": "1050427", + "taskId": "1052836", "activityTaskCompletedEventAttributes": { "result": { "payloads": [ @@ -410,19 +412,20 @@ ] }, "scheduledEventId": "13", - "startedEventId": "18", - "identity": "26823@Mac.lan" + "startedEventId": "19", + "identity": "34059@Mac.lan" } }, { "eventId": "21", - "eventTime": "2026-09-06T18:11:22.188436Z", + "eventTime": "2026-09-06T18:23:04.336080Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050428", + "taskId": "1052837", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", - "kind": "TASK_QUEUE_KIND_NORMAL" + "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" }, "startToCloseTimeout": "10s", "attempt": 1 @@ -430,30 +433,30 @@ }, { "eventId": "22", - "eventTime": "2026-09-06T18:11:22.189479Z", + "eventTime": "2026-09-06T18:23:04.336092Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050431", + "taskId": "1052838", "workflowTaskStartedEventAttributes": { "scheduledEventId": "21", - "identity": "26823@Mac.lan", - "requestId": "a7e422ab-0ccb-400b-b202-9cb14c072dbe", - "historySizeBytes": "3696", + "identity": "34059@Mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "3174", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { "eventId": "23", - "eventTime": "2026-09-06T18:11:22.705946Z", + "eventTime": "2026-09-06T18:23:04.856009Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1050437", + "taskId": "1052843", "workflowTaskCompletedEventAttributes": { "scheduledEventId": "21", "startedEventId": "22", - "identity": "26823@Mac.lan", + "identity": "34059@Mac.lan", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" }, "sdkMetadata": {}, "meteringMetadata": {} @@ -461,9 +464,9 @@ }, { "eventId": "24", - "eventTime": "2026-09-06T18:11:22.705975Z", + "eventTime": "2026-09-06T18:23:04.856043Z", "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1050438", + "taskId": "1052844", "markerRecordedEventAttributes": { "markerName": "core_external_stream", "details": { @@ -473,7 +476,7 @@ "metadata": { "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAEQARoECAEQAyLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAQ8xNzg4NzE4MjgyMTgxLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODI4MjcwMS0wDzE3ODg3MTgyODI3MDEtMAEAAQMBAQEPMTc4ODcxODI4MjcwMS0wKAYynQEIARABGiB1UENKbTNlcWEwa2dqS25xMHhlTUZYeHlJSHU4bWVHUSAUKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YyMgoJZGVjaXNpb25zEAIY0wIiIMlkAX98qOr68/irYtiKi0b09uWIahOZe6Q558yOXlphOgMKAQA6AwoBAkINcmVkaXMtc3RyZWFtc0gB" + "data": "CAEQAxoECAEQAyLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0MzMyLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODk4NDg1MS0wDzE3ODg3MTg5ODQ4NTEtMAEAAQMBAQEPMTc4ODcxODk4NDg1MS0wKAYynQEIARABGiBhekMwV1J5bktxbVRMUjNMLWFLdDZNRjVuc25jTzRMdCAUKiQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkyMgoJZGVjaXNpb25zEAIY0wIiIMlkAX98qOr68/irYtiKi0b09uWIahOZe6Q558yOXlphOgMKAQA6AwoBAkINcmVkaXMtc3RyZWFtc0gB" } ] } @@ -483,16 +486,16 @@ }, { "eventId": "25", - "eventTime": "2026-09-06T18:11:22.705985Z", + "eventTime": "2026-09-06T18:23:04.856056Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", - "taskId": "1050439", + "taskId": "1052845", "activityTaskScheduledEventAttributes": { "activityId": "decision-r3", "activityType": { "name": "AI198RecordDecision" }, "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "kind": "TASK_QUEUE_KIND_NORMAL" }, "header": {}, @@ -522,9 +525,9 @@ }, { "eventId": "26", - "eventTime": "2026-09-06T18:11:22.191345Z", + "eventTime": "2026-09-06T18:23:04.341085Z", "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050440", + "taskId": "1052846", "workflowExecutionSignaledEventAttributes": { "signalName": "__temporal_external_stream_wake", "input": { @@ -534,23 +537,24 @@ "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMx" + "data": "CAESBmlucHV0cyokMDFhMDc3ZjUtYWM3My03ZjEzLTlmYTYtZWJjNWMwODIxYTY5Mgdtb2RlbCMx" } ] }, - "identity": "26823@Mac.lan", - "requestId": "37d1b402-38c8-5dda-8645-d585db292a63" + "identity": "34059@Mac.lan", + "requestId": "0da6d15a-59e2-5ce9-89c3-fdb107a4d620" } }, { "eventId": "27", - "eventTime": "2026-09-06T18:11:22.706006Z", + "eventTime": "2026-09-06T18:23:04.856092Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050441", + "taskId": "1052847", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", - "kind": "TASK_QUEUE_KIND_NORMAL" + "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" }, "startToCloseTimeout": "10s", "attempt": 1 @@ -558,30 +562,30 @@ }, { "eventId": "28", - "eventTime": "2026-09-06T18:11:22.706861Z", + "eventTime": "2026-09-06T18:23:04.856126Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050445", + "taskId": "1052848", "workflowTaskStartedEventAttributes": { "scheduledEventId": "27", - "identity": "26823@Mac.lan", - "requestId": "25930a39-9163-4f47-8e21-cb2b48d61d84", - "historySizeBytes": "4983", + "identity": "34059@Mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "4035", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { "eventId": "29", - "eventTime": "2026-09-06T18:11:22.715797Z", + "eventTime": "2026-09-06T18:23:04.860129Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1050451", + "taskId": "1052853", "workflowTaskCompletedEventAttributes": { "scheduledEventId": "27", "startedEventId": "28", - "identity": "26823@Mac.lan", + "identity": "34059@Mac.lan", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" }, "sdkMetadata": {}, "meteringMetadata": {} @@ -589,46 +593,46 @@ }, { "eventId": "30", - "eventTime": "2026-09-06T18:11:22.705999Z", + "eventTime": "2026-09-06T18:23:04.860156Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1052854", + "markerRecordedEventAttributes": { + "markerName": "core_external_stream", + "details": { + "external_stream": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAEQAxoECAEQAyKoAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0ODUxLTANcmVkaXMtc3RyZWFtcwECAAEDAQEBDzE3ODg3MTg5ODQ4NTEtMCgI" + } + ] + } + }, + "workflowTaskCompletedEventId": "29" + } + }, + { + "eventId": "31", + "eventTime": "2026-09-06T18:23:04.856080Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", - "taskId": "1050452", + "taskId": "1052855", "activityTaskStartedEventAttributes": { "scheduledEventId": "25", - "identity": "26823@Mac.lan", - "requestId": "a725c165-a214-4892-916c-76e1ea839d7c", + "identity": "34059@Mac.lan", + "requestId": "ae70d169-fcae-4c8b-b56f-24ef10977f72", "attempt": 1, "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, - { - "eventId": "31", - "eventTime": "2026-09-06T18:11:22.715327Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050453", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "2fbd7436-ef53-5aea-a0a0-f5580216293b" - } - }, { "eventId": "32", - "eventTime": "2026-09-06T18:11:22.707608Z", + "eventTime": "2026-09-06T18:23:04.859154Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", - "taskId": "1050454", + "taskId": "1052856", "activityTaskCompletedEventAttributes": { "result": { "payloads": [ @@ -641,19 +645,20 @@ ] }, "scheduledEventId": "25", - "startedEventId": "30", - "identity": "26823@Mac.lan" + "startedEventId": "31", + "identity": "34059@Mac.lan" } }, { "eventId": "33", - "eventTime": "2026-09-06T18:11:22.715826Z", + "eventTime": "2026-09-06T18:23:04.860164Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050455", + "taskId": "1052857", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", - "kind": "TASK_QUEUE_KIND_NORMAL" + "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" }, "startToCloseTimeout": "10s", "attempt": 1 @@ -661,62 +666,40 @@ }, { "eventId": "34", - "eventTime": "2026-09-06T18:11:22.716505Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050458", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMy" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "8399a538-2d53-53ec-8373-46b5609feb7b" - } - }, - { - "eventId": "35", - "eventTime": "2026-09-06T18:11:22.716835Z", + "eventTime": "2026-09-06T18:23:04.860195Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050460", + "taskId": "1052858", "workflowTaskStartedEventAttributes": { "scheduledEventId": "33", - "identity": "26823@Mac.lan", - "requestId": "b3544f16-128d-491f-8ecf-d7f185abaa08", - "historySizeBytes": "6008", + "identity": "34059@Mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "5378", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { - "eventId": "36", - "eventTime": "2026-09-06T18:11:22.727247Z", + "eventId": "35", + "eventTime": "2026-09-06T18:23:04.873800Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1050467", + "taskId": "1052863", "workflowTaskCompletedEventAttributes": { "scheduledEventId": "33", - "startedEventId": "35", - "identity": "26823@Mac.lan", + "startedEventId": "34", + "identity": "34059@Mac.lan", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" }, "sdkMetadata": {}, "meteringMetadata": {} } }, { - "eventId": "37", - "eventTime": "2026-09-06T18:11:22.727270Z", + "eventId": "36", + "eventTime": "2026-09-06T18:23:04.873824Z", "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1050468", + "taskId": "1052864", "markerRecordedEventAttributes": { "markerName": "core_external_stream", "details": { @@ -726,26 +709,26 @@ "metadata": { "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAEQARoECAEQBCLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAQ8xNzg4NzE4MjgyNzAxLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODI4MjcxOC0wDzE3ODg3MTgyODI3MTgtMAEAAQMBAQEPMTc4ODcxODI4MjcxOC0wKAYynQEIARABGiA0WXNrdDcwVHNsUWVLRUdCVVV1Y3NTZDJnZjZIWk10SyAgKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YyMgoJZGVjaXNpb25zEAEYtAEiID5nSwItjUt3xrIwLwmnksCGdUXwRytSYqhf4/HFL9GVOgMKAQA6AwoBAUINcmVkaXMtc3RyZWFtc0gB" + "data": "CAEQBBoECAEQBCLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0ODUxLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODk4NDg3MC0wDzE3ODg3MTg5ODQ4NzAtMAEAAQMBAQEPMTc4ODcxODk4NDg3MC0wKAYynQEIARABGiBBU25qczFkZkowaTZZdHdBSkt0RW9XTlZUek9jcUxTbCAgKiQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkyMgoJZGVjaXNpb25zEAEYtAEiID5nSwItjUt3xrIwLwmnksCGdUXwRytSYqhf4/HFL9GVOgMKAQA6AwoBAUINcmVkaXMtc3RyZWFtc0gB" } ] } }, - "workflowTaskCompletedEventId": "36" + "workflowTaskCompletedEventId": "35" } }, { - "eventId": "38", - "eventTime": "2026-09-06T18:11:22.727280Z", + "eventId": "37", + "eventTime": "2026-09-06T18:23:04.873833Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", - "taskId": "1050469", + "taskId": "1052865", "activityTaskScheduledEventAttributes": { "activityId": "decision-r4", "activityType": { "name": "AI198RecordDecision" }, "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "kind": "TASK_QUEUE_KIND_NORMAL" }, "header": {}, @@ -763,7 +746,7 @@ "scheduleToStartTimeout": "0s", "startToCloseTimeout": "10s", "heartbeatTimeout": "0s", - "workflowTaskCompletedEventId": "36", + "workflowTaskCompletedEventId": "35", "retryPolicy": { "initialInterval": "1s", "backoffCoefficient": 2.0, @@ -774,32 +757,10 @@ } }, { - "eventId": "39", - "eventTime": "2026-09-06T18:11:22.722015Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050470", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "39da5ac8-0f7a-5872-9d15-165c2b32f2cf" - } - }, - { - "eventId": "40", - "eventTime": "2026-09-06T18:11:22.724282Z", + "eventId": "38", + "eventTime": "2026-09-06T18:23:04.869822Z", "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050471", + "taskId": "1052866", "workflowExecutionSignaledEventAttributes": { "signalName": "__temporal_external_stream_wake", "input": { @@ -809,167 +770,102 @@ "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + "data": "CAESBmlucHV0cyokMDFhMDc3ZjUtYWM3My03ZjEzLTlmYTYtZWJjNWMwODIxYTY5Mgdtb2RlbCMy" } ] }, - "identity": "26823@Mac.lan", - "requestId": "46ea13fa-03d0-56b3-971f-658b3c5b2dea" + "identity": "34059@Mac.lan", + "requestId": "5d10fc28-9e67-5c92-8e99-a7efb1f1d9cb" } }, { - "eventId": "41", - "eventTime": "2026-09-06T18:11:22.727305Z", + "eventId": "39", + "eventTime": "2026-09-06T18:23:04.873860Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050472", + "taskId": "1052867", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", - "kind": "TASK_QUEUE_KIND_NORMAL" + "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" }, "startToCloseTimeout": "10s", "attempt": 1 } }, { - "eventId": "42", - "eventTime": "2026-09-06T18:11:22.728358Z", + "eventId": "40", + "eventTime": "2026-09-06T18:23:04.873883Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050476", + "taskId": "1052868", "workflowTaskStartedEventAttributes": { - "scheduledEventId": "41", - "identity": "26823@Mac.lan", - "requestId": "bf6b249a-a171-4571-b49a-2dd98bc0d8a6", - "historySizeBytes": "7543", + "scheduledEventId": "39", + "identity": "34059@Mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "6238", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { - "eventId": "43", - "eventTime": "2026-09-06T18:11:22.737729Z", + "eventId": "41", + "eventTime": "2026-09-06T18:23:04.876306Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1050485", + "taskId": "1052873", "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "41", - "startedEventId": "42", - "identity": "26823@Mac.lan", + "scheduledEventId": "39", + "startedEventId": "40", + "identity": "34059@Mac.lan", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" }, "sdkMetadata": {}, "meteringMetadata": {} } }, { - "eventId": "44", - "eventTime": "2026-09-06T18:11:22.727297Z", + "eventId": "42", + "eventTime": "2026-09-06T18:23:04.876327Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1052874", + "markerRecordedEventAttributes": { + "markerName": "core_external_stream", + "details": { + "external_stream": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L3Byb3RvYnVm" + }, + "data": "CAEQBBoECAEQBCKoAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0ODcwLTANcmVkaXMtc3RyZWFtcwECAAEDAQEBDzE3ODg3MTg5ODQ4NzAtMCgI" + } + ] + } + }, + "workflowTaskCompletedEventId": "41" + } + }, + { + "eventId": "43", + "eventTime": "2026-09-06T18:23:04.873853Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", - "taskId": "1050486", + "taskId": "1052875", "activityTaskStartedEventAttributes": { - "scheduledEventId": "38", - "identity": "26823@Mac.lan", - "requestId": "e9cf5853-0b8f-425c-92f7-6eccfc1585e3", + "scheduledEventId": "37", + "identity": "34059@Mac.lan", + "requestId": "23c51461-54a6-4666-9081-7a1f0ab7dfd2", "attempt": 1, "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { - "eventId": "45", - "eventTime": "2026-09-06T18:11:22.730443Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050487", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMy" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "46cf9d72-14a4-5d2c-a6df-6ef2fa8f0975" - } - }, - { - "eventId": "46", - "eventTime": "2026-09-06T18:11:22.733340Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050488", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "4eeaeff4-edb1-5ad1-aa05-14d5fe21efd9" - } - }, - { - "eventId": "47", - "eventTime": "2026-09-06T18:11:22.735277Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050489", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "c5856df4-2d45-5a5f-a25a-ac5656b800bb" - } - }, - { - "eventId": "48", - "eventTime": "2026-09-06T18:11:22.737445Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050490", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "c817c883-d225-5657-9320-5685eee70ab4" - } - }, - { - "eventId": "49", - "eventTime": "2026-09-06T18:11:22.729071Z", + "eventId": "44", + "eventTime": "2026-09-06T18:23:04.875977Z", "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", - "taskId": "1050491", + "taskId": "1052876", "activityTaskCompletedEventAttributes": { "result": { "payloads": [ @@ -981,127 +877,62 @@ } ] }, - "scheduledEventId": "38", - "startedEventId": "44", - "identity": "26823@Mac.lan" + "scheduledEventId": "37", + "startedEventId": "43", + "identity": "34059@Mac.lan" } }, { - "eventId": "50", - "eventTime": "2026-09-06T18:11:22.737758Z", + "eventId": "45", + "eventTime": "2026-09-06T18:23:04.876333Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050492", + "taskId": "1052877", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", - "kind": "TASK_QUEUE_KIND_NORMAL" + "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" }, "startToCloseTimeout": "10s", "attempt": 1 } }, { - "eventId": "51", - "eventTime": "2026-09-06T18:11:22.738595Z", + "eventId": "46", + "eventTime": "2026-09-06T18:23:04.876353Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050495", + "taskId": "1052878", "workflowTaskStartedEventAttributes": { - "scheduledEventId": "50", - "identity": "26823@Mac.lan", - "requestId": "8645299a-6b83-48a4-b193-fa6477e6a412", - "historySizeBytes": "9075", + "scheduledEventId": "45", + "identity": "34059@Mac.lan", + "requestId": "request-from-RespondWorkflowTaskCompleted", + "historySizeBytes": "7581", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { - "eventId": "52", - "eventTime": "2026-09-06T18:11:22.748540Z", + "eventId": "47", + "eventTime": "2026-09-06T18:23:04.886126Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_FAILED", - "taskId": "1050503", + "taskId": "1052882", "workflowTaskFailedEventAttributes": { - "scheduledEventId": "50", - "startedEventId": "51", + "scheduledEventId": "45", + "startedEventId": "46", "cause": "WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND", "failure": { "message": "UnhandledCommand", "serverFailureInfo": {} }, - "identity": "26823@Mac.lan" + "identity": "34059@Mac.lan" } }, { - "eventId": "53", - "eventTime": "2026-09-06T18:11:22.741945Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050504", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZWEtZjVhZC03ODFlLWIxN2UtYjIxNjE4ZmE3YTdmMgdtb2RlbCMy" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "8645d950-0d4c-5660-b6c7-24ffd557507f" - } - }, - { - "eventId": "54", - "eventTime": "2026-09-06T18:11:22.743630Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050505", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "dbf5475f-1e51-56f5-a094-57adb5e5d7c3" - } - }, - { - "eventId": "55", - "eventTime": "2026-09-06T18:11:22.745447Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050506", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" - } - ] - }, - "identity": "26823@Mac.lan", - "requestId": "44d26222-20e8-5363-b60f-7d315980020d" - } - }, - { - "eventId": "56", - "eventTime": "2026-09-06T18:11:22.747175Z", + "eventId": "48", + "eventTime": "2026-09-06T18:23:04.883008Z", "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1050507", + "taskId": "1052883", "workflowExecutionSignaledEventAttributes": { "signalName": "__temporal_external_stream_wake", "input": { @@ -1111,22 +942,22 @@ "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAESBmlucHV0cxgBKiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2Y=" + "data": "CAESBmlucHV0cyokMDFhMDc3ZjUtYWM3My03ZjEzLTlmYTYtZWJjNWMwODIxYTY5Mgdtb2RlbCMy" } ] }, - "identity": "26823@Mac.lan", - "requestId": "8206e1fa-6e16-5e8c-9467-67fa2a3aa353" + "identity": "34059@Mac.lan", + "requestId": "da1874cc-ecf7-5813-8e2d-807bf5d43193" } }, { - "eventId": "57", - "eventTime": "2026-09-06T18:11:22.748568Z", + "eventId": "49", + "eventTime": "2026-09-06T18:23:04.886152Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1050508", + "taskId": "1052884", "workflowTaskScheduledEventAttributes": { "taskQueue": { - "name": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "kind": "TASK_QUEUE_KIND_NORMAL" }, "startToCloseTimeout": "10s", @@ -1134,41 +965,41 @@ } }, { - "eventId": "58", - "eventTime": "2026-09-06T18:11:22.749316Z", + "eventId": "50", + "eventTime": "2026-09-06T18:23:04.886996Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1050511", + "taskId": "1052887", "workflowTaskStartedEventAttributes": { - "scheduledEventId": "57", - "identity": "26823@Mac.lan", - "requestId": "8beba935-535b-42df-970d-a1ad3d0a885f", - "historySizeBytes": "10377", + "scheduledEventId": "49", + "identity": "34059@Mac.lan", + "requestId": "40f8ac65-5593-41c0-8cd7-a618c78e8bea", + "historySizeBytes": "8865", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" } } }, { - "eventId": "59", - "eventTime": "2026-09-06T18:11:27.755216Z", + "eventId": "51", + "eventTime": "2026-09-06T18:23:05.303033Z", "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1050515", + "taskId": "1052891", "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "57", - "startedEventId": "58", - "identity": "26823@Mac.lan", + "scheduledEventId": "49", + "startedEventId": "50", + "identity": "34059@Mac.lan", "workerVersion": { - "buildId": "5876163392d8546a76682b853febd140" + "buildId": "bea38d1926cc20b3f7972bbc95740895" }, "sdkMetadata": {}, "meteringMetadata": {} } }, { - "eventId": "60", - "eventTime": "2026-09-06T18:11:27.755239Z", + "eventId": "52", + "eventTime": "2026-09-06T18:23:05.303054Z", "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1050516", + "taskId": "1052892", "markerRecordedEventAttributes": { "markerName": "core_external_stream", "details": { @@ -1178,19 +1009,19 @@ "metadata": { "encoding": "YmluYXJ5L3Byb3RvYnVm" }, - "data": "CAEQBRoECAEQBSLaAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC1hYzMyMGU1N2ZhZmM0ZWFmOTQ5YzFhYTBiNGY4NDZiZSQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YGaW5wdXRzAQ8xNzg4NzE4MjgyNzE4LTANcmVkaXMtc3RyZWFtcwECAAECAAECAAECAAECAAECAQEPMTc4ODcxODI4MjczMS0wDzE3ODg3MTgyODI3MzEtMAEAAQMBAQEPMTc4ODcxODI4MjczMS0wKAcysAEIARABGiB1S0JESWJiX3pEYnlqUFNZZXloXzlJSDAxeVZhbnR2XyA4KiQwMWEwNzdlYS1mNWFkLTc4MWUtYjE3ZS1iMjE2MThmYTdhN2YyMQoJZGVjaXNpb25zEAEYbSIg3ClteUJUVTZweyuvvwlOF9DoWSLrxmpqEsPbZESWN6I6AwoBADoDCgEAOgMKAQA6AwoBADoDCgEAOgMKAQFCDXJlZGlzLXN0cmVhbXNIAQ==" + "data": "CAEQARoECAEQBSLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0ODcwLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODk4NDg4My0wDzE3ODg3MTg5ODQ4ODMtMAEAAQMBAQEPMTc4ODcxODk4NDg4My0wKAcynAEIARABGiBxeUxQdjZoN0NUZUpfd3IxZzUwOE82NEtPeTRXX0FWOCAwKiQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkyMQoJZGVjaXNpb25zEAEYbSIg3ClteUJUVTZweyuvvwlOF9DoWSLrxmpqEsPbZESWN6I6AwoBADoDCgEBQg1yZWRpcy1zdHJlYW1zSAE=" } ] } }, - "workflowTaskCompletedEventId": "59" + "workflowTaskCompletedEventId": "51" } }, { - "eventId": "61", - "eventTime": "2026-09-06T18:11:27.755243Z", + "eventId": "53", + "eventTime": "2026-09-06T18:23:05.303058Z", "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", - "taskId": "1050517", + "taskId": "1052893", "workflowExecutionCompletedEventAttributes": { "result": { "payloads": [ @@ -1202,7 +1033,7 @@ } ] }, - "workflowTaskCompletedEventId": "59" + "workflowTaskCompletedEventId": "51" } } ] diff --git a/streams_demo/results-external/results.json b/streams_demo/results-external/results.json index e902198c8..149ce1ef9 100644 --- a/streams_demo/results-external/results.json +++ b/streams_demo/results-external/results.json @@ -1,8 +1,8 @@ { "provider": "external", - "workflow_id": "ai198-contract-external-ac320e57fafc4eaf949c1aa0b4f846be", + "workflow_id": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", "target": "127.0.0.1:53266", - "max_cached_workflows": 0, + "max_cached_workflows": 2, "outcome": "completed", "trace": [ { @@ -54,7 +54,7 @@ ], "task_failures": [ { - "event_id": 52, + "event_id": 47, "cause": 1, "message": "UnhandledCommand" } @@ -103,5 +103,5 @@ "value": null } ], - "history_events": 61 + "history_events": 53 } diff --git a/temporalio/streams/_binding.py b/temporalio/streams/_binding.py index 879ee632d..45903b8c6 100644 --- a/temporalio/streams/_binding.py +++ b/temporalio/streams/_binding.py @@ -11,13 +11,15 @@ from __future__ import annotations +import asyncio +import time from collections.abc import AsyncIterator from datetime import timedelta from typing import Any from temporalio import activity, workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowExecutionStatus from temporalio.contrib.external_workflow_streams import ( BEGINNING as PROVIDER_BEGINNING, AFTER, @@ -217,13 +219,25 @@ async def finish(self) -> None: raise async def _consumer_has_gone(self) -> bool: - """Whether the consuming execution has closed. Asked, not assumed.""" + """Whether the consuming execution is closing or closed. + + Asked rather than assumed, and asked for a few seconds rather than + once: the server refuses the wake while the execution is closing, and + at that moment its status is still the running one. A single look would + read "running" and turn the ordinary ending into an error. + """ if self._client is None or not self._workflow_id: return False - description = await self._client.get_workflow_handle( - self._workflow_id - ).describe() - return description.status is not None and description.status.value != 1 + handle = self._client.get_workflow_handle(self._workflow_id) + deadline = time.monotonic() + 5 + while True: + description = await handle.describe() + status = description.status + if status is not None and status != WorkflowExecutionStatus.RUNNING: + return True + if time.monotonic() >= deadline: + return False + await asyncio.sleep(0.1) def _encode(self, value: Any) -> bytes: payload = ( From 994cbeb82dbd6ba6344890a0530e2c903095d638 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 005/831] Added the temporalio.streams interface with a provider registry. --- temporalio/streams/__init__.py | 143 +++++++++++++++ temporalio/streams/_frame.py | 72 ++++++++ temporalio/streams/_handles.py | 215 ++++++++++++++++++++++ temporalio/streams/_policy.py | 56 ++++++ temporalio/streams/_provider.py | 216 +++++++++++++++++++++++ temporalio/streams/_record.py | 90 ++++++++++ temporalio/streams/providers/__init__.py | 19 ++ 7 files changed, 811 insertions(+) create mode 100644 temporalio/streams/__init__.py create mode 100644 temporalio/streams/_frame.py create mode 100644 temporalio/streams/_handles.py create mode 100644 temporalio/streams/_policy.py create mode 100644 temporalio/streams/_provider.py create mode 100644 temporalio/streams/_record.py create mode 100644 temporalio/streams/providers/__init__.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py new file mode 100644 index 000000000..a25c2bdca --- /dev/null +++ b/temporalio/streams/__init__.py @@ -0,0 +1,143 @@ +"""A stream a workflow can read, decide on, and write. + +The contract, in five statements: + +1. **A workflow publishes only to its own stream, and it publishes + transactionally.** :meth:`StreamWriter.publish` returns without the record + being visible. The record appears when the workflow task is accepted, and + never if the task fails, so no reader can see a decision the workflow did + not commit. +2. **Reading is an observation, and the SDK records it.** What + :class:`StreamReader` handed to workflow code, including the boundary where + it found nothing, is committed with the commands that reading produced. + Recovery re-supplies the same records in the same order. +3. **Anything that does I/O publishes on its own account.** An activity, a + local activity, or an outside process writes through :func:`producer`, and + its records are visible as soon as they are written. It carries a producer + id, an attempt and a sequence so a retry can be told from a new generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume. + Do not compare two cursors or do arithmetic on one: one provider numbers + records with integers and another with a millisecond-and-sequence pair. +5. **A workflow names its streams relative to itself, and the provider + resolves them.** ``reader("inputs")`` is this workflow's inbound stream + called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One + provider stores that as a namespace-level stream id and another as a name + under the run's chain key, and workflow code does not have to know which. + The provider itself is chosen when the worker is built. + +Outside a workflow there is no worker to carry the choice, so a process calls +:func:`configure` once before it opens a :func:`producer` or a +:func:`consumer`, and passes :func:`worker_options` to its ``Worker`` and +``Replayer``. Those two calls are where a provider is named. Nothing else in +this module mentions one. + +Reading somebody else's stream is out of scope for the first release. It is +the topology neither prototype has evidence for, and leaving it out is what +lets both of them implement the rest. + +What the contract does not promise: that a :attr:`RecordKind.FINISH` record +means the writing activity succeeded, that a superseded attempt's records can +be withdrawn, or that a stream outlives the retention its provider is +configured for. + +Prototype support for AI-198. The public names are the proposal; providers +live under :mod:`temporalio.streams.providers`, one module each, registered +by name and chosen by :func:`configure`. Everything else is shared. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any, TypeVar + +from temporalio.streams._handles import ReadSource, StreamReader, StreamWriter, WriteSink +from temporalio.streams._provider import ( + Consumer, + Producer, + StreamProvider, + configure, + consumer, + open_read, + open_write, + producer, + worker_options, +) +from temporalio.streams._record import ( + BEGINNING, + Cursor, + RecordKind, + StreamRecord, + Supersession, +) + +__all__ = [ + "BEGINNING", + "Consumer", + "Cursor", + "Producer", + "ReadSource", + "RecordKind", + "StreamProvider", + "StreamReader", + "StreamRecord", + "StreamWriter", + "Supersession", + "WriteSink", + "configure", + "consumer", + "producer", + "worker_options", + "reader", + "writer", +] + +T = TypeVar("T") + + +def reader( + stream: str, + *, + type: type | None = None, + topic: str | None = None, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, +) -> StreamReader[Any]: + """Subscribe this workflow to its inbound stream ``stream``. + + Each call is a separate subscription with its own cursor, so adding, + removing or reordering one renumbers the waits after it. Gate a change + behind :func:`temporalio.workflow.patched` as you would for a timer. + + Args: + stream: The inbound stream's name, relative to this workflow. + type: The value type, used as the decode hint. + topic: Only records on this topic, or every topic when omitted. + start: Where to start. Only honoured on the first subscription of a + run, because after that the recorded cursor decides. + idle_timeout: How long the workflow waits with nothing arriving before + the provider is allowed to release the worker. ``None`` takes the + provider's default. + """ + return StreamReader( + open_read(stream, start=start, idle_timeout=idle_timeout), + topic=topic, + type=type, + ) + + +def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: + """Publish to ``topic`` on the stream this workflow owns. + + Args: + topic: The topic name. + type: Declared for symmetry with :func:`reader` and for documentation. + Encoding follows the value. + """ + del type + return StreamWriter(open_write(topic), topic) + + +# Importing the package registers every provider whose dependencies are +# present in this tree. Import order matters: the registry above must exist +# before a provider module can register with it. +from temporalio.streams import providers as _providers # noqa: E402,F401 diff --git a/temporalio/streams/_frame.py b/temporalio/streams/_frame.py new file mode 100644 index 000000000..c32811d32 --- /dev/null +++ b/temporalio/streams/_frame.py @@ -0,0 +1,72 @@ +"""The record envelope both bindings put on the wire. + +A provider stores an opaque body. The contract needs more than a body: which +topic a record belongs to, whether it is data or a terminal marker, and which +producer attempt wrote it. Neither prototype carries all of that in a channel +of its own, so the interface carries it here and each binding stores the result +as an ordinary body. + +Encoding is synchronous and deterministic because a workflow publishes on the +workflow thread. The header is JSON with sorted keys for that reason, and +because a stored record that a person can read is worth more during an +incident than a few saved bytes. +""" + +from __future__ import annotations + +import json +from typing import Any + +from temporalio.streams._record import RecordKind + +__all__ = ["decode", "encode"] + +_MAGIC = b"tsf1" + + +def encode( + *, + topic: str, + kind: RecordKind, + producer: str, + attempt: int, + sequence: int, + body: bytes, +) -> bytes: + """Wrap one already-encoded body with the contract's metadata.""" + header: dict[str, Any] = {"k": int(kind), "t": topic} + # Omitted rather than written as a default, so a workflow's own publish + # does not carry three fields that only mean something for a producer. + if producer: + header["p"] = producer + if attempt: + header["a"] = attempt + if sequence >= 0: + header["s"] = sequence + raw = json.dumps(header, sort_keys=True, separators=(",", ":")).encode() + return _MAGIC + len(raw).to_bytes(4, "big") + raw + body + + +def decode(frame: bytes) -> tuple[RecordKind, str, str, int, int, bytes]: + """Split a frame into ``(kind, topic, producer, attempt, sequence, body)``. + + Raises: + ValueError: The bytes are not a frame this interface wrote. Reading a + stream someone else populated is a real case, so it fails with a + name rather than an index error. + """ + if len(frame) < 8 or frame[:4] != _MAGIC: + raise ValueError( + "this record was not written through the stream interface, so its " + "topic and producer are unknown" + ) + size = int.from_bytes(frame[4:8], "big") + header = json.loads(frame[8 : 8 + size]) + return ( + RecordKind(header.get("k", int(RecordKind.DATA))), + header.get("t", ""), + header.get("p", ""), + int(header.get("a", 0)), + int(header.get("s", -1)), + frame[8 + size :], + ) diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py new file mode 100644 index 000000000..a6dc9a073 --- /dev/null +++ b/temporalio/streams/_handles.py @@ -0,0 +1,215 @@ +"""The handles workflow code holds. + +Everything provider-specific sits behind the two protocols at the top. A +handle converts values, frames records, filters topics and synthesizes +supersession; a binding only moves bytes. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from typing import Any, Generic, Protocol, TypeVar + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import Cursor, RecordKind, StreamRecord + +__all__ = ["ReadSource", "StreamReader", "StreamWriter", "WriteSink"] + +T = TypeVar("T") + + +class ReadSource(Protocol): + """One subscription, as a provider supplies it.""" + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + """The next records, waiting until there is at least one. + + A batch rather than a record because delivery boundaries are what a + provider actually records, and flattening them here keeps that out of + the contract. + + Raises: + StopAsyncIteration: This subscription has ended. + """ + ... + + def close(self) -> None: + """End the subscription. Idempotent.""" + ... + + +class WriteSink(Protocol): + """One topic on the stream the running workflow owns.""" + + async def publish(self, frame: bytes) -> None: + """Accept one framed record into this workflow task's output. + + Awaitable because a provider may hold the publisher back when its + batch is full. It does not mean the record is visible: it becomes + visible when the workflow task is accepted. + """ + ... + + +def _encode_value(value: Any) -> bytes: + converter = workflow.payload_converter() + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _decode_value(body: bytes, as_type: type | None) -> Any: + converter = workflow.payload_converter() + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class StreamWriter(Generic[T]): + """Publishes to a topic on the stream this workflow owns. + + A workflow can only publish transactionally to a stream it owns, on both + providers. Writing to somebody else's stream is an activity's job, and it + gets the weaker guarantee that goes with doing I/O. + """ + + def __init__(self, sink: WriteSink, topic: str) -> None: + """Prefer :func:`temporalio.streams.writer`.""" + self._sink = sink + self._topic = topic + self._finished = False + + @property + def topic(self) -> str: + """The topic this writer is bound to.""" + return self._topic + + async def publish(self, value: T) -> None: + """Append ``value`` to this topic. + + Returning does not mean the record is visible. It becomes visible when + this workflow task is accepted, and never at all if the task fails, so + a reader cannot see a decision the workflow did not commit. + """ + if self._finished: + raise RuntimeError(f"topic {self._topic!r} was already finished") + await self._sink.publish( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer="", + attempt=0, + sequence=-1, + body=_encode_value(value), + ) + ) + + async def finish(self) -> None: + """Declare this topic complete. + + Says the writer has nothing more to send. It does not say the workflow + or the activity behind it succeeded, and a reader that treats it that + way will accept output from an attempt that later timed out. + """ + if self._finished: + return + self._finished = True + await self._sink.publish( + _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer="", + attempt=0, + sequence=-1, + body=b"", + ) + ) + + +class StreamReader(Generic[T]): + """Reads a stream from inside workflow code. + + Iterating yields every kind of record, including the supersession the + reader synthesizes when a producer's newer attempt appears. Check + ``record.kind``, or use :meth:`values` when the workflow genuinely only + wants data. + """ + + def __init__( + self, + source: ReadSource, + *, + topic: str | None = None, + type: type | None = None, + ) -> None: + """Prefer :func:`temporalio.streams.reader`.""" + self._source = source + self._topic = topic + self._type = type + self._pending: list[StreamRecord[Any]] = [] + self._attempts = AttemptTracker() + self._closed = False + + def __aiter__(self) -> AsyncIterator[StreamRecord[T]]: + """Iterate records until the reader is closed.""" + return self._iterate() + + async def _iterate(self) -> AsyncIterator[StreamRecord[T]]: + while not self._closed: + try: + record = await self.next() + except StopAsyncIteration: + # The provider ended the subscription. Iteration stops rather + # than raising, so a workflow that reads to the end of a + # finished stream leaves the loop instead of failing its task. + return + yield record + + async def values(self) -> AsyncIterator[T]: + """Iterate the data values, dropping control records.""" + async for record in self: + if record.kind is RecordKind.DATA: + yield record.value + + async def next(self) -> StreamRecord[T]: + """The next record, waiting for one if there is none buffered. + + Raises: + StopAsyncIteration: The provider ended the subscription. + """ + while not self._pending: + await self._fill() + return self._pending.pop(0) + + async def _fill(self) -> None: + for cursor, frame in await self._source.next_batch(): + kind, topic, producer, attempt, sequence, body = _frame.decode(frame) + if self._topic is not None and topic != self._topic: + continue + superseded = self._attempts.note(producer, attempt, cursor) + if superseded is not None: + self._pending.append(superseded) + self._pending.append( + StreamRecord( + value=( + _decode_value(body, self._type) + if kind is RecordKind.DATA + else None + ), + cursor=cursor, + kind=kind, + topic=topic, + producer=producer, + attempt=attempt, + sequence=sequence, + ) + ) + + def close(self) -> None: + """End the subscription. Idempotent.""" + self._closed = True + self._source.close() diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py new file mode 100644 index 000000000..24e20ab2f --- /dev/null +++ b/temporalio/streams/_policy.py @@ -0,0 +1,56 @@ +"""Turning a producer's newer attempt into something a reader can act on. + +An activity that streams half an answer and then fails leaves those records in +the stream. Its retry calls the model again and writes different words. No +provider can undo the first half, and a workflow that already acted on it has +committed that decision, so the honest thing is to tell the reader that a new +attempt began and let the application decide. + +This runs in the reader over records it already observed, so it costs no round +trip and replays without the provider being involved. +""" + +from __future__ import annotations + +from temporalio.streams._record import ( + Cursor, + RecordKind, + StreamRecord, + Supersession, +) + +__all__ = ["AttemptTracker"] + + +class AttemptTracker: + """Watches producer attempts on one subscription.""" + + def __init__(self) -> None: + self._attempts: dict[str, int] = {} + + def note( + self, producer: str, attempt: int, cursor: Cursor + ) -> StreamRecord[Supersession] | None: + """A supersession record when this record starts a newer attempt. + + A producer that declares no attempt supersedes nothing, because there + is no generation to compare. That is the same answer as an unnumbered + record: the interface reports what it was told and invents nothing. + """ + if not producer or attempt <= 0: + return None + previous = self._attempts.get(producer, 0) + if attempt <= previous: + return None + self._attempts[producer] = attempt + if previous == 0: + return None + return StreamRecord( + value=Supersession( + producer=producer, previous_attempt=previous, attempt=attempt + ), + cursor=cursor, + kind=RecordKind.SUPERSEDED, + producer=producer, + attempt=attempt, + ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py new file mode 100644 index 000000000..58282cc55 --- /dev/null +++ b/temporalio/streams/_provider.py @@ -0,0 +1,216 @@ +"""The provider registry: where a process names its stream provider. + +A provider only moves bytes. The handles, records, framing and supersession +around it are shared, so every provider module is small: it implements +:class:`StreamProvider` and registers a factory under a short name when it is +imported. One :func:`configure` call decides which factory serves this +process; when exactly one provider is registered, it is the default and the +call can be omitted. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any, Callable, Protocol + +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, StreamRecord + +__all__ = [ + "Consumer", + "Producer", + "StreamProvider", + "configure", + "consumer", + "open_read", + "open_write", + "producer", + "register", + "registered", + "worker_options", +] + + +class Producer(Protocol): + """Appends to a stream from outside workflow code. + + Every append is visible as soon as the provider accepts it, and carries + the producer id, attempt and sequence that let a reader tell a retried + append from a new generation. + """ + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + ... + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + ... + + async def finish(self) -> None: + """Declare this producer's output complete.""" + ... + + +class Consumer(Protocol): + """Reads a stream from outside workflow code, resumably.""" + + def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive.""" + ... + + +class StreamProvider(Protocol): + """What a provider module implements. + + The workflow-side pair (:meth:`open_read`, :meth:`open_write`) runs inside + workflow code and must keep the contract's first two rules: publishes + commit with the workflow task, and reads are recorded observations. The + outside pair (:meth:`producer`, :meth:`consumer`) runs anywhere and moves + framed bytes. A transport-only provider may serve just the outside pair + and raise on the workflow side, naming the provider a worker should use. + """ + + name: str + + def configure(self, **options: Any) -> None: + """Accept this provider's process-level options.""" + ... + + def worker_options(self) -> dict[str, Any]: + """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + ... + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + """Subscribe the running workflow to its inbound stream ``stream``.""" + ... + + def open_write(self, topic: str) -> WriteSink: + """Bind ``topic`` on the stream the running workflow owns.""" + ... + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> Producer: + """Open a producer for ``workflow_id``'s inbound stream ``stream``.""" + ... + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> Consumer: + """Open a reader for what ``workflow_id`` publishes.""" + ... + + +_factories: dict[str, Callable[[], StreamProvider]] = {} +_active: StreamProvider | None = None + + +def register(name: str, factory: Callable[[], StreamProvider]) -> None: + """Make ``factory`` selectable as ``configure(provider=name)``.""" + _factories[name] = factory + + +def registered() -> list[str]: + """The provider names this process can configure.""" + return sorted(_factories) + + +def _make(name: str | None) -> StreamProvider: + if name is None: + if len(_factories) == 1: + name = next(iter(_factories)) + else: + raise RuntimeError( + "name a provider: configure(provider=...) with one of " + f"{registered()}" + ) + factory = _factories.get(name) + if factory is None: + raise RuntimeError( + f"no stream provider {name!r} is registered; available: {registered()}" + ) + return factory() + + +def configure(provider: str | None = None, **options: Any) -> None: + """Name the provider for this process and hand it its options. + + ``provider`` may be omitted when exactly one provider is registered. + """ + global _active + chosen = _make(provider) + chosen.configure(**options) + _active = chosen + + +def _current() -> StreamProvider: + global _active + if _active is None: + chosen = _make(None) + chosen.configure() + _active = chosen + return _active + + +def worker_options() -> dict[str, Any]: + """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + return _current().worker_options() + + +def open_read( + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, +) -> ReadSource: + """Subscribe the running workflow to its inbound stream ``stream``.""" + return _current().open_read(stream, start=start, idle_timeout=idle_timeout) + + +def open_write(topic: str) -> WriteSink: + """Bind ``topic`` on the stream the running workflow owns.""" + return _current().open_write(topic) + + +async def producer( + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, +) -> Producer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``.""" + return await _current().producer( + client, + workflow_id=workflow_id, + stream=stream, + producer_id=producer_id, + attempt=attempt, + ) + + +async def consumer(client: Any, *, workflow_id: str, stream: str = "") -> Consumer: + """Open a reader for what ``workflow_id`` publishes.""" + return await _current().consumer(client, workflow_id=workflow_id, stream=stream) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py new file mode 100644 index 000000000..d458ef0c4 --- /dev/null +++ b/temporalio/streams/_record.py @@ -0,0 +1,90 @@ +"""The value types the stream contract is expressed in. + +Nothing here touches Temporal or a provider, so both bindings share it +unchanged. +""" + +from __future__ import annotations + +import enum +from dataclasses import dataclass +from typing import Generic, TypeVar + +__all__ = [ + "BEGINNING", + "Cursor", + "RecordKind", + "StreamRecord", + "Supersession", +] + +T = TypeVar("T") + + +@enum.unique +class RecordKind(enum.IntEnum): + """What a record is.""" + + DATA = 1 + """Carries a value published by a workflow or a producer.""" + + FINISH = 2 + """The writer of this topic declared it complete. + + Separate from the activity or workflow that wrote it having succeeded. A + reader that treats it as proof of success is wrong: the activity can still + time out after writing it. + """ + + SUPERSEDED = 3 + """A later attempt of the same producer started writing. + + Synthesized by the reader from what it observed, so both providers deliver + it identically and replay reproduces it without the provider's help. + """ + + +@dataclass(frozen=True) +class Cursor: + """A position in a stream, ordered by its provider rather than by value. + + Opaque on purpose. One provider numbers records with integers and another + with a millisecond-and-sequence pair, so comparing tokens here would be + right for one and wrong for the other. Hand a cursor back to resume from + it; ask the reader to compare two. + """ + + token: str + + def __str__(self) -> str: + """The provider's position token.""" + return self.token + + +BEGINNING = Cursor("") +"""Read from the oldest record the stream still retains.""" + + +@dataclass(frozen=True) +class Supersession: + """The body of a :attr:`RecordKind.SUPERSEDED` record.""" + + producer: str + previous_attempt: int + attempt: int + + +@dataclass(frozen=True) +class StreamRecord(Generic[T]): + """One record as workflow code sees it.""" + + value: T + cursor: Cursor + kind: RecordKind = RecordKind.DATA + topic: str = "" + producer: str = "" + """Who wrote it, or empty when the owning workflow wrote it itself.""" + attempt: int = 0 + """The producer's attempt, or 0 when it did not declare one.""" + sequence: int = -1 + """The producer's position within its attempt, or -1 when unnumbered.""" diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py new file mode 100644 index 000000000..dff94b250 --- /dev/null +++ b/temporalio/streams/providers/__init__.py @@ -0,0 +1,19 @@ +"""Stream providers, one module each. + +Importing this package registers every provider whose dependencies are +present. A tree that lacks a provider's dependencies simply does not offer +that name; nothing else changes, because everything above the provider is +shared. +""" + +from __future__ import annotations + +_KNOWN = ("memory", "workflow_streams", "native", "redis", "nexus") + +for _name in _KNOWN: + try: + __import__(f"{__name__}.{_name}") + except ImportError: + # This tree does not carry that provider. The registry error message + # lists what is actually available. + pass From a8659440a2a19aac78388d71d0393a6a4908a2ed Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 006/831] Added the in-memory reference provider and the conformance tests. --- temporalio/streams/providers/memory.py | 315 ++++++++++++++++++++++ tests/streams/__init__.py | 0 tests/streams/test_streams_conformance.py | 164 +++++++++++ 3 files changed, 479 insertions(+) create mode 100644 temporalio/streams/providers/memory.py create mode 100644 tests/streams/__init__.py create mode 100644 tests/streams/test_streams_conformance.py diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py new file mode 100644 index 000000000..808a84f13 --- /dev/null +++ b/temporalio/streams/providers/memory.py @@ -0,0 +1,315 @@ +"""The in-process reference provider. + +Exists so the conformance suite can exercise the whole surface without a +store, and to document in one file what a provider owes. Two honest limits, +both stated so nobody mistakes this for evidence: + +- It is not replay-safe. Workflow-side state lives in plain process memory, + so run it with a warm workflow cache and do not use it to demonstrate + recovery. +- A workflow's publish becomes visible at ``publish`` time rather than at + task acceptance, so it only approximates rule 1 of the contract. + +The outside surface (producer, consumer, dedupe, supersession, cursors) is +faithful, which is what the conformance tests lean on. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import temporalio.converter +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_DEFAULT_POLL = timedelta(milliseconds=100) + + +class _MemoryStream: + def __init__(self) -> None: + self.frames: list[bytes] = [] + # Dedupe identity is (producer#attempt, first sequence of the append), + # the same pair the storage providers use. + self.seen: dict[tuple[str, int], int] = {} + self._arrival = asyncio.Event() + + def append(self, frames: list[bytes], *, producer_id: str, sequence: int) -> int: + key = (producer_id, sequence) + already = self.seen.get(key) + if already is not None: + return already + offset = len(self.frames) + self.frames.extend(frames) + self.seen[key] = offset + arrival, self._arrival = self._arrival, asyncio.Event() + arrival.set() + return offset + + async def wait_past(self, offset: int) -> None: + while len(self.frames) <= offset: + await self._arrival.wait() + + +_streams: dict[str, _MemoryStream] = {} + + +def _stream(stream_id: str) -> _MemoryStream: + found = _streams.get(stream_id) + if found is None: + found = _streams[stream_id] = _MemoryStream() + return found + + +def reset() -> None: + """Drop every stream. For tests.""" + _streams.clear() + + +def _inbound_id(workflow_id: str, stream: str) -> str: + return f"{workflow_id}:{stream}" if stream else workflow_id + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +class _MemReadSource: + """Workflow-side read that wakes by polling a timer. + + A real provider wakes the workflow by delivering; polling is the price of + having no delivery path, and it is why this provider is for tests. + """ + + def __init__(self, store: _MemoryStream, start: int, poll: timedelta) -> None: + self._store = store + self._cursor = start + self._poll = poll + self._closed = False + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while not self._closed: + frames = self._store.frames + if len(frames) > self._cursor: + batch = [ + (Cursor(str(offset)), frames[offset]) + for offset in range(self._cursor, len(frames)) + ] + self._cursor = len(frames) + return batch + await workflow.sleep(self._poll) + raise StopAsyncIteration + + def close(self) -> None: + self._closed = True + + +class _MemWriteSink: + def __init__(self, store: _MemoryStream, topic: str) -> None: + self._store = store + self._topic = topic + self._sequence = 0 + + async def publish(self, frame: bytes) -> None: + self._store.append( + [frame], + producer_id=f"__workflow__:{self._topic}", + sequence=self._sequence, + ) + self._sequence += 1 + + +class MemoryProducer: + """The outside producer, faithful to the contract.""" + + def __init__( + self, store: _MemoryStream, converter: Any, topic: str, producer_id: str, attempt: int + ) -> None: + self._store = store + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = self._store.append( + frames, + producer_id=self._provider_id, + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + self._store.append( + [frame], producer_id=self._provider_id, sequence=self._sequence - 1 + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class MemoryConsumer: + """The outside reader, with the shared supersession rule.""" + + def __init__(self, store: _MemoryStream, converter: Any) -> None: + self._store = store + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + offset = int(start.token) if start.token else 0 + while True: + await self._store.wait_past(offset) + frames = self._store.frames + while offset < len(frames): + cursor = Cursor(str(offset)) + frame = frames[offset] + offset += 1 + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + frame + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _MemoryProvider: + name = "memory" + + def __init__(self) -> None: + self._poll = _DEFAULT_POLL + + def configure(self, **options: Any) -> None: + poll = options.pop("poll_interval", None) + if poll is not None: + self._poll = poll + if options: + raise TypeError( + f"the memory provider takes only poll_interval, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + store = _stream(_inbound_id(workflow.info().workflow_id, stream)) + return _MemReadSource( + store, + int(start.token) if start.token else 0, + idle_timeout or self._poll, + ) + + def open_write(self, topic: str) -> WriteSink: + store = _stream(_inbound_id(workflow.info().workflow_id, "")) + return _MemWriteSink(store, topic) + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> MemoryProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return MemoryProducer( + _stream(_inbound_id(workflow_id, stream)), + _converter(client), + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> MemoryConsumer: + return MemoryConsumer( + _stream(_inbound_id(workflow_id, stream)), _converter(client) + ) + + +_provider.register("memory", _MemoryProvider) diff --git a/tests/streams/__init__.py b/tests/streams/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py new file mode 100644 index 000000000..d01132851 --- /dev/null +++ b/tests/streams/test_streams_conformance.py @@ -0,0 +1,164 @@ +"""Conformance tests for the stream contract. + +Written against the public surface plus the in-memory reference provider, so +they run with no server and no store. A storage provider reuses the same +expectations through its own fixtures; what this file pins down is the +contract: framing, producer identity, retry deduplication, supersession, +topic filtering, and cursor resumption. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +from temporalio import streams +from temporalio.streams import _frame +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import Cursor, RecordKind +from temporalio.streams.providers import memory + + +@pytest.fixture(autouse=True) +def _fresh_memory_provider(): + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +async def take(records: Any, count: int, timeout: float = 5.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +def test_frame_roundtrip(): + frame = _frame.encode( + topic="decisions", + kind=RecordKind.DATA, + producer="model", + attempt=3, + sequence=7, + body=b"payload-bytes", + ) + kind, topic, producer, attempt, sequence, body = _frame.decode(frame) + assert (kind, topic, producer, attempt, sequence, body) == ( + RecordKind.DATA, + "decisions", + "model", + 3, + 7, + b"payload-bytes", + ) + + +def test_supersession_is_synthesized_from_observations(): + attempts = AttemptTracker() + assert attempts.note("model", 1, Cursor("0")) is None + superseded = attempts.note("model", 2, Cursor("1")) + assert superseded is not None + assert superseded.kind is RecordKind.SUPERSEDED + assert superseded.value.previous_attempt == 1 + # The same attempt again is not a new generation. + assert attempts.note("model", 2, Cursor("2")) is None + + +async def test_append_read_roundtrip(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"id": "r1"}, {"id": "r2"}) + await producer.finish() + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] + assert all(r.producer == "model" and r.attempt == 1 for r in records) + assert [r.sequence for r in records] == [0, 1, 2] + + +async def test_retried_append_is_deduplicated(): + first = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await first.append({"id": "r1"}) + # The retry of the same attempt starts its sequence over and appends the + # same record. The provider must not store it twice. + retry = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await retry.append({"id": "r1"}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 1) + assert records[0].value == {"id": "r1"} + with pytest.raises(asyncio.TimeoutError): + await take(consumer.read(type=dict), 2, timeout=0.2) + + +async def test_new_attempt_supersedes_the_old_one(): + first = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await first.append({"text": "The capital of"}) + second = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=2 + ) + await second.append({"text": "Paris is the capital"}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + + +async def test_topic_filter(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}) + other = await streams.producer( + None, workflow_id="wf", stream="other", producer_id="model", attempt=1 + ) + await other.append({"n": 2}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict, topic="inputs"), 1) + assert records[0].value == {"n": 1} + + +async def test_cursor_resumes_where_it_points(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + checkpoint = records[1].cursor + + resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") + again = await take(resumed.read(type=dict, start=checkpoint), 2) + assert [r.value for r in again] == [{"n": 2}, {"n": 3}] + + +def test_unknown_provider_is_a_clear_error(): + with pytest.raises(RuntimeError, match="no stream provider 'nope'"): + streams.configure(provider="nope") From 1ee9e7d7090604098c55c4fbc17e5442f1f51eab Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 007/831] Added the shared demo loop. --- streams_demo/agent_loop.py | 92 ++++++++++++++++++++ streams_demo/provider_setup.py | 21 +++++ streams_demo/run_demo.py | 154 +++++++++++++++++++++++++++++++++ 3 files changed, 267 insertions(+) create mode 100644 streams_demo/agent_loop.py create mode 100644 streams_demo/provider_setup.py create mode 100644 streams_demo/run_demo.py diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py new file mode 100644 index 000000000..afbb7ea4c --- /dev/null +++ b/streams_demo/agent_loop.py @@ -0,0 +1,92 @@ +"""One agent loop, written once, run on both stream providers. + +Reads input, decides on it, publishes the decision, and runs an ordinary +Activity in the same workflow task. Also handles the two control records the +contract defines, so a retried producer and a finished topic are exercised +rather than described. + +This file is byte-identical in the server-side tree and the client-side tree. +Only the worker that runs it differs, and only in which provider it is given. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any + +from temporalio import activity, streams, workflow + +DECISIONS = "decisions" +INPUTS = "inputs" + + +@activity.defn(name="AI198RecordDecision") +async def record_decision(decision: dict[str, Any]) -> str: + """An ordinary command in the same task as the publish.""" + return f"recorded:{decision['source']}:{decision['branch']}" + + +def decide(token: dict[str, Any]) -> dict[str, Any]: + """The decision the workflow is here to make.""" + if token["value"] % 2 == 0: + return {"source": token["id"], "branch": "even", "computed": token["value"] * 10} + return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} + + +@workflow.defn(name="AI198StreamContractDemo", sandboxed=False) +class AgentLoop: + """Read, decide, write, until the producer says it has finished.""" + + @workflow.run + async def run(self, limit: int) -> list[dict[str, Any]]: + inputs = streams.reader( + INPUTS, type=dict, idle_timeout=timedelta(seconds=1) + ) + decisions = streams.writer(DECISIONS) + trace: list[dict[str, Any]] = [] + accepted = 0 + try: + async for record in inputs: + if record.kind is streams.RecordKind.SUPERSEDED: + # A newer attempt of the same producer started writing. The + # decisions already published stand, so the workflow says so + # rather than pretending they can be withdrawn. + trace.append( + { + "kind": "superseded", + "producer": record.producer, + "replaced": record.value.previous_attempt, + "attempt": record.value.attempt, + } + ) + await decisions.publish( + {"retracting_attempt": record.value.previous_attempt} + ) + continue + if record.kind is streams.RecordKind.FINISH: + # The producer says it is done, which is what ends the loop. + # Counting decisions instead would leave the terminal record + # unread and let the workflow finish while its producer is + # still writing. + trace.append({"kind": "finish", "producer": record.producer}) + break + decision = decide(record.value) + await decisions.publish(decision) + receipt = await workflow.execute_activity( + record_decision, + decision, + activity_id=f"decision-{decision['source']}", + start_to_close_timeout=timedelta(seconds=10), + ) + trace.append( + {"kind": "decision", "value": decision, "receipt": receipt} + ) + accepted += 1 + if accepted >= limit: + # A bound so a stuck producer cannot run this forever. The + # terminal record above is the ordinary way out. + break + finally: + inputs.close() + await decisions.finish() + return trace diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py new file mode 100644 index 000000000..81e7108e5 --- /dev/null +++ b/streams_demo/provider_setup.py @@ -0,0 +1,21 @@ +"""Pick the provider for a demo run from the environment. + +``STREAMS_PROVIDER`` names any registered provider; this base tree carries +only ``memory``, and each provider branch adds its own name. The demo needs a +Temporal server to run the workflow either way; ``TEMPORAL_ADDRESS`` points +at it. +""" + +from __future__ import annotations + +import os + +NAME = os.environ.get("STREAMS_PROVIDER", "memory") + +# The memory provider is not replay-safe, so its demo keeps the cache warm. +# Storage providers run with the smallest cache they support instead. +WORKFLOW_CACHE = int(os.environ.get("STREAMS_WORKFLOW_CACHE", "512")) + + +async def open() -> tuple[str, dict]: + return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), {"provider": NAME} diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py new file mode 100644 index 000000000..027a95103 --- /dev/null +++ b/streams_demo/run_demo.py @@ -0,0 +1,154 @@ +"""Run the shared agent loop against whichever provider is configured. + +Three cases, the same on both providers: + +- read, decide, publish and an ordinary Activity in the same workflow task, + with the smallest workflow cache the provider supports, so that as much of + the run as it allows is rebuilt rather than remembered; +- a producer whose second attempt supersedes its first, which the reader has + to report and the workflow has to act on; +- an outside consumer reading what the workflow published. + +Byte-identical in both trees. ``provider_setup`` is what differs, and it is +the only import here that names a provider. +""" + +from __future__ import annotations + +import asyncio +import json +from pathlib import Path +import sys +import time +import uuid +from typing import Any + +from temporalio import streams +from temporalio.api.enums.v1 import EventType +from temporalio.client import Client +from temporalio.worker import Worker + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 +import provider_setup # noqa: E402 + +DECISION_LIMIT = 8 +EXPECTED_OUTPUT = 6 + + +async def collect_output(client: Client, workflow_id: str, want: int) -> list[dict]: + reader = await streams.consumer(client, workflow_id=workflow_id) + seen: list[dict] = [] + async for record in reader.read(type=dict, topic="decisions"): + seen.append({"kind": record.kind.name, "value": record.value}) + if len(seen) >= want: + break + return seen + + +async def main() -> int: + out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" + out.mkdir(exist_ok=True) + target, options = await provider_setup.open() + client = await Client.connect(target, namespace="default") + streams.configure(**options) + + uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex + record: dict[str, Any] = { + "provider": provider_setup.NAME, + "workflow_id": uid, + "target": target, + "max_cached_workflows": provider_setup.WORKFLOW_CACHE, + } + + async with Worker( + client, + task_queue=uid, + workflows=[AgentLoop], + activities=[record_decision], + max_cached_workflows=provider_setup.WORKFLOW_CACHE, + **streams.worker_options(), + ): + handle = await client.start_workflow( + AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid + ) + output = asyncio.create_task(collect_output(client, uid, EXPECTED_OUTPUT)) + + # The first attempt writes two records and then stops, as a failed + # activity would. The second writes different inputs under the same + # logical producer, which is what the reader has to report. + first = await streams.producer( + client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=1 + ) + await first.append({"id": "r1", "value": 1}, {"id": "r2", "value": 2}) + await asyncio.sleep(0.5) + second = await streams.producer( + client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=2 + ) + await second.append({"id": "r3", "value": 3}, {"id": "r4", "value": 4}) + await second.finish() + + # A failed Workflow Task is not an outcome. The server rejects a + # completion that raced newly buffered events, and the retry usually + # gets through, so reading the first failure as the result reports a + # working run as a broken one. Wait for a terminal event, then report + # the retries separately so they are neither the headline nor hidden. + deadline = time.monotonic() + 120 + # Taken from the enum rather than written out, because guessing these + # numbers is how a run that completed gets reported as terminated. + terminal = { + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: "completed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: "workflow_failed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: "execution_timed_out", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: "canceled", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: "terminated", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: "continued_as_new", + } + while time.monotonic() < deadline: + history = await handle.fetch_history() + reached = [ + terminal[e.event_type] + for e in history.events + if e.event_type in terminal + ] + if reached: + record["outcome"] = reached[-1] + if record["outcome"] == "completed": + record["trace"] = await handle.result() + break + await asyncio.sleep(0.1) + else: + record["outcome"] = "timed_out_waiting" + history = await handle.fetch_history() + + retried = [ + e + for e in history.events + if e.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_FAILED + ] + record["task_failures"] = [ + { + "event_id": e.event_id, + "cause": int(e.workflow_task_failed_event_attributes.cause), + "message": e.workflow_task_failed_event_attributes.failure.message, + } + for e in retried + ] + + try: + record["observed_output"] = await asyncio.wait_for(output, timeout=20) + except asyncio.TimeoutError: + output.cancel() + record["observed_output"] = "timed_out" + + history = await handle.fetch_history() + record["history_events"] = len(history.events) + (out / "history.json").write_text(history.to_json()) + await provider_setup.close() + (out / "results.json").write_text(json.dumps(record, indent=2) + "\n") + print(json.dumps(record, indent=2)) + return 0 if record["outcome"] == "completed" else 1 + + +if __name__ == "__main__": + sys.exit(asyncio.run(main())) From 0d54110749db0912ac96be8e07bdc0bda263e70b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 008/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From 32378c049a7a904d46a84c30483bef80c8ee8f08 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 009/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From 810282ab1e296dade58ef2985dc77f4dd42903d7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 010/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/_provider.py | 11 +- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 3 files changed, 526 insertions(+), 1 deletion(-) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 58282cc55..7ac8bf395 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -159,9 +159,18 @@ def configure(provider: str | None = None, **options: Any) -> None: ``provider`` may be omitted when exactly one provider is registered. """ global _active + _active = instance(provider, **options) + + +def instance(provider: str | None = None, **options: Any) -> StreamProvider: + """A configured provider that is not installed as the process default. + + For code that serves one provider while the process is configured with + another, such as a Nexus stream handler delegating to its store. + """ chosen = _make(provider) chosen.configure(**options) - _active = chosen + return chosen def _current() -> StreamProvider: diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 6236a100abf7ea198dc89a93805251ec926ce3f1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 011/831] Pinned Core to the stream revision and regenerated bridge protos. --- .gitmodules | 2 +- .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 613 ++++++-------- .../workflow_activation_pb2.pyi | 68 ++ .../workflow_commands_pb2.py | 800 +++++++----------- .../workflow_commands_pb2.pyi | 90 ++ temporalio/bridge/sdk-core | 2 +- 7 files changed, 737 insertions(+), 840 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..ae7639820 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamMessages, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamMessages", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..0e1b3a1e6 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,430 +2,311 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.update.v1 import ( - message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, -) -from temporalio.bridge.proto.activity_result import ( - activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' -) - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ - "HeadersEntry" -] -_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStart" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartSuccess" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartFailure" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartCancelled" -] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecution" -] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveSignalExternalWorkflow" -] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveRequestCancelExternalWorkflow" -] -_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveNexusOperationStart" -] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] -WorkflowActivation = _reflection.GeneratedProtocolMessageType( - "WorkflowActivation", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }, -) + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] +_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] +_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] +WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( - "WorkflowActivationJob", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }, -) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }) _sym_db.RegisterMessage(WorkflowActivationJob) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType( - "InitializeWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _INITIALIZEWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }, -) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }) +_sym_db.RegisterMessage(DeliverStreamMessages) + +InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _INITIALIZEWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType( - "FireTimer", - (_message.Message,), - { - "DESCRIPTOR": _FIRETIMER, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }, -) +FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { + 'DESCRIPTOR' : _FIRETIMER, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType( - "ResolveActivity", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEACTIVITY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }, -) +ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }, -) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartSuccess", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }, -) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartFailure", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }, -) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartCancelled", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }, -) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }, -) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( - "UpdateRandomSeed", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERANDOMSEED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }, -) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERANDOMSEED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType( - "QueryWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _QUERYWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }, -) +QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _QUERYWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }, -) +CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType( - "SignalWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }, -) +SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType( - "NotifyHasPatch", - (_message.Message,), - { - "DESCRIPTOR": _NOTIFYHASPATCH, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }, -) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { + 'DESCRIPTOR' : _NOTIFYHASPATCH, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveSignalExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }, -) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveRequestCancelExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }, -) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType( - "DoUpdate", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }, - ), - "DESCRIPTOR": _DOUPDATE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }, -) +DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }) + , + 'DESCRIPTOR' : _DOUPDATE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperationStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }, -) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }, -) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType( - "RemoveFromCache", - (_message.Message,), - { - "DESCRIPTOR": _REMOVEFROMCACHE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }, -) +RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { + 'DESCRIPTOR' : _REMOVEFROMCACHE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" - ) - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' + _WORKFLOWACTIVATION._serialized_start=570 + _WORKFLOWACTIVATION._serialized_end=1116 + _WORKFLOWACTIVATIONJOB._serialized_start=1119 + _WORKFLOWACTIVATIONJOB._serialized_end=2582 + _DELIVERSTREAMMESSAGES._serialized_start=2585 + _DELIVERSTREAMMESSAGES._serialized_end=2724 + _INITIALIZEWORKFLOW._serialized_start=2727 + _INITIALIZEWORKFLOW._serialized_end=4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 + _FIRETIMER._serialized_start=4133 + _FIRETIMER._serialized_end=4157 + _RESOLVEACTIVITY._serialized_start=4159 + _RESOLVEACTIVITY._serialized_end=4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 + _UPDATERANDOMSEED._serialized_start=5045 + _UPDATERANDOMSEED._serialized_end=5088 + _QUERYWORKFLOW._serialized_start=5091 + _QUERYWORKFLOW._serialized_end=5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 + _CANCELWORKFLOW._serialized_start=5353 + _CANCELWORKFLOW._serialized_end=5385 + _SIGNALWORKFLOW._serialized_start=5388 + _SIGNALWORKFLOW._serialized_end=5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 + _NOTIFYHASPATCH._serialized_start=5679 + _NOTIFYHASPATCH._serialized_end=5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 + _DOUPDATE._serialized_start=5917 + _DOUPDATE._serialized_end=6248 + _DOUPDATE_HEADERSENTRY._serialized_start=4052 + _DOUPDATE_HEADERSENTRY._serialized_end=4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 + _RESOLVENEXUSOPERATION._serialized_start=6407 + _RESOLVENEXUSOPERATION._serialized_end=6496 + _REMOVEFROMCACHE._serialized_start=6499 + _REMOVEFROMCACHE._serialized_end=6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..eab815fc9 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.update.v1.message_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_messages(self) -> global___DeliverStreamMessages: + """A range of a stream the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +327,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +335,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -368,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -421,6 +431,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_messages", "remove_from_cache", ] | None @@ -1440,6 +1451,63 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 64fa8a255..ccfa1a016 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,552 +2,408 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" - +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.sdk.v1 import ( - event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, -) -from temporalio.api.sdk.v1 import ( - user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' -) - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] -_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ - "HeadersEntry" -] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ - "RequestCancelLocalActivity" -] -_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CompleteWorkflowExecution" -] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ContinueAsNewWorkflowExecution" -] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "StartChildWorkflowExecution" -] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CancelChildWorkflowExecution" -] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "RequestCancelExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "SignalExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( - _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ - "UpsertWorkflowSearchAttributes" -] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ - "NexusHeaderEntry" -] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ - "RequestCancelNexusOperation" -] -WorkflowCommand = _reflection.GeneratedProtocolMessageType( - "WorkflowCommand", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWCOMMAND, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }, -) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] +_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] +_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] +_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] +WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWCOMMAND, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }) _sym_db.RegisterMessage(WorkflowCommand) -StartTimer = _reflection.GeneratedProtocolMessageType( - "StartTimer", - (_message.Message,), - { - "DESCRIPTOR": _STARTTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }, -) +AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _ADDSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }) +_sym_db.RegisterMessage(AddStreamMessages) + +SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTREAM, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }) +_sym_db.RegisterMessage(SubscribeStream) + +StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { + 'DESCRIPTOR' : _STARTTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType( - "CancelTimer", - (_message.Message,), - { - "DESCRIPTOR": _CANCELTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }, -) +CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { + 'DESCRIPTOR' : _CANCELTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULEACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }, -) +ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleLocalActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULELOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }, -) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }, -) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelLocalActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }, -) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType( - "QueryResult", - (_message.Message,), - { - "DESCRIPTOR": _QUERYRESULT, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }, -) +QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { + 'DESCRIPTOR' : _QUERYRESULT, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType( - "QuerySuccess", - (_message.Message,), - { - "DESCRIPTOR": _QUERYSUCCESS, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }, -) +QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { + 'DESCRIPTOR' : _QUERYSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CompleteWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }, -) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "FailWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _FAILWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }, -) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ContinueAsNewWorkflowExecution", - (_message.Message,), - { - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }, - ), - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }, -) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }) + , + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }, -) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType( - "SetPatchMarker", - (_message.Message,), - { - "DESCRIPTOR": _SETPATCHMARKER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }, -) +SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { + 'DESCRIPTOR' : _SETPATCHMARKER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "StartChildWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }, - ), - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }, - ), - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }, -) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }) + , + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }) + , + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }, -) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "RequestCancelExternalWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }, -) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "SignalExternalWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }, -) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelSignalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELSIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }, -) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( - "UpsertWorkflowSearchAttributes", - (_message.Message,), - { - "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }, -) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { + 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( - "ModifyWorkflowProperties", - (_message.Message,), - { - "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }, -) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { + 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType( - "UpdateResponse", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERESPONSE, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }, -) +UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERESPONSE, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( - "ScheduleNexusOperation", - (_message.Message,), - { - "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( - "NexusHeaderEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }, - ), - "DESCRIPTOR": _SCHEDULENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }, -) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { + + 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( - "RequestCancelNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }, -) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" - ) - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8633 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8721 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4300 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4302 - _REQUESTCANCELACTIVITY._serialized_end = 4338 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4340 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4381 - _QUERYRESULT._serialized_start = 4384 - _QUERYRESULT._serialized_end = 4540 - _QUERYSUCCESS._serialized_start = 4542 - _QUERYSUCCESS._serialized_end = 4607 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4609 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4685 - _FAILWORKFLOWEXECUTION._serialized_start = 4687 - _FAILWORKFLOWEXECUTION._serialized_end = 4761 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4764 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5678 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5521 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5597 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5680 - _CANCELWORKFLOWEXECUTION._serialized_end = 5756 - _SETPATCHMARKER._serialized_start = 5758 - _SETPATCHMARKER._serialized_end = 5812 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5815 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 6989 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5521 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5597 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 6991 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7065 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7068 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7210 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7213 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7612 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7614 - _CANCELSIGNALWORKFLOW._serialized_end = 7649 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7651 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7752 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7754 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7833 - _UPDATERESPONSE._serialized_start = 7836 - _UPDATERESPONSE._serialized_end = 8046 - _SCHEDULENEXUSOPERATION._serialized_start = 8049 - _SCHEDULENEXUSOPERATION._serialized_end = 8587 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8537 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8587 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8589 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8631 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' + _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 + _WORKFLOWCOMMAND._serialized_start=556 + _WORKFLOWCOMMAND._serialized_end=2794 + _ADDSTREAMMESSAGES._serialized_start=2796 + _ADDSTREAMMESSAGES._serialized_end=2891 + _SUBSCRIBESTREAM._serialized_start=2893 + _SUBSCRIBESTREAM._serialized_end=2951 + _STARTTIMER._serialized_start=2953 + _STARTTIMER._serialized_end=3036 + _CANCELTIMER._serialized_start=3038 + _CANCELTIMER._serialized_end=3064 + _SCHEDULEACTIVITY._serialized_start=3067 + _SCHEDULEACTIVITY._serialized_end=3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 + _SCHEDULELOCALACTIVITY._serialized_start=3894 + _SCHEDULELOCALACTIVITY._serialized_end=4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 + _REQUESTCANCELACTIVITY._serialized_start=4646 + _REQUESTCANCELACTIVITY._serialized_end=4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 + _QUERYRESULT._serialized_start=4728 + _QUERYRESULT._serialized_end=4884 + _QUERYSUCCESS._serialized_start=4886 + _QUERYSUCCESS._serialized_end=4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 + _FAILWORKFLOWEXECUTION._serialized_start=5031 + _FAILWORKFLOWEXECUTION._serialized_end=5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELWORKFLOWEXECUTION._serialized_start=6024 + _CANCELWORKFLOWEXECUTION._serialized_end=6100 + _SETPATCHMARKER._serialized_start=6102 + _SETPATCHMARKER._serialized_end=6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELSIGNALWORKFLOW._serialized_start=7958 + _CANCELSIGNALWORKFLOW._serialized_end=7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 + _UPDATERESPONSE._serialized_start=8180 + _UPDATERESPONSE._serialized_end=8390 + _SCHEDULENEXUSOPERATION._serialized_start=8393 + _SCHEDULENEXUSOPERATION._serialized_end=8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 510643132..f5a5fdb97 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,6 +23,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,10 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: ... + @property + def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( self, *, @@ -215,6 +222,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... def HasField( self, @@ -243,6 +252,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -298,6 +311,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -350,6 +367,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "add_stream_messages", ] | None ): ... @@ -386,6 +405,77 @@ class StartTimer(google.protobuf.message.Message): global___StartTimer = StartTimer +class AddStreamMessages(google.protobuf.message.Message): + """Publish a batch of messages to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand messages cost the same in History as one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessages = AddStreamMessages + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index b860e3f14..3d1f82e66 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit b860e3f14f68af64bd4d0e372b3c78b2ce9ecff1 +Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 From 1b6469c941fdc7c5a66bf20c3c2af8a617478323 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 012/831] Added the vendored stream API protos. --- scripts/gen_stream_protos.py | 161 +++++ temporalio/api/stream/__init__.py | 0 temporalio/api/stream/v1/__init__.py | 11 + temporalio/api/stream/v1/message_pb2.py | 69 ++ temporalio/api/stream/v1/message_pb2.pyi | 134 ++++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 138 ++++ .../api/streamservice/v1/message_pb2.py | 46 ++ .../api/streamservice/v1/message_pb2.pyi | 47 ++ .../api/streamservice/v1/message_pb2_grpc.py | 24 + .../streamservice/v1/request_response_pb2.py | 138 ++++ .../streamservice/v1/request_response_pb2.pyi | 434 ++++++++++++ .../v1/request_response_pb2_grpc.py | 24 + .../api/streamservice/v1/service_pb2.py | 38 ++ .../api/streamservice/v1/service_pb2.pyi | 5 + .../api/streamservice/v1/service_pb2_grpc.py | 616 ++++++++++++++++++ .../api/streamservice/v1/stream_state_pb2.py | 56 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 114 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 24 + 19 files changed, 2079 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/stream/__init__.py create mode 100644 temporalio/api/stream/v1/__init__.py create mode 100644 temporalio/api/stream/v1/message_pb2.py create mode 100644 temporalio/api/stream/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..e66f8abb4 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,161 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, "-m", "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--pyi_out={out}", + f"--grpc_python_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/stream/__init__.py b/temporalio/api/stream/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py new file mode 100644 index 000000000..f76c1c334 --- /dev/null +++ b/temporalio/api/stream/v1/__init__.py @@ -0,0 +1,11 @@ +from .message_pb2 import ( + StreamCursor, + StreamMessage, + StreamSlice, +) + +__all__ = [ + "StreamCursor", + "StreamMessage", + "StreamSlice", +] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py new file mode 100644 index 000000000..da1e5bc91 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/stream/v1/message.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto\"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03\"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3') + + + +_STREAMMESSAGE = DESCRIPTOR.message_types_by_name['StreamMessage'] +_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name['MetadataEntry'] +_STREAMSLICE = DESCRIPTOR.message_types_by_name['StreamSlice'] +_STREAMCURSOR = DESCRIPTOR.message_types_by_name['StreamCursor'] +StreamMessage = _reflection.GeneratedProtocolMessageType('StreamMessage', (_message.Message,), { + + 'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), { + 'DESCRIPTOR' : _STREAMMESSAGE_METADATAENTRY, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) + }) + , + 'DESCRIPTOR' : _STREAMMESSAGE, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) + }) +_sym_db.RegisterMessage(StreamMessage) +_sym_db.RegisterMessage(StreamMessage.MetadataEntry) + +StreamSlice = _reflection.GeneratedProtocolMessageType('StreamSlice', (_message.Message,), { + 'DESCRIPTOR' : _STREAMSLICE, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }) +_sym_db.RegisterMessage(StreamSlice) + +StreamCursor = _reflection.GeneratedProtocolMessageType('StreamCursor', (_message.Message,), { + 'DESCRIPTOR' : _STREAMCURSOR, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) + }) +_sym_db.RegisterMessage(StreamCursor) + +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1' + _STREAMMESSAGE_METADATAENTRY._options = None + _STREAMMESSAGE_METADATAENTRY._serialized_options = b'8\001' + _STREAMMESSAGE._serialized_start=103 + _STREAMMESSAGE._serialized_end=357 + _STREAMMESSAGE_METADATAENTRY._serialized_start=277 + _STREAMMESSAGE_METADATAENTRY._serialized_end=357 + _STREAMSLICE._serialized_start=360 + _STREAMSLICE._serialized_end=547 + _STREAMCURSOR._serialized_start=549 + _STREAMCURSOR._serialized_end=622 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi new file mode 100644 index 000000000..c1c796da8 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -0,0 +1,134 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" +import builtins +import collections.abc +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message +import sys +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["value", b"value"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + @property + def metadata(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, temporalio.api.common.v1.message_pb2.Payload]: ... + topic: builtins.str + topic_sequence: builtins.int + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[builtins.str, temporalio.api.common.v1.message_pb2.Payload] | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["body", b"body"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["body", b"body", "metadata", b"metadata", "topic", b"topic", "topic_sequence", b"topic_sequence"]) -> None: ... + +global___StreamMessage = StreamMessage + +class StreamSlice(google.protobuf.message.Message): + """A contiguous range of a stream delivered to a Workflow Task, along with the + offsets it covers. The offsets are what History records; the messages + themselves are never written to History. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription observed nothing, + which is a fact replay has to reproduce rather than an absence of one. + """ + @property + def messages(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___StreamMessage]: ... + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event whose stream_cursors recorded this range. + Set only when the server is re-supplying a range for a task being + replayed; a slice for the task now being started leaves it unset, because + the event closing that task does not exist yet. + + Replay needs this because a Workflow Task response carries one slice set + while a cache miss replays every prior task, so the ranges have to be + matched to the events that recorded them rather than to the response. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + workflow_task_completed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "messages", b"messages", "run_id", b"run_id", "stream_id", b"stream_id", "to_offset", b"to_offset", "workflow_task_completed_event_id", b"workflow_task_completed_event_id"]) -> None: ... + +global___StreamSlice = StreamSlice + +class StreamCursor(google.protobuf.message.Message): + """The offsets a Workflow Task consumed, without the payloads. Recorded on + WorkflowTaskCompleted so History grows with Workflow Tasks rather than with + messages. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + from_offset: builtins.int + to_offset: builtins.int + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "stream_id", b"stream_id", "to_offset", b"to_offset"]) -> None: ... + +global___StreamCursor = StreamCursor diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..31f99bded --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,138 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + STREAM_MESSAGE_KIND_DATA, + STREAM_MESSAGE_KIND_FLUSH, + STREAM_MESSAGE_KIND_UNSPECIFIED, + StreamMessage, + StreamMessageBatch, + StreamMessageKind, +) + +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "STREAM_MESSAGE_KIND_DATA", + "STREAM_MESSAGE_KIND_FLUSH", + "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamLifecycle", + "StreamListEntry", + "StreamMessage", + "StreamMessageBatch", + "StreamMessageKind", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..b4fe8e68a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/message.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/message.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z None: ... + BODY_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + body: _message_pb2.Payload + metadata: _containers.MessageMap[str, _message_pb2.Payload] + topic: str + topic_sequence: int + kind: StreamMessageKind + offset: int + def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + +class StreamMessageBatch(_message.Message): + __slots__ = ("messages",) + MESSAGES_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] + def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..b1383816d --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..60dafee45 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/request_response.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/request_response.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + +class CreateStreamOutput(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class AddMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + expected_offset: int + use_expected_offset: bool + owner_epoch: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + +class AddMessagesOutput(_message.Message): + __slots__ = ("first_offset", "next_offset", "count", "deduplicated") + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] + first_offset: int + next_offset: int + count: int + deduplicated: bool + def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + +class FinishWritingInput(_message.Message): + __slots__ = ("namespace", "stream_id", "producer_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + producer_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + +class FinishWritingOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SubscribeWorkflowInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + stream_id: str + start_offset: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class SubscribeWorkflowOutput(_message.Message): + __slots__ = ("start_offset",) + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + start_offset: int + def __init__(self, start_offset: _Optional[int] = ...) -> None: ... + +class PollMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class PollMessagesOutput(_message.Message): + __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") + MESSAGES_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + next_offset: int + head_offset: int + closed: bool + close_reason: _message_pb2_1.Payload + def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class DescribeStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class PollWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class DescribeWorkflowStreamInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + +class AddWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + +class DescribeStreamOutput(_message.Message): + __slots__ = ("state",) + STATE_FIELD_NUMBER: _ClassVar[int] + state: _stream_state_pb2.StreamState + def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + +class CloseStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "reason") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + reason: _message_pb2_1.Payload + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class CloseStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TruncateStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "new_base_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + new_base_offset: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + +class TruncateStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class DeleteStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class CreateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CreateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + +class CreateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CreateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + +class AddMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + +class AddMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class FinishWritingRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: FinishWritingInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + +class FinishWritingResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: FinishWritingOutput + def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: SubscribeWorkflowInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: SubscribeWorkflowOutput + def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + +class PollMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + +class PollMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeWorkflowStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class CloseStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CloseStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + +class CloseStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CloseStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + +class TruncateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: TruncateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + +class TruncateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: TruncateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + +class ListStreamsInput(_message.Message): + __slots__ = ("namespace", "page_size", "next_page_token", "query") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + namespace: str + page_size: int + next_page_token: bytes + query: str + def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + +class StreamListEntry(_message.Message): + __slots__ = ("stream_id", "run_id") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + stream_id: str + run_id: str + def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + +class ListStreamsOutput(_message.Message): + __slots__ = ("streams", "next_page_token") + STREAMS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] + next_page_token: bytes + def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + +class ListStreamsRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: ListStreamsInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + +class ListStreamsResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: ListStreamsOutput + def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + +class DeleteStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DeleteStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + +class DeleteStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DeleteStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..87cc91022 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..7f376c28e --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class StreamServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True) + self.AddMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True) + self.FinishWriting = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True) + self.SubscribeWorkflow = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True) + self.PollMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True) + self.DescribeStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True) + self.PollWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True) + self.DescribeWorkflowStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True) + self.AddWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True) + self.CloseStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True) + self.TruncateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True) + self.ListStreams = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True) + self.DeleteStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True) + + +class StreamServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def CreateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinishWriting(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeWorkflow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollWorkflowMessages(self, request, context): + """Routed on the owner, because the stream it reads has no id of its own. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeWorkflowStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkflowMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TruncateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListStreams(self, request, context): + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_StreamServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateStream': grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + 'AddMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + 'FinishWriting': grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + 'PollMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + 'DescribeStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + 'CloseStream': grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + 'TruncateStream': grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + 'ListStreams': grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + 'DeleteStream': grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class StreamService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinishWriting(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeWorkflow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeWorkflowStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CloseStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def TruncateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListStreams(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..234fa94d0 --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/stream_state.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/stream_state.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z None: ... + class ConsumersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ConsumerCursor + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCERS_FIELD_NUMBER: _ClassVar[int] + CONSUMERS_FIELD_NUMBER: _ClassVar[int] + LIFECYCLE_FIELD_NUMBER: _ClassVar[int] + REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] + head_offset: int + base_offset: int + last_txn_id: int + closed: bool + close_reason: _message_pb2.Payload + owner_epoch: int + bucket_size: int + collection_id: str + producers: _containers.MessageMap[str, ProducerCursor] + consumers: _containers.MessageMap[str, ConsumerCursor] + lifecycle: StreamLifecycle + redirect_run_id: str + close_time: _timestamp_pb2.Timestamp + def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProducerCursor(_message.Message): + __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") + SEQ_FIELD_NUMBER: _ClassVar[int] + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] + FENCED_FIELD_NUMBER: _ClassVar[int] + seq: int + first_offset: int + count: int + content_hash: bytes + fenced: bool + def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + +class ConsumerCursor(_message.Message): + __slots__ = ("workflow_id", "run_id", "offset", "active", "external") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + run_id: str + offset: int + active: bool + external: bool + def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + +class WorkflowStreamCursor(_message.Message): + __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + PENDING_FROM_FIELD_NUMBER: _ClassVar[int] + PENDING_TO_FIELD_NUMBER: _ClassVar[int] + HAS_PENDING_FIELD_NUMBER: _ClassVar[int] + stream_id: str + collection_id: str + bucket_size: int + offset: int + known_head: int + external: bool + pending_from: int + pending_to: int + has_pending: bool + def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + +class StreamLifecycle(_message.Message): + __slots__ = ("retention", "max_items") + RETENTION_FIELD_NUMBER: _ClassVar[int] + MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] + retention: _duration_pb2.Duration + max_items: int + def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..4e128a2aa --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) From a255969b0d628032856954aabbb5b35b703e5966 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 013/831] Added the stream client and the workflow stream surface. --- temporalio/client_stream.py | 476 +++++++++++++++++++++++ temporalio/worker/_workflow_instance.py | 142 +++++++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 119 ++++++ tests/test_client_stream.py | 128 ++++++ tests/worker/test_workflow_stream.py | 113 ++++++ tests/worker/test_workflow_stream_e2e.py | 244 ++++++++++++ 7 files changed, 1232 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py create mode 100644 tests/worker/test_workflow_stream.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..75388c9c9 --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,476 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` + instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, AsyncIterator, Optional, Sequence + +import google.protobuf.duration_pb2 + +import temporalio.api.common.v1 +import temporalio.api.streamservice.v1 as stream +from temporalio.api.streamservice.v1 import service_pb2_grpc + +__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] + + +@dataclass(frozen=True) +class Message: + """One item read from a stream. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back messages whose offsets are not contiguous. To resume at the + boundary of a whole read, checkpoint the ``next_offset`` that + :meth:`StreamHandle.read` returns instead. + """ + + data: bytes + topic: str = "" + offset: int = 0 + """Where this message sits in the whole stream. + + A topic filter leaves gaps, so a reader that resumes between messages has + to take this rather than count what it received. + """ + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. + """ + + messages: list[Message] + next_offset: int + head_offset: int + closed: bool + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + self._stub = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> "StreamClient": + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + try: + import grpc + except ImportError as err: + raise RuntimeError( + "temporalio.client_stream requires the grpc extra: " + "pip install 'temporalio[grpc]'" + ) from err + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: Optional[float] = None, + max_items: Optional[int] = None, + ) -> "StreamHandle": + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many messages remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await self._stub.CreateStream( + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ) + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> "StreamHandle": + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "" + ) -> "WorkflowStreamHandle": + """Open a stream a workflow publishes to. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.add_stream_messages`` writes to when it is given none. + + The stream is created by the workflow's first publish. Reading one that + does not exist yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when the + workflow publishes. + """ + return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + + +class StreamHandle: + """A handle to one stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append messages and return the offset the first one landed at. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice. Without them the append is at-least-once, which is + only the right trade when duplicates are harmless. + """ + response = await self._stub.AddMessages( + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, returning the messages and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=offset, + topics=list(topics), + wait_new_messages=True, + ) + ) + ) + out = response.frontend_response + for msg in out.messages: + yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) + offset = out.next_offset + if out.closed and offset >= out.head_offset: + return + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await self._stub.FinishWriting( + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ) + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await self._stub.CloseStream( + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await self._stub.DescribeStream( + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow publishes to. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, stub: Any, namespace: str, workflow_id: str, name: str = "" + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await self._stub.AddWorkflowMessages( + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for msg in page.messages: + yield msg + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_messages: int = 0, + wait: bool = True, + ) -> "Page": + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + """ + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return Page( + messages=[ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await self._stub.DescribeWorkflowStream( + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + ) + ) + ) + return response.frontend_response.state diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 69b416f26..7dd61a11c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -262,6 +263,71 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# which would replay and re-issue the same rejected command forever, into an +# error the workflow author can see. +_MAX_STREAM_MESSAGES_PER_BATCH = 1000 + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self) -> None: + self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._waiters: list[asyncio.Future] = [] + + def extend( + self, + messages: Sequence[temporalio.api.stream.v1.StreamMessage], + from_offset: int = 0, + ) -> None: + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not messages: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-message field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + self._messages.extend( + temporalio.workflow.DeliveredStreamMessage( + body=message.body.data, + topic=message.topic, + offset=from_offset + index, + ) + for index, message in enumerate(messages) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: + taken, self._messages = self._messages, [] + return taken + + def put_back( + self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._messages[:0] = messages + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._messages) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -389,6 +455,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -604,6 +675,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_messages"): + self._apply_deliver_stream_messages(job.deliver_stream_messages) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1129,6 +1202,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_messages( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer() + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.messages, job.from_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1293,6 +1379,62 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. The + # server treats a repeat subscription to the same stream as a no-op. + self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: + if not messages: + raise ValueError("add_stream_messages needs at least one message") + if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " + f"got {len(messages)}" + ) + command = self._add_command() + command.add_stream_messages.stream_id = stream_id + for body in messages: + # The bodies ride the command and never enter History, so the event + # this produces stays the same size whatever is published here. + message = command.add_stream_messages.messages.add() + message.body.data = body + # Every other Temporal payload names its encoding, and the UI, the + # CLI and any codec server rely on that to decode what they read. + message.body.metadata["encoding"] = b"binary/plain" + message.topic = topic + + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: + return [ + m.body + for m in await self.workflow_read_stream_messages(stream_id, max_messages) + ] + + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[temporalio.workflow.DeliveredStreamMessage]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_messages and len(taken) > max_messages: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_messages:]) + taken = taken[:max_messages] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..9189b0db6 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -95,6 +95,11 @@ upsert_search_attributes, uuid4, uuid7, + DeliveredStreamMessage, + read_stream, + read_stream_messages, + add_stream_messages, + subscribe_stream, wait_condition, ) from ._definition import ( @@ -227,6 +232,11 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamMessage", + "read_stream", + "read_stream_messages", + "add_stream_messages", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..423d77d01 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -312,6 +312,24 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: ... + + @abstractmethod + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: ... + + @abstractmethod + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[DeliveredStreamMessage]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -945,6 +963,107 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream` returns them. Safe to call again: the server treats + a second subscription to the same stream as a no-op, which is what makes + calling it on every replay harmless. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. + + Args: + stream_id: Stream to consume. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def add_stream_messages( + messages: Sequence[bytes], + *, + stream_id: str = "", + topic: str = "", +) -> None: + """Publish a batch of messages to a stream this workflow owns. + + Returns as soon as the command is issued. The bodies go to the stream's own + log rather than into History, which gets one fixed-size event naming the + offset range, so a batch of a thousand costs History the same as a batch of + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Batch where you can. The event is per call, and a workflow is bounded by the + history event count, so one call with a hundred messages leaves far more + room than a hundred calls with one. + + Args: + messages: Bodies to append, in order. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + topic: Optional topic, which readers can filter on. Offsets are still + assigned over the unfiltered stream. + """ + _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + + +@dataclass(frozen=True) +class DeliveredStreamMessage: + """One message a consuming workflow was given, with where it sat.""" + + body: bytes + topic: str + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_messages( + stream_id: str, *, max_messages: int = 0 +) -> list[DeliveredStreamMessage]: + """Read the next messages, keeping their topic and position. + + Same delivery as :func:`read_stream`. A reader that has to name where it + got to, filter a topic, or hand a position to something outside the + workflow needs more than the bodies. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_messages( + stream_id, max_messages + ) + + +async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: + """Read the next messages of a stream this workflow consumes. + + Waits until at least one message is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. + + Subscribe out of band with the stream client. This only reads what has + already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + + Returns: + The message bodies, in stream order. + """ + return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..f7df3c7a7 --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,128 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import AsyncIterator + +import pytest + +from temporalio.client_stream import StreamClient, StreamHandle + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +@pytest.fixture +async def stream() -> AsyncIterator[StreamHandle]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + finally: + await client.close() + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + assert await stream.append(b"alpha", b"beta") == 0 + assert await stream.append(b"gamma") == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(b"alpha", b"beta", b"gamma") + + messages, next_offset = await stream.read() + assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + assert next_offset == 3 + + messages, next_offset = await stream.read(from_offset=1) + assert [m.data for m in messages] == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(b"alpha") + + messages, next_offset = await stream.read(from_offset=1) + assert messages == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same message twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(b"once", producer_id="p1", sequence=1) + retry = await stream.append(b"once", producer_id="p1", sequence=1) + assert first == retry == 0 + + messages, _ = await stream.read() + assert [m.data for m in messages] == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(b"tok", topic="tokens") + await stream.append(b"prog", topic="progress") + await stream.append(b"tok2", topic="tokens") + + messages, next_offset = await stream.read(topics=["tokens"]) + assert [m.data for m in messages] == [b"tok", b"tok2"] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for message in stream.follow(): + received.append(message.data) + + task = asyncio.create_task(follower()) + await stream.append(b"one") + await asyncio.sleep(0.2) + await stream.append(b"two") + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(b"one", b"two") + await stream.close() + + received = [m.data async for m in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(b"one", b"two") + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..944761cfa --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,113 @@ +"""In-workflow consumption of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering and the workflow-facing read directly, which is the part +this SDK owns; the delivery decision itself lives in the server and sdk-core. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.worker._workflow_instance import ( + _StreamBuffer, + _WorkflowInstanceImpl, +) + + +def message(body: bytes) -> api_stream.StreamMessage: + return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"one"), message(b"two")]) + + assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([message(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert [m.body.data for m in buffer.take()] == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert [m.body.data for m in buffer.take()] == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream``, so a test that reimplements + it proves nothing about the code that ships. + """ + + def __init__(self) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self.read_only_calls: list[str] = [] + + def _assert_not_read_only(self, action: str) -> None: + self.read_only_calls.append(action) + + +@pytest.mark.parametrize("max_messages", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: + stub = _ReadOnlyStub() + bodies = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b) for b in bodies]) + + got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + + assert got == bodies[:max_messages] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + + if len(stub._stream_buffers["s"]): + rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert got + rest == bodies + else: + assert got == bodies + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub() + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b"a")]) + + await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..579327217 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,244 @@ +"""A workflow publishing to a stream it owns and reading its own messages back. + +Path A and Path C together, both from workflow code. Needs a Temporal server +built from the AI-198 branch, because neither the stream service nor the +commands exist on a released one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest +from temporalio.api.enums.v1 import EventType + +from temporalio import workflow +from temporalio.client import Client +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +STREAM = "output" + +# Event type numbers rather than names: this SDK's api protos predate both +# events, so the attributes arrive as unknown fields and only the type is +# readable here. The server's own tests are where the offsets are asserted. +EVENT_STREAM_SUBSCRIBED = 61 +EVENT_STREAM_MESSAGES_ADDED = 62 + + +@workflow.defn +class PublishAndRead: + @workflow.run + async def run(self) -> list[str]: + # Published before subscribing, because a subscription resolves against + # the streams the workflow already owns and this is what creates one. + workflow.add_stream_messages( + [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + ) + workflow.add_stream_messages([b"delta"], stream_id=STREAM) + + workflow.subscribe_stream(STREAM, start_offset=0) + + received: list[str] = [] + while len(received) < 4: + for body in await workflow.read_stream(STREAM): + received.append(body.decode()) + return received + + +async def test_workflow_reads_back_what_it_published() -> None: + client = await Client.connect(TARGET or "") + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=wf_id, task_queue=task_queue + ), + timeout=60, + ) + + assert result == ["alpha", "beta", "gamma", "delta"] + + counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + + # Two calls carrying four messages, so two events: the event is per batch, + # which is what makes batching free. + assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class PublishOnSignal: + """Publishes a token per signal, which is the shape an agent turn has.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + self._done = False + + @workflow.run + async def run(self) -> int: + published = 0 + while True: + await workflow.wait_condition(lambda: self._pending or self._done) + while self._pending: + workflow.add_stream_messages([self._pending.pop(0).encode()]) + published += 1 + if self._done: + return published + + @workflow.signal + async def emit(self, token: str) -> None: + self._pending.append(token) + + @workflow.signal + async def finish(self) -> None: + self._done = True + + +async def test_a_client_follows_what_a_workflow_publishes() -> None: + """The harness shape: the workflow writes, something outside it reads live. + + A stream a workflow owns has no id, so the reader addresses it by the + owner. It also attaches before the first publish, which is what a UI opening + on a session does. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "follow-tq-" + uuid.uuid4().hex[:8] + wf_id = "follow-wf-" + uuid.uuid4().hex[:8] + + tokens = [f"token-{i}" for i in range(5)] + received: list[str] = [] + + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishOnSignal], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + PublishOnSignal.run, id=wf_id, task_queue=task_queue + ) + + # Attached before anything is published, so the stream does not + # exist yet and the first poll has to park rather than fail. + reader = streams.workflow_stream(wf_id) + assert (await reader.describe()).head_offset == 0 + + async def follow() -> None: + async for message in reader.follow(): + received.append(message.data.decode()) + if len(received) == len(tokens): + return + + following = asyncio.ensure_future(follow()) + for token in tokens: + await handle.signal(PublishOnSignal.emit, token) + await asyncio.wait_for(following, timeout=60) + + await handle.signal(PublishOnSignal.finish) + assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) + finally: + await streams.close() + + assert received == tokens + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each `read_stream` that finds nothing + blocks, which ends a Workflow Task, so the run spans several. With the + cache on, every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for body in await workflow.read_stream(stream_id): + seen.append(body.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + Every other end-to-end test here disables it, so the sticky path was never + exercised. The server sends no replay slice for a sticky task, while the + sticky history still carries the previous task's consumed range, and the + two together used to fail every task after the first consumed range. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, + task_queue=task_queue, + workflows=[ConsumeAcrossTasks], + # Left at the default deliberately. This is what the test is for. + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=wf_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append(*[t.encode() for t in batch]) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + # More than one Workflow Task ran, otherwise the test proves nothing. + completed = 0 + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: + completed += 1 + assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + finally: + await streams.close() From 1f2a743a2f58413d22d7b6ef26bd6215af30507a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 014/831] Added the Workflow Streams surface over a server-side stream. --- temporalio/contrib/server_streams/__init__.py | 397 ++++++++++++++++++ tests/contrib/test_server_streams.py | 154 +++++++ 2 files changed, 551 insertions(+) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..e831d763c --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,397 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per batch rather than a +Signal per batch. A consumer reads the log directly rather than long-polling an +Update, so there is no per-Workflow limit on how many can read at once, and a +closed Workflow stays readable until its stream's retention expires. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, Optional, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.converter import DataConverter, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still encoded. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + """ + + items: list["WorkflowStreamItem[bytes]"] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _encode(converter: PayloadConverter, value: Any) -> bytes: + """Serialize one value to a stream message body. + + The payload rather than the bare bytes, so the encoding metadata the + consumer needs to decode into a type travels with it. + + The codec chain is not applied. It cannot be applied here: a codec is async + and a Workflow publishing to a stream is not, so running one inside Workflow + code would be I/O on the Workflow thread. Regular payloads solve this in the + Worker, encoding on the way out and decoding on the way in, and a stream + needs the same plumbing before a codec can be honoured. + + It is not applied on the client path either, deliberately. Encoding one side + and not the other is worse than encoding neither: an Activity's messages + would reach a consuming Workflow as ciphertext it has no way to decode. + :func:`_reject_configured_codec` is what keeps that from happening quietly. + """ + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies bypass the codec chain, so proceeding would write payloads + this namespace expects to be encrypted in the clear, and would do it + silently. Raising is the only honest answer until the Worker-side plumbing + exists. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it. Publishing would store them " + "unencoded. Use a client without a codec, or wait for codec support " + "on streams." + ) + + +def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns as soon as the Command is issued. There is nothing to await: + the append is applied in the Workflow Task's own commit, so it costs + this Workflow no round trip and no extra transition. + """ + workflow.add_stream_messages( + [_encode(workflow.payload_converter(), value)], topic=self._name + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic( + self, name: str, *, type: type = object + ) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`.""" + self._handle = handle + self._converter = converter + self._batch_interval = batch_interval + self._buffered: list[tuple[str, Any]] = [] + self._flusher: Optional[asyncio.Task[None]] = None + self._wake = asyncio.Event() + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> "WorkflowStreamClient": + """Open the stream owned by ``workflow_id``.""" + _reject_configured_codec(client) + return cls( + _stream_client(client).workflow_stream(workflow_id), + client.data_converter.payload_converter, + batch_interval, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> "WorkflowStreamClient": + """Open the stream owned by the Workflow that scheduled this Activity.""" + client = activity.client() + return cls.create( + client, activity.info().workflow_id, batch_interval=batch_interval + ) + + async def __aenter__(self) -> "WorkflowStreamClient": + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. + """ + if self._flusher is not None: + self._flusher.cancel() + try: + await self._flusher + except asyncio.CancelledError: + pass + self._flusher = None + await self.flush() + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + async for message in self._handle.follow(from_offset=from_offset, topics=topics): + yield WorkflowStreamItem( + topic=message.topic, + data=_decode(self._converter, message.data, result_type), + offset=message.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> "RawPage": + """One read, with the bodies left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) + for m in page.messages + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + # One append per topic, because a batch carries a single topic. The + # harness case is one topic, so this is one append. + by_topic: dict[str, list[bytes]] = {} + for topic, value in pending: + by_topic.setdefault(topic, []).append(_encode(self._converter, value)) + for topic, bodies in by_topic.items(): + await self._handle.append(*bodies, topic=topic) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while True: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + +# One channel per target, shared by every handle in the process. The channel is +# multiplexed and long-lived, and callers here open a client per subscription, +# which would otherwise be a connection per subscription. +_clients: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop too: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _clients.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _clients[key] = existing + return existing diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..33d86d827 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,154 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow( + Emitting.run, 3, id=wf_id, task_queue=task_queue + ) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] From 16c703563af8217b2ccd5a228d6104952f072212 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:57:03 -0700 Subject: [PATCH 015/831] Added the native provider module. --- temporalio/streams/providers/native.py | 398 +++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 temporalio/streams/providers/native.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..f5570b05a --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,398 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server. A workflow publishes with a command that +the server applies in the same transaction that accepts the workflow task, and +consumes ranges the server attaches to the workflow task it dispatches. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_STATE = "__temporal_streams_state" + + +class _Fanout: + """One server subscription, shared by every reader of that stream. + + The server sends a range once. Whoever reads it first would otherwise take + it from the others, so the pull happens here and the result goes to all + live readers. + """ + + def __init__(self, stream: str) -> None: + self._stream = stream + self._subscribers: list[list[tuple[Cursor, bytes]]] = [] + self._pull: asyncio.Future[None] | None = None + + def attach(self) -> list[tuple[Cursor, bytes]]: + queue: list[tuple[Cursor, bytes]] = [] + self._subscribers.append(queue) + return queue + + def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: + if queue in self._subscribers: + self._subscribers.remove(queue) + + async def next_batch( + self, queue: list[tuple[Cursor, bytes]] + ) -> list[tuple[Cursor, bytes]]: + while not queue: + pending = self._pull + if pending is None: + pending = self._pull = asyncio.ensure_future(self._run_pull()) + # Shielded because one reader going away must not cancel a range + # the server will not send again. + await asyncio.shield(pending) + batch, queue[:] = list(queue), [] + return batch + + async def _run_pull(self) -> None: + try: + delivered = await workflow.read_stream_messages(self._stream) + arrived = [ + (Cursor(str(message.offset)), message.body) for message in delivered + ] + for queue in self._subscribers: + queue.extend(arrived) + finally: + self._pull = None + + +def _fanouts() -> dict[str, _Fanout]: + instance = workflow.instance() + state = getattr(instance, _RUN_STATE, None) + if state is None: + state = {} + setattr(instance, _RUN_STATE, state) + return state + + +class _NativeReadSource: + def __init__(self, fanout: _Fanout) -> None: + self._fanout = fanout + self._queue = fanout.attach() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + return await self._fanout.next_batch(self._queue) + + def close(self) -> None: + self._fanout.detach(self._queue) + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Nothing is awaited. The server applies the payload when it accepts + # the task, so there is no back pressure to wait on and no round trip + # to pay for. The signature is awaitable because the contract allows a + # provider that does hold a publisher back. + workflow.add_stream_messages([frame], stream_id="", topic=self._topic) + + +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The server-side id of a workflow's inbound stream. + + A workflow names its streams relative to itself, so every provider can + address the same thing without workflow code knowing how it is stored. + Here that is a namespace-level stream id built from the pair, and the + workflow id rather than the run id because the stream has to survive + continue-as-new and reset. + """ + return f"{workflow_id}:{stream}" + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies do not pass through the codec chain on this provider, so + proceeding would store in the clear what the namespace expects encrypted, + and would do it without saying so. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it" + ) + + +# Streams this process has already opened, so a second producer for the same +# stream reuses the handle rather than asking the server to create it again. +# The second create is answered correctly, and it is still a failed call the +# server logs, which is noise an operator has to learn to ignore. +_handles: dict[str, Any] = {} + + +# One channel per target and namespace, shared by every handle in the process. +# A channel is multiplexed and long lived, and callers open a handle per +# subscription, which would otherwise be a connection per subscription. +_channels: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _channels.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _channels[key] = existing + return existing + + +class NativeProducer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + handle: Any, + converter: Any, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + self._handle = handle + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _provider_id(self) -> str: + """The identity the provider dedupes on. + + The attempt is part of it. Deduplication answers "is this the same + append again", and a second attempt writing different words at the same + sequence is not. Folding the attempt in keeps a retried append idempotent + without letting a new generation be swallowed as a duplicate of the old + one. + """ + return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = await self._handle.append( + *frames, + topic=self._topic, + producer_id=self._provider_id, + # The provider dedupes a retried append on this pair, which is a + # different job from telling readers that a new generation started. + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._handle.append( + frame, + topic=self._topic, + producer_id=self._provider_id, + sequence=self._sequence - 1, + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class NativeConsumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, handle: Any, converter: Any) -> None: + self._handle = handle + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + attempts = AttemptTracker() + async for message in self._handle.follow( + from_offset=int(start.token) if start.token else 0 + ): + cursor = Cursor(str(message.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + message.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NativeProvider: + name = "native" + + def configure(self, **options: Any) -> None: + """Nothing to name: the streams are on the server the client is + already connected to. It exists so a process that switches providers + changes one call rather than its structure.""" + if options: + raise TypeError( + f"the native provider takes no options, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Accepted and ignored. Delivery arrives on workflow tasks the server + # dispatches, so no worker is held between records and there is nothing + # for an idle timeout to release. + del idle_timeout + stream_id = inbound_stream_id(workflow.info().workflow_id, stream) + fanouts = _fanouts() + fanout = fanouts.get(stream_id) + if fanout is None: + workflow.subscribe_stream( + stream_id, start_offset=int(start.token) if start.token else 0 + ) + fanout = fanouts[stream_id] = _Fanout(stream_id) + return _NativeReadSource(fanout) + + def open_write(self, topic: str) -> WriteSink: + return _NativeWriteSink(topic) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + _reject_configured_codec(client) + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + streams = _stream_client(client) + stream_id = inbound_stream_id(workflow_id, stream) + handle = _handles.get(stream_id) + if handle is None: + try: + handle = await streams.create(stream_id) + except Exception: + # Created by whoever set the stream up. A producer opening a + # stream it does not own is the ordinary case, not the + # exception. + handle = streams.get(stream_id) + _handles[stream_id] = handle + return NativeProducer( + handle, + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> NativeConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. Naming one reads that inbound + stream instead, which is how a second consumer follows the same input. + """ + _reject_configured_codec(client) + streams = _stream_client(client) + if stream: + handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + else: + handle = streams.workflow_stream(workflow_id) + return NativeConsumer(handle, client.data_converter.payload_converter) + + +_provider.register("native", _NativeProvider) From f06271eb6682884d3e2b5f9aae2a9a0ea0b811a0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 016/831] Added the temporalio.streams interface with a provider registry. --- temporalio/streams/__init__.py | 20 ++- temporalio/streams/_provider.py | 216 +++++++++++++++++++++++ temporalio/streams/providers/__init__.py | 19 ++ 3 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 temporalio/streams/_provider.py create mode 100644 temporalio/streams/providers/__init__.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 14fcd4e41..a25c2bdca 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -21,7 +21,7 @@ 5. **A workflow names its streams relative to itself, and the provider resolves them.** ``reader("inputs")`` is this workflow's inbound stream called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One - provider stores that as a namespace-level stream id and the other as a name + provider stores that as a namespace-level stream id and another as a name under the run's chain key, and workflow code does not have to know which. The provider itself is chosen when the worker is built. @@ -40,9 +40,9 @@ be withdrawn, or that a stream outlives the retention its provider is configured for. -Prototype support for AI-198. The public names are the proposal; the module -behind them (``_binding``) is the only file that differs between the -server-side and the client-side implementation. +Prototype support for AI-198. The public names are the proposal; providers +live under :mod:`temporalio.streams.providers`, one module each, registered +by name and chosen by :func:`configure`. Everything else is shared. """ from __future__ import annotations @@ -50,9 +50,11 @@ from datetime import timedelta from typing import Any, TypeVar -from temporalio.streams._binding import ( +from temporalio.streams._handles import ReadSource, StreamReader, StreamWriter, WriteSink +from temporalio.streams._provider import ( Consumer, Producer, + StreamProvider, configure, consumer, open_read, @@ -60,7 +62,6 @@ producer, worker_options, ) -from temporalio.streams._handles import ReadSource, StreamReader, StreamWriter, WriteSink from temporalio.streams._record import ( BEGINNING, Cursor, @@ -76,6 +77,7 @@ "Producer", "ReadSource", "RecordKind", + "StreamProvider", "StreamReader", "StreamRecord", "StreamWriter", @@ -133,3 +135,9 @@ def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: """ del type return StreamWriter(open_write(topic), topic) + + +# Importing the package registers every provider whose dependencies are +# present in this tree. Import order matters: the registry above must exist +# before a provider module can register with it. +from temporalio.streams import providers as _providers # noqa: E402,F401 diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py new file mode 100644 index 000000000..58282cc55 --- /dev/null +++ b/temporalio/streams/_provider.py @@ -0,0 +1,216 @@ +"""The provider registry: where a process names its stream provider. + +A provider only moves bytes. The handles, records, framing and supersession +around it are shared, so every provider module is small: it implements +:class:`StreamProvider` and registers a factory under a short name when it is +imported. One :func:`configure` call decides which factory serves this +process; when exactly one provider is registered, it is the default and the +call can be omitted. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any, Callable, Protocol + +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, StreamRecord + +__all__ = [ + "Consumer", + "Producer", + "StreamProvider", + "configure", + "consumer", + "open_read", + "open_write", + "producer", + "register", + "registered", + "worker_options", +] + + +class Producer(Protocol): + """Appends to a stream from outside workflow code. + + Every append is visible as soon as the provider accepts it, and carries + the producer id, attempt and sequence that let a reader tell a retried + append from a new generation. + """ + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + ... + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + ... + + async def finish(self) -> None: + """Declare this producer's output complete.""" + ... + + +class Consumer(Protocol): + """Reads a stream from outside workflow code, resumably.""" + + def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive.""" + ... + + +class StreamProvider(Protocol): + """What a provider module implements. + + The workflow-side pair (:meth:`open_read`, :meth:`open_write`) runs inside + workflow code and must keep the contract's first two rules: publishes + commit with the workflow task, and reads are recorded observations. The + outside pair (:meth:`producer`, :meth:`consumer`) runs anywhere and moves + framed bytes. A transport-only provider may serve just the outside pair + and raise on the workflow side, naming the provider a worker should use. + """ + + name: str + + def configure(self, **options: Any) -> None: + """Accept this provider's process-level options.""" + ... + + def worker_options(self) -> dict[str, Any]: + """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + ... + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + """Subscribe the running workflow to its inbound stream ``stream``.""" + ... + + def open_write(self, topic: str) -> WriteSink: + """Bind ``topic`` on the stream the running workflow owns.""" + ... + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> Producer: + """Open a producer for ``workflow_id``'s inbound stream ``stream``.""" + ... + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> Consumer: + """Open a reader for what ``workflow_id`` publishes.""" + ... + + +_factories: dict[str, Callable[[], StreamProvider]] = {} +_active: StreamProvider | None = None + + +def register(name: str, factory: Callable[[], StreamProvider]) -> None: + """Make ``factory`` selectable as ``configure(provider=name)``.""" + _factories[name] = factory + + +def registered() -> list[str]: + """The provider names this process can configure.""" + return sorted(_factories) + + +def _make(name: str | None) -> StreamProvider: + if name is None: + if len(_factories) == 1: + name = next(iter(_factories)) + else: + raise RuntimeError( + "name a provider: configure(provider=...) with one of " + f"{registered()}" + ) + factory = _factories.get(name) + if factory is None: + raise RuntimeError( + f"no stream provider {name!r} is registered; available: {registered()}" + ) + return factory() + + +def configure(provider: str | None = None, **options: Any) -> None: + """Name the provider for this process and hand it its options. + + ``provider`` may be omitted when exactly one provider is registered. + """ + global _active + chosen = _make(provider) + chosen.configure(**options) + _active = chosen + + +def _current() -> StreamProvider: + global _active + if _active is None: + chosen = _make(None) + chosen.configure() + _active = chosen + return _active + + +def worker_options() -> dict[str, Any]: + """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + return _current().worker_options() + + +def open_read( + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, +) -> ReadSource: + """Subscribe the running workflow to its inbound stream ``stream``.""" + return _current().open_read(stream, start=start, idle_timeout=idle_timeout) + + +def open_write(topic: str) -> WriteSink: + """Bind ``topic`` on the stream the running workflow owns.""" + return _current().open_write(topic) + + +async def producer( + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, +) -> Producer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``.""" + return await _current().producer( + client, + workflow_id=workflow_id, + stream=stream, + producer_id=producer_id, + attempt=attempt, + ) + + +async def consumer(client: Any, *, workflow_id: str, stream: str = "") -> Consumer: + """Open a reader for what ``workflow_id`` publishes.""" + return await _current().consumer(client, workflow_id=workflow_id, stream=stream) diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py new file mode 100644 index 000000000..dff94b250 --- /dev/null +++ b/temporalio/streams/providers/__init__.py @@ -0,0 +1,19 @@ +"""Stream providers, one module each. + +Importing this package registers every provider whose dependencies are +present. A tree that lacks a provider's dependencies simply does not offer +that name; nothing else changes, because everything above the provider is +shared. +""" + +from __future__ import annotations + +_KNOWN = ("memory", "workflow_streams", "native", "redis", "nexus") + +for _name in _KNOWN: + try: + __import__(f"{__name__}.{_name}") + except ImportError: + # This tree does not carry that provider. The registry error message + # lists what is actually available. + pass From 3dd101f06028fdb9080a28a3d10d9f386423f1c7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 017/831] Added the in-memory reference provider and the conformance tests. --- temporalio/streams/providers/memory.py | 315 ++++++++++++++++++++++ tests/streams/__init__.py | 0 tests/streams/test_streams_conformance.py | 164 +++++++++++ 3 files changed, 479 insertions(+) create mode 100644 temporalio/streams/providers/memory.py create mode 100644 tests/streams/__init__.py create mode 100644 tests/streams/test_streams_conformance.py diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py new file mode 100644 index 000000000..808a84f13 --- /dev/null +++ b/temporalio/streams/providers/memory.py @@ -0,0 +1,315 @@ +"""The in-process reference provider. + +Exists so the conformance suite can exercise the whole surface without a +store, and to document in one file what a provider owes. Two honest limits, +both stated so nobody mistakes this for evidence: + +- It is not replay-safe. Workflow-side state lives in plain process memory, + so run it with a warm workflow cache and do not use it to demonstrate + recovery. +- A workflow's publish becomes visible at ``publish`` time rather than at + task acceptance, so it only approximates rule 1 of the contract. + +The outside surface (producer, consumer, dedupe, supersession, cursors) is +faithful, which is what the conformance tests lean on. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import temporalio.converter +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_DEFAULT_POLL = timedelta(milliseconds=100) + + +class _MemoryStream: + def __init__(self) -> None: + self.frames: list[bytes] = [] + # Dedupe identity is (producer#attempt, first sequence of the append), + # the same pair the storage providers use. + self.seen: dict[tuple[str, int], int] = {} + self._arrival = asyncio.Event() + + def append(self, frames: list[bytes], *, producer_id: str, sequence: int) -> int: + key = (producer_id, sequence) + already = self.seen.get(key) + if already is not None: + return already + offset = len(self.frames) + self.frames.extend(frames) + self.seen[key] = offset + arrival, self._arrival = self._arrival, asyncio.Event() + arrival.set() + return offset + + async def wait_past(self, offset: int) -> None: + while len(self.frames) <= offset: + await self._arrival.wait() + + +_streams: dict[str, _MemoryStream] = {} + + +def _stream(stream_id: str) -> _MemoryStream: + found = _streams.get(stream_id) + if found is None: + found = _streams[stream_id] = _MemoryStream() + return found + + +def reset() -> None: + """Drop every stream. For tests.""" + _streams.clear() + + +def _inbound_id(workflow_id: str, stream: str) -> str: + return f"{workflow_id}:{stream}" if stream else workflow_id + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +class _MemReadSource: + """Workflow-side read that wakes by polling a timer. + + A real provider wakes the workflow by delivering; polling is the price of + having no delivery path, and it is why this provider is for tests. + """ + + def __init__(self, store: _MemoryStream, start: int, poll: timedelta) -> None: + self._store = store + self._cursor = start + self._poll = poll + self._closed = False + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while not self._closed: + frames = self._store.frames + if len(frames) > self._cursor: + batch = [ + (Cursor(str(offset)), frames[offset]) + for offset in range(self._cursor, len(frames)) + ] + self._cursor = len(frames) + return batch + await workflow.sleep(self._poll) + raise StopAsyncIteration + + def close(self) -> None: + self._closed = True + + +class _MemWriteSink: + def __init__(self, store: _MemoryStream, topic: str) -> None: + self._store = store + self._topic = topic + self._sequence = 0 + + async def publish(self, frame: bytes) -> None: + self._store.append( + [frame], + producer_id=f"__workflow__:{self._topic}", + sequence=self._sequence, + ) + self._sequence += 1 + + +class MemoryProducer: + """The outside producer, faithful to the contract.""" + + def __init__( + self, store: _MemoryStream, converter: Any, topic: str, producer_id: str, attempt: int + ) -> None: + self._store = store + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = self._store.append( + frames, + producer_id=self._provider_id, + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + self._store.append( + [frame], producer_id=self._provider_id, sequence=self._sequence - 1 + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class MemoryConsumer: + """The outside reader, with the shared supersession rule.""" + + def __init__(self, store: _MemoryStream, converter: Any) -> None: + self._store = store + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + offset = int(start.token) if start.token else 0 + while True: + await self._store.wait_past(offset) + frames = self._store.frames + while offset < len(frames): + cursor = Cursor(str(offset)) + frame = frames[offset] + offset += 1 + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + frame + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _MemoryProvider: + name = "memory" + + def __init__(self) -> None: + self._poll = _DEFAULT_POLL + + def configure(self, **options: Any) -> None: + poll = options.pop("poll_interval", None) + if poll is not None: + self._poll = poll + if options: + raise TypeError( + f"the memory provider takes only poll_interval, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + store = _stream(_inbound_id(workflow.info().workflow_id, stream)) + return _MemReadSource( + store, + int(start.token) if start.token else 0, + idle_timeout or self._poll, + ) + + def open_write(self, topic: str) -> WriteSink: + store = _stream(_inbound_id(workflow.info().workflow_id, "")) + return _MemWriteSink(store, topic) + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> MemoryProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return MemoryProducer( + _stream(_inbound_id(workflow_id, stream)), + _converter(client), + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> MemoryConsumer: + return MemoryConsumer( + _stream(_inbound_id(workflow_id, stream)), _converter(client) + ) + + +_provider.register("memory", _MemoryProvider) diff --git a/tests/streams/__init__.py b/tests/streams/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py new file mode 100644 index 000000000..d01132851 --- /dev/null +++ b/tests/streams/test_streams_conformance.py @@ -0,0 +1,164 @@ +"""Conformance tests for the stream contract. + +Written against the public surface plus the in-memory reference provider, so +they run with no server and no store. A storage provider reuses the same +expectations through its own fixtures; what this file pins down is the +contract: framing, producer identity, retry deduplication, supersession, +topic filtering, and cursor resumption. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +from temporalio import streams +from temporalio.streams import _frame +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import Cursor, RecordKind +from temporalio.streams.providers import memory + + +@pytest.fixture(autouse=True) +def _fresh_memory_provider(): + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +async def take(records: Any, count: int, timeout: float = 5.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +def test_frame_roundtrip(): + frame = _frame.encode( + topic="decisions", + kind=RecordKind.DATA, + producer="model", + attempt=3, + sequence=7, + body=b"payload-bytes", + ) + kind, topic, producer, attempt, sequence, body = _frame.decode(frame) + assert (kind, topic, producer, attempt, sequence, body) == ( + RecordKind.DATA, + "decisions", + "model", + 3, + 7, + b"payload-bytes", + ) + + +def test_supersession_is_synthesized_from_observations(): + attempts = AttemptTracker() + assert attempts.note("model", 1, Cursor("0")) is None + superseded = attempts.note("model", 2, Cursor("1")) + assert superseded is not None + assert superseded.kind is RecordKind.SUPERSEDED + assert superseded.value.previous_attempt == 1 + # The same attempt again is not a new generation. + assert attempts.note("model", 2, Cursor("2")) is None + + +async def test_append_read_roundtrip(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"id": "r1"}, {"id": "r2"}) + await producer.finish() + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] + assert all(r.producer == "model" and r.attempt == 1 for r in records) + assert [r.sequence for r in records] == [0, 1, 2] + + +async def test_retried_append_is_deduplicated(): + first = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await first.append({"id": "r1"}) + # The retry of the same attempt starts its sequence over and appends the + # same record. The provider must not store it twice. + retry = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await retry.append({"id": "r1"}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 1) + assert records[0].value == {"id": "r1"} + with pytest.raises(asyncio.TimeoutError): + await take(consumer.read(type=dict), 2, timeout=0.2) + + +async def test_new_attempt_supersedes_the_old_one(): + first = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await first.append({"text": "The capital of"}) + second = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=2 + ) + await second.append({"text": "Paris is the capital"}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + + +async def test_topic_filter(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}) + other = await streams.producer( + None, workflow_id="wf", stream="other", producer_id="model", attempt=1 + ) + await other.append({"n": 2}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict, topic="inputs"), 1) + assert records[0].value == {"n": 1} + + +async def test_cursor_resumes_where_it_points(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + checkpoint = records[1].cursor + + resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") + again = await take(resumed.read(type=dict, start=checkpoint), 2) + assert [r.value for r in again] == [{"n": 2}, {"n": 3}] + + +def test_unknown_provider_is_a_clear_error(): + with pytest.raises(RuntimeError, match="no stream provider 'nope'"): + streams.configure(provider="nope") From 62be804709a5f6e3d5b60c11c9dc4021e759c44f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 018/831] Added the shared demo loop. --- streams_demo/provider_setup.py | 51 ++++++++-------------------------- 1 file changed, 11 insertions(+), 40 deletions(-) diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index 1b9d5c03f..81e7108e5 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -1,50 +1,21 @@ -"""Choose the client-side provider. +"""Pick the provider for a demo run from the environment. -The store is a Redis the customer runs, so this process constructs the backend -and is responsible for closing it. +``STREAMS_PROVIDER`` names any registered provider; this base tree carries +only ``memory``, and each provider branch adds its own name. The demo needs a +Temporal server to run the workflow either way; ``TEMPORAL_ADDRESS`` points +at it. """ from __future__ import annotations -import json import os -from pathlib import Path -from typing import Any -import redis.asyncio -from temporalio.contrib.external_workflow_streams._redis import RedisStreamBackend +NAME = os.environ.get("STREAMS_PROVIDER", "memory") -NAME = "external" +# The memory provider is not replay-safe, so its demo keeps the cache warm. +# Storage providers run with the smallest cache they support instead. +WORKFLOW_CACHE = int(os.environ.get("STREAMS_WORKFLOW_CACHE", "512")) -WORKFLOW_CACHE = int(os.environ.get("AI198_CACHE", "2")) -"""The smallest cache this provider runs on. -It holds the workflow task open between records, which a run that can be -evicted cannot do. Below two, a consuming workflow stops with no error and no -failed task. Recovery has to be tested by killing the worker rather than by -shrinking the cache. -""" - -_backend: RedisStreamBackend | None = None - - -async def open() -> tuple[str, dict[str, Any]]: - """The server to connect to, and the provider options.""" - global _backend - ready = Path(__file__).resolve().parents[2] / "verify/ready.json" - url = os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399") - # redis-py defaults to a socket timeout equal to this provider's own - # blocking read, so an idle read would abandon a healthy socket. - _backend = RedisStreamBackend( - client=redis.asyncio.from_url(url, decode_responses=False, socket_timeout=30), - key_prefix=os.environ.get("AI198_REDIS_PREFIX", "ai198-contract"), - ) - return json.loads(ready.read_text())["target"], {"backend": _backend} - - -async def close() -> None: - """Release the store this process opened.""" - global _backend - if _backend is not None: - await _backend.aclose() - _backend = None +async def open() -> tuple[str, dict]: + return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), {"provider": NAME} From 7964e4927519980aa84f2b3d985a8af25b16ea56 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 16:00:15 -0700 Subject: [PATCH 019/831] Moved the client-side binding into the provider registry. --- .../{_binding.py => providers/redis.py} | 284 +++++++++--------- 1 file changed, 143 insertions(+), 141 deletions(-) rename temporalio/streams/{_binding.py => providers/redis.py} (59%) diff --git a/temporalio/streams/_binding.py b/temporalio/streams/providers/redis.py similarity index 59% rename from temporalio/streams/_binding.py rename to temporalio/streams/providers/redis.py index 45903b8c6..7931e9fd4 100644 --- a/temporalio/streams/_binding.py +++ b/temporalio/streams/providers/redis.py @@ -1,17 +1,19 @@ -"""The client-side binding of the stream interface. +"""The client-side (Redis) provider. Streams live in a store the customer runs, Redis here. A workflow's publish is buffered by the worker, staged invisibly under a token, and promoted only once a marker in History proves the workflow task that produced it was accepted. Consumption is recorded the same way, as ranges and boundaries in History. -This is the only module of the package that differs between the two -implementations. +``configure`` builds the backend from ``url`` and ``key_prefix`` (defaulting +to ``AI198_REDIS_URL`` and ``AI198_REDIS_PREFIX``), or takes a constructed +``backend`` when the caller wants to own its lifecycle. """ from __future__ import annotations import asyncio +import os import time from collections.abc import AsyncIterator from datetime import timedelta @@ -30,57 +32,11 @@ external_output_stream, external_stream, ) -from temporalio.streams import _frame +from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord -__all__ = [ - "Consumer", - "Producer", - "configure", - "consumer", - "open_read", - "open_write", - "producer", - "worker_options", -] - -PROVIDER = "external" - -_backend: Any = None - - -def configure(**options: Any) -> None: - """Name the provider for this process. - - Args: - backend: A ``StreamBackend`` instance, such as ``RedisStreamBackend``. - There is no registry to name one from out here, so the caller - constructs it and hands it over. - """ - global _backend - unknown = sorted(set(options) - {"backend"}) - if unknown: - raise TypeError(f"unknown provider options {unknown}") - if "backend" not in options: - raise TypeError("the client-side provider needs a backend") - _backend = options["backend"] - - -def worker_options() -> dict[str, Any]: - """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" - return {"external_stream_backend": _require_backend()} - - -def _require_backend() -> Any: - if _backend is None: - raise RuntimeError( - "no stream provider configured; call temporalio.streams.configure(" - "backend=...) before opening a producer, a consumer or a worker" - ) - return _backend - class _ExternalReadSource: def __init__(self, subscription: Any) -> None: @@ -108,34 +64,6 @@ async def publish(self, frame: bytes) -> None: await self._topic.publish(frame) -def open_read( - stream: str, - *, - start: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, -) -> ReadSource: - """Subscribe the running workflow to its inbound stream ``stream``.""" - # The provider resolves the name under this run's chain key, so a start - # position is only meaningful to a reader that already has one, and this - # provider's first subscription always starts at the beginning of the - # stream it minted. - if start is not BEGINNING and start.token: - raise ValueError( - "the client-side provider starts a new subscription at the " - "beginning of the stream it owns; resuming elsewhere is not " - "supported yet" - ) - options = external_stream - if idle_timeout is not None: - options = options.with_options(idle_timeout=idle_timeout) - return _ExternalReadSource(options.topic(stream, type=bytes).subscribe()) - - -def open_write(topic: str) -> WriteSink: - """Bind ``topic`` on the stream the running workflow owns.""" - return _ExternalWriteSink(external_output_stream.topic(topic, type=bytes)) - - async def _chain_key(client: Client, workflow_id: str) -> WorkflowChainKey: description = await client.get_workflow_handle(workflow_id).describe() return WorkflowChainKey( @@ -145,7 +73,7 @@ async def _chain_key(client: Client, workflow_id: str) -> WorkflowChainKey: ) -class Producer: +class RedisProducer: """Appends to a stream from outside workflow code. Every append is visible as soon as it is written. That is the point for an @@ -164,7 +92,6 @@ def __init__( client: Client | None = None, workflow_id: str = "", ) -> None: - """Prefer :func:`producer`.""" self._topic = topic self._converter = converter self._stream = stream @@ -248,51 +175,10 @@ def _encode(self, value: Any) -> bytes: return payload.SerializeToString() -async def producer( - client: Client, - *, - workflow_id: str, - stream: str, - producer_id: str = "", - attempt: int = 0, -) -> Producer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. - - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. - """ - if not producer_id: - producer_id = activity.info().activity_id - if not attempt: - attempt = activity.info().attempt - session = await ExternalStreamProducer.connect( - backend=_require_backend(), - workflow=await _chain_key(client, workflow_id), - client=client, - # The attempt is part of it. Deduplication answers "is this the same - # append again", and a second attempt writing different words at the - # same sequence is not: this provider rejects that outright. Folding - # the attempt in keeps a retried append idempotent without letting a - # new generation be refused as a conflicting duplicate. - session_id=f"{producer_id}#{attempt}", - ) - return Producer( - session.topic(stream, type=bytes), - client.data_converter.payload_converter, - stream, - producer_id, - attempt, - client, - workflow_id, - ) - - -class Consumer: +class RedisConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, client: Any, converter: Any) -> None: - """Prefer :func:`consumer`.""" self._client = client self._converter = converter @@ -345,26 +231,142 @@ def _decode(self, body: bytes, as_type: type | None) -> Any: return self._converter.from_payloads([payload], [as_type])[0] -async def consumer( - client: Client, *, workflow_id: str, stream: str = "" -) -> Consumer: - """Open a reader for what ``workflow_id`` publishes. +class _RedisProvider: + name = "redis" - An empty ``stream`` reads what the workflow wrote through - :func:`temporalio.streams.writer`. This provider keeps inbound and outbound - records in separate stores, so naming an inbound stream is not supported - from here yet. - """ - if stream: - raise ValueError( - "this provider separates inbound and outbound storage, so an " - "outside reader cannot follow an inbound stream yet" + def __init__(self) -> None: + self._backend: Any = None + + def configure(self, **options: Any) -> None: + backend = options.pop("backend", None) + url = options.pop("url", None) + key_prefix = options.pop("key_prefix", None) + if options: + raise TypeError( + "the redis provider takes backend, url and key_prefix, got " + f"{sorted(options)}" + ) + if backend is not None: + self._backend = backend + return + import redis.asyncio + + from temporalio.contrib.external_workflow_streams._redis import ( + RedisStreamBackend, ) - return Consumer( - await ExternalOutputStreamClient.connect( - backend=_require_backend(), + + # redis-py defaults to a socket timeout equal to this provider's own + # blocking read, so an idle read would abandon a healthy socket. + self._backend = RedisStreamBackend( + client=redis.asyncio.from_url( + url or os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), + decode_responses=False, + socket_timeout=30, + ), + key_prefix=key_prefix + or os.environ.get("AI198_REDIS_PREFIX", "ai198-contract"), + ) + + def _require_backend(self) -> Any: + if self._backend is None: + raise RuntimeError( + "no store configured; call temporalio.streams.configure(" + 'provider="redis", ...) before opening a producer, a consumer ' + "or a worker" + ) + return self._backend + + def worker_options(self) -> dict[str, Any]: + return {"external_stream_backend": self._require_backend()} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # The provider resolves the name under this run's chain key, so a start + # position is only meaningful to a reader that already has one, and this + # provider's first subscription always starts at the beginning of the + # stream it minted. + if start is not BEGINNING and start.token: + raise ValueError( + "the client-side provider starts a new subscription at the " + "beginning of the stream it owns; resuming elsewhere is not " + "supported yet" + ) + options = external_stream + if idle_timeout is not None: + options = options.with_options(idle_timeout=idle_timeout) + return _ExternalReadSource(options.topic(stream, type=bytes).subscribe()) + + def open_write(self, topic: str) -> WriteSink: + return _ExternalWriteSink(external_output_stream.topic(topic, type=bytes)) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> RedisProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + session = await ExternalStreamProducer.connect( + backend=self._require_backend(), workflow=await _chain_key(client, workflow_id), client=client, - ), - client.data_converter.payload_converter, - ) + # The attempt is part of it. Deduplication answers "is this the + # same append again", and a second attempt writing different words + # at the same sequence is not: this provider rejects that outright. + # Folding the attempt in keeps a retried append idempotent without + # letting a new generation be refused as a conflicting duplicate. + session_id=f"{producer_id}#{attempt}", + ) + return RedisProducer( + session.topic(stream, type=bytes), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + client, + workflow_id, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> RedisConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. This provider keeps inbound and + outbound records in separate stores, so naming an inbound stream is + not supported from here yet. + """ + if stream: + raise ValueError( + "this provider separates inbound and outbound storage, so an " + "outside reader cannot follow an inbound stream yet" + ) + return RedisConsumer( + await ExternalOutputStreamClient.connect( + backend=self._require_backend(), + workflow=await _chain_key(client, workflow_id), + client=client, + ), + client.data_converter.payload_converter, + ) + + +_provider.register("redis", _RedisProvider) From 183651fbfbca0647172f06e29cc120d16ec71c49 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 16:31:56 -0700 Subject: [PATCH 020/831] Regenerated the bridge protos from the merged Core. --- .../workflow_activation_pb2.py | 381 +-- .../workflow_activation_pb2.pyi | 2033 +++----------- .../proto/workflow_commands/__init__.py | 8 +- .../workflow_commands_pb2.py | 511 +--- .../workflow_commands_pb2.pyi | 2496 ++++------------- 5 files changed, 1191 insertions(+), 4238 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0e1b3a1e6..bc0f75ded 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -1,12 +1,22 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE # source: temporal/sdk/core/workflow_activation/workflow_activation.proto +# Protobuf Python Version: 7.35.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection +from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 7, + 35, + 1, + '', + 'temporal/sdk/core/workflow_activation/workflow_activation.proto' +) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -24,289 +34,86 @@ from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') - - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] -_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] -_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] -WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }) -_sym_db.RegisterMessage(WorkflowActivation) - -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }) -_sym_db.RegisterMessage(WorkflowActivationJob) - -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) - }) -_sym_db.RegisterMessage(DeliverStreamMessages) - -InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _INITIALIZEWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }) -_sym_db.RegisterMessage(InitializeWorkflow) -_sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) - -FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { - 'DESCRIPTOR' : _FIRETIMER, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }) -_sym_db.RegisterMessage(FireTimer) - -ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }) -_sym_db.RegisterMessage(ResolveActivity) - -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }) -_sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) - -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }) -_sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) - -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }) -_sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) - -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }) -_sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) - -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }) -_sym_db.RegisterMessage(ResolveChildWorkflowExecution) - -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERANDOMSEED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }) -_sym_db.RegisterMessage(UpdateRandomSeed) - -QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _QUERYWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }) -_sym_db.RegisterMessage(QueryWorkflow) -_sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) - -CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }) -_sym_db.RegisterMessage(CancelWorkflow) - -SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }) -_sym_db.RegisterMessage(SignalWorkflow) -_sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) - -NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { - 'DESCRIPTOR' : _NOTIFYHASPATCH, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }) -_sym_db.RegisterMessage(NotifyHasPatch) - -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }) -_sym_db.RegisterMessage(ResolveSignalExternalWorkflow) - -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }) -_sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) - -DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }) - , - 'DESCRIPTOR' : _DOUPDATE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }) -_sym_db.RegisterMessage(DoUpdate) -_sym_db.RegisterMessage(DoUpdate.HeadersEntry) - -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }) -_sym_db.RegisterMessage(ResolveNexusOperationStart) - -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }) -_sym_db.RegisterMessage(ResolveNexusOperation) - -RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEFROMCACHE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }) -_sym_db.RegisterMessage(RemoveFromCache) - -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' - _WORKFLOWACTIVATION._serialized_start=570 - _WORKFLOWACTIVATION._serialized_end=1116 - _WORKFLOWACTIVATIONJOB._serialized_start=1119 - _WORKFLOWACTIVATIONJOB._serialized_end=2582 - _DELIVERSTREAMMESSAGES._serialized_start=2585 - _DELIVERSTREAMMESSAGES._serialized_end=2724 - _INITIALIZEWORKFLOW._serialized_start=2727 - _INITIALIZEWORKFLOW._serialized_end=4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 - _FIRETIMER._serialized_start=4133 - _FIRETIMER._serialized_end=4157 - _RESOLVEACTIVITY._serialized_start=4159 - _RESOLVEACTIVITY._serialized_end=4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 - _UPDATERANDOMSEED._serialized_start=5045 - _UPDATERANDOMSEED._serialized_end=5088 - _QUERYWORKFLOW._serialized_start=5091 - _QUERYWORKFLOW._serialized_end=5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 - _CANCELWORKFLOW._serialized_start=5353 - _CANCELWORKFLOW._serialized_end=5385 - _SIGNALWORKFLOW._serialized_start=5388 - _SIGNALWORKFLOW._serialized_end=5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 - _NOTIFYHASPATCH._serialized_start=5679 - _NOTIFYHASPATCH._serialized_end=5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 - _DOUPDATE._serialized_start=5917 - _DOUPDATE._serialized_end=6248 - _DOUPDATE_HEADERSENTRY._serialized_start=4052 - _DOUPDATE_HEADERSENTRY._serialized_end=4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 - _RESOLVENEXUSOPERATION._serialized_start=6407 - _RESOLVENEXUSOPERATION._serialized_end=6496 - _REMOVEFROMCACHE._serialized_start=6499 - _REMOVEFROMCACHE._serialized_end=6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 +from temporalio.bridge.proto.external_data import external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2 +from temporalio.bridge.proto.workflow_commands import workflow_commands_pb2 as temporal_dot_sdk_dot_core_dot_workflow__commands_dot_workflow__commands__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto\x1a;temporal/sdk/core/workflow_commands/workflow_commands.proto\"\xc2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\x12\x1e\n\x16history_floor_event_id\x18\r \x01(\x03\"\xab\x0e\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12`\n\x1dresolve_external_stream_waits\x18\x11 \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveExternalStreamWaitsH\x00\x12^\n\x1cprepare_external_stream_park\x18\x12 \x01(\x0b\x32\x36.coresdk.workflow_activation.PrepareExternalStreamParkH\x00\x12U\n\x17replay_external_streams\x18\x13 \x01(\x0b\x32\x32.coresdk.workflow_activation.ReplayExternalStreamsH\x00\x12Y\n\x19\x66inalize_external_streams\x18\x14 \x01(\x0b\x32\x34.coresdk.workflow_activation.FinalizeExternalStreamsH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x7f\n\x1aResolveExternalStreamWaits\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x42\n\x0bready_hints\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\"\xab\x01\n\x19PrepareExternalStreamPark\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason\"\x92\x02\n\x15ReplayExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x19\n\x11replay_annotation\x18\x03 \x01(\x0c\x12<\n\x11terminal_boundary\x18\x04 \x01(\x0e\x32!.coresdk.external_data.ParkReason\x12\x43\n\x06output\x18\x05 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\"\xa9\x01\n\x17\x46inalizeExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'temporal.sdk.core.workflow_activation.workflow_activation_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _globals['_INITIALIZEWORKFLOW_HEADERSENTRY']._loaded_options = None + _globals['_INITIALIZEWORKFLOW_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_QUERYWORKFLOW_HEADERSENTRY']._loaded_options = None + _globals['_QUERYWORKFLOW_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_SIGNALWORKFLOW_HEADERSENTRY']._loaded_options = None + _globals['_SIGNALWORKFLOW_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_DOUPDATE_HEADERSENTRY']._loaded_options = None + _globals['_DOUPDATE_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_WORKFLOWACTIVATION']._serialized_start=684 + _globals['_WORKFLOWACTIVATION']._serialized_end=1262 + _globals['_WORKFLOWACTIVATIONJOB']._serialized_start=1265 + _globals['_WORKFLOWACTIVATIONJOB']._serialized_end=3100 + _globals['_RESOLVEEXTERNALSTREAMWAITS']._serialized_start=3102 + _globals['_RESOLVEEXTERNALSTREAMWAITS']._serialized_end=3229 + _globals['_PREPAREEXTERNALSTREAMPARK']._serialized_start=3232 + _globals['_PREPAREEXTERNALSTREAMPARK']._serialized_end=3403 + _globals['_REPLAYEXTERNALSTREAMS']._serialized_start=3406 + _globals['_REPLAYEXTERNALSTREAMS']._serialized_end=3680 + _globals['_FINALIZEEXTERNALSTREAMS']._serialized_start=3683 + _globals['_FINALIZEEXTERNALSTREAMS']._serialized_end=3852 + _globals['_DELIVERSTREAMMESSAGES']._serialized_start=3855 + _globals['_DELIVERSTREAMMESSAGES']._serialized_end=3994 + _globals['_INITIALIZEWORKFLOW']._serialized_start=3997 + _globals['_INITIALIZEWORKFLOW']._serialized_end=5401 + _globals['_INITIALIZEWORKFLOW_HEADERSENTRY']._serialized_start=5322 + _globals['_INITIALIZEWORKFLOW_HEADERSENTRY']._serialized_end=5401 + _globals['_FIRETIMER']._serialized_start=5403 + _globals['_FIRETIMER']._serialized_end=5427 + _globals['_RESOLVEACTIVITY']._serialized_start=5429 + _globals['_RESOLVEACTIVITY']._serialized_end=5538 + _globals['_RESOLVECHILDWORKFLOWEXECUTIONSTART']._serialized_start=5541 + _globals['_RESOLVECHILDWORKFLOWEXECUTIONSTART']._serialized_end=5878 + _globals['_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS']._serialized_start=5880 + _globals['_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS']._serialized_end=5939 + _globals['_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE']._serialized_start=5942 + _globals['_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE']._serialized_end=6108 + _globals['_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED']._serialized_start=6110 + _globals['_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED']._serialized_end=6206 + _globals['_RESOLVECHILDWORKFLOWEXECUTION']._serialized_start=6208 + _globals['_RESOLVECHILDWORKFLOWEXECUTION']._serialized_end=6313 + _globals['_UPDATERANDOMSEED']._serialized_start=6315 + _globals['_UPDATERANDOMSEED']._serialized_end=6358 + _globals['_QUERYWORKFLOW']._serialized_start=6361 + _globals['_QUERYWORKFLOW']._serialized_end=6621 + _globals['_QUERYWORKFLOW_HEADERSENTRY']._serialized_start=5322 + _globals['_QUERYWORKFLOW_HEADERSENTRY']._serialized_end=5401 + _globals['_CANCELWORKFLOW']._serialized_start=6623 + _globals['_CANCELWORKFLOW']._serialized_end=6655 + _globals['_SIGNALWORKFLOW']._serialized_start=6658 + _globals['_SIGNALWORKFLOW']._serialized_end=6947 + _globals['_SIGNALWORKFLOW_HEADERSENTRY']._serialized_start=5322 + _globals['_SIGNALWORKFLOW_HEADERSENTRY']._serialized_end=5401 + _globals['_NOTIFYHASPATCH']._serialized_start=6949 + _globals['_NOTIFYHASPATCH']._serialized_end=6983 + _globals['_RESOLVESIGNALEXTERNALWORKFLOW']._serialized_start=6985 + _globals['_RESOLVESIGNALEXTERNALWORKFLOW']._serialized_end=7080 + _globals['_RESOLVEREQUESTCANCELEXTERNALWORKFLOW']._serialized_start=7082 + _globals['_RESOLVEREQUESTCANCELEXTERNALWORKFLOW']._serialized_end=7184 + _globals['_DOUPDATE']._serialized_start=7187 + _globals['_DOUPDATE']._serialized_end=7518 + _globals['_DOUPDATE_HEADERSENTRY']._serialized_start=5322 + _globals['_DOUPDATE_HEADERSENTRY']._serialized_end=5401 + _globals['_RESOLVENEXUSOPERATIONSTART']._serialized_start=7521 + _globals['_RESOLVENEXUSOPERATIONSTART']._serialized_end=7675 + _globals['_RESOLVENEXUSOPERATION']._serialized_start=7677 + _globals['_RESOLVENEXUSOPERATION']._serialized_end=7766 + _globals['_REMOVEFROMCACHE']._serialized_start=7769 + _globals['_REMOVEFROMCACHE']._serialized_end=8121 + _globals['_REMOVEFROMCACHE_EVICTIONREASON']._serialized_start=7883 + _globals['_REMOVEFROMCACHE_EVICTIONREASON']._serialized_end=8121 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index eab815fc9..ce1927e52 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -1,1607 +1,426 @@ -""" -@generated by mypy-protobuf. Do not edit manually! -isort:skip_file -* -Definitions of the different workflow activation jobs returned from [crate::Core::poll_task]. The -lang SDK applies these activation jobs to drive workflows. -""" - -import builtins -import collections.abc -import sys -import typing - -import google.protobuf.descriptor -import google.protobuf.duration_pb2 -import google.protobuf.internal.containers -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message -import google.protobuf.timestamp_pb2 - -import temporalio.api.common.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 -import temporalio.api.enums.v1.workflow_pb2 -import temporalio.api.failure.v1.message_pb2 -import temporalio.api.update.v1.message_pb2 -import temporalio.bridge.proto.activity_result.activity_result_pb2 -import temporalio.bridge.proto.child_workflow.child_workflow_pb2 -import temporalio.bridge.proto.common.common_pb2 -import temporalio.bridge.proto.nexus.nexus_pb2 - -if sys.version_info >= (3, 10): - import typing as typing_extensions -else: - import typing_extensions - -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor - -class WorkflowActivation(google.protobuf.message.Message): - """An instruction to the lang sdk to run some workflow code, whether for the first time or from - a cached state. - - ## Job ordering guarantees and semantics - - Core will, by default, order jobs within the activation as follows: - 1. init workflow - 2. patches - 3. random-seed-updates - 4. signals/updates - 5. all others - 6. local activity resolutions - 7. queries - 8. evictions - - This is because: - * Patches are expected to apply to the entire activation - * Signal and update handlers should be invoked before workflow routines are iterated. That is to - say before the users' main workflow function and anything spawned by it is allowed to continue. - * Local activities resolutions go after other normal jobs because while *not* replaying, they - will always take longer than anything else that produces an immediate job (which is - effectively instant). When *replaying* we need to scan ahead for LA markers so that we can - resolve them in the same activation that they completed in when not replaying. However, doing - so would, by default, put those resolutions *before* any other immediate jobs that happened - in that same activation (prime example: cancelling not-wait-for-cancel activities). So, we do - this to ensure the LA resolution happens after that cancel (or whatever else it may be) as it - normally would have when executing. - * Queries always go last (and, in fact, always come in their own activation) - * Evictions also always come in their own activation - - Core does this reordering to ensure that langs observe jobs in the same order during replay as - they would have during execution. However, in principle, this ordering is not necessary - (excepting queries/evictions, which definitely must come last) if lang layers apply all jobs to - state *first* (by resolving promises/futures, marking handlers to be invoked, etc as they iterate - over the jobs) and then only *after* that is done, drive coroutines/threads/whatever. If - execution works this way, then determinism is only impacted by the order routines are driven in - (which must be stable based on lang implementation or convention), rather than the order jobs are - processed. - - ## Evictions - - Evictions appear as an activations that contains only a `remove_from_cache` job. Such activations - should not cause the workflow code to be invoked and may be responded to with an empty command - list. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - RUN_ID_FIELD_NUMBER: builtins.int - TIMESTAMP_FIELD_NUMBER: builtins.int - IS_REPLAYING_FIELD_NUMBER: builtins.int - HISTORY_LENGTH_FIELD_NUMBER: builtins.int - JOBS_FIELD_NUMBER: builtins.int - AVAILABLE_INTERNAL_FLAGS_FIELD_NUMBER: builtins.int - HISTORY_SIZE_BYTES_FIELD_NUMBER: builtins.int - CONTINUE_AS_NEW_SUGGESTED_FIELD_NUMBER: builtins.int - DEPLOYMENT_VERSION_FOR_CURRENT_TASK_FIELD_NUMBER: builtins.int - LAST_SDK_VERSION_FIELD_NUMBER: builtins.int - SUGGEST_CONTINUE_AS_NEW_REASONS_FIELD_NUMBER: builtins.int - TARGET_WORKER_DEPLOYMENT_VERSION_CHANGED_FIELD_NUMBER: builtins.int - run_id: builtins.str - """The id of the currently active run of the workflow. Also used as a cache key. There may - only ever be one active workflow task (and hence activation) of a run at one time. - """ - @property - def timestamp(self) -> google.protobuf.timestamp_pb2.Timestamp: - """The current time as understood by the workflow, which is set by workflow task started events""" - is_replaying: builtins.bool - """Whether or not the activation is replaying past events""" - history_length: builtins.int - """Current history length as determined by the event id of the most recently processed event. - This ensures that the number is always deterministic - """ - @property - def jobs( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - global___WorkflowActivationJob - ]: - """The things to do upon activating the workflow""" - @property - def available_internal_flags( - self, - ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: - """Internal flags which are available for use by lang. If `is_replaying` is false, all - internal flags may be used. This is not a delta - all previously used flags always - appear since this representation is cheap. - """ - history_size_bytes: builtins.int - """The history size in bytes as of the last WFT started event""" - continue_as_new_suggested: builtins.bool - """Set true if the most recent WFT started event had this suggestion""" - @property - def deployment_version_for_current_task( - self, - ) -> temporalio.bridge.proto.common.common_pb2.WorkerDeploymentVersion: - """Set to the deployment version of the worker that processed this task, - which may be empty. During replay this version may not equal the version - of the replaying worker. If not replaying and this worker has a defined - Deployment Version, it will equal that. It will also be empty for - evict-only activations. The deployment name may be empty, but not the - build id, if this worker was using the deprecated Build ID-only - feature(s). - """ - last_sdk_version: builtins.str - """The last seen SDK version from the most recent WFT completed event""" - @property - def suggest_continue_as_new_reasons( - self, - ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[ - temporalio.api.enums.v1.workflow_pb2.SuggestContinueAsNewReason.ValueType - ]: - """Experimental. Optionally decide the versioning behavior that the first task of the new run should use. - For example, choose to AutoUpgrade on continue-as-new instead of inheriting the pinned version - of the previous run. - """ - target_worker_deployment_version_changed: builtins.bool - """True if Workflow's Target Worker Deployment Version is different from its Pinned Version and - the workflow is Pinned. - Experimental. - """ - def __init__( - self, - *, - run_id: builtins.str = ..., - timestamp: google.protobuf.timestamp_pb2.Timestamp | None = ..., - is_replaying: builtins.bool = ..., - history_length: builtins.int = ..., - jobs: collections.abc.Iterable[global___WorkflowActivationJob] | None = ..., - available_internal_flags: collections.abc.Iterable[builtins.int] | None = ..., - history_size_bytes: builtins.int = ..., - continue_as_new_suggested: builtins.bool = ..., - deployment_version_for_current_task: temporalio.bridge.proto.common.common_pb2.WorkerDeploymentVersion - | None = ..., - last_sdk_version: builtins.str = ..., - suggest_continue_as_new_reasons: collections.abc.Iterable[ - temporalio.api.enums.v1.workflow_pb2.SuggestContinueAsNewReason.ValueType - ] - | None = ..., - target_worker_deployment_version_changed: builtins.bool = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "deployment_version_for_current_task", - b"deployment_version_for_current_task", - "timestamp", - b"timestamp", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "available_internal_flags", - b"available_internal_flags", - "continue_as_new_suggested", - b"continue_as_new_suggested", - "deployment_version_for_current_task", - b"deployment_version_for_current_task", - "history_length", - b"history_length", - "history_size_bytes", - b"history_size_bytes", - "is_replaying", - b"is_replaying", - "jobs", - b"jobs", - "last_sdk_version", - b"last_sdk_version", - "run_id", - b"run_id", - "suggest_continue_as_new_reasons", - b"suggest_continue_as_new_reasons", - "target_worker_deployment_version_changed", - b"target_worker_deployment_version_changed", - "timestamp", - b"timestamp", - ], - ) -> None: ... - -global___WorkflowActivation = WorkflowActivation - -class WorkflowActivationJob(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - INITIALIZE_WORKFLOW_FIELD_NUMBER: builtins.int - FIRE_TIMER_FIELD_NUMBER: builtins.int - UPDATE_RANDOM_SEED_FIELD_NUMBER: builtins.int - QUERY_WORKFLOW_FIELD_NUMBER: builtins.int - CANCEL_WORKFLOW_FIELD_NUMBER: builtins.int - SIGNAL_WORKFLOW_FIELD_NUMBER: builtins.int - RESOLVE_ACTIVITY_FIELD_NUMBER: builtins.int - NOTIFY_HAS_PATCH_FIELD_NUMBER: builtins.int - RESOLVE_CHILD_WORKFLOW_EXECUTION_START_FIELD_NUMBER: builtins.int - RESOLVE_CHILD_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - RESOLVE_SIGNAL_EXTERNAL_WORKFLOW_FIELD_NUMBER: builtins.int - RESOLVE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_FIELD_NUMBER: builtins.int - DO_UPDATE_FIELD_NUMBER: builtins.int - RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int - RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int - DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int - REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int - @property - def initialize_workflow(self) -> global___InitializeWorkflow: - """A workflow is starting, record all of the information from its start event""" - @property - def fire_timer(self) -> global___FireTimer: - """A timer has fired, allowing whatever was waiting on it (if anything) to proceed""" - @property - def update_random_seed(self) -> global___UpdateRandomSeed: - """Workflow was reset. The randomness seed must be updated.""" - @property - def query_workflow(self) -> global___QueryWorkflow: - """A request to query the workflow was received. It is guaranteed that queries (one or more) - always come in their own activation after other mutating jobs. - """ - @property - def cancel_workflow(self) -> global___CancelWorkflow: - """A request to cancel the workflow was received.""" - @property - def signal_workflow(self) -> global___SignalWorkflow: - """A request to signal the workflow was received.""" - @property - def resolve_activity(self) -> global___ResolveActivity: - """An activity was resolved, result could be completed, failed or cancelled""" - @property - def notify_has_patch(self) -> global___NotifyHasPatch: - """A patch marker has been detected and lang is being told that change exists. This - job is strange in that it is sent pre-emptively to lang without any corresponding - command being sent first. - """ - @property - def resolve_child_workflow_execution_start( - self, - ) -> global___ResolveChildWorkflowExecutionStart: - """A child workflow execution has started or failed to start""" - @property - def resolve_child_workflow_execution( - self, - ) -> global___ResolveChildWorkflowExecution: - """A child workflow was resolved, result could be completed or failed""" - @property - def resolve_signal_external_workflow( - self, - ) -> global___ResolveSignalExternalWorkflow: - """An attempt to signal an external workflow resolved""" - @property - def resolve_request_cancel_external_workflow( - self, - ) -> global___ResolveRequestCancelExternalWorkflow: - """An attempt to cancel an external workflow resolved""" - @property - def do_update(self) -> global___DoUpdate: - """A request to handle a workflow update.""" - @property - def resolve_nexus_operation_start(self) -> global___ResolveNexusOperationStart: - """A nexus operation started.""" - @property - def resolve_nexus_operation(self) -> global___ResolveNexusOperation: - """A nexus operation resolved.""" - @property - def deliver_stream_messages(self) -> global___DeliverStreamMessages: - """A range of a stream the workflow subscribed to.""" - @property - def remove_from_cache(self) -> global___RemoveFromCache: - """Remove the workflow identified by the [WorkflowActivation] containing this job from the - cache after performing the activation. It is guaranteed that this will be the only job - in the activation if present. - """ - def __init__( - self, - *, - initialize_workflow: global___InitializeWorkflow | None = ..., - fire_timer: global___FireTimer | None = ..., - update_random_seed: global___UpdateRandomSeed | None = ..., - query_workflow: global___QueryWorkflow | None = ..., - cancel_workflow: global___CancelWorkflow | None = ..., - signal_workflow: global___SignalWorkflow | None = ..., - resolve_activity: global___ResolveActivity | None = ..., - notify_has_patch: global___NotifyHasPatch | None = ..., - resolve_child_workflow_execution_start: global___ResolveChildWorkflowExecutionStart - | None = ..., - resolve_child_workflow_execution: global___ResolveChildWorkflowExecution - | None = ..., - resolve_signal_external_workflow: global___ResolveSignalExternalWorkflow - | None = ..., - resolve_request_cancel_external_workflow: global___ResolveRequestCancelExternalWorkflow - | None = ..., - do_update: global___DoUpdate | None = ..., - resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., - resolve_nexus_operation: global___ResolveNexusOperation | None = ..., - deliver_stream_messages: global___DeliverStreamMessages | None = ..., - remove_from_cache: global___RemoveFromCache | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "cancel_workflow", - b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", - "do_update", - b"do_update", - "fire_timer", - b"fire_timer", - "initialize_workflow", - b"initialize_workflow", - "notify_has_patch", - b"notify_has_patch", - "query_workflow", - b"query_workflow", - "remove_from_cache", - b"remove_from_cache", - "resolve_activity", - b"resolve_activity", - "resolve_child_workflow_execution", - b"resolve_child_workflow_execution", - "resolve_child_workflow_execution_start", - b"resolve_child_workflow_execution_start", - "resolve_nexus_operation", - b"resolve_nexus_operation", - "resolve_nexus_operation_start", - b"resolve_nexus_operation_start", - "resolve_request_cancel_external_workflow", - b"resolve_request_cancel_external_workflow", - "resolve_signal_external_workflow", - b"resolve_signal_external_workflow", - "signal_workflow", - b"signal_workflow", - "update_random_seed", - b"update_random_seed", - "variant", - b"variant", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "cancel_workflow", - b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", - "do_update", - b"do_update", - "fire_timer", - b"fire_timer", - "initialize_workflow", - b"initialize_workflow", - "notify_has_patch", - b"notify_has_patch", - "query_workflow", - b"query_workflow", - "remove_from_cache", - b"remove_from_cache", - "resolve_activity", - b"resolve_activity", - "resolve_child_workflow_execution", - b"resolve_child_workflow_execution", - "resolve_child_workflow_execution_start", - b"resolve_child_workflow_execution_start", - "resolve_nexus_operation", - b"resolve_nexus_operation", - "resolve_nexus_operation_start", - b"resolve_nexus_operation_start", - "resolve_request_cancel_external_workflow", - b"resolve_request_cancel_external_workflow", - "resolve_signal_external_workflow", - b"resolve_signal_external_workflow", - "signal_workflow", - b"signal_workflow", - "update_random_seed", - b"update_random_seed", - "variant", - b"variant", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing_extensions.Literal["variant", b"variant"] - ) -> ( - typing_extensions.Literal[ - "initialize_workflow", - "fire_timer", - "update_random_seed", - "query_workflow", - "cancel_workflow", - "signal_workflow", - "resolve_activity", - "notify_has_patch", - "resolve_child_workflow_execution_start", - "resolve_child_workflow_execution", - "resolve_signal_external_workflow", - "resolve_request_cancel_external_workflow", - "do_update", - "resolve_nexus_operation_start", - "resolve_nexus_operation", - "deliver_stream_messages", - "remove_from_cache", - ] - | None - ): ... - -global___WorkflowActivationJob = WorkflowActivationJob - -class InitializeWorkflow(google.protobuf.message.Message): - """Initialize a new workflow""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - WORKFLOW_TYPE_FIELD_NUMBER: builtins.int - WORKFLOW_ID_FIELD_NUMBER: builtins.int - ARGUMENTS_FIELD_NUMBER: builtins.int - RANDOMNESS_SEED_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - IDENTITY_FIELD_NUMBER: builtins.int - PARENT_WORKFLOW_INFO_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_TIMEOUT_FIELD_NUMBER: builtins.int - WORKFLOW_RUN_TIMEOUT_FIELD_NUMBER: builtins.int - WORKFLOW_TASK_TIMEOUT_FIELD_NUMBER: builtins.int - CONTINUED_FROM_EXECUTION_RUN_ID_FIELD_NUMBER: builtins.int - CONTINUED_INITIATOR_FIELD_NUMBER: builtins.int - CONTINUED_FAILURE_FIELD_NUMBER: builtins.int - LAST_COMPLETION_RESULT_FIELD_NUMBER: builtins.int - FIRST_EXECUTION_RUN_ID_FIELD_NUMBER: builtins.int - RETRY_POLICY_FIELD_NUMBER: builtins.int - ATTEMPT_FIELD_NUMBER: builtins.int - CRON_SCHEDULE_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_EXPIRATION_TIME_FIELD_NUMBER: builtins.int - CRON_SCHEDULE_TO_SCHEDULE_INTERVAL_FIELD_NUMBER: builtins.int - MEMO_FIELD_NUMBER: builtins.int - SEARCH_ATTRIBUTES_FIELD_NUMBER: builtins.int - START_TIME_FIELD_NUMBER: builtins.int - ROOT_WORKFLOW_FIELD_NUMBER: builtins.int - PRIORITY_FIELD_NUMBER: builtins.int - ORIGINAL_EXECUTION_RUN_ID_FIELD_NUMBER: builtins.int - workflow_type: builtins.str - """The identifier the lang-specific sdk uses to execute workflow code""" - workflow_id: builtins.str - """The workflow id used on the temporal server""" - @property - def arguments( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: - """Inputs to the workflow code""" - randomness_seed: builtins.int - """The seed must be used to initialize the random generator used by SDK. - RandomSeedUpdatedAttributes are used to deliver seed updates. - """ - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """Used to add metadata e.g. for tracing and auth, meant to be read and written to by interceptors.""" - identity: builtins.str - """Identity of the client who requested this execution""" - @property - def parent_workflow_info( - self, - ) -> temporalio.bridge.proto.common.common_pb2.NamespacedWorkflowExecution: - """If this workflow is a child, information about the parent""" - @property - def workflow_execution_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Total workflow execution timeout including retries and continue as new.""" - @property - def workflow_run_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Timeout of a single workflow run.""" - @property - def workflow_task_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Timeout of a single workflow task.""" - continued_from_execution_run_id: builtins.str - """Run id of the previous workflow which continued-as-new or retired or cron executed into this - workflow, if any. - """ - continued_initiator: ( - temporalio.api.enums.v1.workflow_pb2.ContinueAsNewInitiator.ValueType - ) - """If this workflow was a continuation, indicates the type of continuation.""" - @property - def continued_failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: - """If this workflow was a continuation and that continuation failed, the details of that.""" - @property - def last_completion_result(self) -> temporalio.api.common.v1.message_pb2.Payloads: - """If this workflow was a continuation and that continuation completed, the details of that.""" - first_execution_run_id: builtins.str - """This is the very first run id the workflow ever had, following continuation chains.""" - @property - def retry_policy(self) -> temporalio.api.common.v1.message_pb2.RetryPolicy: - """This workflow's retry policy""" - attempt: builtins.int - """Starting at 1, the number of times we have tried to execute this workflow""" - cron_schedule: builtins.str - """If this workflow runs on a cron schedule, it will appear here""" - @property - def workflow_execution_expiration_time( - self, - ) -> google.protobuf.timestamp_pb2.Timestamp: - """The absolute time at which the workflow will be timed out. - This is passed without change to the next run/retry of a workflow. - """ - @property - def cron_schedule_to_schedule_interval( - self, - ) -> google.protobuf.duration_pb2.Duration: - """For a cron workflow, this contains the amount of time between when this iteration of - the cron workflow was scheduled and when it should run next per its cron_schedule. - """ - @property - def memo(self) -> temporalio.api.common.v1.message_pb2.Memo: - """User-defined memo""" - @property - def search_attributes( - self, - ) -> temporalio.api.common.v1.message_pb2.SearchAttributes: - """Search attributes created/updated when this workflow was started""" - @property - def start_time(self) -> google.protobuf.timestamp_pb2.Timestamp: - """When the workflow execution started event was first written""" - @property - def root_workflow(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """Contains information about the root workflow execution. It is possible for the namespace to - be different than this workflow if using OSS and cross-namespace children, but this - information is not retained. Users should take care to track it by other means in such - situations. - - The root workflow execution is defined as follows: - 1. A workflow without parent workflow is its own root workflow. - 2. A workflow that has a parent workflow has the same root workflow as its parent workflow. - - See field in WorkflowExecutionStarted for more detail. - """ - @property - def priority(self) -> temporalio.api.common.v1.message_pb2.Priority: - """Priority of this workflow execution""" - original_execution_run_id: builtins.str - """The run id recorded on the `WORKFLOW_EXECUTION_STARTED` event. Unlike the execution's current - run id, this value is preserved across workflow resets. Mirrors the `original_execution_run_id` - field from `WorkflowExecutionStartedEventAttributes`. - """ - def __init__( - self, - *, - workflow_type: builtins.str = ..., - workflow_id: builtins.str = ..., - arguments: collections.abc.Iterable[ - temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - randomness_seed: builtins.int = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - identity: builtins.str = ..., - parent_workflow_info: temporalio.bridge.proto.common.common_pb2.NamespacedWorkflowExecution - | None = ..., - workflow_execution_timeout: google.protobuf.duration_pb2.Duration | None = ..., - workflow_run_timeout: google.protobuf.duration_pb2.Duration | None = ..., - workflow_task_timeout: google.protobuf.duration_pb2.Duration | None = ..., - continued_from_execution_run_id: builtins.str = ..., - continued_initiator: temporalio.api.enums.v1.workflow_pb2.ContinueAsNewInitiator.ValueType = ..., - continued_failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., - last_completion_result: temporalio.api.common.v1.message_pb2.Payloads - | None = ..., - first_execution_run_id: builtins.str = ..., - retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., - attempt: builtins.int = ..., - cron_schedule: builtins.str = ..., - workflow_execution_expiration_time: google.protobuf.timestamp_pb2.Timestamp - | None = ..., - cron_schedule_to_schedule_interval: google.protobuf.duration_pb2.Duration - | None = ..., - memo: temporalio.api.common.v1.message_pb2.Memo | None = ..., - search_attributes: temporalio.api.common.v1.message_pb2.SearchAttributes - | None = ..., - start_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., - root_workflow: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., - priority: temporalio.api.common.v1.message_pb2.Priority | None = ..., - original_execution_run_id: builtins.str = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "continued_failure", - b"continued_failure", - "cron_schedule_to_schedule_interval", - b"cron_schedule_to_schedule_interval", - "last_completion_result", - b"last_completion_result", - "memo", - b"memo", - "parent_workflow_info", - b"parent_workflow_info", - "priority", - b"priority", - "retry_policy", - b"retry_policy", - "root_workflow", - b"root_workflow", - "search_attributes", - b"search_attributes", - "start_time", - b"start_time", - "workflow_execution_expiration_time", - b"workflow_execution_expiration_time", - "workflow_execution_timeout", - b"workflow_execution_timeout", - "workflow_run_timeout", - b"workflow_run_timeout", - "workflow_task_timeout", - b"workflow_task_timeout", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "arguments", - b"arguments", - "attempt", - b"attempt", - "continued_failure", - b"continued_failure", - "continued_from_execution_run_id", - b"continued_from_execution_run_id", - "continued_initiator", - b"continued_initiator", - "cron_schedule", - b"cron_schedule", - "cron_schedule_to_schedule_interval", - b"cron_schedule_to_schedule_interval", - "first_execution_run_id", - b"first_execution_run_id", - "headers", - b"headers", - "identity", - b"identity", - "last_completion_result", - b"last_completion_result", - "memo", - b"memo", - "original_execution_run_id", - b"original_execution_run_id", - "parent_workflow_info", - b"parent_workflow_info", - "priority", - b"priority", - "randomness_seed", - b"randomness_seed", - "retry_policy", - b"retry_policy", - "root_workflow", - b"root_workflow", - "search_attributes", - b"search_attributes", - "start_time", - b"start_time", - "workflow_execution_expiration_time", - b"workflow_execution_expiration_time", - "workflow_execution_timeout", - b"workflow_execution_timeout", - "workflow_id", - b"workflow_id", - "workflow_run_timeout", - b"workflow_run_timeout", - "workflow_task_timeout", - b"workflow_task_timeout", - "workflow_type", - b"workflow_type", - ], - ) -> None: ... - -global___InitializeWorkflow = InitializeWorkflow - -class FireTimer(google.protobuf.message.Message): - """Notify a workflow that a timer has fired""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - seq: builtins.int - """Sequence number as provided by lang in the corresponding StartTimer command""" - def __init__( - self, - *, - seq: builtins.int = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["seq", b"seq"] - ) -> None: ... - -global___FireTimer = FireTimer - -class ResolveActivity(google.protobuf.message.Message): - """Notify a workflow that an activity has been resolved""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - RESULT_FIELD_NUMBER: builtins.int - IS_LOCAL_FIELD_NUMBER: builtins.int - seq: builtins.int - """Sequence number as provided by lang in the corresponding ScheduleActivity command""" - @property - def result( - self, - ) -> ( - temporalio.bridge.proto.activity_result.activity_result_pb2.ActivityResolution - ): ... - is_local: builtins.bool - """Set to true if the resolution is for a local activity. This is used internally by Core and - lang does not need to care about it. - """ - def __init__( - self, - *, - seq: builtins.int = ..., - result: temporalio.bridge.proto.activity_result.activity_result_pb2.ActivityResolution - | None = ..., - is_local: builtins.bool = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["result", b"result"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "is_local", b"is_local", "result", b"result", "seq", b"seq" - ], - ) -> None: ... - -global___ResolveActivity = ResolveActivity - -class ResolveChildWorkflowExecutionStart(google.protobuf.message.Message): - """Notify a workflow that a start child workflow execution request has succeeded, failed or was - cancelled. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - SUCCEEDED_FIELD_NUMBER: builtins.int - FAILED_FIELD_NUMBER: builtins.int - CANCELLED_FIELD_NUMBER: builtins.int - seq: builtins.int - """Sequence number as provided by lang in the corresponding StartChildWorkflowExecution command""" - @property - def succeeded(self) -> global___ResolveChildWorkflowExecutionStartSuccess: ... - @property - def failed(self) -> global___ResolveChildWorkflowExecutionStartFailure: ... - @property - def cancelled(self) -> global___ResolveChildWorkflowExecutionStartCancelled: ... - def __init__( - self, - *, - seq: builtins.int = ..., - succeeded: global___ResolveChildWorkflowExecutionStartSuccess | None = ..., - failed: global___ResolveChildWorkflowExecutionStartFailure | None = ..., - cancelled: global___ResolveChildWorkflowExecutionStartCancelled | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "cancelled", - b"cancelled", - "failed", - b"failed", - "status", - b"status", - "succeeded", - b"succeeded", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "cancelled", - b"cancelled", - "failed", - b"failed", - "seq", - b"seq", - "status", - b"status", - "succeeded", - b"succeeded", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing_extensions.Literal["status", b"status"] - ) -> typing_extensions.Literal["succeeded", "failed", "cancelled"] | None: ... - -global___ResolveChildWorkflowExecutionStart = ResolveChildWorkflowExecutionStart - -class ResolveChildWorkflowExecutionStartSuccess(google.protobuf.message.Message): - """Simply pass the run_id to lang""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - RUN_ID_FIELD_NUMBER: builtins.int - run_id: builtins.str - def __init__( - self, - *, - run_id: builtins.str = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["run_id", b"run_id"] - ) -> None: ... - -global___ResolveChildWorkflowExecutionStartSuccess = ( - ResolveChildWorkflowExecutionStartSuccess -) - -class ResolveChildWorkflowExecutionStartFailure(google.protobuf.message.Message): - """Provide lang the cause of failure""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - WORKFLOW_ID_FIELD_NUMBER: builtins.int - WORKFLOW_TYPE_FIELD_NUMBER: builtins.int - CAUSE_FIELD_NUMBER: builtins.int - workflow_id: builtins.str - """Lang should have this information but it's more convenient to pass it back - for error construction on the lang side. - """ - workflow_type: builtins.str - cause: temporalio.bridge.proto.child_workflow.child_workflow_pb2.StartChildWorkflowExecutionFailedCause.ValueType - def __init__( - self, - *, - workflow_id: builtins.str = ..., - workflow_type: builtins.str = ..., - cause: temporalio.bridge.proto.child_workflow.child_workflow_pb2.StartChildWorkflowExecutionFailedCause.ValueType = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "cause", - b"cause", - "workflow_id", - b"workflow_id", - "workflow_type", - b"workflow_type", - ], - ) -> None: ... - -global___ResolveChildWorkflowExecutionStartFailure = ( - ResolveChildWorkflowExecutionStartFailure -) - -class ResolveChildWorkflowExecutionStartCancelled(google.protobuf.message.Message): - """`failure` should be ChildWorkflowFailure with cause set to CancelledFailure. - The failure is constructed in core for lang's convenience. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - FAILURE_FIELD_NUMBER: builtins.int - @property - def failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: ... - def __init__( - self, - *, - failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["failure", b"failure"] - ) -> builtins.bool: ... - def ClearField( - self, field_name: typing_extensions.Literal["failure", b"failure"] - ) -> None: ... - -global___ResolveChildWorkflowExecutionStartCancelled = ( - ResolveChildWorkflowExecutionStartCancelled -) - -class ResolveChildWorkflowExecution(google.protobuf.message.Message): - """Notify a workflow that a child workflow execution has been resolved""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - RESULT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Sequence number as provided by lang in the corresponding StartChildWorkflowExecution command""" - @property - def result( - self, - ) -> ( - temporalio.bridge.proto.child_workflow.child_workflow_pb2.ChildWorkflowResult - ): ... - def __init__( - self, - *, - seq: builtins.int = ..., - result: temporalio.bridge.proto.child_workflow.child_workflow_pb2.ChildWorkflowResult - | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["result", b"result"] - ) -> builtins.bool: ... - def ClearField( - self, field_name: typing_extensions.Literal["result", b"result", "seq", b"seq"] - ) -> None: ... - -global___ResolveChildWorkflowExecution = ResolveChildWorkflowExecution - -class UpdateRandomSeed(google.protobuf.message.Message): - """Update the workflow's random seed""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - RANDOMNESS_SEED_FIELD_NUMBER: builtins.int - randomness_seed: builtins.int - def __init__( - self, - *, - randomness_seed: builtins.int = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal["randomness_seed", b"randomness_seed"], - ) -> None: ... - -global___UpdateRandomSeed = UpdateRandomSeed - -class QueryWorkflow(google.protobuf.message.Message): - """Query a workflow""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - QUERY_ID_FIELD_NUMBER: builtins.int - QUERY_TYPE_FIELD_NUMBER: builtins.int - ARGUMENTS_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - query_id: builtins.str - """For PollWFTResp `query` field, this will be set to the special value `legacy`. For the - `queries` field, the server provides a unique identifier. If it is a `legacy` query, - lang cannot issue any commands in response other than to answer the query. - """ - query_type: builtins.str - """The query's function/method/etc name""" - @property - def arguments( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: ... - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """Headers attached to the query""" - def __init__( - self, - *, - query_id: builtins.str = ..., - query_type: builtins.str = ..., - arguments: collections.abc.Iterable[ - temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "arguments", - b"arguments", - "headers", - b"headers", - "query_id", - b"query_id", - "query_type", - b"query_type", - ], - ) -> None: ... - -global___QueryWorkflow = QueryWorkflow - -class CancelWorkflow(google.protobuf.message.Message): - """Cancel a running workflow""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - REASON_FIELD_NUMBER: builtins.int - reason: builtins.str - """User-specified reason the cancel request was issued""" - def __init__( - self, - *, - reason: builtins.str = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["reason", b"reason"] - ) -> None: ... - -global___CancelWorkflow = CancelWorkflow - -class SignalWorkflow(google.protobuf.message.Message): - """Send a signal to a workflow""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - SIGNAL_NAME_FIELD_NUMBER: builtins.int - INPUT_FIELD_NUMBER: builtins.int - IDENTITY_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - ORIGINATING_EVENT_ID_FIELD_NUMBER: builtins.int - signal_name: builtins.str - @property - def input( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: ... - identity: builtins.str - """Identity of the sender of the signal""" - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """Headers attached to the signal""" - originating_event_id: builtins.int - """Event ID of the `WORKFLOW_EXECUTION_SIGNALED` history event that produced this job.""" - def __init__( - self, - *, - signal_name: builtins.str = ..., - input: collections.abc.Iterable[temporalio.api.common.v1.message_pb2.Payload] - | None = ..., - identity: builtins.str = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - originating_event_id: builtins.int = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "headers", - b"headers", - "identity", - b"identity", - "input", - b"input", - "originating_event_id", - b"originating_event_id", - "signal_name", - b"signal_name", - ], - ) -> None: ... - -global___SignalWorkflow = SignalWorkflow - -class NotifyHasPatch(google.protobuf.message.Message): - """Inform lang what the result of a call to `patched` or similar API should be -- this is always - sent pre-emptively, so any time it is sent the change is present - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - PATCH_ID_FIELD_NUMBER: builtins.int - patch_id: builtins.str - def __init__( - self, - *, - patch_id: builtins.str = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["patch_id", b"patch_id"] - ) -> None: ... - -global___NotifyHasPatch = NotifyHasPatch - -class ResolveSignalExternalWorkflow(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - FAILURE_FIELD_NUMBER: builtins.int - seq: builtins.int - """Sequence number as provided by lang in the corresponding SignalExternalWorkflowExecution - command - """ - @property - def failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: - """If populated, this signal either failed to be sent or was cancelled depending on failure - type / info. - """ - def __init__( - self, - *, - seq: builtins.int = ..., - failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["failure", b"failure"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["failure", b"failure", "seq", b"seq"], - ) -> None: ... - -global___ResolveSignalExternalWorkflow = ResolveSignalExternalWorkflow - -class ResolveRequestCancelExternalWorkflow(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - FAILURE_FIELD_NUMBER: builtins.int - seq: builtins.int - """Sequence number as provided by lang in the corresponding - RequestCancelExternalWorkflowExecution command - """ - @property - def failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: - """If populated, this signal either failed to be sent or was cancelled depending on failure - type / info. - """ - def __init__( - self, - *, - seq: builtins.int = ..., - failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["failure", b"failure"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["failure", b"failure", "seq", b"seq"], - ) -> None: ... - -global___ResolveRequestCancelExternalWorkflow = ResolveRequestCancelExternalWorkflow - -class DoUpdate(google.protobuf.message.Message): - """Lang is requested to invoke an update handler on the workflow. Lang should invoke the update - validator first (if requested). If it accepts the update, immediately invoke the update handler. - Lang must reply to the activation containing this job with an `UpdateResponse`. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - ID_FIELD_NUMBER: builtins.int - PROTOCOL_INSTANCE_ID_FIELD_NUMBER: builtins.int - NAME_FIELD_NUMBER: builtins.int - INPUT_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - META_FIELD_NUMBER: builtins.int - RUN_VALIDATOR_FIELD_NUMBER: builtins.int - id: builtins.str - """A workflow-unique identifier for this update""" - protocol_instance_id: builtins.str - """The protocol message instance ID - this is used to uniquely track the ID server side and - internally. - """ - name: builtins.str - """The name of the update handler""" - @property - def input( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: - """The input to the update""" - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """Headers attached to the update""" - @property - def meta(self) -> temporalio.api.update.v1.message_pb2.Meta: - """Remaining metadata associated with the update. The `update_id` field is stripped from here - and moved to `id`, since it is guaranteed to be present. - """ - run_validator: builtins.bool - """If set true, lang must run the update's validator before running the handler. This will be - set false during replay, since validation is not re-run during replay. - """ - def __init__( - self, - *, - id: builtins.str = ..., - protocol_instance_id: builtins.str = ..., - name: builtins.str = ..., - input: collections.abc.Iterable[temporalio.api.common.v1.message_pb2.Payload] - | None = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - meta: temporalio.api.update.v1.message_pb2.Meta | None = ..., - run_validator: builtins.bool = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["meta", b"meta"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "headers", - b"headers", - "id", - b"id", - "input", - b"input", - "meta", - b"meta", - "name", - b"name", - "protocol_instance_id", - b"protocol_instance_id", - "run_validator", - b"run_validator", - ], - ) -> None: ... - -global___DoUpdate = DoUpdate - -class ResolveNexusOperationStart(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - OPERATION_TOKEN_FIELD_NUMBER: builtins.int - STARTED_SYNC_FIELD_NUMBER: builtins.int - FAILED_FIELD_NUMBER: builtins.int - seq: builtins.int - """Sequence number as provided by lang in the corresponding ScheduleNexusOperation command""" - operation_token: builtins.str - """The operation started asynchronously. Contains a token that can be used to perform - operations on the started operation by, ex, clients. A `ResolveNexusOperation` job will - follow at some point. - """ - started_sync: builtins.bool - """If true the operation "started" but only because it's also already resolved. A - `ResolveNexusOperation` job will be in the same activation. - """ - @property - def failed(self) -> temporalio.api.failure.v1.message_pb2.Failure: - """The operation either failed to start, was cancelled before it started, timed out, or - failed synchronously. Details are included inside the message. In this case, the - subsequent ResolveNexusOperation will never be sent. - """ - def __init__( - self, - *, - seq: builtins.int = ..., - operation_token: builtins.str = ..., - started_sync: builtins.bool = ..., - failed: temporalio.api.failure.v1.message_pb2.Failure | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "failed", - b"failed", - "operation_token", - b"operation_token", - "started_sync", - b"started_sync", - "status", - b"status", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "failed", - b"failed", - "operation_token", - b"operation_token", - "seq", - b"seq", - "started_sync", - b"started_sync", - "status", - b"status", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing_extensions.Literal["status", b"status"] - ) -> ( - typing_extensions.Literal["operation_token", "started_sync", "failed"] | None - ): ... - -global___ResolveNexusOperationStart = ResolveNexusOperationStart - -class ResolveNexusOperation(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - RESULT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Sequence number as provided by lang in the corresponding ScheduleNexusOperation command""" - @property - def result( - self, - ) -> temporalio.bridge.proto.nexus.nexus_pb2.NexusOperationResult: ... - def __init__( - self, - *, - seq: builtins.int = ..., - result: temporalio.bridge.proto.nexus.nexus_pb2.NexusOperationResult - | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["result", b"result"] - ) -> builtins.bool: ... - def ClearField( - self, field_name: typing_extensions.Literal["result", b"result", "seq", b"seq"] - ) -> None: ... - -global___ResolveNexusOperation = ResolveNexusOperation - -class DeliverStreamMessages(google.protobuf.message.Message): - """Hand a workflow the next range of a stream it subscribed to. - - The range is delivered once, on the task the server decided it belongs to, - and the offsets it covered are recorded in History rather than the payloads. - On replay the server re-supplies the same range by reading the stream again, - so this job appears at the same point with the same contents both times. - - An empty range is still delivered: a task where the subscription saw nothing - is a fact replay has to reproduce, not an absence of one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - FROM_OFFSET_FIELD_NUMBER: builtins.int - TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Id of the stream this range came from.""" - from_offset: builtins.int - """Inclusive.""" - to_offset: builtins.int - """Exclusive. Equal to from_offset when the subscription saw nothing.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - from_offset: builtins.int = ..., - to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "from_offset", - b"from_offset", - "messages", - b"messages", - "stream_id", - b"stream_id", - "to_offset", - b"to_offset", - ], - ) -> None: ... - -global___DeliverStreamMessages = DeliverStreamMessages - -class RemoveFromCache(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class _EvictionReason: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - - class _EvictionReasonEnumTypeWrapper( - google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ - RemoveFromCache._EvictionReason.ValueType - ], - builtins.type, - ): # noqa: F821 - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - UNSPECIFIED: RemoveFromCache._EvictionReason.ValueType # 0 - CACHE_FULL: RemoveFromCache._EvictionReason.ValueType # 1 - """Workflow cache is full""" - CACHE_MISS: RemoveFromCache._EvictionReason.ValueType # 2 - """Workflow received a partial task but was not in the cache. Typically it won't be in the - lang cache either at this point, but we send an eviction to be sure. - """ - NONDETERMINISM: RemoveFromCache._EvictionReason.ValueType # 3 - """The workflow produced results inconsistent with history.""" - LANG_FAIL: RemoveFromCache._EvictionReason.ValueType # 4 - """The lang side completed the workflow activation with a failure.""" - LANG_REQUESTED: RemoveFromCache._EvictionReason.ValueType # 5 - """The lang side explicitly requested this workflow be evicted.""" - TASK_NOT_FOUND: RemoveFromCache._EvictionReason.ValueType # 6 - """The workflow task we tried to respond to didn't exist. The workflow might have already - finished, or the WFT timed out but we didn't learn about that yet. - """ - UNHANDLED_COMMAND: RemoveFromCache._EvictionReason.ValueType # 7 - """There was new work that must be handled while we attempted to complete the WFT. Ex: - a new signal came in while trying to complete the workflow. - """ - FATAL: RemoveFromCache._EvictionReason.ValueType # 8 - """There was some fatal error processing the workflow, typically an internal error, but - can also happen if then network drops out while paginating. Check message string. - """ - PAGINATION_OR_HISTORY_FETCH: RemoveFromCache._EvictionReason.ValueType # 9 - """Something went wrong attempting to fetch more history events.""" - WORKFLOW_EXECUTION_ENDING: RemoveFromCache._EvictionReason.ValueType # 10 - """The workflow is being completed with a terminal command and we sent the WFT completion - to server successfully. - """ - - class EvictionReason(_EvictionReason, metaclass=_EvictionReasonEnumTypeWrapper): ... - UNSPECIFIED: RemoveFromCache.EvictionReason.ValueType # 0 - CACHE_FULL: RemoveFromCache.EvictionReason.ValueType # 1 - """Workflow cache is full""" - CACHE_MISS: RemoveFromCache.EvictionReason.ValueType # 2 - """Workflow received a partial task but was not in the cache. Typically it won't be in the - lang cache either at this point, but we send an eviction to be sure. - """ - NONDETERMINISM: RemoveFromCache.EvictionReason.ValueType # 3 - """The workflow produced results inconsistent with history.""" - LANG_FAIL: RemoveFromCache.EvictionReason.ValueType # 4 - """The lang side completed the workflow activation with a failure.""" - LANG_REQUESTED: RemoveFromCache.EvictionReason.ValueType # 5 - """The lang side explicitly requested this workflow be evicted.""" - TASK_NOT_FOUND: RemoveFromCache.EvictionReason.ValueType # 6 - """The workflow task we tried to respond to didn't exist. The workflow might have already - finished, or the WFT timed out but we didn't learn about that yet. - """ - UNHANDLED_COMMAND: RemoveFromCache.EvictionReason.ValueType # 7 - """There was new work that must be handled while we attempted to complete the WFT. Ex: - a new signal came in while trying to complete the workflow. - """ - FATAL: RemoveFromCache.EvictionReason.ValueType # 8 - """There was some fatal error processing the workflow, typically an internal error, but - can also happen if then network drops out while paginating. Check message string. - """ - PAGINATION_OR_HISTORY_FETCH: RemoveFromCache.EvictionReason.ValueType # 9 - """Something went wrong attempting to fetch more history events.""" - WORKFLOW_EXECUTION_ENDING: RemoveFromCache.EvictionReason.ValueType # 10 - """The workflow is being completed with a terminal command and we sent the WFT completion - to server successfully. - """ - - MESSAGE_FIELD_NUMBER: builtins.int - REASON_FIELD_NUMBER: builtins.int - message: builtins.str - reason: global___RemoveFromCache.EvictionReason.ValueType - def __init__( - self, - *, - message: builtins.str = ..., - reason: global___RemoveFromCache.EvictionReason.ValueType = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "message", b"message", "reason", b"reason" - ], - ) -> None: ... - -global___RemoveFromCache = RemoveFromCache +import datetime + +from google.protobuf import timestamp_pb2 as _timestamp_pb2 +from google.protobuf import duration_pb2 as _duration_pb2 +from google.protobuf import empty_pb2 as _empty_pb2 +from temporalio.api.failure.v1 import message_pb2 as _message_pb2 +from temporalio.api.update.v1 import message_pb2 as _message_pb2_1 +from temporalio.api.common.v1 import message_pb2 as _message_pb2_1_1 +from temporalio.api.stream.v1 import message_pb2 as _message_pb2_1_1_1 +from temporalio.api.enums.v1 import workflow_pb2 as _workflow_pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as _activity_result_pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as _child_workflow_pb2 +from temporalio.bridge.proto.common import common_pb2 as _common_pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as _nexus_pb2 +from temporalio.bridge.proto.external_data import external_data_pb2 as _external_data_pb2 +from temporalio.bridge.proto.workflow_commands import workflow_commands_pb2 as _workflow_commands_pb2 +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Iterable as _Iterable, Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class WorkflowActivation(_message.Message): + __slots__ = ("run_id", "timestamp", "is_replaying", "history_length", "jobs", "available_internal_flags", "history_size_bytes", "continue_as_new_suggested", "deployment_version_for_current_task", "last_sdk_version", "suggest_continue_as_new_reasons", "target_worker_deployment_version_changed", "history_floor_event_id") + RUN_ID_FIELD_NUMBER: _ClassVar[int] + TIMESTAMP_FIELD_NUMBER: _ClassVar[int] + IS_REPLAYING_FIELD_NUMBER: _ClassVar[int] + HISTORY_LENGTH_FIELD_NUMBER: _ClassVar[int] + JOBS_FIELD_NUMBER: _ClassVar[int] + AVAILABLE_INTERNAL_FLAGS_FIELD_NUMBER: _ClassVar[int] + HISTORY_SIZE_BYTES_FIELD_NUMBER: _ClassVar[int] + CONTINUE_AS_NEW_SUGGESTED_FIELD_NUMBER: _ClassVar[int] + DEPLOYMENT_VERSION_FOR_CURRENT_TASK_FIELD_NUMBER: _ClassVar[int] + LAST_SDK_VERSION_FIELD_NUMBER: _ClassVar[int] + SUGGEST_CONTINUE_AS_NEW_REASONS_FIELD_NUMBER: _ClassVar[int] + TARGET_WORKER_DEPLOYMENT_VERSION_CHANGED_FIELD_NUMBER: _ClassVar[int] + HISTORY_FLOOR_EVENT_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + timestamp: _timestamp_pb2.Timestamp + is_replaying: bool + history_length: int + jobs: _containers.RepeatedCompositeFieldContainer[WorkflowActivationJob] + available_internal_flags: _containers.RepeatedScalarFieldContainer[int] + history_size_bytes: int + continue_as_new_suggested: bool + deployment_version_for_current_task: _common_pb2.WorkerDeploymentVersion + last_sdk_version: str + suggest_continue_as_new_reasons: _containers.RepeatedScalarFieldContainer[_workflow_pb2.SuggestContinueAsNewReason] + target_worker_deployment_version_changed: bool + history_floor_event_id: int + def __init__(self, run_id: _Optional[str] = ..., timestamp: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., is_replaying: _Optional[bool] = ..., history_length: _Optional[int] = ..., jobs: _Optional[_Iterable[_Union[WorkflowActivationJob, _Mapping]]] = ..., available_internal_flags: _Optional[_Iterable[int]] = ..., history_size_bytes: _Optional[int] = ..., continue_as_new_suggested: _Optional[bool] = ..., deployment_version_for_current_task: _Optional[_Union[_common_pb2.WorkerDeploymentVersion, _Mapping]] = ..., last_sdk_version: _Optional[str] = ..., suggest_continue_as_new_reasons: _Optional[_Iterable[_Union[_workflow_pb2.SuggestContinueAsNewReason, str]]] = ..., target_worker_deployment_version_changed: _Optional[bool] = ..., history_floor_event_id: _Optional[int] = ...) -> None: ... + +class WorkflowActivationJob(_message.Message): + __slots__ = ("initialize_workflow", "fire_timer", "update_random_seed", "query_workflow", "cancel_workflow", "signal_workflow", "resolve_activity", "notify_has_patch", "resolve_child_workflow_execution_start", "resolve_child_workflow_execution", "resolve_signal_external_workflow", "resolve_request_cancel_external_workflow", "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", "resolve_external_stream_waits", "prepare_external_stream_park", "replay_external_streams", "finalize_external_streams", "deliver_stream_messages", "remove_from_cache") + INITIALIZE_WORKFLOW_FIELD_NUMBER: _ClassVar[int] + FIRE_TIMER_FIELD_NUMBER: _ClassVar[int] + UPDATE_RANDOM_SEED_FIELD_NUMBER: _ClassVar[int] + QUERY_WORKFLOW_FIELD_NUMBER: _ClassVar[int] + CANCEL_WORKFLOW_FIELD_NUMBER: _ClassVar[int] + SIGNAL_WORKFLOW_FIELD_NUMBER: _ClassVar[int] + RESOLVE_ACTIVITY_FIELD_NUMBER: _ClassVar[int] + NOTIFY_HAS_PATCH_FIELD_NUMBER: _ClassVar[int] + RESOLVE_CHILD_WORKFLOW_EXECUTION_START_FIELD_NUMBER: _ClassVar[int] + RESOLVE_CHILD_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + RESOLVE_SIGNAL_EXTERNAL_WORKFLOW_FIELD_NUMBER: _ClassVar[int] + RESOLVE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_FIELD_NUMBER: _ClassVar[int] + DO_UPDATE_FIELD_NUMBER: _ClassVar[int] + RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: _ClassVar[int] + RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: _ClassVar[int] + RESOLVE_EXTERNAL_STREAM_WAITS_FIELD_NUMBER: _ClassVar[int] + PREPARE_EXTERNAL_STREAM_PARK_FIELD_NUMBER: _ClassVar[int] + REPLAY_EXTERNAL_STREAMS_FIELD_NUMBER: _ClassVar[int] + FINALIZE_EXTERNAL_STREAMS_FIELD_NUMBER: _ClassVar[int] + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: _ClassVar[int] + REMOVE_FROM_CACHE_FIELD_NUMBER: _ClassVar[int] + initialize_workflow: InitializeWorkflow + fire_timer: FireTimer + update_random_seed: UpdateRandomSeed + query_workflow: QueryWorkflow + cancel_workflow: CancelWorkflow + signal_workflow: SignalWorkflow + resolve_activity: ResolveActivity + notify_has_patch: NotifyHasPatch + resolve_child_workflow_execution_start: ResolveChildWorkflowExecutionStart + resolve_child_workflow_execution: ResolveChildWorkflowExecution + resolve_signal_external_workflow: ResolveSignalExternalWorkflow + resolve_request_cancel_external_workflow: ResolveRequestCancelExternalWorkflow + do_update: DoUpdate + resolve_nexus_operation_start: ResolveNexusOperationStart + resolve_nexus_operation: ResolveNexusOperation + resolve_external_stream_waits: ResolveExternalStreamWaits + prepare_external_stream_park: PrepareExternalStreamPark + replay_external_streams: ReplayExternalStreams + finalize_external_streams: FinalizeExternalStreams + deliver_stream_messages: DeliverStreamMessages + remove_from_cache: RemoveFromCache + def __init__(self, initialize_workflow: _Optional[_Union[InitializeWorkflow, _Mapping]] = ..., fire_timer: _Optional[_Union[FireTimer, _Mapping]] = ..., update_random_seed: _Optional[_Union[UpdateRandomSeed, _Mapping]] = ..., query_workflow: _Optional[_Union[QueryWorkflow, _Mapping]] = ..., cancel_workflow: _Optional[_Union[CancelWorkflow, _Mapping]] = ..., signal_workflow: _Optional[_Union[SignalWorkflow, _Mapping]] = ..., resolve_activity: _Optional[_Union[ResolveActivity, _Mapping]] = ..., notify_has_patch: _Optional[_Union[NotifyHasPatch, _Mapping]] = ..., resolve_child_workflow_execution_start: _Optional[_Union[ResolveChildWorkflowExecutionStart, _Mapping]] = ..., resolve_child_workflow_execution: _Optional[_Union[ResolveChildWorkflowExecution, _Mapping]] = ..., resolve_signal_external_workflow: _Optional[_Union[ResolveSignalExternalWorkflow, _Mapping]] = ..., resolve_request_cancel_external_workflow: _Optional[_Union[ResolveRequestCancelExternalWorkflow, _Mapping]] = ..., do_update: _Optional[_Union[DoUpdate, _Mapping]] = ..., resolve_nexus_operation_start: _Optional[_Union[ResolveNexusOperationStart, _Mapping]] = ..., resolve_nexus_operation: _Optional[_Union[ResolveNexusOperation, _Mapping]] = ..., resolve_external_stream_waits: _Optional[_Union[ResolveExternalStreamWaits, _Mapping]] = ..., prepare_external_stream_park: _Optional[_Union[PrepareExternalStreamPark, _Mapping]] = ..., replay_external_streams: _Optional[_Union[ReplayExternalStreams, _Mapping]] = ..., finalize_external_streams: _Optional[_Union[FinalizeExternalStreams, _Mapping]] = ..., deliver_stream_messages: _Optional[_Union[DeliverStreamMessages, _Mapping]] = ..., remove_from_cache: _Optional[_Union[RemoveFromCache, _Mapping]] = ...) -> None: ... + +class ResolveExternalStreamWaits(_message.Message): + __slots__ = ("quiescence_generation", "ready_hints") + QUIESCENCE_GENERATION_FIELD_NUMBER: _ClassVar[int] + READY_HINTS_FIELD_NUMBER: _ClassVar[int] + quiescence_generation: int + ready_hints: _containers.RepeatedCompositeFieldContainer[_workflow_commands_pb2.ExternalStreamWait] + def __init__(self, quiescence_generation: _Optional[int] = ..., ready_hints: _Optional[_Iterable[_Union[_workflow_commands_pb2.ExternalStreamWait, _Mapping]]] = ...) -> None: ... + +class PrepareExternalStreamPark(_message.Message): + __slots__ = ("quiescence_generation", "waits", "reason") + QUIESCENCE_GENERATION_FIELD_NUMBER: _ClassVar[int] + WAITS_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + quiescence_generation: int + waits: _containers.RepeatedCompositeFieldContainer[_workflow_commands_pb2.ExternalStreamWait] + reason: _external_data_pb2.ParkReason + def __init__(self, quiescence_generation: _Optional[int] = ..., waits: _Optional[_Iterable[_Union[_workflow_commands_pb2.ExternalStreamWait, _Mapping]]] = ..., reason: _Optional[_Union[_external_data_pb2.ParkReason, str]] = ...) -> None: ... + +class ReplayExternalStreams(_message.Message): + __slots__ = ("quiescence_generation", "waits", "replay_annotation", "terminal_boundary", "output") + QUIESCENCE_GENERATION_FIELD_NUMBER: _ClassVar[int] + WAITS_FIELD_NUMBER: _ClassVar[int] + REPLAY_ANNOTATION_FIELD_NUMBER: _ClassVar[int] + TERMINAL_BOUNDARY_FIELD_NUMBER: _ClassVar[int] + OUTPUT_FIELD_NUMBER: _ClassVar[int] + quiescence_generation: int + waits: _containers.RepeatedCompositeFieldContainer[_workflow_commands_pb2.ExternalStreamWait] + replay_annotation: bytes + terminal_boundary: _external_data_pb2.ParkReason + output: _external_data_pb2.ExternalOutputStreamManifest + def __init__(self, quiescence_generation: _Optional[int] = ..., waits: _Optional[_Iterable[_Union[_workflow_commands_pb2.ExternalStreamWait, _Mapping]]] = ..., replay_annotation: _Optional[bytes] = ..., terminal_boundary: _Optional[_Union[_external_data_pb2.ParkReason, str]] = ..., output: _Optional[_Union[_external_data_pb2.ExternalOutputStreamManifest, _Mapping]] = ...) -> None: ... + +class FinalizeExternalStreams(_message.Message): + __slots__ = ("quiescence_generation", "waits", "reason") + QUIESCENCE_GENERATION_FIELD_NUMBER: _ClassVar[int] + WAITS_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + quiescence_generation: int + waits: _containers.RepeatedCompositeFieldContainer[_workflow_commands_pb2.ExternalStreamWait] + reason: _external_data_pb2.ParkReason + def __init__(self, quiescence_generation: _Optional[int] = ..., waits: _Optional[_Iterable[_Union[_workflow_commands_pb2.ExternalStreamWait, _Mapping]]] = ..., reason: _Optional[_Union[_external_data_pb2.ParkReason, str]] = ...) -> None: ... + +class DeliverStreamMessages(_message.Message): + __slots__ = ("stream_id", "from_offset", "to_offset", "messages") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + TO_OFFSET_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + stream_id: str + from_offset: int + to_offset: int + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2_1_1_1.StreamMessage] + def __init__(self, stream_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., to_offset: _Optional[int] = ..., messages: _Optional[_Iterable[_Union[_message_pb2_1_1_1.StreamMessage, _Mapping]]] = ...) -> None: ... + +class InitializeWorkflow(_message.Message): + __slots__ = ("workflow_type", "workflow_id", "arguments", "randomness_seed", "headers", "identity", "parent_workflow_info", "workflow_execution_timeout", "workflow_run_timeout", "workflow_task_timeout", "continued_from_execution_run_id", "continued_initiator", "continued_failure", "last_completion_result", "first_execution_run_id", "retry_policy", "attempt", "cron_schedule", "workflow_execution_expiration_time", "cron_schedule_to_schedule_interval", "memo", "search_attributes", "start_time", "root_workflow", "priority", "original_execution_run_id") + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2_1_1.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2_1_1.Payload, _Mapping]] = ...) -> None: ... + WORKFLOW_TYPE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + ARGUMENTS_FIELD_NUMBER: _ClassVar[int] + RANDOMNESS_SEED_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + IDENTITY_FIELD_NUMBER: _ClassVar[int] + PARENT_WORKFLOW_INFO_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_EXECUTION_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_RUN_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_TASK_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + CONTINUED_FROM_EXECUTION_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CONTINUED_INITIATOR_FIELD_NUMBER: _ClassVar[int] + CONTINUED_FAILURE_FIELD_NUMBER: _ClassVar[int] + LAST_COMPLETION_RESULT_FIELD_NUMBER: _ClassVar[int] + FIRST_EXECUTION_RUN_ID_FIELD_NUMBER: _ClassVar[int] + RETRY_POLICY_FIELD_NUMBER: _ClassVar[int] + ATTEMPT_FIELD_NUMBER: _ClassVar[int] + CRON_SCHEDULE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_EXECUTION_EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + CRON_SCHEDULE_TO_SCHEDULE_INTERVAL_FIELD_NUMBER: _ClassVar[int] + MEMO_FIELD_NUMBER: _ClassVar[int] + SEARCH_ATTRIBUTES_FIELD_NUMBER: _ClassVar[int] + START_TIME_FIELD_NUMBER: _ClassVar[int] + ROOT_WORKFLOW_FIELD_NUMBER: _ClassVar[int] + PRIORITY_FIELD_NUMBER: _ClassVar[int] + ORIGINAL_EXECUTION_RUN_ID_FIELD_NUMBER: _ClassVar[int] + workflow_type: str + workflow_id: str + arguments: _containers.RepeatedCompositeFieldContainer[_message_pb2_1_1.Payload] + randomness_seed: int + headers: _containers.MessageMap[str, _message_pb2_1_1.Payload] + identity: str + parent_workflow_info: _common_pb2.NamespacedWorkflowExecution + workflow_execution_timeout: _duration_pb2.Duration + workflow_run_timeout: _duration_pb2.Duration + workflow_task_timeout: _duration_pb2.Duration + continued_from_execution_run_id: str + continued_initiator: _workflow_pb2.ContinueAsNewInitiator + continued_failure: _message_pb2.Failure + last_completion_result: _message_pb2_1_1.Payloads + first_execution_run_id: str + retry_policy: _message_pb2_1_1.RetryPolicy + attempt: int + cron_schedule: str + workflow_execution_expiration_time: _timestamp_pb2.Timestamp + cron_schedule_to_schedule_interval: _duration_pb2.Duration + memo: _message_pb2_1_1.Memo + search_attributes: _message_pb2_1_1.SearchAttributes + start_time: _timestamp_pb2.Timestamp + root_workflow: _message_pb2_1_1.WorkflowExecution + priority: _message_pb2_1_1.Priority + original_execution_run_id: str + def __init__(self, workflow_type: _Optional[str] = ..., workflow_id: _Optional[str] = ..., arguments: _Optional[_Iterable[_Union[_message_pb2_1_1.Payload, _Mapping]]] = ..., randomness_seed: _Optional[int] = ..., headers: _Optional[_Mapping[str, _message_pb2_1_1.Payload]] = ..., identity: _Optional[str] = ..., parent_workflow_info: _Optional[_Union[_common_pb2.NamespacedWorkflowExecution, _Mapping]] = ..., workflow_execution_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., workflow_run_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., workflow_task_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., continued_from_execution_run_id: _Optional[str] = ..., continued_initiator: _Optional[_Union[_workflow_pb2.ContinueAsNewInitiator, str]] = ..., continued_failure: _Optional[_Union[_message_pb2.Failure, _Mapping]] = ..., last_completion_result: _Optional[_Union[_message_pb2_1_1.Payloads, _Mapping]] = ..., first_execution_run_id: _Optional[str] = ..., retry_policy: _Optional[_Union[_message_pb2_1_1.RetryPolicy, _Mapping]] = ..., attempt: _Optional[int] = ..., cron_schedule: _Optional[str] = ..., workflow_execution_expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., cron_schedule_to_schedule_interval: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., memo: _Optional[_Union[_message_pb2_1_1.Memo, _Mapping]] = ..., search_attributes: _Optional[_Union[_message_pb2_1_1.SearchAttributes, _Mapping]] = ..., start_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., root_workflow: _Optional[_Union[_message_pb2_1_1.WorkflowExecution, _Mapping]] = ..., priority: _Optional[_Union[_message_pb2_1_1.Priority, _Mapping]] = ..., original_execution_run_id: _Optional[str] = ...) -> None: ... + +class FireTimer(_message.Message): + __slots__ = ("seq",) + SEQ_FIELD_NUMBER: _ClassVar[int] + seq: int + def __init__(self, seq: _Optional[int] = ...) -> None: ... + +class ResolveActivity(_message.Message): + __slots__ = ("seq", "result", "is_local") + SEQ_FIELD_NUMBER: _ClassVar[int] + RESULT_FIELD_NUMBER: _ClassVar[int] + IS_LOCAL_FIELD_NUMBER: _ClassVar[int] + seq: int + result: _activity_result_pb2.ActivityResolution + is_local: bool + def __init__(self, seq: _Optional[int] = ..., result: _Optional[_Union[_activity_result_pb2.ActivityResolution, _Mapping]] = ..., is_local: _Optional[bool] = ...) -> None: ... + +class ResolveChildWorkflowExecutionStart(_message.Message): + __slots__ = ("seq", "succeeded", "failed", "cancelled") + SEQ_FIELD_NUMBER: _ClassVar[int] + SUCCEEDED_FIELD_NUMBER: _ClassVar[int] + FAILED_FIELD_NUMBER: _ClassVar[int] + CANCELLED_FIELD_NUMBER: _ClassVar[int] + seq: int + succeeded: ResolveChildWorkflowExecutionStartSuccess + failed: ResolveChildWorkflowExecutionStartFailure + cancelled: ResolveChildWorkflowExecutionStartCancelled + def __init__(self, seq: _Optional[int] = ..., succeeded: _Optional[_Union[ResolveChildWorkflowExecutionStartSuccess, _Mapping]] = ..., failed: _Optional[_Union[ResolveChildWorkflowExecutionStartFailure, _Mapping]] = ..., cancelled: _Optional[_Union[ResolveChildWorkflowExecutionStartCancelled, _Mapping]] = ...) -> None: ... + +class ResolveChildWorkflowExecutionStartSuccess(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class ResolveChildWorkflowExecutionStartFailure(_message.Message): + __slots__ = ("workflow_id", "workflow_type", "cause") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_TYPE_FIELD_NUMBER: _ClassVar[int] + CAUSE_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + workflow_type: str + cause: _child_workflow_pb2.StartChildWorkflowExecutionFailedCause + def __init__(self, workflow_id: _Optional[str] = ..., workflow_type: _Optional[str] = ..., cause: _Optional[_Union[_child_workflow_pb2.StartChildWorkflowExecutionFailedCause, str]] = ...) -> None: ... + +class ResolveChildWorkflowExecutionStartCancelled(_message.Message): + __slots__ = ("failure",) + FAILURE_FIELD_NUMBER: _ClassVar[int] + failure: _message_pb2.Failure + def __init__(self, failure: _Optional[_Union[_message_pb2.Failure, _Mapping]] = ...) -> None: ... + +class ResolveChildWorkflowExecution(_message.Message): + __slots__ = ("seq", "result") + SEQ_FIELD_NUMBER: _ClassVar[int] + RESULT_FIELD_NUMBER: _ClassVar[int] + seq: int + result: _child_workflow_pb2.ChildWorkflowResult + def __init__(self, seq: _Optional[int] = ..., result: _Optional[_Union[_child_workflow_pb2.ChildWorkflowResult, _Mapping]] = ...) -> None: ... + +class UpdateRandomSeed(_message.Message): + __slots__ = ("randomness_seed",) + RANDOMNESS_SEED_FIELD_NUMBER: _ClassVar[int] + randomness_seed: int + def __init__(self, randomness_seed: _Optional[int] = ...) -> None: ... + +class QueryWorkflow(_message.Message): + __slots__ = ("query_id", "query_type", "arguments", "headers") + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2_1_1.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2_1_1.Payload, _Mapping]] = ...) -> None: ... + QUERY_ID_FIELD_NUMBER: _ClassVar[int] + QUERY_TYPE_FIELD_NUMBER: _ClassVar[int] + ARGUMENTS_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + query_id: str + query_type: str + arguments: _containers.RepeatedCompositeFieldContainer[_message_pb2_1_1.Payload] + headers: _containers.MessageMap[str, _message_pb2_1_1.Payload] + def __init__(self, query_id: _Optional[str] = ..., query_type: _Optional[str] = ..., arguments: _Optional[_Iterable[_Union[_message_pb2_1_1.Payload, _Mapping]]] = ..., headers: _Optional[_Mapping[str, _message_pb2_1_1.Payload]] = ...) -> None: ... + +class CancelWorkflow(_message.Message): + __slots__ = ("reason",) + REASON_FIELD_NUMBER: _ClassVar[int] + reason: str + def __init__(self, reason: _Optional[str] = ...) -> None: ... + +class SignalWorkflow(_message.Message): + __slots__ = ("signal_name", "input", "identity", "headers", "originating_event_id") + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2_1_1.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2_1_1.Payload, _Mapping]] = ...) -> None: ... + SIGNAL_NAME_FIELD_NUMBER: _ClassVar[int] + INPUT_FIELD_NUMBER: _ClassVar[int] + IDENTITY_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + ORIGINATING_EVENT_ID_FIELD_NUMBER: _ClassVar[int] + signal_name: str + input: _containers.RepeatedCompositeFieldContainer[_message_pb2_1_1.Payload] + identity: str + headers: _containers.MessageMap[str, _message_pb2_1_1.Payload] + originating_event_id: int + def __init__(self, signal_name: _Optional[str] = ..., input: _Optional[_Iterable[_Union[_message_pb2_1_1.Payload, _Mapping]]] = ..., identity: _Optional[str] = ..., headers: _Optional[_Mapping[str, _message_pb2_1_1.Payload]] = ..., originating_event_id: _Optional[int] = ...) -> None: ... + +class NotifyHasPatch(_message.Message): + __slots__ = ("patch_id",) + PATCH_ID_FIELD_NUMBER: _ClassVar[int] + patch_id: str + def __init__(self, patch_id: _Optional[str] = ...) -> None: ... + +class ResolveSignalExternalWorkflow(_message.Message): + __slots__ = ("seq", "failure") + SEQ_FIELD_NUMBER: _ClassVar[int] + FAILURE_FIELD_NUMBER: _ClassVar[int] + seq: int + failure: _message_pb2.Failure + def __init__(self, seq: _Optional[int] = ..., failure: _Optional[_Union[_message_pb2.Failure, _Mapping]] = ...) -> None: ... + +class ResolveRequestCancelExternalWorkflow(_message.Message): + __slots__ = ("seq", "failure") + SEQ_FIELD_NUMBER: _ClassVar[int] + FAILURE_FIELD_NUMBER: _ClassVar[int] + seq: int + failure: _message_pb2.Failure + def __init__(self, seq: _Optional[int] = ..., failure: _Optional[_Union[_message_pb2.Failure, _Mapping]] = ...) -> None: ... + +class DoUpdate(_message.Message): + __slots__ = ("id", "protocol_instance_id", "name", "input", "headers", "meta", "run_validator") + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2_1_1.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2_1_1.Payload, _Mapping]] = ...) -> None: ... + ID_FIELD_NUMBER: _ClassVar[int] + PROTOCOL_INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + INPUT_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + META_FIELD_NUMBER: _ClassVar[int] + RUN_VALIDATOR_FIELD_NUMBER: _ClassVar[int] + id: str + protocol_instance_id: str + name: str + input: _containers.RepeatedCompositeFieldContainer[_message_pb2_1_1.Payload] + headers: _containers.MessageMap[str, _message_pb2_1_1.Payload] + meta: _message_pb2_1.Meta + run_validator: bool + def __init__(self, id: _Optional[str] = ..., protocol_instance_id: _Optional[str] = ..., name: _Optional[str] = ..., input: _Optional[_Iterable[_Union[_message_pb2_1_1.Payload, _Mapping]]] = ..., headers: _Optional[_Mapping[str, _message_pb2_1_1.Payload]] = ..., meta: _Optional[_Union[_message_pb2_1.Meta, _Mapping]] = ..., run_validator: _Optional[bool] = ...) -> None: ... + +class ResolveNexusOperationStart(_message.Message): + __slots__ = ("seq", "operation_token", "started_sync", "failed") + SEQ_FIELD_NUMBER: _ClassVar[int] + OPERATION_TOKEN_FIELD_NUMBER: _ClassVar[int] + STARTED_SYNC_FIELD_NUMBER: _ClassVar[int] + FAILED_FIELD_NUMBER: _ClassVar[int] + seq: int + operation_token: str + started_sync: bool + failed: _message_pb2.Failure + def __init__(self, seq: _Optional[int] = ..., operation_token: _Optional[str] = ..., started_sync: _Optional[bool] = ..., failed: _Optional[_Union[_message_pb2.Failure, _Mapping]] = ...) -> None: ... + +class ResolveNexusOperation(_message.Message): + __slots__ = ("seq", "result") + SEQ_FIELD_NUMBER: _ClassVar[int] + RESULT_FIELD_NUMBER: _ClassVar[int] + seq: int + result: _nexus_pb2.NexusOperationResult + def __init__(self, seq: _Optional[int] = ..., result: _Optional[_Union[_nexus_pb2.NexusOperationResult, _Mapping]] = ...) -> None: ... + +class RemoveFromCache(_message.Message): + __slots__ = ("message", "reason") + class EvictionReason(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + UNSPECIFIED: _ClassVar[RemoveFromCache.EvictionReason] + CACHE_FULL: _ClassVar[RemoveFromCache.EvictionReason] + CACHE_MISS: _ClassVar[RemoveFromCache.EvictionReason] + NONDETERMINISM: _ClassVar[RemoveFromCache.EvictionReason] + LANG_FAIL: _ClassVar[RemoveFromCache.EvictionReason] + LANG_REQUESTED: _ClassVar[RemoveFromCache.EvictionReason] + TASK_NOT_FOUND: _ClassVar[RemoveFromCache.EvictionReason] + UNHANDLED_COMMAND: _ClassVar[RemoveFromCache.EvictionReason] + FATAL: _ClassVar[RemoveFromCache.EvictionReason] + PAGINATION_OR_HISTORY_FETCH: _ClassVar[RemoveFromCache.EvictionReason] + WORKFLOW_EXECUTION_ENDING: _ClassVar[RemoveFromCache.EvictionReason] + UNSPECIFIED: RemoveFromCache.EvictionReason + CACHE_FULL: RemoveFromCache.EvictionReason + CACHE_MISS: RemoveFromCache.EvictionReason + NONDETERMINISM: RemoveFromCache.EvictionReason + LANG_FAIL: RemoveFromCache.EvictionReason + LANG_REQUESTED: RemoveFromCache.EvictionReason + TASK_NOT_FOUND: RemoveFromCache.EvictionReason + UNHANDLED_COMMAND: RemoveFromCache.EvictionReason + FATAL: RemoveFromCache.EvictionReason + PAGINATION_OR_HISTORY_FETCH: RemoveFromCache.EvictionReason + WORKFLOW_EXECUTION_ENDING: RemoveFromCache.EvictionReason + MESSAGE_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + message: str + reason: RemoveFromCache.EvictionReason + def __init__(self, message: _Optional[str] = ..., reason: _Optional[_Union[RemoveFromCache.EvictionReason, str]] = ...) -> None: ... diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index bf841f910..14e96e8da 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,5 @@ from .workflow_commands_pb2 import ( - ActivityCancellationType, + AddStreamMessages, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -26,6 +26,7 @@ StartChildWorkflowExecution, StartTimer, StreamSetBecameReady, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -33,10 +34,11 @@ WorkflowOutputStreamCommit, WorkflowStreamProgress, WorkflowStreamQuiescent, + ActivityCancellationType, ) __all__ = [ - "ActivityCancellationType", + "AddStreamMessages", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -63,6 +65,7 @@ "StartChildWorkflowExecution", "StartTimer", "StreamSetBecameReady", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", @@ -70,4 +73,5 @@ "WorkflowOutputStreamCommit", "WorkflowStreamProgress", "WorkflowStreamQuiescent", + "ActivityCancellationType", ] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index ccfa1a016..8b6facd8a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -1,13 +1,22 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE # source: temporal/sdk/core/workflow_commands/workflow_commands.proto +# Protobuf Python Version: 7.35.1 """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection +from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 7, + 35, + 1, + '', + 'temporal/sdk/core/workflow_commands/workflow_commands.proto' +) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -25,385 +34,119 @@ from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] -ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) -TRY_CANCEL = 0 -WAIT_CANCELLATION_COMPLETED = 1 -ABANDON = 2 - - -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] -_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] -_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] -_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] -WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWCOMMAND, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }) -_sym_db.RegisterMessage(WorkflowCommand) - -AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _ADDSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) - }) -_sym_db.RegisterMessage(AddStreamMessages) - -SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { - 'DESCRIPTOR' : _SUBSCRIBESTREAM, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) - }) -_sym_db.RegisterMessage(SubscribeStream) - -StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { - 'DESCRIPTOR' : _STARTTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }) -_sym_db.RegisterMessage(StartTimer) - -CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { - 'DESCRIPTOR' : _CANCELTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }) -_sym_db.RegisterMessage(CancelTimer) - -ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }) -_sym_db.RegisterMessage(ScheduleActivity) -_sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) - -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }) -_sym_db.RegisterMessage(ScheduleLocalActivity) -_sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) - -RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }) -_sym_db.RegisterMessage(RequestCancelActivity) - -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }) -_sym_db.RegisterMessage(RequestCancelLocalActivity) - -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }) -_sym_db.RegisterMessage(QueryResult) - -QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { - 'DESCRIPTOR' : _QUERYSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }) -_sym_db.RegisterMessage(QuerySuccess) - -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }) -_sym_db.RegisterMessage(CompleteWorkflowExecution) - -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }) -_sym_db.RegisterMessage(FailWorkflowExecution) - -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }) - , - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }) -_sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) -_sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) -_sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) - -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }) -_sym_db.RegisterMessage(CancelWorkflowExecution) - -SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { - 'DESCRIPTOR' : _SETPATCHMARKER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }) -_sym_db.RegisterMessage(SetPatchMarker) - -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }) - , - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }) - , - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }) -_sym_db.RegisterMessage(StartChildWorkflowExecution) -_sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) -_sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) - -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }) -_sym_db.RegisterMessage(CancelChildWorkflowExecution) - -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }) -_sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) - -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }) -_sym_db.RegisterMessage(SignalExternalWorkflowExecution) -_sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) - -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }) -_sym_db.RegisterMessage(CancelSignalWorkflow) - -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { - 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }) -_sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) - -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { - 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }) -_sym_db.RegisterMessage(ModifyWorkflowProperties) - -UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERESPONSE, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }) -_sym_db.RegisterMessage(UpdateResponse) - -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { - - 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }) -_sym_db.RegisterMessage(ScheduleNexusOperation) -_sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) - -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }) -_sym_db.RegisterMessage(RequestCancelNexusOperation) - -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' - _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 - _WORKFLOWCOMMAND._serialized_start=556 - _WORKFLOWCOMMAND._serialized_end=2794 - _ADDSTREAMMESSAGES._serialized_start=2796 - _ADDSTREAMMESSAGES._serialized_end=2891 - _SUBSCRIBESTREAM._serialized_start=2893 - _SUBSCRIBESTREAM._serialized_end=2951 - _STARTTIMER._serialized_start=2953 - _STARTTIMER._serialized_end=3036 - _CANCELTIMER._serialized_start=3038 - _CANCELTIMER._serialized_end=3064 - _SCHEDULEACTIVITY._serialized_start=3067 - _SCHEDULEACTIVITY._serialized_end=3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 - _SCHEDULELOCALACTIVITY._serialized_start=3894 - _SCHEDULELOCALACTIVITY._serialized_end=4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 - _REQUESTCANCELACTIVITY._serialized_start=4646 - _REQUESTCANCELACTIVITY._serialized_end=4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 - _QUERYRESULT._serialized_start=4728 - _QUERYRESULT._serialized_end=4884 - _QUERYSUCCESS._serialized_start=4886 - _QUERYSUCCESS._serialized_end=4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 - _FAILWORKFLOWEXECUTION._serialized_start=5031 - _FAILWORKFLOWEXECUTION._serialized_end=5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELWORKFLOWEXECUTION._serialized_start=6024 - _CANCELWORKFLOWEXECUTION._serialized_end=6100 - _SETPATCHMARKER._serialized_start=6102 - _SETPATCHMARKER._serialized_end=6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELSIGNALWORKFLOW._serialized_start=7958 - _CANCELSIGNALWORKFLOW._serialized_end=7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 - _UPDATERESPONSE._serialized_start=8180 - _UPDATERESPONSE._serialized_end=8390 - _SCHEDULENEXUSOPERATION._serialized_start=8393 - _SCHEDULENEXUSOPERATION._serialized_end=8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 +from temporalio.bridge.proto.external_data import external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto\"\xe7\x15\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08\"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08\"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome\"\x12\n\x10ParkSetConfirmed\"\x16\n\x14StreamSetBecameReady\"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c\"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08\"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'temporal.sdk.core.workflow_commands.workflow_commands_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _globals['_SCHEDULEACTIVITY_HEADERSENTRY']._loaded_options = None + _globals['_SCHEDULEACTIVITY_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_SCHEDULELOCALACTIVITY_HEADERSENTRY']._loaded_options = None + _globals['_SCHEDULELOCALACTIVITY_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY']._loaded_options = None + _globals['_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY']._serialized_options = b'8\001' + _globals['_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY']._loaded_options = None + _globals['_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY']._loaded_options = None + _globals['_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY']._loaded_options = None + _globals['_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY']._serialized_options = b'8\001' + _globals['_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY']._loaded_options = None + _globals['_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY']._serialized_options = b'8\001' + _globals['_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY']._loaded_options = None + _globals['_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY']._serialized_options = b'8\001' + _globals['_ACTIVITYCANCELLATIONTYPE']._serialized_start=10514 + _globals['_ACTIVITYCANCELLATIONTYPE']._serialized_end=10602 + _globals['_WORKFLOWCOMMAND']._serialized_start=609 + _globals['_WORKFLOWCOMMAND']._serialized_end=3400 + _globals['_WORKFLOWSTREAMPROGRESS']._serialized_start=3402 + _globals['_WORKFLOWSTREAMPROGRESS']._serialized_end=3479 + _globals['_WORKFLOWSTREAMQUIESCENT']._serialized_start=3482 + _globals['_WORKFLOWSTREAMQUIESCENT']._serialized_end=3649 + _globals['_EXTERNALSTREAMWAIT']._serialized_start=3651 + _globals['_EXTERNALSTREAMWAIT']._serialized_end=3738 + _globals['_EXTERNALSTREAMPARKRESULT']._serialized_start=3741 + _globals['_EXTERNALSTREAMPARKRESULT']._serialized_end=3981 + _globals['_PARKSETCONFIRMED']._serialized_start=3983 + _globals['_PARKSETCONFIRMED']._serialized_end=4001 + _globals['_STREAMSETBECAMEREADY']._serialized_start=4003 + _globals['_STREAMSETBECAMEREADY']._serialized_end=4025 + _globals['_EXTERNALSTREAMFINALIZED']._serialized_start=4027 + _globals['_EXTERNALSTREAMFINALIZED']._serialized_end=4116 + _globals['_WORKFLOWOUTPUTSTREAMCOMMIT']._serialized_start=4118 + _globals['_WORKFLOWOUTPUTSTREAMCOMMIT']._serialized_end=4243 + _globals['_WORKFLOWOUTPUTSTREAMBUFFERED']._serialized_start=4245 + _globals['_WORKFLOWOUTPUTSTREAMBUFFERED']._serialized_end=4331 + _globals['_ADDSTREAMMESSAGES']._serialized_start=4333 + _globals['_ADDSTREAMMESSAGES']._serialized_end=4428 + _globals['_SUBSCRIBESTREAM']._serialized_start=4430 + _globals['_SUBSCRIBESTREAM']._serialized_end=4488 + _globals['_STARTTIMER']._serialized_start=4490 + _globals['_STARTTIMER']._serialized_end=4573 + _globals['_CANCELTIMER']._serialized_start=4575 + _globals['_CANCELTIMER']._serialized_end=4601 + _globals['_SCHEDULEACTIVITY']._serialized_start=4604 + _globals['_SCHEDULEACTIVITY']._serialized_end=5428 + _globals['_SCHEDULEACTIVITY_HEADERSENTRY']._serialized_start=5349 + _globals['_SCHEDULEACTIVITY_HEADERSENTRY']._serialized_end=5428 + _globals['_SCHEDULELOCALACTIVITY']._serialized_start=5431 + _globals['_SCHEDULELOCALACTIVITY']._serialized_end=6181 + _globals['_SCHEDULELOCALACTIVITY_HEADERSENTRY']._serialized_start=5349 + _globals['_SCHEDULELOCALACTIVITY_HEADERSENTRY']._serialized_end=5428 + _globals['_REQUESTCANCELACTIVITY']._serialized_start=6183 + _globals['_REQUESTCANCELACTIVITY']._serialized_end=6219 + _globals['_REQUESTCANCELLOCALACTIVITY']._serialized_start=6221 + _globals['_REQUESTCANCELLOCALACTIVITY']._serialized_end=6262 + _globals['_QUERYRESULT']._serialized_start=6265 + _globals['_QUERYRESULT']._serialized_end=6421 + _globals['_QUERYSUCCESS']._serialized_start=6423 + _globals['_QUERYSUCCESS']._serialized_end=6488 + _globals['_COMPLETEWORKFLOWEXECUTION']._serialized_start=6490 + _globals['_COMPLETEWORKFLOWEXECUTION']._serialized_end=6566 + _globals['_FAILWORKFLOWEXECUTION']._serialized_start=6568 + _globals['_FAILWORKFLOWEXECUTION']._serialized_end=6642 + _globals['_CONTINUEASNEWWORKFLOWEXECUTION']._serialized_start=6645 + _globals['_CONTINUEASNEWWORKFLOWEXECUTION']._serialized_end=7559 + _globals['_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY']._serialized_start=7402 + _globals['_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY']._serialized_end=7478 + _globals['_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY']._serialized_start=5349 + _globals['_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY']._serialized_end=5428 + _globals['_CANCELWORKFLOWEXECUTION']._serialized_start=7561 + _globals['_CANCELWORKFLOWEXECUTION']._serialized_end=7637 + _globals['_SETPATCHMARKER']._serialized_start=7639 + _globals['_SETPATCHMARKER']._serialized_end=7693 + _globals['_STARTCHILDWORKFLOWEXECUTION']._serialized_start=7696 + _globals['_STARTCHILDWORKFLOWEXECUTION']._serialized_end=8870 + _globals['_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY']._serialized_start=5349 + _globals['_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY']._serialized_end=5428 + _globals['_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY']._serialized_start=7402 + _globals['_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY']._serialized_end=7478 + _globals['_CANCELCHILDWORKFLOWEXECUTION']._serialized_start=8872 + _globals['_CANCELCHILDWORKFLOWEXECUTION']._serialized_end=8946 + _globals['_REQUESTCANCELEXTERNALWORKFLOWEXECUTION']._serialized_start=8949 + _globals['_REQUESTCANCELEXTERNALWORKFLOWEXECUTION']._serialized_end=9091 + _globals['_SIGNALEXTERNALWORKFLOWEXECUTION']._serialized_start=9094 + _globals['_SIGNALEXTERNALWORKFLOWEXECUTION']._serialized_end=9493 + _globals['_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY']._serialized_start=5349 + _globals['_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY']._serialized_end=5428 + _globals['_CANCELSIGNALWORKFLOW']._serialized_start=9495 + _globals['_CANCELSIGNALWORKFLOW']._serialized_end=9530 + _globals['_UPSERTWORKFLOWSEARCHATTRIBUTES']._serialized_start=9532 + _globals['_UPSERTWORKFLOWSEARCHATTRIBUTES']._serialized_end=9633 + _globals['_MODIFYWORKFLOWPROPERTIES']._serialized_start=9635 + _globals['_MODIFYWORKFLOWPROPERTIES']._serialized_end=9714 + _globals['_UPDATERESPONSE']._serialized_start=9717 + _globals['_UPDATERESPONSE']._serialized_end=9927 + _globals['_SCHEDULENEXUSOPERATION']._serialized_start=9930 + _globals['_SCHEDULENEXUSOPERATION']._serialized_end=10468 + _globals['_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY']._serialized_start=10418 + _globals['_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY']._serialized_end=10468 + _globals['_REQUESTCANCELNEXUSOPERATION']._serialized_start=10470 + _globals['_REQUESTCANCELNEXUSOPERATION']._serialized_end=10512 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index f5a5fdb97..4df1da71b 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -1,1958 +1,538 @@ -""" -@generated by mypy-protobuf. Do not edit manually! -isort:skip_file - -Definitions for commands from a workflow in lang SDK to core. While a workflow processes a batch -of activation jobs, it accumulates these commands to be sent back to core to conclude that -activation. -""" - -import builtins -import collections.abc -import sys -import typing - -import google.protobuf.descriptor -import google.protobuf.duration_pb2 -import google.protobuf.empty_pb2 -import google.protobuf.internal.containers -import google.protobuf.internal.enum_type_wrapper -import google.protobuf.message -import google.protobuf.timestamp_pb2 - -import temporalio.api.common.v1.message_pb2 -import temporalio.api.enums.v1.workflow_pb2 -import temporalio.api.failure.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 -import temporalio.api.sdk.v1.event_group_marker_pb2 -import temporalio.api.sdk.v1.user_metadata_pb2 -import temporalio.bridge.proto.child_workflow.child_workflow_pb2 -import temporalio.bridge.proto.common.common_pb2 -import temporalio.bridge.proto.nexus.nexus_pb2 - -if sys.version_info >= (3, 10): - import typing as typing_extensions -else: - import typing_extensions - -DESCRIPTOR: google.protobuf.descriptor.FileDescriptor - -class _ActivityCancellationType: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _ActivityCancellationTypeEnumTypeWrapper( - google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ - _ActivityCancellationType.ValueType - ], - builtins.type, -): # noqa: F821 - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - TRY_CANCEL: _ActivityCancellationType.ValueType # 0 - """Initiate a cancellation request and immediately report cancellation to the workflow.""" - WAIT_CANCELLATION_COMPLETED: _ActivityCancellationType.ValueType # 1 - """Wait for activity cancellation completion. Note that activity must heartbeat to receive a - cancellation notification. This can block the cancellation for a long time if activity - doesn't heartbeat or chooses to ignore the cancellation request. - """ - ABANDON: _ActivityCancellationType.ValueType # 2 - """Do not request cancellation of the activity and immediately report cancellation to the - workflow - """ - -class ActivityCancellationType( - _ActivityCancellationType, metaclass=_ActivityCancellationTypeEnumTypeWrapper -): ... - -TRY_CANCEL: ActivityCancellationType.ValueType # 0 -"""Initiate a cancellation request and immediately report cancellation to the workflow.""" -WAIT_CANCELLATION_COMPLETED: ActivityCancellationType.ValueType # 1 -"""Wait for activity cancellation completion. Note that activity must heartbeat to receive a -cancellation notification. This can block the cancellation for a long time if activity -doesn't heartbeat or chooses to ignore the cancellation request. -""" -ABANDON: ActivityCancellationType.ValueType # 2 -"""Do not request cancellation of the activity and immediately report cancellation to the -workflow -""" -global___ActivityCancellationType = ActivityCancellationType - -class WorkflowCommand(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - USER_METADATA_FIELD_NUMBER: builtins.int - EVENT_GROUP_MARKERS_FIELD_NUMBER: builtins.int - START_TIMER_FIELD_NUMBER: builtins.int - SCHEDULE_ACTIVITY_FIELD_NUMBER: builtins.int - RESPOND_TO_QUERY_FIELD_NUMBER: builtins.int - REQUEST_CANCEL_ACTIVITY_FIELD_NUMBER: builtins.int - CANCEL_TIMER_FIELD_NUMBER: builtins.int - COMPLETE_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - FAIL_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - CONTINUE_AS_NEW_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - CANCEL_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - SET_PATCH_MARKER_FIELD_NUMBER: builtins.int - START_CHILD_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - CANCEL_CHILD_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - CANCEL_SIGNAL_WORKFLOW_FIELD_NUMBER: builtins.int - SCHEDULE_LOCAL_ACTIVITY_FIELD_NUMBER: builtins.int - REQUEST_CANCEL_LOCAL_ACTIVITY_FIELD_NUMBER: builtins.int - UPSERT_WORKFLOW_SEARCH_ATTRIBUTES_FIELD_NUMBER: builtins.int - MODIFY_WORKFLOW_PROPERTIES_FIELD_NUMBER: builtins.int - UPDATE_RESPONSE_FIELD_NUMBER: builtins.int - SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int - REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int - SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int - ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int - @property - def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: - """User metadata that may or may not be persisted into history depending on the command type. - Lang layers are expected to expose the setting of the internals of this metadata on a - per-command basis where applicable. - """ - @property - def event_group_markers( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.sdk.v1.event_group_marker_pb2.EventGroupMarker - ]: - """Event group markers attached to the command. These are forwarded onto - the corresponding server-side Command, and consequently surfaced on the - resulting HistoryEvent. See `temporal/api/sdk/v1/event_group_marker.proto`. - """ - @property - def start_timer(self) -> global___StartTimer: ... - @property - def schedule_activity(self) -> global___ScheduleActivity: ... - @property - def respond_to_query(self) -> global___QueryResult: ... - @property - def request_cancel_activity(self) -> global___RequestCancelActivity: ... - @property - def cancel_timer(self) -> global___CancelTimer: ... - @property - def complete_workflow_execution(self) -> global___CompleteWorkflowExecution: ... - @property - def fail_workflow_execution(self) -> global___FailWorkflowExecution: ... - @property - def continue_as_new_workflow_execution( - self, - ) -> global___ContinueAsNewWorkflowExecution: ... - @property - def cancel_workflow_execution(self) -> global___CancelWorkflowExecution: ... - @property - def set_patch_marker(self) -> global___SetPatchMarker: ... - @property - def start_child_workflow_execution( - self, - ) -> global___StartChildWorkflowExecution: ... - @property - def cancel_child_workflow_execution( - self, - ) -> global___CancelChildWorkflowExecution: ... - @property - def request_cancel_external_workflow_execution( - self, - ) -> global___RequestCancelExternalWorkflowExecution: ... - @property - def signal_external_workflow_execution( - self, - ) -> global___SignalExternalWorkflowExecution: ... - @property - def cancel_signal_workflow(self) -> global___CancelSignalWorkflow: ... - @property - def schedule_local_activity(self) -> global___ScheduleLocalActivity: ... - @property - def request_cancel_local_activity(self) -> global___RequestCancelLocalActivity: ... - @property - def upsert_workflow_search_attributes( - self, - ) -> global___UpsertWorkflowSearchAttributes: ... - @property - def modify_workflow_properties(self) -> global___ModifyWorkflowProperties: ... - @property - def update_response(self) -> global___UpdateResponse: ... - @property - def schedule_nexus_operation(self) -> global___ScheduleNexusOperation: ... - @property - def request_cancel_nexus_operation( - self, - ) -> global___RequestCancelNexusOperation: ... - @property - def subscribe_stream(self) -> global___SubscribeStream: ... - @property - def add_stream_messages(self) -> global___AddStreamMessages: ... - def __init__( - self, - *, - user_metadata: temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata - | None = ..., - event_group_markers: collections.abc.Iterable[ - temporalio.api.sdk.v1.event_group_marker_pb2.EventGroupMarker - ] - | None = ..., - start_timer: global___StartTimer | None = ..., - schedule_activity: global___ScheduleActivity | None = ..., - respond_to_query: global___QueryResult | None = ..., - request_cancel_activity: global___RequestCancelActivity | None = ..., - cancel_timer: global___CancelTimer | None = ..., - complete_workflow_execution: global___CompleteWorkflowExecution | None = ..., - fail_workflow_execution: global___FailWorkflowExecution | None = ..., - continue_as_new_workflow_execution: global___ContinueAsNewWorkflowExecution - | None = ..., - cancel_workflow_execution: global___CancelWorkflowExecution | None = ..., - set_patch_marker: global___SetPatchMarker | None = ..., - start_child_workflow_execution: global___StartChildWorkflowExecution - | None = ..., - cancel_child_workflow_execution: global___CancelChildWorkflowExecution - | None = ..., - request_cancel_external_workflow_execution: global___RequestCancelExternalWorkflowExecution - | None = ..., - signal_external_workflow_execution: global___SignalExternalWorkflowExecution - | None = ..., - cancel_signal_workflow: global___CancelSignalWorkflow | None = ..., - schedule_local_activity: global___ScheduleLocalActivity | None = ..., - request_cancel_local_activity: global___RequestCancelLocalActivity | None = ..., - upsert_workflow_search_attributes: global___UpsertWorkflowSearchAttributes - | None = ..., - modify_workflow_properties: global___ModifyWorkflowProperties | None = ..., - update_response: global___UpdateResponse | None = ..., - schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., - request_cancel_nexus_operation: global___RequestCancelNexusOperation - | None = ..., - subscribe_stream: global___SubscribeStream | None = ..., - add_stream_messages: global___AddStreamMessages | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "cancel_child_workflow_execution", - b"cancel_child_workflow_execution", - "cancel_signal_workflow", - b"cancel_signal_workflow", - "cancel_timer", - b"cancel_timer", - "cancel_workflow_execution", - b"cancel_workflow_execution", - "complete_workflow_execution", - b"complete_workflow_execution", - "continue_as_new_workflow_execution", - b"continue_as_new_workflow_execution", - "fail_workflow_execution", - b"fail_workflow_execution", - "modify_workflow_properties", - b"modify_workflow_properties", - "request_cancel_activity", - b"request_cancel_activity", - "request_cancel_external_workflow_execution", - b"request_cancel_external_workflow_execution", - "request_cancel_local_activity", - b"request_cancel_local_activity", - "request_cancel_nexus_operation", - b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", - "respond_to_query", - b"respond_to_query", - "schedule_activity", - b"schedule_activity", - "schedule_local_activity", - b"schedule_local_activity", - "schedule_nexus_operation", - b"schedule_nexus_operation", - "set_patch_marker", - b"set_patch_marker", - "signal_external_workflow_execution", - b"signal_external_workflow_execution", - "start_child_workflow_execution", - b"start_child_workflow_execution", - "start_timer", - b"start_timer", - "update_response", - b"update_response", - "upsert_workflow_search_attributes", - b"upsert_workflow_search_attributes", - "user_metadata", - b"user_metadata", - "variant", - b"variant", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "cancel_child_workflow_execution", - b"cancel_child_workflow_execution", - "cancel_signal_workflow", - b"cancel_signal_workflow", - "cancel_timer", - b"cancel_timer", - "cancel_workflow_execution", - b"cancel_workflow_execution", - "complete_workflow_execution", - b"complete_workflow_execution", - "continue_as_new_workflow_execution", - b"continue_as_new_workflow_execution", - "event_group_markers", - b"event_group_markers", - "fail_workflow_execution", - b"fail_workflow_execution", - "modify_workflow_properties", - b"modify_workflow_properties", - "request_cancel_activity", - b"request_cancel_activity", - "request_cancel_external_workflow_execution", - b"request_cancel_external_workflow_execution", - "request_cancel_local_activity", - b"request_cancel_local_activity", - "request_cancel_nexus_operation", - b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", - "respond_to_query", - b"respond_to_query", - "schedule_activity", - b"schedule_activity", - "schedule_local_activity", - b"schedule_local_activity", - "schedule_nexus_operation", - b"schedule_nexus_operation", - "set_patch_marker", - b"set_patch_marker", - "signal_external_workflow_execution", - b"signal_external_workflow_execution", - "start_child_workflow_execution", - b"start_child_workflow_execution", - "start_timer", - b"start_timer", - "update_response", - b"update_response", - "upsert_workflow_search_attributes", - b"upsert_workflow_search_attributes", - "user_metadata", - b"user_metadata", - "variant", - b"variant", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing_extensions.Literal["variant", b"variant"] - ) -> ( - typing_extensions.Literal[ - "start_timer", - "schedule_activity", - "respond_to_query", - "request_cancel_activity", - "cancel_timer", - "complete_workflow_execution", - "fail_workflow_execution", - "continue_as_new_workflow_execution", - "cancel_workflow_execution", - "set_patch_marker", - "start_child_workflow_execution", - "cancel_child_workflow_execution", - "request_cancel_external_workflow_execution", - "signal_external_workflow_execution", - "cancel_signal_workflow", - "schedule_local_activity", - "request_cancel_local_activity", - "upsert_workflow_search_attributes", - "modify_workflow_properties", - "update_response", - "schedule_nexus_operation", - "request_cancel_nexus_operation", - "subscribe_stream", - "add_stream_messages", - ] - | None - ): ... - -global___WorkflowCommand = WorkflowCommand - -class StartTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... - def __init__( - self, - *, - seq: builtins.int = ..., - start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> None: ... - -global___StartTimer = StartTimer - -class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. - - The bodies go to the stream's own log rather than into History, which gets - one fixed-size event naming the offset range. That is what makes the batch - size free: a thousand messages cost the same in History as one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Empty means the workflow's default output stream.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "messages", b"messages", "stream_id", b"stream_id" - ], - ) -> None: ... - -global___AddStreamMessages = AddStreamMessages - -class SubscribeStream(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - START_OFFSET_FIELD_NUMBER: builtins.int - stream_id: builtins.str - start_offset: builtins.int - """Negative means from wherever the stream is when the subscription is - registered. The server resolves that once and records it. - """ - def __init__( - self, - *, - stream_id: builtins.str = ..., - start_offset: builtins.int = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "start_offset", b"start_offset", "stream_id", b"stream_id" - ], - ) -> None: ... - -global___SubscribeStream = SubscribeStream - -class CancelTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number as passed to `StartTimer`""" - def __init__( - self, - *, - seq: builtins.int = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["seq", b"seq"] - ) -> None: ... - -global___CancelTimer = CancelTimer - -class ScheduleActivity(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - SEQ_FIELD_NUMBER: builtins.int - ACTIVITY_ID_FIELD_NUMBER: builtins.int - ACTIVITY_TYPE_FIELD_NUMBER: builtins.int - TASK_QUEUE_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - ARGUMENTS_FIELD_NUMBER: builtins.int - SCHEDULE_TO_CLOSE_TIMEOUT_FIELD_NUMBER: builtins.int - SCHEDULE_TO_START_TIMEOUT_FIELD_NUMBER: builtins.int - START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: builtins.int - HEARTBEAT_TIMEOUT_FIELD_NUMBER: builtins.int - RETRY_POLICY_FIELD_NUMBER: builtins.int - CANCELLATION_TYPE_FIELD_NUMBER: builtins.int - DO_NOT_EAGERLY_EXECUTE_FIELD_NUMBER: builtins.int - VERSIONING_INTENT_FIELD_NUMBER: builtins.int - PRIORITY_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - activity_id: builtins.str - activity_type: builtins.str - task_queue: builtins.str - """The name of the task queue to place this activity request in""" - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: ... - @property - def arguments( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: - """Arguments/input to the activity. Called "input" upstream.""" - @property - def schedule_to_close_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Indicates how long the caller is willing to wait for an activity completion. Limits how long - retries will be attempted. Either this or start_to_close_timeout_seconds must be specified. - When not specified defaults to the workflow execution timeout. - """ - @property - def schedule_to_start_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Limits time an activity task can stay in a task queue before a worker picks it up. This - timeout is always non retryable as all a retry would achieve is to put it back into the same - queue. Defaults to schedule_to_close_timeout or workflow execution timeout if not specified. - """ - @property - def start_to_close_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Maximum time an activity is allowed to execute after a pick up by a worker. This timeout is - always retryable. Either this or schedule_to_close_timeout must be specified. - """ - @property - def heartbeat_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Maximum time allowed between successful worker heartbeats.""" - @property - def retry_policy(self) -> temporalio.api.common.v1.message_pb2.RetryPolicy: - """Activities are provided by a default retry policy controlled through the service dynamic - configuration. Retries are happening up to schedule_to_close_timeout. To disable retries set - retry_policy.maximum_attempts to 1. - """ - cancellation_type: global___ActivityCancellationType.ValueType - """Defines how the workflow will wait (or not) for cancellation of the activity to be confirmed""" - do_not_eagerly_execute: builtins.bool - """If set, the worker will not tell the service that it can immediately start executing this - activity. When unset/default, workers will always attempt to do so if activity execution - slots are available. - """ - versioning_intent: ( - temporalio.bridge.proto.common.common_pb2.VersioningIntent.ValueType - ) - """Whether this activity should run on a worker with a compatible build id or not.""" - @property - def priority(self) -> temporalio.api.common.v1.message_pb2.Priority: - """The Priority to use for this activity""" - def __init__( - self, - *, - seq: builtins.int = ..., - activity_id: builtins.str = ..., - activity_type: builtins.str = ..., - task_queue: builtins.str = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - arguments: collections.abc.Iterable[ - temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - schedule_to_close_timeout: google.protobuf.duration_pb2.Duration | None = ..., - schedule_to_start_timeout: google.protobuf.duration_pb2.Duration | None = ..., - start_to_close_timeout: google.protobuf.duration_pb2.Duration | None = ..., - heartbeat_timeout: google.protobuf.duration_pb2.Duration | None = ..., - retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., - cancellation_type: global___ActivityCancellationType.ValueType = ..., - do_not_eagerly_execute: builtins.bool = ..., - versioning_intent: temporalio.bridge.proto.common.common_pb2.VersioningIntent.ValueType = ..., - priority: temporalio.api.common.v1.message_pb2.Priority | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "heartbeat_timeout", - b"heartbeat_timeout", - "priority", - b"priority", - "retry_policy", - b"retry_policy", - "schedule_to_close_timeout", - b"schedule_to_close_timeout", - "schedule_to_start_timeout", - b"schedule_to_start_timeout", - "start_to_close_timeout", - b"start_to_close_timeout", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "activity_id", - b"activity_id", - "activity_type", - b"activity_type", - "arguments", - b"arguments", - "cancellation_type", - b"cancellation_type", - "do_not_eagerly_execute", - b"do_not_eagerly_execute", - "headers", - b"headers", - "heartbeat_timeout", - b"heartbeat_timeout", - "priority", - b"priority", - "retry_policy", - b"retry_policy", - "schedule_to_close_timeout", - b"schedule_to_close_timeout", - "schedule_to_start_timeout", - b"schedule_to_start_timeout", - "seq", - b"seq", - "start_to_close_timeout", - b"start_to_close_timeout", - "task_queue", - b"task_queue", - "versioning_intent", - b"versioning_intent", - ], - ) -> None: ... - -global___ScheduleActivity = ScheduleActivity - -class ScheduleLocalActivity(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - SEQ_FIELD_NUMBER: builtins.int - ACTIVITY_ID_FIELD_NUMBER: builtins.int - ACTIVITY_TYPE_FIELD_NUMBER: builtins.int - ATTEMPT_FIELD_NUMBER: builtins.int - ORIGINAL_SCHEDULE_TIME_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - ARGUMENTS_FIELD_NUMBER: builtins.int - SCHEDULE_TO_CLOSE_TIMEOUT_FIELD_NUMBER: builtins.int - SCHEDULE_TO_START_TIMEOUT_FIELD_NUMBER: builtins.int - START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: builtins.int - RETRY_POLICY_FIELD_NUMBER: builtins.int - LOCAL_RETRY_THRESHOLD_FIELD_NUMBER: builtins.int - CANCELLATION_TYPE_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - activity_id: builtins.str - activity_type: builtins.str - attempt: builtins.int - """Local activities can start with a non-1 attempt, if lang has been told to backoff using - a timer before retrying. It should pass the attempt number from a `DoBackoff` activity - resolution. - """ - @property - def original_schedule_time(self) -> google.protobuf.timestamp_pb2.Timestamp: - """If this local activity is a retry (as per the attempt field) this needs to be the original - scheduling time (as provided in `DoBackoff`) - """ - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: ... - @property - def arguments( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: - """Arguments/input to the activity.""" - @property - def schedule_to_close_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Indicates how long the caller is willing to wait for local activity completion. Limits how - long retries will be attempted. When not specified defaults to the workflow execution - timeout (which may be unset). - """ - @property - def schedule_to_start_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Limits time the local activity can idle internally before being executed. That can happen if - the worker is currently at max concurrent local activity executions. This timeout is always - non retryable as all a retry would achieve is to put it back into the same queue. Defaults - to `schedule_to_close_timeout` if not specified and that is set. Must be <= - `schedule_to_close_timeout` when set, otherwise, it will be clamped down. - """ - @property - def start_to_close_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Maximum time the local activity is allowed to execute after the task is dispatched. This - timeout is always retryable. Either or both of `schedule_to_close_timeout` and this must be - specified. If set, this must be <= `schedule_to_close_timeout`, otherwise, it will be - clamped down. - """ - @property - def retry_policy(self) -> temporalio.api.common.v1.message_pb2.RetryPolicy: - """Specify a retry policy for the local activity. By default local activities will be retried - indefinitely. - """ - @property - def local_retry_threshold(self) -> google.protobuf.duration_pb2.Duration: - """If the activity is retrying and backoff would exceed this value, lang will be told to - schedule a timer and retry the activity after. Otherwise, backoff will happen internally in - core. Defaults to 1 minute. - """ - cancellation_type: global___ActivityCancellationType.ValueType - """Defines how the workflow will wait (or not) for cancellation of the activity to be - confirmed. Lang should default this to `WAIT_CANCELLATION_COMPLETED`, even though proto - will default to `TRY_CANCEL` automatically. - """ - def __init__( - self, - *, - seq: builtins.int = ..., - activity_id: builtins.str = ..., - activity_type: builtins.str = ..., - attempt: builtins.int = ..., - original_schedule_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - arguments: collections.abc.Iterable[ - temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - schedule_to_close_timeout: google.protobuf.duration_pb2.Duration | None = ..., - schedule_to_start_timeout: google.protobuf.duration_pb2.Duration | None = ..., - start_to_close_timeout: google.protobuf.duration_pb2.Duration | None = ..., - retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., - local_retry_threshold: google.protobuf.duration_pb2.Duration | None = ..., - cancellation_type: global___ActivityCancellationType.ValueType = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "local_retry_threshold", - b"local_retry_threshold", - "original_schedule_time", - b"original_schedule_time", - "retry_policy", - b"retry_policy", - "schedule_to_close_timeout", - b"schedule_to_close_timeout", - "schedule_to_start_timeout", - b"schedule_to_start_timeout", - "start_to_close_timeout", - b"start_to_close_timeout", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "activity_id", - b"activity_id", - "activity_type", - b"activity_type", - "arguments", - b"arguments", - "attempt", - b"attempt", - "cancellation_type", - b"cancellation_type", - "headers", - b"headers", - "local_retry_threshold", - b"local_retry_threshold", - "original_schedule_time", - b"original_schedule_time", - "retry_policy", - b"retry_policy", - "schedule_to_close_timeout", - b"schedule_to_close_timeout", - "schedule_to_start_timeout", - b"schedule_to_start_timeout", - "seq", - b"seq", - "start_to_close_timeout", - b"start_to_close_timeout", - ], - ) -> None: ... - -global___ScheduleLocalActivity = ScheduleLocalActivity - -class RequestCancelActivity(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number as passed to `ScheduleActivity`""" - def __init__( - self, - *, - seq: builtins.int = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["seq", b"seq"] - ) -> None: ... - -global___RequestCancelActivity = RequestCancelActivity - -class RequestCancelLocalActivity(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number as passed to `ScheduleLocalActivity`""" - def __init__( - self, - *, - seq: builtins.int = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["seq", b"seq"] - ) -> None: ... - -global___RequestCancelLocalActivity = RequestCancelLocalActivity - -class QueryResult(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - QUERY_ID_FIELD_NUMBER: builtins.int - SUCCEEDED_FIELD_NUMBER: builtins.int - FAILED_FIELD_NUMBER: builtins.int - query_id: builtins.str - """Corresponds to the id provided in the activation job""" - @property - def succeeded(self) -> global___QuerySuccess: ... - @property - def failed(self) -> temporalio.api.failure.v1.message_pb2.Failure: ... - def __init__( - self, - *, - query_id: builtins.str = ..., - succeeded: global___QuerySuccess | None = ..., - failed: temporalio.api.failure.v1.message_pb2.Failure | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "failed", b"failed", "succeeded", b"succeeded", "variant", b"variant" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "failed", - b"failed", - "query_id", - b"query_id", - "succeeded", - b"succeeded", - "variant", - b"variant", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing_extensions.Literal["variant", b"variant"] - ) -> typing_extensions.Literal["succeeded", "failed"] | None: ... - -global___QueryResult = QueryResult - -class QuerySuccess(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - RESPONSE_FIELD_NUMBER: builtins.int - @property - def response(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - response: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["response", b"response"] - ) -> builtins.bool: ... - def ClearField( - self, field_name: typing_extensions.Literal["response", b"response"] - ) -> None: ... - -global___QuerySuccess = QuerySuccess - -class CompleteWorkflowExecution(google.protobuf.message.Message): - """Issued when the workflow completes successfully""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - RESULT_FIELD_NUMBER: builtins.int - @property - def result(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - result: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["result", b"result"] - ) -> builtins.bool: ... - def ClearField( - self, field_name: typing_extensions.Literal["result", b"result"] - ) -> None: ... - -global___CompleteWorkflowExecution = CompleteWorkflowExecution - -class FailWorkflowExecution(google.protobuf.message.Message): - """Issued when the workflow errors out""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - FAILURE_FIELD_NUMBER: builtins.int - @property - def failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: ... - def __init__( - self, - *, - failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["failure", b"failure"] - ) -> builtins.bool: ... - def ClearField( - self, field_name: typing_extensions.Literal["failure", b"failure"] - ) -> None: ... - -global___FailWorkflowExecution = FailWorkflowExecution - -class ContinueAsNewWorkflowExecution(google.protobuf.message.Message): - """Continue the workflow as a new execution""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class MemoEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - WORKFLOW_TYPE_FIELD_NUMBER: builtins.int - TASK_QUEUE_FIELD_NUMBER: builtins.int - ARGUMENTS_FIELD_NUMBER: builtins.int - WORKFLOW_RUN_TIMEOUT_FIELD_NUMBER: builtins.int - WORKFLOW_TASK_TIMEOUT_FIELD_NUMBER: builtins.int - MEMO_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - SEARCH_ATTRIBUTES_FIELD_NUMBER: builtins.int - RETRY_POLICY_FIELD_NUMBER: builtins.int - VERSIONING_INTENT_FIELD_NUMBER: builtins.int - INITIAL_VERSIONING_BEHAVIOR_FIELD_NUMBER: builtins.int - BACKOFF_START_INTERVAL_FIELD_NUMBER: builtins.int - workflow_type: builtins.str - """The identifier the lang-specific sdk uses to execute workflow code""" - task_queue: builtins.str - """Task queue for the new workflow execution""" - @property - def arguments( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: - """Inputs to the workflow code. Should be specified. Will not re-use old arguments, as that - typically wouldn't make any sense. - """ - @property - def workflow_run_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Timeout for a single run of the new workflow. Will not re-use current workflow's value.""" - @property - def workflow_task_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Timeout of a single workflow task. Will not re-use current workflow's value.""" - @property - def memo( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """If set, the new workflow will have this memo. If unset, re-uses the current workflow's memo""" - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """If set, the new workflow will have these headers. Will *not* re-use current workflow's - headers otherwise. - """ - @property - def search_attributes( - self, - ) -> temporalio.api.common.v1.message_pb2.SearchAttributes: - """If set, the new workflow will have these search attributes. If unset, re-uses the current - workflow's search attributes. - """ - @property - def retry_policy(self) -> temporalio.api.common.v1.message_pb2.RetryPolicy: - """If set, the new workflow will have this retry policy. If unset, re-uses the current - workflow's retry policy. - """ - versioning_intent: ( - temporalio.bridge.proto.common.common_pb2.VersioningIntent.ValueType - ) - """Whether the continued workflow should run on a worker with a compatible build id or not.""" - initial_versioning_behavior: ( - temporalio.api.enums.v1.workflow_pb2.ContinueAsNewVersioningBehavior.ValueType - ) - """Experimental. Optionally decide the versioning behavior that the first task of the new run should use. - For example, choose to AutoUpgrade on continue-as-new instead of inheriting the pinned version - of the previous run. - """ - @property - def backoff_start_interval(self) -> google.protobuf.duration_pb2.Duration: - """Delay before the first workflow task of the continued run is scheduled.""" - def __init__( - self, - *, - workflow_type: builtins.str = ..., - task_queue: builtins.str = ..., - arguments: collections.abc.Iterable[ - temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - workflow_run_timeout: google.protobuf.duration_pb2.Duration | None = ..., - workflow_task_timeout: google.protobuf.duration_pb2.Duration | None = ..., - memo: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - search_attributes: temporalio.api.common.v1.message_pb2.SearchAttributes - | None = ..., - retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., - versioning_intent: temporalio.bridge.proto.common.common_pb2.VersioningIntent.ValueType = ..., - initial_versioning_behavior: temporalio.api.enums.v1.workflow_pb2.ContinueAsNewVersioningBehavior.ValueType = ..., - backoff_start_interval: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "backoff_start_interval", - b"backoff_start_interval", - "retry_policy", - b"retry_policy", - "search_attributes", - b"search_attributes", - "workflow_run_timeout", - b"workflow_run_timeout", - "workflow_task_timeout", - b"workflow_task_timeout", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "arguments", - b"arguments", - "backoff_start_interval", - b"backoff_start_interval", - "headers", - b"headers", - "initial_versioning_behavior", - b"initial_versioning_behavior", - "memo", - b"memo", - "retry_policy", - b"retry_policy", - "search_attributes", - b"search_attributes", - "task_queue", - b"task_queue", - "versioning_intent", - b"versioning_intent", - "workflow_run_timeout", - b"workflow_run_timeout", - "workflow_task_timeout", - b"workflow_task_timeout", - "workflow_type", - b"workflow_type", - ], - ) -> None: ... - -global___ContinueAsNewWorkflowExecution = ContinueAsNewWorkflowExecution - -class CancelWorkflowExecution(google.protobuf.message.Message): - """Indicate a workflow has completed as cancelled. Generally sent as a response to an activation - containing a cancellation job. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - DETAILS_FIELD_NUMBER: builtins.int - @property - def details(self) -> temporalio.api.common.v1.message_pb2.Payloads: ... - def __init__( - self, - *, - details: temporalio.api.common.v1.message_pb2.Payloads | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["details", b"details"] - ) -> builtins.bool: ... - def ClearField( - self, field_name: typing_extensions.Literal["details", b"details"] - ) -> None: ... - -global___CancelWorkflowExecution = CancelWorkflowExecution - -class SetPatchMarker(google.protobuf.message.Message): - """A request to set/check if a certain patch is present or not""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - PATCH_ID_FIELD_NUMBER: builtins.int - DEPRECATED_FIELD_NUMBER: builtins.int - patch_id: builtins.str - """A user-chosen identifier for this patch. If the same identifier is used in multiple places in - the code, those places are considered to be versioned as one unit. IE: The check call will - return the same result for all of them - """ - deprecated: builtins.bool - """Can be set to true to indicate that branches using this change are being removed, and all - future worker deployments will only have the "with change" code in them. - """ - def __init__( - self, - *, - patch_id: builtins.str = ..., - deprecated: builtins.bool = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "deprecated", b"deprecated", "patch_id", b"patch_id" - ], - ) -> None: ... - -global___SetPatchMarker = SetPatchMarker - -class StartChildWorkflowExecution(google.protobuf.message.Message): - """Start a child workflow execution""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - class MemoEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - SEQ_FIELD_NUMBER: builtins.int - NAMESPACE_FIELD_NUMBER: builtins.int - WORKFLOW_ID_FIELD_NUMBER: builtins.int - WORKFLOW_TYPE_FIELD_NUMBER: builtins.int - TASK_QUEUE_FIELD_NUMBER: builtins.int - INPUT_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_TIMEOUT_FIELD_NUMBER: builtins.int - WORKFLOW_RUN_TIMEOUT_FIELD_NUMBER: builtins.int - WORKFLOW_TASK_TIMEOUT_FIELD_NUMBER: builtins.int - PARENT_CLOSE_POLICY_FIELD_NUMBER: builtins.int - WORKFLOW_ID_REUSE_POLICY_FIELD_NUMBER: builtins.int - RETRY_POLICY_FIELD_NUMBER: builtins.int - CRON_SCHEDULE_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - MEMO_FIELD_NUMBER: builtins.int - SEARCH_ATTRIBUTES_FIELD_NUMBER: builtins.int - CANCELLATION_TYPE_FIELD_NUMBER: builtins.int - VERSIONING_INTENT_FIELD_NUMBER: builtins.int - PRIORITY_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - namespace: builtins.str - workflow_id: builtins.str - workflow_type: builtins.str - task_queue: builtins.str - @property - def input( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: ... - @property - def workflow_execution_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Total workflow execution timeout including retries and continue as new.""" - @property - def workflow_run_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Timeout of a single workflow run.""" - @property - def workflow_task_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Timeout of a single workflow task.""" - parent_close_policy: temporalio.bridge.proto.child_workflow.child_workflow_pb2.ParentClosePolicy.ValueType - """Default: PARENT_CLOSE_POLICY_TERMINATE.""" - workflow_id_reuse_policy: ( - temporalio.api.enums.v1.workflow_pb2.WorkflowIdReusePolicy.ValueType - ) - """string control = 11; (unused from StartChildWorkflowExecutionCommandAttributes) - Default: WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE. - """ - @property - def retry_policy(self) -> temporalio.api.common.v1.message_pb2.RetryPolicy: ... - cron_schedule: builtins.str - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """Header fields""" - @property - def memo( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """Memo fields""" - @property - def search_attributes( - self, - ) -> temporalio.api.common.v1.message_pb2.SearchAttributes: - """Search attributes""" - cancellation_type: temporalio.bridge.proto.child_workflow.child_workflow_pb2.ChildWorkflowCancellationType.ValueType - """Defines behaviour of the underlying workflow when child workflow cancellation has been requested.""" - versioning_intent: ( - temporalio.bridge.proto.common.common_pb2.VersioningIntent.ValueType - ) - """Whether this child should run on a worker with a compatible build id or not.""" - @property - def priority(self) -> temporalio.api.common.v1.message_pb2.Priority: - """The Priority to use for this activity""" - def __init__( - self, - *, - seq: builtins.int = ..., - namespace: builtins.str = ..., - workflow_id: builtins.str = ..., - workflow_type: builtins.str = ..., - task_queue: builtins.str = ..., - input: collections.abc.Iterable[temporalio.api.common.v1.message_pb2.Payload] - | None = ..., - workflow_execution_timeout: google.protobuf.duration_pb2.Duration | None = ..., - workflow_run_timeout: google.protobuf.duration_pb2.Duration | None = ..., - workflow_task_timeout: google.protobuf.duration_pb2.Duration | None = ..., - parent_close_policy: temporalio.bridge.proto.child_workflow.child_workflow_pb2.ParentClosePolicy.ValueType = ..., - workflow_id_reuse_policy: temporalio.api.enums.v1.workflow_pb2.WorkflowIdReusePolicy.ValueType = ..., - retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., - cron_schedule: builtins.str = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - memo: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - search_attributes: temporalio.api.common.v1.message_pb2.SearchAttributes - | None = ..., - cancellation_type: temporalio.bridge.proto.child_workflow.child_workflow_pb2.ChildWorkflowCancellationType.ValueType = ..., - versioning_intent: temporalio.bridge.proto.common.common_pb2.VersioningIntent.ValueType = ..., - priority: temporalio.api.common.v1.message_pb2.Priority | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "priority", - b"priority", - "retry_policy", - b"retry_policy", - "search_attributes", - b"search_attributes", - "workflow_execution_timeout", - b"workflow_execution_timeout", - "workflow_run_timeout", - b"workflow_run_timeout", - "workflow_task_timeout", - b"workflow_task_timeout", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "cancellation_type", - b"cancellation_type", - "cron_schedule", - b"cron_schedule", - "headers", - b"headers", - "input", - b"input", - "memo", - b"memo", - "namespace", - b"namespace", - "parent_close_policy", - b"parent_close_policy", - "priority", - b"priority", - "retry_policy", - b"retry_policy", - "search_attributes", - b"search_attributes", - "seq", - b"seq", - "task_queue", - b"task_queue", - "versioning_intent", - b"versioning_intent", - "workflow_execution_timeout", - b"workflow_execution_timeout", - "workflow_id", - b"workflow_id", - "workflow_id_reuse_policy", - b"workflow_id_reuse_policy", - "workflow_run_timeout", - b"workflow_run_timeout", - "workflow_task_timeout", - b"workflow_task_timeout", - "workflow_type", - b"workflow_type", - ], - ) -> None: ... - -global___StartChildWorkflowExecution = StartChildWorkflowExecution - -class CancelChildWorkflowExecution(google.protobuf.message.Message): - """Cancel a child workflow""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - CHILD_WORKFLOW_SEQ_FIELD_NUMBER: builtins.int - REASON_FIELD_NUMBER: builtins.int - child_workflow_seq: builtins.int - """Sequence number as given to the `StartChildWorkflowExecution` command""" - reason: builtins.str - """A reason for the cancellation""" - def __init__( - self, - *, - child_workflow_seq: builtins.int = ..., - reason: builtins.str = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "child_workflow_seq", b"child_workflow_seq", "reason", b"reason" - ], - ) -> None: ... - -global___CancelChildWorkflowExecution = CancelChildWorkflowExecution - -class RequestCancelExternalWorkflowExecution(google.protobuf.message.Message): - """Request cancellation of an external workflow execution. For cancellation of a child workflow, - prefer `CancelChildWorkflowExecution` instead, as it guards against cancel-before-start issues. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - REASON_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def workflow_execution( - self, - ) -> temporalio.bridge.proto.common.common_pb2.NamespacedWorkflowExecution: - """The workflow instance being targeted""" - reason: builtins.str - """A reason for the cancellation""" - def __init__( - self, - *, - seq: builtins.int = ..., - workflow_execution: temporalio.bridge.proto.common.common_pb2.NamespacedWorkflowExecution - | None = ..., - reason: builtins.str = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "workflow_execution", b"workflow_execution" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "reason", - b"reason", - "seq", - b"seq", - "workflow_execution", - b"workflow_execution", - ], - ) -> None: ... - -global___RequestCancelExternalWorkflowExecution = RequestCancelExternalWorkflowExecution - -class SignalExternalWorkflowExecution(google.protobuf.message.Message): - """Send a signal to an external or child workflow""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class HeadersEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - @property - def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... - def __init__( - self, - *, - key: builtins.str = ..., - value: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["value", b"value"] - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - SEQ_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - CHILD_WORKFLOW_ID_FIELD_NUMBER: builtins.int - SIGNAL_NAME_FIELD_NUMBER: builtins.int - ARGS_FIELD_NUMBER: builtins.int - HEADERS_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def workflow_execution( - self, - ) -> temporalio.bridge.proto.common.common_pb2.NamespacedWorkflowExecution: - """A specific workflow instance""" - child_workflow_id: builtins.str - """The desired target must be a child of the issuing workflow, and this is its workflow id""" - signal_name: builtins.str - """Name of the signal handler""" - @property - def args( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.common.v1.message_pb2.Payload - ]: - """Arguments for the handler""" - @property - def headers( - self, - ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ]: - """Headers to attach to the signal""" - def __init__( - self, - *, - seq: builtins.int = ..., - workflow_execution: temporalio.bridge.proto.common.common_pb2.NamespacedWorkflowExecution - | None = ..., - child_workflow_id: builtins.str = ..., - signal_name: builtins.str = ..., - args: collections.abc.Iterable[temporalio.api.common.v1.message_pb2.Payload] - | None = ..., - headers: collections.abc.Mapping[ - builtins.str, temporalio.api.common.v1.message_pb2.Payload - ] - | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "child_workflow_id", - b"child_workflow_id", - "target", - b"target", - "workflow_execution", - b"workflow_execution", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "args", - b"args", - "child_workflow_id", - b"child_workflow_id", - "headers", - b"headers", - "seq", - b"seq", - "signal_name", - b"signal_name", - "target", - b"target", - "workflow_execution", - b"workflow_execution", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing_extensions.Literal["target", b"target"] - ) -> ( - typing_extensions.Literal["workflow_execution", "child_workflow_id"] | None - ): ... - -global___SignalExternalWorkflowExecution = SignalExternalWorkflowExecution - -class CancelSignalWorkflow(google.protobuf.message.Message): - """Can be used to cancel not-already-sent `SignalExternalWorkflowExecution` commands""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number as passed to `SignalExternalWorkflowExecution`""" - def __init__( - self, - *, - seq: builtins.int = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["seq", b"seq"] - ) -> None: ... - -global___CancelSignalWorkflow = CancelSignalWorkflow - -class UpsertWorkflowSearchAttributes(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEARCH_ATTRIBUTES_FIELD_NUMBER: builtins.int - @property - def search_attributes( - self, - ) -> temporalio.api.common.v1.message_pb2.SearchAttributes: - """SearchAttributes to upsert. The indexed_fields map will be merged with existing search - attributes, with these values taking precedence. - """ - def __init__( - self, - *, - search_attributes: temporalio.api.common.v1.message_pb2.SearchAttributes - | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "search_attributes", b"search_attributes" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "search_attributes", b"search_attributes" - ], - ) -> None: ... - -global___UpsertWorkflowSearchAttributes = UpsertWorkflowSearchAttributes - -class ModifyWorkflowProperties(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - UPSERTED_MEMO_FIELD_NUMBER: builtins.int - @property - def upserted_memo(self) -> temporalio.api.common.v1.message_pb2.Memo: - """If set, update the workflow memo with the provided values. The values will be merged with - the existing memo. If the user wants to delete values, a default/empty Payload should be - used as the value for the key being deleted. - """ - def __init__( - self, - *, - upserted_memo: temporalio.api.common.v1.message_pb2.Memo | None = ..., - ) -> None: ... - def HasField( - self, field_name: typing_extensions.Literal["upserted_memo", b"upserted_memo"] - ) -> builtins.bool: ... - def ClearField( - self, field_name: typing_extensions.Literal["upserted_memo", b"upserted_memo"] - ) -> None: ... - -global___ModifyWorkflowProperties = ModifyWorkflowProperties - -class UpdateResponse(google.protobuf.message.Message): - """A reply to a `DoUpdate` job - lang must run the update's validator if told to, and then - immediately run the handler, if the update was accepted. - - There must always be an accepted or rejected response immediately, in the same activation as - this job, to indicate the result of the validator. Accepted for ran and accepted or skipped, or - rejected for rejected. - - Then, in the same or any subsequent activation, after the update handler has completed, respond - with completed or rejected as appropriate for the result of the handler. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - PROTOCOL_INSTANCE_ID_FIELD_NUMBER: builtins.int - ACCEPTED_FIELD_NUMBER: builtins.int - REJECTED_FIELD_NUMBER: builtins.int - COMPLETED_FIELD_NUMBER: builtins.int - protocol_instance_id: builtins.str - """The protocol message instance ID""" - @property - def accepted(self) -> google.protobuf.empty_pb2.Empty: - """Must be sent if the update's validator has passed (or lang was not asked to run it, and - thus should be considered already-accepted, allowing lang to always send the same - sequence on replay). - """ - @property - def rejected(self) -> temporalio.api.failure.v1.message_pb2.Failure: - """Must be sent if the update's validator does not pass, or after acceptance if the update - handler fails. - """ - @property - def completed(self) -> temporalio.api.common.v1.message_pb2.Payload: - """Must be sent once the update handler completes successfully.""" - def __init__( - self, - *, - protocol_instance_id: builtins.str = ..., - accepted: google.protobuf.empty_pb2.Empty | None = ..., - rejected: temporalio.api.failure.v1.message_pb2.Failure | None = ..., - completed: temporalio.api.common.v1.message_pb2.Payload | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "accepted", - b"accepted", - "completed", - b"completed", - "rejected", - b"rejected", - "response", - b"response", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "accepted", - b"accepted", - "completed", - b"completed", - "protocol_instance_id", - b"protocol_instance_id", - "rejected", - b"rejected", - "response", - b"response", - ], - ) -> None: ... - def WhichOneof( - self, oneof_group: typing_extensions.Literal["response", b"response"] - ) -> typing_extensions.Literal["accepted", "rejected", "completed"] | None: ... - -global___UpdateResponse = UpdateResponse - -class ScheduleNexusOperation(google.protobuf.message.Message): - """A request to begin a Nexus operation""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - class NexusHeaderEntry(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - KEY_FIELD_NUMBER: builtins.int - VALUE_FIELD_NUMBER: builtins.int - key: builtins.str - value: builtins.str - def __init__( - self, - *, - key: builtins.str = ..., - value: builtins.str = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal["key", b"key", "value", b"value"], - ) -> None: ... - - SEQ_FIELD_NUMBER: builtins.int - ENDPOINT_FIELD_NUMBER: builtins.int - SERVICE_FIELD_NUMBER: builtins.int - OPERATION_FIELD_NUMBER: builtins.int - INPUT_FIELD_NUMBER: builtins.int - SCHEDULE_TO_CLOSE_TIMEOUT_FIELD_NUMBER: builtins.int - NEXUS_HEADER_FIELD_NUMBER: builtins.int - CANCELLATION_TYPE_FIELD_NUMBER: builtins.int - SCHEDULE_TO_START_TIMEOUT_FIELD_NUMBER: builtins.int - START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - endpoint: builtins.str - """Endpoint name, must exist in the endpoint registry or this command will fail.""" - service: builtins.str - """Service name.""" - operation: builtins.str - """Operation name.""" - @property - def input(self) -> temporalio.api.common.v1.message_pb2.Payload: - """Input for the operation. The server converts this into Nexus request content and the - appropriate content headers internally when sending the StartOperation request. On the - handler side, if it is also backed by Temporal, the content is transformed back to the - original Payload sent in this command. - """ - @property - def schedule_to_close_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Schedule-to-close timeout for this operation. - Indicates how long the caller is willing to wait for operation completion. - Calls are retried internally by the server. - """ - @property - def nexus_header( - self, - ) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: - """Header to attach to the Nexus request. - Users are responsible for encrypting sensitive data in this header as it is stored in - workflow history and transmitted to external services as-is. This is useful for propagating - tracing information. Note these headers are not the same as Temporal headers on internal - activities and child workflows, these are transmitted to Nexus operations that may be - external and are not traditional payloads. - """ - cancellation_type: ( - temporalio.bridge.proto.nexus.nexus_pb2.NexusOperationCancellationType.ValueType - ) - """Defines behaviour of the underlying nexus operation when operation cancellation has been requested.""" - @property - def schedule_to_start_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Schedule-to-start timeout for this operation. - Indicates how long the caller is willing to wait for the operation to be started (or completed if synchronous) - by the handler. If the operation is not started within this timeout, it will fail with - TIMEOUT_TYPE_SCHEDULE_TO_START. - If not set or zero, no schedule-to-start timeout is enforced. - """ - @property - def start_to_close_timeout(self) -> google.protobuf.duration_pb2.Duration: - """Start-to-close timeout for this operation. - Indicates how long the caller is willing to wait for an asynchronous operation to complete after it has been - started. If the operation does not complete within this timeout after starting, it will fail with - TIMEOUT_TYPE_START_TO_CLOSE. - Only applies to asynchronous operations. Synchronous operations ignore this timeout. - If not set or zero, no start-to-close timeout is enforced. - """ - def __init__( - self, - *, - seq: builtins.int = ..., - endpoint: builtins.str = ..., - service: builtins.str = ..., - operation: builtins.str = ..., - input: temporalio.api.common.v1.message_pb2.Payload | None = ..., - schedule_to_close_timeout: google.protobuf.duration_pb2.Duration | None = ..., - nexus_header: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., - cancellation_type: temporalio.bridge.proto.nexus.nexus_pb2.NexusOperationCancellationType.ValueType = ..., - schedule_to_start_timeout: google.protobuf.duration_pb2.Duration | None = ..., - start_to_close_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "input", - b"input", - "schedule_to_close_timeout", - b"schedule_to_close_timeout", - "schedule_to_start_timeout", - b"schedule_to_start_timeout", - "start_to_close_timeout", - b"start_to_close_timeout", - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "cancellation_type", - b"cancellation_type", - "endpoint", - b"endpoint", - "input", - b"input", - "nexus_header", - b"nexus_header", - "operation", - b"operation", - "schedule_to_close_timeout", - b"schedule_to_close_timeout", - "schedule_to_start_timeout", - b"schedule_to_start_timeout", - "seq", - b"seq", - "service", - b"service", - "start_to_close_timeout", - b"start_to_close_timeout", - ], - ) -> None: ... - -global___ScheduleNexusOperation = ScheduleNexusOperation - -class RequestCancelNexusOperation(google.protobuf.message.Message): - """Request cancellation of a nexus operation started via `ScheduleNexusOperation`""" - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number as passed to `ScheduleNexusOperation`""" - def __init__( - self, - *, - seq: builtins.int = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["seq", b"seq"] - ) -> None: ... - -global___RequestCancelNexusOperation = RequestCancelNexusOperation +import datetime + +from google.protobuf import duration_pb2 as _duration_pb2 +from google.protobuf import timestamp_pb2 as _timestamp_pb2 +from google.protobuf import empty_pb2 as _empty_pb2 +from temporalio.api.common.v1 import message_pb2 as _message_pb2 +from temporalio.api.enums.v1 import workflow_pb2 as _workflow_pb2 +from temporalio.api.failure.v1 import message_pb2 as _message_pb2_1 +from temporalio.api.sdk.v1 import user_metadata_pb2 as _user_metadata_pb2 +from temporalio.api.stream.v1 import message_pb2 as _message_pb2_1_1 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as _event_group_marker_pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as _child_workflow_pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as _nexus_pb2 +from temporalio.bridge.proto.common import common_pb2 as _common_pb2 +from temporalio.bridge.proto.external_data import external_data_pb2 as _external_data_pb2 +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Iterable as _Iterable, Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class ActivityCancellationType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + TRY_CANCEL: _ClassVar[ActivityCancellationType] + WAIT_CANCELLATION_COMPLETED: _ClassVar[ActivityCancellationType] + ABANDON: _ClassVar[ActivityCancellationType] +TRY_CANCEL: ActivityCancellationType +WAIT_CANCELLATION_COMPLETED: ActivityCancellationType +ABANDON: ActivityCancellationType + +class WorkflowCommand(_message.Message): + __slots__ = ("user_metadata", "event_group_markers", "start_timer", "schedule_activity", "respond_to_query", "request_cancel_activity", "cancel_timer", "complete_workflow_execution", "fail_workflow_execution", "continue_as_new_workflow_execution", "cancel_workflow_execution", "set_patch_marker", "start_child_workflow_execution", "cancel_child_workflow_execution", "request_cancel_external_workflow_execution", "signal_external_workflow_execution", "cancel_signal_workflow", "schedule_local_activity", "request_cancel_local_activity", "upsert_workflow_search_attributes", "modify_workflow_properties", "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", "workflow_stream_progress", "workflow_stream_quiescent", "external_stream_park_result", "external_stream_finalized", "workflow_output_stream_commit", "workflow_output_stream_buffered", "subscribe_stream", "add_stream_messages") + USER_METADATA_FIELD_NUMBER: _ClassVar[int] + EVENT_GROUP_MARKERS_FIELD_NUMBER: _ClassVar[int] + START_TIMER_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_ACTIVITY_FIELD_NUMBER: _ClassVar[int] + RESPOND_TO_QUERY_FIELD_NUMBER: _ClassVar[int] + REQUEST_CANCEL_ACTIVITY_FIELD_NUMBER: _ClassVar[int] + CANCEL_TIMER_FIELD_NUMBER: _ClassVar[int] + COMPLETE_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + FAIL_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + CONTINUE_AS_NEW_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + CANCEL_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + SET_PATCH_MARKER_FIELD_NUMBER: _ClassVar[int] + START_CHILD_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + CANCEL_CHILD_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + CANCEL_SIGNAL_WORKFLOW_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_LOCAL_ACTIVITY_FIELD_NUMBER: _ClassVar[int] + REQUEST_CANCEL_LOCAL_ACTIVITY_FIELD_NUMBER: _ClassVar[int] + UPSERT_WORKFLOW_SEARCH_ATTRIBUTES_FIELD_NUMBER: _ClassVar[int] + MODIFY_WORKFLOW_PROPERTIES_FIELD_NUMBER: _ClassVar[int] + UPDATE_RESPONSE_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: _ClassVar[int] + REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_STREAM_PROGRESS_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_STREAM_QUIESCENT_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_STREAM_PARK_RESULT_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_STREAM_FINALIZED_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_OUTPUT_STREAM_COMMIT_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_OUTPUT_STREAM_BUFFERED_FIELD_NUMBER: _ClassVar[int] + SUBSCRIBE_STREAM_FIELD_NUMBER: _ClassVar[int] + ADD_STREAM_MESSAGES_FIELD_NUMBER: _ClassVar[int] + user_metadata: _user_metadata_pb2.UserMetadata + event_group_markers: _containers.RepeatedCompositeFieldContainer[_event_group_marker_pb2.EventGroupMarker] + start_timer: StartTimer + schedule_activity: ScheduleActivity + respond_to_query: QueryResult + request_cancel_activity: RequestCancelActivity + cancel_timer: CancelTimer + complete_workflow_execution: CompleteWorkflowExecution + fail_workflow_execution: FailWorkflowExecution + continue_as_new_workflow_execution: ContinueAsNewWorkflowExecution + cancel_workflow_execution: CancelWorkflowExecution + set_patch_marker: SetPatchMarker + start_child_workflow_execution: StartChildWorkflowExecution + cancel_child_workflow_execution: CancelChildWorkflowExecution + request_cancel_external_workflow_execution: RequestCancelExternalWorkflowExecution + signal_external_workflow_execution: SignalExternalWorkflowExecution + cancel_signal_workflow: CancelSignalWorkflow + schedule_local_activity: ScheduleLocalActivity + request_cancel_local_activity: RequestCancelLocalActivity + upsert_workflow_search_attributes: UpsertWorkflowSearchAttributes + modify_workflow_properties: ModifyWorkflowProperties + update_response: UpdateResponse + schedule_nexus_operation: ScheduleNexusOperation + request_cancel_nexus_operation: RequestCancelNexusOperation + workflow_stream_progress: WorkflowStreamProgress + workflow_stream_quiescent: WorkflowStreamQuiescent + external_stream_park_result: ExternalStreamParkResult + external_stream_finalized: ExternalStreamFinalized + workflow_output_stream_commit: WorkflowOutputStreamCommit + workflow_output_stream_buffered: WorkflowOutputStreamBuffered + subscribe_stream: SubscribeStream + add_stream_messages: AddStreamMessages + def __init__(self, user_metadata: _Optional[_Union[_user_metadata_pb2.UserMetadata, _Mapping]] = ..., event_group_markers: _Optional[_Iterable[_Union[_event_group_marker_pb2.EventGroupMarker, _Mapping]]] = ..., start_timer: _Optional[_Union[StartTimer, _Mapping]] = ..., schedule_activity: _Optional[_Union[ScheduleActivity, _Mapping]] = ..., respond_to_query: _Optional[_Union[QueryResult, _Mapping]] = ..., request_cancel_activity: _Optional[_Union[RequestCancelActivity, _Mapping]] = ..., cancel_timer: _Optional[_Union[CancelTimer, _Mapping]] = ..., complete_workflow_execution: _Optional[_Union[CompleteWorkflowExecution, _Mapping]] = ..., fail_workflow_execution: _Optional[_Union[FailWorkflowExecution, _Mapping]] = ..., continue_as_new_workflow_execution: _Optional[_Union[ContinueAsNewWorkflowExecution, _Mapping]] = ..., cancel_workflow_execution: _Optional[_Union[CancelWorkflowExecution, _Mapping]] = ..., set_patch_marker: _Optional[_Union[SetPatchMarker, _Mapping]] = ..., start_child_workflow_execution: _Optional[_Union[StartChildWorkflowExecution, _Mapping]] = ..., cancel_child_workflow_execution: _Optional[_Union[CancelChildWorkflowExecution, _Mapping]] = ..., request_cancel_external_workflow_execution: _Optional[_Union[RequestCancelExternalWorkflowExecution, _Mapping]] = ..., signal_external_workflow_execution: _Optional[_Union[SignalExternalWorkflowExecution, _Mapping]] = ..., cancel_signal_workflow: _Optional[_Union[CancelSignalWorkflow, _Mapping]] = ..., schedule_local_activity: _Optional[_Union[ScheduleLocalActivity, _Mapping]] = ..., request_cancel_local_activity: _Optional[_Union[RequestCancelLocalActivity, _Mapping]] = ..., upsert_workflow_search_attributes: _Optional[_Union[UpsertWorkflowSearchAttributes, _Mapping]] = ..., modify_workflow_properties: _Optional[_Union[ModifyWorkflowProperties, _Mapping]] = ..., update_response: _Optional[_Union[UpdateResponse, _Mapping]] = ..., schedule_nexus_operation: _Optional[_Union[ScheduleNexusOperation, _Mapping]] = ..., request_cancel_nexus_operation: _Optional[_Union[RequestCancelNexusOperation, _Mapping]] = ..., workflow_stream_progress: _Optional[_Union[WorkflowStreamProgress, _Mapping]] = ..., workflow_stream_quiescent: _Optional[_Union[WorkflowStreamQuiescent, _Mapping]] = ..., external_stream_park_result: _Optional[_Union[ExternalStreamParkResult, _Mapping]] = ..., external_stream_finalized: _Optional[_Union[ExternalStreamFinalized, _Mapping]] = ..., workflow_output_stream_commit: _Optional[_Union[WorkflowOutputStreamCommit, _Mapping]] = ..., workflow_output_stream_buffered: _Optional[_Union[WorkflowOutputStreamBuffered, _Mapping]] = ..., subscribe_stream: _Optional[_Union[SubscribeStream, _Mapping]] = ..., add_stream_messages: _Optional[_Union[AddStreamMessages, _Mapping]] = ...) -> None: ... + +class WorkflowStreamProgress(_message.Message): + __slots__ = ("observation_delta", "request_rollover") + OBSERVATION_DELTA_FIELD_NUMBER: _ClassVar[int] + REQUEST_ROLLOVER_FIELD_NUMBER: _ClassVar[int] + observation_delta: bytes + request_rollover: bool + def __init__(self, observation_delta: _Optional[bytes] = ..., request_rollover: _Optional[bool] = ...) -> None: ... + +class WorkflowStreamQuiescent(_message.Message): + __slots__ = ("quiescence_generation", "waits", "idle_timeout") + QUIESCENCE_GENERATION_FIELD_NUMBER: _ClassVar[int] + WAITS_FIELD_NUMBER: _ClassVar[int] + IDLE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + quiescence_generation: int + waits: _containers.RepeatedCompositeFieldContainer[ExternalStreamWait] + idle_timeout: _duration_pb2.Duration + def __init__(self, quiescence_generation: _Optional[int] = ..., waits: _Optional[_Iterable[_Union[ExternalStreamWait, _Mapping]]] = ..., idle_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ...) -> None: ... + +class ExternalStreamWait(_message.Message): + __slots__ = ("wait_id", "generation", "immediately_parkable") + WAIT_ID_FIELD_NUMBER: _ClassVar[int] + GENERATION_FIELD_NUMBER: _ClassVar[int] + IMMEDIATELY_PARKABLE_FIELD_NUMBER: _ClassVar[int] + wait_id: int + generation: int + immediately_parkable: bool + def __init__(self, wait_id: _Optional[int] = ..., generation: _Optional[int] = ..., immediately_parkable: _Optional[bool] = ...) -> None: ... + +class ExternalStreamParkResult(_message.Message): + __slots__ = ("quiescence_generation", "confirmed", "became_ready", "final_observation_delta") + QUIESCENCE_GENERATION_FIELD_NUMBER: _ClassVar[int] + CONFIRMED_FIELD_NUMBER: _ClassVar[int] + BECAME_READY_FIELD_NUMBER: _ClassVar[int] + FINAL_OBSERVATION_DELTA_FIELD_NUMBER: _ClassVar[int] + quiescence_generation: int + confirmed: ParkSetConfirmed + became_ready: StreamSetBecameReady + final_observation_delta: bytes + def __init__(self, quiescence_generation: _Optional[int] = ..., confirmed: _Optional[_Union[ParkSetConfirmed, _Mapping]] = ..., became_ready: _Optional[_Union[StreamSetBecameReady, _Mapping]] = ..., final_observation_delta: _Optional[bytes] = ...) -> None: ... + +class ParkSetConfirmed(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class StreamSetBecameReady(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class ExternalStreamFinalized(_message.Message): + __slots__ = ("quiescence_generation", "final_observation_delta") + QUIESCENCE_GENERATION_FIELD_NUMBER: _ClassVar[int] + FINAL_OBSERVATION_DELTA_FIELD_NUMBER: _ClassVar[int] + quiescence_generation: int + final_observation_delta: bytes + def __init__(self, quiescence_generation: _Optional[int] = ..., final_observation_delta: _Optional[bytes] = ...) -> None: ... + +class WorkflowOutputStreamCommit(_message.Message): + __slots__ = ("manifest", "request_rollover") + MANIFEST_FIELD_NUMBER: _ClassVar[int] + REQUEST_ROLLOVER_FIELD_NUMBER: _ClassVar[int] + manifest: _external_data_pb2.ExternalOutputStreamManifest + request_rollover: bool + def __init__(self, manifest: _Optional[_Union[_external_data_pb2.ExternalOutputStreamManifest, _Mapping]] = ..., request_rollover: _Optional[bool] = ...) -> None: ... + +class WorkflowOutputStreamBuffered(_message.Message): + __slots__ = ("max_publish_latency",) + MAX_PUBLISH_LATENCY_FIELD_NUMBER: _ClassVar[int] + max_publish_latency: _duration_pb2.Duration + def __init__(self, max_publish_latency: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ...) -> None: ... + +class AddStreamMessages(_message.Message): + __slots__ = ("stream_id", "messages") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + stream_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2_1_1.StreamMessage] + def __init__(self, stream_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2_1_1.StreamMessage, _Mapping]]] = ...) -> None: ... + +class SubscribeStream(_message.Message): + __slots__ = ("stream_id", "start_offset") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + stream_id: str + start_offset: int + def __init__(self, stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class StartTimer(_message.Message): + __slots__ = ("seq", "start_to_fire_timeout") + SEQ_FIELD_NUMBER: _ClassVar[int] + START_TO_FIRE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + seq: int + start_to_fire_timeout: _duration_pb2.Duration + def __init__(self, seq: _Optional[int] = ..., start_to_fire_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ...) -> None: ... + +class CancelTimer(_message.Message): + __slots__ = ("seq",) + SEQ_FIELD_NUMBER: _ClassVar[int] + seq: int + def __init__(self, seq: _Optional[int] = ...) -> None: ... + +class ScheduleActivity(_message.Message): + __slots__ = ("seq", "activity_id", "activity_type", "task_queue", "headers", "arguments", "schedule_to_close_timeout", "schedule_to_start_timeout", "start_to_close_timeout", "heartbeat_timeout", "retry_policy", "cancellation_type", "do_not_eagerly_execute", "versioning_intent", "priority") + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + SEQ_FIELD_NUMBER: _ClassVar[int] + ACTIVITY_ID_FIELD_NUMBER: _ClassVar[int] + ACTIVITY_TYPE_FIELD_NUMBER: _ClassVar[int] + TASK_QUEUE_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + ARGUMENTS_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_TO_CLOSE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_TO_START_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + HEARTBEAT_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + RETRY_POLICY_FIELD_NUMBER: _ClassVar[int] + CANCELLATION_TYPE_FIELD_NUMBER: _ClassVar[int] + DO_NOT_EAGERLY_EXECUTE_FIELD_NUMBER: _ClassVar[int] + VERSIONING_INTENT_FIELD_NUMBER: _ClassVar[int] + PRIORITY_FIELD_NUMBER: _ClassVar[int] + seq: int + activity_id: str + activity_type: str + task_queue: str + headers: _containers.MessageMap[str, _message_pb2.Payload] + arguments: _containers.RepeatedCompositeFieldContainer[_message_pb2.Payload] + schedule_to_close_timeout: _duration_pb2.Duration + schedule_to_start_timeout: _duration_pb2.Duration + start_to_close_timeout: _duration_pb2.Duration + heartbeat_timeout: _duration_pb2.Duration + retry_policy: _message_pb2.RetryPolicy + cancellation_type: ActivityCancellationType + do_not_eagerly_execute: bool + versioning_intent: _common_pb2.VersioningIntent + priority: _message_pb2.Priority + def __init__(self, seq: _Optional[int] = ..., activity_id: _Optional[str] = ..., activity_type: _Optional[str] = ..., task_queue: _Optional[str] = ..., headers: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., arguments: _Optional[_Iterable[_Union[_message_pb2.Payload, _Mapping]]] = ..., schedule_to_close_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., schedule_to_start_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., start_to_close_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., heartbeat_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., retry_policy: _Optional[_Union[_message_pb2.RetryPolicy, _Mapping]] = ..., cancellation_type: _Optional[_Union[ActivityCancellationType, str]] = ..., do_not_eagerly_execute: _Optional[bool] = ..., versioning_intent: _Optional[_Union[_common_pb2.VersioningIntent, str]] = ..., priority: _Optional[_Union[_message_pb2.Priority, _Mapping]] = ...) -> None: ... + +class ScheduleLocalActivity(_message.Message): + __slots__ = ("seq", "activity_id", "activity_type", "attempt", "original_schedule_time", "headers", "arguments", "schedule_to_close_timeout", "schedule_to_start_timeout", "start_to_close_timeout", "retry_policy", "local_retry_threshold", "cancellation_type") + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + SEQ_FIELD_NUMBER: _ClassVar[int] + ACTIVITY_ID_FIELD_NUMBER: _ClassVar[int] + ACTIVITY_TYPE_FIELD_NUMBER: _ClassVar[int] + ATTEMPT_FIELD_NUMBER: _ClassVar[int] + ORIGINAL_SCHEDULE_TIME_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + ARGUMENTS_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_TO_CLOSE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_TO_START_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + RETRY_POLICY_FIELD_NUMBER: _ClassVar[int] + LOCAL_RETRY_THRESHOLD_FIELD_NUMBER: _ClassVar[int] + CANCELLATION_TYPE_FIELD_NUMBER: _ClassVar[int] + seq: int + activity_id: str + activity_type: str + attempt: int + original_schedule_time: _timestamp_pb2.Timestamp + headers: _containers.MessageMap[str, _message_pb2.Payload] + arguments: _containers.RepeatedCompositeFieldContainer[_message_pb2.Payload] + schedule_to_close_timeout: _duration_pb2.Duration + schedule_to_start_timeout: _duration_pb2.Duration + start_to_close_timeout: _duration_pb2.Duration + retry_policy: _message_pb2.RetryPolicy + local_retry_threshold: _duration_pb2.Duration + cancellation_type: ActivityCancellationType + def __init__(self, seq: _Optional[int] = ..., activity_id: _Optional[str] = ..., activity_type: _Optional[str] = ..., attempt: _Optional[int] = ..., original_schedule_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., headers: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., arguments: _Optional[_Iterable[_Union[_message_pb2.Payload, _Mapping]]] = ..., schedule_to_close_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., schedule_to_start_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., start_to_close_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., retry_policy: _Optional[_Union[_message_pb2.RetryPolicy, _Mapping]] = ..., local_retry_threshold: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., cancellation_type: _Optional[_Union[ActivityCancellationType, str]] = ...) -> None: ... + +class RequestCancelActivity(_message.Message): + __slots__ = ("seq",) + SEQ_FIELD_NUMBER: _ClassVar[int] + seq: int + def __init__(self, seq: _Optional[int] = ...) -> None: ... + +class RequestCancelLocalActivity(_message.Message): + __slots__ = ("seq",) + SEQ_FIELD_NUMBER: _ClassVar[int] + seq: int + def __init__(self, seq: _Optional[int] = ...) -> None: ... + +class QueryResult(_message.Message): + __slots__ = ("query_id", "succeeded", "failed") + QUERY_ID_FIELD_NUMBER: _ClassVar[int] + SUCCEEDED_FIELD_NUMBER: _ClassVar[int] + FAILED_FIELD_NUMBER: _ClassVar[int] + query_id: str + succeeded: QuerySuccess + failed: _message_pb2_1.Failure + def __init__(self, query_id: _Optional[str] = ..., succeeded: _Optional[_Union[QuerySuccess, _Mapping]] = ..., failed: _Optional[_Union[_message_pb2_1.Failure, _Mapping]] = ...) -> None: ... + +class QuerySuccess(_message.Message): + __slots__ = ("response",) + RESPONSE_FIELD_NUMBER: _ClassVar[int] + response: _message_pb2.Payload + def __init__(self, response: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + +class CompleteWorkflowExecution(_message.Message): + __slots__ = ("result",) + RESULT_FIELD_NUMBER: _ClassVar[int] + result: _message_pb2.Payload + def __init__(self, result: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + +class FailWorkflowExecution(_message.Message): + __slots__ = ("failure",) + FAILURE_FIELD_NUMBER: _ClassVar[int] + failure: _message_pb2_1.Failure + def __init__(self, failure: _Optional[_Union[_message_pb2_1.Failure, _Mapping]] = ...) -> None: ... + +class ContinueAsNewWorkflowExecution(_message.Message): + __slots__ = ("workflow_type", "task_queue", "arguments", "workflow_run_timeout", "workflow_task_timeout", "memo", "headers", "search_attributes", "retry_policy", "versioning_intent", "initial_versioning_behavior", "backoff_start_interval") + class MemoEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + WORKFLOW_TYPE_FIELD_NUMBER: _ClassVar[int] + TASK_QUEUE_FIELD_NUMBER: _ClassVar[int] + ARGUMENTS_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_RUN_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_TASK_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + MEMO_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + SEARCH_ATTRIBUTES_FIELD_NUMBER: _ClassVar[int] + RETRY_POLICY_FIELD_NUMBER: _ClassVar[int] + VERSIONING_INTENT_FIELD_NUMBER: _ClassVar[int] + INITIAL_VERSIONING_BEHAVIOR_FIELD_NUMBER: _ClassVar[int] + BACKOFF_START_INTERVAL_FIELD_NUMBER: _ClassVar[int] + workflow_type: str + task_queue: str + arguments: _containers.RepeatedCompositeFieldContainer[_message_pb2.Payload] + workflow_run_timeout: _duration_pb2.Duration + workflow_task_timeout: _duration_pb2.Duration + memo: _containers.MessageMap[str, _message_pb2.Payload] + headers: _containers.MessageMap[str, _message_pb2.Payload] + search_attributes: _message_pb2.SearchAttributes + retry_policy: _message_pb2.RetryPolicy + versioning_intent: _common_pb2.VersioningIntent + initial_versioning_behavior: _workflow_pb2.ContinueAsNewVersioningBehavior + backoff_start_interval: _duration_pb2.Duration + def __init__(self, workflow_type: _Optional[str] = ..., task_queue: _Optional[str] = ..., arguments: _Optional[_Iterable[_Union[_message_pb2.Payload, _Mapping]]] = ..., workflow_run_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., workflow_task_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., memo: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., headers: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., search_attributes: _Optional[_Union[_message_pb2.SearchAttributes, _Mapping]] = ..., retry_policy: _Optional[_Union[_message_pb2.RetryPolicy, _Mapping]] = ..., versioning_intent: _Optional[_Union[_common_pb2.VersioningIntent, str]] = ..., initial_versioning_behavior: _Optional[_Union[_workflow_pb2.ContinueAsNewVersioningBehavior, str]] = ..., backoff_start_interval: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ...) -> None: ... + +class CancelWorkflowExecution(_message.Message): + __slots__ = ("details",) + DETAILS_FIELD_NUMBER: _ClassVar[int] + details: _message_pb2.Payloads + def __init__(self, details: _Optional[_Union[_message_pb2.Payloads, _Mapping]] = ...) -> None: ... + +class SetPatchMarker(_message.Message): + __slots__ = ("patch_id", "deprecated") + PATCH_ID_FIELD_NUMBER: _ClassVar[int] + DEPRECATED_FIELD_NUMBER: _ClassVar[int] + patch_id: str + deprecated: bool + def __init__(self, patch_id: _Optional[str] = ..., deprecated: _Optional[bool] = ...) -> None: ... + +class StartChildWorkflowExecution(_message.Message): + __slots__ = ("seq", "namespace", "workflow_id", "workflow_type", "task_queue", "input", "workflow_execution_timeout", "workflow_run_timeout", "workflow_task_timeout", "parent_close_policy", "workflow_id_reuse_policy", "retry_policy", "cron_schedule", "headers", "memo", "search_attributes", "cancellation_type", "versioning_intent", "priority") + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + class MemoEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + SEQ_FIELD_NUMBER: _ClassVar[int] + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_TYPE_FIELD_NUMBER: _ClassVar[int] + TASK_QUEUE_FIELD_NUMBER: _ClassVar[int] + INPUT_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_EXECUTION_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_RUN_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_TASK_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + PARENT_CLOSE_POLICY_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_REUSE_POLICY_FIELD_NUMBER: _ClassVar[int] + RETRY_POLICY_FIELD_NUMBER: _ClassVar[int] + CRON_SCHEDULE_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + MEMO_FIELD_NUMBER: _ClassVar[int] + SEARCH_ATTRIBUTES_FIELD_NUMBER: _ClassVar[int] + CANCELLATION_TYPE_FIELD_NUMBER: _ClassVar[int] + VERSIONING_INTENT_FIELD_NUMBER: _ClassVar[int] + PRIORITY_FIELD_NUMBER: _ClassVar[int] + seq: int + namespace: str + workflow_id: str + workflow_type: str + task_queue: str + input: _containers.RepeatedCompositeFieldContainer[_message_pb2.Payload] + workflow_execution_timeout: _duration_pb2.Duration + workflow_run_timeout: _duration_pb2.Duration + workflow_task_timeout: _duration_pb2.Duration + parent_close_policy: _child_workflow_pb2.ParentClosePolicy + workflow_id_reuse_policy: _workflow_pb2.WorkflowIdReusePolicy + retry_policy: _message_pb2.RetryPolicy + cron_schedule: str + headers: _containers.MessageMap[str, _message_pb2.Payload] + memo: _containers.MessageMap[str, _message_pb2.Payload] + search_attributes: _message_pb2.SearchAttributes + cancellation_type: _child_workflow_pb2.ChildWorkflowCancellationType + versioning_intent: _common_pb2.VersioningIntent + priority: _message_pb2.Priority + def __init__(self, seq: _Optional[int] = ..., namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., workflow_type: _Optional[str] = ..., task_queue: _Optional[str] = ..., input: _Optional[_Iterable[_Union[_message_pb2.Payload, _Mapping]]] = ..., workflow_execution_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., workflow_run_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., workflow_task_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., parent_close_policy: _Optional[_Union[_child_workflow_pb2.ParentClosePolicy, str]] = ..., workflow_id_reuse_policy: _Optional[_Union[_workflow_pb2.WorkflowIdReusePolicy, str]] = ..., retry_policy: _Optional[_Union[_message_pb2.RetryPolicy, _Mapping]] = ..., cron_schedule: _Optional[str] = ..., headers: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., memo: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., search_attributes: _Optional[_Union[_message_pb2.SearchAttributes, _Mapping]] = ..., cancellation_type: _Optional[_Union[_child_workflow_pb2.ChildWorkflowCancellationType, str]] = ..., versioning_intent: _Optional[_Union[_common_pb2.VersioningIntent, str]] = ..., priority: _Optional[_Union[_message_pb2.Priority, _Mapping]] = ...) -> None: ... + +class CancelChildWorkflowExecution(_message.Message): + __slots__ = ("child_workflow_seq", "reason") + CHILD_WORKFLOW_SEQ_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + child_workflow_seq: int + reason: str + def __init__(self, child_workflow_seq: _Optional[int] = ..., reason: _Optional[str] = ...) -> None: ... + +class RequestCancelExternalWorkflowExecution(_message.Message): + __slots__ = ("seq", "workflow_execution", "reason") + SEQ_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + seq: int + workflow_execution: _common_pb2.NamespacedWorkflowExecution + reason: str + def __init__(self, seq: _Optional[int] = ..., workflow_execution: _Optional[_Union[_common_pb2.NamespacedWorkflowExecution, _Mapping]] = ..., reason: _Optional[str] = ...) -> None: ... + +class SignalExternalWorkflowExecution(_message.Message): + __slots__ = ("seq", "workflow_execution", "child_workflow_id", "signal_name", "args", "headers") + class HeadersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _message_pb2.Payload + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + SEQ_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_EXECUTION_FIELD_NUMBER: _ClassVar[int] + CHILD_WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + SIGNAL_NAME_FIELD_NUMBER: _ClassVar[int] + ARGS_FIELD_NUMBER: _ClassVar[int] + HEADERS_FIELD_NUMBER: _ClassVar[int] + seq: int + workflow_execution: _common_pb2.NamespacedWorkflowExecution + child_workflow_id: str + signal_name: str + args: _containers.RepeatedCompositeFieldContainer[_message_pb2.Payload] + headers: _containers.MessageMap[str, _message_pb2.Payload] + def __init__(self, seq: _Optional[int] = ..., workflow_execution: _Optional[_Union[_common_pb2.NamespacedWorkflowExecution, _Mapping]] = ..., child_workflow_id: _Optional[str] = ..., signal_name: _Optional[str] = ..., args: _Optional[_Iterable[_Union[_message_pb2.Payload, _Mapping]]] = ..., headers: _Optional[_Mapping[str, _message_pb2.Payload]] = ...) -> None: ... + +class CancelSignalWorkflow(_message.Message): + __slots__ = ("seq",) + SEQ_FIELD_NUMBER: _ClassVar[int] + seq: int + def __init__(self, seq: _Optional[int] = ...) -> None: ... + +class UpsertWorkflowSearchAttributes(_message.Message): + __slots__ = ("search_attributes",) + SEARCH_ATTRIBUTES_FIELD_NUMBER: _ClassVar[int] + search_attributes: _message_pb2.SearchAttributes + def __init__(self, search_attributes: _Optional[_Union[_message_pb2.SearchAttributes, _Mapping]] = ...) -> None: ... + +class ModifyWorkflowProperties(_message.Message): + __slots__ = ("upserted_memo",) + UPSERTED_MEMO_FIELD_NUMBER: _ClassVar[int] + upserted_memo: _message_pb2.Memo + def __init__(self, upserted_memo: _Optional[_Union[_message_pb2.Memo, _Mapping]] = ...) -> None: ... + +class UpdateResponse(_message.Message): + __slots__ = ("protocol_instance_id", "accepted", "rejected", "completed") + PROTOCOL_INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + ACCEPTED_FIELD_NUMBER: _ClassVar[int] + REJECTED_FIELD_NUMBER: _ClassVar[int] + COMPLETED_FIELD_NUMBER: _ClassVar[int] + protocol_instance_id: str + accepted: _empty_pb2.Empty + rejected: _message_pb2_1.Failure + completed: _message_pb2.Payload + def __init__(self, protocol_instance_id: _Optional[str] = ..., accepted: _Optional[_Union[_empty_pb2.Empty, _Mapping]] = ..., rejected: _Optional[_Union[_message_pb2_1.Failure, _Mapping]] = ..., completed: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ...) -> None: ... + +class ScheduleNexusOperation(_message.Message): + __slots__ = ("seq", "endpoint", "service", "operation", "input", "schedule_to_close_timeout", "nexus_header", "cancellation_type", "schedule_to_start_timeout", "start_to_close_timeout") + class NexusHeaderEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + SEQ_FIELD_NUMBER: _ClassVar[int] + ENDPOINT_FIELD_NUMBER: _ClassVar[int] + SERVICE_FIELD_NUMBER: _ClassVar[int] + OPERATION_FIELD_NUMBER: _ClassVar[int] + INPUT_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_TO_CLOSE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + NEXUS_HEADER_FIELD_NUMBER: _ClassVar[int] + CANCELLATION_TYPE_FIELD_NUMBER: _ClassVar[int] + SCHEDULE_TO_START_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + seq: int + endpoint: str + service: str + operation: str + input: _message_pb2.Payload + schedule_to_close_timeout: _duration_pb2.Duration + nexus_header: _containers.ScalarMap[str, str] + cancellation_type: _nexus_pb2.NexusOperationCancellationType + schedule_to_start_timeout: _duration_pb2.Duration + start_to_close_timeout: _duration_pb2.Duration + def __init__(self, seq: _Optional[int] = ..., endpoint: _Optional[str] = ..., service: _Optional[str] = ..., operation: _Optional[str] = ..., input: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., schedule_to_close_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., nexus_header: _Optional[_Mapping[str, str]] = ..., cancellation_type: _Optional[_Union[_nexus_pb2.NexusOperationCancellationType, str]] = ..., schedule_to_start_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., start_to_close_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ...) -> None: ... + +class RequestCancelNexusOperation(_message.Message): + __slots__ = ("seq",) + SEQ_FIELD_NUMBER: _ClassVar[int] + seq: int + def __init__(self, seq: _Optional[int] = ...) -> None: ... From 3899eeeaf1c127d3c31d0fa94b417a21d537b170 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 16:32:31 -0700 Subject: [PATCH 021/831] Documented running the demo on each provider. --- streams_demo/README.md | 64 + uv.lock | 4547 +++++++++++++++++++++------------------- 2 files changed, 2507 insertions(+), 2104 deletions(-) create mode 100644 streams_demo/README.md diff --git a/streams_demo/README.md b/streams_demo/README.md new file mode 100644 index 000000000..94aacc466 --- /dev/null +++ b/streams_demo/README.md @@ -0,0 +1,64 @@ +# One workflow file, three stream providers + +`agent_loop.py` and `run_demo.py` never name a provider. The provider is a +configuration choice, and this branch carries all three options plus the +Nexus front, so the same loop runs on each of them by changing one +environment variable. + +The loop: an Activity streams records into the workflow's `inputs` stream, +the workflow reads them, publishes a decision per record onto `decisions`, +runs an ordinary Activity in the same task, and an outside consumer follows +the decisions. + +## Today's Workflow Streams (Option 0) + +Records ride the shipped feature's Signals and Updates and live in the +workflow's History. Nothing to deploy; Option 0's limits apply. + +```sh +temporal server start-dev --headless & +STREAMS_PROVIDER=workflow_streams python streams_demo/run_demo.py +``` + +## Client-side (Redis) + +The store is a Redis the process names; the workflow's own writes go through +the staged commit, so a failed Workflow Task leaks nothing. + +```sh +redis-server --port 6399 & +temporal server start-dev --headless & +AI198_REDIS_URL=redis://127.0.0.1:6399 \ +STREAMS_PROVIDER=redis python streams_demo/run_demo.py +``` + +## Server-side (native) + +Streams live on the Temporal server; publishes are commands applied when the +task is accepted, and consumed ranges arrive on Workflow Tasks. Needs a +server built from `moedash/temporal` `moe/AI-198-server-side-streams`. + +```sh +TEMPORAL_ADDRESS=127.0.0.1:7233 \ +STREAMS_PROVIDER=native python streams_demo/run_demo.py +``` + +## The Nexus front (outside surface) + +Outside producers and consumers can go through one Temporal-authenticated +endpoint instead of naming a store; the handler worker hides whichever +provider it is configured with. Workers still configure a storage provider, +because workflow reads and writes ride the Workflow Task. + +```python +front = streams._provider.instance("nexus", endpoint=endpoint_id) +producer = await front.producer(None, workflow_id=wid, stream="inputs", + producer_id="model", attempt=1) +``` + +See `tests/streams/test_nexus_provider.py` for the endpoint setup and the +handler worker. + +The conformance suite runs the same expectations on every provider: +`pytest tests/streams/` (in-memory, no server), plus +`STREAMS_LIVE=workflow_streams|nexus` for the live suites. diff --git a/uv.lock b/uv.lock index d3ac48bfb..37dac641d 100644 --- a/uv.lock +++ b/uv.lock @@ -4,14 +4,11 @@ requires-python = ">=3.10" resolution-markers = [ "python_full_version >= '3.14'", "python_full_version == '3.13.*'", - "python_full_version >= '3.11' and python_full_version < '3.13'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "(python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten') or (python_full_version == '3.11.*' and sys_platform == 'emscripten')", "python_full_version < '3.11'", ] -[options] -exclude-newer = "2026-08-10T18:40:15.391197Z" -exclude-newer-span = "P2W" - [[package]] name = "aioboto3" version = "15.5.0" @@ -68,7 +65,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.14.1" +version = "3.14.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -81,126 +78,126 @@ dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.13'" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/78/8ea7308cac6934de8c74a14f3d5f65d1c89287426688be79538d0e5c013d/aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035", size = 7955794, upload-time = "2026-06-07T21:09:35.529Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/67/58ded4b3f2e10f94972d8928050c85330e249a31dd45a0e5f3c0e9c3fa05/aiohttp-3.14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f6bb621e5863cfe8fe5ff5468002d200ec31f30f1280b259dc505b02595099e", size = 766140, upload-time = "2026-06-07T21:05:37.471Z" }, - { url = "https://files.pythonhosted.org/packages/18/68/4ae5b4e08943f316594bb68da89957d3baf5760588fa09509594bd777e4b/aiohttp-3.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f7215cb3933784f79ed20e5f050e15984f390424339b22375d5a53c933a0491", size = 519430, upload-time = "2026-06-07T21:05:40.751Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c1/316c8f3549dbe5245f92bfd523ec6f32dd4d98cafe21df3f6a19b1184c75/aiohttp-3.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9d4e294455b23a68c9b8f042d0e8e377a265bcb15332753695f6e5b6819e0ce", size = 514406, upload-time = "2026-06-07T21:05:42.111Z" }, - { url = "https://files.pythonhosted.org/packages/5a/ee/fb0ac28684e8d753b83c8a4eebc19a5846912aa0a4daaabb6a9936363840/aiohttp-3.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b238af795833d5731d049d82bc84b768ae6f8f97f0495963b3ed9935c5901cc3", size = 1703649, upload-time = "2026-06-07T21:05:43.427Z" }, - { url = "https://files.pythonhosted.org/packages/3b/57/aa2beab673331f111885db8a7b69dfe3ab0e53e446a0ace18ca694b4dc58/aiohttp-3.14.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4e5e0ae56914ecdbf446493addefc0159053dd53962cef37d7839f37f73d505", size = 1675126, upload-time = "2026-06-07T21:05:44.897Z" }, - { url = "https://files.pythonhosted.org/packages/47/ea/dad128abe365e79be03b16ed464198ac73e0d257e8260c6f7d6f31cbef26/aiohttp-3.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:092e4ce3619a7c6dee52a6bdabda973d9b34b66781f840ce93c7e0cec30cf521", size = 1771558, upload-time = "2026-06-07T21:05:46.405Z" }, - { url = "https://files.pythonhosted.org/packages/63/f3/b5b4e10327cb85d34d24232c6b71b64602f190b3ccb238a043ac6b187dac/aiohttp-3.14.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb33777ea21e8b7ecde0e6fc84f598be0a1192eab1a63bc746d75aa75d38e7bd", size = 1856631, upload-time = "2026-06-07T21:05:47.844Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9d/93294c3045775c708ac8310eb3d3622a11d2951345ad590d532d62a1faa4/aiohttp-3.14.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23119f8fd4f5d16902ed459b63b100bcd269628075162bddac56cc7b5273b3fb", size = 1714139, upload-time = "2026-06-07T21:05:49.982Z" }, - { url = "https://files.pythonhosted.org/packages/29/c4/93067c85a0373492ce8e577435203c5947c454af074ac48ed4f3a1b9dd4a/aiohttp-3.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:57fc6745a4b7d0f5a9eb4f40a69718be6c0bc1b8368cc9fe89e90118719f4f42", size = 1588321, upload-time = "2026-06-07T21:05:51.431Z" }, - { url = "https://files.pythonhosted.org/packages/c4/39/9ff91aaf02af8b7b8222a987466da539f154c3e01732c22b5f5a20a8ee66/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6fd35beba67c4183b09375c5fff9accb47524191a244a99f95fd4472f5402c2b", size = 1670375, upload-time = "2026-06-07T21:05:53.109Z" }, - { url = "https://files.pythonhosted.org/packages/aa/e4/77452a3676b8d99ac1375f77691d6bf65ea6e9f4b201b82ef77c916dc767/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:672b9d65f42eb877f5c3f234a4547e4e1a226ca8c2eed879bb34670a0ce51192", size = 1690933, upload-time = "2026-06-07T21:05:54.902Z" }, - { url = "https://files.pythonhosted.org/packages/7d/84/b0059a7c7fc05ea23f3bc1596ba91c12f79588b9450564a24cac37536d0a/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:24ba13339fed9251d9b1a1bec8c7ab84c0d1675d79d33501e11f94f8b9a84e05", size = 1740798, upload-time = "2026-06-07T21:05:56.458Z" }, - { url = "https://files.pythonhosted.org/packages/8f/3a/e2a513ecbfc362591caa51a7f7e011b3bfc8938b388ae44cd95560d36999/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:94da27378da0610e341c4d30de29a191672683cc82b8f9556e8f7c7212a020fe", size = 1576412, upload-time = "2026-06-07T21:05:57.953Z" }, - { url = "https://files.pythonhosted.org/packages/a1/10/08f1654f538f93d36dcac66310a06eefce4641cdafca83f9f0a5317be254/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:52cdac9432d8b4a719f35094a818d95adcae0f0b4fe9b9b921909e0c87de9e7d", size = 1750199, upload-time = "2026-06-07T21:05:59.488Z" }, - { url = "https://files.pythonhosted.org/packages/99/e4/d91b70c57d8b8e9611e4a2e52238ca3698d3dc1c2efe25b7a9bf594ac584/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:672ac254412a24d0d0cf00a9e6c238877e4be5e5fa2d188832c1244f45f31966", size = 1699356, upload-time = "2026-06-07T21:06:01.131Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f1/15340176f35ff61b95dbe34020bcf43f9e624a2d7bbac934715ff97d2033/aiohttp-3.14.1-cp310-cp310-win32.whl", hash = "sha256:2fe3607e71acc6ebb0ec8e492a247bf7a291226192dc0084236dfc12478916f6", size = 458939, upload-time = "2026-06-07T21:06:02.86Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c2/a2f1ec5b37f903109e43ae2862268cfe4a67a60c1b2cf43169fcdff5995f/aiohttp-3.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:30099eda75a53c32efb0920e9c33c195314d2cc1c680fbfd30894932ac5f27df", size = 482583, upload-time = "2026-06-07T21:06:04.666Z" }, - { url = "https://files.pythonhosted.org/packages/d0/7a/7b56f6732ef79530afaa72aa335d41b67c8d79b946995f0b11ad72985435/aiohttp-3.14.1-cp310-cp310-win_arm64.whl", hash = "sha256:5a837f49d901f9e368651b676912bff1104ed8c1a83b280bcd7b29adccef5c9c", size = 453470, upload-time = "2026-06-07T21:06:06.322Z" }, - { url = "https://files.pythonhosted.org/packages/26/dd/bf526e6f0a1120dd6f2df2e97bacfe4d358f13d17a0ff5847301a1375a51/aiohttp-3.14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa00140699487bd435fde4342d85c94cb256b7cd3a5b9c3396c67f19922afda2", size = 765225, upload-time = "2026-06-07T21:06:07.957Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e1/a2872aa55495a70f61310d411541c6ee23812d9a884e000c716e1bc3edbf/aiohttp-3.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c1af67559445498b502030c35c59db59966f47041ca9de5b4e707f86bd10b5f", size = 518743, upload-time = "2026-06-07T21:06:09.749Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e7/c60c7b209e509cc787de3cea0550a518538cfc08003e1c1e14c1c63fff71/aiohttp-3.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d44ec478e713ee7f29b439f7eb8dc2b9d4079e11ae114d2c2ac3d5daf30516c8", size = 514139, upload-time = "2026-06-07T21:06:11.26Z" }, - { url = "https://files.pythonhosted.org/packages/5b/8d/614ace2f579702c9840ab1e1447fd8509e35b0b904f7196418fa2f57b25d/aiohttp-3.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3b1a184a9a8f548a6b73f1e26b96b052193e4b3175ed7342aaf1151a1f00a04", size = 1784088, upload-time = "2026-06-07T21:06:12.887Z" }, - { url = "https://files.pythonhosted.org/packages/49/e0/726e90f99542bf292f81a96a12cc4847deb86f3ccf62c6f4014a201f4d33/aiohttp-3.14.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5f2504bc0322437c9a1ff6d3333ca56c7477b727c995f036b976ae17b98372c8", size = 1737835, upload-time = "2026-06-07T21:06:14.564Z" }, - { url = "https://files.pythonhosted.org/packages/0b/4b/d176d5c4db9d33dacf0543102ea59503bc1d528af4cfd0b719949ca49389/aiohttp-3.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73f05ea02013e02512c3bf42714f1208c57168c779cc6fe23516e4543089d0a6", size = 1842801, upload-time = "2026-06-07T21:06:16.228Z" }, - { url = "https://files.pythonhosted.org/packages/dc/d6/5a99b563690ea0cbed912ae94a2ce33993a5709a651a3a4fe761e7dd973a/aiohttp-3.14.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:797457503c2d426bee06eef808d07b31ede30b65e054444e7de64cad0061b7af", size = 1929992, upload-time = "2026-06-07T21:06:17.947Z" }, - { url = "https://files.pythonhosted.org/packages/76/7f/a987b14a3859094b3cea3f4825219c3e5536242564af6e3f9c2f6c994eb2/aiohttp-3.14.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b821a1f7dedf7e37450654e620038ac3b2e81e8fa6ea269337e97101978ec730", size = 1786989, upload-time = "2026-06-07T21:06:19.677Z" }, - { url = "https://files.pythonhosted.org/packages/f1/1a/420e5c85a3e73349372ed22ce0b6af86bfa6ce16a4b20a64a2e94608c781/aiohttp-3.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4cd96b5ba05d67ed0cf00b5b405c8cd99586d8e3481e8ee0a831057591af7621", size = 1640129, upload-time = "2026-06-07T21:06:22.558Z" }, - { url = "https://files.pythonhosted.org/packages/a7/80/18a592ed3be0a402cc03670bd72ee1f8563ddbe1d8d5542dbf868f274136/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d459b98a932296c6f0e94f87511a0b1b90a8a02c30a50e60a297619cd5a58ee", size = 1756576, upload-time = "2026-06-07T21:06:24.8Z" }, - { url = "https://files.pythonhosted.org/packages/ec/0b/8b3d5713373858ff71a617daf6e3b0e81ad63e79d09a3cf2f6b6b983939c/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:764457a7be60825fb770a644852ff717bcbb5042f189f2bd16df61a81b3f6573", size = 1754668, upload-time = "2026-06-07T21:06:26.528Z" }, - { url = "https://files.pythonhosted.org/packages/9f/49/fd564575cf225821d7ba5a117cb8bc27213d8a7e1811162afb43ae077039/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7a16ef45b081454ef844502d87a848876c490c4cb5c650c230f6ec79ed2c1e7", size = 1817019, upload-time = "2026-06-07T21:06:28.297Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1b/e850c9ae6fc91356552ae668bb6c51e93fa29c8aef13398a10b56678557f/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2fbc3ed048b3475b9f0cbcb9978e9d2d3511acd91ead203af26ed9f0056004cf", size = 1631638, upload-time = "2026-06-07T21:06:30.242Z" }, - { url = "https://files.pythonhosted.org/packages/eb/94/3c337ba72451a89806ace6f75bddc92bafc5b8d53d90115a512858024b63/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bedb0cd073cc2dc035e30aeb99444389d3cd2113afe4ef9fcd23d439f5bade85", size = 1835660, upload-time = "2026-06-07T21:06:31.943Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9c/9c18cf367a0498212d9ba7daf990b504a5e8ae064cda4b504e2647c89c03/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b6feea921016eb3d4e04d65fc4e9ca402d1a3801f562aef94989f54694917af3", size = 1775698, upload-time = "2026-06-07T21:06:33.72Z" }, - { url = "https://files.pythonhosted.org/packages/b5/63/a251a9d2a6cb45065b2ddc0bde2b3dd10108740a9a42f632c66405a761a2/aiohttp-3.14.1-cp311-cp311-win32.whl", hash = "sha256:313701e488100074ce99850404ee36e741abf6330179fec908a1944ecf570126", size = 458386, upload-time = "2026-06-07T21:06:35.279Z" }, - { url = "https://files.pythonhosted.org/packages/17/ca/69274c51dcd6e8947d77b2806cf47a4a15f2c846e2cbeb1882547d3da283/aiohttp-3.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:03ab4530fdcb3a543a122ba4b65ac9919da9fe9f78a03d328a6e38ff962f7aa5", size = 483406, upload-time = "2026-06-07T21:06:36.824Z" }, - { url = "https://files.pythonhosted.org/packages/2c/8a/c25904f77690c3688ec140f87591ef11a0cfe36bf3d5c0f1f38056fb62b3/aiohttp-3.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:486f7d16ed54c39c2cbd7ca71fd8ba2b8bb7860df65bd7b6ed640bab96a38a8b", size = 452987, upload-time = "2026-06-07T21:06:38.371Z" }, - { url = "https://files.pythonhosted.org/packages/1d/21/151624b51cd92553d95424daf4bf19f19ce9be9002d19253e7e7ce67197b/aiohttp-3.14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d35143e27778b4bb0fb189562d7f275bff79c62ab8e98459717c0ea617ff2480", size = 757402, upload-time = "2026-06-07T21:06:40.311Z" }, - { url = "https://files.pythonhosted.org/packages/c2/82/280619e0bd7bf2454987e19282616e84762255dd9c8468f62382e8c191f1/aiohttp-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bcfb80a2cc36fba2534e5e5b5264dc7ae6fcd9bf15256da3e53d2f499e6fa29d", size = 512310, upload-time = "2026-06-07T21:06:42.207Z" }, - { url = "https://files.pythonhosted.org/packages/55/b2/2aac325583aaa1353045f96dffa586d8a34e8322e14a7ba49cffeb103ab4/aiohttp-3.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27fd7c91e51729b4f7e1577865fa6d34c9adccbc39aabe9000285b48af9f0ec2", size = 512448, upload-time = "2026-06-07T21:06:43.813Z" }, - { url = "https://files.pythonhosted.org/packages/8a/72/a60607cb849faa8af8a356c9329ea2eb6f395d49e82cc82ccba1fd8deb8f/aiohttp-3.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c567bf9eaf664280116a8688f63016e6b32db2505908e2bdaca1b6438142f2", size = 1766854, upload-time = "2026-06-07T21:06:45.391Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d3/d9fe1c9ec7557ab4d0d82bebaa728c6418f0b93295ec2f4ab015f7710cc7/aiohttp-3.14.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f5e6ff2bdbb8f4cd3fbe41f99e25bbcd58e3bf9f13d3dd31a11e7917251cc77a", size = 1740884, upload-time = "2026-06-07T21:06:47.413Z" }, - { url = "https://files.pythonhosted.org/packages/c1/dc/f2cecfaf9337ba3e63f181500814ff502aa3d00d9c7ec93a9d23d10a27b2/aiohttp-3.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f73e01dc37122325caf079982621262f96d74823c179038a82fddfc50359264", size = 1810034, upload-time = "2026-06-07T21:06:50.165Z" }, - { url = "https://files.pythonhosted.org/packages/66/d7/2ff65c5e65c0d7476daf7e15c032e0805e36811185b9623e3238ad6c763e/aiohttp-3.14.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb2c0c80d431c0d03f2c7dbf125150fedd4f0de17366a7ca33f7ccb822391842", size = 1904054, upload-time = "2026-06-07T21:06:52.035Z" }, - { url = "https://files.pythonhosted.org/packages/20/9c/d445818389df371f56d141d881153ba23183c4735a03f7356ffb43f7757d/aiohttp-3.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e6fc1a85fa7194a1a7d19f44e8609180f4a8eb5fa4c7ed8b4355f080fad235c", size = 1790278, upload-time = "2026-06-07T21:06:54.049Z" }, - { url = "https://files.pythonhosted.org/packages/4d/aa/bf04cb4d865fc6101c2229a294ad744973b72e513fdc5a6b791e6983d72a/aiohttp-3.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:686b6c0d3911ec387b444ddf5dc62fb7f7c0a7d5186a7861626496a5ab4aff95", size = 1591795, upload-time = "2026-06-07T21:06:55.911Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b4/4dac0038960427ba832f6609dfb4ea5437d7fd80c72001b9e48f834f428b/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c6fa4dc7ad6f8109c70bb1499e589f76b0b792baf39f9b017eb92c8a81d0a199", size = 1728397, upload-time = "2026-06-07T21:06:57.777Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f9/7cd4e8ad7aa3b75f17d56bb5498dd604a93d4e6eece822ba0568c413fff0/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:87a5eea1b2a5e21e1ebdbb33ad4165359189327e63fc4e4894693e7f821ac817", size = 1766504, upload-time = "2026-06-07T21:07:00.009Z" }, - { url = "https://files.pythonhosted.org/packages/f9/df/fc01d9fcad0f73fed3f3d361f1f94f975947b50dff82919f6dc2bf4316cc/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c1421eb01d4fd608d88cc8290211d177a58532b55ad94076fb349c5bf467f0a", size = 1777806, upload-time = "2026-06-07T21:07:02.064Z" }, - { url = "https://files.pythonhosted.org/packages/41/09/47e2d090bddcc8fb4ccb4c314aadc32d7c5d9bb55f50f6ad1c92fc15d501/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:34b257ec41345c1e8f2df68fa908a7952f5de932723871eb633ecbbff396c9a4", size = 1580707, upload-time = "2026-06-07T21:07:03.942Z" }, - { url = "https://files.pythonhosted.org/packages/3d/36/f1a4ce904ae0b6930cfe9afc96d0896f7ec1a620c400405d63783bb95a9c/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:de538791a80e5d862addbc183f70f0158ac9b9bb872bb147f1fd2a683691e087", size = 1798121, upload-time = "2026-06-07T21:07:05.987Z" }, - { url = "https://files.pythonhosted.org/packages/70/0a/e0075ce9ca0279ee1d4f0c0b85f54fea02ebc83c3007651a72bece658fec/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f71173be42d3241d428f760122febb748de0623f44308a6f120d0dd9ec572e3", size = 1767580, upload-time = "2026-06-07T21:07:07.873Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/a0c0a8f327a9c52095cdd8e312391b00d3ed64ab6c72bb5c33d8ec251cf7/aiohttp-3.14.1-cp312-cp312-win32.whl", hash = "sha256:ec8dc383ee57ea3e883477dcca3f11b65d58199f1080acaf4cd6ad9a99698be4", size = 452771, upload-time = "2026-06-07T21:07:09.669Z" }, - { url = "https://files.pythonhosted.org/packages/df/d9/ea367c75f16ac9c6cdc8febb25e8318fa21a2b1bc8d6514d4b2d890bface/aiohttp-3.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2aa92c87868cd13674989f9ee83e5f9f7ea4237589b728048e1f0c8f6caa3271", size = 479873, upload-time = "2026-06-07T21:07:11.538Z" }, - { url = "https://files.pythonhosted.org/packages/03/64/8d96784a7851156db8a4c6c3f6f91042fdf39fb15a4cc38c8b3c14833c45/aiohttp-3.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:2c840c90759922cb5e6dda94596e079a30fb5a5ba548e7e0dc00574703940847", size = 448073, upload-time = "2026-06-07T21:07:13.637Z" }, - { url = "https://files.pythonhosted.org/packages/bc/97/bd137012dd97e1649162b099135a80e1fd59aaa807b2430fc448d1029aff/aiohttp-3.14.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:b3a03285a7f9c7b016324574a6d92a1c895da6b978cb8f1deee3ac72bc6da178", size = 506882, upload-time = "2026-06-07T21:07:15.501Z" }, - { url = "https://files.pythonhosted.org/packages/ef/79/e5cc690e9d922a66887ceeaca53a8ffd5a7b0be3816142b7abc433742d89/aiohttp-3.14.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:2a73f487ab8ef5abbb24b7aa9b73e98eaba9e9e031804ff2416f02eca315ccaf", size = 515270, upload-time = "2026-06-07T21:07:17.53Z" }, - { url = "https://files.pythonhosted.org/packages/fe/22/a73ccbf9dbd6e26dda0b24d5fd5db7da92ee3383a79f47677ffb834c5c5b/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:915fbb7b41b115192259f8c9ae58f3ddc444d2b5579917270211858e606a4afd", size = 485841, upload-time = "2026-06-07T21:07:19.555Z" }, - { url = "https://files.pythonhosted.org/packages/3b/b9/57ed8eaf596321c2ad747bd480fb1700dbd7177c60dfc9e4c187f629662e/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:7fb4bdf95b0561a79f259f9d28fbc109728c5ee7f27aff6391f0ca703a329abe", size = 492088, upload-time = "2026-06-07T21:07:21.581Z" }, - { url = "https://files.pythonhosted.org/packages/78/c0/5ebe5270a7c140d7c6f79dcb018640225f14d406c149e4eec04a7d82fe71/aiohttp-3.14.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1b9748363260121d2927704f5d4fc498150669ca3ae93625986ee89c8f80dcd4", size = 501564, upload-time = "2026-06-07T21:07:23.388Z" }, - { url = "https://files.pythonhosted.org/packages/75/7f/8cdaa24fc7983865e0915153b96a9ac5bcdd3548d64c5a27d17cecccad2d/aiohttp-3.14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:86a6dab78b0e43e2897a3bbe15745aa60dc5423ca437b7b0b164c069bf91b876", size = 751998, upload-time = "2026-06-07T21:07:25.046Z" }, - { url = "https://files.pythonhosted.org/packages/b2/f4/c4227aacfacc5cb0cc2d119b65301d177912a6842cd64e120c47af76064f/aiohttp-3.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dfd6e47d3c44c2279907607f73a4240b88c69eb8b90da7e2441a8045dfd21da", size = 510918, upload-time = "2026-06-07T21:07:27.28Z" }, - { url = "https://files.pythonhosted.org/packages/ab/01/a2d5f96cd4e74424864d30bc0a7e44d0a12dacdcfa91b5b2d1bd3dca6bf3/aiohttp-3.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:317acd9f8602858dc7d59679812c376c7f0b97bcbbf16e0d6237f54141d8a8a6", size = 508657, upload-time = "2026-06-07T21:07:29.252Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ed/3c0fb5c500fdd8e7ebc10d1889c04384fffa1a9163eac1356088ca9da1b1/aiohttp-3.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd869c427324e5cb15195793de951295710db28be7d818247f3097b4ab5d4b96", size = 1757907, upload-time = "2026-06-07T21:07:31.03Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ab/d4c924d9bd5be3050c226612413ce68cb54c70d2c31b661bfc8d9a5b6a70/aiohttp-3.14.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93b032b5ec3255473c143627d21a69ac74ae12f7f33974cb587c564d11b1066f", size = 1737565, upload-time = "2026-06-07T21:07:33.031Z" }, - { url = "https://files.pythonhosted.org/packages/19/2a/37326821ff779084020cdc33224d20b19f42f4183a500ff92022a739eda7/aiohttp-3.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f234b4deb12f3ad59127e037bc57c40c21e45b45282df7d3a55a0f409f595296", size = 1799018, upload-time = "2026-06-07T21:07:35.003Z" }, - { url = "https://files.pythonhosted.org/packages/b3/4f/6e947ba73e4ce09070761c05ed3a8ceb7c21f5e46798671d8b2aac0e4626/aiohttp-3.14.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9af6779bfb46abf124068327abcdf9ce95c9ef8287a3e8da76ccf2d0f16c28fa", size = 1894416, upload-time = "2026-06-07T21:07:36.956Z" }, - { url = "https://files.pythonhosted.org/packages/9d/6e/dbf1d0625dc711fb2851f4f3c3055c39ed58bae92082d8c627dbe6013736/aiohttp-3.14.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:faccab372e66bc76d5731525e7f1143c922271725b9d38c9f97edcc66266b451", size = 1783881, upload-time = "2026-06-07T21:07:39.063Z" }, - { url = "https://files.pythonhosted.org/packages/44/c2/5e25098a67268ed369483ae7d1a58bd0a13d03aab860d2a0e4a6eb25b046/aiohttp-3.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f380468b09d2a81633ee863b0ec5648d364bd17bb8ecfb8c2f387f7ac1faf42c", size = 1587572, upload-time = "2026-06-07T21:07:41.058Z" }, - { url = "https://files.pythonhosted.org/packages/2a/bd/cf9cee17e140f942a3de73e658a543aa8fbf35a5fc67a9d2538d52d77f0b/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:97e704dcd26271f5bda3fa07c3ce0fb76d6d3f8659f4baa1a24442cc9ba177ca", size = 1722137, upload-time = "2026-06-07T21:07:43.014Z" }, - { url = "https://files.pythonhosted.org/packages/89/6d/5684f8c59045c96f81a18cefbc1fbbd79d25b88f1c622f2a5c5c08fcb632/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:269b76ac5394092b95bc4a098f4fc6c191c083c3bd12775d1e30e663132f6a09", size = 1755953, upload-time = "2026-06-07T21:07:45.933Z" }, - { url = "https://files.pythonhosted.org/packages/a8/40/35caf3170f8359760740a7d9aa0fff2e344bef98e1d1186f5a0f6dec17e6/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0b3e614340c889d575451696374c9d17affd54cd607ca0babed8f8c37b9397", size = 1766479, upload-time = "2026-06-07T21:07:48.047Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a1/b0c61e7a137f0d81de49a82023a6df73c3c16d6fefb0f8e4a93d21639002/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5663ee9257cfa1add7253a7da3035a02f31b6600ec48261585e1800a81533080", size = 1580077, upload-time = "2026-06-07T21:07:50.069Z" }, - { url = "https://files.pythonhosted.org/packages/0b/41/194ea4623693009fcefebef7aef63c141754f153e9cd0d39d3b9e36c175c/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:603a2c834142172ffddc054067f5ec0ca65d57a0aa98a71bc81952573208e345", size = 1791688, upload-time = "2026-06-07T21:07:52.106Z" }, - { url = "https://files.pythonhosted.org/packages/ba/45/4de841f005cfe1fd63e2a2fe011262c515e2a62aa6994b15947e7d717ac9/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cb21957bb8aca671c1765e32f58164cf0c50e6bf41c0bbbd16da20732ecaf588", size = 1761094, upload-time = "2026-06-07T21:07:54.113Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ae/dbce10533d3896d544d5053939ed75b7dc31a1b0973d959b1b5ae21028d6/aiohttp-3.14.1-cp313-cp313-win32.whl", hash = "sha256:e509a55f681e6158c20f70f102f9cf61fb20fbc382272bc6d94b7343f2582780", size = 452662, upload-time = "2026-06-07T21:07:56.06Z" }, - { url = "https://files.pythonhosted.org/packages/7b/d9/0bf1a19362c32f06229da5e7ddfcec91f93474d6307f7a2d3135e9c674dc/aiohttp-3.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:1ac8531b638959718e18c2207fbfe297819875da46a740b29dfa29beba64355a", size = 479748, upload-time = "2026-06-07T21:07:58.319Z" }, - { url = "https://files.pythonhosted.org/packages/22/0a/62e7232dc9484fbec112ceb32efb6a624cc7994ec6e2b019286f17c4e8f2/aiohttp-3.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:250d14af67f6b6a1a4a811049b1afa69d61d617fca6bf33149b3ab1a6dbcf7b8", size = 447723, upload-time = "2026-06-07T21:08:00.154Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a1/5fafa04e1ca91ddb47608699d60649c1c6db3cf41c99e78fc4056f9513db/aiohttp-3.14.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:7c106c26852ca1c2047c6b80384f17100b4e439af276f21ef3d4e2f450ae7e15", size = 508531, upload-time = "2026-06-07T21:08:02.093Z" }, - { url = "https://files.pythonhosted.org/packages/fa/2e/bfa02f699d87ffc86d5959270b28f1cb410add3ccaced8ed2e0b8a5238fc/aiohttp-3.14.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:20205f7f5ade7aaec9f4b500549bbc071b046453aed72f9c06dcab87896a83e8", size = 514718, upload-time = "2026-06-07T21:08:04.476Z" }, - { url = "https://files.pythonhosted.org/packages/85/a5/9594ad6289eebbc97d167c44213d557807f90e59115caad24de21ad2c3b1/aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:62a759436b29e677181a9e76bab8b8f689a29cb9c535f45f7c48c9c830d3f8c3", size = 487918, upload-time = "2026-06-07T21:08:06.377Z" }, - { url = "https://files.pythonhosted.org/packages/b4/61/16a32c36c3c49edec122a3dc811f2057df2f94d3b14aa107c8017d981618/aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:2964cbf553df4d7a57348da44d961d871895fc1ee4e8c322b2a95612c7b17fba", size = 494014, upload-time = "2026-06-07T21:08:08.263Z" }, - { url = "https://files.pythonhosted.org/packages/9b/89/3ebcf96ed99c05bec9c434aaac6963fd3cbab4a786ae739908a144d9ce44/aiohttp-3.14.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:237651caadc3a59badd39319c54642b5299e9cc98a3a194310e55d5bb9f5e397", size = 502398, upload-time = "2026-06-07T21:08:10.244Z" }, - { url = "https://files.pythonhosted.org/packages/fd/3d/b74870a0c2d40c355928cd5b96c7a11fa821b8a40fc41365e64479b151fb/aiohttp-3.14.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:896e12dfdbbab9d8f7e16d2b28c6769a60126fa92095d1ebf9473d02593a2448", size = 758018, upload-time = "2026-06-07T21:08:12.447Z" }, - { url = "https://files.pythonhosted.org/packages/d3/66/f42f5c984d99e49c6cff5f26f590750f2e2f7ef1fcfb99966ab5be1b632e/aiohttp-3.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d03f281ed22579314ba00821ce20115a7c0ac430660b4cc05704a3f818b3e004", size = 512462, upload-time = "2026-06-07T21:08:14.624Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a7/248e1aebe0c7810b0271e021a0f2a5eb6e78a051885b3c9df49f42a5802d/aiohttp-3.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07eabb979d236335fed927e137a928c9adfb7df3b9ec7aa31726f133a62be983", size = 512824, upload-time = "2026-06-07T21:08:16.572Z" }, - { url = "https://files.pythonhosted.org/packages/26/97/2aa0e5ba0727dc3bd5aaebb7ccbc510f7dfb7fb961ec87497cd496635ab1/aiohttp-3.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4fe1f1087cbadb280b5e1bb054a4f00d1423c74d6626c5e48400d871d34ecefe", size = 1749898, upload-time = "2026-06-07T21:08:18.635Z" }, - { url = "https://files.pythonhosted.org/packages/00/8d/e97f6c96c891d457c8479d92a514ba194d0412f981d72c70341ee18488ed/aiohttp-3.14.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:367a9314fdc79dab0fac96e216cb41dd73c85bdca85306ce8999118ba7e0f333", size = 1710114, upload-time = "2026-06-07T21:08:20.892Z" }, - { url = "https://files.pythonhosted.org/packages/6f/e6/aa8d7e863048c8fceb5cd6ce74017311cec3ead07847387e12265fb4444e/aiohttp-3.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a24f677ebe83749039e7bdf862ff0bbb16818ae4193d4ef96505e269375bcce0", size = 1802541, upload-time = "2026-06-07T21:08:23.044Z" }, - { url = "https://files.pythonhosted.org/packages/83/a8/72193137de57fda4ebfae4563182d082c8856e3b6e9871d0b46f028fb369/aiohttp-3.14.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c83afe0ba876be7e943d2e0ba645809ad441575d2840c895c21ee5de93b9377a", size = 1875776, upload-time = "2026-06-07T21:08:25.288Z" }, - { url = "https://files.pythonhosted.org/packages/a0/18/938441025db6769a3464596b2410af3afde0b21eb2f204c6f766f68af4bd/aiohttp-3.14.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:634e385930fb6d2d479cf3aa66515955863b77a5e3c2b5894ca259a25b308602", size = 1760329, upload-time = "2026-06-07T21:08:27.363Z" }, - { url = "https://files.pythonhosted.org/packages/60/29/bf2496b4065e76e09fe48015aaffe5ce161d8f089b06ac6982070f653076/aiohttp-3.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeea07c4397bbc57719c4eed8f9c284874d4f175f9b6d57f7a1546b976d455ca", size = 1587293, upload-time = "2026-06-07T21:08:29.805Z" }, - { url = "https://files.pythonhosted.org/packages/49/a2/2136674d52123b1354bd05dd5753c318db47dc0c927cc70b27bab3755456/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:335c0cc3e3545ce98dcb9cfcb836f40c3411f43fa03dab757597d80c89af8a35", size = 1714756, upload-time = "2026-06-07T21:08:32.094Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b9/e5fd2e6f915503081c0f9b1e8540947037929c70c191da2e4d54b31a21a1/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:ae6be797afdef264e8a84864a85b196ca06045586481b3df8a967322fd2fa844", size = 1721052, upload-time = "2026-06-07T21:08:34.167Z" }, - { url = "https://files.pythonhosted.org/packages/63/5a/2833e324a2263e104e31e2e91bc5bbee81bc499afd32203faee048a883f0/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:8560b4d712474335d08907db7973f71912d3a9a8f1dee992ec06b5d2fe359496", size = 1766888, upload-time = "2026-06-07T21:08:36.95Z" }, - { url = "https://files.pythonhosted.org/packages/57/fa/dea6511870913162f3b2e8c42a7614eb203a4540b8c2da43e0bfb0548f3c/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7edd08e0a5deb1e8564a2fcd8f4561014a3f05252334671bbf55ddd47db0e5", size = 1581679, upload-time = "2026-06-07T21:08:39.292Z" }, - { url = "https://files.pythonhosted.org/packages/14/bd/3cf0d55e71784b33534e9710a67d382d900598b4787fbce6cc7317f8c42a/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:b6ff7fcee63287ae57b5df3e4f5957ce032122802509246dec1a5bcc55904c95", size = 1782021, upload-time = "2026-06-07T21:08:41.407Z" }, - { url = "https://files.pythonhosted.org/packages/c1/af/14bb5843eccbe234f4dfb78ab73e549d99727247e62ae5d62cbd22eaf5b0/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6ffbb2f4ec1ceaff7e07d43922954da26b223d188bf30658e561b98e23089444", size = 1742574, upload-time = "2026-06-07T21:08:43.795Z" }, - { url = "https://files.pythonhosted.org/packages/f2/1e/fbeb7af9210a67ac0f9c9bec0f8f4568497924e33137a3d5b48e1cf85f3f/aiohttp-3.14.1-cp314-cp314-win32.whl", hash = "sha256:a9875b46d910cff3ea2f5962f9d266b465459fe634e22556ab9bd6fc1192eea0", size = 457773, upload-time = "2026-06-07T21:08:46.168Z" }, - { url = "https://files.pythonhosted.org/packages/f0/2b/13e8d741a9ec5db7d900c060554cf8352ab85e44e2a4469ebb9d377bda17/aiohttp-3.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:af8b4b81a960eeaf1234971ac3cd0ba5901f3cd42eae42a46b4d089a8b492719", size = 485001, upload-time = "2026-06-07T21:08:48.401Z" }, - { url = "https://files.pythonhosted.org/packages/df/30/491acfa2c4d6c3ff59c49a14fc1b50be3241e25bbb0c84c09e2da4d11395/aiohttp-3.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:cf4491381b1b57425c315a56a439251b1bdac07b2275f19a8c44bc57744532ec", size = 453809, upload-time = "2026-06-07T21:08:50.7Z" }, - { url = "https://files.pythonhosted.org/packages/34/e3/19dbe1a1f4cc6230eb9e314de7fe68053b0992f9302b27d12141a0b5db53/aiohttp-3.14.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:819c054312f1af92947e6a55883d1b66feefab11531a7fc45e0fb9b63880b5c2", size = 793320, upload-time = "2026-06-07T21:08:52.775Z" }, - { url = "https://files.pythonhosted.org/packages/7f/20/1b7182219ba1b108430d6e4dc53d25ae02dcfcf5a045b33af4e8c5167527/aiohttp-3.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10ee9c1753a8f706345b22496c79fbddb5be0599e0823f3738b1534058e25340", size = 529077, upload-time = "2026-06-07T21:08:55Z" }, - { url = "https://files.pythonhosted.org/packages/b9/c8/14ce60ec31a2e5f5274bb17d383a6f7a3aabca31ac04eee05585bbadab16/aiohttp-3.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1601cc37baf5750ccacae618ec2daf020769581695550e3b654a911f859c563d", size = 532476, upload-time = "2026-06-07T21:08:57.176Z" }, - { url = "https://files.pythonhosted.org/packages/7e/02/9ac85e081e53da2e061b02fa7758fe0a12d17b8ce2d1f5e6c7cb76730328/aiohttp-3.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d6e0ac9da31c9c04c84e1c0182ad8d6df35965a85cae29cd71d089621b3ae94", size = 1922347, upload-time = "2026-06-07T21:08:59.563Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3e/d3ba07a0ab38b5389e10bec4362d21e10a4f667cba2d79ba30837b3a5059/aiohttp-3.14.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e8f2d660c350b3d0e259c7a7e3d9b7fc8b41210cbcc3d4a7076ff0a5e5c2fdc", size = 1786465, upload-time = "2026-06-07T21:09:01.909Z" }, - { url = "https://files.pythonhosted.org/packages/0b/cb/e2ee978a00cfb2df829704a69528b18154eba5939f45bc1efa8f33aee4c5/aiohttp-3.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4691802dda97be727f79d86818acaad7eb8e9252626a1d6b519fedbb92d5e251", size = 1909423, upload-time = "2026-06-07T21:09:04.357Z" }, - { url = "https://files.pythonhosted.org/packages/73/5d/1430334858b1022b58ae50399a918f0bd6fe8fa7fa183598d657ff61e040/aiohttp-3.14.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c389c482a7e9b9dc3ee2701ac46c4125297a3818875b9c305ddb603c04828fd1", size = 2001906, upload-time = "2026-06-07T21:09:06.722Z" }, - { url = "https://files.pythonhosted.org/packages/66/4e/560c7472d3d198a23aa5c8b19a5115bf6a9b77b7d3e4bb363da320430ad2/aiohttp-3.14.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc0cacab7ba4e56f0f81c82a98c09bed2f39c940107b03a34b168bdf7597edd3", size = 1877095, upload-time = "2026-06-07T21:09:09.011Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f1/4745806578d447db4a784a8591e2dae3afdfc2bcb96f8f81271b13df6543/aiohttp-3.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:979ed4717f59b8bb12e3963378fa285d93d367e15bcd66c721311826d3c44a6c", size = 1676222, upload-time = "2026-06-07T21:09:11.461Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c9/48255813cca749a229ef0ab476004ec623728ad79a9c0840616f6c076325/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:38e1e7daaea81df51c952e18483f323d878499a1e2bfe564790e0f9701d6f203", size = 1842922, upload-time = "2026-06-07T21:09:14.118Z" }, - { url = "https://files.pythonhosted.org/packages/3d/c0/bbd054e2bee909f529523a5af3891052606af5143c09f5f183ec3b234676/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:4132e72c608fe9fecb8f409113567605915b83e9bdd3ea56538d2f9cd35002f1", size = 1825035, upload-time = "2026-06-07T21:09:16.447Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ae/90395d4376deceb74e09ec26b6adf7d2015a6f8802d6d84446af860fef04/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:eefd9cc9b6d4a2db5f00a26bc3e4f9acf71926a6ec557cd56c9c6f27c290b665", size = 1849512, upload-time = "2026-06-07T21:09:18.742Z" }, - { url = "https://files.pythonhosted.org/packages/93/bd/fb25f3049957553d4ce0ba6ae480aa2f592a6985497fca590837d16c1be0/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:b165790117eea512d7f3fb22f1f6dad3d55a7189571993eb015591c1401276d1", size = 1668571, upload-time = "2026-06-07T21:09:21.458Z" }, - { url = "https://files.pythonhosted.org/packages/3f/22/7f73303d64dd567ff3addca90b556690ed1233a47b8f55d242fb90af3681/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ed09c7eb1c391271c2ed0314a51903e72a3acb653d5ccfc264cdf3ef11f8269d", size = 1881159, upload-time = "2026-06-07T21:09:23.813Z" }, - { url = "https://files.pythonhosted.org/packages/44/be/0474c5a8b5640e1e4aa1923430a91f4151be82e511373fe764189b89aef5/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:99abd37084b82f5830c635fddd0b4993b9742a66eb746dacf433c8590e8f9e3c", size = 1841409, upload-time = "2026-06-07T21:09:26.207Z" }, - { url = "https://files.pythonhosted.org/packages/7b/3c/bb4a7cba26956cb3da4553cc2056cf67be5b5ff6e6d8fa4fbdff73bfb7ae/aiohttp-3.14.1-cp314-cp314t-win32.whl", hash = "sha256:47ddf841cdecc810749921d25606dee45857d12d2ad5ddb7b5bd7eab12e4b365", size = 494166, upload-time = "2026-06-07T21:09:28.505Z" }, - { url = "https://files.pythonhosted.org/packages/8a/84/ec80c2c1f66a952555a9f86df6b33af65108a6febfa0471b69013a12f807/aiohttp-3.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e78b522b7a6e27e0b25d19b247b75039ac4c94f99823e3c9e53ae1603a9f7e9", size = 530255, upload-time = "2026-06-07T21:09:30.843Z" }, - { url = "https://files.pythonhosted.org/packages/2a/71/6e22be134a4061ada85a92951b842f2657f17d926b727f3f94c56ae963d6/aiohttp-3.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:90d53f1609c29ccc2193945ef732428382a28f78d0456ae4d3daf0d48b74f0f6", size = 469640, upload-time = "2026-06-07T21:09:33.028Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213, upload-time = "2026-07-23T01:57:27.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/4d/4a99fb425c5e0cad715eea7bd190aff46f38b959a0a2dadb993705d34b26/aiohttp-3.14.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eb0495d778817619273c108784292be161a924b9f5ae5cbbc70a2caa6838250b", size = 765848, upload-time = "2026-07-23T01:52:08.217Z" }, + { url = "https://files.pythonhosted.org/packages/74/e8/43b85dc55b8e950dc644babe762add781319ea881b57b33d2cce12017d12/aiohttp-3.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c3c200cf9757edd785051dc699c7ecbec22110dbfcb3fefc7a9f9695eda8ea7a", size = 517476, upload-time = "2026-07-23T01:52:10.846Z" }, + { url = "https://files.pythonhosted.org/packages/7f/9e/73b582c4dbbc3c12ef4473822475effaabf1f934b56f14f5b03fe5d3a2af/aiohttp-3.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd51ebf9d3a00c074df4ede271023f4d2dba289bcc740b88191872716014e3c5", size = 515334, upload-time = "2026-07-23T01:52:12.636Z" }, + { url = "https://files.pythonhosted.org/packages/79/03/e98c3c9e05a5bdf97defe5ff9169baba4f0ec9a901f2d60e0f060c2f051e/aiohttp-3.14.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:134ac5ddcf61c6fad984b9a5727d83492ada43d63471db20fb73042c13fca62f", size = 1708830, upload-time = "2026-07-23T01:52:14.538Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2c/26e60b694844dfd2176c57f913a22d0cd6a16f9ff202cbda7580d0328b98/aiohttp-3.14.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:70c987b27534f9ae1a723f47ae921571d616da21d3208282bf4c52af5164ac43", size = 1674012, upload-time = "2026-07-23T01:52:16.486Z" }, + { url = "https://files.pythonhosted.org/packages/38/65/672df92e3172cd876aacfa97a952ac560877eb169384b2991ac5b273de4c/aiohttp-3.14.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1b59533861b70a2185c8f4f350f791f39d64358ef6944ce71c5240c9ec0982c9", size = 1767015, upload-time = "2026-07-23T01:52:18.28Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c5/228dec7bfec1c373cc2217cdeb47d6456dcd7a13a4c55144930a75ae3851/aiohttp-3.14.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1c5281acc88b92396f88c7e1e2748f8466689df22b80170e4f51efa712fb47a8", size = 1858700, upload-time = "2026-07-23T01:52:20.08Z" }, + { url = "https://files.pythonhosted.org/packages/bd/ff/cb36724e8c8d17f90ada567a9ff3efe1d6e9b549fba697a242aece180f21/aiohttp-3.14.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48d67b87db6279c044760787eb01f6413032c2e6f3ba1cafaa492b1c8e578479", size = 1714075, upload-time = "2026-07-23T01:52:22.071Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3a/296a4135c6366376263aeef54b15caca1f07676c2ae0c525d7832f2f808a/aiohttp-3.14.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f53bcd52f585e1ac3e590d61434eb61f9a88c38df041b4ea126d97144344a77b", size = 1588234, upload-time = "2026-07-23T01:52:23.757Z" }, + { url = "https://files.pythonhosted.org/packages/7d/81/9d5d853ef892dc066d1eb6db0e87a47348b920c1c879aa554612fdbd9d79/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0fdea2281997af69da84c77ffa6f5938a0285f21fb3887c249d67419ca865b3d", size = 1677300, upload-time = "2026-07-23T01:52:25.861Z" }, + { url = "https://files.pythonhosted.org/packages/68/96/021d386ae32d9b26d4b88df2e794546232ff56bb6be952bf6be227c0bbc7/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cda5fd5c95ad7a125a2e8464acc78b98b94c475a3780d6aa0aa157c93f470f4d", size = 1691501, upload-time = "2026-07-23T01:52:28Z" }, + { url = "https://files.pythonhosted.org/packages/29/9f/af66adce26a14af135c003cbd0f44ccaa68cebd30ff8ac99ca47fb4958f7/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6debfa7312ff9d4c124dc71d72e9a0a4b9e0879e48ba6fcb42bef5c3300289e2", size = 1735113, upload-time = "2026-07-23T01:52:29.995Z" }, + { url = "https://files.pythonhosted.org/packages/2f/90/28c390d4c9851effe52ac25b5a2e1d92246acd00728b4fc7975dafb67484/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f4e05329faa0ea1a404b37de4f034fd2c2defcca06a68dc6745e4e56c88e8a48", size = 1577486, upload-time = "2026-07-23T01:52:31.937Z" }, + { url = "https://files.pythonhosted.org/packages/db/c2/00e23a1bf2abb70dd353f6987db7e7f2491d0261f7363997738c71c98f95/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a3a8296e7ab5c295f53f1041487cb088e1480775aafbf7fe545d93b770a0f96f", size = 1751353, upload-time = "2026-07-23T01:52:33.688Z" }, + { url = "https://files.pythonhosted.org/packages/6e/7d/d51a706a8cbfa57f0611127daf61ab3ae02ab8420b0407412079227d1c65/aiohttp-3.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5373dc80ad1aa2fb9ad95c83f24eef418bbda3a61375f128e5b0192e4f3f9b32", size = 1698681, upload-time = "2026-07-23T01:52:38.167Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/90bd5cd9fdd9787cb4211d284d1fb8401339a933cb0227a15b71e789232f/aiohttp-3.14.3-cp310-cp310-win32.whl", hash = "sha256:a3e22975f905b89a55a488c2a08f2fdb2186175349e917d48985cc468a3d4c6e", size = 456733, upload-time = "2026-07-23T01:52:41.823Z" }, + { url = "https://files.pythonhosted.org/packages/d8/15/fe5b8f6a71ae112bc677163d0b0701bda5dc15005249582258ede0eb88c7/aiohttp-3.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdd0e2834dce1a26c1bbe26464861e16bbe217042cbff619247c11594472518c", size = 480460, upload-time = "2026-07-23T01:52:43.905Z" }, + { url = "https://files.pythonhosted.org/packages/54/00/45e98b6645cd7f00a4b78b749ebd309094b0eaeb2d2e96157eadbc0d0050/aiohttp-3.14.3-cp310-cp310-win_arm64.whl", hash = "sha256:eac645b09bcfdf73df7536331f0678c1086ea250981118ddb5199e17ccef72bb", size = 453479, upload-time = "2026-07-23T01:52:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/f8/5c/b3e4ff8ad43a8afef9602c5e90285936da1beaea8b029016b793891f03c3/aiohttp-3.14.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e568e14940c09955aa51f4e645b6daa18a581c5dcfcd73744dcc86a856e3ced3", size = 764250, upload-time = "2026-07-23T01:52:48.525Z" }, + { url = "https://files.pythonhosted.org/packages/0e/da/f1b384465e51449d844056b75070461da03a9a23e6c1747003695bf4172a/aiohttp-3.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54cfcdee2770dac994417cbb0ee1f3eb0e7cb6b30c79bf44f2c02ff79ec5124a", size = 516281, upload-time = "2026-07-23T01:52:51.047Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3f/01264f820ee2e3712a827892b1cd6ff80f3300c1fcbffbb45714a915d47a/aiohttp-3.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:21c016079415ed3fd676963e9793700a566d85dbbd6bfc564b9b2d209147dcc8", size = 514742, upload-time = "2026-07-23T01:52:53.779Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8d/a71c6f2db52ac1ed142b133f7feddaa6b70539c3f4de24d7e226c95b794c/aiohttp-3.14.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6088ec9894113802bddb3c09e974929aed2c7b3a8c456219b8aab4481f1a239", size = 1780613, upload-time = "2026-07-23T01:52:56.948Z" }, + { url = "https://files.pythonhosted.org/packages/a5/11/3dd9b3fb3a170f6ec9011b5291d876a6fab4086714c9e158600edf01b4fd/aiohttp-3.14.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:16ea7e24c309fb7c0bbd505d149abe4fe4dccfb8db911db7dbec0921bc889a6f", size = 1737688, upload-time = "2026-07-23T01:52:59.294Z" }, + { url = "https://files.pythonhosted.org/packages/6d/3e/834c26918be7d88068822b40e0db30fca50b5f4fe79104aa16a93f1d74e6/aiohttp-3.14.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56f355e79f71aef2a85c80305cc915f894b170dba76de5fe84f6351939b83c06", size = 1845742, upload-time = "2026-07-23T01:53:01.641Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c9/49ab8572df7d66bc13d11e31f781292badb04180dd87ba98733066c6aed7/aiohttp-3.14.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:18c441d0a8fca6de8d1f546849b9f0ab20d435993e2c5b59562b2fae6be2f929", size = 1928412, upload-time = "2026-07-23T01:53:04.018Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b9/2b8f0c0ce09c87a1daf80fd483431b56b1435d3f62789bc86f572e1245de/aiohttp-3.14.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53e7b4ce82b54a8bcc71b3b67a5cbd177ca1d7f592cbc92cd38b7349f73482db", size = 1786220, upload-time = "2026-07-23T01:53:06.481Z" }, + { url = "https://files.pythonhosted.org/packages/85/00/9c45f81de11710460edfa1dc81317b6e882703b160926c879a9d20da9fcc/aiohttp-3.14.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f55119f7bf25f49ed210f6096090715da24f2943c62102448915fde3c62877ce", size = 1637231, upload-time = "2026-07-23T01:53:10.258Z" }, + { url = "https://files.pythonhosted.org/packages/19/ce/967d628e910756f3539c6107cb7844a1b69440dcb3029a5ee7871b09ab63/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9aa6e61fdf20105c4144e755bd586008ff450791d67b1c8146fdc15959c4d51c", size = 1753161, upload-time = "2026-07-23T01:53:13.817Z" }, + { url = "https://files.pythonhosted.org/packages/11/b2/0c3d4114f0aee4f580f5b3b4eb71b24d7a23b834ea506a4dfebe76513f35/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ccd4893707b3e2a13e39c90d43cf80edf2e4d0457935bcc103bf2346214c3f15", size = 1756356, upload-time = "2026-07-23T01:53:16.211Z" }, + { url = "https://files.pythonhosted.org/packages/63/5d/99e7d91c82f1399d1ae2a854e080bd1493fbc31e5e959dbc4ec33dac3bec/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2466434105a4e03113c36ec775cc2ebe6676b62eae326fa670bb607ef788c1c", size = 1819846, upload-time = "2026-07-23T01:53:18.289Z" }, + { url = "https://files.pythonhosted.org/packages/ad/05/d5e1cb6480eeffd3f901d40a2c5e2d1e7effdc797837da3b490272699f13/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ba59d59aba08ac02fc03b0c8983ccd5ee39a199d0552ce9e6d2b4845b34d59ae", size = 1628531, upload-time = "2026-07-23T01:53:23.86Z" }, + { url = "https://files.pythonhosted.org/packages/c9/90/b934682bcaefae18a9e04f3dff5b68522ba810906358ae5029b68110ea3b/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ed099d105449c4f9e84f24af203cd131349d4761d8813fa7e02c32e7128cd910", size = 1832712, upload-time = "2026-07-23T01:53:27.551Z" }, + { url = "https://files.pythonhosted.org/packages/21/df/6061679faaf81fac746e7307c7adb71e858071a5d34c27583afefc64f543/aiohttp-3.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:152516815ef926786a0b6ae2b8f1fd2e0c71582dee0b435636865316fd4891b7", size = 1775014, upload-time = "2026-07-23T01:53:30.223Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1d/f854878bbc69b88faefe924b619a34a6f59ec05fd387c77690667eaa75eb/aiohttp-3.14.3-cp311-cp311-win32.whl", hash = "sha256:a4af35c443e0b1a1bd6a8af3f3485d7fda15c142751a00f3ff8090f0b93346fa", size = 456006, upload-time = "2026-07-23T01:53:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/73/0c/2af9d1674baccd1dbd47282a93d660a22e57ef6167c856deb24b4214fbab/aiohttp-3.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1e74298bab6ee0d6e749ed4fd1901c7e604bdda32c03d787a2cc71c46d0433d", size = 481069, upload-time = "2026-07-23T01:53:39.673Z" }, + { url = "https://files.pythonhosted.org/packages/8e/76/88401ff3fc95e85c5fc38d588f36f55e61ecb64343b2bc8d69326f453cc0/aiohttp-3.14.3-cp311-cp311-win_arm64.whl", hash = "sha256:03cd2bde3d7f085b64e549c985f4bb928cad7e8ecf5323bfca320db548d81b39", size = 453021, upload-time = "2026-07-23T01:53:43.749Z" }, + { url = "https://files.pythonhosted.org/packages/18/d4/eb96299230e20acf2efae207cb8d69051f1f68e357e5ea5e479bf6fb097a/aiohttp-3.14.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:39aded8c7f3b935b54aab1d8d73c70ec0ee2d3ec3b943e0e86611bc150ba47f5", size = 754690, upload-time = "2026-07-23T01:53:47.332Z" }, + { url = "https://files.pythonhosted.org/packages/88/11/e7a70a209eb9a067c0d3212b518a0134e3484f5178c7533878b6b514d469/aiohttp-3.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5bcb6ff3fdab1258a192679ff1a05d44f59626430aa05cd1a9d2447423599228", size = 509484, upload-time = "2026-07-23T01:53:51.159Z" }, + { url = "https://files.pythonhosted.org/packages/30/07/4bbc222cc8dbe31d4c3e8a5baad2286e4d42026ac0c570027b89afce6344/aiohttp-3.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:617105e2c3018ee38d0c8ce5ee3c84f621a6d8b9f723202aacaff28449ca91ee", size = 511949, upload-time = "2026-07-23T01:53:55.083Z" }, + { url = "https://files.pythonhosted.org/packages/54/b9/42e74c46b7b7c794b995bbc1f573fb48950c38b19d8600c62a6804ee2d67/aiohttp-3.14.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f631fe87a6f30df5fbe6d79640b25e4cffb38c31c7fb6f10871517b84b0f8c1a", size = 1765282, upload-time = "2026-07-23T01:53:59.662Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ed/62bc4d74363ad346d518e0720363a949f63e2e23439a79eb5813d4d29bb3/aiohttp-3.14.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a94dbaae5ae27bd849c93570669bff91e0510f33a80805738e3de72a7be0447b", size = 1741511, upload-time = "2026-07-23T01:54:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9f/181e8a8bc79e47d13c7fc4540bd7a3b729d9505609c61f392a8dd2fbfe55/aiohttp-3.14.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8f2f1c4c032c7cedd7d8da6f54c97b70266c6570c3108d3fdffee7188bb70529", size = 1810680, upload-time = "2026-07-23T01:54:09.882Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9a/dec94d6ad694552fe3424e3f1928d7a606a5d9d9433a04e7ecdd9d38ae7f/aiohttp-3.14.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea05e1f97ceea523942d9b2a7d7c0359d781d683d6b043f5943a602b14da4787", size = 1905646, upload-time = "2026-07-23T01:54:13.475Z" }, + { url = "https://files.pythonhosted.org/packages/52/b7/7cd31f29d6055bd711ae6e669367fba6f5ae9de463910a793e30556a8db7/aiohttp-3.14.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:543906c127fb1d929b95076db19b83fa2d46751006ff1e23b093aa5ac4d8db42", size = 1792122, upload-time = "2026-07-23T01:54:15.752Z" }, + { url = "https://files.pythonhosted.org/packages/66/73/10b1ef93afa61f4963c746257b70ced619cf31a4798671de5fdb2608501d/aiohttp-3.14.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0a5ff2dfbb9ce645fa5b8ef3e02c6c0b9cc3f6030ff863d0c51fffc50cb5541b", size = 1591127, upload-time = "2026-07-23T01:54:19.489Z" }, + { url = "https://files.pythonhosted.org/packages/49/ed/3b203fa6de1b338c14acdc06bf6ca9b043b7944f005966958c2ced932cde/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:041badb8f84396357c4d3ad26de6afd7a32b112f43d3c63045c0c8278cfd2043", size = 1725210, upload-time = "2026-07-23T01:54:24.129Z" }, + { url = "https://files.pythonhosted.org/packages/28/b7/1c2aab8c706436dcc28598452488ac9cd7c409da815237c28c27d58993e6/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:530125ee1163c4219af35dc3aa1206e541e7b31b6efc1a3f93b70a136f65d427", size = 1764848, upload-time = "2026-07-23T01:54:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/54/50/94c28f08b131c4bf10984ea2c7a536c9920608bb2d6e7f95642c30cc87b7/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8653fd547c93a61aadc612007790f5555cdd18946fa48cf45e26d8ea4ea473d", size = 1777102, upload-time = "2026-07-23T01:54:31.775Z" }, + { url = "https://files.pythonhosted.org/packages/13/d4/e7d09ba7d345fb2d74440fd2fa033c5e079fac05552927705986f41a364f/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:89176250f686cb9853c0fb7ead90e639e915b84a6f43eedc2a4e7ec21f1037f0", size = 1580205, upload-time = "2026-07-23T01:54:34.518Z" }, + { url = "https://files.pythonhosted.org/packages/a3/84/072a91d68e1e1eb587985b54baab94221277f877e8ef274fc213a0ceae28/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3a26434dafe408229ff3403458ca58de24fb51936504decac49ce6755f77e59d", size = 1797219, upload-time = "2026-07-23T01:54:36.995Z" }, + { url = "https://files.pythonhosted.org/packages/e0/eb/aad34e897e668424d6e995da5dff8a4a09af93363d3392488772957a63aa/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d1558173930a5a8d3069cee5c92fc91c87c4dbcb099debbb3622053717145a19", size = 1768629, upload-time = "2026-07-23T01:54:40.103Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2b/6bb88ddba0fecd9122aa3ebcad25996cf6c083a4a7040dbb3a4f97972af6/aiohttp-3.14.3-cp312-cp312-win32.whl", hash = "sha256:16100ad3ab8d649fdfbee87602d9d2dcdca9df0b9eda8a1b5fdc0d41f96da559", size = 451481, upload-time = "2026-07-23T01:54:42.547Z" }, + { url = "https://files.pythonhosted.org/packages/76/9b/f2f8f108da17ecef2cc3efc424e8b7ad3782b1a8360f7b8eae8ced84f6ea/aiohttp-3.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:33a2d7c28d33797a2e99923dffa63f83d908a19b6bf26cfe80fa790aa5e1a75a", size = 476845, upload-time = "2026-07-23T01:54:44.853Z" }, + { url = "https://files.pythonhosted.org/packages/3e/44/28dac80a8941b604f4da10ce21097614ca1bf905ce93dca28d8d7de9c1e7/aiohttp-3.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:362a3fd481769cac1a824514bcd86fda51c65e8fe6e051099e008fddde6db17c", size = 448050, upload-time = "2026-07-23T01:54:47.087Z" }, + { url = "https://files.pythonhosted.org/packages/57/be/5afd201cc0ab139029aadb75392efe85a293403d9dd3a3226161c21ce00c/aiohttp-3.14.3-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:2e9878ae68e4a5f1c0abe4dd497dbc3d51946f5837b56759e2a02e78fa90ef86", size = 506269, upload-time = "2026-07-23T01:54:49.075Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/dec8189d62b45ade009f6792a2264b942a90cb88aeaf181239933cd72c3c/aiohttp-3.14.3-cp313-cp313-android_21_x86_64.whl", hash = "sha256:f3d2669fe7dec7fc359ecdb5984b29b50d85d5d00f8c1cb61de4f4a24ee42627", size = 515166, upload-time = "2026-07-23T01:54:51.894Z" }, + { url = "https://files.pythonhosted.org/packages/28/24/2854869d29ed8a8b19d74f9ec6629515f7e04d02dd329d9d179201e58e47/aiohttp-3.14.3-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:cc7cb243a68167172f48c1fd43cee91ec4b1d40cefd190edd43369d1a6bc9c82", size = 486263, upload-time = "2026-07-23T01:54:54.223Z" }, + { url = "https://files.pythonhosted.org/packages/d4/dd/57187c8be2a35aea65eaee3bd2c3dcbbcf0204f5106c89637e3610380cd1/aiohttp-3.14.3-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:78253b573e6ffab5028924fc98bc281aae05445969982a10864bc360dea2016c", size = 492299, upload-time = "2026-07-23T01:54:56.236Z" }, + { url = "https://files.pythonhosted.org/packages/b9/11/06ae6ed8f0d414edf4068861e233d8fe23ee699bfd4b3ceb8663db948a62/aiohttp-3.14.3-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7041d52c3a7fa20c9e8c182b534704abb19502c8bdcbde7ab23bfda6f642394f", size = 502235, upload-time = "2026-07-23T01:54:58.377Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a3/559639c34a345d2cf7c52dff6838119f2eaf29eb508227b5b83f573af813/aiohttp-3.14.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac74facc01463f138b0da5580329cfcc82818dea5656e83ddcd11268fc12ff80", size = 750883, upload-time = "2026-07-23T01:55:00.65Z" }, + { url = "https://files.pythonhosted.org/packages/91/cd/41e131f13afd1e7b0172a9d9eda085ef90eb8439f41f0d279db81ed3ae60/aiohttp-3.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d6218d92e450824e9b4881f44e8c09f1853b490f9a64130801024a4793b1b3b0", size = 508473, upload-time = "2026-07-23T01:55:02.945Z" }, + { url = "https://files.pythonhosted.org/packages/bc/6b/e7f13410d391c6e55b4c007a8de024355389d7d459e3d64c42b2d33617e5/aiohttp-3.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:11fb37ef075669eee52ab1928fbf6e1741fada40409fa309ebde9607a962aebf", size = 509190, upload-time = "2026-07-23T01:55:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/97/21/6464573e53d69672cc1eada3e5c5cb2d2efa82701e8305a0f2047a576967/aiohttp-3.14.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55bdcc472aafe2de4a253045cc128007a64f1e0264fb675791e132ea5edaa3bd", size = 1761478, upload-time = "2026-07-23T01:55:07.383Z" }, + { url = "https://files.pythonhosted.org/packages/1a/81/d217043a4c17fbce360905e3b2bdd20139ebc9a2de836d035d179c4da006/aiohttp-3.14.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c39846c3aad97a8530c89d7a3869a8f8e9e3762c6ac0504481e5c80948f7e807", size = 1735092, upload-time = "2026-07-23T01:55:09.803Z" }, + { url = "https://files.pythonhosted.org/packages/a1/66/e13a02d0eeb1a9a502402a977abb4e4abff9fe4051c26f80558c57a7c975/aiohttp-3.14.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5895ef58c4620afe02fa16044f023dc4dafec08158f9d08874a46a7dbc0341b8", size = 1800546, upload-time = "2026-07-23T01:55:12.012Z" }, + { url = "https://files.pythonhosted.org/packages/26/5e/57d42fca1d18cb5acc1cad945d017fabc5d6ae71d8a08ad66be8dc3ee544/aiohttp-3.14.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa9467a8113aa69d3d7c55a70ef0b7c636010a40993f3df9d9d0d73b3eb7ef24", size = 1895250, upload-time = "2026-07-23T01:55:14.357Z" }, + { url = "https://files.pythonhosted.org/packages/ca/1c/7da8d08e74d56f00070822f9638ff3f1c563f8ad87d1efa996c87bfc8644/aiohttp-3.14.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7d2deec16eeedf55f2c7cf75b521ea3856a5177e123844f8fd0f114ce252cb5", size = 1789289, upload-time = "2026-07-23T01:55:16.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/0f/cf16bcf56896981c1a0319f5d5db9337994b5165730c48a8fa07e9b34be6/aiohttp-3.14.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dd54d0e8717de95939766febac482ac0474d8ac3b048115f9f2b1d23a16e7db4", size = 1586706, upload-time = "2026-07-23T01:55:18.913Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6f/76eac12a7f2480e1e304f842efdb07db33256b0d9165b866b6ef0806c202/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df82f3787c940c94986b34222d59c9e38843fba85139f36e85255a82ad5355a9", size = 1724652, upload-time = "2026-07-23T01:55:21.296Z" }, + { url = "https://files.pythonhosted.org/packages/39/b6/19c8c592baeeb94b75f966547d40c02ac7590902306ec5863d5c027cf506/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:42a67efc36300d052fb4508a53e8b6901b9284b599ae63945c377569c5fcc1e1", size = 1756239, upload-time = "2026-07-23T01:55:23.705Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c9/4e9383150296f97f873b680c4de8fb2cd88608fb9f48c79edcb111611abc/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7a75aa63cbf9b21cfaf60dc2657e19df2c2867d91707d653fee171ffeedd1371", size = 1769161, upload-time = "2026-07-23T01:55:26.082Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1e/147bdc6cc5de5f3ab011be8bf5d6e786633249f22c20bae06f85e45f5387/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e92eb8acc45eb6a9f4935071a77edf5b85cc6f8dfad5cd99e97653c26593cdde", size = 1578759, upload-time = "2026-07-23T01:55:28.846Z" }, + { url = "https://files.pythonhosted.org/packages/fd/31/78388a9d6040ece2e11df62ea229a822cf5e52d238374b220ae9975b2623/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b014a6ed7cf912e787149fdc529166d3ceabac23f26efeea3158c9aba2354e7e", size = 1792025, upload-time = "2026-07-23T01:55:31.457Z" }, + { url = "https://files.pythonhosted.org/packages/03/51/a3d29fdf2c25d796746af8ad6fe56a45d6256c38b0a8a2ed752e1160b3a2/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d4f72af88ac2474bb5bca640030320e3d38a0163a1d7533500e87be458eef71", size = 1768477, upload-time = "2026-07-23T01:55:33.87Z" }, + { url = "https://files.pythonhosted.org/packages/29/a6/442e18b5afeade534d877a2dc3c3e392aff8d49787890b0cf84790410267/aiohttp-3.14.3-cp313-cp313-win32.whl", hash = "sha256:5f08ec777f35ee70720233b8b9811d3bb5d728137f30ac91b7457709c3261ac0", size = 451069, upload-time = "2026-07-23T01:55:36.121Z" }, + { url = "https://files.pythonhosted.org/packages/9d/69/3d876ac02659f271cf7f6769f14a8e3de5b6e888ed8b5a7e998086a4cec8/aiohttp-3.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:dff9461ec275f22135650d5ba4b4931a11f3958df7dfbb8db630000d4dee0883", size = 476518, upload-time = "2026-07-23T01:55:38.303Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0e/50d6e6471cd31edce8b282bdec59375a3a69124d8a989a0b1313355cae52/aiohttp-3.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:ddcac3c6b382e81f1dd0499199d4136b877beb4cb5ef770bbbfba56c4b8f55d2", size = 447676, upload-time = "2026-07-23T01:55:40.451Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/887fdcf832326571b370ffc347b3e70abe101096f3720126aac161b1d872/aiohttp-3.14.3-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:49f7325beb0f85ef4aef5f48f490269575f83e6e2acad00a1d80b807eb027062", size = 509067, upload-time = "2026-07-23T01:55:42.618Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a3/92cec936f78cc4bf0fa5554ebe593b73459d94e3c62303e1902a4cccb6f7/aiohttp-3.14.3-cp314-cp314-android_24_x86_64.whl", hash = "sha256:e3be98a7c30b8c25d573dafba7171d66dfb05ee6a9070fc46535464ff97700a6", size = 514774, upload-time = "2026-07-23T01:55:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/29/ba/2a0c38df3fc557620b6a5acd98364af050053b6285b4dc7ee74100c63c18/aiohttp-3.14.3-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:614c61d478b83953e261d02bb2df750f17227cd33ef8002945bf5aebbde21919", size = 488134, upload-time = "2026-07-23T01:55:47.135Z" }, + { url = "https://files.pythonhosted.org/packages/48/d6/d51b7d4bf309af3693940d8ffd2b9ed0b682434ef85959b7c9c137f60cf8/aiohttp-3.14.3-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:1caa7b0d05f3e3a36f87788c59e970a7ee1cefcfcbb924a9f138c4a6551c9cb7", size = 494201, upload-time = "2026-07-23T01:55:49.451Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5a/8f624384e5f1efabb5229b94157eb966b021e97bdb188c62860c2ae243c2/aiohttp-3.14.3-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:dfa68deb2a443bdaa3ea5297b0699c1464f08aef3812b486d1348eee61b07dc0", size = 502766, upload-time = "2026-07-23T01:55:51.656Z" }, + { url = "https://files.pythonhosted.org/packages/a6/26/4ff0164370deec18fb19254ee4ab10b7a73304ac0c860b13f5f84663759b/aiohttp-3.14.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:e72ee89e28d907a18f46959b4eb0bb06701cc7f8cf4366e00029e2ccfaaf5924", size = 756557, upload-time = "2026-07-23T01:55:53.964Z" }, + { url = "https://files.pythonhosted.org/packages/97/a3/7056b86dc0d9ec709ea9777eae3b0161428f943372f8b98c01c11593b682/aiohttp-3.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ad4c8b7488d745d2ca4838ebd8ae5ba9b56341d30b1da43640e4ce87f9f49646", size = 510168, upload-time = "2026-07-23T01:55:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/85/ed/0357a015892fd68058bf2d39d3fd1958e459b997a7db30aaa6aaa434ae96/aiohttp-3.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:db332af25642007330fca8be5c4d194caf2bea7a7fc84415aff3497af5dfee6b", size = 512957, upload-time = "2026-07-23T01:55:58.437Z" }, + { url = "https://files.pythonhosted.org/packages/47/d1/8aba53f15ccb2238405f5e9d30e2a8ca44f93878c26e7165ade00d374b1c/aiohttp-3.14.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25bd2708db6bdf6a6630dd37bdcdfcb47c4434d22ac69c64665b802910140b30", size = 1750149, upload-time = "2026-07-23T01:56:00.856Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/40c3fee327529284375c6701cbb0fa4600cc2e8432af1378f897e2ef7d3a/aiohttp-3.14.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:cef89a58e628c4efcac3275c2d68083f82426dcdc89c1492a6f654f9f7ea6ab9", size = 1707685, upload-time = "2026-07-23T01:56:03.371Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a3/ca0cc6724cca8114b05694abd916060758c79894c3aa5b012cdadc1bc28e/aiohttp-3.14.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c23ec8ee9d5ab2f5421f9c7fffce208435607af27fd46d4a44e031954352838f", size = 1803911, upload-time = "2026-07-23T01:56:05.817Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/85b099c299c3ffd38ad9b3e43694c8a346934e4a30c88c4fd5a841234f77/aiohttp-3.14.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e2667f0bbe7eb6c74eae5e9691441ad186e5845ca3cff63230fc09c4e7514f5d", size = 1876929, upload-time = "2026-07-23T01:56:08.413Z" }, + { url = "https://files.pythonhosted.org/packages/d5/b7/1da684a04175473fa4cddbf9a2f572e79514c3fd27a74597f43057d4f3da/aiohttp-3.14.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18cb43369747b2ae007bd2655fb8e63a099c2ff1d207962943636dac989b3147", size = 1761112, upload-time = "2026-07-23T01:56:10.918Z" }, + { url = "https://files.pythonhosted.org/packages/d1/16/bc4b55e3e5cb175fd69c53c90d60d2f47797cb343da5106e23863dc4dba4/aiohttp-3.14.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d77640cc618c1d99fc4f8589c0f24a730adfa54eb1e57ef7bf0c8dfb78da898c", size = 1583500, upload-time = "2026-07-23T01:56:13.613Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e8/13a9d957a1ee40837f46aa30f0f4c657e673ad86a2e6362a9f9be20d26d9/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:53e5179d8abb5710f8e83ba207c41c8d1261fcffd4616500e15ca2b7a33be10a", size = 1713940, upload-time = "2026-07-23T01:56:15.969Z" }, + { url = "https://files.pythonhosted.org/packages/38/05/d33c680c1bcf1c7e130f9cbfc1fc02fe8bb0c4af2a94a53dd5fb56131e5c/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:cd817772b2fcf2b8c0905795318485f9ec16eae60b29feb7f4c77085311637f0", size = 1724413, upload-time = "2026-07-23T01:56:18.591Z" }, + { url = "https://files.pythonhosted.org/packages/85/1d/af798d306f7a74b6a632dbcabcf62a4c91391b7582d2a8c6d7712e2cc54e/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4e3ac92d90e92773b2362d506068e9a948192bd553e743c5b2429e28527c8661", size = 1770748, upload-time = "2026-07-23T01:56:21.074Z" }, + { url = "https://files.pythonhosted.org/packages/a8/92/ad720d472556a995049206867765e9410969684f86ee09423ff9969044c1/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3f42e9b78301f11c8f861746175d8b9c1ccef713fcad9eab396e2f6db8ed4a22", size = 1577564, upload-time = "2026-07-23T01:56:23.475Z" }, + { url = "https://files.pythonhosted.org/packages/60/ad/0ed7586cbef7a884e23a752fa2bb987a122e6a5dd50dab109258d0a95193/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9d9edccfe496b476db5f398d97b865e9a6752bcf8aec4eef8390ce20fb64bb41", size = 1782080, upload-time = "2026-07-23T01:56:25.994Z" }, + { url = "https://files.pythonhosted.org/packages/97/ea/dbaed0d73e8a69aad653b045dab451c67c2454bb731a37b45a86593e9422/aiohttp-3.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c5ec8fb1bcc31a8466f74aaf26c345d5c386fa4bd08a3f0eb9c7a4a3fe8b5bf", size = 1745813, upload-time = "2026-07-23T01:56:28.604Z" }, + { url = "https://files.pythonhosted.org/packages/81/1b/6893d4bc57e434fc93a6c9217c637d967a0b651d989f6e3265179375754a/aiohttp-3.14.3-cp314-cp314-win32.whl", hash = "sha256:38901a84da3ce22249f6e860bf8f90d141bcab7da090cc398f8bb58c0e44b7da", size = 455872, upload-time = "2026-07-23T01:56:31.031Z" }, + { url = "https://files.pythonhosted.org/packages/f5/8b/c7baa1ba1eda4db6989baefe5de6d99834921b84ebd7918624febcb9f290/aiohttp-3.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:8b3b60de05f3dcb6f6a00f818bb2ec781cee4de0645f59ccaf99b1d1823b6100", size = 481030, upload-time = "2026-07-23T01:56:33.365Z" }, + { url = "https://files.pythonhosted.org/packages/22/8c/c29d067df825a2df88ca432db848aa2fe8199598359cc06c12b09320cac9/aiohttp-3.14.3-cp314-cp314-win_arm64.whl", hash = "sha256:1576145bdceeb92382d899751e12743a3a5b8e460a841e3e50543859e54864dc", size = 453669, upload-time = "2026-07-23T01:56:35.731Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a4/9c033beb355d39b6147980597ec9645e4729243f686ee4dc73945de72030/aiohttp-3.14.3-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:8800c996b01c2772a783e3e46f3e1abd5823029adca0df54231960de9bfefa5b", size = 791403, upload-time = "2026-07-23T01:56:37.972Z" }, + { url = "https://files.pythonhosted.org/packages/80/ca/87c32a0a7704583cfc49660bd817889bae5b830bf53b5dcb4e92145ac2da/aiohttp-3.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ebe8e504f058fe91223351cecd2d9d6946c9d241bb0250d898ffbdf584cc72b0", size = 526413, upload-time = "2026-07-23T01:56:40.523Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d8/8ec0e471248c500acdce2be3f46db8fb62b5eb60efef072529cc85ee1d26/aiohttp-3.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30402d03a7c0ff52bce290b57e564e9079fd9d0cb545c8aba73f86a103162d2e", size = 532135, upload-time = "2026-07-23T01:56:42.876Z" }, + { url = "https://files.pythonhosted.org/packages/fe/45/f8919fd936e8b79fcd9bda7b6d8e62613462a713f4f17987fd7c34399142/aiohttp-3.14.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9fc7b5bfec6573f3ae844f457fdde5adeb713f8b8e4a81ad64fc207b49383716", size = 1922742, upload-time = "2026-07-23T01:56:45.528Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ec/9ca76b28a27525b0cc53e20842e0228b022f301ce1f436b7d814b4aaf2df/aiohttp-3.14.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8a5fd34f7f7410d1730d5c2ba873cacb2eed3fede366feb268a70ba22581ed8f", size = 1787371, upload-time = "2026-07-23T01:56:48.045Z" }, + { url = "https://files.pythonhosted.org/packages/b1/04/6acdbf17315f7b55f1937e3387acb89a3cddeb4995689553d064af8e92ab/aiohttp-3.14.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:270d3dace9ca2f10f0da5d8ebe519b7a310fc6112ed916e32df5866df0888553", size = 1912623, upload-time = "2026-07-23T01:56:50.605Z" }, + { url = "https://files.pythonhosted.org/packages/86/e6/438b0c79ca6f45eb9fd9817dd4c01a91919a38c0de5ee9e05e2b4dc0ece7/aiohttp-3.14.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3ae5b3a59436d089b5395d910121a390feed4d00578eb95a0fd1a329fe963100", size = 2005515, upload-time = "2026-07-23T01:56:53.153Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6b/62cbd6577758699525f5c712d1ddef57d9875fbab0ae8d5f5a202fd598f8/aiohttp-3.14.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2498f0fe69ead802f9675beca44a7c21c62fdaa4ec5145ea1c3ad6edbee29f85", size = 1879906, upload-time = "2026-07-23T01:56:55.818Z" }, + { url = "https://files.pythonhosted.org/packages/00/95/18bcbf830a21dc3aae24d8f6b6feaf3db1d2090242d00a7868db2ffb0b67/aiohttp-3.14.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a0dc483c00da8b673abbb367eb6f8d8f4bcec30eb58529ea13cb42e7fd2dfa33", size = 1675849, upload-time = "2026-07-23T01:56:58.861Z" }, + { url = "https://files.pythonhosted.org/packages/a9/19/47f4968659c5e23606c3790c80fc624e691c153d036148449ee84d31b287/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c7d3a97c678d34fc5b59da671ee9cd630096ddc643e7b5a30d54a2a6f3574d3f", size = 1843496, upload-time = "2026-07-23T01:57:01.591Z" }, + { url = "https://files.pythonhosted.org/packages/64/af/38c33c4dd82fddcb4e56c4653b6f1072a8edbc6b7fa15809f14932c41e2d/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f8fb78a83c9e5f741ca3a68cfb455c1f5bb83b4e7249a3848b3cd78d0a8563b0", size = 1827746, upload-time = "2026-07-23T01:57:05.131Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9d/0537cda4885ac8f5b7053d164dd06312f4c483a4edcb8ee5b8aaf2a989bf/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:74ab5b6a9fb13e873e5a90946588baecaf488745e1db1a4a5c433f971f035098", size = 1853810, upload-time = "2026-07-23T01:57:08.043Z" }, + { url = "https://files.pythonhosted.org/packages/19/fe/26f9c5e6458385aa86497836b0dea6fb2f027827d63f37c7856cce9286ee/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:bd52f811e65f6fb634b1047159657c98f52b407f8efec907bcfc09da9a4c0a25", size = 1668895, upload-time = "2026-07-23T01:57:10.837Z" }, + { url = "https://files.pythonhosted.org/packages/ec/4c/618b1db9b9ba079b8875d2cdf78e7c4a3bf72903bd5850fee7dd9544600a/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:f0f177d1b195b9e06376cfd7d308d8a1b920909a609d03ac82a8c73bbb16d3b9", size = 1883833, upload-time = "2026-07-23T01:57:13.672Z" }, + { url = "https://files.pythonhosted.org/packages/94/c6/bd959bd1e4771f9fd944e9e436224c48c77b018b73b519b5aad346335bcc/aiohttp-3.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:498c6c623134f8e09a3c4e60bcd607a0b4590dd7dbf08dd40851b27cbb520ccb", size = 1844251, upload-time = "2026-07-23T01:57:16.593Z" }, + { url = "https://files.pythonhosted.org/packages/5e/19/08d41839658bdd44a0ed2480f3891705ecb487ce28c0dde62c9040c997e0/aiohttp-3.14.3-cp314-cp314t-win32.whl", hash = "sha256:b304db572b4368edd8dda8a2274f73156fe15558fca4a917cb8a09fc47af5963", size = 474180, upload-time = "2026-07-23T01:57:19.306Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/3cd6ef0a2b2851f7ab913b5b079334781bd50ff56a323e4454063377a080/aiohttp-3.14.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b20032766aedf6261c7a566585a40867d092ac03a0d81592d5370ef9b054f99b", size = 500528, upload-time = "2026-07-23T01:57:21.762Z" }, + { url = "https://files.pythonhosted.org/packages/a4/37/cfd1ed540a4d318da025590d96b728e63713c09e9377950fc655dadeb856/aiohttp-3.14.3-cp314-cp314t-win_arm64.whl", hash = "sha256:2e1161602f45a54de2ce0905243a95f58cb42dcd378402f3697f5e0b21e9d2e7", size = 469280, upload-time = "2026-07-23T01:57:24.241Z" }, ] [[package]] @@ -236,39 +233,38 @@ wheels = [ [[package]] name = "annotated-doc" -version = "0.0.4" +version = "0.0.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/8e/38aa427ed5402449e226975b649c5dc73ccadfefeb95e6aecb8f8ea4b6b6/annotated_doc-0.0.5.tar.gz", hash = "sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb", size = 10758, upload-time = "2026-07-28T13:50:58.129Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, + { url = "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", hash = "sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", size = 5302, upload-time = "2026-07-28T13:50:57.239Z" }, ] [[package]] name = "annotated-types" -version = "0.7.0" +version = "0.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, ] [[package]] name = "anthropic" -version = "0.117.0" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "python_full_version >= '3.11'" }, - { name = "distro", marker = "python_full_version >= '3.11'" }, { name = "docstring-parser", marker = "python_full_version >= '3.11'" }, - { name = "httpx", marker = "python_full_version >= '3.11'" }, + { name = "httpx2", marker = "python_full_version >= '3.11'" }, { name = "jiter", marker = "python_full_version >= '3.11'" }, { name = "pydantic", marker = "python_full_version >= '3.11'" }, { name = "sniffio", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/0d/8f71d535edb0d438f023bd825fb65f67c14fa88a2bd6b75f292a58a63de4/anthropic-0.117.0.tar.gz", hash = "sha256:98107f2b76439641e0ae2a1754087534b8f178dbab99d6eb1bc4b7bc8c744496", size = 989933, upload-time = "2026-07-16T19:36:13.07Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/3d/4170318539de0c163e1806509b0bb9cd7d611ee15e7885f1d16a11a37d29/anthropic-1.6.0.tar.gz", hash = "sha256:ce3c032f940984f67c516db896375bff36959f8dc589973e386f8e6ea81bbec3", size = 1172375, upload-time = "2026-09-15T15:14:55.826Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/4c/917d21d6619a4475cdafc6d13a69fdb3b901ddac57e76caca5a25c117b6d/anthropic-0.117.0-py3-none-any.whl", hash = "sha256:451a0a6905f11dff7663d13e4ee5dbf909eb8942b1d049803c7b937a13ac47ec", size = 998327, upload-time = "2026-07-16T19:36:11.225Z" }, + { url = "https://files.pythonhosted.org/packages/c1/32/57a8b6c5441d9e6a1f332f70ee02375af6d9b5b65b42689ba83f7c7d010a/anthropic-1.6.0-py3-none-any.whl", hash = "sha256:049434f013d3a874acdfee696ec626e19166d58f4277e8fa34e5d0a5ec250ad0", size = 1249068, upload-time = "2026-09-15T15:14:54.326Z" }, ] [[package]] @@ -282,16 +278,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.14.2" +version = "4.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.15'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/d2/f4d173e22df740bc37b1db102b386ba719b66e95b0f0d751f556b387e6d2/anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94", size = 276966, upload-time = "2026-09-05T10:42:39.44Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, + { url = "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", size = 132079, upload-time = "2026-09-05T10:42:37.923Z" }, ] [[package]] @@ -314,15 +310,15 @@ wheels = [ [[package]] name = "authlib" -version = "1.7.2" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "joserfc" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", size = 176511, upload-time = "2026-05-06T08:10:23.116Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/51/bc1729d3cfdc214b4935f4e886e4dd443c3065fd8e1e66423fe84b490f81/authlib-1.8.0.tar.gz", hash = "sha256:f3ecd5f1da737262fb53bf1a4d95c4ea1ad9dd509316587a255c99ab1838a4f0", size = 177759, upload-time = "2026-08-30T12:12:34.833Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", size = 259548, upload-time = "2026-05-06T08:10:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c6/6f124bcfbbfb20fba22c939b4e43a06dccfc0e1ca20e5634ca573cb1e271/authlib-1.8.0-py2.py3-none-any.whl", hash = "sha256:88aebbd9af6757e14e912d5dc007ae1dc1f3e27e3b2152ce7c552ee2c3b3c121", size = 260804, upload-time = "2026-08-30T12:12:33.162Z" }, ] [[package]] @@ -346,21 +342,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/11/5dc8be418e1d54bed15eaf3a7461797e5ebb9e6a34869ad750561f35fa5b/aws_requests_auth-0.4.3-py2.py3-none-any.whl", hash = "sha256:646bc37d62140ea1c709d20148f5d43197e6bd2d63909eb36fa4bb2345759977", size = 6838, upload-time = "2020-05-27T23:10:33.658Z" }, ] -[[package]] -name = "aws-sam-translator" -version = "1.111.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "boto3" }, - { name = "jsonschema" }, - { name = "pydantic" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8e/31/4e6d6f0b9d4ead8eaa1c13a14d86834e7691acf5726fb49de98f8e195028/aws_sam_translator-1.111.0.tar.gz", hash = "sha256:6884d94e28dc20384e5e0396e9386a456fe59303d706924deb2646329b4d97d3", size = 374368, upload-time = "2026-07-02T00:31:39.601Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/e3/505c9db9c4a4270ad12bac621f370cb02eabb224886c1b81960c658d9baa/aws_sam_translator-1.111.0-py3-none-any.whl", hash = "sha256:510d0ad8cd40b245a62004f2dc974ddbb6ff0d496bdec0bc7d9cd209b46d5fad", size = 440579, upload-time = "2026-07-02T00:31:38.077Z" }, -] - [[package]] name = "aws-xray-sdk" version = "2.15.0" @@ -456,23 +437,20 @@ wheels = [ [[package]] name = "botocore-stubs" -version = "1.43.14" +version = "1.43.67" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "types-awscrt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7f/81/79693e833291c00dc89ee610e5e915381b6f08233912e28df50106840780/botocore_stubs-1.43.14.tar.gz", hash = "sha256:9e3bc1fdd51da7473f0df726c82747a1b0ae913449d629659765c247fecc2039", size = 42738, upload-time = "2026-05-25T06:06:37.484Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/45/53d662227dc4787b2c854445ee7eb4751cb5d74cfb5c686a6ecbe1f94c17/botocore_stubs-1.43.67.tar.gz", hash = "sha256:853e74014a1f557055c4ffae5fb38d7c65c7c0520e1aab366cac41d5428f419d", size = 42846, upload-time = "2026-08-08T14:57:53.412Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/ca/f017727b11895908c5dedc829cf2ec35e0c4b2a26ba875db325fef2cefdf/botocore_stubs-1.43.14-py3-none-any.whl", hash = "sha256:fb98f1475c92fd718644e786b5c543a20f1b1f610e89e0a7191c3f1f429c75aa", size = 67093, upload-time = "2026-05-25T06:06:34.532Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/bdbf19967898a032292da65a47d6e25b2eee55865db4e687f861d80b5602/botocore_stubs-1.43.67-py3-none-any.whl", hash = "sha256:c51262bac3341c1cda71f05fa01141fffd3990d7a92c7960e3b755c1bc830373", size = 67244, upload-time = "2026-08-08T14:57:52.01Z" }, ] [[package]] name = "bracex" -version = "3.0" +version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/f5/4473ad9b48cd0420a2d762a3750fa0e078e23e060b1af72662e5987e5530/bracex-3.0.tar.gz", hash = "sha256:b73f718d6bd98d8419e45df02426c86e9967c179949f779340d6c3a8c83b9111", size = 43162, upload-time = "2026-06-30T00:43:35.279Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/01/5f394b8bcd6e5b92f73130990960423bbb19711f906bd9fe9ea5557c667c/bracex-3.0.1.tar.gz", hash = "sha256:4e38e32392e4a4780fe15d644bfc7c8514057cfc3861e060b11814ce829c25e4", size = 44019, upload-time = "2026-07-20T13:43:00.335Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/2e/68781b78e764e5ccc4af1e3d27e060069c73af90234853fa80000e7ee79d/bracex-3.0-py3-none-any.whl", hash = "sha256:3833e61c2f092d5aa0468fa2e6c6e990a306185abf763b6d122f0158e59c58a5", size = 11738, upload-time = "2026-06-30T00:43:34.196Z" }, + { url = "https://files.pythonhosted.org/packages/b8/8f/6f7273a7adb8d73fc8d21ede4376a3e475e52f98435c6007f69100dec8ca/bracex-3.0.1-py3-none-any.whl", hash = "sha256:6523ad83aeb5098a4ee597cff0f964442ff74e460bd3fafaffab6a013ff2288c", size = 11940, upload-time = "2026-07-20T13:42:59.268Z" }, ] [[package]] @@ -495,129 +473,128 @@ filecache = [ [[package]] name = "certifi" -version = "2026.6.17" +version = "2026.7.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, ] [[package]] name = "cffi" -version = "2.1.0" +version = "2.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/e9/6d7724983b3d5a0908dbf74f64038ade77c18646ff6636ec7894fd392ce1/cffi-2.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b65f590ef2a44640f9a05dbb548a429b4ade77913ce683ac8b1480777658a6c0", size = 183837, upload-time = "2026-07-06T21:32:09.655Z" }, - { url = "https://files.pythonhosted.org/packages/69/aa/24580a278de21fd7322635556334d9b535f1cbc00b0a3919447cdf464c65/cffi-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164bff1657b2a74f0b6d54e11c9b375bc97b931f2ca9c43fcf875838da1570dd", size = 184226, upload-time = "2026-07-06T21:32:11.196Z" }, - { url = "https://files.pythonhosted.org/packages/88/a9/02cae418ec4beb282ace11958d9d4737793439d561fadc7e6d56f2e2b354/cffi-2.1.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:c941bb58d5a6e1c3892d86e42927ed6c180302f07e6d395d08c416e594b98b46", size = 211107, upload-time = "2026-07-06T21:32:12.328Z" }, - { url = "https://files.pythonhosted.org/packages/3b/30/c806937ed5e4c2c7ac30d9d6b76b5dc57ff8b75d83800d9bb11a8253cf2a/cffi-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a016194dbe13d14ee9556e734b772d8d67b947092b268d757fd4290e3ba2dfc2", size = 218733, upload-time = "2026-07-06T21:32:13.67Z" }, - { url = "https://files.pythonhosted.org/packages/f9/cf/398272b8bbfd58aa314fda5a7f1cdbb26d1d78ae324a11211521315dd1f0/cffi-2.1.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:03e9810d18c646077e501f661b682fbf5dee4676048527ca3cffe66faa9960dd", size = 205543, upload-time = "2026-07-06T21:32:15.148Z" }, - { url = "https://files.pythonhosted.org/packages/45/ca/f91641185cdd90c36d317a9dc7f85e88ef8682d8b300977baff5e23c35d8/cffi-2.1.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19c54ac121cad98450b4896fa9a43ee0180d57bc4bc911a33db6cab1efab6cd3", size = 205460, upload-time = "2026-07-06T21:32:16.479Z" }, - { url = "https://files.pythonhosted.org/packages/38/66/04781a77b411f0bb5b234d62c1814754ab75ebe455ccff1b08e8d7aae98f/cffi-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d433a51f1870e43a13b6732f92aaf540ff77c2015097c78556f75a2d6c030e0", size = 218760, upload-time = "2026-07-06T21:32:17.98Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9a/bb1d5ed9c3fcae158e9f6391bf309c95d98c2ac37ed56573228471d0af5e/cffi-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d7f118b5adbfdfead90c25822690b02bc8074fba949bb7858bec4ebd55adb43", size = 221230, upload-time = "2026-07-06T21:32:19.407Z" }, - { url = "https://files.pythonhosted.org/packages/41/aa/3c1409cdd26094efacd1c36c66e0a6eb9d4296e4fd4f9901b8b2042f4323/cffi-2.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5f5df567f6eb216de69be06ce55c8b714090fae02b18a3b40da8163b8c5fa9c", size = 213524, upload-time = "2026-07-06T21:32:20.828Z" }, - { url = "https://files.pythonhosted.org/packages/fa/75/74dfb7c3fc6ebbd408038476bd4c1d7e925c62614e7b9c534ecc34218288/cffi-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:11b3fb55f4f8ad92274ed26705f65d8f91457de71f5380061eb6d125a768fecd", size = 220341, upload-time = "2026-07-06T21:32:21.9Z" }, - { url = "https://files.pythonhosted.org/packages/70/b6/9003c33a3e7d2c1306f5962e646457dcfe5a8cd8fce6bbe02d7af25db783/cffi-2.1.0-cp310-cp310-win32.whl", hash = "sha256:9d72af0cf10a76a600a9690078fe31c63b9588c8e86bf9fd353f713c84b5db0f", size = 174578, upload-time = "2026-07-06T21:32:23.073Z" }, - { url = "https://files.pythonhosted.org/packages/8a/26/710688310447531c7a22f857c7f79d9855ec18b03e04494ced723fb37e2f/cffi-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb62edb5bb52cca65fab91a63afa7561607120d26090a7e8fda6fb9f064726da", size = 185071, upload-time = "2026-07-06T21:32:24.671Z" }, - { url = "https://files.pythonhosted.org/packages/d3/67/85c89a59ba36a671e79638f44d466749f08179266a57e4f2ffdf92174072/cffi-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc", size = 183845, upload-time = "2026-07-06T21:32:26.32Z" }, - { url = "https://files.pythonhosted.org/packages/ea/dd/e3b0baa2d3d6a857ac72b7efbf18e32e487c9cdafcc13049ad765495b15e/cffi-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7", size = 184186, upload-time = "2026-07-06T21:32:28.025Z" }, - { url = "https://files.pythonhosted.org/packages/65/68/9f3ef890cf3c6ab97bd531c5677f67613d302165d16f8142b2811782a614/cffi-2.1.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93", size = 211892, upload-time = "2026-07-06T21:32:29.565Z" }, - { url = "https://files.pythonhosted.org/packages/22/d7/1a74539db16d8bfd839ff1515948948efbb162e574650fd3d846896eea95/cffi-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2", size = 218793, upload-time = "2026-07-06T21:32:30.951Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d1/9a5b7169499e8e8d8e636de70b97ac7c9447104d2ff1a2cd94790cea5162/cffi-2.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c", size = 205737, upload-time = "2026-07-06T21:32:32.216Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b0/e131a9c41f10607926278453d9596163594fe1c4ebc46efe3b5e5b34eb84/cffi-2.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f", size = 204909, upload-time = "2026-07-06T21:32:33.655Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d2/4398416cd699b35167947c6e22aca52c47e69ad5695073c9f1f2c52e04aa/cffi-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565", size = 217883, upload-time = "2026-07-06T21:32:35.173Z" }, - { url = "https://files.pythonhosted.org/packages/a2/a5/d4fe77b589e5e82d43ebc809bf2e6474afe8e48e32ea050b9357645b6471/cffi-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c", size = 221251, upload-time = "2026-07-06T21:32:36.527Z" }, - { url = "https://files.pythonhosted.org/packages/22/f0/a2fc43084c0433caf7f461bccc013e28f848d04ee1c5ed7fce71423cf4d9/cffi-2.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02", size = 214250, upload-time = "2026-07-06T21:32:37.852Z" }, - { url = "https://files.pythonhosted.org/packages/04/8c/b925975448cf20634a9fbd5efceb807219db452653648d2897c0989cab2d/cffi-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e", size = 219441, upload-time = "2026-07-06T21:32:39.146Z" }, - { url = "https://files.pythonhosted.org/packages/eb/da/5c4918a2d61d86fa927d716cb3d8e4626ef8dc8f605a599d32f33897f59a/cffi-2.1.0-cp311-cp311-win32.whl", hash = "sha256:64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479", size = 174496, upload-time = "2026-07-06T21:32:40.467Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c8/6c2de1d55cf35ef8b92885d5ef280790f0fb9634d87ea1cc315176aecd61/cffi-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458", size = 185113, upload-time = "2026-07-06T21:32:41.761Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4e/e8d7cb5783f1841a3c8fb3a7735838d7484d08ec08c9f984b14cac1ac0e9/cffi-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d", size = 179927, upload-time = "2026-07-06T21:32:42.961Z" }, - { url = "https://files.pythonhosted.org/packages/1e/85/990925db5df586ec90beb97529c853497e7f85ba0234830447faf41c3057/cffi-2.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f", size = 184829, upload-time = "2026-07-06T21:32:44.324Z" }, - { url = "https://files.pythonhosted.org/packages/4b/92/e7bb136ad6b5352603732cf907ef862ca103f20f2031c1735a46300c20c9/cffi-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde", size = 184728, upload-time = "2026-07-06T21:32:45.683Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d", size = 214815, upload-time = "2026-07-06T21:32:48.557Z" }, - { url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7", size = 222429, upload-time = "2026-07-06T21:32:49.848Z" }, - { url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b", size = 210315, upload-time = "2026-07-06T21:32:51.221Z" }, - { url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7", size = 208859, upload-time = "2026-07-06T21:32:52.512Z" }, - { url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66", size = 221844, upload-time = "2026-07-06T21:32:53.704Z" }, - { url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe", size = 225287, upload-time = "2026-07-06T21:32:54.907Z" }, - { url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b", size = 223681, upload-time = "2026-07-06T21:32:56.329Z" }, - { url = "https://files.pythonhosted.org/packages/b0/80/c138990aa2a70b1a269f6e06348729836d733d6f970867943f61d367f8cc/cffi-2.1.0-cp312-cp312-win32.whl", hash = "sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a", size = 175269, upload-time = "2026-07-06T21:32:57.777Z" }, - { url = "https://files.pythonhosted.org/packages/a8/eb/f636456ff21a83fc13c032b58cc5dde061691546ac79efa284b2989b7982/cffi-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384", size = 185881, upload-time = "2026-07-06T21:32:59.253Z" }, - { url = "https://files.pythonhosted.org/packages/dd/2c/400ea43e721727dca8a65c4521390e9196757caba4a45643acb2b63271b8/cffi-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6", size = 180088, upload-time = "2026-07-06T21:33:02.278Z" }, - { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, - { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795, upload-time = "2026-07-06T21:33:06.699Z" }, - { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746, upload-time = "2026-07-06T21:33:08.071Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, - { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, - { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, - { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, - { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, - { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, - { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248, upload-time = "2026-07-06T21:33:19.799Z" }, - { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717, upload-time = "2026-07-06T21:33:21.47Z" }, - { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114, upload-time = "2026-07-06T21:33:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a", size = 194142, upload-time = "2026-07-06T21:33:23.657Z" }, - { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3", size = 196819, upload-time = "2026-07-06T21:33:25.007Z" }, - { url = "https://files.pythonhosted.org/packages/20/71/7c8372d30e42415602ed9f268f7cfd66f1b855fed881ecd168bcb45dbc0b/cffi-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d", size = 184965, upload-time = "2026-07-06T21:33:26.605Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5c/584e626835f0375c928176c04137c96927165cb8733cdb3150ec04e5ee5e/cffi-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac", size = 184952, upload-time = "2026-07-06T21:33:27.823Z" }, - { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6", size = 222353, upload-time = "2026-07-06T21:33:29.178Z" }, - { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913", size = 210051, upload-time = "2026-07-06T21:33:30.534Z" }, - { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d", size = 208630, upload-time = "2026-07-06T21:33:31.753Z" }, - { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5", size = 221593, upload-time = "2026-07-06T21:33:33.044Z" }, - { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce", size = 225146, upload-time = "2026-07-06T21:33:34.224Z" }, - { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326", size = 223240, upload-time = "2026-07-06T21:33:35.57Z" }, - { url = "https://files.pythonhosted.org/packages/0f/6f/ade5ce9863a57992a6ea3d0d10d7e29b8749fc127204b3d493d667b2815f/cffi-2.1.0-cp314-cp314-win32.whl", hash = "sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd", size = 177723, upload-time = "2026-07-06T21:33:51.626Z" }, - { url = "https://files.pythonhosted.org/packages/41/de/92b9eeed4ae4a21d6fd9b2a2c8505cbed573299902ea73981cc13f7ff62c/cffi-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb", size = 187937, upload-time = "2026-07-06T21:33:53.403Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1a/cc6ae6c2913a03aab8898eee57963cf1035b8df5872ed8b9115fcc7e2be8/cffi-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804", size = 183001, upload-time = "2026-07-06T21:33:54.74Z" }, - { url = "https://files.pythonhosted.org/packages/14/f0/134c00ce0779ec86dea2aa1aac69339c2741a8045072676763512363a2ea/cffi-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714", size = 188538, upload-time = "2026-07-06T21:33:36.792Z" }, - { url = "https://files.pythonhosted.org/packages/50/d8/3b86aba791cb610d24e8a3e1b2cd529e71fa15096b04e4d4e360049d4a4c/cffi-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376", size = 188230, upload-time = "2026-07-06T21:33:38.011Z" }, - { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98", size = 223899, upload-time = "2026-07-06T21:33:39.514Z" }, - { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13", size = 211652, upload-time = "2026-07-06T21:33:40.851Z" }, - { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d", size = 210755, upload-time = "2026-07-06T21:33:42.183Z" }, - { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056", size = 223933, upload-time = "2026-07-06T21:33:43.603Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4", size = 226749, upload-time = "2026-07-06T21:33:45.046Z" }, - { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94", size = 225703, upload-time = "2026-07-06T21:33:46.374Z" }, - { url = "https://files.pythonhosted.org/packages/dc/78/aa01ac599a8a4322533d45a1f9bc93b338276d2d59dabbe7c6d92a775c81/cffi-2.1.0-cp314-cp314t-win32.whl", hash = "sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76", size = 182857, upload-time = "2026-07-06T21:33:47.696Z" }, - { url = "https://files.pythonhosted.org/packages/b9/26/d00496b22de4d4228f32dde94ad996f350c8aad676d63bcca0743c8dea4d/cffi-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5", size = 194065, upload-time = "2026-07-06T21:33:48.953Z" }, - { url = "https://files.pythonhosted.org/packages/d5/dd/0c7dbf815a579ff005008a2d815a55d6bb047c349eef536d9dc53d3f0a8d/cffi-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8", size = 186404, upload-time = "2026-07-06T21:33:50.309Z" }, - { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c", size = 194121, upload-time = "2026-07-06T21:33:56.109Z" }, - { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001", size = 196820, upload-time = "2026-07-06T21:33:57.288Z" }, - { url = "https://files.pythonhosted.org/packages/ed/da/4bbe583a3b3a5c8c60892124fe17f3fa3656523faf0d3484eae90f091853/cffi-2.1.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3", size = 184936, upload-time = "2026-07-06T21:33:58.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/4b/1f4c36ab273980d7aa75bb126ea4f8971f24a96108acad3a0a084028c57b/cffi-2.1.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc", size = 185045, upload-time = "2026-07-06T21:34:00.085Z" }, - { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699", size = 222342, upload-time = "2026-07-06T21:34:01.814Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022", size = 210073, upload-time = "2026-07-06T21:34:03.255Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0", size = 208551, upload-time = "2026-07-06T21:34:04.433Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1", size = 221649, upload-time = "2026-07-06T21:34:06.157Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28", size = 225203, upload-time = "2026-07-06T21:34:07.489Z" }, - { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629", size = 223263, upload-time = "2026-07-06T21:34:08.712Z" }, - { url = "https://files.pythonhosted.org/packages/2c/d8/772b8259bf75749adffb1c546828978381fb516f60cf701f6c83daf60c85/cffi-2.1.0-cp315-cp315-win32.whl", hash = "sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6", size = 177696, upload-time = "2026-07-06T21:34:26.355Z" }, - { url = "https://files.pythonhosted.org/packages/2f/dd/afa2191fc6d57fedd26e5844a2fe2fcc0bbfa00961bbaa5a41e4921e7cca/cffi-2.1.0-cp315-cp315-win_amd64.whl", hash = "sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853", size = 187914, upload-time = "2026-07-06T21:34:27.58Z" }, - { url = "https://files.pythonhosted.org/packages/05/ef/6cd4f8c671517162379dc79cfae5aea9106bc38abb89628d5c16adf6a838/cffi-2.1.0-cp315-cp315-win_arm64.whl", hash = "sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda", size = 183004, upload-time = "2026-07-06T21:34:28.905Z" }, - { url = "https://files.pythonhosted.org/packages/11/b6/12fc55092817a5faa26fb8c40c7f9d662e11a46ee248c137aafc42517d92/cffi-2.1.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc", size = 188378, upload-time = "2026-07-06T21:34:09.926Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2e/cdac88979f295fde5daa69622c7d2111e56e7ceb94f211357fbe452339e4/cffi-2.1.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca", size = 188319, upload-time = "2026-07-06T21:34:11.101Z" }, - { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d", size = 223904, upload-time = "2026-07-06T21:34:12.606Z" }, - { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8", size = 211554, upload-time = "2026-07-06T21:34:13.987Z" }, - { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd", size = 210795, upload-time = "2026-07-06T21:34:15.972Z" }, - { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f", size = 223843, upload-time = "2026-07-06T21:34:17.509Z" }, - { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc", size = 226773, upload-time = "2026-07-06T21:34:19.05Z" }, - { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9", size = 225719, upload-time = "2026-07-06T21:34:20.576Z" }, - { url = "https://files.pythonhosted.org/packages/68/5a/e536c528bc8057496c360c0978559a2dc45653f89dd6151078aa7d8fca1a/cffi-2.1.0-cp315-cp315t-win32.whl", hash = "sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b", size = 182760, upload-time = "2026-07-06T21:34:22.059Z" }, - { url = "https://files.pythonhosted.org/packages/d3/0b/0ffe8b82d3875bced5fa1e7986a7a46b748262a40ab7f60b475eb9fb1bb3/cffi-2.1.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5", size = 193769, upload-time = "2026-07-06T21:34:23.589Z" }, - { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", hash = "sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210", size = 186405, upload-time = "2026-07-06T21:34:24.857Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/d2/2cde336b375f55c76ca670f0be3978cc048e31e24f3b4d7ce8473150a388/cffi-2.1.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:baed1e86cc735622097354b9d1281406caf42ff42a886d29faa8e8d1630333be", size = 183779, upload-time = "2026-08-03T21:19:15.602Z" }, + { url = "https://files.pythonhosted.org/packages/94/1a/4b2f7c92293ba05cbd4a9a1b28faaf0326272d9488e6354657571c48a7aa/cffi-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca82be1a1d406ecfe1d25dc16cb33488e5a16bf4438c9fb590484ea29d92478b", size = 184178, upload-time = "2026-08-03T21:19:16.67Z" }, + { url = "https://files.pythonhosted.org/packages/17/0b/ba385d8ccedf926c3cd06e8e2f327027da5afe5f0eb30f1f7bc43ac55125/cffi-2.1.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004", size = 211037, upload-time = "2026-08-03T21:19:17.705Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b9/0f2e58b2cefa33255bff36935d42b13180fe559bba82596540eb404bde7d/cffi-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9", size = 218652, upload-time = "2026-08-03T21:19:18.735Z" }, + { url = "https://files.pythonhosted.org/packages/37/15/180e0dab27b9312c7479003d14c9e547634b7dcb934e2cc4650e1b131a7a/cffi-2.1.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:9f8d177621de5cb38ee3e731eda45d421db093ec0739f46a5594babda7987a98", size = 205422, upload-time = "2026-08-03T21:19:19.96Z" }, + { url = "https://files.pythonhosted.org/packages/18/d4/03026f0c850cbbaa9030750490225b4a7f4d524ea4df72c3cc740a90f4ef/cffi-2.1.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:75f80557d1389eddbd0de2681f6a390a0c5338c31ddaa821381c203fc3fd50d9", size = 205444, upload-time = "2026-08-03T21:19:21.246Z" }, + { url = "https://files.pythonhosted.org/packages/75/77/60bebf6f818bec84210ac5b6979ce4eeadce6fbbaabc9c7ab23e506d1ce5/cffi-2.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6", size = 218742, upload-time = "2026-08-03T21:19:22.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ae/679bf47e73fd77b352171727f07de559a003f14de5d02b904a6ec1fa73ca/cffi-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf", size = 221054, upload-time = "2026-08-03T21:19:23.694Z" }, + { url = "https://files.pythonhosted.org/packages/09/b8/eefc0e06913b70aa153bf74c946094a18f58fd4aff11b7f372bfdfdca050/cffi-2.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659", size = 213489, upload-time = "2026-08-03T21:19:24.922Z" }, + { url = "https://files.pythonhosted.org/packages/6f/13/4e56852824a03cdf68523a35686f1c28eacd4bd30a7b0a78e682e6e6e1d3/cffi-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9", size = 220241, upload-time = "2026-08-03T21:19:26.214Z" }, + { url = "https://files.pythonhosted.org/packages/99/7f/040f9e163e4acac3ee3d85b02d00b2576e7ca980d8785f0a3a5f1a9bf7f5/cffi-2.1.1-cp310-cp310-win32.whl", hash = "sha256:7ce713ace7c0e4520535b42b77eaa742c16dab813978064913e5a3cf82973b41", size = 174578, upload-time = "2026-08-03T21:19:27.338Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0b/644a2ec1a4eaba49c2939410bb1eb1d25b09d6d0582f5d2f95c537043725/cffi-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a48d62ab9d6f4f98c983223a547af44be6ca3691074c31cecced6facd3ba2dc1", size = 185082, upload-time = "2026-08-03T21:19:28.409Z" }, + { url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, + { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" }, + { url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" }, + { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" }, + { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" }, + { url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" }, + { url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" }, + { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, + { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, + { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, + { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, + { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" }, + { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" }, + { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, + { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, + { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, + { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, + { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, + { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, + { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, + { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, + { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" }, + { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" }, + { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, + { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, + { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" }, + { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" }, + { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" }, + { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, + { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" }, + { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" }, ] [[package]] name = "cfn-lint" -version = "1.53.0" +version = "1.56.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aws-sam-translator" }, { name = "jsonpatch" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -626,96 +603,172 @@ dependencies = [ { name = "sympy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/93/36cea246a0ec155eaa16444386675260bbfd38d259cfa26deffc8f417628/cfn_lint-1.53.0.tar.gz", hash = "sha256:dcf285939dea3c15e06bcb23a817bbdecb6c3e0ab19d98147877f04e02b5b07c", size = 4517403, upload-time = "2026-07-09T18:09:16.298Z" } +sdist = { url = "https://files.pythonhosted.org/packages/73/da/e419b9775114b082e089e3856ba64b27ed1d16c100e9bdf09b844ca7ba08/cfn_lint-1.56.3.tar.gz", hash = "sha256:cdca8797e33aad72c2eb94b49cb4b129cd1cd4309f7376c109d4d9446605bf41", size = 4782328, upload-time = "2026-09-10T18:35:07.124Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/eb/f9e2ce6888b5e77072169d884afcd957e69d3f293b03b4eb4dfad48fe358/cfn_lint-1.53.0-py3-none-any.whl", hash = "sha256:8a91d1f0d8d18614410a0c1676213df8cd0ac55fa462f3f6369fb9fdaa7ae28d", size = 5049598, upload-time = "2026-07-09T18:09:14.108Z" }, + { url = "https://files.pythonhosted.org/packages/11/80/e1545e7ee25552021e6b03715e0670bbd07e1b1e46d1f831fc5ce175007e/cfn_lint-1.56.3-py3-none-any.whl", hash = "sha256:f3b02b05f1dbf44c51d0c776d8a7543badc83ca3c7c933f243573b53d576b583", size = 5347306, upload-time = "2026-09-10T18:35:04.936Z" }, ] [[package]] name = "charset-normalizer" -version = "3.4.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/81/8e983840c6e5b93b33c2ba81aa3d52c2e42f0e9a690ce7607a2e61da4a5c/charset_normalizer-3.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a", size = 322240, upload-time = "2026-07-07T14:32:36.236Z" }, - { url = "https://files.pythonhosted.org/packages/de/d1/b4319dc3229d8272fba305e206fc0a148e2de8d4087917ce62ae6382f359/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616", size = 216475, upload-time = "2026-07-07T14:32:38.142Z" }, - { url = "https://files.pythonhosted.org/packages/80/33/6c99c1b3e6b8bf730e1bc809b9a2608f224145069114c479a2e9e1494346/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209", size = 238670, upload-time = "2026-07-07T14:32:39.658Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f4/ffbb83546e1f198ecc70ecd372b65cf2b50f9068b380abd67640f17a8e18/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99", size = 233476, upload-time = "2026-07-07T14:32:41.155Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5f/b98b8da398637b551e427e7be922bdec19177dc54d6811dcdaa503f23aac/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8", size = 223817, upload-time = "2026-07-07T14:32:42.592Z" }, - { url = "https://files.pythonhosted.org/packages/36/31/a276bb2e66243072a3fd06fdcab9cbb61a305b02143d70d2bda21d888fa8/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b", size = 207974, upload-time = "2026-07-07T14:32:44.258Z" }, - { url = "https://files.pythonhosted.org/packages/5e/be/7ee4453d7e88dfbc4104ccd34900b9f2c7c17dac22881865fe0e82424a25/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2", size = 221655, upload-time = "2026-07-07T14:32:45.64Z" }, - { url = "https://files.pythonhosted.org/packages/1d/85/181c652953eb5276d198f375b1dd641047392050098100a3a02d6534f657/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9", size = 219229, upload-time = "2026-07-07T14:32:47.376Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e7/aaf6da33fc9f4691cda8f7efbc9f69179d3d39ec8a4799baf273ee1d8db0/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15", size = 209704, upload-time = "2026-07-07T14:32:48.855Z" }, - { url = "https://files.pythonhosted.org/packages/63/01/f2fb3bd3a73be48b173ee0c6aa8d2497af97d5663a8c4c4b491de4c62f7a/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d", size = 226243, upload-time = "2026-07-07T14:32:50.239Z" }, - { url = "https://files.pythonhosted.org/packages/c4/02/c57a22739fe05246b0b5783b3bfb6afaac4eebb46f3ececdfb2f048f780e/charset_normalizer-3.4.9-cp310-cp310-win32.whl", hash = "sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381", size = 150935, upload-time = "2026-07-07T14:32:51.676Z" }, - { url = "https://files.pythonhosted.org/packages/37/8d/ca39a7559a4797505530d084fd3a49a2c959efbbbff146302fb7be4e3b35/charset_normalizer-3.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee", size = 162314, upload-time = "2026-07-07T14:32:53.193Z" }, - { url = "https://files.pythonhosted.org/packages/01/da/a44bd7a13d426e69e4894557106cd58669097bfad4a8681123b618fbfc5d/charset_normalizer-3.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419", size = 153075, upload-time = "2026-07-07T14:32:54.554Z" }, - { url = "https://files.pythonhosted.org/packages/0b/e3/85ec501f206fb049259288c1f3506e53876937fb00edb47009348e66756b/charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5", size = 317075, upload-time = "2026-07-07T14:32:56.021Z" }, - { url = "https://files.pythonhosted.org/packages/c3/69/2a5385192e67175f7d8bd5ce4f57c24bc956439adeae5c13a99aa28a53d1/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2", size = 213837, upload-time = "2026-07-07T14:32:57.78Z" }, - { url = "https://files.pythonhosted.org/packages/b3/46/03ddc7da576d814fe0a36dd1f0fd3258e95404b4b2e3c026b7923d7e133f/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a", size = 235503, upload-time = "2026-07-07T14:32:59.205Z" }, - { url = "https://files.pythonhosted.org/packages/4e/6e/de0229a7ef40f6f9d28a837eebf4ec47bdca5dab4e900c84f22919af636a/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29", size = 229944, upload-time = "2026-07-07T14:33:00.803Z" }, - { url = "https://files.pythonhosted.org/packages/a5/34/49b9060e8418b14fb5cba9cf6bfb383111e2538a03a1fb18e66a95aeb3d5/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c", size = 221276, upload-time = "2026-07-07T14:33:02.199Z" }, - { url = "https://files.pythonhosted.org/packages/44/95/80282cce0fae9c3061203d723ee87da996aed79679e65d8935050ee7ca1f/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b", size = 205260, upload-time = "2026-07-07T14:33:03.698Z" }, - { url = "https://files.pythonhosted.org/packages/0c/74/2f62c8821b969ea3bd67cc2e6976834f48ca5d12664d2559ebcd9bcfbed7/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db", size = 217786, upload-time = "2026-07-07T14:33:05.12Z" }, - { url = "https://files.pythonhosted.org/packages/d9/8d/feabb82cb49fcad14515b1d7d1ca4787b0da7fc723a212bf89bc9e0fac52/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993", size = 216798, upload-time = "2026-07-07T14:33:06.629Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ff/c946d63bc3786d5b84d960b0f7ab7e25b828486a946b5aa997625bcaf6a6/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da", size = 206429, upload-time = "2026-07-07T14:33:08.006Z" }, - { url = "https://files.pythonhosted.org/packages/af/ba/5e5007c370702f85d2ef75791fac7943ed41e080364a673b20142e430e3e/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3", size = 223066, upload-time = "2026-07-07T14:33:09.783Z" }, - { url = "https://files.pythonhosted.org/packages/83/d5/9096aa3cf532dfad237861544eb47a0f20d5adbf1039760fed8eaae935d9/charset_normalizer-3.4.9-cp311-cp311-win32.whl", hash = "sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d", size = 150456, upload-time = "2026-07-07T14:33:11.217Z" }, - { url = "https://files.pythonhosted.org/packages/ed/a1/e29995109e455dc8eff8d0fac6ae509be39561318a7cfeac5d33ad029213/charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1", size = 161410, upload-time = "2026-07-07T14:33:12.743Z" }, - { url = "https://files.pythonhosted.org/packages/4f/8d/1569f4d0032d6ba2a4fe4591c35bf87868c600c41a71eb5c2e1ffa8464c2/charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec", size = 152649, upload-time = "2026-07-07T14:33:14.173Z" }, - { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" }, - { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, - { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, - { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, - { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, - { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, - { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, - { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, - { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, - { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, - { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" }, - { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" }, - { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, - { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, - { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, - { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, - { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, - { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, - { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, - { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, - { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, - { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, - { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, - { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, - { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, - { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, - { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, - { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, - { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, - { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, - { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, - { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, - { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, - { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, - { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, - { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, - { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, - { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, - { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, - { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, - { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, - { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, - { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, - { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, - { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/aa/554e2614f38fc34c58ff1d0911ae8535ad2516440d5482d76fe59f1088b0/charset_normalizer-3.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1ee1e296209fdce05b81b663250eefa02213a2da7b41bf26f7829b8ba3545aa", size = 369072, upload-time = "2026-08-15T08:16:22.964Z" }, + { url = "https://files.pythonhosted.org/packages/03/6d/439231dfc3ccfa6f8c06477b7da2219cbd41a2de3d49084df8ec7b5100f2/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9fbdce1e47394b09bc9f26ab117dfc8d6491977a11d86f592bb42c779db2fda", size = 251142, upload-time = "2026-08-15T08:16:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/55/53/7d819bd23a00ef45039146fa2cce1daa2f0771e758c5653ee1f6edac91ed/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:00668ebb0609751758682eb0b5857e7c35b9f00e84dfdef062e103244ec94d45", size = 240714, upload-time = "2026-08-15T08:16:26.392Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2c/45847198c16f4b38090cc7423b2b6a9008e438704d8ab413211832498d31/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba2f37ee79e6338845261a3c5b1784e5d1acdff2c0785b284f1b633033d136ab", size = 279637, upload-time = "2026-08-15T08:16:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/69/2b/d8be3523ddf9f0b0f3e56d1359034aa10653a4d11564c697f802b4775766/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ce854f5f478050ade5a238731c4ca985a7d3b3cb53ff600a9b5c3b689b5f0a7a", size = 276543, upload-time = "2026-08-15T08:16:29.399Z" }, + { url = "https://files.pythonhosted.org/packages/32/cd/4f564b8f132de25db594efc706897069f016790cea63a5669c9df2675f64/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96eefc178f8636b9c760c5829345307fd81cfae9ab1e80997dbddeb0f54ee9a3", size = 261644, upload-time = "2026-08-15T08:16:30.722Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e3/38b975422534a608f98c360e79c2f07c763d66dd4272300d45fb1fee54b0/charset_normalizer-3.5.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:366ec70f5547c640d3ce1985722490f23faf4eb5216a7eeba78277490e78dacb", size = 259609, upload-time = "2026-08-15T08:16:32.248Z" }, + { url = "https://files.pythonhosted.org/packages/87/bd/fbc24d825c66f1c74f6ccdea3742c3d8354a4888e86d1315a197fee69061/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:950f23cb393f85543777b0433f082cddd25b51ab398eac7971146495679efe5f", size = 252457, upload-time = "2026-08-15T08:16:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2d/918d0e98a0e679469ed05bb2d90c2088b4d315bb612969d8499f76fb5210/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1dcc36dcb96abc02236e182d17e0f71430152a6c2c7447421da2d2dc144edea", size = 242240, upload-time = "2026-08-15T08:16:35.396Z" }, + { url = "https://files.pythonhosted.org/packages/20/c8/c36f6e0b2dfec351bd38cbc05362697e58bcd073d7dbd95154290c9714ce/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:07ffd07412fc5d5e84cd8952acf9ff7e4ed7a708e69d1bada19d8ba91711353f", size = 280308, upload-time = "2026-08-15T08:16:36.825Z" }, + { url = "https://files.pythonhosted.org/packages/ca/7b/311b3e02e8c4092400c449c850a760d8c45d900983c83a70cc07208c551d/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f5542f9b941279d82d41eb0aa9f98eba36fe4df5c7086c651df7944935b37182", size = 258679, upload-time = "2026-08-15T08:16:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b9/90/082cc45599c392f28c036a497f49e0634041a785fc3849c80ccf396d096f/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a545775cfe815855ea32d7c27731d79da358ef2055b4a25830231b1622dd18aa", size = 277221, upload-time = "2026-08-15T08:16:39.62Z" }, + { url = "https://files.pythonhosted.org/packages/58/ad/b9aecf38d805cbcf84fa94f14c5d972a16561e20296a11dc799a5dcf3763/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:494b70049a4d69aec6e8137c13af4cf8db8c9f9820a1392ac293b0dd2987a818", size = 263799, upload-time = "2026-08-15T08:16:40.885Z" }, + { url = "https://files.pythonhosted.org/packages/b7/23/b38a20598d5a825f85d9d7636860e56ff0db1479f86497a6e485aa9326f7/charset_normalizer-3.5.1-cp310-cp310-win32.whl", hash = "sha256:94fbf1c0c6cc0d3d5e50f9a9313a8cdca90dd696d34b381cd1704f8c9e939f20", size = 182037, upload-time = "2026-08-15T08:16:42.198Z" }, + { url = "https://files.pythonhosted.org/packages/d2/21/83fffb77864408b8bf0fe1ca603926401d6f8775a8e150b39aacc9958f8a/charset_normalizer-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:be47f99644b208bff7766314013f9acf57b056b04191d570d68ad14022cf5b1d", size = 206030, upload-time = "2026-08-15T08:16:43.787Z" }, + { url = "https://files.pythonhosted.org/packages/86/2e/b93135b5034b1157fb29554b0d06d4844ce62282f0e0a14036f93d7ee2e7/charset_normalizer-3.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:a6d095662e73e74f0a49988e0593373e243e3a52e27bfeea0a859e88acf4a0f5", size = 185092, upload-time = "2026-08-15T08:16:45.177Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", size = 363585, upload-time = "2026-08-15T08:16:46.646Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", size = 251189, upload-time = "2026-08-15T08:16:48.287Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", size = 239724, upload-time = "2026-08-15T08:16:49.67Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", size = 280078, upload-time = "2026-08-15T08:16:51.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", size = 276650, upload-time = "2026-08-15T08:16:52.625Z" }, + { url = "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", size = 262325, upload-time = "2026-08-15T08:16:54.085Z" }, + { url = "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", size = 261140, upload-time = "2026-08-15T08:16:55.604Z" }, + { url = "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", size = 252791, upload-time = "2026-08-15T08:16:57.103Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", size = 240730, upload-time = "2026-08-15T08:16:58.418Z" }, + { url = "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", size = 280791, upload-time = "2026-08-15T08:16:59.918Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", size = 259598, upload-time = "2026-08-15T08:17:01.421Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", size = 278217, upload-time = "2026-08-15T08:17:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", size = 263417, upload-time = "2026-08-15T08:17:04.216Z" }, + { url = "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl", hash = "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", size = 181774, upload-time = "2026-08-15T08:17:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", size = 206653, upload-time = "2026-08-15T08:17:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", size = 185630, upload-time = "2026-08-15T08:17:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, + { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, + { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, + { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, + { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, + { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, + { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, + { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, ] [[package]] @@ -740,14 +793,11 @@ wheels = [ [[package]] name = "click" -version = "8.4.2" +version = "8.5.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, + { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, ] [[package]] @@ -761,11 +811,11 @@ wheels = [ [[package]] name = "configargparse" -version = "1.7.5" +version = "1.7.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/0b/30328302903c55218ffc5199646d0e9d28348ff26c02ba77b2ffc58d294a/configargparse-1.7.5.tar.gz", hash = "sha256:e3f9a7bb6be34d66b2e3c4a2f58e3045f8dfae47b0dc039f87bcfaa0f193fb0f", size = 53548, upload-time = "2026-03-11T02:19:38.144Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/b4/7065677004d4ec8728da15a70580f431f1a4a079e0e8e8b7aa4ffee4e972/configargparse-1.7.7.tar.gz", hash = "sha256:607bea276a219912158afa1e5a716c3f8f88d542f9997dfd43bbd0b492a9f5a6", size = 73397, upload-time = "2026-09-06T20:58:06.387Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/19/3ba5e1b0bcc7b91aeab6c258afd70e4907d220fed3972febe38feb40db30/configargparse-1.7.5-py3-none-any.whl", hash = "sha256:1e63fdffedf94da9cd435fc13a1cd24777e76879dd2343912c1f871d4ac8c592", size = 27692, upload-time = "2026-03-11T02:19:36.442Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e6/cf29a5b21528779fa335c860c66a915d2254bbf77c1fb2c67160c56c3b58/configargparse-1.7.7-py3-none-any.whl", hash = "sha256:61107bb1de0b53c4eb7a475a12de6783b0dc6c51bc9859f5accbe97d66f8a4b7", size = 34277, upload-time = "2026-09-06T20:58:05.125Z" }, ] [[package]] @@ -779,100 +829,130 @@ wheels = [ [[package]] name = "coverage" -version = "7.15.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/d0/55fe630f4cf94e3fcba868240fad8c8cdd1f764e2a932f8926347e6ec4cd/coverage-7.15.2.tar.gz", hash = "sha256:3df60dc267f0a2ca23cb7a9ab1109c62b9335ffbf519fcfe167157c28c09b81d", size = 927741, upload-time = "2026-07-15T18:56:19.558Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/03/060ce69008ac97bbc01b1411b3e55b61f6f015659400b46749b662107831/coverage-7.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b5bd92ff1ec22e535eab0de75fa6db021992791f461a2aceb7822c625a1187d", size = 221284, upload-time = "2026-07-15T18:53:29.52Z" }, - { url = "https://files.pythonhosted.org/packages/fc/a3/d936e8b53edd9684100a6aefaf3fcabaa54728fe33324436c8d279c047aa/coverage-7.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44826758cfe73fcd0e6af5deb4ba6d5417cc1d13df3acb35c93484a11160f846", size = 221799, upload-time = "2026-07-15T18:53:31.708Z" }, - { url = "https://files.pythonhosted.org/packages/ae/a3/ca234b06aec7ee28226f11d39a696b4481fe5eddfce8e03bf39979bb8ffb/coverage-7.15.2-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:09f5c6ec5901f667bd97dd140b5b9a2586b10efec66f46fb1e6d8135f8b95bdf", size = 248544, upload-time = "2026-07-15T18:53:33.212Z" }, - { url = "https://files.pythonhosted.org/packages/2b/89/dda79527bb7573ba91828b2fb91b3105d87378d6a2749ca0c0924ce0addd/coverage-7.15.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1d16e3a7104ea84f03e614611b3edbf6fb6892554b3ab0fe7fbb3f2b2ef04376", size = 250374, upload-time = "2026-07-15T18:53:34.683Z" }, - { url = "https://files.pythonhosted.org/packages/67/c6/c33755a34572f81f49a8c0cdf6b622f35ccb3238b136e1909daf0cdd4319/coverage-7.15.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d46e62cb35d91e6e2589fda6d28074426b0e276422b5d2ebef2c6b11dc60dbfd", size = 252239, upload-time = "2026-07-15T18:53:36.205Z" }, - { url = "https://files.pythonhosted.org/packages/b9/6f/dc341741b375be53a5baeee5b4bf0f0e525d38caed428f7932d23bb7bcb1/coverage-7.15.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dfd3db045e95960ae3683059571e597fda7cc610106a8916f77c5839048c1deb", size = 254150, upload-time = "2026-07-15T18:53:37.863Z" }, - { url = "https://files.pythonhosted.org/packages/e9/8d/966a18a5b195cb4e77b14c53f5f3dce22b5da05e6de7fafd1e08f2d2067a/coverage-7.15.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:affd532502d34c0472d0cdb181325c89f1d2c44992fef0c17e88e7b1576259a1", size = 249234, upload-time = "2026-07-15T18:53:39.394Z" }, - { url = "https://files.pythonhosted.org/packages/c5/8b/8b2e367496ab48484d48e79984fec76cdc1b7cb5d3a00ee799a5602e3ec9/coverage-7.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d17d7512151fedfcc64c1821a8977fc9be0dbf495754669afcab7b57abc98ae9", size = 250276, upload-time = "2026-07-15T18:53:41.027Z" }, - { url = "https://files.pythonhosted.org/packages/63/92/1199318a200eb6c8c6ce0192c892c8710ac791abbe0f35099294620bbfda/coverage-7.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e26ff680768b8095e8874aabe0e9d3a47a2a9f176a8340d05f8604c56457c23a", size = 248283, upload-time = "2026-07-15T18:53:42.557Z" }, - { url = "https://files.pythonhosted.org/packages/56/da/be284a55c5619bda891a89c27dfd59324a2c6a14d755cf6aac6960ceebeb/coverage-7.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7e8f27131dc7cd53de2c137dd207b3720919320b3c20d499dc30aa9ee6173287", size = 252093, upload-time = "2026-07-15T18:53:44.271Z" }, - { url = "https://files.pythonhosted.org/packages/d4/53/ee112da833ddd77b73c6d781a98029b45b584b136615b4900ed0569f887e/coverage-7.15.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:728a33676d4c3f0db977990a4bd421dcaa3be3e53b5b6273036fff6666008e89", size = 248552, upload-time = "2026-07-15T18:53:45.7Z" }, - { url = "https://files.pythonhosted.org/packages/82/6a/802cfc802e9113494c80bf3f284cd4d72faeb1f24e244f61046af364f2ca/coverage-7.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29c052f7c83ccfcc5c577eaae025d2e4a9bb80daf03c0ac31c996e83b000ce88", size = 249154, upload-time = "2026-07-15T18:53:47.256Z" }, - { url = "https://files.pythonhosted.org/packages/2c/65/529808e91d651147edae408fd9e894abc3b8cad7f3e594bbc36719a3e13a/coverage-7.15.2-cp310-cp310-win32.whl", hash = "sha256:1268ac8fb9ddcd783d3948dbabaf80a5d53bfdaa0575e873e2139a692f797443", size = 223334, upload-time = "2026-07-15T18:53:48.768Z" }, - { url = "https://files.pythonhosted.org/packages/68/0f/0e1829d7001130876dfbc0b4e1c737ea7c155b809e3e4a98a0aa268e2369/coverage-7.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:9f4432898c4bf2fba0435bbe35dd4437d7264565e5a88a21f5b49d8662a6b629", size = 223959, upload-time = "2026-07-15T18:53:50.429Z" }, - { url = "https://files.pythonhosted.org/packages/7d/3a/54536704f507d4573bf9161c4d0dd3dd59b6d85e48c664e901b6844d8e33/coverage-7.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f1ec6f304b156669cfde653b4e9a953f5de87e247ea02ac599bce0ab2744036", size = 221414, upload-time = "2026-07-15T18:53:51.941Z" }, - { url = "https://files.pythonhosted.org/packages/b6/d9/8ba925d29743e3577b21e4d8c11a702b76bc93c41e7fdfd1177af63d4b8d/coverage-7.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d3361879d736f469f45723c11ea1a5bbdaf1f6928f0e632c940378b5aa9b660", size = 221913, upload-time = "2026-07-15T18:53:53.682Z" }, - { url = "https://files.pythonhosted.org/packages/09/54/a855f3aa0187f2b431ade4e4791b77b56282cfb5d201c83ec26a31b5b36a/coverage-7.15.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c6a98d698f9e2c8008d0370ec7fc452ebfcc530002ae2d0061170d768b992589", size = 252332, upload-time = "2026-07-15T18:53:55.467Z" }, - { url = "https://files.pythonhosted.org/packages/8e/d3/13ac97b4370640ba3452fc8559b06cc2f479ce3ba4a0b632a73e44c38a7d/coverage-7.15.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d50dd325e18ec25bfcc10cd7f99b04df1ab9ec76b0918c260e60817ad0643dee", size = 254243, upload-time = "2026-07-15T18:53:57.055Z" }, - { url = "https://files.pythonhosted.org/packages/88/83/5eca144942d8d0659d3f55176517f4a59cdc65eefd17146a0770935a3ebd/coverage-7.15.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67d7602480a47bdf5b675635403625553ebaa70d5a62a657c035149fd401cea0", size = 256352, upload-time = "2026-07-15T18:53:58.83Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ba/d3db2e01a50fc88cdb4c0f19542bcf6f61489e34dc9aa3538413e2459a38/coverage-7.15.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cee0f89f4767a6057c8fbf168f8135f18be651300496086bd873e3189fed0487", size = 258313, upload-time = "2026-07-15T18:54:00.497Z" }, - { url = "https://files.pythonhosted.org/packages/78/b3/aba83416e9177df28e5186d856c19158c59fc0e7e814aaa61a4a2354ad1b/coverage-7.15.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a29ec5305a7335aacee2d799e3422e91e1c8a12474986e2b3b07e315c91be82f", size = 252449, upload-time = "2026-07-15T18:54:02.456Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a5/4b00ecac0194431ab451b0f6710f8e2517d04cef60f821b14dec4637d575/coverage-7.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:48ccc6395958eda89093ecdc35644c86f23a8b23a7f4d44958812b721aad67c1", size = 254043, upload-time = "2026-07-15T18:54:04.072Z" }, - { url = "https://files.pythonhosted.org/packages/75/b6/cfa209b4313ee7f1b34da47efcd789ea51c024ad35af390e00f5a3c10a2e/coverage-7.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:81f382c5a94b434ec1f6da607edb904c76d7212e618cd4d1bc9f97bed4120ef5", size = 252107, upload-time = "2026-07-15T18:54:06.745Z" }, - { url = "https://files.pythonhosted.org/packages/36/67/e8cac5a6954038c98d7fe7eb9802afe7ab3ecb637bb7cc00e69b4148b56d/coverage-7.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bbc808daf4f5cd567af8075ecc72d21c6dfef9a254709a621a84c217c935ebc0", size = 255873, upload-time = "2026-07-15T18:54:08.48Z" }, - { url = "https://files.pythonhosted.org/packages/2c/92/395cca9f330a86c3fe3471d73e2c102116c4c58fdc619dbbc125c6e93a54/coverage-7.15.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a4c46b247b5d4b78f613bd89fea926d32b25c6cc61a50bd1e99ba310348f3dad", size = 251826, upload-time = "2026-07-15T18:54:10.083Z" }, - { url = "https://files.pythonhosted.org/packages/51/60/3e91b20295439652424f426b7086ec5bf4fbe3f604c73eda22b986c4fd6b/coverage-7.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:094dd37f3ef7b2da8b068b583d1f4c40f91c65197e16c52a71962d5d537fc5db", size = 252735, upload-time = "2026-07-15T18:54:11.878Z" }, - { url = "https://files.pythonhosted.org/packages/a5/eb/8c07839005e5e3c6b3877d3a6e2a80ce766589f31dd2b6882b78d59a7b8c/coverage-7.15.2-cp311-cp311-win32.whl", hash = "sha256:a63b9e190711134d581c4d703df5df09851b1acf99792c7aacbbe9f41f0283c9", size = 223500, upload-time = "2026-07-15T18:54:13.525Z" }, - { url = "https://files.pythonhosted.org/packages/2e/98/59d83c257cd59f0fbaf9d9ddb26b744a576760dfd1ae16e516408894a02b/coverage-7.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:8bb9f4b4279187560796a4cdaca3b0a93dd97e48ee667df005f4ed9a97403688", size = 223973, upload-time = "2026-07-15T18:54:15.163Z" }, - { url = "https://files.pythonhosted.org/packages/ea/09/2d285c8bef5c4f695d120c1c96dc11715638aa8e134069f210bb6a62a9fe/coverage-7.15.2-cp311-cp311-win_arm64.whl", hash = "sha256:8c726b232659cbd2ae57ade46509eb068c9bd7a06df9fcbff6fe484870006934", size = 223519, upload-time = "2026-07-15T18:54:16.803Z" }, - { url = "https://files.pythonhosted.org/packages/6a/50/eb5bf42e531611a9f8d272556b1ed4de503f84a91413584094487cf69f8f/coverage-7.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1adac78e5abc7c5438f7a209c9ca69d06542f0bf481d728b6989ea80b813fdf9", size = 221587, upload-time = "2026-07-15T18:54:18.439Z" }, - { url = "https://files.pythonhosted.org/packages/06/d1/da99af464c335d4e023a6efcd7ec30f63b88a43c93745154ab74ffb31cea/coverage-7.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b868acc62aa5de3be7a9d05c2333bf8359ca987e43f9cb30ff8fbda6a024ab73", size = 221943, upload-time = "2026-07-15T18:54:20.062Z" }, - { url = "https://files.pythonhosted.org/packages/5b/8a/13c42723d61ca447eafa18732e8141dd6a63f2732e1c7e1502c182dd88d7/coverage-7.15.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6f6966fc30e6f06ca8f98fb0ce51eda6b111b3ee8d066a8b1ec9e77fa06ab55d", size = 253450, upload-time = "2026-07-15T18:54:21.765Z" }, - { url = "https://files.pythonhosted.org/packages/d7/29/99021303f98fbdcb63504b4d07bea4cc025b9b2dd907c4f07c85d50a0dab/coverage-7.15.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:68af907f595ab01a78f794932ff3bdf929c316d3000810d38dbc247129e26f8b", size = 256187, upload-time = "2026-07-15T18:54:23.4Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a8/fd503715ed6ca9c5d742923aa5209257340b367a867b2ced0c7d4ba8a0b9/coverage-7.15.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afa29e2eff3d5729267e2cb2fd4ce9d61c952932fb2694e34ccb5d9540c6a296", size = 257301, upload-time = "2026-07-15T18:54:25.183Z" }, - { url = "https://files.pythonhosted.org/packages/da/40/3f4b8fb409810036ebc2857d36adc0498c6e957b5df0290c5036b2e143f1/coverage-7.15.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bbf44513ceb1589e31948e20eafbde9deaface90e1a1afa5f5f77b4423d17ce6", size = 259562, upload-time = "2026-07-15T18:54:27.204Z" }, - { url = "https://files.pythonhosted.org/packages/0b/8a/9bdffbef47db77cce3d6b02a28f7e919b19f0106c4b080c2c2246040f885/coverage-7.15.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9deddf09eecb717b7f980414b43d90a5b22ff3967d2949ab29cb0aa83d9e9098", size = 253841, upload-time = "2026-07-15T18:54:29.134Z" }, - { url = "https://files.pythonhosted.org/packages/1b/1e/9031efde019d31a06646261fce6dfc5c3c74e951e27a71e5c9a424563178/coverage-7.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae901f7e55ba405c84ee1cab3d3e962e4e871e4a2bcb9c90911adbd69b42ac5a", size = 255221, upload-time = "2026-07-15T18:54:31.142Z" }, - { url = "https://files.pythonhosted.org/packages/56/db/787acde872389fc84a9ef9d8cd1ccc658e391ab4cb5b28092a714426a394/coverage-7.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a0f47002c6eeb7c280228467a4cb0cc15ca2103a8421b986b2d3ec04a0f9bd8b", size = 253366, upload-time = "2026-07-15T18:54:32.886Z" }, - { url = "https://files.pythonhosted.org/packages/2f/9b/6f57bc4b93c842eef1695f8cdaf2318e35e7ba54f5ba80d84be213ab7858/coverage-7.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1cd7a5beb7af3e864a13b1f0fb26efd3695da43ef0daf71e586adfffaf34d5b2", size = 257434, upload-time = "2026-07-15T18:54:34.7Z" }, - { url = "https://files.pythonhosted.org/packages/88/26/b3186a21b2acc83e451118978905c81c7072c3333707804db09a78c096a2/coverage-7.15.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:97a5c5457a9fb1d6c4e06cfb5dc835871fbfb6a6a51addc9e925bdeff5ef7440", size = 252935, upload-time = "2026-07-15T18:54:36.548Z" }, - { url = "https://files.pythonhosted.org/packages/20/c2/c9f3376b2e717ea69ed7a6e9a5fcab968fb0b290db6cf4bd9a1fc7541b75/coverage-7.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0901cfe6c13bcd2302da4f83e884555d2a22bda6e4c476f09ef204ba20ca536e", size = 254807, upload-time = "2026-07-15T18:54:38.296Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e1/dfc15401f4a8aaeb486e1ba3e9e3c40522a6e38bd0ecf0b3f29cb8082957/coverage-7.15.2-cp312-cp312-win32.whl", hash = "sha256:b171bdd71cb7ff792bf32e376173b0ace7e7963e7e57c58dfc42063a6a7174cd", size = 223641, upload-time = "2026-07-15T18:54:40.103Z" }, - { url = "https://files.pythonhosted.org/packages/91/40/81b6d809d320cd366ec5bdf8176575e897dcb8efe7fb4b489ef9e93e4d13/coverage-7.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:582edc45c2040543fef83341be23c43024a3ab3ae0c2d8bc498a06282905ad40", size = 224172, upload-time = "2026-07-15T18:54:41.882Z" }, - { url = "https://files.pythonhosted.org/packages/ef/28/9f14ec438149f7de557f45518f09b4a7917b795cc37083aa7db482693f8c/coverage-7.15.2-cp312-cp312-win_arm64.whl", hash = "sha256:a638db90c61cd219aeee65e83a24fdaa57269a741ae0cf773309208ac862cee3", size = 223556, upload-time = "2026-07-15T18:54:43.674Z" }, - { url = "https://files.pythonhosted.org/packages/fc/d5/f8c838e6b7282976f7c918884b792df7a0c42c5bba5d99c60ad2d221d56d/coverage-7.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1121caa19159a38b5463eaae4b1e1fde81e525b15ecc5e000cd5b1a108f743a8", size = 221606, upload-time = "2026-07-15T18:54:45.448Z" }, - { url = "https://files.pythonhosted.org/packages/bf/37/97c926376364f66298cc44893b89cdf17b8bc406376497c4061ae4b8a8ff/coverage-7.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a300c6934e0989c327b9e8a1e110329da4641149f872bbe9f70168be66da76c1", size = 221982, upload-time = "2026-07-15T18:54:47.341Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/a36050a6e83c2135ee0776f452ca3948224befc6d7f26acecc082d0c106a/coverage-7.15.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2617f8799d268fabdeef42a7e89ac3a23e1deee9025427db2df970f99a89a578", size = 252972, upload-time = "2026-07-15T18:54:49.2Z" }, - { url = "https://files.pythonhosted.org/packages/31/d3/06b5f1daf95f0f15ab05bd75f26ba5f3c8b33d0bb72f3aaa3cf41d1bad3a/coverage-7.15.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7dc2950a2992cd676d35c20ae63522836deeb034f08874699d14068710af3dc1", size = 255569, upload-time = "2026-07-15T18:54:51.098Z" }, - { url = "https://files.pythonhosted.org/packages/81/1c/9afb3f8de2b8d36960391c48559a2e3ff96594b58099f115921549ea8d0d/coverage-7.15.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e36686f7a442185db2400b3df171aac520869faf9deb59df687d28659eda2a6", size = 256806, upload-time = "2026-07-15T18:54:53.145Z" }, - { url = "https://files.pythonhosted.org/packages/64/d8/b989f96061a5e32d82fddd1b1b9ff48a7c8f8ae7606f0e80fd9de54b1e33/coverage-7.15.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d29ca7bd67af6e12e74632d65f026eabc1364da5c254494cd914446a28a3ef7", size = 258936, upload-time = "2026-07-15T18:54:55.015Z" }, - { url = "https://files.pythonhosted.org/packages/b8/fa/f99771f5110457c7b511c1935ca49ddf288218eaa84322e028b9334146ae/coverage-7.15.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:db9c8438057e5b0f6a22a0af99c0c1d26b57fbbdbd1be5861ddb8f897fcc3a2d", size = 253178, upload-time = "2026-07-15T18:54:57.527Z" }, - { url = "https://files.pythonhosted.org/packages/f6/96/c098a6044d119c751ceede7be91035fa8310170ec24a6523aff72f0a5793/coverage-7.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:63022c4c8dec1d0342f05c3ede99842fe3d007689acc45e86f123a1746e4a026", size = 254934, upload-time = "2026-07-15T18:54:59.41Z" }, - { url = "https://files.pythonhosted.org/packages/b2/a2/1457b3a7a50c8d77500103b97a046db863e2f59a1cf6d2f814595f349885/coverage-7.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6c0be82b4d4aa5b2704e08518e2252f3e3d110164bcca826816801052e48a7aa", size = 252898, upload-time = "2026-07-15T18:55:01.338Z" }, - { url = "https://files.pythonhosted.org/packages/6c/0e/76958874c471ecfcdde0d2b2747bb2c61bdbf34a40636f4ce9db9923e643/coverage-7.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4510fb9cdf6bb02dfa6af0be4a534b8102d086e22e4a33f8836df663da3d660d", size = 257056, upload-time = "2026-07-15T18:55:03.243Z" }, - { url = "https://files.pythonhosted.org/packages/7c/7c/3d7c4e3bf58baa40327dc7edc2272b17cf02299366d52763db1b0ca1556a/coverage-7.15.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:42ec3d989421b174a2ab607c1539f24127ad362757b7f1c0c0d7a2993f7eb37b", size = 252718, upload-time = "2026-07-15T18:55:05.029Z" }, - { url = "https://files.pythonhosted.org/packages/c8/b8/1cecffed9ce14fb25be9ba42d37b6bb61485c9a3ddd43cd3dde36b6087d8/coverage-7.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8f91bce78e32343af184c3b7fa28fcf5a9e2641f4b6623d392038f804939188", size = 254490, upload-time = "2026-07-15T18:55:06.889Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2c/42984561bc7f4c045dca67516a0c50ee5ef8d84352dbeb5559dc86c4823e/coverage-7.15.2-cp313-cp313-win32.whl", hash = "sha256:434e68d531858205895eb0d74b73d20b84260de426387d53c422a5acda2cf050", size = 223647, upload-time = "2026-07-15T18:55:08.941Z" }, - { url = "https://files.pythonhosted.org/packages/41/9f/39c7c9245efc583beddf89a87683574e663ed93637f3afb6cd7b88405676/coverage-7.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:26c3b04a6377fd7c09800921fa934e3a17c0020439cd59df73e73ae1d4b6a78c", size = 224190, upload-time = "2026-07-15T18:55:10.789Z" }, - { url = "https://files.pythonhosted.org/packages/c7/de/3a2883cf8a213659280ef4b403059e17a9acaeb7fc7fd4105e1226ff2e6d/coverage-7.15.2-cp313-cp313-win_arm64.whl", hash = "sha256:3ed010aa1b69cda8e827aabfca9866216c980e2dca82ab9a78c5f83689964c8b", size = 223583, upload-time = "2026-07-15T18:55:12.678Z" }, - { url = "https://files.pythonhosted.org/packages/81/5f/aed265fd7a3551a394f36dfe41868aee709b7f95db4052205b4ad1563ac3/coverage-7.15.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:40f633c5c5fc783732f6312280122e859538fa24461235597c13d803ea9a108a", size = 221650, upload-time = "2026-07-15T18:55:14.527Z" }, - { url = "https://files.pythonhosted.org/packages/6b/2c/222ba12a545189017120f8eddfc1a0bd4616b47d5d4a8d99421edb2fe4c6/coverage-7.15.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:075560438765b7a2ef43bf7aa7758661b53d889df47f062a31bda6c1ade553a2", size = 221988, upload-time = "2026-07-15T18:55:16.674Z" }, - { url = "https://files.pythonhosted.org/packages/aa/38/304b5877ab46e6c290b4292cfcf3fe28245f0e5597cad7f6acc91fc7e0a4/coverage-7.15.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:25fd15dd40a0a2c51a500d664ca29053c09c3259d998407bf982b6e114696138", size = 253029, upload-time = "2026-07-15T18:55:18.856Z" }, - { url = "https://files.pythonhosted.org/packages/6c/58/821b533b8db9e44cf1d8a97bd525149ced40dde1d0093da02cb78e715244/coverage-7.15.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b9a6367e4aff723e8ee8190836836124284e8fcd4265e307c844010cfa074f3f", size = 255536, upload-time = "2026-07-15T18:55:21.027Z" }, - { url = "https://files.pythonhosted.org/packages/f1/f2/7aa06604c389d32ea7f0a6a988359a7eafc3cd3f8e7bc2e88cd2fdf0b877/coverage-7.15.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9854ca62c152874b2060772503535be2e8f53f70b8aaa7686b094888d872f984", size = 256881, upload-time = "2026-07-15T18:55:23.125Z" }, - { url = "https://files.pythonhosted.org/packages/a2/4f/1ef342339c7916d0096bc5888cc0f653882cc7bc8f897d5cb89143287c9b/coverage-7.15.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:913b6c56e110da40e035bbd168353bf7aaa2544a5eaccea5d98a4629aac156c7", size = 259196, upload-time = "2026-07-15T18:55:25.099Z" }, - { url = "https://files.pythonhosted.org/packages/fe/f4/7ed055d7a9c5ec13b161773a115a5ccc6b0081d568c31fad830806306cc7/coverage-7.15.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aaccad4129d735a8a4d526f26929894c9a4e8ef7034566f210b176749d6906e3", size = 253036, upload-time = "2026-07-15T18:55:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/14/79/ea82cca18c242a3a38b6c017da39726aa62dcb64aa635abf79b92009975c/coverage-7.15.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a164b50081fc7357331c4024ef4d17b78ba325f8380d05f5a69599a7e05257ee", size = 254887, upload-time = "2026-07-15T18:55:29.084Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ba/a136db3c0d9562b00e10b72540dbf3a33cd3bc5b95060c9308e247494623/coverage-7.15.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bfd341ccf78128e72c094bc70cc25b3ef309c33c7c2c66ba3ed4309549e02de1", size = 252852, upload-time = "2026-07-15T18:55:31.184Z" }, - { url = "https://files.pythonhosted.org/packages/17/17/ea334246b16b7d059953fad6fdefa11e33c68efbd3fe37b1098120a1fac2/coverage-7.15.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1473b3ba8e7ee0f076117b1a72c23f579a2b9e2bb742f48a8d86ea27ca93f91a", size = 257128, upload-time = "2026-07-15T18:55:33.163Z" }, - { url = "https://files.pythonhosted.org/packages/ed/c3/074fb66d46d607855f710876b117cbda562c5ab08363528e78820449f937/coverage-7.15.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:17c432b5f73ad52ef46fb06019f6fa7c66ce381961cf0f7dfd1d3a4bd3a98145", size = 252668, upload-time = "2026-07-15T18:55:35.063Z" }, - { url = "https://files.pythonhosted.org/packages/e1/c1/f620850ada9b36435921c9a3a8057013422b1d964eb4bf37fe138724d192/coverage-7.15.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:77f0ef5011df53a4bd1b35211ab122287f8d9b8d7aa1c4553e5c2deb24b1d446", size = 254325, upload-time = "2026-07-15T18:55:37.125Z" }, - { url = "https://files.pythonhosted.org/packages/cc/31/a729ca3689404493af82ef8e6ff70bd88bdda8da89aeef6ca9b387aeb2b4/coverage-7.15.2-cp314-cp314-win32.whl", hash = "sha256:f653e5d7248c1191ec988a85c72edeab46c3ff44f90639a4ed4874ec0be90243", size = 223844, upload-time = "2026-07-15T18:55:39.078Z" }, - { url = "https://files.pythonhosted.org/packages/c6/83/5d809dc808fb1698c671f3e372259bb9158e64b7ea526fc6ab7de64de9fe/coverage-7.15.2-cp314-cp314-win_amd64.whl", hash = "sha256:9911f31aad8906abe337c271343485cf20df5e70df5d2f57f9f136e7b55f26bc", size = 224331, upload-time = "2026-07-15T18:55:41.346Z" }, - { url = "https://files.pythonhosted.org/packages/16/4e/35e488548e952795829e129995c4174df33bf432b591d1aa42c8d9e4e7ad/coverage-7.15.2-cp314-cp314-win_arm64.whl", hash = "sha256:e38def96ad59853824c97953fdcd2c320a84ba3ce99b417db78af8bb6c3db635", size = 223760, upload-time = "2026-07-15T18:55:43.518Z" }, - { url = "https://files.pythonhosted.org/packages/ed/49/dd2c86cd6374038f6e415fb5bfb86db5218553209c081384a020369dee79/coverage-7.15.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:835ec4e20b45f0a7f63ed78f94065aca00de033403df8377bfe8b9c6abc0a7be", size = 222384, upload-time = "2026-07-15T18:55:45.569Z" }, - { url = "https://files.pythonhosted.org/packages/d3/74/173ff17a1c0808e5a438f549f6f145d5ac7528f2791310b63523e3200ac7/coverage-7.15.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7466cc7ab6dc0db871d264bf99e8779f0917ee63d40730af0552f71535a6e072", size = 222647, upload-time = "2026-07-15T18:55:47.544Z" }, - { url = "https://files.pythonhosted.org/packages/84/f8/b8cba872162356fb44ac79c10309d987206a4461e32072fc29228dad7331/coverage-7.15.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e370c12133095ff18432de8c044962be85a5a96d90c6fcbce8e17e76236d2328", size = 264013, upload-time = "2026-07-15T18:55:49.768Z" }, - { url = "https://files.pythonhosted.org/packages/ee/67/a807a7586d0b8cae485308ddd55756f0806c92f8e0b411bacbf23c48edf3/coverage-7.15.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fe41909c9515c3bfdb5f02c4d1f857dba322d9a9a1178069b91eea77889df63a", size = 266135, upload-time = "2026-07-15T18:55:51.941Z" }, - { url = "https://files.pythonhosted.org/packages/ce/67/cd78771dc985f7e4ebdcc82b1a96d9a932af9e806f01f2f91a89f4c72e80/coverage-7.15.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aa28cfb6488e5453b5b762d65f73aa586380f6693a04d58078ce228a29b06c0", size = 268555, upload-time = "2026-07-15T18:55:54.065Z" }, - { url = "https://files.pythonhosted.org/packages/18/3e/10134cf81275188c58568f324fc74aedff32c63ca4d5bbc513a91944a6f0/coverage-7.15.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcc0aae933921d03096f53b0b03eeb702129fd406dee59f08d2efacc68681fa5", size = 269674, upload-time = "2026-07-15T18:55:56.066Z" }, - { url = "https://files.pythonhosted.org/packages/75/4a/771b77de446cba985dc414bbc5844bd21604da05dbc044286df8318a48a7/coverage-7.15.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7c63387e21ab21f512c69c9756a8c7dadd322c7275edb064064433c9a09c3743", size = 263101, upload-time = "2026-07-15T18:55:58.107Z" }, - { url = "https://files.pythonhosted.org/packages/5f/b5/70a7011da15f4071943361183aefa27847f3e3aec4fd335f1cb3d3a622b1/coverage-7.15.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e55510bc98ae943cece9e667a6c0fe94c6a92913720dea34243657a17993d0c", size = 266007, upload-time = "2026-07-15T18:56:00.468Z" }, - { url = "https://files.pythonhosted.org/packages/b4/0d/f9547e804ce7ad49646ffeffac26699510efbe6c0f751b66fdc960c4e825/coverage-7.15.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2ff08701be2d1556fc78b326c80a3e8042da09352ecb3819105f8e386c8a3071", size = 263611, upload-time = "2026-07-15T18:56:02.615Z" }, - { url = "https://files.pythonhosted.org/packages/ac/59/f576a396659c0efd351f5c1544f67c3560e89c7761cabf7f65e412beeda5/coverage-7.15.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:38c9518b7103826c403a461544e3c2e77151e8676d06eaed85911a97e962584a", size = 267344, upload-time = "2026-07-15T18:56:04.622Z" }, - { url = "https://files.pythonhosted.org/packages/7c/5d/c2e4fce3579c0cb635024293f1a32bbe26df101b3e3a69f22243d1352b6c/coverage-7.15.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:dee88b1ed88587abd8c0269a1fc1f4cc77f7750d1dfde2869e2a123af420e67d", size = 262456, upload-time = "2026-07-15T18:56:06.641Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/956287d69436b66094bc4b57ac2da71e43bfd2a5524e958900b9f582fcf8/coverage-7.15.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fbeeeecea279727f8ac16c8e1133ddfeee793e985c86ae343d6a5ce744eef8c", size = 264771, upload-time = "2026-07-15T18:56:08.795Z" }, - { url = "https://files.pythonhosted.org/packages/2c/5a/6f979530c2734c575de77cf58f5f28d51f7123a94b5030fd9156fe5f363c/coverage-7.15.2-cp314-cp314t-win32.whl", hash = "sha256:cb0fddaa6884be6aae36ced9544b5e90f7d5f03845a2853bf47a14953a4e8688", size = 224151, upload-time = "2026-07-15T18:56:10.856Z" }, - { url = "https://files.pythonhosted.org/packages/54/7e/27f6b2a74d484742f4017553e710b01e396b23d809df3e95ca0bb9a2824b/coverage-7.15.2-cp314-cp314t-win_amd64.whl", hash = "sha256:77f091ea3a9cc611cd29f433565476bc1936c084ac8eee00ea0e7e70c27e4199", size = 224981, upload-time = "2026-07-15T18:56:12.928Z" }, - { url = "https://files.pythonhosted.org/packages/b1/48/284863423aa474240f6842bd00d680da22f4e6ea2e466618ef7c9c9e69a9/coverage-7.15.2-cp314-cp314t-win_arm64.whl", hash = "sha256:6fc448c377d6eeb00a47c673494bd9bae29280ca53987e1869e67ebedfe20658", size = 224294, upload-time = "2026-07-15T18:56:15.156Z" }, - { url = "https://files.pythonhosted.org/packages/ec/82/32e3bd191d498e64f6f911ad55d14006a0861e54869d2d32452326399e65/coverage-7.15.2-py3-none-any.whl", hash = "sha256:eb6bcae8d1a9d305351ecb108232441d11c5cfe9de840a04388ba5d2db8d735c", size = 213375, upload-time = "2026-07-15T18:56:17.305Z" }, +version = "7.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/2d/c738872f477f5687152acae68635790387425d407ae37dd3d3a8a6692307/coverage-7.16.1.tar.gz", hash = "sha256:f83981779bcf9dfa06fa0a8d4cb43e0faec1706328ce07aa3e7b665b4ac0f210", size = 969651, upload-time = "2026-09-13T19:12:21.422Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/62/a8b4dd53308a4b1571e6bdd77ee562c9b1c1742db9886c0aef2f69463067/coverage-7.16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f12a9e27ca7b65e40a8475d27899b2d45064d9020e6a89148939e01987b5853", size = 223178, upload-time = "2026-09-13T19:08:21.805Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7a/b9325b8d486a5c05fd4a9eb1cd9c9f697c361ddeda0e73567d5c2d8959f6/coverage-7.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f590d46c30d9e4c1fda3efefe5443f4c2f6a4192c5ca2ba403653e9ebadf097", size = 223701, upload-time = "2026-09-13T19:08:23.391Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ee/3ab3ac6e9e7165a623695b73a83d1bfbdf5069681a68a012cb5abb096060/coverage-7.16.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3df82f0a3cef4e1bcfc799436056f0b978dda319d0bfd4460c6e479b2802d98a", size = 250434, upload-time = "2026-09-13T19:08:24.948Z" }, + { url = "https://files.pythonhosted.org/packages/b6/a9/31ffc231e9879876f611cf1ac7622cf092d76762c07ca64dce47b29a200b/coverage-7.16.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb462d59146656e278d1e8ed913ce374d0ba68a4e081acde1867f6d3377fc881", size = 252264, upload-time = "2026-09-13T19:08:26.734Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f4/4fb4f6b16de07dbae3d3a111ae28d32ad657ce6ff4d364c49c10962daad5/coverage-7.16.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7db888dd0a1df1a653cae7f99d4047430d2187a3626eda51bc847b0fd6b9b43", size = 254127, upload-time = "2026-09-13T19:08:28.254Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3d/048e88eb610f44b7542dac10fa45bb2ffad5fbfcdab0f03289a843da934b/coverage-7.16.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:38a7e16f061504ac2b45370bf5bf97e8250d8d3f25e37385bae884978166554b", size = 256043, upload-time = "2026-09-13T19:08:30.019Z" }, + { url = "https://files.pythonhosted.org/packages/97/59/d27b113c80b04c7fc64c69457132648e1d287b83a1de41189a504b50b52b/coverage-7.16.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2b26b55b18e1a53e1a159dd743728c4ddbbef28ba19000a91aaff5ce023197ec", size = 251092, upload-time = "2026-09-13T19:08:31.57Z" }, + { url = "https://files.pythonhosted.org/packages/45/42/b7eafaceff08dc1dcbfc924fa9233031fd00c8b8287cc4a1a0dcdedcb0f9/coverage-7.16.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fdb2f528b50953e29d22033b3256c396a700193c6e45b2490222ef9c333cbbf9", size = 252170, upload-time = "2026-09-13T19:08:33.191Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8f/57dcc5360aa6d8d24370c12fe855f6ebf5fbf2718c154fb9fdec7161de07/coverage-7.16.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3284754371dc78592aa3ae4d661d30ee20e02b2b6b0de3590a181a936d0d3b38", size = 250173, upload-time = "2026-09-13T19:08:34.75Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/379a8c7ac0f3063769dc43fd2475e9fc9b2722cb88eabe71f4d862660c93/coverage-7.16.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:802d1246c540e07486d4ee1adfa19a797e4b33529ffc371dc140644e8f27da0a", size = 253986, upload-time = "2026-09-13T19:08:36.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/25/70218d2a6077730843b75ee2525fa64a750283d71cc4c063dc0b75ba6979/coverage-7.16.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6fc735d6fe6d57f803e7ba021be4dde48e43e6aff94e6954350555d5332b0594", size = 250444, upload-time = "2026-09-13T19:08:38.434Z" }, + { url = "https://files.pythonhosted.org/packages/58/ac/6c41c441baa6c8a1fed5615e4e1e7d0ca649b33b472ee28591a92d70a1ff/coverage-7.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed5ade1bb18f62edace1bd198c66f9d4c75a8385d5fd24e87d917ea1a5958773", size = 251046, upload-time = "2026-09-13T19:08:40.133Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/01166d6f8aa42acd148b4c2c88173d60eefdd0270ea2bcbba79be35bc193/coverage-7.16.1-cp310-cp310-win32.whl", hash = "sha256:0c309096926b119543dc16438a11ef4c80783d2f4e59ff94f7f462651a944cdc", size = 225242, upload-time = "2026-09-13T19:08:41.672Z" }, + { url = "https://files.pythonhosted.org/packages/d2/28/a76060478919becf0fbea2df2053a6e1a7195f11edf8dfd51c58c1636b43/coverage-7.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:7562f8067ed9360e8b9739e5703403a7686dd1b36bf0f89fc538047c54cdea90", size = 225868, upload-time = "2026-09-13T19:08:43.22Z" }, + { url = "https://files.pythonhosted.org/packages/af/3a/d09495dfd5191b5593852bbe2f037afae768157443378d066d9ecea69a49/coverage-7.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72e013665e25cf9d44779f01f340af26319756f9a76822b7c94ce6b1d93813da", size = 223307, upload-time = "2026-09-13T19:08:44.914Z" }, + { url = "https://files.pythonhosted.org/packages/a3/34/310196a80258e28ebf6e5aa814a5a6ffbb18c03cf3c0c0c04191ed893e88/coverage-7.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb05c0ff98b56ba6969adf35556bc43bcb8d094df8bc9cb403acff53460c4e07", size = 223817, upload-time = "2026-09-13T19:08:46.738Z" }, + { url = "https://files.pythonhosted.org/packages/73/29/ed0fda1fcd440cdfc07e72a07f3c9c3b43f65a6b3d53bff2cba9b9de50e8/coverage-7.16.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0d0ececb32090e3fbb03e0d352b973a0485879b4de6c58daf47227b9988b99e5", size = 254222, upload-time = "2026-09-13T19:08:48.358Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4e/5e2507fbd71ec1047620978f39568b0d2ed6c4468d08495a0c24f5677f65/coverage-7.16.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f0ba3892d81aacf36996c52f16bca04e39af31a6c5de930b7688ab617f4a6475", size = 256134, upload-time = "2026-09-13T19:08:49.926Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b1/a9f97846554bc240473656f9c3874591105f29c08eccf4282daadc6bc281/coverage-7.16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6410b75fe07d5271eaa95fc24bd0a9177ed588d9d1c10c0cf67829adb8f0567", size = 258240, upload-time = "2026-09-13T19:08:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c3/2b1ab208d06719394851cdd7dc322157870a93b178410b1bda6cac7755f9/coverage-7.16.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1039cb2de093225d597109342ce1675626bd127565e80b3044f4eca07c15b2e", size = 260202, upload-time = "2026-09-13T19:08:53.204Z" }, + { url = "https://files.pythonhosted.org/packages/af/14/ff4db31d6e3126d5b72aab1e868d35ec94e1b71dee46f5c3b54cb1b2438e/coverage-7.16.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cf047bc39fde5425be2628666d0f435ed8817859111c3aacc84b32d858069f5d", size = 254305, upload-time = "2026-09-13T19:08:54.833Z" }, + { url = "https://files.pythonhosted.org/packages/ce/27/c28faa4818f61c49ca3bfb4a77e1c191e79a40447504b89af0bd859cd6fc/coverage-7.16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c05913d0d5badf7ac83200f35dcf9514cce5df16a7cc89e7d1d7fff0461813b", size = 255935, upload-time = "2026-09-13T19:08:56.453Z" }, + { url = "https://files.pythonhosted.org/packages/46/5a/42e64e5b716048cae33e2e15f8c6fe04a927467056c533b8e88900da895e/coverage-7.16.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4027bf6d7bc0a16df058ce913b69f10c5687f8e1ca668f08caa659ce101744bf", size = 253995, upload-time = "2026-09-13T19:08:58.159Z" }, + { url = "https://files.pythonhosted.org/packages/84/e5/860287acd5a1e29acd337f302b476b54148203590091b1a1555b2e914b50/coverage-7.16.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4f48b345f831eaf4402ab6333c2dc3e2e2b5bc7b9c1b8fe12680dee3f0538f01", size = 257767, upload-time = "2026-09-13T19:08:59.958Z" }, + { url = "https://files.pythonhosted.org/packages/a5/c5/4b68006da567b4b413352f891776c35776b3557a0479a28187ab57c21659/coverage-7.16.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8643baeb590726c558b2faed6cd59b0917480f9367fcc692026f1a86d824fd08", size = 253715, upload-time = "2026-09-13T19:09:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0e/b2d0c47cfbf11770e197f1d0f11a92864eb29fd7eaca45bc9915573d9725/coverage-7.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d06dcc420b570bf683cdb647cc8fe62b672d9e429ef711c3cbbb7a6880ca1572", size = 254624, upload-time = "2026-09-13T19:09:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/2e/14/3bab8821b2b942155578fc34e88e21b0670d922f039ab23651f6035ba7f7/coverage-7.16.1-cp311-cp311-win32.whl", hash = "sha256:946f58aa59b08bcd6afcc6a7bd0ff54ed5eee844f32ad69fe6814836d15856a2", size = 225404, upload-time = "2026-09-13T19:09:05.174Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ce/4f4ce667a97d1c538b46a79b89161395ad2beffc248b6c782afc9f521927/coverage-7.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:684c7ee9b4c04358fe6ac8b517ab51ec35fcd79d08ff0f105dd8bcd96885bbb7", size = 225879, upload-time = "2026-09-13T19:09:06.81Z" }, + { url = "https://files.pythonhosted.org/packages/26/17/f3dce5e47351ab34522dd037fd64b111742958e24861bdd2820971bc1a26/coverage-7.16.1-cp311-cp311-win_arm64.whl", hash = "sha256:1b24f79e25bcf6c73931aeca7a3dfc7595c0cb5e9364aba3fdf387a3de4b1c22", size = 225428, upload-time = "2026-09-13T19:09:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/1a/f7/7cd4c9f2a3b7574414222ec425d5eee21cc690d867a013315e3be8ba185c/coverage-7.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b7f2c26ce6ce0b1e0ca0d5fae96ea510e3a2e78b7207f06e76b7f2c87fa3d0af", size = 223475, upload-time = "2026-09-13T19:09:10.145Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f2/9ac65f9cedd43f91e2d3657c11f13aef82aebae89b2243dc9e44fe58a740/coverage-7.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070acb9da788dff743a4d36fc015feee12d68f0349959017542017c79f59c21c", size = 223845, upload-time = "2026-09-13T19:09:11.988Z" }, + { url = "https://files.pythonhosted.org/packages/62/4d/f13db452d4367fe1122abfd98ae330596f65a3b40498f8e1a5811f68f123/coverage-7.16.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e366587b370bc9b8b51b7b7272c610c56db5d5b4795b9e4a29d28ff2f440f809", size = 255341, upload-time = "2026-09-13T19:09:13.708Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6b/85ed86e82835a96ddfbe7705c387c28ce1cbbecd1b6d606f5ddfeeb712df/coverage-7.16.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e82e10b9d290f60b63459cfb245a841aec347603997206296b93881463a93dcf", size = 258078, upload-time = "2026-09-13T19:09:15.368Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d2/f66945853d850b9c05f4e012e37396f1f31d0cd40d062394b229c22e7b56/coverage-7.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d73bb1f85c4150ac208fb0755beb04b2e44897bad81414de9380f98dd74729f", size = 259191, upload-time = "2026-09-13T19:09:17.046Z" }, + { url = "https://files.pythonhosted.org/packages/77/a1/7b907abe62461f289035c7ac60ab3e6334efb8c425151aac4abfa0c97820/coverage-7.16.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3397b9032553d281ad6a9253b12675b65e0cc8cd7a3b0633cf48872c9eb13360", size = 261452, upload-time = "2026-09-13T19:09:18.756Z" }, + { url = "https://files.pythonhosted.org/packages/51/e6/e26f4d6b1069a2a2fee3238a132f85c5b4c1dc25aebd88e015451ff0bd68/coverage-7.16.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:77890395cf37026a5907d3ad32376aa51f41c0f163b7477fdbd4f94966cc1d08", size = 255698, upload-time = "2026-09-13T19:09:20.786Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ec/99db7450e813050ebce300e31bbd4f997c76a8c6e3a6d168c5dffc104109/coverage-7.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b0944dc3bee3091039bf970d73caaf930c906013128a421bdc132e797494d941", size = 257111, upload-time = "2026-09-13T19:09:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/2e/9d/500df9d3cd8c541ac84b5e0bcab00646be75654e05aa34e8410ec851282d/coverage-7.16.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b89d22a89d5bc05dd95b64e08295b8394aa96dc88e08f8ba210c9ebfebbe0489", size = 255258, upload-time = "2026-09-13T19:09:24.429Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/53318d96da332bb4946f8ac646fa19fd37fecbd0c49144735c716ac69bf0/coverage-7.16.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:550a2a1faf7559f13d5344f12d1eb886ad87955155d7dfab2a3fe5c8ec8fe776", size = 259326, upload-time = "2026-09-13T19:09:26.32Z" }, + { url = "https://files.pythonhosted.org/packages/c5/ce/abc0462b2e6ae96ae22197d2bc30fe33b6b4e52937e782745436ceb2a761/coverage-7.16.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:55eb268e5b81aefac759766c9162625b06c1bedb7b77d936225bafc4f038a6f6", size = 254827, upload-time = "2026-09-13T19:09:28.191Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e1/0a04eedaaf19196b51f0180968134228c7646e469ed29914e48690a7cf3e/coverage-7.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:65a8fc80898c9ce59f04349fe8b4849b1f9787f14e52ead990e5f849ff4727a0", size = 256698, upload-time = "2026-09-13T19:09:29.922Z" }, + { url = "https://files.pythonhosted.org/packages/de/1d/d441a55cf22ce9d8e9e34814806c47441ab844bd534e0f4b64e1c6ae8bd1/coverage-7.16.1-cp312-cp312-win32.whl", hash = "sha256:528a61be40977c340cf201d23b69bd6a6bab507da60e9dbda85f8b30e935d70d", size = 225541, upload-time = "2026-09-13T19:09:31.752Z" }, + { url = "https://files.pythonhosted.org/packages/73/27/ec3d032375735dd331477caa051419678079ff90fcb53d0284a6c2bfb757/coverage-7.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:d0f02c633630e2b74522108ee95a84ad6e1204a8016a6cca5297f335ea27147e", size = 226075, upload-time = "2026-09-13T19:09:33.556Z" }, + { url = "https://files.pythonhosted.org/packages/94/00/90e9f5c4434878494306b9c0ee8068ebbd829483737d8cefccc58884d728/coverage-7.16.1-cp312-cp312-win_arm64.whl", hash = "sha256:2959978f9d1d20a2c0c15d0a68baaeccf615ac1aa214cf4a05a10d6f568926c8", size = 225461, upload-time = "2026-09-13T19:09:35.48Z" }, + { url = "https://files.pythonhosted.org/packages/aa/74/c08c0c4dc9fa6bcd1d90728a63660aa1b17b488a806948598456c48f75d1/coverage-7.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ee5465db6e9152a7d09f3215309326878c6aa3ac509195a369f9d264ff4bfbd9", size = 223501, upload-time = "2026-09-13T19:09:37.276Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c8/784986d326663285258a8e39835c46fb730cc85284f0dbcd82078586dd22/coverage-7.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b8256f8b525ba233d2e4cdcdce0d6673c66fc9bf70df1fd5e67c54a74e2d245", size = 223876, upload-time = "2026-09-13T19:09:39.385Z" }, + { url = "https://files.pythonhosted.org/packages/15/76/73fb792928872bbb07e553f920ff55c65ee962c469265feb5d1d4ae5f97a/coverage-7.16.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d57cc400275b9a2892e905fc893f732b21ddb95271bf96406c88e2f6367848b5", size = 254863, upload-time = "2026-09-13T19:09:41.326Z" }, + { url = "https://files.pythonhosted.org/packages/ca/8d/1fd78899513244b065ccecdd1cfc6aa8b8f1bdee796d8c4f2aa8e8e5397d/coverage-7.16.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b3fd0f3435ebb7a7183b32a6062a8b755f08242ced1f3f22761d30b56b3c2a5", size = 257460, upload-time = "2026-09-13T19:09:43.086Z" }, + { url = "https://files.pythonhosted.org/packages/47/1c/b23ddfcb7ef9bd7b3fdb7be9a5dccf9925ae88e556df7aa5b655283c78f2/coverage-7.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e5eb1762e7eb5fad34ef913e8107c7788a66f19d328e598ce95bf7217f9e5c8f", size = 258697, upload-time = "2026-09-13T19:09:45.161Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c9/19d0c6ca35778a7e9415c30c46a0c64c9d4374219d004a35563132296896/coverage-7.16.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:46cd3a73e9140410de62cceb66214bce0e08fb3922b9176fbfc1522fec151b41", size = 260827, upload-time = "2026-09-13T19:09:47.061Z" }, + { url = "https://files.pythonhosted.org/packages/97/fc/5862f7344382c62b85df43d483e579168cc062e007f54d895dfa51fe3e7d/coverage-7.16.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d1ba5142d68dd2cb775cbd0ac8601819298152047803c8efe4eec6d7d7aa7878", size = 255038, upload-time = "2026-09-13T19:09:48.945Z" }, + { url = "https://files.pythonhosted.org/packages/2e/9f/5c26583199a68df8d15124b4590520903f8eb7cef17db293fea712bb0783/coverage-7.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c389c6f9d1d518e1249ddcb8a7f158135644ce2c508fa6cc17b680777dad5bf2", size = 256827, upload-time = "2026-09-13T19:09:50.738Z" }, + { url = "https://files.pythonhosted.org/packages/95/13/605198bff079b107336710f28a797312ab132587168600d70a290e7ecd2e/coverage-7.16.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cdc57746c7ac0ea063351b4d651c3bb4dd4fd35e64dbb8e90c10e14eb03c4080", size = 254794, upload-time = "2026-09-13T19:09:52.577Z" }, + { url = "https://files.pythonhosted.org/packages/43/b7/0bbb32dc5ccdac766a13763fdfbffd7d73fc80349a69230c46c6b71e7508/coverage-7.16.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5597180ed7670cc94c04c65347418a467d3a43d5f0cf52fcac647f5425f42037", size = 258947, upload-time = "2026-09-13T19:09:54.372Z" }, + { url = "https://files.pythonhosted.org/packages/13/bd/65c31ddd43ff4e61b63721b3dad17cca412dba6e2ce89f92abdf75734339/coverage-7.16.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a9647a0ac46255b8fef59a433a2161f03e5483f3a35e1cbd9dfe4600baff0c6b", size = 254613, upload-time = "2026-09-13T19:09:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/25/20/d278115f2ba522b3e3128c6852be265f4e0df7202b2effca4db96cf0217d/coverage-7.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e306e98186b9cd109121f3583aeb7978797ad21d948f22944c5c08845cd554d0", size = 256388, upload-time = "2026-09-13T19:09:58.095Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ca/d43aa396fb3a2f71c9411b99d926475f5acaf5c124f605c592865c80c8d5/coverage-7.16.1-cp313-cp313-win32.whl", hash = "sha256:48a78a66fcce49d7f6156524bf979c0ac633d584199717c68c6ffa949fc14e6a", size = 225550, upload-time = "2026-09-13T19:09:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/0e/30/df2f6114f6a17cffe94721bd1d298f77f86aad493717fa5bc03cb291a1a6/coverage-7.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af03247d598a353bbbbe1b925deb735276e4d845e7197c4073dc89352b236fa", size = 226091, upload-time = "2026-09-13T19:10:02.331Z" }, + { url = "https://files.pythonhosted.org/packages/ee/31/6f90d8aab72a112492bd50e3b5485b53b772b1f5fa70da0a620e723caae6/coverage-7.16.1-cp313-cp313-win_arm64.whl", hash = "sha256:166adae25b05b04c9a84135912066d9c97482115af38df1a419a38aacc6b6f5d", size = 225481, upload-time = "2026-09-13T19:10:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b4/2a7c793965bae9f067aabab793a44d7a2f3ee7fb16b01ce1976bbd4a0218/coverage-7.16.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:cc0b37fe6f5ce5f1ccc62ad4fa9b1ad201d8e9b6027fd5e0170877beee4b2d15", size = 223546, upload-time = "2026-09-13T19:10:06.019Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e2/633469076a2dbbea036cc15a268a3a5d6b2c7dd5d9a9567b2553dfc5ad61/coverage-7.16.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6618f481053b63fc6121faf8fc676bd9b7163c2a19d9e984a2e850002c28ab57", size = 223881, upload-time = "2026-09-13T19:10:08.246Z" }, + { url = "https://files.pythonhosted.org/packages/de/c3/f06150c13284569d53273b909f31222874276a595637b7852571dfeb2c18/coverage-7.16.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fa02d561eb1d8d2f8ba43ba6e3cef4c6c402a3b632a9460fa329fcadcd5df6a3", size = 254919, upload-time = "2026-09-13T19:10:10.254Z" }, + { url = "https://files.pythonhosted.org/packages/d5/40/47e25b215ae18a29010c8e29be8782a6e04d18ba6224be2bf6cebfce6427/coverage-7.16.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bc5354a124799f1f87b7637bbe6f18cd4bc66a1f37f6aa2b5db40f9adad531dc", size = 257428, upload-time = "2026-09-13T19:10:12.124Z" }, + { url = "https://files.pythonhosted.org/packages/27/4b/1e2a4267d14cbd12a8489364a9d40020233e6be836d929b363f0e77209e2/coverage-7.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34bafe9f4094315248573e6223e11af0ec1b25f9cbca43bf0e9a26a189ba2751", size = 258771, upload-time = "2026-09-13T19:10:14.031Z" }, + { url = "https://files.pythonhosted.org/packages/be/2e/9aa6146cea929fab9185bb2642ffef7f47520a6e5efe407f75f9b12f4cf0/coverage-7.16.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:29c4d3e32a3b5efa420a3dc627c7e570deb80ef997def52c7686a474f5edc7ab", size = 261086, upload-time = "2026-09-13T19:10:16.213Z" }, + { url = "https://files.pythonhosted.org/packages/13/3c/f9ad8bcd4fb3d21c9d20a16d6d6c6f999eee8f4498ed7659a3dbd2f4b74a/coverage-7.16.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2066c447fdd0bca39a9633a082d8ce67bf9a539a203b85059a364a405dc9fe9", size = 254895, upload-time = "2026-09-13T19:10:18.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d1/47eda9fd1eaeea39fa7b5b13a63b2bed92ab901841fb120b3f9f5e1dc30c/coverage-7.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd8ac10cd2458b3c6343aac082fb9bd0e3fa806cb2c4975f2280153474b88412", size = 256783, upload-time = "2026-09-13T19:10:20.778Z" }, + { url = "https://files.pythonhosted.org/packages/38/c3/565edf044877cb8cd3373c56885347ffc38f0edfd1f1679a487b208c19a8/coverage-7.16.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d8c54ec32e5c102b9241f75d88ae26538b53662868ca491736611db448d9c7a", size = 254742, upload-time = "2026-09-13T19:10:22.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/88/87d2b2aeaba719192b2089ff1c2cf89a06cf73a6d2e9f1f145626617700c/coverage-7.16.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6dd8dda3402a01a1a8fe8b753a282466f615128574a5590a9108acd07b1f8540", size = 259016, upload-time = "2026-09-13T19:10:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1b/70813185b125768abdcf7899fec4d37edc2e5fc9b60c7045c8f4271ec757/coverage-7.16.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:79afa9726438912e5cddd1fe541815cea9763c92935f594835e4c432565b68a9", size = 254559, upload-time = "2026-09-13T19:10:26.781Z" }, + { url = "https://files.pythonhosted.org/packages/d8/fa/e7aa5af279aafda633a1ede8bfd7d6916b0c8b2082be86759e0b52e73a61/coverage-7.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3db3978211c3cead5437a80136ca0556bab8bc7828de15a762884b0598c41361", size = 256215, upload-time = "2026-09-13T19:10:28.714Z" }, + { url = "https://files.pythonhosted.org/packages/38/87/7a894fa4f8c6662d2b6a87a3436950e15b1fa56e01765c9d6634fb2cbeb8/coverage-7.16.1-cp314-cp314-win32.whl", hash = "sha256:49c39c7068a494f8eb427155f5682f44feee43f9b3107fd54b1e52465379c54b", size = 225719, upload-time = "2026-09-13T19:10:30.743Z" }, + { url = "https://files.pythonhosted.org/packages/8b/01/fa7193c8005fb85488f02b0e1cc3c05a233cf2640206dd978af447aeecbf/coverage-7.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:c510dad19552d912058e4c3e3cbec3fb155dbe8d0ce0ceb7e7dbf5c5822bae0b", size = 226208, upload-time = "2026-09-13T19:10:32.698Z" }, + { url = "https://files.pythonhosted.org/packages/da/5c/a08634c714924c3eaef811bb3576c044128aa5e7dfa86c75e52f0761849e/coverage-7.16.1-cp314-cp314-win_arm64.whl", hash = "sha256:b7d4d7e6dcaf33e85f1919f03346403bdcc27437c420a78835f3805bca0ab71f", size = 225633, upload-time = "2026-09-13T19:10:34.79Z" }, + { url = "https://files.pythonhosted.org/packages/43/df/ddb8a4c664046b1a0ee29c9c2d25b993e5dbc8fbde715df3694a64532781/coverage-7.16.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3d0a3681c12d3e0bcdea3d9414b04087828d6c1a482802d6f7f42c37ed530152", size = 224281, upload-time = "2026-09-13T19:10:36.853Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d0/9076e0c762d8afd91182e60a520fa5c92c4a334785eeb9fd6b8ef8fe7e3c/coverage-7.16.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f3b4469d3da3ecced775d1a8c9c5d9fc80f259e30b7b89f9fed0700d6035ecb", size = 224547, upload-time = "2026-09-13T19:10:39.359Z" }, + { url = "https://files.pythonhosted.org/packages/03/e5/9c59e64b6161704f35fe91549bb19b2bb355e95caf596c26a2065564807c/coverage-7.16.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c08ae35c1be2fe1ce4b4c628df5c6fc0dc9a87f8e5fe8e20238d249678984741", size = 265906, upload-time = "2026-09-13T19:10:41.434Z" }, + { url = "https://files.pythonhosted.org/packages/57/5a/13ccaffb77f766101bf6f38be9dba9e468b02cc92da4552a57877dbf1c1f/coverage-7.16.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8ee71a38c54bb2676bbe762b8b0943a79ccb1c2fd6a52054f66e63eda392f8c1", size = 268023, upload-time = "2026-09-13T19:10:43.533Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a1/05cfcf01d3c7c922832698ad46e51d3441d820ce87a943014bb5cf5710dd/coverage-7.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76491917771f179f9772efe218c5ccc65950dbdb35f4439298d8a8dfc6ec1f72", size = 270442, upload-time = "2026-09-13T19:10:45.895Z" }, + { url = "https://files.pythonhosted.org/packages/72/15/a2f1544b8e3835d7b769f7dabcc9ac0283e0b646ef3344703ff8f18d83e6/coverage-7.16.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4aa0b0a6f81fa3deb211e643f6954e78b4376b62b9c218271236cfa757664e8", size = 271565, upload-time = "2026-09-13T19:10:48.123Z" }, + { url = "https://files.pythonhosted.org/packages/df/5b/963c2993a82bd313f298d663afe03e164b96ace4d9d4c7561740a559e13d/coverage-7.16.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:756ba2d96d073c5a2a55d67fa22784763710fadbe22c41adde2d9cfa4dd78a8c", size = 264959, upload-time = "2026-09-13T19:10:50.195Z" }, + { url = "https://files.pythonhosted.org/packages/12/59/5eba06d1943735d7cd61d46d8c8a20ffe8ddd2da06b3c94366078dadeb9b/coverage-7.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:99bf9ea435cefcefd220f8687c3ddbbf78dc2de0bd11b57c3ae9fbbdf8d5561a", size = 267897, upload-time = "2026-09-13T19:10:52.252Z" }, + { url = "https://files.pythonhosted.org/packages/bd/48/af6c30f6ea431bb9b83f9070d268a9cc4fc97490abd32080164177ea999f/coverage-7.16.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:35cbc81f937fc402971df45c897d2df2bfb2014efcd990360032aa0a651635da", size = 265504, upload-time = "2026-09-13T19:10:54.432Z" }, + { url = "https://files.pythonhosted.org/packages/80/f2/6e13852a8656d05fa83284567dd5a5b1e6d89bef79fe3effca2787159eab/coverage-7.16.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:8fae08e85b334ac6ac886002b5041396a31bcf805225bbe19847627203da99e2", size = 269235, upload-time = "2026-09-13T19:10:56.563Z" }, + { url = "https://files.pythonhosted.org/packages/c2/32/b4fe465daa64ece674f83a750dfa4ba0fa3c5c74d6ef5dbb8dfce892cf0d/coverage-7.16.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:83362b64e215ef00b0ba33fcf13655ace6c9fdd144d5ad2ab59ac86c2daf166e", size = 264347, upload-time = "2026-09-13T19:10:58.634Z" }, + { url = "https://files.pythonhosted.org/packages/54/f3/88b5c0e4ca3994c6d5feb7b1bf4c9a62cee205553159184968426930a7b1/coverage-7.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:33300f2e140ccf26af3d8152e62bff71993f9310cfc63ba7a20940b0d246a0ae", size = 266660, upload-time = "2026-09-13T19:11:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/97/72/6eff5456d7ba7f1c4678af531c33f9d957cae3201bd229b056fd13a204a3/coverage-7.16.1-cp314-cp314t-win32.whl", hash = "sha256:5539304fdbb2cc144df684d35a33b81145334d23e1c2367b5a923d25107f70b2", size = 226026, upload-time = "2026-09-13T19:11:02.846Z" }, + { url = "https://files.pythonhosted.org/packages/8e/c8/6e5ae3d8d4d0f2c0078985bf4db55fafd90e8107b1bf91ee3547a13f5694/coverage-7.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:715dcb72c3280c428c3a20134b87e42c29acec9669136e899ab2de69ca86218d", size = 226862, upload-time = "2026-09-13T19:11:04.921Z" }, + { url = "https://files.pythonhosted.org/packages/be/c7/68f9f0734afc904a92b974b489545b6a15700f3b1c4bd36eae764561e661/coverage-7.16.1-cp314-cp314t-win_arm64.whl", hash = "sha256:dac8b84c03e6029d272b8249c77018db83de59ca009a9adef7c144b4a62ee5e6", size = 226171, upload-time = "2026-09-13T19:11:06.969Z" }, + { url = "https://files.pythonhosted.org/packages/ae/16/e11addf5322d98e86307da9e00c94644b97cb72c534c74cda89705bebeef/coverage-7.16.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:a337dc2d54c74430cd2febb8ee04f7c508ba8b3b412bf0463f077a66cfc73743", size = 223544, upload-time = "2026-09-13T19:11:09.108Z" }, + { url = "https://files.pythonhosted.org/packages/92/d9/7ccd6484f615961d94b09c75904f87d86375109596069ae3a495a205dbbe/coverage-7.16.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:3acd1d78397dead78dd1b011b5fc19cc823c190349acd549e63856dff649c80e", size = 223882, upload-time = "2026-09-13T19:11:11.132Z" }, + { url = "https://files.pythonhosted.org/packages/59/37/2fd78152a557df4a7e4ad78d6851ede90c211838d526e4916c6016f45144/coverage-7.16.1-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73a32694603a34ad01d7e51a481a4023410d8099e1d0757e067945695c10f0ae", size = 254987, upload-time = "2026-09-13T19:11:13.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4a/58e2f9b8b13cc422aa7f474a498945ec7f446ef473b5b6bae18d2981f2a9/coverage-7.16.1-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fbbe8265736659a6be2e6042b6a35be13545d14b243cc1d7ecf65f90d788a370", size = 257902, upload-time = "2026-09-13T19:11:16.025Z" }, + { url = "https://files.pythonhosted.org/packages/3c/74/63f8f6a67c03b86455c726be273b2aa5b57fd1122f22350d141bbb142e91/coverage-7.16.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b0359eb4c62f9993e176bc8f50450fc736a6b90dbcc05bb8584e948812699ae", size = 259522, upload-time = "2026-09-13T19:11:18.206Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3b/1f2261da7483e345fe55de11e41ffc16a543511e37c0912134c0dccc4f6c/coverage-7.16.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:da506e669a8a851b59e122b4b219ea70996a6296f44f3a9348a852526ff961de", size = 261723, upload-time = "2026-09-13T19:11:20.628Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8a/7eb1a361e044b7293f49c921a974b532627ed37f3bef5e7e9f58bcd0d5a2/coverage-7.16.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:64a2a5985d81810ed605ff0dc4ccd6555efcb5700353825532a9a0aea65826e1", size = 255462, upload-time = "2026-09-13T19:11:22.733Z" }, + { url = "https://files.pythonhosted.org/packages/67/66/6d94f7ea87e99c519def5cfa5d4a1ab20247d6b403eb6e6b5b63d6aa5985/coverage-7.16.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:66d70132b69b861805dc1ca46cdd733e54c416890e8f1371d2fd103f70b59c9c", size = 257617, upload-time = "2026-09-13T19:11:24.933Z" }, + { url = "https://files.pythonhosted.org/packages/3d/52/c3de0a3868589a1463a4f1cb0222eca0e5fa9f91da865ccf20d2e19ec19c/coverage-7.16.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:db651a9cf325a542bc2b7b8cc8f1b2bdc6492739bae3103731b2f1c85b96cff6", size = 255495, upload-time = "2026-09-13T19:11:27.158Z" }, + { url = "https://files.pythonhosted.org/packages/9e/a3/ea10e75f20fc1e7be10b166a494826a965d19b1dc9c8a81c511a01153311/coverage-7.16.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:4184e78a4465dcda359fb403172b8951dd220929cb0984c02fabca1742fff06f", size = 259728, upload-time = "2026-09-13T19:11:29.33Z" }, + { url = "https://files.pythonhosted.org/packages/0e/96/9d8020d97de46f0390739beda196322586cdd87e1fc357223e6a28bc4135/coverage-7.16.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:bc53c3f3adaa939b7a063533ffe0ae1259e7073393c618043a99a6970a87e3df", size = 254904, upload-time = "2026-09-13T19:11:31.86Z" }, + { url = "https://files.pythonhosted.org/packages/5b/21/2ff8867d4560f4f639a82d8fcf13c27eea88a96193daba096027c48bb929/coverage-7.16.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:b44308854ef210b9b78df9cdfd4e159513382a859f5ef8464306d14a54c2a040", size = 256828, upload-time = "2026-09-13T19:11:34.078Z" }, + { url = "https://files.pythonhosted.org/packages/6a/4b/feacad51cb5163e3baa13281f8a3098f15d7934cc1f28cfe656557eb4e46/coverage-7.16.1-cp315-cp315-win32.whl", hash = "sha256:dccc142614d3419ed71857deb43f1d757829a4c7fce9994464b71e7e38309827", size = 225722, upload-time = "2026-09-13T19:11:36.314Z" }, + { url = "https://files.pythonhosted.org/packages/39/34/66bbc6ffd3c51fa67604c566920e772c5e3baa57f88dcf7b109c7f18b2cb/coverage-7.16.1-cp315-cp315-win_amd64.whl", hash = "sha256:961fc424e9d5229a99f8f1189942d8e7f4e1519147c3af64842f944aca03914d", size = 226195, upload-time = "2026-09-13T19:11:38.493Z" }, + { url = "https://files.pythonhosted.org/packages/f7/96/4bad920d4caed127c37c136a64b0730fa495517d2eb58809e0d81e6e7dff/coverage-7.16.1-cp315-cp315-win_arm64.whl", hash = "sha256:681a9488c5a234397c4f013da065aa9e53eb7af4c78f1f80c6f15e7208acb855", size = 225625, upload-time = "2026-09-13T19:11:40.664Z" }, + { url = "https://files.pythonhosted.org/packages/f5/2b/a88c7906eeb7da4394e932060d7008e153b3a2cd8d11782d82faa03bb7a3/coverage-7.16.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:8bb09a2d19b04db1fa0e087a7ca4f12458f7e0e7364cfcd838441d86fb1c61f6", size = 224271, upload-time = "2026-09-13T19:11:42.876Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1f/98db59c595680d16f553890deac6d72610e04f192c1964ec9b69cbe790ab/coverage-7.16.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:2270a794600b635ca9452ce4c32e2fe81a35f9caa17ffac0eba99f14f275bd4d", size = 224564, upload-time = "2026-09-13T19:11:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/699e236d4cb97ec282b0655afc85acf12349e71a02fff0f1a7d0fb643079/coverage-7.16.1-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a4eff405b545dfcf79cf0d9d3ff750e5c5a887aa066114175193a81d249c5ee6", size = 265423, upload-time = "2026-09-13T19:11:47.666Z" }, + { url = "https://files.pythonhosted.org/packages/96/1b/6eaa21912863b3e3bf23cfe605fb62929bb1a41dc33d2bfa8e92000232bd/coverage-7.16.1-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ee1d5fc9e3bd6a217906929cc97880239a91d20dae7746f538eb0eefee705ab1", size = 268503, upload-time = "2026-09-13T19:11:50.12Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ac/4eb46bffa98c28a80559a58c12f17e19308d52b31174af1bd49decf76606/coverage-7.16.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4ec944947de098ad5a1738413f9364689a57067ecbc328e9de37218aa1e5cc1", size = 271059, upload-time = "2026-09-13T19:11:52.363Z" }, + { url = "https://files.pythonhosted.org/packages/ed/d4/17a51ef1f6a084c9abbead522cfbee0fe9d29a593128781e724b7a0795b3/coverage-7.16.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3f73ee3956fde2d461c9e2955dd48166e4821fc8587d135e8780fb84da2a098b", size = 272039, upload-time = "2026-09-13T19:11:54.935Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ff/9fdeba8b8aa0848030f45f869ddedc306795a8c6e53e901b8553afbf5415/coverage-7.16.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ec9a4ee989c0d06ad95add0dbfdbb72b00ef53f43431ca0b612384e7878e5de", size = 265869, upload-time = "2026-09-13T19:11:57.423Z" }, + { url = "https://files.pythonhosted.org/packages/95/eb/ab3eb506b2e4dd278440fbbbc7ed18424a86d8a981db0b90fdba66f5d34d/coverage-7.16.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:7e5727b2508f817f3126d6c33327dda32fe69d15514badfcd61db8bc4209ecef", size = 268883, upload-time = "2026-09-13T19:11:59.71Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0c/f4edefdce33f01954a74237df5ee83ccef5dcd1165e04abf0adf47543fca/coverage-7.16.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:19a3ea2f364012ef06678118fffdc92442a16bef4a5c8ad4f4019dd8f9ac8876", size = 265359, upload-time = "2026-09-13T19:12:01.953Z" }, + { url = "https://files.pythonhosted.org/packages/df/86/ce5ed885fc7ce2adc9a5971134ace257d0f84f19c3d117da89c179b9662e/coverage-7.16.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:996c2b891b441ec2b39725ee3e8386e2f11b4894b92be225fdfd54a3eeada2c8", size = 270056, upload-time = "2026-09-13T19:12:04.46Z" }, + { url = "https://files.pythonhosted.org/packages/48/a1/5dbd5f95070cece25c6df9e6ea4ded2a87dc695ce82a49bcb2116452b342/coverage-7.16.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:a125fac1f6b1e88488d208a86b578e1790e3c4937f2e1568d23356141d236220", size = 265498, upload-time = "2026-09-13T19:12:06.811Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ff/254b26f3300f87c7c53ac97da41ae75f0e2ac066aa964bc073c0f3750b38/coverage-7.16.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b10095528b866d322d33d6bf1709b7f8cbf959f12e8cb2ba22fc59c8717866b0", size = 267459, upload-time = "2026-09-13T19:12:09.479Z" }, + { url = "https://files.pythonhosted.org/packages/61/20/bf9958f8ddbbf6a2d39da3d4009f33e0fcf19c2d2fd99715c6494cdc8e8c/coverage-7.16.1-cp315-cp315t-win32.whl", hash = "sha256:531d9be377fdcc05593b974656872eb82e808ebeb42a72515e3aaeb8bb7166f5", size = 226021, upload-time = "2026-09-13T19:12:11.933Z" }, + { url = "https://files.pythonhosted.org/packages/35/8f/12d46948704d9e437c8dca2718e5d54ecc2f85396b64b500c29d8dbe10db/coverage-7.16.1-cp315-cp315t-win_amd64.whl", hash = "sha256:46a88f51770df7c9bc376bd57d3f86cdc7624b8e16ac4b585a655c22b7a1b4db", size = 226853, upload-time = "2026-09-13T19:12:14.254Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7f/1ca5fd0601054fce5a3539375b997e67683646e2bf62f60c41e70b529fcc/coverage-7.16.1-cp315-cp315t-win_arm64.whl", hash = "sha256:7580432cbe1e8b762660ae5806f04f869e1c02e519836a43f8094437e561e9f0", size = 226163, upload-time = "2026-09-13T19:12:16.589Z" }, + { url = "https://files.pythonhosted.org/packages/96/1a/d6d16babd0a5fe4c3fae40702158c570351694e74516d8d81b86c5637448/coverage-7.16.1-py3-none-any.whl", hash = "sha256:3d8bd4e58b6a5c2018d808f297905393c6c61da466a48c3f0596a76a4900ebe4", size = 215264, upload-time = "2026-09-13T19:12:18.895Z" }, ] [package.optional-dependencies] @@ -882,59 +962,59 @@ toml = [ [[package]] name = "cryptography" -version = "49.0.0" +version = "50.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" }, - { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" }, - { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" }, - { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" }, - { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" }, - { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" }, - { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" }, - { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" }, - { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" }, - { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" }, - { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" }, - { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" }, - { url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" }, - { url = "https://files.pythonhosted.org/packages/ec/9e/db72b3ae7fc9cfad53e630e56c6ae83b9b6ff0bf3718ffb8012d20b3aabf/cryptography-49.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:73a205dce83953d131a4aa1e0fd917a2fd1c5b1eef251e9d7152efefcbf5caf7", size = 4013892, upload-time = "2026-06-12T20:02:10.735Z" }, - { url = "https://files.pythonhosted.org/packages/86/12/c48a424f38db03027be9f7ed5c7dc5de9933dbee992865f98b13727a009d/cryptography-49.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d", size = 4678835, upload-time = "2026-06-12T20:02:48.743Z" }, - { url = "https://files.pythonhosted.org/packages/68/28/8a3ad4653662c93fc44dc4e5d8fd374c25c42e07b34bbfbadf49cf57a5a8/cryptography-49.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa", size = 4697239, upload-time = "2026-06-12T20:02:56.03Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b2/2193fc74f81aee4f9b62733133b73b5176718932ed8f2e4b03fa040480a6/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb", size = 4685593, upload-time = "2026-06-12T20:02:50.666Z" }, - { url = "https://files.pythonhosted.org/packages/47/f1/1d3eaa243bfc5de4a187b22aa8c048b3e4980bfbe830ac46e6bac2e66947/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d", size = 5289961, upload-time = "2026-06-12T20:01:46.468Z" }, - { url = "https://files.pythonhosted.org/packages/58/39/2d51306721330c486495853eda1c567880ff036de15a14c4b74f399934af/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561", size = 4731145, upload-time = "2026-06-12T20:02:16.832Z" }, - { url = "https://files.pythonhosted.org/packages/17/50/983e838c7fd0d87fd8c969bcdd328edaf5f756e38df5281637424c155873/cryptography-49.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122", size = 4321719, upload-time = "2026-06-12T20:02:52.611Z" }, - { url = "https://files.pythonhosted.org/packages/a7/f5/8f571d7e27c55bce9f76f026143bcb1e040a4233149ecca0bea5fa5dd5f7/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505", size = 4685209, upload-time = "2026-06-12T20:02:07.282Z" }, - { url = "https://files.pythonhosted.org/packages/e7/84/0e27016a6fc5a0886f797018b26aa42f40c09a82332bff77822a451deaaa/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866", size = 5246285, upload-time = "2026-06-12T20:01:32.439Z" }, - { url = "https://files.pythonhosted.org/packages/11/2d/5e1fb307cb5931881516b464c98774b3f2c36b5d4bb9a2830253cf553cad/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8", size = 4730441, upload-time = "2026-06-12T20:02:01.469Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c0/bff5a02ee731d207d6a1ed51732549d8c53d2bc8da1d10ec6f2844201d68/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3", size = 4815869, upload-time = "2026-06-12T20:01:36.574Z" }, - { url = "https://files.pythonhosted.org/packages/b9/26/814681d14248d95d73d5c3eea0c39a94eb8302df966f670a2c60de90974b/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27", size = 4960948, upload-time = "2026-06-12T20:02:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fe/93ecac273d3738939d023612ad12cca9a3740a5345d69fda04134c43fd96/cryptography-49.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:33cd0565932807baddb67b96dbee92f2c374b5c89dee09fd74079aeb8c8dba61", size = 3799153, upload-time = "2026-06-12T20:01:39.059Z" }, - { url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" }, - { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" }, - { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" }, - { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" }, - { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" }, - { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" }, - { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" }, - { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" }, - { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" }, - { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" }, - { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" }, - { url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" }, - { url = "https://files.pythonhosted.org/packages/63/d3/4a83af35d65e3fad632c926fad684c193ea4398569ccb0bbbc7fe8f5dc9a/cryptography-49.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fc1e275c2f1d97b1a6450b8b0ea3ebfa6e087a611c2b26cb2404d48588abab7b", size = 3993685, upload-time = "2026-06-12T20:02:14.883Z" }, - { url = "https://files.pythonhosted.org/packages/d6/a7/f9dac0ab7f80368c56993a7bf638ef9935f825c91902798481fac0898138/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83782480a4a9da4d0feb51950131ba32e12e70813848b3343f6e18c28a66838", size = 4676239, upload-time = "2026-06-12T20:02:28.793Z" }, - { url = "https://files.pythonhosted.org/packages/d7/70/2ba3769dd0ae167e2f33dfa9592d45db6ff9a61d62ca1a5b3d1bdd09068f/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b39efa323140595abd3ecca8529d321ae50f55f3aa3ba9cc81ea56a6011953d5", size = 4715584, upload-time = "2026-06-12T20:01:27.495Z" }, - { url = "https://files.pythonhosted.org/packages/94/64/2923570ac1c0bd3a737aa366ac3abbbbde273042308b8cde95e2364a6e6a/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b47db11c2c3525083296069b98ac5221907455e989ae0c2e3008bde851921615", size = 4675885, upload-time = "2026-06-12T20:01:55.49Z" }, - { url = "https://files.pythonhosted.org/packages/ab/f8/614dc7e051418cfe53d55173c1e24c6b0085e89996fe90508c2fdf769aef/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:084ef1af862eb07ec46d25f68689f2102a9fc0e05ce7b80f14f5fe51e4eef0f6", size = 4715449, upload-time = "2026-06-12T20:02:05.469Z" }, - { url = "https://files.pythonhosted.org/packages/aa/50/a9caea39ad19c431c1a3f8a31114df65b260cdfe67786b6c7e7c040c4c44/cryptography-49.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be9fcb48a55f023493482827d4f459bd263cc20efde64f204b97c123201850c6", size = 3783731, upload-time = "2026-06-12T20:02:43.319Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/19/797e2aaac9df6a66f1550f49979dc1b1e39ecd2077501c30efa81e8d5d67/cryptography-50.0.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986", size = 4010153, upload-time = "2026-08-25T19:44:03.155Z" }, + { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" }, + { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" }, + { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" }, + { url = "https://files.pythonhosted.org/packages/55/32/38c0d344b98c06d34b5df8946565a9c0d6dbf32c8e0730a7f05f0a3c6cab/cryptography-50.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45", size = 5353524, upload-time = "2026-08-25T19:44:11.96Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" }, + { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/e3/38/45abd72ef63f2e7d0754a6cacf97bd8b69512ace7f6130d24c39ece65da2/cryptography-50.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527", size = 5308405, upload-time = "2026-08-25T19:44:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" }, + { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" }, + { url = "https://files.pythonhosted.org/packages/42/8b/cb12b1b60c91b074ca6bf0fdd59aa8f10d8bc5f73af8faece86ef0421b37/cryptography-50.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:aed8db4f6d71c51efb89530e12d9464e7bf2923d46c3205dc794a2a93f8c0648", size = 3842826, upload-time = "2026-08-25T19:44:28.784Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f0/424cb557d99aa86ac55da5e2add02e2882e44047b6264f93ade1b975a993/cryptography-50.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30a125032e5642a21ff816e021152bd4e7e94f03eff3f4b7fca41cd22bc3110f", size = 3973525, upload-time = "2026-08-25T19:44:30.7Z" }, + { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6e/1cf405c5c8e8df7545378048e954792f00b7f2367af8863ce8b8f3e10607/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9", size = 5332388, upload-time = "2026-08-25T19:44:39.16Z" }, + { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" }, + { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" }, + { url = "https://files.pythonhosted.org/packages/b1/1b/ec3ebd31741d0e963612c4fe43caa39341b9b1e031e469820e42e4c83918/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6", size = 5287201, upload-time = "2026-08-25T19:44:47.297Z" }, + { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" }, + { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" }, + { url = "https://files.pythonhosted.org/packages/4d/56/bc4f2b209e766c93372cfcd59b781a0b2b59700f62a969580415b699c2b2/cryptography-50.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f74455bb086a85d5e81246412602aaa97ed095e504cd40dd261ef50be42205bf", size = 3825806, upload-time = "2026-08-25T19:44:56.209Z" }, + { url = "https://files.pythonhosted.org/packages/84/a9/ee16a903f13755e914d1eecc482fe64d1f10761c3960e5d8fa6837377aff/cryptography-50.0.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0", size = 4035307, upload-time = "2026-08-25T19:44:58.305Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" }, + { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2b/214cf0cf93db9628c3c20c896b229f327f6fb1b20e4b3743d8ad3f00af8b/cryptography-50.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054", size = 5375862, upload-time = "2026-08-25T19:45:07.163Z" }, + { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" }, + { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" }, + { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" }, + { url = "https://files.pythonhosted.org/packages/dd/04/557fc5ead96a829e0bc812a3b9dc4a52a2f27e4f7f5950da7ff27653a805/cryptography-50.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80", size = 5332955, upload-time = "2026-08-25T19:45:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" }, + { url = "https://files.pythonhosted.org/packages/99/89/87ef49ffe383ef4e147d27b7bf2088fb0b54ea409dd87b5a89442e5828a5/cryptography-50.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2", size = 3875429, upload-time = "2026-08-25T19:45:24.418Z" }, + { url = "https://files.pythonhosted.org/packages/c7/27/8d207af749c453ee17ea087340b3f2b4adef75aadd1d277b1b129bdda84e/cryptography-50.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9cb3cb952cf5a8abd50c782a98a89d71699715e802fe349704b47f2425b42a94", size = 3974350, upload-time = "2026-08-25T19:45:26.551Z" }, + { url = "https://files.pythonhosted.org/packages/14/9a/6d3a4d7852e22d657438b7bf51f66102c7d71c0e1fafeec652281d0403e5/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f", size = 4698675, upload-time = "2026-08-25T19:45:28.658Z" }, + { url = "https://files.pythonhosted.org/packages/73/35/5c3717edf9e68a0550ce04e28eab493fe545eccd81742af03f6a75fe260b/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671", size = 4707410, upload-time = "2026-08-25T19:45:30.816Z" }, + { url = "https://files.pythonhosted.org/packages/1d/e0/e786934472e3ac4ecdecc7b129a0ca1a2a40dffdafcf2c3ea9d4397f8def/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e", size = 4698378, upload-time = "2026-08-25T19:45:33.043Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/5b3f53a0b74d122f023476ede40ba5d3e70d5cf475f73b899740d26a4fb2/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6", size = 4706889, upload-time = "2026-08-25T19:45:35.086Z" }, + { url = "https://files.pythonhosted.org/packages/71/44/711e61f7d014be825ef79b285b047292d1bf893732ac1bc030a351fb517f/cryptography-50.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:693c99b49bd37d0d096e4334c10232c77248c415b98d35236094cdf96d57258b", size = 3824006, upload-time = "2026-08-25T19:45:37.281Z" }, ] [[package]] @@ -956,15 +1036,15 @@ wheels = [ [[package]] name = "dependency-groups" -version = "1.3.1" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/55/f054de99871e7beb81935dea8a10b90cd5ce42122b1c3081d5282fdb3621/dependency_groups-1.3.1.tar.gz", hash = "sha256:78078301090517fd938c19f64a53ce98c32834dfe0dee6b88004a569a6adfefd", size = 10093, upload-time = "2025-05-02T00:34:29.452Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/16/65e61d8e837e0d70a99a0d4dd76e2af53357c3a03ed1db8ad9b5786d7f25/dependency_groups-1.3.2.tar.gz", hash = "sha256:c81831f43828dbc3987ee247eb198241a0152b8e7ceab10977cc3808eb388ac7", size = 13309, upload-time = "2026-08-22T02:43:30.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/c7/d1ec24fb280caa5a79b6b950db565dab30210a66259d17d5bb2b3a9f878d/dependency_groups-1.3.1-py3-none-any.whl", hash = "sha256:51aeaa0dfad72430fcfb7bcdbefbd75f3792e5919563077f30bc0d73f4493030", size = 8664, upload-time = "2025-05-02T00:34:27.085Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e4/da5f2f176050efcfb9222a76a3e81c41f69f775be8e563b76ca4292a134f/dependency_groups-1.3.2-py3-none-any.whl", hash = "sha256:8c337f7b92445823b0d0ea507f611390c58dcd2112be00aebcd738a2ca7a1c64", size = 9802, upload-time = "2026-08-22T02:43:28.853Z" }, ] [[package]] @@ -1040,7 +1120,7 @@ wheels = [ [[package]] name = "fastapi" -version = "0.139.2" +version = "0.141.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, @@ -1049,9 +1129,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/95/d3f0ae10836324a2eab98a52b61210ac609f08200bf4bb0dc8132d32f78a/fastapi-0.139.2.tar.gz", hash = "sha256:333145a6891e9b5b3cfceb69baf817e8240cde4d4588ae5a10bf56ffacb6255e", size = 423428, upload-time = "2026-07-16T15:06:17.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/02/91e3416a8fdd715abb903a952a6bec7cdd8d14eed55d415fc8595524c319/fastapi-0.141.1.tar.gz", hash = "sha256:e8822fc40db1e1858054d7a949a888695bc9bdce70139178e33bd2871a453ca1", size = 425799, upload-time = "2026-07-29T17:18:05.568Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/c7/cb03251d9dfb177246a9809a76f189d21df32dbd4a845951881d11323b7f/fastapi-0.139.2-py3-none-any.whl", hash = "sha256:b9ad015a835173d59865e2f5d8296fbc2b317bf56a2ba1a5bfbdd03de2fd4b1c", size = 130234, upload-time = "2026-07-16T15:06:19.557Z" }, + { url = "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", hash = "sha256:bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3", size = 131954, upload-time = "2026-07-29T17:18:04.364Z" }, ] [[package]] @@ -1119,11 +1199,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.30.0" +version = "3.32.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/2b/8b6480a70a647035334a604d0931926de4b5cd1f57835d45ad5eed2b1a1e/filelock-3.30.0.tar.gz", hash = "sha256:1774e682dbe443bd60f9609162fc596e2c80dc84ffc2957068953406d0520090", size = 174927, upload-time = "2026-07-16T03:53:58.152Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/46/126b1831dca12060d4a8296bf9c4fe5c93c4f22197fa239cb0cc82042bba/filelock-3.32.6.tar.gz", hash = "sha256:a3f55a18af3652a94d8f47d6055df434f254ca1d02ef2524850c6d249ca2512c", size = 225172, upload-time = "2026-09-08T22:57:11.528Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/af/9b01bcf5c91e81899bb890b87bd9077732a9b3365c098e67fe77958c39ed/filelock-3.30.0-py3-none-any.whl", hash = "sha256:40632998f0772e64183bb819f086a1b9def6be1090cf1dcb9d45f46806ef279b", size = 93131, upload-time = "2026-07-16T03:53:56.727Z" }, + { url = "https://files.pythonhosted.org/packages/cc/06/4f138f618dbea66803291274f228f01daf29f306fe8b96bc30dab765df75/filelock-3.32.6-py3-none-any.whl", hash = "sha256:3f16ecd0117feae0dfc147e8c62eb5daeccd8bd800378c3ddf416de9b4feb6b1", size = 100189, upload-time = "2026-09-08T22:57:10.182Z" }, ] [[package]] @@ -1289,18 +1369,19 @@ wheels = [ [[package]] name = "fsspec" -version = "2026.6.0" +version = "2026.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/10/a1/ae4e3e5003468d6391d2c77b6fa1cd73bd5d13511d81c642d7b28ac90ed4/fsspec-2026.6.0.tar.gz", hash = "sha256:f5bac145310fe30e16e1471bd6840b2d990d609e872251d7e674241822abf01a", size = 313646, upload-time = "2026-06-16T01:57:28.105Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/78/f34251dadb8f3921264a1d9b8946f5e542014ee2614b285261b4e40e6775/fsspec-2026.7.0.tar.gz", hash = "sha256:c803c40f4cf860b49dea58ee3e1c33cb9c790520e233537e1340049f89b82a88", size = 317040, upload-time = "2026-07-28T16:34:51.052Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/22/4222d7ddf3da30f363edaa98e329c2bce6c65497c9cb2810931c8b2c0fbc/fsspec-2026.6.0-py3-none-any.whl", hash = "sha256:02e0b71817df9b2169dc30a16832045764def1191b43dcff5bb85bdee212d2a1", size = 203949, upload-time = "2026-06-16T01:57:26.358Z" }, + { url = "https://files.pythonhosted.org/packages/fd/3c/6a2bf344106328fd04963664a60b9bb6496fc25df8e962fcdc1367285fb9/fsspec-2026.7.0-py3-none-any.whl", hash = "sha256:b57ddbafedfaef7018c1ecab32aa200a9d7ca26b77965f64e48b70061249d279", size = 206583, upload-time = "2026-07-28T16:34:49.538Z" }, ] [[package]] name = "google-adk" -version = "2.4.0" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "aiohttp" }, { name = "aiosqlite" }, { name = "authlib" }, { name = "click" }, @@ -1326,22 +1407,22 @@ dependencies = [ { name = "watchdog" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/a1/6048b1c22817859bafc1101f8ba26f704233d9acb07e715dff5fb41b9b55/google_adk-2.4.0.tar.gz", hash = "sha256:5a2996b288d591deefcb277eeeeb7da838d72056675763bfef52ad3b36975dde", size = 3566788, upload-time = "2026-07-07T19:46:14.802Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/50/cc4b5563222fab77ee7f95367e2e6bc0663ef74b62e0b519e2028157cb0d/google_adk-2.7.0.tar.gz", hash = "sha256:283e16dc5ffab7684e17098f7282470339e88a3d16ecfa62b4025680672c906b", size = 3806369, upload-time = "2026-08-13T22:22:06.379Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/ab/12ec18054990ac69f37dae8327f5d8d5e04557bada0d8d725afd872d3020/google_adk-2.4.0-py3-none-any.whl", hash = "sha256:fba91f1a693e5fc2fd13dc40d625562bd52e44a7baaeecedb01811a68063d847", size = 4123277, upload-time = "2026-07-07T19:46:13.026Z" }, + { url = "https://files.pythonhosted.org/packages/d3/6e/c97d9fe60a47f605aa5013a28ef76beef573f3d96a356532e840fa05ee20/google_adk-2.7.0-py3-none-any.whl", hash = "sha256:6517c0383d9449484b6398a5b60c6408dbd4de369e957eebc3b9d8d0c90736e9", size = 4395958, upload-time = "2026-08-13T22:22:04.119Z" }, ] [[package]] name = "google-auth" -version = "2.56.0" +version = "2.58.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyasn1-modules" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/66/b4ba60005743e01933e22b4f62313e063f7460458b7d8a358427b4930013/google_auth-2.56.0.tar.gz", hash = "sha256:f90fa030b569a92654b9d690665a073841df33d57487be53db583a9a0867a553", size = 364629, upload-time = "2026-07-13T19:09:57.143Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/ca/f398a483ce5aad18ca2f735646e45ccee2439bd94a41a4ad0cfa646bd495/google_auth-2.58.0.tar.gz", hash = "sha256:55e30cf15e737de92c5323d78cda8a83fcd57e7ffbaf900c4600039fd60a80fd", size = 380018, upload-time = "2026-09-09T20:49:38.043Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/7d/cd3e187f14ce832e419e70709bfcc40cb0dc11517d5d03c9d3919bcc3101/google_auth-2.56.0-py3-none-any.whl", hash = "sha256:6e88c10217e07a92bfd01cac8ee99e32ccfb08414c3102e6c5b8d58f37a0d1e0", size = 257976, upload-time = "2026-07-13T19:09:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/59/13/477d90d09591b3938b45c4e11f4d8a51291682112cb5efcac961e815d562/google_auth-2.58.0-py3-none-any.whl", hash = "sha256:8a9c4645bb4c8e91668fb1934b95ae6a8687084232753639220ba9bf04a1610d", size = 262404, upload-time = "2026-09-09T20:49:33.951Z" }, ] [package.optional-dependencies] @@ -1354,7 +1435,7 @@ requests = [ [[package]] name = "google-genai" -version = "2.11.0" +version = "2.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1368,30 +1449,30 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/01/e7b5f3aac89200c78318ed7643401e7f5ed3131b0cd353c07483606b1e61/google_genai-2.11.0.tar.gz", hash = "sha256:4c5e524d24b145c96be327f9a7f8f04b0fe4efee0533877795e9848afed01749", size = 622366, upload-time = "2026-07-09T17:49:43.862Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/9a/db14adffb0144584889e05f433a4e8ce540f9ed2928ed8b23cc65ab96178/google_genai-2.23.0.tar.gz", hash = "sha256:1ceebffdcd2af30c039a922ba05de61cd4054bb61c94be7649c4bf9ff8b33c5f", size = 686707, upload-time = "2026-09-10T22:55:31.12Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/ef/d296c23390160a8b0b1dafb36dd3cb36a39ed40c81cd27e04e6233334186/google_genai-2.11.0-py3-none-any.whl", hash = "sha256:5bc8186100e1d34d691fbe0cba392b7e04e98d286ca952323a6672d054accf95", size = 984162, upload-time = "2026-07-09T17:49:42.15Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b0/f6bc58a6a7c8ad7ad2b6a36b0bf4732b3504dd7d48c6674f848304548869/google_genai-2.23.0-py3-none-any.whl", hash = "sha256:1e63211d44d188b8069c2b354d92b9bde25c1e821513fdbe1948b7c0d9f6b922", size = 1093785, upload-time = "2026-09-10T22:55:29.282Z" }, ] [[package]] name = "googleapis-common-protos" -version = "1.75.0" +version = "1.75.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/c5/4353a188e2c335aee33269e8b654af228278cca8e5f0b4b5f11e5d0e9adb/googleapis_common_protos-1.75.3.tar.gz", hash = "sha256:57c435ac2c68b108999b6db075d9053e4d7a936ba57b4a3d45667b1346f1738a", size = 153905, upload-time = "2026-09-03T22:31:21.869Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631, upload-time = "2026-05-07T08:03:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7a/7d79170c6ce6f12e109df2b3879d6b934010cf4f99aea8de8b7e5408c174/googleapis_common_protos-1.75.3-py3-none-any.whl", hash = "sha256:a018d2bf098ca9fb6faa08d5bb780e2a2c2f73c566f069761331386c9596d3f2", size = 306984, upload-time = "2026-09-03T22:30:45.133Z" }, ] [[package]] name = "graphql-core" -version = "3.2.11" +version = "3.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4d/90/f2aff026ab4aebd80eb71905106a0885f4cfde85dcf965543f45bed0d9ee/graphql_core-3.2.11.tar.gz", hash = "sha256:e7e156d10beb127cab5c89ff0da71416fc73d27c484a4757d3b2d35633774802", size = 528407, upload-time = "2026-06-05T13:45:22.915Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/7f/671c1046fe72ba5b62be2de3979ea9e61cb3dba8f1edfb880b811f8bdf8b/graphql_core-3.2.12.tar.gz", hash = "sha256:4579094d5fc8a1a59555a9b18e51b320779d9bbc63e2302c519af0c4919d9543", size = 531478, upload-time = "2026-08-27T20:25:48.607Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/15/b92b4e1d88d02c6eff9733c9eea21846ab435cc4d813d84ccc5d335955df/graphql_core-3.2.11-py3-none-any.whl", hash = "sha256:0b3e35ff41e9adba53021ab0cef475eb18f57c7f53f0f2ca55567fbf3c537ea0", size = 214879, upload-time = "2026-06-05T13:45:21.245Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b6/304c572e79b9e82982dbd5091e26a89f5018e565868091d804c2142f6ba5/graphql_core-3.2.12-py3-none-any.whl", hash = "sha256:3d8f104532070485e13caa4092c1e71cda2ba6cffd96e98f285111ee10ed1e51", size = 216042, upload-time = "2026-08-27T20:25:47.234Z" }, ] [[package]] @@ -1405,135 +1486,155 @@ wheels = [ [[package]] name = "griffelib" -version = "2.1.0" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/e4/8d187ea29c2e30b3a09505c567513077d6117861bde1fbd997a167f262ec/griffelib-2.1.0.tar.gz", hash = "sha256:762a186d2c6fd6794d4ea20d428d597ffb857cb56b66421651cbba15bdd5e813", size = 216234, upload-time = "2026-06-19T12:05:42.278Z" } +sdist = { url = "https://files.pythonhosted.org/packages/27/af/018c10bc9edd42b6ef6db2e96b09542050d5253f9b195e74bc910b2d13ab/griffelib-2.3.0.tar.gz", hash = "sha256:7b0952caf5bca6afa4bb5ee8c6a2d183fe3f21b62efc5f6c7243cb2b26d2d115", size = 234534, upload-time = "2026-09-04T15:08:17.472Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl", hash = "sha256:cc7b3d2d2865ad0b909fcc38086e3f554b5ea7acbaa7bbb7ecaa3f5dfb7d9f00", size = 142560, upload-time = "2026-06-19T12:05:38.742Z" }, + { url = "https://files.pythonhosted.org/packages/41/63/e876e789525063c840ccfa8857febdabd6523bcef9ce7eb979b9305ea895/griffelib-2.3.0-py3-none-any.whl", hash = "sha256:1b8f9cd525681c26b1d6d574faa1371651e8459ca51d209684f50b8096ae06e0", size = 169423, upload-time = "2026-09-04T15:08:12.956Z" }, ] [[package]] name = "grpcio" -version = "1.82.1" +version = "1.84.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/90/bc/656b89387d6f4ed7e0686c7b64c2ae7e554a759aa58122c8e5fb99392c32/grpcio-1.82.1.tar.gz", hash = "sha256:707b24abd90fcb1e45bcc080577da1dbf9971d107490589b9539af8e1e77b4b5", size = 13187300, upload-time = "2026-07-08T12:36:16.588Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/14/5d05bfd85c101cbe44a12d7c1cea9c40698e0438cddf3a70019f735b5a27/grpcio-1.82.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:91859d1cac5f47caec5fc40e9f827500cdb54ce5b36450dc9a65616b5af49c17", size = 6177087, upload-time = "2026-07-08T12:34:06.825Z" }, - { url = "https://files.pythonhosted.org/packages/19/2e/c906f8e6d0b54c0137885fff6f7b5883c6bbc381b44a0ba5ea07d7d1579b/grpcio-1.82.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c80c9741dcef192f669876a81957cf7713b441c2f0c43631350d75fa49321d31", size = 11960907, upload-time = "2026-07-08T12:34:10.583Z" }, - { url = "https://files.pythonhosted.org/packages/de/be/ec4aa76cdf25539b9e960cbb9d5739f892ea6cde58078b5293860c1159d3/grpcio-1.82.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b89cff456796d2f0581783726ad017a2c70aff2d27b0f05504c34e2e417f7560", size = 6754802, upload-time = "2026-07-08T12:34:13.082Z" }, - { url = "https://files.pythonhosted.org/packages/e6/dd/47519c2a8fd9db47ec4493f44bd9f5b0175307e07089b1132e54b7b5b19c/grpcio-1.82.1-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d6e8a08f7038ba7a77f71e250804e4aba84fe91d22cfc54ff43c07b7529c4728", size = 7484535, upload-time = "2026-07-08T12:34:15.164Z" }, - { url = "https://files.pythonhosted.org/packages/63/99/659711e9689c4dd553bcd4eacff9cb9f458f34b60edf7afb3bbc1b0a58a2/grpcio-1.82.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:50fd2fe83426b1b1c6cdc4d72d555223b7dddf8ce07c5bac218b13fc6d684c6f", size = 6919066, upload-time = "2026-07-08T12:34:17.367Z" }, - { url = "https://files.pythonhosted.org/packages/29/39/f2b772356b4f593ffe439795509fcbf675b0ff98211ae8ce2a180f2e559f/grpcio-1.82.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b758540a24d5394a9c578bf9f6126389f474b106ac3d9df1d53de56cb14c9fd9", size = 7525855, upload-time = "2026-07-08T12:34:19.479Z" }, - { url = "https://files.pythonhosted.org/packages/a7/06/b28cfffb989a84d8272593498bddd2d68148cce1813ad55189c469b0f1f8/grpcio-1.82.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c4ba4aac238f685743575d9d700003ac16537cce26e7c774993134f530652464", size = 8565122, upload-time = "2026-07-08T12:34:21.951Z" }, - { url = "https://files.pythonhosted.org/packages/97/f9/54956cb0c701190cbc9d7e535c3f84acf0285c6b9ed198a902766e17c3cd/grpcio-1.82.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed6fc621d6f366c88a60f0b971d5afd21d441d9aa561ee688de5b7acdb2cf901", size = 7933872, upload-time = "2026-07-08T12:34:24.539Z" }, - { url = "https://files.pythonhosted.org/packages/76/85/5f9cd1f965bbe4329556a212f178ae0c072b18b446cae05ed32fa8847c53/grpcio-1.82.1-cp310-cp310-win32.whl", hash = "sha256:bd2f45e46fff5b91c10997d0743a987517a7dde67c64c592835c2dcaac66f587", size = 4257373, upload-time = "2026-07-08T12:34:26.566Z" }, - { url = "https://files.pythonhosted.org/packages/93/b0/c4f42f7c69c53d27ed41643421b55908bcbe885b68f5a208135c72917c98/grpcio-1.82.1-cp310-cp310-win_amd64.whl", hash = "sha256:5e171d5f0d6a0af78ea7512783f170a44f80c165259d8773e3a354a7f991f2b5", size = 5006571, upload-time = "2026-07-08T12:34:28.778Z" }, - { url = "https://files.pythonhosted.org/packages/26/5b/e5092af97fa671ca279b3e373251af4bf87d5fbda7dc85f6a616899562a7/grpcio-1.82.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:0ddb18a9a9e1f46692b3567ae4abb3f8d117ce6afea48650f8eca06d8ab5d06f", size = 6181472, upload-time = "2026-07-08T12:34:31.009Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8f/18053a3a2ca03d0c2a1b8cc7271e705007a16aa5dae84bac00935c5b1a7f/grpcio-1.82.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:cf855b1af246720f567b0ce5d0724d45dfa4188eecc3296a2a69257b11b9e94b", size = 11970995, upload-time = "2026-07-08T12:34:33.603Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7e/21b1acb052876ad00959ec4d1b05fe08607d650bcfa282073bb164c2703c/grpcio-1.82.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb30cb13e25bc13cea70ffc69d6d90c49d36ea6c1d4549e6912f70177834cac", size = 6760127, upload-time = "2026-07-08T12:34:36.122Z" }, - { url = "https://files.pythonhosted.org/packages/3e/12/25eef9c245c54f0061317d13a302357fe8ea03bac240b2b02ececcf54da4/grpcio-1.82.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1e822b2774f719c017cbe700b6e47173b6ae290fb84906f52a5a3c2c60b62e1e", size = 7484377, upload-time = "2026-07-08T12:34:38.368Z" }, - { url = "https://files.pythonhosted.org/packages/a0/41/1a348767eb9d9bd7765dc4fa8a01723d3bb386d67f981ee5c6f9c02b8b1c/grpcio-1.82.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5dafb1ece8ed45dee7c738f166ec82e19673221ed5ab8967f72858a4685345b2", size = 6924269, upload-time = "2026-07-08T12:34:40.583Z" }, - { url = "https://files.pythonhosted.org/packages/e4/b9/3aae7a03d34c86ea27988db859a6087c186f6c3f53f9b551e07afd989bfa/grpcio-1.82.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06503106e7271e0a49fd5a1ac04747f1e47e87d900476db6fe45bc87ee411f4", size = 7531848, upload-time = "2026-07-08T12:34:43.277Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/3c4afa625d0dac9090707966916284c035fc5b2fb3e2c51e156accee6735/grpcio-1.82.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ff99bc8cafb6a952201c37b995f425e641c93ffa6e072258525feab57290141d", size = 8568217, upload-time = "2026-07-08T12:34:45.502Z" }, - { url = "https://files.pythonhosted.org/packages/20/9c/d8489c628e73e20a3d034e7f66912de7b1acb405f01d388f056a88e47924/grpcio-1.82.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:644ae1b94266ac785330f4590a69e52b6a7eb73029043a02209db81c81397d69", size = 7938771, upload-time = "2026-07-08T12:34:48.323Z" }, - { url = "https://files.pythonhosted.org/packages/4b/b7/0a92cfd1658f3a896d4aa12d4efeb7dd4ddfc723725ae22741a5241ea710/grpcio-1.82.1-cp311-cp311-win32.whl", hash = "sha256:e203d2e19d471630084a16c815616f8211dff21c268ab3c5f5bf38417832e074", size = 4256432, upload-time = "2026-07-08T12:34:50.432Z" }, - { url = "https://files.pythonhosted.org/packages/c7/6a/2872c761b025d9ec74386f22a4a7d59c5a5b00ebf718761b33739ffc45de/grpcio-1.82.1-cp311-cp311-win_amd64.whl", hash = "sha256:0d8299c285fe6cc6a1f56badf8d3bc5078c8d20273ee64bafa3783b4bc29a769", size = 5009633, upload-time = "2026-07-08T12:34:52.67Z" }, - { url = "https://files.pythonhosted.org/packages/dc/88/d1350bf3343a2ed87d801584e40609f6c6bd3087926eeca03de50348cf4a/grpcio-1.82.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:c09bd5fa0d5b1fbd773ec349fe61441c3e4ebf168c229aa7538a820bdfad6a58", size = 6144689, upload-time = "2026-07-08T12:34:55.567Z" }, - { url = "https://files.pythonhosted.org/packages/e6/33/71875cdecd27c24ac1385d4783a09853f01b84a825a36aec2a2bc7d0d080/grpcio-1.82.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:1eae24810720734598e3e6a1a528d5de0f265fe3fc86575e9ecce424b9ec7379", size = 11952034, upload-time = "2026-07-08T12:34:58.128Z" }, - { url = "https://files.pythonhosted.org/packages/82/b2/d9125df3d8a140dec12cc82c05b7deafedeababcff6496f28b2fd5634d10/grpcio-1.82.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a6bd5daf5bde7b24d7ad2cbaf8bf9eac620d96222016bb5e7ddde930dec0673f", size = 6710772, upload-time = "2026-07-08T12:35:01.33Z" }, - { url = "https://files.pythonhosted.org/packages/88/9b/69e2d1627398b964f34437dc476a5aff5a2cc8e7f247d26272b5674b5faf/grpcio-1.82.1-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1ecfde669cb687ac020d31ff76debe5dc7a62213335f02262eb6625628da1c03", size = 7450677, upload-time = "2026-07-08T12:35:03.926Z" }, - { url = "https://files.pythonhosted.org/packages/e4/e7/8f855ca29c294956122a2a73023655b9b02602d5111dad2b9b00e7631c68/grpcio-1.82.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:011c8badee95734dee8bf05ce3464756a0ac3ebb8d443afd20c0e2b5e4640ad9", size = 6886855, upload-time = "2026-07-08T12:35:06.174Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f0/fa87e85f49925f44c479d07e58b051e69bcfef6b6d5fbc6749d140f6730a/grpcio-1.82.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b85f4564926fb23114d239392bdcae200db1e6179629edd7d7ab0ab89c96a197", size = 7501323, upload-time = "2026-07-08T12:35:08.49Z" }, - { url = "https://files.pythonhosted.org/packages/67/55/2e0b10ae1d3ef9dcc480b91dc2158f4931fc4675d3af0a2836e39b2a744f/grpcio-1.82.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2c0c8270833395644c3fe6b6a806397955a2bc0538000a19a78b90c05a6c16e0", size = 8536899, upload-time = "2026-07-08T12:35:10.975Z" }, - { url = "https://files.pythonhosted.org/packages/bd/95/a3d8b0431fa221efc51ee39d73595ede74ba82a43b7c4313192e580face2/grpcio-1.82.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2ba199205ff46c7778290fe1673c91ac8e7e45678dd5c86e9e56fa33ec8788f6", size = 7913892, upload-time = "2026-07-08T12:35:13.944Z" }, - { url = "https://files.pythonhosted.org/packages/b8/92/f2651ec704d9852a56faef394775038afba435b50ce82ab2404d119c3355/grpcio-1.82.1-cp312-cp312-win32.whl", hash = "sha256:06127691866e295c14e84a1fb86356dd962254f6abd0da4ca4b001eea9e89438", size = 4240985, upload-time = "2026-07-08T12:35:16.048Z" }, - { url = "https://files.pythonhosted.org/packages/96/4f/a5fe8bf0d0a1b24855f370293075c931f27de4eb55f0f158786095bf3c11/grpcio-1.82.1-cp312-cp312-win_amd64.whl", hash = "sha256:1fa3223a3a2e1db74f4c2b255189eb7ea875dfba56e221d252ee3fc7b204778e", size = 5001580, upload-time = "2026-07-08T12:35:18.689Z" }, - { url = "https://files.pythonhosted.org/packages/1b/3e/496992d08c0aaa11272eb6228dc8ab947da01fe835de243cd00521bce4c4/grpcio-1.82.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:b454a2d97bfab7565683a02345f86bd182ab69fd7c2bdb7414171e7538f266b1", size = 6146068, upload-time = "2026-07-08T12:35:21.365Z" }, - { url = "https://files.pythonhosted.org/packages/e7/8f/f263d6f14fdba6b56cfadd91fd3e158a52682b72c6016d1f8723d435659f/grpcio-1.82.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3dde70abfc80b3be11de53ba0d601c439e7fb2afd3583ad1788d1146bec92fdc", size = 11948600, upload-time = "2026-07-08T12:35:24.312Z" }, - { url = "https://files.pythonhosted.org/packages/8c/14/3a02e6ee49c2d85bc15eaae321e0e11ab3542cad3c5b2de121ecce0c4296/grpcio-1.82.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5523099c98c292ea1ae08e617249db760c56a78f8deae879027fe7d1ffbcbf6", size = 6714591, upload-time = "2026-07-08T12:35:27.027Z" }, - { url = "https://files.pythonhosted.org/packages/69/80/58e3738696f48ab7645347b98d8a7f93d10e00e6218388fbfcd6c9310e3d/grpcio-1.82.1-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:5e5c4dc0a59b0f8490a6bdfd6fc8395b9d8ad8a8407c7d67ca7b5bba15c0877f", size = 7454995, upload-time = "2026-07-08T12:35:29.599Z" }, - { url = "https://files.pythonhosted.org/packages/f3/6c/2557c1a889363072fbf2285ecd0e8c44860d4dbd60f017a32537c5b863e2/grpcio-1.82.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c40d94ba820329cc191981bc22fa6f6eed0799c6d921f3c6709521d59d4a2fd7", size = 6888621, upload-time = "2026-07-08T12:35:32.38Z" }, - { url = "https://files.pythonhosted.org/packages/d2/66/907706ccaff1223f1e10fd5b37fc16faead43392fccb4e786e7e390ac141/grpcio-1.82.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c816180e31e273caaec6f8bd86a8392499d5bbb26f41da44e3dce48bde69095", size = 7505069, upload-time = "2026-07-08T12:35:35.072Z" }, - { url = "https://files.pythonhosted.org/packages/b3/7c/ff97b0d0f635987ee5ec80dfedafa1aad629303745d48e8637d10eec5b80/grpcio-1.82.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e31fd780b261830720cb70b0fd8f0aa51d49e75a66d7464ad2e31d4b765f2580", size = 8535384, upload-time = "2026-07-08T12:35:37.954Z" }, - { url = "https://files.pythonhosted.org/packages/62/9e/a97fddd970a8d1588cade06eca20443761c1858b0ad6590a5c835aa18062/grpcio-1.82.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d76152d7c31d7210d4a106e5d8b64da5bba5d6abf11be30e2f7b0a0c59bbcbf", size = 7910707, upload-time = "2026-07-08T12:35:40.797Z" }, - { url = "https://files.pythonhosted.org/packages/20/e4/eaba1517888af483a88d449eb7566f0f7f63446d46f339c5891798435875/grpcio-1.82.1-cp313-cp313-win32.whl", hash = "sha256:38e9dcb5258226fb3282630b31b16a968df52c8c6ad514af540646e0a4578f8a", size = 4240363, upload-time = "2026-07-08T12:35:43.298Z" }, - { url = "https://files.pythonhosted.org/packages/b0/42/66a98d47732e35290bef722f6149fed3709cd4cf61166f6f53a12f417302/grpcio-1.82.1-cp313-cp313-win_amd64.whl", hash = "sha256:3dbfb52c36d9511ac2b8e6c94fdde837b393ae520cc321f52a333a2deedf5a90", size = 5000980, upload-time = "2026-07-08T12:35:46.262Z" }, - { url = "https://files.pythonhosted.org/packages/b4/cb/cf9ae9e164c6e6dc8a494faa9771763df9da150eefe19671009624d1559f/grpcio-1.82.1-cp314-cp314-linux_armv7l.whl", hash = "sha256:35f990f7784c8fd2872644f07f96ebb4d9e48e145a190ab80d0280af91a1bfb2", size = 6146901, upload-time = "2026-07-08T12:35:49.261Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2a/eccf26dbcfb7f7cab8027c5490a16c8937c5aa7a2ec20a3eab2cf7a43165/grpcio-1.82.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:46536a4a1f4434df3c851b9254ff6fc7df5705b273681a15ca277d5921c178a0", size = 11954756, upload-time = "2026-07-08T12:35:52.196Z" }, - { url = "https://files.pythonhosted.org/packages/ad/75/3b3b4a3cc9f084b026af96e1d3e539b1af29ec7f41ed0dfff3cb99cc8626/grpcio-1.82.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d6650a7c1ebb7921c70e12a385439a8118efb99e669fa9ed31cf25db1843937c", size = 6723087, upload-time = "2026-07-08T12:35:54.973Z" }, - { url = "https://files.pythonhosted.org/packages/9c/8b/b0f0c9b1400a99a4da4c09b114f101b192f8f11192e76f620b8962f5d90b/grpcio-1.82.1-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b8e110c66df5204c0506d6c8787b35d48b8b699ef5aa366d6c4d67325c67fe9a", size = 7454542, upload-time = "2026-07-08T12:35:57.586Z" }, - { url = "https://files.pythonhosted.org/packages/b7/bd/428e38868382aa193697a5aa53973f29c58e58ba4268aa0c86a2715ee58b/grpcio-1.82.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f853eae07235a51a27bb5d6a9a175a59ca55dc9b99edc6ce2f76f07332d333ae", size = 6889588, upload-time = "2026-07-08T12:36:00.012Z" }, - { url = "https://files.pythonhosted.org/packages/49/ce/03e01d5e10259bf5c08ee50570cc94724e79c956f61fd2f09b341af0956c/grpcio-1.82.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:60b0f2c95337694fc094b77d9f60f50566c84b5677393e342eb98daeee242d98", size = 7514166, upload-time = "2026-07-08T12:36:02.693Z" }, - { url = "https://files.pythonhosted.org/packages/ff/59/278b4b600329e2ba3849f3c1ea3c820b3a01b38a7ad184ba09595e8d2733/grpcio-1.82.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:b064fc444812bdaa9825d33c26f8d732d63ee6a5d78557c1faf92c98687fed27", size = 8536166, upload-time = "2026-07-08T12:36:05.349Z" }, - { url = "https://files.pythonhosted.org/packages/44/27/7ccf2ef00f27a8e47a79d641c8ceaf7d3028c7a03d9a97b4c8a9a783c086/grpcio-1.82.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7d7ede11d747b4e1bd05e3bc0260e155b65a88735a895a10f6521f19b889511e", size = 7912572, upload-time = "2026-07-08T12:36:08.393Z" }, - { url = "https://files.pythonhosted.org/packages/0d/be/33742482d2753f2d3a1b7641664b6622262d44f2f3b609f13425dd86d36f/grpcio-1.82.1-cp314-cp314-win32.whl", hash = "sha256:3d21f19838dc255ecbb79321b15ae9b98fbddff4c3d4aedb0a81bdd7f4ab572a", size = 4321856, upload-time = "2026-07-08T12:36:10.899Z" }, - { url = "https://files.pythonhosted.org/packages/cc/67/03329c847172c78ddeb1eb9be6b444fdbc12775a84c958b27e427e7b926d/grpcio-1.82.1-cp314-cp314-win_amd64.whl", hash = "sha256:e20f1edbb15f99e3128ec86433f9785fd5a451d8f115e74fe0056134f092a9d5", size = 5141114, upload-time = "2026-07-08T12:36:13.595Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/3f/4f/4435c0aae54657258d9cfcba78598f3d9e5fe4c82ff18d78558567b90faf/grpcio-1.84.0.tar.gz", hash = "sha256:19aaf172fc2edbefccce3f6e92c5150975dbe56c45744e9e87cf72ebdf85bfbe", size = 13493876, upload-time = "2026-09-14T06:59:33.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/4b/a0dc421d049b743093eae90caeb5dd92ced7226cd4919dc4de34c81455b6/grpcio-1.84.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:71fd60e6e426d293d0a2f685115ad0a0845117602cf13605a4be7524fb5f7bba", size = 6450049, upload-time = "2026-09-14T06:56:48.72Z" }, + { url = "https://files.pythonhosted.org/packages/f7/41/90292bf55af7aa09de0e3ec928d1b8c56d477f85244f7928d2231630b781/grpcio-1.84.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8e1a45d174b6b8589f51dce1cea804aa6c1f72c9c80cba91ae2caabeb6d90540", size = 12344932, upload-time = "2026-09-14T06:56:51.685Z" }, + { url = "https://files.pythonhosted.org/packages/e9/68/b6c0248266a378b1bde08e4de7d69f3cc08ee6f5937a5dce7d3c3ba0fe1d/grpcio-1.84.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efb29f8633bf6630dc89de4fe0353ac3d7e4b70ef7b6e29fb40f00e68c127fa5", size = 7030162, upload-time = "2026-09-14T06:56:54.412Z" }, + { url = "https://files.pythonhosted.org/packages/70/2b/0a2a2cbcf48847f83eb51fb982116d0965f2fe068e73f28b2d17facf30a4/grpcio-1.84.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d0fdd25faece8a1f95e8a3a8006e29701b5cf8dadb4a8132e68f3134637004a5", size = 7781546, upload-time = "2026-09-14T06:56:56.571Z" }, + { url = "https://files.pythonhosted.org/packages/a6/7c/da97476f3c2e90e9f00bfb19def7cbb5f841b7661e3cd09c6a89beaa5b98/grpcio-1.84.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:393d8a78bff6731ecc5ad2151a821f8fbc1709b137ebb9c25a4ef399fbdcc914", size = 7186279, upload-time = "2026-09-14T06:56:58.817Z" }, + { url = "https://files.pythonhosted.org/packages/14/16/27fa3aed1ee6fdcbb978a1bd4bce255dc0122b90179535177a96543d14fc/grpcio-1.84.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fc66cb50c93554b86db0b6625ab5c6e9051dbf8847c08d93c84918e02e413fb7", size = 7731191, upload-time = "2026-09-14T06:57:02.447Z" }, + { url = "https://files.pythonhosted.org/packages/4c/78/75644af37af85afb381376aef99cad92da8bc2d56ba3e5ae070a7cb59682/grpcio-1.84.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:455ed6083353b8e938f1d58c765eab2fbb165731e5b507be30fee344915a2a11", size = 8790443, upload-time = "2026-09-14T06:57:04.623Z" }, + { url = "https://files.pythonhosted.org/packages/95/4d/ce57fa986e93c06ef867f64e1ebe419e924fdc2395115607f0725f4855e4/grpcio-1.84.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d6a82c4fc6c85f2fb7572c86bdb86f84c97b6580e5f6599f711800bac48a5d8", size = 8138068, upload-time = "2026-09-14T06:57:07.348Z" }, + { url = "https://files.pythonhosted.org/packages/ba/a6/22a73111c4f75da9450bf0481fac805396ec9bf6f949a90bb2969de07cf4/grpcio-1.84.0-cp310-cp310-win32.whl", hash = "sha256:8e3f508d0e9e6236ba2f08d56e33355e434e785e813149a1b8477d3edf69779d", size = 4496545, upload-time = "2026-09-14T06:57:09.236Z" }, + { url = "https://files.pythonhosted.org/packages/31/ff/dc048bc3d8ebd8d4b7f6f6803c76142a9a5ca1e1e9fa34e79597f0f9ed77/grpcio-1.84.0-cp310-cp310-win_amd64.whl", hash = "sha256:ed2c1493c44d0932f1e55fdb5d1ead658c68288ec5d51b8c4928422d98633ef9", size = 5258144, upload-time = "2026-09-14T06:57:11.403Z" }, + { url = "https://files.pythonhosted.org/packages/2d/b9/46146728b3f4a5c7e34c17d0ab724d58b5456b116e76dc77d3ef4e79b135/grpcio-1.84.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:4aaeceeb7fa7d824c322d1ec3208c8495c88478a927295553235435fc49043ad", size = 6454572, upload-time = "2026-09-14T06:57:14.651Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/5d668b4102637410d700153fd12d6a798e3ff8308bd9dcbaeae93f191060/grpcio-1.84.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:06619ba1515e5ee69fb2a514e95dd8be05ce74cb3928d5b34f87f87c86fe3c27", size = 12359529, upload-time = "2026-09-14T06:57:17.202Z" }, + { url = "https://files.pythonhosted.org/packages/18/2a/52e29c02047a493f15a78c0502bde4d3fab7c19c7813944d367cd501811c/grpcio-1.84.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:158c1c11cfb61b4849c3caf4d52de6f5ecd376e14446feb4a90dc95a90d616f5", size = 7029927, upload-time = "2026-09-14T06:57:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/0a/11/9962b313553647abb091943e0721e4a1662ecc63cdfe930abf00abcce47a/grpcio-1.84.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:a9383401d9f116f98cacd4eba6c505a6edb80ba65badfc8e8ed8ae64983bcc44", size = 7782268, upload-time = "2026-09-14T06:57:22.381Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b7/14a9413cb7d4b2e782b4f79c81a918610caedf55138ab5916f5fdd4b002f/grpcio-1.84.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bd8ea8eb3817b226057cc1c0e7ec4b378dcda52043b972b6ff12b1152178967d", size = 7187959, upload-time = "2026-09-14T06:57:24.686Z" }, + { url = "https://files.pythonhosted.org/packages/ee/3b/6cc8e6aed8f23be40f52af341e5d4595ec3ec8d7572271a692b5c1212178/grpcio-1.84.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:756ea5c2da00fa65c930284892d2a9706828704ca3ba40b4c51c4834eb39fcfd", size = 7737554, upload-time = "2026-09-14T06:57:27.5Z" }, + { url = "https://files.pythonhosted.org/packages/3c/7e/6f61002a01802ca9675e1b3599c9b0f9f3cf168ded94ebacc02199309f88/grpcio-1.84.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:28d2609691da93051e998495108bbddd2a9f7a561253bae94828d81290f30c15", size = 8792681, upload-time = "2026-09-14T06:57:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/eb/84/8bec1ae7e6732a9b435a394ddfdfffde46c2620ae0109823f7cce1a54455/grpcio-1.84.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:27b8b36200a9fbee6e120246f4a8a41657549107ef19fb2c819c4b2fd524f39a", size = 8145493, upload-time = "2026-09-14T06:57:32.672Z" }, + { url = "https://files.pythonhosted.org/packages/59/84/c8c7bd210d657288f18af06522f150f61e81ea14fd3c7c135beed697c5fd/grpcio-1.84.0-cp311-cp311-win32.whl", hash = "sha256:465eef3d17e59ad22a556fc0138f7c7c799df426734344daec42c797d49fda99", size = 4495596, upload-time = "2026-09-14T06:57:34.799Z" }, + { url = "https://files.pythonhosted.org/packages/da/1e/da99356b3b573af357d059753a47fba54f1ca1a9c0e4deccd0210cb7f4ba/grpcio-1.84.0-cp311-cp311-win_amd64.whl", hash = "sha256:f9a456bdbed52a01c9ab8423bdebab04a5363c78676edc55ab9b58bd13bdf9e1", size = 5259900, upload-time = "2026-09-14T06:57:37.067Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c1/4c9a2e0e6b0aaf02781404cad2f79211f989f2c827cf672a4a48d1604d3e/grpcio-1.84.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:b5c6f20d657ae09ae4e30d9d3a21edd13f1219d58cc6f999b9d1bb63be9c1baa", size = 6415756, upload-time = "2026-09-14T06:57:39.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/57/131e7007bdee9acb77a8dbe8a16fa9fef75f88c1695242d8ee0993ac2d3d/grpcio-1.84.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:406583b4e8fb2282ebd392e12b963e601c1f82e07125a8c2cb5b144e7e024796", size = 12339195, upload-time = "2026-09-14T06:57:42.373Z" }, + { url = "https://files.pythonhosted.org/packages/db/d1/a7b7cda98fcab9b3d2916204a872d87371158a7a34e41768f524584fb64d/grpcio-1.84.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fbdbcd06986ede3ce584083b1dc2afe6808e8943e5cf50ad11183c03aceda25a", size = 6984468, upload-time = "2026-09-14T06:57:45.035Z" }, + { url = "https://files.pythonhosted.org/packages/19/81/c5be83e3ac9416f73c4c51fe1ea9c41a0c42fc3509e3505faa46f5046abe/grpcio-1.84.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:23e6e8e8a75cff88e0a793bfd3becea03a13e2763ae90c1ff573bc19ca5b429a", size = 7749432, upload-time = "2026-09-14T06:57:47.395Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bf/258cd7c0a7ed92745dc93c31666d462d05b702807a689744bd49fb833bde/grpcio-1.84.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b44f0a0fc7bc6677d38cc80bca1a32814ce6c8f200fb8b3c1a61c9d77eaefbf3", size = 7156115, upload-time = "2026-09-14T06:57:49.657Z" }, + { url = "https://files.pythonhosted.org/packages/2b/4b/7f829418dbfcf91b875e55e2973f1059a95decb4f081313416317ef04ec1/grpcio-1.84.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:210e4c32f907045eb8158273e60c6ab69a3947697df6245dbda381f26c59485b", size = 7708010, upload-time = "2026-09-14T06:57:52.496Z" }, + { url = "https://files.pythonhosted.org/packages/34/f0/9932e2fec6a04205f8bf3f8f4d2020479dcdac88feb6f93822ed31bf0eba/grpcio-1.84.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a71d24f40b0cc6798feaa978c7411dc1135b7018e9fc0442db611c139bf58344", size = 8759980, upload-time = "2026-09-14T06:57:55.312Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5c/b67407c6dbc480dfc0715f6eccdb1061e7c88d85f9a330a241d357a538c5/grpcio-1.84.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f6c972474ce691aca74e58d17625450cef153dc4760364cadeb167983ea6d589", size = 8124904, upload-time = "2026-09-14T06:57:58.569Z" }, + { url = "https://files.pythonhosted.org/packages/02/37/2bfdae2df8dfcfc0df619b628e0c7153ce703adae827243f44720322ccc1/grpcio-1.84.0-cp312-cp312-win32.whl", hash = "sha256:0d532ade4486dad9b302ffa4d4683d67561051c26d17c4023322845e9fa10140", size = 4478915, upload-time = "2026-09-14T06:58:00.714Z" }, + { url = "https://files.pythonhosted.org/packages/85/2c/309268b7b39f6deb2342f634841e105623a0b67982e8b10ec516782ff1c6/grpcio-1.84.0-cp312-cp312-win_amd64.whl", hash = "sha256:49717e857899f4136d7657bf5aded61ac479110a075438290923a4d86af7cd02", size = 5253534, upload-time = "2026-09-14T06:58:03.336Z" }, + { url = "https://files.pythonhosted.org/packages/5d/51/40f99701adb01d4e5316a2aaf13838da1a24d5c879cd8c95156d7c364454/grpcio-1.84.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:209414080da8c20af94df1395b635da52dd57b5edc9e917e1deca0dc1c4bb55e", size = 6427619, upload-time = "2026-09-14T06:58:06.025Z" }, + { url = "https://files.pythonhosted.org/packages/c5/4b/ed8e22a1237e6b2be6ef4f221d074a5b0e0dd8a0da8c944c04aea731f0eb/grpcio-1.84.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:e41c3993eee896c617dbd8a505085d28b6e84a0445ed9a1f40f95808473cf678", size = 12336549, upload-time = "2026-09-14T06:58:08.583Z" }, + { url = "https://files.pythonhosted.org/packages/d3/50/00165b05cd73f45996748ea67ce9e55d08936f2fea94a7fd8541cc2d0e54/grpcio-1.84.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fff5ef3fe1bba7d6147e5f19e01e5e122ac2c076486887ddcb8d42e663400fbe", size = 6989458, upload-time = "2026-09-14T06:58:11.884Z" }, + { url = "https://files.pythonhosted.org/packages/26/38/d0486230e684d916f97429a53041db88410e662a38f2a8d09e2d90375840/grpcio-1.84.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b8c62888c3e49debf37ad9773e3c02f77b0c1e811f8fb0962f2b6c3bbab5b97a", size = 7757778, upload-time = "2026-09-14T06:58:14.849Z" }, + { url = "https://files.pythonhosted.org/packages/da/56/548a643decb059ca244499c675ae2c13a15f523ba94592c2774bd80a13c1/grpcio-1.84.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:986e9751d416d7a6eaa2fecdac38da63153d63a4b340ba7d624889c490451500", size = 7159572, upload-time = "2026-09-14T06:58:17.87Z" }, + { url = "https://files.pythonhosted.org/packages/db/f5/42caac81a79ec680f1f7a8eaf7ca90d2f93936ce0c3a073141ba96757f77/grpcio-1.84.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5933a052946873d01a42119a05420d669bdca436aeba2d1851988ccb12b421c0", size = 7710547, upload-time = "2026-09-14T06:58:20.607Z" }, + { url = "https://files.pythonhosted.org/packages/57/a4/828ad990b2410fee0a55cc73aa1bf98eb5b911c54847374ef4f24b9e877b/grpcio-1.84.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e094dd21f077af8194923fc263cad872eaa1802bb0156fd7e5ae18e99cd86715", size = 8761519, upload-time = "2026-09-14T06:58:23.875Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a5/1f91af098919eaf5d80d5a61126ad9fae074e5190c25a3014ce1d8d0d890/grpcio-1.84.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08735e3d08d24ab3132cf87e2e5dea8746cabcc7d676c2b0b7362f195feef9d9", size = 8121424, upload-time = "2026-09-14T06:58:27.006Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8f/77fd4a7a913b636785479922349c4cb98d94d05d15652e556b3ca0df6663/grpcio-1.84.0-cp313-cp313-win32.whl", hash = "sha256:70bb4ce8be0c5606bec259cbd7152374470396413b7863a658a08c849e6b29ff", size = 4477974, upload-time = "2026-09-14T06:58:29.528Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9a/1fa59ddbfc8898e5518d1447e46f771f387f0ed6132ad531395338e51a5c/grpcio-1.84.0-cp313-cp313-win_amd64.whl", hash = "sha256:b61692f0069b3eee2fc8a3a1b7f6c044df9e03fede6ce69b3ca832e1c39f26c5", size = 5255326, upload-time = "2026-09-14T06:58:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/26/6f/e25ca89ca5b0b7b95464c907a5c21a77c0ac8c4ee1dca164c4dd8f153ddb/grpcio-1.84.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:026d757df86c5b7a41de8200b9a2cda454aaa5004cb0c7e3374c66eb82f61499", size = 6428207, upload-time = "2026-09-14T06:58:34.401Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b4/6b76b429f3f9b901cdbc306c81364d708bc957f847a05cbd1046cd2d05d8/grpcio-1.84.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3de427b05f244ba2c2a9bdc67e7a6731c8340811524ecc4435466549f8af1d17", size = 12342420, upload-time = "2026-09-14T06:58:37.416Z" }, + { url = "https://files.pythonhosted.org/packages/af/64/ac86d638ba7f73bee0dccb608ba551d4f63adf75151f00d2c43e46d3979e/grpcio-1.84.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e90e3bdf7b5eac005fef631adae9cafde16f922def207b80a7c46b253c18ad20", size = 6998396, upload-time = "2026-09-14T06:58:40.535Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/fa12e9ec9d7ebf8cc3e81428fa9e1ca0d30d22d546ce2baa4c64bc917cbc/grpcio-1.84.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e88d304f094f4937bc27ec6a435e218a084168f11ec630c8d5d39b431d08d81d", size = 7757538, upload-time = "2026-09-14T06:58:43.297Z" }, + { url = "https://files.pythonhosted.org/packages/21/d7/94240c7fae121ff1f116dcf04a3b7ee0216a06832c704310363f72638d4c/grpcio-1.84.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:57dc36a5ab0e676f5f6e171de2917fd0aef73f32a9aaf23956bfe19997a30bd1", size = 7161480, upload-time = "2026-09-14T06:58:45.939Z" }, + { url = "https://files.pythonhosted.org/packages/23/c9/7033e95d4b344969818b09185721c7608b47fc2498d97b5e4eec4995dbf3/grpcio-1.84.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5deda5b4bf62769eb98c119cca43d40e1231e34846b19db5cdea821d446a2253", size = 7720191, upload-time = "2026-09-14T06:58:48.308Z" }, + { url = "https://files.pythonhosted.org/packages/95/22/b45df2deba81d55069076859480bae7109c9eec02bce5515c799530cc2aa/grpcio-1.84.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9bab4cf571653a8afffb83ce21aa27b51dfe629b526b7b6adec35491fe1fc2ea", size = 8762792, upload-time = "2026-09-14T06:58:51.068Z" }, + { url = "https://files.pythonhosted.org/packages/de/c4/3e1c3d6155c16b8737cc31d5b477d6cf1fc7cdd10d58320cf0ec9b446f42/grpcio-1.84.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c5559b492007dc09b4de9b95dab05f0b5e53547aad230cf07e46c7dd017a3be5", size = 8123299, upload-time = "2026-09-14T06:58:54.332Z" }, + { url = "https://files.pythonhosted.org/packages/56/fe/f4864de5b815e5ba18858771f99381a398fac14117f89ef5291ed43d3c4e/grpcio-1.84.0-cp314-cp314-win32.whl", hash = "sha256:2c024da73b296f040b8360e60bd73a659b230093684a438da0e1260f34cc724e", size = 4562560, upload-time = "2026-09-14T06:58:56.894Z" }, + { url = "https://files.pythonhosted.org/packages/44/03/640811d4d8c84f5e603995c5a9bab725223aa472cad9ca4286c3bbf1c3e3/grpcio-1.84.0-cp314-cp314-win_amd64.whl", hash = "sha256:800b7e00d92553313c0463c200087930aa78678ec1d528193aeb50906f55989b", size = 5394092, upload-time = "2026-09-14T06:58:59.61Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1a/9e3d2c9f005f680f03308fa894b1db91d4ab3f0fe65ff630c69561e91e95/grpcio-1.84.0-cp315-cp315-linux_armv7l.whl", hash = "sha256:47ecf0d9b81d981f07b61bd89eced9d2582f5eaacc3aaa36ad27f81aef70a27f", size = 6428252, upload-time = "2026-09-14T06:59:02.597Z" }, + { url = "https://files.pythonhosted.org/packages/77/34/0bc9f52ebf091311651eeab3a452fb557985604a3088cb5406f4d6df85d3/grpcio-1.84.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:61386101ecaa096b694d0dd278caf99a56aeec78440cc17e918eef0b50f2d567", size = 12359488, upload-time = "2026-09-14T06:59:05.646Z" }, + { url = "https://files.pythonhosted.org/packages/93/0e/c31052712f241cb6ecae9c226fabd519b7f8c64a7a40bac27e9ca0405b78/grpcio-1.84.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f6d178ba6dc8e82976c184b65fddde172d054c17237993a3e083efe4f134d55b", size = 7019339, upload-time = "2026-09-14T06:59:08.76Z" }, + { url = "https://files.pythonhosted.org/packages/55/b9/b9b33ea4f1eb4cad28833cade604febf357385b5ebb0c9c7562d020e167a/grpcio-1.84.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:15bb76489e337fc492685c9758e2fd4d4ab516b901ad830dc5a91987decf00be", size = 7107974, upload-time = "2026-09-14T06:59:11.568Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9e/799d4c45db91bbdcd8c54b3982932dbcf3d059f7ce67dca3e8540faa1ece/grpcio-1.84.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82da34ae4f639c73ac46e521e00c0a49bf86f717b9fb1f405f133e98731e38dc", size = 7200036, upload-time = "2026-09-14T06:59:14.401Z" }, + { url = "https://files.pythonhosted.org/packages/45/dc/dcfdd13ada41aff9098f0c2c6f260eb7debbc88b84b7e5fcbd085165427d/grpcio-1.84.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:9b73836ba0e16fcbb57c31cf6cbc2907c8d8c790b83679df454b74bd15e0be04", size = 7742281, upload-time = "2026-09-14T06:59:17.348Z" }, + { url = "https://files.pythonhosted.org/packages/55/31/75eab2ec77b80804bc5e21cec99b57598e726fca6484cd3e8920a97639d5/grpcio-1.84.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:42959bd50dd660ffc3f2a9bec15a6da4f9aaa0dda555d59ff2d2e80b908456a8", size = 8113629, upload-time = "2026-09-14T06:59:20.584Z" }, + { url = "https://files.pythonhosted.org/packages/34/f0/fdcf6bdc1df9ca11679a1187bef8e6b81df31a2baae69497e17344f05ea3/grpcio-1.84.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:659728f20fc7a0933ed7b1945435e31014b97ab8a5a7edcbaa70da4794aeb191", size = 8152972, upload-time = "2026-09-14T06:59:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/5c/cf/6720e720bfa80fcb1ace873f66724eb3c8b03bba2fa078a30c12cab3212e/grpcio-1.84.0-cp315-cp315-win32.whl", hash = "sha256:edb6f87fc60ff438557291501b3e16c7a77c3b01a52d782cf276dccc7c5dd89c", size = 4561981, upload-time = "2026-09-14T06:59:27.275Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/69d8a709df225bc2e06e028e9465166b174c24b3da07cc72d9a5ddc63194/grpcio-1.84.0-cp315-cp315-win_amd64.whl", hash = "sha256:4119efa6519871719ad81f33bc95ab87857dcb1c5801f30a6e592f2c41164169", size = 5394757, upload-time = "2026-09-14T06:59:30.118Z" }, ] [[package]] name = "grpcio-tools" -version = "1.81.1" +version = "1.84.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, { name = "protobuf" }, { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/b3/1c5951352d6777fd7f99a0ccee04617fdfd8a5dbf2918a1f58c8b2b280b8/grpcio_tools-1.81.1.tar.gz", hash = "sha256:a22a3870180927fdd84e2b27d079ef5b7f5f8c6110181b6736afc17a463481f1", size = 6236155, upload-time = "2026-06-11T12:51:21.235Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/e1/1fcf884902ae7255d8da224cfa638ea88a46d50f62a33d06d35c8960b029/grpcio_tools-1.81.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:9b6ba8a72cfda576508701a7c0bbeebe6f6f9843320d4f12e74efd19ddccd965", size = 2586261, upload-time = "2026-06-11T12:49:21.447Z" }, - { url = "https://files.pythonhosted.org/packages/a2/d7/1815110b2d40ec99dbb0a7e6d7eafd591cd1f1e9bf9d3858cd9cf3ffacbd/grpcio_tools-1.81.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:ac47a9ea1224df8b653072614e6f0207e9fbfe63fdabaa5918a60ca5fc931b88", size = 5817509, upload-time = "2026-06-11T12:49:25.958Z" }, - { url = "https://files.pythonhosted.org/packages/23/e8/af99579842b5a555312fa782f32ce0f99bd35b2b7a1243294b2755468857/grpcio_tools-1.81.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eac4bb645ceff0c147cc720a40ae68f97427eaafb4968e866dd8fcc20d3d4831", size = 2634112, upload-time = "2026-06-11T12:49:27.937Z" }, - { url = "https://files.pythonhosted.org/packages/b5/cd/235ad56ac728c49c17e9218c4daccd5831e6ec7af94236bec0cc66c71c68/grpcio_tools-1.81.1-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cc410b621dd85193766c12dca2e238696199a27a65d2b31b6f0a4c6c0043ff26", size = 2957950, upload-time = "2026-06-11T12:49:29.619Z" }, - { url = "https://files.pythonhosted.org/packages/77/3e/9103e8b4610597bf89db49eb112091c91bf5d63ddef2a951e11a4be05f2b/grpcio_tools-1.81.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b62d254c214faa3773eac709376ae25cf7abff1a76ba5fc4dbcd7b14fc4e4ae6", size = 2697765, upload-time = "2026-06-11T12:49:31.702Z" }, - { url = "https://files.pythonhosted.org/packages/3c/86/beb2a43fbb93570a2305696083f6736566301d957869f463308ec6839f95/grpcio_tools-1.81.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd0b68dc76b10b3384b9b6e9f59202b83dcaafd8098eb644759a69316686acf8", size = 3147588, upload-time = "2026-06-11T12:49:33.748Z" }, - { url = "https://files.pythonhosted.org/packages/af/4d/b0182d9948631cd837a372b6625cf59d6e335d4aab0f425d4b7306619074/grpcio_tools-1.81.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a28d231455ab6e3558299f7d831a73c8be8ee6b7ec614ecf39eb50c0ed15767f", size = 3708798, upload-time = "2026-06-11T12:49:35.979Z" }, - { url = "https://files.pythonhosted.org/packages/23/9b/f452a189d399051d85cf82fe2f27a070efaa52512a2c5e3ae6ef1ae99a1f/grpcio_tools-1.81.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:82740248eb6f3b6a38988cb5e64adb7303af9ea5cb4197c8ed08c1fabc767440", size = 3366969, upload-time = "2026-06-11T12:49:37.911Z" }, - { url = "https://files.pythonhosted.org/packages/9b/48/0075cb4f6ae7db280f461de2dbba700b22ae62e351ae13e6e461cd6804de/grpcio_tools-1.81.1-cp310-cp310-win32.whl", hash = "sha256:801d9d8ab5cddf8f8e064225292f0713427011252a07828a6b54e2ed64d534de", size = 1008713, upload-time = "2026-06-11T12:49:39.791Z" }, - { url = "https://files.pythonhosted.org/packages/17/bd/7692bc698259e5645b68720e77e7b176d376f6ae0c9db8b5b750a02f1958/grpcio_tools-1.81.1-cp310-cp310-win_amd64.whl", hash = "sha256:3c8611d6e4e859ac5373422ef27c4b7540cf98c9991c9abc6722613ef72b13aa", size = 1174752, upload-time = "2026-06-11T12:49:41.43Z" }, - { url = "https://files.pythonhosted.org/packages/18/76/14ff87090199a36f914388299a1148d0734a20cea1b0ca8480bae1f373f1/grpcio_tools-1.81.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:8161f398f957a376cae7385ea7c8684f439d460ef702b528912da3bcb31fc515", size = 2586251, upload-time = "2026-06-11T12:49:43.514Z" }, - { url = "https://files.pythonhosted.org/packages/87/a8/d5aa99de9d8b2dd2a8192c1779796eda8b0d0f1dd915422e0a8a61b80391/grpcio_tools-1.81.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:53ef76cc3b0493ff734a5e8c39d5b519e1822236fcccdfe7677c5e1efd767761", size = 5818063, upload-time = "2026-06-11T12:49:45.975Z" }, - { url = "https://files.pythonhosted.org/packages/ba/cb/2e9a6dbc6a514dd3cd264fb3bf9217937453a4d45dbc3ca6ca4ee34ba1a7/grpcio_tools-1.81.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:690e6dcaa8b8a7886ce206ba344e2127211597e1a1ddab73df9f3d80c8f6707e", size = 2634061, upload-time = "2026-06-11T12:49:48.13Z" }, - { url = "https://files.pythonhosted.org/packages/c8/2b/2ccd1a929e6c8ad84a0aa8d66ad9f615b4a8e79d9927373d86aa36b4ba2e/grpcio_tools-1.81.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ad7a997c07bd345e84842e60561e7e2cc090ce6c4e1d2f0407e31b85b40fc49a", size = 2958029, upload-time = "2026-06-11T12:49:50.466Z" }, - { url = "https://files.pythonhosted.org/packages/e7/67/2da8cd312edc348f44f26f82096b25cdb7d2905cd786acc6bf777b169502/grpcio_tools-1.81.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b6bd163ece4535726e5292b845ed80ae9b2cae73ba091c7d6c66033c430e3857", size = 2698031, upload-time = "2026-06-11T12:49:52.292Z" }, - { url = "https://files.pythonhosted.org/packages/d9/ba/ad1680fbdf9317c4f1e54c37c96d1f422370df66ac9adbd175c7cb3531d7/grpcio_tools-1.81.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2baa7e735f35b2a648144c03348a126097b13e101d3c242d5edb6ac91437ccbe", size = 3147541, upload-time = "2026-06-11T12:49:54.43Z" }, - { url = "https://files.pythonhosted.org/packages/57/c1/57cd08eef293d713cb8935295e4f08d8f0013480b2ba3aad1af0271eb7ba/grpcio_tools-1.81.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1d602b410b2b2addc434cace9ce4fe2035974a3078228f98ffa049a5c90acc2f", size = 3708524, upload-time = "2026-06-11T12:49:56.544Z" }, - { url = "https://files.pythonhosted.org/packages/52/31/01ea8ca9c82fe2c79b5b594c3ae427d56699bc106b2d91caca129add8b10/grpcio_tools-1.81.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f8cb64f87c45ccca8234fa47e6b21f09e43801ff11b556deecb461b3b3e9f292", size = 3367022, upload-time = "2026-06-11T12:49:59.608Z" }, - { url = "https://files.pythonhosted.org/packages/7d/35/8140cd175602df3d17215cfb28a7ea55b7a67e2b872be76e1ee4af5c4df9/grpcio_tools-1.81.1-cp311-cp311-win32.whl", hash = "sha256:87b25ca0e27373a4a32a629a4ba976f5764b9887dd50d6fe017d38009a0363e8", size = 1008980, upload-time = "2026-06-11T12:50:01.422Z" }, - { url = "https://files.pythonhosted.org/packages/be/86/1bd29ab3c52457702b96536f1f208ab27695322d855f95c9666dfb713019/grpcio_tools-1.81.1-cp311-cp311-win_amd64.whl", hash = "sha256:204de03b539a4b08772c6553b92bcc112cbc965e0ac22f909f6d133b8ac33a8c", size = 1174840, upload-time = "2026-06-11T12:50:03.408Z" }, - { url = "https://files.pythonhosted.org/packages/3b/8a/824a9ca20bcdce8a568bb8c9f98bfeb7fad62129235e6d2ae7576fd1250a/grpcio_tools-1.81.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:353b1fafcc739c31ed42271052709595b340d34f27c459beeb78a32938305bb5", size = 2585927, upload-time = "2026-06-11T12:50:05.671Z" }, - { url = "https://files.pythonhosted.org/packages/2f/35/e5f9f671378b1b89a896150d3e4fa2c6ec61a5e1e9e5107ce4c140ccc931/grpcio_tools-1.81.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:768f584c2423cbeb6cb6867817a39365b987ff16b8259a3adbc6546b9e303a4e", size = 5815665, upload-time = "2026-06-11T12:50:08.178Z" }, - { url = "https://files.pythonhosted.org/packages/c6/02/631b628e4072e988c669bd8f1b2406ef3c9a4cfcb2625bbf2a308a07b71d/grpcio_tools-1.81.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1680b35a84f4694401819ac4acac42dda6dbc7bb8fc74112fd1a60425a07adf4", size = 2635518, upload-time = "2026-06-11T12:50:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/de/7c/2e3537e3ea3d1c0ddd6766cf6a7c62b487d89fb005713df2781d5f21483a/grpcio_tools-1.81.1-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f64e665c8ec639278ecf009beb92cbdcc5994f617c1af3d58036e1f70b1423ec", size = 2958252, upload-time = "2026-06-11T12:50:12.677Z" }, - { url = "https://files.pythonhosted.org/packages/35/68/14013cb2942bdac354746b643b4c37dd91906da8dce00f41c616e88bf33d/grpcio_tools-1.81.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba8f1ae82ad199f43448995715445cc623fb20d3882382e4be61f0da8ccb3f0e", size = 2698439, upload-time = "2026-06-11T12:50:15.017Z" }, - { url = "https://files.pythonhosted.org/packages/bd/45/000c14c0338a7ad36054b9f17ea41842deb7841c05c067dd36cc831bc0f4/grpcio_tools-1.81.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b7b6d1e986d5923751bfe2b5cca9c4cb3d5653446e4fa4aacd438033e2dc360a", size = 3152160, upload-time = "2026-06-11T12:50:17.3Z" }, - { url = "https://files.pythonhosted.org/packages/41/97/881930ca3967d2c8a95649bea8ebc991a7cf2331bc96679fd3600450dccc/grpcio_tools-1.81.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7f208c207aca639dcb34648d3826c38d7cf3485118fb2065117e9fc4827406b3", size = 3710468, upload-time = "2026-06-11T12:50:19.479Z" }, - { url = "https://files.pythonhosted.org/packages/c7/b5/67baeba7366162652cdc1dbd962289accde07241bc8f42f6f02b305efcc6/grpcio_tools-1.81.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:724ecb69af63d2f6d4ccea3e6fa0ca110ed9c5824d48c2f887c631bbb03c1c3c", size = 3370797, upload-time = "2026-06-11T12:50:21.501Z" }, - { url = "https://files.pythonhosted.org/packages/f2/5d/34f2dce2125ccb107e32b57f5a9c1257edcc0793b0d2fef1e8b13a6bac3c/grpcio_tools-1.81.1-cp312-cp312-win32.whl", hash = "sha256:895a6782cec86beac71ccebb4b9848259c6f04a3028b8e42fa8d40cfe5146593", size = 1008453, upload-time = "2026-06-11T12:50:23.358Z" }, - { url = "https://files.pythonhosted.org/packages/8a/be/09da8256ec8d2a5ce8a1acc51cbbc4ca52a462d78ed3412778440a56502e/grpcio_tools-1.81.1-cp312-cp312-win_amd64.whl", hash = "sha256:0265fd1386b7458302f79542558345880d484f8fa92ae196c0c0268242c5f23a", size = 1174857, upload-time = "2026-06-11T12:50:25.685Z" }, - { url = "https://files.pythonhosted.org/packages/76/90/5faa8b26e03495e5117f93bef8293cbada4af136362745dad7d1813ef0b0/grpcio_tools-1.81.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:3d604b4fd114b79ebb9f865bf3e04fd3ae93c704e1fad96f7fd03b0865c263b7", size = 2586071, upload-time = "2026-06-11T12:50:28.4Z" }, - { url = "https://files.pythonhosted.org/packages/e8/9a/85dc589fa6ae2439451eaa81a1578de31e29c676980d38bef7549b8a1f45/grpcio_tools-1.81.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3389e705460efa3f3758141ba5520e6743b131c9576197c944fb9cbe49048126", size = 5813299, upload-time = "2026-06-11T12:50:31.295Z" }, - { url = "https://files.pythonhosted.org/packages/77/fd/c53994e58a837e6eefe48f53eb3492afc04f2b8af255df4adb37d14378f8/grpcio_tools-1.81.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8a17d8ceeb6a855fadf39f5171c80a382d97c4db98d5943eca553497fdebf84b", size = 2634668, upload-time = "2026-06-11T12:50:33.938Z" }, - { url = "https://files.pythonhosted.org/packages/34/32/de988e86688686a2117e7ce6ce9eff4f638c929bb55b0afe60d6fbd2e45c/grpcio_tools-1.81.1-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:43baf71dc60fd653062da2e95e95c73b35dd130be8f9fa3d544c3af3f808a290", size = 2957930, upload-time = "2026-06-11T12:50:36.726Z" }, - { url = "https://files.pythonhosted.org/packages/72/97/3f18a0ea32b5f809d21961dbd0bc382b589a4c3d501e3d67c345d5456ed3/grpcio_tools-1.81.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:136e90906af0df51ad929713244ba812d0dbb1844b4f467d5d86bdb054698f90", size = 2697760, upload-time = "2026-06-11T12:50:39.108Z" }, - { url = "https://files.pythonhosted.org/packages/49/c0/dbf5cbc877290ff7504a59959a8af4fdcfdaa1e84237948405ccf1aa82a6/grpcio_tools-1.81.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd6c3bf3ea6a61eb58c54368d72ada591f2a270f3a31a32e8536e773337e76d9", size = 3151456, upload-time = "2026-06-11T12:50:41.983Z" }, - { url = "https://files.pythonhosted.org/packages/de/ea/16fe2dc83140a59e5c0a0b9dc2693dd36bfaa6bd835724b4ec66a68eab7b/grpcio_tools-1.81.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c306c307f8f74cddc4056fdbb6f1da55de087a21120efbd02bd915daa5a52fd", size = 3710469, upload-time = "2026-06-11T12:50:44.596Z" }, - { url = "https://files.pythonhosted.org/packages/22/7d/df987d7d81e7ad2f7516d9e9d56ff29c54dbc6d8587e425688dca9a28e49/grpcio_tools-1.81.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bdbdc927be2e0ea13c32564a72ee31d712a716fb6f8c0d53d37a77d8277c272c", size = 3370488, upload-time = "2026-06-11T12:50:47.199Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c5/5a63444d694ea47bf670138208f71830cc1759c402c8818092b28ab2dc5f/grpcio_tools-1.81.1-cp313-cp313-win32.whl", hash = "sha256:9d383724bcd67244b6def9e9164c640ee9380c0b7534ee7545a6fb0022a59afe", size = 1008229, upload-time = "2026-06-11T12:50:49.527Z" }, - { url = "https://files.pythonhosted.org/packages/00/75/3945e26d5c94ae6ed9be5caef73d4d66c47dc8cfdd7b4995efaf942754e0/grpcio_tools-1.81.1-cp313-cp313-win_amd64.whl", hash = "sha256:f3eb15849979ca7bb864ce81a74d68b0f225a7f111ed3fe212bfc08cf9812b10", size = 1174523, upload-time = "2026-06-11T12:50:51.755Z" }, - { url = "https://files.pythonhosted.org/packages/0d/08/e581ad42ae517a61172285047e4d710e2ac75f2f1915f7c91f284254e6d5/grpcio_tools-1.81.1-cp314-cp314-linux_armv7l.whl", hash = "sha256:7d168ea26390717d0462c0d0408331dc98a60fc7f7e6118afac9b73f5a66d87c", size = 2585944, upload-time = "2026-06-11T12:50:54.528Z" }, - { url = "https://files.pythonhosted.org/packages/78/c8/200d90ebad685af7eea5ff7e0360c504dd01ec053fe0f1f9c4abe3ea2d5a/grpcio_tools-1.81.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:43c528655b226375013036692d8db4cd59060c1f41dd62c77f4d17b69f6ce828", size = 5813492, upload-time = "2026-06-11T12:50:57.291Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c0/60da2a1af37aa8eb47308cec24d9f7709a8976fdec3a53fd35b56b358326/grpcio_tools-1.81.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a9c6fcc68c9d5a208967bfe4fd3224d3c3be9a950c3e827e8f4b17e15c2dc555", size = 2634991, upload-time = "2026-06-11T12:50:59.767Z" }, - { url = "https://files.pythonhosted.org/packages/0c/7f/dede28b579ae9bf9079ba1aa913e8088d1dc0cdbe21c85caa22f0790cad2/grpcio_tools-1.81.1-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:a987c85dcbe1b32066d7acd46266d1a428aecbd629331bf5b853e74c835bf876", size = 2957913, upload-time = "2026-06-11T12:51:02.31Z" }, - { url = "https://files.pythonhosted.org/packages/4c/38/4de2118adb58ec7ffba65ec623b5836db769665c192517cbf187db3f6145/grpcio_tools-1.81.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a882382507bb5ec6d7edc9648053dfd3bc8f9285cde56a6fa9b9a83b4bd07f1c", size = 2697709, upload-time = "2026-06-11T12:51:05.016Z" }, - { url = "https://files.pythonhosted.org/packages/6b/e1/762ced51059e4f694fd337ecae491581d42a4e61dcb0415d8c5c60e6ddcb/grpcio_tools-1.81.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7746e508d4239a02f7e93638be5bc0ebb0120ddb796f7506aaae9d47a4599d97", size = 3151884, upload-time = "2026-06-11T12:51:07.593Z" }, - { url = "https://files.pythonhosted.org/packages/19/d8/9823090dc801e7229944874e7429c3b98e741ac778d8dc373f60240e1c43/grpcio_tools-1.81.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fc3d2a41a7a4467fa03b391394fffada9291fe8feebc8679b526f6bc36942b25", size = 3710404, upload-time = "2026-06-11T12:51:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/64/4e/4eae98d02148cb6f9f452f09942afba407afa6851e6c1fddc5ae9ec0b4ed/grpcio_tools-1.81.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:21bb3ba90e6d8df1ff663d4ee39a4e5b25a64e8ed4902476ca9ded0954d3917a", size = 3370525, upload-time = "2026-06-11T12:51:12.678Z" }, - { url = "https://files.pythonhosted.org/packages/e0/3e/2206e597a128da6a03a6106d2eaf2c3e72c7d80843d4be933e3a3d10d02a/grpcio_tools-1.81.1-cp314-cp314-win32.whl", hash = "sha256:3dca56016d90a710c4d9861bae793dc089c1430a90c79ce672e948ddb65fa539", size = 1030582, upload-time = "2026-06-11T12:51:14.906Z" }, - { url = "https://files.pythonhosted.org/packages/cf/f2/bbeef86c687225b7bbc7c0acdfbd25c8bcaa3f5b1c941db053e5c3d9e859/grpcio_tools-1.81.1-cp314-cp314-win_amd64.whl", hash = "sha256:cb08172b7b629e75cb33866928d319a3196540a725eaab628ba721007140f1af", size = 1207490, upload-time = "2026-06-11T12:51:17.598Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/cd/db/a5dba38d7ff7711d1ad05f2b43751bd0e9f234fae7c89df1846a9de034f9/grpcio_tools-1.84.0.tar.gz", hash = "sha256:210ac5ac9803569490ec33574b7e995bc087815b00d9b777e0134cab5ed9a379", size = 6401750, upload-time = "2026-09-14T07:03:45.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/db/57c19dd36921967f207a072b31c8b118a498077a224c4e611173b523df69/grpcio_tools-1.84.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:5157688cab3488d89ec986a6bbb0a9886ec655d4f854fd2c1099cf6d5be83646", size = 2652630, upload-time = "2026-09-14T07:01:10.444Z" }, + { url = "https://files.pythonhosted.org/packages/af/2d/97d424455bc00e65a1fe6302b8b4cdd7a54d6699cf0a475a853f9b5d2008/grpcio_tools-1.84.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:48bd8ea0acfb7b15eb3f8fc28294ad9300bd10ab3d42a743a08f87506d9e5098", size = 5967266, upload-time = "2026-09-14T07:01:15.743Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4f/85a020052de481403d47e69b770d5ac753cd75e4954668c13815f315af85/grpcio_tools-1.84.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7103c628a87f8dad1988ef951a66c9077866349053e4ae462bfbc9f91c7ad8f3", size = 2704488, upload-time = "2026-09-14T07:01:17.73Z" }, + { url = "https://files.pythonhosted.org/packages/20/88/7ad7394ed55a825638f4ac9fae9b48d7e17735e9cf98ef72fdcfaf62da2d/grpcio_tools-1.84.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d1cafe92e8742188dae258dc20fb1133a35f9b09f80ef4e0368a558561b3a04c", size = 3032304, upload-time = "2026-09-14T07:01:19.46Z" }, + { url = "https://files.pythonhosted.org/packages/c6/54/9ac98578948edc3f5560b50cba0ec8ab6bb815926e636f3409509b55b2cc/grpcio_tools-1.84.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:036de16c1eb8e516740e0040e721fae73d459a5a5ca4dfb747b6cc095cf7a750", size = 2773921, upload-time = "2026-09-14T07:01:21.468Z" }, + { url = "https://files.pythonhosted.org/packages/32/96/916f88c5884d8683bf01725c9840def4875c33f98f7cf6bcc9e82aae6044/grpcio_tools-1.84.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2643e748ce319fe75b703f42875dc42b203577f8e3e223d1ff73f37c7cfda748", size = 3226531, upload-time = "2026-09-14T07:01:23.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/25/9fde9350720ee37157989bab282fd6d330f4c4975ad19da72f2d3412346c/grpcio_tools-1.84.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fe0ef1f19790d7cefe563c4f533bb0a5b88135661e32aef7661e76a9f271d384", size = 3798916, upload-time = "2026-09-14T07:01:25.776Z" }, + { url = "https://files.pythonhosted.org/packages/9c/88/774f0ffa9abf36cef647440e76bec7ae1a35ecc4822dc59476c050d59d47/grpcio_tools-1.84.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ed58186650b7e7a6f48e6fc1aac2ec8440a72d4d7fc7cf2f6ae33878da7f2d6", size = 3457754, upload-time = "2026-09-14T07:01:27.831Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b7/69f71771d4e1bc67d4ff1c07c04b69d5d5a8424781129c4ca417c7f389ea/grpcio_tools-1.84.0-cp310-cp310-win32.whl", hash = "sha256:8d677c2beae4ab02d2ae4caf0241be18eed5301757b23f1544b133c6961c4035", size = 1022560, upload-time = "2026-09-14T07:01:29.654Z" }, + { url = "https://files.pythonhosted.org/packages/ec/8c/54bda326a2d283190f324d44d03195de4810595f7ba7ab5f3613cb63f1c1/grpcio_tools-1.84.0-cp310-cp310-win_amd64.whl", hash = "sha256:a2c00d4230c592dee120458352d846df083d7bc6198150f3b66a3005d586501e", size = 1192121, upload-time = "2026-09-14T07:01:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/81/62/518523308771b181cc836fe2533ffa65efeab84c7da23853240559b3959a/grpcio_tools-1.84.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:409de83da5c3526a3c8b8b880a8c4c6b23fa9b9f71a373e7f7c2c5f16ec8f30e", size = 2652835, upload-time = "2026-09-14T07:01:33.381Z" }, + { url = "https://files.pythonhosted.org/packages/09/de/27bfd92c335182dd89609449f5bb51d6ee8849fa0d0a11215d3baf8f6e42/grpcio_tools-1.84.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8ece6d87168415125091fa74f7ddd1eb3e5dacd840052fa14b8c004d314798f1", size = 5967921, upload-time = "2026-09-14T07:01:35.844Z" }, + { url = "https://files.pythonhosted.org/packages/69/fe/675a69c7916c6c03cdf5a0c4dc43d2541f08bf33269b4f9bba59beab95c5/grpcio_tools-1.84.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ac91151e7cf75a30af09aee29a9fc900e9d891323811da1a55ac985cbdbd33a", size = 2704869, upload-time = "2026-09-14T07:01:37.828Z" }, + { url = "https://files.pythonhosted.org/packages/02/43/06ba2fda64118eef7691a948fee2fae37ab623a5b4ac2d44a5fc5e4ec50c/grpcio_tools-1.84.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:090c9310a90a63fb2c3c55adc75e35f37659eb2793eedd5951f7690aceff15c6", size = 3032321, upload-time = "2026-09-14T07:01:39.907Z" }, + { url = "https://files.pythonhosted.org/packages/97/2f/c2183306869d8a67c93047e65463b938991af63dcdd83e0204b36d994e18/grpcio_tools-1.84.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc99764d6091d0ec609277d0fdbbc70e9b4acca8f371b7157249162a2d7c0a11", size = 2774120, upload-time = "2026-09-14T07:01:42.341Z" }, + { url = "https://files.pythonhosted.org/packages/d5/33/649bc42798c523e67b568e7d95d4937a5d77701fa42808d80d12aeb779f1/grpcio_tools-1.84.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c54d4ab6c675efa1f5cedfbeb8f9ad3e69b1aee9e2a2b233c02d0e4cfa045ae0", size = 3226721, upload-time = "2026-09-14T07:01:44.602Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e0/982da24d9f3b055c671b4c8290a02af8bb361a2b405e34a907fda4cc4e98/grpcio_tools-1.84.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f99c5c5349ceff85a0f969281d14a5e9c3ec64cee4bc9af27047a58c1fd99c87", size = 3798997, upload-time = "2026-09-14T07:01:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/48/d5/298119f4c8035329031c687f43c607f6169208e71a1cc4861973c57a8065/grpcio_tools-1.84.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b71d9d1807948271e5d185267db972057d09aaf2d56b4233bc00a081297ef958", size = 3457776, upload-time = "2026-09-14T07:01:48.978Z" }, + { url = "https://files.pythonhosted.org/packages/65/c2/37e211a88ab5e22875bab9543c508d206204f02359dde67cebf034154125/grpcio_tools-1.84.0-cp311-cp311-win32.whl", hash = "sha256:d704ef81507c7e86bf2dfed211b0d03758973240a9273f7ca7b577bc8a2a3084", size = 1022797, upload-time = "2026-09-14T07:01:50.873Z" }, + { url = "https://files.pythonhosted.org/packages/8d/dc/de9fc8567a95ba8448f430cba11195ed0ada811423c5a108e723f0cb39c0/grpcio_tools-1.84.0-cp311-cp311-win_amd64.whl", hash = "sha256:d96f12f3a4e5af091e7a3450de5f96825959b02720cd7d4732c992a97196540a", size = 1192474, upload-time = "2026-09-14T07:01:52.782Z" }, + { url = "https://files.pythonhosted.org/packages/55/f9/ad0fc599f687227569fb0f37695ad0b66b6c515ca4b938df863f1efb1109/grpcio_tools-1.84.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:bcc3b6f41e02d77e519e6e4f114f7ab5a22815acd9b6a3c8965417df36938de3", size = 2653285, upload-time = "2026-09-14T07:01:55.305Z" }, + { url = "https://files.pythonhosted.org/packages/c0/14/cc6e137a4fea4cf35b115c22e99be391b446ac002cd8742e8d97ecff5fd4/grpcio_tools-1.84.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:9315344bed77b08c155672ab2d77513e1e8a20fd2744ab0bb72647e22bc900ac", size = 5965932, upload-time = "2026-09-14T07:01:58.431Z" }, + { url = "https://files.pythonhosted.org/packages/85/7f/602dffdd92363c6b28959502eb97badcf28176c501e3f8a26d30d6893d31/grpcio_tools-1.84.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a83ccb3f47f841d92f04fd35ed1f8b094e2a92c33ae41f26732e970e0361ff14", size = 2705432, upload-time = "2026-09-14T07:02:00.882Z" }, + { url = "https://files.pythonhosted.org/packages/55/1d/7a7bfd74fcf34d96995a05f03f9c01305f64982c6e53296363fe2d8f9911/grpcio_tools-1.84.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9b0f4aa6fd1a72e2048742016da37cfa773394ee2b96daef6e6ef38a02eabea6", size = 3033412, upload-time = "2026-09-14T07:02:03.246Z" }, + { url = "https://files.pythonhosted.org/packages/74/18/d9fa4b43c4974094a9e720e97fc90fcba1908f8c806b36eefabf6c148d88/grpcio_tools-1.84.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc1708de3ba6cc46eff02de1aea865442418167794ca963a2cf6ea2013930146", size = 2774501, upload-time = "2026-09-14T07:02:05.329Z" }, + { url = "https://files.pythonhosted.org/packages/2b/23/0458fb717829008b4c2160e37b2e4d6d7c31ad8c8b2ee411819f682a929e/grpcio_tools-1.84.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:45e38ee36a131ad1123b2741e045656419551efe52837a4702e09daee339fbcf", size = 3229874, upload-time = "2026-09-14T07:02:08.973Z" }, + { url = "https://files.pythonhosted.org/packages/af/5a/e955b667d7fb2a8746f62342a108008798a333d3824b3d28b0c5d8034613/grpcio_tools-1.84.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a87275c13a9e6027d164494483027b9b08a8b9f6176108cb27d4bc13c8cbc720", size = 3803163, upload-time = "2026-09-14T07:02:12.006Z" }, + { url = "https://files.pythonhosted.org/packages/08/fe/be66ea5d0962793156cc6e29da40e80a4f6ec12371564e6ba7237f8427e6/grpcio_tools-1.84.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:602453d5a04f74ead2077064249fc462bd4a93a1d23cb9f2c89cd254ac170ab7", size = 3461818, upload-time = "2026-09-14T07:02:14.099Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/9ecf7738075039348096a4cd739f0e994bbd28ef288f5bde68891739f22c/grpcio_tools-1.84.0-cp312-cp312-win32.whl", hash = "sha256:13a7e252569e3d2b3496fad5439a5f02f9f8d3454e66c5177fb3127342635c57", size = 1022489, upload-time = "2026-09-14T07:02:18.338Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2c/599ce7a1d0c9c232bde27d327d605d72f07437e0e665ca8153d499557367/grpcio_tools-1.84.0-cp312-cp312-win_amd64.whl", hash = "sha256:848338ebb0f1bccaf15c09d3905a2bda5907101ca2c88ed411c4ae707615f8ac", size = 1192285, upload-time = "2026-09-14T07:02:20.492Z" }, + { url = "https://files.pythonhosted.org/packages/c1/58/688e987d701d3673e6013adeb7c3d40f5886a79bc5fe3d2c462f13447cf3/grpcio_tools-1.84.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:7a34eee4038b8a92c4d2bd56ff6a68b7debb0e80fdd9a1f2dc77895525da2bc3", size = 2652846, upload-time = "2026-09-14T07:02:23.065Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/fbc0a4d4234e7b7622bbeae07da6c4620a0baf2a9764f1d0728a12f0d2fd/grpcio_tools-1.84.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:131cc59f5612cc6d2b7f83adea3177eb85a0b52196007c555e7d80bb1d0b2b97", size = 5963562, upload-time = "2026-09-14T07:02:25.956Z" }, + { url = "https://files.pythonhosted.org/packages/66/55/41dc86dd98fb5a8b620e47d2343030243bf80411d8da372ee1554c75b667/grpcio_tools-1.84.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b8c6d43a94a22a4a4630b112366fb01bebd4e3e2ac7519ee171268c8804f4e05", size = 2705097, upload-time = "2026-09-14T07:02:28.344Z" }, + { url = "https://files.pythonhosted.org/packages/58/45/7a7c5e80a122990d61b0ff6603d3aaf1952de1faf4b2d2e7a6445d5bd894/grpcio_tools-1.84.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0130a41b311c5352fa7ab1e21da63b59db0af6559205d41c384099fc4c59f0be", size = 3033063, upload-time = "2026-09-14T07:02:30.636Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a8/169ee6a6eb3225892c6be243452161b016f3bbd93fc555857dbb70d5939c/grpcio_tools-1.84.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fad2e65eed6e98ca01046bd8a47e446c7f760af89f2a958a497d61da203f9fd8", size = 2773655, upload-time = "2026-09-14T07:02:33.092Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c1/41f67a4ce7c221810d515f7c384e2efbe3b547209b6686c018e9a4e54375/grpcio_tools-1.84.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:770f7c400339350e47abca5a874e5ddce9dfb313e9994af79af52482862bcb38", size = 3229788, upload-time = "2026-09-14T07:02:35.493Z" }, + { url = "https://files.pythonhosted.org/packages/bf/64/dcdfb115bfc0fa1c2659fa48c8b743cdb45d74c93d5e1a490665152ce068/grpcio_tools-1.84.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ee0609bc149bfe0b0e974ad2c3b30facc8fde16cb6c142ebaf9b5c3ffb428f97", size = 3802534, upload-time = "2026-09-14T07:02:38.172Z" }, + { url = "https://files.pythonhosted.org/packages/cd/47/2f36195b5c59cab8b8388c0e9d1383dfbc48a816db033789bd96692ab3d5/grpcio_tools-1.84.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cf4be6baf5f932950ec24c8ccd9284b6fa46e5b275aeb4789d7fe50a8452611", size = 3461034, upload-time = "2026-09-14T07:02:40.764Z" }, + { url = "https://files.pythonhosted.org/packages/07/99/2956e79ccf82f225fe4e03835ff72bd673a95cd0e1541259b3964ffc2214/grpcio_tools-1.84.0-cp313-cp313-win32.whl", hash = "sha256:bd034763ecf817c3e97a9aeb1e5c5006389c06644973595af5f3a32a1e738c37", size = 1022115, upload-time = "2026-09-14T07:02:43.1Z" }, + { url = "https://files.pythonhosted.org/packages/71/01/89a1d1f00801f892142ed31f28a2f325ce682b02bc294abf2ea8e951d205/grpcio_tools-1.84.0-cp313-cp313-win_amd64.whl", hash = "sha256:2d1e701bd77282618e76898b7dfe05094201c679ccb0b321fff2985d0fdb2e3f", size = 1191934, upload-time = "2026-09-14T07:02:45.829Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e4/a6b28ea267d0eb19d36543561bd38deb33cafa663c1b9aa78f83a3cb044f/grpcio_tools-1.84.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:b648d986c5465ea6b2df5457401bf5f27619394c889e688d6e67a453beb0db1e", size = 2652843, upload-time = "2026-09-14T07:02:48.292Z" }, + { url = "https://files.pythonhosted.org/packages/8f/64/3aa9f40934937acc73d18e241735ecf98e91e8522fb50308aa625238ee54/grpcio_tools-1.84.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:ce0d963308f1954c8265828b8aa0d37cdfebb068727fa34c700e992a64a0bdc6", size = 5963459, upload-time = "2026-09-14T07:02:50.822Z" }, + { url = "https://files.pythonhosted.org/packages/87/6b/008c3e31e7681cacdc61ec0428f569f8ea959d48ed355c80ad9c748c743e/grpcio_tools-1.84.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a425e85bd95eb107f8a51baf717e265c4c37e1d0a31d57d7da6c7a1e302ffa5e", size = 2705302, upload-time = "2026-09-14T07:02:53.058Z" }, + { url = "https://files.pythonhosted.org/packages/16/11/d8e17542a79c5a2645353e7cfe53b36a96bc3bf61d6502514eff997eac8c/grpcio_tools-1.84.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:259d3064dfced0b5439e26379f02a14cc696107fc488cb61bd0ebad09c76fa44", size = 3033047, upload-time = "2026-09-14T07:02:55.785Z" }, + { url = "https://files.pythonhosted.org/packages/50/91/1bc18ec13f07fb77e1327cbbaeabbeb5dcf1cfe17fe8def9f4cd86fec4b4/grpcio_tools-1.84.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38b2819f6a04cb98158815f7d12cc14fd62659ce65c30b5c8c9f0efcf898cb6e", size = 2773834, upload-time = "2026-09-14T07:02:58.455Z" }, + { url = "https://files.pythonhosted.org/packages/fa/74/c6557d8928422a18d3a3e8522b67914d861026759243df28740cb1c515ce/grpcio_tools-1.84.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e4afaf1820c5a0c105538acf956cd2187b46b5438eb34f9b8e6257b674e97a67", size = 3229790, upload-time = "2026-09-14T07:03:01.779Z" }, + { url = "https://files.pythonhosted.org/packages/6a/63/02ba2c2866b6a18bd4d256aeccecfbc22908356cae9a659ba3e06fd0ee0e/grpcio_tools-1.84.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1c76a4cee1dd0e4dfcd31e1024a69303296efdd1757173248d8c59bb64a1372b", size = 3802611, upload-time = "2026-09-14T07:03:04.581Z" }, + { url = "https://files.pythonhosted.org/packages/80/95/350e3329b12e8fe775dda19c3f5c6e260af0f9bbb1165d11b7fb10a2d89f/grpcio_tools-1.84.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c47c6f708e2bf94503e31c578c904890225fd894a3f25f907fd3832f22b1c793", size = 3461325, upload-time = "2026-09-14T07:03:08.521Z" }, + { url = "https://files.pythonhosted.org/packages/fe/22/8463063fed0ead6c901f547d1cc7bd052391ef8eff4d1aa2e0f58f4a383c/grpcio_tools-1.84.0-cp314-cp314-win32.whl", hash = "sha256:daa0e3dff4feedbdfebc9192f2d714d5e37621b2466ba07070d002d1081a6e6f", size = 1045048, upload-time = "2026-09-14T07:03:10.723Z" }, + { url = "https://files.pythonhosted.org/packages/8c/41/4f7dd965ef2d72bc55ef208d0eadd73509aa7d4957a6eea5059a256ea01d/grpcio_tools-1.84.0-cp314-cp314-win_amd64.whl", hash = "sha256:a64a86d7e32d6ff57e0d4c6d01bac1ccd5718d01c5a5042b14ad63a00bd365f7", size = 1224203, upload-time = "2026-09-14T07:03:13.512Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d0/6cb3f84a4994a60929c2da21f5129cb04b675e814b3b03e4bbfc45512a2e/grpcio_tools-1.84.0-cp315-cp315-linux_armv7l.whl", hash = "sha256:ed27e0c12e687a4b15f6352e98eb794a296bdcc75fc26fbd5e2d1d6844c0bb5a", size = 2652855, upload-time = "2026-09-14T07:03:17.043Z" }, + { url = "https://files.pythonhosted.org/packages/79/bf/0525cdfd7eb41feed328c3e839da12d56be9a23d87c74e15e1b16c3b2b5a/grpcio_tools-1.84.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:a30b3259bbcd7aa1377e8cf5e39b30962f88ead94bd1a25c30ab8819c1163a0d", size = 5971465, upload-time = "2026-09-14T07:03:20.057Z" }, + { url = "https://files.pythonhosted.org/packages/55/e3/ef3de0d88b69a022198ce1d8ff27df970f9bbf5f0f3d65576879054718e0/grpcio_tools-1.84.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b268a8cc6a0ffde0388371fee57942585060e89a3904eec1a2c00765707a26b3", size = 2707417, upload-time = "2026-09-14T07:03:22.826Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c4/f9c204a32145191bbcb39d487e2abcb9ed96c95e7d9e56267a1b5d378a61/grpcio_tools-1.84.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:feab5e59a8cbba38190196a29b878bedf3ea8e1baf94fe26fb21ca9a5b06e17c", size = 2904340, upload-time = "2026-09-14T07:03:25.8Z" }, + { url = "https://files.pythonhosted.org/packages/b7/54/a6d0aa5fc695e98c40442d9da819e2c178e3ee170182ff34922da512294b/grpcio_tools-1.84.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be960444736ff4363aad257847e0b6de8798a818b7760253b043f1c2141b522b", size = 2756591, upload-time = "2026-09-14T07:03:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/ca/40/343a5fb15e9b702df619f34302829ae3f02306c6e22ce98a2634e5ee51d7/grpcio_tools-1.84.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:5c772fff61c94a526869fbbdc1cf5d40047170c0d591609685170130de031e63", size = 3231636, upload-time = "2026-09-14T07:03:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1f/32445fe2f52f3e3fa1c83131f1c051d025baa1218e38fa51d7d3dab70248/grpcio_tools-1.84.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:769ae9073f09b2dd322b4de5e5fffa7c2f38340cf779a21486c45946ab2b2991", size = 3684445, upload-time = "2026-09-14T07:03:34.124Z" }, + { url = "https://files.pythonhosted.org/packages/1f/49/10314e948033f1f2c5a4d68edcade8795c5fab7cb4a132ae78d3cc98e300/grpcio_tools-1.84.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cee293333fc9efaa1e75d8baf0150d79007874c7bb364cffebf35346836038e8", size = 3435303, upload-time = "2026-09-14T07:03:37.42Z" }, + { url = "https://files.pythonhosted.org/packages/3a/69/69e92ff54e590236eff01ca72e9722ff31baac828c4bffcfac1f9a5e850d/grpcio_tools-1.84.0-cp315-cp315-win32.whl", hash = "sha256:65a2ae3836ffb7b035e341a6dcc81e3d8b090b0df173851715f44cdd89723b1e", size = 1045039, upload-time = "2026-09-14T07:03:39.731Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8e/12b84ac60171f8401d31bf64e9cdf3e041653e3e5c79ce50cac7b2b8fa5d/grpcio_tools-1.84.0-cp315-cp315-win_amd64.whl", hash = "sha256:f28ffc8f0d2831a81239cee6b038ee3254bd7ac884fe69cc99b4ee83ff1fc1a5", size = 1224255, upload-time = "2026-09-14T07:03:42.561Z" }, ] [[package]] @@ -1547,34 +1648,26 @@ wheels = [ [[package]] name = "hf-xet" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4b/2d/57fd21d84d93efb4bd0b962383790e19dd1bc053501b4264c97903b4e83e/hf_xet-1.5.1.tar.gz", hash = "sha256:51ef4500dab3764b41135ee1381a4b62ce56fc54d4c92b719b59e597d6df5bf6", size = 876636, upload-time = "2026-06-08T23:02:53.897Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/ee/dd9ba7beae1005e54131b7d45263cc74c8a066d47d354e6d58ae9445a388/hf_xet-1.5.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:dbf48c0d02cf0b2e568944330c60d9120c272dabe013bd892d48e25bc6797577", size = 4069485, upload-time = "2026-06-08T23:02:13.193Z" }, - { url = "https://files.pythonhosted.org/packages/b6/bc/9cae6cfeb4e03070874e73e5c97c66eb90369d3206b6a2b1ef5f96520888/hf_xet-1.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78e4e5192ad2b674c2e1160b651cb9134db974f8ae1835bdfbfb0166b894a43", size = 3838493, upload-time = "2026-06-08T23:02:15.282Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b4/d5c01e0eb6d9f2ca2dacd84d0d1b71e6cfbb2ef3208c968528e010e9b3d7/hf_xet-1.5.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6f7a04a8ad962422e225bc49fbbac99dc1806764b1f3e54dbd154bffa7593947", size = 4505658, upload-time = "2026-06-08T23:02:17.196Z" }, - { url = "https://files.pythonhosted.org/packages/76/c5/29a7598c0c6383c523dc22186d577f4e04267a626cd95ae60f67c00bfe66/hf_xet-1.5.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:d48199c2bf4f8df0adc55d31d1368b6ec0e4d4f45bc86b08038089c23db0bed8", size = 4292822, upload-time = "2026-06-08T23:02:18.608Z" }, - { url = "https://files.pythonhosted.org/packages/04/9a/dceaf6ca69390126b86ea825fb354b93d01163199070b7bd849225de9468/hf_xet-1.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:97f212a88d14bbf573619a74b7fecb238de77d08fc702e54dec6f78276ca3283", size = 4491255, upload-time = "2026-06-08T23:02:20.124Z" }, - { url = "https://files.pythonhosted.org/packages/48/a7/e5a7afaacf6c1791fdbeeac42951fb81c3d2bc482992b115dedcc86d963e/hf_xet-1.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f61e3665892a6c8c5e765395838b8ddf36185da835253d4bc4509a81e49fb342", size = 4711062, upload-time = "2026-06-08T23:02:21.863Z" }, - { url = "https://files.pythonhosted.org/packages/53/49/2802f8433c9742ce281bddc1e65c02c32268ca3098d66828b05e12e45ee2/hf_xet-1.5.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f4ad3ebd4c32dd2b27099d69dc7b2df821e30767e46fb6ee6a0713778243b8ff", size = 4017205, upload-time = "2026-06-08T23:02:23.495Z" }, - { url = "https://files.pythonhosted.org/packages/9e/5a/50c71195b9fb883659f596e7252faf4c18c58e753a9013bdbf9bac5d2250/hf_xet-1.5.1-cp313-cp313t-win_arm64.whl", hash = "sha256:8298485c1e36e7e67cbd01eeb1376619b7af43d4f1ec245caae306f890a8a32d", size = 3845426, upload-time = "2026-06-08T23:02:25.124Z" }, - { url = "https://files.pythonhosted.org/packages/05/24/5e0c28f80371c17d49fed004597d9d132cb75c1f6f53db2cb95f459d2312/hf_xet-1.5.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:3474760d10e3bb6f92ff3f024fcb00c0b3e4001e9b035c7483e49a5dd17aa70f", size = 4069676, upload-time = "2026-06-08T23:02:26.759Z" }, - { url = "https://files.pythonhosted.org/packages/d2/17/261ba565b6a4d960fb478f61fdf919c0be5824645aaf1c319eca660c1611/hf_xet-1.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6762d89b9e3267dfd502b29b2a327b4525f33b17e7b509a78d94e2151a30ce30", size = 3838509, upload-time = "2026-06-08T23:02:28.573Z" }, - { url = "https://files.pythonhosted.org/packages/4e/44/7ffdc2e184b0d41fc0f683ba3936ef669ab63cf242cf36ef50e57d683668/hf_xet-1.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bf67e6ed10260cef62e852789dc91ebb03f382d5bdc4b1dbeb64763ea275e7d6", size = 4505881, upload-time = "2026-06-08T23:02:30.257Z" }, - { url = "https://files.pythonhosted.org/packages/63/b6/788060d5aa4d5e671f1a31bf69624c314eb2d8babab3aa562f9e5d53444e/hf_xet-1.5.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c6b6cd08ca095058780b50b8ce4d6cbf6787bcf27841705d58a9d32246e3e47a", size = 4292995, upload-time = "2026-06-08T23:02:31.993Z" }, - { url = "https://files.pythonhosted.org/packages/22/93/c5540cbd6b55529b7dc42f6734e88cebee21aefbea34128b66229df56c57/hf_xet-1.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e1af0de8ca6f190d4294a28b88023db64a1e2d1d719cab044baf75bec569e7a9", size = 4491570, upload-time = "2026-06-08T23:02:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/03/f3/9d8ceab30f44f36c1679b1b8683054c71a0dadc787dbf07421891742d3ca/hf_xet-1.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4f561cbbb92f80960772059864b7fb07eae879adde1b2e781ec6f86f6ac26c59", size = 4711565, upload-time = "2026-06-08T23:02:35.454Z" }, - { url = "https://files.pythonhosted.org/packages/cd/54/27ed9a5e2cc583b4df82f75a03a4df8dbf55f5a9fa1f47f1fadfb20dbeac/hf_xet-1.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e7dbb40617410f432182d918e37c12303fe6700fd6aa6c5964e30a535a4461d6", size = 4017343, upload-time = "2026-06-08T23:02:37.14Z" }, - { url = "https://files.pythonhosted.org/packages/ae/12/ecb2fc8d45e767580e3a37faa97cb895608b614965567efb4f18cff67e27/hf_xet-1.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6071d5ccb4d8d2cbd5fea5cc798da4f0ba3f44e25369591c4e89a4987050e61d", size = 3845716, upload-time = "2026-06-08T23:02:39.073Z" }, - { url = "https://files.pythonhosted.org/packages/7a/d8/5e54cf37434759d1f4f2ba9b66077ff9d4c4e1f37b6bd7975da5c40d94ab/hf_xet-1.5.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6abd35c3221eff63836618ddfb954dcf84798603f71d8e33e3ed7b04acfdbe6e", size = 4077794, upload-time = "2026-06-08T23:02:40.656Z" }, - { url = "https://files.pythonhosted.org/packages/35/94/4b2ecfbad8f8b04701a23aefb62f540b9137d058b7e1dbef16a32676f0e9/hf_xet-1.5.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:94e761bbd266bf4c03cee73753916062665ce8365aa40ed321f45afcb934b41e", size = 3845354, upload-time = "2026-06-08T23:02:42.702Z" }, - { url = "https://files.pythonhosted.org/packages/de/cc/f99f4bc7295023d7bd9ebbfd51f75cc530ca262c1227666268b8208f4b77/hf_xet-1.5.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:892e3a3a3aecc12aded8b93cf4f9cd059282c7de0732f7d55026f3abdf474350", size = 4514864, upload-time = "2026-06-08T23:02:44.497Z" }, - { url = "https://files.pythonhosted.org/packages/cd/6e/21f7e5a2381278bd3b7b7a5a4d90038518bb6308a0c1daf5d9f8268bb178/hf_xet-1.5.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a93df2039190502835b1db8cd7e178b0b7b889fe9ab51299d5ced26e0dd879a4", size = 4303784, upload-time = "2026-06-08T23:02:46.203Z" }, - { url = "https://files.pythonhosted.org/packages/35/0e/f992bb6927ac1cb30ef74e62268f551f338bc32b2191f7c96a44c6f7283e/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0c97106032ef70467b4f6bc2d0ccc266d7613ee076afc56516c502f87ce1c4a6", size = 4500703, upload-time = "2026-06-08T23:02:47.628Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d1/90a498d05447980b977b1669246eeeeae4cfb0ea3e7a286eaba627f91bf9/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6208adb15d192b90e4c2ad2a27ed864359b2cb0f2494eb6d7c7f3699ac02e2bf", size = 4719498, upload-time = "2026-06-08T23:02:49.268Z" }, - { url = "https://files.pythonhosted.org/packages/6d/b6/20f99cfe97cc663a711f7b33cc21d4793e51968e9a26125b4afcd77315ba/hf_xet-1.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:f7b3002f95d1c13e24bcb4537baa8f0eb3838957067c91bb4959bc004a6435f5", size = 4026419, upload-time = "2026-06-08T23:02:50.829Z" }, - { url = "https://files.pythonhosted.org/packages/f9/fa/77453694888f03e5a8c8852d1514a0894d8e81c622d39edbaf308ea0dcf4/hf_xet-1.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:93d090b57b211133f6c0dab0205ef5cb6d89162979ba75a74845045cc3063b8e", size = 3855178, upload-time = "2026-06-08T23:02:52.452Z" }, +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/ab/522a2ab67f27971a9d48ca666d4fca85ef7d5282d142e31fd087e27b1bbe/hf_xet-1.6.0.tar.gz", hash = "sha256:2e58454a340b3556dfa4972d5451aff4fba8dd42a236600ba1a1d2b1514f0fef", size = 920527, upload-time = "2026-08-03T22:33:13.243Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/62/3c062f593bd92ef4e77a0ef39541e3d82a0a1d3947c8a777a02a13a27828/hf_xet-1.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:70cbb9c896901600128cb9b6f06e132954fbede1db30f31f7c6c63f84cb7c31d", size = 4074584, upload-time = "2026-08-03T22:32:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1e/c0ad437dd267a8e435bef594acf781bbc3874ff0b6435b4962d03ecf7cc4/hf_xet-1.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:23379c2f9ec8696d952b16414a2bae72cad86a52df869b050698ba60f538c675", size = 3867381, upload-time = "2026-08-03T22:32:49.049Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ee/7c0d7b6ab336167531b1c30af2af003f054af4c749becbd7209ae33a77c3/hf_xet-1.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f2f7278c05c22fd60cb436cda1269649b3e81db65ecdc8496e5e164aa4143e7b", size = 4453982, upload-time = "2026-08-03T22:32:50.568Z" }, + { url = "https://files.pythonhosted.org/packages/63/06/ad8eab1c9525246650cbaa821caa3cdbaca734ab1a5b8c91bea09cbd8d69/hf_xet-1.6.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:948f15d3a9545cfe5932f6bd8b440f6ae630aee108f14b7bd6c561f7c2dcc522", size = 4249445, upload-time = "2026-08-03T22:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/d8/26/1eee8aedb0dafc1ab9717dc9ac602cde33361b232dc06803f1f6ed18b58c/hf_xet-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5153e6bb103ad49d6ea9f1b2e230db5a2ea32551ad09a706d2f61d7c7c80d80e", size = 4451099, upload-time = "2026-08-03T22:32:54.114Z" }, + { url = "https://files.pythonhosted.org/packages/67/57/0b88af1f194ab6c9c650547d9cc06bfeaab836ae4dcdb331676bfb8be95a/hf_xet-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:35cec30d75c6f9eb9c16a77cef68e85a103b72e24d4b473714ec9ff06428bab9", size = 4664712, upload-time = "2026-08-03T22:32:55.547Z" }, + { url = "https://files.pythonhosted.org/packages/53/a0/26b717a9d1840e8abf48dcec64b5ed8fbe472671d38ad28d30e147132b33/hf_xet-1.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5789835d7c6bc9436962853192082374297fb72d7eff7e7762ec25ceb7e25338", size = 4025906, upload-time = "2026-08-03T22:32:57.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/f6/4a9966633c6fef83af997e2cff68ec1963676d412bdfd096df2a93b8e185/hf_xet-1.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:75765820ce4700db3750c94acc8fe27c5fae4c9ec000a0dbac3ca082acf97765", size = 3849221, upload-time = "2026-08-03T22:32:59.123Z" }, + { url = "https://files.pythonhosted.org/packages/a2/50/7afa2c9c787405864fc47a0d1bbc02c62e9101947ed43c1f43899fc7d91d/hf_xet-1.6.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:633dc0cd71d32da58ab8c03ad38e2fac452c15c2b0a2866ebf6ededfe0a5061d", size = 4071729, upload-time = "2026-08-03T22:33:00.721Z" }, + { url = "https://files.pythonhosted.org/packages/4b/69/55b8dcf636142ae660fec1869fcac14c4da2e8412e14d6eee1523be77e9f/hf_xet-1.6.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:f0906082d9932ae0c0057fa194041c22b4e2cdb46b2592ef3b91f020d62a081a", size = 3876287, upload-time = "2026-08-03T22:33:02.251Z" }, + { url = "https://files.pythonhosted.org/packages/67/4e/a28359bf1c1ecf11eba22123168c138698f7cb576ac678f5a2e16cd5da08/hf_xet-1.6.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d62671bb130879cef0ee4c9ebe47a14af6c66ec53e6d84dc15936e5ffdfac82f", size = 4464663, upload-time = "2026-08-03T22:33:03.802Z" }, + { url = "https://files.pythonhosted.org/packages/9a/69/1f0cbc2fb22ae6082d094f743d1b8945a3f36f6089cb95f42b7ee348cda7/hf_xet-1.6.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0e6e21fa3cdfcdcd76748564bf593870a5e013f47d97cf10aed63aa222cff5b7", size = 4262538, upload-time = "2026-08-03T22:33:05.287Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3a/4f4f2301ade26e404462d3336fa11f7958d914cabbabdd6e03c3c5d5658c/hf_xet-1.6.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4fc74352a17015bd0ee90038bc9efe38db894cde45f268b6712b04fce8cd0acb", size = 4460520, upload-time = "2026-08-03T22:33:06.81Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/311725e2a905534dfee2dcb5b08414f249147f1f12252bfc2bd24caa075c/hf_xet-1.6.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4f71cba6129110c3374a33f919001ff130488fc23553698e34cc1c2a1198c", size = 4675937, upload-time = "2026-08-03T22:33:08.616Z" }, + { url = "https://files.pythonhosted.org/packages/98/b7/8c59a66d15205024662f1d66968136f13893f96df1ddc5087e2e281fc95f/hf_xet-1.6.0-cp38-abi3-win_amd64.whl", hash = "sha256:fb4fadde1b2b70bf4c0c14a6dccbe7194b1c28947fefd5bbe3fed9d940676c3b", size = 4033128, upload-time = "2026-08-03T22:33:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/73/63/ca511b6f802f28cf3489b280fe77475bcca8de85e81a6299d7916b5b5555/hf_xet-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:3dc3e35441ba395006af5aaacc40ef2e603c51ef46c3530b9156185f00935ea3", size = 3859359, upload-time = "2026-08-03T22:33:11.725Z" }, ] [[package]] @@ -1590,6 +1683,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] +[[package]] +name = "httpcore2" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11", marker = "(python_full_version >= '3.11' and sys_platform != 'emscripten') or (python_full_version == '3.11.*' and sys_platform == 'emscripten') or (python_full_version >= '3.13' and sys_platform == 'emscripten')" }, + { name = "truststore", marker = "(python_full_version >= '3.11' and sys_platform != 'emscripten') or (python_full_version == '3.11.*' and sys_platform == 'emscripten') or (python_full_version >= '3.13' and sys_platform == 'emscripten')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/8c/e925b1c92018abb3a1863ce1549d76d2381e334d21d65d4ac8f65dabd78a/httpcore2-2.13.0.tar.gz", hash = "sha256:2adc8be4fb285fbcd6d894298db3b52c177e74b6674eda3a76bd36be3292a3db", size = 67740, upload-time = "2026-09-14T14:18:04.717Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/0d/117a771a2bb91df334b66bf4da14cd02f21aefbcfe53180f336ce55e8f90/httpcore2-2.13.0-py3-none-any.whl", hash = "sha256:35ae5be347aa40467b4a5dc032ac67ebb6d27189fc97e8cebcf99616f6a1bb9e", size = 83162, upload-time = "2026-09-14T14:18:02.529Z" }, +] + [[package]] name = "httpx" version = "0.28.1" @@ -1614,9 +1720,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, ] +[[package]] +name = "httpx2" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten'" }, + { name = "httpcore2", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten'" }, + { name = "httpx2-jsfetch", marker = "python_full_version >= '3.12' and sys_platform == 'emscripten'" }, + { name = "idna", marker = "python_full_version >= '3.11'" }, + { name = "truststore", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/a0/e9deef4654132857b5a5dbe4eddd0ac59c2814500e11f2f5044cd81103ee/httpx2-2.13.0.tar.gz", hash = "sha256:81bd07dc67a3701729ef1f777a3c00c915d4539604fdb5afd327f8682f6b7b44", size = 100290, upload-time = "2026-09-14T14:18:05.486Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/d1/a0c72b0e006df654709fbc366cc5bcb53e5aee13e1e3395152c6dd293376/httpx2-2.13.0-py3-none-any.whl", hash = "sha256:fc12720cedf72faa26cca6b4ca394e05c894e7d7933fc45cafe767960804e49a", size = 95565, upload-time = "2026-09-14T14:18:03.553Z" }, +] + +[[package]] +name = "httpx2-jsfetch" +version = "1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/0e5636363151a2a1795e0a77617168b9ca438e1748ec05fc9b5687f93d64/httpx2_jsfetch-1.0.tar.gz", hash = "sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60", size = 6872, upload-time = "2026-08-07T00:13:07.492Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/43/832f631d32e4f1211caa2ba368317739fe71f0b8530e4c9d15dc454bac2a/httpx2_jsfetch-1.0-py3-none-any.whl", hash = "sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32", size = 6382, upload-time = "2026-08-07T00:13:06.567Z" }, +] + [[package]] name = "huggingface-hub" -version = "1.23.0" +version = "1.31.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1629,9 +1761,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/8f/999e4dda11c6187c78f090eac00895a47e11a0049308f07579bcb7aa3aa2/huggingface_hub-1.23.0.tar.gz", hash = "sha256:c04997fb8bbdace1e57b7703d30ed7678af51f70d00d241819ff411b92ae9a88", size = 919163, upload-time = "2026-07-09T14:49:32.315Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/f0/61159db90b5cd275d55516fe27920828e7d3be4053fdbdb27c3f70e5f1ef/huggingface_hub-1.31.0.tar.gz", hash = "sha256:f8e9e710a210613fa5d0f26bba6da05ef4aef9fba5a0f23f508f5ac4d08b6f90", size = 968039, upload-time = "2026-09-10T10:27:22.724Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/ce/13b2ba57838b8db1e6bd033c1b21ce0b9f6153b87d4e4939f77074e41eb0/huggingface_hub-1.23.0-py3-none-any.whl", hash = "sha256:b1d604788f5adc7f0eb246e03e0ec19011ca06e38400218c347dccc3dffa64a2", size = 770336, upload-time = "2026-07-09T14:49:30.597Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7f/3f886a625043b77312b80da2f2bf00b5ecbf5a73061af1aa0259cd258c9d/huggingface_hub-1.31.0-py3-none-any.whl", hash = "sha256:9dbb6a503cbe2494ea666695207e7262d410659e09134059deb83e5480864667", size = 798313, upload-time = "2026-09-10T10:27:20.798Z" }, ] [[package]] @@ -1648,11 +1780,11 @@ wheels = [ [[package]] name = "idna" -version = "3.18" +version = "3.19" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, + { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, ] [[package]] @@ -1757,101 +1889,128 @@ wheels = [ [[package]] name = "jiter" -version = "0.16.0" +version = "0.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/1f/10936e16d8860c70698a1aa939a46aa0224813b782bce4e000e637da0b2d/jiter-0.16.0.tar.gz", hash = "sha256:7b24c3492c5f4f84a37946ad9cf504910cf6a782d6a4e0689b6673c5894b4a1c", size = 176431, upload-time = "2026-06-29T13:05:13.657Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/d8/b959609e44012a42b1f3e5ba98ea3b33c7e41e6d4b77cd8f00fd19b1d3ad/jiter-0.16.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fc4f8def331036a7b8e981b4347ebe409981edbc8308a5ea842b8c3614fa6c", size = 310082, upload-time = "2026-06-29T13:02:31.356Z" }, - { url = "https://files.pythonhosted.org/packages/c6/3d/4d7f5667ea0e0548534ba880b84bb3d12924fd133aa83ad6c6c80fca3d76/jiter-0.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a71d0d2014c3275043e1170bf3d4e771493cb0dcf07be54c567155f4d8ee64b", size = 315643, upload-time = "2026-06-29T13:02:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/9b/83/bed2dcb5c9f3e1ccfcbc67dda48265fe7d5ad0c9cadda5fe95f6e3b87f94/jiter-0.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:741eed508c233a76313a1c7b001f8f21b82f14327e9196ae8bd29a2cc164ae84", size = 341363, upload-time = "2026-06-29T13:02:34.853Z" }, - { url = "https://files.pythonhosted.org/packages/f4/2f/6bb3c3dda668ebc0445689c81a2b0f26a82b10843d67ed9c9b2c3edc177f/jiter-0.16.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3fb7bc819187b56dc48aa5c833aaf92257da8e07efdb9306156667bd2eeb491c", size = 365483, upload-time = "2026-06-29T13:02:36.295Z" }, - { url = "https://files.pythonhosted.org/packages/92/35/8a045ccb39164e70dcdae696413b661771f148b68b12b175c3a04d901937/jiter-0.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c9610fd25ebccb43fca584136f5c2fbb26802447eccd430dfdbab95a0fd5126", size = 461219, upload-time = "2026-06-29T13:02:38.116Z" }, - { url = "https://files.pythonhosted.org/packages/e7/99/22292dbbf0ed0c610cfe5ddc7f3bd67237a412f121318f865196e62a07bd/jiter-0.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a1d68ff7ca1d3b5dee20a97a3decda7d5f15003823bf6d140c81f8561d3bc5c", size = 374905, upload-time = "2026-06-29T13:02:40.357Z" }, - { url = "https://files.pythonhosted.org/packages/29/ac/2f55ccb1f0eeafa6d89d24caf52f6f0944a59290ee199e9ade62177dca42/jiter-0.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb08c276dd02dac3a284acdd02cacc630d2e3cd6572a4b85519f35cbd133c3de", size = 348320, upload-time = "2026-06-29T13:02:41.923Z" }, - { url = "https://files.pythonhosted.org/packages/50/e3/7d88b9174c40064fabc07c84a9b62e6b10f5644562ec0e0a29392edbe978/jiter-0.16.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:8fc4d94713c4697347e38faf7d6ef91547c142219bdcfc7220c4870879974244", size = 356519, upload-time = "2026-06-29T13:02:43.436Z" }, - { url = "https://files.pythonhosted.org/packages/27/57/c4a33aeef513a9d5e26e31534e0bcc752d6ea0e54c94ddb7b68bade669c2/jiter-0.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0f05e229edb29e68cdd0ccb83cea13b64263416120cf943767a6fd72e6787f", size = 394204, upload-time = "2026-06-29T13:02:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/9d/70/c6c23e76ebb3766b111bc399437bbc9f870a76e2a92e10b2a5f561d57372/jiter-0.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2c842cbf374a8daf50b2c04212995bee34ca2ac2cdc29a901b4cdb072c9c4131", size = 521477, upload-time = "2026-06-29T13:02:46.724Z" }, - { url = "https://files.pythonhosted.org/packages/2a/d3/0001c8c0c5976af2625bb1cfb1895e8ec693b6589fe4574b8e6fc2c85501/jiter-0.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5ed466aee31294d7cdcd4d37dfe5c42c97bc29d9a5f00eacf24504358309cb9b", size = 552187, upload-time = "2026-06-29T13:02:48.144Z" }, - { url = "https://files.pythonhosted.org/packages/f6/76/311b718e07e85740e48619c0632b36f7e0b8d113984499e436452ed13a9a/jiter-0.16.0-cp310-cp310-win32.whl", hash = "sha256:b42e9ff5376819c053da25809a8d4b6fa6e473b4856ebe42e298ac958be3d7f9", size = 206513, upload-time = "2026-06-29T13:02:49.515Z" }, - { url = "https://files.pythonhosted.org/packages/db/7f/ac680eeb0777dc0eb7dc824800ba27880d7f6bc712e362d34ad8ee559f36/jiter-0.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:10438939205546132189c8e74a2d536a707841f3a25cd7c74ee91fe503407a26", size = 199505, upload-time = "2026-06-29T13:02:50.829Z" }, - { url = "https://files.pythonhosted.org/packages/4e/3f/fae6cc967d120ec89e31c5418a51176d8278b3087fbb384a9176754f353c/jiter-0.16.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:67fddeda1688f0cce2d2ae83ccf8a80f79936f2d2997d6cc2261f82fdb54a4d3", size = 309289, upload-time = "2026-06-29T13:02:52.301Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e3/97c6c3562c077f6247d6e6ce5c82562500b6316c0d928e97e106b7a1321a/jiter-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c90c0f63df322be920eda6ce622e3083d8906ba267f8220fe7873213b8b4430e", size = 315181, upload-time = "2026-06-29T13:02:53.964Z" }, - { url = "https://files.pythonhosted.org/packages/7b/89/d8d073f8aa2667e46c6c0873f86fe4a512bba4293cc730f626a076211a62/jiter-0.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64c0203212098470032aabcde9356fc168f377aade3e43def61dfe17e92f2037", size = 340939, upload-time = "2026-06-29T13:02:55.412Z" }, - { url = "https://files.pythonhosted.org/packages/87/c9/db4fda3ed73fb864139305e935e5b8b38a5a24692a5a9dd356c22f1b9c8d/jiter-0.16.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12288303c9844e61e1651d02a9a6f6633e47d39f897d6991d1427161ce6b746e", size = 364932, upload-time = "2026-06-29T13:02:57.28Z" }, - { url = "https://files.pythonhosted.org/packages/a2/74/52b5e86241057f52ddd7c9a580f90effb51f9d06239f6fc612279b91a838/jiter-0.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cf109d010b4b05a105afb3d43be36a21322d345ad3111e13d15f680afef0e5b", size = 461132, upload-time = "2026-06-29T13:02:58.994Z" }, - { url = "https://files.pythonhosted.org/packages/a9/87/544a700f7447c1f31c5d7833821a4daa5683165c2d5a094fbf5b5800c3dc/jiter-0.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62c1b7fe1f77925acf5af68b6140b8810fa87dfd4dc0a9c8568ec2fa2a10429c", size = 374857, upload-time = "2026-06-29T13:03:00.455Z" }, - { url = "https://files.pythonhosted.org/packages/40/cd/0fcc3f7d39183674d5bfa9ec640faaeb506c60be7c8f94625dfba366e37c/jiter-0.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8597d23c87f59294f83bcb6229b9ed1fccee13dbba967b46930d2f1759466fee", size = 347053, upload-time = "2026-06-29T13:03:02.045Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ae/c7e64e7932ad597fa395b61440b249ada6366716e25c6e08dd2afbd021e6/jiter-0.16.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3126a5dbad56401989ac769aca0cb56005bfb3e2366eea0ca99d1a91c3c1ee03", size = 356153, upload-time = "2026-06-29T13:03:03.706Z" }, - { url = "https://files.pythonhosted.org/packages/d4/1c/1c719044f14da814e1a060191ab19b96f3e99207bc5b4bfc6d6be34b3f80/jiter-0.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c4b4717bdb35ae456f831a6b08d01880fff399887a6bbc526a583a406e484eea", size = 393956, upload-time = "2026-06-29T13:03:05.165Z" }, - { url = "https://files.pythonhosted.org/packages/3b/dc/7b2f303a2847207e265503853a2d964a55354cffd62a5f2936c155486798/jiter-0.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:adff21bc78edfe086c15eb495b900306076de378dc2337c132401fc39bd79c91", size = 521081, upload-time = "2026-06-29T13:03:06.886Z" }, - { url = "https://files.pythonhosted.org/packages/c2/5f/501cf6e1e09caeb420195179ffc6f62aca603f1220ec53fd80d0d70b3e56/jiter-0.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dab907db06fc593645e73109acf4581ba5b548897d28b9348dc41ddc8343b2d3", size = 552085, upload-time = "2026-06-29T13:03:08.339Z" }, - { url = "https://files.pythonhosted.org/packages/79/54/aa5be86520113b79455c3877f3d1f07a348098df4083ba3688e9537e52dd/jiter-0.16.0-cp311-cp311-win32.whl", hash = "sha256:560b2cf3fb03240cd34f27409a238547488708f05b7c3924f571a60422251ec7", size = 206755, upload-time = "2026-06-29T13:03:09.653Z" }, - { url = "https://files.pythonhosted.org/packages/64/ec/2feb893eb330bd69b413866f4d5daada33c3962f1c6f270c91ca2d87fdf9/jiter-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:e431cfc9caf44c1d5459ff77d4e64cbf85fddb6a35dad836a15c6a9ec23087c1", size = 199155, upload-time = "2026-06-29T13:03:10.979Z" }, - { url = "https://files.pythonhosted.org/packages/b9/9c/ca040d94415048a3666fc237774df8151c96f8d2b661cbe3b184acc95876/jiter-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:2a8e9e39cf083016137aa5cadafe3188adc2ba6ba1fbf1e5d18889ad3e9ad056", size = 194403, upload-time = "2026-06-29T13:03:12.341Z" }, - { url = "https://files.pythonhosted.org/packages/83/2b/52ace16ed031354f0539749a49e4bf33797d82bea5137910835fa4b09793/jiter-0.16.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:67c3bc1760f8c99d805dcab4e644027142a53b1d5d861f18780ebdbd5d40b72a", size = 306943, upload-time = "2026-06-29T13:03:14.035Z" }, - { url = "https://files.pythonhosted.org/packages/94/2e/34957c2c1b661c252ba9bcc60ae0bddc27e0f7202c6073326a13c5390eec/jiter-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5af7780e4a26bd7d0d989592bf9ef12ebf806b74ab709223ecca37c749872ea9", size = 307779, upload-time = "2026-06-29T13:03:15.418Z" }, - { url = "https://files.pythonhosted.org/packages/88/6c/59bd309cab4460c54cf1079f3eb7fe7af6a4c895c5c957a53378693bad2b/jiter-0.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5bf78d0e05e45cfdd66558893938d59afe3d1b1a824a202039b20e607d25a72", size = 335826, upload-time = "2026-06-29T13:03:17.11Z" }, - { url = "https://files.pythonhosted.org/packages/3b/8c/f5ef7b65f0df47afa16596969defb281ebb86e96df346d62be6fd853d620/jiter-0.16.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4444a83f946605990c98f625cdd3d2725bfb818158760c5748c653170a20e0e", size = 362573, upload-time = "2026-06-29T13:03:18.781Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0b/ace4354da061ee38844a0c27dc2c21eecd27aea119e8da324bea987522d0/jiter-0.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a23f0e4f957e1be65752d2dfac9a5a06b1917af8dc85deb639c3b9d02e31290", size = 457979, upload-time = "2026-06-29T13:03:20.293Z" }, - { url = "https://files.pythonhosted.org/packages/55/40/c0253d3772eb9dcd8e6606ee9b2d53ec8e5b814589c47f140aa585f21eaa/jiter-0.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c22a488f7b9218e245a0025a9ba6b100e2e54700831cf4cf16833a27fba3ad01", size = 372302, upload-time = "2026-06-29T13:03:21.739Z" }, - { url = "https://files.pythonhosted.org/packages/a8/d2/4839422241aa12860ce597b20068727094ba0bc480723c74924ca5bad483/jiter-0.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46add52f4ad47a08bfb1219f3e673da972191489a33016edefdb5ea55bfa8c48", size = 343805, upload-time = "2026-06-29T13:03:23.384Z" }, - { url = "https://files.pythonhosted.org/packages/e2/59/e196888a05befdda7dbe299b722d56f2f6eec65402bc34c0a3306d595feb/jiter-0.16.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:9c8a956fd72c2cf1e730d01ea080341f13aa0a97a4a33b51abebe725b7ae9ca9", size = 351107, upload-time = "2026-06-29T13:03:24.815Z" }, - { url = "https://files.pythonhosted.org/packages/ec/74/4cd9e0fca65232136400354b630fbfcd2de634e22ccbb96567725981b548/jiter-0.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:561926e0573ffe4a32498420a76d64b16c513e1ab413b9d28158a8764ac701e5", size = 388441, upload-time = "2026-06-29T13:03:26.266Z" }, - { url = "https://files.pythonhosted.org/packages/d9/8c/554691e48bc711299c0a293dd8a6179e24b2d66a54dc295421fcf64569c0/jiter-0.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:44d019fa8cdaf89bf29c71b39e3712143fdd0ac76725c6ef954f9957a5ea8730", size = 516354, upload-time = "2026-06-29T13:03:28.02Z" }, - { url = "https://files.pythonhosted.org/packages/a4/cb/01e9d69dc2cc6759d4f91e230b34489c4fdb2518992650633f9e20bece89/jiter-0.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0df91907609837f33341b8e6fe73b95991fdaa57caf1a0fbd343dffe826f386f", size = 547880, upload-time = "2026-06-29T13:03:29.534Z" }, - { url = "https://files.pythonhosted.org/packages/79/70/2953195f1c6ad00f49fa67e13df7e60acb3dd4f387101bc15abccddd905e/jiter-0.16.0-cp312-cp312-win32.whl", hash = "sha256:51d7b836acb0108d7c77df1742332cac2a1fa04a74d6dacec46e7091f0e91274", size = 203473, upload-time = "2026-06-29T13:03:31.025Z" }, - { url = "https://files.pythonhosted.org/packages/2d/05/2909a8b10699a4d560f8c502b6b2c5f3991b682b1922c1eedda242b225bd/jiter-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:1878349266f8ee36ecb1375cc5ba2f115f35fd9f0a1a4119e725e379126647f7", size = 196905, upload-time = "2026-06-29T13:03:32.472Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a9/6b82bb1c8d7790d602489b967b982a909e5d092875a6c2ade96444c8dfc5/jiter-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:2ed5738ae4af18271a51a528b8811b0cbfa4a1858de9d83359e4169855d6a331", size = 190618, upload-time = "2026-06-29T13:03:34.672Z" }, - { url = "https://files.pythonhosted.org/packages/91/c0/555fc60473d30d66894ba825e63615e3be7524fac23858356afa7a38906c/jiter-0.16.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:41977aa5654023948c2dae2a81cbf9c43343954bef1cd59a154dd15a4d84c195", size = 306203, upload-time = "2026-06-29T13:03:36.243Z" }, - { url = "https://files.pythonhosted.org/packages/d0/2b/c3eaf16f5d7c9bad66ea32f40a95bd169b29a91217fcc7f081375157e99c/jiter-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d28bb3c26762358dadf3e5bf0bccd29ae987d65e6988d2e6f49829c76b003c09", size = 306489, upload-time = "2026-06-29T13:03:37.846Z" }, - { url = "https://files.pythonhosted.org/packages/96/3f/02fdfc6705cad96127d883af5c34e4867f554f29ec7705ec1a46156400a9/jiter-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0542a7189c26920778658fc8fcf2af8bae05bae9924577f71804acef37996536", size = 335453, upload-time = "2026-06-29T13:03:39.221Z" }, - { url = "https://files.pythonhosted.org/packages/b2/a6/e4bda5920d4b0d7c5dfb7174ce4a6b2e4d3e11c9162c452ef0eab4cdbdbd/jiter-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8de1e23a0cb2a7f53c335049c7b72b6db41aa6227cdcc0972a1de5cb39450", size = 361625, upload-time = "2026-06-29T13:03:40.597Z" }, - { url = "https://files.pythonhosted.org/packages/b7/97/4e6b59b2c6e55cbb3e183595f81ad65dcfb21c915fee5e19e335df21bc55/jiter-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72d0b2990ca754a9102779ac98d8597b7cb31678958562214a007f909eab78e", size = 456958, upload-time = "2026-06-29T13:03:42.074Z" }, - { url = "https://files.pythonhosted.org/packages/15/e0/97e9557686d2f94f4b93786eccb7eed28e9228ad132ea8237f44727314a7/jiter-0.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f91b1c27fc22a57993d5a5cb8a627cb8ed4b10502716fac1ffbfe1d19d84e8", size = 372017, upload-time = "2026-06-29T13:03:43.658Z" }, - { url = "https://files.pythonhosted.org/packages/0f/94/db768b6938e0df35c86beeba3dfbbb025c9ee5c19e1aa271f2396e50864d/jiter-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c682bea068a90b764577bdb78a60a4c1d1606daf9cd4c893832a37c7cc9d9026", size = 343320, upload-time = "2026-06-29T13:03:45.226Z" }, - { url = "https://files.pythonhosted.org/packages/c1/d6/5a59d938244a30735fe62d9433fd325f9021ea29d89780ea4596ea93bc89/jiter-0.16.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:8d031aabecc4f1b6276adfb42e3aabb77c89d468bf616600e8d3a11328929053", size = 350520, upload-time = "2026-06-29T13:03:46.671Z" }, - { url = "https://files.pythonhosted.org/packages/67/f8/c4a857f49c9af125f6bbcac7e3eee7f7978ed89682833062e2dbf62576b1/jiter-0.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eab2cd170150e70153de16896a1774e3a1dca80154c56b54d7a812c479a7165e", size = 387550, upload-time = "2026-06-29T13:03:48.361Z" }, - { url = "https://files.pythonhosted.org/packages/8b/d6/5fbc2f7d6b67b754caa61a993a2e626e815dec47ffc2f9e35f01adfebec7/jiter-0.16.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6edb63a46e65a82c26800a868e49b2cac30dd5a4218b88d74bc2c848c8ad60bb", size = 515424, upload-time = "2026-06-29T13:03:49.881Z" }, - { url = "https://files.pythonhosted.org/packages/ed/54/284f0164b64a5fed915fea6ba7e9ba9b3d8d37c67d59cf2e3bb99d45cdfe/jiter-0.16.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:659039cc50b5addcc35fcc87ae2c1833b7c0a8e5326ef631a75e4478447bcf84", size = 546981, upload-time = "2026-06-29T13:03:51.363Z" }, - { url = "https://files.pythonhosted.org/packages/13/c5/2a467585a576594384e1d2c43e1224deaafc085f24e243529cf98beef8e1/jiter-0.16.0-cp313-cp313-win32.whl", hash = "sha256:c9c53be232c2e206ef9cdbad81a48bfa74c3d3f08bcf8124630a8a748aad993e", size = 202853, upload-time = "2026-06-29T13:03:53.015Z" }, - { url = "https://files.pythonhosted.org/packages/88/6a/de61d04b9eec69c71719968d2f716532a3bc121170c44a39e14979c6be81/jiter-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:baad945ed47f163ad833314f8e3288c396118934f94e7bbb9e243ce4b341a4fd", size = 196160, upload-time = "2026-06-29T13:03:54.447Z" }, - { url = "https://files.pythonhosted.org/packages/19/4b/b390ed59bafb3f31d008d1218578f10327714484b334439947f7e5b11e7f/jiter-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:3c1fd2dbe1b0af19e987f03fe66c5f5bd105a2229c1aff4ab14890b24f41d21a", size = 189862, upload-time = "2026-06-29T13:03:55.754Z" }, - { url = "https://files.pythonhosted.org/packages/a7/89/bc4f1b57d5da938fd344a466396541e586d161320d70bffd929aaafcd8f4/jiter-0.16.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b2c61484666ad42726029af0c00ef4541f0f3b5cdc550221f56c2343208018ee", size = 308239, upload-time = "2026-06-29T13:03:57.205Z" }, - { url = "https://files.pythonhosted.org/packages/65/7a/c415453e5213001bf3b411ff65dec3d303b0e76a4a2cfea9768cd4960994/jiter-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:63efadc657488f45db1c676d81e704cac2abf3fdb892def1faea61db053127e2", size = 308928, upload-time = "2026-06-29T13:03:58.643Z" }, - { url = "https://files.pythonhosted.org/packages/11/fc/1f4fb7ebf9a724c7741994f4aae18fba1e2f3133df14521a79194952c34a/jiter-0.16.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf0d73f50e7b6935677854f6e8e31d499ca7064dd24734f703e060f5b237d883", size = 336998, upload-time = "2026-06-29T13:04:00.071Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8d/72cadaac05ccfa7cc3a0a2232862e6c72443ca40cf300ba8b57f9f18b69b/jiter-0.16.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3ea07d9bc8e7d03a9fbc051295462e6dbc295b894fd72457c3136e3e43d898", size = 362112, upload-time = "2026-06-29T13:04:01.52Z" }, - { url = "https://files.pythonhosted.org/packages/58/4a/c4b0d5f651fda90a24ffce9f8d56cde462a2e09d31ae3de3c68cef34c04e/jiter-0.16.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26798522707abb47d767db536e4148ceac1b14446bf028ee85e579a2e043cfe5", size = 459807, upload-time = "2026-06-29T13:04:03.214Z" }, - { url = "https://files.pythonhosted.org/packages/80/58/ef77879ea9aa56b50824edc5a445e226422c7a8d211f3fd2a56bcb9493cf/jiter-0.16.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc837c1b9631be10abfe0191537fe8009838204cec7e44827401ace390ddb567", size = 373181, upload-time = "2026-06-29T13:04:04.629Z" }, - { url = "https://files.pythonhosted.org/packages/49/2e/ffbc3f254e4d8a66da3062c624a7df4b7c2b2cf9e1fe43cf394b3e104041/jiter-0.16.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49060fd70737fad59d33ba9dcc0d83247dc9e77187de26053a19c16c9f32bd69", size = 344927, upload-time = "2026-06-29T13:04:06.067Z" }, - { url = "https://files.pythonhosted.org/packages/9a/f6/0be5dc6d64a89f80aa8fec984f94dedb2973e251edcae55841d60786d578/jiter-0.16.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:adbb8edeadd431bc4477879d5d371ece7cb1334486584e0f252656dd7ffada29", size = 352754, upload-time = "2026-06-29T13:04:07.477Z" }, - { url = "https://files.pythonhosted.org/packages/da/6e/7d31243b3b91cd261dd19e9d3557fc3251a80883d3d8049c86174e7ab7af/jiter-0.16.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:31aaee5b80f672c1dc21272bcfb9cbdcfc1ea04ff50f00ed5af500b80c44fa93", size = 390553, upload-time = "2026-06-29T13:04:08.92Z" }, - { url = "https://files.pythonhosted.org/packages/25/33/51ae371fde3c88897520f62b4d5f8b27ad7103e2bb10812ff52195609853/jiter-0.16.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:6722bcef4ffc86c835574b1b2fac6b33b9fb4a889c781e67950e891591f3c55a", size = 516900, upload-time = "2026-06-29T13:04:10.407Z" }, - { url = "https://files.pythonhosted.org/packages/a0/45/6449b3d123ea439ba79507c657288f461d55049e7bcbdc2cf8eb8210f491/jiter-0.16.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:5ab4f50ff971b611d656554ea10b75f80097392c827bc32923c6eeb6386c8b00", size = 548754, upload-time = "2026-06-29T13:04:12.046Z" }, - { url = "https://files.pythonhosted.org/packages/9b/e7/fd2fb11ae3e2649333da3aa170d04d7b3000bbdc3b270f6513382fdf4e04/jiter-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:710cc51d4ebdcd3c1f70b232c1db1ea1344a075770422bbd4bede5708335acbe", size = 122381, upload-time = "2026-06-29T13:04:13.413Z" }, - { url = "https://files.pythonhosted.org/packages/26/80/f0b147a62c315a164ed2168908286ca302310824c218d3aae52b06c0c9a9/jiter-0.16.0-cp314-cp314-win32.whl", hash = "sha256:57b37fc887a32d44798e4d8ebfa7c9683ff3da1d5bf38f08d1bb3573ccb39106", size = 204578, upload-time = "2026-06-29T13:04:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e6/4758a14304b4523a6f5adb2419340086aa3593bd4327c2b25b5948a90548/jiter-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:cbd18dd5e2df96b580487b5745adf57ef64ad89ba2d9662fc3c19386acce7db8", size = 198154, upload-time = "2026-06-29T13:04:16.272Z" }, - { url = "https://files.pythonhosted.org/packages/26/be/41fa54a2e7ea41d6c99f1dc5b1f0fd4cb474680304b5d268dd518e81da3a/jiter-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:a32d2027a9fa67f109ff245a3252ece3ccc32cc56703e1deab6cc846a59e0585", size = 191458, upload-time = "2026-06-29T13:04:17.707Z" }, - { url = "https://files.pythonhosted.org/packages/81/6b/59127338b86d9fe4d99418f5a15118bea778103ee0fe9d9dd7e0af174e95/jiter-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2577196f4474ef3fc4779a088a23b0897bbf86f9ea3679c372d45b8383b43207", size = 316739, upload-time = "2026-06-29T13:04:19.663Z" }, - { url = "https://files.pythonhosted.org/packages/2d/95/49461034d5388196d3dabf98748935f017b7785d8f3f5349f834bcc4ed0d/jiter-0.16.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e89e008a93c01104161c75b4988e58716b01d62307ebfe161e52a56d2a818", size = 340911, upload-time = "2026-06-29T13:04:21.257Z" }, - { url = "https://files.pythonhosted.org/packages/cd/97/a4369f2fb82cb3dda13b98622f31249b2e014b223fe64ee534413ad72294/jiter-0.16.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2e9efbe042210df657bade597f66d6d75723e3d8f45a12ea6d8167ff8bbce3", size = 361747, upload-time = "2026-06-29T13:04:22.677Z" }, - { url = "https://files.pythonhosted.org/packages/28/51/49b6ed456261646e1906016a6760367a28aacd3c24805e4e5fe64116c1db/jiter-0.16.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f4d9e473a5ce7d27fef8b848df4dc16e283893d3f53b4a585e72c9595f3c284", size = 460225, upload-time = "2026-06-29T13:04:24.441Z" }, - { url = "https://files.pythonhosted.org/packages/33/b5/5689aff4f66c5b60be63106e591dbfcba2190df97d2c9c7cf052361ddb98/jiter-0.16.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d30a4a1c87713060c8d1cc59a7b6c8fb6b8ef0a6900368014c76c87922a2929", size = 373169, upload-time = "2026-06-29T13:04:25.884Z" }, - { url = "https://files.pythonhosted.org/packages/a2/96/3ae1b85ee0d6d6cab254fb7f8da018272b932bbf2d69b07e98aa2a96c746/jiter-0.16.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae96332410f866e5900d809298b1ed82735932986c672495f9701daacd80620", size = 350332, upload-time = "2026-06-29T13:04:27.302Z" }, - { url = "https://files.pythonhosted.org/packages/15/32/c99d7bafd78986556c95bf60ce84c6cc98786eac56066c12d7f828bb6747/jiter-0.16.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:da3d7ec75dc83bb18bca888b5edfae0656a26849056c59e05a7728badd17e7af", size = 353377, upload-time = "2026-06-29T13:04:28.731Z" }, - { url = "https://files.pythonhosted.org/packages/0e/4b/f99a8e571287c3dec766bcc18528bbe8e8fb5365522ab5e6d64c93e87066/jiter-0.16.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee6162b77d49a9939229df666dfa8af3e656b6701b54c4c84966d740e189264e", size = 387746, upload-time = "2026-06-29T13:04:30.319Z" }, - { url = "https://files.pythonhosted.org/packages/75/69/c78a5b3f71040e34eb5917df26fb7ae9a2174cad1ccbf277512507c53a6e/jiter-0.16.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:63ffdbdae7d4499f4cda14eadc12ddcabef0fc0c081191bdc2247489cb698077", size = 517292, upload-time = "2026-06-29T13:04:31.709Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f7/095b38eda4c70d03651c403f29a5590f16d12ddc5d544aac9f9cddf72277/jiter-0.16.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a111256a7193bea0759267b10385e5870949c239ed7b6ddbaaf57573edb38734", size = 549259, upload-time = "2026-06-29T13:04:33.721Z" }, - { url = "https://files.pythonhosted.org/packages/2e/c5/6a0207d90e5f656d95af98ebd0934f382d37674416f215aeda2ff8063e51/jiter-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:de5ba8763e56b793561f43bed197c9ea55776daa5e9a6b91eed68a909bc9cdbf", size = 206523, upload-time = "2026-06-29T13:04:35.068Z" }, - { url = "https://files.pythonhosted.org/packages/a5/31/c757d5f30a8980fd945ce7b98be10be9e4ff59c7c42f5fd86804c2e87db8/jiter-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b8a3f9a6008048fe9def7bf465180564a6e458047d2ce499149cfbe73c3ae9db", size = 200366, upload-time = "2026-06-29T13:04:36.61Z" }, - { url = "https://files.pythonhosted.org/packages/7c/a2/d88de6d313d734a544a7901353ad5db67cb38dcfcd91713b7979dafc345d/jiter-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0fa25b09b13075c46f5bc174f2690525a925a4fc2f7c82969a2bbabff22386ce", size = 190516, upload-time = "2026-06-29T13:04:38.004Z" }, - { url = "https://files.pythonhosted.org/packages/06/d3/8e278946d43eeca2585b4dd0834a887cd71136329b837f3a16ed86a8b4b0/jiter-0.16.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:850ccb1d7eedb4200f4014b1c0e8a577de114fc3cd88faad646dcc9bc4bb12ad", size = 304518, upload-time = "2026-06-29T13:05:00.172Z" }, - { url = "https://files.pythonhosted.org/packages/72/43/28d4ef495028bf0506a413d4db3f4eb3e7288a382e0f065f306a17bbeb5e/jiter-0.16.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:e34e97bda77eb63242a410243c071e28ac7e0d8c0948c5ee658498690a4b2f2f", size = 310207, upload-time = "2026-06-29T13:05:02.123Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ca/c366b1012da1d640de975d9683acd44e4d150d9068845d0ca2610435253f/jiter-0.16.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7dc85ea77d4abbae8bad0d3538678aedee75bceec4e2f6c8dfb1c74772e5aa5", size = 342771, upload-time = "2026-06-29T13:05:03.55Z" }, - { url = "https://files.pythonhosted.org/packages/16/52/50cc4056fc1ae02e7154704e7ecc89df0afb8300222cfe8a52d3f67e4730/jiter-0.16.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17ca7fae79f6d99cd9a042b75f917eaada7b895cfc7dd2ee3a16089dcaec7a85", size = 346468, upload-time = "2026-06-29T13:05:05.452Z" }, - { url = "https://files.pythonhosted.org/packages/98/ab/664fd8c4be028b2bedd3d2ff08769c4ede23d0dbc87a77c62384a0515b5d/jiter-0.16.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:f17d61a28b4b3e0e3e2ba98490c70501403b4d196f78732439160e7fd3678127", size = 303106, upload-time = "2026-06-29T13:05:07.118Z" }, - { url = "https://files.pythonhosted.org/packages/1a/07/421f1d5b65493a76e16027b848aba6a7d28073ae75944fa4289cc914d39f/jiter-0.16.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:96e38eea538c8ddf853a35727c7be0741c76c13f04148ac5c116222f50ece3b3", size = 304658, upload-time = "2026-06-29T13:05:08.708Z" }, - { url = "https://files.pythonhosted.org/packages/0a/db/bba1155f01a01c3c37a89425d571da751bbedf5c54247b831a04cb971798/jiter-0.16.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d284fb8d94d5855d60c44fefcab4bf966f1da6fada73992b01f6f0c9bc0c6702", size = 339719, upload-time = "2026-06-29T13:05:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/78/f7/18a1afcd64f35314b68c1f23afcd9994d0bc13e65cc77517afff4e83986d/jiter-0.16.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d613743df53199b1aa256a7d328340da6d7078aac7705a7db9d7a791e9cfd2", size = 343885, upload-time = "2026-06-29T13:05:12.087Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9c/1f/8176d92e001f86505424b41664032ae26a882bc9ca41a32c803f373f9195/jiter-0.17.0.tar.gz", hash = "sha256:03e432f226a453851079fb84cd17c6da9991eab723e28d716f14ae3d906e0c12", size = 229037, upload-time = "2026-09-12T15:14:14.253Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/fb/0b68a8666a203ab349334e502285153ac97e84a1a3e2f80de8385ed0899c/jiter-0.17.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ed1a24005daac667d577402d75a2922f9775a165b146b883ff1ad3602d8be689", size = 290968, upload-time = "2026-09-12T15:11:10.44Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e9/5993079500530586655c6f2823e2926b3f5ceddd49918c5a86757eadba3a/jiter-0.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b847b18d066c46b3b7ae49d6c94a7634c5e4a8983146ee25562a092000f5e3ad", size = 324072, upload-time = "2026-09-12T15:11:12.03Z" }, + { url = "https://files.pythonhosted.org/packages/2a/56/6f5dbffaa5b0e647386e3c3376aa150987538f1b13f6da1a9582787957af/jiter-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b68d3495d95da120651a5628c7ebadee84ed001a1b76e6afc325c42482f15b5", size = 344891, upload-time = "2026-09-12T15:11:13.387Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9d/8dd5719add6c77be95b23c129682a1484c5339ffd66736d66bfa6831a2f3/jiter-0.17.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c1a5336c04a41b1f1cf9572e294aec27cc569767ff73de7bf87a91f0bea7cb9", size = 328213, upload-time = "2026-09-12T15:11:14.655Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e5/82f885863afaa79efac066efdb7b70bd242ef83d3e548453d61b3737e54a/jiter-0.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b75f85660108965a94be77911a25a253429307294d9415b3c597118977a614de", size = 343033, upload-time = "2026-09-12T15:11:16.046Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/ee3cd7db1704ec9c274ae549803ef1369c801490f7f6d48d0aa3b9ac1ae0/jiter-0.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32aaaa764604496610a3ad2d98503ae88ccb2fbe769e892ff4533e778e85f708", size = 351701, upload-time = "2026-09-12T15:11:19.188Z" }, + { url = "https://files.pythonhosted.org/packages/93/2c/af9ca503b38683a82b6732352a861515f28e2d46fe445aea57e07fc86e06/jiter-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:826871c42cebaae22f0a2b5673a4a1a75c851bb2d13b3c17764a630a6b298984", size = 348754, upload-time = "2026-09-12T15:11:20.486Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ba/692b071b194270b019b7d1790adb8658193379b951029e5ad15a14a2809d/jiter-0.17.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:00b5a98df3e3a3e8cf7b619f4ac2f8bf975bbf3d95d02c5d17b8dbfe5c8b8245", size = 329263, upload-time = "2026-09-12T15:11:21.701Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8f/35a22beb6b9eb025b7e2f88a38ca3b9c87017aac237feec2583eabe243ad/jiter-0.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6af5b74073bd25bae695e6d00919f6a9be7ed5a9f8836d981eb1ffe84139e6fb", size = 337572, upload-time = "2026-09-12T15:11:23.145Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0f/4341ceb3ce08199b4e8a798acc0bb0c79b3e861b6cecdb9d3b5138965c5d/jiter-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:16dd0c1baf098ae70b8f3616574eb3fedf34e26670b89e16a7e67561f737ed2d", size = 485174, upload-time = "2026-09-12T15:11:24.394Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6d/92fa138ac82db9001b68563df204c32f2203bee84301df083260039ca23b/jiter-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:545c36a0f3b2238c242cc9785439d3242a871b7bc39fe3f441bcaa07bf3aa83e", size = 522115, upload-time = "2026-09-12T15:11:25.645Z" }, + { url = "https://files.pythonhosted.org/packages/52/92/9b11557ddf898e84c253d1c42cc1bddd8ad1a754b46b01ae35a6a253526f/jiter-0.17.0-cp310-cp310-win32.whl", hash = "sha256:155be7355bdb7ca76ab0961be8982c225f964a5c073a83984183f22391cc29fc", size = 188163, upload-time = "2026-09-12T15:11:26.793Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f3/b4381cc962fed7d505913d5920e9f51f1fd5cf340a563134e8cadf3604d2/jiter-0.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:37150a9e02e869475854fa20b7d0d5e26d18d0f8bc17293999973ff27e99ae7a", size = 231679, upload-time = "2026-09-12T15:11:28.911Z" }, + { url = "https://files.pythonhosted.org/packages/a1/50/17afdaffcc8af4bf4fddf2b6c26d066553aa2221983f2affcde435fc2532/jiter-0.17.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:cfafd7be8b16ceadd298db542cead37cddc211c4c49e04ad2596924df18625b1", size = 290699, upload-time = "2026-09-12T15:11:30.085Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/c185d32d5b3657ad84da26c84a9eb15f00aa1b39d6882fcc0052dba2d7c2/jiter-0.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8adca2e793288e5f1bb29279bb439d0d3cfbb50eddca7e7e6ffd42ff4f482406", size = 324246, upload-time = "2026-09-12T15:11:31.3Z" }, + { url = "https://files.pythonhosted.org/packages/24/7a/8b8903bfe91a90a8fa1ec9b45d9fda5b6287a386693b69d720a882d73f3c/jiter-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c692d567ba206c7cca38c9d1d0ccc70c9786290173c184d871ca12e9981ed7", size = 343275, upload-time = "2026-09-12T15:11:32.758Z" }, + { url = "https://files.pythonhosted.org/packages/a2/5d/6821fae2abc71a3c3a84bef8598d31fc4f27d9edfb55bd8f6c08afb8ef93/jiter-0.17.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81c83c0abe614446a283d994d2c07c4f58632dea2cdf66ba9e2921bb8ccd593e", size = 328034, upload-time = "2026-09-12T15:11:33.9Z" }, + { url = "https://files.pythonhosted.org/packages/f3/51/8e7a963b1c2dfdc01d6228b004f50a2a3d7c46f0549d7b096a5d15ef81d5/jiter-0.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:073dc68c1a700c8fc480e877864a6b6ffc887533e261f4380c08c16bf09d057a", size = 342457, upload-time = "2026-09-12T15:11:36.414Z" }, + { url = "https://files.pythonhosted.org/packages/73/27/8b2a267e3bda45d9298331cacfe3521e761f0a2b05ad10a23c6548d08358/jiter-0.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:492f37230bbf9581ab2c17bcda862c249afb9ae2e3ab2dd6db59943bc4cc3153", size = 351271, upload-time = "2026-09-12T15:11:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/4a/8f/5c74e5e142a6736833d7a991ab04d5c0738038dc44db05af0bb3cd2559e8/jiter-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5888fe5abc1ca2fa834a3e1b4c7ef0dcece286a7d7e95a609ef0934b777b9fc9", size = 346052, upload-time = "2026-09-12T15:11:39.722Z" }, + { url = "https://files.pythonhosted.org/packages/98/9c/f54920f06d1696e80b1be841d56412871c6856b1b1e3b541b1ed35346554/jiter-0.17.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:84ac78df457e1ee3f7e733bd114823302ae8c5ad5542d7e6647d92ffaa090a04", size = 328915, upload-time = "2026-09-12T15:11:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/21/53/080f126863bceb055db9f1fd5431485eb493b35545a3c35e961ac18cd924/jiter-0.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7573e80232c5bcf80c24c038cf7e53a463f5c3b1dd1dd4109d66304f4dccc233", size = 337240, upload-time = "2026-09-12T15:11:42.356Z" }, + { url = "https://files.pythonhosted.org/packages/f0/76/3ab742823a0e0e70e143c6c90a482d9d90396ac2445e7b9483eb7245d3b5/jiter-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:11902505d401691720f5785c15b02204248526edee11b635cd6c40cd52b81599", size = 484917, upload-time = "2026-09-12T15:11:43.549Z" }, + { url = "https://files.pythonhosted.org/packages/14/e0/8ca71bc8b9cc9ed96c9da565863e00f3bb875a8fb82abcf03e975e067902/jiter-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:64846211a2debe7c071d2146d2283d2b0c1c93dc8fd5fb7794faac2ca6061b5c", size = 521868, upload-time = "2026-09-12T15:11:44.704Z" }, + { url = "https://files.pythonhosted.org/packages/c1/02/81f8719dcedb75713082a2048405376c81f6546b75af8167f3bba01a1ed0/jiter-0.17.0-cp311-cp311-win32.whl", hash = "sha256:c19b9357309b8cc6de8a48fca8e44a8c9c2feaaa2f5896d037fa505d48fcab80", size = 187844, upload-time = "2026-09-12T15:11:45.874Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8c/59693f348488f01ed12d862e99ab8da14961152d3e9c39b9b1ef363f3572/jiter-0.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:e654b6b04e39c9cb19cb8b04c6ddf1f2db07751fa14156413969fd78bad0e5cb", size = 231402, upload-time = "2026-09-12T15:11:47.083Z" }, + { url = "https://files.pythonhosted.org/packages/fe/89/fb35e286463cb9f01edc2c4e47df6e5477ee36bca5096414e9ea87985588/jiter-0.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:3ad556afc289f15d2b181b941982d01f06190863c07440185b9f354e1bd2def3", size = 187006, upload-time = "2026-09-12T15:11:48.245Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f8/07bd8c3a23f7a8a6875e6a820bbffe1483a18f18f9398a91b5495123176e/jiter-0.17.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ebf918dfd6a74adc1b9ad71f63c4ab00902fcd3b7fd39f2e24d871db8d713b91", size = 291633, upload-time = "2026-09-12T15:11:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5e/0de4c6f84ffefa6809ffc2d550b9a314365acf7e7ec9b6c7375d49047900/jiter-0.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61aed66ee042b3b49ef85fdf75714234d055d89d8496ac1c6e47f89e7a30d5e4", size = 321695, upload-time = "2026-09-12T15:11:52.727Z" }, + { url = "https://files.pythonhosted.org/packages/20/ac/befe2e82065bee37a0252081666ed2f48c1ac5f5c6c318c2de8168ba393d/jiter-0.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76eb4a5c20e86f9f848286f167024890f2862258a965d254774deb7fc1545ca1", size = 341967, upload-time = "2026-09-12T15:11:54.231Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cd/9797c1e529746750ae589da7c1a8c24373f00d88e11a989f9e5eb1959079/jiter-0.17.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bcc064f99183a9cbe7f26ed648c352031a74145cd61ed75d34632c73eb46a5a8", size = 326546, upload-time = "2026-09-12T15:11:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/d9/fd/e6914c38d6347bab4ebff2b1f0c0f191db276e7a1d5c376176757da42fe3/jiter-0.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73b64e69c4150748e020356d958af94bec33c70a0a93d665cfa8f6d580fe1a63", size = 340995, upload-time = "2026-09-12T15:11:58.211Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7d/611b3abf6f88945b5474da5cdc6d1a185e805ac9bf446bb7766dcda6ea87/jiter-0.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0bc7f684b65bcda9c20434267577db71bf9905ceddd32b60d1d93278d8c8d3a", size = 352188, upload-time = "2026-09-12T15:11:59.414Z" }, + { url = "https://files.pythonhosted.org/packages/52/f8/b6e513ecbdf3b3cebe587c2279281ecf775b729a58cf4cc7bdf898ded029/jiter-0.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c21265b251d99bbb40080d178a8953e35601d3a1564e05c4de4c0d2ca616797", size = 345025, upload-time = "2026-09-12T15:12:00.697Z" }, + { url = "https://files.pythonhosted.org/packages/28/a8/fe26d06c5a6c5a4cfe703c5154c8a140da1305671eb3681aba9422d4f393/jiter-0.17.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:f3d7f7b34114f7ddc6d72a8e882d49de636b35d9fd12b4d420d3c5729f6c9812", size = 329180, upload-time = "2026-09-12T15:12:01.831Z" }, + { url = "https://files.pythonhosted.org/packages/e1/58/e6d66a26af40a20e62486feb7e222fd50f6e7aaa4f107abd89675dcc835b/jiter-0.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5078ab00664307fab2019b522a93aeb191122789f085daf5fd9e362154021d4a", size = 335805, upload-time = "2026-09-12T15:12:03.056Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3e/96520aa2fef5ef831d95483a902140bfab83dcac9eaa74f7df61b5e50a1b/jiter-0.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:470e1b1e4c42f1ead2189166a299691871a2df5056c976e7fb96feafaf5f9d44", size = 484121, upload-time = "2026-09-12T15:12:04.414Z" }, + { url = "https://files.pythonhosted.org/packages/6a/8f/5d9d92fe538bf36ff481a2278c48147e59c1cf8eb2f7be665260665febe5/jiter-0.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6aedeb7352b8f3b6af9cbd67983840165c00428e63f1b420a85885128ea31", size = 521310, upload-time = "2026-09-12T15:12:05.612Z" }, + { url = "https://files.pythonhosted.org/packages/50/06/a09f979b22e652afbc3de66c709b2ba92edcef555f7535ab937c86b4f21a/jiter-0.17.0-cp312-cp312-win32.whl", hash = "sha256:362bb47423886d45a9f705d2d9d4008c6eedd4e41eb1bab4e96fb6daa06b33fd", size = 185029, upload-time = "2026-09-12T15:12:06.994Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d9/98265a005b2473ec2be5a84e2b64c2f65382c673879f1574845cd4bcd77c/jiter-0.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:9bd3caac219df476dd0cc3fe01d2f1581ed588906feac767abd9614c1c12f8b3", size = 227381, upload-time = "2026-09-12T15:12:08.823Z" }, + { url = "https://files.pythonhosted.org/packages/a8/11/2e05bf5a56e57a543ebb8f585074adf09383e99d7b062dac92eab1f4d57f/jiter-0.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:36ee6e69027396664e59995b9a635a947a5304ee9837279584a0bb8145c8f6b8", size = 183610, upload-time = "2026-09-12T15:12:10.374Z" }, + { url = "https://files.pythonhosted.org/packages/40/eb/2c4a8075ed5ea02b56911e9375d4c8d7784572ff4af32e5a99ae0d071044/jiter-0.17.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1b18434638228c0c184281609bf3d9459026a0f1ea48fb76c205e3ef72069caa", size = 290991, upload-time = "2026-09-12T15:12:11.641Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b1/34bfa29599d420423baac6ff7cada6674fe63d5a7a2ccb3900b904678783/jiter-0.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ec89771f4272b989487a6364e519db6bbaba323e8bbf949ac89a45ea9c18b7a3", size = 321425, upload-time = "2026-09-12T15:12:13.855Z" }, + { url = "https://files.pythonhosted.org/packages/11/71/a5ac64a62a04aebd556afadab14a6b730001e16df87266ded943a100a1d9/jiter-0.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e3f052c671d5f425cca5ea5901cf11a831369fba4a55a3862cab93c323b4c3b", size = 343138, upload-time = "2026-09-12T15:12:15.046Z" }, + { url = "https://files.pythonhosted.org/packages/01/dd/f761e320ea473314cb68612bc6a435393464dbd198051399b36848b4ebf3/jiter-0.17.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:785a216bbaf8f15fc974e964ced7322cd3d774bb0e86949edd78c6bffd6ba35b", size = 325805, upload-time = "2026-09-12T15:12:16.506Z" }, + { url = "https://files.pythonhosted.org/packages/19/1a/27d8e40f0fb29bbc7a5adf30907144396a115dbe93d5d8976c054a6dfe96/jiter-0.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d85c558c9f8532bba287a990ac63767c7daf756f0d8c030219f62499b1fa228a", size = 340230, upload-time = "2026-09-12T15:12:17.682Z" }, + { url = "https://files.pythonhosted.org/packages/ac/c0/30bcde78a28155461f965d16b7aca4ffca6d17494d905f7a0bb072e6c64e/jiter-0.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c23849235d2142ce444b2b8c6eceee9f82f4cc0bd5c9081602e4155c6197807", size = 351343, upload-time = "2026-09-12T15:12:19.337Z" }, + { url = "https://files.pythonhosted.org/packages/27/17/91420b156315ae22732f5ee1a7b5725a030aab9dc8fd7dcdacfb4aa588d3/jiter-0.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58df29268a95e910f17db7ec9178eb7f15aa8619aaca3575275c4e6b3f4fe4c5", size = 344990, upload-time = "2026-09-12T15:12:20.705Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a2/ae6d5672644cc11127970277c9aeb0fa6fae376845587f5b0a8e8828167c/jiter-0.17.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:a277f97eba7d66b1ee27eb5dab5b774ff46a10c78d89a1d3dcce04ce1357c8ca", size = 328624, upload-time = "2026-09-12T15:12:23.859Z" }, + { url = "https://files.pythonhosted.org/packages/04/62/45cb1162f6aa586536e4a973fc339d72dc6b08cca030d70a838a307aa778/jiter-0.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe15ddf316f1f1f643347d3a474e74ce61880c79a11ec5dca53df20c071bd3e8", size = 334731, upload-time = "2026-09-12T15:12:25.229Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5f/45c1574b644da7deda0b7591c349520dcf83ce45b24d7ca19922dab1fc27/jiter-0.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:02adebb7ce6413c44d40af9ad59d1c1cd79630ccdcb6f7bdd2d461e48c03d8f9", size = 483649, upload-time = "2026-09-12T15:12:27.557Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d3/ebea1ecb5b241c519f192b30215c79a8e47f42f1621acbcd6f8830728416/jiter-0.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:55d0e0e613a3f9ad600cf436e0e2b8057d1b52bcf1d91b2d36ac53451231e6a8", size = 520758, upload-time = "2026-09-12T15:12:28.99Z" }, + { url = "https://files.pythonhosted.org/packages/64/e6/682b641ff0765ea9bdc349dbc7d223de5c8af8ec1abda0db3406992f92fe/jiter-0.17.0-cp313-cp313-win32.whl", hash = "sha256:2c45ad7c973ef33fe5114a953377b35a95240f4542c0724d9f781e47dc24bac7", size = 184334, upload-time = "2026-09-12T15:12:30.813Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d2/9a49aac2b27af4cc5015e368c0cc3588491a532f717a668ffce1f1ac57da/jiter-0.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:a3cebb1fe4a1abb00465f3f8a17e09112603e8b7c59e5c3adbcd9f7815a64acd", size = 226601, upload-time = "2026-09-12T15:12:32.096Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ce/9a43e9f614608eafa78de22aedcff54cd21324467b5d442d5c9b00244145/jiter-0.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:96b8b0c6dc5d78682f54a450785e075aa929cde768304cad363cd4efba5a82ac", size = 183103, upload-time = "2026-09-12T15:12:34.396Z" }, + { url = "https://files.pythonhosted.org/packages/01/9e/23065f8e2c7a4c372c1b6f6622e4cfab4dc786cb5150052b1527e6a6a840/jiter-0.17.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:00d783a779c5664e16dbad5e3a3c3a75e128b07dd5f4765159658d9210a50ca5", size = 292210, upload-time = "2026-09-12T15:12:35.613Z" }, + { url = "https://files.pythonhosted.org/packages/ea/81/67b58647560bc82a4490d722caa8561d7a86a9f45d4fa620b7e5fe282c7a/jiter-0.17.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0619d806e260ecf0c2a64521942c94af5d547c9ec99b55ae4f51b538b5576a76", size = 321512, upload-time = "2026-09-12T15:12:36.907Z" }, + { url = "https://files.pythonhosted.org/packages/c7/07/6658359a25f55927f7f8bf0e16465dee2ccd0b2a1a5208acc0df8972e074/jiter-0.17.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc0288ce39190ee33fe6e4ec73161eed34e7e2da509b525546ca061778d62b64", size = 343897, upload-time = "2026-09-12T15:12:38.189Z" }, + { url = "https://files.pythonhosted.org/packages/46/04/5d50a9f0319cbdc37fd53c27f8c313d46afc34f1b048219ae6d8ea068da4/jiter-0.17.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a52a430d04225ffde633e6840bf2381d34c019ff98526b5929755b9052fb199", size = 326519, upload-time = "2026-09-12T15:12:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c7/d02517832b29eb8275fdd0f4ce0f17b80f58cc4c3ebecd4d9ace990d633d/jiter-0.17.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37f33d327900bf2879613b3363fd48df97b4232d0c41f54bcf2e790c2fc40a71", size = 341369, upload-time = "2026-09-12T15:12:41.486Z" }, + { url = "https://files.pythonhosted.org/packages/3b/07/499b5f5603501cdd93a73a6a176dfad9c96555a3ae58ca9f8e3acba63dc9/jiter-0.17.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cf564d43c4388149ca58ee571d0f5ccf875e20d1fd4662fd94cc0d1ea3b10ef", size = 352160, upload-time = "2026-09-12T15:12:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/f5/75/b04013c7743269d4533ef4e746fc0ed678a143968dd7448658e3f51daad2/jiter-0.17.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:523c499235fb65add25d4bb01b1c4709ce695efdc7deb6c0a7bc515b5c44e0fb", size = 345018, upload-time = "2026-09-12T15:12:44.192Z" }, + { url = "https://files.pythonhosted.org/packages/1d/96/cbb6fd1e42a77c8412ec4643db95059b30cdfc635e387cc9193e098ce268/jiter-0.17.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:455e4ab35cb2a4a91a8404e08fd3c621bae433922e59bf1c494fe20a426b013b", size = 329244, upload-time = "2026-09-12T15:12:45.491Z" }, + { url = "https://files.pythonhosted.org/packages/15/67/d3be402f398566a379bf40ae65be5c3505b14d9e95e0802a597ddde7ddee/jiter-0.17.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6871973bfbd4408f7f1c632b30bbb5bbd9671c1bc8650af6823e24b7be13709b", size = 335693, upload-time = "2026-09-12T15:12:46.935Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8d/98e2c4130b93d64f1d67c89060b928d04102549bf05e64451c9e6024f9ca/jiter-0.17.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:77f6aac0137309b31448c1bdcda4c6c77077664a6d018ece8d94019c68a5a5b9", size = 484329, upload-time = "2026-09-12T15:12:48.361Z" }, + { url = "https://files.pythonhosted.org/packages/78/5e/8da91e49f0fbca37c3489fb4cf3ad6676d4965f00ae5468bca3a2513737a/jiter-0.17.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:93946d89fa04d5ba64dd323a8dd8d901676cb8a3c81d99ae4f6c051a9b4c3f2f", size = 521358, upload-time = "2026-09-12T15:12:49.856Z" }, + { url = "https://files.pythonhosted.org/packages/be/21/5388684a5a38af3557cd9c2424b9827c71809cff24373c75ef9d0d3dfba9/jiter-0.17.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:70f19a2ca8429f91e82eeffb2f51cb87bc2d6e953b009b91a92d29c3a16ccb03", size = 110459, upload-time = "2026-09-12T15:12:51.747Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ad/58b3a93525d2ffca7f54d9dee441381990082bd1172fbeb8d6a3f72a4dc3/jiter-0.17.0-cp314-cp314-win32.whl", hash = "sha256:71dbd74314c5df52a1bccf7b8bca46d14e943af7a2012e73b23f49977ef194c8", size = 185043, upload-time = "2026-09-12T15:12:54.477Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4a/1aa520eb6c359b262c14ff995ca7283837208ddfb1202082ce9d73cf214d/jiter-0.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:ac3c6ee3264d6f5c44c617f90bc7e8b9e1587e7d6708c9d8f811cb65582ee312", size = 227163, upload-time = "2026-09-12T15:12:55.931Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e4/5997f648794bd9b499491d0ff480b096cc9a9c65bdba29f57568e6aa1705/jiter-0.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:6219adaf59711ba7063a52496e8ec6d3fa3e209d7827d83eee3b2abc780a1744", size = 183505, upload-time = "2026-09-12T15:12:58.196Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4a/84a5ec271d09f7590b6073af5ee4abb44eab4ccace453b7e2c5ce45234ca/jiter-0.17.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:59bddbe6f9ffecc68d641e1e2d619ce64cf8a9e9eeb74e5c518f74fc87abf1b0", size = 321527, upload-time = "2026-09-12T15:12:59.394Z" }, + { url = "https://files.pythonhosted.org/packages/39/71/9e1fd0045f5920b4c36be35c3f0f0dfd123668684f8ad352619d7aa44183/jiter-0.17.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cb41cd1432f1dc19a231cf70b54d42b2c9f05085155859263fce06fa4d41388", size = 340865, upload-time = "2026-09-12T15:13:00.756Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2b/14627fd2bc377f3dd09491bcace6b90e34b4d7fea2f1f3295031ff91f528/jiter-0.17.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd7790aa79c8b518e512ebcdfce9f11d8ef5f30efd43720c8a19a548b39fa489", size = 325412, upload-time = "2026-09-12T15:13:02.152Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f3/8d5808f7bf0f456bde79e6393587183a0cee5f83d179fe1f7f1eff2ba067/jiter-0.17.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbbfe4e3c21c8166980cddc5bee1a315df082454f007947dfb6fb73800768165", size = 340473, upload-time = "2026-09-12T15:13:03.485Z" }, + { url = "https://files.pythonhosted.org/packages/4f/da/1d8c7c6c4ae6b2423b94a81b6b907d37b28f87664e077427b531bf1b5313/jiter-0.17.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c286860abfe8b100cac1c02e225e5776eb9216edd71ba17cdb237da4af32bc9", size = 350757, upload-time = "2026-09-12T15:13:04.828Z" }, + { url = "https://files.pythonhosted.org/packages/eb/96/c1813dcca15c5a370145a448aaea7d1f83f6f0228a5f1130e79340ee385f/jiter-0.17.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f753eb70b1474a29e635e7542ff7312e6d6b951e0b25e8a2e8c34eeb1ddcd478", size = 345203, upload-time = "2026-09-12T15:13:06.131Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f7/fc61cbcf2992d169ede13648fc3fd8e2d3171a3669dde43cd4db556549ac/jiter-0.17.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:eae86b1f027031e39db2e0e9c4842221edb7b8cd474d23f87a79b3bd4b651768", size = 328322, upload-time = "2026-09-12T15:13:07.392Z" }, + { url = "https://files.pythonhosted.org/packages/8f/88/46418a3abbdffb7dc41b314200360f24f75faaeb35573e81c92de322cce9/jiter-0.17.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bf350452a43173e69e1fc74847c57a60e3d7515807287f29849baa2a85d8718", size = 336570, upload-time = "2026-09-12T15:13:08.666Z" }, + { url = "https://files.pythonhosted.org/packages/f0/28/b8a55b949be6306df8888e365a8df05441de8a7b11289f6957004302e41e/jiter-0.17.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:da139721f4b7cafdbff580a4f511ea24cb91f4909330c6b926a1ca53836c0a59", size = 482879, upload-time = "2026-09-12T15:13:10.037Z" }, + { url = "https://files.pythonhosted.org/packages/75/3b/21d0afa53ba0680962c39f3eb95ed2946f8793369ed44b0c82b490723081/jiter-0.17.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:8079849db9a1371bfd90bad088458a8fb836261879df2233cc9632464ecf64e1", size = 520406, upload-time = "2026-09-12T15:13:11.456Z" }, + { url = "https://files.pythonhosted.org/packages/ef/03/bcbaf8b6b9ea23c2c074411f8ecfbb02d820abac5d0cb8f4e280209174a2/jiter-0.17.0-cp314-cp314t-win32.whl", hash = "sha256:8f770b0c77e5fac482e1ba03ca1a7e18286bfb213d749932a00a7e4cd5de5e06", size = 184434, upload-time = "2026-09-12T15:13:13.037Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b5/5d6ce2c93ef6fe1241b37a9005547f9b6d58db1f07f39fe95807d4b98f51/jiter-0.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c4289293e5278d9314b00f15c37f2120fa51d3d68565292e715524c750e775a9", size = 227392, upload-time = "2026-09-12T15:13:14.933Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4b/1e52baf90187606e33a7b8cfa8f96f5829acd7f01870077eb01059ab76d0/jiter-0.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4dfbfe5a6e1e80a7082af559f66386405025ec278833e0c649f69cbc6e1004cc", size = 182776, upload-time = "2026-09-12T15:13:16.239Z" }, + { url = "https://files.pythonhosted.org/packages/05/fc/efe3ac75564ab10f53517958f5ccdc231fc7334af66c76776cb554a88967/jiter-0.17.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:84963d3f395ef5e9a32ce47155e08a7962fa292c159a10cb98b931cef1416925", size = 292143, upload-time = "2026-09-12T15:13:17.502Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4c/46982118d91f9ffe9714319d21ec4f98d9b7e0cfd9062826c524a54de24e/jiter-0.17.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:ffa0380ad091de7d3fc33e17a97ff479851ee18a0a2a3ee56ff3215cdc886656", size = 321341, upload-time = "2026-09-12T15:13:19.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/12/9b1ac6ecc6307049913db54839ddba1c11c1ef72c5a8bbb5514bc3b50d1b/jiter-0.17.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755079792868ce5d4938e83b91a0939b34fb858a1ca65a104f2d771bea57faa1", size = 344383, upload-time = "2026-09-12T15:13:20.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b6/527cc72af836d824e9d4d666e64f0a1ca7eafd662a8da9657b78592172ba/jiter-0.17.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3bf4dc2b84a464117fb097d15a25c58d100d2692888e3b0d92df5b48ed16b7c0", size = 326841, upload-time = "2026-09-12T15:13:21.83Z" }, + { url = "https://files.pythonhosted.org/packages/d1/41/567f98617e88005b249503b933803f633ec6ba2d427cf4cc35e5c832125c/jiter-0.17.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02a360707033d8cef53f7f3480817a1489177a259ec6ec01e98c37e0b922ddca", size = 341354, upload-time = "2026-09-12T15:13:23.323Z" }, + { url = "https://files.pythonhosted.org/packages/40/da/b29cda895b785f7d426e224638a885b6145a08ce853b381f34afe3e88c5d/jiter-0.17.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:300ce01ab0215e3dea4d00090143c909aedc65c0f809b3c07983e1d038f291b9", size = 351985, upload-time = "2026-09-12T15:13:26.526Z" }, + { url = "https://files.pythonhosted.org/packages/f7/5c/8a73829e7389e72ea298a450f2b3cb58e71a3e464b45f6d8753740f1c4f5/jiter-0.17.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746243a080b4ca790b8499af3d7cf9825d5f5987933950cd818e767ee353d826", size = 346052, upload-time = "2026-09-12T15:13:27.887Z" }, + { url = "https://files.pythonhosted.org/packages/1d/2f/98d6001026932c095ba440925570123043bed29f5ff56158dfe729a9e81b/jiter-0.17.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:b550585523339b71cb852b811aae49d08d7601ad8ffe9f5dc1562f4c3d22fd87", size = 329159, upload-time = "2026-09-12T15:13:31.569Z" }, + { url = "https://files.pythonhosted.org/packages/94/2e/708dc1d2678f092c31c12754e860cd8353e6a85ecbdb1010157edca0da9e/jiter-0.17.0-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0239520085cac678e77a606fd7e3f1c60c371d719790c5e3807388d3da4354c2", size = 336001, upload-time = "2026-09-12T15:13:32.846Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/75a5ae38862f4eaf0fe2f8a9fbf6484c4890df04c06dcdffc45e36bca61a/jiter-0.17.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:eb2295da7c3769f6719b227a237aa6a5cfa6550e478bc838001b592c57e16575", size = 484281, upload-time = "2026-09-12T15:13:35.333Z" }, + { url = "https://files.pythonhosted.org/packages/a0/32/6636fae811c27c7f93e1b11fb5800de6a5c9e4269a27cf718e0b31218ad1/jiter-0.17.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:e088612ff90ebc9247e1a43074b72835804261c47e6a6c01cb3ddcb55360d688", size = 521300, upload-time = "2026-09-12T15:13:37.101Z" }, + { url = "https://files.pythonhosted.org/packages/61/aa/12df7e0b0b1a2602e3d5a5a7104d7d9700f254b400f134a9b50955c4d231/jiter-0.17.0-cp315-cp315-win32.whl", hash = "sha256:0b52d52035b3907c5b1f6277857b29c1cbfc965e24e0f27330dbed83edb591ec", size = 185138, upload-time = "2026-09-12T15:13:38.901Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ec/3dd2e495032cddde05723c1f4c743b67a23e55d2af244692a7f58f0cdae3/jiter-0.17.0-cp315-cp315-win_amd64.whl", hash = "sha256:10f5558eed511b830488003449d942bd75829ad6257dc58cb9a03e596a7777b1", size = 226950, upload-time = "2026-09-12T15:13:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c7/ef85704e0a57e9cadb2babc05f6d7c5df4a1c75da1a6ee31e1986b0099a5/jiter-0.17.0-cp315-cp315-win_arm64.whl", hash = "sha256:fa13acf1046f95df808c64b1310705e143fab87aee73ae00cc42d640867fd2c1", size = 183618, upload-time = "2026-09-12T15:13:41.432Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9a/a4b348349de68762b58d6713973d363ad80a1c741d0bf8def7975f0ecb26/jiter-0.17.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:af2f7501580f274b63c4b2283bc425f5df7edf06ae5b171e5f87d912ff359a20", size = 321155, upload-time = "2026-09-12T15:13:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/aebd6d0b5f0677de3a3d0bdc4a05fac949b97c4ede454c8809f180ac7b17/jiter-0.17.0-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10c5349312e5cb02b7a21e123a57665afa895953f05bf252a9dd4c13a572b7ab", size = 340985, upload-time = "2026-09-12T15:13:44.115Z" }, + { url = "https://files.pythonhosted.org/packages/a7/82/4c3b49796b5eb62f3f5046f957683f4ba0135fe1a60957c11180512460df/jiter-0.17.0-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:86f3f9343a288eb85a81ef20a752b2f84564296636db54a9fff0b5c8deaf1df2", size = 325670, upload-time = "2026-09-12T15:13:45.901Z" }, + { url = "https://files.pythonhosted.org/packages/bc/43/f6341ecb4872202a4ef150486fcee0e1ace4aa3da39b71b82061452cdd3a/jiter-0.17.0-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4607ec7d93355fbc25b8dc5189153cf21d66063b9f9cd04dd2774e6e783f9b6a", size = 340339, upload-time = "2026-09-12T15:13:47.442Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c4/bc2c86e08fa065e03cb2fbc53b367c3640a7d257ef9d877b29118ea636b7/jiter-0.17.0-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10cd64a5720ad7f809ac5466ff1705813f1b6b510f195a73acafba0ac0e1f675", size = 350705, upload-time = "2026-09-12T15:13:48.848Z" }, + { url = "https://files.pythonhosted.org/packages/9d/67/91f12aa111cca6e3a197c3e36bf60a034bf9f122f6d41112a639e44217d8/jiter-0.17.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe9f61bb30174d2f5c8396445c360c96c44e78164d0815dfe627ccf57849574", size = 345011, upload-time = "2026-09-12T15:13:50.215Z" }, + { url = "https://files.pythonhosted.org/packages/f5/cb/9f5556e8f6ec89755fb5a709d8eb8270c9a324e31079eda0dfbeca451b6e/jiter-0.17.0-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:370d8fe5bf201dc6925e8a84c81ac7291f74d9fd1778234fc79d517064a5c76b", size = 328268, upload-time = "2026-09-12T15:13:51.809Z" }, + { url = "https://files.pythonhosted.org/packages/22/98/153f20680fb75781a490fb849940e2b00f95035c7aa054df592f36ed33fc/jiter-0.17.0-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b303d88e6a0bda789ec4b7801c7bad68e27230ba1fe4baffc756d1fbd32dc9d", size = 337024, upload-time = "2026-09-12T15:13:53.095Z" }, + { url = "https://files.pythonhosted.org/packages/af/59/b16c9be3a5035df4466cc72e888188c027562de90a723d290ab6814cb9d4/jiter-0.17.0-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:30793a24a31e968969757c9e08d830cbb15a2cd3c4959b4498b38f4b1c2258eb", size = 482766, upload-time = "2026-09-12T15:13:55.713Z" }, + { url = "https://files.pythonhosted.org/packages/d0/55/667dea313094024bef082175d6bfe8976f90d1c00c926af9df1d8e0eab48/jiter-0.17.0-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:686c93d86f2b426c803024b805bd161a6cd10e9627c23e901640eab646c0ad8a", size = 520367, upload-time = "2026-09-12T15:13:57.674Z" }, + { url = "https://files.pythonhosted.org/packages/21/e3/4b1a43501fb9ed17b01d137e380cb0e8fdcb39a254ce31aa2ab95bc861ac/jiter-0.17.0-cp315-cp315t-win32.whl", hash = "sha256:86d703d9faa1ffc8ae4e9de0fa007712ed2171b5c0d93811a8e2e105ac729b0d", size = 184603, upload-time = "2026-09-12T15:13:59.27Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f2/b8ee0372b6ebdf1bde5cc44495d5291d17f961065f5b48f8616cc67cac2e/jiter-0.17.0-cp315-cp315t-win_amd64.whl", hash = "sha256:42b0260445251b1bc520a63baa94a32d88e0f931fba234f1764db7feb7c72174", size = 227936, upload-time = "2026-09-12T15:14:00.472Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b4/923a1215daba959aed8355973315cb3f81f53e0d01c5b211870a27b41f45/jiter-0.17.0-cp315-cp315t-win_arm64.whl", hash = "sha256:d47687806f9c54c84ea38733507081337922beca90ce819c7d852dd485bc0f23", size = 182977, upload-time = "2026-09-12T15:14:01.799Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/05a917204413e2e09906dfa35240c1021227aeb56c7305abea9562c598b4/jiter-0.17.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:eaba834b72d573547b9d966465b3394b749d5e14208cc70acb63aca37619ab33", size = 288143, upload-time = "2026-09-12T15:14:02.998Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e1/a1cd3c0cf8f79945939e4f8caae9990529f67d7f77f671769f73956329b9/jiter-0.17.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:51e1519d676a9f14dad9c2a411170d43b022ddb7989562df4e849b261ce127b2", size = 281847, upload-time = "2026-09-12T15:14:04.414Z" }, + { url = "https://files.pythonhosted.org/packages/72/b4/9b797679e09f4a46c32986aeb3670bd9bc562fc0b373c7a0ee5c5dce1206/jiter-0.17.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ce4feb52493e3513335b2accdcd75605652e4632772d3c8c2f7b86954d7f39", size = 304797, upload-time = "2026-09-12T15:14:05.733Z" }, + { url = "https://files.pythonhosted.org/packages/25/4a/0d77415b27a00d970e4e710f7c1de62e96a11c4cab3ed1add0015af04626/jiter-0.17.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29f49b325e0234e4ad9ecca5b861ffbd09b95ccac9bd46fa55841b6e56eea5fe", size = 307815, upload-time = "2026-09-12T15:14:07.105Z" }, + { url = "https://files.pythonhosted.org/packages/17/31/4bb27f54333d3b9ef1e5bd3312dc0b4bbe59c68bb0885fdb40583a6b1567/jiter-0.17.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:454c4997d73cc466c71fd565d91e603b0274e48ea0c6b0b7a7aee6967e4ceb7c", size = 288415, upload-time = "2026-09-12T15:14:08.455Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/879570ecf82574eaea77c5eb10309f4b630dece5f2a556e9814a90ba3f2d/jiter-0.17.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:40d2c240f8f80b5b0f201b29f0ae129c81448c60c772227a41747b5e0026f6a2", size = 279113, upload-time = "2026-09-12T15:14:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/77/7a/1f0b8a35fbd079a4f1752c31a15dc99cf277f863747c459be0af39e900e5/jiter-0.17.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e05f5adbf68c4bd11e1610f394034d984152988e84be6f8314235ce6f2139e5", size = 303708, upload-time = "2026-09-12T15:14:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8b/d76219ebdbcf3d4209d9d21a0810db4c8d0a6f88e3ee87d30bdea4e90d30/jiter-0.17.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c0bf24c72fd0491405dce5d40194f2070e9021ce648c1a1d46234b93d848ff", size = 307147, upload-time = "2026-09-12T15:14:12.897Z" }, ] [[package]] @@ -1865,14 +2024,14 @@ wheels = [ [[package]] name = "joserfc" -version = "1.7.3" +version = "1.7.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/c6/b1cac0280f8efc57626ea8804866b37099f23cae11b1485a42b213245e31/joserfc-1.7.3.tar.gz", hash = "sha256:116955c2587139dba20621fd0bd7fc9255fa960c9fe7f43c43ebef2e801dcfcf", size = 233821, upload-time = "2026-07-08T12:41:42.66Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/94/80fea1514b7c6d7d37804d3fe9ca81455f633347fc98731bd71ffe1faa17/joserfc-1.7.5.tar.gz", hash = "sha256:d5ff536e658e17664f8c1b1ab60dc4aa62aa973fcef1edd33cc44bda45d6f5ea", size = 234990, upload-time = "2026-08-29T13:05:42.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/f5/650b59d1b74f5befb7a7a7e7d7c92a26b94256df3541e2b4914152cd177a/joserfc-1.7.3-py3-none-any.whl", hash = "sha256:7c39f3f2c943dbc03122747fa8ebbd8e156e54904cf25651b452f4d2634a6075", size = 70982, upload-time = "2026-07-08T12:41:41.521Z" }, + { url = "https://files.pythonhosted.org/packages/67/c5/82addfd375e5ee6520644e0553e4aadde92d668c4fc99cc716d337fe7bb3/joserfc-1.7.5-py3-none-any.whl", hash = "sha256:add2c2c84e8373b084d526a8b53daba5d7a513a118cd2dcd9fc9f979d0922159", size = 71269, upload-time = "2026-08-29T13:05:40.718Z" }, ] [[package]] @@ -1968,37 +2127,38 @@ wheels = [ [[package]] name = "langchain" -version = "1.3.14" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "python_full_version >= '3.11'" }, { name = "langgraph", marker = "python_full_version >= '3.11'" }, { name = "pydantic", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/29/68/a6dbad9c22df4087a0f9e79ddd46226c442b30128bfeee538d5889492a73/langchain-1.3.14.tar.gz", hash = "sha256:1b6696c72ba3bbbce54d745e0180742c9f6ece8bbc59ed5a46c3e20b9a435929", size = 645181, upload-time = "2026-07-16T13:28:18.29Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/5d/0ef368fdcf5df08a394787196fb7a80f473a9c7b3fc4cd2e3b53a7a5853d/langchain-1.4.0.tar.gz", hash = "sha256:08da122a439f738f4c09a5158cfa3d2c1d8bea2d0bde7fbbf4aeb4d7f7fd9d80", size = 729354, upload-time = "2026-09-03T16:59:32.442Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/ec/0f942e78a621f8e3162ff1ed24284f469aaf51fb4607ee5831c626f2b2bc/langchain-1.3.14-py3-none-any.whl", hash = "sha256:4d10dbe91005952cddd56d0dc77aa108964da6bae90ab20063653957e901f782", size = 139560, upload-time = "2026-07-16T13:28:16.498Z" }, + { url = "https://files.pythonhosted.org/packages/92/fa/7da07d9977a5e292ef602c1bb911514ff8206e85dc09a66961874345d57a/langchain-1.4.0-py3-none-any.whl", hash = "sha256:af1dc0161d30944a52ec7844d9bf890d0497b12ec0703069f3503b4003cbbac3", size = 161534, upload-time = "2026-09-03T16:59:31.154Z" }, ] [[package]] name = "langchain-anthropic" -version = "1.4.8" +version = "1.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anthropic", marker = "python_full_version >= '3.11'" }, { name = "langchain-core", marker = "python_full_version >= '3.11'" }, { name = "pydantic", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/22/40ab129b08329ca295b391aa1d48267692b42594757084c6918e22b655ac/langchain_anthropic-1.4.8.tar.gz", hash = "sha256:c76891b2044d56105ff13c106ed12650637b53bd598a4bdf15b4796eefa2a4ec", size = 708524, upload-time = "2026-06-26T21:28:46.916Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/67/1a4f3b905d95192c54bf418ce50e058e2b7b330700c33f042622137b6c16/langchain_anthropic-1.7.2.tar.gz", hash = "sha256:0d39665211b3b40421de8be621536c4e32149500d20a75ee4338cac4ae97db19", size = 751259, upload-time = "2026-09-10T19:12:54.99Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/14/746235c4da89d9bc6a608c5f489f628e03feb8f697195c146e452c8f23c8/langchain_anthropic-1.4.8-py3-none-any.whl", hash = "sha256:778e9301b6fd517824f76ec1776975ce8add97a1f6a36c50ae3c2f4b03a66f7f", size = 52366, upload-time = "2026-06-26T21:28:45.535Z" }, + { url = "https://files.pythonhosted.org/packages/1d/84/436d1f5dea354ec7357e5cd9756a15765e828da7faebf2837cf60f3a638d/langchain_anthropic-1.7.2-py3-none-any.whl", hash = "sha256:9d114c3766f57bbffe8e84093efe396306520c51587263b96d00c055d3bb8370", size = 60957, upload-time = "2026-09-10T19:12:53.693Z" }, ] [[package]] name = "langchain-core" -version = "1.4.9" +version = "1.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "httpx" }, { name = "jsonpatch" }, { name = "langchain-protocol" }, { name = "langsmith" }, @@ -2009,14 +2169,14 @@ dependencies = [ { name = "typing-extensions" }, { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/b9/e937d0a90b26540bff07e7a7c64349f3b29c2dcc36257cd1cd3fdce17f2a/langchain_core-1.4.9.tar.gz", hash = "sha256:f8078901145bed0466755277500a5a22822a7b628808c4c0a28d4fc88895fcf2", size = 967294, upload-time = "2026-07-08T20:06:54.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/d7/1482670ccebc863166852516a08a1956fc50da40fbe2fe7dd218abfef4a1/langchain_core-1.6.3.tar.gz", hash = "sha256:88b430944fbd4d40fa98135d6c873581d497b6f33515d01962337548e918df2f", size = 1006228, upload-time = "2026-09-11T17:37:45.614Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/70/ade2fada52772798ef815b6352b59e71b116aa0c32c3aef5be3dc2cbed12/langchain_core-1.4.9-py3-none-any.whl", hash = "sha256:28e3909e2a10cc81504952d795ac0a9e014c0018121ef89d48dd396fa09ec624", size = 558293, upload-time = "2026-07-08T20:06:52.382Z" }, + { url = "https://files.pythonhosted.org/packages/e6/18/cf18cfec118b02e003f35300b54d6a1173dc6e4905cffdf5ea49e390a7f9/langchain_core-1.6.3-py3-none-any.whl", hash = "sha256:114fe1868c9ed60606662b9dd0074bf3152cc6b0b1522ba37cbd6b04f55ca77d", size = 571753, upload-time = "2026-09-11T17:37:43.875Z" }, ] [[package]] name = "langchain-google-genai" -version = "4.2.7" +version = "4.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filetype", marker = "python_full_version >= '3.11'" }, @@ -2024,26 +2184,26 @@ dependencies = [ { name = "langchain-core", marker = "python_full_version >= '3.11'" }, { name = "pydantic", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1d/0c/bc60dabc362ca7c6ffe8c4bcc2f724c7e566b43eb230cee51419f88f784c/langchain_google_genai-4.2.7.tar.gz", hash = "sha256:03b1463ffe4d42435f43c7870467f2215f684bb46400d2543435d10157c80ac7", size = 281605, upload-time = "2026-07-06T13:51:58.724Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/4e/41798c80b574d958d189e049f13d64eb9246a66623465290f2cbfd641759/langchain_google_genai-4.4.0.tar.gz", hash = "sha256:7871beec56ac07b719f77c46997845db6ff2267b817bffb0f97877053b0895d7", size = 378415, upload-time = "2026-09-01T20:15:45.816Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/f9/d73d1e712591723aaddb7a7b1e94978cd2320c29acfe0d26b6169a2f26f0/langchain_google_genai-4.2.7-py3-none-any.whl", hash = "sha256:0d9c388d0e6c629718fca6abb19c6fdca728a9a7873d0324c1ec821288b5b571", size = 70702, upload-time = "2026-07-06T13:51:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/83bb535e78c2cf767a6193c2f3b00b2894c1581a36ef85911ebaa3b9a891/langchain_google_genai-4.4.0-py3-none-any.whl", hash = "sha256:8e23a1307bd2158590bbf9d99f1d658fc84a9d9ddb77fb1b372f8875a2bafbbf", size = 81617, upload-time = "2026-09-01T20:15:44.533Z" }, ] [[package]] name = "langchain-protocol" -version = "0.0.18" +version = "0.0.19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/59/b5959aea96faa9146e2e49a7a22882b3528c62efafe9a6a95beab30c2305/langchain_protocol-0.0.18.tar.gz", hash = "sha256:ec3e11782f1ed0c9db38e5a9ed01b0e7a0d3fba406faa8aef6594b73c56a63e6", size = 6150, upload-time = "2026-06-18T17:08:26.959Z" } +sdist = { url = "https://files.pythonhosted.org/packages/14/56/913599f2f9cec8524868929f12d72b2ede377a6056ca8a40a32bdadfa535/langchain_protocol-0.0.19.tar.gz", hash = "sha256:79d90a1425122ac87e8052e2ec054fbd09c3edbf341bdfb6397112a495c7bf8c", size = 6265, upload-time = "2026-08-26T21:12:00.703Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/2e/d82db9eec13ad0f72e7aaad5c4bc730ab111934fdc83c85523206eb9b0a0/langchain_protocol-0.0.18-py3-none-any.whl", hash = "sha256:70b53a86fbf9cedc863555effe44da192ab02d556ddbf2cf95b8873adcf41b5a", size = 7221, upload-time = "2026-06-18T17:08:25.996Z" }, + { url = "https://files.pythonhosted.org/packages/80/c9/f6cbf357d48ccbd18bb394433b1fd7ad9be004eed9377ad08bb85777e5e6/langchain_protocol-0.0.19-py3-none-any.whl", hash = "sha256:4cdf879a492a35980fd859ae792d3c65458ccaae504e183c9a10d7eac1f0720f", size = 7327, upload-time = "2026-08-26T21:11:59.781Z" }, ] [[package]] name = "langgraph" -version = "1.2.9" +version = "1.2.11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, @@ -2053,22 +2213,22 @@ dependencies = [ { name = "pydantic" }, { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/4b/0d1130e26b41a99dcc88353bbe7162a1f255c4db746bd94024268e6af27b/langgraph-1.2.9.tar.gz", hash = "sha256:385f87bc1802c35af7e0aa479278ecba8582d103515eb48256cb2ddcd42d0bd4", size = 722869, upload-time = "2026-07-10T01:30:14.985Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/0d/c8e7ee98896659e1b6555db0ab115a9ca899844744645d5d894032bab1d7/langgraph-1.2.11.tar.gz", hash = "sha256:9ecfe11e50d338b34b15cf4d8a442642de103e8ae6971320efba84e4542eb363", size = 725753, upload-time = "2026-08-11T14:00:36.945Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/16/0b8dc48823f1326f3e0c8012a3c07a40da6f194299e2ec080df236287baf/langgraph-1.2.9-py3-none-any.whl", hash = "sha256:c2d98ad94333937922ba04148641c1da2bfe45b5b8e55d7b6dcb0bb2df809e76", size = 247473, upload-time = "2026-07-10T01:30:13.733Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7f/c5c30e4be99ff821029c7ac872a480676bb179c9f3df85ea3f38d13f86d4/langgraph-1.2.11-py3-none-any.whl", hash = "sha256:8bab70de7b2d00b5300fb289bcf38d8b241400f3184c1e95e8ce706fb0e8686b", size = 248854, upload-time = "2026-08-11T14:00:35.494Z" }, ] [[package]] name = "langgraph-checkpoint" -version = "4.1.1" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "ormsgpack" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/47/886af6f886f0bff2273164a45f008694e48a96ff3cd25ff0228f2aa9480e/langgraph_checkpoint-4.1.1.tar.gz", hash = "sha256:6c2bdb530c91f91d7d9c1bd100925d0fc4f498d418c17f3587d1526279482a25", size = 184020, upload-time = "2026-05-22T16:57:38.503Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/e1/089c4c9e0a2fec7f883f82ae8e6a727138d50074cfeb6644bc2d13b1019b/langgraph_checkpoint-4.2.0.tar.gz", hash = "sha256:51a593b6bee684b0818e5d6e58e28ab340c6db7794575056ce7bd1b746a84ed7", size = 180239, upload-time = "2026-08-07T20:05:03.756Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/b4/71425e3e38be92611300b9cc5e46a5bf98ab23f5ea8a75b73d02a2f1413c/langgraph_checkpoint-4.1.1-py3-none-any.whl", hash = "sha256:25d29144b082827218e7bc3f1e9b0566a4bb007895cd6cc26f66a8428739f56e", size = 56212, upload-time = "2026-05-22T16:57:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/05/71/3b475f09bd57d3a5649792c66353312b4432afd843f301739dfcebd157f0/langgraph_checkpoint-4.2.0-py3-none-any.whl", hash = "sha256:0547fd228935a0b758865de3a3d6d7a2537c308895d0f9ab092ce9151b5da942", size = 56833, upload-time = "2026-08-07T20:05:02.655Z" }, ] [[package]] @@ -2086,7 +2246,7 @@ wheels = [ [[package]] name = "langgraph-sdk" -version = "0.4.2" +version = "0.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -2095,9 +2255,9 @@ dependencies = [ { name = "orjson" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/2b/bd8ac26d4e97f6df88ef05ce5b6a38945a3903e1025d926f4752aa88aa97/langgraph_sdk-0.4.2.tar.gz", hash = "sha256:b88f0f5f6328ac0680d6790614a905b2bcfa257f2276dba4e38f0e86db0aa738", size = 348327, upload-time = "2026-06-01T17:51:19.856Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/ae/91446c1fffa04a2dc1f81afbfb5bfff3590452891a72bd9098a656ab2657/langgraph_sdk-0.4.4.tar.gz", hash = "sha256:4e651ffa09de695681579396375377bdde23bedbc8e35b070e615cbd5af7da8b", size = 345789, upload-time = "2026-08-27T21:25:22.593Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/05/aac507337cceae773c2cc9ab91eb6301963af7aeeb55b4217a00e15aff17/langgraph_sdk-0.4.2-py3-none-any.whl", hash = "sha256:75fa5096c1177ce39c847096a8fe3745ffd480ddb412995f836e9f5f884c43dd", size = 160521, upload-time = "2026-06-01T17:51:18.849Z" }, + { url = "https://files.pythonhosted.org/packages/43/d5/2ad7f3a835c6fcebf58b6669552536ecd52d2dfe4cf49c6c36648fd83572/langgraph_sdk-0.4.4-py3-none-any.whl", hash = "sha256:39afe416c91742925e6f8a93715f566d499b36e1b636b804a4ffe3190e4f4e64", size = 162270, upload-time = "2026-08-27T21:25:21.072Z" }, ] [[package]] @@ -2168,7 +2328,7 @@ wheels = [ [[package]] name = "litellm" -version = "1.91.0" +version = "1.97.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -2180,13 +2340,20 @@ dependencies = [ { name = "jsonschema" }, { name = "openai" }, { name = "pydantic" }, + { name = "pydantic-settings" }, { name = "python-dotenv" }, { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/1e/90cfeada42170986a290feebaca0a90923b3c310cddeb0f8690abd239ad4/litellm-1.91.0.tar.gz", hash = "sha256:4fd469fe7356ba8fcc86f4efdf332e3426b760962ab12331fdaf1a01aeec065f", size = 14872290, upload-time = "2026-07-04T19:18:28.466Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/08/db78a9f53e5688ad0f9e50d5c3bfe616e445aac120eafcca907f04634e48/litellm-1.97.0.tar.gz", hash = "sha256:6f7ce326a2e5385ef850e0b0768d41f502ec79278860090a838511cea067b067", size = 17762282, upload-time = "2026-08-16T00:05:44.724Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/15/81fc2d162513803fe08b359c2e2a98f7a33195034fb94b005e263e272c6b/litellm-1.91.0-py3-none-any.whl", hash = "sha256:c3eb52dd2c6a5779e9efd67350f3640f9055d9c05d4b572fc1dd01a217e562ad", size = 16669331, upload-time = "2026-07-04T19:18:25.203Z" }, + { url = "https://files.pythonhosted.org/packages/35/d4/a04f8bda468fb25a0a8a392a6922c9ecf6c122ad9bf9e2f69ebd173e1cac/litellm-1.97.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ff401dd5d66f54b9b474f0652c419fb7bf883fbf5ca64c0bc363acdc98b758b5", size = 24235645, upload-time = "2026-08-16T00:05:20.055Z" }, + { url = "https://files.pythonhosted.org/packages/f1/51/a055bf5df38112f07970937d95416b22379ee84664b739bfe87a8292e098/litellm-1.97.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2983b40ed5d8b1bcbbfbc0d66fefa21b04db91b87c05dd680ae77cba74e561ef", size = 23893493, upload-time = "2026-08-16T00:05:23.79Z" }, + { url = "https://files.pythonhosted.org/packages/14/28/b1cf429493aec5260ac2737dd82f6200c729fd26b336dc21cf001cfbcd8a/litellm-1.97.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e3a1f70d693716b4e8a8108f0a464b0e2c555e274ddbb8ef89c4c59c80be14ed", size = 24031743, upload-time = "2026-08-16T00:05:27.138Z" }, + { url = "https://files.pythonhosted.org/packages/08/4a/22c49e8bd068bfdab0daba235cc2d2752d76d855ccb8f6dafe7dabf01ca4/litellm-1.97.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5b56dce7df44a6a9e6caf5379de2578a8cb82831ceabd3d71cc99b370a1015e7", size = 24397362, upload-time = "2026-08-16T00:05:30.89Z" }, + { url = "https://files.pythonhosted.org/packages/0a/22/f60558230969ac7d860bd93aff6bf6a69bcd8a3ef4f35eea211174ef4e81/litellm-1.97.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6b360ddc3162c2ed39b64d3f9957a7af70cd9c60cf71f7a4dfa355a0bf05bebc", size = 24107078, upload-time = "2026-08-16T00:05:34.463Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e4/6c74ff4b188d9399a036d41e86c4c616d95ce5fd9d9b3c42646bd02f270e/litellm-1.97.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3c4f1dd45e14127f2303769a7ae79482697823e329ae503513d014ceea4dd704", size = 24493640, upload-time = "2026-08-16T00:05:37.85Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d1/1475c4ecdf43221ab8ee8d0fcc6b469c26d0d80913d0773e18de81cf18f1/litellm-1.97.0-cp310-abi3-win_amd64.whl", hash = "sha256:dce3377207234fc5c5b275a5e234ba056a5051fd178ae8e9a6aeb5d056f12095", size = 24289278, upload-time = "2026-08-16T00:05:41.441Z" }, ] [[package]] @@ -2310,31 +2477,31 @@ wheels = [ [[package]] name = "maturin" -version = "1.14.1" +version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/b3/addd877f871fb1860d46d3a4f206ecb10b946c85846805e6367631926fd3/maturin-1.14.1.tar.gz", hash = "sha256:9d6577a62cd08e0ceba7a0db06fb098e0c9b1b3429bad747a4f3a18215a1b3df", size = 369637, upload-time = "2026-06-19T05:19:49.774Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/c8/22e5e21b2679c9bce6415ca578034ca2cc9316be0642ae21e051a2d5198c/maturin-1.15.0.tar.gz", hash = "sha256:94b26cc8e8aba61a5f2099715fe640e18c5f678e9a500408b38761263954228a", size = 385504, upload-time = "2026-08-24T12:11:22.665Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/f0/97c5a5bd9c71653a066c0976a484eaaae50b9369557838a4176b7b0bdaa5/maturin-1.14.1-py3-none-linux_armv6l.whl", hash = "sha256:522292398945442cdafa9daeb2271b2340fbde57027b818f923f88eab04174f8", size = 10207496, upload-time = "2026-06-19T05:19:09.321Z" }, - { url = "https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ffe5ad71f21d1e6603c4dd75f7fee34adf5ed5ebcebb692886549888ebb329ed", size = 19680113, upload-time = "2026-06-19T05:19:13.43Z" }, - { url = "https://files.pythonhosted.org/packages/43/b6/79c881410a3b1c187f7eb3d407aecae646c6a4433d630d72200359015e83/maturin-1.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f3306078070c1508fd715b9116070cbcaff5959024272a9f1e6f5cb29768b86c", size = 10169205, upload-time = "2026-06-19T05:19:16.615Z" }, - { url = "https://files.pythonhosted.org/packages/93/9d/44b6f26dcb7f7a04c5501ac2dbb6ca1490150682baa525ca5860504f9eab/maturin-1.14.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:cd457cd88961156e26379e1155bd287cc0ec1c8b2f1582b0660fb31b87c8842d", size = 10188098, upload-time = "2026-06-19T05:19:19.736Z" }, - { url = "https://files.pythonhosted.org/packages/1a/bd/9c0d5d6983905ce2c9edaa073a7e89355a9cf7f396988e05d32f1c37785d/maturin-1.14.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:dfc54ae32e6fcb18302193ab9a30b0b25eefffba994ae13238974805533ef75e", size = 10627576, upload-time = "2026-06-19T05:19:22.713Z" }, - { url = "https://files.pythonhosted.org/packages/e5/33/b096412bd6a7cb399652b260666f901adf88a687181a6dbd6a3f89f0a94e/maturin-1.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:a131d912b5267e640bc96d70f4914e10590aed64082ec9abacba7cea52004224", size = 10085181, upload-time = "2026-06-19T05:19:25.69Z" }, - { url = "https://files.pythonhosted.org/packages/56/8d/08c3bf469c38a23c9e6c877e338193001eb604d010fedc08341974e38528/maturin-1.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:be18fc568fb76884c0205456336892a75105ec398e6b667cd777c6268bd06d69", size = 10026363, upload-time = "2026-06-19T05:19:28.904Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a4/c4d1a92839f8745ab4aab988a7db884a79d6d710bd3b286fcf9316dece1a/maturin-1.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:994a0c8ba3ad8a92b3a9ee1b02645d200d610216b15cff5102b0fe65e8e08666", size = 13321347, upload-time = "2026-06-19T05:19:32.411Z" }, - { url = "https://files.pythonhosted.org/packages/b3/fa/170f04624d03fd07d2a8b1b67de83a127af93aef9eaa425839553347297b/maturin-1.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be80866363e605d137991b491a741a84cde9ae350183c4c85f49690ca9aaaa65", size = 10877609, upload-time = "2026-06-19T05:19:35.448Z" }, - { url = "https://files.pythonhosted.org/packages/61/ad/1ae2e1d0ded282bf2c55ac13f0811d87deb425e200ae64a15785675dede9/maturin-1.14.1-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:5282dffd4b539d2be245f4e5b1a5ab6bc1033b58f4a4872f5833f9d43c954aa4", size = 10417316, upload-time = "2026-06-19T05:19:38.28Z" }, - { url = "https://files.pythonhosted.org/packages/fb/27/bf677183920718da49cd7982d6a3ffc440aad8919329f571d189f81b7bdf/maturin-1.14.1-py3-none-win32.whl", hash = "sha256:1a04de0a20188f95c721b5702eed18140bdcccb28c386797093eca3f62f4d4e0", size = 8931293, upload-time = "2026-06-19T05:19:41.183Z" }, - { url = "https://files.pythonhosted.org/packages/63/4b/585adeb9167b08d3cdff0032a938b0e72655c92003df4f52c3f696a1bcc2/maturin-1.14.1-py3-none-win_amd64.whl", hash = "sha256:3c9f94640ecc4895e94abaf834a0684430032c865b2748a36c12461fd9252fdd", size = 10314067, upload-time = "2026-06-19T05:19:44.389Z" }, - { url = "https://files.pythonhosted.org/packages/51/d4/dac8c0720ae246be1700afb6fbdbbea20fe35b13f6570b2f70faa005df77/maturin-1.14.1-py3-none-win_arm64.whl", hash = "sha256:15cea8fcb3ba47dd636f50092bb34baea8b04ac777392f23e6bf8a9a61efb894", size = 9718943, upload-time = "2026-06-19T05:19:47.49Z" }, + { url = "https://files.pythonhosted.org/packages/14/69/5c01b461044eb1f45ddcce006706eb88110c793cdb11c7ae0b5e08492e94/maturin-1.15.0-py3-none-linux_armv6l.whl", hash = "sha256:6bf6dc62e22d4dcfd5a51244ff0d58975fa4979c48209fe84159617648956d82", size = 10206220, upload-time = "2026-08-24T12:10:53.327Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1f/2b431554e11687cdb1077e0cdadcc118c53f611086b3af00c8545a67c6a5/maturin-1.15.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd35772633f489841132bc8e71d6fc7f842df30b9c05cd5cdf1ee1ddcb744cc7", size = 19416513, upload-time = "2026-08-24T12:10:56.126Z" }, + { url = "https://files.pythonhosted.org/packages/51/36/e23a21cb34a648b711036b9b2fe1d4f3f4ee24f8db54215d73f1a9a3a3ec/maturin-1.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c40b4eae7bf5ef1f4b1af8d623fe4105016f93578fb15b764e741d08ec3b92dd", size = 10014962, upload-time = "2026-08-24T12:10:58.486Z" }, + { url = "https://files.pythonhosted.org/packages/8c/80/33b15cb2d8f30f12c807955e8f2fd775027692904e30ec0784744ce8cd83/maturin-1.15.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:7eb066372f541f8eb4909c79c5d9bd0b9e8125980bdf1ec9e8aba23c6c8d6c55", size = 10196223, upload-time = "2026-08-24T12:11:00.696Z" }, + { url = "https://files.pythonhosted.org/packages/fe/91/b495e19e2f5c503b540452b2039115e7b2363867e8c5ad4179eb752fa92c/maturin-1.15.0-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:653020a63525bb224e5ab0adf02e17a2e08bc86dbea7fc1399c9a56d7529b99e", size = 10541186, upload-time = "2026-08-24T12:11:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/5d/2b/2abff58037188d852b124871b1f0d720e1c2bfb3d4f1b03d87c52cd66488/maturin-1.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0ebf9767892725083138e671c34482c660317a2f3d6a29fc0e0f34e9d8c99136", size = 10083468, upload-time = "2026-08-24T12:11:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/b7e9f8be99a6627849e81ac7b6694876bce8f50a92995fe17e3cf2610f0a/maturin-1.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7ab7eebffd7b8debca2265985de4eaeb332141276d24b9560b5ad484d4b3add1", size = 10047786, upload-time = "2026-08-24T12:11:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ab/167e3cb7accee11b507dbe53e0e87aeccb376d44ae66284c96ee4df3a9fd/maturin-1.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:126e12e618b4db42f68c779a56d41f82a390145ba36ac3f621d057eb34f5ad9d", size = 13315332, upload-time = "2026-08-24T12:11:09.433Z" }, + { url = "https://files.pythonhosted.org/packages/14/4d/801379f646cbc6b00998e5289b0630a886be3a4ee4c75b6bc9b87478a7f1/maturin-1.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f9d33e6c3f9615c8caceecbbbd440f8eb25a3ddeb687077682cd5eca2e9ae15", size = 10807183, upload-time = "2026-08-24T12:11:11.73Z" }, + { url = "https://files.pythonhosted.org/packages/89/27/2e612e1cbd1580e9e94d4722c227b5180dca27b32b955a34b79918aa1292/maturin-1.15.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:bf29beddd0c6708f112db51d5275fc28b28b9e9c9c5faae387eaef662918b176", size = 10413274, upload-time = "2026-08-24T12:11:14.04Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/202a7b4d75a51f20f84ec9ce3b7345b12b822207072164e2b1c6ef665125/maturin-1.15.0-py3-none-win32.whl", hash = "sha256:da649988be98e87e009e51b1bf0d301b6a301bc0cecbdd60d40d8ba60748d1ca", size = 8928744, upload-time = "2026-08-24T12:11:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/40/dc/4e90da594986ba78dd3bc8a5921ecdcdb11085b22b02a412caab3b225601/maturin-1.15.0-py3-none-win_amd64.whl", hash = "sha256:552c2be4afd43fe8d5c9f3ec8d4c4756d973b8dcbe94c14084390301f50243e1", size = 10335085, upload-time = "2026-08-24T12:11:18.326Z" }, + { url = "https://files.pythonhosted.org/packages/8b/10/15d4314edf130955edf2dc237aa393a8a7c10f2b9b57b89fa2f61f915659/maturin-1.15.0-py3-none-win_arm64.whl", hash = "sha256:c7dc0c66c78d3debdd9c5aa807e861fbcbf07f3505d34b125df74c03986b0f48", size = 9713795, upload-time = "2026-08-24T12:11:20.83Z" }, ] [[package]] name = "mcp" -version = "1.28.1" +version = "1.30.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2352,9 +2519,9 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/77/9450b8f251a13affb6281997d0523c4615f8a8b35d0b21ff30db3a5aac9d/mcp-1.28.1.tar.gz", hash = "sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683", size = 638501, upload-time = "2026-06-26T12:57:29.093Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/93/0142dc84a666daf8ad51a34268f34c12fd6fda4f3810c4be2504eecc8212/mcp-1.30.0.tar.gz", hash = "sha256:445414625fce5c295faa505bb11bacece661ab6f4028d57c935db57820b7a3e4", size = 680511, upload-time = "2026-09-07T14:34:15.845Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/5e/d118fce19f87a2e7d8101c35c8ae0ec289098a4df0ff244cec23e415aca0/mcp-1.28.1-py3-none-any.whl", hash = "sha256:2726bca5e7193f61c5dde8b12500a6de2d9acf6d1a1c0be9e8c2e706437991df", size = 222620, upload-time = "2026-06-26T12:57:27.218Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f4/e58bc33317c92a0203664daaf00bf6f41166cc0149e5d6870a03f7cd004a/mcp-1.30.0-py3-none-any.whl", hash = "sha256:666edb5009503e1047c9d60346a756f94b261f05cc2625f23d41c728ffc484d0", size = 234581, upload-time = "2026-09-07T14:34:14.266Z" }, ] [[package]] @@ -2377,7 +2544,7 @@ wheels = [ [[package]] name = "moto" -version = "5.2.2" +version = "5.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boto3" }, @@ -2388,9 +2555,9 @@ dependencies = [ { name = "werkzeug" }, { name = "xmltodict" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/63/d944f387582cc53f53febbff2b3fa36a6d2ed7c1feef8990bf646cfa9cba/moto-5.2.2.tar.gz", hash = "sha256:aac8023a429e125e91c91f8f4730a67b54f518cda587352f7e67252fe3168f75", size = 8678761, upload-time = "2026-06-06T18:57:54.931Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/0f/1682c01ca0608c25526afb150246a3c9c1f609caccbd39758de4850e31bc/moto-5.2.3.tar.gz", hash = "sha256:a9e95c3218b6eda18e74571f1ced11cb1bc3151467d562c1da6037b9d19832cb", size = 8785514, upload-time = "2026-08-22T18:46:00.199Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/45/13cff46f4f617a6e97e1d497d75abd913e250bb4c823a4985668c6e593e4/moto-5.2.2-py3-none-any.whl", hash = "sha256:3817f1e39721ca833579b921e53e3b68547ace6a34d848c9486fbb5905808de9", size = 6698689, upload-time = "2026-06-06T18:57:51.435Z" }, + { url = "https://files.pythonhosted.org/packages/58/80/ee7ace7a49bd525455497fa2ff198111877d6f93b908b657adeb2cf057a4/moto-5.2.3-py3-none-any.whl", hash = "sha256:5ec31b3cdbb383a19d46030157bd82aaaa7a9cc5f564200f995663d347bd4728", size = 6780972, upload-time = "2026-08-22T18:45:55.719Z" }, ] [package.optional-dependencies] @@ -2426,213 +2593,278 @@ wheels = [ [[package]] name = "msgpack" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/16/f70100614b69feb3ade7285f08c9c52d6cda0a5c03f3f5e2facd63acb211/msgpack-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c7b398c56ff125feae96c2737abfec5595f1fa0aa186df60c56040b8accb95c", size = 82926, upload-time = "2026-06-18T16:12:31.531Z" }, - { url = "https://files.pythonhosted.org/packages/e4/3c/08ecd5cdfe4e2de43aec79062028ad0f7b2d9b1fea5430068c198ba570da/msgpack-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1548006a91aa93c5da81f3bdcebc1a0d10cea2d25969754fbe848da622b2b895", size = 82730, upload-time = "2026-06-18T16:12:32.894Z" }, - { url = "https://files.pythonhosted.org/packages/19/9f/a70c9cb1a04ecc134005149367dcfe35d167284e8f65035a1e4156ad17b5/msgpack-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dabedcd0f23559f3596428c6589c1cd8c6eaed3a0d720795b07b0225d769203", size = 400729, upload-time = "2026-06-18T16:12:34.052Z" }, - { url = "https://files.pythonhosted.org/packages/fa/7f/5ce020168cf0439041526e95aa068c722c016aee21624e331aeabeee2e8e/msgpack-1.2.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83efa1c898e0fc5380fc0cabbf75164c52e3b5cbb45973710d75821928380c73", size = 407625, upload-time = "2026-06-18T16:12:35.239Z" }, - { url = "https://files.pythonhosted.org/packages/79/70/fb7668ce0386819303047057aef6fc1da73b584291d9cff82b821744e2ef/msgpack-1.2.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01e2dd6c9b19d333a00282330cc8a73d38d8dabc306dc5b42cd668c3ac82e833", size = 377891, upload-time = "2026-06-18T16:12:36.684Z" }, - { url = "https://files.pythonhosted.org/packages/3d/dc/9ebe654a73c3aed2e40aa6b52e3c2a02b5f53ef0085fa235a45d5b367f87/msgpack-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:350cb813d0af6e65d2f7ef0d729f7ff5be5a8bce03665892f43e5883d4ecc1b8", size = 391987, upload-time = "2026-06-18T16:12:37.839Z" }, - { url = "https://files.pythonhosted.org/packages/42/eb/b67cf64218a2fa25e1c671fe1d3dbb06cbeb973e71bc4b822da079862d0b/msgpack-1.2.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ee1d9ed27d0497b848923746cf762ed2e7db24f4be7eec8e5cbe8c766aa707b7", size = 374603, upload-time = "2026-06-18T16:12:39.221Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2e/9ee200cde32fd1a0101b4006202fde554c1860adfb9bf7bff31ea4c08df8/msgpack-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:633727297ed063441fd1cda2288865487f33ad14eeb8831afb5f0c396a62cfce", size = 405121, upload-time = "2026-06-18T16:12:40.524Z" }, - { url = "https://files.pythonhosted.org/packages/43/b6/f10117be7ca7a51e8feed699a907b8e663a8cd66e115ae6b4fb30cc7945c/msgpack-1.2.1-cp310-cp310-win32.whl", hash = "sha256:298872ecf9e61950f1c6af4ca969b859ee91783bb920ef6e6172697d0c8aad74", size = 64088, upload-time = "2026-06-18T16:12:41.762Z" }, - { url = "https://files.pythonhosted.org/packages/ba/93/89976c696fb0224662239d952c47b4d1661b34d79a332ef5584facaa8579/msgpack-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2ff164c1b0bcb740b073b99e945234d0212852fa378e44a208c425379140dbeb", size = 70113, upload-time = "2026-06-18T16:12:42.78Z" }, - { url = "https://files.pythonhosted.org/packages/f4/6b/e9b1cdc042c4458801d2545ed782a95f3d6ba8e270cce8745b8603c7f748/msgpack-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29a3f6e9667868429d8240dfd063ea5ffdc1321c13d783aa23827a38de0dcb22", size = 82812, upload-time = "2026-06-18T16:12:45.022Z" }, - { url = "https://files.pythonhosted.org/packages/0c/3a/dd518a1bf78ed1e9ad8afe57307c079a00eafe4b3068932a27ca1ea56b4f/msgpack-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aded5bdf32609dc7987a49bbbd15a8ef096193f96dd8bbeb791de729e650acf5", size = 82739, upload-time = "2026-06-18T16:12:46.025Z" }, - { url = "https://files.pythonhosted.org/packages/70/e0/7ba9e1542bf0771a27b8b37c1316e3f95ae9d748fd765284655c476ad4ef/msgpack-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:146ee4e9ce80b365c6d4c47073da9da7bcec473e58194ceee5dd7620ace77e06", size = 414233, upload-time = "2026-06-18T16:12:47.029Z" }, - { url = "https://files.pythonhosted.org/packages/03/8d/671d81534ea0e2b0e8a121be100020da09eb78861fe3aa8f3ef7dcd3bed1/msgpack-1.2.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a28d076ca7c82b9c8728ad90b7147489449557038bed50e4241eb832395169b4", size = 423843, upload-time = "2026-06-18T16:12:48.19Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b6/e5c737515ed1f166664b87601b532f58cbb73d8aa6a90b99f7c2c5037e8e/msgpack-1.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7d31c0ac0c640f877804c67cb2bc9f4e23dc2db97e96c2e67fa27d38283b41f8", size = 390772, upload-time = "2026-06-18T16:12:49.624Z" }, - { url = "https://files.pythonhosted.org/packages/a8/46/62ed8c2e87d7021eab19921594d961ef3aa3794eec76c716dc30f3bfd433/msgpack-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ff92d7feeaf5bc26c51495b69e2f99ed97ab79346fb6555f44be7dd2ac6503b", size = 409559, upload-time = "2026-06-18T16:12:50.936Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/59aa3887b860bbf43532835e192b1c388a17590d6068ae4f8b2bc74c906e/msgpack-1.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:779197a6513bab3c3632265e3d0f7cb3227e62510841a6f34f1eaa37efbb345e", size = 387838, upload-time = "2026-06-18T16:12:52.161Z" }, - { url = "https://files.pythonhosted.org/packages/09/11/f8563e471093420cf6478cb3271a0175d8402b82d879783d4035d2d03360/msgpack-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:67f6dd22fa72a93752643f07889796d62739a13415ee630169a8ce764f86cf9f", size = 421732, upload-time = "2026-06-18T16:12:53.556Z" }, - { url = "https://files.pythonhosted.org/packages/57/cf/e673683c4c6c90c1022b24c65af4b03eda72b182a1176ef6449069d66acc/msgpack-1.2.1-cp311-cp311-win32.whl", hash = "sha256:91054a783328e0ea7954b8771095705c8d2243b814743fbaadf14552c9c52c5d", size = 64091, upload-time = "2026-06-18T16:12:54.821Z" }, - { url = "https://files.pythonhosted.org/packages/3f/07/ca212739d179f9083bff2c7c08c24101c3555a334fadc2b876b18768a3ae/msgpack-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2eda0b7ebb1283a98d3e4492ac933c8af6aff59fd3df1c3ed024f536af4b1dc8", size = 70462, upload-time = "2026-06-18T16:12:55.898Z" }, - { url = "https://files.pythonhosted.org/packages/6d/be/6798347b425e26f35db82e69dd83c09716c856a3714e7bffc4c0860fd830/msgpack-1.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ee967f7c7e1df2890c671ff2ee51a28ded0efc95da3e507176dee881ce36c66", size = 65059, upload-time = "2026-06-18T16:12:57.053Z" }, - { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, - { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, - { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, - { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, - { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, - { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, - { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504, upload-time = "2026-06-18T16:13:08.822Z" }, - { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421, upload-time = "2026-06-18T16:13:09.828Z" }, - { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775, upload-time = "2026-06-18T16:13:11.056Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151, upload-time = "2026-06-18T16:13:12.173Z" }, - { url = "https://files.pythonhosted.org/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351, upload-time = "2026-06-18T16:13:13.194Z" }, - { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518, upload-time = "2026-06-18T16:13:14.233Z" }, - { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405, upload-time = "2026-06-18T16:13:15.435Z" }, - { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257, upload-time = "2026-06-18T16:13:17.022Z" }, - { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469, upload-time = "2026-06-18T16:13:18.287Z" }, - { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802, upload-time = "2026-06-18T16:13:19.685Z" }, - { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273, upload-time = "2026-06-18T16:13:21.028Z" }, - { url = "https://files.pythonhosted.org/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471, upload-time = "2026-06-18T16:13:22.293Z" }, - { url = "https://files.pythonhosted.org/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274, upload-time = "2026-06-18T16:13:23.455Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795, upload-time = "2026-06-18T16:13:24.687Z" }, - { url = "https://files.pythonhosted.org/packages/77/58/cce442852c6b9e1639c7c8ac8fd9143121cb32dab0f308df4d1426a8eb9c/msgpack-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:05f340e47e7e47d2da8db9b53e1bb1d294369e9ef45a747441309f6650b8351d", size = 83610, upload-time = "2026-06-18T16:13:25.724Z" }, - { url = "https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:810b916696c86ef0deb3b74588480224df4c1b071136c34183e4a2a4284d7ac7", size = 83138, upload-time = "2026-06-18T16:13:26.781Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a6/99e58722feaffc5f2fbcc0c8c0d1451ab9f84097f7af87291b46af2390f4/msgpack-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca0dacff965c47afdc3749a8469d7302a8f801d6a28758d55120d75e66ce6889", size = 406090, upload-time = "2026-06-18T16:13:28.072Z" }, - { url = "https://files.pythonhosted.org/packages/19/03/8c63e8cf52958534ef688625965ab04c269a6cadd8caef16758b380a821a/msgpack-1.2.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e2bf9280bceb5efca998435904b5d3e9fdbcc11d90dc9df30aec7973252b720", size = 412106, upload-time = "2026-06-18T16:13:29.427Z" }, - { url = "https://files.pythonhosted.org/packages/63/d2/155d9e71b40e41fd934bc0c48b9b2770f22263e1ac20aad8e29fdca7be3f/msgpack-1.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6c4be5d1c02a42b066ca6ddb71adf36432868fdcdb6ee87e634e86e0674190", size = 374851, upload-time = "2026-06-18T16:13:30.631Z" }, - { url = "https://files.pythonhosted.org/packages/98/48/deaf2326262a8d5ea3295ce9649912ecd3f551ba7ec8e33c665d2ba583f3/msgpack-1.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec0e675d59150a6269ddc9139087c722292664a37d071a849c05c473350f1f2d", size = 396168, upload-time = "2026-06-18T16:13:31.977Z" }, - { url = "https://files.pythonhosted.org/packages/10/2a/b4410f906c2ec0008f1608d3ab5143afc3ad3f4e6da0fed3ea2231d0bef4/msgpack-1.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dd3bfe82d53edfe4b7fc9a7ec9761e23a7a5b1dac22264505af428253c29ed24", size = 371959, upload-time = "2026-06-18T16:13:33.282Z" }, - { url = "https://files.pythonhosted.org/packages/59/86/1edc67270099a528fa2093ea60fe191233cd238e4bd30cfacf7db79fc959/msgpack-1.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ad5467fc3f68b5468e06c5f788d712e9f8ffc8b0cd1bcb160c105c1ee92dae7", size = 408457, upload-time = "2026-06-18T16:13:34.567Z" }, - { url = "https://files.pythonhosted.org/packages/82/90/8b630fef07d8c5ab457b71ff2c217910c83d333c7a68472c186e87cc504a/msgpack-1.2.1-cp314-cp314-win32.whl", hash = "sha256:98b58bdb89c46190e4609bb36abe17c6d4105ad13f9c5f8f6f64d320f8ced3fb", size = 65942, upload-time = "2026-06-18T16:13:36.056Z" }, - { url = "https://files.pythonhosted.org/packages/16/f1/467b81e98b24dd3885d7b1857728797b4ffc76a7a7483af4fb321a07de3c/msgpack-1.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:74847557e28ce71bd3c438a447ca90e4b507e997ddbdef8a12a7b283b86c156b", size = 72627, upload-time = "2026-06-18T16:13:37.079Z" }, - { url = "https://files.pythonhosted.org/packages/a7/1d/5d8c4c89985feb6acefb82a09e501c60392261856d2408d20bfe4f0360b1/msgpack-1.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:b50b727bd652bdc37d950336c848ef20ec54a4cafc38dce19b1cd86ad625d0f7", size = 66908, upload-time = "2026-06-18T16:13:38.23Z" }, - { url = "https://files.pythonhosted.org/packages/1b/02/ad2afb678b4de94496cd432b581759b756a92c1192d8c767edd6b132efdc/msgpack-1.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8d00f177ca88a77c1cf848d204a38f249751650b601cb6532acc68805d8a8273", size = 86000, upload-time = "2026-06-18T16:13:39.44Z" }, - { url = "https://files.pythonhosted.org/packages/54/74/0b797484013128837f3b1cbb6cea019277c4de4e377dc512b4d9a0f92940/msgpack-1.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5bb9c386f0a329c035ddbab4b72d1028bf9627add8dda41070288563d57ed1b1", size = 86544, upload-time = "2026-06-18T16:13:40.447Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b4/b774d7eb95561739907fec675582f83203cf41c597a418c2589b4bfb8e9d/msgpack-1.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20466cca18c49c7292a8984bc15d65857b171e7264bdcb5f96baf8be238791fc", size = 427661, upload-time = "2026-06-18T16:13:41.574Z" }, - { url = "https://files.pythonhosted.org/packages/b2/f9/3243191dc9937e00756c8bc1b0272fed8f23758e43df2a3b46f533e5090f/msgpack-1.2.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:196300e7e5d6e74d50f1607ab9c06c4a1484c383cd22defd727902591f7e8dde", size = 426375, upload-time = "2026-06-18T16:13:42.936Z" }, - { url = "https://files.pythonhosted.org/packages/23/c7/1693111db9944ba4ad4b67a1e788400d78a0b6af7a6523dc7e4e58f8274b/msgpack-1.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575957e79cd51903a4e8495a242442949641e08f1efd5197b43bebd3ea7682b4", size = 380495, upload-time = "2026-06-18T16:13:44.306Z" }, - { url = "https://files.pythonhosted.org/packages/3e/2b/92f86956a0c13e8662f7e2ad630c4eb4db07497b967589bd5245e018b2c1/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8c2ed1e48cc0f460bf3c7780e7137ff21a4e18433451916f2442c1b21036cd7d", size = 410897, upload-time = "2026-06-18T16:13:45.629Z" }, - { url = "https://files.pythonhosted.org/packages/da/ea/1479f72d200313a76fc2f823a79d1e07ed052ab7b8a0280640aa7b95de42/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f6277e5f783c36786a145e0247fc189a03f35f84b251646e53592d2bc12b355", size = 378519, upload-time = "2026-06-18T16:13:46.998Z" }, - { url = "https://files.pythonhosted.org/packages/f5/4d/fa006060ffa1011d32bfae826fe766fe73e02982183601633b7121058ab3/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9389552ecf4784886345ead0647e4edc96bee37cbab05b75540f542f766c48c", size = 419815, upload-time = "2026-06-18T16:13:48.205Z" }, - { url = "https://files.pythonhosted.org/packages/2f/e1/aab6c946570496b78e67804721f3d5e2d62a93081b9b37df77764ef56347/msgpack-1.2.1-cp314-cp314t-win32.whl", hash = "sha256:c1c79a604a2969a868a78b6ebd27a887e00c624f14f66b3038e0590cb23332d1", size = 70914, upload-time = "2026-06-18T16:13:49.385Z" }, - { url = "https://files.pythonhosted.org/packages/13/0a/e608956488a2af014cfe6e3d665e090b8ee42aa14b07f8f95b8880d66b09/msgpack-1.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f12038a35fabd52e56a3547bab42401af49a45caa6dd00b34c44de235bc93ee2", size = 77999, upload-time = "2026-06-18T16:13:50.467Z" }, - { url = "https://files.pythonhosted.org/packages/d2/8a/27e2e57055176e366a46b85d02d68e7a5bcfbdd8474c9706375d965f24d3/msgpack-1.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0adcf06ffde0777c0e1a9b771a2b1c4226ba1bbf748c8efcc02fcdeca3299107", size = 71160, upload-time = "2026-06-18T16:13:51.498Z" }, +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/ea2100ec54d30c46ee9dba10a3bfb79b655e96c6df237238a3234c75869b/msgpack-1.2.2.tar.gz", hash = "sha256:9eb0b0e602064527a045ea28c4f174ed69383587e29cebe28947e3b84106eb2a", size = 187025, upload-time = "2026-08-27T10:03:47.793Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/40/181c8944b28f779ed0b2587d24cc0ccf1bc87248204105327140aa20d63d/msgpack-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7afa5431f6f3487c584187ca6c8e2a34e9b106529893b3e720eabb068f6ac970", size = 83554, upload-time = "2026-08-27T10:01:34.182Z" }, + { url = "https://files.pythonhosted.org/packages/03/f7/a6bf145f7d3eb734b3d97fa295f8007a586799ef56b456c8b27bff62caac/msgpack-1.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9b4cf3685a135666d27d0d7a73fece74e2fad01d9b508fded89e843512f0e90", size = 83857, upload-time = "2026-08-27T10:01:35.816Z" }, + { url = "https://files.pythonhosted.org/packages/93/1a/77d32a60a80ee67016e77b13bec07e85f1929a92f046da044591c7eb01c9/msgpack-1.2.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4710d881d8fb047deed2485707409116722af2b992d3fefd73c7667c4e350839", size = 398390, upload-time = "2026-08-27T10:01:37.693Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f5/ae93f85b063d744731cb285528210cd950333b167cacc7b2f96e1420a475/msgpack-1.2.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58ce37a4a54577115922385d37201d9a44d66d0167dfbbf4770a2e9bf8ea7ba3", size = 407183, upload-time = "2026-08-27T10:01:39.499Z" }, + { url = "https://files.pythonhosted.org/packages/17/92/d91a08a913a3bbafbede5b9dbf48e4e517f7d92510877b6b02730060ea85/msgpack-1.2.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86f173a584f72f6164801f31866d22a581f60c991572cf922aed9ab8eb422b77", size = 375978, upload-time = "2026-08-27T10:01:41.234Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a4/27400c101a96115fe8484cad57b6c5eb4f9ffba080a1d9be62ec9174bf67/msgpack-1.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e05a94a0442de86818a30281c6cc2cb9cc7aa148386fd3541c4d4774b73cb3a9", size = 389566, upload-time = "2026-08-27T10:01:42.779Z" }, + { url = "https://files.pythonhosted.org/packages/44/92/541e9fa4623587767623788b38d11fc78d402acb1421962a13d3ace48bef/msgpack-1.2.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:9bd3d1557c3fe1a095068210708a03e3e4795973392af6f4047060e70abd9a6c", size = 372583, upload-time = "2026-08-27T10:01:44.572Z" }, + { url = "https://files.pythonhosted.org/packages/0e/03/c1e0035e1f923f548b7016a2fef5afea431cdae95d397c5aa52ed75dde05/msgpack-1.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:46ec851571d8f1b6e29794ebb9dd36f785008da6d14f57c702e60781d6caf648", size = 404507, upload-time = "2026-08-27T10:01:46.167Z" }, + { url = "https://files.pythonhosted.org/packages/ca/49/7efba0fd604059f0dc8f57ba2867bda4d57bab6921a12e975ecfbd49284c/msgpack-1.2.2-cp310-cp310-win32.whl", hash = "sha256:1f3af0baafd184436501004828bb3df64eeb2fc49dfe9d89abcf604956094563", size = 64848, upload-time = "2026-08-27T10:01:47.797Z" }, + { url = "https://files.pythonhosted.org/packages/57/1d/b41e96ff441d46890b9d5982959aea4d15c5d322f92740dbef16e9dfa908/msgpack-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:82b1bdf293267afaadcc608b125e7fc6576bb0785a60c4fa7d07c7ab76ed76ec", size = 70927, upload-time = "2026-08-27T10:01:49.199Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/a05ba8f84c5951c9aec2a19c1c81f6c4a67b8bec80af604ac5b23ccfa019/msgpack-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d7fb25b4442fae0cb2590272d06ab4f6caa526ee36a994edb81e946b874813e", size = 83498, upload-time = "2026-08-27T10:01:50.62Z" }, + { url = "https://files.pythonhosted.org/packages/0f/df/e20bcf5c149890545334743b212eb4b82e1a25fe0a34f99753a1755bfab5/msgpack-1.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fe374ba76eb0ecca13a1703daa8fa85825a6ddddbb52d4c1a732fa524194683", size = 83896, upload-time = "2026-08-27T10:01:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/ac/c3/00dcd902d66a641b9ba350783feb482ea5c1ca4a7ff6629db0c10c0ea982/msgpack-1.2.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9b0c1f2aa7b0026b4bd50718100e8b04175e4f36e160aa852502377b5e572e7", size = 413259, upload-time = "2026-08-27T10:01:53.296Z" }, + { url = "https://files.pythonhosted.org/packages/93/15/17374efe9793f5332c7d4727ab40539f95a1dc9df653531795daca8c4281/msgpack-1.2.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f11e09f10210a91c169e39c7a5a1f9090eaa73ad75555fafad5023c3053c47ba", size = 422907, upload-time = "2026-08-27T10:01:54.786Z" }, + { url = "https://files.pythonhosted.org/packages/d3/af/2b567d684f912fedcefe3f7c37de604716ffa99336bd432688f9f040df92/msgpack-1.2.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8b1415d02e9bf722672af8a90f90813265a0cd0b14163187261e54a5592bc949", size = 389248, upload-time = "2026-08-27T10:01:56.55Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/d8533fed473cc3e309a701e851d0e5fe36ada5552a3899025f5c69fbe877/msgpack-1.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42fd9260416885b4815caca5bdd14dfd5dda6cdade732d6c09104ef8f6228761", size = 407099, upload-time = "2026-08-27T10:01:58.357Z" }, + { url = "https://files.pythonhosted.org/packages/d6/1b/57906337bfee0ead554571dc203ea17c3fad26d51e5eca6271ecd983f73b/msgpack-1.2.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:336525cc2688e43ea77dfb1a4ce012c8cde561835913801dbfcfdcf4111d8abb", size = 387201, upload-time = "2026-08-27T10:02:00.109Z" }, + { url = "https://files.pythonhosted.org/packages/de/0f/5d1e6d68e516621697a9262b24917d678793e838cf3f331ed4656b3e959d/msgpack-1.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cdb6cc6e1127d15879c47a8b3270716243da82d3e7feab1f5946872c75b3d60f", size = 420765, upload-time = "2026-08-27T10:02:01.573Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a6/07f9a4f3324d55c3567ab2a7e8d5325291bc95a31a374bb390a21b7c4e24/msgpack-1.2.2-cp311-cp311-win32.whl", hash = "sha256:cf66fb38703e61a486b01b56d43bb1f50698fbe99b6bd90feba10f24fab60b3b", size = 64785, upload-time = "2026-08-27T10:02:03.01Z" }, + { url = "https://files.pythonhosted.org/packages/84/13/f748f0d59f355d196e71a0b32d48d386a9bd311f94d954e666cf7e5b2572/msgpack-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:0883a1578168929fd1640fbbc4614773f1a130e419a8a817dc2918d9af1b651c", size = 71258, upload-time = "2026-08-27T10:02:04.375Z" }, + { url = "https://files.pythonhosted.org/packages/46/a6/10d979c4e76b18a9b9ebbd6499ff863474ffe5955028ea27e09b66f6833c/msgpack-1.2.2-cp311-cp311-win_arm64.whl", hash = "sha256:4955accbd87f27beebef5f3ecc27503aa74cb016fb4f640868e749fd93194a35", size = 65860, upload-time = "2026-08-27T10:02:05.735Z" }, + { url = "https://files.pythonhosted.org/packages/31/78/90c15bebb1a72667349ca62d4507e9d9369e7f8f76b95f490b823d3622e5/msgpack-1.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a4348705be86e029d04e741cf9ed0dfe03e942d7d3b92e838fa80d3aa2c3ebc", size = 84275, upload-time = "2026-08-27T10:02:07.106Z" }, + { url = "https://files.pythonhosted.org/packages/88/88/c2b6d8e81571da87aa232c0e34a3f3a0e618e6235892065ec82d1d81fc7a/msgpack-1.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a652ceeededf71d3fa40c303a02a149d42338d310162367b91c539d4bd6e0a3", size = 83970, upload-time = "2026-08-27T10:02:08.488Z" }, + { url = "https://files.pythonhosted.org/packages/da/c0/d3ede9f5d16acb4c05a9281859f1e99ef9f877a928eb78454c37f70db001/msgpack-1.2.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90986cc9aab9d7d1d8f38bcbf65d3f7ac83bdd90c35765db7d691b4829698cba", size = 409401, upload-time = "2026-08-27T10:02:09.877Z" }, + { url = "https://files.pythonhosted.org/packages/41/f0/29f591bea185616cf417645ac03bd3ad9b317483ad8572160e325f7fe777/msgpack-1.2.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77c2e018417dc1d66f235e383877ee885b60ade9d29e494dd581e08af2cb1923", size = 420619, upload-time = "2026-08-27T10:02:11.526Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8e/c70c8c9180c5ddf4440eb8658ebead98e22e7686fbf84f6b165031430750/msgpack-1.2.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0e91332144f69bc3018c91232fac26da580ef748fb8eaddd7914d4458001cc4f", size = 379747, upload-time = "2026-08-27T10:02:13.345Z" }, + { url = "https://files.pythonhosted.org/packages/50/9a/f10ce11fa62700c9ab87a22e65b9ca272f7f673ddd31aeb2de6ae272ad35/msgpack-1.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e915d390d7068b257ca8b62f3fc59fad135c8631d1017ab03b0b924b07c5367", size = 398944, upload-time = "2026-08-27T10:02:15.006Z" }, + { url = "https://files.pythonhosted.org/packages/82/fe/d7be978456ff8552e69a8e270d882e7530e01513c096b293d83df03753ea/msgpack-1.2.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c522420d78db2431887d45b518e304d86e27b9ad0b30f24e3806a6ad5d8bdbfc", size = 373979, upload-time = "2026-08-27T10:02:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/be/af/91b0d8d3fb3063e259daee3ea8515cea6282f68f4b0e5f0b6fea25762c6e/msgpack-1.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4b554d8164ebb526892194f71dcd96ef1fefe0c250087498785d3ffc04a80be3", size = 417781, upload-time = "2026-08-27T10:02:18.293Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3c/ce8e9efe1fd9e95c78b3705e4300ba7feba3dc6c00fb76259895db155518/msgpack-1.2.2-cp312-cp312-win32.whl", hash = "sha256:0e3315de5a4b2920ccef48d96b4448025e064a10d0f5a250f6584477d839c8d4", size = 65267, upload-time = "2026-08-27T10:02:19.869Z" }, + { url = "https://files.pythonhosted.org/packages/85/98/a33b8b4af14e3476bb0da1b8c36ef7a0f28dcf95db1c5e68ff88cb89d591/msgpack-1.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:b68614fba0570349833b7dd999ff0aed4e5cc8d9eb6e3a7d4527be33c65e33d3", size = 72275, upload-time = "2026-08-27T10:02:21.141Z" }, + { url = "https://files.pythonhosted.org/packages/df/5e/2f323a33a6aba5bd4b2d8b430e4fab21d92cd91c093b49ee287bc166ee54/msgpack-1.2.2-cp312-cp312-win_arm64.whl", hash = "sha256:59d5b93efa45fd09f620d0c9ba81cde339a2c9937af3eea42ee9653094ce6640", size = 65488, upload-time = "2026-08-27T10:02:22.575Z" }, + { url = "https://files.pythonhosted.org/packages/1f/eb/42f31c5a48811787ff59a9869721f70a49654d65ab6c455f4463c39b044e/msgpack-1.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8b2a281b556f120a43e591ea39915741b7ad54d4727b9c4350a0a11692252533", size = 83911, upload-time = "2026-08-27T10:02:24.06Z" }, + { url = "https://files.pythonhosted.org/packages/33/54/10c6c16ddba8a5112e3680176b838e3694e4aad7284f9daa6d6d70d98817/msgpack-1.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e8cdd1f3e7cc52c751092a9bf740e81e6919ab109cd376ae2d965dad0bbae34", size = 83734, upload-time = "2026-08-27T10:02:25.613Z" }, + { url = "https://files.pythonhosted.org/packages/d7/75/35823e4419df8792191b2a17ae3fe71b41d02c162b2c491c94d1a87f0caa/msgpack-1.2.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1814f92306ae7862908e9ece7cfd90e0dc87ded3e89b6ae7ffdd1175d6376fdc", size = 405635, upload-time = "2026-08-27T10:02:27.012Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d3/6592e4064619b04f2dd0054c5fa13e37e3d55eb26044483d871fadb2f46b/msgpack-1.2.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d24b38a825bcca41bb956de50eb98451ef291304a8607fad99e619043d3e79b9", size = 417332, upload-time = "2026-08-27T10:02:28.776Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a1/b21c6818a545e9a4a976ac954a5c250eecde9a02e0ec82f415473dab1324/msgpack-1.2.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34e83e345194a2a51d8bd447dea9de2104f91e75b247f4735f14f04529f0746b", size = 374378, upload-time = "2026-08-27T10:02:30.678Z" }, + { url = "https://files.pythonhosted.org/packages/03/8b/7ada15c7b64151d6dbb562d1b091520efb2c37acf2403b1d4ae13797b27d/msgpack-1.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:682804bf31e43d46e51a9a33bd575b51e839d715ce6bd5612c055f7b28ad637b", size = 395809, upload-time = "2026-08-27T10:02:32.322Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f7/96283e50f7020df4dfeacc55612b7a210c8cdf0dda48bc262f1f9b3e4c49/msgpack-1.2.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9b659d77f8726fa5e7038967dda6b68d53cf34472c094cfa5b845454713b90d5", size = 373495, upload-time = "2026-08-27T10:02:33.832Z" }, + { url = "https://files.pythonhosted.org/packages/cc/fe/1548dede9d9ca482f2d424a2e110a9705d4e02627a16b8bc8d10ce0208a2/msgpack-1.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d9a562aec0a92fe536da2e533d313b3d2a6b929157b1dec7ff623446dc0a8ab", size = 414360, upload-time = "2026-08-27T10:02:35.396Z" }, + { url = "https://files.pythonhosted.org/packages/77/9d/4419b8f86c219174b1fb8bbd7faaf84a548935f7b1916d028401b9433417/msgpack-1.2.2-cp313-cp313-win32.whl", hash = "sha256:a4161eee7799863aee237c35c90427861f7b994416dd81ae829f560b0a81bdcd", size = 65196, upload-time = "2026-08-27T10:02:37.007Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f8/593f5caf0dacab41cde1564c5f0419e61af55ec9628006205e8fd5eb5e03/msgpack-1.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:b07c03f0da7e5279170df7745ddc732d526c8a198208936ec1a95c11ed2b2d5f", size = 72203, upload-time = "2026-08-27T10:02:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/c6ef92046b4a2bbb9d3aa0cb581cbf4a4051afccf6e5fb301a1bd3086f39/msgpack-1.2.2-cp313-cp313-win_arm64.whl", hash = "sha256:d13d07efbf655f9ae7a2352b630c52727b359005b21ba08a507585c9ac8c0896", size = 65435, upload-time = "2026-08-27T10:02:39.534Z" }, + { url = "https://files.pythonhosted.org/packages/5e/50/3e92c403346652cabd08cb8faceef847bae917ea3b3c81b64a5b6d09ed41/msgpack-1.2.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e497ee34e8a3342bbde51b27c22d8db05a651df3361dd3daef5b3ab0d66f3e04", size = 84315, upload-time = "2026-08-27T10:02:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/b6/dc/8efe6dd96a12ab043930cb4cffb40b6e7f061491d6ec7a3d2b75ef1fda42/msgpack-1.2.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0dd9173c5ebaf5ecc5ca86e7ae1db92934e1d57b856f3dd90698941431f4fd77", size = 84634, upload-time = "2026-08-27T10:02:42.621Z" }, + { url = "https://files.pythonhosted.org/packages/1b/89/996573095bf7b038c04dd65ddbc4f1a4d381b0f7a44ff9186f3c7b8325c2/msgpack-1.2.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8dc4487097571f7311188c3eca2a3e86cd1f1db4c37c7a017bcc3fd38486cbfe", size = 404194, upload-time = "2026-08-27T10:02:44.096Z" }, + { url = "https://files.pythonhosted.org/packages/b6/4e/46f5a5d949dbd054dab60cb15aac7ac6ae6774c134532893414689bf2f53/msgpack-1.2.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73b0e05c32c3cfc3cd84994908e57430c0ebc6813abf905d3f18ff115d54df3f", size = 412343, upload-time = "2026-08-27T10:02:45.747Z" }, + { url = "https://files.pythonhosted.org/packages/da/e8/739a94197358a313307e6e9e7d8d22ef66add39222de911a44161aa96920/msgpack-1.2.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa1120c653b76d8eafa50423b5eba06b5c9737f8692c74fa3afe03e84b8978ea", size = 372620, upload-time = "2026-08-27T10:02:47.578Z" }, + { url = "https://files.pythonhosted.org/packages/03/d4/09b92e1fcdccea9466bfae45455367ac52362ae445d96a602e51b7a8df73/msgpack-1.2.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccfd880988f8438d1c91c77d7edc58e70f4d2012e999167bc154c64c6f06ea6b", size = 394603, upload-time = "2026-08-27T10:02:49.172Z" }, + { url = "https://files.pythonhosted.org/packages/47/db/d11bd6f258a60703dcdc7a3772818ad0c2f602ee4c2acfb24088c6c3ebc3/msgpack-1.2.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:6195257a107bf25872ef84aab7295078271eea3ac6413f0506b631f6c9586ed5", size = 372666, upload-time = "2026-08-27T10:02:50.886Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/fbbbac0c6e5fbb9d51abc23e3b5fe8620f5c01e0588797cf664a623bb9e1/msgpack-1.2.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b8dd6c71d20c28d2d0eb0c51e7cccf3584afde3b1364f6629596186c9025bd54", size = 410889, upload-time = "2026-08-27T10:02:52.51Z" }, + { url = "https://files.pythonhosted.org/packages/94/60/8366558da954095e04e7fbc351f9387d87a682feaee9a235ceda966f794b/msgpack-1.2.2-cp314-cp314-win32.whl", hash = "sha256:d242f3c4ccf55b056e6cf901720dccde58f1df117898f2bbf3bcd6e38ec7c248", size = 66774, upload-time = "2026-08-27T10:02:53.984Z" }, + { url = "https://files.pythonhosted.org/packages/4b/3d/1ce873c8057c65e4fbb076ffe1c99c9ae39d90a00a2540d7b06c652a292f/msgpack-1.2.2-cp314-cp314-win_amd64.whl", hash = "sha256:1510f24612d4b983dff6935d9273e02c320cfd525727fbcb58836a75f589fdbc", size = 73424, upload-time = "2026-08-27T10:02:55.277Z" }, + { url = "https://files.pythonhosted.org/packages/d5/55/e36f2a33e38657f33850d74e0bf256838a0d45802c298cc501a32bffcc08/msgpack-1.2.2-cp314-cp314-win_arm64.whl", hash = "sha256:7826f16edc763e768404f55605ef85dfcf5857e729c1ed29e0d7c180be4fe6d8", size = 67657, upload-time = "2026-08-27T10:02:56.493Z" }, + { url = "https://files.pythonhosted.org/packages/64/58/7e764b957bae80ae281a9cb28761068c8bae8d5c6ac0873e43cc69d176c7/msgpack-1.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f466049b8e1ec0854287bbe9a074316826fe0e08dcf707245f98b1ae49e92650", size = 86594, upload-time = "2026-08-27T10:02:57.796Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f0/250f5985b6ee533e60d357571a808aaae03c54118294dc3db7158e27feb1/msgpack-1.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f6b6f8deb07d49090e1808c6ef9cb7d23ca17bef3aa6ed3e5e03df16606e60c", size = 87374, upload-time = "2026-08-27T10:02:59.256Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2c/126ec8f187877c5f688631c543d1d3a3d75b2e66b83fb9de3ed7c13a39b6/msgpack-1.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b542ffc0a5c531eedc40419f291f1bd659aa8d4223408a5b51c88a2796083fd3", size = 428157, upload-time = "2026-08-27T10:03:00.9Z" }, + { url = "https://files.pythonhosted.org/packages/95/21/d2d81d50aaedb14147d01f22094185794db3ad8a8791b60afacba0627c89/msgpack-1.2.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d095df2627e5dd59ac7b0c5ad627a671c76e6020171e03cbe4621a61f0562c3", size = 426669, upload-time = "2026-08-27T10:03:02.457Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fc/f7d484ee5b572719608e7ffad569bea22ff11309a96ca2fae85eec94226b/msgpack-1.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ffdd2f4950daf7815490f23087963e3420175b9609520b7ff5df64d351159c22", size = 380625, upload-time = "2026-08-27T10:03:04.244Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c4/b924cbd5516676f4e612329f18602a833bd055ffbe27f808eeba0f01bfea/msgpack-1.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:652d1bf13d01bac8fd569def0fe76745e55bcda01e30aa6332d5947ea3788839", size = 411328, upload-time = "2026-08-27T10:03:05.869Z" }, + { url = "https://files.pythonhosted.org/packages/27/9d/0c1d9683a951a80f270c3b7dac1022c18b9307617344dd44d904135d5e12/msgpack-1.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9bf452ff4d4981f25a18e9476e002bcc9263e7928024aa4d7148e25f7be3f929", size = 377892, upload-time = "2026-08-27T10:03:07.37Z" }, + { url = "https://files.pythonhosted.org/packages/06/bb/bf22338cdd22e0b40c8f28468cea5f3d9c320244c095d8303364bc012c41/msgpack-1.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:55faa6f8395e23b848c535ad5dcb96b3462f37f5e7f4ac500d500434f7345da7", size = 419426, upload-time = "2026-08-27T10:03:09Z" }, + { url = "https://files.pythonhosted.org/packages/7d/42/6d02c19a01abd8d7ce817c321d2ee6af1a8e24d584dca619d1b6576a83bf/msgpack-1.2.2-cp314-cp314t-win32.whl", hash = "sha256:419a45c67a5c04213172a14b1864657e014665b77d7081b107a51707923dd39e", size = 71810, upload-time = "2026-08-27T10:03:10.498Z" }, + { url = "https://files.pythonhosted.org/packages/af/df/fda3a204415dab0a8c0db5461ef7205416ea52bd8581c5cafd361be07f3b/msgpack-1.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:935b1cfad9b908b0fa845010f4271df4c2f04e1cd26e3f18acd61a45f93c9e36", size = 78919, upload-time = "2026-08-27T10:03:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/63/d4/4b4b0ef25a86deca91feaf7252ca885ba4f2ada40461379120122a04fe96/msgpack-1.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11e8c421e117d1c36728b423d0402555cccbf0c6f53e288f0e75b6b12100d70f", size = 71925, upload-time = "2026-08-27T10:03:13.332Z" }, + { url = "https://files.pythonhosted.org/packages/3b/92/4b44bc8f3243ef8cf9cb5368c17a299d45b9df858f6dfdd98a0482dbbb37/msgpack-1.2.2-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:e1b99ad34613d5f8477fa5cf99bc4eaeaf27965588007c102370cd9a78fe9de5", size = 84293, upload-time = "2026-08-27T10:03:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/80/05/c992bb65744665a41b5bf531fc0e1619bae0901f57738228ded90023c151/msgpack-1.2.2-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:0fbc1bed8a535389b41882cfae66376e248cd1680eaa94fd83193c73e1d24986", size = 84490, upload-time = "2026-08-27T10:03:16.12Z" }, + { url = "https://files.pythonhosted.org/packages/d7/bf/7f53b9e6709a4df7f9b9b81dc65f9dfaa32caf65bee94986ec2cb8fa07f1/msgpack-1.2.2-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:06d95f61de7afe4f4ff908a6feebfcb070d0582ac87c9cf3cedf8551cf634516", size = 405332, upload-time = "2026-08-27T10:03:17.692Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5a/305c4dca14b50d0b51fb88ef04ec125b8f0be3e2ce730dcc62dbaa651cc5/msgpack-1.2.2-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b5c696ae7cd7166b3657261adb855b461ff31f07823fdbae9de8bf80adfccc21", size = 416798, upload-time = "2026-08-27T10:03:19.389Z" }, + { url = "https://files.pythonhosted.org/packages/7a/df/a645102b4cdfd9a94201cac4e900e9c1429fc16d86aa311c06eef82528c9/msgpack-1.2.2-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0708afbf6a9587f0bfe479a9825c141d14d91e2f6a5c8103cf28bc96f4edb5d9", size = 377312, upload-time = "2026-08-27T10:03:20.928Z" }, + { url = "https://files.pythonhosted.org/packages/f4/26/c56d8d086d3fb1077bb48092b158b5ea2eee08b279e10c191275f13bc980/msgpack-1.2.2-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:226a62ffe99fe54c5c61d910ec64c3449b7766c3280bd286bf6c94838dde239a", size = 395182, upload-time = "2026-08-27T10:03:22.571Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b5/3d46ba367a565e536d8d2a61eebcee71b1dc803da3ce74a22313b573d6fa/msgpack-1.2.2-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:9fd7f32e2f0fb334e7ecc5adb5cf0458785bd3a9d9d86f950e1715f101cebce5", size = 377945, upload-time = "2026-08-27T10:03:24.151Z" }, + { url = "https://files.pythonhosted.org/packages/a5/2c/d5d2df273ed5306357da25b69400fd8d7a53c4d87d8976604b677484d61c/msgpack-1.2.2-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:9db1ba1c1e6a84245a9dd866265b56b8a1e9461549cc72ed296d8cbfbd32961b", size = 413341, upload-time = "2026-08-27T10:03:25.85Z" }, + { url = "https://files.pythonhosted.org/packages/1b/fb/32613bced3cad47b40b1b73dd04d687121349d83f748efc2575929121903/msgpack-1.2.2-cp315-cp315-win32.whl", hash = "sha256:e2eb7ea0ac3911a7aac9d8aaa36d40f216d99455b3274cd3fac38181bcd910cf", size = 66730, upload-time = "2026-08-27T10:03:27.294Z" }, + { url = "https://files.pythonhosted.org/packages/74/56/d86171f7251015e9312e5a7f9fdd4cf89752fc2114b88fed453d2a040c66/msgpack-1.2.2-cp315-cp315-win_amd64.whl", hash = "sha256:9352e6cdb510a7b1a5d3ccaccec730e82e50cf3484a3af7bdaab19e23b9589ff", size = 73477, upload-time = "2026-08-27T10:03:28.615Z" }, + { url = "https://files.pythonhosted.org/packages/13/1a/56b90f6defef61700b86baca3637c15f62ac0f9b21ab0f16613ab9d1f101/msgpack-1.2.2-cp315-cp315-win_arm64.whl", hash = "sha256:29cc2d5291711a52956a79a51f41c732329df39ad727c886bd8f0b5b9237a808", size = 67660, upload-time = "2026-08-27T10:03:29.895Z" }, + { url = "https://files.pythonhosted.org/packages/cd/20/12751ca0d8ec874701b54c392c2b19f51af8dd1de40a92a10e356f0aaf58/msgpack-1.2.2-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:d886baa46b2532135e7320067e6a44edb09ba5883a6096b0f9c044533984b8a8", size = 86462, upload-time = "2026-08-27T10:03:31.348Z" }, + { url = "https://files.pythonhosted.org/packages/91/4c/cf6d12a3d709fe5f9771dd917c35e6ebcd55597a5b792287382fde056c95/msgpack-1.2.2-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53679573c75cce5f82359e0bd4e6a97809a6b9a9b7a48fd1ba592f4a82cddc84", size = 87412, upload-time = "2026-08-27T10:03:32.74Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0d/0aac5752d1708dcb458f8754db34a4999514db3df2d2b798b9381293f638/msgpack-1.2.2-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3c247d457ae9079974c7ce3c665396754a6d2baff7eaa51332212a8a5a3f13b", size = 422057, upload-time = "2026-08-27T10:03:34.124Z" }, + { url = "https://files.pythonhosted.org/packages/81/30/70f281a3685b04aaf235a5237da11b978a02a865a5a479186205177ad676/msgpack-1.2.2-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:352ed831042549cca8be23780e1fe7c9177e65ff02bf183509c4b4d33f671782", size = 422696, upload-time = "2026-08-27T10:03:35.862Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6d/f76e8425efb0aa38988cd778ae290bfa120491d80d26872d88bb52fedb3f/msgpack-1.2.2-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f80361592c13d7226b4379c8941529b63fe1a9d0e05d2de8f3306b70e522b53f", size = 376495, upload-time = "2026-08-27T10:03:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/95/77/0809aa9b52b2868f7d01862dc14073708f0440421a65197b48453480034c/msgpack-1.2.2-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:68df2947921d449f6dcfeafd86cb2cdde13327a8b447534bbe4ee5aaf32a5695", size = 404683, upload-time = "2026-08-27T10:03:38.87Z" }, + { url = "https://files.pythonhosted.org/packages/02/d2/4e5ac915ba120172d210ef00165c5e6276c8a65db3a4a5cf36e946b83e23/msgpack-1.2.2-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:51dd39d23cfdea0400ed3ff2d29d1e83bd951d3aea79dc89be5b701a09edfe23", size = 375087, upload-time = "2026-08-27T10:03:40.486Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e3/8051d53e5495c87c6cf27eb42fb680361017037f87f322bdaf525f71e4a2/msgpack-1.2.2-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b13b59e66f107cca1ba708dd5307179870ca1b15b19fcee7ccf722e5308d9212", size = 414421, upload-time = "2026-08-27T10:03:42.308Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4e/13783aa7c17414d7186c72c49bc718366f75e49f0ea58d4f81cb63ac3187/msgpack-1.2.2-cp315-cp315t-win32.whl", hash = "sha256:8c6321a414f8b4a8dc43976b2fa8349156434ca9adedd9a187b796f7e1d3d3fc", size = 71790, upload-time = "2026-08-27T10:03:43.715Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/1d02994c7ae2603c98100984428ff0f67443572133bc18eca6058f732c1b/msgpack-1.2.2-cp315-cp315t-win_amd64.whl", hash = "sha256:6f53285f20d592ed309ee19e509cc4c77a3bda1db02ad67e8a0949bb227a5a6d", size = 78766, upload-time = "2026-08-27T10:03:45.036Z" }, + { url = "https://files.pythonhosted.org/packages/60/54/89ed16e6f966a050dc78b0e94a545025211b07ce9f4bdfe07dff70c03fc2/msgpack-1.2.2-cp315-cp315t-win_arm64.whl", hash = "sha256:a378e12ccc06d76efde115caf4073b7e5ff3cc18291d1341f9e65fb882e3f754", size = 71819, upload-time = "2026-08-27T10:03:46.375Z" }, ] [[package]] name = "multidict" -version = "6.7.1" +version = "6.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", size = 77176, upload-time = "2026-01-26T02:42:59.784Z" }, - { url = "https://files.pythonhosted.org/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", size = 44996, upload-time = "2026-01-26T02:43:01.674Z" }, - { url = "https://files.pythonhosted.org/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", size = 44631, upload-time = "2026-01-26T02:43:03.169Z" }, - { url = "https://files.pythonhosted.org/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", size = 242561, upload-time = "2026-01-26T02:43:04.733Z" }, - { url = "https://files.pythonhosted.org/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", size = 242223, upload-time = "2026-01-26T02:43:06.695Z" }, - { url = "https://files.pythonhosted.org/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", size = 222322, upload-time = "2026-01-26T02:43:08.472Z" }, - { url = "https://files.pythonhosted.org/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", size = 254005, upload-time = "2026-01-26T02:43:10.127Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", size = 251173, upload-time = "2026-01-26T02:43:11.731Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ac/b605473de2bb404e742f2cc3583d12aedb2352a70e49ae8fce455b50c5aa/multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92", size = 243273, upload-time = "2026-01-26T02:43:13.063Z" }, - { url = "https://files.pythonhosted.org/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", size = 238956, upload-time = "2026-01-26T02:43:14.843Z" }, - { url = "https://files.pythonhosted.org/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", size = 233477, upload-time = "2026-01-26T02:43:16.025Z" }, - { url = "https://files.pythonhosted.org/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", size = 243615, upload-time = "2026-01-26T02:43:17.84Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", size = 249930, upload-time = "2026-01-26T02:43:19.06Z" }, - { url = "https://files.pythonhosted.org/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", size = 243807, upload-time = "2026-01-26T02:43:20.286Z" }, - { url = "https://files.pythonhosted.org/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", size = 239103, upload-time = "2026-01-26T02:43:21.508Z" }, - { url = "https://files.pythonhosted.org/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", size = 41416, upload-time = "2026-01-26T02:43:22.703Z" }, - { url = "https://files.pythonhosted.org/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", size = 46022, upload-time = "2026-01-26T02:43:23.77Z" }, - { url = "https://files.pythonhosted.org/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", size = 43238, upload-time = "2026-01-26T02:43:24.882Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, - { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" }, - { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, - { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, - { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, - { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, - { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, - { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, - { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, - { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302, upload-time = "2026-01-26T02:43:48.753Z" }, - { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981, upload-time = "2026-01-26T02:43:49.921Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159, upload-time = "2026-01-26T02:43:51.635Z" }, - { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, - { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, - { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, - { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, - { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, - { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, - { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, - { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, - { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, - { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, - { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, - { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, - { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, - { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, - { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, - { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, - { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, - { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, - { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, - { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, - { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, - { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, - { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, - { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, - { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, - { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, - { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, - { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, - { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, - { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, - { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, - { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, - { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, - { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, - { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, - { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, - { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, - { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, - { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, - { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, - { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, - { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, - { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, - { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, - { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, - { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, - { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, - { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, - { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, - { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, - { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, - { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, - { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, - { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, - { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, - { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, - { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, - { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, - { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, - { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, - { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, - { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, - { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, - { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, - { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, - { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, - { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, - { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, - { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, - { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, - { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, - { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, - { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, - { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, - { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, - { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, - { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, - { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/14/95/989c1b5ca17b72128661530cd6e351a0a83cda9a4d6c036e9ed976c18931/multidict-6.8.0.tar.gz", hash = "sha256:5cd4637ce76312ba1e05eb9c5193fec231f64fee0944e135fa1e951242355b37", size = 122412, upload-time = "2026-09-09T13:57:57.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/ec/714516a7e0f0e05bd5f67402bdeac775e0a50b883eafca3cf21adcacc228/multidict-6.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c0fe437a6d2f36aac2b49517057776575b5bf359df314cca20d230a6e139c089", size = 85595, upload-time = "2026-09-09T13:52:49.534Z" }, + { url = "https://files.pythonhosted.org/packages/c5/af/13c6c983bb2a59a567fda78ecc42bc3328889179480cc14389213f6837a8/multidict-6.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f3a0a31189acf6703307397c6139ddabd734c20c5ef92649fc93e473df6615a3", size = 51300, upload-time = "2026-09-09T13:52:51.225Z" }, + { url = "https://files.pythonhosted.org/packages/6d/59/38746cd2837b3656247d841c28bcac821be312319c89ea126ec335077ff4/multidict-6.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c9c98d2f0126ba84cb45601eed97ff67ff767e19ae6eb3c31b02827b54d700e5", size = 50492, upload-time = "2026-09-09T13:52:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/aa/fe/9b1b44d060692fbeef47e7f9d72f9cb9e9c2c2fb8381fe543419449f5b7f/multidict-6.8.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bc7003991ebd368a20d05228137a37b3d3066751f3ea1e4f7b8efe8e752f2f5", size = 259705, upload-time = "2026-09-09T13:52:54.082Z" }, + { url = "https://files.pythonhosted.org/packages/01/6a/dfb3e47ab0efcab2ddae494c86d9ac1fd47c86b3ebf687b1d6bf72221178/multidict-6.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2c5fd0fd39574ccd58e1a52565b341aff522c5c836f1b3eb7605c371e61f52c", size = 258089, upload-time = "2026-09-09T13:52:55.647Z" }, + { url = "https://files.pythonhosted.org/packages/91/33/abc20faf78cd7060d4f904f0e669cc521537b1a2a0f6f8ad84cf5006447f/multidict-6.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1cd4d66ce894a45482e1ac2837c31d0bd447df35065e542b60055aa2d00404b", size = 235981, upload-time = "2026-09-09T13:52:57.291Z" }, + { url = "https://files.pythonhosted.org/packages/bc/79/fba4622994740f487c927d7331876b1cb7253515bda66d8fb7bc0a382879/multidict-6.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7a2573d0fd34f361a4a14e54d8cda3a91ac4e55fbf0d719698024f3b09c5b147", size = 269134, upload-time = "2026-09-09T13:52:58.726Z" }, + { url = "https://files.pythonhosted.org/packages/de/6b/518eb2f391c9e579afb08d67fa280c4037d3b61fe57bc1071e6b84306cd4/multidict-6.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edda19aff836ec515caafc09ea53d2ab144a041f09ee9a7cefcbd3ae4e976256", size = 271441, upload-time = "2026-09-09T13:53:00.108Z" }, + { url = "https://files.pythonhosted.org/packages/53/d2/6db1ce7dc516d4b9afbe679b0e7190b26a517b25ccd11122c8c27ed098a3/multidict-6.8.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e418ec99574ca24365ca96546af285c2b021a1a072478a79f0e3cc3b08837154", size = 259314, upload-time = "2026-09-09T13:53:01.574Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b7/548ec8cb0e3be3c03519420de5bc3094418254d8efa599da7e39a567c585/multidict-6.8.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11d71490bf4bbff1141b14b93af419ad68c56b60bea9277fcb3f94dcca4796eb", size = 243703, upload-time = "2026-09-09T13:53:03.067Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/2af67fcc8aa6ee8727ae9a29fbebc81bcce5f9d78f8a6c365638824ffb09/multidict-6.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e8e1e895e23818d343e4ae7dd95a0a556fdeaf8b471acf1c0a39b93c6f54d478", size = 254376, upload-time = "2026-09-09T13:53:04.514Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2b/b41aa60b0a1021304e95444aa40e3ff7a2a31028a21dd1d93c628de5b87c/multidict-6.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:15db8e6cab5f4cc9241bc56e69fdf3452cf49c10ee3c7977c742e68a275b3786", size = 249211, upload-time = "2026-09-09T13:53:06.056Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ad76aa06f5aace4ab82e70367525ef9b0606333963d9e436273c574c10ad/multidict-6.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8dc2d9c3a924ed14166e63650b2cf9f59e7821743bdd50b23802bd97ca09bde5", size = 260855, upload-time = "2026-09-09T13:53:07.528Z" }, + { url = "https://files.pythonhosted.org/packages/19/45/248ebbd3276a6c066e631f7a49c7c2c0e0774600a752144e64f0ae9af82c/multidict-6.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f2fa3d3b1c933d4bcb8fd2018700d5e7235c52f2ab8c88d22286965c5c0f00f8", size = 266149, upload-time = "2026-09-09T13:53:09.097Z" }, + { url = "https://files.pythonhosted.org/packages/76/72/3d87c20cd944a1eb9bcb21928d3e39e758aea8b0e4df3defc82d081f6c7f/multidict-6.8.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d6dc7804c50fabd28644d4d18a4b20aad3681b3e64f3acd3182b330ca73f7a32", size = 239270, upload-time = "2026-09-09T13:53:10.502Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/8a69b1ecbe25cfdbf5200167357dc01ecf3abb974cb473fbaac5d3724e79/multidict-6.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0eca15d627e942ce186a935061f1568cc46c02e97c419c8da802df2be9f917d8", size = 262229, upload-time = "2026-09-09T13:53:11.944Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e2/a40b690a319c3a17e1ef3cad127a7993d69cec06c892c9000cf67329cf75/multidict-6.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d7e5ba0a0153e35fbce9c51df530c8b4cb0c3012b46a04ff9a048441a269c2ed", size = 255270, upload-time = "2026-09-09T13:53:13.412Z" }, + { url = "https://files.pythonhosted.org/packages/99/bd/0e72f5981012a66ebf8b97153de8ff299b947af12d62beb832626f7a9b0d/multidict-6.8.0-cp310-cp310-win32.whl", hash = "sha256:b7e62b8fc7bd6cad007b9f2e0ad9c8d4854c06350d5f51e1a439dd18b510ecac", size = 46896, upload-time = "2026-09-09T13:53:14.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/43/7f93a35715d1ce1d96a7aedb7bffa870206390c0e2ba7cffd9b8533739a1/multidict-6.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:dc911ae6152e455b16a2a1a626aa6cd612fa01efb9d0a4ab3f5cf328b911483d", size = 51492, upload-time = "2026-09-09T13:53:16.067Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d7/518dbe7eb714f413a093ef32c99010411e228ff57fe3e1bfb2df80abccf2/multidict-6.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:6300d5176647145ba1e22991c924fb29743e54b4d7b8bc85a0d3ec0e55e189cb", size = 48049, upload-time = "2026-09-09T13:53:17.3Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/90216392620b6ef8704eb0bc055141745de396121067e98f1f72bdac33c3/multidict-6.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b8986d4313dcee7c932837d16a535f1840b827bac1ea7c5c4c80751d0423794", size = 85033, upload-time = "2026-09-09T13:53:18.786Z" }, + { url = "https://files.pythonhosted.org/packages/2b/bb/e01b8cf906479b2fa046e992b84a9d9f39c1ed4058acc353004cd9a04df9/multidict-6.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2622fe114c0bd66ca5c461859357587f5a5e35ee5ff49fc5643d1bc78dbb41c6", size = 51008, upload-time = "2026-09-09T13:53:20.044Z" }, + { url = "https://files.pythonhosted.org/packages/c5/da/35d70c920812d9ddc6f295f6426457665194335fbc35aa0b96716aba219f/multidict-6.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26a7aafc992e78872e2c8c1f7248c0e01139cf9020a7781b0c064fa566832712", size = 50232, upload-time = "2026-09-09T13:53:21.356Z" }, + { url = "https://files.pythonhosted.org/packages/91/6b/4c988a7c0daa4fbffc6080ed3c37b3a67cf225ba1de69d10a19ca1dd8d0d/multidict-6.8.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:05c2e90c5289c5f7436ba2c25812a5fbdaa1c1bc11c8d8d3bbf64f5cd7c633dd", size = 271678, upload-time = "2026-09-09T13:53:22.716Z" }, + { url = "https://files.pythonhosted.org/packages/73/2b/22c7de8a72fc5c36390e8049d86d842b032ac7c87ade035a3dafb7df4ffc/multidict-6.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7941ef106ca1f2c62314a13c7ed913bcf49641f3efdc12864d588e17870920ac", size = 270283, upload-time = "2026-09-09T13:53:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f4/c1428318f945c57c016ba690338af41f87f18a7d3a7ef3227b1440a2c169/multidict-6.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a5a7ee1217949ddd43c6b7bcf70d5c22193bb50e8c695386de5905325e93ce9f", size = 245306, upload-time = "2026-09-09T13:53:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/8b/92/a37f7519fb32b0bf43b0540292effe60edaf0691959214b227795bd3d56a/multidict-6.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b62b7e0025aa48dec11e125e655d1157985a5fdcec04b1ad500101ad072b891", size = 279567, upload-time = "2026-09-09T13:53:27.162Z" }, + { url = "https://files.pythonhosted.org/packages/51/fe/a93c2ce417401863cc88ecf6561577625c140990d412e37f347a1c03a144/multidict-6.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea880d441be7c510106bc56064be39266d948aef94ad4955e8784690019a5d9f", size = 282526, upload-time = "2026-09-09T13:53:28.927Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9d/6bb4f84fdd82acfa09dc312ac133e7f76cbf2370004447f2a90e65e5d63f/multidict-6.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab83fdd8cf307353edba9c427c17a3a021c2522d690f5633dd9f72d28b48ccca", size = 272604, upload-time = "2026-09-09T13:53:30.595Z" }, + { url = "https://files.pythonhosted.org/packages/3a/97/df0a30a4d786d313f24b39cb96edaaa3bbfe83a0b309577c81a797783ec5/multidict-6.8.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3d1f48582686a0a3b81e9b43234766cc96697df72081af3f48107bd3f34d34e5", size = 250786, upload-time = "2026-09-09T13:53:32.15Z" }, + { url = "https://files.pythonhosted.org/packages/6f/72/e59a917680d00214ba41f9fec19a8bec48f3bdf62656bc4377f37ae30947/multidict-6.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:563661919f603374c40cf45ffcd25535c12b8954203569a2ab1cee5265871cf4", size = 265419, upload-time = "2026-09-09T13:53:33.943Z" }, + { url = "https://files.pythonhosted.org/packages/47/21/0eb8868982ff07c1a2faaef7502ee0be32ef247dc1bf27881c51e7f4b20d/multidict-6.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2ba9933e8f35fe4a70f540b837254c4055da82dc3a9e500a8f95e61498083a15", size = 258934, upload-time = "2026-09-09T13:53:35.662Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a6/0586396716faf950c10ffbe733e4a57b4eeda9f7073e60c09bd4a05a766e/multidict-6.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:68d40b2bace413f3231f5729d3fcfb1837fd31c4907e241b5d43211bfd76f3c2", size = 273168, upload-time = "2026-09-09T13:53:37.131Z" }, + { url = "https://files.pythonhosted.org/packages/31/79/7197af20190d0d832be3b18582be46c224f64f5ba1cd35d32068d6af31ed/multidict-6.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9e246f67ac038568b854ed7c5578e4c6af1f742359901a8fcc3603ff1358df6", size = 275884, upload-time = "2026-09-09T13:53:38.579Z" }, + { url = "https://files.pythonhosted.org/packages/f7/f7/af60573e25ffecc09e805464580d579338cf1a44332ab52757038435ed60/multidict-6.8.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:29b6e7bc4442a56cf8e0dc1cabf3fdc77cd533568d6829fc76a1effd2ce332ec", size = 246967, upload-time = "2026-09-09T13:53:40.172Z" }, + { url = "https://files.pythonhosted.org/packages/6b/02/4459f8c5025ab034d3d9af9a34bbde11319016cff2f327362c8ec43a80a1/multidict-6.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:82780eb8bf59e8fb25dd081fde6e058805045d6374a7f2f877effc826ca4434b", size = 272358, upload-time = "2026-09-09T13:53:41.868Z" }, + { url = "https://files.pythonhosted.org/packages/51/99/680d3522ab51a77094d31d7958c9f5989499a01ffbe5aebe11d25212b385/multidict-6.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2196ba6df392c3574acadd14ef87550f3611349c8618564de324b806a7a31cee", size = 267450, upload-time = "2026-09-09T13:53:43.646Z" }, + { url = "https://files.pythonhosted.org/packages/4a/04/d0c773805b0aea171287b01a82e4c28c59ef2c2d93e8047394765181363f/multidict-6.8.0-cp311-cp311-win32.whl", hash = "sha256:b8b7aa75146266fd3e2a2437cf69ae188688c04ab8665b163d4257b46c1e0c83", size = 46847, upload-time = "2026-09-09T13:53:45.161Z" }, + { url = "https://files.pythonhosted.org/packages/71/f8/1a959771a4dcd3224bd7bb40054f66b98ba5b20d6b74fd273f548f887e0a/multidict-6.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:b03ca066b47b18b205cc080dca6f76cbd159f8cdd33a02a0700164c13b37e463", size = 51549, upload-time = "2026-09-09T13:53:46.448Z" }, + { url = "https://files.pythonhosted.org/packages/64/7c/3a74b11599a9d8f3cfbb78b9c5cac3ff3cdc17278e4c00329c7c18dcaff9/multidict-6.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:54af1266710cb0f305127ae0b970aff8d208057f8a29cd6e1db99b0114947035", size = 48020, upload-time = "2026-09-09T13:53:47.767Z" }, + { url = "https://files.pythonhosted.org/packages/13/83/a4621577679149ea001806f5963f3fc687c391c1bd5217157be2278863f5/multidict-6.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:22a310ad37672a261e55a8b5e28d0ae08cfb68abb1f46418ccd19835c3b8e836", size = 84146, upload-time = "2026-09-09T13:53:49.163Z" }, + { url = "https://files.pythonhosted.org/packages/09/00/236b063f3e606055a3a9ba8faa5d40e6c688b059a58056b055f213476f46/multidict-6.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bb8c7da8c861391f7ae48e3593762be2dabe405109e01aec520fbe1a6d15d14b", size = 51049, upload-time = "2026-09-09T13:53:50.46Z" }, + { url = "https://files.pythonhosted.org/packages/91/9d/954b139bfa969855f2d4cb5ae7b7d44dd7106f754305b6e21a9068213aa7/multidict-6.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10456943903744ae1249728161c96bd9d2f7eb5ee17fcc2ffda2dc32e1bb36c7", size = 49362, upload-time = "2026-09-09T13:53:51.878Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8a/8774f5b3f6d5266ecd1117876e04b405f0f1ce19aa750b35a826efe6cfe4/multidict-6.8.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:658f5a1895b804423d97b22d06fc0d0b171c7c01dcc3aa9c8faf0c0e26a249a5", size = 278619, upload-time = "2026-09-09T13:53:53.44Z" }, + { url = "https://files.pythonhosted.org/packages/db/47/736080fec911ed9f2dd57ccab5a8145e4f17c4987de0bfc27bee20e4d170/multidict-6.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90c10b22860dbd09982d0b8993b66231a861bea2993d4a817ff35273f6ea285a", size = 283771, upload-time = "2026-09-09T13:53:55.048Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d5/b7f41f59b0583f092602308a5e7c16ec5efd00d60214b22511e89a38dd19/multidict-6.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:088b04a66b3c1fce6fe4d771ec184a0426262d0b86709c908477b4ac7965df40", size = 262108, upload-time = "2026-09-09T13:53:56.631Z" }, + { url = "https://files.pythonhosted.org/packages/54/b2/a52dc06c6e2598672308e3d392fd85b837b23c25dda459bedaea84985080/multidict-6.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9caef53b20a105c0d66518a34be2f71b2783de8d091767575ef86f6ea422236d", size = 289899, upload-time = "2026-09-09T13:53:58.415Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/00cda7983f37d119b86f1f89d5b4cf771ecb6d0fedeb9a0971758d6d6d4a/multidict-6.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a5e1583c14775580da05641240ce0d93f36ce3ddef3d5083a827468b0bcfe874", size = 293025, upload-time = "2026-09-09T13:53:59.973Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c7/4544cc02e45bbfac4d8788b05379bb360021fd8c53fa74b0f624126ac188/multidict-6.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:003a3bddb32915c3f67096ea41d24e53edf710edb65a1f5d0c70ab40b0e4d20b", size = 287410, upload-time = "2026-09-09T13:54:01.652Z" }, + { url = "https://files.pythonhosted.org/packages/43/1a/7abed90b8eba381842235bfa6f4d730204fd7deb374fc87e3ec9b2c2b4ac/multidict-6.8.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:35977263d9bf506dbc65349f63b3b8c91606d4abc110990945e3b94bc671319c", size = 255878, upload-time = "2026-09-09T13:54:03.366Z" }, + { url = "https://files.pythonhosted.org/packages/25/3e/73fae10e15fc4d711975337caff7e494c87de5d0189afe3518b21b945326/multidict-6.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9dc7b4ff6ef184504b49ef9a4113d49a646653b2ce89f5f48c1f57cdf6ba081", size = 277831, upload-time = "2026-09-09T13:54:04.963Z" }, + { url = "https://files.pythonhosted.org/packages/c5/cf/01cfc81492933331147004861bdff201d8adeba8485ecd8f490e755fe7e8/multidict-6.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:887f9a975996032c686719eb7b3e1e7942fab5079c2b778bbd9afe9a9d78244f", size = 275096, upload-time = "2026-09-09T13:54:06.661Z" }, + { url = "https://files.pythonhosted.org/packages/de/59/e9a3773b17297fa1e38fd4b3c6f5f2f458380796be62eca7d0d77c250618/multidict-6.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f3071e6515cc63714d014da8f738ae9fa3997c476203f3cd46de380c2376ed7b", size = 279803, upload-time = "2026-09-09T13:54:08.389Z" }, + { url = "https://files.pythonhosted.org/packages/64/9d/2d712a2605b3971908e3b4f5eb6f98c353d9991e106f684d0e08ae581814/multidict-6.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5f3a2af441670d80ce5fdf13b6c1b421fc1fc7fc5182d58ac7486738bb2b742", size = 284595, upload-time = "2026-09-09T13:54:10.17Z" }, + { url = "https://files.pythonhosted.org/packages/58/6c/21aded8586e552b29892268c576e5745d1a894c5451c9866ca3c06b7ec50/multidict-6.8.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:31e8901637e20ccb3cf8f8848b5d0f7a00462bf5b34f7cf3dcbb2753b18e8b39", size = 252641, upload-time = "2026-09-09T13:54:11.811Z" }, + { url = "https://files.pythonhosted.org/packages/2a/70/56a415ae0a45e5eae2ec817d46aeb72a1ae777863621c85f1f39d329275b/multidict-6.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:13967dca8b2f33230a1427b52438326bb1c9101a1df22a3309ed3fcbbb3c96f0", size = 283369, upload-time = "2026-09-09T13:54:13.59Z" }, + { url = "https://files.pythonhosted.org/packages/08/7e/7b7cd611fd94bf2f6bd16244c50495867ba394d5baaf8e6e487d39494ab3/multidict-6.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad474c11d851b6fc97cb625e4822bc0cbd567fc07dc2602e28faec5a36b42bbb", size = 281653, upload-time = "2026-09-09T13:54:15.174Z" }, + { url = "https://files.pythonhosted.org/packages/33/4a/b19a5892ef2ef6c68ae278b4f1504b82e01037baedd92c55d37e55ecad00/multidict-6.8.0-cp312-cp312-win32.whl", hash = "sha256:7bb0dad75068fee80fcb60f88569722c199d8656a16706702dc6e3b786819c90", size = 47936, upload-time = "2026-09-09T13:54:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/1952f9f282aa71e7c3db3a6b47afb689d0ddf283dbded7e6326a91d421c9/multidict-6.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:7d26dc8f070c0ec5579e987fa615ffd6883086106eefdff9e10d160fc5630630", size = 51723, upload-time = "2026-09-09T13:54:18.05Z" }, + { url = "https://files.pythonhosted.org/packages/49/b5/c9d57dbafe25b8f3460ce2961c968539a81ff7a70160c44dcfd4255cbcd1/multidict-6.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:e6ec7d37841609a691b96a10b4fde386c7cd93ebbb939f59c9f23325ee788395", size = 48492, upload-time = "2026-09-09T13:54:19.42Z" }, + { url = "https://files.pythonhosted.org/packages/84/1f/d7112c2dd7db02677097be72fb65542f51a5aa73cb472b87ec211ba9e0dd/multidict-6.8.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:ec0a4d066356054d569a66e0a94691a2058b680be5e710298f61db11a3c4609f", size = 54197, upload-time = "2026-09-09T13:54:20.814Z" }, + { url = "https://files.pythonhosted.org/packages/ae/24/876015abbcb4a179d946579eb77b778eb5a948fc8381bc7928ba895bc051/multidict-6.8.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:714597cb5d5e15a8a449d2ae23c45b486a9e8fa33c462c7a33d7f35b65d92943", size = 47787, upload-time = "2026-09-09T13:54:22.51Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/ceb7d25f8a567599db2eb19b08cac58d67ff553cff42dcadbea9aba56a20/multidict-6.8.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e0db3a4d1e264e225037a6023888972c25206a96e016021a5bea41c9a939f2a9", size = 48815, upload-time = "2026-09-09T13:54:23.986Z" }, + { url = "https://files.pythonhosted.org/packages/18/e3/e1c6e9c3818c34b782f23ce5fdba3eaa34ec6750dc53078dfac80fa59be7/multidict-6.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:27747162712e85c84598d364425dbf1714ff335bdb6ba3171c4e5081196e8916", size = 83484, upload-time = "2026-09-09T13:54:25.674Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a0/c23f78a4badee9a5b3e760495c661c62a92c340a1dfd00f829cd16e256bb/multidict-6.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:847d6082ae694dc95e548acb201bc100e1cfa96513bc71fdcb86f709dad6c435", size = 50763, upload-time = "2026-09-09T13:54:27.135Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/db552d402a3f6b650f5d3ae11b82b93833836aebb51bcda22d8691121129/multidict-6.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:88a6df88567680504ae28bfa7a1f2f64243d91e79a40b2c92ef42efc531e23da", size = 49029, upload-time = "2026-09-09T13:54:28.483Z" }, + { url = "https://files.pythonhosted.org/packages/01/b4/546853fba19dcef77cdf91fc173faf0b02284a49106cf250511166b4ec5c/multidict-6.8.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:560b211fc3bd4a1e1c6de44f6d38113bf5b410dfc89a4c0d2a3c0edbf1a0dfb8", size = 278863, upload-time = "2026-09-09T13:54:30.145Z" }, + { url = "https://files.pythonhosted.org/packages/ee/3f/4b52dac7db547936eb762123ac1d99df23f92fdb358bae600e322f611247/multidict-6.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202436df907c15adbb94360296c425ea53cf8968a5d2cff9b5b9790ae1972b33", size = 283915, upload-time = "2026-09-09T13:54:31.937Z" }, + { url = "https://files.pythonhosted.org/packages/fd/6e/c0dfbf170e49a91bcb9ce850d51cb98357f3033c5227529200ca7625853e/multidict-6.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c46a08bf070d6849fed483e9d9833f9d06aecb8382ed985be0b38508b3ae958e", size = 260704, upload-time = "2026-09-09T13:54:33.529Z" }, + { url = "https://files.pythonhosted.org/packages/91/02/56973a060ab8dfc2e80bb6797682f6577aff7123cdb1de1a568670ae3499/multidict-6.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2cd560498ae8e1bcc955643c1d78eb8e338226d07a983c656ea8c4443d3eec0f", size = 290243, upload-time = "2026-09-09T13:54:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d5/67/69112989f131bdea4a87b74e82cb0a2daf37880cd92b0e6f0420020adceb/multidict-6.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:758233648ac47b07c575224c4eadd73c8929c3b4c31e2afcfea935fde1cda735", size = 291131, upload-time = "2026-09-09T13:54:37.205Z" }, + { url = "https://files.pythonhosted.org/packages/c2/75/9435f68b0cfc442d4917de85c26f2b2e1292630883414a25576083fa2469/multidict-6.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:122adc7c46ac1e31ecfc7f81b2530533dccafdba70f5d741649f87e336c63384", size = 287551, upload-time = "2026-09-09T13:54:38.835Z" }, + { url = "https://files.pythonhosted.org/packages/13/08/2ee4838081d6587849611aa7ec722c4cb2469e912fd0eaee980e7bac064c/multidict-6.8.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8125e60f3c70e323ac07dd8b3635f7b3bbc5c3a9ac04ae5988f668ff7ae28a18", size = 254591, upload-time = "2026-09-09T13:54:40.806Z" }, + { url = "https://files.pythonhosted.org/packages/94/f1/05673b51191f77f4198b8e4b35f16ea71c0300c72ca8aa027a66a61b6edc/multidict-6.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:83ff054b04915be5c15680da6c6012474a2cc2bf534129a0e8c6a99f17ba7238", size = 278204, upload-time = "2026-09-09T13:54:42.672Z" }, + { url = "https://files.pythonhosted.org/packages/45/4f/b6cf74322b3fbd3e011a1e903730191922291a7779f6d404114c2189b806/multidict-6.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:930c6058047410e3edff445f5a6e4457f2e089042dede00e2d18ce06f3ceae2e", size = 275600, upload-time = "2026-09-09T13:54:44.348Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ab/958bbb04377159ff03c7314cd9d8a48dd6fc4f78c840589c22ab155ee9c7/multidict-6.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13e26f59f0eecfc5f67c663ad550ffdaf62c0f657547cde387f6c86af1c9449e", size = 279793, upload-time = "2026-09-09T13:54:46.086Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3a/706605ab0dfc4179748ee7949829e63c6f14ae28667aceeefaf2c701807f/multidict-6.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd789a294d8e098528be29b2669b83005ce569339f8cef167fc0274c3115c34c", size = 284751, upload-time = "2026-09-09T13:54:47.793Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a5/567e36c013ad023546de633079c6b22101dd43226b193cba00e6399703be/multidict-6.8.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:3126f2a96704505aa4e92a72d6e8a5d7f29d40a987ced8bf69e29d71dfc71fbc", size = 250812, upload-time = "2026-09-09T13:54:49.509Z" }, + { url = "https://files.pythonhosted.org/packages/0d/5f/6b0b64aa0cd346b07831dabaa6ccda0e73014c5df044b68baa763f0f0552/multidict-6.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:23c9ee89967b6a9b4048acb3b93b660ed714ce9c8bf3bbe652959bc120dc02dc", size = 281606, upload-time = "2026-09-09T13:54:51.288Z" }, + { url = "https://files.pythonhosted.org/packages/31/8c/b846b6796f26d496efb07fedef2b69f6de533da32a56f12d236722a96157/multidict-6.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a62e302fc8cd6aa8972207e7e951d1fdee7c1dda18568305041d19f0e2c00f5", size = 281733, upload-time = "2026-09-09T13:54:53.05Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f3/bf14a39d4af5697fd9404baaf70a0aeeb82d258b95de5cb16b1a7f98ae6f/multidict-6.8.0-cp313-cp313-win32.whl", hash = "sha256:093167d22a8c95af30f597b8a5686f20a14512989942d4be804d119899caca20", size = 47738, upload-time = "2026-09-09T13:54:54.676Z" }, + { url = "https://files.pythonhosted.org/packages/19/0a/598511a5741a3cb374971b3b02eda8a09896118ba528a54795f7e7e8bfb4/multidict-6.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:f25b61a708bd276e8cbb6afcbbf1b8e793a3be70ba0a842d0b8692020f83b706", size = 51609, upload-time = "2026-09-09T13:54:56.38Z" }, + { url = "https://files.pythonhosted.org/packages/fd/b7/6f5c1bd4ffe42d4a6db0f2f65491d4088e9c25c990358fb31a614621d664/multidict-6.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb36381e1f9f9d06eba2f10bdd438e5d20c07d5b55e1a3eee30b9f44cbf52316", size = 48280, upload-time = "2026-09-09T13:54:58.03Z" }, + { url = "https://files.pythonhosted.org/packages/ab/85/153341590e233a967c1d6791a83402d01693dec0f4c1f695606ef16c7ed2/multidict-6.8.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:f8b09b25e0f4dc2ea9e2adbb1cc3ba11a94d6fa3dd978ae659c8743052e1afbc", size = 53758, upload-time = "2026-09-09T13:54:59.563Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ff/44f72d516ece0398683ef52061797d83a74b16b8c1e4587408e97959d783/multidict-6.8.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1f57c414be82490bc0e0305fdb834186229b2d9b6a35fa0afd1eb1a772d125ab", size = 47495, upload-time = "2026-09-09T13:55:01.382Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/6e118f761b024dd35d26c2fe7ba41572bb0e8ac5f8cfccbbcbc2ff76da4e/multidict-6.8.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:00be37bde741bf60871082cd347a093218c44886e99231b7516671c70f2c280d", size = 48540, upload-time = "2026-09-09T13:55:02.989Z" }, + { url = "https://files.pythonhosted.org/packages/e8/4b/3eed744491b32f0e318e7db89dc06858732362f706e8d045fa9ab51a343a/multidict-6.8.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:e37b744849fb631bb52e3dadde35ffeee365a6c41cf71257b5b7acc9cd83fd38", size = 83130, upload-time = "2026-09-09T13:55:04.554Z" }, + { url = "https://files.pythonhosted.org/packages/6d/de/95c2c0ddcccb9a41ffbaa5df8ea059a8ff81916b7617a8847ecd89ed8061/multidict-6.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c2b2a96cf1dd99fe7867be4c013314225f4d5786e6685906e29932d42aca6f11", size = 50574, upload-time = "2026-09-09T13:55:06.387Z" }, + { url = "https://files.pythonhosted.org/packages/f5/b7/f4f4989594f99bc121ad9277090c4e49819b08ab1a96e132b628a9e10b7d/multidict-6.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bea7df027015856ba5d0a88e3b4777ff8cb5c66b58fc108050fe79d4dd9d4d2d", size = 48786, upload-time = "2026-09-09T13:55:08.131Z" }, + { url = "https://files.pythonhosted.org/packages/b2/86/f1d86a0222f31fb3df8eef3d6c9abf7e8d65d49edd8d0d7e7afaf23d23cc/multidict-6.8.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d3da668e903c934ed0b587ecacfed6901f6ae6384a6e975887592b61845e78bc", size = 276670, upload-time = "2026-09-09T13:55:09.803Z" }, + { url = "https://files.pythonhosted.org/packages/03/50/6945c50f86a978b2bcace9ca344165ff80883be47d984489bbba8fa0ab20/multidict-6.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64eaeda36ee8d88f9e8616a587a8c66a663283cf6e0dcf013c1ddd8c758e4aef", size = 279339, upload-time = "2026-09-09T13:55:11.685Z" }, + { url = "https://files.pythonhosted.org/packages/ee/2c/e649889ba23fd1f4442a85427b99d9e6261226b2ac31914aa7f5b241d947/multidict-6.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ac746cb365bac1c462da9e3e6ab8904a8efe2217a56b0b2e3d9480f41d2b2602", size = 252549, upload-time = "2026-09-09T13:55:13.527Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f8/1023b66e011b1395fb160dabb0f0608ef67e569f0bdb2c1d5ac9b2f2adc6/multidict-6.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:18f0e06360c3e451a3ab800355773c8d125a758238d780c800b0ee5e90ee903c", size = 286203, upload-time = "2026-09-09T13:55:15.19Z" }, + { url = "https://files.pythonhosted.org/packages/7e/6c/48aea545cbda6d0444848ec23d988c13b86538a00a1b7d3868cc2382ff94/multidict-6.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:69708fecaa88bcb2341397b49fc95057a835b02a3670c551b37f95dd79e64e3a", size = 285039, upload-time = "2026-09-09T13:55:16.928Z" }, + { url = "https://files.pythonhosted.org/packages/68/2a/066123b17291671bf67d2a5c65ee81a48de53913bd1b1578791519eacdb0/multidict-6.8.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9606f583e7acaf61e7b3f56074e14037b9af7cb194590edfc0114b3ae5931ff7", size = 281075, upload-time = "2026-09-09T13:55:19.155Z" }, + { url = "https://files.pythonhosted.org/packages/47/20/4f0b2c485da2e8a659cc677717a3745872918c9c85064491a1ef75d7a3bf/multidict-6.8.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1f66fe6a021173d0d47968491791966b9f3e6d61115f2491744aa0c07a6e67af", size = 250431, upload-time = "2026-09-09T13:55:21.07Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c7/b9a288901577aa0b82c33c64d52246c88076d260ad7b6c16b021ca0f8e99/multidict-6.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:be007d1aee2cbd530347dcafedb400891a3b5f1bd7135f95cf5d5b330b5219ee", size = 273891, upload-time = "2026-09-09T13:55:22.887Z" }, + { url = "https://files.pythonhosted.org/packages/da/51/0ba50cab2cfd067988de2abb73f23076ac727fe18d03f1368a59def64727/multidict-6.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8457aff3c12a89a8e1c4674de5c777857fbc429f40fe117a3d29538547cbc364", size = 265262, upload-time = "2026-09-09T13:55:24.77Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/e5be1117dbca6eb9ce231142b7e20599418bb3500147db51bf844ce8afcb/multidict-6.8.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:95c27b4f3f04320fc44e338573f40c5c956b504a7fcf081a157fd0b02579311c", size = 278033, upload-time = "2026-09-09T13:55:26.67Z" }, + { url = "https://files.pythonhosted.org/packages/d2/28/cad0afaec3caa56ea2c1ceed43c164d62ad3e83e950daf0d0c87bcf9dca7/multidict-6.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d244cf6b52b5ba1c34c3832f4652a668ebb36d95949b96eed9a1c54d916a90dd", size = 281717, upload-time = "2026-09-09T13:55:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d2/025702df0b69b856db70a4d66f77622f51c3d99771ec9a07f3ca80f7e098/multidict-6.8.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5bbbb696c8024475b1877d14ce20d5f1cc05b8f6d786cea0fe3aa7fedc02e891", size = 247124, upload-time = "2026-09-09T13:55:30.497Z" }, + { url = "https://files.pythonhosted.org/packages/b4/96/9dddca563f06a921956389c0bc9b894355b98b0bdf62299e2560c50afb6d/multidict-6.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:cbd86f9787c5e2f5fd27d8b21458222f107347c6731c4e93dde68f554b466a2d", size = 275954, upload-time = "2026-09-09T13:55:32.57Z" }, + { url = "https://files.pythonhosted.org/packages/ec/91/8b2f1f2a774a955665f268340a2b59db7020c5f12baac02ae9ef1b1660cf/multidict-6.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2f8a4b0b4d639d525928c7f30de527bfdf9ead6e44a5e8cb9c50aced5e4590cb", size = 275508, upload-time = "2026-09-09T13:55:34.368Z" }, + { url = "https://files.pythonhosted.org/packages/b6/1a/e2cabdfc0880a61a99d2b8bc361035036fb5a2c6af31ea3fa054ba1065c5/multidict-6.8.0-cp314-cp314-win32.whl", hash = "sha256:8890c89d662560e51c55ac1304d6f919b23942abe9ae1127cb1de9aa6132fa52", size = 46938, upload-time = "2026-09-09T13:55:36.057Z" }, + { url = "https://files.pythonhosted.org/packages/b9/7c/11234bcba62c22a58f2ba168499cfe3531f49de3edd5090d04a8c6cdc936/multidict-6.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:45cc39ba50fb0754a4359b90f8229ae08598fe2266abe3521b4e5a9ba916534a", size = 50291, upload-time = "2026-09-09T13:55:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/ab/61/793668439df924752a8137d6db0de97ed1add494779b01e4764dfc60571b/multidict-6.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d0264f8d5cb0a803f650a6a8572dfa0cd1e099a2234c588dc8fb220b415b865f", size = 47622, upload-time = "2026-09-09T13:55:39.335Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b8/3c091b929e6b5b2f6e0eba2232178e76d4503c8b96b92dfc281ff1d823be/multidict-6.8.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1969971900b0871530f9b62280dcc2d75688e74d2a69262bc01faf2b96c78f04", size = 88789, upload-time = "2026-09-09T13:55:41.086Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d7/3df83fab22dd64615db71e3b3cc1346b581d1459719637ce52144f9f6558/multidict-6.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8180b635290a75af8478f1b3e9810135381ae24833293fe77b85c1c21ff842ab", size = 53399, upload-time = "2026-09-09T13:55:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/2d/78/41bd04c04b0aed16540c4856c9e012afc1c254298da154398308df05e26a/multidict-6.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4261863fc8b5ab1b815ede94e592e94c6af5b04616014929057e61859e7382a9", size = 51597, upload-time = "2026-09-09T13:55:44.569Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6b/7bc4cdddf624e1e7e0231734b1331729ea46df10d7c8fd3fce79756e7d0e/multidict-6.8.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0b143d53590e89f43153d81d505a8448d4d57354354385aef8a51d67ffefa27e", size = 264391, upload-time = "2026-09-09T13:55:46.548Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/d2a946e5938771e92c39354563e535ef6bc6dfe399dd4307c6df8dfea183/multidict-6.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da1c112c5784ccd9d32cd90be6739fee32644e874eff6ae8f0497cba3e352e58", size = 264680, upload-time = "2026-09-09T13:55:49.915Z" }, + { url = "https://files.pythonhosted.org/packages/33/6b/3f9e981c42e7eb9329918523f0f9362ceb0ac3ee0ee1165c28f674249d75/multidict-6.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f7eefd0233a7c33ca980a5cfef26f1e9b5e2137839e752a99963696729f12d91", size = 235420, upload-time = "2026-09-09T13:55:51.92Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e1/a3a33a039fb6d381800ae5d1d587b697b8c27fcdfe48819420f08703acba/multidict-6.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:348bb85e2038b40c007383616d73f734869063772372519549ebd7da1723d1a4", size = 270309, upload-time = "2026-09-09T13:55:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/95/5d/8b06724a957f2e480f159b9550988a67810fbe9555a09c5f6a2a4b829607/multidict-6.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:095f62ea4e7a3be2f6c567ab695ce10e950f2adb905c1bec82281593e0b2d2ad", size = 275169, upload-time = "2026-09-09T13:55:55.948Z" }, + { url = "https://files.pythonhosted.org/packages/ab/32/8f3dfe2ffa5d0df2a95f71e63c2f11fe3b5e1771f26ef73bb1af84de83f8/multidict-6.8.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be569fff1d85cd29391c431c5641c8772acb75bbdc61e60a8e82fceb9023d385", size = 264900, upload-time = "2026-09-09T13:55:57.803Z" }, + { url = "https://files.pythonhosted.org/packages/6b/73/d5829fc00a055d6ab445e0876346ee9cdee670766cd4190dc0a496188c0f/multidict-6.8.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3533a03e4e789baf6a286e7b0b1b6da3f3d7c3eab569686ee29ee1d8b52e2cb4", size = 242486, upload-time = "2026-09-09T13:56:00.002Z" }, + { url = "https://files.pythonhosted.org/packages/b7/58/e8d7874038e31e0533182d1c3c5331a856b9c849a71bb26a21850e8c91e1/multidict-6.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1bdb9b8fba5a9aef673ec90db3f55b1ce743f2fbdea4d37dc04d14ccdfc153ff", size = 259916, upload-time = "2026-09-09T13:56:01.802Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f8/1b56a7401acda20efc016440f4fad3bef66c4aee54ca080ec143881ebb0d/multidict-6.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f8d7b66c9e09c0bb0add2b5895e646b62a0849e71155066f215523de6b95cbe6", size = 251209, upload-time = "2026-09-09T13:56:03.767Z" }, + { url = "https://files.pythonhosted.org/packages/bd/5b/68d67a9e302b0645a747ba910c30eb41f2834fcdc1d85f53eae2dfceee0a/multidict-6.8.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:563d6500ca80dac7bba6f48a78e0ffd87e21a7d4d24642c6503a2ddccd70c110", size = 264505, upload-time = "2026-09-09T13:56:05.795Z" }, + { url = "https://files.pythonhosted.org/packages/18/13/4dc304ba2c5f5307b474ab2ce1ed1f6b02b0b4e233c182e3981ed436c2e3/multidict-6.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:346ac52e56bcda320c0dcdfdd081947ed7cada33afea4e2284bef7b0733bff9b", size = 264916, upload-time = "2026-09-09T13:56:09.079Z" }, + { url = "https://files.pythonhosted.org/packages/dc/0f/7b1f729d18369915009185201be5d0b8df0e525340fe6a600d2f8441d6cf/multidict-6.8.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4ee953a5ebaeed38dc21cc032ed17a9d9782802e00042200497ab4b01b0bf7c0", size = 236839, upload-time = "2026-09-09T13:56:11.273Z" }, + { url = "https://files.pythonhosted.org/packages/22/d1/eba1b88b18b7019d9136303fe77909257c40fabde5aaf138a4d900b6ce3c/multidict-6.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:2f79cc3e8039a8cf5c77e0811b0807953fd52d0863b9b76970b20d696dc64a78", size = 265307, upload-time = "2026-09-09T13:56:13.379Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a6/6c1e4106faa27118ac612f4d664eaf909de252634785286262a627108e58/multidict-6.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:43a4b56555bbcf8af161e7c7682bd93eec10f068c95844511864c018c8e5e13b", size = 259041, upload-time = "2026-09-09T13:56:15.666Z" }, + { url = "https://files.pythonhosted.org/packages/c0/bc/ecfb8b6faa8e158a71b03bdf7f947f30e0bc5d899cc357573a76ab7bb1e5/multidict-6.8.0-cp314-cp314t-win32.whl", hash = "sha256:48ea524a25a1cd5972cf293bc95713918cba0bcd6fa9b992d906c857c546abe2", size = 50628, upload-time = "2026-09-09T13:56:17.837Z" }, + { url = "https://files.pythonhosted.org/packages/30/7f/e27fb699b70ad24dbd02ddee604658acb36f907c03c045baffe4ea774501/multidict-6.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d0be2b832435001bc623ca7f1499ca1a853d4f082fb61221a80ce71132f50b26", size = 55592, upload-time = "2026-09-09T13:56:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/eb/7a/76de70b2f6733696803f1ee56abe44a3757a52777383032c7373d3fea0f4/multidict-6.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:62b8e291a4f7edbf7cde7a43d831d893ba443a1b627498b53581943b0e348feb", size = 50300, upload-time = "2026-09-09T13:56:21.516Z" }, + { url = "https://files.pythonhosted.org/packages/ce/32/4de7320ae032dc768090d11f708d2d386df3db04cb6b8b0db0230cfc66c3/multidict-6.8.0-cp315-cp315-android_24_x86_64.whl", hash = "sha256:e192018b732f7b168e6604cbdf40fa8e05c996693b9eb445a0d8a73f4b77c5d3", size = 53761, upload-time = "2026-09-09T13:56:23.192Z" }, + { url = "https://files.pythonhosted.org/packages/5c/45/ecb641309dc2cdc6040f18e22c68eb5e94398f9404c4365d810f4292e053/multidict-6.8.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b25426f9f6ed402835617c8f23609a47045f91ecff365eb6734817e039a8ed25", size = 47505, upload-time = "2026-09-09T13:56:24.902Z" }, + { url = "https://files.pythonhosted.org/packages/eb/68/87d6161b9fef11943e0b894203da3fff561933ca3c9b2952b6e7100e9c9f/multidict-6.8.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:fa6c2880709c84457de104385b704fc28860f27e442ad13966fc4af8e714fe9c", size = 48549, upload-time = "2026-09-09T13:56:26.574Z" }, + { url = "https://files.pythonhosted.org/packages/97/f7/d852d2276407640cdbd29fe11cac6e93f70f59542cba174ef9d146738946/multidict-6.8.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:eabb03dc3e4ed6333ecd1cc9826ec80e7a98b5506deeb832d7260c8e44166d23", size = 83157, upload-time = "2026-09-09T13:56:28.227Z" }, + { url = "https://files.pythonhosted.org/packages/14/e3/16fe7ffa6090591d83cf6bc2486e77ce891705fb6d0191823140928311b5/multidict-6.8.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:59e539c4eb4d3a53b0e630a6ba2b2f2824732b5e73f90e30a280f12fde157b15", size = 50578, upload-time = "2026-09-09T13:56:30Z" }, + { url = "https://files.pythonhosted.org/packages/d0/0c/e38e41c1087a599f86ff58a01f358abf7c4db3c26a3e90eebb3e02193ef1/multidict-6.8.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:835d5a90b11d1f5f8200ff3cc8316bded76eebebc92436398947a27657e645e7", size = 48815, upload-time = "2026-09-09T13:56:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f0/eb691f42af8e7775992f57904ec75dc356fc7cdc896e5f30879decdd26f2/multidict-6.8.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d2d236b8a44ae91536a12ebcb996bdb31cf27425f36b4d05c87f2ba2716050ba", size = 274804, upload-time = "2026-09-09T13:56:36.741Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/28472ccfeb43c00a043c0385ca4294da21a5957859fb7860e2ebdb3e3011/multidict-6.8.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bb9a60b7faa5d37c426fa91cf4d6738182a1f2755b9fab7c9c64cd466c4ce51e", size = 279693, upload-time = "2026-09-09T13:56:38.531Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a1/2b4fe73e5fecff807b47650a155c391a103136428cb21d6ba8e39c5912b5/multidict-6.8.0-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0ef606c15cac6c90279acf34120784b6f36662cbf382defd3955cd8f1115336b", size = 254969, upload-time = "2026-09-09T13:56:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/44/e0/c97d1822783dfe52e02fd150fa3f02eb22410211a9e2615f71541803ed4b/multidict-6.8.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:68186a2d4051c8ffd17be33553bea2ec9bbc8ef860fe2980a221d96126296f31", size = 286392, upload-time = "2026-09-09T13:56:42.234Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d9/772f1339e1d051236bcc137b0eac2b4aaaa0bbb56aaf924e9aaba901d9c1/multidict-6.8.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2cc66abb85e2108c9ff8a1c0d20fa260bf690bbb33caef4ff3ecb2c2cbdfff5d", size = 285348, upload-time = "2026-09-09T13:56:44.255Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/cd045747e4680362e02955a82c468e95b5e4d319e3a79574b3fb677de568/multidict-6.8.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69b3e519a132bb943b0daae15fc8c2168706b17f826481d32a32a5e784b129e3", size = 282721, upload-time = "2026-09-09T13:56:46.088Z" }, + { url = "https://files.pythonhosted.org/packages/35/14/0802d9a3aae4ef21eaa39adbd729a380fa095932105e1424e417b53e783f/multidict-6.8.0-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e41226ecf607f062fe34a2f4cf64ad3a89e3a0180dc800b463b6b14c06dd10dc", size = 253168, upload-time = "2026-09-09T13:56:48.07Z" }, + { url = "https://files.pythonhosted.org/packages/b1/64/3f92298bab8fbe1332e708863fb55b66e755be6f416b3459720d48b33af9/multidict-6.8.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:610c7637bc36b90f39e6c66f710f93d57018f83d53e1e187caaa218c6892b95f", size = 274209, upload-time = "2026-09-09T13:56:50.023Z" }, + { url = "https://files.pythonhosted.org/packages/08/c2/2001ac0eac1a8b7390a5902d7115f66d4f256268057a502200b6ab12dad7/multidict-6.8.0-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:65c85c79f5a2c04fbbc18f006c014674dc5fdf270cb978d8862c82c6f694e60c", size = 268044, upload-time = "2026-09-09T13:56:52.033Z" }, + { url = "https://files.pythonhosted.org/packages/0d/90/78a9e26c85f89abd562a67f7fcbaef9007fd5c37bb9efac19f1cf604e7c2/multidict-6.8.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:628ff11e6720f90acd0c305dfa3339f04a783a20de8cda6ac333ba46447261e8", size = 274806, upload-time = "2026-09-09T13:56:53.975Z" }, + { url = "https://files.pythonhosted.org/packages/3d/71/713bd445421b21531234c1f3630b768192cb9d80c8b1c5b05c5b505ff4c0/multidict-6.8.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:0935971bffd0b479fc90c4811ca787703e93fcb6afea939a375dfc80285ab368", size = 281890, upload-time = "2026-09-09T13:56:55.848Z" }, + { url = "https://files.pythonhosted.org/packages/de/a5/1387c538663e2dc8c27bbc7cd6955cb66de0f55c780cf7cd0fc06a1a16ca/multidict-6.8.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:9442b14eec262a1f74369bbd07e75bc5155105164649a4b9fbc1ebc7b8fb0b14", size = 249749, upload-time = "2026-09-09T13:56:58.01Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/104296c9d70896b9759ce0812aa4899fab76d8b16bb32dcc5a78ab547c89/multidict-6.8.0-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:397599503b718f0137f26d3f6532d6955069cd2e5917c47ef581495bc2529ff8", size = 276138, upload-time = "2026-09-09T13:57:03.591Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0a/f2a0c2658e9d7ff5964ec2820a02054558636fafd663230ddc8310b8ed39/multidict-6.8.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:9e37024b41d7a7e7e9cce14b248d54707c21c2a2ea30a47b71bdcefcafec00f2", size = 277077, upload-time = "2026-09-09T13:57:06.024Z" }, + { url = "https://files.pythonhosted.org/packages/98/50/bc46566caffba5c1c4a510519156371edf7c4ecd35c9ef917d0c1803487d/multidict-6.8.0-cp315-cp315-win32.whl", hash = "sha256:071da134651b04a8507dfb331ac0988f376337c2aea59486bf20989fb5b5a64e", size = 46930, upload-time = "2026-09-09T13:57:08.009Z" }, + { url = "https://files.pythonhosted.org/packages/6f/1a/cafb31049ecc1a6ce52bcc69fa436cca239adc057b1718a0c49044848663/multidict-6.8.0-cp315-cp315-win_amd64.whl", hash = "sha256:3bafff8598f0528017ddc74194e5451d5c22d046c98935f8f86247b0f286e4f8", size = 50294, upload-time = "2026-09-09T13:57:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/6b/51/00e037da14cd1d894b123e0bbe62de5c561679a6ab23ab1c009f2965dcda/multidict-6.8.0-cp315-cp315-win_arm64.whl", hash = "sha256:e886ef8c9879105fe4fc99417447b3a5f35d1131412ce839470bd2089fe2043f", size = 47626, upload-time = "2026-09-09T13:57:11.738Z" }, + { url = "https://files.pythonhosted.org/packages/52/f7/aeb947982197e8b4f5c4da3961ee473ea5a050b94a6ff3b88baf64621401/multidict-6.8.0-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:883284137e25318ed9735b742ae46341a864888fae28e8b6314c4f84da080f08", size = 88801, upload-time = "2026-09-09T13:57:13.957Z" }, + { url = "https://files.pythonhosted.org/packages/35/d8/593948c016c3f850e3cd56a4e0144151eb409d2b8690f0c0ce7f7d33dbea/multidict-6.8.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:ca52b9ec80851366197577154c862c4c4c7036ca76ae94cef5cb59c5cfeab944", size = 53376, upload-time = "2026-09-09T13:57:15.94Z" }, + { url = "https://files.pythonhosted.org/packages/58/b9/097a05bca533027c0477b6a90bf927dbbb4b23cc9090bbb37a2e972af8d5/multidict-6.8.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:91fa75d0a693832106d98f66c849f034f21c828d14437f1fb97d3784aab89e84", size = 51629, upload-time = "2026-09-09T13:57:17.685Z" }, + { url = "https://files.pythonhosted.org/packages/fe/07/938ed21967f12380d0b8861645fb65a942f3669e31d5163ed94d23103b61/multidict-6.8.0-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:307c1acd812fe897e7fbe10c6758822e8c04be4e7c60a9f54901cdf8b5ab8bc3", size = 261967, upload-time = "2026-09-09T13:57:19.752Z" }, + { url = "https://files.pythonhosted.org/packages/89/e8/e66bf843fd29c01712dde9edeb9f4ad0ffab06ab4ada4b721ad7bc73b3d5/multidict-6.8.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf684986a2490628f059a99dd107b566a2d34cf947f8eb8387e0500a1f90c5", size = 265923, upload-time = "2026-09-09T13:57:21.784Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f8/e9be849b225af28a8eee2c6bfea23594a777c753fe97e2ff7e2180c8935a/multidict-6.8.0-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:77745725125d01fd613b6db043362aa7c6bfbfdb23d45dbfc3d92bf58160af62", size = 239380, upload-time = "2026-09-09T13:57:24.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/67/4dbad08f5081978c591afae9e836ec9ddae90e9e76be6d6ce10757483dc4/multidict-6.8.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8daafaa0b2eb43f76898ced78b1e0fb91b38c4fa50da516c18067f2a2d578c20", size = 271591, upload-time = "2026-09-09T13:57:26.611Z" }, + { url = "https://files.pythonhosted.org/packages/92/3f/e9c97222d7e104e54e556f118ec7d091ab41a0c10c630f2b97e5b43f5404/multidict-6.8.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c68e0c0649d17c2d0339e3674e86a4aeba4a7e6b21c1e394cf947a95433b31d0", size = 276091, upload-time = "2026-09-09T13:57:28.997Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/728e7ce05ac9c0303554e7162e74d91fe49e65bad7dfbb377f783dd32c0a/multidict-6.8.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8a5ac357ac283490a8d1899b0383355fd1f8634b14ba0d59e4c0dd97db85556", size = 266493, upload-time = "2026-09-09T13:57:31.256Z" }, + { url = "https://files.pythonhosted.org/packages/8f/74/7c658d2769863af16fb7d7c6be50b29659892a06a632858863eee3a31842/multidict-6.8.0-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:46029e6e27a3ec0dc55b53f58df82d10f04c5e111f78248279b530bedad2c30a", size = 245302, upload-time = "2026-09-09T13:57:33.464Z" }, + { url = "https://files.pythonhosted.org/packages/2d/2c/d4350a20a0e8c66a447d694e8713438262665203fe826c3f4e385f052b72/multidict-6.8.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:8d1046b5427dcafe6e8a0e07527dd74f1ee694006160162f53f3a17f15aad3b4", size = 261016, upload-time = "2026-09-09T13:57:35.651Z" }, + { url = "https://files.pythonhosted.org/packages/1f/78/83df999c8beb72a012cfac42f2b833c4a48f8e836fd4407747b355a2430e/multidict-6.8.0-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:f1f4a220db6ed7c8fd16b6d644ffd1f082651693204daf3275e049fadc849e39", size = 255021, upload-time = "2026-09-09T13:57:37.758Z" }, + { url = "https://files.pythonhosted.org/packages/fb/13/f2c0a2dac6d91f74aa124f3e9f07ec497ceae5ed2df2753d249601cd7262/multidict-6.8.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:029897732a9c798737457e382bf84e8c64237eff224a90aea2639f4413c45e4e", size = 263066, upload-time = "2026-09-09T13:57:39.897Z" }, + { url = "https://files.pythonhosted.org/packages/59/1d/730008d4639ace731bbb1399e1ac13cbdf506f7d6fb861d75044ffb3994d/multidict-6.8.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:29be9fd289e9ab8f480996ea2f686e1654b80242033843cb11691688329423f1", size = 266510, upload-time = "2026-09-09T13:57:42.39Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/bec67a5d206dc5748e50c93f6f71deec14305c3657cfe250c3887caf7839/multidict-6.8.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:29631224698de1e42abc8fa7658d830e0aed0029785144b5832b695da5adef2f", size = 239423, upload-time = "2026-09-09T13:57:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/9e/db/5f153fe51fbac7d80f3bb8bd6fab8db8b6cd061e7a11371676dfed3712bc/multidict-6.8.0-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:962f18c59a000f30b084ea2e6b8001521bb315efd4e5f10acf9fb36f366b7882", size = 266902, upload-time = "2026-09-09T13:57:46.297Z" }, + { url = "https://files.pythonhosted.org/packages/89/0f/9efca48a351551de4dc0c183f523109dbe87c645a4732d5f1c70b4880dca/multidict-6.8.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:c60e50bc5b07faac92fd3a20fa21cc8cf3e3f7204d2867b206c73293ebc19101", size = 260887, upload-time = "2026-09-09T13:57:48.268Z" }, + { url = "https://files.pythonhosted.org/packages/df/d8/bb879a62e0809448e53f6237e71670066ecf3bbc5896a7a6705b6628d86a/multidict-6.8.0-cp315-cp315t-win32.whl", hash = "sha256:fc5460940f50dff00731b4132366840ba9685286ea88ea104b661899084f3fea", size = 50533, upload-time = "2026-09-09T13:57:50.31Z" }, + { url = "https://files.pythonhosted.org/packages/fe/62/3e5308d8871636e4b9620e4b3acfcf2b5caf79b19d317690ec13f7fc8b57/multidict-6.8.0-cp315-cp315t-win_amd64.whl", hash = "sha256:b367c342327717d644db4c0ddb37ceb655c84822215ea0773a3a36911b74b71d", size = 55572, upload-time = "2026-09-09T13:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cc/d3c10e10ee3bb7a7b4abbb3157306b2ce7e0018c9c2d16b32b468739d2b7/multidict-6.8.0-cp315-cp315t-win_arm64.whl", hash = "sha256:0c1c4debad7337627b86837abdf0237ca3cb3d7e17de7eab0177c263878546d4", size = 50322, upload-time = "2026-09-09T13:57:54.099Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ee/be4e1a4b7a2b27f4fb6936510d4bebcb41b0562c946930ad26916e069cf9/multidict-6.8.0-py3-none-any.whl", hash = "sha256:75daa15ca16d6285eb2e104b2f05ee6f8d9836c68da3ce5c85f615a0450eed0e", size = 16297, upload-time = "2026-09-09T13:57:56.106Z" }, ] [[package]] @@ -2721,7 +2953,8 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", "python_full_version == '3.13.*'", - "python_full_version >= '3.11' and python_full_version < '3.13'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "(python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten') or (python_full_version == '3.11.*' and sys_platform == 'emscripten')", ] sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ @@ -2742,36 +2975,36 @@ wheels = [ [[package]] name = "nh3" -version = "0.3.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/1b/ef84624f14954d270f74060a19fc550dd4f06656399447569afb584d8c06/nh3-0.3.6.tar.gz", hash = "sha256:f3736c9dd3d1856f80cd031715b84ca75cda2bbb1ac802c3da26bfce590838d7", size = 24684, upload-time = "2026-06-22T00:47:02.008Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/99/3e/6506aa4f23dc7b7993a2d0a45dca3ce864ec48380adfe15a173e643c63e8/nh3-0.3.6-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2411e8c3cee81a1ddd62c2a5d50585c28aa5566d373ad1db92536b95ddb24ef2", size = 1421679, upload-time = "2026-06-22T00:46:20.248Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e1/e96e7864a7a53bd6b6fab7e9632467382a2a2c1f3fed951918ad131542fb/nh3-0.3.6-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e196fa70c2ff2eb4de7d3df3108f8f358c1d69dff20d45b11f20a5aa227ffb6d", size = 792570, upload-time = "2026-06-22T00:46:22.179Z" }, - { url = "https://files.pythonhosted.org/packages/59/62/5b6108bedaef2b2637fed04c87bdbcb5967b9961758b41f0e466ef22a022/nh3-0.3.6-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34d2b0d934156b87ee114f599a3ba9b8b9e17b5d79652ba3a13fa50903de965e", size = 842243, upload-time = "2026-06-22T00:46:23.801Z" }, - { url = "https://files.pythonhosted.org/packages/4b/4a/526f199626bfcb496bc01a268051b44737962005553b158e985ed7e64865/nh3-0.3.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2f14b7ae1fca99c4a66c981aac3974e7fbc1ca30a12673d223ae1df76680917", size = 1001468, upload-time = "2026-06-22T00:46:25.481Z" }, - { url = "https://files.pythonhosted.org/packages/49/09/0d8e3101636d9ad88cdefb2914e764cb8e876ebdbb4286bfc251277d9c67/nh3-0.3.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:889932a97fb4abb6f95fef1914c0d269ebfb60011e67121c1163059b9449dbb4", size = 1082933, upload-time = "2026-06-22T00:46:27.15Z" }, - { url = "https://files.pythonhosted.org/packages/09/a1/ea83abe738a3fbaa203dfdb836ca7cbab0e7e9609faaee4fe1d4652599c0/nh3-0.3.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:edb2b4a1a27523e6cc7c417f8d21ce3d005243548b93e56b762b66b0c7f589f9", size = 1043120, upload-time = "2026-06-22T00:46:28.89Z" }, - { url = "https://files.pythonhosted.org/packages/66/69/0654482b8635012fbae67826bd6c381abb05d841ac7388b9b4666300fdad/nh3-0.3.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:43bc1ed3fa0716295fabee29ba42b2667e4a51d140b0a68e092170a765474fa6", size = 1023824, upload-time = "2026-06-22T00:46:30.453Z" }, - { url = "https://files.pythonhosted.org/packages/ed/a6/1f7285ffadc8307c4dbeb08d21b920536d5117785056d1079e998c4dfa44/nh3-0.3.6-cp314-cp314t-win32.whl", hash = "sha256:597a8e843bea00b2eb5520658dc24a9bb032e7fc9e7c2c0c4cd29420220c9796", size = 599253, upload-time = "2026-06-22T00:46:32.072Z" }, - { url = "https://files.pythonhosted.org/packages/36/ea/5542f3c45da4c00290d9d67a65e996702e23e613c4b627de3e09cb9fe357/nh3-0.3.6-cp314-cp314t-win_amd64.whl", hash = "sha256:4713502748f564fee0633b37b3403783ce0a3af3a3d148ad91025a5bdadb7bc6", size = 612553, upload-time = "2026-06-22T00:46:33.53Z" }, - { url = "https://files.pythonhosted.org/packages/66/35/26bd47e6af5915a628281dccdac354ddf4e32f7397047894270acd8c9870/nh3-0.3.6-cp314-cp314t-win_arm64.whl", hash = "sha256:69bbb92865a693d909db3a700d3c01537533844d0948c1e9323561ce06ecda41", size = 595151, upload-time = "2026-06-22T00:46:34.878Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ab/a7653bce9a3b204be6a6931767a9e23595807bb84790ce6685e4d7e5bd08/nh3-0.3.6-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a43ebd7543555c3ac1bc353023d0794e75cb76f6f18f19c32e95441496c0cc25", size = 1443564, upload-time = "2026-06-22T00:46:36.66Z" }, - { url = "https://files.pythonhosted.org/packages/41/21/e1084ab18eb589506335c7c7576f2d4643e9a0c0e33983ef0e549a256b96/nh3-0.3.6-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1b160831c9cdb06a6c79c2f9cdb11386602938f9af260d1c457a85add4f6f69", size = 838002, upload-time = "2026-06-22T00:46:38.101Z" }, - { url = "https://files.pythonhosted.org/packages/b0/94/f48d08e6f72a406300fa11d8acd929fea1a80d4bf750fa292cb10785f126/nh3-0.3.6-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d14bf7982e7a77c0c775634c29c07ce08b38a046df73e1c1f139b3e82f18a38e", size = 823045, upload-time = "2026-06-22T00:46:39.495Z" }, - { url = "https://files.pythonhosted.org/packages/25/bb/431615ba1d1d3eb63cde0f974f2114edf863a8a3f6049a12fed23fc241d3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:44673b27010051ab5a5e438a86ec31bbda61d4a77d7e900af6b7be3037c1abae", size = 1093171, upload-time = "2026-06-22T00:46:41.21Z" }, - { url = "https://files.pythonhosted.org/packages/0e/24/a0d80182a18919665fefd19c1c06f1d1df1c9a6455d0252de40c034a0bc3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6b7beece07525dc6e6b0fc2f104442de2ba328360ad00e50cbe2e1fd620447d", size = 1049217, upload-time = "2026-06-22T00:46:42.804Z" }, - { url = "https://files.pythonhosted.org/packages/0a/13/6f1e302ca674ac74362e150848ad56a1be5145391204f74facdb8e94df12/nh3-0.3.6-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:455469a29951edc92bc48b47ac2281c3f2609e6c4f6a047056449f8c2c23facf", size = 917372, upload-time = "2026-06-22T00:46:44.495Z" }, - { url = "https://files.pythonhosted.org/packages/5b/67/314f6151bad77a93d751978a344033e1fc890822f05f0416079338e34231/nh3-0.3.6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:905f877dc66dd7aea4a76e54bcb26acb5ff8216f720c0017ccf63e0e6035698e", size = 806699, upload-time = "2026-06-22T00:46:45.99Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a6/bfaa00046e58603507dcfc266c4778e3ab7adf68a5dedd73b6274b8d9314/nh3-0.3.6-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:25c733bee928530556b1db0ea46c52cf5aa686146e38e60a6fc7cb801ef91cec", size = 835165, upload-time = "2026-06-22T00:46:47.617Z" }, - { url = "https://files.pythonhosted.org/packages/30/a8/fb2c38845efb703a9173bffdfc745fc64d2b0e55cfc73a3647d2f028250c/nh3-0.3.6-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f90d9a0cfdbee218994fdaaeeb5a0fde62d08f35e4eef0378ec1e2200172fd0", size = 858282, upload-time = "2026-06-22T00:46:49.276Z" }, - { url = "https://files.pythonhosted.org/packages/68/17/06e72a18ee9b572914447338237ca7eb164c0df901f141bc10d1282247a2/nh3-0.3.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:82ca5bf427ad1b216b65ede1a2e2d87dc49bec417ceba0f297213107d3cd9d78", size = 1014328, upload-time = "2026-06-22T00:46:51.026Z" }, - { url = "https://files.pythonhosted.org/packages/11/f9/3966c61455668c08853bf5e33b4bed93c421f3194ce4de896dc248d6f6ce/nh3-0.3.6-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f5ed5fe84aee7f39db95c214a7421bf0499fbf500fec6d86a4e29bfc37971438", size = 1098207, upload-time = "2026-06-22T00:46:52.674Z" }, - { url = "https://files.pythonhosted.org/packages/19/d3/479cb4ae440424825735d60525b53e3c77fd60fd6e6afc0e984f00eb0178/nh3-0.3.6-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:082675ff87b9385ec430ffe6d5847ba7456cc39b73720cd4add472f9f4cffd56", size = 1056961, upload-time = "2026-06-22T00:46:54.335Z" }, - { url = "https://files.pythonhosted.org/packages/17/0c/6cdb5ee1e127be50dc8391e54bddc1f64e87bf4bfad0c55633320e2e02db/nh3-0.3.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36d06341bd501240d320f5942481ed5e6846136b666e1ba4faf802b78ebc875f", size = 1033829, upload-time = "2026-06-22T00:46:56.258Z" }, - { url = "https://files.pythonhosted.org/packages/e9/55/9de666ad975d6ccd77d799ea0add55ee2347aa81286ce21b2a97c070746b/nh3-0.3.6-cp38-abi3-win32.whl", hash = "sha256:5276ef17bdba9ad8040575c74072008b13aae429436e9d0429e718bb5f90f4da", size = 609081, upload-time = "2026-06-22T00:46:57.665Z" }, - { url = "https://files.pythonhosted.org/packages/82/fa/2b5d684e3edf1e81bfd02d298c78c3e3da77ca1d8a2be3183a79544a7548/nh3-0.3.6-cp38-abi3-win_amd64.whl", hash = "sha256:f338ac7d594c067679f1e99b4f5ec3906842979560f9d8f15d6bdfa39a353b10", size = 624461, upload-time = "2026-06-22T00:46:59.163Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e5/7cafee2f0413ca4cb0ef3bd111e94d408a48810008b283ad8aee00dd1809/nh3-0.3.6-cp38-abi3-win_arm64.whl", hash = "sha256:69f365963f63a1e9bff53bdbb3c542c7c2efed3e163c9d5d83a772a2ac468c21", size = 603060, upload-time = "2026-06-22T00:47:00.596Z" }, +version = "0.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/2f/022b27146d52d24b1b353b003359134788ecbcd6fcdf6283adbd57c0fbc8/nh3-0.3.7.tar.gz", hash = "sha256:71860d01c16f4d8c72e334e0674beb2b0899dbd0bf760de18932ef4390303848", size = 25662, upload-time = "2026-08-23T14:26:30.728Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/88/b594f0e86856b37e182fb663283da419eea6424972506e640e890885467f/nh3-0.3.7-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:91a4dab4e94d9fc54b9f67b1adfb23e81fab7ab43f33c3b8c97be9aa38f789ba", size = 1471147, upload-time = "2026-08-23T14:25:55.259Z" }, + { url = "https://files.pythonhosted.org/packages/1e/60/847a21339f095c4d4c655af31fa2d18b174585bcc210709facacc7ce205c/nh3-0.3.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae64328e46a25785535afcb6885b6f182ecaf5ee8c88f8c075422db8aacc65b", size = 820463, upload-time = "2026-08-23T14:25:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7f/1a103e00aaf5e59f2dee4c2709aac609bb2d4bb74fddaf0dcfade11ed87b/nh3-0.3.7-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4968fe8d2db97c6f047659bf46a449fd8ec377f44ebf3e0a1b96c0d3a333ae32", size = 861456, upload-time = "2026-08-23T14:25:58.087Z" }, + { url = "https://files.pythonhosted.org/packages/d8/4a/e9c436089a0c80b928011ead0efd156aa7639a19b6064ef58dcedcab8369/nh3-0.3.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:be53a4825585f701955cb9baf49f478f56eb81e20294329fe4bc689dd5dd81fa", size = 1023930, upload-time = "2026-08-23T14:25:59.465Z" }, + { url = "https://files.pythonhosted.org/packages/04/5c/aa1468e3e281e78d2b3b7d762ccba59f681af355e971dbd255d5903f7b86/nh3-0.3.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:94fd6e59553fbb9ffd8ba71bbd5a54e3126ba01799a097ae30d5341d750bc6ac", size = 1102614, upload-time = "2026-08-23T14:26:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/57d186d9d3dd38905dc12dddb3484406cdf6aa0b1ce33639a2d277d4ee1c/nh3-0.3.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:18f4278ecd157d43cb35acd5aae9f35cfa79f546b4922bd86536adc0f6312102", size = 1059915, upload-time = "2026-08-23T14:26:02.388Z" }, + { url = "https://files.pythonhosted.org/packages/6b/53/097a5ad0b34b15d67a472ef849165a54209fa5fbd3e639801c6fe439ba28/nh3-0.3.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:808def0c8c07843e6e50dc84f532457bfa2cfd17417b219a5d9e7c773709331a", size = 1047402, upload-time = "2026-08-23T14:26:03.897Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/c57a2c70534418310889a65ccfac3525e62f0bc0a8613225903403755ce7/nh3-0.3.7-cp314-cp314t-win32.whl", hash = "sha256:874b7d67a067bd29a59223f6270fc30da4edd8e6d87fd219fc93bcbaa662c946", size = 619895, upload-time = "2026-08-23T14:26:05.105Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b7/efda1d0a611d940bdfde6893bde1ea6b7b7d48c31273aea48e35b822fd58/nh3-0.3.7-cp314-cp314t-win_amd64.whl", hash = "sha256:614dac4a4c36ad084e78447d16fe898dedd762e354a7ab9cda2984e82f67883d", size = 633456, upload-time = "2026-08-23T14:26:06.661Z" }, + { url = "https://files.pythonhosted.org/packages/1d/18/3ab564595cb88196f50d26e163ed0fd2acc731ab26ac615df91981885887/nh3-0.3.7-cp314-cp314t-win_arm64.whl", hash = "sha256:157ec1eb7a62f3d9a7badb8d82d89aa810e3e24e097eedfa481a25d0c8a99877", size = 611003, upload-time = "2026-08-23T14:26:07.813Z" }, + { url = "https://files.pythonhosted.org/packages/94/0d/c257754bf57f829f307aa226bbe136d3a1356b5a0d08324c7b6bd2a8aacd/nh3-0.3.7-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6c3aa50eb26e9228238271db9f983cbc3b006dfbfeca2d4dc34c33ddc6ac5ea5", size = 1493959, upload-time = "2026-08-23T14:26:09.025Z" }, + { url = "https://files.pythonhosted.org/packages/07/42/a687e7091928806e514f89fa2666f25ec9bfe0a902fc4402b25e51ce408b/nh3-0.3.7-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f266d3f1b3647449923a8e406524632220dd5d8b647078dfe45b885d33d10479", size = 859615, upload-time = "2026-08-23T14:26:10.606Z" }, + { url = "https://files.pythonhosted.org/packages/85/05/b0e6bef633549a23347d5462aa288fcc42381e7918482062ca3cb456242a/nh3-0.3.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8fd1ab205258b29254f72db377d99e2c96aa7653ef3b015ccab0420b094b506", size = 839872, upload-time = "2026-08-23T14:26:12.037Z" }, + { url = "https://files.pythonhosted.org/packages/17/40/2a0921d45b20828708bcb56887e47dcf8cae13818de5bf9a01308d348712/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:19f288c938ec6eef1f5d2c6cab47838e71fef8097e1c1233802be5a6230ba086", size = 1091325, upload-time = "2026-08-23T14:26:13.34Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d1/9d70e0e418a48280ec0ddc6c1b08b4b1136ebcc31a1625e57ff5c665fa51/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de2b2aab32ea303405debefdcfc58043d3e635fa3f67b9eb140d2b0e0c0d2563", size = 1042482, upload-time = "2026-08-23T14:26:14.667Z" }, + { url = "https://files.pythonhosted.org/packages/93/a7/02dd159d4e71f98607d8d4249cddb7561e77be1a8e4dec77d76e1b68fc99/nh3-0.3.7-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7279d43323a25225df23576af6594a16693f61431170848b8b2ac21ad4f174", size = 946868, upload-time = "2026-08-23T14:26:16.094Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ed/c5510c615dce55b6fcc364aa1838142f938beed64f5e4927490dfcaf4405/nh3-0.3.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70f5ac8626e899a4bab0ef74ca2f5bd602f49c7b739e6e5026b4afc6d63dac42", size = 832161, upload-time = "2026-08-23T14:26:17.272Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e3/3212c1a5b5745245d7f18885207bbddb34c56075f34dd682bd539aad55cc/nh3-0.3.7-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:5ffdfcb9a686ffb12765376bcfb6b5b55728516d3c0ee317d29982381ded3df8", size = 849791, upload-time = "2026-08-23T14:26:18.498Z" }, + { url = "https://files.pythonhosted.org/packages/20/64/9e36594efad6c290de4240d02cb2bd80c339a4ab1c4de66e599ffa6d9d81/nh3-0.3.7-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bc42bb1193c1e28a1e74c2cabaca178e118a7103e8832699fef8a2b3e2496493", size = 875473, upload-time = "2026-08-23T14:26:19.908Z" }, + { url = "https://files.pythonhosted.org/packages/00/0c/1a8985fd43fea5530c0ac890b6f0b423770ee72f111b70b7a77f2dec243a/nh3-0.3.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d56e76bd3cadb09b6b0cef364850811663734b348a25f5f587a2819c495367bd", size = 1036463, upload-time = "2026-08-23T14:26:21.536Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5d/891e533b716cf00df76ad0ba6485dcfd14d59a6430a3cc99057c4c04004e/nh3-0.3.7-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fd4a70efb45d5372174f718878eb7a35c12677626a63b2f103b23b833457dcac", size = 1116029, upload-time = "2026-08-23T14:26:22.907Z" }, + { url = "https://files.pythonhosted.org/packages/42/e5/ae8c0782fce74fb6fcf7234bb3d4017f37ce181b4f9d29369eab21c50a04/nh3-0.3.7-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:15f5fbf090f5c88d61c820e1fc1fceecb6520cca9fe85649c06b57ef9dc9ff62", size = 1076589, upload-time = "2026-08-23T14:26:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/26/a4/c3423351e8d864ad756e85e15f0c01433361f14d34e4ed156482c0518f2a/nh3-0.3.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6698a822132beedab80f131c08d8d0ac5a178ddeb488d02ca4b67716ecfac7af", size = 1058871, upload-time = "2026-08-23T14:26:25.674Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6a/478f153f1d7c0baaa3d1e8bb5fdcee3a6235f90fe44ea969a9d4e2b8c47a/nh3-0.3.7-cp38-abi3-win32.whl", hash = "sha256:6e4280115d44c3b278eef712a86748c1a723105cd79feec46952383117ab4e59", size = 630729, upload-time = "2026-08-23T14:26:26.932Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b9/34433ccb1f0fe6968dabbb7d4bf5721c6221878ef07832748c06655a6a80/nh3-0.3.7-cp38-abi3-win_amd64.whl", hash = "sha256:618e3059caf41ccdf5dcccb3fa9df4cf6e4efe23d1382a8bbfca272a8a4f8bfc", size = 644462, upload-time = "2026-08-23T14:26:28.294Z" }, + { url = "https://files.pythonhosted.org/packages/f9/70/e140dffff6e808dc6343598df76e7e2407fd0f581de3524c75fba2e0cf24/nh3-0.3.7-cp38-abi3-win_arm64.whl", hash = "sha256:f04b7d333b27f13ca439da3cf1c75c2fba34f104969f6ce4ac8e7079699c2f4a", size = 621867, upload-time = "2026-08-23T14:26:29.547Z" }, ] [[package]] @@ -2785,23 +3018,23 @@ wheels = [ [[package]] name = "nodejs-wheel-binaries" -version = "24.16.0" +version = "24.19.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/22/2a5beb4e21417c73233d9f65cf6f3e96e891b80d2f550a8f630ebc6b88c6/nodejs_wheel_binaries-24.16.0.tar.gz", hash = "sha256:c973cb69dc5fd16e6f6dc6e579e2c3d5534e2a1f57619dddf5ba070efa7dde37", size = 8056, upload-time = "2026-05-30T16:52:09.807Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/76/7e97195e14346598565a0de4ca8bdbd5e634b3fb5b1ba590b7b1b89f8a63/nodejs_wheel_binaries-24.19.0.tar.gz", hash = "sha256:db217eef8cab8551667863379b08db4d9067403f6cbbe87481eb40edceb8aa9b", size = 8058, upload-time = "2026-08-19T21:47:19.671Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/d1/68b43b53cd0fa83ae6fd406705023ca988d9e0ca41c724d82e66fbeb2ef6/nodejs_wheel_binaries-24.16.0-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:d9f8f677dcf30e37ac244f07869726abe043f01eb0f45722b1df31cc2af7093c", size = 55666374, upload-time = "2026-05-30T16:51:39.588Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b2/40a989159599080da485de966c4c2d207e852ac7aa7864702626d96c8bf5/nodejs_wheel_binaries-24.16.0-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:3d0370fe7120ce9697a4f60d40480d2bd8808d9f30131458d5afc0040d4e5a51", size = 55838487, upload-time = "2026-05-30T16:51:43.383Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a7/cd42174fb5ff6faff7fa8d326a18914d8f232098ab5de055b57c16fa13ca/nodejs_wheel_binaries-24.16.0-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:85dc92bbb79c851569c5925dcc2a4c915a034efab375f99e4e7e6bbe9cca8342", size = 60179540, upload-time = "2026-05-30T16:51:47.036Z" }, - { url = "https://files.pythonhosted.org/packages/2b/95/c8a1f9ae140aa28df8744d984d01d4b3af7cdd6555af12127f40ceb45a7d/nodejs_wheel_binaries-24.16.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:2f3036292811514ba847b3708492644764f88a833ac425c5f55007014308ddfd", size = 60716262, upload-time = "2026-05-30T16:51:50.711Z" }, - { url = "https://files.pythonhosted.org/packages/64/c9/7c35b3737f59e36d0249c265397b7bff570519b95301d6e16ea361e904ad/nodejs_wheel_binaries-24.16.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:db8a8a76ebd2b28ecbfc9ad464baa3707241b9e050a30e2efdf6f60c0f886502", size = 62230592, upload-time = "2026-05-30T16:51:55Z" }, - { url = "https://files.pythonhosted.org/packages/04/96/d931255cf9d11a84d6b54d882dba7434646467d568ccf070ea3418638df3/nodejs_wheel_binaries-24.16.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f1a3d8f7b4491cbbd023ba3fc4e901fcca2d9fb80d57f24ba3890de8b1dbac03", size = 62841759, upload-time = "2026-05-30T16:51:59.407Z" }, - { url = "https://files.pythonhosted.org/packages/a2/7b/8b7a3f41bc255411be30b6d7d288aab8ffd9ea2055db8555ced3548007b9/nodejs_wheel_binaries-24.16.0-py2.py3-none-win_amd64.whl", hash = "sha256:bb136be9944f0662dcf1120f45193a6b75b13fac378971a95cc42c9f879a81aa", size = 42027734, upload-time = "2026-05-30T16:52:03.348Z" }, - { url = "https://files.pythonhosted.org/packages/17/66/1ed71f1f529b8ca727d42c7ceb9db0bef145ce4a13dfc86fb50aa44f3be6/nodejs_wheel_binaries-24.16.0-py2.py3-none-win_arm64.whl", hash = "sha256:8308940b5edd0a50dc5267ea36ba21c9f668e83fe0d9f293937174d3a7e31c36", size = 39714528, upload-time = "2026-05-30T16:52:06.421Z" }, + { url = "https://files.pythonhosted.org/packages/8c/52/0774b52c7be8151ad9d5aff44edc100c3f13d6d8eb3765f63ffa40e69fe8/nodejs_wheel_binaries-24.19.0-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:e12cbfd69089504e42fb14194ce734a9dcf3eb38c820ca63dd511d36fb964e9c", size = 56047203, upload-time = "2026-08-19T21:46:43.448Z" }, + { url = "https://files.pythonhosted.org/packages/67/3a/4fdbbfecf2c23d52c0e3f68de7f7c1b3c97a26d328c69c5f6c49c48e340e/nodejs_wheel_binaries-24.19.0-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:1c890adf4b7e6556ccc1ca66c866bb81884b6c9a581dee4e530dc7f78fb9d514", size = 56219459, upload-time = "2026-08-19T21:46:48.45Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a8/0147149415195c59b8a72a594916bfb80d6be4d586f9fbfda313889e0efc/nodejs_wheel_binaries-24.19.0-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:4e029dadfae1295876063c96b236f673487e8c27379fe146c1e2250283520227", size = 60588256, upload-time = "2026-08-19T21:46:53.298Z" }, + { url = "https://files.pythonhosted.org/packages/f4/89/6631d0982353da1bb7bc00bb1988f702822c62b42634f57999ee53b5c337/nodejs_wheel_binaries-24.19.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:4196a947bcc883f2003ab101762d729f3e99b5e86b75bd09151563403e2eceb8", size = 61123607, upload-time = "2026-08-19T21:46:58.117Z" }, + { url = "https://files.pythonhosted.org/packages/32/a2/fa30f0841e4602995782e124359f9b910c7b481d98decf61ef0b2fc3ebfb/nodejs_wheel_binaries-24.19.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:352e048ab4dd35e7de5f338d1cc4fcbf77a0e93da30bf7336a8217ee246b31d7", size = 62632842, upload-time = "2026-08-19T21:47:03.42Z" }, + { url = "https://files.pythonhosted.org/packages/18/01/22d97ca72213f66cc386ee638db30c2e62757fdf761c6029074bced83d1c/nodejs_wheel_binaries-24.19.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:28d078b2ced9e2069516e652dc4b1380e7a1a7f2d3934eccd1611586d283ba4c", size = 63250653, upload-time = "2026-08-19T21:47:07.938Z" }, + { url = "https://files.pythonhosted.org/packages/88/d1/e3be8fa327a795bcaf7a19cd84299e338a7bce32ff0665fdce9cfa22573c/nodejs_wheel_binaries-24.19.0-py2.py3-none-win_amd64.whl", hash = "sha256:67e3abeb9c3830cae8c8487ae8a2af7cc27dfa75af06145cee5ca7d1857c81bd", size = 42448503, upload-time = "2026-08-19T21:47:12.093Z" }, + { url = "https://files.pythonhosted.org/packages/1d/37/34cf28ba1691a060174948a9927fe61091982d6048b2e403071a9acce443/nodejs_wheel_binaries-24.19.0-py2.py3-none-win_arm64.whl", hash = "sha256:d9074c665ea68b04e183d82482c86dc907d3a9bd15eb6cf85542cb785266bb36", size = 40090155, upload-time = "2026-08-19T21:47:16.032Z" }, ] [[package]] name = "openai" -version = "2.45.0" +version = "2.54.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2813,9 +3046,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/60/d4219875289b11d2c2f7da93c36283da224a2e55865ed865ab64e0ce9217/openai-2.45.0.tar.gz", hash = "sha256:10d34ca9c5643bce775852fddbfc172505cb1d4de1ccd101696c3ecff358765d", size = 1109653, upload-time = "2026-07-09T18:02:44.091Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/9a/8c75e8c8a5b407a0586faeb2afac91674ff955c191ecc1d6d3b6669f6788/openai-2.54.0.tar.gz", hash = "sha256:e3e6f8bc1ba30ddf381ace1a14340eed381cb984a1a59bd0f34b5be3b5d49cfa", size = 1100285, upload-time = "2026-08-11T18:46:59.035Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/b0/2291689e3ec4723fbf5bbf3b54afcd7b160f9ddc98ca7aedfd0132af5677/openai-2.45.0-py3-none-any.whl", hash = "sha256:5df105f5f8c9b711fcb9d06d2d3888cebc82506db216484c14a4e53cdf651777", size = 1629470, upload-time = "2026-07-09T18:02:42.21Z" }, + { url = "https://files.pythonhosted.org/packages/64/a8/bb76c7356de8ad57f59d5ff993d434df0607f07f08bcc9c9a5c275e399c0/openai-2.54.0-py3-none-any.whl", hash = "sha256:89089789197ccdb87f173a03145ed1598d00795220c93e96cf712b1cbf5e5f2b", size = 1660351, upload-time = "2026-08-11T18:46:56.684Z" }, ] [[package]] @@ -2877,7 +3110,7 @@ wheels = [ [[package]] name = "openinference-instrumentation" -version = "0.1.54" +version = "0.1.65" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openinference-semantic-conventions" }, @@ -2885,14 +3118,14 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/cc/62c1175ee7edc2cbdf95b5b73e0b0f305e759d407bf1bc353ff30a763365/openinference_instrumentation-0.1.54.tar.gz", hash = "sha256:9af9817bb38816ed32856fb4cd813c1a5d9f530ab589c3473b37e06cf406ab28", size = 33938, upload-time = "2026-06-30T19:23:15.648Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/42/b0898f2d1663b63d7b9ec565428bfc28593230703a19b16cf3071734fd0d/openinference_instrumentation-0.1.65.tar.gz", hash = "sha256:23022c090780d3470a08f2450e5eee0e89b0fe3a8f2f65c9cd6baefaceff7786", size = 43902, upload-time = "2026-09-15T16:34:42.87Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/e3/c7aa7bb4845e0cfdf477ff87f9a3ec0cd2aa55a34a9f31be84d724cabbb7/openinference_instrumentation-0.1.54-py3-none-any.whl", hash = "sha256:8bc991865c90c804ac9983ef93aa6081a7a2397dd113d3d38b5465cca17892bb", size = 41197, upload-time = "2026-06-30T19:23:14.315Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2d/f1d99d17b9b9cb58cb3bc411bd03c517a605deaea93c8bc2fdc1fe223337/openinference_instrumentation-0.1.65-py3-none-any.whl", hash = "sha256:cb620740efe899e84b23c49ddbd6c9c8522a83992c57a23f4f5380932c9cded9", size = 51640, upload-time = "2026-09-15T16:34:41.301Z" }, ] [[package]] name = "openinference-instrumentation-google-adk" -version = "0.1.17" +version = "0.1.28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openinference-instrumentation" }, @@ -2903,14 +3136,14 @@ dependencies = [ { name = "typing-extensions" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/c2/8400125398ac568efe49bc8a9411a4c860b27112279d52d2bb8acbc70126/openinference_instrumentation_google_adk-0.1.17.tar.gz", hash = "sha256:8235d2cf3fce5edaf213136fbd00e876db183add362b2edede87cd42b21ab112", size = 14844, upload-time = "2026-07-01T15:44:19.524Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/a3/4792b4daf0eb74c64a2f9fbb1a7ad0a750fc504c93b429a4d33760865893/openinference_instrumentation_google_adk-0.1.28.tar.gz", hash = "sha256:7729d852fd1bb23bb38465599681c03e6cf39b9f014fbc9da2d8ef0bdbd66f5b", size = 19079, upload-time = "2026-09-15T04:52:21.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/c0/b0c301a0a1de9fe377e666e89b9e87fa368bd5ac1341ab125624e2bbc081/openinference_instrumentation_google_adk-0.1.17-py3-none-any.whl", hash = "sha256:3f45e38cfd5ffb41c18deddc747e48c68595d4dfa1a89b7b1aa1f3d31e46ce0d", size = 16755, upload-time = "2026-07-01T15:44:18.364Z" }, + { url = "https://files.pythonhosted.org/packages/34/e3/c9ce7f564e3fe5b185ad0bdb84e6eea07e919590e9b3149979421ad094a6/openinference_instrumentation_google_adk-0.1.28-py3-none-any.whl", hash = "sha256:baede62c35d49547f0b074fd3a5d1c062434d928b7d5dca98d9b9ca1ed8d0519", size = 21278, upload-time = "2026-09-15T04:52:20.774Z" }, ] [[package]] name = "openinference-instrumentation-openai-agents" -version = "1.6.1" +version = "2.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openinference-instrumentation" }, @@ -2921,47 +3154,47 @@ dependencies = [ { name = "typing-extensions" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/6f/281a267b837d33505c8b4ef70644b8ebfeb7ed902a909200333916185851/openinference_instrumentation_openai_agents-1.6.1.tar.gz", hash = "sha256:39b211b7ff28d59a401b2659f3885f967fb3e17580b29b4b4aedac6b8fc98e0e", size = 26089, upload-time = "2026-06-05T19:54:22.737Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/1a/5493d664baf3893f68c3441b5e7291c2f027f63d3d5d4f58e28389529419/openinference_instrumentation_openai_agents-2.4.1.tar.gz", hash = "sha256:4bcfe61d39ba914b510832096af7030472fbac0df66854bd116f60f67642adee", size = 35334, upload-time = "2026-09-10T05:43:20.312Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/54/c3d4e67bdad5170e315bb03086f034d2a60ccb26c4200010428456c9f4d6/openinference_instrumentation_openai_agents-1.6.1-py3-none-any.whl", hash = "sha256:ca5dc650fc53461cbce0f8f19bfa78d43de605c439a9d3c44d99fd0b6e10e3ba", size = 28466, upload-time = "2026-06-05T19:54:21.48Z" }, + { url = "https://files.pythonhosted.org/packages/79/08/65ea6e5dd68ba810e33a5c60673764efa65ddb5409807862acb5b3a2504a/openinference_instrumentation_openai_agents-2.4.1-py3-none-any.whl", hash = "sha256:c43857c9738bc785ab482d91644e0dde5be9275e3038a2000b85b3a8e1d38237", size = 38508, upload-time = "2026-09-10T05:43:18.828Z" }, ] [[package]] name = "openinference-semantic-conventions" -version = "0.1.30" +version = "0.1.38" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2c/51/8ba1182ee86fc79793d5ff2d11e7fdcda10ded2d01f3e46ca6fcf0568213/openinference_semantic_conventions-0.1.30.tar.gz", hash = "sha256:81fece76e09c83789e35c393b8b30523481eeabf1008745b955631a53e3221d9", size = 13391, upload-time = "2026-05-22T21:10:44.065Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/a8/b2094f8fb53d9b76c9772e9117c04c13fb089e54cd0f5cdc4e91975410db/openinference_semantic_conventions-0.1.38.tar.gz", hash = "sha256:612b41645c7591f2f6cc0ee9cead94cba395d7cfc5bc9759abb2de6d0cf998d3", size = 14573, upload-time = "2026-09-15T04:52:30.296Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/76/5b7e78cf0de38589b821bbe8e9c29c59a6e76edfb980488d0854cbb90f7c/openinference_semantic_conventions-0.1.30-py3-none-any.whl", hash = "sha256:36d946d3f95f699b7c4b12324ae9c1f02d6c7750df11eece56aa159cff430b3d", size = 10911, upload-time = "2026-05-22T21:10:43.04Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/4c4dd2575ce3975b727c6349d26370863b4c8e2dfe83cc3d07fdcd7ff3f6/openinference_semantic_conventions-0.1.38-py3-none-any.whl", hash = "sha256:b747b9eae63c3075edb90f632f52f93b8afed62548519951fbb80253865c53f7", size = 11691, upload-time = "2026-09-15T04:52:29.002Z" }, ] [[package]] name = "opentelemetry-api" -version = "1.42.1" +version = "1.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/1c/125e1c936c0873796771b7f04f6c93b9f1bf5d424cea90fda94a99f61da8/opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716", size = 72296, upload-time = "2026-05-21T16:32:49.335Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/cc/e4c9584181f86494df0f6bdec1a4f3280c50db44704dc2a407e994fc87bb/opentelemetry_api-1.43.0.tar.gz", hash = "sha256:107d0d03857ea8fc7c5fcbbbd83f800c281f0d560553d61c1d675fccfd1761c1", size = 73476, upload-time = "2026-06-24T15:19:55.323Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/ca/9520cc1f3dfbbd03ac5903bbf55833e257bc64b1cf30fa8b0d6df374d821/opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714", size = 61311, upload-time = "2026-05-21T16:32:28.822Z" }, + { url = "https://files.pythonhosted.org/packages/17/83/6dba32b85f31868400440dc7ad2ca1eab94cbbf3a7b0459ed39f8311a9e2/opentelemetry_api-1.43.0-py3-none-any.whl", hash = "sha256:20acf45e9b21851926835292e4045d290acade1edd2ff3de86d2f069687ba1fd", size = 61912, upload-time = "2026-06-24T15:19:35.434Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.42.1" +version = "1.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0e/9c/216acfeaedadf2e1937f4373929b20f73197c5c4a2546d4f584b7fa63813/opentelemetry_exporter_otlp_proto_common-1.42.1.tar.gz", hash = "sha256:04f1f01fb597c4249dfcd7f8b861c902c2102369d376d9d346ff38de4469a2ee", size = 21433, upload-time = "2026-05-21T16:32:55.526Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/c1/e8098490ab15abf116dcaf9fa89ededcb35547c7d08d4b5a62f573dc1e63/opentelemetry_exporter_otlp_proto_common-1.43.0.tar.gz", hash = "sha256:c4e32ba6d6b13bdb2b8f6764c4fd28d00192826561aa04f6d14eedfce7ac076f", size = 20197, upload-time = "2026-06-24T15:20:00.247Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/43/2375e7612e1121a4518c17603b6e0b03ad94f565aafad53f464dc5be2bf6/opentelemetry_exporter_otlp_proto_common-1.42.1-py3-none-any.whl", hash = "sha256:f48d395ab815b444da118868977e9798ea354c25737d5cf39578ae894011c140", size = 17327, upload-time = "2026-05-21T16:32:33.387Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b2/41ebc74ae1d5859901f1b69305de58724bf043381103d6ef413521cbc35a/opentelemetry_exporter_otlp_proto_common-1.43.0-py3-none-any.whl", hash = "sha256:123c3f9cc87218562490c63b36f497bf3a722faf174a515d1443f31ababa6264", size = 17048, upload-time = "2026-06-24T15:19:41.264Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.42.1" +version = "1.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, @@ -2972,14 +3205,14 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/87/ca7fc790dfdbcf4f9e9aab14a39ef1b7508ead13707e283de0b3131478d2/opentelemetry_exporter_otlp_proto_grpc-1.42.1.tar.gz", hash = "sha256:975c4461f167dd8ed8857d68d3b6b25f3d272eab896f6a9470d0f5b90e2faf15", size = 27140, upload-time = "2026-05-21T16:32:56.162Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/1d/6336453716ca0a240d4417d19e6d5b77a5e7163e5670ec4f7ec4d3ede7bf/opentelemetry_exporter_otlp_proto_grpc-1.43.0.tar.gz", hash = "sha256:1b3e0627daa9bc21884d4a13946807c255eb558bfe5bdd543dffb6f4c9faee0d", size = 27213, upload-time = "2026-06-24T15:20:00.907Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/2b/28ba5b128f47fe8c3bab541000d6feb4b5a9bd26623ca013406f01c0fb60/opentelemetry_exporter_otlp_proto_grpc-1.42.1-py3-none-any.whl", hash = "sha256:0ae1177e2038b18a929b3098215243631ef91136cba26b7e2b12790ceb7e87cc", size = 19617, upload-time = "2026-05-21T16:32:34.278Z" }, + { url = "https://files.pythonhosted.org/packages/6d/74/2700b5d5c946bf2dba87073fce3dfc198c46bc92ea3d5693f54bc51c90b1/opentelemetry_exporter_otlp_proto_grpc-1.43.0-py3-none-any.whl", hash = "sha256:6a10d1feacffffda19acacbf277b736094b1e2f4dbb98c90ccb2c6e1962e2ec6", size = 19626, upload-time = "2026-06-24T15:19:42.233Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.63b1" +version = "0.64b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -2987,49 +3220,49 @@ dependencies = [ { name = "packaging" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/6d/4de72d97ff54db1ed270c7a59c9b904b917c0ac7af429c086c388b824ddb/opentelemetry_instrumentation-0.63b1.tar.gz", hash = "sha256:32368d6ae52c8de20aa790a6ad86b10a76f09956092337ae37d675773990e541", size = 41081, upload-time = "2026-05-21T16:36:14.206Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/97/02fe6e1c8b1ffac42d0b429c18080edb24e0e0d18c86612edf72b5752382/opentelemetry_instrumentation-0.64b0.tar.gz", hash = "sha256:b47d528dead6271d7743114417eb67fc915bd9258111c48dbf9a4951d2efa88d", size = 41935, upload-time = "2026-06-24T15:19:12.951Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/a1/9314e621c143e4d82a5bf7a43c2ff7a745d31023506336857607c8c543cc/opentelemetry_instrumentation-0.63b1-py3-none-any.whl", hash = "sha256:f1986716d52cc316ea5f60189098726a9071d8ecc0eee96c9ed110be08bade9c", size = 35577, upload-time = "2026-05-21T16:34:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/d2/0c/cb9fe342de5299c7af24582eb7d788661cc53a1c4b904da92309caaa9417/opentelemetry_instrumentation-0.64b0-py3-none-any.whl", hash = "sha256:133ab7ffca796557aec059bf6be3190a34b6dea987f25be3d9409e230cbdad8b", size = 35880, upload-time = "2026-06-24T15:18:17.277Z" }, ] [[package]] name = "opentelemetry-instrumentation-threading" -version = "0.63b1" +version = "0.64b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/90/7b0279192fab614d57af3d57584ef7ac9e38fa3df0b1d412224f6f55a85b/opentelemetry_instrumentation_threading-0.63b1.tar.gz", hash = "sha256:afa8c2cada8ed136f07b04dc8739bc861a15e9a5edea1a65e4c5e1919c62946c", size = 9080, upload-time = "2026-05-21T16:36:49.977Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/ef/d4a16eb4a0f0971e351ec2ff95846b501b66a619d07d90822942d70a3adc/opentelemetry_instrumentation_threading-0.64b0.tar.gz", hash = "sha256:0a07d7329f69dfae5036a7cb184f502c8b91cb0538012f5304bd32ffe9ade451", size = 9080, upload-time = "2026-06-24T15:19:43.22Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/3d/3a991a4fcdf5ac82c04215e38cea4e73ad63713707014f9a70d1ab257f5f/opentelemetry_instrumentation_threading-0.63b1-py3-none-any.whl", hash = "sha256:33059298e68c94b13c38b562ad28799ec16a2fd06182ebfc762bb4e956e55d94", size = 8486, upload-time = "2026-05-21T16:35:58.084Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b3/8838d5f3db35b3854516ccfbf8ec26138d40388d828407182c890c3aa9d0/opentelemetry_instrumentation_threading-0.64b0-py3-none-any.whl", hash = "sha256:a285ffa750a958f7d368e947f5679a0214d588242cbffba0f5934cb02e9a17f4", size = 8487, upload-time = "2026-06-24T15:19:00.813Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.42.1" +version = "1.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/55/63eac3e1089b768ba014091fdd2ae8a9a440c821ef5e2b786909c94c8836/opentelemetry_proto-1.42.1.tar.gz", hash = "sha256:c6a51e6b4f05ae63565f3a113217f3d2bfaec68f78c02d7a6c85f9010d1cfca6", size = 45839, upload-time = "2026-05-21T16:33:03.937Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/b9/d357faefb40bda1d4799913e6af611171ff22a2dedcb93576bc92242d056/opentelemetry_proto-1.43.0.tar.gz", hash = "sha256:224778df17e1f3fafeaaa21d874236ca5f6ffc2f86e0899298ec7351aac27924", size = 46481, upload-time = "2026-06-24T15:20:07.625Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/9d/171c02c84a76940b7e601805b3bb536985aded9168fbcc9ba52f0a730fa2/opentelemetry_proto-1.42.1-py3-none-any.whl", hash = "sha256:dedb74cba2886c59c7789b227a7a670613025a07489040050aedff6e5c0fb43c", size = 71782, upload-time = "2026-05-21T16:32:44.867Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a7/3e5308cf548b8f72529c7db1afdb3a404211982376a12927fd7759f77bf3/opentelemetry_proto-1.43.0-py3-none-any.whl", hash = "sha256:c58f1f7ef84bc7dc2834016c0c37fe0081dde7ca9f6339be1970fbf9cdaaa90d", size = 72489, upload-time = "2026-06-24T15:19:51.164Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.42.1" +version = "1.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/f7/b390bd9bfd703bf98a68fea1f27786c6872331fd617164a54b8a59bdc008/opentelemetry_sdk-1.42.1.tar.gz", hash = "sha256:8c834e8f8c9ba4171d4ec843d0cb8a67e4c7394d3f9e9297e582cbd9456ddbf7", size = 239262, upload-time = "2026-05-21T16:33:04.641Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/eb/5041074274ac0956b03637cc039d434569112468e875eddfcc9a0674ce06/opentelemetry_sdk-1.43.0.tar.gz", hash = "sha256:d8187c81c162df9913e4003dd6485f7390d9a24fc17026ec7387b8b8218b08e9", size = 254744, upload-time = "2026-06-24T15:20:08.467Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/6b/4287766cfbde577ae2272e8884abac325aeaac0d64f41c61d5b8cc595105/opentelemetry_sdk-1.42.1-py3-none-any.whl", hash = "sha256:083cd4bbfaa5aa7b5a9e552430d9951219967cfb27aa61feb13a77aba1fc839d", size = 170907, upload-time = "2026-05-21T16:32:45.894Z" }, + { url = "https://files.pythonhosted.org/packages/49/e3/b17be23af124201c9f52eececd4cc8ddfed1597d37b4ee771895d325805c/opentelemetry_sdk-1.43.0-py3-none-any.whl", hash = "sha256:d1323a547c1ce69d6a069a17a44b7da82bb8b332051ecb074041f87642c86823", size = 178852, upload-time = "2026-06-24T15:19:52.169Z" }, ] [[package]] @@ -3046,96 +3279,87 @@ wheels = [ [[package]] name = "opentelemetry-semantic-conventions" -version = "0.63b1" +version = "0.64b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/99/4d7dd6df64795951413ce6e815f8cf1eb191daf7196ae86574589643d5f3/opentelemetry_semantic_conventions-0.63b1.tar.gz", hash = "sha256:3daf963611334b365e98a57438183eb012d3bfb40b2d931a9af613476b8701a9", size = 148340, upload-time = "2026-05-21T16:33:05.455Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/30/5f26df29509eccd86b99b481ac9ffa39da49ba9577cc69071c552ae30447/opentelemetry_semantic_conventions-0.64b0.tar.gz", hash = "sha256:72f76fb2d1582d9d033dd1fcd84532e961e6ff3d90d24ba6fabc72975a83864c", size = 148340, upload-time = "2026-06-24T15:20:09.267Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/7a/7fe66f5f3682b1dd47d88cc4e11f1c6c0966b737de2d16671146e23c39a5/opentelemetry_semantic_conventions-0.63b1-py3-none-any.whl", hash = "sha256:dfe5ef4dee82586b746f522b818ceb298d00b3d59f660042bd79404bff8d0682", size = 203713, upload-time = "2026-05-21T16:32:47.016Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ca/23ba87a221b574a7c5a99d48849d80bfe8b047624681357e2b002e566187/opentelemetry_semantic_conventions-0.64b0-py3-none-any.whl", hash = "sha256:ea77e85e354b8f604ddbe5f3d9135216f982fa4d77e5859ac30f6d8a50505aa6", size = 203713, upload-time = "2026-06-24T15:19:53.339Z" }, ] [[package]] name = "orjson" -version = "3.11.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163, upload-time = "2026-05-06T15:11:08.309Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/5d/b95ca542a001135cc250a49370f282f578c8f4e46cc8617d73775297eea8/orjson-3.11.9-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:135869ef917b8704ea0a94e01620e0c05021c15c52036e4663baffe75e72f8ce", size = 228986, upload-time = "2026-05-06T15:09:14.765Z" }, - { url = "https://files.pythonhosted.org/packages/80/01/be33fbff646e22f93398429ea645f20d2097aea1a6cdc1e6628e70125f83/orjson-3.11.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115ab5f5f4a0f203cc2a5f0fb09aee503a3f771aa08392949ab5ca230c4fbdbd", size = 132558, upload-time = "2026-05-06T15:09:17.431Z" }, - { url = "https://files.pythonhosted.org/packages/4e/61/73d49333bba660a075daccca10970dc6409ce1cf42ae4046646a19468aad/orjson-3.11.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4da3c38a2083ca4aaf9c2a36776cce3e9328e6647b10d118948f3cfb4913ffe4", size = 128213, upload-time = "2026-05-06T15:09:18.719Z" }, - { url = "https://files.pythonhosted.org/packages/1f/7d/30e844b3dac3f74aed66b1f984daf9db3c98c0328c03d965a9e8dc06449e/orjson-3.11.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53b50b0e14084b8f7e29c5ce84c5af0f1160169b30d8a6914231d97d2fe297d4", size = 135430, upload-time = "2026-05-06T15:09:20.257Z" }, - { url = "https://files.pythonhosted.org/packages/16/64/bd815f5c610b3facc204f26ba94e87a9eb49b0d83de3d5fc1eee2402d91b/orjson-3.11.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:231742b4a11dad8d5380a435962c57e91b7c37b79be858f4ef1c0df1a259897e", size = 146178, upload-time = "2026-05-06T15:09:21.616Z" }, - { url = "https://files.pythonhosted.org/packages/c7/35/e744fd36c79b339d27beb06068b5a08a8882ef5418804d0ce545a31f718d/orjson-3.11.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34fd2317602587321faab75ab76c623a0117e80841a6413654f04e47f339a8fb", size = 133068, upload-time = "2026-05-06T15:09:23.228Z" }, - { url = "https://files.pythonhosted.org/packages/2a/56/d54152b67b63a0b3e556cfc549d6ce84f74d7f425ddeadc6c8a74d913da7/orjson-3.11.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71f3db16e69b667b132e0f305a833d5497da302d801508cbb051ed9a9819da47", size = 134217, upload-time = "2026-05-06T15:09:24.847Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ee/66154baf69f71c7164a268a5e888908aec5a0819d13c81d5e2755a257758/orjson-3.11.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0b34789fa0da61cf7bef0546b09c738fb195331e017e477096d129e9105ab03d", size = 141917, upload-time = "2026-05-06T15:09:26.647Z" }, - { url = "https://files.pythonhosted.org/packages/09/d3/c5824260ca8b9d7ba82648d042a3f8f4815d18c15bb98a1f30edd1bb2d83/orjson-3.11.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:87e4d4ab280b0c87424d47695bec2182caf8cfc17879ea78dab76680194abc13", size = 415356, upload-time = "2026-05-06T15:09:28.252Z" }, - { url = "https://files.pythonhosted.org/packages/64/cb/509c2e816fe4df641d93dc92f6a89adc8df3ada8ebdee2bd44aba3264c3c/orjson-3.11.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ace6c58523302d3b97b6ac5c38a5298a54b473762b6be82726b4265c41029f92", size = 148112, upload-time = "2026-05-06T15:09:29.783Z" }, - { url = "https://files.pythonhosted.org/packages/db/b5/3ceae56d2e4962979eedb023ba6a46a4bb65f333960379be0ca470686220/orjson-3.11.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:97d0d932803c1b164fde11cb542a9efcb1e0f63b184537cca65887147906ff48", size = 137112, upload-time = "2026-05-06T15:09:31.432Z" }, - { url = "https://files.pythonhosted.org/packages/d7/7a/81fa3f2c7bef79b04cf2ab7838e5ac74b1f12511ceab979759b0275d6bb4/orjson-3.11.9-cp310-cp310-win32.whl", hash = "sha256:b3afcf569c15577a9fe64627292daa3e6b3a70f4fb77a5df246a87ec21681b94", size = 131706, upload-time = "2026-05-06T15:09:32.707Z" }, - { url = "https://files.pythonhosted.org/packages/ae/d8/b64600f9083c7f151ad39717a5877fccbeb0ef6d7efcb55f971ce00b6bee/orjson-3.11.9-cp310-cp310-win_amd64.whl", hash = "sha256:8697ab6a080a5c46edaad50e2bc5bd8c7ca5c66442d24104fa44ec74910a8244", size = 127282, upload-time = "2026-05-06T15:09:33.955Z" }, - { url = "https://files.pythonhosted.org/packages/1e/51/3fb9e65ae76ee97bd611869a503fa3fc0a6e81dd8b737cf3003f682df7ff/orjson-3.11.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f01c4818b3fc9b0da8e096722a84318071eaa118df35f6ed2344da0e73a5444f", size = 228522, upload-time = "2026-05-06T15:09:35.362Z" }, - { url = "https://files.pythonhosted.org/packages/16/fa/9d54b07cb3f3b0bfd57841478e42d7a0ece4a9f49f9907eecf5a45461687/orjson-3.11.9-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:3ebca4179031ee716ed076ffadc29428e900512f6fccee8614c9983157fcf19c", size = 128463, upload-time = "2026-05-06T15:09:37.063Z" }, - { url = "https://files.pythonhosted.org/packages/88/b1/6ceafc2eefd0a553e3be77ce6c49d107e772485d9568629376171c50e634/orjson-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48ee05097750de0ff69ed5b7bbcf0732182fd57a24043dcc2a1da780a5ead3a5", size = 132306, upload-time = "2026-05-06T15:09:38.299Z" }, - { url = "https://files.pythonhosted.org/packages/ea/76/f11311285324a40aab1e3031385c50b635a7cd0734fdaf60c7e89a696f60/orjson-3.11.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6082706765a95a6680d812e1daf1c0cfe8adec7831b3ff3b625693f3b461b1c", size = 127988, upload-time = "2026-05-06T15:09:39.597Z" }, - { url = "https://files.pythonhosted.org/packages/9e/85/0ef63bcf1337f44031ce9b91b1919563f62a37527b3ea4368bb15a22e5d7/orjson-3.11.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:277fefe9d76ee17eb14debf399e3533d4d63b5f677a4d3719eb763536af1f4bd", size = 135188, upload-time = "2026-05-06T15:09:40.957Z" }, - { url = "https://files.pythonhosted.org/packages/05/94/b0d27090ea8a2095db3c2bd1b1c96f96f19bbb494d7fef33130e846e613d/orjson-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03db380e3780fa0015ed776a90f20e8e20bb11dde13b216ce19e5718e3dfba62", size = 145937, upload-time = "2026-05-06T15:09:42.249Z" }, - { url = "https://files.pythonhosted.org/packages/09/eb/75d50c29c05b8054013e221e598820a365c8e64065312e75e202ed880709/orjson-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33d7d766701847dc6729846362dc27895d2f2d2251264f9d10e7cb9878194877", size = 132758, upload-time = "2026-05-06T15:09:43.945Z" }, - { url = "https://files.pythonhosted.org/packages/49/bd/360686f39348aa88827cb6fbf7dc606fd41c831a35235e1abf1db8e3a9e6/orjson-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147302878da387104b66bb4a8b0227d1d487e976ce41a8501916161072ed87b1", size = 133971, upload-time = "2026-05-06T15:09:45.239Z" }, - { url = "https://files.pythonhosted.org/packages/0e/30/3178eb16f3221aeef068b6f1f1ebe05f656ea5c6dffe9f6c917329fe17a3/orjson-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3513550321f8c8c811a7c3297b8a630e82dc08e4c10216d07703c997776236cd", size = 141685, upload-time = "2026-05-06T15:09:46.858Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f1/ff2f19ed0225f9680fafa42febca3570dd59444ebf190980738d376214c2/orjson-3.11.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c5d001196b89fa9cf0a4ab79766cd835b991a166e4b621ba95089edc50c429ff", size = 415167, upload-time = "2026-05-06T15:09:48.312Z" }, - { url = "https://files.pythonhosted.org/packages/9b/61/863bddf0da6e9e586765414debd54b4e58db05f560902b6d00658cb88636/orjson-3.11.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:16969c9d369c98eb084889c6e4d2d39b77c7eb38ceccf8da2a9fff62ae908980", size = 147913, upload-time = "2026-05-06T15:09:49.733Z" }, - { url = "https://files.pythonhosted.org/packages/b6/8a/4081492586d75b073d60c5271a8d0f05a0955cabf1e34c8473f6fcd84235/orjson-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63e0efbc991250c0b3143488fa57d95affcabbfc63c99c48d625dd37779aafe2", size = 136959, upload-time = "2026-05-06T15:09:51.311Z" }, - { url = "https://files.pythonhosted.org/packages/0d/bd/70b6ab193594d7abb875320c0a7c8335e846f28968c432c31042409c3c8d/orjson-3.11.9-cp311-cp311-win32.whl", hash = "sha256:14ed654580c1ed2bc217352ec82f91b047aef82951aa71c7f64e0dcb03c0e180", size = 131533, upload-time = "2026-05-06T15:09:52.637Z" }, - { url = "https://files.pythonhosted.org/packages/3f/17/1a1a228183d62d1b77e2c30d210f47dd4768b310ebe1607c63e3c0e3a71e/orjson-3.11.9-cp311-cp311-win_amd64.whl", hash = "sha256:57ea77fb70a448ce87d18fca050193202a3da5e54598f6501ca5476fb66cfe02", size = 127106, upload-time = "2026-05-06T15:09:54.204Z" }, - { url = "https://files.pythonhosted.org/packages/b8/95/285de5fa296d09681ee9c546cd4a8aeb773b701cf343dc125994f4d52953/orjson-3.11.9-cp311-cp311-win_arm64.whl", hash = "sha256:19b72ed11572a2ee51a67a903afbe5af504f84ed6f529c0fe44b0ab3fb5cc697", size = 126848, upload-time = "2026-05-06T15:09:55.551Z" }, - { url = "https://files.pythonhosted.org/packages/16/6d/11867a3ffa3a3608d84a4de51ef4dd0896d6b5cc9132fbe1daf593e677bc/orjson-3.11.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9ef6fe90aadef185c7b128859f40beb24720b4ecea95379fc9000931179c3a49", size = 228515, upload-time = "2026-05-06T15:09:57.265Z" }, - { url = "https://files.pythonhosted.org/packages/24/75/05912954c8b288f34fcf5cd4b9b071cb4f6e77b9961e175e56ebb258089f/orjson-3.11.9-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e5c9b8f28e726e97d97696c826bc7bea5d71cecd63576dba92924a32c1961291", size = 128409, upload-time = "2026-05-06T15:09:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/ab/86/1c3a47df3bc8191ea9ac51603bbb872a95167a364320c269f2557911f406/orjson-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a473dbb4162108b27901492546f83c76fdcea3d0eadff00ae7a07e18dcce09", size = 132106, upload-time = "2026-05-06T15:10:00.798Z" }, - { url = "https://files.pythonhosted.org/packages/d7/cf/b33b5f3e695ae7d63feef9d915c37cc3b8f465493dcd4f8e0b4c697a2366/orjson-3.11.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:011382e2a60fda9d46f1cdee31068cfc52ffe952b587d683ec0463002802a0f4", size = 127864, upload-time = "2026-05-06T15:10:02.15Z" }, - { url = "https://files.pythonhosted.org/packages/31/6a/6cf69385a58208024fcb8c014e2141b8ce838aba6492b589f8acfff97fab/orjson-3.11.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2d3dc759490128c5c1711a53eeaa8ee1d437fd0038ffd2b6008abf46db3f882", size = 135213, upload-time = "2026-05-06T15:10:03.515Z" }, - { url = "https://files.pythonhosted.org/packages/e8/f8/0b1bd3e8f2efcdd376af5c8cfd79eaf13f018080c0089c80ebd724e3c7fb/orjson-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8ea516b3726d190e1b4297e6f4e7a8650347ae053868a18163b4dd3641d1fff", size = 145994, upload-time = "2026-05-06T15:10:05.083Z" }, - { url = "https://files.pythonhosted.org/packages/f3/59/dab79f61044c529d2c81aecdc589b1f833a1c8dec11ba3b1c2498a02ca7e/orjson-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380cdce7ba24989af81d0a7013d0aaec5d0e2a21734c0e2681b1bc4f141957fe", size = 132744, upload-time = "2026-05-06T15:10:06.853Z" }, - { url = "https://files.pythonhosted.org/packages/0e/a4/82b7a2fe5d8a67a59ed831b24d59a3d46ea7d207b66e1602d376541d94a6/orjson-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4fa4f0af7fa18951f7ab3fc2148e223af211bf03f59e1c6034ec3f97f21d61", size = 134014, upload-time = "2026-05-06T15:10:08.213Z" }, - { url = "https://files.pythonhosted.org/packages/50/c7/375e83a76851b73b2e39f3bcf0e5a19e2b89bad13e5bca97d0b293d27f24/orjson-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a8f5f8bc7ce7d59f08d9f99fa510c06496164a24cb5f3d34537dbd9ca30132e2", size = 141509, upload-time = "2026-05-06T15:10:09.595Z" }, - { url = "https://files.pythonhosted.org/packages/7f/7c/49d5d82a3d3097f641f094f552131f1e2723b0b8cb0fa2874ab65ecfffa6/orjson-3.11.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4d7fde5501b944f83b3e665e1b31343ff6e154b15560a16b7130ea1e594a4206", size = 415127, upload-time = "2026-05-06T15:10:11.049Z" }, - { url = "https://files.pythonhosted.org/packages/3a/dc/7446c538590d55f455647e5f3c61fc33f7108714e7afcffa6a2a033f8350/orjson-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cde1a448023ba7d5bb4c01c5afb48894380b5e4956e0627266526587ef4e535f", size = 148025, upload-time = "2026-05-06T15:10:12.842Z" }, - { url = "https://files.pythonhosted.org/packages/df/e5/4d2d8af06f788329b4f78f8cc3679bb395392fcaa1e4d8d3c33e85308fa4/orjson-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e63adb0e1f1ed5d9e168f50a91ceb93ae6420731d222dc7da5c69409aa47aa", size = 136943, upload-time = "2026-05-06T15:10:14.405Z" }, - { url = "https://files.pythonhosted.org/packages/06/69/850264ccf6d80f6b174620d30a87f65c9b1490aba33fe6b62798e618cad3/orjson-3.11.9-cp312-cp312-win32.whl", hash = "sha256:2d057a602cdd19a0ad680417527c45b6961a095081c0f46fe0e03e304aac6470", size = 131606, upload-time = "2026-05-06T15:10:15.791Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d5/973a43fc9c55e20f2051e9830997649f669be0cb3ca52192087c0143f118/orjson-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:59e403b1cc5a676da8eaf31f6254801b7341b3e29efa85f92b48d272637e77be", size = 127101, upload-time = "2026-05-06T15:10:17.129Z" }, - { url = "https://files.pythonhosted.org/packages/fe/ae/495470f0e4a18f73fa10b7f6b84b464ec4cc5291c4e0c7c2a6c400bef006/orjson-3.11.9-cp312-cp312-win_arm64.whl", hash = "sha256:9af678d6488357948f1f84c6cd1c1d397c014e1ae2f98ae082a44eb48f602624", size = 126736, upload-time = "2026-05-06T15:10:18.645Z" }, - { url = "https://files.pythonhosted.org/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458, upload-time = "2026-05-06T15:10:20.079Z" }, - { url = "https://files.pythonhosted.org/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368, upload-time = "2026-05-06T15:10:21.549Z" }, - { url = "https://files.pythonhosted.org/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070, upload-time = "2026-05-06T15:10:23.371Z" }, - { url = "https://files.pythonhosted.org/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892, upload-time = "2026-05-06T15:10:24.714Z" }, - { url = "https://files.pythonhosted.org/packages/66/60/52b0054c4c700d5aa7fc5b7ca96917400d8f061307778578e67a10e25852/orjson-3.11.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aff7da9952a5ad1cef8e68017724d96c7b9a66e99e91d6252e1b133d67a7b10", size = 135217, upload-time = "2026-05-06T15:10:26.084Z" }, - { url = "https://files.pythonhosted.org/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980, upload-time = "2026-05-06T15:10:28.062Z" }, - { url = "https://files.pythonhosted.org/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738, upload-time = "2026-05-06T15:10:29.727Z" }, - { url = "https://files.pythonhosted.org/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033, upload-time = "2026-05-06T15:10:31.152Z" }, - { url = "https://files.pythonhosted.org/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492, upload-time = "2026-05-06T15:10:32.641Z" }, - { url = "https://files.pythonhosted.org/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087, upload-time = "2026-05-06T15:10:34.438Z" }, - { url = "https://files.pythonhosted.org/packages/3d/57/1b30daf70f0d8180e9a73cefbfbdd99e4bf19eb020466502b01fba7e0e50/orjson-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:97db4c94a7db398a5bd636273324f0b3fd58b350bbbac8bb380ceb825a9b40f4", size = 148031, upload-time = "2026-05-06T15:10:36.358Z" }, - { url = "https://files.pythonhosted.org/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915, upload-time = "2026-05-06T15:10:38.013Z" }, - { url = "https://files.pythonhosted.org/packages/5f/cc/2d10025f9056d376e4127ec05a5808b218d46f035fdc08178a5411b34250/orjson-3.11.9-cp313-cp313-win32.whl", hash = "sha256:d4087e5c0209a0a8efe4de3303c234b9c44d1174161dcd851e8eea07c7560b32", size = 131613, upload-time = "2026-05-06T15:10:39.569Z" }, - { url = "https://files.pythonhosted.org/packages/67/bd/2775ff28bfe883b9aa1ff348300542eb2ef1ee18d8ae0e3a49846817a865/orjson-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:051b102c93b4f634e89f3866b07b9a9a98915ada541f4ec30f177067b2694979", size = 127086, upload-time = "2026-05-06T15:10:41.262Z" }, - { url = "https://files.pythonhosted.org/packages/91/2b/d26799e580939e32a7da9a39531bc9e58e15ca32ffaa6a8cb3e9bb0d22cd/orjson-3.11.9-cp313-cp313-win_arm64.whl", hash = "sha256:cce9127885941bd28f080cecf1f1d288336b7e0d812c345b08be88b572796254", size = 126696, upload-time = "2026-05-06T15:10:42.651Z" }, - { url = "https://files.pythonhosted.org/packages/8e/eb/5da01e356015aee6ecfa1187ced87aef51364e306f5e695dd52719bf0e78/orjson-3.11.9-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6ef1979adc4bc243523f1a2ba91418030a8e29b0a99cbe7e0e2d6807d4dce6e", size = 228465, upload-time = "2026-05-06T15:10:44.097Z" }, - { url = "https://files.pythonhosted.org/packages/64/62/3e0e0c14c957133bcd855395c62b55ed4e3b0af23ffea11b032cb1dcbdb1/orjson-3.11.9-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:f36b7f32c7c0db4a719f1fc5824db4a9c6f8bd1a354debb91faf26ebf3a4c71e", size = 128364, upload-time = "2026-05-06T15:10:45.839Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5a/07d8aa117211a8ed7630bda80c8c0b14d04e0f8dcf99bcf49656e4a710eb/orjson-3.11.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08f4d8ebb44925c794e535b2bebc507cebf32209df81de22ae285fb0d8d66de0", size = 132063, upload-time = "2026-05-06T15:10:47.267Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ec/4acaf21483e18aa945be74a474c74b434f284b549f275a0a39b9f98956e9/orjson-3.11.9-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6cc7923789694fd58f001cbcac7e47abc13af4d560ebbfcf3b41a8b1a0748124", size = 122356, upload-time = "2026-05-06T15:10:48.765Z" }, - { url = "https://files.pythonhosted.org/packages/13/d8/5f0555e7638801323b7a75850f92e7dfa891bc84fe27a1ba4449170d1200/orjson-3.11.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea5c46eb2d3af39e806b986f4b09d5c2706a1f5afde3cbf7544ce6616127173c", size = 129592, upload-time = "2026-05-06T15:10:50.13Z" }, - { url = "https://files.pythonhosted.org/packages/b6/30/ed9860412a3603ceb3c5955bfd72d28b9d0e7ba6ed81add14f83d7114236/orjson-3.11.9-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5d89a2ed90731df3be64bab0aa44f78bff39fdc9d71c291f4a8023aa46425b7", size = 140491, upload-time = "2026-05-06T15:10:51.582Z" }, - { url = "https://files.pythonhosted.org/packages/d0/17/adc514dea7ac7c505527febf884934b815d34f0c7b8693c1a8b39c5c4a57/orjson-3.11.9-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25e4aed0312d292c09f61af25bba34e0b2c88546041472b09088c39a4d828af1", size = 127309, upload-time = "2026-05-06T15:10:53.329Z" }, - { url = "https://files.pythonhosted.org/packages/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaea64f3f467d22e70eeed68bdccb3bc4f83f650446c4a03c59f2cba28a108db", size = 134030, upload-time = "2026-05-06T15:10:54.988Z" }, - { url = "https://files.pythonhosted.org/packages/c1/7a/bc82a0bb25e9faaf92dc4d9ef002732efc09737706af83e346788641d4a7/orjson-3.11.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a028425d1b440c5d92a6be1e1a020739dfe67ea87d96c6dbe828c1b30041728b", size = 141482, upload-time = "2026-05-06T15:10:56.663Z" }, - { url = "https://files.pythonhosted.org/packages/01/55/e69188b939f77d5d32a9833745ace31ea5ccae3ab613a1ec185d3cd2c4fb/orjson-3.11.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5b192c6cf397e4455b11523c5cf2b18ed084c1bbd61b6c0926344d2129481972", size = 415178, upload-time = "2026-05-06T15:10:58.446Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1a/b8a5a7ac527e80b9cb11d51e3f6689b709279183264b9ec5c7bc680bb8b5/orjson-3.11.9-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea407d4ccf5891d667d045fecae97a7a1e5e87b3b97f97ae1803c2e741130be0", size = 148089, upload-time = "2026-05-06T15:11:00.441Z" }, - { url = "https://files.pythonhosted.org/packages/97/4e/00503f64204bf859b37213a63927028f30fb6268cd8677fb0a5ad48155e1/orjson-3.11.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f63aaf97afd9f6dec5b1a68e1b8da12bfccb4cb9a9a65c3e0b6c847849e7586", size = 136921, upload-time = "2026-05-06T15:11:02.176Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ba/a23b82a0a8d0ed7bed4e5f5035aae751cad4ff6a1e8d2ecd14d8860f5929/orjson-3.11.9-cp314-cp314-win32.whl", hash = "sha256:e30ab17845bb9fa54ccf67fa4f9f5282652d54faa6d17452f47d0f369d038673", size = 131638, upload-time = "2026-05-06T15:11:03.696Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c3/0c6798456bade745c75c452342dabacce5798196483e77e643be1f53877d/orjson-3.11.9-cp314-cp314-win_amd64.whl", hash = "sha256:32ef5f4283a3be81913947d19608eacb7c6608026851123790cd9cc8982af34b", size = 127078, upload-time = "2026-05-06T15:11:05.123Z" }, - { url = "https://files.pythonhosted.org/packages/16/21/5a3f1e8913103b703a436a5664238e5b965ec392b555fe68943ea3691e6b/orjson-3.11.9-cp314-cp314-win_arm64.whl", hash = "sha256:eebdbdeef0094e4f5aefa20dcd4eb2368ab5e7a3b4edea27f1e7b2892e009cf9", size = 126687, upload-time = "2026-05-06T15:11:06.602Z" }, +version = "3.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/f3/742fb1f62b825f2c010697eaf4e828004bc2a81e7e806666989c132c7c42/orjson-3.12.0.tar.gz", hash = "sha256:d14203fb1aae2ad9b3d52f8a0e82aeb10197ef1c9bc61da7f358bd70b00123d5", size = 4142915, upload-time = "2026-08-14T16:13:30.607Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/35/819eeb4fa8ee676d38fdbb8213a76fd496f7dbbfdfafa89d34e02b22dfac/orjson-3.12.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:747843254519dd43b93eee3153a19e5a509334320c4d2f823ec879232db5c796", size = 224133, upload-time = "2026-08-14T16:12:00.607Z" }, + { url = "https://files.pythonhosted.org/packages/58/ab/d9221d4a2b085b073fcddc91728d490f20b9cf010c62c2f42371ab997695/orjson-3.12.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:7c2ad193c8004254f34b499f3bd2c80f043d10754aff2b38f93da574f4883f98", size = 113669, upload-time = "2026-08-14T16:12:02.126Z" }, + { url = "https://files.pythonhosted.org/packages/15/12/644cbbcabb26df61d9ef0c66e6f2bf8b687cc7b66137597f2858951f1952/orjson-3.12.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bc7a872f03522d90e0429e6c0c5cd23084f767bedcb4c58048eec19294613344", size = 130410, upload-time = "2026-08-14T16:12:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/14/6d/e3a8c34d687895aecd8b267a01c46106eb98d8424a83bfa7bacb723854f6/orjson-3.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18a87929f31d94a77f7dc93cf527e91f39ce7fe7813d588a4de2507efd32a387", size = 131101, upload-time = "2026-08-14T16:12:04.918Z" }, + { url = "https://files.pythonhosted.org/packages/75/20/930824c07685c22af23f26818ed3853b0270488a412b6ab757904b7f787b/orjson-3.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9683ee9ea0659da64f36574ef675b8a86330c34c19ea75db1fb93c3ff99e0ef", size = 131479, upload-time = "2026-08-14T16:12:06.11Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a6/22e863bbbe8917aa292e33e0db597000f9a07eb5e6f52efed623fa16bae1/orjson-3.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:103b5db66aa53c1f9e88c2524be4f383e831ba7dfd5f9f5af6336a177c622f11", size = 135865, upload-time = "2026-08-14T16:12:07.392Z" }, + { url = "https://files.pythonhosted.org/packages/50/a0/ceb5008914a65e9a19a46a09d94bc67a74d120209fdfa772750023ceb377/orjson-3.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd57d79aefa3f84eec851d6de7a366795b9345cfaf17f82b4820430a7a5fa241", size = 127843, upload-time = "2026-08-14T16:12:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/12/3d/61c6b3b84c250cb09cb7229701ff77e4d763773ad7f577d0b6abf2892664/orjson-3.12.0-cp310-cp310-win32.whl", hash = "sha256:3dbce9b6b3074b31a5d5dd322a9c4e5b16f206091ece4194c2e36952847a105e", size = 128293, upload-time = "2026-08-14T16:12:09.819Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0e/ea0f4a563253b6363195a4f704123c6bfbf156641bd3be5a75de81c5e917/orjson-3.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:3bb17a06f9bd15237b3216c044209fe92597379124018cfc196fbb846cde64df", size = 122216, upload-time = "2026-08-14T16:12:11.261Z" }, + { url = "https://files.pythonhosted.org/packages/75/1a/a7075a8e8b0d3f5097d17ac3099017104b6b7b42012041147995d5b2da05/orjson-3.12.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a94f0f0c6fcbb2b5bd9734c57a489c7584a732bbdf04a39e8c83b861e9d03e92", size = 223409, upload-time = "2026-08-14T16:12:12.654Z" }, + { url = "https://files.pythonhosted.org/packages/05/34/c2eb3b2900e5597db7841a4c6416ac2d90081bd956b02d4dd1833fa2b96b/orjson-3.12.0-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:a696529ec96a90d9a5f9570207efe403c8b08f8e4aa2783ee3403511e2fdfa10", size = 124015, upload-time = "2026-08-14T16:12:14.025Z" }, + { url = "https://files.pythonhosted.org/packages/1c/df/b49081766a75b6a37b3d33bdc0a39e492abab8441dd25e3e1998e7b83fcb/orjson-3.12.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:e4ac5059baab4b3acbd99485de019ff8cda0fdf34b61fa74f7197a53db78bfe8", size = 113471, upload-time = "2026-08-14T16:12:15.81Z" }, + { url = "https://files.pythonhosted.org/packages/48/d4/58ea28eeef95c2a27358ed927380a621162cf20bd740bbccf9c3f09a200a/orjson-3.12.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8e29957429c35bbb5a185a119c523aa2428b7bbf1a293724c7b9375ed8f892a3", size = 129998, upload-time = "2026-08-14T16:12:17.503Z" }, + { url = "https://files.pythonhosted.org/packages/e2/f4/1e82aa2efc9916422d804697876ce433c907a1abd7c7e5c6d3d48565e5f9/orjson-3.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dce0166feb0a737ab84f598c9a338cbc0b764a036617aa686194f53c7eba0c3e", size = 130891, upload-time = "2026-08-14T16:12:18.762Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/15169e9d22b59a406264f99d6db387c0b0b12b6357a8a0169917c2a713eb/orjson-3.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9caf3d09f47c3c70c4451ada20ef9bc4a4cdffa26f49862cf0a253b329aae2d5", size = 131285, upload-time = "2026-08-14T16:12:20.251Z" }, + { url = "https://files.pythonhosted.org/packages/a4/3a/763dbd426290d044ec3e615a05e70adb6d8b6f95bf17dc355c0081a5e8b6/orjson-3.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b9dca132b1fda5565088e65a6b6e742285e0aeceb6fae549fa8863e16c7d3998", size = 135707, upload-time = "2026-08-14T16:12:21.652Z" }, + { url = "https://files.pythonhosted.org/packages/04/d1/3b2038ed168d22e14182ed715d6963f9c073a83a2ba43cfe918a4fc43c64/orjson-3.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a791f793b287bbc135b8e87c34e35c8bfc693e2a8a620fab1ae682b925f9a32e", size = 127669, upload-time = "2026-08-14T16:12:22.926Z" }, + { url = "https://files.pythonhosted.org/packages/88/ae/b84b3d3e65f5629ada0edcb1d2bccc55d7c5f89d8b981537ecdc3d6f31ec/orjson-3.12.0-cp311-cp311-win32.whl", hash = "sha256:31ed278a36304390adc3eec5d7f6fd593a7c3e99e5a06cd07866396c4b1b4710", size = 128043, upload-time = "2026-08-14T16:12:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/35/24/2ed0e6f51ea3d0af45d807233a851175af75bec83ef5fd0d6a2601904ec0/orjson-3.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb2539159dfe8d371914f354360fa50e4a577cc89222a3828b9650a5e5040252", size = 122084, upload-time = "2026-08-14T16:12:25.813Z" }, + { url = "https://files.pythonhosted.org/packages/21/dd/95d25fcfbc9471799ef6bb01c552d64ee5cde93ee40ba2f423dd3442c708/orjson-3.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:61318b6de893c7a9d9f3e5ecbadccbfc26a7eb417ccc7bbf0771de3b4d72f868", size = 127035, upload-time = "2026-08-14T16:12:27.201Z" }, + { url = "https://files.pythonhosted.org/packages/be/4a/295da39c651c2faac8bd351a2a346f0fdedd9d50b847ee9dfc27d2207ef6/orjson-3.12.0-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:aa3e43a6846e91d7bde3d5a9c66090fcd8744f569a9b6cffc5e1ca38f6a461c0", size = 223427, upload-time = "2026-08-14T16:12:28.525Z" }, + { url = "https://files.pythonhosted.org/packages/29/98/758cf90fbeaaafb7f8141bfac75a432099959f3a2f5db93a412e876415d8/orjson-3.12.0-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:11edb4660a6680abee9788a3a9072208a2c96538cc1322bd79542065229d8e54", size = 123725, upload-time = "2026-08-14T16:12:30.013Z" }, + { url = "https://files.pythonhosted.org/packages/32/b5/5b934d251f8651f7e41df180ad0c57a6e1cabe15c7bd331638413a50ebc9/orjson-3.12.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:2d3a9da945a4d96ae758fdaaca56742e6b73b6fd554c5d8876f252a6dad70b83", size = 113375, upload-time = "2026-08-14T16:12:31.209Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d2/37efb5b12a176ce3ced29f4144f20da57d02757f78ce549637dc1b4e1fc8/orjson-3.12.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:92ffc09e07233a6ab6d4e067f7841edcbcc134cb4812155cf171ea5255a421d7", size = 129983, upload-time = "2026-08-14T16:12:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/50/22/0644b87c73f13e0092df8f35a1fe280d991e5e90072087411e0dd7e44e0c/orjson-3.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf44e374aadde77b1f6109f1030be51433eb61984379852766b6f4e187db7b1e", size = 130629, upload-time = "2026-08-14T16:12:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/8c/57/80b986ebfecd9c6a177ddf1c2319717f0cd8feffb2b78946595a18a2fc88/orjson-3.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1192a7021b6d071aaf909864f6e924d6a2675ca360485b972b8401749311750b", size = 131245, upload-time = "2026-08-14T16:12:35.713Z" }, + { url = "https://files.pythonhosted.org/packages/80/3d/75c5ac5a69161f44492a68fbdde66f4cc4ce48cd5e1fb05918e46f0c8848/orjson-3.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:53c0c474a9d9aff9aebfc0c88de1f28f843d940e6e3a80729abdf6a20274356f", size = 135397, upload-time = "2026-08-14T16:12:37.128Z" }, + { url = "https://files.pythonhosted.org/packages/71/93/4d71f2df314a97ff0d27a4559bf5888fc8406e3c6dec90e92291e3511215/orjson-3.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:532ff8cd4bd59a327a953a7dcde922c7fc25b85e29721bb8633265430d3a3873", size = 127693, upload-time = "2026-08-14T16:12:38.627Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1d/0dbc6be5adfd1730491072fb60beb6bcdf5d7b2596ee41b7fc2e298bfc09/orjson-3.12.0-cp312-cp312-win32.whl", hash = "sha256:a6cf4b18e7de173f209f2084ffbd736dd72389a396326ee80a7022168be232e5", size = 128000, upload-time = "2026-08-14T16:12:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c9/97b1ce0112ebf5e949c775ed5b1755e562233179f3584579673cc24d6378/orjson-3.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:010811c1b69773450a01cef97727a67b223242f350b77d4ca000e59a9ef2155a", size = 122106, upload-time = "2026-08-14T16:12:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/a8/6a/facd8b312e4a0d3a7fa978c7e15821f74a336adf1d65529faec33b48e18b/orjson-3.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:ad29eece0c601737f2a60edc2752a84e7a0785df3efb62e3012834700a5afe0d", size = 126869, upload-time = "2026-08-14T16:12:42.651Z" }, + { url = "https://files.pythonhosted.org/packages/54/cb/d7b78218a987eb8a8ce4eeae0286b1bb679333eb631ea0eeaf6371680bfc/orjson-3.12.0-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a36ec60f1796f9a3f13e3b98390295e17a1c7c10155b448d264098bf9ee5900", size = 223397, upload-time = "2026-08-14T16:12:44.003Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4a/bc87c45e7ec639d35ebefd62618e01939531ac8e171426606a01bda05914/orjson-3.12.0-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ad0422b92d5195443a39f80c3bcf731cc2e00f153bd32063a47b73b057bd0f03", size = 123662, upload-time = "2026-08-14T16:12:45.433Z" }, + { url = "https://files.pythonhosted.org/packages/94/ee/c9a4ff3f2dbedbbe9e635d0fa72c8866adede09b6335ef9644f53752f0d8/orjson-3.12.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:5a0fdbc216388f653d3752ff310e710f59253bd4ed6a2bfb3f4f06b84714bbd8", size = 113374, upload-time = "2026-08-14T16:12:46.755Z" }, + { url = "https://files.pythonhosted.org/packages/75/09/3f330a026a796c8b4c97a6f429652a5e912e7065039bf96ed25e42aa7b25/orjson-3.12.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:2eb5c56e534127b2b8fa38d2363c8b1b8190367ee0d1d16c041517d880843b94", size = 130029, upload-time = "2026-08-14T16:12:48.06Z" }, + { url = "https://files.pythonhosted.org/packages/7d/40/094cc53126a3d22f76cdf83b6ea67338bed01d774037621a785aa8e6e5ea/orjson-3.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:784106539f4b9d4b930e0b4eb8d45168507dae001945e71b4675a367f1e5e806", size = 130528, upload-time = "2026-08-14T16:12:49.362Z" }, + { url = "https://files.pythonhosted.org/packages/bc/74/89bb236deb9565f99434b13052bb40ddfcce4adf3afbfa3132ee7e421468/orjson-3.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c680706fc8396d95e7c4c1f9482563f552137aef91b57237a3ad5aaf64629df", size = 131075, upload-time = "2026-08-14T16:12:50.692Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ac/1176360d762c01b5bd34acd56fc098e936c491363d8b6b397ad4aa475547/orjson-3.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:83445adc40cba26d6d621185a45128ce455b766af368cad2ab64b970603a7978", size = 135321, upload-time = "2026-08-14T16:12:52.114Z" }, + { url = "https://files.pythonhosted.org/packages/7a/02/bbd881c8b9276d50b998de38b4e97de8ace1aac940b0ee545aedbf65ed00/orjson-3.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:644d005bc82f917337a95ce270c9f6f92f9834c2bed7b1477572f8db00784222", size = 127472, upload-time = "2026-08-14T16:12:53.517Z" }, + { url = "https://files.pythonhosted.org/packages/8e/02/a0934d7503e6dcbedd6afac3e7f3f8597fd09389949ad94d0f7540e9dbca/orjson-3.12.0-cp313-cp313-win32.whl", hash = "sha256:d8e78d3d93705e3d27cc17cdb209e44d7a8ea203010cac6ce9c7ffc1ae1996f1", size = 128000, upload-time = "2026-08-14T16:12:55.14Z" }, + { url = "https://files.pythonhosted.org/packages/52/87/69f98f8d40faff103a965a5fbb83f08241b01beaf92badb5413fbc9358cc/orjson-3.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:b85931be5b6763c31283805c9bdaae1ca03ad9f6f12a15f1cbf6745b907932c2", size = 121841, upload-time = "2026-08-14T16:12:56.507Z" }, + { url = "https://files.pythonhosted.org/packages/e6/07/b83046a4e3cadcc0987d0f160696107c4af706a619b56e4ad01940cadadf/orjson-3.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:6a31348d7dfa64cd9c78bd1f510ff44c48fe64d71094e6b90e364dba3b55949e", size = 126765, upload-time = "2026-08-14T16:12:57.806Z" }, + { url = "https://files.pythonhosted.org/packages/12/9d/3931253e6f3148abf2cbe14830367042a4806b362ea520df2303db188fb9/orjson-3.12.0-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9e6fee342a48760e854d743e7a81534d8e2925a6f46e09f750cf56b50fd1de5d", size = 223391, upload-time = "2026-08-14T16:12:59.184Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0e/b4a4f1e305367245877b967a0bad70fcf001d77c54ac4339a120b66fdae4/orjson-3.12.0-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:8c3bb86dd10f39b3fbf434b7d5dc7cac77d6fc8ac572ae30a10731ede2c4b647", size = 123659, upload-time = "2026-08-14T16:13:00.548Z" }, + { url = "https://files.pythonhosted.org/packages/96/f3/6782c6fa85e2702bc66be183c3b421486167dcf266ee4dc1403fe3824870/orjson-3.12.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:2bb3ce43203936072dd8b4917b01d3aecfc02329bfb42510cb7cfb24708adc9c", size = 113337, upload-time = "2026-08-14T16:13:02.009Z" }, + { url = "https://files.pythonhosted.org/packages/bf/79/b32ab64bacda9d0fa4942ef483bd03cabf0eaf2be819ca9fb7ff610c559d/orjson-3.12.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:6a2a79c89984dc719817d388c8709e0efc2a2795a934eaa746b4882eb6045adc", size = 130112, upload-time = "2026-08-14T16:13:03.404Z" }, + { url = "https://files.pythonhosted.org/packages/ee/49/6e6142999ca01509219be5e5a9c338a3e5ea011f63e91ff473fbbf3734ed/orjson-3.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f06dd838d1e07d9b1de0932ec0485ec92c4d5f5d1ad4817a656268c3e88be1e1", size = 130520, upload-time = "2026-08-14T16:13:04.798Z" }, + { url = "https://files.pythonhosted.org/packages/49/d0/3745af0a4cc9867784f29722929cec4d10bd1c877cd754b01ba6d96eb21a/orjson-3.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6b11be792c3d2c6a4be2af4ebf97a68d0bf5f580aca6e86a418a354f6cc846a", size = 131053, upload-time = "2026-08-14T16:13:06.14Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/6fe5a22fa478fffb190e65c338c84df5c311ef597b363150a17cc57063c0/orjson-3.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:477ecaf6b9f88f873341b91fcc736119ca81b5e002a9f7f308ff5b4f2ce2a70e", size = 135321, upload-time = "2026-08-14T16:13:07.544Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/b1b0ec30289646a81a76e2dbaae2686b96fcccb7cb0323dc1dd78cbc7875/orjson-3.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f3c0683136acdc29afdf88a5bc2f7d3d0e34087788d1d63c0144b805a87a196f", size = 127485, upload-time = "2026-08-14T16:13:08.88Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2b/277404bdcc21c93b112b963655b76443ebfe828f8a3ff1de7d90f8850eb3/orjson-3.12.0-cp314-cp314-win32.whl", hash = "sha256:d39f3f5c3927e2dc0913fe5bbc1a2f6b1b9d1bba1de6358340d0ad0d0c00ca92", size = 128048, upload-time = "2026-08-14T16:13:10.305Z" }, + { url = "https://files.pythonhosted.org/packages/41/2b/395b36fa2b4ce7af70b651d715e88f80d884b2c2b14a6b53e84d554fb5f0/orjson-3.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:0b1ac5bf6609b2716c7954011c5fef6254922df029f45d032ee4ebf5d363cbed", size = 121858, upload-time = "2026-08-14T16:13:11.634Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a3/833e895ff452859eebe75093d26691fe9108f1a7a6a08435d7a5780ea652/orjson-3.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:50fae885cb073eac7556353ff3df93312b0d5137b0a5056b2bb63f97ed9a93c7", size = 126749, upload-time = "2026-08-14T16:13:13.117Z" }, + { url = "https://files.pythonhosted.org/packages/58/64/99c8947ece10c17176af9aae85c4948f1d109da77440ec14d87239efaf73/orjson-3.12.0-cp315-cp315-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:01efac2074fffb4cb1ea3fab7861e9d0f2a26913854a972f5ac760525dbdaf6e", size = 223398, upload-time = "2026-08-14T16:13:14.694Z" }, + { url = "https://files.pythonhosted.org/packages/3e/30/cf983fe09f2731420fda097a9f7ef4343f47fa216c228961ad8f6da44f3d/orjson-3.12.0-cp315-cp315-macosx_15_0_arm64.whl", hash = "sha256:ed4ca42bd55955aa34deedcfdfd0e0c31abf51143aae158ae2bc3520b626e517", size = 123655, upload-time = "2026-08-14T16:13:16.221Z" }, + { url = "https://files.pythonhosted.org/packages/11/50/9cb8ae73fa4749dbbc20f617004213b5ff01c20aaeec34c3f31124f2c1d8/orjson-3.12.0-cp315-cp315-manylinux_2_39_aarch64.whl", hash = "sha256:40f92192227505acca4e2533ce565f8e6b9535f7d0d09b0968452f18b7376b38", size = 130515, upload-time = "2026-08-14T16:13:17.601Z" }, + { url = "https://files.pythonhosted.org/packages/9f/0a/adb6ce1a5b5fbf9cb1790f9961bb668a0dd5429aadaf6cee044724681795/orjson-3.12.0-cp315-cp315-manylinux_2_39_armv7l.whl", hash = "sha256:33efefcf5d88eaf400b47e2eba02f91f319bb9951be61ca500b7d536d3f2079d", size = 113327, upload-time = "2026-08-14T16:13:18.927Z" }, + { url = "https://files.pythonhosted.org/packages/51/5c/d17f61581d8dbdde7048f87a330fa24915edec38db4d72b381fec14fbb56/orjson-3.12.0-cp315-cp315-manylinux_2_39_i686.whl", hash = "sha256:8e386b0bc0ddd7cd2056f884b5a0af33592bd01ac66a7ca4b42a65a7e7774a13", size = 130105, upload-time = "2026-08-14T16:13:20.317Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b7/938befcf33bee4704a92ecec6a2731224c539d939bf9429fd39396d28931/orjson-3.12.0-cp315-cp315-manylinux_2_39_x86_64.whl", hash = "sha256:58c58e1de0006ffb580368d6793c36c7b0b021db066479cf281bf5061e732328", size = 131049, upload-time = "2026-08-14T16:13:21.719Z" }, + { url = "https://files.pythonhosted.org/packages/b0/15/cfa2021d64d5aa8bb5c9f604ef375e00ec8b657651b5dd650b1b7ad13df1/orjson-3.12.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:08231552159be266a7269555bd9f7c016aee7d9ad6dab06eb58796c5ccb7101c", size = 135320, upload-time = "2026-08-14T16:13:23.415Z" }, + { url = "https://files.pythonhosted.org/packages/1a/50/3e75dfe357c1e8f9e287c7a5740260ef15bd23a5299eae8d0835dcad5375/orjson-3.12.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:a15f9a891bce5f5cc5d210e3ad8614d4d1b489a56448c099d6d2a7168b2d954a", size = 127488, upload-time = "2026-08-14T16:13:24.791Z" }, + { url = "https://files.pythonhosted.org/packages/11/a6/79aed402eb3ab284dc5b4791a7ad62c5875127de01b8e3f04bd92d551298/orjson-3.12.0-cp315-cp315-win32.whl", hash = "sha256:03091c8a64db4be38746597ceea68f33c238e27acd9bfe99fb59420224ae7a55", size = 128048, upload-time = "2026-08-14T16:13:26.217Z" }, + { url = "https://files.pythonhosted.org/packages/64/f7/2723e264aab7248c1ed6ecaad8e5d0cb866c0cffde75442102ffa7491aba/orjson-3.12.0-cp315-cp315-win_amd64.whl", hash = "sha256:2b7bcefb9f40fa242fa6b06377232c048e655747790829609168c01162f60578", size = 121860, upload-time = "2026-08-14T16:13:27.577Z" }, + { url = "https://files.pythonhosted.org/packages/82/56/630c9113ec8996778f1f0304b364b091b9a9db5fef5fdc17cca622f5ea24/orjson-3.12.0-cp315-cp315-win_arm64.whl", hash = "sha256:859fc4196855890150bb08e649b30d2c93b249b3e3edd0d3bb2231abf8aa8adc", size = 126754, upload-time = "2026-08-14T16:13:28.962Z" }, ] [[package]] @@ -3196,11 +3420,11 @@ wheels = [ [[package]] name = "packaging" -version = "26.2" +version = "26.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, ] [[package]] @@ -3317,20 +3541,20 @@ wheels = [ [[package]] name = "pkginfo" -version = "1.12.1.2" +version = "1.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/03/e26bf3d6453b7fda5bd2b84029a426553bb373d6277ef6b5ac8863421f87/pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b", size = 451828, upload-time = "2025-02-19T15:27:37.188Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/ad/97538d5a1041d8d3ba155075b0b35248cf8538e1f1ec764f1d117962b01d/pkginfo-1.13.tar.gz", hash = "sha256:4f70471c643f71fe84a06230c0e33c5c5b12a33b2fd21bff14ddaef5a974adb1", size = 453525, upload-time = "2026-08-30T02:45:07.804Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/3d/f4f2ba829efb54b6cd2d91349c7463316a9cc55a43fc980447416c88540f/pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343", size = 32717, upload-time = "2025-02-19T15:27:33.071Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/2e9e8a7bb014758af9453b3d818848d50852592296aceb8817f2a937fa71/pkginfo-1.13-py3-none-any.whl", hash = "sha256:37e1bfb7b5b149829e6f140a225b517c4c8808d8d164f68137b9492023874061", size = 32769, upload-time = "2026-08-30T02:45:06.55Z" }, ] [[package]] name = "platformdirs" -version = "4.10.0" +version = "4.11.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/18/f3bb8ef0d3b930692343da8aa4d3cbcd6749477c053959395ac81965a6e9/platformdirs-4.11.8.tar.gz", hash = "sha256:f23abafea7dd4276d1f29104b83598d7dcc567cafd07c9c951e66665645437fc", size = 37182, upload-time = "2026-09-08T22:20:42.866Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, + { url = "https://files.pythonhosted.org/packages/f4/e1/5b7b8bbb55084d1425bcb9bc823ff519e1b2be05f6ebb0089e2eacc38413/platformdirs-4.11.8-py3-none-any.whl", hash = "sha256:52f2f181bbfde907966932cc8312d967d02976422d66d537ea16092b8e291081", size = 24027, upload-time = "2026-09-08T22:20:41.537Z" }, ] [[package]] @@ -3344,157 +3568,174 @@ wheels = [ [[package]] name = "prompt-toolkit" -version = "3.0.52" +version = "3.0.53" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/ea/39b988c938f75cb75d7045b5c69f8bfed47ee2152c8837fb403de29d6fb8/prompt_toolkit-3.0.53.tar.gz", hash = "sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6", size = 435492, upload-time = "2026-07-26T20:56:14.758Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, + { url = "https://files.pythonhosted.org/packages/54/6f/84908cad2d6aa5144abcf7b42709fe4fdb459bc640ec7ac5786e7693dabc/prompt_toolkit-3.0.53-py3-none-any.whl", hash = "sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2", size = 392288, upload-time = "2026-07-26T20:56:12.512Z" }, ] [[package]] name = "propcache" -version = "0.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/56/030b7b4719d53085722893e0009dffb9236aa10bca1b12121bdc5626ef16/propcache-0.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a81be28596d6559f6131ef33e10200de6e17643b3c74ce03f9eb103be6ae8b", size = 93417, upload-time = "2026-05-08T20:59:15.597Z" }, - { url = "https://files.pythonhosted.org/packages/1a/55/1140a8e067b8ec093a18a4ae7bb0045d9db65da38a08618ddc5e2f1994aa/propcache-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29cbaac5ea0212663e6845e04b5e188d5a6ae6dd919810ac835bf1d3b42c3f4c", size = 53847, upload-time = "2026-05-08T20:59:17.096Z" }, - { url = "https://files.pythonhosted.org/packages/20/42/0e7443c90310498561addf346e7d57fe3c6ba1914e1ba938b5464c7bbfd2/propcache-0.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bf3be92233808fcd338eba0fb4d0b59ec5772af4f4ecfcec450d1bfc0f8b5eb", size = 53512, upload-time = "2026-05-08T20:59:18.64Z" }, - { url = "https://files.pythonhosted.org/packages/b7/db/cf51a71bab2009517d1a7f0ee07657e3bd446c4d69f67e6966cf17bcf956/propcache-0.5.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f8ea531c794b9d6274acd4e8d2c2ebcac590a4361d27482edd3010b79f1325e", size = 58068, upload-time = "2026-05-08T20:59:20.683Z" }, - { url = "https://files.pythonhosted.org/packages/b7/43/39b6bdee9699fa1e1641c519feeb64a67e2a9f93bb465c70776b37a7333f/propcache-0.5.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:decfca4c79dd53ebab484b00cc4b6717d8c369f86e74aa4ca395a64ac651495e", size = 61020, upload-time = "2026-05-08T20:59:22.112Z" }, - { url = "https://files.pythonhosted.org/packages/26/0b/843726fbb0a29a8c5684fdb25971823638399f31e52e9d1f06a02dc9aa6b/propcache-0.5.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4621064bbf28fa77ff64dd5d94367c04684c67d3a5bf1dff25f0cd0d98a38f3b", size = 62732, upload-time = "2026-05-08T20:59:23.805Z" }, - { url = "https://files.pythonhosted.org/packages/39/6e/899fed76dc1942b8a64193a4f059d7f1a2c7ef65085e8a9366ed8ec0d199/propcache-0.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b96db7141a592cbc968daf1feea83a118e6ab378af4abbc72b248c895414c22d", size = 60140, upload-time = "2026-05-08T20:59:25.389Z" }, - { url = "https://files.pythonhosted.org/packages/ab/09/3da4be9b5b879219ad234aa535b3dd4a080ed1ad48d3a73ca07a9e798f22/propcache-0.5.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ca071adabaab6e9219924bbe00af821f1ee7de113a9eca1cdc292de3d120f4d", size = 60400, upload-time = "2026-05-08T20:59:27.238Z" }, - { url = "https://files.pythonhosted.org/packages/60/2f/09b72b874a9aa0044faf52a69807a6ed618e267ceaa9ec4a63195fa5b504/propcache-0.5.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e4294d04a94dcab1b3bccd8b66d962dcad411a1d19414b2a41d1445f1de32ad0", size = 58155, upload-time = "2026-05-08T20:59:28.48Z" }, - { url = "https://files.pythonhosted.org/packages/8a/37/97489848c54c95578045473954f10956d619ce6a09e7ac137b71cdcb698b/propcache-0.5.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a0e399a2eccb91ed18721f86aa85757727400b6865c89e88934781deb9c8498b", size = 57037, upload-time = "2026-05-08T20:59:30.146Z" }, - { url = "https://files.pythonhosted.org/packages/22/db/6c695285ccfc49012743ee9c98212b8c5dd0aed7b63cfd816d4a0f7a1601/propcache-0.5.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:823581fd5cb08b12a48bfa11fe962a7916766b6170c17b028fbdf762b85eb9bf", size = 61103, upload-time = "2026-05-08T20:59:31.626Z" }, - { url = "https://files.pythonhosted.org/packages/98/a9/1e500401ca593b0bdb6bf75a70bc2d723835fd53360edff6af70692c7546/propcache-0.5.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:949c91d1a990cf3b2e8188dfcfb25005e0b834a06c63fa4ef9f360878ce21ecf", size = 60394, upload-time = "2026-05-08T20:59:32.829Z" }, - { url = "https://files.pythonhosted.org/packages/1f/87/f638b6e375eae0f30a1a2325d8b34fd85fdc785bb9960cf805f3bf1ec69a/propcache-0.5.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:cc1177027eda740fdb152706bd215a3f124e3eea15afc39f2cb9fe351b50619e", size = 63084, upload-time = "2026-05-08T20:59:35.964Z" }, - { url = "https://files.pythonhosted.org/packages/f6/18/884573f5d97b6d9eba68de759a82c901b7e39d7904d30f7b8d58d42d2a12/propcache-0.5.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b05d643f944a8c3c4bd86d65ffd87bf3264b617f87791940302bc474d2ff5274", size = 60999, upload-time = "2026-05-08T20:59:38.481Z" }, - { url = "https://files.pythonhosted.org/packages/8f/1a/c3915eb059ceec9e758a56e4cfd955292bc0f201be2176a46b76d94b303a/propcache-0.5.2-cp310-cp310-win32.whl", hash = "sha256:8114f28879e0904748e831c3a7774261bd9e75f49be089f389a76f959dcd13fe", size = 39036, upload-time = "2026-05-08T20:59:40.323Z" }, - { url = "https://files.pythonhosted.org/packages/5b/02/1dfd5607501a602d19c1c449d2d193b7d1c611f9246b4059026a1189a80e/propcache-0.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:5fcb98e7598b1ee0addab320d90f65b530297a867dbfe9de52ea838077e16e3d", size = 42190, upload-time = "2026-05-08T20:59:42.232Z" }, - { url = "https://files.pythonhosted.org/packages/57/93/f71588ad08b3e6f4b555b5ef215808a3c02b042d0151ad82fa6f15be677a/propcache-0.5.2-cp310-cp310-win_arm64.whl", hash = "sha256:04dc2390d9edbbaef7461f33322555976ffddf0b650a038649d026358714e6c5", size = 38545, upload-time = "2026-05-08T20:59:44.087Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f1/8a8cc1c2c7e7934ab77e0163414f736fadbc0f5e8dd9673b952355ac175b/propcache-0.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74b70780220e2dd89175ca24b81b68b67c83db499ae611e7f2313cb329801c78", size = 90744, upload-time = "2026-05-08T20:59:45.799Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f4/651b1225e976bd1a2ba5cfba0c29d096581c2636b437e3a9a7ab6276270a/propcache-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4840ab0ae0216d952f4b53dc6d0b992bfc2bedbfe360bdd9b548bc184c08959", size = 52033, upload-time = "2026-05-08T20:59:47.408Z" }, - { url = "https://files.pythonhosted.org/packages/15/a8/8ede85d6aa1f79fc7dc2f8fd2c8d65920b8272c3892903c8a1affde48cfb/propcache-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6844ba6364fb12f403928a82cfd295ab103a2b315c77c747b2dbe4a41894ea7", size = 52754, upload-time = "2026-05-08T20:59:49.202Z" }, - { url = "https://files.pythonhosted.org/packages/7d/fe/b3551b41bbc2f5b5bb088fc6920567cd43101253e68fbaa261339eb96fe1/propcache-0.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2293949b855ce597f2826452d17c2d545fb5622379c4ea6fdf525e9b8e8a2511", size = 57573, upload-time = "2026-05-08T20:59:50.778Z" }, - { url = "https://files.pythonhosted.org/packages/83/27/ab851ebd1b7172e3e161f5f8d39e315d54a91bea246f01f4d872d3376aef/propcache-0.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0fd59b5af35f74da48d905dcbad55449ba13be91823cb05a9bd590bbf5b61660", size = 60645, upload-time = "2026-05-08T20:59:52.227Z" }, - { url = "https://files.pythonhosted.org/packages/95/7d/466b3d18022e9897cbda9c735c493c5bd747d7a4c6f5ea1480b4cec434b6/propcache-0.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29f9309a2e42b0d273be006fdb4be2d6c39a47f6f57d8fb1cf9f81481df81b66", size = 61563, upload-time = "2026-05-08T20:59:53.866Z" }, - { url = "https://files.pythonhosted.org/packages/27/1b/16ab7f2cf2041da2f60d156ba64c2484eadf9168075b4ff43c3ef60045af/propcache-0.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5aaa2b923c1944ac8febd6609cb373540a5563e7cbcb0fd770f75dace2eb817b", size = 58888, upload-time = "2026-05-08T20:59:55.457Z" }, - { url = "https://files.pythonhosted.org/packages/0a/67/bb777ffd907633563bf35fd859c4ce97b0512c32f4633cf5d1eb7c33512b/propcache-0.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66ea454f095ddf5b6b14f56c064c0941c4788be11e18d2464cf643bf7203ff67", size = 59253, upload-time = "2026-05-08T20:59:57.075Z" }, - { url = "https://files.pythonhosted.org/packages/b9/42/64f8d90b73fd9cdc1499b48057ff6d9cd2a98a25734c9bb62ecf07e87061/propcache-0.5.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:95f1e3f4760d404b13c9976c0229b2b49a3c8e2c62a9ce92efdd2b11ada75e3f", size = 57558, upload-time = "2026-05-08T20:59:58.602Z" }, - { url = "https://files.pythonhosted.org/packages/eb/02/dba5bc03c9041f2092ea55a449caf5dfe68352c6654511b29ba0654ddb69/propcache-0.5.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85341b12b9d55bad0bded24cac341bb34289469e03a11f3f583ea1cc1db0326c", size = 55007, upload-time = "2026-05-08T20:59:59.837Z" }, - { url = "https://files.pythonhosted.org/packages/14/c0/43f649c7aa2a77a3b100d84e9dea3a483120ecb608bfe36ce49eaff517fe/propcache-0.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:26a4dca084132874e639895c3135dfad5eb20bae209f62d1aeb31b03e601c3c0", size = 60355, upload-time = "2026-05-08T21:00:01.144Z" }, - { url = "https://files.pythonhosted.org/packages/83/c0/435dafd27f1cb4a495381dae60e25883ccfe4020bb72818e8184c1678092/propcache-0.5.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3b199b9b2b3d6a7edf3183ba8a9a137a22b97f7df525feb5ae1eccf026d2a9c6", size = 59057, upload-time = "2026-05-08T21:00:02.401Z" }, - { url = "https://files.pythonhosted.org/packages/53/ae/6e292df9135d659944e96cb3389258e4a663e5b2b5f6c217ef0ddc8d2f73/propcache-0.5.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e59bc9e66329185b93dab73f210f1a37f81cb40f321501db8017c9aea15dba27", size = 61938, upload-time = "2026-05-08T21:00:03.638Z" }, - { url = "https://files.pythonhosted.org/packages/0b/42/314ebc50d8159055411fd6b0bda322ff510e4b1f7d2e4927940ad0f6af20/propcache-0.5.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:552ffadf6ad409844bc5919c42a0a83d88314cedddaea0e41e80a8b8fffe881f", size = 59731, upload-time = "2026-05-08T21:00:04.881Z" }, - { url = "https://files.pythonhosted.org/packages/b8/9b/2da6dee38871c3c8772fabc2758325a5c9077d6d18c597737dc04dd884cd/propcache-0.5.2-cp311-cp311-win32.whl", hash = "sha256:cd416c1de191973c52ff1a12a57446bfc7642797b282d7caf2162d7d1b8aa9a0", size = 38966, upload-time = "2026-05-08T21:00:06.511Z" }, - { url = "https://files.pythonhosted.org/packages/42/4e/f17363fb58c0afe05b067361cb6d86ed2d29de6506779a27547c4d183075/propcache-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:44e488ef40dbb452700b2b1f8188934121f6648f52c295055662d2191959ff82", size = 42135, upload-time = "2026-05-08T21:00:08.088Z" }, - { url = "https://files.pythonhosted.org/packages/c6/eb/6af6685077d22e8b33358d3c548e3282706a0b3cd85044ffba4e5dd08e3b/propcache-0.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:54adaa85a22078d1e306304a40984dc5be99d599bf3dc0a24dc98f7daeab89ab", size = 38381, upload-time = "2026-05-08T21:00:09.692Z" }, - { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" }, - { url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654, upload-time = "2026-05-08T21:00:12.604Z" }, - { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" }, - { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" }, - { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" }, - { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" }, - { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" }, - { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" }, - { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" }, - { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" }, - { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" }, - { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" }, - { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" }, - { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" }, - { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" }, - { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" }, - { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" }, - { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" }, - { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835, upload-time = "2026-05-08T21:00:38.072Z" }, - { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" }, - { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" }, - { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" }, - { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" }, - { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" }, - { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" }, - { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" }, - { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" }, - { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" }, - { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" }, - { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" }, - { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" }, - { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" }, - { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257, upload-time = "2026-05-08T21:01:01.195Z" }, - { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" }, - { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" }, - { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" }, - { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" }, - { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" }, - { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" }, - { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" }, - { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" }, - { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" }, - { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" }, - { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" }, - { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" }, - { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662, upload-time = "2026-05-08T21:01:22.683Z" }, - { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928, upload-time = "2026-05-08T21:01:23.986Z" }, - { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650, upload-time = "2026-05-08T21:01:25.305Z" }, - { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912, upload-time = "2026-05-08T21:01:26.545Z" }, - { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300, upload-time = "2026-05-08T21:01:27.937Z" }, - { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208, upload-time = "2026-05-08T21:01:29.484Z" }, - { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633, upload-time = "2026-05-08T21:01:31.068Z" }, - { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724, upload-time = "2026-05-08T21:01:32.374Z" }, - { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069, upload-time = "2026-05-08T21:01:33.67Z" }, - { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099, upload-time = "2026-05-08T21:01:34.915Z" }, - { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391, upload-time = "2026-05-08T21:01:36.231Z" }, - { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626, upload-time = "2026-05-08T21:01:37.545Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781, upload-time = "2026-05-08T21:01:38.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570, upload-time = "2026-05-08T21:01:40.415Z" }, - { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" }, - { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" }, - { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" }, - { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395, upload-time = "2026-05-08T21:01:45.883Z" }, - { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653, upload-time = "2026-05-08T21:01:47.307Z" }, - { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914, upload-time = "2026-05-08T21:01:48.573Z" }, - { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567, upload-time = "2026-05-08T21:01:49.903Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542, upload-time = "2026-05-08T21:01:51.204Z" }, - { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845, upload-time = "2026-05-08T21:01:52.539Z" }, - { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985, upload-time = "2026-05-08T21:01:53.847Z" }, - { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999, upload-time = "2026-05-08T21:01:55.179Z" }, - { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779, upload-time = "2026-05-08T21:01:57.489Z" }, - { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796, upload-time = "2026-05-08T21:01:58.736Z" }, - { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023, upload-time = "2026-05-08T21:02:00.228Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448, upload-time = "2026-05-08T21:02:01.888Z" }, - { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329, upload-time = "2026-05-08T21:02:03.484Z" }, - { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172, upload-time = "2026-05-08T21:02:04.745Z" }, - { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" }, - { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" }, - { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/a6/9e6708e2a34a43f1070246c8d0e773e315cc4fdb598a9cdb8ff7d0c450b2/propcache-0.5.3.tar.gz", hash = "sha256:5f283fde8fd8b1944fd1a1bd11db759b55c5f190795668d5187d3e3b1165d98b", size = 59605, upload-time = "2026-09-15T19:34:31.226Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/31/15f39b3d5a0e5a5ab5589814c01d6096b826c5bf12c89d173e0af283c25d/propcache-0.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e443bc079b57cb231ed45a8a55879a868bf56449ca7a719e58988375f828d8d", size = 105793, upload-time = "2026-09-15T19:31:10.732Z" }, + { url = "https://files.pythonhosted.org/packages/f3/33/6cb0fe6d941a48f230d3f738dcd4446b3f203467eedd613f12dd822f2c05/propcache-0.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3ecda25c86ee7500b5348cb1e8831ee4324daa45ec7e24265808121537c85bbe", size = 61275, upload-time = "2026-09-15T19:31:12.271Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/876cf5ab7ecd9d7cbc0b0a8303e76c7a08f03c85546a977252cec63e7dd7/propcache-0.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:31239c475a43568c0d64d5e10208f449e004ff4894458507fed5ce53403ac3a2", size = 61027, upload-time = "2026-09-15T19:31:13.529Z" }, + { url = "https://files.pythonhosted.org/packages/49/f7/bad2d624bbef5334d6a95cacc51ea19ffcfe5ab247feb0dad42360d80ed3/propcache-0.5.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5867f7d672f239fe70569c947a4453ed44f82c166ff08d4abf6cf7350d9a4b12", size = 65979, upload-time = "2026-09-15T19:31:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9b/86bdd60d69fbed833a950021880dd7eac9e2370cc2aa77b175921765dcb1/propcache-0.5.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:544f08889abce275a77b27add29cdaa87a36e6ce6abeffcb4e87b4e29c577711", size = 69600, upload-time = "2026-09-15T19:31:16.344Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9e/a39aa4a7590513ae5b4fe17d27bc56f12226991fb1043448a1766c07ecff/propcache-0.5.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:58515aacf6ba8ad47a0b072ff2a27ccb39d7691ed9101636e6b5e151758b11c0", size = 71612, upload-time = "2026-09-15T19:31:17.799Z" }, + { url = "https://files.pythonhosted.org/packages/a9/74/c94d53224f485d4caffc76b0c4d72cf536e8c3ae54ff05fd981870fca20b/propcache-0.5.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e61294a7d9b07a79b3c670dbceaa4aca37542e68cdf9411e04ed81cabb2f62a5", size = 68680, upload-time = "2026-09-15T19:31:19.124Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c8/10a254addc11ec17d1ec8632fe3fe32cf1c27f294c0c5bb69c80163a0fd7/propcache-0.5.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1956d7e98f2150e4b0aae71dccf61fb5628208c63d57e2dafae68301fe8e1a36", size = 68716, upload-time = "2026-09-15T19:31:20.849Z" }, + { url = "https://files.pythonhosted.org/packages/0b/aa/f1ef19e2619138fb4877322e5b90e421fe249a41ed8703eda6b5bfd38bed/propcache-0.5.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:79af5bf10e5a631ba601c33f379e37e64f036c55e60a99254ec55ab4678d268b", size = 66324, upload-time = "2026-09-15T19:31:22.251Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0d/d6317dd9f162155bbae2c96d4953ec91750e21d0b0c55fc9e6331a3e9946/propcache-0.5.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:400db553b2a2af6ea41ff3b6d5972fe493180fd519c1d001c9581fd446bdc150", size = 64356, upload-time = "2026-09-15T19:31:23.516Z" }, + { url = "https://files.pythonhosted.org/packages/59/58/720013e4b55b0463d6ffdb43905749dcfa82b37538e4454f2712b7eb6eb1/propcache-0.5.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0275013737080d5d113be6927ca6055a3e393a9d95f81667c4bdb927915aac2a", size = 69971, upload-time = "2026-09-15T19:31:24.793Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a1/555d3e8512f0237bef9e4e9689486a0016395f5d6eb8c18d007eea132914/propcache-0.5.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c2fd56f3b358f07e4fefcf54942f20f64e905db63dff8fddf0c67730c748b3d1", size = 69169, upload-time = "2026-09-15T19:31:26.075Z" }, + { url = "https://files.pythonhosted.org/packages/88/c2/aa489e3461b19d23316ffc731c2cf08593074716047f3948104b8f2e5771/propcache-0.5.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8e507119af1a2d417d75ebe202bc0a2a282ad0a3e6cf38f447a6cad0a2c5263e", size = 72145, upload-time = "2026-09-15T19:31:27.776Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d4/8fef5ad7b826b0a797a3c8814b9cea768350a79171619aae64cb7f8f8ade/propcache-0.5.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d8a41e6f549e8bc13dc7b4987f5e96097bc2fefc66b682b3947a8e959f75a9c7", size = 69799, upload-time = "2026-09-15T19:31:29.152Z" }, + { url = "https://files.pythonhosted.org/packages/30/88/6c0d9681b890f06f8f1a0398db146305c5d1cae3cb6e057f13fdf6d9a8ff/propcache-0.5.3-cp310-cp310-win32.whl", hash = "sha256:e8e6acf498ee3d0a5c2a8468e23af7acb017c5b219b29e302af2636818d3830e", size = 42892, upload-time = "2026-09-15T19:31:30.411Z" }, + { url = "https://files.pythonhosted.org/packages/d6/eb/80d6c0c02d77f397cfbe29b925e99cd31da82302a7b7c9fafc3d255aa7a7/propcache-0.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:09513990e2f33c9de838f0ab11b62660b3ea225000945d10143007e51539088c", size = 46383, upload-time = "2026-09-15T19:31:31.661Z" }, + { url = "https://files.pythonhosted.org/packages/84/7d/a28f2159ff4b2abf0933b57aabcabc35199ce576e95f7767828115fae446/propcache-0.5.3-cp310-cp310-win_arm64.whl", hash = "sha256:5964c7e2f632facc552ab0e163cac05e1ce42acba20b4b24d445139629ed7625", size = 43775, upload-time = "2026-09-15T19:31:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/53/38/86c26c9ca46dbb0a8e358fe5f6f64eaf1b9c1ec15a25bac99687b1f2b997/propcache-0.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b7edbbf2d9ba5829663dbc83cdb6e2b13bc80cd36f0bf185419dcbbb4930af7e", size = 101935, upload-time = "2026-09-15T19:31:34.296Z" }, + { url = "https://files.pythonhosted.org/packages/a5/86/0af2f86eb650688f130540370f9f63ec6f4eeaee1e445d4b751218a393ca/propcache-0.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d2c6ccfcc810ac7f8782593934fa2215669a401ef43fcae5a8cab80ce4754a46", size = 58723, upload-time = "2026-09-15T19:31:35.596Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2c/6c19622bb80010a27a61906b5784e2d74d6c9123817ea6b767a6d87976aa/propcache-0.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f1723f7a060a20eb1f9971fa69c9931b5ebd253bef8baaa48a1cbd1c01c7bb7", size = 59403, upload-time = "2026-09-15T19:31:36.979Z" }, + { url = "https://files.pythonhosted.org/packages/48/8e/ae67665ada0f286937969ff533163463b0878c3ef10da41a6a0c8866a2b3/propcache-0.5.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba1ae9d55025434790882c2f1be727e725ccef83876a112af52247c7ed7ce321", size = 64788, upload-time = "2026-09-15T19:31:38.433Z" }, + { url = "https://files.pythonhosted.org/packages/43/32/b88254ef0a905130a75bf6064f9f7e2c0cce393532eef1b0403d2510bf76/propcache-0.5.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30f9d52fdd02a216601f588e5659dd39cb7d2a0ef59935d33c5077718201f8da", size = 68497, upload-time = "2026-09-15T19:31:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/73/83/f83923a9ff7019a796b8e254b92e44c4e2d948b69d27b5f7a77a42825a79/propcache-0.5.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0fdd72f694faf2b34907484b53e5df7ae6b5dad6a6e03564c6b872ccebb80a7d", size = 69757, upload-time = "2026-09-15T19:31:41.076Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9a/8e712d5f024cdad823fac81590781e39004cdf6479204480cba5195ba7ca/propcache-0.5.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35de8d67f6b6a3830f845ee7cd3ae47189d7dd66088aff9dfd1fe50f5bda5a60", size = 66560, upload-time = "2026-09-15T19:31:42.439Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/5b15626d8b262fe06de4dbfa606c5ec30dc46771e67c4be7a87d0e7450ec/propcache-0.5.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:377011845a2b1a8b11ab2ca33547aea1320d6f70c015bafe26486f0882dc49fb", size = 66926, upload-time = "2026-09-15T19:31:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/58/b3/08e128e0a6a1fb972329eb4c32f4ea7cdbfc9cf5ca98ddcd47f98e65bbba/propcache-0.5.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2537fa4f56c12fa897f9371e4e5910417aa49ff916a7dc549a22061b46d33355", size = 65084, upload-time = "2026-09-15T19:31:45.276Z" }, + { url = "https://files.pythonhosted.org/packages/82/c1/c3e6fb2ef1b4ba095bfc314872af85e29c1872a7abc864f6ac4c8724b321/propcache-0.5.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3eb545ffc0db5c86e83ba1aec3616efbaac9c22f05daff095005472874c12e91", size = 61798, upload-time = "2026-09-15T19:31:46.802Z" }, + { url = "https://files.pythonhosted.org/packages/0e/97/6ec9a8d3c56b04301a1b3322c572eb23add5713465cbf586b179b6fb6c4d/propcache-0.5.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:023d4e58beeb0865cfc62e2e14bf4ed30e21dfc20ce16ac24fb05516a09e1d18", size = 68920, upload-time = "2026-09-15T19:31:48.135Z" }, + { url = "https://files.pythonhosted.org/packages/19/db/dbeadc6464bb2e3d070b651810475917a098d6a9bb05952b99e6ee59028a/propcache-0.5.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:d693b78ecb4df14b3aa636d9c2a40e5ab3b4f81a3bb569fddc2b28299f1ff0d1", size = 67310, upload-time = "2026-09-15T19:31:49.476Z" }, + { url = "https://files.pythonhosted.org/packages/2f/98/0be1b55e560637d9535bebc0e6bba9ee9a37ceb6d9e287285b6c89aaf0a4/propcache-0.5.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a5ea7cf6d6a0b67a64e6744219265bc5406d827ca3b46ae2d748c3aaa1d5e1d2", size = 70310, upload-time = "2026-09-15T19:31:51.164Z" }, + { url = "https://files.pythonhosted.org/packages/72/a3/5802eb8e956deb74fb141c625246f5ecb3a4bf13819cef4fd864045fd204/propcache-0.5.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:66be2cef41263d823517ee617d19fd105a70ff58a0776e5e47cfde1196bfa2f2", size = 67819, upload-time = "2026-09-15T19:31:52.627Z" }, + { url = "https://files.pythonhosted.org/packages/21/10/b7fc0d26af8b408ca6830ff0fa0138134522a38e29f00c4a9ff1366fd6d6/propcache-0.5.3-cp311-cp311-win32.whl", hash = "sha256:d8eed2e84204b4402407a5d1ca124cb653b9a6ba2fc01ce1ef1071a75ac9e176", size = 42545, upload-time = "2026-09-15T19:31:54.141Z" }, + { url = "https://files.pythonhosted.org/packages/71/40/0bb6635fbb008072e60b5b0cd297020a1e2ef4fbc0be82dfd00018a6ce1a/propcache-0.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:e01abf74acc057c0ef8533d5688a2bed25923cf05c450a0d82229fa538cf83c1", size = 46061, upload-time = "2026-09-15T19:31:55.617Z" }, + { url = "https://files.pythonhosted.org/packages/53/bf/c6b79fbb41b4be2fec8164efadc9bdf61733acf442fe0394e8d811f03faf/propcache-0.5.3-cp311-cp311-win_arm64.whl", hash = "sha256:ba7220f33a3df68245b09bc519e2c3f9f5c4123ea68f007c11529ecac8615200", size = 43338, upload-time = "2026-09-15T19:31:56.888Z" }, + { url = "https://files.pythonhosted.org/packages/8a/19/95cd33200f38330a530043ec9507658fe9d9fa3430e655ad5102c51fe844/propcache-0.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eeb4e5a10149960ed021b8e35fa22440e106db6322a9f5249ad8992f38855ceb", size = 107641, upload-time = "2026-09-15T19:31:58.423Z" }, + { url = "https://files.pythonhosted.org/packages/47/92/9d7b7d8b672713d707f558baf9e93aa09e004df11f8556b21f358c0f26f2/propcache-0.5.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b09edf2908fa5f0ba84fdb9c1bc6f346945b51541013ac29b12d20218f213279", size = 61724, upload-time = "2026-09-15T19:32:00.016Z" }, + { url = "https://files.pythonhosted.org/packages/1a/f8/fc917bcc8e9a250e1029c84f748ea44136b026285380ad938c79fca941ed/propcache-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2db81e15c4e0171ad26845b67a1e295ba446e717e47fefaf47f22ae0b2eca71e", size = 62359, upload-time = "2026-09-15T19:32:01.399Z" }, + { url = "https://files.pythonhosted.org/packages/50/39/2a7b447eeaf25b496cb03464cf2c2d1d723326a90a193f01301daaf1fde6/propcache-0.5.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50079e8be4f1bc33e8265f35fbe6449017901db626bc6b735181568c4bfb5e73", size = 67387, upload-time = "2026-09-15T19:32:02.753Z" }, + { url = "https://files.pythonhosted.org/packages/30/a2/bc65fc386140c365020d42bc242965840301574667dfc2d8c01df9b897a3/propcache-0.5.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8ea844a859c3060a44485c4e842df3ead69ca98ca5550594757aac11dfef30d", size = 71287, upload-time = "2026-09-15T19:32:04.073Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4b/a9663f0c5d41dd4eb8126c5a9ac6db611a2ea255e9d018fd4646d70cd8c5/propcache-0.5.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8ec76f86ec2de069358d896c468be3c1cb3b5ed049e3cec3ecb3015806313606", size = 72425, upload-time = "2026-09-15T19:32:05.413Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a7/51527af80ea187202dfc2f54346e057f931629da45d4f236923a05312635/propcache-0.5.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a36f13d838accaa887f9e54af4866ae344a51eb59b99dbd6cfeee701fc98ff", size = 69257, upload-time = "2026-09-15T19:32:06.806Z" }, + { url = "https://files.pythonhosted.org/packages/1d/73/453ec5ad092af7192eac503b2bf34dfaf9260b5530227effb507f8ade5fd/propcache-0.5.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1a536910fbd2f4ea76acd6b1b50708ce602a27673ef5e5b2c8ba373c2f5127cf", size = 69602, upload-time = "2026-09-15T19:32:08.128Z" }, + { url = "https://files.pythonhosted.org/packages/43/f0/b8d0bfcd1e0c119c9517b6d899c3e40cad922d5562b331c2b6ab75d5b5ea/propcache-0.5.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f95a390defc963a5543012685b57eb9cd47078f50c4a3bb5c5cd7719c4175112", size = 68232, upload-time = "2026-09-15T19:32:09.51Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8e/c3e28a31bfee8af59a3ad395abcb4c26d1419c76ba66ed130af5b08affb6/propcache-0.5.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1d617a68a5f383855af3eec608ddd98dd3b964184011f20755a4e34acb194a5d", size = 63852, upload-time = "2026-09-15T19:32:11.214Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/daf5862749343c370c2bbe03fec56b9b6ee9303dee75de0c0c8a206c441d/propcache-0.5.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:28afdbaf9f1bf34bc719e0381a4699705990c59f412e43ff25f91a01ff6676af", size = 71747, upload-time = "2026-09-15T19:32:12.583Z" }, + { url = "https://files.pythonhosted.org/packages/1f/2e/67195152e896f4d4c1fb2b895f57d006af1a64874b683f657c376bd04437/propcache-0.5.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:014cec8c711df6f22e0a50cfcb3e98d3d659856daa75e9dc2f1e206204027519", size = 69996, upload-time = "2026-09-15T19:32:13.927Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8b/cf6fb2c5d7926961f4ed299c028682b990f03aa64c02fcfc8152f0017b92/propcache-0.5.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ae72c39267ffc08bab9239fbdef5fb8bb0fc410f141b1ed283f0dd349b8bcdb0", size = 73339, upload-time = "2026-09-15T19:32:15.295Z" }, + { url = "https://files.pythonhosted.org/packages/1b/02/b201363ea0ef1cc0802219d1d09391fe7bee5494f763c7a6287706b73be0/propcache-0.5.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:22e8849a90d46d920469eacc52cf28dbfce9d9dc7fb0ee36ba3aa4b117fc8311", size = 70601, upload-time = "2026-09-15T19:32:16.632Z" }, + { url = "https://files.pythonhosted.org/packages/91/fc/86d959759bbf09ef491c4d7724697791efc5b794f2f69a10b91bb6848ac3/propcache-0.5.3-cp312-cp312-win32.whl", hash = "sha256:71dbe01ca877ca1c7d61f0f83b71f2c994554ef52983fe7c6400d9c483c477cb", size = 42868, upload-time = "2026-09-15T19:32:17.905Z" }, + { url = "https://files.pythonhosted.org/packages/bb/16/66349cab3026e04089ca0a2d15818e4294f2af2b503c70f8d6afb91ac95b/propcache-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:2367fbfaf980a0ac082c64b53ae669ee704515134a28cd8c680642bd90a2ddd5", size = 45985, upload-time = "2026-09-15T19:32:19.487Z" }, + { url = "https://files.pythonhosted.org/packages/38/a0/52010d061ef73dfe337f9ecee1104efeffdc809eabcbe211b39c1b527ac7/propcache-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:646d9d567fdc8f1f8ab3e785f8702175a9212ea3432af2506f2f914f21c3ae16", size = 42870, upload-time = "2026-09-15T19:32:20.872Z" }, + { url = "https://files.pythonhosted.org/packages/be/e1/3fdd6a4e3e0f4894e08b8c64bb91940b5f22d69157e002905e8ca5d47c1e/propcache-0.5.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ef59cf75b4d63fed6308d933db810b05f0738925b1470b6caad88afed597c7b1", size = 106256, upload-time = "2026-09-15T19:32:22.269Z" }, + { url = "https://files.pythonhosted.org/packages/22/51/6d20cdebe03e14b451125873f38cb99f4fd9bcc86a43aa2333e0427b40c7/propcache-0.5.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f10fce5b91adc67a566817365381279b6f4f3b19fbb58eacd2ab8d045e75492", size = 61068, upload-time = "2026-09-15T19:32:23.6Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1b/bba8c2e6be2ea5d3c0da03ed2f3e1e52fd7b1c34266d15316f41e71d4d17/propcache-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc469f68cc978501b6ec69b49f67738ae099064002d0bea283c491d086e93a27", size = 61578, upload-time = "2026-09-15T19:32:24.886Z" }, + { url = "https://files.pythonhosted.org/packages/bd/b7/78f830a753cad2d625da3238a7896fad9a570db3987f37abe4d25c02159e/propcache-0.5.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f683f8eac4e695c48a3e24a7347b392322219b6a99351d7b6bf70c9ef2262126", size = 67218, upload-time = "2026-09-15T19:32:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ab/a4be2dcf937362273ec6a4950e4d3f7895051c029b49e3e6661b1e479f2b/propcache-0.5.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9fc1d60bc45efd3b1440a17e4a7eea268d34c22eb30ccec10246b5b6833a603c", size = 71126, upload-time = "2026-09-15T19:32:27.732Z" }, + { url = "https://files.pythonhosted.org/packages/20/52/9a050a3e4892f368e5e869b60db79c36b67273df215a3fa264168868b2b8/propcache-0.5.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:384ae10f8d6595595361566f9073578c131b1eb7c651bce5d78c2c0d411a221f", size = 72255, upload-time = "2026-09-15T19:32:29.356Z" }, + { url = "https://files.pythonhosted.org/packages/d9/ad/16ed91ddab4277e7a86c48e074f533749d2abc52ff336668fd6693c9279d/propcache-0.5.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f18065f005006f20fde9c08d21b375d52908b72c493e9b2531dd25da89a8ef50", size = 69110, upload-time = "2026-09-15T19:32:30.661Z" }, + { url = "https://files.pythonhosted.org/packages/68/d1/680adc625ea1d0ed687c146bc5f2e301d2a6f8bc29667b493308ad173758/propcache-0.5.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2c73e4520974b55081770703be7066d3b346db16abe399148a154be0f9f92c81", size = 69413, upload-time = "2026-09-15T19:32:32.008Z" }, + { url = "https://files.pythonhosted.org/packages/ac/b6/5c4a31c229d682941145a700d60af9acd87e852ffcae5263b2320da8bb4c/propcache-0.5.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0e55ddb8404887d1bffb0937287cc27c98a0f1a4b91453b21b9d5c9df0743377", size = 68181, upload-time = "2026-09-15T19:32:33.616Z" }, + { url = "https://files.pythonhosted.org/packages/fa/be/52cbc9f55f13d958dcd3779c6e7723f138412b669663239d5e28d67b7a5f/propcache-0.5.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5b90847530d99dfc9ab31a6b4432fe92ad9868630b45acac21bb08468ea82614", size = 63767, upload-time = "2026-09-15T19:32:35.586Z" }, + { url = "https://files.pythonhosted.org/packages/66/86/a66817d3c0430a4f04752a70b94f5b501115d76d362ed8c65d49954c1da5/propcache-0.5.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c71593d15b601f785e4f0362822d3101b999e4a696210281e83e035abb8c33ba", size = 71664, upload-time = "2026-09-15T19:32:37.078Z" }, + { url = "https://files.pythonhosted.org/packages/59/42/b7446429cbf09ee650439808d18168a126b5ae7d8b48f248e967af76ad34/propcache-0.5.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d3f6e1a3a0efc4ea71b8dd4310c4c5693686ad0c3b4c657beafea3aaf6a28428", size = 69846, upload-time = "2026-09-15T19:32:38.587Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ec/33deac3625109d26dcf7a44a6baec04e3eea26b2ec67cc0cf43577ea218e/propcache-0.5.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:45115e5e32fcc253de3f14633ca1c982239c9ba37ba41ca45a7e30b3afeb3b77", size = 73087, upload-time = "2026-09-15T19:32:39.925Z" }, + { url = "https://files.pythonhosted.org/packages/2a/26/8a38e5c9bd3d7bbd35337fc254b621fcdaa6b95b20dcf5079174ffd198e9/propcache-0.5.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7d377c2e8ddd7b7254c3ec6b23275bfb9d307a32bef017ba7dc94b94f45c509", size = 70523, upload-time = "2026-09-15T19:32:41.588Z" }, + { url = "https://files.pythonhosted.org/packages/00/6a/3d11b88ec9ff7beafd8af716200864e797fc3066c4bc1927b1f1a06d1376/propcache-0.5.3-cp313-cp313-win32.whl", hash = "sha256:442d4a18df8be3ceff91bcd8eb850c263f36726287327499c68e72482ac07b48", size = 42404, upload-time = "2026-09-15T19:32:42.993Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b2/e3bbfd99b6b6d1437a4b44719f01c6eafd1c5f6ae94fffc848d79626fefa/propcache-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:a8e2d2bb4285a5fa8e5c01465b5379abf8f244d4978855558432987ef62672f1", size = 45138, upload-time = "2026-09-15T19:32:44.263Z" }, + { url = "https://files.pythonhosted.org/packages/dc/96/c52adae597a00f2a80e57daacb4ffd0b3acc9d2767dcfe171e6c87c0939a/propcache-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:82ff2cf7bcb0c207ad1d207e1a51ea1d53aff47628729c7368c5ead6924d3b7f", size = 42206, upload-time = "2026-09-15T19:32:45.555Z" }, + { url = "https://files.pythonhosted.org/packages/d4/f3/0e98a1100344a6b067fc9813db6779f5c48266543ed4b6b847fa6ff6ee2a/propcache-0.5.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7ee15901025c40b58ee5547a7c244841701c09758f3e98ddbb0b876d96d52ad4", size = 106105, upload-time = "2026-09-15T19:32:47.004Z" }, + { url = "https://files.pythonhosted.org/packages/c0/80/f271217374190c4e58d7e9dd690bfa6c6b2b934207365dda69b86b460199/propcache-0.5.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:37e41cd6c1a27ddbbd0b556fb0c02ae8e55c41c8a122c83f1350a017f0bbc69c", size = 61085, upload-time = "2026-09-15T19:32:48.473Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bf/0e606784765a9b3f2ceb40827bb0369d810f19aef8abbd4b5bba817dcaad/propcache-0.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:04e21d1eea62765ee0306c80c61937255a5cd99c9c56d6cb6100ca5794e8b2f3", size = 61420, upload-time = "2026-09-15T19:32:49.822Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a4/71a22c1dee4ca02d331ec34e81300d73a4d753e5865662473756dfefc00d/propcache-0.5.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f698081e39d0a63f44ae35da7c43c595f9f60d26ee08e575576fd7df3029e31b", size = 67105, upload-time = "2026-09-15T19:32:51.144Z" }, + { url = "https://files.pythonhosted.org/packages/3c/7d/2661bdbf82cefdc566928fbb0c77a9340a338701e526df4e1c7f34d94d36/propcache-0.5.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1a8588f64d4d5d6e65d7faa9e0d1dce9fdb25e50aca194cffc6106deaf9d320a", size = 71080, upload-time = "2026-09-15T19:32:52.434Z" }, + { url = "https://files.pythonhosted.org/packages/12/26/4c8135f0224a22d2563e070efc4582fc07c6a28afb490fd97559f085ab71/propcache-0.5.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:69f226874a50eb2fdd0db47303b66b1084a545aa1d68d45ce2a1c9920cf2ea00", size = 72218, upload-time = "2026-09-15T19:32:54.002Z" }, + { url = "https://files.pythonhosted.org/packages/7e/af/40b08134064a871f721f673c8e24ce1d59c11e0fab5b045b1d4b92df96ab/propcache-0.5.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfa60b1dbd3c7881730407df60d2be83058ed145701b5c51ff113b7a3ced2224", size = 69073, upload-time = "2026-09-15T19:32:55.649Z" }, + { url = "https://files.pythonhosted.org/packages/92/09/7fc9aab3948dc2c70e6bfa809c16802f7adff8044f2cbc188210755d30fa/propcache-0.5.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a78a241677f693485ee6c0165ab657341e7ecac93f8d53cd70771ed6f3eafb61", size = 69336, upload-time = "2026-09-15T19:32:57.333Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b8/f1c053bd539f1b2f25380dc16c7a647fb0c3d5b362fbcb8f7b6f14959a0f/propcache-0.5.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c5930611bf42350905ace62fc8306146cb644c5d43efba541e68f4d22383e459", size = 68062, upload-time = "2026-09-15T19:32:58.98Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8e/0fea845503e4cd26942a58edfbd23930bdf4abe7b77b64337e4112176d97/propcache-0.5.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a7f485b78c7ab8e8b9c3375d32d25a077d530cfc676c665e89685fccfa2ecbbb", size = 63841, upload-time = "2026-09-15T19:33:00.452Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c3/5116f5d451eba5d08015d7b2795da74fd2705c2df9c93678b71b099c7eeb/propcache-0.5.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1162ba1e960ea6dd0453ff3ae29328a37307486c260c93343782ea1d56eca6f2", size = 71423, upload-time = "2026-09-15T19:33:01.984Z" }, + { url = "https://files.pythonhosted.org/packages/f2/75/5da895e5b944a49878aeb2476b337d5598698c55a8f04e2dbe2e9351fed4/propcache-0.5.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:49f3c98e977785ea49a8b99463cd81f343c8307dc98fe485fb94288597d8c01a", size = 69822, upload-time = "2026-09-15T19:33:03.481Z" }, + { url = "https://files.pythonhosted.org/packages/29/67/fa844bdd32590e54b8bc32223c9dc2e13626cf6c0a43b34fcdb53012477b/propcache-0.5.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8ef15c7a41364b098c26458dc3b57b7a5db6e042661c5cbeb75ed78e503162cb", size = 73014, upload-time = "2026-09-15T19:33:04.896Z" }, + { url = "https://files.pythonhosted.org/packages/51/15/3bd647f99e755e56c5608c91114143c53326f88ef7e1ffb1cbd64e96d020/propcache-0.5.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:54f06f17c66add28dc79e314e3b2ba7a9612564314d8b2c27b2a8c2f270d33c7", size = 70404, upload-time = "2026-09-15T19:33:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/6d/0a/9f84810f4d89895164f13bad47f861dc76fbadb7e63ec464e2ffad97b1c0/propcache-0.5.3-cp314-cp314-win32.whl", hash = "sha256:37a99cf741523fa5406ef2c60925b7ad616afd772fb3364b431a921404853d46", size = 43372, upload-time = "2026-09-15T19:33:07.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/01/e3f346f110c3e39d2e6c431aaaa4720d1067fb6fc1452fc531c3dc624d1b/propcache-0.5.3-cp314-cp314-win_amd64.whl", hash = "sha256:10573db5b40f55728e0abd5fc47096db6162ff612af10430ae93377af09e2a4b", size = 46097, upload-time = "2026-09-15T19:33:09.341Z" }, + { url = "https://files.pythonhosted.org/packages/6c/47/8cf51b61403f3ed4122c0e21d08b6e5eb683b2d2fe02542723c9303d1b88/propcache-0.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:9e561c183c72665752cc2ede30d985a9e80534f43aaa16fa6e1224d151ad54c2", size = 43236, upload-time = "2026-09-15T19:33:10.659Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cb/a1c760d7183853ed52d19552aefc3c39e57ec0561f18f79e9cc03e55c685/propcache-0.5.3-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:622ae786b1e3d46684b8866cd7415c9eca26f341757c4bfdbdfad8ee129a7103", size = 111655, upload-time = "2026-09-15T19:33:12.242Z" }, + { url = "https://files.pythonhosted.org/packages/68/ae/b76eeafd491de49e23777ae26fdec0a15e35c1fda9e2e2db140f563a064b/propcache-0.5.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0a3af1190a9c62a0da8d90a0a613d6b69029e86ee60b599e146c1e79a80c77d0", size = 64142, upload-time = "2026-09-15T19:33:13.723Z" }, + { url = "https://files.pythonhosted.org/packages/4c/20/ead9986fa0def900d811998ce491a367c9c235bdf35777fdbdb695d211f8/propcache-0.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dcc70083abd3374d7ec338c6dfd37030bc1e54ed2c71abe2c51f16c3d7af5531", size = 64270, upload-time = "2026-09-15T19:33:15.023Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5a/3d0fe77ae9747f364a251e1ccfaa3c8b094bb6f1e13659c6768c4286c7b3/propcache-0.5.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:665451eaeb3e5e09129c4a789d63620502f50c16be25ebe9370f7dc05ed4d49b", size = 70112, upload-time = "2026-09-15T19:33:16.79Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ae/14f42f9cf3c7c2214ec7d5cb53c99f4faae07fe27bfb76e63890339a2051/propcache-0.5.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8c8e8b2dfe7d7bbca58b12170cd65b4f7ec701e67812a853b7da8023f681c9f", size = 73544, upload-time = "2026-09-15T19:33:18.227Z" }, + { url = "https://files.pythonhosted.org/packages/d0/33/0090b2cf0f1a909f63a7d0d665c6f39b48f269738baa572e56818be65d5f/propcache-0.5.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b6239f0d6175da9d07084c74628af8baa258fe8929faf6a75ce425b0db6ec9f", size = 75059, upload-time = "2026-09-15T19:33:20.008Z" }, + { url = "https://files.pythonhosted.org/packages/b9/39/239f925d40a9d6de08a7351c29ff9b46d189682474c6d4986bd6cdb94035/propcache-0.5.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:104e8d289159297822541566d60769b81af3bfac971509a91c8b94cb2554d7dc", size = 71933, upload-time = "2026-09-15T19:33:21.5Z" }, + { url = "https://files.pythonhosted.org/packages/21/7c/259bc1bc67d9855d75d0f288f9be09186d9535eb3b45590ced48a9c9aa11/propcache-0.5.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50eea49bd9c874378a015e8363befc05b3545a0bb1312ed44ba895cd7c5c9b3a", size = 72150, upload-time = "2026-09-15T19:33:22.891Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/d3ab0eb1e502911534109159918f9ed520f1c4b556fbe08eb05629b29587/propcache-0.5.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0f0e69dcc0aa9bd4aa22c9cf3f52cd92ed2fd067f2df93e56dc1d1c98d0538e5", size = 70998, upload-time = "2026-09-15T19:33:24.339Z" }, + { url = "https://files.pythonhosted.org/packages/29/31/3955b890061d2e6bff664467b39dc78165b1837efeac29a68b2e56251e60/propcache-0.5.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:9498e6b074f7e4c58fa518e8f87944f87e612ad910bedaabfdc07695d91efa8b", size = 66542, upload-time = "2026-09-15T19:33:25.675Z" }, + { url = "https://files.pythonhosted.org/packages/03/c0/0512a494df785c0b07e23e0ebce2c797aa587af321b955e3106a822c517d/propcache-0.5.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b3541fae8294f9129e3ea393d146f28c035acf9106ee2025121dbd2b7bb2516e", size = 74281, upload-time = "2026-09-15T19:33:27.098Z" }, + { url = "https://files.pythonhosted.org/packages/bf/eb/e89c9ecc09c984b09c70a6e3367e51f7374f9d6d83225ef4853654ba8121/propcache-0.5.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:105ad7d80740aa4d44f025a7f7335599e0b26faa4d6c80918069c16e108d29db", size = 72679, upload-time = "2026-09-15T19:33:28.51Z" }, + { url = "https://files.pythonhosted.org/packages/33/f1/9c6fe447d3a9daca6088490212159c4732c5844f647b3816cc55d7c15f69/propcache-0.5.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9851f8a7bd86a455ba5f32652b13dae69011d93e44d3433fed7eb54b10f3d9e2", size = 75867, upload-time = "2026-09-15T19:33:29.891Z" }, + { url = "https://files.pythonhosted.org/packages/60/d6/9c03b5c240916bd981616f4b2269139af38f7cd0a0a2bf0721e059cc8faa/propcache-0.5.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3745e60d95e52a782b1e99ecccc72d22ee61c86c1e368647fff0444b9ec4bb70", size = 73420, upload-time = "2026-09-15T19:33:31.295Z" }, + { url = "https://files.pythonhosted.org/packages/80/ff/f524645ba32ba3ef9b7d784370ebf6a3a24a5989b1cd18159a33f69927c9/propcache-0.5.3-cp314-cp314t-win32.whl", hash = "sha256:ec2e387ce38d9b73054a7e96d70d22c8471a83df6205019442394b079d26a84d", size = 45914, upload-time = "2026-09-15T19:33:32.759Z" }, + { url = "https://files.pythonhosted.org/packages/19/50/a314a5634599c966a4363e925b5d636bc8892103666147fe66949d51e0e1/propcache-0.5.3-cp314-cp314t-win_amd64.whl", hash = "sha256:8a3396b1822f0c5291a11bdf93877d3118d5cafca5905e185582beee039fa508", size = 48948, upload-time = "2026-09-15T19:33:34.095Z" }, + { url = "https://files.pythonhosted.org/packages/61/4c/7a957ce48290acc7b9739612e73c175c04099f8af3e581b3804583ad5bfe/propcache-0.5.3-cp314-cp314t-win_arm64.whl", hash = "sha256:0dd0ef45b87c5a59970b42dd70493b3c022be490a2268dfd391cdacdfb9a611b", size = 45800, upload-time = "2026-09-15T19:33:35.558Z" }, + { url = "https://files.pythonhosted.org/packages/02/78/096c5653b662a381b6caae09de4d87ac79b93fafd35db599f31e0dc5b87d/propcache-0.5.3-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:888624d71be1029609ad7f333be31b0fa3546caef67a5b17ca2fc7f5e07c8168", size = 106276, upload-time = "2026-09-15T19:33:37.897Z" }, + { url = "https://files.pythonhosted.org/packages/99/b5/fa3fb80475ebe20d2456f220da4a925ad8ee3339caccae5ecbdb9392c715/propcache-0.5.3-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fcf51bbb689ee4c15226ab80c96c1d7804cb1f5fdbbc828b7f75f6f6ee5a172a", size = 61130, upload-time = "2026-09-15T19:33:39.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ac/a42b8426283e8780070e2445dbe93fa1dd6d1670d3e0d9d00bb42deebd6f/propcache-0.5.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:73b3e3cf2b6b6af3f407439b647c371452481d53b786b75e1fd0956e1d69b59f", size = 61554, upload-time = "2026-09-15T19:33:41.23Z" }, + { url = "https://files.pythonhosted.org/packages/8d/62/1c3d133ef4f179f74d8d37f3370976b937bdd52e4e1870985c38dccc2040/propcache-0.5.3-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23788073f16c2e0706f5aeaae8489ba504027cc15b22f78bdd55df8e6b5f5b37", size = 67132, upload-time = "2026-09-15T19:33:42.628Z" }, + { url = "https://files.pythonhosted.org/packages/bc/15/8de881015fed66e756ef4dc5613cddf7024fdc612d2d0199167395176de6/propcache-0.5.3-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bb98bd17ad50a99f9f6962214608afdb92a0ebef681a5f4a5d38024578176df0", size = 71122, upload-time = "2026-09-15T19:33:44.08Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/82f9f2f64f78cb5e93948b431efc06bf5b915a81746181572c8e57cce23e/propcache-0.5.3-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c95b48cda71997707271ec146e13450c8a27d57ee5d01622a0afb88a0f5a6b95", size = 72216, upload-time = "2026-09-15T19:33:45.578Z" }, + { url = "https://files.pythonhosted.org/packages/03/ec/71a33806375a6a4135aaed95f3a324319c1ff7a6939f456db3cb68443467/propcache-0.5.3-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50750f402638c9770e33e7e9ff8aa1d5115de8ea07ec29898c85abfa47b0f442", size = 69105, upload-time = "2026-09-15T19:33:46.999Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c4/07ca0df6d7d45c3259fbd44d0ac298ac70fe27dd4668dad44ce3c97b6607/propcache-0.5.3-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0506edf85bec8997f5084584f2b863a27528147c59aab9bdaca2cbee0e22bb76", size = 69344, upload-time = "2026-09-15T19:33:48.403Z" }, + { url = "https://files.pythonhosted.org/packages/50/2d/fbe3063242c80140757e1e592de5d43a4d84e2029bfc71e354472ad31c6e/propcache-0.5.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:e9fa0ec1edaa4a9a95d8e0ba4676f43f187323cc5249d8217b3d75484d922f77", size = 68116, upload-time = "2026-09-15T19:33:49.793Z" }, + { url = "https://files.pythonhosted.org/packages/37/35/cad45301af9eb52df154c69ec729b145d6e9471a303177ddce7daa2ac8d6/propcache-0.5.3-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:1003b8557b64ce8c09f4c0193be582231805997d6e74ca0e9c79eb7b375789b3", size = 63872, upload-time = "2026-09-15T19:33:51.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f2/aca47d82b4250ae3358c337cb995a1dac6f0b8102b6e2abedfddd19752e9/propcache-0.5.3-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:282cb412e862cfc23ab796addeeaeefe9ac85061349bf474249f7d77528135dd", size = 71457, upload-time = "2026-09-15T19:33:53.087Z" }, + { url = "https://files.pythonhosted.org/packages/3f/32/caf8744557cd15bb49c568c608656174b0939da79c08ac644e8e00ee3813/propcache-0.5.3-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:b6d618b5144fcd65ac04113cee9196525dc10c23c085f27f3c2c13de439d4853", size = 69883, upload-time = "2026-09-15T19:33:54.541Z" }, + { url = "https://files.pythonhosted.org/packages/66/3d/2e72598a1bf2ba567e0d235c44698619e149b768b9897aeab456058b058d/propcache-0.5.3-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:3c996ebbee2460fe77be155dd42ad4506fbcefed7a4b9b776b3894b0f52c1479", size = 73087, upload-time = "2026-09-15T19:33:55.952Z" }, + { url = "https://files.pythonhosted.org/packages/d1/62/a2d78ef2ea98415dd1eb3a33077748c1f3c90754f3a2ef74fc59b80c163e/propcache-0.5.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:95783c8fd4ec500c6afdcae87e9bb80c7379ef4dee5fcdf27c88e08f0c19621a", size = 70431, upload-time = "2026-09-15T19:33:57.744Z" }, + { url = "https://files.pythonhosted.org/packages/a7/2b/917e265634a01ecc7399389cf74490ae519908195b219ae423ad01d379f0/propcache-0.5.3-cp315-cp315-win32.whl", hash = "sha256:55dca8dd42e5c12d9b7949a50df9a283e9720d26899f6ee53208f1919664812c", size = 43306, upload-time = "2026-09-15T19:33:59.112Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6d/b858585374e9523d836e1c6c4f3550bf4a4c3538695ee0426c527e9eab24/propcache-0.5.3-cp315-cp315-win_amd64.whl", hash = "sha256:f15dd057a45bcf50a000d515ca5263d567c18ebe7de85c71687fe2d88fb0dde3", size = 46057, upload-time = "2026-09-15T19:34:00.677Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e0/f338a35d3dc9f3e84560428107dbde712bf59c31ab2d9bb1387a1ed6e742/propcache-0.5.3-cp315-cp315-win_arm64.whl", hash = "sha256:07478d53a45cd33a9c721cde42a1074dc7fed8fc5562bcfd83172d5b1f140ee8", size = 43187, upload-time = "2026-09-15T19:34:02.228Z" }, + { url = "https://files.pythonhosted.org/packages/38/18/840bb1bf44edf12d52cd02352b40f1a31018785e9ef6385964bc267a3298/propcache-0.5.3-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:18ae303e7ae34fb2fdc21d190ffcdf025b8907e50da5393ff271b66fb08eb123", size = 110765, upload-time = "2026-09-15T19:34:03.67Z" }, + { url = "https://files.pythonhosted.org/packages/13/2a/e5885be96d3a0479c3aa1302655dd2e65e0f237a83282062ee75d765c98f/propcache-0.5.3-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:fd0c772d8f7d0f0cbb73271c64f658622d7c143c5696462c918f73f3a7542c2a", size = 63692, upload-time = "2026-09-15T19:34:06.091Z" }, + { url = "https://files.pythonhosted.org/packages/de/43/bad6e4fd4b3b1a9a6b0759f0160b99c336c66539caef250e24ab59893a40/propcache-0.5.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1864f5637f61cf3fb21d5351d494de0b896f9867c8b4f000b8301c7468c6a05b", size = 63835, upload-time = "2026-09-15T19:34:07.61Z" }, + { url = "https://files.pythonhosted.org/packages/18/0e/bba5b5593898c99bf218b8c37033c29d0f9ceeeed6d001d684cfce079b0a/propcache-0.5.3-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40cf37a31664e280fdbb6f8ea9ee5a16bcbe504c464f210d90f2e8cfac4c570c", size = 69636, upload-time = "2026-09-15T19:34:09.049Z" }, + { url = "https://files.pythonhosted.org/packages/bb/94/1661c047d9d3d44399e41755379d0989f6182cce413ae75f9bc704964f37/propcache-0.5.3-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8f0583da2556ac23e8eec959c45c608d7b5dce3c5e7637a81af695355a57b6c", size = 73032, upload-time = "2026-09-15T19:34:10.464Z" }, + { url = "https://files.pythonhosted.org/packages/5c/3c/5ea6e6b30ca4679f76a5b8b9b0f8ceb6c3e0f1e47092c6ba1d3ea609cf14/propcache-0.5.3-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f49d1c07dea7235efc959b72ceb592cdeb44b0f60ce69828af318c40ada3503c", size = 74452, upload-time = "2026-09-15T19:34:11.912Z" }, + { url = "https://files.pythonhosted.org/packages/11/87/82790257e9b79d4d01991a9a78978f108f01942dbc86fad6daa4b8538421/propcache-0.5.3-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67af78cf66472e82c8beb672930f6279d08c0007ba4cb675a70cee5cff1fac88", size = 71398, upload-time = "2026-09-15T19:34:13.342Z" }, + { url = "https://files.pythonhosted.org/packages/c0/45/7177024e81dec38178954dbbc47c4aedd29c0e98ddef6a530d7cf5dfefdb/propcache-0.5.3-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc601955fe451749386dc4d7f3e7f8f1d4db6846c8be4582c5ee21ee0acc7559", size = 71571, upload-time = "2026-09-15T19:34:14.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/b1/c6370bbc0e4d93db0f9bb6b87a0fa17a41370d2cd8ae7943452d48a5ceca/propcache-0.5.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:bf82eea5664b0b1323d2304c68e84215a5b3a11bd9cc733df09edf7fbae7fcbb", size = 70519, upload-time = "2026-09-15T19:34:16.264Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fc/b770765127e3250f004753b04d3ba078252115fb89c78c6afcd641f2770d/propcache-0.5.3-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:d9eb3b83d2c106e0a1bcc788dc4d375cf60d4f1a4bfb151858fb84d4baf184d8", size = 66244, upload-time = "2026-09-15T19:34:17.733Z" }, + { url = "https://files.pythonhosted.org/packages/96/79/cea8b45bb44eb4a9c4426cfc875d019bbebdcfc3ee84e575c5256281469f/propcache-0.5.3-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:b8149edcd93da046f6f1e3dad1df51c6257bef13f8171aec5b8aebbcba840f2e", size = 73634, upload-time = "2026-09-15T19:34:20.07Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/8d0579ad27a269be0e42db3d0be6cbb4aa39c6e4c3f8a3c41d93282969e3/propcache-0.5.3-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:02729b64fea4ae4d9a5a9a94ba56f360978b1538bd347a81df19c3e5520d1ecb", size = 72105, upload-time = "2026-09-15T19:34:21.472Z" }, + { url = "https://files.pythonhosted.org/packages/6d/90/f09606ca44cfcd8d4ce1e875ba2a338ad729935cf04f8a5bea7b75326a68/propcache-0.5.3-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:98bf605793ff20856a4bbc8af2e5ddbbf6cfefdf6b5cdc01587627a3e7057004", size = 75269, upload-time = "2026-09-15T19:34:22.888Z" }, + { url = "https://files.pythonhosted.org/packages/a1/f9/1e5db526cef0ba787260a175f658039e9f84c00172c8f5988f9c0abdc206/propcache-0.5.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:dc88c7b971999389dc5ceea90d8f346fb360888549e123644fc63b90dbd7f64f", size = 72917, upload-time = "2026-09-15T19:34:24.422Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/51c5334a99a0c705a88338a416b0a41309c85a158ef96c60188634e334ab/propcache-0.5.3-cp315-cp315t-win32.whl", hash = "sha256:1102c4f4390e6a50f1960b8cb494007f08f5a139b39fd278925330e622b03ab8", size = 45667, upload-time = "2026-09-15T19:34:25.834Z" }, + { url = "https://files.pythonhosted.org/packages/7a/2b/386cdaa1283a2754e058f8d15abc2cc4d77def40b30a2bde470b8554e8e3/propcache-0.5.3-cp315-cp315t-win_amd64.whl", hash = "sha256:09b5c52fec3f50ced0c5c810f02c1237d7c89a8f3f5345ad92c6a49faeafe6a9", size = 48367, upload-time = "2026-09-15T19:34:27.231Z" }, + { url = "https://files.pythonhosted.org/packages/25/6e/7abc3dc74992281778a4d17b9a9a2df2183d792b0c7be695822a95085e0c/propcache-0.5.3-cp315-cp315t-win_arm64.whl", hash = "sha256:74f50a14ccc90bf5e544521783aafaf8081a21eeb24fbcb295ecb79d766a140e", size = 45420, upload-time = "2026-09-15T19:34:28.54Z" }, + { url = "https://files.pythonhosted.org/packages/5b/08/54e69cf685c73a2cac290a9684d9a148dc8cd22dffaa838dd969cba10e3a/propcache-0.5.3-py3-none-any.whl", hash = "sha256:abcef8e75a2c324dabd46c842c17cb005ae968596a567e43dfd6ee074f9f907b", size = 16132, upload-time = "2026-09-15T19:34:29.92Z" }, ] [[package]] name = "protobuf" -version = "6.33.6" +version = "7.36.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/73/f66c748df06e7fe24e658eddd600d19c4b40bad836c97ce2d0ad9851fb6b/protobuf-7.36.1.tar.gz", hash = "sha256:d0f6470f0ce2b84e3feaea2d4b816378b37ba4d4aa08a274305373de93e2d524", size = 512499, upload-time = "2026-08-31T22:40:04.667Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739, upload-time = "2026-03-18T19:04:48.373Z" }, - { url = "https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089, upload-time = "2026-03-18T19:04:50.381Z" }, - { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, - { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, - { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, - { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6c/3a54a58f2948b0f485df9ecdd06590f15d0a7abf46a89d50c3de709ff4ff/protobuf-7.36.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:3cf2ee25d006cee57294a1196ea43b37feb78e0dcd1e8af5c1aeddb777655aca", size = 456046, upload-time = "2026-08-31T22:39:56.865Z" }, + { url = "https://files.pythonhosted.org/packages/6e/08/9f9548793c771095245c0eeaf0c84b76b16a5ef26158043d456f551344a0/protobuf-7.36.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:43d3d37b1eb24c113b9b7d02008cac44e423f00b611b7781ae998d7623972969", size = 344226, upload-time = "2026-08-31T22:39:58.263Z" }, + { url = "https://files.pythonhosted.org/packages/fe/51/1bdbd612fa3c51e42ea6f45d05e84dc748ddcd2663e1aa1e89a00a33facd/protobuf-7.36.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:39c518c05586c016d7874ff6079ee115bcec1ea5fbb1d177fbf7867ef4c67e44", size = 357229, upload-time = "2026-08-31T22:39:59.198Z" }, + { url = "https://files.pythonhosted.org/packages/22/df/c799fe7a05ef16ba853a59db01f3a2c5f7d0676469589ccc4874f76a2a88/protobuf-7.36.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:97198b77e369a0abd8e262b8f6c7266c55ddb796a3a12c76d7b8881188ed83aa", size = 343228, upload-time = "2026-08-31T22:40:00.179Z" }, + { url = "https://files.pythonhosted.org/packages/3d/33/d4724ec5d86d496fe4108e220618aa0837ad3423a7af7ccdd9684ccc77c8/protobuf-7.36.1-cp310-abi3-win32.whl", hash = "sha256:0b53ce95272aad50ad25d7ff03373743209822e8ba42ea7fad27d2bee1547d00", size = 443002, upload-time = "2026-08-31T22:40:01.32Z" }, + { url = "https://files.pythonhosted.org/packages/db/37/155788a0d8daded960375af604202805308169f9b859419ea0aa370946e2/protobuf-7.36.1-cp310-abi3-win_amd64.whl", hash = "sha256:51139351435d9b43d88a55eaa49fb6f737fbb478fb0cbf2cf694d1a04a9d3363", size = 456518, upload-time = "2026-08-31T22:40:02.494Z" }, + { url = "https://files.pythonhosted.org/packages/39/ca/c47f91d3cab175b01fd8c4f0d80fdf8613be876cc616e66ad281a59c5ddf/protobuf-7.36.1-py3-none-any.whl", hash = "sha256:7d951e46b3f963d6c264c367c437921de9d5aedd9c3f9612b9077736b4e3ad5c", size = 179813, upload-time = "2026-08-31T22:40:03.54Z" }, ] [[package]] @@ -3552,7 +3793,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.13.4" +version = "2.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -3560,139 +3801,139 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/ef/fc4f868f4e2cee79f863883abffceff107875f569b848507319842d2a681/pydantic-2.13.5.tar.gz", hash = "sha256:51a9c5f7b2f8e636f04c6cada605d9b6a3bf1348fdf945a3d8869b19bba0ee08", size = 845750, upload-time = "2026-08-28T14:04:00.916Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, + { url = "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", hash = "sha256:346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73", size = 472589, upload-time = "2026-08-28T14:03:59.136Z" }, ] [[package]] name = "pydantic-core" -version = "2.46.4" +version = "2.46.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146, upload-time = "2026-05-06T13:37:36.537Z" }, - { url = "https://files.pythonhosted.org/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769, upload-time = "2026-05-06T13:37:46.365Z" }, - { url = "https://files.pythonhosted.org/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958, upload-time = "2026-05-06T13:37:28.611Z" }, - { url = "https://files.pythonhosted.org/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118, upload-time = "2026-05-06T13:36:55.216Z" }, - { url = "https://files.pythonhosted.org/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876, upload-time = "2026-05-06T13:38:25.455Z" }, - { url = "https://files.pythonhosted.org/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703, upload-time = "2026-05-06T13:37:53.304Z" }, - { url = "https://files.pythonhosted.org/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042, upload-time = "2026-05-06T13:38:46.981Z" }, - { url = "https://files.pythonhosted.org/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231, upload-time = "2026-05-06T13:39:23.146Z" }, - { url = "https://files.pythonhosted.org/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388, upload-time = "2026-05-06T13:40:08.06Z" }, - { url = "https://files.pythonhosted.org/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769, upload-time = "2026-05-06T13:38:13.901Z" }, - { url = "https://files.pythonhosted.org/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312, upload-time = "2026-05-06T13:39:08.24Z" }, - { url = "https://files.pythonhosted.org/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817, upload-time = "2026-05-06T13:38:43.2Z" }, - { url = "https://files.pythonhosted.org/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085, upload-time = "2026-05-06T13:39:25.497Z" }, - { url = "https://files.pythonhosted.org/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311, upload-time = "2026-05-06T13:39:59.922Z" }, - { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, - { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, - { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, - { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, - { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, - { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, - { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, - { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, - { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, - { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, - { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, - { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, - { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, - { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, - { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, - { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, - { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, - { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, - { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, - { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, - { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, - { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, - { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, - { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, - { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, - { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, - { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, - { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, - { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, - { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, - { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, - { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, - { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, - { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, - { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, - { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, - { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, - { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, - { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, - { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, - { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, - { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, - { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, - { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, - { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, - { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, - { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, - { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, - { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, - { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, - { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, - { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, - { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, - { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, - { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, - { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, - { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, - { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, - { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, - { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, - { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, - { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, - { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, - { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, - { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, - { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, - { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, - { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, - { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, - { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, - { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, - { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, - { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, - { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, - { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, - { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, - { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, - { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/af/f9/8a06bea35ef8daf588f707784c973a7046e0034c8d8cfb08828eeffb8b75/pydantic_core-2.46.5.tar.gz", hash = "sha256:10416c15b8839ecc4ef4d0885da76da6fd0f67333a0eb8aff6d93c4b8f2910fc", size = 472262, upload-time = "2026-08-28T10:01:31.677Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/6b/8f79692844269427abb3e4dd9e68edfcbe65ae25527d99183214de716c59/pydantic_core-2.46.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:657b40d6240c0a7b6a64b30f22d1e3aa631c7e846c621b0c0f6d1d75e2e15ea6", size = 2076533, upload-time = "2026-08-28T09:57:35.421Z" }, + { url = "https://files.pythonhosted.org/packages/bd/d0/c787604c71c2bdcda1a5656942fc822cd0f9cd879b9484bb84fc42172703/pydantic_core-2.46.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ecb42011e12ee19cafbc312887cbf3546959fe02fbad44f272d4be5baa997615", size = 1924650, upload-time = "2026-08-28T09:57:37.944Z" }, + { url = "https://files.pythonhosted.org/packages/4a/77/ca2f8e997d9bfdb32205297aff38f210f398822d895b1af1b59fd9df9c13/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dedce55295becb61921e386b99d4f2706045306e7fa52249a33004c837379fb", size = 1951261, upload-time = "2026-08-28T09:57:39.339Z" }, + { url = "https://files.pythonhosted.org/packages/a0/53/bd12e1a9255df4edee00353778e2614b5346265d51e1567ab72153e803a2/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f47b8a949e60f027f0aa0a6f6c7b7e9c55cbf4380d10b344e282fa4e7ab1e1b", size = 2021808, upload-time = "2026-08-28T09:57:40.69Z" }, + { url = "https://files.pythonhosted.org/packages/d7/41/f7f312751ebc6d6767da91964a9c7954c18e226a1720ab234e3dfb9d6c17/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:200aa3dc9f8d54f0754f43247c0bad0999fdcfbfd2488384dd44f37279271fe6", size = 2196184, upload-time = "2026-08-28T09:57:42.275Z" }, + { url = "https://files.pythonhosted.org/packages/3d/93/ce93aa030ab6bac4683ba8861e7baad89dd24b02e66b8801a0e4f6a00311/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d30e1a4f138b8951063e9a394752a9179b51da288ffa507b1e659222f4c1793", size = 2238212, upload-time = "2026-08-28T09:57:44.122Z" }, + { url = "https://files.pythonhosted.org/packages/34/a1/c8e6b66f499f510752c07a092dfe27621f9c255635e59d38704b5681c35a/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:850a08d167dde16db8702c274f320c7be9d7da6f6dff2b58b18f9e815bd94f5b", size = 2064073, upload-time = "2026-08-28T09:57:45.613Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/605e2b127ee30dbf4b1da9da4843587cf2b2d16486c241cc7a5be2d2c1bd/pydantic_core-2.46.5-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:c3471e5c4a949c26ec00a77f01df59096aa9495877de76fd60a980f8ee6be461", size = 2093102, upload-time = "2026-08-28T09:57:46.953Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f7/1ab28093c09032ddce7c92c7a55d503b6ecd70f42c32492946c1cb5477b1/pydantic_core-2.46.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a3e26b6a8274211bddee2d0e4d0d42778f17a34510f49d2ec44b58abfc41736", size = 2133452, upload-time = "2026-08-28T09:57:48.362Z" }, + { url = "https://files.pythonhosted.org/packages/30/c8/47c79b756f12f85e8b0fbdb2b495f6b6eb32e6c98a4beae7a570a0b7c63c/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc5d783bd4a2387e97b8a2d5ec781cfb92b3d893bf82370548e99db5915935d3", size = 2146477, upload-time = "2026-08-28T09:57:49.74Z" }, + { url = "https://files.pythonhosted.org/packages/13/5c/79fc00cb8f651d6061991de8d7cedf1c78c73cbd4862c42ef418f03b8bfa/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:356c8368cbc321050b169595683a2e1d63413b1e0e2868b330af9fc14c616d3f", size = 2300832, upload-time = "2026-08-28T09:57:51.639Z" }, + { url = "https://files.pythonhosted.org/packages/b4/72/dd1a29853cf6d22a1ebd9e3baf0239cbc57d2d16caff36a89e38eb9b1db3/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb7d8d0e5886a89a55d2eef490e272fa965a9d57c6b29a5b5088a7997ec2cad1", size = 2320505, upload-time = "2026-08-28T09:57:53.236Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d1/ba4a8e06a9ddad0b4caf69cfaeecc0fbfcec20473bd808f5127fd16491c4/pydantic_core-2.46.5-cp310-cp310-win32.whl", hash = "sha256:4d44cf99ddebf875f9b68cc267aa684c99b7b44fe63ee1cac4ec163807290069", size = 1956853, upload-time = "2026-08-28T09:57:54.592Z" }, + { url = "https://files.pythonhosted.org/packages/f2/94/205ed9d7ddaf44acd489889708ea124a3f41bdb42c141c8684d528ad0e7a/pydantic_core-2.46.5-cp310-cp310-win_amd64.whl", hash = "sha256:1e5aad1220a1192c42341c8fd4a8686657e73ab2a920c970bdc4de334fe3193d", size = 2042551, upload-time = "2026-08-28T09:57:56.017Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b6/81d2d19ea0be2c03664381b59f65fa72fc7969decedae00bc2c4ad835708/pydantic_core-2.46.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a1dee1b804ff4d11c663636cf15d2ea47e9f79cd56c033fb1cbf08924842a48f", size = 2074737, upload-time = "2026-08-28T09:57:57.711Z" }, + { url = "https://files.pythonhosted.org/packages/0c/18/b70da8300e292df4099684ea11b1958043580d2f50d2dc8bf7e542bdd84a/pydantic_core-2.46.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d625a186a65201c23a9e3b8ed9c47e90a026e03256608cc91851c6709096844f", size = 1921751, upload-time = "2026-08-28T09:57:59.265Z" }, + { url = "https://files.pythonhosted.org/packages/e7/1a/0d590341b6ffa4b4aca83508e6b8db4761aaeacfc15a25ca3815876d4797/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8507560a9284e1370bb048ed4282012fbef4e8d109875b95e884d228552061", size = 1948231, upload-time = "2026-08-28T09:58:00.678Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1d/02eb35761c51f2f7b1b042d6ab4cda6600f0c8c88a2243b3f734376201e5/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f93c5fe914d75fbec9a49209b00da5f08e9e467d69da2b1510c81940cfd10be", size = 2020708, upload-time = "2026-08-28T09:58:02.267Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ea/f86073830e35d508cc8ddf9c3d9e6e6840fcb88d34bf726b0b4710186f27/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c767f552b21b10f774aeac128e828eafb796adfa1b666a18bf6321453c3a", size = 2194914, upload-time = "2026-08-28T09:58:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d7/fc36240d7791ce90939e51608568c33bfdae26202016f9770c229a487d86/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:701b2e04b560eeb4bddf7a25ab8ca476176e34fdbd9a0e18196f0d12d4685f0b", size = 2235622, upload-time = "2026-08-28T09:58:05.516Z" }, + { url = "https://files.pythonhosted.org/packages/cf/bc/3fa2d76b83162820a17da7f645b28d1cba99fc8e1e5fc6517067ec450fa1/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49776eab08766a08dfff7012f8b422dcd7e25e43b316eedf0477c24fcfa84b7c", size = 2062091, upload-time = "2026-08-28T09:58:07.135Z" }, + { url = "https://files.pythonhosted.org/packages/ab/9a/095d557bb492c90cd8a70a6dd048bf793d433d03d86c81c11e912e4cd049/pydantic_core-2.46.5-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:a2468d93d181667a7abd66e1b64bb9f76f361b0fef8faddf687456453576f5ee", size = 2089904, upload-time = "2026-08-28T09:58:08.814Z" }, + { url = "https://files.pythonhosted.org/packages/24/98/7b76b1ad10a19a617a52aaa1d80e159115af939b095e86f8e756fd52e0df/pydantic_core-2.46.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53feb344243bb9510a9dec7bf3cf1b64d88a98af5dc7872a5160465f8b198c8e", size = 2132244, upload-time = "2026-08-28T09:58:10.435Z" }, + { url = "https://files.pythonhosted.org/packages/20/32/7d6ca365fadba186a0c8f85de1a701663bce81efd309d9479be58687622f/pydantic_core-2.46.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cd5214352ae68f3b5e9af7768bdc5253695ee069675db3480518420b3be881f2", size = 2143901, upload-time = "2026-08-28T09:58:12.033Z" }, + { url = "https://files.pythonhosted.org/packages/f8/09/eb9a6aa57f22fd1541a9c0aa2a1f3aeef3ec65347d33e10a6da2f43e0ee9/pydantic_core-2.46.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:9432f3598db432cb51c5b37fdbf29a60fcccc79e30d37a05022776a6bc4ab689", size = 2299425, upload-time = "2026-08-28T09:58:13.614Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f9/548a5bb9d4ba8cd26e26daf48052236f6b38bb61e7b7241fbc3c995719eb/pydantic_core-2.46.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8feeac04b5794e513e710af2f9c87d49f31a6dc47967bb264a1fed61a8989bec", size = 2318566, upload-time = "2026-08-28T09:58:15.199Z" }, + { url = "https://files.pythonhosted.org/packages/4a/20/06454d18834c02c406c9133f1a3b485305fd9ee984f9636c2f730bef6a9d/pydantic_core-2.46.5-cp311-cp311-win32.whl", hash = "sha256:892a881d5f68c2b9ea304b7a6c2c60d9343df578a311b0f86b94bc8f1ffe8129", size = 1954258, upload-time = "2026-08-28T09:58:16.813Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c2/718b9deb4b72453b5d8c7447a3b14cb77bef36917ef5f514e0948a4096a0/pydantic_core-2.46.5-cp311-cp311-win_amd64.whl", hash = "sha256:40375c2d05acec10323e45dfe2077ac44bc74659008614af5069034e2cfc781c", size = 2041030, upload-time = "2026-08-28T09:58:18.288Z" }, + { url = "https://files.pythonhosted.org/packages/67/ea/c1d1a5b72d6e1ff7f377a4d9199f6591f095beb5b409a8a5d89f7238d939/pydantic_core-2.46.5-cp311-cp311-win_arm64.whl", hash = "sha256:28a6a556cd3b6066bea827857f9d9cce027c96f776e512f544a581f9e42161f8", size = 2009234, upload-time = "2026-08-28T09:58:19.929Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/76358795aa7a8c6d4f36e2cb828ad1c90ee118e1393a9281664f5aade9d4/pydantic_core-2.46.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9fe6fb92520e3fd61f2e49000b6911b188824f089b75973ea06d6267f0b476d", size = 2076516, upload-time = "2026-08-28T09:58:21.576Z" }, + { url = "https://files.pythonhosted.org/packages/db/50/26b091836076ce4cb2fac264186936acc069e0595772cfd02a563bc4761a/pydantic_core-2.46.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a39ac25a9a2fa4072efdb429833c4a4c8009a51ff9eea3eeae131713cd27991e", size = 1922874, upload-time = "2026-08-28T09:58:23.766Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/2a8ce3849e299d44e2d2c196b6082643a3235565a735cb51db7a6261f614/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fdc8b93a41521988916eeaa271173fcca7fa0803d62f87675aac8dcec1c8e29", size = 1951772, upload-time = "2026-08-28T09:58:25.435Z" }, + { url = "https://files.pythonhosted.org/packages/87/46/ac0dc8bdd9e6048183a14eb127764e7ad9240021c17513074a4711b0e31e/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b98134087d9de723658d17a42c7d0da8d6e2ef08015dee7dc93889047315f5e4", size = 2031832, upload-time = "2026-08-28T09:58:27.102Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/339de5bef7be36301a2231eaa52e62163742c2281f11b5f4892bc79785cd/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e652ab17569c94bff5475520f907b7148b8c24036a8ebbe5cf7cf7493d28579a", size = 2208645, upload-time = "2026-08-28T09:58:28.948Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a0/9ff22b797724262da14427abaed4dd1d864a139693fc5e7809114376a716/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d925f3d9afd05a8c0fb3a1031463a8d59ebe5e2afad297e29c78be19e13b4e62", size = 2265935, upload-time = "2026-08-28T09:58:30.625Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a4/eb9409ec0736e50aa70a412f16c204ed149516846912f7e6724d4c73ee53/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2", size = 2066284, upload-time = "2026-08-28T09:58:32.289Z" }, + { url = "https://files.pythonhosted.org/packages/c0/02/7f6156ffc926857f1c37c07d9a388682865a81830ab6a1b637082c25e399/pydantic_core-2.46.5-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:816ff0a6550ffc06c098ccd2e0698600f9aa7da192a79eaa6f9af504a35db869", size = 2105889, upload-time = "2026-08-28T09:58:33.986Z" }, + { url = "https://files.pythonhosted.org/packages/92/b1/e781d357ebe09fc929f995700f1b3503e8897f1cece183ecb1300d4d67e9/pydantic_core-2.46.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c7ea57fc63aa7da93a1bd2d644e6577befae10c52c4e36377635eea1056a74f5", size = 2158006, upload-time = "2026-08-28T09:58:35.647Z" }, + { url = "https://files.pythonhosted.org/packages/70/0a/644597d84ab400e50609c192120b85c9681c22d3a20461b9060a79be0a7a/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:efd62a42486f1bda5d24cb4f63d15a3c7768375fe83d36f9417b4ad7a2fb20b3", size = 2158408, upload-time = "2026-08-28T09:58:37.38Z" }, + { url = "https://files.pythonhosted.org/packages/1e/ee/ca3b7b3a4b3769ffe9ce9432a7c9be755de9593a46d3b0d54d0409323e44/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:2bc9419666990c06d7397831f2126a1ecc3594aaa3ff7de5bf2d066802f4e07b", size = 2309609, upload-time = "2026-08-28T09:58:39.22Z" }, + { url = "https://files.pythonhosted.org/packages/ce/52/39fa1f451486019524ca685020390e7ca351832fd874530ba30c8628e6dc/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18a09e1e1011b462f2e32774f25859ef1223d5c2b0546a633cf56654710721e0", size = 2342618, upload-time = "2026-08-28T09:58:40.89Z" }, + { url = "https://files.pythonhosted.org/packages/81/5e/468fc630568c61dcef3cd47ad32ffbeed9af643f49208d1ea86ab4f890c4/pydantic_core-2.46.5-cp312-cp312-win32.whl", hash = "sha256:5cb482e9e84c851f4e623fe4acc1ced89168cf1fe18f7089db4548c8f5bbb65b", size = 1939475, upload-time = "2026-08-28T09:58:42.591Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c9/4c19f41b84cf6b622a72fbeed7665b25d47a187d68d47d0d430c07f23268/pydantic_core-2.46.5-cp312-cp312-win_amd64.whl", hash = "sha256:5e81740c09e310f5aa5cbd3e434a01c154d4bef93241c7877b39f211d2b78ba8", size = 2043140, upload-time = "2026-08-28T09:58:44.272Z" }, + { url = "https://files.pythonhosted.org/packages/af/dd/0c1a050299147c746e5256db16d645ab5efd4f78c59937d581a0524e74a2/pydantic_core-2.46.5-cp312-cp312-win_arm64.whl", hash = "sha256:f7b0ec93a2893de856652154d73b7ba622f26fa97726487dcac373de5f4c6084", size = 1997729, upload-time = "2026-08-28T09:58:46.13Z" }, + { url = "https://files.pythonhosted.org/packages/f5/37/5abe39a8372a61d3dc3c1338fc504281c01b32fdb3169cd7187153b56d3e/pydantic_core-2.46.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:b7ca9034437b6022f941f4857459562ee00a560b97e7cce8a0ec5a74fc6766e0", size = 2075885, upload-time = "2026-08-28T09:58:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/21/43/6323b1f8b217780454c61304bcd2b38ae4762f50754414124603ccc90bb2/pydantic_core-2.46.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f332f0e72a5a0400141f830744e141bf9f97917878dbe968669e8a7fefea78ff", size = 1922768, upload-time = "2026-08-28T09:58:49.58Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a3/c05ca796e1197618a774b01e596aeedfefc2f7d8c01ae3054e910b120e8a/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:193375f3548919d3f0b60936ca113ada3e38f264f91b9b8e0508efaad57be931", size = 1951241, upload-time = "2026-08-28T09:58:51.511Z" }, + { url = "https://files.pythonhosted.org/packages/68/32/33bc39ac705c52cffc908e8389f9754fdb208aea5c69cceddf4eb3ce99af/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79bdfa52f843137045b2d081cc05c120ba6665d29b7559c2c47690906f39279f", size = 2031975, upload-time = "2026-08-28T09:58:53.166Z" }, + { url = "https://files.pythonhosted.org/packages/b0/70/2333e885c0f6a67bc105c5916965dac9b57f2718ee20d81d1a06a4ebdc13/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24922243639cbdac66c75fcb6fd6495a9cb52b213d62f9a0d16f0310b1ff8038", size = 2208542, upload-time = "2026-08-28T09:58:55.017Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ea/296debfb4264207bbda5936133892e027c0a58875ad53ebd512fba8ec3a2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76fe65e607be28c7fd4d56fc3c42b1583aa058ce3408b7ad0fd540171d31f9f", size = 2264692, upload-time = "2026-08-28T09:58:56.767Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/9e4de77a6271e07a76d2d58b11c091a979c191ed2939bf80067568b369d2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f7b393a8b3da82f5c1fc0751e6d01ac6c55b93c18226a60bdfba4a724efafd1", size = 2066633, upload-time = "2026-08-28T09:58:58.531Z" }, + { url = "https://files.pythonhosted.org/packages/8d/db/f9e9d0c97445987b2084823d5c240de88087338f04fc2cfaa2df186b8049/pydantic_core-2.46.5-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:7ac031912d54f3d83ef3b3eb98dfabc1608802e2202263d25957eeed40b94761", size = 2105235, upload-time = "2026-08-28T09:59:00.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/c5/79169b047b3b2c3e99e04bc76372af9637e0bf6db638274fa927df96369e/pydantic_core-2.46.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:837b396ca3d7b74091ca623f6cbd8351bd42d670a79c2683e79fb089f06a2de5", size = 2157367, upload-time = "2026-08-28T09:59:02.442Z" }, + { url = "https://files.pythonhosted.org/packages/26/b5/ba6057afb7c291bd449f51b867f95aef2072941c4ce4e5c31d6ffd132d3b/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:5ee239d575f80b08eca11f6e20f90c4c695de7825c67eefe6091fbf20dda648e", size = 2158420, upload-time = "2026-08-28T09:59:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/2057abecaafdc22912afa819603a51f0a62d40643b7c4871c51721fea9be/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e80675d75ae2cd14372cb65cad5400d9347a3d3f6c13000183f22dfd027283ed", size = 2309588, upload-time = "2026-08-28T09:59:06.048Z" }, + { url = "https://files.pythonhosted.org/packages/71/9d/881156dc404e27479c4246128d73538464cab4a239bec61995e227644c30/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c4b71f10dd532fb7a5cbc8f58707779e64f03a258c2bf8bfbaecfcd9970b519", size = 2341866, upload-time = "2026-08-28T09:59:08.539Z" }, + { url = "https://files.pythonhosted.org/packages/5a/38/d66f443a259f84d13babdceae568e572b0ed26da17ca5d0a649ebb110a67/pydantic_core-2.46.5-cp313-cp313-win32.whl", hash = "sha256:97bf8de4d541598c94a59344eeb988a94c08ff76b5723c41f6567ec18c7892ea", size = 1938580, upload-time = "2026-08-28T09:59:10.402Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/1d5371213f4cc9a7ed70c0bfcc7911de22311ee99a662a56077d7292d2ac/pydantic_core-2.46.5-cp313-cp313-win_amd64.whl", hash = "sha256:15f4a94963c95accac15b7b657bb177d3ad82bb90b0d0526d9a9b85079925db5", size = 2041980, upload-time = "2026-08-28T09:59:12.396Z" }, + { url = "https://files.pythonhosted.org/packages/5a/48/4222d90b1c67568bace4dec6dca6271449c66de3595d72b6d098f5fde597/pydantic_core-2.46.5-cp313-cp313-win_arm64.whl", hash = "sha256:d22a945598fb91236b4dd793a6e42e4f3dd7740bb5aace5ebd7d4c08d13bb575", size = 1997213, upload-time = "2026-08-28T09:59:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8a/14596f2a8367da50cf7cbac48169ee5d9c8e11d486a3b527082384630c72/pydantic_core-2.46.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c1c43ad4339643d70ebb8124e1305a7dab423001eff58bb41a0f731adbc98355", size = 2074081, upload-time = "2026-08-28T09:59:16.141Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d5/d8a4eb6d6c7f66b91dd37c576d76e9e60fba900caf5372c17bcf949febc2/pydantic_core-2.46.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1a353f84de772f423b5ffb11d7ae352fbbef0f446f3c0b0af0f8236d7233606e", size = 1920497, upload-time = "2026-08-28T09:59:18.065Z" }, + { url = "https://files.pythonhosted.org/packages/8e/26/092079428f86e927e030b2c0ced87df69dbb1c875cdeaa67bf42ea2be746/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5086029a57366b8cf81b130a43908738095c270c21a8d7f0e8bdfdb89718e2f3", size = 1952130, upload-time = "2026-08-28T09:59:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/08/c3/8ec0e290a9ebaebd64047bf5fda94be835c6b1551b02437e4b76778fbcd7/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46c25dda9d092a06c08db76ffe0a197107904d0dfac653f7d5306bbcd6d6119c", size = 2026371, upload-time = "2026-08-28T09:59:22.227Z" }, + { url = "https://files.pythonhosted.org/packages/01/72/4fd20ad520fb8da0157f95b27a7eb05a72790ef08138e7701ac972c342ea/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37ea7b83c935e5b0d68c9449b82651accf78a10828b2c02b2f2d9e9496446c21", size = 2202822, upload-time = "2026-08-28T09:59:24.277Z" }, + { url = "https://files.pythonhosted.org/packages/31/b0/d16e0771206b29314f0d52198b720be21e8a99ab2bf11e3bc0d7c9cebdff/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64e88d5585bea9ce95861079de72006c7fa6d3df4e3a3b65ba31eb979c15c9f", size = 2262756, upload-time = "2026-08-28T09:59:26.608Z" }, + { url = "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f", size = 2068352, upload-time = "2026-08-28T09:59:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/08/7c/570abb1ad2155348dc754ea91be22e5aaa18eb6d69a6068f7c6f2679a6ed/pydantic_core-2.46.5-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:a2a5e1d0ff29adddc9f6d6821a66302e4493f8ca898b715b6b1182c2c201ea0a", size = 2104777, upload-time = "2026-08-28T09:59:30.95Z" }, + { url = "https://files.pythonhosted.org/packages/8e/25/5bf74adc65a1ac5b7be3f6cb0bcb5433615c1598a801c19d830d84c98ded/pydantic_core-2.46.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03b9666e41e35d8909852ba191a0607520f81b74eaf12ccf8737005dbb313821", size = 2156312, upload-time = "2026-08-28T09:59:32.604Z" }, + { url = "https://files.pythonhosted.org/packages/90/6a/2ef38830675e050121040618135564ed56b860b45433b02d9b4ebece46f3/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:a91c17edf6eea2402cb5457b4c89e99bc5ed1004aa34c4adf1d4258c1a5c22c2", size = 2150067, upload-time = "2026-08-28T09:59:34.453Z" }, + { url = "https://files.pythonhosted.org/packages/90/ef/a7dbb03a14a64c2a4621f989c615ed9a892535a6cad938fc27079f919d80/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b49924c73a235e969511bf2aabdff3beebf9820931f646c80274d5d780010c47", size = 2304516, upload-time = "2026-08-28T09:59:36.194Z" }, + { url = "https://files.pythonhosted.org/packages/68/f8/6bb4c4b80e8a6fde1904c64a51c62a1d04fcdfa3ea521a66b2ddefa1d885/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2cbd9a5eff05e51c447c34dfa4632145b26b09120cf04bd0c871e44c1a5e1c9a", size = 2335223, upload-time = "2026-08-28T09:59:37.931Z" }, + { url = "https://files.pythonhosted.org/packages/2a/80/f46b8c681195190b2c1f1c7c0a81abce60663e987613e09ef64d433dd96b/pydantic_core-2.46.5-cp314-cp314-win32.whl", hash = "sha256:2d5d76654becf5efd62c9e51c3756c67b49498b0c9a40884934c40807adbd074", size = 1934827, upload-time = "2026-08-28T09:59:39.836Z" }, + { url = "https://files.pythonhosted.org/packages/f7/3c/60674207246bc0a4009d2391b7c7251c7159f279c8d2ab8aae8ef46f3dee/pydantic_core-2.46.5-cp314-cp314-win_amd64.whl", hash = "sha256:fa10ef4112775900e7a0661068635eb67b2ab824fbde764de6e0e21982a93db0", size = 2042648, upload-time = "2026-08-28T09:59:41.792Z" }, + { url = "https://files.pythonhosted.org/packages/69/0c/117c562c7c1babdf44576b72a5e496906506c93690387ecfbca7c729ae2e/pydantic_core-2.46.5-cp314-cp314-win_arm64.whl", hash = "sha256:045ab3b6d308439e32b81cc173bba5b9018bc6ed896afd0c65b3b009b1699af5", size = 1989652, upload-time = "2026-08-28T09:59:43.702Z" }, + { url = "https://files.pythonhosted.org/packages/e8/66/9336ae58f9eb68c41d121894e52c4c89eccb07eb8f602a04ee9c3f37736a/pydantic_core-2.46.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8816f3d218beb4b787de5c9759c259b8fa61f9dec42dc7811f320a33771778b7", size = 2065829, upload-time = "2026-08-28T09:59:45.364Z" }, + { url = "https://files.pythonhosted.org/packages/c5/02/bc19b47a96c2d3109760711acf22369e56bd7e405ca52f7ade164d2ead57/pydantic_core-2.46.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bce57638e08ac148e5778cce7feb968307a727d66f8e2274a543d0cf0c9ad6a3", size = 1905716, upload-time = "2026-08-28T09:59:47.18Z" }, + { url = "https://files.pythonhosted.org/packages/52/a4/70b47c0509923dd98ccfed04fb3e32ea3849c82a0ff2205bb41009b43c00/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976e1128455aa595ea04c79ccfedff1aaeab96ee013fcc916bed120c4f0ad94f", size = 1934216, upload-time = "2026-08-28T09:59:49.241Z" }, + { url = "https://files.pythonhosted.org/packages/52/ab/aa03b65f7bb198585edf806b906c3223ecf1795543e39e23aec4cce27ad2/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b891faeedeafba41b2983e5001a81b6a915b69544c7e7570d1989ce1c36ac7", size = 2010635, upload-time = "2026-08-28T09:59:51.692Z" }, + { url = "https://files.pythonhosted.org/packages/3c/8b/0da06343f30b84ec549aafd309c6456223d5dc8bd36af504c573faad561d/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f194189415698233dd1114a093a9b56e61e2c57e11b469be3b0506f46f0771c", size = 2209369, upload-time = "2026-08-28T09:59:53.582Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5b/844c4defaa34a3df66eb9257087d121d70c201298b96abdf9f492fc2f1bf/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82a36973cf8a2ef5406f4fe2edbf8ed0c99629535d959e0b100c76a32535a111", size = 2253238, upload-time = "2026-08-28T09:59:55.484Z" }, + { url = "https://files.pythonhosted.org/packages/f4/64/a4e536cb16d7f61a7fd3120b46c577fc7fa7325992f69c4f52bc786d77d8/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdbb78909f52b981d3b2d56b97328d71eb0b974c36bd77c920123a7ebb192829", size = 2065740, upload-time = "2026-08-28T09:59:58.038Z" }, + { url = "https://files.pythonhosted.org/packages/5f/75/aaa38c6bc2d085f6605b34eabdc6a8a4e0b2e61fc9c8e6e52b28e97b3125/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:52e24eacdb536cade636aa90fb851835222becff8484b7001fdc78cb0290f2aa", size = 2087425, upload-time = "2026-08-28T09:59:59.898Z" }, + { url = "https://files.pythonhosted.org/packages/55/ae/fcab4cfc39aba3689e1d20c8b5250ad280957022c09af2ed9cd585602a5e/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37ae34309d7bd8c0d61ab839668058f2a7962ea1fc51d105d2db228fe0618034", size = 2139306, upload-time = "2026-08-28T10:00:03.057Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f4/f1d03a4bc9d9acbc62f4d742b8a319af52f71885079868b2ff8e48a651ee/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:0cdbada856a1c69a7624a64d3d9aefe79300bd6ef827b43a4f265010b9b55184", size = 2144589, upload-time = "2026-08-28T10:00:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/83/f3/7a53bb1356de514a4cd295f25b6ac39237895620c0462d2592b76c16e114/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:545f26c504b27c3758439a5e6d9349931f0a04f855668d5fe323c89e82300a38", size = 2288882, upload-time = "2026-08-28T10:00:07.931Z" }, + { url = "https://files.pythonhosted.org/packages/cd/94/5a81583660c175c59d49ffb09f4b3a44debeaf86a19fca664ae1cdd9ee32/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ff218293c9c806138dca139765e3b067621be52bcd93cdc14c7711be7ddc90a9", size = 2335210, upload-time = "2026-08-28T10:00:10.177Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9f/5d685c2693b972d1a59c998586e8823712b66603aeff47ee60a4bdaafd37/pydantic_core-2.46.5-cp314-cp314t-win32.whl", hash = "sha256:97cf3eb53a8cccacf9d46686a0926186c9bfb5574f2ed66d3639d5fe117cd3a9", size = 1921180, upload-time = "2026-08-28T10:00:12.35Z" }, + { url = "https://files.pythonhosted.org/packages/70/12/5c94ee16d65a37a15f9e869f5e6256df111154491173801a4c5e800ab548/pydantic_core-2.46.5-cp314-cp314t-win_amd64.whl", hash = "sha256:d2f9fc07a8042a8f95925b35c4f04f469707c981fc33245b6ca187cf5d2dd290", size = 2020515, upload-time = "2026-08-28T10:00:14.774Z" }, + { url = "https://files.pythonhosted.org/packages/63/19/67830dda664e6bdf9285ee2e40f355d0d7d6b92aa0c42e8d217bb8d33d36/pydantic_core-2.46.5-cp314-cp314t-win_arm64.whl", hash = "sha256:acf8a67ba51f4ca9ddbd0e6b3000a65ac51ab734661778b3e7ba64d99a710f2f", size = 1989276, upload-time = "2026-08-28T10:00:16.984Z" }, + { url = "https://files.pythonhosted.org/packages/af/1e/ecca01fce348f7e8afa9572441ff6f7d1cc70d21e4859f33944d10877e1e/pydantic_core-2.46.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:c14ad3bdc85ee7f318742c457ca3968a92126d144b15721c759033bfb06296c2", size = 2075342, upload-time = "2026-08-28T10:00:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/1f/4c/af80c7a8032dfc897040ad5cb772bebde529a381186499e6e29987f23f8c/pydantic_core-2.46.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0bddb4020d8f04175865ccd17eff3040874fc11fb593f424edb452653b4b947c", size = 1907219, upload-time = "2026-08-28T10:00:53.438Z" }, + { url = "https://files.pythonhosted.org/packages/be/3e/54d89e2b092e778716bf6153634ef479e955f48c261090be23aa1e0fb0b5/pydantic_core-2.46.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2471fd51c61c610e1dcf7de44d7299283661654d11264ab4802b303368d69c47", size = 1953393, upload-time = "2026-08-28T10:00:55.58Z" }, + { url = "https://files.pythonhosted.org/packages/ea/89/828ee90cda28ce17bdefaa3a6eaf74fe430e113295a10e6126beca559d6c/pydantic_core-2.46.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10ec717381bdbfafef34607824db4c91de69ff085e4fca3b2af91b4fa17e68a", size = 2099024, upload-time = "2026-08-28T10:00:57.794Z" }, + { url = "https://files.pythonhosted.org/packages/df/dd/053c2e4303f791f3b8f8a14ab0b22008e8eb21d868c0c90b4f9be705b76a/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:013d6f3483d81e02e7c328831808f336c8596ee33b4bd4026b9ffb1e960b8942", size = 2062540, upload-time = "2026-08-28T10:01:00.318Z" }, + { url = "https://files.pythonhosted.org/packages/d7/dd/a18df751a5e37dd51bfad7f68e766999125bebe68c9e1d10a493ad01bd63/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:e9c134bb666dd54b778b9fc0d2b50cbb7f979b9e3716f26a88c9ab3b6fc1dd0f", size = 1902040, upload-time = "2026-08-28T10:01:02.529Z" }, + { url = "https://files.pythonhosted.org/packages/b7/13/01d40f9d07ce8a779fd6e0bd8ad4fba91309500dd67b869e2e219d261a6d/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:347ec774390c87326a2e4929d58d3f7e8763a104d5d35f4cd595a4c952366433", size = 1967479, upload-time = "2026-08-28T10:01:05.004Z" }, + { url = "https://files.pythonhosted.org/packages/fa/04/c81d4841331c2178b6fb09ae225425e110ed72d990c9fe556c4ec03d1013/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e24d8f05fa2d28513d94e877e9c75ad66175376209b3977f916e240e623193c", size = 2111034, upload-time = "2026-08-28T10:01:07.345Z" }, + { url = "https://files.pythonhosted.org/packages/20/21/22102e9950b3049526d20e811b95396508377d87651edd2b80d2b3d28659/pydantic_core-2.46.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ab4b66edffb32d9e951efb3814bd104b8367a7501b81b955cacb5726d897389f", size = 2071333, upload-time = "2026-08-28T10:01:09.636Z" }, + { url = "https://files.pythonhosted.org/packages/d8/18/87aefa427d191e6d3ab1447f1efc1cdcac86af1069239b133e8a0fd7f7c9/pydantic_core-2.46.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:337639ba62a11acde6ef3aeb08c8ea755f8ef1fe5e513356c0f36a2b0d7568b0", size = 1912713, upload-time = "2026-08-28T10:01:12.285Z" }, + { url = "https://files.pythonhosted.org/packages/1f/93/fd89e9ad49b1805ca94d24ce1088b7d305f05c35ffafcedb9819d03588a0/pydantic_core-2.46.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413a717a410d0c817ef5b786a059415550b3794e1d0c2abffd9efb93a3d9f7b4", size = 2090926, upload-time = "2026-08-28T10:01:15.19Z" }, + { url = "https://files.pythonhosted.org/packages/6f/45/8e59dab6acf8d35f02f0a958980074f31038968bdb2c983fcae9d1efee03/pydantic_core-2.46.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e449def1945a462c464331254e5a44fca7c3b4f9aedf59ec2f50f8066dd8e25", size = 2131303, upload-time = "2026-08-28T10:01:17.937Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a5/e1d4dc5180dd887a9522efc1f8716b8692b7606b1d3273d7862eaf66be44/pydantic_core-2.46.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a445486499897b88a7d6c310c88ed64dd37b1b59bfd7ae9107490bbb362f47d6", size = 2145128, upload-time = "2026-08-28T10:01:20.694Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/ad493864a7fb21c0c4df98f965e2db430cb25a9d7369b5778d5016c09fd9/pydantic_core-2.46.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2d330aaba8621b1edcec8ae2c4050f63b84ccf6d98723a8f212e9684713abf0e", size = 2294560, upload-time = "2026-08-28T10:01:23.495Z" }, + { url = "https://files.pythonhosted.org/packages/02/8e/b41c84c913f29973a268e6c2b5bbf13c95adb9956c126d10da11ba3b2bef/pydantic_core-2.46.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b6acfb46a814762367fb7ba0828b0a17d441b92ce249a0e007474c9072662dda", size = 2317531, upload-time = "2026-08-28T10:01:26.334Z" }, + { url = "https://files.pythonhosted.org/packages/db/1d/068464f23075f66a8f1b806935e9cd9363ee446636ea70d2c22ee8659dbf/pydantic_core-2.46.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d0a24b40877af2de4950252be9d21eaf7fb07660f3c2cae1f56c6b599ada5266", size = 2140686, upload-time = "2026-08-28T10:01:28.947Z" }, ] [[package]] name = "pydantic-settings" -version = "2.14.2" +version = "2.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/b5/8f48e906c3e0205276e8bd8cb7512217a87b2685304d64be27cad5b3019f/pydantic_settings-2.14.2.tar.gz", hash = "sha256:c19dd64b19097f1de80184f0cc7b0272a13ae6e170cbf240a3e27e381ed14a5f", size = 237700, upload-time = "2026-06-19T13:44:56.324Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/ca/31c57507b13119d7d3cfa1576dad2911a4861e3be07b579395f4e9d393f9/pydantic_settings-2.15.0.tar.gz", hash = "sha256:694b793e84f766ba76a90ebdefc01d0a9a045dab0382bee70393da93712ad117", size = 261253, upload-time = "2026-08-07T09:24:57.419Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/c1/6e422f34e569cf8e18df68d1939c81c099d2b61e4f7d9621c8a77560799c/pydantic_settings-2.14.2-py3-none-any.whl", hash = "sha256:a20c97b37910b6550d5ea50fbcc2d4187defe58cd57070b73863d069419c9440", size = 61715, upload-time = "2026-06-19T13:44:55.02Z" }, + { url = "https://files.pythonhosted.org/packages/30/a4/2bffa9f8e804325a09867f0e9d30795c80ea9f8d62560bd1b6ad6220eb2f/pydantic_settings-2.15.0-py3-none-any.whl", hash = "sha256:0ba092c291c94baceb5eff768aa0d56400a457585bc0175925a5a5510303da42", size = 69413, upload-time = "2026-08-07T09:24:55.839Z" }, ] [[package]] @@ -3730,23 +3971,23 @@ wheels = [ [[package]] name = "pygments" -version = "2.20.0" +version = "2.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, ] [[package]] name = "pyjwt" -version = "2.13.0" +version = "2.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/c3/8a3b59c25070cc61dc517fbdfa5dc0904670c96f605cc69759dc09166b99/pyjwt-2.14.0.tar.gz", hash = "sha256:77283c83fb56ecf566a886c757a714bc83668e38156de2cce8263302f42e0b86", size = 113177, upload-time = "2026-09-11T13:11:54.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/672cb32ce0dfea44b740cb7b4f97038463b9cf7c0ead1aacf595572851d6/pyjwt-2.14.0-py3-none-any.whl", hash = "sha256:ad0cef71c756a56e74863c2919cf0985f72decbcfcb550ee2f422e7c62b5eedc", size = 32896, upload-time = "2026-09-11T13:11:53.409Z" }, ] [package.optional-dependencies] @@ -3847,15 +4088,15 @@ wheels = [ [[package]] name = "pytest-rerunfailures" -version = "16.4" +version = "16.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/60/a90ca1cc6cffcb97b4260ed0ad2b7934b999d7c48abe4ea0840344862a3b/pytest_rerunfailures-16.4.tar.gz", hash = "sha256:8222d17c37eb7b9e4d6fc96a3c724ff4e1a5c97a5cc7cbb2c19e9282cfd21a11", size = 36635, upload-time = "2026-07-01T06:30:56.813Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/ce/065fde089d5a7f46fe8372c3f340c7aaa8708734d2e8ae3032f0c29a4b1d/pytest_rerunfailures-16.6.1.tar.gz", hash = "sha256:20ac38d31f9319c4e8f43fe0d0e9c22755508e8e7987a88de6d7fd93fc6bdabb", size = 47719, upload-time = "2026-09-03T06:50:07.893Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/93/3cdcc4033444e822e01b573414b03fd37fd5533070c750477b8f5fa5224b/pytest_rerunfailures-16.4-py3-none-any.whl", hash = "sha256:f69b5beb39622c90d1e44bd945d826eff6db545dcf0b68f52b7e4ad15eaf6d6c", size = 16955, upload-time = "2026-07-01T06:30:55.333Z" }, + { url = "https://files.pythonhosted.org/packages/0b/0d/4da1860f933e271569405fd8adef7f3e7f1c2bd1b544d2ee83a8e0acf1d2/pytest_rerunfailures-16.6.1-py3-none-any.whl", hash = "sha256:0c38d314a0a7e32795f2dbdeeb2b3d141ecf3d3abe10c8c32dae223d45ac7b3d", size = 21035, upload-time = "2026-09-03T06:50:06.601Z" }, ] [[package]] @@ -3897,11 +4138,11 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.2.2" +version = "1.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/53/ed9d74092561d4b01a2ef1349d52cdbc135e526c245f366b089cfca6de49/python_dotenv-1.2.3.tar.gz", hash = "sha256:a20a594dabeaa385725aa239d5244871c143ecb356add8a20fcf23773a6c3a35", size = 58945, upload-time = "2026-08-16T16:54:54.067Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, + { url = "https://files.pythonhosted.org/packages/0d/17/c5c6b53ddc18f297992099b3d9ec16c855c0ccc83263a21fe4d1c625ec6c/python_dotenv-1.2.3-py3-none-any.whl", hash = "sha256:904552145e8bfed22162c09dab1c2b9b54fefa7b23ba780f4f26ca0316b0f0d9", size = 22780, upload-time = "2026-08-16T16:54:52.473Z" }, ] [[package]] @@ -4013,16 +4254,16 @@ wheels = [ [[package]] name = "readme-renderer" -version = "45.0" +version = "46.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, { name = "nh3" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/51/d3a6ea424652c60f05600d8c2e01a55c913755e7cdad64afabbd1aa16f44/readme_renderer-45.0.tar.gz", hash = "sha256:030a8fac74904f8fba11ad1bb6964e3f76e896dc7e5e71f16af190c9056696d1", size = 36172, upload-time = "2026-06-09T21:05:17.37Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/d7/9309494fad74ee831d4546f69325b5519f37c6dfb2d9ba495db8c6d4f4ca/readme_renderer-46.0.tar.gz", hash = "sha256:af3e964914f6310a33ff67b72a4bdd940bed8d7c3bdecd2d14f40edf284bfe90", size = 38382, upload-time = "2026-08-28T15:18:32.49Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/1b/295bf2fa3e740131778065e5ffa2c481f0e7210182d408e9a2c244ff5b0c/readme_renderer-45.0-py3-none-any.whl", hash = "sha256:3385ed220117104a2bceb4a9dac8c5fdf6d1f96890d7ea2a9c7174fd5c84091f", size = 14134, upload-time = "2026-06-09T21:05:15.85Z" }, + { url = "https://files.pythonhosted.org/packages/4b/72/ac5ca81fe9121fcaa9d828d21017cba00a16a98e4ea5fb60c878f93dda4f/readme_renderer-46.0-py3-none-any.whl", hash = "sha256:d0dae1f74bb273b534770cb4cccb6bb78735540afdb03c2146f4e19dcd412560", size = 14239, upload-time = "2026-08-28T15:18:31.132Z" }, ] [[package]] @@ -4054,123 +4295,139 @@ wheels = [ [[package]] name = "regex" -version = "2026.7.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/37/451aaddbf50922f34d744ad5ca919ae1fcfac112123885d9728f52a484b3/regex-2026.7.10.tar.gz", hash = "sha256:1050fedf0a8a92e843971120c2f57c3a99bea86c0dfa1d63a9fac053fe54b135", size = 416282, upload-time = "2026-07-10T19:49:46.267Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/69/62bb7d63f26698949c905cb7ebe29c7b0659e2a7f2a50c35cc29640b0852/regex-2026.7.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:799a369bdab91dcf0eb424ebd7aa9650897025ce22f729248d8f2c72002c4daa", size = 494652, upload-time = "2026-07-10T19:46:28.394Z" }, - { url = "https://files.pythonhosted.org/packages/3a/f2/eed2ce38cc38def9c366d060ec739ff5f235a33647ceb73ae6be37306d39/regex-2026.7.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f0192e5f1cfc70e3cb35347135dd02e7497b3e7d83e378aa226d8b3e53a93f19", size = 295920, upload-time = "2026-07-10T19:46:30.342Z" }, - { url = "https://files.pythonhosted.org/packages/36/57/4d724eeb1c440d71ccd6400d33b62b911bb62ca05385fe1961556e628319/regex-2026.7.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:221f2771cb780186b94bbf125a151bbeb242fa1a971da6ad59d7b0370f19de9a", size = 290696, upload-time = "2026-07-10T19:46:31.953Z" }, - { url = "https://files.pythonhosted.org/packages/c7/9d/76c6779e424c64740d2a564b7ecb389a62c77b6294127d34f52008c91ea7/regex-2026.7.10-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2fb1f7a2deb4ca3ddebbae6b93905d21480a3b4e11de28d79d9fb0d316fcf8", size = 784833, upload-time = "2026-07-10T19:46:33.145Z" }, - { url = "https://files.pythonhosted.org/packages/54/ec/f777841d88f0c9d46699daf16f86a8086e077e506603be212de2c4584f85/regex-2026.7.10-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f98ef73a13791a387d5c841416ad7f52040ae5caf10bcf46fa12bd2b3d63745", size = 852182, upload-time = "2026-07-10T19:46:34.368Z" }, - { url = "https://files.pythonhosted.org/packages/d1/de/5ba208a0826117851f6c12af9ae7fae5838ccfde69b999b26c5fdc1cedc3/regex-2026.7.10-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9a094ed44a22f9da497453137c3118b531fd783866ab524b0b0fc146e7395e1d", size = 899571, upload-time = "2026-07-10T19:46:35.564Z" }, - { url = "https://files.pythonhosted.org/packages/7f/46/602b7b81d26a53113d3cec6dd845fd664d7b854b0ea45245bfdd6b9dc9ef/regex-2026.7.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53bbbd6c610489700f7110db1d85f3623924c3f7c760f987eca033867360788a", size = 794164, upload-time = "2026-07-10T19:46:36.972Z" }, - { url = "https://files.pythonhosted.org/packages/53/cc/c21ebc520c3e17d93e495eb2de2b1c5ae5f6780ccdb298b2d8ce1e940820/regex-2026.7.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:87b776cf2890e356e4ab104b9df846e169da3eb5b0f110975547091f4e51854e", size = 786304, upload-time = "2026-07-10T19:46:38.238Z" }, - { url = "https://files.pythonhosted.org/packages/65/d8/69ec8c062bbba8d4d153f9eb70ab43564f591035b81fc4ea7eb059fdf71c/regex-2026.7.10-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ab39d2c967aae3b48a412bff9cdbe7cd7559cd1e277599aceaeada7bc82b7200", size = 769958, upload-time = "2026-07-10T19:46:39.541Z" }, - { url = "https://files.pythonhosted.org/packages/af/82/c56db326ac5f852865bd78d49a275757cc367e8114b13bc1015ed2491db1/regex-2026.7.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b56416091bfd7a429f958f69aaf6823c517be9a49cb5bf1daa3767ce8bf8095e", size = 775056, upload-time = "2026-07-10T19:46:40.808Z" }, - { url = "https://files.pythonhosted.org/packages/af/2a/1ba62462f679eb598d7325ff20798a264ddb9aa34a3f5d2ac388d54c6e4b/regex-2026.7.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:617e8f10472e34a8477931f978ff3a88d46ae2ba0e41927e580b933361f60948", size = 848857, upload-time = "2026-07-10T19:46:42.02Z" }, - { url = "https://files.pythonhosted.org/packages/84/5b/37bf2e2fe810540ca90bbfe457a2f61088721c95d442eee8bb1257165ad7/regex-2026.7.10-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:31fa17378b29519bfd0a1b8ba4e9c10cf0baf1cf4099b39b0689429e7dc2c795", size = 757747, upload-time = "2026-07-10T19:46:43.282Z" }, - { url = "https://files.pythonhosted.org/packages/9a/c5/131dd41f73f766af6b08492073b5f28bc4f907b5571230c9f9e895e88302/regex-2026.7.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5c363de7c0339d39341b6181839ed32509820b85ef506deafcf2e7e43baadab4", size = 837183, upload-time = "2026-07-10T19:46:44.91Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ee/00b9332c3c5d7460639f2c10fdc7197a64de6eaafff69478ec3332815335/regex-2026.7.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed7c886a2fcbf14493ceaf9579394b33521730c161ebb8dad7db9c3e9fcab1a8", size = 782151, upload-time = "2026-07-10T19:46:46.385Z" }, - { url = "https://files.pythonhosted.org/packages/e5/a7/31ce26ec6465c12e7136ea9efcc716f5c55cac616f7958c33f0bf171781e/regex-2026.7.10-cp310-cp310-win32.whl", hash = "sha256:b04583e8867136ae66353fa274f45121ab3ec3166dc45aaff3655a5db90d9f0e", size = 266770, upload-time = "2026-07-10T19:46:47.608Z" }, - { url = "https://files.pythonhosted.org/packages/71/00/22a554bb83203eef88a40ec2fe7cf9a6e5df8765d57f7a96ebe1af5d60c3/regex-2026.7.10-cp310-cp310-win_amd64.whl", hash = "sha256:e21e888a6b471b2bb1cdd4247e8d86632672232f29be583e7eafaa5f4634d34c", size = 277941, upload-time = "2026-07-10T19:46:48.915Z" }, - { url = "https://files.pythonhosted.org/packages/76/46/596a7084918ddf18cea6fb0cc047af1f00cec8790962e8f2edee9b6ec749/regex-2026.7.10-cp310-cp310-win_arm64.whl", hash = "sha256:081acf191b4d614d573a56cab69f948b6864daa5e3cc69f209ee92e26e454c2f", size = 276923, upload-time = "2026-07-10T19:46:50.829Z" }, - { url = "https://files.pythonhosted.org/packages/3d/16/bfd13770be1acd1c05506b93fc6be15c759d6417595d1ba334d355efbf26/regex-2026.7.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:66d2c35587cd601c95965d5c0415058ba5cfd6ffbab7624ce198bd967102b341", size = 494639, upload-time = "2026-07-10T19:46:52.207Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b4/0086215709f0f705661f13ba81516287538886ef0d589c545c12b0484669/regex-2026.7.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28a0973eeffff4292f5a7ee498ab65d5e94ee8cc9cea364239251eb4a260a0f1", size = 295920, upload-time = "2026-07-10T19:46:53.63Z" }, - { url = "https://files.pythonhosted.org/packages/8e/9e/8e07d0eea46d2cf36bf4d3794634bb0a820f016d31bc349dfef008d96b02/regex-2026.7.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8331484450b3894298bef8abecce532171ff6ac60b71f999eed10f2c01941a8a", size = 290673, upload-time = "2026-07-10T19:46:54.863Z" }, - { url = "https://files.pythonhosted.org/packages/b7/56/d83c446de21c70ff49d2f1b2ff2196ac79a4ac6373d2cfe496011a250600/regex-2026.7.10-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0639b2488b775a0109f55a5a2172deebdedb4b6c5ab0d48c90b43cbf5de58d17", size = 792378, upload-time = "2026-07-10T19:46:56.116Z" }, - { url = "https://files.pythonhosted.org/packages/dc/0e/d265e0cc6da47aea97e90eb896be2d2e8f92d16add13bac04fa46a0fd972/regex-2026.7.10-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:be4223af640d0aa04c05db81d5d96ada3ead9c09187d892fd37f4f97829480be", size = 861790, upload-time = "2026-07-10T19:46:57.611Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a5/62655f6208d1170a3e9188d6a45d4af0a5ae3b9da8b87d474818ac5ff016/regex-2026.7.10-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d3c75d57a00109255e60bc9c623b6ececaf7905eaab845c79f036670ed4750a2", size = 906530, upload-time = "2026-07-10T19:46:59.142Z" }, - { url = "https://files.pythonhosted.org/packages/86/b7/d65aa2e9ffb18677cd0afbcf5990da8519a4e50778deb1bca49f043c5174/regex-2026.7.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:724ee9379568658ec06362cf24325c5315cc5a67f61dfe585bfeff58300a355b", size = 799912, upload-time = "2026-07-10T19:47:00.534Z" }, - { url = "https://files.pythonhosted.org/packages/8f/19/3a5ce23ea2eb1fe36306aef49c79746ce297e4b434aeb981b525c661413a/regex-2026.7.10-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:732c19e5828eb287d01edb83b2eb87f283ba8e5fc3441c732709d3e8cbd14aaa", size = 773675, upload-time = "2026-07-10T19:47:01.999Z" }, - { url = "https://files.pythonhosted.org/packages/fe/76/3c0eaa426700dd2ba14f2335f2b700a4e1484202254192ae440b83b8352a/regex-2026.7.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:982d07727c809b42a3968785354f11c3728414e4e90af0754345b431b2c32561", size = 781711, upload-time = "2026-07-10T19:47:03.425Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a8/a5a3fad84f9a7f897619f0f8e0a2c64946e9709044a186a8f869fb5c332f/regex-2026.7.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4574feca202f8c470bf678aed8b5d89df04aaf8dc677f3b83d92825051301c0f", size = 854539, upload-time = "2026-07-10T19:47:04.999Z" }, - { url = "https://files.pythonhosted.org/packages/f8/c7/47e9b8c8ee77723b9eda74f517b6b25d2f555cf276c063a9eeea35bd86d5/regex-2026.7.10-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:80151ca5bfc6c4524186b3e08b499e97319b2001fc265ed2d4fc12c0d5692cdf", size = 763378, upload-time = "2026-07-10T19:47:06.845Z" }, - { url = "https://files.pythonhosted.org/packages/36/09/e27e42d9d42edf71205c7e6f5b2902bc874ea03c557c80da03b8ed16c9bf/regex-2026.7.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bb52e10e453b5493afe1f7702a2973bc10f4dd8901c0f2ed869ffaa3f8319296", size = 844663, upload-time = "2026-07-10T19:47:08.923Z" }, - { url = "https://files.pythonhosted.org/packages/a1/b5/2423acb98362184ad9c8eebabafa15188d6a177daab919add8f2120fc6cd/regex-2026.7.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37aba1994d73b4944053ab65a15f313bd5c28c885dd7f0d494a11749d89db6e", size = 789236, upload-time = "2026-07-10T19:47:10.303Z" }, - { url = "https://files.pythonhosted.org/packages/60/ed/b387e84c8a3d6aa115dfb56865437a3fbaf28f4a6fb3b76cc6cce38ced70/regex-2026.7.10-cp311-cp311-win32.whl", hash = "sha256:6cbedeb5112f59dbd169385459b9943310bdd241c6966c19c5f6e2295055c93a", size = 266774, upload-time = "2026-07-10T19:47:11.904Z" }, - { url = "https://files.pythonhosted.org/packages/c4/64/f30a163a65ed1f07ad12c53af00a6bd2a7251a5329fba5a08adc6f9e81a3/regex-2026.7.10-cp311-cp311-win_amd64.whl", hash = "sha256:b1963ec5ba4d52788fb0eac6aca6eb8040e8e318c7e47ebbdfc09440c802919c", size = 277959, upload-time = "2026-07-10T19:47:13.231Z" }, - { url = "https://files.pythonhosted.org/packages/2b/de/61c8174171134cebb834ca9f8fe2ff8f49d8a3dd43453b48b537d0fbb49b/regex-2026.7.10-cp311-cp311-win_arm64.whl", hash = "sha256:3750c42d47712e362158a04d0fd80131f73a55e8c715b2885442a0ff6f9fc3fc", size = 276918, upload-time = "2026-07-10T19:47:14.693Z" }, - { url = "https://files.pythonhosted.org/packages/b3/9c/2503d4ccf3452dc323f8baa3cf3ee10406037d52735c76cfced81423f183/regex-2026.7.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7252b48b0c60100095088fbeb281fca9a4fcf678a4e04b1c520c3f8613c952c4", size = 497114, upload-time = "2026-07-10T19:47:16.22Z" }, - { url = "https://files.pythonhosted.org/packages/91/eb/04534f4263a4f658cd20a511e9d6124350044f2214eb24fee2db96acf318/regex-2026.7.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:da6ef4cb8d457aab0482b50120136ae94238aaa421863eaa7d599759742c72d6", size = 297422, upload-time = "2026-07-10T19:47:17.794Z" }, - { url = "https://files.pythonhosted.org/packages/ca/2d/35809de392ab66ba439b58c3187ae3b8b53c883233f284b59961e5725c99/regex-2026.7.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe7ff456c22725c9d9017f7a2a7df2b51af6df77314176760b22e2d05278e181", size = 292110, upload-time = "2026-07-10T19:47:19.188Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1e/5ce0fbe9aab071893ce2b7df020d0f561f7b411ec334124302468d587884/regex-2026.7.10-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3463a5f26be513a49e4d497debcf1b252a2db7b92c77d89621aa90b83d2dd38", size = 796800, upload-time = "2026-07-10T19:47:20.639Z" }, - { url = "https://files.pythonhosted.org/packages/d4/67/c1ccbada395c10e334763b583e1039b1660b142303ebb941d4269130b22f/regex-2026.7.10-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:948dfc62683a6947b9b486c4598d8f6e3ecc542478b6767b87d52be68aeb55c6", size = 865509, upload-time = "2026-07-10T19:47:22.135Z" }, - { url = "https://files.pythonhosted.org/packages/0e/06/f0b31afc16c1208f945b66290eb2a9936ab8becdfb23bbcedb91cc5f9d9b/regex-2026.7.10-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c2cbd385d82f63bb35edb60b09b08abad3619bd0a4a492ae59e55afaf98e1b9d", size = 912395, upload-time = "2026-07-10T19:47:24.128Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1c/8687de3a6c3220f4f872a9bf4bcd8dc249f2a96e7dddfa93de8bd4d16399/regex-2026.7.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f6222cafe00e072bb2b8f14142cd969637411fbc4dd3b1d73a90a3b817fa046f", size = 801308, upload-time = "2026-07-10T19:47:25.696Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e3/60a40ec02a2315d826414a125640aceb6f30450574c530c8f352110ece0e/regex-2026.7.10-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:65ee5d1ac3cd541325f5ac92625b1c1505f4d171520dd931bda7952895c5321a", size = 777120, upload-time = "2026-07-10T19:47:27.158Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9a/ec579b4f840ac59bc7c192b56e66abd4cbf385615300d59f7c94bf6863ae/regex-2026.7.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa34473fbcc108fea403074f3f45091461b18b2047d136f16ffaa4c65ad46a68", size = 785164, upload-time = "2026-07-10T19:47:28.732Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1c/60d88afd5f98d4b0fb1f8b8969270628140dc01c7ff93a939f2aa83f31a6/regex-2026.7.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d028d189d8f38d7ff292f22187c0df37f2317f554d2ed9a2908ada330af57c0", size = 860161, upload-time = "2026-07-10T19:47:30.605Z" }, - { url = "https://files.pythonhosted.org/packages/2a/40/08ae3ba45fe79e48c9a888a3389a7ee7e2d8c580d2d996da5ece02dfdcb9/regex-2026.7.10-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:396ea70e4ea1f19571940add3bad9fd3eb6a19dc610d0d01f692bc1ba0c10cb4", size = 765829, upload-time = "2026-07-10T19:47:32.06Z" }, - { url = "https://files.pythonhosted.org/packages/12/e6/e613c6755d19aca9d977cdc3418a1991ffc8f386779752dd8fdfa888ea89/regex-2026.7.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ebbf0d83ed5271991d666e54bb6c90ac2c55fb2ef3a88740c6af85dc85de2402", size = 852170, upload-time = "2026-07-10T19:47:33.567Z" }, - { url = "https://files.pythonhosted.org/packages/03/33/89072f2060e6b844b4916d5bc40ef01e973640c703025707869264ec75ab/regex-2026.7.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:58a4571b2a093f6f6ee4fd281faa8ebf645abcf575f758173ea2605c7a1e1ecb", size = 789550, upload-time = "2026-07-10T19:47:35.395Z" }, - { url = "https://files.pythonhosted.org/packages/e3/3c/4bc8be9a155035e63780ccac1da101f36194946fdc3f6fce90c7179fc6df/regex-2026.7.10-cp312-cp312-win32.whl", hash = "sha256:eac1207936555aa691ce32df1432b478f2729d54e6d93a1f4db9215bcd8eb47d", size = 267151, upload-time = "2026-07-10T19:47:37.047Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/9f5aade65bb98cc6e99c336e45a49a658300720c16721f3e687f8d754fec/regex-2026.7.10-cp312-cp312-win_amd64.whl", hash = "sha256:ecae626449d00db8c08f8f1fc00047a32d6d7eb5402b3976f5c3fda2b80a7a4f", size = 277751, upload-time = "2026-07-10T19:47:38.488Z" }, - { url = "https://files.pythonhosted.org/packages/36/6f/d069dd12872ea1d50e17319d342f89e2072cae4b62f4245009a1108c74d8/regex-2026.7.10-cp312-cp312-win_arm64.whl", hash = "sha256:87794549a3f5c1c2bdfba2380c1bf87b931e375f4133d929da44f95e396bf5fe", size = 277063, upload-time = "2026-07-10T19:47:40.023Z" }, - { url = "https://files.pythonhosted.org/packages/e0/88/0c977b9f3ba9b08645516eca236388c340f56f7a87054d41a187a04e134c/regex-2026.7.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4db009b4fc533d79af3e841d6c8538730423f82ea8508e353a3713725de7901c", size = 496868, upload-time = "2026-07-10T19:47:41.675Z" }, - { url = "https://files.pythonhosted.org/packages/f6/51/600882cd5d9a3cf083fd66a4064f5b7f243ba2a7de2437d42823e286edaf/regex-2026.7.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b96341cb29a3faa5db05aff29c77d141d827414f145330e5d8846892119351c1", size = 297306, upload-time = "2026-07-10T19:47:43.521Z" }, - { url = "https://files.pythonhosted.org/packages/52/6f/48a912054ffcb756e374207bb8f4430c5c3e0ffa9627b3c7b6661844b30a/regex-2026.7.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14d27f6bd04beb01f6a25a1153d73e58c290fd45d92ba56af1bb44199fd1010d", size = 291950, upload-time = "2026-07-10T19:47:45.267Z" }, - { url = "https://files.pythonhosted.org/packages/1a/c8/8e1c3c86ebcee7effccbd1f7fc54fe3af22aa0e9204503e2baea4a6ff001/regex-2026.7.10-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6b6a11bf898cca3ce7bfaa17b646901107f3975677fbd5097f36e5eb5641983", size = 796817, upload-time = "2026-07-10T19:47:48.054Z" }, - { url = "https://files.pythonhosted.org/packages/65/39/3e49d9ff0e0737eb8180a00569b47aabb59b84611f48392eba4d998d91a0/regex-2026.7.10-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:234f8e0d65cf1df9becadae98648f74030ee85a8f12edcb5eb0f60a22a602197", size = 865513, upload-time = "2026-07-10T19:47:49.855Z" }, - { url = "https://files.pythonhosted.org/packages/70/57/6511ad809bb3122c65bbeeffa5b750652bb03d273d29f3acb0754109b183/regex-2026.7.10-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:91b916d495db3e1b473c7c8e68733beec4dce8e487442db61764fff94f59740e", size = 912391, upload-time = "2026-07-10T19:47:51.776Z" }, - { url = "https://files.pythonhosted.org/packages/cc/29/a1b0c109c9e878cb04b931bfe4c54332d692b93c322e127b5ae9f25b0d9e/regex-2026.7.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f0d4ccf70b1d13711242de0ba78967db5c35d12ac408378c70e06295c3f6644", size = 801338, upload-time = "2026-07-10T19:47:53.38Z" }, - { url = "https://files.pythonhosted.org/packages/33/be/171c3dad4d77000e1befeff2883ca88734696dfd97b2951e5e074f32e4dd/regex-2026.7.10-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c622f4c638a725c39abcb2e680b1bd592663c83b672a4ed350a17f806d75618e", size = 777149, upload-time = "2026-07-10T19:47:54.944Z" }, - { url = "https://files.pythonhosted.org/packages/33/61/41ab0de0e4574da1071c151f67d1eb9db3d92c43e31d64d2e6863c3d89bf/regex-2026.7.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41a47c2b28d9421e2509a4583a22510dc31d83212fcf38e1508a7013140f71a8", size = 785216, upload-time = "2026-07-10T19:47:56.56Z" }, - { url = "https://files.pythonhosted.org/packages/66/28/372859ea693736f07cf7023247c7eca8f221d9c6df8697ff9f93371cca08/regex-2026.7.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:13fba679fe035037e9d5286620f88bbfd105df4d5fcd975942edd282ab986775", size = 860229, upload-time = "2026-07-10T19:47:58.278Z" }, - { url = "https://files.pythonhosted.org/packages/50/b1/e1d32cd944b599534ae655d35e8640d0ec790c0fa12e1fb29bf434d50f55/regex-2026.7.10-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8e26a075fa9945b9e44a3d02cc83d776c3b76bb1ff4b133bbfa620d5650131da", size = 765797, upload-time = "2026-07-10T19:48:00.291Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/79a2cd9556a3329351e370929743ef4f0ccc0aaff6b3dc414ae5fa4a1302/regex-2026.7.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d0834c84ae8750ae1c4cede59b0afd4d2f775be958e11b18a3eea24ed9d0d9f1", size = 852130, upload-time = "2026-07-10T19:48:01.972Z" }, - { url = "https://files.pythonhosted.org/packages/66/58/76fec29898cf5d359ab63face50f9d4f7135cc2eca3477139227b1d09952/regex-2026.7.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64722a5031aeace7f6c8d5ea9a9b22d9368af0d6e8fa532585da8158549ea963", size = 789644, upload-time = "2026-07-10T19:48:03.748Z" }, - { url = "https://files.pythonhosted.org/packages/f6/06/3c7cec7817bda293e13c8f88aed227bbcf8b37e5990936ff6442a8fdf11a/regex-2026.7.10-cp313-cp313-win32.whl", hash = "sha256:74ae61d8573ecd51b5eeee7be2218e4c56e99c14fa8fcf97cf7519611d4be92e", size = 267130, upload-time = "2026-07-10T19:48:05.677Z" }, - { url = "https://files.pythonhosted.org/packages/88/6c/e2a6f9a6a905f923cfc912298a5949737e9504b1ca24f29eda8d04d05ece/regex-2026.7.10-cp313-cp313-win_amd64.whl", hash = "sha256:5e792367e5f9b4ffb8cad93f1beaa91837056b94da98aa5c65a0db0c1b474927", size = 277722, upload-time = "2026-07-10T19:48:07.318Z" }, - { url = "https://files.pythonhosted.org/packages/00/a6/9d8935aaa940c388496aa1a0c82669cc4b5d06291c2712d595e3f0cf16d3/regex-2026.7.10-cp313-cp313-win_arm64.whl", hash = "sha256:82ab8330e7e2e416c2d42fcec67f02c242393b8681014750d4b70b3f158e1f08", size = 277059, upload-time = "2026-07-10T19:48:08.977Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e9/26decfd3e85c09e42ff7b0d23a6f51085ca4c268db15f084928ca33459c6/regex-2026.7.10-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2b93eafd92c4128bab2f93500e8912cc9ecb3d3765f6685b902c6820d0909b6b", size = 501508, upload-time = "2026-07-10T19:48:10.668Z" }, - { url = "https://files.pythonhosted.org/packages/38/a5/5b167cebde101945690219bf34361481c9f07e858a4f46d9996b80ec1490/regex-2026.7.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3f03b92fb6ec739df042e45b06423fc717ecf0063e07ffe2897f7b2d5735e1e8", size = 299705, upload-time = "2026-07-10T19:48:12.544Z" }, - { url = "https://files.pythonhosted.org/packages/f6/20/7909be4b9f449f8c282c14b6762d59aa722aeaeebe7ee4f9bb623eeaa5e0/regex-2026.7.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bb5aab464a0c5e03a97abad5bdf54517061ebbf72340d576e99ff661a42575cc", size = 294605, upload-time = "2026-07-10T19:48:14.495Z" }, - { url = "https://files.pythonhosted.org/packages/82/88/e52550185d6fda68f549b01239698697de47320fd599f5e880b1986b7673/regex-2026.7.10-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fadb07dbe36a541283ff454b1a268afd54b077d917043f2e1e5615372cb5f200", size = 811747, upload-time = "2026-07-10T19:48:16.197Z" }, - { url = "https://files.pythonhosted.org/packages/06/98/16c255c909714de1ee04da6ae30f3ee04170f300cdc0dcf57a314ee4816a/regex-2026.7.10-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:21150500b970b12202879dfd82e7fd809d8e853140fff84d08e57a90cf1e154e", size = 871203, upload-time = "2026-07-10T19:48:18.12Z" }, - { url = "https://files.pythonhosted.org/packages/3b/32/423ed27c9bae2092a453e853da2b6628a658d08bb5a6117db8d591183d85/regex-2026.7.10-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a68b637451d64ba30ed8ae125c973fa834cc2d37dfa7f154c2b479015d477ba8", size = 917334, upload-time = "2026-07-10T19:48:19.952Z" }, - { url = "https://files.pythonhosted.org/packages/73/87/74dac8efb500db31cb000fda6bae2be45fc2fbf1fa9412f445fbb8acbe37/regex-2026.7.10-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e23458d8903e33e7d27196d7a311523dc4e2f4137a5f34e4dbd30c8d37ff33e", size = 816379, upload-time = "2026-07-10T19:48:21.616Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9f/1859403654e3e030b288f06d49233c6a4f889d62b84c4ef3f3a28653173d/regex-2026.7.10-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae27622c094558e519abf3242cf4272db961d12c5c9a9ffb7a1b44b2627d5c6", size = 785563, upload-time = "2026-07-10T19:48:23.643Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d8/35d30d6bdf1ef6a5430e8982607b3a6db4df1ddedbe001e43435585d88ba/regex-2026.7.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ee877b6d78f9dff1da94fef51ae8cf9cce0967e043fdcc864c40b85cf293c192", size = 801415, upload-time = "2026-07-10T19:48:25.499Z" }, - { url = "https://files.pythonhosted.org/packages/f7/22/630f31f5ea4826167b2b064d9cac2093a5b3222af380aa432cfe1a5dabcd/regex-2026.7.10-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:2c66a8a1969cfd506d1e203c0005fd0fc3fe6efc83c945606566b6f9611d4851", size = 866560, upload-time = "2026-07-10T19:48:27.789Z" }, - { url = "https://files.pythonhosted.org/packages/8d/14/f5914a6d9c5bc63b9bed8c9a1169fb0be35dbe05cdc460e17d953031a366/regex-2026.7.10-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:2bc350e1c5fa250f30ab0c3e38e5cfdffcd82cb8af224df69955cab4e3003812", size = 772877, upload-time = "2026-07-10T19:48:29.563Z" }, - { url = "https://files.pythonhosted.org/packages/c1/0f/7c13999eef3e4186f7c79d4950fa56f041bf4de107682fb82c80db605ff9/regex-2026.7.10-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:53f54993b462f3f91fea0f2076b46deb6619a5f45d70dbd1f543f789d8b900ef", size = 856648, upload-time = "2026-07-10T19:48:31.282Z" }, - { url = "https://files.pythonhosted.org/packages/a4/71/a48e43909b6450fb48fa94e783bef2d9a37179258bc32ef2283955df7be7/regex-2026.7.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cfcec18f7da682c4e2d82112829ce906569cb8d69fa6c26f3a50dfbed5ceb682", size = 803520, upload-time = "2026-07-10T19:48:33.275Z" }, - { url = "https://files.pythonhosted.org/packages/e0/b8/f037d1bf2c133cb24ceb6e7d81d08417080390eddab6ddfd701aa7091874/regex-2026.7.10-cp313-cp313t-win32.whl", hash = "sha256:a2d6d30be35ddd70ce0f8ee259a4c25f24d6d689a45a5ac440f03e6bcc5a21d1", size = 269168, upload-time = "2026-07-10T19:48:35.353Z" }, - { url = "https://files.pythonhosted.org/packages/b6/9c/eaac34f8452a838956e7e89852ad049678cdc1af5d14f72d3b3b658b1ea5/regex-2026.7.10-cp313-cp313t-win_amd64.whl", hash = "sha256:c57b6ad3f7a1bdd101b2966f29dc161adf49727b1e8d3e1e89db2eda8a75c344", size = 280004, upload-time = "2026-07-10T19:48:37.106Z" }, - { url = "https://files.pythonhosted.org/packages/cd/a9/e22e997587bc1d588b0b2cd0572027d39dd3a006216e40bbf0361688c51c/regex-2026.7.10-cp313-cp313t-win_arm64.whl", hash = "sha256:3d8ef9df02c8083c7b4b855e3cb87c8e0ebbcfea088d98c7a886aaefdf88d837", size = 279308, upload-time = "2026-07-10T19:48:38.907Z" }, - { url = "https://files.pythonhosted.org/packages/6a/4a/a7fa3ada9bd2d2ce20d56dfceec6b2a51afeed9bf3d8286355ceec5f0628/regex-2026.7.10-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:39f81d1fdf594446495f2f4edd8e62d8eda0f7a802c77ac596dc8448ad4cc5ca", size = 497087, upload-time = "2026-07-10T19:48:40.543Z" }, - { url = "https://files.pythonhosted.org/packages/0f/7e/ca0b1a87192e5828dbc16f16ae6caca9b67f25bf729a3348468a5ff52755/regex-2026.7.10-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:441edc66a54063f8269d1494fc8474d06605e71e8a918f4bcfd079ebda4ce042", size = 297307, upload-time = "2026-07-10T19:48:42.213Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/fb40bb34275d3cd4d7a376d5fb2ea1f0f4a96fd884fa83c0c4ae869001bf/regex-2026.7.10-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cfeb11990f59e59a0df26c648f0adfcbf27be77241250636f5769eb08db662be", size = 292163, upload-time = "2026-07-10T19:48:43.929Z" }, - { url = "https://files.pythonhosted.org/packages/18/0b/34cbea16c8fea9a18475a7e8f5837c70af451e738bfeb4eb5b029b7dc07a/regex-2026.7.10-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:460176b2db044a292baaee6891106566739657877af89a251cded228689015a6", size = 797064, upload-time = "2026-07-10T19:48:45.623Z" }, - { url = "https://files.pythonhosted.org/packages/87/77/f6805d97f15f5a710bdfd56a768f3468c978239daf9e1b15efd8935e1967/regex-2026.7.10-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9dc55698737aca028848bde418d6c51d74f2a5fd44872d3c8b56b626729adb89", size = 866155, upload-time = "2026-07-10T19:48:47.589Z" }, - { url = "https://files.pythonhosted.org/packages/a2/e3/a2a905807bba3bcd90d6ebbb67d27af2adf7d41708175cbc6b956a0c75f1/regex-2026.7.10-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d3e10779f60c000213a5b53f518824bd07b3dc119333b26d70c6be1c27b5c794", size = 911596, upload-time = "2026-07-10T19:48:49.473Z" }, - { url = "https://files.pythonhosted.org/packages/a2/ca/a3126888b2c6f33c7e29144fedf85f6d5a52a400024fa045ad8fc0550ef1/regex-2026.7.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:38a5926601aaccf379512746b86eb0ac1d29121f6c776dac6ac5b31077432f2c", size = 800713, upload-time = "2026-07-10T19:48:51.452Z" }, - { url = "https://files.pythonhosted.org/packages/66/19/9d252fd969f726c8b56b4bacf910811cc70495a110907b3a7ccb96cd9cad/regex-2026.7.10-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a72ecf5bfd3fc8d57927f7e3ded2487e144472f39010c3acaec3f6f3ff53f361", size = 777286, upload-time = "2026-07-10T19:48:53.443Z" }, - { url = "https://files.pythonhosted.org/packages/40/7a/5f1bf433fa446ecb3aab87bb402603dc9e171ef8052c1bb8690bb4e255a3/regex-2026.7.10-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d50714405845c1010c871098558cfe5718fe39d2a2fab5f95c8863caeb7a82b3", size = 785826, upload-time = "2026-07-10T19:48:55.381Z" }, - { url = "https://files.pythonhosted.org/packages/99/ca/69f3a7281d86f1b592338007f3e535cc219d771448e2b61c0b56e4f9d05b/regex-2026.7.10-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ec1c44cf9bd22079aac37a07cb49a29ced9050ab5bddf24e50aba298f1e34d90", size = 860957, upload-time = "2026-07-10T19:48:57.962Z" }, - { url = "https://files.pythonhosted.org/packages/bc/11/487ff55c8d515ec9dd60d7ba3c129eeaa9e527358ed9e8a054a9e9430f81/regex-2026.7.10-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:9e9aaef25a40d1f1e1bbb1d0eb0190c4a64a7a1750f7eb67b8399bed6f4fd2a6", size = 765959, upload-time = "2026-07-10T19:49:00.27Z" }, - { url = "https://files.pythonhosted.org/packages/73/e1/fa034e6fa8896a09bd0d5e19c81fdc024411ab37980950a0401dccee8f6d/regex-2026.7.10-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:e54e088dc64dd2766014e7cfe5f8bc45399400fd486816e494f93e3f0f55da06", size = 851447, upload-time = "2026-07-10T19:49:02.128Z" }, - { url = "https://files.pythonhosted.org/packages/ee/a5/b9427ed53b0e14c540dc436d56aaf57a19fb9183c6e7abd66f4b4368fbad/regex-2026.7.10-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:834271b1ff2cfa1f67fcd65a48bf11d11e9ab837e21bf79ce554efb648599ae8", size = 789418, upload-time = "2026-07-10T19:49:03.949Z" }, - { url = "https://files.pythonhosted.org/packages/ba/52/aab92420c8aa845c7bcbe68dc65023d4a9e9ea785abf0beb2198f0de5ba1/regex-2026.7.10-cp314-cp314-win32.whl", hash = "sha256:f988a1cec68058f71a38471813fba9e87dffe855582682e8a10e40ece12567a2", size = 272538, upload-time = "2026-07-10T19:49:05.833Z" }, - { url = "https://files.pythonhosted.org/packages/99/16/5c7050e0ef7dd8889441924ff0a2c33b7f0587c0ccb0953fe7ca997d673b/regex-2026.7.10-cp314-cp314-win_amd64.whl", hash = "sha256:2129e4a5e86f26926982d883dff815056f2e98220fdf630e59f961b578a26c43", size = 280796, upload-time = "2026-07-10T19:49:07.593Z" }, - { url = "https://files.pythonhosted.org/packages/e8/1a/4f6099d2ba271502fdb97e697bae2ed0213c0d87f2273fe7d21e2e401d12/regex-2026.7.10-cp314-cp314-win_arm64.whl", hash = "sha256:9cd5b6805396157b4cf993a6940cbb8663161f29b4df2458c1c9991f099299c5", size = 281017, upload-time = "2026-07-10T19:49:09.767Z" }, - { url = "https://files.pythonhosted.org/packages/19/02/4061fc71f64703e0df61e782c2894c3fbc089d277767eff6e16099581c73/regex-2026.7.10-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:103e8f3acc3dcede88c0331c8612766bdcfc47c9250c5477f0e10e0550b9da49", size = 501467, upload-time = "2026-07-10T19:49:11.952Z" }, - { url = "https://files.pythonhosted.org/packages/73/a5/8d42b2f3fd672908a05582effd0f88438bf9bb4e8e02d69a62c723e23601/regex-2026.7.10-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:538ddb143f5ca085e372def17ef3ed9d74b50ad7fc431bd85dc50a9af1a7076f", size = 299700, upload-time = "2026-07-10T19:49:14.067Z" }, - { url = "https://files.pythonhosted.org/packages/65/70/36fa4b46f73d268c0dbe77c40e62da2cd4833ee206d3b2e438c2034e1f36/regex-2026.7.10-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e3448e86b05ce87d4eb50f9c680860830f3b32493660b39f43957d6263e2eba", size = 294590, upload-time = "2026-07-10T19:49:15.883Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a7/b6db1823f3a233c2a46f854fdc986f4fd424a84ed557b7751f2998efb266/regex-2026.7.10-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5eab9d3f981c423afd1a61db055cfe83553c3f6455949e334db04722469dd0a2", size = 811925, upload-time = "2026-07-10T19:49:17.97Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7d/f8bee4c210c42c7e8b952bb9fb7099dd7fb2f4bd0f33d0d65a8ab08aafc0/regex-2026.7.10-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:177f930af3ad72e1045f8877540e0c43a38f7d328cf05f31963d0bd5f7ecf067", size = 871257, upload-time = "2026-07-10T19:49:19.943Z" }, - { url = "https://files.pythonhosted.org/packages/5d/78/22adf72e614ba0216b996e9aaef5712c23699e360ea127bb3d5ee1a7666f/regex-2026.7.10-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dd3b6d97beb39afb412f2c79522b9e099463c31f4c49ab8347c5a2ca3531c478", size = 917551, upload-time = "2026-07-10T19:49:22.069Z" }, - { url = "https://files.pythonhosted.org/packages/03/f7/ebc15a39e81e6b58da5f913b91fc293a25c6700d353c14d5cd25fc85712a/regex-2026.7.10-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8679f0652a183d93da646fcec8da8228db0be40d1595da37e6d74c2dc8c4713c", size = 816436, upload-time = "2026-07-10T19:49:24.131Z" }, - { url = "https://files.pythonhosted.org/packages/5c/33/20bc2bdd57f7e0fcc51be37e4c4d1bca7f0b4af8dc0a148c23220e689da8/regex-2026.7.10-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:494b19a5805438aeb582de99f9d97603d8fd48e6f4cc74d0088bb292b4da3b70", size = 785935, upload-time = "2026-07-10T19:49:26.265Z" }, - { url = "https://files.pythonhosted.org/packages/b4/51/87ff99c849b56309c40214a72b54b0eef320d0516a8a516970cc8be1b725/regex-2026.7.10-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0911e34151a5429d0325dae538ba9851ec0b62426bdfd613060cda8f1c36ec7f", size = 801494, upload-time = "2026-07-10T19:49:28.493Z" }, - { url = "https://files.pythonhosted.org/packages/16/11/fde67d49083fef489b7e0f841e2e5736516795b166c9867f05956c1e494b/regex-2026.7.10-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b862572b7a5f5ed47d2ba5921e63bf8d9e3b682f859d8f11e0e5ca46f7e82173", size = 866549, upload-time = "2026-07-10T19:49:30.592Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b5/31a156c36acf10181d88f55a66c688d5454a344e53ccc03d49f4a48a2297/regex-2026.7.10-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:3f361215e000d68a4aff375106637b83c80be36091d83ee5107ad3b32bd73f48", size = 773089, upload-time = "2026-07-10T19:49:32.661Z" }, - { url = "https://files.pythonhosted.org/packages/27/bb/734e978c904726664df47ae36ce5eca5065de5141185ae46efec063476a2/regex-2026.7.10-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:4533af6099543db32ef26abc2b2f824781d4eebb309ab9296150fd1a0c7eb07d", size = 856710, upload-time = "2026-07-10T19:49:35.289Z" }, - { url = "https://files.pythonhosted.org/packages/6d/e5/dc35cea074dbdcb9776c4b0542a3bc326ff08454af0768ef35f3fc66e7fa/regex-2026.7.10-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:668ab85105361d0200e3545bec198a1acfc6b0aeb5fff8897647a826e5a171be", size = 803621, upload-time = "2026-07-10T19:49:37.704Z" }, - { url = "https://files.pythonhosted.org/packages/a6/b2/124564af46bc0b592785610b3985315610af0a07f4cf21fa36e06c2398dd/regex-2026.7.10-cp314-cp314t-win32.whl", hash = "sha256:dd7715817a187edd7e2a2390908757f7ba42148e59cad755fb8ee1160c628eca", size = 274558, upload-time = "2026-07-10T19:49:39.926Z" }, - { url = "https://files.pythonhosted.org/packages/4e/9c/cd813ce9f3404c0443915175c1e339c5afd8fcda04310102eaf233015eef/regex-2026.7.10-cp314-cp314t-win_amd64.whl", hash = "sha256:78712d4954234df5ca24fdadb65a2ab034213f0cdfde376c272f9fc5e09866bb", size = 283687, upload-time = "2026-07-10T19:49:41.872Z" }, - { url = "https://files.pythonhosted.org/packages/1b/d3/3dae6a6ce46144940e64425e32b8573a393a009aeaf75fa6752a35399056/regex-2026.7.10-cp314-cp314t-win_arm64.whl", hash = "sha256:749b92640e1970e881fdf22a411d74bf9d049b154f4ef7232eeb9a90dd8be7f3", size = 283377, upload-time = "2026-07-10T19:49:43.985Z" }, +version = "2026.9.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/5c/f403115361de25809e8f785686ec7096e30fef73be9ae35aa51da4e80abb/regex-2026.9.10.tar.gz", hash = "sha256:1e321e2c84f0e52c457f5ea5944f796d6e8e09cb99738ea98dcc1bfe402a128d", size = 417072, upload-time = "2026-09-09T21:00:21.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/29/b4160140513c37ea8e7d87c467b5b7e658f53ca4cdcfe394b82ec768d0b4/regex-2026.9.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7dcad477c49c4c626a6c4fcd71b39a971aa217060cc40a6569fd24edcc0fa509", size = 493887, upload-time = "2026-09-09T20:56:21.178Z" }, + { url = "https://files.pythonhosted.org/packages/01/f9/6008e74d6076a980a48cb3eeaf80c1324db73f2eed89a8023e91669dad84/regex-2026.9.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d414c411c06fe0009eac33488fb1591c66b5c2673e342e452e7bb2fe63da8194", size = 295102, upload-time = "2026-09-09T20:56:22.687Z" }, + { url = "https://files.pythonhosted.org/packages/7e/cd/2f540fc813d1f71f18e1cc6861483133a0e6afb349a4e770fbdce4811d8d/regex-2026.9.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f2f43bf4e47ff7ce9e585558706d698c6204d0f80bf2207766382ed817c8e9f4", size = 290660, upload-time = "2026-09-09T20:56:23.835Z" }, + { url = "https://files.pythonhosted.org/packages/03/5f/9c990517587418d82406203d4608e17e02167c73fb36ef9a7a9d7ae64802/regex-2026.9.10-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d12a625a37c89c2b09303402a06942f55f071b95a7916a49c17034c3d47cd5", size = 787864, upload-time = "2026-09-09T20:56:24.979Z" }, + { url = "https://files.pythonhosted.org/packages/6e/1f/bcc010de82e20c1822d22ae94d97faafd46ce8405599f3636622a9a7bd04/regex-2026.9.10-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ef4ce69ff97fbb44b46751cfea5e859ad0b66d1a50abf34954f0645f51e81671", size = 860487, upload-time = "2026-09-09T20:56:26.363Z" }, + { url = "https://files.pythonhosted.org/packages/58/3e/6e75baf9c78d90bf44187f5ce4ee5de51fde206e6981490a0a4418cde296/regex-2026.9.10-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:044bd4639b6bb409ec9e5d8b7accd57e02b4c4a4e2eafde916f8ae8006b3e40b", size = 905374, upload-time = "2026-09-09T20:56:27.741Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/be9fafe5e05888296fdd35d82ba9cbb67b0d352e9911fad3c458beb3a34a/regex-2026.9.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3d95d7d9538b5b726dd6fcd7b6117a71e6565202f6d64f5845fb4d8f203f533", size = 796252, upload-time = "2026-09-09T20:56:29.074Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/4df639a88ce4fcdb0aedaba7818718254b888e4b60c7df640d5fc82232cb/regex-2026.9.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:faa911fbbcf8ac90bda0e0657d60768e3390954ef0588211d63a22add1cb1cd1", size = 790214, upload-time = "2026-09-09T20:56:30.586Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2f/2bb3fef68f7ba134d45a2aa3c713078109ebca71ec5dbb84a42d7284abec/regex-2026.9.10-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ecb2e7acb18f8cc4a67f0ad986c0af291ea4dd385d0614ba9bc09d7f8bbb478c", size = 773413, upload-time = "2026-09-09T20:56:32.223Z" }, + { url = "https://files.pythonhosted.org/packages/7d/57/43737678e306ad6430732828ecf0632c72676eab783cc98c4da373e7ee96/regex-2026.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4971776b4f2bd7fd9a83eceb2cb2592cbe2924f639fe8045e6a9de5ba4bfcf25", size = 778331, upload-time = "2026-09-09T20:56:33.51Z" }, + { url = "https://files.pythonhosted.org/packages/b1/19/61f4158219d60ec727500f08f6f0aa86a036bb5c3ba0632204f35eeb92e8/regex-2026.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f8bdec659a8fa7af51a32b224b3b7c02bc415d54ffd35187b1d224176b17d607", size = 853498, upload-time = "2026-09-09T20:56:34.931Z" }, + { url = "https://files.pythonhosted.org/packages/6f/85/7c783b98eb777cd17e2566ea6343a350f6a7c13f41f43282c20348ed9303/regex-2026.9.10-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3540734dbe241ebb3b87d5713781f6749a3e4d45480f506aa5fb5cbb0c37d249", size = 762708, upload-time = "2026-09-09T20:56:36.248Z" }, + { url = "https://files.pythonhosted.org/packages/dd/cd/a56fb347afd102dca21fc3ee9163ccf379678154ec2d0e3f139fb26e5eb9/regex-2026.9.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87f5f75c109f08f5c602d68e1af54cead8165189c727b6ac946b30b9833a3ba4", size = 842488, upload-time = "2026-09-09T20:56:37.538Z" }, + { url = "https://files.pythonhosted.org/packages/59/54/5d38dc952ec93cd19943d31647806c7fbf380c74f36b747874b26a3070fe/regex-2026.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:88b02aa8d0ec9b6189fe933d425775882271c23700ac11fd26d1779b0f56fde3", size = 783557, upload-time = "2026-09-09T20:56:39.649Z" }, + { url = "https://files.pythonhosted.org/packages/63/81/c4c880460f22160046e9d4794d947935da8337d579e08c3492344be32d1d/regex-2026.9.10-cp310-cp310-win32.whl", hash = "sha256:13c52fc377792675f604a207a2ae5958c080f6854f7698d40d9ff034d95b1e76", size = 266938, upload-time = "2026-09-09T20:56:41.352Z" }, + { url = "https://files.pythonhosted.org/packages/f4/0a/5061dde95447f00acdeeb39780b32def0ce380c3e725aeee1f5b37b788bb/regex-2026.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:e6b99181d184d0f5c7b36b8d12b94d1e9499cce6246594331f9edc5d2ea9fceb", size = 278251, upload-time = "2026-09-09T20:56:42.54Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c8/b3f8dab9592d1089fb2cec58f5c1120ce1c5c74b2d12d50119e404187ee8/regex-2026.9.10-cp310-cp310-win_arm64.whl", hash = "sha256:abbfc1c33bf8efddcc43844aba61e036d74a918680dc3ce8ce2538b004eda0f9", size = 277308, upload-time = "2026-09-09T20:56:44.141Z" }, + { url = "https://files.pythonhosted.org/packages/65/82/36fdcd669c7c47e11bea67e3495011ec365be0942aae3ba74f82f92ed6a2/regex-2026.9.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:debc629e98b95abaea1cf3057ca296151f348c697c9b8a59d18013adb302c0dd", size = 493891, upload-time = "2026-09-09T20:56:45.767Z" }, + { url = "https://files.pythonhosted.org/packages/c8/57/bb6a8273bcb53077a1855fea0ff416fe4d4bcb1d9f350a9fe3b909853983/regex-2026.9.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d772586951d7d6a5d162d48f414065e483b1c81ab38fd8ed97c78b05883421a", size = 295107, upload-time = "2026-09-09T20:56:47.359Z" }, + { url = "https://files.pythonhosted.org/packages/38/71/9d96d04c36556f057398a08dfc21aecc5409b5fef83fd7653a310227df7e/regex-2026.9.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b43456de605c8ee77eb75f07bc1ee44ba27f9cee22207deb77d495e954b7d953", size = 290649, upload-time = "2026-09-09T20:56:48.731Z" }, + { url = "https://files.pythonhosted.org/packages/af/cb/4dd3b7190b5a169c81a4d63b487d65e9fb23689b771f5aceb91d9e7f65bb/regex-2026.9.10-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f0a8b4928823bc8b217a1ab7bf3d90598909dec9a70fbbfe9a52cc4eca55990", size = 796358, upload-time = "2026-09-09T20:56:50.021Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bb/aceb2329a2d54a3bbd95e54f08689692414674c213e8fc958cf253206e5e/regex-2026.9.10-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b91c37551bf39d75116c02b146956f65b9aa0337a4a652f4ae186983789d4001", size = 866258, upload-time = "2026-09-09T20:56:51.363Z" }, + { url = "https://files.pythonhosted.org/packages/ba/fc/f8deac9c4c475b6bc35f25565a2253df4d27d49dcb6b189d9432ae69294e/regex-2026.9.10-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b9ba3b2765cdfe18f0f561a69f78a69701f2896654a81c711108d35d14e5099", size = 912779, upload-time = "2026-09-09T20:56:52.811Z" }, + { url = "https://files.pythonhosted.org/packages/74/dc/2dd4d56932f55ea412c9808f27a8661f93568bfee596ed04bc57a74e591f/regex-2026.9.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0acee94b480dd853e39434aa9a575f95385b1b4b8fa3feae56db363ca5cad782", size = 802962, upload-time = "2026-09-09T20:56:54.241Z" }, + { url = "https://files.pythonhosted.org/packages/46/a8/43edbb94e6c9caffd08bffca5b5c486d18845569fcad3953565b85dd71f1/regex-2026.9.10-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a41693eb3fc4b92e6127d113813c6c395237f7edd3224abf67609af48c690d11", size = 777136, upload-time = "2026-09-09T20:56:55.749Z" }, + { url = "https://files.pythonhosted.org/packages/78/2a/6de302fe3dfa94b75a414bffe5180c146967f96fc52fd0b3527a05ad7c40/regex-2026.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6888065672b341e5246f391ec16dc258a29218ac784172fd67c30d941544755b", size = 786593, upload-time = "2026-09-09T20:56:57.211Z" }, + { url = "https://files.pythonhosted.org/packages/ce/22/66bad9464b4b9122180d2fec86209d7f1bcaf4388d34f644139799f94a20/regex-2026.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8c07021a4faa3f092869adbd1f35cdc7a592276c807aeebc3ceb8ff1a638f0b4", size = 861247, upload-time = "2026-09-09T20:56:59.194Z" }, + { url = "https://files.pythonhosted.org/packages/3a/90/a862d6fd9ee3bc0c1f3a2fecffb325097608a4c9b57f0e35030f68c878f7/regex-2026.9.10-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:58c01f7b81079cf0817ba831ff4d9eff5d28be4a3ac76c353e6f09bd63f4c386", size = 767925, upload-time = "2026-09-09T20:57:01.031Z" }, + { url = "https://files.pythonhosted.org/packages/98/4a/aea909c0699aec3c5ee6eff93e4dabc0d310cfb0a5618094e1c5228b234d/regex-2026.9.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f0e2e5d23448b660d60a6ed85c46cc03b4b48bd276b8f4041d4a5fe2a4a0626b", size = 850772, upload-time = "2026-09-09T20:57:02.774Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a9/a55f1257d95871b0e042b42bf52f931b3a92b4d530def5201c5b9d597e20/regex-2026.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:94d096369b7cd96d15343fef5257fe39eff9d0e8758b92a0e15e358b92cdb2fc", size = 791475, upload-time = "2026-09-09T20:57:04.216Z" }, + { url = "https://files.pythonhosted.org/packages/60/96/04bb3dabe9ac7aa64ff758dc34ae0378d60f5279ccb66788e1f837a0cac0/regex-2026.9.10-cp311-cp311-win32.whl", hash = "sha256:7f8f10015866608fe4c043cec2e4fe4c39a94bb50e45091de4cdf4004b9ae4b0", size = 266937, upload-time = "2026-09-09T20:57:05.726Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7f/2d39cd798871b683409cd14ab4458f60e53db86591028a8244c3155f2e92/regex-2026.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ce7c118cb102975f974585688357a717ffbf9dddd64ab0bb1bc93eb5b367cf95", size = 278263, upload-time = "2026-09-09T20:57:07.089Z" }, + { url = "https://files.pythonhosted.org/packages/13/5f/eb3a6fd0ef50719d105e77bcc8a94b5b6f4d2873819fcf481279c454ce73/regex-2026.9.10-cp311-cp311-win_arm64.whl", hash = "sha256:1e954e246466d5a1a78f563ce8364b5d7cb19e7adb0ccdec8f9c9610083187bc", size = 277305, upload-time = "2026-09-09T20:57:08.442Z" }, + { url = "https://files.pythonhosted.org/packages/32/c8/bfbe893e90ee0148bd2860dd086f09b5d2080ca2b125f740c2e118c16982/regex-2026.9.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880ac684c27176464c00c3fdc456116364f5ebc70da07aad0c2d4a7ba45e98db", size = 496609, upload-time = "2026-09-09T20:57:09.987Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ac/56d5ae6efb759255c3b3db650a4be25f96a844ea3613b91e1e189a3b7294/regex-2026.9.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9d36b03dc362aa40ffaaec9d9bd75e87763529563ec008c43b0e07782f5be7a", size = 297024, upload-time = "2026-09-09T20:57:11.35Z" }, + { url = "https://files.pythonhosted.org/packages/60/4b/0f2d5f6bbb791cc10f22f0ed16c487e630dde8fa8fa0bd92a2bfe21a4b20/regex-2026.9.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866de9f98df0611d7b62b3a8729d3284a64c0cc6edd90bb95a533e443a4939cb", size = 291905, upload-time = "2026-09-09T20:57:13.127Z" }, + { url = "https://files.pythonhosted.org/packages/89/51/3fb5fe0d32f4cf0bc982286722c729a8d6f522d2fa2d5d14a702d9fc87f8/regex-2026.9.10-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c66d54042a14a503907d81861b8a5235e6d1f03d4fbc1d8767f652eaf957ac1", size = 800055, upload-time = "2026-09-09T20:57:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/89/46/ee507bd2f9d4420f26a594b35c551d7194b66f5d7897f63730fae6ec05c1/regex-2026.9.10-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:032da15431c890d376f53547f0a6219f4f4cd19f3e4f11bdc321453b5bd207e4", size = 871133, upload-time = "2026-09-09T20:57:16.674Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/cbaa90689684f91b1bc017e7f8c6d9425c6bd299108db02482dc51376d8a/regex-2026.9.10-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:23ac9a28180f274d7dd7651fa131ad5b02d343b75df4b040737f0356223895dd", size = 919627, upload-time = "2026-09-09T20:57:18.402Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f5/dcdf5e0d898024005cfcce631e3e934d111dfbe177ca0b7f253ae8a735a2/regex-2026.9.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e67f8843f0e4b931f1fa860bf3bbe4134b714c0155cc5c7c0d7ea450230aae0", size = 804587, upload-time = "2026-09-09T20:57:19.859Z" }, + { url = "https://files.pythonhosted.org/packages/73/70/eedfe81c29bae266a06ab4250978361a9bccd474704d88d4f4ef4506dff8/regex-2026.9.10-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bb7774924f8cd69f49cba0b3c2d679a6326f777e0e67d130ad5203e4df53f0d3", size = 777320, upload-time = "2026-09-09T20:57:21.62Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e5/86b207077efbcd91305700488f170b7eb1e1c54721cea74175273aa3b9a4/regex-2026.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c32480f3371b75068decaf9e5da72c224e953830dd71e36e06cf80e30ea39d8", size = 790572, upload-time = "2026-09-09T20:57:23.048Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/f622c3b2323f4c035b98e80221740a442127ad7993135b814f52057430db/regex-2026.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d2d377fd1cad611b806cdd732d86b65f536c768209890cb442556548daa65a23", size = 865485, upload-time = "2026-09-09T20:57:24.658Z" }, + { url = "https://files.pythonhosted.org/packages/4a/be/34bd621d3d6ac906ad67e57ed56c40cd45f7d51b9c0328335e97a7cb8ecb/regex-2026.9.10-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c014641157e9049b0603b8daa5343bd408d9b757b709aaa0f373cd3fab2d7944", size = 767925, upload-time = "2026-09-09T20:57:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/0d/28/ddbf7cba86f2adf5038c6c16aa829636ffc6e437f81bb0cbf302899cea5e/regex-2026.9.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1562aabd9d4eb09bd88a62ad97ed06800094b529ac43419e43020b9cefec79b0", size = 858800, upload-time = "2026-09-09T20:57:27.901Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f1/e8d7656ff3d3bd32e881d32f540b4981c79dee61908d6b790a45966e6895/regex-2026.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2479171edccced52ef02b899558f88ab2c235fe05b93180fdcae1670aacd89e1", size = 791648, upload-time = "2026-09-09T20:57:29.786Z" }, + { url = "https://files.pythonhosted.org/packages/fc/65/eac1a79115c8475d8ff539602eb54031564d719fdea5a599c4b0a1a26d1b/regex-2026.9.10-cp312-cp312-win32.whl", hash = "sha256:239620b0e0681669367c0e218c8eb2551d9f8fe3b9fccfc8d0003377804e8348", size = 267326, upload-time = "2026-09-09T20:57:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d4/4dcd0a05d3e97ca829165df1c39717f899d1d484dac8a6032439f2cb8d6d/regex-2026.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4db7d00c4afbfbb55b8e17b1e371da11418ea9389b030acec63c1fa4c7ad4b86", size = 277933, upload-time = "2026-09-09T20:57:33.648Z" }, + { url = "https://files.pythonhosted.org/packages/55/f8/22617a80dee28f2451011eae36bc26b3d78c4994ba87b5281d60acf9b6c0/regex-2026.9.10-cp312-cp312-win_arm64.whl", hash = "sha256:c25a754bb81a2edcfc3b65eda50f017d736f818112ed43e8aafd595cb00678ae", size = 277447, upload-time = "2026-09-09T20:57:35.156Z" }, + { url = "https://files.pythonhosted.org/packages/20/90/d4452bf1ef7dbe406980e8b921a257024482203c1dafac535eae207611bc/regex-2026.9.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ef5a059ea1c6ee5d1c7e99a2484e628608d010921efe876c6f0e2029d2f35eca", size = 496408, upload-time = "2026-09-09T20:57:36.757Z" }, + { url = "https://files.pythonhosted.org/packages/6a/35/c763c6424a0f99d021d46dc1f9065147bb5a40c2b2cdf28d2ebdbcd96508/regex-2026.9.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dce932f8e3ba936475ea3d0d8b59f7b050a9e206e994f53f8fd80299871e87da", size = 296931, upload-time = "2026-09-09T20:57:38.811Z" }, + { url = "https://files.pythonhosted.org/packages/fa/68/241f88458b17c46ed2f80147a60a03b2ada7fb815c23b6bc76c298abb0a5/regex-2026.9.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d8c668af8f7bdb1d18739c27d30cd9f4b371495a883f75a002fb7a39d740fecd", size = 291741, upload-time = "2026-09-09T20:57:40.482Z" }, + { url = "https://files.pythonhosted.org/packages/90/9e/974d6de404c63e2d09525f4ddb99874c7ab8e1f781ccbe0dd3e26fa6f6e5/regex-2026.9.10-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aebdd9a946de328b3f6f61dbf48dd064a36eb6dddf96e34ae6651d37f6e9383", size = 800088, upload-time = "2026-09-09T20:57:42.098Z" }, + { url = "https://files.pythonhosted.org/packages/9e/fd/3875b73f9e7ba3321dcaa02c19f650c05c61345328acf84599ac6f45ceed/regex-2026.9.10-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f2374c27deb189b282ec7e16106752c22ad39b056bbd8018960b1e4cc95d67a1", size = 871212, upload-time = "2026-09-09T20:57:44.03Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f5/2358e791c0e171194dd6a8b97b520579098a21397fb79dbe6b7edc9e3fa7/regex-2026.9.10-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e0dc78251154b66dc60211563fc115345da332eaa881e4e2523fb1edae3772f4", size = 919752, upload-time = "2026-09-09T20:57:45.691Z" }, + { url = "https://files.pythonhosted.org/packages/20/3b/000c79c3f9c06b7542225a5d3a7f9a85405da7224b3b9af94a491d07abea/regex-2026.9.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bafa41b0dd63669e5c0f8adf3d24819efeb73c847f492eb011212eb352e69041", size = 804578, upload-time = "2026-09-09T20:57:47.548Z" }, + { url = "https://files.pythonhosted.org/packages/30/6d/195eedb1de87f26639191e7487e41eb81e2ce255bc7563a64f3f5a95eb08/regex-2026.9.10-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ebb2ba68e4641a994061f70bf44ed448fba0b9b1d18c94ffb9efc1cca805b39b", size = 777345, upload-time = "2026-09-09T20:57:49.63Z" }, + { url = "https://files.pythonhosted.org/packages/79/11/11fe2b313fcd92cb75c583648f2746031b9f4da9e9ed4241204a5e8b3721/regex-2026.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:048a89ee797db10160bd2bd519286577a6b43a100279bd4b7d8456a3d69c80a0", size = 790556, upload-time = "2026-09-09T20:57:51.27Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c0/07ec9b4c43b0e16d62454971a5ab3886eccb0bfa161300a02d801ab28620/regex-2026.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:79e9432995e14c749d34209413de5e621ec8e67789bf4f46dbfabea9d06a2406", size = 865572, upload-time = "2026-09-09T20:57:53.163Z" }, + { url = "https://files.pythonhosted.org/packages/19/07/43bc9a9cf9fc8e37d2ba47980dfe4a6e151d2cf3ab969e0031e2a9b21484/regex-2026.9.10-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5847e22bbf959764d776937d791d034cc2d19b787e361c88d97e859e8dc68502", size = 767971, upload-time = "2026-09-09T20:57:54.805Z" }, + { url = "https://files.pythonhosted.org/packages/9c/49/3b9286a3a94f3c89ed4ddbe74e72bdde21c1a5eadd520d5f4ed4a61936cb/regex-2026.9.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c103b3b14e011774af4fb7e4617ad4d72b9171905cd3b231a70a4efd76e477d7", size = 858835, upload-time = "2026-09-09T20:57:56.627Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9e/e5d27ce9fee8e3ef95f886c7b6ecec211efa4cfc18bd73bd5cf26cca4741/regex-2026.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6b34a778c695d24e77c140e3b4c95da69282e34f2f6b02b55656aa4a0379f643", size = 791793, upload-time = "2026-09-09T20:57:58.313Z" }, + { url = "https://files.pythonhosted.org/packages/63/03/c28a6bebedc3e2d86ee27ec2de16f7ec0419dcd10e771d43dcc9c58a2e99/regex-2026.9.10-cp313-cp313-win32.whl", hash = "sha256:7abb38b8c40f3a235235a44da452c64b7b5c1d650ec6351027db0e090804f2e5", size = 267298, upload-time = "2026-09-09T20:58:00.009Z" }, + { url = "https://files.pythonhosted.org/packages/cd/fd/5c85fa6cfb8e034080bda5a72fa0a4df2b7777a35eb7e73c2799c2adda7a/regex-2026.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:20e8bfb07ad79a282f8b95b56fe67f9750b1b7f775724e4ba1f23cb296115ce4", size = 277894, upload-time = "2026-09-09T20:58:01.731Z" }, + { url = "https://files.pythonhosted.org/packages/c1/28/f5a25f6f65501675977fda35d9f61abb1468c4b87c0f73e536d8b21a60b8/regex-2026.9.10-cp313-cp313-win_arm64.whl", hash = "sha256:3bdeed3318a8eb2bbadc9c56347e0ff651639e934a47e168d05a3b12929fd0e7", size = 277436, upload-time = "2026-09-09T20:58:03.422Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ed/98e9b07d8bb9c765d07774f0b2c19b301b96d51f44630fea48951051c94e/regex-2026.9.10-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd6bd89b9fc06018d35851cab0240adb7dd84d51941b19f6574ac90cd54e3ae5", size = 496662, upload-time = "2026-09-09T20:58:05.118Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a8/9dfe9be48378b47c5a8f04b0f200ea225f9ee0f8e93f010433f661a37878/regex-2026.9.10-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ef4c0a9dfdc90581b90b1b95a8c3d1557f8ff8f5a2a53536d26314de699d1468", size = 297115, upload-time = "2026-09-09T20:58:06.822Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e4/5d1f005a3825ec49842ad349061c1c26e6d42f47ccf105e6e5aa6aeed392/regex-2026.9.10-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:14caa05ce39ec70437af5aac8814c50ee6628f4a90353871c059692f448a164f", size = 291896, upload-time = "2026-09-09T20:58:08.675Z" }, + { url = "https://files.pythonhosted.org/packages/be/15/44ce83fca50c6058f42b62fa8300a8030eea7e4e5a973a2dd33db0f557fb/regex-2026.9.10-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3264132d576847ab5f88bb83e7debe67854bf165b3ea613bd467312b6099536a", size = 800534, upload-time = "2026-09-09T20:58:10.339Z" }, + { url = "https://files.pythonhosted.org/packages/af/6e/a62e070a5a033643b287489576f02ae6a9c584c337d62349e340a2b4d001/regex-2026.9.10-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5cef9f3d14796500ea834c41dbe688f1f6b23c7024dc23e8a794d7ebaf5d71d0", size = 872038, upload-time = "2026-09-09T20:58:12.186Z" }, + { url = "https://files.pythonhosted.org/packages/f3/06/8b8e2483949b1329df10c5b615e85d332066deb426b11332b799629b9201/regex-2026.9.10-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d278ad30ec83b6b9202685b0f80b741a51ea3ca7f0595ebda96e7628b6398876", size = 918927, upload-time = "2026-09-09T20:58:13.903Z" }, + { url = "https://files.pythonhosted.org/packages/bb/64/9b56f69100d3afdbc9c4fa6e302764f9cb717fbc06a9d50558d98ca89cd2/regex-2026.9.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb018cfe7144585fc83882405906ff84994a2d154afc2509ecc7752c51f864", size = 803694, upload-time = "2026-09-09T20:58:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/07/43/d00d59a7c8fd0e070ae8457a8743597f45ad9682b100f57b9c9c405fbdfd/regex-2026.9.10-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6fd555fc9abef50c530869690b2daca054c8811a7aff632d11f9a7b2590b2742", size = 777770, upload-time = "2026-09-09T20:58:17.628Z" }, + { url = "https://files.pythonhosted.org/packages/46/6b/a11d0446484efbc9eb67abec133f254c6d66a1568b8f3fb36d39a73a1129/regex-2026.9.10-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8d5c4518235a2ec1611e57af85fa488d529c1106aacff12adadcedf8687012cd", size = 791234, upload-time = "2026-09-09T20:58:19.476Z" }, + { url = "https://files.pythonhosted.org/packages/12/09/bcd24e78b373fd4f98090caa43eade439223f6703b909be79b9efd9ab0ab/regex-2026.9.10-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:175cf49ce7a994c88b8f15e3cb17cdb66a48ebb2d36de736b8205033db950f89", size = 866259, upload-time = "2026-09-09T20:58:21.683Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c6/c57ba5e94222a813260af4c17ced92d40cdb44737eb6b50979688310b6a3/regex-2026.9.10-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b71649169a9fcf30b395ee01047fa7ad6654a4c900ca75b23c04dedcce6a1f8c", size = 768219, upload-time = "2026-09-09T20:58:23.842Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a2/3820037587d00901ace96c5864335c2cd1b899d5263ea0dd2261359e0bee/regex-2026.9.10-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8ba1f78bd4fef2d8f84b894ec28ac3481afe6cc07aaa253ad4717ef7b3fe6bcb", size = 858582, upload-time = "2026-09-09T20:58:25.607Z" }, + { url = "https://files.pythonhosted.org/packages/47/f0/f9a838ca6219ae4821de0175e4548db73ef56de5ec08d032fb427732fa07/regex-2026.9.10-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:217e98ba5fc8908ed8ffd4ebac04753a0c831067cbfb495b9821b94cc61eaa76", size = 791405, upload-time = "2026-09-09T20:58:27.406Z" }, + { url = "https://files.pythonhosted.org/packages/f7/bf/67d71cc4e13ae2e0022d21243ca069e0868701a99eb29cdecd13d356e694/regex-2026.9.10-cp314-cp314-win32.whl", hash = "sha256:b298cdc33c5cc6969ff07f0fba19cc73e0fd8576373c50935feadaca2f6b4405", size = 272702, upload-time = "2026-09-09T20:58:29.116Z" }, + { url = "https://files.pythonhosted.org/packages/c1/38/40a93e72703a741235115ed1b1e5f6b869917677b7643005034ce1611d70/regex-2026.9.10-cp314-cp314-win_amd64.whl", hash = "sha256:c32818b28bcd153b25b63038348a9fe9b9fbcddb60df43f204c3ab55eeb57f77", size = 281170, upload-time = "2026-09-09T20:58:30.899Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ac/e95387f00617c16bb41b786d900bacd17eab88afa81b4f263df532b3a731/regex-2026.9.10-cp314-cp314-win_arm64.whl", hash = "sha256:75242f44a3e283106077be4ab717bc535e4701c9d54ad69e195945c22f137a1d", size = 281511, upload-time = "2026-09-09T20:58:32.594Z" }, + { url = "https://files.pythonhosted.org/packages/39/e5/a4b12262edc488a8a7a95b672db317dd8aa9bf2fab98297f9c91bb11ad4d/regex-2026.9.10-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:2dd9286093c71afc8f55ef035c5b9d2776641fd72c6535f1febc92d0b0be9666", size = 501128, upload-time = "2026-09-09T20:58:34.306Z" }, + { url = "https://files.pythonhosted.org/packages/55/c8/9ca31c0fa5197ded8614c8ae0e105bcff2d979025ffa3c75580baa334e2f/regex-2026.9.10-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:71879292c9c7ac67b1680345b16daba1be937cb027362cfa04e68f65db2dcfdd", size = 299428, upload-time = "2026-09-09T20:58:36.296Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d1/ee7662561735f90475443c3ca1977e5cecaeaa8f29620dec75580aebc839/regex-2026.9.10-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ccd139b2061132e7b265cfb4b4721baeb9f8928b81415304abf1ec7e3181c26", size = 294494, upload-time = "2026-09-09T20:58:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b1/333168e45ed6cfe71f6d17e21e5f54725f44d171f84edd12469a2f739227/regex-2026.9.10-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e7327795089ddb44912dce1434e1d7244be2e9fb48fcc2d6782936af7a3062db", size = 814925, upload-time = "2026-09-09T20:58:40.438Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a5/df1b38536d0a3b24a030eb4130ce98b403cc925220ff530f5313a7c436eb/regex-2026.9.10-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ff4d7b14ea19e50c8d9d6d83f45bd9b45cbb624c07ac1fa54db0a019049abed7", size = 873323, upload-time = "2026-09-09T20:58:42.349Z" }, + { url = "https://files.pythonhosted.org/packages/93/ea/aa71fe62dd63a8336bbdec1ff002a6c53b40ccfca95961c18ee4f09bf03c/regex-2026.9.10-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4f0407474ffac8e5e89d93ca41d60891e29f0ab8423eb66ff292d850a86a0843", size = 923080, upload-time = "2026-09-09T20:58:44.488Z" }, + { url = "https://files.pythonhosted.org/packages/86/38/49f8d6fd34fc1a9c75b5b96364ebdde702a8144e5ed63d2213c58d454c27/regex-2026.9.10-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ad10a135fa0b4e4a462a61d07c6654d7518cfdb5cb8da08f9ff7d61384af1fe", size = 821284, upload-time = "2026-09-09T20:58:46.56Z" }, + { url = "https://files.pythonhosted.org/packages/32/45/91a977c96d4be13d1ade8208c260c26841c836d4c91745e1828a30589070/regex-2026.9.10-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9fbd2e5d8002dc49a6129fb321ec51c57a025e752ed525ddce0ba9223c4350a7", size = 789256, upload-time = "2026-09-09T20:58:48.473Z" }, + { url = "https://files.pythonhosted.org/packages/2d/79/4d110bf01bf9651bf9b3f88a6d9fa7e643e0586921a18432b25a478edbfa/regex-2026.9.10-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4a761ea45f2ad74c575ef5850ea514cef97302a552d3c7c9d1a1a870d4661d6c", size = 803722, upload-time = "2026-09-09T20:58:50.286Z" }, + { url = "https://files.pythonhosted.org/packages/e7/67/b587a0d3bbac2635309ed9c40c197120c39e1ec0afb8813cbed1338fdd75/regex-2026.9.10-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:75aa39d3f4f1650eea84e46b0d8cefe77dd5478c10e3d0aaf0b0f00493475a7a", size = 870085, upload-time = "2026-09-09T20:58:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/07/fc/0827bca20ddba1d70fa5111a2a64e6b6b38bfdab43fc435022b54172a111/regex-2026.9.10-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f5c629df03adec31ee505dda3c8988f106c9390e4cbd343600036eb8b3d6724f", size = 776970, upload-time = "2026-09-09T20:58:54.478Z" }, + { url = "https://files.pythonhosted.org/packages/9b/03/ab9d08d30568ca868791bfb99551db60b947f05e2e65dcd1261e87083c21/regex-2026.9.10-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3a66e40a1a20de96a2fee00ed67e11012b62d85b277688258677fd19997addb7", size = 863611, upload-time = "2026-09-09T20:58:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6d/8063ae86b543ae878a7d6e7ba21ebf0af4af06161230e0012e2d652320c6/regex-2026.9.10-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:968c1e33edd9a104d1bf24c8d476c72de7e3839ae7f894b37e9e4f4739fdeeca", size = 804064, upload-time = "2026-09-09T20:58:59.066Z" }, + { url = "https://files.pythonhosted.org/packages/c5/63/b19305c4b8d3d7867699f7d83c43550273d91a2f31793452d87edb1d259f/regex-2026.9.10-cp314-cp314t-win32.whl", hash = "sha256:fbc4e2f3cb7ce8436154e6483079e7d35eeb321a952fa936e180300630d8b873", size = 274607, upload-time = "2026-09-09T20:59:00.942Z" }, + { url = "https://files.pythonhosted.org/packages/32/b8/1695072a512a49060294024e23b945eeb87675b02c06e53a92a1b42b0bfd/regex-2026.9.10-cp314-cp314t-win_amd64.whl", hash = "sha256:c37fa93bf18bf4f90b01c0fa9f11ea567ee4b7dd8bf96e63663e5edc37aa38cf", size = 283944, upload-time = "2026-09-09T20:59:02.876Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9f/65bac17f39991a67e22f8b3c849fdc02a56147c97029b5351494341959b4/regex-2026.9.10-cp314-cp314t-win_arm64.whl", hash = "sha256:ffc2da104e43db716ce30cef9f28049a1faa6aca385dd8771b033268d0730b07", size = 283780, upload-time = "2026-09-09T20:59:05.009Z" }, + { url = "https://files.pythonhosted.org/packages/67/ca/1d1f83bc2f8fff4f186266ac82d73254e686565530cec9ab5228fb5c63dc/regex-2026.9.10-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:6afcad14310f1311d077553ed374b42a5e538f85a8c884b4e38e52de091c8077", size = 496869, upload-time = "2026-09-09T20:59:07.051Z" }, + { url = "https://files.pythonhosted.org/packages/33/42/4217510286501a2ebcd372b781b4754ac961e043fa13ef8dce803c44d89c/regex-2026.9.10-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:3fb4ae8cf83ef4e9addd43b2da31a9f45be816a8036fae8af59c8998b72718e2", size = 297121, upload-time = "2026-09-09T20:59:09.007Z" }, + { url = "https://files.pythonhosted.org/packages/55/a7/595468ed0bbccd94be92c6b5d67736ba128b204d942429a8485c2693914d/regex-2026.9.10-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f7d4656e17ab736e9415a6442a345bfc97bb8b7dcce47884bb74a37f70f08d0c", size = 292139, upload-time = "2026-09-09T20:59:10.859Z" }, + { url = "https://files.pythonhosted.org/packages/29/1c/ac92c123e0ab9bea75a904272171b356940bd6139e4a35de44f2254dca8f/regex-2026.9.10-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ba3bab0c45079735f55ac61526774de1d84bc4a0333cc554e1a4ab74913924", size = 802375, upload-time = "2026-09-09T20:59:12.823Z" }, + { url = "https://files.pythonhosted.org/packages/8d/16/d349f6fa9f908162359004e4f067353a0146e8074d24989490778244be44/regex-2026.9.10-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ff6b3267318661dfddf6b3628663e00e5946bd0a5c8fa678537a1401f0388f91", size = 872328, upload-time = "2026-09-09T20:59:15.352Z" }, + { url = "https://files.pythonhosted.org/packages/df/81/251b5aef23147057e926346fdb7c8c352d0568f65a492e4e9eb6120f6446/regex-2026.9.10-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:030fa9e23624e39b3b94e46b90a5abd1a1678eb2f58fcdd3fd6c27526bf91c7e", size = 919594, upload-time = "2026-09-09T20:59:17.31Z" }, + { url = "https://files.pythonhosted.org/packages/d0/6e/1f25319dc1b9cf4b7ffa303f3d16ca53260fe92aff45e81aa1b3c6c7cba2/regex-2026.9.10-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fbc8314436353e097c050e11b01a6c11433579437ed0579730157676ef59e2f", size = 807394, upload-time = "2026-09-09T20:59:19.328Z" }, + { url = "https://files.pythonhosted.org/packages/cc/fc/3da6b3dffddf12d5e96cbbe6f5e65ebcd64f92e3388a6690a53e0878232d/regex-2026.9.10-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e6c0b5ec6ddee4032247585dc491b0fa58627745b66a705728703a3f0331231", size = 786018, upload-time = "2026-09-09T20:59:21.592Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6f/1cc86dafddc912ef44c5ccd4f729060be8c6735600932664eb6d0e25469b/regex-2026.9.10-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:bf29611e5376fec8f795879bb5c6153a76c3a292573d173c26784042b01eb840", size = 793504, upload-time = "2026-09-09T20:59:23.734Z" }, + { url = "https://files.pythonhosted.org/packages/b1/cb/11692e29388d006211163627fcefa0c79917ab9f94d46a1b2254fe5efc81/regex-2026.9.10-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:ec8855f08c17895a26fbf5f19ed829722e19b34a96629e49a43c92974924026b", size = 866766, upload-time = "2026-09-09T20:59:25.798Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/3631df969830f94d83fcfc5fc71a7b39caad905e18f7b17350a94135d625/regex-2026.9.10-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:94c5ce3bc41d226b4eb89ca3f842b2e28c031487fb1f34eb2153d98235831325", size = 775825, upload-time = "2026-09-09T20:59:28.51Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8a/762892a8e3e21d119eacaffde848aa247e6cf4e1d90c46011671e86b1b9e/regex-2026.9.10-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:9ce239acb15843ab03976626af810a4424b0409689ec2bbc52088ab5479ab487", size = 858901, upload-time = "2026-09-09T20:59:30.656Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/78048fada5c2f61d795efb26ea24f820a5564c4aa26574920284d45cd656/regex-2026.9.10-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:c22df8dd6373bbe3898e77429ffc85594300e39d752fd0e68a31e59d37899376", size = 796208, upload-time = "2026-09-09T20:59:32.852Z" }, + { url = "https://files.pythonhosted.org/packages/aa/58/632681f7b9aaa3d83b40e5862ba46364a453c8eb2bc7d43fece3dc31f972/regex-2026.9.10-cp315-cp315-win32.whl", hash = "sha256:1aa309ab7ba89a62d6cf70dbd38d4176440bce3c7001ab86256704cf4c18c6eb", size = 272704, upload-time = "2026-09-09T20:59:34.927Z" }, + { url = "https://files.pythonhosted.org/packages/5d/64/81cce28754c37037b1fe740b6d7a556d51d97cf935ea4547bfab104f43f7/regex-2026.9.10-cp315-cp315-win_amd64.whl", hash = "sha256:58da726d3e766c0b3f5a3997dfaf0275898a1107b8191cdd6b0437fe45fd817d", size = 281182, upload-time = "2026-09-09T20:59:36.86Z" }, + { url = "https://files.pythonhosted.org/packages/33/28/5a13a340c9c759e863a0e7f765d323601d03d6538c8a627ed628662e083b/regex-2026.9.10-cp315-cp315-win_arm64.whl", hash = "sha256:75f9297b16fcb588a1f8d8a55dabef3c0c20b0c7bac43c87ceaaaf1a825c12f4", size = 281512, upload-time = "2026-09-09T20:59:38.875Z" }, + { url = "https://files.pythonhosted.org/packages/f7/38/a3caebcd5105be90708071db20bd261b0961b8ea4fe5e8be45c2632519b5/regex-2026.9.10-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:1270cdec69248592bbe38a0b263ed58d907b891bd2b93703e225c317e421bda1", size = 501336, upload-time = "2026-09-09T20:59:40.987Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b5/ec8887b2658bf0a5df143c7c1fcd562b0abd2fa208c04ebf15c6607c9bb2/regex-2026.9.10-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:681ed38664b64c6617d3c3c332018d1948c77e139c5ea667c1886efa671e426f", size = 299318, upload-time = "2026-09-09T20:59:43.039Z" }, + { url = "https://files.pythonhosted.org/packages/d5/58/84724a9eccf6e8cd46f7e4534576093e2476a5eeb55e2453aa6606e86059/regex-2026.9.10-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:8e127d9a80cbf1c3276bb465c6d047e8705e97b58c2b8f2f0c0a69c336b44b37", size = 294847, upload-time = "2026-09-09T20:59:44.954Z" }, + { url = "https://files.pythonhosted.org/packages/50/03/70ccc5e53905984abf8eab63eebd3ce740522ef8c8d392622b64d79ef290/regex-2026.9.10-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:990797e765d89a423880052c68b61c31afe701de94a8c060f61c40605ca6c727", size = 814359, upload-time = "2026-09-09T20:59:47.194Z" }, + { url = "https://files.pythonhosted.org/packages/29/53/40f7a11ec547e4a947883c9d5e8a075f6d4f59af2b8dbcaa8bf5b504aca0/regex-2026.9.10-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e5e4a6e0734a685d13b9685622bb503bdbb2927f8b0df025a5085f0ea067475b", size = 875586, upload-time = "2026-09-09T20:59:49.537Z" }, + { url = "https://files.pythonhosted.org/packages/0b/9d/83f3e022d99ce601727c4ef5f7b527753901ce4509ed89a1bb6a2263380a/regex-2026.9.10-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:63bb62cf62217dc38c8a6b2b61b165b0e4eb8fa93b0aba12139251c0986a8fa3", size = 920990, upload-time = "2026-09-09T20:59:51.776Z" }, + { url = "https://files.pythonhosted.org/packages/b2/64/dfdb367d8f4f5c9b8ccb4b59789c2ce996f2c69c3b8192aa986fe7d92ec4/regex-2026.9.10-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cb76a9c4e07a6a47849726af0ed14c41741a182f097f134a8cf29c1bc0f4dde8", size = 818660, upload-time = "2026-09-09T20:59:54.428Z" }, + { url = "https://files.pythonhosted.org/packages/88/a6/fb7d0b64487913845834f319aa84f8377d55305958a5db7e19c128798366/regex-2026.9.10-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:31e4df2b11d48f61d511019bc1ee9b477055f17c352b68fe72db7a98b14d603c", size = 794976, upload-time = "2026-09-09T20:59:56.799Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1c/23484edaae387ea0d31f4d414463211e3516c8aa210ce8d0640f5aff3502/regex-2026.9.10-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:cf377960d2ac37d987394a9dbaa75e91338c41a46d41e1d25e90125e7b3ee2dc", size = 804081, upload-time = "2026-09-09T20:59:59.39Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e1/e30d138f13aecec99ea9aecef7e31563de6ec6a2f5ce1d65fc506aee33fe/regex-2026.9.10-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:c8fbd9cb30c68c1686b94029b9ef845d5870d3d65baf66cb126b676849b9d72b", size = 870430, upload-time = "2026-09-09T21:00:03.304Z" }, + { url = "https://files.pythonhosted.org/packages/53/dc/81f9ce86f7ae4f57901543597c95751fa01c41a672ec1636dd913f8a000a/regex-2026.9.10-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:53e182b6b04d0011909b47d51a2d72d908de07c7b1c7f16b3adda2204d723bc1", size = 783327, upload-time = "2026-09-09T21:00:05.68Z" }, + { url = "https://files.pythonhosted.org/packages/a9/1b/d7bf8f91534740f6a8ca17e5ac9c5337903baf527c8de240fbac1bbedfd0/regex-2026.9.10-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:0aa7589394230e0f0a422ab6b90841ff12c87e855e7aaf75d192a54a5f124548", size = 860874, upload-time = "2026-09-09T21:00:08.41Z" }, + { url = "https://files.pythonhosted.org/packages/9a/1d/52cc88364aca7c9013dfe9abe0fea67f8d394efe384d07798300a6e2f27d/regex-2026.9.10-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:1b891f77554bff991804cee24b78b40789f7d5993a24c7907bc7025fd2a70c8d", size = 806705, upload-time = "2026-09-09T21:00:10.768Z" }, + { url = "https://files.pythonhosted.org/packages/cb/51/37a194df7707f92f33173260ba7b221d4ec376419a53babaec50019a2804/regex-2026.9.10-cp315-cp315t-win32.whl", hash = "sha256:5bef622850cf760154719d4e0d74b0a855962432995168e250069899ae12fe8f", size = 274780, upload-time = "2026-09-09T21:00:14.003Z" }, + { url = "https://files.pythonhosted.org/packages/77/12/3227a52970d90908b230f15b2c86df903f49ac72c9eedf4f6e8b5bb5e1a7/regex-2026.9.10-cp315-cp315t-win_amd64.whl", hash = "sha256:07b45ba5c94b8fcb30cb6c56a11f715c57533a3017964504322ea52690a27b72", size = 283936, upload-time = "2026-09-09T21:00:16.275Z" }, + { url = "https://files.pythonhosted.org/packages/f3/bc/c567c5a61671f04d30e83f20b496b465432879196574d051007285576205/regex-2026.9.10-cp315-cp315t-win_arm64.whl", hash = "sha256:f70b9f0e39c2dba1d9da6bf7ef7c377cad7277f8440e9a69be05ede529ff024c", size = 283747, upload-time = "2026-09-09T21:00:19.113Z" }, ] [[package]] @@ -4202,16 +4459,16 @@ wheels = [ [[package]] name = "responses" -version = "0.26.2" +version = "0.26.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, { name = "requests" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/1a/4af3e6d659394b809838490b144e4ab8d7ed3b9fecc7ca78f5d2f79b1a3d/responses-0.26.2.tar.gz", hash = "sha256:9c9259b46a8349197edebf43cfa68a87e1a2802ef503ff8b2fecbabc0b45afd8", size = 84030, upload-time = "2026-07-03T16:44:50.325Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/47/f216a33221db8eff328987661cf18371afee89c62a62b434b963d6b509c9/responses-0.26.3.tar.gz", hash = "sha256:b0c11ca8131b8b227b8d5108e6ed39772222bd5aab030ed430e8f99057c4c409", size = 86335, upload-time = "2026-08-26T19:17:24.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/28/693e1d9ebf72baa062ded80d837a035b86ce75eda5a269379e9e2b1008a8/responses-0.26.2-py3-none-any.whl", hash = "sha256:6fdfeabd58e5ec473b98dfe02e6d46d3173bd8dd573eff2ccccf1a05a5135364", size = 35609, upload-time = "2026-07-03T16:44:49.1Z" }, + { url = "https://files.pythonhosted.org/packages/6d/86/ca7958de70cb0752350575e98229368a3a2f746a2942034b3364e17312bb/responses-0.26.3-py3-none-any.whl", hash = "sha256:74474f799334ac4f37d93b6437ecc3bb1bb5c77a8d31780a338643be2dce0af8", size = 36289, upload-time = "2026-08-26T19:17:23.176Z" }, ] [[package]] @@ -4237,15 +4494,15 @@ wheels = [ [[package]] name = "rich" -version = "14.3.4" +version = "15.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/67/cae617f1351490c25a4b8ac3b8b63a4dda609295d8222bad12242dfdc629/rich-14.3.4.tar.gz", hash = "sha256:817e02727f2b25b40ef56f5aa2217f400c8489f79ca8f46ea2b70dd5e14558a9", size = 230524, upload-time = "2026-04-11T02:57:45.419Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/76/6d163cfac87b632216f71879e6b2cf17163f773ff59c00b5ff4900a80fa3/rich-14.3.4-py3-none-any.whl", hash = "sha256:07e7adb4690f68864777b1450859253bed81a99a31ac321ac1817b2313558952", size = 310480, upload-time = "2026-04-11T02:57:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, ] [[package]] @@ -4380,7 +4637,8 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", "python_full_version == '3.13.*'", - "python_full_version >= '3.11' and python_full_version < '3.13'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "(python_full_version >= '3.11' and python_full_version < '3.13' and sys_platform != 'emscripten') or (python_full_version == '3.11.*' and sys_platform == 'emscripten')", ] sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } wheels = [ @@ -4583,11 +4841,11 @@ wheels = [ [[package]] name = "slack-sdk" -version = "3.43.0" +version = "3.44.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/75/a4964eb771a0c74d79ee7a3bee6fb5d9718909dd1b675e80d62a6a0ad90a/slack_sdk-3.43.0.tar.gz", hash = "sha256:0553152e46c4259eb69f7464cdadc35ba4802ca10f9f5a849c92cf03d6c2ba07", size = 252769, upload-time = "2026-06-30T18:04:41.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/4e/371068dd7281139307e60cd18553b96b9c8c391a4c3040617192713a3cc4/slack_sdk-3.44.1.tar.gz", hash = "sha256:ca19505423789fa2a3189ff486f989f02e49289f008d0a5813df7255b3fb93ea", size = 256661, upload-time = "2026-09-03T14:21:13.879Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/55/42141b8338d46323d5b3c6095201b044c670c20f898643b322ea9b1543a1/slack_sdk-3.43.0-py2.py3-none-any.whl", hash = "sha256:4b6557c65577fc172f685af218b811f9f3b4909e24cddd839ada09565f10c585", size = 315866, upload-time = "2026-06-30T18:04:39.636Z" }, + { url = "https://files.pythonhosted.org/packages/ab/fc/67352b742fc6fa520a550581b0284f5757e4e31a32327c2a00276747fd30/slack_sdk-3.44.1-py2.py3-none-any.whl", hash = "sha256:d6f20a0fbe3fecf9cac955c99d686301b48a645b7045472c3a0cdd186d7c42b2", size = 319865, upload-time = "2026-09-03T14:21:12.405Z" }, ] [[package]] @@ -4610,47 +4868,48 @@ wheels = [ [[package]] name = "soupsieve" -version = "2.8.4" +version = "2.9.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/99/a6ca3beb3ccacb41fb3321d8a60e5566f9e6467601ef8eba6a17e1b89778/soupsieve-2.9.2.tar.gz", hash = "sha256:4a55d8cf158a9c2e587fa4922f1bbb91d68ac829e2d6f25403a85747c71daf74", size = 122445, upload-time = "2026-08-07T00:57:24.801Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, + { url = "https://files.pythonhosted.org/packages/eb/dc/ad025c1ee131eba60c69f4dd5779b18fcf1e6b21a343e2162a84d5d133c7/soupsieve-2.9.2-py3-none-any.whl", hash = "sha256:8089a26fd974ca7a1f30276d3d8492ab266ab15af581642dfe8aa162e0c1c823", size = 37370, upload-time = "2026-08-07T00:57:23.524Z" }, ] [[package]] name = "sse-starlette" -version = "3.4.5" +version = "3.4.11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "starlette" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/1b/bc9e3e7a72dcdad7dc7888758f5d00f56f8909ed5cfdff822bd72bb4c520/sse_starlette-3.4.5.tar.gz", hash = "sha256:83072538bc211a2f68b7b0422226c4af3e9b62e106e07034664b832ca019842a", size = 35249, upload-time = "2026-06-20T17:36:58.322Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/54/6767bb789b2f2fed6e0f953df949cd39dc263a384c1b65a95232598621d6/sse_starlette-3.4.11.tar.gz", hash = "sha256:1bae716c02f3e6f294be41ff333220692dae7c3cbab077c900f159676719dade", size = 34972, upload-time = "2026-09-05T12:11:04.607Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/75/c88d3f5dafd59c791da1ce27650d30bf5b70cbf1cbf01cd00e5f9e360915/sse_starlette-3.4.5-py3-none-any.whl", hash = "sha256:e71bad53323f65573c3864a6c3bd0c1eb6e5f092b2e48082b0c35927d19ca296", size = 16518, upload-time = "2026-06-20T17:36:56.729Z" }, + { url = "https://files.pythonhosted.org/packages/98/6a/2ba3ed4a69babf3afdddf7d8314a48d87562c0a442206bbc2a1b50d5efc0/sse_starlette-3.4.11-py3-none-any.whl", hash = "sha256:c7b2244bdff016fe7f64e10075e89a3e6bbf899649cc89b0fe884b5545042453", size = 17122, upload-time = "2026-09-05T12:11:03.195Z" }, ] [[package]] name = "starlette" -version = "1.3.1" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", size = 2703240, upload-time = "2026-06-12T09:23:11.602Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/b4/205b0d5241d934e8add0c38aa924c4f9fb7330834ff11e5444db964ec3f9/starlette-1.6.0.tar.gz", hash = "sha256:d4e3ac5e546444960c710297a3c9fc3f7ebae1b7e963f3d36173b49da535be9b", size = 2716969, upload-time = "2026-08-08T18:27:57.512Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", size = 73632, upload-time = "2026-06-12T09:23:10.017Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cb/6a6a47d5b464bd08695d254f3da6e7986cc70c9fa5d778eda57538edfe56/starlette-1.6.0-py3-none-any.whl", hash = "sha256:a86dd39d14bb45f85a3d18525215a9ef0cfd1f192ac793220e72598c90335f0c", size = 75969, upload-time = "2026-08-08T18:27:56.196Z" }, ] [[package]] name = "strands-agents" -version = "1.47.0" +version = "1.56.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boto3" }, { name = "botocore" }, { name = "docstring-parser" }, + { name = "httpx" }, { name = "jsonschema" }, { name = "mcp" }, { name = "opentelemetry-api" }, @@ -4661,14 +4920,14 @@ dependencies = [ { name = "typing-extensions" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/05/5eb8431ff340739b1c21b0da7d19ec9604b9c4953a1c4638df915321573c/strands_agents-1.47.0.tar.gz", hash = "sha256:97770cb6beb6e5fd1a58849f41201eb7edb43fd67ad3de6544ada2f342c2bcf0", size = 1157139, upload-time = "2026-07-10T14:45:05.809Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/2f/c980715e56a2017280ba597aea83e77ec37a94eeaaabc47114e354a6846e/strands_agents-1.56.0.tar.gz", hash = "sha256:d0a4587065f9b9f4890455ce947474067e5deaadf140d1b2ef5153a67ebf80a3", size = 1662954, upload-time = "2026-09-15T19:54:39.56Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/cb/ceae892c5823bea9254160efc02a4553f2ced9d183676110c03c3a9ff0f3/strands_agents-1.47.0-py3-none-any.whl", hash = "sha256:1f6ce17404ff02079244ad7a4a180a2a7150546275e4b91187d71472ba8fe3f2", size = 600611, upload-time = "2026-07-10T14:45:03.942Z" }, + { url = "https://files.pythonhosted.org/packages/89/07/0d8955760ed673c3112af65d2a026e79bbcb3c869b3eadc896820b64edd7/strands_agents-1.56.0-py3-none-any.whl", hash = "sha256:8026a2fde7ca3d2f2760ea57003dd7163761bfba74972762468b745b4f7bfd08", size = 838144, upload-time = "2026-09-15T19:54:37.448Z" }, ] [[package]] name = "strands-agents-tools" -version = "0.8.3" +version = "0.8.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -4689,9 +4948,9 @@ dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/dd/aaa1f17ec10db4a9f49e2e48bd3cd5fb646c1c284e4fe6fa0a6a32380914/strands_agents_tools-0.8.3.tar.gz", hash = "sha256:19f6d3d617e9ef85b0a31c475f0a3f81d8ea60a2ed7dc6bd8f17fdd586c94d46", size = 511310, upload-time = "2026-07-09T19:55:59.262Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/90/b129b3011eee02d6a00c7abbae8bd1072aab91f5c628c1e108bbdc98f6cd/strands_agents_tools-0.8.9.tar.gz", hash = "sha256:a9020d13c6ad24575ad9985e86ace0879c9e9279344399262c35cb9a7395528a", size = 543643, upload-time = "2026-09-15T22:36:27.679Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/8b/1500ae455cc8434a54f013278320042d88ba9daffb5dafaed1fa8b48c3f3/strands_agents_tools-0.8.3-py3-none-any.whl", hash = "sha256:bc17fbad5ad7957bef33538fb5e0c386f7883dab92c557e92175e7ff16b42dac", size = 327194, upload-time = "2026-07-09T19:55:57.473Z" }, + { url = "https://files.pythonhosted.org/packages/f3/38/fe6f646ac8c3665da7131586a33a7ad96a9347ca277a01025f755e3c1443/strands_agents_tools-0.8.9-py3-none-any.whl", hash = "sha256:858a8e17c6f807541524d10fa108b2bc7776c23666c7ecda966a327a752a9372", size = 343671, upload-time = "2026-09-15T22:36:25.811Z" }, ] [[package]] @@ -4907,90 +5166,97 @@ wheels = [ [[package]] name = "tiktoken" -version = "0.13.0" +version = "0.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/e3/03c90dadcf5b3f82b83cee9adee60ef666b329c654f58c066af44eae0287/tiktoken-0.13.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:47b1df8d73390a24f94980c75158cdd5c56d256f16d55f30cb49c230caba9ba4", size = 1036627, upload-time = "2026-05-15T04:50:11.229Z" }, - { url = "https://files.pythonhosted.org/packages/5e/30/760463e5b2e8ad2bc229ae0a17ecb06727b6cbc094f08d8f65844315632e/tiktoken-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7d40c6c5aab171dcd6eb8455bc567bde404bb9def60cdb8c1299cc782b242bb9", size = 984699, upload-time = "2026-05-15T04:50:12.874Z" }, - { url = "https://files.pythonhosted.org/packages/de/8a/8895f342a6b6aabd1a358e672f6f077b3ae51d0c63ca605d142db3bcd8ab/tiktoken-0.13.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:9b842981fa91accdffd48ff6408a977b7a91c3fbda55d353c3c68114d5c9d69e", size = 1118690, upload-time = "2026-05-15T04:50:14.234Z" }, - { url = "https://files.pythonhosted.org/packages/51/e0/92557768fb0801f0d9dd9243cb9b6d342900b05e4b1006d4771f49ce233e/tiktoken-0.13.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed5a30027cb4d8c7ca8b273d4766f3db3cf58fad9e9f3b1a68a351ffb54873d5", size = 1138423, upload-time = "2026-05-15T04:50:15.668Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b9/a3d99feeedb032ffd09cd6652077f86bdee9a70dd0b990b2b272b445d4c3/tiktoken-0.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7ab10f4a21c2999846940113f6dbd72e0fa06a24119feddd74cc47e85818e06d", size = 1185077, upload-time = "2026-05-15T04:50:17.19Z" }, - { url = "https://files.pythonhosted.org/packages/cc/93/bab868277d475dc6d2aaacd34cdd239c282f4908dcc8702e0a3311a8e032/tiktoken-0.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a2937ad042d49d50eac6e1ba07c5661d4bd3942a5b1e0c0d08475c4df83676e1", size = 1241702, upload-time = "2026-05-15T04:50:18.772Z" }, - { url = "https://files.pythonhosted.org/packages/c3/16/27e9f7e0ed76e501cfefc9fb2112df4c7bf70ca96945b15ecb7615aac860/tiktoken-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:44733b99bfd72b590cd0936b1c01b3b4dd73122db2d544bc1ceeb18a7678c910", size = 876565, upload-time = "2026-05-15T04:50:20.268Z" }, - { url = "https://files.pythonhosted.org/packages/1a/4c/1bc81f4cd53e827c4ee67ca951b5935724716049452d8dfa09b8b82372bb/tiktoken-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7bfe1849caa65d1e1d9871817170ec497bbb7984e182012e1bdce72f66608cdb", size = 1036353, upload-time = "2026-05-15T04:50:21.757Z" }, - { url = "https://files.pythonhosted.org/packages/75/91/10b9c7076bc02c246c853201fdbbe300a4b8c5ed7b84c25f7403f4e32655/tiktoken-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26", size = 984644, upload-time = "2026-05-15T04:50:23.256Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e4/fceae98015fab47fcd49b8bd7f46145bcd187a47e0add1e5378ed67ef980/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4", size = 1119261, upload-time = "2026-05-15T04:50:24.348Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/fe42ad00de01a8c4a49ad8649a2c8a316835a9cad5961b11d21eac0020a5/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173", size = 1138253, upload-time = "2026-05-15T04:50:25.505Z" }, - { url = "https://files.pythonhosted.org/packages/03/c4/ccee1ecccca107e9a16efcecdeeb964c325305038554d466ece65b42338f/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff", size = 1185747, upload-time = "2026-05-15T04:50:27.02Z" }, - { url = "https://files.pythonhosted.org/packages/9d/03/cd0cba295522b91eb55c6b2704f1df895f8226cfe60ab10d4d51d0cc9e69/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed", size = 1241265, upload-time = "2026-05-15T04:50:28.815Z" }, - { url = "https://files.pythonhosted.org/packages/7e/25/a10efd564402d82c2ff50d12057353ace447aa8007deceaa48641f63d35c/tiktoken-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc1c44cd37b43fc46bae593129164f4f281e82ea116b57a85aa81bda57eafc94", size = 876509, upload-time = "2026-05-15T04:50:30.026Z" }, - { url = "https://files.pythonhosted.org/packages/85/8e/144bde4e01df66b34bb865557c7cd754ed08b036217ebd79c9db5e9048a9/tiktoken-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:32ac870a806cfb260a02d0cb70426aef02e038297f8ad50df5040bb5af360791", size = 1034888, upload-time = "2026-05-15T04:50:31.579Z" }, - { url = "https://files.pythonhosted.org/packages/36/18/d4ac9d20956cdebca04841316660ed584c2fecdc2b81722a28bc7ad3b1e4/tiktoken-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b", size = 982970, upload-time = "2026-05-15T04:50:32.961Z" }, - { url = "https://files.pythonhosted.org/packages/74/ed/6bb8d05b9f731f749fee5c6f5ca63e981143c826a5985877330507bd13b7/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7", size = 1115741, upload-time = "2026-05-15T04:50:34.475Z" }, - { url = "https://files.pythonhosted.org/packages/34/de/2ca96b07a82d972b74fe4b46de055b79c904e45c7eab699354a0bfa697dc/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649", size = 1136523, upload-time = "2026-05-15T04:50:35.782Z" }, - { url = "https://files.pythonhosted.org/packages/ee/dc/9dafec002c2d4424378563cf4cf5c7fb93631d2a55013c8b87554ee4012c/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b", size = 1181954, upload-time = "2026-05-15T04:50:36.99Z" }, - { url = "https://files.pythonhosted.org/packages/a1/d0/1f8578c45b2f24759b46f0b50d31878c63c73e6bf0f2227e10ec5c5408dc/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91", size = 1240069, upload-time = "2026-05-15T04:50:38.221Z" }, - { url = "https://files.pythonhosted.org/packages/aa/90/28d7f154888610aa9237e541986beb62b479df29d193a5a0617dbb1514d0/tiktoken-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f2d16e7a7c783ad81f36e457d046d1f1c8af70b22aec8a13238efe531977c41", size = 874748, upload-time = "2026-05-15T04:50:39.587Z" }, - { url = "https://files.pythonhosted.org/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228, upload-time = "2026-05-15T04:50:40.988Z" }, - { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978, upload-time = "2026-05-15T04:50:42.195Z" }, - { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355, upload-time = "2026-05-15T04:50:43.564Z" }, - { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772, upload-time = "2026-05-15T04:50:44.782Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415, upload-time = "2026-05-15T04:50:46.422Z" }, - { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879, upload-time = "2026-05-15T04:50:48.052Z" }, - { url = "https://files.pythonhosted.org/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829, upload-time = "2026-05-15T04:50:49.202Z" }, - { url = "https://files.pythonhosted.org/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600, upload-time = "2026-05-15T04:50:50.4Z" }, - { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516, upload-time = "2026-05-15T04:50:52.03Z" }, - { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518, upload-time = "2026-05-15T04:50:53.543Z" }, - { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867, upload-time = "2026-05-15T04:50:55.191Z" }, - { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826, upload-time = "2026-05-15T04:50:56.296Z" }, - { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, - { url = "https://files.pythonhosted.org/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820, upload-time = "2026-05-15T04:50:59.528Z" }, - { url = "https://files.pythonhosted.org/packages/8c/93/0dd6adca026a616c3a92974566b43381eea4b475ce1f36c062b8271a9ac5/tiktoken-0.13.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaaaef47c2406277181d2086484c317bf7fc433e2d5d03ff94f56b0dcec87471", size = 1034977, upload-time = "2026-05-15T04:51:00.957Z" }, - { url = "https://files.pythonhosted.org/packages/d9/77/5ec6e6bc5b30bed6d93f7f2162d8f6b32437b3ba27cb527cfe004f6109c9/tiktoken-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ca8b310bd93b3772cb1b7922d915446864860f562bdfe4825c63a0aed3fb28cd", size = 983635, upload-time = "2026-05-15T04:51:02.629Z" }, - { url = "https://files.pythonhosted.org/packages/94/b0/c8ae9aff00d625c50659b4513e707a0462c4bf5d4d6cc1b802103225c02e/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:32e0c12305105002c047b3bb1070b0dd9a73b0cb3b2856a8972b810e7a4f5881", size = 1116036, upload-time = "2026-05-15T04:51:04.082Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ac/6a5dddd1d0a6018ecb389bd0353e6b4a515eb4d2286611bd0ace1937b9e1/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:5ba5fd62507a932d1241346179e3b39bc7bf7408f03c272652d93b3bedf5db24", size = 1135544, upload-time = "2026-05-15T04:51:05.229Z" }, - { url = "https://files.pythonhosted.org/packages/f4/b8/585032b4384b2f7dcdaddcb52865c83a701a420d09e3c2b4a2be1c450c57/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d108bc2d470fc53c8ecd24f2c0fd2b5f98c33e87cdb6aa2e9b8c5dced703d273", size = 1182217, upload-time = "2026-05-15T04:51:06.517Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b6/993ff1ded3958215fd341a847b8e5ffeb5de473f435296870d314fc91ac4/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb99cb5127449f58d0a2d5f5ccfb390d8dbdfd919c221246caaee29d8725ed51", size = 1239404, upload-time = "2026-05-15T04:51:07.843Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3d/fef7e06e3b33e7538db0ced734cf9fe23b6832d2ac4990c119c377aec55e/tiktoken-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:115c4f26ffa11caac8b54eea35c2ad38c612c20a48d35dd15d70a02ac6f51f58", size = 918686, upload-time = "2026-05-15T04:51:08.925Z" }, - { url = "https://files.pythonhosted.org/packages/c1/82/a7fc44582bc32ab00de988a2299bf77c077f59068b233109e34b7d6ca7e6/tiktoken-0.13.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:472527e9132952f2fbf77cd290658bacf003d4d5a3fabc18e5fbd407cbae4d9b", size = 1034454, upload-time = "2026-05-15T04:51:10.035Z" }, - { url = "https://files.pythonhosted.org/packages/37/d0/24d8a890c14f432a05cea669c17bebeaa99f96a7c79523b590f564246411/tiktoken-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e2f67d27c9626cdd25fe33d9313c5cdb3d8d82da646b68d6eb8e7e9c20e6448", size = 982976, upload-time = "2026-05-15T04:51:11.23Z" }, - { url = "https://files.pythonhosted.org/packages/49/b7/2ab43f62788a9266187a9bfc1d3af99ad83e5eaa25fbef168a69cd5ad14f/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2b920b35805cd64585a37c3dc7ce65fba4d2d36016be01e1d7942482ca29093a", size = 1115526, upload-time = "2026-05-15T04:51:12.608Z" }, - { url = "https://files.pythonhosted.org/packages/64/39/1494321ed323ce7a14d88e3cd6cb9058625977df1c6961ddc492bd10a9f3/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:493af3aa28a4aaf2e3d2600a2ee717252c9bf5ab38fff94eb5a02db5ab77e5ad", size = 1136466, upload-time = "2026-05-15T04:51:13.926Z" }, - { url = "https://files.pythonhosted.org/packages/96/d9/dfd086aa2d918c563a140720e0ce296cada1634efd2783d5cf51e05f984e/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6644c9c2b5cf3916f5a3641d7d12fdb3f006a7b3d9ff6acdaec44e29ab1ff91e", size = 1181863, upload-time = "2026-05-15T04:51:15.025Z" }, - { url = "https://files.pythonhosted.org/packages/2f/68/a18b4f307086954fdae32714cb4f85562e34f9d34ab206e61f1816aa6018/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cb65b60b9408563676d874a3a4ee573370066f0dc4e29d84e82e989c6517424", size = 1239218, upload-time = "2026-05-15T04:51:16.103Z" }, - { url = "https://files.pythonhosted.org/packages/16/5b/f2aa703a4fc5d2dff73460a7d46cc2f3f44aa0f3dd8eeb20d2a0ecf68862/tiktoken-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:85b78cc3a2c3d48723ca751fa981f1fedccd54194ca0471b957364353a898b07", size = 918110, upload-time = "2026-05-15T04:51:17.237Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/66/62/167a842aa0429d45f5e797354fd4343a96f6043d67d0513c675c7b8d36e6/tiktoken-0.14.0.tar.gz", hash = "sha256:231dec90efcdccf1b565a1416107736f1e09b1a08fe736ef9d6363e626d03874", size = 38898, upload-time = "2026-08-17T19:49:49.514Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/82/d60a7a5d7bff7b4641d556ea68ea5914ea6edc3774a12eb1c0d444701382/tiktoken-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3b12e54f8bec91433e41aff65d8d1f209a4f678081163747079806e5361f6c91", size = 1095817, upload-time = "2026-08-17T19:48:31.788Z" }, + { url = "https://files.pythonhosted.org/packages/18/e2/d39ae33d3dc30a0c229ff0cb683df961ebb5e7b8691feb2d08b3ee6ac327/tiktoken-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:94f77b60a8ab23580db19ae822744c9716c1720020d2179ca5605112d12326f1", size = 1043064, upload-time = "2026-08-17T19:48:33.138Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e9/8e18cbee0c3ae8321c7e9696bef6090a24eed99a4a75a4c4a7f5115e5a2f/tiktoken-0.14.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:f3d6cf93fbe2e7117eb7bedca684216fbe328a41f0843ce34245451d8eb2df1c", size = 1190381, upload-time = "2026-08-17T19:48:34.386Z" }, + { url = "https://files.pythonhosted.org/packages/af/c8/051e7b72a816ff50eb34a1c7c5b185cd2429ffdf59a497baea35b2b6b2dd/tiktoken-0.14.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:18a1b651c4b032004bf7b4f1713391a54b2a341a52c6e8a2b59acae9d16e13c7", size = 1206869, upload-time = "2026-08-17T19:48:35.581Z" }, + { url = "https://files.pythonhosted.org/packages/c3/b3/7795db206adb6a57d6137fe48ef2cca6b9707e90b86ee8244671592ddc33/tiktoken-0.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4d8d91d68353bd167fdf26467e5ff9e56aaa5f87d6410c0238608629e4dc0d33", size = 1255197, upload-time = "2026-08-17T19:48:36.832Z" }, + { url = "https://files.pythonhosted.org/packages/c8/39/5234783af6b81af645ccdf9438f2f02af472f14e91d876ca2079af641841/tiktoken-0.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10f31e63e40313f2e518d87f7086cfa44e45f64cc14d8ae14103b41220c30a14", size = 1319329, upload-time = "2026-08-17T19:48:37.944Z" }, + { url = "https://files.pythonhosted.org/packages/88/cf/f2d955c8c5c6c67cc86ba6fb132c47c710465ebe6a6dcec1c3b6e250660e/tiktoken-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:c6cb9896a82b9ee44e15ba0b5c8044072f2e4d48acaa704c8d3feeef5ad9487c", size = 944146, upload-time = "2026-08-17T19:48:39.011Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c5/9d848b7f408241171e1f843deb8bfa626086452bc9c78beee500829583e3/tiktoken-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c2edf09b381fafbc014ae8e018ed25087abb9a3dafa8465a0ea63c6558c47a79", size = 1094971, upload-time = "2026-08-17T19:48:40.347Z" }, + { url = "https://files.pythonhosted.org/packages/2d/a9/d94302340304328961d6f0c35ca4e60617fbb57a5cf667e2ed1692cb9e57/tiktoken-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd8ca1305c1c902fe42c486165f2e4808d9997625c98ffb05b9e0366d99d3948", size = 1042916, upload-time = "2026-08-17T19:48:41.541Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b6/31da98ee871383509cae2ba96a9ddef1965e3c4f8cb6dc7bcda3379398db/tiktoken-0.14.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:1f83081065ee5833d35b49e9180f3d8d15622a603dd1c435da0da6cc12b3662f", size = 1188650, upload-time = "2026-08-17T19:48:42.729Z" }, + { url = "https://files.pythonhosted.org/packages/24/65/8c5dddd7cb67f6571d154a58d7c6e2f07da54bf84c49b6a1839965b7c35e/tiktoken-0.14.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7665f6624e052e5e7f6a36919ab69279decdc976d7b16b4fa15e1897d0513", size = 1206378, upload-time = "2026-08-17T19:48:44.013Z" }, + { url = "https://files.pythonhosted.org/packages/d1/04/522ec59d30dd9a2f3ab837011cd4fc5d1178dc4a2fa07c9fa4b90af6ba9d/tiktoken-0.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:144a3fc369f92b7d548995217c5d6e84038d3572157a0f6f34080d65291d0f78", size = 1253694, upload-time = "2026-08-17T19:48:45.597Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/9019e272bad188a1c61ecf44f25a9ba2368744644e3ac1f3d6516f3c9e80/tiktoken-0.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:151d37a150c8f3dfc5f4345597b10e101876bd1bd13494e0185af6b508758d2e", size = 1317873, upload-time = "2026-08-17T19:48:46.792Z" }, + { url = "https://files.pythonhosted.org/packages/24/7f/fff1217240343c0c11b5938b98aeae0e3a266cacfac25f86f91cdcd748f0/tiktoken-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:c77d4a3e1deb2707819df92046b89aad1ac81d27e07616b797cbff3f62c037da", size = 944395, upload-time = "2026-08-17T19:48:48.028Z" }, + { url = "https://files.pythonhosted.org/packages/8c/da/e273746b9d24a63c776bc60fba914351573ad9c575b52601eb5e60632564/tiktoken-0.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8e947aefe98ef74cce94923f90e48c98fe34eb1ec0a6bfdfadfc5a96359bfc36", size = 1094408, upload-time = "2026-08-17T19:48:49.269Z" }, + { url = "https://files.pythonhosted.org/packages/69/9f/fe6b1aca23331aa5271df5a4bd07bf68a7059254d47faee1b8272592a777/tiktoken-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cebe67765569df3dafac8474e4eccf5c19d24140492567a5e58a11445732a4", size = 1038499, upload-time = "2026-08-17T19:48:50.666Z" }, + { url = "https://files.pythonhosted.org/packages/0b/35/e9f47647c9e163bd1de30fe1a491669b7248cfc67b7404c35c009a701e1a/tiktoken-0.14.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:7db45b98e94adf4173a5cd7422b150999a7ee11ff847783a14f6e1b80cc38cb6", size = 1186355, upload-time = "2026-08-17T19:48:51.93Z" }, + { url = "https://files.pythonhosted.org/packages/51/11/9976ad86980a00cdef05e730a0127a2578a1bc6d11644d8d47246de2eb26/tiktoken-0.14.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7896eea257fe497a2b7134474d909156c6744ce8da35bce88011a960e008aa0d", size = 1204197, upload-time = "2026-08-17T19:48:53.18Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9c/7035b0bcfaa68d1ee4803fc5be5214ad865669b05bd20e7105ae8a18afc6/tiktoken-0.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b950248272f1b303dc32986396e2dccfa10cf6d1e83ec8f0bba1776660305482", size = 1250635, upload-time = "2026-08-17T19:48:54.392Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1d/69cabf18bed7f4366da076735816abce0d4db3fae491ae338a6612128777/tiktoken-0.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3de75343041a1c57333b1e707ac8a9769738241d7d6a55d39e12cf84548337c6", size = 1316085, upload-time = "2026-08-17T19:48:55.525Z" }, + { url = "https://files.pythonhosted.org/packages/bd/bd/a2e884fb1402cba5be08836590320012b2d8ada0e2eef9911a64df4bcd2d/tiktoken-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:087538c080e5ff421abd3a0785ed63c5111d06af98e6cd0d374dbe5969147ca3", size = 941208, upload-time = "2026-08-17T19:48:56.938Z" }, + { url = "https://files.pythonhosted.org/packages/50/53/ee1453623bf65f019328721ccb6587846d2c5b7b82f34e73ca09101f072e/tiktoken-0.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9c5fe393aab56469f04e432ff851216d3def3436cf5f07e442a240164bf500f", size = 1094198, upload-time = "2026-08-17T19:48:57.955Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5f/6448cfe278c3664ba9ec5b5ac08344341f7dc3d42888476e215a14eda2be/tiktoken-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbe2cc3bba939bcdaf103e03df9d5039d33887080b315624be28ec69059e5f94", size = 1038820, upload-time = "2026-08-17T19:48:59.015Z" }, + { url = "https://files.pythonhosted.org/packages/69/3b/d67eac1bcce9dee3abe23aff5e3ded3116bbebaf67b80a0811c06d3806fc/tiktoken-0.14.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2157f52e4b4d7ac5ecc7457b3716834706e7ef9a46f5144029bfeb7cf71f4e06", size = 1186175, upload-time = "2026-08-17T19:49:00.068Z" }, + { url = "https://files.pythonhosted.org/packages/37/62/cae690d9783146b0f81f564ada0f8f611de68178c0c9c7e1e969f0516b48/tiktoken-0.14.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:26e60f6a956ee171ab728b37b8439905d7ea1db435c30f9822f291e9861c861d", size = 1203884, upload-time = "2026-08-17T19:49:01.163Z" }, + { url = "https://files.pythonhosted.org/packages/b9/1e/633e30237b94e383cf814145499079f3bb9cdd4aeafc1bc42e01b0f810a6/tiktoken-0.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:380873f330b741c4435574f37edb20813d04603ace2d53e0a63560e1fec83010", size = 1250980, upload-time = "2026-08-17T19:49:02.274Z" }, + { url = "https://files.pythonhosted.org/packages/cb/56/4c12f07b812f84206f38d723eb1ebfdd34bad9309b5dbc0bee6bbcff4cbf/tiktoken-0.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3fd7c14b1cb45b486c39fc9b3443bb341f3e2fc7e6f31247f3435a5836651632", size = 1315434, upload-time = "2026-08-17T19:49:03.434Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e0/c65603f0c44811def666d3fbf611bf2af3b5e1ef613e06c19411419830b3/tiktoken-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:90a762670c7f968184723769a06ed51f5cf5ce5dcd1e30164f25c72d85c2d1f1", size = 940883, upload-time = "2026-08-17T19:49:04.583Z" }, + { url = "https://files.pythonhosted.org/packages/59/b0/1cf129f4af8fc513931f931023def596b7c4bfc77026513cd9d851da9e88/tiktoken-0.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e067f4cbcc5d036e8aff7fe7a6b530a8f4de2e4616ad9005a24a1879e24e6450", size = 1096273, upload-time = "2026-08-17T19:49:05.807Z" }, + { url = "https://files.pythonhosted.org/packages/62/85/2ae74575e321148484147e10b53c3b1717c59ebaa9edb4fe18b1f5c055f8/tiktoken-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f2af4a336ea56d6c14f27741a0e1d8294a35dd0b038bcf990d232ebb54eb994b", size = 1040269, upload-time = "2026-08-17T19:49:06.943Z" }, + { url = "https://files.pythonhosted.org/packages/89/29/92a1120a12e4bcf2d5464350d1a91b68a433d63ce656bb7f806c27aec09c/tiktoken-0.14.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:f702e0aeeb6506e57687e881c59e844ebe8f0a6a097ddafe20e3ab25f387be4e", size = 1186101, upload-time = "2026-08-17T19:49:08.102Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7d/144af98dc5ad68108451a82e2f5a17f80e2663f5115058b8dfd215c1ad02/tiktoken-0.14.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:e3442bbb2f0c588cec876061e37ae67b455b9df9978b003c8fe30e45f2ef5b42", size = 1204457, upload-time = "2026-08-17T19:49:09.28Z" }, + { url = "https://files.pythonhosted.org/packages/e6/1f/be7cb06ab2108f612f3e92e7b76cf391e192db0db37a984616f0cc32aafc/tiktoken-0.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:979c1524f753b662b0f3cd261b135afe6659cce33caaa7a5ea00dd1756b3055c", size = 1251716, upload-time = "2026-08-17T19:49:10.509Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6b/81f158d0f90adb826cd704069c2129a046cb784a2a09861009519fc41cf4/tiktoken-0.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2cc19ac87b41c9493c9778ff5847f0c8bbcf5bd0ec6b87ce06c1c802adc8a771", size = 1315432, upload-time = "2026-08-17T19:49:11.844Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ec/f5fa35ec13f07279fdcaf3cc9c04bbb154ea591d23978651f2b672593e8a/tiktoken-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:eceeff0c62419bc78d4b6e70a4762a4d25df3ae8f2d5946e3853ce93e7a57098", size = 988046, upload-time = "2026-08-17T19:49:13.282Z" }, + { url = "https://files.pythonhosted.org/packages/68/c9/7756717408d3d0dfea3f046c9466144b28afde39ff69d5808f2475dcd7f5/tiktoken-0.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6eb94895c45f26bb8f5546e5fd8a069efcf6e3f108ea9d5cbe3bf6f7f3983438", size = 1096261, upload-time = "2026-08-17T19:49:14.351Z" }, + { url = "https://files.pythonhosted.org/packages/79/29/46ad8061f57bd9f8b2ea0aa82bf574e0f2aa040b0857a1582adba9957899/tiktoken-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:86951a971c53979ec857bd8c4a32dc227ab0fd33f6c12a3bd62d3fbf5f0bfcaa", size = 1040183, upload-time = "2026-08-17T19:49:15.707Z" }, + { url = "https://files.pythonhosted.org/packages/5a/7c/3184d17b868456f17b60b1a75f5ec0405618a43aa753336df341d8f11781/tiktoken-0.14.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:e2eca764c53490f8930dbce329e0769f11108d87d908282a80c5c130e26e7037", size = 1186719, upload-time = "2026-08-17T19:49:16.84Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e8/46de4400d5bf859f640feee85bd7e32235f68ddf25db53c63be78e581e3a/tiktoken-0.14.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:26cc4b4840fa0e9f4b72ed489883e12f57e00d1021ca794720e3c29a12f0edef", size = 1204660, upload-time = "2026-08-17T19:49:17.987Z" }, + { url = "https://files.pythonhosted.org/packages/29/ce/af8964c38bc8226dd8950305b7a255fa33345d5572f78af7275a313d28e0/tiktoken-0.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2fc834fbe3f6a0736905c36ab709537e6840dbd63b982dc9e0216ae7d305ba1a", size = 1250932, upload-time = "2026-08-17T19:49:19.28Z" }, + { url = "https://files.pythonhosted.org/packages/1d/4b/323631116fc986d9cc5bbeb2b8223c7c85e61a8bb94ea5ab4951023b149b/tiktoken-0.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ca4db6ff5c5bf600f9b7761a0070ed44dfe5797a76bd432fb978bc480ef40c58", size = 1315190, upload-time = "2026-08-17T19:49:20.467Z" }, + { url = "https://files.pythonhosted.org/packages/18/8b/ba48a73729c9270989b36f37ab2ed5525e52690d715097c9fa791aaa5d05/tiktoken-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7aab286a020660a039097912a088236b985d18a3090d73f136c4413d29d37ca0", size = 987717, upload-time = "2026-08-17T19:49:21.704Z" }, + { url = "https://files.pythonhosted.org/packages/1d/10/b73b7e319179e0f60b32475f783b044f9cece872c53b6662664e9084b0d0/tiktoken-0.14.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:14b47e3674f2624803a8acc8fb367b7e24fc53055f9df3296482fe9a3a34a232", size = 1096280, upload-time = "2026-08-17T19:49:22.779Z" }, + { url = "https://files.pythonhosted.org/packages/c2/6b/09999a9bf1d559670d1680e8f8e419ac0e2c5f6aac82e9bfdf70f260b30a/tiktoken-0.14.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:19d643d701fdaa70e5b9c7f8f96abcaffe77ca5e482a3a1a7dde46feb4284695", size = 1040433, upload-time = "2026-08-17T19:49:23.998Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7b/8537be0836f3df99b2a636b44399bfa43cd757f2b8b4097dacb794cf24a7/tiktoken-0.14.0-cp315-cp315-manylinux_2_28_aarch64.whl", hash = "sha256:e4ddf863b59347deaa92302dcd90e5eb003cdc9be06ec2b692c38d1bdd9efd49", size = 1186989, upload-time = "2026-08-17T19:49:25.021Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9d/f9c56d7a943a4468abf9ef37661bb9b8e0cd3aa8aa87368c7146cc3f3222/tiktoken-0.14.0-cp315-cp315-manylinux_2_28_x86_64.whl", hash = "sha256:60c47ca69ddda0dea8256fffd12e1b86f4b59734a20e4a70c61f63cc5f021df4", size = 1204615, upload-time = "2026-08-17T19:49:26.37Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d2/98a38579db25c4a8a84e31dd95d9072ec5f21f7e70de591da0412e29b25b/tiktoken-0.14.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:728303a072163130c5b477b1f20d6211895569c1d5302c24ffc93a3009160871", size = 1251828, upload-time = "2026-08-17T19:49:27.423Z" }, + { url = "https://files.pythonhosted.org/packages/0c/83/467be424746c039c5493c0f4102feab16b9b48eb6f5c089b2a2438e3cde2/tiktoken-0.14.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3c5349c9f916283bba32bec8af69b763e4faa304dc004d0eaaea66a3cf004c1f", size = 1316260, upload-time = "2026-08-17T19:49:29.101Z" }, + { url = "https://files.pythonhosted.org/packages/02/ee/ddf46ca78e371f5890e96b6e7d089a85b3536432be219851eb0481786ca8/tiktoken-0.14.0-cp315-cp315-win_amd64.whl", hash = "sha256:1b6e4adcfd285c44502aed51df98aaaca4f0fea028165dbf8a9e857b9f98d8ea", size = 988230, upload-time = "2026-08-17T19:49:30.246Z" }, + { url = "https://files.pythonhosted.org/packages/2a/00/5162e90c851a28da18ed382d34898b79a8022548e5619a64e14c03ce7c3d/tiktoken-0.14.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:11d8211b290855d2721334ff17dd9b3a17bfb26872be01f25d73612ef7ece890", size = 1096186, upload-time = "2026-08-17T19:49:31.656Z" }, + { url = "https://files.pythonhosted.org/packages/65/97/a5a7bfccf25b1bb65e82bae8edff11ac3c9c041c374b7b4a823d60c38133/tiktoken-0.14.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:d0781223705199b289faa59601bb9c2441712d4c600dd13c43d8fd6a33d22cd5", size = 1039947, upload-time = "2026-08-17T19:49:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/fb/ba/ef427fc638f1439181c5e12dd26b70e881861f89c007aa7e5b36300f8342/tiktoken-0.14.0-cp315-cp315t-manylinux_2_28_aarch64.whl", hash = "sha256:2ea70afba6b9eddbf22c165142e5f0a2ad7aa36a452873c48b57bb2aeb8492ae", size = 1186997, upload-time = "2026-08-17T19:49:34.121Z" }, + { url = "https://files.pythonhosted.org/packages/3e/88/2f3f85a968cdc514152129af0a060ebcccb067005a2f29b0d5ef3c838514/tiktoken-0.14.0-cp315-cp315t-manylinux_2_28_x86_64.whl", hash = "sha256:78571efc311c30b73f31eb949a921d6dac39a5d9dc42d1cfa8f8db157b3447b1", size = 1205211, upload-time = "2026-08-17T19:49:35.284Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f6/80760e98a08e6649d2d68afb6035af713121dfb615acce8c4f73810ec438/tiktoken-0.14.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86f66c85e796f5d05d5c4a60ec1d40cbfebc47a32464053528c797163fa9ab89", size = 1251479, upload-time = "2026-08-17T19:49:36.419Z" }, + { url = "https://files.pythonhosted.org/packages/c5/84/50966fb6918a0fb9b32721277e5342bf729a2d74350074d662fbedf9772e/tiktoken-0.14.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:149d97453c4c98c04b081d64a85e635921269b532710d6faf81e9e82b790e7d3", size = 1316673, upload-time = "2026-08-17T19:49:37.756Z" }, + { url = "https://files.pythonhosted.org/packages/35/5e/9b01afd037bfa22a0033963fa091e0f75b6fb15cd85bffb42ff86e697323/tiktoken-0.14.0-cp315-cp315t-win_amd64.whl", hash = "sha256:561e7580f84a79859af1ef6f676968e9030fcc3fe195700b15235bca64f009c9", size = 987929, upload-time = "2026-08-17T19:49:38.947Z" }, ] [[package]] name = "tokenizers" -version = "0.23.1" +version = "0.23.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/60/21f715d9faba5f5407ff759472ade058ec4a507ad62bcea47cb847239a73/tokenizers-0.23.1.tar.gz", hash = "sha256:1feeeadf865a7915adc25445dea30e9933e593c31bb96c277cee36de227c8bfa", size = 365748, upload-time = "2026-04-27T14:43:25.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/1e/bc6587c5ab643b2e17776cace9070a2ae73549c86bffac9934a600bf3c31/tokenizers-0.23.2.tar.gz", hash = "sha256:7f0f085686b9de0d0079e6f874ae053600db64c5d13049e0bbc0119926d25aac", size = 385745, upload-time = "2026-09-03T08:55:42.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/39/b87a87d5bb9470610b80a2d31df42fcffeaf35118b8b97952b2aff598cc7/tokenizers-0.23.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e03d6ffcbe0d56ee9c1ccd070e70a13fa750727c0277e138152acbc0252c2224", size = 3146732, upload-time = "2026-04-27T14:43:15.427Z" }, - { url = "https://files.pythonhosted.org/packages/e2/6a/068ed9f6e444c9d7e9d55ce134181325700f3d7f30410721bdc8f848d727/tokenizers-0.23.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e0948bbb1ac1d7cdfc9fb6d62c596e3b7550036ad60ecd654a66ad273326324e", size = 3054954, upload-time = "2026-04-27T14:43:13.745Z" }, - { url = "https://files.pythonhosted.org/packages/6c/36/e006edf031154cba92b8416057d92c3abe3635e4c4b0aa0b5b9bb39dde70/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf13402aff9bc533c89cb849ec3b412dc3fbeacc9744840e423d7bf3f7dc0e3", size = 3374081, upload-time = "2026-04-27T14:43:01.241Z" }, - { url = "https://files.pythonhosted.org/packages/a2/ef/7735d226f9c7f874a6bee5e3f27fb25ecabdf207d37b8cf45286d0795893/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f836ca703b89ae07919a309f9651f7a88fd5a33d5f718ba5ad0870ec0256bad6", size = 3247641, upload-time = "2026-04-27T14:43:03.856Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d9/24827036f6e21297bfffda0768e58eb6096a4f411e932964a01707857931/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae848657742035523fdf261773630cb819a26995fcd3d9ecae0c1daf6e5a4959", size = 3585624, upload-time = "2026-04-27T14:43:10.664Z" }, - { url = "https://files.pythonhosted.org/packages/0c/9a/22f3582b3a4f49358293a5206e25317621ee4526bfe9cdaa0f07a12e770e/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53b09e85775d5187941e7bab30e941b4134ab4a7dd8c68e783d231fb7ca27c51", size = 3844062, upload-time = "2026-04-27T14:43:05.643Z" }, - { url = "https://files.pythonhosted.org/packages/7e/65/b8f8814eef95800f20721384136d9a1d22241d50b2874357cb70542c392f/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea5a0ce170074329faaa8ea3f6400ecde604b6678192688533af80980daae71a", size = 3460098, upload-time = "2026-04-27T14:43:08.854Z" }, - { url = "https://files.pythonhosted.org/packages/0d/d5/1353e5f677ec27c2494fb6a6725e82d56c985f53e90ec511369e7e4f02c6/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b405006415ea148a992d093699c66eb01952bf59f4d5727089a98bda45a4", size = 3346235, upload-time = "2026-04-27T14:43:12.377Z" }, - { url = "https://files.pythonhosted.org/packages/71/89/39b6b8fc073fb6d413d0147aa333dc7eff7be65639ac9d19930a0b21bf33/tokenizers-0.23.1-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:56f3a77de629917652f876294dc9fe6bad4a0c43bc229dc72e59bb23a0f4729a", size = 3426398, upload-time = "2026-04-27T14:43:07.264Z" }, - { url = "https://files.pythonhosted.org/packages/0f/80/127c854da64827e5b79264ce524993a90dddcb320e5cd42412c5c02f9e8a/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d10a6d957ef01896dc274e890eee27d41bd0e74ef31e60616f0fc311345184e", size = 9823279, upload-time = "2026-04-27T14:43:17.222Z" }, - { url = "https://files.pythonhosted.org/packages/fe/ba/44c2502feb1a058f096ddfb4e0996ef3225a01a388e1a9b094e91689fe93/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1974288a609c343774f1b897c8b482c791ab17b75ab5c8c2b1737565c1d82288", size = 9644986, upload-time = "2026-04-27T14:43:19.45Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c1/464019a9fb059870bfe4eebb4ba12208f3042035e258bf5e782906bd3847/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:120468fb4c24faf0543c835a4fabafa4deb3f20a035c9b6e83d0b553a97615d4", size = 9976181, upload-time = "2026-04-27T14:43:21.463Z" }, - { url = "https://files.pythonhosted.org/packages/79/94/3ac1432bda31626071e9b6a12709b97ae05131c804b94c8f3ac622c5da32/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e3d8f40ea6268047de7046906326abed5134f27d4e8447b23763afe5808c8a96", size = 10113853, upload-time = "2026-04-27T14:43:23.617Z" }, - { url = "https://files.pythonhosted.org/packages/6a/dd/631b21433c771b1382535326f0eca80b9c9cee2e64961dd993bc9ac4669e/tokenizers-0.23.1-cp310-abi3-win32.whl", hash = "sha256:93120a930b919416da7cd10a2f606ac9919cc69cacae7980fa2140e277660948", size = 2536263, upload-time = "2026-04-27T14:43:29.888Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/2553f72aaf65a2797d4229e37fa7fbe38ffbf3e32912d31bdd78b3323e59/tokenizers-0.23.1-cp310-abi3-win_amd64.whl", hash = "sha256:e7bfaf995c1bdbbd21d13539decb6650967013759318627d85daeb7881af16b7", size = 2798223, upload-time = "2026-04-27T14:43:28.51Z" }, - { url = "https://files.pythonhosted.org/packages/cd/2b/2be299bab55fc595e3d38567edb1a87f86e594842968fa9515a07bdcf422/tokenizers-0.23.1-cp310-abi3-win_arm64.whl", hash = "sha256:a26197957d8e4425dfba746315f3c425ea00cfa8367c5fbc4ec73447893dcea9", size = 2664127, upload-time = "2026-04-27T14:43:26.949Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ed/8a443528baa6fac8dfe8c3b75b038c63ac92bb539bcabe311e227c718173/tokenizers-0.23.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:85a9a357a3764aecc904ee76bdaf8cf1ad8e5a67a1b929a487c4a39b49ed0e90", size = 3148852, upload-time = "2026-09-03T08:55:30.874Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/22da045a91732384d3a3771816bf188dc5a1f702c32e635afa7c679c0bef/tokenizers-0.23.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:986670e43691469dcee610ea0f846f91a8f84e91fc6f7a48d4c064414c0ec2bf", size = 3101593, upload-time = "2026-09-03T08:55:28.587Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4d/8f569ed49372a3ed8e57099bd515055fd48d7c95912c4307cda6973c2168/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37039b5dfc4af84eb3ef0a92f4307e28936c8f9adccba2629d36f652e9bf7a2", size = 3516830, upload-time = "2026-09-03T08:55:14.741Z" }, + { url = "https://files.pythonhosted.org/packages/2a/de/e2f14c8919d5bf51874051d00d6c7b7e0e8bde6c6a2dbeddda7f642896ff/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b7e37ba198f24150f523e1242e83c4970de4a525480586be5dcc24d9add32c5", size = 3407975, upload-time = "2026-09-03T08:55:16.842Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bd/93c69152d02ef06ce47aed8b2bf4952dcf733c935a62791873932b2934d9/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43e4f2071e3cc8d5d86421c874aebc82659bb51a68bcdef5a0da75ee89511ccb", size = 3748165, upload-time = "2026-09-03T08:55:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/2d/b7/56b84b80bc96942bba8eb23751a9e8a1fce4faaf4390425e7083f721c98c/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:325fee2e0418a9dc6c9ecf736a5f5f0db7875183ace9549ae339da76f7a1fbb7", size = 4024165, upload-time = "2026-09-03T08:55:18.806Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/0175e216f005c2fe08238292663aa41e4c802b216e71047a69a0e9fc6fa3/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:950d7c9426fa72406a0ffeacdbc0bb9985f5db20eb8b263f29c79aaf83105703", size = 3591899, upload-time = "2026-09-03T08:55:22.752Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ca/ca6b93c7820df123b2662a9469e8facc826ccc94e98fdd0d615f6431e73a/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41c2f84d172449b4dadb9cdc508e3e364076613c35b16e76ecfe47a60d1e3305", size = 3386843, upload-time = "2026-09-03T08:55:26.584Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a4/4f9106d317b14a80aefea9f0e3a8d07ef25f856a7607eb7f5ab894281fcb/tokenizers-0.23.2-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:12f0835dc2ee694746a76adf7b1567d4346a4a502ebe93fb1f5f80ea49799b78", size = 3577314, upload-time = "2026-09-03T08:55:20.825Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6a/1552b70fb0d9ab074fd3fc961435d01364e79c9058481822c3af6e8d402c/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb2f9c8a24da020ea8c11a01a19c1c2547912d92121ae4a01cfbca46125dee40", size = 9967367, upload-time = "2026-09-03T08:55:33.188Z" }, + { url = "https://files.pythonhosted.org/packages/06/01/3ccb3a956c7528b2507b8a9714155c4baf86af593039db6ea375dd0c96c3/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f486f402f6f9abee5bb032553736813af0c710a86b2e0ca592634c55cea1f835", size = 9811886, upload-time = "2026-09-03T08:55:35.642Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/7038e612d48bda1599457f712f6bd3854eae1a9dc9c13aa47f835349db48/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:bef235815a067b2648caf6dcc7a71091b0b0fff9ee8057f6451eb9335fae52ef", size = 10146224, upload-time = "2026-09-03T08:55:38.391Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d8/8e9e4e0b287a338d8f88976729628c9d22e8a54cfaf9777018a7f7cb58a0/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5c56bda1511921587789163e524d196ed8284174ac23abd7685d5ea8da6c4718", size = 10256304, upload-time = "2026-09-03T08:55:40.977Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1f/c79a01f671a49728ebb0b61f7ff9ea45663b66cab40bc0858e9859b25c16/tokenizers-0.23.2-cp310-abi3-win32.whl", hash = "sha256:debf978920d93ba9c219bd67cc4bbfaf912c9039e41e7a28b91ec15e3728c95a", size = 2592809, upload-time = "2026-09-03T08:55:48.02Z" }, + { url = "https://files.pythonhosted.org/packages/db/f7/0a69ac6b82dbccf3f71add938a161c497952749294b8dd6dfe03a819dc40/tokenizers-0.23.2-cp310-abi3-win_amd64.whl", hash = "sha256:2e96f5699d5249c9c64aa8412e044f727aae3a4098cf830f9901ec1afc361cde", size = 2863236, upload-time = "2026-09-03T08:55:46.193Z" }, + { url = "https://files.pythonhosted.org/packages/d7/b0/dee84cb44175be1b4c35bd2f770727494e78f0bb38e571a623ade94dbebb/tokenizers-0.23.2-cp310-abi3-win_arm64.whl", hash = "sha256:e49c394456dd9985787fec76132438ba3fb8911f857b1bf3d40119f9292d41aa", size = 2729352, upload-time = "2026-09-03T08:55:44.345Z" }, ] [[package]] @@ -5058,14 +5324,23 @@ wheels = [ [[package]] name = "tqdm" -version = "4.68.4" +version = "4.70.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/5f/57ff8b434839e70dab45601284ea413e947a63799891b7553e5960a793a8/tqdm-4.68.4.tar.gz", hash = "sha256:19829c9673638f2a0b8617da4cdcb927e831cd88bcfcb6e78d42a4d1af131520", size = 792418, upload-time = "2026-07-07T09:58:18.369Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/ea/b2a5bd54b28a324dae8211928b2d730b6547500342c7e6c6dea08bd0a485/tqdm-4.70.1.tar.gz", hash = "sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4", size = 171846, upload-time = "2026-09-11T07:25:16.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl", hash = "sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73", size = 80199, upload-time = "2026-09-11T07:25:14.599Z" }, +] + +[[package]] +name = "truststore" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/2a/5e5e750890ada51017d18d0d4c30da696e5b5bd3180947729927628fc3cb/tqdm-4.68.4-py3-none-any.whl", hash = "sha256:5168118b2368f48c561afda8020fd79195b1bdb0bdf8086b88442c267a315dc2", size = 676612, upload-time = "2026-07-07T09:58:16.256Z" }, + { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, ] [[package]] @@ -5128,15 +5403,15 @@ s3 = [ [[package]] name = "types-aiobotocore" -version = "3.7.0" +version = "3.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore-stubs" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/e8/ef1fcb876937dbdddc0f01b5df4ed53f33b166a6367d80a9014d5e5f091d/types_aiobotocore-3.7.0.tar.gz", hash = "sha256:fe35de52c12e5fdb89ca60b3989766e7fe827e3d2e95fcf4583e91581945205c", size = 87992, upload-time = "2026-05-10T03:19:32.353Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/8d/d9654bb658aedc849eca2f761669d4a53faa56a75464663f5d7e5be58c27/types_aiobotocore-3.9.1.tar.gz", hash = "sha256:d86497c3d821ca3e5b0c4705ad85066672c57c64b715333500979f4565844d4e", size = 89449, upload-time = "2026-09-09T03:35:15.643Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/68/0cdfd7df415ee3e769c8e8f9bd8013c64c88cdd7306f72453a02123c58f9/types_aiobotocore-3.7.0-py3-none-any.whl", hash = "sha256:ff4139b3eae22d242b6b39ba56048344b2b86f67daeeca4680da1a6e191681fd", size = 54804, upload-time = "2026-05-10T03:19:29.487Z" }, + { url = "https://files.pythonhosted.org/packages/73/a4/426846af7d5ddb7254942d4144a8d2a497aa1a7d20a579307e2431cb42e6/types_aiobotocore-3.9.1-py3-none-any.whl", hash = "sha256:768ca08c54e4c1657a62a8229aa465263a73c2290b5339cf2a2314b0a61d392c", size = 55271, upload-time = "2026-09-09T03:35:11.703Z" }, ] [[package]] @@ -5151,22 +5426,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b4/0a/d0d9faefd7caa8536eb97647c38c711e73ab83341a65119d08c2cb20957d/types_aiobotocore_s3-2.25.2-py3-none-any.whl", hash = "sha256:151301e84bb2f1cbf30f0d1ef791bb75c141cfbfe47b93fd317b7f1ba3eb35e4", size = 83626, upload-time = "2025-11-12T01:52:04.763Z" }, ] -[[package]] -name = "types-awscrt" -version = "0.34.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/59/44409a8fc06b444ab1a6f71dcb29d49a6e17e02424345eb51b051bebb345/types_awscrt-0.34.1.tar.gz", hash = "sha256:559aa04250f6a419a617dfb788f3e10903aaf74700ef23e521b64a411b83b803", size = 19062, upload-time = "2026-06-05T04:40:10.689Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/b1/214b12162b452ed6acd230065e6c587cde6b96871e3ce6d653f40888f8df/types_awscrt-0.34.1-py3-none-any.whl", hash = "sha256:20c752b6031544d8f694803c35174aee129f1be5ddf886ae46d22f7ffd9b7d75", size = 45688, upload-time = "2026-06-05T04:40:09.198Z" }, -] - [[package]] name = "types-protobuf" -version = "7.34.1.20260518" +version = "7.35.1.20260906" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/29/59/e2b13b499d15e6720150c4b1a8d91e31fcacf716b432397475b3151ff7e4/types_protobuf-7.34.1.20260518.tar.gz", hash = "sha256:28cfaded25889cb83ebfb63cfb0a43628f0b6f3785767bec17287dc6468795f2", size = 68936, upload-time = "2026-05-18T06:01:47.332Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/6c/e3e5b3e10bc328126a39637c138f9ebfd734bf14342b9f3540039b4ab995/types_protobuf-7.35.1.20260906.tar.gz", hash = "sha256:efd1a3862d4c967dad5512ef8d56b1530ac84f182c41735b94004756518c4998", size = 69895, upload-time = "2026-09-06T06:35:28.308Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/1f/ec5caf72c2e3b688ca3927e0979a04ddad19e1afc4bf1c199bd743e0f419/types_protobuf-7.34.1.20260518-py3-none-any.whl", hash = "sha256:a0a5337413347166439c0e07cbc26c6164d091401c6f01b1dfd8cdb966c4dd8f", size = 85992, upload-time = "2026-05-18T06:01:45.696Z" }, + { url = "https://files.pythonhosted.org/packages/44/4e/f63e826c68f77ef875506d72f225918800346545ee99847bc28f3394f18d/types_protobuf-7.35.1.20260906-py3-none-any.whl", hash = "sha256:5155e48569e0dabff303fdf578db96cd31ea9a4a63b18018a4ceac6b0ae17462", size = 86419, upload-time = "2026-09-06T06:35:27.247Z" }, ] [[package]] @@ -5189,23 +5455,23 @@ wheels = [ [[package]] name = "typing-inspection" -version = "0.4.2" +version = "0.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, + { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" }, ] [[package]] name = "tzdata" -version = "2026.3" +version = "2026.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/31/3d74fa778a63b98b7374323befcc0be5ab3bd94afd4096a0124e7379152c/tzdata-2026.4.tar.gz", hash = "sha256:f1b8bd365d8d210c55353f4d7f8d6d8561c0ba50d704b700d195a9424bba0d79", size = 199350, upload-time = "2026-09-12T12:56:03.251Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bc/8737e8d54cf51106118039b83f485a4783112fab49ea9d044b234978a46e/tzdata-2026.4-py2.py3-none-any.whl", hash = "sha256:c2169a8b0a7a5e9674da5a135ccdfb2b3e671b333ed9fed17b41f73c34476e81", size = 347494, upload-time = "2026-09-12T12:56:01.67Z" }, ] [[package]] @@ -5222,126 +5488,126 @@ wheels = [ [[package]] name = "urllib3" -version = "2.7.0" +version = "2.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz", hash = "sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63", size = 458972, upload-time = "2026-09-15T19:29:36.253Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, + { url = "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl", hash = "sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", size = 135717, upload-time = "2026-09-15T19:29:34.577Z" }, ] [[package]] name = "uuid-utils" -version = "0.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/91/63938e0e7e7876658e5e40178e7c0735b53527886fe11797a11699c55edd/uuid_utils-0.17.0.tar.gz", hash = "sha256:abb5667a36119019b3fa320c4d10c21ebccfcc87c8a739e6a0056cee7f48dde2", size = 43220, upload-time = "2026-07-09T13:49:58.433Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/60/659104207938f2ac62508b9aa595fc0515ac7452dd515c8e1d47d0b91169/uuid_utils-0.17.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d2d9a63a9e6f2416ace8c109043a9280d6b34f34bb2e5421903e149403db40a6", size = 564038, upload-time = "2026-07-09T13:47:51.731Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e7/e0d048a268b4163058bdd2f07a45bbe13c29e3cc6b7b88f8f00b001617ce/uuid_utils-0.17.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b776c7fc8755c7de06dd5a22b47c40ae84f67d13277ebb233cc84933ba4dcbcd", size = 286680, upload-time = "2026-07-09T13:47:53.141Z" }, - { url = "https://files.pythonhosted.org/packages/84/83/e3606dc9b4224d0c9a6675d9347e7e0da7e67fa30e061bfdb686138844d0/uuid_utils-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1edf2f8732e4ed95bd7b65f2658f4aa072efaaff321144f4e0d4bf6a22709263", size = 323533, upload-time = "2026-07-09T13:47:54.433Z" }, - { url = "https://files.pythonhosted.org/packages/22/f8/aec5c34fa80c9fef09a506a098015e728080076494b72b9e8e5cfc9669c4/uuid_utils-0.17.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84ed3a2d5cd3ae6db87af20bfed3331116195ba4757ad7177fc8f12c1bbce2a9", size = 330691, upload-time = "2026-07-09T13:47:55.677Z" }, - { url = "https://files.pythonhosted.org/packages/08/73/85776566863514f37b0a761648368e96b07d64981a9b6c391220aa2563a9/uuid_utils-0.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bf4d9cd1e80e73922073b9b27c143bedeb109d65f94cd12712e2c87118f2b7d", size = 444094, upload-time = "2026-07-09T13:47:56.936Z" }, - { url = "https://files.pythonhosted.org/packages/68/06/e0424b4268c0932e0ff8257303d70de4053f05958843268fac4cb0f79b57/uuid_utils-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52db0e471d3d2632d35445af352591f40a8f32959a412981d9f51e068bb9514b", size = 324548, upload-time = "2026-07-09T13:47:58.217Z" }, - { url = "https://files.pythonhosted.org/packages/db/d2/a0cb3a69ef6d9becc30a6a0594ddf6f798f6204953dfa85073cbec875b94/uuid_utils-0.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:344f7c755e280ea0ba6aeb08022190d867a80000b1715cacded54fc4b5633607", size = 350307, upload-time = "2026-07-09T13:47:59.418Z" }, - { url = "https://files.pythonhosted.org/packages/82/81/d82766af7db541e4a78b920bc1c4303d44995f841805d1498934088cd12c/uuid_utils-0.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:589d9da7de8fa7f739bb970ac4632c9a268213117d634e1c4a58c1c1e821ca05", size = 500661, upload-time = "2026-07-09T13:48:00.726Z" }, - { url = "https://files.pythonhosted.org/packages/10/71/b261cd0d38497ed8c2cce0263c5607ec9cd2bbace0f73cb19a6fc2060b6e/uuid_utils-0.17.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cee808b405e9095506f4e4e89924bec7ea77eac3129b6fe36eda04364b3b343b", size = 606577, upload-time = "2026-07-09T13:48:02.539Z" }, - { url = "https://files.pythonhosted.org/packages/3b/63/9e48512bb235e9533adbb25c30fd0c9cef09f6ecefe131ba392b98572b40/uuid_utils-0.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:53ce348ef4c6e98c02c19c522af01334fe94476ce9af0db8c4482f9f142ae9c1", size = 567054, upload-time = "2026-07-09T13:48:03.833Z" }, - { url = "https://files.pythonhosted.org/packages/b2/cc/d7bad8799a37ec33fc21b29fcb459d63d9f88aa09056d0c3e58903ba2fb0/uuid_utils-0.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9e753e81457241e2200c56a898e268e8fa25796271af0489c608f24d8e631eed", size = 529682, upload-time = "2026-07-09T13:48:05.097Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3b/59b1e07ada8aadd3c046c97fe9814d85e770abb7e8cf68d5d86538bf62e9/uuid_utils-0.17.0-cp310-cp310-win32.whl", hash = "sha256:c589f5023d471ce75dd2cce61acb25ed6347e562041588a1a366808f22d7176c", size = 170595, upload-time = "2026-07-09T13:48:06.411Z" }, - { url = "https://files.pythonhosted.org/packages/8b/5c/23a2d0253ada2ee8c497d541d4ef0dd5576c3d2454ec2f9d0b8a06af9304/uuid_utils-0.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:981cc10163988defea96e8d6c507df151eab8f483e7df9ae543d5a41a4be073b", size = 177225, upload-time = "2026-07-09T13:48:07.561Z" }, - { url = "https://files.pythonhosted.org/packages/d7/b2/8f03b61f0aa4afc687855c4f00db35f4d3e58c480cd885abc46f6e41308f/uuid_utils-0.17.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f9b093cb3b6c9d6233ef45a05cab064d2aa0a8cb3c5777084c9e20fcb77c2371", size = 563901, upload-time = "2026-07-09T13:48:08.961Z" }, - { url = "https://files.pythonhosted.org/packages/e3/cb/88b909ffb9ac11f88d2e6ceabc592ccc660b5830b06dbcbd290ab8981f1f/uuid_utils-0.17.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0bc4c431ccd59c764080ceb43b126043325fe17861b87759d026a0cdd8423bb2", size = 286383, upload-time = "2026-07-09T13:48:10.2Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b8/bc5b64e9898867227c535cd0366c571c580a736748e81329437c1773e442/uuid_utils-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c00d182e31034250690f417b9068b78eab423c10d76766664e82d9860c340479", size = 323244, upload-time = "2026-07-09T13:48:11.477Z" }, - { url = "https://files.pythonhosted.org/packages/13/d9/8a17462ce066fbf89670fb737a3f0c93a77816736d2a4d134787e759d8ea/uuid_utils-0.17.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:570db214f6d8507587a8faa968a3fe65e957daeb7bc48b27dc7f69bc3ecdd6f1", size = 330466, upload-time = "2026-07-09T13:48:13.092Z" }, - { url = "https://files.pythonhosted.org/packages/43/37/0c65d0db3bae45183419756d938f1791a82c835fd92bf234eb4f008d2e02/uuid_utils-0.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:351462debd866f1f25e4d4f5c7fac89525b52151f0102a1bdfe94a999b046f5f", size = 443806, upload-time = "2026-07-09T13:48:14.372Z" }, - { url = "https://files.pythonhosted.org/packages/32/d5/7e698466d1f5254620b5ee0d711fdd20a0e9c2acd7040740c37193a8f673/uuid_utils-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:622cdde768300591ac79bfcd7bb3468e4b191b1105d5dbfe8d87c39d8f63dd46", size = 324261, upload-time = "2026-07-09T13:48:15.642Z" }, - { url = "https://files.pythonhosted.org/packages/5d/48/3a5b242d7f0b8e3ca77dcd7177f3cf73e0280cee32e2349d9796ca27f183/uuid_utils-0.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75d7411e8eb9259764dd60310738540649057cda4509b4af14b36b7f663bfeb0", size = 350657, upload-time = "2026-07-09T13:48:17.273Z" }, - { url = "https://files.pythonhosted.org/packages/95/f4/f32ea82a89efed2eafee2f1d925d64687a81e550a9951933fb1b75c95ca6/uuid_utils-0.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1019476b6bdc047216ef7414be5babe0fa5ccfde977c0cac4fd6c75ddec66ff7", size = 500613, upload-time = "2026-07-09T13:48:18.459Z" }, - { url = "https://files.pythonhosted.org/packages/f4/5c/c7b73ec4bbe28db162a4841d352c6eda582801e0dd9fe72f6ad5cc584ee4/uuid_utils-0.17.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:04452640d8b6920c480c16e5afe91ff896d236e0c972830f9247e0898d38c803", size = 606306, upload-time = "2026-07-09T13:48:19.726Z" }, - { url = "https://files.pythonhosted.org/packages/63/95/8a2777204e8691b4961e6aa619001c3e5175aa430ab43da3079142e8d310/uuid_utils-0.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:793229621e1ad6cac55f015cfa9f4eff102accbc3da25d607b91c6b0bec167fb", size = 567231, upload-time = "2026-07-09T13:48:21.024Z" }, - { url = "https://files.pythonhosted.org/packages/1a/6f/1d778ca3ed6d2cf35f22088e2de714675416747ab41be510f22c141043a7/uuid_utils-0.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03815cea572c8a693cab5475b9d750cc161470961c7defa27e9286cad62f38f5", size = 529373, upload-time = "2026-07-09T13:48:22.312Z" }, - { url = "https://files.pythonhosted.org/packages/6e/d3/9ad1ab64b3bed0a0237d1db89dc6f5001d6116a82766753da4ac4496f979/uuid_utils-0.17.0-cp311-cp311-win32.whl", hash = "sha256:c4f845166b09acc65c5213a35551a7f81c17fa010ab467229b5813f79d17fe13", size = 169930, upload-time = "2026-07-09T13:48:23.504Z" }, - { url = "https://files.pythonhosted.org/packages/c2/1a/e01417f52eae6e2cb412260bb332b4ee4b37af2982d9c38cff4b68b2e899/uuid_utils-0.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:14dc2f46abb1091260c0d203fcbdf4e045042cc07e49183fd3b255904b95eb70", size = 177242, upload-time = "2026-07-09T13:48:24.723Z" }, - { url = "https://files.pythonhosted.org/packages/35/20/396c27f996add19f8ac31e49cc4570824e51a97719087dabf94694d25bc4/uuid_utils-0.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:29179ffb7b317239b6d6afb100d14c439c728770460718280b9c0a42d2561ec2", size = 177023, upload-time = "2026-07-09T13:48:25.834Z" }, - { url = "https://files.pythonhosted.org/packages/20/80/a7e685968e3cec99d6fe2fb25d0f5726310e1bba356da68c13dfd8b7d140/uuid_utils-0.17.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9205068badf453d2f0821fd5d340389b4679992d7ff79d4f3e5608996dd1b287", size = 556403, upload-time = "2026-07-09T13:48:27.022Z" }, - { url = "https://files.pythonhosted.org/packages/56/47/3102d93bcb7b0bfe6bede63ff8f221a7f91348e10a37f682773be27c56d9/uuid_utils-0.17.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0fcca4e838af9ac9243b3358d7c14afa4dca286a87781124c272d6c4cad9c968", size = 285608, upload-time = "2026-07-09T13:48:28.769Z" }, - { url = "https://files.pythonhosted.org/packages/55/fb/d59695f0f8db065b93c63316eaafa05a22d75a0486978a33736c52c646d5/uuid_utils-0.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f3729e839209f3457d0d8b6a35a376fdf65577a5aecaf4cc3587d3305759ba6", size = 319926, upload-time = "2026-07-09T13:48:29.965Z" }, - { url = "https://files.pythonhosted.org/packages/5a/03/62fabcd1e990e07a0e220e8d552af45bc16f107fa8e55c2014a706bb1a1e/uuid_utils-0.17.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3dac0ad0cd9a2818d1775215365a4e8c2f8ada215529dd26f3f8cceeb67a6988", size = 327172, upload-time = "2026-07-09T13:48:31.187Z" }, - { url = "https://files.pythonhosted.org/packages/d9/37/a5081391338b459e2f8d8b12581f00f8caa6317fab510e0e85c18c59e938/uuid_utils-0.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e671b2322ef09106ecb1ca0f4c398b134d5e2c1f80d7a4f3336847a3072c0e94", size = 439075, upload-time = "2026-07-09T13:48:32.295Z" }, - { url = "https://files.pythonhosted.org/packages/59/30/91795bd01e17a13661280d4899fbf38fb05e3f38e873f9aaec106ec30aa0/uuid_utils-0.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8eb3e5caca8d3a6f72ea4cce024583f989f6f2e9186f98800213fff0176e8bcc", size = 320247, upload-time = "2026-07-09T13:48:33.64Z" }, - { url = "https://files.pythonhosted.org/packages/e5/11/09102b78303e4eb62069d6d88ef9fd661dc523e8f429e1fd67eaa78a6f44/uuid_utils-0.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b72c2002202038666bf647f9a790906214c7c11cd0d6efef77b7d07bef3034a", size = 344738, upload-time = "2026-07-09T13:48:34.786Z" }, - { url = "https://files.pythonhosted.org/packages/74/f9/be95bad6954b60328878c3800258f01a6accd24fd75112d13f023462d53f/uuid_utils-0.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e2ac1c0b56f2c91b6f158e29ed96b1503223fe8aa6e79b1be1dc55bd8a5131c", size = 496845, upload-time = "2026-07-09T13:48:36.057Z" }, - { url = "https://files.pythonhosted.org/packages/2d/02/8a19a34e0530d987488a068a71576a236f5c8c746630b870b57f71eb24ef/uuid_utils-0.17.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6c142bd0cb4dba31c10babe00d59f7ef6460f0ef55eaa9c1a9da270684af996a", size = 603233, upload-time = "2026-07-09T13:48:37.512Z" }, - { url = "https://files.pythonhosted.org/packages/f4/a8/b1abab36ff73b0248d82179816467f6d39a2e80fd64329a895ca94f3508e/uuid_utils-0.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e252db239eb41c32248e096e0d170bce5896a4fd3405556362bc3dd83d912206", size = 561401, upload-time = "2026-07-09T13:48:38.977Z" }, - { url = "https://files.pythonhosted.org/packages/61/91/70e7b528b351cc03a9ca43e6116371cdde31bb12bcead7ca2ca1367366cc/uuid_utils-0.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:237722b6581bb5b4eb4cefbcbe5c6e2980a440aabe781fbe50ebf1cb71eee4cc", size = 525314, upload-time = "2026-07-09T13:48:40.599Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f6/9167e90cf9937d6558f92d022ff3024a69d938a514d9c8faa4080f73b001/uuid_utils-0.17.0-cp312-cp312-win32.whl", hash = "sha256:46a73cacdf512f473a81f65dbf84186e08cfe6e9118fa582b6c6b33a8288a30d", size = 166831, upload-time = "2026-07-09T13:48:41.862Z" }, - { url = "https://files.pythonhosted.org/packages/5c/7d/0b889654d9ee3413f810cf4685e241285f650d98a4103ac9f3c6bcc95f29/uuid_utils-0.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:e59b60a0a4cb7541480e02090d37dc2df3b72df4c2e776fff64ce3a4e3dd4637", size = 172944, upload-time = "2026-07-09T13:48:42.992Z" }, - { url = "https://files.pythonhosted.org/packages/be/35/8c6e1bf65e4d400352885dadc656ad6d0af96e89231e3f04686bc2197128/uuid_utils-0.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:d561a4c5747a1e6c7fa7c49a0292e78b4e8c456332caa084fc7abad8de828652", size = 172459, upload-time = "2026-07-09T13:48:44.271Z" }, - { url = "https://files.pythonhosted.org/packages/d2/dd/614fb9912157ac0128e6050859ccf06d9f13df9a944a803e8f80f6157e38/uuid_utils-0.17.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d11a7bc1e02da8984d32e6de9e0826c6edac00eac17de270f372bf32f9a0af63", size = 557259, upload-time = "2026-07-09T13:48:45.664Z" }, - { url = "https://files.pythonhosted.org/packages/3e/11/d072711704de3d21bec08b6c2f36a215200ca1d5e01a390ea1ac434080a0/uuid_utils-0.17.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7a49f47ac26df3e431c56b825c1bae8e6d3d591fdbb7438c227cc9845a7e3d73", size = 286271, upload-time = "2026-07-09T13:48:47.018Z" }, - { url = "https://files.pythonhosted.org/packages/18/6d/8a63e5eb2d5a6ba69a6c2036e305075bd6f5a022e7ea25fc6ce0eb7c51d2/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32df1944808877702ceea398c103881c09a679bb672a215e01c2a84231266bf9", size = 320025, upload-time = "2026-07-09T13:48:48.208Z" }, - { url = "https://files.pythonhosted.org/packages/f7/2d/bdc2caf9719d9090d7c46043242ae6136cba4f7a7ee384992ab905ad9aa1/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98c88d3edd08e7245562e9815996dbc6f0bd4745e1c76462f24af5ae4e187dd1", size = 327931, upload-time = "2026-07-09T13:48:49.673Z" }, - { url = "https://files.pythonhosted.org/packages/b6/33/9219d09d51ead282b578b2a4e0a515c2cce3ec52076cada8bfb7e35727d5/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a4370089c8b2e42f1db51d76408c7fa8eaa2934bf854d17983d16179c07c098", size = 438537, upload-time = "2026-07-09T13:48:50.842Z" }, - { url = "https://files.pythonhosted.org/packages/d8/79/e8e0f8b3955f2081c116157119d87659937893242eb834aa170da04d660b/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09a55b7a5ae764985cb46467496a1787678d0a1400356157a080ad95b1a36869", size = 320656, upload-time = "2026-07-09T13:48:52.164Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5e/d1ceddc430ff04b6e21704b2030d4438074a2f478b265dab43da957791c1/uuid_utils-0.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56aa6488b931246fae11924e4bd0e2b32677e63945eecb71c29e3c2ca0dc3131", size = 345310, upload-time = "2026-07-09T13:48:54.076Z" }, - { url = "https://files.pythonhosted.org/packages/d5/62/89438e12f389a843e626b7e37691319a057b3d6b80914609106891faadda/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:309a35f12d99dde19032bc2259cda6431c85eeac0879134dc777cc3087d7e1cb", size = 496771, upload-time = "2026-07-09T13:48:55.365Z" }, - { url = "https://files.pythonhosted.org/packages/87/d2/eedcd99f522d60e238ead03844f0d51743ba84d33044959e230b756bf212/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:21c79b61ff750abcf057163dd764ccb6196cde7a26cda1b31b45cd97769e03b3", size = 603631, upload-time = "2026-07-09T13:48:56.746Z" }, - { url = "https://files.pythonhosted.org/packages/0e/a8/bb1b38aaddd7243b6e562c6694f499bf094800918316192fd8cb2cdc2620/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4134353bfe3026ddab8e886002dc52bc5a0ab04611aabb0eaae23c32e6e57f64", size = 562008, upload-time = "2026-07-09T13:48:58.241Z" }, - { url = "https://files.pythonhosted.org/packages/b4/77/5f7ed930dc105e293845c09e4d5bd84076318a12f45a46783e1af64906d7/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7c89359affecebe2e39e6a116d069b363c936511a9572b308402489a26957d89", size = 525527, upload-time = "2026-07-09T13:48:59.784Z" }, - { url = "https://files.pythonhosted.org/packages/fd/25/1b55697adf6811a6f92cff6340e6b03e31fd6bc51066a5c10698c29b3679/uuid_utils-0.17.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:6a019a31bc4db89a0903a3e4f6b218571f3a6ff0ad4b3d3fe1c8f91a05ff6e3e", size = 97965, upload-time = "2026-07-09T13:49:01.217Z" }, - { url = "https://files.pythonhosted.org/packages/26/bf/cd729343de4684230be8a966bad7bfc2cf10ce3e643b1189a8b5370dbe35/uuid_utils-0.17.0-cp313-cp313-win32.whl", hash = "sha256:b3131a82d0c7611f0aa480a6d36929e001a3f54ba0fc029a8118a5863cce513c", size = 167316, upload-time = "2026-07-09T13:49:02.354Z" }, - { url = "https://files.pythonhosted.org/packages/76/f0/e602ae0a1b139a7826e5189b93d91902564def06d5006324fd2faf82c8fc/uuid_utils-0.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:9e311f908d2f842fca4c7dcebc4f10306b8089b204ef04cf6704b4332c9ff6ff", size = 173630, upload-time = "2026-07-09T13:49:03.529Z" }, - { url = "https://files.pythonhosted.org/packages/1a/52/024ebece265b387154115dc4f1d9727174ef82623069f4bec8b7ed7e73f7/uuid_utils-0.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:c351737e2e65497c7200ab4ffb8af97e9f48be6488309abdd265fe08d66ee92f", size = 173214, upload-time = "2026-07-09T13:49:04.836Z" }, - { url = "https://files.pythonhosted.org/packages/56/44/e2fd3fdf356e1b55d2acf1b956b4f3f29ffb215a99c387eba04b1c5fba66/uuid_utils-0.17.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:673d89cc434cc9b97a0b4cf61272f6fca70a81f64eb0afbface2a0d9f77f06cd", size = 562232, upload-time = "2026-07-09T13:49:06.201Z" }, - { url = "https://files.pythonhosted.org/packages/19/28/65e0980d668a6d44e699f59d1acf43d6b5d4893592c115ce7c680bb4dfa1/uuid_utils-0.17.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:387cf7437c94ddec08651a0f1081381299c7075bc48a6251d8922bf39973378a", size = 287858, upload-time = "2026-07-09T13:49:07.45Z" }, - { url = "https://files.pythonhosted.org/packages/8f/8d/5e97bcebc90fb6a10f98af3dc1ba552e04183aba59e2edc0b9cf486dd998/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:220b52746d99e11964badac3c0869016e0c24bafb70a7dd5c2c072a6be3da9cc", size = 321587, upload-time = "2026-07-09T13:49:09.489Z" }, - { url = "https://files.pythonhosted.org/packages/8b/d7/88b2a2370cc3d455ba0515fb6f5c8f7ac0c0f55a86801b6e56a432f22c17/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0ab4a66e7a035ad6625cfc1fbdb34f5c2d25a80ae1ef4bfee458ea2036333c6d", size = 328964, upload-time = "2026-07-09T13:49:11.292Z" }, - { url = "https://files.pythonhosted.org/packages/bd/0f/181c5da673953dfc0958cb4fb3a4984a9098673ddb05cac68e994bc8511b/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5641071337eb11d61a001ea08793bf72216f3241f0a433ed2764804b2a3e3cc7", size = 442909, upload-time = "2026-07-09T13:49:12.644Z" }, - { url = "https://files.pythonhosted.org/packages/ec/38/5c5e665af542884a8fd3c61725c38453239e13940326b5b70f3ef8881a97/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9082e709014946b1f6e96ae6ecd93652efca2d2a6a3ab67dbe151c8b4bf193a4", size = 323076, upload-time = "2026-07-09T13:49:13.897Z" }, - { url = "https://files.pythonhosted.org/packages/f5/35/7de97de18cbf226c2a4f2104ad15e56ca4491717c81c0b71795c0c585b4e/uuid_utils-0.17.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1fd6f0e8a162dc0e9255b6aebe3cd175e76c33202f1bf39da9e6294b93db0099", size = 347360, upload-time = "2026-07-09T13:49:15.237Z" }, - { url = "https://files.pythonhosted.org/packages/26/a1/9915d5dd59fdd1957ded5d188c0ea0b9db5a1d84d42c8d8828a7b83b366e/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d63010803d7c368963bbe6f7ec379593e76dd581d7db0f29118d88713c9e0354", size = 499267, upload-time = "2026-07-09T13:49:16.774Z" }, - { url = "https://files.pythonhosted.org/packages/c0/05/88108405262ec850cea0f95733445d6873e5772af3292baabd9ef8457740/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a46bedc273b6f58f11dee816ff74999625ef8d007890f411b7a4975bf1c89330", size = 604940, upload-time = "2026-07-09T13:49:18.147Z" }, - { url = "https://files.pythonhosted.org/packages/89/d5/6dbcd300de47cc443cff2656cd5327a385751213dcb2101cfee7388170b2/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:405233a5f625b3d995648f4647fa6befa4567cf3f74e1f6b9837e16f7310f0e0", size = 564172, upload-time = "2026-07-09T13:49:19.593Z" }, - { url = "https://files.pythonhosted.org/packages/ab/94/e8057f2288a415fba8a978bca4b589f5cb6b91a028a5dc07a1775938b33f/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6c5d2d71e1f17329150ad9427d27f4a3f29a01792e7ecdc64a98ac5368fc4d5", size = 528533, upload-time = "2026-07-09T13:49:21.075Z" }, - { url = "https://files.pythonhosted.org/packages/f0/6b/31713148c77e48e62f51aa042a98a54a8be0396912ea5130f83f52ae722d/uuid_utils-0.17.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f7e9b8728ba07a3cb2f29d5aa1a266c2664eb8ef0fd43afa34627c92f7fac8f0", size = 99197, upload-time = "2026-07-09T13:49:22.351Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f3/ca6f6ac5428312df8ed632f6dd9f9e6aba23090471fcdeae53eab027e8b3/uuid_utils-0.17.0-cp314-cp314-win32.whl", hash = "sha256:58838921e377791ef22c64cc92141bfae030f43651ff9272f0f28a208a9e6a5a", size = 169540, upload-time = "2026-07-09T13:49:23.563Z" }, - { url = "https://files.pythonhosted.org/packages/c6/cd/7ede0db66411fa09817d79b680f7454ea9bee2d374e1922e4efd065760a3/uuid_utils-0.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:42275ebd0e8e74e32cdbfb8bd88fc99576567d51d54a508020611fd8f4f463a0", size = 175984, upload-time = "2026-07-09T13:49:24.703Z" }, - { url = "https://files.pythonhosted.org/packages/f0/81/533b5f80cd4918c0693f4e1b7b90ceb1caa45f4266ae8b528135d7ecca5d/uuid_utils-0.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:b5d11cccba076a32321ef1380dea956821f0b51794ef59df64e58fb1cd543aae", size = 174749, upload-time = "2026-07-09T13:49:25.886Z" }, - { url = "https://files.pythonhosted.org/packages/a0/13/f400ac39d06fd8be5b099c09e41bb975205926722a3e8d53348817cb7ff9/uuid_utils-0.17.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fae8b282f0cb22a5de222999f7723f4e5ec04f6fcdf4aaef879b5b36625ae2b0", size = 562610, upload-time = "2026-07-09T13:49:27.374Z" }, - { url = "https://files.pythonhosted.org/packages/03/8c/c71c8312304c56f6d0bcba87cd402fa79bec35d18ffc8c41954196ca68e5/uuid_utils-0.17.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:967955620df45e6cffe2e9950cb9903cb455649396f896b26b04363a91a5054b", size = 289473, upload-time = "2026-07-09T13:49:28.989Z" }, - { url = "https://files.pythonhosted.org/packages/bb/cd/522117e2e5184ca1d4f0f85ee833e9e21bd8c6b99eff8a4d1a8e5a194e33/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375cde148430d60a4a07c03abaa0774c4fddfdd90de99b4ba02f24088bc9d750", size = 321600, upload-time = "2026-07-09T13:49:30.4Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f4/0d81f9bd346fc717bc561c08fa6457e0328966eb76e536b938fe77d56459/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:975c17da26c5b9d46c336b03c52a057ac28378d6f9d98b58d32a038589bb3912", size = 329569, upload-time = "2026-07-09T13:49:31.732Z" }, - { url = "https://files.pythonhosted.org/packages/5e/41/26e1363f36a94c9e8ec2dd21d5f63088d3e7c723adbb12dcc8fdc77be417/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3150d836290c88f1d26eb59c4db280d87417dd3bfaadd2889c77416c8f0ff6fa", size = 442051, upload-time = "2026-07-09T13:49:33.024Z" }, - { url = "https://files.pythonhosted.org/packages/2b/a7/2c1ed1b34d7df7fdcc11c28fd26d94d44843b37d9af2435ff9fd8abdbc08/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9472a8de37faf8bd216c628e0e68c8f6bef730d3ba0a5060f3b0fa460c992ac2", size = 324372, upload-time = "2026-07-09T13:49:34.554Z" }, - { url = "https://files.pythonhosted.org/packages/78/bf/328d3c6bb22c496944a1b3b732207d71aa6964eb604e5e3b9dcb91ed0a00/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d27c531edb8d1f38ca2eddaa1fa24913a460aeb721f2efd4ef42a124ce94e354", size = 348548, upload-time = "2026-07-09T13:49:35.898Z" }, - { url = "https://files.pythonhosted.org/packages/3e/76/a07de5cb7b90582fdbbc830fd19be129cbbb9897cfe239fef469d7bd2d09/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5670c52a438e21483ce715776144914a4e2a2a5c62d9dee15f8a3e90cf128ae6", size = 498985, upload-time = "2026-07-09T13:49:37.142Z" }, - { url = "https://files.pythonhosted.org/packages/f4/62/9966e46ae34fcec6b06119631fb3c09705ea78835035ce3a82d3348eb61a/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:6f29689a76fe7a49cbd629a794d0ec1eab48814e323a00a146a741b0195bde68", size = 605183, upload-time = "2026-07-09T13:49:38.648Z" }, - { url = "https://files.pythonhosted.org/packages/d7/4e/bb962ba0fe31e903b199f22cf4c1a6cba35a8987aef526d287277ab8ca8b/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4441600447d340ae103a353f01dbcd22ff680e5ee1a22988efe8d7b791d8fdb3", size = 565412, upload-time = "2026-07-09T13:49:40.115Z" }, - { url = "https://files.pythonhosted.org/packages/ce/9e/122adfeeeae8a84ccfd43bce627b104d12a2180a93bffd2c0e1b54dad7a6/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b04935a79c03c41ad08d0a5f390aac968bfb561f1268897bc5b0f077971efd", size = 529885, upload-time = "2026-07-09T13:49:41.513Z" }, - { url = "https://files.pythonhosted.org/packages/b3/4f/257304dded339dc35fc9bf35722ac68fd4fdb930f255b8f7bccdf74ebba9/uuid_utils-0.17.0-cp314-cp314t-win32.whl", hash = "sha256:239d8a281fe10bae33205b5d43185834d556b18434e0a113b5dc1dfb2fd97e91", size = 169472, upload-time = "2026-07-09T13:49:42.871Z" }, - { url = "https://files.pythonhosted.org/packages/35/c8/e78c06db7e9ce317ce7b8759ff2058333eac75caa8c22b75f0059589c9be/uuid_utils-0.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e288a06cbbbcd01b44386e767985c9e21d2ad9bf59829aa7058d9a2a494804ab", size = 176271, upload-time = "2026-07-09T13:49:44.105Z" }, - { url = "https://files.pythonhosted.org/packages/a7/11/bd1c70e1ad3301163cebe66c8d26de26e6814d52f642a849448bd2833626/uuid_utils-0.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1776a80d16369999b21627028cc5dbce819be83e1e079fdd7a51b587d2916db9", size = 175004, upload-time = "2026-07-09T13:49:45.591Z" }, - { url = "https://files.pythonhosted.org/packages/ee/14/4ae708968b15cac7b68d5b854bfce724b21faa1c7a5147fb96d87f468a45/uuid_utils-0.17.0-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7b9044ce4acbf392d4b3a503fe377641f4deff82e6c341c36ef27af0dea76cdf", size = 567823, upload-time = "2026-07-09T13:49:46.902Z" }, - { url = "https://files.pythonhosted.org/packages/4c/e2/d3af9c3d1dc6efb9ee1cffab30f3f2aacacc3892b21b495d78d34c6696bc/uuid_utils-0.17.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a91c4814c7150a4d798da691b7804eacd78c4b84fb392a60fa0de21341861eb", size = 288763, upload-time = "2026-07-09T13:49:48.491Z" }, - { url = "https://files.pythonhosted.org/packages/bc/c2/f1b183e412387529893015a94a8447633c665f6d0392de20e245680e636a/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd4a21baaac9a88486f0dd166c5793feb101a0bb9f006f2c401657fff5a1343", size = 324919, upload-time = "2026-07-09T13:49:49.972Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3c/d32c799bdd51f3b08b6ee95f9de921b59c69075a96767f937fab55014813/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32abaafc8e91928b3d9f4d82e42d2094041e38ad6bb964066faadff28e4162f1", size = 332689, upload-time = "2026-07-09T13:49:51.402Z" }, - { url = "https://files.pythonhosted.org/packages/6f/90/b4cd455619ff276dc3c3262a7420ead63aa1e531362f00df4cdb07d90e0a/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd741c73440b328f937dc53b344ecadc46bc4f0cec0333a8f42b55f3468ce7ec", size = 445726, upload-time = "2026-07-09T13:49:52.757Z" }, - { url = "https://files.pythonhosted.org/packages/e2/f1/5cc042a37932aa9a66eb8ab4a9a5b31d80261ae4565ff0193d8cc1fb9392/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89a0980d49683c00539c59cd9f46b1908c538e6b5b0a48ad12187bb856d0f391", size = 325610, upload-time = "2026-07-09T13:49:54.191Z" }, - { url = "https://files.pythonhosted.org/packages/5e/72/9e800c41d766484484e97845a7a7f677ba94462df86c97183e0290229d16/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:de1064663aa7c839286488a319d2b3b478ca5ab5b2091ade888ed0eeca11a98a", size = 352672, upload-time = "2026-07-09T13:49:55.748Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8e/86ce2c03a1d9674530f6649e49067f7c69929600127077731de590d12132/uuid_utils-0.17.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2db386941cfdecdd0b5a8ceeed5cf7479c83d1730dcf64a48d43cfa018cc3310", size = 178681, upload-time = "2026-07-09T13:49:57.096Z" }, +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/80/cf6934a2030a5f6763f604314c1105f851d90aa1fe344c2692c3b88a9d95/uuid_utils-0.17.1.tar.gz", hash = "sha256:10c51d54ecdf0617640e505eae6d2e6443d8e414d4f9d6e8d43949a450c56e6b", size = 43323, upload-time = "2026-09-08T11:29:35.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/af/bfe6e67693597361a65daaa37029c489b24e3302c2f7a676e8e5b0eb20ac/uuid_utils-0.17.1-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:53abc29fcfa4cdbf53988409f297fce76a8de6ad292115f5e48ff5e9e3606d79", size = 563706, upload-time = "2026-09-08T11:27:33.172Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8d/a367d0eefe3730763ba22bf4b966a94106328cfd01980844c7fb8a6a7082/uuid_utils-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ee8dbeb24fa796f091658d5692c0e00f0d524db25e1f7a816933e80b6cd3883c", size = 287312, upload-time = "2026-09-08T11:27:34.794Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f7/f085bedf0601e7a3aca57748059f96ae118c41a4615cfc0142f291bde481/uuid_utils-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b3cccf71cbe4c1fe29eb007005cde2f86fda2549a5f412e27ee8579a264d27", size = 325354, upload-time = "2026-09-08T11:27:36.21Z" }, + { url = "https://files.pythonhosted.org/packages/f0/cd/a8c8c93aa533173a2078496b58ade7233fcca124fb77c68fd9053fe59f76/uuid_utils-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3aae364b97bed00db4549784ab5ba769a7b88d0ceea87adb833501624fe16ed", size = 332982, upload-time = "2026-09-08T11:27:37.467Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c6/e6eb694ffa73d627ec7c4c750f2e83506c6671898c2cbc5a3592f4366f7d/uuid_utils-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5141fc9cfc98d3802d6f1c2451e6822bf1d474c9beba7cba0a6fee7643dee46f", size = 449247, upload-time = "2026-09-08T11:27:38.833Z" }, + { url = "https://files.pythonhosted.org/packages/76/6b/516183ba5f7d35521edf8cfaea9b1192da8b262587faa8106d1f73ab0eb1/uuid_utils-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66f695b0950a630ce5f287d6d17acd1523e0e071863596bed73a7d11b8334a28", size = 327796, upload-time = "2026-09-08T11:27:40.061Z" }, + { url = "https://files.pythonhosted.org/packages/61/cf/656e7426b31c9cdf9205797a80f3d0458da061df91f083e4490504e0428a/uuid_utils-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7db3135ee5c1e9bbfd4d11cb2e3f2b4c26c37cb1f7b7d52407dbe94dddaec7e", size = 351941, upload-time = "2026-09-08T11:27:41.31Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a2/ab5082c9d0b1d2b8b32ac2556cb7b1d5c73d316fe59934bf2b3545134844/uuid_utils-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b6e71cff84184aa6071fdcc45e288e0f45d663a4cf5608fb9091b68c34bfd959", size = 503475, upload-time = "2026-09-08T11:27:42.609Z" }, + { url = "https://files.pythonhosted.org/packages/66/b7/3d011f832aad5fc2eaf6999f88a4fedbb0eee0fca6b94223e95b7c986a01/uuid_utils-0.17.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:548b33dddedefe5cd02e4ac421b7b3b3ad5411bdbd7f5b5f792d9e7ba288d894", size = 608768, upload-time = "2026-09-08T11:27:44.157Z" }, + { url = "https://files.pythonhosted.org/packages/0f/16/a89f6b38daef94ee8a1261f7941d7d9d2f70f2eb2b2157445c0e70a81302/uuid_utils-0.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dfd27f383ecf1559cc55b6ec39c850744abee56c0549b15149e20a8aa6b881f3", size = 568410, upload-time = "2026-09-08T11:27:45.546Z" }, + { url = "https://files.pythonhosted.org/packages/c4/32/a7d045221b08858fbdc66321f482b68017f421abdf085b82282bd3019d29/uuid_utils-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4edcb1c9e52805a7619d68f8f673544a3df09425e2426bcdc30d17a2bb152e0", size = 533150, upload-time = "2026-09-08T11:27:46.843Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c6/79d7c1ed7a872a1047df30650a8194865273e2f5b757c0e84f683ea640e5/uuid_utils-0.17.1-cp310-cp310-win32.whl", hash = "sha256:5e1b7aec35ee0dbb3875a3f151866f3362ef30ae5e7f95a42adf8779d305bb47", size = 172247, upload-time = "2026-09-08T11:27:48.173Z" }, + { url = "https://files.pythonhosted.org/packages/f2/24/d8b81080e0f21e29fe75545ea318985acb3e079c0aabedceded7424ae6c2/uuid_utils-0.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:f2e91fef913d654f643ba7e4f92347002aff0debeb84cccaf474912756b43a9c", size = 179050, upload-time = "2026-09-08T11:27:49.459Z" }, + { url = "https://files.pythonhosted.org/packages/f8/74/61cc613cf7c94131b2d1d596c4f2c0ec22c804b2852cc740288a1519743f/uuid_utils-0.17.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e698d0ffccf167ece87c864667ab69724685af9e171fc51e57038c9711fd4e0a", size = 562905, upload-time = "2026-09-08T11:27:50.715Z" }, + { url = "https://files.pythonhosted.org/packages/eb/4a/88413c15de714a76e342321d65ff82937a2bdcc35e2987c9462433025101/uuid_utils-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d9aa5fccd372580d455ab769a60326c789c46027d3d58ff2a895dbc492200b0d", size = 286703, upload-time = "2026-09-08T11:27:52.108Z" }, + { url = "https://files.pythonhosted.org/packages/23/4f/9cfd9f64ceab2b6aeff77cd238b0033baa6364832cc9715d13a8cd49e5ff/uuid_utils-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0cb9661bc0883e9278bc2436514298ace83121d14296cc672b2c44d37441cd0", size = 325258, upload-time = "2026-09-08T11:27:53.315Z" }, + { url = "https://files.pythonhosted.org/packages/42/eb/7057247670b903194c2739f98a0f4455f0d4e8cfa13466dde2d1fdba7216/uuid_utils-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f63557d6e9fe10cb25c1d3e73dbf7cd18c1b1620349b6be6b51ea25fcadf3a1e", size = 333013, upload-time = "2026-09-08T11:27:54.535Z" }, + { url = "https://files.pythonhosted.org/packages/6b/6d/8e26ef16da28274d3ddfe0812a7155dc8d48d0891abd84f2b1a3f905a54a/uuid_utils-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b94f1185f64d1fd2fa99ffc0b8264ee5980a862010daf1edf430412044f2aa53", size = 450348, upload-time = "2026-09-08T11:27:55.777Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8d/70d8f78830ca23f40d15f95795a863e7c052f5c1dff2e4a23f51c53dfbdc/uuid_utils-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3404d50a60ec74642fd590b9d639d98770022f4b1ff8a4055b3c70742c85f096", size = 327961, upload-time = "2026-09-08T11:27:57.098Z" }, + { url = "https://files.pythonhosted.org/packages/af/f2/62ab19bc908ef6cdb2a07966a408cf8bc2cf981cd7c3c99dc34f443b5ced/uuid_utils-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:601d03cce6b8ec3734025c7dca9ab276df1ab649ca7b13d76ea03824724f5108", size = 352645, upload-time = "2026-09-08T11:27:58.262Z" }, + { url = "https://files.pythonhosted.org/packages/7f/86/f8e62e055f14b45b6faa784008a038407f9274d36acc41d39b4b8b0f00a1/uuid_utils-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1a9e8c876a5d6247572e7f8eace39b4de9a91cd1b026e24552ec631c08c91394", size = 503128, upload-time = "2026-09-08T11:27:59.678Z" }, + { url = "https://files.pythonhosted.org/packages/04/57/4bc764249cc0d40568fb3a82a72b41cedf958a169710415148e365f45e1f/uuid_utils-0.17.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:304497d360e9ca5b019254bb25a2ee886b66de884aa08a949c8812fe5bf5327f", size = 608575, upload-time = "2026-09-08T11:28:01.01Z" }, + { url = "https://files.pythonhosted.org/packages/f7/90/947976eeaf48aa6109100af1796931b8c684caf680d0fb4d2498e951c059/uuid_utils-0.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7f3deaca1ba34f48da053884c1255c360fb123c4a9bc3815c05a7a8093e0bda5", size = 569118, upload-time = "2026-09-08T11:28:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fc/18154e589f0c84f85b99aee9406fdf904468190a4f4fe462d86bd85ab960/uuid_utils-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e22cf24db33a123c8e47a86fe766c770c83dedc6d1196c1172cbba0a0959cac0", size = 533401, upload-time = "2026-09-08T11:28:03.631Z" }, + { url = "https://files.pythonhosted.org/packages/7f/73/ef0bb542317ac03fc4e0e7e2804e316d84fee115c6a3ed41a6efa954b59b/uuid_utils-0.17.1-cp311-cp311-win32.whl", hash = "sha256:738b8fc2062c3dc17f1624af4aa8763bec4172cf295b13ffa3dfad3ddbdb4e0e", size = 172366, upload-time = "2026-09-08T11:28:04.977Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1f/c76187e05e0fdbb3f9fef7436f86326d0f0aa25b42192cddc011997b31a7/uuid_utils-0.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:297c6be22e0dd0f7d372845b171ffee5657581759982413c0a5b01b900c5f592", size = 178735, upload-time = "2026-09-08T11:28:06.215Z" }, + { url = "https://files.pythonhosted.org/packages/92/05/3d846d5423571574a1e6f4bbe16f57f755671d0f334931f893e8a734bbaa/uuid_utils-0.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:1c8124c9b91fa8353d79e4e7bd44ed0f2ae683990c01818199668f7579e236ab", size = 176492, upload-time = "2026-09-08T11:28:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/97/82/a509ef8b3c24b48099a4fba00f9e1b3f38417e0a7bda39cefd4b1e841388/uuid_utils-0.17.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7558c84414785d6ea54a186a3c68267eb8f33e2a0d792698bd9fa50d62150f77", size = 557142, upload-time = "2026-09-08T11:28:08.586Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/d48897c1bb6562c4b68a90c998f89d4eb8996d01193c930b3f6f04258619/uuid_utils-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4f04ba62482858a975d1d38cbb5ade181faae59e8ddc1499eacc9b6b6def3115", size = 287053, upload-time = "2026-09-08T11:28:10.12Z" }, + { url = "https://files.pythonhosted.org/packages/c0/9d/6506e6c4ca08300ad7415c3b76e29bd36b491dec818ea58d9e8bf88031d3/uuid_utils-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66ce3e84067261b2721dde6539427f4eb9286289769332ff07c859a661f87694", size = 320760, upload-time = "2026-09-08T11:28:11.3Z" }, + { url = "https://files.pythonhosted.org/packages/2c/dd/013786821eca0808282b82bb1e66a18a6b70061e1ce2f77fc9be06b88a36/uuid_utils-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cdcb565ac4d8a005833e7c389867977e19670f1bee6ee9f8811872b86225274", size = 329130, upload-time = "2026-09-08T11:28:12.522Z" }, + { url = "https://files.pythonhosted.org/packages/60/45/ba376e0a69eb4a0bb2dfba1ad2bafc2e6729971d480701cc778719a4205d/uuid_utils-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a93b046552730b843e9d8784691cf8b0b3d5430dd9d053ade33383ccb2574ff", size = 444047, upload-time = "2026-09-08T11:28:13.938Z" }, + { url = "https://files.pythonhosted.org/packages/02/1e/2abb7d9e3062a7889142818e2a2ae758a54a1c3b6cf8a86877e051b3d1dc/uuid_utils-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45f93f362d39f63ba14bbd9e4e1dd89fbed4de9bbef6bb428a379bd86571da2", size = 323927, upload-time = "2026-09-08T11:28:15.235Z" }, + { url = "https://files.pythonhosted.org/packages/20/00/c6753d6f2dbcd9d78436e291534b5d81f42c1b50c4d3224ddf231095fde2/uuid_utils-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d847fb9b46b5c208f3b8d5ca6082a4ac819ec2ffe36de3548c489e8fa551bd", size = 345877, upload-time = "2026-09-08T11:28:16.62Z" }, + { url = "https://files.pythonhosted.org/packages/c2/78/6f65d3105a0588b38cdcf338397bcb63c2d88d3581698a316def47e4445e/uuid_utils-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71f7ec7a1b54c1f84d6f8fd4e1110a66b3d1b936dbb17cda2927442621fc1e3d", size = 499635, upload-time = "2026-09-08T11:28:17.912Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5b/ff56d55fde9991c332e6df2ac1c560be6dd7e2302ab51180a185cfad830d/uuid_utils-0.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a140db8866a45b1ce40d91164ff48d2722ffc3b2a39bfdb412bd770c7ea88be3", size = 605502, upload-time = "2026-09-08T11:28:19.198Z" }, + { url = "https://files.pythonhosted.org/packages/09/16/d34f26cd4dad48671c7441fcf370076911dd9e7edcb3e5264e11da7fce7d/uuid_utils-0.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7b296b67bf880085daa11ee496d385b941a3bf3e3d5691db7178d21f18f56f9b", size = 563186, upload-time = "2026-09-08T11:28:20.684Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ef/b9bd9b412865c08e6769044cdda6e0a3db4827c88a4a2612e42e68714ca2/uuid_utils-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61378863a5e9410fa6e816364442b9d35cccf94fa83e3f67997d0ff57d901d0e", size = 528667, upload-time = "2026-09-08T11:28:21.984Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b6/981a84e9d0653e2d5fc205ba2b895d80c8e3bdb7138995f4c04b7cce8bd8/uuid_utils-0.17.1-cp312-cp312-win32.whl", hash = "sha256:a550b3963960012ff3266bdb3079abf4cc3f6363201e63a649d5d3cd44fe52cd", size = 169155, upload-time = "2026-09-08T11:28:23.427Z" }, + { url = "https://files.pythonhosted.org/packages/fb/49/85a39cef2de6948364d25f5e1452119e6a70ddb5a910eeac717f02c5eabf/uuid_utils-0.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:3d6ccaebaa3b2ff2e59d11d70c64e97ba572120162a00c25d6f8e5e0c1004b9a", size = 175220, upload-time = "2026-09-08T11:28:24.582Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f6/8c1c11bbf7cfa901c7c9621bcdcbb4bf432c5f20dce27e76a3ea29f0307a/uuid_utils-0.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:3ca89347a01ddac94727578369feacc0969d9fc033b2c17ff7919121ee441e2f", size = 172646, upload-time = "2026-09-08T11:28:25.723Z" }, + { url = "https://files.pythonhosted.org/packages/03/0d/4c2263a05e95dc11a5c9fad78ab9ac5f76a1f5aaabb545a39c6d34d2a07b/uuid_utils-0.17.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd8043ac6d81b3f3f0dff22247866292c819e0d5e54a5a3ad2223f86f88dbd97", size = 556923, upload-time = "2026-09-08T11:28:26.974Z" }, + { url = "https://files.pythonhosted.org/packages/9e/70/9f619e86af674b8055adb29e6ad95f1d2bdec02b9d7b654d01fb479ea9ac/uuid_utils-0.17.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:586a93993769873c389d38bd9a70c51e228e734e8f78742d959610509635b86b", size = 286572, upload-time = "2026-09-08T11:28:28.265Z" }, + { url = "https://files.pythonhosted.org/packages/1e/d2/bf4c39c283a75a8893d060344b690d5ff13ddd7e65849a74a264bec9a4ee/uuid_utils-0.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55e2cec52e2c78d94277d4c990badd3ce97f5746d05029e63d81fb2433bc9684", size = 321366, upload-time = "2026-09-08T11:28:29.464Z" }, + { url = "https://files.pythonhosted.org/packages/d3/a3/4790fd4d6322aeb935e2222d193407902b2651dbb5eae7817f2f8eb2043e/uuid_utils-0.17.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0721f05b4f10cc7d49d91be65524a3bc6e6a5d88be054cdca05dff487a022091", size = 329210, upload-time = "2026-09-08T11:28:30.738Z" }, + { url = "https://files.pythonhosted.org/packages/66/f9/442d13050fb55c2e4cc81369df349d60f2da8dde84ffb7e330385c576bc3/uuid_utils-0.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de996e58b77d3e6eeee1a209ce93f424a5f021aa8b2879df6d35eda601acc831", size = 441731, upload-time = "2026-09-08T11:28:31.966Z" }, + { url = "https://files.pythonhosted.org/packages/63/96/deded55ce54c5e6a2b7dbb790ab9bf7b5be8c7e8cb22e2355108bd8723cd/uuid_utils-0.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d9209d6fed20226af0d29b95c5e253a1907b61f1a00153187ac5412f1df9b6", size = 323874, upload-time = "2026-09-08T11:28:33.249Z" }, + { url = "https://files.pythonhosted.org/packages/0f/f8/4b9d64b57bf35e3e99a8e578ed1cbdcdf926816f36bf5e5b53d7ea4c65bb/uuid_utils-0.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4f6b05598d0d29e8851b7668786b7cf105c98887c7ca36dac94c61321d16cb1", size = 346026, upload-time = "2026-09-08T11:28:34.516Z" }, + { url = "https://files.pythonhosted.org/packages/e8/da/8912e887f5eeeb8f44f50f1aac4c16852644b558b1b29846b14463f9b739/uuid_utils-0.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f9f9f6835ab3163818156022c627eda60c38c874b369642b249b483384021743", size = 500023, upload-time = "2026-09-08T11:28:35.906Z" }, + { url = "https://files.pythonhosted.org/packages/73/0b/c15c3f5006c3f89818cbe796e73f9a1927867ec6b0c32e80cf30becefa67/uuid_utils-0.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:33fa18507488c4dbde9a3969b6483183d934dbf7a7d46aba90bd5d664d4c81ea", size = 605833, upload-time = "2026-09-08T11:28:37.11Z" }, + { url = "https://files.pythonhosted.org/packages/e3/db/1c64eedcc55f1ac01067c208bfe7fa17957521a73ab1701c04a866c33795/uuid_utils-0.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fa1a1c9a72ef9757176c069f7bd8014b7f4abf5f9930ec62b883dc864ba28092", size = 563310, upload-time = "2026-09-08T11:28:38.705Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ee/314fc4f908258714e92b0fc50bbf02cb49454db4857e9da42d40b8f3539b/uuid_utils-0.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd347022f67f7fbbd6939181ab076cd17a1d856e09a160eb87e245e692cc5742", size = 528539, upload-time = "2026-09-08T11:28:40.271Z" }, + { url = "https://files.pythonhosted.org/packages/2a/83/0e9e0bdd77bbf1fe5380267c14f197f8ac442ad5172000422f46f05953fa/uuid_utils-0.17.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:7e32ff7bd0fe4fdefce1d95f8f673a9b012286a7f40918ed1c08936d565aac4a", size = 98270, upload-time = "2026-09-08T11:28:41.575Z" }, + { url = "https://files.pythonhosted.org/packages/14/af/d2546a514432bb970da5a6550c4587ec8096ea90a2d2ea29aa55a1c35521/uuid_utils-0.17.1-cp313-cp313-win32.whl", hash = "sha256:a0a276738fafcfd63e6a0af944ffb8fb86448fe4cedcf574dd7df1ca13259e22", size = 168846, upload-time = "2026-09-08T11:28:42.669Z" }, + { url = "https://files.pythonhosted.org/packages/e4/84/46d45f14ebdf1ff4d9e6096dea5f31a706d7f71e99e48cde933b47a2e4db/uuid_utils-0.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:1cf7a837c3467f69ba3ef32caa43b1c5f5a462b7d960bcc59083459aed2b4202", size = 175479, upload-time = "2026-09-08T11:28:43.876Z" }, + { url = "https://files.pythonhosted.org/packages/58/42/558d83542ce270fdefe19a18e707e4fce58e64ed9d98658a2da78b9ac2b5/uuid_utils-0.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:7a9537e7afe2cd8851e636789124bcc26ff1d671906c5e56f6e8f293fa477ec2", size = 173287, upload-time = "2026-09-08T11:28:45.133Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/c735de118ef5c4a6ada1846699e65b3adcac92044e79b83345f90c792fe5/uuid_utils-0.17.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f974aa1097b0b8245d8f29550eaac3b431c891ba7c76cc4beaa6ec7bf8cd27b6", size = 561135, upload-time = "2026-09-08T11:28:46.387Z" }, + { url = "https://files.pythonhosted.org/packages/38/eb/c16f89b3c48eecef422448b9bde07994762cf21daa3351f4c49eab705d54/uuid_utils-0.17.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9700430eb701f18bd995787228c2202a15d9db335e8bf9c583df7eca5487d5ce", size = 289170, upload-time = "2026-09-08T11:28:47.735Z" }, + { url = "https://files.pythonhosted.org/packages/9e/05/5aec1389045f9e16afc1b8cce6414faeed40d44b3095f74d641c33ea1434/uuid_utils-0.17.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d030ce5d3cca0f2f55509035bcd33d39494c50dabb9d53dc0419ad212eb0fd7f", size = 323150, upload-time = "2026-09-08T11:28:49.064Z" }, + { url = "https://files.pythonhosted.org/packages/d8/56/8ad1da1ac6781f792e6e92cdb65bd242c5f5269e7c77de67edd704db61de/uuid_utils-0.17.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d365e0c916bd9a4b0b7f67f3305c6704c4ff44ff9da836faf455b8b5dce0399f", size = 331190, upload-time = "2026-09-08T11:28:50.478Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d7/49300453d84440d6b8f45c95d9fd249f7106f8283296c948842f6fa00fd3/uuid_utils-0.17.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e9f5e23998625f6dc005a3a30238b4006424e366cb2966ec465e0287ae2534f0", size = 447676, upload-time = "2026-09-08T11:28:51.646Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8f/db9fe5180418846bbc3273831468cead13e1de4956c73071fd1a4bde6ac0/uuid_utils-0.17.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71eabda671e055415ecfa8859364438a575eda84e6f43a513436977d9377b532", size = 325838, upload-time = "2026-09-08T11:28:53.008Z" }, + { url = "https://files.pythonhosted.org/packages/f9/00/efcac8905b87ffd76323d8e46594a68a0bde2c24c8e71f44ab7d5622dde6/uuid_utils-0.17.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed6821646e37f49683b3e977f856421c08eb9d03418423ac1477e09d2fb5cf62", size = 349881, upload-time = "2026-09-08T11:28:54.479Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/37352e939a3995775a6034023bda646aeacf73f238a82e46f012d6a7eee6/uuid_utils-0.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d8abfd2ed04af7df7b586621b11449a061b4b899f8b073e972b7282c89ae8335", size = 502043, upload-time = "2026-09-08T11:28:55.705Z" }, + { url = "https://files.pythonhosted.org/packages/f6/c2/9f7883a730cb0e0fce25487021590a1fd28d2840bf25022b33a81c800da9/uuid_utils-0.17.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8d31f5725c874a656fa1b7c8feb20b54b01ea70b200a9ff0568672ad3fc80b85", size = 607688, upload-time = "2026-09-08T11:28:57.026Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7f/6b121cfe00742f5884fb313321fddd23a17a2326a01a0e669810eaa36b2d/uuid_utils-0.17.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2ff6a84cf6a0a28e4a75c7b11f0d52464ddce4b7a0bfcf14c8de2e740299903d", size = 566366, upload-time = "2026-09-08T11:28:58.438Z" }, + { url = "https://files.pythonhosted.org/packages/36/64/e706ba987142e212f5af6a034ed98f9a0ec2543e1fdbb3b29b034271578e/uuid_utils-0.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7970905d66e55f9a52d0e694d306501e8a9468aa99da73867cc1f8eba2817261", size = 531140, upload-time = "2026-09-08T11:28:59.937Z" }, + { url = "https://files.pythonhosted.org/packages/5a/b2/7dfecd82aff24e02a6764ea88dbb7266a061bc7691d0180f01c6b1ea1efe/uuid_utils-0.17.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b2735d128a3732e528229fc24295530caa75e79d5ea7fb0f8690ef3114d9b262", size = 100062, upload-time = "2026-09-08T11:29:01.323Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8d/4840ac42764185be3fb7f7ae990c3f4bcf0b941a54ad6807e65cc312e9f7/uuid_utils-0.17.1-cp314-cp314-win32.whl", hash = "sha256:cc9da3c0d8208b53c28658340827505af437bff7a52a55fdaa262ccd4c5a5d87", size = 171234, upload-time = "2026-09-08T11:29:02.688Z" }, + { url = "https://files.pythonhosted.org/packages/90/c0/772c08a73cfc8810ff3144ed2e3701242568f83c7031b781d61bdcd74c29/uuid_utils-0.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:eee4a1df744434e10a0d0a679c074e3128b58328b83c99144e363db320e801f4", size = 177462, upload-time = "2026-09-08T11:29:03.81Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/9e3eb231cffab2df2029c4b6d015dabb077366d1194a8a0f2d4522d581ee/uuid_utils-0.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:c3955fc653dc78a93ecbd880bc97a0ef8010a9a748e6307f11ad005d45390ce5", size = 174745, upload-time = "2026-09-08T11:29:04.919Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3f/095e8eed10949c6ca1adde77d405268e88eeaf6e23a3968b29e549d0765e/uuid_utils-0.17.1-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0956a9422e132c8d4a3d808cc3d754fc8e81d34295a3a202b332c9dce064eda9", size = 562178, upload-time = "2026-09-08T11:29:06.231Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ad/5afb5a6fbedbce0bbd358855771c63ff233e7bad898eaaea9f9802fedef9/uuid_utils-0.17.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:691a9c16db041a8d5c55d6414398b0fc97e33aad41ad3aef67a6f3c0661dcde1", size = 289997, upload-time = "2026-09-08T11:29:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/9a/04/78edc758c4dbc84bd5ed8c40b6d7ee0dd879c6ff07320f347e371d84cffc/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf419a23bbeafed0fc8efb4ca5b3e0a8ea4ef4866de41c3393f888bfd5f60e15", size = 323144, upload-time = "2026-09-08T11:29:08.856Z" }, + { url = "https://files.pythonhosted.org/packages/d8/c7/8f27ea2c1e244c0edbaac5dc2a5cbbf51e298e54674faef03132f4468a1a/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:617acaeb2586e87c9bd0c2e192e4f1d33caacaeb7f3e0cc75972bc38e703e099", size = 330592, upload-time = "2026-09-08T11:29:10.107Z" }, + { url = "https://files.pythonhosted.org/packages/39/af/e7d7b372781627a6ea6ec2a2ee82f98e3fe7de7b6e4b050ae29a66fd64f8/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1fc79cd8a24bc6c553cd6f708f5ca08c4182914bdcc87192e1e468e9858add3", size = 446735, upload-time = "2026-09-08T11:29:11.334Z" }, + { url = "https://files.pythonhosted.org/packages/33/11/a2ef25dc4a3dcae5ddf8a7c2debc0d10719a991e327e43913605fd3b9c90/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce2f65e81429fcb145105a10c71bf2c71ac5cc9c8fc6c79ac3c13b9de091b2ef", size = 327402, upload-time = "2026-09-08T11:29:12.745Z" }, + { url = "https://files.pythonhosted.org/packages/4e/4b/61153f07eb7282d71a6ee10e3c05636a7d43cec6784bc6ea79979084e727/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e9ff97bf48606e5d817a01fdd4a4a8855b91382e384f524a960149da00adab5a", size = 348998, upload-time = "2026-09-08T11:29:13.976Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d2/b40991f80805d2cb3ace8c961752429e2e50d4ce0a3ed941c26a6250e3bd/uuid_utils-0.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:87d818e1fffc39476c7934544f54455ea04c6297fcd983598802e81c746338a0", size = 501745, upload-time = "2026-09-08T11:29:15.261Z" }, + { url = "https://files.pythonhosted.org/packages/38/84/f65e1963964b2b6fb7aa687dc819e5a39207dd9ecc7961cef82124fd3cbd/uuid_utils-0.17.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:764e4505821c20f1a45a54e9da076e6a97e4e46947159490aea893dc6b8d77be", size = 607104, upload-time = "2026-09-08T11:29:16.586Z" }, + { url = "https://files.pythonhosted.org/packages/84/3f/07c5ada40f360981ee069dbe6463a13dfa1de7eee73a6cb91f94d610821a/uuid_utils-0.17.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cddf08ed611c2ad1c791d4133dba2c63db4d294b2111e1db687537943cac25ae", size = 566012, upload-time = "2026-09-08T11:29:18Z" }, + { url = "https://files.pythonhosted.org/packages/52/6d/ede35c5e3e3787d2e9d5d3baddbc00f3f64e3f4522d53508757fbcfd6f47/uuid_utils-0.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bcf40ae13cf31727b84f00b1a505f1d4d10199bfea946c3554ef327702d2acca", size = 532218, upload-time = "2026-09-08T11:29:19.477Z" }, + { url = "https://files.pythonhosted.org/packages/97/a1/318e4bc7f04a505189233ec2409cce9e18cd5f52d06738a9e96f0eac3816/uuid_utils-0.17.1-cp314-cp314t-win32.whl", hash = "sha256:ce2fd8f8bc0026c0fc137cf5cce9de546ff9e0b4008be3eb21b5a06249eafec1", size = 171217, upload-time = "2026-09-08T11:29:20.984Z" }, + { url = "https://files.pythonhosted.org/packages/06/79/11811f97922be44ca900fc89e26b4dae173bd03ffd03672da7b28b023b29/uuid_utils-0.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:3dd5706a9874799013e82ac567425c535a0a4a7779c8551154915a4ba2fcb1c4", size = 177754, upload-time = "2026-09-08T11:29:22.227Z" }, + { url = "https://files.pythonhosted.org/packages/60/66/f56b2b497286f01ac2f6a1be8f825e871906d6aaf83dd4ad0cd7c8d54013/uuid_utils-0.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:a3cd9443d0a3b6f631e6352cb9d9c0a9b68d808d71250eb44e7b00265ec382f7", size = 174267, upload-time = "2026-09-08T11:29:23.447Z" }, + { url = "https://files.pythonhosted.org/packages/d8/23/81d75df583e3c7ff432b4f86014ae243fe7baa57d99919dc1292e9424724/uuid_utils-0.17.1-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:653bf91ec2d1c3b0f10157815ca58b0b572d15ce17ed0823aae08ff0df207fad", size = 566472, upload-time = "2026-09-08T11:29:24.726Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f3/71e7acaecfdbb5edd3cc7e13d0602f4566f16f35412edcc784569ff14733/uuid_utils-0.17.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ea207557393ead4084beb08f0e9c0c944ac2050678714b65ba979fae90cf782e", size = 288766, upload-time = "2026-09-08T11:29:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/52/62/1a94e2cf60ba38ef87f11cae3dd3b2787366229cc9a3f0ffc41fb89c9487/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5629c94f65249384314831ca0a95ca5f1dce5bcd5ee79600a5cd31d4f7d0f5f6", size = 326190, upload-time = "2026-09-08T11:29:27.666Z" }, + { url = "https://files.pythonhosted.org/packages/87/81/55b12664f7fb6a69a9d18ec8a8cac1a55fc60e0dca14046d6bb972fae2a8/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f85fddf2e5c4f7a30ebdc2b26ec585b9d814d807bcf285d248ae451ffee16a03", size = 334399, upload-time = "2026-09-08T11:29:29.023Z" }, + { url = "https://files.pythonhosted.org/packages/8d/64/844e5657be2b43ca2136ef4aa207420c1387e28cdbb90dcb395133ee63ca/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4adbea226bef0c619b33fa257113e36269a475b2c2049f55b8b83b4c6d507a9a", size = 450440, upload-time = "2026-09-08T11:29:30.334Z" }, + { url = "https://files.pythonhosted.org/packages/87/09/ab493c7598311f9bab4dc762d3483cb35cd78588c4d848c36fcda671f4f9/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ed203ff60932fe5b3a38453945bee4aa8dfb387789fd420698f607786ba42b8", size = 328684, upload-time = "2026-09-08T11:29:31.752Z" }, + { url = "https://files.pythonhosted.org/packages/4f/1d/8f2816d50d7a69416270a88f41f6820cde300719bac814989bb13e4c5ae6/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92e8df2bc6a33229c105ea90839d98576fcecc5cc86fdb1dd772ab10367b744b", size = 354290, upload-time = "2026-09-08T11:29:33.067Z" }, + { url = "https://files.pythonhosted.org/packages/18/e4/2bdff71a73c3d5dde6777815c910be7417fbc54f36206d0f7a1fb2f54522/uuid_utils-0.17.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6cca251f83d3ec2988fb7355b52c4b4fd2d96159f6f040e68f51af15fab49540", size = 180288, upload-time = "2026-09-08T11:29:34.24Z" }, ] [[package]] name = "uvicorn" -version = "0.51.0" +version = "0.53.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/65/b7c6c443ccc58678c91e1e973bbe2a878591538655d6e1d47f24ba1c51f3/uvicorn-0.51.0.tar.gz", hash = "sha256:f6f4b69b657c312f516dd2d268ab9ae6f254b11e4bac504f37b2ab58b24dd0b0", size = 94412, upload-time = "2026-07-08T10:59:05.962Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/ad/04bbb797c84fc1f26cb171f7394716f4865ffb8d8c5e1eef42565c2dfa6b/uvicorn-0.53.0.tar.gz", hash = "sha256:a9356f0cb89b3b8621529c5d5eebd69bfe154f4c3f68b4cf2de47e45fa855c2e", size = 110881, upload-time = "2026-09-14T07:44:23.815Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/ec/dbb7e5a6b91f86bfb9eb7d2988a2730907b6a729875b949c7f022e8b88fa/uvicorn-0.51.0-py3-none-any.whl", hash = "sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b", size = 73219, upload-time = "2026-07-08T10:59:04.44Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/0eea75741ee812e9f598b687619ce2454f6c3a1c5cd21ea990ec6bd26f45/uvicorn-0.53.0-py3-none-any.whl", hash = "sha256:e8dca71ec86dce5f04e333f0d56cdedf942446e6643b9cea1af0d6d3a02cb03e", size = 87081, upload-time = "2026-09-14T07:44:22.179Z" }, ] [[package]] @@ -5378,23 +5644,23 @@ wheels = [ [[package]] name = "wcmatch" -version = "11.0" +version = "11.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bracex", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/25/1da725838132221e33568973da484ff43813662ccc06ebf7f6e3abddfcd5/wcmatch-11.0.tar.gz", hash = "sha256:55d95c2447789712774b198ceec72939e88b5618f1f8f0a9b605bf7740b63b96", size = 141360, upload-time = "2026-07-10T05:50:24.183Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/43/30e407989e313677dbb9d5f045f966549a7254834571e342eaa4b55cc67b/wcmatch-11.0.1.tar.gz", hash = "sha256:1ea2b4fa678b8ca268253798d5963935df39132d47c3e241c0a0732224005e7d", size = 144662, upload-time = "2026-08-14T15:20:40.477Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/12/f38b6fee116274d7221743caab07d765032e1370bb54cad8714f87aeb0e8/wcmatch-11.0-py3-none-any.whl", hash = "sha256:3a5977ace27e075eef67eb03d539563f1a19018b62881949a42932cf66926934", size = 42914, upload-time = "2026-07-10T05:50:22.995Z" }, + { url = "https://files.pythonhosted.org/packages/ce/77/7a02b0f05b3ffcdbef9719ce3ee0b508d6a29b58e95299f1580055671db3/wcmatch-11.0.1-py3-none-any.whl", hash = "sha256:fd149ecddb9f0a88ea780017d6dde17c994e494e7f7303d4e3c9d6251f978f4b", size = 43449, upload-time = "2026-08-14T15:20:39.379Z" }, ] [[package]] name = "wcwidth" -version = "0.8.2" +version = "0.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/57/ed58088fafdf4c55a0ad6bde846502567645424d7ebf325230b9237f4085/wcwidth-0.8.3.tar.gz", hash = "sha256:d128512515fbf4612e0ff21fd6380399210318b7b54a9af59dff8454cf9730eb", size = 1458450, upload-time = "2026-08-28T18:10:06.875Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, + { url = "https://files.pythonhosted.org/packages/c4/0e/57f6bb3024a597b2e8ec4aee710ffe62ddc95af2e2bb1ee7a7abdc22c68c/wcwidth-0.8.3-py3-none-any.whl", hash = "sha256:d5b73dba6158a595ec9370350e7f2637bcac8d6c5e4fde34f30fcffb6103a5e4", size = 331669, upload-time = "2026-08-28T18:10:04.909Z" }, ] [[package]] @@ -5548,275 +5814,348 @@ wheels = [ [[package]] name = "xxhash" -version = "3.8.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/63/71aa56b151a1b28770037a61bd4e461c2619cfc8866a4fcaf1548605e325/xxhash-3.8.1.tar.gz", hash = "sha256:b0de4bf3aa66363552d52c6a89003c479911f12098cd48a53d44a0f7a25f7c46", size = 86223, upload-time = "2026-07-06T10:49:58.937Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/55/97/1a8cebf0a6650417f08a18231590e2515aacd5ce39c3ad8b9e013ebd437d/xxhash-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:27a9e475157f7315826118e3f3127909a0fe25f1b43d3d3be9c584f9d265f937", size = 34695, upload-time = "2026-07-06T10:43:40.248Z" }, - { url = "https://files.pythonhosted.org/packages/2f/cf/745b9bc0dd9c341bc074b5fc700db7bbef0f3b69ab21446492296ab37e50/xxhash-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b2ce44bf8f4a1d01f418b3110ff8dff32fd3f3e836c0e06333c3725f243fa6c", size = 32376, upload-time = "2026-07-06T10:43:41.97Z" }, - { url = "https://files.pythonhosted.org/packages/65/a4/8512a901b1d6ad4a9838d1b40385907a879d7e005a5afbec5d39526b69f6/xxhash-3.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:942bc86e9be6fdd6e1175048f5fe8f8fdaaf2309dd1323ef1e155a69cd346780", size = 217470, upload-time = "2026-07-06T10:43:43.572Z" }, - { url = "https://files.pythonhosted.org/packages/a0/ad/0ffd8094ea29579bb2dc42fa74d08570e9ea3d95db561e6b1105e69b9ca6/xxhash-3.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0204701e6d01f64254e0e5ff4255812b1febe027ddd7dda63372e27f98b5e91f", size = 237799, upload-time = "2026-07-06T10:43:45.248Z" }, - { url = "https://files.pythonhosted.org/packages/b3/90/783c6b3f9336bd07449fe672be32cef6833633936bbfda8d3b23ee18d202/xxhash-3.8.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7dc4bdf008f77c88d544849c48c1a40faf25a5eff6cc466de2e8edc37c191fce", size = 262587, upload-time = "2026-07-06T10:43:46.733Z" }, - { url = "https://files.pythonhosted.org/packages/c4/77/ba0316a7c3e661b86830a47ae4987798616ce1b15af8d2a6358e2d89ef60/xxhash-3.8.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c566b123dce7e4867ca518434cdfb9f84e5023771235b2e3107a26c9a41cbd8", size = 238484, upload-time = "2026-07-06T10:43:48.453Z" }, - { url = "https://files.pythonhosted.org/packages/09/79/33001037c1cba90f4ced38b257161c13452024c0db44208f883e2e47f3fc/xxhash-3.8.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9f23083e1bd9d901f844af7a126727c486e7eada9a1a6791c8f7e73f94fac656", size = 469909, upload-time = "2026-07-06T10:43:50.188Z" }, - { url = "https://files.pythonhosted.org/packages/45/90/237eded9dd6ae638083294e5a9f77b317aaebd480a330806b39c192a0de1/xxhash-3.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64af54dd1c3a45a27c04942f9a1a4683322bdd127f4745cca4e02549c1d2d2bb", size = 217166, upload-time = "2026-07-06T10:43:51.816Z" }, - { url = "https://files.pythonhosted.org/packages/0b/6a/8cb439dc9920e1468e1c2d69ef77cbeb4be3b1ae9f4b5344c07a2b59af18/xxhash-3.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8ea8a141eeced4f6262ab6dd71c681ac546a558c30bb586abe087d814b5f85ea", size = 307593, upload-time = "2026-07-06T10:43:53.436Z" }, - { url = "https://files.pythonhosted.org/packages/ec/c6/c0607d373c8affea92101a3926c4fc8b026bcf8983e05fd58f3a0380ebf8/xxhash-3.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a98b2f95cab589e0f5e92c48431afb4d56238b8bf6668edcc66166180e9b509b", size = 234702, upload-time = "2026-07-06T10:43:55.042Z" }, - { url = "https://files.pythonhosted.org/packages/5b/cb/f4cfd456624c1f017858168b7ba9443dad810da8aac779a612658450e827/xxhash-3.8.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1b86ae798a976ccbc1d02af6ccb98f5b4d24756b1f65e995f11d10fe071f486f", size = 265749, upload-time = "2026-07-06T10:43:56.749Z" }, - { url = "https://files.pythonhosted.org/packages/33/f3/9006669c04b01206e21b2177425c649461ba188930a052c2f1728d6ec6a8/xxhash-3.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81f4ed9ca9644bc95cd976bfe10f7a4cafab8ffdc3aed52877d4600e445be7ef", size = 221992, upload-time = "2026-07-06T10:43:58.12Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0b/7e6f3eaa05df5e0b6c94aa452b0672801f7031e602081f07fd441aaaaed5/xxhash-3.8.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:cb3fe820c27593f170770d6c8d791936cf6275d9269405fbb7b30a55363c10c8", size = 236899, upload-time = "2026-07-06T10:43:59.562Z" }, - { url = "https://files.pythonhosted.org/packages/da/cc/bbaee4987f3aab1d7b33bb430bb49e940646160af448b9167431c931126d/xxhash-3.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:7345007c12780985de4fd740148776d1eee18c0d41407c6fa1e48c5450304fe5", size = 297934, upload-time = "2026-07-06T10:44:01.132Z" }, - { url = "https://files.pythonhosted.org/packages/a7/97/6bee358660eb8b4f73c00b00b00bc616ebde00e1ab4b67c63486ce360648/xxhash-3.8.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:12eaeaa9ab8b9e6033a1fa5f6b338aaf55ff4df4bee11b59fd6ee03b19186ee4", size = 439315, upload-time = "2026-07-06T10:44:02.878Z" }, - { url = "https://files.pythonhosted.org/packages/c6/50/7e35275f39256bedace0c3cd5be3c72d4ac9d5aecf5e5fdc3530337cd263/xxhash-3.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2a845687219ba3214126f14a8a5861f97c9e065a7d0b8252adb6df13eea86fb", size = 214038, upload-time = "2026-07-06T10:44:04.504Z" }, - { url = "https://files.pythonhosted.org/packages/59/2d/69d02d096ee50bdf3ef0d208d874f52c71b1aa6906066bce3c52fedb8bc6/xxhash-3.8.1-cp310-cp310-win32.whl", hash = "sha256:656256c9f9303e47f07d5cb8ae4468285370adfafd7ba48aea33a458e7697626", size = 31939, upload-time = "2026-07-06T10:44:06.213Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1d/e06fca9844919ca91c6587d530cfa1e745830ec73ad38f44f04b25d1bfb7/xxhash-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:27cfc2f1ed76f956f36dfe0c56e5f5a3e94cd91eb78b893f63e2ef2ae404fcdf", size = 32729, upload-time = "2026-07-06T10:44:07.621Z" }, - { url = "https://files.pythonhosted.org/packages/8c/c2/800648d99039927b5a86d8ae02cd86a556a5ee1678d388216f6b44c8966c/xxhash-3.8.1-cp310-cp310-win_arm64.whl", hash = "sha256:c85949d02c85adf6d786eb94858e124989a632a4e65739835b2fc5761827fac3", size = 29215, upload-time = "2026-07-06T10:44:08.916Z" }, - { url = "https://files.pythonhosted.org/packages/8a/5a/05eaa129555f85476a3e16ff869e95f81a78bbe4647eef9d0229f515a317/xxhash-3.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602efcad4a42c184e81d43a2b7e6e4f524d619878f2b6ee2ba469011f47c8147", size = 34699, upload-time = "2026-07-06T10:44:10.14Z" }, - { url = "https://files.pythonhosted.org/packages/80/59/0df1133958b2228929355e022aab1e958c7b2c43e27bf7f59bc9edfa8a54/xxhash-3.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:131324f719957b988861714de7d6ddf57b47abec3b0cc691302ffeaba0e05e10", size = 32373, upload-time = "2026-07-06T10:44:11.353Z" }, - { url = "https://files.pythonhosted.org/packages/3e/bf/1cfda5b5e6bf26617812b4a31662ef2220d2ad04e0a55b8ff9eb36e56a5c/xxhash-3.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:db77278a6eddadbf44ce5aae2fee5ebb4d061f026b1ce2130d058cd4d7a7b670", size = 220284, upload-time = "2026-07-06T10:44:12.683Z" }, - { url = "https://files.pythonhosted.org/packages/70/93/45dc0ad7913b69e5b08bd039236cf628380e4c9cc76a8a4c6625a328e058/xxhash-3.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c332dd48b8cb050da2bb2a3c96d72b1664168650a250ef9718e423df7989e05", size = 240980, upload-time = "2026-07-06T10:44:14.297Z" }, - { url = "https://files.pythonhosted.org/packages/e9/02/f28ba7d17f2c1410ee397982c817ab1bd5b2701070c2d2c373539aad000a/xxhash-3.8.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a5cd96f6dcdf4fa657b2d95668d71d58455248f98712ecffaa9c528edf40ccae", size = 264526, upload-time = "2026-07-06T10:44:16.017Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d0/f10651cec2c7981b20d693deae6bdfc438427d92be2db4ccabb6181f0021/xxhash-3.8.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c959f88160b13b4e730b0d75b459b7929fc0d2225c284c9683ac95d6feeeac6a", size = 241369, upload-time = "2026-07-06T10:44:17.698Z" }, - { url = "https://files.pythonhosted.org/packages/ff/40/136e0cbaf5db51e191423b1c98643593189f02b6cd90837bf64b19113d70/xxhash-3.8.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:027dee4355f3fcc41481650d846cf6cfc895c85a1ab7acd063063821a0df5b4c", size = 473186, upload-time = "2026-07-06T10:44:19.354Z" }, - { url = "https://files.pythonhosted.org/packages/4b/3f/6aa808a96bdc43dba9a740dec56c744526ee3c0019e32c75e810fa90ae4d/xxhash-3.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad52a0e4bcc0ba956a953a169d1feec2734a64981d689e4fc8f490f7bf91af60", size = 220092, upload-time = "2026-07-06T10:44:20.956Z" }, - { url = "https://files.pythonhosted.org/packages/47/28/a8675e78a9ced96dab853416162268e10e05b452e95db7888cf69f58ac5f/xxhash-3.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d3dfb1f0ff146da7952867a9414f0c7a29762f8825a84879592612fd6139342", size = 309846, upload-time = "2026-07-06T10:44:22.543Z" }, - { url = "https://files.pythonhosted.org/packages/89/0f/7fe4d4ef4e69f0033e012396ee2a115886bca7b10b7e45ce398626436bfc/xxhash-3.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4482380b462ca9e59994d072a877ecadd1cf51102daeeab2db696f96ab763723", size = 237659, upload-time = "2026-07-06T10:44:24.135Z" }, - { url = "https://files.pythonhosted.org/packages/38/8f/83e9e31d4ed57fe963b99cb5b13a23e3e0f0dad1885aa0ebd2a7819dd423/xxhash-3.8.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:950ac754d16daea42038f38e7465eb84cda4d08d7343c1c915771b29470f065a", size = 268737, upload-time = "2026-07-06T10:44:25.875Z" }, - { url = "https://files.pythonhosted.org/packages/57/79/7e7de46dbe5d1f49afc96a0bc42e6b8df24eae3d6bad6007b99e42f48430/xxhash-3.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0418ec8b2331b9d4d575fc9284427e8e69449d7172e99e1a86fcdd1f51a0a937", size = 224955, upload-time = "2026-07-06T10:44:27.777Z" }, - { url = "https://files.pythonhosted.org/packages/ec/34/b8540839e958d5ef5c6101af6f16032109e7099698ae8edbc8dcefe4d8f4/xxhash-3.8.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:32a94ad2763e0263d9102037d349002c3d3c401e42770542c3eeb4801f311661", size = 239653, upload-time = "2026-07-06T10:44:29.422Z" }, - { url = "https://files.pythonhosted.org/packages/ce/87/a735d05f7f859354acadabe470ff40e2c46672275f96dcf096a761904def/xxhash-3.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:89b11a5cdd441aa463f6d34ca0241602bc09b001a76994b6059828494108c673", size = 300213, upload-time = "2026-07-06T10:44:31.401Z" }, - { url = "https://files.pythonhosted.org/packages/98/31/3e1cb020237b68117fc212dc5f9753b87f865b4dfee7c1ce62d0836955b5/xxhash-3.8.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:09a204dd4bb0823daf938cdd0dc8057d5f1e14fe3cbde929424255f23f9de872", size = 442508, upload-time = "2026-07-06T10:44:33.023Z" }, - { url = "https://files.pythonhosted.org/packages/23/bf/f80090622141cc734b039ce1d15ce3ff6dced375e9680249bf5b9b8c6bf9/xxhash-3.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e710ad822c493fb80a4fbc1e3d0a807b1422cb90adbe64378f98291b7fa48fef", size = 216853, upload-time = "2026-07-06T10:44:34.983Z" }, - { url = "https://files.pythonhosted.org/packages/a6/a3/60157acecc307b238d3651c2483168e224b48b23a36ae6d6903588341d80/xxhash-3.8.1-cp311-cp311-win32.whl", hash = "sha256:5013be3bea7612852c62a7437f3302c1cfb91ca7e703b194459db0b2b2e0d792", size = 31936, upload-time = "2026-07-06T10:44:36.542Z" }, - { url = "https://files.pythonhosted.org/packages/59/5c/ef70c418d878d187b8da56d4cdc06aea6cf5e456b301e96e51e1d2cc8625/xxhash-3.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:f377012b86c0a23a1df0cf5a1b05aa7187649e472f71c7892e5f2c2815bbe74f", size = 32724, upload-time = "2026-07-06T10:44:38.177Z" }, - { url = "https://files.pythonhosted.org/packages/2c/25/f008db952cec6b2a26445b456eeed2ebebd65e08e848ebe09ed6ac0634e6/xxhash-3.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:836f11d4474d3228e9909d97216faa4f7505df41cfaf3927eb29809de785a78d", size = 29212, upload-time = "2026-07-06T10:44:39.577Z" }, - { url = "https://files.pythonhosted.org/packages/42/91/f65c34a7aa7b4e7cf4854f8e6ef3f7ee32ceac41d4f008da0780db0612f6/xxhash-3.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e6e49370822c1f4d8d90e678b06dbcb08b51a026a7c4b55479e7d467f2e813bc", size = 34680, upload-time = "2026-07-06T10:44:40.932Z" }, - { url = "https://files.pythonhosted.org/packages/57/04/b10a245a4c09a9cfa88f8e9ae755029413ad1ac17047f9a61906e5ae0799/xxhash-3.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:220d68130f83f7cc86d6edfdeab176adc73d7200bf3a8ec10c629e8cf605c215", size = 32397, upload-time = "2026-07-06T10:44:42.196Z" }, - { url = "https://files.pythonhosted.org/packages/3a/75/45ab795b5945b6388583bd75202106af505537935566c15a1577797a0e08/xxhash-3.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d365ee1892c1fa803536f8c6ce21d24b29c9718ec75eb856095c07830f8c478", size = 220549, upload-time = "2026-07-06T10:44:43.603Z" }, - { url = "https://files.pythonhosted.org/packages/13/44/5ba2bd0a14ddf4193fc7d8ec29625f659f22c06d60b28f04bf46305d8330/xxhash-3.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:852bfe059720632e2f16a6a4745e41d20937b2bf2a42a401e2412046bb6971cc", size = 241186, upload-time = "2026-07-06T10:44:45.534Z" }, - { url = "https://files.pythonhosted.org/packages/23/32/c4147def4d1e4538b906f82731e0ba23424377fc50a7cddd03cd284c8f63/xxhash-3.8.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2f8c25a7061d952de589bd0ea0eaadee32378ff83dd6a677b267f9cd86f401f8", size = 264852, upload-time = "2026-07-06T10:44:47.199Z" }, - { url = "https://files.pythonhosted.org/packages/6c/bd/71ed14f4f0318bb7fd7b2ec51999413487fa8da8d41208e84d50d1ef0f98/xxhash-3.8.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:868a8dcaff1a84ba78038e1cef14fc88ccf84d9b4d12ea604696e0693296aa56", size = 242663, upload-time = "2026-07-06T10:44:48.846Z" }, - { url = "https://files.pythonhosted.org/packages/91/09/70af22c565a8473b3f2ae73f88e7721af281bc4a575236dbd1970c9f76f6/xxhash-3.8.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6536d8677d2fff7e64cd0b98b976df9de7aee0e69590044c2af5f51b76b7a170", size = 473510, upload-time = "2026-07-06T10:44:50.695Z" }, - { url = "https://files.pythonhosted.org/packages/18/96/34db781c8f0cf99c544ca1f2bc2e5bf55426e1eb4ca6de8ea5da56a9f352/xxhash-3.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:82c0cedd280eab2e8291270e6c04894dbc096f8159a39dcf1807429f026ca3cc", size = 220469, upload-time = "2026-07-06T10:44:52.422Z" }, - { url = "https://files.pythonhosted.org/packages/93/5f/9a184f615fa5a4dce30c01534f62946ce5a11ce40f73785cbd356ccabaa9/xxhash-3.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daa86e4b68221d38e669bb236ba112d0335353829fb627c82e5909e4bbe8694c", size = 310290, upload-time = "2026-07-06T10:44:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/a9/dc/9b9a9789011ee153723a5eb9e7dd7fcbae2ba9b3fe7a729249ca7c252056/xxhash-3.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2bc7113e6f2b6b3922dd61796ca9f36af09da3773898e7003038dc992fc83b8d", size = 238173, upload-time = "2026-07-06T10:44:55.693Z" }, - { url = "https://files.pythonhosted.org/packages/ec/4d/71c6005ada9dcb608a4e1902e8475ecadb5f3fbfa04e1e244d276a2d0c43/xxhash-3.8.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5eed32dad81d6ba8e62dc7b9ffa0500199385d7810a8dd9d4eafaceb8c6e20bb", size = 269026, upload-time = "2026-07-06T10:44:57.424Z" }, - { url = "https://files.pythonhosted.org/packages/2f/87/d6c036ba25dfbd9c8633be5aa86fc9474bbb9e2c68212a841d090abe7344/xxhash-3.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:83697b0ea1f10e7f5d8b26a4906fa851393c61546c63839643a2b7fe2d868061", size = 224970, upload-time = "2026-07-06T10:44:59.085Z" }, - { url = "https://files.pythonhosted.org/packages/48/62/4c1f035a41c5752aa05e195b6c904c07b94fe9061a16de61e72a6e6b135f/xxhash-3.8.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:36fc69160465ae75c6ec4ac9f781bb2aa16ae7ff869e73c26fee85fbb11b9887", size = 240820, upload-time = "2026-07-06T10:45:00.746Z" }, - { url = "https://files.pythonhosted.org/packages/da/14/d39d565069b87e86d21a2af2a31d04db79249d25aa8d5b62959056a89857/xxhash-3.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:445e0f5a31f2f3546ae0895d4811e159518cdc9d824c11419898d40cfadb677e", size = 300619, upload-time = "2026-07-06T10:45:02.716Z" }, - { url = "https://files.pythonhosted.org/packages/13/22/75467acc887edc8cf71c97ab1708feb3df7a88bda589b9f399765c6387d2/xxhash-3.8.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:dfe0580fbfd5e4af87d0cc52d2044f155d55ebd8c8a93568758a2ea7d8e15975", size = 443267, upload-time = "2026-07-06T10:45:04.653Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b6/1da3baa5fa6ef705e3425fddd382be7dfc4dfba2686df90a20f16e9c7b1b/xxhash-3.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:095e1323fa108be1292c54c86da3ef3c7a7dc015b105a52133973bc07a6ad11a", size = 217338, upload-time = "2026-07-06T10:45:06.304Z" }, - { url = "https://files.pythonhosted.org/packages/78/dd/b5295a9f97484e7a1c2b283a742ca45e3104991c55a1ef670dde161829ba/xxhash-3.8.1-cp312-cp312-win32.whl", hash = "sha256:bf28f55e427e0483acb1f666bd0d869b6d5e5a716680c216ad7befe3d4cfba2e", size = 31970, upload-time = "2026-07-06T10:45:07.823Z" }, - { url = "https://files.pythonhosted.org/packages/ec/31/3fa0b807d7e21515cd975e7fe5c039d52ac3e9401a96d6ad68dae6305215/xxhash-3.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:2256e80e4960ee282f63428adb349cb7f8bd8efe4db770d88eb815f4b9860724", size = 32741, upload-time = "2026-07-06T10:45:09.42Z" }, - { url = "https://files.pythonhosted.org/packages/b8/05/86feada74e239600e6875aa507afb40482a89b92700aa74a92da83bdcb77/xxhash-3.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:9df56e6df96a60590935e22373041cccc91fd55858763dcffb55bf63b3a2b396", size = 29234, upload-time = "2026-07-06T10:45:10.809Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8c/446bb782cd0d27007a917b5569a08dd73219c3e8d6e459014db104b27bdb/xxhash-3.8.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:3c682fcd96eb4bf64be32a4d95f96107e1588005831bd8a741b324fdda01b913", size = 38562, upload-time = "2026-07-06T10:45:12.425Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ec/c0c45627eaa6be7a5d6117423adf8f7a15b17ee74b4b17072cca5959a225/xxhash-3.8.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:036a024d8b9c01f70782e09ed98d532e76fd23f950ae7154bd950fe94e90ebec", size = 36656, upload-time = "2026-07-06T10:45:13.932Z" }, - { url = "https://files.pythonhosted.org/packages/f6/94/8324c04cc7597154caaeba6c094e01fbd2e7601d01e7a13eea9f5420e77b/xxhash-3.8.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d6a5c0bce213b23b0166fe0d35bcbbe23ce4b968f257cc7eb6fd57cb8e1e6297", size = 31169, upload-time = "2026-07-06T10:45:15.687Z" }, - { url = "https://files.pythonhosted.org/packages/40/a4/beb6bb26e1184e126dbe7a5682330214ef54dcfbf882078aa9f4b5428d42/xxhash-3.8.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:5177aa44eddaa97c6ef0cc00c6d540edb64d51781d2f8fb941612ec61a92c9ed", size = 32177, upload-time = "2026-07-06T10:45:17.035Z" }, - { url = "https://files.pythonhosted.org/packages/56/0f/fc4c92a5a528f839b34b6419b2e53c8597f2a629d5a1f5d721f65bfa1fd6/xxhash-3.8.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7801b7223db017b9c0c9ccf37e44524edb35a1544a1c032add22c061c6af0276", size = 34642, upload-time = "2026-07-06T10:45:18.39Z" }, - { url = "https://files.pythonhosted.org/packages/d4/58/edbfb141d4000767ac6a9694f8ac0763e2c2e983e65c9e31620ba56e2667/xxhash-3.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9e80238259655bf69d7bcd08226a970d7f42605f3157786bfa76dd13472d7fa0", size = 34684, upload-time = "2026-07-06T10:45:20.033Z" }, - { url = "https://files.pythonhosted.org/packages/07/3f/5072f1f0f5714186f0ac2a0b5a4929ce30d4b845e94886b6c01b6ebda0be/xxhash-3.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bcab50a389cc04d87f90092af78a6adba2ab3deca63175a3344ca83514045315", size = 32401, upload-time = "2026-07-06T10:45:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/49/c7/802ea2f9c2ed59219934d6d65c470d502b1788043eae277a52af8658bda6/xxhash-3.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a2489d3a776fa380cb8e71f54c7fda268a9baf3de9b1395093fd280f95735907", size = 220617, upload-time = "2026-07-06T10:45:23.234Z" }, - { url = "https://files.pythonhosted.org/packages/99/a8/e10488efd31fcb13fcd6acbc6e788f10c6f8e3a0cc4ae3eb89dc19c55a12/xxhash-3.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ab1e5432690276e71192be7401b55f96db2d0eedea5d44eb1f164505669cc0", size = 241295, upload-time = "2026-07-06T10:45:25.364Z" }, - { url = "https://files.pythonhosted.org/packages/18/cc/14180b17d44892a631f8ae7323c30bfbb1328efc8209e528a480293528ac/xxhash-3.8.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b30e01a0b97a4bc3f519a4d7a82da3dc53251fb0de5eeea8660dcd4ff094c0c2", size = 264688, upload-time = "2026-07-06T10:45:27.09Z" }, - { url = "https://files.pythonhosted.org/packages/a9/72/a14019d0c5f6c41ee407a503036ae32787c91325ca218a96a9b5627be651/xxhash-3.8.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1f44275ddb0978b67a58a951501903f04d49335a91f7681c9ce122ecb8ccb329", size = 242740, upload-time = "2026-07-06T10:45:28.753Z" }, - { url = "https://files.pythonhosted.org/packages/68/08/92550e556c6fcfcb96c6a336945eb53a431ed43120ed749636debb16c5cf/xxhash-3.8.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3b87cbd974512c0c5fc7b469c36b2cdc9ee6d76e4ec78bccb2c7184611c49b0", size = 473599, upload-time = "2026-07-06T10:45:30.524Z" }, - { url = "https://files.pythonhosted.org/packages/29/83/e361d3c1acd1b21e1d489616de6fa4aaf843365d8179f612e3743eac20a9/xxhash-3.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98ee81b4b7f3023c9cb04a78cc67610baffcb5812d92f2096cb5a5efc6f19437", size = 220559, upload-time = "2026-07-06T10:45:32.979Z" }, - { url = "https://files.pythonhosted.org/packages/05/01/006a4243c2c2a6831827f9999f6d1c23feeef100eb023c1f886022a00bf3/xxhash-3.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2666f059a1588a99267e33605365ed89cea92f424b3522806a9f4bd8ad2e3d62", size = 310383, upload-time = "2026-07-06T10:45:35.875Z" }, - { url = "https://files.pythonhosted.org/packages/d8/20/af388e8bf9f9a0f89eeef7d2a1935d176ee1c20bc6adeda05035879379cf/xxhash-3.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0093cf7eeb91b84776e8742113afa4bdf47533d36cf719179aaaf1f56f6f8bf", size = 238228, upload-time = "2026-07-06T10:45:38.02Z" }, - { url = "https://files.pythonhosted.org/packages/63/6b/4666579a87eebd1744663c404297355fa0658617b015cedfa58810ee7036/xxhash-3.8.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3a800912a2e5e975d4128969d645c4a2a80aa886ccd6c9b1c6f44529e327e8cf", size = 269137, upload-time = "2026-07-06T10:45:39.954Z" }, - { url = "https://files.pythonhosted.org/packages/de/d3/e963a8a46f900a137d91b02144d8ea07a8f812971b138204a3b2f8b8e55c/xxhash-3.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0fe37f72a207223d22a4eddc3149d4298993385aa9daef25c039246ca5a309f3", size = 225068, upload-time = "2026-07-06T10:45:41.718Z" }, - { url = "https://files.pythonhosted.org/packages/aa/80/9d181dbcde4b0fe48375f48833a5832d4b8cd2b349b15110c92ee472d874/xxhash-3.8.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5db43f249b4be9f99ef4b967863f37094fb40e67effafb78ba4f0356b6396104", size = 240874, upload-time = "2026-07-06T10:45:43.414Z" }, - { url = "https://files.pythonhosted.org/packages/39/15/ce3ab5a1cd27ead25a5196e55a7284220f6ad6e316da494ffd900b2b600f/xxhash-3.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c4ed42965c2cd9081f011be22f69d0e65d3b6165fe7734072fd0c232840bbd4e", size = 300702, upload-time = "2026-07-06T10:45:45.135Z" }, - { url = "https://files.pythonhosted.org/packages/96/c0/2281a8ab5f2a62dbf57a23c58a01ccc1d98abf40f71193c8a81f59e759b5/xxhash-3.8.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3557bec8fcb11738a8920eeb68974bc76b75262f6947998d3147954ce0a4b893", size = 443351, upload-time = "2026-07-06T10:45:47.188Z" }, - { url = "https://files.pythonhosted.org/packages/81/2e/071a58c1a53a52d4f7a3aa0987be0c396dffd40da8204805fe1b130a81f4/xxhash-3.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00de40f3b42240db23a82a5c682b55d7263d84a26a953240c1aee463409660e3", size = 217396, upload-time = "2026-07-06T10:45:48.925Z" }, - { url = "https://files.pythonhosted.org/packages/68/44/36ab58134badd9d3433fc7b53c4ca8d113d8e807782885628640f8297a4d/xxhash-3.8.1-cp313-cp313-win32.whl", hash = "sha256:b5196cc2574cfec572a5f3fb7cfa5ade27305ae3d06516a082132441aff4c83a", size = 31974, upload-time = "2026-07-06T10:45:50.591Z" }, - { url = "https://files.pythonhosted.org/packages/96/2a/2a0b84798448e766f7b89ceed073cb0cb5a43fc9ebbacbdea74a38de18e3/xxhash-3.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:538f5f865df6cd8c32dd63158a0e5b4f5dd08d732a7da8b7228a5a0776c8ce55", size = 32739, upload-time = "2026-07-06T10:45:52.221Z" }, - { url = "https://files.pythonhosted.org/packages/d4/60/bb51dbf7c363ff88a7cbd50b7959718219577ef44d7cf255929ffc4a2194/xxhash-3.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:a6617f30641ba0d8baa1635fbefb1dffc5165ec36d26921bd5cee13497cd937a", size = 29239, upload-time = "2026-07-06T10:45:53.714Z" }, - { url = "https://files.pythonhosted.org/packages/56/d3/827ca123c2ee5443a6aaed3c5dd199237dc2f010e2bebd7ec09ef36f3a5f/xxhash-3.8.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:bfcd82852c62a60e314670a9602de354c4460f8adad916e2e42a20860c7870bc", size = 34964, upload-time = "2026-07-06T10:45:55.535Z" }, - { url = "https://files.pythonhosted.org/packages/05/67/67ae2a3ccdeb8b8ef025d35aee9edd1d26c3abe5051d47da9286232afbf8/xxhash-3.8.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:08ea2081f5e88615fec8622a9f87fbe21b8ea58d88cfc02163ca11026ee62a92", size = 32697, upload-time = "2026-07-06T10:45:57.288Z" }, - { url = "https://files.pythonhosted.org/packages/38/5a/3d3994346e1f45493679cb5c1ffc2bf454e410e9d1e8a662d253becee91e/xxhash-3.8.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2e32855b6f9e5b18f449e59d45e3d5778bdeb660632ef2693cca267a11246c75", size = 225954, upload-time = "2026-07-06T10:45:58.897Z" }, - { url = "https://files.pythonhosted.org/packages/3f/2c/53169270309b7cd8e05504e07fe123bac053b89d00ac63617faacf0a2ec0/xxhash-3.8.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6e088bd7870775624256a0d84c2a6714afd223b2eeb56b0ca58398e52a32fda", size = 249776, upload-time = "2026-07-06T10:46:00.977Z" }, - { url = "https://files.pythonhosted.org/packages/70/e0/5c551d8d592f944506f7c5185e210255c15e672a3c6008c156a1bd9b775e/xxhash-3.8.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:72eb5ae575cc7ae2b23f6f8064a8b10f638c7149819ae9cc6d20ebd4d37a1629", size = 274776, upload-time = "2026-07-06T10:46:02.869Z" }, - { url = "https://files.pythonhosted.org/packages/a0/2a/d3a762270cee2d7bcd0e25e28c623e5f3f5c0dc637b66e3e47dd5b0bb3f0/xxhash-3.8.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d0b48cdf690a64cedf7258c3dc9506cc41fc86edd7739c40e3098952265dc068", size = 252056, upload-time = "2026-07-06T10:46:04.688Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8f/b78e4373b2cb6d1c42af60ea2d7e9146ad0710b239ac7f706d5d31d5bb98/xxhash-3.8.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb9e256a357dfcede7818c6d34e70db2d6b664394803d1de4b6984d2de76c0f1", size = 482108, upload-time = "2026-07-06T10:46:06.498Z" }, - { url = "https://files.pythonhosted.org/packages/e6/0d/642d923336ea61a15f8ce64fc7e078729e6e06c3a026e517fa79b2c23b7a/xxhash-3.8.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51f71a6e2ad071e70c937e41fcb6c19f82c3f9f49831eba850ed4a106ffbb647", size = 226739, upload-time = "2026-07-06T10:46:08.598Z" }, - { url = "https://files.pythonhosted.org/packages/a6/0a/a37d6da6427d45a8d23e3ee3a0ca9c9d4a90364849c6637fe2963a755f9b/xxhash-3.8.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4a6443968c4e8dc69967e12776776a5952c119cc1bd94168ad1c5ad667c2be1", size = 319658, upload-time = "2026-07-06T10:46:10.504Z" }, - { url = "https://files.pythonhosted.org/packages/4a/51/ebbd40da8a3f1bc53b4b7a9a87f8e28bd95c5f21bc14b8a57860cf367d1b/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:714503083a1f2065c9ad15340dd49ac8a8e948a505a705ffa1750cb951519113", size = 246059, upload-time = "2026-07-06T10:46:12.634Z" }, - { url = "https://files.pythonhosted.org/packages/24/4c/d9014030147e1f0bb26e7da47aa240dd9ec61c763c573e558111d869f8e1/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:77f74e45a1e5574bbbf80181c8027b3a4c65c2248fffbd557bd596fff13102f9", size = 275535, upload-time = "2026-07-06T10:46:14.614Z" }, - { url = "https://files.pythonhosted.org/packages/84/86/caee2db41fadcd5a25aa4323213f9afec5a8586d4e419241e3d659362bd7/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e0e1b0fb0259c1b75d1251ac0bb4d7ab675d36f7a6bf4ba6aa630dae94f9ffa", size = 231292, upload-time = "2026-07-06T10:46:16.452Z" }, - { url = "https://files.pythonhosted.org/packages/0b/60/f52f08bcdc904c4514ea5c25caa19e9f3214144434a6ff96dc82dc1cbddd/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:10e4393ec33633c2f05ad01869e546ad080b1a18f2650503731f153774608b31", size = 250490, upload-time = "2026-07-06T10:46:18.318Z" }, - { url = "https://files.pythonhosted.org/packages/24/a0/94dc7ae310838f250669c6ad7168e6d6fca17d49dac1053f06dc232c4a56/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b3ba794c3d885803db6c3116686923f1ec13bc86e621e169a375282b63ea1cc6", size = 309861, upload-time = "2026-07-06T10:46:20.503Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f9/adeead7d0eb28cdfc2832544ea639ffbc6749ccde47a8e228d667459182e/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:57189a69c0891e4818853feaa521c972d22c880a001453addea015f48e3c3398", size = 448739, upload-time = "2026-07-06T10:46:22.79Z" }, - { url = "https://files.pythonhosted.org/packages/04/a4/22ec0e07db57d901c9298ae98aa3cf2be45bafded6f07c13131e85b89032/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d59e71153fe9ff85648d00e18649b07e9b22c797291abb7e27274fa06df8b838", size = 223657, upload-time = "2026-07-06T10:46:24.831Z" }, - { url = "https://files.pythonhosted.org/packages/94/32/8a9531f37b59e5a013003db7cb7414baf4ce7e0e1268e0d5947cd3d6a2df/xxhash-3.8.1-cp313-cp313t-win32.whl", hash = "sha256:5b96f0024e9840f449bd91b2d005c921a4b666055a0d1b6492463799f32aae22", size = 32377, upload-time = "2026-07-06T10:46:26.86Z" }, - { url = "https://files.pythonhosted.org/packages/e7/ab/2ca45fd7f671de5f81fc297ef1c95080b40c86ec6be0cc6034b8f7707ac8/xxhash-3.8.1-cp313-cp313t-win_amd64.whl", hash = "sha256:37d5a56c36dcc0b9a87b814cd992598d33863ff683749de6c86081f278d5e629", size = 33274, upload-time = "2026-07-06T10:46:28.39Z" }, - { url = "https://files.pythonhosted.org/packages/5a/54/20d7163463ddb6438b73a427d1655a77a502cf9b9b0c3ada3599629d9c0a/xxhash-3.8.1-cp313-cp313t-win_arm64.whl", hash = "sha256:6696c8752aded28ff3b16f33ef28ce28fb5d209b80c206746f943199fcf5fd65", size = 29375, upload-time = "2026-07-06T10:46:29.962Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8b/df2ba04f22a6cd6b39f96a6577329a8471a55c90ef8d8e2f7c102363613f/xxhash-3.8.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:9db455cb649dcfe4504d6d68a6d83a7315a99a3ca59871dc3ff840671f99adba", size = 38430, upload-time = "2026-07-06T10:46:31.496Z" }, - { url = "https://files.pythonhosted.org/packages/b2/4f/6a059e8ad3ca8deedc91dfe335b211204900895152212c03ebbe721de68b/xxhash-3.8.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:affb37f152e55b5e4494bb9d0107f7bb08515c6704fbed82d9f61214d74adc17", size = 36558, upload-time = "2026-07-06T10:46:33.078Z" }, - { url = "https://files.pythonhosted.org/packages/cb/95/40be178205acce092ae418feb20ac737b32a02c7b864926ed0717354c9f8/xxhash-3.8.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:460261045936975193bfd20549a0de1cd52a33b405cbb972f0d80940c42266cd", size = 31181, upload-time = "2026-07-06T10:46:34.793Z" }, - { url = "https://files.pythonhosted.org/packages/3f/89/2da4dbf051bafa156c0e3f12012db2b0ac3b84ff37ca1f021f6bfffcdfbb/xxhash-3.8.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:38c887aedb696ef8bca19983206d270848558cfae4a91afa6a2fb05dde58ffc5", size = 32192, upload-time = "2026-07-06T10:46:36.393Z" }, - { url = "https://files.pythonhosted.org/packages/7c/4e/e000bbae3566bc8e0be771a8a0f294aa99075e3f0bc4ef43922ebffdebc8/xxhash-3.8.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:594131ce1aad18db3689781f806db1b065cdaa04f4df36b4c038d2013aefd0bf", size = 34691, upload-time = "2026-07-06T10:46:38.1Z" }, - { url = "https://files.pythonhosted.org/packages/b4/4a/ea954aacc7d1c8711880ac2b55da94429a9b4296b151c4fc0966549ca1ee/xxhash-3.8.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:78c794b643d214f1522e7a288bcf5a2de120d26cd170516749a4009dc92722c9", size = 34807, upload-time = "2026-07-06T10:46:39.647Z" }, - { url = "https://files.pythonhosted.org/packages/ca/29/df598e738ff37558ac627264deb2e560902d9bf7f46d3bd5175c9eee593e/xxhash-3.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af0c9fedc4a2c24e8664953882fe8185f3790b8338c9c700f76f5ad660817711", size = 32410, upload-time = "2026-07-06T10:46:41.359Z" }, - { url = "https://files.pythonhosted.org/packages/59/9c/81ab40e7d33ada0b3df5d1bc884894d15dbf4f805cd645b685e4606bb8e0/xxhash-3.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:115772daeb71b2f3b9381177017f53e6cf3f3439c840737fdabd21aba6e54920", size = 220564, upload-time = "2026-07-06T10:46:43.463Z" }, - { url = "https://files.pythonhosted.org/packages/fd/6f/62ae6f5c8606320a0e2a41c2dc8c6d91cc5d63d0f84dd9582e9543779dd8/xxhash-3.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:000435984a0469b0f822fe76f35bddea0f96a4d6521b3339a60a6428cdee1edc", size = 241462, upload-time = "2026-07-06T10:46:45.509Z" }, - { url = "https://files.pythonhosted.org/packages/15/a1/9c3a0ec6cb524396f551eddd102a76690a795494eb9784fc67542b0daa37/xxhash-3.8.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2f1c68394818e0595569c2ff3cbc1e6d5a36a434e796f5c526b987b80c8a8c62", size = 264491, upload-time = "2026-07-06T10:46:47.655Z" }, - { url = "https://files.pythonhosted.org/packages/64/f2/700a4674e4308eb59d2fdb973977e82eae231bea5044753fee5c9eec0e0c/xxhash-3.8.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:46b39976d008e2a845758650f0ff7136bca004f40da0c8798bd37ac37860154f", size = 242905, upload-time = "2026-07-06T10:46:49.857Z" }, - { url = "https://files.pythonhosted.org/packages/f3/8a/72d9874375c8d4cbc64a8cd1d659d5695a8765c3db82efa82dc5bd9f14d0/xxhash-3.8.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d5006c65ec507a333479e76e00e2c368781f16c24ededa764763956b32a0e93e", size = 473873, upload-time = "2026-07-06T10:46:51.953Z" }, - { url = "https://files.pythonhosted.org/packages/03/f0/6db07590ed7e0a77f186ef0bcea8d52553bf1ba57833e09467a2411f0f2d/xxhash-3.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31a2649bcf1fe97cf11c79848d761df33ac46b3896942d31b640557b486ff6b", size = 220765, upload-time = "2026-07-06T10:46:55.41Z" }, - { url = "https://files.pythonhosted.org/packages/8f/10/00d12d8b8beabbf49a8bbc626fb9f40445145a8887eb41a6acfb69149ac4/xxhash-3.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f759eed402448c2bdbb492e4fba1f20668ffe29688605ea61f0f67f9e4e386d", size = 310478, upload-time = "2026-07-06T10:46:57.729Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f9/12a82394eefb0f185d15a7f7b9f627c61c475a72dd83718436a5b84b42ac/xxhash-3.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5f97ecfede10d5b2870383620e2d25c8561e217c7bf9081073802b54248d2b", size = 238393, upload-time = "2026-07-06T10:46:59.87Z" }, - { url = "https://files.pythonhosted.org/packages/20/f3/53f963e320b9ce678337aa7273f39ce692ded8b99e3d22a866ec722159ab/xxhash-3.8.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1da930bbcac3e8fbe2191850e2abb57977a99348c12c4b385e1058ac1b0a9ecc", size = 268704, upload-time = "2026-07-06T10:47:01.806Z" }, - { url = "https://files.pythonhosted.org/packages/0a/50/5b5badbd87c82d9f9b5f58ac74a3f29ef08f6fc387b324b8fd482450b862/xxhash-3.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:747476436f6891b9773374ce8d48edcc8b12cb5b61b67c6fb6289633747d088f", size = 225015, upload-time = "2026-07-06T10:47:03.784Z" }, - { url = "https://files.pythonhosted.org/packages/30/93/3ca68265afe7b4e69435e08a7b6a1d9d0f2a071e889da1f8041ed00fe878/xxhash-3.8.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef09bbc2519a93cd0f95f2ceb5f7b85919dffea643278e02362bf40e3c4bed1", size = 240951, upload-time = "2026-07-06T10:47:05.816Z" }, - { url = "https://files.pythonhosted.org/packages/dd/a6/27e19670c40f46b5e76e11f2f4713d21054804568425d870670e757172ad/xxhash-3.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:a5eed9d41995a83f3332b4e3396abb7f433cac584222bd7e305b606d8353861e", size = 300751, upload-time = "2026-07-06T10:47:07.95Z" }, - { url = "https://files.pythonhosted.org/packages/bc/fb/b33e27689959fe7ed2ae0b830af41560d65213943983afa9db3a8d481bce/xxhash-3.8.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:53f3ed9118397074ff63a79b66b7fec1c84c782eecde35c5bc94e420a971c231", size = 443480, upload-time = "2026-07-06T10:47:10Z" }, - { url = "https://files.pythonhosted.org/packages/26/60/0e0d973be5fe280753ef02fbc89349492ad6e903bf1dcb870b668f94b662/xxhash-3.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d247b34bf433c92b41689318fd25d246313cab2275a6a47e2efac178b80d6efe", size = 217657, upload-time = "2026-07-06T10:47:12.196Z" }, - { url = "https://files.pythonhosted.org/packages/ad/68/c9e3ecef4a9a417d464cb5bd200aa12f73192dee677901b9e08e0ad0d1bb/xxhash-3.8.1-cp314-cp314-win32.whl", hash = "sha256:d58ce8b6cfa9c4d2f230557f69caf7c06369e318015d0b19485095bc2c5963ab", size = 32690, upload-time = "2026-07-06T10:47:14.204Z" }, - { url = "https://files.pythonhosted.org/packages/d7/99/e9e44588c0b62837bbec5ba7927816de0afa03406b1a0b6c7a7e1d1a30a0/xxhash-3.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:6cee733fe4ccb1737e0997135283c82341e5cfa9cf214b165f9087fb663aaf4f", size = 33460, upload-time = "2026-07-06T10:47:16.021Z" }, - { url = "https://files.pythonhosted.org/packages/45/2b/64f36d86380b3657ad9031967ab814f3ef31307174650853f69c18932ebc/xxhash-3.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:58346024d47e84f7d8b3e7f5d6faa1d58acbbe49a8771497872059f58c1d8ea5", size = 30092, upload-time = "2026-07-06T10:47:17.81Z" }, - { url = "https://files.pythonhosted.org/packages/92/cb/18b64bff88c58a0ca209dc533e63cf02d7ae5aa6b1b9a9fd14e81b5dbd60/xxhash-3.8.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:01cab782f8a0a05ecad2c63d7ef10f7ab475f660e0d6419d069418c14d88de7c", size = 35024, upload-time = "2026-07-06T10:47:19.821Z" }, - { url = "https://files.pythonhosted.org/packages/af/1d/72d8a70520e5dcddb472ea0486d299da3240745a10658290cd7b5690ede2/xxhash-3.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:717b12fdc51819833704e85e6926d76981ffa3f780ef92e33ebb8b26d46bb230", size = 32697, upload-time = "2026-07-06T10:47:21.649Z" }, - { url = "https://files.pythonhosted.org/packages/9c/b8/e041f555903c56db3d0a731b3d72a6575d75e0ed868b1bd2e5176111ca44/xxhash-3.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ec55d80e9b8a519d742669e0b49e8ce9e6747be42bf3c138158b6543a9c8e489", size = 226044, upload-time = "2026-07-06T10:47:23.612Z" }, - { url = "https://files.pythonhosted.org/packages/3a/7e/5cdcf06bf6ec4b5d2ac073feb23432ec1d603fd438864cbd2c09c7cb45e1/xxhash-3.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98d8ac1129b4dd39098cffed94d1284aceb61c3aa396757ccc736ac392e4cee5", size = 249899, upload-time = "2026-07-06T10:47:25.812Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c0/eb7e059cb5e1dba11fd30d2fdf882f56e5a417a3eaa43669d43623767f45/xxhash-3.8.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3bc0fa90830df1e1277f33cc6e55de9990b83c0319fd8c7412866cfde38b025e", size = 274892, upload-time = "2026-07-06T10:47:27.931Z" }, - { url = "https://files.pythonhosted.org/packages/66/74/a600aaf7cd39957fd1510adeedb1749c1e7eb82bd632a1153d9c664c3135/xxhash-3.8.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c73b6f652f0745425aa6378319c331293b5341756262e9408ed3d45f183375e6", size = 252243, upload-time = "2026-07-06T10:47:30.288Z" }, - { url = "https://files.pythonhosted.org/packages/ad/04/78d88fa75a6763e5d09bf1b947a392a27988903381b219006f92f3c68fc8/xxhash-3.8.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6114692261eff4266386cdec0f7d87eee24e317ab397c218b7ae6a76b4c6339", size = 482191, upload-time = "2026-07-06T10:47:32.45Z" }, - { url = "https://files.pythonhosted.org/packages/7f/06/07a8aea1108d682de8791ce608cdf367d75ff4e7e57cd3c154bdc6f47b23/xxhash-3.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4df57c0b161ec1b3ed0526a67b0db0914b557e86ee8aae51887aec941b261542", size = 226877, upload-time = "2026-07-06T10:47:34.705Z" }, - { url = "https://files.pythonhosted.org/packages/ed/b5/86bade5618a524d2c06c4041aa2fe8e5749ce16e88afba60d67c1684a21f/xxhash-3.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9043877a917be88ccf230aa5667c1bd059bce80f4c2727e4defa1b29b7f48b08", size = 319794, upload-time = "2026-07-06T10:47:37.08Z" }, - { url = "https://files.pythonhosted.org/packages/23/69/9b1a2b89b1621bb740fbcb7beb512f60f99480c1bdc680c0c90e1f56ff75/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:559e3cabe522231909f9de98ef06929edbd53782046bd21aae0c72db6f2a0775", size = 246202, upload-time = "2026-07-06T10:47:39.676Z" }, - { url = "https://files.pythonhosted.org/packages/08/ea/662ed6cb49f1d34078b6a3a3e0f3d29ff93fd7b5a03c0bc9ecfd9b2159c3/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:264710bd335016f303763ce1275c6486df30bb57c2245c91b224c983d7ac39b8", size = 275628, upload-time = "2026-07-06T10:47:41.99Z" }, - { url = "https://files.pythonhosted.org/packages/13/f5/49fc9e4c6728a5a3bd8fe639199d2fa67609b3a84f938aff6e8568dd3e4f/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e14800b9b10bb39d7a60ad4a310e403164d7b8988a27ae933d4e40618a44088e", size = 231390, upload-time = "2026-07-06T10:47:44.233Z" }, - { url = "https://files.pythonhosted.org/packages/64/9d/3acaf8f599c0e0b30e910a3a11ba32929da53c86dc73c7c55fe6a010b4e9/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:ea6a3e734b0fd41b82784a400be946821900daebe610c050a5e0760838a34f99", size = 250600, upload-time = "2026-07-06T10:47:47.611Z" }, - { url = "https://files.pythonhosted.org/packages/23/64/8acab4c5ec60dbe664b5b9858fd44c2413b07e535b09556a0a5022e78aa6/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cf399fac542a1c7a4734a435b93df2c55e858c7d31abf6c1bdf46f9ae67fbfd0", size = 310032, upload-time = "2026-07-06T10:47:49.88Z" }, - { url = "https://files.pythonhosted.org/packages/56/47/a0288d7329b1fe63e2734a32d19d444a96ae2b4810f545bc61e561224917/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:44c89d915a75c11d2547eaee9098fcd80398987c4bff2974a0497a925bf92c07", size = 448882, upload-time = "2026-07-06T10:47:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/01/e7/3071dfd3beb5c38204ce1cf56bf7749fce08de900fa92714b81d1d8ca1f2/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:358650d5bda9c635da699c53adf4e8134af492ecc79c960f917eebf088bb6799", size = 223728, upload-time = "2026-07-06T10:47:55.093Z" }, - { url = "https://files.pythonhosted.org/packages/12/11/b99949f0ba2b07e9f9ffe83b9c86faa685f9080725dc21a916a607313be5/xxhash-3.8.1-cp314-cp314t-win32.whl", hash = "sha256:c240939e963653054fc7e4a17c382829cda4aa88a7daf0af841715dbded1b497", size = 33150, upload-time = "2026-07-06T10:47:57.274Z" }, - { url = "https://files.pythonhosted.org/packages/54/1c/09703eb341f8416e74e58d6c6732d4b5c46de59c942363203cb237cc95b0/xxhash-3.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:7258ee276e8772599bc19e14b36f6260306e21b637190cd7cb489a2449d48684", size = 34005, upload-time = "2026-07-06T10:47:59.434Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f9/6ed7251bb6a8af10ac73b1821c60583d2826e5b2064e45a979c935287c98/xxhash-3.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:8f454166c2ffed45636c8d501741e649851ba2f346c4eb73a64c07ac00428f20", size = 30239, upload-time = "2026-07-06T10:48:01.874Z" }, - { url = "https://files.pythonhosted.org/packages/99/e4/4d8040435aeac814fc69ba63621565fbeb19229a138e2568324a26b2a45c/xxhash-3.8.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:39c9d5b61508b0bb68f29e54546de0ed2a74943c6a18585535a7e37356f1dd12", size = 32687, upload-time = "2026-07-06T10:49:42.803Z" }, - { url = "https://files.pythonhosted.org/packages/da/6a/975f1f2318c760e5bcec109ed379713ae645d8d856c2a3b9ec5d26857087/xxhash-3.8.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:83b9130b80b216d56fdf9e87131946b353c9627930c061955a101ea82b09fed9", size = 29879, upload-time = "2026-07-06T10:49:45.172Z" }, - { url = "https://files.pythonhosted.org/packages/08/0b/40a2a55ff52cf635bfdc5eae67a772bec85b4f44c6c737f73f6f528d51d1/xxhash-3.8.1-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8304be0982130954b7fd3aad18e2c6f8ee40254bc3d2e635991c16d77c91e2bd", size = 43246, upload-time = "2026-07-06T10:49:47.905Z" }, - { url = "https://files.pythonhosted.org/packages/9c/6d/56ed2b6b200f26fb474f3fd387d95d0601efcd5bb33430c90c68924bdd77/xxhash-3.8.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b512261801b1e5fde7b6ebf2fef7977339c620cbbca88a0040ad9ad134f4d02", size = 38202, upload-time = "2026-07-06T10:49:50.59Z" }, - { url = "https://files.pythonhosted.org/packages/0d/a3/56864d895d1161a9f17502088e9c1fb7c06bde2c2efdde620d22bb7a9c43/xxhash-3.8.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49aa8692507835dcc1e8ad8021f20c74c2dc13d83b5112e87877faa2a0035b20", size = 34448, upload-time = "2026-07-06T10:49:53.242Z" }, - { url = "https://files.pythonhosted.org/packages/6b/57/5c6e0908a47f61dca96d01c8ee6fce01ed1050611eb779083ba8758fed81/xxhash-3.8.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:345b07b78e2bf583d71682aa34ae5b5fab575f7a1cb31e10263ebbc6f89f8c42", size = 32869, upload-time = "2026-07-06T10:49:55.972Z" }, +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/a5/1386f35da1475fcaeef42581deae73417c6d2a6a0b2d2e8914de18844dcd/xxhash-4.0.1.tar.gz", hash = "sha256:d55bf4ef10eb09b8b6866790e083d26d087d84caa3cc0946ba87c3ca7ecaf7b7", size = 101513, upload-time = "2026-08-17T08:24:08.557Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/de/6854b311cb468985de555e49717357ba1de8ffe4b08eda3f4c522a418fda/xxhash-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3f68fe400ceec235f3e4a4b02a28c2fd2d283584a193223c921dd4c48f1d0754", size = 38470, upload-time = "2026-08-17T08:20:33.331Z" }, + { url = "https://files.pythonhosted.org/packages/91/2a/7d79952633fccbf9c2a59cc1dfe9d073f9edfceb052ba9bff5075e31408d/xxhash-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b1dddc257279417d93c9e59420d49ef90aece90d7a01996db3aade74b0281b1", size = 36229, upload-time = "2026-08-17T08:20:10.259Z" }, + { url = "https://files.pythonhosted.org/packages/70/6a/6a6f4220c39bae1636eb3f8ef217359b8afe268493ee858adf9002130257/xxhash-4.0.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4972332c079d6aad69c4620a68d015a4ecb33141583f70d642cf9edf6a713763", size = 243168, upload-time = "2026-08-17T08:20:07.211Z" }, + { url = "https://files.pythonhosted.org/packages/c8/03/a1d745b324bede7af8a274d889d25b758402629695499a957375cc5fe994/xxhash-4.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1b603d0686c99fa0879f104a74e7db58367634c6e50ba827bee9aa095e23205", size = 266061, upload-time = "2026-08-17T08:20:18.253Z" }, + { url = "https://files.pythonhosted.org/packages/0f/cd/55c7565db23d2d29a2e31ea9dd0001ad3f4729298f42ba32967dde7644ab/xxhash-4.0.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:33fd538191f47071deef6b1f676535e2aa770f1fd150ae4cc75a34c9e930be3d", size = 287357, upload-time = "2026-08-17T08:20:08.901Z" }, + { url = "https://files.pythonhosted.org/packages/72/31/c967c98cbf151df6ae8756fc9821b1f78d1feffa8420ff2ad5645f27f98f/xxhash-4.0.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33e270d302c95ec426dfa0f5a4e16bff2ab8d7b8a46faa4746affb05e684ac77", size = 270683, upload-time = "2026-08-17T08:20:10.943Z" }, + { url = "https://files.pythonhosted.org/packages/70/98/df9f3c14bc2fb2712ed1497349dc7e8c0b0f20a1f353e2e146d83a1adef9/xxhash-4.0.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3fb1d30d4b6d6e2c4a08e5ac6fffdb2b572d2cfcca15a5509cf4e7a1350f955c", size = 497802, upload-time = "2026-08-17T08:20:17.217Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3b/e5d20b4f602d15fc5fc066f601052a7d6f5a401a50d67fac92098a5829a5/xxhash-4.0.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e27dbed5c4ba033919e4b4ed8dc14e029e91d14a93cd9f920d25277c7df6781", size = 249503, upload-time = "2026-08-17T08:20:40.14Z" }, + { url = "https://files.pythonhosted.org/packages/39/98/4cd03fa7ba791657aa555d0655e89a0d66193b1331e4391114b50227f80f/xxhash-4.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:43bcf2a871f28f16135545415cab3ec43904d4c80425a64598a9e6cebfb2b5ba", size = 333384, upload-time = "2026-08-17T08:20:18.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/67/a0a076dbcecad2af0cceb873ba4f95475f3955fb81d82f9c5e9f97a12854/xxhash-4.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dc434c946012e6d8a72b10f970ea30755b718251dd7591dbfdabafd3bcb21bc", size = 262463, upload-time = "2026-08-17T08:20:08.719Z" }, + { url = "https://files.pythonhosted.org/packages/48/94/767b68736250813923d74703ef628b0f57ff1c5bf690d7a6082928d1a14d/xxhash-4.0.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:0b1082fd0f089ce9098ed77aad8b777b5d156f8ac601c69cab73811822b8ef07", size = 289405, upload-time = "2026-08-17T08:20:35.493Z" }, + { url = "https://files.pythonhosted.org/packages/ab/61/69d9ec6e85f9933f26b39753b404f97ffd2fc3bfeeb5e26333752595e060/xxhash-4.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd649663ddeafbfd4734eb8abae921dd5baa1242f20bda54e8bc927369ccded4", size = 247989, upload-time = "2026-08-17T08:20:10.759Z" }, + { url = "https://files.pythonhosted.org/packages/a7/66/e6a033879893074bc441faec65587f9ef9cca49ee3cb99ef20c699b014cf/xxhash-4.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:97b455de3e8b1b0b1e4594cb61a468992563f03ca264062fbb0a66b393c01d90", size = 267987, upload-time = "2026-08-17T08:20:20.947Z" }, + { url = "https://files.pythonhosted.org/packages/18/91/a99a412b010cf2cc2bd38a0a44043c894ffa80b46c8d4e1522e40d2ef401/xxhash-4.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:2194bf96d5f3d4e0cb65deba370ec83dda3edfba42155f9384190ed5e51ea5e2", size = 322541, upload-time = "2026-08-17T08:20:22.675Z" }, + { url = "https://files.pythonhosted.org/packages/0b/12/1a91408e66d1716bd278cf55529d4ba251d90c6b694ea78a09dcbd9d36c6/xxhash-4.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:84df5f8da574caadbc0cb1b8866ecc2368cc941f0cd05f677756c802f370dafa", size = 466264, upload-time = "2026-08-17T08:21:12.422Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c8/8abd4c1b90962f794ed9b139767b0a971e5168e8393961ccf046956c0039/xxhash-4.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c09ada495567c9c9a8156c5ebcfb93be7fece0755062d738c972dcbecd0d84b5", size = 246149, upload-time = "2026-08-17T08:20:23.385Z" }, + { url = "https://files.pythonhosted.org/packages/22/3f/e020285d737a712bbfcf01dfdbbec7773c7c8289447a5373540caf2cdf5f/xxhash-4.0.1-cp310-cp310-win32.whl", hash = "sha256:85bdd40cb505a11e0ca04191711266c5fd696ed786ae83849955e457774edc96", size = 34630, upload-time = "2026-08-17T08:20:10.001Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9b/4e8384b299b40664a225ce9deef54c42b3d59f5181a16d4a374ea3503f8f/xxhash-4.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:8ec4777d92fd61a5c8fdeddab894fd65bea301a8092fb5419ec6472aa4d458d7", size = 37058, upload-time = "2026-08-17T08:21:05.846Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e9/d73c870d9dd26f8d6782ecf716b31e836bb6269c888b6bb6e1fcf71eed36/xxhash-4.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:03600a8987849b2bef7be795a60a6052b635c63fa98b718b08ca5ee823691cfc", size = 33289, upload-time = "2026-08-17T08:20:19.707Z" }, + { url = "https://files.pythonhosted.org/packages/0e/58/bc81e25cceab76ce4b400441e3a43312bf3887fedbb2e5f80cc5a7dd7f75/xxhash-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8b4477edc03091f51f5309406d230851c23cf4822029e3bf40b8df53093fff1c", size = 38473, upload-time = "2026-08-17T08:20:34.303Z" }, + { url = "https://files.pythonhosted.org/packages/64/8d/d95e810c9a2930906f1fbd0e38f77554abb8e042a190aa9cbb24da39e9a2/xxhash-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:04f9a24de11a6647666d5302fd73d6a5224ce50ddc965fb0bb44cee736e6bd7c", size = 36228, upload-time = "2026-08-17T08:20:36.641Z" }, + { url = "https://files.pythonhosted.org/packages/72/be/ebcded2a32ba664a17a1737a91b6baa298bcda6942acdad81af81660b74c/xxhash-4.0.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8c5ce76b94ba49f3be8a8f2611abc6564210702c72ac9e237ca2bebfd17794", size = 253292, upload-time = "2026-08-17T08:21:27.206Z" }, + { url = "https://files.pythonhosted.org/packages/52/2a/72d31d787d988d1130253bc34d249c553f02c9387e7dda789b6d5aa7963b/xxhash-4.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4c8842fb19d78b5e8c2a52baf4c8357658cc56c62bc822b86ce0f942f28e286", size = 276545, upload-time = "2026-08-17T08:20:26.726Z" }, + { url = "https://files.pythonhosted.org/packages/39/ae/048f3b1f283a340bef3697fe5a9d4f10de1696a379af9af6b2352c24d82a/xxhash-4.0.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a43418e1a90b4809a9caf64aeb8b0696e3e1f300a323acc1e6ee2f93ae319fcf", size = 296295, upload-time = "2026-08-17T08:20:15.759Z" }, + { url = "https://files.pythonhosted.org/packages/8e/43/e9a593c81445c8e8d669402edb8264144624e7e5e2406df7d33e3c164d90/xxhash-4.0.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3662719007e059abde7eddacf8517142ba076ddc7b30c807260e57d28c3c191", size = 279966, upload-time = "2026-08-17T08:21:22.217Z" }, + { url = "https://files.pythonhosted.org/packages/f9/4c/29da2b166955a300521c0abd498ad4481916c3743949b106192b781f58fc/xxhash-4.0.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:06d7fbd609503c3be5e65cdb6bb2f040d6a98574404e2e1d5c60815c97fff4aa", size = 509850, upload-time = "2026-08-17T08:20:32.731Z" }, + { url = "https://files.pythonhosted.org/packages/40/ff/e39e1900179ce7f0f23e7000d9fc672471a8d05b6b2dc657cb496c8975d0/xxhash-4.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:101aa300de6ceef3d9c77569706330d8921fc45dd82bceed2084f1e9f2557a24", size = 261005, upload-time = "2026-08-17T08:20:40.735Z" }, + { url = "https://files.pythonhosted.org/packages/89/79/76ee26720d13219458f4b2ec0b22f539fe2bcb1f83dc22a24be4cda4e285/xxhash-4.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4296fcc790876a8b0f297edc83d3b088457b774d8f67b4636807f8a2ec69a79", size = 339620, upload-time = "2026-08-17T08:20:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/2f/c7/56b53252d64ecb2f3a0d283b41033561b1bec9c268095150153b694c2e52/xxhash-4.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:57d7fa8f23908d173001c21a9e82bfc6ad997d1b6c270fb121812b7ed158891c", size = 272558, upload-time = "2026-08-17T08:21:33.883Z" }, + { url = "https://files.pythonhosted.org/packages/fc/76/83101a2f2ad3eb6b4b5d571e0aa394a576e3e23121707d507d80197ac385/xxhash-4.0.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85e402dab0f9acd3604539747c6fcc57dc188a18af6ab07eb8189351cd32466c", size = 300417, upload-time = "2026-08-17T08:20:36.183Z" }, + { url = "https://files.pythonhosted.org/packages/34/5d/5be1166ec4fc4bc896e508dc51189a2dad200b373269a430e214fb152693/xxhash-4.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fb59a0dd61fb2ad481c03fda399d78ce57dab6bb62c2c8fdb446a7ba4754b89a", size = 259286, upload-time = "2026-08-17T08:20:21.51Z" }, + { url = "https://files.pythonhosted.org/packages/77/6c/42f6201f13278787c58a6b3a1cd597b47e8665a7d4f68a3440d001c05a75/xxhash-4.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0b20a06454b34f1531fc677c54efe2ecdec691ef9224f7fa919bf2c1363f7ff1", size = 278230, upload-time = "2026-08-17T08:21:47.62Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/3cb7f149a5a469c628604c33bec6d79764698b315700a4bbf1c6fb15622b/xxhash-4.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f7db035447a0ac8959aa230c5d36545ecf9f547413eb1711c0ca6f0ba1418925", size = 329846, upload-time = "2026-08-17T08:35:10.922Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ee/934eb1e11f4d0e95f3828825f8da4b6d59e338235d63edc3d929769262d2/xxhash-4.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:34ed93e20bfd98d722b902121643791eeb4b1641871e2dc63d0d4c2d93f187df", size = 477285, upload-time = "2026-08-17T08:20:46.297Z" }, + { url = "https://files.pythonhosted.org/packages/e2/0b/77835dcd7aec970db74f5724c94207ada83b3e2f5e1474ab44b9c8fe5ea5/xxhash-4.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6247f5e23ee94f2557ac9dab738a336f607c6ff476fcf66ca70c3aef5eee15a", size = 257552, upload-time = "2026-08-17T08:20:58.211Z" }, + { url = "https://files.pythonhosted.org/packages/da/6c/a3ce7a1a9c4ec9ad8babba591a996a71c474ff9630c5fb04c8c9d8b995ca/xxhash-4.0.1-cp311-cp311-win32.whl", hash = "sha256:348c8f288dc961d6bbd1985c8152a3ed7a85c95df00e82320f0c5215d922a399", size = 34630, upload-time = "2026-08-17T08:21:53.323Z" }, + { url = "https://files.pythonhosted.org/packages/d9/58/60d2170e8cda0891aab25dcaa74797b420c3c6cde8a5bc8372f17b30c0cf/xxhash-4.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ac0f291ab6485bd71f33941f9b92771318332a05d505460b41e893a549caadc0", size = 36992, upload-time = "2026-08-17T08:20:41.973Z" }, + { url = "https://files.pythonhosted.org/packages/ac/de/b229a39f9bbbe30cbcf9afaaa8993cb65286715c90a3b058c3769196ae02/xxhash-4.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:72f34834518157a75e7090f328ee7a16c70c804cfc7c694fa069cc888e9fc03e", size = 33289, upload-time = "2026-08-17T08:20:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/26/6c/dc7cffeadd06336cd934947187cd38abb263103bbc552ca0f55fe4ff595a/xxhash-4.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1ee523f51718e41753f04f7102bb4dc55a18d2ea5cbaceef8ec7ca08571bd428", size = 38444, upload-time = "2026-08-17T08:21:54.332Z" }, + { url = "https://files.pythonhosted.org/packages/75/c9/cf736f6db8c3273af18925061572db0d4357818a9ce425f4b5fb0021918e/xxhash-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:515a822c73abbf6a0b7c70976d9662be342835c9d78b8dc7c023411f39c35dbc", size = 36195, upload-time = "2026-08-17T08:35:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/da/a2/ca1929354b6851529d0148f7f335b5e2b0281f83bab3e19f0896dc579796/xxhash-4.0.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f5d031f35962e5483a613214e61f09fe24ab523062c3646d592dc16c4a217451", size = 253113, upload-time = "2026-08-17T08:20:52.152Z" }, + { url = "https://files.pythonhosted.org/packages/de/bb/542005206af59518bc8d78a210f1e0172217bc53beb32f64a5b632e72b6b/xxhash-4.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da0264844a09b538c894e5eff25313d941deb4dedec2131b98418a71a3c9944e", size = 276525, upload-time = "2026-08-17T08:21:01.886Z" }, + { url = "https://files.pythonhosted.org/packages/1b/df/607cff25dcb0f1d35c3b04493f6ad8471edb03fd4eacbdcc5ceddef1f3e9/xxhash-4.0.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1642907941ee4b75aacc3db688af52ea02ca2305ab22af7ee686ed726b332684", size = 297703, upload-time = "2026-08-17T08:21:57.958Z" }, + { url = "https://files.pythonhosted.org/packages/15/ba/9d2275eea0b9d9c6b02921be23f7588356c60df95c763b25f0e045894d43/xxhash-4.0.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4af350bc3f329970c0e3a59af84a8a30998bf8a9167eb50cd48e59baaa1d7bec", size = 280252, upload-time = "2026-08-17T08:20:47.299Z" }, + { url = "https://files.pythonhosted.org/packages/1d/aa/2299d9f6369e550aef2abb64945e39daa34412725aa46a20d99b74d76f67/xxhash-4.0.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8ba782ca3bf1e81492611152b9a0d5264971339e95e34d69de0ac2c926be496d", size = 511041, upload-time = "2026-08-17T08:20:36.771Z" }, + { url = "https://files.pythonhosted.org/packages/83/97/31bd8b8279e6935a0719f6910ced15e9d5a2cd554b253f6027ce1b5a1c2c/xxhash-4.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:237b8f63a2a0fcfb1ffc06e21dad23add44e6d354b2b014364a1d41e419a4dee", size = 261812, upload-time = "2026-08-17T08:22:00.469Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c1/d180a2da23c105d8e0b02d54f9f5841013fc81c233010ec781e31f1aee4c/xxhash-4.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:81507a68ba84c55241fb61cce1469f473a5da4205fc8ef6f698e5948eea8dd88", size = 339878, upload-time = "2026-08-17T08:35:17.626Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3d/f584cd3172fe934f0f5a0a3917d0d7ce781f74d794fd43bb72be71c3ef6f/xxhash-4.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1ea31d61bcd2cd2f3ec4ca80a64187bbd7948f490b63cf0dcbc6e717b4c1e9", size = 272871, upload-time = "2026-08-17T08:20:56.067Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/2c7956b2b551682e00b9aebce9ceb0a991a131d65f9850c09f5f9760be2e/xxhash-4.0.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:06713a5aaf1d0905c5579416c020c02e42b3ceb931e86c7d3b7fb85403dee3f3", size = 301440, upload-time = "2026-08-17T08:21:35.911Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a2/0739f6482184a8026f4b022718f5f815d352059312e80696825433f0a8e7/xxhash-4.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e8cda075b10bb3917b002c74a04f9e02b7d13b5bf732571404d51c52b11c7329", size = 260157, upload-time = "2026-08-17T08:22:01.416Z" }, + { url = "https://files.pythonhosted.org/packages/a1/25/b31a7bcf1d7d116842812e54f9b944843b4236ea4fa85634e8259f342212/xxhash-4.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c10b9206753b64aa791b35b201485477525b26fdec5bf86e8364c388a03e2592", size = 278233, upload-time = "2026-08-17T08:21:15.674Z" }, + { url = "https://files.pythonhosted.org/packages/db/e8/5293bae090fc6119dbc5fcf5c4cc0e1536394b52d73b7904d033836c73db/xxhash-4.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:f3e1a44af01b6692de0ec6caba5f0bf93ceb36896e02b7fc00952c6ea7ef39e1", size = 330270, upload-time = "2026-08-17T08:20:51.128Z" }, + { url = "https://files.pythonhosted.org/packages/72/9e/e2ab12d40921f3f34c9317637d65e011aeababf8288356ea8d527de2c1d0/xxhash-4.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6fc415b5568bd9accc7187f1729a99707330c0a67a8b9f93c1149ed573ed75d", size = 478555, upload-time = "2026-08-17T08:22:04.183Z" }, + { url = "https://files.pythonhosted.org/packages/6d/32/c6148d39a49efa95f39b4cf0d41ef35a487f3b30f6fb1fc8fe8d8eab577e/xxhash-4.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:96d8de55029d42251945531f6aa7590c32b48163c66a43bf29d8657d7446a377", size = 258174, upload-time = "2026-08-17T08:35:21.18Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fb/0b04b68d6c5bc71c7a2c344f1287327b67e607f28fbcfd937697caca64b6/xxhash-4.0.1-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:0163b5d259de23ae9e07b7eabf435ce4704f6f205589a2b154e6af4be985ce1b", size = 20767, upload-time = "2026-08-17T08:21:00.806Z" }, + { url = "https://files.pythonhosted.org/packages/a6/be/476092aba34d1fcd313e1613a3bb3bc692f253d167b54bc90049043b5034/xxhash-4.0.1-cp312-cp312-win32.whl", hash = "sha256:1216f7ba5683f17a89eb7dcb4bc50a0b743dfe1902278d7b3d0786f538118433", size = 34669, upload-time = "2026-08-17T08:21:49.486Z" }, + { url = "https://files.pythonhosted.org/packages/aa/02/f9413d94fae43cec6d1a74c4f12156c6f4a7f5fd50e1d34defebdee3dec9/xxhash-4.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c2d525a3afabcd8e3549d85fc7e111fde6bc302d06a1893fe73adb79823415e", size = 37073, upload-time = "2026-08-17T08:22:04.886Z" }, + { url = "https://files.pythonhosted.org/packages/c1/83/6fe93c1b95acf962bc61a246df09dc2dcce895ccfc1080c9f48d0b652b92/xxhash-4.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:86b2b12bec60c678ed8f5cca0258ad93a8928ebddb6ca7732f0875afe1451d1a", size = 33299, upload-time = "2026-08-17T08:35:12.708Z" }, + { url = "https://files.pythonhosted.org/packages/f3/dd/c707286b527722f776e1fb81dd202c45623355ba1a2972337a2a26075b2b/xxhash-4.0.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:8c9fe122444e129881afd1d4d1c7ac0d3ce2d91b68c2b40173b6025ff1c31f9a", size = 43639, upload-time = "2026-08-17T08:20:54.945Z" }, + { url = "https://files.pythonhosted.org/packages/1b/3b/bb71639a0f95635f61936a6f2653599c4261b645ddddd8d00f9dfe3613e2/xxhash-4.0.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:1f3346c5c287ac3c7f38b20380f55e8768230e7252af59fabcf3b87ab21e4256", size = 40657, upload-time = "2026-08-17T08:22:12.616Z" }, + { url = "https://files.pythonhosted.org/packages/3c/91/76f3f5385faa9886a36f21fcc603f40b4c0c40ce622382f133160c48b4d9/xxhash-4.0.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:4e5141543c7f7fe3087500bbb4ac2845cb528a980aa91f8f1e661e2292ff4a5d", size = 34708, upload-time = "2026-08-17T08:35:24.614Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4a/f48f0e3e1b1ab072979fff2a5be899234e28090883e8b519d0b10215d708/xxhash-4.0.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f09ee747e2a5f876cc5ad56947734811828335e13b403dd8ea1e06d77a9dd48d", size = 35650, upload-time = "2026-08-17T08:21:09.337Z" }, + { url = "https://files.pythonhosted.org/packages/c4/53/b73d7472b196101ad1f57ed0674af3af803ac3e9ec2feadd650a7b262562/xxhash-4.0.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:acf52474b2494ef66dc7e0fb6d5e2b50c18313039ad4d275fbf9f9907c804bc5", size = 37958, upload-time = "2026-08-17T08:22:10.616Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f2/024946ad8fa532074af4e4380179da54b7ec9facc8bd0b279ec0fac4e63a/xxhash-4.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1b3cccf75eeb5b01639b2feadb042a8e07889293b7ca72fa2985e7dcb64763cf", size = 38032, upload-time = "2026-08-17T08:22:09.535Z" }, + { url = "https://files.pythonhosted.org/packages/da/e0/934af8d99bb5885711006bec30a691f728edd513d2c40f053f887d8e7577/xxhash-4.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cd878d32f5c6cbce9783f8d6897561fb772211edba9dde49d85672b88ed45276", size = 35895, upload-time = "2026-08-17T08:35:16.53Z" }, + { url = "https://files.pythonhosted.org/packages/20/5f/a8011f6a1558f7ca66d9077bb4f192b1871afcea62fbd5733605d2015755/xxhash-4.0.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:41e579025a6e13a99e6d71e39c9cfc621a0dcdbbf19106325e145fa858f2d794", size = 259464, upload-time = "2026-08-17T08:21:06.72Z" }, + { url = "https://files.pythonhosted.org/packages/ff/89/9665a44397547e7a3d58c0942425a976d58dcfd4b538f33220a312bf6912/xxhash-4.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74379a577a9f3b6afbdedf1b90e5c7764467051977f18a326d7d607336d743bd", size = 283949, upload-time = "2026-08-17T08:22:17.003Z" }, + { url = "https://files.pythonhosted.org/packages/34/2d/78774141266457468f29f3f5803092df4db87d8148ba74e4debd041649db/xxhash-4.0.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:acb31ecdd1a97fab5cd39a84ee9f515e727d319f796fec48703b8339b9998360", size = 303898, upload-time = "2026-08-17T08:35:27.951Z" }, + { url = "https://files.pythonhosted.org/packages/59/48/d78d22de576b42528bff87c14207de50de4f0b888221a50ff7c9d675d670/xxhash-4.0.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5b7875ac1a2edcb691f27642b8b94b904baa6bcecb7d79c72df2228ba8cb5c51", size = 287241, upload-time = "2026-08-17T08:21:13.042Z" }, + { url = "https://files.pythonhosted.org/packages/4c/de/7a1755a59c59fd46176f293bbdd99e399a6537ba9537fc723aa4d1bf6e27/xxhash-4.0.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4751f1d7eecae6b2d2a773630f1a7248f125c9a92a456694d03c15bceffc9d68", size = 519856, upload-time = "2026-08-17T08:22:15.35Z" }, + { url = "https://files.pythonhosted.org/packages/6f/fb/76580c08e916507859b0f335393cb5fdc59452c4402edbc6bcca6e47e7df/xxhash-4.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a51b061d54cda8b83e62c44458bfbf0dabbef9b975dd9649952ba5076b9f349", size = 268572, upload-time = "2026-08-17T08:22:14.533Z" }, + { url = "https://files.pythonhosted.org/packages/d0/2b/1abde3e07b8f2077a38b4fbfaf764115008bfe0ff03bc7756a52c9fd0607/xxhash-4.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:74a164e8b63f1e9cf35c9a7809d082b033d1a00e7375d5d814415436e7867e57", size = 344967, upload-time = "2026-08-17T08:35:23.569Z" }, + { url = "https://files.pythonhosted.org/packages/5c/15/80b6ddf0732eef48a8b5fe717398274794392bd6dbe82af38d189d214772/xxhash-4.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f5e5c6df4b703afcbe9352d238a51efd97c3b91fdc3a2052e40fdacb1e7505f", size = 279956, upload-time = "2026-08-17T08:21:24.97Z" }, + { url = "https://files.pythonhosted.org/packages/77/e0/11cbc43c205bf81fad50d69c7319cd1b1ccc01a66cd4fb8766357126c43d/xxhash-4.0.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d54b8ae068af532c8cdf56abb9e09a60fbe7b10792444c9c27987bb6d3b450fa", size = 307583, upload-time = "2026-08-17T08:22:22.541Z" }, + { url = "https://files.pythonhosted.org/packages/1c/11/cf0bc07feb2791045b6ac075d4bf64f1a5beedef2f46ae70d7104d63a19f/xxhash-4.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1749f0688020209fe0d357ce1e1cd9ec9c6161ed0405ea949d24581c4c43fa91", size = 265848, upload-time = "2026-08-17T08:35:31.298Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c4/7ada4bea2a2795073dfc42d96842930efbe7a0c1857ef4b522e4e90e5d83/xxhash-4.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:94ac8a6b8c47951173f0b67bf862bcb971bf24e493b9fbbdb0e010cbbc7d9f54", size = 284409, upload-time = "2026-08-17T08:21:23.156Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f4/d8ce83dd6b99ccfbdadaf2db968ae40334d2e5f73a0297e593b9ddb3df39/xxhash-4.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a33de7633c948ab2dc144af370a66e7e7af29b425dcd0f7e4f59689fb9391b53", size = 335921, upload-time = "2026-08-17T08:22:21.802Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9f/f47d8724bd8bc45b395b06b7cacea2dae0d00031af1b707184a091161df6/xxhash-4.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:247ece770647c0aef080561fa996f9774b4dadce2d0c42eeb98229db7dcf820d", size = 487023, upload-time = "2026-08-17T08:22:19.729Z" }, + { url = "https://files.pythonhosted.org/packages/57/54/2d87098f3371cc1e42dd04d2285ad56bca4c56667bc501bff02d2b9fd6b5/xxhash-4.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a4553d36cc0b7fce1f35ba8a94dfd775aa3ed12f5eab2dc3b46ac75a0706b0bb", size = 264333, upload-time = "2026-08-17T08:35:27.001Z" }, + { url = "https://files.pythonhosted.org/packages/27/b8/93795ca5898ec7d7d0455283ad261c0fc76b4f0c0a69e86233bd7badb0bd/xxhash-4.0.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:87aa309a93bd5ec13f14309a305ff4e9bf74c5363fc46c264c0a22edfd5b0670", size = 20581, upload-time = "2026-08-17T08:21:39.207Z" }, + { url = "https://files.pythonhosted.org/packages/b6/96/926f7335a0a1647952c00421e8da877f658094f61336306c7cadc335c94d/xxhash-4.0.1-cp313-cp313-win32.whl", hash = "sha256:cba763d84b06bda2c38d5185dee76f1b9dfdc0789e96e476d9e10005526d0788", size = 34449, upload-time = "2026-08-17T08:22:29.362Z" }, + { url = "https://files.pythonhosted.org/packages/ea/61/8a5aeb811de093bab3434e77eff0e9461624a1a56a6a93d315d080aab2aa/xxhash-4.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:97b94fb29abf21f5f0bde15f7dbdd3a4aa2dc59f37026adc7b4bee8563b84375", size = 36520, upload-time = "2026-08-17T08:35:34.852Z" }, + { url = "https://files.pythonhosted.org/packages/04/14/97f3c74000ca36955e9cb86f6d270dcd5848b5c65afa623453f5cf2d83d6/xxhash-4.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:08ed8da18cd4fd0a6a5d6a444852d8fbd0e565388a74a4937085451b5f1a312a", size = 33428, upload-time = "2026-08-17T08:21:31.713Z" }, + { url = "https://files.pythonhosted.org/packages/81/0e/ea406a02b561d3275232ccfdb3e29df80f7a65414940e3a15721c7bea40f/xxhash-4.0.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:af05a3f650220a6c59fa0ad2410249f2d2470a05225807c378fb67458693f8df", size = 43747, upload-time = "2026-08-17T08:22:31.37Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f0/b0c94d61ccf6b5d1f8847b58ef8f923125ac4919ed5bd0eb082750ca7cbd/xxhash-4.0.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:a6e3653df1a70b8ac4191216324242e4be2bca18c9a7c10934e1bd56dc7ca15e", size = 40749, upload-time = "2026-08-17T08:22:29.431Z" }, + { url = "https://files.pythonhosted.org/packages/2f/c5/8085881a538983be0fd1c865d5df236242fea496044e2c8ca32b9f2ba39c/xxhash-4.0.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:4528cf80ebbbf57d40edfb31521ae265daa6dd636d615b1cf0ac86209579e59d", size = 34734, upload-time = "2026-08-17T08:35:33.68Z" }, + { url = "https://files.pythonhosted.org/packages/d3/94/8803d13c968fc75ca434eea991d29ac5fd8a36b4afc9a6a9803c53933db4/xxhash-4.0.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:90cb2a1c9cc503a054a19612b48ff6e8e47805f618bdb3224a07568aad03a37e", size = 35671, upload-time = "2026-08-17T08:21:48.322Z" }, + { url = "https://files.pythonhosted.org/packages/85/d5/ad91d7f0fd294190d37c08236fe661f5c4e3f83dcd1a121877a2e64681ce/xxhash-4.0.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a949b072ea59c6eca0811ccd9e95133cc50d2afda8d464b5b077c78f78efa269", size = 38094, upload-time = "2026-08-17T08:22:39.763Z" }, + { url = "https://files.pythonhosted.org/packages/89/f4/2b7ebdc1869caca5f02c4cba8379b631050d3c3d4adb9187e4dc1a6b8d3c/xxhash-4.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:79a3203aadf39637869dfea1185227d8452844d78b837e54fb1117b4d34ba5c3", size = 38244, upload-time = "2026-08-17T08:35:38.081Z" }, + { url = "https://files.pythonhosted.org/packages/90/9d/f66cf6935f528e575f1ae4d6560d376e7587569747186f4fae8777cadc1b/xxhash-4.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d9f3848ffaf010bdbabdbf4c25641fa258b6227ff27bc74a4d06edef521a4873", size = 35904, upload-time = "2026-08-17T08:21:37.358Z" }, + { url = "https://files.pythonhosted.org/packages/07/29/34569d7b482f0dc060074faafd163c588f915cbc3e3e218f1ffd8a3ad340/xxhash-4.0.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9283d9dd6b44acad35118e2976fc763a065509e4118debdb61916ec322ed17b9", size = 259595, upload-time = "2026-08-17T08:22:38.153Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/a2370acfcd48732cf5c2b87f06cfbf7fa51c0ce0dd736bde42939eb9ebf7/xxhash-4.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c7c642a0f79c3e3cf2965475507574d3d1a50ec71060039d60cb87358667cb2", size = 284279, upload-time = "2026-08-17T08:22:36.396Z" }, + { url = "https://files.pythonhosted.org/packages/08/15/17d33c24e6c4a1c0b9ddc5584f0c25d51d48b34bacde1416a2235a19db4b/xxhash-4.0.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96dedccfb09a73a25751053a183159b88f4ee75f388df8166040c152ac0531c6", size = 303973, upload-time = "2026-08-17T08:35:39.22Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e0/4ec0d69ad5738729098a61e631b7ed2df22a922b0e03014b597c72bd863d/xxhash-4.0.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81664268dba92e037b740ecf37fa02f1cab4a391f93f28e35792b3341c60648f", size = 287535, upload-time = "2026-08-17T08:21:52.158Z" }, + { url = "https://files.pythonhosted.org/packages/0f/8b/4f9b17e7a9eb71c65548ecddd9c18b84e3c18ca41c4d436ad2a3000d3f7b/xxhash-4.0.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:839f58c5bd9989875be0fd28446dbf32cace2c2cd8bf2f6762acdc38a95cd1aa", size = 519257, upload-time = "2026-08-17T08:22:43.272Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/3276b3e743b8ddbed9c3f71c76d9dd6a75d72aa4e678b1447b635cfd92e0/xxhash-4.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ffa44b4c7c5d0ffa31356b4428659516c0e47647825c74079a296b3857b6d99d", size = 268190, upload-time = "2026-08-17T08:35:44.985Z" }, + { url = "https://files.pythonhosted.org/packages/08/d4/f1555de3c96721320930dbb7988c8482d82b85970076aba1a8d40e83ad43/xxhash-4.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e681a6fc7e4f715252b9b5acfb30536ec7dd1f75033a32dc617e6fa95af1a3fd", size = 345553, upload-time = "2026-08-17T08:21:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/ac/98/c28908f27007087b61139d290f908dd827ffd40b88af0c43f9e1a1a7ffd5/xxhash-4.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6301d92545c591ad31c3e050aa40a5f8a4c16413f1f9e6f9322c6f0f9d2b736", size = 280499, upload-time = "2026-08-17T08:22:52.236Z" }, + { url = "https://files.pythonhosted.org/packages/a9/76/3ef57622c65816348f8196273485baab4752aae064959901e85cd867e067/xxhash-4.0.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6efb8f21cc136c79b3e5bb747c8682d37916fb202cdbbc32182de5c4e47f821f", size = 307211, upload-time = "2026-08-17T08:22:40.815Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4c/5804504bbc808968e57d6a50286dd8f8cc06e0ddd6e4ab4b1dc89ae42f35/xxhash-4.0.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:760de77279e9cf9c81d012ce0705cba13afccee9b09c480f17d778c8c5cefae8", size = 265865, upload-time = "2026-08-17T08:35:42.727Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ee/8572fdfd70e7aaaf150af899871c2cc0bb88c3295ca82172a31e04ca5168/xxhash-4.0.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a16a3fa6936e36bb1414d16a6bd012c9033e5161b68b426805b61d895392437d", size = 284545, upload-time = "2026-08-17T08:21:56.965Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f8/6eadcca0904660c848b466524e82a233d16c9d2d5258433aaf3546142d86/xxhash-4.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:9c3c4b9aa9a27196b921197f7daf9e6c1412739df06a99cfa6e923879362eff6", size = 336022, upload-time = "2026-08-17T08:22:46.346Z" }, + { url = "https://files.pythonhosted.org/packages/27/df/4aa107b81602d6d6d09ab5a607c530d2d3a6b28e2e9a59b01875bd877c54/xxhash-4.0.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:863f3d3b44110f7243e86cf994aa5c5d88f2348b6e84ab4402fadadfbf9f7da7", size = 486671, upload-time = "2026-08-17T08:35:49.016Z" }, + { url = "https://files.pythonhosted.org/packages/45/b7/b2bf9b5301e9cd5f2e335fea8da0f5cf209a6594cb1fe77754774ad4a6fd/xxhash-4.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63aa52659bc32bb9bd7cb5caf523b4d14429a477762cfac886132d687c1f80fc", size = 263744, upload-time = "2026-08-17T08:21:56.165Z" }, + { url = "https://files.pythonhosted.org/packages/0b/96/35b1c02177ae26234892c2310fb4822ba62411acccbf425ab8f9fd99354a/xxhash-4.0.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:67e57b834e07ed973cee7b6da1548ff28a56458d77696fd2a5f397f340694848", size = 20563, upload-time = "2026-08-17T08:35:11.924Z" }, + { url = "https://files.pythonhosted.org/packages/51/c2/a06300b165fbd6b0cb4a9742987f2e997a9f447ce3bf7c6ac97b862ce62a/xxhash-4.0.1-cp314-cp314-win32.whl", hash = "sha256:b6c1f9c59bbe593f88a0aad30be4150f15bd57bd64efb95feeabcb8e563f1ecd", size = 35151, upload-time = "2026-08-17T08:22:44.283Z" }, + { url = "https://files.pythonhosted.org/packages/06/96/c5b37296b78f80fc97124c0fee0c7bbd1bdb6f3b18bcd8748bb113b2d8fc/xxhash-4.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:da544672efd9ad76077928a3e6c5d894e52ce82d3bf14002db4a1bf17d1a36a2", size = 37156, upload-time = "2026-08-17T08:35:46.551Z" }, + { url = "https://files.pythonhosted.org/packages/ce/5e/248f9cd169c2fb62236bedfba246d213bce728f74901e99047e3f3c55875/xxhash-4.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:d0d24a4f3fb63852cd09af46ae4b7a4d00cc8b8615a046dca543786e728d1056", size = 34379, upload-time = "2026-08-17T08:21:59.446Z" }, + { url = "https://files.pythonhosted.org/packages/58/c8/db1d37c0da0324d0298f6abd931ca1d4736e049d9f2081230a8421da74d2/xxhash-4.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:349775ac30372b344d2338b2a168c0a1312a644194da25b8bec476d55761a128", size = 38656, upload-time = "2026-08-17T08:22:49.119Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8e/e18998ec465fb977bc74272e5bf3c2e886c13b014cbef916cd607802c709/xxhash-4.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:43e5f9169e73d0f0db33b5f6b8554bcce69ac278c966daf83d5eb4eb2f13829f", size = 36306, upload-time = "2026-08-17T08:35:52.853Z" }, + { url = "https://files.pythonhosted.org/packages/ef/1a/b83f86f8a987a3cbcb7e005a6824ff64aecae35abc1395a0d44ee16c3319/xxhash-4.0.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4a252fb862b0ae2590587e625f47a0e03da05cf0205e8830b67b6596c06038b1", size = 273729, upload-time = "2026-08-17T08:21:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/02/4e/2db15aa8508e0cd5b632927a53b98234f24039ea65377e6cf996c06d2d4f/xxhash-4.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2df3ca8757dc381e75e90a4d7995a6324f58a923c7145220a7b2c0231f66fddc", size = 301083, upload-time = "2026-08-17T08:35:14.113Z" }, + { url = "https://files.pythonhosted.org/packages/26/94/ed759787ffe802bd8e31cfcdad3755cbeca2dcdafd2f790cd6f25d195199/xxhash-4.0.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bfed61996d618eb90d6eaae0178002e3466a28b06bfc557a7a3a7266378d8c5a", size = 312745, upload-time = "2026-08-17T08:22:52.232Z" }, + { url = "https://files.pythonhosted.org/packages/45/7a/f64b4a4cc8b51e950709207f55f7f56ae9c5af6631dd31d7fb443312418c/xxhash-4.0.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9761ff4a0ffa583fe850731ad24fe82c88cccb7a2294727db0955f3279a4cb3f", size = 301419, upload-time = "2026-08-17T08:35:50.143Z" }, + { url = "https://files.pythonhosted.org/packages/a0/71/bac313b8de073569b8db3152044a7cfcce87a3fa9698c18fe9f914dee6b1/xxhash-4.0.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edccc2ec58435a580f96a48a3ccae8cd0a480824119165dd90108718ad81ae6e", size = 534485, upload-time = "2026-08-17T08:22:11.515Z" }, + { url = "https://files.pythonhosted.org/packages/b9/0c/16b5e419f24e59507ee05626d2bb0deafdb03f9f27783bc0785a9849602e/xxhash-4.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4741d42d59e4e5fa1a86c17ab9c27dc8ea459c700d91b6742fdb9138d9a516cb", size = 279605, upload-time = "2026-08-17T08:22:52.934Z" }, + { url = "https://files.pythonhosted.org/packages/5f/55/5787dd6e2d8d5b61256a5039f6b18c2193c7c1de4a2fd2413288d0d9c604/xxhash-4.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:440c401e146ce64bdb3beb8ff0c84677b6f21307c28a34779071cecee5d4d70c", size = 358924, upload-time = "2026-08-17T08:35:58.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/68/89be41991f3b0a2e91f940bdf3128852c3ed571cf560d98ad0f67024afe4/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5b7979f71d06ae45a769de0699900a246d8cb632db1e8bfdc79ec019063a503c", size = 295305, upload-time = "2026-08-17T08:22:13.683Z" }, + { url = "https://files.pythonhosted.org/packages/e6/5a/52ff0a0cc361aad393ff9a46ffe3aabbcf9c03d6c8f2612da7d553048276/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:62198213fc3e0c56e567894b318ba45834e007d065f84ba6dc9165d21546fc56", size = 320228, upload-time = "2026-08-17T08:35:18.946Z" }, + { url = "https://files.pythonhosted.org/packages/0f/b5/91c60ff22c7f6cd5f6d7a5bad5a2cdcb4c33987dfa50bf13f0d856279b2e/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b3bece52127ac20044311ee73567f9f0893b5de64f9028aecc90cc740cfd525a", size = 279414, upload-time = "2026-08-17T08:23:03.212Z" }, + { url = "https://files.pythonhosted.org/packages/b9/94/9685954804d47d0390871a64bec606a0d536406382d71a784df3a5883fb4/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a865d2d470220e659220fdb59d5b6c4422802d8d6098e1324bc4d12444798914", size = 297594, upload-time = "2026-08-17T08:35:57.881Z" }, + { url = "https://files.pythonhosted.org/packages/89/62/b67ac9412907b7a07a2a0c08c3440b9e4480231a7b3de0767e87011e4564/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8580aab306888224074c7edeec734de0c3c5ccde65b2da4e6c9a5e28f7c0a1bd", size = 348526, upload-time = "2026-08-17T08:22:18.571Z" }, + { url = "https://files.pythonhosted.org/packages/37/ed/6723cc49a9f567d52d01fd7c1741b0f2e3a13e71d15f7ac49d753a20c115/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:2d52dc7c33c1b83082b707f6b7814dc76d2faaa2ea62bd9c5fab4b36f83c087f", size = 499307, upload-time = "2026-08-17T08:22:56.52Z" }, + { url = "https://files.pythonhosted.org/packages/fd/2e/7b10e101ab988d93b791023be7191d7661271d6ab31ac082276b9091042a/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6a9f98af872355e0c02439e48583958eee00e60b928bb20476460d9d40cb7b4e", size = 274989, upload-time = "2026-08-17T08:36:01.834Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8d/7eabcc8d29cce40621443cff24c07d7306ef574b8956c47ac59f21098005/xxhash-4.0.1-cp314-cp314t-win32.whl", hash = "sha256:a14578102a6081465aec9cf73c76c3cd3f79f0709bdb3b8ae7ab0b54c9d8b089", size = 35482, upload-time = "2026-08-17T08:22:32.336Z" }, + { url = "https://files.pythonhosted.org/packages/ca/89/2a4268e1971f63038b79fb75e3b9c8de942cd77acabbb0c5625352a31940/xxhash-4.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c57963970d359a72262f7fe6be88f945e2334d4bc41462b7f08c37b0abf35ca6", size = 37490, upload-time = "2026-08-17T08:35:22.475Z" }, + { url = "https://files.pythonhosted.org/packages/90/7b/950ecab1fe4cf421d0a6211ddd9a0ac82e39e55c45a111ceb90953dc6c9a/xxhash-4.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:b659fad79c99b0238c7ad7e9d7dbf4eebfea9097c2dba65fa0a4d18a25b29a2f", size = 34596, upload-time = "2026-08-17T08:23:10.001Z" }, + { url = "https://files.pythonhosted.org/packages/c4/03/7dc3b85fac10751613bfedb0e120734e0e8710054abad3f931e9d3843a14/xxhash-4.0.1-cp315-cp315-android_24_arm64_v8a.whl", hash = "sha256:5adf927dca8c47fde7e683fe69efdd81bc865c4db1fb6bb00b391e2b6185207b", size = 43749, upload-time = "2026-08-17T08:36:00.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/55/bfac071c5b1c6d6a3d48ab1ab96a15e958a1d7061f4afc97804292d87264/xxhash-4.0.1-cp315-cp315-android_24_x86_64.whl", hash = "sha256:c30dd1af66a820820398b26e0d74e7a9aa43cae705924f23ed828cd8e5c26c3d", size = 40758, upload-time = "2026-08-17T08:22:30.209Z" }, + { url = "https://files.pythonhosted.org/packages/79/87/49a260e685d1a74c56a69432a8ee0527ddcbd684a3c51f87edc3b75639c5/xxhash-4.0.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1bc591533fc975614f7e13594daee76af96b8e1fbcf8de76c8773858fa9e7cea", size = 34788, upload-time = "2026-08-17T08:23:09.014Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/50d72ed2170dae872e1c0fe333d0908e0a2afbffe74c5c9037d5406a4b89/xxhash-4.0.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:567cbc630302a46a8ecfd943b309ccf5372bb3718f1f3762d452df30f033bcf0", size = 35746, upload-time = "2026-08-17T08:36:05.557Z" }, + { url = "https://files.pythonhosted.org/packages/66/f0/969deaa2bab3bfd5ad5b023442124d2255b9961eef6f797ec74eb8683bdf/xxhash-4.0.1-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e998cb3685b92101ec5de0fb4d9485cf01e50bc418211955c55d98064664cf4c", size = 38098, upload-time = "2026-08-17T08:22:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/86/aa/45ed7d7b8d7b66202a47bf8ff3b77cea28d2ea54dfcdd202b4cfe043e3dc/xxhash-4.0.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:c3074db513c81f764053e3da079312ecf85a50d8350c71f4cc0105d9662a9e6c", size = 38251, upload-time = "2026-08-17T08:35:25.774Z" }, + { url = "https://files.pythonhosted.org/packages/f1/9d/45e7520a7856e13800a5dc8cd038d34c6372429465b163af0c5722f16918/xxhash-4.0.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:3088dadbffa33c29e0518578430a7dff2e901a212e487aefa5faaa0dc06dad34", size = 35986, upload-time = "2026-08-17T08:23:25.854Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0e/5ad466e5fea18c9f9bdc5828c0506f62190061b4a1b0e688aa54969d0a9e/xxhash-4.0.1-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1b50223d92df94d54e1a31469335a2c74b16692e6c1cb726f1e6949514458706", size = 264609, upload-time = "2026-08-17T08:36:04.229Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cf/8f269f85217e3dbd45e31e25e46cc26f3aff0e159ef05d228b4b982c778c/xxhash-4.0.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:427b62d62d4f967fbb10b82a3813e4875c2a6e7e7634739f17265b650c7f65a6", size = 285910, upload-time = "2026-08-17T08:22:38.589Z" }, + { url = "https://files.pythonhosted.org/packages/ca/30/2fc1a16ee0f9501d074b798ebfae52e24fa602c7117f5c4b81de71eada72/xxhash-4.0.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c6370189e8e66b7e608f533b939a9de092ddca6cce084ca0d3d414d2ed5b5d59", size = 306566, upload-time = "2026-08-17T08:23:16.895Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a7/08375cf2b997e1903663fe7525c5973b1987a4f8ad2b8d47463e9143f2ee/xxhash-4.0.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec1a470c6db94ac4589c203921e89ac1bc13e796a8b1784d8135e1893559cd3b", size = 287978, upload-time = "2026-08-17T08:36:09.296Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e5/90a7b404c11add9e53a497d06236152852490c3b2f21e468d97a58f26afe/xxhash-4.0.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37f667dee0f867c42894b34e2a6fe26bf195c0ea4683d9d2b713db023f242c3a", size = 520098, upload-time = "2026-08-17T08:22:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/11/02/7fba10b1b17eb46308f09cc0a4ed513d74dff16b1e22a1c439f011c77129/xxhash-4.0.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f18732adcc271741bd651c3e56fa519d8a237d2cccda01fe3afb226bf87f783b", size = 268273, upload-time = "2026-08-17T08:35:29.043Z" }, + { url = "https://files.pythonhosted.org/packages/54/49/c21b228877357a3be43eeeaa22182ad1685796f415390ada475922c084e4/xxhash-4.0.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b42a5a26607e4b2409fea174773a66f2dff9dfdbf2c1a851bb7b804e2c97535", size = 350164, upload-time = "2026-08-17T08:23:29.494Z" }, + { url = "https://files.pythonhosted.org/packages/00/3c/c15bb4aa33d94b78a5553b52e7fa1070565f0199925aeadec3871de20ce9/xxhash-4.0.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:99166cc98637e8bf550cda2aab07f4f1d5f899c45fbd721801aeabcc9d404824", size = 281975, upload-time = "2026-08-17T08:36:08.139Z" }, + { url = "https://files.pythonhosted.org/packages/18/7a/b1d0388315fe7752b7725b68a912667526a1dd48ed492fcc031ac03f4b52/xxhash-4.0.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:6cf633df84d80a1668fcf61e330791dae46825e395549e7d34f376411e75088a", size = 307872, upload-time = "2026-08-17T08:22:42.206Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a1/037cb2dd8cf725c9565dfe3712b2915c0e0276a9154913dbfcbcecbeb672/xxhash-4.0.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:e259bb7e1e2d8de6b35f430f5c7220b1c0ebf3962d1ba7ec7545980d5931edb8", size = 268241, upload-time = "2026-08-17T08:23:23.997Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a9/67c44422d0ee082169b238ce24bd2796b82d7c21ed953471365df8c508d8/xxhash-4.0.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:704381264b36a18b9c62ecbabe2e71d0fc58c77c129c15355c989b10bf05b6b0", size = 284970, upload-time = "2026-08-17T08:36:13.476Z" }, + { url = "https://files.pythonhosted.org/packages/7f/d0/254a5f51c4014cacc77a26f321372338b924f54e89efb730164ee336d850/xxhash-4.0.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:e90b4bcf1d9eb1010fdaee7c9209fb667e74c0684f3ba17f9032bd7319da90c9", size = 338074, upload-time = "2026-08-17T08:22:51.166Z" }, + { url = "https://files.pythonhosted.org/packages/64/03/f21c4830118d72ef3a958ce8bf2152f49e0d4cf200907616c9be6caf372a/xxhash-4.0.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:a65785e653573fcd1e33062760ab4c3c3440e8e910765018e4b6ed4ad07b54a0", size = 487626, upload-time = "2026-08-17T08:35:32.768Z" }, + { url = "https://files.pythonhosted.org/packages/45/1f/268a689d741d7da649317eb4ce41760140beb4179aaf43a7216fdbe8100c/xxhash-4.0.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e3996ff9b6f99180357024336bf5749a8ad6476a9a2523e535c5212b995b12a2", size = 263852, upload-time = "2026-08-17T08:23:41.871Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f5/adaf8101cd7f143191a0b390600294d83924b32cb13770fde8803dce27a2/xxhash-4.0.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:99054b838b74d8d3995ea0d410976ae967c46207ae22d6ddfc535e809197dab9", size = 20569, upload-time = "2026-08-17T08:36:11.952Z" }, + { url = "https://files.pythonhosted.org/packages/ee/2c/56a5eb8c993420fc07114c08f447a2b66ee996510b4764cb368b9b44c9f0/xxhash-4.0.1-cp315-cp315-win32.whl", hash = "sha256:6c45258a37fc22721395c09927cb982d3e7a83607cab15be7e2416501bd3a330", size = 35145, upload-time = "2026-08-17T08:22:50.038Z" }, + { url = "https://files.pythonhosted.org/packages/67/c7/65f210db43e62157d0fef3b4d4d7b394821e7733c8bb4ece49f91410a725/xxhash-4.0.1-cp315-cp315-win_amd64.whl", hash = "sha256:0ab851b45c70d4992be7cdeeee16f97a0b677408c758c4b1efb1cfe8030bfd37", size = 37161, upload-time = "2026-08-17T08:23:32.438Z" }, + { url = "https://files.pythonhosted.org/packages/33/ae/1a641d1d60ba219756d9ebe907ff0ecf4445adcf4fa96f6e3da57b91d439/xxhash-4.0.1-cp315-cp315-win_arm64.whl", hash = "sha256:a5b21b42a01a343096a1c018d35e9b7aec9c7065dda53ae8da071e37478b2cea", size = 34378, upload-time = "2026-08-17T08:36:15.912Z" }, + { url = "https://files.pythonhosted.org/packages/48/7f/7698b320b251806d1249e513922a626f19027e104c829a611272250350eb/xxhash-4.0.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:44ab12e8cd17d4f001769f00ad465208b4bcb897ed29e65f058f74466b57a98f", size = 38610, upload-time = "2026-08-17T08:22:55.203Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/436497e775b647b3b3e9a4ffe8c76c59fa4aa7a9fab6447cb59acf1b50ea/xxhash-4.0.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:45e88111ebe331de478ef8d4293efbe88f3cf8b863386c9a2357136b838e1af0", size = 36378, upload-time = "2026-08-17T08:35:36.18Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d8/17a4f8182b9257898aa2a77c2a45f70233eb8e50681a280e8e09d2ee76e9/xxhash-4.0.1-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bf430c587f447a554c53768ad76b9846fe7c5632180ef6f69c4fce8b0552fbd0", size = 273559, upload-time = "2026-08-17T08:23:51.075Z" }, + { url = "https://files.pythonhosted.org/packages/83/28/121bd5a5c5adb88e0da772c7bef61964cf9da92956a7a237c7d24c4351b8/xxhash-4.0.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adbd48b30e3f82c89fb2b3e6a87cdd28d113b190a5ed0ee2dee286323ee9a621", size = 299133, upload-time = "2026-08-17T08:36:14.731Z" }, + { url = "https://files.pythonhosted.org/packages/11/8f/57c7b6e04642ed738a0d08a31bed7fc63fdacb661d665f98739cc9751b62/xxhash-4.0.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e71b34978e77868cbf2d18c5206a4603f9c644dd7181bec5643bd40141d3b8c5", size = 314527, upload-time = "2026-08-17T08:22:54.224Z" }, + { url = "https://files.pythonhosted.org/packages/8e/18/42793917dbab0ea1ff71458aea4875e17a7263f2797b798af048dc81e867/xxhash-4.0.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:488ca5c5e28ef56ec4bbb12f835b3f1cbecc5f3510062e70117bc6594851932a", size = 299199, upload-time = "2026-08-17T08:23:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/37/60/51dc92443923d8e908d5614f1145d8d696450f9d6c8f1abe243c6f2a0222/xxhash-4.0.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:421b94f3ba7067958d02e38960d987756347aa150df06df11aa68ae1af78c619", size = 531967, upload-time = "2026-08-17T08:36:18.66Z" }, + { url = "https://files.pythonhosted.org/packages/88/c5/d0de77de09661fac71742c4155b1cd65e274f7cc277819d702b6c8ff2db5/xxhash-4.0.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f33cf0baa91eccd2cb7b62bf00f10c2264ef578b71dd33a12962e71a36eb4d32", size = 278764, upload-time = "2026-08-17T08:22:58.15Z" }, + { url = "https://files.pythonhosted.org/packages/08/9a/589929c655aba1bfb2c41ee03e50eec1547c39c3042a66bda9c173a9614b/xxhash-4.0.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:23a4376b4a3183cb50d4d2a3179f887a7773cc695eb2c908e551bec3221b8c60", size = 359876, upload-time = "2026-08-17T08:35:40.35Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a8/c1d8c94d54d91db2215565f4b4151c1593af3e6d27ac4c00fd1e8d714a02/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:38c3d22129a6958846a3098d68bc8e661704461c0be4793ae28836e4690c8478", size = 293548, upload-time = "2026-08-17T08:23:54.951Z" }, + { url = "https://files.pythonhosted.org/packages/8b/67/85d8abca94508a4dd10561d9dea3e6e68843c6986dd6d9c1b3729c8622e4/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:87cbdec1a7dd930079671a60b249f3ca4e773e6fbd0676e21e36fdc9dd0f3b00", size = 318780, upload-time = "2026-08-17T08:36:17.623Z" }, + { url = "https://files.pythonhosted.org/packages/1b/16/2b920ed456b9cdcfc99ddc20c3afe42f9f807ee5850773c12fd891f3c08d/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:6cbf4e21ef0890804b5bb9ad25c48f9c127758d7f6c66bef374efcacc63c738a", size = 277582, upload-time = "2026-08-17T08:22:57.156Z" }, + { url = "https://files.pythonhosted.org/packages/fa/cc/5811b5997aebb8452047f5800d32fc50eaa29d0ba08d4e426f84450b9c2f/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:c101180495cb4ba3617b279a944345c53a5e73b0c150053d1fa8d8af32de9579", size = 295116, upload-time = "2026-08-17T08:23:40.868Z" }, + { url = "https://files.pythonhosted.org/packages/2d/dc/c2f3f9c2f4d6aadb79f17a9f1c9a7ee82638cc873680da044cf29537d2ee/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:c0e6ccc2b19ec8a726b2e26062ac71ea63e15500d6bf85910e42481844fdffc1", size = 347065, upload-time = "2026-08-17T08:36:21.618Z" }, + { url = "https://files.pythonhosted.org/packages/a2/4c/750cc642c92252e10772ec09e1a1d995581ba4c3ceb24f6e2d57c7ce47ca/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:8bcba9456242ebf180a04d9443812fd85ffe6bd12bda464dd116fcece8886ff3", size = 497208, upload-time = "2026-08-17T08:23:17.88Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2d/58693cb13d6395f39b6b9bb40c5e0db53a5df7c9fce805aa7e792f64a1a5/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:83b8c2013edb5dc1f9e7268b6496130705bc48d79c86bb8817b3d210b81a5513", size = 274338, upload-time = "2026-08-17T08:35:44.062Z" }, + { url = "https://files.pythonhosted.org/packages/4a/08/9aa9787586d9b3e92d63343ce7dc24f0f445fd9e74ff5d6e85dd82233df5/xxhash-4.0.1-cp315-cp315t-win32.whl", hash = "sha256:aa6ccc7f31018484d652cf52db020003433f3c9fa83189c028bd807d2adde503", size = 35471, upload-time = "2026-08-17T08:24:05.795Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ab/4615789c333bee331ac417885c50105715eeb8244bfc68d2bc37dcfd63ca/xxhash-4.0.1-cp315-cp315t-win_amd64.whl", hash = "sha256:daade8936c4deaaf7b01561324ce438ba4f885d717e9adc62b4d67212ad7d7bd", size = 37488, upload-time = "2026-08-17T08:36:19.929Z" }, + { url = "https://files.pythonhosted.org/packages/fb/81/49f718beb0c55d0411bc4bd90b50a3fbe5863a0e97a2f4d11682ba13d298/xxhash-4.0.1-cp315-cp315t-win_arm64.whl", hash = "sha256:f00330ac7e24769e2032203f2b01794d670916b0c1799fd261340f1af9499875", size = 34590, upload-time = "2026-08-17T08:23:19.597Z" }, + { url = "https://files.pythonhosted.org/packages/86/79/9127ff42a887a348dc4ce3211cf1a962836887adee6f57078132bfba78b4/xxhash-4.0.1-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:ff48915bf1871a1f19f74c11834c6329443d306cedc0c05fe7fe617810422a80", size = 31836, upload-time = "2026-08-17T08:36:28.261Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e6/f238693bfdd642adb59c99683964d46d9947fe721ff44d3bd850ae675407/xxhash-4.0.1-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:4a76345f5aceb4ec404918edf9c7f2b5507db864dc0d7455982009ac0890b57b", size = 34453, upload-time = "2026-08-17T08:23:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/40/4b/796ace33cdfb75c91ba6d11615c3bd436355b9f3103e05865bbee9abce57/xxhash-4.0.1-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:31d86f9e81f3e84e00131ac7c54caf5119ae4ddd82c09c31cff597c813ce1ee2", size = 38488, upload-time = "2026-08-17T08:23:59.901Z" }, + { url = "https://files.pythonhosted.org/packages/ad/23/2d549e5d5d7759eaf9ac2d2d2ab81ff60f1bb2b52cdaae8e5ec5c6524354/xxhash-4.0.1-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deca2a30d983d240b8375ec2ee0a4288e72042827fc61df2f7671f8467e4cb2f", size = 38206, upload-time = "2026-08-17T08:36:32.193Z" }, + { url = "https://files.pythonhosted.org/packages/79/98/1ee576b27f78e6107ee4ea8ac03e8a52888dff256e57d560f8282c195563/xxhash-4.0.1-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:7c343ee174d417a44d0c3355602c0cbbfa52a04d1bbbf1723378c7d2c8f60626", size = 37127, upload-time = "2026-08-17T08:23:42.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c5/8b528f4a394a1eabfd5d8b4271f24fff67fa1aebe58bdd3c64967662e6fe/xxhash-4.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:26fe6238c2d5b11ed5063b9bf4eb290624b004fd074688da6bb079bd564f10d7", size = 36450, upload-time = "2026-08-17T08:35:59.217Z" }, + { url = "https://files.pythonhosted.org/packages/b6/03/909926dcedb64ceee629e18d8dffa758f9d3fdbe01e25530ce2bf0eaf9d0/xxhash-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e53926e76131a74e79cc0b39fa712c227875f180afc68646bd1e1d8a17e60313", size = 33467, upload-time = "2026-08-17T08:24:12.924Z" }, + { url = "https://files.pythonhosted.org/packages/13/b5/ad50456fbfed07f29169bc3fd34e70cbee306a88c17d1a1141a7638de0ee/xxhash-4.0.1-pp310-pypy310_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0718ad66f4ded2411f8e62bdba549ee71e313a2d26ef5060ca3fdbf29897dd3c", size = 48048, upload-time = "2026-08-17T08:36:30.847Z" }, + { url = "https://files.pythonhosted.org/packages/33/c4/83cfe6b591a3067ab3f1339931c91211a8b3864d0ea76ad8184f0c1b0515/xxhash-4.0.1-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2200b98a805351cb3142ae4e1fdcc9e91b5e20f5d30d4862b0b96f92558f4e", size = 42719, upload-time = "2026-08-17T08:23:53.581Z" }, + { url = "https://files.pythonhosted.org/packages/20/2e/0f654f2831abba09d502751e38816759086dd92749501b128b7c3676ea87/xxhash-4.0.1-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea5ecf800b45bdb34afe05a1d0dae1f8ea02a290e50636dccd399063f6b180f8", size = 39477, upload-time = "2026-08-17T08:24:03.735Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d4/375b9e4b719ee70e0a6d9e98e2b60aab09efd59f46c7871a112a2e6b0fcb/xxhash-4.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce6d5cc94a50291d080259a126cbf1e9ba4ac861e6429d2f3cdbb1474f51945d", size = 37244, upload-time = "2026-08-17T08:36:35.452Z" }, + { url = "https://files.pythonhosted.org/packages/ea/4f/e0648288a17d0d1084ca4f7bef206097831988fc86af74aa1dff8f1fbd68/xxhash-4.0.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:554f87034635bcec47c5d72447bf3db7e02da1bf493a0ada010db28a76f891c6", size = 36333, upload-time = "2026-08-17T08:23:52.913Z" }, + { url = "https://files.pythonhosted.org/packages/22/15/34b7f72e9b5a8bfd7e6178de9e1e342bc3de9f07111a5ae26c00506d9edf/xxhash-4.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3c2445edafc300cc40feb6a25a8356a971c30cd0bf47b5349c2ad74c508343b1", size = 33519, upload-time = "2026-08-17T08:36:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/06/4b/e0af324ccf701bf84a7a060bef11c915d45d9e3c5b9caf5b94d62ecb040b/xxhash-4.0.1-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bdd16718b63aa3ebd68aabb79021a40e47c81374852d41a306b9453141bbcbee", size = 47995, upload-time = "2026-08-17T08:24:14.335Z" }, + { url = "https://files.pythonhosted.org/packages/59/46/cc7130e6ca6b41ab72eb6a03177b933c7c74145545c99a8610ecc208c449/xxhash-4.0.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b99ebaf9e816ac5069423b1367ee7e8078fbcebcf62545506bb0608d2f4f468", size = 42725, upload-time = "2026-08-17T08:36:34.144Z" }, + { url = "https://files.pythonhosted.org/packages/1c/24/4f26ff9a7dd0998f6d1036bdddef7ce3e78972a74f7fffa7967e7bc3b7e4/xxhash-4.0.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f484ed57bb3e4142f9d6439568658c38be5f94b702ba00a1ff32c69783b6c66d", size = 39532, upload-time = "2026-08-17T08:23:57.556Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f3/1ac078fc8fceadcf066469acecacb35d2821cbfaf7d6fc5ac2107c7a314d/xxhash-4.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fac4832b638000106207bc44e44b9616a6a416aaee56c62b01d61f3705e49f58", size = 37252, upload-time = "2026-08-17T08:24:06.652Z" }, ] [[package]] name = "yarl" -version = "1.24.2" +version = "1.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/12/1e8f37460ea0f7eb59c221fdaf0ed75e7ac43e97f8093b9c6f411df50a78/yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8", size = 210798, upload-time = "2026-05-19T21:31:05.599Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/df/f1c7a3de0831cd83194f1a85c5bb431b13f81e6b45079314c86d1c4ef3f2/yarl-1.24.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5249a113065c2b7a958bc699759e359cd61cfc81e3069662208f48f191b7ed12", size = 129057, upload-time = "2026-05-19T21:27:47.564Z" }, - { url = "https://files.pythonhosted.org/packages/48/41/7daafb32dd7562bf45b1ce56562e7e1a9146f6479b6456873eb8a3413c40/yarl-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4425fa244fbf530b006d0c5f79ce920114cfff5b4f5f6056e669f8e160fdc0", size = 91545, upload-time = "2026-05-19T21:27:50.089Z" }, - { url = "https://files.pythonhosted.org/packages/a8/8f/7b3ec212f1ea0683f55f978e3246bc313c38818664edfc97a9f349a4901e/yarl-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15c0b5e49d3c44e2a0b93e6a49476c5edad0a7686b92c395765a7ea775572a75", size = 91380, upload-time = "2026-05-19T21:27:51.953Z" }, - { url = "https://files.pythonhosted.org/packages/8a/1b/8bafab7db23b0567ae9db749099b329d91e3b82bc6028b2050ba583e116c/yarl-1.24.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:246d32a53a947c8f0189f5d699cbd4c7036de45d9359e13ba238d1239678c727", size = 105957, upload-time = "2026-05-19T21:27:53.98Z" }, - { url = "https://files.pythonhosted.org/packages/7f/77/21030c2f8d21d21559719beafc772ada2014be933418ed1eaed9cc800e42/yarl-1.24.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:64480fb3e4d4ed9ed71c48a91a477384fc342a50ca30071d2f8a88d51d9c9413", size = 97242, upload-time = "2026-05-19T21:27:55.981Z" }, - { url = "https://files.pythonhosted.org/packages/50/d8/f9ea63d1b6aa910a866e089d871fff6cbd49caab29b86b35221a62dfa0d5/yarl-1.24.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:349de4701dc3760b6e876628423a8f147ef4f5599d10aba1e10702075d424ed9", size = 114719, upload-time = "2026-05-19T21:27:58.037Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a3/04e0ee98ac58a249ea7ed75223f5f901ba81a834f0b4921b58e5cec11757/yarl-1.24.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d162677af8d5d3d6ebab8394b021f4d041ac107a4b705873148a77a49dc9e1b2", size = 112140, upload-time = "2026-05-19T21:27:59.618Z" }, - { url = "https://files.pythonhosted.org/packages/02/ad/0b9cc9f38a7324a7eb1d80f834eaa5283d17e9271bbda3186e598dddaeac/yarl-1.24.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5f5c6ec23a9043f2d139cc072f53dd23168d202a334b9b2fda8de4c3e890d90", size = 106721, upload-time = "2026-05-19T21:28:02.586Z" }, - { url = "https://files.pythonhosted.org/packages/65/e7/a52478ebfc66ec989e085c6ae038b9f1bfa4190baa193b133b669c709e2f/yarl-1.24.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:60de6742447fbbf697f16f070b8a443f1b5fe6ca3826fbef9fe70ecd5328e643", size = 106478, upload-time = "2026-05-19T21:28:04.523Z" }, - { url = "https://files.pythonhosted.org/packages/04/d8/5508530fea8472542de00013ae280765fc938ee196fc4030c43a498afb36/yarl-1.24.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acf93187c3710e422368eb768aee98db551ec7c85adc250207a95c16548ab7ac", size = 105423, upload-time = "2026-05-19T21:28:06.515Z" }, - { url = "https://files.pythonhosted.org/packages/84/f1/ece28505e9628e8b756e11bb4f28864a17cc33b6b44db4d2aaf0622bf630/yarl-1.24.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f4b0352fd41fd34b6651934606268816afd6914d09626f9bcbbf018edb0afb3f", size = 99878, upload-time = "2026-05-19T21:28:08.637Z" }, - { url = "https://files.pythonhosted.org/packages/3f/52/fb5d34529b46dd84013afcfb30b8d2bc2832ed03d412736f577d604fa393/yarl-1.24.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6b208bb939099b4b297438da4e9b25357f0b1c791888669b963e45b203ea9f36", size = 114025, upload-time = "2026-05-19T21:28:10.64Z" }, - { url = "https://files.pythonhosted.org/packages/43/f0/ff9d31aaab024f7a251c0ed308a98ae29bf9f7dc344e78f28b1322431ca2/yarl-1.24.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4b85b8825e631295ff4bc8943f7471d54c533a9360bbe15ebb38e018b555bb8a", size = 105613, upload-time = "2026-05-19T21:28:12.784Z" }, - { url = "https://files.pythonhosted.org/packages/31/7d/3296fb3f3ecd52bf9ae6c16b0895c1cda7e9170a2083861552b683f70264/yarl-1.24.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e26acf20c26cb4fefc631fdb75aca2a6b8fa8b7b5d7f204fb6a8f1e63c706f53", size = 111665, upload-time = "2026-05-19T21:28:14.393Z" }, - { url = "https://files.pythonhosted.org/packages/1a/74/77aa6ddaca4fbf42e45e675a465c43956dd40702281049975a2aa04eae59/yarl-1.24.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:819ca24f8eafcfb683c1bd5f44f2f488cea1274eb8944731ffd2e1f10f619342", size = 106914, upload-time = "2026-05-19T21:28:15.893Z" }, - { url = "https://files.pythonhosted.org/packages/d8/02/7611f22cd1d4ed7373eb7f9ee21fde1046edba2e7c0e514880d760352f48/yarl-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:5cb0f995a901c36be096ccbf4c673591c2faabbe96279598ffaec8c030f85bf4", size = 92658, upload-time = "2026-05-19T21:28:17.471Z" }, - { url = "https://files.pythonhosted.org/packages/91/00/671d0add79938127292839ae44506ce2f7fe8909c72d5a931864f128fd0b/yarl-1.24.2-cp310-cp310-win_arm64.whl", hash = "sha256:f408eace7e22a68b467a0562e0d27d322f91fe3eaaa6f466b962c6cfaea9fa39", size = 87887, upload-time = "2026-05-19T21:28:19.021Z" }, - { url = "https://files.pythonhosted.org/packages/c5/c5/1ce244152ff2839645e7cae92f90e7bafcb2c52bea7ff586ac714f14f5df/yarl-1.24.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1", size = 128971, upload-time = "2026-05-19T21:28:20.543Z" }, - { url = "https://files.pythonhosted.org/packages/87/5a/00f36967203ed89cb3acd2c8ed526cc3fed9418eb70ce128160a911c8499/yarl-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a97e42c8a2233f2f279ecadd9e4a037bcb5d813b78435e8eedd4db5a9e9708c", size = 91507, upload-time = "2026-05-19T21:28:22.556Z" }, - { url = "https://files.pythonhosted.org/packages/31/d0/1fb0c1cd27288f39f6974da4318c32768d72c9890984541fdf1e2e32a51d/yarl-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d", size = 91343, upload-time = "2026-05-19T21:28:24.092Z" }, - { url = "https://files.pythonhosted.org/packages/03/ce/d4a646508bed2f8dec6435b40166fe9308dd191262033d3f307b2bbcaecd/yarl-1.24.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae", size = 105704, upload-time = "2026-05-19T21:28:25.872Z" }, - { url = "https://files.pythonhosted.org/packages/4b/07/b3278e82d8bc41485bcf6d856cd0433262593de615b1d3dc43bd3f5bead4/yarl-1.24.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a", size = 97281, upload-time = "2026-05-19T21:28:27.352Z" }, - { url = "https://files.pythonhosted.org/packages/17/5b/4cee6e7c92e487bebe7afc797da0aa54a248ab4e776a68fe369ec29665a5/yarl-1.24.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e", size = 114020, upload-time = "2026-05-19T21:28:29.458Z" }, - { url = "https://files.pythonhosted.org/packages/5c/82/111076571545a7d4f9cca3fbd5c6f40615af58642be09f12328f48022468/yarl-1.24.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50", size = 111450, upload-time = "2026-05-19T21:28:31.262Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ec/08f671f69a444d704aeecebf92af659b67b97a869942411d0a578b08c334/yarl-1.24.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003", size = 106384, upload-time = "2026-05-19T21:28:32.856Z" }, - { url = "https://files.pythonhosted.org/packages/e5/86/ce41e7a7a199340b2330d52b60f25c4074b6636dd0e60b1a80d31a9db042/yarl-1.24.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f", size = 106153, upload-time = "2026-05-19T21:28:35.222Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5d/31be8a729531ab3e55ac3e7e5c800be8c89ea98947f418b2f6ea259fb6ee/yarl-1.24.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f", size = 105322, upload-time = "2026-05-19T21:28:36.642Z" }, - { url = "https://files.pythonhosted.org/packages/47/9b/b57afb22b386ae87ac9940f09878b98d8c333f89113e6fc96fcf4ca9eb64/yarl-1.24.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294", size = 99057, upload-time = "2026-05-19T21:28:38.386Z" }, - { url = "https://files.pythonhosted.org/packages/a3/4f/06348c27c8389256c313e8a57d796808fc0264c915dd5e7cfd3c0e314dc7/yarl-1.24.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2", size = 113502, upload-time = "2026-05-19T21:28:40.091Z" }, - { url = "https://files.pythonhosted.org/packages/5f/1c/284f307b298e4a17b7943b07d9d7ecc4151537f8d137ba51f3bb6c31ca20/yarl-1.24.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c", size = 105253, upload-time = "2026-05-19T21:28:41.987Z" }, - { url = "https://files.pythonhosted.org/packages/c8/bf/0de123bec8619e45c80cbded9085f61b5b4a9eddb8abe6d25d28ee1ec866/yarl-1.24.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b", size = 111345, upload-time = "2026-05-19T21:28:43.93Z" }, - { url = "https://files.pythonhosted.org/packages/90/af/0248eb065e51129d2a9b2436cd1b5c772c19a6b04e5b6a186955671e3319/yarl-1.24.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5", size = 106558, upload-time = "2026-05-19T21:28:45.806Z" }, - { url = "https://files.pythonhosted.org/packages/21/3c/f960d7a65ef97d8ba9b424fb5128796a4bc710fc6df2ddbbd7dfdc3bbd20/yarl-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:f8fdbcff8b2c7c9284e60c196f693588598ddcee31e11c18e14949ce44519d45", size = 92808, upload-time = "2026-05-19T21:28:48.465Z" }, - { url = "https://files.pythonhosted.org/packages/03/1a/49fb03750e4de4d2284cd5b885a383133c34eef45bd59631b2bb8b7e81e8/yarl-1.24.2-cp311-cp311-win_arm64.whl", hash = "sha256:b32c37a7a337e90822c45797bf3d79d60875cfcccd3ecc80e9f453d87026c122", size = 87610, upload-time = "2026-05-19T21:28:50.07Z" }, - { url = "https://files.pythonhosted.org/packages/f0/da/866bcb01076ba49d2b42b309867bed3826421f1c479655eb7a607b44f20b/yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8", size = 129957, upload-time = "2026-05-19T21:28:51.695Z" }, - { url = "https://files.pythonhosted.org/packages/bf/1d/fcefb70922ea2268a8971d8e5874d9a8218644200fb8465f1dcad55e6851/yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2", size = 92164, upload-time = "2026-05-19T21:28:53.242Z" }, - { url = "https://files.pythonhosted.org/packages/29/b6/170e2b8d4e3bc30e6bfdcca53556537f5bf595e938632dfcb059311f3ff6/yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d", size = 91688, upload-time = "2026-05-19T21:28:54.865Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a5/c9f655d5553ea0b99fdac9d6a99ad3f9b3e73b8e5758bb46f58c9831f74c/yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035", size = 102902, upload-time = "2026-05-19T21:28:56.963Z" }, - { url = "https://files.pythonhosted.org/packages/5d/bc/6b9664d815d79af4ee553337f9d606c56bbf269186ada9172de45f1b5f60/yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576", size = 97931, upload-time = "2026-05-19T21:28:58.56Z" }, - { url = "https://files.pythonhosted.org/packages/98/ec/32ba48acae30fecd60928f5791188b80a9d6ee3840507ffda29fecd37b71/yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8", size = 111030, upload-time = "2026-05-19T21:29:00.148Z" }, - { url = "https://files.pythonhosted.org/packages/82/5a/6f4cd081e5f4934d2ae3a8ef4abe3afacc010d26f0035ee91b35cd7d7c37/yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7", size = 110392, upload-time = "2026-05-19T21:29:02.155Z" }, - { url = "https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c", size = 105612, upload-time = "2026-05-19T21:29:04.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/80/264ab684f181e1a876389374519ff05d10248725535ae2ac4e8ac4e563d6/yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d", size = 104487, upload-time = "2026-05-19T21:29:06.491Z" }, - { url = "https://files.pythonhosted.org/packages/41/07/efabe5df87e96d7ad5959760b888344be48cd6884db127b407c6b5503adc/yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db", size = 102333, upload-time = "2026-05-19T21:29:08.267Z" }, - { url = "https://files.pythonhosted.org/packages/44/0c/bcf7c42603e1009295f586d8890f2ba032c8b53310e815adf0a202c73d9f/yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712", size = 99025, upload-time = "2026-05-19T21:29:10.682Z" }, - { url = "https://files.pythonhosted.org/packages/4f/82/84482ab1a57a0f21a08afe6a7004c61d741f8f2ecc3b05c321577c612164/yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996", size = 110507, upload-time = "2026-05-19T21:29:12.954Z" }, - { url = "https://files.pythonhosted.org/packages/c4/8d/a546ba1dfe1b0f290e05fef145cd07614c0f15df1a707195e512d1e39d1d/yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b", size = 103719, upload-time = "2026-05-19T21:29:14.893Z" }, - { url = "https://files.pythonhosted.org/packages/1a/b6/267f2a09213138473adfce6b8a6e17791d7fee70bd4d9003218e4dec58b0/yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c", size = 110438, upload-time = "2026-05-19T21:29:16.485Z" }, - { url = "https://files.pythonhosted.org/packages/48/2d/1c8d89c7c5f9cad9fb2902445d94e2ab1d7aa35de029afbb8ae95c42d00f/yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1", size = 105719, upload-time = "2026-05-19T21:29:18.367Z" }, - { url = "https://files.pythonhosted.org/packages/a7/25/722e3b93bd687009afb2d59a35e13d30ddd8f80571445bb0c4e4ce26ec66/yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad", size = 92901, upload-time = "2026-05-19T21:29:20.014Z" }, - { url = "https://files.pythonhosted.org/packages/39/47/4486ccfb674c04854a1ef8aa77868b6a6f765feaf69633409d7ca4f02cb8/yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30", size = 87229, upload-time = "2026-05-19T21:29:22.1Z" }, - { url = "https://files.pythonhosted.org/packages/82/62/fcf0ce677f17e5c471c06311dd25964be38a4c586993632910d2e75278bc/yarl-1.24.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536", size = 128978, upload-time = "2026-05-19T21:29:23.83Z" }, - { url = "https://files.pythonhosted.org/packages/d3/58/8e63299bb71ed61a834121d9d3fe6c9fcf2a6a5d09754ff4f20f2d20baf5/yarl-1.24.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e89418f65eda18f99030386305bd44d7d504e328a7945db1ead514fbe03a0607", size = 91733, upload-time = "2026-05-19T21:29:25.375Z" }, - { url = "https://files.pythonhosted.org/packages/c1/24/16748d5dab6daec8b0ed81ccec639a1cded0f18dcc62a4f696b4fe366c37/yarl-1.24.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1", size = 91113, upload-time = "2026-05-19T21:29:26.928Z" }, - { url = "https://files.pythonhosted.org/packages/1b/66/b63fff7b71211e866624b21432d5943cbb633eb0c2872d9ee3070648f22c/yarl-1.24.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986", size = 103899, upload-time = "2026-05-19T21:29:28.842Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ac/ba1974b8533909636f7733fe86cf677e3619527c3c2fa913e0ea89c48757/yarl-1.24.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488", size = 97862, upload-time = "2026-05-19T21:29:31.086Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a5/123ac993b5c2ba6f554a140305620cb8f150fa543711bbc49be3ec0a65a4/yarl-1.24.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b", size = 111060, upload-time = "2026-05-19T21:29:32.657Z" }, - { url = "https://files.pythonhosted.org/packages/23/37/c472d3af3509688392134a88a825276770a187f1daa4de3f6dc0a327a751/yarl-1.24.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592", size = 110613, upload-time = "2026-05-19T21:29:34.379Z" }, - { url = "https://files.pythonhosted.org/packages/df/88/09c28dad91e662ccfaa1b78f1c57badde74fc9d0b23e74aef644750ecd73/yarl-1.24.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617", size = 107012, upload-time = "2026-05-19T21:29:36.216Z" }, - { url = "https://files.pythonhosted.org/packages/07/ab/9d4f69d571a94f4d112fa7e2e007200f5a54d319f58c82ac7b7baa61f5c6/yarl-1.24.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92", size = 105887, upload-time = "2026-05-19T21:29:38.746Z" }, - { url = "https://files.pythonhosted.org/packages/8e/9a/000b2b66c0d772a499fc531d21dab92dfeb73b640a12eed6ba89f49bb2d0/yarl-1.24.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a", size = 103620, upload-time = "2026-05-19T21:29:40.368Z" }, - { url = "https://files.pythonhosted.org/packages/41/7c/7c1050f73450fbdaa3f0c72017059f00ce5e13366692f3dba25275a1083d/yarl-1.24.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44", size = 100599, upload-time = "2026-05-19T21:29:42.66Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b1/29e5756b3926705f5f6089bd5b9f50a56eaac550da6e260bf713ead44d04/yarl-1.24.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a", size = 110604, upload-time = "2026-05-19T21:29:44.632Z" }, - { url = "https://files.pythonhosted.org/packages/a3/4b/8415bc96e9b150cde942fbac9a8182985e58f40ce5c54c34ed015407d3ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf", size = 105161, upload-time = "2026-05-19T21:29:46.755Z" }, - { url = "https://files.pythonhosted.org/packages/8b/d4/cde059abfa229553b7298a2eadde2752e723d50aeedaef86ce59da2718ee/yarl-1.24.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056", size = 110619, upload-time = "2026-05-19T21:29:48.972Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2c/d6a6c9a61549f7b6c7e6dc6937d195bcf069582b47b7200dcd0e7b256acf/yarl-1.24.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992", size = 107362, upload-time = "2026-05-19T21:29:51Z" }, - { url = "https://files.pythonhosted.org/packages/92/dd/3ae5fe417e9d1c353a548553326eb9935e76b6b727161563b424cc296df3/yarl-1.24.2-cp313-cp313-win_amd64.whl", hash = "sha256:7d37fb7c38f2b6edab0f845c4f85148d4c44204f52bc127021bd2bc9fdbf1656", size = 92667, upload-time = "2026-05-19T21:29:52.743Z" }, - { url = "https://files.pythonhosted.org/packages/10/cc/a7beb239f78f27fca1b053c8e8595e4179c02e62249b4687ec218c370c50/yarl-1.24.2-cp313-cp313-win_arm64.whl", hash = "sha256:1e831894be7c2954240e49791fa4b50c05a0dc881de2552cfe3ffd8631c7f461", size = 87069, upload-time = "2026-05-19T21:29:54.442Z" }, - { url = "https://files.pythonhosted.org/packages/40/0e/e08087695fc12789263821c5dc0f8dc52b5b17efd0887cacf419f8a43ba3/yarl-1.24.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f9312b3c02d9b3d23840f67952913c9c8721d7f1b7db305289faefa878f364c2", size = 129670, upload-time = "2026-05-19T21:29:56.631Z" }, - { url = "https://files.pythonhosted.org/packages/3a/98/ab4b5ed1b1b5cd973c8a3eb994c3a6aefb6ce6d399e21bb5f0316c33815c/yarl-1.24.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a4f4d6cd615823bfc7fb7e9b5987c3f41666371d870d51058f77e2680fbe9630", size = 91916, upload-time = "2026-05-19T21:29:58.645Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b1/5297bb6a7df4782f7605bffc43b31f5044070935fbbcaa6c705a07e6ac65/yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0c3063e5c0a8e8e62fae6c2596fa01da1561e4cd1da6fec5789f5cf99a8aefd8", size = 91625, upload-time = "2026-05-19T21:30:00.412Z" }, - { url = "https://files.pythonhosted.org/packages/02/a7/45baabfff76829264e623b185cff0c340d7e11bf3e1cd9ea37e7d17934bd/yarl-1.24.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fecd17873a096036c1c87ab3486f1aef7f269ada7f23f7f856f93b1cc7744f14", size = 104574, upload-time = "2026-05-19T21:30:02.544Z" }, - { url = "https://files.pythonhosted.org/packages/f3/40/3a5ab144d3d650ca37d4f4b57e56169be8af3ca34c448793e064b30baaed/yarl-1.24.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a46d1ab4ba4d32e6dc80daf8a28ce0bd83d08df52fbc32f3e288663427734535", size = 97534, upload-time = "2026-05-19T21:30:04.319Z" }, - { url = "https://files.pythonhosted.org/packages/9c/b5/5658fef3681fb5776b4513b052bec750009f47b3a592251c705d75375798/yarl-1.24.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73e68edf6dfd5f73f9ca127d84e2a6f9213c65bdffb736bda19524c0564fcd14", size = 111481, upload-time = "2026-05-19T21:30:05.988Z" }, - { url = "https://files.pythonhosted.org/packages/4c/06/fdcd7dde037f00866dce123ed4ba23dba94beb56fc4cf561668d27be37f2/yarl-1.24.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a296ca617f2d25fbceafb962b88750d627e5984e75732c712154d058ae8d79a3", size = 111529, upload-time = "2026-05-19T21:30:07.738Z" }, - { url = "https://files.pythonhosted.org/packages/c2/53/d81269aaafccea0d33396c03035de997b743f11e648e6e27a0df99c72980/yarl-1.24.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51b2cf5ec89a8b8470177641ed62a3ba22d74e1e898e06ad53aa77972487208", size = 107338, upload-time = "2026-05-19T21:30:09.713Z" }, - { url = "https://files.pythonhosted.org/packages/ae/04/23049463f729bd899df203a7960505a75333edd499cda8aa1d5a82b64df5/yarl-1.24.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:310fc687f7b2044ec54e372c8cbe923bb88f5c37bded0d3079e5791c2fc3cf50", size = 106147, upload-time = "2026-05-19T21:30:11.365Z" }, - { url = "https://files.pythonhosted.org/packages/14/18/04a4b5830b43ed5e4c5015b40e9f6241ad91487d71611061b4e111d6ac80/yarl-1.24.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:297a2fe352ecf858b30a98f87948746ec16f001d279f84aebdbd3bd965e2f1bd", size = 104272, upload-time = "2026-05-19T21:30:12.978Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f7/8cffdf319aee7a7c1dbd07b61d91c3e3fda460c7a93b5f93e445f3806c4c/yarl-1.24.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2a263e76b97bc42bdcd7c5f4953dec1f7cd62a1112fa7f869e57255229390d67", size = 99962, upload-time = "2026-05-19T21:30:15.001Z" }, - { url = "https://files.pythonhosted.org/packages/d7/39/b3cce3b7dbef64ac700ad4cea156a207d01bede0f507587616c364b5468e/yarl-1.24.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:822519b64cf0b474f1a0aaef1dc621438ea46bb77c94df97a5b4d213a7d8a8b1", size = 111063, upload-time = "2026-05-19T21:30:16.683Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ea/100818505e7ebf165c7242ff17fdf7d9fee79e27234aeca871c1082920d7/yarl-1.24.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b6067060d9dc594899ba83e6db6c48c68d1e494a6dab158156ed86977ca7bcb1", size = 105438, upload-time = "2026-05-19T21:30:18.769Z" }, - { url = "https://files.pythonhosted.org/packages/8f/d2/e075a0b32aa6625087de9e653087df0759fed5de4a435fef594181102a77/yarl-1.24.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0063adad533e57171b79db3943b229d40dfafeeee579767f96541f106bac5f1b", size = 111458, upload-time = "2026-05-19T21:30:21.024Z" }, - { url = "https://files.pythonhosted.org/packages/e6/5c/ceea7ba98b65c8eb8d947fdc52f9bedfcd43c6a57c9e3c90c17be8f324a3/yarl-1.24.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ee8e3fb34513e8dc082b586ef4910c98335d43a6fab688cd44d4851bacfce3e8", size = 107589, upload-time = "2026-05-19T21:30:23.412Z" }, - { url = "https://files.pythonhosted.org/packages/fa/d9/5582d57e2b2db9b85eb6663a22efdd78e08805f3f5389566e9fcad254d1b/yarl-1.24.2-cp314-cp314-win_amd64.whl", hash = "sha256:afb00d7fd8e0f285ca29a44cc50df2d622ff2f7a6d933fa641577b5f9d5f3db0", size = 94424, upload-time = "2026-05-19T21:30:25.425Z" }, - { url = "https://files.pythonhosted.org/packages/92/10/7dc07a0e22806a9280f42a57361395506e800c64e22737cd7b0886feab42/yarl-1.24.2-cp314-cp314-win_arm64.whl", hash = "sha256:68cf6eacd6028ef1142bc4b48376b81566385ca6f9e7dde3b0fa91be08ffcb57", size = 88690, upload-time = "2026-05-19T21:30:27.623Z" }, - { url = "https://files.pythonhosted.org/packages/9e/13/d5b8e2c8667db955bcb3de233f18798fefe7edf1d7429c2c9d4f9c401114/yarl-1.24.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:221ce1dd921ac4f603957f17d7c18c5cc0797fbb52f156941f92e04605d1d67b", size = 136248, upload-time = "2026-05-19T21:30:29.297Z" }, - { url = "https://files.pythonhosted.org/packages/de/46/a4a97c05c9c9b8fd266bb2a0df12992c7fbd02391eb9640583411b6dab32/yarl-1.24.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5f3224db28173a00d7afacdee07045cc4673dfab2b15492c7ae10deddbece761", size = 95084, upload-time = "2026-05-19T21:30:31.031Z" }, - { url = "https://files.pythonhosted.org/packages/95/b2/845cf2074a015e6fe0d0808cf1a2d9e868386c4220d657ebd8302b199043/yarl-1.24.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c557165320d6244ebe3a02431b2a201a20080e02f41f0cfa0ccc47a183765da8", size = 95272, upload-time = "2026-05-19T21:30:33.062Z" }, - { url = "https://files.pythonhosted.org/packages/fe/16/e69d4aa244aef45235ddfebc0e04036a6829842bc5a6a795aedc6c998d23/yarl-1.24.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:904065e6e85b1fa54d0d87438bd58c14c0bad97aad654ad1077fd9d87e8478ed", size = 101497, upload-time = "2026-05-19T21:30:34.842Z" }, - { url = "https://files.pythonhosted.org/packages/15/94/c07107715d621076863ee88b3ddf183fa5e9d4aba5769623c9979828410a/yarl-1.24.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cec2a38d70edc10e0e856ceda886af5327a017ccbde8e1de1bd44d300357543", size = 94002, upload-time = "2026-05-19T21:30:37.724Z" }, - { url = "https://files.pythonhosted.org/packages/a9/35/fc1bbdd895b5e4010b8fdd037f7ed3aa289d3863e08231b30231ca9a0815/yarl-1.24.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e7484b9361ed222ee1ca5b4337aa4cbdcc4618ce5aff57d9ef1582fd95893fc0", size = 106524, upload-time = "2026-05-19T21:30:40.196Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f2/32b66d0a4ba47c296cf86d03e2c67bff58399fe6d6d84d5205c04c66cc6d/yarl-1.24.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:84f9670b89f34db07f81e53aee83e0b938a3412329d51c8f922488be7fcc4024", size = 106165, upload-time = "2026-05-19T21:30:41.888Z" }, - { url = "https://files.pythonhosted.org/packages/95/47/37cb5ff50c5e825d4d38e81bb04d1b7e96bf960f7ab89f9850b162f3f114/yarl-1.24.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abb2759733d63a28b4956500a5dd57140f26486c92b2caedfb964ab7d9b79dbf", size = 103010, upload-time = "2026-05-19T21:30:43.985Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/4597912315096f7bb359e46e13bf8b60994fcbb2db29b804c0902ef4eff5/yarl-1.24.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:081c2bf54efe03774d0311172bc04fedf9ca01e644d4cd8c805688e527209bdc", size = 101128, upload-time = "2026-05-19T21:30:46.291Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d5/c8e86e120521e646013d02a8e3b8884392e28494be8f392366e50d208efc/yarl-1.24.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:86746bef442aa479107fe28132e1277237f9c24c2f00b0b0cf22b3ee0904f2bb", size = 101382, upload-time = "2026-05-19T21:30:48.085Z" }, - { url = "https://files.pythonhosted.org/packages/fa/98/70b229236118f89dbeb739b76f10225bbf53b5497725502594c9a01d699a/yarl-1.24.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:2d07d21d0bc4b17558e8de0b02fbfdf1e347d3bb3699edd00bb92e7c57925420", size = 95964, upload-time = "2026-05-19T21:30:49.785Z" }, - { url = "https://files.pythonhosted.org/packages/87/f8/56c386981e3c8648d279fdef2397ffec577e8320fd5649745e34d54faeb7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4fb1ac3fc5fecd8ae7453ea237e4d22b49befa70266dfe1629924245c21a0c7f", size = 106204, upload-time = "2026-05-19T21:30:51.862Z" }, - { url = "https://files.pythonhosted.org/packages/1a/1e/765afe97811ca35933e2a7de70ac57b1997ea2e4ee895719ee7a231fb7e5/yarl-1.24.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4da31a5512ed1729ca8d8aacde3f7faeb8843cde3165d6bcf7f88f74f17bb8aa", size = 101510, upload-time = "2026-05-19T21:30:53.62Z" }, - { url = "https://files.pythonhosted.org/packages/ee/78/393913f4b9039e1edd09ae8a9bbb9d539be909a8abf6d8a2084585bed4b7/yarl-1.24.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:533ded4dceb5f1f3da7906244f4e82cf46cfd40d84c69a1faf5ac506aa65ecbe", size = 105584, upload-time = "2026-05-19T21:30:55.962Z" }, - { url = "https://files.pythonhosted.org/packages/78/87/deb17b7049bbe74ea11a713b86f8f27800cc1c8648b0b797243ebb4830ba/yarl-1.24.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7b3a85525f6e7eeabcfdd372862b21ee1915db1b498a04e8bf0e389b607ff0bd", size = 103410, upload-time = "2026-05-19T21:30:57.962Z" }, - { url = "https://files.pythonhosted.org/packages/8f/be/f9f7594e23b5b93affff0318e4593c1920331bcaefda326cabcad94296a1/yarl-1.24.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a7624b1ca46ca5d7b864ef0d2f8efe3091454085ee1855b4e992314529972215", size = 102980, upload-time = "2026-05-19T21:30:59.735Z" }, - { url = "https://files.pythonhosted.org/packages/65/a4/ba80dccd3593ff1f01051a818694d07b58cb8232677ee9a22a5a1f93a9fc/yarl-1.24.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e434a45ce2e7a947f951fc5a8944c8cc080b7e59f9c50ae80fd39107cf88126d", size = 91219, upload-time = "2026-05-19T21:31:01.934Z" }, - { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576, upload-time = "2026-05-19T21:31:03.909Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/75/16/e8be8e2fb175bbf41a0680381a319f1199fae256588241a2ac8677eafb49/yarl-1.25.1.tar.gz", hash = "sha256:03dd38de09bc213e9a8b29761eec33ee1d5318dac0e49d8af36e4d27830e23a7", size = 246245, upload-time = "2026-09-15T19:35:02.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/92/55fa9ee84cb8ec9930a910b5753936a926f918d8cc8965bdac571479c095/yarl-1.25.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:142c06c4d6a35ee3ec5da08499805e879cb3ca7c1fbfbecb0140fe72403818d6", size = 144695, upload-time = "2026-09-15T19:29:53.114Z" }, + { url = "https://files.pythonhosted.org/packages/16/b4/9edc8e605b16b2eb5bd0c2ccc73e2b15aab583862460767fb43f91f11839/yarl-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24ce942011a61953e7d313438038f4d32ff21387b775f58a957f7a07dd55ef95", size = 104332, upload-time = "2026-09-15T19:29:55.443Z" }, + { url = "https://files.pythonhosted.org/packages/ae/de/4204e6646e278b1cd4a9cf73ebe8b7cfcf16693f1249b324eb273d67602a/yarl-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e23c82b63cd7652fc24d33ed6cc17099d607aa3b4fc4ddc75e95062f3d82df4", size = 104449, upload-time = "2026-09-15T19:29:57.239Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fc/21d74789198ad68a23a209ab0d73fe5a52d39ebbd9945041e72827acdd77/yarl-1.25.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee202350cf57abf0e9502a41601841019c25d3db7ff52d980aaf31446254059", size = 116828, upload-time = "2026-09-15T19:29:59.031Z" }, + { url = "https://files.pythonhosted.org/packages/8f/31/90891ddb61848c067ebd1fb505ab5902a6e7d4707c2f3823f67ff37883d3/yarl-1.25.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5df89f769cc8ff94c3d7e7603386fba309d25ce5240132d26c15baa8d0e96c4c", size = 107150, upload-time = "2026-09-15T19:30:00.868Z" }, + { url = "https://files.pythonhosted.org/packages/a1/15/f3d18743d3688b5f01aa83034b6c00665692ab20e1d0c89a29000d4979ea/yarl-1.25.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:83e9f4a25085bd4b7214701a0794ff1f50fc633ffb8bdfebf07abdd81c2db126", size = 124704, upload-time = "2026-09-15T19:30:03.128Z" }, + { url = "https://files.pythonhosted.org/packages/99/37/718789d8004775d6a2db86b2afc72b1d156e0590b88a1b8634ddd4bdb8ee/yarl-1.25.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e636b64d24fd9c38053c5e389a1174c66361fa49dcfd220f4dd35b4abde7cb89", size = 129246, upload-time = "2026-09-15T19:30:05.014Z" }, + { url = "https://files.pythonhosted.org/packages/28/b9/7818ac6dec7fbcd16be2d19495807c01e2c38834e57d41c63356a75e786b/yarl-1.25.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e5637ca8d0bd7fb72648a6c7934af4baaccb697657f7438c9d264fc2abb8b0b1", size = 118071, upload-time = "2026-09-15T19:30:06.977Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e3/8d098cafb30a64df7283b5a5dd0d32d22a71b18a1b9ec071d0776ffe5c2a/yarl-1.25.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:683e362b8ba453080f7489c66f4ea794e751c35b72e7eab3575ef784c2fbc7fb", size = 116180, upload-time = "2026-09-15T19:30:08.836Z" }, + { url = "https://files.pythonhosted.org/packages/20/9c/fbe9432478d87e00eef80242e15179639df162cb3d5d8d978fc56dcb6c51/yarl-1.25.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:df23df54b5114a17c2d0ef192433e2e5a9f0c5178c32375e90b7cfc965f349d0", size = 116578, upload-time = "2026-09-15T19:30:10.782Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8e/b3dfd03732236b86b0bcf06a72a37de412ff6f82e719a947c3c651d4dece/yarl-1.25.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f53dcd26694f148f738edc052b5a69234833e739f10f4c3287bdfd8ec0f7b326", size = 108886, upload-time = "2026-09-15T19:30:12.951Z" }, + { url = "https://files.pythonhosted.org/packages/83/e1/94dacb650d4963d5f844bc3df7ba70288cb7b68ed5a4d070da71acb19b14/yarl-1.25.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b8075fe90bc08e40b8b8a1874fab42ee4c7b56af05c5886e9cc841397f916908", size = 124098, upload-time = "2026-09-15T19:30:14.963Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3f/c93f76a218258c7bfc60dd27fd56e9102bdbc625517f4a6ee673295fe4e4/yarl-1.25.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a8c2b841478068440d8b733005d13a5ef535b9928cbc05f17182d410f32ba449", size = 115768, upload-time = "2026-09-15T19:30:16.736Z" }, + { url = "https://files.pythonhosted.org/packages/a8/79/4d93f13c3b05cda3c962805dec28cbc255c50239b3457808abc5633a00c2/yarl-1.25.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ca32926d7d77bcc8838425c4c95e040a3ace1cb7dfdae599013458dcda2607ca", size = 122461, upload-time = "2026-09-15T19:30:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8e/e2ba83b3a9bfc1d3b882ad35fa8abc04a7af4d9356f2e329a23d0c8d889d/yarl-1.25.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:192a866877a49993949ef1975864ad8728bea28ee810f6abe1a0729c2b500426", size = 118295, upload-time = "2026-09-15T19:30:21.07Z" }, + { url = "https://files.pythonhosted.org/packages/42/67/cb5ea1baa0c0ac60bda44ce59f601133154af2a2e67722d3517f8793855d/yarl-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:3f4d48a6112712973e676bd792121fee470e432d749177162d9949d5c9460a1b", size = 102929, upload-time = "2026-09-15T19:30:23.122Z" }, + { url = "https://files.pythonhosted.org/packages/2f/85/9a1e98de10fc0e738d517efd2a9984c3e7db6cf35fa72b2b373988a9e9b7/yarl-1.25.1-cp310-cp310-win_arm64.whl", hash = "sha256:48796ea00a303961507dc6c8437c4b325a6fc3f95f7c36c71b91ea9a8150963c", size = 98854, upload-time = "2026-09-15T19:30:25.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/b3/2cea721d495ca57f8f414aa4867ee263f486b274e07463158cf52f02ba7f/yarl-1.25.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d693bf4bf534e9ba3ae2780cfd577f5135629f7b5ac653490859d0b77864865", size = 143794, upload-time = "2026-09-15T19:30:26.946Z" }, + { url = "https://files.pythonhosted.org/packages/55/e6/cd145cff8e5cf60b8b3c41fbecfa2a45028a8dec3fbc52bec03595ff3d3b/yarl-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ab2054c5531af2a9ba7b69b8ec91e4f884420e83a8c5e579b013084cb57e5e5d", size = 103993, upload-time = "2026-09-15T19:30:28.661Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7c/fbb40fe2d53747c40aa36a9e2bd2178a202f942bda0b670f3306d4aefbce/yarl-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:564fdc7085d2245ab84f88882fdb1d6ac0723124bff6ded35bfb1c00f812630d", size = 104010, upload-time = "2026-09-15T19:30:31.069Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0b/5a516f70641092283f57cf3670bdb75e7327bcc0dcb5038697e4dfbfd569/yarl-1.25.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acae6b45d1ace09b6ba3876da43b88366ef368f73b988c7f57e14231753d4420", size = 116444, upload-time = "2026-09-15T19:30:32.894Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/d1a627f827b0a404ae0f5647cab0534959081cde13b0756a783469fb3b5e/yarl-1.25.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1fb2a01ba8cd9c5d2c5dc1ec35e0fc951d04b4f037541d4ac090c993ce58b3d7", size = 107565, upload-time = "2026-09-15T19:30:35.188Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cf/c8e0aaec886840a6c4480fe44eaec7cd4319f79a563b79321473be79c56f/yarl-1.25.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e92b6bcc741b86d67606c40d3cb9c7cc8e6c737f81e31f4a94efc204456c92e3", size = 125006, upload-time = "2026-09-15T19:30:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/50/26/0cce366d54a93cdc8342965dc7663385e4db161625cc1e8b18e786753d24/yarl-1.25.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72c34ac7ad4314c19362d5ce27626dcc8429bd30bbf8c179f4234078851f9492", size = 128717, upload-time = "2026-09-15T19:30:38.904Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/a71501bbc1a674ff72c4d6c2b75f4d9a5af819f5244c3a7558080a8802c5/yarl-1.25.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5add7b4ca7afeea91d52e4d4e4db3b1fe9885b71f07054560d8c4296b7441a2", size = 117728, upload-time = "2026-09-15T19:30:40.809Z" }, + { url = "https://files.pythonhosted.org/packages/e7/6f/c3267ca01defeed9ed9c4ff9b17bd54915432c405945233265b707475d1c/yarl-1.25.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:def538065f9e4d4cf1ae164bd59aba00dfa84f03923e0de4c3788f252d6bcd17", size = 116224, upload-time = "2026-09-15T19:30:42.818Z" }, + { url = "https://files.pythonhosted.org/packages/8f/69/fad57ee52d648431718ee0f1f68966a99c1352c3924688ffbdcc9d3fe51a/yarl-1.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a191bfdb30a79b98e5d175d75285f9fcb78bf0e46ba5efda042e1c72071a0de", size = 116299, upload-time = "2026-09-15T19:30:44.966Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d4/6a8c1e29f33338687ca278cba0a8fbf6525a322c2c02a9a500ccbe041152/yarl-1.25.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:71f42c5b9a948c113bbdebfa544598321431d064ff959d32e99b1feb61d68345", size = 108625, upload-time = "2026-09-15T19:30:46.874Z" }, + { url = "https://files.pythonhosted.org/packages/e8/d2/3a35ae791c9cb6522c106923ff25c3230d999091e5e65511bca23bbd9914/yarl-1.25.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:72849d892954be4d09e569b8b831ac39ce58417fedc767d4308a0fe542018a40", size = 124515, upload-time = "2026-09-15T19:30:49.082Z" }, + { url = "https://files.pythonhosted.org/packages/be/fd/2b022109a6b4af0f7dc371cf7500af380b0d4f034010243e1b0ce218dc93/yarl-1.25.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:efb01a106f971cb3752856bca2318bbdf7f01bd8823779c461586cbe5ffd5258", size = 115711, upload-time = "2026-09-15T19:30:51.208Z" }, + { url = "https://files.pythonhosted.org/packages/18/59/f7586271136c3ddb0126bbfe661844699369b76b555fe38c4efe86870b2e/yarl-1.25.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a1daf47cd95a7c3a63456336bc5aaa8c86dd3a47d07ed3d0e76132ae4666a5a1", size = 122751, upload-time = "2026-09-15T19:30:53.535Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0b/07f7a2d881f7e16c385b47fc1753382600847cad305dcc7fa0c25828acf8/yarl-1.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9489e6abf47ba37f332075a91444c7cfedb03e6ce99fbb2f116bfe1ce810da3b", size = 117983, upload-time = "2026-09-15T19:30:55.277Z" }, + { url = "https://files.pythonhosted.org/packages/aa/9d/8cdceec66a9b940700cb45931741403f045b162afd79bcb93c41cadd0972/yarl-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7306dee25b8a0e737363f347362b875094b4dc4e367311470656ae420fdbf8e", size = 102894, upload-time = "2026-09-15T19:30:57.606Z" }, + { url = "https://files.pythonhosted.org/packages/17/f1/7ec357db1d3ad2863542d71e8fe64a126bbec17b134cd7d30951196809a5/yarl-1.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:abb1384477f5901d436b5d2e5465954de46ea6098f59163d243660b5c4461d35", size = 98609, upload-time = "2026-09-15T19:30:59.705Z" }, + { url = "https://files.pythonhosted.org/packages/75/b3/cd32ac66ae622b854c2df0ac52106dda220d361b65a64fde7d5b3684aa3f/yarl-1.25.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d7aa6debf92a1dd14cb5280b083a764169a13cfb23a452111160274ed989f4", size = 144798, upload-time = "2026-09-15T19:31:01.821Z" }, + { url = "https://files.pythonhosted.org/packages/61/fb/a2c52a8007c2051ba74662afb112ecf3d00346af4c25e33df9d80fd14fb8/yarl-1.25.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83d4a37e4b95da4d8bda930d6d35b75b4cdadbacbb4980cae290ea3100b5d51d", size = 104583, upload-time = "2026-09-15T19:31:04.05Z" }, + { url = "https://files.pythonhosted.org/packages/be/dd/ee38aec8e09fdf957e50d4085453fbe202f56c6c3b4cf07b81cdb4f09ee9/yarl-1.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e029648f9c951db30e98a7d7ec90835db88ec4b32820efe2a9bdc2287e032eb6", size = 104325, upload-time = "2026-09-15T19:31:06.338Z" }, + { url = "https://files.pythonhosted.org/packages/1e/b3/058dbfb1857b484c9cf9cc135659f50b85ce66e03c99e44dc2f7b6161f55/yarl-1.25.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d781294bb815ecb5ea57ff6bbf8038e0a31a95fdf3e1788f66e0dc100d64b58", size = 115358, upload-time = "2026-09-15T19:31:08.593Z" }, + { url = "https://files.pythonhosted.org/packages/db/39/29693446cf0cf6b15a0e2f75a5d40f93c56819b05b0622196f45e95b5cc0/yarl-1.25.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e12c538e00e7c1b286a07061046b90e8124e6a9793efae2c70db6a4aad07faad", size = 107658, upload-time = "2026-09-15T19:31:10.802Z" }, + { url = "https://files.pythonhosted.org/packages/86/b3/3c4dd7e1af43b931fba95e0a722737f2ea94a6d199c802585282831d7abd/yarl-1.25.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e4de3ac4adbad3d0bc7c6f4360a7dbff5de2f15e3b723be3198074e17fd9c40", size = 122660, upload-time = "2026-09-15T19:31:12.84Z" }, + { url = "https://files.pythonhosted.org/packages/bd/b5/1b60dbc3cfc9c5712b15148c206748f2bc93953ffdbe25ea75b63dfc89c9/yarl-1.25.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:419f392a1da624877975709e3864dfe833af6cc7671b39318086d456e288380c", size = 126506, upload-time = "2026-09-15T19:31:15.088Z" }, + { url = "https://files.pythonhosted.org/packages/bc/7b/ca212cbe170ac8b96e45317ecbcf9c3c3ecf0cdec98d5b088a9c4088929b/yarl-1.25.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6f117789d22dce188e5754e8bc65b7e6ebf8cb73963b9fa761f672a5883769d", size = 117050, upload-time = "2026-09-15T19:31:17.241Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c3/72b4938cdbe619ad71ac156182faef4908846b84dc3ca4dbb4c4e6f84014/yarl-1.25.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80e47012e730da131c9f059c80936783f9659aae22dc31c03c0595590d11ed54", size = 114174, upload-time = "2026-09-15T19:31:19.294Z" }, + { url = "https://files.pythonhosted.org/packages/e8/43/268717870f9ba0cc9701a95181587f6dc8c5f387aab4aeecc83158f38a79/yarl-1.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e80f557716fd765439577131e526b8942ffc2c07bdbc5e39fa62f660ba1e963f", size = 114944, upload-time = "2026-09-15T19:31:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/da/84/baa5bf504d51fe062c4bcaf62936da97fffb43285978d0b39984824231fd/yarl-1.25.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f61964f235a43738bfac50da46fc4254943a7eea3051aeb0b6fc7c992c29fadc", size = 108263, upload-time = "2026-09-15T19:31:23.388Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/779a2ed9e0152a601a27039bed9aead3f0b79797a67e2c44bfa444622dd8/yarl-1.25.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e546fe1d4a93ebc2910f0d768baff19faa09843ab3f2036a67ed6e69fae4419d", size = 122184, upload-time = "2026-09-15T19:31:25.343Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1f/118e9e5b8f07694d63fd3222e801d7782270003f1a222aa798df3f8d5933/yarl-1.25.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cce0727fd5ac04d372fa9bbfde9febc2bcf209aadfcf0468e45dec72719895d1", size = 114001, upload-time = "2026-09-15T19:31:27.465Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/a4cf1cf372313734b17996d4007f9f73596e7a178b9485802e5494ecf484/yarl-1.25.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af4ea5b37403ef4e30f3927eaed540db942bde01d8d3ff083527c0704d1c9c68", size = 120565, upload-time = "2026-09-15T19:31:29.47Z" }, + { url = "https://files.pythonhosted.org/packages/05/79/ad94f93ca731bc9e44d321833ab96b82a4f9f5f63cf773f81a4aeea5ecc1/yarl-1.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:68782fdb4027b8d1eee25ec35e9a6db05e863b899eb0310b3a33b6c3fef55707", size = 117060, upload-time = "2026-09-15T19:31:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/bb/cc/51a7b4abf4ac593b8e7eb3794b28e5a35ae26eed8bc04787628d215af82f/yarl-1.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:7d575b54cb3863ef9bc290ea4b009999d55dc237326131e4853cf33e888fee03", size = 102593, upload-time = "2026-09-15T19:31:33.329Z" }, + { url = "https://files.pythonhosted.org/packages/9d/21/0941a6b93a58b59a1ec75e5333bf06929b671309c43c0cd201c172d9c39f/yarl-1.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:bc3ac7bf569f6b64dad04dd7808c7872dae8a97df657856eac05e9b7e3614a85", size = 97697, upload-time = "2026-09-15T19:31:35.855Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/2f3129bbcc9a5c8ba12cc2b29d8060a3bab9c8043c456cfd4b5ca3188890/yarl-1.25.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:25868beca8b6765f8f7d0e11fe6dd7c66dd4b0793b9500286d20cc92352126a5", size = 143623, upload-time = "2026-09-15T19:31:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/f1bc3390fdca352826676b531d0712736f156919090206700421d46b2c37/yarl-1.25.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:10b2fd95332f0d716d5eee3c9fb2ce8eada19082de7fee83d32e37992fd75c26", size = 104011, upload-time = "2026-09-15T19:31:40.25Z" }, + { url = "https://files.pythonhosted.org/packages/a8/aa/50acc5c3e5da04172ae3c281c75405af4d2ca911e16120ab0563f4dffb66/yarl-1.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f12afda4eea8c8994a76d4df1875c765194f5fbe8a9d197929ea303caee29ec", size = 103677, upload-time = "2026-09-15T19:31:42.46Z" }, + { url = "https://files.pythonhosted.org/packages/30/d2/7d1e0ab9f8390e1fbcede5a6dbf70d23c96ad09b8c5567f3a514d1ddb0e2/yarl-1.25.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14b79a30a93a3ce2e8832603fd0ab780ada281b0ba5110b519a634f2d7d7d1fc", size = 115392, upload-time = "2026-09-15T19:31:44.371Z" }, + { url = "https://files.pythonhosted.org/packages/71/e1/5ba1e3a2a22139213655e760919038e8ed7e2d4a99826d0bbddb3beb96e5/yarl-1.25.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bd6340d20ae2c7ca719b87b426e808e90743b676d05d4c26c4fb5ca71f41184", size = 107493, upload-time = "2026-09-15T19:31:46.273Z" }, + { url = "https://files.pythonhosted.org/packages/f5/53/780653d5e0f73831f467cf13548912e5eec97f21dc49fc8daf21da027df4/yarl-1.25.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:126a2533570c554719ca40a1288fdee1700b6bc82e7131aa69fa85252d92e651", size = 122537, upload-time = "2026-09-15T19:31:48.654Z" }, + { url = "https://files.pythonhosted.org/packages/03/92/d54fa70236c6036271c9c9c09fd978df5cbe3ef49ef6c46e9b833476d215/yarl-1.25.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3faadac7d812ddac258feb57b9846b60c1b437c4f4b9ad42595c6f6fe4390df", size = 126170, upload-time = "2026-09-15T19:31:50.872Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b7/a82a49bf88340b837ef6972b508a1604ae377b9e6904b46b10cf5f1cf925/yarl-1.25.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be80550d9bfe83d9b62398a37081a90434e6df2d978ec345c3d2820de6beddab", size = 117012, upload-time = "2026-09-15T19:31:53.189Z" }, + { url = "https://files.pythonhosted.org/packages/ef/78/5d684b411e3f3602464ee9b538db48205038f8605872985f61efb809ced0/yarl-1.25.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e07595c7d6f4db270ceede356a1bd1c07a34f1c26f958d1ed0cd7b48e0d2bba3", size = 114950, upload-time = "2026-09-15T19:31:55.694Z" }, + { url = "https://files.pythonhosted.org/packages/2f/11/51d82b852c64f7fad0fc7a7ff3031517204887e874c722bbca839c0b23ac/yarl-1.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb96ed1ae6c7d072d60840c0434aef07a2df611812810807fbc54263a6053e9a", size = 115428, upload-time = "2026-09-15T19:31:57.966Z" }, + { url = "https://files.pythonhosted.org/packages/e4/49/9d1978049bf646b9ea918313926453c6901b71c92f097467777d47d36a88/yarl-1.25.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3feb99222553a8cbedfa52c2f59dd84c3f50d5b582c728d522caf8d72769a54b", size = 108428, upload-time = "2026-09-15T19:32:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/43/35/7b8f1ebb45d7ec3dda7d1909bf44f458de41ef91e2937f107733582a5166/yarl-1.25.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a2ed0ba415ccdf08f14bf544cb78346d0f76086707ffee24921a2c84dbf1305a", size = 121961, upload-time = "2026-09-15T19:32:02.436Z" }, + { url = "https://files.pythonhosted.org/packages/63/d6/d8b689ab7ca26edeb85f6ff28812aac7a25376eefc1780e303a7bfbaceff/yarl-1.25.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2b49375d22299b0a834c2bca72f39aaecc270d96fb24c30424899676f487b22a", size = 114961, upload-time = "2026-09-15T19:32:04.456Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d5/1a1798ea4dc6b7ee3260010a27907ebc697c95dae99817d817ed446d24aa/yarl-1.25.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ef74070ac553c59eb4f04258722066d6c6135b7baa03b2e9f2da65c096e96d98", size = 120036, upload-time = "2026-09-15T19:32:06.5Z" }, + { url = "https://files.pythonhosted.org/packages/91/8d/b1b35ed7903da6669b1d367cb2c09436acd4ff508029b4f39a0c0c2058fc/yarl-1.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0a66db89ea473abeac4b70523cafd94db3772380e565f9d28af7a179b7af71fa", size = 117276, upload-time = "2026-09-15T19:32:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8f/4db01cef62caff0d7a4593ed694fb8a41a27a11158cab80d290221f13e57/yarl-1.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:1f51020b2eb8a003c84925638ec63c21a750a4bddd3a22ec8eac6a742dadf1b9", size = 101945, upload-time = "2026-09-15T19:32:11.545Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5e/3ce00497c5c0babb74d4130c10c3828ccd215b4819d12020c42429f991ac/yarl-1.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:b10dd0557ba422715b5206b3743192135a6022acca8baec51aa127d0a75db8fe", size = 97270, upload-time = "2026-09-15T19:32:14.127Z" }, + { url = "https://files.pythonhosted.org/packages/80/cf/54023edfab7aa773b860503db0c56e962ccab0922803ee97988c176ea090/yarl-1.25.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a9ca696eb02e5c02a8afd872ada510eba9b7fe6e68b9572c2e9a9b1941e31e2e", size = 143975, upload-time = "2026-09-15T19:32:16.416Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a8/e6c1be0e6761d0f2d10bbf33a3e1e02b99dc83874d92945d7b461a72481e/yarl-1.25.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a5877f2255aab518ebe528289037699201d5dc5f045f2396cb30aa02db22f57f", size = 104018, upload-time = "2026-09-15T19:32:18.364Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bb/dda344765ffd3430afe1a1c66c866a57fae67786537d4f14607df6505ac1/yarl-1.25.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7a5c3115595995779ee21f2567035793911c3802a43c74f3fbb0314929ec67ac", size = 104156, upload-time = "2026-09-15T19:32:20.459Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5f/ed1538bcd06009fe990d6d283dd7667f639e62a81e35c6d8c6ef6c08fb3c/yarl-1.25.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77e5099b99b37f3cf79c246998ca9f7313a78054cd1809ec46bc1afad47e1c4c", size = 116025, upload-time = "2026-09-15T19:32:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/a2/af/2185daf56b99830d3356ecfada46faaa49945de6626e842b7728088d4980/yarl-1.25.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6efaf45df6a849cef613a03a94c845647456662f85438c886bb67a9c027c8c2c", size = 106985, upload-time = "2026-09-15T19:32:24.749Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/bc1ae564fb4b04a30b6a8f250e787772581c57e4c3d5cf07ac3359de3103/yarl-1.25.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5f90e44653c4e0f78501ed9bb7d3fce835a8d62b7c6ed0cb16557534087e743", size = 123030, upload-time = "2026-09-15T19:32:27.084Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3e/e2afcde10d74e53b3fa889960991efb3019beda2b1682a01de720a302056/yarl-1.25.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:632da579b2d879f6bad20f2cfa35ded1efe2f4f77f8abb26a6234a5b236acd2f", size = 126765, upload-time = "2026-09-15T19:32:29.332Z" }, + { url = "https://files.pythonhosted.org/packages/a2/be/415b00c0fe5a0615b062a456b26623d7ec91c2bee20faea1a14045aa0469/yarl-1.25.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:30eec96e8a91bd588ce897c9543f6d5d8d34b28fbcba28a4dedf20ebeae9fe57", size = 117199, upload-time = "2026-09-15T19:32:31.49Z" }, + { url = "https://files.pythonhosted.org/packages/97/27/3d8c63ddd3e8bcfd033748ab93876678ce59bacd66e4cb1ed851c9c5b37e/yarl-1.25.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:12b6bc4906e11f5e1a1cdcb12296e7afbd366c783cc8073403cd2fb74334e453", size = 115187, upload-time = "2026-09-15T19:32:34.137Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/7a81d0be1a502a26a0d4326c6f2ecb736c824f570ea1c6529f2b0b227b50/yarl-1.25.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9d6ed3d17bccce4c05343e1ca8da13bc5c02c812a4e7282ddd05e8769322d3fc", size = 116085, upload-time = "2026-09-15T19:32:36.438Z" }, + { url = "https://files.pythonhosted.org/packages/f0/69/39fff459916aa0fab42215dc47b759586fd80f94aa56dfc4a7c15ba6e0dc/yarl-1.25.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f38a70074041d3b7e138e452799f5174198bae5bd5ab2000917badf403908c5f", size = 107996, upload-time = "2026-09-15T19:32:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/c0/39/80b9a55a3335590451d9ecf3eb593a8c635351f4c905ef056d7e8a8fd9e7/yarl-1.25.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca89e4e21854ed27ec753297dde84b16c9f8e53b14a4866fb44457d643c19f8", size = 122549, upload-time = "2026-09-15T19:32:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/42/7d/a179c6757818bb59372a4adafd09f7f26a3b4a0f04c3ae404b544c0b0c82/yarl-1.25.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:1ab7618921a93767387a4b83776f751588f5b5ae9bb5bc96620e2e2e00bca868", size = 115107, upload-time = "2026-09-15T19:32:43.072Z" }, + { url = "https://files.pythonhosted.org/packages/32/2b/a773ac867e4ab53a98ed98e5cefe3bae31e6f550252ca9d1de266f1a40c5/yarl-1.25.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0ae12ff2b805fa02c4dab838005caef735e39986322698c48588d3beacb65c62", size = 120666, upload-time = "2026-09-15T19:32:45.061Z" }, + { url = "https://files.pythonhosted.org/packages/bc/41/52be6505e85b0f76b4f85b01b5de7e06a0512201abc2c95e14e099549174/yarl-1.25.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90c30ed53546da833c700115c0064c22120d1b1560f474699fd31f22dd668233", size = 117505, upload-time = "2026-09-15T19:32:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/f5/01/349c0386caedbbe488d519f252df54efac8a1459282d466c474bdd84a620/yarl-1.25.1-cp314-cp314-win_amd64.whl", hash = "sha256:acfa7e22aa6c6e7a5996a41d275bfa01efa7ea56ab890590280e9063e2cf5c1b", size = 103446, upload-time = "2026-09-15T19:32:49.615Z" }, + { url = "https://files.pythonhosted.org/packages/5c/f0/8ec63180f77912f0dc4e5a42760cb8c08d20da1d5ace3578a01b84d1f3d8/yarl-1.25.1-cp314-cp314-win_arm64.whl", hash = "sha256:8e7d98cdbb6d71e726f7d525952867096053d1f290dd4e3c50d7d313a136f414", size = 99159, upload-time = "2026-09-15T19:32:51.686Z" }, + { url = "https://files.pythonhosted.org/packages/47/7d/92d2220d6886b70ab1ed8579533ac2af2dfac716d5d929001daff7986df9/yarl-1.25.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d21f0fa80a02d05299207eeaafef345d812ace96d5306e4ef265e1d419a615fa", size = 150071, upload-time = "2026-09-15T19:32:53.911Z" }, + { url = "https://files.pythonhosted.org/packages/64/fc/b245e448124bcda9340df38e3553fa222b50260fca027a84095e9bd8642d/yarl-1.25.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17c9877a89fb6e2bca6f9087eb24cd7fb434653946ef5075e470d23d49b52287", size = 106780, upload-time = "2026-09-15T19:32:56.443Z" }, + { url = "https://files.pythonhosted.org/packages/51/e2/9a6ce2e334ebf218a30335ae76fb1696459430d42f733b8cb0d7d65b84d3/yarl-1.25.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:29273edf1530e397bd07cb784db1fbe0d2590b77569f2e24679a9c0a2d763b94", size = 107361, upload-time = "2026-09-15T19:32:58.827Z" }, + { url = "https://files.pythonhosted.org/packages/ed/70/66e8c76b569b450d16e190f15071c916c3df70b0e33927e415ac497cf0c2/yarl-1.25.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7abffdf37af1cec6a2ad69b827aa84320db5894791bc8ed932dc93fb274b7e9", size = 114396, upload-time = "2026-09-15T19:33:02.24Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/0d82838a05c57fdc05bc8b66e8c92dcc0df15e27463a5f163142d521c682/yarl-1.25.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2239a02249d9326655419e0168a28ca9008938eaab31dc29fc875c217927a6c0", size = 104882, upload-time = "2026-09-15T19:33:04.494Z" }, + { url = "https://files.pythonhosted.org/packages/86/d4/ea08615c4edaa6049a13a2f1128944d068d1893abda7d708d4d7ea01599a/yarl-1.25.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:664ec6a520b74a1df2810666eb67695fcb77fa663e6ea0a25aaf2e529cb24dfa", size = 119485, upload-time = "2026-09-15T19:33:06.583Z" }, + { url = "https://files.pythonhosted.org/packages/1a/82/0898bdce9b1ae403b308b9c733d0d24af4a3464270c2c081f457b16c3e0d/yarl-1.25.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4f1c91f5a5980a937ff8e238e98e6897e1ad74a4b1e2c0d68c73b5ffbb3f5c0b", size = 122490, upload-time = "2026-09-15T19:33:08.653Z" }, + { url = "https://files.pythonhosted.org/packages/d1/38/97d79b81c342b78246cfedb74809e68841f3198d21653e10d3232bd9c622/yarl-1.25.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c88edaec8c349ad4c5ad4c486a3defcc4b80ceb2f074436ffa0a87caf5e76a6", size = 115336, upload-time = "2026-09-15T19:33:11.056Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9d/2577896554cd310dc470adb6da0b7dd0b435cb63e2565204a7ac240e504c/yarl-1.25.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:35dcbea443fafb3eece757ad4e514560ddeb6c34cfae1582c620d7b293d7feee", size = 111825, upload-time = "2026-09-15T19:33:13.204Z" }, + { url = "https://files.pythonhosted.org/packages/29/6b/7ac49d8ba84a5c4bd73415a4c949d22c749cb3762579b3d50e48019a78aa/yarl-1.25.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:882569ff613758cac762a457a5d72d6e211b28d4bcfea89d1d71ea942b02eac0", size = 114655, upload-time = "2026-09-15T19:33:15.553Z" }, + { url = "https://files.pythonhosted.org/packages/e5/18/e5942a16723f5b72f9b1297fd5a85a54f6300cd15c0dcb5005b90cd89156/yarl-1.25.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d0f1489233a254bb3643d2f05de7d59019254d81daeca6b9162fe9edef57e0c7", size = 106395, upload-time = "2026-09-15T19:33:17.599Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2d/549fa46240781513ebc47ae7eb418df428a163a2a3d644cc9cbb3ecb7846/yarl-1.25.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f41753a76f4f63927d03a0d8ba8f5ce0f2083bec29a8cfaccc55371b1564b96b", size = 119277, upload-time = "2026-09-15T19:33:19.973Z" }, + { url = "https://files.pythonhosted.org/packages/76/16/4763f78dcdc0b3b9fb3842b04afe72b9320857c6a69300c62a0eab03d119/yarl-1.25.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fb0eb4955adf0579001581f2f71a126e8781ba61bcd120f127b0401163c6c2d", size = 112504, upload-time = "2026-09-15T19:33:22.464Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b4/974e3edfe0d188393ce1cb9de400111c63fe61f4eb3b772a500d84c970d1/yarl-1.25.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a1e32763e641a1566507d90a8d3b19bfc3cc04a9d4e5ae3e32189874ed4b58a3", size = 116243, upload-time = "2026-09-15T19:33:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/b0/aa/157b940428da80c104ca09666a740e51c94963df65d5b112e06b52e4d7a8/yarl-1.25.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65b5b2066651b7432d389e9799d979c703bcc6ef44266bb8153ef54e91e4aab3", size = 115822, upload-time = "2026-09-15T19:33:26.886Z" }, + { url = "https://files.pythonhosted.org/packages/7e/af/19fbdce41412e1b96825544cc52cd7029d3724655d0988237972f078bd29/yarl-1.25.1-cp314-cp314t-win_amd64.whl", hash = "sha256:734f6e5400352ac4254456003d462866c684703570929cff7a7bde015d0cb371", size = 107386, upload-time = "2026-09-15T19:33:29.009Z" }, + { url = "https://files.pythonhosted.org/packages/2a/99/f6431c8968e89be608d74b28ae2d024521b2953f27dd44e0dece5e04f67a/yarl-1.25.1-cp314-cp314t-win_arm64.whl", hash = "sha256:287e99ff5aa4dc1c7630bfc683ded6f106d756c99dec432a2d7f197a784f51c6", size = 102094, upload-time = "2026-09-15T19:33:31.151Z" }, + { url = "https://files.pythonhosted.org/packages/c7/3b/4f51eab40c2eabea6c3d5b121dff4b8988dc35087732ffede12d2be8b8dd/yarl-1.25.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9b1bdaae98bc016825dd3c9d8ee1832f829b3341f9cc6ebd1a1b0a7fef7367cc", size = 143875, upload-time = "2026-09-15T19:33:33.52Z" }, + { url = "https://files.pythonhosted.org/packages/41/05/bbd58fc063f5f299a883f810760b265ca26c8167c91cb9a494d0fe2387e1/yarl-1.25.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:e7011b8fb8c4054bf0c12e5edc6cd83778b0028e99ce59b18586ed036f92cfdc", size = 104028, upload-time = "2026-09-15T19:33:36.22Z" }, + { url = "https://files.pythonhosted.org/packages/12/ee/2fba0aecb52e7020e189f684148783aa0b9cfa3b3bfb0b400646eef70ad4/yarl-1.25.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f074e8d4aa0a5798920ddb6de3d08b228c614ff3724c3e8bd7577f4bafea867b", size = 104041, upload-time = "2026-09-15T19:33:38.86Z" }, + { url = "https://files.pythonhosted.org/packages/38/35/884beab53ed88c7247d1671972b5ef116f7351fe0c7e6de8c3558372cb16/yarl-1.25.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d42e7e3ca399555578b4d617e3a6ecf13371b3743a115995fa010c7bf341459", size = 116018, upload-time = "2026-09-15T19:33:44.265Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/1a91b685afb55cc18608443ace95280e96e263a97565811732b6788d3269/yarl-1.25.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aa4ed3dd308548f9e707d9caaf005d2d7f8c1e7868f858dfeb47fe76e16b391d", size = 107033, upload-time = "2026-09-15T19:33:46.45Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c1/58b379fcb1d68d907b7fcf75200c44321896509b2a6a74abbb4b19d864d2/yarl-1.25.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42a66563d8cc056ee32e6191e05097a7b2b3bc302e0bc3133daf8710eb18bd26", size = 123257, upload-time = "2026-09-15T19:33:48.631Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2d/1fe96cf5c2aeab10095e48f38585cf5a8451fb7253234822398e52aa5336/yarl-1.25.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:98d370568f393215d605304cdb77b3d5539bd192c75b623c7304c42c8d6d8273", size = 126745, upload-time = "2026-09-15T19:33:50.999Z" }, + { url = "https://files.pythonhosted.org/packages/ad/60/8674394ce43f4dadae573a1d6f451716438e9eab7d7fe8d643c673a32d85/yarl-1.25.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23bf5b403c879a54964e0feac7285688e04bb220074878d737d331522da0a5bf", size = 117255, upload-time = "2026-09-15T19:33:53.456Z" }, + { url = "https://files.pythonhosted.org/packages/2f/72/0faa30e02605d56127d42bb987dcc97da3863b7bf70b9bfbf5f739c05e30/yarl-1.25.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d45673badd08456d0340e9364eddafe1c53a9d2896424294de4d7dd71ad3ee57", size = 115166, upload-time = "2026-09-15T19:33:55.669Z" }, + { url = "https://files.pythonhosted.org/packages/8c/90/9a46eac564c437e128285c5c1d7bb385d268394e9209d84f6bf4a14471ef/yarl-1.25.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:0136d640dfa9b0523853e411430a99f8a91eca85774c6420285a33b755bc6de3", size = 116082, upload-time = "2026-09-15T19:33:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/ad/38/4b1a686a3758878f93d2f1ea943f5a165f3555769cd16e761cfd0efdca17/yarl-1.25.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:59ba3a6e1aa8cfe5adf4bd270fd965db21955401b7ca6f1696010c55ed4daec2", size = 108048, upload-time = "2026-09-15T19:34:00.25Z" }, + { url = "https://files.pythonhosted.org/packages/da/14/f348eb967f31a58348612a2b93bd8a2ab664548e2b5e879cac7f592f7201/yarl-1.25.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:87796fedc3ba97ec14fab55acb48584276e6c1e4c1e89c422bda62c838e754a9", size = 122775, upload-time = "2026-09-15T19:34:02.455Z" }, + { url = "https://files.pythonhosted.org/packages/ab/e9/4f7b79700f88cb9e8bb66f8b54f9bce1844c013a2c39fdc47112e9334c95/yarl-1.25.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:bd0912757081f89b107d6c00b2ff8a194401b0b87eadcf4481de2b865a8fd44f", size = 115096, upload-time = "2026-09-15T19:34:05.283Z" }, + { url = "https://files.pythonhosted.org/packages/cf/37/f9cb020331997d3eb887bd28d5410ecfd3d80bf163c23d7cec490d78dade/yarl-1.25.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:b51c159a9794633f5e0db7ecec7b2b6e3734eca1f5d17dc989ff3552a43ff78b", size = 120655, upload-time = "2026-09-15T19:34:07.382Z" }, + { url = "https://files.pythonhosted.org/packages/12/83/52fceb22891a41f168db7ec22fd1d81e06b6a0b8d9f70921bd3e785defd0/yarl-1.25.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:319e070a01db9920fb63761843f96a104c8e2b9427266731810dc1e22595b17c", size = 117488, upload-time = "2026-09-15T19:34:09.988Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5c/ce6c4ff1247fcbe4b33d462c23a097106d909b173fde7042bc52290466e2/yarl-1.25.1-cp315-cp315-win_amd64.whl", hash = "sha256:a2059a2d891bd156bc5184e7ab7a56e78a84dfcfdeac8c501b552533ad1c36ee", size = 103434, upload-time = "2026-09-15T19:34:12.56Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/766a906b0704fb26d52b19dc22bed48a8ba0544203b70dcf44da350e8194/yarl-1.25.1-cp315-cp315-win_arm64.whl", hash = "sha256:a78b50b4f7918a3de71105d5c0b93bbc57bb8339a4d03a9dfd449f9068e76f3d", size = 99155, upload-time = "2026-09-15T19:34:15.132Z" }, + { url = "https://files.pythonhosted.org/packages/bd/d3/a1d09b32cb6ab14f66b44939f5b4255b8b9e747aef3974af1d5d80ccc2fd/yarl-1.25.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:b5402a340723fa7da00b5cff987ddab61276be6d11251ea71ae02bcac54890d8", size = 149284, upload-time = "2026-09-15T19:34:17.452Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3b/fe554d879692650bca70bfbc0df124e82e4d2bb7456f698c7756f1279a96/yarl-1.25.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:eda19ea5ee88742f47a2340816e6f2d40b53bed3ab5b69794769f36af9f35bb4", size = 106399, upload-time = "2026-09-15T19:34:21.474Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4b/e7af56177ac8d40094c82d7728224c0b8472157d50d362e5fb3b014b2bc8/yarl-1.25.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:75baa6cf9b6d1c52f3e111a130e202fd8cf0a5b3a066c3f73d615e885092e4ec", size = 106968, upload-time = "2026-09-15T19:34:23.619Z" }, + { url = "https://files.pythonhosted.org/packages/da/4f/2df41fd738d46f23ef829ae8b4468d94bb6070038fc6dfab6165ed44fea8/yarl-1.25.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbcef5a9119ef653653132cccaf999b30a0af6f33bb0a4ba80bec30056868487", size = 114717, upload-time = "2026-09-15T19:34:25.879Z" }, + { url = "https://files.pythonhosted.org/packages/69/ea/002b66df53bbd1aed1c23358ff99c9bdc744fe3f4d2740e1b2fdd7192885/yarl-1.25.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7efc9f082dfed77c316edffa9deb52888e1bc6789171887cc1f68e06d65465c8", size = 105198, upload-time = "2026-09-15T19:34:28.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/7c/95c8bc0c8f97d71e59c94525ad60d76f5c57d3f2820f08137ca8b9f0542a/yarl-1.25.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fe01645169a2112aa1d4ebc3e4c5f029c5c8f97adfc32e5d37c993b39a994d75", size = 120271, upload-time = "2026-09-15T19:34:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7a/6fe9da56ec77927baa669fd86c39c567ce6205bab53d581082c6744c8ae7/yarl-1.25.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1c557dfd5e3db046053a0bdc72261ade790ebe8e2c7a41b36b0ca1f14cb95f3", size = 123572, upload-time = "2026-09-15T19:34:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/8b/83/35f222d17fa70a14c7c74fdf112ccf5515e0c2a87082b1f9b99f7693bf57/yarl-1.25.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ce4d6ccafb33d39bd78444612d14938ead674c25702ded2ee9c54a47735d225", size = 115228, upload-time = "2026-09-15T19:34:35.344Z" }, + { url = "https://files.pythonhosted.org/packages/da/6f/fbaaf619423578a7d898d0f226ae47bc1906c293865c416d83c17b828b0e/yarl-1.25.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80a063f8297fc796296f00f100be520f209b23dc98f93ce8eba6ee7122598209", size = 111618, upload-time = "2026-09-15T19:34:37.656Z" }, + { url = "https://files.pythonhosted.org/packages/ba/78/7383278f1b3cf8e0496bd95b3281a7b09b89217b6b428db24c6b99b3deca/yarl-1.25.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:7cb414a73e21a7ab58254926073f2930cb22f5b4314ea4260a687e2b3fd4dce3", size = 114839, upload-time = "2026-09-15T19:34:40.099Z" }, + { url = "https://files.pythonhosted.org/packages/62/49/5506e5b6d29aab91bd845cc9016d88c3d3f81b81bc242b8100bdd5737825/yarl-1.25.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:85a18376073f8a39aa07be34f9fc77e2869aa72c55c441efdd2cf79a0407504d", size = 106212, upload-time = "2026-09-15T19:34:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/19877c193b7c5929f4b07118c18bbe390f3fadd0f59dd98c0cd12b31fa5c/yarl-1.25.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:77716e245c90f058466a05e6a465bb8600f767a8f4b18b4d40f3aff958e5f73c", size = 119985, upload-time = "2026-09-15T19:34:44.976Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6c/0a46fbbf9ecbcbd0cc20d2193394254b9e19817f22c814aab60f99847400/yarl-1.25.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:1e80dcf1446e1b080b1932b0d103c464a04112f5bc31f0f983ad418172063cde", size = 112081, upload-time = "2026-09-15T19:34:47.45Z" }, + { url = "https://files.pythonhosted.org/packages/ef/30/93f5d471230c74ccd06255d0842739f86551f937f9e63a5e947853c6244a/yarl-1.25.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:bdc8d8b8c22e9e43ac68316b5e6cf083dec537f4ec213cb4aa967b583bc3fa64", size = 116995, upload-time = "2026-09-15T19:34:49.972Z" }, + { url = "https://files.pythonhosted.org/packages/2b/80/c386593035ee3f9c6c6af0847b5578f2830c674794a9d7701b744a3ebd42/yarl-1.25.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbf531053a0935f2e871bcd4753f90313688772ff8c017f5ea402e315a78c1f", size = 115570, upload-time = "2026-09-15T19:34:52.628Z" }, + { url = "https://files.pythonhosted.org/packages/38/02/eef443559563ef8f2e10469387b8b1e97cb5efee95b288a56da60801f7ee/yarl-1.25.1-cp315-cp315t-win_amd64.whl", hash = "sha256:b13b88747769537f3d32e89e3a735da10c0a9e35d7322928c701b5f93d3afffd", size = 106811, upload-time = "2026-09-15T19:34:54.935Z" }, + { url = "https://files.pythonhosted.org/packages/88/91/41e284ca2cf5211e05dae031d126a3668aea88fa759df56e7e35c6ad25ba/yarl-1.25.1-cp315-cp315t-win_arm64.whl", hash = "sha256:783dd1467083f4d3f7722ad6a313f24c173e7571372738fcb7a6e6d1ba48df25", size = 101804, upload-time = "2026-09-15T19:34:57.231Z" }, + { url = "https://files.pythonhosted.org/packages/54/22/318c7980066769c6bcd9221ed2248294f5698811da099013098c670565ed/yarl-1.25.1-py3-none-any.whl", hash = "sha256:681c758b0490f9e96b78e5fa8e8dc6e648e9185bb6eaebe73183c33ea0c445f3", size = 63617, upload-time = "2026-09-15T19:34:59.616Z" }, ] [[package]] @@ -5830,50 +6169,50 @@ wheels = [ [[package]] name = "zope-interface" -version = "8.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/dc/50550cfcbb2ea3cbca5f1d7ed05c8aa840f831a0f2d63aec0a953f7c590e/zope_interface-8.5.tar.gz", hash = "sha256:7a3ba1c5877f0f3e3906b02ddf793abed2becc2948116414ce0e1dd820b68d6d", size = 257957, upload-time = "2026-05-26T06:50:14.574Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/43/9cd98bee951d23848de690ba2809f87e3b22c67c370987acc960da15ad37/zope_interface-8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0c8aa2bf8f3911ef37b87deb1bbe225a310e6eb6522a16d77f5d8330c4f6fbe", size = 210951, upload-time = "2026-05-26T06:49:00.178Z" }, - { url = "https://files.pythonhosted.org/packages/17/0f/8f1a29966bcf863e3a2121edcafb81c55715de7886bcc9544749cc79e7da/zope_interface-8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:efe234a0fafb4b6b1602e9be9245b97c2bf06d67c07af5a4bc3c0438978b555c", size = 211309, upload-time = "2026-05-26T06:49:02.732Z" }, - { url = "https://files.pythonhosted.org/packages/9f/9f/37e564eaaf85e3abc1ada40a79fa43f2ab45bdb67431b0ec0fe29e4763e2/zope_interface-8.5-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:dabeb6fe1228d411994f300811edc6866fff0cdcbc9cef98a78f05ea0da42e37", size = 254881, upload-time = "2026-05-26T06:49:04.303Z" }, - { url = "https://files.pythonhosted.org/packages/06/61/e6501d8ea7a2cac3217e03f404e1f98c1df7191d83cfe86b1895fbba5dac/zope_interface-8.5-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:147a9442dcc2b7339ecdb1be2b3cdb098e90462e39425054053ebfb50d99125a", size = 259811, upload-time = "2026-05-26T06:49:06.373Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/bfa25ef480b02af6e9452c478483fec75e87c9e2b60c407fd0b1f6054b9c/zope_interface-8.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a17e681224267880707c9ec9e730ad9a1ad2d65c371256843efba6cf48711b58", size = 260358, upload-time = "2026-05-26T06:49:08.317Z" }, - { url = "https://files.pythonhosted.org/packages/64/51/2b518072fea76242da64451d501c69b7b5ccdef9b57fead584ccf1c180d5/zope_interface-8.5-cp310-cp310-win_amd64.whl", hash = "sha256:d178968a1a611df30549a717d1624cb38ca810347339e3e37b7baa6f6781a170", size = 214822, upload-time = "2026-05-26T06:49:10.441Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f1/83ad110fb847413affe71609bb50e59e1aa082e1236030122227c7c283d3/zope_interface-8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:afc66ccaef2a3c0bef6ca02aad40d29a39276389dad16a8eac36f9f385e4d057", size = 211426, upload-time = "2026-05-26T06:49:12.595Z" }, - { url = "https://files.pythonhosted.org/packages/bb/a7/6b6e0c31ac240cb9fc015ae9ed45ca54be886c18fcf7bfa2377a4d7a8785/zope_interface-8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c28044972187245d7a309e4699319bfdbd2ffcbf7176d1d4ddf5adffb2dea80f", size = 211850, upload-time = "2026-05-26T06:49:14.474Z" }, - { url = "https://files.pythonhosted.org/packages/37/36/7599ecabcf80ce4fef2e1ef3c5ac0d4696b61f03f724cc44022f4d226af9/zope_interface-8.5-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:03bbecc7982af713d7499d4084bc03916413d17ffd45f89009348cc0c1d9e376", size = 260711, upload-time = "2026-05-26T06:49:16.568Z" }, - { url = "https://files.pythonhosted.org/packages/03/3e/1774b0ee46ccbb5498ee3c33ece40315b6ef58bc71957be94bd345340bc1/zope_interface-8.5-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bf917009a4a7457c7290225a019f4a0aa706d96accd2cfdba2418d3bc1fcde2f", size = 265277, upload-time = "2026-05-26T06:49:18.656Z" }, - { url = "https://files.pythonhosted.org/packages/b6/09/e533b2ffabaae4e5d5730d6768a591cf335defe8e37bec2ad905d09be656/zope_interface-8.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:31cff25b2aaedb5267e6e77b1e9be6b0ec4f622032de8a069202b8ffacda7dc2", size = 266369, upload-time = "2026-05-26T06:49:20.174Z" }, - { url = "https://files.pythonhosted.org/packages/49/4a/3ebe6a4c122b2d5340db45cbe7e490663d3228b172710ec71060cd5d541e/zope_interface-8.5-cp311-cp311-win_amd64.whl", hash = "sha256:17a3114bbdddb5e75e5784cdf318944636190cbbc72d357ef9fb1a8b0351f955", size = 215161, upload-time = "2026-05-26T06:49:21.799Z" }, - { url = "https://files.pythonhosted.org/packages/d2/59/056ad97af5b16db1975ee98ec7ab03d2ce3f3355efad904ced1dbce0e39f/zope_interface-8.5-cp311-cp311-win_arm64.whl", hash = "sha256:aab6bb5bee10f38ea688b95ba054396b67f613552d2c8378be7fcb2d2fba7646", size = 213481, upload-time = "2026-05-26T06:49:25.085Z" }, - { url = "https://files.pythonhosted.org/packages/97/cc/b84123a948f3162a34623e188922827cd845244fdd043ed20f8d02228caa/zope_interface-8.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8e6ee90c2e6de7c37058d5fa41f123c8b13a312db8d1e0fb5840d7f4bcdff9c9", size = 212165, upload-time = "2026-05-26T06:49:26.566Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/cbceec44f1b27208a76c1a688c131302685852406a23df5aab68324109cc/zope_interface-8.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c1adc90d3576b3b4c4de4953e6002c37bef28b78d7fa54c1bbfd0c50f022fe7c", size = 212341, upload-time = "2026-05-26T06:49:28.182Z" }, - { url = "https://files.pythonhosted.org/packages/e1/c3/005032195ff3b210c139b7c560ed5c534e844b0907d8e44d2b3d8919305e/zope_interface-8.5-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:e6347b8d8d12c5eca6502450a92be30079b7acfade2c4f693efa0deb8871b06e", size = 265296, upload-time = "2026-05-26T06:49:29.741Z" }, - { url = "https://files.pythonhosted.org/packages/c5/66/1036543d6a66bc04c19df3cf650f3ad938a002ab0a443c24e23e8de5e8b9/zope_interface-8.5-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5e970dabea777a24b0b0bbf9dae3ab75ce8b2d8e948edf4875627034b21f3560", size = 270689, upload-time = "2026-05-26T06:49:31.767Z" }, - { url = "https://files.pythonhosted.org/packages/30/4c/8b56259558cace4414e753ca6740396a1f59d4a95ddb55b4658600408670/zope_interface-8.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0b48ccadaa9839e09ff81e969703cecb3f402c813bfe8b958652e699bea69f5", size = 270280, upload-time = "2026-05-26T06:49:33.489Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ea/649908c83aa8fdb7faf2ddca4d3cf6fb8f2157121267dc56e8f72681e26c/zope_interface-8.5-cp312-cp312-win_amd64.whl", hash = "sha256:e0e311f1277468c08fd59a2b41f71b43d25dff639789d364747acd1705c0df6e", size = 215019, upload-time = "2026-05-26T06:49:35.607Z" }, - { url = "https://files.pythonhosted.org/packages/9f/97/da13037b4c563e4df32eedbc819f8c00b754af494f68211e3dffd48d52da/zope_interface-8.5-cp312-cp312-win_arm64.whl", hash = "sha256:652b73107a04159ec6c020db6c1543d4f1e8f4d069bd2aac88a947820923517b", size = 213569, upload-time = "2026-05-26T06:49:37.317Z" }, - { url = "https://files.pythonhosted.org/packages/f4/8c/4c15755d701f2ec0e80d64a18e1ebaf5be2c584c0ec153fd516f5d13eada/zope_interface-8.5-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:28e80457c134d1fa57a7d758004dece348654e1b1467ac22dcdc20fc1d127c52", size = 212512, upload-time = "2026-05-26T06:49:38.996Z" }, - { url = "https://files.pythonhosted.org/packages/9a/2e/4360c54c465db042cc8fbeeec92abac28b4cedbf6ba63c1f092fd08a190f/zope_interface-8.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09495ce9d559c06b70f2d4855b3e4f48a822a9ddc8be1d30c5b4e5be14ae1ace", size = 212541, upload-time = "2026-05-26T06:49:41.186Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a5/692a2b8d70f78e848793231d5fae5fecbf8d0cccd73430fdc34802a6d3c1/zope_interface-8.5-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:7849ad8fa90763cc1087f4dda78ca3a233e950b3e08fac7079297c9cafbbd7bb", size = 265191, upload-time = "2026-05-26T06:49:43.449Z" }, - { url = "https://files.pythonhosted.org/packages/70/8d/454a9cfc7a050c394ab4f11b3371f7897828b7415e096afff724637e65e0/zope_interface-8.5-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5578c9421ca409a1f39f153d6f7803e4cde01da592ec75a9ac5e1b777d18d33b", size = 270626, upload-time = "2026-05-26T06:49:45.425Z" }, - { url = "https://files.pythonhosted.org/packages/51/8c/db8409cfa3575b8e9b4800babd7d49f8228433cd1f0c56814bd0ada49c33/zope_interface-8.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e1bd7d96b4ca5fa311f54c9eac16dce4886b428c1531dbe06067763ccdf123b4", size = 270444, upload-time = "2026-05-26T06:49:47.025Z" }, - { url = "https://files.pythonhosted.org/packages/4a/df/a386940e41469ef615e100a216d8b386521e9e598817147f87932ca203c4/zope_interface-8.5-cp313-cp313-win_amd64.whl", hash = "sha256:0c8123d2a4dfde2a613c7cb772605477724782c20bc2e0ad1d9435376a6a44a3", size = 215021, upload-time = "2026-05-26T06:49:48.478Z" }, - { url = "https://files.pythonhosted.org/packages/89/75/477eb5669b6b2a7a843decd1a075e9b1971a8720017654143a7183abd3d9/zope_interface-8.5-cp313-cp313-win_arm64.whl", hash = "sha256:6d02be14f3173c6c7288bc2fdf530090c01c3cf8764ad46c68024686f364278e", size = 213610, upload-time = "2026-05-26T06:49:50.01Z" }, - { url = "https://files.pythonhosted.org/packages/d4/19/5032e954827fdf02db2d2f49737ac4378bb9cfc2cd95a8f2e2a5ae2ec01a/zope_interface-8.5-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:ffaecf013251a89d0de6feb49a46eba48ad8cbbf8a40aeb6045e459e7bec6784", size = 212597, upload-time = "2026-05-26T06:49:51.63Z" }, - { url = "https://files.pythonhosted.org/packages/f1/53/3ef644012cf8a6a234a2d6134aab5a5c65ac5467c86296865501d4fbc406/zope_interface-8.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:126fa9d1c52295ae076d4cf968634f0a1826afa408a20808b57ff72877b8f69f", size = 212626, upload-time = "2026-05-26T06:49:53.236Z" }, - { url = "https://files.pythonhosted.org/packages/32/67/bc8b4f465d388039255003e230c284a175cedf1203c692f23cb7bff64efe/zope_interface-8.5-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:3090e3a663d20194756a59a272e0c8508b889341e31d5894223331fe6b4f9b21", size = 266827, upload-time = "2026-05-26T06:49:54.873Z" }, - { url = "https://files.pythonhosted.org/packages/a7/eb/37d05b935ede53d79690fecc8d201440084418e590bcfc05f384451c7593/zope_interface-8.5-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9342fb74e2afefdb081bf1df727d209ea56995c6e13f5a0540e6d7aff4beafb8", size = 270139, upload-time = "2026-05-26T06:49:57.116Z" }, - { url = "https://files.pythonhosted.org/packages/8b/0b/fd0c54579e2ce8dc6cf1a757903f3374bc6fbda929a46af9e0f53cb0e5f0/zope_interface-8.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c54725d818f1b57a7efb8b16528326e1f3c257b602b32393fd255c45af8799d", size = 270338, upload-time = "2026-05-26T06:49:58.698Z" }, - { url = "https://files.pythonhosted.org/packages/c1/1d/c420dcd777bb761067ea92879ac766694a5ca78608185f1aecea64cbfc11/zope_interface-8.5-cp314-cp314-win_amd64.whl", hash = "sha256:29d74febbae1afeb6834c4ccbf42e242a673c860060f09e53142825270456140", size = 215789, upload-time = "2026-05-26T06:50:00.405Z" }, - { url = "https://files.pythonhosted.org/packages/62/94/50b5eb8f94e527edceac14f9955e58917424ea79bb572ddc18548561cbc2/zope_interface-8.5-cp314-cp314-win_arm64.whl", hash = "sha256:633c8c49396f38df030340797c533e9fe460d1b5d1e42d88e55e938e525f548c", size = 213757, upload-time = "2026-05-26T06:50:01.973Z" }, - { url = "https://files.pythonhosted.org/packages/17/6f/5d5f32c4dfcdb16ce2ec5363da686840f13c13e1a1214cb70b49e1cd6d9f/zope_interface-8.5-cp314-cp314t-macosx_10_9_x86_64.whl", hash = "sha256:133999820fdbae513c36c03d6f29ef87317aaa3edef39112222b155083664714", size = 213591, upload-time = "2026-05-26T06:50:03.529Z" }, - { url = "https://files.pythonhosted.org/packages/f3/55/de0c3459ff717fce3342f9a29464c281fdeb0d36c3171ee88d119d5f0650/zope_interface-8.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8bd75c96966e573232f0599deaff717564828031c7f05563ccc1ac35c5ee0304", size = 213733, upload-time = "2026-05-26T06:50:05.101Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/d97430abd5ae9677e8b9295b58720c0064a5b557dbb6b8bf5928484cf0d8/zope_interface-8.5-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:14b0e9799351d4c34fe99afd67f0cdd76e55ba15c66a98699d5fc22ea8241e08", size = 294905, upload-time = "2026-05-26T06:50:07.384Z" }, - { url = "https://files.pythonhosted.org/packages/41/ec/a0f8f3dad6e74992f4654bdd94802be0929eabca7b871cac3b6fbb5e961b/zope_interface-8.5-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0cd6a732ac84b94eb1ef9222a117347a27efd294ee16810ffdf7ecd307677ed5", size = 300885, upload-time = "2026-05-26T06:50:08.997Z" }, - { url = "https://files.pythonhosted.org/packages/0f/da/6881b48803a0ee8d23eb5efa30fce3ed218a2bd9de5758ce489d224fee81/zope_interface-8.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:798b7c87d0e59a7d5d086d642208d0d8700ff0d55c4029134b3c479c3bfb110f", size = 304672, upload-time = "2026-05-26T06:50:10.563Z" }, - { url = "https://files.pythonhosted.org/packages/2e/0e/b4c01320859ff1d585438bc231fd60bd258d096359bccf6654fecdf0cffb/zope_interface-8.5-cp314-cp314t-win_amd64.whl", hash = "sha256:0fc3a9d45f114d27eaa1e53beeb144533689edca8a9f66505b1e8e8b3f075e42", size = 217241, upload-time = "2026-05-26T06:50:12.171Z" }, +version = "8.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/39/a8481b926e42c44a6fcc670904f8251469ec42edbff1ba066719ca1e7fb4/zope_interface-8.6.tar.gz", hash = "sha256:b40ef9b4873afb5d0dec02b8d2dfde1cf18c72337b60c99cb735961e0bac05c0", size = 257973, upload-time = "2026-08-20T11:18:08.717Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/56/4cf64b40123af62ed9dad3d689df853d9ff8f431ae06408e087061a9b87a/zope_interface-8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42fb95008784a3b50c4b79e4488845d1950c57eef17ebc9c53a680084fb93da2", size = 210947, upload-time = "2026-08-20T11:16:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/90/b8/59d9a455a73cae715eacca70003d943e8a8413b196454bb49530c16769bd/zope_interface-8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c5963a26e1fe47bdb3494ba2aa91904c7898873af400dc3bdcaa808a57783a", size = 211307, upload-time = "2026-08-20T11:16:54.352Z" }, + { url = "https://files.pythonhosted.org/packages/65/7a/80fa8eb011bf78b72438a0ea0f672efe97ac5c9e9ff07d3304143ef5d611/zope_interface-8.6-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:3e0383361da2793ea332e2d12b753a32ac57b3b89c8c3a9c6dd04374ae142c0f", size = 254894, upload-time = "2026-08-20T11:16:56.063Z" }, + { url = "https://files.pythonhosted.org/packages/2e/02/c82afe287924ddcbc78fd2f4646f16e3ba9d03bf3f5e1ea4bedce711de3c/zope_interface-8.6-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6df4bd16923d247c34e12dc394dab20d99d96aa2e15a6b163c2dda1dd582fff6", size = 259828, upload-time = "2026-08-20T11:16:57.979Z" }, + { url = "https://files.pythonhosted.org/packages/00/9c/53361a3cbf7ae2529d69a252547b129afa44f75d7019a76b15cecad44c91/zope_interface-8.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6246f7a4b196bd054469f4fd4ffdac307974061f0d2b1ef4da87ddff13a7f885", size = 260368, upload-time = "2026-08-20T11:16:59.727Z" }, + { url = "https://files.pythonhosted.org/packages/7c/82/5c6846d58d41fe09b8da3b4f9b03fa28ccd6f3764588c5ea339063566caa/zope_interface-8.6-cp310-cp310-win_amd64.whl", hash = "sha256:5fbd9deb0477aea769b7d83a4d953d77ef38972d5eddd5b922b614ee708b2104", size = 214231, upload-time = "2026-08-20T11:17:01.582Z" }, + { url = "https://files.pythonhosted.org/packages/df/b0/5715b7635e5e25dd26ae32453e784cab59401078aeb3e401027675068583/zope_interface-8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd25d6da3b3c8216080a0eefb3c01719913782690427fb9ba2ddad98ed8970f4", size = 211445, upload-time = "2026-08-20T11:17:03.377Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/60a71a998fd819a7b9ed24c3544f862280f222828f421561e28885dcecc5/zope_interface-8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ebb513c9e47702525897148e38271f7b6bf12c61bd084cdddfd0e03b542f8100", size = 211839, upload-time = "2026-08-20T11:17:05.05Z" }, + { url = "https://files.pythonhosted.org/packages/85/55/3092a23c3bdbcc9402ad74e69dae3fa49cc9f12bceef35079c98449bc60e/zope_interface-8.6-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:919510e0d470c189cb84164b953f81e8a513aa2593fdc9e4982340838cd1099b", size = 260720, upload-time = "2026-08-20T11:17:06.755Z" }, + { url = "https://files.pythonhosted.org/packages/41/7d/d3abda21695ee441f2278f226b4b22ecb604cf0d96efb3d39507415abdcb/zope_interface-8.6-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a43e669d68fd8c10fe315812f7e1d262c6c00e9667f29f799a3771f9a3b5b41d", size = 265288, upload-time = "2026-08-20T11:17:08.858Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/27467685e40d5ee01f542c8b0b33682b07af363419f4c64cbb61b8bf48d5/zope_interface-8.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:826f99c38f4bfcf7165885a0c59f03c6c25e0df8cdb0544f882cda61616fe845", size = 266373, upload-time = "2026-08-20T11:17:10.786Z" }, + { url = "https://files.pythonhosted.org/packages/bd/7b/ee35b4a5ee56ff609868291404b3ac30814417912fd8cbf4bbdcf1da8280/zope_interface-8.6-cp311-cp311-win_amd64.whl", hash = "sha256:d97c96c79c389d1031c86f8e797b94db4fe647dfbfebdbe48247c1899dc930bb", size = 214544, upload-time = "2026-08-20T11:17:12.793Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ea/f63bedc8f3331fbd8d74971201bdb0be41ebbeda800aee08e9afcf41f46b/zope_interface-8.6-cp311-cp311-win_arm64.whl", hash = "sha256:ec5a5c01a54fc06b69da71164c9bba8cc71fde79bdd1b835bb734f96bca693f2", size = 213497, upload-time = "2026-08-20T11:17:14.541Z" }, + { url = "https://files.pythonhosted.org/packages/be/0a/33bcf5c825c749205c832e82d14224ff38011d20dd9dbf7a0ffe51a589ae/zope_interface-8.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:192bb756a8f62395b4fe47cbb853c171f20389d5226fbfa97128bb2f76abad8d", size = 212192, upload-time = "2026-08-20T11:17:16.522Z" }, + { url = "https://files.pythonhosted.org/packages/17/4f/41bde1796fa8cbb32f50facd261dd4124daa850c29666270e85e2bb8e91a/zope_interface-8.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a38b221cc649a2daacaff9d629a2ba9c4a8967669d253f9a6a597f46d46732f0", size = 212337, upload-time = "2026-08-20T11:17:18.305Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/b2d78ecb8aec59114111ed8c25894c0421afecc5e89b36fc356e2b07a607/zope_interface-8.6-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:780a66db884c0e2b0e6b34b4900f86916945a7c03d3be40ec845b051fcc052cd", size = 265308, upload-time = "2026-08-20T11:17:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/dc/5a/126eeee4da016f5cca4db2297496069d5f1ba901fb53ebf104f9c087a113/zope_interface-8.6-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9217b1123f6aeec9ddf1789bffd83da3123546d551c164a99f862a5d1f5ac0f8", size = 270703, upload-time = "2026-08-20T11:17:22.016Z" }, + { url = "https://files.pythonhosted.org/packages/05/89/7767a6f9b0bb41a4d3777e8f93bfeb1b9a23ea643f83ce96163d9d672c8b/zope_interface-8.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:28b68c24131545c1d13fd2178bbd065e67f09db885d8426adf1fbdf2b6b66372", size = 270292, upload-time = "2026-08-20T11:17:23.905Z" }, + { url = "https://files.pythonhosted.org/packages/1e/66/bd63f493284f492003ebc494e9706abe389fdab45d6d6dd09a21012a7077/zope_interface-8.6-cp312-cp312-win_amd64.whl", hash = "sha256:64ed939d725876071823505b1c90074a86847a6e9be8617cec7ba759e0b86a7e", size = 214371, upload-time = "2026-08-20T11:17:25.606Z" }, + { url = "https://files.pythonhosted.org/packages/1c/03/64069137ef7da70ec796ad9a90ba23796fded06c4e7d06ae600a3141f3cc/zope_interface-8.6-cp312-cp312-win_arm64.whl", hash = "sha256:b08808d1196810f76928ad13d37dae18d92b1c9485c113628f41dbd6351413de", size = 213578, upload-time = "2026-08-20T11:17:27.396Z" }, + { url = "https://files.pythonhosted.org/packages/30/01/860c4879f072968375ec82fabaa5d83256e6ad8d3dce9527b00931e54b10/zope_interface-8.6-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:add6e226c6568de6d0ea9f6abe6353072387afcf5f817610ea266495d0c1ee72", size = 212548, upload-time = "2026-08-20T11:17:29.161Z" }, + { url = "https://files.pythonhosted.org/packages/38/09/d4b7c46c020394c830e749c6c4ca6a2ca0b6defed6f4c2eeeb97116c7343/zope_interface-8.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47030c08e39d690299e02973ac845d0f534121b3618efa9ce9599a512a1c97fa", size = 212536, upload-time = "2026-08-20T11:17:30.922Z" }, + { url = "https://files.pythonhosted.org/packages/4c/2d/5b4dbbe618b816f626f2a640fcd9911a461e3733a608c4043a8cc79c12b3/zope_interface-8.6-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:c2bf932006229788d6bb41963dfc0345cba6ee24141a39316bd52a283a7d115f", size = 265203, upload-time = "2026-08-20T11:17:33.059Z" }, + { url = "https://files.pythonhosted.org/packages/79/96/c02befafb8e5d3c92898aa02fffca94d164830013fd0a50c4a652a728712/zope_interface-8.6-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:09522cdc6a77376bc36988b531db3b568c8cb0b6ca7286d8316aab283888770f", size = 270637, upload-time = "2026-08-20T11:17:35.167Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c4/d61b18724597ca62c1a3a753370fff7b76f43c01b44e9a13c18e2300eaf0/zope_interface-8.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:edf1bd7ed576319241b2b314eaa549cee3e3e0f81f46911086b387d03a303ad3", size = 270456, upload-time = "2026-08-20T11:17:37.146Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7a/96f177daba3f9d9d69d42659ae6c602c76b1d725e7dddff08ed49d9d02af/zope_interface-8.6-cp313-cp313-win_amd64.whl", hash = "sha256:00fd6a6da085beb90cdcdce6ed6e6973edf338d1ea63a807e213b1eb7013833d", size = 214763, upload-time = "2026-08-20T11:17:39.064Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/ce4a0ff71a1a93bd403c511307d70d32ae876e657d96063985f6672c92ec/zope_interface-8.6-cp313-cp313-win_arm64.whl", hash = "sha256:105da41198a1990b18d566bd30656a19064d4c313e4c0dd8f0dd9714026e47f1", size = 213621, upload-time = "2026-08-20T11:17:40.805Z" }, + { url = "https://files.pythonhosted.org/packages/3d/28/8ec94b15ebde2da2ebe643aac3c4238a55c2e95b746049721b50908ecafe/zope_interface-8.6-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:449727fc79f0b1317ec190632e13699b732d3f4704ea90c8e1339bb78e451bee", size = 212628, upload-time = "2026-08-20T11:17:42.566Z" }, + { url = "https://files.pythonhosted.org/packages/85/47/f06d4dbbc1464d9d4520b9c047d4a0f0062264eeb2c0b7fd1bec79a9327d/zope_interface-8.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:81793c9b12816ac7f8b71b366be36b7025fcf7205ec4a236642b15a82cb027ef", size = 212627, upload-time = "2026-08-20T11:17:44.571Z" }, + { url = "https://files.pythonhosted.org/packages/1c/56/01f84b4e966a32088e9076b1e7b2afa310f52bf9b9a077d2958cf66e81aa/zope_interface-8.6-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:a91eb220d9ae6aa6d746d6dac5b4db35b1417903301b3315ba3275b19570be0b", size = 266840, upload-time = "2026-08-20T11:17:46.366Z" }, + { url = "https://files.pythonhosted.org/packages/c6/40/2a644e32cd6f0516e7df1fc0c58e544a8cc11ba06b0d55d308519b02459d/zope_interface-8.6-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3f7f6da49911ffe75ae3f7a9a45619f205420cc6578aff02f8ca29ed1de10f14", size = 270145, upload-time = "2026-08-20T11:17:48.195Z" }, + { url = "https://files.pythonhosted.org/packages/1e/18/02ebd81feff11a2766159fcb49c5b773fef5ae4414c38fb19114aad9e961/zope_interface-8.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef15a2f6258f809334a19c1fcce64648813066ceebe3f3f6077871483fd0f50d", size = 270351, upload-time = "2026-08-20T11:17:50.07Z" }, + { url = "https://files.pythonhosted.org/packages/26/56/0725e960cf581399b7f4136d5951f7d87bc659492e49db1794334f6c5153/zope_interface-8.6-cp314-cp314-win_amd64.whl", hash = "sha256:5ef166337880b0e78138bbd32fcbc5ab1da3337febe8d2a247f3690bcae3ede5", size = 215098, upload-time = "2026-08-20T11:17:52.062Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b3/7f864a6f9d9aebddceaac0a8c5cab0b450090f42fe316e48e6dd0c684478/zope_interface-8.6-cp314-cp314-win_arm64.whl", hash = "sha256:23ae710094fdcfcf715dae7054cd5abfefa4a527c5853d7b76ebb2541499c41a", size = 213759, upload-time = "2026-08-20T11:17:54.157Z" }, + { url = "https://files.pythonhosted.org/packages/19/b8/2f7a65ac046d3bb54e4a0664acfa152021804aa4101cbbec11526740c8af/zope_interface-8.6-cp314-cp314t-macosx_10_9_x86_64.whl", hash = "sha256:a84ac0010f054f3516710804a0c22026b4b0d30085d7666cfc2f30545775bf99", size = 213631, upload-time = "2026-08-20T11:17:56.063Z" }, + { url = "https://files.pythonhosted.org/packages/12/c1/889dc114e9a9e8d59fec53facb71dd26345f60c504ad20fd17121af0449c/zope_interface-8.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e36adea8ab93eb4d2076a47d5f4c7d7e1267eb9a4e33202da7ea71439a3bcaef", size = 213713, upload-time = "2026-08-20T11:17:57.998Z" }, + { url = "https://files.pythonhosted.org/packages/a9/96/ac48a6b7cfe972e4a9b0d7ec8b9f36a7956cc95d72029f0013ff096c55af/zope_interface-8.6-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5dbe120cfcfc8e6aed418f340c3d1ad4072253e17176503e363ddac27fcb2ac6", size = 294916, upload-time = "2026-08-20T11:17:59.952Z" }, + { url = "https://files.pythonhosted.org/packages/a2/54/4df4bb0b1aace2298386375ab2fb752378683b558d2db713e25c40a3e96a/zope_interface-8.6-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27e6de8e593736210d2a9f1bbf766a5653aa4819c184f864ab9d1f8bd3590a60", size = 300898, upload-time = "2026-08-20T11:18:02.224Z" }, + { url = "https://files.pythonhosted.org/packages/08/9c/0c8c80c1eeb62ac0c3ed1f51ad8cdd6da9373c53247c659c49f0ea29f742/zope_interface-8.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:66ab8c5d8820aa378968c16b7a3cb051aca342eafa649c9a363182f572d75ccb", size = 304684, upload-time = "2026-08-20T11:18:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/54/69/3afc11a58b9ea814fdfb9297a8c36d10871c1f0cc06d42c106282109b952/zope_interface-8.6-cp314-cp314t-win_amd64.whl", hash = "sha256:fcc86414ee0e6b77416de81b8dead5900719b3f71b7875d8d1f87ae4e166a11f", size = 215500, upload-time = "2026-08-20T11:18:06.259Z" }, ] [[package]] From ac3dad4a0e7dd2703005633a007ba2e513cd09b4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 16:36:58 -0700 Subject: [PATCH 022/831] Added the live Redis provider conformance test. --- tests/streams/test_redis_provider.py | 71 ++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 tests/streams/test_redis_provider.py diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py new file mode 100644 index 000000000..33ad6b88b --- /dev/null +++ b/tests/streams/test_redis_provider.py @@ -0,0 +1,71 @@ +"""Live conformance for the client-side (Redis) provider. + +Runs the same interface loop the other providers run, over the external-store +binding against a real Redis. The workflow publishes through the staged +commit, so it needs a warm workflow cache (the provider holds the task open +between records). Gated behind ``STREAMS_LIVE=redis``; needs a dev server +(``TEMPORAL_ADDRESS``) and a Redis (``AI198_REDIS_URL``). +""" + +from __future__ import annotations + +import os +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "redis", + reason="needs a live server and redis; run with STREAMS_LIVE=redis", +) + + +async def test_interface_loop_over_redis(): + streams.configure( + provider="redis", + url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), + key_prefix=f"streams-redis-live-{uuid.uuid4().hex}", + ) + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-redis-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + max_cached_workflows=100, + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="decisions"), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 1771757e033956a4a3a5414d5411452130454ba1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 16:38:34 -0700 Subject: [PATCH 023/831] Added the live native provider conformance test. --- tests/streams/test_native_provider.py | 65 +++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/streams/test_native_provider.py diff --git a/tests/streams/test_native_provider.py b/tests/streams/test_native_provider.py new file mode 100644 index 000000000..edcc0d172 --- /dev/null +++ b/tests/streams/test_native_provider.py @@ -0,0 +1,65 @@ +"""Live conformance for the server-side (native) provider. + +Runs the same interface loop the other providers run, against a Temporal +server that carries the stream service. Gated behind ``STREAMS_LIVE=native``; +``TEMPORAL_ADDRESS`` must point at a server built from ``moedash/temporal`` +``moe/AI-198-server-side-streams``. +""" + +from __future__ import annotations + +import os +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "native", + reason="needs a stream-carrying server; run with STREAMS_LIVE=native", +) + + +async def test_interface_loop_over_native_streams(): + streams.configure(provider="native") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-native-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From df60573830ecace16d12eb6676c5e0146189ba07 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 024/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- temporalio/streams/__init__.py | 4 ++ temporalio/streams/_provider.py | 46 +++++++++++++++++++ .../streams/providers/workflow_streams.py | 28 +++++++++-- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index a25c2bdca..699919ffe 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -57,8 +57,10 @@ StreamProvider, configure, consumer, + drain, open_read, open_write, + prepare, producer, worker_options, ) @@ -85,6 +87,8 @@ "WriteSink", "configure", "consumer", + "drain", + "prepare", "producer", "worker_options", "reader", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 7ac8bf395..48439d754 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -23,8 +23,10 @@ "StreamProvider", "configure", "consumer", + "drain", "open_read", "open_write", + "prepare", "producer", "register", "registered", @@ -121,6 +123,24 @@ async def consumer( """Open a reader for what ``workflow_id`` publishes.""" ... + def prepare(self) -> None: + """Install whatever this provider needs before the workflow runs. + + Optional. A provider that serves outside readers through handlers on + the workflow itself has to register them before the first task + completes, or a reader that arrives early finds nothing to talk to. + """ + ... + + def drain(self) -> None: + """Release anything this provider parked on the workflow's behalf. + + Optional. A provider that parks an outside reader against the running + workflow, as the Workflow Streams transport does with its long-poll + update, has to let go before the workflow can return. + """ + ... + _factories: dict[str, Callable[[], StreamProvider]] = {} _active: StreamProvider | None = None @@ -202,6 +222,32 @@ def open_write(topic: str) -> WriteSink: return _current().open_write(topic) +def prepare() -> None: + """Let the provider install what it needs, before the workflow runs. + + Call it from the workflow's constructor. It is a no-op on providers that + need nothing, so workflow code can call it unconditionally and stay + portable. + """ + provider = _current() + install = getattr(provider, "prepare", None) + if install is not None: + install() + + +def drain() -> None: + """Release anything the provider parked on this workflow's behalf. + + Call it before a workflow that read a stream returns. It is a no-op on + providers that park nothing, so workflow code can call it unconditionally + and stay portable. + """ + provider = _current() + release = getattr(provider, "drain", None) + if release is not None: + release() + + async def producer( client: Any, *, diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From 5a530df1f5d2f9669c7d724c717e6992f974c0ce Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 025/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/__init__.py | 25 +++--- temporalio/streams/_provider.py | 55 ++++++++++-- temporalio/streams/_record.py | 4 +- temporalio/streams/providers/memory.py | 20 +++-- temporalio/streams/providers/native.py | 41 ++++++--- temporalio/streams/providers/nexus.py | 63 ++++++++++---- temporalio/streams/providers/redis.py | 87 ++++++++++++------- .../streams/providers/workflow_streams.py | 44 +++++++--- tests/streams/test_nexus_provider.py | 7 +- tests/streams/test_streams_conformance.py | 40 ++++++++- 10 files changed, 287 insertions(+), 99 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 699919ffe..aaf0a444d 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -12,12 +12,16 @@ it found nothing, is committed with the commands that reading produced. Recovery re-supplies the same records in the same order. 3. **Anything that does I/O publishes on its own account.** An activity, a - local activity, or an outside process writes through :func:`producer`, and - its records are visible as soon as they are written. It carries a producer - id, an attempt and a sequence so a retry can be told from a new generation. -4. **A cursor is opaque and belongs to its provider.** Hand it back to resume. - Do not compare two cursors or do arithmetic on one: one provider numbers - records with integers and another with a millisecond-and-sequence pair. + local activity, or an outside process writes through :func:`producer`, + either into one of the workflow's inbound streams or onto a topic of the + stream the workflow publishes, and its records are visible as soon as they + are written. It carries a producer id, an attempt and a sequence so a retry + can be told from a new generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume + after the record it names. Do not compare two cursors or do arithmetic on + one: one provider numbers records with integers and another with a + millisecond-and-sequence pair. A reader that wants to follow from now asks + the consumer for :meth:`Consumer.latest` instead of guessing a position. 5. **A workflow names its streams relative to itself, and the provider resolves them.** ``reader("inputs")`` is this workflow's inbound stream called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One @@ -103,7 +107,7 @@ def reader( *, type: type | None = None, topic: str | None = None, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> StreamReader[Any]: """Subscribe this workflow to its inbound stream ``stream``. @@ -116,14 +120,15 @@ def reader( stream: The inbound stream's name, relative to this workflow. type: The value type, used as the decode hint. topic: Only records on this topic, or every topic when omitted. - start: Where to start. Only honoured on the first subscription of a - run, because after that the recorded cursor decides. + after: Resume after this record. Only honoured on the first + subscription of a run, because after that the recorded cursor + decides. idle_timeout: How long the workflow waits with nothing arriving before the provider is allowed to release the worker. ``None`` takes the provider's default. """ return StreamReader( - open_read(stream, start=start, idle_timeout=idle_timeout), + open_read(stream, after=after, idle_timeout=idle_timeout), topic=topic, type=type, ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 48439d754..c224b47bf 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -62,11 +62,28 @@ class Consumer(Protocol): def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive.""" + """Yield the records after ``after`` as they arrive. + + ``BEGINNING`` yields everything the stream retains. Any other cursor + came from a record this or another reader saw, and reading resumes + just past it, so a reader that stores the last cursor it handled and + hands it back sees every record exactly once. + """ + ... + + async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the newest record, or ``BEGINNING`` when there is none. + + For a reader that wants to follow from now: ``read(after=latest())`` + yields only what is published after this call returned, which is how + a client that is about to send a message positions itself before + sending, without the workflow having to report a position. ``topic`` + is for the provider that keeps each topic in its own store. + """ ... @@ -95,7 +112,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: """Subscribe the running workflow to its inbound stream ``stream``.""" @@ -110,11 +127,18 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> Producer: - """Open a producer for ``workflow_id``'s inbound stream ``stream``.""" + """Open a producer that appends on ``workflow_id``'s account. + + ``stream`` names one of the workflow's inbound streams. With no + ``stream``, ``topic`` names a topic on the stream the workflow itself + publishes, which is how an activity puts its live output next to the + workflow's own records for the same outside reader. + """ ... async def consumer( @@ -210,11 +234,11 @@ def worker_options() -> dict[str, Any]: def open_read( stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: """Subscribe the running workflow to its inbound stream ``stream``.""" - return _current().open_read(stream, start=start, idle_timeout=idle_timeout) + return _current().open_read(stream, after=after, idle_timeout=idle_timeout) def open_write(topic: str) -> WriteSink: @@ -252,15 +276,28 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> Producer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``.""" + """Open a producer that appends on ``workflow_id``'s account. + + Name either an inbound ``stream`` of the workflow, or a ``topic`` on the + stream the workflow publishes. Inside an activity, leave ``producer_id`` + and ``attempt`` unset: the activity's own id and attempt are the right + answer, and they are what let a reader tell a retry from a new generation. + """ + if bool(stream) == bool(topic): + raise ValueError( + "name exactly one of stream (an inbound stream of the workflow) or " + "topic (a topic on the stream the workflow publishes)" + ) return await _current().producer( client, workflow_id=workflow_id, stream=stream, + topic=topic, producer_id=producer_id, attempt=attempt, ) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index d458ef0c4..4fd322189 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -50,8 +50,8 @@ class Cursor: Opaque on purpose. One provider numbers records with integers and another with a millisecond-and-sequence pair, so comparing tokens here would be - right for one and wrong for the other. Hand a cursor back to resume from - it; ask the reader to compare two. + right for one and wrong for the other. Hand a cursor back to resume after + the record it names; nothing here advances one. """ token: str diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 808a84f13..477a17b68 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -204,12 +204,12 @@ def __init__(self, store: _MemoryStream, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - offset = int(start.token) if start.token else 0 + offset = int(after.token) + 1 if after.token else 0 while True: await self._store.wait_past(offset) frames = self._store.frames @@ -238,6 +238,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one store per stream, so the position is topic-independent + count = len(self._store.frames) + return Cursor(str(count - 1)) if count else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -268,13 +273,13 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: store = _stream(_inbound_id(workflow.info().workflow_id, stream)) return _MemReadSource( store, - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, idle_timeout or self._poll, ) @@ -287,7 +292,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> MemoryProducer: @@ -296,10 +302,12 @@ async def producer( producer_id = activity.info().activity_id attempt = attempt or activity.info().attempt + # With no inbound stream named, the target is the store the workflow's + # own writer appends to, and the frame carries the topic instead. return MemoryProducer( _stream(_inbound_id(workflow_id, stream)), _converter(client), - stream, + stream or topic, producer_id, attempt, ) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f5570b05a..c0044b9cf 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -255,18 +255,18 @@ def __init__(self, handle: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() async for message in self._handle.follow( - from_offset=int(start.token) if start.token else 0 + from_offset=int(after.token) + 1 if after.token else 0 ): cursor = Cursor(str(message.offset)) try: @@ -290,6 +290,16 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one server-side log per stream, whatever the topic + try: + state = await self._handle.describe() + except Exception: + # A stream nobody has published to does not exist yet, and that + # is the same answer as an empty one. + return BEGINNING + return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -317,7 +327,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Accepted and ignored. Delivery arrives on workflow tasks the server @@ -329,7 +339,7 @@ def open_read( fanout = fanouts.get(stream_id) if fanout is None: workflow.subscribe_stream( - stream_id, start_offset=int(start.token) if start.token else 0 + stream_id, start_offset=int(after.token) + 1 if after.token else 0 ) fanout = fanouts[stream_id] = _Fanout(stream_id) return _NativeReadSource(fanout) @@ -342,15 +352,18 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NativeProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the stream the workflow publishes, which the server lets any + producer append to. Inside an activity, leave ``producer_id`` and + ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ _reject_configured_codec(client) if not producer_id: @@ -358,6 +371,14 @@ async def producer( if not attempt: attempt = activity.info().attempt streams = _stream_client(client) + if not stream: + return NativeProducer( + streams.workflow_stream(workflow_id), + client.data_converter.payload_converter, + topic, + producer_id, + attempt, + ) stream_id = inbound_stream_id(workflow_id, stream) handle = _handles.get(stream_id) if handle is None: diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 7931e9fd4..ec5742bf2 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -26,7 +26,9 @@ BEGINNING as PROVIDER_BEGINNING, AFTER, ExternalOutputStreamClient, + ExternalOutputStreamProducer, ExternalStreamProducer, + Offset, WakeNotAcknowledgedError, WorkflowChainKey, external_output_stream, @@ -185,24 +187,21 @@ def __init__(self, client: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ - if topic is None: - raise ValueError( - "this provider stores each topic separately, so an outside " - "reader has to name one" - ) attempts = AttemptTracker() - after = PROVIDER_BEGINNING if not start.token else AFTER(start.token) - handle = self._client.topic(topic, type=bytes) - async for item in handle.subscribe(after=after): + boundary = ( + AFTER(Offset(after.token)) if after.token else PROVIDER_BEGINNING + ) + handle = self._client.topic(self._require_topic(topic), type=bytes) + async for item in handle.subscribe(after=boundary): cursor = Cursor(str(item.offset)) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( @@ -223,6 +222,21 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + tail = await self._client.topic(self._require_topic(topic), type=bytes).tail() + if tail.is_beginning: + return BEGINNING + return Cursor(tail.offset.token) + + @staticmethod + def _require_topic(topic: str | None) -> str: + if topic is None: + raise ValueError( + "this provider stores each topic separately, so an outside " + "reader has to name one" + ) + return topic + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -283,14 +297,14 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # The provider resolves the name under this run's chain key, so a start # position is only meaningful to a reader that already has one, and this # provider's first subscription always starts at the beginning of the # stream it minted. - if start is not BEGINNING and start.token: + if after.token: raise ValueError( "the client-side provider starts a new subscription at the " "beginning of the stream it owns; resuming elsewhere is not " @@ -309,35 +323,48 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> RedisProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the workflow's output stream, appended directly rather than through + the workflow's staged commit. Inside an activity, leave ``producer_id`` + and ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ if not producer_id: producer_id = activity.info().activity_id if not attempt: attempt = activity.info().attempt - session = await ExternalStreamProducer.connect( - backend=self._require_backend(), - workflow=await _chain_key(client, workflow_id), - client=client, - # The attempt is part of it. Deduplication answers "is this the - # same append again", and a second attempt writing different words - # at the same sequence is not: this provider rejects that outright. - # Folding the attempt in keeps a retried append idempotent without - # letting a new generation be refused as a conflicting duplicate. - session_id=f"{producer_id}#{attempt}", - ) + # The attempt is part of it. Deduplication answers "is this the + # same append again", and a second attempt writing different words + # at the same sequence is not: this provider rejects that outright. + # Folding the attempt in keeps a retried append idempotent without + # letting a new generation be refused as a conflicting duplicate. + session_id = f"{producer_id}#{attempt}" + chain = await _chain_key(client, workflow_id) + if stream: + session: Any = await ExternalStreamProducer.connect( + backend=self._require_backend(), + workflow=chain, + client=client, + session_id=session_id, + ) + else: + session = await ExternalOutputStreamProducer.connect( + backend=self._require_backend(), + workflow=chain, + client=client, + session_id=session_id, + ) return RedisProducer( - session.topic(stream, type=bytes), + session.topic(stream or topic, type=bytes), client.data_converter.payload_converter, - stream, + stream or topic, producer_id, attempt, client, diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index d01132851..978ef5ca1 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -152,13 +152,49 @@ async def test_cursor_resumes_where_it_points(): consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") records = await take(consumer.read(type=dict), 3) - checkpoint = records[1].cursor + checkpoint = records[0].cursor + # Resuming after a record hands back everything past it and nothing + # twice, without the reader ever advancing a cursor itself. resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") - again = await take(resumed.read(type=dict, start=checkpoint), 2) + again = await take(resumed.read(type=dict, after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] +async def test_latest_positions_a_reader_at_the_end(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + assert await consumer.latest() == streams.BEGINNING + + await producer.append({"n": 1}, {"n": 2}) + since = await consumer.latest() + await producer.append({"n": 3}) + + # A reader that positioned itself before the last append sees only what + # came after, which is how a client follows a turn it is about to start. + records = await take(consumer.read(type=dict, after=since), 1) + assert [r.value for r in records] == [{"n": 3}] + + +async def test_producer_appends_onto_the_owners_topic(): + # An activity's live output lands on the same topic the workflow + # publishes, so one outside reader follows both. + producer = await streams.producer( + None, workflow_id="wf", topic="events", producer_id="model", attempt=1 + ) + await producer.append({"delta": "hel"}, {"delta": "lo"}) + + consumer = await streams.consumer(None, workflow_id="wf") + records = await take(consumer.read(type=dict, topic="events"), 2) + assert [r.value["delta"] for r in records] == ["hel", "lo"] + assert {r.producer for r in records} == {"model"} + + with pytest.raises(ValueError): + await streams.producer(None, workflow_id="wf", producer_id="model", attempt=1) + + def test_unknown_provider_is_a_clear_error(): with pytest.raises(RuntimeError, match="no stream provider 'nope'"): streams.configure(provider="nope") From ee7fa1302b9ec302acc1f19ab48f0b22203f48ef Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 026/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From 14921db449c4453132b1323678cda5480e87dbe0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 027/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- temporalio/streams/__init__.py | 4 +++ temporalio/streams/_provider.py | 57 ++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index a25c2bdca..699919ffe 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -57,8 +57,10 @@ StreamProvider, configure, consumer, + drain, open_read, open_write, + prepare, producer, worker_options, ) @@ -85,6 +87,8 @@ "WriteSink", "configure", "consumer", + "drain", + "prepare", "producer", "worker_options", "reader", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 58282cc55..48439d754 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -23,8 +23,10 @@ "StreamProvider", "configure", "consumer", + "drain", "open_read", "open_write", + "prepare", "producer", "register", "registered", @@ -121,6 +123,24 @@ async def consumer( """Open a reader for what ``workflow_id`` publishes.""" ... + def prepare(self) -> None: + """Install whatever this provider needs before the workflow runs. + + Optional. A provider that serves outside readers through handlers on + the workflow itself has to register them before the first task + completes, or a reader that arrives early finds nothing to talk to. + """ + ... + + def drain(self) -> None: + """Release anything this provider parked on the workflow's behalf. + + Optional. A provider that parks an outside reader against the running + workflow, as the Workflow Streams transport does with its long-poll + update, has to let go before the workflow can return. + """ + ... + _factories: dict[str, Callable[[], StreamProvider]] = {} _active: StreamProvider | None = None @@ -159,9 +179,18 @@ def configure(provider: str | None = None, **options: Any) -> None: ``provider`` may be omitted when exactly one provider is registered. """ global _active + _active = instance(provider, **options) + + +def instance(provider: str | None = None, **options: Any) -> StreamProvider: + """A configured provider that is not installed as the process default. + + For code that serves one provider while the process is configured with + another, such as a Nexus stream handler delegating to its store. + """ chosen = _make(provider) chosen.configure(**options) - _active = chosen + return chosen def _current() -> StreamProvider: @@ -193,6 +222,32 @@ def open_write(topic: str) -> WriteSink: return _current().open_write(topic) +def prepare() -> None: + """Let the provider install what it needs, before the workflow runs. + + Call it from the workflow's constructor. It is a no-op on providers that + need nothing, so workflow code can call it unconditionally and stay + portable. + """ + provider = _current() + install = getattr(provider, "prepare", None) + if install is not None: + install() + + +def drain() -> None: + """Release anything the provider parked on this workflow's behalf. + + Call it before a workflow that read a stream returns. It is a no-op on + providers that park nothing, so workflow code can call it unconditionally + and stay portable. + """ + provider = _current() + release = getattr(provider, "drain", None) + if release is not None: + release() + + async def producer( client: Any, *, From d0f44cf5686c42e0be35485a890a6146ca2d5f0f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 028/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/__init__.py | 25 ++++++----- temporalio/streams/_provider.py | 55 +++++++++++++++++++---- temporalio/streams/_record.py | 4 +- temporalio/streams/providers/memory.py | 20 ++++++--- tests/streams/test_streams_conformance.py | 40 ++++++++++++++++- 5 files changed, 115 insertions(+), 29 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 699919ffe..aaf0a444d 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -12,12 +12,16 @@ it found nothing, is committed with the commands that reading produced. Recovery re-supplies the same records in the same order. 3. **Anything that does I/O publishes on its own account.** An activity, a - local activity, or an outside process writes through :func:`producer`, and - its records are visible as soon as they are written. It carries a producer - id, an attempt and a sequence so a retry can be told from a new generation. -4. **A cursor is opaque and belongs to its provider.** Hand it back to resume. - Do not compare two cursors or do arithmetic on one: one provider numbers - records with integers and another with a millisecond-and-sequence pair. + local activity, or an outside process writes through :func:`producer`, + either into one of the workflow's inbound streams or onto a topic of the + stream the workflow publishes, and its records are visible as soon as they + are written. It carries a producer id, an attempt and a sequence so a retry + can be told from a new generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume + after the record it names. Do not compare two cursors or do arithmetic on + one: one provider numbers records with integers and another with a + millisecond-and-sequence pair. A reader that wants to follow from now asks + the consumer for :meth:`Consumer.latest` instead of guessing a position. 5. **A workflow names its streams relative to itself, and the provider resolves them.** ``reader("inputs")`` is this workflow's inbound stream called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One @@ -103,7 +107,7 @@ def reader( *, type: type | None = None, topic: str | None = None, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> StreamReader[Any]: """Subscribe this workflow to its inbound stream ``stream``. @@ -116,14 +120,15 @@ def reader( stream: The inbound stream's name, relative to this workflow. type: The value type, used as the decode hint. topic: Only records on this topic, or every topic when omitted. - start: Where to start. Only honoured on the first subscription of a - run, because after that the recorded cursor decides. + after: Resume after this record. Only honoured on the first + subscription of a run, because after that the recorded cursor + decides. idle_timeout: How long the workflow waits with nothing arriving before the provider is allowed to release the worker. ``None`` takes the provider's default. """ return StreamReader( - open_read(stream, start=start, idle_timeout=idle_timeout), + open_read(stream, after=after, idle_timeout=idle_timeout), topic=topic, type=type, ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 48439d754..c224b47bf 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -62,11 +62,28 @@ class Consumer(Protocol): def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive.""" + """Yield the records after ``after`` as they arrive. + + ``BEGINNING`` yields everything the stream retains. Any other cursor + came from a record this or another reader saw, and reading resumes + just past it, so a reader that stores the last cursor it handled and + hands it back sees every record exactly once. + """ + ... + + async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the newest record, or ``BEGINNING`` when there is none. + + For a reader that wants to follow from now: ``read(after=latest())`` + yields only what is published after this call returned, which is how + a client that is about to send a message positions itself before + sending, without the workflow having to report a position. ``topic`` + is for the provider that keeps each topic in its own store. + """ ... @@ -95,7 +112,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: """Subscribe the running workflow to its inbound stream ``stream``.""" @@ -110,11 +127,18 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> Producer: - """Open a producer for ``workflow_id``'s inbound stream ``stream``.""" + """Open a producer that appends on ``workflow_id``'s account. + + ``stream`` names one of the workflow's inbound streams. With no + ``stream``, ``topic`` names a topic on the stream the workflow itself + publishes, which is how an activity puts its live output next to the + workflow's own records for the same outside reader. + """ ... async def consumer( @@ -210,11 +234,11 @@ def worker_options() -> dict[str, Any]: def open_read( stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: """Subscribe the running workflow to its inbound stream ``stream``.""" - return _current().open_read(stream, start=start, idle_timeout=idle_timeout) + return _current().open_read(stream, after=after, idle_timeout=idle_timeout) def open_write(topic: str) -> WriteSink: @@ -252,15 +276,28 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> Producer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``.""" + """Open a producer that appends on ``workflow_id``'s account. + + Name either an inbound ``stream`` of the workflow, or a ``topic`` on the + stream the workflow publishes. Inside an activity, leave ``producer_id`` + and ``attempt`` unset: the activity's own id and attempt are the right + answer, and they are what let a reader tell a retry from a new generation. + """ + if bool(stream) == bool(topic): + raise ValueError( + "name exactly one of stream (an inbound stream of the workflow) or " + "topic (a topic on the stream the workflow publishes)" + ) return await _current().producer( client, workflow_id=workflow_id, stream=stream, + topic=topic, producer_id=producer_id, attempt=attempt, ) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index d458ef0c4..4fd322189 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -50,8 +50,8 @@ class Cursor: Opaque on purpose. One provider numbers records with integers and another with a millisecond-and-sequence pair, so comparing tokens here would be - right for one and wrong for the other. Hand a cursor back to resume from - it; ask the reader to compare two. + right for one and wrong for the other. Hand a cursor back to resume after + the record it names; nothing here advances one. """ token: str diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 808a84f13..477a17b68 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -204,12 +204,12 @@ def __init__(self, store: _MemoryStream, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - offset = int(start.token) if start.token else 0 + offset = int(after.token) + 1 if after.token else 0 while True: await self._store.wait_past(offset) frames = self._store.frames @@ -238,6 +238,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one store per stream, so the position is topic-independent + count = len(self._store.frames) + return Cursor(str(count - 1)) if count else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -268,13 +273,13 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: store = _stream(_inbound_id(workflow.info().workflow_id, stream)) return _MemReadSource( store, - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, idle_timeout or self._poll, ) @@ -287,7 +292,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> MemoryProducer: @@ -296,10 +302,12 @@ async def producer( producer_id = activity.info().activity_id attempt = attempt or activity.info().attempt + # With no inbound stream named, the target is the store the workflow's + # own writer appends to, and the frame carries the topic instead. return MemoryProducer( _stream(_inbound_id(workflow_id, stream)), _converter(client), - stream, + stream or topic, producer_id, attempt, ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index d01132851..978ef5ca1 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -152,13 +152,49 @@ async def test_cursor_resumes_where_it_points(): consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") records = await take(consumer.read(type=dict), 3) - checkpoint = records[1].cursor + checkpoint = records[0].cursor + # Resuming after a record hands back everything past it and nothing + # twice, without the reader ever advancing a cursor itself. resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") - again = await take(resumed.read(type=dict, start=checkpoint), 2) + again = await take(resumed.read(type=dict, after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] +async def test_latest_positions_a_reader_at_the_end(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + assert await consumer.latest() == streams.BEGINNING + + await producer.append({"n": 1}, {"n": 2}) + since = await consumer.latest() + await producer.append({"n": 3}) + + # A reader that positioned itself before the last append sees only what + # came after, which is how a client follows a turn it is about to start. + records = await take(consumer.read(type=dict, after=since), 1) + assert [r.value for r in records] == [{"n": 3}] + + +async def test_producer_appends_onto_the_owners_topic(): + # An activity's live output lands on the same topic the workflow + # publishes, so one outside reader follows both. + producer = await streams.producer( + None, workflow_id="wf", topic="events", producer_id="model", attempt=1 + ) + await producer.append({"delta": "hel"}, {"delta": "lo"}) + + consumer = await streams.consumer(None, workflow_id="wf") + records = await take(consumer.read(type=dict, topic="events"), 2) + assert [r.value["delta"] for r in records] == ["hel", "lo"] + assert {r.producer for r in records} == {"model"} + + with pytest.raises(ValueError): + await streams.producer(None, workflow_id="wf", producer_id="model", attempt=1) + + def test_unknown_provider_is_a_clear_error(): with pytest.raises(RuntimeError, match="no stream provider 'nope'"): streams.configure(provider="nope") From af2483dc22ee1ff29ba9e221ed6296f3f927d492 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 029/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- temporalio/streams/__init__.py | 4 +++ temporalio/streams/_provider.py | 57 ++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index a25c2bdca..699919ffe 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -57,8 +57,10 @@ StreamProvider, configure, consumer, + drain, open_read, open_write, + prepare, producer, worker_options, ) @@ -85,6 +87,8 @@ "WriteSink", "configure", "consumer", + "drain", + "prepare", "producer", "worker_options", "reader", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 58282cc55..48439d754 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -23,8 +23,10 @@ "StreamProvider", "configure", "consumer", + "drain", "open_read", "open_write", + "prepare", "producer", "register", "registered", @@ -121,6 +123,24 @@ async def consumer( """Open a reader for what ``workflow_id`` publishes.""" ... + def prepare(self) -> None: + """Install whatever this provider needs before the workflow runs. + + Optional. A provider that serves outside readers through handlers on + the workflow itself has to register them before the first task + completes, or a reader that arrives early finds nothing to talk to. + """ + ... + + def drain(self) -> None: + """Release anything this provider parked on the workflow's behalf. + + Optional. A provider that parks an outside reader against the running + workflow, as the Workflow Streams transport does with its long-poll + update, has to let go before the workflow can return. + """ + ... + _factories: dict[str, Callable[[], StreamProvider]] = {} _active: StreamProvider | None = None @@ -159,9 +179,18 @@ def configure(provider: str | None = None, **options: Any) -> None: ``provider`` may be omitted when exactly one provider is registered. """ global _active + _active = instance(provider, **options) + + +def instance(provider: str | None = None, **options: Any) -> StreamProvider: + """A configured provider that is not installed as the process default. + + For code that serves one provider while the process is configured with + another, such as a Nexus stream handler delegating to its store. + """ chosen = _make(provider) chosen.configure(**options) - _active = chosen + return chosen def _current() -> StreamProvider: @@ -193,6 +222,32 @@ def open_write(topic: str) -> WriteSink: return _current().open_write(topic) +def prepare() -> None: + """Let the provider install what it needs, before the workflow runs. + + Call it from the workflow's constructor. It is a no-op on providers that + need nothing, so workflow code can call it unconditionally and stay + portable. + """ + provider = _current() + install = getattr(provider, "prepare", None) + if install is not None: + install() + + +def drain() -> None: + """Release anything the provider parked on this workflow's behalf. + + Call it before a workflow that read a stream returns. It is a no-op on + providers that park nothing, so workflow code can call it unconditionally + and stay portable. + """ + provider = _current() + release = getattr(provider, "drain", None) + if release is not None: + release() + + async def producer( client: Any, *, From 07413452d138887c49fc763f51972b747d037c9c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 030/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/__init__.py | 25 ++++++----- temporalio/streams/_provider.py | 55 +++++++++++++++++++---- temporalio/streams/_record.py | 4 +- temporalio/streams/providers/memory.py | 20 ++++++--- tests/streams/test_streams_conformance.py | 40 ++++++++++++++++- 5 files changed, 115 insertions(+), 29 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 699919ffe..aaf0a444d 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -12,12 +12,16 @@ it found nothing, is committed with the commands that reading produced. Recovery re-supplies the same records in the same order. 3. **Anything that does I/O publishes on its own account.** An activity, a - local activity, or an outside process writes through :func:`producer`, and - its records are visible as soon as they are written. It carries a producer - id, an attempt and a sequence so a retry can be told from a new generation. -4. **A cursor is opaque and belongs to its provider.** Hand it back to resume. - Do not compare two cursors or do arithmetic on one: one provider numbers - records with integers and another with a millisecond-and-sequence pair. + local activity, or an outside process writes through :func:`producer`, + either into one of the workflow's inbound streams or onto a topic of the + stream the workflow publishes, and its records are visible as soon as they + are written. It carries a producer id, an attempt and a sequence so a retry + can be told from a new generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume + after the record it names. Do not compare two cursors or do arithmetic on + one: one provider numbers records with integers and another with a + millisecond-and-sequence pair. A reader that wants to follow from now asks + the consumer for :meth:`Consumer.latest` instead of guessing a position. 5. **A workflow names its streams relative to itself, and the provider resolves them.** ``reader("inputs")`` is this workflow's inbound stream called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One @@ -103,7 +107,7 @@ def reader( *, type: type | None = None, topic: str | None = None, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> StreamReader[Any]: """Subscribe this workflow to its inbound stream ``stream``. @@ -116,14 +120,15 @@ def reader( stream: The inbound stream's name, relative to this workflow. type: The value type, used as the decode hint. topic: Only records on this topic, or every topic when omitted. - start: Where to start. Only honoured on the first subscription of a - run, because after that the recorded cursor decides. + after: Resume after this record. Only honoured on the first + subscription of a run, because after that the recorded cursor + decides. idle_timeout: How long the workflow waits with nothing arriving before the provider is allowed to release the worker. ``None`` takes the provider's default. """ return StreamReader( - open_read(stream, start=start, idle_timeout=idle_timeout), + open_read(stream, after=after, idle_timeout=idle_timeout), topic=topic, type=type, ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 48439d754..c224b47bf 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -62,11 +62,28 @@ class Consumer(Protocol): def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive.""" + """Yield the records after ``after`` as they arrive. + + ``BEGINNING`` yields everything the stream retains. Any other cursor + came from a record this or another reader saw, and reading resumes + just past it, so a reader that stores the last cursor it handled and + hands it back sees every record exactly once. + """ + ... + + async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the newest record, or ``BEGINNING`` when there is none. + + For a reader that wants to follow from now: ``read(after=latest())`` + yields only what is published after this call returned, which is how + a client that is about to send a message positions itself before + sending, without the workflow having to report a position. ``topic`` + is for the provider that keeps each topic in its own store. + """ ... @@ -95,7 +112,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: """Subscribe the running workflow to its inbound stream ``stream``.""" @@ -110,11 +127,18 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> Producer: - """Open a producer for ``workflow_id``'s inbound stream ``stream``.""" + """Open a producer that appends on ``workflow_id``'s account. + + ``stream`` names one of the workflow's inbound streams. With no + ``stream``, ``topic`` names a topic on the stream the workflow itself + publishes, which is how an activity puts its live output next to the + workflow's own records for the same outside reader. + """ ... async def consumer( @@ -210,11 +234,11 @@ def worker_options() -> dict[str, Any]: def open_read( stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: """Subscribe the running workflow to its inbound stream ``stream``.""" - return _current().open_read(stream, start=start, idle_timeout=idle_timeout) + return _current().open_read(stream, after=after, idle_timeout=idle_timeout) def open_write(topic: str) -> WriteSink: @@ -252,15 +276,28 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> Producer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``.""" + """Open a producer that appends on ``workflow_id``'s account. + + Name either an inbound ``stream`` of the workflow, or a ``topic`` on the + stream the workflow publishes. Inside an activity, leave ``producer_id`` + and ``attempt`` unset: the activity's own id and attempt are the right + answer, and they are what let a reader tell a retry from a new generation. + """ + if bool(stream) == bool(topic): + raise ValueError( + "name exactly one of stream (an inbound stream of the workflow) or " + "topic (a topic on the stream the workflow publishes)" + ) return await _current().producer( client, workflow_id=workflow_id, stream=stream, + topic=topic, producer_id=producer_id, attempt=attempt, ) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index d458ef0c4..4fd322189 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -50,8 +50,8 @@ class Cursor: Opaque on purpose. One provider numbers records with integers and another with a millisecond-and-sequence pair, so comparing tokens here would be - right for one and wrong for the other. Hand a cursor back to resume from - it; ask the reader to compare two. + right for one and wrong for the other. Hand a cursor back to resume after + the record it names; nothing here advances one. """ token: str diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 808a84f13..477a17b68 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -204,12 +204,12 @@ def __init__(self, store: _MemoryStream, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - offset = int(start.token) if start.token else 0 + offset = int(after.token) + 1 if after.token else 0 while True: await self._store.wait_past(offset) frames = self._store.frames @@ -238,6 +238,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one store per stream, so the position is topic-independent + count = len(self._store.frames) + return Cursor(str(count - 1)) if count else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -268,13 +273,13 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: store = _stream(_inbound_id(workflow.info().workflow_id, stream)) return _MemReadSource( store, - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, idle_timeout or self._poll, ) @@ -287,7 +292,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> MemoryProducer: @@ -296,10 +302,12 @@ async def producer( producer_id = activity.info().activity_id attempt = attempt or activity.info().attempt + # With no inbound stream named, the target is the store the workflow's + # own writer appends to, and the frame carries the topic instead. return MemoryProducer( _stream(_inbound_id(workflow_id, stream)), _converter(client), - stream, + stream or topic, producer_id, attempt, ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index d01132851..978ef5ca1 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -152,13 +152,49 @@ async def test_cursor_resumes_where_it_points(): consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") records = await take(consumer.read(type=dict), 3) - checkpoint = records[1].cursor + checkpoint = records[0].cursor + # Resuming after a record hands back everything past it and nothing + # twice, without the reader ever advancing a cursor itself. resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") - again = await take(resumed.read(type=dict, start=checkpoint), 2) + again = await take(resumed.read(type=dict, after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] +async def test_latest_positions_a_reader_at_the_end(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + assert await consumer.latest() == streams.BEGINNING + + await producer.append({"n": 1}, {"n": 2}) + since = await consumer.latest() + await producer.append({"n": 3}) + + # A reader that positioned itself before the last append sees only what + # came after, which is how a client follows a turn it is about to start. + records = await take(consumer.read(type=dict, after=since), 1) + assert [r.value for r in records] == [{"n": 3}] + + +async def test_producer_appends_onto_the_owners_topic(): + # An activity's live output lands on the same topic the workflow + # publishes, so one outside reader follows both. + producer = await streams.producer( + None, workflow_id="wf", topic="events", producer_id="model", attempt=1 + ) + await producer.append({"delta": "hel"}, {"delta": "lo"}) + + consumer = await streams.consumer(None, workflow_id="wf") + records = await take(consumer.read(type=dict, topic="events"), 2) + assert [r.value["delta"] for r in records] == ["hel", "lo"] + assert {r.producer for r in records} == {"model"} + + with pytest.raises(ValueError): + await streams.producer(None, workflow_id="wf", producer_id="model", attempt=1) + + def test_unknown_provider_is_a_clear_error(): with pytest.raises(RuntimeError, match="no stream provider 'nope'"): streams.configure(provider="nope") From fb74e7901cc4bd3a380d76b78acb2e0a5b5de7d0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 031/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/redis.py | 87 ++++++++++++++++++--------- 1 file changed, 57 insertions(+), 30 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 7931e9fd4..ec5742bf2 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -26,7 +26,9 @@ BEGINNING as PROVIDER_BEGINNING, AFTER, ExternalOutputStreamClient, + ExternalOutputStreamProducer, ExternalStreamProducer, + Offset, WakeNotAcknowledgedError, WorkflowChainKey, external_output_stream, @@ -185,24 +187,21 @@ def __init__(self, client: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ - if topic is None: - raise ValueError( - "this provider stores each topic separately, so an outside " - "reader has to name one" - ) attempts = AttemptTracker() - after = PROVIDER_BEGINNING if not start.token else AFTER(start.token) - handle = self._client.topic(topic, type=bytes) - async for item in handle.subscribe(after=after): + boundary = ( + AFTER(Offset(after.token)) if after.token else PROVIDER_BEGINNING + ) + handle = self._client.topic(self._require_topic(topic), type=bytes) + async for item in handle.subscribe(after=boundary): cursor = Cursor(str(item.offset)) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( @@ -223,6 +222,21 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + tail = await self._client.topic(self._require_topic(topic), type=bytes).tail() + if tail.is_beginning: + return BEGINNING + return Cursor(tail.offset.token) + + @staticmethod + def _require_topic(topic: str | None) -> str: + if topic is None: + raise ValueError( + "this provider stores each topic separately, so an outside " + "reader has to name one" + ) + return topic + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -283,14 +297,14 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # The provider resolves the name under this run's chain key, so a start # position is only meaningful to a reader that already has one, and this # provider's first subscription always starts at the beginning of the # stream it minted. - if start is not BEGINNING and start.token: + if after.token: raise ValueError( "the client-side provider starts a new subscription at the " "beginning of the stream it owns; resuming elsewhere is not " @@ -309,35 +323,48 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> RedisProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the workflow's output stream, appended directly rather than through + the workflow's staged commit. Inside an activity, leave ``producer_id`` + and ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ if not producer_id: producer_id = activity.info().activity_id if not attempt: attempt = activity.info().attempt - session = await ExternalStreamProducer.connect( - backend=self._require_backend(), - workflow=await _chain_key(client, workflow_id), - client=client, - # The attempt is part of it. Deduplication answers "is this the - # same append again", and a second attempt writing different words - # at the same sequence is not: this provider rejects that outright. - # Folding the attempt in keeps a retried append idempotent without - # letting a new generation be refused as a conflicting duplicate. - session_id=f"{producer_id}#{attempt}", - ) + # The attempt is part of it. Deduplication answers "is this the + # same append again", and a second attempt writing different words + # at the same sequence is not: this provider rejects that outright. + # Folding the attempt in keeps a retried append idempotent without + # letting a new generation be refused as a conflicting duplicate. + session_id = f"{producer_id}#{attempt}" + chain = await _chain_key(client, workflow_id) + if stream: + session: Any = await ExternalStreamProducer.connect( + backend=self._require_backend(), + workflow=chain, + client=client, + session_id=session_id, + ) + else: + session = await ExternalOutputStreamProducer.connect( + backend=self._require_backend(), + workflow=chain, + client=client, + session_id=session_id, + ) return RedisProducer( - session.topic(stream, type=bytes), + session.topic(stream or topic, type=bytes), client.data_converter.payload_converter, - stream, + stream or topic, producer_id, attempt, client, From a76d61463335d3f6dea6d3961021106f6cd4968f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 19:08:41 -0700 Subject: [PATCH 032/831] Applied an external stream replay marker before the task's first drain. A replay marker carries what its Workflow Task published, and installing it resets the publish records. The activation applied it with the non-query jobs, after the signal and update set had already run and published, so a task whose publishes a signal woke replayed as zero records against a manifest of several, and any query against the completed run failed. The marker now goes in with the first set that drains, after that set's other jobs and before the drain. --- temporalio/worker/_workflow_instance.py | 23 +++++++++- tests/streams/test_redis_provider.py | 59 ++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 6693f1994..fc418a624 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -599,11 +599,21 @@ def activate( job_sets: list[ list[temporalio.bridge.proto.workflow_activation.WorkflowActivationJob] ] = [[], [], [], []] + # An external stream replay marker is what this Workflow Task recorded, + # so it has to be installed before any of the task's code runs and + # publishes, or the install wipes those publishes and the manifest + # check fails them. It is applied right before the first drain of the + # activation, after every job that drain will act on. + replay_jobs: list[ + temporalio.bridge.proto.workflow_activation.WorkflowActivationJob + ] = [] for job in act.jobs: if job.HasField("notify_has_patch"): job_sets[0].append(job) elif job.HasField("signal_workflow") or job.HasField("do_update"): job_sets[1].append(job) + elif job.HasField("replay_external_streams"): + replay_jobs.append(job) elif not job.HasField("query_workflow"): if job.HasField("initialize_workflow"): start_job = job.initialize_workflow @@ -629,24 +639,35 @@ def activate( for job in job_set: # Let errors bubble out of these to the caller to fail the task self._apply(job) - if any(job_sets): + for job in replay_jobs: + self._apply(job) + if any(job_sets) or replay_jobs: self._run_once( check_conditions=bool(job_sets[1] or job_sets[2]) ) else: # Preserve the legacy scheduling order for histories which do # not contain the single-batch workflow logic flag. + replay_pending = bool(replay_jobs) for index, job_set in enumerate(job_sets): if not job_set: continue for job in job_set: # Let errors bubble out of these to the caller to fail the task self._apply(job) + if replay_pending and index >= 1: + for job in replay_jobs: + self._apply(job) + replay_pending = False # Run one iteration of the loop. We do not allow conditions to # be checked in patch jobs (first index) or query jobs (last # index). self._run_once(check_conditions=index == 1 or index == 2) + if replay_pending: + for job in replay_jobs: + self._apply(job) + self._run_once(check_conditions=True) except BaseException: # An error is already on its way out, so the replay is *abandoned* # rather than closed. Closing runs `verify_replay_consumed`, which diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 33ad6b88b..94abd8353 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -14,7 +14,7 @@ import pytest -from temporalio import streams +from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind from temporalio.worker import Worker @@ -69,3 +69,60 @@ async def test_interface_loop_over_redis(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + + +@workflow.defn +class SignalWokenPublish: + """Publishes in the task a signal wakes, then completes in that same task.""" + + def __init__(self) -> None: + self._closed = False + + @workflow.signal + def close(self) -> None: + self._closed = True + + @workflow.run + async def run(self) -> int: + out = streams.writer("out") + await out.publish({"n": 0}) + await workflow.wait_condition(lambda: self._closed) + for n in range(1, 4): + await out.publish({"n": n}) + return 4 + + @workflow.query + def probe(self) -> int: + return 1 + + +async def test_query_after_completion_replays_the_final_task(): + # A query against a completed run replays it. The final task's publishes + # were woken by a signal, which the activation applies before the replay + # marker, so the marker's expectations have to be installed before that + # task's code runs or the replay records nothing against a manifest of + # three. + streams.configure( + provider="redis", + url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), + key_prefix=f"streams-redis-live-{uuid.uuid4().hex}", + ) + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-redis-replay-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[SignalWokenPublish], + **streams.worker_options(), + ): + handle = await client.start_workflow( + SignalWokenPublish.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + consumer = await streams.consumer(client, workflow_id=workflow_id) + await take(consumer.read(type=dict, topic="out"), 1, timeout=60) + await handle.signal(SignalWokenPublish.close) + assert await handle.result() == 4 + assert await handle.query(SignalWokenPublish.probe) == 1 From 295fe3fc409dd584b05804550ea96132be01dc6d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 19:08:41 -0700 Subject: [PATCH 033/831] Applied an external stream replay marker before the task's first drain. A replay marker carries what its Workflow Task published, and installing it resets the publish records. The activation applied it with the non-query jobs, after the signal and update set had already run and published, so a task whose publishes a signal woke replayed as zero records against a manifest of several, and any query against the completed run failed. The marker now goes in with the first set that drains, after that set's other jobs and before the drain. --- temporalio/worker/_workflow_instance.py | 23 ++++++- tests/streams/test_redis_replay.py | 92 +++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 tests/streams/test_redis_replay.py diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 7dcf7cd78..88e7a891b 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -528,11 +528,21 @@ def activate( job_sets: list[ list[temporalio.bridge.proto.workflow_activation.WorkflowActivationJob] ] = [[], [], [], []] + # An external stream replay marker is what this Workflow Task recorded, + # so it has to be installed before any of the task's code runs and + # publishes, or the install wipes those publishes and the manifest + # check fails them. It is applied right before the first drain of the + # activation, after every job that drain will act on. + replay_jobs: list[ + temporalio.bridge.proto.workflow_activation.WorkflowActivationJob + ] = [] for job in act.jobs: if job.HasField("notify_has_patch"): job_sets[0].append(job) elif job.HasField("signal_workflow") or job.HasField("do_update"): job_sets[1].append(job) + elif job.HasField("replay_external_streams"): + replay_jobs.append(job) elif not job.HasField("query_workflow"): if job.HasField("initialize_workflow"): start_job = job.initialize_workflow @@ -558,24 +568,35 @@ def activate( for job in job_set: # Let errors bubble out of these to the caller to fail the task self._apply(job) - if any(job_sets): + for job in replay_jobs: + self._apply(job) + if any(job_sets) or replay_jobs: self._run_once( check_conditions=bool(job_sets[1] or job_sets[2]) ) else: # Preserve the legacy scheduling order for histories which do # not contain the single-batch workflow logic flag. + replay_pending = bool(replay_jobs) for index, job_set in enumerate(job_sets): if not job_set: continue for job in job_set: # Let errors bubble out of these to the caller to fail the task self._apply(job) + if replay_pending and index >= 1: + for job in replay_jobs: + self._apply(job) + replay_pending = False # Run one iteration of the loop. We do not allow conditions to # be checked in patch jobs (first index) or query jobs (last # index). self._run_once(check_conditions=index == 1 or index == 2) + if replay_pending: + for job in replay_jobs: + self._apply(job) + self._run_once(check_conditions=True) except BaseException: # An error is already on its way out, so the replay is *abandoned* # rather than closed. Closing runs `verify_replay_consumed`, which diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py new file mode 100644 index 000000000..988b1305d --- /dev/null +++ b/tests/streams/test_redis_replay.py @@ -0,0 +1,92 @@ +"""A query against a completed run replays it on the client-side provider. + +Gated behind ``STREAMS_LIVE=redis``; needs a dev server (``TEMPORAL_ADDRESS``) +and a Redis (``AI198_REDIS_URL``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import Any + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "redis", + reason="needs a live server and redis; run with STREAMS_LIVE=redis", +) + + +async def take(records: Any, count: int, timeout: float = 5.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +@workflow.defn +class SignalWokenPublish: + """Publishes in the task a signal wakes, then completes in that same task.""" + + def __init__(self) -> None: + self._closed = False + + @workflow.signal + def close(self) -> None: + self._closed = True + + @workflow.run + async def run(self) -> int: + out = streams.writer("out") + await out.publish({"n": 0}) + await workflow.wait_condition(lambda: self._closed) + for n in range(1, 4): + await out.publish({"n": n}) + return 4 + + @workflow.query + def probe(self) -> int: + return 1 + + +async def test_query_after_completion_replays_the_final_task(): + # The final task's publishes were woken by a signal, which the activation + # applies before the replay marker, so the marker's expectations have to be + # installed before that task's code runs or the replay records nothing + # against a manifest of three. + streams.configure( + provider="redis", + url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), + key_prefix=f"streams-redis-replay-{uuid.uuid4().hex}", + ) + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-redis-replay-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[SignalWokenPublish], + **streams.worker_options(), + ): + handle = await client.start_workflow( + SignalWokenPublish.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + consumer = await streams.consumer(client, workflow_id=workflow_id) + await take(consumer.read(type=dict, topic="out"), 1, timeout=60) + await handle.signal(SignalWokenPublish.close) + assert await handle.result() == 4 + assert await handle.query(SignalWokenPublish.probe) == 1 From ada7403f6420423e0913e61fe0bdba6b18b5e7f4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 09:46:11 -0700 Subject: [PATCH 034/831] Repinned Core to the linear combined branch. Same tree as the merge it replaces, so the bridge is unchanged. The branch it points at is now external plus the native stream commits in a line, rather than a reconciliation of two Cores. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 680019e12..9cc07b5ff 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 680019e1223967ccc77705d16c140597ddcad188 +Subproject commit 9cc07b5ff8625a839afccecf3a5e939a39a54293 From e828d77ebbf57b30108584a80bf7802046d1e365 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:37:39 -0700 Subject: [PATCH 035/831] Sorted and formatted the streams package for ruff. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and the new files were written by hand. --- streams_demo/agent_loop.py | 10 ++++++---- streams_demo/run_demo.py | 4 ++-- temporalio/streams/__init__.py | 7 ++++++- temporalio/streams/_provider.py | 3 +-- temporalio/streams/providers/memory.py | 11 +++++++++-- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index afbb7ea4c..e68bb0a58 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -29,7 +29,11 @@ async def record_decision(decision: dict[str, Any]) -> str: def decide(token: dict[str, Any]) -> dict[str, Any]: """The decision the workflow is here to make.""" if token["value"] % 2 == 0: - return {"source": token["id"], "branch": "even", "computed": token["value"] * 10} + return { + "source": token["id"], + "branch": "even", + "computed": token["value"] * 10, + } return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} @@ -39,9 +43,7 @@ class AgentLoop: @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: - inputs = streams.reader( - INPUTS, type=dict, idle_timeout=timedelta(seconds=1) - ) + inputs = streams.reader(INPUTS, type=dict, idle_timeout=timedelta(seconds=1)) decisions = streams.writer(DECISIONS) trace: list[dict[str, Any]] = [] accepted = 0 diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 027a95103..687dc1a05 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -17,10 +17,10 @@ import asyncio import json -from pathlib import Path import sys import time import uuid +from pathlib import Path from typing import Any from temporalio import streams @@ -29,8 +29,8 @@ from temporalio.worker import Worker sys.path.insert(0, str(Path(__file__).resolve().parent)) -from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 import provider_setup # noqa: E402 +from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 DECISION_LIMIT = 8 EXPECTED_OUTPUT = 6 diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index aaf0a444d..caaa03ffb 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -54,7 +54,12 @@ from datetime import timedelta from typing import Any, TypeVar -from temporalio.streams._handles import ReadSource, StreamReader, StreamWriter, WriteSink +from temporalio.streams._handles import ( + ReadSource, + StreamReader, + StreamWriter, + WriteSink, +) from temporalio.streams._provider import ( Consumer, Producer, diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index c224b47bf..a36339a97 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -186,8 +186,7 @@ def _make(name: str | None) -> StreamProvider: name = next(iter(_factories)) else: raise RuntimeError( - "name a provider: configure(provider=...) with one of " - f"{registered()}" + f"name a provider: configure(provider=...) with one of {registered()}" ) factory = _factories.get(name) if factory is None: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 477a17b68..fb2712350 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -131,7 +131,12 @@ class MemoryProducer: """The outside producer, faithful to the contract.""" def __init__( - self, store: _MemoryStream, converter: Any, topic: str, producer_id: str, attempt: int + self, + store: _MemoryStream, + converter: Any, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._store = store self._converter = converter @@ -147,7 +152,9 @@ def attempt(self) -> int: @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: From 24753cf1e9a54e95e9acc98f8e23684d71575773 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:37:53 -0700 Subject: [PATCH 036/831] Added the changelog entry for the stream interface. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be3444177..e32ed2f24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,11 @@ to include examples, links to docs, or any other relevant information. ### Added +- **Experimental**: `temporalio.streams` defines one stream interface a workflow + can read, decide on, and write, with a registry that picks the provider when + the worker is built. `temporalio.streams.providers.memory` is the in-memory + reference provider the conformance tests run against. + ### Changed ### Deprecated From 3ed8e4b37e87773813742cdfa29729c32b28c8f2 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:48:04 -0700 Subject: [PATCH 037/831] Made the streams package pass the type and doc linters. `prepare` and `drain` are hooks only a transport that parks something against the running workflow needs, so they move to their own protocol rather than making every provider carry two empty methods. The demo's teardown called a `close` that no provider setup defined. --- streams_demo/agent_loop.py | 1 + streams_demo/provider_setup.py | 10 +++++++++ streams_demo/run_demo.py | 2 ++ temporalio/streams/__init__.py | 6 +++++- temporalio/streams/_policy.py | 1 + temporalio/streams/_provider.py | 25 +++++++++++++++++------ temporalio/streams/providers/memory.py | 7 +++++++ tests/streams/test_streams_conformance.py | 2 +- 8 files changed, 46 insertions(+), 8 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index e68bb0a58..f3f39dca9 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -43,6 +43,7 @@ class AgentLoop: @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: + """Decide on at most ``limit`` inputs, then return the trace.""" inputs = streams.reader(INPUTS, type=dict, idle_timeout=timedelta(seconds=1)) decisions = streams.writer(DECISIONS) trace: list[dict[str, Any]] = [] diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index 81e7108e5..52ebbd266 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -18,4 +18,14 @@ async def open() -> tuple[str, dict]: + """The server to connect to and the options :func:`configure` takes.""" return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), {"provider": NAME} + + +async def close() -> None: + """Let go of whatever :func:`open` acquired. + + Nothing here: the memory provider holds no connection. A provider branch + that opens one closes it here, so the demo's teardown reads the same on + every provider. + """ diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 687dc1a05..9d6a62cb5 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -37,6 +37,7 @@ async def collect_output(client: Client, workflow_id: str, want: int) -> list[dict]: + """Read ``want`` decisions off the workflow's stream from outside it.""" reader = await streams.consumer(client, workflow_id=workflow_id) seen: list[dict] = [] async for record in reader.read(type=dict, topic="decisions"): @@ -47,6 +48,7 @@ async def collect_output(client: Client, workflow_id: str, want: int) -> list[di async def main() -> int: + """Run the demo once and write what happened next to this file.""" out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" out.mkdir(exist_ok=True) target, options = await provider_setup.open() diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index caaa03ffb..cd55ee9d4 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -64,6 +64,7 @@ Consumer, Producer, StreamProvider, + StreamProviderLifecycle, configure, consumer, drain, @@ -89,6 +90,7 @@ "ReadSource", "RecordKind", "StreamProvider", + "StreamProviderLifecycle", "StreamReader", "StreamRecord", "StreamWriter", @@ -154,4 +156,6 @@ def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: # Importing the package registers every provider whose dependencies are # present in this tree. Import order matters: the registry above must exist # before a provider module can register with it. -from temporalio.streams import providers as _providers # noqa: E402,F401 +from temporalio.streams import ( + providers as _providers, # noqa: E402,F401 # pyright: ignore[reportUnusedImport] +) diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py index 24e20ab2f..73114bbdb 100644 --- a/temporalio/streams/_policy.py +++ b/temporalio/streams/_policy.py @@ -26,6 +26,7 @@ class AttemptTracker: """Watches producer attempts on one subscription.""" def __init__(self) -> None: + """Start with no producer seen.""" self._attempts: dict[str, int] = {} def note( diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index a36339a97..18e2bb983 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -21,6 +21,7 @@ "Consumer", "Producer", "StreamProvider", + "StreamProviderLifecycle", "configure", "consumer", "drain", @@ -96,6 +97,9 @@ class StreamProvider(Protocol): outside pair (:meth:`producer`, :meth:`consumer`) runs anywhere and moves framed bytes. A transport-only provider may serve just the outside pair and raise on the workflow side, naming the provider a worker should use. + + A provider whose transport parks something against the running workflow + also implements :class:`StreamProviderLifecycle`. """ name: str @@ -147,21 +151,30 @@ async def consumer( """Open a reader for what ``workflow_id`` publishes.""" ... + +class StreamProviderLifecycle(Protocol): + """The hooks a provider adds when it needs the workflow's own lifetime. + + Separate from :class:`StreamProvider` because most transports need + neither, and a provider is not asked to carry a pair of empty methods to + say so. :func:`prepare` and :func:`drain` call whichever half is present. + """ + def prepare(self) -> None: """Install whatever this provider needs before the workflow runs. - Optional. A provider that serves outside readers through handlers on - the workflow itself has to register them before the first task - completes, or a reader that arrives early finds nothing to talk to. + A provider that serves outside readers through handlers on the + workflow itself has to register them before the first task completes, + or a reader that arrives early finds nothing to talk to. """ ... def drain(self) -> None: """Release anything this provider parked on the workflow's behalf. - Optional. A provider that parks an outside reader against the running - workflow, as the Workflow Streams transport does with its long-poll - update, has to let go before the workflow can return. + A provider that parks an outside reader against the running workflow, + as the Workflow Streams transport does with its long-poll update, has + to let go before the workflow can return. """ ... diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index fb2712350..f7e58ef44 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -138,6 +138,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on ``store``.""" self._store = store self._converter = converter self._topic = topic @@ -147,6 +148,7 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property @@ -158,6 +160,7 @@ def _provider_id(self) -> str: ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last one.""" frames = [] for value in values: frames.append( @@ -179,6 +182,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor(str(offset)) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._topic, kind=RecordKind.FINISH, @@ -205,6 +209,7 @@ class MemoryConsumer: """The outside reader, with the shared supersession rule.""" def __init__(self, store: _MemoryStream, converter: Any) -> None: + """Read whatever ``store`` holds, now and as it grows.""" self._store = store self._converter = converter @@ -215,6 +220,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() offset = int(after.token) + 1 if after.token else 0 while True: @@ -246,6 +252,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one store per stream, so the position is topic-independent count = len(self._store.frames) return Cursor(str(count - 1)) if count else BEGINNING diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 978ef5ca1..0c7818064 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -22,7 +22,7 @@ @pytest.fixture(autouse=True) -def _fresh_memory_provider(): +def _fresh_memory_provider(): # pyright: ignore[reportUnusedFunction] memory.reset() streams.configure(provider="memory") yield From 84af4ecd41c6bd034c6b063376ef020dfd1f071f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 038/831] Pinned Core to the stream revision and regenerated bridge protos. --- .gitmodules | 2 +- .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 613 ++++++-------- .../workflow_activation_pb2.pyi | 68 ++ .../workflow_commands_pb2.py | 800 +++++++----------- .../workflow_commands_pb2.pyi | 90 ++ temporalio/bridge/sdk-core | 2 +- 7 files changed, 737 insertions(+), 840 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..ae7639820 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamMessages, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamMessages", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..0e1b3a1e6 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,430 +2,311 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.update.v1 import ( - message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, -) -from temporalio.bridge.proto.activity_result import ( - activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' -) - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ - "HeadersEntry" -] -_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStart" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartSuccess" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartFailure" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartCancelled" -] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecution" -] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveSignalExternalWorkflow" -] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveRequestCancelExternalWorkflow" -] -_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveNexusOperationStart" -] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] -WorkflowActivation = _reflection.GeneratedProtocolMessageType( - "WorkflowActivation", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }, -) + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] +_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] +_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] +WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( - "WorkflowActivationJob", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }, -) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }) _sym_db.RegisterMessage(WorkflowActivationJob) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType( - "InitializeWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _INITIALIZEWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }, -) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }) +_sym_db.RegisterMessage(DeliverStreamMessages) + +InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _INITIALIZEWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType( - "FireTimer", - (_message.Message,), - { - "DESCRIPTOR": _FIRETIMER, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }, -) +FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { + 'DESCRIPTOR' : _FIRETIMER, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType( - "ResolveActivity", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEACTIVITY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }, -) +ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }, -) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartSuccess", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }, -) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartFailure", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }, -) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartCancelled", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }, -) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }, -) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( - "UpdateRandomSeed", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERANDOMSEED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }, -) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERANDOMSEED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType( - "QueryWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _QUERYWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }, -) +QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _QUERYWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }, -) +CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType( - "SignalWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }, -) +SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType( - "NotifyHasPatch", - (_message.Message,), - { - "DESCRIPTOR": _NOTIFYHASPATCH, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }, -) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { + 'DESCRIPTOR' : _NOTIFYHASPATCH, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveSignalExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }, -) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveRequestCancelExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }, -) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType( - "DoUpdate", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }, - ), - "DESCRIPTOR": _DOUPDATE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }, -) +DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }) + , + 'DESCRIPTOR' : _DOUPDATE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperationStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }, -) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }, -) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType( - "RemoveFromCache", - (_message.Message,), - { - "DESCRIPTOR": _REMOVEFROMCACHE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }, -) +RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { + 'DESCRIPTOR' : _REMOVEFROMCACHE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" - ) - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' + _WORKFLOWACTIVATION._serialized_start=570 + _WORKFLOWACTIVATION._serialized_end=1116 + _WORKFLOWACTIVATIONJOB._serialized_start=1119 + _WORKFLOWACTIVATIONJOB._serialized_end=2582 + _DELIVERSTREAMMESSAGES._serialized_start=2585 + _DELIVERSTREAMMESSAGES._serialized_end=2724 + _INITIALIZEWORKFLOW._serialized_start=2727 + _INITIALIZEWORKFLOW._serialized_end=4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 + _FIRETIMER._serialized_start=4133 + _FIRETIMER._serialized_end=4157 + _RESOLVEACTIVITY._serialized_start=4159 + _RESOLVEACTIVITY._serialized_end=4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 + _UPDATERANDOMSEED._serialized_start=5045 + _UPDATERANDOMSEED._serialized_end=5088 + _QUERYWORKFLOW._serialized_start=5091 + _QUERYWORKFLOW._serialized_end=5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 + _CANCELWORKFLOW._serialized_start=5353 + _CANCELWORKFLOW._serialized_end=5385 + _SIGNALWORKFLOW._serialized_start=5388 + _SIGNALWORKFLOW._serialized_end=5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 + _NOTIFYHASPATCH._serialized_start=5679 + _NOTIFYHASPATCH._serialized_end=5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 + _DOUPDATE._serialized_start=5917 + _DOUPDATE._serialized_end=6248 + _DOUPDATE_HEADERSENTRY._serialized_start=4052 + _DOUPDATE_HEADERSENTRY._serialized_end=4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 + _RESOLVENEXUSOPERATION._serialized_start=6407 + _RESOLVENEXUSOPERATION._serialized_end=6496 + _REMOVEFROMCACHE._serialized_start=6499 + _REMOVEFROMCACHE._serialized_end=6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..eab815fc9 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.update.v1.message_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_messages(self) -> global___DeliverStreamMessages: + """A range of a stream the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +327,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +335,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -368,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -421,6 +431,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_messages", "remove_from_cache", ] | None @@ -1440,6 +1451,63 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 64fa8a255..ccfa1a016 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,552 +2,408 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" - +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.sdk.v1 import ( - event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, -) -from temporalio.api.sdk.v1 import ( - user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' -) - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] -_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ - "HeadersEntry" -] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ - "RequestCancelLocalActivity" -] -_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CompleteWorkflowExecution" -] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ContinueAsNewWorkflowExecution" -] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "StartChildWorkflowExecution" -] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CancelChildWorkflowExecution" -] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "RequestCancelExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "SignalExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( - _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ - "UpsertWorkflowSearchAttributes" -] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ - "NexusHeaderEntry" -] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ - "RequestCancelNexusOperation" -] -WorkflowCommand = _reflection.GeneratedProtocolMessageType( - "WorkflowCommand", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWCOMMAND, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }, -) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] +_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] +_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] +_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] +WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWCOMMAND, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }) _sym_db.RegisterMessage(WorkflowCommand) -StartTimer = _reflection.GeneratedProtocolMessageType( - "StartTimer", - (_message.Message,), - { - "DESCRIPTOR": _STARTTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }, -) +AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _ADDSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }) +_sym_db.RegisterMessage(AddStreamMessages) + +SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTREAM, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }) +_sym_db.RegisterMessage(SubscribeStream) + +StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { + 'DESCRIPTOR' : _STARTTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType( - "CancelTimer", - (_message.Message,), - { - "DESCRIPTOR": _CANCELTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }, -) +CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { + 'DESCRIPTOR' : _CANCELTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULEACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }, -) +ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleLocalActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULELOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }, -) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }, -) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelLocalActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }, -) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType( - "QueryResult", - (_message.Message,), - { - "DESCRIPTOR": _QUERYRESULT, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }, -) +QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { + 'DESCRIPTOR' : _QUERYRESULT, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType( - "QuerySuccess", - (_message.Message,), - { - "DESCRIPTOR": _QUERYSUCCESS, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }, -) +QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { + 'DESCRIPTOR' : _QUERYSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CompleteWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }, -) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "FailWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _FAILWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }, -) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ContinueAsNewWorkflowExecution", - (_message.Message,), - { - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }, - ), - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }, -) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }) + , + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }, -) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType( - "SetPatchMarker", - (_message.Message,), - { - "DESCRIPTOR": _SETPATCHMARKER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }, -) +SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { + 'DESCRIPTOR' : _SETPATCHMARKER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "StartChildWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }, - ), - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }, - ), - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }, -) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }) + , + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }) + , + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }, -) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "RequestCancelExternalWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }, -) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "SignalExternalWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }, -) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelSignalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELSIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }, -) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( - "UpsertWorkflowSearchAttributes", - (_message.Message,), - { - "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }, -) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { + 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( - "ModifyWorkflowProperties", - (_message.Message,), - { - "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }, -) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { + 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType( - "UpdateResponse", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERESPONSE, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }, -) +UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERESPONSE, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( - "ScheduleNexusOperation", - (_message.Message,), - { - "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( - "NexusHeaderEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }, - ), - "DESCRIPTOR": _SCHEDULENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }, -) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { + + 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( - "RequestCancelNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }, -) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" - ) - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8633 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8721 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4300 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4302 - _REQUESTCANCELACTIVITY._serialized_end = 4338 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4340 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4381 - _QUERYRESULT._serialized_start = 4384 - _QUERYRESULT._serialized_end = 4540 - _QUERYSUCCESS._serialized_start = 4542 - _QUERYSUCCESS._serialized_end = 4607 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4609 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4685 - _FAILWORKFLOWEXECUTION._serialized_start = 4687 - _FAILWORKFLOWEXECUTION._serialized_end = 4761 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4764 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5678 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5521 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5597 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5680 - _CANCELWORKFLOWEXECUTION._serialized_end = 5756 - _SETPATCHMARKER._serialized_start = 5758 - _SETPATCHMARKER._serialized_end = 5812 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5815 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 6989 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5521 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5597 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 6991 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7065 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7068 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7210 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7213 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7612 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7614 - _CANCELSIGNALWORKFLOW._serialized_end = 7649 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7651 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7752 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7754 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7833 - _UPDATERESPONSE._serialized_start = 7836 - _UPDATERESPONSE._serialized_end = 8046 - _SCHEDULENEXUSOPERATION._serialized_start = 8049 - _SCHEDULENEXUSOPERATION._serialized_end = 8587 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8537 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8587 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8589 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8631 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' + _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 + _WORKFLOWCOMMAND._serialized_start=556 + _WORKFLOWCOMMAND._serialized_end=2794 + _ADDSTREAMMESSAGES._serialized_start=2796 + _ADDSTREAMMESSAGES._serialized_end=2891 + _SUBSCRIBESTREAM._serialized_start=2893 + _SUBSCRIBESTREAM._serialized_end=2951 + _STARTTIMER._serialized_start=2953 + _STARTTIMER._serialized_end=3036 + _CANCELTIMER._serialized_start=3038 + _CANCELTIMER._serialized_end=3064 + _SCHEDULEACTIVITY._serialized_start=3067 + _SCHEDULEACTIVITY._serialized_end=3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 + _SCHEDULELOCALACTIVITY._serialized_start=3894 + _SCHEDULELOCALACTIVITY._serialized_end=4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 + _REQUESTCANCELACTIVITY._serialized_start=4646 + _REQUESTCANCELACTIVITY._serialized_end=4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 + _QUERYRESULT._serialized_start=4728 + _QUERYRESULT._serialized_end=4884 + _QUERYSUCCESS._serialized_start=4886 + _QUERYSUCCESS._serialized_end=4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 + _FAILWORKFLOWEXECUTION._serialized_start=5031 + _FAILWORKFLOWEXECUTION._serialized_end=5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELWORKFLOWEXECUTION._serialized_start=6024 + _CANCELWORKFLOWEXECUTION._serialized_end=6100 + _SETPATCHMARKER._serialized_start=6102 + _SETPATCHMARKER._serialized_end=6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELSIGNALWORKFLOW._serialized_start=7958 + _CANCELSIGNALWORKFLOW._serialized_end=7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 + _UPDATERESPONSE._serialized_start=8180 + _UPDATERESPONSE._serialized_end=8390 + _SCHEDULENEXUSOPERATION._serialized_start=8393 + _SCHEDULENEXUSOPERATION._serialized_end=8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 510643132..f5a5fdb97 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,6 +23,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,10 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: ... + @property + def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( self, *, @@ -215,6 +222,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... def HasField( self, @@ -243,6 +252,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -298,6 +311,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -350,6 +367,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "add_stream_messages", ] | None ): ... @@ -386,6 +405,77 @@ class StartTimer(google.protobuf.message.Message): global___StartTimer = StartTimer +class AddStreamMessages(google.protobuf.message.Message): + """Publish a batch of messages to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand messages cost the same in History as one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessages = AddStreamMessages + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index b860e3f14..3d1f82e66 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit b860e3f14f68af64bd4d0e372b3c78b2ce9ecff1 +Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 From 2eaa1e7e013a6819d8fbb50f412918c60d79c2b0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 039/831] Added the vendored stream API protos. --- scripts/gen_stream_protos.py | 161 +++++ temporalio/api/stream/__init__.py | 0 temporalio/api/stream/v1/__init__.py | 11 + temporalio/api/stream/v1/message_pb2.py | 69 ++ temporalio/api/stream/v1/message_pb2.pyi | 134 ++++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 138 ++++ .../api/streamservice/v1/message_pb2.py | 46 ++ .../api/streamservice/v1/message_pb2.pyi | 47 ++ .../api/streamservice/v1/message_pb2_grpc.py | 24 + .../streamservice/v1/request_response_pb2.py | 138 ++++ .../streamservice/v1/request_response_pb2.pyi | 434 ++++++++++++ .../v1/request_response_pb2_grpc.py | 24 + .../api/streamservice/v1/service_pb2.py | 38 ++ .../api/streamservice/v1/service_pb2.pyi | 5 + .../api/streamservice/v1/service_pb2_grpc.py | 616 ++++++++++++++++++ .../api/streamservice/v1/stream_state_pb2.py | 56 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 114 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 24 + 19 files changed, 2079 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/stream/__init__.py create mode 100644 temporalio/api/stream/v1/__init__.py create mode 100644 temporalio/api/stream/v1/message_pb2.py create mode 100644 temporalio/api/stream/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..e66f8abb4 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,161 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, "-m", "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--pyi_out={out}", + f"--grpc_python_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/stream/__init__.py b/temporalio/api/stream/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py new file mode 100644 index 000000000..f76c1c334 --- /dev/null +++ b/temporalio/api/stream/v1/__init__.py @@ -0,0 +1,11 @@ +from .message_pb2 import ( + StreamCursor, + StreamMessage, + StreamSlice, +) + +__all__ = [ + "StreamCursor", + "StreamMessage", + "StreamSlice", +] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py new file mode 100644 index 000000000..da1e5bc91 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/stream/v1/message.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto\"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03\"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3') + + + +_STREAMMESSAGE = DESCRIPTOR.message_types_by_name['StreamMessage'] +_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name['MetadataEntry'] +_STREAMSLICE = DESCRIPTOR.message_types_by_name['StreamSlice'] +_STREAMCURSOR = DESCRIPTOR.message_types_by_name['StreamCursor'] +StreamMessage = _reflection.GeneratedProtocolMessageType('StreamMessage', (_message.Message,), { + + 'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), { + 'DESCRIPTOR' : _STREAMMESSAGE_METADATAENTRY, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) + }) + , + 'DESCRIPTOR' : _STREAMMESSAGE, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) + }) +_sym_db.RegisterMessage(StreamMessage) +_sym_db.RegisterMessage(StreamMessage.MetadataEntry) + +StreamSlice = _reflection.GeneratedProtocolMessageType('StreamSlice', (_message.Message,), { + 'DESCRIPTOR' : _STREAMSLICE, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }) +_sym_db.RegisterMessage(StreamSlice) + +StreamCursor = _reflection.GeneratedProtocolMessageType('StreamCursor', (_message.Message,), { + 'DESCRIPTOR' : _STREAMCURSOR, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) + }) +_sym_db.RegisterMessage(StreamCursor) + +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1' + _STREAMMESSAGE_METADATAENTRY._options = None + _STREAMMESSAGE_METADATAENTRY._serialized_options = b'8\001' + _STREAMMESSAGE._serialized_start=103 + _STREAMMESSAGE._serialized_end=357 + _STREAMMESSAGE_METADATAENTRY._serialized_start=277 + _STREAMMESSAGE_METADATAENTRY._serialized_end=357 + _STREAMSLICE._serialized_start=360 + _STREAMSLICE._serialized_end=547 + _STREAMCURSOR._serialized_start=549 + _STREAMCURSOR._serialized_end=622 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi new file mode 100644 index 000000000..c1c796da8 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -0,0 +1,134 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" +import builtins +import collections.abc +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message +import sys +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["value", b"value"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + @property + def metadata(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, temporalio.api.common.v1.message_pb2.Payload]: ... + topic: builtins.str + topic_sequence: builtins.int + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[builtins.str, temporalio.api.common.v1.message_pb2.Payload] | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["body", b"body"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["body", b"body", "metadata", b"metadata", "topic", b"topic", "topic_sequence", b"topic_sequence"]) -> None: ... + +global___StreamMessage = StreamMessage + +class StreamSlice(google.protobuf.message.Message): + """A contiguous range of a stream delivered to a Workflow Task, along with the + offsets it covers. The offsets are what History records; the messages + themselves are never written to History. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription observed nothing, + which is a fact replay has to reproduce rather than an absence of one. + """ + @property + def messages(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___StreamMessage]: ... + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event whose stream_cursors recorded this range. + Set only when the server is re-supplying a range for a task being + replayed; a slice for the task now being started leaves it unset, because + the event closing that task does not exist yet. + + Replay needs this because a Workflow Task response carries one slice set + while a cache miss replays every prior task, so the ranges have to be + matched to the events that recorded them rather than to the response. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + workflow_task_completed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "messages", b"messages", "run_id", b"run_id", "stream_id", b"stream_id", "to_offset", b"to_offset", "workflow_task_completed_event_id", b"workflow_task_completed_event_id"]) -> None: ... + +global___StreamSlice = StreamSlice + +class StreamCursor(google.protobuf.message.Message): + """The offsets a Workflow Task consumed, without the payloads. Recorded on + WorkflowTaskCompleted so History grows with Workflow Tasks rather than with + messages. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + from_offset: builtins.int + to_offset: builtins.int + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "stream_id", b"stream_id", "to_offset", b"to_offset"]) -> None: ... + +global___StreamCursor = StreamCursor diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..31f99bded --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,138 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + STREAM_MESSAGE_KIND_DATA, + STREAM_MESSAGE_KIND_FLUSH, + STREAM_MESSAGE_KIND_UNSPECIFIED, + StreamMessage, + StreamMessageBatch, + StreamMessageKind, +) + +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "STREAM_MESSAGE_KIND_DATA", + "STREAM_MESSAGE_KIND_FLUSH", + "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamLifecycle", + "StreamListEntry", + "StreamMessage", + "StreamMessageBatch", + "StreamMessageKind", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..b4fe8e68a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/message.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/message.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z None: ... + BODY_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + body: _message_pb2.Payload + metadata: _containers.MessageMap[str, _message_pb2.Payload] + topic: str + topic_sequence: int + kind: StreamMessageKind + offset: int + def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + +class StreamMessageBatch(_message.Message): + __slots__ = ("messages",) + MESSAGES_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] + def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..b1383816d --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..60dafee45 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/request_response.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/request_response.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + +class CreateStreamOutput(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class AddMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + expected_offset: int + use_expected_offset: bool + owner_epoch: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + +class AddMessagesOutput(_message.Message): + __slots__ = ("first_offset", "next_offset", "count", "deduplicated") + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] + first_offset: int + next_offset: int + count: int + deduplicated: bool + def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + +class FinishWritingInput(_message.Message): + __slots__ = ("namespace", "stream_id", "producer_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + producer_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + +class FinishWritingOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SubscribeWorkflowInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + stream_id: str + start_offset: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class SubscribeWorkflowOutput(_message.Message): + __slots__ = ("start_offset",) + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + start_offset: int + def __init__(self, start_offset: _Optional[int] = ...) -> None: ... + +class PollMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class PollMessagesOutput(_message.Message): + __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") + MESSAGES_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + next_offset: int + head_offset: int + closed: bool + close_reason: _message_pb2_1.Payload + def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class DescribeStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class PollWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class DescribeWorkflowStreamInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + +class AddWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + +class DescribeStreamOutput(_message.Message): + __slots__ = ("state",) + STATE_FIELD_NUMBER: _ClassVar[int] + state: _stream_state_pb2.StreamState + def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + +class CloseStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "reason") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + reason: _message_pb2_1.Payload + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class CloseStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TruncateStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "new_base_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + new_base_offset: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + +class TruncateStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class DeleteStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class CreateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CreateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + +class CreateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CreateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + +class AddMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + +class AddMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class FinishWritingRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: FinishWritingInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + +class FinishWritingResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: FinishWritingOutput + def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: SubscribeWorkflowInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: SubscribeWorkflowOutput + def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + +class PollMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + +class PollMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeWorkflowStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class CloseStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CloseStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + +class CloseStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CloseStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + +class TruncateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: TruncateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + +class TruncateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: TruncateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + +class ListStreamsInput(_message.Message): + __slots__ = ("namespace", "page_size", "next_page_token", "query") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + namespace: str + page_size: int + next_page_token: bytes + query: str + def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + +class StreamListEntry(_message.Message): + __slots__ = ("stream_id", "run_id") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + stream_id: str + run_id: str + def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + +class ListStreamsOutput(_message.Message): + __slots__ = ("streams", "next_page_token") + STREAMS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] + next_page_token: bytes + def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + +class ListStreamsRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: ListStreamsInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + +class ListStreamsResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: ListStreamsOutput + def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + +class DeleteStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DeleteStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + +class DeleteStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DeleteStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..87cc91022 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..7f376c28e --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class StreamServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True) + self.AddMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True) + self.FinishWriting = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True) + self.SubscribeWorkflow = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True) + self.PollMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True) + self.DescribeStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True) + self.PollWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True) + self.DescribeWorkflowStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True) + self.AddWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True) + self.CloseStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True) + self.TruncateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True) + self.ListStreams = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True) + self.DeleteStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True) + + +class StreamServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def CreateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinishWriting(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeWorkflow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollWorkflowMessages(self, request, context): + """Routed on the owner, because the stream it reads has no id of its own. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeWorkflowStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkflowMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TruncateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListStreams(self, request, context): + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_StreamServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateStream': grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + 'AddMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + 'FinishWriting': grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + 'PollMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + 'DescribeStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + 'CloseStream': grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + 'TruncateStream': grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + 'ListStreams': grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + 'DeleteStream': grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class StreamService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinishWriting(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeWorkflow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeWorkflowStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CloseStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def TruncateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListStreams(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..234fa94d0 --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/stream_state.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/stream_state.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z None: ... + class ConsumersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ConsumerCursor + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCERS_FIELD_NUMBER: _ClassVar[int] + CONSUMERS_FIELD_NUMBER: _ClassVar[int] + LIFECYCLE_FIELD_NUMBER: _ClassVar[int] + REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] + head_offset: int + base_offset: int + last_txn_id: int + closed: bool + close_reason: _message_pb2.Payload + owner_epoch: int + bucket_size: int + collection_id: str + producers: _containers.MessageMap[str, ProducerCursor] + consumers: _containers.MessageMap[str, ConsumerCursor] + lifecycle: StreamLifecycle + redirect_run_id: str + close_time: _timestamp_pb2.Timestamp + def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProducerCursor(_message.Message): + __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") + SEQ_FIELD_NUMBER: _ClassVar[int] + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] + FENCED_FIELD_NUMBER: _ClassVar[int] + seq: int + first_offset: int + count: int + content_hash: bytes + fenced: bool + def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + +class ConsumerCursor(_message.Message): + __slots__ = ("workflow_id", "run_id", "offset", "active", "external") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + run_id: str + offset: int + active: bool + external: bool + def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + +class WorkflowStreamCursor(_message.Message): + __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + PENDING_FROM_FIELD_NUMBER: _ClassVar[int] + PENDING_TO_FIELD_NUMBER: _ClassVar[int] + HAS_PENDING_FIELD_NUMBER: _ClassVar[int] + stream_id: str + collection_id: str + bucket_size: int + offset: int + known_head: int + external: bool + pending_from: int + pending_to: int + has_pending: bool + def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + +class StreamLifecycle(_message.Message): + __slots__ = ("retention", "max_items") + RETENTION_FIELD_NUMBER: _ClassVar[int] + MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] + retention: _duration_pb2.Duration + max_items: int + def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..4e128a2aa --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) From f1b9ff18442f3cdc819f7c96f3876ea3eba0c8dc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 040/831] Added the stream client and the workflow stream surface. --- temporalio/client_stream.py | 476 +++++++++++++++++++++++ temporalio/worker/_workflow_instance.py | 142 +++++++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 119 ++++++ tests/test_client_stream.py | 128 ++++++ tests/worker/test_workflow_stream.py | 113 ++++++ tests/worker/test_workflow_stream_e2e.py | 244 ++++++++++++ 7 files changed, 1232 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py create mode 100644 tests/worker/test_workflow_stream.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..75388c9c9 --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,476 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` + instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, AsyncIterator, Optional, Sequence + +import google.protobuf.duration_pb2 + +import temporalio.api.common.v1 +import temporalio.api.streamservice.v1 as stream +from temporalio.api.streamservice.v1 import service_pb2_grpc + +__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] + + +@dataclass(frozen=True) +class Message: + """One item read from a stream. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back messages whose offsets are not contiguous. To resume at the + boundary of a whole read, checkpoint the ``next_offset`` that + :meth:`StreamHandle.read` returns instead. + """ + + data: bytes + topic: str = "" + offset: int = 0 + """Where this message sits in the whole stream. + + A topic filter leaves gaps, so a reader that resumes between messages has + to take this rather than count what it received. + """ + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. + """ + + messages: list[Message] + next_offset: int + head_offset: int + closed: bool + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + self._stub = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> "StreamClient": + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + try: + import grpc + except ImportError as err: + raise RuntimeError( + "temporalio.client_stream requires the grpc extra: " + "pip install 'temporalio[grpc]'" + ) from err + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: Optional[float] = None, + max_items: Optional[int] = None, + ) -> "StreamHandle": + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many messages remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await self._stub.CreateStream( + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ) + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> "StreamHandle": + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "" + ) -> "WorkflowStreamHandle": + """Open a stream a workflow publishes to. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.add_stream_messages`` writes to when it is given none. + + The stream is created by the workflow's first publish. Reading one that + does not exist yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when the + workflow publishes. + """ + return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + + +class StreamHandle: + """A handle to one stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append messages and return the offset the first one landed at. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice. Without them the append is at-least-once, which is + only the right trade when duplicates are harmless. + """ + response = await self._stub.AddMessages( + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, returning the messages and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=offset, + topics=list(topics), + wait_new_messages=True, + ) + ) + ) + out = response.frontend_response + for msg in out.messages: + yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) + offset = out.next_offset + if out.closed and offset >= out.head_offset: + return + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await self._stub.FinishWriting( + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ) + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await self._stub.CloseStream( + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await self._stub.DescribeStream( + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow publishes to. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, stub: Any, namespace: str, workflow_id: str, name: str = "" + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await self._stub.AddWorkflowMessages( + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for msg in page.messages: + yield msg + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_messages: int = 0, + wait: bool = True, + ) -> "Page": + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + """ + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return Page( + messages=[ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await self._stub.DescribeWorkflowStream( + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + ) + ) + ) + return response.frontend_response.state diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 69b416f26..7dd61a11c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -262,6 +263,71 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# which would replay and re-issue the same rejected command forever, into an +# error the workflow author can see. +_MAX_STREAM_MESSAGES_PER_BATCH = 1000 + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self) -> None: + self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._waiters: list[asyncio.Future] = [] + + def extend( + self, + messages: Sequence[temporalio.api.stream.v1.StreamMessage], + from_offset: int = 0, + ) -> None: + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not messages: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-message field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + self._messages.extend( + temporalio.workflow.DeliveredStreamMessage( + body=message.body.data, + topic=message.topic, + offset=from_offset + index, + ) + for index, message in enumerate(messages) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: + taken, self._messages = self._messages, [] + return taken + + def put_back( + self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._messages[:0] = messages + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._messages) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -389,6 +455,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -604,6 +675,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_messages"): + self._apply_deliver_stream_messages(job.deliver_stream_messages) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1129,6 +1202,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_messages( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer() + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.messages, job.from_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1293,6 +1379,62 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. The + # server treats a repeat subscription to the same stream as a no-op. + self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: + if not messages: + raise ValueError("add_stream_messages needs at least one message") + if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " + f"got {len(messages)}" + ) + command = self._add_command() + command.add_stream_messages.stream_id = stream_id + for body in messages: + # The bodies ride the command and never enter History, so the event + # this produces stays the same size whatever is published here. + message = command.add_stream_messages.messages.add() + message.body.data = body + # Every other Temporal payload names its encoding, and the UI, the + # CLI and any codec server rely on that to decode what they read. + message.body.metadata["encoding"] = b"binary/plain" + message.topic = topic + + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: + return [ + m.body + for m in await self.workflow_read_stream_messages(stream_id, max_messages) + ] + + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[temporalio.workflow.DeliveredStreamMessage]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_messages and len(taken) > max_messages: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_messages:]) + taken = taken[:max_messages] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..9189b0db6 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -95,6 +95,11 @@ upsert_search_attributes, uuid4, uuid7, + DeliveredStreamMessage, + read_stream, + read_stream_messages, + add_stream_messages, + subscribe_stream, wait_condition, ) from ._definition import ( @@ -227,6 +232,11 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamMessage", + "read_stream", + "read_stream_messages", + "add_stream_messages", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..423d77d01 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -312,6 +312,24 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: ... + + @abstractmethod + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: ... + + @abstractmethod + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[DeliveredStreamMessage]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -945,6 +963,107 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream` returns them. Safe to call again: the server treats + a second subscription to the same stream as a no-op, which is what makes + calling it on every replay harmless. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. + + Args: + stream_id: Stream to consume. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def add_stream_messages( + messages: Sequence[bytes], + *, + stream_id: str = "", + topic: str = "", +) -> None: + """Publish a batch of messages to a stream this workflow owns. + + Returns as soon as the command is issued. The bodies go to the stream's own + log rather than into History, which gets one fixed-size event naming the + offset range, so a batch of a thousand costs History the same as a batch of + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Batch where you can. The event is per call, and a workflow is bounded by the + history event count, so one call with a hundred messages leaves far more + room than a hundred calls with one. + + Args: + messages: Bodies to append, in order. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + topic: Optional topic, which readers can filter on. Offsets are still + assigned over the unfiltered stream. + """ + _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + + +@dataclass(frozen=True) +class DeliveredStreamMessage: + """One message a consuming workflow was given, with where it sat.""" + + body: bytes + topic: str + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_messages( + stream_id: str, *, max_messages: int = 0 +) -> list[DeliveredStreamMessage]: + """Read the next messages, keeping their topic and position. + + Same delivery as :func:`read_stream`. A reader that has to name where it + got to, filter a topic, or hand a position to something outside the + workflow needs more than the bodies. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_messages( + stream_id, max_messages + ) + + +async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: + """Read the next messages of a stream this workflow consumes. + + Waits until at least one message is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. + + Subscribe out of band with the stream client. This only reads what has + already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + + Returns: + The message bodies, in stream order. + """ + return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..f7df3c7a7 --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,128 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import AsyncIterator + +import pytest + +from temporalio.client_stream import StreamClient, StreamHandle + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +@pytest.fixture +async def stream() -> AsyncIterator[StreamHandle]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + finally: + await client.close() + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + assert await stream.append(b"alpha", b"beta") == 0 + assert await stream.append(b"gamma") == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(b"alpha", b"beta", b"gamma") + + messages, next_offset = await stream.read() + assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + assert next_offset == 3 + + messages, next_offset = await stream.read(from_offset=1) + assert [m.data for m in messages] == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(b"alpha") + + messages, next_offset = await stream.read(from_offset=1) + assert messages == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same message twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(b"once", producer_id="p1", sequence=1) + retry = await stream.append(b"once", producer_id="p1", sequence=1) + assert first == retry == 0 + + messages, _ = await stream.read() + assert [m.data for m in messages] == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(b"tok", topic="tokens") + await stream.append(b"prog", topic="progress") + await stream.append(b"tok2", topic="tokens") + + messages, next_offset = await stream.read(topics=["tokens"]) + assert [m.data for m in messages] == [b"tok", b"tok2"] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for message in stream.follow(): + received.append(message.data) + + task = asyncio.create_task(follower()) + await stream.append(b"one") + await asyncio.sleep(0.2) + await stream.append(b"two") + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(b"one", b"two") + await stream.close() + + received = [m.data async for m in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(b"one", b"two") + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..944761cfa --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,113 @@ +"""In-workflow consumption of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering and the workflow-facing read directly, which is the part +this SDK owns; the delivery decision itself lives in the server and sdk-core. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.worker._workflow_instance import ( + _StreamBuffer, + _WorkflowInstanceImpl, +) + + +def message(body: bytes) -> api_stream.StreamMessage: + return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"one"), message(b"two")]) + + assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([message(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert [m.body.data for m in buffer.take()] == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert [m.body.data for m in buffer.take()] == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream``, so a test that reimplements + it proves nothing about the code that ships. + """ + + def __init__(self) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self.read_only_calls: list[str] = [] + + def _assert_not_read_only(self, action: str) -> None: + self.read_only_calls.append(action) + + +@pytest.mark.parametrize("max_messages", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: + stub = _ReadOnlyStub() + bodies = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b) for b in bodies]) + + got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + + assert got == bodies[:max_messages] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + + if len(stub._stream_buffers["s"]): + rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert got + rest == bodies + else: + assert got == bodies + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub() + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b"a")]) + + await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..579327217 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,244 @@ +"""A workflow publishing to a stream it owns and reading its own messages back. + +Path A and Path C together, both from workflow code. Needs a Temporal server +built from the AI-198 branch, because neither the stream service nor the +commands exist on a released one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest +from temporalio.api.enums.v1 import EventType + +from temporalio import workflow +from temporalio.client import Client +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +STREAM = "output" + +# Event type numbers rather than names: this SDK's api protos predate both +# events, so the attributes arrive as unknown fields and only the type is +# readable here. The server's own tests are where the offsets are asserted. +EVENT_STREAM_SUBSCRIBED = 61 +EVENT_STREAM_MESSAGES_ADDED = 62 + + +@workflow.defn +class PublishAndRead: + @workflow.run + async def run(self) -> list[str]: + # Published before subscribing, because a subscription resolves against + # the streams the workflow already owns and this is what creates one. + workflow.add_stream_messages( + [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + ) + workflow.add_stream_messages([b"delta"], stream_id=STREAM) + + workflow.subscribe_stream(STREAM, start_offset=0) + + received: list[str] = [] + while len(received) < 4: + for body in await workflow.read_stream(STREAM): + received.append(body.decode()) + return received + + +async def test_workflow_reads_back_what_it_published() -> None: + client = await Client.connect(TARGET or "") + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=wf_id, task_queue=task_queue + ), + timeout=60, + ) + + assert result == ["alpha", "beta", "gamma", "delta"] + + counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + + # Two calls carrying four messages, so two events: the event is per batch, + # which is what makes batching free. + assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class PublishOnSignal: + """Publishes a token per signal, which is the shape an agent turn has.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + self._done = False + + @workflow.run + async def run(self) -> int: + published = 0 + while True: + await workflow.wait_condition(lambda: self._pending or self._done) + while self._pending: + workflow.add_stream_messages([self._pending.pop(0).encode()]) + published += 1 + if self._done: + return published + + @workflow.signal + async def emit(self, token: str) -> None: + self._pending.append(token) + + @workflow.signal + async def finish(self) -> None: + self._done = True + + +async def test_a_client_follows_what_a_workflow_publishes() -> None: + """The harness shape: the workflow writes, something outside it reads live. + + A stream a workflow owns has no id, so the reader addresses it by the + owner. It also attaches before the first publish, which is what a UI opening + on a session does. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "follow-tq-" + uuid.uuid4().hex[:8] + wf_id = "follow-wf-" + uuid.uuid4().hex[:8] + + tokens = [f"token-{i}" for i in range(5)] + received: list[str] = [] + + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishOnSignal], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + PublishOnSignal.run, id=wf_id, task_queue=task_queue + ) + + # Attached before anything is published, so the stream does not + # exist yet and the first poll has to park rather than fail. + reader = streams.workflow_stream(wf_id) + assert (await reader.describe()).head_offset == 0 + + async def follow() -> None: + async for message in reader.follow(): + received.append(message.data.decode()) + if len(received) == len(tokens): + return + + following = asyncio.ensure_future(follow()) + for token in tokens: + await handle.signal(PublishOnSignal.emit, token) + await asyncio.wait_for(following, timeout=60) + + await handle.signal(PublishOnSignal.finish) + assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) + finally: + await streams.close() + + assert received == tokens + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each `read_stream` that finds nothing + blocks, which ends a Workflow Task, so the run spans several. With the + cache on, every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for body in await workflow.read_stream(stream_id): + seen.append(body.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + Every other end-to-end test here disables it, so the sticky path was never + exercised. The server sends no replay slice for a sticky task, while the + sticky history still carries the previous task's consumed range, and the + two together used to fail every task after the first consumed range. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, + task_queue=task_queue, + workflows=[ConsumeAcrossTasks], + # Left at the default deliberately. This is what the test is for. + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=wf_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append(*[t.encode() for t in batch]) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + # More than one Workflow Task ran, otherwise the test proves nothing. + completed = 0 + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: + completed += 1 + assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + finally: + await streams.close() From 6ec3d7f711a5db7e988c9cc165f5058840a487f3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 041/831] Added the Workflow Streams surface over a server-side stream. --- temporalio/contrib/server_streams/__init__.py | 397 ++++++++++++++++++ tests/contrib/test_server_streams.py | 154 +++++++ 2 files changed, 551 insertions(+) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..e831d763c --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,397 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per batch rather than a +Signal per batch. A consumer reads the log directly rather than long-polling an +Update, so there is no per-Workflow limit on how many can read at once, and a +closed Workflow stays readable until its stream's retention expires. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, Optional, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.converter import DataConverter, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still encoded. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + """ + + items: list["WorkflowStreamItem[bytes]"] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _encode(converter: PayloadConverter, value: Any) -> bytes: + """Serialize one value to a stream message body. + + The payload rather than the bare bytes, so the encoding metadata the + consumer needs to decode into a type travels with it. + + The codec chain is not applied. It cannot be applied here: a codec is async + and a Workflow publishing to a stream is not, so running one inside Workflow + code would be I/O on the Workflow thread. Regular payloads solve this in the + Worker, encoding on the way out and decoding on the way in, and a stream + needs the same plumbing before a codec can be honoured. + + It is not applied on the client path either, deliberately. Encoding one side + and not the other is worse than encoding neither: an Activity's messages + would reach a consuming Workflow as ciphertext it has no way to decode. + :func:`_reject_configured_codec` is what keeps that from happening quietly. + """ + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies bypass the codec chain, so proceeding would write payloads + this namespace expects to be encrypted in the clear, and would do it + silently. Raising is the only honest answer until the Worker-side plumbing + exists. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it. Publishing would store them " + "unencoded. Use a client without a codec, or wait for codec support " + "on streams." + ) + + +def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns as soon as the Command is issued. There is nothing to await: + the append is applied in the Workflow Task's own commit, so it costs + this Workflow no round trip and no extra transition. + """ + workflow.add_stream_messages( + [_encode(workflow.payload_converter(), value)], topic=self._name + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic( + self, name: str, *, type: type = object + ) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`.""" + self._handle = handle + self._converter = converter + self._batch_interval = batch_interval + self._buffered: list[tuple[str, Any]] = [] + self._flusher: Optional[asyncio.Task[None]] = None + self._wake = asyncio.Event() + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> "WorkflowStreamClient": + """Open the stream owned by ``workflow_id``.""" + _reject_configured_codec(client) + return cls( + _stream_client(client).workflow_stream(workflow_id), + client.data_converter.payload_converter, + batch_interval, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> "WorkflowStreamClient": + """Open the stream owned by the Workflow that scheduled this Activity.""" + client = activity.client() + return cls.create( + client, activity.info().workflow_id, batch_interval=batch_interval + ) + + async def __aenter__(self) -> "WorkflowStreamClient": + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. + """ + if self._flusher is not None: + self._flusher.cancel() + try: + await self._flusher + except asyncio.CancelledError: + pass + self._flusher = None + await self.flush() + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + async for message in self._handle.follow(from_offset=from_offset, topics=topics): + yield WorkflowStreamItem( + topic=message.topic, + data=_decode(self._converter, message.data, result_type), + offset=message.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> "RawPage": + """One read, with the bodies left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) + for m in page.messages + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + # One append per topic, because a batch carries a single topic. The + # harness case is one topic, so this is one append. + by_topic: dict[str, list[bytes]] = {} + for topic, value in pending: + by_topic.setdefault(topic, []).append(_encode(self._converter, value)) + for topic, bodies in by_topic.items(): + await self._handle.append(*bodies, topic=topic) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while True: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + +# One channel per target, shared by every handle in the process. The channel is +# multiplexed and long-lived, and callers here open a client per subscription, +# which would otherwise be a connection per subscription. +_clients: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop too: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _clients.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _clients[key] = existing + return existing diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..33d86d827 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,154 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow( + Emitting.run, 3, id=wf_id, task_queue=task_queue + ) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] From ddb5379999d67e80483936d8640132f59661b5d1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:57:03 -0700 Subject: [PATCH 042/831] Added the native provider module. --- temporalio/streams/providers/native.py | 398 +++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 temporalio/streams/providers/native.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..f5570b05a --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,398 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server. A workflow publishes with a command that +the server applies in the same transaction that accepts the workflow task, and +consumes ranges the server attaches to the workflow task it dispatches. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_STATE = "__temporal_streams_state" + + +class _Fanout: + """One server subscription, shared by every reader of that stream. + + The server sends a range once. Whoever reads it first would otherwise take + it from the others, so the pull happens here and the result goes to all + live readers. + """ + + def __init__(self, stream: str) -> None: + self._stream = stream + self._subscribers: list[list[tuple[Cursor, bytes]]] = [] + self._pull: asyncio.Future[None] | None = None + + def attach(self) -> list[tuple[Cursor, bytes]]: + queue: list[tuple[Cursor, bytes]] = [] + self._subscribers.append(queue) + return queue + + def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: + if queue in self._subscribers: + self._subscribers.remove(queue) + + async def next_batch( + self, queue: list[tuple[Cursor, bytes]] + ) -> list[tuple[Cursor, bytes]]: + while not queue: + pending = self._pull + if pending is None: + pending = self._pull = asyncio.ensure_future(self._run_pull()) + # Shielded because one reader going away must not cancel a range + # the server will not send again. + await asyncio.shield(pending) + batch, queue[:] = list(queue), [] + return batch + + async def _run_pull(self) -> None: + try: + delivered = await workflow.read_stream_messages(self._stream) + arrived = [ + (Cursor(str(message.offset)), message.body) for message in delivered + ] + for queue in self._subscribers: + queue.extend(arrived) + finally: + self._pull = None + + +def _fanouts() -> dict[str, _Fanout]: + instance = workflow.instance() + state = getattr(instance, _RUN_STATE, None) + if state is None: + state = {} + setattr(instance, _RUN_STATE, state) + return state + + +class _NativeReadSource: + def __init__(self, fanout: _Fanout) -> None: + self._fanout = fanout + self._queue = fanout.attach() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + return await self._fanout.next_batch(self._queue) + + def close(self) -> None: + self._fanout.detach(self._queue) + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Nothing is awaited. The server applies the payload when it accepts + # the task, so there is no back pressure to wait on and no round trip + # to pay for. The signature is awaitable because the contract allows a + # provider that does hold a publisher back. + workflow.add_stream_messages([frame], stream_id="", topic=self._topic) + + +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The server-side id of a workflow's inbound stream. + + A workflow names its streams relative to itself, so every provider can + address the same thing without workflow code knowing how it is stored. + Here that is a namespace-level stream id built from the pair, and the + workflow id rather than the run id because the stream has to survive + continue-as-new and reset. + """ + return f"{workflow_id}:{stream}" + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies do not pass through the codec chain on this provider, so + proceeding would store in the clear what the namespace expects encrypted, + and would do it without saying so. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it" + ) + + +# Streams this process has already opened, so a second producer for the same +# stream reuses the handle rather than asking the server to create it again. +# The second create is answered correctly, and it is still a failed call the +# server logs, which is noise an operator has to learn to ignore. +_handles: dict[str, Any] = {} + + +# One channel per target and namespace, shared by every handle in the process. +# A channel is multiplexed and long lived, and callers open a handle per +# subscription, which would otherwise be a connection per subscription. +_channels: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _channels.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _channels[key] = existing + return existing + + +class NativeProducer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + handle: Any, + converter: Any, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + self._handle = handle + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _provider_id(self) -> str: + """The identity the provider dedupes on. + + The attempt is part of it. Deduplication answers "is this the same + append again", and a second attempt writing different words at the same + sequence is not. Folding the attempt in keeps a retried append idempotent + without letting a new generation be swallowed as a duplicate of the old + one. + """ + return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = await self._handle.append( + *frames, + topic=self._topic, + producer_id=self._provider_id, + # The provider dedupes a retried append on this pair, which is a + # different job from telling readers that a new generation started. + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._handle.append( + frame, + topic=self._topic, + producer_id=self._provider_id, + sequence=self._sequence - 1, + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class NativeConsumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, handle: Any, converter: Any) -> None: + self._handle = handle + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + attempts = AttemptTracker() + async for message in self._handle.follow( + from_offset=int(start.token) if start.token else 0 + ): + cursor = Cursor(str(message.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + message.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NativeProvider: + name = "native" + + def configure(self, **options: Any) -> None: + """Nothing to name: the streams are on the server the client is + already connected to. It exists so a process that switches providers + changes one call rather than its structure.""" + if options: + raise TypeError( + f"the native provider takes no options, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Accepted and ignored. Delivery arrives on workflow tasks the server + # dispatches, so no worker is held between records and there is nothing + # for an idle timeout to release. + del idle_timeout + stream_id = inbound_stream_id(workflow.info().workflow_id, stream) + fanouts = _fanouts() + fanout = fanouts.get(stream_id) + if fanout is None: + workflow.subscribe_stream( + stream_id, start_offset=int(start.token) if start.token else 0 + ) + fanout = fanouts[stream_id] = _Fanout(stream_id) + return _NativeReadSource(fanout) + + def open_write(self, topic: str) -> WriteSink: + return _NativeWriteSink(topic) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + _reject_configured_codec(client) + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + streams = _stream_client(client) + stream_id = inbound_stream_id(workflow_id, stream) + handle = _handles.get(stream_id) + if handle is None: + try: + handle = await streams.create(stream_id) + except Exception: + # Created by whoever set the stream up. A producer opening a + # stream it does not own is the ordinary case, not the + # exception. + handle = streams.get(stream_id) + _handles[stream_id] = handle + return NativeProducer( + handle, + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> NativeConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. Naming one reads that inbound + stream instead, which is how a second consumer follows the same input. + """ + _reject_configured_codec(client) + streams = _stream_client(client) + if stream: + handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + else: + handle = streams.workflow_stream(workflow_id) + return NativeConsumer(handle, client.data_converter.payload_converter) + + +_provider.register("native", _NativeProvider) From d2c73c6e53ed412f2ae33d52ae359cd21c2fe62c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 043/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/native.py | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f5570b05a..c0044b9cf 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -255,18 +255,18 @@ def __init__(self, handle: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() async for message in self._handle.follow( - from_offset=int(start.token) if start.token else 0 + from_offset=int(after.token) + 1 if after.token else 0 ): cursor = Cursor(str(message.offset)) try: @@ -290,6 +290,16 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one server-side log per stream, whatever the topic + try: + state = await self._handle.describe() + except Exception: + # A stream nobody has published to does not exist yet, and that + # is the same answer as an empty one. + return BEGINNING + return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -317,7 +327,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Accepted and ignored. Delivery arrives on workflow tasks the server @@ -329,7 +339,7 @@ def open_read( fanout = fanouts.get(stream_id) if fanout is None: workflow.subscribe_stream( - stream_id, start_offset=int(start.token) if start.token else 0 + stream_id, start_offset=int(after.token) + 1 if after.token else 0 ) fanout = fanouts[stream_id] = _Fanout(stream_id) return _NativeReadSource(fanout) @@ -342,15 +352,18 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NativeProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the stream the workflow publishes, which the server lets any + producer append to. Inside an activity, leave ``producer_id`` and + ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ _reject_configured_codec(client) if not producer_id: @@ -358,6 +371,14 @@ async def producer( if not attempt: attempt = activity.info().attempt streams = _stream_client(client) + if not stream: + return NativeProducer( + streams.workflow_stream(workflow_id), + client.data_converter.payload_converter, + topic, + producer_id, + attempt, + ) stream_id = inbound_stream_id(workflow_id, stream) handle = _handles.get(stream_id) if handle is None: From 31f9341943e2864a4ba8e6524ba4dfa7ec6d42ed Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:49:04 -0700 Subject: [PATCH 044/831] Read the delivered message shape the buffer now hands back. The buffer holds a body, topic and offset rather than the wire message, and the cap moved to `workflow_read_stream_messages`. --- tests/worker/test_workflow_stream.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 944761cfa..bb0dcf9ba 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -28,7 +28,7 @@ async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() buffer.extend([message(b"one"), message(b"two")]) - assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert [m.body for m in buffer.take()] == [b"one", b"two"] assert len(buffer) == 0 @@ -41,7 +41,7 @@ async def test_buffer_wakes_a_waiting_reader() -> None: buffer.extend([message(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body.data for m in buffer.take()] == [b"late"] + assert [m.body for m in buffer.take()] == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -64,16 +64,21 @@ async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body.data for m in buffer.take()] == [b"early"] + assert [m.body for m in buffer.take()] == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream``, so a test that reimplements - it proves nothing about the code that ships. + The cap lives inside ``workflow_read_stream_messages``, so a test that + reimplements it proves nothing about the code that ships. Borrowing the + method off the real class is what keeps the test on the shipped path. """ + workflow_read_stream_messages = ( + _WorkflowInstanceImpl.workflow_read_stream_messages + ) + def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} self.read_only_calls: list[str] = [] From aaa5330e4035c4cedc3e64778d739945310842bc Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 045/831] Regenerated the protos from the pinned Core. The pinned Core carries the stream additions to the public API, so the command, enum, history and workflow service messages were stale. Only the vendored stream service protos still come from the server checkout. --- temporalio/api/command/v1/__init__.py | 4 + temporalio/api/command/v1/message_pb2.py | 117 +- temporalio/api/command/v1/message_pb2.pyi | 81 ++ temporalio/api/enums/v1/command_type_pb2.py | 6 +- temporalio/api/enums/v1/command_type_pb2.pyi | 4 + temporalio/api/enums/v1/event_type_pb2.py | 6 +- temporalio/api/enums/v1/event_type_pb2.pyi | 20 + temporalio/api/history/v1/__init__.py | 4 + temporalio/api/history/v1/message_pb2.py | 301 +++-- temporalio/api/history/v1/message_pb2.pyi | 122 ++ temporalio/api/stream/v1/__init__.py | 6 +- temporalio/api/stream/v1/message_pb2.py | 103 +- temporalio/api/stream/v1/message_pb2.pyi | 79 +- temporalio/api/streamservice/v1/__init__.py | 16 +- .../api/streamservice/v1/message_pb2.py | 47 +- .../api/streamservice/v1/message_pb2.pyi | 37 +- .../api/streamservice/v1/message_pb2_grpc.py | 20 +- .../streamservice/v1/request_response_pb2.py | 235 ++-- .../streamservice/v1/request_response_pb2.pyi | 333 ++++- .../v1/request_response_pb2_grpc.py | 20 +- .../api/streamservice/v1/service_pb2.py | 31 +- .../api/streamservice/v1/service_pb2.pyi | 8 +- .../api/streamservice/v1/service_pb2_grpc.py | 687 +++++----- .../api/streamservice/v1/stream_state_pb2.py | 62 +- .../api/streamservice/v1/stream_state_pb2.pyi | 113 +- .../streamservice/v1/stream_state_pb2_grpc.py | 20 +- .../v1/request_response_pb2.py | 1125 +++++++++-------- .../v1/request_response_pb2.pyi | 19 + temporalio/bridge/_visitor.py | 28 + .../workflow_activation_pb2.py | 626 +++++---- .../workflow_activation_pb2.pyi | 116 +- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 823 +++++++----- .../workflow_commands_pb2.pyi | 94 +- 34 files changed, 3258 insertions(+), 2059 deletions(-) diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index e0ce8f712..57ad3eb15 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -1,4 +1,5 @@ from .message_pb2 import ( + AddStreamMessagesCommandAttributes, CancelTimerCommandAttributes, CancelWorkflowExecutionCommandAttributes, Command, @@ -16,10 +17,12 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) __all__ = [ + "AddStreamMessagesCommandAttributes", "CancelTimerCommandAttributes", "CancelWorkflowExecutionCommandAttributes", "Command", @@ -37,5 +40,6 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index ad004ae03..cc7cdbb27 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -42,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\x87\x12\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"p\n"AddStreamMessagesCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"\xe0\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12m\n&add_stream_messages_command_attributes\x18\x14 \x01(\x0b\x32;.temporal.api.command.v1.AddStreamMessagesCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -105,6 +108,12 @@ _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ "RequestCancelNexusOperationCommandAttributes" ] +_ADDSTREAMMESSAGESCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "AddStreamMessagesCommandAttributes" +] +_SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeStreamCommandAttributes" +] _COMMAND = DESCRIPTOR.message_types_by_name["Command"] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", @@ -321,6 +330,28 @@ ) _sym_db.RegisterMessage(RequestCancelNexusOperationCommandAttributes) +AddStreamMessagesCommandAttributes = _reflection.GeneratedProtocolMessageType( + "AddStreamMessagesCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGESCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.AddStreamMessagesCommandAttributes) + }, +) +_sym_db.RegisterMessage(AddStreamMessagesCommandAttributes) + +SubscribeStreamCommandAttributes = _reflection.GeneratedProtocolMessageType( + "SubscribeStreamCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAMCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeStreamCommandAttributes) + }, +) +_sym_db.RegisterMessage(SubscribeStreamCommandAttributes) + Command = _reflection.GeneratedProtocolMessageType( "Command", (_message.Message,), @@ -383,44 +414,48 @@ _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_options = ( b"8\001" ) - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 424 - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1118 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1120 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1192 - _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1194 - _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1299 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1301 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1395 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1397 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1488 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1490 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1538 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1540 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1633 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1636 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1819 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1822 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2125 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2127 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2245 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2247 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2343 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2346 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2665 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2585 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2665 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2668 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3608 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3611 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4615 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4617 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4671 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4674 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5157 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5107 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5157 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5159 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5233 - _COMMAND._serialized_start = 5236 - _COMMAND._serialized_end = 7547 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 462 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1156 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1158 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1230 + _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1232 + _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1337 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1339 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1433 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1435 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1526 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1528 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1576 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1578 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1671 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1674 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1857 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1860 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2163 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2165 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2283 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2285 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2381 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2384 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2703 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2623 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2703 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2706 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3646 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3649 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4653 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4655 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4709 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4712 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5195 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5145 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5195 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 + _ADDSTREAMMESSAGESCOMMANDATTRIBUTES._serialized_start = 5273 + _ADDSTREAMMESSAGESCOMMANDATTRIBUTES._serialized_end = 5385 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 5387 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 5462 + _COMMAND._serialized_start = 5465 + _COMMAND._serialized_end = 7993 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 18d0abc8b..87063c178 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -18,6 +18,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1094,6 +1095,62 @@ global___RequestCancelNexusOperationCommandAttributes = ( RequestCancelNexusOperationCommandAttributes ) +class AddStreamMessagesCommandAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the Workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessagesCommandAttributes = AddStreamMessagesCommandAttributes + +class SubscribeStreamCommandAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes + class Command(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -1119,6 +1176,8 @@ class Command(google.protobuf.message.Message): MODIFY_WORKFLOW_PROPERTIES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1209,6 +1268,14 @@ class Command(google.protobuf.message.Message): def request_cancel_nexus_operation_command_attributes( self, ) -> global___RequestCancelNexusOperationCommandAttributes: ... + @property + def add_stream_messages_command_attributes( + self, + ) -> global___AddStreamMessagesCommandAttributes: ... + @property + def subscribe_stream_command_attributes( + self, + ) -> global___SubscribeStreamCommandAttributes: ... def __init__( self, *, @@ -1253,10 +1320,16 @@ class Command(google.protobuf.message.Message): | None = ..., request_cancel_nexus_operation_command_attributes: global___RequestCancelNexusOperationCommandAttributes | None = ..., + add_stream_messages_command_attributes: global___AddStreamMessagesCommandAttributes + | None = ..., + subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages_command_attributes", + b"add_stream_messages_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1291,6 +1364,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1300,6 +1375,8 @@ class Command(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages_command_attributes", + b"add_stream_messages_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1338,6 +1415,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1365,6 +1444,8 @@ class Command(google.protobuf.message.Message): "modify_workflow_properties_command_attributes", "schedule_nexus_operation_command_attributes", "request_cancel_nexus_operation_command_attributes", + "add_stream_messages_command_attributes", + "subscribe_stream_command_attributes", ] | None ): ... diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 6d1c3b6e5..9313ff92a 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x9c\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe5\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12$\n COMMAND_TYPE_ADD_STREAM_MESSAGES\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -39,11 +39,13 @@ COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES = 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION = 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 +COMMAND_TYPE_ADD_STREAM_MESSAGES = 19 +COMMAND_TYPE_SUBSCRIBE_STREAM = 20 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 864 + _COMMANDTYPE._serialized_end = 937 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 9f1bfd240..80ff53ee2 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -44,6 +44,8 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: _CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: _CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 + COMMAND_TYPE_ADD_STREAM_MESSAGES: _CommandType.ValueType # 19 + COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -66,4 +68,6 @@ COMMAND_TYPE_PROTOCOL_MESSAGE: CommandType.ValueType # 14 COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 +COMMAND_TYPE_ADD_STREAM_MESSAGES: CommandType.ValueType # 19 +COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 14ff7984d..a887626de 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\x9e\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -82,11 +82,13 @@ EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58 EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59 EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 +EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED = 62 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 2912 + _EVENTTYPE._serialized_end = 3002 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 16a23b137..dc585288d 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -216,6 +216,16 @@ class _EventTypeEnumTypeWrapper( """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: _EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" + EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: _EventType.ValueType # 61 + """A Workflow subscribed to a stream. Once per subscription, not per + message: consumed offsets ride WorkflowTaskCompleted and payloads never + enter History. + """ + EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED: _EventType.ValueType # 62 + """A Workflow published a batch of messages to a stream. Recorded per + batch, and carrying only the offset range it landed at: the bodies go to + the stream's own log, never into History. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -408,4 +418,14 @@ EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: EventType.ValueType # 59 """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: EventType.ValueType # 61 +"""A Workflow subscribed to a stream. Once per subscription, not per +message: consumed offsets ride WorkflowTaskCompleted and payloads never +enter History. +""" +EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED: EventType.ValueType # 62 +"""A Workflow published a batch of messages to a stream. Recorded per +batch, and carrying only the offset range it landed at: the bodies go to +the stream's own log, never into History. +""" global___EventType = EventType diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index ec7f65962..c7ebb2753 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -57,6 +57,8 @@ WorkflowExecutionUpdateRejectedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, + WorkflowStreamMessagesAddedEventAttributes, + WorkflowStreamSubscribedEventAttributes, WorkflowTaskCompletedEventAttributes, WorkflowTaskFailedEventAttributes, WorkflowTaskScheduledEventAttributes, @@ -123,6 +125,8 @@ "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", + "WorkflowStreamMessagesAddedEventAttributes", + "WorkflowStreamSubscribedEventAttributes", "WorkflowTaskCompletedEventAttributes", "WorkflowTaskFailedEventAttributes", "WorkflowTaskScheduledEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index ac337b708..e0a75ddaa 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -47,6 +47,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -58,7 +61,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\x82\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xca?\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc0\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12<\n\x0estream_cursors\x18\x14 \x03(\x0b\x32$.temporal.api.stream.v1.StreamCursor"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\x96\x01\n*WorkflowStreamMessagesAddedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x15\n\rmessage_count\x18\x04 \x01(\x03"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc3\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12~\n/workflow_stream_messages_added_event_attributes\x18\x43 \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowStreamMessagesAddedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -215,6 +218,12 @@ _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "ActivityPropertiesModifiedExternallyEventAttributes" ] +_WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamMessagesAddedEventAttributes" +] +_WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamSubscribedEventAttributes" +] _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionUpdateAcceptedEventAttributes" ] @@ -819,6 +828,28 @@ ) _sym_db.RegisterMessage(ActivityPropertiesModifiedExternallyEventAttributes) +WorkflowStreamMessagesAddedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamMessagesAddedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamMessagesAddedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamMessagesAddedEventAttributes) + +WorkflowStreamSubscribedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamSubscribedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) + WorkflowExecutionUpdateAcceptedEventAttributes = ( _reflection.GeneratedProtocolMessageType( "WorkflowExecutionUpdateAcceptedEventAttributes", @@ -1210,140 +1241,144 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 663 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3057 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3060 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3196 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3199 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3364 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3367 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3586 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3589 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3717 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3720 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4653 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4656 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4828 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4831 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5247 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5250 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5892 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5895 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6044 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6047 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6438 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6441 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7147 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7150 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7436 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7439 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7671 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7674 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 7960 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 7963 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8161 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8163 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8277 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8280 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8554 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8557 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8704 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8706 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8777 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8780 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 8914 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8917 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9116 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9119 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9254 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9257 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9618 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9538 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9618 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9621 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 9940 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 9943 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10072 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10075 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5992 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5995 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6144 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6147 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6538 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6541 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7247 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7250 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7536 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7539 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7771 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7774 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8060 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8063 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8261 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8263 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8377 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8380 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8654 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8657 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8804 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8806 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8877 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8880 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9014 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9017 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9216 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9219 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9354 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9357 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9718 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9638 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9718 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9721 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10040 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10043 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10172 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10175 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10359 + 10459 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10362 + 10462 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10708 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10711 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 10908 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10911 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11290 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11293 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11632 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11635 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11846 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11849 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12007 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12010 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12148 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12151 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13427 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13430 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13772 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13775 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14070 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14073 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14398 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14401 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14780 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14783 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15108 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15111 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15441 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15444 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15720 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15723 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16453 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16303 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16453 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16456 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16776 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16779 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16923 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 16926 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17146 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17319 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17322 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17593 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17596 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 17760 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 17762 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 17856 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 17858 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 17954 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 17957 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18154 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18157 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 18721 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 18671 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 18721 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 18724 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 18861 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 18864 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19001 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19004 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19140 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19143 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19281 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19284 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19422 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19424 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19540 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19543 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 19694 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 19697 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 19896 - _HISTORYEVENT._serialized_start = 19899 - _HISTORYEVENT._serialized_end = 28037 - _HISTORY._serialized_start = 28039 - _HISTORY._serialized_end = 28103 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10808 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10811 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11008 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11011 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11390 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11393 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11732 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11735 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11946 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11949 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12107 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12110 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12248 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12251 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13527 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13530 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13872 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13875 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14170 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14173 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14498 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14501 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14880 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14883 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15208 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15211 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15541 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15544 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15820 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15823 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16553 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16403 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16553 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16556 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16876 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16879 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17023 + _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES._serialized_start = 17026 + _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES._serialized_end = 17176 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17178 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17302 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17305 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17525 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17528 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17698 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17701 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17972 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17975 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18139 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18141 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18235 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18237 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18333 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18336 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18533 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18536 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19100 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19050 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19100 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19103 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19240 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19243 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19380 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19383 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19519 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19522 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19660 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19663 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19801 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19803 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19919 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19922 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20073 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20076 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20275 + _HISTORYEVENT._serialized_start = 20278 + _HISTORYEVENT._serialized_end = 28665 + _HISTORY._serialized_start = 28667 + _HISTORY._serialized_end = 28731 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 783e9d3b6..6c214d184 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -23,6 +23,7 @@ import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1010,6 +1011,7 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): WORKER_DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int WORKER_DEPLOYMENT_NAME_FIELD_NUMBER: builtins.int DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int + STREAM_CURSORS_FIELD_NUMBER: builtins.int scheduled_event_id: builtins.int """The id of the `WORKFLOW_TASK_SCHEDULED` event this task corresponds to""" started_event_id: builtins.int @@ -1069,6 +1071,15 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): """The Worker Deployment Version that completed this task. Must be set if `versioning_behavior` is set. This value updates workflow execution's `versioning_info.deployment_version`. """ + @property + def stream_cursors( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamCursor + ]: + """The offsets this task consumed, without the payloads. Recorded so replay + can reproduce what the task saw, including a range that was empty. + """ def __init__( self, *, @@ -1088,6 +1099,10 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): worker_deployment_name: builtins.str = ..., deployment_version: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentVersion | None = ..., + stream_cursors: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamCursor + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1123,6 +1138,8 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): b"sdk_metadata", "started_event_id", b"started_event_id", + "stream_cursors", + b"stream_cursors", "versioning_behavior", b"versioning_behavior", "worker_deployment_name", @@ -3603,6 +3620,87 @@ global___ActivityPropertiesModifiedExternallyEventAttributes = ( ActivityPropertiesModifiedExternallyEventAttributes ) +class WorkflowStreamMessagesAddedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + MESSAGE_COUNT_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command published this + batch. + """ + stream_id: builtins.str + """Stream the Workflow published to.""" + first_offset: builtins.int + """Offset the first message of the batch landed at.""" + message_count: builtins.int + """How many messages the batch held. With first_offset this names the range + without carrying any of it, which is what keeps this event a fixed size + no matter how large the batch or its payloads are. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + first_offset: builtins.int = ..., + message_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "first_offset", + b"first_offset", + "message_count", + b"message_count", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamMessagesAddedEventAttributes = ( + WorkflowStreamMessagesAddedEventAttributes +) + +class WorkflowStreamSubscribedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Resolved by the server when the subscription is registered, so replay + reads the resolved value rather than resolving it again. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamSubscribedEventAttributes = ( + WorkflowStreamSubscribedEventAttributes +) + class WorkflowExecutionUpdateAcceptedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4460,6 +4558,8 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( builtins.int ) + WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_MESSAGES_ADDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4745,6 +4845,14 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_execution_time_skipping_transitioned_event_attributes( self, ) -> global___WorkflowExecutionTimeSkippingTransitionedEventAttributes: ... + @property + def workflow_stream_subscribed_event_attributes( + self, + ) -> global___WorkflowStreamSubscribedEventAttributes: ... + @property + def workflow_stream_messages_added_event_attributes( + self, + ) -> global___WorkflowStreamMessagesAddedEventAttributes: ... def __init__( self, *, @@ -4882,6 +4990,10 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_execution_time_skipping_transitioned_event_attributes: global___WorkflowExecutionTimeSkippingTransitionedEventAttributes | None = ..., + workflow_stream_subscribed_event_attributes: global___WorkflowStreamSubscribedEventAttributes + | None = ..., + workflow_stream_messages_added_event_attributes: global___WorkflowStreamMessagesAddedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5004,6 +5116,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_messages_added_event_attributes", + b"workflow_stream_messages_added_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5151,6 +5267,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_messages_added_event_attributes", + b"workflow_stream_messages_added_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5227,6 +5347,8 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_paused_event_attributes", "workflow_execution_unpaused_event_attributes", "workflow_execution_time_skipping_transitioned_event_attributes", + "workflow_stream_subscribed_event_attributes", + "workflow_stream_messages_added_event_attributes", ] | None ): ... diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py index f76c1c334..f18ab9d7b 100644 --- a/temporalio/api/stream/v1/__init__.py +++ b/temporalio/api/stream/v1/__init__.py @@ -1,8 +1,4 @@ -from .message_pb2 import ( - StreamCursor, - StreamMessage, - StreamSlice, -) +from .message_pb2 import StreamCursor, StreamMessage, StreamSlice __all__ = [ "StreamCursor", diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py index da1e5bc91..800c48391 100644 --- a/temporalio/api/stream/v1/message_pb2.py +++ b/temporalio/api/stream/v1/message_pb2.py @@ -2,68 +2,85 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/api/stream/v1/message.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto\"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03\"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' +) - -_STREAMMESSAGE = DESCRIPTOR.message_types_by_name['StreamMessage'] -_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name['MetadataEntry'] -_STREAMSLICE = DESCRIPTOR.message_types_by_name['StreamSlice'] -_STREAMCURSOR = DESCRIPTOR.message_types_by_name['StreamCursor'] -StreamMessage = _reflection.GeneratedProtocolMessageType('StreamMessage', (_message.Message,), { - - 'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), { - 'DESCRIPTOR' : _STREAMMESSAGE_METADATAENTRY, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) - }) - , - 'DESCRIPTOR' : _STREAMMESSAGE, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) - }) +_STREAMMESSAGE = DESCRIPTOR.message_types_by_name["StreamMessage"] +_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name["MetadataEntry"] +_STREAMSLICE = DESCRIPTOR.message_types_by_name["StreamSlice"] +_STREAMCURSOR = DESCRIPTOR.message_types_by_name["StreamCursor"] +StreamMessage = _reflection.GeneratedProtocolMessageType( + "StreamMessage", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _STREAMMESSAGE_METADATAENTRY, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) + }, + ), + "DESCRIPTOR": _STREAMMESSAGE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) + }, +) _sym_db.RegisterMessage(StreamMessage) _sym_db.RegisterMessage(StreamMessage.MetadataEntry) -StreamSlice = _reflection.GeneratedProtocolMessageType('StreamSlice', (_message.Message,), { - 'DESCRIPTOR' : _STREAMSLICE, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) - }) +StreamSlice = _reflection.GeneratedProtocolMessageType( + "StreamSlice", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSLICE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }, +) _sym_db.RegisterMessage(StreamSlice) -StreamCursor = _reflection.GeneratedProtocolMessageType('StreamCursor', (_message.Message,), { - 'DESCRIPTOR' : _STREAMCURSOR, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) - }) +StreamCursor = _reflection.GeneratedProtocolMessageType( + "StreamCursor", + (_message.Message,), + { + "DESCRIPTOR": _STREAMCURSOR, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) + }, +) _sym_db.RegisterMessage(StreamCursor) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1' - _STREAMMESSAGE_METADATAENTRY._options = None - _STREAMMESSAGE_METADATAENTRY._serialized_options = b'8\001' - _STREAMMESSAGE._serialized_start=103 - _STREAMMESSAGE._serialized_end=357 - _STREAMMESSAGE_METADATAENTRY._serialized_start=277 - _STREAMMESSAGE_METADATAENTRY._serialized_end=357 - _STREAMSLICE._serialized_start=360 - _STREAMSLICE._serialized_end=547 - _STREAMCURSOR._serialized_start=549 - _STREAMCURSOR._serialized_end=622 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1" + _STREAMMESSAGE_METADATAENTRY._options = None + _STREAMMESSAGE_METADATAENTRY._serialized_options = b"8\001" + _STREAMMESSAGE._serialized_start = 103 + _STREAMMESSAGE._serialized_end = 357 + _STREAMMESSAGE_METADATAENTRY._serialized_start = 277 + _STREAMMESSAGE_METADATAENTRY._serialized_end = 357 + _STREAMSLICE._serialized_start = 360 + _STREAMSLICE._serialized_end = 547 + _STREAMCURSOR._serialized_start = 549 + _STREAMCURSOR._serialized_end = 622 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi index c1c796da8..d4f5e6f4f 100644 --- a/temporalio/api/stream/v1/message_pb2.pyi +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -2,12 +2,15 @@ @generated by mypy-protobuf. Do not edit manually! isort:skip_file """ + import builtins import collections.abc +import sys + import google.protobuf.descriptor import google.protobuf.internal.containers import google.protobuf.message -import sys + import temporalio.api.common.v1.message_pb2 if sys.version_info >= (3, 8): @@ -34,8 +37,13 @@ class StreamMessage(google.protobuf.message.Message): key: builtins.str = ..., value: temporalio.api.common.v1.message_pb2.Payload | None = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["value", b"value"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... BODY_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int @@ -44,19 +52,40 @@ class StreamMessage(google.protobuf.message.Message): @property def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... @property - def metadata(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, temporalio.api.common.v1.message_pb2.Payload]: ... + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: ... topic: builtins.str topic_sequence: builtins.int def __init__( self, *, body: temporalio.api.common.v1.message_pb2.Payload | None = ..., - metadata: collections.abc.Mapping[builtins.str, temporalio.api.common.v1.message_pb2.Payload] | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., topic: builtins.str = ..., topic_sequence: builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["body", b"body"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["body", b"body", "metadata", b"metadata", "topic", b"topic", "topic_sequence", b"topic_sequence"]) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "metadata", + b"metadata", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... global___StreamMessage = StreamMessage @@ -83,7 +112,11 @@ class StreamSlice(google.protobuf.message.Message): which is a fact replay has to reproduce rather than an absence of one. """ @property - def messages(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___StreamMessage]: ... + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... workflow_task_completed_event_id: builtins.int """The WorkflowTaskCompleted event whose stream_cursors recorded this range. Set only when the server is re-supplying a range for a task being @@ -104,7 +137,23 @@ class StreamSlice(google.protobuf.message.Message): messages: collections.abc.Iterable[global___StreamMessage] | None = ..., workflow_task_completed_event_id: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "messages", b"messages", "run_id", b"run_id", "stream_id", b"stream_id", "to_offset", b"to_offset", "workflow_task_completed_event_id", b"workflow_task_completed_event_id"]) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... global___StreamSlice = StreamSlice @@ -129,6 +178,16 @@ class StreamCursor(google.protobuf.message.Message): from_offset: builtins.int = ..., to_offset: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "stream_id", b"stream_id", "to_offset", b"to_offset"]) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... global___StreamCursor = StreamCursor diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 31f99bded..52dd65b7c 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -11,15 +11,6 @@ StreamMessageBatch, StreamMessageKind, ) - -from .stream_state_pb2 import ( - ConsumerCursor, - ProducerCursor, - StreamLifecycle, - StreamState, - WorkflowStreamCursor, -) - from .request_response_pb2 import ( AddMessagesInput, AddMessagesOutput, @@ -72,6 +63,13 @@ TruncateStreamRequest, TruncateStreamResponse, ) +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) __all__ = [ "AddMessagesInput", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index b4fe8e68a..9e30bd9a8 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -4,43 +4,54 @@ # source: temporalio/api/stream/v1/message.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/message.proto' + "", + "temporalio/api/stream/v1/message.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + ) -> None: ... + BODY_FIELD_NUMBER: _ClassVar[int] METADATA_FIELD_NUMBER: _ClassVar[int] TOPIC_FIELD_NUMBER: _ClassVar[int] @@ -38,10 +49,20 @@ class StreamMessage(_message.Message): topic_sequence: int kind: StreamMessageKind offset: int - def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., + topic: _Optional[str] = ..., + topic_sequence: _Optional[int] = ..., + kind: _Optional[_Union[StreamMessageKind, str]] = ..., + offset: _Optional[int] = ..., + ) -> None: ... class StreamMessageBatch(_message.Message): __slots__ = ("messages",) MESSAGES_FIELD_NUMBER: _ClassVar[int] messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] - def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... + def __init__( + self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ... + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index b1383816d..6b6c2372a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 60dafee45..7e8dbe3e4 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -4,135 +4,150 @@ # source: temporalio/api/stream/v1/request_response.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/request_response.proto' + "", + "temporalio/api/stream/v1/request_response.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.streamservice.v1 import ( + message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.streamservice.v1 import ( + stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + lifecycle: _Optional[_Union[_stream_state_pb2.StreamLifecycle, _Mapping]] = ..., + ) -> None: ... class CreateStreamOutput(_message.Message): __slots__ = ("run_id",) @@ -26,7 +36,17 @@ class CreateStreamOutput(_message.Message): def __init__(self, run_id: _Optional[str] = ...) -> None: ... class AddMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + __slots__ = ( + "namespace", + "stream_id", + "run_id", + "messages", + "producer_id", + "sequence", + "expected_offset", + "use_expected_offset", + "owner_epoch", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] STREAM_ID_FIELD_NUMBER: _ClassVar[int] RUN_ID_FIELD_NUMBER: _ClassVar[int] @@ -45,7 +65,20 @@ class AddMessagesInput(_message.Message): expected_offset: int use_expected_offset: bool owner_epoch: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + producer_id: _Optional[str] = ..., + sequence: _Optional[int] = ..., + expected_offset: _Optional[int] = ..., + use_expected_offset: bool = ..., + owner_epoch: _Optional[int] = ..., + ) -> None: ... class AddMessagesOutput(_message.Message): __slots__ = ("first_offset", "next_offset", "count", "deduplicated") @@ -57,7 +90,13 @@ class AddMessagesOutput(_message.Message): next_offset: int count: int deduplicated: bool - def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + def __init__( + self, + first_offset: _Optional[int] = ..., + next_offset: _Optional[int] = ..., + count: _Optional[int] = ..., + deduplicated: bool = ..., + ) -> None: ... class FinishWritingInput(_message.Message): __slots__ = ("namespace", "stream_id", "producer_id") @@ -67,7 +106,12 @@ class FinishWritingInput(_message.Message): namespace: str stream_id: str producer_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + producer_id: _Optional[str] = ..., + ) -> None: ... class FinishWritingOutput(_message.Message): __slots__ = () @@ -85,7 +129,14 @@ class SubscribeWorkflowInput(_message.Message): stream_name: str stream_id: str start_offset: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + start_offset: _Optional[int] = ..., + ) -> None: ... class SubscribeWorkflowOutput(_message.Message): __slots__ = ("start_offset",) @@ -94,7 +145,15 @@ class SubscribeWorkflowOutput(_message.Message): def __init__(self, start_offset: _Optional[int] = ...) -> None: ... class PollMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + __slots__ = ( + "namespace", + "stream_id", + "run_id", + "from_offset", + "max_messages", + "topics", + "wait_new_messages", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] STREAM_ID_FIELD_NUMBER: _ClassVar[int] RUN_ID_FIELD_NUMBER: _ClassVar[int] @@ -109,7 +168,16 @@ class PollMessagesInput(_message.Message): max_messages: int topics: _containers.RepeatedScalarFieldContainer[str] wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + from_offset: _Optional[int] = ..., + max_messages: _Optional[int] = ..., + topics: _Optional[_Iterable[str]] = ..., + wait_new_messages: bool = ..., + ) -> None: ... class PollMessagesOutput(_message.Message): __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") @@ -123,7 +191,16 @@ class PollMessagesOutput(_message.Message): head_offset: int closed: bool close_reason: _message_pb2_1.Payload - def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + def __init__( + self, + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + next_offset: _Optional[int] = ..., + head_offset: _Optional[int] = ..., + closed: bool = ..., + close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., + ) -> None: ... class DescribeStreamInput(_message.Message): __slots__ = ("namespace", "stream_id") @@ -131,10 +208,20 @@ class DescribeStreamInput(_message.Message): STREAM_ID_FIELD_NUMBER: _ClassVar[int] namespace: str stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + def __init__( + self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + ) -> None: ... class PollWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + __slots__ = ( + "namespace", + "workflow_id", + "stream_name", + "from_offset", + "max_messages", + "topics", + "wait_new_messages", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] STREAM_NAME_FIELD_NUMBER: _ClassVar[int] @@ -149,7 +236,16 @@ class PollWorkflowMessagesInput(_message.Message): max_messages: int topics: _containers.RepeatedScalarFieldContainer[str] wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + from_offset: _Optional[int] = ..., + max_messages: _Optional[int] = ..., + topics: _Optional[_Iterable[str]] = ..., + wait_new_messages: bool = ..., + ) -> None: ... class DescribeWorkflowStreamInput(_message.Message): __slots__ = ("namespace", "workflow_id", "stream_name") @@ -159,10 +255,22 @@ class DescribeWorkflowStreamInput(_message.Message): namespace: str workflow_id: str stream_name: str - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + ) -> None: ... class AddWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + __slots__ = ( + "namespace", + "workflow_id", + "stream_name", + "messages", + "producer_id", + "sequence", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] STREAM_NAME_FIELD_NUMBER: _ClassVar[int] @@ -175,13 +283,25 @@ class AddWorkflowMessagesInput(_message.Message): messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] producer_id: str sequence: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + producer_id: _Optional[str] = ..., + sequence: _Optional[int] = ..., + ) -> None: ... class DescribeStreamOutput(_message.Message): __slots__ = ("state",) STATE_FIELD_NUMBER: _ClassVar[int] state: _stream_state_pb2.StreamState - def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + def __init__( + self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ... + ) -> None: ... class CloseStreamInput(_message.Message): __slots__ = ("namespace", "stream_id", "reason") @@ -191,7 +311,12 @@ class CloseStreamInput(_message.Message): namespace: str stream_id: str reason: _message_pb2_1.Payload - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., + ) -> None: ... class CloseStreamOutput(_message.Message): __slots__ = () @@ -205,7 +330,12 @@ class TruncateStreamInput(_message.Message): namespace: str stream_id: str new_base_offset: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + new_base_offset: _Optional[int] = ..., + ) -> None: ... class TruncateStreamOutput(_message.Message): __slots__ = () @@ -217,7 +347,9 @@ class DeleteStreamInput(_message.Message): STREAM_ID_FIELD_NUMBER: _ClassVar[int] namespace: str stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + def __init__( + self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + ) -> None: ... class DeleteStreamOutput(_message.Message): __slots__ = () @@ -229,13 +361,19 @@ class CreateStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: CreateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ..., + ) -> None: ... class CreateStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: CreateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ... + ) -> None: ... class AddMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -243,13 +381,19 @@ class AddMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: AddMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ..., + ) -> None: ... class AddMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + ) -> None: ... class FinishWritingRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -257,13 +401,19 @@ class FinishWritingRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: FinishWritingInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ..., + ) -> None: ... class FinishWritingResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: FinishWritingOutput - def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ... + ) -> None: ... class SubscribeWorkflowRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -271,13 +421,20 @@ class SubscribeWorkflowRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: SubscribeWorkflowInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ..., + ) -> None: ... class SubscribeWorkflowResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: SubscribeWorkflowOutput - def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, + frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ..., + ) -> None: ... class PollMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -285,13 +442,19 @@ class PollMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: PollMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ..., + ) -> None: ... class PollMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + ) -> None: ... class DescribeStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -299,13 +462,19 @@ class DescribeStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DescribeStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ..., + ) -> None: ... class DescribeStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + ) -> None: ... class PollWorkflowMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -313,13 +482,19 @@ class PollWorkflowMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: PollWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ..., + ) -> None: ... class PollWorkflowMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + ) -> None: ... class DescribeWorkflowStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -327,13 +502,21 @@ class DescribeWorkflowStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DescribeWorkflowStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[ + _Union[DescribeWorkflowStreamInput, _Mapping] + ] = ..., + ) -> None: ... class DescribeWorkflowStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + ) -> None: ... class AddWorkflowMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -341,13 +524,19 @@ class AddWorkflowMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: AddWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ..., + ) -> None: ... class AddWorkflowMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + ) -> None: ... class CloseStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -355,13 +544,19 @@ class CloseStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: CloseStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ..., + ) -> None: ... class CloseStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: CloseStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ... + ) -> None: ... class TruncateStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -369,13 +564,19 @@ class TruncateStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: TruncateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ..., + ) -> None: ... class TruncateStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: TruncateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ... + ) -> None: ... class ListStreamsInput(_message.Message): __slots__ = ("namespace", "page_size", "next_page_token", "query") @@ -387,7 +588,13 @@ class ListStreamsInput(_message.Message): page_size: int next_page_token: bytes query: str - def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + page_size: _Optional[int] = ..., + next_page_token: _Optional[bytes] = ..., + query: _Optional[str] = ..., + ) -> None: ... class StreamListEntry(_message.Message): __slots__ = ("stream_id", "run_id") @@ -395,7 +602,9 @@ class StreamListEntry(_message.Message): RUN_ID_FIELD_NUMBER: _ClassVar[int] stream_id: str run_id: str - def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + def __init__( + self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ... + ) -> None: ... class ListStreamsOutput(_message.Message): __slots__ = ("streams", "next_page_token") @@ -403,7 +612,11 @@ class ListStreamsOutput(_message.Message): NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] next_page_token: bytes - def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + def __init__( + self, + streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., + next_page_token: _Optional[bytes] = ..., + ) -> None: ... class ListStreamsRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -411,13 +624,19 @@ class ListStreamsRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: ListStreamsInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ..., + ) -> None: ... class ListStreamsResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: ListStreamsOutput - def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ... + ) -> None: ... class DeleteStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -425,10 +644,16 @@ class DeleteStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DeleteStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ..., + ) -> None: ... class DeleteStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DeleteStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ... + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index 87cc91022..c8c70bb79 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index 7f376c28e..d5de1d5f8 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -4,35 +4,46 @@ # source: temporalio/api/stream/v1/service.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/service.proto' + "", + "temporalio/api/stream/v1/service.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 - +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/service_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) @@ -35,70 +42,83 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.CreateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True, + ) self.AddMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True, + ) self.FinishWriting = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True, + ) self.SubscribeWorkflow = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True, + ) self.PollMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True, + ) self.DescribeStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True, + ) self.PollWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True, + ) self.DescribeWorkflowStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True, + ) self.AddWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True, + ) self.CloseStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True, + ) self.TruncateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True, + ) self.ListStreams = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True, + ) self.DeleteStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True, + ) class StreamServiceServicer(object): @@ -107,178 +127,182 @@ class StreamServiceServicer(object): def CreateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def FinishWriting(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def SubscribeWorkflow(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollWorkflowMessages(self, request, context): - """Routed on the owner, because the stream it reads has no id of its own. - """ + """Routed on the owner, because the stream it reads has no id of its own.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeWorkflowStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddWorkflowMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def TruncateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def ListStreams(self, request, context): """Served on the frontend only: it queries visibility rather than a stream, so there is no business ID to route on and nothing for a shard to answer. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DeleteStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def add_StreamServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'CreateStream': grpc.unary_unary_rpc_method_handler( - servicer.CreateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, - ), - 'AddMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, - ), - 'FinishWriting': grpc.unary_unary_rpc_method_handler( - servicer.FinishWriting, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, - ), - 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( - servicer.SubscribeWorkflow, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, - ), - 'PollMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, - ), - 'DescribeStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, - ), - 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, - ), - 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeWorkflowStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, - ), - 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, - ), - 'CloseStream': grpc.unary_unary_rpc_method_handler( - servicer.CloseStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, - ), - 'TruncateStream': grpc.unary_unary_rpc_method_handler( - servicer.TruncateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, - ), - 'ListStreams': grpc.unary_unary_rpc_method_handler( - servicer.ListStreams, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, - ), - 'DeleteStream': grpc.unary_unary_rpc_method_handler( - servicer.DeleteStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, - ), + "CreateStream": grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + "AddMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + "FinishWriting": grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + "SubscribeWorkflow": grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + "PollMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + "DescribeStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + "PollWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + "DescribeWorkflowStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + "AddWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + "CloseStream": grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + "TruncateStream": grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + "ListStreams": grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + "DeleteStream": grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_registered_method_handlers( + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) - # This class is part of an EXPERIMENTAL API. +# This class is part of an EXPERIMENTAL API. class StreamService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def CreateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CreateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, options, @@ -289,23 +313,26 @@ def CreateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def AddMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, options, @@ -316,23 +343,26 @@ def AddMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def FinishWriting(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def FinishWriting( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, options, @@ -343,23 +373,26 @@ def FinishWriting(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def SubscribeWorkflow(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def SubscribeWorkflow( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, options, @@ -370,23 +403,26 @@ def SubscribeWorkflow(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def PollMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, options, @@ -397,23 +433,26 @@ def PollMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DescribeStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, options, @@ -424,23 +463,26 @@ def DescribeStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def PollWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, options, @@ -451,23 +493,26 @@ def PollWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DescribeWorkflowStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeWorkflowStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, options, @@ -478,23 +523,26 @@ def DescribeWorkflowStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def AddWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, options, @@ -505,23 +553,26 @@ def AddWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def CloseStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CloseStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, options, @@ -532,23 +583,26 @@ def CloseStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def TruncateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def TruncateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, options, @@ -559,23 +613,26 @@ def TruncateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def ListStreams(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def ListStreams( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, options, @@ -586,23 +643,26 @@ def ListStreams(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DeleteStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DeleteStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, options, @@ -613,4 +673,5 @@ def DeleteStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 234fa94d0..3fe850a2a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -4,18 +4,20 @@ # source: temporalio/api/stream/v1/stream_state.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/stream_state.proto' + "", + "temporalio/api/stream/v1/stream_state.proto", ) # @@protoc_insertion_point(imports) @@ -24,33 +26,43 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[ProducerCursor, _Mapping]] = ..., + ) -> None: ... + class ConsumersEntry(_message.Message): __slots__ = ("key", "value") KEY_FIELD_NUMBER: _ClassVar[int] VALUE_FIELD_NUMBER: _ClassVar[int] key: str value: ConsumerCursor - def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[ConsumerCursor, _Mapping]] = ..., + ) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] @@ -53,7 +80,24 @@ class StreamState(_message.Message): lifecycle: StreamLifecycle redirect_run_id: str close_time: _timestamp_pb2.Timestamp - def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + def __init__( + self, + head_offset: _Optional[int] = ..., + base_offset: _Optional[int] = ..., + last_txn_id: _Optional[int] = ..., + closed: bool = ..., + close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + owner_epoch: _Optional[int] = ..., + bucket_size: _Optional[int] = ..., + collection_id: _Optional[str] = ..., + producers: _Optional[_Mapping[str, ProducerCursor]] = ..., + consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., + lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., + redirect_run_id: _Optional[str] = ..., + close_time: _Optional[ + _Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping] + ] = ..., + ) -> None: ... class ProducerCursor(_message.Message): __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") @@ -67,7 +111,14 @@ class ProducerCursor(_message.Message): count: int content_hash: bytes fenced: bool - def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + def __init__( + self, + seq: _Optional[int] = ..., + first_offset: _Optional[int] = ..., + count: _Optional[int] = ..., + content_hash: _Optional[bytes] = ..., + fenced: bool = ..., + ) -> None: ... class ConsumerCursor(_message.Message): __slots__ = ("workflow_id", "run_id", "offset", "active", "external") @@ -81,10 +132,27 @@ class ConsumerCursor(_message.Message): offset: int active: bool external: bool - def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + def __init__( + self, + workflow_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + offset: _Optional[int] = ..., + active: bool = ..., + external: bool = ..., + ) -> None: ... class WorkflowStreamCursor(_message.Message): - __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + __slots__ = ( + "stream_id", + "collection_id", + "bucket_size", + "offset", + "known_head", + "external", + "pending_from", + "pending_to", + "has_pending", + ) STREAM_ID_FIELD_NUMBER: _ClassVar[int] COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] @@ -103,7 +171,18 @@ class WorkflowStreamCursor(_message.Message): pending_from: int pending_to: int has_pending: bool - def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + def __init__( + self, + stream_id: _Optional[str] = ..., + collection_id: _Optional[str] = ..., + bucket_size: _Optional[int] = ..., + offset: _Optional[int] = ..., + known_head: _Optional[int] = ..., + external: bool = ..., + pending_from: _Optional[int] = ..., + pending_to: _Optional[int] = ..., + has_pending: bool = ..., + ) -> None: ... class StreamLifecycle(_message.Message): __slots__ = ("retention", "max_items") @@ -111,4 +190,10 @@ class StreamLifecycle(_message.Message): MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] retention: _duration_pb2.Duration max_items: int - def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... + def __init__( + self, + retention: _Optional[ + _Union[datetime.timedelta, _duration_pb2.Duration, _Mapping] + ] = ..., + max_items: _Optional[int] = ..., + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index 4e128a2aa..c241cab40 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index e1b2e01c4..1ee64fafd 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -114,6 +114,9 @@ from temporalio.api.sdk.v1 import ( worker_config_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_worker__config__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -131,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xbf\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4214,578 +4217,578 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1646 - _REGISTERNAMESPACEREQUEST._serialized_end = 2294 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2251 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2294 - _REGISTERNAMESPACERESPONSE._serialized_start = 2296 - _REGISTERNAMESPACERESPONSE._serialized_end = 2323 - _LISTNAMESPACESREQUEST._serialized_start = 2326 - _LISTNAMESPACESREQUEST._serialized_end = 2463 - _LISTNAMESPACESRESPONSE._serialized_start = 2466 - _LISTNAMESPACESRESPONSE._serialized_end = 2595 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2597 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2680 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2683 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3196 - _UPDATENAMESPACEREQUEST._serialized_start = 3199 - _UPDATENAMESPACEREQUEST._serialized_end = 3534 - _UPDATENAMESPACERESPONSE._serialized_start = 3537 - _UPDATENAMESPACERESPONSE._serialized_end = 3828 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3830 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3900 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3902 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3930 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3933 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5550 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5553 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5851 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5854 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6152 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6155 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6341 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6344 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6520 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6522 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6642 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6645 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7085 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7088 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8175 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8091 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8175 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8178 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9350 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9445 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9447 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9519 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9764 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9767 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10292 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10294 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10329 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10332 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10818 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10821 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12002 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12005 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12170 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12172 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12284 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12287 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12494 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12496 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12612 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12615 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 12997 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 12999 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13037 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13040 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13247 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13249 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13291 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13294 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13740 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13742 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13829 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13832 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14103 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14105 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14196 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14199 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14581 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14583 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14620 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14623 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 14911 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 14913 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 14954 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 14957 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15217 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15219 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15259 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15262 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15612 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15614 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15691 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15694 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17033 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17036 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17194 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17197 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17646 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17648 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17696 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17699 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 17986 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 17988 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18024 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18026 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18148 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18150 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18183 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18186 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18515 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18518 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18648 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18651 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19180 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19182 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19291 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19293 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19419 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19421 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19538 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19541 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19675 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19677 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19786 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19788 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19914 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19916 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19982 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19985 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20222 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20224 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20252 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20255 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20456 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20372 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20456 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20459 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20820 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20822 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20857 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20859 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 20969 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 20971 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21001 - _SHUTDOWNWORKERREQUEST._serialized_start = 21004 - _SHUTDOWNWORKERREQUEST._serialized_end = 21287 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21289 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21313 - _QUERYWORKFLOWREQUEST._serialized_start = 21316 - _QUERYWORKFLOWREQUEST._serialized_end = 21549 - _QUERYWORKFLOWRESPONSE._serialized_start = 21552 - _QUERYWORKFLOWRESPONSE._serialized_end = 21737 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21739 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21854 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21857 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22522 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22525 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23053 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23056 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24060 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23842 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 23958 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 23960 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24060 - _GETCLUSTERINFOREQUEST._serialized_start = 24062 - _GETCLUSTERINFOREQUEST._serialized_end = 24085 - _GETCLUSTERINFORESPONSE._serialized_start = 24088 - _GETCLUSTERINFORESPONSE._serialized_end = 24553 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24498 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24553 - _GETSYSTEMINFOREQUEST._serialized_start = 24555 - _GETSYSTEMINFOREQUEST._serialized_end = 24577 - _GETSYSTEMINFORESPONSE._serialized_start = 24580 - _GETSYSTEMINFORESPONSE._serialized_end = 25157 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24721 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25157 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25159 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25268 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25271 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25494 - _CREATESCHEDULEREQUEST._serialized_start = 25497 - _CREATESCHEDULEREQUEST._serialized_end = 25829 - _CREATESCHEDULERESPONSE._serialized_start = 25831 - _CREATESCHEDULERESPONSE._serialized_end = 25879 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25881 - _DESCRIBESCHEDULEREQUEST._serialized_end = 25946 - _DESCRIBESCHEDULERESPONSE._serialized_start = 25949 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26220 - _UPDATESCHEDULEREQUEST._serialized_start = 26223 - _UPDATESCHEDULEREQUEST._serialized_end = 26515 - _UPDATESCHEDULERESPONSE._serialized_start = 26517 - _UPDATESCHEDULERESPONSE._serialized_end = 26541 - _PATCHSCHEDULEREQUEST._serialized_start = 26544 - _PATCHSCHEDULEREQUEST._serialized_end = 26700 - _PATCHSCHEDULERESPONSE._serialized_start = 26702 - _PATCHSCHEDULERESPONSE._serialized_end = 26725 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26728 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26896 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26898 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 26981 - _DELETESCHEDULEREQUEST._serialized_start = 26983 - _DELETESCHEDULEREQUEST._serialized_end = 27064 - _DELETESCHEDULERESPONSE._serialized_start = 27066 - _DELETESCHEDULERESPONSE._serialized_end = 27090 - _LISTSCHEDULESREQUEST._serialized_start = 27092 - _LISTSCHEDULESREQUEST._serialized_end = 27200 - _LISTSCHEDULESRESPONSE._serialized_start = 27202 - _LISTSCHEDULESRESPONSE._serialized_end = 27314 - _COUNTSCHEDULESREQUEST._serialized_start = 27316 - _COUNTSCHEDULESREQUEST._serialized_end = 27373 - _COUNTSCHEDULESRESPONSE._serialized_start = 27376 - _COUNTSCHEDULESRESPONSE._serialized_end = 27595 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27598 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28244 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28045 + _REGISTERNAMESPACEREQUEST._serialized_start = 1684 + _REGISTERNAMESPACEREQUEST._serialized_end = 2332 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 + _REGISTERNAMESPACERESPONSE._serialized_start = 2334 + _REGISTERNAMESPACERESPONSE._serialized_end = 2361 + _LISTNAMESPACESREQUEST._serialized_start = 2364 + _LISTNAMESPACESREQUEST._serialized_end = 2501 + _LISTNAMESPACESRESPONSE._serialized_start = 2504 + _LISTNAMESPACESRESPONSE._serialized_end = 2633 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 + _UPDATENAMESPACEREQUEST._serialized_start = 3237 + _UPDATENAMESPACEREQUEST._serialized_end = 3572 + _UPDATENAMESPACERESPONSE._serialized_start = 3575 + _UPDATENAMESPACERESPONSE._serialized_end = 3866 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 + _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 + _SHUTDOWNWORKERREQUEST._serialized_start = 21102 + _SHUTDOWNWORKERREQUEST._serialized_end = 21385 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 + _QUERYWORKFLOWREQUEST._serialized_start = 21414 + _QUERYWORKFLOWREQUEST._serialized_end = 21647 + _QUERYWORKFLOWRESPONSE._serialized_start = 21650 + _QUERYWORKFLOWRESPONSE._serialized_end = 21835 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 + _GETCLUSTERINFOREQUEST._serialized_start = 24160 + _GETCLUSTERINFOREQUEST._serialized_end = 24183 + _GETCLUSTERINFORESPONSE._serialized_start = 24186 + _GETCLUSTERINFORESPONSE._serialized_end = 24651 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 + _GETSYSTEMINFOREQUEST._serialized_start = 24653 + _GETSYSTEMINFOREQUEST._serialized_end = 24675 + _GETSYSTEMINFORESPONSE._serialized_start = 24678 + _GETSYSTEMINFORESPONSE._serialized_end = 25255 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 + _CREATESCHEDULEREQUEST._serialized_start = 25595 + _CREATESCHEDULEREQUEST._serialized_end = 25927 + _CREATESCHEDULERESPONSE._serialized_start = 25929 + _CREATESCHEDULERESPONSE._serialized_end = 25977 + _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 + _UPDATESCHEDULEREQUEST._serialized_start = 26321 + _UPDATESCHEDULEREQUEST._serialized_end = 26613 + _UPDATESCHEDULERESPONSE._serialized_start = 26615 + _UPDATESCHEDULERESPONSE._serialized_end = 26639 + _PATCHSCHEDULEREQUEST._serialized_start = 26642 + _PATCHSCHEDULEREQUEST._serialized_end = 26798 + _PATCHSCHEDULERESPONSE._serialized_start = 26800 + _PATCHSCHEDULERESPONSE._serialized_end = 26823 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 + _DELETESCHEDULEREQUEST._serialized_start = 27081 + _DELETESCHEDULEREQUEST._serialized_end = 27162 + _DELETESCHEDULERESPONSE._serialized_start = 27164 + _DELETESCHEDULERESPONSE._serialized_end = 27188 + _LISTSCHEDULESREQUEST._serialized_start = 27190 + _LISTSCHEDULESREQUEST._serialized_end = 27298 + _LISTSCHEDULESRESPONSE._serialized_start = 27300 + _LISTSCHEDULESRESPONSE._serialized_end = 27412 + _COUNTSCHEDULESREQUEST._serialized_start = 27414 + _COUNTSCHEDULESREQUEST._serialized_end = 27471 + _COUNTSCHEDULESRESPONSE._serialized_start = 27474 + _COUNTSCHEDULESRESPONSE._serialized_end = 27693 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28156 + 28254 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28158 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28231 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28246 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28310 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28312 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28407 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28409 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28525 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28528 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30245 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29580 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29693 + 29791 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29696 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29825 + 29923 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29827 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29891 + 29989 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29893 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 29999 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30001 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30111 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30113 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30175 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30177 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30232 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30248 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30500 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30502 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30574 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30577 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30826 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30829 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 30985 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 30987 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31101 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31104 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31365 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31368 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31627 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31630 - _STARTBATCHOPERATIONREQUEST._serialized_end = 32996 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 32998 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33027 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33029 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33125 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33127 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33155 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33157 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33223 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33226 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33698 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33700 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33791 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33793 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 33914 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 33917 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34102 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34105 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34324 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34327 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34743 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34746 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35100 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35103 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35270 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35272 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35307 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35310 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35530 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35532 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35564 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35567 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 35939 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35733 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 35939 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 35942 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36274 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36068 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36274 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36277 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36613 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36616 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 36935 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 36937 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37037 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37039 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37148 - _PAUSEACTIVITYREQUEST._serialized_start = 37151 - _PAUSEACTIVITYREQUEST._serialized_end = 37350 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37353 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37536 - _PAUSEACTIVITYRESPONSE._serialized_start = 37538 - _PAUSEACTIVITYRESPONSE._serialized_end = 37561 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37563 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37595 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37598 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37878 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37881 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38154 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38156 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38181 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38183 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38217 - _RESETACTIVITYREQUEST._serialized_start = 38220 - _RESETACTIVITYREQUEST._serialized_end = 38527 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38530 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38820 - _RESETACTIVITYRESPONSE._serialized_start = 38822 - _RESETACTIVITYRESPONSE._serialized_end = 38845 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38847 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38879 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38882 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39166 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39169 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39346 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39348 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39454 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39456 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39553 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39556 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39750 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39753 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40014 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40407 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40484 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40487 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40627 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40629 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40737 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40739 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40858 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40861 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41066 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41069 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41254 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41257 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41486 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41489 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 41932 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 41935 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42159 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42161 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42274 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42276 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42332 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42334 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42427 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42430 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43101 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42605 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43101 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43104 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43344 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43346 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43385 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43388 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43588 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43590 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43629 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43631 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43724 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43726 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43758 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43761 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44279 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44331 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44334 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44834 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44836 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44890 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44893 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45311 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45226 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 + _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 + _PAUSEACTIVITYREQUEST._serialized_start = 37249 + _PAUSEACTIVITYREQUEST._serialized_end = 37448 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 + _PAUSEACTIVITYRESPONSE._serialized_start = 37636 + _PAUSEACTIVITYRESPONSE._serialized_end = 37659 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 + _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 + _RESETACTIVITYREQUEST._serialized_start = 38318 + _RESETACTIVITYREQUEST._serialized_end = 38625 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 + _RESETACTIVITYRESPONSE._serialized_start = 38920 + _RESETACTIVITYRESPONSE._serialized_end = 38943 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 + _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 + _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45311 + 45409 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45313 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45423 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45426 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45615 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45617 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45716 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45718 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45787 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45789 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45896 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45898 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46011 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46014 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46241 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46244 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46424 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46426 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46521 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46523 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46588 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46590 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46671 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46673 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46736 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46738 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46766 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46768 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46838 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46840 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 46944 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 46947 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47153 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47155 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47201 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47204 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47359 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47361 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47392 - _LISTWORKERSREQUEST._serialized_start = 47395 - _LISTWORKERSREQUEST._serialized_end = 47525 - _LISTWORKERSRESPONSE._serialized_start = 47528 - _LISTWORKERSRESPONSE._serialized_end = 47693 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47696 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48421 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48263 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48354 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 + _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 + _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 + _LISTWORKERSREQUEST._serialized_start = 47493 + _LISTWORKERSREQUEST._serialized_end = 47623 + _LISTWORKERSRESPONSE._serialized_start = 47626 + _LISTWORKERSRESPONSE._serialized_end = 47791 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48356 + 48454 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48421 + 48519 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48423 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48514 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48517 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48675 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48677 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48762 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48765 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49031 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49033 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49133 - _DESCRIBEWORKERREQUEST._serialized_start = 49135 - _DESCRIBEWORKERREQUEST._serialized_end = 49206 - _DESCRIBEWORKERRESPONSE._serialized_start = 49208 - _DESCRIBEWORKERRESPONSE._serialized_end = 49289 - _COUNTWORKERSREQUEST._serialized_start = 49291 - _COUNTWORKERSREQUEST._serialized_end = 49378 - _COUNTWORKERSRESPONSE._serialized_start = 49380 - _COUNTWORKERSRESPONSE._serialized_end = 49417 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49420 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49561 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49563 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49595 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49598 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49741 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49743 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49777 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49780 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 50957 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 50959 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51068 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51071 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51299 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51302 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51618 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51620 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51706 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51708 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51824 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51826 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 51935 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 51938 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52068 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52071 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52870 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 52922 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 52993 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52996 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53166 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53169 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53480 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53483 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53644 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53647 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53908 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 53910 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54025 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54028 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54167 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54169 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54235 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54238 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54475 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54477 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54552 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54801 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54804 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 54953 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 54955 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 54995 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 54998 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55143 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55145 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55181 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55183 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55271 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55273 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55306 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55309 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55465 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55467 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55513 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55516 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55668 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55670 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55712 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55714 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55809 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55811 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55850 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55853 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56010 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56013 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56245 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 + _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 + _DESCRIBEWORKERREQUEST._serialized_start = 49233 + _DESCRIBEWORKERREQUEST._serialized_end = 49304 + _DESCRIBEWORKERRESPONSE._serialized_start = 49306 + _DESCRIBEWORKERRESPONSE._serialized_end = 49387 + _COUNTWORKERSREQUEST._serialized_start = 49389 + _COUNTWORKERSREQUEST._serialized_end = 49476 + _COUNTWORKERSRESPONSE._serialized_start = 49478 + _COUNTWORKERSRESPONSE._serialized_end = 49515 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index eb9243716..7d7c4897f 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -46,6 +46,7 @@ import temporalio.api.schedule.v1.message_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.sdk.v1.worker_config_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.version.v1.message_pb2 @@ -1276,6 +1277,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): MESSAGES_FIELD_NUMBER: builtins.int POLLER_SCALING_DECISION_FIELD_NUMBER: builtins.int POLLER_GROUP_ID_FIELD_NUMBER: builtins.int + STREAM_SLICES_FIELD_NUMBER: builtins.int POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int task_token: builtins.bytes @@ -1366,6 +1368,17 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): Corresponding RespondQueryTaskCompleted should pass this value for proper routing. """ @property + def stream_slices( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ]: + """Slices of the streams this Workflow consumes. A slice with no + workflow_task_completed_event_id is for the task about to run; one with + it set is re-supplying a range an earlier task consumed, so a worker + replaying from History gets the same bytes that task was given. + """ + @property def poller_group_infos( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ @@ -1421,6 +1434,10 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): poller_scaling_decision: temporalio.api.taskqueue.v1.message_pb2.PollerScalingDecision | None = ..., poller_group_id: builtins.str = ..., + stream_slices: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ] + | None = ..., poller_group_infos: collections.abc.Iterable[ temporalio.api.taskqueue.v1.message_pb2.PollerGroupInfo ] @@ -1484,6 +1501,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"started_event_id", "started_time", b"started_time", + "stream_slices", + b"stream_slices", "task_token", b"task_token", "workflow_execution", diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..77d1b6c7a 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamMessage( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +367,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_messages"): + await self._visit_coresdk_workflow_activation_DeliverStreamMessages( + fs, o.deliver_stream_messages + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any @@ -492,6 +510,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AddStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -551,6 +575,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("add_stream_messages"): + await self._visit_coresdk_workflow_commands_AddStreamMessages( + fs, o.add_stream_messages + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0e1b3a1e6..cd09b8b97 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,311 +2,447 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') - - +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] -_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] -_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] -WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }) +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.update.v1 import ( + message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.activity_result import ( + activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' +) + + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ + "HeadersEntry" +] +_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStart" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartSuccess" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartFailure" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartCancelled" +] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecution" +] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveSignalExternalWorkflow" +] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveRequestCancelExternalWorkflow" +] +_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveNexusOperationStart" +] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] +WorkflowActivation = _reflection.GeneratedProtocolMessageType( + "WorkflowActivation", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }, +) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( + "WorkflowActivationJob", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }, +) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) - }) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( + "DeliverStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }, +) _sym_db.RegisterMessage(DeliverStreamMessages) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _INITIALIZEWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }) +InitializeWorkflow = _reflection.GeneratedProtocolMessageType( + "InitializeWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _INITIALIZEWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }, +) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { - 'DESCRIPTOR' : _FIRETIMER, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }) +FireTimer = _reflection.GeneratedProtocolMessageType( + "FireTimer", + (_message.Message,), + { + "DESCRIPTOR": _FIRETIMER, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }, +) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }) +ResolveActivity = _reflection.GeneratedProtocolMessageType( + "ResolveActivity", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEACTIVITY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }, +) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartSuccess", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartFailure", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartCancelled", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERANDOMSEED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( + "UpdateRandomSeed", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERANDOMSEED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }, +) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _QUERYWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }) +QueryWorkflow = _reflection.GeneratedProtocolMessageType( + "QueryWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _QUERYWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }, +) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }) +CancelWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }, +) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }) +SignalWorkflow = _reflection.GeneratedProtocolMessageType( + "SignalWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }, +) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { - 'DESCRIPTOR' : _NOTIFYHASPATCH, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType( + "NotifyHasPatch", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYHASPATCH, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }, +) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveSignalExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveRequestCancelExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }) - , - 'DESCRIPTOR' : _DOUPDATE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }) +DoUpdate = _reflection.GeneratedProtocolMessageType( + "DoUpdate", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }, + ), + "DESCRIPTOR": _DOUPDATE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }, +) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperationStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }, +) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }, +) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEFROMCACHE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }) +RemoveFromCache = _reflection.GeneratedProtocolMessageType( + "RemoveFromCache", + (_message.Message,), + { + "DESCRIPTOR": _REMOVEFROMCACHE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }, +) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' - _WORKFLOWACTIVATION._serialized_start=570 - _WORKFLOWACTIVATION._serialized_end=1116 - _WORKFLOWACTIVATIONJOB._serialized_start=1119 - _WORKFLOWACTIVATIONJOB._serialized_end=2582 - _DELIVERSTREAMMESSAGES._serialized_start=2585 - _DELIVERSTREAMMESSAGES._serialized_end=2724 - _INITIALIZEWORKFLOW._serialized_start=2727 - _INITIALIZEWORKFLOW._serialized_end=4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 - _FIRETIMER._serialized_start=4133 - _FIRETIMER._serialized_end=4157 - _RESOLVEACTIVITY._serialized_start=4159 - _RESOLVEACTIVITY._serialized_end=4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 - _UPDATERANDOMSEED._serialized_start=5045 - _UPDATERANDOMSEED._serialized_end=5088 - _QUERYWORKFLOW._serialized_start=5091 - _QUERYWORKFLOW._serialized_end=5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 - _CANCELWORKFLOW._serialized_start=5353 - _CANCELWORKFLOW._serialized_end=5385 - _SIGNALWORKFLOW._serialized_start=5388 - _SIGNALWORKFLOW._serialized_end=5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 - _NOTIFYHASPATCH._serialized_start=5679 - _NOTIFYHASPATCH._serialized_end=5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 - _DOUPDATE._serialized_start=5917 - _DOUPDATE._serialized_end=6248 - _DOUPDATE_HEADERSENTRY._serialized_start=4052 - _DOUPDATE_HEADERSENTRY._serialized_end=4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 - _RESOLVENEXUSOPERATION._serialized_start=6407 - _RESOLVENEXUSOPERATION._serialized_end=6496 - _REMOVEFROMCACHE._serialized_start=6499 - _REMOVEFROMCACHE._serialized_end=6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" + ) + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" + _WORKFLOWACTIVATION._serialized_start = 570 + _WORKFLOWACTIVATION._serialized_end = 1116 + _WORKFLOWACTIVATIONJOB._serialized_start = 1119 + _WORKFLOWACTIVATIONJOB._serialized_end = 2582 + _DELIVERSTREAMMESSAGES._serialized_start = 2585 + _DELIVERSTREAMMESSAGES._serialized_end = 2724 + _INITIALIZEWORKFLOW._serialized_start = 2727 + _INITIALIZEWORKFLOW._serialized_end = 4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _FIRETIMER._serialized_start = 4133 + _FIRETIMER._serialized_end = 4157 + _RESOLVEACTIVITY._serialized_start = 4159 + _RESOLVEACTIVITY._serialized_end = 4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 + _UPDATERANDOMSEED._serialized_start = 5045 + _UPDATERANDOMSEED._serialized_end = 5088 + _QUERYWORKFLOW._serialized_start = 5091 + _QUERYWORKFLOW._serialized_end = 5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _CANCELWORKFLOW._serialized_start = 5353 + _CANCELWORKFLOW._serialized_end = 5385 + _SIGNALWORKFLOW._serialized_start = 5388 + _SIGNALWORKFLOW._serialized_end = 5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _NOTIFYHASPATCH._serialized_start = 5679 + _NOTIFYHASPATCH._serialized_end = 5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 + _DOUPDATE._serialized_start = 5917 + _DOUPDATE._serialized_end = 6248 + _DOUPDATE_HEADERSENTRY._serialized_start = 4052 + _DOUPDATE_HEADERSENTRY._serialized_end = 4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 + _RESOLVENEXUSOPERATION._serialized_start = 6407 + _RESOLVENEXUSOPERATION._serialized_end = 6496 + _REMOVEFROMCACHE._serialized_start = 6499 + _REMOVEFROMCACHE._serialized_end = 6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index eab815fc9..5245cd6fc 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,9 +19,9 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -439,6 +439,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" @@ -1451,63 +1508,6 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation -class DeliverStreamMessages(google.protobuf.message.Message): - """Hand a workflow the next range of a stream it subscribed to. - - The range is delivered once, on the task the server decided it belongs to, - and the offsets it covered are recorded in History rather than the payloads. - On replay the server re-supplies the same range by reading the stream again, - so this job appears at the same point with the same contents both times. - - An empty range is still delivered: a task where the subscription saw nothing - is a fact replay has to reproduce, not an absence of one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - FROM_OFFSET_FIELD_NUMBER: builtins.int - TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Id of the stream this range came from.""" - from_offset: builtins.int - """Inclusive.""" - to_offset: builtins.int - """Exclusive. Equal to from_offset when the subscription saw nothing.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - from_offset: builtins.int = ..., - to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "from_offset", - b"from_offset", - "messages", - b"messages", - "stream_id", - b"stream_id", - "to_offset", - b"to_offset", - ], - ) -> None: ... - -global___DeliverStreamMessages = DeliverStreamMessages - class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..44826f2da 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AddStreamMessages, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -21,6 +22,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -28,6 +30,7 @@ __all__ = [ "ActivityCancellationType", + "AddStreamMessages", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -49,6 +52,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index ccfa1a016..3374f951a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,408 +2,583 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.sdk.v1 import ( + event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, +) +from temporalio.api.sdk.v1 import ( + user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' +) + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] -_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] -_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] -_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] -WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWCOMMAND, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] +_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] +_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ + "HeadersEntry" +] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ + "RequestCancelLocalActivity" +] +_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CompleteWorkflowExecution" +] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ContinueAsNewWorkflowExecution" +] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "StartChildWorkflowExecution" +] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CancelChildWorkflowExecution" +] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "RequestCancelExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "SignalExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( + _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UpsertWorkflowSearchAttributes" +] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ + "NexusHeaderEntry" +] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ + "RequestCancelNexusOperation" +] +WorkflowCommand = _reflection.GeneratedProtocolMessageType( + "WorkflowCommand", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWCOMMAND, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }, +) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _ADDSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) - }) +AddStreamMessages = _reflection.GeneratedProtocolMessageType( + "AddStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }, +) _sym_db.RegisterMessage(AddStreamMessages) -SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { - 'DESCRIPTOR' : _SUBSCRIBESTREAM, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) - }) +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) _sym_db.RegisterMessage(SubscribeStream) -StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { - 'DESCRIPTOR' : _STARTTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }) +StartTimer = _reflection.GeneratedProtocolMessageType( + "StartTimer", + (_message.Message,), + { + "DESCRIPTOR": _STARTTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }, +) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { - 'DESCRIPTOR' : _CANCELTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }) +CancelTimer = _reflection.GeneratedProtocolMessageType( + "CancelTimer", + (_message.Message,), + { + "DESCRIPTOR": _CANCELTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }, +) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }) +ScheduleActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULEACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }, +) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleLocalActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULELOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }, +) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }, +) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelLocalActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }, +) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }) +QueryResult = _reflection.GeneratedProtocolMessageType( + "QueryResult", + (_message.Message,), + { + "DESCRIPTOR": _QUERYRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }, +) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { - 'DESCRIPTOR' : _QUERYSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }) +QuerySuccess = _reflection.GeneratedProtocolMessageType( + "QuerySuccess", + (_message.Message,), + { + "DESCRIPTOR": _QUERYSUCCESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }, +) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CompleteWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }, +) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "FailWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _FAILWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }, +) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }) - , - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ContinueAsNewWorkflowExecution", + (_message.Message,), + { + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }, + ), + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }, +) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { - 'DESCRIPTOR' : _SETPATCHMARKER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }) +SetPatchMarker = _reflection.GeneratedProtocolMessageType( + "SetPatchMarker", + (_message.Message,), + { + "DESCRIPTOR": _SETPATCHMARKER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }, +) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }) - , - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }) - , - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "StartChildWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }, + ), + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }, + ), + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "RequestCancelExternalWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "SignalExternalWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelSignalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELSIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }, +) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { - 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( + "UpsertWorkflowSearchAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }, +) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { - 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( + "ModifyWorkflowProperties", + (_message.Message,), + { + "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }, +) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERESPONSE, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }) +UpdateResponse = _reflection.GeneratedProtocolMessageType( + "UpdateResponse", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERESPONSE, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }, +) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { - - 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( + "ScheduleNexusOperation", + (_message.Message,), + { + "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( + "NexusHeaderEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }, + ), + "DESCRIPTOR": _SCHEDULENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }, +) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( + "RequestCancelNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }, +) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' - _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 - _WORKFLOWCOMMAND._serialized_start=556 - _WORKFLOWCOMMAND._serialized_end=2794 - _ADDSTREAMMESSAGES._serialized_start=2796 - _ADDSTREAMMESSAGES._serialized_end=2891 - _SUBSCRIBESTREAM._serialized_start=2893 - _SUBSCRIBESTREAM._serialized_end=2951 - _STARTTIMER._serialized_start=2953 - _STARTTIMER._serialized_end=3036 - _CANCELTIMER._serialized_start=3038 - _CANCELTIMER._serialized_end=3064 - _SCHEDULEACTIVITY._serialized_start=3067 - _SCHEDULEACTIVITY._serialized_end=3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 - _SCHEDULELOCALACTIVITY._serialized_start=3894 - _SCHEDULELOCALACTIVITY._serialized_end=4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 - _REQUESTCANCELACTIVITY._serialized_start=4646 - _REQUESTCANCELACTIVITY._serialized_end=4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 - _QUERYRESULT._serialized_start=4728 - _QUERYRESULT._serialized_end=4884 - _QUERYSUCCESS._serialized_start=4886 - _QUERYSUCCESS._serialized_end=4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 - _FAILWORKFLOWEXECUTION._serialized_start=5031 - _FAILWORKFLOWEXECUTION._serialized_end=5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELWORKFLOWEXECUTION._serialized_start=6024 - _CANCELWORKFLOWEXECUTION._serialized_end=6100 - _SETPATCHMARKER._serialized_start=6102 - _SETPATCHMARKER._serialized_end=6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELSIGNALWORKFLOW._serialized_start=7958 - _CANCELSIGNALWORKFLOW._serialized_end=7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 - _UPDATERESPONSE._serialized_start=8180 - _UPDATERESPONSE._serialized_end=8390 - _SCHEDULENEXUSOPERATION._serialized_start=8393 - _SCHEDULENEXUSOPERATION._serialized_end=8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" + ) + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2794 + _ADDSTREAMMESSAGES._serialized_start = 2796 + _ADDSTREAMMESSAGES._serialized_end = 2891 + _SUBSCRIBESTREAM._serialized_start = 2893 + _SUBSCRIBESTREAM._serialized_end = 2951 + _STARTTIMER._serialized_start = 2953 + _STARTTIMER._serialized_end = 3036 + _CANCELTIMER._serialized_start = 3038 + _CANCELTIMER._serialized_end = 3064 + _SCHEDULEACTIVITY._serialized_start = 3067 + _SCHEDULEACTIVITY._serialized_end = 3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 + _SCHEDULELOCALACTIVITY._serialized_start = 3894 + _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 + _REQUESTCANCELACTIVITY._serialized_start = 4646 + _REQUESTCANCELACTIVITY._serialized_end = 4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 + _QUERYRESULT._serialized_start = 4728 + _QUERYRESULT._serialized_end = 4884 + _QUERYSUCCESS._serialized_start = 4886 + _QUERYSUCCESS._serialized_end = 4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 + _FAILWORKFLOWEXECUTION._serialized_start = 5031 + _FAILWORKFLOWEXECUTION._serialized_end = 5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELWORKFLOWEXECUTION._serialized_start = 6024 + _CANCELWORKFLOWEXECUTION._serialized_end = 6100 + _SETPATCHMARKER._serialized_start = 6102 + _SETPATCHMARKER._serialized_end = 6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELSIGNALWORKFLOW._serialized_start = 7958 + _CANCELSIGNALWORKFLOW._serialized_end = 7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 + _UPDATERESPONSE._serialized_start = 8180 + _UPDATERESPONSE._serialized_end = 8390 + _SCHEDULENEXUSOPERATION._serialized_start = 8393 + _SCHEDULENEXUSOPERATION._serialized_end = 8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index f5a5fdb97..b3977164a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,9 +23,9 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -228,6 +228,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -252,10 +254,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -272,6 +270,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -285,6 +285,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -311,10 +313,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -331,6 +329,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -375,38 +375,14 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class StartTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... - def __init__( - self, - *, - seq: builtins.int = ..., - start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> None: ... - -global___StartTimer = StartTimer - class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -444,14 +420,6 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int @@ -476,6 +444,36 @@ class SubscribeStream(google.protobuf.message.Message): global___SubscribeStream = SubscribeStream +class StartTimer(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int + seq: builtins.int + """Lang's incremental sequence number, used as the operation identifier""" + @property + def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + seq: builtins.int = ..., + start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> None: ... + +global___StartTimer = StartTimer + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor From 4735d5e05c988d39b6e3a29281722138a04dff79 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 046/831] Sorted and formatted the server-side stream modules. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and `check-protos` reformats what it regenerates. --- scripts/gen_stream_protos.py | 29 +++++++++++++++---- temporalio/client_stream.py | 14 +++++---- temporalio/contrib/server_streams/__init__.py | 12 ++++---- temporalio/streams/providers/native.py | 14 +++++++-- temporalio/workflow/__init__.py | 10 +++---- tests/contrib/test_server_streams.py | 16 ++++++---- tests/worker/test_workflow_stream.py | 4 +-- tests/worker/test_workflow_stream_e2e.py | 6 ++-- 8 files changed, 70 insertions(+), 35 deletions(-) diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index e66f8abb4..f57ff6177 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -34,7 +34,13 @@ # the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` # checkout instead when the submodule is not initialized. UPSTREAM_API = ( - BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + BASE + / "temporalio" + / "bridge" + / "sdk-core" + / "crates" + / "protos" + / "protos" / "api_upstream" ) @@ -43,16 +49,24 @@ def api_proto_path() -> Path: override = os.environ.get("TEMPORAL_API_PROTOS") if override: return Path(override).resolve() - if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + if ( + UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto" + ).is_file(): return UPSTREAM_API raise SystemExit( "no api protos found: initialize the sdk-core submodule or set " "TEMPORAL_API_PROTOS to a temporalio/api checkout" ) + SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") -FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] +FILES = [ + "message.proto", + "stream_state.proto", + "request_response.proto", + "service.proto", +] # Server-only options. They carry shard routing and rate-limit category, which # a client neither reads nor can resolve, since the files defining them are not @@ -63,7 +77,10 @@ def api_proto_path() -> Path: # protoc names a python module after the proto path. These put the generated # modules where this package publishes them. FIX_PY = [ - (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + ( + re.compile(r"from temporalio\.api\.stream\.v1 import"), + "from temporalio.api.streamservice.v1 import", + ), (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), (re.compile(r"from temporal\.api\."), "from temporalio.api."), (re.compile(r"import temporal\.api\."), "import temporalio.api."), @@ -96,7 +113,9 @@ def main() -> None: out.mkdir() subprocess.run( [ - sys.executable, "-m", "grpc_tools.protoc", + sys.executable, + "-m", + "grpc_tools.protoc", f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 75388c9c9..1b5d953bd 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -242,9 +242,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, @@ -401,9 +402,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index e831d763c..b6db1fd7a 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -169,9 +169,7 @@ def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... @overload def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... - def topic( - self, name: str, *, type: type = object - ) -> WorkflowTopicHandle[Any]: + def topic(self, name: str, *, type: type = object) -> WorkflowTopicHandle[Any]: """Bind a topic on this Workflow's stream.""" return WorkflowTopicHandle(name, type) @@ -179,7 +177,9 @@ def topic( class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" - def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + def __init__( + self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client self._name = topic @@ -316,7 +316,9 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown - async for message in self._handle.follow(from_offset=from_offset, topics=topics): + async for message in self._handle.follow( + from_offset=from_offset, topics=topics + ): yield WorkflowStreamItem( topic=message.topic, data=_decode(self._converter, message.data, result_type), diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index c0044b9cf..1243d3784 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -193,7 +193,11 @@ def _provider_id(self) -> str: without letting a new generation be swallowed as a duplicate of the old one. """ - return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) async def append(self, *values: Any) -> Cursor: """Append values and return where the first one landed.""" @@ -240,7 +244,9 @@ async def finish(self) -> None: def _encode(self, value: Any) -> bytes: payload = ( - value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] ) return payload.SerializeToString() @@ -298,7 +304,9 @@ async def latest(self, *, topic: str | None = None) -> Cursor: # A stream nobody has published to does not exist yet, and that # is the same answer as an empty one. return BEGINNING - return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + return ( + Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + ) def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 9189b0db6..17b81aeb3 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,6 +58,7 @@ wait, ) from ._context import ( + DeliveredStreamMessage, Info, ParentInfo, RootInfo, @@ -65,6 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, + add_stream_messages, cancellation_reason, current_update_info, deprecate_patch, @@ -86,20 +88,18 @@ payload_converter, random, random_seed, + read_stream, + read_stream_messages, register_random_seed_callback, set_current_details, sleep, + subscribe_stream, time, time_ns, upsert_memo, upsert_search_attributes, uuid4, uuid7, - DeliveredStreamMessage, - read_stream, - read_stream_messages, - add_stream_messages, - subscribe_stream, wait_condition, ) from ._definition import ( diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 33d86d827..e1fe84c77 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -103,7 +103,9 @@ async def read() -> None: # The Workflow's own publishes bracket the Activity's, and both are on one # log in the order the server took them. - assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + [ + "workflow" + ] assert seen[0].text == "turn started" assert seen[-1].text == "turn ended" assert offsets == list(range(tokens + 2)) @@ -115,7 +117,9 @@ async def read() -> None: assert await late.get_offset() == tokens + 2 replayed = [ item.data.text - async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in late.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert replayed == [e.text for e in seen] @@ -132,14 +136,14 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: activities=[emit_from_activity], max_cached_workflows=0, ): - await client.execute_workflow( - Emitting.run, 3, id=wf_id, task_queue=task_queue - ) + await client.execute_workflow(Emitting.run, 3, id=wf_id, task_queue=task_queue) stream = WorkflowStreamClient.create(client, wf_id) first = [ item - async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert len(first) == 5 diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index bb0dcf9ba..40d6fdf45 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -75,9 +75,7 @@ class _ReadOnlyStub: method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = ( - _WorkflowInstanceImpl.workflow_read_stream_messages - ) + workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 579327217..00d0dfa85 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,9 +17,9 @@ import uuid import pytest -from temporalio.api.enums.v1 import EventType from temporalio import workflow +from temporalio.api.enums.v1 import EventType from temporalio.client import Client from temporalio.worker import Worker @@ -239,6 +239,8 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: async for event in client.get_workflow_handle(wf_id).fetch_history_events(): if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: completed += 1 - assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + assert completed >= 3, ( + f"only {completed} workflow tasks, sticky path not exercised" + ) finally: await streams.close() From 1401338efa8b0b5c3cfe1563637f8d18c215dc9e Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:30 -0700 Subject: [PATCH 047/831] Made the server-side stream modules pass the type and doc linters. A Standalone Activity has no `workflow_id`, so opening its Workflow's stream now says that rather than sending `None` on the wire. `Optional` and `typing.Sequence` are deprecated spellings the linter rejects. --- temporalio/client_stream.py | 7 +++-- temporalio/contrib/server_streams/__init__.py | 29 +++++++++++-------- temporalio/streams/providers/native.py | 12 ++++++-- tests/test_client_stream.py | 2 +- tests/worker/test_workflow_stream.py | 13 +++++++-- tests/worker/test_workflow_stream_e2e.py | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1b5d953bd..8280b56d4 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,8 +23,9 @@ from __future__ import annotations +from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass -from typing import Any, AsyncIterator, Optional, Sequence +from typing import Any import google.protobuf.duration_pb2 @@ -102,8 +103,8 @@ async def create( self, stream_id: str, *, - retention: Optional[float] = None, - max_items: Optional[int] = None, + retention: float | None = None, + max_items: int | None = None, ) -> "StreamHandle": """Create a stream and return a handle to it. diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index b6db1fd7a..c15184bf4 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -20,16 +20,17 @@ from __future__ import annotations import asyncio +import builtins from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from datetime import timedelta -from typing import Any, Generic, Optional, TypeVar, overload +from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient, WorkflowStreamHandle -from temporalio.converter import DataConverter, PayloadConverter +from temporalio.converter import PayloadConverter __all__ = [ "RawPage", @@ -109,7 +110,7 @@ def _reject_configured_codec(client: Client) -> None: ) -def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: +def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) if as_type is None: @@ -210,8 +211,9 @@ def subscribe( self, *, from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + # Spelled out because `type` in this class body is the property below. + result_type: builtins.type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[T]]: """Read this topic from ``from_offset`` onwards.""" return self._client.subscribe( @@ -236,7 +238,7 @@ def __init__( self._converter = converter self._batch_interval = batch_interval self._buffered: list[tuple[str, Any]] = [] - self._flusher: Optional[asyncio.Task[None]] = None + self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() @classmethod @@ -260,10 +262,13 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - client = activity.client() - return cls.create( - client, activity.info().workflow_id, batch_interval=batch_interval - ) + workflow_id = activity.info().workflow_id + if workflow_id is None: + raise RuntimeError( + "no Workflow stream to open: this Activity was not started by a " + "Workflow" + ) + return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -307,8 +312,8 @@ async def subscribe( *, topics: Sequence[str] = (), from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + result_type: type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[Any]]: """Yield items from ``from_offset`` as they arrive. diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 1243d3784..53d231174 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -171,6 +171,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle self._converter = converter self._topic = topic @@ -255,6 +256,7 @@ class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, handle: Any, converter: Any) -> None: + """Read the stream ``handle`` names, from anywhere.""" self._handle = handle self._converter = converter @@ -297,6 +299,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() @@ -320,9 +323,12 @@ class _NativeProvider: name = "native" def configure(self, **options: Any) -> None: - """Nothing to name: the streams are on the server the client is - already connected to. It exists so a process that switches providers - changes one call rather than its structure.""" + """Take no options. + + The streams are on the server the client is already connected to. + This exists so a process that switches providers changes one call + rather than its structure. + """ if options: raise TypeError( f"the native provider takes no options, got {sorted(options)}" diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index f7df3c7a7..8d1a42f30 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -14,7 +14,7 @@ import asyncio import os import uuid -from typing import AsyncIterator +from collections.abc import AsyncIterator import pytest diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 40d6fdf45..1d154b37c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -9,6 +9,7 @@ from __future__ import annotations import asyncio +from typing import Any import pytest @@ -84,6 +85,12 @@ def __init__(self) -> None: def _assert_not_read_only(self, action: str) -> None: self.read_only_calls.append(action) + async def read(self, stream: str, max_messages: int) -> list[bytes]: + instance: Any = self + return await _WorkflowInstanceImpl.workflow_read_stream( + instance, stream, max_messages + ) + @pytest.mark.parametrize("max_messages", [1, 2, 5]) async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: @@ -92,14 +99,14 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b) for b in bodies]) - got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + got = await stub.read("s", max_messages) assert got == bodies[:max_messages] # Whatever the cap left behind has to still be there: nothing resends it. assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) if len(stub._stream_buffers["s"]): - rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + rest = await stub.read("s", 0) assert got + rest == bodies else: assert got == bodies @@ -112,5 +119,5 @@ async def test_read_is_refused_in_a_read_only_context() -> None: stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + await stub.read("s", 0) assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 00d0dfa85..3ee38fef3 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -104,7 +104,7 @@ def __init__(self) -> None: async def run(self) -> int: published = 0 while True: - await workflow.wait_condition(lambda: self._pending or self._done) + await workflow.wait_condition(lambda: bool(self._pending) or self._done) while self._pending: workflow.add_stream_messages([self._pending.pop(0).encode()]) published += 1 From 3081eb2a6628fd483a82465b96ab0fe1e1f390f8 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:38 -0700 Subject: [PATCH 048/831] Added the changelog entry for server-side streams. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e32ed2f24..8c6820082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,13 @@ to include examples, links to docs, or any other relevant information. can read, decide on, and write, with a registry that picks the provider when the worker is built. `temporalio.streams.providers.memory` is the in-memory reference provider the conformance tests run against. +- **Experimental**: server-side streams. A workflow reads a stream the server + delivers on its Workflow Tasks and publishes with a command, through + `temporalio.workflow.read_stream`, `subscribe_stream` and + `add_stream_messages`. `temporalio.client_stream` and + `temporalio.contrib.server_streams` reach the same stream from outside a + workflow, and `temporalio.streams.providers.native` puts it behind the shared + stream interface. Requires a server that serves the stream service. ### Changed From 1045ecdccd379bc7cf04144ab2e92afb6af5109e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 049/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From 6feb86048dcbbccd9e489fc6d187637a882d336a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 050/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From f8497a06bc96eef1df80086b62e51be34ccf09dc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 051/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- .../streams/providers/workflow_streams.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From 8392f47f8a5879da6845b8faad3c4220c8c80397 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 052/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- .../streams/providers/workflow_streams.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) From 2d4bab3c565d534e91b14993459e648f99765d1a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 053/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From 8d47d646865d5dab5bf6af4ee550334789f26bc0 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 054/831] Made the Workflow Streams provider pass the linters. The transport already resolves its payload converter and falls back to the default when it holds no client, so the provider asks it rather than reaching through a client that may not be there. --- .../streams/providers/workflow_streams.py | 13 ++++++-- .../streams/test_workflow_streams_provider.py | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d849f1244..656056381 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -186,6 +186,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to one stream or topic on ``handle``.""" self._handle = handle self._converter = converter self._stream = stream @@ -205,15 +206,19 @@ def _shipped_topic(self) -> str: @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the shipped publish Signal.""" entries = [] for value in values: frame = _frame.encode( @@ -230,6 +235,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor("") async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._frame_topic, kind=RecordKind.FINISH, @@ -274,6 +280,7 @@ def __init__( shipped_topic: str | None, poll_cooldown: timedelta, ) -> None: + """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client self._shipped_topic = shipped_topic self._poll_cooldown = poll_cooldown @@ -285,6 +292,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -362,6 +370,7 @@ def _record( return out async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one log per workflow, whatever the topic head = await self._client.get_offset() return Cursor(str(head - 1)) if head > 0 else BEGINNING @@ -369,7 +378,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._client.data_converter.payload_converter + converter = self._client._payload_converter() if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2b491cbf1..612aaa33d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -12,6 +12,7 @@ import asyncio import os import uuid +from typing import Any import pytest @@ -62,7 +63,7 @@ async def run(self) -> int: return seen -async def take(records, count: int, timeout: float = 30.0) -> list: +async def take(records: Any, count: int, timeout: float = 30.0) -> list: out: list = [] async def _collect() -> None: @@ -77,9 +78,7 @@ async def _collect() -> None: async def test_interface_loop_over_workflow_streams(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -119,9 +118,7 @@ async def test_interface_loop_over_workflow_streams(): async def test_retried_producer_dedupes_and_new_attempt_supersedes(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -135,19 +132,28 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): ) first = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await first.append({"n": 1}) # The retry of the same attempt re-sends its first batch. retry = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await retry.append({"n": 1}) second = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=2, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=2, ) await second.append({"n": 2}) From 0ecca736ac23a47c5205509d54f42f4ffc9dc179 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 055/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e32ed2f24..a827ac789 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,10 @@ to include examples, links to docs, or any other relevant information. can read, decide on, and write, with a registry that picks the provider when the worker is built. `temporalio.streams.providers.memory` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 4adff21f41843e8a8fc9eb5dbccc97e47cc58e27 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 056/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From cb5abb3e9820b7142dcc45bf68c80bc47557b6f2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 057/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From 0fcf447a623ef9d1dfb778775317bf0f9c9d4346 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 058/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From 38b7e69993f14187581b545f25e3ad1c0e9ab199 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 059/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a827ac789..9a6c565cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From 668e4324c4664d0861c969b21a094807f7227aca Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:37:39 -0700 Subject: [PATCH 060/831] Sorted and formatted the streams package for ruff. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and the new files were written by hand. --- streams_demo/agent_loop.py | 10 ++++++---- streams_demo/run_demo.py | 4 ++-- temporalio/streams/__init__.py | 7 ++++++- temporalio/streams/_provider.py | 3 +-- temporalio/streams/providers/memory.py | 11 +++++++++-- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index afbb7ea4c..e68bb0a58 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -29,7 +29,11 @@ async def record_decision(decision: dict[str, Any]) -> str: def decide(token: dict[str, Any]) -> dict[str, Any]: """The decision the workflow is here to make.""" if token["value"] % 2 == 0: - return {"source": token["id"], "branch": "even", "computed": token["value"] * 10} + return { + "source": token["id"], + "branch": "even", + "computed": token["value"] * 10, + } return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} @@ -39,9 +43,7 @@ class AgentLoop: @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: - inputs = streams.reader( - INPUTS, type=dict, idle_timeout=timedelta(seconds=1) - ) + inputs = streams.reader(INPUTS, type=dict, idle_timeout=timedelta(seconds=1)) decisions = streams.writer(DECISIONS) trace: list[dict[str, Any]] = [] accepted = 0 diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 027a95103..687dc1a05 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -17,10 +17,10 @@ import asyncio import json -from pathlib import Path import sys import time import uuid +from pathlib import Path from typing import Any from temporalio import streams @@ -29,8 +29,8 @@ from temporalio.worker import Worker sys.path.insert(0, str(Path(__file__).resolve().parent)) -from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 import provider_setup # noqa: E402 +from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 DECISION_LIMIT = 8 EXPECTED_OUTPUT = 6 diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index aaf0a444d..caaa03ffb 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -54,7 +54,12 @@ from datetime import timedelta from typing import Any, TypeVar -from temporalio.streams._handles import ReadSource, StreamReader, StreamWriter, WriteSink +from temporalio.streams._handles import ( + ReadSource, + StreamReader, + StreamWriter, + WriteSink, +) from temporalio.streams._provider import ( Consumer, Producer, diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index c224b47bf..a36339a97 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -186,8 +186,7 @@ def _make(name: str | None) -> StreamProvider: name = next(iter(_factories)) else: raise RuntimeError( - "name a provider: configure(provider=...) with one of " - f"{registered()}" + f"name a provider: configure(provider=...) with one of {registered()}" ) factory = _factories.get(name) if factory is None: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 477a17b68..fb2712350 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -131,7 +131,12 @@ class MemoryProducer: """The outside producer, faithful to the contract.""" def __init__( - self, store: _MemoryStream, converter: Any, topic: str, producer_id: str, attempt: int + self, + store: _MemoryStream, + converter: Any, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._store = store self._converter = converter @@ -147,7 +152,9 @@ def attempt(self) -> int: @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: From 0877fe4e6c45ea4964b042cd8ebbc972abfab7c9 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:48:04 -0700 Subject: [PATCH 061/831] Made the streams package pass the type and doc linters. `prepare` and `drain` are hooks only a transport that parks something against the running workflow needs, so they move to their own protocol rather than making every provider carry two empty methods. The demo's teardown called a `close` that no provider setup defined. --- streams_demo/agent_loop.py | 1 + streams_demo/provider_setup.py | 10 +++++++++ streams_demo/run_demo.py | 2 ++ temporalio/streams/__init__.py | 6 +++++- temporalio/streams/_policy.py | 1 + temporalio/streams/_provider.py | 25 +++++++++++++++++------ temporalio/streams/providers/memory.py | 7 +++++++ tests/streams/test_streams_conformance.py | 2 +- 8 files changed, 46 insertions(+), 8 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index e68bb0a58..f3f39dca9 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -43,6 +43,7 @@ class AgentLoop: @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: + """Decide on at most ``limit`` inputs, then return the trace.""" inputs = streams.reader(INPUTS, type=dict, idle_timeout=timedelta(seconds=1)) decisions = streams.writer(DECISIONS) trace: list[dict[str, Any]] = [] diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index 81e7108e5..52ebbd266 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -18,4 +18,14 @@ async def open() -> tuple[str, dict]: + """The server to connect to and the options :func:`configure` takes.""" return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), {"provider": NAME} + + +async def close() -> None: + """Let go of whatever :func:`open` acquired. + + Nothing here: the memory provider holds no connection. A provider branch + that opens one closes it here, so the demo's teardown reads the same on + every provider. + """ diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 687dc1a05..9d6a62cb5 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -37,6 +37,7 @@ async def collect_output(client: Client, workflow_id: str, want: int) -> list[dict]: + """Read ``want`` decisions off the workflow's stream from outside it.""" reader = await streams.consumer(client, workflow_id=workflow_id) seen: list[dict] = [] async for record in reader.read(type=dict, topic="decisions"): @@ -47,6 +48,7 @@ async def collect_output(client: Client, workflow_id: str, want: int) -> list[di async def main() -> int: + """Run the demo once and write what happened next to this file.""" out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" out.mkdir(exist_ok=True) target, options = await provider_setup.open() diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index caaa03ffb..cd55ee9d4 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -64,6 +64,7 @@ Consumer, Producer, StreamProvider, + StreamProviderLifecycle, configure, consumer, drain, @@ -89,6 +90,7 @@ "ReadSource", "RecordKind", "StreamProvider", + "StreamProviderLifecycle", "StreamReader", "StreamRecord", "StreamWriter", @@ -154,4 +156,6 @@ def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: # Importing the package registers every provider whose dependencies are # present in this tree. Import order matters: the registry above must exist # before a provider module can register with it. -from temporalio.streams import providers as _providers # noqa: E402,F401 +from temporalio.streams import ( + providers as _providers, # noqa: E402,F401 # pyright: ignore[reportUnusedImport] +) diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py index 24e20ab2f..73114bbdb 100644 --- a/temporalio/streams/_policy.py +++ b/temporalio/streams/_policy.py @@ -26,6 +26,7 @@ class AttemptTracker: """Watches producer attempts on one subscription.""" def __init__(self) -> None: + """Start with no producer seen.""" self._attempts: dict[str, int] = {} def note( diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index a36339a97..18e2bb983 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -21,6 +21,7 @@ "Consumer", "Producer", "StreamProvider", + "StreamProviderLifecycle", "configure", "consumer", "drain", @@ -96,6 +97,9 @@ class StreamProvider(Protocol): outside pair (:meth:`producer`, :meth:`consumer`) runs anywhere and moves framed bytes. A transport-only provider may serve just the outside pair and raise on the workflow side, naming the provider a worker should use. + + A provider whose transport parks something against the running workflow + also implements :class:`StreamProviderLifecycle`. """ name: str @@ -147,21 +151,30 @@ async def consumer( """Open a reader for what ``workflow_id`` publishes.""" ... + +class StreamProviderLifecycle(Protocol): + """The hooks a provider adds when it needs the workflow's own lifetime. + + Separate from :class:`StreamProvider` because most transports need + neither, and a provider is not asked to carry a pair of empty methods to + say so. :func:`prepare` and :func:`drain` call whichever half is present. + """ + def prepare(self) -> None: """Install whatever this provider needs before the workflow runs. - Optional. A provider that serves outside readers through handlers on - the workflow itself has to register them before the first task - completes, or a reader that arrives early finds nothing to talk to. + A provider that serves outside readers through handlers on the + workflow itself has to register them before the first task completes, + or a reader that arrives early finds nothing to talk to. """ ... def drain(self) -> None: """Release anything this provider parked on the workflow's behalf. - Optional. A provider that parks an outside reader against the running - workflow, as the Workflow Streams transport does with its long-poll - update, has to let go before the workflow can return. + A provider that parks an outside reader against the running workflow, + as the Workflow Streams transport does with its long-poll update, has + to let go before the workflow can return. """ ... diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index fb2712350..f7e58ef44 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -138,6 +138,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on ``store``.""" self._store = store self._converter = converter self._topic = topic @@ -147,6 +148,7 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property @@ -158,6 +160,7 @@ def _provider_id(self) -> str: ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last one.""" frames = [] for value in values: frames.append( @@ -179,6 +182,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor(str(offset)) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._topic, kind=RecordKind.FINISH, @@ -205,6 +209,7 @@ class MemoryConsumer: """The outside reader, with the shared supersession rule.""" def __init__(self, store: _MemoryStream, converter: Any) -> None: + """Read whatever ``store`` holds, now and as it grows.""" self._store = store self._converter = converter @@ -215,6 +220,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() offset = int(after.token) + 1 if after.token else 0 while True: @@ -246,6 +252,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one store per stream, so the position is topic-independent count = len(self._store.frames) return Cursor(str(count - 1)) if count else BEGINNING diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 978ef5ca1..0c7818064 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -22,7 +22,7 @@ @pytest.fixture(autouse=True) -def _fresh_memory_provider(): +def _fresh_memory_provider(): # pyright: ignore[reportUnusedFunction] memory.reset() streams.configure(provider="memory") yield From 29cc1cb51ce887c2ab6dd70e0c6014f6d582734e Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:18:02 -0700 Subject: [PATCH 062/831] Made the Redis provider pass the linters. The provider imports nothing from `workflow`, and its producer, consumer and `latest` need the docstrings the doc linter asks every public method for. --- temporalio/streams/providers/redis.py | 13 ++++++++----- tests/streams/test_redis_replay.py | 4 +--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index ec5742bf2..ad5fbcd9c 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -19,11 +19,10 @@ from datetime import timedelta from typing import Any -from temporalio import activity, workflow +from temporalio import activity from temporalio.api.common.v1 import Payload from temporalio.client import Client, WorkflowExecutionStatus from temporalio.contrib.external_workflow_streams import ( - BEGINNING as PROVIDER_BEGINNING, AFTER, ExternalOutputStreamClient, ExternalOutputStreamProducer, @@ -34,6 +33,9 @@ external_output_stream, external_stream, ) +from temporalio.contrib.external_workflow_streams import ( + BEGINNING as PROVIDER_BEGINNING, +) from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -94,6 +96,7 @@ def __init__( client: Client | None = None, workflow_id: str = "", ) -> None: + """Bind this producer to ``topic`` on the external store.""" self._topic = topic self._converter = converter self._stream = stream @@ -181,6 +184,7 @@ class RedisConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, client: Any, converter: Any) -> None: + """Read what ``client`` reaches in the external store.""" self._client = client self._converter = converter @@ -197,9 +201,7 @@ async def read( and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() - boundary = ( - AFTER(Offset(after.token)) if after.token else PROVIDER_BEGINNING - ) + boundary = AFTER(Offset(after.token)) if after.token else PROVIDER_BEGINNING handle = self._client.topic(self._require_topic(topic), type=bytes) async for item in handle.subscribe(after=boundary): cursor = Cursor(str(item.offset)) @@ -223,6 +225,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" tail = await self._client.topic(self._require_topic(topic), type=bytes).tail() if tail.is_beginning: return BEGINNING diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 988b1305d..f47e6937b 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -71,9 +71,7 @@ async def test_query_after_completion_replays_the_final_task(): url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), key_prefix=f"streams-redis-replay-{uuid.uuid4().hex}", ) - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-redis-replay-{uuid.uuid4().hex}" async with Worker( From 89c1a372b76571fa99b7c25d343db3cced0b8527 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:28:32 -0700 Subject: [PATCH 063/831] Gave the external stream test fakes the shapes the real path has. A record only reaches a reader after a provider placed it, so the fake runtime hands out placed records and the reader can name where each one came from. The subscription manager captures the loop it is built on, which is the Worker's, so its fixture has to build it on one. --- .../external_workflow_streams/test_api.py | 21 ++++++++++++++++++- .../test_output_runtime.py | 4 +++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 08d725761..236d0b614 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -30,6 +30,7 @@ ) from temporalio.contrib.external_workflow_streams._manager import PreparedRecord from temporalio.contrib.external_workflow_streams._record import ( + Offset, RecordKind, StreamRecord, ) @@ -58,6 +59,9 @@ def __init__(self) -> None: #: Overrides what `codec_for` hands back, so a test can control when -- #: and whether -- decoding a record succeeds. self.codec: Any = None + #: Offsets handed out by `drain`, so buffered records come back in the + #: read-path shape whatever a test put in. + self._placed = 0 def stream_key(self, stream_name: str) -> StreamKey: return StreamKey("ns", "wf", "first-run", stream_name) @@ -81,7 +85,22 @@ def drain(self, wait_id: int, max_records: int | None = None) -> list[StreamReco ) else: self.buffers[wait_id] = [] - return buffered + # A provider places a record when it appends it, so nothing without an + # offset ever reaches a reader. Place what a test left bare rather than + # let the fake deliver a shape the real path cannot produce. + placed = [] + for record in buffered: + if record.offset is not None: + placed.append(record) + continue + self._placed += 1 + at = record.placed_at(Offset(f"{self._placed:020d}")) + if isinstance(record, PreparedRecord): + at = PreparedRecord.of( + at, record.prepared_payload, record.prepare_error + ) + placed.append(at) + return placed def delivery_budget_remaining(self) -> int: return self.budget diff --git a/tests/contrib/external_workflow_streams/test_output_runtime.py b/tests/contrib/external_workflow_streams/test_output_runtime.py index 049f78a2a..56d0993d2 100644 --- a/tests/contrib/external_workflow_streams/test_output_runtime.py +++ b/tests/contrib/external_workflow_streams/test_output_runtime.py @@ -168,7 +168,9 @@ def backend() -> _OutputMemoryBackend: @pytest.fixture -def runtime(backend: _OutputMemoryBackend) -> WorkflowStreamRuntime: +async def runtime(backend: _OutputMemoryBackend) -> WorkflowStreamRuntime: + # The manager captures the loop it is built on, which in the Worker is the + # Worker's own. A sync fixture has none to capture. manager = StreamSubscriptionManager( backend=backend, notify_ready=_notify, From 97849a8d1aab2f3bc4568c2612e575917223592c Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:38:08 -0700 Subject: [PATCH 064/831] Snapshotted the markers where the abandoned task begins. Every Workflow Task that closes commits its own marker, and empty input activations now close one too, so a baseline read three steps earlier counts markers that belong to tasks this case says nothing about. --- .../external_workflow_streams/test_worker_handoff.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/contrib/external_workflow_streams/test_worker_handoff.py b/tests/contrib/external_workflow_streams/test_worker_handoff.py index 3e52796c0..cf6b212a0 100644 --- a/tests/contrib/external_workflow_streams/test_worker_handoff.py +++ b/tests/contrib/external_workflow_streams/test_worker_handoff.py @@ -704,9 +704,6 @@ async def test_a_finalization_that_cannot_be_answered_writes_no_marker( "no marker committed the first record, so there is no previous " "marker for the retry to replay from", ) - before = markers(await history(handle)) - committed_before = committed_boundary(before[-1], wait_id=1) - marker_before = marker_bytes(before[-1]) # Fed from here, and each record is *followed* to the Workflow rather # than merely published on a schedule. The precondition this case needs @@ -761,6 +758,13 @@ async def test_a_finalization_that_cannot_be_answered_writes_no_marker( "since the last delivery is expected to fit inside" ) + # Read here rather than at the first marker: every Workflow Task that + # closes between the two commits its own marker, and the claim this + # case makes is about the one task that is open right now. + before = markers(await history(handle)) + committed_before = committed_boundary(before[-1], wait_id=1) + marker_before = marker_bytes(before[-1]) + # The Run's entry disappears underneath the finalization, exactly once. original = workflow_worker_impl._handle_external_stream_jobs sabotaged: list[str] = [] From d963173e7af2365b5c43b0ad5965eb9caf69f07c Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:38:26 -0700 Subject: [PATCH 065/831] Added the changelog entry for the shared stream interface. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f1441833..73c8bc320 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,15 @@ to include examples, links to docs, or any other relevant information. ### Added +- **Experimental**: `temporalio.streams` defines one stream interface a workflow + can read, decide on, and write, with a registry that picks the provider when + the worker is built. `temporalio.streams.providers.memory` is the in-memory + reference provider the conformance tests run against, and + `temporalio.streams.providers.redis` serves the same interface over External + Workflow Streams. +- `ExternalStreamSubscription.records()` yields each value with the provider + offset it was read from, for a reader that has to name where it got to. + - Added experimental External Workflow Streams in `temporalio.contrib.external_workflow_streams`. Workflow stream payloads are stored in a configured external backend instead of Temporal History, with a From df741be10d1a099bbbba60303337247ecdcbdfc8 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:45:15 -0700 Subject: [PATCH 066/831] Regenerated the vendored stream protos for protobuf 3. This package has to load on a protobuf 3 runtime, and generated code refuses to load on a runtime older than the one it was built against. The protoc of that generation has no `--pyi_out`, so the stubs come from `mypy-protobuf`, which is what the other generated protos already use. --- scripts/gen_stream_protos.py | 7 +- temporalio/api/streamservice/v1/__init__.py | 16 + .../api/streamservice/v1/message_pb2.py | 90 +- .../api/streamservice/v1/message_pb2.pyi | 216 +- .../api/streamservice/v1/message_pb2_grpc.py | 24 - .../api/streamservice/v1/message_pb2_grpc.pyi | 4 + .../streamservice/v1/request_response_pb2.py | 972 +++++++- .../streamservice/v1/request_response_pb2.pyi | 2198 +++++++++++++---- .../v1/request_response_pb2_grpc.py | 24 - .../v1/request_response_pb2_grpc.pyi | 4 + .../api/streamservice/v1/service_pb2.py | 37 +- .../api/streamservice/v1/service_pb2.pyi | 13 +- .../api/streamservice/v1/service_pb2_grpc.py | 146 +- .../api/streamservice/v1/service_pb2_grpc.pyi | 195 ++ .../api/streamservice/v1/stream_state_pb2.py | 146 +- .../api/streamservice/v1/stream_state_pb2.pyi | 556 +++-- .../streamservice/v1/stream_state_pb2_grpc.py | 24 - .../v1/stream_state_pb2_grpc.pyi | 4 + temporalio/client_stream.py | 4 +- 19 files changed, 3550 insertions(+), 1130 deletions(-) create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index f57ff6177..6b6487294 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -9,7 +9,9 @@ Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf runtime this package has to load on. Generated code refuses to load on a runtime older than the one it was built against, and these modules end up in -applications that pin protobuf themselves. +applications that pin protobuf themselves. The stubs come from +``mypy-protobuf`` rather than protoc's own ``--pyi_out``, which that +generation of protoc does not have. Two rewrites make the copies compile against this SDK. The server's own routing and API-category options are dropped, because they mean nothing to a @@ -119,8 +121,9 @@ def main() -> None: f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", - f"--pyi_out={out}", f"--grpc_python_out={out}", + f"--mypy_out={out}", + f"--mypy_grpc_out={out}", *targets, ], check=True, diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 52dd65b7c..ce6edf894 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -19,6 +19,10 @@ AddWorkflowMessagesInput, AddWorkflowMessagesRequest, AddWorkflowMessagesResponse, + AdvanceConsumerHeadInput, + AdvanceConsumerHeadOutput, + AdvanceConsumerHeadRequest, + AdvanceConsumerHeadResponse, CloseStreamInput, CloseStreamOutput, CloseStreamRequest, @@ -53,6 +57,10 @@ PollWorkflowMessagesInput, PollWorkflowMessagesRequest, PollWorkflowMessagesResponse, + RegisterStreamConsumerInput, + RegisterStreamConsumerOutput, + RegisterStreamConsumerRequest, + RegisterStreamConsumerResponse, StreamListEntry, SubscribeWorkflowInput, SubscribeWorkflowOutput, @@ -79,6 +87,10 @@ "AddWorkflowMessagesInput", "AddWorkflowMessagesRequest", "AddWorkflowMessagesResponse", + "AdvanceConsumerHeadInput", + "AdvanceConsumerHeadOutput", + "AdvanceConsumerHeadRequest", + "AdvanceConsumerHeadResponse", "CloseStreamInput", "CloseStreamOutput", "CloseStreamRequest", @@ -115,6 +127,10 @@ "PollWorkflowMessagesRequest", "PollWorkflowMessagesResponse", "ProducerCursor", + "RegisterStreamConsumerInput", + "RegisterStreamConsumerOutput", + "RegisterStreamConsumerRequest", + "RegisterStreamConsumerResponse", "STREAM_MESSAGE_KIND_DATA", "STREAM_MESSAGE_KIND_FLUSH", "STREAM_MESSAGE_KIND_UNSPECIFIED", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index 9e30bd9a8..3bbd8718e 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -1,24 +1,15 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/message.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/message.proto", -) +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -32,26 +23,61 @@ b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamMessageKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamMessageKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamMessageKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 + STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 + STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 + """Producer signalling a delivery boundary. Carries no body and consumes an + offset like any other message. A consumer uses it to end a turn without + waiting out an idle timeout. + """ + +class StreamMessageKind( + _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper +): ... + +STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 +STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 +STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 +"""Producer signalling a delivery boundary. Carries no body and consumes an +offset like any other message. A consumer uses it to end a turn without +waiting out an idle timeout. +""" +global___StreamMessageKind = StreamMessageKind + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], ) -> None: ... - BODY_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - TOPIC_FIELD_NUMBER: _ClassVar[int] - TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - KIND_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - body: _message_pb2.Payload - metadata: _containers.MessageMap[str, _message_pb2.Payload] - topic: str - topic_sequence: int - kind: StreamMessageKind - offset: int + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance. The server does not populate this today.""" + topic: builtins.str + topic_sequence: builtins.int + """Position within this topic. The global offset orders the whole stream; + this lets a consumer reason about one topic without decoding the rest. + """ + kind: global___StreamMessageKind.ValueType + offset: builtins.int + """Position in the whole stream, set on read and never stored. A consumer + that resumes at message granularity needs it, and a topic-filtered read + leaves gaps that make it underivable from the response alone. + """ def __init__( self, - body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., - metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., - topic: _Optional[str] = ..., - topic_sequence: _Optional[int] = ..., - kind: _Optional[_Union[StreamMessageKind, str]] = ..., - offset: _Optional[int] = ..., + *, + body: temporal.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + kind: global___StreamMessageKind.ValueType = ..., + offset: builtins.int = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "offset", + b"offset", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... + +global___StreamMessage = StreamMessage -class StreamMessageBatch(_message.Message): - __slots__ = ("messages",) - MESSAGES_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] +class StreamMessageBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one log node. The server stores + this serialized and opaque; it decodes only to trim a partial first page or + to apply a topic filter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... def __init__( - self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ... + self, + *, + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["messages", b"messages"] ) -> None: ... + +global___StreamMessageBatch = StreamMessageBatch diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index 6b6c2372a..bf947056a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.pyi b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 7e8dbe3e4..b813e2dfc 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/request_response.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/request_response.proto", -) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -35,119 +25,857 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... - -class CreateStreamOutput(_message.Message): - __slots__ = ("run_id",) - RUN_ID_FIELD_NUMBER: _ClassVar[int] - run_id: str - def __init__(self, run_id: _Optional[str] = ...) -> None: ... - -class AddMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "stream_id", - "run_id", - "messages", - "producer_id", - "sequence", - "expected_offset", - "use_expected_offset", - "owner_epoch", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - expected_offset: int - use_expected_offset: bool - owner_epoch: int - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - producer_id: _Optional[str] = ..., - sequence: _Optional[int] = ..., - expected_offset: _Optional[int] = ..., - use_expected_offset: bool = ..., - owner_epoch: _Optional[int] = ..., - ) -> None: ... - -class AddMessagesOutput(_message.Message): - __slots__ = ("first_offset", "next_offset", "count", "deduplicated") - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] - first_offset: int - next_offset: int - count: int - deduplicated: bool - def __init__( - self, - first_offset: _Optional[int] = ..., - next_offset: _Optional[int] = ..., - count: _Optional[int] = ..., - deduplicated: bool = ..., - ) -> None: ... - -class FinishWritingInput(_message.Message): - __slots__ = ("namespace", "stream_id", "producer_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - producer_id: str - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - producer_id: _Optional[str] = ..., - ) -> None: ... - -class FinishWritingOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class SubscribeWorkflowInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - stream_id: str - start_offset: int - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - start_offset: _Optional[int] = ..., - ) -> None: ... - -class SubscribeWorkflowOutput(_message.Message): - __slots__ = ("start_offset",) - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - start_offset: int - def __init__(self, start_offset: _Optional[int] = ...) -> None: ... - -class PollMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "stream_id", - "run_id", - "from_offset", - "max_messages", - "topics", - "wait_new_messages", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - from_offset: _Optional[int] = ..., - max_messages: _Optional[int] = ..., - topics: _Optional[_Iterable[str]] = ..., - wait_new_messages: bool = ..., - ) -> None: ... - -class PollMessagesOutput(_message.Message): - __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") - MESSAGES_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - next_offset: int - head_offset: int - closed: bool - close_reason: _message_pb2_1.Payload - def __init__( - self, - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - next_offset: _Optional[int] = ..., - head_offset: _Optional[int] = ..., - closed: bool = ..., - close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., - ) -> None: ... - -class DescribeStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__( - self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... - ) -> None: ... - -class PollWorkflowMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "workflow_id", - "stream_name", - "from_offset", - "max_messages", - "topics", - "wait_new_messages", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - from_offset: _Optional[int] = ..., - max_messages: _Optional[int] = ..., - topics: _Optional[_Iterable[str]] = ..., - wait_new_messages: bool = ..., - ) -> None: ... - -class DescribeWorkflowStreamInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - ) -> None: ... - -class AddWorkflowMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "workflow_id", - "stream_name", - "messages", - "producer_id", - "sequence", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - producer_id: _Optional[str] = ..., - sequence: _Optional[int] = ..., - ) -> None: ... - -class DescribeStreamOutput(_message.Message): - __slots__ = ("state",) - STATE_FIELD_NUMBER: _ClassVar[int] - state: _stream_state_pb2.StreamState - def __init__( - self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ... - ) -> None: ... - -class CloseStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "reason") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - REASON_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - reason: _message_pb2_1.Payload - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 +import temporalio.api.streamservice.v1.message_pb2 +import temporalio.api.streamservice.v1.stream_state_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CreateStreamInput(google.protobuf.message.Message): + """The frontend-facing shapes are defined here rather than in the public API + because streams have no public API yet. Keeping them in a nested + frontend_request mirrors the other CHASM libraries, so promoting them later + is a package move rather than a redesign. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def lifecycle( + self, + ) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + lifecycle: temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["lifecycle", b"lifecycle"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "lifecycle", + b"lifecycle", + "namespace", + b"namespace", + "stream_id", + b"stream_id", + ], ) -> None: ... -class CloseStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___CreateStreamInput = CreateStreamInput -class TruncateStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "new_base_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - new_base_offset: int +class CreateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + run_id: builtins.str def __init__( self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - new_base_offset: _Optional[int] = ..., + *, + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["run_id", b"run_id"] ) -> None: ... -class TruncateStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___CreateStreamOutput = CreateStreamOutput + +class AddMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class DeleteStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + USE_EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional. Supplying it skips resolving the stream's current run, which is + a persistence lookup on every call. CreateStream returns it. + """ + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Idempotency, all optional. Supply a producer identity and sequence, or an + expected offset, or neither and accept at-least-once. + """ + sequence: builtins.int + expected_offset: builtins.int + """Guarded by use_expected_offset because proto3 optional is not supported + by this repo's helper generator. + """ + use_expected_offset: builtins.bool + owner_epoch: builtins.int def __init__( - self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + expected_offset: builtins.int = ..., + use_expected_offset: builtins.bool = ..., + owner_epoch: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "expected_offset", + b"expected_offset", + "messages", + b"messages", + "namespace", + b"namespace", + "owner_epoch", + b"owner_epoch", + "producer_id", + b"producer_id", + "run_id", + b"run_id", + "sequence", + b"sequence", + "stream_id", + b"stream_id", + "use_expected_offset", + b"use_expected_offset", + ], ) -> None: ... -class DeleteStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___AddMessagesInput = AddMessagesInput + +class AddMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class CreateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CreateStreamInput + FIRST_OFFSET_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + DEDUPLICATED_FIELD_NUMBER: builtins.int + first_offset: builtins.int + next_offset: builtins.int + count: builtins.int + deduplicated: builtins.bool + """True when a retry matched a recorded sequence and nothing was appended.""" def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ..., + *, + first_offset: builtins.int = ..., + next_offset: builtins.int = ..., + count: builtins.int = ..., + deduplicated: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "count", + b"count", + "deduplicated", + b"deduplicated", + "first_offset", + b"first_offset", + "next_offset", + b"next_offset", + ], ) -> None: ... -class CreateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CreateStreamOutput +global___AddMessagesOutput = AddMessagesOutput + +class FinishWritingInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + producer_id: builtins.str def __init__( - self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + producer_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "stream_id", + b"stream_id", + ], ) -> None: ... -class AddMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddMessagesInput +global___FinishWritingInput = FinishWritingInput + +class FinishWritingOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ..., ) -> None: ... -class AddMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput +global___FinishWritingOutput = FinishWritingOutput + +class SubscribeWorkflowInput(google.protobuf.message.Message): + """Registers a Workflow as a consumer of a stream it owns. The cursor lands in + the Workflow's own state, so from then on each of its Workflow Tasks carries + the next range and records what it consumed. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Name of the stream within the Workflow, for a stream it owns.""" + stream_id: builtins.str + """Id of a standalone stream in another execution. Exactly one of this and + stream_name is set. + """ + start_offset: builtins.int + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. + """ def __init__( - self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___SubscribeWorkflowInput = SubscribeWorkflowInput -class FinishWritingRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: FinishWritingInput +class SubscribeWorkflowOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + start_offset: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ..., + *, + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["start_offset", b"start_offset"] ) -> None: ... -class FinishWritingResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: FinishWritingOutput +global___SubscribeWorkflowOutput = SubscribeWorkflowOutput + +class PollMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional, as on AddMessagesInput.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters by exact topic. Offsets are assigned over the unfiltered stream, so + next_offset advances past filtered-out messages too. + """ + wait_new_messages: builtins.bool + """When set and the reader is caught up, block until something arrives, the + stream closes, or the server's long-poll timeout elapses. A timeout returns + an empty response rather than an error, so the caller simply polls again. + """ def __init__( - self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + ], + ) -> None: ... + +global___PollMessagesInput = PollMessagesInput -class SubscribeWorkflowRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: SubscribeWorkflowInput +class PollMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + next_offset: builtins.int + head_offset: builtins.int + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ..., + *, + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + next_offset: builtins.int = ..., + head_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "closed", + b"closed", + "head_offset", + b"head_offset", + "messages", + b"messages", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___PollMessagesOutput = PollMessagesOutput + +class DescribeStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class SubscribeWorkflowResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: SubscribeWorkflowOutput + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str def __init__( self, - frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DescribeStreamInput = DescribeStreamInput -class PollMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollMessagesInput +class PollWorkflowMessagesInput(google.protobuf.message.Message): + """A stream a workflow owns lives inside that workflow's execution, so it has + no standalone id to address it by. It is named by its owner and its name + instead, and routed on the owner. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters as on PollMessagesInput.""" + wait_new_messages: builtins.bool def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___PollWorkflowMessagesInput = PollWorkflowMessagesInput -class PollMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput +class DescribeWorkflowStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str def __init__( - self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], ) -> None: ... -class DescribeStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeStreamInput +global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput + +class AddWorkflowMessagesInput(google.protobuf.message.Message): + """Appending to a stream a workflow owns, from outside that workflow. The + workflow's own publishes ride its Workflow Task instead. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Optional idempotency, as on AddMessagesInput.""" + sequence: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", + b"messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], ) -> None: ... -class DescribeStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput +global___AddWorkflowMessagesInput = AddWorkflowMessagesInput + +class DescribeStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATE_FIELD_NUMBER: builtins.int + @property + def state(self) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamState: ... def __init__( - self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + self, + *, + state: temporalio.api.streamservice.v1.stream_state_pb2.StreamState + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["state", b"state"] ) -> None: ... -class PollWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollWorkflowMessagesInput +global___DescribeStreamOutput = DescribeStreamOutput + +class CloseStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["reason", b"reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "reason", b"reason", "stream_id", b"stream_id" + ], ) -> None: ... -class PollWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput +global___CloseStreamInput = CloseStreamInput + +class CloseStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( - self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + self, ) -> None: ... -class DescribeWorkflowStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeWorkflowStreamInput +global___CloseStreamOutput = CloseStreamOutput + +class TruncateStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + NEW_BASE_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + new_base_offset: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[ - _Union[DescribeWorkflowStreamInput, _Mapping] - ] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + new_base_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "new_base_offset", + b"new_base_offset", + "stream_id", + b"stream_id", + ], ) -> None: ... -class DescribeWorkflowStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput +global___TruncateStreamInput = TruncateStreamInput + +class TruncateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( - self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + self, ) -> None: ... -class AddWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddWorkflowMessagesInput +global___TruncateStreamOutput = TruncateStreamOutput + +class DeleteStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DeleteStreamInput = DeleteStreamInput + +class DeleteStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class AddWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput def __init__( - self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + self, ) -> None: ... -class CloseStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CloseStreamInput +global___DeleteStreamOutput = DeleteStreamOutput + +class CreateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CreateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CreateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CreateStreamRequest = CreateStreamRequest + +class CreateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CreateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CreateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CreateStreamResponse = CreateStreamResponse + +class AddMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddMessagesRequest = AddMessagesRequest + +class AddMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddMessagesResponse = AddMessagesResponse + +class FinishWritingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___FinishWritingInput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___FinishWritingInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class CloseStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CloseStreamOutput +global___FinishWritingRequest = FinishWritingRequest + +class FinishWritingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___FinishWritingOutput: ... def __init__( - self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ... + self, + *, + frontend_response: global___FinishWritingOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class TruncateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: TruncateStreamInput +global___FinishWritingResponse = FinishWritingResponse + +class SubscribeWorkflowRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___SubscribeWorkflowInput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___SubscribeWorkflowInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class TruncateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: TruncateStreamOutput +global___SubscribeWorkflowRequest = SubscribeWorkflowRequest + +class SubscribeWorkflowResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___SubscribeWorkflowOutput: ... def __init__( - self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ... + self, + *, + frontend_response: global___SubscribeWorkflowOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsInput(_message.Message): - __slots__ = ("namespace", "page_size", "next_page_token", "query") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - QUERY_FIELD_NUMBER: _ClassVar[int] - namespace: str - page_size: int - next_page_token: bytes - query: str +global___SubscribeWorkflowResponse = SubscribeWorkflowResponse + +class PollMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollMessagesInput: ... def __init__( self, - namespace: _Optional[str] = ..., - page_size: _Optional[int] = ..., - next_page_token: _Optional[bytes] = ..., - query: _Optional[str] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class StreamListEntry(_message.Message): - __slots__ = ("stream_id", "run_id") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - stream_id: str - run_id: str +global___PollMessagesRequest = PollMessagesRequest + +class PollMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... def __init__( - self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ... + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsOutput(_message.Message): - __slots__ = ("streams", "next_page_token") - STREAMS_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] - next_page_token: bytes +global___PollMessagesResponse = PollMessagesResponse + +class DescribeStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeStreamInput: ... def __init__( self, - streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., - next_page_token: _Optional[bytes] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class ListStreamsRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: ListStreamsInput +global___DescribeStreamRequest = DescribeStreamRequest + +class DescribeStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ..., + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: ListStreamsOutput +global___DescribeStreamResponse = DescribeStreamResponse + +class PollWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollWorkflowMessagesInput: ... def __init__( - self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ... + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class DeleteStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DeleteStreamInput +global___PollWorkflowMessagesRequest = PollWorkflowMessagesRequest + +class PollWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ..., + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class DeleteStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DeleteStreamOutput +global___PollWorkflowMessagesResponse = PollWorkflowMessagesResponse + +class DescribeWorkflowStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeWorkflowStreamInput: ... def __init__( - self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ... + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeWorkflowStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... + +global___DescribeWorkflowStreamRequest = DescribeWorkflowStreamRequest + +class DescribeWorkflowStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeWorkflowStreamResponse = DescribeWorkflowStreamResponse + +class RegisterStreamConsumerInput(google.protobuf.message.Message): + """Registering a consumer on a stream in another execution. Split out from + SubscribeWorkflow because the two halves live on different shards: the pin + goes on the stream, the cursor goes on the consuming workflow, and a handler + can only reach the shard it was routed to. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + consumer_workflow_id: builtins.str + """The workflow that will consume, which names the pin.""" + start_offset: builtins.int + """Negative means from wherever the stream is when the pin is taken. Resolved + here, where the frontier is, and returned so the cursor records a fact. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + consumer_workflow_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_workflow_id", + b"consumer_workflow_id", + "namespace", + b"namespace", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___RegisterStreamConsumerInput = RegisterStreamConsumerInput + +class RegisterStreamConsumerOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + start_offset: builtins.int + collection_id: builtins.str + """What the consumer needs to address the log, all decided by the stream.""" + bucket_size: builtins.int + known_head: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + known_head: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "known_head", + b"known_head", + "start_offset", + b"start_offset", + ], + ) -> None: ... + +global___RegisterStreamConsumerOutput = RegisterStreamConsumerOutput + +class AdvanceConsumerHeadInput(google.protobuf.message.Message): + """Telling one consumer that the frontier moved. Routed to the consumer, which + is not where the stream lives. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """The run that subscribed. A successor from continue-as-new holds no cursor + for this stream, so pushing the frontier at it would land nowhere. + """ + stream_id: builtins.str + head_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_id: builtins.str = ..., + head_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "head_offset", + b"head_offset", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_id", + b"stream_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput + +class AdvanceConsumerHeadOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput + +class AddWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddWorkflowMessagesRequest = AddWorkflowMessagesRequest + +class AddWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddWorkflowMessagesResponse = AddWorkflowMessagesResponse + +class RegisterStreamConsumerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___RegisterStreamConsumerInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___RegisterStreamConsumerInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___RegisterStreamConsumerRequest = RegisterStreamConsumerRequest + +class RegisterStreamConsumerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___RegisterStreamConsumerOutput: ... + def __init__( + self, + *, + frontend_response: global___RegisterStreamConsumerOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___RegisterStreamConsumerResponse = RegisterStreamConsumerResponse + +class AdvanceConsumerHeadRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AdvanceConsumerHeadInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AdvanceConsumerHeadInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AdvanceConsumerHeadRequest = AdvanceConsumerHeadRequest + +class AdvanceConsumerHeadResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AdvanceConsumerHeadOutput: ... + def __init__( + self, + *, + frontend_response: global___AdvanceConsumerHeadOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AdvanceConsumerHeadResponse = AdvanceConsumerHeadResponse + +class CloseStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CloseStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CloseStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CloseStreamRequest = CloseStreamRequest + +class CloseStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CloseStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CloseStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CloseStreamResponse = CloseStreamResponse + +class TruncateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___TruncateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___TruncateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___TruncateStreamRequest = TruncateStreamRequest + +class TruncateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___TruncateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___TruncateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___TruncateStreamResponse = TruncateStreamResponse + +class ListStreamsInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + QUERY_FIELD_NUMBER: builtins.int + namespace: builtins.str + page_size: builtins.int + next_page_token: builtins.bytes + query: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + page_size: builtins.int = ..., + next_page_token: builtins.bytes = ..., + query: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "next_page_token", + b"next_page_token", + "page_size", + b"page_size", + "query", + b"query", + ], + ) -> None: ... + +global___ListStreamsInput = ListStreamsInput + +class StreamListEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___StreamListEntry = StreamListEntry + +class ListStreamsOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAMS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + @property + def streams( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamListEntry + ]: ... + next_page_token: builtins.bytes + def __init__( + self, + *, + streams: collections.abc.Iterable[global___StreamListEntry] | None = ..., + next_page_token: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "next_page_token", b"next_page_token", "streams", b"streams" + ], + ) -> None: ... + +global___ListStreamsOutput = ListStreamsOutput + +class ListStreamsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___ListStreamsInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___ListStreamsInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___ListStreamsRequest = ListStreamsRequest + +class ListStreamsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___ListStreamsOutput: ... + def __init__( + self, + *, + frontend_response: global___ListStreamsOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___ListStreamsResponse = ListStreamsResponse + +class DeleteStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DeleteStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DeleteStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DeleteStreamRequest = DeleteStreamRequest + +class DeleteStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DeleteStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DeleteStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DeleteStreamResponse = DeleteStreamResponse diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index c8c70bb79..bf947056a 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index d5de1d5f8..432abfc5c 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/service.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/service.proto", -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -29,21 +19,16 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16RegisterStreamConsumer\x12H.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerResponse"\x00\x12\xa6\x01\n\x13\x41\x64vanceConsumerHead\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) - class StreamServiceStub(object): """Missing associated documentation comment in .proto file.""" @@ -45,79 +21,76 @@ def __init__(self, channel): "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True, ) self.AddMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True, ) self.FinishWriting = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True, ) self.SubscribeWorkflow = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True, ) self.PollMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True, ) self.DescribeStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True, ) self.PollWorkflowMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True, ) self.DescribeWorkflowStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True, ) self.AddWorkflowMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True, + ) + self.RegisterStreamConsumer = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + ) + self.AdvanceConsumerHead = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, ) self.CloseStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True, ) self.TruncateStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True, ) self.ListStreams = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True, ) self.DeleteStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True, ) @@ -178,6 +151,21 @@ def AddWorkflowMessages(self, request, context): context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") + def RegisterStreamConsumer(self, request, context): + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def AdvanceConsumerHead(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -252,6 +240,16 @@ def add_StreamServiceServicer_to_server(servicer, server): request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, ), + "RegisterStreamConsumer": grpc.unary_unary_rpc_method_handler( + servicer.RegisterStreamConsumer, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.SerializeToString, + ), + "AdvanceConsumerHead": grpc.unary_unary_rpc_method_handler( + servicer.AdvanceConsumerHead, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.SerializeToString, + ), "CloseStream": grpc.unary_unary_rpc_method_handler( servicer.CloseStream, request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, @@ -277,9 +275,6 @@ def add_StreamServiceServicer_to_server(servicer, server): "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers( - "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers - ) # This class is part of an EXPERIMENTAL API. @@ -313,7 +308,6 @@ def CreateStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -343,7 +337,6 @@ def AddMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -373,7 +366,6 @@ def FinishWriting( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -403,7 +395,6 @@ def SubscribeWorkflow( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -433,7 +424,6 @@ def PollMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -463,7 +453,6 @@ def DescribeStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -493,7 +482,6 @@ def PollWorkflowMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -523,7 +511,6 @@ def DescribeWorkflowStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -553,7 +540,64 @@ def AddWorkflowMessages( wait_for_ready, timeout, metadata, - _registered_method=True, + ) + + @staticmethod + def RegisterStreamConsumer( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def AdvanceConsumerHead( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, ) @staticmethod @@ -583,7 +627,6 @@ def CloseStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -613,7 +656,6 @@ def TruncateStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -643,7 +685,6 @@ def ListStreams( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -673,5 +714,4 @@ def DeleteStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi new file mode 100644 index 000000000..1530074ec --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi @@ -0,0 +1,195 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import abc + +import grpc + +import temporalio.api.streamservice.v1.request_response_pb2 + +class StreamServiceStub: + def __init__(self, channel: grpc.Channel) -> None: ... + CreateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse, + ] + AddMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse, + ] + FinishWriting: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse, + ] + SubscribeWorkflow: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse, + ] + PollMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse, + ] + DescribeStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse, + ] + PollWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, + ] + """Routed on the owner, because the stream it reads has no id of its own.""" + DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, + ] + AddWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse, + ] + RegisterStreamConsumer: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse, + ] + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + AdvanceConsumerHead: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse, + ] + CloseStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse, + ] + TruncateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse, + ] + ListStreams: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse, + ] + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + DeleteStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse, + ] + +class StreamServiceServicer(metaclass=abc.ABCMeta): + @abc.abstractmethod + def CreateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse: ... + @abc.abstractmethod + def AddMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse: ... + @abc.abstractmethod + def FinishWriting( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse: ... + @abc.abstractmethod + def SubscribeWorkflow( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse + ): ... + @abc.abstractmethod + def PollMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse: ... + @abc.abstractmethod + def DescribeStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse + ): ... + @abc.abstractmethod + def PollWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: + """Routed on the owner, because the stream it reads has no id of its own.""" + @abc.abstractmethod + def DescribeWorkflowStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse: ... + @abc.abstractmethod + def AddWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse + ): ... + @abc.abstractmethod + def RegisterStreamConsumer( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse: + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + @abc.abstractmethod + def AdvanceConsumerHead( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse + ): ... + @abc.abstractmethod + def CloseStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse: ... + @abc.abstractmethod + def TruncateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse + ): ... + @abc.abstractmethod + def ListStreams( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse: + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + @abc.abstractmethod + def DeleteStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse: ... + +def add_StreamServiceServicer_to_server( + servicer: StreamServiceServicer, server: grpc.Server +) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 3fe850a2a..2ce5a0451 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/stream_state.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/stream_state.proto", -) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -32,37 +22,113 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamState(google.protobuf.message.Message): + """Size is O(producers + consumers), never O(messages). Payload bytes live in + the log, not here, which is what keeps this off the CHASM partial-read path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class ProducersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ProducerCursor: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[ProducerCursor, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: global___ProducerCursor | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + class ConsumersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor - class ConsumersEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: ConsumerCursor + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ConsumerCursor: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[ConsumerCursor, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: global___ConsumerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], ) -> None: ... - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCERS_FIELD_NUMBER: _ClassVar[int] - CONSUMERS_FIELD_NUMBER: _ClassVar[int] - LIFECYCLE_FIELD_NUMBER: _ClassVar[int] - REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] - head_offset: int - base_offset: int - last_txn_id: int - closed: bool - close_reason: _message_pb2.Payload - owner_epoch: int - bucket_size: int - collection_id: str - producers: _containers.MessageMap[str, ProducerCursor] - consumers: _containers.MessageMap[str, ConsumerCursor] - lifecycle: StreamLifecycle - redirect_run_id: str - close_time: _timestamp_pb2.Timestamp + HEAD_OFFSET_FIELD_NUMBER: builtins.int + BASE_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + PRODUCERS_FIELD_NUMBER: builtins.int + CONSUMERS_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + REDIRECT_RUN_ID_FIELD_NUMBER: builtins.int + CLOSE_TIME_FIELD_NUMBER: builtins.int + head_offset: builtins.int + """Visibility frontier. Readers never observe an offset at or past this.""" + base_offset: builtins.int + """Truncation floor. Offsets below this are gone.""" + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + owner_epoch: builtins.int + """Bumped on ownership change so a stale producer's write fails.""" + bucket_size: builtins.int + """Immutable once set. Offsets roll to a new log tree every bucket_size so no + single storage partition grows with the stream. + """ + collection_id: builtins.str + """Identity of the log this stream writes to. Bucket trees are derived from + it, so there is no per-bucket index to store. + """ + @property + def producers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ProducerCursor + ]: ... + @property + def consumers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ConsumerCursor + ]: ... + @property + def lifecycle(self) -> global___StreamLifecycle: ... + redirect_run_id: builtins.str + """Set when a successor run takes ownership, so an in-flight poll can follow + the chain instead of stalling on a superseded run. + """ + @property + def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: + """Wall-clock close time, used to schedule retention deletion.""" def __init__( self, - head_offset: _Optional[int] = ..., - base_offset: _Optional[int] = ..., - last_txn_id: _Optional[int] = ..., - closed: bool = ..., - close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., - owner_epoch: _Optional[int] = ..., - bucket_size: _Optional[int] = ..., - collection_id: _Optional[str] = ..., - producers: _Optional[_Mapping[str, ProducerCursor]] = ..., - consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., - lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., - redirect_run_id: _Optional[str] = ..., - close_time: _Optional[ - _Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping] - ] = ..., + *, + head_offset: builtins.int = ..., + base_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + owner_epoch: builtins.int = ..., + bucket_size: builtins.int = ..., + collection_id: builtins.str = ..., + producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] + | None = ..., + consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] + | None = ..., + lifecycle: global___StreamLifecycle | None = ..., + redirect_run_id: builtins.str = ..., + close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "lifecycle", + b"lifecycle", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "base_offset", + b"base_offset", + "bucket_size", + b"bucket_size", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "closed", + b"closed", + "collection_id", + b"collection_id", + "consumers", + b"consumers", + "head_offset", + b"head_offset", + "lifecycle", + b"lifecycle", + "owner_epoch", + b"owner_epoch", + "producers", + b"producers", + "redirect_run_id", + b"redirect_run_id", + ], ) -> None: ... -class ProducerCursor(_message.Message): - __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") - SEQ_FIELD_NUMBER: _ClassVar[int] - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] - FENCED_FIELD_NUMBER: _ClassVar[int] - seq: int - first_offset: int - count: int - content_hash: bytes - fenced: bool +global___StreamState = StreamState + +class ProducerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + CONTENT_HASH_FIELD_NUMBER: builtins.int + FENCED_FIELD_NUMBER: builtins.int + seq: builtins.int + first_offset: builtins.int + count: builtins.int + content_hash: builtins.bytes + """Distinguishes a genuine retry from a client reusing a sequence with + different content, which must be rejected rather than deduplicated. + """ + fenced: builtins.bool + """Set by FinishWriting. Ends this producer's writes without closing the + stream for anyone else. + """ def __init__( self, - seq: _Optional[int] = ..., - first_offset: _Optional[int] = ..., - count: _Optional[int] = ..., - content_hash: _Optional[bytes] = ..., - fenced: bool = ..., + *, + seq: builtins.int = ..., + first_offset: builtins.int = ..., + count: builtins.int = ..., + content_hash: builtins.bytes = ..., + fenced: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "content_hash", + b"content_hash", + "count", + b"count", + "fenced", + b"fenced", + "first_offset", + b"first_offset", + "seq", + b"seq", + ], + ) -> None: ... + +global___ProducerCursor = ProducerCursor -class ConsumerCursor(_message.Message): - __slots__ = ("workflow_id", "run_id", "offset", "active", "external") - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - ACTIVE_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - workflow_id: str - run_id: str - offset: int - active: bool - external: bool +class ConsumerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + ACTIVE_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + REPLAY_FLOOR_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + offset: builtins.int + """How far this consumer has read. Used to decide whether it needs waking, + not to decide what the stream may drop. + """ + active: builtins.bool + external: builtins.bool + """Set when the consumer is a workflow in another execution, which is the + only case that has to be told the frontier moved. A workflow consuming a + stream it owns sees that while closing its own transaction. + """ + replay_floor: builtins.int + """The oldest offset this consumer's History still depends on. + + It is where the subscription started, not where it has read to. A range + this consumer already consumed is recorded in its History and has to be + re-readable for the workflow to replay, so bytes below the read position + are exactly the ones a replay needs most. It stays put while the consumer + is active and is released when it deregisters. + """ def __init__( self, - workflow_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - offset: _Optional[int] = ..., - active: bool = ..., - external: bool = ..., + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + offset: builtins.int = ..., + active: builtins.bool = ..., + external: builtins.bool = ..., + replay_floor: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "active", + b"active", + "external", + b"external", + "offset", + b"offset", + "replay_floor", + b"replay_floor", + "run_id", + b"run_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___ConsumerCursor = ConsumerCursor -class WorkflowStreamCursor(_message.Message): - __slots__ = ( - "stream_id", - "collection_id", - "bucket_size", - "offset", - "known_head", - "external", - "pending_from", - "pending_to", - "has_pending", - ) - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - PENDING_FROM_FIELD_NUMBER: _ClassVar[int] - PENDING_TO_FIELD_NUMBER: _ClassVar[int] - HAS_PENDING_FIELD_NUMBER: _ClassVar[int] - stream_id: str - collection_id: str - bucket_size: int - offset: int - known_head: int - external: bool - pending_from: int - pending_to: int - has_pending: bool +class WorkflowStreamCursor(google.protobuf.message.Message): + """A consuming Workflow's position in a stream. This lives in the consuming + Workflow's own state rather than on the stream, so advancing it commits in + the same transaction as the WorkflowTaskCompleted event that records the + range. Keeping it on the stream would make the advance a cross-execution + write, and a crash between the two would either redeliver or skip. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + PENDING_FROM_FIELD_NUMBER: builtins.int + PENDING_TO_FIELD_NUMBER: builtins.int + HAS_PENDING_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + collection_id: builtins.str + """Enough to address the log without reading the stream component first.""" + bucket_size: builtins.int + offset: builtins.int + """Next offset to deliver.""" + known_head: builtins.int + """The stream's frontier as of the last delivery. A workflow consuming a + stream in another execution cannot read the real frontier while closing its + own transaction, so this is what tells it a capped slice left more behind. + """ + external: builtins.bool + """Set when the stream lives in another execution, which decides whether the + frontier is read locally or taken from known_head. + """ + pending_from: builtins.int + """The range attached to the Workflow Task currently in flight. Recorded on + the event that closes that task, then folded into offset. An empty range + is still recorded: a task where the subscription saw nothing is a fact + replay has to reproduce. + """ + pending_to: builtins.int + has_pending: builtins.bool + start_offset: builtins.int + """Where this subscription began reading. Retained separately from offset, + which advances, because replay has to tell "committed nothing yet" apart + from "the events recording what was committed are not in this page". + """ def __init__( self, - stream_id: _Optional[str] = ..., - collection_id: _Optional[str] = ..., - bucket_size: _Optional[int] = ..., - offset: _Optional[int] = ..., - known_head: _Optional[int] = ..., - external: bool = ..., - pending_from: _Optional[int] = ..., - pending_to: _Optional[int] = ..., - has_pending: bool = ..., + *, + stream_id: builtins.str = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + offset: builtins.int = ..., + known_head: builtins.int = ..., + external: builtins.bool = ..., + pending_from: builtins.int = ..., + pending_to: builtins.int = ..., + has_pending: builtins.bool = ..., + start_offset: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "external", + b"external", + "has_pending", + b"has_pending", + "known_head", + b"known_head", + "offset", + b"offset", + "pending_from", + b"pending_from", + "pending_to", + b"pending_to", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___WorkflowStreamCursor = WorkflowStreamCursor -class StreamLifecycle(_message.Message): - __slots__ = ("retention", "max_items") - RETENTION_FIELD_NUMBER: _ClassVar[int] - MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] - retention: _duration_pb2.Duration - max_items: int +class StreamLifecycle(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RETENTION_FIELD_NUMBER: builtins.int + MAX_ITEMS_FIELD_NUMBER: builtins.int + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a closed stream stays readable before it is deleted.""" + max_items: builtins.int + """Cap on readable messages. Older whole buckets are reclaimed once the floor + passes them, so a capped stream has bounded storage. + """ def __init__( self, - retention: _Optional[ - _Union[datetime.timedelta, _duration_pb2.Duration, _Mapping] - ] = ..., - max_items: _Optional[int] = ..., + *, + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_items: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["retention", b"retention"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_items", b"max_items", "retention", b"retention" + ], ) -> None: ... + +global___StreamLifecycle = StreamLifecycle diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index c241cab40..bf947056a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 8280b56d4..2de4cb4e0 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -77,7 +77,9 @@ def __init__(self, channel: Any, namespace: str) -> None: """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" self._channel = channel self._namespace = namespace - self._stub = service_pb2_grpc.StreamServiceStub(channel) + # The generated stub is typed for a synchronous channel. This client + # drives it over ``grpc.aio``, where every call is awaited. + self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod def connect(target_host: str, namespace: str = "default") -> "StreamClient": From 1bcdf76b7e3e1466493b7d695bb6a13df3367eb4 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:48:03 -0700 Subject: [PATCH 067/831] Tidied the changelog the three merges left behind. A stray half sentence from one branch's entry landed inside another's. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62bd96081..c671de0fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,7 +57,7 @@ to include examples, links to docs, or any other relevant information. through `ExternalOutputStreamClient`. Workflow output is staged outside History and becomes readable only after its compact Workflow Task marker is committed. - reference provider the conformance tests run against. + - **Experimental**: server-side streams. A workflow reads a stream the server delivers on its Workflow Tasks and publishes with a command, through `temporalio.workflow.read_stream`, `subscribe_stream` and From d969907af55b103d55f52eec5df246ef553848c0 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:49:51 -0700 Subject: [PATCH 068/831] Asked a field whether it is repeated without reading `label`. A `getattr` default is evaluated whether or not the attribute is there, and protobuf 6 descriptors have `is_repeated` but no `label`. --- tests/nexus/test_temporal_system_nexus.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/nexus/test_temporal_system_nexus.py b/tests/nexus/test_temporal_system_nexus.py index 6a9bc9959..dc49f0302 100644 --- a/tests/nexus/test_temporal_system_nexus.py +++ b/tests/nexus/test_temporal_system_nexus.py @@ -566,13 +566,10 @@ def _proto_scalar_sample(field: FieldDescriptor, *, path: str) -> Any: def _field_is_repeated(field: FieldDescriptor) -> bool: - return bool( - getattr( - field, - "is_repeated", - getattr(field, "label") == FieldDescriptor.LABEL_REPEATED, - ) - ) + is_repeated = getattr(field, "is_repeated", None) + if is_repeated is not None: + return bool(is_repeated) + return getattr(field, "label") == FieldDescriptor.LABEL_REPEATED @pytest.mark.parametrize( From 1546680d0d07c3c64e60901d93147bebcffad3ff Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:05:23 -0700 Subject: [PATCH 069/831] Regenerated the bridge protos from the merged Core. The merge took the protos from the branch with the narrower Core, which does not carry the external stream jobs. --- .../workflow_activation_pb2.py | 176 ++++++--- .../workflow_activation_pb2.pyi | 259 ++++++++++++ .../proto/workflow_commands/__init__.py | 18 + .../workflow_commands_pb2.py | 275 +++++++++---- .../workflow_commands_pb2.pyi | 368 ++++++++++++++++++ 5 files changed, 970 insertions(+), 126 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index cd09b8b97..23a90bed8 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -42,17 +42,31 @@ from temporalio.bridge.proto.common import ( common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, ) +from temporalio.bridge.proto.external_data import ( + external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2, +) from temporalio.bridge.proto.nexus import ( nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, ) +from temporalio.bridge.proto.workflow_commands import ( + workflow_commands_pb2 as temporal_dot_sdk_dot_core_dot_workflow__commands_dot_workflow__commands__pb2, +) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto\x1a;temporal/sdk/core/workflow_commands/workflow_commands.proto"\xc2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\x12\x1e\n\x16history_floor_event_id\x18\r \x01(\x03"\xab\x0e\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12`\n\x1dresolve_external_stream_waits\x18\x11 \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveExternalStreamWaitsH\x00\x12^\n\x1cprepare_external_stream_park\x18\x12 \x01(\x0b\x32\x36.coresdk.workflow_activation.PrepareExternalStreamParkH\x00\x12U\n\x17replay_external_streams\x18\x13 \x01(\x0b\x32\x32.coresdk.workflow_activation.ReplayExternalStreamsH\x00\x12Y\n\x19\x66inalize_external_streams\x18\x14 \x01(\x0b\x32\x34.coresdk.workflow_activation.FinalizeExternalStreamsH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x7f\n\x1aResolveExternalStreamWaits\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x42\n\x0bready_hints\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait"\xab\x01\n\x19PrepareExternalStreamPark\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x92\x02\n\x15ReplayExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x19\n\x11replay_annotation\x18\x03 \x01(\x0c\x12<\n\x11terminal_boundary\x18\x04 \x01(\x0e\x32!.coresdk.external_data.ParkReason\x12\x43\n\x06output\x18\x05 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest"\xa9\x01\n\x17\x46inalizeExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_RESOLVEEXTERNALSTREAMWAITS = DESCRIPTOR.message_types_by_name[ + "ResolveExternalStreamWaits" +] +_PREPAREEXTERNALSTREAMPARK = DESCRIPTOR.message_types_by_name[ + "PrepareExternalStreamPark" +] +_REPLAYEXTERNALSTREAMS = DESCRIPTOR.message_types_by_name["ReplayExternalStreams"] +_FINALIZEEXTERNALSTREAMS = DESCRIPTOR.message_types_by_name["FinalizeExternalStreams"] _DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ @@ -118,6 +132,50 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) +ResolveExternalStreamWaits = _reflection.GeneratedProtocolMessageType( + "ResolveExternalStreamWaits", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEEXTERNALSTREAMWAITS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveExternalStreamWaits) + }, +) +_sym_db.RegisterMessage(ResolveExternalStreamWaits) + +PrepareExternalStreamPark = _reflection.GeneratedProtocolMessageType( + "PrepareExternalStreamPark", + (_message.Message,), + { + "DESCRIPTOR": _PREPAREEXTERNALSTREAMPARK, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.PrepareExternalStreamPark) + }, +) +_sym_db.RegisterMessage(PrepareExternalStreamPark) + +ReplayExternalStreams = _reflection.GeneratedProtocolMessageType( + "ReplayExternalStreams", + (_message.Message,), + { + "DESCRIPTOR": _REPLAYEXTERNALSTREAMS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ReplayExternalStreams) + }, +) +_sym_db.RegisterMessage(ReplayExternalStreams) + +FinalizeExternalStreams = _reflection.GeneratedProtocolMessageType( + "FinalizeExternalStreams", + (_message.Message,), + { + "DESCRIPTOR": _FINALIZEEXTERNALSTREAMS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FinalizeExternalStreams) + }, +) +_sym_db.RegisterMessage(FinalizeExternalStreams) + DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( "DeliverStreamMessages", (_message.Message,), @@ -391,58 +449,66 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 570 - _WORKFLOWACTIVATION._serialized_end = 1116 - _WORKFLOWACTIVATIONJOB._serialized_start = 1119 - _WORKFLOWACTIVATIONJOB._serialized_end = 2582 - _DELIVERSTREAMMESSAGES._serialized_start = 2585 - _DELIVERSTREAMMESSAGES._serialized_end = 2724 - _INITIALIZEWORKFLOW._serialized_start = 2727 - _INITIALIZEWORKFLOW._serialized_end = 4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _FIRETIMER._serialized_start = 4133 - _FIRETIMER._serialized_end = 4157 - _RESOLVEACTIVITY._serialized_start = 4159 - _RESOLVEACTIVITY._serialized_end = 4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 - _UPDATERANDOMSEED._serialized_start = 5045 - _UPDATERANDOMSEED._serialized_end = 5088 - _QUERYWORKFLOW._serialized_start = 5091 - _QUERYWORKFLOW._serialized_end = 5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _CANCELWORKFLOW._serialized_start = 5353 - _CANCELWORKFLOW._serialized_end = 5385 - _SIGNALWORKFLOW._serialized_start = 5388 - _SIGNALWORKFLOW._serialized_end = 5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _NOTIFYHASPATCH._serialized_start = 5679 - _NOTIFYHASPATCH._serialized_end = 5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 - _DOUPDATE._serialized_start = 5917 - _DOUPDATE._serialized_end = 6248 - _DOUPDATE_HEADERSENTRY._serialized_start = 4052 - _DOUPDATE_HEADERSENTRY._serialized_end = 4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 - _RESOLVENEXUSOPERATION._serialized_start = 6407 - _RESOLVENEXUSOPERATION._serialized_end = 6496 - _REMOVEFROMCACHE._serialized_start = 6499 - _REMOVEFROMCACHE._serialized_end = 6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 + _WORKFLOWACTIVATION._serialized_start = 684 + _WORKFLOWACTIVATION._serialized_end = 1262 + _WORKFLOWACTIVATIONJOB._serialized_start = 1265 + _WORKFLOWACTIVATIONJOB._serialized_end = 3100 + _RESOLVEEXTERNALSTREAMWAITS._serialized_start = 3102 + _RESOLVEEXTERNALSTREAMWAITS._serialized_end = 3229 + _PREPAREEXTERNALSTREAMPARK._serialized_start = 3232 + _PREPAREEXTERNALSTREAMPARK._serialized_end = 3403 + _REPLAYEXTERNALSTREAMS._serialized_start = 3406 + _REPLAYEXTERNALSTREAMS._serialized_end = 3680 + _FINALIZEEXTERNALSTREAMS._serialized_start = 3683 + _FINALIZEEXTERNALSTREAMS._serialized_end = 3852 + _DELIVERSTREAMMESSAGES._serialized_start = 3855 + _DELIVERSTREAMMESSAGES._serialized_end = 3994 + _INITIALIZEWORKFLOW._serialized_start = 3997 + _INITIALIZEWORKFLOW._serialized_end = 5401 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 5322 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 5401 + _FIRETIMER._serialized_start = 5403 + _FIRETIMER._serialized_end = 5427 + _RESOLVEACTIVITY._serialized_start = 5429 + _RESOLVEACTIVITY._serialized_end = 5538 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 5541 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 5878 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 5880 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 5939 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 5942 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 6108 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 6110 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 6206 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 6208 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 6313 + _UPDATERANDOMSEED._serialized_start = 6315 + _UPDATERANDOMSEED._serialized_end = 6358 + _QUERYWORKFLOW._serialized_start = 6361 + _QUERYWORKFLOW._serialized_end = 6621 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 5322 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 5401 + _CANCELWORKFLOW._serialized_start = 6623 + _CANCELWORKFLOW._serialized_end = 6655 + _SIGNALWORKFLOW._serialized_start = 6658 + _SIGNALWORKFLOW._serialized_end = 6947 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 5322 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 5401 + _NOTIFYHASPATCH._serialized_start = 6949 + _NOTIFYHASPATCH._serialized_end = 6983 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 6985 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 7080 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 7082 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 7184 + _DOUPDATE._serialized_start = 7187 + _DOUPDATE._serialized_end = 7518 + _DOUPDATE_HEADERSENTRY._serialized_start = 5322 + _DOUPDATE_HEADERSENTRY._serialized_end = 5401 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 7521 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 7675 + _RESOLVENEXUSOPERATION._serialized_start = 7677 + _RESOLVENEXUSOPERATION._serialized_end = 7766 + _REMOVEFROMCACHE._serialized_start = 7769 + _REMOVEFROMCACHE._serialized_end = 8121 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 7883 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 8121 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 5245cd6fc..670aad2f4 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -26,7 +26,9 @@ import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 +import temporalio.bridge.proto.external_data.external_data_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 +import temporalio.bridge.proto.workflow_commands.workflow_commands_pb2 if sys.version_info >= (3, 10): import typing as typing_extensions @@ -96,6 +98,7 @@ class WorkflowActivation(google.protobuf.message.Message): LAST_SDK_VERSION_FIELD_NUMBER: builtins.int SUGGEST_CONTINUE_AS_NEW_REASONS_FIELD_NUMBER: builtins.int TARGET_WORKER_DEPLOYMENT_VERSION_CHANGED_FIELD_NUMBER: builtins.int + HISTORY_FLOOR_EVENT_ID_FIELD_NUMBER: builtins.int run_id: builtins.str """The id of the currently active run of the workflow. Also used as a cache key. There may only ever be one active workflow task (and hence activation) of a run at one time. @@ -157,6 +160,11 @@ class WorkflowActivation(google.protobuf.message.Message): the workflow is Pinned. Experimental. """ + history_floor_event_id: builtins.int + """The event immediately preceding this Workflow Task's WorkflowTaskScheduled event in the + ordered History view Core used to build the activation. Zero means Core could not identify + that exact predecessor, in which case output must not be staged for this task. + """ def __init__( self, *, @@ -176,6 +184,7 @@ class WorkflowActivation(google.protobuf.message.Message): ] | None = ..., target_worker_deployment_version_changed: builtins.bool = ..., + history_floor_event_id: builtins.int = ..., ) -> None: ... def HasField( self, @@ -195,6 +204,8 @@ class WorkflowActivation(google.protobuf.message.Message): b"continue_as_new_suggested", "deployment_version_for_current_task", b"deployment_version_for_current_task", + "history_floor_event_id", + b"history_floor_event_id", "history_length", b"history_length", "history_size_bytes", @@ -236,6 +247,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + RESOLVE_EXTERNAL_STREAM_WAITS_FIELD_NUMBER: builtins.int + PREPARE_EXTERNAL_STREAM_PARK_FIELD_NUMBER: builtins.int + REPLAY_EXTERNAL_STREAMS_FIELD_NUMBER: builtins.int + FINALIZE_EXTERNAL_STREAMS_FIELD_NUMBER: builtins.int DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property @@ -297,6 +312,20 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def resolve_external_stream_waits(self) -> global___ResolveExternalStreamWaits: + """One or more external stream waits may have data buffered. Runs user workflow code.""" + @property + def prepare_external_stream_park(self) -> global___PrepareExternalStreamPark: + """Runtime-internal: install park intents and recheck every stream. Runs no user code.""" + @property + def replay_external_streams(self) -> global___ReplayExternalStreams: + """Replay: deliver the recorded external stream observations from a marker.""" + @property + def finalize_external_streams(self) -> global___FinalizeExternalStreams: + """Runtime-internal: encode the terminal boundary for a marker Core is about to write. + Runs no user code. + """ + @property def deliver_stream_messages(self) -> global___DeliverStreamMessages: """A range of a stream the workflow subscribed to.""" @property @@ -327,6 +356,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + resolve_external_stream_waits: global___ResolveExternalStreamWaits | None = ..., + prepare_external_stream_park: global___PrepareExternalStreamPark | None = ..., + replay_external_streams: global___ReplayExternalStreams | None = ..., + finalize_external_streams: global___FinalizeExternalStreams | None = ..., deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... @@ -339,22 +372,30 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"deliver_stream_messages", "do_update", b"do_update", + "finalize_external_streams", + b"finalize_external_streams", "fire_timer", b"fire_timer", "initialize_workflow", b"initialize_workflow", "notify_has_patch", b"notify_has_patch", + "prepare_external_stream_park", + b"prepare_external_stream_park", "query_workflow", b"query_workflow", "remove_from_cache", b"remove_from_cache", + "replay_external_streams", + b"replay_external_streams", "resolve_activity", b"resolve_activity", "resolve_child_workflow_execution", b"resolve_child_workflow_execution", "resolve_child_workflow_execution_start", b"resolve_child_workflow_execution_start", + "resolve_external_stream_waits", + b"resolve_external_stream_waits", "resolve_nexus_operation", b"resolve_nexus_operation", "resolve_nexus_operation_start", @@ -380,22 +421,30 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"deliver_stream_messages", "do_update", b"do_update", + "finalize_external_streams", + b"finalize_external_streams", "fire_timer", b"fire_timer", "initialize_workflow", b"initialize_workflow", "notify_has_patch", b"notify_has_patch", + "prepare_external_stream_park", + b"prepare_external_stream_park", "query_workflow", b"query_workflow", "remove_from_cache", b"remove_from_cache", + "replay_external_streams", + b"replay_external_streams", "resolve_activity", b"resolve_activity", "resolve_child_workflow_execution", b"resolve_child_workflow_execution", "resolve_child_workflow_execution_start", b"resolve_child_workflow_execution_start", + "resolve_external_stream_waits", + b"resolve_external_stream_waits", "resolve_nexus_operation", b"resolve_nexus_operation", "resolve_nexus_operation_start", @@ -431,6 +480,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "resolve_external_stream_waits", + "prepare_external_stream_park", + "replay_external_streams", + "finalize_external_streams", "deliver_stream_messages", "remove_from_cache", ] @@ -439,6 +492,212 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class ResolveExternalStreamWaits(google.protobuf.message.Message): + """Tells lang that one or more external stream waits may now have data. + + This job contains no records. The listed waits are readiness *hints*, not an exhaustive + availability claim: on receipt lang probes every active wait, drains all currently available + inputs, and only then resumes Workflow futures. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + READY_HINTS_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def ready_hints( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + ready_hints: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "ready_hints", + b"ready_hints", + ], + ) -> None: ... + +global___ResolveExternalStreamWaits = ResolveExternalStreamWaits + +class PrepareExternalStreamPark(google.protobuf.message.Message): + """Asks lang to park the complete active wait set through the backend handshake. + + Runtime-internal: no user Workflow code runs. Lang installs a park intent per subscription, + rechecks every stream, and answers with ExternalStreamParkResult. A recheck that finds records + answers `became_ready` instead, and Core issues a normal resolve activation next. + + Requires backend I/O, so lang must not handle this on the synchronous Workflow thread. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: + """Always the complete active wait set.""" + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + """One of PARK_REASON_IDLE, PARK_REASON_ALL_WRITE_FENCED, or PARK_REASON_SHUTDOWN.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "reason", + b"reason", + "waits", + b"waits", + ], + ) -> None: ... + +global___PrepareExternalStreamPark = PrepareExternalStreamPark + +class ReplayExternalStreams(google.protobuf.message.Message): + """Carries a recorded marker's annotation back to lang during replay. + + Core issues exactly one of these per marker. Lang's replay driver walks the annotation's + segments in order, performing one event-loop drain per segment, so the live run's k + activations become k drains inside this one activation and condition evaluation matches. + + Requires backend I/O (the recorded range reads and their integrity validation), so lang must + prepare it off the Workflow thread and deliver from memory once it is on it. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REPLAY_ANNOTATION_FIELD_NUMBER: builtins.int + TERMINAL_BOUNDARY_FIELD_NUMBER: builtins.int + OUTPUT_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + replay_annotation: builtins.bytes + """Opaque to Core.""" + terminal_boundary: ( + temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + ) + @property + def output( + self, + ) -> temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest: + """The output manifest recorded in the same marker, if this Workflow Task published output.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + replay_annotation: builtins.bytes = ..., + terminal_boundary: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + output: temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["output", b"output"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "output", + b"output", + "quiescence_generation", + b"quiescence_generation", + "replay_annotation", + b"replay_annotation", + "terminal_boundary", + b"terminal_boundary", + "waits", + b"waits", + ], + ) -> None: ... + +global___ReplayExternalStreams = ReplayExternalStreams + +class FinalizeExternalStreams(google.protobuf.message.Message): + """Issued before Core writes a marker for a boundary Core itself decided and no park handshake + will run: rollover-deadline expiry, and shutdown or eviction with a Workflow Task open. + + Runs no user Workflow code, cannot resolve futures, and its only legal responses are + ExternalStreamFinalized or an activation failure. It requires *no* backend I/O: lang reads the + blocked cursor snapshot from its own in-memory manager state. If lang cannot answer, Core + writes no marker and the Workflow Task fails for retry -- there is no best-effort path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + """One of PARK_REASON_ROLLOVER or PARK_REASON_SHUTDOWN.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "reason", + b"reason", + "waits", + b"waits", + ], + ) -> None: ... + +global___FinalizeExternalStreams = FinalizeExternalStreams + class DeliverStreamMessages(google.protobuf.message.Message): """Hand a workflow the next range of a stream it subscribed to. diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 44826f2da..6773fa299 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -7,8 +7,12 @@ CancelWorkflowExecution, CompleteWorkflowExecution, ContinueAsNewWorkflowExecution, + ExternalStreamFinalized, + ExternalStreamParkResult, + ExternalStreamWait, FailWorkflowExecution, ModifyWorkflowProperties, + ParkSetConfirmed, QueryResult, QuerySuccess, RequestCancelActivity, @@ -22,10 +26,15 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + StreamSetBecameReady, SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, + WorkflowOutputStreamBuffered, + WorkflowOutputStreamCommit, + WorkflowStreamProgress, + WorkflowStreamQuiescent, ) __all__ = [ @@ -37,8 +46,12 @@ "CancelWorkflowExecution", "CompleteWorkflowExecution", "ContinueAsNewWorkflowExecution", + "ExternalStreamFinalized", + "ExternalStreamParkResult", + "ExternalStreamWait", "FailWorkflowExecution", "ModifyWorkflowProperties", + "ParkSetConfirmed", "QueryResult", "QuerySuccess", "RequestCancelActivity", @@ -52,8 +65,13 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "StreamSetBecameReady", "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", + "WorkflowOutputStreamBuffered", + "WorkflowOutputStreamCommit", + "WorkflowStreamProgress", + "WorkflowStreamQuiescent", ] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 3374f951a..8facd5fff 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -43,12 +43,15 @@ from temporalio.bridge.proto.common import ( common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, ) +from temporalio.bridge.proto.external_data import ( + external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2, +) from temporalio.bridge.proto.nexus import ( nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xe7\x15\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,6 +62,19 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_WORKFLOWSTREAMPROGRESS = DESCRIPTOR.message_types_by_name["WorkflowStreamProgress"] +_WORKFLOWSTREAMQUIESCENT = DESCRIPTOR.message_types_by_name["WorkflowStreamQuiescent"] +_EXTERNALSTREAMWAIT = DESCRIPTOR.message_types_by_name["ExternalStreamWait"] +_EXTERNALSTREAMPARKRESULT = DESCRIPTOR.message_types_by_name["ExternalStreamParkResult"] +_PARKSETCONFIRMED = DESCRIPTOR.message_types_by_name["ParkSetConfirmed"] +_STREAMSETBECAMEREADY = DESCRIPTOR.message_types_by_name["StreamSetBecameReady"] +_EXTERNALSTREAMFINALIZED = DESCRIPTOR.message_types_by_name["ExternalStreamFinalized"] +_WORKFLOWOUTPUTSTREAMCOMMIT = DESCRIPTOR.message_types_by_name[ + "WorkflowOutputStreamCommit" +] +_WORKFLOWOUTPUTSTREAMBUFFERED = DESCRIPTOR.message_types_by_name[ + "WorkflowOutputStreamBuffered" +] _ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] _SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] @@ -135,6 +151,105 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +WorkflowStreamProgress = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamProgress", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMPROGRESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamProgress) + }, +) +_sym_db.RegisterMessage(WorkflowStreamProgress) + +WorkflowStreamQuiescent = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamQuiescent", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMQUIESCENT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamQuiescent) + }, +) +_sym_db.RegisterMessage(WorkflowStreamQuiescent) + +ExternalStreamWait = _reflection.GeneratedProtocolMessageType( + "ExternalStreamWait", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMWAIT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamWait) + }, +) +_sym_db.RegisterMessage(ExternalStreamWait) + +ExternalStreamParkResult = _reflection.GeneratedProtocolMessageType( + "ExternalStreamParkResult", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMPARKRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamParkResult) + }, +) +_sym_db.RegisterMessage(ExternalStreamParkResult) + +ParkSetConfirmed = _reflection.GeneratedProtocolMessageType( + "ParkSetConfirmed", + (_message.Message,), + { + "DESCRIPTOR": _PARKSETCONFIRMED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ParkSetConfirmed) + }, +) +_sym_db.RegisterMessage(ParkSetConfirmed) + +StreamSetBecameReady = _reflection.GeneratedProtocolMessageType( + "StreamSetBecameReady", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSETBECAMEREADY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StreamSetBecameReady) + }, +) +_sym_db.RegisterMessage(StreamSetBecameReady) + +ExternalStreamFinalized = _reflection.GeneratedProtocolMessageType( + "ExternalStreamFinalized", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMFINALIZED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamFinalized) + }, +) +_sym_db.RegisterMessage(ExternalStreamFinalized) + +WorkflowOutputStreamCommit = _reflection.GeneratedProtocolMessageType( + "WorkflowOutputStreamCommit", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWOUTPUTSTREAMCOMMIT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowOutputStreamCommit) + }, +) +_sym_db.RegisterMessage(WorkflowOutputStreamCommit) + +WorkflowOutputStreamBuffered = _reflection.GeneratedProtocolMessageType( + "WorkflowOutputStreamBuffered", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWOUTPUTSTREAMBUFFERED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowOutputStreamBuffered) + }, +) +_sym_db.RegisterMessage(WorkflowOutputStreamBuffered) + AddStreamMessages = _reflection.GeneratedProtocolMessageType( "AddStreamMessages", (_message.Message,), @@ -511,74 +626,92 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 - _WORKFLOWCOMMAND._serialized_start = 556 - _WORKFLOWCOMMAND._serialized_end = 2794 - _ADDSTREAMMESSAGES._serialized_start = 2796 - _ADDSTREAMMESSAGES._serialized_end = 2891 - _SUBSCRIBESTREAM._serialized_start = 2893 - _SUBSCRIBESTREAM._serialized_end = 2951 - _STARTTIMER._serialized_start = 2953 - _STARTTIMER._serialized_end = 3036 - _CANCELTIMER._serialized_start = 3038 - _CANCELTIMER._serialized_end = 3064 - _SCHEDULEACTIVITY._serialized_start = 3067 - _SCHEDULEACTIVITY._serialized_end = 3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 - _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4646 - _REQUESTCANCELACTIVITY._serialized_end = 4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 - _QUERYRESULT._serialized_start = 4728 - _QUERYRESULT._serialized_end = 4884 - _QUERYSUCCESS._serialized_start = 4886 - _QUERYSUCCESS._serialized_end = 4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 - _FAILWORKFLOWEXECUTION._serialized_start = 5031 - _FAILWORKFLOWEXECUTION._serialized_end = 5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6024 - _CANCELWORKFLOWEXECUTION._serialized_end = 6100 - _SETPATCHMARKER._serialized_start = 6102 - _SETPATCHMARKER._serialized_end = 6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7958 - _CANCELSIGNALWORKFLOW._serialized_end = 7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 - _UPDATERESPONSE._serialized_start = 8180 - _UPDATERESPONSE._serialized_end = 8390 - _SCHEDULENEXUSOPERATION._serialized_start = 8393 - _SCHEDULENEXUSOPERATION._serialized_end = 8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 10514 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 10602 + _WORKFLOWCOMMAND._serialized_start = 609 + _WORKFLOWCOMMAND._serialized_end = 3400 + _WORKFLOWSTREAMPROGRESS._serialized_start = 3402 + _WORKFLOWSTREAMPROGRESS._serialized_end = 3479 + _WORKFLOWSTREAMQUIESCENT._serialized_start = 3482 + _WORKFLOWSTREAMQUIESCENT._serialized_end = 3649 + _EXTERNALSTREAMWAIT._serialized_start = 3651 + _EXTERNALSTREAMWAIT._serialized_end = 3738 + _EXTERNALSTREAMPARKRESULT._serialized_start = 3741 + _EXTERNALSTREAMPARKRESULT._serialized_end = 3981 + _PARKSETCONFIRMED._serialized_start = 3983 + _PARKSETCONFIRMED._serialized_end = 4001 + _STREAMSETBECAMEREADY._serialized_start = 4003 + _STREAMSETBECAMEREADY._serialized_end = 4025 + _EXTERNALSTREAMFINALIZED._serialized_start = 4027 + _EXTERNALSTREAMFINALIZED._serialized_end = 4116 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 4118 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4243 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4245 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4331 + _ADDSTREAMMESSAGES._serialized_start = 4333 + _ADDSTREAMMESSAGES._serialized_end = 4428 + _SUBSCRIBESTREAM._serialized_start = 4430 + _SUBSCRIBESTREAM._serialized_end = 4488 + _STARTTIMER._serialized_start = 4490 + _STARTTIMER._serialized_end = 4573 + _CANCELTIMER._serialized_start = 4575 + _CANCELTIMER._serialized_end = 4601 + _SCHEDULEACTIVITY._serialized_start = 4604 + _SCHEDULEACTIVITY._serialized_end = 5428 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5349 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5428 + _SCHEDULELOCALACTIVITY._serialized_start = 5431 + _SCHEDULELOCALACTIVITY._serialized_end = 6181 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5349 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5428 + _REQUESTCANCELACTIVITY._serialized_start = 6183 + _REQUESTCANCELACTIVITY._serialized_end = 6219 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 6221 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 6262 + _QUERYRESULT._serialized_start = 6265 + _QUERYRESULT._serialized_end = 6421 + _QUERYSUCCESS._serialized_start = 6423 + _QUERYSUCCESS._serialized_end = 6488 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 6490 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 6566 + _FAILWORKFLOWEXECUTION._serialized_start = 6568 + _FAILWORKFLOWEXECUTION._serialized_end = 6642 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6645 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7559 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7402 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7478 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5349 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5428 + _CANCELWORKFLOWEXECUTION._serialized_start = 7561 + _CANCELWORKFLOWEXECUTION._serialized_end = 7637 + _SETPATCHMARKER._serialized_start = 7639 + _SETPATCHMARKER._serialized_end = 7693 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7696 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8870 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5349 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5428 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7402 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7478 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8872 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8946 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8949 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9091 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9094 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9493 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5349 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5428 + _CANCELSIGNALWORKFLOW._serialized_start = 9495 + _CANCELSIGNALWORKFLOW._serialized_end = 9530 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9532 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9633 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 9635 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 9714 + _UPDATERESPONSE._serialized_start = 9717 + _UPDATERESPONSE._serialized_end = 9927 + _SCHEDULENEXUSOPERATION._serialized_start = 9930 + _SCHEDULENEXUSOPERATION._serialized_end = 10468 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10418 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10468 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 10470 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 10512 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index b3977164a..b205827c1 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -28,6 +28,7 @@ import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 +import temporalio.bridge.proto.external_data.external_data_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 if sys.version_info >= (3, 10): @@ -104,6 +105,12 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_PROGRESS_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_QUIESCENT_FIELD_NUMBER: builtins.int + EXTERNAL_STREAM_PARK_RESULT_FIELD_NUMBER: builtins.int + EXTERNAL_STREAM_FINALIZED_FIELD_NUMBER: builtins.int + WORKFLOW_OUTPUT_STREAM_COMMIT_FIELD_NUMBER: builtins.int + WORKFLOW_OUTPUT_STREAM_BUFFERED_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property @@ -181,6 +188,20 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property + def workflow_stream_progress(self) -> global___WorkflowStreamProgress: ... + @property + def workflow_stream_quiescent(self) -> global___WorkflowStreamQuiescent: ... + @property + def external_stream_park_result(self) -> global___ExternalStreamParkResult: ... + @property + def external_stream_finalized(self) -> global___ExternalStreamFinalized: ... + @property + def workflow_output_stream_commit(self) -> global___WorkflowOutputStreamCommit: ... + @property + def workflow_output_stream_buffered( + self, + ) -> global___WorkflowOutputStreamBuffered: ... + @property def subscribe_stream(self) -> global___SubscribeStream: ... @property def add_stream_messages(self) -> global___AddStreamMessages: ... @@ -222,6 +243,13 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + workflow_stream_progress: global___WorkflowStreamProgress | None = ..., + workflow_stream_quiescent: global___WorkflowStreamQuiescent | None = ..., + external_stream_park_result: global___ExternalStreamParkResult | None = ..., + external_stream_finalized: global___ExternalStreamFinalized | None = ..., + workflow_output_stream_commit: global___WorkflowOutputStreamCommit | None = ..., + workflow_output_stream_buffered: global___WorkflowOutputStreamBuffered + | None = ..., subscribe_stream: global___SubscribeStream | None = ..., add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... @@ -242,6 +270,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"complete_workflow_execution", "continue_as_new_workflow_execution", b"continue_as_new_workflow_execution", + "external_stream_finalized", + b"external_stream_finalized", + "external_stream_park_result", + b"external_stream_park_result", "fail_workflow_execution", b"fail_workflow_execution", "modify_workflow_properties", @@ -280,6 +312,14 @@ class WorkflowCommand(google.protobuf.message.Message): b"user_metadata", "variant", b"variant", + "workflow_output_stream_buffered", + b"workflow_output_stream_buffered", + "workflow_output_stream_commit", + b"workflow_output_stream_commit", + "workflow_stream_progress", + b"workflow_stream_progress", + "workflow_stream_quiescent", + b"workflow_stream_quiescent", ], ) -> builtins.bool: ... def ClearField( @@ -301,6 +341,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"continue_as_new_workflow_execution", "event_group_markers", b"event_group_markers", + "external_stream_finalized", + b"external_stream_finalized", + "external_stream_park_result", + b"external_stream_park_result", "fail_workflow_execution", b"fail_workflow_execution", "modify_workflow_properties", @@ -339,6 +383,14 @@ class WorkflowCommand(google.protobuf.message.Message): b"user_metadata", "variant", b"variant", + "workflow_output_stream_buffered", + b"workflow_output_stream_buffered", + "workflow_output_stream_commit", + b"workflow_output_stream_commit", + "workflow_stream_progress", + b"workflow_stream_progress", + "workflow_stream_quiescent", + b"workflow_stream_quiescent", ], ) -> None: ... def WhichOneof( @@ -367,6 +419,12 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "workflow_stream_progress", + "workflow_stream_quiescent", + "external_stream_park_result", + "external_stream_finalized", + "workflow_output_stream_commit", + "workflow_output_stream_buffered", "subscribe_stream", "add_stream_messages", ] @@ -375,6 +433,316 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand +class WorkflowStreamProgress(google.protobuf.message.Message): + """Commits an observation delta for external streams. + + Emitted on *every* completion path where replay-visible stream state changed -- which includes + an activation that observed no records at all -- and independent of whether the Workflow Task + is retained. Consuming a record and committing that consumption are separate steps, and the + second is not conditional on why the Workflow Task ended. + + Ordering is normative: this command precedes every command whose value could depend on the + consumed data. On replay that guarantees integrity validation for a record runs before the + command derived from it is matched. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + REQUEST_ROLLOVER_FIELD_NUMBER: builtins.int + observation_delta: builtins.bytes + """The segments produced since the previous progress report for this Workflow Task. Opaque to + Core, which appends it to the accumulated annotation and never parses it. + """ + request_rollover: builtins.bool + """Set when the encoder is approaching the annotation byte budget and the runtime wants the + Workflow Task rolled over rather than the marker grown further. Core takes the rollover + path minus the finalization round trip, because this command already carries the terminal. + """ + def __init__( + self, + *, + observation_delta: builtins.bytes = ..., + request_rollover: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "observation_delta", + b"observation_delta", + "request_rollover", + b"request_rollover", + ], + ) -> None: ... + +global___WorkflowStreamProgress = WorkflowStreamProgress + +class WorkflowStreamQuiescent(google.protobuf.message.Message): + """Asks Core to retain the open Workflow Task. Carries no annotation data -- retention and + progress are separate questions, and a completion may carry either command, both, or neither. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + IDLE_TIMEOUT_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + """Identifies this complete blocked snapshot.""" + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___ExternalStreamWait + ]: + """The *complete* set of waits the Workflow is blocked on. A partial set would let one idle + stream park a Workflow Task another stream is still driving. + """ + @property + def idle_timeout(self) -> google.protobuf.duration_pb2.Duration: + """Already reduced by `min` over the quiescent set in wait_id order. Core rejects a + non-positive value as a malformed completion rather than coercing it. + """ + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[global___ExternalStreamWait] | None = ..., + idle_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["idle_timeout", b"idle_timeout"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "idle_timeout", + b"idle_timeout", + "quiescence_generation", + b"quiescence_generation", + "waits", + b"waits", + ], + ) -> None: ... + +global___WorkflowStreamQuiescent = WorkflowStreamQuiescent + +class ExternalStreamWait(google.protobuf.message.Message): + """One external stream wait. Shared by the commands above and by the activation jobs, so it takes + no command tag of its own. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WAIT_ID_FIELD_NUMBER: builtins.int + GENERATION_FIELD_NUMBER: builtins.int + IMMEDIATELY_PARKABLE_FIELD_NUMBER: builtins.int + wait_id: builtins.int + generation: builtins.int + """Increments each time this subscription re-enters the blocked state. Never leaves the + Core/lang boundary. + """ + immediately_parkable: builtins.bool + """Normally set after a write fence. A single fenced stream does not park the Workflow Task; + Core bypasses the idle delay only when *every* active wait in the snapshot is set. + """ + def __init__( + self, + *, + wait_id: builtins.int = ..., + generation: builtins.int = ..., + immediately_parkable: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "generation", + b"generation", + "immediately_parkable", + b"immediately_parkable", + "wait_id", + b"wait_id", + ], + ) -> None: ... + +global___ExternalStreamWait = ExternalStreamWait + +class ExternalStreamParkResult(google.protobuf.message.Message): + """Lang's answer to PrepareExternalStreamPark.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + CONFIRMED_FIELD_NUMBER: builtins.int + BECAME_READY_FIELD_NUMBER: builtins.int + FINAL_OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def confirmed(self) -> global___ParkSetConfirmed: ... + @property + def became_ready(self) -> global___StreamSetBecameReady: ... + final_observation_delta: builtins.bytes + """Terminal observation delta for the marker Core is about to write. Present on `confirmed`: + only lang can encode the boundary, and Core must not write a marker whose annotation has + no terminal. + """ + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + confirmed: global___ParkSetConfirmed | None = ..., + became_ready: global___StreamSetBecameReady | None = ..., + final_observation_delta: builtins.bytes = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "became_ready", + b"became_ready", + "confirmed", + b"confirmed", + "outcome", + b"outcome", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "became_ready", + b"became_ready", + "confirmed", + b"confirmed", + "final_observation_delta", + b"final_observation_delta", + "outcome", + b"outcome", + "quiescence_generation", + b"quiescence_generation", + ], + ) -> None: ... + def WhichOneof( + self, oneof_group: typing_extensions.Literal["outcome", b"outcome"] + ) -> typing_extensions.Literal["confirmed", "became_ready"] | None: ... + +global___ExternalStreamParkResult = ExternalStreamParkResult + +class ParkSetConfirmed(google.protobuf.message.Message): + """Every stream was still empty after intents were installed and every stream was rechecked.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___ParkSetConfirmed = ParkSetConfirmed + +class StreamSetBecameReady(google.protobuf.message.Message): + """A recheck found records, so this parking generation is aborted and Core issues a normal + resolve activation rather than running user code from inside the park path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___StreamSetBecameReady = StreamSetBecameReady + +class ExternalStreamFinalized(google.protobuf.message.Message): + """Lang's answer to FinalizeExternalStreams, for the paths where Core decides the boundary and no + park handshake runs. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + FINAL_OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + final_observation_delta: builtins.bytes + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + final_observation_delta: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "final_observation_delta", + b"final_observation_delta", + "quiescence_generation", + b"quiescence_generation", + ], + ) -> None: ... + +global___ExternalStreamFinalized = ExternalStreamFinalized + +class WorkflowOutputStreamCommit(google.protobuf.message.Message): + """Reports that the output batch for this Workflow Task has been durably staged outside History. + Core records only this compact manifest in the shared external-stream marker. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MANIFEST_FIELD_NUMBER: builtins.int + REQUEST_ROLLOVER_FIELD_NUMBER: builtins.int + @property + def manifest( + self, + ) -> temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest: ... + request_rollover: builtins.bool + """The deterministic output capacity was reached and this task must request a replacement.""" + def __init__( + self, + *, + manifest: temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest + | None = ..., + request_rollover: builtins.bool = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["manifest", b"manifest"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "manifest", b"manifest", "request_rollover", b"request_rollover" + ], + ) -> None: ... + +global___WorkflowOutputStreamCommit = WorkflowOutputStreamCommit + +class WorkflowOutputStreamBuffered(google.protobuf.message.Message): + """Reports that external output is buffered in lang but has not yet been staged. Core retains the + open Workflow Task until the earliest reported deadline and then asks lang to finalize it. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAX_PUBLISH_LATENCY_FIELD_NUMBER: builtins.int + @property + def max_publish_latency(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + max_publish_latency: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "max_publish_latency", b"max_publish_latency" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_publish_latency", b"max_publish_latency" + ], + ) -> None: ... + +global___WorkflowOutputStreamBuffered = WorkflowOutputStreamBuffered + class AddStreamMessages(google.protobuf.message.Message): """Subscribe this workflow to a stream, so later Workflow Tasks carry the ranges it has not consumed yet. From ddaa9af806f93bbd79acb10ae6823a6c59e6016b Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:05:23 -0700 Subject: [PATCH 070/831] Asked a field whether it is repeated without reading `label`. A `getattr` default is evaluated whether or not the attribute is there, and protobuf 6 descriptors have `is_repeated` but no `label`, so regenerating the visitor needed a protobuf 3 interpreter. --- scripts/gen_payload_visitor.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/scripts/gen_payload_visitor.py b/scripts/gen_payload_visitor.py index 7fab85dcd..1df4e044c 100644 --- a/scripts/gen_payload_visitor.py +++ b/scripts/gen_payload_visitor.py @@ -63,13 +63,10 @@ def name_for(desc: Descriptor) -> str: def field_is_repeated(field: FieldDescriptor) -> bool: - return bool( - getattr( - field, - "is_repeated", - getattr(field, "label") == FieldDescriptor.LABEL_REPEATED, - ) - ) + is_repeated = getattr(field, "is_repeated", None) + if is_repeated is not None: + return bool(is_repeated) + return getattr(field, "label") == FieldDescriptor.LABEL_REPEATED def emit_loop( From c720a0b80a91cde681d3669d086dcf42f8583f52 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:05:23 -0700 Subject: [PATCH 071/831] Sorted and formatted what the three merges left. Each branch's imports were sorted against its own file set. --- temporalio/workflow/__init__.py | 5 ----- tests/streams/test_native_provider.py | 12 ++++++------ tests/streams/test_redis_provider.py | 16 +++++++--------- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 6988c9dfd..17b81aeb3 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -100,11 +100,6 @@ upsert_search_attributes, uuid4, uuid7, - DeliveredStreamMessage, - read_stream, - read_stream_messages, - add_stream_messages, - subscribe_stream, wait_condition, ) from ._definition import ( diff --git a/tests/streams/test_native_provider.py b/tests/streams/test_native_provider.py index edcc0d172..f8523e40e 100644 --- a/tests/streams/test_native_provider.py +++ b/tests/streams/test_native_provider.py @@ -17,7 +17,6 @@ from temporalio.client import Client from temporalio.streams import RecordKind from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -28,9 +27,7 @@ async def test_interface_loop_over_native_streams(): streams.configure(provider="native") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-native-live-{uuid.uuid4().hex}" async with Worker( @@ -44,8 +41,11 @@ async def test_interface_loop_over_native_streams(): ) producer = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 94abd8353..b255717b9 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -18,7 +18,6 @@ from temporalio.client import Client from temporalio.streams import RecordKind from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -33,9 +32,7 @@ async def test_interface_loop_over_redis(): url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), key_prefix=f"streams-redis-live-{uuid.uuid4().hex}", ) - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-redis-live-{uuid.uuid4().hex}" async with Worker( @@ -50,8 +47,11 @@ async def test_interface_loop_over_redis(): ) producer = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) @@ -107,9 +107,7 @@ async def test_query_after_completion_replays_the_final_task(): url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), key_prefix=f"streams-redis-live-{uuid.uuid4().hex}", ) - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-redis-replay-{uuid.uuid4().hex}" async with Worker( From d3897e9253af9860d7e90bfd0a6ca7b12b76856b Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:05:23 -0700 Subject: [PATCH 072/831] Pinned the dependency snapshot the lock had lost. The merge dropped the `[options]` block, so every resolve took whatever was newest within the span and this branch tested against different Google libraries than the branches it is made of. --- uv.lock | 4051 +++++++++++++++++++++++++------------------------------ 1 file changed, 1873 insertions(+), 2178 deletions(-) diff --git a/uv.lock b/uv.lock index 37dac641d..877d6448a 100644 --- a/uv.lock +++ b/uv.lock @@ -9,6 +9,10 @@ resolution-markers = [ "python_full_version < '3.11'", ] +[options] +exclude-newer = "2026-08-10T18:40:15.391197Z" +exclude-newer-span = "P2W" + [[package]] name = "aioboto3" version = "15.5.0" @@ -251,20 +255,21 @@ wheels = [ [[package]] name = "anthropic" -version = "1.6.0" +version = "0.121.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", marker = "python_full_version >= '3.11'" }, - { name = "docstring-parser", marker = "python_full_version >= '3.11'" }, - { name = "httpx2", marker = "python_full_version >= '3.11'" }, - { name = "jiter", marker = "python_full_version >= '3.11'" }, - { name = "pydantic", marker = "python_full_version >= '3.11'" }, - { name = "sniffio", marker = "python_full_version >= '3.11'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.11'" }, + { name = "anyio" }, + { name = "distro" }, + { name = "docstring-parser" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/3d/4170318539de0c163e1806509b0bb9cd7d611ee15e7885f1d16a11a37d29/anthropic-1.6.0.tar.gz", hash = "sha256:ce3c032f940984f67c516db896375bff36959f8dc589973e386f8e6ea81bbec3", size = 1172375, upload-time = "2026-09-15T15:14:55.826Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/ca/3cb2c20ee729736fbd4546d5d8b67e818288529fe70cb7a80dbf80aef70b/anthropic-0.121.0.tar.gz", hash = "sha256:e79d6e08ab3376602fc9a70d4d5ea3540817c76cf7e16658bed790834e1833d6", size = 1013292, upload-time = "2026-08-07T17:11:07.241Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/32/57a8b6c5441d9e6a1f332f70ee02375af6d9b5b65b42689ba83f7c7d010a/anthropic-1.6.0-py3-none-any.whl", hash = "sha256:049434f013d3a874acdfee696ec626e19166d58f4277e8fa34e5d0a5ec250ad0", size = 1249068, upload-time = "2026-09-15T15:14:54.326Z" }, + { url = "https://files.pythonhosted.org/packages/fa/91/b3d41643f1f639927e8c5fb02c3bd8bffe6f1f29e219b3bd4c61e267b15c/anthropic-0.121.0-py3-none-any.whl", hash = "sha256:6048713fa441e59e1cba8363171cd2a86273b25bd213e9c7ac70a523af88b011", size = 1035493, upload-time = "2026-08-07T17:11:08.508Z" }, ] [[package]] @@ -278,16 +283,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.15.1" +version = "4.14.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, - { name = "typing-extensions", marker = "python_full_version < '3.15'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/d2/f4d173e22df740bc37b1db102b386ba719b66e95b0f0d751f556b387e6d2/anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94", size = 276966, upload-time = "2026-09-05T10:42:39.44Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", size = 132079, upload-time = "2026-09-05T10:42:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, ] [[package]] @@ -310,15 +315,15 @@ wheels = [ [[package]] name = "authlib" -version = "1.8.0" +version = "1.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "joserfc" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/51/bc1729d3cfdc214b4935f4e886e4dd443c3065fd8e1e66423fe84b490f81/authlib-1.8.0.tar.gz", hash = "sha256:f3ecd5f1da737262fb53bf1a4d95c4ea1ad9dd509316587a255c99ab1838a4f0", size = 177759, upload-time = "2026-08-30T12:12:34.833Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", size = 176511, upload-time = "2026-05-06T08:10:23.116Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/c6/6f124bcfbbfb20fba22c939b4e43a06dccfc0e1ca20e5634ca573cb1e271/authlib-1.8.0-py2.py3-none-any.whl", hash = "sha256:88aebbd9af6757e14e912d5dc007ae1dc1f3e27e3b2152ce7c552ee2c3b3c121", size = 260804, upload-time = "2026-08-30T12:12:33.162Z" }, + { url = "https://files.pythonhosted.org/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", size = 259548, upload-time = "2026-05-06T08:10:21.436Z" }, ] [[package]] @@ -592,7 +597,7 @@ wheels = [ [[package]] name = "cfn-lint" -version = "1.56.3" +version = "1.54.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch" }, @@ -603,172 +608,96 @@ dependencies = [ { name = "sympy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/da/e419b9775114b082e089e3856ba64b27ed1d16c100e9bdf09b844ca7ba08/cfn_lint-1.56.3.tar.gz", hash = "sha256:cdca8797e33aad72c2eb94b49cb4b129cd1cd4309f7376c109d4d9446605bf41", size = 4782328, upload-time = "2026-09-10T18:35:07.124Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/ad/d241f50dc3e45610c422018708a637def1b37956a94f67002ebfc64e76c3/cfn_lint-1.54.0.tar.gz", hash = "sha256:b46075284cd5a86f2512e9425ceab870fd47d56b94522e67044eef84456d356b", size = 4584764, upload-time = "2026-08-05T17:10:27.482Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/80/e1545e7ee25552021e6b03715e0670bbd07e1b1e46d1f831fc5ce175007e/cfn_lint-1.56.3-py3-none-any.whl", hash = "sha256:f3b02b05f1dbf44c51d0c776d8a7543badc83ca3c7c933f243573b53d576b583", size = 5347306, upload-time = "2026-09-10T18:35:04.936Z" }, + { url = "https://files.pythonhosted.org/packages/14/c3/a61c3d9c00a28dd5427ccc8d274866516c9c56f1401c7f0869dd6d1a9dd8/cfn_lint-1.54.0-py3-none-any.whl", hash = "sha256:e917bdd0da8cce1b5474c82dc8f819fac6c4123406531f9a74797401d1543d80", size = 5121740, upload-time = "2026-08-05T17:10:25.062Z" }, ] [[package]] name = "charset-normalizer" -version = "3.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/aa/554e2614f38fc34c58ff1d0911ae8535ad2516440d5482d76fe59f1088b0/charset_normalizer-3.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1ee1e296209fdce05b81b663250eefa02213a2da7b41bf26f7829b8ba3545aa", size = 369072, upload-time = "2026-08-15T08:16:22.964Z" }, - { url = "https://files.pythonhosted.org/packages/03/6d/439231dfc3ccfa6f8c06477b7da2219cbd41a2de3d49084df8ec7b5100f2/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9fbdce1e47394b09bc9f26ab117dfc8d6491977a11d86f592bb42c779db2fda", size = 251142, upload-time = "2026-08-15T08:16:24.81Z" }, - { url = "https://files.pythonhosted.org/packages/55/53/7d819bd23a00ef45039146fa2cce1daa2f0771e758c5653ee1f6edac91ed/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:00668ebb0609751758682eb0b5857e7c35b9f00e84dfdef062e103244ec94d45", size = 240714, upload-time = "2026-08-15T08:16:26.392Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2c/45847198c16f4b38090cc7423b2b6a9008e438704d8ab413211832498d31/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba2f37ee79e6338845261a3c5b1784e5d1acdff2c0785b284f1b633033d136ab", size = 279637, upload-time = "2026-08-15T08:16:27.961Z" }, - { url = "https://files.pythonhosted.org/packages/69/2b/d8be3523ddf9f0b0f3e56d1359034aa10653a4d11564c697f802b4775766/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ce854f5f478050ade5a238731c4ca985a7d3b3cb53ff600a9b5c3b689b5f0a7a", size = 276543, upload-time = "2026-08-15T08:16:29.399Z" }, - { url = "https://files.pythonhosted.org/packages/32/cd/4f564b8f132de25db594efc706897069f016790cea63a5669c9df2675f64/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96eefc178f8636b9c760c5829345307fd81cfae9ab1e80997dbddeb0f54ee9a3", size = 261644, upload-time = "2026-08-15T08:16:30.722Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e3/38b975422534a608f98c360e79c2f07c763d66dd4272300d45fb1fee54b0/charset_normalizer-3.5.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:366ec70f5547c640d3ce1985722490f23faf4eb5216a7eeba78277490e78dacb", size = 259609, upload-time = "2026-08-15T08:16:32.248Z" }, - { url = "https://files.pythonhosted.org/packages/87/bd/fbc24d825c66f1c74f6ccdea3742c3d8354a4888e86d1315a197fee69061/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:950f23cb393f85543777b0433f082cddd25b51ab398eac7971146495679efe5f", size = 252457, upload-time = "2026-08-15T08:16:33.849Z" }, - { url = "https://files.pythonhosted.org/packages/b9/2d/918d0e98a0e679469ed05bb2d90c2088b4d315bb612969d8499f76fb5210/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1dcc36dcb96abc02236e182d17e0f71430152a6c2c7447421da2d2dc144edea", size = 242240, upload-time = "2026-08-15T08:16:35.396Z" }, - { url = "https://files.pythonhosted.org/packages/20/c8/c36f6e0b2dfec351bd38cbc05362697e58bcd073d7dbd95154290c9714ce/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:07ffd07412fc5d5e84cd8952acf9ff7e4ed7a708e69d1bada19d8ba91711353f", size = 280308, upload-time = "2026-08-15T08:16:36.825Z" }, - { url = "https://files.pythonhosted.org/packages/ca/7b/311b3e02e8c4092400c449c850a760d8c45d900983c83a70cc07208c551d/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f5542f9b941279d82d41eb0aa9f98eba36fe4df5c7086c651df7944935b37182", size = 258679, upload-time = "2026-08-15T08:16:38.22Z" }, - { url = "https://files.pythonhosted.org/packages/b9/90/082cc45599c392f28c036a497f49e0634041a785fc3849c80ccf396d096f/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a545775cfe815855ea32d7c27731d79da358ef2055b4a25830231b1622dd18aa", size = 277221, upload-time = "2026-08-15T08:16:39.62Z" }, - { url = "https://files.pythonhosted.org/packages/58/ad/b9aecf38d805cbcf84fa94f14c5d972a16561e20296a11dc799a5dcf3763/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:494b70049a4d69aec6e8137c13af4cf8db8c9f9820a1392ac293b0dd2987a818", size = 263799, upload-time = "2026-08-15T08:16:40.885Z" }, - { url = "https://files.pythonhosted.org/packages/b7/23/b38a20598d5a825f85d9d7636860e56ff0db1479f86497a6e485aa9326f7/charset_normalizer-3.5.1-cp310-cp310-win32.whl", hash = "sha256:94fbf1c0c6cc0d3d5e50f9a9313a8cdca90dd696d34b381cd1704f8c9e939f20", size = 182037, upload-time = "2026-08-15T08:16:42.198Z" }, - { url = "https://files.pythonhosted.org/packages/d2/21/83fffb77864408b8bf0fe1ca603926401d6f8775a8e150b39aacc9958f8a/charset_normalizer-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:be47f99644b208bff7766314013f9acf57b056b04191d570d68ad14022cf5b1d", size = 206030, upload-time = "2026-08-15T08:16:43.787Z" }, - { url = "https://files.pythonhosted.org/packages/86/2e/b93135b5034b1157fb29554b0d06d4844ce62282f0e0a14036f93d7ee2e7/charset_normalizer-3.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:a6d095662e73e74f0a49988e0593373e243e3a52e27bfeea0a859e88acf4a0f5", size = 185092, upload-time = "2026-08-15T08:16:45.177Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", size = 363585, upload-time = "2026-08-15T08:16:46.646Z" }, - { url = "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", size = 251189, upload-time = "2026-08-15T08:16:48.287Z" }, - { url = "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", size = 239724, upload-time = "2026-08-15T08:16:49.67Z" }, - { url = "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", size = 280078, upload-time = "2026-08-15T08:16:51.228Z" }, - { url = "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", size = 276650, upload-time = "2026-08-15T08:16:52.625Z" }, - { url = "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", size = 262325, upload-time = "2026-08-15T08:16:54.085Z" }, - { url = "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", size = 261140, upload-time = "2026-08-15T08:16:55.604Z" }, - { url = "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", size = 252791, upload-time = "2026-08-15T08:16:57.103Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", size = 240730, upload-time = "2026-08-15T08:16:58.418Z" }, - { url = "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", size = 280791, upload-time = "2026-08-15T08:16:59.918Z" }, - { url = "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", size = 259598, upload-time = "2026-08-15T08:17:01.421Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", size = 278217, upload-time = "2026-08-15T08:17:02.782Z" }, - { url = "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", size = 263417, upload-time = "2026-08-15T08:17:04.216Z" }, - { url = "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl", hash = "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", size = 181774, upload-time = "2026-08-15T08:17:05.58Z" }, - { url = "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", size = 206653, upload-time = "2026-08-15T08:17:07.075Z" }, - { url = "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", size = 185630, upload-time = "2026-08-15T08:17:08.502Z" }, - { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, - { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, - { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, - { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, - { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, - { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, - { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, - { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, - { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, - { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, - { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, - { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, - { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, - { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, - { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, - { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, - { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, - { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, - { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, - { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, - { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, - { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, - { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, - { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, - { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, - { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, - { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, - { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, - { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, - { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, - { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, - { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, - { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, - { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, - { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, - { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, - { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, - { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, - { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, - { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, - { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, - { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, - { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, - { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, - { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, - { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, - { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, - { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, - { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, - { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, - { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, - { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, - { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, - { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, - { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, - { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, - { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, - { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, - { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, - { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, - { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, - { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, - { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, - { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, - { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, - { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, - { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, - { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, - { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, - { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, - { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, - { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, - { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, - { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, - { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, - { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, - { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, - { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, - { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, - { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, - { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, - { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, - { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, - { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, - { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, - { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, - { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, - { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, - { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, - { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, - { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, - { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, - { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, - { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, - { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, - { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, - { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, - { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, - { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, - { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/81/8e983840c6e5b93b33c2ba81aa3d52c2e42f0e9a690ce7607a2e61da4a5c/charset_normalizer-3.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a", size = 322240, upload-time = "2026-07-07T14:32:36.236Z" }, + { url = "https://files.pythonhosted.org/packages/de/d1/b4319dc3229d8272fba305e206fc0a148e2de8d4087917ce62ae6382f359/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616", size = 216475, upload-time = "2026-07-07T14:32:38.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/6c99c1b3e6b8bf730e1bc809b9a2608f224145069114c479a2e9e1494346/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209", size = 238670, upload-time = "2026-07-07T14:32:39.658Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f4/ffbb83546e1f198ecc70ecd372b65cf2b50f9068b380abd67640f17a8e18/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99", size = 233476, upload-time = "2026-07-07T14:32:41.155Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5f/b98b8da398637b551e427e7be922bdec19177dc54d6811dcdaa503f23aac/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8", size = 223817, upload-time = "2026-07-07T14:32:42.592Z" }, + { url = "https://files.pythonhosted.org/packages/36/31/a276bb2e66243072a3fd06fdcab9cbb61a305b02143d70d2bda21d888fa8/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b", size = 207974, upload-time = "2026-07-07T14:32:44.258Z" }, + { url = "https://files.pythonhosted.org/packages/5e/be/7ee4453d7e88dfbc4104ccd34900b9f2c7c17dac22881865fe0e82424a25/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2", size = 221655, upload-time = "2026-07-07T14:32:45.64Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/181c652953eb5276d198f375b1dd641047392050098100a3a02d6534f657/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9", size = 219229, upload-time = "2026-07-07T14:32:47.376Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e7/aaf6da33fc9f4691cda8f7efbc9f69179d3d39ec8a4799baf273ee1d8db0/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15", size = 209704, upload-time = "2026-07-07T14:32:48.855Z" }, + { url = "https://files.pythonhosted.org/packages/63/01/f2fb3bd3a73be48b173ee0c6aa8d2497af97d5663a8c4c4b491de4c62f7a/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d", size = 226243, upload-time = "2026-07-07T14:32:50.239Z" }, + { url = "https://files.pythonhosted.org/packages/c4/02/c57a22739fe05246b0b5783b3bfb6afaac4eebb46f3ececdfb2f048f780e/charset_normalizer-3.4.9-cp310-cp310-win32.whl", hash = "sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381", size = 150935, upload-time = "2026-07-07T14:32:51.676Z" }, + { url = "https://files.pythonhosted.org/packages/37/8d/ca39a7559a4797505530d084fd3a49a2c959efbbbff146302fb7be4e3b35/charset_normalizer-3.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee", size = 162314, upload-time = "2026-07-07T14:32:53.193Z" }, + { url = "https://files.pythonhosted.org/packages/01/da/a44bd7a13d426e69e4894557106cd58669097bfad4a8681123b618fbfc5d/charset_normalizer-3.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419", size = 153075, upload-time = "2026-07-07T14:32:54.554Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e3/85ec501f206fb049259288c1f3506e53876937fb00edb47009348e66756b/charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5", size = 317075, upload-time = "2026-07-07T14:32:56.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/69/2a5385192e67175f7d8bd5ce4f57c24bc956439adeae5c13a99aa28a53d1/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2", size = 213837, upload-time = "2026-07-07T14:32:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/b3/46/03ddc7da576d814fe0a36dd1f0fd3258e95404b4b2e3c026b7923d7e133f/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a", size = 235503, upload-time = "2026-07-07T14:32:59.205Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6e/de0229a7ef40f6f9d28a837eebf4ec47bdca5dab4e900c84f22919af636a/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29", size = 229944, upload-time = "2026-07-07T14:33:00.803Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/49b9060e8418b14fb5cba9cf6bfb383111e2538a03a1fb18e66a95aeb3d5/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c", size = 221276, upload-time = "2026-07-07T14:33:02.199Z" }, + { url = "https://files.pythonhosted.org/packages/44/95/80282cce0fae9c3061203d723ee87da996aed79679e65d8935050ee7ca1f/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b", size = 205260, upload-time = "2026-07-07T14:33:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/0c/74/2f62c8821b969ea3bd67cc2e6976834f48ca5d12664d2559ebcd9bcfbed7/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db", size = 217786, upload-time = "2026-07-07T14:33:05.12Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8d/feabb82cb49fcad14515b1d7d1ca4787b0da7fc723a212bf89bc9e0fac52/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993", size = 216798, upload-time = "2026-07-07T14:33:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ff/c946d63bc3786d5b84d960b0f7ab7e25b828486a946b5aa997625bcaf6a6/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da", size = 206429, upload-time = "2026-07-07T14:33:08.006Z" }, + { url = "https://files.pythonhosted.org/packages/af/ba/5e5007c370702f85d2ef75791fac7943ed41e080364a673b20142e430e3e/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3", size = 223066, upload-time = "2026-07-07T14:33:09.783Z" }, + { url = "https://files.pythonhosted.org/packages/83/d5/9096aa3cf532dfad237861544eb47a0f20d5adbf1039760fed8eaae935d9/charset_normalizer-3.4.9-cp311-cp311-win32.whl", hash = "sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d", size = 150456, upload-time = "2026-07-07T14:33:11.217Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a1/e29995109e455dc8eff8d0fac6ae509be39561318a7cfeac5d33ad029213/charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1", size = 161410, upload-time = "2026-07-07T14:33:12.743Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8d/1569f4d0032d6ba2a4fe4591c35bf87868c600c41a71eb5c2e1ffa8464c2/charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec", size = 152649, upload-time = "2026-07-07T14:33:14.173Z" }, + { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" }, + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" }, + { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, ] [[package]] @@ -793,11 +722,14 @@ wheels = [ [[package]] name = "click" -version = "8.5.0" +version = "8.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, ] [[package]] @@ -811,11 +743,11 @@ wheels = [ [[package]] name = "configargparse" -version = "1.7.7" +version = "1.7.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/b4/7065677004d4ec8728da15a70580f431f1a4a079e0e8e8b7aa4ffee4e972/configargparse-1.7.7.tar.gz", hash = "sha256:607bea276a219912158afa1e5a716c3f8f88d542f9997dfd43bbd0b492a9f5a6", size = 73397, upload-time = "2026-09-06T20:58:06.387Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/0b/30328302903c55218ffc5199646d0e9d28348ff26c02ba77b2ffc58d294a/configargparse-1.7.5.tar.gz", hash = "sha256:e3f9a7bb6be34d66b2e3c4a2f58e3045f8dfae47b0dc039f87bcfaa0f193fb0f", size = 53548, upload-time = "2026-03-11T02:19:38.144Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/e6/cf29a5b21528779fa335c860c66a915d2254bbf77c1fb2c67160c56c3b58/configargparse-1.7.7-py3-none-any.whl", hash = "sha256:61107bb1de0b53c4eb7a475a12de6783b0dc6c51bc9859f5accbe97d66f8a4b7", size = 34277, upload-time = "2026-09-06T20:58:05.125Z" }, + { url = "https://files.pythonhosted.org/packages/fe/19/3ba5e1b0bcc7b91aeab6c258afd70e4907d220fed3972febe38feb40db30/configargparse-1.7.5-py3-none-any.whl", hash = "sha256:1e63fdffedf94da9cd435fc13a1cd24777e76879dd2343912c1f871d4ac8c592", size = 27692, upload-time = "2026-03-11T02:19:36.442Z" }, ] [[package]] @@ -829,130 +761,130 @@ wheels = [ [[package]] name = "coverage" -version = "7.16.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/2d/c738872f477f5687152acae68635790387425d407ae37dd3d3a8a6692307/coverage-7.16.1.tar.gz", hash = "sha256:f83981779bcf9dfa06fa0a8d4cb43e0faec1706328ce07aa3e7b665b4ac0f210", size = 969651, upload-time = "2026-09-13T19:12:21.422Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/62/a8b4dd53308a4b1571e6bdd77ee562c9b1c1742db9886c0aef2f69463067/coverage-7.16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f12a9e27ca7b65e40a8475d27899b2d45064d9020e6a89148939e01987b5853", size = 223178, upload-time = "2026-09-13T19:08:21.805Z" }, - { url = "https://files.pythonhosted.org/packages/5e/7a/b9325b8d486a5c05fd4a9eb1cd9c9f697c361ddeda0e73567d5c2d8959f6/coverage-7.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f590d46c30d9e4c1fda3efefe5443f4c2f6a4192c5ca2ba403653e9ebadf097", size = 223701, upload-time = "2026-09-13T19:08:23.391Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ee/3ab3ac6e9e7165a623695b73a83d1bfbdf5069681a68a012cb5abb096060/coverage-7.16.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3df82f0a3cef4e1bcfc799436056f0b978dda319d0bfd4460c6e479b2802d98a", size = 250434, upload-time = "2026-09-13T19:08:24.948Z" }, - { url = "https://files.pythonhosted.org/packages/b6/a9/31ffc231e9879876f611cf1ac7622cf092d76762c07ca64dce47b29a200b/coverage-7.16.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb462d59146656e278d1e8ed913ce374d0ba68a4e081acde1867f6d3377fc881", size = 252264, upload-time = "2026-09-13T19:08:26.734Z" }, - { url = "https://files.pythonhosted.org/packages/c9/f4/4fb4f6b16de07dbae3d3a111ae28d32ad657ce6ff4d364c49c10962daad5/coverage-7.16.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7db888dd0a1df1a653cae7f99d4047430d2187a3626eda51bc847b0fd6b9b43", size = 254127, upload-time = "2026-09-13T19:08:28.254Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3d/048e88eb610f44b7542dac10fa45bb2ffad5fbfcdab0f03289a843da934b/coverage-7.16.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:38a7e16f061504ac2b45370bf5bf97e8250d8d3f25e37385bae884978166554b", size = 256043, upload-time = "2026-09-13T19:08:30.019Z" }, - { url = "https://files.pythonhosted.org/packages/97/59/d27b113c80b04c7fc64c69457132648e1d287b83a1de41189a504b50b52b/coverage-7.16.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2b26b55b18e1a53e1a159dd743728c4ddbbef28ba19000a91aaff5ce023197ec", size = 251092, upload-time = "2026-09-13T19:08:31.57Z" }, - { url = "https://files.pythonhosted.org/packages/45/42/b7eafaceff08dc1dcbfc924fa9233031fd00c8b8287cc4a1a0dcdedcb0f9/coverage-7.16.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fdb2f528b50953e29d22033b3256c396a700193c6e45b2490222ef9c333cbbf9", size = 252170, upload-time = "2026-09-13T19:08:33.191Z" }, - { url = "https://files.pythonhosted.org/packages/7c/8f/57dcc5360aa6d8d24370c12fe855f6ebf5fbf2718c154fb9fdec7161de07/coverage-7.16.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3284754371dc78592aa3ae4d661d30ee20e02b2b6b0de3590a181a936d0d3b38", size = 250173, upload-time = "2026-09-13T19:08:34.75Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/379a8c7ac0f3063769dc43fd2475e9fc9b2722cb88eabe71f4d862660c93/coverage-7.16.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:802d1246c540e07486d4ee1adfa19a797e4b33529ffc371dc140644e8f27da0a", size = 253986, upload-time = "2026-09-13T19:08:36.737Z" }, - { url = "https://files.pythonhosted.org/packages/45/25/70218d2a6077730843b75ee2525fa64a750283d71cc4c063dc0b75ba6979/coverage-7.16.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6fc735d6fe6d57f803e7ba021be4dde48e43e6aff94e6954350555d5332b0594", size = 250444, upload-time = "2026-09-13T19:08:38.434Z" }, - { url = "https://files.pythonhosted.org/packages/58/ac/6c41c441baa6c8a1fed5615e4e1e7d0ca649b33b472ee28591a92d70a1ff/coverage-7.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed5ade1bb18f62edace1bd198c66f9d4c75a8385d5fd24e87d917ea1a5958773", size = 251046, upload-time = "2026-09-13T19:08:40.133Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f9/01166d6f8aa42acd148b4c2c88173d60eefdd0270ea2bcbba79be35bc193/coverage-7.16.1-cp310-cp310-win32.whl", hash = "sha256:0c309096926b119543dc16438a11ef4c80783d2f4e59ff94f7f462651a944cdc", size = 225242, upload-time = "2026-09-13T19:08:41.672Z" }, - { url = "https://files.pythonhosted.org/packages/d2/28/a76060478919becf0fbea2df2053a6e1a7195f11edf8dfd51c58c1636b43/coverage-7.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:7562f8067ed9360e8b9739e5703403a7686dd1b36bf0f89fc538047c54cdea90", size = 225868, upload-time = "2026-09-13T19:08:43.22Z" }, - { url = "https://files.pythonhosted.org/packages/af/3a/d09495dfd5191b5593852bbe2f037afae768157443378d066d9ecea69a49/coverage-7.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72e013665e25cf9d44779f01f340af26319756f9a76822b7c94ce6b1d93813da", size = 223307, upload-time = "2026-09-13T19:08:44.914Z" }, - { url = "https://files.pythonhosted.org/packages/a3/34/310196a80258e28ebf6e5aa814a5a6ffbb18c03cf3c0c0c04191ed893e88/coverage-7.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb05c0ff98b56ba6969adf35556bc43bcb8d094df8bc9cb403acff53460c4e07", size = 223817, upload-time = "2026-09-13T19:08:46.738Z" }, - { url = "https://files.pythonhosted.org/packages/73/29/ed0fda1fcd440cdfc07e72a07f3c9c3b43f65a6b3d53bff2cba9b9de50e8/coverage-7.16.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0d0ececb32090e3fbb03e0d352b973a0485879b4de6c58daf47227b9988b99e5", size = 254222, upload-time = "2026-09-13T19:08:48.358Z" }, - { url = "https://files.pythonhosted.org/packages/ac/4e/5e2507fbd71ec1047620978f39568b0d2ed6c4468d08495a0c24f5677f65/coverage-7.16.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f0ba3892d81aacf36996c52f16bca04e39af31a6c5de930b7688ab617f4a6475", size = 256134, upload-time = "2026-09-13T19:08:49.926Z" }, - { url = "https://files.pythonhosted.org/packages/7e/b1/a9f97846554bc240473656f9c3874591105f29c08eccf4282daadc6bc281/coverage-7.16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6410b75fe07d5271eaa95fc24bd0a9177ed588d9d1c10c0cf67829adb8f0567", size = 258240, upload-time = "2026-09-13T19:08:51.584Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c3/2b1ab208d06719394851cdd7dc322157870a93b178410b1bda6cac7755f9/coverage-7.16.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1039cb2de093225d597109342ce1675626bd127565e80b3044f4eca07c15b2e", size = 260202, upload-time = "2026-09-13T19:08:53.204Z" }, - { url = "https://files.pythonhosted.org/packages/af/14/ff4db31d6e3126d5b72aab1e868d35ec94e1b71dee46f5c3b54cb1b2438e/coverage-7.16.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cf047bc39fde5425be2628666d0f435ed8817859111c3aacc84b32d858069f5d", size = 254305, upload-time = "2026-09-13T19:08:54.833Z" }, - { url = "https://files.pythonhosted.org/packages/ce/27/c28faa4818f61c49ca3bfb4a77e1c191e79a40447504b89af0bd859cd6fc/coverage-7.16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c05913d0d5badf7ac83200f35dcf9514cce5df16a7cc89e7d1d7fff0461813b", size = 255935, upload-time = "2026-09-13T19:08:56.453Z" }, - { url = "https://files.pythonhosted.org/packages/46/5a/42e64e5b716048cae33e2e15f8c6fe04a927467056c533b8e88900da895e/coverage-7.16.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4027bf6d7bc0a16df058ce913b69f10c5687f8e1ca668f08caa659ce101744bf", size = 253995, upload-time = "2026-09-13T19:08:58.159Z" }, - { url = "https://files.pythonhosted.org/packages/84/e5/860287acd5a1e29acd337f302b476b54148203590091b1a1555b2e914b50/coverage-7.16.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4f48b345f831eaf4402ab6333c2dc3e2e2b5bc7b9c1b8fe12680dee3f0538f01", size = 257767, upload-time = "2026-09-13T19:08:59.958Z" }, - { url = "https://files.pythonhosted.org/packages/a5/c5/4b68006da567b4b413352f891776c35776b3557a0479a28187ab57c21659/coverage-7.16.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8643baeb590726c558b2faed6cd59b0917480f9367fcc692026f1a86d824fd08", size = 253715, upload-time = "2026-09-13T19:09:01.778Z" }, - { url = "https://files.pythonhosted.org/packages/a1/0e/b2d0c47cfbf11770e197f1d0f11a92864eb29fd7eaca45bc9915573d9725/coverage-7.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d06dcc420b570bf683cdb647cc8fe62b672d9e429ef711c3cbbb7a6880ca1572", size = 254624, upload-time = "2026-09-13T19:09:03.376Z" }, - { url = "https://files.pythonhosted.org/packages/2e/14/3bab8821b2b942155578fc34e88e21b0670d922f039ab23651f6035ba7f7/coverage-7.16.1-cp311-cp311-win32.whl", hash = "sha256:946f58aa59b08bcd6afcc6a7bd0ff54ed5eee844f32ad69fe6814836d15856a2", size = 225404, upload-time = "2026-09-13T19:09:05.174Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ce/4f4ce667a97d1c538b46a79b89161395ad2beffc248b6c782afc9f521927/coverage-7.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:684c7ee9b4c04358fe6ac8b517ab51ec35fcd79d08ff0f105dd8bcd96885bbb7", size = 225879, upload-time = "2026-09-13T19:09:06.81Z" }, - { url = "https://files.pythonhosted.org/packages/26/17/f3dce5e47351ab34522dd037fd64b111742958e24861bdd2820971bc1a26/coverage-7.16.1-cp311-cp311-win_arm64.whl", hash = "sha256:1b24f79e25bcf6c73931aeca7a3dfc7595c0cb5e9364aba3fdf387a3de4b1c22", size = 225428, upload-time = "2026-09-13T19:09:08.502Z" }, - { url = "https://files.pythonhosted.org/packages/1a/f7/7cd4c9f2a3b7574414222ec425d5eee21cc690d867a013315e3be8ba185c/coverage-7.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b7f2c26ce6ce0b1e0ca0d5fae96ea510e3a2e78b7207f06e76b7f2c87fa3d0af", size = 223475, upload-time = "2026-09-13T19:09:10.145Z" }, - { url = "https://files.pythonhosted.org/packages/3e/f2/9ac65f9cedd43f91e2d3657c11f13aef82aebae89b2243dc9e44fe58a740/coverage-7.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070acb9da788dff743a4d36fc015feee12d68f0349959017542017c79f59c21c", size = 223845, upload-time = "2026-09-13T19:09:11.988Z" }, - { url = "https://files.pythonhosted.org/packages/62/4d/f13db452d4367fe1122abfd98ae330596f65a3b40498f8e1a5811f68f123/coverage-7.16.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e366587b370bc9b8b51b7b7272c610c56db5d5b4795b9e4a29d28ff2f440f809", size = 255341, upload-time = "2026-09-13T19:09:13.708Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6b/85ed86e82835a96ddfbe7705c387c28ce1cbbecd1b6d606f5ddfeeb712df/coverage-7.16.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e82e10b9d290f60b63459cfb245a841aec347603997206296b93881463a93dcf", size = 258078, upload-time = "2026-09-13T19:09:15.368Z" }, - { url = "https://files.pythonhosted.org/packages/cd/d2/f66945853d850b9c05f4e012e37396f1f31d0cd40d062394b229c22e7b56/coverage-7.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d73bb1f85c4150ac208fb0755beb04b2e44897bad81414de9380f98dd74729f", size = 259191, upload-time = "2026-09-13T19:09:17.046Z" }, - { url = "https://files.pythonhosted.org/packages/77/a1/7b907abe62461f289035c7ac60ab3e6334efb8c425151aac4abfa0c97820/coverage-7.16.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3397b9032553d281ad6a9253b12675b65e0cc8cd7a3b0633cf48872c9eb13360", size = 261452, upload-time = "2026-09-13T19:09:18.756Z" }, - { url = "https://files.pythonhosted.org/packages/51/e6/e26f4d6b1069a2a2fee3238a132f85c5b4c1dc25aebd88e015451ff0bd68/coverage-7.16.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:77890395cf37026a5907d3ad32376aa51f41c0f163b7477fdbd4f94966cc1d08", size = 255698, upload-time = "2026-09-13T19:09:20.786Z" }, - { url = "https://files.pythonhosted.org/packages/7f/ec/99db7450e813050ebce300e31bbd4f997c76a8c6e3a6d168c5dffc104109/coverage-7.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b0944dc3bee3091039bf970d73caaf930c906013128a421bdc132e797494d941", size = 257111, upload-time = "2026-09-13T19:09:22.693Z" }, - { url = "https://files.pythonhosted.org/packages/2e/9d/500df9d3cd8c541ac84b5e0bcab00646be75654e05aa34e8410ec851282d/coverage-7.16.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b89d22a89d5bc05dd95b64e08295b8394aa96dc88e08f8ba210c9ebfebbe0489", size = 255258, upload-time = "2026-09-13T19:09:24.429Z" }, - { url = "https://files.pythonhosted.org/packages/c0/24/53318d96da332bb4946f8ac646fa19fd37fecbd0c49144735c716ac69bf0/coverage-7.16.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:550a2a1faf7559f13d5344f12d1eb886ad87955155d7dfab2a3fe5c8ec8fe776", size = 259326, upload-time = "2026-09-13T19:09:26.32Z" }, - { url = "https://files.pythonhosted.org/packages/c5/ce/abc0462b2e6ae96ae22197d2bc30fe33b6b4e52937e782745436ceb2a761/coverage-7.16.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:55eb268e5b81aefac759766c9162625b06c1bedb7b77d936225bafc4f038a6f6", size = 254827, upload-time = "2026-09-13T19:09:28.191Z" }, - { url = "https://files.pythonhosted.org/packages/8b/e1/0a04eedaaf19196b51f0180968134228c7646e469ed29914e48690a7cf3e/coverage-7.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:65a8fc80898c9ce59f04349fe8b4849b1f9787f14e52ead990e5f849ff4727a0", size = 256698, upload-time = "2026-09-13T19:09:29.922Z" }, - { url = "https://files.pythonhosted.org/packages/de/1d/d441a55cf22ce9d8e9e34814806c47441ab844bd534e0f4b64e1c6ae8bd1/coverage-7.16.1-cp312-cp312-win32.whl", hash = "sha256:528a61be40977c340cf201d23b69bd6a6bab507da60e9dbda85f8b30e935d70d", size = 225541, upload-time = "2026-09-13T19:09:31.752Z" }, - { url = "https://files.pythonhosted.org/packages/73/27/ec3d032375735dd331477caa051419678079ff90fcb53d0284a6c2bfb757/coverage-7.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:d0f02c633630e2b74522108ee95a84ad6e1204a8016a6cca5297f335ea27147e", size = 226075, upload-time = "2026-09-13T19:09:33.556Z" }, - { url = "https://files.pythonhosted.org/packages/94/00/90e9f5c4434878494306b9c0ee8068ebbd829483737d8cefccc58884d728/coverage-7.16.1-cp312-cp312-win_arm64.whl", hash = "sha256:2959978f9d1d20a2c0c15d0a68baaeccf615ac1aa214cf4a05a10d6f568926c8", size = 225461, upload-time = "2026-09-13T19:09:35.48Z" }, - { url = "https://files.pythonhosted.org/packages/aa/74/c08c0c4dc9fa6bcd1d90728a63660aa1b17b488a806948598456c48f75d1/coverage-7.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ee5465db6e9152a7d09f3215309326878c6aa3ac509195a369f9d264ff4bfbd9", size = 223501, upload-time = "2026-09-13T19:09:37.276Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c8/784986d326663285258a8e39835c46fb730cc85284f0dbcd82078586dd22/coverage-7.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b8256f8b525ba233d2e4cdcdce0d6673c66fc9bf70df1fd5e67c54a74e2d245", size = 223876, upload-time = "2026-09-13T19:09:39.385Z" }, - { url = "https://files.pythonhosted.org/packages/15/76/73fb792928872bbb07e553f920ff55c65ee962c469265feb5d1d4ae5f97a/coverage-7.16.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d57cc400275b9a2892e905fc893f732b21ddb95271bf96406c88e2f6367848b5", size = 254863, upload-time = "2026-09-13T19:09:41.326Z" }, - { url = "https://files.pythonhosted.org/packages/ca/8d/1fd78899513244b065ccecdd1cfc6aa8b8f1bdee796d8c4f2aa8e8e5397d/coverage-7.16.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b3fd0f3435ebb7a7183b32a6062a8b755f08242ced1f3f22761d30b56b3c2a5", size = 257460, upload-time = "2026-09-13T19:09:43.086Z" }, - { url = "https://files.pythonhosted.org/packages/47/1c/b23ddfcb7ef9bd7b3fdb7be9a5dccf9925ae88e556df7aa5b655283c78f2/coverage-7.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e5eb1762e7eb5fad34ef913e8107c7788a66f19d328e598ce95bf7217f9e5c8f", size = 258697, upload-time = "2026-09-13T19:09:45.161Z" }, - { url = "https://files.pythonhosted.org/packages/1c/c9/19d0c6ca35778a7e9415c30c46a0c64c9d4374219d004a35563132296896/coverage-7.16.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:46cd3a73e9140410de62cceb66214bce0e08fb3922b9176fbfc1522fec151b41", size = 260827, upload-time = "2026-09-13T19:09:47.061Z" }, - { url = "https://files.pythonhosted.org/packages/97/fc/5862f7344382c62b85df43d483e579168cc062e007f54d895dfa51fe3e7d/coverage-7.16.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d1ba5142d68dd2cb775cbd0ac8601819298152047803c8efe4eec6d7d7aa7878", size = 255038, upload-time = "2026-09-13T19:09:48.945Z" }, - { url = "https://files.pythonhosted.org/packages/2e/9f/5c26583199a68df8d15124b4590520903f8eb7cef17db293fea712bb0783/coverage-7.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c389c6f9d1d518e1249ddcb8a7f158135644ce2c508fa6cc17b680777dad5bf2", size = 256827, upload-time = "2026-09-13T19:09:50.738Z" }, - { url = "https://files.pythonhosted.org/packages/95/13/605198bff079b107336710f28a797312ab132587168600d70a290e7ecd2e/coverage-7.16.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cdc57746c7ac0ea063351b4d651c3bb4dd4fd35e64dbb8e90c10e14eb03c4080", size = 254794, upload-time = "2026-09-13T19:09:52.577Z" }, - { url = "https://files.pythonhosted.org/packages/43/b7/0bbb32dc5ccdac766a13763fdfbffd7d73fc80349a69230c46c6b71e7508/coverage-7.16.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5597180ed7670cc94c04c65347418a467d3a43d5f0cf52fcac647f5425f42037", size = 258947, upload-time = "2026-09-13T19:09:54.372Z" }, - { url = "https://files.pythonhosted.org/packages/13/bd/65c31ddd43ff4e61b63721b3dad17cca412dba6e2ce89f92abdf75734339/coverage-7.16.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a9647a0ac46255b8fef59a433a2161f03e5483f3a35e1cbd9dfe4600baff0c6b", size = 254613, upload-time = "2026-09-13T19:09:56.198Z" }, - { url = "https://files.pythonhosted.org/packages/25/20/d278115f2ba522b3e3128c6852be265f4e0df7202b2effca4db96cf0217d/coverage-7.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e306e98186b9cd109121f3583aeb7978797ad21d948f22944c5c08845cd554d0", size = 256388, upload-time = "2026-09-13T19:09:58.095Z" }, - { url = "https://files.pythonhosted.org/packages/e1/ca/d43aa396fb3a2f71c9411b99d926475f5acaf5c124f605c592865c80c8d5/coverage-7.16.1-cp313-cp313-win32.whl", hash = "sha256:48a78a66fcce49d7f6156524bf979c0ac633d584199717c68c6ffa949fc14e6a", size = 225550, upload-time = "2026-09-13T19:09:59.998Z" }, - { url = "https://files.pythonhosted.org/packages/0e/30/df2f6114f6a17cffe94721bd1d298f77f86aad493717fa5bc03cb291a1a6/coverage-7.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af03247d598a353bbbbe1b925deb735276e4d845e7197c4073dc89352b236fa", size = 226091, upload-time = "2026-09-13T19:10:02.331Z" }, - { url = "https://files.pythonhosted.org/packages/ee/31/6f90d8aab72a112492bd50e3b5485b53b772b1f5fa70da0a620e723caae6/coverage-7.16.1-cp313-cp313-win_arm64.whl", hash = "sha256:166adae25b05b04c9a84135912066d9c97482115af38df1a419a38aacc6b6f5d", size = 225481, upload-time = "2026-09-13T19:10:04.151Z" }, - { url = "https://files.pythonhosted.org/packages/8e/b4/2a7c793965bae9f067aabab793a44d7a2f3ee7fb16b01ce1976bbd4a0218/coverage-7.16.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:cc0b37fe6f5ce5f1ccc62ad4fa9b1ad201d8e9b6027fd5e0170877beee4b2d15", size = 223546, upload-time = "2026-09-13T19:10:06.019Z" }, - { url = "https://files.pythonhosted.org/packages/ef/e2/633469076a2dbbea036cc15a268a3a5d6b2c7dd5d9a9567b2553dfc5ad61/coverage-7.16.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6618f481053b63fc6121faf8fc676bd9b7163c2a19d9e984a2e850002c28ab57", size = 223881, upload-time = "2026-09-13T19:10:08.246Z" }, - { url = "https://files.pythonhosted.org/packages/de/c3/f06150c13284569d53273b909f31222874276a595637b7852571dfeb2c18/coverage-7.16.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fa02d561eb1d8d2f8ba43ba6e3cef4c6c402a3b632a9460fa329fcadcd5df6a3", size = 254919, upload-time = "2026-09-13T19:10:10.254Z" }, - { url = "https://files.pythonhosted.org/packages/d5/40/47e25b215ae18a29010c8e29be8782a6e04d18ba6224be2bf6cebfce6427/coverage-7.16.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bc5354a124799f1f87b7637bbe6f18cd4bc66a1f37f6aa2b5db40f9adad531dc", size = 257428, upload-time = "2026-09-13T19:10:12.124Z" }, - { url = "https://files.pythonhosted.org/packages/27/4b/1e2a4267d14cbd12a8489364a9d40020233e6be836d929b363f0e77209e2/coverage-7.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34bafe9f4094315248573e6223e11af0ec1b25f9cbca43bf0e9a26a189ba2751", size = 258771, upload-time = "2026-09-13T19:10:14.031Z" }, - { url = "https://files.pythonhosted.org/packages/be/2e/9aa6146cea929fab9185bb2642ffef7f47520a6e5efe407f75f9b12f4cf0/coverage-7.16.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:29c4d3e32a3b5efa420a3dc627c7e570deb80ef997def52c7686a474f5edc7ab", size = 261086, upload-time = "2026-09-13T19:10:16.213Z" }, - { url = "https://files.pythonhosted.org/packages/13/3c/f9ad8bcd4fb3d21c9d20a16d6d6c6f999eee8f4498ed7659a3dbd2f4b74a/coverage-7.16.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2066c447fdd0bca39a9633a082d8ce67bf9a539a203b85059a364a405dc9fe9", size = 254895, upload-time = "2026-09-13T19:10:18.602Z" }, - { url = "https://files.pythonhosted.org/packages/b7/d1/47eda9fd1eaeea39fa7b5b13a63b2bed92ab901841fb120b3f9f5e1dc30c/coverage-7.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd8ac10cd2458b3c6343aac082fb9bd0e3fa806cb2c4975f2280153474b88412", size = 256783, upload-time = "2026-09-13T19:10:20.778Z" }, - { url = "https://files.pythonhosted.org/packages/38/c3/565edf044877cb8cd3373c56885347ffc38f0edfd1f1679a487b208c19a8/coverage-7.16.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d8c54ec32e5c102b9241f75d88ae26538b53662868ca491736611db448d9c7a", size = 254742, upload-time = "2026-09-13T19:10:22.733Z" }, - { url = "https://files.pythonhosted.org/packages/fd/88/87d2b2aeaba719192b2089ff1c2cf89a06cf73a6d2e9f1f145626617700c/coverage-7.16.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6dd8dda3402a01a1a8fe8b753a282466f615128574a5590a9108acd07b1f8540", size = 259016, upload-time = "2026-09-13T19:10:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/fc/1b/70813185b125768abdcf7899fec4d37edc2e5fc9b60c7045c8f4271ec757/coverage-7.16.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:79afa9726438912e5cddd1fe541815cea9763c92935f594835e4c432565b68a9", size = 254559, upload-time = "2026-09-13T19:10:26.781Z" }, - { url = "https://files.pythonhosted.org/packages/d8/fa/e7aa5af279aafda633a1ede8bfd7d6916b0c8b2082be86759e0b52e73a61/coverage-7.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3db3978211c3cead5437a80136ca0556bab8bc7828de15a762884b0598c41361", size = 256215, upload-time = "2026-09-13T19:10:28.714Z" }, - { url = "https://files.pythonhosted.org/packages/38/87/7a894fa4f8c6662d2b6a87a3436950e15b1fa56e01765c9d6634fb2cbeb8/coverage-7.16.1-cp314-cp314-win32.whl", hash = "sha256:49c39c7068a494f8eb427155f5682f44feee43f9b3107fd54b1e52465379c54b", size = 225719, upload-time = "2026-09-13T19:10:30.743Z" }, - { url = "https://files.pythonhosted.org/packages/8b/01/fa7193c8005fb85488f02b0e1cc3c05a233cf2640206dd978af447aeecbf/coverage-7.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:c510dad19552d912058e4c3e3cbec3fb155dbe8d0ce0ceb7e7dbf5c5822bae0b", size = 226208, upload-time = "2026-09-13T19:10:32.698Z" }, - { url = "https://files.pythonhosted.org/packages/da/5c/a08634c714924c3eaef811bb3576c044128aa5e7dfa86c75e52f0761849e/coverage-7.16.1-cp314-cp314-win_arm64.whl", hash = "sha256:b7d4d7e6dcaf33e85f1919f03346403bdcc27437c420a78835f3805bca0ab71f", size = 225633, upload-time = "2026-09-13T19:10:34.79Z" }, - { url = "https://files.pythonhosted.org/packages/43/df/ddb8a4c664046b1a0ee29c9c2d25b993e5dbc8fbde715df3694a64532781/coverage-7.16.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3d0a3681c12d3e0bcdea3d9414b04087828d6c1a482802d6f7f42c37ed530152", size = 224281, upload-time = "2026-09-13T19:10:36.853Z" }, - { url = "https://files.pythonhosted.org/packages/e2/d0/9076e0c762d8afd91182e60a520fa5c92c4a334785eeb9fd6b8ef8fe7e3c/coverage-7.16.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f3b4469d3da3ecced775d1a8c9c5d9fc80f259e30b7b89f9fed0700d6035ecb", size = 224547, upload-time = "2026-09-13T19:10:39.359Z" }, - { url = "https://files.pythonhosted.org/packages/03/e5/9c59e64b6161704f35fe91549bb19b2bb355e95caf596c26a2065564807c/coverage-7.16.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c08ae35c1be2fe1ce4b4c628df5c6fc0dc9a87f8e5fe8e20238d249678984741", size = 265906, upload-time = "2026-09-13T19:10:41.434Z" }, - { url = "https://files.pythonhosted.org/packages/57/5a/13ccaffb77f766101bf6f38be9dba9e468b02cc92da4552a57877dbf1c1f/coverage-7.16.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8ee71a38c54bb2676bbe762b8b0943a79ccb1c2fd6a52054f66e63eda392f8c1", size = 268023, upload-time = "2026-09-13T19:10:43.533Z" }, - { url = "https://files.pythonhosted.org/packages/ad/a1/05cfcf01d3c7c922832698ad46e51d3441d820ce87a943014bb5cf5710dd/coverage-7.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76491917771f179f9772efe218c5ccc65950dbdb35f4439298d8a8dfc6ec1f72", size = 270442, upload-time = "2026-09-13T19:10:45.895Z" }, - { url = "https://files.pythonhosted.org/packages/72/15/a2f1544b8e3835d7b769f7dabcc9ac0283e0b646ef3344703ff8f18d83e6/coverage-7.16.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4aa0b0a6f81fa3deb211e643f6954e78b4376b62b9c218271236cfa757664e8", size = 271565, upload-time = "2026-09-13T19:10:48.123Z" }, - { url = "https://files.pythonhosted.org/packages/df/5b/963c2993a82bd313f298d663afe03e164b96ace4d9d4c7561740a559e13d/coverage-7.16.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:756ba2d96d073c5a2a55d67fa22784763710fadbe22c41adde2d9cfa4dd78a8c", size = 264959, upload-time = "2026-09-13T19:10:50.195Z" }, - { url = "https://files.pythonhosted.org/packages/12/59/5eba06d1943735d7cd61d46d8c8a20ffe8ddd2da06b3c94366078dadeb9b/coverage-7.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:99bf9ea435cefcefd220f8687c3ddbbf78dc2de0bd11b57c3ae9fbbdf8d5561a", size = 267897, upload-time = "2026-09-13T19:10:52.252Z" }, - { url = "https://files.pythonhosted.org/packages/bd/48/af6c30f6ea431bb9b83f9070d268a9cc4fc97490abd32080164177ea999f/coverage-7.16.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:35cbc81f937fc402971df45c897d2df2bfb2014efcd990360032aa0a651635da", size = 265504, upload-time = "2026-09-13T19:10:54.432Z" }, - { url = "https://files.pythonhosted.org/packages/80/f2/6e13852a8656d05fa83284567dd5a5b1e6d89bef79fe3effca2787159eab/coverage-7.16.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:8fae08e85b334ac6ac886002b5041396a31bcf805225bbe19847627203da99e2", size = 269235, upload-time = "2026-09-13T19:10:56.563Z" }, - { url = "https://files.pythonhosted.org/packages/c2/32/b4fe465daa64ece674f83a750dfa4ba0fa3c5c74d6ef5dbb8dfce892cf0d/coverage-7.16.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:83362b64e215ef00b0ba33fcf13655ace6c9fdd144d5ad2ab59ac86c2daf166e", size = 264347, upload-time = "2026-09-13T19:10:58.634Z" }, - { url = "https://files.pythonhosted.org/packages/54/f3/88b5c0e4ca3994c6d5feb7b1bf4c9a62cee205553159184968426930a7b1/coverage-7.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:33300f2e140ccf26af3d8152e62bff71993f9310cfc63ba7a20940b0d246a0ae", size = 266660, upload-time = "2026-09-13T19:11:00.746Z" }, - { url = "https://files.pythonhosted.org/packages/97/72/6eff5456d7ba7f1c4678af531c33f9d957cae3201bd229b056fd13a204a3/coverage-7.16.1-cp314-cp314t-win32.whl", hash = "sha256:5539304fdbb2cc144df684d35a33b81145334d23e1c2367b5a923d25107f70b2", size = 226026, upload-time = "2026-09-13T19:11:02.846Z" }, - { url = "https://files.pythonhosted.org/packages/8e/c8/6e5ae3d8d4d0f2c0078985bf4db55fafd90e8107b1bf91ee3547a13f5694/coverage-7.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:715dcb72c3280c428c3a20134b87e42c29acec9669136e899ab2de69ca86218d", size = 226862, upload-time = "2026-09-13T19:11:04.921Z" }, - { url = "https://files.pythonhosted.org/packages/be/c7/68f9f0734afc904a92b974b489545b6a15700f3b1c4bd36eae764561e661/coverage-7.16.1-cp314-cp314t-win_arm64.whl", hash = "sha256:dac8b84c03e6029d272b8249c77018db83de59ca009a9adef7c144b4a62ee5e6", size = 226171, upload-time = "2026-09-13T19:11:06.969Z" }, - { url = "https://files.pythonhosted.org/packages/ae/16/e11addf5322d98e86307da9e00c94644b97cb72c534c74cda89705bebeef/coverage-7.16.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:a337dc2d54c74430cd2febb8ee04f7c508ba8b3b412bf0463f077a66cfc73743", size = 223544, upload-time = "2026-09-13T19:11:09.108Z" }, - { url = "https://files.pythonhosted.org/packages/92/d9/7ccd6484f615961d94b09c75904f87d86375109596069ae3a495a205dbbe/coverage-7.16.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:3acd1d78397dead78dd1b011b5fc19cc823c190349acd549e63856dff649c80e", size = 223882, upload-time = "2026-09-13T19:11:11.132Z" }, - { url = "https://files.pythonhosted.org/packages/59/37/2fd78152a557df4a7e4ad78d6851ede90c211838d526e4916c6016f45144/coverage-7.16.1-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:73a32694603a34ad01d7e51a481a4023410d8099e1d0757e067945695c10f0ae", size = 254987, upload-time = "2026-09-13T19:11:13.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4a/58e2f9b8b13cc422aa7f474a498945ec7f446ef473b5b6bae18d2981f2a9/coverage-7.16.1-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fbbe8265736659a6be2e6042b6a35be13545d14b243cc1d7ecf65f90d788a370", size = 257902, upload-time = "2026-09-13T19:11:16.025Z" }, - { url = "https://files.pythonhosted.org/packages/3c/74/63f8f6a67c03b86455c726be273b2aa5b57fd1122f22350d141bbb142e91/coverage-7.16.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b0359eb4c62f9993e176bc8f50450fc736a6b90dbcc05bb8584e948812699ae", size = 259522, upload-time = "2026-09-13T19:11:18.206Z" }, - { url = "https://files.pythonhosted.org/packages/e2/3b/1f2261da7483e345fe55de11e41ffc16a543511e37c0912134c0dccc4f6c/coverage-7.16.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:da506e669a8a851b59e122b4b219ea70996a6296f44f3a9348a852526ff961de", size = 261723, upload-time = "2026-09-13T19:11:20.628Z" }, - { url = "https://files.pythonhosted.org/packages/a7/8a/7eb1a361e044b7293f49c921a974b532627ed37f3bef5e7e9f58bcd0d5a2/coverage-7.16.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:64a2a5985d81810ed605ff0dc4ccd6555efcb5700353825532a9a0aea65826e1", size = 255462, upload-time = "2026-09-13T19:11:22.733Z" }, - { url = "https://files.pythonhosted.org/packages/67/66/6d94f7ea87e99c519def5cfa5d4a1ab20247d6b403eb6e6b5b63d6aa5985/coverage-7.16.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:66d70132b69b861805dc1ca46cdd733e54c416890e8f1371d2fd103f70b59c9c", size = 257617, upload-time = "2026-09-13T19:11:24.933Z" }, - { url = "https://files.pythonhosted.org/packages/3d/52/c3de0a3868589a1463a4f1cb0222eca0e5fa9f91da865ccf20d2e19ec19c/coverage-7.16.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:db651a9cf325a542bc2b7b8cc8f1b2bdc6492739bae3103731b2f1c85b96cff6", size = 255495, upload-time = "2026-09-13T19:11:27.158Z" }, - { url = "https://files.pythonhosted.org/packages/9e/a3/ea10e75f20fc1e7be10b166a494826a965d19b1dc9c8a81c511a01153311/coverage-7.16.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:4184e78a4465dcda359fb403172b8951dd220929cb0984c02fabca1742fff06f", size = 259728, upload-time = "2026-09-13T19:11:29.33Z" }, - { url = "https://files.pythonhosted.org/packages/0e/96/9d8020d97de46f0390739beda196322586cdd87e1fc357223e6a28bc4135/coverage-7.16.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:bc53c3f3adaa939b7a063533ffe0ae1259e7073393c618043a99a6970a87e3df", size = 254904, upload-time = "2026-09-13T19:11:31.86Z" }, - { url = "https://files.pythonhosted.org/packages/5b/21/2ff8867d4560f4f639a82d8fcf13c27eea88a96193daba096027c48bb929/coverage-7.16.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:b44308854ef210b9b78df9cdfd4e159513382a859f5ef8464306d14a54c2a040", size = 256828, upload-time = "2026-09-13T19:11:34.078Z" }, - { url = "https://files.pythonhosted.org/packages/6a/4b/feacad51cb5163e3baa13281f8a3098f15d7934cc1f28cfe656557eb4e46/coverage-7.16.1-cp315-cp315-win32.whl", hash = "sha256:dccc142614d3419ed71857deb43f1d757829a4c7fce9994464b71e7e38309827", size = 225722, upload-time = "2026-09-13T19:11:36.314Z" }, - { url = "https://files.pythonhosted.org/packages/39/34/66bbc6ffd3c51fa67604c566920e772c5e3baa57f88dcf7b109c7f18b2cb/coverage-7.16.1-cp315-cp315-win_amd64.whl", hash = "sha256:961fc424e9d5229a99f8f1189942d8e7f4e1519147c3af64842f944aca03914d", size = 226195, upload-time = "2026-09-13T19:11:38.493Z" }, - { url = "https://files.pythonhosted.org/packages/f7/96/4bad920d4caed127c37c136a64b0730fa495517d2eb58809e0d81e6e7dff/coverage-7.16.1-cp315-cp315-win_arm64.whl", hash = "sha256:681a9488c5a234397c4f013da065aa9e53eb7af4c78f1f80c6f15e7208acb855", size = 225625, upload-time = "2026-09-13T19:11:40.664Z" }, - { url = "https://files.pythonhosted.org/packages/f5/2b/a88c7906eeb7da4394e932060d7008e153b3a2cd8d11782d82faa03bb7a3/coverage-7.16.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:8bb09a2d19b04db1fa0e087a7ca4f12458f7e0e7364cfcd838441d86fb1c61f6", size = 224271, upload-time = "2026-09-13T19:11:42.876Z" }, - { url = "https://files.pythonhosted.org/packages/1f/1f/98db59c595680d16f553890deac6d72610e04f192c1964ec9b69cbe790ab/coverage-7.16.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:2270a794600b635ca9452ce4c32e2fe81a35f9caa17ffac0eba99f14f275bd4d", size = 224564, upload-time = "2026-09-13T19:11:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/699e236d4cb97ec282b0655afc85acf12349e71a02fff0f1a7d0fb643079/coverage-7.16.1-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a4eff405b545dfcf79cf0d9d3ff750e5c5a887aa066114175193a81d249c5ee6", size = 265423, upload-time = "2026-09-13T19:11:47.666Z" }, - { url = "https://files.pythonhosted.org/packages/96/1b/6eaa21912863b3e3bf23cfe605fb62929bb1a41dc33d2bfa8e92000232bd/coverage-7.16.1-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ee1d5fc9e3bd6a217906929cc97880239a91d20dae7746f538eb0eefee705ab1", size = 268503, upload-time = "2026-09-13T19:11:50.12Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ac/4eb46bffa98c28a80559a58c12f17e19308d52b31174af1bd49decf76606/coverage-7.16.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4ec944947de098ad5a1738413f9364689a57067ecbc328e9de37218aa1e5cc1", size = 271059, upload-time = "2026-09-13T19:11:52.363Z" }, - { url = "https://files.pythonhosted.org/packages/ed/d4/17a51ef1f6a084c9abbead522cfbee0fe9d29a593128781e724b7a0795b3/coverage-7.16.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3f73ee3956fde2d461c9e2955dd48166e4821fc8587d135e8780fb84da2a098b", size = 272039, upload-time = "2026-09-13T19:11:54.935Z" }, - { url = "https://files.pythonhosted.org/packages/4a/ff/9fdeba8b8aa0848030f45f869ddedc306795a8c6e53e901b8553afbf5415/coverage-7.16.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ec9a4ee989c0d06ad95add0dbfdbb72b00ef53f43431ca0b612384e7878e5de", size = 265869, upload-time = "2026-09-13T19:11:57.423Z" }, - { url = "https://files.pythonhosted.org/packages/95/eb/ab3eb506b2e4dd278440fbbbc7ed18424a86d8a981db0b90fdba66f5d34d/coverage-7.16.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:7e5727b2508f817f3126d6c33327dda32fe69d15514badfcd61db8bc4209ecef", size = 268883, upload-time = "2026-09-13T19:11:59.71Z" }, - { url = "https://files.pythonhosted.org/packages/d5/0c/f4edefdce33f01954a74237df5ee83ccef5dcd1165e04abf0adf47543fca/coverage-7.16.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:19a3ea2f364012ef06678118fffdc92442a16bef4a5c8ad4f4019dd8f9ac8876", size = 265359, upload-time = "2026-09-13T19:12:01.953Z" }, - { url = "https://files.pythonhosted.org/packages/df/86/ce5ed885fc7ce2adc9a5971134ace257d0f84f19c3d117da89c179b9662e/coverage-7.16.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:996c2b891b441ec2b39725ee3e8386e2f11b4894b92be225fdfd54a3eeada2c8", size = 270056, upload-time = "2026-09-13T19:12:04.46Z" }, - { url = "https://files.pythonhosted.org/packages/48/a1/5dbd5f95070cece25c6df9e6ea4ded2a87dc695ce82a49bcb2116452b342/coverage-7.16.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:a125fac1f6b1e88488d208a86b578e1790e3c4937f2e1568d23356141d236220", size = 265498, upload-time = "2026-09-13T19:12:06.811Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ff/254b26f3300f87c7c53ac97da41ae75f0e2ac066aa964bc073c0f3750b38/coverage-7.16.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b10095528b866d322d33d6bf1709b7f8cbf959f12e8cb2ba22fc59c8717866b0", size = 267459, upload-time = "2026-09-13T19:12:09.479Z" }, - { url = "https://files.pythonhosted.org/packages/61/20/bf9958f8ddbbf6a2d39da3d4009f33e0fcf19c2d2fd99715c6494cdc8e8c/coverage-7.16.1-cp315-cp315t-win32.whl", hash = "sha256:531d9be377fdcc05593b974656872eb82e808ebeb42a72515e3aaeb8bb7166f5", size = 226021, upload-time = "2026-09-13T19:12:11.933Z" }, - { url = "https://files.pythonhosted.org/packages/35/8f/12d46948704d9e437c8dca2718e5d54ecc2f85396b64b500c29d8dbe10db/coverage-7.16.1-cp315-cp315t-win_amd64.whl", hash = "sha256:46a88f51770df7c9bc376bd57d3f86cdc7624b8e16ac4b585a655c22b7a1b4db", size = 226853, upload-time = "2026-09-13T19:12:14.254Z" }, - { url = "https://files.pythonhosted.org/packages/a5/7f/1ca5fd0601054fce5a3539375b997e67683646e2bf62f60c41e70b529fcc/coverage-7.16.1-cp315-cp315t-win_arm64.whl", hash = "sha256:7580432cbe1e8b762660ae5806f04f869e1c02e519836a43f8094437e561e9f0", size = 226163, upload-time = "2026-09-13T19:12:16.589Z" }, - { url = "https://files.pythonhosted.org/packages/96/1a/d6d16babd0a5fe4c3fae40702158c570351694e74516d8d81b86c5637448/coverage-7.16.1-py3-none-any.whl", hash = "sha256:3d8bd4e58b6a5c2018d808f297905393c6c61da466a48c3f0596a76a4900ebe4", size = 215264, upload-time = "2026-09-13T19:12:18.895Z" }, +version = "7.15.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/c3/4f2195f512fb172aa425a8803a874b2baa9ba7f80ff7b6080998761fc701/coverage-7.15.4.tar.gz", hash = "sha256:0548198fff07ccf4faf469520bce1c2eceb1ce3e62891921138dec10907f9d00", size = 936952, upload-time = "2026-08-06T13:50:24.442Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/70/b052a519a584663a7bd052841a2debe11c8309ec49a7786340003f9c0a02/coverage-7.15.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d0be6daac4cce6b8c8dc65886bae1b082ddbca4da8e5cbb5e15166acf253e264", size = 222245, upload-time = "2026-08-06T13:46:55.253Z" }, + { url = "https://files.pythonhosted.org/packages/67/39/892fa511aba3d1c3c8f49509a0ff5c71eab9f9f88d08e1a38da395821660/coverage-7.15.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b24e078eabcd6a9caa8b0713f9bc1eeb310bcc960a29d45a3b4fcd4b16d5b11d", size = 222762, upload-time = "2026-08-06T13:46:57.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/95/b2c724ce1e64bc23cb5b1d7eeffa9548dc3d811f7a6297b2d01607f4e062/coverage-7.15.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe20cc8cf8821d4fe54f89106cbf06aa27f37b5bbe3535568065a81539b4150", size = 249498, upload-time = "2026-08-06T13:46:59.012Z" }, + { url = "https://files.pythonhosted.org/packages/0b/4f/b1973f67a1382af65b572a31ed692f8e490a6ad707191eab59148376832a/coverage-7.15.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:83cf06cdd687677742caff1a9134833b7a8b75f111519d2cb0e0ba1b9a851e15", size = 251328, upload-time = "2026-08-06T13:47:00.764Z" }, + { url = "https://files.pythonhosted.org/packages/a2/09/03efa6722a132abcac91b32a60b64b240dd707c189c64eee697e48992c96/coverage-7.15.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8fa4de68e2a752468ff14b4e15db7def689a71be759e826a31ccecbef69c5fd0", size = 253194, upload-time = "2026-08-06T13:47:01.976Z" }, + { url = "https://files.pythonhosted.org/packages/45/63/8299201d9c80fb65551ce99c966cab83d706ec4066ac999bef08201346de/coverage-7.15.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4dff9daa47d83120c3ec38ce921214242944a832aa04e903e50b5b7ebac8972d", size = 255106, upload-time = "2026-08-06T13:47:03.281Z" }, + { url = "https://files.pythonhosted.org/packages/ee/16/26fd8a691eb8d9a230128685f6d23309d7402cb030aa553001788c8c50fc/coverage-7.15.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a093fd37229918976f602aa07aa59e0973cde82186f220c8e197f721f5be0ce4", size = 250177, upload-time = "2026-08-06T13:47:04.713Z" }, + { url = "https://files.pythonhosted.org/packages/ad/ef/3c7556f33783a0a566e01443ca62bd8eb2cdfe22d271efdc02e08beb5654/coverage-7.15.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:317db01a2cb02552fd67e2b1cca77a4b528a2a277176c5e0bf2cecbb639d3f54", size = 251234, upload-time = "2026-08-06T13:47:06.104Z" }, + { url = "https://files.pythonhosted.org/packages/29/49/640a34043edac950738f36a3567832db5731d4cb2ed84b59cdb89c6bccbf/coverage-7.15.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8ee3838dcb656602c3b51e16aed9bfb0822f8d8d6d1c5966d32ec8c104be8e20", size = 249237, upload-time = "2026-08-06T13:47:07.467Z" }, + { url = "https://files.pythonhosted.org/packages/48/f5/e80f212669dd1be954ff844f883ef11a437ef4fd0089c6e0effc7b66b15d/coverage-7.15.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:425920379052ff1fe465268f3361d35804a241bbdd5a1b592c8cb60df4c52325", size = 253050, upload-time = "2026-08-06T13:47:08.748Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e9/e5da0fe39f7fde1bca9edc09c60921bb5fdba4cec7db5bbad41ddfd8c230/coverage-7.15.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:69bb2400abef928e365ea7d4d9925169ada78ed2295546780002d4b65de3df88", size = 249508, upload-time = "2026-08-06T13:47:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/7d/38/41bf25774a0c8bba6b467f917cb1c9a0a2605e02dc93aad489fc7050ed59/coverage-7.15.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:81661f82d302484e3119e7c80c519c02fa9bcc2a6b339baf67d67bc89c580f04", size = 250110, upload-time = "2026-08-06T13:47:11.35Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/26f2e54b79acc29d179ee4272922625aedb69198c4eb61f7ff4f098f3c78/coverage-7.15.4-cp310-cp310-win32.whl", hash = "sha256:cb476b2e828ecb71cb6b6a928d23fd20a7ddb501188022dae1c37499149cc338", size = 224294, upload-time = "2026-08-06T13:47:12.753Z" }, + { url = "https://files.pythonhosted.org/packages/7b/06/9a318fc3ae040d4d6cb2d86101c6aa963fab20899a5c58666adf52cde0ca/coverage-7.15.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fc2130bf37df31852a8384f12601563a45a0024bccc6624f38355cba7a8d360", size = 224919, upload-time = "2026-08-06T13:47:14.17Z" }, + { url = "https://files.pythonhosted.org/packages/2a/66/edcec7d7a0b524aa8923e22925fde6fe50ce005a113dca13ae1581455c4c/coverage-7.15.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbac5abad70df71019988f83f26ac7092ff2642975def4429e98dc7585ef3490", size = 222367, upload-time = "2026-08-06T13:47:15.578Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c6/ab8de429e2e8548faf58ec7e1674a4ce00414b4113942d3fe87109cf0f68/coverage-7.15.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:357a173465c7ce028d07a95cc2b63b5bf59f50ecdd5ad75c5cbb78ada984048e", size = 222874, upload-time = "2026-08-06T13:47:16.961Z" }, + { url = "https://files.pythonhosted.org/packages/be/c4/3b7b49587e8a6b9af79b3eb468d443d6042b6d65b47aa26586846a0d6566/coverage-7.15.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:21b803935e2efc3acebe9697197a294fccf5dc4e5382bd6369542ff7a7d2a1d7", size = 253287, upload-time = "2026-08-06T13:47:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/fb/65/ec03b743a2a229c72cc1eff3e57be9d3564e9c6b4d5aba2d70744a3fc0d8/coverage-7.15.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7a2b580774a4786c1053157c0165e04476e03ff293993d7c148eee784a94bae6", size = 255199, upload-time = "2026-08-06T13:47:19.765Z" }, + { url = "https://files.pythonhosted.org/packages/41/4b/5163729e4b6582d61975cfd3ccab45b4ec53e21cf156d9941cb025188468/coverage-7.15.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9464451c4efffe8d47ace5a540b10b0dc10e879066290f8600872b7f54a419d", size = 257308, upload-time = "2026-08-06T13:47:21.206Z" }, + { url = "https://files.pythonhosted.org/packages/86/08/2167a0f08fb87d702fa423a48578a32865464b7c9e1db3911ad7812ab414/coverage-7.15.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de602f34123c2f4af1c1869c6dbbbd60da6d5983bf01937367295d135cccbfce", size = 259268, upload-time = "2026-08-06T13:47:22.503Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e5/68eebae3053dbd48508edea559c21b23fbdf3460784f91370c83a86a6acd/coverage-7.15.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6879ded16a27f3eeca19b900c147e81616e7054db451471a611b2755ee5249f7", size = 253392, upload-time = "2026-08-06T13:47:23.88Z" }, + { url = "https://files.pythonhosted.org/packages/1a/46/fd4ced40a2b691c774e515c9b69500bfa64c7960b67fcee4b2f6fad97fc3/coverage-7.15.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:986be58c3ab54aae8d3496a6225eea74f760fdbe739b38bd442c7e8d133aa53b", size = 255001, upload-time = "2026-08-06T13:47:25.469Z" }, + { url = "https://files.pythonhosted.org/packages/53/25/ae2e5fa710bb6957a9aadeb9e3598d3b3e4af6587ce857ad42e8639a3f30/coverage-7.15.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c6103639613fe6c1e989082948419bc77a2d26b6c825c99d7fad25f7d3d87afc", size = 253061, upload-time = "2026-08-06T13:47:26.845Z" }, + { url = "https://files.pythonhosted.org/packages/d7/31/67ddc0365db2c6e93ac8580bc4bbc50f65273262f973f63ebcdbc15c0495/coverage-7.15.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3af93dddb5659276c63bc16ac6466ac2033a70ca816097bbc06345b8ccdf571", size = 256831, upload-time = "2026-08-06T13:47:28.217Z" }, + { url = "https://files.pythonhosted.org/packages/f6/78/82b8fd18f57fb13f12d98fe874995bb2c4f9f17be8aff762c426323fdb96/coverage-7.15.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b10075e5421d04265766a6d1dac809bbeb8a946fbb23c8f82c227409b2190719", size = 252781, upload-time = "2026-08-06T13:47:29.712Z" }, + { url = "https://files.pythonhosted.org/packages/0a/eb/6c74ef4dd12b252e573c49bdef9e2ac265bf3dbb79b8d7feb3266e084e9e/coverage-7.15.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a67a9f78b2942d87ba8ce3059c642164d2aedd65337377fb52fe9803656bc5c7", size = 253692, upload-time = "2026-08-06T13:47:31.192Z" }, + { url = "https://files.pythonhosted.org/packages/5a/66/eb9aed1c3fd2d36ee00eb173f434b14fa607fc056739c9a89ff4244010ea/coverage-7.15.4-cp311-cp311-win32.whl", hash = "sha256:69484d1aca26e322e1c3ce03f09341e84524ababad2d7202161738d83cc9f82e", size = 224461, upload-time = "2026-08-06T13:47:32.572Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6d/81fa4161dfb3ed9d74e40d58647eff83a56b7612e78352581280fce2f477/coverage-7.15.4-cp311-cp311-win_amd64.whl", hash = "sha256:63fd6fcd1dd6e158f7eb78606e72933b3f6d01e7b747f99c6c12d764307a0fdc", size = 224937, upload-time = "2026-08-06T13:47:34.205Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c1/d8dacf683c6cad3cf85ce68fd3774a6774ec402128822fdfaed920f11e6a/coverage-7.15.4-cp311-cp311-win_arm64.whl", hash = "sha256:ea82116c9893fa89e929b7f197ee5a1950a76e91cc5c85ba503fc02379d04890", size = 224479, upload-time = "2026-08-06T13:47:36.118Z" }, + { url = "https://files.pythonhosted.org/packages/1d/48/bc8d4ba7b37551a767bd863f15b3f80182b271c2f55975356f5f7dbe94c2/coverage-7.15.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4fedd1f7f428f9fe83b1ead5e7cc87a43427be31aadafbac3ac0636dc7abb22", size = 222543, upload-time = "2026-08-06T13:47:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/20/dd/88d6f83f1fffc974a3691a34a97951c5b12df7512a6782c5963883cbc058/coverage-7.15.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37e2f0cdf58e2e1fed4e4d5a8f8786ae2f7eb80b478016876667dc4a01d60a97", size = 222905, upload-time = "2026-08-06T13:47:38.927Z" }, + { url = "https://files.pythonhosted.org/packages/bd/5c/54ee0d4748585bb0acab9891cd8d92f2d3593165b4e59fc9de113bfb3140/coverage-7.15.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fb55d0e70bb15f2e81477613627286581414693d74ac7963c93a790dd453ca9d", size = 254407, upload-time = "2026-08-06T13:47:40.488Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3f/f0642a372f494bd0d7dad3b497083b910194a5f1c88be2c94fef707c3b59/coverage-7.15.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:899b9da30f3c6c336566e3707495bb23e8302d39d862f01fa78c48b99b9437e2", size = 257145, upload-time = "2026-08-06T13:47:41.931Z" }, + { url = "https://files.pythonhosted.org/packages/71/17/8b46d0ed68251016002ec972c8fc0119961a765d0984cafb8bf317c43758/coverage-7.15.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d15715e8c46552827e5e4f30a35575a2dbcad14454cf3284c54483946bd16931", size = 258257, upload-time = "2026-08-06T13:47:43.527Z" }, + { url = "https://files.pythonhosted.org/packages/30/b8/8498a0e72d0adbe15477dd07463d2b3bb2c9f6a4815e8589e50939e2c3ae/coverage-7.15.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:002a438859f7b430bc99afeaf01a6d187dad1d0dc907b64cdeffc632a5db8fd8", size = 260517, upload-time = "2026-08-06T13:47:45.121Z" }, + { url = "https://files.pythonhosted.org/packages/41/e1/7dce19c3bdb1e3dd63e769508216500edad81bd5f69a26d724e32aceaf78/coverage-7.15.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4193a04b518f7968f3099755f5509ee7cccc6dc2b92a6b14841934d22e222c9", size = 254785, upload-time = "2026-08-06T13:47:46.541Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b1/e1494703c675a2561723cd9b89f45c9168782c31280c611b1f767851e57c/coverage-7.15.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e98dcc55d572b38e69d117da7e8e8efb8500f1f5eaf81ecd460a63220790b839", size = 256176, upload-time = "2026-08-06T13:47:48.155Z" }, + { url = "https://files.pythonhosted.org/packages/73/76/a5629d270fb638a43a4b10466f51e2f49d532c1aa4da2913cbbb150bbe0a/coverage-7.15.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:af6c538498ce66c10d3fd541c2a8d5b03da5850355add34e6cba564210cb9e72", size = 254321, upload-time = "2026-08-06T13:47:49.757Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4f/9c44447218435d5766b911534f9d798144a5560f85e9a54ebe5f3f5d19f9/coverage-7.15.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1d10025d96ea89fc2f73714dbc4cbd433fe012c1ac9e23f895d7728b238b6e52", size = 258390, upload-time = "2026-08-06T13:47:51.248Z" }, + { url = "https://files.pythonhosted.org/packages/de/36/c1e127616fb3fa18a9ff71e76c417f2fd7424332a4870015ac224ef4c039/coverage-7.15.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d802e1947603162ded419bff83ac7489820355d2b856dfb09206574e3a37ac0c", size = 253894, upload-time = "2026-08-06T13:47:52.816Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b9/fdb92c8ae7a8bb9b850cc253b7b3b9c8526f68130002048b5671cd510d09/coverage-7.15.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c2de40895718f91951b86712b4c5b694acaf9a0a49be13874896f599a1eed3f4", size = 255763, upload-time = "2026-08-06T13:47:54.296Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/a7d51b2587c7bdb76e71b0896d2565bf7d60436b5122fc83e511adb1f7cd/coverage-7.15.4-cp312-cp312-win32.whl", hash = "sha256:5c3431b2161279b7db5c2a1aa58ae02e5cb8c3c42d93a5094be3f5537bd5b11b", size = 224597, upload-time = "2026-08-06T13:47:56.074Z" }, + { url = "https://files.pythonhosted.org/packages/49/b9/5c5f80cc55f5acaaca6dee677626bfcec8c87204a7809b438b08e84f4571/coverage-7.15.4-cp312-cp312-win_amd64.whl", hash = "sha256:6befeab5fb2b51c958ca4ac6c5d141a1e8240f4f76e46350f1911963deda49cd", size = 225135, upload-time = "2026-08-06T13:47:57.52Z" }, + { url = "https://files.pythonhosted.org/packages/47/e4/2a4561f89ff6bf7c925c287d0f2cce8bdf139c3a33735c87e3203401cf94/coverage-7.15.4-cp312-cp312-win_arm64.whl", hash = "sha256:67bc345491ab55b837277d76f5775d057e8c7f1ac44d890d8c2c82adde258c6f", size = 224515, upload-time = "2026-08-06T13:47:58.977Z" }, + { url = "https://files.pythonhosted.org/packages/f1/84/651a9310859673aaa3b3203f1aa1641ca60fcf2494683e1c9474c7172780/coverage-7.15.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c705b28feb2775dc82a25f1d473a370bc37ff93f5177f4e29ce2425f560f6921", size = 222565, upload-time = "2026-08-06T13:48:00.796Z" }, + { url = "https://files.pythonhosted.org/packages/82/f9/4dcf700137e8af550670f4d74d1b63828ce93e1e2b05e5f10710eb2ea987/coverage-7.15.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ff205ab5e3ecc670f6a4dd19d9cbf12ede53dd41cfc1e15716ec961ea6d314e", size = 222936, upload-time = "2026-08-06T13:48:02.391Z" }, + { url = "https://files.pythonhosted.org/packages/07/4a/612ff1e780b3fbfd637486f542f84adc5503873d8b5d279dec1ffeef9414/coverage-7.15.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5172326e861a38b48b48befca15e0f477a26b283337a33a739c8fed229934e36", size = 253926, upload-time = "2026-08-06T13:48:04.382Z" }, + { url = "https://files.pythonhosted.org/packages/b0/04/d1cff1c2ead4708a6a79c01d3736b6a25bd38a36678398f72a8dd33dfad9/coverage-7.15.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:12b59c90084e3234fb11184886bf4a40f4f16a8c8f867be2e087b81f8e8868d4", size = 256523, upload-time = "2026-08-06T13:48:05.996Z" }, + { url = "https://files.pythonhosted.org/packages/b9/80/d34e13fb4b293cbdb9665838cf5522077b8ad14ef947550631a4bced36a5/coverage-7.15.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349062d66f00b40fa2c1c222438bad25fabf755631b5d82937fe985c8008615c", size = 257759, upload-time = "2026-08-06T13:48:08.036Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e7/2c5fe7636fdb0732fe0f09f308a5b066864078b7fc61f6678e8478554f2e/coverage-7.15.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4256ced708e598e05209bc1a8ab4074e04a51dba4c62fb45926a229af675ace7", size = 259890, upload-time = "2026-08-06T13:48:09.834Z" }, + { url = "https://files.pythonhosted.org/packages/92/28/9689f0858dfff59c2ea688938ab9fa2925631235df67126a42b6c5c70ae1/coverage-7.15.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d80f974b20782d9612c8b4c9beeca867074c7cf4079d1419843fa25a26428b25", size = 254121, upload-time = "2026-08-06T13:48:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e2/785077c230c157243eb5aa9a26c3be260ecd02001bead54a3cada3df8e03/coverage-7.15.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e179f19bfe1d31f8eeeaa12990194d761c4f62f0759661000bca6cd8729f40b", size = 255891, upload-time = "2026-08-06T13:48:13.209Z" }, + { url = "https://files.pythonhosted.org/packages/d4/90/e20371b17b40f912f21305c2db2f30efa3de306f7320fc916804872c85a4/coverage-7.15.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8bc16bb47b7679670eceff71d78bfb7d6e5b143f6c2cd117487ec7c75e0d4b78", size = 253859, upload-time = "2026-08-06T13:48:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/05/49/25371987ee459a5f67c0427fb75c74f9358e65f2c71fe75bf41c1b6c5fcb/coverage-7.15.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1cd685005cd2c4200adfc14cf39a603b9320efab3f18a8f7f156d20c9cc3345f", size = 258011, upload-time = "2026-08-06T13:48:16.464Z" }, + { url = "https://files.pythonhosted.org/packages/30/6e/32e67467f6154bf4f1c4f63b05acc5097cba4237d45bbeeea446b52e8ac1/coverage-7.15.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:337399ad2c93b3acd2a937627dae8b3e86b66707cd3d3e856347999aadf1ef8d", size = 253676, upload-time = "2026-08-06T13:48:18.493Z" }, + { url = "https://files.pythonhosted.org/packages/03/c1/8b24192e89286399765155251f99ee9f070a9d637109018ac23d99b99f6f/coverage-7.15.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:96e257121228ec5cd2bb919276e94ac11074471bc37d68dbae0e8308cce15fff", size = 255453, upload-time = "2026-08-06T13:48:20.057Z" }, + { url = "https://files.pythonhosted.org/packages/16/6f/8b41ebdf67c87854e17c035336a90f1cfbad0c14c2a584301be6ff148718/coverage-7.15.4-cp313-cp313-win32.whl", hash = "sha256:c65a9e0dfc6143491879da4e13b5e30f8be192055de508d737fb14601edbd22c", size = 224605, upload-time = "2026-08-06T13:48:21.655Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e2/2946c7f0b42b152ecb21ff1bdad72e3d301e790c0c487e4a86e8c9f69347/coverage-7.15.4-cp313-cp313-win_amd64.whl", hash = "sha256:2ff8f5e9b8f7a94f0c11c45631eee103dbcb7d63274edd12c56efe1be690b3b4", size = 225148, upload-time = "2026-08-06T13:48:23.376Z" }, + { url = "https://files.pythonhosted.org/packages/9e/83/3f4a69957f48ae7a0aba76c34743f88963d607b19e03f3f8e66f91cae0f9/coverage-7.15.4-cp313-cp313-win_arm64.whl", hash = "sha256:6e0a8a5083b096487d6cfced94cdd514d8f5db6f113610fb36c0620edb1028cf", size = 224536, upload-time = "2026-08-06T13:48:25.117Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ac/748cf29eeb2d6be34a3176ce26a4f49e38085ee08e8935f05f6f26ed7e0f/coverage-7.15.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:770e9325ab5ea6d56f77e59b29ecfe0ac20b57a82a601876f90494a4dda0386f", size = 222608, upload-time = "2026-08-06T13:48:26.806Z" }, + { url = "https://files.pythonhosted.org/packages/0b/02/1abbf5c984677b0aa439cdacaccbf38d248939d8ef8fe1cc7a50d73edb77/coverage-7.15.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d12b33a3a50a1676b7784dc8d00a0c6d66a9f2add4b85a041c19b6a7e53ef23c", size = 222940, upload-time = "2026-08-06T13:48:28.432Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e1/ff8f9f53d9fcf586125b55d0b1f04ec1c14955fee41e83d5814bee141bb5/coverage-7.15.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5669c8378ebde86f5def7a25d29586631b58acc27ffde04399f678f3dfc6e082", size = 253985, upload-time = "2026-08-06T13:48:29.995Z" }, + { url = "https://files.pythonhosted.org/packages/a1/26/595759762e514e81be1d7d01ed03444303bcd152226a6529998d253f9201/coverage-7.15.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff97a14362eef486483ed44042ca2027ea257df6ff768e62358ee0c9776925ac", size = 256492, upload-time = "2026-08-06T13:48:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/b79aabac54d482be23b5fcdd4f4662bff24a78edc4ee29201726929936d5/coverage-7.15.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a325e815318638aed1655d9c06e6d7c2d3d46c09231ce988070428a8762d734", size = 257837, upload-time = "2026-08-06T13:48:33.186Z" }, + { url = "https://files.pythonhosted.org/packages/09/0f/bf7f297885a5bf6fd71e5782404e0ff059ca09e8711ceb3a08544abde45a/coverage-7.15.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:474223409d88eb20d2d6a0d37ea60e8647a65a90cc008dc1f0410af5f64f1e0d", size = 260152, upload-time = "2026-08-06T13:48:34.75Z" }, + { url = "https://files.pythonhosted.org/packages/fd/f1/296744e854ff8368542343457414380465e9ceefb9192342feb9d3bc461d/coverage-7.15.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7f2f62ae3cd189dd2e13aece758c57b3eecbd27be070dbd4cbd10936049e5dbf", size = 253978, upload-time = "2026-08-06T13:48:36.434Z" }, + { url = "https://files.pythonhosted.org/packages/55/b0/bbdb2e9057493e66220a2e149ca2d301ba0e3a58a83bd6b90de9826d16f3/coverage-7.15.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39ece820e29e0a2ba34b3ecb3be83c27e997eed8926f2ba6fe7ce7a0bda5843b", size = 255846, upload-time = "2026-08-06T13:48:38.317Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/38015b2b6d21258713bd17e76b59d033b191efb5703589cffd037dfbca20/coverage-7.15.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f21b56dcace11dfe013014201f577dcd592b2a9b72182d930361b47cf6f73f25", size = 253808, upload-time = "2026-08-06T13:48:39.993Z" }, + { url = "https://files.pythonhosted.org/packages/0b/64/0d515c1e60ee6fbfd1a0e79c07cd87d388a233b7adc37758735677203808/coverage-7.15.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:93a3a0b662abcc10c73a47cbc72cd60f63618d6989fb2d1286e50eacd974f303", size = 258081, upload-time = "2026-08-06T13:48:41.971Z" }, + { url = "https://files.pythonhosted.org/packages/91/71/04d9e7a3642146c6351338aef4ef85ab11dbbb54744c13245caba1aad1c0/coverage-7.15.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:141fae2cabf5569b782c10afc4c850ce10f618c13f8db54765cba99cc839da1f", size = 253624, upload-time = "2026-08-06T13:48:43.731Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a7/6c28b74c81ebff66987b0e2522ba5cffa3e90b0c33cb6a2eb264d4ee8cf1/coverage-7.15.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:81294c7e6ab30c5f74c0353b11b2fd6320e72d9bee6ac73b357caa8b916323a5", size = 255280, upload-time = "2026-08-06T13:48:45.58Z" }, + { url = "https://files.pythonhosted.org/packages/52/af/bc19996a7014b98d7bbb0f0939453c67074af65784a3aa16a789a07381fa/coverage-7.15.4-cp314-cp314-win32.whl", hash = "sha256:7bbd7d6418e0dab31a206af5203bd43ae36edb8e7fba1940b055d3e9249290d7", size = 224768, upload-time = "2026-08-06T13:48:47.525Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/219484e476d6e101ba0a444852579e05f5b75c37c611a42ed1190f73ef62/coverage-7.15.4-cp314-cp314-win_amd64.whl", hash = "sha256:f0204ed122758782970526057093f448051a39db9d810d4e344bb87a3546f425", size = 225259, upload-time = "2026-08-06T13:48:49.513Z" }, + { url = "https://files.pythonhosted.org/packages/b7/66/fa77daf4e383e5f776dac62c2409b6af81910ae6fe326bd5170dba74cc63/coverage-7.15.4-cp314-cp314-win_arm64.whl", hash = "sha256:9e71e7bc71c686a123347ae47a0de33a175e797a85bb57b791492adf4eec8ed8", size = 224684, upload-time = "2026-08-06T13:48:51.235Z" }, + { url = "https://files.pythonhosted.org/packages/58/5b/f03bf0ce362bbf3f785fa5219620d00778d4ac6fc9e407734828e9c672f6/coverage-7.15.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7c922735321eef3f87c280a3d39afff6b646723a2880b862cda4ac7a093b8aa8", size = 223338, upload-time = "2026-08-06T13:48:52.896Z" }, + { url = "https://files.pythonhosted.org/packages/0f/76/e77d0ae22501831cc9f92193e8a957a5caa1dd177f90a6d1d9b106242d92/coverage-7.15.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f41c17c4668a655ce96d090d8d5ffdc24ef64b5a02f9753884d08483e8a4a41a", size = 223609, upload-time = "2026-08-06T13:48:54.688Z" }, + { url = "https://files.pythonhosted.org/packages/82/1a/b1f089da8d38ac612fa2dd6dc7f4a1a7657d12f3e261d2996edd3a838d0b/coverage-7.15.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:46822e9b6ff1c6a72b518c162c44a8f45a61a1d609c51084bf5b16c023c5037b", size = 264970, upload-time = "2026-08-06T13:48:56.403Z" }, + { url = "https://files.pythonhosted.org/packages/bf/31/e66d98d6e9c7fcc88470f1e234eaf6b1950dc0dfbf797f7282c1c861da24/coverage-7.15.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d6f4955b73b5445271379a59e3792b0d978f42d4a01e0cf7a67d9c33a3bb0a5", size = 267088, upload-time = "2026-08-06T13:48:58.41Z" }, + { url = "https://files.pythonhosted.org/packages/59/a1/ae94eb2c541add426378408379f233591e069040b1e2cdb33df9498a0682/coverage-7.15.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3fc9e047706fb4a9abb54f719d3aa643e80e5bb3818182c40aee01ac0f0247ba", size = 269508, upload-time = "2026-08-06T13:49:00.42Z" }, + { url = "https://files.pythonhosted.org/packages/9c/c7/88a10694a1c6a213569766aba9f25847b28155d4ac731b13226db216356d/coverage-7.15.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05e491d4f3165d62d4f5c8fd48dfeabf2ae8f42cbbd484319af33ea851b78982", size = 270629, upload-time = "2026-08-06T13:49:02.234Z" }, + { url = "https://files.pythonhosted.org/packages/b3/34/d8b8232e5e55169933b59aabcef2fedfa4b9d8897361bb80fcbda146505f/coverage-7.15.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:226c66e80ec0598d3b9b4874123df167ccca342aca8714f77cac6829688ee09c", size = 264043, upload-time = "2026-08-06T13:49:04.102Z" }, + { url = "https://files.pythonhosted.org/packages/7e/35/58b009dbf8c471c7224716478b9fed4a7e1af15320e1ed41660978504663/coverage-7.15.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac41cc14bebda0dbfb0628036b7f75706935c95bcc07fefe9a0f93614aa60a57", size = 266963, upload-time = "2026-08-06T13:49:05.821Z" }, + { url = "https://files.pythonhosted.org/packages/62/aa/57fbda1b42c892968273c56b6ee9dc0f1310850859230a507bc7873b1f65/coverage-7.15.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8af623e5cd92080acddd02b38f2f406a2c3a0893c38950b211890361448fbf26", size = 264569, upload-time = "2026-08-06T13:49:07.706Z" }, + { url = "https://files.pythonhosted.org/packages/98/8a/360e6e7f24d477b7e889703af0afa878d15b6d4d8d2a822b2835c169a879/coverage-7.15.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07545711d4f0f32852a18f18ad11f76f0109909d09e78b9008b4cfc67e829429", size = 268299, upload-time = "2026-08-06T13:49:09.587Z" }, + { url = "https://files.pythonhosted.org/packages/4e/89/6f701261aee21b6b5fa8f7872229406dc917e125069448292223bf213606/coverage-7.15.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a0865421cfdc53654b342d515e5a233187590882d20b95752150e53f65460017", size = 263413, upload-time = "2026-08-06T13:49:11.604Z" }, + { url = "https://files.pythonhosted.org/packages/3f/0f/6f04036edc260ed425af83e834f627fad48941ce97b50bfe6edd8b6fa623/coverage-7.15.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:460115e32ee40566476db5048f9bec1e842c127ad8e6f8be745aad3ac9cbc839", size = 265725, upload-time = "2026-08-06T13:49:13.38Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ce/d19b5d4d5c49a7bfb925fd74310fee7d28bc99520ac3367ccbc54e662518/coverage-7.15.4-cp314-cp314t-win32.whl", hash = "sha256:cbde877ef9dd7baf272b9bfef2b8a25edd45d9170fc326951dd20eb480335e85", size = 225079, upload-time = "2026-08-06T13:49:15.265Z" }, + { url = "https://files.pythonhosted.org/packages/26/bb/7aa1b3b173faee0679037ca950bbbe1247273656697994d8d13f80f8d4b4/coverage-7.15.4-cp314-cp314t-win_amd64.whl", hash = "sha256:3da9e92d1c551fd7563833e9ade686efb0c4b7363ab7681a94283958c950bf5e", size = 225911, upload-time = "2026-08-06T13:49:17.279Z" }, + { url = "https://files.pythonhosted.org/packages/81/1c/4ea9e47426d80038d9222db3c4534cb6021a74b237d3ff97ffd33b6600dd/coverage-7.15.4-cp314-cp314t-win_arm64.whl", hash = "sha256:3a54f5a0d85050c73a38f6793090ee83974531e67fe5e57a1da9bee11398aa5e", size = 225219, upload-time = "2026-08-06T13:49:19.293Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c4/dc5d2ac8f9142e7ec7de66e7bf0591db29d78955a040bd915870d9c0e657/coverage-7.15.4-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:2c9872e4d9dc5d3cf616bf4b382f5a00359305a5be666a3dd0b5cdb4e49597f9", size = 222604, upload-time = "2026-08-06T13:49:21.279Z" }, + { url = "https://files.pythonhosted.org/packages/70/39/33e63df81fe2ee100897451841c821467635923e58e37c6bd4b46dd8106c/coverage-7.15.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:e101dbb4b9b72f0cddd8cdc8c9c5b47f456766f5e0ac82dbfb75e5c55409b78a", size = 222944, upload-time = "2026-08-06T13:49:23.187Z" }, + { url = "https://files.pythonhosted.org/packages/99/1f/ef3ffb5557febc75a0d97aa459d0266d7d741110265121cc6d8539343d44/coverage-7.15.4-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7d1abebdb047729e852b9c77a00497dfbeb11eb3a117e037d7dbc3ac8e5f5c54", size = 254050, upload-time = "2026-08-06T13:49:25.008Z" }, + { url = "https://files.pythonhosted.org/packages/6f/f5/1f0f6f77698c3601ca0ae7431e34b24c62ca2f06fecb23b73ed1f651d2be/coverage-7.15.4-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d28a4a899354d0ea6214cc59b4fa19eefbce1b9ff1688ab579acf49e894bd3fb", size = 256967, upload-time = "2026-08-06T13:49:26.896Z" }, + { url = "https://files.pythonhosted.org/packages/03/7a/2ed9bed79925f4367c83c77f66a89e5ca7229c288d2d19ad5f36d1ca0070/coverage-7.15.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffb3c2aacea411cc7e1d27712490c11108e2de1d39019ae32915493a59a8b9ed", size = 258587, upload-time = "2026-08-06T13:49:28.692Z" }, + { url = "https://files.pythonhosted.org/packages/45/8c/fa34044f71b7cc4ecb6da9c2408770959b0591fa9b5fb6fb6bca38f94298/coverage-7.15.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9447978a92f405d301123cfd39ff49895490efb769a758fe2734c7f631bf8ce", size = 260785, upload-time = "2026-08-06T13:49:30.472Z" }, + { url = "https://files.pythonhosted.org/packages/4f/54/d5727ce36b4524a7394ab9f5f1df378e1f23affcdab01037dc8655185cc7/coverage-7.15.4-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:050467a7983b8e2fe7dd41a78bb30c3e7f8c0b8cafda14b1c46f8b5e3cf2dd3c", size = 254545, upload-time = "2026-08-06T13:49:32.271Z" }, + { url = "https://files.pythonhosted.org/packages/dc/e6/6e3783e576719590194bdffb6dd6d85490801785b7c331e35a245d8cb8b5/coverage-7.15.4-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d003b7a5708ddad5c206c79607a6b92abb6fc13c57d99d8a4468cc03a2941ced", size = 256682, upload-time = "2026-08-06T13:49:34.089Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f2/bacdbde18b69ed2de424fcf64d9fb0a4913753d4f0eca8bae9daad69f4bd/coverage-7.15.4-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c38efe30fd74e5c19e9433f11fb1f5dc9c6522770971b7c6145bbaa413dc8800", size = 254560, upload-time = "2026-08-06T13:49:36.052Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a3/1fb927196e3477c1b48831169ab58ba08f451ba87ae311ff1de68b26a616/coverage-7.15.4-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:1f4f826d70f772ab8b0c052329580d7fe8b8abd191e4ce0c8f81aec6614665d3", size = 258792, upload-time = "2026-08-06T13:49:38.01Z" }, + { url = "https://files.pythonhosted.org/packages/41/58/30d4c149c69053de0edfe325614c1d28d508f62b1783e0e4a234d2e49136/coverage-7.15.4-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:4a4bf917c9953f57c957be31c1cd504e3bd2f34d4a352b9d391a3025336f6768", size = 253968, upload-time = "2026-08-06T13:49:39.934Z" }, + { url = "https://files.pythonhosted.org/packages/89/e4/77f639371b918aad30dda4051f95404b43578f7f2e2f87ba73e02ed1ff37/coverage-7.15.4-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:1c9bf40ebef178a45192c75c4964760bb261b0e6ad725da5fc4c93f674f19753", size = 255893, upload-time = "2026-08-06T13:49:41.825Z" }, + { url = "https://files.pythonhosted.org/packages/5c/62/13be29b3ddab35f14c87967a4820a05106d2a3eccb4fa4ff550bf30b75e0/coverage-7.15.4-cp315-cp315-win32.whl", hash = "sha256:43619d04c3671792d2c4706ae8bf45e265dc87bbd4078189ef8b847ea1e74be2", size = 224768, upload-time = "2026-08-06T13:49:44.08Z" }, + { url = "https://files.pythonhosted.org/packages/a1/70/af0c6be0f964af6954f6b74bc109b0dbca02824696d2520fb17fe1ab06e3/coverage-7.15.4-cp315-cp315-win_amd64.whl", hash = "sha256:be619439dbcd31a2eab10b32de9fff62c26ed4bab69dc32b8363fdaaa0882809", size = 225242, upload-time = "2026-08-06T13:49:45.899Z" }, + { url = "https://files.pythonhosted.org/packages/4f/2d/f3bd3aab899fc9efc18b53133ee68f5f98574ef480649b23e12962226387/coverage-7.15.4-cp315-cp315-win_arm64.whl", hash = "sha256:def597967dafc2e8d97c9097ea453c464e0bb8ed38f193a43070f10dc623bb6d", size = 224674, upload-time = "2026-08-06T13:49:48.322Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ca/f69251cd63eabc6438321aea22148754cce758a26bde07dd490e3fe7cfc5/coverage-7.15.4-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c7dbc748ac8a1e3e59a2b28bea47675e6e778081dbbf081bde0d75def2fcbe1d", size = 223333, upload-time = "2026-08-06T13:49:50.293Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a7/037b53b2885b0d8447064432491a4d5a1014cd9f97a594d53acd0c04541a/coverage-7.15.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:2413074a5ecbb61a01a7888fc72db0ca324d13588c5b38bc0dd8564cdcdfea26", size = 223630, upload-time = "2026-08-06T13:49:52.637Z" }, + { url = "https://files.pythonhosted.org/packages/80/4f/152b8a4779ae90da11bb24f7467df8a59f0be48a5c52acb856325ca48289/coverage-7.15.4-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4e6f6f632b7b2f714bf7a1346e8f97b650ee71f3c298aaad42a2ab60f0f07645", size = 264489, upload-time = "2026-08-06T13:49:54.52Z" }, + { url = "https://files.pythonhosted.org/packages/10/2d/84b4b9e0e1dd6528a51920ff7031f35b789382e467a28ec6a5a578cb8812/coverage-7.15.4-cp315-cp315t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8df457da2249d3c75ca2e5e835d59c725abfe92d27fdff6cd99eed85b51d5e9a", size = 267567, upload-time = "2026-08-06T13:49:56.721Z" }, + { url = "https://files.pythonhosted.org/packages/53/fc/ba01cc25299f9f8a2c8b02d3b28c53f3543d9fbfbe4e74fa2760b48f163e/coverage-7.15.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:050f66a08805acb5b8a23c6d4a517b1ecf82c08e81ed0e4bd727df065e5c6624", size = 270123, upload-time = "2026-08-06T13:49:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d0/db2647cbf40b14f8c308f94ff7bf89c06d564e59f396906edf50086ec788/coverage-7.15.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1587fb771d1ccceef708fdde1e5af8c7ed24b486b61d13a321acb7d8145390aa", size = 271107, upload-time = "2026-08-06T13:50:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4d2d17924552c458bb4f77dd631f0e3bc92fbbdf2d2d916cd4b33bbfd5b1/coverage-7.15.4-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8b4f1c3a69ca580f3fbd6b2046915f536d7f586874f25c1bb23add2a3c88d50f", size = 264955, upload-time = "2026-08-06T13:50:03.023Z" }, + { url = "https://files.pythonhosted.org/packages/ee/de/dc010c7a3691f396d93bbc26bfcafa1c2a3a351cd520470f15faf5795bd5/coverage-7.15.4-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:ffb58d7eff5b7f6ecc6fa21d6288ab7f968a212cb67d682c269c09b9eba3b66f", size = 267949, upload-time = "2026-08-06T13:50:05.557Z" }, + { url = "https://files.pythonhosted.org/packages/78/ea/dc96a11375e83c045c2f7c61fb6918277cfe9401db7c0f7b1d111a84b2e5/coverage-7.15.4-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:d9df165544774574ee004b953023d1bebada1894a80b1052a43d798b0f676e67", size = 264421, upload-time = "2026-08-06T13:50:07.612Z" }, + { url = "https://files.pythonhosted.org/packages/c8/86/b77131a0f9503ce461cd577076147d7a9040f0c5dda772686f729e2cc9cb/coverage-7.15.4-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:f9de0a24a4079b53e523b5c5e2c5945ec251ab486652659955187cf255a259bc", size = 269121, upload-time = "2026-08-06T13:50:09.58Z" }, + { url = "https://files.pythonhosted.org/packages/24/24/944bc35007862955e7ebf05754e645419dcf5d7526c52735cfa2715e8ebf/coverage-7.15.4-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:150089274bdc9f940628552cb92844e0223c987f1902ab8efe9f45a2ec758d88", size = 264565, upload-time = "2026-08-06T13:50:11.722Z" }, + { url = "https://files.pythonhosted.org/packages/c7/cc/a3bb9f93e7e740659163e2ea584f8196ddcd2c456a5dbe15f6c50105fec1/coverage-7.15.4-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:a58a94fed5da6997d258e8f7668c1e195fbd04a691d781b7558f1e468f9e68bc", size = 266522, upload-time = "2026-08-06T13:50:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/49/dd/e0e40f3560d878d888c580698ff5ad1179f5e1c3ac949684ef66b41a3817/coverage-7.15.4-cp315-cp315t-win32.whl", hash = "sha256:ebd5a6d8466ff30836572f3ba2cae8a5e8f85029b1c6d5e2ed338dc472a5166a", size = 225068, upload-time = "2026-08-06T13:50:15.825Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7e/37732ea80eebc30e976e4cdab15c190bc42d96959a42e38ddf6f8c60468f/coverage-7.15.4-cp315-cp315t-win_amd64.whl", hash = "sha256:288bde2a2d7ab6b6c2d7252fcde8b524387f2d970bdba9658fc6f8bbcaef0f9b", size = 225895, upload-time = "2026-08-06T13:50:17.928Z" }, + { url = "https://files.pythonhosted.org/packages/c6/08/1e00f7923eaaba45fb3d51dd794125fc766304b1df264f3a9c6557bfb30e/coverage-7.15.4-cp315-cp315t-win_arm64.whl", hash = "sha256:68be5e1de60ff13c9095bbec0e5a7fa45b33b101752215b91345ea1f61c4a278", size = 225213, upload-time = "2026-08-06T13:50:19.981Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d9/e70c286c979378f061d8266e279b686ab0b0b688e1fe0af864684f23a77d/coverage-7.15.4-py3-none-any.whl", hash = "sha256:964730a1e9de9c0cf11be6a1a3c79ce419c34882842abd256086ba4698705e84", size = 214332, upload-time = "2026-08-06T13:50:22.192Z" }, ] [package.optional-dependencies] @@ -962,59 +894,59 @@ toml = [ [[package]] name = "cryptography" -version = "50.0.1" +version = "50.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/19/797e2aaac9df6a66f1550f49979dc1b1e39ecd2077501c30efa81e8d5d67/cryptography-50.0.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986", size = 4010153, upload-time = "2026-08-25T19:44:03.155Z" }, - { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" }, - { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" }, - { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" }, - { url = "https://files.pythonhosted.org/packages/55/32/38c0d344b98c06d34b5df8946565a9c0d6dbf32c8e0730a7f05f0a3c6cab/cryptography-50.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45", size = 5353524, upload-time = "2026-08-25T19:44:11.96Z" }, - { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" }, - { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" }, - { url = "https://files.pythonhosted.org/packages/e3/38/45abd72ef63f2e7d0754a6cacf97bd8b69512ace7f6130d24c39ece65da2/cryptography-50.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527", size = 5308405, upload-time = "2026-08-25T19:44:20.197Z" }, - { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" }, - { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" }, - { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" }, - { url = "https://files.pythonhosted.org/packages/42/8b/cb12b1b60c91b074ca6bf0fdd59aa8f10d8bc5f73af8faece86ef0421b37/cryptography-50.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:aed8db4f6d71c51efb89530e12d9464e7bf2923d46c3205dc794a2a93f8c0648", size = 3842826, upload-time = "2026-08-25T19:44:28.784Z" }, - { url = "https://files.pythonhosted.org/packages/5b/f0/424cb557d99aa86ac55da5e2add02e2882e44047b6264f93ade1b975a993/cryptography-50.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30a125032e5642a21ff816e021152bd4e7e94f03eff3f4b7fca41cd22bc3110f", size = 3973525, upload-time = "2026-08-25T19:44:30.7Z" }, - { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" }, - { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6e/1cf405c5c8e8df7545378048e954792f00b7f2367af8863ce8b8f3e10607/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9", size = 5332388, upload-time = "2026-08-25T19:44:39.16Z" }, - { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" }, - { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" }, - { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" }, - { url = "https://files.pythonhosted.org/packages/b1/1b/ec3ebd31741d0e963612c4fe43caa39341b9b1e031e469820e42e4c83918/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6", size = 5287201, upload-time = "2026-08-25T19:44:47.297Z" }, - { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" }, - { url = "https://files.pythonhosted.org/packages/4d/56/bc4f2b209e766c93372cfcd59b781a0b2b59700f62a969580415b699c2b2/cryptography-50.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f74455bb086a85d5e81246412602aaa97ed095e504cd40dd261ef50be42205bf", size = 3825806, upload-time = "2026-08-25T19:44:56.209Z" }, - { url = "https://files.pythonhosted.org/packages/84/a9/ee16a903f13755e914d1eecc482fe64d1f10761c3960e5d8fa6837377aff/cryptography-50.0.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0", size = 4035307, upload-time = "2026-08-25T19:44:58.305Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" }, - { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/6e/2b/214cf0cf93db9628c3c20c896b229f327f6fb1b20e4b3743d8ad3f00af8b/cryptography-50.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054", size = 5375862, upload-time = "2026-08-25T19:45:07.163Z" }, - { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" }, - { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" }, - { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" }, - { url = "https://files.pythonhosted.org/packages/dd/04/557fc5ead96a829e0bc812a3b9dc4a52a2f27e4f7f5950da7ff27653a805/cryptography-50.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80", size = 5332955, upload-time = "2026-08-25T19:45:16.193Z" }, - { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" }, - { url = "https://files.pythonhosted.org/packages/99/89/87ef49ffe383ef4e147d27b7bf2088fb0b54ea409dd87b5a89442e5828a5/cryptography-50.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2", size = 3875429, upload-time = "2026-08-25T19:45:24.418Z" }, - { url = "https://files.pythonhosted.org/packages/c7/27/8d207af749c453ee17ea087340b3f2b4adef75aadd1d277b1b129bdda84e/cryptography-50.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9cb3cb952cf5a8abd50c782a98a89d71699715e802fe349704b47f2425b42a94", size = 3974350, upload-time = "2026-08-25T19:45:26.551Z" }, - { url = "https://files.pythonhosted.org/packages/14/9a/6d3a4d7852e22d657438b7bf51f66102c7d71c0e1fafeec652281d0403e5/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f", size = 4698675, upload-time = "2026-08-25T19:45:28.658Z" }, - { url = "https://files.pythonhosted.org/packages/73/35/5c3717edf9e68a0550ce04e28eab493fe545eccd81742af03f6a75fe260b/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671", size = 4707410, upload-time = "2026-08-25T19:45:30.816Z" }, - { url = "https://files.pythonhosted.org/packages/1d/e0/e786934472e3ac4ecdecc7b129a0ca1a2a40dffdafcf2c3ea9d4397f8def/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e", size = 4698378, upload-time = "2026-08-25T19:45:33.043Z" }, - { url = "https://files.pythonhosted.org/packages/51/cf/5b3f53a0b74d122f023476ede40ba5d3e70d5cf475f73b899740d26a4fb2/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6", size = 4706889, upload-time = "2026-08-25T19:45:35.086Z" }, - { url = "https://files.pythonhosted.org/packages/71/44/711e61f7d014be825ef79b285b047292d1bf893732ac1bc030a351fb517f/cryptography-50.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:693c99b49bd37d0d096e4334c10232c77248c415b98d35236094cdf96d57258b", size = 3824006, upload-time = "2026-08-25T19:45:37.281Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/de/41/6cbdcf9142d00fe82836fbb51e503e58088575cf7a0fe1dbff6695bf0840/cryptography-50.0.0.tar.gz", hash = "sha256:eeac2acb5a20ed25e0ad6d1df9891a520b78b404266b6d11778f25d5d691a6c9", size = 880201, upload-time = "2026-07-31T14:25:10.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/5c/59086b4aac5e879d38ddbcf74e4be7ade89cebc3eb199a55da998c3bb46a/cryptography-50.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:031e2d5dd4bb9caa3ca9c82e5a197fd8ae680232cee62603d1a813f3f07e3d03", size = 4001252, upload-time = "2026-07-31T14:23:33.331Z" }, + { url = "https://files.pythonhosted.org/packages/57/ef/8f2df13c7216bcad3e1c74e07f6e193d93e998e114f524a53877c9af27ad/cryptography-50.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd9192b7b70c573d7f214eb1ae35e00d359f6f5e4b27c7e21e30de1fc6204645", size = 4719554, upload-time = "2026-07-31T14:23:35.611Z" }, + { url = "https://files.pythonhosted.org/packages/d9/41/029086c34d91052fc3b88bcc8056f709a7c915c7a23b235a54eb800b1c97/cryptography-50.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:06a32a980526a6ab9a4b9bf8f7385800791e2bb960903cb6b530e4817509a3b7", size = 4702130, upload-time = "2026-07-31T14:23:37.635Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ff/b6ce0954962e7f7b969f850a883744197bb3910bdfd7b6da162eab7d9f68/cryptography-50.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a1b30560f2acc95aa8b2e06e716a13dbfc97314747b80d9707e307f77b40d6b3", size = 4725244, upload-time = "2026-07-31T14:23:39.471Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/63a1027cb7fec360a182208e1b7767d5aa1fe57be3d6aa856e69a321edc0/cryptography-50.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:8d89f3976b10b4ce31118de72329025f70d2c6ead14a8217c5514dd2c6d5a78f", size = 5342265, upload-time = "2026-07-31T14:23:41.286Z" }, + { url = "https://files.pythonhosted.org/packages/6b/72/a1116d683a6d7ece94590013882515de087edf9ef0e6292aae615a44df73/cryptography-50.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b42a28c1844fd9de8f3f7d540e36b66f3a9c83fceac7170ebc7a6a19edd9dcae", size = 4734609, upload-time = "2026-07-31T14:23:43.139Z" }, + { url = "https://files.pythonhosted.org/packages/15/37/36a9c479bbe49acea2636c7fd3360d20f7b7e079c300352011c44850b181/cryptography-50.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:900131fafd8aead39ac7dd3a7e833be754c17a95cfd91221636949fe4eb0aa8a", size = 4356517, upload-time = "2026-07-31T14:23:44.939Z" }, + { url = "https://files.pythonhosted.org/packages/32/98/8a151d64367204cbc63ec65d37502f1d9c53cf4bfc6ec3c532614dbec60d/cryptography-50.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:07949c449a1abcf60d1ee6e88956d89404c7df3c8258f46589e912988e551987", size = 4724529, upload-time = "2026-07-31T14:23:46.93Z" }, + { url = "https://files.pythonhosted.org/packages/22/f6/ec13b470172126464a86bf54d2294a46d29837fc51ba3e45d4047946fb5e/cryptography-50.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:f89831ef99dd7dd169ab06d63a831adb9e20a87aac6d380266bbda5823349169", size = 5299852, upload-time = "2026-07-31T14:23:48.851Z" }, + { url = "https://files.pythonhosted.org/packages/da/3a/f05e32c99d440c9bb891ea0e36c9091891e36be5a9a87ab2ee6ea20729f6/cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:82148ec5bddac30b51a5b3c1945075f896fa022cb93f8e4a01e9f6ee95292c5f", size = 4734462, upload-time = "2026-07-31T14:23:50.861Z" }, + { url = "https://files.pythonhosted.org/packages/ca/dc/bd72b26be8953f80625f63151efd38eee71c76ca6cf591c08ff34615a79e/cryptography-50.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1489e263a8048bb8b6a8bac662eb2d402ea5d2b7b4699b72f385f1e2772db105", size = 4852708, upload-time = "2026-07-31T14:23:52.715Z" }, + { url = "https://files.pythonhosted.org/packages/27/20/c930314a2ab476d15dec966ec87e2e9637bb02b06106b12c0396c57bb603/cryptography-50.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7cec5b856506da6defb290f30c9ee687d5f5e8cb0bd3f6459dde43b0b4fa40ef", size = 5004179, upload-time = "2026-07-31T14:23:54.887Z" }, + { url = "https://files.pythonhosted.org/packages/32/2e/c9db68a0c4bfa28e310707527c0ee3a2bd254104d2e02e68f368e197aa4c/cryptography-50.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:bd1c592e4d5974f0d08d4888e432157adba757c66da0246918e43677fafa2d30", size = 3840395, upload-time = "2026-07-31T14:23:56.677Z" }, + { url = "https://files.pythonhosted.org/packages/c3/fb/951032a3bf22a5697c83183fb6294a4843772947a70e616c57b3ff5f522e/cryptography-50.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e7d93abdbd2990caced757e5fade25302f719c3c8fb6e6fff2dde98999fc41", size = 3989258, upload-time = "2026-07-31T14:23:58.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/67/91eb047e69c5e845f2f14b8a2e4a1aab0f283cb885531e9e22c8adb176bc/cryptography-50.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:19736989797678c6af1e55cd49055cdbcb55d8f6b5583ac5335f933aba9101dc", size = 4700648, upload-time = "2026-07-31T14:24:00.702Z" }, + { url = "https://files.pythonhosted.org/packages/30/82/85f0f7425c856b9f96459411eb12e74ef72df9caf6f8f15bf23a33ff131f/cryptography-50.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80b63928fa35083b33966ce1efb70e5b9607181e49dcd1c22c8c005e319f667f", size = 4682442, upload-time = "2026-07-31T14:24:02.538Z" }, + { url = "https://files.pythonhosted.org/packages/1a/28/b555a365adff1cca2fbe7b9e487d68a40de6bc67ff2cb587473eb43de0e7/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:d58c3db7cd6eed54e6c06744db55456b65ebd7492ddeae9c1e93cfca7aa857d3", size = 4707596, upload-time = "2026-07-31T14:24:04.394Z" }, + { url = "https://files.pythonhosted.org/packages/72/d8/f52538140cc719df62a01cf87d1c7142318d235817109d6f4054d7c352d6/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:df2a58a472f332225671c35b0a830208b86d004f82baa8530fa3782c85646533", size = 5314552, upload-time = "2026-07-31T14:24:06.31Z" }, + { url = "https://files.pythonhosted.org/packages/38/14/6120e5bd7c5aa022ad15424ba4d5c5269d0d9448ed4d55e492ea91e3c1c4/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11b74db56cdbe3cdee6e3f6982ecb70334fa10dce99ed58bf7894aaaa3b2a037", size = 4717113, upload-time = "2026-07-31T14:24:08.349Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/190bf38c3ee2e0f8efc9860ae100c9df4169742eef274b91e7aa1cb133b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f59e38625469987d7ef6d495323c55e7db6c212eaf6112267e0d3b565a2e9c9f", size = 4338580, upload-time = "2026-07-31T14:24:10.227Z" }, + { url = "https://files.pythonhosted.org/packages/3a/63/504ccfbbe61fd8aa983f7f146399cdf034c72c2fc55f5b2dfdcdcdb20c99/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ecfed7367f965a0328cfbdd70da860f15441f002f613185668c6e6ebf5a0ac11", size = 4707038, upload-time = "2026-07-31T14:24:12.169Z" }, + { url = "https://files.pythonhosted.org/packages/01/77/2cf79bbfc4d12ca106437a6e170d6aaa01a373e93093118aaaef0e801bd4/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9aa87839c383bdbab6ef865787a1fb877af8dd03464c4400322726feaaadfc6d", size = 5273110, upload-time = "2026-07-31T14:24:14.38Z" }, + { url = "https://files.pythonhosted.org/packages/e5/45/8aae2972c520145377ea3559a605a899bebe227bf070b33cdb445929a9b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:6ba6a53445bd3cfa809ef3ef5f1589aa6ba08784a1d962bf47d0940e871dab1c", size = 4716439, upload-time = "2026-07-31T14:24:16.415Z" }, + { url = "https://files.pythonhosted.org/packages/7b/20/4fe50b619a48c2525cc46e2dbc1ac490708d704be5d467bdaac6dc955682/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3f5735ffe4996d28b809371756219f5354864902a3b9e7c0b9ee87041209fc9c", size = 4837383, upload-time = "2026-07-31T14:24:18.553Z" }, + { url = "https://files.pythonhosted.org/packages/92/91/3a31366e183343d3703f8995c095f5734676bd6938118047e50fcf279eb4/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1b4a266766514614f8aa60416e71f2fc6e575d36e7bdc90f644fadb2f4b75b95", size = 4985772, upload-time = "2026-07-31T14:24:20.385Z" }, + { url = "https://files.pythonhosted.org/packages/74/9a/02ffe35b2853d121689871eb5dce862092562b3a1ed5cc98f1aaed441506/cryptography-50.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:12b9c6996425c76ea6c457ace4f3073e715b8c545add07cd1a8f3a4f90691269", size = 3816291, upload-time = "2026-07-31T14:24:22.125Z" }, + { url = "https://files.pythonhosted.org/packages/03/37/73d005be173aff344af30e9fd2a576575cb2391a7101d9cd3842e1fa8cce/cryptography-50.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ccdc4a71a4dabae05de219404f9f4abc38e3b58422177ff93d0da05967dafa07", size = 4036009, upload-time = "2026-07-31T14:24:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c6/7a6202a534e32103a285b7834a120869557fe198d51d7cfe59754c8bda9c/cryptography-50.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:910e1d2668e7de9648f2bcee30e180db2a6b15c30f887d7c4c93ddf96e3992e3", size = 4745252, upload-time = "2026-07-31T14:24:26.118Z" }, + { url = "https://files.pythonhosted.org/packages/85/4f/0fa8c2f4428198f15d9ff8d63400e27afbf94ce833f6108da1eb3753f945/cryptography-50.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a91296cb61e8df6f86d0c19cc4068228da256bf59bf86049fbd821084565327f", size = 4728939, upload-time = "2026-07-31T14:24:27.994Z" }, + { url = "https://files.pythonhosted.org/packages/d1/63/54dd723490ba2dc09b299682c10b38db38f159728bcaae8c591b8af2f22d/cryptography-50.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e722f16708d854fe924790e051061f6704a472c3bac347b6fd88033ea8dd0dc5", size = 4748483, upload-time = "2026-07-31T14:24:30.254Z" }, + { url = "https://files.pythonhosted.org/packages/1d/dd/7c77d26285cc7f6991efce64a0f5b4f9383bfa5dd8c5033003eaf7db4cdb/cryptography-50.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d764dcf130c428ef66786f866dd750f53182bc608813489915e9fc106bb0c82f", size = 5367599, upload-time = "2026-07-31T14:24:32.457Z" }, + { url = "https://files.pythonhosted.org/packages/46/c9/f60aed34c013f317f92817b6c171c2d22a78270fa41109bd4b08af26b194/cryptography-50.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:105110f43a471dbd0060b9c9516cb8a6a79233631a04cc2ba16f28323ac6e025", size = 4762647, upload-time = "2026-07-31T14:24:34.599Z" }, + { url = "https://files.pythonhosted.org/packages/be/f3/f9a0173b139372c3a48ed98154b45cc6b9de17c789d5ab552e621c293609/cryptography-50.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:828743d939e9629bc267b8e2d08d8bb67cd4319c771a33d4b18b22dd8fb7440a", size = 4385197, upload-time = "2026-07-31T14:24:36.647Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/83bb81f6e569bc38e1e4a7bc80f29b46bb9601920bc455fc8e888f5d5742/cryptography-50.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a8183b489dc1f7f80f135780fadc1108f14b31b8a40411c7a5b17425f65f28b", size = 4748095, upload-time = "2026-07-31T14:24:39.493Z" }, + { url = "https://files.pythonhosted.org/packages/6b/16/d3008eff98c764979865834c3d386d4fd041b5f52e7f34fc29ac1a5eb515/cryptography-50.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6e7d61120573a7f2cd94cc095f9e81f6967c61ccdf194285aa143ecec8e0b708", size = 5325948, upload-time = "2026-07-31T14:24:41.556Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f8/d97f9603efda3888187bfdb893f26c41be4735c10631d05d284ee6b047c4/cryptography-50.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:37fdb0d0111f1e2ff07139dfb79f1b49531f8e213c46f1163dd7642979b58c47", size = 4762400, upload-time = "2026-07-31T14:24:43.636Z" }, + { url = "https://files.pythonhosted.org/packages/64/a2/4615c8f7d81a00b1d6e6afe19f694e1543582349fb5f4076f6cb5dc36485/cryptography-50.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87f62a3d3b9888ed0fdde100ec06aa61ca9cd44bad9057d1dff9a516b5f5bb9", size = 4878208, upload-time = "2026-07-31T14:24:45.522Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1a/efcfb02f91407149a0dacffffab791f7e19bf6385f63b3666dc8b5e5c9c8/cryptography-50.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:65c2c3add92b45fd0709db8594536aea39c2a67af0e27ffcf049c498501140b7", size = 5037050, upload-time = "2026-07-31T14:24:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/57/30/4a22984d4f1bdfb8c054f07a92bc176b97a3134cc1d6c4b3bffb1f3688b4/cryptography-50.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:d24fead1d4d076e1bfb006dcec392074a3cd8d7b4fc8a595aa64073b2b7a96ba", size = 3874135, upload-time = "2026-07-31T14:24:50.085Z" }, + { url = "https://files.pythonhosted.org/packages/9d/3e/e54cde8c01631a5a8226ccd617eab9e57fd5cfdad90f1a9e6bb570794631/cryptography-50.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5e34edd123674534acd70147f0ca331eaa2c74e6325fb2028c886aa26ba0b68c", size = 3963170, upload-time = "2026-07-31T14:24:51.968Z" }, + { url = "https://files.pythonhosted.org/packages/01/b6/0b9e125e90f3d2dcf599a218a899cda7326a3158cfa258723f0b398b08f6/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8eb5e1172eb569ea8a872796576e6a67c276351728b6455d5beb01242b027c6a", size = 4692441, upload-time = "2026-07-31T14:24:53.743Z" }, + { url = "https://files.pythonhosted.org/packages/53/c9/a5151588710785a96d7bc4de27d4cd62f263bbbcb203cfe29df537eb6505/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:910d11e1a385c654bf738bf3e6b8e6ed5de0f5610fcae2be9e5b398d8081d20e", size = 4699810, upload-time = "2026-07-31T14:24:55.746Z" }, + { url = "https://files.pythonhosted.org/packages/c7/1a/15b92b25eb6ce3089cd49377ae990a0f3ad485a510f968aed1f19dbdcdf2/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:62598a8a57f815db4c6259a4e97d857dab56697e7de8e8ab02352ab74da1995d", size = 4691924, upload-time = "2026-07-31T14:24:58.082Z" }, + { url = "https://files.pythonhosted.org/packages/62/15/219075012ab13e8905f3cd572204f4acb4b111df787104346b9bc0cea789/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:07479a1cb08219ab719147e742e76090c9c773321959bb94946fffdd397a6437", size = 4699593, upload-time = "2026-07-31T14:24:59.951Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b5/c2c5fce26f0ee40d21bafe7f191d29a34b35a65ac4fe8a1191d1983612e9/cryptography-50.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c99c003e088647b8a5b7c145d6f78c335f6348332b62e142d411c4b63d1460b9", size = 3813796, upload-time = "2026-07-31T14:25:02.298Z" }, ] [[package]] @@ -1022,12 +954,12 @@ name = "deepagents" version = "0.6.12" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "langchain", marker = "python_full_version >= '3.11'" }, - { name = "langchain-anthropic", marker = "python_full_version >= '3.11'" }, - { name = "langchain-core", marker = "python_full_version >= '3.11'" }, - { name = "langchain-google-genai", marker = "python_full_version >= '3.11'" }, - { name = "langsmith", marker = "python_full_version >= '3.11'" }, - { name = "wcmatch", marker = "python_full_version >= '3.11'" }, + { name = "langchain" }, + { name = "langchain-anthropic" }, + { name = "langchain-core" }, + { name = "langchain-google-genai" }, + { name = "langsmith" }, + { name = "wcmatch" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e0/db/a6acdc72a9e90c3f07ed10de35c951734a02d4facb693bb59684ad368801/deepagents-0.6.12.tar.gz", hash = "sha256:1f281c0bc5a63132f62e2ee345c1dc593b23188da6e23016401f6879fbe54b5f", size = 211364, upload-time = "2026-06-25T17:26:52.775Z" } wheels = [ @@ -1036,15 +968,15 @@ wheels = [ [[package]] name = "dependency-groups" -version = "1.3.2" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/16/65e61d8e837e0d70a99a0d4dd76e2af53357c3a03ed1db8ad9b5786d7f25/dependency_groups-1.3.2.tar.gz", hash = "sha256:c81831f43828dbc3987ee247eb198241a0152b8e7ceab10977cc3808eb388ac7", size = 13309, upload-time = "2026-08-22T02:43:30.137Z" } +sdist = { url = "https://files.pythonhosted.org/packages/62/55/f054de99871e7beb81935dea8a10b90cd5ce42122b1c3081d5282fdb3621/dependency_groups-1.3.1.tar.gz", hash = "sha256:78078301090517fd938c19f64a53ce98c32834dfe0dee6b88004a569a6adfefd", size = 10093, upload-time = "2025-05-02T00:34:29.452Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/e4/da5f2f176050efcfb9222a76a3e81c41f69f775be8e563b76ca4292a134f/dependency_groups-1.3.2-py3-none-any.whl", hash = "sha256:8c337f7b92445823b0d0ea507f611390c58dcd2112be00aebcd738a2ca7a1c64", size = 9802, upload-time = "2026-08-22T02:43:28.853Z" }, + { url = "https://files.pythonhosted.org/packages/99/c7/d1ec24fb280caa5a79b6b950db565dab30210a66259d17d5bb2b3a9f878d/dependency_groups-1.3.1-py3-none-any.whl", hash = "sha256:51aeaa0dfad72430fcfb7bcdbefbd75f3792e5919563077f30bc0d73f4493030", size = 8664, upload-time = "2025-05-02T00:34:27.085Z" }, ] [[package]] @@ -1102,7 +1034,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1199,11 +1131,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.32.6" +version = "3.32.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/46/126b1831dca12060d4a8296bf9c4fe5c93c4f22197fa239cb0cc82042bba/filelock-3.32.6.tar.gz", hash = "sha256:a3f55a18af3652a94d8f47d6055df434f254ca1d02ef2524850c6d249ca2512c", size = 225172, upload-time = "2026-09-08T22:57:11.528Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/57/3ba6e6cb097f85b855b00163d169f35365f44277df044dcf96d55b8f62a3/filelock-3.32.2.tar.gz", hash = "sha256:c33351e1f49cae33414acbc6d56784e6ecee82514ec90795da1161fc4836b5b8", size = 217172, upload-time = "2026-07-29T22:46:04.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/06/4f138f618dbea66803291274f228f01daf29f306fe8b96bc30dab765df75/filelock-3.32.6-py3-none-any.whl", hash = "sha256:3f16ecd0117feae0dfc147e8c62eb5daeccd8bd800378c3ddf416de9b4feb6b1", size = 100189, upload-time = "2026-09-08T22:57:10.182Z" }, + { url = "https://files.pythonhosted.org/packages/c1/e8/72f8cef9fdfeffe06213fe8508039396ee48daa0e3259457ed766173bfd6/filelock-3.32.2-py3-none-any.whl", hash = "sha256:87dd94cf281e586d135fa51132b8e3d9a598b316e90377a288663c9321036c82", size = 98830, upload-time = "2026-07-29T22:46:03.52Z" }, ] [[package]] @@ -1378,7 +1310,7 @@ wheels = [ [[package]] name = "google-adk" -version = "2.7.0" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -1407,22 +1339,22 @@ dependencies = [ { name = "watchdog" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/50/cc4b5563222fab77ee7f95367e2e6bc0663ef74b62e0b519e2028157cb0d/google_adk-2.7.0.tar.gz", hash = "sha256:283e16dc5ffab7684e17098f7282470339e88a3d16ecfa62b4025680672c906b", size = 3806369, upload-time = "2026-08-13T22:22:06.379Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/5a/a8a1fd24f8bfdbd64e54e1ae954ddb272d1debc61a7a69ce4a8277c70e32/google_adk-2.6.3.tar.gz", hash = "sha256:a5f290ead5f8893ad3aaf3c7a0053893624c82ff5c447c90800904f633a8c72d", size = 3721520, upload-time = "2026-08-07T21:18:44.149Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/6e/c97d9fe60a47f605aa5013a28ef76beef573f3d96a356532e840fa05ee20/google_adk-2.7.0-py3-none-any.whl", hash = "sha256:6517c0383d9449484b6398a5b60c6408dbd4de369e957eebc3b9d8d0c90736e9", size = 4395958, upload-time = "2026-08-13T22:22:04.119Z" }, + { url = "https://files.pythonhosted.org/packages/e4/37/bab5ae6d5ac57a04bfae128f755c56e2d878a7d9dcdbd461282baf19344a/google_adk-2.6.3-py3-none-any.whl", hash = "sha256:3c53fc7885bbc00f98fe90e30474ad7ef7d1ccdc4dd7aa0be154721e61295f04", size = 4305269, upload-time = "2026-08-07T21:18:41.71Z" }, ] [[package]] name = "google-auth" -version = "2.58.0" +version = "2.56.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyasn1-modules" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/ca/f398a483ce5aad18ca2f735646e45ccee2439bd94a41a4ad0cfa646bd495/google_auth-2.58.0.tar.gz", hash = "sha256:55e30cf15e737de92c5323d78cda8a83fcd57e7ffbaf900c4600039fd60a80fd", size = 380018, upload-time = "2026-09-09T20:49:38.043Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/4c/fa42116a48bab3f7a143cf5042ecff7df9c8b73f8a376203cd534d1dc966/google_auth-2.56.3.tar.gz", hash = "sha256:40e229fc901f0a305b553050e5fce562d509bee0435be053abfa91582b51b90c", size = 367110, upload-time = "2026-08-06T06:24:01.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/13/477d90d09591b3938b45c4e11f4d8a51291682112cb5efcac961e815d562/google_auth-2.58.0-py3-none-any.whl", hash = "sha256:8a9c4645bb4c8e91668fb1934b95ae6a8687084232753639220ba9bf04a1610d", size = 262404, upload-time = "2026-09-09T20:49:33.951Z" }, + { url = "https://files.pythonhosted.org/packages/bc/b3/6117b2f24065cd7e2c4f140e9a193e215f089ca8ba314cf91eb9d0b7fe0a/google_auth-2.56.3-py3-none-any.whl", hash = "sha256:8ec438808f813ad034535000261eed1067475d229d05bbf4216e78c3f2362e53", size = 259116, upload-time = "2026-08-06T06:22:51.788Z" }, ] [package.optional-dependencies] @@ -1435,7 +1367,7 @@ requests = [ [[package]] name = "google-genai" -version = "2.23.0" +version = "2.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1449,30 +1381,30 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/9a/db14adffb0144584889e05f433a4e8ce540f9ed2928ed8b23cc65ab96178/google_genai-2.23.0.tar.gz", hash = "sha256:1ceebffdcd2af30c039a922ba05de61cd4054bb61c94be7649c4bf9ff8b33c5f", size = 686707, upload-time = "2026-09-10T22:55:31.12Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/2e/03a0486e192cde27f7ffbb20c63fa934a132396a667b1a0e1b7e5f606ad7/google_genai-2.17.0.tar.gz", hash = "sha256:6b640a2390c82b4a240873eddb9f518c6d2c33244b2de16ed3d14526a6da7f57", size = 648676, upload-time = "2026-08-06T05:10:41.382Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/b0/f6bc58a6a7c8ad7ad2b6a36b0bf4732b3504dd7d48c6674f848304548869/google_genai-2.23.0-py3-none-any.whl", hash = "sha256:1e63211d44d188b8069c2b354d92b9bde25c1e821513fdbe1948b7c0d9f6b922", size = 1093785, upload-time = "2026-09-10T22:55:29.282Z" }, + { url = "https://files.pythonhosted.org/packages/b3/37/71e397a5b93d9a3c139e95acdcb00b4169ed59ae20e16616f2875170abb7/google_genai-2.17.0-py3-none-any.whl", hash = "sha256:a4835563c60aee646c9c4b261c507aa4a624710d25017012d20dc65abf3d9a54", size = 1044950, upload-time = "2026-08-06T05:10:39.308Z" }, ] [[package]] name = "googleapis-common-protos" -version = "1.75.3" +version = "1.75.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/c5/4353a188e2c335aee33269e8b654af228278cca8e5f0b4b5f11e5d0e9adb/googleapis_common_protos-1.75.3.tar.gz", hash = "sha256:57c435ac2c68b108999b6db075d9053e4d7a936ba57b4a3d45667b1346f1738a", size = 153905, upload-time = "2026-09-03T22:31:21.869Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/73/74bcab964c9a7a61f2bb71e8179b0f13e6fa98f7ce00fd168aab291e4a2e/googleapis_common_protos-1.75.1.tar.gz", hash = "sha256:d3042c6c5a2d4e67113104d6b6818b59b6bd92a197f2a91508e801fe815cf071", size = 150967, upload-time = "2026-08-06T06:24:51.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/7a/7d79170c6ce6f12e109df2b3879d6b934010cf4f99aea8de8b7e5408c174/googleapis_common_protos-1.75.3-py3-none-any.whl", hash = "sha256:a018d2bf098ca9fb6faa08d5bb780e2a2c2f73c566f069761331386c9596d3f2", size = 306984, upload-time = "2026-09-03T22:30:45.133Z" }, + { url = "https://files.pythonhosted.org/packages/9a/51/186c02b8549b69ccda44429cf6ff5081e4b61a602ddfe6a8020d1be31d1b/googleapis_common_protos-1.75.1-py3-none-any.whl", hash = "sha256:28a1934bcd33b9c9da66ac301a0a4227e3367f095a17d0375cb98f0a09d93b79", size = 300626, upload-time = "2026-08-06T06:23:46.696Z" }, ] [[package]] name = "graphql-core" -version = "3.2.12" +version = "3.2.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/7f/671c1046fe72ba5b62be2de3979ea9e61cb3dba8f1edfb880b811f8bdf8b/graphql_core-3.2.12.tar.gz", hash = "sha256:4579094d5fc8a1a59555a9b18e51b320779d9bbc63e2302c519af0c4919d9543", size = 531478, upload-time = "2026-08-27T20:25:48.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/90/f2aff026ab4aebd80eb71905106a0885f4cfde85dcf965543f45bed0d9ee/graphql_core-3.2.11.tar.gz", hash = "sha256:e7e156d10beb127cab5c89ff0da71416fc73d27c484a4757d3b2d35633774802", size = 528407, upload-time = "2026-06-05T13:45:22.915Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/b6/304c572e79b9e82982dbd5091e26a89f5018e565868091d804c2142f6ba5/graphql_core-3.2.12-py3-none-any.whl", hash = "sha256:3d8f104532070485e13caa4092c1e71cda2ba6cffd96e98f285111ee10ed1e51", size = 216042, upload-time = "2026-08-27T20:25:47.234Z" }, + { url = "https://files.pythonhosted.org/packages/00/15/b92b4e1d88d02c6eff9733c9eea21846ab435cc4d813d84ccc5d335955df/graphql_core-3.2.11-py3-none-any.whl", hash = "sha256:0b3e35ff41e9adba53021ab0cef475eb18f57c7f53f0f2ca55567fbf3c537ea0", size = 214879, upload-time = "2026-06-05T13:45:21.245Z" }, ] [[package]] @@ -1486,155 +1418,135 @@ wheels = [ [[package]] name = "griffelib" -version = "2.3.0" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/af/018c10bc9edd42b6ef6db2e96b09542050d5253f9b195e74bc910b2d13ab/griffelib-2.3.0.tar.gz", hash = "sha256:7b0952caf5bca6afa4bb5ee8c6a2d183fe3f21b62efc5f6c7243cb2b26d2d115", size = 234534, upload-time = "2026-09-04T15:08:17.472Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/e4/8d187ea29c2e30b3a09505c567513077d6117861bde1fbd997a167f262ec/griffelib-2.1.0.tar.gz", hash = "sha256:762a186d2c6fd6794d4ea20d428d597ffb857cb56b66421651cbba15bdd5e813", size = 216234, upload-time = "2026-06-19T12:05:42.278Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/63/e876e789525063c840ccfa8857febdabd6523bcef9ce7eb979b9305ea895/griffelib-2.3.0-py3-none-any.whl", hash = "sha256:1b8f9cd525681c26b1d6d574faa1371651e8459ca51d209684f50b8096ae06e0", size = 169423, upload-time = "2026-09-04T15:08:12.956Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl", hash = "sha256:cc7b3d2d2865ad0b909fcc38086e3f554b5ea7acbaa7bbb7ecaa3f5dfb7d9f00", size = 142560, upload-time = "2026-06-19T12:05:38.742Z" }, ] [[package]] name = "grpcio" -version = "1.84.0" +version = "1.83.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/4f/4435c0aae54657258d9cfcba78598f3d9e5fe4c82ff18d78558567b90faf/grpcio-1.84.0.tar.gz", hash = "sha256:19aaf172fc2edbefccce3f6e92c5150975dbe56c45744e9e87cf72ebdf85bfbe", size = 13493876, upload-time = "2026-09-14T06:59:33.291Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/4b/a0dc421d049b743093eae90caeb5dd92ced7226cd4919dc4de34c81455b6/grpcio-1.84.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:71fd60e6e426d293d0a2f685115ad0a0845117602cf13605a4be7524fb5f7bba", size = 6450049, upload-time = "2026-09-14T06:56:48.72Z" }, - { url = "https://files.pythonhosted.org/packages/f7/41/90292bf55af7aa09de0e3ec928d1b8c56d477f85244f7928d2231630b781/grpcio-1.84.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8e1a45d174b6b8589f51dce1cea804aa6c1f72c9c80cba91ae2caabeb6d90540", size = 12344932, upload-time = "2026-09-14T06:56:51.685Z" }, - { url = "https://files.pythonhosted.org/packages/e9/68/b6c0248266a378b1bde08e4de7d69f3cc08ee6f5937a5dce7d3c3ba0fe1d/grpcio-1.84.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efb29f8633bf6630dc89de4fe0353ac3d7e4b70ef7b6e29fb40f00e68c127fa5", size = 7030162, upload-time = "2026-09-14T06:56:54.412Z" }, - { url = "https://files.pythonhosted.org/packages/70/2b/0a2a2cbcf48847f83eb51fb982116d0965f2fe068e73f28b2d17facf30a4/grpcio-1.84.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d0fdd25faece8a1f95e8a3a8006e29701b5cf8dadb4a8132e68f3134637004a5", size = 7781546, upload-time = "2026-09-14T06:56:56.571Z" }, - { url = "https://files.pythonhosted.org/packages/a6/7c/da97476f3c2e90e9f00bfb19def7cbb5f841b7661e3cd09c6a89beaa5b98/grpcio-1.84.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:393d8a78bff6731ecc5ad2151a821f8fbc1709b137ebb9c25a4ef399fbdcc914", size = 7186279, upload-time = "2026-09-14T06:56:58.817Z" }, - { url = "https://files.pythonhosted.org/packages/14/16/27fa3aed1ee6fdcbb978a1bd4bce255dc0122b90179535177a96543d14fc/grpcio-1.84.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fc66cb50c93554b86db0b6625ab5c6e9051dbf8847c08d93c84918e02e413fb7", size = 7731191, upload-time = "2026-09-14T06:57:02.447Z" }, - { url = "https://files.pythonhosted.org/packages/4c/78/75644af37af85afb381376aef99cad92da8bc2d56ba3e5ae070a7cb59682/grpcio-1.84.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:455ed6083353b8e938f1d58c765eab2fbb165731e5b507be30fee344915a2a11", size = 8790443, upload-time = "2026-09-14T06:57:04.623Z" }, - { url = "https://files.pythonhosted.org/packages/95/4d/ce57fa986e93c06ef867f64e1ebe419e924fdc2395115607f0725f4855e4/grpcio-1.84.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d6a82c4fc6c85f2fb7572c86bdb86f84c97b6580e5f6599f711800bac48a5d8", size = 8138068, upload-time = "2026-09-14T06:57:07.348Z" }, - { url = "https://files.pythonhosted.org/packages/ba/a6/22a73111c4f75da9450bf0481fac805396ec9bf6f949a90bb2969de07cf4/grpcio-1.84.0-cp310-cp310-win32.whl", hash = "sha256:8e3f508d0e9e6236ba2f08d56e33355e434e785e813149a1b8477d3edf69779d", size = 4496545, upload-time = "2026-09-14T06:57:09.236Z" }, - { url = "https://files.pythonhosted.org/packages/31/ff/dc048bc3d8ebd8d4b7f6f6803c76142a9a5ca1e1e9fa34e79597f0f9ed77/grpcio-1.84.0-cp310-cp310-win_amd64.whl", hash = "sha256:ed2c1493c44d0932f1e55fdb5d1ead658c68288ec5d51b8c4928422d98633ef9", size = 5258144, upload-time = "2026-09-14T06:57:11.403Z" }, - { url = "https://files.pythonhosted.org/packages/2d/b9/46146728b3f4a5c7e34c17d0ab724d58b5456b116e76dc77d3ef4e79b135/grpcio-1.84.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:4aaeceeb7fa7d824c322d1ec3208c8495c88478a927295553235435fc49043ad", size = 6454572, upload-time = "2026-09-14T06:57:14.651Z" }, - { url = "https://files.pythonhosted.org/packages/e3/63/5d668b4102637410d700153fd12d6a798e3ff8308bd9dcbaeae93f191060/grpcio-1.84.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:06619ba1515e5ee69fb2a514e95dd8be05ce74cb3928d5b34f87f87c86fe3c27", size = 12359529, upload-time = "2026-09-14T06:57:17.202Z" }, - { url = "https://files.pythonhosted.org/packages/18/2a/52e29c02047a493f15a78c0502bde4d3fab7c19c7813944d367cd501811c/grpcio-1.84.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:158c1c11cfb61b4849c3caf4d52de6f5ecd376e14446feb4a90dc95a90d616f5", size = 7029927, upload-time = "2026-09-14T06:57:19.767Z" }, - { url = "https://files.pythonhosted.org/packages/0a/11/9962b313553647abb091943e0721e4a1662ecc63cdfe930abf00abcce47a/grpcio-1.84.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:a9383401d9f116f98cacd4eba6c505a6edb80ba65badfc8e8ed8ae64983bcc44", size = 7782268, upload-time = "2026-09-14T06:57:22.381Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b7/14a9413cb7d4b2e782b4f79c81a918610caedf55138ab5916f5fdd4b002f/grpcio-1.84.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bd8ea8eb3817b226057cc1c0e7ec4b378dcda52043b972b6ff12b1152178967d", size = 7187959, upload-time = "2026-09-14T06:57:24.686Z" }, - { url = "https://files.pythonhosted.org/packages/ee/3b/6cc8e6aed8f23be40f52af341e5d4595ec3ec8d7572271a692b5c1212178/grpcio-1.84.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:756ea5c2da00fa65c930284892d2a9706828704ca3ba40b4c51c4834eb39fcfd", size = 7737554, upload-time = "2026-09-14T06:57:27.5Z" }, - { url = "https://files.pythonhosted.org/packages/3c/7e/6f61002a01802ca9675e1b3599c9b0f9f3cf168ded94ebacc02199309f88/grpcio-1.84.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:28d2609691da93051e998495108bbddd2a9f7a561253bae94828d81290f30c15", size = 8792681, upload-time = "2026-09-14T06:57:29.731Z" }, - { url = "https://files.pythonhosted.org/packages/eb/84/8bec1ae7e6732a9b435a394ddfdfffde46c2620ae0109823f7cce1a54455/grpcio-1.84.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:27b8b36200a9fbee6e120246f4a8a41657549107ef19fb2c819c4b2fd524f39a", size = 8145493, upload-time = "2026-09-14T06:57:32.672Z" }, - { url = "https://files.pythonhosted.org/packages/59/84/c8c7bd210d657288f18af06522f150f61e81ea14fd3c7c135beed697c5fd/grpcio-1.84.0-cp311-cp311-win32.whl", hash = "sha256:465eef3d17e59ad22a556fc0138f7c7c799df426734344daec42c797d49fda99", size = 4495596, upload-time = "2026-09-14T06:57:34.799Z" }, - { url = "https://files.pythonhosted.org/packages/da/1e/da99356b3b573af357d059753a47fba54f1ca1a9c0e4deccd0210cb7f4ba/grpcio-1.84.0-cp311-cp311-win_amd64.whl", hash = "sha256:f9a456bdbed52a01c9ab8423bdebab04a5363c78676edc55ab9b58bd13bdf9e1", size = 5259900, upload-time = "2026-09-14T06:57:37.067Z" }, - { url = "https://files.pythonhosted.org/packages/0a/c1/4c9a2e0e6b0aaf02781404cad2f79211f989f2c827cf672a4a48d1604d3e/grpcio-1.84.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:b5c6f20d657ae09ae4e30d9d3a21edd13f1219d58cc6f999b9d1bb63be9c1baa", size = 6415756, upload-time = "2026-09-14T06:57:39.345Z" }, - { url = "https://files.pythonhosted.org/packages/b1/57/131e7007bdee9acb77a8dbe8a16fa9fef75f88c1695242d8ee0993ac2d3d/grpcio-1.84.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:406583b4e8fb2282ebd392e12b963e601c1f82e07125a8c2cb5b144e7e024796", size = 12339195, upload-time = "2026-09-14T06:57:42.373Z" }, - { url = "https://files.pythonhosted.org/packages/db/d1/a7b7cda98fcab9b3d2916204a872d87371158a7a34e41768f524584fb64d/grpcio-1.84.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fbdbcd06986ede3ce584083b1dc2afe6808e8943e5cf50ad11183c03aceda25a", size = 6984468, upload-time = "2026-09-14T06:57:45.035Z" }, - { url = "https://files.pythonhosted.org/packages/19/81/c5be83e3ac9416f73c4c51fe1ea9c41a0c42fc3509e3505faa46f5046abe/grpcio-1.84.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:23e6e8e8a75cff88e0a793bfd3becea03a13e2763ae90c1ff573bc19ca5b429a", size = 7749432, upload-time = "2026-09-14T06:57:47.395Z" }, - { url = "https://files.pythonhosted.org/packages/a0/bf/258cd7c0a7ed92745dc93c31666d462d05b702807a689744bd49fb833bde/grpcio-1.84.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b44f0a0fc7bc6677d38cc80bca1a32814ce6c8f200fb8b3c1a61c9d77eaefbf3", size = 7156115, upload-time = "2026-09-14T06:57:49.657Z" }, - { url = "https://files.pythonhosted.org/packages/2b/4b/7f829418dbfcf91b875e55e2973f1059a95decb4f081313416317ef04ec1/grpcio-1.84.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:210e4c32f907045eb8158273e60c6ab69a3947697df6245dbda381f26c59485b", size = 7708010, upload-time = "2026-09-14T06:57:52.496Z" }, - { url = "https://files.pythonhosted.org/packages/34/f0/9932e2fec6a04205f8bf3f8f4d2020479dcdac88feb6f93822ed31bf0eba/grpcio-1.84.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a71d24f40b0cc6798feaa978c7411dc1135b7018e9fc0442db611c139bf58344", size = 8759980, upload-time = "2026-09-14T06:57:55.312Z" }, - { url = "https://files.pythonhosted.org/packages/2c/5c/b67407c6dbc480dfc0715f6eccdb1061e7c88d85f9a330a241d357a538c5/grpcio-1.84.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f6c972474ce691aca74e58d17625450cef153dc4760364cadeb167983ea6d589", size = 8124904, upload-time = "2026-09-14T06:57:58.569Z" }, - { url = "https://files.pythonhosted.org/packages/02/37/2bfdae2df8dfcfc0df619b628e0c7153ce703adae827243f44720322ccc1/grpcio-1.84.0-cp312-cp312-win32.whl", hash = "sha256:0d532ade4486dad9b302ffa4d4683d67561051c26d17c4023322845e9fa10140", size = 4478915, upload-time = "2026-09-14T06:58:00.714Z" }, - { url = "https://files.pythonhosted.org/packages/85/2c/309268b7b39f6deb2342f634841e105623a0b67982e8b10ec516782ff1c6/grpcio-1.84.0-cp312-cp312-win_amd64.whl", hash = "sha256:49717e857899f4136d7657bf5aded61ac479110a075438290923a4d86af7cd02", size = 5253534, upload-time = "2026-09-14T06:58:03.336Z" }, - { url = "https://files.pythonhosted.org/packages/5d/51/40f99701adb01d4e5316a2aaf13838da1a24d5c879cd8c95156d7c364454/grpcio-1.84.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:209414080da8c20af94df1395b635da52dd57b5edc9e917e1deca0dc1c4bb55e", size = 6427619, upload-time = "2026-09-14T06:58:06.025Z" }, - { url = "https://files.pythonhosted.org/packages/c5/4b/ed8e22a1237e6b2be6ef4f221d074a5b0e0dd8a0da8c944c04aea731f0eb/grpcio-1.84.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:e41c3993eee896c617dbd8a505085d28b6e84a0445ed9a1f40f95808473cf678", size = 12336549, upload-time = "2026-09-14T06:58:08.583Z" }, - { url = "https://files.pythonhosted.org/packages/d3/50/00165b05cd73f45996748ea67ce9e55d08936f2fea94a7fd8541cc2d0e54/grpcio-1.84.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fff5ef3fe1bba7d6147e5f19e01e5e122ac2c076486887ddcb8d42e663400fbe", size = 6989458, upload-time = "2026-09-14T06:58:11.884Z" }, - { url = "https://files.pythonhosted.org/packages/26/38/d0486230e684d916f97429a53041db88410e662a38f2a8d09e2d90375840/grpcio-1.84.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b8c62888c3e49debf37ad9773e3c02f77b0c1e811f8fb0962f2b6c3bbab5b97a", size = 7757778, upload-time = "2026-09-14T06:58:14.849Z" }, - { url = "https://files.pythonhosted.org/packages/da/56/548a643decb059ca244499c675ae2c13a15f523ba94592c2774bd80a13c1/grpcio-1.84.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:986e9751d416d7a6eaa2fecdac38da63153d63a4b340ba7d624889c490451500", size = 7159572, upload-time = "2026-09-14T06:58:17.87Z" }, - { url = "https://files.pythonhosted.org/packages/db/f5/42caac81a79ec680f1f7a8eaf7ca90d2f93936ce0c3a073141ba96757f77/grpcio-1.84.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5933a052946873d01a42119a05420d669bdca436aeba2d1851988ccb12b421c0", size = 7710547, upload-time = "2026-09-14T06:58:20.607Z" }, - { url = "https://files.pythonhosted.org/packages/57/a4/828ad990b2410fee0a55cc73aa1bf98eb5b911c54847374ef4f24b9e877b/grpcio-1.84.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e094dd21f077af8194923fc263cad872eaa1802bb0156fd7e5ae18e99cd86715", size = 8761519, upload-time = "2026-09-14T06:58:23.875Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a5/1f91af098919eaf5d80d5a61126ad9fae074e5190c25a3014ce1d8d0d890/grpcio-1.84.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08735e3d08d24ab3132cf87e2e5dea8746cabcc7d676c2b0b7362f195feef9d9", size = 8121424, upload-time = "2026-09-14T06:58:27.006Z" }, - { url = "https://files.pythonhosted.org/packages/8c/8f/77fd4a7a913b636785479922349c4cb98d94d05d15652e556b3ca0df6663/grpcio-1.84.0-cp313-cp313-win32.whl", hash = "sha256:70bb4ce8be0c5606bec259cbd7152374470396413b7863a658a08c849e6b29ff", size = 4477974, upload-time = "2026-09-14T06:58:29.528Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9a/1fa59ddbfc8898e5518d1447e46f771f387f0ed6132ad531395338e51a5c/grpcio-1.84.0-cp313-cp313-win_amd64.whl", hash = "sha256:b61692f0069b3eee2fc8a3a1b7f6c044df9e03fede6ce69b3ca832e1c39f26c5", size = 5255326, upload-time = "2026-09-14T06:58:31.781Z" }, - { url = "https://files.pythonhosted.org/packages/26/6f/e25ca89ca5b0b7b95464c907a5c21a77c0ac8c4ee1dca164c4dd8f153ddb/grpcio-1.84.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:026d757df86c5b7a41de8200b9a2cda454aaa5004cb0c7e3374c66eb82f61499", size = 6428207, upload-time = "2026-09-14T06:58:34.401Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b4/6b76b429f3f9b901cdbc306c81364d708bc957f847a05cbd1046cd2d05d8/grpcio-1.84.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3de427b05f244ba2c2a9bdc67e7a6731c8340811524ecc4435466549f8af1d17", size = 12342420, upload-time = "2026-09-14T06:58:37.416Z" }, - { url = "https://files.pythonhosted.org/packages/af/64/ac86d638ba7f73bee0dccb608ba551d4f63adf75151f00d2c43e46d3979e/grpcio-1.84.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e90e3bdf7b5eac005fef631adae9cafde16f922def207b80a7c46b253c18ad20", size = 6998396, upload-time = "2026-09-14T06:58:40.535Z" }, - { url = "https://files.pythonhosted.org/packages/4a/65/fa12e9ec9d7ebf8cc3e81428fa9e1ca0d30d22d546ce2baa4c64bc917cbc/grpcio-1.84.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e88d304f094f4937bc27ec6a435e218a084168f11ec630c8d5d39b431d08d81d", size = 7757538, upload-time = "2026-09-14T06:58:43.297Z" }, - { url = "https://files.pythonhosted.org/packages/21/d7/94240c7fae121ff1f116dcf04a3b7ee0216a06832c704310363f72638d4c/grpcio-1.84.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:57dc36a5ab0e676f5f6e171de2917fd0aef73f32a9aaf23956bfe19997a30bd1", size = 7161480, upload-time = "2026-09-14T06:58:45.939Z" }, - { url = "https://files.pythonhosted.org/packages/23/c9/7033e95d4b344969818b09185721c7608b47fc2498d97b5e4eec4995dbf3/grpcio-1.84.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5deda5b4bf62769eb98c119cca43d40e1231e34846b19db5cdea821d446a2253", size = 7720191, upload-time = "2026-09-14T06:58:48.308Z" }, - { url = "https://files.pythonhosted.org/packages/95/22/b45df2deba81d55069076859480bae7109c9eec02bce5515c799530cc2aa/grpcio-1.84.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9bab4cf571653a8afffb83ce21aa27b51dfe629b526b7b6adec35491fe1fc2ea", size = 8762792, upload-time = "2026-09-14T06:58:51.068Z" }, - { url = "https://files.pythonhosted.org/packages/de/c4/3e1c3d6155c16b8737cc31d5b477d6cf1fc7cdd10d58320cf0ec9b446f42/grpcio-1.84.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c5559b492007dc09b4de9b95dab05f0b5e53547aad230cf07e46c7dd017a3be5", size = 8123299, upload-time = "2026-09-14T06:58:54.332Z" }, - { url = "https://files.pythonhosted.org/packages/56/fe/f4864de5b815e5ba18858771f99381a398fac14117f89ef5291ed43d3c4e/grpcio-1.84.0-cp314-cp314-win32.whl", hash = "sha256:2c024da73b296f040b8360e60bd73a659b230093684a438da0e1260f34cc724e", size = 4562560, upload-time = "2026-09-14T06:58:56.894Z" }, - { url = "https://files.pythonhosted.org/packages/44/03/640811d4d8c84f5e603995c5a9bab725223aa472cad9ca4286c3bbf1c3e3/grpcio-1.84.0-cp314-cp314-win_amd64.whl", hash = "sha256:800b7e00d92553313c0463c200087930aa78678ec1d528193aeb50906f55989b", size = 5394092, upload-time = "2026-09-14T06:58:59.61Z" }, - { url = "https://files.pythonhosted.org/packages/4a/1a/9e3d2c9f005f680f03308fa894b1db91d4ab3f0fe65ff630c69561e91e95/grpcio-1.84.0-cp315-cp315-linux_armv7l.whl", hash = "sha256:47ecf0d9b81d981f07b61bd89eced9d2582f5eaacc3aaa36ad27f81aef70a27f", size = 6428252, upload-time = "2026-09-14T06:59:02.597Z" }, - { url = "https://files.pythonhosted.org/packages/77/34/0bc9f52ebf091311651eeab3a452fb557985604a3088cb5406f4d6df85d3/grpcio-1.84.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:61386101ecaa096b694d0dd278caf99a56aeec78440cc17e918eef0b50f2d567", size = 12359488, upload-time = "2026-09-14T06:59:05.646Z" }, - { url = "https://files.pythonhosted.org/packages/93/0e/c31052712f241cb6ecae9c226fabd519b7f8c64a7a40bac27e9ca0405b78/grpcio-1.84.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f6d178ba6dc8e82976c184b65fddde172d054c17237993a3e083efe4f134d55b", size = 7019339, upload-time = "2026-09-14T06:59:08.76Z" }, - { url = "https://files.pythonhosted.org/packages/55/b9/b9b33ea4f1eb4cad28833cade604febf357385b5ebb0c9c7562d020e167a/grpcio-1.84.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:15bb76489e337fc492685c9758e2fd4d4ab516b901ad830dc5a91987decf00be", size = 7107974, upload-time = "2026-09-14T06:59:11.568Z" }, - { url = "https://files.pythonhosted.org/packages/0e/9e/799d4c45db91bbdcd8c54b3982932dbcf3d059f7ce67dca3e8540faa1ece/grpcio-1.84.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82da34ae4f639c73ac46e521e00c0a49bf86f717b9fb1f405f133e98731e38dc", size = 7200036, upload-time = "2026-09-14T06:59:14.401Z" }, - { url = "https://files.pythonhosted.org/packages/45/dc/dcfdd13ada41aff9098f0c2c6f260eb7debbc88b84b7e5fcbd085165427d/grpcio-1.84.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:9b73836ba0e16fcbb57c31cf6cbc2907c8d8c790b83679df454b74bd15e0be04", size = 7742281, upload-time = "2026-09-14T06:59:17.348Z" }, - { url = "https://files.pythonhosted.org/packages/55/31/75eab2ec77b80804bc5e21cec99b57598e726fca6484cd3e8920a97639d5/grpcio-1.84.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:42959bd50dd660ffc3f2a9bec15a6da4f9aaa0dda555d59ff2d2e80b908456a8", size = 8113629, upload-time = "2026-09-14T06:59:20.584Z" }, - { url = "https://files.pythonhosted.org/packages/34/f0/fdcf6bdc1df9ca11679a1187bef8e6b81df31a2baae69497e17344f05ea3/grpcio-1.84.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:659728f20fc7a0933ed7b1945435e31014b97ab8a5a7edcbaa70da4794aeb191", size = 8152972, upload-time = "2026-09-14T06:59:24.523Z" }, - { url = "https://files.pythonhosted.org/packages/5c/cf/6720e720bfa80fcb1ace873f66724eb3c8b03bba2fa078a30c12cab3212e/grpcio-1.84.0-cp315-cp315-win32.whl", hash = "sha256:edb6f87fc60ff438557291501b3e16c7a77c3b01a52d782cf276dccc7c5dd89c", size = 4561981, upload-time = "2026-09-14T06:59:27.275Z" }, - { url = "https://files.pythonhosted.org/packages/7f/b9/69d8a709df225bc2e06e028e9465166b174c24b3da07cc72d9a5ddc63194/grpcio-1.84.0-cp315-cp315-win_amd64.whl", hash = "sha256:4119efa6519871719ad81f33bc95ab87857dcb1c5801f30a6e592f2c41164169", size = 5394757, upload-time = "2026-09-14T06:59:30.118Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0c/98/304898ac4e04e2d5e4e4c2eadc178b1f2a16d5f4bc2f91306c87d64680b9/grpcio-1.83.0.tar.gz", hash = "sha256:7674587248fbbb2ac6e4eecf83a8a0f3d91a928f941de571acfd3a2f007fbc24", size = 13428824, upload-time = "2026-07-23T15:20:37.759Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/fd/655c8a773d728bc3c93fb4713ae4bf79ffc75996f86fb78b2974c8e1dfbd/grpcio-1.83.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:fba099b716e73512d61b97f71ea3c31a72abb36904036e316bf4dd148ca8dcc8", size = 6334247, upload-time = "2026-07-23T15:18:53.099Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9a/1ce5760d35a04a992006dd2f79afff2db548f93ee7426fa95c9f1fc90c61/grpcio-1.83.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:6755ed67cc3e454d51ae9f6e1915b80d3942fa4de956ef48dacd45ab7f40b727", size = 12168650, upload-time = "2026-07-23T15:18:56.348Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ab/bbcb5be0a1a6cb21f036e2afdd4f7a70147cfb7a7b42648a310d7c43acfc/grpcio-1.83.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5882c1a721b50ce0123ee5e839e1ab059ad72a7ade76cdf2d5bd833b56791acf", size = 6916899, upload-time = "2026-07-23T15:18:58.339Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d2/4c27977ecb3b3f9f363b93f570e001cb24ef264a9a907d7fd0f949ed59f0/grpcio-1.83.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4e3eedfc92b6b9f2960115e7e620cf0cbf80bb7849a51ce3820dc54dfd88b6b9", size = 7648761, upload-time = "2026-07-23T15:19:00.071Z" }, + { url = "https://files.pythonhosted.org/packages/23/49/0c823a7627ff2e69a61e4a53c4edf215272892fc2c47c6431f033d46f4cc/grpcio-1.83.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4fcaa7c45c45b4a89e2867d1f1785d9481a788399d915e341ed2eb49aeef9dd4", size = 7074920, upload-time = "2026-07-23T15:19:02.293Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ce/963f01ff7c789a76909c9691b704112e02ca1e11c10405cd99c2bd7c40f1/grpcio-1.83.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6b6c666a1d5613ff360c9e90f44665e3a88b25a815209ddbc0917eec281931cb", size = 7598046, upload-time = "2026-07-23T15:19:03.921Z" }, + { url = "https://files.pythonhosted.org/packages/eb/de/1ce6bdefc847a7973040d10cebc8996c653a2a687c0a4da8d05dcab4e397/grpcio-1.83.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6be5c807b717be3dd649446f021301fd7907e376318675d2147823071034112a", size = 8634792, upload-time = "2026-07-23T15:19:05.633Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8b/7fe6a73895e3bdd788101d1276e48e0d262ebb165afacec1ec4efebcd785/grpcio-1.83.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c834e86d8fd2f03d7e4db49a027f7c5b89c5b88eed305543a5295bd6fee61e40", size = 8000286, upload-time = "2026-07-23T15:19:07.739Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b0/9a779de2bcda8722501a056fad1bec3d1117977af0c080ab1fc0655fdf35/grpcio-1.83.0-cp310-cp310-win32.whl", hash = "sha256:35a5b1c192496b6c25956eebfa963468935612206fd2543ac3ce981e6a5e0f03", size = 4404616, upload-time = "2026-07-23T15:19:09.988Z" }, + { url = "https://files.pythonhosted.org/packages/f0/8e/ce9a23590cac33a6c24e6386cc0ffc55821cc13212acc822e98f00a67161/grpcio-1.83.0-cp310-cp310-win_amd64.whl", hash = "sha256:8f6c395e493d20c39b29392ca200e9aaeb78d0bc2f04db0c0a7da7ddc939aa57", size = 5162304, upload-time = "2026-07-23T15:19:11.467Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f6/3b781cd07a715ea5f5125ae264226e7fc4d87603d6d3955022cabfdc5da2/grpcio-1.83.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:8ff0b8767ddd62704e0d9571c1890af08d84a3a689ebba1807e62519d0b3277f", size = 6338720, upload-time = "2026-07-23T15:19:13.177Z" }, + { url = "https://files.pythonhosted.org/packages/21/cc/d14833d15d5984e366f1b027fa78bd038c9b028c66880bffb0f5a4d25ee2/grpcio-1.83.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:4772402f43517b4824980be4b3b2274a81eec0004a70009473c31b340d43e223", size = 12178773, upload-time = "2026-07-23T15:19:15.401Z" }, + { url = "https://files.pythonhosted.org/packages/6b/98/8acbb416544e7871132d8e42a07ed70c802d70e6a16c6009e505a34d32a4/grpcio-1.83.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f4cee5fc86e84a0cf7ad1574b454c3320e087c07f55b7df5dc0ac6a873fb90c0", size = 6921203, upload-time = "2026-07-23T15:19:17.824Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/0fdbfaf4fc54e5c88f6bce4008a065092fe7fbc4460eb5617ae8b20fd505/grpcio-1.83.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f5e822a7e7d03282f6ad225e710493c48b9057a353358344a5f7c42b2b37618d", size = 7648508, upload-time = "2026-07-23T15:19:19.685Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ea/107b9dbb2ed3ad14dd774fd3dde7d29ff9938a6c198654becb2c3a0e9a6a/grpcio-1.83.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5f410d7c2903eabb34789dfd6342eef04af1ad459943936b7e09a9f5bd417b9", size = 7079466, upload-time = "2026-07-23T15:19:21.478Z" }, + { url = "https://files.pythonhosted.org/packages/3b/06/9fa9941089e6fae83b060b6ce61c1e81053e52decae43197245f45e07d36/grpcio-1.83.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee94a4016fdf8699fb1fd8a38652475ff677f1c72074cee44deeeb9a7e95e745", size = 7605583, upload-time = "2026-07-23T15:19:23.74Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2f/f10fb56062dc2771c630827a82d9ad0ecd05cad572ea3b08d49f6631680a/grpcio-1.83.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c6444666317338e903093c7c756e6cc88eee59f798cb8dd41e87725bf54e1617", size = 8637810, upload-time = "2026-07-23T15:19:25.536Z" }, + { url = "https://files.pythonhosted.org/packages/99/55/f84927258f6a1b6ea6dea661fdc6de859b35e560c96f3012d15ccd39f85e/grpcio-1.83.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aa074041231f03959cb097dd5517b0677b8ea49215bae01d5710a7b69dd59969", size = 8008021, upload-time = "2026-07-23T15:19:27.863Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6b/cdf72161397ccd29d4ca2192f641524536c9cf54ad948c9dd0e0e01138fa/grpcio-1.83.0-cp311-cp311-win32.whl", hash = "sha256:cb056f6e171c42639a50460b2929c82241fda51f71cf3dcdd68090fe45095a45", size = 4404376, upload-time = "2026-07-23T15:19:30.137Z" }, + { url = "https://files.pythonhosted.org/packages/df/ed/e0ffeb4c848699c194dc9fb6a29ab29bcb2b6aac8c416bf18c51bfe8242c/grpcio-1.83.0-cp311-cp311-win_amd64.whl", hash = "sha256:7416952ca770477990257206276999056f8316d79196f2f25942393e58a20b49", size = 5164469, upload-time = "2026-07-23T15:19:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/15/2b/51e32514a4e9b715375c99721aadff0f24164cc2049b8269eda4de82a814/grpcio-1.83.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:28f6c35ac8fcf10e4594f138e468f194360089dde40d126a7033e863fc479930", size = 6303167, upload-time = "2026-07-23T15:19:33.78Z" }, + { url = "https://files.pythonhosted.org/packages/39/33/b5b50fc2c6fbe350e04814047bb2d409feec7b36ef8b170254c050e06bc0/grpcio-1.83.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:33898e6a28e4ae598f1577cb1c4fec2a15c033d0ec52b9b45a09610dd045b9da", size = 12160538, upload-time = "2026-07-23T15:19:35.958Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5f/734e72e7b9f79bcf0b2c270b8d3bca0e4ebb97a27a50d06240b145f6d41e/grpcio-1.83.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6fb8a1dd0c6f0f931e69e9d0dc6d1c406ed2a44fa963414eafba07b7fb685d16", size = 6869310, upload-time = "2026-07-23T15:19:38.607Z" }, + { url = "https://files.pythonhosted.org/packages/a4/17/a1735f215b2a5cd43c38b79eac072ad197e61be9829905b6b29550abd0db/grpcio-1.83.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:2b5e75c34842cd9c1b95285ca395c6a569664b81e3ffa6b714125922942abaaf", size = 7613472, upload-time = "2026-07-23T15:19:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/b2/78/c9e81f806ac704b6b145cb01628db398985b1f8dfdc10e23b55fb0902b3d/grpcio-1.83.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeb339838db07600481ef869507279b75326c75eac6d10f7afa62a0da1d2bcdd", size = 7040616, upload-time = "2026-07-23T15:19:42.349Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ba/94cd5af859876049d340480acbb61a959096c84b567f215534faa78d0424/grpcio-1.83.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f47d62808b4c0a97b78bff88a6d4ca283a2a492b9a04a87d814af95ca3b9c19c", size = 7570491, upload-time = "2026-07-23T15:19:44.357Z" }, + { url = "https://files.pythonhosted.org/packages/3e/15/108d30d5a5c964312ae8b9cb0e8cc5b3c1cc68d8f757cca52b3565534d26/grpcio-1.83.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62003babc444a606dcd1f009cd16391ce23669ae4ad6ec267a873da7937a69f5", size = 8605036, upload-time = "2026-07-23T15:19:46.454Z" }, + { url = "https://files.pythonhosted.org/packages/ea/23/3828ae13c3db8233d123ad612747665817b952d8a954f32390230b582336/grpcio-1.83.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1aa567f8c3f19850ffd5d2858c9a8ea7c80f0db6c01186b71eb31e923ec984f5", size = 7981587, upload-time = "2026-07-23T15:19:48.913Z" }, + { url = "https://files.pythonhosted.org/packages/17/5b/77af31228f55f55a2a5112bb0077ad0a1c4d23dbb0c2853a62475bbdcc14/grpcio-1.83.0-cp312-cp312-win32.whl", hash = "sha256:cb2906c61db4f9c64cc360054b5df70eeb81846228e9e56a4944bd415a63dadc", size = 4394004, upload-time = "2026-07-23T15:19:50.618Z" }, + { url = "https://files.pythonhosted.org/packages/c0/da/f706e39550e7a3732ce2b9c5926107a93d74a802775b19b642a6df27dc96/grpcio-1.83.0-cp312-cp312-win_amd64.whl", hash = "sha256:1c699bbb20f143c8f2bff219de578aa2dc1f919399d67dc702b038b986ee62df", size = 5158525, upload-time = "2026-07-23T15:19:52.246Z" }, + { url = "https://files.pythonhosted.org/packages/56/eb/135daaa713f32d33b8f99b4153b3f8dc3b2a124996ac15581bf9ebdad3c3/grpcio-1.83.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:6662f3b1e07cc7493d437351860dc867bddc6a93c83ecf33bbfdaf0c217ab2d0", size = 6304480, upload-time = "2026-07-23T15:19:53.962Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a1/121806ce69f23138dabe06aa595b0e5f1ae051a37e4c1954eed7d692c800/grpcio-1.83.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:74fe6f9e8a35c7dbf32255ee154d15e3e5338a81ed39173d079d594d2e544cd1", size = 12154419, upload-time = "2026-07-23T15:19:56.3Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e8/d0389e09cd6b4c4d3089b92967ae4e3ffd64795bd349bf2f85cd6656d3da/grpcio-1.83.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10b3fa0475eb572c9a81a6fe37fa16a9c500c0c91cfc148cac15692b7e3c2867", size = 6873200, upload-time = "2026-07-23T15:19:58.701Z" }, + { url = "https://files.pythonhosted.org/packages/f8/51/f464c1d211fa50d5adbabe1b2e519948d99c13757052bfc9ea7afa28e284/grpcio-1.83.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:5f20a988480b0f28207f057f7f7ae1313393c3cef0adcfeae8248f9947eaf881", size = 7618811, upload-time = "2026-07-23T15:20:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c0/539fe0832f2dd6500a28f5263071623fb34e8d4867aec632ccf81bd21156/grpcio-1.83.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7bd82671b39065ba18cd536e9cd45b27ff649053f81ddd2c6a966d595067080f", size = 7042310, upload-time = "2026-07-23T15:20:02.675Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ca/ccf617d37ffa72567fa8e005ec7090c99da922799be2fb9847c8b21ca18c/grpcio-1.83.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc60215b5cb9fc8ca72942c498b551ac2305bd08f6ef8d4e3f0d21b64fbecd61", size = 7575412, upload-time = "2026-07-23T15:20:04.712Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b9/fd8d5245f823a8e0fd35d90e20ea3aa4acd47f8d5318fa8df307df52dec6/grpcio-1.83.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f1c3e5689d4b90987b1d72022bcfe866a9a3dc66197484cf856d96b6150e7f45", size = 8604248, upload-time = "2026-07-23T15:20:06.77Z" }, + { url = "https://files.pythonhosted.org/packages/14/1e/f37632fc11db72dfa4bba86c3a43e54358e53030df111ecae5e91a733ad6/grpcio-1.83.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a21cb4eeeba124443f399be2e8b624943cde864dcbe588cb42e5c483a52a906c", size = 7977458, upload-time = "2026-07-23T15:20:09.109Z" }, + { url = "https://files.pythonhosted.org/packages/93/b6/d70b69ae5c0cfc341b9ba474980e4ed99cbf05c0e4a14e9eee8cb73db0a5/grpcio-1.83.0-cp313-cp313-win32.whl", hash = "sha256:8fe04f1050a59f875601eb55d42b4f66946fe89817f967e34db1462ccd07dadf", size = 4393993, upload-time = "2026-07-23T15:20:11.017Z" }, + { url = "https://files.pythonhosted.org/packages/0f/13/45d4cccb555cf4c476226979bf3d2fd0b0254216f7564c3a053e35117efc/grpcio-1.83.0-cp313-cp313-win_amd64.whl", hash = "sha256:6e01ecd9d8ef280abe1365138a4dc318f9a5287f4cb1b41d07816f796653f735", size = 5159650, upload-time = "2026-07-23T15:20:12.979Z" }, + { url = "https://files.pythonhosted.org/packages/9c/60/f2cca8147ea213d3e43ae9158d03ad04e020fdf32ff027253e1fe93f921d/grpcio-1.83.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:3f351629f6ae16ecc0ec3553e586a6763ffd9f6114044286d0cbec3e09241bfa", size = 6305607, upload-time = "2026-07-23T15:20:15.353Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ab/d3874931d123a95e83a3ebf8aa04537988fb62425cedb8bf3cefc5ad41b2/grpcio-1.83.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d05ff664100d429335b93c91b8b34ddf9e94a112205e7fa06dede309e44a4e4c", size = 12166617, upload-time = "2026-07-23T15:20:17.435Z" }, + { url = "https://files.pythonhosted.org/packages/92/ff/6f18f9426b69306f4e00a9add3b0ee2748da8aad53836ef80cab0d62d04f/grpcio-1.83.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7936f2a56cf04f6514705c0fedf400971de01b6aa1719327e4718f410a765e2b", size = 6880213, upload-time = "2026-07-23T15:20:19.98Z" }, + { url = "https://files.pythonhosted.org/packages/70/21/706d1147c6b93b98f179240c13991fbcc56880eba0c868abb1ad40d8a0a6/grpcio-1.83.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b0a0be840e51b6b7ee9df9269770faf77bdf4b771053c257c21d12bad607714c", size = 7618335, upload-time = "2026-07-23T15:20:22.161Z" }, + { url = "https://files.pythonhosted.org/packages/74/04/1a8443c889115ec9e213a213e86bc93a71ee9088027e5befa09aaa0edd9d/grpcio-1.83.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:009667eaf3dcd5224c713589cdc98e7ca4ed0ff0b61132c6b276e930eb83a2df", size = 7043416, upload-time = "2026-07-23T15:20:24.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/c6/94e0fee5b12bc1da1370185b680988db6f739d19b42d9959db01a7ea50bf/grpcio-1.83.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bb669918fd88936b15599caff4160a77ab74bdeb25f2231f6e45b61282d6107b", size = 7583253, upload-time = "2026-07-23T15:20:26.313Z" }, + { url = "https://files.pythonhosted.org/packages/a0/97/de1ccb671fb85575bc5192faedf9ecdbdf5b390d2e6584dcf552bcbd370e/grpcio-1.83.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c19b454d3d3f28db81f2c7c4dbaee96e7f6fd149721733ffe79d6bc530f17404", size = 8605102, upload-time = "2026-07-23T15:20:28.437Z" }, + { url = "https://files.pythonhosted.org/packages/17/0f/0e0ec749a7034ffcbaa050e39779872950ead90c22e7e0116be3f28b2b46/grpcio-1.83.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:61007cd08640abc5c54547ee32505474c482cd733a53cb87551ea81faa6350af", size = 7979826, upload-time = "2026-07-23T15:20:31.182Z" }, + { url = "https://files.pythonhosted.org/packages/83/fa/c3fda157287f64bc65acee6c5aa90c41acf9e0d3a8e69a265eecff6d00a1/grpcio-1.83.0-cp314-cp314-win32.whl", hash = "sha256:32e11c37f5285b0c6fa3042c05fe06903696689749833fc64e67dec71b9bbe33", size = 4471765, upload-time = "2026-07-23T15:20:33.195Z" }, + { url = "https://files.pythonhosted.org/packages/a1/00/b1b26431c9d54eee11724fd6e5585473a2ed47fbc1fb95e5204906a642ce/grpcio-1.83.0-cp314-cp314-win_amd64.whl", hash = "sha256:2bb48cb5e6dd005ca12b89ce4b6ac0b48ff3112c747542ee7986ef611a8ca6d9", size = 5298932, upload-time = "2026-07-23T15:20:35.48Z" }, ] [[package]] name = "grpcio-tools" -version = "1.84.0" +version = "1.81.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, { name = "protobuf" }, { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/db/a5dba38d7ff7711d1ad05f2b43751bd0e9f234fae7c89df1846a9de034f9/grpcio_tools-1.84.0.tar.gz", hash = "sha256:210ac5ac9803569490ec33574b7e995bc087815b00d9b777e0134cab5ed9a379", size = 6401750, upload-time = "2026-09-14T07:03:45.725Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/db/57c19dd36921967f207a072b31c8b118a498077a224c4e611173b523df69/grpcio_tools-1.84.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:5157688cab3488d89ec986a6bbb0a9886ec655d4f854fd2c1099cf6d5be83646", size = 2652630, upload-time = "2026-09-14T07:01:10.444Z" }, - { url = "https://files.pythonhosted.org/packages/af/2d/97d424455bc00e65a1fe6302b8b4cdd7a54d6699cf0a475a853f9b5d2008/grpcio_tools-1.84.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:48bd8ea0acfb7b15eb3f8fc28294ad9300bd10ab3d42a743a08f87506d9e5098", size = 5967266, upload-time = "2026-09-14T07:01:15.743Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4f/85a020052de481403d47e69b770d5ac753cd75e4954668c13815f315af85/grpcio_tools-1.84.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7103c628a87f8dad1988ef951a66c9077866349053e4ae462bfbc9f91c7ad8f3", size = 2704488, upload-time = "2026-09-14T07:01:17.73Z" }, - { url = "https://files.pythonhosted.org/packages/20/88/7ad7394ed55a825638f4ac9fae9b48d7e17735e9cf98ef72fdcfaf62da2d/grpcio_tools-1.84.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:d1cafe92e8742188dae258dc20fb1133a35f9b09f80ef4e0368a558561b3a04c", size = 3032304, upload-time = "2026-09-14T07:01:19.46Z" }, - { url = "https://files.pythonhosted.org/packages/c6/54/9ac98578948edc3f5560b50cba0ec8ab6bb815926e636f3409509b55b2cc/grpcio_tools-1.84.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:036de16c1eb8e516740e0040e721fae73d459a5a5ca4dfb747b6cc095cf7a750", size = 2773921, upload-time = "2026-09-14T07:01:21.468Z" }, - { url = "https://files.pythonhosted.org/packages/32/96/916f88c5884d8683bf01725c9840def4875c33f98f7cf6bcc9e82aae6044/grpcio_tools-1.84.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2643e748ce319fe75b703f42875dc42b203577f8e3e223d1ff73f37c7cfda748", size = 3226531, upload-time = "2026-09-14T07:01:23.775Z" }, - { url = "https://files.pythonhosted.org/packages/70/25/9fde9350720ee37157989bab282fd6d330f4c4975ad19da72f2d3412346c/grpcio_tools-1.84.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fe0ef1f19790d7cefe563c4f533bb0a5b88135661e32aef7661e76a9f271d384", size = 3798916, upload-time = "2026-09-14T07:01:25.776Z" }, - { url = "https://files.pythonhosted.org/packages/9c/88/774f0ffa9abf36cef647440e76bec7ae1a35ecc4822dc59476c050d59d47/grpcio_tools-1.84.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ed58186650b7e7a6f48e6fc1aac2ec8440a72d4d7fc7cf2f6ae33878da7f2d6", size = 3457754, upload-time = "2026-09-14T07:01:27.831Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b7/69f71771d4e1bc67d4ff1c07c04b69d5d5a8424781129c4ca417c7f389ea/grpcio_tools-1.84.0-cp310-cp310-win32.whl", hash = "sha256:8d677c2beae4ab02d2ae4caf0241be18eed5301757b23f1544b133c6961c4035", size = 1022560, upload-time = "2026-09-14T07:01:29.654Z" }, - { url = "https://files.pythonhosted.org/packages/ec/8c/54bda326a2d283190f324d44d03195de4810595f7ba7ab5f3613cb63f1c1/grpcio_tools-1.84.0-cp310-cp310-win_amd64.whl", hash = "sha256:a2c00d4230c592dee120458352d846df083d7bc6198150f3b66a3005d586501e", size = 1192121, upload-time = "2026-09-14T07:01:31.367Z" }, - { url = "https://files.pythonhosted.org/packages/81/62/518523308771b181cc836fe2533ffa65efeab84c7da23853240559b3959a/grpcio_tools-1.84.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:409de83da5c3526a3c8b8b880a8c4c6b23fa9b9f71a373e7f7c2c5f16ec8f30e", size = 2652835, upload-time = "2026-09-14T07:01:33.381Z" }, - { url = "https://files.pythonhosted.org/packages/09/de/27bfd92c335182dd89609449f5bb51d6ee8849fa0d0a11215d3baf8f6e42/grpcio_tools-1.84.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8ece6d87168415125091fa74f7ddd1eb3e5dacd840052fa14b8c004d314798f1", size = 5967921, upload-time = "2026-09-14T07:01:35.844Z" }, - { url = "https://files.pythonhosted.org/packages/69/fe/675a69c7916c6c03cdf5a0c4dc43d2541f08bf33269b4f9bba59beab95c5/grpcio_tools-1.84.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ac91151e7cf75a30af09aee29a9fc900e9d891323811da1a55ac985cbdbd33a", size = 2704869, upload-time = "2026-09-14T07:01:37.828Z" }, - { url = "https://files.pythonhosted.org/packages/02/43/06ba2fda64118eef7691a948fee2fae37ab623a5b4ac2d44a5fc5e4ec50c/grpcio_tools-1.84.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:090c9310a90a63fb2c3c55adc75e35f37659eb2793eedd5951f7690aceff15c6", size = 3032321, upload-time = "2026-09-14T07:01:39.907Z" }, - { url = "https://files.pythonhosted.org/packages/97/2f/c2183306869d8a67c93047e65463b938991af63dcdd83e0204b36d994e18/grpcio_tools-1.84.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc99764d6091d0ec609277d0fdbbc70e9b4acca8f371b7157249162a2d7c0a11", size = 2774120, upload-time = "2026-09-14T07:01:42.341Z" }, - { url = "https://files.pythonhosted.org/packages/d5/33/649bc42798c523e67b568e7d95d4937a5d77701fa42808d80d12aeb779f1/grpcio_tools-1.84.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c54d4ab6c675efa1f5cedfbeb8f9ad3e69b1aee9e2a2b233c02d0e4cfa045ae0", size = 3226721, upload-time = "2026-09-14T07:01:44.602Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e0/982da24d9f3b055c671b4c8290a02af8bb361a2b405e34a907fda4cc4e98/grpcio_tools-1.84.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f99c5c5349ceff85a0f969281d14a5e9c3ec64cee4bc9af27047a58c1fd99c87", size = 3798997, upload-time = "2026-09-14T07:01:46.824Z" }, - { url = "https://files.pythonhosted.org/packages/48/d5/298119f4c8035329031c687f43c607f6169208e71a1cc4861973c57a8065/grpcio_tools-1.84.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b71d9d1807948271e5d185267db972057d09aaf2d56b4233bc00a081297ef958", size = 3457776, upload-time = "2026-09-14T07:01:48.978Z" }, - { url = "https://files.pythonhosted.org/packages/65/c2/37e211a88ab5e22875bab9543c508d206204f02359dde67cebf034154125/grpcio_tools-1.84.0-cp311-cp311-win32.whl", hash = "sha256:d704ef81507c7e86bf2dfed211b0d03758973240a9273f7ca7b577bc8a2a3084", size = 1022797, upload-time = "2026-09-14T07:01:50.873Z" }, - { url = "https://files.pythonhosted.org/packages/8d/dc/de9fc8567a95ba8448f430cba11195ed0ada811423c5a108e723f0cb39c0/grpcio_tools-1.84.0-cp311-cp311-win_amd64.whl", hash = "sha256:d96f12f3a4e5af091e7a3450de5f96825959b02720cd7d4732c992a97196540a", size = 1192474, upload-time = "2026-09-14T07:01:52.782Z" }, - { url = "https://files.pythonhosted.org/packages/55/f9/ad0fc599f687227569fb0f37695ad0b66b6c515ca4b938df863f1efb1109/grpcio_tools-1.84.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:bcc3b6f41e02d77e519e6e4f114f7ab5a22815acd9b6a3c8965417df36938de3", size = 2653285, upload-time = "2026-09-14T07:01:55.305Z" }, - { url = "https://files.pythonhosted.org/packages/c0/14/cc6e137a4fea4cf35b115c22e99be391b446ac002cd8742e8d97ecff5fd4/grpcio_tools-1.84.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:9315344bed77b08c155672ab2d77513e1e8a20fd2744ab0bb72647e22bc900ac", size = 5965932, upload-time = "2026-09-14T07:01:58.431Z" }, - { url = "https://files.pythonhosted.org/packages/85/7f/602dffdd92363c6b28959502eb97badcf28176c501e3f8a26d30d6893d31/grpcio_tools-1.84.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a83ccb3f47f841d92f04fd35ed1f8b094e2a92c33ae41f26732e970e0361ff14", size = 2705432, upload-time = "2026-09-14T07:02:00.882Z" }, - { url = "https://files.pythonhosted.org/packages/55/1d/7a7bfd74fcf34d96995a05f03f9c01305f64982c6e53296363fe2d8f9911/grpcio_tools-1.84.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9b0f4aa6fd1a72e2048742016da37cfa773394ee2b96daef6e6ef38a02eabea6", size = 3033412, upload-time = "2026-09-14T07:02:03.246Z" }, - { url = "https://files.pythonhosted.org/packages/74/18/d9fa4b43c4974094a9e720e97fc90fcba1908f8c806b36eefabf6c148d88/grpcio_tools-1.84.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc1708de3ba6cc46eff02de1aea865442418167794ca963a2cf6ea2013930146", size = 2774501, upload-time = "2026-09-14T07:02:05.329Z" }, - { url = "https://files.pythonhosted.org/packages/2b/23/0458fb717829008b4c2160e37b2e4d6d7c31ad8c8b2ee411819f682a929e/grpcio_tools-1.84.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:45e38ee36a131ad1123b2741e045656419551efe52837a4702e09daee339fbcf", size = 3229874, upload-time = "2026-09-14T07:02:08.973Z" }, - { url = "https://files.pythonhosted.org/packages/af/5a/e955b667d7fb2a8746f62342a108008798a333d3824b3d28b0c5d8034613/grpcio_tools-1.84.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a87275c13a9e6027d164494483027b9b08a8b9f6176108cb27d4bc13c8cbc720", size = 3803163, upload-time = "2026-09-14T07:02:12.006Z" }, - { url = "https://files.pythonhosted.org/packages/08/fe/be66ea5d0962793156cc6e29da40e80a4f6ec12371564e6ba7237f8427e6/grpcio_tools-1.84.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:602453d5a04f74ead2077064249fc462bd4a93a1d23cb9f2c89cd254ac170ab7", size = 3461818, upload-time = "2026-09-14T07:02:14.099Z" }, - { url = "https://files.pythonhosted.org/packages/6e/32/9ecf7738075039348096a4cd739f0e994bbd28ef288f5bde68891739f22c/grpcio_tools-1.84.0-cp312-cp312-win32.whl", hash = "sha256:13a7e252569e3d2b3496fad5439a5f02f9f8d3454e66c5177fb3127342635c57", size = 1022489, upload-time = "2026-09-14T07:02:18.338Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2c/599ce7a1d0c9c232bde27d327d605d72f07437e0e665ca8153d499557367/grpcio_tools-1.84.0-cp312-cp312-win_amd64.whl", hash = "sha256:848338ebb0f1bccaf15c09d3905a2bda5907101ca2c88ed411c4ae707615f8ac", size = 1192285, upload-time = "2026-09-14T07:02:20.492Z" }, - { url = "https://files.pythonhosted.org/packages/c1/58/688e987d701d3673e6013adeb7c3d40f5886a79bc5fe3d2c462f13447cf3/grpcio_tools-1.84.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:7a34eee4038b8a92c4d2bd56ff6a68b7debb0e80fdd9a1f2dc77895525da2bc3", size = 2652846, upload-time = "2026-09-14T07:02:23.065Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/fbc0a4d4234e7b7622bbeae07da6c4620a0baf2a9764f1d0728a12f0d2fd/grpcio_tools-1.84.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:131cc59f5612cc6d2b7f83adea3177eb85a0b52196007c555e7d80bb1d0b2b97", size = 5963562, upload-time = "2026-09-14T07:02:25.956Z" }, - { url = "https://files.pythonhosted.org/packages/66/55/41dc86dd98fb5a8b620e47d2343030243bf80411d8da372ee1554c75b667/grpcio_tools-1.84.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b8c6d43a94a22a4a4630b112366fb01bebd4e3e2ac7519ee171268c8804f4e05", size = 2705097, upload-time = "2026-09-14T07:02:28.344Z" }, - { url = "https://files.pythonhosted.org/packages/58/45/7a7c5e80a122990d61b0ff6603d3aaf1952de1faf4b2d2e7a6445d5bd894/grpcio_tools-1.84.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0130a41b311c5352fa7ab1e21da63b59db0af6559205d41c384099fc4c59f0be", size = 3033063, upload-time = "2026-09-14T07:02:30.636Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a8/169ee6a6eb3225892c6be243452161b016f3bbd93fc555857dbb70d5939c/grpcio_tools-1.84.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fad2e65eed6e98ca01046bd8a47e446c7f760af89f2a958a497d61da203f9fd8", size = 2773655, upload-time = "2026-09-14T07:02:33.092Z" }, - { url = "https://files.pythonhosted.org/packages/ef/c1/41f67a4ce7c221810d515f7c384e2efbe3b547209b6686c018e9a4e54375/grpcio_tools-1.84.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:770f7c400339350e47abca5a874e5ddce9dfb313e9994af79af52482862bcb38", size = 3229788, upload-time = "2026-09-14T07:02:35.493Z" }, - { url = "https://files.pythonhosted.org/packages/bf/64/dcdfb115bfc0fa1c2659fa48c8b743cdb45d74c93d5e1a490665152ce068/grpcio_tools-1.84.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ee0609bc149bfe0b0e974ad2c3b30facc8fde16cb6c142ebaf9b5c3ffb428f97", size = 3802534, upload-time = "2026-09-14T07:02:38.172Z" }, - { url = "https://files.pythonhosted.org/packages/cd/47/2f36195b5c59cab8b8388c0e9d1383dfbc48a816db033789bd96692ab3d5/grpcio_tools-1.84.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cf4be6baf5f932950ec24c8ccd9284b6fa46e5b275aeb4789d7fe50a8452611", size = 3461034, upload-time = "2026-09-14T07:02:40.764Z" }, - { url = "https://files.pythonhosted.org/packages/07/99/2956e79ccf82f225fe4e03835ff72bd673a95cd0e1541259b3964ffc2214/grpcio_tools-1.84.0-cp313-cp313-win32.whl", hash = "sha256:bd034763ecf817c3e97a9aeb1e5c5006389c06644973595af5f3a32a1e738c37", size = 1022115, upload-time = "2026-09-14T07:02:43.1Z" }, - { url = "https://files.pythonhosted.org/packages/71/01/89a1d1f00801f892142ed31f28a2f325ce682b02bc294abf2ea8e951d205/grpcio_tools-1.84.0-cp313-cp313-win_amd64.whl", hash = "sha256:2d1e701bd77282618e76898b7dfe05094201c679ccb0b321fff2985d0fdb2e3f", size = 1191934, upload-time = "2026-09-14T07:02:45.829Z" }, - { url = "https://files.pythonhosted.org/packages/9d/e4/a6b28ea267d0eb19d36543561bd38deb33cafa663c1b9aa78f83a3cb044f/grpcio_tools-1.84.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:b648d986c5465ea6b2df5457401bf5f27619394c889e688d6e67a453beb0db1e", size = 2652843, upload-time = "2026-09-14T07:02:48.292Z" }, - { url = "https://files.pythonhosted.org/packages/8f/64/3aa9f40934937acc73d18e241735ecf98e91e8522fb50308aa625238ee54/grpcio_tools-1.84.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:ce0d963308f1954c8265828b8aa0d37cdfebb068727fa34c700e992a64a0bdc6", size = 5963459, upload-time = "2026-09-14T07:02:50.822Z" }, - { url = "https://files.pythonhosted.org/packages/87/6b/008c3e31e7681cacdc61ec0428f569f8ea959d48ed355c80ad9c748c743e/grpcio_tools-1.84.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a425e85bd95eb107f8a51baf717e265c4c37e1d0a31d57d7da6c7a1e302ffa5e", size = 2705302, upload-time = "2026-09-14T07:02:53.058Z" }, - { url = "https://files.pythonhosted.org/packages/16/11/d8e17542a79c5a2645353e7cfe53b36a96bc3bf61d6502514eff997eac8c/grpcio_tools-1.84.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:259d3064dfced0b5439e26379f02a14cc696107fc488cb61bd0ebad09c76fa44", size = 3033047, upload-time = "2026-09-14T07:02:55.785Z" }, - { url = "https://files.pythonhosted.org/packages/50/91/1bc18ec13f07fb77e1327cbbaeabbeb5dcf1cfe17fe8def9f4cd86fec4b4/grpcio_tools-1.84.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38b2819f6a04cb98158815f7d12cc14fd62659ce65c30b5c8c9f0efcf898cb6e", size = 2773834, upload-time = "2026-09-14T07:02:58.455Z" }, - { url = "https://files.pythonhosted.org/packages/fa/74/c6557d8928422a18d3a3e8522b67914d861026759243df28740cb1c515ce/grpcio_tools-1.84.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e4afaf1820c5a0c105538acf956cd2187b46b5438eb34f9b8e6257b674e97a67", size = 3229790, upload-time = "2026-09-14T07:03:01.779Z" }, - { url = "https://files.pythonhosted.org/packages/6a/63/02ba2c2866b6a18bd4d256aeccecfbc22908356cae9a659ba3e06fd0ee0e/grpcio_tools-1.84.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1c76a4cee1dd0e4dfcd31e1024a69303296efdd1757173248d8c59bb64a1372b", size = 3802611, upload-time = "2026-09-14T07:03:04.581Z" }, - { url = "https://files.pythonhosted.org/packages/80/95/350e3329b12e8fe775dda19c3f5c6e260af0f9bbb1165d11b7fb10a2d89f/grpcio_tools-1.84.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c47c6f708e2bf94503e31c578c904890225fd894a3f25f907fd3832f22b1c793", size = 3461325, upload-time = "2026-09-14T07:03:08.521Z" }, - { url = "https://files.pythonhosted.org/packages/fe/22/8463063fed0ead6c901f547d1cc7bd052391ef8eff4d1aa2e0f58f4a383c/grpcio_tools-1.84.0-cp314-cp314-win32.whl", hash = "sha256:daa0e3dff4feedbdfebc9192f2d714d5e37621b2466ba07070d002d1081a6e6f", size = 1045048, upload-time = "2026-09-14T07:03:10.723Z" }, - { url = "https://files.pythonhosted.org/packages/8c/41/4f7dd965ef2d72bc55ef208d0eadd73509aa7d4957a6eea5059a256ea01d/grpcio_tools-1.84.0-cp314-cp314-win_amd64.whl", hash = "sha256:a64a86d7e32d6ff57e0d4c6d01bac1ccd5718d01c5a5042b14ad63a00bd365f7", size = 1224203, upload-time = "2026-09-14T07:03:13.512Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d0/6cb3f84a4994a60929c2da21f5129cb04b675e814b3b03e4bbfc45512a2e/grpcio_tools-1.84.0-cp315-cp315-linux_armv7l.whl", hash = "sha256:ed27e0c12e687a4b15f6352e98eb794a296bdcc75fc26fbd5e2d1d6844c0bb5a", size = 2652855, upload-time = "2026-09-14T07:03:17.043Z" }, - { url = "https://files.pythonhosted.org/packages/79/bf/0525cdfd7eb41feed328c3e839da12d56be9a23d87c74e15e1b16c3b2b5a/grpcio_tools-1.84.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:a30b3259bbcd7aa1377e8cf5e39b30962f88ead94bd1a25c30ab8819c1163a0d", size = 5971465, upload-time = "2026-09-14T07:03:20.057Z" }, - { url = "https://files.pythonhosted.org/packages/55/e3/ef3de0d88b69a022198ce1d8ff27df970f9bbf5f0f3d65576879054718e0/grpcio_tools-1.84.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b268a8cc6a0ffde0388371fee57942585060e89a3904eec1a2c00765707a26b3", size = 2707417, upload-time = "2026-09-14T07:03:22.826Z" }, - { url = "https://files.pythonhosted.org/packages/0a/c4/f9c204a32145191bbcb39d487e2abcb9ed96c95e7d9e56267a1b5d378a61/grpcio_tools-1.84.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:feab5e59a8cbba38190196a29b878bedf3ea8e1baf94fe26fb21ca9a5b06e17c", size = 2904340, upload-time = "2026-09-14T07:03:25.8Z" }, - { url = "https://files.pythonhosted.org/packages/b7/54/a6d0aa5fc695e98c40442d9da819e2c178e3ee170182ff34922da512294b/grpcio_tools-1.84.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be960444736ff4363aad257847e0b6de8798a818b7760253b043f1c2141b522b", size = 2756591, upload-time = "2026-09-14T07:03:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/ca/40/343a5fb15e9b702df619f34302829ae3f02306c6e22ce98a2634e5ee51d7/grpcio_tools-1.84.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:5c772fff61c94a526869fbbdc1cf5d40047170c0d591609685170130de031e63", size = 3231636, upload-time = "2026-09-14T07:03:31.285Z" }, - { url = "https://files.pythonhosted.org/packages/e1/1f/32445fe2f52f3e3fa1c83131f1c051d025baa1218e38fa51d7d3dab70248/grpcio_tools-1.84.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:769ae9073f09b2dd322b4de5e5fffa7c2f38340cf779a21486c45946ab2b2991", size = 3684445, upload-time = "2026-09-14T07:03:34.124Z" }, - { url = "https://files.pythonhosted.org/packages/1f/49/10314e948033f1f2c5a4d68edcade8795c5fab7cb4a132ae78d3cc98e300/grpcio_tools-1.84.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cee293333fc9efaa1e75d8baf0150d79007874c7bb364cffebf35346836038e8", size = 3435303, upload-time = "2026-09-14T07:03:37.42Z" }, - { url = "https://files.pythonhosted.org/packages/3a/69/69e92ff54e590236eff01ca72e9722ff31baac828c4bffcfac1f9a5e850d/grpcio_tools-1.84.0-cp315-cp315-win32.whl", hash = "sha256:65a2ae3836ffb7b035e341a6dcc81e3d8b090b0df173851715f44cdd89723b1e", size = 1045039, upload-time = "2026-09-14T07:03:39.731Z" }, - { url = "https://files.pythonhosted.org/packages/b4/8e/12b84ac60171f8401d31bf64e9cdf3e041653e3e5c79ce50cac7b2b8fa5d/grpcio_tools-1.84.0-cp315-cp315-win_amd64.whl", hash = "sha256:f28ffc8f0d2831a81239cee6b038ee3254bd7ac884fe69cc99b4ee83ff1fc1a5", size = 1224255, upload-time = "2026-09-14T07:03:42.561Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/83/b3/1c5951352d6777fd7f99a0ccee04617fdfd8a5dbf2918a1f58c8b2b280b8/grpcio_tools-1.81.1.tar.gz", hash = "sha256:a22a3870180927fdd84e2b27d079ef5b7f5f8c6110181b6736afc17a463481f1", size = 6236155, upload-time = "2026-06-11T12:51:21.235Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/e1/1fcf884902ae7255d8da224cfa638ea88a46d50f62a33d06d35c8960b029/grpcio_tools-1.81.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:9b6ba8a72cfda576508701a7c0bbeebe6f6f9843320d4f12e74efd19ddccd965", size = 2586261, upload-time = "2026-06-11T12:49:21.447Z" }, + { url = "https://files.pythonhosted.org/packages/a2/d7/1815110b2d40ec99dbb0a7e6d7eafd591cd1f1e9bf9d3858cd9cf3ffacbd/grpcio_tools-1.81.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:ac47a9ea1224df8b653072614e6f0207e9fbfe63fdabaa5918a60ca5fc931b88", size = 5817509, upload-time = "2026-06-11T12:49:25.958Z" }, + { url = "https://files.pythonhosted.org/packages/23/e8/af99579842b5a555312fa782f32ce0f99bd35b2b7a1243294b2755468857/grpcio_tools-1.81.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eac4bb645ceff0c147cc720a40ae68f97427eaafb4968e866dd8fcc20d3d4831", size = 2634112, upload-time = "2026-06-11T12:49:27.937Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/235ad56ac728c49c17e9218c4daccd5831e6ec7af94236bec0cc66c71c68/grpcio_tools-1.81.1-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cc410b621dd85193766c12dca2e238696199a27a65d2b31b6f0a4c6c0043ff26", size = 2957950, upload-time = "2026-06-11T12:49:29.619Z" }, + { url = "https://files.pythonhosted.org/packages/77/3e/9103e8b4610597bf89db49eb112091c91bf5d63ddef2a951e11a4be05f2b/grpcio_tools-1.81.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b62d254c214faa3773eac709376ae25cf7abff1a76ba5fc4dbcd7b14fc4e4ae6", size = 2697765, upload-time = "2026-06-11T12:49:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/3c/86/beb2a43fbb93570a2305696083f6736566301d957869f463308ec6839f95/grpcio_tools-1.81.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd0b68dc76b10b3384b9b6e9f59202b83dcaafd8098eb644759a69316686acf8", size = 3147588, upload-time = "2026-06-11T12:49:33.748Z" }, + { url = "https://files.pythonhosted.org/packages/af/4d/b0182d9948631cd837a372b6625cf59d6e335d4aab0f425d4b7306619074/grpcio_tools-1.81.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a28d231455ab6e3558299f7d831a73c8be8ee6b7ec614ecf39eb50c0ed15767f", size = 3708798, upload-time = "2026-06-11T12:49:35.979Z" }, + { url = "https://files.pythonhosted.org/packages/23/9b/f452a189d399051d85cf82fe2f27a070efaa52512a2c5e3ae6ef1ae99a1f/grpcio_tools-1.81.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:82740248eb6f3b6a38988cb5e64adb7303af9ea5cb4197c8ed08c1fabc767440", size = 3366969, upload-time = "2026-06-11T12:49:37.911Z" }, + { url = "https://files.pythonhosted.org/packages/9b/48/0075cb4f6ae7db280f461de2dbba700b22ae62e351ae13e6e461cd6804de/grpcio_tools-1.81.1-cp310-cp310-win32.whl", hash = "sha256:801d9d8ab5cddf8f8e064225292f0713427011252a07828a6b54e2ed64d534de", size = 1008713, upload-time = "2026-06-11T12:49:39.791Z" }, + { url = "https://files.pythonhosted.org/packages/17/bd/7692bc698259e5645b68720e77e7b176d376f6ae0c9db8b5b750a02f1958/grpcio_tools-1.81.1-cp310-cp310-win_amd64.whl", hash = "sha256:3c8611d6e4e859ac5373422ef27c4b7540cf98c9991c9abc6722613ef72b13aa", size = 1174752, upload-time = "2026-06-11T12:49:41.43Z" }, + { url = "https://files.pythonhosted.org/packages/18/76/14ff87090199a36f914388299a1148d0734a20cea1b0ca8480bae1f373f1/grpcio_tools-1.81.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:8161f398f957a376cae7385ea7c8684f439d460ef702b528912da3bcb31fc515", size = 2586251, upload-time = "2026-06-11T12:49:43.514Z" }, + { url = "https://files.pythonhosted.org/packages/87/a8/d5aa99de9d8b2dd2a8192c1779796eda8b0d0f1dd915422e0a8a61b80391/grpcio_tools-1.81.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:53ef76cc3b0493ff734a5e8c39d5b519e1822236fcccdfe7677c5e1efd767761", size = 5818063, upload-time = "2026-06-11T12:49:45.975Z" }, + { url = "https://files.pythonhosted.org/packages/ba/cb/2e9a6dbc6a514dd3cd264fb3bf9217937453a4d45dbc3ca6ca4ee34ba1a7/grpcio_tools-1.81.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:690e6dcaa8b8a7886ce206ba344e2127211597e1a1ddab73df9f3d80c8f6707e", size = 2634061, upload-time = "2026-06-11T12:49:48.13Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2b/2ccd1a929e6c8ad84a0aa8d66ad9f615b4a8e79d9927373d86aa36b4ba2e/grpcio_tools-1.81.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ad7a997c07bd345e84842e60561e7e2cc090ce6c4e1d2f0407e31b85b40fc49a", size = 2958029, upload-time = "2026-06-11T12:49:50.466Z" }, + { url = "https://files.pythonhosted.org/packages/e7/67/2da8cd312edc348f44f26f82096b25cdb7d2905cd786acc6bf777b169502/grpcio_tools-1.81.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b6bd163ece4535726e5292b845ed80ae9b2cae73ba091c7d6c66033c430e3857", size = 2698031, upload-time = "2026-06-11T12:49:52.292Z" }, + { url = "https://files.pythonhosted.org/packages/d9/ba/ad1680fbdf9317c4f1e54c37c96d1f422370df66ac9adbd175c7cb3531d7/grpcio_tools-1.81.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2baa7e735f35b2a648144c03348a126097b13e101d3c242d5edb6ac91437ccbe", size = 3147541, upload-time = "2026-06-11T12:49:54.43Z" }, + { url = "https://files.pythonhosted.org/packages/57/c1/57cd08eef293d713cb8935295e4f08d8f0013480b2ba3aad1af0271eb7ba/grpcio_tools-1.81.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1d602b410b2b2addc434cace9ce4fe2035974a3078228f98ffa049a5c90acc2f", size = 3708524, upload-time = "2026-06-11T12:49:56.544Z" }, + { url = "https://files.pythonhosted.org/packages/52/31/01ea8ca9c82fe2c79b5b594c3ae427d56699bc106b2d91caca129add8b10/grpcio_tools-1.81.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f8cb64f87c45ccca8234fa47e6b21f09e43801ff11b556deecb461b3b3e9f292", size = 3367022, upload-time = "2026-06-11T12:49:59.608Z" }, + { url = "https://files.pythonhosted.org/packages/7d/35/8140cd175602df3d17215cfb28a7ea55b7a67e2b872be76e1ee4af5c4df9/grpcio_tools-1.81.1-cp311-cp311-win32.whl", hash = "sha256:87b25ca0e27373a4a32a629a4ba976f5764b9887dd50d6fe017d38009a0363e8", size = 1008980, upload-time = "2026-06-11T12:50:01.422Z" }, + { url = "https://files.pythonhosted.org/packages/be/86/1bd29ab3c52457702b96536f1f208ab27695322d855f95c9666dfb713019/grpcio_tools-1.81.1-cp311-cp311-win_amd64.whl", hash = "sha256:204de03b539a4b08772c6553b92bcc112cbc965e0ac22f909f6d133b8ac33a8c", size = 1174840, upload-time = "2026-06-11T12:50:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/3b/8a/824a9ca20bcdce8a568bb8c9f98bfeb7fad62129235e6d2ae7576fd1250a/grpcio_tools-1.81.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:353b1fafcc739c31ed42271052709595b340d34f27c459beeb78a32938305bb5", size = 2585927, upload-time = "2026-06-11T12:50:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/2f/35/e5f9f671378b1b89a896150d3e4fa2c6ec61a5e1e9e5107ce4c140ccc931/grpcio_tools-1.81.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:768f584c2423cbeb6cb6867817a39365b987ff16b8259a3adbc6546b9e303a4e", size = 5815665, upload-time = "2026-06-11T12:50:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/c6/02/631b628e4072e988c669bd8f1b2406ef3c9a4cfcb2625bbf2a308a07b71d/grpcio_tools-1.81.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1680b35a84f4694401819ac4acac42dda6dbc7bb8fc74112fd1a60425a07adf4", size = 2635518, upload-time = "2026-06-11T12:50:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/de/7c/2e3537e3ea3d1c0ddd6766cf6a7c62b487d89fb005713df2781d5f21483a/grpcio_tools-1.81.1-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f64e665c8ec639278ecf009beb92cbdcc5994f617c1af3d58036e1f70b1423ec", size = 2958252, upload-time = "2026-06-11T12:50:12.677Z" }, + { url = "https://files.pythonhosted.org/packages/35/68/14013cb2942bdac354746b643b4c37dd91906da8dce00f41c616e88bf33d/grpcio_tools-1.81.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba8f1ae82ad199f43448995715445cc623fb20d3882382e4be61f0da8ccb3f0e", size = 2698439, upload-time = "2026-06-11T12:50:15.017Z" }, + { url = "https://files.pythonhosted.org/packages/bd/45/000c14c0338a7ad36054b9f17ea41842deb7841c05c067dd36cc831bc0f4/grpcio_tools-1.81.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b7b6d1e986d5923751bfe2b5cca9c4cb3d5653446e4fa4aacd438033e2dc360a", size = 3152160, upload-time = "2026-06-11T12:50:17.3Z" }, + { url = "https://files.pythonhosted.org/packages/41/97/881930ca3967d2c8a95649bea8ebc991a7cf2331bc96679fd3600450dccc/grpcio_tools-1.81.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7f208c207aca639dcb34648d3826c38d7cf3485118fb2065117e9fc4827406b3", size = 3710468, upload-time = "2026-06-11T12:50:19.479Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b5/67baeba7366162652cdc1dbd962289accde07241bc8f42f6f02b305efcc6/grpcio_tools-1.81.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:724ecb69af63d2f6d4ccea3e6fa0ca110ed9c5824d48c2f887c631bbb03c1c3c", size = 3370797, upload-time = "2026-06-11T12:50:21.501Z" }, + { url = "https://files.pythonhosted.org/packages/f2/5d/34f2dce2125ccb107e32b57f5a9c1257edcc0793b0d2fef1e8b13a6bac3c/grpcio_tools-1.81.1-cp312-cp312-win32.whl", hash = "sha256:895a6782cec86beac71ccebb4b9848259c6f04a3028b8e42fa8d40cfe5146593", size = 1008453, upload-time = "2026-06-11T12:50:23.358Z" }, + { url = "https://files.pythonhosted.org/packages/8a/be/09da8256ec8d2a5ce8a1acc51cbbc4ca52a462d78ed3412778440a56502e/grpcio_tools-1.81.1-cp312-cp312-win_amd64.whl", hash = "sha256:0265fd1386b7458302f79542558345880d484f8fa92ae196c0c0268242c5f23a", size = 1174857, upload-time = "2026-06-11T12:50:25.685Z" }, + { url = "https://files.pythonhosted.org/packages/76/90/5faa8b26e03495e5117f93bef8293cbada4af136362745dad7d1813ef0b0/grpcio_tools-1.81.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:3d604b4fd114b79ebb9f865bf3e04fd3ae93c704e1fad96f7fd03b0865c263b7", size = 2586071, upload-time = "2026-06-11T12:50:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/e8/9a/85dc589fa6ae2439451eaa81a1578de31e29c676980d38bef7549b8a1f45/grpcio_tools-1.81.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3389e705460efa3f3758141ba5520e6743b131c9576197c944fb9cbe49048126", size = 5813299, upload-time = "2026-06-11T12:50:31.295Z" }, + { url = "https://files.pythonhosted.org/packages/77/fd/c53994e58a837e6eefe48f53eb3492afc04f2b8af255df4adb37d14378f8/grpcio_tools-1.81.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8a17d8ceeb6a855fadf39f5171c80a382d97c4db98d5943eca553497fdebf84b", size = 2634668, upload-time = "2026-06-11T12:50:33.938Z" }, + { url = "https://files.pythonhosted.org/packages/34/32/de988e86688686a2117e7ce6ce9eff4f638c929bb55b0afe60d6fbd2e45c/grpcio_tools-1.81.1-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:43baf71dc60fd653062da2e95e95c73b35dd130be8f9fa3d544c3af3f808a290", size = 2957930, upload-time = "2026-06-11T12:50:36.726Z" }, + { url = "https://files.pythonhosted.org/packages/72/97/3f18a0ea32b5f809d21961dbd0bc382b589a4c3d501e3d67c345d5456ed3/grpcio_tools-1.81.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:136e90906af0df51ad929713244ba812d0dbb1844b4f467d5d86bdb054698f90", size = 2697760, upload-time = "2026-06-11T12:50:39.108Z" }, + { url = "https://files.pythonhosted.org/packages/49/c0/dbf5cbc877290ff7504a59959a8af4fdcfdaa1e84237948405ccf1aa82a6/grpcio_tools-1.81.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd6c3bf3ea6a61eb58c54368d72ada591f2a270f3a31a32e8536e773337e76d9", size = 3151456, upload-time = "2026-06-11T12:50:41.983Z" }, + { url = "https://files.pythonhosted.org/packages/de/ea/16fe2dc83140a59e5c0a0b9dc2693dd36bfaa6bd835724b4ec66a68eab7b/grpcio_tools-1.81.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c306c307f8f74cddc4056fdbb6f1da55de087a21120efbd02bd915daa5a52fd", size = 3710469, upload-time = "2026-06-11T12:50:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/22/7d/df987d7d81e7ad2f7516d9e9d56ff29c54dbc6d8587e425688dca9a28e49/grpcio_tools-1.81.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bdbdc927be2e0ea13c32564a72ee31d712a716fb6f8c0d53d37a77d8277c272c", size = 3370488, upload-time = "2026-06-11T12:50:47.199Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c5/5a63444d694ea47bf670138208f71830cc1759c402c8818092b28ab2dc5f/grpcio_tools-1.81.1-cp313-cp313-win32.whl", hash = "sha256:9d383724bcd67244b6def9e9164c640ee9380c0b7534ee7545a6fb0022a59afe", size = 1008229, upload-time = "2026-06-11T12:50:49.527Z" }, + { url = "https://files.pythonhosted.org/packages/00/75/3945e26d5c94ae6ed9be5caef73d4d66c47dc8cfdd7b4995efaf942754e0/grpcio_tools-1.81.1-cp313-cp313-win_amd64.whl", hash = "sha256:f3eb15849979ca7bb864ce81a74d68b0f225a7f111ed3fe212bfc08cf9812b10", size = 1174523, upload-time = "2026-06-11T12:50:51.755Z" }, + { url = "https://files.pythonhosted.org/packages/0d/08/e581ad42ae517a61172285047e4d710e2ac75f2f1915f7c91f284254e6d5/grpcio_tools-1.81.1-cp314-cp314-linux_armv7l.whl", hash = "sha256:7d168ea26390717d0462c0d0408331dc98a60fc7f7e6118afac9b73f5a66d87c", size = 2585944, upload-time = "2026-06-11T12:50:54.528Z" }, + { url = "https://files.pythonhosted.org/packages/78/c8/200d90ebad685af7eea5ff7e0360c504dd01ec053fe0f1f9c4abe3ea2d5a/grpcio_tools-1.81.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:43c528655b226375013036692d8db4cd59060c1f41dd62c77f4d17b69f6ce828", size = 5813492, upload-time = "2026-06-11T12:50:57.291Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/60da2a1af37aa8eb47308cec24d9f7709a8976fdec3a53fd35b56b358326/grpcio_tools-1.81.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a9c6fcc68c9d5a208967bfe4fd3224d3c3be9a950c3e827e8f4b17e15c2dc555", size = 2634991, upload-time = "2026-06-11T12:50:59.767Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7f/dede28b579ae9bf9079ba1aa913e8088d1dc0cdbe21c85caa22f0790cad2/grpcio_tools-1.81.1-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:a987c85dcbe1b32066d7acd46266d1a428aecbd629331bf5b853e74c835bf876", size = 2957913, upload-time = "2026-06-11T12:51:02.31Z" }, + { url = "https://files.pythonhosted.org/packages/4c/38/4de2118adb58ec7ffba65ec623b5836db769665c192517cbf187db3f6145/grpcio_tools-1.81.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a882382507bb5ec6d7edc9648053dfd3bc8f9285cde56a6fa9b9a83b4bd07f1c", size = 2697709, upload-time = "2026-06-11T12:51:05.016Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e1/762ced51059e4f694fd337ecae491581d42a4e61dcb0415d8c5c60e6ddcb/grpcio_tools-1.81.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7746e508d4239a02f7e93638be5bc0ebb0120ddb796f7506aaae9d47a4599d97", size = 3151884, upload-time = "2026-06-11T12:51:07.593Z" }, + { url = "https://files.pythonhosted.org/packages/19/d8/9823090dc801e7229944874e7429c3b98e741ac778d8dc373f60240e1c43/grpcio_tools-1.81.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fc3d2a41a7a4467fa03b391394fffada9291fe8feebc8679b526f6bc36942b25", size = 3710404, upload-time = "2026-06-11T12:51:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/64/4e/4eae98d02148cb6f9f452f09942afba407afa6851e6c1fddc5ae9ec0b4ed/grpcio_tools-1.81.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:21bb3ba90e6d8df1ff663d4ee39a4e5b25a64e8ed4902476ca9ded0954d3917a", size = 3370525, upload-time = "2026-06-11T12:51:12.678Z" }, + { url = "https://files.pythonhosted.org/packages/e0/3e/2206e597a128da6a03a6106d2eaf2c3e72c7d80843d4be933e3a3d10d02a/grpcio_tools-1.81.1-cp314-cp314-win32.whl", hash = "sha256:3dca56016d90a710c4d9861bae793dc089c1430a90c79ce672e948ddb65fa539", size = 1030582, upload-time = "2026-06-11T12:51:14.906Z" }, + { url = "https://files.pythonhosted.org/packages/cf/f2/bbeef86c687225b7bbc7c0acdfbd25c8bcaa3f5b1c941db053e5c3d9e859/grpcio_tools-1.81.1-cp314-cp314-win_amd64.whl", hash = "sha256:cb08172b7b629e75cb33866928d319a3196540a725eaab628ba721007140f1af", size = 1207490, upload-time = "2026-06-11T12:51:17.598Z" }, ] [[package]] @@ -1683,19 +1595,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] -[[package]] -name = "httpcore2" -version = "2.13.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "h11", marker = "(python_full_version >= '3.11' and sys_platform != 'emscripten') or (python_full_version == '3.11.*' and sys_platform == 'emscripten') or (python_full_version >= '3.13' and sys_platform == 'emscripten')" }, - { name = "truststore", marker = "(python_full_version >= '3.11' and sys_platform != 'emscripten') or (python_full_version == '3.11.*' and sys_platform == 'emscripten') or (python_full_version >= '3.13' and sys_platform == 'emscripten')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/15/8c/e925b1c92018abb3a1863ce1549d76d2381e334d21d65d4ac8f65dabd78a/httpcore2-2.13.0.tar.gz", hash = "sha256:2adc8be4fb285fbcd6d894298db3b52c177e74b6674eda3a76bd36be3292a3db", size = 67740, upload-time = "2026-09-14T14:18:04.717Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/0d/117a771a2bb91df334b66bf4da14cd02f21aefbcfe53180f336ce55e8f90/httpcore2-2.13.0-py3-none-any.whl", hash = "sha256:35ae5be347aa40467b4a5dc032ac67ebb6d27189fc97e8cebcf99616f6a1bb9e", size = 83162, upload-time = "2026-09-14T14:18:02.529Z" }, -] - [[package]] name = "httpx" version = "0.28.1" @@ -1720,35 +1619,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, ] -[[package]] -name = "httpx2" -version = "2.13.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten'" }, - { name = "httpcore2", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten'" }, - { name = "httpx2-jsfetch", marker = "python_full_version >= '3.12' and sys_platform == 'emscripten'" }, - { name = "idna", marker = "python_full_version >= '3.11'" }, - { name = "truststore", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.11' and python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/a0/e9deef4654132857b5a5dbe4eddd0ac59c2814500e11f2f5044cd81103ee/httpx2-2.13.0.tar.gz", hash = "sha256:81bd07dc67a3701729ef1f777a3c00c915d4539604fdb5afd327f8682f6b7b44", size = 100290, upload-time = "2026-09-14T14:18:05.486Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/d1/a0c72b0e006df654709fbc366cc5bcb53e5aee13e1e3395152c6dd293376/httpx2-2.13.0-py3-none-any.whl", hash = "sha256:fc12720cedf72faa26cca6b4ca394e05c894e7d7933fc45cafe767960804e49a", size = 95565, upload-time = "2026-09-14T14:18:03.553Z" }, -] - -[[package]] -name = "httpx2-jsfetch" -version = "1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/0e5636363151a2a1795e0a77617168b9ca438e1748ec05fc9b5687f93d64/httpx2_jsfetch-1.0.tar.gz", hash = "sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60", size = 6872, upload-time = "2026-08-07T00:13:07.492Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/43/832f631d32e4f1211caa2ba368317739fe71f0b8530e4c9d15dc454bac2a/httpx2_jsfetch-1.0-py3-none-any.whl", hash = "sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32", size = 6382, upload-time = "2026-08-07T00:13:06.567Z" }, -] - [[package]] name = "huggingface-hub" -version = "1.31.0" +version = "1.27.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1761,9 +1634,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9b/f0/61159db90b5cd275d55516fe27920828e7d3be4053fdbdb27c3f70e5f1ef/huggingface_hub-1.31.0.tar.gz", hash = "sha256:f8e9e710a210613fa5d0f26bba6da05ef4aef9fba5a0f23f508f5ac4d08b6f90", size = 968039, upload-time = "2026-09-10T10:27:22.724Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/9b/ddf3d02a8681f1b9ce52fda03d755dad6b74c4f8172304c4c8d2975450f9/huggingface_hub-1.27.0.tar.gz", hash = "sha256:c1fed40ea82a6b41b477f5243546549b792ae0a93abcea608cff66089bf8f8df", size = 942668, upload-time = "2026-08-07T12:48:05.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/7f/3f886a625043b77312b80da2f2bf00b5ecbf5a73061af1aa0259cd258c9d/huggingface_hub-1.31.0-py3-none-any.whl", hash = "sha256:9dbb6a503cbe2494ea666695207e7262d410659e09134059deb83e5480864667", size = 798313, upload-time = "2026-09-10T10:27:20.798Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/95b735e183957c1f26d94c52977f09d466d55119cbbc1558ea4975e4c216/huggingface_hub-1.27.0-py3-none-any.whl", hash = "sha256:7df6827c2f956c60fbaa64646e979e566db76f619dd0a9729dfb8c5a3eb4f68d", size = 784926, upload-time = "2026-08-07T12:48:02.905Z" }, ] [[package]] @@ -1780,11 +1653,11 @@ wheels = [ [[package]] name = "idna" -version = "3.19" +version = "3.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, ] [[package]] @@ -1889,128 +1762,101 @@ wheels = [ [[package]] name = "jiter" -version = "0.17.0" +version = "0.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/1f/8176d92e001f86505424b41664032ae26a882bc9ca41a32c803f373f9195/jiter-0.17.0.tar.gz", hash = "sha256:03e432f226a453851079fb84cd17c6da9991eab723e28d716f14ae3d906e0c12", size = 229037, upload-time = "2026-09-12T15:14:14.253Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/fb/0b68a8666a203ab349334e502285153ac97e84a1a3e2f80de8385ed0899c/jiter-0.17.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ed1a24005daac667d577402d75a2922f9775a165b146b883ff1ad3602d8be689", size = 290968, upload-time = "2026-09-12T15:11:10.44Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e9/5993079500530586655c6f2823e2926b3f5ceddd49918c5a86757eadba3a/jiter-0.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b847b18d066c46b3b7ae49d6c94a7634c5e4a8983146ee25562a092000f5e3ad", size = 324072, upload-time = "2026-09-12T15:11:12.03Z" }, - { url = "https://files.pythonhosted.org/packages/2a/56/6f5dbffaa5b0e647386e3c3376aa150987538f1b13f6da1a9582787957af/jiter-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b68d3495d95da120651a5628c7ebadee84ed001a1b76e6afc325c42482f15b5", size = 344891, upload-time = "2026-09-12T15:11:13.387Z" }, - { url = "https://files.pythonhosted.org/packages/9a/9d/8dd5719add6c77be95b23c129682a1484c5339ffd66736d66bfa6831a2f3/jiter-0.17.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c1a5336c04a41b1f1cf9572e294aec27cc569767ff73de7bf87a91f0bea7cb9", size = 328213, upload-time = "2026-09-12T15:11:14.655Z" }, - { url = "https://files.pythonhosted.org/packages/6e/e5/82f885863afaa79efac066efdb7b70bd242ef83d3e548453d61b3737e54a/jiter-0.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b75f85660108965a94be77911a25a253429307294d9415b3c597118977a614de", size = 343033, upload-time = "2026-09-12T15:11:16.046Z" }, - { url = "https://files.pythonhosted.org/packages/a0/41/ee3cd7db1704ec9c274ae549803ef1369c801490f7f6d48d0aa3b9ac1ae0/jiter-0.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32aaaa764604496610a3ad2d98503ae88ccb2fbe769e892ff4533e778e85f708", size = 351701, upload-time = "2026-09-12T15:11:19.188Z" }, - { url = "https://files.pythonhosted.org/packages/93/2c/af9ca503b38683a82b6732352a861515f28e2d46fe445aea57e07fc86e06/jiter-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:826871c42cebaae22f0a2b5673a4a1a75c851bb2d13b3c17764a630a6b298984", size = 348754, upload-time = "2026-09-12T15:11:20.486Z" }, - { url = "https://files.pythonhosted.org/packages/d0/ba/692b071b194270b019b7d1790adb8658193379b951029e5ad15a14a2809d/jiter-0.17.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:00b5a98df3e3a3e8cf7b619f4ac2f8bf975bbf3d95d02c5d17b8dbfe5c8b8245", size = 329263, upload-time = "2026-09-12T15:11:21.701Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8f/35a22beb6b9eb025b7e2f88a38ca3b9c87017aac237feec2583eabe243ad/jiter-0.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6af5b74073bd25bae695e6d00919f6a9be7ed5a9f8836d981eb1ffe84139e6fb", size = 337572, upload-time = "2026-09-12T15:11:23.145Z" }, - { url = "https://files.pythonhosted.org/packages/7a/0f/4341ceb3ce08199b4e8a798acc0bb0c79b3e861b6cecdb9d3b5138965c5d/jiter-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:16dd0c1baf098ae70b8f3616574eb3fedf34e26670b89e16a7e67561f737ed2d", size = 485174, upload-time = "2026-09-12T15:11:24.394Z" }, - { url = "https://files.pythonhosted.org/packages/a2/6d/92fa138ac82db9001b68563df204c32f2203bee84301df083260039ca23b/jiter-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:545c36a0f3b2238c242cc9785439d3242a871b7bc39fe3f441bcaa07bf3aa83e", size = 522115, upload-time = "2026-09-12T15:11:25.645Z" }, - { url = "https://files.pythonhosted.org/packages/52/92/9b11557ddf898e84c253d1c42cc1bddd8ad1a754b46b01ae35a6a253526f/jiter-0.17.0-cp310-cp310-win32.whl", hash = "sha256:155be7355bdb7ca76ab0961be8982c225f964a5c073a83984183f22391cc29fc", size = 188163, upload-time = "2026-09-12T15:11:26.793Z" }, - { url = "https://files.pythonhosted.org/packages/a5/f3/b4381cc962fed7d505913d5920e9f51f1fd5cf340a563134e8cadf3604d2/jiter-0.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:37150a9e02e869475854fa20b7d0d5e26d18d0f8bc17293999973ff27e99ae7a", size = 231679, upload-time = "2026-09-12T15:11:28.911Z" }, - { url = "https://files.pythonhosted.org/packages/a1/50/17afdaffcc8af4bf4fddf2b6c26d066553aa2221983f2affcde435fc2532/jiter-0.17.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:cfafd7be8b16ceadd298db542cead37cddc211c4c49e04ad2596924df18625b1", size = 290699, upload-time = "2026-09-12T15:11:30.085Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e4/c185d32d5b3657ad84da26c84a9eb15f00aa1b39d6882fcc0052dba2d7c2/jiter-0.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8adca2e793288e5f1bb29279bb439d0d3cfbb50eddca7e7e6ffd42ff4f482406", size = 324246, upload-time = "2026-09-12T15:11:31.3Z" }, - { url = "https://files.pythonhosted.org/packages/24/7a/8b8903bfe91a90a8fa1ec9b45d9fda5b6287a386693b69d720a882d73f3c/jiter-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c692d567ba206c7cca38c9d1d0ccc70c9786290173c184d871ca12e9981ed7", size = 343275, upload-time = "2026-09-12T15:11:32.758Z" }, - { url = "https://files.pythonhosted.org/packages/a2/5d/6821fae2abc71a3c3a84bef8598d31fc4f27d9edfb55bd8f6c08afb8ef93/jiter-0.17.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81c83c0abe614446a283d994d2c07c4f58632dea2cdf66ba9e2921bb8ccd593e", size = 328034, upload-time = "2026-09-12T15:11:33.9Z" }, - { url = "https://files.pythonhosted.org/packages/f3/51/8e7a963b1c2dfdc01d6228b004f50a2a3d7c46f0549d7b096a5d15ef81d5/jiter-0.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:073dc68c1a700c8fc480e877864a6b6ffc887533e261f4380c08c16bf09d057a", size = 342457, upload-time = "2026-09-12T15:11:36.414Z" }, - { url = "https://files.pythonhosted.org/packages/73/27/8b2a267e3bda45d9298331cacfe3521e761f0a2b05ad10a23c6548d08358/jiter-0.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:492f37230bbf9581ab2c17bcda862c249afb9ae2e3ab2dd6db59943bc4cc3153", size = 351271, upload-time = "2026-09-12T15:11:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/4a/8f/5c74e5e142a6736833d7a991ab04d5c0738038dc44db05af0bb3cd2559e8/jiter-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5888fe5abc1ca2fa834a3e1b4c7ef0dcece286a7d7e95a609ef0934b777b9fc9", size = 346052, upload-time = "2026-09-12T15:11:39.722Z" }, - { url = "https://files.pythonhosted.org/packages/98/9c/f54920f06d1696e80b1be841d56412871c6856b1b1e3b541b1ed35346554/jiter-0.17.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:84ac78df457e1ee3f7e733bd114823302ae8c5ad5542d7e6647d92ffaa090a04", size = 328915, upload-time = "2026-09-12T15:11:41.065Z" }, - { url = "https://files.pythonhosted.org/packages/21/53/080f126863bceb055db9f1fd5431485eb493b35545a3c35e961ac18cd924/jiter-0.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7573e80232c5bcf80c24c038cf7e53a463f5c3b1dd1dd4109d66304f4dccc233", size = 337240, upload-time = "2026-09-12T15:11:42.356Z" }, - { url = "https://files.pythonhosted.org/packages/f0/76/3ab742823a0e0e70e143c6c90a482d9d90396ac2445e7b9483eb7245d3b5/jiter-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:11902505d401691720f5785c15b02204248526edee11b635cd6c40cd52b81599", size = 484917, upload-time = "2026-09-12T15:11:43.549Z" }, - { url = "https://files.pythonhosted.org/packages/14/e0/8ca71bc8b9cc9ed96c9da565863e00f3bb875a8fb82abcf03e975e067902/jiter-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:64846211a2debe7c071d2146d2283d2b0c1c93dc8fd5fb7794faac2ca6061b5c", size = 521868, upload-time = "2026-09-12T15:11:44.704Z" }, - { url = "https://files.pythonhosted.org/packages/c1/02/81f8719dcedb75713082a2048405376c81f6546b75af8167f3bba01a1ed0/jiter-0.17.0-cp311-cp311-win32.whl", hash = "sha256:c19b9357309b8cc6de8a48fca8e44a8c9c2feaaa2f5896d037fa505d48fcab80", size = 187844, upload-time = "2026-09-12T15:11:45.874Z" }, - { url = "https://files.pythonhosted.org/packages/3e/8c/59693f348488f01ed12d862e99ab8da14961152d3e9c39b9b1ef363f3572/jiter-0.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:e654b6b04e39c9cb19cb8b04c6ddf1f2db07751fa14156413969fd78bad0e5cb", size = 231402, upload-time = "2026-09-12T15:11:47.083Z" }, - { url = "https://files.pythonhosted.org/packages/fe/89/fb35e286463cb9f01edc2c4e47df6e5477ee36bca5096414e9ea87985588/jiter-0.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:3ad556afc289f15d2b181b941982d01f06190863c07440185b9f354e1bd2def3", size = 187006, upload-time = "2026-09-12T15:11:48.245Z" }, - { url = "https://files.pythonhosted.org/packages/aa/f8/07bd8c3a23f7a8a6875e6a820bbffe1483a18f18f9398a91b5495123176e/jiter-0.17.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ebf918dfd6a74adc1b9ad71f63c4ab00902fcd3b7fd39f2e24d871db8d713b91", size = 291633, upload-time = "2026-09-12T15:11:49.431Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5e/0de4c6f84ffefa6809ffc2d550b9a314365acf7e7ec9b6c7375d49047900/jiter-0.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61aed66ee042b3b49ef85fdf75714234d055d89d8496ac1c6e47f89e7a30d5e4", size = 321695, upload-time = "2026-09-12T15:11:52.727Z" }, - { url = "https://files.pythonhosted.org/packages/20/ac/befe2e82065bee37a0252081666ed2f48c1ac5f5c6c318c2de8168ba393d/jiter-0.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76eb4a5c20e86f9f848286f167024890f2862258a965d254774deb7fc1545ca1", size = 341967, upload-time = "2026-09-12T15:11:54.231Z" }, - { url = "https://files.pythonhosted.org/packages/9f/cd/9797c1e529746750ae589da7c1a8c24373f00d88e11a989f9e5eb1959079/jiter-0.17.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bcc064f99183a9cbe7f26ed648c352031a74145cd61ed75d34632c73eb46a5a8", size = 326546, upload-time = "2026-09-12T15:11:55.41Z" }, - { url = "https://files.pythonhosted.org/packages/d9/fd/e6914c38d6347bab4ebff2b1f0c0f191db276e7a1d5c376176757da42fe3/jiter-0.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73b64e69c4150748e020356d958af94bec33c70a0a93d665cfa8f6d580fe1a63", size = 340995, upload-time = "2026-09-12T15:11:58.211Z" }, - { url = "https://files.pythonhosted.org/packages/9d/7d/611b3abf6f88945b5474da5cdc6d1a185e805ac9bf446bb7766dcda6ea87/jiter-0.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0bc7f684b65bcda9c20434267577db71bf9905ceddd32b60d1d93278d8c8d3a", size = 352188, upload-time = "2026-09-12T15:11:59.414Z" }, - { url = "https://files.pythonhosted.org/packages/52/f8/b6e513ecbdf3b3cebe587c2279281ecf775b729a58cf4cc7bdf898ded029/jiter-0.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c21265b251d99bbb40080d178a8953e35601d3a1564e05c4de4c0d2ca616797", size = 345025, upload-time = "2026-09-12T15:12:00.697Z" }, - { url = "https://files.pythonhosted.org/packages/28/a8/fe26d06c5a6c5a4cfe703c5154c8a140da1305671eb3681aba9422d4f393/jiter-0.17.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:f3d7f7b34114f7ddc6d72a8e882d49de636b35d9fd12b4d420d3c5729f6c9812", size = 329180, upload-time = "2026-09-12T15:12:01.831Z" }, - { url = "https://files.pythonhosted.org/packages/e1/58/e6d66a26af40a20e62486feb7e222fd50f6e7aaa4f107abd89675dcc835b/jiter-0.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5078ab00664307fab2019b522a93aeb191122789f085daf5fd9e362154021d4a", size = 335805, upload-time = "2026-09-12T15:12:03.056Z" }, - { url = "https://files.pythonhosted.org/packages/ef/3e/96520aa2fef5ef831d95483a902140bfab83dcac9eaa74f7df61b5e50a1b/jiter-0.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:470e1b1e4c42f1ead2189166a299691871a2df5056c976e7fb96feafaf5f9d44", size = 484121, upload-time = "2026-09-12T15:12:04.414Z" }, - { url = "https://files.pythonhosted.org/packages/6a/8f/5d9d92fe538bf36ff481a2278c48147e59c1cf8eb2f7be665260665febe5/jiter-0.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6aedeb7352b8f3b6af9cbd67983840165c00428e63f1b420a85885128ea31", size = 521310, upload-time = "2026-09-12T15:12:05.612Z" }, - { url = "https://files.pythonhosted.org/packages/50/06/a09f979b22e652afbc3de66c709b2ba92edcef555f7535ab937c86b4f21a/jiter-0.17.0-cp312-cp312-win32.whl", hash = "sha256:362bb47423886d45a9f705d2d9d4008c6eedd4e41eb1bab4e96fb6daa06b33fd", size = 185029, upload-time = "2026-09-12T15:12:06.994Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d9/98265a005b2473ec2be5a84e2b64c2f65382c673879f1574845cd4bcd77c/jiter-0.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:9bd3caac219df476dd0cc3fe01d2f1581ed588906feac767abd9614c1c12f8b3", size = 227381, upload-time = "2026-09-12T15:12:08.823Z" }, - { url = "https://files.pythonhosted.org/packages/a8/11/2e05bf5a56e57a543ebb8f585074adf09383e99d7b062dac92eab1f4d57f/jiter-0.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:36ee6e69027396664e59995b9a635a947a5304ee9837279584a0bb8145c8f6b8", size = 183610, upload-time = "2026-09-12T15:12:10.374Z" }, - { url = "https://files.pythonhosted.org/packages/40/eb/2c4a8075ed5ea02b56911e9375d4c8d7784572ff4af32e5a99ae0d071044/jiter-0.17.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1b18434638228c0c184281609bf3d9459026a0f1ea48fb76c205e3ef72069caa", size = 290991, upload-time = "2026-09-12T15:12:11.641Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b1/34bfa29599d420423baac6ff7cada6674fe63d5a7a2ccb3900b904678783/jiter-0.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ec89771f4272b989487a6364e519db6bbaba323e8bbf949ac89a45ea9c18b7a3", size = 321425, upload-time = "2026-09-12T15:12:13.855Z" }, - { url = "https://files.pythonhosted.org/packages/11/71/a5ac64a62a04aebd556afadab14a6b730001e16df87266ded943a100a1d9/jiter-0.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e3f052c671d5f425cca5ea5901cf11a831369fba4a55a3862cab93c323b4c3b", size = 343138, upload-time = "2026-09-12T15:12:15.046Z" }, - { url = "https://files.pythonhosted.org/packages/01/dd/f761e320ea473314cb68612bc6a435393464dbd198051399b36848b4ebf3/jiter-0.17.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:785a216bbaf8f15fc974e964ced7322cd3d774bb0e86949edd78c6bffd6ba35b", size = 325805, upload-time = "2026-09-12T15:12:16.506Z" }, - { url = "https://files.pythonhosted.org/packages/19/1a/27d8e40f0fb29bbc7a5adf30907144396a115dbe93d5d8976c054a6dfe96/jiter-0.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d85c558c9f8532bba287a990ac63767c7daf756f0d8c030219f62499b1fa228a", size = 340230, upload-time = "2026-09-12T15:12:17.682Z" }, - { url = "https://files.pythonhosted.org/packages/ac/c0/30bcde78a28155461f965d16b7aca4ffca6d17494d905f7a0bb072e6c64e/jiter-0.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c23849235d2142ce444b2b8c6eceee9f82f4cc0bd5c9081602e4155c6197807", size = 351343, upload-time = "2026-09-12T15:12:19.337Z" }, - { url = "https://files.pythonhosted.org/packages/27/17/91420b156315ae22732f5ee1a7b5725a030aab9dc8fd7dcdacfb4aa588d3/jiter-0.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58df29268a95e910f17db7ec9178eb7f15aa8619aaca3575275c4e6b3f4fe4c5", size = 344990, upload-time = "2026-09-12T15:12:20.705Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a2/ae6d5672644cc11127970277c9aeb0fa6fae376845587f5b0a8e8828167c/jiter-0.17.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:a277f97eba7d66b1ee27eb5dab5b774ff46a10c78d89a1d3dcce04ce1357c8ca", size = 328624, upload-time = "2026-09-12T15:12:23.859Z" }, - { url = "https://files.pythonhosted.org/packages/04/62/45cb1162f6aa586536e4a973fc339d72dc6b08cca030d70a838a307aa778/jiter-0.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe15ddf316f1f1f643347d3a474e74ce61880c79a11ec5dca53df20c071bd3e8", size = 334731, upload-time = "2026-09-12T15:12:25.229Z" }, - { url = "https://files.pythonhosted.org/packages/d9/5f/45c1574b644da7deda0b7591c349520dcf83ce45b24d7ca19922dab1fc27/jiter-0.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:02adebb7ce6413c44d40af9ad59d1c1cd79630ccdcb6f7bdd2d461e48c03d8f9", size = 483649, upload-time = "2026-09-12T15:12:27.557Z" }, - { url = "https://files.pythonhosted.org/packages/c1/d3/ebea1ecb5b241c519f192b30215c79a8e47f42f1621acbcd6f8830728416/jiter-0.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:55d0e0e613a3f9ad600cf436e0e2b8057d1b52bcf1d91b2d36ac53451231e6a8", size = 520758, upload-time = "2026-09-12T15:12:28.99Z" }, - { url = "https://files.pythonhosted.org/packages/64/e6/682b641ff0765ea9bdc349dbc7d223de5c8af8ec1abda0db3406992f92fe/jiter-0.17.0-cp313-cp313-win32.whl", hash = "sha256:2c45ad7c973ef33fe5114a953377b35a95240f4542c0724d9f781e47dc24bac7", size = 184334, upload-time = "2026-09-12T15:12:30.813Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d2/9a49aac2b27af4cc5015e368c0cc3588491a532f717a668ffce1f1ac57da/jiter-0.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:a3cebb1fe4a1abb00465f3f8a17e09112603e8b7c59e5c3adbcd9f7815a64acd", size = 226601, upload-time = "2026-09-12T15:12:32.096Z" }, - { url = "https://files.pythonhosted.org/packages/b4/ce/9a43e9f614608eafa78de22aedcff54cd21324467b5d442d5c9b00244145/jiter-0.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:96b8b0c6dc5d78682f54a450785e075aa929cde768304cad363cd4efba5a82ac", size = 183103, upload-time = "2026-09-12T15:12:34.396Z" }, - { url = "https://files.pythonhosted.org/packages/01/9e/23065f8e2c7a4c372c1b6f6622e4cfab4dc786cb5150052b1527e6a6a840/jiter-0.17.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:00d783a779c5664e16dbad5e3a3c3a75e128b07dd5f4765159658d9210a50ca5", size = 292210, upload-time = "2026-09-12T15:12:35.613Z" }, - { url = "https://files.pythonhosted.org/packages/ea/81/67b58647560bc82a4490d722caa8561d7a86a9f45d4fa620b7e5fe282c7a/jiter-0.17.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0619d806e260ecf0c2a64521942c94af5d547c9ec99b55ae4f51b538b5576a76", size = 321512, upload-time = "2026-09-12T15:12:36.907Z" }, - { url = "https://files.pythonhosted.org/packages/c7/07/6658359a25f55927f7f8bf0e16465dee2ccd0b2a1a5208acc0df8972e074/jiter-0.17.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc0288ce39190ee33fe6e4ec73161eed34e7e2da509b525546ca061778d62b64", size = 343897, upload-time = "2026-09-12T15:12:38.189Z" }, - { url = "https://files.pythonhosted.org/packages/46/04/5d50a9f0319cbdc37fd53c27f8c313d46afc34f1b048219ae6d8ea068da4/jiter-0.17.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a52a430d04225ffde633e6840bf2381d34c019ff98526b5929755b9052fb199", size = 326519, upload-time = "2026-09-12T15:12:39.532Z" }, - { url = "https://files.pythonhosted.org/packages/bb/c7/d02517832b29eb8275fdd0f4ce0f17b80f58cc4c3ebecd4d9ace990d633d/jiter-0.17.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37f33d327900bf2879613b3363fd48df97b4232d0c41f54bcf2e790c2fc40a71", size = 341369, upload-time = "2026-09-12T15:12:41.486Z" }, - { url = "https://files.pythonhosted.org/packages/3b/07/499b5f5603501cdd93a73a6a176dfad9c96555a3ae58ca9f8e3acba63dc9/jiter-0.17.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cf564d43c4388149ca58ee571d0f5ccf875e20d1fd4662fd94cc0d1ea3b10ef", size = 352160, upload-time = "2026-09-12T15:12:42.721Z" }, - { url = "https://files.pythonhosted.org/packages/f5/75/b04013c7743269d4533ef4e746fc0ed678a143968dd7448658e3f51daad2/jiter-0.17.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:523c499235fb65add25d4bb01b1c4709ce695efdc7deb6c0a7bc515b5c44e0fb", size = 345018, upload-time = "2026-09-12T15:12:44.192Z" }, - { url = "https://files.pythonhosted.org/packages/1d/96/cbb6fd1e42a77c8412ec4643db95059b30cdfc635e387cc9193e098ce268/jiter-0.17.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:455e4ab35cb2a4a91a8404e08fd3c621bae433922e59bf1c494fe20a426b013b", size = 329244, upload-time = "2026-09-12T15:12:45.491Z" }, - { url = "https://files.pythonhosted.org/packages/15/67/d3be402f398566a379bf40ae65be5c3505b14d9e95e0802a597ddde7ddee/jiter-0.17.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6871973bfbd4408f7f1c632b30bbb5bbd9671c1bc8650af6823e24b7be13709b", size = 335693, upload-time = "2026-09-12T15:12:46.935Z" }, - { url = "https://files.pythonhosted.org/packages/7f/8d/98e2c4130b93d64f1d67c89060b928d04102549bf05e64451c9e6024f9ca/jiter-0.17.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:77f6aac0137309b31448c1bdcda4c6c77077664a6d018ece8d94019c68a5a5b9", size = 484329, upload-time = "2026-09-12T15:12:48.361Z" }, - { url = "https://files.pythonhosted.org/packages/78/5e/8da91e49f0fbca37c3489fb4cf3ad6676d4965f00ae5468bca3a2513737a/jiter-0.17.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:93946d89fa04d5ba64dd323a8dd8d901676cb8a3c81d99ae4f6c051a9b4c3f2f", size = 521358, upload-time = "2026-09-12T15:12:49.856Z" }, - { url = "https://files.pythonhosted.org/packages/be/21/5388684a5a38af3557cd9c2424b9827c71809cff24373c75ef9d0d3dfba9/jiter-0.17.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:70f19a2ca8429f91e82eeffb2f51cb87bc2d6e953b009b91a92d29c3a16ccb03", size = 110459, upload-time = "2026-09-12T15:12:51.747Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ad/58b3a93525d2ffca7f54d9dee441381990082bd1172fbeb8d6a3f72a4dc3/jiter-0.17.0-cp314-cp314-win32.whl", hash = "sha256:71dbd74314c5df52a1bccf7b8bca46d14e943af7a2012e73b23f49977ef194c8", size = 185043, upload-time = "2026-09-12T15:12:54.477Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4a/1aa520eb6c359b262c14ff995ca7283837208ddfb1202082ce9d73cf214d/jiter-0.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:ac3c6ee3264d6f5c44c617f90bc7e8b9e1587e7d6708c9d8f811cb65582ee312", size = 227163, upload-time = "2026-09-12T15:12:55.931Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e4/5997f648794bd9b499491d0ff480b096cc9a9c65bdba29f57568e6aa1705/jiter-0.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:6219adaf59711ba7063a52496e8ec6d3fa3e209d7827d83eee3b2abc780a1744", size = 183505, upload-time = "2026-09-12T15:12:58.196Z" }, - { url = "https://files.pythonhosted.org/packages/ac/4a/84a5ec271d09f7590b6073af5ee4abb44eab4ccace453b7e2c5ce45234ca/jiter-0.17.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:59bddbe6f9ffecc68d641e1e2d619ce64cf8a9e9eeb74e5c518f74fc87abf1b0", size = 321527, upload-time = "2026-09-12T15:12:59.394Z" }, - { url = "https://files.pythonhosted.org/packages/39/71/9e1fd0045f5920b4c36be35c3f0f0dfd123668684f8ad352619d7aa44183/jiter-0.17.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cb41cd1432f1dc19a231cf70b54d42b2c9f05085155859263fce06fa4d41388", size = 340865, upload-time = "2026-09-12T15:13:00.756Z" }, - { url = "https://files.pythonhosted.org/packages/b7/2b/14627fd2bc377f3dd09491bcace6b90e34b4d7fea2f1f3295031ff91f528/jiter-0.17.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd7790aa79c8b518e512ebcdfce9f11d8ef5f30efd43720c8a19a548b39fa489", size = 325412, upload-time = "2026-09-12T15:13:02.152Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f3/8d5808f7bf0f456bde79e6393587183a0cee5f83d179fe1f7f1eff2ba067/jiter-0.17.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbbfe4e3c21c8166980cddc5bee1a315df082454f007947dfb6fb73800768165", size = 340473, upload-time = "2026-09-12T15:13:03.485Z" }, - { url = "https://files.pythonhosted.org/packages/4f/da/1d8c7c6c4ae6b2423b94a81b6b907d37b28f87664e077427b531bf1b5313/jiter-0.17.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c286860abfe8b100cac1c02e225e5776eb9216edd71ba17cdb237da4af32bc9", size = 350757, upload-time = "2026-09-12T15:13:04.828Z" }, - { url = "https://files.pythonhosted.org/packages/eb/96/c1813dcca15c5a370145a448aaea7d1f83f6f0228a5f1130e79340ee385f/jiter-0.17.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f753eb70b1474a29e635e7542ff7312e6d6b951e0b25e8a2e8c34eeb1ddcd478", size = 345203, upload-time = "2026-09-12T15:13:06.131Z" }, - { url = "https://files.pythonhosted.org/packages/d7/f7/fc61cbcf2992d169ede13648fc3fd8e2d3171a3669dde43cd4db556549ac/jiter-0.17.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:eae86b1f027031e39db2e0e9c4842221edb7b8cd474d23f87a79b3bd4b651768", size = 328322, upload-time = "2026-09-12T15:13:07.392Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/46418a3abbdffb7dc41b314200360f24f75faaeb35573e81c92de322cce9/jiter-0.17.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bf350452a43173e69e1fc74847c57a60e3d7515807287f29849baa2a85d8718", size = 336570, upload-time = "2026-09-12T15:13:08.666Z" }, - { url = "https://files.pythonhosted.org/packages/f0/28/b8a55b949be6306df8888e365a8df05441de8a7b11289f6957004302e41e/jiter-0.17.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:da139721f4b7cafdbff580a4f511ea24cb91f4909330c6b926a1ca53836c0a59", size = 482879, upload-time = "2026-09-12T15:13:10.037Z" }, - { url = "https://files.pythonhosted.org/packages/75/3b/21d0afa53ba0680962c39f3eb95ed2946f8793369ed44b0c82b490723081/jiter-0.17.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:8079849db9a1371bfd90bad088458a8fb836261879df2233cc9632464ecf64e1", size = 520406, upload-time = "2026-09-12T15:13:11.456Z" }, - { url = "https://files.pythonhosted.org/packages/ef/03/bcbaf8b6b9ea23c2c074411f8ecfbb02d820abac5d0cb8f4e280209174a2/jiter-0.17.0-cp314-cp314t-win32.whl", hash = "sha256:8f770b0c77e5fac482e1ba03ca1a7e18286bfb213d749932a00a7e4cd5de5e06", size = 184434, upload-time = "2026-09-12T15:13:13.037Z" }, - { url = "https://files.pythonhosted.org/packages/7a/b5/5d6ce2c93ef6fe1241b37a9005547f9b6d58db1f07f39fe95807d4b98f51/jiter-0.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c4289293e5278d9314b00f15c37f2120fa51d3d68565292e715524c750e775a9", size = 227392, upload-time = "2026-09-12T15:13:14.933Z" }, - { url = "https://files.pythonhosted.org/packages/f5/4b/1e52baf90187606e33a7b8cfa8f96f5829acd7f01870077eb01059ab76d0/jiter-0.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4dfbfe5a6e1e80a7082af559f66386405025ec278833e0c649f69cbc6e1004cc", size = 182776, upload-time = "2026-09-12T15:13:16.239Z" }, - { url = "https://files.pythonhosted.org/packages/05/fc/efe3ac75564ab10f53517958f5ccdc231fc7334af66c76776cb554a88967/jiter-0.17.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:84963d3f395ef5e9a32ce47155e08a7962fa292c159a10cb98b931cef1416925", size = 292143, upload-time = "2026-09-12T15:13:17.502Z" }, - { url = "https://files.pythonhosted.org/packages/d1/4c/46982118d91f9ffe9714319d21ec4f98d9b7e0cfd9062826c524a54de24e/jiter-0.17.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:ffa0380ad091de7d3fc33e17a97ff479851ee18a0a2a3ee56ff3215cdc886656", size = 321341, upload-time = "2026-09-12T15:13:19.133Z" }, - { url = "https://files.pythonhosted.org/packages/e7/12/9b1ac6ecc6307049913db54839ddba1c11c1ef72c5a8bbb5514bc3b50d1b/jiter-0.17.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755079792868ce5d4938e83b91a0939b34fb858a1ca65a104f2d771bea57faa1", size = 344383, upload-time = "2026-09-12T15:13:20.508Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b6/527cc72af836d824e9d4d666e64f0a1ca7eafd662a8da9657b78592172ba/jiter-0.17.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3bf4dc2b84a464117fb097d15a25c58d100d2692888e3b0d92df5b48ed16b7c0", size = 326841, upload-time = "2026-09-12T15:13:21.83Z" }, - { url = "https://files.pythonhosted.org/packages/d1/41/567f98617e88005b249503b933803f633ec6ba2d427cf4cc35e5c832125c/jiter-0.17.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02a360707033d8cef53f7f3480817a1489177a259ec6ec01e98c37e0b922ddca", size = 341354, upload-time = "2026-09-12T15:13:23.323Z" }, - { url = "https://files.pythonhosted.org/packages/40/da/b29cda895b785f7d426e224638a885b6145a08ce853b381f34afe3e88c5d/jiter-0.17.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:300ce01ab0215e3dea4d00090143c909aedc65c0f809b3c07983e1d038f291b9", size = 351985, upload-time = "2026-09-12T15:13:26.526Z" }, - { url = "https://files.pythonhosted.org/packages/f7/5c/8a73829e7389e72ea298a450f2b3cb58e71a3e464b45f6d8753740f1c4f5/jiter-0.17.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746243a080b4ca790b8499af3d7cf9825d5f5987933950cd818e767ee353d826", size = 346052, upload-time = "2026-09-12T15:13:27.887Z" }, - { url = "https://files.pythonhosted.org/packages/1d/2f/98d6001026932c095ba440925570123043bed29f5ff56158dfe729a9e81b/jiter-0.17.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:b550585523339b71cb852b811aae49d08d7601ad8ffe9f5dc1562f4c3d22fd87", size = 329159, upload-time = "2026-09-12T15:13:31.569Z" }, - { url = "https://files.pythonhosted.org/packages/94/2e/708dc1d2678f092c31c12754e860cd8353e6a85ecbdb1010157edca0da9e/jiter-0.17.0-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0239520085cac678e77a606fd7e3f1c60c371d719790c5e3807388d3da4354c2", size = 336001, upload-time = "2026-09-12T15:13:32.846Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f0/75a5ae38862f4eaf0fe2f8a9fbf6484c4890df04c06dcdffc45e36bca61a/jiter-0.17.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:eb2295da7c3769f6719b227a237aa6a5cfa6550e478bc838001b592c57e16575", size = 484281, upload-time = "2026-09-12T15:13:35.333Z" }, - { url = "https://files.pythonhosted.org/packages/a0/32/6636fae811c27c7f93e1b11fb5800de6a5c9e4269a27cf718e0b31218ad1/jiter-0.17.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:e088612ff90ebc9247e1a43074b72835804261c47e6a6c01cb3ddcb55360d688", size = 521300, upload-time = "2026-09-12T15:13:37.101Z" }, - { url = "https://files.pythonhosted.org/packages/61/aa/12df7e0b0b1a2602e3d5a5a7104d7d9700f254b400f134a9b50955c4d231/jiter-0.17.0-cp315-cp315-win32.whl", hash = "sha256:0b52d52035b3907c5b1f6277857b29c1cbfc965e24e0f27330dbed83edb591ec", size = 185138, upload-time = "2026-09-12T15:13:38.901Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ec/3dd2e495032cddde05723c1f4c743b67a23e55d2af244692a7f58f0cdae3/jiter-0.17.0-cp315-cp315-win_amd64.whl", hash = "sha256:10f5558eed511b830488003449d942bd75829ad6257dc58cb9a03e596a7777b1", size = 226950, upload-time = "2026-09-12T15:13:40.17Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c7/ef85704e0a57e9cadb2babc05f6d7c5df4a1c75da1a6ee31e1986b0099a5/jiter-0.17.0-cp315-cp315-win_arm64.whl", hash = "sha256:fa13acf1046f95df808c64b1310705e143fab87aee73ae00cc42d640867fd2c1", size = 183618, upload-time = "2026-09-12T15:13:41.432Z" }, - { url = "https://files.pythonhosted.org/packages/0e/9a/a4b348349de68762b58d6713973d363ad80a1c741d0bf8def7975f0ecb26/jiter-0.17.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:af2f7501580f274b63c4b2283bc425f5df7edf06ae5b171e5f87d912ff359a20", size = 321155, upload-time = "2026-09-12T15:13:42.716Z" }, - { url = "https://files.pythonhosted.org/packages/c1/70/aebd6d0b5f0677de3a3d0bdc4a05fac949b97c4ede454c8809f180ac7b17/jiter-0.17.0-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10c5349312e5cb02b7a21e123a57665afa895953f05bf252a9dd4c13a572b7ab", size = 340985, upload-time = "2026-09-12T15:13:44.115Z" }, - { url = "https://files.pythonhosted.org/packages/a7/82/4c3b49796b5eb62f3f5046f957683f4ba0135fe1a60957c11180512460df/jiter-0.17.0-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:86f3f9343a288eb85a81ef20a752b2f84564296636db54a9fff0b5c8deaf1df2", size = 325670, upload-time = "2026-09-12T15:13:45.901Z" }, - { url = "https://files.pythonhosted.org/packages/bc/43/f6341ecb4872202a4ef150486fcee0e1ace4aa3da39b71b82061452cdd3a/jiter-0.17.0-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4607ec7d93355fbc25b8dc5189153cf21d66063b9f9cd04dd2774e6e783f9b6a", size = 340339, upload-time = "2026-09-12T15:13:47.442Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c4/bc2c86e08fa065e03cb2fbc53b367c3640a7d257ef9d877b29118ea636b7/jiter-0.17.0-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10cd64a5720ad7f809ac5466ff1705813f1b6b510f195a73acafba0ac0e1f675", size = 350705, upload-time = "2026-09-12T15:13:48.848Z" }, - { url = "https://files.pythonhosted.org/packages/9d/67/91f12aa111cca6e3a197c3e36bf60a034bf9f122f6d41112a639e44217d8/jiter-0.17.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe9f61bb30174d2f5c8396445c360c96c44e78164d0815dfe627ccf57849574", size = 345011, upload-time = "2026-09-12T15:13:50.215Z" }, - { url = "https://files.pythonhosted.org/packages/f5/cb/9f5556e8f6ec89755fb5a709d8eb8270c9a324e31079eda0dfbeca451b6e/jiter-0.17.0-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:370d8fe5bf201dc6925e8a84c81ac7291f74d9fd1778234fc79d517064a5c76b", size = 328268, upload-time = "2026-09-12T15:13:51.809Z" }, - { url = "https://files.pythonhosted.org/packages/22/98/153f20680fb75781a490fb849940e2b00f95035c7aa054df592f36ed33fc/jiter-0.17.0-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b303d88e6a0bda789ec4b7801c7bad68e27230ba1fe4baffc756d1fbd32dc9d", size = 337024, upload-time = "2026-09-12T15:13:53.095Z" }, - { url = "https://files.pythonhosted.org/packages/af/59/b16c9be3a5035df4466cc72e888188c027562de90a723d290ab6814cb9d4/jiter-0.17.0-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:30793a24a31e968969757c9e08d830cbb15a2cd3c4959b4498b38f4b1c2258eb", size = 482766, upload-time = "2026-09-12T15:13:55.713Z" }, - { url = "https://files.pythonhosted.org/packages/d0/55/667dea313094024bef082175d6bfe8976f90d1c00c926af9df1d8e0eab48/jiter-0.17.0-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:686c93d86f2b426c803024b805bd161a6cd10e9627c23e901640eab646c0ad8a", size = 520367, upload-time = "2026-09-12T15:13:57.674Z" }, - { url = "https://files.pythonhosted.org/packages/21/e3/4b1a43501fb9ed17b01d137e380cb0e8fdcb39a254ce31aa2ab95bc861ac/jiter-0.17.0-cp315-cp315t-win32.whl", hash = "sha256:86d703d9faa1ffc8ae4e9de0fa007712ed2171b5c0d93811a8e2e105ac729b0d", size = 184603, upload-time = "2026-09-12T15:13:59.27Z" }, - { url = "https://files.pythonhosted.org/packages/f9/f2/b8ee0372b6ebdf1bde5cc44495d5291d17f961065f5b48f8616cc67cac2e/jiter-0.17.0-cp315-cp315t-win_amd64.whl", hash = "sha256:42b0260445251b1bc520a63baa94a32d88e0f931fba234f1764db7feb7c72174", size = 227936, upload-time = "2026-09-12T15:14:00.472Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/923a1215daba959aed8355973315cb3f81f53e0d01c5b211870a27b41f45/jiter-0.17.0-cp315-cp315t-win_arm64.whl", hash = "sha256:d47687806f9c54c84ea38733507081337922beca90ce819c7d852dd485bc0f23", size = 182977, upload-time = "2026-09-12T15:14:01.799Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3b/05a917204413e2e09906dfa35240c1021227aeb56c7305abea9562c598b4/jiter-0.17.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:eaba834b72d573547b9d966465b3394b749d5e14208cc70acb63aca37619ab33", size = 288143, upload-time = "2026-09-12T15:14:02.998Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e1/a1cd3c0cf8f79945939e4f8caae9990529f67d7f77f671769f73956329b9/jiter-0.17.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:51e1519d676a9f14dad9c2a411170d43b022ddb7989562df4e849b261ce127b2", size = 281847, upload-time = "2026-09-12T15:14:04.414Z" }, - { url = "https://files.pythonhosted.org/packages/72/b4/9b797679e09f4a46c32986aeb3670bd9bc562fc0b373c7a0ee5c5dce1206/jiter-0.17.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ce4feb52493e3513335b2accdcd75605652e4632772d3c8c2f7b86954d7f39", size = 304797, upload-time = "2026-09-12T15:14:05.733Z" }, - { url = "https://files.pythonhosted.org/packages/25/4a/0d77415b27a00d970e4e710f7c1de62e96a11c4cab3ed1add0015af04626/jiter-0.17.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29f49b325e0234e4ad9ecca5b861ffbd09b95ccac9bd46fa55841b6e56eea5fe", size = 307815, upload-time = "2026-09-12T15:14:07.105Z" }, - { url = "https://files.pythonhosted.org/packages/17/31/4bb27f54333d3b9ef1e5bd3312dc0b4bbe59c68bb0885fdb40583a6b1567/jiter-0.17.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:454c4997d73cc466c71fd565d91e603b0274e48ea0c6b0b7a7aee6967e4ceb7c", size = 288415, upload-time = "2026-09-12T15:14:08.455Z" }, - { url = "https://files.pythonhosted.org/packages/28/30/879570ecf82574eaea77c5eb10309f4b630dece5f2a556e9814a90ba3f2d/jiter-0.17.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:40d2c240f8f80b5b0f201b29f0ae129c81448c60c772227a41747b5e0026f6a2", size = 279113, upload-time = "2026-09-12T15:14:10.117Z" }, - { url = "https://files.pythonhosted.org/packages/77/7a/1f0b8a35fbd079a4f1752c31a15dc99cf277f863747c459be0af39e900e5/jiter-0.17.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e05f5adbf68c4bd11e1610f394034d984152988e84be6f8314235ce6f2139e5", size = 303708, upload-time = "2026-09-12T15:14:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8b/d76219ebdbcf3d4209d9d21a0810db4c8d0a6f88e3ee87d30bdea4e90d30/jiter-0.17.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c0bf24c72fd0491405dce5d40194f2070e9021ce648c1a1d46234b93d848ff", size = 307147, upload-time = "2026-09-12T15:14:12.897Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1d/1f/10936e16d8860c70698a1aa939a46aa0224813b782bce4e000e637da0b2d/jiter-0.16.0.tar.gz", hash = "sha256:7b24c3492c5f4f84a37946ad9cf504910cf6a782d6a4e0689b6673c5894b4a1c", size = 176431, upload-time = "2026-06-29T13:05:13.657Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/d8/b959609e44012a42b1f3e5ba98ea3b33c7e41e6d4b77cd8f00fd19b1d3ad/jiter-0.16.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fc4f8def331036a7b8e981b4347ebe409981edbc8308a5ea842b8c3614fa6c", size = 310082, upload-time = "2026-06-29T13:02:31.356Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3d/4d7f5667ea0e0548534ba880b84bb3d12924fd133aa83ad6c6c80fca3d76/jiter-0.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a71d0d2014c3275043e1170bf3d4e771493cb0dcf07be54c567155f4d8ee64b", size = 315643, upload-time = "2026-06-29T13:02:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/9b/83/bed2dcb5c9f3e1ccfcbc67dda48265fe7d5ad0c9cadda5fe95f6e3b87f94/jiter-0.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:741eed508c233a76313a1c7b001f8f21b82f14327e9196ae8bd29a2cc164ae84", size = 341363, upload-time = "2026-06-29T13:02:34.853Z" }, + { url = "https://files.pythonhosted.org/packages/f4/2f/6bb3c3dda668ebc0445689c81a2b0f26a82b10843d67ed9c9b2c3edc177f/jiter-0.16.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3fb7bc819187b56dc48aa5c833aaf92257da8e07efdb9306156667bd2eeb491c", size = 365483, upload-time = "2026-06-29T13:02:36.295Z" }, + { url = "https://files.pythonhosted.org/packages/92/35/8a045ccb39164e70dcdae696413b661771f148b68b12b175c3a04d901937/jiter-0.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c9610fd25ebccb43fca584136f5c2fbb26802447eccd430dfdbab95a0fd5126", size = 461219, upload-time = "2026-06-29T13:02:38.116Z" }, + { url = "https://files.pythonhosted.org/packages/e7/99/22292dbbf0ed0c610cfe5ddc7f3bd67237a412f121318f865196e62a07bd/jiter-0.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a1d68ff7ca1d3b5dee20a97a3decda7d5f15003823bf6d140c81f8561d3bc5c", size = 374905, upload-time = "2026-06-29T13:02:40.357Z" }, + { url = "https://files.pythonhosted.org/packages/29/ac/2f55ccb1f0eeafa6d89d24caf52f6f0944a59290ee199e9ade62177dca42/jiter-0.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb08c276dd02dac3a284acdd02cacc630d2e3cd6572a4b85519f35cbd133c3de", size = 348320, upload-time = "2026-06-29T13:02:41.923Z" }, + { url = "https://files.pythonhosted.org/packages/50/e3/7d88b9174c40064fabc07c84a9b62e6b10f5644562ec0e0a29392edbe978/jiter-0.16.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:8fc4d94713c4697347e38faf7d6ef91547c142219bdcfc7220c4870879974244", size = 356519, upload-time = "2026-06-29T13:02:43.436Z" }, + { url = "https://files.pythonhosted.org/packages/27/57/c4a33aeef513a9d5e26e31534e0bcc752d6ea0e54c94ddb7b68bade669c2/jiter-0.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0f05e229edb29e68cdd0ccb83cea13b64263416120cf943767a6fd72e6787f", size = 394204, upload-time = "2026-06-29T13:02:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/9d/70/c6c23e76ebb3766b111bc399437bbc9f870a76e2a92e10b2a5f561d57372/jiter-0.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2c842cbf374a8daf50b2c04212995bee34ca2ac2cdc29a901b4cdb072c9c4131", size = 521477, upload-time = "2026-06-29T13:02:46.724Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d3/0001c8c0c5976af2625bb1cfb1895e8ec693b6589fe4574b8e6fc2c85501/jiter-0.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5ed466aee31294d7cdcd4d37dfe5c42c97bc29d9a5f00eacf24504358309cb9b", size = 552187, upload-time = "2026-06-29T13:02:48.144Z" }, + { url = "https://files.pythonhosted.org/packages/f6/76/311b718e07e85740e48619c0632b36f7e0b8d113984499e436452ed13a9a/jiter-0.16.0-cp310-cp310-win32.whl", hash = "sha256:b42e9ff5376819c053da25809a8d4b6fa6e473b4856ebe42e298ac958be3d7f9", size = 206513, upload-time = "2026-06-29T13:02:49.515Z" }, + { url = "https://files.pythonhosted.org/packages/db/7f/ac680eeb0777dc0eb7dc824800ba27880d7f6bc712e362d34ad8ee559f36/jiter-0.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:10438939205546132189c8e74a2d536a707841f3a25cd7c74ee91fe503407a26", size = 199505, upload-time = "2026-06-29T13:02:50.829Z" }, + { url = "https://files.pythonhosted.org/packages/4e/3f/fae6cc967d120ec89e31c5418a51176d8278b3087fbb384a9176754f353c/jiter-0.16.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:67fddeda1688f0cce2d2ae83ccf8a80f79936f2d2997d6cc2261f82fdb54a4d3", size = 309289, upload-time = "2026-06-29T13:02:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/97c6c3562c077f6247d6e6ce5c82562500b6316c0d928e97e106b7a1321a/jiter-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c90c0f63df322be920eda6ce622e3083d8906ba267f8220fe7873213b8b4430e", size = 315181, upload-time = "2026-06-29T13:02:53.964Z" }, + { url = "https://files.pythonhosted.org/packages/7b/89/d8d073f8aa2667e46c6c0873f86fe4a512bba4293cc730f626a076211a62/jiter-0.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64c0203212098470032aabcde9356fc168f377aade3e43def61dfe17e92f2037", size = 340939, upload-time = "2026-06-29T13:02:55.412Z" }, + { url = "https://files.pythonhosted.org/packages/87/c9/db4fda3ed73fb864139305e935e5b8b38a5a24692a5a9dd356c22f1b9c8d/jiter-0.16.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12288303c9844e61e1651d02a9a6f6633e47d39f897d6991d1427161ce6b746e", size = 364932, upload-time = "2026-06-29T13:02:57.28Z" }, + { url = "https://files.pythonhosted.org/packages/a2/74/52b5e86241057f52ddd7c9a580f90effb51f9d06239f6fc612279b91a838/jiter-0.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cf109d010b4b05a105afb3d43be36a21322d345ad3111e13d15f680afef0e5b", size = 461132, upload-time = "2026-06-29T13:02:58.994Z" }, + { url = "https://files.pythonhosted.org/packages/a9/87/544a700f7447c1f31c5d7833821a4daa5683165c2d5a094fbf5b5800c3dc/jiter-0.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62c1b7fe1f77925acf5af68b6140b8810fa87dfd4dc0a9c8568ec2fa2a10429c", size = 374857, upload-time = "2026-06-29T13:03:00.455Z" }, + { url = "https://files.pythonhosted.org/packages/40/cd/0fcc3f7d39183674d5bfa9ec640faaeb506c60be7c8f94625dfba366e37c/jiter-0.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8597d23c87f59294f83bcb6229b9ed1fccee13dbba967b46930d2f1759466fee", size = 347053, upload-time = "2026-06-29T13:03:02.045Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ae/c7e64e7932ad597fa395b61440b249ada6366716e25c6e08dd2afbd021e6/jiter-0.16.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3126a5dbad56401989ac769aca0cb56005bfb3e2366eea0ca99d1a91c3c1ee03", size = 356153, upload-time = "2026-06-29T13:03:03.706Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/1c719044f14da814e1a060191ab19b96f3e99207bc5b4bfc6d6be34b3f80/jiter-0.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c4b4717bdb35ae456f831a6b08d01880fff399887a6bbc526a583a406e484eea", size = 393956, upload-time = "2026-06-29T13:03:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/3b/dc/7b2f303a2847207e265503853a2d964a55354cffd62a5f2936c155486798/jiter-0.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:adff21bc78edfe086c15eb495b900306076de378dc2337c132401fc39bd79c91", size = 521081, upload-time = "2026-06-29T13:03:06.886Z" }, + { url = "https://files.pythonhosted.org/packages/c2/5f/501cf6e1e09caeb420195179ffc6f62aca603f1220ec53fd80d0d70b3e56/jiter-0.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dab907db06fc593645e73109acf4581ba5b548897d28b9348dc41ddc8343b2d3", size = 552085, upload-time = "2026-06-29T13:03:08.339Z" }, + { url = "https://files.pythonhosted.org/packages/79/54/aa5be86520113b79455c3877f3d1f07a348098df4083ba3688e9537e52dd/jiter-0.16.0-cp311-cp311-win32.whl", hash = "sha256:560b2cf3fb03240cd34f27409a238547488708f05b7c3924f571a60422251ec7", size = 206755, upload-time = "2026-06-29T13:03:09.653Z" }, + { url = "https://files.pythonhosted.org/packages/64/ec/2feb893eb330bd69b413866f4d5daada33c3962f1c6f270c91ca2d87fdf9/jiter-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:e431cfc9caf44c1d5459ff77d4e64cbf85fddb6a35dad836a15c6a9ec23087c1", size = 199155, upload-time = "2026-06-29T13:03:10.979Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9c/ca040d94415048a3666fc237774df8151c96f8d2b661cbe3b184acc95876/jiter-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:2a8e9e39cf083016137aa5cadafe3188adc2ba6ba1fbf1e5d18889ad3e9ad056", size = 194403, upload-time = "2026-06-29T13:03:12.341Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/52ace16ed031354f0539749a49e4bf33797d82bea5137910835fa4b09793/jiter-0.16.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:67c3bc1760f8c99d805dcab4e644027142a53b1d5d861f18780ebdbd5d40b72a", size = 306943, upload-time = "2026-06-29T13:03:14.035Z" }, + { url = "https://files.pythonhosted.org/packages/94/2e/34957c2c1b661c252ba9bcc60ae0bddc27e0f7202c6073326a13c5390eec/jiter-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5af7780e4a26bd7d0d989592bf9ef12ebf806b74ab709223ecca37c749872ea9", size = 307779, upload-time = "2026-06-29T13:03:15.418Z" }, + { url = "https://files.pythonhosted.org/packages/88/6c/59bd309cab4460c54cf1079f3eb7fe7af6a4c895c5c957a53378693bad2b/jiter-0.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5bf78d0e05e45cfdd66558893938d59afe3d1b1a824a202039b20e607d25a72", size = 335826, upload-time = "2026-06-29T13:03:17.11Z" }, + { url = "https://files.pythonhosted.org/packages/3b/8c/f5ef7b65f0df47afa16596969defb281ebb86e96df346d62be6fd853d620/jiter-0.16.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4444a83f946605990c98f625cdd3d2725bfb818158760c5748c653170a20e0e", size = 362573, upload-time = "2026-06-29T13:03:18.781Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0b/ace4354da061ee38844a0c27dc2c21eecd27aea119e8da324bea987522d0/jiter-0.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a23f0e4f957e1be65752d2dfac9a5a06b1917af8dc85deb639c3b9d02e31290", size = 457979, upload-time = "2026-06-29T13:03:20.293Z" }, + { url = "https://files.pythonhosted.org/packages/55/40/c0253d3772eb9dcd8e6606ee9b2d53ec8e5b814589c47f140aa585f21eaa/jiter-0.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c22a488f7b9218e245a0025a9ba6b100e2e54700831cf4cf16833a27fba3ad01", size = 372302, upload-time = "2026-06-29T13:03:21.739Z" }, + { url = "https://files.pythonhosted.org/packages/a8/d2/4839422241aa12860ce597b20068727094ba0bc480723c74924ca5bad483/jiter-0.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46add52f4ad47a08bfb1219f3e673da972191489a33016edefdb5ea55bfa8c48", size = 343805, upload-time = "2026-06-29T13:03:23.384Z" }, + { url = "https://files.pythonhosted.org/packages/e2/59/e196888a05befdda7dbe299b722d56f2f6eec65402bc34c0a3306d595feb/jiter-0.16.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:9c8a956fd72c2cf1e730d01ea080341f13aa0a97a4a33b51abebe725b7ae9ca9", size = 351107, upload-time = "2026-06-29T13:03:24.815Z" }, + { url = "https://files.pythonhosted.org/packages/ec/74/4cd9e0fca65232136400354b630fbfcd2de634e22ccbb96567725981b548/jiter-0.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:561926e0573ffe4a32498420a76d64b16c513e1ab413b9d28158a8764ac701e5", size = 388441, upload-time = "2026-06-29T13:03:26.266Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8c/554691e48bc711299c0a293dd8a6179e24b2d66a54dc295421fcf64569c0/jiter-0.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:44d019fa8cdaf89bf29c71b39e3712143fdd0ac76725c6ef954f9957a5ea8730", size = 516354, upload-time = "2026-06-29T13:03:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/a4/cb/01e9d69dc2cc6759d4f91e230b34489c4fdb2518992650633f9e20bece89/jiter-0.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0df91907609837f33341b8e6fe73b95991fdaa57caf1a0fbd343dffe826f386f", size = 547880, upload-time = "2026-06-29T13:03:29.534Z" }, + { url = "https://files.pythonhosted.org/packages/79/70/2953195f1c6ad00f49fa67e13df7e60acb3dd4f387101bc15abccddd905e/jiter-0.16.0-cp312-cp312-win32.whl", hash = "sha256:51d7b836acb0108d7c77df1742332cac2a1fa04a74d6dacec46e7091f0e91274", size = 203473, upload-time = "2026-06-29T13:03:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/05/2909a8b10699a4d560f8c502b6b2c5f3991b682b1922c1eedda242b225bd/jiter-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:1878349266f8ee36ecb1375cc5ba2f115f35fd9f0a1a4119e725e379126647f7", size = 196905, upload-time = "2026-06-29T13:03:32.472Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a9/6b82bb1c8d7790d602489b967b982a909e5d092875a6c2ade96444c8dfc5/jiter-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:2ed5738ae4af18271a51a528b8811b0cbfa4a1858de9d83359e4169855d6a331", size = 190618, upload-time = "2026-06-29T13:03:34.672Z" }, + { url = "https://files.pythonhosted.org/packages/91/c0/555fc60473d30d66894ba825e63615e3be7524fac23858356afa7a38906c/jiter-0.16.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:41977aa5654023948c2dae2a81cbf9c43343954bef1cd59a154dd15a4d84c195", size = 306203, upload-time = "2026-06-29T13:03:36.243Z" }, + { url = "https://files.pythonhosted.org/packages/d0/2b/c3eaf16f5d7c9bad66ea32f40a95bd169b29a91217fcc7f081375157e99c/jiter-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d28bb3c26762358dadf3e5bf0bccd29ae987d65e6988d2e6f49829c76b003c09", size = 306489, upload-time = "2026-06-29T13:03:37.846Z" }, + { url = "https://files.pythonhosted.org/packages/96/3f/02fdfc6705cad96127d883af5c34e4867f554f29ec7705ec1a46156400a9/jiter-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0542a7189c26920778658fc8fcf2af8bae05bae9924577f71804acef37996536", size = 335453, upload-time = "2026-06-29T13:03:39.221Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a6/e4bda5920d4b0d7c5dfb7174ce4a6b2e4d3e11c9162c452ef0eab4cdbdbd/jiter-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8de1e23a0cb2a7f53c335049c7b72b6db41aa6227cdcc0972a1de5cb39450", size = 361625, upload-time = "2026-06-29T13:03:40.597Z" }, + { url = "https://files.pythonhosted.org/packages/b7/97/4e6b59b2c6e55cbb3e183595f81ad65dcfb21c915fee5e19e335df21bc55/jiter-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72d0b2990ca754a9102779ac98d8597b7cb31678958562214a007f909eab78e", size = 456958, upload-time = "2026-06-29T13:03:42.074Z" }, + { url = "https://files.pythonhosted.org/packages/15/e0/97e9557686d2f94f4b93786eccb7eed28e9228ad132ea8237f44727314a7/jiter-0.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f91b1c27fc22a57993d5a5cb8a627cb8ed4b10502716fac1ffbfe1d19d84e8", size = 372017, upload-time = "2026-06-29T13:03:43.658Z" }, + { url = "https://files.pythonhosted.org/packages/0f/94/db768b6938e0df35c86beeba3dfbbb025c9ee5c19e1aa271f2396e50864d/jiter-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c682bea068a90b764577bdb78a60a4c1d1606daf9cd4c893832a37c7cc9d9026", size = 343320, upload-time = "2026-06-29T13:03:45.226Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d6/5a59d938244a30735fe62d9433fd325f9021ea29d89780ea4596ea93bc89/jiter-0.16.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:8d031aabecc4f1b6276adfb42e3aabb77c89d468bf616600e8d3a11328929053", size = 350520, upload-time = "2026-06-29T13:03:46.671Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/c4a857f49c9af125f6bbcac7e3eee7f7978ed89682833062e2dbf62576b1/jiter-0.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eab2cd170150e70153de16896a1774e3a1dca80154c56b54d7a812c479a7165e", size = 387550, upload-time = "2026-06-29T13:03:48.361Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d6/5fbc2f7d6b67b754caa61a993a2e626e815dec47ffc2f9e35f01adfebec7/jiter-0.16.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6edb63a46e65a82c26800a868e49b2cac30dd5a4218b88d74bc2c848c8ad60bb", size = 515424, upload-time = "2026-06-29T13:03:49.881Z" }, + { url = "https://files.pythonhosted.org/packages/ed/54/284f0164b64a5fed915fea6ba7e9ba9b3d8d37c67d59cf2e3bb99d45cdfe/jiter-0.16.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:659039cc50b5addcc35fcc87ae2c1833b7c0a8e5326ef631a75e4478447bcf84", size = 546981, upload-time = "2026-06-29T13:03:51.363Z" }, + { url = "https://files.pythonhosted.org/packages/13/c5/2a467585a576594384e1d2c43e1224deaafc085f24e243529cf98beef8e1/jiter-0.16.0-cp313-cp313-win32.whl", hash = "sha256:c9c53be232c2e206ef9cdbad81a48bfa74c3d3f08bcf8124630a8a748aad993e", size = 202853, upload-time = "2026-06-29T13:03:53.015Z" }, + { url = "https://files.pythonhosted.org/packages/88/6a/de61d04b9eec69c71719968d2f716532a3bc121170c44a39e14979c6be81/jiter-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:baad945ed47f163ad833314f8e3288c396118934f94e7bbb9e243ce4b341a4fd", size = 196160, upload-time = "2026-06-29T13:03:54.447Z" }, + { url = "https://files.pythonhosted.org/packages/19/4b/b390ed59bafb3f31d008d1218578f10327714484b334439947f7e5b11e7f/jiter-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:3c1fd2dbe1b0af19e987f03fe66c5f5bd105a2229c1aff4ab14890b24f41d21a", size = 189862, upload-time = "2026-06-29T13:03:55.754Z" }, + { url = "https://files.pythonhosted.org/packages/a7/89/bc4f1b57d5da938fd344a466396541e586d161320d70bffd929aaafcd8f4/jiter-0.16.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b2c61484666ad42726029af0c00ef4541f0f3b5cdc550221f56c2343208018ee", size = 308239, upload-time = "2026-06-29T13:03:57.205Z" }, + { url = "https://files.pythonhosted.org/packages/65/7a/c415453e5213001bf3b411ff65dec3d303b0e76a4a2cfea9768cd4960994/jiter-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:63efadc657488f45db1c676d81e704cac2abf3fdb892def1faea61db053127e2", size = 308928, upload-time = "2026-06-29T13:03:58.643Z" }, + { url = "https://files.pythonhosted.org/packages/11/fc/1f4fb7ebf9a724c7741994f4aae18fba1e2f3133df14521a79194952c34a/jiter-0.16.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf0d73f50e7b6935677854f6e8e31d499ca7064dd24734f703e060f5b237d883", size = 336998, upload-time = "2026-06-29T13:04:00.071Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8d/72cadaac05ccfa7cc3a0a2232862e6c72443ca40cf300ba8b57f9f18b69b/jiter-0.16.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3ea07d9bc8e7d03a9fbc051295462e6dbc295b894fd72457c3136e3e43d898", size = 362112, upload-time = "2026-06-29T13:04:01.52Z" }, + { url = "https://files.pythonhosted.org/packages/58/4a/c4b0d5f651fda90a24ffce9f8d56cde462a2e09d31ae3de3c68cef34c04e/jiter-0.16.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26798522707abb47d767db536e4148ceac1b14446bf028ee85e579a2e043cfe5", size = 459807, upload-time = "2026-06-29T13:04:03.214Z" }, + { url = "https://files.pythonhosted.org/packages/80/58/ef77879ea9aa56b50824edc5a445e226422c7a8d211f3fd2a56bcb9493cf/jiter-0.16.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc837c1b9631be10abfe0191537fe8009838204cec7e44827401ace390ddb567", size = 373181, upload-time = "2026-06-29T13:04:04.629Z" }, + { url = "https://files.pythonhosted.org/packages/49/2e/ffbc3f254e4d8a66da3062c624a7df4b7c2b2cf9e1fe43cf394b3e104041/jiter-0.16.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49060fd70737fad59d33ba9dcc0d83247dc9e77187de26053a19c16c9f32bd69", size = 344927, upload-time = "2026-06-29T13:04:06.067Z" }, + { url = "https://files.pythonhosted.org/packages/9a/f6/0be5dc6d64a89f80aa8fec984f94dedb2973e251edcae55841d60786d578/jiter-0.16.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:adbb8edeadd431bc4477879d5d371ece7cb1334486584e0f252656dd7ffada29", size = 352754, upload-time = "2026-06-29T13:04:07.477Z" }, + { url = "https://files.pythonhosted.org/packages/da/6e/7d31243b3b91cd261dd19e9d3557fc3251a80883d3d8049c86174e7ab7af/jiter-0.16.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:31aaee5b80f672c1dc21272bcfb9cbdcfc1ea04ff50f00ed5af500b80c44fa93", size = 390553, upload-time = "2026-06-29T13:04:08.92Z" }, + { url = "https://files.pythonhosted.org/packages/25/33/51ae371fde3c88897520f62b4d5f8b27ad7103e2bb10812ff52195609853/jiter-0.16.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:6722bcef4ffc86c835574b1b2fac6b33b9fb4a889c781e67950e891591f3c55a", size = 516900, upload-time = "2026-06-29T13:04:10.407Z" }, + { url = "https://files.pythonhosted.org/packages/a0/45/6449b3d123ea439ba79507c657288f461d55049e7bcbdc2cf8eb8210f491/jiter-0.16.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:5ab4f50ff971b611d656554ea10b75f80097392c827bc32923c6eeb6386c8b00", size = 548754, upload-time = "2026-06-29T13:04:12.046Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e7/fd2fb11ae3e2649333da3aa170d04d7b3000bbdc3b270f6513382fdf4e04/jiter-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:710cc51d4ebdcd3c1f70b232c1db1ea1344a075770422bbd4bede5708335acbe", size = 122381, upload-time = "2026-06-29T13:04:13.413Z" }, + { url = "https://files.pythonhosted.org/packages/26/80/f0b147a62c315a164ed2168908286ca302310824c218d3aae52b06c0c9a9/jiter-0.16.0-cp314-cp314-win32.whl", hash = "sha256:57b37fc887a32d44798e4d8ebfa7c9683ff3da1d5bf38f08d1bb3573ccb39106", size = 204578, upload-time = "2026-06-29T13:04:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e6/4758a14304b4523a6f5adb2419340086aa3593bd4327c2b25b5948a90548/jiter-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:cbd18dd5e2df96b580487b5745adf57ef64ad89ba2d9662fc3c19386acce7db8", size = 198154, upload-time = "2026-06-29T13:04:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/26/be/41fa54a2e7ea41d6c99f1dc5b1f0fd4cb474680304b5d268dd518e81da3a/jiter-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:a32d2027a9fa67f109ff245a3252ece3ccc32cc56703e1deab6cc846a59e0585", size = 191458, upload-time = "2026-06-29T13:04:17.707Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/59127338b86d9fe4d99418f5a15118bea778103ee0fe9d9dd7e0af174e95/jiter-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2577196f4474ef3fc4779a088a23b0897bbf86f9ea3679c372d45b8383b43207", size = 316739, upload-time = "2026-06-29T13:04:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/2d/95/49461034d5388196d3dabf98748935f017b7785d8f3f5349f834bcc4ed0d/jiter-0.16.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e89e008a93c01104161c75b4988e58716b01d62307ebfe161e52a56d2a818", size = 340911, upload-time = "2026-06-29T13:04:21.257Z" }, + { url = "https://files.pythonhosted.org/packages/cd/97/a4369f2fb82cb3dda13b98622f31249b2e014b223fe64ee534413ad72294/jiter-0.16.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2e9efbe042210df657bade597f66d6d75723e3d8f45a12ea6d8167ff8bbce3", size = 361747, upload-time = "2026-06-29T13:04:22.677Z" }, + { url = "https://files.pythonhosted.org/packages/28/51/49b6ed456261646e1906016a6760367a28aacd3c24805e4e5fe64116c1db/jiter-0.16.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f4d9e473a5ce7d27fef8b848df4dc16e283893d3f53b4a585e72c9595f3c284", size = 460225, upload-time = "2026-06-29T13:04:24.441Z" }, + { url = "https://files.pythonhosted.org/packages/33/b5/5689aff4f66c5b60be63106e591dbfcba2190df97d2c9c7cf052361ddb98/jiter-0.16.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d30a4a1c87713060c8d1cc59a7b6c8fb6b8ef0a6900368014c76c87922a2929", size = 373169, upload-time = "2026-06-29T13:04:25.884Z" }, + { url = "https://files.pythonhosted.org/packages/a2/96/3ae1b85ee0d6d6cab254fb7f8da018272b932bbf2d69b07e98aa2a96c746/jiter-0.16.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae96332410f866e5900d809298b1ed82735932986c672495f9701daacd80620", size = 350332, upload-time = "2026-06-29T13:04:27.302Z" }, + { url = "https://files.pythonhosted.org/packages/15/32/c99d7bafd78986556c95bf60ce84c6cc98786eac56066c12d7f828bb6747/jiter-0.16.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:da3d7ec75dc83bb18bca888b5edfae0656a26849056c59e05a7728badd17e7af", size = 353377, upload-time = "2026-06-29T13:04:28.731Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4b/f99a8e571287c3dec766bcc18528bbe8e8fb5365522ab5e6d64c93e87066/jiter-0.16.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee6162b77d49a9939229df666dfa8af3e656b6701b54c4c84966d740e189264e", size = 387746, upload-time = "2026-06-29T13:04:30.319Z" }, + { url = "https://files.pythonhosted.org/packages/75/69/c78a5b3f71040e34eb5917df26fb7ae9a2174cad1ccbf277512507c53a6e/jiter-0.16.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:63ffdbdae7d4499f4cda14eadc12ddcabef0fc0c081191bdc2247489cb698077", size = 517292, upload-time = "2026-06-29T13:04:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f7/095b38eda4c70d03651c403f29a5590f16d12ddc5d544aac9f9cddf72277/jiter-0.16.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a111256a7193bea0759267b10385e5870949c239ed7b6ddbaaf57573edb38734", size = 549259, upload-time = "2026-06-29T13:04:33.721Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c5/6a0207d90e5f656d95af98ebd0934f382d37674416f215aeda2ff8063e51/jiter-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:de5ba8763e56b793561f43bed197c9ea55776daa5e9a6b91eed68a909bc9cdbf", size = 206523, upload-time = "2026-06-29T13:04:35.068Z" }, + { url = "https://files.pythonhosted.org/packages/a5/31/c757d5f30a8980fd945ce7b98be10be9e4ff59c7c42f5fd86804c2e87db8/jiter-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b8a3f9a6008048fe9def7bf465180564a6e458047d2ce499149cfbe73c3ae9db", size = 200366, upload-time = "2026-06-29T13:04:36.61Z" }, + { url = "https://files.pythonhosted.org/packages/7c/a2/d88de6d313d734a544a7901353ad5db67cb38dcfcd91713b7979dafc345d/jiter-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0fa25b09b13075c46f5bc174f2690525a925a4fc2f7c82969a2bbabff22386ce", size = 190516, upload-time = "2026-06-29T13:04:38.004Z" }, + { url = "https://files.pythonhosted.org/packages/06/d3/8e278946d43eeca2585b4dd0834a887cd71136329b837f3a16ed86a8b4b0/jiter-0.16.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:850ccb1d7eedb4200f4014b1c0e8a577de114fc3cd88faad646dcc9bc4bb12ad", size = 304518, upload-time = "2026-06-29T13:05:00.172Z" }, + { url = "https://files.pythonhosted.org/packages/72/43/28d4ef495028bf0506a413d4db3f4eb3e7288a382e0f065f306a17bbeb5e/jiter-0.16.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:e34e97bda77eb63242a410243c071e28ac7e0d8c0948c5ee658498690a4b2f2f", size = 310207, upload-time = "2026-06-29T13:05:02.123Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ca/c366b1012da1d640de975d9683acd44e4d150d9068845d0ca2610435253f/jiter-0.16.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7dc85ea77d4abbae8bad0d3538678aedee75bceec4e2f6c8dfb1c74772e5aa5", size = 342771, upload-time = "2026-06-29T13:05:03.55Z" }, + { url = "https://files.pythonhosted.org/packages/16/52/50cc4056fc1ae02e7154704e7ecc89df0afb8300222cfe8a52d3f67e4730/jiter-0.16.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17ca7fae79f6d99cd9a042b75f917eaada7b895cfc7dd2ee3a16089dcaec7a85", size = 346468, upload-time = "2026-06-29T13:05:05.452Z" }, + { url = "https://files.pythonhosted.org/packages/98/ab/664fd8c4be028b2bedd3d2ff08769c4ede23d0dbc87a77c62384a0515b5d/jiter-0.16.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:f17d61a28b4b3e0e3e2ba98490c70501403b4d196f78732439160e7fd3678127", size = 303106, upload-time = "2026-06-29T13:05:07.118Z" }, + { url = "https://files.pythonhosted.org/packages/1a/07/421f1d5b65493a76e16027b848aba6a7d28073ae75944fa4289cc914d39f/jiter-0.16.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:96e38eea538c8ddf853a35727c7be0741c76c13f04148ac5c116222f50ece3b3", size = 304658, upload-time = "2026-06-29T13:05:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/0a/db/bba1155f01a01c3c37a89425d571da751bbedf5c54247b831a04cb971798/jiter-0.16.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d284fb8d94d5855d60c44fefcab4bf966f1da6fada73992b01f6f0c9bc0c6702", size = 339719, upload-time = "2026-06-29T13:05:10.41Z" }, + { url = "https://files.pythonhosted.org/packages/78/f7/18a1afcd64f35314b68c1f23afcd9994d0bc13e65cc77517afff4e83986d/jiter-0.16.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d613743df53199b1aa256a7d328340da6d7078aac7705a7db9d7a791e9cfd2", size = 343885, upload-time = "2026-06-29T13:05:12.087Z" }, ] [[package]] @@ -2024,14 +1870,14 @@ wheels = [ [[package]] name = "joserfc" -version = "1.7.5" +version = "1.7.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/94/80fea1514b7c6d7d37804d3fe9ca81455f633347fc98731bd71ffe1faa17/joserfc-1.7.5.tar.gz", hash = "sha256:d5ff536e658e17664f8c1b1ab60dc4aa62aa973fcef1edd33cc44bda45d6f5ea", size = 234990, upload-time = "2026-08-29T13:05:42.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/e0/27a6a081ae25420eda6768ceae05d7022a7f2447f420588843f2a44e4298/joserfc-1.7.4.tar.gz", hash = "sha256:b3bc561672ae541b17a9237053b48a03dacddd92d68047b3ecdfb4b5714a88ed", size = 234027, upload-time = "2026-07-19T15:43:02.739Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/c5/82addfd375e5ee6520644e0553e4aadde92d668c4fc99cc716d337fe7bb3/joserfc-1.7.5-py3-none-any.whl", hash = "sha256:add2c2c84e8373b084d526a8b53daba5d7a513a118cd2dcd9fc9f979d0922159", size = 71269, upload-time = "2026-08-29T13:05:40.718Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/249dcd99b3376375910b7fa922383b57792975c8758f50d44612e749226c/joserfc-1.7.4-py3-none-any.whl", hash = "sha256:32d46c2cd5e3203c13e87a6c61333cab310b1ba80cd54b4c4f386a848a122463", size = 71000, upload-time = "2026-07-19T15:43:01.299Z" }, ] [[package]] @@ -2127,38 +1973,37 @@ wheels = [ [[package]] name = "langchain" -version = "1.4.0" +version = "1.3.14" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "langchain-core", marker = "python_full_version >= '3.11'" }, - { name = "langgraph", marker = "python_full_version >= '3.11'" }, - { name = "pydantic", marker = "python_full_version >= '3.11'" }, + { name = "langchain-core" }, + { name = "langgraph" }, + { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/5d/0ef368fdcf5df08a394787196fb7a80f473a9c7b3fc4cd2e3b53a7a5853d/langchain-1.4.0.tar.gz", hash = "sha256:08da122a439f738f4c09a5158cfa3d2c1d8bea2d0bde7fbbf4aeb4d7f7fd9d80", size = 729354, upload-time = "2026-09-03T16:59:32.442Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/68/a6dbad9c22df4087a0f9e79ddd46226c442b30128bfeee538d5889492a73/langchain-1.3.14.tar.gz", hash = "sha256:1b6696c72ba3bbbce54d745e0180742c9f6ece8bbc59ed5a46c3e20b9a435929", size = 645181, upload-time = "2026-07-16T13:28:18.29Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/fa/7da07d9977a5e292ef602c1bb911514ff8206e85dc09a66961874345d57a/langchain-1.4.0-py3-none-any.whl", hash = "sha256:af1dc0161d30944a52ec7844d9bf890d0497b12ec0703069f3503b4003cbbac3", size = 161534, upload-time = "2026-09-03T16:59:31.154Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ec/0f942e78a621f8e3162ff1ed24284f469aaf51fb4607ee5831c626f2b2bc/langchain-1.3.14-py3-none-any.whl", hash = "sha256:4d10dbe91005952cddd56d0dc77aa108964da6bae90ab20063653957e901f782", size = 139560, upload-time = "2026-07-16T13:28:16.498Z" }, ] [[package]] name = "langchain-anthropic" -version = "1.7.2" +version = "1.5.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anthropic", marker = "python_full_version >= '3.11'" }, - { name = "langchain-core", marker = "python_full_version >= '3.11'" }, - { name = "pydantic", marker = "python_full_version >= '3.11'" }, + { name = "anthropic" }, + { name = "langchain-core" }, + { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/67/1a4f3b905d95192c54bf418ce50e058e2b7b330700c33f042622137b6c16/langchain_anthropic-1.7.2.tar.gz", hash = "sha256:0d39665211b3b40421de8be621536c4e32149500d20a75ee4338cac4ae97db19", size = 751259, upload-time = "2026-09-10T19:12:54.99Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/9d/d56f68ec9a2c8aba3b7639e5d7a502d82cbf71c31e178a06c0955d789792/langchain_anthropic-1.5.4.tar.gz", hash = "sha256:113cb9bdac3169f2da65ea395dedb290e30dc6f899d01c205ba88aa88a2a02c2", size = 718860, upload-time = "2026-08-05T19:03:16.848Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/84/436d1f5dea354ec7357e5cd9756a15765e828da7faebf2837cf60f3a638d/langchain_anthropic-1.7.2-py3-none-any.whl", hash = "sha256:9d114c3766f57bbffe8e84093efe396306520c51587263b96d00c055d3bb8370", size = 60957, upload-time = "2026-09-10T19:12:53.693Z" }, + { url = "https://files.pythonhosted.org/packages/23/d8/47fb549e91f55a54ce829b5034a21360d9383342a3bf4986188e254e89e4/langchain_anthropic-1.5.4-py3-none-any.whl", hash = "sha256:730a9cb1ad384c9f1642840469c1ebbf20237066b1635f5d4fa9876e365fceaf", size = 56025, upload-time = "2026-08-05T19:03:15.579Z" }, ] [[package]] name = "langchain-core" -version = "1.6.3" +version = "1.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx" }, { name = "jsonpatch" }, { name = "langchain-protocol" }, { name = "langsmith" }, @@ -2169,41 +2014,41 @@ dependencies = [ { name = "typing-extensions" }, { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/d7/1482670ccebc863166852516a08a1956fc50da40fbe2fe7dd218abfef4a1/langchain_core-1.6.3.tar.gz", hash = "sha256:88b430944fbd4d40fa98135d6c873581d497b6f33515d01962337548e918df2f", size = 1006228, upload-time = "2026-09-11T17:37:45.614Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/3e/63af6b9d76d9be907c7c524d6ec18a2efed7e0e2d123fea0230d78dbd73f/langchain_core-1.5.3.tar.gz", hash = "sha256:a56457ac444fef41e9404443c187f0ecea708d36e816ea4ba9573c027f7d1a2d", size = 972461, upload-time = "2026-07-30T14:55:55.833Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/18/cf18cfec118b02e003f35300b54d6a1173dc6e4905cffdf5ea49e390a7f9/langchain_core-1.6.3-py3-none-any.whl", hash = "sha256:114fe1868c9ed60606662b9dd0074bf3152cc6b0b1522ba37cbd6b04f55ca77d", size = 571753, upload-time = "2026-09-11T17:37:43.875Z" }, + { url = "https://files.pythonhosted.org/packages/36/e6/c7c39efe0bc7e1b7c3d8f54f85846e04c901913c3d3e99068b218558c6f1/langchain_core-1.5.3-py3-none-any.whl", hash = "sha256:48b56fa580277209594dd7baf837f5b9a2a3651613f34ff9fb1728b429df015f", size = 561687, upload-time = "2026-07-30T14:55:54.419Z" }, ] [[package]] name = "langchain-google-genai" -version = "4.4.0" +version = "4.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filetype", marker = "python_full_version >= '3.11'" }, - { name = "google-genai", marker = "python_full_version >= '3.11'" }, - { name = "langchain-core", marker = "python_full_version >= '3.11'" }, - { name = "pydantic", marker = "python_full_version >= '3.11'" }, + { name = "filetype" }, + { name = "google-genai" }, + { name = "langchain-core" }, + { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/4e/41798c80b574d958d189e049f13d64eb9246a66623465290f2cbfd641759/langchain_google_genai-4.4.0.tar.gz", hash = "sha256:7871beec56ac07b719f77c46997845db6ff2267b817bffb0f97877053b0895d7", size = 378415, upload-time = "2026-09-01T20:15:45.816Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/98/39b62fb50236fc582449beb96e0392d108bd7baac7ac6158d656bfac1561/langchain_google_genai-4.3.3.tar.gz", hash = "sha256:f051b98aaf223cf9092fc27c280dfec63070fc0022dc513640b2da138c9fa2f0", size = 286010, upload-time = "2026-08-10T18:34:26.499Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/10/83bb535e78c2cf767a6193c2f3b00b2894c1581a36ef85911ebaa3b9a891/langchain_google_genai-4.4.0-py3-none-any.whl", hash = "sha256:8e23a1307bd2158590bbf9d99f1d658fc84a9d9ddb77fb1b372f8875a2bafbbf", size = 81617, upload-time = "2026-09-01T20:15:44.533Z" }, + { url = "https://files.pythonhosted.org/packages/b0/70/b6e29470356cbb2c87db2344df44182dac90d69c0cc4b929a805184a54c3/langchain_google_genai-4.3.3-py3-none-any.whl", hash = "sha256:cb189f6eebe801fda4416525a357d82f033efc36713a7c15a45c25eb1e2ddbff", size = 72859, upload-time = "2026-08-10T18:34:25.283Z" }, ] [[package]] name = "langchain-protocol" -version = "0.0.19" +version = "0.0.18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/14/56/913599f2f9cec8524868929f12d72b2ede377a6056ca8a40a32bdadfa535/langchain_protocol-0.0.19.tar.gz", hash = "sha256:79d90a1425122ac87e8052e2ec054fbd09c3edbf341bdfb6397112a495c7bf8c", size = 6265, upload-time = "2026-08-26T21:12:00.703Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/59/b5959aea96faa9146e2e49a7a22882b3528c62efafe9a6a95beab30c2305/langchain_protocol-0.0.18.tar.gz", hash = "sha256:ec3e11782f1ed0c9db38e5a9ed01b0e7a0d3fba406faa8aef6594b73c56a63e6", size = 6150, upload-time = "2026-06-18T17:08:26.959Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/c9/f6cbf357d48ccbd18bb394433b1fd7ad9be004eed9377ad08bb85777e5e6/langchain_protocol-0.0.19-py3-none-any.whl", hash = "sha256:4cdf879a492a35980fd859ae792d3c65458ccaae504e183c9a10d7eac1f0720f", size = 7327, upload-time = "2026-08-26T21:11:59.781Z" }, + { url = "https://files.pythonhosted.org/packages/99/2e/d82db9eec13ad0f72e7aaad5c4bc730ab111934fdc83c85523206eb9b0a0/langchain_protocol-0.0.18-py3-none-any.whl", hash = "sha256:70b53a86fbf9cedc863555effe44da192ab02d556ddbf2cf95b8873adcf41b5a", size = 7221, upload-time = "2026-06-18T17:08:25.996Z" }, ] [[package]] name = "langgraph" -version = "1.2.11" +version = "1.2.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, @@ -2213,9 +2058,9 @@ dependencies = [ { name = "pydantic" }, { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/0d/c8e7ee98896659e1b6555db0ab115a9ca899844744645d5d894032bab1d7/langgraph-1.2.11.tar.gz", hash = "sha256:9ecfe11e50d338b34b15cf4d8a442642de103e8ae6971320efba84e4542eb363", size = 725753, upload-time = "2026-08-11T14:00:36.945Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/1d/a32f3caf4b3d60651656c0d64976b48d168653e81c71bb7512e9a31541aa/langgraph-1.2.10.tar.gz", hash = "sha256:05a183a746ed570a06c7c1b879920163509a75df9e44e92dd2238218d677fd37", size = 723404, upload-time = "2026-07-28T18:33:51.441Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7f/c5c30e4be99ff821029c7ac872a480676bb179c9f3df85ea3f38d13f86d4/langgraph-1.2.11-py3-none-any.whl", hash = "sha256:8bab70de7b2d00b5300fb289bcf38d8b241400f3184c1e95e8ce706fb0e8686b", size = 248854, upload-time = "2026-08-11T14:00:35.494Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4d/3fc3e2535ee2c731130d71371848ebc6d4a9d2e8ae6060b11987ba134951/langgraph-1.2.10-py3-none-any.whl", hash = "sha256:52c48bd42fa31a1de0e1c0f0ebfe342e11ca2957b8b3563f83dbd60d8e30f921", size = 247753, upload-time = "2026-07-28T18:33:50.028Z" }, ] [[package]] @@ -2246,7 +2091,7 @@ wheels = [ [[package]] name = "langgraph-sdk" -version = "0.4.4" +version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -2255,9 +2100,9 @@ dependencies = [ { name = "orjson" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/ae/91446c1fffa04a2dc1f81afbfb5bfff3590452891a72bd9098a656ab2657/langgraph_sdk-0.4.4.tar.gz", hash = "sha256:4e651ffa09de695681579396375377bdde23bedbc8e35b070e615cbd5af7da8b", size = 345789, upload-time = "2026-08-27T21:25:22.593Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/2b/bd8ac26d4e97f6df88ef05ce5b6a38945a3903e1025d926f4752aa88aa97/langgraph_sdk-0.4.2.tar.gz", hash = "sha256:b88f0f5f6328ac0680d6790614a905b2bcfa257f2276dba4e38f0e86db0aa738", size = 348327, upload-time = "2026-06-01T17:51:19.856Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/d5/2ad7f3a835c6fcebf58b6669552536ecd52d2dfe4cf49c6c36648fd83572/langgraph_sdk-0.4.4-py3-none-any.whl", hash = "sha256:39afe416c91742925e6f8a93715f566d499b36e1b636b804a4ffe3190e4f4e64", size = 162270, upload-time = "2026-08-27T21:25:21.072Z" }, + { url = "https://files.pythonhosted.org/packages/a0/05/aac507337cceae773c2cc9ab91eb6301963af7aeeb55b4217a00e15aff17/langgraph_sdk-0.4.2-py3-none-any.whl", hash = "sha256:75fa5096c1177ce39c847096a8fe3745ffd480ddb412995f836e9f5f884c43dd", size = 160521, upload-time = "2026-06-01T17:51:18.849Z" }, ] [[package]] @@ -2328,7 +2173,7 @@ wheels = [ [[package]] name = "litellm" -version = "1.97.0" +version = "1.96.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -2345,15 +2190,43 @@ dependencies = [ { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/08/db78a9f53e5688ad0f9e50d5c3bfe616e445aac120eafcca907f04634e48/litellm-1.97.0.tar.gz", hash = "sha256:6f7ce326a2e5385ef850e0b0768d41f502ec79278860090a838511cea067b067", size = 17762282, upload-time = "2026-08-16T00:05:44.724Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/d4/a04f8bda468fb25a0a8a392a6922c9ecf6c122ad9bf9e2f69ebd173e1cac/litellm-1.97.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ff401dd5d66f54b9b474f0652c419fb7bf883fbf5ca64c0bc363acdc98b758b5", size = 24235645, upload-time = "2026-08-16T00:05:20.055Z" }, - { url = "https://files.pythonhosted.org/packages/f1/51/a055bf5df38112f07970937d95416b22379ee84664b739bfe87a8292e098/litellm-1.97.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2983b40ed5d8b1bcbbfbc0d66fefa21b04db91b87c05dd680ae77cba74e561ef", size = 23893493, upload-time = "2026-08-16T00:05:23.79Z" }, - { url = "https://files.pythonhosted.org/packages/14/28/b1cf429493aec5260ac2737dd82f6200c729fd26b336dc21cf001cfbcd8a/litellm-1.97.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e3a1f70d693716b4e8a8108f0a464b0e2c555e274ddbb8ef89c4c59c80be14ed", size = 24031743, upload-time = "2026-08-16T00:05:27.138Z" }, - { url = "https://files.pythonhosted.org/packages/08/4a/22c49e8bd068bfdab0daba235cc2d2752d76d855ccb8f6dafe7dabf01ca4/litellm-1.97.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5b56dce7df44a6a9e6caf5379de2578a8cb82831ceabd3d71cc99b370a1015e7", size = 24397362, upload-time = "2026-08-16T00:05:30.89Z" }, - { url = "https://files.pythonhosted.org/packages/0a/22/f60558230969ac7d860bd93aff6bf6a69bcd8a3ef4f35eea211174ef4e81/litellm-1.97.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6b360ddc3162c2ed39b64d3f9957a7af70cd9c60cf71f7a4dfa355a0bf05bebc", size = 24107078, upload-time = "2026-08-16T00:05:34.463Z" }, - { url = "https://files.pythonhosted.org/packages/5d/e4/6c74ff4b188d9399a036d41e86c4c616d95ce5fd9d9b3c42646bd02f270e/litellm-1.97.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3c4f1dd45e14127f2303769a7ae79482697823e329ae503513d014ceea4dd704", size = 24493640, upload-time = "2026-08-16T00:05:37.85Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d1/1475c4ecdf43221ab8ee8d0fcc6b469c26d0d80913d0773e18de81cf18f1/litellm-1.97.0-cp310-abi3-win_amd64.whl", hash = "sha256:dce3377207234fc5c5b275a5e234ba056a5051fd178ae8e9a6aeb5d056f12095", size = 24289278, upload-time = "2026-08-16T00:05:41.441Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/d0/92/1171e76f2a4204a65adb5c827475e4f1d30e7c6a89d3d3e944d58b6fd8a6/litellm-1.96.0.tar.gz", hash = "sha256:340a9b04e1bf8486b0b99f3f6a5556aa59c8f9c16b11b362c95eabea1bcf7a9d", size = 17679976, upload-time = "2026-08-09T01:36:56.266Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/c8/01cd494661e5909f5e308ea1dc8b5e7e1e6ac027b784c9d66be2d3514d3a/litellm-1.96.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:01a6a9c8a5e9214e02b76c869031d4d31eca576559b288defc1f2eda93acd58d", size = 25935235, upload-time = "2026-08-09T01:35:19.155Z" }, + { url = "https://files.pythonhosted.org/packages/b4/20/7f053a468632698545c6621e9969d5d24c2c58dbe3fe3319761661c434a8/litellm-1.96.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:25e6c480451e0125e48d33d5a25ef0ba20dab5435d497e6d2a5b630aa985e9c0", size = 25657033, upload-time = "2026-08-09T01:35:22.054Z" }, + { url = "https://files.pythonhosted.org/packages/05/29/320072d4bd5f4d0c29ab805bdae8d3c8d2456e304da5d2f064c23fa45a14/litellm-1.96.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b287ce44936feccc0def9d41fcaae5c0c97ba304f7defc0b80fb316ed1e9b4cf", size = 26588511, upload-time = "2026-08-09T01:35:24.425Z" }, + { url = "https://files.pythonhosted.org/packages/56/5d/b61da523ce16703c9a3bd415bd470f66679bb6f896b7420c395b8e0291a5/litellm-1.96.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:03bd52694d70ce857b2ce7a5bc4c873320378e9f4fbc3c22a98beec3c60fc0df", size = 26449767, upload-time = "2026-08-09T01:35:26.909Z" }, + { url = "https://files.pythonhosted.org/packages/92/16/74a05376de55ea5138a1564c7626db193c4ff19208f9f72776d844ca1bfe/litellm-1.96.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fa6c626299f372b8d0883c0e574a9d38c784ff1c144951cc1f93e86f94bf6e2a", size = 26661007, upload-time = "2026-08-09T01:35:29.68Z" }, + { url = "https://files.pythonhosted.org/packages/21/39/ed2841b423a7e76aacaa310183f6ea305eae27ab398fa22a40813026dd3e/litellm-1.96.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5d7a34b1502b54a99a7110984328fa02916c6e521a419a8db3554feec9243d05", size = 26868537, upload-time = "2026-08-09T01:35:32.532Z" }, + { url = "https://files.pythonhosted.org/packages/72/09/f4c06c681dcb3e71bd451d0b3f7bf0c5c9527d65ccbcee18f09d9c0ccfaa/litellm-1.96.0-cp310-cp310-win_amd64.whl", hash = "sha256:2c66c13618416c210ba7d34c14668bca3de94f873b7e2c60c491b2553a26acf4", size = 25058331, upload-time = "2026-08-09T01:35:35.138Z" }, + { url = "https://files.pythonhosted.org/packages/9b/96/00b7f3d12dec2f955cfd154246310f6059deb3641c4ccc01c5f86818106f/litellm-1.96.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:88d0c46b3fe6be653461a6ea7cb847729ca4cc6622d9234b149ef237e454bb7d", size = 25934814, upload-time = "2026-08-09T01:35:37.716Z" }, + { url = "https://files.pythonhosted.org/packages/ef/2d/6f722665d7bbf61fcb54fef15bb02e18a38d8eb41005bbefd1b8a47ff5ae/litellm-1.96.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20c7db43cf1d31b358085d315b007d8a34ec6a78e5b0c18e8446d4bafe8ebcf5", size = 25656618, upload-time = "2026-08-09T01:35:40.889Z" }, + { url = "https://files.pythonhosted.org/packages/07/ed/4b49a29649c843b8d9229715ea6f34d458df9901584c8c18104f5b1157e2/litellm-1.96.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:8b4d8c1653513ba355449418add485ff65ee3512dac4c17227640595881576c7", size = 26587971, upload-time = "2026-08-09T01:35:43.809Z" }, + { url = "https://files.pythonhosted.org/packages/8b/2f/d1dc6b7fc54a36f21dd7761fdc44c42516cea017391b9a6dbfefae719bf0/litellm-1.96.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:44e157694afb07d8e9ba1302759fd2784dcb868c247757daddc361e15e9d3972", size = 26449247, upload-time = "2026-08-09T01:35:46.713Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/445efea226b45d3c33606beb392829076f8847071e44610d86b18b263ca8/litellm-1.96.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b581f8373d74149380ff0bc75c9e11b70f6f48417eb0395b8083638cb42b2407", size = 26659379, upload-time = "2026-08-09T01:35:49.141Z" }, + { url = "https://files.pythonhosted.org/packages/a9/5c/64d92fb1d33cc842a8223c682b59511123b4523582693ad710236ab90705/litellm-1.96.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:be291ba9f4a9d25ce72e58efa357e8041f6717341441864adade8e3c33a48f23", size = 26867571, upload-time = "2026-08-09T01:35:52.027Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7b/be6718ff679df40db8ff37e5b5db95b26c08c0a2c06699e5aaceeb36ff07/litellm-1.96.0-cp311-cp311-win_amd64.whl", hash = "sha256:c4ed1f97d252f4e26c68934ca56e13ea40c2205ba5d580e6080b95a4f2fee3f8", size = 25056070, upload-time = "2026-08-09T01:35:54.619Z" }, + { url = "https://files.pythonhosted.org/packages/14/7b/706a7176b1d38529b62724f97e75c98facecc1ac6a60a196c589f5b84aca/litellm-1.96.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:518b9b71a4d7582a0f54f93a65ae4f715ba41bc4475f4a2b9096742612f05f4d", size = 25932809, upload-time = "2026-08-09T01:35:57.551Z" }, + { url = "https://files.pythonhosted.org/packages/57/25/ad9b206ad7170018d95bf4fc777c492921d69c3f6d99e8c396612f23dee8/litellm-1.96.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05da78216567c1b0d288ce17a9650d1b4a45b8b06fe23384b2fc5835a375a8fb", size = 25643217, upload-time = "2026-08-09T01:36:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/11/a2/5f2a03b19d7718e1d01c2c5a764dece7f768e8e7ea08a8412f130e166af8/litellm-1.96.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:61b2b93a24a1733bc718c2255f5c8cf84fb8ef60ab87f544494dd3386b2be04c", size = 26579330, upload-time = "2026-08-09T01:36:04.114Z" }, + { url = "https://files.pythonhosted.org/packages/78/86/9a6480a10edff9c772c03d718d50bb4bdea25f5a94ffc3aa623a199f506c/litellm-1.96.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2e72181f99794d5b6ac01ee18b97a31b7eee93321c9e5b5e5caa36d062822fc0", size = 26443987, upload-time = "2026-08-09T01:36:06.557Z" }, + { url = "https://files.pythonhosted.org/packages/4d/bb/1c08d953f69f977f5d17e0912d9847512a80ecb43b4d5f235ae61610917f/litellm-1.96.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:66b97502d727259f29c486da38921b698a8c816d9eef7d4706a686c63436387a", size = 26653427, upload-time = "2026-08-09T01:36:09.542Z" }, + { url = "https://files.pythonhosted.org/packages/72/77/64ee801331b13bc138de73b216e031dd90e0b6f9a1ae24d33c134d830227/litellm-1.96.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0fdd57b61b6cdf0562eb6daec1d7f02a57dec34ba8f33cd3080bfb5e1beba02b", size = 26860925, upload-time = "2026-08-09T01:36:12.231Z" }, + { url = "https://files.pythonhosted.org/packages/8f/54/6f8395af7b1ebc7b16251cfd521f780fe4826dc634a6947d08f50f3a75f8/litellm-1.96.0-cp312-cp312-win_amd64.whl", hash = "sha256:4d4f454a86736915762ad8e67817992f7e3f1c7aed2b42be32ace4e4ecd1d20c", size = 25054400, upload-time = "2026-08-09T01:36:14.9Z" }, + { url = "https://files.pythonhosted.org/packages/2b/1e/ac71d20d3c5df942d8877b834e5db190b77395317f436e59c77e5c8b0ef3/litellm-1.96.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:baf13fd3176a569b2924e2c4bb4e82da03a11e1a7cf4144ea2d92a1b40d87c17", size = 25933352, upload-time = "2026-08-09T01:36:17.98Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/76c666f9ba4e0a20d8b3fca8f0af369f97d2e2c2a4874b10b4f344c6bed7/litellm-1.96.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:26d2ae2a5f8a839b757cfb7744ffa0c95f225c583984b99352887fcf4e5456ef", size = 25643356, upload-time = "2026-08-09T01:36:20.535Z" }, + { url = "https://files.pythonhosted.org/packages/56/fc/48cdbdb1fc6d0ec573bb9b1c04fe81528d84886e1cde0100d4c38e0238f1/litellm-1.96.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:887fd96224c2197897b1df309e9e8d984196a3d18472f908a6aa5a371e569b25", size = 26580407, upload-time = "2026-08-09T01:36:23.345Z" }, + { url = "https://files.pythonhosted.org/packages/cc/48/c1bddb7e7c328816a0136d94afa455279b825d13e1507b669da2e2be78b8/litellm-1.96.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1a75d7718fc72e526501d568c01f50278206106d1db7d77e6c34973e0877a77f", size = 26444531, upload-time = "2026-08-09T01:36:26.24Z" }, + { url = "https://files.pythonhosted.org/packages/c7/63/0f4109c7e19bb78735e87f9fcca565750d49a71b022941ba89366f764cd5/litellm-1.96.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:217191eeb91561372e1f079f2925a15753f1c41955256e09e11787d7c1dca94b", size = 26653932, upload-time = "2026-08-09T01:36:28.81Z" }, + { url = "https://files.pythonhosted.org/packages/65/9e/812d87aee7db46f9cde44ce96aec25de90f1c4f356def2bb7f6d1ec0a011/litellm-1.96.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1cc10ba307cb31e9a799bfcdcfed4cb0a558c5cfb867a970cc6159d6ec649bc", size = 26861204, upload-time = "2026-08-09T01:36:31.467Z" }, + { url = "https://files.pythonhosted.org/packages/61/80/0d276c052f54386a491571792818d7e24e3bcf2a1fae45f431cdb4b8c15f/litellm-1.96.0-cp313-cp313-win_amd64.whl", hash = "sha256:d64c7746768aa2df6a85d63bb6ea0a092488584131ed5e0d49e52e4088e60d20", size = 25054138, upload-time = "2026-08-09T01:36:34.391Z" }, + { url = "https://files.pythonhosted.org/packages/1c/05/96a800df42d6734f912786d99e77e573f5360ba08f7a68292d067cc291cd/litellm-1.96.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:7a86e14eb6c275f8588f3d364d91cbd935f5eebada28593a08b9106f68bc7681", size = 25935008, upload-time = "2026-08-09T01:36:37.043Z" }, + { url = "https://files.pythonhosted.org/packages/42/8f/bff76ef3d44863d0ace55c3ed01e18a481cc93c2fc4a7c6837e6f6655482/litellm-1.96.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e3c39a0313aadbd771439e9c31b0878eb04992ce29b1b51d0003eccd91feb71d", size = 25643765, upload-time = "2026-08-09T01:36:39.721Z" }, + { url = "https://files.pythonhosted.org/packages/d0/4f/215578f922c301643852309d82b459d699e6a86aae1872fde60c4e33366a/litellm-1.96.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:10c8f4dcf50ba88e3958f0d2c4483f0934622c03b1c5adce14e57d7fd597f3d3", size = 26578304, upload-time = "2026-08-09T01:36:42.887Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9c/aa4bf7cc574eac46ec22d80a9e4c895fa438b3b32c54465a092b2b90714b/litellm-1.96.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:63f98de57415d8f96f3f07d011b11947d3358b5934a66676ae7ec98244613f08", size = 26444536, upload-time = "2026-08-09T01:36:45.408Z" }, + { url = "https://files.pythonhosted.org/packages/34/09/62bb156ffb051bb4ed28a14549c649147d8e231cbef9bad5935aa9a8ae02/litellm-1.96.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0b03e44a3cd0c03421e5afc024e4d6c88ed6f7ed51b7b566cc4eb41652fa629a", size = 26650611, upload-time = "2026-08-09T01:36:48.047Z" }, + { url = "https://files.pythonhosted.org/packages/86/7b/3f5ed4d2a5e23aee7c130fca3a6f81bf1c305922e16135f2c476ee8747f0/litellm-1.96.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:340f893e9bfc4bd283565a7fe9f159840c8641763d533d381580359bfbfc4fe8", size = 26861612, upload-time = "2026-08-09T01:36:51.017Z" }, + { url = "https://files.pythonhosted.org/packages/1a/17/3ec96e43009c91c7cec8ddf6dc830ce2dd03a3f7c5f853267f894daf44ed/litellm-1.96.0-cp314-cp314-win_amd64.whl", hash = "sha256:7ba695d5ea090923fa2338b20c249a504e19bb492d1e61a5a55235c9e8b49931", size = 25056208, upload-time = "2026-08-09T01:36:53.744Z" }, ] [[package]] @@ -2477,31 +2350,31 @@ wheels = [ [[package]] name = "maturin" -version = "1.15.0" +version = "1.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/c8/22e5e21b2679c9bce6415ca578034ca2cc9316be0642ae21e051a2d5198c/maturin-1.15.0.tar.gz", hash = "sha256:94b26cc8e8aba61a5f2099715fe640e18c5f678e9a500408b38761263954228a", size = 385504, upload-time = "2026-08-24T12:11:22.665Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/b3/addd877f871fb1860d46d3a4f206ecb10b946c85846805e6367631926fd3/maturin-1.14.1.tar.gz", hash = "sha256:9d6577a62cd08e0ceba7a0db06fb098e0c9b1b3429bad747a4f3a18215a1b3df", size = 369637, upload-time = "2026-06-19T05:19:49.774Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/69/5c01b461044eb1f45ddcce006706eb88110c793cdb11c7ae0b5e08492e94/maturin-1.15.0-py3-none-linux_armv6l.whl", hash = "sha256:6bf6dc62e22d4dcfd5a51244ff0d58975fa4979c48209fe84159617648956d82", size = 10206220, upload-time = "2026-08-24T12:10:53.327Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1f/2b431554e11687cdb1077e0cdadcc118c53f611086b3af00c8545a67c6a5/maturin-1.15.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd35772633f489841132bc8e71d6fc7f842df30b9c05cd5cdf1ee1ddcb744cc7", size = 19416513, upload-time = "2026-08-24T12:10:56.126Z" }, - { url = "https://files.pythonhosted.org/packages/51/36/e23a21cb34a648b711036b9b2fe1d4f3f4ee24f8db54215d73f1a9a3a3ec/maturin-1.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c40b4eae7bf5ef1f4b1af8d623fe4105016f93578fb15b764e741d08ec3b92dd", size = 10014962, upload-time = "2026-08-24T12:10:58.486Z" }, - { url = "https://files.pythonhosted.org/packages/8c/80/33b15cb2d8f30f12c807955e8f2fd775027692904e30ec0784744ce8cd83/maturin-1.15.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:7eb066372f541f8eb4909c79c5d9bd0b9e8125980bdf1ec9e8aba23c6c8d6c55", size = 10196223, upload-time = "2026-08-24T12:11:00.696Z" }, - { url = "https://files.pythonhosted.org/packages/fe/91/b495e19e2f5c503b540452b2039115e7b2363867e8c5ad4179eb752fa92c/maturin-1.15.0-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:653020a63525bb224e5ab0adf02e17a2e08bc86dbea7fc1399c9a56d7529b99e", size = 10541186, upload-time = "2026-08-24T12:11:02.857Z" }, - { url = "https://files.pythonhosted.org/packages/5d/2b/2abff58037188d852b124871b1f0d720e1c2bfb3d4f1b03d87c52cd66488/maturin-1.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0ebf9767892725083138e671c34482c660317a2f3d6a29fc0e0f34e9d8c99136", size = 10083468, upload-time = "2026-08-24T12:11:05.012Z" }, - { url = "https://files.pythonhosted.org/packages/3f/07/b7e9f8be99a6627849e81ac7b6694876bce8f50a92995fe17e3cf2610f0a/maturin-1.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7ab7eebffd7b8debca2265985de4eaeb332141276d24b9560b5ad484d4b3add1", size = 10047786, upload-time = "2026-08-24T12:11:07.042Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ab/167e3cb7accee11b507dbe53e0e87aeccb376d44ae66284c96ee4df3a9fd/maturin-1.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:126e12e618b4db42f68c779a56d41f82a390145ba36ac3f621d057eb34f5ad9d", size = 13315332, upload-time = "2026-08-24T12:11:09.433Z" }, - { url = "https://files.pythonhosted.org/packages/14/4d/801379f646cbc6b00998e5289b0630a886be3a4ee4c75b6bc9b87478a7f1/maturin-1.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f9d33e6c3f9615c8caceecbbbd440f8eb25a3ddeb687077682cd5eca2e9ae15", size = 10807183, upload-time = "2026-08-24T12:11:11.73Z" }, - { url = "https://files.pythonhosted.org/packages/89/27/2e612e1cbd1580e9e94d4722c227b5180dca27b32b955a34b79918aa1292/maturin-1.15.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:bf29beddd0c6708f112db51d5275fc28b28b9e9c9c5faae387eaef662918b176", size = 10413274, upload-time = "2026-08-24T12:11:14.04Z" }, - { url = "https://files.pythonhosted.org/packages/70/d8/202a7b4d75a51f20f84ec9ce3b7345b12b822207072164e2b1c6ef665125/maturin-1.15.0-py3-none-win32.whl", hash = "sha256:da649988be98e87e009e51b1bf0d301b6a301bc0cecbdd60d40d8ba60748d1ca", size = 8928744, upload-time = "2026-08-24T12:11:16.269Z" }, - { url = "https://files.pythonhosted.org/packages/40/dc/4e90da594986ba78dd3bc8a5921ecdcdb11085b22b02a412caab3b225601/maturin-1.15.0-py3-none-win_amd64.whl", hash = "sha256:552c2be4afd43fe8d5c9f3ec8d4c4756d973b8dcbe94c14084390301f50243e1", size = 10335085, upload-time = "2026-08-24T12:11:18.326Z" }, - { url = "https://files.pythonhosted.org/packages/8b/10/15d4314edf130955edf2dc237aa393a8a7c10f2b9b57b89fa2f61f915659/maturin-1.15.0-py3-none-win_arm64.whl", hash = "sha256:c7dc0c66c78d3debdd9c5aa807e861fbcbf07f3505d34b125df74c03986b0f48", size = 9713795, upload-time = "2026-08-24T12:11:20.83Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/97c5a5bd9c71653a066c0976a484eaaae50b9369557838a4176b7b0bdaa5/maturin-1.14.1-py3-none-linux_armv6l.whl", hash = "sha256:522292398945442cdafa9daeb2271b2340fbde57027b818f923f88eab04174f8", size = 10207496, upload-time = "2026-06-19T05:19:09.321Z" }, + { url = "https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ffe5ad71f21d1e6603c4dd75f7fee34adf5ed5ebcebb692886549888ebb329ed", size = 19680113, upload-time = "2026-06-19T05:19:13.43Z" }, + { url = "https://files.pythonhosted.org/packages/43/b6/79c881410a3b1c187f7eb3d407aecae646c6a4433d630d72200359015e83/maturin-1.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f3306078070c1508fd715b9116070cbcaff5959024272a9f1e6f5cb29768b86c", size = 10169205, upload-time = "2026-06-19T05:19:16.615Z" }, + { url = "https://files.pythonhosted.org/packages/93/9d/44b6f26dcb7f7a04c5501ac2dbb6ca1490150682baa525ca5860504f9eab/maturin-1.14.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:cd457cd88961156e26379e1155bd287cc0ec1c8b2f1582b0660fb31b87c8842d", size = 10188098, upload-time = "2026-06-19T05:19:19.736Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bd/9c0d5d6983905ce2c9edaa073a7e89355a9cf7f396988e05d32f1c37785d/maturin-1.14.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:dfc54ae32e6fcb18302193ab9a30b0b25eefffba994ae13238974805533ef75e", size = 10627576, upload-time = "2026-06-19T05:19:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/e5/33/b096412bd6a7cb399652b260666f901adf88a687181a6dbd6a3f89f0a94e/maturin-1.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:a131d912b5267e640bc96d70f4914e10590aed64082ec9abacba7cea52004224", size = 10085181, upload-time = "2026-06-19T05:19:25.69Z" }, + { url = "https://files.pythonhosted.org/packages/56/8d/08c3bf469c38a23c9e6c877e338193001eb604d010fedc08341974e38528/maturin-1.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:be18fc568fb76884c0205456336892a75105ec398e6b667cd777c6268bd06d69", size = 10026363, upload-time = "2026-06-19T05:19:28.904Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/c4d1a92839f8745ab4aab988a7db884a79d6d710bd3b286fcf9316dece1a/maturin-1.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:994a0c8ba3ad8a92b3a9ee1b02645d200d610216b15cff5102b0fe65e8e08666", size = 13321347, upload-time = "2026-06-19T05:19:32.411Z" }, + { url = "https://files.pythonhosted.org/packages/b3/fa/170f04624d03fd07d2a8b1b67de83a127af93aef9eaa425839553347297b/maturin-1.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be80866363e605d137991b491a741a84cde9ae350183c4c85f49690ca9aaaa65", size = 10877609, upload-time = "2026-06-19T05:19:35.448Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/1ae2e1d0ded282bf2c55ac13f0811d87deb425e200ae64a15785675dede9/maturin-1.14.1-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:5282dffd4b539d2be245f4e5b1a5ab6bc1033b58f4a4872f5833f9d43c954aa4", size = 10417316, upload-time = "2026-06-19T05:19:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/fb/27/bf677183920718da49cd7982d6a3ffc440aad8919329f571d189f81b7bdf/maturin-1.14.1-py3-none-win32.whl", hash = "sha256:1a04de0a20188f95c721b5702eed18140bdcccb28c386797093eca3f62f4d4e0", size = 8931293, upload-time = "2026-06-19T05:19:41.183Z" }, + { url = "https://files.pythonhosted.org/packages/63/4b/585adeb9167b08d3cdff0032a938b0e72655c92003df4f52c3f696a1bcc2/maturin-1.14.1-py3-none-win_amd64.whl", hash = "sha256:3c9f94640ecc4895e94abaf834a0684430032c865b2748a36c12461fd9252fdd", size = 10314067, upload-time = "2026-06-19T05:19:44.389Z" }, + { url = "https://files.pythonhosted.org/packages/51/d4/dac8c0720ae246be1700afb6fbdbbea20fe35b13f6570b2f70faa005df77/maturin-1.14.1-py3-none-win_arm64.whl", hash = "sha256:15cea8fcb3ba47dd636f50092bb34baea8b04ac777392f23e6bf8a9a61efb894", size = 9718943, upload-time = "2026-06-19T05:19:47.49Z" }, ] [[package]] name = "mcp" -version = "1.30.0" +version = "1.29.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2519,9 +2392,9 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/93/0142dc84a666daf8ad51a34268f34c12fd6fda4f3810c4be2504eecc8212/mcp-1.30.0.tar.gz", hash = "sha256:445414625fce5c295faa505bb11bacece661ab6f4028d57c935db57820b7a3e4", size = 680511, upload-time = "2026-09-07T14:34:15.845Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/d3/f9acc21dfc886e4f78e2add1a47db46ce16884346afde53f8a064c02c891/mcp-1.29.0.tar.gz", hash = "sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36", size = 643148, upload-time = "2026-07-28T13:41:41.939Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/f4/e58bc33317c92a0203664daaf00bf6f41166cc0149e5d6870a03f7cd004a/mcp-1.30.0-py3-none-any.whl", hash = "sha256:666edb5009503e1047c9d60346a756f94b261f05cc2625f23d41c728ffc484d0", size = 234581, upload-time = "2026-09-07T14:34:14.266Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/248b201f6d753d69fd5d6506011abbb35a946d9142b2ae311a948fd0be3d/mcp-1.29.0-py3-none-any.whl", hash = "sha256:f5a075bb611f23d6f4d080c6a1699fa62772eebc562ba9e66b306ddde1c755f7", size = 223436, upload-time = "2026-07-28T13:41:40.337Z" }, ] [[package]] @@ -2544,7 +2417,7 @@ wheels = [ [[package]] name = "moto" -version = "5.2.3" +version = "5.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boto3" }, @@ -2555,9 +2428,9 @@ dependencies = [ { name = "werkzeug" }, { name = "xmltodict" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/0f/1682c01ca0608c25526afb150246a3c9c1f609caccbd39758de4850e31bc/moto-5.2.3.tar.gz", hash = "sha256:a9e95c3218b6eda18e74571f1ced11cb1bc3151467d562c1da6037b9d19832cb", size = 8785514, upload-time = "2026-08-22T18:46:00.199Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/63/d944f387582cc53f53febbff2b3fa36a6d2ed7c1feef8990bf646cfa9cba/moto-5.2.2.tar.gz", hash = "sha256:aac8023a429e125e91c91f8f4730a67b54f518cda587352f7e67252fe3168f75", size = 8678761, upload-time = "2026-06-06T18:57:54.931Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/80/ee7ace7a49bd525455497fa2ff198111877d6f93b908b657adeb2cf057a4/moto-5.2.3-py3-none-any.whl", hash = "sha256:5ec31b3cdbb383a19d46030157bd82aaaa7a9cc5f564200f995663d347bd4728", size = 6780972, upload-time = "2026-08-22T18:45:55.719Z" }, + { url = "https://files.pythonhosted.org/packages/c1/45/13cff46f4f617a6e97e1d497d75abd913e250bb4c823a4985668c6e593e4/moto-5.2.2-py3-none-any.whl", hash = "sha256:3817f1e39721ca833579b921e53e3b68547ace6a34d848c9486fbb5905808de9", size = 6698689, upload-time = "2026-06-06T18:57:51.435Z" }, ] [package.optional-dependencies] @@ -2593,278 +2466,213 @@ wheels = [ [[package]] name = "msgpack" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/44/ea2100ec54d30c46ee9dba10a3bfb79b655e96c6df237238a3234c75869b/msgpack-1.2.2.tar.gz", hash = "sha256:9eb0b0e602064527a045ea28c4f174ed69383587e29cebe28947e3b84106eb2a", size = 187025, upload-time = "2026-08-27T10:03:47.793Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/40/181c8944b28f779ed0b2587d24cc0ccf1bc87248204105327140aa20d63d/msgpack-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7afa5431f6f3487c584187ca6c8e2a34e9b106529893b3e720eabb068f6ac970", size = 83554, upload-time = "2026-08-27T10:01:34.182Z" }, - { url = "https://files.pythonhosted.org/packages/03/f7/a6bf145f7d3eb734b3d97fa295f8007a586799ef56b456c8b27bff62caac/msgpack-1.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9b4cf3685a135666d27d0d7a73fece74e2fad01d9b508fded89e843512f0e90", size = 83857, upload-time = "2026-08-27T10:01:35.816Z" }, - { url = "https://files.pythonhosted.org/packages/93/1a/77d32a60a80ee67016e77b13bec07e85f1929a92f046da044591c7eb01c9/msgpack-1.2.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4710d881d8fb047deed2485707409116722af2b992d3fefd73c7667c4e350839", size = 398390, upload-time = "2026-08-27T10:01:37.693Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f5/ae93f85b063d744731cb285528210cd950333b167cacc7b2f96e1420a475/msgpack-1.2.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58ce37a4a54577115922385d37201d9a44d66d0167dfbbf4770a2e9bf8ea7ba3", size = 407183, upload-time = "2026-08-27T10:01:39.499Z" }, - { url = "https://files.pythonhosted.org/packages/17/92/d91a08a913a3bbafbede5b9dbf48e4e517f7d92510877b6b02730060ea85/msgpack-1.2.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86f173a584f72f6164801f31866d22a581f60c991572cf922aed9ab8eb422b77", size = 375978, upload-time = "2026-08-27T10:01:41.234Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a4/27400c101a96115fe8484cad57b6c5eb4f9ffba080a1d9be62ec9174bf67/msgpack-1.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e05a94a0442de86818a30281c6cc2cb9cc7aa148386fd3541c4d4774b73cb3a9", size = 389566, upload-time = "2026-08-27T10:01:42.779Z" }, - { url = "https://files.pythonhosted.org/packages/44/92/541e9fa4623587767623788b38d11fc78d402acb1421962a13d3ace48bef/msgpack-1.2.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:9bd3d1557c3fe1a095068210708a03e3e4795973392af6f4047060e70abd9a6c", size = 372583, upload-time = "2026-08-27T10:01:44.572Z" }, - { url = "https://files.pythonhosted.org/packages/0e/03/c1e0035e1f923f548b7016a2fef5afea431cdae95d397c5aa52ed75dde05/msgpack-1.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:46ec851571d8f1b6e29794ebb9dd36f785008da6d14f57c702e60781d6caf648", size = 404507, upload-time = "2026-08-27T10:01:46.167Z" }, - { url = "https://files.pythonhosted.org/packages/ca/49/7efba0fd604059f0dc8f57ba2867bda4d57bab6921a12e975ecfbd49284c/msgpack-1.2.2-cp310-cp310-win32.whl", hash = "sha256:1f3af0baafd184436501004828bb3df64eeb2fc49dfe9d89abcf604956094563", size = 64848, upload-time = "2026-08-27T10:01:47.797Z" }, - { url = "https://files.pythonhosted.org/packages/57/1d/b41e96ff441d46890b9d5982959aea4d15c5d322f92740dbef16e9dfa908/msgpack-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:82b1bdf293267afaadcc608b125e7fc6576bb0785a60c4fa7d07c7ab76ed76ec", size = 70927, upload-time = "2026-08-27T10:01:49.199Z" }, - { url = "https://files.pythonhosted.org/packages/53/fd/a05ba8f84c5951c9aec2a19c1c81f6c4a67b8bec80af604ac5b23ccfa019/msgpack-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d7fb25b4442fae0cb2590272d06ab4f6caa526ee36a994edb81e946b874813e", size = 83498, upload-time = "2026-08-27T10:01:50.62Z" }, - { url = "https://files.pythonhosted.org/packages/0f/df/e20bcf5c149890545334743b212eb4b82e1a25fe0a34f99753a1755bfab5/msgpack-1.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fe374ba76eb0ecca13a1703daa8fa85825a6ddddbb52d4c1a732fa524194683", size = 83896, upload-time = "2026-08-27T10:01:51.898Z" }, - { url = "https://files.pythonhosted.org/packages/ac/c3/00dcd902d66a641b9ba350783feb482ea5c1ca4a7ff6629db0c10c0ea982/msgpack-1.2.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9b0c1f2aa7b0026b4bd50718100e8b04175e4f36e160aa852502377b5e572e7", size = 413259, upload-time = "2026-08-27T10:01:53.296Z" }, - { url = "https://files.pythonhosted.org/packages/93/15/17374efe9793f5332c7d4727ab40539f95a1dc9df653531795daca8c4281/msgpack-1.2.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f11e09f10210a91c169e39c7a5a1f9090eaa73ad75555fafad5023c3053c47ba", size = 422907, upload-time = "2026-08-27T10:01:54.786Z" }, - { url = "https://files.pythonhosted.org/packages/d3/af/2b567d684f912fedcefe3f7c37de604716ffa99336bd432688f9f040df92/msgpack-1.2.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8b1415d02e9bf722672af8a90f90813265a0cd0b14163187261e54a5592bc949", size = 389248, upload-time = "2026-08-27T10:01:56.55Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fd/d8533fed473cc3e309a701e851d0e5fe36ada5552a3899025f5c69fbe877/msgpack-1.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42fd9260416885b4815caca5bdd14dfd5dda6cdade732d6c09104ef8f6228761", size = 407099, upload-time = "2026-08-27T10:01:58.357Z" }, - { url = "https://files.pythonhosted.org/packages/d6/1b/57906337bfee0ead554571dc203ea17c3fad26d51e5eca6271ecd983f73b/msgpack-1.2.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:336525cc2688e43ea77dfb1a4ce012c8cde561835913801dbfcfdcf4111d8abb", size = 387201, upload-time = "2026-08-27T10:02:00.109Z" }, - { url = "https://files.pythonhosted.org/packages/de/0f/5d1e6d68e516621697a9262b24917d678793e838cf3f331ed4656b3e959d/msgpack-1.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cdb6cc6e1127d15879c47a8b3270716243da82d3e7feab1f5946872c75b3d60f", size = 420765, upload-time = "2026-08-27T10:02:01.573Z" }, - { url = "https://files.pythonhosted.org/packages/6f/a6/07f9a4f3324d55c3567ab2a7e8d5325291bc95a31a374bb390a21b7c4e24/msgpack-1.2.2-cp311-cp311-win32.whl", hash = "sha256:cf66fb38703e61a486b01b56d43bb1f50698fbe99b6bd90feba10f24fab60b3b", size = 64785, upload-time = "2026-08-27T10:02:03.01Z" }, - { url = "https://files.pythonhosted.org/packages/84/13/f748f0d59f355d196e71a0b32d48d386a9bd311f94d954e666cf7e5b2572/msgpack-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:0883a1578168929fd1640fbbc4614773f1a130e419a8a817dc2918d9af1b651c", size = 71258, upload-time = "2026-08-27T10:02:04.375Z" }, - { url = "https://files.pythonhosted.org/packages/46/a6/10d979c4e76b18a9b9ebbd6499ff863474ffe5955028ea27e09b66f6833c/msgpack-1.2.2-cp311-cp311-win_arm64.whl", hash = "sha256:4955accbd87f27beebef5f3ecc27503aa74cb016fb4f640868e749fd93194a35", size = 65860, upload-time = "2026-08-27T10:02:05.735Z" }, - { url = "https://files.pythonhosted.org/packages/31/78/90c15bebb1a72667349ca62d4507e9d9369e7f8f76b95f490b823d3622e5/msgpack-1.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a4348705be86e029d04e741cf9ed0dfe03e942d7d3b92e838fa80d3aa2c3ebc", size = 84275, upload-time = "2026-08-27T10:02:07.106Z" }, - { url = "https://files.pythonhosted.org/packages/88/88/c2b6d8e81571da87aa232c0e34a3f3a0e618e6235892065ec82d1d81fc7a/msgpack-1.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a652ceeededf71d3fa40c303a02a149d42338d310162367b91c539d4bd6e0a3", size = 83970, upload-time = "2026-08-27T10:02:08.488Z" }, - { url = "https://files.pythonhosted.org/packages/da/c0/d3ede9f5d16acb4c05a9281859f1e99ef9f877a928eb78454c37f70db001/msgpack-1.2.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90986cc9aab9d7d1d8f38bcbf65d3f7ac83bdd90c35765db7d691b4829698cba", size = 409401, upload-time = "2026-08-27T10:02:09.877Z" }, - { url = "https://files.pythonhosted.org/packages/41/f0/29f591bea185616cf417645ac03bd3ad9b317483ad8572160e325f7fe777/msgpack-1.2.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77c2e018417dc1d66f235e383877ee885b60ade9d29e494dd581e08af2cb1923", size = 420619, upload-time = "2026-08-27T10:02:11.526Z" }, - { url = "https://files.pythonhosted.org/packages/4e/8e/c70c8c9180c5ddf4440eb8658ebead98e22e7686fbf84f6b165031430750/msgpack-1.2.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0e91332144f69bc3018c91232fac26da580ef748fb8eaddd7914d4458001cc4f", size = 379747, upload-time = "2026-08-27T10:02:13.345Z" }, - { url = "https://files.pythonhosted.org/packages/50/9a/f10ce11fa62700c9ab87a22e65b9ca272f7f673ddd31aeb2de6ae272ad35/msgpack-1.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e915d390d7068b257ca8b62f3fc59fad135c8631d1017ab03b0b924b07c5367", size = 398944, upload-time = "2026-08-27T10:02:15.006Z" }, - { url = "https://files.pythonhosted.org/packages/82/fe/d7be978456ff8552e69a8e270d882e7530e01513c096b293d83df03753ea/msgpack-1.2.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c522420d78db2431887d45b518e304d86e27b9ad0b30f24e3806a6ad5d8bdbfc", size = 373979, upload-time = "2026-08-27T10:02:16.618Z" }, - { url = "https://files.pythonhosted.org/packages/be/af/91b0d8d3fb3063e259daee3ea8515cea6282f68f4b0e5f0b6fea25762c6e/msgpack-1.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4b554d8164ebb526892194f71dcd96ef1fefe0c250087498785d3ffc04a80be3", size = 417781, upload-time = "2026-08-27T10:02:18.293Z" }, - { url = "https://files.pythonhosted.org/packages/8e/3c/ce8e9efe1fd9e95c78b3705e4300ba7feba3dc6c00fb76259895db155518/msgpack-1.2.2-cp312-cp312-win32.whl", hash = "sha256:0e3315de5a4b2920ccef48d96b4448025e064a10d0f5a250f6584477d839c8d4", size = 65267, upload-time = "2026-08-27T10:02:19.869Z" }, - { url = "https://files.pythonhosted.org/packages/85/98/a33b8b4af14e3476bb0da1b8c36ef7a0f28dcf95db1c5e68ff88cb89d591/msgpack-1.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:b68614fba0570349833b7dd999ff0aed4e5cc8d9eb6e3a7d4527be33c65e33d3", size = 72275, upload-time = "2026-08-27T10:02:21.141Z" }, - { url = "https://files.pythonhosted.org/packages/df/5e/2f323a33a6aba5bd4b2d8b430e4fab21d92cd91c093b49ee287bc166ee54/msgpack-1.2.2-cp312-cp312-win_arm64.whl", hash = "sha256:59d5b93efa45fd09f620d0c9ba81cde339a2c9937af3eea42ee9653094ce6640", size = 65488, upload-time = "2026-08-27T10:02:22.575Z" }, - { url = "https://files.pythonhosted.org/packages/1f/eb/42f31c5a48811787ff59a9869721f70a49654d65ab6c455f4463c39b044e/msgpack-1.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8b2a281b556f120a43e591ea39915741b7ad54d4727b9c4350a0a11692252533", size = 83911, upload-time = "2026-08-27T10:02:24.06Z" }, - { url = "https://files.pythonhosted.org/packages/33/54/10c6c16ddba8a5112e3680176b838e3694e4aad7284f9daa6d6d70d98817/msgpack-1.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e8cdd1f3e7cc52c751092a9bf740e81e6919ab109cd376ae2d965dad0bbae34", size = 83734, upload-time = "2026-08-27T10:02:25.613Z" }, - { url = "https://files.pythonhosted.org/packages/d7/75/35823e4419df8792191b2a17ae3fe71b41d02c162b2c491c94d1a87f0caa/msgpack-1.2.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1814f92306ae7862908e9ece7cfd90e0dc87ded3e89b6ae7ffdd1175d6376fdc", size = 405635, upload-time = "2026-08-27T10:02:27.012Z" }, - { url = "https://files.pythonhosted.org/packages/6e/d3/6592e4064619b04f2dd0054c5fa13e37e3d55eb26044483d871fadb2f46b/msgpack-1.2.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d24b38a825bcca41bb956de50eb98451ef291304a8607fad99e619043d3e79b9", size = 417332, upload-time = "2026-08-27T10:02:28.776Z" }, - { url = "https://files.pythonhosted.org/packages/e3/a1/b21c6818a545e9a4a976ac954a5c250eecde9a02e0ec82f415473dab1324/msgpack-1.2.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34e83e345194a2a51d8bd447dea9de2104f91e75b247f4735f14f04529f0746b", size = 374378, upload-time = "2026-08-27T10:02:30.678Z" }, - { url = "https://files.pythonhosted.org/packages/03/8b/7ada15c7b64151d6dbb562d1b091520efb2c37acf2403b1d4ae13797b27d/msgpack-1.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:682804bf31e43d46e51a9a33bd575b51e839d715ce6bd5612c055f7b28ad637b", size = 395809, upload-time = "2026-08-27T10:02:32.322Z" }, - { url = "https://files.pythonhosted.org/packages/bb/f7/96283e50f7020df4dfeacc55612b7a210c8cdf0dda48bc262f1f9b3e4c49/msgpack-1.2.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9b659d77f8726fa5e7038967dda6b68d53cf34472c094cfa5b845454713b90d5", size = 373495, upload-time = "2026-08-27T10:02:33.832Z" }, - { url = "https://files.pythonhosted.org/packages/cc/fe/1548dede9d9ca482f2d424a2e110a9705d4e02627a16b8bc8d10ce0208a2/msgpack-1.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d9a562aec0a92fe536da2e533d313b3d2a6b929157b1dec7ff623446dc0a8ab", size = 414360, upload-time = "2026-08-27T10:02:35.396Z" }, - { url = "https://files.pythonhosted.org/packages/77/9d/4419b8f86c219174b1fb8bbd7faaf84a548935f7b1916d028401b9433417/msgpack-1.2.2-cp313-cp313-win32.whl", hash = "sha256:a4161eee7799863aee237c35c90427861f7b994416dd81ae829f560b0a81bdcd", size = 65196, upload-time = "2026-08-27T10:02:37.007Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f8/593f5caf0dacab41cde1564c5f0419e61af55ec9628006205e8fd5eb5e03/msgpack-1.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:b07c03f0da7e5279170df7745ddc732d526c8a198208936ec1a95c11ed2b2d5f", size = 72203, upload-time = "2026-08-27T10:02:38.28Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9e/c6ef92046b4a2bbb9d3aa0cb581cbf4a4051afccf6e5fb301a1bd3086f39/msgpack-1.2.2-cp313-cp313-win_arm64.whl", hash = "sha256:d13d07efbf655f9ae7a2352b630c52727b359005b21ba08a507585c9ac8c0896", size = 65435, upload-time = "2026-08-27T10:02:39.534Z" }, - { url = "https://files.pythonhosted.org/packages/5e/50/3e92c403346652cabd08cb8faceef847bae917ea3b3c81b64a5b6d09ed41/msgpack-1.2.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e497ee34e8a3342bbde51b27c22d8db05a651df3361dd3daef5b3ab0d66f3e04", size = 84315, upload-time = "2026-08-27T10:02:41.181Z" }, - { url = "https://files.pythonhosted.org/packages/b6/dc/8efe6dd96a12ab043930cb4cffb40b6e7f061491d6ec7a3d2b75ef1fda42/msgpack-1.2.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0dd9173c5ebaf5ecc5ca86e7ae1db92934e1d57b856f3dd90698941431f4fd77", size = 84634, upload-time = "2026-08-27T10:02:42.621Z" }, - { url = "https://files.pythonhosted.org/packages/1b/89/996573095bf7b038c04dd65ddbc4f1a4d381b0f7a44ff9186f3c7b8325c2/msgpack-1.2.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8dc4487097571f7311188c3eca2a3e86cd1f1db4c37c7a017bcc3fd38486cbfe", size = 404194, upload-time = "2026-08-27T10:02:44.096Z" }, - { url = "https://files.pythonhosted.org/packages/b6/4e/46f5a5d949dbd054dab60cb15aac7ac6ae6774c134532893414689bf2f53/msgpack-1.2.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73b0e05c32c3cfc3cd84994908e57430c0ebc6813abf905d3f18ff115d54df3f", size = 412343, upload-time = "2026-08-27T10:02:45.747Z" }, - { url = "https://files.pythonhosted.org/packages/da/e8/739a94197358a313307e6e9e7d8d22ef66add39222de911a44161aa96920/msgpack-1.2.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa1120c653b76d8eafa50423b5eba06b5c9737f8692c74fa3afe03e84b8978ea", size = 372620, upload-time = "2026-08-27T10:02:47.578Z" }, - { url = "https://files.pythonhosted.org/packages/03/d4/09b92e1fcdccea9466bfae45455367ac52362ae445d96a602e51b7a8df73/msgpack-1.2.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccfd880988f8438d1c91c77d7edc58e70f4d2012e999167bc154c64c6f06ea6b", size = 394603, upload-time = "2026-08-27T10:02:49.172Z" }, - { url = "https://files.pythonhosted.org/packages/47/db/d11bd6f258a60703dcdc7a3772818ad0c2f602ee4c2acfb24088c6c3ebc3/msgpack-1.2.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:6195257a107bf25872ef84aab7295078271eea3ac6413f0506b631f6c9586ed5", size = 372666, upload-time = "2026-08-27T10:02:50.886Z" }, - { url = "https://files.pythonhosted.org/packages/71/cf/fbbbac0c6e5fbb9d51abc23e3b5fe8620f5c01e0588797cf664a623bb9e1/msgpack-1.2.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b8dd6c71d20c28d2d0eb0c51e7cccf3584afde3b1364f6629596186c9025bd54", size = 410889, upload-time = "2026-08-27T10:02:52.51Z" }, - { url = "https://files.pythonhosted.org/packages/94/60/8366558da954095e04e7fbc351f9387d87a682feaee9a235ceda966f794b/msgpack-1.2.2-cp314-cp314-win32.whl", hash = "sha256:d242f3c4ccf55b056e6cf901720dccde58f1df117898f2bbf3bcd6e38ec7c248", size = 66774, upload-time = "2026-08-27T10:02:53.984Z" }, - { url = "https://files.pythonhosted.org/packages/4b/3d/1ce873c8057c65e4fbb076ffe1c99c9ae39d90a00a2540d7b06c652a292f/msgpack-1.2.2-cp314-cp314-win_amd64.whl", hash = "sha256:1510f24612d4b983dff6935d9273e02c320cfd525727fbcb58836a75f589fdbc", size = 73424, upload-time = "2026-08-27T10:02:55.277Z" }, - { url = "https://files.pythonhosted.org/packages/d5/55/e36f2a33e38657f33850d74e0bf256838a0d45802c298cc501a32bffcc08/msgpack-1.2.2-cp314-cp314-win_arm64.whl", hash = "sha256:7826f16edc763e768404f55605ef85dfcf5857e729c1ed29e0d7c180be4fe6d8", size = 67657, upload-time = "2026-08-27T10:02:56.493Z" }, - { url = "https://files.pythonhosted.org/packages/64/58/7e764b957bae80ae281a9cb28761068c8bae8d5c6ac0873e43cc69d176c7/msgpack-1.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f466049b8e1ec0854287bbe9a074316826fe0e08dcf707245f98b1ae49e92650", size = 86594, upload-time = "2026-08-27T10:02:57.796Z" }, - { url = "https://files.pythonhosted.org/packages/ae/f0/250f5985b6ee533e60d357571a808aaae03c54118294dc3db7158e27feb1/msgpack-1.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f6b6f8deb07d49090e1808c6ef9cb7d23ca17bef3aa6ed3e5e03df16606e60c", size = 87374, upload-time = "2026-08-27T10:02:59.256Z" }, - { url = "https://files.pythonhosted.org/packages/bd/2c/126ec8f187877c5f688631c543d1d3a3d75b2e66b83fb9de3ed7c13a39b6/msgpack-1.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b542ffc0a5c531eedc40419f291f1bd659aa8d4223408a5b51c88a2796083fd3", size = 428157, upload-time = "2026-08-27T10:03:00.9Z" }, - { url = "https://files.pythonhosted.org/packages/95/21/d2d81d50aaedb14147d01f22094185794db3ad8a8791b60afacba0627c89/msgpack-1.2.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d095df2627e5dd59ac7b0c5ad627a671c76e6020171e03cbe4621a61f0562c3", size = 426669, upload-time = "2026-08-27T10:03:02.457Z" }, - { url = "https://files.pythonhosted.org/packages/c6/fc/f7d484ee5b572719608e7ffad569bea22ff11309a96ca2fae85eec94226b/msgpack-1.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ffdd2f4950daf7815490f23087963e3420175b9609520b7ff5df64d351159c22", size = 380625, upload-time = "2026-08-27T10:03:04.244Z" }, - { url = "https://files.pythonhosted.org/packages/0a/c4/b924cbd5516676f4e612329f18602a833bd055ffbe27f808eeba0f01bfea/msgpack-1.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:652d1bf13d01bac8fd569def0fe76745e55bcda01e30aa6332d5947ea3788839", size = 411328, upload-time = "2026-08-27T10:03:05.869Z" }, - { url = "https://files.pythonhosted.org/packages/27/9d/0c1d9683a951a80f270c3b7dac1022c18b9307617344dd44d904135d5e12/msgpack-1.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9bf452ff4d4981f25a18e9476e002bcc9263e7928024aa4d7148e25f7be3f929", size = 377892, upload-time = "2026-08-27T10:03:07.37Z" }, - { url = "https://files.pythonhosted.org/packages/06/bb/bf22338cdd22e0b40c8f28468cea5f3d9c320244c095d8303364bc012c41/msgpack-1.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:55faa6f8395e23b848c535ad5dcb96b3462f37f5e7f4ac500d500434f7345da7", size = 419426, upload-time = "2026-08-27T10:03:09Z" }, - { url = "https://files.pythonhosted.org/packages/7d/42/6d02c19a01abd8d7ce817c321d2ee6af1a8e24d584dca619d1b6576a83bf/msgpack-1.2.2-cp314-cp314t-win32.whl", hash = "sha256:419a45c67a5c04213172a14b1864657e014665b77d7081b107a51707923dd39e", size = 71810, upload-time = "2026-08-27T10:03:10.498Z" }, - { url = "https://files.pythonhosted.org/packages/af/df/fda3a204415dab0a8c0db5461ef7205416ea52bd8581c5cafd361be07f3b/msgpack-1.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:935b1cfad9b908b0fa845010f4271df4c2f04e1cd26e3f18acd61a45f93c9e36", size = 78919, upload-time = "2026-08-27T10:03:12.016Z" }, - { url = "https://files.pythonhosted.org/packages/63/d4/4b4b0ef25a86deca91feaf7252ca885ba4f2ada40461379120122a04fe96/msgpack-1.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11e8c421e117d1c36728b423d0402555cccbf0c6f53e288f0e75b6b12100d70f", size = 71925, upload-time = "2026-08-27T10:03:13.332Z" }, - { url = "https://files.pythonhosted.org/packages/3b/92/4b44bc8f3243ef8cf9cb5368c17a299d45b9df858f6dfdd98a0482dbbb37/msgpack-1.2.2-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:e1b99ad34613d5f8477fa5cf99bc4eaeaf27965588007c102370cd9a78fe9de5", size = 84293, upload-time = "2026-08-27T10:03:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/80/05/c992bb65744665a41b5bf531fc0e1619bae0901f57738228ded90023c151/msgpack-1.2.2-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:0fbc1bed8a535389b41882cfae66376e248cd1680eaa94fd83193c73e1d24986", size = 84490, upload-time = "2026-08-27T10:03:16.12Z" }, - { url = "https://files.pythonhosted.org/packages/d7/bf/7f53b9e6709a4df7f9b9b81dc65f9dfaa32caf65bee94986ec2cb8fa07f1/msgpack-1.2.2-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:06d95f61de7afe4f4ff908a6feebfcb070d0582ac87c9cf3cedf8551cf634516", size = 405332, upload-time = "2026-08-27T10:03:17.692Z" }, - { url = "https://files.pythonhosted.org/packages/d2/5a/305c4dca14b50d0b51fb88ef04ec125b8f0be3e2ce730dcc62dbaa651cc5/msgpack-1.2.2-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b5c696ae7cd7166b3657261adb855b461ff31f07823fdbae9de8bf80adfccc21", size = 416798, upload-time = "2026-08-27T10:03:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/7a/df/a645102b4cdfd9a94201cac4e900e9c1429fc16d86aa311c06eef82528c9/msgpack-1.2.2-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0708afbf6a9587f0bfe479a9825c141d14d91e2f6a5c8103cf28bc96f4edb5d9", size = 377312, upload-time = "2026-08-27T10:03:20.928Z" }, - { url = "https://files.pythonhosted.org/packages/f4/26/c56d8d086d3fb1077bb48092b158b5ea2eee08b279e10c191275f13bc980/msgpack-1.2.2-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:226a62ffe99fe54c5c61d910ec64c3449b7766c3280bd286bf6c94838dde239a", size = 395182, upload-time = "2026-08-27T10:03:22.571Z" }, - { url = "https://files.pythonhosted.org/packages/4d/b5/3d46ba367a565e536d8d2a61eebcee71b1dc803da3ce74a22313b573d6fa/msgpack-1.2.2-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:9fd7f32e2f0fb334e7ecc5adb5cf0458785bd3a9d9d86f950e1715f101cebce5", size = 377945, upload-time = "2026-08-27T10:03:24.151Z" }, - { url = "https://files.pythonhosted.org/packages/a5/2c/d5d2df273ed5306357da25b69400fd8d7a53c4d87d8976604b677484d61c/msgpack-1.2.2-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:9db1ba1c1e6a84245a9dd866265b56b8a1e9461549cc72ed296d8cbfbd32961b", size = 413341, upload-time = "2026-08-27T10:03:25.85Z" }, - { url = "https://files.pythonhosted.org/packages/1b/fb/32613bced3cad47b40b1b73dd04d687121349d83f748efc2575929121903/msgpack-1.2.2-cp315-cp315-win32.whl", hash = "sha256:e2eb7ea0ac3911a7aac9d8aaa36d40f216d99455b3274cd3fac38181bcd910cf", size = 66730, upload-time = "2026-08-27T10:03:27.294Z" }, - { url = "https://files.pythonhosted.org/packages/74/56/d86171f7251015e9312e5a7f9fdd4cf89752fc2114b88fed453d2a040c66/msgpack-1.2.2-cp315-cp315-win_amd64.whl", hash = "sha256:9352e6cdb510a7b1a5d3ccaccec730e82e50cf3484a3af7bdaab19e23b9589ff", size = 73477, upload-time = "2026-08-27T10:03:28.615Z" }, - { url = "https://files.pythonhosted.org/packages/13/1a/56b90f6defef61700b86baca3637c15f62ac0f9b21ab0f16613ab9d1f101/msgpack-1.2.2-cp315-cp315-win_arm64.whl", hash = "sha256:29cc2d5291711a52956a79a51f41c732329df39ad727c886bd8f0b5b9237a808", size = 67660, upload-time = "2026-08-27T10:03:29.895Z" }, - { url = "https://files.pythonhosted.org/packages/cd/20/12751ca0d8ec874701b54c392c2b19f51af8dd1de40a92a10e356f0aaf58/msgpack-1.2.2-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:d886baa46b2532135e7320067e6a44edb09ba5883a6096b0f9c044533984b8a8", size = 86462, upload-time = "2026-08-27T10:03:31.348Z" }, - { url = "https://files.pythonhosted.org/packages/91/4c/cf6d12a3d709fe5f9771dd917c35e6ebcd55597a5b792287382fde056c95/msgpack-1.2.2-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53679573c75cce5f82359e0bd4e6a97809a6b9a9b7a48fd1ba592f4a82cddc84", size = 87412, upload-time = "2026-08-27T10:03:32.74Z" }, - { url = "https://files.pythonhosted.org/packages/ca/0d/0aac5752d1708dcb458f8754db34a4999514db3df2d2b798b9381293f638/msgpack-1.2.2-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3c247d457ae9079974c7ce3c665396754a6d2baff7eaa51332212a8a5a3f13b", size = 422057, upload-time = "2026-08-27T10:03:34.124Z" }, - { url = "https://files.pythonhosted.org/packages/81/30/70f281a3685b04aaf235a5237da11b978a02a865a5a479186205177ad676/msgpack-1.2.2-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:352ed831042549cca8be23780e1fe7c9177e65ff02bf183509c4b4d33f671782", size = 422696, upload-time = "2026-08-27T10:03:35.862Z" }, - { url = "https://files.pythonhosted.org/packages/8a/6d/f76e8425efb0aa38988cd778ae290bfa120491d80d26872d88bb52fedb3f/msgpack-1.2.2-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f80361592c13d7226b4379c8941529b63fe1a9d0e05d2de8f3306b70e522b53f", size = 376495, upload-time = "2026-08-27T10:03:37.339Z" }, - { url = "https://files.pythonhosted.org/packages/95/77/0809aa9b52b2868f7d01862dc14073708f0440421a65197b48453480034c/msgpack-1.2.2-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:68df2947921d449f6dcfeafd86cb2cdde13327a8b447534bbe4ee5aaf32a5695", size = 404683, upload-time = "2026-08-27T10:03:38.87Z" }, - { url = "https://files.pythonhosted.org/packages/02/d2/4e5ac915ba120172d210ef00165c5e6276c8a65db3a4a5cf36e946b83e23/msgpack-1.2.2-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:51dd39d23cfdea0400ed3ff2d29d1e83bd951d3aea79dc89be5b701a09edfe23", size = 375087, upload-time = "2026-08-27T10:03:40.486Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e3/8051d53e5495c87c6cf27eb42fb680361017037f87f322bdaf525f71e4a2/msgpack-1.2.2-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b13b59e66f107cca1ba708dd5307179870ca1b15b19fcee7ccf722e5308d9212", size = 414421, upload-time = "2026-08-27T10:03:42.308Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4e/13783aa7c17414d7186c72c49bc718366f75e49f0ea58d4f81cb63ac3187/msgpack-1.2.2-cp315-cp315t-win32.whl", hash = "sha256:8c6321a414f8b4a8dc43976b2fa8349156434ca9adedd9a187b796f7e1d3d3fc", size = 71790, upload-time = "2026-08-27T10:03:43.715Z" }, - { url = "https://files.pythonhosted.org/packages/5e/9d/1d02994c7ae2603c98100984428ff0f67443572133bc18eca6058f732c1b/msgpack-1.2.2-cp315-cp315t-win_amd64.whl", hash = "sha256:6f53285f20d592ed309ee19e509cc4c77a3bda1db02ad67e8a0949bb227a5a6d", size = 78766, upload-time = "2026-08-27T10:03:45.036Z" }, - { url = "https://files.pythonhosted.org/packages/60/54/89ed16e6f966a050dc78b0e94a545025211b07ce9f4bdfe07dff70c03fc2/msgpack-1.2.2-cp315-cp315t-win_arm64.whl", hash = "sha256:a378e12ccc06d76efde115caf4073b7e5ff3cc18291d1341f9e65fb882e3f754", size = 71819, upload-time = "2026-08-27T10:03:46.375Z" }, +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/16/f70100614b69feb3ade7285f08c9c52d6cda0a5c03f3f5e2facd63acb211/msgpack-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c7b398c56ff125feae96c2737abfec5595f1fa0aa186df60c56040b8accb95c", size = 82926, upload-time = "2026-06-18T16:12:31.531Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3c/08ecd5cdfe4e2de43aec79062028ad0f7b2d9b1fea5430068c198ba570da/msgpack-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1548006a91aa93c5da81f3bdcebc1a0d10cea2d25969754fbe848da622b2b895", size = 82730, upload-time = "2026-06-18T16:12:32.894Z" }, + { url = "https://files.pythonhosted.org/packages/19/9f/a70c9cb1a04ecc134005149367dcfe35d167284e8f65035a1e4156ad17b5/msgpack-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dabedcd0f23559f3596428c6589c1cd8c6eaed3a0d720795b07b0225d769203", size = 400729, upload-time = "2026-06-18T16:12:34.052Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7f/5ce020168cf0439041526e95aa068c722c016aee21624e331aeabeee2e8e/msgpack-1.2.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83efa1c898e0fc5380fc0cabbf75164c52e3b5cbb45973710d75821928380c73", size = 407625, upload-time = "2026-06-18T16:12:35.239Z" }, + { url = "https://files.pythonhosted.org/packages/79/70/fb7668ce0386819303047057aef6fc1da73b584291d9cff82b821744e2ef/msgpack-1.2.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01e2dd6c9b19d333a00282330cc8a73d38d8dabc306dc5b42cd668c3ac82e833", size = 377891, upload-time = "2026-06-18T16:12:36.684Z" }, + { url = "https://files.pythonhosted.org/packages/3d/dc/9ebe654a73c3aed2e40aa6b52e3c2a02b5f53ef0085fa235a45d5b367f87/msgpack-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:350cb813d0af6e65d2f7ef0d729f7ff5be5a8bce03665892f43e5883d4ecc1b8", size = 391987, upload-time = "2026-06-18T16:12:37.839Z" }, + { url = "https://files.pythonhosted.org/packages/42/eb/b67cf64218a2fa25e1c671fe1d3dbb06cbeb973e71bc4b822da079862d0b/msgpack-1.2.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ee1d9ed27d0497b848923746cf762ed2e7db24f4be7eec8e5cbe8c766aa707b7", size = 374603, upload-time = "2026-06-18T16:12:39.221Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2e/9ee200cde32fd1a0101b4006202fde554c1860adfb9bf7bff31ea4c08df8/msgpack-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:633727297ed063441fd1cda2288865487f33ad14eeb8831afb5f0c396a62cfce", size = 405121, upload-time = "2026-06-18T16:12:40.524Z" }, + { url = "https://files.pythonhosted.org/packages/43/b6/f10117be7ca7a51e8feed699a907b8e663a8cd66e115ae6b4fb30cc7945c/msgpack-1.2.1-cp310-cp310-win32.whl", hash = "sha256:298872ecf9e61950f1c6af4ca969b859ee91783bb920ef6e6172697d0c8aad74", size = 64088, upload-time = "2026-06-18T16:12:41.762Z" }, + { url = "https://files.pythonhosted.org/packages/ba/93/89976c696fb0224662239d952c47b4d1661b34d79a332ef5584facaa8579/msgpack-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2ff164c1b0bcb740b073b99e945234d0212852fa378e44a208c425379140dbeb", size = 70113, upload-time = "2026-06-18T16:12:42.78Z" }, + { url = "https://files.pythonhosted.org/packages/f4/6b/e9b1cdc042c4458801d2545ed782a95f3d6ba8e270cce8745b8603c7f748/msgpack-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29a3f6e9667868429d8240dfd063ea5ffdc1321c13d783aa23827a38de0dcb22", size = 82812, upload-time = "2026-06-18T16:12:45.022Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3a/dd518a1bf78ed1e9ad8afe57307c079a00eafe4b3068932a27ca1ea56b4f/msgpack-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aded5bdf32609dc7987a49bbbd15a8ef096193f96dd8bbeb791de729e650acf5", size = 82739, upload-time = "2026-06-18T16:12:46.025Z" }, + { url = "https://files.pythonhosted.org/packages/70/e0/7ba9e1542bf0771a27b8b37c1316e3f95ae9d748fd765284655c476ad4ef/msgpack-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:146ee4e9ce80b365c6d4c47073da9da7bcec473e58194ceee5dd7620ace77e06", size = 414233, upload-time = "2026-06-18T16:12:47.029Z" }, + { url = "https://files.pythonhosted.org/packages/03/8d/671d81534ea0e2b0e8a121be100020da09eb78861fe3aa8f3ef7dcd3bed1/msgpack-1.2.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a28d076ca7c82b9c8728ad90b7147489449557038bed50e4241eb832395169b4", size = 423843, upload-time = "2026-06-18T16:12:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b6/e5c737515ed1f166664b87601b532f58cbb73d8aa6a90b99f7c2c5037e8e/msgpack-1.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7d31c0ac0c640f877804c67cb2bc9f4e23dc2db97e96c2e67fa27d38283b41f8", size = 390772, upload-time = "2026-06-18T16:12:49.624Z" }, + { url = "https://files.pythonhosted.org/packages/a8/46/62ed8c2e87d7021eab19921594d961ef3aa3794eec76c716dc30f3bfd433/msgpack-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ff92d7feeaf5bc26c51495b69e2f99ed97ab79346fb6555f44be7dd2ac6503b", size = 409559, upload-time = "2026-06-18T16:12:50.936Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/59aa3887b860bbf43532835e192b1c388a17590d6068ae4f8b2bc74c906e/msgpack-1.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:779197a6513bab3c3632265e3d0f7cb3227e62510841a6f34f1eaa37efbb345e", size = 387838, upload-time = "2026-06-18T16:12:52.161Z" }, + { url = "https://files.pythonhosted.org/packages/09/11/f8563e471093420cf6478cb3271a0175d8402b82d879783d4035d2d03360/msgpack-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:67f6dd22fa72a93752643f07889796d62739a13415ee630169a8ce764f86cf9f", size = 421732, upload-time = "2026-06-18T16:12:53.556Z" }, + { url = "https://files.pythonhosted.org/packages/57/cf/e673683c4c6c90c1022b24c65af4b03eda72b182a1176ef6449069d66acc/msgpack-1.2.1-cp311-cp311-win32.whl", hash = "sha256:91054a783328e0ea7954b8771095705c8d2243b814743fbaadf14552c9c52c5d", size = 64091, upload-time = "2026-06-18T16:12:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/ca212739d179f9083bff2c7c08c24101c3555a334fadc2b876b18768a3ae/msgpack-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2eda0b7ebb1283a98d3e4492ac933c8af6aff59fd3df1c3ed024f536af4b1dc8", size = 70462, upload-time = "2026-06-18T16:12:55.898Z" }, + { url = "https://files.pythonhosted.org/packages/6d/be/6798347b425e26f35db82e69dd83c09716c856a3714e7bffc4c0860fd830/msgpack-1.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ee967f7c7e1df2890c671ff2ee51a28ded0efc95da3e507176dee881ce36c66", size = 65059, upload-time = "2026-06-18T16:12:57.053Z" }, + { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, + { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504, upload-time = "2026-06-18T16:13:08.822Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421, upload-time = "2026-06-18T16:13:09.828Z" }, + { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775, upload-time = "2026-06-18T16:13:11.056Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151, upload-time = "2026-06-18T16:13:12.173Z" }, + { url = "https://files.pythonhosted.org/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351, upload-time = "2026-06-18T16:13:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518, upload-time = "2026-06-18T16:13:14.233Z" }, + { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405, upload-time = "2026-06-18T16:13:15.435Z" }, + { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257, upload-time = "2026-06-18T16:13:17.022Z" }, + { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469, upload-time = "2026-06-18T16:13:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802, upload-time = "2026-06-18T16:13:19.685Z" }, + { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273, upload-time = "2026-06-18T16:13:21.028Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471, upload-time = "2026-06-18T16:13:22.293Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274, upload-time = "2026-06-18T16:13:23.455Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795, upload-time = "2026-06-18T16:13:24.687Z" }, + { url = "https://files.pythonhosted.org/packages/77/58/cce442852c6b9e1639c7c8ac8fd9143121cb32dab0f308df4d1426a8eb9c/msgpack-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:05f340e47e7e47d2da8db9b53e1bb1d294369e9ef45a747441309f6650b8351d", size = 83610, upload-time = "2026-06-18T16:13:25.724Z" }, + { url = "https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:810b916696c86ef0deb3b74588480224df4c1b071136c34183e4a2a4284d7ac7", size = 83138, upload-time = "2026-06-18T16:13:26.781Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/99e58722feaffc5f2fbcc0c8c0d1451ab9f84097f7af87291b46af2390f4/msgpack-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca0dacff965c47afdc3749a8469d7302a8f801d6a28758d55120d75e66ce6889", size = 406090, upload-time = "2026-06-18T16:13:28.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/03/8c63e8cf52958534ef688625965ab04c269a6cadd8caef16758b380a821a/msgpack-1.2.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e2bf9280bceb5efca998435904b5d3e9fdbcc11d90dc9df30aec7973252b720", size = 412106, upload-time = "2026-06-18T16:13:29.427Z" }, + { url = "https://files.pythonhosted.org/packages/63/d2/155d9e71b40e41fd934bc0c48b9b2770f22263e1ac20aad8e29fdca7be3f/msgpack-1.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6c4be5d1c02a42b066ca6ddb71adf36432868fdcdb6ee87e634e86e0674190", size = 374851, upload-time = "2026-06-18T16:13:30.631Z" }, + { url = "https://files.pythonhosted.org/packages/98/48/deaf2326262a8d5ea3295ce9649912ecd3f551ba7ec8e33c665d2ba583f3/msgpack-1.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec0e675d59150a6269ddc9139087c722292664a37d071a849c05c473350f1f2d", size = 396168, upload-time = "2026-06-18T16:13:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/2a/b4410f906c2ec0008f1608d3ab5143afc3ad3f4e6da0fed3ea2231d0bef4/msgpack-1.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dd3bfe82d53edfe4b7fc9a7ec9761e23a7a5b1dac22264505af428253c29ed24", size = 371959, upload-time = "2026-06-18T16:13:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/59/86/1edc67270099a528fa2093ea60fe191233cd238e4bd30cfacf7db79fc959/msgpack-1.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ad5467fc3f68b5468e06c5f788d712e9f8ffc8b0cd1bcb160c105c1ee92dae7", size = 408457, upload-time = "2026-06-18T16:13:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/82/90/8b630fef07d8c5ab457b71ff2c217910c83d333c7a68472c186e87cc504a/msgpack-1.2.1-cp314-cp314-win32.whl", hash = "sha256:98b58bdb89c46190e4609bb36abe17c6d4105ad13f9c5f8f6f64d320f8ced3fb", size = 65942, upload-time = "2026-06-18T16:13:36.056Z" }, + { url = "https://files.pythonhosted.org/packages/16/f1/467b81e98b24dd3885d7b1857728797b4ffc76a7a7483af4fb321a07de3c/msgpack-1.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:74847557e28ce71bd3c438a447ca90e4b507e997ddbdef8a12a7b283b86c156b", size = 72627, upload-time = "2026-06-18T16:13:37.079Z" }, + { url = "https://files.pythonhosted.org/packages/a7/1d/5d8c4c89985feb6acefb82a09e501c60392261856d2408d20bfe4f0360b1/msgpack-1.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:b50b727bd652bdc37d950336c848ef20ec54a4cafc38dce19b1cd86ad625d0f7", size = 66908, upload-time = "2026-06-18T16:13:38.23Z" }, + { url = "https://files.pythonhosted.org/packages/1b/02/ad2afb678b4de94496cd432b581759b756a92c1192d8c767edd6b132efdc/msgpack-1.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8d00f177ca88a77c1cf848d204a38f249751650b601cb6532acc68805d8a8273", size = 86000, upload-time = "2026-06-18T16:13:39.44Z" }, + { url = "https://files.pythonhosted.org/packages/54/74/0b797484013128837f3b1cbb6cea019277c4de4e377dc512b4d9a0f92940/msgpack-1.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5bb9c386f0a329c035ddbab4b72d1028bf9627add8dda41070288563d57ed1b1", size = 86544, upload-time = "2026-06-18T16:13:40.447Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b4/b774d7eb95561739907fec675582f83203cf41c597a418c2589b4bfb8e9d/msgpack-1.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20466cca18c49c7292a8984bc15d65857b171e7264bdcb5f96baf8be238791fc", size = 427661, upload-time = "2026-06-18T16:13:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f9/3243191dc9937e00756c8bc1b0272fed8f23758e43df2a3b46f533e5090f/msgpack-1.2.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:196300e7e5d6e74d50f1607ab9c06c4a1484c383cd22defd727902591f7e8dde", size = 426375, upload-time = "2026-06-18T16:13:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/23/c7/1693111db9944ba4ad4b67a1e788400d78a0b6af7a6523dc7e4e58f8274b/msgpack-1.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575957e79cd51903a4e8495a242442949641e08f1efd5197b43bebd3ea7682b4", size = 380495, upload-time = "2026-06-18T16:13:44.306Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2b/92f86956a0c13e8662f7e2ad630c4eb4db07497b967589bd5245e018b2c1/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8c2ed1e48cc0f460bf3c7780e7137ff21a4e18433451916f2442c1b21036cd7d", size = 410897, upload-time = "2026-06-18T16:13:45.629Z" }, + { url = "https://files.pythonhosted.org/packages/da/ea/1479f72d200313a76fc2f823a79d1e07ed052ab7b8a0280640aa7b95de42/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f6277e5f783c36786a145e0247fc189a03f35f84b251646e53592d2bc12b355", size = 378519, upload-time = "2026-06-18T16:13:46.998Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/fa006060ffa1011d32bfae826fe766fe73e02982183601633b7121058ab3/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9389552ecf4784886345ead0647e4edc96bee37cbab05b75540f542f766c48c", size = 419815, upload-time = "2026-06-18T16:13:48.205Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/aab6c946570496b78e67804721f3d5e2d62a93081b9b37df77764ef56347/msgpack-1.2.1-cp314-cp314t-win32.whl", hash = "sha256:c1c79a604a2969a868a78b6ebd27a887e00c624f14f66b3038e0590cb23332d1", size = 70914, upload-time = "2026-06-18T16:13:49.385Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/e608956488a2af014cfe6e3d665e090b8ee42aa14b07f8f95b8880d66b09/msgpack-1.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f12038a35fabd52e56a3547bab42401af49a45caa6dd00b34c44de235bc93ee2", size = 77999, upload-time = "2026-06-18T16:13:50.467Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8a/27e2e57055176e366a46b85d02d68e7a5bcfbdd8474c9706375d965f24d3/msgpack-1.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0adcf06ffde0777c0e1a9b771a2b1c4226ba1bbf748c8efcc02fcdeca3299107", size = 71160, upload-time = "2026-06-18T16:13:51.498Z" }, ] [[package]] name = "multidict" -version = "6.8.0" +version = "6.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/14/95/989c1b5ca17b72128661530cd6e351a0a83cda9a4d6c036e9ed976c18931/multidict-6.8.0.tar.gz", hash = "sha256:5cd4637ce76312ba1e05eb9c5193fec231f64fee0944e135fa1e951242355b37", size = 122412, upload-time = "2026-09-09T13:57:57.967Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/ec/714516a7e0f0e05bd5f67402bdeac775e0a50b883eafca3cf21adcacc228/multidict-6.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c0fe437a6d2f36aac2b49517057776575b5bf359df314cca20d230a6e139c089", size = 85595, upload-time = "2026-09-09T13:52:49.534Z" }, - { url = "https://files.pythonhosted.org/packages/c5/af/13c6c983bb2a59a567fda78ecc42bc3328889179480cc14389213f6837a8/multidict-6.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f3a0a31189acf6703307397c6139ddabd734c20c5ef92649fc93e473df6615a3", size = 51300, upload-time = "2026-09-09T13:52:51.225Z" }, - { url = "https://files.pythonhosted.org/packages/6d/59/38746cd2837b3656247d841c28bcac821be312319c89ea126ec335077ff4/multidict-6.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c9c98d2f0126ba84cb45601eed97ff67ff767e19ae6eb3c31b02827b54d700e5", size = 50492, upload-time = "2026-09-09T13:52:52.527Z" }, - { url = "https://files.pythonhosted.org/packages/aa/fe/9b1b44d060692fbeef47e7f9d72f9cb9e9c2c2fb8381fe543419449f5b7f/multidict-6.8.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bc7003991ebd368a20d05228137a37b3d3066751f3ea1e4f7b8efe8e752f2f5", size = 259705, upload-time = "2026-09-09T13:52:54.082Z" }, - { url = "https://files.pythonhosted.org/packages/01/6a/dfb3e47ab0efcab2ddae494c86d9ac1fd47c86b3ebf687b1d6bf72221178/multidict-6.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2c5fd0fd39574ccd58e1a52565b341aff522c5c836f1b3eb7605c371e61f52c", size = 258089, upload-time = "2026-09-09T13:52:55.647Z" }, - { url = "https://files.pythonhosted.org/packages/91/33/abc20faf78cd7060d4f904f0e669cc521537b1a2a0f6f8ad84cf5006447f/multidict-6.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1cd4d66ce894a45482e1ac2837c31d0bd447df35065e542b60055aa2d00404b", size = 235981, upload-time = "2026-09-09T13:52:57.291Z" }, - { url = "https://files.pythonhosted.org/packages/bc/79/fba4622994740f487c927d7331876b1cb7253515bda66d8fb7bc0a382879/multidict-6.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7a2573d0fd34f361a4a14e54d8cda3a91ac4e55fbf0d719698024f3b09c5b147", size = 269134, upload-time = "2026-09-09T13:52:58.726Z" }, - { url = "https://files.pythonhosted.org/packages/de/6b/518eb2f391c9e579afb08d67fa280c4037d3b61fe57bc1071e6b84306cd4/multidict-6.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edda19aff836ec515caafc09ea53d2ab144a041f09ee9a7cefcbd3ae4e976256", size = 271441, upload-time = "2026-09-09T13:53:00.108Z" }, - { url = "https://files.pythonhosted.org/packages/53/d2/6db1ce7dc516d4b9afbe679b0e7190b26a517b25ccd11122c8c27ed098a3/multidict-6.8.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e418ec99574ca24365ca96546af285c2b021a1a072478a79f0e3cc3b08837154", size = 259314, upload-time = "2026-09-09T13:53:01.574Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b7/548ec8cb0e3be3c03519420de5bc3094418254d8efa599da7e39a567c585/multidict-6.8.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11d71490bf4bbff1141b14b93af419ad68c56b60bea9277fcb3f94dcca4796eb", size = 243703, upload-time = "2026-09-09T13:53:03.067Z" }, - { url = "https://files.pythonhosted.org/packages/f2/20/2af67fcc8aa6ee8727ae9a29fbebc81bcce5f9d78f8a6c365638824ffb09/multidict-6.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e8e1e895e23818d343e4ae7dd95a0a556fdeaf8b471acf1c0a39b93c6f54d478", size = 254376, upload-time = "2026-09-09T13:53:04.514Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2b/b41aa60b0a1021304e95444aa40e3ff7a2a31028a21dd1d93c628de5b87c/multidict-6.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:15db8e6cab5f4cc9241bc56e69fdf3452cf49c10ee3c7977c742e68a275b3786", size = 249211, upload-time = "2026-09-09T13:53:06.056Z" }, - { url = "https://files.pythonhosted.org/packages/5d/e6/ad76aa06f5aace4ab82e70367525ef9b0606333963d9e436273c574c10ad/multidict-6.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8dc2d9c3a924ed14166e63650b2cf9f59e7821743bdd50b23802bd97ca09bde5", size = 260855, upload-time = "2026-09-09T13:53:07.528Z" }, - { url = "https://files.pythonhosted.org/packages/19/45/248ebbd3276a6c066e631f7a49c7c2c0e0774600a752144e64f0ae9af82c/multidict-6.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f2fa3d3b1c933d4bcb8fd2018700d5e7235c52f2ab8c88d22286965c5c0f00f8", size = 266149, upload-time = "2026-09-09T13:53:09.097Z" }, - { url = "https://files.pythonhosted.org/packages/76/72/3d87c20cd944a1eb9bcb21928d3e39e758aea8b0e4df3defc82d081f6c7f/multidict-6.8.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d6dc7804c50fabd28644d4d18a4b20aad3681b3e64f3acd3182b330ca73f7a32", size = 239270, upload-time = "2026-09-09T13:53:10.502Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ff/8a69b1ecbe25cfdbf5200167357dc01ecf3abb974cb473fbaac5d3724e79/multidict-6.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0eca15d627e942ce186a935061f1568cc46c02e97c419c8da802df2be9f917d8", size = 262229, upload-time = "2026-09-09T13:53:11.944Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e2/a40b690a319c3a17e1ef3cad127a7993d69cec06c892c9000cf67329cf75/multidict-6.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d7e5ba0a0153e35fbce9c51df530c8b4cb0c3012b46a04ff9a048441a269c2ed", size = 255270, upload-time = "2026-09-09T13:53:13.412Z" }, - { url = "https://files.pythonhosted.org/packages/99/bd/0e72f5981012a66ebf8b97153de8ff299b947af12d62beb832626f7a9b0d/multidict-6.8.0-cp310-cp310-win32.whl", hash = "sha256:b7e62b8fc7bd6cad007b9f2e0ad9c8d4854c06350d5f51e1a439dd18b510ecac", size = 46896, upload-time = "2026-09-09T13:53:14.799Z" }, - { url = "https://files.pythonhosted.org/packages/0d/43/7f93a35715d1ce1d96a7aedb7bffa870206390c0e2ba7cffd9b8533739a1/multidict-6.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:dc911ae6152e455b16a2a1a626aa6cd612fa01efb9d0a4ab3f5cf328b911483d", size = 51492, upload-time = "2026-09-09T13:53:16.067Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d7/518dbe7eb714f413a093ef32c99010411e228ff57fe3e1bfb2df80abccf2/multidict-6.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:6300d5176647145ba1e22991c924fb29743e54b4d7b8bc85a0d3ec0e55e189cb", size = 48049, upload-time = "2026-09-09T13:53:17.3Z" }, - { url = "https://files.pythonhosted.org/packages/d4/37/90216392620b6ef8704eb0bc055141745de396121067e98f1f72bdac33c3/multidict-6.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b8986d4313dcee7c932837d16a535f1840b827bac1ea7c5c4c80751d0423794", size = 85033, upload-time = "2026-09-09T13:53:18.786Z" }, - { url = "https://files.pythonhosted.org/packages/2b/bb/e01b8cf906479b2fa046e992b84a9d9f39c1ed4058acc353004cd9a04df9/multidict-6.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2622fe114c0bd66ca5c461859357587f5a5e35ee5ff49fc5643d1bc78dbb41c6", size = 51008, upload-time = "2026-09-09T13:53:20.044Z" }, - { url = "https://files.pythonhosted.org/packages/c5/da/35d70c920812d9ddc6f295f6426457665194335fbc35aa0b96716aba219f/multidict-6.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26a7aafc992e78872e2c8c1f7248c0e01139cf9020a7781b0c064fa566832712", size = 50232, upload-time = "2026-09-09T13:53:21.356Z" }, - { url = "https://files.pythonhosted.org/packages/91/6b/4c988a7c0daa4fbffc6080ed3c37b3a67cf225ba1de69d10a19ca1dd8d0d/multidict-6.8.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:05c2e90c5289c5f7436ba2c25812a5fbdaa1c1bc11c8d8d3bbf64f5cd7c633dd", size = 271678, upload-time = "2026-09-09T13:53:22.716Z" }, - { url = "https://files.pythonhosted.org/packages/73/2b/22c7de8a72fc5c36390e8049d86d842b032ac7c87ade035a3dafb7df4ffc/multidict-6.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7941ef106ca1f2c62314a13c7ed913bcf49641f3efdc12864d588e17870920ac", size = 270283, upload-time = "2026-09-09T13:53:24.235Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f4/c1428318f945c57c016ba690338af41f87f18a7d3a7ef3227b1440a2c169/multidict-6.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a5a7ee1217949ddd43c6b7bcf70d5c22193bb50e8c695386de5905325e93ce9f", size = 245306, upload-time = "2026-09-09T13:53:25.656Z" }, - { url = "https://files.pythonhosted.org/packages/8b/92/a37f7519fb32b0bf43b0540292effe60edaf0691959214b227795bd3d56a/multidict-6.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b62b7e0025aa48dec11e125e655d1157985a5fdcec04b1ad500101ad072b891", size = 279567, upload-time = "2026-09-09T13:53:27.162Z" }, - { url = "https://files.pythonhosted.org/packages/51/fe/a93c2ce417401863cc88ecf6561577625c140990d412e37f347a1c03a144/multidict-6.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea880d441be7c510106bc56064be39266d948aef94ad4955e8784690019a5d9f", size = 282526, upload-time = "2026-09-09T13:53:28.927Z" }, - { url = "https://files.pythonhosted.org/packages/f2/9d/6bb4f84fdd82acfa09dc312ac133e7f76cbf2370004447f2a90e65e5d63f/multidict-6.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab83fdd8cf307353edba9c427c17a3a021c2522d690f5633dd9f72d28b48ccca", size = 272604, upload-time = "2026-09-09T13:53:30.595Z" }, - { url = "https://files.pythonhosted.org/packages/3a/97/df0a30a4d786d313f24b39cb96edaaa3bbfe83a0b309577c81a797783ec5/multidict-6.8.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3d1f48582686a0a3b81e9b43234766cc96697df72081af3f48107bd3f34d34e5", size = 250786, upload-time = "2026-09-09T13:53:32.15Z" }, - { url = "https://files.pythonhosted.org/packages/6f/72/e59a917680d00214ba41f9fec19a8bec48f3bdf62656bc4377f37ae30947/multidict-6.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:563661919f603374c40cf45ffcd25535c12b8954203569a2ab1cee5265871cf4", size = 265419, upload-time = "2026-09-09T13:53:33.943Z" }, - { url = "https://files.pythonhosted.org/packages/47/21/0eb8868982ff07c1a2faaef7502ee0be32ef247dc1bf27881c51e7f4b20d/multidict-6.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2ba9933e8f35fe4a70f540b837254c4055da82dc3a9e500a8f95e61498083a15", size = 258934, upload-time = "2026-09-09T13:53:35.662Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a6/0586396716faf950c10ffbe733e4a57b4eeda9f7073e60c09bd4a05a766e/multidict-6.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:68d40b2bace413f3231f5729d3fcfb1837fd31c4907e241b5d43211bfd76f3c2", size = 273168, upload-time = "2026-09-09T13:53:37.131Z" }, - { url = "https://files.pythonhosted.org/packages/31/79/7197af20190d0d832be3b18582be46c224f64f5ba1cd35d32068d6af31ed/multidict-6.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9e246f67ac038568b854ed7c5578e4c6af1f742359901a8fcc3603ff1358df6", size = 275884, upload-time = "2026-09-09T13:53:38.579Z" }, - { url = "https://files.pythonhosted.org/packages/f7/f7/af60573e25ffecc09e805464580d579338cf1a44332ab52757038435ed60/multidict-6.8.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:29b6e7bc4442a56cf8e0dc1cabf3fdc77cd533568d6829fc76a1effd2ce332ec", size = 246967, upload-time = "2026-09-09T13:53:40.172Z" }, - { url = "https://files.pythonhosted.org/packages/6b/02/4459f8c5025ab034d3d9af9a34bbde11319016cff2f327362c8ec43a80a1/multidict-6.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:82780eb8bf59e8fb25dd081fde6e058805045d6374a7f2f877effc826ca4434b", size = 272358, upload-time = "2026-09-09T13:53:41.868Z" }, - { url = "https://files.pythonhosted.org/packages/51/99/680d3522ab51a77094d31d7958c9f5989499a01ffbe5aebe11d25212b385/multidict-6.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2196ba6df392c3574acadd14ef87550f3611349c8618564de324b806a7a31cee", size = 267450, upload-time = "2026-09-09T13:53:43.646Z" }, - { url = "https://files.pythonhosted.org/packages/4a/04/d0c773805b0aea171287b01a82e4c28c59ef2c2d93e8047394765181363f/multidict-6.8.0-cp311-cp311-win32.whl", hash = "sha256:b8b7aa75146266fd3e2a2437cf69ae188688c04ab8665b163d4257b46c1e0c83", size = 46847, upload-time = "2026-09-09T13:53:45.161Z" }, - { url = "https://files.pythonhosted.org/packages/71/f8/1a959771a4dcd3224bd7bb40054f66b98ba5b20d6b74fd273f548f887e0a/multidict-6.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:b03ca066b47b18b205cc080dca6f76cbd159f8cdd33a02a0700164c13b37e463", size = 51549, upload-time = "2026-09-09T13:53:46.448Z" }, - { url = "https://files.pythonhosted.org/packages/64/7c/3a74b11599a9d8f3cfbb78b9c5cac3ff3cdc17278e4c00329c7c18dcaff9/multidict-6.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:54af1266710cb0f305127ae0b970aff8d208057f8a29cd6e1db99b0114947035", size = 48020, upload-time = "2026-09-09T13:53:47.767Z" }, - { url = "https://files.pythonhosted.org/packages/13/83/a4621577679149ea001806f5963f3fc687c391c1bd5217157be2278863f5/multidict-6.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:22a310ad37672a261e55a8b5e28d0ae08cfb68abb1f46418ccd19835c3b8e836", size = 84146, upload-time = "2026-09-09T13:53:49.163Z" }, - { url = "https://files.pythonhosted.org/packages/09/00/236b063f3e606055a3a9ba8faa5d40e6c688b059a58056b055f213476f46/multidict-6.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bb8c7da8c861391f7ae48e3593762be2dabe405109e01aec520fbe1a6d15d14b", size = 51049, upload-time = "2026-09-09T13:53:50.46Z" }, - { url = "https://files.pythonhosted.org/packages/91/9d/954b139bfa969855f2d4cb5ae7b7d44dd7106f754305b6e21a9068213aa7/multidict-6.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10456943903744ae1249728161c96bd9d2f7eb5ee17fcc2ffda2dc32e1bb36c7", size = 49362, upload-time = "2026-09-09T13:53:51.878Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8a/8774f5b3f6d5266ecd1117876e04b405f0f1ce19aa750b35a826efe6cfe4/multidict-6.8.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:658f5a1895b804423d97b22d06fc0d0b171c7c01dcc3aa9c8faf0c0e26a249a5", size = 278619, upload-time = "2026-09-09T13:53:53.44Z" }, - { url = "https://files.pythonhosted.org/packages/db/47/736080fec911ed9f2dd57ccab5a8145e4f17c4987de0bfc27bee20e4d170/multidict-6.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90c10b22860dbd09982d0b8993b66231a861bea2993d4a817ff35273f6ea285a", size = 283771, upload-time = "2026-09-09T13:53:55.048Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d5/b7f41f59b0583f092602308a5e7c16ec5efd00d60214b22511e89a38dd19/multidict-6.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:088b04a66b3c1fce6fe4d771ec184a0426262d0b86709c908477b4ac7965df40", size = 262108, upload-time = "2026-09-09T13:53:56.631Z" }, - { url = "https://files.pythonhosted.org/packages/54/b2/a52dc06c6e2598672308e3d392fd85b837b23c25dda459bedaea84985080/multidict-6.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9caef53b20a105c0d66518a34be2f71b2783de8d091767575ef86f6ea422236d", size = 289899, upload-time = "2026-09-09T13:53:58.415Z" }, - { url = "https://files.pythonhosted.org/packages/a9/21/00cda7983f37d119b86f1f89d5b4cf771ecb6d0fedeb9a0971758d6d6d4a/multidict-6.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a5e1583c14775580da05641240ce0d93f36ce3ddef3d5083a827468b0bcfe874", size = 293025, upload-time = "2026-09-09T13:53:59.973Z" }, - { url = "https://files.pythonhosted.org/packages/c6/c7/4544cc02e45bbfac4d8788b05379bb360021fd8c53fa74b0f624126ac188/multidict-6.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:003a3bddb32915c3f67096ea41d24e53edf710edb65a1f5d0c70ab40b0e4d20b", size = 287410, upload-time = "2026-09-09T13:54:01.652Z" }, - { url = "https://files.pythonhosted.org/packages/43/1a/7abed90b8eba381842235bfa6f4d730204fd7deb374fc87e3ec9b2c2b4ac/multidict-6.8.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:35977263d9bf506dbc65349f63b3b8c91606d4abc110990945e3b94bc671319c", size = 255878, upload-time = "2026-09-09T13:54:03.366Z" }, - { url = "https://files.pythonhosted.org/packages/25/3e/73fae10e15fc4d711975337caff7e494c87de5d0189afe3518b21b945326/multidict-6.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9dc7b4ff6ef184504b49ef9a4113d49a646653b2ce89f5f48c1f57cdf6ba081", size = 277831, upload-time = "2026-09-09T13:54:04.963Z" }, - { url = "https://files.pythonhosted.org/packages/c5/cf/01cfc81492933331147004861bdff201d8adeba8485ecd8f490e755fe7e8/multidict-6.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:887f9a975996032c686719eb7b3e1e7942fab5079c2b778bbd9afe9a9d78244f", size = 275096, upload-time = "2026-09-09T13:54:06.661Z" }, - { url = "https://files.pythonhosted.org/packages/de/59/e9a3773b17297fa1e38fd4b3c6f5f2f458380796be62eca7d0d77c250618/multidict-6.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f3071e6515cc63714d014da8f738ae9fa3997c476203f3cd46de380c2376ed7b", size = 279803, upload-time = "2026-09-09T13:54:08.389Z" }, - { url = "https://files.pythonhosted.org/packages/64/9d/2d712a2605b3971908e3b4f5eb6f98c353d9991e106f684d0e08ae581814/multidict-6.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5f3a2af441670d80ce5fdf13b6c1b421fc1fc7fc5182d58ac7486738bb2b742", size = 284595, upload-time = "2026-09-09T13:54:10.17Z" }, - { url = "https://files.pythonhosted.org/packages/58/6c/21aded8586e552b29892268c576e5745d1a894c5451c9866ca3c06b7ec50/multidict-6.8.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:31e8901637e20ccb3cf8f8848b5d0f7a00462bf5b34f7cf3dcbb2753b18e8b39", size = 252641, upload-time = "2026-09-09T13:54:11.811Z" }, - { url = "https://files.pythonhosted.org/packages/2a/70/56a415ae0a45e5eae2ec817d46aeb72a1ae777863621c85f1f39d329275b/multidict-6.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:13967dca8b2f33230a1427b52438326bb1c9101a1df22a3309ed3fcbbb3c96f0", size = 283369, upload-time = "2026-09-09T13:54:13.59Z" }, - { url = "https://files.pythonhosted.org/packages/08/7e/7b7cd611fd94bf2f6bd16244c50495867ba394d5baaf8e6e487d39494ab3/multidict-6.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad474c11d851b6fc97cb625e4822bc0cbd567fc07dc2602e28faec5a36b42bbb", size = 281653, upload-time = "2026-09-09T13:54:15.174Z" }, - { url = "https://files.pythonhosted.org/packages/33/4a/b19a5892ef2ef6c68ae278b4f1504b82e01037baedd92c55d37e55ecad00/multidict-6.8.0-cp312-cp312-win32.whl", hash = "sha256:7bb0dad75068fee80fcb60f88569722c199d8656a16706702dc6e3b786819c90", size = 47936, upload-time = "2026-09-09T13:54:16.638Z" }, - { url = "https://files.pythonhosted.org/packages/29/00/1952f9f282aa71e7c3db3a6b47afb689d0ddf283dbded7e6326a91d421c9/multidict-6.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:7d26dc8f070c0ec5579e987fa615ffd6883086106eefdff9e10d160fc5630630", size = 51723, upload-time = "2026-09-09T13:54:18.05Z" }, - { url = "https://files.pythonhosted.org/packages/49/b5/c9d57dbafe25b8f3460ce2961c968539a81ff7a70160c44dcfd4255cbcd1/multidict-6.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:e6ec7d37841609a691b96a10b4fde386c7cd93ebbb939f59c9f23325ee788395", size = 48492, upload-time = "2026-09-09T13:54:19.42Z" }, - { url = "https://files.pythonhosted.org/packages/84/1f/d7112c2dd7db02677097be72fb65542f51a5aa73cb472b87ec211ba9e0dd/multidict-6.8.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:ec0a4d066356054d569a66e0a94691a2058b680be5e710298f61db11a3c4609f", size = 54197, upload-time = "2026-09-09T13:54:20.814Z" }, - { url = "https://files.pythonhosted.org/packages/ae/24/876015abbcb4a179d946579eb77b778eb5a948fc8381bc7928ba895bc051/multidict-6.8.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:714597cb5d5e15a8a449d2ae23c45b486a9e8fa33c462c7a33d7f35b65d92943", size = 47787, upload-time = "2026-09-09T13:54:22.51Z" }, - { url = "https://files.pythonhosted.org/packages/06/c1/ceb7d25f8a567599db2eb19b08cac58d67ff553cff42dcadbea9aba56a20/multidict-6.8.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e0db3a4d1e264e225037a6023888972c25206a96e016021a5bea41c9a939f2a9", size = 48815, upload-time = "2026-09-09T13:54:23.986Z" }, - { url = "https://files.pythonhosted.org/packages/18/e3/e1c6e9c3818c34b782f23ce5fdba3eaa34ec6750dc53078dfac80fa59be7/multidict-6.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:27747162712e85c84598d364425dbf1714ff335bdb6ba3171c4e5081196e8916", size = 83484, upload-time = "2026-09-09T13:54:25.674Z" }, - { url = "https://files.pythonhosted.org/packages/4a/a0/c23f78a4badee9a5b3e760495c661c62a92c340a1dfd00f829cd16e256bb/multidict-6.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:847d6082ae694dc95e548acb201bc100e1cfa96513bc71fdcb86f709dad6c435", size = 50763, upload-time = "2026-09-09T13:54:27.135Z" }, - { url = "https://files.pythonhosted.org/packages/c4/fe/db552d402a3f6b650f5d3ae11b82b93833836aebb51bcda22d8691121129/multidict-6.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:88a6df88567680504ae28bfa7a1f2f64243d91e79a40b2c92ef42efc531e23da", size = 49029, upload-time = "2026-09-09T13:54:28.483Z" }, - { url = "https://files.pythonhosted.org/packages/01/b4/546853fba19dcef77cdf91fc173faf0b02284a49106cf250511166b4ec5c/multidict-6.8.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:560b211fc3bd4a1e1c6de44f6d38113bf5b410dfc89a4c0d2a3c0edbf1a0dfb8", size = 278863, upload-time = "2026-09-09T13:54:30.145Z" }, - { url = "https://files.pythonhosted.org/packages/ee/3f/4b52dac7db547936eb762123ac1d99df23f92fdb358bae600e322f611247/multidict-6.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202436df907c15adbb94360296c425ea53cf8968a5d2cff9b5b9790ae1972b33", size = 283915, upload-time = "2026-09-09T13:54:31.937Z" }, - { url = "https://files.pythonhosted.org/packages/fd/6e/c0dfbf170e49a91bcb9ce850d51cb98357f3033c5227529200ca7625853e/multidict-6.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c46a08bf070d6849fed483e9d9833f9d06aecb8382ed985be0b38508b3ae958e", size = 260704, upload-time = "2026-09-09T13:54:33.529Z" }, - { url = "https://files.pythonhosted.org/packages/91/02/56973a060ab8dfc2e80bb6797682f6577aff7123cdb1de1a568670ae3499/multidict-6.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2cd560498ae8e1bcc955643c1d78eb8e338226d07a983c656ea8c4443d3eec0f", size = 290243, upload-time = "2026-09-09T13:54:35.408Z" }, - { url = "https://files.pythonhosted.org/packages/d5/67/69112989f131bdea4a87b74e82cb0a2daf37880cd92b0e6f0420020adceb/multidict-6.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:758233648ac47b07c575224c4eadd73c8929c3b4c31e2afcfea935fde1cda735", size = 291131, upload-time = "2026-09-09T13:54:37.205Z" }, - { url = "https://files.pythonhosted.org/packages/c2/75/9435f68b0cfc442d4917de85c26f2b2e1292630883414a25576083fa2469/multidict-6.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:122adc7c46ac1e31ecfc7f81b2530533dccafdba70f5d741649f87e336c63384", size = 287551, upload-time = "2026-09-09T13:54:38.835Z" }, - { url = "https://files.pythonhosted.org/packages/13/08/2ee4838081d6587849611aa7ec722c4cb2469e912fd0eaee980e7bac064c/multidict-6.8.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8125e60f3c70e323ac07dd8b3635f7b3bbc5c3a9ac04ae5988f668ff7ae28a18", size = 254591, upload-time = "2026-09-09T13:54:40.806Z" }, - { url = "https://files.pythonhosted.org/packages/94/f1/05673b51191f77f4198b8e4b35f16ea71c0300c72ca8aa027a66a61b6edc/multidict-6.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:83ff054b04915be5c15680da6c6012474a2cc2bf534129a0e8c6a99f17ba7238", size = 278204, upload-time = "2026-09-09T13:54:42.672Z" }, - { url = "https://files.pythonhosted.org/packages/45/4f/b6cf74322b3fbd3e011a1e903730191922291a7779f6d404114c2189b806/multidict-6.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:930c6058047410e3edff445f5a6e4457f2e089042dede00e2d18ce06f3ceae2e", size = 275600, upload-time = "2026-09-09T13:54:44.348Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ab/958bbb04377159ff03c7314cd9d8a48dd6fc4f78c840589c22ab155ee9c7/multidict-6.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:13e26f59f0eecfc5f67c663ad550ffdaf62c0f657547cde387f6c86af1c9449e", size = 279793, upload-time = "2026-09-09T13:54:46.086Z" }, - { url = "https://files.pythonhosted.org/packages/a0/3a/706605ab0dfc4179748ee7949829e63c6f14ae28667aceeefaf2c701807f/multidict-6.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd789a294d8e098528be29b2669b83005ce569339f8cef167fc0274c3115c34c", size = 284751, upload-time = "2026-09-09T13:54:47.793Z" }, - { url = "https://files.pythonhosted.org/packages/b3/a5/567e36c013ad023546de633079c6b22101dd43226b193cba00e6399703be/multidict-6.8.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:3126f2a96704505aa4e92a72d6e8a5d7f29d40a987ced8bf69e29d71dfc71fbc", size = 250812, upload-time = "2026-09-09T13:54:49.509Z" }, - { url = "https://files.pythonhosted.org/packages/0d/5f/6b0b64aa0cd346b07831dabaa6ccda0e73014c5df044b68baa763f0f0552/multidict-6.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:23c9ee89967b6a9b4048acb3b93b660ed714ce9c8bf3bbe652959bc120dc02dc", size = 281606, upload-time = "2026-09-09T13:54:51.288Z" }, - { url = "https://files.pythonhosted.org/packages/31/8c/b846b6796f26d496efb07fedef2b69f6de533da32a56f12d236722a96157/multidict-6.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a62e302fc8cd6aa8972207e7e951d1fdee7c1dda18568305041d19f0e2c00f5", size = 281733, upload-time = "2026-09-09T13:54:53.05Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f3/bf14a39d4af5697fd9404baaf70a0aeeb82d258b95de5cb16b1a7f98ae6f/multidict-6.8.0-cp313-cp313-win32.whl", hash = "sha256:093167d22a8c95af30f597b8a5686f20a14512989942d4be804d119899caca20", size = 47738, upload-time = "2026-09-09T13:54:54.676Z" }, - { url = "https://files.pythonhosted.org/packages/19/0a/598511a5741a3cb374971b3b02eda8a09896118ba528a54795f7e7e8bfb4/multidict-6.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:f25b61a708bd276e8cbb6afcbbf1b8e793a3be70ba0a842d0b8692020f83b706", size = 51609, upload-time = "2026-09-09T13:54:56.38Z" }, - { url = "https://files.pythonhosted.org/packages/fd/b7/6f5c1bd4ffe42d4a6db0f2f65491d4088e9c25c990358fb31a614621d664/multidict-6.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb36381e1f9f9d06eba2f10bdd438e5d20c07d5b55e1a3eee30b9f44cbf52316", size = 48280, upload-time = "2026-09-09T13:54:58.03Z" }, - { url = "https://files.pythonhosted.org/packages/ab/85/153341590e233a967c1d6791a83402d01693dec0f4c1f695606ef16c7ed2/multidict-6.8.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:f8b09b25e0f4dc2ea9e2adbb1cc3ba11a94d6fa3dd978ae659c8743052e1afbc", size = 53758, upload-time = "2026-09-09T13:54:59.563Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ff/44f72d516ece0398683ef52061797d83a74b16b8c1e4587408e97959d783/multidict-6.8.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1f57c414be82490bc0e0305fdb834186229b2d9b6a35fa0afd1eb1a772d125ab", size = 47495, upload-time = "2026-09-09T13:55:01.382Z" }, - { url = "https://files.pythonhosted.org/packages/50/5f/6e118f761b024dd35d26c2fe7ba41572bb0e8ac5f8cfccbbcbc2ff76da4e/multidict-6.8.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:00be37bde741bf60871082cd347a093218c44886e99231b7516671c70f2c280d", size = 48540, upload-time = "2026-09-09T13:55:02.989Z" }, - { url = "https://files.pythonhosted.org/packages/e8/4b/3eed744491b32f0e318e7db89dc06858732362f706e8d045fa9ab51a343a/multidict-6.8.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:e37b744849fb631bb52e3dadde35ffeee365a6c41cf71257b5b7acc9cd83fd38", size = 83130, upload-time = "2026-09-09T13:55:04.554Z" }, - { url = "https://files.pythonhosted.org/packages/6d/de/95c2c0ddcccb9a41ffbaa5df8ea059a8ff81916b7617a8847ecd89ed8061/multidict-6.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c2b2a96cf1dd99fe7867be4c013314225f4d5786e6685906e29932d42aca6f11", size = 50574, upload-time = "2026-09-09T13:55:06.387Z" }, - { url = "https://files.pythonhosted.org/packages/f5/b7/f4f4989594f99bc121ad9277090c4e49819b08ab1a96e132b628a9e10b7d/multidict-6.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bea7df027015856ba5d0a88e3b4777ff8cb5c66b58fc108050fe79d4dd9d4d2d", size = 48786, upload-time = "2026-09-09T13:55:08.131Z" }, - { url = "https://files.pythonhosted.org/packages/b2/86/f1d86a0222f31fb3df8eef3d6c9abf7e8d65d49edd8d0d7e7afaf23d23cc/multidict-6.8.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d3da668e903c934ed0b587ecacfed6901f6ae6384a6e975887592b61845e78bc", size = 276670, upload-time = "2026-09-09T13:55:09.803Z" }, - { url = "https://files.pythonhosted.org/packages/03/50/6945c50f86a978b2bcace9ca344165ff80883be47d984489bbba8fa0ab20/multidict-6.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64eaeda36ee8d88f9e8616a587a8c66a663283cf6e0dcf013c1ddd8c758e4aef", size = 279339, upload-time = "2026-09-09T13:55:11.685Z" }, - { url = "https://files.pythonhosted.org/packages/ee/2c/e649889ba23fd1f4442a85427b99d9e6261226b2ac31914aa7f5b241d947/multidict-6.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ac746cb365bac1c462da9e3e6ab8904a8efe2217a56b0b2e3d9480f41d2b2602", size = 252549, upload-time = "2026-09-09T13:55:13.527Z" }, - { url = "https://files.pythonhosted.org/packages/e5/f8/1023b66e011b1395fb160dabb0f0608ef67e569f0bdb2c1d5ac9b2f2adc6/multidict-6.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:18f0e06360c3e451a3ab800355773c8d125a758238d780c800b0ee5e90ee903c", size = 286203, upload-time = "2026-09-09T13:55:15.19Z" }, - { url = "https://files.pythonhosted.org/packages/7e/6c/48aea545cbda6d0444848ec23d988c13b86538a00a1b7d3868cc2382ff94/multidict-6.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:69708fecaa88bcb2341397b49fc95057a835b02a3670c551b37f95dd79e64e3a", size = 285039, upload-time = "2026-09-09T13:55:16.928Z" }, - { url = "https://files.pythonhosted.org/packages/68/2a/066123b17291671bf67d2a5c65ee81a48de53913bd1b1578791519eacdb0/multidict-6.8.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9606f583e7acaf61e7b3f56074e14037b9af7cb194590edfc0114b3ae5931ff7", size = 281075, upload-time = "2026-09-09T13:55:19.155Z" }, - { url = "https://files.pythonhosted.org/packages/47/20/4f0b2c485da2e8a659cc677717a3745872918c9c85064491a1ef75d7a3bf/multidict-6.8.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1f66fe6a021173d0d47968491791966b9f3e6d61115f2491744aa0c07a6e67af", size = 250431, upload-time = "2026-09-09T13:55:21.07Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c7/b9a288901577aa0b82c33c64d52246c88076d260ad7b6c16b021ca0f8e99/multidict-6.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:be007d1aee2cbd530347dcafedb400891a3b5f1bd7135f95cf5d5b330b5219ee", size = 273891, upload-time = "2026-09-09T13:55:22.887Z" }, - { url = "https://files.pythonhosted.org/packages/da/51/0ba50cab2cfd067988de2abb73f23076ac727fe18d03f1368a59def64727/multidict-6.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8457aff3c12a89a8e1c4674de5c777857fbc429f40fe117a3d29538547cbc364", size = 265262, upload-time = "2026-09-09T13:55:24.77Z" }, - { url = "https://files.pythonhosted.org/packages/0f/d6/e5be1117dbca6eb9ce231142b7e20599418bb3500147db51bf844ce8afcb/multidict-6.8.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:95c27b4f3f04320fc44e338573f40c5c956b504a7fcf081a157fd0b02579311c", size = 278033, upload-time = "2026-09-09T13:55:26.67Z" }, - { url = "https://files.pythonhosted.org/packages/d2/28/cad0afaec3caa56ea2c1ceed43c164d62ad3e83e950daf0d0c87bcf9dca7/multidict-6.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d244cf6b52b5ba1c34c3832f4652a668ebb36d95949b96eed9a1c54d916a90dd", size = 281717, upload-time = "2026-09-09T13:55:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d2/025702df0b69b856db70a4d66f77622f51c3d99771ec9a07f3ca80f7e098/multidict-6.8.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5bbbb696c8024475b1877d14ce20d5f1cc05b8f6d786cea0fe3aa7fedc02e891", size = 247124, upload-time = "2026-09-09T13:55:30.497Z" }, - { url = "https://files.pythonhosted.org/packages/b4/96/9dddca563f06a921956389c0bc9b894355b98b0bdf62299e2560c50afb6d/multidict-6.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:cbd86f9787c5e2f5fd27d8b21458222f107347c6731c4e93dde68f554b466a2d", size = 275954, upload-time = "2026-09-09T13:55:32.57Z" }, - { url = "https://files.pythonhosted.org/packages/ec/91/8b2f1f2a774a955665f268340a2b59db7020c5f12baac02ae9ef1b1660cf/multidict-6.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2f8a4b0b4d639d525928c7f30de527bfdf9ead6e44a5e8cb9c50aced5e4590cb", size = 275508, upload-time = "2026-09-09T13:55:34.368Z" }, - { url = "https://files.pythonhosted.org/packages/b6/1a/e2cabdfc0880a61a99d2b8bc361035036fb5a2c6af31ea3fa054ba1065c5/multidict-6.8.0-cp314-cp314-win32.whl", hash = "sha256:8890c89d662560e51c55ac1304d6f919b23942abe9ae1127cb1de9aa6132fa52", size = 46938, upload-time = "2026-09-09T13:55:36.057Z" }, - { url = "https://files.pythonhosted.org/packages/b9/7c/11234bcba62c22a58f2ba168499cfe3531f49de3edd5090d04a8c6cdc936/multidict-6.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:45cc39ba50fb0754a4359b90f8229ae08598fe2266abe3521b4e5a9ba916534a", size = 50291, upload-time = "2026-09-09T13:55:37.698Z" }, - { url = "https://files.pythonhosted.org/packages/ab/61/793668439df924752a8137d6db0de97ed1add494779b01e4764dfc60571b/multidict-6.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d0264f8d5cb0a803f650a6a8572dfa0cd1e099a2234c588dc8fb220b415b865f", size = 47622, upload-time = "2026-09-09T13:55:39.335Z" }, - { url = "https://files.pythonhosted.org/packages/9c/b8/3c091b929e6b5b2f6e0eba2232178e76d4503c8b96b92dfc281ff1d823be/multidict-6.8.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1969971900b0871530f9b62280dcc2d75688e74d2a69262bc01faf2b96c78f04", size = 88789, upload-time = "2026-09-09T13:55:41.086Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d7/3df83fab22dd64615db71e3b3cc1346b581d1459719637ce52144f9f6558/multidict-6.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8180b635290a75af8478f1b3e9810135381ae24833293fe77b85c1c21ff842ab", size = 53399, upload-time = "2026-09-09T13:55:42.685Z" }, - { url = "https://files.pythonhosted.org/packages/2d/78/41bd04c04b0aed16540c4856c9e012afc1c254298da154398308df05e26a/multidict-6.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4261863fc8b5ab1b815ede94e592e94c6af5b04616014929057e61859e7382a9", size = 51597, upload-time = "2026-09-09T13:55:44.569Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6b/7bc4cdddf624e1e7e0231734b1331729ea46df10d7c8fd3fce79756e7d0e/multidict-6.8.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0b143d53590e89f43153d81d505a8448d4d57354354385aef8a51d67ffefa27e", size = 264391, upload-time = "2026-09-09T13:55:46.548Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b6/d2a946e5938771e92c39354563e535ef6bc6dfe399dd4307c6df8dfea183/multidict-6.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da1c112c5784ccd9d32cd90be6739fee32644e874eff6ae8f0497cba3e352e58", size = 264680, upload-time = "2026-09-09T13:55:49.915Z" }, - { url = "https://files.pythonhosted.org/packages/33/6b/3f9e981c42e7eb9329918523f0f9362ceb0ac3ee0ee1165c28f674249d75/multidict-6.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f7eefd0233a7c33ca980a5cfef26f1e9b5e2137839e752a99963696729f12d91", size = 235420, upload-time = "2026-09-09T13:55:51.92Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e1/a3a33a039fb6d381800ae5d1d587b697b8c27fcdfe48819420f08703acba/multidict-6.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:348bb85e2038b40c007383616d73f734869063772372519549ebd7da1723d1a4", size = 270309, upload-time = "2026-09-09T13:55:54.023Z" }, - { url = "https://files.pythonhosted.org/packages/95/5d/8b06724a957f2e480f159b9550988a67810fbe9555a09c5f6a2a4b829607/multidict-6.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:095f62ea4e7a3be2f6c567ab695ce10e950f2adb905c1bec82281593e0b2d2ad", size = 275169, upload-time = "2026-09-09T13:55:55.948Z" }, - { url = "https://files.pythonhosted.org/packages/ab/32/8f3dfe2ffa5d0df2a95f71e63c2f11fe3b5e1771f26ef73bb1af84de83f8/multidict-6.8.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be569fff1d85cd29391c431c5641c8772acb75bbdc61e60a8e82fceb9023d385", size = 264900, upload-time = "2026-09-09T13:55:57.803Z" }, - { url = "https://files.pythonhosted.org/packages/6b/73/d5829fc00a055d6ab445e0876346ee9cdee670766cd4190dc0a496188c0f/multidict-6.8.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3533a03e4e789baf6a286e7b0b1b6da3f3d7c3eab569686ee29ee1d8b52e2cb4", size = 242486, upload-time = "2026-09-09T13:56:00.002Z" }, - { url = "https://files.pythonhosted.org/packages/b7/58/e8d7874038e31e0533182d1c3c5331a856b9c849a71bb26a21850e8c91e1/multidict-6.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1bdb9b8fba5a9aef673ec90db3f55b1ce743f2fbdea4d37dc04d14ccdfc153ff", size = 259916, upload-time = "2026-09-09T13:56:01.802Z" }, - { url = "https://files.pythonhosted.org/packages/4d/f8/1b56a7401acda20efc016440f4fad3bef66c4aee54ca080ec143881ebb0d/multidict-6.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f8d7b66c9e09c0bb0add2b5895e646b62a0849e71155066f215523de6b95cbe6", size = 251209, upload-time = "2026-09-09T13:56:03.767Z" }, - { url = "https://files.pythonhosted.org/packages/bd/5b/68d67a9e302b0645a747ba910c30eb41f2834fcdc1d85f53eae2dfceee0a/multidict-6.8.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:563d6500ca80dac7bba6f48a78e0ffd87e21a7d4d24642c6503a2ddccd70c110", size = 264505, upload-time = "2026-09-09T13:56:05.795Z" }, - { url = "https://files.pythonhosted.org/packages/18/13/4dc304ba2c5f5307b474ab2ce1ed1f6b02b0b4e233c182e3981ed436c2e3/multidict-6.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:346ac52e56bcda320c0dcdfdd081947ed7cada33afea4e2284bef7b0733bff9b", size = 264916, upload-time = "2026-09-09T13:56:09.079Z" }, - { url = "https://files.pythonhosted.org/packages/dc/0f/7b1f729d18369915009185201be5d0b8df0e525340fe6a600d2f8441d6cf/multidict-6.8.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4ee953a5ebaeed38dc21cc032ed17a9d9782802e00042200497ab4b01b0bf7c0", size = 236839, upload-time = "2026-09-09T13:56:11.273Z" }, - { url = "https://files.pythonhosted.org/packages/22/d1/eba1b88b18b7019d9136303fe77909257c40fabde5aaf138a4d900b6ce3c/multidict-6.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:2f79cc3e8039a8cf5c77e0811b0807953fd52d0863b9b76970b20d696dc64a78", size = 265307, upload-time = "2026-09-09T13:56:13.379Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a6/6c1e4106faa27118ac612f4d664eaf909de252634785286262a627108e58/multidict-6.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:43a4b56555bbcf8af161e7c7682bd93eec10f068c95844511864c018c8e5e13b", size = 259041, upload-time = "2026-09-09T13:56:15.666Z" }, - { url = "https://files.pythonhosted.org/packages/c0/bc/ecfb8b6faa8e158a71b03bdf7f947f30e0bc5d899cc357573a76ab7bb1e5/multidict-6.8.0-cp314-cp314t-win32.whl", hash = "sha256:48ea524a25a1cd5972cf293bc95713918cba0bcd6fa9b992d906c857c546abe2", size = 50628, upload-time = "2026-09-09T13:56:17.837Z" }, - { url = "https://files.pythonhosted.org/packages/30/7f/e27fb699b70ad24dbd02ddee604658acb36f907c03c045baffe4ea774501/multidict-6.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d0be2b832435001bc623ca7f1499ca1a853d4f082fb61221a80ce71132f50b26", size = 55592, upload-time = "2026-09-09T13:56:19.652Z" }, - { url = "https://files.pythonhosted.org/packages/eb/7a/76de70b2f6733696803f1ee56abe44a3757a52777383032c7373d3fea0f4/multidict-6.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:62b8e291a4f7edbf7cde7a43d831d893ba443a1b627498b53581943b0e348feb", size = 50300, upload-time = "2026-09-09T13:56:21.516Z" }, - { url = "https://files.pythonhosted.org/packages/ce/32/4de7320ae032dc768090d11f708d2d386df3db04cb6b8b0db0230cfc66c3/multidict-6.8.0-cp315-cp315-android_24_x86_64.whl", hash = "sha256:e192018b732f7b168e6604cbdf40fa8e05c996693b9eb445a0d8a73f4b77c5d3", size = 53761, upload-time = "2026-09-09T13:56:23.192Z" }, - { url = "https://files.pythonhosted.org/packages/5c/45/ecb641309dc2cdc6040f18e22c68eb5e94398f9404c4365d810f4292e053/multidict-6.8.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b25426f9f6ed402835617c8f23609a47045f91ecff365eb6734817e039a8ed25", size = 47505, upload-time = "2026-09-09T13:56:24.902Z" }, - { url = "https://files.pythonhosted.org/packages/eb/68/87d6161b9fef11943e0b894203da3fff561933ca3c9b2952b6e7100e9c9f/multidict-6.8.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:fa6c2880709c84457de104385b704fc28860f27e442ad13966fc4af8e714fe9c", size = 48549, upload-time = "2026-09-09T13:56:26.574Z" }, - { url = "https://files.pythonhosted.org/packages/97/f7/d852d2276407640cdbd29fe11cac6e93f70f59542cba174ef9d146738946/multidict-6.8.0-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:eabb03dc3e4ed6333ecd1cc9826ec80e7a98b5506deeb832d7260c8e44166d23", size = 83157, upload-time = "2026-09-09T13:56:28.227Z" }, - { url = "https://files.pythonhosted.org/packages/14/e3/16fe7ffa6090591d83cf6bc2486e77ce891705fb6d0191823140928311b5/multidict-6.8.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:59e539c4eb4d3a53b0e630a6ba2b2f2824732b5e73f90e30a280f12fde157b15", size = 50578, upload-time = "2026-09-09T13:56:30Z" }, - { url = "https://files.pythonhosted.org/packages/d0/0c/e38e41c1087a599f86ff58a01f358abf7c4db3c26a3e90eebb3e02193ef1/multidict-6.8.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:835d5a90b11d1f5f8200ff3cc8316bded76eebebc92436398947a27657e645e7", size = 48815, upload-time = "2026-09-09T13:56:32.056Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f0/eb691f42af8e7775992f57904ec75dc356fc7cdc896e5f30879decdd26f2/multidict-6.8.0-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d2d236b8a44ae91536a12ebcb996bdb31cf27425f36b4d05c87f2ba2716050ba", size = 274804, upload-time = "2026-09-09T13:56:36.741Z" }, - { url = "https://files.pythonhosted.org/packages/87/05/28472ccfeb43c00a043c0385ca4294da21a5957859fb7860e2ebdb3e3011/multidict-6.8.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bb9a60b7faa5d37c426fa91cf4d6738182a1f2755b9fab7c9c64cd466c4ce51e", size = 279693, upload-time = "2026-09-09T13:56:38.531Z" }, - { url = "https://files.pythonhosted.org/packages/f3/a1/2b4fe73e5fecff807b47650a155c391a103136428cb21d6ba8e39c5912b5/multidict-6.8.0-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0ef606c15cac6c90279acf34120784b6f36662cbf382defd3955cd8f1115336b", size = 254969, upload-time = "2026-09-09T13:56:40.407Z" }, - { url = "https://files.pythonhosted.org/packages/44/e0/c97d1822783dfe52e02fd150fa3f02eb22410211a9e2615f71541803ed4b/multidict-6.8.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:68186a2d4051c8ffd17be33553bea2ec9bbc8ef860fe2980a221d96126296f31", size = 286392, upload-time = "2026-09-09T13:56:42.234Z" }, - { url = "https://files.pythonhosted.org/packages/2f/d9/772f1339e1d051236bcc137b0eac2b4aaaa0bbb56aaf924e9aaba901d9c1/multidict-6.8.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2cc66abb85e2108c9ff8a1c0d20fa260bf690bbb33caef4ff3ecb2c2cbdfff5d", size = 285348, upload-time = "2026-09-09T13:56:44.255Z" }, - { url = "https://files.pythonhosted.org/packages/06/ae/cd045747e4680362e02955a82c468e95b5e4d319e3a79574b3fb677de568/multidict-6.8.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69b3e519a132bb943b0daae15fc8c2168706b17f826481d32a32a5e784b129e3", size = 282721, upload-time = "2026-09-09T13:56:46.088Z" }, - { url = "https://files.pythonhosted.org/packages/35/14/0802d9a3aae4ef21eaa39adbd729a380fa095932105e1424e417b53e783f/multidict-6.8.0-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e41226ecf607f062fe34a2f4cf64ad3a89e3a0180dc800b463b6b14c06dd10dc", size = 253168, upload-time = "2026-09-09T13:56:48.07Z" }, - { url = "https://files.pythonhosted.org/packages/b1/64/3f92298bab8fbe1332e708863fb55b66e755be6f416b3459720d48b33af9/multidict-6.8.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:610c7637bc36b90f39e6c66f710f93d57018f83d53e1e187caaa218c6892b95f", size = 274209, upload-time = "2026-09-09T13:56:50.023Z" }, - { url = "https://files.pythonhosted.org/packages/08/c2/2001ac0eac1a8b7390a5902d7115f66d4f256268057a502200b6ab12dad7/multidict-6.8.0-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:65c85c79f5a2c04fbbc18f006c014674dc5fdf270cb978d8862c82c6f694e60c", size = 268044, upload-time = "2026-09-09T13:56:52.033Z" }, - { url = "https://files.pythonhosted.org/packages/0d/90/78a9e26c85f89abd562a67f7fcbaef9007fd5c37bb9efac19f1cf604e7c2/multidict-6.8.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:628ff11e6720f90acd0c305dfa3339f04a783a20de8cda6ac333ba46447261e8", size = 274806, upload-time = "2026-09-09T13:56:53.975Z" }, - { url = "https://files.pythonhosted.org/packages/3d/71/713bd445421b21531234c1f3630b768192cb9d80c8b1c5b05c5b505ff4c0/multidict-6.8.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:0935971bffd0b479fc90c4811ca787703e93fcb6afea939a375dfc80285ab368", size = 281890, upload-time = "2026-09-09T13:56:55.848Z" }, - { url = "https://files.pythonhosted.org/packages/de/a5/1387c538663e2dc8c27bbc7cd6955cb66de0f55c780cf7cd0fc06a1a16ca/multidict-6.8.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:9442b14eec262a1f74369bbd07e75bc5155105164649a4b9fbc1ebc7b8fb0b14", size = 249749, upload-time = "2026-09-09T13:56:58.01Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/104296c9d70896b9759ce0812aa4899fab76d8b16bb32dcc5a78ab547c89/multidict-6.8.0-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:397599503b718f0137f26d3f6532d6955069cd2e5917c47ef581495bc2529ff8", size = 276138, upload-time = "2026-09-09T13:57:03.591Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0a/f2a0c2658e9d7ff5964ec2820a02054558636fafd663230ddc8310b8ed39/multidict-6.8.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:9e37024b41d7a7e7e9cce14b248d54707c21c2a2ea30a47b71bdcefcafec00f2", size = 277077, upload-time = "2026-09-09T13:57:06.024Z" }, - { url = "https://files.pythonhosted.org/packages/98/50/bc46566caffba5c1c4a510519156371edf7c4ecd35c9ef917d0c1803487d/multidict-6.8.0-cp315-cp315-win32.whl", hash = "sha256:071da134651b04a8507dfb331ac0988f376337c2aea59486bf20989fb5b5a64e", size = 46930, upload-time = "2026-09-09T13:57:08.009Z" }, - { url = "https://files.pythonhosted.org/packages/6f/1a/cafb31049ecc1a6ce52bcc69fa436cca239adc057b1718a0c49044848663/multidict-6.8.0-cp315-cp315-win_amd64.whl", hash = "sha256:3bafff8598f0528017ddc74194e5451d5c22d046c98935f8f86247b0f286e4f8", size = 50294, upload-time = "2026-09-09T13:57:09.986Z" }, - { url = "https://files.pythonhosted.org/packages/6b/51/00e037da14cd1d894b123e0bbe62de5c561679a6ab23ab1c009f2965dcda/multidict-6.8.0-cp315-cp315-win_arm64.whl", hash = "sha256:e886ef8c9879105fe4fc99417447b3a5f35d1131412ce839470bd2089fe2043f", size = 47626, upload-time = "2026-09-09T13:57:11.738Z" }, - { url = "https://files.pythonhosted.org/packages/52/f7/aeb947982197e8b4f5c4da3961ee473ea5a050b94a6ff3b88baf64621401/multidict-6.8.0-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:883284137e25318ed9735b742ae46341a864888fae28e8b6314c4f84da080f08", size = 88801, upload-time = "2026-09-09T13:57:13.957Z" }, - { url = "https://files.pythonhosted.org/packages/35/d8/593948c016c3f850e3cd56a4e0144151eb409d2b8690f0c0ce7f7d33dbea/multidict-6.8.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:ca52b9ec80851366197577154c862c4c4c7036ca76ae94cef5cb59c5cfeab944", size = 53376, upload-time = "2026-09-09T13:57:15.94Z" }, - { url = "https://files.pythonhosted.org/packages/58/b9/097a05bca533027c0477b6a90bf927dbbb4b23cc9090bbb37a2e972af8d5/multidict-6.8.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:91fa75d0a693832106d98f66c849f034f21c828d14437f1fb97d3784aab89e84", size = 51629, upload-time = "2026-09-09T13:57:17.685Z" }, - { url = "https://files.pythonhosted.org/packages/fe/07/938ed21967f12380d0b8861645fb65a942f3669e31d5163ed94d23103b61/multidict-6.8.0-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:307c1acd812fe897e7fbe10c6758822e8c04be4e7c60a9f54901cdf8b5ab8bc3", size = 261967, upload-time = "2026-09-09T13:57:19.752Z" }, - { url = "https://files.pythonhosted.org/packages/89/e8/e66bf843fd29c01712dde9edeb9f4ad0ffab06ab4ada4b721ad7bc73b3d5/multidict-6.8.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf684986a2490628f059a99dd107b566a2d34cf947f8eb8387e0500a1f90c5", size = 265923, upload-time = "2026-09-09T13:57:21.784Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f8/e9be849b225af28a8eee2c6bfea23594a777c753fe97e2ff7e2180c8935a/multidict-6.8.0-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:77745725125d01fd613b6db043362aa7c6bfbfdb23d45dbfc3d92bf58160af62", size = 239380, upload-time = "2026-09-09T13:57:24.3Z" }, - { url = "https://files.pythonhosted.org/packages/ab/67/4dbad08f5081978c591afae9e836ec9ddae90e9e76be6d6ce10757483dc4/multidict-6.8.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8daafaa0b2eb43f76898ced78b1e0fb91b38c4fa50da516c18067f2a2d578c20", size = 271591, upload-time = "2026-09-09T13:57:26.611Z" }, - { url = "https://files.pythonhosted.org/packages/92/3f/e9c97222d7e104e54e556f118ec7d091ab41a0c10c630f2b97e5b43f5404/multidict-6.8.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c68e0c0649d17c2d0339e3674e86a4aeba4a7e6b21c1e394cf947a95433b31d0", size = 276091, upload-time = "2026-09-09T13:57:28.997Z" }, - { url = "https://files.pythonhosted.org/packages/26/ca/728e7ce05ac9c0303554e7162e74d91fe49e65bad7dfbb377f783dd32c0a/multidict-6.8.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8a5ac357ac283490a8d1899b0383355fd1f8634b14ba0d59e4c0dd97db85556", size = 266493, upload-time = "2026-09-09T13:57:31.256Z" }, - { url = "https://files.pythonhosted.org/packages/8f/74/7c658d2769863af16fb7d7c6be50b29659892a06a632858863eee3a31842/multidict-6.8.0-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:46029e6e27a3ec0dc55b53f58df82d10f04c5e111f78248279b530bedad2c30a", size = 245302, upload-time = "2026-09-09T13:57:33.464Z" }, - { url = "https://files.pythonhosted.org/packages/2d/2c/d4350a20a0e8c66a447d694e8713438262665203fe826c3f4e385f052b72/multidict-6.8.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:8d1046b5427dcafe6e8a0e07527dd74f1ee694006160162f53f3a17f15aad3b4", size = 261016, upload-time = "2026-09-09T13:57:35.651Z" }, - { url = "https://files.pythonhosted.org/packages/1f/78/83df999c8beb72a012cfac42f2b833c4a48f8e836fd4407747b355a2430e/multidict-6.8.0-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:f1f4a220db6ed7c8fd16b6d644ffd1f082651693204daf3275e049fadc849e39", size = 255021, upload-time = "2026-09-09T13:57:37.758Z" }, - { url = "https://files.pythonhosted.org/packages/fb/13/f2c0a2dac6d91f74aa124f3e9f07ec497ceae5ed2df2753d249601cd7262/multidict-6.8.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:029897732a9c798737457e382bf84e8c64237eff224a90aea2639f4413c45e4e", size = 263066, upload-time = "2026-09-09T13:57:39.897Z" }, - { url = "https://files.pythonhosted.org/packages/59/1d/730008d4639ace731bbb1399e1ac13cbdf506f7d6fb861d75044ffb3994d/multidict-6.8.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:29be9fd289e9ab8f480996ea2f686e1654b80242033843cb11691688329423f1", size = 266510, upload-time = "2026-09-09T13:57:42.39Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ca/bec67a5d206dc5748e50c93f6f71deec14305c3657cfe250c3887caf7839/multidict-6.8.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:29631224698de1e42abc8fa7658d830e0aed0029785144b5832b695da5adef2f", size = 239423, upload-time = "2026-09-09T13:57:44.304Z" }, - { url = "https://files.pythonhosted.org/packages/9e/db/5f153fe51fbac7d80f3bb8bd6fab8db8b6cd061e7a11371676dfed3712bc/multidict-6.8.0-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:962f18c59a000f30b084ea2e6b8001521bb315efd4e5f10acf9fb36f366b7882", size = 266902, upload-time = "2026-09-09T13:57:46.297Z" }, - { url = "https://files.pythonhosted.org/packages/89/0f/9efca48a351551de4dc0c183f523109dbe87c645a4732d5f1c70b4880dca/multidict-6.8.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:c60e50bc5b07faac92fd3a20fa21cc8cf3e3f7204d2867b206c73293ebc19101", size = 260887, upload-time = "2026-09-09T13:57:48.268Z" }, - { url = "https://files.pythonhosted.org/packages/df/d8/bb879a62e0809448e53f6237e71670066ecf3bbc5896a7a6705b6628d86a/multidict-6.8.0-cp315-cp315t-win32.whl", hash = "sha256:fc5460940f50dff00731b4132366840ba9685286ea88ea104b661899084f3fea", size = 50533, upload-time = "2026-09-09T13:57:50.31Z" }, - { url = "https://files.pythonhosted.org/packages/fe/62/3e5308d8871636e4b9620e4b3acfcf2b5caf79b19d317690ec13f7fc8b57/multidict-6.8.0-cp315-cp315t-win_amd64.whl", hash = "sha256:b367c342327717d644db4c0ddb37ceb655c84822215ea0773a3a36911b74b71d", size = 55572, upload-time = "2026-09-09T13:57:52.301Z" }, - { url = "https://files.pythonhosted.org/packages/b9/cc/d3c10e10ee3bb7a7b4abbb3157306b2ce7e0018c9c2d16b32b468739d2b7/multidict-6.8.0-cp315-cp315t-win_arm64.whl", hash = "sha256:0c1c4debad7337627b86837abdf0237ca3cb3d7e17de7eab0177c263878546d4", size = 50322, upload-time = "2026-09-09T13:57:54.099Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ee/be4e1a4b7a2b27f4fb6936510d4bebcb41b0562c946930ad26916e069cf9/multidict-6.8.0-py3-none-any.whl", hash = "sha256:75daa15ca16d6285eb2e104b2f05ee6f8d9836c68da3ce5c85f615a0450eed0e", size = 16297, upload-time = "2026-09-09T13:57:56.106Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", size = 77176, upload-time = "2026-01-26T02:42:59.784Z" }, + { url = "https://files.pythonhosted.org/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", size = 44996, upload-time = "2026-01-26T02:43:01.674Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", size = 44631, upload-time = "2026-01-26T02:43:03.169Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", size = 242561, upload-time = "2026-01-26T02:43:04.733Z" }, + { url = "https://files.pythonhosted.org/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", size = 242223, upload-time = "2026-01-26T02:43:06.695Z" }, + { url = "https://files.pythonhosted.org/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", size = 222322, upload-time = "2026-01-26T02:43:08.472Z" }, + { url = "https://files.pythonhosted.org/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", size = 254005, upload-time = "2026-01-26T02:43:10.127Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", size = 251173, upload-time = "2026-01-26T02:43:11.731Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ac/b605473de2bb404e742f2cc3583d12aedb2352a70e49ae8fce455b50c5aa/multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92", size = 243273, upload-time = "2026-01-26T02:43:13.063Z" }, + { url = "https://files.pythonhosted.org/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", size = 238956, upload-time = "2026-01-26T02:43:14.843Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", size = 233477, upload-time = "2026-01-26T02:43:16.025Z" }, + { url = "https://files.pythonhosted.org/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", size = 243615, upload-time = "2026-01-26T02:43:17.84Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", size = 249930, upload-time = "2026-01-26T02:43:19.06Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", size = 243807, upload-time = "2026-01-26T02:43:20.286Z" }, + { url = "https://files.pythonhosted.org/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", size = 239103, upload-time = "2026-01-26T02:43:21.508Z" }, + { url = "https://files.pythonhosted.org/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", size = 41416, upload-time = "2026-01-26T02:43:22.703Z" }, + { url = "https://files.pythonhosted.org/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", size = 46022, upload-time = "2026-01-26T02:43:23.77Z" }, + { url = "https://files.pythonhosted.org/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", size = 43238, upload-time = "2026-01-26T02:43:24.882Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, + { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, + { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, + { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, + { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302, upload-time = "2026-01-26T02:43:48.753Z" }, + { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981, upload-time = "2026-01-26T02:43:49.921Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159, upload-time = "2026-01-26T02:43:51.635Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] [[package]] @@ -2975,36 +2783,36 @@ wheels = [ [[package]] name = "nh3" -version = "0.3.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/2f/022b27146d52d24b1b353b003359134788ecbcd6fcdf6283adbd57c0fbc8/nh3-0.3.7.tar.gz", hash = "sha256:71860d01c16f4d8c72e334e0674beb2b0899dbd0bf760de18932ef4390303848", size = 25662, upload-time = "2026-08-23T14:26:30.728Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/88/b594f0e86856b37e182fb663283da419eea6424972506e640e890885467f/nh3-0.3.7-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:91a4dab4e94d9fc54b9f67b1adfb23e81fab7ab43f33c3b8c97be9aa38f789ba", size = 1471147, upload-time = "2026-08-23T14:25:55.259Z" }, - { url = "https://files.pythonhosted.org/packages/1e/60/847a21339f095c4d4c655af31fa2d18b174585bcc210709facacc7ce205c/nh3-0.3.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae64328e46a25785535afcb6885b6f182ecaf5ee8c88f8c075422db8aacc65b", size = 820463, upload-time = "2026-08-23T14:25:56.803Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7f/1a103e00aaf5e59f2dee4c2709aac609bb2d4bb74fddaf0dcfade11ed87b/nh3-0.3.7-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4968fe8d2db97c6f047659bf46a449fd8ec377f44ebf3e0a1b96c0d3a333ae32", size = 861456, upload-time = "2026-08-23T14:25:58.087Z" }, - { url = "https://files.pythonhosted.org/packages/d8/4a/e9c436089a0c80b928011ead0efd156aa7639a19b6064ef58dcedcab8369/nh3-0.3.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:be53a4825585f701955cb9baf49f478f56eb81e20294329fe4bc689dd5dd81fa", size = 1023930, upload-time = "2026-08-23T14:25:59.465Z" }, - { url = "https://files.pythonhosted.org/packages/04/5c/aa1468e3e281e78d2b3b7d762ccba59f681af355e971dbd255d5903f7b86/nh3-0.3.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:94fd6e59553fbb9ffd8ba71bbd5a54e3126ba01799a097ae30d5341d750bc6ac", size = 1102614, upload-time = "2026-08-23T14:26:00.869Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9f/57d186d9d3dd38905dc12dddb3484406cdf6aa0b1ce33639a2d277d4ee1c/nh3-0.3.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:18f4278ecd157d43cb35acd5aae9f35cfa79f546b4922bd86536adc0f6312102", size = 1059915, upload-time = "2026-08-23T14:26:02.388Z" }, - { url = "https://files.pythonhosted.org/packages/6b/53/097a5ad0b34b15d67a472ef849165a54209fa5fbd3e639801c6fe439ba28/nh3-0.3.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:808def0c8c07843e6e50dc84f532457bfa2cfd17417b219a5d9e7c773709331a", size = 1047402, upload-time = "2026-08-23T14:26:03.897Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a7/c57a2c70534418310889a65ccfac3525e62f0bc0a8613225903403755ce7/nh3-0.3.7-cp314-cp314t-win32.whl", hash = "sha256:874b7d67a067bd29a59223f6270fc30da4edd8e6d87fd219fc93bcbaa662c946", size = 619895, upload-time = "2026-08-23T14:26:05.105Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b7/efda1d0a611d940bdfde6893bde1ea6b7b7d48c31273aea48e35b822fd58/nh3-0.3.7-cp314-cp314t-win_amd64.whl", hash = "sha256:614dac4a4c36ad084e78447d16fe898dedd762e354a7ab9cda2984e82f67883d", size = 633456, upload-time = "2026-08-23T14:26:06.661Z" }, - { url = "https://files.pythonhosted.org/packages/1d/18/3ab564595cb88196f50d26e163ed0fd2acc731ab26ac615df91981885887/nh3-0.3.7-cp314-cp314t-win_arm64.whl", hash = "sha256:157ec1eb7a62f3d9a7badb8d82d89aa810e3e24e097eedfa481a25d0c8a99877", size = 611003, upload-time = "2026-08-23T14:26:07.813Z" }, - { url = "https://files.pythonhosted.org/packages/94/0d/c257754bf57f829f307aa226bbe136d3a1356b5a0d08324c7b6bd2a8aacd/nh3-0.3.7-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6c3aa50eb26e9228238271db9f983cbc3b006dfbfeca2d4dc34c33ddc6ac5ea5", size = 1493959, upload-time = "2026-08-23T14:26:09.025Z" }, - { url = "https://files.pythonhosted.org/packages/07/42/a687e7091928806e514f89fa2666f25ec9bfe0a902fc4402b25e51ce408b/nh3-0.3.7-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f266d3f1b3647449923a8e406524632220dd5d8b647078dfe45b885d33d10479", size = 859615, upload-time = "2026-08-23T14:26:10.606Z" }, - { url = "https://files.pythonhosted.org/packages/85/05/b0e6bef633549a23347d5462aa288fcc42381e7918482062ca3cb456242a/nh3-0.3.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8fd1ab205258b29254f72db377d99e2c96aa7653ef3b015ccab0420b094b506", size = 839872, upload-time = "2026-08-23T14:26:12.037Z" }, - { url = "https://files.pythonhosted.org/packages/17/40/2a0921d45b20828708bcb56887e47dcf8cae13818de5bf9a01308d348712/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:19f288c938ec6eef1f5d2c6cab47838e71fef8097e1c1233802be5a6230ba086", size = 1091325, upload-time = "2026-08-23T14:26:13.34Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d1/9d70e0e418a48280ec0ddc6c1b08b4b1136ebcc31a1625e57ff5c665fa51/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de2b2aab32ea303405debefdcfc58043d3e635fa3f67b9eb140d2b0e0c0d2563", size = 1042482, upload-time = "2026-08-23T14:26:14.667Z" }, - { url = "https://files.pythonhosted.org/packages/93/a7/02dd159d4e71f98607d8d4249cddb7561e77be1a8e4dec77d76e1b68fc99/nh3-0.3.7-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7279d43323a25225df23576af6594a16693f61431170848b8b2ac21ad4f174", size = 946868, upload-time = "2026-08-23T14:26:16.094Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ed/c5510c615dce55b6fcc364aa1838142f938beed64f5e4927490dfcaf4405/nh3-0.3.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70f5ac8626e899a4bab0ef74ca2f5bd602f49c7b739e6e5026b4afc6d63dac42", size = 832161, upload-time = "2026-08-23T14:26:17.272Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e3/3212c1a5b5745245d7f18885207bbddb34c56075f34dd682bd539aad55cc/nh3-0.3.7-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:5ffdfcb9a686ffb12765376bcfb6b5b55728516d3c0ee317d29982381ded3df8", size = 849791, upload-time = "2026-08-23T14:26:18.498Z" }, - { url = "https://files.pythonhosted.org/packages/20/64/9e36594efad6c290de4240d02cb2bd80c339a4ab1c4de66e599ffa6d9d81/nh3-0.3.7-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bc42bb1193c1e28a1e74c2cabaca178e118a7103e8832699fef8a2b3e2496493", size = 875473, upload-time = "2026-08-23T14:26:19.908Z" }, - { url = "https://files.pythonhosted.org/packages/00/0c/1a8985fd43fea5530c0ac890b6f0b423770ee72f111b70b7a77f2dec243a/nh3-0.3.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d56e76bd3cadb09b6b0cef364850811663734b348a25f5f587a2819c495367bd", size = 1036463, upload-time = "2026-08-23T14:26:21.536Z" }, - { url = "https://files.pythonhosted.org/packages/b2/5d/891e533b716cf00df76ad0ba6485dcfd14d59a6430a3cc99057c4c04004e/nh3-0.3.7-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fd4a70efb45d5372174f718878eb7a35c12677626a63b2f103b23b833457dcac", size = 1116029, upload-time = "2026-08-23T14:26:22.907Z" }, - { url = "https://files.pythonhosted.org/packages/42/e5/ae8c0782fce74fb6fcf7234bb3d4017f37ce181b4f9d29369eab21c50a04/nh3-0.3.7-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:15f5fbf090f5c88d61c820e1fc1fceecb6520cca9fe85649c06b57ef9dc9ff62", size = 1076589, upload-time = "2026-08-23T14:26:24.302Z" }, - { url = "https://files.pythonhosted.org/packages/26/a4/c3423351e8d864ad756e85e15f0c01433361f14d34e4ed156482c0518f2a/nh3-0.3.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6698a822132beedab80f131c08d8d0ac5a178ddeb488d02ca4b67716ecfac7af", size = 1058871, upload-time = "2026-08-23T14:26:25.674Z" }, - { url = "https://files.pythonhosted.org/packages/4b/6a/478f153f1d7c0baaa3d1e8bb5fdcee3a6235f90fe44ea969a9d4e2b8c47a/nh3-0.3.7-cp38-abi3-win32.whl", hash = "sha256:6e4280115d44c3b278eef712a86748c1a723105cd79feec46952383117ab4e59", size = 630729, upload-time = "2026-08-23T14:26:26.932Z" }, - { url = "https://files.pythonhosted.org/packages/b4/b9/34433ccb1f0fe6968dabbb7d4bf5721c6221878ef07832748c06655a6a80/nh3-0.3.7-cp38-abi3-win_amd64.whl", hash = "sha256:618e3059caf41ccdf5dcccb3fa9df4cf6e4efe23d1382a8bbfca272a8a4f8bfc", size = 644462, upload-time = "2026-08-23T14:26:28.294Z" }, - { url = "https://files.pythonhosted.org/packages/f9/70/e140dffff6e808dc6343598df76e7e2407fd0f581de3524c75fba2e0cf24/nh3-0.3.7-cp38-abi3-win_arm64.whl", hash = "sha256:f04b7d333b27f13ca439da3cf1c75c2fba34f104969f6ce4ac8e7079699c2f4a", size = 621867, upload-time = "2026-08-23T14:26:29.547Z" }, +version = "0.3.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/1b/ef84624f14954d270f74060a19fc550dd4f06656399447569afb584d8c06/nh3-0.3.6.tar.gz", hash = "sha256:f3736c9dd3d1856f80cd031715b84ca75cda2bbb1ac802c3da26bfce590838d7", size = 24684, upload-time = "2026-06-22T00:47:02.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/3e/6506aa4f23dc7b7993a2d0a45dca3ce864ec48380adfe15a173e643c63e8/nh3-0.3.6-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2411e8c3cee81a1ddd62c2a5d50585c28aa5566d373ad1db92536b95ddb24ef2", size = 1421679, upload-time = "2026-06-22T00:46:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e1/e96e7864a7a53bd6b6fab7e9632467382a2a2c1f3fed951918ad131542fb/nh3-0.3.6-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e196fa70c2ff2eb4de7d3df3108f8f358c1d69dff20d45b11f20a5aa227ffb6d", size = 792570, upload-time = "2026-06-22T00:46:22.179Z" }, + { url = "https://files.pythonhosted.org/packages/59/62/5b6108bedaef2b2637fed04c87bdbcb5967b9961758b41f0e466ef22a022/nh3-0.3.6-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34d2b0d934156b87ee114f599a3ba9b8b9e17b5d79652ba3a13fa50903de965e", size = 842243, upload-time = "2026-06-22T00:46:23.801Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4a/526f199626bfcb496bc01a268051b44737962005553b158e985ed7e64865/nh3-0.3.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2f14b7ae1fca99c4a66c981aac3974e7fbc1ca30a12673d223ae1df76680917", size = 1001468, upload-time = "2026-06-22T00:46:25.481Z" }, + { url = "https://files.pythonhosted.org/packages/49/09/0d8e3101636d9ad88cdefb2914e764cb8e876ebdbb4286bfc251277d9c67/nh3-0.3.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:889932a97fb4abb6f95fef1914c0d269ebfb60011e67121c1163059b9449dbb4", size = 1082933, upload-time = "2026-06-22T00:46:27.15Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/ea83abe738a3fbaa203dfdb836ca7cbab0e7e9609faaee4fe1d4652599c0/nh3-0.3.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:edb2b4a1a27523e6cc7c417f8d21ce3d005243548b93e56b762b66b0c7f589f9", size = 1043120, upload-time = "2026-06-22T00:46:28.89Z" }, + { url = "https://files.pythonhosted.org/packages/66/69/0654482b8635012fbae67826bd6c381abb05d841ac7388b9b4666300fdad/nh3-0.3.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:43bc1ed3fa0716295fabee29ba42b2667e4a51d140b0a68e092170a765474fa6", size = 1023824, upload-time = "2026-06-22T00:46:30.453Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/1f7285ffadc8307c4dbeb08d21b920536d5117785056d1079e998c4dfa44/nh3-0.3.6-cp314-cp314t-win32.whl", hash = "sha256:597a8e843bea00b2eb5520658dc24a9bb032e7fc9e7c2c0c4cd29420220c9796", size = 599253, upload-time = "2026-06-22T00:46:32.072Z" }, + { url = "https://files.pythonhosted.org/packages/36/ea/5542f3c45da4c00290d9d67a65e996702e23e613c4b627de3e09cb9fe357/nh3-0.3.6-cp314-cp314t-win_amd64.whl", hash = "sha256:4713502748f564fee0633b37b3403783ce0a3af3a3d148ad91025a5bdadb7bc6", size = 612553, upload-time = "2026-06-22T00:46:33.53Z" }, + { url = "https://files.pythonhosted.org/packages/66/35/26bd47e6af5915a628281dccdac354ddf4e32f7397047894270acd8c9870/nh3-0.3.6-cp314-cp314t-win_arm64.whl", hash = "sha256:69bbb92865a693d909db3a700d3c01537533844d0948c1e9323561ce06ecda41", size = 595151, upload-time = "2026-06-22T00:46:34.878Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ab/a7653bce9a3b204be6a6931767a9e23595807bb84790ce6685e4d7e5bd08/nh3-0.3.6-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a43ebd7543555c3ac1bc353023d0794e75cb76f6f18f19c32e95441496c0cc25", size = 1443564, upload-time = "2026-06-22T00:46:36.66Z" }, + { url = "https://files.pythonhosted.org/packages/41/21/e1084ab18eb589506335c7c7576f2d4643e9a0c0e33983ef0e549a256b96/nh3-0.3.6-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1b160831c9cdb06a6c79c2f9cdb11386602938f9af260d1c457a85add4f6f69", size = 838002, upload-time = "2026-06-22T00:46:38.101Z" }, + { url = "https://files.pythonhosted.org/packages/b0/94/f48d08e6f72a406300fa11d8acd929fea1a80d4bf750fa292cb10785f126/nh3-0.3.6-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d14bf7982e7a77c0c775634c29c07ce08b38a046df73e1c1f139b3e82f18a38e", size = 823045, upload-time = "2026-06-22T00:46:39.495Z" }, + { url = "https://files.pythonhosted.org/packages/25/bb/431615ba1d1d3eb63cde0f974f2114edf863a8a3f6049a12fed23fc241d3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:44673b27010051ab5a5e438a86ec31bbda61d4a77d7e900af6b7be3037c1abae", size = 1093171, upload-time = "2026-06-22T00:46:41.21Z" }, + { url = "https://files.pythonhosted.org/packages/0e/24/a0d80182a18919665fefd19c1c06f1d1df1c9a6455d0252de40c034a0bc3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6b7beece07525dc6e6b0fc2f104442de2ba328360ad00e50cbe2e1fd620447d", size = 1049217, upload-time = "2026-06-22T00:46:42.804Z" }, + { url = "https://files.pythonhosted.org/packages/0a/13/6f1e302ca674ac74362e150848ad56a1be5145391204f74facdb8e94df12/nh3-0.3.6-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:455469a29951edc92bc48b47ac2281c3f2609e6c4f6a047056449f8c2c23facf", size = 917372, upload-time = "2026-06-22T00:46:44.495Z" }, + { url = "https://files.pythonhosted.org/packages/5b/67/314f6151bad77a93d751978a344033e1fc890822f05f0416079338e34231/nh3-0.3.6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:905f877dc66dd7aea4a76e54bcb26acb5ff8216f720c0017ccf63e0e6035698e", size = 806699, upload-time = "2026-06-22T00:46:45.99Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a6/bfaa00046e58603507dcfc266c4778e3ab7adf68a5dedd73b6274b8d9314/nh3-0.3.6-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:25c733bee928530556b1db0ea46c52cf5aa686146e38e60a6fc7cb801ef91cec", size = 835165, upload-time = "2026-06-22T00:46:47.617Z" }, + { url = "https://files.pythonhosted.org/packages/30/a8/fb2c38845efb703a9173bffdfc745fc64d2b0e55cfc73a3647d2f028250c/nh3-0.3.6-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f90d9a0cfdbee218994fdaaeeb5a0fde62d08f35e4eef0378ec1e2200172fd0", size = 858282, upload-time = "2026-06-22T00:46:49.276Z" }, + { url = "https://files.pythonhosted.org/packages/68/17/06e72a18ee9b572914447338237ca7eb164c0df901f141bc10d1282247a2/nh3-0.3.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:82ca5bf427ad1b216b65ede1a2e2d87dc49bec417ceba0f297213107d3cd9d78", size = 1014328, upload-time = "2026-06-22T00:46:51.026Z" }, + { url = "https://files.pythonhosted.org/packages/11/f9/3966c61455668c08853bf5e33b4bed93c421f3194ce4de896dc248d6f6ce/nh3-0.3.6-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f5ed5fe84aee7f39db95c214a7421bf0499fbf500fec6d86a4e29bfc37971438", size = 1098207, upload-time = "2026-06-22T00:46:52.674Z" }, + { url = "https://files.pythonhosted.org/packages/19/d3/479cb4ae440424825735d60525b53e3c77fd60fd6e6afc0e984f00eb0178/nh3-0.3.6-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:082675ff87b9385ec430ffe6d5847ba7456cc39b73720cd4add472f9f4cffd56", size = 1056961, upload-time = "2026-06-22T00:46:54.335Z" }, + { url = "https://files.pythonhosted.org/packages/17/0c/6cdb5ee1e127be50dc8391e54bddc1f64e87bf4bfad0c55633320e2e02db/nh3-0.3.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36d06341bd501240d320f5942481ed5e6846136b666e1ba4faf802b78ebc875f", size = 1033829, upload-time = "2026-06-22T00:46:56.258Z" }, + { url = "https://files.pythonhosted.org/packages/e9/55/9de666ad975d6ccd77d799ea0add55ee2347aa81286ce21b2a97c070746b/nh3-0.3.6-cp38-abi3-win32.whl", hash = "sha256:5276ef17bdba9ad8040575c74072008b13aae429436e9d0429e718bb5f90f4da", size = 609081, upload-time = "2026-06-22T00:46:57.665Z" }, + { url = "https://files.pythonhosted.org/packages/82/fa/2b5d684e3edf1e81bfd02d298c78c3e3da77ca1d8a2be3183a79544a7548/nh3-0.3.6-cp38-abi3-win_amd64.whl", hash = "sha256:f338ac7d594c067679f1e99b4f5ec3906842979560f9d8f15d6bdfa39a353b10", size = 624461, upload-time = "2026-06-22T00:46:59.163Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e5/7cafee2f0413ca4cb0ef3bd111e94d408a48810008b283ad8aee00dd1809/nh3-0.3.6-cp38-abi3-win_arm64.whl", hash = "sha256:69f365963f63a1e9bff53bdbb3c542c7c2efed3e163c9d5d83a772a2ac468c21", size = 603060, upload-time = "2026-06-22T00:47:00.596Z" }, ] [[package]] @@ -3018,23 +2826,23 @@ wheels = [ [[package]] name = "nodejs-wheel-binaries" -version = "24.19.0" +version = "24.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/76/7e97195e14346598565a0de4ca8bdbd5e634b3fb5b1ba590b7b1b89f8a63/nodejs_wheel_binaries-24.19.0.tar.gz", hash = "sha256:db217eef8cab8551667863379b08db4d9067403f6cbbe87481eb40edceb8aa9b", size = 8058, upload-time = "2026-08-19T21:47:19.671Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/22/2a5beb4e21417c73233d9f65cf6f3e96e891b80d2f550a8f630ebc6b88c6/nodejs_wheel_binaries-24.16.0.tar.gz", hash = "sha256:c973cb69dc5fd16e6f6dc6e579e2c3d5534e2a1f57619dddf5ba070efa7dde37", size = 8056, upload-time = "2026-05-30T16:52:09.807Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/52/0774b52c7be8151ad9d5aff44edc100c3f13d6d8eb3765f63ffa40e69fe8/nodejs_wheel_binaries-24.19.0-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:e12cbfd69089504e42fb14194ce734a9dcf3eb38c820ca63dd511d36fb964e9c", size = 56047203, upload-time = "2026-08-19T21:46:43.448Z" }, - { url = "https://files.pythonhosted.org/packages/67/3a/4fdbbfecf2c23d52c0e3f68de7f7c1b3c97a26d328c69c5f6c49c48e340e/nodejs_wheel_binaries-24.19.0-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:1c890adf4b7e6556ccc1ca66c866bb81884b6c9a581dee4e530dc7f78fb9d514", size = 56219459, upload-time = "2026-08-19T21:46:48.45Z" }, - { url = "https://files.pythonhosted.org/packages/5f/a8/0147149415195c59b8a72a594916bfb80d6be4d586f9fbfda313889e0efc/nodejs_wheel_binaries-24.19.0-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:4e029dadfae1295876063c96b236f673487e8c27379fe146c1e2250283520227", size = 60588256, upload-time = "2026-08-19T21:46:53.298Z" }, - { url = "https://files.pythonhosted.org/packages/f4/89/6631d0982353da1bb7bc00bb1988f702822c62b42634f57999ee53b5c337/nodejs_wheel_binaries-24.19.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:4196a947bcc883f2003ab101762d729f3e99b5e86b75bd09151563403e2eceb8", size = 61123607, upload-time = "2026-08-19T21:46:58.117Z" }, - { url = "https://files.pythonhosted.org/packages/32/a2/fa30f0841e4602995782e124359f9b910c7b481d98decf61ef0b2fc3ebfb/nodejs_wheel_binaries-24.19.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:352e048ab4dd35e7de5f338d1cc4fcbf77a0e93da30bf7336a8217ee246b31d7", size = 62632842, upload-time = "2026-08-19T21:47:03.42Z" }, - { url = "https://files.pythonhosted.org/packages/18/01/22d97ca72213f66cc386ee638db30c2e62757fdf761c6029074bced83d1c/nodejs_wheel_binaries-24.19.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:28d078b2ced9e2069516e652dc4b1380e7a1a7f2d3934eccd1611586d283ba4c", size = 63250653, upload-time = "2026-08-19T21:47:07.938Z" }, - { url = "https://files.pythonhosted.org/packages/88/d1/e3be8fa327a795bcaf7a19cd84299e338a7bce32ff0665fdce9cfa22573c/nodejs_wheel_binaries-24.19.0-py2.py3-none-win_amd64.whl", hash = "sha256:67e3abeb9c3830cae8c8487ae8a2af7cc27dfa75af06145cee5ca7d1857c81bd", size = 42448503, upload-time = "2026-08-19T21:47:12.093Z" }, - { url = "https://files.pythonhosted.org/packages/1d/37/34cf28ba1691a060174948a9927fe61091982d6048b2e403071a9acce443/nodejs_wheel_binaries-24.19.0-py2.py3-none-win_arm64.whl", hash = "sha256:d9074c665ea68b04e183d82482c86dc907d3a9bd15eb6cf85542cb785266bb36", size = 40090155, upload-time = "2026-08-19T21:47:16.032Z" }, + { url = "https://files.pythonhosted.org/packages/83/d1/68b43b53cd0fa83ae6fd406705023ca988d9e0ca41c724d82e66fbeb2ef6/nodejs_wheel_binaries-24.16.0-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:d9f8f677dcf30e37ac244f07869726abe043f01eb0f45722b1df31cc2af7093c", size = 55666374, upload-time = "2026-05-30T16:51:39.588Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b2/40a989159599080da485de966c4c2d207e852ac7aa7864702626d96c8bf5/nodejs_wheel_binaries-24.16.0-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:3d0370fe7120ce9697a4f60d40480d2bd8808d9f30131458d5afc0040d4e5a51", size = 55838487, upload-time = "2026-05-30T16:51:43.383Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a7/cd42174fb5ff6faff7fa8d326a18914d8f232098ab5de055b57c16fa13ca/nodejs_wheel_binaries-24.16.0-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:85dc92bbb79c851569c5925dcc2a4c915a034efab375f99e4e7e6bbe9cca8342", size = 60179540, upload-time = "2026-05-30T16:51:47.036Z" }, + { url = "https://files.pythonhosted.org/packages/2b/95/c8a1f9ae140aa28df8744d984d01d4b3af7cdd6555af12127f40ceb45a7d/nodejs_wheel_binaries-24.16.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:2f3036292811514ba847b3708492644764f88a833ac425c5f55007014308ddfd", size = 60716262, upload-time = "2026-05-30T16:51:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/7c35b3737f59e36d0249c265397b7bff570519b95301d6e16ea361e904ad/nodejs_wheel_binaries-24.16.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:db8a8a76ebd2b28ecbfc9ad464baa3707241b9e050a30e2efdf6f60c0f886502", size = 62230592, upload-time = "2026-05-30T16:51:55Z" }, + { url = "https://files.pythonhosted.org/packages/04/96/d931255cf9d11a84d6b54d882dba7434646467d568ccf070ea3418638df3/nodejs_wheel_binaries-24.16.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f1a3d8f7b4491cbbd023ba3fc4e901fcca2d9fb80d57f24ba3890de8b1dbac03", size = 62841759, upload-time = "2026-05-30T16:51:59.407Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7b/8b7a3f41bc255411be30b6d7d288aab8ffd9ea2055db8555ced3548007b9/nodejs_wheel_binaries-24.16.0-py2.py3-none-win_amd64.whl", hash = "sha256:bb136be9944f0662dcf1120f45193a6b75b13fac378971a95cc42c9f879a81aa", size = 42027734, upload-time = "2026-05-30T16:52:03.348Z" }, + { url = "https://files.pythonhosted.org/packages/17/66/1ed71f1f529b8ca727d42c7ceb9db0bef145ce4a13dfc86fb50aa44f3be6/nodejs_wheel_binaries-24.16.0-py2.py3-none-win_arm64.whl", hash = "sha256:8308940b5edd0a50dc5267ea36ba21c9f668e83fe0d9f293937174d3a7e31c36", size = 39714528, upload-time = "2026-05-30T16:52:06.421Z" }, ] [[package]] name = "openai" -version = "2.54.0" +version = "2.53.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -3046,9 +2854,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/9a/8c75e8c8a5b407a0586faeb2afac91674ff955c191ecc1d6d3b6669f6788/openai-2.54.0.tar.gz", hash = "sha256:e3e6f8bc1ba30ddf381ace1a14340eed381cb984a1a59bd0f34b5be3b5d49cfa", size = 1100285, upload-time = "2026-08-11T18:46:59.035Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/cf/36e3e7235fdf6d125c052acc0970924611b17a20a4fe580596faf4566a65/openai-2.53.0.tar.gz", hash = "sha256:baf5802ad08980e1d9d561e1b996e800c8bcd14af5847c6d0e7a5cc59e4d4116", size = 1099435, upload-time = "2026-08-03T21:42:01.664Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/a8/bb76c7356de8ad57f59d5ff993d434df0607f07f08bcc9c9a5c275e399c0/openai-2.54.0-py3-none-any.whl", hash = "sha256:89089789197ccdb87f173a03145ed1598d00795220c93e96cf712b1cbf5e5f2b", size = 1660351, upload-time = "2026-08-11T18:46:56.684Z" }, + { url = "https://files.pythonhosted.org/packages/78/0f/cc6afea3542a5142c5d8fc8211c5e059a8375105d004a41dfa2c7948dbb0/openai-2.53.0-py3-none-any.whl", hash = "sha256:c694ffc747a3c4d1663ef2b07b811315a476164ee5efa3a993967349ebca7618", size = 1659829, upload-time = "2026-08-03T21:41:59.581Z" }, ] [[package]] @@ -3071,7 +2879,7 @@ wheels = [ [package.optional-dependencies] litellm = [ - { name = "litellm", marker = "python_full_version < '3.14'" }, + { name = "litellm" }, ] [[package]] @@ -3110,7 +2918,7 @@ wheels = [ [[package]] name = "openinference-instrumentation" -version = "0.1.65" +version = "0.1.57" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openinference-semantic-conventions" }, @@ -3118,14 +2926,14 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/42/b0898f2d1663b63d7b9ec565428bfc28593230703a19b16cf3071734fd0d/openinference_instrumentation-0.1.65.tar.gz", hash = "sha256:23022c090780d3470a08f2450e5eee0e89b0fe3a8f2f65c9cd6baefaceff7786", size = 43902, upload-time = "2026-09-15T16:34:42.87Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/d1/08bbd17cb66c1d7749802a30a551c132fa0ecdb1169bd13cf47fb8427132/openinference_instrumentation-0.1.57.tar.gz", hash = "sha256:2bd00a1f95ebb8a47d11615c1039128101e4abc0e9722cc4331849afdeb248fc", size = 41183, upload-time = "2026-08-07T14:29:23.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/2d/f1d99d17b9b9cb58cb3bc411bd03c517a605deaea93c8bc2fdc1fe223337/openinference_instrumentation-0.1.65-py3-none-any.whl", hash = "sha256:cb620740efe899e84b23c49ddbd6c9c8522a83992c57a23f4f5380932c9cded9", size = 51640, upload-time = "2026-09-15T16:34:41.301Z" }, + { url = "https://files.pythonhosted.org/packages/b8/50/05db6ba8da9fcf1872597f52b66b3894a1e5b78c177a50239e30de008317/openinference_instrumentation-0.1.57-py3-none-any.whl", hash = "sha256:e06f436e93156f5e0cfedf3f34bde1a386f8e00dbff528155a506ce74c72af92", size = 48872, upload-time = "2026-08-07T14:29:21.632Z" }, ] [[package]] name = "openinference-instrumentation-google-adk" -version = "0.1.28" +version = "0.1.19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openinference-instrumentation" }, @@ -3136,14 +2944,14 @@ dependencies = [ { name = "typing-extensions" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/a3/4792b4daf0eb74c64a2f9fbb1a7ad0a750fc504c93b429a4d33760865893/openinference_instrumentation_google_adk-0.1.28.tar.gz", hash = "sha256:7729d852fd1bb23bb38465599681c03e6cf39b9f014fbc9da2d8ef0bdbd66f5b", size = 19079, upload-time = "2026-09-15T04:52:21.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/ff/98da57926c54b5474bb723ec31c3fb635d8e55b2a55c55005157836e8241/openinference_instrumentation_google_adk-0.1.19.tar.gz", hash = "sha256:01cfcfa0d903d7109aa4985393e105ef91a5cded987e117742dab09323ec9d6a", size = 15251, upload-time = "2026-08-07T14:29:17.696Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/e3/c9ce7f564e3fe5b185ad0bdb84e6eea07e919590e9b3149979421ad094a6/openinference_instrumentation_google_adk-0.1.28-py3-none-any.whl", hash = "sha256:baede62c35d49547f0b074fd3a5d1c062434d928b7d5dca98d9b9ca1ed8d0519", size = 21278, upload-time = "2026-09-15T04:52:20.774Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7b/8d73cb8fa002f122118e62f5a04644a0425b18e6db313536761b0aac3929/openinference_instrumentation_google_adk-0.1.19-py3-none-any.whl", hash = "sha256:f9fb649442c3caf96eabb5c8b3abfef5c5b3b48892dfbfe71f6e1ca712cede20", size = 17195, upload-time = "2026-08-07T14:29:16.347Z" }, ] [[package]] name = "openinference-instrumentation-openai-agents" -version = "2.4.1" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openinference-instrumentation" }, @@ -3154,47 +2962,47 @@ dependencies = [ { name = "typing-extensions" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/1a/5493d664baf3893f68c3441b5e7291c2f027f63d3d5d4f58e28389529419/openinference_instrumentation_openai_agents-2.4.1.tar.gz", hash = "sha256:4bcfe61d39ba914b510832096af7030472fbac0df66854bd116f60f67642adee", size = 35334, upload-time = "2026-09-10T05:43:20.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/e9/434dc8bbd7bae3b2353c88e030798f1464c495e0d72e79ac008c534c8692/openinference_instrumentation_openai_agents-2.0.0.tar.gz", hash = "sha256:c8043208da0ca53d91d360bb0470ec9b069526cb43588f9e324d7d6468ea7772", size = 31325, upload-time = "2026-08-07T14:29:14.287Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/08/65ea6e5dd68ba810e33a5c60673764efa65ddb5409807862acb5b3a2504a/openinference_instrumentation_openai_agents-2.4.1-py3-none-any.whl", hash = "sha256:c43857c9738bc785ab482d91644e0dde5be9275e3038a2000b85b3a8e1d38237", size = 38508, upload-time = "2026-09-10T05:43:18.828Z" }, + { url = "https://files.pythonhosted.org/packages/df/09/649bb040e56286037ec7230aa1980c40668b8e93300d1aefd38a8d3ee570/openinference_instrumentation_openai_agents-2.0.0-py3-none-any.whl", hash = "sha256:4b09627a42c3279e9928ea8172763c0a1d0c1664bcd19ef46f77082552b73f72", size = 34338, upload-time = "2026-08-07T14:29:13.216Z" }, ] [[package]] name = "openinference-semantic-conventions" -version = "0.1.38" +version = "0.1.32" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ea/a8/b2094f8fb53d9b76c9772e9117c04c13fb089e54cd0f5cdc4e91975410db/openinference_semantic_conventions-0.1.38.tar.gz", hash = "sha256:612b41645c7591f2f6cc0ee9cead94cba395d7cfc5bc9759abb2de6d0cf998d3", size = 14573, upload-time = "2026-09-15T04:52:30.296Z" } +sdist = { url = "https://files.pythonhosted.org/packages/05/5e/13ffdb2ba436312cda9ed842ce3416fa5961e36a205df9a18a67eef7f9b3/openinference_semantic_conventions-0.1.32.tar.gz", hash = "sha256:2a3e6723ddce37abc5c43d38c6c7ac05b0f2efcfbe75cc0f135ab14ceb0730f7", size = 13980, upload-time = "2026-08-07T14:29:21.035Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/18/4c4dd2575ce3975b727c6349d26370863b4c8e2dfe83cc3d07fdcd7ff3f6/openinference_semantic_conventions-0.1.38-py3-none-any.whl", hash = "sha256:b747b9eae63c3075edb90f632f52f93b8afed62548519951fbb80253865c53f7", size = 11691, upload-time = "2026-09-15T04:52:29.002Z" }, + { url = "https://files.pythonhosted.org/packages/9d/19/2d096333313d45e5f87d08f903cedc3f7298c5690d2e6c4ef236dc22870e/openinference_semantic_conventions-0.1.32-py3-none-any.whl", hash = "sha256:d06c4716faf7537fbabbb6d34e758ec6b3650a18c037661782fc8c3e9fa90f81", size = 11252, upload-time = "2026-08-07T14:29:19.78Z" }, ] [[package]] name = "opentelemetry-api" -version = "1.43.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/cc/e4c9584181f86494df0f6bdec1a4f3280c50db44704dc2a407e994fc87bb/opentelemetry_api-1.43.0.tar.gz", hash = "sha256:107d0d03857ea8fc7c5fcbbbd83f800c281f0d560553d61c1d675fccfd1761c1", size = 73476, upload-time = "2026-06-24T15:19:55.323Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/1c/125e1c936c0873796771b7f04f6c93b9f1bf5d424cea90fda94a99f61da8/opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716", size = 72296, upload-time = "2026-05-21T16:32:49.335Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/83/6dba32b85f31868400440dc7ad2ca1eab94cbbf3a7b0459ed39f8311a9e2/opentelemetry_api-1.43.0-py3-none-any.whl", hash = "sha256:20acf45e9b21851926835292e4045d290acade1edd2ff3de86d2f069687ba1fd", size = 61912, upload-time = "2026-06-24T15:19:35.434Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ca/9520cc1f3dfbbd03ac5903bbf55833e257bc64b1cf30fa8b0d6df374d821/opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714", size = 61311, upload-time = "2026-05-21T16:32:28.822Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.43.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/c1/e8098490ab15abf116dcaf9fa89ededcb35547c7d08d4b5a62f573dc1e63/opentelemetry_exporter_otlp_proto_common-1.43.0.tar.gz", hash = "sha256:c4e32ba6d6b13bdb2b8f6764c4fd28d00192826561aa04f6d14eedfce7ac076f", size = 20197, upload-time = "2026-06-24T15:20:00.247Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/9c/216acfeaedadf2e1937f4373929b20f73197c5c4a2546d4f584b7fa63813/opentelemetry_exporter_otlp_proto_common-1.42.1.tar.gz", hash = "sha256:04f1f01fb597c4249dfcd7f8b861c902c2102369d376d9d346ff38de4469a2ee", size = 21433, upload-time = "2026-05-21T16:32:55.526Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/b2/41ebc74ae1d5859901f1b69305de58724bf043381103d6ef413521cbc35a/opentelemetry_exporter_otlp_proto_common-1.43.0-py3-none-any.whl", hash = "sha256:123c3f9cc87218562490c63b36f497bf3a722faf174a515d1443f31ababa6264", size = 17048, upload-time = "2026-06-24T15:19:41.264Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/2375e7612e1121a4518c17603b6e0b03ad94f565aafad53f464dc5be2bf6/opentelemetry_exporter_otlp_proto_common-1.42.1-py3-none-any.whl", hash = "sha256:f48d395ab815b444da118868977e9798ea354c25737d5cf39578ae894011c140", size = 17327, upload-time = "2026-05-21T16:32:33.387Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.43.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, @@ -3205,14 +3013,14 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/1d/6336453716ca0a240d4417d19e6d5b77a5e7163e5670ec4f7ec4d3ede7bf/opentelemetry_exporter_otlp_proto_grpc-1.43.0.tar.gz", hash = "sha256:1b3e0627daa9bc21884d4a13946807c255eb558bfe5bdd543dffb6f4c9faee0d", size = 27213, upload-time = "2026-06-24T15:20:00.907Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/87/ca7fc790dfdbcf4f9e9aab14a39ef1b7508ead13707e283de0b3131478d2/opentelemetry_exporter_otlp_proto_grpc-1.42.1.tar.gz", hash = "sha256:975c4461f167dd8ed8857d68d3b6b25f3d272eab896f6a9470d0f5b90e2faf15", size = 27140, upload-time = "2026-05-21T16:32:56.162Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/74/2700b5d5c946bf2dba87073fce3dfc198c46bc92ea3d5693f54bc51c90b1/opentelemetry_exporter_otlp_proto_grpc-1.43.0-py3-none-any.whl", hash = "sha256:6a10d1feacffffda19acacbf277b736094b1e2f4dbb98c90ccb2c6e1962e2ec6", size = 19626, upload-time = "2026-06-24T15:19:42.233Z" }, + { url = "https://files.pythonhosted.org/packages/89/2b/28ba5b128f47fe8c3bab541000d6feb4b5a9bd26623ca013406f01c0fb60/opentelemetry_exporter_otlp_proto_grpc-1.42.1-py3-none-any.whl", hash = "sha256:0ae1177e2038b18a929b3098215243631ef91136cba26b7e2b12790ceb7e87cc", size = 19617, upload-time = "2026-05-21T16:32:34.278Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.64b0" +version = "0.63b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3220,49 +3028,49 @@ dependencies = [ { name = "packaging" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/97/02fe6e1c8b1ffac42d0b429c18080edb24e0e0d18c86612edf72b5752382/opentelemetry_instrumentation-0.64b0.tar.gz", hash = "sha256:b47d528dead6271d7743114417eb67fc915bd9258111c48dbf9a4951d2efa88d", size = 41935, upload-time = "2026-06-24T15:19:12.951Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/6d/4de72d97ff54db1ed270c7a59c9b904b917c0ac7af429c086c388b824ddb/opentelemetry_instrumentation-0.63b1.tar.gz", hash = "sha256:32368d6ae52c8de20aa790a6ad86b10a76f09956092337ae37d675773990e541", size = 41081, upload-time = "2026-05-21T16:36:14.206Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/0c/cb9fe342de5299c7af24582eb7d788661cc53a1c4b904da92309caaa9417/opentelemetry_instrumentation-0.64b0-py3-none-any.whl", hash = "sha256:133ab7ffca796557aec059bf6be3190a34b6dea987f25be3d9409e230cbdad8b", size = 35880, upload-time = "2026-06-24T15:18:17.277Z" }, + { url = "https://files.pythonhosted.org/packages/35/a1/9314e621c143e4d82a5bf7a43c2ff7a745d31023506336857607c8c543cc/opentelemetry_instrumentation-0.63b1-py3-none-any.whl", hash = "sha256:f1986716d52cc316ea5f60189098726a9071d8ecc0eee96c9ed110be08bade9c", size = 35577, upload-time = "2026-05-21T16:34:56.818Z" }, ] [[package]] name = "opentelemetry-instrumentation-threading" -version = "0.64b0" +version = "0.63b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/ef/d4a16eb4a0f0971e351ec2ff95846b501b66a619d07d90822942d70a3adc/opentelemetry_instrumentation_threading-0.64b0.tar.gz", hash = "sha256:0a07d7329f69dfae5036a7cb184f502c8b91cb0538012f5304bd32ffe9ade451", size = 9080, upload-time = "2026-06-24T15:19:43.22Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/90/7b0279192fab614d57af3d57584ef7ac9e38fa3df0b1d412224f6f55a85b/opentelemetry_instrumentation_threading-0.63b1.tar.gz", hash = "sha256:afa8c2cada8ed136f07b04dc8739bc861a15e9a5edea1a65e4c5e1919c62946c", size = 9080, upload-time = "2026-05-21T16:36:49.977Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/b3/8838d5f3db35b3854516ccfbf8ec26138d40388d828407182c890c3aa9d0/opentelemetry_instrumentation_threading-0.64b0-py3-none-any.whl", hash = "sha256:a285ffa750a958f7d368e947f5679a0214d588242cbffba0f5934cb02e9a17f4", size = 8487, upload-time = "2026-06-24T15:19:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/c9/3d/3a991a4fcdf5ac82c04215e38cea4e73ad63713707014f9a70d1ab257f5f/opentelemetry_instrumentation_threading-0.63b1-py3-none-any.whl", hash = "sha256:33059298e68c94b13c38b562ad28799ec16a2fd06182ebfc762bb4e956e55d94", size = 8486, upload-time = "2026-05-21T16:35:58.084Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.43.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/b9/d357faefb40bda1d4799913e6af611171ff22a2dedcb93576bc92242d056/opentelemetry_proto-1.43.0.tar.gz", hash = "sha256:224778df17e1f3fafeaaa21d874236ca5f6ffc2f86e0899298ec7351aac27924", size = 46481, upload-time = "2026-06-24T15:20:07.625Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/55/63eac3e1089b768ba014091fdd2ae8a9a440c821ef5e2b786909c94c8836/opentelemetry_proto-1.42.1.tar.gz", hash = "sha256:c6a51e6b4f05ae63565f3a113217f3d2bfaec68f78c02d7a6c85f9010d1cfca6", size = 45839, upload-time = "2026-05-21T16:33:03.937Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/a7/3e5308cf548b8f72529c7db1afdb3a404211982376a12927fd7759f77bf3/opentelemetry_proto-1.43.0-py3-none-any.whl", hash = "sha256:c58f1f7ef84bc7dc2834016c0c37fe0081dde7ca9f6339be1970fbf9cdaaa90d", size = 72489, upload-time = "2026-06-24T15:19:51.164Z" }, + { url = "https://files.pythonhosted.org/packages/41/9d/171c02c84a76940b7e601805b3bb536985aded9168fbcc9ba52f0a730fa2/opentelemetry_proto-1.42.1-py3-none-any.whl", hash = "sha256:dedb74cba2886c59c7789b227a7a670613025a07489040050aedff6e5c0fb43c", size = 71782, upload-time = "2026-05-21T16:32:44.867Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.43.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/eb/5041074274ac0956b03637cc039d434569112468e875eddfcc9a0674ce06/opentelemetry_sdk-1.43.0.tar.gz", hash = "sha256:d8187c81c162df9913e4003dd6485f7390d9a24fc17026ec7387b8b8218b08e9", size = 254744, upload-time = "2026-06-24T15:20:08.467Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/f7/b390bd9bfd703bf98a68fea1f27786c6872331fd617164a54b8a59bdc008/opentelemetry_sdk-1.42.1.tar.gz", hash = "sha256:8c834e8f8c9ba4171d4ec843d0cb8a67e4c7394d3f9e9297e582cbd9456ddbf7", size = 239262, upload-time = "2026-05-21T16:33:04.641Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/e3/b17be23af124201c9f52eececd4cc8ddfed1597d37b4ee771895d325805c/opentelemetry_sdk-1.43.0-py3-none-any.whl", hash = "sha256:d1323a547c1ce69d6a069a17a44b7da82bb8b332051ecb074041f87642c86823", size = 178852, upload-time = "2026-06-24T15:19:52.169Z" }, + { url = "https://files.pythonhosted.org/packages/8f/6b/4287766cfbde577ae2272e8884abac325aeaac0d64f41c61d5b8cc595105/opentelemetry_sdk-1.42.1-py3-none-any.whl", hash = "sha256:083cd4bbfaa5aa7b5a9e552430d9951219967cfb27aa61feb13a77aba1fc839d", size = 170907, upload-time = "2026-05-21T16:32:45.894Z" }, ] [[package]] @@ -3279,87 +3087,96 @@ wheels = [ [[package]] name = "opentelemetry-semantic-conventions" -version = "0.64b0" +version = "0.63b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/30/5f26df29509eccd86b99b481ac9ffa39da49ba9577cc69071c552ae30447/opentelemetry_semantic_conventions-0.64b0.tar.gz", hash = "sha256:72f76fb2d1582d9d033dd1fcd84532e961e6ff3d90d24ba6fabc72975a83864c", size = 148340, upload-time = "2026-06-24T15:20:09.267Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/99/4d7dd6df64795951413ce6e815f8cf1eb191daf7196ae86574589643d5f3/opentelemetry_semantic_conventions-0.63b1.tar.gz", hash = "sha256:3daf963611334b365e98a57438183eb012d3bfb40b2d931a9af613476b8701a9", size = 148340, upload-time = "2026-05-21T16:33:05.455Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/ca/23ba87a221b574a7c5a99d48849d80bfe8b047624681357e2b002e566187/opentelemetry_semantic_conventions-0.64b0-py3-none-any.whl", hash = "sha256:ea77e85e354b8f604ddbe5f3d9135216f982fa4d77e5859ac30f6d8a50505aa6", size = 203713, upload-time = "2026-06-24T15:19:53.339Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7a/7fe66f5f3682b1dd47d88cc4e11f1c6c0966b737de2d16671146e23c39a5/opentelemetry_semantic_conventions-0.63b1-py3-none-any.whl", hash = "sha256:dfe5ef4dee82586b746f522b818ceb298d00b3d59f660042bd79404bff8d0682", size = 203713, upload-time = "2026-05-21T16:32:47.016Z" }, ] [[package]] name = "orjson" -version = "3.12.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/f3/742fb1f62b825f2c010697eaf4e828004bc2a81e7e806666989c132c7c42/orjson-3.12.0.tar.gz", hash = "sha256:d14203fb1aae2ad9b3d52f8a0e82aeb10197ef1c9bc61da7f358bd70b00123d5", size = 4142915, upload-time = "2026-08-14T16:13:30.607Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/35/819eeb4fa8ee676d38fdbb8213a76fd496f7dbbfdfafa89d34e02b22dfac/orjson-3.12.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:747843254519dd43b93eee3153a19e5a509334320c4d2f823ec879232db5c796", size = 224133, upload-time = "2026-08-14T16:12:00.607Z" }, - { url = "https://files.pythonhosted.org/packages/58/ab/d9221d4a2b085b073fcddc91728d490f20b9cf010c62c2f42371ab997695/orjson-3.12.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:7c2ad193c8004254f34b499f3bd2c80f043d10754aff2b38f93da574f4883f98", size = 113669, upload-time = "2026-08-14T16:12:02.126Z" }, - { url = "https://files.pythonhosted.org/packages/15/12/644cbbcabb26df61d9ef0c66e6f2bf8b687cc7b66137597f2858951f1952/orjson-3.12.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bc7a872f03522d90e0429e6c0c5cd23084f767bedcb4c58048eec19294613344", size = 130410, upload-time = "2026-08-14T16:12:03.503Z" }, - { url = "https://files.pythonhosted.org/packages/14/6d/e3a8c34d687895aecd8b267a01c46106eb98d8424a83bfa7bacb723854f6/orjson-3.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18a87929f31d94a77f7dc93cf527e91f39ce7fe7813d588a4de2507efd32a387", size = 131101, upload-time = "2026-08-14T16:12:04.918Z" }, - { url = "https://files.pythonhosted.org/packages/75/20/930824c07685c22af23f26818ed3853b0270488a412b6ab757904b7f787b/orjson-3.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9683ee9ea0659da64f36574ef675b8a86330c34c19ea75db1fb93c3ff99e0ef", size = 131479, upload-time = "2026-08-14T16:12:06.11Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a6/22e863bbbe8917aa292e33e0db597000f9a07eb5e6f52efed623fa16bae1/orjson-3.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:103b5db66aa53c1f9e88c2524be4f383e831ba7dfd5f9f5af6336a177c622f11", size = 135865, upload-time = "2026-08-14T16:12:07.392Z" }, - { url = "https://files.pythonhosted.org/packages/50/a0/ceb5008914a65e9a19a46a09d94bc67a74d120209fdfa772750023ceb377/orjson-3.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd57d79aefa3f84eec851d6de7a366795b9345cfaf17f82b4820430a7a5fa241", size = 127843, upload-time = "2026-08-14T16:12:08.607Z" }, - { url = "https://files.pythonhosted.org/packages/12/3d/61c6b3b84c250cb09cb7229701ff77e4d763773ad7f577d0b6abf2892664/orjson-3.12.0-cp310-cp310-win32.whl", hash = "sha256:3dbce9b6b3074b31a5d5dd322a9c4e5b16f206091ece4194c2e36952847a105e", size = 128293, upload-time = "2026-08-14T16:12:09.819Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/ea0f4a563253b6363195a4f704123c6bfbf156641bd3be5a75de81c5e917/orjson-3.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:3bb17a06f9bd15237b3216c044209fe92597379124018cfc196fbb846cde64df", size = 122216, upload-time = "2026-08-14T16:12:11.261Z" }, - { url = "https://files.pythonhosted.org/packages/75/1a/a7075a8e8b0d3f5097d17ac3099017104b6b7b42012041147995d5b2da05/orjson-3.12.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a94f0f0c6fcbb2b5bd9734c57a489c7584a732bbdf04a39e8c83b861e9d03e92", size = 223409, upload-time = "2026-08-14T16:12:12.654Z" }, - { url = "https://files.pythonhosted.org/packages/05/34/c2eb3b2900e5597db7841a4c6416ac2d90081bd956b02d4dd1833fa2b96b/orjson-3.12.0-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:a696529ec96a90d9a5f9570207efe403c8b08f8e4aa2783ee3403511e2fdfa10", size = 124015, upload-time = "2026-08-14T16:12:14.025Z" }, - { url = "https://files.pythonhosted.org/packages/1c/df/b49081766a75b6a37b3d33bdc0a39e492abab8441dd25e3e1998e7b83fcb/orjson-3.12.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:e4ac5059baab4b3acbd99485de019ff8cda0fdf34b61fa74f7197a53db78bfe8", size = 113471, upload-time = "2026-08-14T16:12:15.81Z" }, - { url = "https://files.pythonhosted.org/packages/48/d4/58ea28eeef95c2a27358ed927380a621162cf20bd740bbccf9c3f09a200a/orjson-3.12.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8e29957429c35bbb5a185a119c523aa2428b7bbf1a293724c7b9375ed8f892a3", size = 129998, upload-time = "2026-08-14T16:12:17.503Z" }, - { url = "https://files.pythonhosted.org/packages/e2/f4/1e82aa2efc9916422d804697876ce433c907a1abd7c7e5c6d3d48565e5f9/orjson-3.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dce0166feb0a737ab84f598c9a338cbc0b764a036617aa686194f53c7eba0c3e", size = 130891, upload-time = "2026-08-14T16:12:18.762Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/15169e9d22b59a406264f99d6db387c0b0b12b6357a8a0169917c2a713eb/orjson-3.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9caf3d09f47c3c70c4451ada20ef9bc4a4cdffa26f49862cf0a253b329aae2d5", size = 131285, upload-time = "2026-08-14T16:12:20.251Z" }, - { url = "https://files.pythonhosted.org/packages/a4/3a/763dbd426290d044ec3e615a05e70adb6d8b6f95bf17dc355c0081a5e8b6/orjson-3.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b9dca132b1fda5565088e65a6b6e742285e0aeceb6fae549fa8863e16c7d3998", size = 135707, upload-time = "2026-08-14T16:12:21.652Z" }, - { url = "https://files.pythonhosted.org/packages/04/d1/3b2038ed168d22e14182ed715d6963f9c073a83a2ba43cfe918a4fc43c64/orjson-3.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a791f793b287bbc135b8e87c34e35c8bfc693e2a8a620fab1ae682b925f9a32e", size = 127669, upload-time = "2026-08-14T16:12:22.926Z" }, - { url = "https://files.pythonhosted.org/packages/88/ae/b84b3d3e65f5629ada0edcb1d2bccc55d7c5f89d8b981537ecdc3d6f31ec/orjson-3.12.0-cp311-cp311-win32.whl", hash = "sha256:31ed278a36304390adc3eec5d7f6fd593a7c3e99e5a06cd07866396c4b1b4710", size = 128043, upload-time = "2026-08-14T16:12:24.367Z" }, - { url = "https://files.pythonhosted.org/packages/35/24/2ed0e6f51ea3d0af45d807233a851175af75bec83ef5fd0d6a2601904ec0/orjson-3.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb2539159dfe8d371914f354360fa50e4a577cc89222a3828b9650a5e5040252", size = 122084, upload-time = "2026-08-14T16:12:25.813Z" }, - { url = "https://files.pythonhosted.org/packages/21/dd/95d25fcfbc9471799ef6bb01c552d64ee5cde93ee40ba2f423dd3442c708/orjson-3.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:61318b6de893c7a9d9f3e5ecbadccbfc26a7eb417ccc7bbf0771de3b4d72f868", size = 127035, upload-time = "2026-08-14T16:12:27.201Z" }, - { url = "https://files.pythonhosted.org/packages/be/4a/295da39c651c2faac8bd351a2a346f0fdedd9d50b847ee9dfc27d2207ef6/orjson-3.12.0-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:aa3e43a6846e91d7bde3d5a9c66090fcd8744f569a9b6cffc5e1ca38f6a461c0", size = 223427, upload-time = "2026-08-14T16:12:28.525Z" }, - { url = "https://files.pythonhosted.org/packages/29/98/758cf90fbeaaafb7f8141bfac75a432099959f3a2f5db93a412e876415d8/orjson-3.12.0-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:11edb4660a6680abee9788a3a9072208a2c96538cc1322bd79542065229d8e54", size = 123725, upload-time = "2026-08-14T16:12:30.013Z" }, - { url = "https://files.pythonhosted.org/packages/32/b5/5b934d251f8651f7e41df180ad0c57a6e1cabe15c7bd331638413a50ebc9/orjson-3.12.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:2d3a9da945a4d96ae758fdaaca56742e6b73b6fd554c5d8876f252a6dad70b83", size = 113375, upload-time = "2026-08-14T16:12:31.209Z" }, - { url = "https://files.pythonhosted.org/packages/cd/d2/37efb5b12a176ce3ced29f4144f20da57d02757f78ce549637dc1b4e1fc8/orjson-3.12.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:92ffc09e07233a6ab6d4e067f7841edcbcc134cb4812155cf171ea5255a421d7", size = 129983, upload-time = "2026-08-14T16:12:32.721Z" }, - { url = "https://files.pythonhosted.org/packages/50/22/0644b87c73f13e0092df8f35a1fe280d991e5e90072087411e0dd7e44e0c/orjson-3.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf44e374aadde77b1f6109f1030be51433eb61984379852766b6f4e187db7b1e", size = 130629, upload-time = "2026-08-14T16:12:34.084Z" }, - { url = "https://files.pythonhosted.org/packages/8c/57/80b986ebfecd9c6a177ddf1c2319717f0cd8feffb2b78946595a18a2fc88/orjson-3.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1192a7021b6d071aaf909864f6e924d6a2675ca360485b972b8401749311750b", size = 131245, upload-time = "2026-08-14T16:12:35.713Z" }, - { url = "https://files.pythonhosted.org/packages/80/3d/75c5ac5a69161f44492a68fbdde66f4cc4ce48cd5e1fb05918e46f0c8848/orjson-3.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:53c0c474a9d9aff9aebfc0c88de1f28f843d940e6e3a80729abdf6a20274356f", size = 135397, upload-time = "2026-08-14T16:12:37.128Z" }, - { url = "https://files.pythonhosted.org/packages/71/93/4d71f2df314a97ff0d27a4559bf5888fc8406e3c6dec90e92291e3511215/orjson-3.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:532ff8cd4bd59a327a953a7dcde922c7fc25b85e29721bb8633265430d3a3873", size = 127693, upload-time = "2026-08-14T16:12:38.627Z" }, - { url = "https://files.pythonhosted.org/packages/bc/1d/0dbc6be5adfd1730491072fb60beb6bcdf5d7b2596ee41b7fc2e298bfc09/orjson-3.12.0-cp312-cp312-win32.whl", hash = "sha256:a6cf4b18e7de173f209f2084ffbd736dd72389a396326ee80a7022168be232e5", size = 128000, upload-time = "2026-08-14T16:12:39.954Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c9/97b1ce0112ebf5e949c775ed5b1755e562233179f3584579673cc24d6378/orjson-3.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:010811c1b69773450a01cef97727a67b223242f350b77d4ca000e59a9ef2155a", size = 122106, upload-time = "2026-08-14T16:12:41.324Z" }, - { url = "https://files.pythonhosted.org/packages/a8/6a/facd8b312e4a0d3a7fa978c7e15821f74a336adf1d65529faec33b48e18b/orjson-3.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:ad29eece0c601737f2a60edc2752a84e7a0785df3efb62e3012834700a5afe0d", size = 126869, upload-time = "2026-08-14T16:12:42.651Z" }, - { url = "https://files.pythonhosted.org/packages/54/cb/d7b78218a987eb8a8ce4eeae0286b1bb679333eb631ea0eeaf6371680bfc/orjson-3.12.0-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a36ec60f1796f9a3f13e3b98390295e17a1c7c10155b448d264098bf9ee5900", size = 223397, upload-time = "2026-08-14T16:12:44.003Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4a/bc87c45e7ec639d35ebefd62618e01939531ac8e171426606a01bda05914/orjson-3.12.0-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ad0422b92d5195443a39f80c3bcf731cc2e00f153bd32063a47b73b057bd0f03", size = 123662, upload-time = "2026-08-14T16:12:45.433Z" }, - { url = "https://files.pythonhosted.org/packages/94/ee/c9a4ff3f2dbedbbe9e635d0fa72c8866adede09b6335ef9644f53752f0d8/orjson-3.12.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:5a0fdbc216388f653d3752ff310e710f59253bd4ed6a2bfb3f4f06b84714bbd8", size = 113374, upload-time = "2026-08-14T16:12:46.755Z" }, - { url = "https://files.pythonhosted.org/packages/75/09/3f330a026a796c8b4c97a6f429652a5e912e7065039bf96ed25e42aa7b25/orjson-3.12.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:2eb5c56e534127b2b8fa38d2363c8b1b8190367ee0d1d16c041517d880843b94", size = 130029, upload-time = "2026-08-14T16:12:48.06Z" }, - { url = "https://files.pythonhosted.org/packages/7d/40/094cc53126a3d22f76cdf83b6ea67338bed01d774037621a785aa8e6e5ea/orjson-3.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:784106539f4b9d4b930e0b4eb8d45168507dae001945e71b4675a367f1e5e806", size = 130528, upload-time = "2026-08-14T16:12:49.362Z" }, - { url = "https://files.pythonhosted.org/packages/bc/74/89bb236deb9565f99434b13052bb40ddfcce4adf3afbfa3132ee7e421468/orjson-3.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c680706fc8396d95e7c4c1f9482563f552137aef91b57237a3ad5aaf64629df", size = 131075, upload-time = "2026-08-14T16:12:50.692Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ac/1176360d762c01b5bd34acd56fc098e936c491363d8b6b397ad4aa475547/orjson-3.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:83445adc40cba26d6d621185a45128ce455b766af368cad2ab64b970603a7978", size = 135321, upload-time = "2026-08-14T16:12:52.114Z" }, - { url = "https://files.pythonhosted.org/packages/7a/02/bbd881c8b9276d50b998de38b4e97de8ace1aac940b0ee545aedbf65ed00/orjson-3.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:644d005bc82f917337a95ce270c9f6f92f9834c2bed7b1477572f8db00784222", size = 127472, upload-time = "2026-08-14T16:12:53.517Z" }, - { url = "https://files.pythonhosted.org/packages/8e/02/a0934d7503e6dcbedd6afac3e7f3f8597fd09389949ad94d0f7540e9dbca/orjson-3.12.0-cp313-cp313-win32.whl", hash = "sha256:d8e78d3d93705e3d27cc17cdb209e44d7a8ea203010cac6ce9c7ffc1ae1996f1", size = 128000, upload-time = "2026-08-14T16:12:55.14Z" }, - { url = "https://files.pythonhosted.org/packages/52/87/69f98f8d40faff103a965a5fbb83f08241b01beaf92badb5413fbc9358cc/orjson-3.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:b85931be5b6763c31283805c9bdaae1ca03ad9f6f12a15f1cbf6745b907932c2", size = 121841, upload-time = "2026-08-14T16:12:56.507Z" }, - { url = "https://files.pythonhosted.org/packages/e6/07/b83046a4e3cadcc0987d0f160696107c4af706a619b56e4ad01940cadadf/orjson-3.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:6a31348d7dfa64cd9c78bd1f510ff44c48fe64d71094e6b90e364dba3b55949e", size = 126765, upload-time = "2026-08-14T16:12:57.806Z" }, - { url = "https://files.pythonhosted.org/packages/12/9d/3931253e6f3148abf2cbe14830367042a4806b362ea520df2303db188fb9/orjson-3.12.0-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9e6fee342a48760e854d743e7a81534d8e2925a6f46e09f750cf56b50fd1de5d", size = 223391, upload-time = "2026-08-14T16:12:59.184Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0e/b4a4f1e305367245877b967a0bad70fcf001d77c54ac4339a120b66fdae4/orjson-3.12.0-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:8c3bb86dd10f39b3fbf434b7d5dc7cac77d6fc8ac572ae30a10731ede2c4b647", size = 123659, upload-time = "2026-08-14T16:13:00.548Z" }, - { url = "https://files.pythonhosted.org/packages/96/f3/6782c6fa85e2702bc66be183c3b421486167dcf266ee4dc1403fe3824870/orjson-3.12.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:2bb3ce43203936072dd8b4917b01d3aecfc02329bfb42510cb7cfb24708adc9c", size = 113337, upload-time = "2026-08-14T16:13:02.009Z" }, - { url = "https://files.pythonhosted.org/packages/bf/79/b32ab64bacda9d0fa4942ef483bd03cabf0eaf2be819ca9fb7ff610c559d/orjson-3.12.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:6a2a79c89984dc719817d388c8709e0efc2a2795a934eaa746b4882eb6045adc", size = 130112, upload-time = "2026-08-14T16:13:03.404Z" }, - { url = "https://files.pythonhosted.org/packages/ee/49/6e6142999ca01509219be5e5a9c338a3e5ea011f63e91ff473fbbf3734ed/orjson-3.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f06dd838d1e07d9b1de0932ec0485ec92c4d5f5d1ad4817a656268c3e88be1e1", size = 130520, upload-time = "2026-08-14T16:13:04.798Z" }, - { url = "https://files.pythonhosted.org/packages/49/d0/3745af0a4cc9867784f29722929cec4d10bd1c877cd754b01ba6d96eb21a/orjson-3.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6b11be792c3d2c6a4be2af4ebf97a68d0bf5f580aca6e86a418a354f6cc846a", size = 131053, upload-time = "2026-08-14T16:13:06.14Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f4/6fe5a22fa478fffb190e65c338c84df5c311ef597b363150a17cc57063c0/orjson-3.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:477ecaf6b9f88f873341b91fcc736119ca81b5e002a9f7f308ff5b4f2ce2a70e", size = 135321, upload-time = "2026-08-14T16:13:07.544Z" }, - { url = "https://files.pythonhosted.org/packages/ff/41/b1b0ec30289646a81a76e2dbaae2686b96fcccb7cb0323dc1dd78cbc7875/orjson-3.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f3c0683136acdc29afdf88a5bc2f7d3d0e34087788d1d63c0144b805a87a196f", size = 127485, upload-time = "2026-08-14T16:13:08.88Z" }, - { url = "https://files.pythonhosted.org/packages/bf/2b/277404bdcc21c93b112b963655b76443ebfe828f8a3ff1de7d90f8850eb3/orjson-3.12.0-cp314-cp314-win32.whl", hash = "sha256:d39f3f5c3927e2dc0913fe5bbc1a2f6b1b9d1bba1de6358340d0ad0d0c00ca92", size = 128048, upload-time = "2026-08-14T16:13:10.305Z" }, - { url = "https://files.pythonhosted.org/packages/41/2b/395b36fa2b4ce7af70b651d715e88f80d884b2c2b14a6b53e84d554fb5f0/orjson-3.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:0b1ac5bf6609b2716c7954011c5fef6254922df029f45d032ee4ebf5d363cbed", size = 121858, upload-time = "2026-08-14T16:13:11.634Z" }, - { url = "https://files.pythonhosted.org/packages/ea/a3/833e895ff452859eebe75093d26691fe9108f1a7a6a08435d7a5780ea652/orjson-3.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:50fae885cb073eac7556353ff3df93312b0d5137b0a5056b2bb63f97ed9a93c7", size = 126749, upload-time = "2026-08-14T16:13:13.117Z" }, - { url = "https://files.pythonhosted.org/packages/58/64/99c8947ece10c17176af9aae85c4948f1d109da77440ec14d87239efaf73/orjson-3.12.0-cp315-cp315-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:01efac2074fffb4cb1ea3fab7861e9d0f2a26913854a972f5ac760525dbdaf6e", size = 223398, upload-time = "2026-08-14T16:13:14.694Z" }, - { url = "https://files.pythonhosted.org/packages/3e/30/cf983fe09f2731420fda097a9f7ef4343f47fa216c228961ad8f6da44f3d/orjson-3.12.0-cp315-cp315-macosx_15_0_arm64.whl", hash = "sha256:ed4ca42bd55955aa34deedcfdfd0e0c31abf51143aae158ae2bc3520b626e517", size = 123655, upload-time = "2026-08-14T16:13:16.221Z" }, - { url = "https://files.pythonhosted.org/packages/11/50/9cb8ae73fa4749dbbc20f617004213b5ff01c20aaeec34c3f31124f2c1d8/orjson-3.12.0-cp315-cp315-manylinux_2_39_aarch64.whl", hash = "sha256:40f92192227505acca4e2533ce565f8e6b9535f7d0d09b0968452f18b7376b38", size = 130515, upload-time = "2026-08-14T16:13:17.601Z" }, - { url = "https://files.pythonhosted.org/packages/9f/0a/adb6ce1a5b5fbf9cb1790f9961bb668a0dd5429aadaf6cee044724681795/orjson-3.12.0-cp315-cp315-manylinux_2_39_armv7l.whl", hash = "sha256:33efefcf5d88eaf400b47e2eba02f91f319bb9951be61ca500b7d536d3f2079d", size = 113327, upload-time = "2026-08-14T16:13:18.927Z" }, - { url = "https://files.pythonhosted.org/packages/51/5c/d17f61581d8dbdde7048f87a330fa24915edec38db4d72b381fec14fbb56/orjson-3.12.0-cp315-cp315-manylinux_2_39_i686.whl", hash = "sha256:8e386b0bc0ddd7cd2056f884b5a0af33592bd01ac66a7ca4b42a65a7e7774a13", size = 130105, upload-time = "2026-08-14T16:13:20.317Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b7/938befcf33bee4704a92ecec6a2731224c539d939bf9429fd39396d28931/orjson-3.12.0-cp315-cp315-manylinux_2_39_x86_64.whl", hash = "sha256:58c58e1de0006ffb580368d6793c36c7b0b021db066479cf281bf5061e732328", size = 131049, upload-time = "2026-08-14T16:13:21.719Z" }, - { url = "https://files.pythonhosted.org/packages/b0/15/cfa2021d64d5aa8bb5c9f604ef375e00ec8b657651b5dd650b1b7ad13df1/orjson-3.12.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:08231552159be266a7269555bd9f7c016aee7d9ad6dab06eb58796c5ccb7101c", size = 135320, upload-time = "2026-08-14T16:13:23.415Z" }, - { url = "https://files.pythonhosted.org/packages/1a/50/3e75dfe357c1e8f9e287c7a5740260ef15bd23a5299eae8d0835dcad5375/orjson-3.12.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:a15f9a891bce5f5cc5d210e3ad8614d4d1b489a56448c099d6d2a7168b2d954a", size = 127488, upload-time = "2026-08-14T16:13:24.791Z" }, - { url = "https://files.pythonhosted.org/packages/11/a6/79aed402eb3ab284dc5b4791a7ad62c5875127de01b8e3f04bd92d551298/orjson-3.12.0-cp315-cp315-win32.whl", hash = "sha256:03091c8a64db4be38746597ceea68f33c238e27acd9bfe99fb59420224ae7a55", size = 128048, upload-time = "2026-08-14T16:13:26.217Z" }, - { url = "https://files.pythonhosted.org/packages/64/f7/2723e264aab7248c1ed6ecaad8e5d0cb866c0cffde75442102ffa7491aba/orjson-3.12.0-cp315-cp315-win_amd64.whl", hash = "sha256:2b7bcefb9f40fa242fa6b06377232c048e655747790829609168c01162f60578", size = 121860, upload-time = "2026-08-14T16:13:27.577Z" }, - { url = "https://files.pythonhosted.org/packages/82/56/630c9113ec8996778f1f0304b364b091b9a9db5fef5fdc17cca622f5ea24/orjson-3.12.0-cp315-cp315-win_arm64.whl", hash = "sha256:859fc4196855890150bb08e649b30d2c93b249b3e3edd0d3bb2231abf8aa8adc", size = 126754, upload-time = "2026-08-14T16:13:28.962Z" }, +version = "3.11.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163, upload-time = "2026-05-06T15:11:08.309Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5d/b95ca542a001135cc250a49370f282f578c8f4e46cc8617d73775297eea8/orjson-3.11.9-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:135869ef917b8704ea0a94e01620e0c05021c15c52036e4663baffe75e72f8ce", size = 228986, upload-time = "2026-05-06T15:09:14.765Z" }, + { url = "https://files.pythonhosted.org/packages/80/01/be33fbff646e22f93398429ea645f20d2097aea1a6cdc1e6628e70125f83/orjson-3.11.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115ab5f5f4a0f203cc2a5f0fb09aee503a3f771aa08392949ab5ca230c4fbdbd", size = 132558, upload-time = "2026-05-06T15:09:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/4e/61/73d49333bba660a075daccca10970dc6409ce1cf42ae4046646a19468aad/orjson-3.11.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4da3c38a2083ca4aaf9c2a36776cce3e9328e6647b10d118948f3cfb4913ffe4", size = 128213, upload-time = "2026-05-06T15:09:18.719Z" }, + { url = "https://files.pythonhosted.org/packages/1f/7d/30e844b3dac3f74aed66b1f984daf9db3c98c0328c03d965a9e8dc06449e/orjson-3.11.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53b50b0e14084b8f7e29c5ce84c5af0f1160169b30d8a6914231d97d2fe297d4", size = 135430, upload-time = "2026-05-06T15:09:20.257Z" }, + { url = "https://files.pythonhosted.org/packages/16/64/bd815f5c610b3facc204f26ba94e87a9eb49b0d83de3d5fc1eee2402d91b/orjson-3.11.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:231742b4a11dad8d5380a435962c57e91b7c37b79be858f4ef1c0df1a259897e", size = 146178, upload-time = "2026-05-06T15:09:21.616Z" }, + { url = "https://files.pythonhosted.org/packages/c7/35/e744fd36c79b339d27beb06068b5a08a8882ef5418804d0ce545a31f718d/orjson-3.11.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34fd2317602587321faab75ab76c623a0117e80841a6413654f04e47f339a8fb", size = 133068, upload-time = "2026-05-06T15:09:23.228Z" }, + { url = "https://files.pythonhosted.org/packages/2a/56/d54152b67b63a0b3e556cfc549d6ce84f74d7f425ddeadc6c8a74d913da7/orjson-3.11.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71f3db16e69b667b132e0f305a833d5497da302d801508cbb051ed9a9819da47", size = 134217, upload-time = "2026-05-06T15:09:24.847Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ee/66154baf69f71c7164a268a5e888908aec5a0819d13c81d5e2755a257758/orjson-3.11.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0b34789fa0da61cf7bef0546b09c738fb195331e017e477096d129e9105ab03d", size = 141917, upload-time = "2026-05-06T15:09:26.647Z" }, + { url = "https://files.pythonhosted.org/packages/09/d3/c5824260ca8b9d7ba82648d042a3f8f4815d18c15bb98a1f30edd1bb2d83/orjson-3.11.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:87e4d4ab280b0c87424d47695bec2182caf8cfc17879ea78dab76680194abc13", size = 415356, upload-time = "2026-05-06T15:09:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/64/cb/509c2e816fe4df641d93dc92f6a89adc8df3ada8ebdee2bd44aba3264c3c/orjson-3.11.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ace6c58523302d3b97b6ac5c38a5298a54b473762b6be82726b4265c41029f92", size = 148112, upload-time = "2026-05-06T15:09:29.783Z" }, + { url = "https://files.pythonhosted.org/packages/db/b5/3ceae56d2e4962979eedb023ba6a46a4bb65f333960379be0ca470686220/orjson-3.11.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:97d0d932803c1b164fde11cb542a9efcb1e0f63b184537cca65887147906ff48", size = 137112, upload-time = "2026-05-06T15:09:31.432Z" }, + { url = "https://files.pythonhosted.org/packages/d7/7a/81fa3f2c7bef79b04cf2ab7838e5ac74b1f12511ceab979759b0275d6bb4/orjson-3.11.9-cp310-cp310-win32.whl", hash = "sha256:b3afcf569c15577a9fe64627292daa3e6b3a70f4fb77a5df246a87ec21681b94", size = 131706, upload-time = "2026-05-06T15:09:32.707Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d8/b64600f9083c7f151ad39717a5877fccbeb0ef6d7efcb55f971ce00b6bee/orjson-3.11.9-cp310-cp310-win_amd64.whl", hash = "sha256:8697ab6a080a5c46edaad50e2bc5bd8c7ca5c66442d24104fa44ec74910a8244", size = 127282, upload-time = "2026-05-06T15:09:33.955Z" }, + { url = "https://files.pythonhosted.org/packages/1e/51/3fb9e65ae76ee97bd611869a503fa3fc0a6e81dd8b737cf3003f682df7ff/orjson-3.11.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f01c4818b3fc9b0da8e096722a84318071eaa118df35f6ed2344da0e73a5444f", size = 228522, upload-time = "2026-05-06T15:09:35.362Z" }, + { url = "https://files.pythonhosted.org/packages/16/fa/9d54b07cb3f3b0bfd57841478e42d7a0ece4a9f49f9907eecf5a45461687/orjson-3.11.9-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:3ebca4179031ee716ed076ffadc29428e900512f6fccee8614c9983157fcf19c", size = 128463, upload-time = "2026-05-06T15:09:37.063Z" }, + { url = "https://files.pythonhosted.org/packages/88/b1/6ceafc2eefd0a553e3be77ce6c49d107e772485d9568629376171c50e634/orjson-3.11.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48ee05097750de0ff69ed5b7bbcf0732182fd57a24043dcc2a1da780a5ead3a5", size = 132306, upload-time = "2026-05-06T15:09:38.299Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/f11311285324a40aab1e3031385c50b635a7cd0734fdaf60c7e89a696f60/orjson-3.11.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6082706765a95a6680d812e1daf1c0cfe8adec7831b3ff3b625693f3b461b1c", size = 127988, upload-time = "2026-05-06T15:09:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/9e/85/0ef63bcf1337f44031ce9b91b1919563f62a37527b3ea4368bb15a22e5d7/orjson-3.11.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:277fefe9d76ee17eb14debf399e3533d4d63b5f677a4d3719eb763536af1f4bd", size = 135188, upload-time = "2026-05-06T15:09:40.957Z" }, + { url = "https://files.pythonhosted.org/packages/05/94/b0d27090ea8a2095db3c2bd1b1c96f96f19bbb494d7fef33130e846e613d/orjson-3.11.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03db380e3780fa0015ed776a90f20e8e20bb11dde13b216ce19e5718e3dfba62", size = 145937, upload-time = "2026-05-06T15:09:42.249Z" }, + { url = "https://files.pythonhosted.org/packages/09/eb/75d50c29c05b8054013e221e598820a365c8e64065312e75e202ed880709/orjson-3.11.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33d7d766701847dc6729846362dc27895d2f2d2251264f9d10e7cb9878194877", size = 132758, upload-time = "2026-05-06T15:09:43.945Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/360686f39348aa88827cb6fbf7dc606fd41c831a35235e1abf1db8e3a9e6/orjson-3.11.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147302878da387104b66bb4a8b0227d1d487e976ce41a8501916161072ed87b1", size = 133971, upload-time = "2026-05-06T15:09:45.239Z" }, + { url = "https://files.pythonhosted.org/packages/0e/30/3178eb16f3221aeef068b6f1f1ebe05f656ea5c6dffe9f6c917329fe17a3/orjson-3.11.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3513550321f8c8c811a7c3297b8a630e82dc08e4c10216d07703c997776236cd", size = 141685, upload-time = "2026-05-06T15:09:46.858Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f1/ff2f19ed0225f9680fafa42febca3570dd59444ebf190980738d376214c2/orjson-3.11.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c5d001196b89fa9cf0a4ab79766cd835b991a166e4b621ba95089edc50c429ff", size = 415167, upload-time = "2026-05-06T15:09:48.312Z" }, + { url = "https://files.pythonhosted.org/packages/9b/61/863bddf0da6e9e586765414debd54b4e58db05f560902b6d00658cb88636/orjson-3.11.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:16969c9d369c98eb084889c6e4d2d39b77c7eb38ceccf8da2a9fff62ae908980", size = 147913, upload-time = "2026-05-06T15:09:49.733Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4081492586d75b073d60c5271a8d0f05a0955cabf1e34c8473f6fcd84235/orjson-3.11.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63e0efbc991250c0b3143488fa57d95affcabbfc63c99c48d625dd37779aafe2", size = 136959, upload-time = "2026-05-06T15:09:51.311Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bd/70b6ab193594d7abb875320c0a7c8335e846f28968c432c31042409c3c8d/orjson-3.11.9-cp311-cp311-win32.whl", hash = "sha256:14ed654580c1ed2bc217352ec82f91b047aef82951aa71c7f64e0dcb03c0e180", size = 131533, upload-time = "2026-05-06T15:09:52.637Z" }, + { url = "https://files.pythonhosted.org/packages/3f/17/1a1a228183d62d1b77e2c30d210f47dd4768b310ebe1607c63e3c0e3a71e/orjson-3.11.9-cp311-cp311-win_amd64.whl", hash = "sha256:57ea77fb70a448ce87d18fca050193202a3da5e54598f6501ca5476fb66cfe02", size = 127106, upload-time = "2026-05-06T15:09:54.204Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/285de5fa296d09681ee9c546cd4a8aeb773b701cf343dc125994f4d52953/orjson-3.11.9-cp311-cp311-win_arm64.whl", hash = "sha256:19b72ed11572a2ee51a67a903afbe5af504f84ed6f529c0fe44b0ab3fb5cc697", size = 126848, upload-time = "2026-05-06T15:09:55.551Z" }, + { url = "https://files.pythonhosted.org/packages/16/6d/11867a3ffa3a3608d84a4de51ef4dd0896d6b5cc9132fbe1daf593e677bc/orjson-3.11.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9ef6fe90aadef185c7b128859f40beb24720b4ecea95379fc9000931179c3a49", size = 228515, upload-time = "2026-05-06T15:09:57.265Z" }, + { url = "https://files.pythonhosted.org/packages/24/75/05912954c8b288f34fcf5cd4b9b071cb4f6e77b9961e175e56ebb258089f/orjson-3.11.9-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e5c9b8f28e726e97d97696c826bc7bea5d71cecd63576dba92924a32c1961291", size = 128409, upload-time = "2026-05-06T15:09:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/ab/86/1c3a47df3bc8191ea9ac51603bbb872a95167a364320c269f2557911f406/orjson-3.11.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a473dbb4162108b27901492546f83c76fdcea3d0eadff00ae7a07e18dcce09", size = 132106, upload-time = "2026-05-06T15:10:00.798Z" }, + { url = "https://files.pythonhosted.org/packages/d7/cf/b33b5f3e695ae7d63feef9d915c37cc3b8f465493dcd4f8e0b4c697a2366/orjson-3.11.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:011382e2a60fda9d46f1cdee31068cfc52ffe952b587d683ec0463002802a0f4", size = 127864, upload-time = "2026-05-06T15:10:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/31/6a/6cf69385a58208024fcb8c014e2141b8ce838aba6492b589f8acfff97fab/orjson-3.11.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2d3dc759490128c5c1711a53eeaa8ee1d437fd0038ffd2b6008abf46db3f882", size = 135213, upload-time = "2026-05-06T15:10:03.515Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f8/0b1bd3e8f2efcdd376af5c8cfd79eaf13f018080c0089c80ebd724e3c7fb/orjson-3.11.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8ea516b3726d190e1b4297e6f4e7a8650347ae053868a18163b4dd3641d1fff", size = 145994, upload-time = "2026-05-06T15:10:05.083Z" }, + { url = "https://files.pythonhosted.org/packages/f3/59/dab79f61044c529d2c81aecdc589b1f833a1c8dec11ba3b1c2498a02ca7e/orjson-3.11.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380cdce7ba24989af81d0a7013d0aaec5d0e2a21734c0e2681b1bc4f141957fe", size = 132744, upload-time = "2026-05-06T15:10:06.853Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a4/82b7a2fe5d8a67a59ed831b24d59a3d46ea7d207b66e1602d376541d94a6/orjson-3.11.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4fa4f0af7fa18951f7ab3fc2148e223af211bf03f59e1c6034ec3f97f21d61", size = 134014, upload-time = "2026-05-06T15:10:08.213Z" }, + { url = "https://files.pythonhosted.org/packages/50/c7/375e83a76851b73b2e39f3bcf0e5a19e2b89bad13e5bca97d0b293d27f24/orjson-3.11.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a8f5f8bc7ce7d59f08d9f99fa510c06496164a24cb5f3d34537dbd9ca30132e2", size = 141509, upload-time = "2026-05-06T15:10:09.595Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7c/49d5d82a3d3097f641f094f552131f1e2723b0b8cb0fa2874ab65ecfffa6/orjson-3.11.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:4d7fde5501b944f83b3e665e1b31343ff6e154b15560a16b7130ea1e594a4206", size = 415127, upload-time = "2026-05-06T15:10:11.049Z" }, + { url = "https://files.pythonhosted.org/packages/3a/dc/7446c538590d55f455647e5f3c61fc33f7108714e7afcffa6a2a033f8350/orjson-3.11.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cde1a448023ba7d5bb4c01c5afb48894380b5e4956e0627266526587ef4e535f", size = 148025, upload-time = "2026-05-06T15:10:12.842Z" }, + { url = "https://files.pythonhosted.org/packages/df/e5/4d2d8af06f788329b4f78f8cc3679bb395392fcaa1e4d8d3c33e85308fa4/orjson-3.11.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e63adb0e1f1ed5d9e168f50a91ceb93ae6420731d222dc7da5c69409aa47aa", size = 136943, upload-time = "2026-05-06T15:10:14.405Z" }, + { url = "https://files.pythonhosted.org/packages/06/69/850264ccf6d80f6b174620d30a87f65c9b1490aba33fe6b62798e618cad3/orjson-3.11.9-cp312-cp312-win32.whl", hash = "sha256:2d057a602cdd19a0ad680417527c45b6961a095081c0f46fe0e03e304aac6470", size = 131606, upload-time = "2026-05-06T15:10:15.791Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d5/973a43fc9c55e20f2051e9830997649f669be0cb3ca52192087c0143f118/orjson-3.11.9-cp312-cp312-win_amd64.whl", hash = "sha256:59e403b1cc5a676da8eaf31f6254801b7341b3e29efa85f92b48d272637e77be", size = 127101, upload-time = "2026-05-06T15:10:17.129Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ae/495470f0e4a18f73fa10b7f6b84b464ec4cc5291c4e0c7c2a6c400bef006/orjson-3.11.9-cp312-cp312-win_arm64.whl", hash = "sha256:9af678d6488357948f1f84c6cd1c1d397c014e1ae2f98ae082a44eb48f602624", size = 126736, upload-time = "2026-05-06T15:10:18.645Z" }, + { url = "https://files.pythonhosted.org/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458, upload-time = "2026-05-06T15:10:20.079Z" }, + { url = "https://files.pythonhosted.org/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368, upload-time = "2026-05-06T15:10:21.549Z" }, + { url = "https://files.pythonhosted.org/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070, upload-time = "2026-05-06T15:10:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892, upload-time = "2026-05-06T15:10:24.714Z" }, + { url = "https://files.pythonhosted.org/packages/66/60/52b0054c4c700d5aa7fc5b7ca96917400d8f061307778578e67a10e25852/orjson-3.11.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aff7da9952a5ad1cef8e68017724d96c7b9a66e99e91d6252e1b133d67a7b10", size = 135217, upload-time = "2026-05-06T15:10:26.084Z" }, + { url = "https://files.pythonhosted.org/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980, upload-time = "2026-05-06T15:10:28.062Z" }, + { url = "https://files.pythonhosted.org/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738, upload-time = "2026-05-06T15:10:29.727Z" }, + { url = "https://files.pythonhosted.org/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033, upload-time = "2026-05-06T15:10:31.152Z" }, + { url = "https://files.pythonhosted.org/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492, upload-time = "2026-05-06T15:10:32.641Z" }, + { url = "https://files.pythonhosted.org/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087, upload-time = "2026-05-06T15:10:34.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/57/1b30daf70f0d8180e9a73cefbfbdd99e4bf19eb020466502b01fba7e0e50/orjson-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:97db4c94a7db398a5bd636273324f0b3fd58b350bbbac8bb380ceb825a9b40f4", size = 148031, upload-time = "2026-05-06T15:10:36.358Z" }, + { url = "https://files.pythonhosted.org/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915, upload-time = "2026-05-06T15:10:38.013Z" }, + { url = "https://files.pythonhosted.org/packages/5f/cc/2d10025f9056d376e4127ec05a5808b218d46f035fdc08178a5411b34250/orjson-3.11.9-cp313-cp313-win32.whl", hash = "sha256:d4087e5c0209a0a8efe4de3303c234b9c44d1174161dcd851e8eea07c7560b32", size = 131613, upload-time = "2026-05-06T15:10:39.569Z" }, + { url = "https://files.pythonhosted.org/packages/67/bd/2775ff28bfe883b9aa1ff348300542eb2ef1ee18d8ae0e3a49846817a865/orjson-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:051b102c93b4f634e89f3866b07b9a9a98915ada541f4ec30f177067b2694979", size = 127086, upload-time = "2026-05-06T15:10:41.262Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/d26799e580939e32a7da9a39531bc9e58e15ca32ffaa6a8cb3e9bb0d22cd/orjson-3.11.9-cp313-cp313-win_arm64.whl", hash = "sha256:cce9127885941bd28f080cecf1f1d288336b7e0d812c345b08be88b572796254", size = 126696, upload-time = "2026-05-06T15:10:42.651Z" }, + { url = "https://files.pythonhosted.org/packages/8e/eb/5da01e356015aee6ecfa1187ced87aef51364e306f5e695dd52719bf0e78/orjson-3.11.9-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6ef1979adc4bc243523f1a2ba91418030a8e29b0a99cbe7e0e2d6807d4dce6e", size = 228465, upload-time = "2026-05-06T15:10:44.097Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/3e0e0c14c957133bcd855395c62b55ed4e3b0af23ffea11b032cb1dcbdb1/orjson-3.11.9-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:f36b7f32c7c0db4a719f1fc5824db4a9c6f8bd1a354debb91faf26ebf3a4c71e", size = 128364, upload-time = "2026-05-06T15:10:45.839Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5a/07d8aa117211a8ed7630bda80c8c0b14d04e0f8dcf99bcf49656e4a710eb/orjson-3.11.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08f4d8ebb44925c794e535b2bebc507cebf32209df81de22ae285fb0d8d66de0", size = 132063, upload-time = "2026-05-06T15:10:47.267Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ec/4acaf21483e18aa945be74a474c74b434f284b549f275a0a39b9f98956e9/orjson-3.11.9-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6cc7923789694fd58f001cbcac7e47abc13af4d560ebbfcf3b41a8b1a0748124", size = 122356, upload-time = "2026-05-06T15:10:48.765Z" }, + { url = "https://files.pythonhosted.org/packages/13/d8/5f0555e7638801323b7a75850f92e7dfa891bc84fe27a1ba4449170d1200/orjson-3.11.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea5c46eb2d3af39e806b986f4b09d5c2706a1f5afde3cbf7544ce6616127173c", size = 129592, upload-time = "2026-05-06T15:10:50.13Z" }, + { url = "https://files.pythonhosted.org/packages/b6/30/ed9860412a3603ceb3c5955bfd72d28b9d0e7ba6ed81add14f83d7114236/orjson-3.11.9-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5d89a2ed90731df3be64bab0aa44f78bff39fdc9d71c291f4a8023aa46425b7", size = 140491, upload-time = "2026-05-06T15:10:51.582Z" }, + { url = "https://files.pythonhosted.org/packages/d0/17/adc514dea7ac7c505527febf884934b815d34f0c7b8693c1a8b39c5c4a57/orjson-3.11.9-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25e4aed0312d292c09f61af25bba34e0b2c88546041472b09088c39a4d828af1", size = 127309, upload-time = "2026-05-06T15:10:53.329Z" }, + { url = "https://files.pythonhosted.org/packages/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaea64f3f467d22e70eeed68bdccb3bc4f83f650446c4a03c59f2cba28a108db", size = 134030, upload-time = "2026-05-06T15:10:54.988Z" }, + { url = "https://files.pythonhosted.org/packages/c1/7a/bc82a0bb25e9faaf92dc4d9ef002732efc09737706af83e346788641d4a7/orjson-3.11.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a028425d1b440c5d92a6be1e1a020739dfe67ea87d96c6dbe828c1b30041728b", size = 141482, upload-time = "2026-05-06T15:10:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/01/55/e69188b939f77d5d32a9833745ace31ea5ccae3ab613a1ec185d3cd2c4fb/orjson-3.11.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5b192c6cf397e4455b11523c5cf2b18ed084c1bbd61b6c0926344d2129481972", size = 415178, upload-time = "2026-05-06T15:10:58.446Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/b8a5a7ac527e80b9cb11d51e3f6689b709279183264b9ec5c7bc680bb8b5/orjson-3.11.9-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea407d4ccf5891d667d045fecae97a7a1e5e87b3b97f97ae1803c2e741130be0", size = 148089, upload-time = "2026-05-06T15:11:00.441Z" }, + { url = "https://files.pythonhosted.org/packages/97/4e/00503f64204bf859b37213a63927028f30fb6268cd8677fb0a5ad48155e1/orjson-3.11.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f63aaf97afd9f6dec5b1a68e1b8da12bfccb4cb9a9a65c3e0b6c847849e7586", size = 136921, upload-time = "2026-05-06T15:11:02.176Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ba/a23b82a0a8d0ed7bed4e5f5035aae751cad4ff6a1e8d2ecd14d8860f5929/orjson-3.11.9-cp314-cp314-win32.whl", hash = "sha256:e30ab17845bb9fa54ccf67fa4f9f5282652d54faa6d17452f47d0f369d038673", size = 131638, upload-time = "2026-05-06T15:11:03.696Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/0c6798456bade745c75c452342dabacce5798196483e77e643be1f53877d/orjson-3.11.9-cp314-cp314-win_amd64.whl", hash = "sha256:32ef5f4283a3be81913947d19608eacb7c6608026851123790cd9cc8982af34b", size = 127078, upload-time = "2026-05-06T15:11:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/16/21/5a3f1e8913103b703a436a5664238e5b965ec392b555fe68943ea3691e6b/orjson-3.11.9-cp314-cp314-win_arm64.whl", hash = "sha256:eebdbdeef0094e4f5aefa20dcd4eb2368ab5e7a3b4edea27f1e7b2892e009cf9", size = 126687, upload-time = "2026-05-06T15:11:06.602Z" }, ] [[package]] @@ -3541,20 +3358,20 @@ wheels = [ [[package]] name = "pkginfo" -version = "1.13" +version = "1.12.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/ad/97538d5a1041d8d3ba155075b0b35248cf8538e1f1ec764f1d117962b01d/pkginfo-1.13.tar.gz", hash = "sha256:4f70471c643f71fe84a06230c0e33c5c5b12a33b2fd21bff14ddaef5a974adb1", size = 453525, upload-time = "2026-08-30T02:45:07.804Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/03/e26bf3d6453b7fda5bd2b84029a426553bb373d6277ef6b5ac8863421f87/pkginfo-1.12.1.2.tar.gz", hash = "sha256:5cd957824ac36f140260964eba3c6be6442a8359b8c48f4adf90210f33a04b7b", size = 451828, upload-time = "2025-02-19T15:27:37.188Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/ad/2e9e8a7bb014758af9453b3d818848d50852592296aceb8817f2a937fa71/pkginfo-1.13-py3-none-any.whl", hash = "sha256:37e1bfb7b5b149829e6f140a225b517c4c8808d8d164f68137b9492023874061", size = 32769, upload-time = "2026-08-30T02:45:06.55Z" }, + { url = "https://files.pythonhosted.org/packages/fa/3d/f4f2ba829efb54b6cd2d91349c7463316a9cc55a43fc980447416c88540f/pkginfo-1.12.1.2-py3-none-any.whl", hash = "sha256:c783ac885519cab2c34927ccfa6bf64b5a704d7c69afaea583dd9b7afe969343", size = 32717, upload-time = "2025-02-19T15:27:33.071Z" }, ] [[package]] name = "platformdirs" -version = "4.11.8" +version = "4.11.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/18/f3bb8ef0d3b930692343da8aa4d3cbcd6749477c053959395ac81965a6e9/platformdirs-4.11.8.tar.gz", hash = "sha256:f23abafea7dd4276d1f29104b83598d7dcc567cafd07c9c951e66665645437fc", size = 37182, upload-time = "2026-09-08T22:20:42.866Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/98/0bf930c4f97d0266b58a89e36c015f56232c52b5d2f207215d48cca9e8f7/platformdirs-4.11.2.tar.gz", hash = "sha256:3a2ae5fca3520a01ab1be8b45613537f52ddf5b5f6f53d88233892dfbf0cd82d", size = 32716, upload-time = "2026-08-10T15:48:06.092Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/e1/5b7b8bbb55084d1425bcb9bc823ff519e1b2be05f6ebb0089e2eacc38413/platformdirs-4.11.8-py3-none-any.whl", hash = "sha256:52f2f181bbfde907966932cc8312d967d02976422d66d537ea16092b8e291081", size = 24027, upload-time = "2026-09-08T22:20:41.537Z" }, + { url = "https://files.pythonhosted.org/packages/49/e2/4e6eee633809c376c024821b91ade709cbfd040ec53939ffbcc292aa7eee/platformdirs-4.11.2-py3-none-any.whl", hash = "sha256:7f89089b6ea71bda7962953edcf784b2e2d9d285b40ad88be2bb75c6e9d82ab4", size = 23361, upload-time = "2026-08-10T15:48:04.855Z" }, ] [[package]] @@ -3580,162 +3397,145 @@ wheels = [ [[package]] name = "propcache" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/a6/9e6708e2a34a43f1070246c8d0e773e315cc4fdb598a9cdb8ff7d0c450b2/propcache-0.5.3.tar.gz", hash = "sha256:5f283fde8fd8b1944fd1a1bd11db759b55c5f190795668d5187d3e3b1165d98b", size = 59605, upload-time = "2026-09-15T19:34:31.226Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/31/15f39b3d5a0e5a5ab5589814c01d6096b826c5bf12c89d173e0af283c25d/propcache-0.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e443bc079b57cb231ed45a8a55879a868bf56449ca7a719e58988375f828d8d", size = 105793, upload-time = "2026-09-15T19:31:10.732Z" }, - { url = "https://files.pythonhosted.org/packages/f3/33/6cb0fe6d941a48f230d3f738dcd4446b3f203467eedd613f12dd822f2c05/propcache-0.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3ecda25c86ee7500b5348cb1e8831ee4324daa45ec7e24265808121537c85bbe", size = 61275, upload-time = "2026-09-15T19:31:12.271Z" }, - { url = "https://files.pythonhosted.org/packages/91/d6/876cf5ab7ecd9d7cbc0b0a8303e76c7a08f03c85546a977252cec63e7dd7/propcache-0.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:31239c475a43568c0d64d5e10208f449e004ff4894458507fed5ce53403ac3a2", size = 61027, upload-time = "2026-09-15T19:31:13.529Z" }, - { url = "https://files.pythonhosted.org/packages/49/f7/bad2d624bbef5334d6a95cacc51ea19ffcfe5ab247feb0dad42360d80ed3/propcache-0.5.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5867f7d672f239fe70569c947a4453ed44f82c166ff08d4abf6cf7350d9a4b12", size = 65979, upload-time = "2026-09-15T19:31:14.877Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9b/86bdd60d69fbed833a950021880dd7eac9e2370cc2aa77b175921765dcb1/propcache-0.5.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:544f08889abce275a77b27add29cdaa87a36e6ce6abeffcb4e87b4e29c577711", size = 69600, upload-time = "2026-09-15T19:31:16.344Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9e/a39aa4a7590513ae5b4fe17d27bc56f12226991fb1043448a1766c07ecff/propcache-0.5.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:58515aacf6ba8ad47a0b072ff2a27ccb39d7691ed9101636e6b5e151758b11c0", size = 71612, upload-time = "2026-09-15T19:31:17.799Z" }, - { url = "https://files.pythonhosted.org/packages/a9/74/c94d53224f485d4caffc76b0c4d72cf536e8c3ae54ff05fd981870fca20b/propcache-0.5.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e61294a7d9b07a79b3c670dbceaa4aca37542e68cdf9411e04ed81cabb2f62a5", size = 68680, upload-time = "2026-09-15T19:31:19.124Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c8/10a254addc11ec17d1ec8632fe3fe32cf1c27f294c0c5bb69c80163a0fd7/propcache-0.5.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1956d7e98f2150e4b0aae71dccf61fb5628208c63d57e2dafae68301fe8e1a36", size = 68716, upload-time = "2026-09-15T19:31:20.849Z" }, - { url = "https://files.pythonhosted.org/packages/0b/aa/f1ef19e2619138fb4877322e5b90e421fe249a41ed8703eda6b5bfd38bed/propcache-0.5.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:79af5bf10e5a631ba601c33f379e37e64f036c55e60a99254ec55ab4678d268b", size = 66324, upload-time = "2026-09-15T19:31:22.251Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0d/d6317dd9f162155bbae2c96d4953ec91750e21d0b0c55fc9e6331a3e9946/propcache-0.5.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:400db553b2a2af6ea41ff3b6d5972fe493180fd519c1d001c9581fd446bdc150", size = 64356, upload-time = "2026-09-15T19:31:23.516Z" }, - { url = "https://files.pythonhosted.org/packages/59/58/720013e4b55b0463d6ffdb43905749dcfa82b37538e4454f2712b7eb6eb1/propcache-0.5.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0275013737080d5d113be6927ca6055a3e393a9d95f81667c4bdb927915aac2a", size = 69971, upload-time = "2026-09-15T19:31:24.793Z" }, - { url = "https://files.pythonhosted.org/packages/f4/a1/555d3e8512f0237bef9e4e9689486a0016395f5d6eb8c18d007eea132914/propcache-0.5.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c2fd56f3b358f07e4fefcf54942f20f64e905db63dff8fddf0c67730c748b3d1", size = 69169, upload-time = "2026-09-15T19:31:26.075Z" }, - { url = "https://files.pythonhosted.org/packages/88/c2/aa489e3461b19d23316ffc731c2cf08593074716047f3948104b8f2e5771/propcache-0.5.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8e507119af1a2d417d75ebe202bc0a2a282ad0a3e6cf38f447a6cad0a2c5263e", size = 72145, upload-time = "2026-09-15T19:31:27.776Z" }, - { url = "https://files.pythonhosted.org/packages/8f/d4/8fef5ad7b826b0a797a3c8814b9cea768350a79171619aae64cb7f8f8ade/propcache-0.5.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d8a41e6f549e8bc13dc7b4987f5e96097bc2fefc66b682b3947a8e959f75a9c7", size = 69799, upload-time = "2026-09-15T19:31:29.152Z" }, - { url = "https://files.pythonhosted.org/packages/30/88/6c0d9681b890f06f8f1a0398db146305c5d1cae3cb6e057f13fdf6d9a8ff/propcache-0.5.3-cp310-cp310-win32.whl", hash = "sha256:e8e6acf498ee3d0a5c2a8468e23af7acb017c5b219b29e302af2636818d3830e", size = 42892, upload-time = "2026-09-15T19:31:30.411Z" }, - { url = "https://files.pythonhosted.org/packages/d6/eb/80d6c0c02d77f397cfbe29b925e99cd31da82302a7b7c9fafc3d255aa7a7/propcache-0.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:09513990e2f33c9de838f0ab11b62660b3ea225000945d10143007e51539088c", size = 46383, upload-time = "2026-09-15T19:31:31.661Z" }, - { url = "https://files.pythonhosted.org/packages/84/7d/a28f2159ff4b2abf0933b57aabcabc35199ce576e95f7767828115fae446/propcache-0.5.3-cp310-cp310-win_arm64.whl", hash = "sha256:5964c7e2f632facc552ab0e163cac05e1ce42acba20b4b24d445139629ed7625", size = 43775, upload-time = "2026-09-15T19:31:32.934Z" }, - { url = "https://files.pythonhosted.org/packages/53/38/86c26c9ca46dbb0a8e358fe5f6f64eaf1b9c1ec15a25bac99687b1f2b997/propcache-0.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b7edbbf2d9ba5829663dbc83cdb6e2b13bc80cd36f0bf185419dcbbb4930af7e", size = 101935, upload-time = "2026-09-15T19:31:34.296Z" }, - { url = "https://files.pythonhosted.org/packages/a5/86/0af2f86eb650688f130540370f9f63ec6f4eeaee1e445d4b751218a393ca/propcache-0.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d2c6ccfcc810ac7f8782593934fa2215669a401ef43fcae5a8cab80ce4754a46", size = 58723, upload-time = "2026-09-15T19:31:35.596Z" }, - { url = "https://files.pythonhosted.org/packages/5e/2c/6c19622bb80010a27a61906b5784e2d74d6c9123817ea6b767a6d87976aa/propcache-0.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f1723f7a060a20eb1f9971fa69c9931b5ebd253bef8baaa48a1cbd1c01c7bb7", size = 59403, upload-time = "2026-09-15T19:31:36.979Z" }, - { url = "https://files.pythonhosted.org/packages/48/8e/ae67665ada0f286937969ff533163463b0878c3ef10da41a6a0c8866a2b3/propcache-0.5.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba1ae9d55025434790882c2f1be727e725ccef83876a112af52247c7ed7ce321", size = 64788, upload-time = "2026-09-15T19:31:38.433Z" }, - { url = "https://files.pythonhosted.org/packages/43/32/b88254ef0a905130a75bf6064f9f7e2c0cce393532eef1b0403d2510bf76/propcache-0.5.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30f9d52fdd02a216601f588e5659dd39cb7d2a0ef59935d33c5077718201f8da", size = 68497, upload-time = "2026-09-15T19:31:39.799Z" }, - { url = "https://files.pythonhosted.org/packages/73/83/f83923a9ff7019a796b8e254b92e44c4e2d948b69d27b5f7a77a42825a79/propcache-0.5.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0fdd72f694faf2b34907484b53e5df7ae6b5dad6a6e03564c6b872ccebb80a7d", size = 69757, upload-time = "2026-09-15T19:31:41.076Z" }, - { url = "https://files.pythonhosted.org/packages/b9/9a/8e712d5f024cdad823fac81590781e39004cdf6479204480cba5195ba7ca/propcache-0.5.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35de8d67f6b6a3830f845ee7cd3ae47189d7dd66088aff9dfd1fe50f5bda5a60", size = 66560, upload-time = "2026-09-15T19:31:42.439Z" }, - { url = "https://files.pythonhosted.org/packages/49/d8/5b15626d8b262fe06de4dbfa606c5ec30dc46771e67c4be7a87d0e7450ec/propcache-0.5.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:377011845a2b1a8b11ab2ca33547aea1320d6f70c015bafe26486f0882dc49fb", size = 66926, upload-time = "2026-09-15T19:31:43.773Z" }, - { url = "https://files.pythonhosted.org/packages/58/b3/08e128e0a6a1fb972329eb4c32f4ea7cdbfc9cf5ca98ddcd47f98e65bbba/propcache-0.5.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2537fa4f56c12fa897f9371e4e5910417aa49ff916a7dc549a22061b46d33355", size = 65084, upload-time = "2026-09-15T19:31:45.276Z" }, - { url = "https://files.pythonhosted.org/packages/82/c1/c3e6fb2ef1b4ba095bfc314872af85e29c1872a7abc864f6ac4c8724b321/propcache-0.5.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3eb545ffc0db5c86e83ba1aec3616efbaac9c22f05daff095005472874c12e91", size = 61798, upload-time = "2026-09-15T19:31:46.802Z" }, - { url = "https://files.pythonhosted.org/packages/0e/97/6ec9a8d3c56b04301a1b3322c572eb23add5713465cbf586b179b6fb6c4d/propcache-0.5.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:023d4e58beeb0865cfc62e2e14bf4ed30e21dfc20ce16ac24fb05516a09e1d18", size = 68920, upload-time = "2026-09-15T19:31:48.135Z" }, - { url = "https://files.pythonhosted.org/packages/19/db/dbeadc6464bb2e3d070b651810475917a098d6a9bb05952b99e6ee59028a/propcache-0.5.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:d693b78ecb4df14b3aa636d9c2a40e5ab3b4f81a3bb569fddc2b28299f1ff0d1", size = 67310, upload-time = "2026-09-15T19:31:49.476Z" }, - { url = "https://files.pythonhosted.org/packages/2f/98/0be1b55e560637d9535bebc0e6bba9ee9a37ceb6d9e287285b6c89aaf0a4/propcache-0.5.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a5ea7cf6d6a0b67a64e6744219265bc5406d827ca3b46ae2d748c3aaa1d5e1d2", size = 70310, upload-time = "2026-09-15T19:31:51.164Z" }, - { url = "https://files.pythonhosted.org/packages/72/a3/5802eb8e956deb74fb141c625246f5ecb3a4bf13819cef4fd864045fd204/propcache-0.5.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:66be2cef41263d823517ee617d19fd105a70ff58a0776e5e47cfde1196bfa2f2", size = 67819, upload-time = "2026-09-15T19:31:52.627Z" }, - { url = "https://files.pythonhosted.org/packages/21/10/b7fc0d26af8b408ca6830ff0fa0138134522a38e29f00c4a9ff1366fd6d6/propcache-0.5.3-cp311-cp311-win32.whl", hash = "sha256:d8eed2e84204b4402407a5d1ca124cb653b9a6ba2fc01ce1ef1071a75ac9e176", size = 42545, upload-time = "2026-09-15T19:31:54.141Z" }, - { url = "https://files.pythonhosted.org/packages/71/40/0bb6635fbb008072e60b5b0cd297020a1e2ef4fbc0be82dfd00018a6ce1a/propcache-0.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:e01abf74acc057c0ef8533d5688a2bed25923cf05c450a0d82229fa538cf83c1", size = 46061, upload-time = "2026-09-15T19:31:55.617Z" }, - { url = "https://files.pythonhosted.org/packages/53/bf/c6b79fbb41b4be2fec8164efadc9bdf61733acf442fe0394e8d811f03faf/propcache-0.5.3-cp311-cp311-win_arm64.whl", hash = "sha256:ba7220f33a3df68245b09bc519e2c3f9f5c4123ea68f007c11529ecac8615200", size = 43338, upload-time = "2026-09-15T19:31:56.888Z" }, - { url = "https://files.pythonhosted.org/packages/8a/19/95cd33200f38330a530043ec9507658fe9d9fa3430e655ad5102c51fe844/propcache-0.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eeb4e5a10149960ed021b8e35fa22440e106db6322a9f5249ad8992f38855ceb", size = 107641, upload-time = "2026-09-15T19:31:58.423Z" }, - { url = "https://files.pythonhosted.org/packages/47/92/9d7b7d8b672713d707f558baf9e93aa09e004df11f8556b21f358c0f26f2/propcache-0.5.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b09edf2908fa5f0ba84fdb9c1bc6f346945b51541013ac29b12d20218f213279", size = 61724, upload-time = "2026-09-15T19:32:00.016Z" }, - { url = "https://files.pythonhosted.org/packages/1a/f8/fc917bcc8e9a250e1029c84f748ea44136b026285380ad938c79fca941ed/propcache-0.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2db81e15c4e0171ad26845b67a1e295ba446e717e47fefaf47f22ae0b2eca71e", size = 62359, upload-time = "2026-09-15T19:32:01.399Z" }, - { url = "https://files.pythonhosted.org/packages/50/39/2a7b447eeaf25b496cb03464cf2c2d1d723326a90a193f01301daaf1fde6/propcache-0.5.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50079e8be4f1bc33e8265f35fbe6449017901db626bc6b735181568c4bfb5e73", size = 67387, upload-time = "2026-09-15T19:32:02.753Z" }, - { url = "https://files.pythonhosted.org/packages/30/a2/bc65fc386140c365020d42bc242965840301574667dfc2d8c01df9b897a3/propcache-0.5.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8ea844a859c3060a44485c4e842df3ead69ca98ca5550594757aac11dfef30d", size = 71287, upload-time = "2026-09-15T19:32:04.073Z" }, - { url = "https://files.pythonhosted.org/packages/3d/4b/a9663f0c5d41dd4eb8126c5a9ac6db611a2ea255e9d018fd4646d70cd8c5/propcache-0.5.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8ec76f86ec2de069358d896c468be3c1cb3b5ed049e3cec3ecb3015806313606", size = 72425, upload-time = "2026-09-15T19:32:05.413Z" }, - { url = "https://files.pythonhosted.org/packages/4e/a7/51527af80ea187202dfc2f54346e057f931629da45d4f236923a05312635/propcache-0.5.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a36f13d838accaa887f9e54af4866ae344a51eb59b99dbd6cfeee701fc98ff", size = 69257, upload-time = "2026-09-15T19:32:06.806Z" }, - { url = "https://files.pythonhosted.org/packages/1d/73/453ec5ad092af7192eac503b2bf34dfaf9260b5530227effb507f8ade5fd/propcache-0.5.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1a536910fbd2f4ea76acd6b1b50708ce602a27673ef5e5b2c8ba373c2f5127cf", size = 69602, upload-time = "2026-09-15T19:32:08.128Z" }, - { url = "https://files.pythonhosted.org/packages/43/f0/b8d0bfcd1e0c119c9517b6d899c3e40cad922d5562b331c2b6ab75d5b5ea/propcache-0.5.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f95a390defc963a5543012685b57eb9cd47078f50c4a3bb5c5cd7719c4175112", size = 68232, upload-time = "2026-09-15T19:32:09.51Z" }, - { url = "https://files.pythonhosted.org/packages/7c/8e/c3e28a31bfee8af59a3ad395abcb4c26d1419c76ba66ed130af5b08affb6/propcache-0.5.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1d617a68a5f383855af3eec608ddd98dd3b964184011f20755a4e34acb194a5d", size = 63852, upload-time = "2026-09-15T19:32:11.214Z" }, - { url = "https://files.pythonhosted.org/packages/c9/bc/daf5862749343c370c2bbe03fec56b9b6ee9303dee75de0c0c8a206c441d/propcache-0.5.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:28afdbaf9f1bf34bc719e0381a4699705990c59f412e43ff25f91a01ff6676af", size = 71747, upload-time = "2026-09-15T19:32:12.583Z" }, - { url = "https://files.pythonhosted.org/packages/1f/2e/67195152e896f4d4c1fb2b895f57d006af1a64874b683f657c376bd04437/propcache-0.5.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:014cec8c711df6f22e0a50cfcb3e98d3d659856daa75e9dc2f1e206204027519", size = 69996, upload-time = "2026-09-15T19:32:13.927Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8b/cf6fb2c5d7926961f4ed299c028682b990f03aa64c02fcfc8152f0017b92/propcache-0.5.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ae72c39267ffc08bab9239fbdef5fb8bb0fc410f141b1ed283f0dd349b8bcdb0", size = 73339, upload-time = "2026-09-15T19:32:15.295Z" }, - { url = "https://files.pythonhosted.org/packages/1b/02/b201363ea0ef1cc0802219d1d09391fe7bee5494f763c7a6287706b73be0/propcache-0.5.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:22e8849a90d46d920469eacc52cf28dbfce9d9dc7fb0ee36ba3aa4b117fc8311", size = 70601, upload-time = "2026-09-15T19:32:16.632Z" }, - { url = "https://files.pythonhosted.org/packages/91/fc/86d959759bbf09ef491c4d7724697791efc5b794f2f69a10b91bb6848ac3/propcache-0.5.3-cp312-cp312-win32.whl", hash = "sha256:71dbe01ca877ca1c7d61f0f83b71f2c994554ef52983fe7c6400d9c483c477cb", size = 42868, upload-time = "2026-09-15T19:32:17.905Z" }, - { url = "https://files.pythonhosted.org/packages/bb/16/66349cab3026e04089ca0a2d15818e4294f2af2b503c70f8d6afb91ac95b/propcache-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:2367fbfaf980a0ac082c64b53ae669ee704515134a28cd8c680642bd90a2ddd5", size = 45985, upload-time = "2026-09-15T19:32:19.487Z" }, - { url = "https://files.pythonhosted.org/packages/38/a0/52010d061ef73dfe337f9ecee1104efeffdc809eabcbe211b39c1b527ac7/propcache-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:646d9d567fdc8f1f8ab3e785f8702175a9212ea3432af2506f2f914f21c3ae16", size = 42870, upload-time = "2026-09-15T19:32:20.872Z" }, - { url = "https://files.pythonhosted.org/packages/be/e1/3fdd6a4e3e0f4894e08b8c64bb91940b5f22d69157e002905e8ca5d47c1e/propcache-0.5.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ef59cf75b4d63fed6308d933db810b05f0738925b1470b6caad88afed597c7b1", size = 106256, upload-time = "2026-09-15T19:32:22.269Z" }, - { url = "https://files.pythonhosted.org/packages/22/51/6d20cdebe03e14b451125873f38cb99f4fd9bcc86a43aa2333e0427b40c7/propcache-0.5.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f10fce5b91adc67a566817365381279b6f4f3b19fbb58eacd2ab8d045e75492", size = 61068, upload-time = "2026-09-15T19:32:23.6Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1b/bba8c2e6be2ea5d3c0da03ed2f3e1e52fd7b1c34266d15316f41e71d4d17/propcache-0.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc469f68cc978501b6ec69b49f67738ae099064002d0bea283c491d086e93a27", size = 61578, upload-time = "2026-09-15T19:32:24.886Z" }, - { url = "https://files.pythonhosted.org/packages/bd/b7/78f830a753cad2d625da3238a7896fad9a570db3987f37abe4d25c02159e/propcache-0.5.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f683f8eac4e695c48a3e24a7347b392322219b6a99351d7b6bf70c9ef2262126", size = 67218, upload-time = "2026-09-15T19:32:26.199Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ab/a4be2dcf937362273ec6a4950e4d3f7895051c029b49e3e6661b1e479f2b/propcache-0.5.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9fc1d60bc45efd3b1440a17e4a7eea268d34c22eb30ccec10246b5b6833a603c", size = 71126, upload-time = "2026-09-15T19:32:27.732Z" }, - { url = "https://files.pythonhosted.org/packages/20/52/9a050a3e4892f368e5e869b60db79c36b67273df215a3fa264168868b2b8/propcache-0.5.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:384ae10f8d6595595361566f9073578c131b1eb7c651bce5d78c2c0d411a221f", size = 72255, upload-time = "2026-09-15T19:32:29.356Z" }, - { url = "https://files.pythonhosted.org/packages/d9/ad/16ed91ddab4277e7a86c48e074f533749d2abc52ff336668fd6693c9279d/propcache-0.5.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f18065f005006f20fde9c08d21b375d52908b72c493e9b2531dd25da89a8ef50", size = 69110, upload-time = "2026-09-15T19:32:30.661Z" }, - { url = "https://files.pythonhosted.org/packages/68/d1/680adc625ea1d0ed687c146bc5f2e301d2a6f8bc29667b493308ad173758/propcache-0.5.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2c73e4520974b55081770703be7066d3b346db16abe399148a154be0f9f92c81", size = 69413, upload-time = "2026-09-15T19:32:32.008Z" }, - { url = "https://files.pythonhosted.org/packages/ac/b6/5c4a31c229d682941145a700d60af9acd87e852ffcae5263b2320da8bb4c/propcache-0.5.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0e55ddb8404887d1bffb0937287cc27c98a0f1a4b91453b21b9d5c9df0743377", size = 68181, upload-time = "2026-09-15T19:32:33.616Z" }, - { url = "https://files.pythonhosted.org/packages/fa/be/52cbc9f55f13d958dcd3779c6e7723f138412b669663239d5e28d67b7a5f/propcache-0.5.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5b90847530d99dfc9ab31a6b4432fe92ad9868630b45acac21bb08468ea82614", size = 63767, upload-time = "2026-09-15T19:32:35.586Z" }, - { url = "https://files.pythonhosted.org/packages/66/86/a66817d3c0430a4f04752a70b94f5b501115d76d362ed8c65d49954c1da5/propcache-0.5.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c71593d15b601f785e4f0362822d3101b999e4a696210281e83e035abb8c33ba", size = 71664, upload-time = "2026-09-15T19:32:37.078Z" }, - { url = "https://files.pythonhosted.org/packages/59/42/b7446429cbf09ee650439808d18168a126b5ae7d8b48f248e967af76ad34/propcache-0.5.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d3f6e1a3a0efc4ea71b8dd4310c4c5693686ad0c3b4c657beafea3aaf6a28428", size = 69846, upload-time = "2026-09-15T19:32:38.587Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ec/33deac3625109d26dcf7a44a6baec04e3eea26b2ec67cc0cf43577ea218e/propcache-0.5.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:45115e5e32fcc253de3f14633ca1c982239c9ba37ba41ca45a7e30b3afeb3b77", size = 73087, upload-time = "2026-09-15T19:32:39.925Z" }, - { url = "https://files.pythonhosted.org/packages/2a/26/8a38e5c9bd3d7bbd35337fc254b621fcdaa6b95b20dcf5079174ffd198e9/propcache-0.5.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7d377c2e8ddd7b7254c3ec6b23275bfb9d307a32bef017ba7dc94b94f45c509", size = 70523, upload-time = "2026-09-15T19:32:41.588Z" }, - { url = "https://files.pythonhosted.org/packages/00/6a/3d11b88ec9ff7beafd8af716200864e797fc3066c4bc1927b1f1a06d1376/propcache-0.5.3-cp313-cp313-win32.whl", hash = "sha256:442d4a18df8be3ceff91bcd8eb850c263f36726287327499c68e72482ac07b48", size = 42404, upload-time = "2026-09-15T19:32:42.993Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b2/e3bbfd99b6b6d1437a4b44719f01c6eafd1c5f6ae94fffc848d79626fefa/propcache-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:a8e2d2bb4285a5fa8e5c01465b5379abf8f244d4978855558432987ef62672f1", size = 45138, upload-time = "2026-09-15T19:32:44.263Z" }, - { url = "https://files.pythonhosted.org/packages/dc/96/c52adae597a00f2a80e57daacb4ffd0b3acc9d2767dcfe171e6c87c0939a/propcache-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:82ff2cf7bcb0c207ad1d207e1a51ea1d53aff47628729c7368c5ead6924d3b7f", size = 42206, upload-time = "2026-09-15T19:32:45.555Z" }, - { url = "https://files.pythonhosted.org/packages/d4/f3/0e98a1100344a6b067fc9813db6779f5c48266543ed4b6b847fa6ff6ee2a/propcache-0.5.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7ee15901025c40b58ee5547a7c244841701c09758f3e98ddbb0b876d96d52ad4", size = 106105, upload-time = "2026-09-15T19:32:47.004Z" }, - { url = "https://files.pythonhosted.org/packages/c0/80/f271217374190c4e58d7e9dd690bfa6c6b2b934207365dda69b86b460199/propcache-0.5.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:37e41cd6c1a27ddbbd0b556fb0c02ae8e55c41c8a122c83f1350a017f0bbc69c", size = 61085, upload-time = "2026-09-15T19:32:48.473Z" }, - { url = "https://files.pythonhosted.org/packages/3b/bf/0e606784765a9b3f2ceb40827bb0369d810f19aef8abbd4b5bba817dcaad/propcache-0.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:04e21d1eea62765ee0306c80c61937255a5cd99c9c56d6cb6100ca5794e8b2f3", size = 61420, upload-time = "2026-09-15T19:32:49.822Z" }, - { url = "https://files.pythonhosted.org/packages/b3/a4/71a22c1dee4ca02d331ec34e81300d73a4d753e5865662473756dfefc00d/propcache-0.5.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f698081e39d0a63f44ae35da7c43c595f9f60d26ee08e575576fd7df3029e31b", size = 67105, upload-time = "2026-09-15T19:32:51.144Z" }, - { url = "https://files.pythonhosted.org/packages/3c/7d/2661bdbf82cefdc566928fbb0c77a9340a338701e526df4e1c7f34d94d36/propcache-0.5.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1a8588f64d4d5d6e65d7faa9e0d1dce9fdb25e50aca194cffc6106deaf9d320a", size = 71080, upload-time = "2026-09-15T19:32:52.434Z" }, - { url = "https://files.pythonhosted.org/packages/12/26/4c8135f0224a22d2563e070efc4582fc07c6a28afb490fd97559f085ab71/propcache-0.5.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:69f226874a50eb2fdd0db47303b66b1084a545aa1d68d45ce2a1c9920cf2ea00", size = 72218, upload-time = "2026-09-15T19:32:54.002Z" }, - { url = "https://files.pythonhosted.org/packages/7e/af/40b08134064a871f721f673c8e24ce1d59c11e0fab5b045b1d4b92df96ab/propcache-0.5.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfa60b1dbd3c7881730407df60d2be83058ed145701b5c51ff113b7a3ced2224", size = 69073, upload-time = "2026-09-15T19:32:55.649Z" }, - { url = "https://files.pythonhosted.org/packages/92/09/7fc9aab3948dc2c70e6bfa809c16802f7adff8044f2cbc188210755d30fa/propcache-0.5.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a78a241677f693485ee6c0165ab657341e7ecac93f8d53cd70771ed6f3eafb61", size = 69336, upload-time = "2026-09-15T19:32:57.333Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b8/f1c053bd539f1b2f25380dc16c7a647fb0c3d5b362fbcb8f7b6f14959a0f/propcache-0.5.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c5930611bf42350905ace62fc8306146cb644c5d43efba541e68f4d22383e459", size = 68062, upload-time = "2026-09-15T19:32:58.98Z" }, - { url = "https://files.pythonhosted.org/packages/e9/8e/0fea845503e4cd26942a58edfbd23930bdf4abe7b77b64337e4112176d97/propcache-0.5.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a7f485b78c7ab8e8b9c3375d32d25a077d530cfc676c665e89685fccfa2ecbbb", size = 63841, upload-time = "2026-09-15T19:33:00.452Z" }, - { url = "https://files.pythonhosted.org/packages/e6/c3/5116f5d451eba5d08015d7b2795da74fd2705c2df9c93678b71b099c7eeb/propcache-0.5.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1162ba1e960ea6dd0453ff3ae29328a37307486c260c93343782ea1d56eca6f2", size = 71423, upload-time = "2026-09-15T19:33:01.984Z" }, - { url = "https://files.pythonhosted.org/packages/f2/75/5da895e5b944a49878aeb2476b337d5598698c55a8f04e2dbe2e9351fed4/propcache-0.5.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:49f3c98e977785ea49a8b99463cd81f343c8307dc98fe485fb94288597d8c01a", size = 69822, upload-time = "2026-09-15T19:33:03.481Z" }, - { url = "https://files.pythonhosted.org/packages/29/67/fa844bdd32590e54b8bc32223c9dc2e13626cf6c0a43b34fcdb53012477b/propcache-0.5.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8ef15c7a41364b098c26458dc3b57b7a5db6e042661c5cbeb75ed78e503162cb", size = 73014, upload-time = "2026-09-15T19:33:04.896Z" }, - { url = "https://files.pythonhosted.org/packages/51/15/3bd647f99e755e56c5608c91114143c53326f88ef7e1ffb1cbd64e96d020/propcache-0.5.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:54f06f17c66add28dc79e314e3b2ba7a9612564314d8b2c27b2a8c2f270d33c7", size = 70404, upload-time = "2026-09-15T19:33:06.65Z" }, - { url = "https://files.pythonhosted.org/packages/6d/0a/9f84810f4d89895164f13bad47f861dc76fbadb7e63ec464e2ffad97b1c0/propcache-0.5.3-cp314-cp314-win32.whl", hash = "sha256:37a99cf741523fa5406ef2c60925b7ad616afd772fb3364b431a921404853d46", size = 43372, upload-time = "2026-09-15T19:33:07.962Z" }, - { url = "https://files.pythonhosted.org/packages/3e/01/e3f346f110c3e39d2e6c431aaaa4720d1067fb6fc1452fc531c3dc624d1b/propcache-0.5.3-cp314-cp314-win_amd64.whl", hash = "sha256:10573db5b40f55728e0abd5fc47096db6162ff612af10430ae93377af09e2a4b", size = 46097, upload-time = "2026-09-15T19:33:09.341Z" }, - { url = "https://files.pythonhosted.org/packages/6c/47/8cf51b61403f3ed4122c0e21d08b6e5eb683b2d2fe02542723c9303d1b88/propcache-0.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:9e561c183c72665752cc2ede30d985a9e80534f43aaa16fa6e1224d151ad54c2", size = 43236, upload-time = "2026-09-15T19:33:10.659Z" }, - { url = "https://files.pythonhosted.org/packages/1c/cb/a1c760d7183853ed52d19552aefc3c39e57ec0561f18f79e9cc03e55c685/propcache-0.5.3-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:622ae786b1e3d46684b8866cd7415c9eca26f341757c4bfdbdfad8ee129a7103", size = 111655, upload-time = "2026-09-15T19:33:12.242Z" }, - { url = "https://files.pythonhosted.org/packages/68/ae/b76eeafd491de49e23777ae26fdec0a15e35c1fda9e2e2db140f563a064b/propcache-0.5.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0a3af1190a9c62a0da8d90a0a613d6b69029e86ee60b599e146c1e79a80c77d0", size = 64142, upload-time = "2026-09-15T19:33:13.723Z" }, - { url = "https://files.pythonhosted.org/packages/4c/20/ead9986fa0def900d811998ce491a367c9c235bdf35777fdbdb695d211f8/propcache-0.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dcc70083abd3374d7ec338c6dfd37030bc1e54ed2c71abe2c51f16c3d7af5531", size = 64270, upload-time = "2026-09-15T19:33:15.023Z" }, - { url = "https://files.pythonhosted.org/packages/2d/5a/3d0fe77ae9747f364a251e1ccfaa3c8b094bb6f1e13659c6768c4286c7b3/propcache-0.5.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:665451eaeb3e5e09129c4a789d63620502f50c16be25ebe9370f7dc05ed4d49b", size = 70112, upload-time = "2026-09-15T19:33:16.79Z" }, - { url = "https://files.pythonhosted.org/packages/cd/ae/14f42f9cf3c7c2214ec7d5cb53c99f4faae07fe27bfb76e63890339a2051/propcache-0.5.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8c8e8b2dfe7d7bbca58b12170cd65b4f7ec701e67812a853b7da8023f681c9f", size = 73544, upload-time = "2026-09-15T19:33:18.227Z" }, - { url = "https://files.pythonhosted.org/packages/d0/33/0090b2cf0f1a909f63a7d0d665c6f39b48f269738baa572e56818be65d5f/propcache-0.5.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b6239f0d6175da9d07084c74628af8baa258fe8929faf6a75ce425b0db6ec9f", size = 75059, upload-time = "2026-09-15T19:33:20.008Z" }, - { url = "https://files.pythonhosted.org/packages/b9/39/239f925d40a9d6de08a7351c29ff9b46d189682474c6d4986bd6cdb94035/propcache-0.5.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:104e8d289159297822541566d60769b81af3bfac971509a91c8b94cb2554d7dc", size = 71933, upload-time = "2026-09-15T19:33:21.5Z" }, - { url = "https://files.pythonhosted.org/packages/21/7c/259bc1bc67d9855d75d0f288f9be09186d9535eb3b45590ced48a9c9aa11/propcache-0.5.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50eea49bd9c874378a015e8363befc05b3545a0bb1312ed44ba895cd7c5c9b3a", size = 72150, upload-time = "2026-09-15T19:33:22.891Z" }, - { url = "https://files.pythonhosted.org/packages/60/cb/d3ab0eb1e502911534109159918f9ed520f1c4b556fbe08eb05629b29587/propcache-0.5.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0f0e69dcc0aa9bd4aa22c9cf3f52cd92ed2fd067f2df93e56dc1d1c98d0538e5", size = 70998, upload-time = "2026-09-15T19:33:24.339Z" }, - { url = "https://files.pythonhosted.org/packages/29/31/3955b890061d2e6bff664467b39dc78165b1837efeac29a68b2e56251e60/propcache-0.5.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:9498e6b074f7e4c58fa518e8f87944f87e612ad910bedaabfdc07695d91efa8b", size = 66542, upload-time = "2026-09-15T19:33:25.675Z" }, - { url = "https://files.pythonhosted.org/packages/03/c0/0512a494df785c0b07e23e0ebce2c797aa587af321b955e3106a822c517d/propcache-0.5.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b3541fae8294f9129e3ea393d146f28c035acf9106ee2025121dbd2b7bb2516e", size = 74281, upload-time = "2026-09-15T19:33:27.098Z" }, - { url = "https://files.pythonhosted.org/packages/bf/eb/e89c9ecc09c984b09c70a6e3367e51f7374f9d6d83225ef4853654ba8121/propcache-0.5.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:105ad7d80740aa4d44f025a7f7335599e0b26faa4d6c80918069c16e108d29db", size = 72679, upload-time = "2026-09-15T19:33:28.51Z" }, - { url = "https://files.pythonhosted.org/packages/33/f1/9c6fe447d3a9daca6088490212159c4732c5844f647b3816cc55d7c15f69/propcache-0.5.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9851f8a7bd86a455ba5f32652b13dae69011d93e44d3433fed7eb54b10f3d9e2", size = 75867, upload-time = "2026-09-15T19:33:29.891Z" }, - { url = "https://files.pythonhosted.org/packages/60/d6/9c03b5c240916bd981616f4b2269139af38f7cd0a0a2bf0721e059cc8faa/propcache-0.5.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3745e60d95e52a782b1e99ecccc72d22ee61c86c1e368647fff0444b9ec4bb70", size = 73420, upload-time = "2026-09-15T19:33:31.295Z" }, - { url = "https://files.pythonhosted.org/packages/80/ff/f524645ba32ba3ef9b7d784370ebf6a3a24a5989b1cd18159a33f69927c9/propcache-0.5.3-cp314-cp314t-win32.whl", hash = "sha256:ec2e387ce38d9b73054a7e96d70d22c8471a83df6205019442394b079d26a84d", size = 45914, upload-time = "2026-09-15T19:33:32.759Z" }, - { url = "https://files.pythonhosted.org/packages/19/50/a314a5634599c966a4363e925b5d636bc8892103666147fe66949d51e0e1/propcache-0.5.3-cp314-cp314t-win_amd64.whl", hash = "sha256:8a3396b1822f0c5291a11bdf93877d3118d5cafca5905e185582beee039fa508", size = 48948, upload-time = "2026-09-15T19:33:34.095Z" }, - { url = "https://files.pythonhosted.org/packages/61/4c/7a957ce48290acc7b9739612e73c175c04099f8af3e581b3804583ad5bfe/propcache-0.5.3-cp314-cp314t-win_arm64.whl", hash = "sha256:0dd0ef45b87c5a59970b42dd70493b3c022be490a2268dfd391cdacdfb9a611b", size = 45800, upload-time = "2026-09-15T19:33:35.558Z" }, - { url = "https://files.pythonhosted.org/packages/02/78/096c5653b662a381b6caae09de4d87ac79b93fafd35db599f31e0dc5b87d/propcache-0.5.3-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:888624d71be1029609ad7f333be31b0fa3546caef67a5b17ca2fc7f5e07c8168", size = 106276, upload-time = "2026-09-15T19:33:37.897Z" }, - { url = "https://files.pythonhosted.org/packages/99/b5/fa3fb80475ebe20d2456f220da4a925ad8ee3339caccae5ecbdb9392c715/propcache-0.5.3-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fcf51bbb689ee4c15226ab80c96c1d7804cb1f5fdbbc828b7f75f6f6ee5a172a", size = 61130, upload-time = "2026-09-15T19:33:39.366Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ac/a42b8426283e8780070e2445dbe93fa1dd6d1670d3e0d9d00bb42deebd6f/propcache-0.5.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:73b3e3cf2b6b6af3f407439b647c371452481d53b786b75e1fd0956e1d69b59f", size = 61554, upload-time = "2026-09-15T19:33:41.23Z" }, - { url = "https://files.pythonhosted.org/packages/8d/62/1c3d133ef4f179f74d8d37f3370976b937bdd52e4e1870985c38dccc2040/propcache-0.5.3-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23788073f16c2e0706f5aeaae8489ba504027cc15b22f78bdd55df8e6b5f5b37", size = 67132, upload-time = "2026-09-15T19:33:42.628Z" }, - { url = "https://files.pythonhosted.org/packages/bc/15/8de881015fed66e756ef4dc5613cddf7024fdc612d2d0199167395176de6/propcache-0.5.3-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bb98bd17ad50a99f9f6962214608afdb92a0ebef681a5f4a5d38024578176df0", size = 71122, upload-time = "2026-09-15T19:33:44.08Z" }, - { url = "https://files.pythonhosted.org/packages/18/ed/82f9f2f64f78cb5e93948b431efc06bf5b915a81746181572c8e57cce23e/propcache-0.5.3-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c95b48cda71997707271ec146e13450c8a27d57ee5d01622a0afb88a0f5a6b95", size = 72216, upload-time = "2026-09-15T19:33:45.578Z" }, - { url = "https://files.pythonhosted.org/packages/03/ec/71a33806375a6a4135aaed95f3a324319c1ff7a6939f456db3cb68443467/propcache-0.5.3-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50750f402638c9770e33e7e9ff8aa1d5115de8ea07ec29898c85abfa47b0f442", size = 69105, upload-time = "2026-09-15T19:33:46.999Z" }, - { url = "https://files.pythonhosted.org/packages/cc/c4/07ca0df6d7d45c3259fbd44d0ac298ac70fe27dd4668dad44ce3c97b6607/propcache-0.5.3-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0506edf85bec8997f5084584f2b863a27528147c59aab9bdaca2cbee0e22bb76", size = 69344, upload-time = "2026-09-15T19:33:48.403Z" }, - { url = "https://files.pythonhosted.org/packages/50/2d/fbe3063242c80140757e1e592de5d43a4d84e2029bfc71e354472ad31c6e/propcache-0.5.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:e9fa0ec1edaa4a9a95d8e0ba4676f43f187323cc5249d8217b3d75484d922f77", size = 68116, upload-time = "2026-09-15T19:33:49.793Z" }, - { url = "https://files.pythonhosted.org/packages/37/35/cad45301af9eb52df154c69ec729b145d6e9471a303177ddce7daa2ac8d6/propcache-0.5.3-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:1003b8557b64ce8c09f4c0193be582231805997d6e74ca0e9c79eb7b375789b3", size = 63872, upload-time = "2026-09-15T19:33:51.668Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f2/aca47d82b4250ae3358c337cb995a1dac6f0b8102b6e2abedfddd19752e9/propcache-0.5.3-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:282cb412e862cfc23ab796addeeaeefe9ac85061349bf474249f7d77528135dd", size = 71457, upload-time = "2026-09-15T19:33:53.087Z" }, - { url = "https://files.pythonhosted.org/packages/3f/32/caf8744557cd15bb49c568c608656174b0939da79c08ac644e8e00ee3813/propcache-0.5.3-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:b6d618b5144fcd65ac04113cee9196525dc10c23c085f27f3c2c13de439d4853", size = 69883, upload-time = "2026-09-15T19:33:54.541Z" }, - { url = "https://files.pythonhosted.org/packages/66/3d/2e72598a1bf2ba567e0d235c44698619e149b768b9897aeab456058b058d/propcache-0.5.3-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:3c996ebbee2460fe77be155dd42ad4506fbcefed7a4b9b776b3894b0f52c1479", size = 73087, upload-time = "2026-09-15T19:33:55.952Z" }, - { url = "https://files.pythonhosted.org/packages/d1/62/a2d78ef2ea98415dd1eb3a33077748c1f3c90754f3a2ef74fc59b80c163e/propcache-0.5.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:95783c8fd4ec500c6afdcae87e9bb80c7379ef4dee5fcdf27c88e08f0c19621a", size = 70431, upload-time = "2026-09-15T19:33:57.744Z" }, - { url = "https://files.pythonhosted.org/packages/a7/2b/917e265634a01ecc7399389cf74490ae519908195b219ae423ad01d379f0/propcache-0.5.3-cp315-cp315-win32.whl", hash = "sha256:55dca8dd42e5c12d9b7949a50df9a283e9720d26899f6ee53208f1919664812c", size = 43306, upload-time = "2026-09-15T19:33:59.112Z" }, - { url = "https://files.pythonhosted.org/packages/4e/6d/b858585374e9523d836e1c6c4f3550bf4a4c3538695ee0426c527e9eab24/propcache-0.5.3-cp315-cp315-win_amd64.whl", hash = "sha256:f15dd057a45bcf50a000d515ca5263d567c18ebe7de85c71687fe2d88fb0dde3", size = 46057, upload-time = "2026-09-15T19:34:00.677Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e0/f338a35d3dc9f3e84560428107dbde712bf59c31ab2d9bb1387a1ed6e742/propcache-0.5.3-cp315-cp315-win_arm64.whl", hash = "sha256:07478d53a45cd33a9c721cde42a1074dc7fed8fc5562bcfd83172d5b1f140ee8", size = 43187, upload-time = "2026-09-15T19:34:02.228Z" }, - { url = "https://files.pythonhosted.org/packages/38/18/840bb1bf44edf12d52cd02352b40f1a31018785e9ef6385964bc267a3298/propcache-0.5.3-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:18ae303e7ae34fb2fdc21d190ffcdf025b8907e50da5393ff271b66fb08eb123", size = 110765, upload-time = "2026-09-15T19:34:03.67Z" }, - { url = "https://files.pythonhosted.org/packages/13/2a/e5885be96d3a0479c3aa1302655dd2e65e0f237a83282062ee75d765c98f/propcache-0.5.3-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:fd0c772d8f7d0f0cbb73271c64f658622d7c143c5696462c918f73f3a7542c2a", size = 63692, upload-time = "2026-09-15T19:34:06.091Z" }, - { url = "https://files.pythonhosted.org/packages/de/43/bad6e4fd4b3b1a9a6b0759f0160b99c336c66539caef250e24ab59893a40/propcache-0.5.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1864f5637f61cf3fb21d5351d494de0b896f9867c8b4f000b8301c7468c6a05b", size = 63835, upload-time = "2026-09-15T19:34:07.61Z" }, - { url = "https://files.pythonhosted.org/packages/18/0e/bba5b5593898c99bf218b8c37033c29d0f9ceeeed6d001d684cfce079b0a/propcache-0.5.3-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40cf37a31664e280fdbb6f8ea9ee5a16bcbe504c464f210d90f2e8cfac4c570c", size = 69636, upload-time = "2026-09-15T19:34:09.049Z" }, - { url = "https://files.pythonhosted.org/packages/bb/94/1661c047d9d3d44399e41755379d0989f6182cce413ae75f9bc704964f37/propcache-0.5.3-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8f0583da2556ac23e8eec959c45c608d7b5dce3c5e7637a81af695355a57b6c", size = 73032, upload-time = "2026-09-15T19:34:10.464Z" }, - { url = "https://files.pythonhosted.org/packages/5c/3c/5ea6e6b30ca4679f76a5b8b9b0f8ceb6c3e0f1e47092c6ba1d3ea609cf14/propcache-0.5.3-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f49d1c07dea7235efc959b72ceb592cdeb44b0f60ce69828af318c40ada3503c", size = 74452, upload-time = "2026-09-15T19:34:11.912Z" }, - { url = "https://files.pythonhosted.org/packages/11/87/82790257e9b79d4d01991a9a78978f108f01942dbc86fad6daa4b8538421/propcache-0.5.3-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67af78cf66472e82c8beb672930f6279d08c0007ba4cb675a70cee5cff1fac88", size = 71398, upload-time = "2026-09-15T19:34:13.342Z" }, - { url = "https://files.pythonhosted.org/packages/c0/45/7177024e81dec38178954dbbc47c4aedd29c0e98ddef6a530d7cf5dfefdb/propcache-0.5.3-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc601955fe451749386dc4d7f3e7f8f1d4db6846c8be4582c5ee21ee0acc7559", size = 71571, upload-time = "2026-09-15T19:34:14.846Z" }, - { url = "https://files.pythonhosted.org/packages/df/b1/c6370bbc0e4d93db0f9bb6b87a0fa17a41370d2cd8ae7943452d48a5ceca/propcache-0.5.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:bf82eea5664b0b1323d2304c68e84215a5b3a11bd9cc733df09edf7fbae7fcbb", size = 70519, upload-time = "2026-09-15T19:34:16.264Z" }, - { url = "https://files.pythonhosted.org/packages/f6/fc/b770765127e3250f004753b04d3ba078252115fb89c78c6afcd641f2770d/propcache-0.5.3-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:d9eb3b83d2c106e0a1bcc788dc4d375cf60d4f1a4bfb151858fb84d4baf184d8", size = 66244, upload-time = "2026-09-15T19:34:17.733Z" }, - { url = "https://files.pythonhosted.org/packages/96/79/cea8b45bb44eb4a9c4426cfc875d019bbebdcfc3ee84e575c5256281469f/propcache-0.5.3-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:b8149edcd93da046f6f1e3dad1df51c6257bef13f8171aec5b8aebbcba840f2e", size = 73634, upload-time = "2026-09-15T19:34:20.07Z" }, - { url = "https://files.pythonhosted.org/packages/8f/83/8d0579ad27a269be0e42db3d0be6cbb4aa39c6e4c3f8a3c41d93282969e3/propcache-0.5.3-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:02729b64fea4ae4d9a5a9a94ba56f360978b1538bd347a81df19c3e5520d1ecb", size = 72105, upload-time = "2026-09-15T19:34:21.472Z" }, - { url = "https://files.pythonhosted.org/packages/6d/90/f09606ca44cfcd8d4ce1e875ba2a338ad729935cf04f8a5bea7b75326a68/propcache-0.5.3-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:98bf605793ff20856a4bbc8af2e5ddbbf6cfefdf6b5cdc01587627a3e7057004", size = 75269, upload-time = "2026-09-15T19:34:22.888Z" }, - { url = "https://files.pythonhosted.org/packages/a1/f9/1e5db526cef0ba787260a175f658039e9f84c00172c8f5988f9c0abdc206/propcache-0.5.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:dc88c7b971999389dc5ceea90d8f346fb360888549e123644fc63b90dbd7f64f", size = 72917, upload-time = "2026-09-15T19:34:24.422Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ca/51c5334a99a0c705a88338a416b0a41309c85a158ef96c60188634e334ab/propcache-0.5.3-cp315-cp315t-win32.whl", hash = "sha256:1102c4f4390e6a50f1960b8cb494007f08f5a139b39fd278925330e622b03ab8", size = 45667, upload-time = "2026-09-15T19:34:25.834Z" }, - { url = "https://files.pythonhosted.org/packages/7a/2b/386cdaa1283a2754e058f8d15abc2cc4d77def40b30a2bde470b8554e8e3/propcache-0.5.3-cp315-cp315t-win_amd64.whl", hash = "sha256:09b5c52fec3f50ced0c5c810f02c1237d7c89a8f3f5345ad92c6a49faeafe6a9", size = 48367, upload-time = "2026-09-15T19:34:27.231Z" }, - { url = "https://files.pythonhosted.org/packages/25/6e/7abc3dc74992281778a4d17b9a9a2df2183d792b0c7be695822a95085e0c/propcache-0.5.3-cp315-cp315t-win_arm64.whl", hash = "sha256:74f50a14ccc90bf5e544521783aafaf8081a21eeb24fbcb295ecb79d766a140e", size = 45420, upload-time = "2026-09-15T19:34:28.54Z" }, - { url = "https://files.pythonhosted.org/packages/5b/08/54e69cf685c73a2cac290a9684d9a148dc8cd22dffaa838dd969cba10e3a/propcache-0.5.3-py3-none-any.whl", hash = "sha256:abcef8e75a2c324dabd46c842c17cb005ae968596a567e43dfd6ee074f9f907b", size = 16132, upload-time = "2026-09-15T19:34:29.92Z" }, +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/56/030b7b4719d53085722893e0009dffb9236aa10bca1b12121bdc5626ef16/propcache-0.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a81be28596d6559f6131ef33e10200de6e17643b3c74ce03f9eb103be6ae8b", size = 93417, upload-time = "2026-05-08T20:59:15.597Z" }, + { url = "https://files.pythonhosted.org/packages/1a/55/1140a8e067b8ec093a18a4ae7bb0045d9db65da38a08618ddc5e2f1994aa/propcache-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29cbaac5ea0212663e6845e04b5e188d5a6ae6dd919810ac835bf1d3b42c3f4c", size = 53847, upload-time = "2026-05-08T20:59:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/0e7443c90310498561addf346e7d57fe3c6ba1914e1ba938b5464c7bbfd2/propcache-0.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bf3be92233808fcd338eba0fb4d0b59ec5772af4f4ecfcec450d1bfc0f8b5eb", size = 53512, upload-time = "2026-05-08T20:59:18.64Z" }, + { url = "https://files.pythonhosted.org/packages/b7/db/cf51a71bab2009517d1a7f0ee07657e3bd446c4d69f67e6966cf17bcf956/propcache-0.5.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f8ea531c794b9d6274acd4e8d2c2ebcac590a4361d27482edd3010b79f1325e", size = 58068, upload-time = "2026-05-08T20:59:20.683Z" }, + { url = "https://files.pythonhosted.org/packages/b7/43/39b6bdee9699fa1e1641c519feeb64a67e2a9f93bb465c70776b37a7333f/propcache-0.5.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:decfca4c79dd53ebab484b00cc4b6717d8c369f86e74aa4ca395a64ac651495e", size = 61020, upload-time = "2026-05-08T20:59:22.112Z" }, + { url = "https://files.pythonhosted.org/packages/26/0b/843726fbb0a29a8c5684fdb25971823638399f31e52e9d1f06a02dc9aa6b/propcache-0.5.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4621064bbf28fa77ff64dd5d94367c04684c67d3a5bf1dff25f0cd0d98a38f3b", size = 62732, upload-time = "2026-05-08T20:59:23.805Z" }, + { url = "https://files.pythonhosted.org/packages/39/6e/899fed76dc1942b8a64193a4f059d7f1a2c7ef65085e8a9366ed8ec0d199/propcache-0.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b96db7141a592cbc968daf1feea83a118e6ab378af4abbc72b248c895414c22d", size = 60140, upload-time = "2026-05-08T20:59:25.389Z" }, + { url = "https://files.pythonhosted.org/packages/ab/09/3da4be9b5b879219ad234aa535b3dd4a080ed1ad48d3a73ca07a9e798f22/propcache-0.5.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ca071adabaab6e9219924bbe00af821f1ee7de113a9eca1cdc292de3d120f4d", size = 60400, upload-time = "2026-05-08T20:59:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/60/2f/09b72b874a9aa0044faf52a69807a6ed618e267ceaa9ec4a63195fa5b504/propcache-0.5.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e4294d04a94dcab1b3bccd8b66d962dcad411a1d19414b2a41d1445f1de32ad0", size = 58155, upload-time = "2026-05-08T20:59:28.48Z" }, + { url = "https://files.pythonhosted.org/packages/8a/37/97489848c54c95578045473954f10956d619ce6a09e7ac137b71cdcb698b/propcache-0.5.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a0e399a2eccb91ed18721f86aa85757727400b6865c89e88934781deb9c8498b", size = 57037, upload-time = "2026-05-08T20:59:30.146Z" }, + { url = "https://files.pythonhosted.org/packages/22/db/6c695285ccfc49012743ee9c98212b8c5dd0aed7b63cfd816d4a0f7a1601/propcache-0.5.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:823581fd5cb08b12a48bfa11fe962a7916766b6170c17b028fbdf762b85eb9bf", size = 61103, upload-time = "2026-05-08T20:59:31.626Z" }, + { url = "https://files.pythonhosted.org/packages/98/a9/1e500401ca593b0bdb6bf75a70bc2d723835fd53360edff6af70692c7546/propcache-0.5.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:949c91d1a990cf3b2e8188dfcfb25005e0b834a06c63fa4ef9f360878ce21ecf", size = 60394, upload-time = "2026-05-08T20:59:32.829Z" }, + { url = "https://files.pythonhosted.org/packages/1f/87/f638b6e375eae0f30a1a2325d8b34fd85fdc785bb9960cf805f3bf1ec69a/propcache-0.5.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:cc1177027eda740fdb152706bd215a3f124e3eea15afc39f2cb9fe351b50619e", size = 63084, upload-time = "2026-05-08T20:59:35.964Z" }, + { url = "https://files.pythonhosted.org/packages/f6/18/884573f5d97b6d9eba68de759a82c901b7e39d7904d30f7b8d58d42d2a12/propcache-0.5.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b05d643f944a8c3c4bd86d65ffd87bf3264b617f87791940302bc474d2ff5274", size = 60999, upload-time = "2026-05-08T20:59:38.481Z" }, + { url = "https://files.pythonhosted.org/packages/8f/1a/c3915eb059ceec9e758a56e4cfd955292bc0f201be2176a46b76d94b303a/propcache-0.5.2-cp310-cp310-win32.whl", hash = "sha256:8114f28879e0904748e831c3a7774261bd9e75f49be089f389a76f959dcd13fe", size = 39036, upload-time = "2026-05-08T20:59:40.323Z" }, + { url = "https://files.pythonhosted.org/packages/5b/02/1dfd5607501a602d19c1c449d2d193b7d1c611f9246b4059026a1189a80e/propcache-0.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:5fcb98e7598b1ee0addab320d90f65b530297a867dbfe9de52ea838077e16e3d", size = 42190, upload-time = "2026-05-08T20:59:42.232Z" }, + { url = "https://files.pythonhosted.org/packages/57/93/f71588ad08b3e6f4b555b5ef215808a3c02b042d0151ad82fa6f15be677a/propcache-0.5.2-cp310-cp310-win_arm64.whl", hash = "sha256:04dc2390d9edbbaef7461f33322555976ffddf0b650a038649d026358714e6c5", size = 38545, upload-time = "2026-05-08T20:59:44.087Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f1/8a8cc1c2c7e7934ab77e0163414f736fadbc0f5e8dd9673b952355ac175b/propcache-0.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74b70780220e2dd89175ca24b81b68b67c83db499ae611e7f2313cb329801c78", size = 90744, upload-time = "2026-05-08T20:59:45.799Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f4/651b1225e976bd1a2ba5cfba0c29d096581c2636b437e3a9a7ab6276270a/propcache-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4840ab0ae0216d952f4b53dc6d0b992bfc2bedbfe360bdd9b548bc184c08959", size = 52033, upload-time = "2026-05-08T20:59:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/15/a8/8ede85d6aa1f79fc7dc2f8fd2c8d65920b8272c3892903c8a1affde48cfb/propcache-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6844ba6364fb12f403928a82cfd295ab103a2b315c77c747b2dbe4a41894ea7", size = 52754, upload-time = "2026-05-08T20:59:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/7d/fe/b3551b41bbc2f5b5bb088fc6920567cd43101253e68fbaa261339eb96fe1/propcache-0.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2293949b855ce597f2826452d17c2d545fb5622379c4ea6fdf525e9b8e8a2511", size = 57573, upload-time = "2026-05-08T20:59:50.778Z" }, + { url = "https://files.pythonhosted.org/packages/83/27/ab851ebd1b7172e3e161f5f8d39e315d54a91bea246f01f4d872d3376aef/propcache-0.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0fd59b5af35f74da48d905dcbad55449ba13be91823cb05a9bd590bbf5b61660", size = 60645, upload-time = "2026-05-08T20:59:52.227Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/466b3d18022e9897cbda9c735c493c5bd747d7a4c6f5ea1480b4cec434b6/propcache-0.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29f9309a2e42b0d273be006fdb4be2d6c39a47f6f57d8fb1cf9f81481df81b66", size = 61563, upload-time = "2026-05-08T20:59:53.866Z" }, + { url = "https://files.pythonhosted.org/packages/27/1b/16ab7f2cf2041da2f60d156ba64c2484eadf9168075b4ff43c3ef60045af/propcache-0.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5aaa2b923c1944ac8febd6609cb373540a5563e7cbcb0fd770f75dace2eb817b", size = 58888, upload-time = "2026-05-08T20:59:55.457Z" }, + { url = "https://files.pythonhosted.org/packages/0a/67/bb777ffd907633563bf35fd859c4ce97b0512c32f4633cf5d1eb7c33512b/propcache-0.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66ea454f095ddf5b6b14f56c064c0941c4788be11e18d2464cf643bf7203ff67", size = 59253, upload-time = "2026-05-08T20:59:57.075Z" }, + { url = "https://files.pythonhosted.org/packages/b9/42/64f8d90b73fd9cdc1499b48057ff6d9cd2a98a25734c9bb62ecf07e87061/propcache-0.5.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:95f1e3f4760d404b13c9976c0229b2b49a3c8e2c62a9ce92efdd2b11ada75e3f", size = 57558, upload-time = "2026-05-08T20:59:58.602Z" }, + { url = "https://files.pythonhosted.org/packages/eb/02/dba5bc03c9041f2092ea55a449caf5dfe68352c6654511b29ba0654ddb69/propcache-0.5.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85341b12b9d55bad0bded24cac341bb34289469e03a11f3f583ea1cc1db0326c", size = 55007, upload-time = "2026-05-08T20:59:59.837Z" }, + { url = "https://files.pythonhosted.org/packages/14/c0/43f649c7aa2a77a3b100d84e9dea3a483120ecb608bfe36ce49eaff517fe/propcache-0.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:26a4dca084132874e639895c3135dfad5eb20bae209f62d1aeb31b03e601c3c0", size = 60355, upload-time = "2026-05-08T21:00:01.144Z" }, + { url = "https://files.pythonhosted.org/packages/83/c0/435dafd27f1cb4a495381dae60e25883ccfe4020bb72818e8184c1678092/propcache-0.5.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3b199b9b2b3d6a7edf3183ba8a9a137a22b97f7df525feb5ae1eccf026d2a9c6", size = 59057, upload-time = "2026-05-08T21:00:02.401Z" }, + { url = "https://files.pythonhosted.org/packages/53/ae/6e292df9135d659944e96cb3389258e4a663e5b2b5f6c217ef0ddc8d2f73/propcache-0.5.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e59bc9e66329185b93dab73f210f1a37f81cb40f321501db8017c9aea15dba27", size = 61938, upload-time = "2026-05-08T21:00:03.638Z" }, + { url = "https://files.pythonhosted.org/packages/0b/42/314ebc50d8159055411fd6b0bda322ff510e4b1f7d2e4927940ad0f6af20/propcache-0.5.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:552ffadf6ad409844bc5919c42a0a83d88314cedddaea0e41e80a8b8fffe881f", size = 59731, upload-time = "2026-05-08T21:00:04.881Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9b/2da6dee38871c3c8772fabc2758325a5c9077d6d18c597737dc04dd884cd/propcache-0.5.2-cp311-cp311-win32.whl", hash = "sha256:cd416c1de191973c52ff1a12a57446bfc7642797b282d7caf2162d7d1b8aa9a0", size = 38966, upload-time = "2026-05-08T21:00:06.511Z" }, + { url = "https://files.pythonhosted.org/packages/42/4e/f17363fb58c0afe05b067361cb6d86ed2d29de6506779a27547c4d183075/propcache-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:44e488ef40dbb452700b2b1f8188934121f6648f52c295055662d2191959ff82", size = 42135, upload-time = "2026-05-08T21:00:08.088Z" }, + { url = "https://files.pythonhosted.org/packages/c6/eb/6af6685077d22e8b33358d3c548e3282706a0b3cd85044ffba4e5dd08e3b/propcache-0.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:54adaa85a22078d1e306304a40984dc5be99d599bf3dc0a24dc98f7daeab89ab", size = 38381, upload-time = "2026-05-08T21:00:09.692Z" }, + { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" }, + { url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654, upload-time = "2026-05-08T21:00:12.604Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" }, + { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" }, + { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" }, + { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" }, + { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" }, + { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" }, + { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" }, + { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" }, + { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" }, + { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" }, + { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" }, + { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" }, + { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835, upload-time = "2026-05-08T21:00:38.072Z" }, + { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" }, + { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" }, + { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" }, + { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" }, + { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" }, + { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" }, + { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" }, + { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257, upload-time = "2026-05-08T21:01:01.195Z" }, + { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" }, + { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" }, + { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" }, + { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" }, + { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" }, + { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" }, + { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" }, + { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662, upload-time = "2026-05-08T21:01:22.683Z" }, + { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928, upload-time = "2026-05-08T21:01:23.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650, upload-time = "2026-05-08T21:01:25.305Z" }, + { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912, upload-time = "2026-05-08T21:01:26.545Z" }, + { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300, upload-time = "2026-05-08T21:01:27.937Z" }, + { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208, upload-time = "2026-05-08T21:01:29.484Z" }, + { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633, upload-time = "2026-05-08T21:01:31.068Z" }, + { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724, upload-time = "2026-05-08T21:01:32.374Z" }, + { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069, upload-time = "2026-05-08T21:01:33.67Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099, upload-time = "2026-05-08T21:01:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391, upload-time = "2026-05-08T21:01:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626, upload-time = "2026-05-08T21:01:37.545Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781, upload-time = "2026-05-08T21:01:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570, upload-time = "2026-05-08T21:01:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" }, + { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" }, + { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395, upload-time = "2026-05-08T21:01:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653, upload-time = "2026-05-08T21:01:47.307Z" }, + { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914, upload-time = "2026-05-08T21:01:48.573Z" }, + { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567, upload-time = "2026-05-08T21:01:49.903Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542, upload-time = "2026-05-08T21:01:51.204Z" }, + { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845, upload-time = "2026-05-08T21:01:52.539Z" }, + { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985, upload-time = "2026-05-08T21:01:53.847Z" }, + { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999, upload-time = "2026-05-08T21:01:55.179Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779, upload-time = "2026-05-08T21:01:57.489Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796, upload-time = "2026-05-08T21:01:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023, upload-time = "2026-05-08T21:02:00.228Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448, upload-time = "2026-05-08T21:02:01.888Z" }, + { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329, upload-time = "2026-05-08T21:02:03.484Z" }, + { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172, upload-time = "2026-05-08T21:02:04.745Z" }, + { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" }, + { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, ] [[package]] name = "protobuf" -version = "7.36.1" +version = "6.33.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/86/73/f66c748df06e7fe24e658eddd600d19c4b40bad836c97ce2d0ad9851fb6b/protobuf-7.36.1.tar.gz", hash = "sha256:d0f6470f0ce2b84e3feaea2d4b816378b37ba4d4aa08a274305373de93e2d524", size = 512499, upload-time = "2026-08-31T22:40:04.667Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/6c/3a54a58f2948b0f485df9ecdd06590f15d0a7abf46a89d50c3de709ff4ff/protobuf-7.36.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:3cf2ee25d006cee57294a1196ea43b37feb78e0dcd1e8af5c1aeddb777655aca", size = 456046, upload-time = "2026-08-31T22:39:56.865Z" }, - { url = "https://files.pythonhosted.org/packages/6e/08/9f9548793c771095245c0eeaf0c84b76b16a5ef26158043d456f551344a0/protobuf-7.36.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:43d3d37b1eb24c113b9b7d02008cac44e423f00b611b7781ae998d7623972969", size = 344226, upload-time = "2026-08-31T22:39:58.263Z" }, - { url = "https://files.pythonhosted.org/packages/fe/51/1bdbd612fa3c51e42ea6f45d05e84dc748ddcd2663e1aa1e89a00a33facd/protobuf-7.36.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:39c518c05586c016d7874ff6079ee115bcec1ea5fbb1d177fbf7867ef4c67e44", size = 357229, upload-time = "2026-08-31T22:39:59.198Z" }, - { url = "https://files.pythonhosted.org/packages/22/df/c799fe7a05ef16ba853a59db01f3a2c5f7d0676469589ccc4874f76a2a88/protobuf-7.36.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:97198b77e369a0abd8e262b8f6c7266c55ddb796a3a12c76d7b8881188ed83aa", size = 343228, upload-time = "2026-08-31T22:40:00.179Z" }, - { url = "https://files.pythonhosted.org/packages/3d/33/d4724ec5d86d496fe4108e220618aa0837ad3423a7af7ccdd9684ccc77c8/protobuf-7.36.1-cp310-abi3-win32.whl", hash = "sha256:0b53ce95272aad50ad25d7ff03373743209822e8ba42ea7fad27d2bee1547d00", size = 443002, upload-time = "2026-08-31T22:40:01.32Z" }, - { url = "https://files.pythonhosted.org/packages/db/37/155788a0d8daded960375af604202805308169f9b859419ea0aa370946e2/protobuf-7.36.1-cp310-abi3-win_amd64.whl", hash = "sha256:51139351435d9b43d88a55eaa49fb6f737fbb478fb0cbf2cf694d1a04a9d3363", size = 456518, upload-time = "2026-08-31T22:40:02.494Z" }, - { url = "https://files.pythonhosted.org/packages/39/ca/c47f91d3cab175b01fd8c4f0d80fdf8613be876cc616e66ad281a59c5ddf/protobuf-7.36.1-py3-none-any.whl", hash = "sha256:7d951e46b3f963d6c264c367c437921de9d5aedd9c3f9612b9077736b4e3ad5c", size = 179813, upload-time = "2026-08-31T22:40:03.54Z" }, + { url = "https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739, upload-time = "2026-03-18T19:04:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089, upload-time = "2026-03-18T19:04:50.381Z" }, + { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, + { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, + { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, ] [[package]] @@ -3793,7 +3593,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.13.5" +version = "2.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -3801,125 +3601,125 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/53/ef/fc4f868f4e2cee79f863883abffceff107875f569b848507319842d2a681/pydantic-2.13.5.tar.gz", hash = "sha256:51a9c5f7b2f8e636f04c6cada605d9b6a3bf1348fdf945a3d8869b19bba0ee08", size = 845750, upload-time = "2026-08-28T14:04:00.916Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", hash = "sha256:346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73", size = 472589, upload-time = "2026-08-28T14:03:59.136Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, ] [[package]] name = "pydantic-core" -version = "2.46.5" +version = "2.46.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/f9/8a06bea35ef8daf588f707784c973a7046e0034c8d8cfb08828eeffb8b75/pydantic_core-2.46.5.tar.gz", hash = "sha256:10416c15b8839ecc4ef4d0885da76da6fd0f67333a0eb8aff6d93c4b8f2910fc", size = 472262, upload-time = "2026-08-28T10:01:31.677Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/74/6b/8f79692844269427abb3e4dd9e68edfcbe65ae25527d99183214de716c59/pydantic_core-2.46.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:657b40d6240c0a7b6a64b30f22d1e3aa631c7e846c621b0c0f6d1d75e2e15ea6", size = 2076533, upload-time = "2026-08-28T09:57:35.421Z" }, - { url = "https://files.pythonhosted.org/packages/bd/d0/c787604c71c2bdcda1a5656942fc822cd0f9cd879b9484bb84fc42172703/pydantic_core-2.46.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ecb42011e12ee19cafbc312887cbf3546959fe02fbad44f272d4be5baa997615", size = 1924650, upload-time = "2026-08-28T09:57:37.944Z" }, - { url = "https://files.pythonhosted.org/packages/4a/77/ca2f8e997d9bfdb32205297aff38f210f398822d895b1af1b59fd9df9c13/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dedce55295becb61921e386b99d4f2706045306e7fa52249a33004c837379fb", size = 1951261, upload-time = "2026-08-28T09:57:39.339Z" }, - { url = "https://files.pythonhosted.org/packages/a0/53/bd12e1a9255df4edee00353778e2614b5346265d51e1567ab72153e803a2/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f47b8a949e60f027f0aa0a6f6c7b7e9c55cbf4380d10b344e282fa4e7ab1e1b", size = 2021808, upload-time = "2026-08-28T09:57:40.69Z" }, - { url = "https://files.pythonhosted.org/packages/d7/41/f7f312751ebc6d6767da91964a9c7954c18e226a1720ab234e3dfb9d6c17/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:200aa3dc9f8d54f0754f43247c0bad0999fdcfbfd2488384dd44f37279271fe6", size = 2196184, upload-time = "2026-08-28T09:57:42.275Z" }, - { url = "https://files.pythonhosted.org/packages/3d/93/ce93aa030ab6bac4683ba8861e7baad89dd24b02e66b8801a0e4f6a00311/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d30e1a4f138b8951063e9a394752a9179b51da288ffa507b1e659222f4c1793", size = 2238212, upload-time = "2026-08-28T09:57:44.122Z" }, - { url = "https://files.pythonhosted.org/packages/34/a1/c8e6b66f499f510752c07a092dfe27621f9c255635e59d38704b5681c35a/pydantic_core-2.46.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:850a08d167dde16db8702c274f320c7be9d7da6f6dff2b58b18f9e815bd94f5b", size = 2064073, upload-time = "2026-08-28T09:57:45.613Z" }, - { url = "https://files.pythonhosted.org/packages/5c/fa/605e2b127ee30dbf4b1da9da4843587cf2b2d16486c241cc7a5be2d2c1bd/pydantic_core-2.46.5-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:c3471e5c4a949c26ec00a77f01df59096aa9495877de76fd60a980f8ee6be461", size = 2093102, upload-time = "2026-08-28T09:57:46.953Z" }, - { url = "https://files.pythonhosted.org/packages/4a/f7/1ab28093c09032ddce7c92c7a55d503b6ecd70f42c32492946c1cb5477b1/pydantic_core-2.46.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a3e26b6a8274211bddee2d0e4d0d42778f17a34510f49d2ec44b58abfc41736", size = 2133452, upload-time = "2026-08-28T09:57:48.362Z" }, - { url = "https://files.pythonhosted.org/packages/30/c8/47c79b756f12f85e8b0fbdb2b495f6b6eb32e6c98a4beae7a570a0b7c63c/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc5d783bd4a2387e97b8a2d5ec781cfb92b3d893bf82370548e99db5915935d3", size = 2146477, upload-time = "2026-08-28T09:57:49.74Z" }, - { url = "https://files.pythonhosted.org/packages/13/5c/79fc00cb8f651d6061991de8d7cedf1c78c73cbd4862c42ef418f03b8bfa/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:356c8368cbc321050b169595683a2e1d63413b1e0e2868b330af9fc14c616d3f", size = 2300832, upload-time = "2026-08-28T09:57:51.639Z" }, - { url = "https://files.pythonhosted.org/packages/b4/72/dd1a29853cf6d22a1ebd9e3baf0239cbc57d2d16caff36a89e38eb9b1db3/pydantic_core-2.46.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb7d8d0e5886a89a55d2eef490e272fa965a9d57c6b29a5b5088a7997ec2cad1", size = 2320505, upload-time = "2026-08-28T09:57:53.236Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d1/ba4a8e06a9ddad0b4caf69cfaeecc0fbfcec20473bd808f5127fd16491c4/pydantic_core-2.46.5-cp310-cp310-win32.whl", hash = "sha256:4d44cf99ddebf875f9b68cc267aa684c99b7b44fe63ee1cac4ec163807290069", size = 1956853, upload-time = "2026-08-28T09:57:54.592Z" }, - { url = "https://files.pythonhosted.org/packages/f2/94/205ed9d7ddaf44acd489889708ea124a3f41bdb42c141c8684d528ad0e7a/pydantic_core-2.46.5-cp310-cp310-win_amd64.whl", hash = "sha256:1e5aad1220a1192c42341c8fd4a8686657e73ab2a920c970bdc4de334fe3193d", size = 2042551, upload-time = "2026-08-28T09:57:56.017Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b6/81d2d19ea0be2c03664381b59f65fa72fc7969decedae00bc2c4ad835708/pydantic_core-2.46.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a1dee1b804ff4d11c663636cf15d2ea47e9f79cd56c033fb1cbf08924842a48f", size = 2074737, upload-time = "2026-08-28T09:57:57.711Z" }, - { url = "https://files.pythonhosted.org/packages/0c/18/b70da8300e292df4099684ea11b1958043580d2f50d2dc8bf7e542bdd84a/pydantic_core-2.46.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d625a186a65201c23a9e3b8ed9c47e90a026e03256608cc91851c6709096844f", size = 1921751, upload-time = "2026-08-28T09:57:59.265Z" }, - { url = "https://files.pythonhosted.org/packages/e7/1a/0d590341b6ffa4b4aca83508e6b8db4761aaeacfc15a25ca3815876d4797/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8507560a9284e1370bb048ed4282012fbef4e8d109875b95e884d228552061", size = 1948231, upload-time = "2026-08-28T09:58:00.678Z" }, - { url = "https://files.pythonhosted.org/packages/7d/1d/02eb35761c51f2f7b1b042d6ab4cda6600f0c8c88a2243b3f734376201e5/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f93c5fe914d75fbec9a49209b00da5f08e9e467d69da2b1510c81940cfd10be", size = 2020708, upload-time = "2026-08-28T09:58:02.267Z" }, - { url = "https://files.pythonhosted.org/packages/4a/ea/f86073830e35d508cc8ddf9c3d9e6e6840fcb88d34bf726b0b4710186f27/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c767f552b21b10f774aeac128e828eafb796adfa1b666a18bf6321453c3a", size = 2194914, upload-time = "2026-08-28T09:58:03.934Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d7/fc36240d7791ce90939e51608568c33bfdae26202016f9770c229a487d86/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:701b2e04b560eeb4bddf7a25ab8ca476176e34fdbd9a0e18196f0d12d4685f0b", size = 2235622, upload-time = "2026-08-28T09:58:05.516Z" }, - { url = "https://files.pythonhosted.org/packages/cf/bc/3fa2d76b83162820a17da7f645b28d1cba99fc8e1e5fc6517067ec450fa1/pydantic_core-2.46.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49776eab08766a08dfff7012f8b422dcd7e25e43b316eedf0477c24fcfa84b7c", size = 2062091, upload-time = "2026-08-28T09:58:07.135Z" }, - { url = "https://files.pythonhosted.org/packages/ab/9a/095d557bb492c90cd8a70a6dd048bf793d433d03d86c81c11e912e4cd049/pydantic_core-2.46.5-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:a2468d93d181667a7abd66e1b64bb9f76f361b0fef8faddf687456453576f5ee", size = 2089904, upload-time = "2026-08-28T09:58:08.814Z" }, - { url = "https://files.pythonhosted.org/packages/24/98/7b76b1ad10a19a617a52aaa1d80e159115af939b095e86f8e756fd52e0df/pydantic_core-2.46.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53feb344243bb9510a9dec7bf3cf1b64d88a98af5dc7872a5160465f8b198c8e", size = 2132244, upload-time = "2026-08-28T09:58:10.435Z" }, - { url = "https://files.pythonhosted.org/packages/20/32/7d6ca365fadba186a0c8f85de1a701663bce81efd309d9479be58687622f/pydantic_core-2.46.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cd5214352ae68f3b5e9af7768bdc5253695ee069675db3480518420b3be881f2", size = 2143901, upload-time = "2026-08-28T09:58:12.033Z" }, - { url = "https://files.pythonhosted.org/packages/f8/09/eb9a6aa57f22fd1541a9c0aa2a1f3aeef3ec65347d33e10a6da2f43e0ee9/pydantic_core-2.46.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:9432f3598db432cb51c5b37fdbf29a60fcccc79e30d37a05022776a6bc4ab689", size = 2299425, upload-time = "2026-08-28T09:58:13.614Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f9/548a5bb9d4ba8cd26e26daf48052236f6b38bb61e7b7241fbc3c995719eb/pydantic_core-2.46.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8feeac04b5794e513e710af2f9c87d49f31a6dc47967bb264a1fed61a8989bec", size = 2318566, upload-time = "2026-08-28T09:58:15.199Z" }, - { url = "https://files.pythonhosted.org/packages/4a/20/06454d18834c02c406c9133f1a3b485305fd9ee984f9636c2f730bef6a9d/pydantic_core-2.46.5-cp311-cp311-win32.whl", hash = "sha256:892a881d5f68c2b9ea304b7a6c2c60d9343df578a311b0f86b94bc8f1ffe8129", size = 1954258, upload-time = "2026-08-28T09:58:16.813Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c2/718b9deb4b72453b5d8c7447a3b14cb77bef36917ef5f514e0948a4096a0/pydantic_core-2.46.5-cp311-cp311-win_amd64.whl", hash = "sha256:40375c2d05acec10323e45dfe2077ac44bc74659008614af5069034e2cfc781c", size = 2041030, upload-time = "2026-08-28T09:58:18.288Z" }, - { url = "https://files.pythonhosted.org/packages/67/ea/c1d1a5b72d6e1ff7f377a4d9199f6591f095beb5b409a8a5d89f7238d939/pydantic_core-2.46.5-cp311-cp311-win_arm64.whl", hash = "sha256:28a6a556cd3b6066bea827857f9d9cce027c96f776e512f544a581f9e42161f8", size = 2009234, upload-time = "2026-08-28T09:58:19.929Z" }, - { url = "https://files.pythonhosted.org/packages/82/3f/76358795aa7a8c6d4f36e2cb828ad1c90ee118e1393a9281664f5aade9d4/pydantic_core-2.46.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9fe6fb92520e3fd61f2e49000b6911b188824f089b75973ea06d6267f0b476d", size = 2076516, upload-time = "2026-08-28T09:58:21.576Z" }, - { url = "https://files.pythonhosted.org/packages/db/50/26b091836076ce4cb2fac264186936acc069e0595772cfd02a563bc4761a/pydantic_core-2.46.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a39ac25a9a2fa4072efdb429833c4a4c8009a51ff9eea3eeae131713cd27991e", size = 1922874, upload-time = "2026-08-28T09:58:23.766Z" }, - { url = "https://files.pythonhosted.org/packages/09/f0/2a8ce3849e299d44e2d2c196b6082643a3235565a735cb51db7a6261f614/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fdc8b93a41521988916eeaa271173fcca7fa0803d62f87675aac8dcec1c8e29", size = 1951772, upload-time = "2026-08-28T09:58:25.435Z" }, - { url = "https://files.pythonhosted.org/packages/87/46/ac0dc8bdd9e6048183a14eb127764e7ad9240021c17513074a4711b0e31e/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b98134087d9de723658d17a42c7d0da8d6e2ef08015dee7dc93889047315f5e4", size = 2031832, upload-time = "2026-08-28T09:58:27.102Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c2/339de5bef7be36301a2231eaa52e62163742c2281f11b5f4892bc79785cd/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e652ab17569c94bff5475520f907b7148b8c24036a8ebbe5cf7cf7493d28579a", size = 2208645, upload-time = "2026-08-28T09:58:28.948Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a0/9ff22b797724262da14427abaed4dd1d864a139693fc5e7809114376a716/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d925f3d9afd05a8c0fb3a1031463a8d59ebe5e2afad297e29c78be19e13b4e62", size = 2265935, upload-time = "2026-08-28T09:58:30.625Z" }, - { url = "https://files.pythonhosted.org/packages/c0/a4/eb9409ec0736e50aa70a412f16c204ed149516846912f7e6724d4c73ee53/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2", size = 2066284, upload-time = "2026-08-28T09:58:32.289Z" }, - { url = "https://files.pythonhosted.org/packages/c0/02/7f6156ffc926857f1c37c07d9a388682865a81830ab6a1b637082c25e399/pydantic_core-2.46.5-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:816ff0a6550ffc06c098ccd2e0698600f9aa7da192a79eaa6f9af504a35db869", size = 2105889, upload-time = "2026-08-28T09:58:33.986Z" }, - { url = "https://files.pythonhosted.org/packages/92/b1/e781d357ebe09fc929f995700f1b3503e8897f1cece183ecb1300d4d67e9/pydantic_core-2.46.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c7ea57fc63aa7da93a1bd2d644e6577befae10c52c4e36377635eea1056a74f5", size = 2158006, upload-time = "2026-08-28T09:58:35.647Z" }, - { url = "https://files.pythonhosted.org/packages/70/0a/644597d84ab400e50609c192120b85c9681c22d3a20461b9060a79be0a7a/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:efd62a42486f1bda5d24cb4f63d15a3c7768375fe83d36f9417b4ad7a2fb20b3", size = 2158408, upload-time = "2026-08-28T09:58:37.38Z" }, - { url = "https://files.pythonhosted.org/packages/1e/ee/ca3b7b3a4b3769ffe9ce9432a7c9be755de9593a46d3b0d54d0409323e44/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:2bc9419666990c06d7397831f2126a1ecc3594aaa3ff7de5bf2d066802f4e07b", size = 2309609, upload-time = "2026-08-28T09:58:39.22Z" }, - { url = "https://files.pythonhosted.org/packages/ce/52/39fa1f451486019524ca685020390e7ca351832fd874530ba30c8628e6dc/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18a09e1e1011b462f2e32774f25859ef1223d5c2b0546a633cf56654710721e0", size = 2342618, upload-time = "2026-08-28T09:58:40.89Z" }, - { url = "https://files.pythonhosted.org/packages/81/5e/468fc630568c61dcef3cd47ad32ffbeed9af643f49208d1ea86ab4f890c4/pydantic_core-2.46.5-cp312-cp312-win32.whl", hash = "sha256:5cb482e9e84c851f4e623fe4acc1ced89168cf1fe18f7089db4548c8f5bbb65b", size = 1939475, upload-time = "2026-08-28T09:58:42.591Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c9/4c19f41b84cf6b622a72fbeed7665b25d47a187d68d47d0d430c07f23268/pydantic_core-2.46.5-cp312-cp312-win_amd64.whl", hash = "sha256:5e81740c09e310f5aa5cbd3e434a01c154d4bef93241c7877b39f211d2b78ba8", size = 2043140, upload-time = "2026-08-28T09:58:44.272Z" }, - { url = "https://files.pythonhosted.org/packages/af/dd/0c1a050299147c746e5256db16d645ab5efd4f78c59937d581a0524e74a2/pydantic_core-2.46.5-cp312-cp312-win_arm64.whl", hash = "sha256:f7b0ec93a2893de856652154d73b7ba622f26fa97726487dcac373de5f4c6084", size = 1997729, upload-time = "2026-08-28T09:58:46.13Z" }, - { url = "https://files.pythonhosted.org/packages/f5/37/5abe39a8372a61d3dc3c1338fc504281c01b32fdb3169cd7187153b56d3e/pydantic_core-2.46.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:b7ca9034437b6022f941f4857459562ee00a560b97e7cce8a0ec5a74fc6766e0", size = 2075885, upload-time = "2026-08-28T09:58:47.856Z" }, - { url = "https://files.pythonhosted.org/packages/21/43/6323b1f8b217780454c61304bcd2b38ae4762f50754414124603ccc90bb2/pydantic_core-2.46.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f332f0e72a5a0400141f830744e141bf9f97917878dbe968669e8a7fefea78ff", size = 1922768, upload-time = "2026-08-28T09:58:49.58Z" }, - { url = "https://files.pythonhosted.org/packages/0f/a3/c05ca796e1197618a774b01e596aeedfefc2f7d8c01ae3054e910b120e8a/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:193375f3548919d3f0b60936ca113ada3e38f264f91b9b8e0508efaad57be931", size = 1951241, upload-time = "2026-08-28T09:58:51.511Z" }, - { url = "https://files.pythonhosted.org/packages/68/32/33bc39ac705c52cffc908e8389f9754fdb208aea5c69cceddf4eb3ce99af/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79bdfa52f843137045b2d081cc05c120ba6665d29b7559c2c47690906f39279f", size = 2031975, upload-time = "2026-08-28T09:58:53.166Z" }, - { url = "https://files.pythonhosted.org/packages/b0/70/2333e885c0f6a67bc105c5916965dac9b57f2718ee20d81d1a06a4ebdc13/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24922243639cbdac66c75fcb6fd6495a9cb52b213d62f9a0d16f0310b1ff8038", size = 2208542, upload-time = "2026-08-28T09:58:55.017Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ea/296debfb4264207bbda5936133892e027c0a58875ad53ebd512fba8ec3a2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76fe65e607be28c7fd4d56fc3c42b1583aa058ce3408b7ad0fd540171d31f9f", size = 2264692, upload-time = "2026-08-28T09:58:56.767Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f2/9e4de77a6271e07a76d2d58b11c091a979c191ed2939bf80067568b369d2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f7b393a8b3da82f5c1fc0751e6d01ac6c55b93c18226a60bdfba4a724efafd1", size = 2066633, upload-time = "2026-08-28T09:58:58.531Z" }, - { url = "https://files.pythonhosted.org/packages/8d/db/f9e9d0c97445987b2084823d5c240de88087338f04fc2cfaa2df186b8049/pydantic_core-2.46.5-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:7ac031912d54f3d83ef3b3eb98dfabc1608802e2202263d25957eeed40b94761", size = 2105235, upload-time = "2026-08-28T09:59:00.421Z" }, - { url = "https://files.pythonhosted.org/packages/07/c5/79169b047b3b2c3e99e04bc76372af9637e0bf6db638274fa927df96369e/pydantic_core-2.46.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:837b396ca3d7b74091ca623f6cbd8351bd42d670a79c2683e79fb089f06a2de5", size = 2157367, upload-time = "2026-08-28T09:59:02.442Z" }, - { url = "https://files.pythonhosted.org/packages/26/b5/ba6057afb7c291bd449f51b867f95aef2072941c4ce4e5c31d6ffd132d3b/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:5ee239d575f80b08eca11f6e20f90c4c695de7825c67eefe6091fbf20dda648e", size = 2158420, upload-time = "2026-08-28T09:59:04.2Z" }, - { url = "https://files.pythonhosted.org/packages/6e/28/2057abecaafdc22912afa819603a51f0a62d40643b7c4871c51721fea9be/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e80675d75ae2cd14372cb65cad5400d9347a3d3f6c13000183f22dfd027283ed", size = 2309588, upload-time = "2026-08-28T09:59:06.048Z" }, - { url = "https://files.pythonhosted.org/packages/71/9d/881156dc404e27479c4246128d73538464cab4a239bec61995e227644c30/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c4b71f10dd532fb7a5cbc8f58707779e64f03a258c2bf8bfbaecfcd9970b519", size = 2341866, upload-time = "2026-08-28T09:59:08.539Z" }, - { url = "https://files.pythonhosted.org/packages/5a/38/d66f443a259f84d13babdceae568e572b0ed26da17ca5d0a649ebb110a67/pydantic_core-2.46.5-cp313-cp313-win32.whl", hash = "sha256:97bf8de4d541598c94a59344eeb988a94c08ff76b5723c41f6567ec18c7892ea", size = 1938580, upload-time = "2026-08-28T09:59:10.402Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1e/1d5371213f4cc9a7ed70c0bfcc7911de22311ee99a662a56077d7292d2ac/pydantic_core-2.46.5-cp313-cp313-win_amd64.whl", hash = "sha256:15f4a94963c95accac15b7b657bb177d3ad82bb90b0d0526d9a9b85079925db5", size = 2041980, upload-time = "2026-08-28T09:59:12.396Z" }, - { url = "https://files.pythonhosted.org/packages/5a/48/4222d90b1c67568bace4dec6dca6271449c66de3595d72b6d098f5fde597/pydantic_core-2.46.5-cp313-cp313-win_arm64.whl", hash = "sha256:d22a945598fb91236b4dd793a6e42e4f3dd7740bb5aace5ebd7d4c08d13bb575", size = 1997213, upload-time = "2026-08-28T09:59:14.245Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8a/14596f2a8367da50cf7cbac48169ee5d9c8e11d486a3b527082384630c72/pydantic_core-2.46.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c1c43ad4339643d70ebb8124e1305a7dab423001eff58bb41a0f731adbc98355", size = 2074081, upload-time = "2026-08-28T09:59:16.141Z" }, - { url = "https://files.pythonhosted.org/packages/ae/d5/d8a4eb6d6c7f66b91dd37c576d76e9e60fba900caf5372c17bcf949febc2/pydantic_core-2.46.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1a353f84de772f423b5ffb11d7ae352fbbef0f446f3c0b0af0f8236d7233606e", size = 1920497, upload-time = "2026-08-28T09:59:18.065Z" }, - { url = "https://files.pythonhosted.org/packages/8e/26/092079428f86e927e030b2c0ced87df69dbb1c875cdeaa67bf42ea2be746/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5086029a57366b8cf81b130a43908738095c270c21a8d7f0e8bdfdb89718e2f3", size = 1952130, upload-time = "2026-08-28T09:59:20.476Z" }, - { url = "https://files.pythonhosted.org/packages/08/c3/8ec0e290a9ebaebd64047bf5fda94be835c6b1551b02437e4b76778fbcd7/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46c25dda9d092a06c08db76ffe0a197107904d0dfac653f7d5306bbcd6d6119c", size = 2026371, upload-time = "2026-08-28T09:59:22.227Z" }, - { url = "https://files.pythonhosted.org/packages/01/72/4fd20ad520fb8da0157f95b27a7eb05a72790ef08138e7701ac972c342ea/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37ea7b83c935e5b0d68c9449b82651accf78a10828b2c02b2f2d9e9496446c21", size = 2202822, upload-time = "2026-08-28T09:59:24.277Z" }, - { url = "https://files.pythonhosted.org/packages/31/b0/d16e0771206b29314f0d52198b720be21e8a99ab2bf11e3bc0d7c9cebdff/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64e88d5585bea9ce95861079de72006c7fa6d3df4e3a3b65ba31eb979c15c9f", size = 2262756, upload-time = "2026-08-28T09:59:26.608Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f", size = 2068352, upload-time = "2026-08-28T09:59:29.044Z" }, - { url = "https://files.pythonhosted.org/packages/08/7c/570abb1ad2155348dc754ea91be22e5aaa18eb6d69a6068f7c6f2679a6ed/pydantic_core-2.46.5-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:a2a5e1d0ff29adddc9f6d6821a66302e4493f8ca898b715b6b1182c2c201ea0a", size = 2104777, upload-time = "2026-08-28T09:59:30.95Z" }, - { url = "https://files.pythonhosted.org/packages/8e/25/5bf74adc65a1ac5b7be3f6cb0bcb5433615c1598a801c19d830d84c98ded/pydantic_core-2.46.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03b9666e41e35d8909852ba191a0607520f81b74eaf12ccf8737005dbb313821", size = 2156312, upload-time = "2026-08-28T09:59:32.604Z" }, - { url = "https://files.pythonhosted.org/packages/90/6a/2ef38830675e050121040618135564ed56b860b45433b02d9b4ebece46f3/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:a91c17edf6eea2402cb5457b4c89e99bc5ed1004aa34c4adf1d4258c1a5c22c2", size = 2150067, upload-time = "2026-08-28T09:59:34.453Z" }, - { url = "https://files.pythonhosted.org/packages/90/ef/a7dbb03a14a64c2a4621f989c615ed9a892535a6cad938fc27079f919d80/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b49924c73a235e969511bf2aabdff3beebf9820931f646c80274d5d780010c47", size = 2304516, upload-time = "2026-08-28T09:59:36.194Z" }, - { url = "https://files.pythonhosted.org/packages/68/f8/6bb4c4b80e8a6fde1904c64a51c62a1d04fcdfa3ea521a66b2ddefa1d885/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2cbd9a5eff05e51c447c34dfa4632145b26b09120cf04bd0c871e44c1a5e1c9a", size = 2335223, upload-time = "2026-08-28T09:59:37.931Z" }, - { url = "https://files.pythonhosted.org/packages/2a/80/f46b8c681195190b2c1f1c7c0a81abce60663e987613e09ef64d433dd96b/pydantic_core-2.46.5-cp314-cp314-win32.whl", hash = "sha256:2d5d76654becf5efd62c9e51c3756c67b49498b0c9a40884934c40807adbd074", size = 1934827, upload-time = "2026-08-28T09:59:39.836Z" }, - { url = "https://files.pythonhosted.org/packages/f7/3c/60674207246bc0a4009d2391b7c7251c7159f279c8d2ab8aae8ef46f3dee/pydantic_core-2.46.5-cp314-cp314-win_amd64.whl", hash = "sha256:fa10ef4112775900e7a0661068635eb67b2ab824fbde764de6e0e21982a93db0", size = 2042648, upload-time = "2026-08-28T09:59:41.792Z" }, - { url = "https://files.pythonhosted.org/packages/69/0c/117c562c7c1babdf44576b72a5e496906506c93690387ecfbca7c729ae2e/pydantic_core-2.46.5-cp314-cp314-win_arm64.whl", hash = "sha256:045ab3b6d308439e32b81cc173bba5b9018bc6ed896afd0c65b3b009b1699af5", size = 1989652, upload-time = "2026-08-28T09:59:43.702Z" }, - { url = "https://files.pythonhosted.org/packages/e8/66/9336ae58f9eb68c41d121894e52c4c89eccb07eb8f602a04ee9c3f37736a/pydantic_core-2.46.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8816f3d218beb4b787de5c9759c259b8fa61f9dec42dc7811f320a33771778b7", size = 2065829, upload-time = "2026-08-28T09:59:45.364Z" }, - { url = "https://files.pythonhosted.org/packages/c5/02/bc19b47a96c2d3109760711acf22369e56bd7e405ca52f7ade164d2ead57/pydantic_core-2.46.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bce57638e08ac148e5778cce7feb968307a727d66f8e2274a543d0cf0c9ad6a3", size = 1905716, upload-time = "2026-08-28T09:59:47.18Z" }, - { url = "https://files.pythonhosted.org/packages/52/a4/70b47c0509923dd98ccfed04fb3e32ea3849c82a0ff2205bb41009b43c00/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976e1128455aa595ea04c79ccfedff1aaeab96ee013fcc916bed120c4f0ad94f", size = 1934216, upload-time = "2026-08-28T09:59:49.241Z" }, - { url = "https://files.pythonhosted.org/packages/52/ab/aa03b65f7bb198585edf806b906c3223ecf1795543e39e23aec4cce27ad2/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b891faeedeafba41b2983e5001a81b6a915b69544c7e7570d1989ce1c36ac7", size = 2010635, upload-time = "2026-08-28T09:59:51.692Z" }, - { url = "https://files.pythonhosted.org/packages/3c/8b/0da06343f30b84ec549aafd309c6456223d5dc8bd36af504c573faad561d/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f194189415698233dd1114a093a9b56e61e2c57e11b469be3b0506f46f0771c", size = 2209369, upload-time = "2026-08-28T09:59:53.582Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5b/844c4defaa34a3df66eb9257087d121d70c201298b96abdf9f492fc2f1bf/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82a36973cf8a2ef5406f4fe2edbf8ed0c99629535d959e0b100c76a32535a111", size = 2253238, upload-time = "2026-08-28T09:59:55.484Z" }, - { url = "https://files.pythonhosted.org/packages/f4/64/a4e536cb16d7f61a7fd3120b46c577fc7fa7325992f69c4f52bc786d77d8/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdbb78909f52b981d3b2d56b97328d71eb0b974c36bd77c920123a7ebb192829", size = 2065740, upload-time = "2026-08-28T09:59:58.038Z" }, - { url = "https://files.pythonhosted.org/packages/5f/75/aaa38c6bc2d085f6605b34eabdc6a8a4e0b2e61fc9c8e6e52b28e97b3125/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:52e24eacdb536cade636aa90fb851835222becff8484b7001fdc78cb0290f2aa", size = 2087425, upload-time = "2026-08-28T09:59:59.898Z" }, - { url = "https://files.pythonhosted.org/packages/55/ae/fcab4cfc39aba3689e1d20c8b5250ad280957022c09af2ed9cd585602a5e/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37ae34309d7bd8c0d61ab839668058f2a7962ea1fc51d105d2db228fe0618034", size = 2139306, upload-time = "2026-08-28T10:00:03.057Z" }, - { url = "https://files.pythonhosted.org/packages/2d/f4/f1d03a4bc9d9acbc62f4d742b8a319af52f71885079868b2ff8e48a651ee/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:0cdbada856a1c69a7624a64d3d9aefe79300bd6ef827b43a4f265010b9b55184", size = 2144589, upload-time = "2026-08-28T10:00:05.645Z" }, - { url = "https://files.pythonhosted.org/packages/83/f3/7a53bb1356de514a4cd295f25b6ac39237895620c0462d2592b76c16e114/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:545f26c504b27c3758439a5e6d9349931f0a04f855668d5fe323c89e82300a38", size = 2288882, upload-time = "2026-08-28T10:00:07.931Z" }, - { url = "https://files.pythonhosted.org/packages/cd/94/5a81583660c175c59d49ffb09f4b3a44debeaf86a19fca664ae1cdd9ee32/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ff218293c9c806138dca139765e3b067621be52bcd93cdc14c7711be7ddc90a9", size = 2335210, upload-time = "2026-08-28T10:00:10.177Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9f/5d685c2693b972d1a59c998586e8823712b66603aeff47ee60a4bdaafd37/pydantic_core-2.46.5-cp314-cp314t-win32.whl", hash = "sha256:97cf3eb53a8cccacf9d46686a0926186c9bfb5574f2ed66d3639d5fe117cd3a9", size = 1921180, upload-time = "2026-08-28T10:00:12.35Z" }, - { url = "https://files.pythonhosted.org/packages/70/12/5c94ee16d65a37a15f9e869f5e6256df111154491173801a4c5e800ab548/pydantic_core-2.46.5-cp314-cp314t-win_amd64.whl", hash = "sha256:d2f9fc07a8042a8f95925b35c4f04f469707c981fc33245b6ca187cf5d2dd290", size = 2020515, upload-time = "2026-08-28T10:00:14.774Z" }, - { url = "https://files.pythonhosted.org/packages/63/19/67830dda664e6bdf9285ee2e40f355d0d7d6b92aa0c42e8d217bb8d33d36/pydantic_core-2.46.5-cp314-cp314t-win_arm64.whl", hash = "sha256:acf8a67ba51f4ca9ddbd0e6b3000a65ac51ab734661778b3e7ba64d99a710f2f", size = 1989276, upload-time = "2026-08-28T10:00:16.984Z" }, - { url = "https://files.pythonhosted.org/packages/af/1e/ecca01fce348f7e8afa9572441ff6f7d1cc70d21e4859f33944d10877e1e/pydantic_core-2.46.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:c14ad3bdc85ee7f318742c457ca3968a92126d144b15721c759033bfb06296c2", size = 2075342, upload-time = "2026-08-28T10:00:51.353Z" }, - { url = "https://files.pythonhosted.org/packages/1f/4c/af80c7a8032dfc897040ad5cb772bebde529a381186499e6e29987f23f8c/pydantic_core-2.46.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0bddb4020d8f04175865ccd17eff3040874fc11fb593f424edb452653b4b947c", size = 1907219, upload-time = "2026-08-28T10:00:53.438Z" }, - { url = "https://files.pythonhosted.org/packages/be/3e/54d89e2b092e778716bf6153634ef479e955f48c261090be23aa1e0fb0b5/pydantic_core-2.46.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2471fd51c61c610e1dcf7de44d7299283661654d11264ab4802b303368d69c47", size = 1953393, upload-time = "2026-08-28T10:00:55.58Z" }, - { url = "https://files.pythonhosted.org/packages/ea/89/828ee90cda28ce17bdefaa3a6eaf74fe430e113295a10e6126beca559d6c/pydantic_core-2.46.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10ec717381bdbfafef34607824db4c91de69ff085e4fca3b2af91b4fa17e68a", size = 2099024, upload-time = "2026-08-28T10:00:57.794Z" }, - { url = "https://files.pythonhosted.org/packages/df/dd/053c2e4303f791f3b8f8a14ab0b22008e8eb21d868c0c90b4f9be705b76a/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:013d6f3483d81e02e7c328831808f336c8596ee33b4bd4026b9ffb1e960b8942", size = 2062540, upload-time = "2026-08-28T10:01:00.318Z" }, - { url = "https://files.pythonhosted.org/packages/d7/dd/a18df751a5e37dd51bfad7f68e766999125bebe68c9e1d10a493ad01bd63/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:e9c134bb666dd54b778b9fc0d2b50cbb7f979b9e3716f26a88c9ab3b6fc1dd0f", size = 1902040, upload-time = "2026-08-28T10:01:02.529Z" }, - { url = "https://files.pythonhosted.org/packages/b7/13/01d40f9d07ce8a779fd6e0bd8ad4fba91309500dd67b869e2e219d261a6d/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:347ec774390c87326a2e4929d58d3f7e8763a104d5d35f4cd595a4c952366433", size = 1967479, upload-time = "2026-08-28T10:01:05.004Z" }, - { url = "https://files.pythonhosted.org/packages/fa/04/c81d4841331c2178b6fb09ae225425e110ed72d990c9fe556c4ec03d1013/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e24d8f05fa2d28513d94e877e9c75ad66175376209b3977f916e240e623193c", size = 2111034, upload-time = "2026-08-28T10:01:07.345Z" }, - { url = "https://files.pythonhosted.org/packages/20/21/22102e9950b3049526d20e811b95396508377d87651edd2b80d2b3d28659/pydantic_core-2.46.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ab4b66edffb32d9e951efb3814bd104b8367a7501b81b955cacb5726d897389f", size = 2071333, upload-time = "2026-08-28T10:01:09.636Z" }, - { url = "https://files.pythonhosted.org/packages/d8/18/87aefa427d191e6d3ab1447f1efc1cdcac86af1069239b133e8a0fd7f7c9/pydantic_core-2.46.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:337639ba62a11acde6ef3aeb08c8ea755f8ef1fe5e513356c0f36a2b0d7568b0", size = 1912713, upload-time = "2026-08-28T10:01:12.285Z" }, - { url = "https://files.pythonhosted.org/packages/1f/93/fd89e9ad49b1805ca94d24ce1088b7d305f05c35ffafcedb9819d03588a0/pydantic_core-2.46.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413a717a410d0c817ef5b786a059415550b3794e1d0c2abffd9efb93a3d9f7b4", size = 2090926, upload-time = "2026-08-28T10:01:15.19Z" }, - { url = "https://files.pythonhosted.org/packages/6f/45/8e59dab6acf8d35f02f0a958980074f31038968bdb2c983fcae9d1efee03/pydantic_core-2.46.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e449def1945a462c464331254e5a44fca7c3b4f9aedf59ec2f50f8066dd8e25", size = 2131303, upload-time = "2026-08-28T10:01:17.937Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a5/e1d4dc5180dd887a9522efc1f8716b8692b7606b1d3273d7862eaf66be44/pydantic_core-2.46.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a445486499897b88a7d6c310c88ed64dd37b1b59bfd7ae9107490bbb362f47d6", size = 2145128, upload-time = "2026-08-28T10:01:20.694Z" }, - { url = "https://files.pythonhosted.org/packages/c2/d7/ad493864a7fb21c0c4df98f965e2db430cb25a9d7369b5778d5016c09fd9/pydantic_core-2.46.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2d330aaba8621b1edcec8ae2c4050f63b84ccf6d98723a8f212e9684713abf0e", size = 2294560, upload-time = "2026-08-28T10:01:23.495Z" }, - { url = "https://files.pythonhosted.org/packages/02/8e/b41c84c913f29973a268e6c2b5bbf13c95adb9956c126d10da11ba3b2bef/pydantic_core-2.46.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b6acfb46a814762367fb7ba0828b0a17d441b92ce249a0e007474c9072662dda", size = 2317531, upload-time = "2026-08-28T10:01:26.334Z" }, - { url = "https://files.pythonhosted.org/packages/db/1d/068464f23075f66a8f1b806935e9cd9363ee446636ea70d2c22ee8659dbf/pydantic_core-2.46.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d0a24b40877af2de4950252be9d21eaf7fb07660f3c2cae1f56c6b599ada5266", size = 2140686, upload-time = "2026-08-28T10:01:28.947Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146, upload-time = "2026-05-06T13:37:36.537Z" }, + { url = "https://files.pythonhosted.org/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769, upload-time = "2026-05-06T13:37:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958, upload-time = "2026-05-06T13:37:28.611Z" }, + { url = "https://files.pythonhosted.org/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118, upload-time = "2026-05-06T13:36:55.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876, upload-time = "2026-05-06T13:38:25.455Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703, upload-time = "2026-05-06T13:37:53.304Z" }, + { url = "https://files.pythonhosted.org/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042, upload-time = "2026-05-06T13:38:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231, upload-time = "2026-05-06T13:39:23.146Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388, upload-time = "2026-05-06T13:40:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769, upload-time = "2026-05-06T13:38:13.901Z" }, + { url = "https://files.pythonhosted.org/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312, upload-time = "2026-05-06T13:39:08.24Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817, upload-time = "2026-05-06T13:38:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085, upload-time = "2026-05-06T13:39:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311, upload-time = "2026-05-06T13:39:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, ] [[package]] @@ -3971,23 +3771,23 @@ wheels = [ [[package]] name = "pygments" -version = "2.21.0" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] name = "pyjwt" -version = "2.14.0" +version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/c3/8a3b59c25070cc61dc517fbdfa5dc0904670c96f605cc69759dc09166b99/pyjwt-2.14.0.tar.gz", hash = "sha256:77283c83fb56ecf566a886c757a714bc83668e38156de2cce8263302f42e0b86", size = 113177, upload-time = "2026-09-11T13:11:54.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/97/672cb32ce0dfea44b740cb7b4f97038463b9cf7c0ead1aacf595572851d6/pyjwt-2.14.0-py3-none-any.whl", hash = "sha256:ad0cef71c756a56e74863c2919cf0985f72decbcfcb550ee2f422e7c62b5eedc", size = 32896, upload-time = "2026-09-11T13:11:53.409Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, ] [package.optional-dependencies] @@ -4088,15 +3888,15 @@ wheels = [ [[package]] name = "pytest-rerunfailures" -version = "16.6.1" +version = "16.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/ce/065fde089d5a7f46fe8372c3f340c7aaa8708734d2e8ae3032f0c29a4b1d/pytest_rerunfailures-16.6.1.tar.gz", hash = "sha256:20ac38d31f9319c4e8f43fe0d0e9c22755508e8e7987a88de6d7fd93fc6bdabb", size = 47719, upload-time = "2026-09-03T06:50:07.893Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/60/a90ca1cc6cffcb97b4260ed0ad2b7934b999d7c48abe4ea0840344862a3b/pytest_rerunfailures-16.4.tar.gz", hash = "sha256:8222d17c37eb7b9e4d6fc96a3c724ff4e1a5c97a5cc7cbb2c19e9282cfd21a11", size = 36635, upload-time = "2026-07-01T06:30:56.813Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/0d/4da1860f933e271569405fd8adef7f3e7f1c2bd1b544d2ee83a8e0acf1d2/pytest_rerunfailures-16.6.1-py3-none-any.whl", hash = "sha256:0c38d314a0a7e32795f2dbdeeb2b3d141ecf3d3abe10c8c32dae223d45ac7b3d", size = 21035, upload-time = "2026-09-03T06:50:06.601Z" }, + { url = "https://files.pythonhosted.org/packages/ce/93/3cdcc4033444e822e01b573414b03fd37fd5533070c750477b8f5fa5224b/pytest_rerunfailures-16.4-py3-none-any.whl", hash = "sha256:f69b5beb39622c90d1e44bd945d826eff6db545dcf0b68f52b7e4ad15eaf6d6c", size = 16955, upload-time = "2026-07-01T06:30:55.333Z" }, ] [[package]] @@ -4138,11 +3938,11 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.2.3" +version = "1.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/53/ed9d74092561d4b01a2ef1349d52cdbc135e526c245f366b089cfca6de49/python_dotenv-1.2.3.tar.gz", hash = "sha256:a20a594dabeaa385725aa239d5244871c143ecb356add8a20fcf23773a6c3a35", size = 58945, upload-time = "2026-08-16T16:54:54.067Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/17/c5c6b53ddc18f297992099b3d9ec16c855c0ccc83263a21fe4d1c625ec6c/python_dotenv-1.2.3-py3-none-any.whl", hash = "sha256:904552145e8bfed22162c09dab1c2b9b54fefa7b23ba780f4f26ca0316b0f0d9", size = 22780, upload-time = "2026-08-16T16:54:52.473Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] [[package]] @@ -4254,16 +4054,16 @@ wheels = [ [[package]] name = "readme-renderer" -version = "46.0" +version = "45.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, { name = "nh3" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/d7/9309494fad74ee831d4546f69325b5519f37c6dfb2d9ba495db8c6d4f4ca/readme_renderer-46.0.tar.gz", hash = "sha256:af3e964914f6310a33ff67b72a4bdd940bed8d7c3bdecd2d14f40edf284bfe90", size = 38382, upload-time = "2026-08-28T15:18:32.49Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/51/d3a6ea424652c60f05600d8c2e01a55c913755e7cdad64afabbd1aa16f44/readme_renderer-45.0.tar.gz", hash = "sha256:030a8fac74904f8fba11ad1bb6964e3f76e896dc7e5e71f16af190c9056696d1", size = 36172, upload-time = "2026-06-09T21:05:17.37Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/72/ac5ca81fe9121fcaa9d828d21017cba00a16a98e4ea5fb60c878f93dda4f/readme_renderer-46.0-py3-none-any.whl", hash = "sha256:d0dae1f74bb273b534770cb4cccb6bb78735540afdb03c2146f4e19dcd412560", size = 14239, upload-time = "2026-08-28T15:18:31.132Z" }, + { url = "https://files.pythonhosted.org/packages/97/1b/295bf2fa3e740131778065e5ffa2c481f0e7210182d408e9a2c244ff5b0c/readme_renderer-45.0-py3-none-any.whl", hash = "sha256:3385ed220117104a2bceb4a9dac8c5fdf6d1f96890d7ea2a9c7174fd5c84091f", size = 14134, upload-time = "2026-06-09T21:05:15.85Z" }, ] [[package]] @@ -4295,139 +4095,123 @@ wheels = [ [[package]] name = "regex" -version = "2026.9.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/5c/f403115361de25809e8f785686ec7096e30fef73be9ae35aa51da4e80abb/regex-2026.9.10.tar.gz", hash = "sha256:1e321e2c84f0e52c457f5ea5944f796d6e8e09cb99738ea98dcc1bfe402a128d", size = 417072, upload-time = "2026-09-09T21:00:21.521Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/29/b4160140513c37ea8e7d87c467b5b7e658f53ca4cdcfe394b82ec768d0b4/regex-2026.9.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7dcad477c49c4c626a6c4fcd71b39a971aa217060cc40a6569fd24edcc0fa509", size = 493887, upload-time = "2026-09-09T20:56:21.178Z" }, - { url = "https://files.pythonhosted.org/packages/01/f9/6008e74d6076a980a48cb3eeaf80c1324db73f2eed89a8023e91669dad84/regex-2026.9.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d414c411c06fe0009eac33488fb1591c66b5c2673e342e452e7bb2fe63da8194", size = 295102, upload-time = "2026-09-09T20:56:22.687Z" }, - { url = "https://files.pythonhosted.org/packages/7e/cd/2f540fc813d1f71f18e1cc6861483133a0e6afb349a4e770fbdce4811d8d/regex-2026.9.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f2f43bf4e47ff7ce9e585558706d698c6204d0f80bf2207766382ed817c8e9f4", size = 290660, upload-time = "2026-09-09T20:56:23.835Z" }, - { url = "https://files.pythonhosted.org/packages/03/5f/9c990517587418d82406203d4608e17e02167c73fb36ef9a7a9d7ae64802/regex-2026.9.10-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d12a625a37c89c2b09303402a06942f55f071b95a7916a49c17034c3d47cd5", size = 787864, upload-time = "2026-09-09T20:56:24.979Z" }, - { url = "https://files.pythonhosted.org/packages/6e/1f/bcc010de82e20c1822d22ae94d97faafd46ce8405599f3636622a9a7bd04/regex-2026.9.10-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ef4ce69ff97fbb44b46751cfea5e859ad0b66d1a50abf34954f0645f51e81671", size = 860487, upload-time = "2026-09-09T20:56:26.363Z" }, - { url = "https://files.pythonhosted.org/packages/58/3e/6e75baf9c78d90bf44187f5ce4ee5de51fde206e6981490a0a4418cde296/regex-2026.9.10-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:044bd4639b6bb409ec9e5d8b7accd57e02b4c4a4e2eafde916f8ae8006b3e40b", size = 905374, upload-time = "2026-09-09T20:56:27.741Z" }, - { url = "https://files.pythonhosted.org/packages/49/b2/be9fafe5e05888296fdd35d82ba9cbb67b0d352e9911fad3c458beb3a34a/regex-2026.9.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3d95d7d9538b5b726dd6fcd7b6117a71e6565202f6d64f5845fb4d8f203f533", size = 796252, upload-time = "2026-09-09T20:56:29.074Z" }, - { url = "https://files.pythonhosted.org/packages/f4/ac/4df639a88ce4fcdb0aedaba7818718254b888e4b60c7df640d5fc82232cb/regex-2026.9.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:faa911fbbcf8ac90bda0e0657d60768e3390954ef0588211d63a22add1cb1cd1", size = 790214, upload-time = "2026-09-09T20:56:30.586Z" }, - { url = "https://files.pythonhosted.org/packages/6b/2f/2bb3fef68f7ba134d45a2aa3c713078109ebca71ec5dbb84a42d7284abec/regex-2026.9.10-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ecb2e7acb18f8cc4a67f0ad986c0af291ea4dd385d0614ba9bc09d7f8bbb478c", size = 773413, upload-time = "2026-09-09T20:56:32.223Z" }, - { url = "https://files.pythonhosted.org/packages/7d/57/43737678e306ad6430732828ecf0632c72676eab783cc98c4da373e7ee96/regex-2026.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4971776b4f2bd7fd9a83eceb2cb2592cbe2924f639fe8045e6a9de5ba4bfcf25", size = 778331, upload-time = "2026-09-09T20:56:33.51Z" }, - { url = "https://files.pythonhosted.org/packages/b1/19/61f4158219d60ec727500f08f6f0aa86a036bb5c3ba0632204f35eeb92e8/regex-2026.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f8bdec659a8fa7af51a32b224b3b7c02bc415d54ffd35187b1d224176b17d607", size = 853498, upload-time = "2026-09-09T20:56:34.931Z" }, - { url = "https://files.pythonhosted.org/packages/6f/85/7c783b98eb777cd17e2566ea6343a350f6a7c13f41f43282c20348ed9303/regex-2026.9.10-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3540734dbe241ebb3b87d5713781f6749a3e4d45480f506aa5fb5cbb0c37d249", size = 762708, upload-time = "2026-09-09T20:56:36.248Z" }, - { url = "https://files.pythonhosted.org/packages/dd/cd/a56fb347afd102dca21fc3ee9163ccf379678154ec2d0e3f139fb26e5eb9/regex-2026.9.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87f5f75c109f08f5c602d68e1af54cead8165189c727b6ac946b30b9833a3ba4", size = 842488, upload-time = "2026-09-09T20:56:37.538Z" }, - { url = "https://files.pythonhosted.org/packages/59/54/5d38dc952ec93cd19943d31647806c7fbf380c74f36b747874b26a3070fe/regex-2026.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:88b02aa8d0ec9b6189fe933d425775882271c23700ac11fd26d1779b0f56fde3", size = 783557, upload-time = "2026-09-09T20:56:39.649Z" }, - { url = "https://files.pythonhosted.org/packages/63/81/c4c880460f22160046e9d4794d947935da8337d579e08c3492344be32d1d/regex-2026.9.10-cp310-cp310-win32.whl", hash = "sha256:13c52fc377792675f604a207a2ae5958c080f6854f7698d40d9ff034d95b1e76", size = 266938, upload-time = "2026-09-09T20:56:41.352Z" }, - { url = "https://files.pythonhosted.org/packages/f4/0a/5061dde95447f00acdeeb39780b32def0ce380c3e725aeee1f5b37b788bb/regex-2026.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:e6b99181d184d0f5c7b36b8d12b94d1e9499cce6246594331f9edc5d2ea9fceb", size = 278251, upload-time = "2026-09-09T20:56:42.54Z" }, - { url = "https://files.pythonhosted.org/packages/c1/c8/b3f8dab9592d1089fb2cec58f5c1120ce1c5c74b2d12d50119e404187ee8/regex-2026.9.10-cp310-cp310-win_arm64.whl", hash = "sha256:abbfc1c33bf8efddcc43844aba61e036d74a918680dc3ce8ce2538b004eda0f9", size = 277308, upload-time = "2026-09-09T20:56:44.141Z" }, - { url = "https://files.pythonhosted.org/packages/65/82/36fdcd669c7c47e11bea67e3495011ec365be0942aae3ba74f82f92ed6a2/regex-2026.9.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:debc629e98b95abaea1cf3057ca296151f348c697c9b8a59d18013adb302c0dd", size = 493891, upload-time = "2026-09-09T20:56:45.767Z" }, - { url = "https://files.pythonhosted.org/packages/c8/57/bb6a8273bcb53077a1855fea0ff416fe4d4bcb1d9f350a9fe3b909853983/regex-2026.9.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d772586951d7d6a5d162d48f414065e483b1c81ab38fd8ed97c78b05883421a", size = 295107, upload-time = "2026-09-09T20:56:47.359Z" }, - { url = "https://files.pythonhosted.org/packages/38/71/9d96d04c36556f057398a08dfc21aecc5409b5fef83fd7653a310227df7e/regex-2026.9.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b43456de605c8ee77eb75f07bc1ee44ba27f9cee22207deb77d495e954b7d953", size = 290649, upload-time = "2026-09-09T20:56:48.731Z" }, - { url = "https://files.pythonhosted.org/packages/af/cb/4dd3b7190b5a169c81a4d63b487d65e9fb23689b771f5aceb91d9e7f65bb/regex-2026.9.10-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f0a8b4928823bc8b217a1ab7bf3d90598909dec9a70fbbfe9a52cc4eca55990", size = 796358, upload-time = "2026-09-09T20:56:50.021Z" }, - { url = "https://files.pythonhosted.org/packages/3e/bb/aceb2329a2d54a3bbd95e54f08689692414674c213e8fc958cf253206e5e/regex-2026.9.10-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b91c37551bf39d75116c02b146956f65b9aa0337a4a652f4ae186983789d4001", size = 866258, upload-time = "2026-09-09T20:56:51.363Z" }, - { url = "https://files.pythonhosted.org/packages/ba/fc/f8deac9c4c475b6bc35f25565a2253df4d27d49dcb6b189d9432ae69294e/regex-2026.9.10-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b9ba3b2765cdfe18f0f561a69f78a69701f2896654a81c711108d35d14e5099", size = 912779, upload-time = "2026-09-09T20:56:52.811Z" }, - { url = "https://files.pythonhosted.org/packages/74/dc/2dd4d56932f55ea412c9808f27a8661f93568bfee596ed04bc57a74e591f/regex-2026.9.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0acee94b480dd853e39434aa9a575f95385b1b4b8fa3feae56db363ca5cad782", size = 802962, upload-time = "2026-09-09T20:56:54.241Z" }, - { url = "https://files.pythonhosted.org/packages/46/a8/43edbb94e6c9caffd08bffca5b5c486d18845569fcad3953565b85dd71f1/regex-2026.9.10-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a41693eb3fc4b92e6127d113813c6c395237f7edd3224abf67609af48c690d11", size = 777136, upload-time = "2026-09-09T20:56:55.749Z" }, - { url = "https://files.pythonhosted.org/packages/78/2a/6de302fe3dfa94b75a414bffe5180c146967f96fc52fd0b3527a05ad7c40/regex-2026.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6888065672b341e5246f391ec16dc258a29218ac784172fd67c30d941544755b", size = 786593, upload-time = "2026-09-09T20:56:57.211Z" }, - { url = "https://files.pythonhosted.org/packages/ce/22/66bad9464b4b9122180d2fec86209d7f1bcaf4388d34f644139799f94a20/regex-2026.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8c07021a4faa3f092869adbd1f35cdc7a592276c807aeebc3ceb8ff1a638f0b4", size = 861247, upload-time = "2026-09-09T20:56:59.194Z" }, - { url = "https://files.pythonhosted.org/packages/3a/90/a862d6fd9ee3bc0c1f3a2fecffb325097608a4c9b57f0e35030f68c878f7/regex-2026.9.10-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:58c01f7b81079cf0817ba831ff4d9eff5d28be4a3ac76c353e6f09bd63f4c386", size = 767925, upload-time = "2026-09-09T20:57:01.031Z" }, - { url = "https://files.pythonhosted.org/packages/98/4a/aea909c0699aec3c5ee6eff93e4dabc0d310cfb0a5618094e1c5228b234d/regex-2026.9.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f0e2e5d23448b660d60a6ed85c46cc03b4b48bd276b8f4041d4a5fe2a4a0626b", size = 850772, upload-time = "2026-09-09T20:57:02.774Z" }, - { url = "https://files.pythonhosted.org/packages/8a/a9/a55f1257d95871b0e042b42bf52f931b3a92b4d530def5201c5b9d597e20/regex-2026.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:94d096369b7cd96d15343fef5257fe39eff9d0e8758b92a0e15e358b92cdb2fc", size = 791475, upload-time = "2026-09-09T20:57:04.216Z" }, - { url = "https://files.pythonhosted.org/packages/60/96/04bb3dabe9ac7aa64ff758dc34ae0378d60f5279ccb66788e1f837a0cac0/regex-2026.9.10-cp311-cp311-win32.whl", hash = "sha256:7f8f10015866608fe4c043cec2e4fe4c39a94bb50e45091de4cdf4004b9ae4b0", size = 266937, upload-time = "2026-09-09T20:57:05.726Z" }, - { url = "https://files.pythonhosted.org/packages/0c/7f/2d39cd798871b683409cd14ab4458f60e53db86591028a8244c3155f2e92/regex-2026.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ce7c118cb102975f974585688357a717ffbf9dddd64ab0bb1bc93eb5b367cf95", size = 278263, upload-time = "2026-09-09T20:57:07.089Z" }, - { url = "https://files.pythonhosted.org/packages/13/5f/eb3a6fd0ef50719d105e77bcc8a94b5b6f4d2873819fcf481279c454ce73/regex-2026.9.10-cp311-cp311-win_arm64.whl", hash = "sha256:1e954e246466d5a1a78f563ce8364b5d7cb19e7adb0ccdec8f9c9610083187bc", size = 277305, upload-time = "2026-09-09T20:57:08.442Z" }, - { url = "https://files.pythonhosted.org/packages/32/c8/bfbe893e90ee0148bd2860dd086f09b5d2080ca2b125f740c2e118c16982/regex-2026.9.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880ac684c27176464c00c3fdc456116364f5ebc70da07aad0c2d4a7ba45e98db", size = 496609, upload-time = "2026-09-09T20:57:09.987Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ac/56d5ae6efb759255c3b3db650a4be25f96a844ea3613b91e1e189a3b7294/regex-2026.9.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9d36b03dc362aa40ffaaec9d9bd75e87763529563ec008c43b0e07782f5be7a", size = 297024, upload-time = "2026-09-09T20:57:11.35Z" }, - { url = "https://files.pythonhosted.org/packages/60/4b/0f2d5f6bbb791cc10f22f0ed16c487e630dde8fa8fa0bd92a2bfe21a4b20/regex-2026.9.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866de9f98df0611d7b62b3a8729d3284a64c0cc6edd90bb95a533e443a4939cb", size = 291905, upload-time = "2026-09-09T20:57:13.127Z" }, - { url = "https://files.pythonhosted.org/packages/89/51/3fb5fe0d32f4cf0bc982286722c729a8d6f522d2fa2d5d14a702d9fc87f8/regex-2026.9.10-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c66d54042a14a503907d81861b8a5235e6d1f03d4fbc1d8767f652eaf957ac1", size = 800055, upload-time = "2026-09-09T20:57:14.68Z" }, - { url = "https://files.pythonhosted.org/packages/89/46/ee507bd2f9d4420f26a594b35c551d7194b66f5d7897f63730fae6ec05c1/regex-2026.9.10-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:032da15431c890d376f53547f0a6219f4f4cd19f3e4f11bdc321453b5bd207e4", size = 871133, upload-time = "2026-09-09T20:57:16.674Z" }, - { url = "https://files.pythonhosted.org/packages/d1/75/cbaa90689684f91b1bc017e7f8c6d9425c6bd299108db02482dc51376d8a/regex-2026.9.10-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:23ac9a28180f274d7dd7651fa131ad5b02d343b75df4b040737f0356223895dd", size = 919627, upload-time = "2026-09-09T20:57:18.402Z" }, - { url = "https://files.pythonhosted.org/packages/cb/f5/dcdf5e0d898024005cfcce631e3e934d111dfbe177ca0b7f253ae8a735a2/regex-2026.9.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e67f8843f0e4b931f1fa860bf3bbe4134b714c0155cc5c7c0d7ea450230aae0", size = 804587, upload-time = "2026-09-09T20:57:19.859Z" }, - { url = "https://files.pythonhosted.org/packages/73/70/eedfe81c29bae266a06ab4250978361a9bccd474704d88d4f4ef4506dff8/regex-2026.9.10-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bb7774924f8cd69f49cba0b3c2d679a6326f777e0e67d130ad5203e4df53f0d3", size = 777320, upload-time = "2026-09-09T20:57:21.62Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e5/86b207077efbcd91305700488f170b7eb1e1c54721cea74175273aa3b9a4/regex-2026.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c32480f3371b75068decaf9e5da72c224e953830dd71e36e06cf80e30ea39d8", size = 790572, upload-time = "2026-09-09T20:57:23.048Z" }, - { url = "https://files.pythonhosted.org/packages/b2/92/f622c3b2323f4c035b98e80221740a442127ad7993135b814f52057430db/regex-2026.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d2d377fd1cad611b806cdd732d86b65f536c768209890cb442556548daa65a23", size = 865485, upload-time = "2026-09-09T20:57:24.658Z" }, - { url = "https://files.pythonhosted.org/packages/4a/be/34bd621d3d6ac906ad67e57ed56c40cd45f7d51b9c0328335e97a7cb8ecb/regex-2026.9.10-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c014641157e9049b0603b8daa5343bd408d9b757b709aaa0f373cd3fab2d7944", size = 767925, upload-time = "2026-09-09T20:57:26.268Z" }, - { url = "https://files.pythonhosted.org/packages/0d/28/ddbf7cba86f2adf5038c6c16aa829636ffc6e437f81bb0cbf302899cea5e/regex-2026.9.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1562aabd9d4eb09bd88a62ad97ed06800094b529ac43419e43020b9cefec79b0", size = 858800, upload-time = "2026-09-09T20:57:27.901Z" }, - { url = "https://files.pythonhosted.org/packages/d0/f1/e8d7656ff3d3bd32e881d32f540b4981c79dee61908d6b790a45966e6895/regex-2026.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2479171edccced52ef02b899558f88ab2c235fe05b93180fdcae1670aacd89e1", size = 791648, upload-time = "2026-09-09T20:57:29.786Z" }, - { url = "https://files.pythonhosted.org/packages/fc/65/eac1a79115c8475d8ff539602eb54031564d719fdea5a599c4b0a1a26d1b/regex-2026.9.10-cp312-cp312-win32.whl", hash = "sha256:239620b0e0681669367c0e218c8eb2551d9f8fe3b9fccfc8d0003377804e8348", size = 267326, upload-time = "2026-09-09T20:57:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d4/4dcd0a05d3e97ca829165df1c39717f899d1d484dac8a6032439f2cb8d6d/regex-2026.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4db7d00c4afbfbb55b8e17b1e371da11418ea9389b030acec63c1fa4c7ad4b86", size = 277933, upload-time = "2026-09-09T20:57:33.648Z" }, - { url = "https://files.pythonhosted.org/packages/55/f8/22617a80dee28f2451011eae36bc26b3d78c4994ba87b5281d60acf9b6c0/regex-2026.9.10-cp312-cp312-win_arm64.whl", hash = "sha256:c25a754bb81a2edcfc3b65eda50f017d736f818112ed43e8aafd595cb00678ae", size = 277447, upload-time = "2026-09-09T20:57:35.156Z" }, - { url = "https://files.pythonhosted.org/packages/20/90/d4452bf1ef7dbe406980e8b921a257024482203c1dafac535eae207611bc/regex-2026.9.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ef5a059ea1c6ee5d1c7e99a2484e628608d010921efe876c6f0e2029d2f35eca", size = 496408, upload-time = "2026-09-09T20:57:36.757Z" }, - { url = "https://files.pythonhosted.org/packages/6a/35/c763c6424a0f99d021d46dc1f9065147bb5a40c2b2cdf28d2ebdbcd96508/regex-2026.9.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dce932f8e3ba936475ea3d0d8b59f7b050a9e206e994f53f8fd80299871e87da", size = 296931, upload-time = "2026-09-09T20:57:38.811Z" }, - { url = "https://files.pythonhosted.org/packages/fa/68/241f88458b17c46ed2f80147a60a03b2ada7fb815c23b6bc76c298abb0a5/regex-2026.9.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d8c668af8f7bdb1d18739c27d30cd9f4b371495a883f75a002fb7a39d740fecd", size = 291741, upload-time = "2026-09-09T20:57:40.482Z" }, - { url = "https://files.pythonhosted.org/packages/90/9e/974d6de404c63e2d09525f4ddb99874c7ab8e1f781ccbe0dd3e26fa6f6e5/regex-2026.9.10-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aebdd9a946de328b3f6f61dbf48dd064a36eb6dddf96e34ae6651d37f6e9383", size = 800088, upload-time = "2026-09-09T20:57:42.098Z" }, - { url = "https://files.pythonhosted.org/packages/9e/fd/3875b73f9e7ba3321dcaa02c19f650c05c61345328acf84599ac6f45ceed/regex-2026.9.10-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f2374c27deb189b282ec7e16106752c22ad39b056bbd8018960b1e4cc95d67a1", size = 871212, upload-time = "2026-09-09T20:57:44.03Z" }, - { url = "https://files.pythonhosted.org/packages/c5/f5/2358e791c0e171194dd6a8b97b520579098a21397fb79dbe6b7edc9e3fa7/regex-2026.9.10-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e0dc78251154b66dc60211563fc115345da332eaa881e4e2523fb1edae3772f4", size = 919752, upload-time = "2026-09-09T20:57:45.691Z" }, - { url = "https://files.pythonhosted.org/packages/20/3b/000c79c3f9c06b7542225a5d3a7f9a85405da7224b3b9af94a491d07abea/regex-2026.9.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bafa41b0dd63669e5c0f8adf3d24819efeb73c847f492eb011212eb352e69041", size = 804578, upload-time = "2026-09-09T20:57:47.548Z" }, - { url = "https://files.pythonhosted.org/packages/30/6d/195eedb1de87f26639191e7487e41eb81e2ce255bc7563a64f3f5a95eb08/regex-2026.9.10-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ebb2ba68e4641a994061f70bf44ed448fba0b9b1d18c94ffb9efc1cca805b39b", size = 777345, upload-time = "2026-09-09T20:57:49.63Z" }, - { url = "https://files.pythonhosted.org/packages/79/11/11fe2b313fcd92cb75c583648f2746031b9f4da9e9ed4241204a5e8b3721/regex-2026.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:048a89ee797db10160bd2bd519286577a6b43a100279bd4b7d8456a3d69c80a0", size = 790556, upload-time = "2026-09-09T20:57:51.27Z" }, - { url = "https://files.pythonhosted.org/packages/7a/c0/07ec9b4c43b0e16d62454971a5ab3886eccb0bfa161300a02d801ab28620/regex-2026.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:79e9432995e14c749d34209413de5e621ec8e67789bf4f46dbfabea9d06a2406", size = 865572, upload-time = "2026-09-09T20:57:53.163Z" }, - { url = "https://files.pythonhosted.org/packages/19/07/43bc9a9cf9fc8e37d2ba47980dfe4a6e151d2cf3ab969e0031e2a9b21484/regex-2026.9.10-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5847e22bbf959764d776937d791d034cc2d19b787e361c88d97e859e8dc68502", size = 767971, upload-time = "2026-09-09T20:57:54.805Z" }, - { url = "https://files.pythonhosted.org/packages/9c/49/3b9286a3a94f3c89ed4ddbe74e72bdde21c1a5eadd520d5f4ed4a61936cb/regex-2026.9.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c103b3b14e011774af4fb7e4617ad4d72b9171905cd3b231a70a4efd76e477d7", size = 858835, upload-time = "2026-09-09T20:57:56.627Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9e/e5d27ce9fee8e3ef95f886c7b6ecec211efa4cfc18bd73bd5cf26cca4741/regex-2026.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6b34a778c695d24e77c140e3b4c95da69282e34f2f6b02b55656aa4a0379f643", size = 791793, upload-time = "2026-09-09T20:57:58.313Z" }, - { url = "https://files.pythonhosted.org/packages/63/03/c28a6bebedc3e2d86ee27ec2de16f7ec0419dcd10e771d43dcc9c58a2e99/regex-2026.9.10-cp313-cp313-win32.whl", hash = "sha256:7abb38b8c40f3a235235a44da452c64b7b5c1d650ec6351027db0e090804f2e5", size = 267298, upload-time = "2026-09-09T20:58:00.009Z" }, - { url = "https://files.pythonhosted.org/packages/cd/fd/5c85fa6cfb8e034080bda5a72fa0a4df2b7777a35eb7e73c2799c2adda7a/regex-2026.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:20e8bfb07ad79a282f8b95b56fe67f9750b1b7f775724e4ba1f23cb296115ce4", size = 277894, upload-time = "2026-09-09T20:58:01.731Z" }, - { url = "https://files.pythonhosted.org/packages/c1/28/f5a25f6f65501675977fda35d9f61abb1468c4b87c0f73e536d8b21a60b8/regex-2026.9.10-cp313-cp313-win_arm64.whl", hash = "sha256:3bdeed3318a8eb2bbadc9c56347e0ff651639e934a47e168d05a3b12929fd0e7", size = 277436, upload-time = "2026-09-09T20:58:03.422Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ed/98e9b07d8bb9c765d07774f0b2c19b301b96d51f44630fea48951051c94e/regex-2026.9.10-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd6bd89b9fc06018d35851cab0240adb7dd84d51941b19f6574ac90cd54e3ae5", size = 496662, upload-time = "2026-09-09T20:58:05.118Z" }, - { url = "https://files.pythonhosted.org/packages/ee/a8/9dfe9be48378b47c5a8f04b0f200ea225f9ee0f8e93f010433f661a37878/regex-2026.9.10-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ef4c0a9dfdc90581b90b1b95a8c3d1557f8ff8f5a2a53536d26314de699d1468", size = 297115, upload-time = "2026-09-09T20:58:06.822Z" }, - { url = "https://files.pythonhosted.org/packages/2b/e4/5d1f005a3825ec49842ad349061c1c26e6d42f47ccf105e6e5aa6aeed392/regex-2026.9.10-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:14caa05ce39ec70437af5aac8814c50ee6628f4a90353871c059692f448a164f", size = 291896, upload-time = "2026-09-09T20:58:08.675Z" }, - { url = "https://files.pythonhosted.org/packages/be/15/44ce83fca50c6058f42b62fa8300a8030eea7e4e5a973a2dd33db0f557fb/regex-2026.9.10-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3264132d576847ab5f88bb83e7debe67854bf165b3ea613bd467312b6099536a", size = 800534, upload-time = "2026-09-09T20:58:10.339Z" }, - { url = "https://files.pythonhosted.org/packages/af/6e/a62e070a5a033643b287489576f02ae6a9c584c337d62349e340a2b4d001/regex-2026.9.10-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5cef9f3d14796500ea834c41dbe688f1f6b23c7024dc23e8a794d7ebaf5d71d0", size = 872038, upload-time = "2026-09-09T20:58:12.186Z" }, - { url = "https://files.pythonhosted.org/packages/f3/06/8b8e2483949b1329df10c5b615e85d332066deb426b11332b799629b9201/regex-2026.9.10-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d278ad30ec83b6b9202685b0f80b741a51ea3ca7f0595ebda96e7628b6398876", size = 918927, upload-time = "2026-09-09T20:58:13.903Z" }, - { url = "https://files.pythonhosted.org/packages/bb/64/9b56f69100d3afdbc9c4fa6e302764f9cb717fbc06a9d50558d98ca89cd2/regex-2026.9.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb018cfe7144585fc83882405906ff84994a2d154afc2509ecc7752c51f864", size = 803694, upload-time = "2026-09-09T20:58:15.949Z" }, - { url = "https://files.pythonhosted.org/packages/07/43/d00d59a7c8fd0e070ae8457a8743597f45ad9682b100f57b9c9c405fbdfd/regex-2026.9.10-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6fd555fc9abef50c530869690b2daca054c8811a7aff632d11f9a7b2590b2742", size = 777770, upload-time = "2026-09-09T20:58:17.628Z" }, - { url = "https://files.pythonhosted.org/packages/46/6b/a11d0446484efbc9eb67abec133f254c6d66a1568b8f3fb36d39a73a1129/regex-2026.9.10-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8d5c4518235a2ec1611e57af85fa488d529c1106aacff12adadcedf8687012cd", size = 791234, upload-time = "2026-09-09T20:58:19.476Z" }, - { url = "https://files.pythonhosted.org/packages/12/09/bcd24e78b373fd4f98090caa43eade439223f6703b909be79b9efd9ab0ab/regex-2026.9.10-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:175cf49ce7a994c88b8f15e3cb17cdb66a48ebb2d36de736b8205033db950f89", size = 866259, upload-time = "2026-09-09T20:58:21.683Z" }, - { url = "https://files.pythonhosted.org/packages/8b/c6/c57ba5e94222a813260af4c17ced92d40cdb44737eb6b50979688310b6a3/regex-2026.9.10-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b71649169a9fcf30b395ee01047fa7ad6654a4c900ca75b23c04dedcce6a1f8c", size = 768219, upload-time = "2026-09-09T20:58:23.842Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a2/3820037587d00901ace96c5864335c2cd1b899d5263ea0dd2261359e0bee/regex-2026.9.10-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8ba1f78bd4fef2d8f84b894ec28ac3481afe6cc07aaa253ad4717ef7b3fe6bcb", size = 858582, upload-time = "2026-09-09T20:58:25.607Z" }, - { url = "https://files.pythonhosted.org/packages/47/f0/f9a838ca6219ae4821de0175e4548db73ef56de5ec08d032fb427732fa07/regex-2026.9.10-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:217e98ba5fc8908ed8ffd4ebac04753a0c831067cbfb495b9821b94cc61eaa76", size = 791405, upload-time = "2026-09-09T20:58:27.406Z" }, - { url = "https://files.pythonhosted.org/packages/f7/bf/67d71cc4e13ae2e0022d21243ca069e0868701a99eb29cdecd13d356e694/regex-2026.9.10-cp314-cp314-win32.whl", hash = "sha256:b298cdc33c5cc6969ff07f0fba19cc73e0fd8576373c50935feadaca2f6b4405", size = 272702, upload-time = "2026-09-09T20:58:29.116Z" }, - { url = "https://files.pythonhosted.org/packages/c1/38/40a93e72703a741235115ed1b1e5f6b869917677b7643005034ce1611d70/regex-2026.9.10-cp314-cp314-win_amd64.whl", hash = "sha256:c32818b28bcd153b25b63038348a9fe9b9fbcddb60df43f204c3ab55eeb57f77", size = 281170, upload-time = "2026-09-09T20:58:30.899Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ac/e95387f00617c16bb41b786d900bacd17eab88afa81b4f263df532b3a731/regex-2026.9.10-cp314-cp314-win_arm64.whl", hash = "sha256:75242f44a3e283106077be4ab717bc535e4701c9d54ad69e195945c22f137a1d", size = 281511, upload-time = "2026-09-09T20:58:32.594Z" }, - { url = "https://files.pythonhosted.org/packages/39/e5/a4b12262edc488a8a7a95b672db317dd8aa9bf2fab98297f9c91bb11ad4d/regex-2026.9.10-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:2dd9286093c71afc8f55ef035c5b9d2776641fd72c6535f1febc92d0b0be9666", size = 501128, upload-time = "2026-09-09T20:58:34.306Z" }, - { url = "https://files.pythonhosted.org/packages/55/c8/9ca31c0fa5197ded8614c8ae0e105bcff2d979025ffa3c75580baa334e2f/regex-2026.9.10-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:71879292c9c7ac67b1680345b16daba1be937cb027362cfa04e68f65db2dcfdd", size = 299428, upload-time = "2026-09-09T20:58:36.296Z" }, - { url = "https://files.pythonhosted.org/packages/2b/d1/ee7662561735f90475443c3ca1977e5cecaeaa8f29620dec75580aebc839/regex-2026.9.10-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ccd139b2061132e7b265cfb4b4721baeb9f8928b81415304abf1ec7e3181c26", size = 294494, upload-time = "2026-09-09T20:58:37.964Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b1/333168e45ed6cfe71f6d17e21e5f54725f44d171f84edd12469a2f739227/regex-2026.9.10-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e7327795089ddb44912dce1434e1d7244be2e9fb48fcc2d6782936af7a3062db", size = 814925, upload-time = "2026-09-09T20:58:40.438Z" }, - { url = "https://files.pythonhosted.org/packages/bc/a5/df1b38536d0a3b24a030eb4130ce98b403cc925220ff530f5313a7c436eb/regex-2026.9.10-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ff4d7b14ea19e50c8d9d6d83f45bd9b45cbb624c07ac1fa54db0a019049abed7", size = 873323, upload-time = "2026-09-09T20:58:42.349Z" }, - { url = "https://files.pythonhosted.org/packages/93/ea/aa71fe62dd63a8336bbdec1ff002a6c53b40ccfca95961c18ee4f09bf03c/regex-2026.9.10-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4f0407474ffac8e5e89d93ca41d60891e29f0ab8423eb66ff292d850a86a0843", size = 923080, upload-time = "2026-09-09T20:58:44.488Z" }, - { url = "https://files.pythonhosted.org/packages/86/38/49f8d6fd34fc1a9c75b5b96364ebdde702a8144e5ed63d2213c58d454c27/regex-2026.9.10-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ad10a135fa0b4e4a462a61d07c6654d7518cfdb5cb8da08f9ff7d61384af1fe", size = 821284, upload-time = "2026-09-09T20:58:46.56Z" }, - { url = "https://files.pythonhosted.org/packages/32/45/91a977c96d4be13d1ade8208c260c26841c836d4c91745e1828a30589070/regex-2026.9.10-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9fbd2e5d8002dc49a6129fb321ec51c57a025e752ed525ddce0ba9223c4350a7", size = 789256, upload-time = "2026-09-09T20:58:48.473Z" }, - { url = "https://files.pythonhosted.org/packages/2d/79/4d110bf01bf9651bf9b3f88a6d9fa7e643e0586921a18432b25a478edbfa/regex-2026.9.10-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4a761ea45f2ad74c575ef5850ea514cef97302a552d3c7c9d1a1a870d4661d6c", size = 803722, upload-time = "2026-09-09T20:58:50.286Z" }, - { url = "https://files.pythonhosted.org/packages/e7/67/b587a0d3bbac2635309ed9c40c197120c39e1ec0afb8813cbed1338fdd75/regex-2026.9.10-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:75aa39d3f4f1650eea84e46b0d8cefe77dd5478c10e3d0aaf0b0f00493475a7a", size = 870085, upload-time = "2026-09-09T20:58:52.224Z" }, - { url = "https://files.pythonhosted.org/packages/07/fc/0827bca20ddba1d70fa5111a2a64e6b6b38bfdab43fc435022b54172a111/regex-2026.9.10-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f5c629df03adec31ee505dda3c8988f106c9390e4cbd343600036eb8b3d6724f", size = 776970, upload-time = "2026-09-09T20:58:54.478Z" }, - { url = "https://files.pythonhosted.org/packages/9b/03/ab9d08d30568ca868791bfb99551db60b947f05e2e65dcd1261e87083c21/regex-2026.9.10-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3a66e40a1a20de96a2fee00ed67e11012b62d85b277688258677fd19997addb7", size = 863611, upload-time = "2026-09-09T20:58:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/5e/6d/8063ae86b543ae878a7d6e7ba21ebf0af4af06161230e0012e2d652320c6/regex-2026.9.10-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:968c1e33edd9a104d1bf24c8d476c72de7e3839ae7f894b37e9e4f4739fdeeca", size = 804064, upload-time = "2026-09-09T20:58:59.066Z" }, - { url = "https://files.pythonhosted.org/packages/c5/63/b19305c4b8d3d7867699f7d83c43550273d91a2f31793452d87edb1d259f/regex-2026.9.10-cp314-cp314t-win32.whl", hash = "sha256:fbc4e2f3cb7ce8436154e6483079e7d35eeb321a952fa936e180300630d8b873", size = 274607, upload-time = "2026-09-09T20:59:00.942Z" }, - { url = "https://files.pythonhosted.org/packages/32/b8/1695072a512a49060294024e23b945eeb87675b02c06e53a92a1b42b0bfd/regex-2026.9.10-cp314-cp314t-win_amd64.whl", hash = "sha256:c37fa93bf18bf4f90b01c0fa9f11ea567ee4b7dd8bf96e63663e5edc37aa38cf", size = 283944, upload-time = "2026-09-09T20:59:02.876Z" }, - { url = "https://files.pythonhosted.org/packages/a9/9f/65bac17f39991a67e22f8b3c849fdc02a56147c97029b5351494341959b4/regex-2026.9.10-cp314-cp314t-win_arm64.whl", hash = "sha256:ffc2da104e43db716ce30cef9f28049a1faa6aca385dd8771b033268d0730b07", size = 283780, upload-time = "2026-09-09T20:59:05.009Z" }, - { url = "https://files.pythonhosted.org/packages/67/ca/1d1f83bc2f8fff4f186266ac82d73254e686565530cec9ab5228fb5c63dc/regex-2026.9.10-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:6afcad14310f1311d077553ed374b42a5e538f85a8c884b4e38e52de091c8077", size = 496869, upload-time = "2026-09-09T20:59:07.051Z" }, - { url = "https://files.pythonhosted.org/packages/33/42/4217510286501a2ebcd372b781b4754ac961e043fa13ef8dce803c44d89c/regex-2026.9.10-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:3fb4ae8cf83ef4e9addd43b2da31a9f45be816a8036fae8af59c8998b72718e2", size = 297121, upload-time = "2026-09-09T20:59:09.007Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/595468ed0bbccd94be92c6b5d67736ba128b204d942429a8485c2693914d/regex-2026.9.10-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f7d4656e17ab736e9415a6442a345bfc97bb8b7dcce47884bb74a37f70f08d0c", size = 292139, upload-time = "2026-09-09T20:59:10.859Z" }, - { url = "https://files.pythonhosted.org/packages/29/1c/ac92c123e0ab9bea75a904272171b356940bd6139e4a35de44f2254dca8f/regex-2026.9.10-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ba3bab0c45079735f55ac61526774de1d84bc4a0333cc554e1a4ab74913924", size = 802375, upload-time = "2026-09-09T20:59:12.823Z" }, - { url = "https://files.pythonhosted.org/packages/8d/16/d349f6fa9f908162359004e4f067353a0146e8074d24989490778244be44/regex-2026.9.10-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ff6b3267318661dfddf6b3628663e00e5946bd0a5c8fa678537a1401f0388f91", size = 872328, upload-time = "2026-09-09T20:59:15.352Z" }, - { url = "https://files.pythonhosted.org/packages/df/81/251b5aef23147057e926346fdb7c8c352d0568f65a492e4e9eb6120f6446/regex-2026.9.10-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:030fa9e23624e39b3b94e46b90a5abd1a1678eb2f58fcdd3fd6c27526bf91c7e", size = 919594, upload-time = "2026-09-09T20:59:17.31Z" }, - { url = "https://files.pythonhosted.org/packages/d0/6e/1f25319dc1b9cf4b7ffa303f3d16ca53260fe92aff45e81aa1b3c6c7cba2/regex-2026.9.10-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fbc8314436353e097c050e11b01a6c11433579437ed0579730157676ef59e2f", size = 807394, upload-time = "2026-09-09T20:59:19.328Z" }, - { url = "https://files.pythonhosted.org/packages/cc/fc/3da6b3dffddf12d5e96cbbe6f5e65ebcd64f92e3388a6690a53e0878232d/regex-2026.9.10-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e6c0b5ec6ddee4032247585dc491b0fa58627745b66a705728703a3f0331231", size = 786018, upload-time = "2026-09-09T20:59:21.592Z" }, - { url = "https://files.pythonhosted.org/packages/bb/6f/1cc86dafddc912ef44c5ccd4f729060be8c6735600932664eb6d0e25469b/regex-2026.9.10-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:bf29611e5376fec8f795879bb5c6153a76c3a292573d173c26784042b01eb840", size = 793504, upload-time = "2026-09-09T20:59:23.734Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cb/11692e29388d006211163627fcefa0c79917ab9f94d46a1b2254fe5efc81/regex-2026.9.10-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:ec8855f08c17895a26fbf5f19ed829722e19b34a96629e49a43c92974924026b", size = 866766, upload-time = "2026-09-09T20:59:25.798Z" }, - { url = "https://files.pythonhosted.org/packages/5d/78/3631df969830f94d83fcfc5fc71a7b39caad905e18f7b17350a94135d625/regex-2026.9.10-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:94c5ce3bc41d226b4eb89ca3f842b2e28c031487fb1f34eb2153d98235831325", size = 775825, upload-time = "2026-09-09T20:59:28.51Z" }, - { url = "https://files.pythonhosted.org/packages/4e/8a/762892a8e3e21d119eacaffde848aa247e6cf4e1d90c46011671e86b1b9e/regex-2026.9.10-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:9ce239acb15843ab03976626af810a4424b0409689ec2bbc52088ab5479ab487", size = 858901, upload-time = "2026-09-09T20:59:30.656Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f0/78048fada5c2f61d795efb26ea24f820a5564c4aa26574920284d45cd656/regex-2026.9.10-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:c22df8dd6373bbe3898e77429ffc85594300e39d752fd0e68a31e59d37899376", size = 796208, upload-time = "2026-09-09T20:59:32.852Z" }, - { url = "https://files.pythonhosted.org/packages/aa/58/632681f7b9aaa3d83b40e5862ba46364a453c8eb2bc7d43fece3dc31f972/regex-2026.9.10-cp315-cp315-win32.whl", hash = "sha256:1aa309ab7ba89a62d6cf70dbd38d4176440bce3c7001ab86256704cf4c18c6eb", size = 272704, upload-time = "2026-09-09T20:59:34.927Z" }, - { url = "https://files.pythonhosted.org/packages/5d/64/81cce28754c37037b1fe740b6d7a556d51d97cf935ea4547bfab104f43f7/regex-2026.9.10-cp315-cp315-win_amd64.whl", hash = "sha256:58da726d3e766c0b3f5a3997dfaf0275898a1107b8191cdd6b0437fe45fd817d", size = 281182, upload-time = "2026-09-09T20:59:36.86Z" }, - { url = "https://files.pythonhosted.org/packages/33/28/5a13a340c9c759e863a0e7f765d323601d03d6538c8a627ed628662e083b/regex-2026.9.10-cp315-cp315-win_arm64.whl", hash = "sha256:75f9297b16fcb588a1f8d8a55dabef3c0c20b0c7bac43c87ceaaaf1a825c12f4", size = 281512, upload-time = "2026-09-09T20:59:38.875Z" }, - { url = "https://files.pythonhosted.org/packages/f7/38/a3caebcd5105be90708071db20bd261b0961b8ea4fe5e8be45c2632519b5/regex-2026.9.10-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:1270cdec69248592bbe38a0b263ed58d907b891bd2b93703e225c317e421bda1", size = 501336, upload-time = "2026-09-09T20:59:40.987Z" }, - { url = "https://files.pythonhosted.org/packages/ee/b5/ec8887b2658bf0a5df143c7c1fcd562b0abd2fa208c04ebf15c6607c9bb2/regex-2026.9.10-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:681ed38664b64c6617d3c3c332018d1948c77e139c5ea667c1886efa671e426f", size = 299318, upload-time = "2026-09-09T20:59:43.039Z" }, - { url = "https://files.pythonhosted.org/packages/d5/58/84724a9eccf6e8cd46f7e4534576093e2476a5eeb55e2453aa6606e86059/regex-2026.9.10-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:8e127d9a80cbf1c3276bb465c6d047e8705e97b58c2b8f2f0c0a69c336b44b37", size = 294847, upload-time = "2026-09-09T20:59:44.954Z" }, - { url = "https://files.pythonhosted.org/packages/50/03/70ccc5e53905984abf8eab63eebd3ce740522ef8c8d392622b64d79ef290/regex-2026.9.10-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:990797e765d89a423880052c68b61c31afe701de94a8c060f61c40605ca6c727", size = 814359, upload-time = "2026-09-09T20:59:47.194Z" }, - { url = "https://files.pythonhosted.org/packages/29/53/40f7a11ec547e4a947883c9d5e8a075f6d4f59af2b8dbcaa8bf5b504aca0/regex-2026.9.10-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e5e4a6e0734a685d13b9685622bb503bdbb2927f8b0df025a5085f0ea067475b", size = 875586, upload-time = "2026-09-09T20:59:49.537Z" }, - { url = "https://files.pythonhosted.org/packages/0b/9d/83f3e022d99ce601727c4ef5f7b527753901ce4509ed89a1bb6a2263380a/regex-2026.9.10-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:63bb62cf62217dc38c8a6b2b61b165b0e4eb8fa93b0aba12139251c0986a8fa3", size = 920990, upload-time = "2026-09-09T20:59:51.776Z" }, - { url = "https://files.pythonhosted.org/packages/b2/64/dfdb367d8f4f5c9b8ccb4b59789c2ce996f2c69c3b8192aa986fe7d92ec4/regex-2026.9.10-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cb76a9c4e07a6a47849726af0ed14c41741a182f097f134a8cf29c1bc0f4dde8", size = 818660, upload-time = "2026-09-09T20:59:54.428Z" }, - { url = "https://files.pythonhosted.org/packages/88/a6/fb7d0b64487913845834f319aa84f8377d55305958a5db7e19c128798366/regex-2026.9.10-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:31e4df2b11d48f61d511019bc1ee9b477055f17c352b68fe72db7a98b14d603c", size = 794976, upload-time = "2026-09-09T20:59:56.799Z" }, - { url = "https://files.pythonhosted.org/packages/3e/1c/23484edaae387ea0d31f4d414463211e3516c8aa210ce8d0640f5aff3502/regex-2026.9.10-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:cf377960d2ac37d987394a9dbaa75e91338c41a46d41e1d25e90125e7b3ee2dc", size = 804081, upload-time = "2026-09-09T20:59:59.39Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e1/e30d138f13aecec99ea9aecef7e31563de6ec6a2f5ce1d65fc506aee33fe/regex-2026.9.10-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:c8fbd9cb30c68c1686b94029b9ef845d5870d3d65baf66cb126b676849b9d72b", size = 870430, upload-time = "2026-09-09T21:00:03.304Z" }, - { url = "https://files.pythonhosted.org/packages/53/dc/81f9ce86f7ae4f57901543597c95751fa01c41a672ec1636dd913f8a000a/regex-2026.9.10-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:53e182b6b04d0011909b47d51a2d72d908de07c7b1c7f16b3adda2204d723bc1", size = 783327, upload-time = "2026-09-09T21:00:05.68Z" }, - { url = "https://files.pythonhosted.org/packages/a9/1b/d7bf8f91534740f6a8ca17e5ac9c5337903baf527c8de240fbac1bbedfd0/regex-2026.9.10-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:0aa7589394230e0f0a422ab6b90841ff12c87e855e7aaf75d192a54a5f124548", size = 860874, upload-time = "2026-09-09T21:00:08.41Z" }, - { url = "https://files.pythonhosted.org/packages/9a/1d/52cc88364aca7c9013dfe9abe0fea67f8d394efe384d07798300a6e2f27d/regex-2026.9.10-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:1b891f77554bff991804cee24b78b40789f7d5993a24c7907bc7025fd2a70c8d", size = 806705, upload-time = "2026-09-09T21:00:10.768Z" }, - { url = "https://files.pythonhosted.org/packages/cb/51/37a194df7707f92f33173260ba7b221d4ec376419a53babaec50019a2804/regex-2026.9.10-cp315-cp315t-win32.whl", hash = "sha256:5bef622850cf760154719d4e0d74b0a855962432995168e250069899ae12fe8f", size = 274780, upload-time = "2026-09-09T21:00:14.003Z" }, - { url = "https://files.pythonhosted.org/packages/77/12/3227a52970d90908b230f15b2c86df903f49ac72c9eedf4f6e8b5bb5e1a7/regex-2026.9.10-cp315-cp315t-win_amd64.whl", hash = "sha256:07b45ba5c94b8fcb30cb6c56a11f715c57533a3017964504322ea52690a27b72", size = 283936, upload-time = "2026-09-09T21:00:16.275Z" }, - { url = "https://files.pythonhosted.org/packages/f3/bc/c567c5a61671f04d30e83f20b496b465432879196574d051007285576205/regex-2026.9.10-cp315-cp315t-win_arm64.whl", hash = "sha256:f70b9f0e39c2dba1d9da6bf7ef7c377cad7277f8440e9a69be05ede529ff024c", size = 283747, upload-time = "2026-09-09T21:00:19.113Z" }, +version = "2026.7.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/13/bbf7d9d1887fe4a3693527c6caa232c197ea9da91f1212e9672eff60329d/regex-2026.7.19-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:555497390743af1a65045fa4527782d10ff5b88970359412baa4a1e628fe393b", size = 494009, upload-time = "2026-07-19T00:16:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/a3/19/783688e75a2bec15d50aec0d5e7e317d363808bc82a6eb6750b897bfcd7b/regex-2026.7.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:343a4504e3fb688c47cad451221ca5d4814f42b1e16c0065bde9cbf7f473bd52", size = 295287, upload-time = "2026-07-19T00:16:15.702Z" }, + { url = "https://files.pythonhosted.org/packages/16/01/cefe4f051302ca298d3f3e79ed6dbd933ac84485b9515acdd6a52d70cef7/regex-2026.7.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ebee1ee89c39c953baac6924fcde08c5bb427c4057510862f9d7c7bdb3d8665", size = 290633, upload-time = "2026-07-19T00:16:17.182Z" }, + { url = "https://files.pythonhosted.org/packages/ae/1e/1045ca2cabb12e8ec41ad0d138e9f3ff1eb079d30a6f51ccf7d709b44aad/regex-2026.7.19-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:062f8cb7a9739c4835d22bd96f370c59aba89f257adcfa53be3cc209e08d3ae0", size = 785300, upload-time = "2026-07-19T00:16:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/20e5bca184e90bf1bd187efdb53363f4a7b7b34f01d54ced5740caf104bd/regex-2026.7.19-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1123ef4211d763ee771d47916a1596e2f4915794f7aabdc1adcb20e4249a6951", size = 854079, upload-time = "2026-07-19T00:16:19.909Z" }, + { url = "https://files.pythonhosted.org/packages/09/9b/5a2e59678be3b24aa6a42b2c6d66a48daa212593e9f4096fe7ba577fa9b1/regex-2026.7.19-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6e44c0e7c5664be20aee92085153150c0a7967310a73a43c0f832b7cd35d0dd3", size = 899496, upload-time = "2026-07-19T00:16:21.453Z" }, + { url = "https://files.pythonhosted.org/packages/48/9a/7317f14ed8ed9fd998d1978b4802b07bc4d79216353c435dbcc1ddd1301f/regex-2026.7.19-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98c6ac18480fcdb33f35439183f1d2e79760ab41930309c6d951cb1f8e46694c", size = 793541, upload-time = "2026-07-19T00:16:22.991Z" }, + { url = "https://files.pythonhosted.org/packages/6f/53/833c2db3e274d3c191f4c42fe5bfa358e4c8b617d5d7312d31334965fc46/regex-2026.7.19-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4458124d71339f505bf1fb94f69fd1bb8fa9d2481eebfef27c10ef4f2b9e12f6", size = 785515, upload-time = "2026-07-19T00:16:24.654Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b9/efb2f9fa151d71db09d4015e1fb92fee47416f01c12164836bbd23e2f3c2/regex-2026.7.19-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbf300e2070bb35038660b3be1be4b91b0024edb41517e6996320b49b92b4175", size = 769556, upload-time = "2026-07-19T00:16:26.207Z" }, + { url = "https://files.pythonhosted.org/packages/81/4d/45610c263f8eadb84e4a1fabd904d81d5176226faa9104ef498bf8a8b285/regex-2026.7.19-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b2b506b1788df5fecd270a10d5e70a95fe77b87ea2b370a318043f6f5f817ee6", size = 774130, upload-time = "2026-07-19T00:16:27.786Z" }, + { url = "https://files.pythonhosted.org/packages/40/95/1b40d87c7a9e5480bec7a87bce9fd67fc3f14b5f106c8ee66d660249072f/regex-2026.7.19-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:52579c60a6078be70a0e49c81d6e56d677f34cd439af281a0083b8c7bc75c095", size = 848694, upload-time = "2026-07-19T00:16:29.412Z" }, + { url = "https://files.pythonhosted.org/packages/17/8b/bb45968addd5b394ef9cd9184bd9c65ade1a819dbb2b92b71ad52a0c7907/regex-2026.7.19-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:2955907b7157a6660f27079edf7e0229e9c9c5325c77a2ef6a890cba91efa6f0", size = 758505, upload-time = "2026-07-19T00:16:31.006Z" }, + { url = "https://files.pythonhosted.org/packages/bf/6f/33386c672fbf43e21602135a0f29a97ee251a483f007fe51d10e9b2dbc93/regex-2026.7.19-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:89dfee3319f5ae3f75ebd5c2445a809bb320252ba5529ffdafea4ef25d79cf1a", size = 836985, upload-time = "2026-07-19T00:16:32.459Z" }, + { url = "https://files.pythonhosted.org/packages/22/f1/9112b86e9bb075619862e8e42b604794389f1958faa68fb69bde505dd90e/regex-2026.7.19-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d3143f159261b1ce5b24c261c590e5913370c3200c5e9ebbb92b5aa5e111902", size = 782610, upload-time = "2026-07-19T00:16:33.857Z" }, + { url = "https://files.pythonhosted.org/packages/3a/f9/13d460d8a385ca0b0be9e6be80a90968b9293b3e30895543ad2d1d1653e4/regex-2026.7.19-cp310-cp310-win32.whl", hash = "sha256:64729333167c2dcaaa56a331d40ee097bd9c5617ffd51dabb09eaddafb1b532e", size = 266772, upload-time = "2026-07-19T00:16:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/9f/90/29addd7a03e1aea402c1f31467e25c80caabc8c3735b88a23cf73b0aa9c2/regex-2026.7.19-cp310-cp310-win_amd64.whl", hash = "sha256:1c398716054621aa300b3d411f467dda903806c5da0df6945ab73982b8d115db", size = 277967, upload-time = "2026-07-19T00:16:36.847Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ba/ecfce06fe66c122bc6f77ae284887a9282e4411fe1e6268c5266611ca054/regex-2026.7.19-cp310-cp310-win_arm64.whl", hash = "sha256:064f1760a5a4ade65c5419be23e782f29147528e8a66e0c42dd4cedb8d4e9fc6", size = 276963, upload-time = "2026-07-19T00:16:38.315Z" }, + { url = "https://files.pythonhosted.org/packages/05/e5/cef4de2bac939280b68d32adc659478845238a8274f2f79c465063f590ad/regex-2026.7.19-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ac777001cdfc28b72477d93c8564bb7583081ea8fb45cdca3d568e0a4f87183c", size = 494012, upload-time = "2026-07-19T00:16:39.927Z" }, + { url = "https://files.pythonhosted.org/packages/ff/87/e86f51eb117457bb7803132ffe5cb6e2841e2b5bea4cc85d397f3c6e257d/regex-2026.7.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:59787bd5f8c70aa339084e961d2996b53fbdeab4d5393bba5c1fe1fc32e02bae", size = 295281, upload-time = "2026-07-19T00:16:41.433Z" }, + { url = "https://files.pythonhosted.org/packages/41/2e/2360c41d8080a3d9ec7e5c90fad6eab3b50192869d10e9a5609e48c8177b/regex-2026.7.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:90c633e7e8d6bf4e992b8b36ce69e018f834b641dd6de8cea6d78c06ffa119c5", size = 290615, upload-time = "2026-07-19T00:16:43.058Z" }, + { url = "https://files.pythonhosted.org/packages/cf/69/b65ba4344efbc771b28fe5dde84cbbb6c8f9551165952fe78def5b9dde6a/regex-2026.7.19-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:87ccab0db8d5f4fbb0272642113c1adb2ffc698c16d3a0944580222331fa7a20", size = 791804, upload-time = "2026-07-19T00:16:44.662Z" }, + { url = "https://files.pythonhosted.org/packages/81/b6/a40dfa0dc6224b36f620c00296eacc830489cbf8c2837b6750dfe6170375/regex-2026.7.19-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e50d748a32da622f256e8d505867f5d3c43a837c6a9f0efb149655fadd1042a", size = 861723, upload-time = "2026-07-19T00:16:46.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/02/735991dee71abd83196a7962f7ed8bf5aa05720ff06e2d3ff896a85e2bbb/regex-2026.7.19-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf1516fe58fc104f39b2d1dbe2d5e27d0cd45c4be2e42ba6ee0cc763701ec3c7", size = 905932, upload-time = "2026-07-19T00:16:47.956Z" }, + { url = "https://files.pythonhosted.org/packages/45/6c/e7098d8b846ccdbf431d8c081b61e496526a27a28094ed09e0dce21b3f54/regex-2026.7.19-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09f3e5287f94f17b709dc9a9e70865855feee835c861613be144218ce4ca82cc", size = 801407, upload-time = "2026-07-19T00:16:49.43Z" }, + { url = "https://files.pythonhosted.org/packages/8a/18/34b69274e2649bcc7d9b089c2b2983fb2632d8ecf667e359593be9072e79/regex-2026.7.19-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6383cd2ed53a646c659ba1fe65727db76437fdaa069e697a0b44a51d5843d864", size = 774448, upload-time = "2026-07-19T00:16:51.352Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e6/0a72247d025585fd3800b98e040b84d562a88af6303347100484849f4f01/regex-2026.7.19-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:09d3007fc76249a83cdd33de160d50e6cb77f54e09d8fa9e7148e10607ce24af", size = 783297, upload-time = "2026-07-19T00:16:53.071Z" }, + { url = "https://files.pythonhosted.org/packages/b1/aa/c4f65ae7dd02a36b323a70c4cff326e1f3442361aaebc9311100a130d54f/regex-2026.7.19-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f8c6e7a1cfa3dc9d0ee2de0e65e834537fa29992cc3976ffec914afc35c5dd5", size = 854736, upload-time = "2026-07-19T00:16:54.607Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/668082bcc817b9e694189b84997aeba7385b7779faa6711788679c482e35/regex-2026.7.19-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b2ea4a3e8357be8849e833beeae757ac3c7a6b3fc055c03c808a53c91ad30d82", size = 763298, upload-time = "2026-07-19T00:16:56.289Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fb/2d07ad555e7af88aa5f867fdafa47a8d945ee237c20af3ebceb46a820835/regex-2026.7.19-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:80115dd39481fd3a4b4080220799dbcacb921a844de4b827264ececacbe17c78", size = 844430, upload-time = "2026-07-19T00:16:57.933Z" }, + { url = "https://files.pythonhosted.org/packages/51/15/c82a471fe3dce56f03745635b43aa456c40dc0db089e07ef148b331507d1/regex-2026.7.19-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6ce43a0269d68cee79a7d1ade7def53c20f8f2a047b92d7b5d5bcc73ae88327", size = 789683, upload-time = "2026-07-19T00:16:59.583Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f4/7532a2c59d56f5398902c20de60f0c9a5d1cd364e42a051b48e1b210be7b/regex-2026.7.19-cp311-cp311-win32.whl", hash = "sha256:9be2a6647740dd3cca6acb24e87f03d7632cd280dbce9bbe40c26353a215a45d", size = 266778, upload-time = "2026-07-19T00:17:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/cf1bc631db154eb95520d9d5dbc2371ff77a0f014bbf7d748fed8496aa63/regex-2026.7.19-cp311-cp311-win_amd64.whl", hash = "sha256:8d3469c91dd92ee41b7c95280edbd975ef1ba9195086686623a1c6e8935ce965", size = 277983, upload-time = "2026-07-19T00:17:02.571Z" }, + { url = "https://files.pythonhosted.org/packages/8d/bd/56ceaf170e875d5a6761bf2bfd0d040f1cacc896850d5e40cb29b11bbd06/regex-2026.7.19-cp311-cp311-win_arm64.whl", hash = "sha256:36aacfb15faaff3ced55afbf35ec72f50d4aee22082c4f7fe0573a33e2fca92e", size = 276961, upload-time = "2026-07-19T00:17:04.135Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b9/d11d7e501ac8fd7d617684423ebb9561e0b998481c1e4cbc0cb212c5d74a/regex-2026.7.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2cc3460cedf7579948486eab03bc9ad7089df4d7281c0f47f4afe03e8d13f02d", size = 496778, upload-time = "2026-07-19T00:17:05.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a9/a5ab6f312f24318019170dc485d5421fe4f89e43a98640da50d95a8a7041/regex-2026.7.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0e9554c8785eac5cffe6300f69a91f58ba72bc88a5f8d661235ad7c6aa5b8ccd", size = 297122, upload-time = "2026-07-19T00:17:07.59Z" }, + { url = "https://files.pythonhosted.org/packages/b3/63/4cab4d7f2d384a144d420b763d97674cb70619c878ea6fcd7640d0e62143/regex-2026.7.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7da47a0f248977f08e2cb659ff3c17ddc13a4d39b3a7baa0a81bf5b415430f6", size = 292009, upload-time = "2026-07-19T00:17:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/102a81b218298957d4ea7d2f084fae537a71add9d6ff93c8e67284c5f45e/regex-2026.7.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93db40c8de0815baab96a06e08a984bac71f989d13bab789e382158c5d426797", size = 796708, upload-time = "2026-07-19T00:17:11.542Z" }, + { url = "https://files.pythonhosted.org/packages/78/b5/dc136af5629938a037cd2b304c12240e132ec92f38be8ff9cc89af2a1f2d/regex-2026.7.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:66bd62c59a5427746e8c44becae1d9b99d22fb13f30f492083dfb9ad7c45cc18", size = 865651, upload-time = "2026-07-19T00:17:13.312Z" }, + { url = "https://files.pythonhosted.org/packages/e0/75/67402ae3cd9c8c988a4c805d15ee3eef015e7ca4cb112cf3e640fc1f4153/regex-2026.7.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1649eb39fcc9ea80c4d2f110fde2b8ab2aef3877b98f02ab9b14e961f418c511", size = 911756, upload-time = "2026-07-19T00:17:15.015Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8e/096d00c7c480ef2ff4265349b14e2261d4ab787ba1f74e2e80d1c58079c3/regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dce8ec9695f531a1b8a6f314fd4b393adcccf2ea861db480cdf97a301d01a68", size = 801798, upload-time = "2026-07-19T00:17:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/41/e7ecac6edb5722417f85cc67eaf386322fbe8acf6918ec2fdc37c20dd9d0/regex-2026.7.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3080a7fd38ef049bd489e01c970c97dd84ff446a885b0f1f6b26d9b1ad13ce11", size = 776933, upload-time = "2026-07-19T00:17:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/6f/69/03c9b3f058d66403e0ca2c938696e81d51cd4c6d47ec5265f02f96948d9a/regex-2026.7.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d793a7988e04fcb1e2e135567443d82173225d657419ec09414a9b5a145b986", size = 784338, upload-time = "2026-07-19T00:17:21.057Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f7/b38ab3d43f284afbb618fcd15d0e77eb786ae461ce1f6bc7494619ddc0f2/regex-2026.7.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e8b0abe7d870f53ca5143895fef7d1041a0c831a140d3dc2c760dd7ba25d4a8b", size = 860452, upload-time = "2026-07-19T00:17:23.119Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/ff60ef0571121714f3cf9920bc183071e384a10b556d042e0fdb06cc07a5/regex-2026.7.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4e5413bd5f13d3a4e3539ca98f70f75e7fca92518dd7f117f030ebedd10b60cb", size = 765958, upload-time = "2026-07-19T00:17:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0f/bd34021162c0ab47f9a315bd56cd5642e920c8e5668a75ef6c6a6fca590d/regex-2026.7.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:73b133a9e6fb512858e7f065e96f1180aa46646bc74a83aea62f1d314f3dd035", size = 851765, upload-time = "2026-07-19T00:17:26.993Z" }, + { url = "https://files.pythonhosted.org/packages/2a/20/a2ca43edade0595cccfdc98636739f536d9e26898e7dbddc2b9e98898953/regex-2026.7.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbe6493fbd27321b1d1f2dd4f5c7e5bd4d8b1d7cab7f32fd67db3d0b2ed8248a", size = 789714, upload-time = "2026-07-19T00:17:28.699Z" }, + { url = "https://files.pythonhosted.org/packages/5d/47/e02db4015d424fc83c00ea0ac8c5e5ec14397943de9abf909d5ce3a25931/regex-2026.7.19-cp312-cp312-win32.whl", hash = "sha256:ddd67571c10869f65a5d7dde536d1e066e306cc90de57d7de4d5f34802428bb5", size = 267157, upload-time = "2026-07-19T00:17:31.051Z" }, + { url = "https://files.pythonhosted.org/packages/08/8e/c780c131f79b42ed22d1bd7da4096c2c35f813e835acd02ef0f018bd892c/regex-2026.7.19-cp312-cp312-win_amd64.whl", hash = "sha256:e30d40268a28d54ce0437031750497004c22602b8e3ab891f759b795a003b312", size = 277777, upload-time = "2026-07-19T00:17:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3d/84165e4299ff76f3a40fe1f2abf939e976f693383a08d2beea6af62bd2c1/regex-2026.7.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f035d9dc1d25eff9d361456572231c7d27b5ccd473ca7dc0adfce732bd006d40", size = 496552, upload-time = "2026-07-19T00:17:36.808Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/a65293e6e4cf28eb7ee1be5335a5386c40d6742e9f47fafc8fec785e16c7/regex-2026.7.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42572142ed0b9d5d261ba727157c426510da78e20828b66bbb855098b8a4e38", size = 296983, upload-time = "2026-07-19T00:17:38.816Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/2d0564e93d87bc48618360ddca232a2ca612bbdf53ce8465d45ca5ce14ee/regex-2026.7.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40b34dd88658e4fedd2fddbf0275ac970d00614b731357f425722a3ed1983d11", size = 291832, upload-time = "2026-07-19T00:17:40.726Z" }, + { url = "https://files.pythonhosted.org/packages/07/cd/42dfbabff3dfc9603c501c0e2e2c5adbb09d127b267bf5348de0af338c15/regex-2026.7.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c41c63992bf1874cebb6e7f56fd7d3c007924659a604ae3d90e427d40d4fd13", size = 796775, upload-time = "2026-07-19T00:17:42.382Z" }, + { url = "https://files.pythonhosted.org/packages/df/5d/f6a4839f2b934e3eed5973fd07f5929ee97d4c98939fb275ea23c274ee16/regex-2026.7.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d3372064506b94dd2c67c845f2db8062e9e9ba84d04e33cb96d7d33c11fe1ae", size = 865687, upload-time = "2026-07-19T00:17:44.185Z" }, + { url = "https://files.pythonhosted.org/packages/14/b0/b47d6c36049bc59806a50bd4c86ced70bbe058d787f80281b1d7a9b0e024/regex-2026.7.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fce7760bf283405b2c7999cab3da4e72f7deca6396013115e3f7a955db9760da", size = 911962, upload-time = "2026-07-19T00:17:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/2a/be/ff61f28f9273658cfe23acbbac5217221f6519960ed401e61dfdab12bc35/regex-2026.7.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0d702548d89d572b2929879bc883bb7a4c4709efafe4512cadee56c55c9bd15", size = 801817, upload-time = "2026-07-19T00:17:48.25Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bb/8b4f7f26b333f9f79e1b453613c39bb4776f51d38ae66dd0ba31d6b354ca/regex-2026.7.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d446c6ac40bb6e05025ccee55b84d80fe9bf8e93010ffc4bb9484f13d498835f", size = 776908, upload-time = "2026-07-19T00:17:50.183Z" }, + { url = "https://files.pythonhosted.org/packages/09/13/610110fc5921d380516d03c26b652555f08aa0d23ea78a771231873c3638/regex-2026.7.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c3501bfa814ab07b5580741f9bf78dfdfe146a04057f82df9e2402d2a975939", size = 784426, upload-time = "2026-07-19T00:17:52.454Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f5/1ef9e2a83a5947c57ebff0b377cb5727c3d5ec1992317a320d035cd0dbb6/regex-2026.7.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c4585c3e64b4f9e583b4d2683f18f5d5d872b3d71dcf24594b74ecc23602fa96", size = 860600, upload-time = "2026-07-19T00:17:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/a0/02/073af33a3ec149241d11c80acea91e722aa0adbf05addd50f251c4fe89c3/regex-2026.7.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:571fde9741eb0ccde23dd4e0c1d50fbae910e901fa7e629faf39b2dda740d220", size = 765950, upload-time = "2026-07-19T00:17:56.041Z" }, + { url = "https://files.pythonhosted.org/packages/81/a9/d1e9f819dc394a568ef370cd56cf25394e957a2235f8370f23b576e5a475/regex-2026.7.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:15b364b9b98d6d2fe1a85034c23a3180ff913f46caddc3895f6fd65186255ccc", size = 851794, upload-time = "2026-07-19T00:17:57.897Z" }, + { url = "https://files.pythonhosted.org/packages/03/3a/8ae83eda7579feacdf984e71fb9e70635fb6f832eeddca58427ec4fca926/regex-2026.7.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffd8893ccc1c2fce6e0d6ca402d716fe1b29db70c7132609a05955e31b2aa8f2", size = 789845, upload-time = "2026-07-19T00:17:59.97Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/c195cbfe5a75fdec64d8f6554fd15237b837919d2c61bdc141d7c807b08b/regex-2026.7.19-cp313-cp313-win32.whl", hash = "sha256:f0fa4fa9c3632d708742baf2282f2055c11d888a790362670a403cbf48a2c404", size = 267135, upload-time = "2026-07-19T00:18:01.958Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/a11de8404b7272b70acb45c1c05987cce60b45d5693da2e176f0e390d564/regex-2026.7.19-cp313-cp313-win_amd64.whl", hash = "sha256:d51ffd3427640fa2da6ade574ceba932f210ad095f65fcc450a2b0a0d454868e", size = 277747, upload-time = "2026-07-19T00:18:04.121Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/0f5c8eff1b4f1f3d83276d365fccecf666afcc7d947420943bf394d07adb/regex-2026.7.19-cp313-cp313-win_arm64.whl", hash = "sha256:c670fe7be5b6020b76bc6e8d2196074657e1327595bca93a389e1a76ab130ad8", size = 277129, upload-time = "2026-07-19T00:18:05.821Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4c/44b74742052cedda40f9ae469532a037112f7311a36669a891fba8984bb0/regex-2026.7.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db47b561c9afd884baa1f96f797c9ca369872c4b65912bc691cfa99e68340af2", size = 501134, upload-time = "2026-07-19T00:18:07.567Z" }, + { url = "https://files.pythonhosted.org/packages/f0/45/bbd038b5e39ee5613a5a689290145b40058cc152c41de9cc23639d2b9734/regex-2026.7.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65dcd28d3eba2ab7c2fd906485cc301392b47cc2234790d27d4e4814e02cdfda", size = 299418, upload-time = "2026-07-19T00:18:09.38Z" }, + { url = "https://files.pythonhosted.org/packages/65/38/c5bde94b4cedfd5850d64c3f08222d8e1600e84f6ee71d9b44b4b8163f74/regex-2026.7.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f2e7f8e2ab6c2922be02c7ec45185aa5bd771e2e57b95455ee343a44d8130dff", size = 294486, upload-time = "2026-07-19T00:18:11.188Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6a/2f5e107cb26c960b781967178899daf2787a7ab151844ed3c01d6fc95474/regex-2026.7.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe31f28c94402043161876a258a9c6f757cb485905c7614ce8d6cd40e6b7bdc1", size = 811643, upload-time = "2026-07-19T00:18:12.975Z" }, + { url = "https://files.pythonhosted.org/packages/37/d4/a2f963406d7d73a62eed84ba05a258afb6cad1b21aa4517443ce40506b78/regex-2026.7.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f8f6fa298bb4f7f58a33334406218ba74716e68feddf5e4e54cd5d8082705abf", size = 871081, upload-time = "2026-07-19T00:18:14.733Z" }, + { url = "https://files.pythonhosted.org/packages/45/a3/44be546340bedb15f13063f5e7fe16793ea4d9ea2e805d09bd174ac27724/regex-2026.7.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cc1b2440423a851fad781309dd87843868f4f66a6bcd1ddb9225cf4ec2c84732", size = 917372, upload-time = "2026-07-19T00:18:16.724Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f6/e0870b0fd2a40dba0074e4b76e514b21313d37946c9248453e34ec43923e/regex-2026.7.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ac59a0900474a52b7c04af8196affc22bd9842acb0950df12f7b813e983609a", size = 816089, upload-time = "2026-07-19T00:18:18.617Z" }, + { url = "https://files.pythonhosted.org/packages/ae/27/957e8e22690ad6634572b39b71f130a6105f4d0718bb16849eac00fff147/regex-2026.7.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4896db1f4ce0576765b8272aa922df324e0f5b9bb2c3d03044ff32a7234a9aba", size = 785206, upload-time = "2026-07-19T00:18:20.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/a4/186e410941e731037c01166069ab86da9f65e8f8110c18009ccf4bd623ee/regex-2026.7.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4e6883a021db30511d9fb8cfb0f222ce1f2c369f7d4d8b0448f449a93ba0bdfc", size = 800431, upload-time = "2026-07-19T00:18:22.716Z" }, + { url = "https://files.pythonhosted.org/packages/73/9f/e4e10e023d291d64a33e246610b724493bf1ce98e0e59c9b7c837e5acfb7/regex-2026.7.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:09523a592938aa9f587fb74467c63ff0cf88fc3df14c82ab0f0517dcf76aaa62", size = 864906, upload-time = "2026-07-19T00:18:24.772Z" }, + { url = "https://files.pythonhosted.org/packages/24/57/ccb20b6be5f1f52a053d1ba2a8f7a077edb9d918248b8490d7506c6832b3/regex-2026.7.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1ebac3474b8589fce2f9b225b650afd61448f7c73a5d0255a10cc6366471aed1", size = 773559, upload-time = "2026-07-19T00:18:27.008Z" }, + { url = "https://files.pythonhosted.org/packages/a3/82/f3b263cf8fad927dc102891da8502e718b7ff9d19af7a2a07c03865d7188/regex-2026.7.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4a0530bb1b8c1c985e7e2122e2b4d3aedd8a3c21c6bfddae6767c4405668b56e", size = 857739, upload-time = "2026-07-19T00:18:29.107Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/1687bd1b6c2aed5e672ccf845fc11557821fe7366d921b50889ea5ce57bf/regex-2026.7.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef7eeb108c47ce7bcc9513e51bcb1bf57e8f483d52fce68a8642e3527141ae0", size = 804522, upload-time = "2026-07-19T00:18:31.362Z" }, + { url = "https://files.pythonhosted.org/packages/76/7c/cc4e7655181b2d9235b704f2c5e19d8eff002bbc437bae59baee0e381aca/regex-2026.7.19-cp313-cp313t-win32.whl", hash = "sha256:64b6ca7391a1395c2638dd5c7456d67bea44fc6c5e8e92c5dc8aa6a8f23292b4", size = 269141, upload-time = "2026-07-19T00:18:33.479Z" }, + { url = "https://files.pythonhosted.org/packages/bb/14/961b4c7b05a2391c32dbc85e27773076671ef8f97f36cec70fe414734c02/regex-2026.7.19-cp313-cp313t-win_amd64.whl", hash = "sha256:f04b9f56b0e0614c0126be12c2c2d9f8850c1e57af302bd0a63bed379d4af974", size = 280036, upload-time = "2026-07-19T00:18:35.419Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/795644550d788ddbb6dc458c95895f8009978ea6d6ea76b005eb3f45e8c9/regex-2026.7.19-cp313-cp313t-win_arm64.whl", hash = "sha256:fcee38cd8e5089d6d4f048ba1233b3ad76e5954f545382180889112ff5cb712d", size = 279394, upload-time = "2026-07-19T00:18:37.454Z" }, + { url = "https://files.pythonhosted.org/packages/d2/25/0c4c452f8ef3efe456745b2f33195f5904b573fb4c2ff3f0cb9ec188461e/regex-2026.7.19-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a81758ed242b861b72e778ba34d41366441a2e10b16b472784c88da2dea7e2dd", size = 496750, upload-time = "2026-07-19T00:18:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/24/9e/b70ca6c1704f6c7cd32a9e143c86cc5968d10981eca284bad670c245ea7d/regex-2026.7.19-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4aa5435cdb3eb6f55fe98a171b05e3fbcd95fadaa4aa32acf62afd9b0cfdbcac", size = 297093, upload-time = "2026-07-19T00:18:41.583Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/0b692da2520d51fbff19c88b83d97e4c702909dd02386c585998b7e2dbed/regex-2026.7.19-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:60be8693a1dadc210bbcbc0db3e26da5f7d01d1d5a3da594e99b4fa42df404f5", size = 292043, upload-time = "2026-07-19T00:18:43.347Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a7/1d478e614016045a33feae57446215f9fd65b665a5ceb2f891fb3183bc52/regex-2026.7.19-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d19662dbedbe783d323196312d38f5ba53cf56296378252171985da6899887d3", size = 797214, upload-time = "2026-07-19T00:18:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ae/11b9c9411d92c30e3d2db32df5a31133e4a99a8fc397a604fd08f6c4bffb/regex-2026.7.19-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d15df07081d91b76ff20d43f94592ee110330152d617b730fdbe5ef9fb680053", size = 866433, upload-time = "2026-07-19T00:18:47.315Z" }, + { url = "https://files.pythonhosted.org/packages/b1/62/2b2efc4992f91d6d204b24c647c9f9412e85379d92b7c0ab9fdae622327e/regex-2026.7.19-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:56ad4d9f77df871a99e25c37091052a02528ec0eb059de928ee33956b854b45b", size = 911360, upload-time = "2026-07-19T00:18:49.588Z" }, + { url = "https://files.pythonhosted.org/packages/14/71/986ceea9aa3da548bf1357cad89b63915ec6d21ec957c8113b29ece567df/regex-2026.7.19-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7322ec6cc9fba9d49ab888bb82d67ac5625627aa168f0165139b17018df3fb8a", size = 801275, upload-time = "2026-07-19T00:18:51.767Z" }, + { url = "https://files.pythonhosted.org/packages/15/be/ce9d9534b2cda96eab32c548261224b9b4e220a4126f098f60f42ae7b4cd/regex-2026.7.19-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9c7472192ebfad53a6be7c4a8bfb2d64b81c0e93a1fc8c57e1dd0b638297b5d1", size = 777131, upload-time = "2026-07-19T00:18:54.053Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/58b5c710f2c3929515a25f3a1ca0dad0dcd4518d4fff3cf23bc7adb8dcd2/regex-2026.7.19-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c10b82c2634df08dfb13b1f04e38fe310d086ee092f4f69c0c8da234251e556e", size = 785020, upload-time = "2026-07-19T00:18:56.579Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/5fe091935b74f15fe0f97998c215cae418d1c0413f6258c7d4d2e83aa37f/regex-2026.7.19-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:17ed5692f6acc4183e98331101a5f9e4f64d72fe58b753da4d444a2c77d05b12", size = 861263, upload-time = "2026-07-19T00:18:58.64Z" }, + { url = "https://files.pythonhosted.org/packages/d8/fa/d60bf82e10841eef62a9e32aac401468f05fddfbcb2942e342b1ba3d2433/regex-2026.7.19-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:22a992de9a0d91bda927bf02b94351d737a0302905432c88a53de7c4b9ce62e2", size = 766199, upload-time = "2026-07-19T00:19:00.705Z" }, + { url = "https://files.pythonhosted.org/packages/bf/5d/11e64d151b0662b81d6bf644c74dc118d461df85bdf2577fadbbf751788a/regex-2026.7.19-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:618a0aed532be87294c4477b0481f3aa0f1520f4014a4374dd4cf789b4cd2c97", size = 851317, upload-time = "2026-07-19T00:19:03.015Z" }, + { url = "https://files.pythonhosted.org/packages/7c/34/532efb87488d90807bae6a443d357ee5e2728a478c597619c8aaa17cc0bd/regex-2026.7.19-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ce9e679f776649746729b6c86382da519ef649c8e34cc41df0d2e5e0f6c36d4", size = 789557, upload-time = "2026-07-19T00:19:05.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/90/3a8d5ca977171ec3ae21a71207d2228b2663bde14d7f7ef0e6363ecf9290/regex-2026.7.19-cp314-cp314-win32.whl", hash = "sha256:73f272fba87b8ccfe70a137d02a54af386f6d27aa509fbffdd978f5947aae1aa", size = 272531, upload-time = "2026-07-19T00:19:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/96/e1/8862885e70409de70e8c005f57fb2e7be8d9ef0317250d60f4c9660a300d/regex-2026.7.19-cp314-cp314-win_amd64.whl", hash = "sha256:d721e53758b2cca74990185eb0671dd466d7a388a1a45d0c6f4c13cef41a68ac", size = 280831, upload-time = "2026-07-19T00:19:09.46Z" }, + { url = "https://files.pythonhosted.org/packages/08/82/2693e53e29f9104d9de95d37ce4dd826bd32d5f9c0085d3aa6ac042675c4/regex-2026.7.19-cp314-cp314-win_arm64.whl", hash = "sha256:65fa6cb38ed5e9c3637e68e544f598b39c3b86b808ed0627a67b68320384b459", size = 281099, upload-time = "2026-07-19T00:19:11.398Z" }, + { url = "https://files.pythonhosted.org/packages/92/b7/9a01aa16461a18cde9d7b9c3ab21e501db2ce33725f53014342b91df2b0a/regex-2026.7.19-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:5a2721c8720e2cb3c209925dfb9200199b4b07361c9e01d321719404b21458b3", size = 501121, upload-time = "2026-07-19T00:19:13.425Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/bbaeca815dc9191c424c94a4fdc5c87c75748a64a6271821212ebdd4e1a3/regex-2026.7.19-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:199535629f25caf89698039af3d1ad5fcae7f933e2112c73f1cdf49165c99518", size = 299415, upload-time = "2026-07-19T00:19:15.43Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d6/0dd1a321afaab95eb7ff44aa0f637301786f1dc71c6b797b9ed236ed8890/regex-2026.7.19-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9b60d7814174f059e5de4ab98271cc5ba9259cfea55273a81544dceea32dc8d9", size = 294483, upload-time = "2026-07-19T00:19:17.879Z" }, + { url = "https://files.pythonhosted.org/packages/92/5f/40bacf91d0904f812e13bbbab3864604c463eced8afdc54aeaa50492ea95/regex-2026.7.19-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbece16025afda5e3031af0c4059207e61dcf73ef13af844964f57f387d1c435", size = 811833, upload-time = "2026-07-19T00:19:20.102Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/4902744261f775aeede8b5627314b38482da29cf49a57b66a6fb753246c5/regex-2026.7.19-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d24ecb4f5e009ea0bd275ee37ad9953b32005e2e5e60f8bbae16da0dbbf0d3a0", size = 871270, upload-time = "2026-07-19T00:19:22.365Z" }, + { url = "https://files.pythonhosted.org/packages/16/70/6980c9be6bf21c0a60ed3e0aea39cf419ecf3b08d1d9947bc56e196ef186/regex-2026.7.19-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8cae6fd77a5b72dae505084b1a2ee0360139faf72fedbab667cd7cc65aae7a6a", size = 917534, upload-time = "2026-07-19T00:19:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/52/92/8b2bd872782ce8c42691e39acb38eb8efe014e5ddb78ad7d943d6f197ce9/regex-2026.7.19-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9724e6cb5e478cd7d8cabf027826178739cb18cf0e117d0e32814d479fa02276", size = 816135, upload-time = "2026-07-19T00:19:26.919Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/33a602f657bdc4041f17d79f92ab18261d255d91a06117a6e29df023e5e2/regex-2026.7.19-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:572fc57b0009c735ee56c175ea021b637a15551a312f56734277f923d6fd0f6c", size = 785492, upload-time = "2026-07-19T00:19:29.192Z" }, + { url = "https://files.pythonhosted.org/packages/9e/36/0987cf4cb271680064a70d24a475873775a151d0b7058698a006cb0cae4a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:20568e182eb82d39a6bf7cff3fd58566f14c75c6f74b2c8c96537eecf9010e3a", size = 800658, upload-time = "2026-07-19T00:19:31.392Z" }, + { url = "https://files.pythonhosted.org/packages/a8/24/c14f31c135e1ba55fa4f9a58ca98d0842512bf6188230763c31c8f449e3b/regex-2026.7.19-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:1d58561843f0ff7dc78b4c28b5e2dc388f3eff94ebc8a232a3adba961fc00009", size = 865073, upload-time = "2026-07-19T00:19:33.485Z" }, + { url = "https://files.pythonhosted.org/packages/14/85/181a12211f22469f24d2de1ebddfe397d2396e2c29013b9a58134a91069a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:61bb1bd45520aacd56dd80943bd34991fb5350afdd1f36f2282230fd5154a218", size = 773684, upload-time = "2026-07-19T00:19:35.599Z" }, + { url = "https://files.pythonhosted.org/packages/23/58/bd1a0c1a62251366f8d21f41b1ea3c76994962071b8b6ea42f72d505c0f0/regex-2026.7.19-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:cd3584591ea4429026cdb931b054342c2bcf189b44ff367f8d5c15bc092a2966", size = 857769, upload-time = "2026-07-19T00:19:37.738Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4f/f7e2dad6756b2fe1fe75dd90a628c3b45f249d39f948dd90cd2476325417/regex-2026.7.19-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cc26a66e212fa5d6c6170c3a40d99d888db3020c6fdab1523250d4341382e44", size = 804546, upload-time = "2026-07-19T00:19:40.229Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d7/01d31d5bdb09bc026fab77f59a371fdf8f9b292e4810546c56182ca70498/regex-2026.7.19-cp314-cp314t-win32.whl", hash = "sha256:2c4e61e2e1be56f63ec3cc618aa9e0de81ef6f43d177205451840022e24f5b78", size = 274526, upload-time = "2026-07-19T00:19:42.398Z" }, + { url = "https://files.pythonhosted.org/packages/52/0e/cea4ce73bc0a8247a0748228ae6669984c7e1f8134b6fa66e59c0572e0ea/regex-2026.7.19-cp314-cp314t-win_amd64.whl", hash = "sha256:c639ea314df70a7b2811e8020448c75af8c9445f5a60f8a4ced81c306a9380c2", size = 283763, upload-time = "2026-07-19T00:19:44.644Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b6/26e41975febae63b7a6e3e02f32cff6cff2e4f10d19c929082f56aebf7c6/regex-2026.7.19-cp314-cp314t-win_arm64.whl", hash = "sha256:9a15e785f244f3e07847b984ce8773fc3da10a9f3c131cc49a4c5b4d672b4547", size = 283451, upload-time = "2026-07-19T00:19:46.639Z" }, ] [[package]] @@ -4459,16 +4243,16 @@ wheels = [ [[package]] name = "responses" -version = "0.26.3" +version = "0.26.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, { name = "requests" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/47/f216a33221db8eff328987661cf18371afee89c62a62b434b963d6b509c9/responses-0.26.3.tar.gz", hash = "sha256:b0c11ca8131b8b227b8d5108e6ed39772222bd5aab030ed430e8f99057c4c409", size = 86335, upload-time = "2026-08-26T19:17:24.373Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/1a/4af3e6d659394b809838490b144e4ab8d7ed3b9fecc7ca78f5d2f79b1a3d/responses-0.26.2.tar.gz", hash = "sha256:9c9259b46a8349197edebf43cfa68a87e1a2802ef503ff8b2fecbabc0b45afd8", size = 84030, upload-time = "2026-07-03T16:44:50.325Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/86/ca7958de70cb0752350575e98229368a3a2f746a2942034b3364e17312bb/responses-0.26.3-py3-none-any.whl", hash = "sha256:74474f799334ac4f37d93b6437ecc3bb1bb5c77a8d31780a338643be2dce0af8", size = 36289, upload-time = "2026-08-26T19:17:23.176Z" }, + { url = "https://files.pythonhosted.org/packages/7c/28/693e1d9ebf72baa062ded80d837a035b86ce75eda5a269379e9e2b1008a8/responses-0.26.2-py3-none-any.whl", hash = "sha256:6fdfeabd58e5ec473b98dfe02e6d46d3173bd8dd573eff2ccccf1a05a5135364", size = 35609, upload-time = "2026-07-03T16:44:49.1Z" }, ] [[package]] @@ -4494,15 +4278,15 @@ wheels = [ [[package]] name = "rich" -version = "15.0.0" +version = "14.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/67/cae617f1351490c25a4b8ac3b8b63a4dda609295d8222bad12242dfdc629/rich-14.3.4.tar.gz", hash = "sha256:817e02727f2b25b40ef56f5aa2217f400c8489f79ca8f46ea2b70dd5e14558a9", size = 230524, upload-time = "2026-04-11T02:57:45.419Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, + { url = "https://files.pythonhosted.org/packages/b3/76/6d163cfac87b632216f71879e6b2cf17163f773ff59c00b5ff4900a80fa3/rich-14.3.4-py3-none-any.whl", hash = "sha256:07e7adb4690f68864777b1450859253bed81a99a31ac321ac1817b2313558952", size = 310480, upload-time = "2026-04-11T02:57:47.484Z" }, ] [[package]] @@ -4841,11 +4625,11 @@ wheels = [ [[package]] name = "slack-sdk" -version = "3.44.1" +version = "3.43.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6e/4e/371068dd7281139307e60cd18553b96b9c8c391a4c3040617192713a3cc4/slack_sdk-3.44.1.tar.gz", hash = "sha256:ca19505423789fa2a3189ff486f989f02e49289f008d0a5813df7255b3fb93ea", size = 256661, upload-time = "2026-09-03T14:21:13.879Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/75/a4964eb771a0c74d79ee7a3bee6fb5d9718909dd1b675e80d62a6a0ad90a/slack_sdk-3.43.0.tar.gz", hash = "sha256:0553152e46c4259eb69f7464cdadc35ba4802ca10f9f5a849c92cf03d6c2ba07", size = 252769, upload-time = "2026-06-30T18:04:41.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/fc/67352b742fc6fa520a550581b0284f5757e4e31a32327c2a00276747fd30/slack_sdk-3.44.1-py2.py3-none-any.whl", hash = "sha256:d6f20a0fbe3fecf9cac955c99d686301b48a645b7045472c3a0cdd186d7c42b2", size = 319865, upload-time = "2026-09-03T14:21:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/e4/55/42141b8338d46323d5b3c6095201b044c670c20f898643b322ea9b1543a1/slack_sdk-3.43.0-py2.py3-none-any.whl", hash = "sha256:4b6557c65577fc172f685af218b811f9f3b4909e24cddd839ada09565f10c585", size = 315866, upload-time = "2026-06-30T18:04:39.636Z" }, ] [[package]] @@ -4877,15 +4661,15 @@ wheels = [ [[package]] name = "sse-starlette" -version = "3.4.11" +version = "3.4.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "starlette" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/54/6767bb789b2f2fed6e0f953df949cd39dc263a384c1b65a95232598621d6/sse_starlette-3.4.11.tar.gz", hash = "sha256:1bae716c02f3e6f294be41ff333220692dae7c3cbab077c900f159676719dade", size = 34972, upload-time = "2026-09-05T12:11:04.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/00/b42a44342a054d58cb1115d7c8aa9cb4290dd9442f9c1b91a4b8173dba22/sse_starlette-3.4.8.tar.gz", hash = "sha256:ed89ffbb75cbf78a5fe2f2109cd584792ee7f9dfac96f791db546df8f15f3f9c", size = 32548, upload-time = "2026-08-05T11:19:49.982Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/6a/2ba3ed4a69babf3afdddf7d8314a48d87562c0a442206bbc2a1b50d5efc0/sse_starlette-3.4.11-py3-none-any.whl", hash = "sha256:c7b2244bdff016fe7f64e10075e89a3e6bbf899649cc89b0fe884b5545042453", size = 17122, upload-time = "2026-09-05T12:11:03.195Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3a/764912c58293d95b6dcdf4cc255f9d10de310580ced547b082eb9d72018c/sse_starlette-3.4.8-py3-none-any.whl", hash = "sha256:6e82314c786709a3cd9520f2285cf9fff90e181e598e8a357b0cf80f66afba0d", size = 16516, upload-time = "2026-08-05T11:19:48.748Z" }, ] [[package]] @@ -4903,7 +4687,7 @@ wheels = [ [[package]] name = "strands-agents" -version = "1.56.0" +version = "1.51.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boto3" }, @@ -4920,14 +4704,14 @@ dependencies = [ { name = "typing-extensions" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4c/2f/c980715e56a2017280ba597aea83e77ec37a94eeaaabc47114e354a6846e/strands_agents-1.56.0.tar.gz", hash = "sha256:d0a4587065f9b9f4890455ce947474067e5deaadf140d1b2ef5153a67ebf80a3", size = 1662954, upload-time = "2026-09-15T19:54:39.56Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/07/cb77bb1773d885e96dc0412920c620cdc660ef5113e9b61c3cd026240102/strands_agents-1.51.0.tar.gz", hash = "sha256:4cbd0b183aad0bb60ac7c6043d29841c8933937c97228e91669d2d97fc40776d", size = 1285092, upload-time = "2026-08-07T18:07:43.833Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/07/0d8955760ed673c3112af65d2a026e79bbcb3c869b3eadc896820b64edd7/strands_agents-1.56.0-py3-none-any.whl", hash = "sha256:8026a2fde7ca3d2f2760ea57003dd7163761bfba74972762468b745b4f7bfd08", size = 838144, upload-time = "2026-09-15T19:54:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/99/4c/937595709a56e966bc471d2fe14071910b2f57d1975a7fd701da18eedabe/strands_agents-1.51.0-py3-none-any.whl", hash = "sha256:1e0a8d125652d7a863cae8fd717b22e4fa5c7983b499438d1f0f50bf328e8832", size = 663778, upload-time = "2026-08-07T18:07:42.253Z" }, ] [[package]] name = "strands-agents-tools" -version = "0.8.9" +version = "0.8.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -4948,9 +4732,9 @@ dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/90/b129b3011eee02d6a00c7abbae8bd1072aab91f5c628c1e108bbdc98f6cd/strands_agents_tools-0.8.9.tar.gz", hash = "sha256:a9020d13c6ad24575ad9985e86ace0879c9e9279344399262c35cb9a7395528a", size = 543643, upload-time = "2026-09-15T22:36:27.679Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/fc/63031f0d5483a036eb732ae52624e6429ed1385d9c68515763c323da00fd/strands_agents_tools-0.8.6.tar.gz", hash = "sha256:3cdafd706909be6e8cab5411067cdc5af269bec29f1903788629e3f092d9e8aa", size = 533539, upload-time = "2026-08-07T18:09:03.432Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/38/fe6f646ac8c3665da7131586a33a7ad96a9347ca277a01025f755e3c1443/strands_agents_tools-0.8.9-py3-none-any.whl", hash = "sha256:858a8e17c6f807541524d10fa108b2bc7776c23666c7ecda966a327a752a9372", size = 343671, upload-time = "2026-09-15T22:36:25.811Z" }, + { url = "https://files.pythonhosted.org/packages/9e/32/36ff3b19528430d68f740bf61d6fe1f4afbf670f69a2ca204ae1f04139e2/strands_agents_tools-0.8.6-py3-none-any.whl", hash = "sha256:ed87ef1c405c635164e7e85e1cb0a1560bd30156b54b3c6cb11574e67d111d5c", size = 338989, upload-time = "2026-08-07T18:09:01.549Z" }, ] [[package]] @@ -5166,97 +4950,90 @@ wheels = [ [[package]] name = "tiktoken" -version = "0.14.0" +version = "0.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/62/167a842aa0429d45f5e797354fd4343a96f6043d67d0513c675c7b8d36e6/tiktoken-0.14.0.tar.gz", hash = "sha256:231dec90efcdccf1b565a1416107736f1e09b1a08fe736ef9d6363e626d03874", size = 38898, upload-time = "2026-08-17T19:49:49.514Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/82/d60a7a5d7bff7b4641d556ea68ea5914ea6edc3774a12eb1c0d444701382/tiktoken-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3b12e54f8bec91433e41aff65d8d1f209a4f678081163747079806e5361f6c91", size = 1095817, upload-time = "2026-08-17T19:48:31.788Z" }, - { url = "https://files.pythonhosted.org/packages/18/e2/d39ae33d3dc30a0c229ff0cb683df961ebb5e7b8691feb2d08b3ee6ac327/tiktoken-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:94f77b60a8ab23580db19ae822744c9716c1720020d2179ca5605112d12326f1", size = 1043064, upload-time = "2026-08-17T19:48:33.138Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e9/8e18cbee0c3ae8321c7e9696bef6090a24eed99a4a75a4c4a7f5115e5a2f/tiktoken-0.14.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:f3d6cf93fbe2e7117eb7bedca684216fbe328a41f0843ce34245451d8eb2df1c", size = 1190381, upload-time = "2026-08-17T19:48:34.386Z" }, - { url = "https://files.pythonhosted.org/packages/af/c8/051e7b72a816ff50eb34a1c7c5b185cd2429ffdf59a497baea35b2b6b2dd/tiktoken-0.14.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:18a1b651c4b032004bf7b4f1713391a54b2a341a52c6e8a2b59acae9d16e13c7", size = 1206869, upload-time = "2026-08-17T19:48:35.581Z" }, - { url = "https://files.pythonhosted.org/packages/c3/b3/7795db206adb6a57d6137fe48ef2cca6b9707e90b86ee8244671592ddc33/tiktoken-0.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4d8d91d68353bd167fdf26467e5ff9e56aaa5f87d6410c0238608629e4dc0d33", size = 1255197, upload-time = "2026-08-17T19:48:36.832Z" }, - { url = "https://files.pythonhosted.org/packages/c8/39/5234783af6b81af645ccdf9438f2f02af472f14e91d876ca2079af641841/tiktoken-0.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10f31e63e40313f2e518d87f7086cfa44e45f64cc14d8ae14103b41220c30a14", size = 1319329, upload-time = "2026-08-17T19:48:37.944Z" }, - { url = "https://files.pythonhosted.org/packages/88/cf/f2d955c8c5c6c67cc86ba6fb132c47c710465ebe6a6dcec1c3b6e250660e/tiktoken-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:c6cb9896a82b9ee44e15ba0b5c8044072f2e4d48acaa704c8d3feeef5ad9487c", size = 944146, upload-time = "2026-08-17T19:48:39.011Z" }, - { url = "https://files.pythonhosted.org/packages/8f/c5/9d848b7f408241171e1f843deb8bfa626086452bc9c78beee500829583e3/tiktoken-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c2edf09b381fafbc014ae8e018ed25087abb9a3dafa8465a0ea63c6558c47a79", size = 1094971, upload-time = "2026-08-17T19:48:40.347Z" }, - { url = "https://files.pythonhosted.org/packages/2d/a9/d94302340304328961d6f0c35ca4e60617fbb57a5cf667e2ed1692cb9e57/tiktoken-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd8ca1305c1c902fe42c486165f2e4808d9997625c98ffb05b9e0366d99d3948", size = 1042916, upload-time = "2026-08-17T19:48:41.541Z" }, - { url = "https://files.pythonhosted.org/packages/c8/b6/31da98ee871383509cae2ba96a9ddef1965e3c4f8cb6dc7bcda3379398db/tiktoken-0.14.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:1f83081065ee5833d35b49e9180f3d8d15622a603dd1c435da0da6cc12b3662f", size = 1188650, upload-time = "2026-08-17T19:48:42.729Z" }, - { url = "https://files.pythonhosted.org/packages/24/65/8c5dddd7cb67f6571d154a58d7c6e2f07da54bf84c49b6a1839965b7c35e/tiktoken-0.14.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7665f6624e052e5e7f6a36919ab69279decdc976d7b16b4fa15e1897d0513", size = 1206378, upload-time = "2026-08-17T19:48:44.013Z" }, - { url = "https://files.pythonhosted.org/packages/d1/04/522ec59d30dd9a2f3ab837011cd4fc5d1178dc4a2fa07c9fa4b90af6ba9d/tiktoken-0.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:144a3fc369f92b7d548995217c5d6e84038d3572157a0f6f34080d65291d0f78", size = 1253694, upload-time = "2026-08-17T19:48:45.597Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/9019e272bad188a1c61ecf44f25a9ba2368744644e3ac1f3d6516f3c9e80/tiktoken-0.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:151d37a150c8f3dfc5f4345597b10e101876bd1bd13494e0185af6b508758d2e", size = 1317873, upload-time = "2026-08-17T19:48:46.792Z" }, - { url = "https://files.pythonhosted.org/packages/24/7f/fff1217240343c0c11b5938b98aeae0e3a266cacfac25f86f91cdcd748f0/tiktoken-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:c77d4a3e1deb2707819df92046b89aad1ac81d27e07616b797cbff3f62c037da", size = 944395, upload-time = "2026-08-17T19:48:48.028Z" }, - { url = "https://files.pythonhosted.org/packages/8c/da/e273746b9d24a63c776bc60fba914351573ad9c575b52601eb5e60632564/tiktoken-0.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8e947aefe98ef74cce94923f90e48c98fe34eb1ec0a6bfdfadfc5a96359bfc36", size = 1094408, upload-time = "2026-08-17T19:48:49.269Z" }, - { url = "https://files.pythonhosted.org/packages/69/9f/fe6b1aca23331aa5271df5a4bd07bf68a7059254d47faee1b8272592a777/tiktoken-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cebe67765569df3dafac8474e4eccf5c19d24140492567a5e58a11445732a4", size = 1038499, upload-time = "2026-08-17T19:48:50.666Z" }, - { url = "https://files.pythonhosted.org/packages/0b/35/e9f47647c9e163bd1de30fe1a491669b7248cfc67b7404c35c009a701e1a/tiktoken-0.14.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:7db45b98e94adf4173a5cd7422b150999a7ee11ff847783a14f6e1b80cc38cb6", size = 1186355, upload-time = "2026-08-17T19:48:51.93Z" }, - { url = "https://files.pythonhosted.org/packages/51/11/9976ad86980a00cdef05e730a0127a2578a1bc6d11644d8d47246de2eb26/tiktoken-0.14.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7896eea257fe497a2b7134474d909156c6744ce8da35bce88011a960e008aa0d", size = 1204197, upload-time = "2026-08-17T19:48:53.18Z" }, - { url = "https://files.pythonhosted.org/packages/d4/9c/7035b0bcfaa68d1ee4803fc5be5214ad865669b05bd20e7105ae8a18afc6/tiktoken-0.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b950248272f1b303dc32986396e2dccfa10cf6d1e83ec8f0bba1776660305482", size = 1250635, upload-time = "2026-08-17T19:48:54.392Z" }, - { url = "https://files.pythonhosted.org/packages/bc/1d/69cabf18bed7f4366da076735816abce0d4db3fae491ae338a6612128777/tiktoken-0.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3de75343041a1c57333b1e707ac8a9769738241d7d6a55d39e12cf84548337c6", size = 1316085, upload-time = "2026-08-17T19:48:55.525Z" }, - { url = "https://files.pythonhosted.org/packages/bd/bd/a2e884fb1402cba5be08836590320012b2d8ada0e2eef9911a64df4bcd2d/tiktoken-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:087538c080e5ff421abd3a0785ed63c5111d06af98e6cd0d374dbe5969147ca3", size = 941208, upload-time = "2026-08-17T19:48:56.938Z" }, - { url = "https://files.pythonhosted.org/packages/50/53/ee1453623bf65f019328721ccb6587846d2c5b7b82f34e73ca09101f072e/tiktoken-0.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9c5fe393aab56469f04e432ff851216d3def3436cf5f07e442a240164bf500f", size = 1094198, upload-time = "2026-08-17T19:48:57.955Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5f/6448cfe278c3664ba9ec5b5ac08344341f7dc3d42888476e215a14eda2be/tiktoken-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbe2cc3bba939bcdaf103e03df9d5039d33887080b315624be28ec69059e5f94", size = 1038820, upload-time = "2026-08-17T19:48:59.015Z" }, - { url = "https://files.pythonhosted.org/packages/69/3b/d67eac1bcce9dee3abe23aff5e3ded3116bbebaf67b80a0811c06d3806fc/tiktoken-0.14.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2157f52e4b4d7ac5ecc7457b3716834706e7ef9a46f5144029bfeb7cf71f4e06", size = 1186175, upload-time = "2026-08-17T19:49:00.068Z" }, - { url = "https://files.pythonhosted.org/packages/37/62/cae690d9783146b0f81f564ada0f8f611de68178c0c9c7e1e969f0516b48/tiktoken-0.14.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:26e60f6a956ee171ab728b37b8439905d7ea1db435c30f9822f291e9861c861d", size = 1203884, upload-time = "2026-08-17T19:49:01.163Z" }, - { url = "https://files.pythonhosted.org/packages/b9/1e/633e30237b94e383cf814145499079f3bb9cdd4aeafc1bc42e01b0f810a6/tiktoken-0.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:380873f330b741c4435574f37edb20813d04603ace2d53e0a63560e1fec83010", size = 1250980, upload-time = "2026-08-17T19:49:02.274Z" }, - { url = "https://files.pythonhosted.org/packages/cb/56/4c12f07b812f84206f38d723eb1ebfdd34bad9309b5dbc0bee6bbcff4cbf/tiktoken-0.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3fd7c14b1cb45b486c39fc9b3443bb341f3e2fc7e6f31247f3435a5836651632", size = 1315434, upload-time = "2026-08-17T19:49:03.434Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e0/c65603f0c44811def666d3fbf611bf2af3b5e1ef613e06c19411419830b3/tiktoken-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:90a762670c7f968184723769a06ed51f5cf5ce5dcd1e30164f25c72d85c2d1f1", size = 940883, upload-time = "2026-08-17T19:49:04.583Z" }, - { url = "https://files.pythonhosted.org/packages/59/b0/1cf129f4af8fc513931f931023def596b7c4bfc77026513cd9d851da9e88/tiktoken-0.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e067f4cbcc5d036e8aff7fe7a6b530a8f4de2e4616ad9005a24a1879e24e6450", size = 1096273, upload-time = "2026-08-17T19:49:05.807Z" }, - { url = "https://files.pythonhosted.org/packages/62/85/2ae74575e321148484147e10b53c3b1717c59ebaa9edb4fe18b1f5c055f8/tiktoken-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f2af4a336ea56d6c14f27741a0e1d8294a35dd0b038bcf990d232ebb54eb994b", size = 1040269, upload-time = "2026-08-17T19:49:06.943Z" }, - { url = "https://files.pythonhosted.org/packages/89/29/92a1120a12e4bcf2d5464350d1a91b68a433d63ce656bb7f806c27aec09c/tiktoken-0.14.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:f702e0aeeb6506e57687e881c59e844ebe8f0a6a097ddafe20e3ab25f387be4e", size = 1186101, upload-time = "2026-08-17T19:49:08.102Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7d/144af98dc5ad68108451a82e2f5a17f80e2663f5115058b8dfd215c1ad02/tiktoken-0.14.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:e3442bbb2f0c588cec876061e37ae67b455b9df9978b003c8fe30e45f2ef5b42", size = 1204457, upload-time = "2026-08-17T19:49:09.28Z" }, - { url = "https://files.pythonhosted.org/packages/e6/1f/be7cb06ab2108f612f3e92e7b76cf391e192db0db37a984616f0cc32aafc/tiktoken-0.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:979c1524f753b662b0f3cd261b135afe6659cce33caaa7a5ea00dd1756b3055c", size = 1251716, upload-time = "2026-08-17T19:49:10.509Z" }, - { url = "https://files.pythonhosted.org/packages/ab/6b/81f158d0f90adb826cd704069c2129a046cb784a2a09861009519fc41cf4/tiktoken-0.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2cc19ac87b41c9493c9778ff5847f0c8bbcf5bd0ec6b87ce06c1c802adc8a771", size = 1315432, upload-time = "2026-08-17T19:49:11.844Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ec/f5fa35ec13f07279fdcaf3cc9c04bbb154ea591d23978651f2b672593e8a/tiktoken-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:eceeff0c62419bc78d4b6e70a4762a4d25df3ae8f2d5946e3853ce93e7a57098", size = 988046, upload-time = "2026-08-17T19:49:13.282Z" }, - { url = "https://files.pythonhosted.org/packages/68/c9/7756717408d3d0dfea3f046c9466144b28afde39ff69d5808f2475dcd7f5/tiktoken-0.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6eb94895c45f26bb8f5546e5fd8a069efcf6e3f108ea9d5cbe3bf6f7f3983438", size = 1096261, upload-time = "2026-08-17T19:49:14.351Z" }, - { url = "https://files.pythonhosted.org/packages/79/29/46ad8061f57bd9f8b2ea0aa82bf574e0f2aa040b0857a1582adba9957899/tiktoken-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:86951a971c53979ec857bd8c4a32dc227ab0fd33f6c12a3bd62d3fbf5f0bfcaa", size = 1040183, upload-time = "2026-08-17T19:49:15.707Z" }, - { url = "https://files.pythonhosted.org/packages/5a/7c/3184d17b868456f17b60b1a75f5ec0405618a43aa753336df341d8f11781/tiktoken-0.14.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:e2eca764c53490f8930dbce329e0769f11108d87d908282a80c5c130e26e7037", size = 1186719, upload-time = "2026-08-17T19:49:16.84Z" }, - { url = "https://files.pythonhosted.org/packages/0b/e8/46de4400d5bf859f640feee85bd7e32235f68ddf25db53c63be78e581e3a/tiktoken-0.14.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:26cc4b4840fa0e9f4b72ed489883e12f57e00d1021ca794720e3c29a12f0edef", size = 1204660, upload-time = "2026-08-17T19:49:17.987Z" }, - { url = "https://files.pythonhosted.org/packages/29/ce/af8964c38bc8226dd8950305b7a255fa33345d5572f78af7275a313d28e0/tiktoken-0.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2fc834fbe3f6a0736905c36ab709537e6840dbd63b982dc9e0216ae7d305ba1a", size = 1250932, upload-time = "2026-08-17T19:49:19.28Z" }, - { url = "https://files.pythonhosted.org/packages/1d/4b/323631116fc986d9cc5bbeb2b8223c7c85e61a8bb94ea5ab4951023b149b/tiktoken-0.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ca4db6ff5c5bf600f9b7761a0070ed44dfe5797a76bd432fb978bc480ef40c58", size = 1315190, upload-time = "2026-08-17T19:49:20.467Z" }, - { url = "https://files.pythonhosted.org/packages/18/8b/ba48a73729c9270989b36f37ab2ed5525e52690d715097c9fa791aaa5d05/tiktoken-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7aab286a020660a039097912a088236b985d18a3090d73f136c4413d29d37ca0", size = 987717, upload-time = "2026-08-17T19:49:21.704Z" }, - { url = "https://files.pythonhosted.org/packages/1d/10/b73b7e319179e0f60b32475f783b044f9cece872c53b6662664e9084b0d0/tiktoken-0.14.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:14b47e3674f2624803a8acc8fb367b7e24fc53055f9df3296482fe9a3a34a232", size = 1096280, upload-time = "2026-08-17T19:49:22.779Z" }, - { url = "https://files.pythonhosted.org/packages/c2/6b/09999a9bf1d559670d1680e8f8e419ac0e2c5f6aac82e9bfdf70f260b30a/tiktoken-0.14.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:19d643d701fdaa70e5b9c7f8f96abcaffe77ca5e482a3a1a7dde46feb4284695", size = 1040433, upload-time = "2026-08-17T19:49:23.998Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7b/8537be0836f3df99b2a636b44399bfa43cd757f2b8b4097dacb794cf24a7/tiktoken-0.14.0-cp315-cp315-manylinux_2_28_aarch64.whl", hash = "sha256:e4ddf863b59347deaa92302dcd90e5eb003cdc9be06ec2b692c38d1bdd9efd49", size = 1186989, upload-time = "2026-08-17T19:49:25.021Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9d/f9c56d7a943a4468abf9ef37661bb9b8e0cd3aa8aa87368c7146cc3f3222/tiktoken-0.14.0-cp315-cp315-manylinux_2_28_x86_64.whl", hash = "sha256:60c47ca69ddda0dea8256fffd12e1b86f4b59734a20e4a70c61f63cc5f021df4", size = 1204615, upload-time = "2026-08-17T19:49:26.37Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d2/98a38579db25c4a8a84e31dd95d9072ec5f21f7e70de591da0412e29b25b/tiktoken-0.14.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:728303a072163130c5b477b1f20d6211895569c1d5302c24ffc93a3009160871", size = 1251828, upload-time = "2026-08-17T19:49:27.423Z" }, - { url = "https://files.pythonhosted.org/packages/0c/83/467be424746c039c5493c0f4102feab16b9b48eb6f5c089b2a2438e3cde2/tiktoken-0.14.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3c5349c9f916283bba32bec8af69b763e4faa304dc004d0eaaea66a3cf004c1f", size = 1316260, upload-time = "2026-08-17T19:49:29.101Z" }, - { url = "https://files.pythonhosted.org/packages/02/ee/ddf46ca78e371f5890e96b6e7d089a85b3536432be219851eb0481786ca8/tiktoken-0.14.0-cp315-cp315-win_amd64.whl", hash = "sha256:1b6e4adcfd285c44502aed51df98aaaca4f0fea028165dbf8a9e857b9f98d8ea", size = 988230, upload-time = "2026-08-17T19:49:30.246Z" }, - { url = "https://files.pythonhosted.org/packages/2a/00/5162e90c851a28da18ed382d34898b79a8022548e5619a64e14c03ce7c3d/tiktoken-0.14.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:11d8211b290855d2721334ff17dd9b3a17bfb26872be01f25d73612ef7ece890", size = 1096186, upload-time = "2026-08-17T19:49:31.656Z" }, - { url = "https://files.pythonhosted.org/packages/65/97/a5a7bfccf25b1bb65e82bae8edff11ac3c9c041c374b7b4a823d60c38133/tiktoken-0.14.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:d0781223705199b289faa59601bb9c2441712d4c600dd13c43d8fd6a33d22cd5", size = 1039947, upload-time = "2026-08-17T19:49:32.848Z" }, - { url = "https://files.pythonhosted.org/packages/fb/ba/ef427fc638f1439181c5e12dd26b70e881861f89c007aa7e5b36300f8342/tiktoken-0.14.0-cp315-cp315t-manylinux_2_28_aarch64.whl", hash = "sha256:2ea70afba6b9eddbf22c165142e5f0a2ad7aa36a452873c48b57bb2aeb8492ae", size = 1186997, upload-time = "2026-08-17T19:49:34.121Z" }, - { url = "https://files.pythonhosted.org/packages/3e/88/2f3f85a968cdc514152129af0a060ebcccb067005a2f29b0d5ef3c838514/tiktoken-0.14.0-cp315-cp315t-manylinux_2_28_x86_64.whl", hash = "sha256:78571efc311c30b73f31eb949a921d6dac39a5d9dc42d1cfa8f8db157b3447b1", size = 1205211, upload-time = "2026-08-17T19:49:35.284Z" }, - { url = "https://files.pythonhosted.org/packages/4e/f6/80760e98a08e6649d2d68afb6035af713121dfb615acce8c4f73810ec438/tiktoken-0.14.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86f66c85e796f5d05d5c4a60ec1d40cbfebc47a32464053528c797163fa9ab89", size = 1251479, upload-time = "2026-08-17T19:49:36.419Z" }, - { url = "https://files.pythonhosted.org/packages/c5/84/50966fb6918a0fb9b32721277e5342bf729a2d74350074d662fbedf9772e/tiktoken-0.14.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:149d97453c4c98c04b081d64a85e635921269b532710d6faf81e9e82b790e7d3", size = 1316673, upload-time = "2026-08-17T19:49:37.756Z" }, - { url = "https://files.pythonhosted.org/packages/35/5e/9b01afd037bfa22a0033963fa091e0f75b6fb15cd85bffb42ff86e697323/tiktoken-0.14.0-cp315-cp315t-win_amd64.whl", hash = "sha256:561e7580f84a79859af1ef6f676968e9030fcc3fe195700b15235bca64f009c9", size = 987929, upload-time = "2026-08-17T19:49:38.947Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/e3/03c90dadcf5b3f82b83cee9adee60ef666b329c654f58c066af44eae0287/tiktoken-0.13.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:47b1df8d73390a24f94980c75158cdd5c56d256f16d55f30cb49c230caba9ba4", size = 1036627, upload-time = "2026-05-15T04:50:11.229Z" }, + { url = "https://files.pythonhosted.org/packages/5e/30/760463e5b2e8ad2bc229ae0a17ecb06727b6cbc094f08d8f65844315632e/tiktoken-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7d40c6c5aab171dcd6eb8455bc567bde404bb9def60cdb8c1299cc782b242bb9", size = 984699, upload-time = "2026-05-15T04:50:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/de/8a/8895f342a6b6aabd1a358e672f6f077b3ae51d0c63ca605d142db3bcd8ab/tiktoken-0.13.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:9b842981fa91accdffd48ff6408a977b7a91c3fbda55d353c3c68114d5c9d69e", size = 1118690, upload-time = "2026-05-15T04:50:14.234Z" }, + { url = "https://files.pythonhosted.org/packages/51/e0/92557768fb0801f0d9dd9243cb9b6d342900b05e4b1006d4771f49ce233e/tiktoken-0.13.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed5a30027cb4d8c7ca8b273d4766f3db3cf58fad9e9f3b1a68a351ffb54873d5", size = 1138423, upload-time = "2026-05-15T04:50:15.668Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b9/a3d99feeedb032ffd09cd6652077f86bdee9a70dd0b990b2b272b445d4c3/tiktoken-0.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7ab10f4a21c2999846940113f6dbd72e0fa06a24119feddd74cc47e85818e06d", size = 1185077, upload-time = "2026-05-15T04:50:17.19Z" }, + { url = "https://files.pythonhosted.org/packages/cc/93/bab868277d475dc6d2aaacd34cdd239c282f4908dcc8702e0a3311a8e032/tiktoken-0.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a2937ad042d49d50eac6e1ba07c5661d4bd3942a5b1e0c0d08475c4df83676e1", size = 1241702, upload-time = "2026-05-15T04:50:18.772Z" }, + { url = "https://files.pythonhosted.org/packages/c3/16/27e9f7e0ed76e501cfefc9fb2112df4c7bf70ca96945b15ecb7615aac860/tiktoken-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:44733b99bfd72b590cd0936b1c01b3b4dd73122db2d544bc1ceeb18a7678c910", size = 876565, upload-time = "2026-05-15T04:50:20.268Z" }, + { url = "https://files.pythonhosted.org/packages/1a/4c/1bc81f4cd53e827c4ee67ca951b5935724716049452d8dfa09b8b82372bb/tiktoken-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7bfe1849caa65d1e1d9871817170ec497bbb7984e182012e1bdce72f66608cdb", size = 1036353, upload-time = "2026-05-15T04:50:21.757Z" }, + { url = "https://files.pythonhosted.org/packages/75/91/10b9c7076bc02c246c853201fdbbe300a4b8c5ed7b84c25f7403f4e32655/tiktoken-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26", size = 984644, upload-time = "2026-05-15T04:50:23.256Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e4/fceae98015fab47fcd49b8bd7f46145bcd187a47e0add1e5378ed67ef980/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4", size = 1119261, upload-time = "2026-05-15T04:50:24.348Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/fe42ad00de01a8c4a49ad8649a2c8a316835a9cad5961b11d21eac0020a5/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173", size = 1138253, upload-time = "2026-05-15T04:50:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/ccee1ecccca107e9a16efcecdeeb964c325305038554d466ece65b42338f/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff", size = 1185747, upload-time = "2026-05-15T04:50:27.02Z" }, + { url = "https://files.pythonhosted.org/packages/9d/03/cd0cba295522b91eb55c6b2704f1df895f8226cfe60ab10d4d51d0cc9e69/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed", size = 1241265, upload-time = "2026-05-15T04:50:28.815Z" }, + { url = "https://files.pythonhosted.org/packages/7e/25/a10efd564402d82c2ff50d12057353ace447aa8007deceaa48641f63d35c/tiktoken-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc1c44cd37b43fc46bae593129164f4f281e82ea116b57a85aa81bda57eafc94", size = 876509, upload-time = "2026-05-15T04:50:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/85/8e/144bde4e01df66b34bb865557c7cd754ed08b036217ebd79c9db5e9048a9/tiktoken-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:32ac870a806cfb260a02d0cb70426aef02e038297f8ad50df5040bb5af360791", size = 1034888, upload-time = "2026-05-15T04:50:31.579Z" }, + { url = "https://files.pythonhosted.org/packages/36/18/d4ac9d20956cdebca04841316660ed584c2fecdc2b81722a28bc7ad3b1e4/tiktoken-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b", size = 982970, upload-time = "2026-05-15T04:50:32.961Z" }, + { url = "https://files.pythonhosted.org/packages/74/ed/6bb8d05b9f731f749fee5c6f5ca63e981143c826a5985877330507bd13b7/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7", size = 1115741, upload-time = "2026-05-15T04:50:34.475Z" }, + { url = "https://files.pythonhosted.org/packages/34/de/2ca96b07a82d972b74fe4b46de055b79c904e45c7eab699354a0bfa697dc/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649", size = 1136523, upload-time = "2026-05-15T04:50:35.782Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/9dafec002c2d4424378563cf4cf5c7fb93631d2a55013c8b87554ee4012c/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b", size = 1181954, upload-time = "2026-05-15T04:50:36.99Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d0/1f8578c45b2f24759b46f0b50d31878c63c73e6bf0f2227e10ec5c5408dc/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91", size = 1240069, upload-time = "2026-05-15T04:50:38.221Z" }, + { url = "https://files.pythonhosted.org/packages/aa/90/28d7f154888610aa9237e541986beb62b479df29d193a5a0617dbb1514d0/tiktoken-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f2d16e7a7c783ad81f36e457d046d1f1c8af70b22aec8a13238efe531977c41", size = 874748, upload-time = "2026-05-15T04:50:39.587Z" }, + { url = "https://files.pythonhosted.org/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228, upload-time = "2026-05-15T04:50:40.988Z" }, + { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978, upload-time = "2026-05-15T04:50:42.195Z" }, + { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355, upload-time = "2026-05-15T04:50:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772, upload-time = "2026-05-15T04:50:44.782Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415, upload-time = "2026-05-15T04:50:46.422Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879, upload-time = "2026-05-15T04:50:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829, upload-time = "2026-05-15T04:50:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600, upload-time = "2026-05-15T04:50:50.4Z" }, + { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516, upload-time = "2026-05-15T04:50:52.03Z" }, + { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518, upload-time = "2026-05-15T04:50:53.543Z" }, + { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867, upload-time = "2026-05-15T04:50:55.191Z" }, + { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826, upload-time = "2026-05-15T04:50:56.296Z" }, + { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, + { url = "https://files.pythonhosted.org/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820, upload-time = "2026-05-15T04:50:59.528Z" }, + { url = "https://files.pythonhosted.org/packages/8c/93/0dd6adca026a616c3a92974566b43381eea4b475ce1f36c062b8271a9ac5/tiktoken-0.13.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaaaef47c2406277181d2086484c317bf7fc433e2d5d03ff94f56b0dcec87471", size = 1034977, upload-time = "2026-05-15T04:51:00.957Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5ec6e6bc5b30bed6d93f7f2162d8f6b32437b3ba27cb527cfe004f6109c9/tiktoken-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ca8b310bd93b3772cb1b7922d915446864860f562bdfe4825c63a0aed3fb28cd", size = 983635, upload-time = "2026-05-15T04:51:02.629Z" }, + { url = "https://files.pythonhosted.org/packages/94/b0/c8ae9aff00d625c50659b4513e707a0462c4bf5d4d6cc1b802103225c02e/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:32e0c12305105002c047b3bb1070b0dd9a73b0cb3b2856a8972b810e7a4f5881", size = 1116036, upload-time = "2026-05-15T04:51:04.082Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ac/6a5dddd1d0a6018ecb389bd0353e6b4a515eb4d2286611bd0ace1937b9e1/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:5ba5fd62507a932d1241346179e3b39bc7bf7408f03c272652d93b3bedf5db24", size = 1135544, upload-time = "2026-05-15T04:51:05.229Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b8/585032b4384b2f7dcdaddcb52865c83a701a420d09e3c2b4a2be1c450c57/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d108bc2d470fc53c8ecd24f2c0fd2b5f98c33e87cdb6aa2e9b8c5dced703d273", size = 1182217, upload-time = "2026-05-15T04:51:06.517Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b6/993ff1ded3958215fd341a847b8e5ffeb5de473f435296870d314fc91ac4/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb99cb5127449f58d0a2d5f5ccfb390d8dbdfd919c221246caaee29d8725ed51", size = 1239404, upload-time = "2026-05-15T04:51:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3d/fef7e06e3b33e7538db0ced734cf9fe23b6832d2ac4990c119c377aec55e/tiktoken-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:115c4f26ffa11caac8b54eea35c2ad38c612c20a48d35dd15d70a02ac6f51f58", size = 918686, upload-time = "2026-05-15T04:51:08.925Z" }, + { url = "https://files.pythonhosted.org/packages/c1/82/a7fc44582bc32ab00de988a2299bf77c077f59068b233109e34b7d6ca7e6/tiktoken-0.13.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:472527e9132952f2fbf77cd290658bacf003d4d5a3fabc18e5fbd407cbae4d9b", size = 1034454, upload-time = "2026-05-15T04:51:10.035Z" }, + { url = "https://files.pythonhosted.org/packages/37/d0/24d8a890c14f432a05cea669c17bebeaa99f96a7c79523b590f564246411/tiktoken-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e2f67d27c9626cdd25fe33d9313c5cdb3d8d82da646b68d6eb8e7e9c20e6448", size = 982976, upload-time = "2026-05-15T04:51:11.23Z" }, + { url = "https://files.pythonhosted.org/packages/49/b7/2ab43f62788a9266187a9bfc1d3af99ad83e5eaa25fbef168a69cd5ad14f/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2b920b35805cd64585a37c3dc7ce65fba4d2d36016be01e1d7942482ca29093a", size = 1115526, upload-time = "2026-05-15T04:51:12.608Z" }, + { url = "https://files.pythonhosted.org/packages/64/39/1494321ed323ce7a14d88e3cd6cb9058625977df1c6961ddc492bd10a9f3/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:493af3aa28a4aaf2e3d2600a2ee717252c9bf5ab38fff94eb5a02db5ab77e5ad", size = 1136466, upload-time = "2026-05-15T04:51:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/96/d9/dfd086aa2d918c563a140720e0ce296cada1634efd2783d5cf51e05f984e/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6644c9c2b5cf3916f5a3641d7d12fdb3f006a7b3d9ff6acdaec44e29ab1ff91e", size = 1181863, upload-time = "2026-05-15T04:51:15.025Z" }, + { url = "https://files.pythonhosted.org/packages/2f/68/a18b4f307086954fdae32714cb4f85562e34f9d34ab206e61f1816aa6018/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cb65b60b9408563676d874a3a4ee573370066f0dc4e29d84e82e989c6517424", size = 1239218, upload-time = "2026-05-15T04:51:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/16/5b/f2aa703a4fc5d2dff73460a7d46cc2f3f44aa0f3dd8eeb20d2a0ecf68862/tiktoken-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:85b78cc3a2c3d48723ca751fa981f1fedccd54194ca0471b957364353a898b07", size = 918110, upload-time = "2026-05-15T04:51:17.237Z" }, ] [[package]] name = "tokenizers" -version = "0.23.2" +version = "0.23.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/1e/bc6587c5ab643b2e17776cace9070a2ae73549c86bffac9934a600bf3c31/tokenizers-0.23.2.tar.gz", hash = "sha256:7f0f085686b9de0d0079e6f874ae053600db64c5d13049e0bbc0119926d25aac", size = 385745, upload-time = "2026-09-03T08:55:42.89Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/60/21f715d9faba5f5407ff759472ade058ec4a507ad62bcea47cb847239a73/tokenizers-0.23.1.tar.gz", hash = "sha256:1feeeadf865a7915adc25445dea30e9933e593c31bb96c277cee36de227c8bfa", size = 365748, upload-time = "2026-04-27T14:43:25.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/ed/8a443528baa6fac8dfe8c3b75b038c63ac92bb539bcabe311e227c718173/tokenizers-0.23.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:85a9a357a3764aecc904ee76bdaf8cf1ad8e5a67a1b929a487c4a39b49ed0e90", size = 3148852, upload-time = "2026-09-03T08:55:30.874Z" }, - { url = "https://files.pythonhosted.org/packages/67/49/22da045a91732384d3a3771816bf188dc5a1f702c32e635afa7c679c0bef/tokenizers-0.23.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:986670e43691469dcee610ea0f846f91a8f84e91fc6f7a48d4c064414c0ec2bf", size = 3101593, upload-time = "2026-09-03T08:55:28.587Z" }, - { url = "https://files.pythonhosted.org/packages/2e/4d/8f569ed49372a3ed8e57099bd515055fd48d7c95912c4307cda6973c2168/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37039b5dfc4af84eb3ef0a92f4307e28936c8f9adccba2629d36f652e9bf7a2", size = 3516830, upload-time = "2026-09-03T08:55:14.741Z" }, - { url = "https://files.pythonhosted.org/packages/2a/de/e2f14c8919d5bf51874051d00d6c7b7e0e8bde6c6a2dbeddda7f642896ff/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b7e37ba198f24150f523e1242e83c4970de4a525480586be5dcc24d9add32c5", size = 3407975, upload-time = "2026-09-03T08:55:16.842Z" }, - { url = "https://files.pythonhosted.org/packages/c5/bd/93c69152d02ef06ce47aed8b2bf4952dcf733c935a62791873932b2934d9/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43e4f2071e3cc8d5d86421c874aebc82659bb51a68bcdef5a0da75ee89511ccb", size = 3748165, upload-time = "2026-09-03T08:55:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/2d/b7/56b84b80bc96942bba8eb23751a9e8a1fce4faaf4390425e7083f721c98c/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:325fee2e0418a9dc6c9ecf736a5f5f0db7875183ace9549ae339da76f7a1fbb7", size = 4024165, upload-time = "2026-09-03T08:55:18.806Z" }, - { url = "https://files.pythonhosted.org/packages/9b/8a/0175e216f005c2fe08238292663aa41e4c802b216e71047a69a0e9fc6fa3/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:950d7c9426fa72406a0ffeacdbc0bb9985f5db20eb8b263f29c79aaf83105703", size = 3591899, upload-time = "2026-09-03T08:55:22.752Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ca/ca6b93c7820df123b2662a9469e8facc826ccc94e98fdd0d615f6431e73a/tokenizers-0.23.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41c2f84d172449b4dadb9cdc508e3e364076613c35b16e76ecfe47a60d1e3305", size = 3386843, upload-time = "2026-09-03T08:55:26.584Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a4/4f9106d317b14a80aefea9f0e3a8d07ef25f856a7607eb7f5ab894281fcb/tokenizers-0.23.2-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:12f0835dc2ee694746a76adf7b1567d4346a4a502ebe93fb1f5f80ea49799b78", size = 3577314, upload-time = "2026-09-03T08:55:20.825Z" }, - { url = "https://files.pythonhosted.org/packages/8d/6a/1552b70fb0d9ab074fd3fc961435d01364e79c9058481822c3af6e8d402c/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb2f9c8a24da020ea8c11a01a19c1c2547912d92121ae4a01cfbca46125dee40", size = 9967367, upload-time = "2026-09-03T08:55:33.188Z" }, - { url = "https://files.pythonhosted.org/packages/06/01/3ccb3a956c7528b2507b8a9714155c4baf86af593039db6ea375dd0c96c3/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f486f402f6f9abee5bb032553736813af0c710a86b2e0ca592634c55cea1f835", size = 9811886, upload-time = "2026-09-03T08:55:35.642Z" }, - { url = "https://files.pythonhosted.org/packages/fa/73/7038e612d48bda1599457f712f6bd3854eae1a9dc9c13aa47f835349db48/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:bef235815a067b2648caf6dcc7a71091b0b0fff9ee8057f6451eb9335fae52ef", size = 10146224, upload-time = "2026-09-03T08:55:38.391Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d8/8e9e4e0b287a338d8f88976729628c9d22e8a54cfaf9777018a7f7cb58a0/tokenizers-0.23.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5c56bda1511921587789163e524d196ed8284174ac23abd7685d5ea8da6c4718", size = 10256304, upload-time = "2026-09-03T08:55:40.977Z" }, - { url = "https://files.pythonhosted.org/packages/f3/1f/c79a01f671a49728ebb0b61f7ff9ea45663b66cab40bc0858e9859b25c16/tokenizers-0.23.2-cp310-abi3-win32.whl", hash = "sha256:debf978920d93ba9c219bd67cc4bbfaf912c9039e41e7a28b91ec15e3728c95a", size = 2592809, upload-time = "2026-09-03T08:55:48.02Z" }, - { url = "https://files.pythonhosted.org/packages/db/f7/0a69ac6b82dbccf3f71add938a161c497952749294b8dd6dfe03a819dc40/tokenizers-0.23.2-cp310-abi3-win_amd64.whl", hash = "sha256:2e96f5699d5249c9c64aa8412e044f727aae3a4098cf830f9901ec1afc361cde", size = 2863236, upload-time = "2026-09-03T08:55:46.193Z" }, - { url = "https://files.pythonhosted.org/packages/d7/b0/dee84cb44175be1b4c35bd2f770727494e78f0bb38e571a623ade94dbebb/tokenizers-0.23.2-cp310-abi3-win_arm64.whl", hash = "sha256:e49c394456dd9985787fec76132438ba3fb8911f857b1bf3d40119f9292d41aa", size = 2729352, upload-time = "2026-09-03T08:55:44.345Z" }, + { url = "https://files.pythonhosted.org/packages/87/39/b87a87d5bb9470610b80a2d31df42fcffeaf35118b8b97952b2aff598cc7/tokenizers-0.23.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e03d6ffcbe0d56ee9c1ccd070e70a13fa750727c0277e138152acbc0252c2224", size = 3146732, upload-time = "2026-04-27T14:43:15.427Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6a/068ed9f6e444c9d7e9d55ce134181325700f3d7f30410721bdc8f848d727/tokenizers-0.23.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e0948bbb1ac1d7cdfc9fb6d62c596e3b7550036ad60ecd654a66ad273326324e", size = 3054954, upload-time = "2026-04-27T14:43:13.745Z" }, + { url = "https://files.pythonhosted.org/packages/6c/36/e006edf031154cba92b8416057d92c3abe3635e4c4b0aa0b5b9bb39dde70/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf13402aff9bc533c89cb849ec3b412dc3fbeacc9744840e423d7bf3f7dc0e3", size = 3374081, upload-time = "2026-04-27T14:43:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ef/7735d226f9c7f874a6bee5e3f27fb25ecabdf207d37b8cf45286d0795893/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f836ca703b89ae07919a309f9651f7a88fd5a33d5f718ba5ad0870ec0256bad6", size = 3247641, upload-time = "2026-04-27T14:43:03.856Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d9/24827036f6e21297bfffda0768e58eb6096a4f411e932964a01707857931/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae848657742035523fdf261773630cb819a26995fcd3d9ecae0c1daf6e5a4959", size = 3585624, upload-time = "2026-04-27T14:43:10.664Z" }, + { url = "https://files.pythonhosted.org/packages/0c/9a/22f3582b3a4f49358293a5206e25317621ee4526bfe9cdaa0f07a12e770e/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53b09e85775d5187941e7bab30e941b4134ab4a7dd8c68e783d231fb7ca27c51", size = 3844062, upload-time = "2026-04-27T14:43:05.643Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/b8f8814eef95800f20721384136d9a1d22241d50b2874357cb70542c392f/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea5a0ce170074329faaa8ea3f6400ecde604b6678192688533af80980daae71a", size = 3460098, upload-time = "2026-04-27T14:43:08.854Z" }, + { url = "https://files.pythonhosted.org/packages/0d/d5/1353e5f677ec27c2494fb6a6725e82d56c985f53e90ec511369e7e4f02c6/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b405006415ea148a992d093699c66eb01952bf59f4d5727089a98bda45a4", size = 3346235, upload-time = "2026-04-27T14:43:12.377Z" }, + { url = "https://files.pythonhosted.org/packages/71/89/39b6b8fc073fb6d413d0147aa333dc7eff7be65639ac9d19930a0b21bf33/tokenizers-0.23.1-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:56f3a77de629917652f876294dc9fe6bad4a0c43bc229dc72e59bb23a0f4729a", size = 3426398, upload-time = "2026-04-27T14:43:07.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/80/127c854da64827e5b79264ce524993a90dddcb320e5cd42412c5c02f9e8a/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d10a6d957ef01896dc274e890eee27d41bd0e74ef31e60616f0fc311345184e", size = 9823279, upload-time = "2026-04-27T14:43:17.222Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ba/44c2502feb1a058f096ddfb4e0996ef3225a01a388e1a9b094e91689fe93/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1974288a609c343774f1b897c8b482c791ab17b75ab5c8c2b1737565c1d82288", size = 9644986, upload-time = "2026-04-27T14:43:19.45Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c1/464019a9fb059870bfe4eebb4ba12208f3042035e258bf5e782906bd3847/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:120468fb4c24faf0543c835a4fabafa4deb3f20a035c9b6e83d0b553a97615d4", size = 9976181, upload-time = "2026-04-27T14:43:21.463Z" }, + { url = "https://files.pythonhosted.org/packages/79/94/3ac1432bda31626071e9b6a12709b97ae05131c804b94c8f3ac622c5da32/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e3d8f40ea6268047de7046906326abed5134f27d4e8447b23763afe5808c8a96", size = 10113853, upload-time = "2026-04-27T14:43:23.617Z" }, + { url = "https://files.pythonhosted.org/packages/6a/dd/631b21433c771b1382535326f0eca80b9c9cee2e64961dd993bc9ac4669e/tokenizers-0.23.1-cp310-abi3-win32.whl", hash = "sha256:93120a930b919416da7cd10a2f606ac9919cc69cacae7980fa2140e277660948", size = 2536263, upload-time = "2026-04-27T14:43:29.888Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/2553f72aaf65a2797d4229e37fa7fbe38ffbf3e32912d31bdd78b3323e59/tokenizers-0.23.1-cp310-abi3-win_amd64.whl", hash = "sha256:e7bfaf995c1bdbbd21d13539decb6650967013759318627d85daeb7881af16b7", size = 2798223, upload-time = "2026-04-27T14:43:28.51Z" }, + { url = "https://files.pythonhosted.org/packages/cd/2b/2be299bab55fc595e3d38567edb1a87f86e594842968fa9515a07bdcf422/tokenizers-0.23.1-cp310-abi3-win_arm64.whl", hash = "sha256:a26197957d8e4425dfba746315f3c425ea00cfa8367c5fbc4ec73447893dcea9", size = 2664127, upload-time = "2026-04-27T14:43:26.949Z" }, ] [[package]] @@ -5324,23 +5101,14 @@ wheels = [ [[package]] name = "tqdm" -version = "4.70.1" +version = "4.70.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/ea/b2a5bd54b28a324dae8211928b2d730b6547500342c7e6c6dea08bd0a485/tqdm-4.70.1.tar.gz", hash = "sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4", size = 171846, upload-time = "2026-09-11T07:25:16.601Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl", hash = "sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73", size = 80199, upload-time = "2026-09-11T07:25:14.599Z" }, -] - -[[package]] -name = "truststore" -version = "0.10.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/3b/6c24bec5be5e743ffd99576daa5cc077722fc7d5bbc00bd133fa0c698dc6/tqdm-4.70.0.tar.gz", hash = "sha256:55b0b0dbd97462d06ebee91e4dac24ed4d4702be82b24f07e6c1d27e08cea220", size = 795438, upload-time = "2026-07-27T11:33:15.271Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl", hash = "sha256:7f585706bfddbdebf89daac705b2dfcc16890130727d3197ca62c732b4310953", size = 80184, upload-time = "2026-07-27T11:33:13.167Z" }, ] [[package]] @@ -5403,15 +5171,15 @@ s3 = [ [[package]] name = "types-aiobotocore" -version = "3.9.1" +version = "3.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore-stubs" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/8d/d9654bb658aedc849eca2f761669d4a53faa56a75464663f5d7e5be58c27/types_aiobotocore-3.9.1.tar.gz", hash = "sha256:d86497c3d821ca3e5b0c4705ad85066672c57c64b715333500979f4565844d4e", size = 89449, upload-time = "2026-09-09T03:35:15.643Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/a8/a4ad647d7b3473bdc1892a0f7e6872affaf509d18f915f07c51f72b055c7/types_aiobotocore-3.9.0.tar.gz", hash = "sha256:00fc52e98c9d65fe6716f246e6e03ce18f0b6727aa580ab5b274fde6844b6142", size = 88503, upload-time = "2026-08-02T03:05:26.377Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/a4/426846af7d5ddb7254942d4144a8d2a497aa1a7d20a579307e2431cb42e6/types_aiobotocore-3.9.1-py3-none-any.whl", hash = "sha256:768ca08c54e4c1657a62a8229aa465263a73c2290b5339cf2a2314b0a61d392c", size = 55271, upload-time = "2026-09-09T03:35:11.703Z" }, + { url = "https://files.pythonhosted.org/packages/25/0e/d8af0ba644968d6183e04e9ab9c3e1c6b5b10f25f5389ec825abf65c11c7/types_aiobotocore-3.9.0-py3-none-any.whl", hash = "sha256:614862ac387098964805325751f8ab3b74d52e3e6ec7f37b7585fd971fabe476", size = 54999, upload-time = "2026-08-02T03:05:22.581Z" }, ] [[package]] @@ -5428,11 +5196,11 @@ wheels = [ [[package]] name = "types-protobuf" -version = "7.35.1.20260906" +version = "7.34.1.20260518" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/6c/e3e5b3e10bc328126a39637c138f9ebfd734bf14342b9f3540039b4ab995/types_protobuf-7.35.1.20260906.tar.gz", hash = "sha256:efd1a3862d4c967dad5512ef8d56b1530ac84f182c41735b94004756518c4998", size = 69895, upload-time = "2026-09-06T06:35:28.308Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/59/e2b13b499d15e6720150c4b1a8d91e31fcacf716b432397475b3151ff7e4/types_protobuf-7.34.1.20260518.tar.gz", hash = "sha256:28cfaded25889cb83ebfb63cfb0a43628f0b6f3785767bec17287dc6468795f2", size = 68936, upload-time = "2026-05-18T06:01:47.332Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/4e/f63e826c68f77ef875506d72f225918800346545ee99847bc28f3394f18d/types_protobuf-7.35.1.20260906-py3-none-any.whl", hash = "sha256:5155e48569e0dabff303fdf578db96cd31ea9a4a63b18018a4ceac6b0ae17462", size = 86419, upload-time = "2026-09-06T06:35:27.247Z" }, + { url = "https://files.pythonhosted.org/packages/2a/1f/ec5caf72c2e3b688ca3927e0979a04ddad19e1afc4bf1c199bd743e0f419/types_protobuf-7.34.1.20260518-py3-none-any.whl", hash = "sha256:a0a5337413347166439c0e07cbc26c6164d091401c6f01b1dfd8cdb966c4dd8f", size = 85992, upload-time = "2026-05-18T06:01:45.696Z" }, ] [[package]] @@ -5455,23 +5223,23 @@ wheels = [ [[package]] name = "typing-inspection" -version = "0.4.4" +version = "0.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/bc/4eae18cd40c65798a16267572ba346c11f599d44b01603dbd843342042bc/typing_inspection-0.4.3.tar.gz", hash = "sha256:c5f9ec1530b5c1e2c9bc34a84d9a3466ed1b2f3f2fa9f901368d9c5596210e4d", size = 76711, upload-time = "2026-08-10T09:39:18.063Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" }, + { url = "https://files.pythonhosted.org/packages/42/f7/7a3935abdebd5cf18705a5f0335dd6a3a18bef3baa7cb9edc3b6b9922cc8/typing_inspection-0.4.3-py3-none-any.whl", hash = "sha256:5f42b23858a91e0b4ef521f5418f03a0da3c9216fd2995ef5e73463100e676cd", size = 14693, upload-time = "2026-08-10T09:39:16.693Z" }, ] [[package]] name = "tzdata" -version = "2026.4" +version = "2026.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/31/3d74fa778a63b98b7374323befcc0be5ab3bd94afd4096a0124e7379152c/tzdata-2026.4.tar.gz", hash = "sha256:f1b8bd365d8d210c55353f4d7f8d6d8561c0ba50d704b700d195a9424bba0d79", size = 199350, upload-time = "2026-09-12T12:56:03.251Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/bc/8737e8d54cf51106118039b83f485a4783112fab49ea9d044b234978a46e/tzdata-2026.4-py2.py3-none-any.whl", hash = "sha256:c2169a8b0a7a5e9674da5a135ccdfb2b3e671b333ed9fed17b41f73c34476e81", size = 347494, upload-time = "2026-09-12T12:56:01.67Z" }, + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, ] [[package]] @@ -5488,126 +5256,126 @@ wheels = [ [[package]] name = "urllib3" -version = "2.8.0" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz", hash = "sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63", size = 458972, upload-time = "2026-09-15T19:29:36.253Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl", hash = "sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", size = 135717, upload-time = "2026-09-15T19:29:34.577Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] name = "uuid-utils" -version = "0.17.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/80/cf6934a2030a5f6763f604314c1105f851d90aa1fe344c2692c3b88a9d95/uuid_utils-0.17.1.tar.gz", hash = "sha256:10c51d54ecdf0617640e505eae6d2e6443d8e414d4f9d6e8d43949a450c56e6b", size = 43323, upload-time = "2026-09-08T11:29:35.42Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/af/bfe6e67693597361a65daaa37029c489b24e3302c2f7a676e8e5b0eb20ac/uuid_utils-0.17.1-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:53abc29fcfa4cdbf53988409f297fce76a8de6ad292115f5e48ff5e9e3606d79", size = 563706, upload-time = "2026-09-08T11:27:33.172Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8d/a367d0eefe3730763ba22bf4b966a94106328cfd01980844c7fb8a6a7082/uuid_utils-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ee8dbeb24fa796f091658d5692c0e00f0d524db25e1f7a816933e80b6cd3883c", size = 287312, upload-time = "2026-09-08T11:27:34.794Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f7/f085bedf0601e7a3aca57748059f96ae118c41a4615cfc0142f291bde481/uuid_utils-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b3cccf71cbe4c1fe29eb007005cde2f86fda2549a5f412e27ee8579a264d27", size = 325354, upload-time = "2026-09-08T11:27:36.21Z" }, - { url = "https://files.pythonhosted.org/packages/f0/cd/a8c8c93aa533173a2078496b58ade7233fcca124fb77c68fd9053fe59f76/uuid_utils-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3aae364b97bed00db4549784ab5ba769a7b88d0ceea87adb833501624fe16ed", size = 332982, upload-time = "2026-09-08T11:27:37.467Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c6/e6eb694ffa73d627ec7c4c750f2e83506c6671898c2cbc5a3592f4366f7d/uuid_utils-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5141fc9cfc98d3802d6f1c2451e6822bf1d474c9beba7cba0a6fee7643dee46f", size = 449247, upload-time = "2026-09-08T11:27:38.833Z" }, - { url = "https://files.pythonhosted.org/packages/76/6b/516183ba5f7d35521edf8cfaea9b1192da8b262587faa8106d1f73ab0eb1/uuid_utils-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66f695b0950a630ce5f287d6d17acd1523e0e071863596bed73a7d11b8334a28", size = 327796, upload-time = "2026-09-08T11:27:40.061Z" }, - { url = "https://files.pythonhosted.org/packages/61/cf/656e7426b31c9cdf9205797a80f3d0458da061df91f083e4490504e0428a/uuid_utils-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7db3135ee5c1e9bbfd4d11cb2e3f2b4c26c37cb1f7b7d52407dbe94dddaec7e", size = 351941, upload-time = "2026-09-08T11:27:41.31Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a2/ab5082c9d0b1d2b8b32ac2556cb7b1d5c73d316fe59934bf2b3545134844/uuid_utils-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b6e71cff84184aa6071fdcc45e288e0f45d663a4cf5608fb9091b68c34bfd959", size = 503475, upload-time = "2026-09-08T11:27:42.609Z" }, - { url = "https://files.pythonhosted.org/packages/66/b7/3d011f832aad5fc2eaf6999f88a4fedbb0eee0fca6b94223e95b7c986a01/uuid_utils-0.17.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:548b33dddedefe5cd02e4ac421b7b3b3ad5411bdbd7f5b5f792d9e7ba288d894", size = 608768, upload-time = "2026-09-08T11:27:44.157Z" }, - { url = "https://files.pythonhosted.org/packages/0f/16/a89f6b38daef94ee8a1261f7941d7d9d2f70f2eb2b2157445c0e70a81302/uuid_utils-0.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dfd27f383ecf1559cc55b6ec39c850744abee56c0549b15149e20a8aa6b881f3", size = 568410, upload-time = "2026-09-08T11:27:45.546Z" }, - { url = "https://files.pythonhosted.org/packages/c4/32/a7d045221b08858fbdc66321f482b68017f421abdf085b82282bd3019d29/uuid_utils-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4edcb1c9e52805a7619d68f8f673544a3df09425e2426bcdc30d17a2bb152e0", size = 533150, upload-time = "2026-09-08T11:27:46.843Z" }, - { url = "https://files.pythonhosted.org/packages/d2/c6/79d7c1ed7a872a1047df30650a8194865273e2f5b757c0e84f683ea640e5/uuid_utils-0.17.1-cp310-cp310-win32.whl", hash = "sha256:5e1b7aec35ee0dbb3875a3f151866f3362ef30ae5e7f95a42adf8779d305bb47", size = 172247, upload-time = "2026-09-08T11:27:48.173Z" }, - { url = "https://files.pythonhosted.org/packages/f2/24/d8b81080e0f21e29fe75545ea318985acb3e079c0aabedceded7424ae6c2/uuid_utils-0.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:f2e91fef913d654f643ba7e4f92347002aff0debeb84cccaf474912756b43a9c", size = 179050, upload-time = "2026-09-08T11:27:49.459Z" }, - { url = "https://files.pythonhosted.org/packages/f8/74/61cc613cf7c94131b2d1d596c4f2c0ec22c804b2852cc740288a1519743f/uuid_utils-0.17.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e698d0ffccf167ece87c864667ab69724685af9e171fc51e57038c9711fd4e0a", size = 562905, upload-time = "2026-09-08T11:27:50.715Z" }, - { url = "https://files.pythonhosted.org/packages/eb/4a/88413c15de714a76e342321d65ff82937a2bdcc35e2987c9462433025101/uuid_utils-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d9aa5fccd372580d455ab769a60326c789c46027d3d58ff2a895dbc492200b0d", size = 286703, upload-time = "2026-09-08T11:27:52.108Z" }, - { url = "https://files.pythonhosted.org/packages/23/4f/9cfd9f64ceab2b6aeff77cd238b0033baa6364832cc9715d13a8cd49e5ff/uuid_utils-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0cb9661bc0883e9278bc2436514298ace83121d14296cc672b2c44d37441cd0", size = 325258, upload-time = "2026-09-08T11:27:53.315Z" }, - { url = "https://files.pythonhosted.org/packages/42/eb/7057247670b903194c2739f98a0f4455f0d4e8cfa13466dde2d1fdba7216/uuid_utils-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f63557d6e9fe10cb25c1d3e73dbf7cd18c1b1620349b6be6b51ea25fcadf3a1e", size = 333013, upload-time = "2026-09-08T11:27:54.535Z" }, - { url = "https://files.pythonhosted.org/packages/6b/6d/8e26ef16da28274d3ddfe0812a7155dc8d48d0891abd84f2b1a3f905a54a/uuid_utils-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b94f1185f64d1fd2fa99ffc0b8264ee5980a862010daf1edf430412044f2aa53", size = 450348, upload-time = "2026-09-08T11:27:55.777Z" }, - { url = "https://files.pythonhosted.org/packages/e6/8d/70d8f78830ca23f40d15f95795a863e7c052f5c1dff2e4a23f51c53dfbdc/uuid_utils-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3404d50a60ec74642fd590b9d639d98770022f4b1ff8a4055b3c70742c85f096", size = 327961, upload-time = "2026-09-08T11:27:57.098Z" }, - { url = "https://files.pythonhosted.org/packages/af/f2/62ab19bc908ef6cdb2a07966a408cf8bc2cf981cd7c3c99dc34f443b5ced/uuid_utils-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:601d03cce6b8ec3734025c7dca9ab276df1ab649ca7b13d76ea03824724f5108", size = 352645, upload-time = "2026-09-08T11:27:58.262Z" }, - { url = "https://files.pythonhosted.org/packages/7f/86/f8e62e055f14b45b6faa784008a038407f9274d36acc41d39b4b8b0f00a1/uuid_utils-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1a9e8c876a5d6247572e7f8eace39b4de9a91cd1b026e24552ec631c08c91394", size = 503128, upload-time = "2026-09-08T11:27:59.678Z" }, - { url = "https://files.pythonhosted.org/packages/04/57/4bc764249cc0d40568fb3a82a72b41cedf958a169710415148e365f45e1f/uuid_utils-0.17.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:304497d360e9ca5b019254bb25a2ee886b66de884aa08a949c8812fe5bf5327f", size = 608575, upload-time = "2026-09-08T11:28:01.01Z" }, - { url = "https://files.pythonhosted.org/packages/f7/90/947976eeaf48aa6109100af1796931b8c684caf680d0fb4d2498e951c059/uuid_utils-0.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7f3deaca1ba34f48da053884c1255c360fb123c4a9bc3815c05a7a8093e0bda5", size = 569118, upload-time = "2026-09-08T11:28:02.321Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fc/18154e589f0c84f85b99aee9406fdf904468190a4f4fe462d86bd85ab960/uuid_utils-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e22cf24db33a123c8e47a86fe766c770c83dedc6d1196c1172cbba0a0959cac0", size = 533401, upload-time = "2026-09-08T11:28:03.631Z" }, - { url = "https://files.pythonhosted.org/packages/7f/73/ef0bb542317ac03fc4e0e7e2804e316d84fee115c6a3ed41a6efa954b59b/uuid_utils-0.17.1-cp311-cp311-win32.whl", hash = "sha256:738b8fc2062c3dc17f1624af4aa8763bec4172cf295b13ffa3dfad3ddbdb4e0e", size = 172366, upload-time = "2026-09-08T11:28:04.977Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1f/c76187e05e0fdbb3f9fef7436f86326d0f0aa25b42192cddc011997b31a7/uuid_utils-0.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:297c6be22e0dd0f7d372845b171ffee5657581759982413c0a5b01b900c5f592", size = 178735, upload-time = "2026-09-08T11:28:06.215Z" }, - { url = "https://files.pythonhosted.org/packages/92/05/3d846d5423571574a1e6f4bbe16f57f755671d0f334931f893e8a734bbaa/uuid_utils-0.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:1c8124c9b91fa8353d79e4e7bd44ed0f2ae683990c01818199668f7579e236ab", size = 176492, upload-time = "2026-09-08T11:28:07.368Z" }, - { url = "https://files.pythonhosted.org/packages/97/82/a509ef8b3c24b48099a4fba00f9e1b3f38417e0a7bda39cefd4b1e841388/uuid_utils-0.17.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7558c84414785d6ea54a186a3c68267eb8f33e2a0d792698bd9fa50d62150f77", size = 557142, upload-time = "2026-09-08T11:28:08.586Z" }, - { url = "https://files.pythonhosted.org/packages/27/60/d48897c1bb6562c4b68a90c998f89d4eb8996d01193c930b3f6f04258619/uuid_utils-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4f04ba62482858a975d1d38cbb5ade181faae59e8ddc1499eacc9b6b6def3115", size = 287053, upload-time = "2026-09-08T11:28:10.12Z" }, - { url = "https://files.pythonhosted.org/packages/c0/9d/6506e6c4ca08300ad7415c3b76e29bd36b491dec818ea58d9e8bf88031d3/uuid_utils-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66ce3e84067261b2721dde6539427f4eb9286289769332ff07c859a661f87694", size = 320760, upload-time = "2026-09-08T11:28:11.3Z" }, - { url = "https://files.pythonhosted.org/packages/2c/dd/013786821eca0808282b82bb1e66a18a6b70061e1ce2f77fc9be06b88a36/uuid_utils-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cdcb565ac4d8a005833e7c389867977e19670f1bee6ee9f8811872b86225274", size = 329130, upload-time = "2026-09-08T11:28:12.522Z" }, - { url = "https://files.pythonhosted.org/packages/60/45/ba376e0a69eb4a0bb2dfba1ad2bafc2e6729971d480701cc778719a4205d/uuid_utils-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a93b046552730b843e9d8784691cf8b0b3d5430dd9d053ade33383ccb2574ff", size = 444047, upload-time = "2026-09-08T11:28:13.938Z" }, - { url = "https://files.pythonhosted.org/packages/02/1e/2abb7d9e3062a7889142818e2a2ae758a54a1c3b6cf8a86877e051b3d1dc/uuid_utils-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45f93f362d39f63ba14bbd9e4e1dd89fbed4de9bbef6bb428a379bd86571da2", size = 323927, upload-time = "2026-09-08T11:28:15.235Z" }, - { url = "https://files.pythonhosted.org/packages/20/00/c6753d6f2dbcd9d78436e291534b5d81f42c1b50c4d3224ddf231095fde2/uuid_utils-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d847fb9b46b5c208f3b8d5ca6082a4ac819ec2ffe36de3548c489e8fa551bd", size = 345877, upload-time = "2026-09-08T11:28:16.62Z" }, - { url = "https://files.pythonhosted.org/packages/c2/78/6f65d3105a0588b38cdcf338397bcb63c2d88d3581698a316def47e4445e/uuid_utils-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71f7ec7a1b54c1f84d6f8fd4e1110a66b3d1b936dbb17cda2927442621fc1e3d", size = 499635, upload-time = "2026-09-08T11:28:17.912Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5b/ff56d55fde9991c332e6df2ac1c560be6dd7e2302ab51180a185cfad830d/uuid_utils-0.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a140db8866a45b1ce40d91164ff48d2722ffc3b2a39bfdb412bd770c7ea88be3", size = 605502, upload-time = "2026-09-08T11:28:19.198Z" }, - { url = "https://files.pythonhosted.org/packages/09/16/d34f26cd4dad48671c7441fcf370076911dd9e7edcb3e5264e11da7fce7d/uuid_utils-0.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7b296b67bf880085daa11ee496d385b941a3bf3e3d5691db7178d21f18f56f9b", size = 563186, upload-time = "2026-09-08T11:28:20.684Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ef/b9bd9b412865c08e6769044cdda6e0a3db4827c88a4a2612e42e68714ca2/uuid_utils-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61378863a5e9410fa6e816364442b9d35cccf94fa83e3f67997d0ff57d901d0e", size = 528667, upload-time = "2026-09-08T11:28:21.984Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b6/981a84e9d0653e2d5fc205ba2b895d80c8e3bdb7138995f4c04b7cce8bd8/uuid_utils-0.17.1-cp312-cp312-win32.whl", hash = "sha256:a550b3963960012ff3266bdb3079abf4cc3f6363201e63a649d5d3cd44fe52cd", size = 169155, upload-time = "2026-09-08T11:28:23.427Z" }, - { url = "https://files.pythonhosted.org/packages/fb/49/85a39cef2de6948364d25f5e1452119e6a70ddb5a910eeac717f02c5eabf/uuid_utils-0.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:3d6ccaebaa3b2ff2e59d11d70c64e97ba572120162a00c25d6f8e5e0c1004b9a", size = 175220, upload-time = "2026-09-08T11:28:24.582Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f6/8c1c11bbf7cfa901c7c9621bcdcbb4bf432c5f20dce27e76a3ea29f0307a/uuid_utils-0.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:3ca89347a01ddac94727578369feacc0969d9fc033b2c17ff7919121ee441e2f", size = 172646, upload-time = "2026-09-08T11:28:25.723Z" }, - { url = "https://files.pythonhosted.org/packages/03/0d/4c2263a05e95dc11a5c9fad78ab9ac5f76a1f5aaabb545a39c6d34d2a07b/uuid_utils-0.17.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd8043ac6d81b3f3f0dff22247866292c819e0d5e54a5a3ad2223f86f88dbd97", size = 556923, upload-time = "2026-09-08T11:28:26.974Z" }, - { url = "https://files.pythonhosted.org/packages/9e/70/9f619e86af674b8055adb29e6ad95f1d2bdec02b9d7b654d01fb479ea9ac/uuid_utils-0.17.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:586a93993769873c389d38bd9a70c51e228e734e8f78742d959610509635b86b", size = 286572, upload-time = "2026-09-08T11:28:28.265Z" }, - { url = "https://files.pythonhosted.org/packages/1e/d2/bf4c39c283a75a8893d060344b690d5ff13ddd7e65849a74a264bec9a4ee/uuid_utils-0.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55e2cec52e2c78d94277d4c990badd3ce97f5746d05029e63d81fb2433bc9684", size = 321366, upload-time = "2026-09-08T11:28:29.464Z" }, - { url = "https://files.pythonhosted.org/packages/d3/a3/4790fd4d6322aeb935e2222d193407902b2651dbb5eae7817f2f8eb2043e/uuid_utils-0.17.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0721f05b4f10cc7d49d91be65524a3bc6e6a5d88be054cdca05dff487a022091", size = 329210, upload-time = "2026-09-08T11:28:30.738Z" }, - { url = "https://files.pythonhosted.org/packages/66/f9/442d13050fb55c2e4cc81369df349d60f2da8dde84ffb7e330385c576bc3/uuid_utils-0.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de996e58b77d3e6eeee1a209ce93f424a5f021aa8b2879df6d35eda601acc831", size = 441731, upload-time = "2026-09-08T11:28:31.966Z" }, - { url = "https://files.pythonhosted.org/packages/63/96/deded55ce54c5e6a2b7dbb790ab9bf7b5be8c7e8cb22e2355108bd8723cd/uuid_utils-0.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d9209d6fed20226af0d29b95c5e253a1907b61f1a00153187ac5412f1df9b6", size = 323874, upload-time = "2026-09-08T11:28:33.249Z" }, - { url = "https://files.pythonhosted.org/packages/0f/f8/4b9d64b57bf35e3e99a8e578ed1cbdcdf926816f36bf5e5b53d7ea4c65bb/uuid_utils-0.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4f6b05598d0d29e8851b7668786b7cf105c98887c7ca36dac94c61321d16cb1", size = 346026, upload-time = "2026-09-08T11:28:34.516Z" }, - { url = "https://files.pythonhosted.org/packages/e8/da/8912e887f5eeeb8f44f50f1aac4c16852644b558b1b29846b14463f9b739/uuid_utils-0.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f9f9f6835ab3163818156022c627eda60c38c874b369642b249b483384021743", size = 500023, upload-time = "2026-09-08T11:28:35.906Z" }, - { url = "https://files.pythonhosted.org/packages/73/0b/c15c3f5006c3f89818cbe796e73f9a1927867ec6b0c32e80cf30becefa67/uuid_utils-0.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:33fa18507488c4dbde9a3969b6483183d934dbf7a7d46aba90bd5d664d4c81ea", size = 605833, upload-time = "2026-09-08T11:28:37.11Z" }, - { url = "https://files.pythonhosted.org/packages/e3/db/1c64eedcc55f1ac01067c208bfe7fa17957521a73ab1701c04a866c33795/uuid_utils-0.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fa1a1c9a72ef9757176c069f7bd8014b7f4abf5f9930ec62b883dc864ba28092", size = 563310, upload-time = "2026-09-08T11:28:38.705Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ee/314fc4f908258714e92b0fc50bbf02cb49454db4857e9da42d40b8f3539b/uuid_utils-0.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd347022f67f7fbbd6939181ab076cd17a1d856e09a160eb87e245e692cc5742", size = 528539, upload-time = "2026-09-08T11:28:40.271Z" }, - { url = "https://files.pythonhosted.org/packages/2a/83/0e9e0bdd77bbf1fe5380267c14f197f8ac442ad5172000422f46f05953fa/uuid_utils-0.17.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:7e32ff7bd0fe4fdefce1d95f8f673a9b012286a7f40918ed1c08936d565aac4a", size = 98270, upload-time = "2026-09-08T11:28:41.575Z" }, - { url = "https://files.pythonhosted.org/packages/14/af/d2546a514432bb970da5a6550c4587ec8096ea90a2d2ea29aa55a1c35521/uuid_utils-0.17.1-cp313-cp313-win32.whl", hash = "sha256:a0a276738fafcfd63e6a0af944ffb8fb86448fe4cedcf574dd7df1ca13259e22", size = 168846, upload-time = "2026-09-08T11:28:42.669Z" }, - { url = "https://files.pythonhosted.org/packages/e4/84/46d45f14ebdf1ff4d9e6096dea5f31a706d7f71e99e48cde933b47a2e4db/uuid_utils-0.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:1cf7a837c3467f69ba3ef32caa43b1c5f5a462b7d960bcc59083459aed2b4202", size = 175479, upload-time = "2026-09-08T11:28:43.876Z" }, - { url = "https://files.pythonhosted.org/packages/58/42/558d83542ce270fdefe19a18e707e4fce58e64ed9d98658a2da78b9ac2b5/uuid_utils-0.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:7a9537e7afe2cd8851e636789124bcc26ff1d671906c5e56f6e8f293fa477ec2", size = 173287, upload-time = "2026-09-08T11:28:45.133Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ea/c735de118ef5c4a6ada1846699e65b3adcac92044e79b83345f90c792fe5/uuid_utils-0.17.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f974aa1097b0b8245d8f29550eaac3b431c891ba7c76cc4beaa6ec7bf8cd27b6", size = 561135, upload-time = "2026-09-08T11:28:46.387Z" }, - { url = "https://files.pythonhosted.org/packages/38/eb/c16f89b3c48eecef422448b9bde07994762cf21daa3351f4c49eab705d54/uuid_utils-0.17.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9700430eb701f18bd995787228c2202a15d9db335e8bf9c583df7eca5487d5ce", size = 289170, upload-time = "2026-09-08T11:28:47.735Z" }, - { url = "https://files.pythonhosted.org/packages/9e/05/5aec1389045f9e16afc1b8cce6414faeed40d44b3095f74d641c33ea1434/uuid_utils-0.17.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d030ce5d3cca0f2f55509035bcd33d39494c50dabb9d53dc0419ad212eb0fd7f", size = 323150, upload-time = "2026-09-08T11:28:49.064Z" }, - { url = "https://files.pythonhosted.org/packages/d8/56/8ad1da1ac6781f792e6e92cdb65bd242c5f5269e7c77de67edd704db61de/uuid_utils-0.17.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d365e0c916bd9a4b0b7f67f3305c6704c4ff44ff9da836faf455b8b5dce0399f", size = 331190, upload-time = "2026-09-08T11:28:50.478Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d7/49300453d84440d6b8f45c95d9fd249f7106f8283296c948842f6fa00fd3/uuid_utils-0.17.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e9f5e23998625f6dc005a3a30238b4006424e366cb2966ec465e0287ae2534f0", size = 447676, upload-time = "2026-09-08T11:28:51.646Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8f/db9fe5180418846bbc3273831468cead13e1de4956c73071fd1a4bde6ac0/uuid_utils-0.17.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71eabda671e055415ecfa8859364438a575eda84e6f43a513436977d9377b532", size = 325838, upload-time = "2026-09-08T11:28:53.008Z" }, - { url = "https://files.pythonhosted.org/packages/f9/00/efcac8905b87ffd76323d8e46594a68a0bde2c24c8e71f44ab7d5622dde6/uuid_utils-0.17.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed6821646e37f49683b3e977f856421c08eb9d03418423ac1477e09d2fb5cf62", size = 349881, upload-time = "2026-09-08T11:28:54.479Z" }, - { url = "https://files.pythonhosted.org/packages/7f/3e/37352e939a3995775a6034023bda646aeacf73f238a82e46f012d6a7eee6/uuid_utils-0.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d8abfd2ed04af7df7b586621b11449a061b4b899f8b073e972b7282c89ae8335", size = 502043, upload-time = "2026-09-08T11:28:55.705Z" }, - { url = "https://files.pythonhosted.org/packages/f6/c2/9f7883a730cb0e0fce25487021590a1fd28d2840bf25022b33a81c800da9/uuid_utils-0.17.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8d31f5725c874a656fa1b7c8feb20b54b01ea70b200a9ff0568672ad3fc80b85", size = 607688, upload-time = "2026-09-08T11:28:57.026Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7f/6b121cfe00742f5884fb313321fddd23a17a2326a01a0e669810eaa36b2d/uuid_utils-0.17.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2ff6a84cf6a0a28e4a75c7b11f0d52464ddce4b7a0bfcf14c8de2e740299903d", size = 566366, upload-time = "2026-09-08T11:28:58.438Z" }, - { url = "https://files.pythonhosted.org/packages/36/64/e706ba987142e212f5af6a034ed98f9a0ec2543e1fdbb3b29b034271578e/uuid_utils-0.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7970905d66e55f9a52d0e694d306501e8a9468aa99da73867cc1f8eba2817261", size = 531140, upload-time = "2026-09-08T11:28:59.937Z" }, - { url = "https://files.pythonhosted.org/packages/5a/b2/7dfecd82aff24e02a6764ea88dbb7266a061bc7691d0180f01c6b1ea1efe/uuid_utils-0.17.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b2735d128a3732e528229fc24295530caa75e79d5ea7fb0f8690ef3114d9b262", size = 100062, upload-time = "2026-09-08T11:29:01.323Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8d/4840ac42764185be3fb7f7ae990c3f4bcf0b941a54ad6807e65cc312e9f7/uuid_utils-0.17.1-cp314-cp314-win32.whl", hash = "sha256:cc9da3c0d8208b53c28658340827505af437bff7a52a55fdaa262ccd4c5a5d87", size = 171234, upload-time = "2026-09-08T11:29:02.688Z" }, - { url = "https://files.pythonhosted.org/packages/90/c0/772c08a73cfc8810ff3144ed2e3701242568f83c7031b781d61bdcd74c29/uuid_utils-0.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:eee4a1df744434e10a0d0a679c074e3128b58328b83c99144e363db320e801f4", size = 177462, upload-time = "2026-09-08T11:29:03.81Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e3/9e3eb231cffab2df2029c4b6d015dabb077366d1194a8a0f2d4522d581ee/uuid_utils-0.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:c3955fc653dc78a93ecbd880bc97a0ef8010a9a748e6307f11ad005d45390ce5", size = 174745, upload-time = "2026-09-08T11:29:04.919Z" }, - { url = "https://files.pythonhosted.org/packages/cd/3f/095e8eed10949c6ca1adde77d405268e88eeaf6e23a3968b29e549d0765e/uuid_utils-0.17.1-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0956a9422e132c8d4a3d808cc3d754fc8e81d34295a3a202b332c9dce064eda9", size = 562178, upload-time = "2026-09-08T11:29:06.231Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ad/5afb5a6fbedbce0bbd358855771c63ff233e7bad898eaaea9f9802fedef9/uuid_utils-0.17.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:691a9c16db041a8d5c55d6414398b0fc97e33aad41ad3aef67a6f3c0661dcde1", size = 289997, upload-time = "2026-09-08T11:29:07.478Z" }, - { url = "https://files.pythonhosted.org/packages/9a/04/78edc758c4dbc84bd5ed8c40b6d7ee0dd879c6ff07320f347e371d84cffc/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf419a23bbeafed0fc8efb4ca5b3e0a8ea4ef4866de41c3393f888bfd5f60e15", size = 323144, upload-time = "2026-09-08T11:29:08.856Z" }, - { url = "https://files.pythonhosted.org/packages/d8/c7/8f27ea2c1e244c0edbaac5dc2a5cbbf51e298e54674faef03132f4468a1a/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:617acaeb2586e87c9bd0c2e192e4f1d33caacaeb7f3e0cc75972bc38e703e099", size = 330592, upload-time = "2026-09-08T11:29:10.107Z" }, - { url = "https://files.pythonhosted.org/packages/39/af/e7d7b372781627a6ea6ec2a2ee82f98e3fe7de7b6e4b050ae29a66fd64f8/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1fc79cd8a24bc6c553cd6f708f5ca08c4182914bdcc87192e1e468e9858add3", size = 446735, upload-time = "2026-09-08T11:29:11.334Z" }, - { url = "https://files.pythonhosted.org/packages/33/11/a2ef25dc4a3dcae5ddf8a7c2debc0d10719a991e327e43913605fd3b9c90/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce2f65e81429fcb145105a10c71bf2c71ac5cc9c8fc6c79ac3c13b9de091b2ef", size = 327402, upload-time = "2026-09-08T11:29:12.745Z" }, - { url = "https://files.pythonhosted.org/packages/4e/4b/61153f07eb7282d71a6ee10e3c05636a7d43cec6784bc6ea79979084e727/uuid_utils-0.17.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e9ff97bf48606e5d817a01fdd4a4a8855b91382e384f524a960149da00adab5a", size = 348998, upload-time = "2026-09-08T11:29:13.976Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d2/b40991f80805d2cb3ace8c961752429e2e50d4ce0a3ed941c26a6250e3bd/uuid_utils-0.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:87d818e1fffc39476c7934544f54455ea04c6297fcd983598802e81c746338a0", size = 501745, upload-time = "2026-09-08T11:29:15.261Z" }, - { url = "https://files.pythonhosted.org/packages/38/84/f65e1963964b2b6fb7aa687dc819e5a39207dd9ecc7961cef82124fd3cbd/uuid_utils-0.17.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:764e4505821c20f1a45a54e9da076e6a97e4e46947159490aea893dc6b8d77be", size = 607104, upload-time = "2026-09-08T11:29:16.586Z" }, - { url = "https://files.pythonhosted.org/packages/84/3f/07c5ada40f360981ee069dbe6463a13dfa1de7eee73a6cb91f94d610821a/uuid_utils-0.17.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cddf08ed611c2ad1c791d4133dba2c63db4d294b2111e1db687537943cac25ae", size = 566012, upload-time = "2026-09-08T11:29:18Z" }, - { url = "https://files.pythonhosted.org/packages/52/6d/ede35c5e3e3787d2e9d5d3baddbc00f3f64e3f4522d53508757fbcfd6f47/uuid_utils-0.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bcf40ae13cf31727b84f00b1a505f1d4d10199bfea946c3554ef327702d2acca", size = 532218, upload-time = "2026-09-08T11:29:19.477Z" }, - { url = "https://files.pythonhosted.org/packages/97/a1/318e4bc7f04a505189233ec2409cce9e18cd5f52d06738a9e96f0eac3816/uuid_utils-0.17.1-cp314-cp314t-win32.whl", hash = "sha256:ce2fd8f8bc0026c0fc137cf5cce9de546ff9e0b4008be3eb21b5a06249eafec1", size = 171217, upload-time = "2026-09-08T11:29:20.984Z" }, - { url = "https://files.pythonhosted.org/packages/06/79/11811f97922be44ca900fc89e26b4dae173bd03ffd03672da7b28b023b29/uuid_utils-0.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:3dd5706a9874799013e82ac567425c535a0a4a7779c8551154915a4ba2fcb1c4", size = 177754, upload-time = "2026-09-08T11:29:22.227Z" }, - { url = "https://files.pythonhosted.org/packages/60/66/f56b2b497286f01ac2f6a1be8f825e871906d6aaf83dd4ad0cd7c8d54013/uuid_utils-0.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:a3cd9443d0a3b6f631e6352cb9d9c0a9b68d808d71250eb44e7b00265ec382f7", size = 174267, upload-time = "2026-09-08T11:29:23.447Z" }, - { url = "https://files.pythonhosted.org/packages/d8/23/81d75df583e3c7ff432b4f86014ae243fe7baa57d99919dc1292e9424724/uuid_utils-0.17.1-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:653bf91ec2d1c3b0f10157815ca58b0b572d15ce17ed0823aae08ff0df207fad", size = 566472, upload-time = "2026-09-08T11:29:24.726Z" }, - { url = "https://files.pythonhosted.org/packages/8f/f3/71e7acaecfdbb5edd3cc7e13d0602f4566f16f35412edcc784569ff14733/uuid_utils-0.17.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ea207557393ead4084beb08f0e9c0c944ac2050678714b65ba979fae90cf782e", size = 288766, upload-time = "2026-09-08T11:29:26.252Z" }, - { url = "https://files.pythonhosted.org/packages/52/62/1a94e2cf60ba38ef87f11cae3dd3b2787366229cc9a3f0ffc41fb89c9487/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5629c94f65249384314831ca0a95ca5f1dce5bcd5ee79600a5cd31d4f7d0f5f6", size = 326190, upload-time = "2026-09-08T11:29:27.666Z" }, - { url = "https://files.pythonhosted.org/packages/87/81/55b12664f7fb6a69a9d18ec8a8cac1a55fc60e0dca14046d6bb972fae2a8/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f85fddf2e5c4f7a30ebdc2b26ec585b9d814d807bcf285d248ae451ffee16a03", size = 334399, upload-time = "2026-09-08T11:29:29.023Z" }, - { url = "https://files.pythonhosted.org/packages/8d/64/844e5657be2b43ca2136ef4aa207420c1387e28cdbb90dcb395133ee63ca/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4adbea226bef0c619b33fa257113e36269a475b2c2049f55b8b83b4c6d507a9a", size = 450440, upload-time = "2026-09-08T11:29:30.334Z" }, - { url = "https://files.pythonhosted.org/packages/87/09/ab493c7598311f9bab4dc762d3483cb35cd78588c4d848c36fcda671f4f9/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ed203ff60932fe5b3a38453945bee4aa8dfb387789fd420698f607786ba42b8", size = 328684, upload-time = "2026-09-08T11:29:31.752Z" }, - { url = "https://files.pythonhosted.org/packages/4f/1d/8f2816d50d7a69416270a88f41f6820cde300719bac814989bb13e4c5ae6/uuid_utils-0.17.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92e8df2bc6a33229c105ea90839d98576fcecc5cc86fdb1dd772ab10367b744b", size = 354290, upload-time = "2026-09-08T11:29:33.067Z" }, - { url = "https://files.pythonhosted.org/packages/18/e4/2bdff71a73c3d5dde6777815c910be7417fbc54f36206d0f7a1fb2f54522/uuid_utils-0.17.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6cca251f83d3ec2988fb7355b52c4b4fd2d96159f6f040e68f51af15fab49540", size = 180288, upload-time = "2026-09-08T11:29:34.24Z" }, +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/91/63938e0e7e7876658e5e40178e7c0735b53527886fe11797a11699c55edd/uuid_utils-0.17.0.tar.gz", hash = "sha256:abb5667a36119019b3fa320c4d10c21ebccfcc87c8a739e6a0056cee7f48dde2", size = 43220, upload-time = "2026-07-09T13:49:58.433Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/60/659104207938f2ac62508b9aa595fc0515ac7452dd515c8e1d47d0b91169/uuid_utils-0.17.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d2d9a63a9e6f2416ace8c109043a9280d6b34f34bb2e5421903e149403db40a6", size = 564038, upload-time = "2026-07-09T13:47:51.731Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e7/e0d048a268b4163058bdd2f07a45bbe13c29e3cc6b7b88f8f00b001617ce/uuid_utils-0.17.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b776c7fc8755c7de06dd5a22b47c40ae84f67d13277ebb233cc84933ba4dcbcd", size = 286680, upload-time = "2026-07-09T13:47:53.141Z" }, + { url = "https://files.pythonhosted.org/packages/84/83/e3606dc9b4224d0c9a6675d9347e7e0da7e67fa30e061bfdb686138844d0/uuid_utils-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1edf2f8732e4ed95bd7b65f2658f4aa072efaaff321144f4e0d4bf6a22709263", size = 323533, upload-time = "2026-07-09T13:47:54.433Z" }, + { url = "https://files.pythonhosted.org/packages/22/f8/aec5c34fa80c9fef09a506a098015e728080076494b72b9e8e5cfc9669c4/uuid_utils-0.17.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84ed3a2d5cd3ae6db87af20bfed3331116195ba4757ad7177fc8f12c1bbce2a9", size = 330691, upload-time = "2026-07-09T13:47:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/08/73/85776566863514f37b0a761648368e96b07d64981a9b6c391220aa2563a9/uuid_utils-0.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bf4d9cd1e80e73922073b9b27c143bedeb109d65f94cd12712e2c87118f2b7d", size = 444094, upload-time = "2026-07-09T13:47:56.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/06/e0424b4268c0932e0ff8257303d70de4053f05958843268fac4cb0f79b57/uuid_utils-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52db0e471d3d2632d35445af352591f40a8f32959a412981d9f51e068bb9514b", size = 324548, upload-time = "2026-07-09T13:47:58.217Z" }, + { url = "https://files.pythonhosted.org/packages/db/d2/a0cb3a69ef6d9becc30a6a0594ddf6f798f6204953dfa85073cbec875b94/uuid_utils-0.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:344f7c755e280ea0ba6aeb08022190d867a80000b1715cacded54fc4b5633607", size = 350307, upload-time = "2026-07-09T13:47:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/82/81/d82766af7db541e4a78b920bc1c4303d44995f841805d1498934088cd12c/uuid_utils-0.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:589d9da7de8fa7f739bb970ac4632c9a268213117d634e1c4a58c1c1e821ca05", size = 500661, upload-time = "2026-07-09T13:48:00.726Z" }, + { url = "https://files.pythonhosted.org/packages/10/71/b261cd0d38497ed8c2cce0263c5607ec9cd2bbace0f73cb19a6fc2060b6e/uuid_utils-0.17.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cee808b405e9095506f4e4e89924bec7ea77eac3129b6fe36eda04364b3b343b", size = 606577, upload-time = "2026-07-09T13:48:02.539Z" }, + { url = "https://files.pythonhosted.org/packages/3b/63/9e48512bb235e9533adbb25c30fd0c9cef09f6ecefe131ba392b98572b40/uuid_utils-0.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:53ce348ef4c6e98c02c19c522af01334fe94476ce9af0db8c4482f9f142ae9c1", size = 567054, upload-time = "2026-07-09T13:48:03.833Z" }, + { url = "https://files.pythonhosted.org/packages/b2/cc/d7bad8799a37ec33fc21b29fcb459d63d9f88aa09056d0c3e58903ba2fb0/uuid_utils-0.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9e753e81457241e2200c56a898e268e8fa25796271af0489c608f24d8e631eed", size = 529682, upload-time = "2026-07-09T13:48:05.097Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3b/59b1e07ada8aadd3c046c97fe9814d85e770abb7e8cf68d5d86538bf62e9/uuid_utils-0.17.0-cp310-cp310-win32.whl", hash = "sha256:c589f5023d471ce75dd2cce61acb25ed6347e562041588a1a366808f22d7176c", size = 170595, upload-time = "2026-07-09T13:48:06.411Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5c/23a2d0253ada2ee8c497d541d4ef0dd5576c3d2454ec2f9d0b8a06af9304/uuid_utils-0.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:981cc10163988defea96e8d6c507df151eab8f483e7df9ae543d5a41a4be073b", size = 177225, upload-time = "2026-07-09T13:48:07.561Z" }, + { url = "https://files.pythonhosted.org/packages/d7/b2/8f03b61f0aa4afc687855c4f00db35f4d3e58c480cd885abc46f6e41308f/uuid_utils-0.17.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f9b093cb3b6c9d6233ef45a05cab064d2aa0a8cb3c5777084c9e20fcb77c2371", size = 563901, upload-time = "2026-07-09T13:48:08.961Z" }, + { url = "https://files.pythonhosted.org/packages/e3/cb/88b909ffb9ac11f88d2e6ceabc592ccc660b5830b06dbcbd290ab8981f1f/uuid_utils-0.17.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0bc4c431ccd59c764080ceb43b126043325fe17861b87759d026a0cdd8423bb2", size = 286383, upload-time = "2026-07-09T13:48:10.2Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b8/bc5b64e9898867227c535cd0366c571c580a736748e81329437c1773e442/uuid_utils-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c00d182e31034250690f417b9068b78eab423c10d76766664e82d9860c340479", size = 323244, upload-time = "2026-07-09T13:48:11.477Z" }, + { url = "https://files.pythonhosted.org/packages/13/d9/8a17462ce066fbf89670fb737a3f0c93a77816736d2a4d134787e759d8ea/uuid_utils-0.17.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:570db214f6d8507587a8faa968a3fe65e957daeb7bc48b27dc7f69bc3ecdd6f1", size = 330466, upload-time = "2026-07-09T13:48:13.092Z" }, + { url = "https://files.pythonhosted.org/packages/43/37/0c65d0db3bae45183419756d938f1791a82c835fd92bf234eb4f008d2e02/uuid_utils-0.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:351462debd866f1f25e4d4f5c7fac89525b52151f0102a1bdfe94a999b046f5f", size = 443806, upload-time = "2026-07-09T13:48:14.372Z" }, + { url = "https://files.pythonhosted.org/packages/32/d5/7e698466d1f5254620b5ee0d711fdd20a0e9c2acd7040740c37193a8f673/uuid_utils-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:622cdde768300591ac79bfcd7bb3468e4b191b1105d5dbfe8d87c39d8f63dd46", size = 324261, upload-time = "2026-07-09T13:48:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/5d/48/3a5b242d7f0b8e3ca77dcd7177f3cf73e0280cee32e2349d9796ca27f183/uuid_utils-0.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75d7411e8eb9259764dd60310738540649057cda4509b4af14b36b7f663bfeb0", size = 350657, upload-time = "2026-07-09T13:48:17.273Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/f32ea82a89efed2eafee2f1d925d64687a81e550a9951933fb1b75c95ca6/uuid_utils-0.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1019476b6bdc047216ef7414be5babe0fa5ccfde977c0cac4fd6c75ddec66ff7", size = 500613, upload-time = "2026-07-09T13:48:18.459Z" }, + { url = "https://files.pythonhosted.org/packages/f4/5c/c7b73ec4bbe28db162a4841d352c6eda582801e0dd9fe72f6ad5cc584ee4/uuid_utils-0.17.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:04452640d8b6920c480c16e5afe91ff896d236e0c972830f9247e0898d38c803", size = 606306, upload-time = "2026-07-09T13:48:19.726Z" }, + { url = "https://files.pythonhosted.org/packages/63/95/8a2777204e8691b4961e6aa619001c3e5175aa430ab43da3079142e8d310/uuid_utils-0.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:793229621e1ad6cac55f015cfa9f4eff102accbc3da25d607b91c6b0bec167fb", size = 567231, upload-time = "2026-07-09T13:48:21.024Z" }, + { url = "https://files.pythonhosted.org/packages/1a/6f/1d778ca3ed6d2cf35f22088e2de714675416747ab41be510f22c141043a7/uuid_utils-0.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03815cea572c8a693cab5475b9d750cc161470961c7defa27e9286cad62f38f5", size = 529373, upload-time = "2026-07-09T13:48:22.312Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d3/9ad1ab64b3bed0a0237d1db89dc6f5001d6116a82766753da4ac4496f979/uuid_utils-0.17.0-cp311-cp311-win32.whl", hash = "sha256:c4f845166b09acc65c5213a35551a7f81c17fa010ab467229b5813f79d17fe13", size = 169930, upload-time = "2026-07-09T13:48:23.504Z" }, + { url = "https://files.pythonhosted.org/packages/c2/1a/e01417f52eae6e2cb412260bb332b4ee4b37af2982d9c38cff4b68b2e899/uuid_utils-0.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:14dc2f46abb1091260c0d203fcbdf4e045042cc07e49183fd3b255904b95eb70", size = 177242, upload-time = "2026-07-09T13:48:24.723Z" }, + { url = "https://files.pythonhosted.org/packages/35/20/396c27f996add19f8ac31e49cc4570824e51a97719087dabf94694d25bc4/uuid_utils-0.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:29179ffb7b317239b6d6afb100d14c439c728770460718280b9c0a42d2561ec2", size = 177023, upload-time = "2026-07-09T13:48:25.834Z" }, + { url = "https://files.pythonhosted.org/packages/20/80/a7e685968e3cec99d6fe2fb25d0f5726310e1bba356da68c13dfd8b7d140/uuid_utils-0.17.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9205068badf453d2f0821fd5d340389b4679992d7ff79d4f3e5608996dd1b287", size = 556403, upload-time = "2026-07-09T13:48:27.022Z" }, + { url = "https://files.pythonhosted.org/packages/56/47/3102d93bcb7b0bfe6bede63ff8f221a7f91348e10a37f682773be27c56d9/uuid_utils-0.17.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0fcca4e838af9ac9243b3358d7c14afa4dca286a87781124c272d6c4cad9c968", size = 285608, upload-time = "2026-07-09T13:48:28.769Z" }, + { url = "https://files.pythonhosted.org/packages/55/fb/d59695f0f8db065b93c63316eaafa05a22d75a0486978a33736c52c646d5/uuid_utils-0.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f3729e839209f3457d0d8b6a35a376fdf65577a5aecaf4cc3587d3305759ba6", size = 319926, upload-time = "2026-07-09T13:48:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/5a/03/62fabcd1e990e07a0e220e8d552af45bc16f107fa8e55c2014a706bb1a1e/uuid_utils-0.17.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3dac0ad0cd9a2818d1775215365a4e8c2f8ada215529dd26f3f8cceeb67a6988", size = 327172, upload-time = "2026-07-09T13:48:31.187Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/a5081391338b459e2f8d8b12581f00f8caa6317fab510e0e85c18c59e938/uuid_utils-0.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e671b2322ef09106ecb1ca0f4c398b134d5e2c1f80d7a4f3336847a3072c0e94", size = 439075, upload-time = "2026-07-09T13:48:32.295Z" }, + { url = "https://files.pythonhosted.org/packages/59/30/91795bd01e17a13661280d4899fbf38fb05e3f38e873f9aaec106ec30aa0/uuid_utils-0.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8eb3e5caca8d3a6f72ea4cce024583f989f6f2e9186f98800213fff0176e8bcc", size = 320247, upload-time = "2026-07-09T13:48:33.64Z" }, + { url = "https://files.pythonhosted.org/packages/e5/11/09102b78303e4eb62069d6d88ef9fd661dc523e8f429e1fd67eaa78a6f44/uuid_utils-0.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b72c2002202038666bf647f9a790906214c7c11cd0d6efef77b7d07bef3034a", size = 344738, upload-time = "2026-07-09T13:48:34.786Z" }, + { url = "https://files.pythonhosted.org/packages/74/f9/be95bad6954b60328878c3800258f01a6accd24fd75112d13f023462d53f/uuid_utils-0.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e2ac1c0b56f2c91b6f158e29ed96b1503223fe8aa6e79b1be1dc55bd8a5131c", size = 496845, upload-time = "2026-07-09T13:48:36.057Z" }, + { url = "https://files.pythonhosted.org/packages/2d/02/8a19a34e0530d987488a068a71576a236f5c8c746630b870b57f71eb24ef/uuid_utils-0.17.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6c142bd0cb4dba31c10babe00d59f7ef6460f0ef55eaa9c1a9da270684af996a", size = 603233, upload-time = "2026-07-09T13:48:37.512Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a8/b1abab36ff73b0248d82179816467f6d39a2e80fd64329a895ca94f3508e/uuid_utils-0.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e252db239eb41c32248e096e0d170bce5896a4fd3405556362bc3dd83d912206", size = 561401, upload-time = "2026-07-09T13:48:38.977Z" }, + { url = "https://files.pythonhosted.org/packages/61/91/70e7b528b351cc03a9ca43e6116371cdde31bb12bcead7ca2ca1367366cc/uuid_utils-0.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:237722b6581bb5b4eb4cefbcbe5c6e2980a440aabe781fbe50ebf1cb71eee4cc", size = 525314, upload-time = "2026-07-09T13:48:40.599Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f6/9167e90cf9937d6558f92d022ff3024a69d938a514d9c8faa4080f73b001/uuid_utils-0.17.0-cp312-cp312-win32.whl", hash = "sha256:46a73cacdf512f473a81f65dbf84186e08cfe6e9118fa582b6c6b33a8288a30d", size = 166831, upload-time = "2026-07-09T13:48:41.862Z" }, + { url = "https://files.pythonhosted.org/packages/5c/7d/0b889654d9ee3413f810cf4685e241285f650d98a4103ac9f3c6bcc95f29/uuid_utils-0.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:e59b60a0a4cb7541480e02090d37dc2df3b72df4c2e776fff64ce3a4e3dd4637", size = 172944, upload-time = "2026-07-09T13:48:42.992Z" }, + { url = "https://files.pythonhosted.org/packages/be/35/8c6e1bf65e4d400352885dadc656ad6d0af96e89231e3f04686bc2197128/uuid_utils-0.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:d561a4c5747a1e6c7fa7c49a0292e78b4e8c456332caa084fc7abad8de828652", size = 172459, upload-time = "2026-07-09T13:48:44.271Z" }, + { url = "https://files.pythonhosted.org/packages/d2/dd/614fb9912157ac0128e6050859ccf06d9f13df9a944a803e8f80f6157e38/uuid_utils-0.17.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d11a7bc1e02da8984d32e6de9e0826c6edac00eac17de270f372bf32f9a0af63", size = 557259, upload-time = "2026-07-09T13:48:45.664Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d072711704de3d21bec08b6c2f36a215200ca1d5e01a390ea1ac434080a0/uuid_utils-0.17.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7a49f47ac26df3e431c56b825c1bae8e6d3d591fdbb7438c227cc9845a7e3d73", size = 286271, upload-time = "2026-07-09T13:48:47.018Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/8a63e5eb2d5a6ba69a6c2036e305075bd6f5a022e7ea25fc6ce0eb7c51d2/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32df1944808877702ceea398c103881c09a679bb672a215e01c2a84231266bf9", size = 320025, upload-time = "2026-07-09T13:48:48.208Z" }, + { url = "https://files.pythonhosted.org/packages/f7/2d/bdc2caf9719d9090d7c46043242ae6136cba4f7a7ee384992ab905ad9aa1/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98c88d3edd08e7245562e9815996dbc6f0bd4745e1c76462f24af5ae4e187dd1", size = 327931, upload-time = "2026-07-09T13:48:49.673Z" }, + { url = "https://files.pythonhosted.org/packages/b6/33/9219d09d51ead282b578b2a4e0a515c2cce3ec52076cada8bfb7e35727d5/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a4370089c8b2e42f1db51d76408c7fa8eaa2934bf854d17983d16179c07c098", size = 438537, upload-time = "2026-07-09T13:48:50.842Z" }, + { url = "https://files.pythonhosted.org/packages/d8/79/e8e0f8b3955f2081c116157119d87659937893242eb834aa170da04d660b/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09a55b7a5ae764985cb46467496a1787678d0a1400356157a080ad95b1a36869", size = 320656, upload-time = "2026-07-09T13:48:52.164Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5e/d1ceddc430ff04b6e21704b2030d4438074a2f478b265dab43da957791c1/uuid_utils-0.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56aa6488b931246fae11924e4bd0e2b32677e63945eecb71c29e3c2ca0dc3131", size = 345310, upload-time = "2026-07-09T13:48:54.076Z" }, + { url = "https://files.pythonhosted.org/packages/d5/62/89438e12f389a843e626b7e37691319a057b3d6b80914609106891faadda/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:309a35f12d99dde19032bc2259cda6431c85eeac0879134dc777cc3087d7e1cb", size = 496771, upload-time = "2026-07-09T13:48:55.365Z" }, + { url = "https://files.pythonhosted.org/packages/87/d2/eedcd99f522d60e238ead03844f0d51743ba84d33044959e230b756bf212/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:21c79b61ff750abcf057163dd764ccb6196cde7a26cda1b31b45cd97769e03b3", size = 603631, upload-time = "2026-07-09T13:48:56.746Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a8/bb1b38aaddd7243b6e562c6694f499bf094800918316192fd8cb2cdc2620/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4134353bfe3026ddab8e886002dc52bc5a0ab04611aabb0eaae23c32e6e57f64", size = 562008, upload-time = "2026-07-09T13:48:58.241Z" }, + { url = "https://files.pythonhosted.org/packages/b4/77/5f7ed930dc105e293845c09e4d5bd84076318a12f45a46783e1af64906d7/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7c89359affecebe2e39e6a116d069b363c936511a9572b308402489a26957d89", size = 525527, upload-time = "2026-07-09T13:48:59.784Z" }, + { url = "https://files.pythonhosted.org/packages/fd/25/1b55697adf6811a6f92cff6340e6b03e31fd6bc51066a5c10698c29b3679/uuid_utils-0.17.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:6a019a31bc4db89a0903a3e4f6b218571f3a6ff0ad4b3d3fe1c8f91a05ff6e3e", size = 97965, upload-time = "2026-07-09T13:49:01.217Z" }, + { url = "https://files.pythonhosted.org/packages/26/bf/cd729343de4684230be8a966bad7bfc2cf10ce3e643b1189a8b5370dbe35/uuid_utils-0.17.0-cp313-cp313-win32.whl", hash = "sha256:b3131a82d0c7611f0aa480a6d36929e001a3f54ba0fc029a8118a5863cce513c", size = 167316, upload-time = "2026-07-09T13:49:02.354Z" }, + { url = "https://files.pythonhosted.org/packages/76/f0/e602ae0a1b139a7826e5189b93d91902564def06d5006324fd2faf82c8fc/uuid_utils-0.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:9e311f908d2f842fca4c7dcebc4f10306b8089b204ef04cf6704b4332c9ff6ff", size = 173630, upload-time = "2026-07-09T13:49:03.529Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/024ebece265b387154115dc4f1d9727174ef82623069f4bec8b7ed7e73f7/uuid_utils-0.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:c351737e2e65497c7200ab4ffb8af97e9f48be6488309abdd265fe08d66ee92f", size = 173214, upload-time = "2026-07-09T13:49:04.836Z" }, + { url = "https://files.pythonhosted.org/packages/56/44/e2fd3fdf356e1b55d2acf1b956b4f3f29ffb215a99c387eba04b1c5fba66/uuid_utils-0.17.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:673d89cc434cc9b97a0b4cf61272f6fca70a81f64eb0afbface2a0d9f77f06cd", size = 562232, upload-time = "2026-07-09T13:49:06.201Z" }, + { url = "https://files.pythonhosted.org/packages/19/28/65e0980d668a6d44e699f59d1acf43d6b5d4893592c115ce7c680bb4dfa1/uuid_utils-0.17.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:387cf7437c94ddec08651a0f1081381299c7075bc48a6251d8922bf39973378a", size = 287858, upload-time = "2026-07-09T13:49:07.45Z" }, + { url = "https://files.pythonhosted.org/packages/8f/8d/5e97bcebc90fb6a10f98af3dc1ba552e04183aba59e2edc0b9cf486dd998/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:220b52746d99e11964badac3c0869016e0c24bafb70a7dd5c2c072a6be3da9cc", size = 321587, upload-time = "2026-07-09T13:49:09.489Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d7/88b2a2370cc3d455ba0515fb6f5c8f7ac0c0f55a86801b6e56a432f22c17/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0ab4a66e7a035ad6625cfc1fbdb34f5c2d25a80ae1ef4bfee458ea2036333c6d", size = 328964, upload-time = "2026-07-09T13:49:11.292Z" }, + { url = "https://files.pythonhosted.org/packages/bd/0f/181c5da673953dfc0958cb4fb3a4984a9098673ddb05cac68e994bc8511b/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5641071337eb11d61a001ea08793bf72216f3241f0a433ed2764804b2a3e3cc7", size = 442909, upload-time = "2026-07-09T13:49:12.644Z" }, + { url = "https://files.pythonhosted.org/packages/ec/38/5c5e665af542884a8fd3c61725c38453239e13940326b5b70f3ef8881a97/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9082e709014946b1f6e96ae6ecd93652efca2d2a6a3ab67dbe151c8b4bf193a4", size = 323076, upload-time = "2026-07-09T13:49:13.897Z" }, + { url = "https://files.pythonhosted.org/packages/f5/35/7de97de18cbf226c2a4f2104ad15e56ca4491717c81c0b71795c0c585b4e/uuid_utils-0.17.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1fd6f0e8a162dc0e9255b6aebe3cd175e76c33202f1bf39da9e6294b93db0099", size = 347360, upload-time = "2026-07-09T13:49:15.237Z" }, + { url = "https://files.pythonhosted.org/packages/26/a1/9915d5dd59fdd1957ded5d188c0ea0b9db5a1d84d42c8d8828a7b83b366e/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d63010803d7c368963bbe6f7ec379593e76dd581d7db0f29118d88713c9e0354", size = 499267, upload-time = "2026-07-09T13:49:16.774Z" }, + { url = "https://files.pythonhosted.org/packages/c0/05/88108405262ec850cea0f95733445d6873e5772af3292baabd9ef8457740/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a46bedc273b6f58f11dee816ff74999625ef8d007890f411b7a4975bf1c89330", size = 604940, upload-time = "2026-07-09T13:49:18.147Z" }, + { url = "https://files.pythonhosted.org/packages/89/d5/6dbcd300de47cc443cff2656cd5327a385751213dcb2101cfee7388170b2/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:405233a5f625b3d995648f4647fa6befa4567cf3f74e1f6b9837e16f7310f0e0", size = 564172, upload-time = "2026-07-09T13:49:19.593Z" }, + { url = "https://files.pythonhosted.org/packages/ab/94/e8057f2288a415fba8a978bca4b589f5cb6b91a028a5dc07a1775938b33f/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6c5d2d71e1f17329150ad9427d27f4a3f29a01792e7ecdc64a98ac5368fc4d5", size = 528533, upload-time = "2026-07-09T13:49:21.075Z" }, + { url = "https://files.pythonhosted.org/packages/f0/6b/31713148c77e48e62f51aa042a98a54a8be0396912ea5130f83f52ae722d/uuid_utils-0.17.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f7e9b8728ba07a3cb2f29d5aa1a266c2664eb8ef0fd43afa34627c92f7fac8f0", size = 99197, upload-time = "2026-07-09T13:49:22.351Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f3/ca6f6ac5428312df8ed632f6dd9f9e6aba23090471fcdeae53eab027e8b3/uuid_utils-0.17.0-cp314-cp314-win32.whl", hash = "sha256:58838921e377791ef22c64cc92141bfae030f43651ff9272f0f28a208a9e6a5a", size = 169540, upload-time = "2026-07-09T13:49:23.563Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cd/7ede0db66411fa09817d79b680f7454ea9bee2d374e1922e4efd065760a3/uuid_utils-0.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:42275ebd0e8e74e32cdbfb8bd88fc99576567d51d54a508020611fd8f4f463a0", size = 175984, upload-time = "2026-07-09T13:49:24.703Z" }, + { url = "https://files.pythonhosted.org/packages/f0/81/533b5f80cd4918c0693f4e1b7b90ceb1caa45f4266ae8b528135d7ecca5d/uuid_utils-0.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:b5d11cccba076a32321ef1380dea956821f0b51794ef59df64e58fb1cd543aae", size = 174749, upload-time = "2026-07-09T13:49:25.886Z" }, + { url = "https://files.pythonhosted.org/packages/a0/13/f400ac39d06fd8be5b099c09e41bb975205926722a3e8d53348817cb7ff9/uuid_utils-0.17.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fae8b282f0cb22a5de222999f7723f4e5ec04f6fcdf4aaef879b5b36625ae2b0", size = 562610, upload-time = "2026-07-09T13:49:27.374Z" }, + { url = "https://files.pythonhosted.org/packages/03/8c/c71c8312304c56f6d0bcba87cd402fa79bec35d18ffc8c41954196ca68e5/uuid_utils-0.17.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:967955620df45e6cffe2e9950cb9903cb455649396f896b26b04363a91a5054b", size = 289473, upload-time = "2026-07-09T13:49:28.989Z" }, + { url = "https://files.pythonhosted.org/packages/bb/cd/522117e2e5184ca1d4f0f85ee833e9e21bd8c6b99eff8a4d1a8e5a194e33/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375cde148430d60a4a07c03abaa0774c4fddfdd90de99b4ba02f24088bc9d750", size = 321600, upload-time = "2026-07-09T13:49:30.4Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f4/0d81f9bd346fc717bc561c08fa6457e0328966eb76e536b938fe77d56459/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:975c17da26c5b9d46c336b03c52a057ac28378d6f9d98b58d32a038589bb3912", size = 329569, upload-time = "2026-07-09T13:49:31.732Z" }, + { url = "https://files.pythonhosted.org/packages/5e/41/26e1363f36a94c9e8ec2dd21d5f63088d3e7c723adbb12dcc8fdc77be417/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3150d836290c88f1d26eb59c4db280d87417dd3bfaadd2889c77416c8f0ff6fa", size = 442051, upload-time = "2026-07-09T13:49:33.024Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a7/2c1ed1b34d7df7fdcc11c28fd26d94d44843b37d9af2435ff9fd8abdbc08/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9472a8de37faf8bd216c628e0e68c8f6bef730d3ba0a5060f3b0fa460c992ac2", size = 324372, upload-time = "2026-07-09T13:49:34.554Z" }, + { url = "https://files.pythonhosted.org/packages/78/bf/328d3c6bb22c496944a1b3b732207d71aa6964eb604e5e3b9dcb91ed0a00/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d27c531edb8d1f38ca2eddaa1fa24913a460aeb721f2efd4ef42a124ce94e354", size = 348548, upload-time = "2026-07-09T13:49:35.898Z" }, + { url = "https://files.pythonhosted.org/packages/3e/76/a07de5cb7b90582fdbbc830fd19be129cbbb9897cfe239fef469d7bd2d09/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5670c52a438e21483ce715776144914a4e2a2a5c62d9dee15f8a3e90cf128ae6", size = 498985, upload-time = "2026-07-09T13:49:37.142Z" }, + { url = "https://files.pythonhosted.org/packages/f4/62/9966e46ae34fcec6b06119631fb3c09705ea78835035ce3a82d3348eb61a/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:6f29689a76fe7a49cbd629a794d0ec1eab48814e323a00a146a741b0195bde68", size = 605183, upload-time = "2026-07-09T13:49:38.648Z" }, + { url = "https://files.pythonhosted.org/packages/d7/4e/bb962ba0fe31e903b199f22cf4c1a6cba35a8987aef526d287277ab8ca8b/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4441600447d340ae103a353f01dbcd22ff680e5ee1a22988efe8d7b791d8fdb3", size = 565412, upload-time = "2026-07-09T13:49:40.115Z" }, + { url = "https://files.pythonhosted.org/packages/ce/9e/122adfeeeae8a84ccfd43bce627b104d12a2180a93bffd2c0e1b54dad7a6/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b04935a79c03c41ad08d0a5f390aac968bfb561f1268897bc5b0f077971efd", size = 529885, upload-time = "2026-07-09T13:49:41.513Z" }, + { url = "https://files.pythonhosted.org/packages/b3/4f/257304dded339dc35fc9bf35722ac68fd4fdb930f255b8f7bccdf74ebba9/uuid_utils-0.17.0-cp314-cp314t-win32.whl", hash = "sha256:239d8a281fe10bae33205b5d43185834d556b18434e0a113b5dc1dfb2fd97e91", size = 169472, upload-time = "2026-07-09T13:49:42.871Z" }, + { url = "https://files.pythonhosted.org/packages/35/c8/e78c06db7e9ce317ce7b8759ff2058333eac75caa8c22b75f0059589c9be/uuid_utils-0.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e288a06cbbbcd01b44386e767985c9e21d2ad9bf59829aa7058d9a2a494804ab", size = 176271, upload-time = "2026-07-09T13:49:44.105Z" }, + { url = "https://files.pythonhosted.org/packages/a7/11/bd1c70e1ad3301163cebe66c8d26de26e6814d52f642a849448bd2833626/uuid_utils-0.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1776a80d16369999b21627028cc5dbce819be83e1e079fdd7a51b587d2916db9", size = 175004, upload-time = "2026-07-09T13:49:45.591Z" }, + { url = "https://files.pythonhosted.org/packages/ee/14/4ae708968b15cac7b68d5b854bfce724b21faa1c7a5147fb96d87f468a45/uuid_utils-0.17.0-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7b9044ce4acbf392d4b3a503fe377641f4deff82e6c341c36ef27af0dea76cdf", size = 567823, upload-time = "2026-07-09T13:49:46.902Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e2/d3af9c3d1dc6efb9ee1cffab30f3f2aacacc3892b21b495d78d34c6696bc/uuid_utils-0.17.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a91c4814c7150a4d798da691b7804eacd78c4b84fb392a60fa0de21341861eb", size = 288763, upload-time = "2026-07-09T13:49:48.491Z" }, + { url = "https://files.pythonhosted.org/packages/bc/c2/f1b183e412387529893015a94a8447633c665f6d0392de20e245680e636a/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd4a21baaac9a88486f0dd166c5793feb101a0bb9f006f2c401657fff5a1343", size = 324919, upload-time = "2026-07-09T13:49:49.972Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3c/d32c799bdd51f3b08b6ee95f9de921b59c69075a96767f937fab55014813/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32abaafc8e91928b3d9f4d82e42d2094041e38ad6bb964066faadff28e4162f1", size = 332689, upload-time = "2026-07-09T13:49:51.402Z" }, + { url = "https://files.pythonhosted.org/packages/6f/90/b4cd455619ff276dc3c3262a7420ead63aa1e531362f00df4cdb07d90e0a/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd741c73440b328f937dc53b344ecadc46bc4f0cec0333a8f42b55f3468ce7ec", size = 445726, upload-time = "2026-07-09T13:49:52.757Z" }, + { url = "https://files.pythonhosted.org/packages/e2/f1/5cc042a37932aa9a66eb8ab4a9a5b31d80261ae4565ff0193d8cc1fb9392/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89a0980d49683c00539c59cd9f46b1908c538e6b5b0a48ad12187bb856d0f391", size = 325610, upload-time = "2026-07-09T13:49:54.191Z" }, + { url = "https://files.pythonhosted.org/packages/5e/72/9e800c41d766484484e97845a7a7f677ba94462df86c97183e0290229d16/uuid_utils-0.17.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:de1064663aa7c839286488a319d2b3b478ca5ab5b2091ade888ed0eeca11a98a", size = 352672, upload-time = "2026-07-09T13:49:55.748Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8e/86ce2c03a1d9674530f6649e49067f7c69929600127077731de590d12132/uuid_utils-0.17.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2db386941cfdecdd0b5a8ceeed5cf7479c83d1730dcf64a48d43cfa018cc3310", size = 178681, upload-time = "2026-07-09T13:49:57.096Z" }, ] [[package]] name = "uvicorn" -version = "0.53.0" +version = "0.52.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/ad/04bbb797c84fc1f26cb171f7394716f4865ffb8d8c5e1eef42565c2dfa6b/uvicorn-0.53.0.tar.gz", hash = "sha256:a9356f0cb89b3b8621529c5d5eebd69bfe154f4c3f68b4cf2de47e45fa855c2e", size = 110881, upload-time = "2026-09-14T07:44:23.815Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/18/ccce41535dee1be77735592bd19965f3972c82e07ee703d324709496b716/uvicorn-0.52.1.tar.gz", hash = "sha256:112ec661814189acbccd3f7b86460147cc065fc92c0821afa78918780e4354dd", size = 100571, upload-time = "2026-08-01T18:19:30.732Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/18/0eea75741ee812e9f598b687619ce2454f6c3a1c5cd21ea990ec6bd26f45/uvicorn-0.53.0-py3-none-any.whl", hash = "sha256:e8dca71ec86dce5f04e333f0d56cdedf942446e6643b9cea1af0d6d3a02cb03e", size = 87081, upload-time = "2026-09-14T07:44:22.179Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d5/68e6e9bca63c0badf67002890a46d3784c958de45b65e1275ec583ca1f06/uvicorn-0.52.1-py3-none-any.whl", hash = "sha256:e4403f9d93188cf9d1088e9f40e3acd12630e2df8675316704379a7fc20fff6a", size = 79859, upload-time = "2026-08-01T18:19:29.294Z" }, ] [[package]] @@ -5644,23 +5412,23 @@ wheels = [ [[package]] name = "wcmatch" -version = "11.0.1" +version = "11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "bracex", marker = "python_full_version >= '3.11'" }, + { name = "bracex" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/43/30e407989e313677dbb9d5f045f966549a7254834571e342eaa4b55cc67b/wcmatch-11.0.1.tar.gz", hash = "sha256:1ea2b4fa678b8ca268253798d5963935df39132d47c3e241c0a0732224005e7d", size = 144662, upload-time = "2026-08-14T15:20:40.477Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/25/1da725838132221e33568973da484ff43813662ccc06ebf7f6e3abddfcd5/wcmatch-11.0.tar.gz", hash = "sha256:55d95c2447789712774b198ceec72939e88b5618f1f8f0a9b605bf7740b63b96", size = 141360, upload-time = "2026-07-10T05:50:24.183Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/77/7a02b0f05b3ffcdbef9719ce3ee0b508d6a29b58e95299f1580055671db3/wcmatch-11.0.1-py3-none-any.whl", hash = "sha256:fd149ecddb9f0a88ea780017d6dde17c994e494e7f7303d4e3c9d6251f978f4b", size = 43449, upload-time = "2026-08-14T15:20:39.379Z" }, + { url = "https://files.pythonhosted.org/packages/28/12/f38b6fee116274d7221743caab07d765032e1370bb54cad8714f87aeb0e8/wcmatch-11.0-py3-none-any.whl", hash = "sha256:3a5977ace27e075eef67eb03d539563f1a19018b62881949a42932cf66926934", size = 42914, upload-time = "2026-07-10T05:50:22.995Z" }, ] [[package]] name = "wcwidth" -version = "0.8.3" +version = "0.8.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/57/ed58088fafdf4c55a0ad6bde846502567645424d7ebf325230b9237f4085/wcwidth-0.8.3.tar.gz", hash = "sha256:d128512515fbf4612e0ff21fd6380399210318b7b54a9af59dff8454cf9730eb", size = 1458450, upload-time = "2026-08-28T18:10:06.875Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/0e/57f6bb3024a597b2e8ec4aee710ffe62ddc95af2e2bb1ee7a7abdc22c68c/wcwidth-0.8.3-py3-none-any.whl", hash = "sha256:d5b73dba6158a595ec9370350e7f2637bcac8d6c5e4fde34f30fcffb6103a5e4", size = 331669, upload-time = "2026-08-28T18:10:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, ] [[package]] @@ -5814,348 +5582,275 @@ wheels = [ [[package]] name = "xxhash" -version = "4.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/a5/1386f35da1475fcaeef42581deae73417c6d2a6a0b2d2e8914de18844dcd/xxhash-4.0.1.tar.gz", hash = "sha256:d55bf4ef10eb09b8b6866790e083d26d087d84caa3cc0946ba87c3ca7ecaf7b7", size = 101513, upload-time = "2026-08-17T08:24:08.557Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/de/6854b311cb468985de555e49717357ba1de8ffe4b08eda3f4c522a418fda/xxhash-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3f68fe400ceec235f3e4a4b02a28c2fd2d283584a193223c921dd4c48f1d0754", size = 38470, upload-time = "2026-08-17T08:20:33.331Z" }, - { url = "https://files.pythonhosted.org/packages/91/2a/7d79952633fccbf9c2a59cc1dfe9d073f9edfceb052ba9bff5075e31408d/xxhash-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b1dddc257279417d93c9e59420d49ef90aece90d7a01996db3aade74b0281b1", size = 36229, upload-time = "2026-08-17T08:20:10.259Z" }, - { url = "https://files.pythonhosted.org/packages/70/6a/6a6f4220c39bae1636eb3f8ef217359b8afe268493ee858adf9002130257/xxhash-4.0.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4972332c079d6aad69c4620a68d015a4ecb33141583f70d642cf9edf6a713763", size = 243168, upload-time = "2026-08-17T08:20:07.211Z" }, - { url = "https://files.pythonhosted.org/packages/c8/03/a1d745b324bede7af8a274d889d25b758402629695499a957375cc5fe994/xxhash-4.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1b603d0686c99fa0879f104a74e7db58367634c6e50ba827bee9aa095e23205", size = 266061, upload-time = "2026-08-17T08:20:18.253Z" }, - { url = "https://files.pythonhosted.org/packages/0f/cd/55c7565db23d2d29a2e31ea9dd0001ad3f4729298f42ba32967dde7644ab/xxhash-4.0.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:33fd538191f47071deef6b1f676535e2aa770f1fd150ae4cc75a34c9e930be3d", size = 287357, upload-time = "2026-08-17T08:20:08.901Z" }, - { url = "https://files.pythonhosted.org/packages/72/31/c967c98cbf151df6ae8756fc9821b1f78d1feffa8420ff2ad5645f27f98f/xxhash-4.0.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33e270d302c95ec426dfa0f5a4e16bff2ab8d7b8a46faa4746affb05e684ac77", size = 270683, upload-time = "2026-08-17T08:20:10.943Z" }, - { url = "https://files.pythonhosted.org/packages/70/98/df9f3c14bc2fb2712ed1497349dc7e8c0b0f20a1f353e2e146d83a1adef9/xxhash-4.0.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3fb1d30d4b6d6e2c4a08e5ac6fffdb2b572d2cfcca15a5509cf4e7a1350f955c", size = 497802, upload-time = "2026-08-17T08:20:17.217Z" }, - { url = "https://files.pythonhosted.org/packages/5f/3b/e5d20b4f602d15fc5fc066f601052a7d6f5a401a50d67fac92098a5829a5/xxhash-4.0.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e27dbed5c4ba033919e4b4ed8dc14e029e91d14a93cd9f920d25277c7df6781", size = 249503, upload-time = "2026-08-17T08:20:40.14Z" }, - { url = "https://files.pythonhosted.org/packages/39/98/4cd03fa7ba791657aa555d0655e89a0d66193b1331e4391114b50227f80f/xxhash-4.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:43bcf2a871f28f16135545415cab3ec43904d4c80425a64598a9e6cebfb2b5ba", size = 333384, upload-time = "2026-08-17T08:20:18.93Z" }, - { url = "https://files.pythonhosted.org/packages/c1/67/a0a076dbcecad2af0cceb873ba4f95475f3955fb81d82f9c5e9f97a12854/xxhash-4.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dc434c946012e6d8a72b10f970ea30755b718251dd7591dbfdabafd3bcb21bc", size = 262463, upload-time = "2026-08-17T08:20:08.719Z" }, - { url = "https://files.pythonhosted.org/packages/48/94/767b68736250813923d74703ef628b0f57ff1c5bf690d7a6082928d1a14d/xxhash-4.0.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:0b1082fd0f089ce9098ed77aad8b777b5d156f8ac601c69cab73811822b8ef07", size = 289405, upload-time = "2026-08-17T08:20:35.493Z" }, - { url = "https://files.pythonhosted.org/packages/ab/61/69d9ec6e85f9933f26b39753b404f97ffd2fc3bfeeb5e26333752595e060/xxhash-4.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd649663ddeafbfd4734eb8abae921dd5baa1242f20bda54e8bc927369ccded4", size = 247989, upload-time = "2026-08-17T08:20:10.759Z" }, - { url = "https://files.pythonhosted.org/packages/a7/66/e6a033879893074bc441faec65587f9ef9cca49ee3cb99ef20c699b014cf/xxhash-4.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:97b455de3e8b1b0b1e4594cb61a468992563f03ca264062fbb0a66b393c01d90", size = 267987, upload-time = "2026-08-17T08:20:20.947Z" }, - { url = "https://files.pythonhosted.org/packages/18/91/a99a412b010cf2cc2bd38a0a44043c894ffa80b46c8d4e1522e40d2ef401/xxhash-4.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:2194bf96d5f3d4e0cb65deba370ec83dda3edfba42155f9384190ed5e51ea5e2", size = 322541, upload-time = "2026-08-17T08:20:22.675Z" }, - { url = "https://files.pythonhosted.org/packages/0b/12/1a91408e66d1716bd278cf55529d4ba251d90c6b694ea78a09dcbd9d36c6/xxhash-4.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:84df5f8da574caadbc0cb1b8866ecc2368cc941f0cd05f677756c802f370dafa", size = 466264, upload-time = "2026-08-17T08:21:12.422Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c8/8abd4c1b90962f794ed9b139767b0a971e5168e8393961ccf046956c0039/xxhash-4.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c09ada495567c9c9a8156c5ebcfb93be7fece0755062d738c972dcbecd0d84b5", size = 246149, upload-time = "2026-08-17T08:20:23.385Z" }, - { url = "https://files.pythonhosted.org/packages/22/3f/e020285d737a712bbfcf01dfdbbec7773c7c8289447a5373540caf2cdf5f/xxhash-4.0.1-cp310-cp310-win32.whl", hash = "sha256:85bdd40cb505a11e0ca04191711266c5fd696ed786ae83849955e457774edc96", size = 34630, upload-time = "2026-08-17T08:20:10.001Z" }, - { url = "https://files.pythonhosted.org/packages/6c/9b/4e8384b299b40664a225ce9deef54c42b3d59f5181a16d4a374ea3503f8f/xxhash-4.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:8ec4777d92fd61a5c8fdeddab894fd65bea301a8092fb5419ec6472aa4d458d7", size = 37058, upload-time = "2026-08-17T08:21:05.846Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e9/d73c870d9dd26f8d6782ecf716b31e836bb6269c888b6bb6e1fcf71eed36/xxhash-4.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:03600a8987849b2bef7be795a60a6052b635c63fa98b718b08ca5ee823691cfc", size = 33289, upload-time = "2026-08-17T08:20:19.707Z" }, - { url = "https://files.pythonhosted.org/packages/0e/58/bc81e25cceab76ce4b400441e3a43312bf3887fedbb2e5f80cc5a7dd7f75/xxhash-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8b4477edc03091f51f5309406d230851c23cf4822029e3bf40b8df53093fff1c", size = 38473, upload-time = "2026-08-17T08:20:34.303Z" }, - { url = "https://files.pythonhosted.org/packages/64/8d/d95e810c9a2930906f1fbd0e38f77554abb8e042a190aa9cbb24da39e9a2/xxhash-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:04f9a24de11a6647666d5302fd73d6a5224ce50ddc965fb0bb44cee736e6bd7c", size = 36228, upload-time = "2026-08-17T08:20:36.641Z" }, - { url = "https://files.pythonhosted.org/packages/72/be/ebcded2a32ba664a17a1737a91b6baa298bcda6942acdad81af81660b74c/xxhash-4.0.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8c5ce76b94ba49f3be8a8f2611abc6564210702c72ac9e237ca2bebfd17794", size = 253292, upload-time = "2026-08-17T08:21:27.206Z" }, - { url = "https://files.pythonhosted.org/packages/52/2a/72d31d787d988d1130253bc34d249c553f02c9387e7dda789b6d5aa7963b/xxhash-4.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4c8842fb19d78b5e8c2a52baf4c8357658cc56c62bc822b86ce0f942f28e286", size = 276545, upload-time = "2026-08-17T08:20:26.726Z" }, - { url = "https://files.pythonhosted.org/packages/39/ae/048f3b1f283a340bef3697fe5a9d4f10de1696a379af9af6b2352c24d82a/xxhash-4.0.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a43418e1a90b4809a9caf64aeb8b0696e3e1f300a323acc1e6ee2f93ae319fcf", size = 296295, upload-time = "2026-08-17T08:20:15.759Z" }, - { url = "https://files.pythonhosted.org/packages/8e/43/e9a593c81445c8e8d669402edb8264144624e7e5e2406df7d33e3c164d90/xxhash-4.0.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3662719007e059abde7eddacf8517142ba076ddc7b30c807260e57d28c3c191", size = 279966, upload-time = "2026-08-17T08:21:22.217Z" }, - { url = "https://files.pythonhosted.org/packages/f9/4c/29da2b166955a300521c0abd498ad4481916c3743949b106192b781f58fc/xxhash-4.0.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:06d7fbd609503c3be5e65cdb6bb2f040d6a98574404e2e1d5c60815c97fff4aa", size = 509850, upload-time = "2026-08-17T08:20:32.731Z" }, - { url = "https://files.pythonhosted.org/packages/40/ff/e39e1900179ce7f0f23e7000d9fc672471a8d05b6b2dc657cb496c8975d0/xxhash-4.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:101aa300de6ceef3d9c77569706330d8921fc45dd82bceed2084f1e9f2557a24", size = 261005, upload-time = "2026-08-17T08:20:40.735Z" }, - { url = "https://files.pythonhosted.org/packages/89/79/76ee26720d13219458f4b2ec0b22f539fe2bcb1f83dc22a24be4cda4e285/xxhash-4.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4296fcc790876a8b0f297edc83d3b088457b774d8f67b4636807f8a2ec69a79", size = 339620, upload-time = "2026-08-17T08:20:50.371Z" }, - { url = "https://files.pythonhosted.org/packages/2f/c7/56b53252d64ecb2f3a0d283b41033561b1bec9c268095150153b694c2e52/xxhash-4.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:57d7fa8f23908d173001c21a9e82bfc6ad997d1b6c270fb121812b7ed158891c", size = 272558, upload-time = "2026-08-17T08:21:33.883Z" }, - { url = "https://files.pythonhosted.org/packages/fc/76/83101a2f2ad3eb6b4b5d571e0aa394a576e3e23121707d507d80197ac385/xxhash-4.0.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85e402dab0f9acd3604539747c6fcc57dc188a18af6ab07eb8189351cd32466c", size = 300417, upload-time = "2026-08-17T08:20:36.183Z" }, - { url = "https://files.pythonhosted.org/packages/34/5d/5be1166ec4fc4bc896e508dc51189a2dad200b373269a430e214fb152693/xxhash-4.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fb59a0dd61fb2ad481c03fda399d78ce57dab6bb62c2c8fdb446a7ba4754b89a", size = 259286, upload-time = "2026-08-17T08:20:21.51Z" }, - { url = "https://files.pythonhosted.org/packages/77/6c/42f6201f13278787c58a6b3a1cd597b47e8665a7d4f68a3440d001c05a75/xxhash-4.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0b20a06454b34f1531fc677c54efe2ecdec691ef9224f7fa919bf2c1363f7ff1", size = 278230, upload-time = "2026-08-17T08:21:47.62Z" }, - { url = "https://files.pythonhosted.org/packages/7f/37/3cb7f149a5a469c628604c33bec6d79764698b315700a4bbf1c6fb15622b/xxhash-4.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f7db035447a0ac8959aa230c5d36545ecf9f547413eb1711c0ca6f0ba1418925", size = 329846, upload-time = "2026-08-17T08:35:10.922Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ee/934eb1e11f4d0e95f3828825f8da4b6d59e338235d63edc3d929769262d2/xxhash-4.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:34ed93e20bfd98d722b902121643791eeb4b1641871e2dc63d0d4c2d93f187df", size = 477285, upload-time = "2026-08-17T08:20:46.297Z" }, - { url = "https://files.pythonhosted.org/packages/e2/0b/77835dcd7aec970db74f5724c94207ada83b3e2f5e1474ab44b9c8fe5ea5/xxhash-4.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6247f5e23ee94f2557ac9dab738a336f607c6ff476fcf66ca70c3aef5eee15a", size = 257552, upload-time = "2026-08-17T08:20:58.211Z" }, - { url = "https://files.pythonhosted.org/packages/da/6c/a3ce7a1a9c4ec9ad8babba591a996a71c474ff9630c5fb04c8c9d8b995ca/xxhash-4.0.1-cp311-cp311-win32.whl", hash = "sha256:348c8f288dc961d6bbd1985c8152a3ed7a85c95df00e82320f0c5215d922a399", size = 34630, upload-time = "2026-08-17T08:21:53.323Z" }, - { url = "https://files.pythonhosted.org/packages/d9/58/60d2170e8cda0891aab25dcaa74797b420c3c6cde8a5bc8372f17b30c0cf/xxhash-4.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ac0f291ab6485bd71f33941f9b92771318332a05d505460b41e893a549caadc0", size = 36992, upload-time = "2026-08-17T08:20:41.973Z" }, - { url = "https://files.pythonhosted.org/packages/ac/de/b229a39f9bbbe30cbcf9afaaa8993cb65286715c90a3b058c3769196ae02/xxhash-4.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:72f34834518157a75e7090f328ee7a16c70c804cfc7c694fa069cc888e9fc03e", size = 33289, upload-time = "2026-08-17T08:20:32.176Z" }, - { url = "https://files.pythonhosted.org/packages/26/6c/dc7cffeadd06336cd934947187cd38abb263103bbc552ca0f55fe4ff595a/xxhash-4.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1ee523f51718e41753f04f7102bb4dc55a18d2ea5cbaceef8ec7ca08571bd428", size = 38444, upload-time = "2026-08-17T08:21:54.332Z" }, - { url = "https://files.pythonhosted.org/packages/75/c9/cf736f6db8c3273af18925061572db0d4357818a9ce425f4b5fb0021918e/xxhash-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:515a822c73abbf6a0b7c70976d9662be342835c9d78b8dc7c023411f39c35dbc", size = 36195, upload-time = "2026-08-17T08:35:13.004Z" }, - { url = "https://files.pythonhosted.org/packages/da/a2/ca1929354b6851529d0148f7f335b5e2b0281f83bab3e19f0896dc579796/xxhash-4.0.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f5d031f35962e5483a613214e61f09fe24ab523062c3646d592dc16c4a217451", size = 253113, upload-time = "2026-08-17T08:20:52.152Z" }, - { url = "https://files.pythonhosted.org/packages/de/bb/542005206af59518bc8d78a210f1e0172217bc53beb32f64a5b632e72b6b/xxhash-4.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da0264844a09b538c894e5eff25313d941deb4dedec2131b98418a71a3c9944e", size = 276525, upload-time = "2026-08-17T08:21:01.886Z" }, - { url = "https://files.pythonhosted.org/packages/1b/df/607cff25dcb0f1d35c3b04493f6ad8471edb03fd4eacbdcc5ceddef1f3e9/xxhash-4.0.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1642907941ee4b75aacc3db688af52ea02ca2305ab22af7ee686ed726b332684", size = 297703, upload-time = "2026-08-17T08:21:57.958Z" }, - { url = "https://files.pythonhosted.org/packages/15/ba/9d2275eea0b9d9c6b02921be23f7588356c60df95c763b25f0e045894d43/xxhash-4.0.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4af350bc3f329970c0e3a59af84a8a30998bf8a9167eb50cd48e59baaa1d7bec", size = 280252, upload-time = "2026-08-17T08:20:47.299Z" }, - { url = "https://files.pythonhosted.org/packages/1d/aa/2299d9f6369e550aef2abb64945e39daa34412725aa46a20d99b74d76f67/xxhash-4.0.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8ba782ca3bf1e81492611152b9a0d5264971339e95e34d69de0ac2c926be496d", size = 511041, upload-time = "2026-08-17T08:20:36.771Z" }, - { url = "https://files.pythonhosted.org/packages/83/97/31bd8b8279e6935a0719f6910ced15e9d5a2cd554b253f6027ce1b5a1c2c/xxhash-4.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:237b8f63a2a0fcfb1ffc06e21dad23add44e6d354b2b014364a1d41e419a4dee", size = 261812, upload-time = "2026-08-17T08:22:00.469Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c1/d180a2da23c105d8e0b02d54f9f5841013fc81c233010ec781e31f1aee4c/xxhash-4.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:81507a68ba84c55241fb61cce1469f473a5da4205fc8ef6f698e5948eea8dd88", size = 339878, upload-time = "2026-08-17T08:35:17.626Z" }, - { url = "https://files.pythonhosted.org/packages/a8/3d/f584cd3172fe934f0f5a0a3917d0d7ce781f74d794fd43bb72be71c3ef6f/xxhash-4.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f1ea31d61bcd2cd2f3ec4ca80a64187bbd7948f490b63cf0dcbc6e717b4c1e9", size = 272871, upload-time = "2026-08-17T08:20:56.067Z" }, - { url = "https://files.pythonhosted.org/packages/34/50/2c7956b2b551682e00b9aebce9ceb0a991a131d65f9850c09f5f9760be2e/xxhash-4.0.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:06713a5aaf1d0905c5579416c020c02e42b3ceb931e86c7d3b7fb85403dee3f3", size = 301440, upload-time = "2026-08-17T08:21:35.911Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a2/0739f6482184a8026f4b022718f5f815d352059312e80696825433f0a8e7/xxhash-4.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e8cda075b10bb3917b002c74a04f9e02b7d13b5bf732571404d51c52b11c7329", size = 260157, upload-time = "2026-08-17T08:22:01.416Z" }, - { url = "https://files.pythonhosted.org/packages/a1/25/b31a7bcf1d7d116842812e54f9b944843b4236ea4fa85634e8259f342212/xxhash-4.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c10b9206753b64aa791b35b201485477525b26fdec5bf86e8364c388a03e2592", size = 278233, upload-time = "2026-08-17T08:21:15.674Z" }, - { url = "https://files.pythonhosted.org/packages/db/e8/5293bae090fc6119dbc5fcf5c4cc0e1536394b52d73b7904d033836c73db/xxhash-4.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:f3e1a44af01b6692de0ec6caba5f0bf93ceb36896e02b7fc00952c6ea7ef39e1", size = 330270, upload-time = "2026-08-17T08:20:51.128Z" }, - { url = "https://files.pythonhosted.org/packages/72/9e/e2ab12d40921f3f34c9317637d65e011aeababf8288356ea8d527de2c1d0/xxhash-4.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6fc415b5568bd9accc7187f1729a99707330c0a67a8b9f93c1149ed573ed75d", size = 478555, upload-time = "2026-08-17T08:22:04.183Z" }, - { url = "https://files.pythonhosted.org/packages/6d/32/c6148d39a49efa95f39b4cf0d41ef35a487f3b30f6fb1fc8fe8d8eab577e/xxhash-4.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:96d8de55029d42251945531f6aa7590c32b48163c66a43bf29d8657d7446a377", size = 258174, upload-time = "2026-08-17T08:35:21.18Z" }, - { url = "https://files.pythonhosted.org/packages/8f/fb/0b04b68d6c5bc71c7a2c344f1287327b67e607f28fbcfd937697caca64b6/xxhash-4.0.1-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:0163b5d259de23ae9e07b7eabf435ce4704f6f205589a2b154e6af4be985ce1b", size = 20767, upload-time = "2026-08-17T08:21:00.806Z" }, - { url = "https://files.pythonhosted.org/packages/a6/be/476092aba34d1fcd313e1613a3bb3bc692f253d167b54bc90049043b5034/xxhash-4.0.1-cp312-cp312-win32.whl", hash = "sha256:1216f7ba5683f17a89eb7dcb4bc50a0b743dfe1902278d7b3d0786f538118433", size = 34669, upload-time = "2026-08-17T08:21:49.486Z" }, - { url = "https://files.pythonhosted.org/packages/aa/02/f9413d94fae43cec6d1a74c4f12156c6f4a7f5fd50e1d34defebdee3dec9/xxhash-4.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c2d525a3afabcd8e3549d85fc7e111fde6bc302d06a1893fe73adb79823415e", size = 37073, upload-time = "2026-08-17T08:22:04.886Z" }, - { url = "https://files.pythonhosted.org/packages/c1/83/6fe93c1b95acf962bc61a246df09dc2dcce895ccfc1080c9f48d0b652b92/xxhash-4.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:86b2b12bec60c678ed8f5cca0258ad93a8928ebddb6ca7732f0875afe1451d1a", size = 33299, upload-time = "2026-08-17T08:35:12.708Z" }, - { url = "https://files.pythonhosted.org/packages/f3/dd/c707286b527722f776e1fb81dd202c45623355ba1a2972337a2a26075b2b/xxhash-4.0.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:8c9fe122444e129881afd1d4d1c7ac0d3ce2d91b68c2b40173b6025ff1c31f9a", size = 43639, upload-time = "2026-08-17T08:20:54.945Z" }, - { url = "https://files.pythonhosted.org/packages/1b/3b/bb71639a0f95635f61936a6f2653599c4261b645ddddd8d00f9dfe3613e2/xxhash-4.0.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:1f3346c5c287ac3c7f38b20380f55e8768230e7252af59fabcf3b87ab21e4256", size = 40657, upload-time = "2026-08-17T08:22:12.616Z" }, - { url = "https://files.pythonhosted.org/packages/3c/91/76f3f5385faa9886a36f21fcc603f40b4c0c40ce622382f133160c48b4d9/xxhash-4.0.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:4e5141543c7f7fe3087500bbb4ac2845cb528a980aa91f8f1e661e2292ff4a5d", size = 34708, upload-time = "2026-08-17T08:35:24.614Z" }, - { url = "https://files.pythonhosted.org/packages/9a/4a/f48f0e3e1b1ab072979fff2a5be899234e28090883e8b519d0b10215d708/xxhash-4.0.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f09ee747e2a5f876cc5ad56947734811828335e13b403dd8ea1e06d77a9dd48d", size = 35650, upload-time = "2026-08-17T08:21:09.337Z" }, - { url = "https://files.pythonhosted.org/packages/c4/53/b73d7472b196101ad1f57ed0674af3af803ac3e9ec2feadd650a7b262562/xxhash-4.0.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:acf52474b2494ef66dc7e0fb6d5e2b50c18313039ad4d275fbf9f9907c804bc5", size = 37958, upload-time = "2026-08-17T08:22:10.616Z" }, - { url = "https://files.pythonhosted.org/packages/d0/f2/024946ad8fa532074af4e4380179da54b7ec9facc8bd0b279ec0fac4e63a/xxhash-4.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1b3cccf75eeb5b01639b2feadb042a8e07889293b7ca72fa2985e7dcb64763cf", size = 38032, upload-time = "2026-08-17T08:22:09.535Z" }, - { url = "https://files.pythonhosted.org/packages/da/e0/934af8d99bb5885711006bec30a691f728edd513d2c40f053f887d8e7577/xxhash-4.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cd878d32f5c6cbce9783f8d6897561fb772211edba9dde49d85672b88ed45276", size = 35895, upload-time = "2026-08-17T08:35:16.53Z" }, - { url = "https://files.pythonhosted.org/packages/20/5f/a8011f6a1558f7ca66d9077bb4f192b1871afcea62fbd5733605d2015755/xxhash-4.0.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:41e579025a6e13a99e6d71e39c9cfc621a0dcdbbf19106325e145fa858f2d794", size = 259464, upload-time = "2026-08-17T08:21:06.72Z" }, - { url = "https://files.pythonhosted.org/packages/ff/89/9665a44397547e7a3d58c0942425a976d58dcfd4b538f33220a312bf6912/xxhash-4.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74379a577a9f3b6afbdedf1b90e5c7764467051977f18a326d7d607336d743bd", size = 283949, upload-time = "2026-08-17T08:22:17.003Z" }, - { url = "https://files.pythonhosted.org/packages/34/2d/78774141266457468f29f3f5803092df4db87d8148ba74e4debd041649db/xxhash-4.0.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:acb31ecdd1a97fab5cd39a84ee9f515e727d319f796fec48703b8339b9998360", size = 303898, upload-time = "2026-08-17T08:35:27.951Z" }, - { url = "https://files.pythonhosted.org/packages/59/48/d78d22de576b42528bff87c14207de50de4f0b888221a50ff7c9d675d670/xxhash-4.0.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5b7875ac1a2edcb691f27642b8b94b904baa6bcecb7d79c72df2228ba8cb5c51", size = 287241, upload-time = "2026-08-17T08:21:13.042Z" }, - { url = "https://files.pythonhosted.org/packages/4c/de/7a1755a59c59fd46176f293bbdd99e399a6537ba9537fc723aa4d1bf6e27/xxhash-4.0.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4751f1d7eecae6b2d2a773630f1a7248f125c9a92a456694d03c15bceffc9d68", size = 519856, upload-time = "2026-08-17T08:22:15.35Z" }, - { url = "https://files.pythonhosted.org/packages/6f/fb/76580c08e916507859b0f335393cb5fdc59452c4402edbc6bcca6e47e7df/xxhash-4.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a51b061d54cda8b83e62c44458bfbf0dabbef9b975dd9649952ba5076b9f349", size = 268572, upload-time = "2026-08-17T08:22:14.533Z" }, - { url = "https://files.pythonhosted.org/packages/d0/2b/1abde3e07b8f2077a38b4fbfaf764115008bfe0ff03bc7756a52c9fd0607/xxhash-4.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:74a164e8b63f1e9cf35c9a7809d082b033d1a00e7375d5d814415436e7867e57", size = 344967, upload-time = "2026-08-17T08:35:23.569Z" }, - { url = "https://files.pythonhosted.org/packages/5c/15/80b6ddf0732eef48a8b5fe717398274794392bd6dbe82af38d189d214772/xxhash-4.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f5e5c6df4b703afcbe9352d238a51efd97c3b91fdc3a2052e40fdacb1e7505f", size = 279956, upload-time = "2026-08-17T08:21:24.97Z" }, - { url = "https://files.pythonhosted.org/packages/77/e0/11cbc43c205bf81fad50d69c7319cd1b1ccc01a66cd4fb8766357126c43d/xxhash-4.0.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d54b8ae068af532c8cdf56abb9e09a60fbe7b10792444c9c27987bb6d3b450fa", size = 307583, upload-time = "2026-08-17T08:22:22.541Z" }, - { url = "https://files.pythonhosted.org/packages/1c/11/cf0bc07feb2791045b6ac075d4bf64f1a5beedef2f46ae70d7104d63a19f/xxhash-4.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1749f0688020209fe0d357ce1e1cd9ec9c6161ed0405ea949d24581c4c43fa91", size = 265848, upload-time = "2026-08-17T08:35:31.298Z" }, - { url = "https://files.pythonhosted.org/packages/d4/c4/7ada4bea2a2795073dfc42d96842930efbe7a0c1857ef4b522e4e90e5d83/xxhash-4.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:94ac8a6b8c47951173f0b67bf862bcb971bf24e493b9fbbdb0e010cbbc7d9f54", size = 284409, upload-time = "2026-08-17T08:21:23.156Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f4/d8ce83dd6b99ccfbdadaf2db968ae40334d2e5f73a0297e593b9ddb3df39/xxhash-4.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a33de7633c948ab2dc144af370a66e7e7af29b425dcd0f7e4f59689fb9391b53", size = 335921, upload-time = "2026-08-17T08:22:21.802Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9f/f47d8724bd8bc45b395b06b7cacea2dae0d00031af1b707184a091161df6/xxhash-4.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:247ece770647c0aef080561fa996f9774b4dadce2d0c42eeb98229db7dcf820d", size = 487023, upload-time = "2026-08-17T08:22:19.729Z" }, - { url = "https://files.pythonhosted.org/packages/57/54/2d87098f3371cc1e42dd04d2285ad56bca4c56667bc501bff02d2b9fd6b5/xxhash-4.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a4553d36cc0b7fce1f35ba8a94dfd775aa3ed12f5eab2dc3b46ac75a0706b0bb", size = 264333, upload-time = "2026-08-17T08:35:27.001Z" }, - { url = "https://files.pythonhosted.org/packages/27/b8/93795ca5898ec7d7d0455283ad261c0fc76b4f0c0a69e86233bd7badb0bd/xxhash-4.0.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:87aa309a93bd5ec13f14309a305ff4e9bf74c5363fc46c264c0a22edfd5b0670", size = 20581, upload-time = "2026-08-17T08:21:39.207Z" }, - { url = "https://files.pythonhosted.org/packages/b6/96/926f7335a0a1647952c00421e8da877f658094f61336306c7cadc335c94d/xxhash-4.0.1-cp313-cp313-win32.whl", hash = "sha256:cba763d84b06bda2c38d5185dee76f1b9dfdc0789e96e476d9e10005526d0788", size = 34449, upload-time = "2026-08-17T08:22:29.362Z" }, - { url = "https://files.pythonhosted.org/packages/ea/61/8a5aeb811de093bab3434e77eff0e9461624a1a56a6a93d315d080aab2aa/xxhash-4.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:97b94fb29abf21f5f0bde15f7dbdd3a4aa2dc59f37026adc7b4bee8563b84375", size = 36520, upload-time = "2026-08-17T08:35:34.852Z" }, - { url = "https://files.pythonhosted.org/packages/04/14/97f3c74000ca36955e9cb86f6d270dcd5848b5c65afa623453f5cf2d83d6/xxhash-4.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:08ed8da18cd4fd0a6a5d6a444852d8fbd0e565388a74a4937085451b5f1a312a", size = 33428, upload-time = "2026-08-17T08:21:31.713Z" }, - { url = "https://files.pythonhosted.org/packages/81/0e/ea406a02b561d3275232ccfdb3e29df80f7a65414940e3a15721c7bea40f/xxhash-4.0.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:af05a3f650220a6c59fa0ad2410249f2d2470a05225807c378fb67458693f8df", size = 43747, upload-time = "2026-08-17T08:22:31.37Z" }, - { url = "https://files.pythonhosted.org/packages/f9/f0/b0c94d61ccf6b5d1f8847b58ef8f923125ac4919ed5bd0eb082750ca7cbd/xxhash-4.0.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:a6e3653df1a70b8ac4191216324242e4be2bca18c9a7c10934e1bd56dc7ca15e", size = 40749, upload-time = "2026-08-17T08:22:29.431Z" }, - { url = "https://files.pythonhosted.org/packages/2f/c5/8085881a538983be0fd1c865d5df236242fea496044e2c8ca32b9f2ba39c/xxhash-4.0.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:4528cf80ebbbf57d40edfb31521ae265daa6dd636d615b1cf0ac86209579e59d", size = 34734, upload-time = "2026-08-17T08:35:33.68Z" }, - { url = "https://files.pythonhosted.org/packages/d3/94/8803d13c968fc75ca434eea991d29ac5fd8a36b4afc9a6a9803c53933db4/xxhash-4.0.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:90cb2a1c9cc503a054a19612b48ff6e8e47805f618bdb3224a07568aad03a37e", size = 35671, upload-time = "2026-08-17T08:21:48.322Z" }, - { url = "https://files.pythonhosted.org/packages/85/d5/ad91d7f0fd294190d37c08236fe661f5c4e3f83dcd1a121877a2e64681ce/xxhash-4.0.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a949b072ea59c6eca0811ccd9e95133cc50d2afda8d464b5b077c78f78efa269", size = 38094, upload-time = "2026-08-17T08:22:39.763Z" }, - { url = "https://files.pythonhosted.org/packages/89/f4/2b7ebdc1869caca5f02c4cba8379b631050d3c3d4adb9187e4dc1a6b8d3c/xxhash-4.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:79a3203aadf39637869dfea1185227d8452844d78b837e54fb1117b4d34ba5c3", size = 38244, upload-time = "2026-08-17T08:35:38.081Z" }, - { url = "https://files.pythonhosted.org/packages/90/9d/f66cf6935f528e575f1ae4d6560d376e7587569747186f4fae8777cadc1b/xxhash-4.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d9f3848ffaf010bdbabdbf4c25641fa258b6227ff27bc74a4d06edef521a4873", size = 35904, upload-time = "2026-08-17T08:21:37.358Z" }, - { url = "https://files.pythonhosted.org/packages/07/29/34569d7b482f0dc060074faafd163c588f915cbc3e3e218f1ffd8a3ad340/xxhash-4.0.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9283d9dd6b44acad35118e2976fc763a065509e4118debdb61916ec322ed17b9", size = 259595, upload-time = "2026-08-17T08:22:38.153Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d2/a2370acfcd48732cf5c2b87f06cfbf7fa51c0ce0dd736bde42939eb9ebf7/xxhash-4.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c7c642a0f79c3e3cf2965475507574d3d1a50ec71060039d60cb87358667cb2", size = 284279, upload-time = "2026-08-17T08:22:36.396Z" }, - { url = "https://files.pythonhosted.org/packages/08/15/17d33c24e6c4a1c0b9ddc5584f0c25d51d48b34bacde1416a2235a19db4b/xxhash-4.0.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96dedccfb09a73a25751053a183159b88f4ee75f388df8166040c152ac0531c6", size = 303973, upload-time = "2026-08-17T08:35:39.22Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e0/4ec0d69ad5738729098a61e631b7ed2df22a922b0e03014b597c72bd863d/xxhash-4.0.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81664268dba92e037b740ecf37fa02f1cab4a391f93f28e35792b3341c60648f", size = 287535, upload-time = "2026-08-17T08:21:52.158Z" }, - { url = "https://files.pythonhosted.org/packages/0f/8b/4f9b17e7a9eb71c65548ecddd9c18b84e3c18ca41c4d436ad2a3000d3f7b/xxhash-4.0.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:839f58c5bd9989875be0fd28446dbf32cace2c2cd8bf2f6762acdc38a95cd1aa", size = 519257, upload-time = "2026-08-17T08:22:43.272Z" }, - { url = "https://files.pythonhosted.org/packages/68/35/3276b3e743b8ddbed9c3f71c76d9dd6a75d72aa4e678b1447b635cfd92e0/xxhash-4.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ffa44b4c7c5d0ffa31356b4428659516c0e47647825c74079a296b3857b6d99d", size = 268190, upload-time = "2026-08-17T08:35:44.985Z" }, - { url = "https://files.pythonhosted.org/packages/08/d4/f1555de3c96721320930dbb7988c8482d82b85970076aba1a8d40e83ad43/xxhash-4.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e681a6fc7e4f715252b9b5acfb30536ec7dd1f75033a32dc617e6fa95af1a3fd", size = 345553, upload-time = "2026-08-17T08:21:41.025Z" }, - { url = "https://files.pythonhosted.org/packages/ac/98/c28908f27007087b61139d290f908dd827ffd40b88af0c43f9e1a1a7ffd5/xxhash-4.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6301d92545c591ad31c3e050aa40a5f8a4c16413f1f9e6f9322c6f0f9d2b736", size = 280499, upload-time = "2026-08-17T08:22:52.236Z" }, - { url = "https://files.pythonhosted.org/packages/a9/76/3ef57622c65816348f8196273485baab4752aae064959901e85cd867e067/xxhash-4.0.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6efb8f21cc136c79b3e5bb747c8682d37916fb202cdbbc32182de5c4e47f821f", size = 307211, upload-time = "2026-08-17T08:22:40.815Z" }, - { url = "https://files.pythonhosted.org/packages/8a/4c/5804504bbc808968e57d6a50286dd8f8cc06e0ddd6e4ab4b1dc89ae42f35/xxhash-4.0.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:760de77279e9cf9c81d012ce0705cba13afccee9b09c480f17d778c8c5cefae8", size = 265865, upload-time = "2026-08-17T08:35:42.727Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ee/8572fdfd70e7aaaf150af899871c2cc0bb88c3295ca82172a31e04ca5168/xxhash-4.0.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a16a3fa6936e36bb1414d16a6bd012c9033e5161b68b426805b61d895392437d", size = 284545, upload-time = "2026-08-17T08:21:56.965Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f8/6eadcca0904660c848b466524e82a233d16c9d2d5258433aaf3546142d86/xxhash-4.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:9c3c4b9aa9a27196b921197f7daf9e6c1412739df06a99cfa6e923879362eff6", size = 336022, upload-time = "2026-08-17T08:22:46.346Z" }, - { url = "https://files.pythonhosted.org/packages/27/df/4aa107b81602d6d6d09ab5a607c530d2d3a6b28e2e9a59b01875bd877c54/xxhash-4.0.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:863f3d3b44110f7243e86cf994aa5c5d88f2348b6e84ab4402fadadfbf9f7da7", size = 486671, upload-time = "2026-08-17T08:35:49.016Z" }, - { url = "https://files.pythonhosted.org/packages/45/b7/b2bf9b5301e9cd5f2e335fea8da0f5cf209a6594cb1fe77754774ad4a6fd/xxhash-4.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63aa52659bc32bb9bd7cb5caf523b4d14429a477762cfac886132d687c1f80fc", size = 263744, upload-time = "2026-08-17T08:21:56.165Z" }, - { url = "https://files.pythonhosted.org/packages/0b/96/35b1c02177ae26234892c2310fb4822ba62411acccbf425ab8f9fd99354a/xxhash-4.0.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:67e57b834e07ed973cee7b6da1548ff28a56458d77696fd2a5f397f340694848", size = 20563, upload-time = "2026-08-17T08:35:11.924Z" }, - { url = "https://files.pythonhosted.org/packages/51/c2/a06300b165fbd6b0cb4a9742987f2e997a9f447ce3bf7c6ac97b862ce62a/xxhash-4.0.1-cp314-cp314-win32.whl", hash = "sha256:b6c1f9c59bbe593f88a0aad30be4150f15bd57bd64efb95feeabcb8e563f1ecd", size = 35151, upload-time = "2026-08-17T08:22:44.283Z" }, - { url = "https://files.pythonhosted.org/packages/06/96/c5b37296b78f80fc97124c0fee0c7bbd1bdb6f3b18bcd8748bb113b2d8fc/xxhash-4.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:da544672efd9ad76077928a3e6c5d894e52ce82d3bf14002db4a1bf17d1a36a2", size = 37156, upload-time = "2026-08-17T08:35:46.551Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5e/248f9cd169c2fb62236bedfba246d213bce728f74901e99047e3f3c55875/xxhash-4.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:d0d24a4f3fb63852cd09af46ae4b7a4d00cc8b8615a046dca543786e728d1056", size = 34379, upload-time = "2026-08-17T08:21:59.446Z" }, - { url = "https://files.pythonhosted.org/packages/58/c8/db1d37c0da0324d0298f6abd931ca1d4736e049d9f2081230a8421da74d2/xxhash-4.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:349775ac30372b344d2338b2a168c0a1312a644194da25b8bec476d55761a128", size = 38656, upload-time = "2026-08-17T08:22:49.119Z" }, - { url = "https://files.pythonhosted.org/packages/c5/8e/e18998ec465fb977bc74272e5bf3c2e886c13b014cbef916cd607802c709/xxhash-4.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:43e5f9169e73d0f0db33b5f6b8554bcce69ac278c966daf83d5eb4eb2f13829f", size = 36306, upload-time = "2026-08-17T08:35:52.853Z" }, - { url = "https://files.pythonhosted.org/packages/ef/1a/b83f86f8a987a3cbcb7e005a6824ff64aecae35abc1395a0d44ee16c3319/xxhash-4.0.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4a252fb862b0ae2590587e625f47a0e03da05cf0205e8830b67b6596c06038b1", size = 273729, upload-time = "2026-08-17T08:21:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/02/4e/2db15aa8508e0cd5b632927a53b98234f24039ea65377e6cf996c06d2d4f/xxhash-4.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2df3ca8757dc381e75e90a4d7995a6324f58a923c7145220a7b2c0231f66fddc", size = 301083, upload-time = "2026-08-17T08:35:14.113Z" }, - { url = "https://files.pythonhosted.org/packages/26/94/ed759787ffe802bd8e31cfcdad3755cbeca2dcdafd2f790cd6f25d195199/xxhash-4.0.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bfed61996d618eb90d6eaae0178002e3466a28b06bfc557a7a3a7266378d8c5a", size = 312745, upload-time = "2026-08-17T08:22:52.232Z" }, - { url = "https://files.pythonhosted.org/packages/45/7a/f64b4a4cc8b51e950709207f55f7f56ae9c5af6631dd31d7fb443312418c/xxhash-4.0.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9761ff4a0ffa583fe850731ad24fe82c88cccb7a2294727db0955f3279a4cb3f", size = 301419, upload-time = "2026-08-17T08:35:50.143Z" }, - { url = "https://files.pythonhosted.org/packages/a0/71/bac313b8de073569b8db3152044a7cfcce87a3fa9698c18fe9f914dee6b1/xxhash-4.0.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edccc2ec58435a580f96a48a3ccae8cd0a480824119165dd90108718ad81ae6e", size = 534485, upload-time = "2026-08-17T08:22:11.515Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0c/16b5e419f24e59507ee05626d2bb0deafdb03f9f27783bc0785a9849602e/xxhash-4.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4741d42d59e4e5fa1a86c17ab9c27dc8ea459c700d91b6742fdb9138d9a516cb", size = 279605, upload-time = "2026-08-17T08:22:52.934Z" }, - { url = "https://files.pythonhosted.org/packages/5f/55/5787dd6e2d8d5b61256a5039f6b18c2193c7c1de4a2fd2413288d0d9c604/xxhash-4.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:440c401e146ce64bdb3beb8ff0c84677b6f21307c28a34779071cecee5d4d70c", size = 358924, upload-time = "2026-08-17T08:35:58.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/68/89be41991f3b0a2e91f940bdf3128852c3ed571cf560d98ad0f67024afe4/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5b7979f71d06ae45a769de0699900a246d8cb632db1e8bfdc79ec019063a503c", size = 295305, upload-time = "2026-08-17T08:22:13.683Z" }, - { url = "https://files.pythonhosted.org/packages/e6/5a/52ff0a0cc361aad393ff9a46ffe3aabbcf9c03d6c8f2612da7d553048276/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:62198213fc3e0c56e567894b318ba45834e007d065f84ba6dc9165d21546fc56", size = 320228, upload-time = "2026-08-17T08:35:18.946Z" }, - { url = "https://files.pythonhosted.org/packages/0f/b5/91c60ff22c7f6cd5f6d7a5bad5a2cdcb4c33987dfa50bf13f0d856279b2e/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b3bece52127ac20044311ee73567f9f0893b5de64f9028aecc90cc740cfd525a", size = 279414, upload-time = "2026-08-17T08:23:03.212Z" }, - { url = "https://files.pythonhosted.org/packages/b9/94/9685954804d47d0390871a64bec606a0d536406382d71a784df3a5883fb4/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a865d2d470220e659220fdb59d5b6c4422802d8d6098e1324bc4d12444798914", size = 297594, upload-time = "2026-08-17T08:35:57.881Z" }, - { url = "https://files.pythonhosted.org/packages/89/62/b67ac9412907b7a07a2a0c08c3440b9e4480231a7b3de0767e87011e4564/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8580aab306888224074c7edeec734de0c3c5ccde65b2da4e6c9a5e28f7c0a1bd", size = 348526, upload-time = "2026-08-17T08:22:18.571Z" }, - { url = "https://files.pythonhosted.org/packages/37/ed/6723cc49a9f567d52d01fd7c1741b0f2e3a13e71d15f7ac49d753a20c115/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:2d52dc7c33c1b83082b707f6b7814dc76d2faaa2ea62bd9c5fab4b36f83c087f", size = 499307, upload-time = "2026-08-17T08:22:56.52Z" }, - { url = "https://files.pythonhosted.org/packages/fd/2e/7b10e101ab988d93b791023be7191d7661271d6ab31ac082276b9091042a/xxhash-4.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6a9f98af872355e0c02439e48583958eee00e60b928bb20476460d9d40cb7b4e", size = 274989, upload-time = "2026-08-17T08:36:01.834Z" }, - { url = "https://files.pythonhosted.org/packages/9b/8d/7eabcc8d29cce40621443cff24c07d7306ef574b8956c47ac59f21098005/xxhash-4.0.1-cp314-cp314t-win32.whl", hash = "sha256:a14578102a6081465aec9cf73c76c3cd3f79f0709bdb3b8ae7ab0b54c9d8b089", size = 35482, upload-time = "2026-08-17T08:22:32.336Z" }, - { url = "https://files.pythonhosted.org/packages/ca/89/2a4268e1971f63038b79fb75e3b9c8de942cd77acabbb0c5625352a31940/xxhash-4.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c57963970d359a72262f7fe6be88f945e2334d4bc41462b7f08c37b0abf35ca6", size = 37490, upload-time = "2026-08-17T08:35:22.475Z" }, - { url = "https://files.pythonhosted.org/packages/90/7b/950ecab1fe4cf421d0a6211ddd9a0ac82e39e55c45a111ceb90953dc6c9a/xxhash-4.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:b659fad79c99b0238c7ad7e9d7dbf4eebfea9097c2dba65fa0a4d18a25b29a2f", size = 34596, upload-time = "2026-08-17T08:23:10.001Z" }, - { url = "https://files.pythonhosted.org/packages/c4/03/7dc3b85fac10751613bfedb0e120734e0e8710054abad3f931e9d3843a14/xxhash-4.0.1-cp315-cp315-android_24_arm64_v8a.whl", hash = "sha256:5adf927dca8c47fde7e683fe69efdd81bc865c4db1fb6bb00b391e2b6185207b", size = 43749, upload-time = "2026-08-17T08:36:00.47Z" }, - { url = "https://files.pythonhosted.org/packages/a5/55/bfac071c5b1c6d6a3d48ab1ab96a15e958a1d7061f4afc97804292d87264/xxhash-4.0.1-cp315-cp315-android_24_x86_64.whl", hash = "sha256:c30dd1af66a820820398b26e0d74e7a9aa43cae705924f23ed828cd8e5c26c3d", size = 40758, upload-time = "2026-08-17T08:22:30.209Z" }, - { url = "https://files.pythonhosted.org/packages/79/87/49a260e685d1a74c56a69432a8ee0527ddcbd684a3c51f87edc3b75639c5/xxhash-4.0.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1bc591533fc975614f7e13594daee76af96b8e1fbcf8de76c8773858fa9e7cea", size = 34788, upload-time = "2026-08-17T08:23:09.014Z" }, - { url = "https://files.pythonhosted.org/packages/6c/ef/50d72ed2170dae872e1c0fe333d0908e0a2afbffe74c5c9037d5406a4b89/xxhash-4.0.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:567cbc630302a46a8ecfd943b309ccf5372bb3718f1f3762d452df30f033bcf0", size = 35746, upload-time = "2026-08-17T08:36:05.557Z" }, - { url = "https://files.pythonhosted.org/packages/66/f0/969deaa2bab3bfd5ad5b023442124d2255b9961eef6f797ec74eb8683bdf/xxhash-4.0.1-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e998cb3685b92101ec5de0fb4d9485cf01e50bc418211955c55d98064664cf4c", size = 38098, upload-time = "2026-08-17T08:22:36.906Z" }, - { url = "https://files.pythonhosted.org/packages/86/aa/45ed7d7b8d7b66202a47bf8ff3b77cea28d2ea54dfcdd202b4cfe043e3dc/xxhash-4.0.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:c3074db513c81f764053e3da079312ecf85a50d8350c71f4cc0105d9662a9e6c", size = 38251, upload-time = "2026-08-17T08:35:25.774Z" }, - { url = "https://files.pythonhosted.org/packages/f1/9d/45e7520a7856e13800a5dc8cd038d34c6372429465b163af0c5722f16918/xxhash-4.0.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:3088dadbffa33c29e0518578430a7dff2e901a212e487aefa5faaa0dc06dad34", size = 35986, upload-time = "2026-08-17T08:23:25.854Z" }, - { url = "https://files.pythonhosted.org/packages/9e/0e/5ad466e5fea18c9f9bdc5828c0506f62190061b4a1b0e688aa54969d0a9e/xxhash-4.0.1-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1b50223d92df94d54e1a31469335a2c74b16692e6c1cb726f1e6949514458706", size = 264609, upload-time = "2026-08-17T08:36:04.229Z" }, - { url = "https://files.pythonhosted.org/packages/aa/cf/8f269f85217e3dbd45e31e25e46cc26f3aff0e159ef05d228b4b982c778c/xxhash-4.0.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:427b62d62d4f967fbb10b82a3813e4875c2a6e7e7634739f17265b650c7f65a6", size = 285910, upload-time = "2026-08-17T08:22:38.589Z" }, - { url = "https://files.pythonhosted.org/packages/ca/30/2fc1a16ee0f9501d074b798ebfae52e24fa602c7117f5c4b81de71eada72/xxhash-4.0.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c6370189e8e66b7e608f533b939a9de092ddca6cce084ca0d3d414d2ed5b5d59", size = 306566, upload-time = "2026-08-17T08:23:16.895Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a7/08375cf2b997e1903663fe7525c5973b1987a4f8ad2b8d47463e9143f2ee/xxhash-4.0.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec1a470c6db94ac4589c203921e89ac1bc13e796a8b1784d8135e1893559cd3b", size = 287978, upload-time = "2026-08-17T08:36:09.296Z" }, - { url = "https://files.pythonhosted.org/packages/b2/e5/90a7b404c11add9e53a497d06236152852490c3b2f21e468d97a58f26afe/xxhash-4.0.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37f667dee0f867c42894b34e2a6fe26bf195c0ea4683d9d2b713db023f242c3a", size = 520098, upload-time = "2026-08-17T08:22:41.565Z" }, - { url = "https://files.pythonhosted.org/packages/11/02/7fba10b1b17eb46308f09cc0a4ed513d74dff16b1e22a1c439f011c77129/xxhash-4.0.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f18732adcc271741bd651c3e56fa519d8a237d2cccda01fe3afb226bf87f783b", size = 268273, upload-time = "2026-08-17T08:35:29.043Z" }, - { url = "https://files.pythonhosted.org/packages/54/49/c21b228877357a3be43eeeaa22182ad1685796f415390ada475922c084e4/xxhash-4.0.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b42a5a26607e4b2409fea174773a66f2dff9dfdbf2c1a851bb7b804e2c97535", size = 350164, upload-time = "2026-08-17T08:23:29.494Z" }, - { url = "https://files.pythonhosted.org/packages/00/3c/c15bb4aa33d94b78a5553b52e7fa1070565f0199925aeadec3871de20ce9/xxhash-4.0.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:99166cc98637e8bf550cda2aab07f4f1d5f899c45fbd721801aeabcc9d404824", size = 281975, upload-time = "2026-08-17T08:36:08.139Z" }, - { url = "https://files.pythonhosted.org/packages/18/7a/b1d0388315fe7752b7725b68a912667526a1dd48ed492fcc031ac03f4b52/xxhash-4.0.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:6cf633df84d80a1668fcf61e330791dae46825e395549e7d34f376411e75088a", size = 307872, upload-time = "2026-08-17T08:22:42.206Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a1/037cb2dd8cf725c9565dfe3712b2915c0e0276a9154913dbfcbcecbeb672/xxhash-4.0.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:e259bb7e1e2d8de6b35f430f5c7220b1c0ebf3962d1ba7ec7545980d5931edb8", size = 268241, upload-time = "2026-08-17T08:23:23.997Z" }, - { url = "https://files.pythonhosted.org/packages/c6/a9/67c44422d0ee082169b238ce24bd2796b82d7c21ed953471365df8c508d8/xxhash-4.0.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:704381264b36a18b9c62ecbabe2e71d0fc58c77c129c15355c989b10bf05b6b0", size = 284970, upload-time = "2026-08-17T08:36:13.476Z" }, - { url = "https://files.pythonhosted.org/packages/7f/d0/254a5f51c4014cacc77a26f321372338b924f54e89efb730164ee336d850/xxhash-4.0.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:e90b4bcf1d9eb1010fdaee7c9209fb667e74c0684f3ba17f9032bd7319da90c9", size = 338074, upload-time = "2026-08-17T08:22:51.166Z" }, - { url = "https://files.pythonhosted.org/packages/64/03/f21c4830118d72ef3a958ce8bf2152f49e0d4cf200907616c9be6caf372a/xxhash-4.0.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:a65785e653573fcd1e33062760ab4c3c3440e8e910765018e4b6ed4ad07b54a0", size = 487626, upload-time = "2026-08-17T08:35:32.768Z" }, - { url = "https://files.pythonhosted.org/packages/45/1f/268a689d741d7da649317eb4ce41760140beb4179aaf43a7216fdbe8100c/xxhash-4.0.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e3996ff9b6f99180357024336bf5749a8ad6476a9a2523e535c5212b995b12a2", size = 263852, upload-time = "2026-08-17T08:23:41.871Z" }, - { url = "https://files.pythonhosted.org/packages/a7/f5/adaf8101cd7f143191a0b390600294d83924b32cb13770fde8803dce27a2/xxhash-4.0.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:99054b838b74d8d3995ea0d410976ae967c46207ae22d6ddfc535e809197dab9", size = 20569, upload-time = "2026-08-17T08:36:11.952Z" }, - { url = "https://files.pythonhosted.org/packages/ee/2c/56a5eb8c993420fc07114c08f447a2b66ee996510b4764cb368b9b44c9f0/xxhash-4.0.1-cp315-cp315-win32.whl", hash = "sha256:6c45258a37fc22721395c09927cb982d3e7a83607cab15be7e2416501bd3a330", size = 35145, upload-time = "2026-08-17T08:22:50.038Z" }, - { url = "https://files.pythonhosted.org/packages/67/c7/65f210db43e62157d0fef3b4d4d7b394821e7733c8bb4ece49f91410a725/xxhash-4.0.1-cp315-cp315-win_amd64.whl", hash = "sha256:0ab851b45c70d4992be7cdeeee16f97a0b677408c758c4b1efb1cfe8030bfd37", size = 37161, upload-time = "2026-08-17T08:23:32.438Z" }, - { url = "https://files.pythonhosted.org/packages/33/ae/1a641d1d60ba219756d9ebe907ff0ecf4445adcf4fa96f6e3da57b91d439/xxhash-4.0.1-cp315-cp315-win_arm64.whl", hash = "sha256:a5b21b42a01a343096a1c018d35e9b7aec9c7065dda53ae8da071e37478b2cea", size = 34378, upload-time = "2026-08-17T08:36:15.912Z" }, - { url = "https://files.pythonhosted.org/packages/48/7f/7698b320b251806d1249e513922a626f19027e104c829a611272250350eb/xxhash-4.0.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:44ab12e8cd17d4f001769f00ad465208b4bcb897ed29e65f058f74466b57a98f", size = 38610, upload-time = "2026-08-17T08:22:55.203Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3d/436497e775b647b3b3e9a4ffe8c76c59fa4aa7a9fab6447cb59acf1b50ea/xxhash-4.0.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:45e88111ebe331de478ef8d4293efbe88f3cf8b863386c9a2357136b838e1af0", size = 36378, upload-time = "2026-08-17T08:35:36.18Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d8/17a4f8182b9257898aa2a77c2a45f70233eb8e50681a280e8e09d2ee76e9/xxhash-4.0.1-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bf430c587f447a554c53768ad76b9846fe7c5632180ef6f69c4fce8b0552fbd0", size = 273559, upload-time = "2026-08-17T08:23:51.075Z" }, - { url = "https://files.pythonhosted.org/packages/83/28/121bd5a5c5adb88e0da772c7bef61964cf9da92956a7a237c7d24c4351b8/xxhash-4.0.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adbd48b30e3f82c89fb2b3e6a87cdd28d113b190a5ed0ee2dee286323ee9a621", size = 299133, upload-time = "2026-08-17T08:36:14.731Z" }, - { url = "https://files.pythonhosted.org/packages/11/8f/57c7b6e04642ed738a0d08a31bed7fc63fdacb661d665f98739cc9751b62/xxhash-4.0.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e71b34978e77868cbf2d18c5206a4603f9c644dd7181bec5643bd40141d3b8c5", size = 314527, upload-time = "2026-08-17T08:22:54.224Z" }, - { url = "https://files.pythonhosted.org/packages/8e/18/42793917dbab0ea1ff71458aea4875e17a7263f2797b798af048dc81e867/xxhash-4.0.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:488ca5c5e28ef56ec4bbb12f835b3f1cbecc5f3510062e70117bc6594851932a", size = 299199, upload-time = "2026-08-17T08:23:36.864Z" }, - { url = "https://files.pythonhosted.org/packages/37/60/51dc92443923d8e908d5614f1145d8d696450f9d6c8f1abe243c6f2a0222/xxhash-4.0.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:421b94f3ba7067958d02e38960d987756347aa150df06df11aa68ae1af78c619", size = 531967, upload-time = "2026-08-17T08:36:18.66Z" }, - { url = "https://files.pythonhosted.org/packages/88/c5/d0de77de09661fac71742c4155b1cd65e274f7cc277819d702b6c8ff2db5/xxhash-4.0.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f33cf0baa91eccd2cb7b62bf00f10c2264ef578b71dd33a12962e71a36eb4d32", size = 278764, upload-time = "2026-08-17T08:22:58.15Z" }, - { url = "https://files.pythonhosted.org/packages/08/9a/589929c655aba1bfb2c41ee03e50eec1547c39c3042a66bda9c173a9614b/xxhash-4.0.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:23a4376b4a3183cb50d4d2a3179f887a7773cc695eb2c908e551bec3221b8c60", size = 359876, upload-time = "2026-08-17T08:35:40.35Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a8/c1d8c94d54d91db2215565f4b4151c1593af3e6d27ac4c00fd1e8d714a02/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:38c3d22129a6958846a3098d68bc8e661704461c0be4793ae28836e4690c8478", size = 293548, upload-time = "2026-08-17T08:23:54.951Z" }, - { url = "https://files.pythonhosted.org/packages/8b/67/85d8abca94508a4dd10561d9dea3e6e68843c6986dd6d9c1b3729c8622e4/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:87cbdec1a7dd930079671a60b249f3ca4e773e6fbd0676e21e36fdc9dd0f3b00", size = 318780, upload-time = "2026-08-17T08:36:17.623Z" }, - { url = "https://files.pythonhosted.org/packages/1b/16/2b920ed456b9cdcfc99ddc20c3afe42f9f807ee5850773c12fd891f3c08d/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:6cbf4e21ef0890804b5bb9ad25c48f9c127758d7f6c66bef374efcacc63c738a", size = 277582, upload-time = "2026-08-17T08:22:57.156Z" }, - { url = "https://files.pythonhosted.org/packages/fa/cc/5811b5997aebb8452047f5800d32fc50eaa29d0ba08d4e426f84450b9c2f/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:c101180495cb4ba3617b279a944345c53a5e73b0c150053d1fa8d8af32de9579", size = 295116, upload-time = "2026-08-17T08:23:40.868Z" }, - { url = "https://files.pythonhosted.org/packages/2d/dc/c2f3f9c2f4d6aadb79f17a9f1c9a7ee82638cc873680da044cf29537d2ee/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:c0e6ccc2b19ec8a726b2e26062ac71ea63e15500d6bf85910e42481844fdffc1", size = 347065, upload-time = "2026-08-17T08:36:21.618Z" }, - { url = "https://files.pythonhosted.org/packages/a2/4c/750cc642c92252e10772ec09e1a1d995581ba4c3ceb24f6e2d57c7ce47ca/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:8bcba9456242ebf180a04d9443812fd85ffe6bd12bda464dd116fcece8886ff3", size = 497208, upload-time = "2026-08-17T08:23:17.88Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2d/58693cb13d6395f39b6b9bb40c5e0db53a5df7c9fce805aa7e792f64a1a5/xxhash-4.0.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:83b8c2013edb5dc1f9e7268b6496130705bc48d79c86bb8817b3d210b81a5513", size = 274338, upload-time = "2026-08-17T08:35:44.062Z" }, - { url = "https://files.pythonhosted.org/packages/4a/08/9aa9787586d9b3e92d63343ce7dc24f0f445fd9e74ff5d6e85dd82233df5/xxhash-4.0.1-cp315-cp315t-win32.whl", hash = "sha256:aa6ccc7f31018484d652cf52db020003433f3c9fa83189c028bd807d2adde503", size = 35471, upload-time = "2026-08-17T08:24:05.795Z" }, - { url = "https://files.pythonhosted.org/packages/f0/ab/4615789c333bee331ac417885c50105715eeb8244bfc68d2bc37dcfd63ca/xxhash-4.0.1-cp315-cp315t-win_amd64.whl", hash = "sha256:daade8936c4deaaf7b01561324ce438ba4f885d717e9adc62b4d67212ad7d7bd", size = 37488, upload-time = "2026-08-17T08:36:19.929Z" }, - { url = "https://files.pythonhosted.org/packages/fb/81/49f718beb0c55d0411bc4bd90b50a3fbe5863a0e97a2f4d11682ba13d298/xxhash-4.0.1-cp315-cp315t-win_arm64.whl", hash = "sha256:f00330ac7e24769e2032203f2b01794d670916b0c1799fd261340f1af9499875", size = 34590, upload-time = "2026-08-17T08:23:19.597Z" }, - { url = "https://files.pythonhosted.org/packages/86/79/9127ff42a887a348dc4ce3211cf1a962836887adee6f57078132bfba78b4/xxhash-4.0.1-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:ff48915bf1871a1f19f74c11834c6329443d306cedc0c05fe7fe617810422a80", size = 31836, upload-time = "2026-08-17T08:36:28.261Z" }, - { url = "https://files.pythonhosted.org/packages/0a/e6/f238693bfdd642adb59c99683964d46d9947fe721ff44d3bd850ae675407/xxhash-4.0.1-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:4a76345f5aceb4ec404918edf9c7f2b5507db864dc0d7455982009ac0890b57b", size = 34453, upload-time = "2026-08-17T08:23:49.795Z" }, - { url = "https://files.pythonhosted.org/packages/40/4b/796ace33cdfb75c91ba6d11615c3bd436355b9f3103e05865bbee9abce57/xxhash-4.0.1-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:31d86f9e81f3e84e00131ac7c54caf5119ae4ddd82c09c31cff597c813ce1ee2", size = 38488, upload-time = "2026-08-17T08:23:59.901Z" }, - { url = "https://files.pythonhosted.org/packages/ad/23/2d549e5d5d7759eaf9ac2d2d2ab81ff60f1bb2b52cdaae8e5ec5c6524354/xxhash-4.0.1-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deca2a30d983d240b8375ec2ee0a4288e72042827fc61df2f7671f8467e4cb2f", size = 38206, upload-time = "2026-08-17T08:36:32.193Z" }, - { url = "https://files.pythonhosted.org/packages/79/98/1ee576b27f78e6107ee4ea8ac03e8a52888dff256e57d560f8282c195563/xxhash-4.0.1-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:7c343ee174d417a44d0c3355602c0cbbfa52a04d1bbbf1723378c7d2c8f60626", size = 37127, upload-time = "2026-08-17T08:23:42.705Z" }, - { url = "https://files.pythonhosted.org/packages/c9/c5/8b528f4a394a1eabfd5d8b4271f24fff67fa1aebe58bdd3c64967662e6fe/xxhash-4.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:26fe6238c2d5b11ed5063b9bf4eb290624b004fd074688da6bb079bd564f10d7", size = 36450, upload-time = "2026-08-17T08:35:59.217Z" }, - { url = "https://files.pythonhosted.org/packages/b6/03/909926dcedb64ceee629e18d8dffa758f9d3fdbe01e25530ce2bf0eaf9d0/xxhash-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e53926e76131a74e79cc0b39fa712c227875f180afc68646bd1e1d8a17e60313", size = 33467, upload-time = "2026-08-17T08:24:12.924Z" }, - { url = "https://files.pythonhosted.org/packages/13/b5/ad50456fbfed07f29169bc3fd34e70cbee306a88c17d1a1141a7638de0ee/xxhash-4.0.1-pp310-pypy310_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0718ad66f4ded2411f8e62bdba549ee71e313a2d26ef5060ca3fdbf29897dd3c", size = 48048, upload-time = "2026-08-17T08:36:30.847Z" }, - { url = "https://files.pythonhosted.org/packages/33/c4/83cfe6b591a3067ab3f1339931c91211a8b3864d0ea76ad8184f0c1b0515/xxhash-4.0.1-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2200b98a805351cb3142ae4e1fdcc9e91b5e20f5d30d4862b0b96f92558f4e", size = 42719, upload-time = "2026-08-17T08:23:53.581Z" }, - { url = "https://files.pythonhosted.org/packages/20/2e/0f654f2831abba09d502751e38816759086dd92749501b128b7c3676ea87/xxhash-4.0.1-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea5ecf800b45bdb34afe05a1d0dae1f8ea02a290e50636dccd399063f6b180f8", size = 39477, upload-time = "2026-08-17T08:24:03.735Z" }, - { url = "https://files.pythonhosted.org/packages/3b/d4/375b9e4b719ee70e0a6d9e98e2b60aab09efd59f46c7871a112a2e6b0fcb/xxhash-4.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce6d5cc94a50291d080259a126cbf1e9ba4ac861e6429d2f3cdbb1474f51945d", size = 37244, upload-time = "2026-08-17T08:36:35.452Z" }, - { url = "https://files.pythonhosted.org/packages/ea/4f/e0648288a17d0d1084ca4f7bef206097831988fc86af74aa1dff8f1fbd68/xxhash-4.0.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:554f87034635bcec47c5d72447bf3db7e02da1bf493a0ada010db28a76f891c6", size = 36333, upload-time = "2026-08-17T08:23:52.913Z" }, - { url = "https://files.pythonhosted.org/packages/22/15/34b7f72e9b5a8bfd7e6178de9e1e342bc3de9f07111a5ae26c00506d9edf/xxhash-4.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3c2445edafc300cc40feb6a25a8356a971c30cd0bf47b5349c2ad74c508343b1", size = 33519, upload-time = "2026-08-17T08:36:03.04Z" }, - { url = "https://files.pythonhosted.org/packages/06/4b/e0af324ccf701bf84a7a060bef11c915d45d9e3c5b9caf5b94d62ecb040b/xxhash-4.0.1-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bdd16718b63aa3ebd68aabb79021a40e47c81374852d41a306b9453141bbcbee", size = 47995, upload-time = "2026-08-17T08:24:14.335Z" }, - { url = "https://files.pythonhosted.org/packages/59/46/cc7130e6ca6b41ab72eb6a03177b933c7c74145545c99a8610ecc208c449/xxhash-4.0.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b99ebaf9e816ac5069423b1367ee7e8078fbcebcf62545506bb0608d2f4f468", size = 42725, upload-time = "2026-08-17T08:36:34.144Z" }, - { url = "https://files.pythonhosted.org/packages/1c/24/4f26ff9a7dd0998f6d1036bdddef7ce3e78972a74f7fffa7967e7bc3b7e4/xxhash-4.0.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f484ed57bb3e4142f9d6439568658c38be5f94b702ba00a1ff32c69783b6c66d", size = 39532, upload-time = "2026-08-17T08:23:57.556Z" }, - { url = "https://files.pythonhosted.org/packages/7d/f3/1ac078fc8fceadcf066469acecacb35d2821cbfaf7d6fc5ac2107c7a314d/xxhash-4.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fac4832b638000106207bc44e44b9616a6a416aaee56c62b01d61f3705e49f58", size = 37252, upload-time = "2026-08-17T08:24:06.652Z" }, +version = "3.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/63/71aa56b151a1b28770037a61bd4e461c2619cfc8866a4fcaf1548605e325/xxhash-3.8.1.tar.gz", hash = "sha256:b0de4bf3aa66363552d52c6a89003c479911f12098cd48a53d44a0f7a25f7c46", size = 86223, upload-time = "2026-07-06T10:49:58.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/97/1a8cebf0a6650417f08a18231590e2515aacd5ce39c3ad8b9e013ebd437d/xxhash-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:27a9e475157f7315826118e3f3127909a0fe25f1b43d3d3be9c584f9d265f937", size = 34695, upload-time = "2026-07-06T10:43:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/2f/cf/745b9bc0dd9c341bc074b5fc700db7bbef0f3b69ab21446492296ab37e50/xxhash-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b2ce44bf8f4a1d01f418b3110ff8dff32fd3f3e836c0e06333c3725f243fa6c", size = 32376, upload-time = "2026-07-06T10:43:41.97Z" }, + { url = "https://files.pythonhosted.org/packages/65/a4/8512a901b1d6ad4a9838d1b40385907a879d7e005a5afbec5d39526b69f6/xxhash-3.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:942bc86e9be6fdd6e1175048f5fe8f8fdaaf2309dd1323ef1e155a69cd346780", size = 217470, upload-time = "2026-07-06T10:43:43.572Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ad/0ffd8094ea29579bb2dc42fa74d08570e9ea3d95db561e6b1105e69b9ca6/xxhash-3.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0204701e6d01f64254e0e5ff4255812b1febe027ddd7dda63372e27f98b5e91f", size = 237799, upload-time = "2026-07-06T10:43:45.248Z" }, + { url = "https://files.pythonhosted.org/packages/b3/90/783c6b3f9336bd07449fe672be32cef6833633936bbfda8d3b23ee18d202/xxhash-3.8.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7dc4bdf008f77c88d544849c48c1a40faf25a5eff6cc466de2e8edc37c191fce", size = 262587, upload-time = "2026-07-06T10:43:46.733Z" }, + { url = "https://files.pythonhosted.org/packages/c4/77/ba0316a7c3e661b86830a47ae4987798616ce1b15af8d2a6358e2d89ef60/xxhash-3.8.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c566b123dce7e4867ca518434cdfb9f84e5023771235b2e3107a26c9a41cbd8", size = 238484, upload-time = "2026-07-06T10:43:48.453Z" }, + { url = "https://files.pythonhosted.org/packages/09/79/33001037c1cba90f4ced38b257161c13452024c0db44208f883e2e47f3fc/xxhash-3.8.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9f23083e1bd9d901f844af7a126727c486e7eada9a1a6791c8f7e73f94fac656", size = 469909, upload-time = "2026-07-06T10:43:50.188Z" }, + { url = "https://files.pythonhosted.org/packages/45/90/237eded9dd6ae638083294e5a9f77b317aaebd480a330806b39c192a0de1/xxhash-3.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64af54dd1c3a45a27c04942f9a1a4683322bdd127f4745cca4e02549c1d2d2bb", size = 217166, upload-time = "2026-07-06T10:43:51.816Z" }, + { url = "https://files.pythonhosted.org/packages/0b/6a/8cb439dc9920e1468e1c2d69ef77cbeb4be3b1ae9f4b5344c07a2b59af18/xxhash-3.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8ea8a141eeced4f6262ab6dd71c681ac546a558c30bb586abe087d814b5f85ea", size = 307593, upload-time = "2026-07-06T10:43:53.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/c0607d373c8affea92101a3926c4fc8b026bcf8983e05fd58f3a0380ebf8/xxhash-3.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a98b2f95cab589e0f5e92c48431afb4d56238b8bf6668edcc66166180e9b509b", size = 234702, upload-time = "2026-07-06T10:43:55.042Z" }, + { url = "https://files.pythonhosted.org/packages/5b/cb/f4cfd456624c1f017858168b7ba9443dad810da8aac779a612658450e827/xxhash-3.8.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1b86ae798a976ccbc1d02af6ccb98f5b4d24756b1f65e995f11d10fe071f486f", size = 265749, upload-time = "2026-07-06T10:43:56.749Z" }, + { url = "https://files.pythonhosted.org/packages/33/f3/9006669c04b01206e21b2177425c649461ba188930a052c2f1728d6ec6a8/xxhash-3.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81f4ed9ca9644bc95cd976bfe10f7a4cafab8ffdc3aed52877d4600e445be7ef", size = 221992, upload-time = "2026-07-06T10:43:58.12Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0b/7e6f3eaa05df5e0b6c94aa452b0672801f7031e602081f07fd441aaaaed5/xxhash-3.8.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:cb3fe820c27593f170770d6c8d791936cf6275d9269405fbb7b30a55363c10c8", size = 236899, upload-time = "2026-07-06T10:43:59.562Z" }, + { url = "https://files.pythonhosted.org/packages/da/cc/bbaee4987f3aab1d7b33bb430bb49e940646160af448b9167431c931126d/xxhash-3.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:7345007c12780985de4fd740148776d1eee18c0d41407c6fa1e48c5450304fe5", size = 297934, upload-time = "2026-07-06T10:44:01.132Z" }, + { url = "https://files.pythonhosted.org/packages/a7/97/6bee358660eb8b4f73c00b00b00bc616ebde00e1ab4b67c63486ce360648/xxhash-3.8.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:12eaeaa9ab8b9e6033a1fa5f6b338aaf55ff4df4bee11b59fd6ee03b19186ee4", size = 439315, upload-time = "2026-07-06T10:44:02.878Z" }, + { url = "https://files.pythonhosted.org/packages/c6/50/7e35275f39256bedace0c3cd5be3c72d4ac9d5aecf5e5fdc3530337cd263/xxhash-3.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2a845687219ba3214126f14a8a5861f97c9e065a7d0b8252adb6df13eea86fb", size = 214038, upload-time = "2026-07-06T10:44:04.504Z" }, + { url = "https://files.pythonhosted.org/packages/59/2d/69d02d096ee50bdf3ef0d208d874f52c71b1aa6906066bce3c52fedb8bc6/xxhash-3.8.1-cp310-cp310-win32.whl", hash = "sha256:656256c9f9303e47f07d5cb8ae4468285370adfafd7ba48aea33a458e7697626", size = 31939, upload-time = "2026-07-06T10:44:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1d/e06fca9844919ca91c6587d530cfa1e745830ec73ad38f44f04b25d1bfb7/xxhash-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:27cfc2f1ed76f956f36dfe0c56e5f5a3e94cd91eb78b893f63e2ef2ae404fcdf", size = 32729, upload-time = "2026-07-06T10:44:07.621Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/800648d99039927b5a86d8ae02cd86a556a5ee1678d388216f6b44c8966c/xxhash-3.8.1-cp310-cp310-win_arm64.whl", hash = "sha256:c85949d02c85adf6d786eb94858e124989a632a4e65739835b2fc5761827fac3", size = 29215, upload-time = "2026-07-06T10:44:08.916Z" }, + { url = "https://files.pythonhosted.org/packages/8a/5a/05eaa129555f85476a3e16ff869e95f81a78bbe4647eef9d0229f515a317/xxhash-3.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602efcad4a42c184e81d43a2b7e6e4f524d619878f2b6ee2ba469011f47c8147", size = 34699, upload-time = "2026-07-06T10:44:10.14Z" }, + { url = "https://files.pythonhosted.org/packages/80/59/0df1133958b2228929355e022aab1e958c7b2c43e27bf7f59bc9edfa8a54/xxhash-3.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:131324f719957b988861714de7d6ddf57b47abec3b0cc691302ffeaba0e05e10", size = 32373, upload-time = "2026-07-06T10:44:11.353Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bf/1cfda5b5e6bf26617812b4a31662ef2220d2ad04e0a55b8ff9eb36e56a5c/xxhash-3.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:db77278a6eddadbf44ce5aae2fee5ebb4d061f026b1ce2130d058cd4d7a7b670", size = 220284, upload-time = "2026-07-06T10:44:12.683Z" }, + { url = "https://files.pythonhosted.org/packages/70/93/45dc0ad7913b69e5b08bd039236cf628380e4c9cc76a8a4c6625a328e058/xxhash-3.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c332dd48b8cb050da2bb2a3c96d72b1664168650a250ef9718e423df7989e05", size = 240980, upload-time = "2026-07-06T10:44:14.297Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/f28ba7d17f2c1410ee397982c817ab1bd5b2701070c2d2c373539aad000a/xxhash-3.8.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a5cd96f6dcdf4fa657b2d95668d71d58455248f98712ecffaa9c528edf40ccae", size = 264526, upload-time = "2026-07-06T10:44:16.017Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d0/f10651cec2c7981b20d693deae6bdfc438427d92be2db4ccabb6181f0021/xxhash-3.8.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c959f88160b13b4e730b0d75b459b7929fc0d2225c284c9683ac95d6feeeac6a", size = 241369, upload-time = "2026-07-06T10:44:17.698Z" }, + { url = "https://files.pythonhosted.org/packages/ff/40/136e0cbaf5db51e191423b1c98643593189f02b6cd90837bf64b19113d70/xxhash-3.8.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:027dee4355f3fcc41481650d846cf6cfc895c85a1ab7acd063063821a0df5b4c", size = 473186, upload-time = "2026-07-06T10:44:19.354Z" }, + { url = "https://files.pythonhosted.org/packages/4b/3f/6aa808a96bdc43dba9a740dec56c744526ee3c0019e32c75e810fa90ae4d/xxhash-3.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad52a0e4bcc0ba956a953a169d1feec2734a64981d689e4fc8f490f7bf91af60", size = 220092, upload-time = "2026-07-06T10:44:20.956Z" }, + { url = "https://files.pythonhosted.org/packages/47/28/a8675e78a9ced96dab853416162268e10e05b452e95db7888cf69f58ac5f/xxhash-3.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d3dfb1f0ff146da7952867a9414f0c7a29762f8825a84879592612fd6139342", size = 309846, upload-time = "2026-07-06T10:44:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/89/0f/7fe4d4ef4e69f0033e012396ee2a115886bca7b10b7e45ce398626436bfc/xxhash-3.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4482380b462ca9e59994d072a877ecadd1cf51102daeeab2db696f96ab763723", size = 237659, upload-time = "2026-07-06T10:44:24.135Z" }, + { url = "https://files.pythonhosted.org/packages/38/8f/83e9e31d4ed57fe963b99cb5b13a23e3e0f0dad1885aa0ebd2a7819dd423/xxhash-3.8.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:950ac754d16daea42038f38e7465eb84cda4d08d7343c1c915771b29470f065a", size = 268737, upload-time = "2026-07-06T10:44:25.875Z" }, + { url = "https://files.pythonhosted.org/packages/57/79/7e7de46dbe5d1f49afc96a0bc42e6b8df24eae3d6bad6007b99e42f48430/xxhash-3.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0418ec8b2331b9d4d575fc9284427e8e69449d7172e99e1a86fcdd1f51a0a937", size = 224955, upload-time = "2026-07-06T10:44:27.777Z" }, + { url = "https://files.pythonhosted.org/packages/ec/34/b8540839e958d5ef5c6101af6f16032109e7099698ae8edbc8dcefe4d8f4/xxhash-3.8.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:32a94ad2763e0263d9102037d349002c3d3c401e42770542c3eeb4801f311661", size = 239653, upload-time = "2026-07-06T10:44:29.422Z" }, + { url = "https://files.pythonhosted.org/packages/ce/87/a735d05f7f859354acadabe470ff40e2c46672275f96dcf096a761904def/xxhash-3.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:89b11a5cdd441aa463f6d34ca0241602bc09b001a76994b6059828494108c673", size = 300213, upload-time = "2026-07-06T10:44:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/98/31/3e1cb020237b68117fc212dc5f9753b87f865b4dfee7c1ce62d0836955b5/xxhash-3.8.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:09a204dd4bb0823daf938cdd0dc8057d5f1e14fe3cbde929424255f23f9de872", size = 442508, upload-time = "2026-07-06T10:44:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/23/bf/f80090622141cc734b039ce1d15ce3ff6dced375e9680249bf5b9b8c6bf9/xxhash-3.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e710ad822c493fb80a4fbc1e3d0a807b1422cb90adbe64378f98291b7fa48fef", size = 216853, upload-time = "2026-07-06T10:44:34.983Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a3/60157acecc307b238d3651c2483168e224b48b23a36ae6d6903588341d80/xxhash-3.8.1-cp311-cp311-win32.whl", hash = "sha256:5013be3bea7612852c62a7437f3302c1cfb91ca7e703b194459db0b2b2e0d792", size = 31936, upload-time = "2026-07-06T10:44:36.542Z" }, + { url = "https://files.pythonhosted.org/packages/59/5c/ef70c418d878d187b8da56d4cdc06aea6cf5e456b301e96e51e1d2cc8625/xxhash-3.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:f377012b86c0a23a1df0cf5a1b05aa7187649e472f71c7892e5f2c2815bbe74f", size = 32724, upload-time = "2026-07-06T10:44:38.177Z" }, + { url = "https://files.pythonhosted.org/packages/2c/25/f008db952cec6b2a26445b456eeed2ebebd65e08e848ebe09ed6ac0634e6/xxhash-3.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:836f11d4474d3228e9909d97216faa4f7505df41cfaf3927eb29809de785a78d", size = 29212, upload-time = "2026-07-06T10:44:39.577Z" }, + { url = "https://files.pythonhosted.org/packages/42/91/f65c34a7aa7b4e7cf4854f8e6ef3f7ee32ceac41d4f008da0780db0612f6/xxhash-3.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e6e49370822c1f4d8d90e678b06dbcb08b51a026a7c4b55479e7d467f2e813bc", size = 34680, upload-time = "2026-07-06T10:44:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/57/04/b10a245a4c09a9cfa88f8e9ae755029413ad1ac17047f9a61906e5ae0799/xxhash-3.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:220d68130f83f7cc86d6edfdeab176adc73d7200bf3a8ec10c629e8cf605c215", size = 32397, upload-time = "2026-07-06T10:44:42.196Z" }, + { url = "https://files.pythonhosted.org/packages/3a/75/45ab795b5945b6388583bd75202106af505537935566c15a1577797a0e08/xxhash-3.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d365ee1892c1fa803536f8c6ce21d24b29c9718ec75eb856095c07830f8c478", size = 220549, upload-time = "2026-07-06T10:44:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/13/44/5ba2bd0a14ddf4193fc7d8ec29625f659f22c06d60b28f04bf46305d8330/xxhash-3.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:852bfe059720632e2f16a6a4745e41d20937b2bf2a42a401e2412046bb6971cc", size = 241186, upload-time = "2026-07-06T10:44:45.534Z" }, + { url = "https://files.pythonhosted.org/packages/23/32/c4147def4d1e4538b906f82731e0ba23424377fc50a7cddd03cd284c8f63/xxhash-3.8.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2f8c25a7061d952de589bd0ea0eaadee32378ff83dd6a677b267f9cd86f401f8", size = 264852, upload-time = "2026-07-06T10:44:47.199Z" }, + { url = "https://files.pythonhosted.org/packages/6c/bd/71ed14f4f0318bb7fd7b2ec51999413487fa8da8d41208e84d50d1ef0f98/xxhash-3.8.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:868a8dcaff1a84ba78038e1cef14fc88ccf84d9b4d12ea604696e0693296aa56", size = 242663, upload-time = "2026-07-06T10:44:48.846Z" }, + { url = "https://files.pythonhosted.org/packages/91/09/70af22c565a8473b3f2ae73f88e7721af281bc4a575236dbd1970c9f76f6/xxhash-3.8.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6536d8677d2fff7e64cd0b98b976df9de7aee0e69590044c2af5f51b76b7a170", size = 473510, upload-time = "2026-07-06T10:44:50.695Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/34db781c8f0cf99c544ca1f2bc2e5bf55426e1eb4ca6de8ea5da56a9f352/xxhash-3.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:82c0cedd280eab2e8291270e6c04894dbc096f8159a39dcf1807429f026ca3cc", size = 220469, upload-time = "2026-07-06T10:44:52.422Z" }, + { url = "https://files.pythonhosted.org/packages/93/5f/9a184f615fa5a4dce30c01534f62946ce5a11ce40f73785cbd356ccabaa9/xxhash-3.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daa86e4b68221d38e669bb236ba112d0335353829fb627c82e5909e4bbe8694c", size = 310290, upload-time = "2026-07-06T10:44:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/a9/dc/9b9a9789011ee153723a5eb9e7dd7fcbae2ba9b3fe7a729249ca7c252056/xxhash-3.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2bc7113e6f2b6b3922dd61796ca9f36af09da3773898e7003038dc992fc83b8d", size = 238173, upload-time = "2026-07-06T10:44:55.693Z" }, + { url = "https://files.pythonhosted.org/packages/ec/4d/71c6005ada9dcb608a4e1902e8475ecadb5f3fbfa04e1e244d276a2d0c43/xxhash-3.8.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5eed32dad81d6ba8e62dc7b9ffa0500199385d7810a8dd9d4eafaceb8c6e20bb", size = 269026, upload-time = "2026-07-06T10:44:57.424Z" }, + { url = "https://files.pythonhosted.org/packages/2f/87/d6c036ba25dfbd9c8633be5aa86fc9474bbb9e2c68212a841d090abe7344/xxhash-3.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:83697b0ea1f10e7f5d8b26a4906fa851393c61546c63839643a2b7fe2d868061", size = 224970, upload-time = "2026-07-06T10:44:59.085Z" }, + { url = "https://files.pythonhosted.org/packages/48/62/4c1f035a41c5752aa05e195b6c904c07b94fe9061a16de61e72a6e6b135f/xxhash-3.8.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:36fc69160465ae75c6ec4ac9f781bb2aa16ae7ff869e73c26fee85fbb11b9887", size = 240820, upload-time = "2026-07-06T10:45:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/da/14/d39d565069b87e86d21a2af2a31d04db79249d25aa8d5b62959056a89857/xxhash-3.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:445e0f5a31f2f3546ae0895d4811e159518cdc9d824c11419898d40cfadb677e", size = 300619, upload-time = "2026-07-06T10:45:02.716Z" }, + { url = "https://files.pythonhosted.org/packages/13/22/75467acc887edc8cf71c97ab1708feb3df7a88bda589b9f399765c6387d2/xxhash-3.8.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:dfe0580fbfd5e4af87d0cc52d2044f155d55ebd8c8a93568758a2ea7d8e15975", size = 443267, upload-time = "2026-07-06T10:45:04.653Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b6/1da3baa5fa6ef705e3425fddd382be7dfc4dfba2686df90a20f16e9c7b1b/xxhash-3.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:095e1323fa108be1292c54c86da3ef3c7a7dc015b105a52133973bc07a6ad11a", size = 217338, upload-time = "2026-07-06T10:45:06.304Z" }, + { url = "https://files.pythonhosted.org/packages/78/dd/b5295a9f97484e7a1c2b283a742ca45e3104991c55a1ef670dde161829ba/xxhash-3.8.1-cp312-cp312-win32.whl", hash = "sha256:bf28f55e427e0483acb1f666bd0d869b6d5e5a716680c216ad7befe3d4cfba2e", size = 31970, upload-time = "2026-07-06T10:45:07.823Z" }, + { url = "https://files.pythonhosted.org/packages/ec/31/3fa0b807d7e21515cd975e7fe5c039d52ac3e9401a96d6ad68dae6305215/xxhash-3.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:2256e80e4960ee282f63428adb349cb7f8bd8efe4db770d88eb815f4b9860724", size = 32741, upload-time = "2026-07-06T10:45:09.42Z" }, + { url = "https://files.pythonhosted.org/packages/b8/05/86feada74e239600e6875aa507afb40482a89b92700aa74a92da83bdcb77/xxhash-3.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:9df56e6df96a60590935e22373041cccc91fd55858763dcffb55bf63b3a2b396", size = 29234, upload-time = "2026-07-06T10:45:10.809Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8c/446bb782cd0d27007a917b5569a08dd73219c3e8d6e459014db104b27bdb/xxhash-3.8.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:3c682fcd96eb4bf64be32a4d95f96107e1588005831bd8a741b324fdda01b913", size = 38562, upload-time = "2026-07-06T10:45:12.425Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ec/c0c45627eaa6be7a5d6117423adf8f7a15b17ee74b4b17072cca5959a225/xxhash-3.8.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:036a024d8b9c01f70782e09ed98d532e76fd23f950ae7154bd950fe94e90ebec", size = 36656, upload-time = "2026-07-06T10:45:13.932Z" }, + { url = "https://files.pythonhosted.org/packages/f6/94/8324c04cc7597154caaeba6c094e01fbd2e7601d01e7a13eea9f5420e77b/xxhash-3.8.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d6a5c0bce213b23b0166fe0d35bcbbe23ce4b968f257cc7eb6fd57cb8e1e6297", size = 31169, upload-time = "2026-07-06T10:45:15.687Z" }, + { url = "https://files.pythonhosted.org/packages/40/a4/beb6bb26e1184e126dbe7a5682330214ef54dcfbf882078aa9f4b5428d42/xxhash-3.8.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:5177aa44eddaa97c6ef0cc00c6d540edb64d51781d2f8fb941612ec61a92c9ed", size = 32177, upload-time = "2026-07-06T10:45:17.035Z" }, + { url = "https://files.pythonhosted.org/packages/56/0f/fc4c92a5a528f839b34b6419b2e53c8597f2a629d5a1f5d721f65bfa1fd6/xxhash-3.8.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7801b7223db017b9c0c9ccf37e44524edb35a1544a1c032add22c061c6af0276", size = 34642, upload-time = "2026-07-06T10:45:18.39Z" }, + { url = "https://files.pythonhosted.org/packages/d4/58/edbfb141d4000767ac6a9694f8ac0763e2c2e983e65c9e31620ba56e2667/xxhash-3.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9e80238259655bf69d7bcd08226a970d7f42605f3157786bfa76dd13472d7fa0", size = 34684, upload-time = "2026-07-06T10:45:20.033Z" }, + { url = "https://files.pythonhosted.org/packages/07/3f/5072f1f0f5714186f0ac2a0b5a4929ce30d4b845e94886b6c01b6ebda0be/xxhash-3.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bcab50a389cc04d87f90092af78a6adba2ab3deca63175a3344ca83514045315", size = 32401, upload-time = "2026-07-06T10:45:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/49/c7/802ea2f9c2ed59219934d6d65c470d502b1788043eae277a52af8658bda6/xxhash-3.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a2489d3a776fa380cb8e71f54c7fda268a9baf3de9b1395093fd280f95735907", size = 220617, upload-time = "2026-07-06T10:45:23.234Z" }, + { url = "https://files.pythonhosted.org/packages/99/a8/e10488efd31fcb13fcd6acbc6e788f10c6f8e3a0cc4ae3eb89dc19c55a12/xxhash-3.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ab1e5432690276e71192be7401b55f96db2d0eedea5d44eb1f164505669cc0", size = 241295, upload-time = "2026-07-06T10:45:25.364Z" }, + { url = "https://files.pythonhosted.org/packages/18/cc/14180b17d44892a631f8ae7323c30bfbb1328efc8209e528a480293528ac/xxhash-3.8.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b30e01a0b97a4bc3f519a4d7a82da3dc53251fb0de5eeea8660dcd4ff094c0c2", size = 264688, upload-time = "2026-07-06T10:45:27.09Z" }, + { url = "https://files.pythonhosted.org/packages/a9/72/a14019d0c5f6c41ee407a503036ae32787c91325ca218a96a9b5627be651/xxhash-3.8.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1f44275ddb0978b67a58a951501903f04d49335a91f7681c9ce122ecb8ccb329", size = 242740, upload-time = "2026-07-06T10:45:28.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/08/92550e556c6fcfcb96c6a336945eb53a431ed43120ed749636debb16c5cf/xxhash-3.8.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3b87cbd974512c0c5fc7b469c36b2cdc9ee6d76e4ec78bccb2c7184611c49b0", size = 473599, upload-time = "2026-07-06T10:45:30.524Z" }, + { url = "https://files.pythonhosted.org/packages/29/83/e361d3c1acd1b21e1d489616de6fa4aaf843365d8179f612e3743eac20a9/xxhash-3.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98ee81b4b7f3023c9cb04a78cc67610baffcb5812d92f2096cb5a5efc6f19437", size = 220559, upload-time = "2026-07-06T10:45:32.979Z" }, + { url = "https://files.pythonhosted.org/packages/05/01/006a4243c2c2a6831827f9999f6d1c23feeef100eb023c1f886022a00bf3/xxhash-3.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2666f059a1588a99267e33605365ed89cea92f424b3522806a9f4bd8ad2e3d62", size = 310383, upload-time = "2026-07-06T10:45:35.875Z" }, + { url = "https://files.pythonhosted.org/packages/d8/20/af388e8bf9f9a0f89eeef7d2a1935d176ee1c20bc6adeda05035879379cf/xxhash-3.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0093cf7eeb91b84776e8742113afa4bdf47533d36cf719179aaaf1f56f6f8bf", size = 238228, upload-time = "2026-07-06T10:45:38.02Z" }, + { url = "https://files.pythonhosted.org/packages/63/6b/4666579a87eebd1744663c404297355fa0658617b015cedfa58810ee7036/xxhash-3.8.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3a800912a2e5e975d4128969d645c4a2a80aa886ccd6c9b1c6f44529e327e8cf", size = 269137, upload-time = "2026-07-06T10:45:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/de/d3/e963a8a46f900a137d91b02144d8ea07a8f812971b138204a3b2f8b8e55c/xxhash-3.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0fe37f72a207223d22a4eddc3149d4298993385aa9daef25c039246ca5a309f3", size = 225068, upload-time = "2026-07-06T10:45:41.718Z" }, + { url = "https://files.pythonhosted.org/packages/aa/80/9d181dbcde4b0fe48375f48833a5832d4b8cd2b349b15110c92ee472d874/xxhash-3.8.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5db43f249b4be9f99ef4b967863f37094fb40e67effafb78ba4f0356b6396104", size = 240874, upload-time = "2026-07-06T10:45:43.414Z" }, + { url = "https://files.pythonhosted.org/packages/39/15/ce3ab5a1cd27ead25a5196e55a7284220f6ad6e316da494ffd900b2b600f/xxhash-3.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c4ed42965c2cd9081f011be22f69d0e65d3b6165fe7734072fd0c232840bbd4e", size = 300702, upload-time = "2026-07-06T10:45:45.135Z" }, + { url = "https://files.pythonhosted.org/packages/96/c0/2281a8ab5f2a62dbf57a23c58a01ccc1d98abf40f71193c8a81f59e759b5/xxhash-3.8.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3557bec8fcb11738a8920eeb68974bc76b75262f6947998d3147954ce0a4b893", size = 443351, upload-time = "2026-07-06T10:45:47.188Z" }, + { url = "https://files.pythonhosted.org/packages/81/2e/071a58c1a53a52d4f7a3aa0987be0c396dffd40da8204805fe1b130a81f4/xxhash-3.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00de40f3b42240db23a82a5c682b55d7263d84a26a953240c1aee463409660e3", size = 217396, upload-time = "2026-07-06T10:45:48.925Z" }, + { url = "https://files.pythonhosted.org/packages/68/44/36ab58134badd9d3433fc7b53c4ca8d113d8e807782885628640f8297a4d/xxhash-3.8.1-cp313-cp313-win32.whl", hash = "sha256:b5196cc2574cfec572a5f3fb7cfa5ade27305ae3d06516a082132441aff4c83a", size = 31974, upload-time = "2026-07-06T10:45:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/96/2a/2a0b84798448e766f7b89ceed073cb0cb5a43fc9ebbacbdea74a38de18e3/xxhash-3.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:538f5f865df6cd8c32dd63158a0e5b4f5dd08d732a7da8b7228a5a0776c8ce55", size = 32739, upload-time = "2026-07-06T10:45:52.221Z" }, + { url = "https://files.pythonhosted.org/packages/d4/60/bb51dbf7c363ff88a7cbd50b7959718219577ef44d7cf255929ffc4a2194/xxhash-3.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:a6617f30641ba0d8baa1635fbefb1dffc5165ec36d26921bd5cee13497cd937a", size = 29239, upload-time = "2026-07-06T10:45:53.714Z" }, + { url = "https://files.pythonhosted.org/packages/56/d3/827ca123c2ee5443a6aaed3c5dd199237dc2f010e2bebd7ec09ef36f3a5f/xxhash-3.8.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:bfcd82852c62a60e314670a9602de354c4460f8adad916e2e42a20860c7870bc", size = 34964, upload-time = "2026-07-06T10:45:55.535Z" }, + { url = "https://files.pythonhosted.org/packages/05/67/67ae2a3ccdeb8b8ef025d35aee9edd1d26c3abe5051d47da9286232afbf8/xxhash-3.8.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:08ea2081f5e88615fec8622a9f87fbe21b8ea58d88cfc02163ca11026ee62a92", size = 32697, upload-time = "2026-07-06T10:45:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/38/5a/3d3994346e1f45493679cb5c1ffc2bf454e410e9d1e8a662d253becee91e/xxhash-3.8.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2e32855b6f9e5b18f449e59d45e3d5778bdeb660632ef2693cca267a11246c75", size = 225954, upload-time = "2026-07-06T10:45:58.897Z" }, + { url = "https://files.pythonhosted.org/packages/3f/2c/53169270309b7cd8e05504e07fe123bac053b89d00ac63617faacf0a2ec0/xxhash-3.8.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6e088bd7870775624256a0d84c2a6714afd223b2eeb56b0ca58398e52a32fda", size = 249776, upload-time = "2026-07-06T10:46:00.977Z" }, + { url = "https://files.pythonhosted.org/packages/70/e0/5c551d8d592f944506f7c5185e210255c15e672a3c6008c156a1bd9b775e/xxhash-3.8.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:72eb5ae575cc7ae2b23f6f8064a8b10f638c7149819ae9cc6d20ebd4d37a1629", size = 274776, upload-time = "2026-07-06T10:46:02.869Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/d3a762270cee2d7bcd0e25e28c623e5f3f5c0dc637b66e3e47dd5b0bb3f0/xxhash-3.8.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d0b48cdf690a64cedf7258c3dc9506cc41fc86edd7739c40e3098952265dc068", size = 252056, upload-time = "2026-07-06T10:46:04.688Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/b78e4373b2cb6d1c42af60ea2d7e9146ad0710b239ac7f706d5d31d5bb98/xxhash-3.8.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb9e256a357dfcede7818c6d34e70db2d6b664394803d1de4b6984d2de76c0f1", size = 482108, upload-time = "2026-07-06T10:46:06.498Z" }, + { url = "https://files.pythonhosted.org/packages/e6/0d/642d923336ea61a15f8ce64fc7e078729e6e06c3a026e517fa79b2c23b7a/xxhash-3.8.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51f71a6e2ad071e70c937e41fcb6c19f82c3f9f49831eba850ed4a106ffbb647", size = 226739, upload-time = "2026-07-06T10:46:08.598Z" }, + { url = "https://files.pythonhosted.org/packages/a6/0a/a37d6da6427d45a8d23e3ee3a0ca9c9d4a90364849c6637fe2963a755f9b/xxhash-3.8.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4a6443968c4e8dc69967e12776776a5952c119cc1bd94168ad1c5ad667c2be1", size = 319658, upload-time = "2026-07-06T10:46:10.504Z" }, + { url = "https://files.pythonhosted.org/packages/4a/51/ebbd40da8a3f1bc53b4b7a9a87f8e28bd95c5f21bc14b8a57860cf367d1b/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:714503083a1f2065c9ad15340dd49ac8a8e948a505a705ffa1750cb951519113", size = 246059, upload-time = "2026-07-06T10:46:12.634Z" }, + { url = "https://files.pythonhosted.org/packages/24/4c/d9014030147e1f0bb26e7da47aa240dd9ec61c763c573e558111d869f8e1/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:77f74e45a1e5574bbbf80181c8027b3a4c65c2248fffbd557bd596fff13102f9", size = 275535, upload-time = "2026-07-06T10:46:14.614Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/caee2db41fadcd5a25aa4323213f9afec5a8586d4e419241e3d659362bd7/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e0e1b0fb0259c1b75d1251ac0bb4d7ab675d36f7a6bf4ba6aa630dae94f9ffa", size = 231292, upload-time = "2026-07-06T10:46:16.452Z" }, + { url = "https://files.pythonhosted.org/packages/0b/60/f52f08bcdc904c4514ea5c25caa19e9f3214144434a6ff96dc82dc1cbddd/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:10e4393ec33633c2f05ad01869e546ad080b1a18f2650503731f153774608b31", size = 250490, upload-time = "2026-07-06T10:46:18.318Z" }, + { url = "https://files.pythonhosted.org/packages/24/a0/94dc7ae310838f250669c6ad7168e6d6fca17d49dac1053f06dc232c4a56/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b3ba794c3d885803db6c3116686923f1ec13bc86e621e169a375282b63ea1cc6", size = 309861, upload-time = "2026-07-06T10:46:20.503Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f9/adeead7d0eb28cdfc2832544ea639ffbc6749ccde47a8e228d667459182e/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:57189a69c0891e4818853feaa521c972d22c880a001453addea015f48e3c3398", size = 448739, upload-time = "2026-07-06T10:46:22.79Z" }, + { url = "https://files.pythonhosted.org/packages/04/a4/22ec0e07db57d901c9298ae98aa3cf2be45bafded6f07c13131e85b89032/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d59e71153fe9ff85648d00e18649b07e9b22c797291abb7e27274fa06df8b838", size = 223657, upload-time = "2026-07-06T10:46:24.831Z" }, + { url = "https://files.pythonhosted.org/packages/94/32/8a9531f37b59e5a013003db7cb7414baf4ce7e0e1268e0d5947cd3d6a2df/xxhash-3.8.1-cp313-cp313t-win32.whl", hash = "sha256:5b96f0024e9840f449bd91b2d005c921a4b666055a0d1b6492463799f32aae22", size = 32377, upload-time = "2026-07-06T10:46:26.86Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/2ca45fd7f671de5f81fc297ef1c95080b40c86ec6be0cc6034b8f7707ac8/xxhash-3.8.1-cp313-cp313t-win_amd64.whl", hash = "sha256:37d5a56c36dcc0b9a87b814cd992598d33863ff683749de6c86081f278d5e629", size = 33274, upload-time = "2026-07-06T10:46:28.39Z" }, + { url = "https://files.pythonhosted.org/packages/5a/54/20d7163463ddb6438b73a427d1655a77a502cf9b9b0c3ada3599629d9c0a/xxhash-3.8.1-cp313-cp313t-win_arm64.whl", hash = "sha256:6696c8752aded28ff3b16f33ef28ce28fb5d209b80c206746f943199fcf5fd65", size = 29375, upload-time = "2026-07-06T10:46:29.962Z" }, + { url = "https://files.pythonhosted.org/packages/c2/8b/df2ba04f22a6cd6b39f96a6577329a8471a55c90ef8d8e2f7c102363613f/xxhash-3.8.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:9db455cb649dcfe4504d6d68a6d83a7315a99a3ca59871dc3ff840671f99adba", size = 38430, upload-time = "2026-07-06T10:46:31.496Z" }, + { url = "https://files.pythonhosted.org/packages/b2/4f/6a059e8ad3ca8deedc91dfe335b211204900895152212c03ebbe721de68b/xxhash-3.8.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:affb37f152e55b5e4494bb9d0107f7bb08515c6704fbed82d9f61214d74adc17", size = 36558, upload-time = "2026-07-06T10:46:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/cb/95/40be178205acce092ae418feb20ac737b32a02c7b864926ed0717354c9f8/xxhash-3.8.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:460261045936975193bfd20549a0de1cd52a33b405cbb972f0d80940c42266cd", size = 31181, upload-time = "2026-07-06T10:46:34.793Z" }, + { url = "https://files.pythonhosted.org/packages/3f/89/2da4dbf051bafa156c0e3f12012db2b0ac3b84ff37ca1f021f6bfffcdfbb/xxhash-3.8.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:38c887aedb696ef8bca19983206d270848558cfae4a91afa6a2fb05dde58ffc5", size = 32192, upload-time = "2026-07-06T10:46:36.393Z" }, + { url = "https://files.pythonhosted.org/packages/7c/4e/e000bbae3566bc8e0be771a8a0f294aa99075e3f0bc4ef43922ebffdebc8/xxhash-3.8.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:594131ce1aad18db3689781f806db1b065cdaa04f4df36b4c038d2013aefd0bf", size = 34691, upload-time = "2026-07-06T10:46:38.1Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4a/ea954aacc7d1c8711880ac2b55da94429a9b4296b151c4fc0966549ca1ee/xxhash-3.8.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:78c794b643d214f1522e7a288bcf5a2de120d26cd170516749a4009dc92722c9", size = 34807, upload-time = "2026-07-06T10:46:39.647Z" }, + { url = "https://files.pythonhosted.org/packages/ca/29/df598e738ff37558ac627264deb2e560902d9bf7f46d3bd5175c9eee593e/xxhash-3.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af0c9fedc4a2c24e8664953882fe8185f3790b8338c9c700f76f5ad660817711", size = 32410, upload-time = "2026-07-06T10:46:41.359Z" }, + { url = "https://files.pythonhosted.org/packages/59/9c/81ab40e7d33ada0b3df5d1bc884894d15dbf4f805cd645b685e4606bb8e0/xxhash-3.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:115772daeb71b2f3b9381177017f53e6cf3f3439c840737fdabd21aba6e54920", size = 220564, upload-time = "2026-07-06T10:46:43.463Z" }, + { url = "https://files.pythonhosted.org/packages/fd/6f/62ae6f5c8606320a0e2a41c2dc8c6d91cc5d63d0f84dd9582e9543779dd8/xxhash-3.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:000435984a0469b0f822fe76f35bddea0f96a4d6521b3339a60a6428cdee1edc", size = 241462, upload-time = "2026-07-06T10:46:45.509Z" }, + { url = "https://files.pythonhosted.org/packages/15/a1/9c3a0ec6cb524396f551eddd102a76690a795494eb9784fc67542b0daa37/xxhash-3.8.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2f1c68394818e0595569c2ff3cbc1e6d5a36a434e796f5c526b987b80c8a8c62", size = 264491, upload-time = "2026-07-06T10:46:47.655Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/700a4674e4308eb59d2fdb973977e82eae231bea5044753fee5c9eec0e0c/xxhash-3.8.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:46b39976d008e2a845758650f0ff7136bca004f40da0c8798bd37ac37860154f", size = 242905, upload-time = "2026-07-06T10:46:49.857Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8a/72d9874375c8d4cbc64a8cd1d659d5695a8765c3db82efa82dc5bd9f14d0/xxhash-3.8.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d5006c65ec507a333479e76e00e2c368781f16c24ededa764763956b32a0e93e", size = 473873, upload-time = "2026-07-06T10:46:51.953Z" }, + { url = "https://files.pythonhosted.org/packages/03/f0/6db07590ed7e0a77f186ef0bcea8d52553bf1ba57833e09467a2411f0f2d/xxhash-3.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31a2649bcf1fe97cf11c79848d761df33ac46b3896942d31b640557b486ff6b", size = 220765, upload-time = "2026-07-06T10:46:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/8f/10/00d12d8b8beabbf49a8bbc626fb9f40445145a8887eb41a6acfb69149ac4/xxhash-3.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f759eed402448c2bdbb492e4fba1f20668ffe29688605ea61f0f67f9e4e386d", size = 310478, upload-time = "2026-07-06T10:46:57.729Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f9/12a82394eefb0f185d15a7f7b9f627c61c475a72dd83718436a5b84b42ac/xxhash-3.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5f97ecfede10d5b2870383620e2d25c8561e217c7bf9081073802b54248d2b", size = 238393, upload-time = "2026-07-06T10:46:59.87Z" }, + { url = "https://files.pythonhosted.org/packages/20/f3/53f963e320b9ce678337aa7273f39ce692ded8b99e3d22a866ec722159ab/xxhash-3.8.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1da930bbcac3e8fbe2191850e2abb57977a99348c12c4b385e1058ac1b0a9ecc", size = 268704, upload-time = "2026-07-06T10:47:01.806Z" }, + { url = "https://files.pythonhosted.org/packages/0a/50/5b5badbd87c82d9f9b5f58ac74a3f29ef08f6fc387b324b8fd482450b862/xxhash-3.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:747476436f6891b9773374ce8d48edcc8b12cb5b61b67c6fb6289633747d088f", size = 225015, upload-time = "2026-07-06T10:47:03.784Z" }, + { url = "https://files.pythonhosted.org/packages/30/93/3ca68265afe7b4e69435e08a7b6a1d9d0f2a071e889da1f8041ed00fe878/xxhash-3.8.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef09bbc2519a93cd0f95f2ceb5f7b85919dffea643278e02362bf40e3c4bed1", size = 240951, upload-time = "2026-07-06T10:47:05.816Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/27e19670c40f46b5e76e11f2f4713d21054804568425d870670e757172ad/xxhash-3.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:a5eed9d41995a83f3332b4e3396abb7f433cac584222bd7e305b606d8353861e", size = 300751, upload-time = "2026-07-06T10:47:07.95Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fb/b33e27689959fe7ed2ae0b830af41560d65213943983afa9db3a8d481bce/xxhash-3.8.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:53f3ed9118397074ff63a79b66b7fec1c84c782eecde35c5bc94e420a971c231", size = 443480, upload-time = "2026-07-06T10:47:10Z" }, + { url = "https://files.pythonhosted.org/packages/26/60/0e0d973be5fe280753ef02fbc89349492ad6e903bf1dcb870b668f94b662/xxhash-3.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d247b34bf433c92b41689318fd25d246313cab2275a6a47e2efac178b80d6efe", size = 217657, upload-time = "2026-07-06T10:47:12.196Z" }, + { url = "https://files.pythonhosted.org/packages/ad/68/c9e3ecef4a9a417d464cb5bd200aa12f73192dee677901b9e08e0ad0d1bb/xxhash-3.8.1-cp314-cp314-win32.whl", hash = "sha256:d58ce8b6cfa9c4d2f230557f69caf7c06369e318015d0b19485095bc2c5963ab", size = 32690, upload-time = "2026-07-06T10:47:14.204Z" }, + { url = "https://files.pythonhosted.org/packages/d7/99/e9e44588c0b62837bbec5ba7927816de0afa03406b1a0b6c7a7e1d1a30a0/xxhash-3.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:6cee733fe4ccb1737e0997135283c82341e5cfa9cf214b165f9087fb663aaf4f", size = 33460, upload-time = "2026-07-06T10:47:16.021Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/64f36d86380b3657ad9031967ab814f3ef31307174650853f69c18932ebc/xxhash-3.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:58346024d47e84f7d8b3e7f5d6faa1d58acbbe49a8771497872059f58c1d8ea5", size = 30092, upload-time = "2026-07-06T10:47:17.81Z" }, + { url = "https://files.pythonhosted.org/packages/92/cb/18b64bff88c58a0ca209dc533e63cf02d7ae5aa6b1b9a9fd14e81b5dbd60/xxhash-3.8.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:01cab782f8a0a05ecad2c63d7ef10f7ab475f660e0d6419d069418c14d88de7c", size = 35024, upload-time = "2026-07-06T10:47:19.821Z" }, + { url = "https://files.pythonhosted.org/packages/af/1d/72d8a70520e5dcddb472ea0486d299da3240745a10658290cd7b5690ede2/xxhash-3.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:717b12fdc51819833704e85e6926d76981ffa3f780ef92e33ebb8b26d46bb230", size = 32697, upload-time = "2026-07-06T10:47:21.649Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b8/e041f555903c56db3d0a731b3d72a6575d75e0ed868b1bd2e5176111ca44/xxhash-3.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ec55d80e9b8a519d742669e0b49e8ce9e6747be42bf3c138158b6543a9c8e489", size = 226044, upload-time = "2026-07-06T10:47:23.612Z" }, + { url = "https://files.pythonhosted.org/packages/3a/7e/5cdcf06bf6ec4b5d2ac073feb23432ec1d603fd438864cbd2c09c7cb45e1/xxhash-3.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98d8ac1129b4dd39098cffed94d1284aceb61c3aa396757ccc736ac392e4cee5", size = 249899, upload-time = "2026-07-06T10:47:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c0/eb7e059cb5e1dba11fd30d2fdf882f56e5a417a3eaa43669d43623767f45/xxhash-3.8.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3bc0fa90830df1e1277f33cc6e55de9990b83c0319fd8c7412866cfde38b025e", size = 274892, upload-time = "2026-07-06T10:47:27.931Z" }, + { url = "https://files.pythonhosted.org/packages/66/74/a600aaf7cd39957fd1510adeedb1749c1e7eb82bd632a1153d9c664c3135/xxhash-3.8.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c73b6f652f0745425aa6378319c331293b5341756262e9408ed3d45f183375e6", size = 252243, upload-time = "2026-07-06T10:47:30.288Z" }, + { url = "https://files.pythonhosted.org/packages/ad/04/78d88fa75a6763e5d09bf1b947a392a27988903381b219006f92f3c68fc8/xxhash-3.8.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6114692261eff4266386cdec0f7d87eee24e317ab397c218b7ae6a76b4c6339", size = 482191, upload-time = "2026-07-06T10:47:32.45Z" }, + { url = "https://files.pythonhosted.org/packages/7f/06/07a8aea1108d682de8791ce608cdf367d75ff4e7e57cd3c154bdc6f47b23/xxhash-3.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4df57c0b161ec1b3ed0526a67b0db0914b557e86ee8aae51887aec941b261542", size = 226877, upload-time = "2026-07-06T10:47:34.705Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b5/86bade5618a524d2c06c4041aa2fe8e5749ce16e88afba60d67c1684a21f/xxhash-3.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9043877a917be88ccf230aa5667c1bd059bce80f4c2727e4defa1b29b7f48b08", size = 319794, upload-time = "2026-07-06T10:47:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/23/69/9b1a2b89b1621bb740fbcb7beb512f60f99480c1bdc680c0c90e1f56ff75/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:559e3cabe522231909f9de98ef06929edbd53782046bd21aae0c72db6f2a0775", size = 246202, upload-time = "2026-07-06T10:47:39.676Z" }, + { url = "https://files.pythonhosted.org/packages/08/ea/662ed6cb49f1d34078b6a3a3e0f3d29ff93fd7b5a03c0bc9ecfd9b2159c3/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:264710bd335016f303763ce1275c6486df30bb57c2245c91b224c983d7ac39b8", size = 275628, upload-time = "2026-07-06T10:47:41.99Z" }, + { url = "https://files.pythonhosted.org/packages/13/f5/49fc9e4c6728a5a3bd8fe639199d2fa67609b3a84f938aff6e8568dd3e4f/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e14800b9b10bb39d7a60ad4a310e403164d7b8988a27ae933d4e40618a44088e", size = 231390, upload-time = "2026-07-06T10:47:44.233Z" }, + { url = "https://files.pythonhosted.org/packages/64/9d/3acaf8f599c0e0b30e910a3a11ba32929da53c86dc73c7c55fe6a010b4e9/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:ea6a3e734b0fd41b82784a400be946821900daebe610c050a5e0760838a34f99", size = 250600, upload-time = "2026-07-06T10:47:47.611Z" }, + { url = "https://files.pythonhosted.org/packages/23/64/8acab4c5ec60dbe664b5b9858fd44c2413b07e535b09556a0a5022e78aa6/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cf399fac542a1c7a4734a435b93df2c55e858c7d31abf6c1bdf46f9ae67fbfd0", size = 310032, upload-time = "2026-07-06T10:47:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/56/47/a0288d7329b1fe63e2734a32d19d444a96ae2b4810f545bc61e561224917/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:44c89d915a75c11d2547eaee9098fcd80398987c4bff2974a0497a925bf92c07", size = 448882, upload-time = "2026-07-06T10:47:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/01/e7/3071dfd3beb5c38204ce1cf56bf7749fce08de900fa92714b81d1d8ca1f2/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:358650d5bda9c635da699c53adf4e8134af492ecc79c960f917eebf088bb6799", size = 223728, upload-time = "2026-07-06T10:47:55.093Z" }, + { url = "https://files.pythonhosted.org/packages/12/11/b99949f0ba2b07e9f9ffe83b9c86faa685f9080725dc21a916a607313be5/xxhash-3.8.1-cp314-cp314t-win32.whl", hash = "sha256:c240939e963653054fc7e4a17c382829cda4aa88a7daf0af841715dbded1b497", size = 33150, upload-time = "2026-07-06T10:47:57.274Z" }, + { url = "https://files.pythonhosted.org/packages/54/1c/09703eb341f8416e74e58d6c6732d4b5c46de59c942363203cb237cc95b0/xxhash-3.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:7258ee276e8772599bc19e14b36f6260306e21b637190cd7cb489a2449d48684", size = 34005, upload-time = "2026-07-06T10:47:59.434Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f9/6ed7251bb6a8af10ac73b1821c60583d2826e5b2064e45a979c935287c98/xxhash-3.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:8f454166c2ffed45636c8d501741e649851ba2f346c4eb73a64c07ac00428f20", size = 30239, upload-time = "2026-07-06T10:48:01.874Z" }, + { url = "https://files.pythonhosted.org/packages/99/e4/4d8040435aeac814fc69ba63621565fbeb19229a138e2568324a26b2a45c/xxhash-3.8.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:39c9d5b61508b0bb68f29e54546de0ed2a74943c6a18585535a7e37356f1dd12", size = 32687, upload-time = "2026-07-06T10:49:42.803Z" }, + { url = "https://files.pythonhosted.org/packages/da/6a/975f1f2318c760e5bcec109ed379713ae645d8d856c2a3b9ec5d26857087/xxhash-3.8.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:83b9130b80b216d56fdf9e87131946b353c9627930c061955a101ea82b09fed9", size = 29879, upload-time = "2026-07-06T10:49:45.172Z" }, + { url = "https://files.pythonhosted.org/packages/08/0b/40a2a55ff52cf635bfdc5eae67a772bec85b4f44c6c737f73f6f528d51d1/xxhash-3.8.1-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8304be0982130954b7fd3aad18e2c6f8ee40254bc3d2e635991c16d77c91e2bd", size = 43246, upload-time = "2026-07-06T10:49:47.905Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6d/56ed2b6b200f26fb474f3fd387d95d0601efcd5bb33430c90c68924bdd77/xxhash-3.8.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b512261801b1e5fde7b6ebf2fef7977339c620cbbca88a0040ad9ad134f4d02", size = 38202, upload-time = "2026-07-06T10:49:50.59Z" }, + { url = "https://files.pythonhosted.org/packages/0d/a3/56864d895d1161a9f17502088e9c1fb7c06bde2c2efdde620d22bb7a9c43/xxhash-3.8.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49aa8692507835dcc1e8ad8021f20c74c2dc13d83b5112e87877faa2a0035b20", size = 34448, upload-time = "2026-07-06T10:49:53.242Z" }, + { url = "https://files.pythonhosted.org/packages/6b/57/5c6e0908a47f61dca96d01c8ee6fce01ed1050611eb779083ba8758fed81/xxhash-3.8.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:345b07b78e2bf583d71682aa34ae5b5fab575f7a1cb31e10263ebbc6f89f8c42", size = 32869, upload-time = "2026-07-06T10:49:55.972Z" }, ] [[package]] name = "yarl" -version = "1.25.1" +version = "1.24.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/75/16/e8be8e2fb175bbf41a0680381a319f1199fae256588241a2ac8677eafb49/yarl-1.25.1.tar.gz", hash = "sha256:03dd38de09bc213e9a8b29761eec33ee1d5318dac0e49d8af36e4d27830e23a7", size = 246245, upload-time = "2026-09-15T19:35:02.264Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/85/92/55fa9ee84cb8ec9930a910b5753936a926f918d8cc8965bdac571479c095/yarl-1.25.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:142c06c4d6a35ee3ec5da08499805e879cb3ca7c1fbfbecb0140fe72403818d6", size = 144695, upload-time = "2026-09-15T19:29:53.114Z" }, - { url = "https://files.pythonhosted.org/packages/16/b4/9edc8e605b16b2eb5bd0c2ccc73e2b15aab583862460767fb43f91f11839/yarl-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24ce942011a61953e7d313438038f4d32ff21387b775f58a957f7a07dd55ef95", size = 104332, upload-time = "2026-09-15T19:29:55.443Z" }, - { url = "https://files.pythonhosted.org/packages/ae/de/4204e6646e278b1cd4a9cf73ebe8b7cfcf16693f1249b324eb273d67602a/yarl-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e23c82b63cd7652fc24d33ed6cc17099d607aa3b4fc4ddc75e95062f3d82df4", size = 104449, upload-time = "2026-09-15T19:29:57.239Z" }, - { url = "https://files.pythonhosted.org/packages/1d/fc/21d74789198ad68a23a209ab0d73fe5a52d39ebbd9945041e72827acdd77/yarl-1.25.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee202350cf57abf0e9502a41601841019c25d3db7ff52d980aaf31446254059", size = 116828, upload-time = "2026-09-15T19:29:59.031Z" }, - { url = "https://files.pythonhosted.org/packages/8f/31/90891ddb61848c067ebd1fb505ab5902a6e7d4707c2f3823f67ff37883d3/yarl-1.25.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5df89f769cc8ff94c3d7e7603386fba309d25ce5240132d26c15baa8d0e96c4c", size = 107150, upload-time = "2026-09-15T19:30:00.868Z" }, - { url = "https://files.pythonhosted.org/packages/a1/15/f3d18743d3688b5f01aa83034b6c00665692ab20e1d0c89a29000d4979ea/yarl-1.25.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:83e9f4a25085bd4b7214701a0794ff1f50fc633ffb8bdfebf07abdd81c2db126", size = 124704, upload-time = "2026-09-15T19:30:03.128Z" }, - { url = "https://files.pythonhosted.org/packages/99/37/718789d8004775d6a2db86b2afc72b1d156e0590b88a1b8634ddd4bdb8ee/yarl-1.25.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e636b64d24fd9c38053c5e389a1174c66361fa49dcfd220f4dd35b4abde7cb89", size = 129246, upload-time = "2026-09-15T19:30:05.014Z" }, - { url = "https://files.pythonhosted.org/packages/28/b9/7818ac6dec7fbcd16be2d19495807c01e2c38834e57d41c63356a75e786b/yarl-1.25.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e5637ca8d0bd7fb72648a6c7934af4baaccb697657f7438c9d264fc2abb8b0b1", size = 118071, upload-time = "2026-09-15T19:30:06.977Z" }, - { url = "https://files.pythonhosted.org/packages/b2/e3/8d098cafb30a64df7283b5a5dd0d32d22a71b18a1b9ec071d0776ffe5c2a/yarl-1.25.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:683e362b8ba453080f7489c66f4ea794e751c35b72e7eab3575ef784c2fbc7fb", size = 116180, upload-time = "2026-09-15T19:30:08.836Z" }, - { url = "https://files.pythonhosted.org/packages/20/9c/fbe9432478d87e00eef80242e15179639df162cb3d5d8d978fc56dcb6c51/yarl-1.25.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:df23df54b5114a17c2d0ef192433e2e5a9f0c5178c32375e90b7cfc965f349d0", size = 116578, upload-time = "2026-09-15T19:30:10.782Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8e/b3dfd03732236b86b0bcf06a72a37de412ff6f82e719a947c3c651d4dece/yarl-1.25.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f53dcd26694f148f738edc052b5a69234833e739f10f4c3287bdfd8ec0f7b326", size = 108886, upload-time = "2026-09-15T19:30:12.951Z" }, - { url = "https://files.pythonhosted.org/packages/83/e1/94dacb650d4963d5f844bc3df7ba70288cb7b68ed5a4d070da71acb19b14/yarl-1.25.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b8075fe90bc08e40b8b8a1874fab42ee4c7b56af05c5886e9cc841397f916908", size = 124098, upload-time = "2026-09-15T19:30:14.963Z" }, - { url = "https://files.pythonhosted.org/packages/d6/3f/c93f76a218258c7bfc60dd27fd56e9102bdbc625517f4a6ee673295fe4e4/yarl-1.25.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a8c2b841478068440d8b733005d13a5ef535b9928cbc05f17182d410f32ba449", size = 115768, upload-time = "2026-09-15T19:30:16.736Z" }, - { url = "https://files.pythonhosted.org/packages/a8/79/4d93f13c3b05cda3c962805dec28cbc255c50239b3457808abc5633a00c2/yarl-1.25.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ca32926d7d77bcc8838425c4c95e040a3ace1cb7dfdae599013458dcda2607ca", size = 122461, upload-time = "2026-09-15T19:30:18.901Z" }, - { url = "https://files.pythonhosted.org/packages/c5/8e/e2ba83b3a9bfc1d3b882ad35fa8abc04a7af4d9356f2e329a23d0c8d889d/yarl-1.25.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:192a866877a49993949ef1975864ad8728bea28ee810f6abe1a0729c2b500426", size = 118295, upload-time = "2026-09-15T19:30:21.07Z" }, - { url = "https://files.pythonhosted.org/packages/42/67/cb5ea1baa0c0ac60bda44ce59f601133154af2a2e67722d3517f8793855d/yarl-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:3f4d48a6112712973e676bd792121fee470e432d749177162d9949d5c9460a1b", size = 102929, upload-time = "2026-09-15T19:30:23.122Z" }, - { url = "https://files.pythonhosted.org/packages/2f/85/9a1e98de10fc0e738d517efd2a9984c3e7db6cf35fa72b2b373988a9e9b7/yarl-1.25.1-cp310-cp310-win_arm64.whl", hash = "sha256:48796ea00a303961507dc6c8437c4b325a6fc3f95f7c36c71b91ea9a8150963c", size = 98854, upload-time = "2026-09-15T19:30:25.102Z" }, - { url = "https://files.pythonhosted.org/packages/83/b3/2cea721d495ca57f8f414aa4867ee263f486b274e07463158cf52f02ba7f/yarl-1.25.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d693bf4bf534e9ba3ae2780cfd577f5135629f7b5ac653490859d0b77864865", size = 143794, upload-time = "2026-09-15T19:30:26.946Z" }, - { url = "https://files.pythonhosted.org/packages/55/e6/cd145cff8e5cf60b8b3c41fbecfa2a45028a8dec3fbc52bec03595ff3d3b/yarl-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ab2054c5531af2a9ba7b69b8ec91e4f884420e83a8c5e579b013084cb57e5e5d", size = 103993, upload-time = "2026-09-15T19:30:28.661Z" }, - { url = "https://files.pythonhosted.org/packages/ce/7c/fbb40fe2d53747c40aa36a9e2bd2178a202f942bda0b670f3306d4aefbce/yarl-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:564fdc7085d2245ab84f88882fdb1d6ac0723124bff6ded35bfb1c00f812630d", size = 104010, upload-time = "2026-09-15T19:30:31.069Z" }, - { url = "https://files.pythonhosted.org/packages/f0/0b/5a516f70641092283f57cf3670bdb75e7327bcc0dcb5038697e4dfbfd569/yarl-1.25.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acae6b45d1ace09b6ba3876da43b88366ef368f73b988c7f57e14231753d4420", size = 116444, upload-time = "2026-09-15T19:30:32.894Z" }, - { url = "https://files.pythonhosted.org/packages/b6/8a/d1a627f827b0a404ae0f5647cab0534959081cde13b0756a783469fb3b5e/yarl-1.25.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1fb2a01ba8cd9c5d2c5dc1ec35e0fc951d04b4f037541d4ac090c993ce58b3d7", size = 107565, upload-time = "2026-09-15T19:30:35.188Z" }, - { url = "https://files.pythonhosted.org/packages/aa/cf/c8e0aaec886840a6c4480fe44eaec7cd4319f79a563b79321473be79c56f/yarl-1.25.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e92b6bcc741b86d67606c40d3cb9c7cc8e6c737f81e31f4a94efc204456c92e3", size = 125006, upload-time = "2026-09-15T19:30:37.1Z" }, - { url = "https://files.pythonhosted.org/packages/50/26/0cce366d54a93cdc8342965dc7663385e4db161625cc1e8b18e786753d24/yarl-1.25.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72c34ac7ad4314c19362d5ce27626dcc8429bd30bbf8c179f4234078851f9492", size = 128717, upload-time = "2026-09-15T19:30:38.904Z" }, - { url = "https://files.pythonhosted.org/packages/95/0c/a71501bbc1a674ff72c4d6c2b75f4d9a5af819f5244c3a7558080a8802c5/yarl-1.25.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5add7b4ca7afeea91d52e4d4e4db3b1fe9885b71f07054560d8c4296b7441a2", size = 117728, upload-time = "2026-09-15T19:30:40.809Z" }, - { url = "https://files.pythonhosted.org/packages/e7/6f/c3267ca01defeed9ed9c4ff9b17bd54915432c405945233265b707475d1c/yarl-1.25.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:def538065f9e4d4cf1ae164bd59aba00dfa84f03923e0de4c3788f252d6bcd17", size = 116224, upload-time = "2026-09-15T19:30:42.818Z" }, - { url = "https://files.pythonhosted.org/packages/8f/69/fad57ee52d648431718ee0f1f68966a99c1352c3924688ffbdcc9d3fe51a/yarl-1.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a191bfdb30a79b98e5d175d75285f9fcb78bf0e46ba5efda042e1c72071a0de", size = 116299, upload-time = "2026-09-15T19:30:44.966Z" }, - { url = "https://files.pythonhosted.org/packages/2a/d4/6a8c1e29f33338687ca278cba0a8fbf6525a322c2c02a9a500ccbe041152/yarl-1.25.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:71f42c5b9a948c113bbdebfa544598321431d064ff959d32e99b1feb61d68345", size = 108625, upload-time = "2026-09-15T19:30:46.874Z" }, - { url = "https://files.pythonhosted.org/packages/e8/d2/3a35ae791c9cb6522c106923ff25c3230d999091e5e65511bca23bbd9914/yarl-1.25.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:72849d892954be4d09e569b8b831ac39ce58417fedc767d4308a0fe542018a40", size = 124515, upload-time = "2026-09-15T19:30:49.082Z" }, - { url = "https://files.pythonhosted.org/packages/be/fd/2b022109a6b4af0f7dc371cf7500af380b0d4f034010243e1b0ce218dc93/yarl-1.25.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:efb01a106f971cb3752856bca2318bbdf7f01bd8823779c461586cbe5ffd5258", size = 115711, upload-time = "2026-09-15T19:30:51.208Z" }, - { url = "https://files.pythonhosted.org/packages/18/59/f7586271136c3ddb0126bbfe661844699369b76b555fe38c4efe86870b2e/yarl-1.25.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a1daf47cd95a7c3a63456336bc5aaa8c86dd3a47d07ed3d0e76132ae4666a5a1", size = 122751, upload-time = "2026-09-15T19:30:53.535Z" }, - { url = "https://files.pythonhosted.org/packages/a0/0b/07f7a2d881f7e16c385b47fc1753382600847cad305dcc7fa0c25828acf8/yarl-1.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9489e6abf47ba37f332075a91444c7cfedb03e6ce99fbb2f116bfe1ce810da3b", size = 117983, upload-time = "2026-09-15T19:30:55.277Z" }, - { url = "https://files.pythonhosted.org/packages/aa/9d/8cdceec66a9b940700cb45931741403f045b162afd79bcb93c41cadd0972/yarl-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7306dee25b8a0e737363f347362b875094b4dc4e367311470656ae420fdbf8e", size = 102894, upload-time = "2026-09-15T19:30:57.606Z" }, - { url = "https://files.pythonhosted.org/packages/17/f1/7ec357db1d3ad2863542d71e8fe64a126bbec17b134cd7d30951196809a5/yarl-1.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:abb1384477f5901d436b5d2e5465954de46ea6098f59163d243660b5c4461d35", size = 98609, upload-time = "2026-09-15T19:30:59.705Z" }, - { url = "https://files.pythonhosted.org/packages/75/b3/cd32ac66ae622b854c2df0ac52106dda220d361b65a64fde7d5b3684aa3f/yarl-1.25.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d7aa6debf92a1dd14cb5280b083a764169a13cfb23a452111160274ed989f4", size = 144798, upload-time = "2026-09-15T19:31:01.821Z" }, - { url = "https://files.pythonhosted.org/packages/61/fb/a2c52a8007c2051ba74662afb112ecf3d00346af4c25e33df9d80fd14fb8/yarl-1.25.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83d4a37e4b95da4d8bda930d6d35b75b4cdadbacbb4980cae290ea3100b5d51d", size = 104583, upload-time = "2026-09-15T19:31:04.05Z" }, - { url = "https://files.pythonhosted.org/packages/be/dd/ee38aec8e09fdf957e50d4085453fbe202f56c6c3b4cf07b81cdb4f09ee9/yarl-1.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e029648f9c951db30e98a7d7ec90835db88ec4b32820efe2a9bdc2287e032eb6", size = 104325, upload-time = "2026-09-15T19:31:06.338Z" }, - { url = "https://files.pythonhosted.org/packages/1e/b3/058dbfb1857b484c9cf9cc135659f50b85ce66e03c99e44dc2f7b6161f55/yarl-1.25.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d781294bb815ecb5ea57ff6bbf8038e0a31a95fdf3e1788f66e0dc100d64b58", size = 115358, upload-time = "2026-09-15T19:31:08.593Z" }, - { url = "https://files.pythonhosted.org/packages/db/39/29693446cf0cf6b15a0e2f75a5d40f93c56819b05b0622196f45e95b5cc0/yarl-1.25.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e12c538e00e7c1b286a07061046b90e8124e6a9793efae2c70db6a4aad07faad", size = 107658, upload-time = "2026-09-15T19:31:10.802Z" }, - { url = "https://files.pythonhosted.org/packages/86/b3/3c4dd7e1af43b931fba95e0a722737f2ea94a6d199c802585282831d7abd/yarl-1.25.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e4de3ac4adbad3d0bc7c6f4360a7dbff5de2f15e3b723be3198074e17fd9c40", size = 122660, upload-time = "2026-09-15T19:31:12.84Z" }, - { url = "https://files.pythonhosted.org/packages/bd/b5/1b60dbc3cfc9c5712b15148c206748f2bc93953ffdbe25ea75b63dfc89c9/yarl-1.25.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:419f392a1da624877975709e3864dfe833af6cc7671b39318086d456e288380c", size = 126506, upload-time = "2026-09-15T19:31:15.088Z" }, - { url = "https://files.pythonhosted.org/packages/bc/7b/ca212cbe170ac8b96e45317ecbcf9c3c3ecf0cdec98d5b088a9c4088929b/yarl-1.25.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6f117789d22dce188e5754e8bc65b7e6ebf8cb73963b9fa761f672a5883769d", size = 117050, upload-time = "2026-09-15T19:31:17.241Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c3/72b4938cdbe619ad71ac156182faef4908846b84dc3ca4dbb4c4e6f84014/yarl-1.25.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80e47012e730da131c9f059c80936783f9659aae22dc31c03c0595590d11ed54", size = 114174, upload-time = "2026-09-15T19:31:19.294Z" }, - { url = "https://files.pythonhosted.org/packages/e8/43/268717870f9ba0cc9701a95181587f6dc8c5f387aab4aeecc83158f38a79/yarl-1.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e80f557716fd765439577131e526b8942ffc2c07bdbc5e39fa62f660ba1e963f", size = 114944, upload-time = "2026-09-15T19:31:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/da/84/baa5bf504d51fe062c4bcaf62936da97fffb43285978d0b39984824231fd/yarl-1.25.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f61964f235a43738bfac50da46fc4254943a7eea3051aeb0b6fc7c992c29fadc", size = 108263, upload-time = "2026-09-15T19:31:23.388Z" }, - { url = "https://files.pythonhosted.org/packages/a4/28/779a2ed9e0152a601a27039bed9aead3f0b79797a67e2c44bfa444622dd8/yarl-1.25.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e546fe1d4a93ebc2910f0d768baff19faa09843ab3f2036a67ed6e69fae4419d", size = 122184, upload-time = "2026-09-15T19:31:25.343Z" }, - { url = "https://files.pythonhosted.org/packages/f8/1f/118e9e5b8f07694d63fd3222e801d7782270003f1a222aa798df3f8d5933/yarl-1.25.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cce0727fd5ac04d372fa9bbfde9febc2bcf209aadfcf0468e45dec72719895d1", size = 114001, upload-time = "2026-09-15T19:31:27.465Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/a4cf1cf372313734b17996d4007f9f73596e7a178b9485802e5494ecf484/yarl-1.25.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af4ea5b37403ef4e30f3927eaed540db942bde01d8d3ff083527c0704d1c9c68", size = 120565, upload-time = "2026-09-15T19:31:29.47Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ad94f93ca731bc9e44d321833ab96b82a4f9f5f63cf773f81a4aeea5ecc1/yarl-1.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:68782fdb4027b8d1eee25ec35e9a6db05e863b899eb0310b3a33b6c3fef55707", size = 117060, upload-time = "2026-09-15T19:31:31.367Z" }, - { url = "https://files.pythonhosted.org/packages/bb/cc/51a7b4abf4ac593b8e7eb3794b28e5a35ae26eed8bc04787628d215af82f/yarl-1.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:7d575b54cb3863ef9bc290ea4b009999d55dc237326131e4853cf33e888fee03", size = 102593, upload-time = "2026-09-15T19:31:33.329Z" }, - { url = "https://files.pythonhosted.org/packages/9d/21/0941a6b93a58b59a1ec75e5333bf06929b671309c43c0cd201c172d9c39f/yarl-1.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:bc3ac7bf569f6b64dad04dd7808c7872dae8a97df657856eac05e9b7e3614a85", size = 97697, upload-time = "2026-09-15T19:31:35.855Z" }, - { url = "https://files.pythonhosted.org/packages/7b/ed/2f3129bbcc9a5c8ba12cc2b29d8060a3bab9c8043c456cfd4b5ca3188890/yarl-1.25.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:25868beca8b6765f8f7d0e11fe6dd7c66dd4b0793b9500286d20cc92352126a5", size = 143623, upload-time = "2026-09-15T19:31:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f1bc3390fdca352826676b531d0712736f156919090206700421d46b2c37/yarl-1.25.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:10b2fd95332f0d716d5eee3c9fb2ce8eada19082de7fee83d32e37992fd75c26", size = 104011, upload-time = "2026-09-15T19:31:40.25Z" }, - { url = "https://files.pythonhosted.org/packages/a8/aa/50acc5c3e5da04172ae3c281c75405af4d2ca911e16120ab0563f4dffb66/yarl-1.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f12afda4eea8c8994a76d4df1875c765194f5fbe8a9d197929ea303caee29ec", size = 103677, upload-time = "2026-09-15T19:31:42.46Z" }, - { url = "https://files.pythonhosted.org/packages/30/d2/7d1e0ab9f8390e1fbcede5a6dbf70d23c96ad09b8c5567f3a514d1ddb0e2/yarl-1.25.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14b79a30a93a3ce2e8832603fd0ab780ada281b0ba5110b519a634f2d7d7d1fc", size = 115392, upload-time = "2026-09-15T19:31:44.371Z" }, - { url = "https://files.pythonhosted.org/packages/71/e1/5ba1e3a2a22139213655e760919038e8ed7e2d4a99826d0bbddb3beb96e5/yarl-1.25.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bd6340d20ae2c7ca719b87b426e808e90743b676d05d4c26c4fb5ca71f41184", size = 107493, upload-time = "2026-09-15T19:31:46.273Z" }, - { url = "https://files.pythonhosted.org/packages/f5/53/780653d5e0f73831f467cf13548912e5eec97f21dc49fc8daf21da027df4/yarl-1.25.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:126a2533570c554719ca40a1288fdee1700b6bc82e7131aa69fa85252d92e651", size = 122537, upload-time = "2026-09-15T19:31:48.654Z" }, - { url = "https://files.pythonhosted.org/packages/03/92/d54fa70236c6036271c9c9c09fd978df5cbe3ef49ef6c46e9b833476d215/yarl-1.25.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3faadac7d812ddac258feb57b9846b60c1b437c4f4b9ad42595c6f6fe4390df", size = 126170, upload-time = "2026-09-15T19:31:50.872Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b7/a82a49bf88340b837ef6972b508a1604ae377b9e6904b46b10cf5f1cf925/yarl-1.25.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be80550d9bfe83d9b62398a37081a90434e6df2d978ec345c3d2820de6beddab", size = 117012, upload-time = "2026-09-15T19:31:53.189Z" }, - { url = "https://files.pythonhosted.org/packages/ef/78/5d684b411e3f3602464ee9b538db48205038f8605872985f61efb809ced0/yarl-1.25.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e07595c7d6f4db270ceede356a1bd1c07a34f1c26f958d1ed0cd7b48e0d2bba3", size = 114950, upload-time = "2026-09-15T19:31:55.694Z" }, - { url = "https://files.pythonhosted.org/packages/2f/11/51d82b852c64f7fad0fc7a7ff3031517204887e874c722bbca839c0b23ac/yarl-1.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb96ed1ae6c7d072d60840c0434aef07a2df611812810807fbc54263a6053e9a", size = 115428, upload-time = "2026-09-15T19:31:57.966Z" }, - { url = "https://files.pythonhosted.org/packages/e4/49/9d1978049bf646b9ea918313926453c6901b71c92f097467777d47d36a88/yarl-1.25.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3feb99222553a8cbedfa52c2f59dd84c3f50d5b582c728d522caf8d72769a54b", size = 108428, upload-time = "2026-09-15T19:32:00.048Z" }, - { url = "https://files.pythonhosted.org/packages/43/35/7b8f1ebb45d7ec3dda7d1909bf44f458de41ef91e2937f107733582a5166/yarl-1.25.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a2ed0ba415ccdf08f14bf544cb78346d0f76086707ffee24921a2c84dbf1305a", size = 121961, upload-time = "2026-09-15T19:32:02.436Z" }, - { url = "https://files.pythonhosted.org/packages/63/d6/d8b689ab7ca26edeb85f6ff28812aac7a25376eefc1780e303a7bfbaceff/yarl-1.25.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2b49375d22299b0a834c2bca72f39aaecc270d96fb24c30424899676f487b22a", size = 114961, upload-time = "2026-09-15T19:32:04.456Z" }, - { url = "https://files.pythonhosted.org/packages/cf/d5/1a1798ea4dc6b7ee3260010a27907ebc697c95dae99817d817ed446d24aa/yarl-1.25.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ef74070ac553c59eb4f04258722066d6c6135b7baa03b2e9f2da65c096e96d98", size = 120036, upload-time = "2026-09-15T19:32:06.5Z" }, - { url = "https://files.pythonhosted.org/packages/91/8d/b1b35ed7903da6669b1d367cb2c09436acd4ff508029b4f39a0c0c2058fc/yarl-1.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0a66db89ea473abeac4b70523cafd94db3772380e565f9d28af7a179b7af71fa", size = 117276, upload-time = "2026-09-15T19:32:09.401Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8f/4db01cef62caff0d7a4593ed694fb8a41a27a11158cab80d290221f13e57/yarl-1.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:1f51020b2eb8a003c84925638ec63c21a750a4bddd3a22ec8eac6a742dadf1b9", size = 101945, upload-time = "2026-09-15T19:32:11.545Z" }, - { url = "https://files.pythonhosted.org/packages/c0/5e/3ce00497c5c0babb74d4130c10c3828ccd215b4819d12020c42429f991ac/yarl-1.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:b10dd0557ba422715b5206b3743192135a6022acca8baec51aa127d0a75db8fe", size = 97270, upload-time = "2026-09-15T19:32:14.127Z" }, - { url = "https://files.pythonhosted.org/packages/80/cf/54023edfab7aa773b860503db0c56e962ccab0922803ee97988c176ea090/yarl-1.25.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a9ca696eb02e5c02a8afd872ada510eba9b7fe6e68b9572c2e9a9b1941e31e2e", size = 143975, upload-time = "2026-09-15T19:32:16.416Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a8/e6c1be0e6761d0f2d10bbf33a3e1e02b99dc83874d92945d7b461a72481e/yarl-1.25.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a5877f2255aab518ebe528289037699201d5dc5f045f2396cb30aa02db22f57f", size = 104018, upload-time = "2026-09-15T19:32:18.364Z" }, - { url = "https://files.pythonhosted.org/packages/6e/bb/dda344765ffd3430afe1a1c66c866a57fae67786537d4f14607df6505ac1/yarl-1.25.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7a5c3115595995779ee21f2567035793911c3802a43c74f3fbb0314929ec67ac", size = 104156, upload-time = "2026-09-15T19:32:20.459Z" }, - { url = "https://files.pythonhosted.org/packages/e5/5f/ed1538bcd06009fe990d6d283dd7667f639e62a81e35c6d8c6ef6c08fb3c/yarl-1.25.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77e5099b99b37f3cf79c246998ca9f7313a78054cd1809ec46bc1afad47e1c4c", size = 116025, upload-time = "2026-09-15T19:32:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/a2/af/2185daf56b99830d3356ecfada46faaa49945de6626e842b7728088d4980/yarl-1.25.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6efaf45df6a849cef613a03a94c845647456662f85438c886bb67a9c027c8c2c", size = 106985, upload-time = "2026-09-15T19:32:24.749Z" }, - { url = "https://files.pythonhosted.org/packages/c1/65/bc1ae564fb4b04a30b6a8f250e787772581c57e4c3d5cf07ac3359de3103/yarl-1.25.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5f90e44653c4e0f78501ed9bb7d3fce835a8d62b7c6ed0cb16557534087e743", size = 123030, upload-time = "2026-09-15T19:32:27.084Z" }, - { url = "https://files.pythonhosted.org/packages/6a/3e/e2afcde10d74e53b3fa889960991efb3019beda2b1682a01de720a302056/yarl-1.25.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:632da579b2d879f6bad20f2cfa35ded1efe2f4f77f8abb26a6234a5b236acd2f", size = 126765, upload-time = "2026-09-15T19:32:29.332Z" }, - { url = "https://files.pythonhosted.org/packages/a2/be/415b00c0fe5a0615b062a456b26623d7ec91c2bee20faea1a14045aa0469/yarl-1.25.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:30eec96e8a91bd588ce897c9543f6d5d8d34b28fbcba28a4dedf20ebeae9fe57", size = 117199, upload-time = "2026-09-15T19:32:31.49Z" }, - { url = "https://files.pythonhosted.org/packages/97/27/3d8c63ddd3e8bcfd033748ab93876678ce59bacd66e4cb1ed851c9c5b37e/yarl-1.25.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:12b6bc4906e11f5e1a1cdcb12296e7afbd366c783cc8073403cd2fb74334e453", size = 115187, upload-time = "2026-09-15T19:32:34.137Z" }, - { url = "https://files.pythonhosted.org/packages/39/b7/7a81d0be1a502a26a0d4326c6f2ecb736c824f570ea1c6529f2b0b227b50/yarl-1.25.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9d6ed3d17bccce4c05343e1ca8da13bc5c02c812a4e7282ddd05e8769322d3fc", size = 116085, upload-time = "2026-09-15T19:32:36.438Z" }, - { url = "https://files.pythonhosted.org/packages/f0/69/39fff459916aa0fab42215dc47b759586fd80f94aa56dfc4a7c15ba6e0dc/yarl-1.25.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f38a70074041d3b7e138e452799f5174198bae5bd5ab2000917badf403908c5f", size = 107996, upload-time = "2026-09-15T19:32:38.959Z" }, - { url = "https://files.pythonhosted.org/packages/c0/39/80b9a55a3335590451d9ecf3eb593a8c635351f4c905ef056d7e8a8fd9e7/yarl-1.25.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca89e4e21854ed27ec753297dde84b16c9f8e53b14a4866fb44457d643c19f8", size = 122549, upload-time = "2026-09-15T19:32:41.151Z" }, - { url = "https://files.pythonhosted.org/packages/42/7d/a179c6757818bb59372a4adafd09f7f26a3b4a0f04c3ae404b544c0b0c82/yarl-1.25.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:1ab7618921a93767387a4b83776f751588f5b5ae9bb5bc96620e2e2e00bca868", size = 115107, upload-time = "2026-09-15T19:32:43.072Z" }, - { url = "https://files.pythonhosted.org/packages/32/2b/a773ac867e4ab53a98ed98e5cefe3bae31e6f550252ca9d1de266f1a40c5/yarl-1.25.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0ae12ff2b805fa02c4dab838005caef735e39986322698c48588d3beacb65c62", size = 120666, upload-time = "2026-09-15T19:32:45.061Z" }, - { url = "https://files.pythonhosted.org/packages/bc/41/52be6505e85b0f76b4f85b01b5de7e06a0512201abc2c95e14e099549174/yarl-1.25.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90c30ed53546da833c700115c0064c22120d1b1560f474699fd31f22dd668233", size = 117505, upload-time = "2026-09-15T19:32:47.177Z" }, - { url = "https://files.pythonhosted.org/packages/f5/01/349c0386caedbbe488d519f252df54efac8a1459282d466c474bdd84a620/yarl-1.25.1-cp314-cp314-win_amd64.whl", hash = "sha256:acfa7e22aa6c6e7a5996a41d275bfa01efa7ea56ab890590280e9063e2cf5c1b", size = 103446, upload-time = "2026-09-15T19:32:49.615Z" }, - { url = "https://files.pythonhosted.org/packages/5c/f0/8ec63180f77912f0dc4e5a42760cb8c08d20da1d5ace3578a01b84d1f3d8/yarl-1.25.1-cp314-cp314-win_arm64.whl", hash = "sha256:8e7d98cdbb6d71e726f7d525952867096053d1f290dd4e3c50d7d313a136f414", size = 99159, upload-time = "2026-09-15T19:32:51.686Z" }, - { url = "https://files.pythonhosted.org/packages/47/7d/92d2220d6886b70ab1ed8579533ac2af2dfac716d5d929001daff7986df9/yarl-1.25.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d21f0fa80a02d05299207eeaafef345d812ace96d5306e4ef265e1d419a615fa", size = 150071, upload-time = "2026-09-15T19:32:53.911Z" }, - { url = "https://files.pythonhosted.org/packages/64/fc/b245e448124bcda9340df38e3553fa222b50260fca027a84095e9bd8642d/yarl-1.25.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17c9877a89fb6e2bca6f9087eb24cd7fb434653946ef5075e470d23d49b52287", size = 106780, upload-time = "2026-09-15T19:32:56.443Z" }, - { url = "https://files.pythonhosted.org/packages/51/e2/9a6ce2e334ebf218a30335ae76fb1696459430d42f733b8cb0d7d65b84d3/yarl-1.25.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:29273edf1530e397bd07cb784db1fbe0d2590b77569f2e24679a9c0a2d763b94", size = 107361, upload-time = "2026-09-15T19:32:58.827Z" }, - { url = "https://files.pythonhosted.org/packages/ed/70/66e8c76b569b450d16e190f15071c916c3df70b0e33927e415ac497cf0c2/yarl-1.25.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7abffdf37af1cec6a2ad69b827aa84320db5894791bc8ed932dc93fb274b7e9", size = 114396, upload-time = "2026-09-15T19:33:02.24Z" }, - { url = "https://files.pythonhosted.org/packages/73/23/0d82838a05c57fdc05bc8b66e8c92dcc0df15e27463a5f163142d521c682/yarl-1.25.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2239a02249d9326655419e0168a28ca9008938eaab31dc29fc875c217927a6c0", size = 104882, upload-time = "2026-09-15T19:33:04.494Z" }, - { url = "https://files.pythonhosted.org/packages/86/d4/ea08615c4edaa6049a13a2f1128944d068d1893abda7d708d4d7ea01599a/yarl-1.25.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:664ec6a520b74a1df2810666eb67695fcb77fa663e6ea0a25aaf2e529cb24dfa", size = 119485, upload-time = "2026-09-15T19:33:06.583Z" }, - { url = "https://files.pythonhosted.org/packages/1a/82/0898bdce9b1ae403b308b9c733d0d24af4a3464270c2c081f457b16c3e0d/yarl-1.25.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4f1c91f5a5980a937ff8e238e98e6897e1ad74a4b1e2c0d68c73b5ffbb3f5c0b", size = 122490, upload-time = "2026-09-15T19:33:08.653Z" }, - { url = "https://files.pythonhosted.org/packages/d1/38/97d79b81c342b78246cfedb74809e68841f3198d21653e10d3232bd9c622/yarl-1.25.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c88edaec8c349ad4c5ad4c486a3defcc4b80ceb2f074436ffa0a87caf5e76a6", size = 115336, upload-time = "2026-09-15T19:33:11.056Z" }, - { url = "https://files.pythonhosted.org/packages/8e/9d/2577896554cd310dc470adb6da0b7dd0b435cb63e2565204a7ac240e504c/yarl-1.25.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:35dcbea443fafb3eece757ad4e514560ddeb6c34cfae1582c620d7b293d7feee", size = 111825, upload-time = "2026-09-15T19:33:13.204Z" }, - { url = "https://files.pythonhosted.org/packages/29/6b/7ac49d8ba84a5c4bd73415a4c949d22c749cb3762579b3d50e48019a78aa/yarl-1.25.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:882569ff613758cac762a457a5d72d6e211b28d4bcfea89d1d71ea942b02eac0", size = 114655, upload-time = "2026-09-15T19:33:15.553Z" }, - { url = "https://files.pythonhosted.org/packages/e5/18/e5942a16723f5b72f9b1297fd5a85a54f6300cd15c0dcb5005b90cd89156/yarl-1.25.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d0f1489233a254bb3643d2f05de7d59019254d81daeca6b9162fe9edef57e0c7", size = 106395, upload-time = "2026-09-15T19:33:17.599Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2d/549fa46240781513ebc47ae7eb418df428a163a2a3d644cc9cbb3ecb7846/yarl-1.25.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f41753a76f4f63927d03a0d8ba8f5ce0f2083bec29a8cfaccc55371b1564b96b", size = 119277, upload-time = "2026-09-15T19:33:19.973Z" }, - { url = "https://files.pythonhosted.org/packages/76/16/4763f78dcdc0b3b9fb3842b04afe72b9320857c6a69300c62a0eab03d119/yarl-1.25.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fb0eb4955adf0579001581f2f71a126e8781ba61bcd120f127b0401163c6c2d", size = 112504, upload-time = "2026-09-15T19:33:22.464Z" }, - { url = "https://files.pythonhosted.org/packages/ae/b4/974e3edfe0d188393ce1cb9de400111c63fe61f4eb3b772a500d84c970d1/yarl-1.25.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a1e32763e641a1566507d90a8d3b19bfc3cc04a9d4e5ae3e32189874ed4b58a3", size = 116243, upload-time = "2026-09-15T19:33:24.788Z" }, - { url = "https://files.pythonhosted.org/packages/b0/aa/157b940428da80c104ca09666a740e51c94963df65d5b112e06b52e4d7a8/yarl-1.25.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65b5b2066651b7432d389e9799d979c703bcc6ef44266bb8153ef54e91e4aab3", size = 115822, upload-time = "2026-09-15T19:33:26.886Z" }, - { url = "https://files.pythonhosted.org/packages/7e/af/19fbdce41412e1b96825544cc52cd7029d3724655d0988237972f078bd29/yarl-1.25.1-cp314-cp314t-win_amd64.whl", hash = "sha256:734f6e5400352ac4254456003d462866c684703570929cff7a7bde015d0cb371", size = 107386, upload-time = "2026-09-15T19:33:29.009Z" }, - { url = "https://files.pythonhosted.org/packages/2a/99/f6431c8968e89be608d74b28ae2d024521b2953f27dd44e0dece5e04f67a/yarl-1.25.1-cp314-cp314t-win_arm64.whl", hash = "sha256:287e99ff5aa4dc1c7630bfc683ded6f106d756c99dec432a2d7f197a784f51c6", size = 102094, upload-time = "2026-09-15T19:33:31.151Z" }, - { url = "https://files.pythonhosted.org/packages/c7/3b/4f51eab40c2eabea6c3d5b121dff4b8988dc35087732ffede12d2be8b8dd/yarl-1.25.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9b1bdaae98bc016825dd3c9d8ee1832f829b3341f9cc6ebd1a1b0a7fef7367cc", size = 143875, upload-time = "2026-09-15T19:33:33.52Z" }, - { url = "https://files.pythonhosted.org/packages/41/05/bbd58fc063f5f299a883f810760b265ca26c8167c91cb9a494d0fe2387e1/yarl-1.25.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:e7011b8fb8c4054bf0c12e5edc6cd83778b0028e99ce59b18586ed036f92cfdc", size = 104028, upload-time = "2026-09-15T19:33:36.22Z" }, - { url = "https://files.pythonhosted.org/packages/12/ee/2fba0aecb52e7020e189f684148783aa0b9cfa3b3bfb0b400646eef70ad4/yarl-1.25.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f074e8d4aa0a5798920ddb6de3d08b228c614ff3724c3e8bd7577f4bafea867b", size = 104041, upload-time = "2026-09-15T19:33:38.86Z" }, - { url = "https://files.pythonhosted.org/packages/38/35/884beab53ed88c7247d1671972b5ef116f7351fe0c7e6de8c3558372cb16/yarl-1.25.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d42e7e3ca399555578b4d617e3a6ecf13371b3743a115995fa010c7bf341459", size = 116018, upload-time = "2026-09-15T19:33:44.265Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cc/1a91b685afb55cc18608443ace95280e96e263a97565811732b6788d3269/yarl-1.25.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aa4ed3dd308548f9e707d9caaf005d2d7f8c1e7868f858dfeb47fe76e16b391d", size = 107033, upload-time = "2026-09-15T19:33:46.45Z" }, - { url = "https://files.pythonhosted.org/packages/c5/c1/58b379fcb1d68d907b7fcf75200c44321896509b2a6a74abbb4b19d864d2/yarl-1.25.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42a66563d8cc056ee32e6191e05097a7b2b3bc302e0bc3133daf8710eb18bd26", size = 123257, upload-time = "2026-09-15T19:33:48.631Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2d/1fe96cf5c2aeab10095e48f38585cf5a8451fb7253234822398e52aa5336/yarl-1.25.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:98d370568f393215d605304cdb77b3d5539bd192c75b623c7304c42c8d6d8273", size = 126745, upload-time = "2026-09-15T19:33:50.999Z" }, - { url = "https://files.pythonhosted.org/packages/ad/60/8674394ce43f4dadae573a1d6f451716438e9eab7d7fe8d643c673a32d85/yarl-1.25.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23bf5b403c879a54964e0feac7285688e04bb220074878d737d331522da0a5bf", size = 117255, upload-time = "2026-09-15T19:33:53.456Z" }, - { url = "https://files.pythonhosted.org/packages/2f/72/0faa30e02605d56127d42bb987dcc97da3863b7bf70b9bfbf5f739c05e30/yarl-1.25.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d45673badd08456d0340e9364eddafe1c53a9d2896424294de4d7dd71ad3ee57", size = 115166, upload-time = "2026-09-15T19:33:55.669Z" }, - { url = "https://files.pythonhosted.org/packages/8c/90/9a46eac564c437e128285c5c1d7bb385d268394e9209d84f6bf4a14471ef/yarl-1.25.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:0136d640dfa9b0523853e411430a99f8a91eca85774c6420285a33b755bc6de3", size = 116082, upload-time = "2026-09-15T19:33:57.78Z" }, - { url = "https://files.pythonhosted.org/packages/ad/38/4b1a686a3758878f93d2f1ea943f5a165f3555769cd16e761cfd0efdca17/yarl-1.25.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:59ba3a6e1aa8cfe5adf4bd270fd965db21955401b7ca6f1696010c55ed4daec2", size = 108048, upload-time = "2026-09-15T19:34:00.25Z" }, - { url = "https://files.pythonhosted.org/packages/da/14/f348eb967f31a58348612a2b93bd8a2ab664548e2b5e879cac7f592f7201/yarl-1.25.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:87796fedc3ba97ec14fab55acb48584276e6c1e4c1e89c422bda62c838e754a9", size = 122775, upload-time = "2026-09-15T19:34:02.455Z" }, - { url = "https://files.pythonhosted.org/packages/ab/e9/4f7b79700f88cb9e8bb66f8b54f9bce1844c013a2c39fdc47112e9334c95/yarl-1.25.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:bd0912757081f89b107d6c00b2ff8a194401b0b87eadcf4481de2b865a8fd44f", size = 115096, upload-time = "2026-09-15T19:34:05.283Z" }, - { url = "https://files.pythonhosted.org/packages/cf/37/f9cb020331997d3eb887bd28d5410ecfd3d80bf163c23d7cec490d78dade/yarl-1.25.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:b51c159a9794633f5e0db7ecec7b2b6e3734eca1f5d17dc989ff3552a43ff78b", size = 120655, upload-time = "2026-09-15T19:34:07.382Z" }, - { url = "https://files.pythonhosted.org/packages/12/83/52fceb22891a41f168db7ec22fd1d81e06b6a0b8d9f70921bd3e785defd0/yarl-1.25.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:319e070a01db9920fb63761843f96a104c8e2b9427266731810dc1e22595b17c", size = 117488, upload-time = "2026-09-15T19:34:09.988Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5c/ce6c4ff1247fcbe4b33d462c23a097106d909b173fde7042bc52290466e2/yarl-1.25.1-cp315-cp315-win_amd64.whl", hash = "sha256:a2059a2d891bd156bc5184e7ab7a56e78a84dfcfdeac8c501b552533ad1c36ee", size = 103434, upload-time = "2026-09-15T19:34:12.56Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a1/766a906b0704fb26d52b19dc22bed48a8ba0544203b70dcf44da350e8194/yarl-1.25.1-cp315-cp315-win_arm64.whl", hash = "sha256:a78b50b4f7918a3de71105d5c0b93bbc57bb8339a4d03a9dfd449f9068e76f3d", size = 99155, upload-time = "2026-09-15T19:34:15.132Z" }, - { url = "https://files.pythonhosted.org/packages/bd/d3/a1d09b32cb6ab14f66b44939f5b4255b8b9e747aef3974af1d5d80ccc2fd/yarl-1.25.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:b5402a340723fa7da00b5cff987ddab61276be6d11251ea71ae02bcac54890d8", size = 149284, upload-time = "2026-09-15T19:34:17.452Z" }, - { url = "https://files.pythonhosted.org/packages/7f/3b/fe554d879692650bca70bfbc0df124e82e4d2bb7456f698c7756f1279a96/yarl-1.25.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:eda19ea5ee88742f47a2340816e6f2d40b53bed3ab5b69794769f36af9f35bb4", size = 106399, upload-time = "2026-09-15T19:34:21.474Z" }, - { url = "https://files.pythonhosted.org/packages/e1/4b/e7af56177ac8d40094c82d7728224c0b8472157d50d362e5fb3b014b2bc8/yarl-1.25.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:75baa6cf9b6d1c52f3e111a130e202fd8cf0a5b3a066c3f73d615e885092e4ec", size = 106968, upload-time = "2026-09-15T19:34:23.619Z" }, - { url = "https://files.pythonhosted.org/packages/da/4f/2df41fd738d46f23ef829ae8b4468d94bb6070038fc6dfab6165ed44fea8/yarl-1.25.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbcef5a9119ef653653132cccaf999b30a0af6f33bb0a4ba80bec30056868487", size = 114717, upload-time = "2026-09-15T19:34:25.879Z" }, - { url = "https://files.pythonhosted.org/packages/69/ea/002b66df53bbd1aed1c23358ff99c9bdc744fe3f4d2740e1b2fdd7192885/yarl-1.25.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7efc9f082dfed77c316edffa9deb52888e1bc6789171887cc1f68e06d65465c8", size = 105198, upload-time = "2026-09-15T19:34:28.204Z" }, - { url = "https://files.pythonhosted.org/packages/b1/7c/95c8bc0c8f97d71e59c94525ad60d76f5c57d3f2820f08137ca8b9f0542a/yarl-1.25.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fe01645169a2112aa1d4ebc3e4c5f029c5c8f97adfc32e5d37c993b39a994d75", size = 120271, upload-time = "2026-09-15T19:34:30.5Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7a/6fe9da56ec77927baa669fd86c39c567ce6205bab53d581082c6744c8ae7/yarl-1.25.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1c557dfd5e3db046053a0bdc72261ade790ebe8e2c7a41b36b0ca1f14cb95f3", size = 123572, upload-time = "2026-09-15T19:34:32.73Z" }, - { url = "https://files.pythonhosted.org/packages/8b/83/35f222d17fa70a14c7c74fdf112ccf5515e0c2a87082b1f9b99f7693bf57/yarl-1.25.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ce4d6ccafb33d39bd78444612d14938ead674c25702ded2ee9c54a47735d225", size = 115228, upload-time = "2026-09-15T19:34:35.344Z" }, - { url = "https://files.pythonhosted.org/packages/da/6f/fbaaf619423578a7d898d0f226ae47bc1906c293865c416d83c17b828b0e/yarl-1.25.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80a063f8297fc796296f00f100be520f209b23dc98f93ce8eba6ee7122598209", size = 111618, upload-time = "2026-09-15T19:34:37.656Z" }, - { url = "https://files.pythonhosted.org/packages/ba/78/7383278f1b3cf8e0496bd95b3281a7b09b89217b6b428db24c6b99b3deca/yarl-1.25.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:7cb414a73e21a7ab58254926073f2930cb22f5b4314ea4260a687e2b3fd4dce3", size = 114839, upload-time = "2026-09-15T19:34:40.099Z" }, - { url = "https://files.pythonhosted.org/packages/62/49/5506e5b6d29aab91bd845cc9016d88c3d3f81b81bc242b8100bdd5737825/yarl-1.25.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:85a18376073f8a39aa07be34f9fc77e2869aa72c55c441efdd2cf79a0407504d", size = 106212, upload-time = "2026-09-15T19:34:42.768Z" }, - { url = "https://files.pythonhosted.org/packages/46/8a/19877c193b7c5929f4b07118c18bbe390f3fadd0f59dd98c0cd12b31fa5c/yarl-1.25.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:77716e245c90f058466a05e6a465bb8600f767a8f4b18b4d40f3aff958e5f73c", size = 119985, upload-time = "2026-09-15T19:34:44.976Z" }, - { url = "https://files.pythonhosted.org/packages/4e/6c/0a46fbbf9ecbcbd0cc20d2193394254b9e19817f22c814aab60f99847400/yarl-1.25.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:1e80dcf1446e1b080b1932b0d103c464a04112f5bc31f0f983ad418172063cde", size = 112081, upload-time = "2026-09-15T19:34:47.45Z" }, - { url = "https://files.pythonhosted.org/packages/ef/30/93f5d471230c74ccd06255d0842739f86551f937f9e63a5e947853c6244a/yarl-1.25.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:bdc8d8b8c22e9e43ac68316b5e6cf083dec537f4ec213cb4aa967b583bc3fa64", size = 116995, upload-time = "2026-09-15T19:34:49.972Z" }, - { url = "https://files.pythonhosted.org/packages/2b/80/c386593035ee3f9c6c6af0847b5578f2830c674794a9d7701b744a3ebd42/yarl-1.25.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbf531053a0935f2e871bcd4753f90313688772ff8c017f5ea402e315a78c1f", size = 115570, upload-time = "2026-09-15T19:34:52.628Z" }, - { url = "https://files.pythonhosted.org/packages/38/02/eef443559563ef8f2e10469387b8b1e97cb5efee95b288a56da60801f7ee/yarl-1.25.1-cp315-cp315t-win_amd64.whl", hash = "sha256:b13b88747769537f3d32e89e3a735da10c0a9e35d7322928c701b5f93d3afffd", size = 106811, upload-time = "2026-09-15T19:34:54.935Z" }, - { url = "https://files.pythonhosted.org/packages/88/91/41e284ca2cf5211e05dae031d126a3668aea88fa759df56e7e35c6ad25ba/yarl-1.25.1-cp315-cp315t-win_arm64.whl", hash = "sha256:783dd1467083f4d3f7722ad6a313f24c173e7571372738fcb7a6e6d1ba48df25", size = 101804, upload-time = "2026-09-15T19:34:57.231Z" }, - { url = "https://files.pythonhosted.org/packages/54/22/318c7980066769c6bcd9221ed2248294f5698811da099013098c670565ed/yarl-1.25.1-py3-none-any.whl", hash = "sha256:681c758b0490f9e96b78e5fa8e8dc6e648e9185bb6eaebe73183c33ea0c445f3", size = 63617, upload-time = "2026-09-15T19:34:59.616Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/31/33/ebe9e3d1f86c7a0b51094c0a146392045ca1631d2664889539dec8088a33/yarl-1.24.5.tar.gz", hash = "sha256:e81b83143bee16329c23db3c1b2d82b29892fcbcb849186d2f6e98a5abe9a57f", size = 228679, upload-time = "2026-07-20T02:07:45.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/ac/cacdda1f0a90441297210bc34cf7e4ac1b7318c8030ebd83bdf6fe82f1db/yarl-1.24.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88f50c94e21a0a7f14042c015b0eba1881af78562e7bf007e0033e624da59750", size = 135466, upload-time = "2026-07-20T02:04:21.695Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a5/1b2ceace0230e40c52ab1b263148059a43a6303219b996affc68f8381836/yarl-1.24.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6efbccc3d7f75d5b03105172a8dc86d82ba4da86817952529dd93185f4a88be2", size = 97291, upload-time = "2026-07-20T02:04:24.045Z" }, + { url = "https://files.pythonhosted.org/packages/59/1d/340d1a0db7bbce1f291afc044255ebf4ebbce2b25ab1b3f7d3d069080f5d/yarl-1.24.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0ebfaffe1a16cb72141c8e09f18cc76856dbe58639f393a4f2b26e474b96b871", size = 97154, upload-time = "2026-07-20T02:04:25.761Z" }, + { url = "https://files.pythonhosted.org/packages/05/41/25596a33c2fb5098dca8dc3773b04221db64ded0b7f8f09885647d864610/yarl-1.24.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ac73abdc7ab75610f95a8fd994c6457e87752b02a63987e188f937a1fc180f0", size = 109196, upload-time = "2026-07-20T02:04:27.543Z" }, + { url = "https://files.pythonhosted.org/packages/f2/df/dd9f2fb8a5c6054fbefd1538d2b9b1127e612d2ee64b307a070173b57afd/yarl-1.24.5-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4d97a951a81039050e45f04e96689b58b8243fa5e62aa14fe67cb6075300885e", size = 102556, upload-time = "2026-07-20T02:04:29.16Z" }, + { url = "https://files.pythonhosted.org/packages/cb/57/4754b9d2c8945880290ecba0864e8b0441e117bba70534fe819e3645e174/yarl-1.24.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fe7b7bb170daccbba19ad33012d2b15f1e7942296fd4d45fc1b79013da8cc0f2", size = 117965, upload-time = "2026-07-20T02:04:30.845Z" }, + { url = "https://files.pythonhosted.org/packages/74/b5/6a9ece27d2043c3386f902dd078ab35d29ef5126b3206ebffb673283a7cb/yarl-1.24.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:89a1bbb58e0e3f7a283653d854b1e95d65e5cfd4af224dac5f02629ec1a3e621", size = 116266, upload-time = "2026-07-20T02:04:32.573Z" }, + { url = "https://files.pythonhosted.org/packages/9e/bc/a6653249f6ee59ec85dcfec008d9cbc16586dad613963bb17a91b2b993a5/yarl-1.24.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7fa5e51397466ea7e98de493fa2ff1b8193cfef8a7b0f9b4842f92d342df0dba", size = 110758, upload-time = "2026-07-20T02:04:34.235Z" }, + { url = "https://files.pythonhosted.org/packages/65/7e/c5a12fb8208df7b981bc82256e7831ce428eeaf893f7bbe6179c57bb9252/yarl-1.24.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4103b77b8a8225e413107d2349b65eb3c1c52627b5cc5c3c4c1c6a798b218950", size = 110120, upload-time = "2026-07-20T02:04:35.85Z" }, + { url = "https://files.pythonhosted.org/packages/04/6c/1b659b964626694667b3ec01bf4bcff564b73ae7c48ea1fbfe588b78b461/yarl-1.24.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f9f3e9c8a9ecffa57bef8fb4fa19e5fa4d2d8307cf6bac5b1fca5e5860f4ba00", size = 108834, upload-time = "2026-07-20T02:04:37.67Z" }, + { url = "https://files.pythonhosted.org/packages/74/a6/bf48f55c2104e40c15b7b13fad0a5756a11552a55f01c90bc90a66ab81c3/yarl-1.24.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0ebc836c47a6477e182169c6a476fc691d12b518894bf7dd2572f0d59f1c7ed", size = 103442, upload-time = "2026-07-20T02:04:39.576Z" }, + { url = "https://files.pythonhosted.org/packages/37/ac/84b273ac133ecdce598fc1f4140a08a1bf2044048bff8106371d207d105f/yarl-1.24.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:96d30286dd02679e32a39aa8f0b7498fc847fcda46cfc09df5513e82ce252440", size = 117413, upload-time = "2026-07-20T02:04:41.549Z" }, + { url = "https://files.pythonhosted.org/packages/a4/55/9307e03977d3b290dfa42e5d2bae7b6140808fd1786fbe70cd9d3bee53c5/yarl-1.24.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:fd8c81f346b58f45818d09ea11db69a8d5fd34a224b79871f6d44f12cd7977b1", size = 109498, upload-time = "2026-07-20T02:04:43.468Z" }, + { url = "https://files.pythonhosted.org/packages/fc/be/791a6f314cb4c989c19f8e3a10271f1e469c077143915e52474d80f26b4b/yarl-1.24.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5c55256dee8f4b27bfbf636c8363383c7c8db7890c7cba5217d7bd5f5f21dab6", size = 116062, upload-time = "2026-07-20T02:04:45.319Z" }, + { url = "https://files.pythonhosted.org/packages/19/1a/ddd3807b86055010e2f99aa89b3c640effdb65696766c20597f696f48a1c/yarl-1.24.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9f4d8cf085a4c6a40fb97ea0f46938a8df43c85d31f9d45e2a8867ea9293790d", size = 110941, upload-time = "2026-07-20T02:04:47.054Z" }, + { url = "https://files.pythonhosted.org/packages/6d/03/f34271bba042d2187508bf62aea20a14129efb5a1acfc6a2efe7544630b4/yarl-1.24.5-cp310-cp310-win_amd64.whl", hash = "sha256:240cbec09667c1fed4c6cd0060b9ec57332427d7441289a2ed8875dc9fb2b224", size = 97534, upload-time = "2026-07-20T02:04:48.774Z" }, + { url = "https://files.pythonhosted.org/packages/e4/02/ecc8dc31b9f355731e700f8402b8075d2ea1737dbc4baf4abf0f0fc64288/yarl-1.24.5-cp310-cp310-win_arm64.whl", hash = "sha256:8a6987eaad834cb32dd57d9d582225f0054a5d1af706ccfbbdba735af4927e13", size = 93603, upload-time = "2026-07-20T02:04:50.686Z" }, + { url = "https://files.pythonhosted.org/packages/fe/db/3cb5df059756a45761cc3dee8fd25ec82b83a6585ea3542b969fda850f99/yarl-1.24.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2c1fe720934a16ea8e7146175cba2126f87f54912c8c5435e7f7c7a51ef808d3", size = 135043, upload-time = "2026-07-20T02:04:52.39Z" }, + { url = "https://files.pythonhosted.org/packages/44/f8/767d6bd5a03db63bc467df2fb56d6fafeae9667d74aea92cd6af399f828b/yarl-1.24.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c687ed078e145f5fd53a14854beff320e1d2ab76df03e2009c98f39a0f68f39a", size = 96942, upload-time = "2026-07-20T02:04:54.26Z" }, + { url = "https://files.pythonhosted.org/packages/ce/97/10b939c44d7b28d1dbc389cfc7012306d1ea8dba01eaef44b39fffaee52a/yarl-1.24.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:709f1efed56c4a145793c046cd4939f9959bcd818979a787b77d8e09c57a0840", size = 97046, upload-time = "2026-07-20T02:04:56.638Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7a/b410dbe39b6255c55fb2a2bcee96eb844d0789235ddc381a889a90dc72d6/yarl-1.24.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874019bd513008b009f58657134e5d0c5e030b3559bd0553976837adf52fe966", size = 110512, upload-time = "2026-07-20T02:04:58.955Z" }, + { url = "https://files.pythonhosted.org/packages/83/c7/da591971f78a5617e1f21f5699858ebccd836fe181a6493788ffc91ba69b/yarl-1.24.5-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a4582acf7ef76482f6f511ebaf1946dae7f2e85ec4728b81a678c01df63bd723", size = 102454, upload-time = "2026-07-20T02:05:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/c4/8e/73b0ed4de47289a78a96045d76d1cfe5e41848bf0da59ce25b2ec87ee05d/yarl-1.24.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2cabe6546e41dabe439999a23fcb5246e0c3b595b4315b96ef755252be90caeb", size = 117617, upload-time = "2026-07-20T02:05:02.325Z" }, + { url = "https://files.pythonhosted.org/packages/cf/14/b744747bc4f57a8d55bd744df463457524583e1e9f7538b5ace0346ab92e/yarl-1.24.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:17f57620f5475b3c69109376cc87e42a7af5db13c9398e4292772a706ff10780", size = 116135, upload-time = "2026-07-20T02:05:04.05Z" }, + { url = "https://files.pythonhosted.org/packages/66/ca/95aa4d0e5b7ea4f20e4d577c42d001ed9df207569fdb063cc5ed4ebb496b/yarl-1.24.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:570fec8fbd22b032733625f03f10b7ff023bc399213db15e72a7acaef28c2f4e", size = 111935, upload-time = "2026-07-20T02:05:05.738Z" }, + { url = "https://files.pythonhosted.org/packages/72/0d/d2ad8d6b147832d177a4e720ba1962fe686eb0913b74503b3eca094b8bba/yarl-1.24.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5fede79c6f73ff2c3ef822864cb1ada23196e62756df53bc6231d351a49516a2", size = 110010, upload-time = "2026-07-20T02:05:07.471Z" }, + { url = "https://files.pythonhosted.org/packages/50/18/eb335e4120903903f4865041355ae46256a2406eb2865bc24827f4f27b61/yarl-1.24.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ccf9aca873b767977c73df497a85dbedee4ee086ae9ae49dc461333b9b79f58", size = 110058, upload-time = "2026-07-20T02:05:09.246Z" }, + { url = "https://files.pythonhosted.org/packages/44/70/97353add32c62ad6f206d948ac5a5ee84398225e534dc6ed6433d1b335b6/yarl-1.24.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ad5d8201d310b031e6cd839d9bac2d4e5a01533ce5d3d5b50b7de1ef3af1de61", size = 103308, upload-time = "2026-07-20T02:05:11.31Z" }, + { url = "https://files.pythonhosted.org/packages/68/39/5e7398d4b6f6b3c9062823ebc60802df5b272e3fe9e788f9734c6ee46c85/yarl-1.24.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:841f0852f48fefea3b12c9dfec00704dfa3aef5215d0e3ce564bb3d7cd8d57c6", size = 116898, upload-time = "2026-07-20T02:05:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/09e52f2239e8b96357eccca05915382e4ba5405ebfb623b6036040d99654/yarl-1.24.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:9baafc71b04f8f4bb0703b21d6fc9f0c30b346c636a532ff16ec8491a5ea4b1f", size = 109400, upload-time = "2026-07-20T02:05:14.821Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6a/e94133d4c2d1a14d2384310bf3e79d9cf32c9d1eae1c6f034fb80d098fa1/yarl-1.24.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d897129df1a22b12aeed2c2c98df0785a2e8e6e0bde87b389491d0025c187077", size = 115934, upload-time = "2026-07-20T02:05:17.78Z" }, + { url = "https://files.pythonhosted.org/packages/4e/3c/34955ed967b976fc38edcbb6d538dee79dbda4cb7fc7f72a0907a7c78e0f/yarl-1.24.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dd625535328fd9882374356269227670189adfcc6a2d90284f323c05862eecbd", size = 112178, upload-time = "2026-07-20T02:05:19.675Z" }, + { url = "https://files.pythonhosted.org/packages/f5/46/d7bd3a8859d47dcfaffd7127af7076032a7da278a9a02e17b5f37bfb6712/yarl-1.24.5-cp311-cp311-win_amd64.whl", hash = "sha256:f4239bbec5a3577ddb49e4b50aeb32d8e5792098262ae2f63723f916a29b1a25", size = 97544, upload-time = "2026-07-20T02:05:21.523Z" }, + { url = "https://files.pythonhosted.org/packages/01/69/c1bfd21e32c638974ea2c542a0b8c53ef1fa9eff336020f5d014f9503ff2/yarl-1.24.5-cp311-cp311-win_arm64.whl", hash = "sha256:3ac6aff147deb9c09461b2d4bbdf6256831198f5d8a23f5d37138213090b6d8a", size = 93359, upload-time = "2026-07-20T02:05:23.493Z" }, + { url = "https://files.pythonhosted.org/packages/1b/84/71d051c850b5af41d168c679d9eb67eb7c55283ac4ee131673edf134bc4e/yarl-1.24.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d693396e5aea78db03decd60aec9ece16c9b40ba00a587f089615ff4e718a81d", size = 136035, upload-time = "2026-07-20T02:05:25.489Z" }, + { url = "https://files.pythonhosted.org/packages/03/4d/8ad27f9a1b7e69313cca5d695b925b48efe51208d3490e0844bae97cabc0/yarl-1.24.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3363fcc96e665878946ad7a106b9a13eac0541766a690ef287c0232ac768b6ec", size = 97642, upload-time = "2026-07-20T02:05:27.429Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b4/05b4131c407006cd1e410e9c6539f16a0945724677e5364447313c15ea3e/yarl-1.24.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9d399bdcfb4a0f659b9b3788bbc89babe63d9a6a65aacdf4d4e7065ff2e6316c", size = 97323, upload-time = "2026-07-20T02:05:29.441Z" }, + { url = "https://files.pythonhosted.org/packages/20/16/e618c875c73e0e39611f20a581b3d5e8d59b8857bf001bee3263044c6deb/yarl-1.24.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90333fd89b43c0d08ac85f3f1447593fc2c66de18c3d6378d7125ea118dc7a54", size = 107741, upload-time = "2026-07-20T02:05:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9a/c4defeaf3ed33fcb346aacf9c6e971a8d4e2bde04a0310e79abb208e7965/yarl-1.24.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:665b0a2c463cc9423dd647e0bfd9f4ccc9b50f768c55304d5e9f80b177c1de12", size = 103570, upload-time = "2026-07-20T02:05:33.303Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e7/0e0e0de5865ebd5914537ef486f36c727a59865c3ac0cf5ff1b32aececbf/yarl-1.24.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e006d3a974c4ee19512e5f058abedb6eef36a5e553c14812bdeba1758d812e6d", size = 115815, upload-time = "2026-07-20T02:05:35.292Z" }, + { url = "https://files.pythonhosted.org/packages/2b/27/ca56b700cb170aba25a3893b75355b213935657dc5714d2383354a270e62/yarl-1.24.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e7d42c531243450ef0d4d9c172e7ed6ef052640f195629065041b5add4e058d1", size = 116025, upload-time = "2026-07-20T02:05:37.503Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d0/d56c859b8222116f5d68459199f48359e0bf121b6f65a69bf329b3602ba0/yarl-1.24.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f08c7513ecef5aad65687bfdf6bc601ae9fccd04a42904501f8f7141abad9eb9", size = 109835, upload-time = "2026-07-20T02:05:39.506Z" }, + { url = "https://files.pythonhosted.org/packages/70/a2/3a35557e4d1a79425040eba202ccaf08bdc8717680fc77e2498a1ad2e0a5/yarl-1.24.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c95b17fe34ed802f17e205112e6e10db92275c34fee290aa9bdc55a9c724027", size = 108884, upload-time = "2026-07-20T02:05:41.584Z" }, + { url = "https://files.pythonhosted.org/packages/e4/35/ef4c26356b7913c68983bac2d72a4212b3347af551cb8d250b99b5ed7b7f/yarl-1.24.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56b149b22de33b23b0c6077ab9518c6dcb538ad462e1830e68d06591ccf6e38b", size = 107308, upload-time = "2026-07-20T02:05:43.697Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/ff0dc66c2ccf3e0153ab97ff61eabab4400e6a5264af427ab30cd69f1857/yarl-1.24.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a8fe66b8f300da93798025a785a5b90b42f3810dc2b72283ff84a41aaaebc293", size = 103646, upload-time = "2026-07-20T02:05:45.895Z" }, + { url = "https://files.pythonhosted.org/packages/74/f0/33b9271c7f881766359d58266fa0811d2e5210ed860e28da7dc6d7786344/yarl-1.24.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:377fe3732edbaf78ee74efdf2c9f49f6e99f20e7f9d2649fda3eb4badd77d76e", size = 115305, upload-time = "2026-07-20T02:05:47.832Z" }, + { url = "https://files.pythonhosted.org/packages/ef/65/fd79fb1868c4a80db8661091de525bf430f63c3bea1b20e8b6a84fc7d359/yarl-1.24.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e8ffa78582120024f476a611d7befc123cee59e47e8309d470cf667d806e613b", size = 108404, upload-time = "2026-07-20T02:05:49.604Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ba/dbabe6b262f17a816c70cfc09558dbf03ece3ec76684d02f911a3d3a189c/yarl-1.24.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:daba5e594f06114e37db186efd2dd916609071e59daca901a0a2e71f02b142ce", size = 115940, upload-time = "2026-07-20T02:05:51.741Z" }, + { url = "https://files.pythonhosted.org/packages/a5/43/fab2d1dad9d340a268cdde63756a123d069723efff6a372d123fa74a9517/yarl-1.24.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:65be18ec59496c13908f02a2472751d9ef840b4f3fb5726f129306bf6a2a7bba", size = 110006, upload-time = "2026-07-20T02:05:53.554Z" }, + { url = "https://files.pythonhosted.org/packages/c4/27/41eb51bbd1b8d89546b83897cfb0164f1e109304fd408dbb151b639eec0f/yarl-1.24.5-cp312-cp312-win_amd64.whl", hash = "sha256:a929d878fec099030c292803b31e5d5540a7b6a31e6a3cc76cb4685fc2a2f51b", size = 97618, upload-time = "2026-07-20T02:05:55.57Z" }, + { url = "https://files.pythonhosted.org/packages/3c/25/b2553764b3d65db711d8f45416351ec4f420847558eb669edcbcaadf5780/yarl-1.24.5-cp312-cp312-win_arm64.whl", hash = "sha256:7ce27823052e2013b597e0c738b13e7e36b8ccb9400df8959417b052ab0fd92c", size = 93018, upload-time = "2026-07-20T02:05:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/e1/63/64ef361967cc983573149dc1515d531db5da8a4c92d22bb833d59e01b313/yarl-1.24.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:79af890482fc94648e8cde4c68620378f7fef60932710fa17a66abc039244da2", size = 135075, upload-time = "2026-07-20T02:05:59.671Z" }, + { url = "https://files.pythonhosted.org/packages/bb/89/55920fd853ce43e608adbc3962456f0d649d6bb15250dc2988321da0fe1c/yarl-1.24.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46c2f213e23a04b93a392942d782eb9e413e6ef6bf7c8c53884e599a5c174dcb", size = 97225, upload-time = "2026-07-20T02:06:01.769Z" }, + { url = "https://files.pythonhosted.org/packages/15/f0/7688d3f2cfff7590df2af38ec46d969f4281a4dddb08a9ad2eafbcdddf98/yarl-1.24.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92ab3e11448f2ff7bf53c5a26eff0edc086898ec8b21fb154b85839ce1d88075", size = 96751, upload-time = "2026-07-20T02:06:03.676Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/a851a0f94aaaf379dd4f901bfc80f634280bec51eb260b47363e2a4cd62e/yarl-1.24.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ebb0ec7f17803063d5aeb982f3b1bd2b2f4e4fae6751226cbd6ba1fcfe9e63ff", size = 107960, upload-time = "2026-07-20T02:06:05.699Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a8/faea066c12f9c77ca0de90641f1655f9dd7b412477bf28c76d692f3aecff/yarl-1.24.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:82632daed195dcc8ea664e8556dc9bdbd671960fb3776bd92806ce05792c2448", size = 103500, upload-time = "2026-07-20T02:06:07.556Z" }, + { url = "https://files.pythonhosted.org/packages/fb/9c/1e67084c2a6e2f2db0e3be798328cb3be42c0119b621d25461479a224d21/yarl-1.24.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:53e549287ef628fecba270045c9701b0c564563a9b0577d24a4ec75b8ab8040f", size = 115780, upload-time = "2026-07-20T02:06:09.599Z" }, + { url = "https://files.pythonhosted.org/packages/58/86/1f94664e147474337e3359f52012cf3d02f825f694317b178bfba1078c62/yarl-1.24.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fcd3b77e2f17bbe4ca56ec7bcb07992647d19d0b9c05d84886dcd6f9eb810afd", size = 115308, upload-time = "2026-07-20T02:06:11.352Z" }, + { url = "https://files.pythonhosted.org/packages/0a/43/8e55ae7538ba5f28ccb3c845c6dd4549cf7016d5992e5326512519107cdd/yarl-1.24.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d46b86567dd4e248c6c159fcbcdcce01e0a5c8a7cd2334a0fff759d0fa075b16", size = 110574, upload-time = "2026-07-20T02:06:13.129Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ba/a889ec8765cedcf2ac44dcb02d6a21e4861399b243b263c5f2dde27ee740/yarl-1.24.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7f72c74aa99359e27a2ee8d6613fefa28b5f76a983c083074dfc2aaa4ab46213", size = 109914, upload-time = "2026-07-20T02:06:15.243Z" }, + { url = "https://files.pythonhosted.org/packages/9c/c3/e45f821af67b791c2dbbe4a9f4137a1d33f8d386654a05a0c3f47bdfa25d/yarl-1.24.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f45789ce415a7ec0820dc4f82925f9b5f7732070be1dec1f5f23ec381435a24", size = 107712, upload-time = "2026-07-20T02:06:17.443Z" }, + { url = "https://files.pythonhosted.org/packages/02/00/2ab0f42c9857fcb490bfaa6647b14540b53d241ab209f23220b958cc5832/yarl-1.24.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6e73e7fe93f17a7b191f52ec9da9dd8c06a8fe735a1ecbd13b97d1c723bff385", size = 104251, upload-time = "2026-07-20T02:06:19.259Z" }, + { url = "https://files.pythonhosted.org/packages/7a/70/709d9a286e98af2c7fd8e4e6cada658b5c0e30d87dd7e2a63c2fb5767217/yarl-1.24.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4a36f9becdd4c5c52a20c3e9484128b070b1dcfc8944c006f3a528295a359a9c", size = 115319, upload-time = "2026-07-20T02:06:21.207Z" }, + { url = "https://files.pythonhosted.org/packages/5c/6c/3eaa515142991fe84cfc483ff986492211f1978f90161ccefdbec919d09b/yarl-1.24.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:7bcbe0fcf850eae67b6b01749815a4f7161c560a844c769ad7b48fcd99f791c4", size = 109163, upload-time = "2026-07-20T02:06:23.006Z" }, + { url = "https://files.pythonhosted.org/packages/bb/64/711dafce66c323a3144d470547a71c5384c57623308ac8bb5e4b903ac148/yarl-1.24.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:24e861e9630e0daddcb9191fb187f60f034e17a4426f8101279f0c475cd74144", size = 115435, upload-time = "2026-07-20T02:06:24.923Z" }, + { url = "https://files.pythonhosted.org/packages/cf/f3/9b9d0e6d84bea851eb1ba99e4bdc755b86fd813e49ec86dfe42f26befdef/yarl-1.24.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9335a099ad87287c37fe5d1a982ff392fa5efe5d14b40a730b1ec1d6a41382b4", size = 110691, upload-time = "2026-07-20T02:06:26.973Z" }, + { url = "https://files.pythonhosted.org/packages/86/e4/62a06b7e87c4246ac76b7c2da136f972eb4a3a1fc94abb07e7022d6fdb0a/yarl-1.24.5-cp313-cp313-win_amd64.whl", hash = "sha256:2dbe06fc16bc91502bca713704022182e5729861ae00277c3a23354b40929740", size = 97454, upload-time = "2026-07-20T02:06:29.163Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c9/5fc8025b318ab10db413b61056bd0d95c557a70e8df4210c7511f866329c/yarl-1.24.5-cp313-cp313-win_arm64.whl", hash = "sha256:6b8536851f9f65e7f00c7a1d49ba7f2be0ffe2c11555367fc9f50d9f842410a1", size = 92813, upload-time = "2026-07-20T02:06:31.113Z" }, + { url = "https://files.pythonhosted.org/packages/a9/08/5f3085fef9564217074db9dd8573de1795bc82cde61a7ad10b6a7234a569/yarl-1.24.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:2729fcfc4f6a596fb0c50f32090400aa9367774ac296a00387e65098c0befa76", size = 135680, upload-time = "2026-07-20T02:06:33.273Z" }, + { url = "https://files.pythonhosted.org/packages/98/35/ba9436e579bd48a8801f2021d842d9ab4994c26e4c7dd3a4c1f1bcb57a9e/yarl-1.24.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ff330d3c30db4eb6b01d79e29d2d0b407a7ecad39cfd9ec993ece57396a2ec0d", size = 97395, upload-time = "2026-07-20T02:06:35.259Z" }, + { url = "https://files.pythonhosted.org/packages/18/a9/a07f76f3c44e02b25cc743af5ef93eef27f7013eadca770451b6a6ccb5db/yarl-1.24.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e42d75862735da90e7fc5a7b23db0c976f737113a54b3c9777a9b665e9cbff75", size = 97223, upload-time = "2026-07-20T02:06:37.216Z" }, + { url = "https://files.pythonhosted.org/packages/77/f7/a9a1d6fa7dd9e388f95b30f6ad3ec4e285f6c8f61f44ce16070c3fcfe414/yarl-1.24.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3732e66413163e72508da9eff9ce9d2846fde51fae45d3605393d3e6cd303e9", size = 108777, upload-time = "2026-07-20T02:06:39.292Z" }, + { url = "https://files.pythonhosted.org/packages/2f/44/e0b86c302471fabd6f02808ecf2ac52b8412b624787849d4bf2cdb466f6f/yarl-1.24.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5b8ee53be440a0cffc991a27be3057e0530122548dbe7c0892df08822fce5ede", size = 103119, upload-time = "2026-07-20T02:06:41.456Z" }, + { url = "https://files.pythonhosted.org/packages/d1/16/9c16d180bf8faaf223225eb50e1245870ff1ae0e302a27153988e65c51fd/yarl-1.24.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:af3aefa655adb5869491fa907e652290386800ae99cc50095cba71e2c6aefdca", size = 116471, upload-time = "2026-07-20T02:06:43.696Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8d/b219b9df28a02ce95cfbdd41d2f7caa5669d0ff979c1c9975697145e33c5/yarl-1.24.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2120b96872df4a117cde97d270bac96aea7cc52205d305cf4611df694a487027", size = 115974, upload-time = "2026-07-20T02:06:45.874Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e8/f20557aca240d88e69850ad1ee91756821d094bb1310565c04d25c6682a2/yarl-1.24.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:66410eb6345d467151934b49bfa70fb32f5b35a6140baa40ad97d6436abea2e9", size = 110830, upload-time = "2026-07-20T02:06:47.852Z" }, + { url = "https://files.pythonhosted.org/packages/db/18/199b85109a53eeca64ee19c9cca228287e8e4ab0cc1a09b28f530e65cce0/yarl-1.24.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4af7b7e1be0a69bee8210735fe6dcfc38879adfac6d62e789d53ba432d1ffa41", size = 110054, upload-time = "2026-07-20T02:06:49.84Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2f/ed28147f8cd7f48c49367c90713b30a555284b6105a6a56f3a05568da795/yarl-1.24.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa139875ff98ab97da323cfadfaff08900d1ad42f1b5087b0b812a55c5a06373", size = 108312, upload-time = "2026-07-20T02:06:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c5/55e16ae0a5c227cea8df1c6871ba57d614a34243146c05729caf2a1bd9c5/yarl-1.24.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:0055afc45e864b92729ac7600e2d102c17bef060647e74bca75fa84d66b9ff36", size = 103662, upload-time = "2026-07-20T02:06:54.061Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ea/dbd7c2caec459c9a426f18b02688ecbfb58620d0f6a3422d24769fbaf8ab/yarl-1.24.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f0e466ed7511fe9d459a819edbc6c2585c0b6eabde9fa8a8947552468a7a6ef0", size = 116090, upload-time = "2026-07-20T02:06:56.015Z" }, + { url = "https://files.pythonhosted.org/packages/06/84/39ce4ce3059e07fece5fbdbee8c4053406af9aca911ce9fa5f8548aab6af/yarl-1.24.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f141474e85b7e54998ec5180530a7cda99ab29e282fa50e0756d89981a9b43c5", size = 109523, upload-time = "2026-07-20T02:06:57.926Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8b/71ff44137b405c64a7788075669c24010019f57a7464b78c3a6cbee539d9/yarl-1.24.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:e2935f8c39e3b03e83519292d78f075189978f3f4adc15a78144c7c8e2a1cba5", size = 116084, upload-time = "2026-07-20T02:06:59.868Z" }, + { url = "https://files.pythonhosted.org/packages/62/c0/423078fdd4042e1862c11f0ffd977a0ffa393783c12bee94685923bc189e/yarl-1.24.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9d1216a7f6f77836617dba35687c5b78a4170afc3c3f18fc788f785ba26565c4", size = 111006, upload-time = "2026-07-20T02:07:01.907Z" }, + { url = "https://files.pythonhosted.org/packages/cf/52/6daa2ee9d95e5c98b8128f8df91eb692eb423ab274b8cf08db52152fad26/yarl-1.24.5-cp314-cp314-win_amd64.whl", hash = "sha256:5ba4f78df2bcc19f764a4b26a8a4f5049c110090ad5825993aacb052bf8003ad", size = 99215, upload-time = "2026-07-20T02:07:03.852Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0e/464a847d7359e0da75dd9fc5c1d1aa35d0159ea31e5f8e66a3c1c29ff3d0/yarl-1.24.5-cp314-cp314-win_arm64.whl", hash = "sha256:9e4e16c73d717c5cf27626c524d0a2e261ad20e46932b2670f64ad5dde23e26f", size = 94566, upload-time = "2026-07-20T02:07:06.074Z" }, + { url = "https://files.pythonhosted.org/packages/e2/55/e03acc4446772660bc335e86e41ef31e4d0d838fd641531a11a5ee33b493/yarl-1.24.5-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e1ae548a9d901adca07899a4147a7c826bbcc06239d3ce9a59f57886a28a4c88", size = 142533, upload-time = "2026-07-20T02:07:08.284Z" }, + { url = "https://files.pythonhosted.org/packages/ae/71/4acd3a1fc7cf14345cdb302665ecd2097f62c365b4f14ca17d4f37775cf9/yarl-1.24.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ff405d91509d88e8d44129cd87b18d70acd1f0c1aeabd7bc3c46792b1fe2acba", size = 100776, upload-time = "2026-07-20T02:07:10.197Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/cfb76b7fe99686db264bff829779a539d923e7564ffd7ef18da6c54c3774/yarl-1.24.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:47e98aab9d8d82ff682e7b0b5dded33bf138a32b817fcf7fa3b27b2d7c412928", size = 100913, upload-time = "2026-07-20T02:07:12.357Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3f/7116e782992abbd4fb6948488aec72078895e929a23078290739e8396fce/yarl-1.24.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f0a658a6d3fafee5c6f63c58f3e785c8c43c93fbc02bf9f2b6663f8185e0971f", size = 106507, upload-time = "2026-07-20T02:07:14.173Z" }, + { url = "https://files.pythonhosted.org/packages/33/90/d4d2d73ee78229cc889872eb8e085d8f5c6f51abdb178409fd9b23cf74fd/yarl-1.24.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4377407001ca3c057773f44d8ddd6358fa5f691407c1ba92210bd3cf8d9e4c95", size = 99219, upload-time = "2026-07-20T02:07:16.019Z" }, + { url = "https://files.pythonhosted.org/packages/3e/fa/a6df1a9bccd644eec00abee0dff4277416222cec435330fd1f2858523ec1/yarl-1.24.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7c0494a31a1ac5461a226e7947a9c9b78c44e1dc7185164fa7e9651557a5d9bc", size = 111804, upload-time = "2026-07-20T02:07:18.141Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/7b2a1f4bcc20e9447156dd2b1c4d01f70d9df0759025ee7d09a84ffae134/yarl-1.24.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a7cff474ab7cd149765bb784cf6d78b32e18e20473fb7bda860bce98ab58e9da", size = 110943, upload-time = "2026-07-20T02:07:20.06Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/22c92affb0f9b623ca753d27d968b5625b868f12c6378d049d55ae247643/yarl-1.24.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cbb833ccacdb5519eff9b8b71ee618cc2801c878e77e288775d77c3a2ced858a", size = 108251, upload-time = "2026-07-20T02:07:22.217Z" }, + { url = "https://files.pythonhosted.org/packages/45/44/5769b96298c1e195fb412997b6090af2a84105cf59c17613558a2d011d1f/yarl-1.24.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:82f75e05912e84b7a0fe57075d9c59de3cb352b928330f2eb69b2e1f54c3e1f0", size = 106025, upload-time = "2026-07-20T02:07:24.083Z" }, + { url = "https://files.pythonhosted.org/packages/4c/40/009e8e791fd9762c0e1567e69248acb4f49064597e1680874c16dd8bb798/yarl-1.24.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:16a2f5010280020e90f5330257e6944bc33e73593b136cc5a241e6c1dc292498", size = 106573, upload-time = "2026-07-20T02:07:26.248Z" }, + { url = "https://files.pythonhosted.org/packages/20/c6/b7480578f8a0a80946f36ad6df547ecec704f9ba69d2de60f8aa6f1c1cbf/yarl-1.24.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ffcd54362564dc1a30fb74d8b8a6e5a6b11ebd5e27266adc3b7427a21a6c9104", size = 100751, upload-time = "2026-07-20T02:07:28.098Z" }, + { url = "https://files.pythonhosted.org/packages/d4/27/4476f3360b91a48c5cf125e91f59a3bd35299d84a431a258d57f5977bb11/yarl-1.24.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0465ec8cedc2349b97a6b595ace64084a50c6e839eca40aa0626f38b8350e331", size = 111643, upload-time = "2026-07-20T02:07:30.88Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/5cdd3e5ee944e8af31e52f6cd3d3af5fd7b937e036ccbbba2c9ffebede95/yarl-1.24.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4db9aecb141cb7a5447171b57aa1ed3a8fee06af40b992ffc31206c0b0121550", size = 106312, upload-time = "2026-07-20T02:07:33.06Z" }, + { url = "https://files.pythonhosted.org/packages/18/86/f406b0c2a6f99575de2da671ef47aa06f89a5be83a27a46971c3b86cecdb/yarl-1.24.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:f540c013589084679a6c7fac07096b10159737918174f5dfc5e11bf5bca4dfe6", size = 110379, upload-time = "2026-07-20T02:07:35.155Z" }, + { url = "https://files.pythonhosted.org/packages/f0/6c/9f3adfbd3b30b4fa0f7ccb3a83eba2c1152d3fff554d535e640ba0f7ba2b/yarl-1.24.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a61834fb15d81322d872eaafd333838ae7c9cea84067f232656f75965933d047", size = 108497, upload-time = "2026-07-20T02:07:37.35Z" }, + { url = "https://files.pythonhosted.org/packages/dd/37/91eb2e5ca883a529c1b390348a74cd9fc0512171727f547ce70bfe02be5c/yarl-1.24.5-cp314-cp314t-win_amd64.whl", hash = "sha256:5c88e5815a49d289e599f3513aa7fde0bc2092ff188f99c940f007f90f53d104", size = 102450, upload-time = "2026-07-20T02:07:39.578Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f4/ed5c402ac8fde4403ed3366c2716bfddc8a6677ebd59f3d62772cc7fe468/yarl-1.24.5-cp314-cp314t-win_arm64.whl", hash = "sha256:cf139c02f5f23ef6532040a30ff662c00a318c952334f211046b8e60b7f17688", size = 97222, upload-time = "2026-07-20T02:07:41.55Z" }, + { url = "https://files.pythonhosted.org/packages/61/02/962c1cbfc401a30c1d034dc67ff395f64b52302c6d62de556c1fca99acc0/yarl-1.24.5-py3-none-any.whl", hash = "sha256:a33700d13d9b7d84fd10947b09ff69fb9a792e519c8cb9764a3ca70baa6c23a7", size = 58612, upload-time = "2026-07-20T02:07:43.461Z" }, ] [[package]] @@ -6169,50 +5864,50 @@ wheels = [ [[package]] name = "zope-interface" -version = "8.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/39/a8481b926e42c44a6fcc670904f8251469ec42edbff1ba066719ca1e7fb4/zope_interface-8.6.tar.gz", hash = "sha256:b40ef9b4873afb5d0dec02b8d2dfde1cf18c72337b60c99cb735961e0bac05c0", size = 257973, upload-time = "2026-08-20T11:18:08.717Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/56/4cf64b40123af62ed9dad3d689df853d9ff8f431ae06408e087061a9b87a/zope_interface-8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42fb95008784a3b50c4b79e4488845d1950c57eef17ebc9c53a680084fb93da2", size = 210947, upload-time = "2026-08-20T11:16:52.142Z" }, - { url = "https://files.pythonhosted.org/packages/90/b8/59d9a455a73cae715eacca70003d943e8a8413b196454bb49530c16769bd/zope_interface-8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c5963a26e1fe47bdb3494ba2aa91904c7898873af400dc3bdcaa808a57783a", size = 211307, upload-time = "2026-08-20T11:16:54.352Z" }, - { url = "https://files.pythonhosted.org/packages/65/7a/80fa8eb011bf78b72438a0ea0f672efe97ac5c9e9ff07d3304143ef5d611/zope_interface-8.6-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:3e0383361da2793ea332e2d12b753a32ac57b3b89c8c3a9c6dd04374ae142c0f", size = 254894, upload-time = "2026-08-20T11:16:56.063Z" }, - { url = "https://files.pythonhosted.org/packages/2e/02/c82afe287924ddcbc78fd2f4646f16e3ba9d03bf3f5e1ea4bedce711de3c/zope_interface-8.6-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6df4bd16923d247c34e12dc394dab20d99d96aa2e15a6b163c2dda1dd582fff6", size = 259828, upload-time = "2026-08-20T11:16:57.979Z" }, - { url = "https://files.pythonhosted.org/packages/00/9c/53361a3cbf7ae2529d69a252547b129afa44f75d7019a76b15cecad44c91/zope_interface-8.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6246f7a4b196bd054469f4fd4ffdac307974061f0d2b1ef4da87ddff13a7f885", size = 260368, upload-time = "2026-08-20T11:16:59.727Z" }, - { url = "https://files.pythonhosted.org/packages/7c/82/5c6846d58d41fe09b8da3b4f9b03fa28ccd6f3764588c5ea339063566caa/zope_interface-8.6-cp310-cp310-win_amd64.whl", hash = "sha256:5fbd9deb0477aea769b7d83a4d953d77ef38972d5eddd5b922b614ee708b2104", size = 214231, upload-time = "2026-08-20T11:17:01.582Z" }, - { url = "https://files.pythonhosted.org/packages/df/b0/5715b7635e5e25dd26ae32453e784cab59401078aeb3e401027675068583/zope_interface-8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd25d6da3b3c8216080a0eefb3c01719913782690427fb9ba2ddad98ed8970f4", size = 211445, upload-time = "2026-08-20T11:17:03.377Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9b/60a71a998fd819a7b9ed24c3544f862280f222828f421561e28885dcecc5/zope_interface-8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ebb513c9e47702525897148e38271f7b6bf12c61bd084cdddfd0e03b542f8100", size = 211839, upload-time = "2026-08-20T11:17:05.05Z" }, - { url = "https://files.pythonhosted.org/packages/85/55/3092a23c3bdbcc9402ad74e69dae3fa49cc9f12bceef35079c98449bc60e/zope_interface-8.6-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:919510e0d470c189cb84164b953f81e8a513aa2593fdc9e4982340838cd1099b", size = 260720, upload-time = "2026-08-20T11:17:06.755Z" }, - { url = "https://files.pythonhosted.org/packages/41/7d/d3abda21695ee441f2278f226b4b22ecb604cf0d96efb3d39507415abdcb/zope_interface-8.6-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a43e669d68fd8c10fe315812f7e1d262c6c00e9667f29f799a3771f9a3b5b41d", size = 265288, upload-time = "2026-08-20T11:17:08.858Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/27467685e40d5ee01f542c8b0b33682b07af363419f4c64cbb61b8bf48d5/zope_interface-8.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:826f99c38f4bfcf7165885a0c59f03c6c25e0df8cdb0544f882cda61616fe845", size = 266373, upload-time = "2026-08-20T11:17:10.786Z" }, - { url = "https://files.pythonhosted.org/packages/bd/7b/ee35b4a5ee56ff609868291404b3ac30814417912fd8cbf4bbdcf1da8280/zope_interface-8.6-cp311-cp311-win_amd64.whl", hash = "sha256:d97c96c79c389d1031c86f8e797b94db4fe647dfbfebdbe48247c1899dc930bb", size = 214544, upload-time = "2026-08-20T11:17:12.793Z" }, - { url = "https://files.pythonhosted.org/packages/6c/ea/f63bedc8f3331fbd8d74971201bdb0be41ebbeda800aee08e9afcf41f46b/zope_interface-8.6-cp311-cp311-win_arm64.whl", hash = "sha256:ec5a5c01a54fc06b69da71164c9bba8cc71fde79bdd1b835bb734f96bca693f2", size = 213497, upload-time = "2026-08-20T11:17:14.541Z" }, - { url = "https://files.pythonhosted.org/packages/be/0a/33bcf5c825c749205c832e82d14224ff38011d20dd9dbf7a0ffe51a589ae/zope_interface-8.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:192bb756a8f62395b4fe47cbb853c171f20389d5226fbfa97128bb2f76abad8d", size = 212192, upload-time = "2026-08-20T11:17:16.522Z" }, - { url = "https://files.pythonhosted.org/packages/17/4f/41bde1796fa8cbb32f50facd261dd4124daa850c29666270e85e2bb8e91a/zope_interface-8.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a38b221cc649a2daacaff9d629a2ba9c4a8967669d253f9a6a597f46d46732f0", size = 212337, upload-time = "2026-08-20T11:17:18.305Z" }, - { url = "https://files.pythonhosted.org/packages/98/e1/b2d78ecb8aec59114111ed8c25894c0421afecc5e89b36fc356e2b07a607/zope_interface-8.6-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:780a66db884c0e2b0e6b34b4900f86916945a7c03d3be40ec845b051fcc052cd", size = 265308, upload-time = "2026-08-20T11:17:20.02Z" }, - { url = "https://files.pythonhosted.org/packages/dc/5a/126eeee4da016f5cca4db2297496069d5f1ba901fb53ebf104f9c087a113/zope_interface-8.6-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9217b1123f6aeec9ddf1789bffd83da3123546d551c164a99f862a5d1f5ac0f8", size = 270703, upload-time = "2026-08-20T11:17:22.016Z" }, - { url = "https://files.pythonhosted.org/packages/05/89/7767a6f9b0bb41a4d3777e8f93bfeb1b9a23ea643f83ce96163d9d672c8b/zope_interface-8.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:28b68c24131545c1d13fd2178bbd065e67f09db885d8426adf1fbdf2b6b66372", size = 270292, upload-time = "2026-08-20T11:17:23.905Z" }, - { url = "https://files.pythonhosted.org/packages/1e/66/bd63f493284f492003ebc494e9706abe389fdab45d6d6dd09a21012a7077/zope_interface-8.6-cp312-cp312-win_amd64.whl", hash = "sha256:64ed939d725876071823505b1c90074a86847a6e9be8617cec7ba759e0b86a7e", size = 214371, upload-time = "2026-08-20T11:17:25.606Z" }, - { url = "https://files.pythonhosted.org/packages/1c/03/64069137ef7da70ec796ad9a90ba23796fded06c4e7d06ae600a3141f3cc/zope_interface-8.6-cp312-cp312-win_arm64.whl", hash = "sha256:b08808d1196810f76928ad13d37dae18d92b1c9485c113628f41dbd6351413de", size = 213578, upload-time = "2026-08-20T11:17:27.396Z" }, - { url = "https://files.pythonhosted.org/packages/30/01/860c4879f072968375ec82fabaa5d83256e6ad8d3dce9527b00931e54b10/zope_interface-8.6-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:add6e226c6568de6d0ea9f6abe6353072387afcf5f817610ea266495d0c1ee72", size = 212548, upload-time = "2026-08-20T11:17:29.161Z" }, - { url = "https://files.pythonhosted.org/packages/38/09/d4b7c46c020394c830e749c6c4ca6a2ca0b6defed6f4c2eeeb97116c7343/zope_interface-8.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47030c08e39d690299e02973ac845d0f534121b3618efa9ce9599a512a1c97fa", size = 212536, upload-time = "2026-08-20T11:17:30.922Z" }, - { url = "https://files.pythonhosted.org/packages/4c/2d/5b4dbbe618b816f626f2a640fcd9911a461e3733a608c4043a8cc79c12b3/zope_interface-8.6-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:c2bf932006229788d6bb41963dfc0345cba6ee24141a39316bd52a283a7d115f", size = 265203, upload-time = "2026-08-20T11:17:33.059Z" }, - { url = "https://files.pythonhosted.org/packages/79/96/c02befafb8e5d3c92898aa02fffca94d164830013fd0a50c4a652a728712/zope_interface-8.6-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:09522cdc6a77376bc36988b531db3b568c8cb0b6ca7286d8316aab283888770f", size = 270637, upload-time = "2026-08-20T11:17:35.167Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c4/d61b18724597ca62c1a3a753370fff7b76f43c01b44e9a13c18e2300eaf0/zope_interface-8.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:edf1bd7ed576319241b2b314eaa549cee3e3e0f81f46911086b387d03a303ad3", size = 270456, upload-time = "2026-08-20T11:17:37.146Z" }, - { url = "https://files.pythonhosted.org/packages/0c/7a/96f177daba3f9d9d69d42659ae6c602c76b1d725e7dddff08ed49d9d02af/zope_interface-8.6-cp313-cp313-win_amd64.whl", hash = "sha256:00fd6a6da085beb90cdcdce6ed6e6973edf338d1ea63a807e213b1eb7013833d", size = 214763, upload-time = "2026-08-20T11:17:39.064Z" }, - { url = "https://files.pythonhosted.org/packages/d0/34/ce4a0ff71a1a93bd403c511307d70d32ae876e657d96063985f6672c92ec/zope_interface-8.6-cp313-cp313-win_arm64.whl", hash = "sha256:105da41198a1990b18d566bd30656a19064d4c313e4c0dd8f0dd9714026e47f1", size = 213621, upload-time = "2026-08-20T11:17:40.805Z" }, - { url = "https://files.pythonhosted.org/packages/3d/28/8ec94b15ebde2da2ebe643aac3c4238a55c2e95b746049721b50908ecafe/zope_interface-8.6-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:449727fc79f0b1317ec190632e13699b732d3f4704ea90c8e1339bb78e451bee", size = 212628, upload-time = "2026-08-20T11:17:42.566Z" }, - { url = "https://files.pythonhosted.org/packages/85/47/f06d4dbbc1464d9d4520b9c047d4a0f0062264eeb2c0b7fd1bec79a9327d/zope_interface-8.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:81793c9b12816ac7f8b71b366be36b7025fcf7205ec4a236642b15a82cb027ef", size = 212627, upload-time = "2026-08-20T11:17:44.571Z" }, - { url = "https://files.pythonhosted.org/packages/1c/56/01f84b4e966a32088e9076b1e7b2afa310f52bf9b9a077d2958cf66e81aa/zope_interface-8.6-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:a91eb220d9ae6aa6d746d6dac5b4db35b1417903301b3315ba3275b19570be0b", size = 266840, upload-time = "2026-08-20T11:17:46.366Z" }, - { url = "https://files.pythonhosted.org/packages/c6/40/2a644e32cd6f0516e7df1fc0c58e544a8cc11ba06b0d55d308519b02459d/zope_interface-8.6-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3f7f6da49911ffe75ae3f7a9a45619f205420cc6578aff02f8ca29ed1de10f14", size = 270145, upload-time = "2026-08-20T11:17:48.195Z" }, - { url = "https://files.pythonhosted.org/packages/1e/18/02ebd81feff11a2766159fcb49c5b773fef5ae4414c38fb19114aad9e961/zope_interface-8.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef15a2f6258f809334a19c1fcce64648813066ceebe3f3f6077871483fd0f50d", size = 270351, upload-time = "2026-08-20T11:17:50.07Z" }, - { url = "https://files.pythonhosted.org/packages/26/56/0725e960cf581399b7f4136d5951f7d87bc659492e49db1794334f6c5153/zope_interface-8.6-cp314-cp314-win_amd64.whl", hash = "sha256:5ef166337880b0e78138bbd32fcbc5ab1da3337febe8d2a247f3690bcae3ede5", size = 215098, upload-time = "2026-08-20T11:17:52.062Z" }, - { url = "https://files.pythonhosted.org/packages/f1/b3/7f864a6f9d9aebddceaac0a8c5cab0b450090f42fe316e48e6dd0c684478/zope_interface-8.6-cp314-cp314-win_arm64.whl", hash = "sha256:23ae710094fdcfcf715dae7054cd5abfefa4a527c5853d7b76ebb2541499c41a", size = 213759, upload-time = "2026-08-20T11:17:54.157Z" }, - { url = "https://files.pythonhosted.org/packages/19/b8/2f7a65ac046d3bb54e4a0664acfa152021804aa4101cbbec11526740c8af/zope_interface-8.6-cp314-cp314t-macosx_10_9_x86_64.whl", hash = "sha256:a84ac0010f054f3516710804a0c22026b4b0d30085d7666cfc2f30545775bf99", size = 213631, upload-time = "2026-08-20T11:17:56.063Z" }, - { url = "https://files.pythonhosted.org/packages/12/c1/889dc114e9a9e8d59fec53facb71dd26345f60c504ad20fd17121af0449c/zope_interface-8.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e36adea8ab93eb4d2076a47d5f4c7d7e1267eb9a4e33202da7ea71439a3bcaef", size = 213713, upload-time = "2026-08-20T11:17:57.998Z" }, - { url = "https://files.pythonhosted.org/packages/a9/96/ac48a6b7cfe972e4a9b0d7ec8b9f36a7956cc95d72029f0013ff096c55af/zope_interface-8.6-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5dbe120cfcfc8e6aed418f340c3d1ad4072253e17176503e363ddac27fcb2ac6", size = 294916, upload-time = "2026-08-20T11:17:59.952Z" }, - { url = "https://files.pythonhosted.org/packages/a2/54/4df4bb0b1aace2298386375ab2fb752378683b558d2db713e25c40a3e96a/zope_interface-8.6-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27e6de8e593736210d2a9f1bbf766a5653aa4819c184f864ab9d1f8bd3590a60", size = 300898, upload-time = "2026-08-20T11:18:02.224Z" }, - { url = "https://files.pythonhosted.org/packages/08/9c/0c8c80c1eeb62ac0c3ed1f51ad8cdd6da9373c53247c659c49f0ea29f742/zope_interface-8.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:66ab8c5d8820aa378968c16b7a3cb051aca342eafa649c9a363182f572d75ccb", size = 304684, upload-time = "2026-08-20T11:18:04.105Z" }, - { url = "https://files.pythonhosted.org/packages/54/69/3afc11a58b9ea814fdfb9297a8c36d10871c1f0cc06d42c106282109b952/zope_interface-8.6-cp314-cp314t-win_amd64.whl", hash = "sha256:fcc86414ee0e6b77416de81b8dead5900719b3f71b7875d8d1f87ae4e166a11f", size = 215500, upload-time = "2026-08-20T11:18:06.259Z" }, +version = "8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/dc/50550cfcbb2ea3cbca5f1d7ed05c8aa840f831a0f2d63aec0a953f7c590e/zope_interface-8.5.tar.gz", hash = "sha256:7a3ba1c5877f0f3e3906b02ddf793abed2becc2948116414ce0e1dd820b68d6d", size = 257957, upload-time = "2026-05-26T06:50:14.574Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/43/9cd98bee951d23848de690ba2809f87e3b22c67c370987acc960da15ad37/zope_interface-8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0c8aa2bf8f3911ef37b87deb1bbe225a310e6eb6522a16d77f5d8330c4f6fbe", size = 210951, upload-time = "2026-05-26T06:49:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/17/0f/8f1a29966bcf863e3a2121edcafb81c55715de7886bcc9544749cc79e7da/zope_interface-8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:efe234a0fafb4b6b1602e9be9245b97c2bf06d67c07af5a4bc3c0438978b555c", size = 211309, upload-time = "2026-05-26T06:49:02.732Z" }, + { url = "https://files.pythonhosted.org/packages/9f/9f/37e564eaaf85e3abc1ada40a79fa43f2ab45bdb67431b0ec0fe29e4763e2/zope_interface-8.5-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:dabeb6fe1228d411994f300811edc6866fff0cdcbc9cef98a78f05ea0da42e37", size = 254881, upload-time = "2026-05-26T06:49:04.303Z" }, + { url = "https://files.pythonhosted.org/packages/06/61/e6501d8ea7a2cac3217e03f404e1f98c1df7191d83cfe86b1895fbba5dac/zope_interface-8.5-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:147a9442dcc2b7339ecdb1be2b3cdb098e90462e39425054053ebfb50d99125a", size = 259811, upload-time = "2026-05-26T06:49:06.373Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/bfa25ef480b02af6e9452c478483fec75e87c9e2b60c407fd0b1f6054b9c/zope_interface-8.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a17e681224267880707c9ec9e730ad9a1ad2d65c371256843efba6cf48711b58", size = 260358, upload-time = "2026-05-26T06:49:08.317Z" }, + { url = "https://files.pythonhosted.org/packages/64/51/2b518072fea76242da64451d501c69b7b5ccdef9b57fead584ccf1c180d5/zope_interface-8.5-cp310-cp310-win_amd64.whl", hash = "sha256:d178968a1a611df30549a717d1624cb38ca810347339e3e37b7baa6f6781a170", size = 214822, upload-time = "2026-05-26T06:49:10.441Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f1/83ad110fb847413affe71609bb50e59e1aa082e1236030122227c7c283d3/zope_interface-8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:afc66ccaef2a3c0bef6ca02aad40d29a39276389dad16a8eac36f9f385e4d057", size = 211426, upload-time = "2026-05-26T06:49:12.595Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a7/6b6e0c31ac240cb9fc015ae9ed45ca54be886c18fcf7bfa2377a4d7a8785/zope_interface-8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c28044972187245d7a309e4699319bfdbd2ffcbf7176d1d4ddf5adffb2dea80f", size = 211850, upload-time = "2026-05-26T06:49:14.474Z" }, + { url = "https://files.pythonhosted.org/packages/37/36/7599ecabcf80ce4fef2e1ef3c5ac0d4696b61f03f724cc44022f4d226af9/zope_interface-8.5-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:03bbecc7982af713d7499d4084bc03916413d17ffd45f89009348cc0c1d9e376", size = 260711, upload-time = "2026-05-26T06:49:16.568Z" }, + { url = "https://files.pythonhosted.org/packages/03/3e/1774b0ee46ccbb5498ee3c33ece40315b6ef58bc71957be94bd345340bc1/zope_interface-8.5-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bf917009a4a7457c7290225a019f4a0aa706d96accd2cfdba2418d3bc1fcde2f", size = 265277, upload-time = "2026-05-26T06:49:18.656Z" }, + { url = "https://files.pythonhosted.org/packages/b6/09/e533b2ffabaae4e5d5730d6768a591cf335defe8e37bec2ad905d09be656/zope_interface-8.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:31cff25b2aaedb5267e6e77b1e9be6b0ec4f622032de8a069202b8ffacda7dc2", size = 266369, upload-time = "2026-05-26T06:49:20.174Z" }, + { url = "https://files.pythonhosted.org/packages/49/4a/3ebe6a4c122b2d5340db45cbe7e490663d3228b172710ec71060cd5d541e/zope_interface-8.5-cp311-cp311-win_amd64.whl", hash = "sha256:17a3114bbdddb5e75e5784cdf318944636190cbbc72d357ef9fb1a8b0351f955", size = 215161, upload-time = "2026-05-26T06:49:21.799Z" }, + { url = "https://files.pythonhosted.org/packages/d2/59/056ad97af5b16db1975ee98ec7ab03d2ce3f3355efad904ced1dbce0e39f/zope_interface-8.5-cp311-cp311-win_arm64.whl", hash = "sha256:aab6bb5bee10f38ea688b95ba054396b67f613552d2c8378be7fcb2d2fba7646", size = 213481, upload-time = "2026-05-26T06:49:25.085Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/b84123a948f3162a34623e188922827cd845244fdd043ed20f8d02228caa/zope_interface-8.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8e6ee90c2e6de7c37058d5fa41f123c8b13a312db8d1e0fb5840d7f4bcdff9c9", size = 212165, upload-time = "2026-05-26T06:49:26.566Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/cbceec44f1b27208a76c1a688c131302685852406a23df5aab68324109cc/zope_interface-8.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c1adc90d3576b3b4c4de4953e6002c37bef28b78d7fa54c1bbfd0c50f022fe7c", size = 212341, upload-time = "2026-05-26T06:49:28.182Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c3/005032195ff3b210c139b7c560ed5c534e844b0907d8e44d2b3d8919305e/zope_interface-8.5-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:e6347b8d8d12c5eca6502450a92be30079b7acfade2c4f693efa0deb8871b06e", size = 265296, upload-time = "2026-05-26T06:49:29.741Z" }, + { url = "https://files.pythonhosted.org/packages/c5/66/1036543d6a66bc04c19df3cf650f3ad938a002ab0a443c24e23e8de5e8b9/zope_interface-8.5-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5e970dabea777a24b0b0bbf9dae3ab75ce8b2d8e948edf4875627034b21f3560", size = 270689, upload-time = "2026-05-26T06:49:31.767Z" }, + { url = "https://files.pythonhosted.org/packages/30/4c/8b56259558cace4414e753ca6740396a1f59d4a95ddb55b4658600408670/zope_interface-8.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0b48ccadaa9839e09ff81e969703cecb3f402c813bfe8b958652e699bea69f5", size = 270280, upload-time = "2026-05-26T06:49:33.489Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ea/649908c83aa8fdb7faf2ddca4d3cf6fb8f2157121267dc56e8f72681e26c/zope_interface-8.5-cp312-cp312-win_amd64.whl", hash = "sha256:e0e311f1277468c08fd59a2b41f71b43d25dff639789d364747acd1705c0df6e", size = 215019, upload-time = "2026-05-26T06:49:35.607Z" }, + { url = "https://files.pythonhosted.org/packages/9f/97/da13037b4c563e4df32eedbc819f8c00b754af494f68211e3dffd48d52da/zope_interface-8.5-cp312-cp312-win_arm64.whl", hash = "sha256:652b73107a04159ec6c020db6c1543d4f1e8f4d069bd2aac88a947820923517b", size = 213569, upload-time = "2026-05-26T06:49:37.317Z" }, + { url = "https://files.pythonhosted.org/packages/f4/8c/4c15755d701f2ec0e80d64a18e1ebaf5be2c584c0ec153fd516f5d13eada/zope_interface-8.5-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:28e80457c134d1fa57a7d758004dece348654e1b1467ac22dcdc20fc1d127c52", size = 212512, upload-time = "2026-05-26T06:49:38.996Z" }, + { url = "https://files.pythonhosted.org/packages/9a/2e/4360c54c465db042cc8fbeeec92abac28b4cedbf6ba63c1f092fd08a190f/zope_interface-8.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:09495ce9d559c06b70f2d4855b3e4f48a822a9ddc8be1d30c5b4e5be14ae1ace", size = 212541, upload-time = "2026-05-26T06:49:41.186Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a5/692a2b8d70f78e848793231d5fae5fecbf8d0cccd73430fdc34802a6d3c1/zope_interface-8.5-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:7849ad8fa90763cc1087f4dda78ca3a233e950b3e08fac7079297c9cafbbd7bb", size = 265191, upload-time = "2026-05-26T06:49:43.449Z" }, + { url = "https://files.pythonhosted.org/packages/70/8d/454a9cfc7a050c394ab4f11b3371f7897828b7415e096afff724637e65e0/zope_interface-8.5-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5578c9421ca409a1f39f153d6f7803e4cde01da592ec75a9ac5e1b777d18d33b", size = 270626, upload-time = "2026-05-26T06:49:45.425Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/db8409cfa3575b8e9b4800babd7d49f8228433cd1f0c56814bd0ada49c33/zope_interface-8.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e1bd7d96b4ca5fa311f54c9eac16dce4886b428c1531dbe06067763ccdf123b4", size = 270444, upload-time = "2026-05-26T06:49:47.025Z" }, + { url = "https://files.pythonhosted.org/packages/4a/df/a386940e41469ef615e100a216d8b386521e9e598817147f87932ca203c4/zope_interface-8.5-cp313-cp313-win_amd64.whl", hash = "sha256:0c8123d2a4dfde2a613c7cb772605477724782c20bc2e0ad1d9435376a6a44a3", size = 215021, upload-time = "2026-05-26T06:49:48.478Z" }, + { url = "https://files.pythonhosted.org/packages/89/75/477eb5669b6b2a7a843decd1a075e9b1971a8720017654143a7183abd3d9/zope_interface-8.5-cp313-cp313-win_arm64.whl", hash = "sha256:6d02be14f3173c6c7288bc2fdf530090c01c3cf8764ad46c68024686f364278e", size = 213610, upload-time = "2026-05-26T06:49:50.01Z" }, + { url = "https://files.pythonhosted.org/packages/d4/19/5032e954827fdf02db2d2f49737ac4378bb9cfc2cd95a8f2e2a5ae2ec01a/zope_interface-8.5-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:ffaecf013251a89d0de6feb49a46eba48ad8cbbf8a40aeb6045e459e7bec6784", size = 212597, upload-time = "2026-05-26T06:49:51.63Z" }, + { url = "https://files.pythonhosted.org/packages/f1/53/3ef644012cf8a6a234a2d6134aab5a5c65ac5467c86296865501d4fbc406/zope_interface-8.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:126fa9d1c52295ae076d4cf968634f0a1826afa408a20808b57ff72877b8f69f", size = 212626, upload-time = "2026-05-26T06:49:53.236Z" }, + { url = "https://files.pythonhosted.org/packages/32/67/bc8b4f465d388039255003e230c284a175cedf1203c692f23cb7bff64efe/zope_interface-8.5-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:3090e3a663d20194756a59a272e0c8508b889341e31d5894223331fe6b4f9b21", size = 266827, upload-time = "2026-05-26T06:49:54.873Z" }, + { url = "https://files.pythonhosted.org/packages/a7/eb/37d05b935ede53d79690fecc8d201440084418e590bcfc05f384451c7593/zope_interface-8.5-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9342fb74e2afefdb081bf1df727d209ea56995c6e13f5a0540e6d7aff4beafb8", size = 270139, upload-time = "2026-05-26T06:49:57.116Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/fd0c54579e2ce8dc6cf1a757903f3374bc6fbda929a46af9e0f53cb0e5f0/zope_interface-8.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c54725d818f1b57a7efb8b16528326e1f3c257b602b32393fd255c45af8799d", size = 270338, upload-time = "2026-05-26T06:49:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1d/c420dcd777bb761067ea92879ac766694a5ca78608185f1aecea64cbfc11/zope_interface-8.5-cp314-cp314-win_amd64.whl", hash = "sha256:29d74febbae1afeb6834c4ccbf42e242a673c860060f09e53142825270456140", size = 215789, upload-time = "2026-05-26T06:50:00.405Z" }, + { url = "https://files.pythonhosted.org/packages/62/94/50b5eb8f94e527edceac14f9955e58917424ea79bb572ddc18548561cbc2/zope_interface-8.5-cp314-cp314-win_arm64.whl", hash = "sha256:633c8c49396f38df030340797c533e9fe460d1b5d1e42d88e55e938e525f548c", size = 213757, upload-time = "2026-05-26T06:50:01.973Z" }, + { url = "https://files.pythonhosted.org/packages/17/6f/5d5f32c4dfcdb16ce2ec5363da686840f13c13e1a1214cb70b49e1cd6d9f/zope_interface-8.5-cp314-cp314t-macosx_10_9_x86_64.whl", hash = "sha256:133999820fdbae513c36c03d6f29ef87317aaa3edef39112222b155083664714", size = 213591, upload-time = "2026-05-26T06:50:03.529Z" }, + { url = "https://files.pythonhosted.org/packages/f3/55/de0c3459ff717fce3342f9a29464c281fdeb0d36c3171ee88d119d5f0650/zope_interface-8.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8bd75c96966e573232f0599deaff717564828031c7f05563ccc1ac35c5ee0304", size = 213733, upload-time = "2026-05-26T06:50:05.101Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/d97430abd5ae9677e8b9295b58720c0064a5b557dbb6b8bf5928484cf0d8/zope_interface-8.5-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:14b0e9799351d4c34fe99afd67f0cdd76e55ba15c66a98699d5fc22ea8241e08", size = 294905, upload-time = "2026-05-26T06:50:07.384Z" }, + { url = "https://files.pythonhosted.org/packages/41/ec/a0f8f3dad6e74992f4654bdd94802be0929eabca7b871cac3b6fbb5e961b/zope_interface-8.5-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0cd6a732ac84b94eb1ef9222a117347a27efd294ee16810ffdf7ecd307677ed5", size = 300885, upload-time = "2026-05-26T06:50:08.997Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/6881b48803a0ee8d23eb5efa30fce3ed218a2bd9de5758ce489d224fee81/zope_interface-8.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:798b7c87d0e59a7d5d086d642208d0d8700ff0d55c4029134b3c479c3bfb110f", size = 304672, upload-time = "2026-05-26T06:50:10.563Z" }, + { url = "https://files.pythonhosted.org/packages/2e/0e/b4c01320859ff1d585438bc231fd60bd258d096359bccf6654fecdf0cffb/zope_interface-8.5-cp314-cp314t-win_amd64.whl", hash = "sha256:0fc3a9d45f114d27eaa1e53beeb144533689edca8a9f66505b1e8e8b3f075e42", size = 217241, upload-time = "2026-05-26T06:50:12.171Z" }, ] [[package]] From 53d1e58f2f47d6a69e992c050e9412a43907c62a Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:07:49 -0700 Subject: [PATCH 073/831] Kept one copy of the provider lifecycle protocol. The same edit arrived from three branches and the merge stacked it. --- temporalio/streams/_provider.py | 45 --------------------------------- 1 file changed, 45 deletions(-) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index cb1e59fd4..18e2bb983 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -151,51 +151,6 @@ async def consumer( """Open a reader for what ``workflow_id`` publishes.""" ... - def prepare(self) -> None: - """Install whatever this provider needs before the workflow runs. - - Optional. A provider that serves outside readers through handlers on - the workflow itself has to register them before the first task - completes, or a reader that arrives early finds nothing to talk to. - """ - ... - - def drain(self) -> None: - """Release anything this provider parked on the workflow's behalf. - - Optional. A provider that parks an outside reader against the running - workflow, as the Workflow Streams transport does with its long-poll - update, has to let go before the workflow can return. - """ - ... - - -class StreamProviderLifecycle(Protocol): - """The hooks a provider adds when it needs the workflow's own lifetime. - - Separate from :class:`StreamProvider` because most transports need - neither, and a provider is not asked to carry a pair of empty methods to - say so. :func:`prepare` and :func:`drain` call whichever half is present. - """ - - def prepare(self) -> None: - """Install whatever this provider needs before the workflow runs. - - A provider that serves outside readers through handlers on the - workflow itself has to register them before the first task completes, - or a reader that arrives early finds nothing to talk to. - """ - ... - - def drain(self) -> None: - """Release anything this provider parked on the workflow's behalf. - - A provider that parks an outside reader against the running workflow, - as the Workflow Streams transport does with its long-poll update, has - to let go before the workflow can return. - """ - ... - class StreamProviderLifecycle(Protocol): """The hooks a provider adds when it needs the workflow's own lifetime. From 61fdb67428a2e6b5e2887f82f75a01919638013a Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 074/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From a92fe0a8e40d97bc56c306a5150ec6c2d411e7c3 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:22:04 -0700 Subject: [PATCH 075/831] Made the demo call the provider lifecycle hooks. A transport that serves outside readers through handlers on the workflow registers them in `prepare`, so without the call an outside reader finds no handler and the demo's follow fails against that provider. --- streams_demo/agent_loop.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index f3f39dca9..79d92c367 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -41,6 +41,15 @@ def decide(token: dict[str, Any]) -> dict[str, Any]: class AgentLoop: """Read, decide, write, until the producer says it has finished.""" + def __init__(self) -> None: + """Let the provider install what it needs before the first task. + + A no-op except on a transport that serves outside readers through + handlers on this workflow, which has to register them before the + first task completes or an early reader finds nothing to talk to. + """ + streams.prepare() + @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: """Decide on at most ``limit`` inputs, then return the trace.""" @@ -92,4 +101,7 @@ async def run(self, limit: int) -> list[dict[str, Any]]: finally: inputs.close() await decisions.finish() + # Lets go of anything the provider parked against this run, so a + # transport that holds a long poll open can let the workflow return. + streams.drain() return trace From ce1b16904e47f5a749cfeabaffb4609552ab9e77 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 076/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From db19139bea7932c30271ecdd238bd98d30eac4cd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 077/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From ddfd9680cc8e278f0701178d1b63b0b459537575 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 078/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- .../streams/providers/workflow_streams.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From 9b1a6ea4859f1b7ef3c25a3d3abdf1b3a4af0814 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 079/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- .../streams/providers/workflow_streams.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) From 8b1c2b369917f5b79b7992442fbe087540575fd2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 080/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From b3abc8344760ea395898aee233d7c8b1407d9d75 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 081/831] Made the Workflow Streams provider pass the linters. The transport already resolves its payload converter and falls back to the default when it holds no client, so the provider asks it rather than reaching through a client that may not be there. --- .../streams/providers/workflow_streams.py | 13 ++++++-- .../streams/test_workflow_streams_provider.py | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d849f1244..656056381 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -186,6 +186,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to one stream or topic on ``handle``.""" self._handle = handle self._converter = converter self._stream = stream @@ -205,15 +206,19 @@ def _shipped_topic(self) -> str: @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the shipped publish Signal.""" entries = [] for value in values: frame = _frame.encode( @@ -230,6 +235,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor("") async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._frame_topic, kind=RecordKind.FINISH, @@ -274,6 +280,7 @@ def __init__( shipped_topic: str | None, poll_cooldown: timedelta, ) -> None: + """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client self._shipped_topic = shipped_topic self._poll_cooldown = poll_cooldown @@ -285,6 +292,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -362,6 +370,7 @@ def _record( return out async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one log per workflow, whatever the topic head = await self._client.get_offset() return Cursor(str(head - 1)) if head > 0 else BEGINNING @@ -369,7 +378,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._client.data_converter.payload_converter + converter = self._client._payload_converter() if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2b491cbf1..612aaa33d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -12,6 +12,7 @@ import asyncio import os import uuid +from typing import Any import pytest @@ -62,7 +63,7 @@ async def run(self) -> int: return seen -async def take(records, count: int, timeout: float = 30.0) -> list: +async def take(records: Any, count: int, timeout: float = 30.0) -> list: out: list = [] async def _collect() -> None: @@ -77,9 +78,7 @@ async def _collect() -> None: async def test_interface_loop_over_workflow_streams(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -119,9 +118,7 @@ async def test_interface_loop_over_workflow_streams(): async def test_retried_producer_dedupes_and_new_attempt_supersedes(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -135,19 +132,28 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): ) first = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await first.append({"n": 1}) # The retry of the same attempt re-sends its first batch. retry = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await retry.append({"n": 1}) second = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=2, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=2, ) await second.append({"n": 2}) From 7b12920aca96a2575f17049880ea617e042cd012 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 082/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e32ed2f24..a827ac789 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,10 @@ to include examples, links to docs, or any other relevant information. can read, decide on, and write, with a registry that picks the provider when the worker is built. `temporalio.streams.providers.memory` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 70ca7478086637db7671e4df6dfe9d6278dcb56b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 083/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From acd99ce5fb45c84d4b5cc50b47ee01566b0d25c2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 084/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From c8d63d3ae10ff6090fbb8f4e7bbc19b930c73885 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 085/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From 0f5ff5e89b6723f5bfafba02b658bdf8a3477258 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 086/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a827ac789..9a6c565cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From 86f0e819963121fa754593d65fbd0197b5de5e98 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 087/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From 917b1359413755f5f3f089de671a7abd500317cd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 088/831] Pinned Core to the stream revision and regenerated bridge protos. --- .gitmodules | 2 +- .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 613 ++++++-------- .../workflow_activation_pb2.pyi | 68 ++ .../workflow_commands_pb2.py | 800 +++++++----------- .../workflow_commands_pb2.pyi | 90 ++ temporalio/bridge/sdk-core | 2 +- 7 files changed, 737 insertions(+), 840 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..ae7639820 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamMessages, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamMessages", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..0e1b3a1e6 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,430 +2,311 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.update.v1 import ( - message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, -) -from temporalio.bridge.proto.activity_result import ( - activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' -) - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ - "HeadersEntry" -] -_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStart" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartSuccess" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartFailure" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartCancelled" -] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecution" -] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveSignalExternalWorkflow" -] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveRequestCancelExternalWorkflow" -] -_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveNexusOperationStart" -] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] -WorkflowActivation = _reflection.GeneratedProtocolMessageType( - "WorkflowActivation", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }, -) + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] +_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] +_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] +WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( - "WorkflowActivationJob", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }, -) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }) _sym_db.RegisterMessage(WorkflowActivationJob) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType( - "InitializeWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _INITIALIZEWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }, -) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }) +_sym_db.RegisterMessage(DeliverStreamMessages) + +InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _INITIALIZEWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType( - "FireTimer", - (_message.Message,), - { - "DESCRIPTOR": _FIRETIMER, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }, -) +FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { + 'DESCRIPTOR' : _FIRETIMER, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType( - "ResolveActivity", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEACTIVITY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }, -) +ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }, -) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartSuccess", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }, -) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartFailure", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }, -) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartCancelled", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }, -) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }, -) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( - "UpdateRandomSeed", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERANDOMSEED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }, -) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERANDOMSEED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType( - "QueryWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _QUERYWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }, -) +QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _QUERYWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }, -) +CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType( - "SignalWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }, -) +SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType( - "NotifyHasPatch", - (_message.Message,), - { - "DESCRIPTOR": _NOTIFYHASPATCH, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }, -) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { + 'DESCRIPTOR' : _NOTIFYHASPATCH, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveSignalExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }, -) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveRequestCancelExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }, -) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType( - "DoUpdate", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }, - ), - "DESCRIPTOR": _DOUPDATE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }, -) +DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }) + , + 'DESCRIPTOR' : _DOUPDATE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperationStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }, -) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }, -) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType( - "RemoveFromCache", - (_message.Message,), - { - "DESCRIPTOR": _REMOVEFROMCACHE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }, -) +RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { + 'DESCRIPTOR' : _REMOVEFROMCACHE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" - ) - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' + _WORKFLOWACTIVATION._serialized_start=570 + _WORKFLOWACTIVATION._serialized_end=1116 + _WORKFLOWACTIVATIONJOB._serialized_start=1119 + _WORKFLOWACTIVATIONJOB._serialized_end=2582 + _DELIVERSTREAMMESSAGES._serialized_start=2585 + _DELIVERSTREAMMESSAGES._serialized_end=2724 + _INITIALIZEWORKFLOW._serialized_start=2727 + _INITIALIZEWORKFLOW._serialized_end=4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 + _FIRETIMER._serialized_start=4133 + _FIRETIMER._serialized_end=4157 + _RESOLVEACTIVITY._serialized_start=4159 + _RESOLVEACTIVITY._serialized_end=4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 + _UPDATERANDOMSEED._serialized_start=5045 + _UPDATERANDOMSEED._serialized_end=5088 + _QUERYWORKFLOW._serialized_start=5091 + _QUERYWORKFLOW._serialized_end=5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 + _CANCELWORKFLOW._serialized_start=5353 + _CANCELWORKFLOW._serialized_end=5385 + _SIGNALWORKFLOW._serialized_start=5388 + _SIGNALWORKFLOW._serialized_end=5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 + _NOTIFYHASPATCH._serialized_start=5679 + _NOTIFYHASPATCH._serialized_end=5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 + _DOUPDATE._serialized_start=5917 + _DOUPDATE._serialized_end=6248 + _DOUPDATE_HEADERSENTRY._serialized_start=4052 + _DOUPDATE_HEADERSENTRY._serialized_end=4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 + _RESOLVENEXUSOPERATION._serialized_start=6407 + _RESOLVENEXUSOPERATION._serialized_end=6496 + _REMOVEFROMCACHE._serialized_start=6499 + _REMOVEFROMCACHE._serialized_end=6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..eab815fc9 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.update.v1.message_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_messages(self) -> global___DeliverStreamMessages: + """A range of a stream the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +327,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +335,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -368,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -421,6 +431,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_messages", "remove_from_cache", ] | None @@ -1440,6 +1451,63 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 64fa8a255..ccfa1a016 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,552 +2,408 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" - +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.sdk.v1 import ( - event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, -) -from temporalio.api.sdk.v1 import ( - user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' -) - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] -_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ - "HeadersEntry" -] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ - "RequestCancelLocalActivity" -] -_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CompleteWorkflowExecution" -] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ContinueAsNewWorkflowExecution" -] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "StartChildWorkflowExecution" -] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CancelChildWorkflowExecution" -] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "RequestCancelExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "SignalExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( - _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ - "UpsertWorkflowSearchAttributes" -] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ - "NexusHeaderEntry" -] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ - "RequestCancelNexusOperation" -] -WorkflowCommand = _reflection.GeneratedProtocolMessageType( - "WorkflowCommand", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWCOMMAND, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }, -) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] +_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] +_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] +_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] +WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWCOMMAND, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }) _sym_db.RegisterMessage(WorkflowCommand) -StartTimer = _reflection.GeneratedProtocolMessageType( - "StartTimer", - (_message.Message,), - { - "DESCRIPTOR": _STARTTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }, -) +AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _ADDSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }) +_sym_db.RegisterMessage(AddStreamMessages) + +SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTREAM, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }) +_sym_db.RegisterMessage(SubscribeStream) + +StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { + 'DESCRIPTOR' : _STARTTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType( - "CancelTimer", - (_message.Message,), - { - "DESCRIPTOR": _CANCELTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }, -) +CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { + 'DESCRIPTOR' : _CANCELTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULEACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }, -) +ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleLocalActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULELOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }, -) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }, -) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelLocalActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }, -) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType( - "QueryResult", - (_message.Message,), - { - "DESCRIPTOR": _QUERYRESULT, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }, -) +QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { + 'DESCRIPTOR' : _QUERYRESULT, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType( - "QuerySuccess", - (_message.Message,), - { - "DESCRIPTOR": _QUERYSUCCESS, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }, -) +QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { + 'DESCRIPTOR' : _QUERYSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CompleteWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }, -) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "FailWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _FAILWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }, -) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ContinueAsNewWorkflowExecution", - (_message.Message,), - { - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }, - ), - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }, -) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }) + , + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }, -) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType( - "SetPatchMarker", - (_message.Message,), - { - "DESCRIPTOR": _SETPATCHMARKER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }, -) +SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { + 'DESCRIPTOR' : _SETPATCHMARKER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "StartChildWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }, - ), - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }, - ), - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }, -) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }) + , + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }) + , + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }, -) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "RequestCancelExternalWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }, -) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "SignalExternalWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }, -) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelSignalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELSIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }, -) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( - "UpsertWorkflowSearchAttributes", - (_message.Message,), - { - "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }, -) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { + 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( - "ModifyWorkflowProperties", - (_message.Message,), - { - "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }, -) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { + 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType( - "UpdateResponse", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERESPONSE, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }, -) +UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERESPONSE, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( - "ScheduleNexusOperation", - (_message.Message,), - { - "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( - "NexusHeaderEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }, - ), - "DESCRIPTOR": _SCHEDULENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }, -) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { + + 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( - "RequestCancelNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }, -) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" - ) - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8633 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8721 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4300 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4302 - _REQUESTCANCELACTIVITY._serialized_end = 4338 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4340 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4381 - _QUERYRESULT._serialized_start = 4384 - _QUERYRESULT._serialized_end = 4540 - _QUERYSUCCESS._serialized_start = 4542 - _QUERYSUCCESS._serialized_end = 4607 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4609 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4685 - _FAILWORKFLOWEXECUTION._serialized_start = 4687 - _FAILWORKFLOWEXECUTION._serialized_end = 4761 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4764 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5678 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5521 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5597 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5680 - _CANCELWORKFLOWEXECUTION._serialized_end = 5756 - _SETPATCHMARKER._serialized_start = 5758 - _SETPATCHMARKER._serialized_end = 5812 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5815 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 6989 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5521 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5597 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 6991 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7065 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7068 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7210 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7213 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7612 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7614 - _CANCELSIGNALWORKFLOW._serialized_end = 7649 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7651 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7752 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7754 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7833 - _UPDATERESPONSE._serialized_start = 7836 - _UPDATERESPONSE._serialized_end = 8046 - _SCHEDULENEXUSOPERATION._serialized_start = 8049 - _SCHEDULENEXUSOPERATION._serialized_end = 8587 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8537 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8587 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8589 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8631 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' + _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 + _WORKFLOWCOMMAND._serialized_start=556 + _WORKFLOWCOMMAND._serialized_end=2794 + _ADDSTREAMMESSAGES._serialized_start=2796 + _ADDSTREAMMESSAGES._serialized_end=2891 + _SUBSCRIBESTREAM._serialized_start=2893 + _SUBSCRIBESTREAM._serialized_end=2951 + _STARTTIMER._serialized_start=2953 + _STARTTIMER._serialized_end=3036 + _CANCELTIMER._serialized_start=3038 + _CANCELTIMER._serialized_end=3064 + _SCHEDULEACTIVITY._serialized_start=3067 + _SCHEDULEACTIVITY._serialized_end=3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 + _SCHEDULELOCALACTIVITY._serialized_start=3894 + _SCHEDULELOCALACTIVITY._serialized_end=4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 + _REQUESTCANCELACTIVITY._serialized_start=4646 + _REQUESTCANCELACTIVITY._serialized_end=4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 + _QUERYRESULT._serialized_start=4728 + _QUERYRESULT._serialized_end=4884 + _QUERYSUCCESS._serialized_start=4886 + _QUERYSUCCESS._serialized_end=4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 + _FAILWORKFLOWEXECUTION._serialized_start=5031 + _FAILWORKFLOWEXECUTION._serialized_end=5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELWORKFLOWEXECUTION._serialized_start=6024 + _CANCELWORKFLOWEXECUTION._serialized_end=6100 + _SETPATCHMARKER._serialized_start=6102 + _SETPATCHMARKER._serialized_end=6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELSIGNALWORKFLOW._serialized_start=7958 + _CANCELSIGNALWORKFLOW._serialized_end=7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 + _UPDATERESPONSE._serialized_start=8180 + _UPDATERESPONSE._serialized_end=8390 + _SCHEDULENEXUSOPERATION._serialized_start=8393 + _SCHEDULENEXUSOPERATION._serialized_end=8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 510643132..f5a5fdb97 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,6 +23,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,10 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: ... + @property + def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( self, *, @@ -215,6 +222,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... def HasField( self, @@ -243,6 +252,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -298,6 +311,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -350,6 +367,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "add_stream_messages", ] | None ): ... @@ -386,6 +405,77 @@ class StartTimer(google.protobuf.message.Message): global___StartTimer = StartTimer +class AddStreamMessages(google.protobuf.message.Message): + """Publish a batch of messages to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand messages cost the same in History as one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessages = AddStreamMessages + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index b860e3f14..3d1f82e66 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit b860e3f14f68af64bd4d0e372b3c78b2ce9ecff1 +Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 From 5f19127131ca6d39dc58d93f8d05d33a4ce7eaa8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 089/831] Added the vendored stream API protos. --- scripts/gen_stream_protos.py | 161 +++++ temporalio/api/stream/__init__.py | 0 temporalio/api/stream/v1/__init__.py | 11 + temporalio/api/stream/v1/message_pb2.py | 69 ++ temporalio/api/stream/v1/message_pb2.pyi | 134 ++++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 138 ++++ .../api/streamservice/v1/message_pb2.py | 46 ++ .../api/streamservice/v1/message_pb2.pyi | 47 ++ .../api/streamservice/v1/message_pb2_grpc.py | 24 + .../streamservice/v1/request_response_pb2.py | 138 ++++ .../streamservice/v1/request_response_pb2.pyi | 434 ++++++++++++ .../v1/request_response_pb2_grpc.py | 24 + .../api/streamservice/v1/service_pb2.py | 38 ++ .../api/streamservice/v1/service_pb2.pyi | 5 + .../api/streamservice/v1/service_pb2_grpc.py | 616 ++++++++++++++++++ .../api/streamservice/v1/stream_state_pb2.py | 56 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 114 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 24 + 19 files changed, 2079 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/stream/__init__.py create mode 100644 temporalio/api/stream/v1/__init__.py create mode 100644 temporalio/api/stream/v1/message_pb2.py create mode 100644 temporalio/api/stream/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..e66f8abb4 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,161 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, "-m", "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--pyi_out={out}", + f"--grpc_python_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/stream/__init__.py b/temporalio/api/stream/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py new file mode 100644 index 000000000..f76c1c334 --- /dev/null +++ b/temporalio/api/stream/v1/__init__.py @@ -0,0 +1,11 @@ +from .message_pb2 import ( + StreamCursor, + StreamMessage, + StreamSlice, +) + +__all__ = [ + "StreamCursor", + "StreamMessage", + "StreamSlice", +] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py new file mode 100644 index 000000000..da1e5bc91 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/stream/v1/message.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto\"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03\"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3') + + + +_STREAMMESSAGE = DESCRIPTOR.message_types_by_name['StreamMessage'] +_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name['MetadataEntry'] +_STREAMSLICE = DESCRIPTOR.message_types_by_name['StreamSlice'] +_STREAMCURSOR = DESCRIPTOR.message_types_by_name['StreamCursor'] +StreamMessage = _reflection.GeneratedProtocolMessageType('StreamMessage', (_message.Message,), { + + 'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), { + 'DESCRIPTOR' : _STREAMMESSAGE_METADATAENTRY, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) + }) + , + 'DESCRIPTOR' : _STREAMMESSAGE, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) + }) +_sym_db.RegisterMessage(StreamMessage) +_sym_db.RegisterMessage(StreamMessage.MetadataEntry) + +StreamSlice = _reflection.GeneratedProtocolMessageType('StreamSlice', (_message.Message,), { + 'DESCRIPTOR' : _STREAMSLICE, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }) +_sym_db.RegisterMessage(StreamSlice) + +StreamCursor = _reflection.GeneratedProtocolMessageType('StreamCursor', (_message.Message,), { + 'DESCRIPTOR' : _STREAMCURSOR, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) + }) +_sym_db.RegisterMessage(StreamCursor) + +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1' + _STREAMMESSAGE_METADATAENTRY._options = None + _STREAMMESSAGE_METADATAENTRY._serialized_options = b'8\001' + _STREAMMESSAGE._serialized_start=103 + _STREAMMESSAGE._serialized_end=357 + _STREAMMESSAGE_METADATAENTRY._serialized_start=277 + _STREAMMESSAGE_METADATAENTRY._serialized_end=357 + _STREAMSLICE._serialized_start=360 + _STREAMSLICE._serialized_end=547 + _STREAMCURSOR._serialized_start=549 + _STREAMCURSOR._serialized_end=622 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi new file mode 100644 index 000000000..c1c796da8 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -0,0 +1,134 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" +import builtins +import collections.abc +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message +import sys +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["value", b"value"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + @property + def metadata(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, temporalio.api.common.v1.message_pb2.Payload]: ... + topic: builtins.str + topic_sequence: builtins.int + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[builtins.str, temporalio.api.common.v1.message_pb2.Payload] | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["body", b"body"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["body", b"body", "metadata", b"metadata", "topic", b"topic", "topic_sequence", b"topic_sequence"]) -> None: ... + +global___StreamMessage = StreamMessage + +class StreamSlice(google.protobuf.message.Message): + """A contiguous range of a stream delivered to a Workflow Task, along with the + offsets it covers. The offsets are what History records; the messages + themselves are never written to History. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription observed nothing, + which is a fact replay has to reproduce rather than an absence of one. + """ + @property + def messages(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___StreamMessage]: ... + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event whose stream_cursors recorded this range. + Set only when the server is re-supplying a range for a task being + replayed; a slice for the task now being started leaves it unset, because + the event closing that task does not exist yet. + + Replay needs this because a Workflow Task response carries one slice set + while a cache miss replays every prior task, so the ranges have to be + matched to the events that recorded them rather than to the response. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + workflow_task_completed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "messages", b"messages", "run_id", b"run_id", "stream_id", b"stream_id", "to_offset", b"to_offset", "workflow_task_completed_event_id", b"workflow_task_completed_event_id"]) -> None: ... + +global___StreamSlice = StreamSlice + +class StreamCursor(google.protobuf.message.Message): + """The offsets a Workflow Task consumed, without the payloads. Recorded on + WorkflowTaskCompleted so History grows with Workflow Tasks rather than with + messages. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + from_offset: builtins.int + to_offset: builtins.int + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "stream_id", b"stream_id", "to_offset", b"to_offset"]) -> None: ... + +global___StreamCursor = StreamCursor diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..31f99bded --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,138 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + STREAM_MESSAGE_KIND_DATA, + STREAM_MESSAGE_KIND_FLUSH, + STREAM_MESSAGE_KIND_UNSPECIFIED, + StreamMessage, + StreamMessageBatch, + StreamMessageKind, +) + +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "STREAM_MESSAGE_KIND_DATA", + "STREAM_MESSAGE_KIND_FLUSH", + "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamLifecycle", + "StreamListEntry", + "StreamMessage", + "StreamMessageBatch", + "StreamMessageKind", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..b4fe8e68a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/message.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/message.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z None: ... + BODY_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + body: _message_pb2.Payload + metadata: _containers.MessageMap[str, _message_pb2.Payload] + topic: str + topic_sequence: int + kind: StreamMessageKind + offset: int + def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + +class StreamMessageBatch(_message.Message): + __slots__ = ("messages",) + MESSAGES_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] + def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..b1383816d --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..60dafee45 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/request_response.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/request_response.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + +class CreateStreamOutput(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class AddMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + expected_offset: int + use_expected_offset: bool + owner_epoch: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + +class AddMessagesOutput(_message.Message): + __slots__ = ("first_offset", "next_offset", "count", "deduplicated") + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] + first_offset: int + next_offset: int + count: int + deduplicated: bool + def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + +class FinishWritingInput(_message.Message): + __slots__ = ("namespace", "stream_id", "producer_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + producer_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + +class FinishWritingOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SubscribeWorkflowInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + stream_id: str + start_offset: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class SubscribeWorkflowOutput(_message.Message): + __slots__ = ("start_offset",) + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + start_offset: int + def __init__(self, start_offset: _Optional[int] = ...) -> None: ... + +class PollMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class PollMessagesOutput(_message.Message): + __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") + MESSAGES_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + next_offset: int + head_offset: int + closed: bool + close_reason: _message_pb2_1.Payload + def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class DescribeStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class PollWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class DescribeWorkflowStreamInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + +class AddWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + +class DescribeStreamOutput(_message.Message): + __slots__ = ("state",) + STATE_FIELD_NUMBER: _ClassVar[int] + state: _stream_state_pb2.StreamState + def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + +class CloseStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "reason") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + reason: _message_pb2_1.Payload + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class CloseStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TruncateStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "new_base_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + new_base_offset: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + +class TruncateStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class DeleteStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class CreateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CreateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + +class CreateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CreateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + +class AddMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + +class AddMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class FinishWritingRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: FinishWritingInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + +class FinishWritingResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: FinishWritingOutput + def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: SubscribeWorkflowInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: SubscribeWorkflowOutput + def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + +class PollMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + +class PollMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeWorkflowStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class CloseStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CloseStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + +class CloseStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CloseStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + +class TruncateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: TruncateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + +class TruncateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: TruncateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + +class ListStreamsInput(_message.Message): + __slots__ = ("namespace", "page_size", "next_page_token", "query") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + namespace: str + page_size: int + next_page_token: bytes + query: str + def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + +class StreamListEntry(_message.Message): + __slots__ = ("stream_id", "run_id") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + stream_id: str + run_id: str + def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + +class ListStreamsOutput(_message.Message): + __slots__ = ("streams", "next_page_token") + STREAMS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] + next_page_token: bytes + def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + +class ListStreamsRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: ListStreamsInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + +class ListStreamsResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: ListStreamsOutput + def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + +class DeleteStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DeleteStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + +class DeleteStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DeleteStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..87cc91022 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..7f376c28e --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class StreamServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True) + self.AddMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True) + self.FinishWriting = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True) + self.SubscribeWorkflow = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True) + self.PollMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True) + self.DescribeStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True) + self.PollWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True) + self.DescribeWorkflowStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True) + self.AddWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True) + self.CloseStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True) + self.TruncateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True) + self.ListStreams = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True) + self.DeleteStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True) + + +class StreamServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def CreateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinishWriting(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeWorkflow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollWorkflowMessages(self, request, context): + """Routed on the owner, because the stream it reads has no id of its own. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeWorkflowStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkflowMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TruncateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListStreams(self, request, context): + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_StreamServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateStream': grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + 'AddMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + 'FinishWriting': grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + 'PollMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + 'DescribeStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + 'CloseStream': grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + 'TruncateStream': grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + 'ListStreams': grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + 'DeleteStream': grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class StreamService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinishWriting(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeWorkflow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeWorkflowStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CloseStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def TruncateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListStreams(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..234fa94d0 --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/stream_state.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/stream_state.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z None: ... + class ConsumersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ConsumerCursor + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCERS_FIELD_NUMBER: _ClassVar[int] + CONSUMERS_FIELD_NUMBER: _ClassVar[int] + LIFECYCLE_FIELD_NUMBER: _ClassVar[int] + REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] + head_offset: int + base_offset: int + last_txn_id: int + closed: bool + close_reason: _message_pb2.Payload + owner_epoch: int + bucket_size: int + collection_id: str + producers: _containers.MessageMap[str, ProducerCursor] + consumers: _containers.MessageMap[str, ConsumerCursor] + lifecycle: StreamLifecycle + redirect_run_id: str + close_time: _timestamp_pb2.Timestamp + def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProducerCursor(_message.Message): + __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") + SEQ_FIELD_NUMBER: _ClassVar[int] + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] + FENCED_FIELD_NUMBER: _ClassVar[int] + seq: int + first_offset: int + count: int + content_hash: bytes + fenced: bool + def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + +class ConsumerCursor(_message.Message): + __slots__ = ("workflow_id", "run_id", "offset", "active", "external") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + run_id: str + offset: int + active: bool + external: bool + def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + +class WorkflowStreamCursor(_message.Message): + __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + PENDING_FROM_FIELD_NUMBER: _ClassVar[int] + PENDING_TO_FIELD_NUMBER: _ClassVar[int] + HAS_PENDING_FIELD_NUMBER: _ClassVar[int] + stream_id: str + collection_id: str + bucket_size: int + offset: int + known_head: int + external: bool + pending_from: int + pending_to: int + has_pending: bool + def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + +class StreamLifecycle(_message.Message): + __slots__ = ("retention", "max_items") + RETENTION_FIELD_NUMBER: _ClassVar[int] + MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] + retention: _duration_pb2.Duration + max_items: int + def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..4e128a2aa --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) From 8bb886989749fece7b9404baad29fbab81762180 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 090/831] Added the stream client and the workflow stream surface. --- temporalio/client_stream.py | 476 +++++++++++++++++++++++ temporalio/worker/_workflow_instance.py | 142 +++++++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 119 ++++++ tests/test_client_stream.py | 128 ++++++ tests/worker/test_workflow_stream.py | 113 ++++++ tests/worker/test_workflow_stream_e2e.py | 244 ++++++++++++ 7 files changed, 1232 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py create mode 100644 tests/worker/test_workflow_stream.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..75388c9c9 --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,476 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` + instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, AsyncIterator, Optional, Sequence + +import google.protobuf.duration_pb2 + +import temporalio.api.common.v1 +import temporalio.api.streamservice.v1 as stream +from temporalio.api.streamservice.v1 import service_pb2_grpc + +__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] + + +@dataclass(frozen=True) +class Message: + """One item read from a stream. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back messages whose offsets are not contiguous. To resume at the + boundary of a whole read, checkpoint the ``next_offset`` that + :meth:`StreamHandle.read` returns instead. + """ + + data: bytes + topic: str = "" + offset: int = 0 + """Where this message sits in the whole stream. + + A topic filter leaves gaps, so a reader that resumes between messages has + to take this rather than count what it received. + """ + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. + """ + + messages: list[Message] + next_offset: int + head_offset: int + closed: bool + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + self._stub = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> "StreamClient": + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + try: + import grpc + except ImportError as err: + raise RuntimeError( + "temporalio.client_stream requires the grpc extra: " + "pip install 'temporalio[grpc]'" + ) from err + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: Optional[float] = None, + max_items: Optional[int] = None, + ) -> "StreamHandle": + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many messages remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await self._stub.CreateStream( + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ) + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> "StreamHandle": + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "" + ) -> "WorkflowStreamHandle": + """Open a stream a workflow publishes to. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.add_stream_messages`` writes to when it is given none. + + The stream is created by the workflow's first publish. Reading one that + does not exist yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when the + workflow publishes. + """ + return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + + +class StreamHandle: + """A handle to one stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append messages and return the offset the first one landed at. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice. Without them the append is at-least-once, which is + only the right trade when duplicates are harmless. + """ + response = await self._stub.AddMessages( + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, returning the messages and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=offset, + topics=list(topics), + wait_new_messages=True, + ) + ) + ) + out = response.frontend_response + for msg in out.messages: + yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) + offset = out.next_offset + if out.closed and offset >= out.head_offset: + return + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await self._stub.FinishWriting( + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ) + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await self._stub.CloseStream( + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await self._stub.DescribeStream( + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow publishes to. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, stub: Any, namespace: str, workflow_id: str, name: str = "" + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await self._stub.AddWorkflowMessages( + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for msg in page.messages: + yield msg + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_messages: int = 0, + wait: bool = True, + ) -> "Page": + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + """ + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return Page( + messages=[ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await self._stub.DescribeWorkflowStream( + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + ) + ) + ) + return response.frontend_response.state diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 69b416f26..7dd61a11c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -262,6 +263,71 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# which would replay and re-issue the same rejected command forever, into an +# error the workflow author can see. +_MAX_STREAM_MESSAGES_PER_BATCH = 1000 + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self) -> None: + self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._waiters: list[asyncio.Future] = [] + + def extend( + self, + messages: Sequence[temporalio.api.stream.v1.StreamMessage], + from_offset: int = 0, + ) -> None: + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not messages: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-message field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + self._messages.extend( + temporalio.workflow.DeliveredStreamMessage( + body=message.body.data, + topic=message.topic, + offset=from_offset + index, + ) + for index, message in enumerate(messages) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: + taken, self._messages = self._messages, [] + return taken + + def put_back( + self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._messages[:0] = messages + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._messages) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -389,6 +455,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -604,6 +675,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_messages"): + self._apply_deliver_stream_messages(job.deliver_stream_messages) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1129,6 +1202,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_messages( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer() + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.messages, job.from_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1293,6 +1379,62 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. The + # server treats a repeat subscription to the same stream as a no-op. + self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: + if not messages: + raise ValueError("add_stream_messages needs at least one message") + if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " + f"got {len(messages)}" + ) + command = self._add_command() + command.add_stream_messages.stream_id = stream_id + for body in messages: + # The bodies ride the command and never enter History, so the event + # this produces stays the same size whatever is published here. + message = command.add_stream_messages.messages.add() + message.body.data = body + # Every other Temporal payload names its encoding, and the UI, the + # CLI and any codec server rely on that to decode what they read. + message.body.metadata["encoding"] = b"binary/plain" + message.topic = topic + + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: + return [ + m.body + for m in await self.workflow_read_stream_messages(stream_id, max_messages) + ] + + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[temporalio.workflow.DeliveredStreamMessage]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_messages and len(taken) > max_messages: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_messages:]) + taken = taken[:max_messages] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..9189b0db6 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -95,6 +95,11 @@ upsert_search_attributes, uuid4, uuid7, + DeliveredStreamMessage, + read_stream, + read_stream_messages, + add_stream_messages, + subscribe_stream, wait_condition, ) from ._definition import ( @@ -227,6 +232,11 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamMessage", + "read_stream", + "read_stream_messages", + "add_stream_messages", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..423d77d01 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -312,6 +312,24 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: ... + + @abstractmethod + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: ... + + @abstractmethod + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[DeliveredStreamMessage]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -945,6 +963,107 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream` returns them. Safe to call again: the server treats + a second subscription to the same stream as a no-op, which is what makes + calling it on every replay harmless. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. + + Args: + stream_id: Stream to consume. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def add_stream_messages( + messages: Sequence[bytes], + *, + stream_id: str = "", + topic: str = "", +) -> None: + """Publish a batch of messages to a stream this workflow owns. + + Returns as soon as the command is issued. The bodies go to the stream's own + log rather than into History, which gets one fixed-size event naming the + offset range, so a batch of a thousand costs History the same as a batch of + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Batch where you can. The event is per call, and a workflow is bounded by the + history event count, so one call with a hundred messages leaves far more + room than a hundred calls with one. + + Args: + messages: Bodies to append, in order. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + topic: Optional topic, which readers can filter on. Offsets are still + assigned over the unfiltered stream. + """ + _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + + +@dataclass(frozen=True) +class DeliveredStreamMessage: + """One message a consuming workflow was given, with where it sat.""" + + body: bytes + topic: str + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_messages( + stream_id: str, *, max_messages: int = 0 +) -> list[DeliveredStreamMessage]: + """Read the next messages, keeping their topic and position. + + Same delivery as :func:`read_stream`. A reader that has to name where it + got to, filter a topic, or hand a position to something outside the + workflow needs more than the bodies. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_messages( + stream_id, max_messages + ) + + +async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: + """Read the next messages of a stream this workflow consumes. + + Waits until at least one message is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. + + Subscribe out of band with the stream client. This only reads what has + already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + + Returns: + The message bodies, in stream order. + """ + return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..f7df3c7a7 --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,128 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import AsyncIterator + +import pytest + +from temporalio.client_stream import StreamClient, StreamHandle + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +@pytest.fixture +async def stream() -> AsyncIterator[StreamHandle]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + finally: + await client.close() + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + assert await stream.append(b"alpha", b"beta") == 0 + assert await stream.append(b"gamma") == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(b"alpha", b"beta", b"gamma") + + messages, next_offset = await stream.read() + assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + assert next_offset == 3 + + messages, next_offset = await stream.read(from_offset=1) + assert [m.data for m in messages] == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(b"alpha") + + messages, next_offset = await stream.read(from_offset=1) + assert messages == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same message twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(b"once", producer_id="p1", sequence=1) + retry = await stream.append(b"once", producer_id="p1", sequence=1) + assert first == retry == 0 + + messages, _ = await stream.read() + assert [m.data for m in messages] == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(b"tok", topic="tokens") + await stream.append(b"prog", topic="progress") + await stream.append(b"tok2", topic="tokens") + + messages, next_offset = await stream.read(topics=["tokens"]) + assert [m.data for m in messages] == [b"tok", b"tok2"] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for message in stream.follow(): + received.append(message.data) + + task = asyncio.create_task(follower()) + await stream.append(b"one") + await asyncio.sleep(0.2) + await stream.append(b"two") + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(b"one", b"two") + await stream.close() + + received = [m.data async for m in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(b"one", b"two") + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..944761cfa --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,113 @@ +"""In-workflow consumption of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering and the workflow-facing read directly, which is the part +this SDK owns; the delivery decision itself lives in the server and sdk-core. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.worker._workflow_instance import ( + _StreamBuffer, + _WorkflowInstanceImpl, +) + + +def message(body: bytes) -> api_stream.StreamMessage: + return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"one"), message(b"two")]) + + assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([message(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert [m.body.data for m in buffer.take()] == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert [m.body.data for m in buffer.take()] == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream``, so a test that reimplements + it proves nothing about the code that ships. + """ + + def __init__(self) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self.read_only_calls: list[str] = [] + + def _assert_not_read_only(self, action: str) -> None: + self.read_only_calls.append(action) + + +@pytest.mark.parametrize("max_messages", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: + stub = _ReadOnlyStub() + bodies = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b) for b in bodies]) + + got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + + assert got == bodies[:max_messages] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + + if len(stub._stream_buffers["s"]): + rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert got + rest == bodies + else: + assert got == bodies + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub() + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b"a")]) + + await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..579327217 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,244 @@ +"""A workflow publishing to a stream it owns and reading its own messages back. + +Path A and Path C together, both from workflow code. Needs a Temporal server +built from the AI-198 branch, because neither the stream service nor the +commands exist on a released one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest +from temporalio.api.enums.v1 import EventType + +from temporalio import workflow +from temporalio.client import Client +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +STREAM = "output" + +# Event type numbers rather than names: this SDK's api protos predate both +# events, so the attributes arrive as unknown fields and only the type is +# readable here. The server's own tests are where the offsets are asserted. +EVENT_STREAM_SUBSCRIBED = 61 +EVENT_STREAM_MESSAGES_ADDED = 62 + + +@workflow.defn +class PublishAndRead: + @workflow.run + async def run(self) -> list[str]: + # Published before subscribing, because a subscription resolves against + # the streams the workflow already owns and this is what creates one. + workflow.add_stream_messages( + [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + ) + workflow.add_stream_messages([b"delta"], stream_id=STREAM) + + workflow.subscribe_stream(STREAM, start_offset=0) + + received: list[str] = [] + while len(received) < 4: + for body in await workflow.read_stream(STREAM): + received.append(body.decode()) + return received + + +async def test_workflow_reads_back_what_it_published() -> None: + client = await Client.connect(TARGET or "") + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=wf_id, task_queue=task_queue + ), + timeout=60, + ) + + assert result == ["alpha", "beta", "gamma", "delta"] + + counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + + # Two calls carrying four messages, so two events: the event is per batch, + # which is what makes batching free. + assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class PublishOnSignal: + """Publishes a token per signal, which is the shape an agent turn has.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + self._done = False + + @workflow.run + async def run(self) -> int: + published = 0 + while True: + await workflow.wait_condition(lambda: self._pending or self._done) + while self._pending: + workflow.add_stream_messages([self._pending.pop(0).encode()]) + published += 1 + if self._done: + return published + + @workflow.signal + async def emit(self, token: str) -> None: + self._pending.append(token) + + @workflow.signal + async def finish(self) -> None: + self._done = True + + +async def test_a_client_follows_what_a_workflow_publishes() -> None: + """The harness shape: the workflow writes, something outside it reads live. + + A stream a workflow owns has no id, so the reader addresses it by the + owner. It also attaches before the first publish, which is what a UI opening + on a session does. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "follow-tq-" + uuid.uuid4().hex[:8] + wf_id = "follow-wf-" + uuid.uuid4().hex[:8] + + tokens = [f"token-{i}" for i in range(5)] + received: list[str] = [] + + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishOnSignal], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + PublishOnSignal.run, id=wf_id, task_queue=task_queue + ) + + # Attached before anything is published, so the stream does not + # exist yet and the first poll has to park rather than fail. + reader = streams.workflow_stream(wf_id) + assert (await reader.describe()).head_offset == 0 + + async def follow() -> None: + async for message in reader.follow(): + received.append(message.data.decode()) + if len(received) == len(tokens): + return + + following = asyncio.ensure_future(follow()) + for token in tokens: + await handle.signal(PublishOnSignal.emit, token) + await asyncio.wait_for(following, timeout=60) + + await handle.signal(PublishOnSignal.finish) + assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) + finally: + await streams.close() + + assert received == tokens + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each `read_stream` that finds nothing + blocks, which ends a Workflow Task, so the run spans several. With the + cache on, every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for body in await workflow.read_stream(stream_id): + seen.append(body.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + Every other end-to-end test here disables it, so the sticky path was never + exercised. The server sends no replay slice for a sticky task, while the + sticky history still carries the previous task's consumed range, and the + two together used to fail every task after the first consumed range. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, + task_queue=task_queue, + workflows=[ConsumeAcrossTasks], + # Left at the default deliberately. This is what the test is for. + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=wf_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append(*[t.encode() for t in batch]) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + # More than one Workflow Task ran, otherwise the test proves nothing. + completed = 0 + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: + completed += 1 + assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + finally: + await streams.close() From e2367fdd09d44b555d4e9e791003d201403f8593 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 091/831] Added the Workflow Streams surface over a server-side stream. --- temporalio/contrib/server_streams/__init__.py | 397 ++++++++++++++++++ tests/contrib/test_server_streams.py | 154 +++++++ 2 files changed, 551 insertions(+) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..e831d763c --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,397 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per batch rather than a +Signal per batch. A consumer reads the log directly rather than long-polling an +Update, so there is no per-Workflow limit on how many can read at once, and a +closed Workflow stays readable until its stream's retention expires. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, Optional, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.converter import DataConverter, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still encoded. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + """ + + items: list["WorkflowStreamItem[bytes]"] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _encode(converter: PayloadConverter, value: Any) -> bytes: + """Serialize one value to a stream message body. + + The payload rather than the bare bytes, so the encoding metadata the + consumer needs to decode into a type travels with it. + + The codec chain is not applied. It cannot be applied here: a codec is async + and a Workflow publishing to a stream is not, so running one inside Workflow + code would be I/O on the Workflow thread. Regular payloads solve this in the + Worker, encoding on the way out and decoding on the way in, and a stream + needs the same plumbing before a codec can be honoured. + + It is not applied on the client path either, deliberately. Encoding one side + and not the other is worse than encoding neither: an Activity's messages + would reach a consuming Workflow as ciphertext it has no way to decode. + :func:`_reject_configured_codec` is what keeps that from happening quietly. + """ + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies bypass the codec chain, so proceeding would write payloads + this namespace expects to be encrypted in the clear, and would do it + silently. Raising is the only honest answer until the Worker-side plumbing + exists. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it. Publishing would store them " + "unencoded. Use a client without a codec, or wait for codec support " + "on streams." + ) + + +def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns as soon as the Command is issued. There is nothing to await: + the append is applied in the Workflow Task's own commit, so it costs + this Workflow no round trip and no extra transition. + """ + workflow.add_stream_messages( + [_encode(workflow.payload_converter(), value)], topic=self._name + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic( + self, name: str, *, type: type = object + ) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`.""" + self._handle = handle + self._converter = converter + self._batch_interval = batch_interval + self._buffered: list[tuple[str, Any]] = [] + self._flusher: Optional[asyncio.Task[None]] = None + self._wake = asyncio.Event() + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> "WorkflowStreamClient": + """Open the stream owned by ``workflow_id``.""" + _reject_configured_codec(client) + return cls( + _stream_client(client).workflow_stream(workflow_id), + client.data_converter.payload_converter, + batch_interval, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> "WorkflowStreamClient": + """Open the stream owned by the Workflow that scheduled this Activity.""" + client = activity.client() + return cls.create( + client, activity.info().workflow_id, batch_interval=batch_interval + ) + + async def __aenter__(self) -> "WorkflowStreamClient": + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. + """ + if self._flusher is not None: + self._flusher.cancel() + try: + await self._flusher + except asyncio.CancelledError: + pass + self._flusher = None + await self.flush() + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + async for message in self._handle.follow(from_offset=from_offset, topics=topics): + yield WorkflowStreamItem( + topic=message.topic, + data=_decode(self._converter, message.data, result_type), + offset=message.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> "RawPage": + """One read, with the bodies left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) + for m in page.messages + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + # One append per topic, because a batch carries a single topic. The + # harness case is one topic, so this is one append. + by_topic: dict[str, list[bytes]] = {} + for topic, value in pending: + by_topic.setdefault(topic, []).append(_encode(self._converter, value)) + for topic, bodies in by_topic.items(): + await self._handle.append(*bodies, topic=topic) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while True: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + +# One channel per target, shared by every handle in the process. The channel is +# multiplexed and long-lived, and callers here open a client per subscription, +# which would otherwise be a connection per subscription. +_clients: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop too: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _clients.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _clients[key] = existing + return existing diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..33d86d827 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,154 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow( + Emitting.run, 3, id=wf_id, task_queue=task_queue + ) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] From 02b65c41f097f3bfb9e78ffccc2807b352867103 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:57:03 -0700 Subject: [PATCH 092/831] Added the native provider module. --- temporalio/streams/providers/native.py | 398 +++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 temporalio/streams/providers/native.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..f5570b05a --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,398 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server. A workflow publishes with a command that +the server applies in the same transaction that accepts the workflow task, and +consumes ranges the server attaches to the workflow task it dispatches. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_STATE = "__temporal_streams_state" + + +class _Fanout: + """One server subscription, shared by every reader of that stream. + + The server sends a range once. Whoever reads it first would otherwise take + it from the others, so the pull happens here and the result goes to all + live readers. + """ + + def __init__(self, stream: str) -> None: + self._stream = stream + self._subscribers: list[list[tuple[Cursor, bytes]]] = [] + self._pull: asyncio.Future[None] | None = None + + def attach(self) -> list[tuple[Cursor, bytes]]: + queue: list[tuple[Cursor, bytes]] = [] + self._subscribers.append(queue) + return queue + + def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: + if queue in self._subscribers: + self._subscribers.remove(queue) + + async def next_batch( + self, queue: list[tuple[Cursor, bytes]] + ) -> list[tuple[Cursor, bytes]]: + while not queue: + pending = self._pull + if pending is None: + pending = self._pull = asyncio.ensure_future(self._run_pull()) + # Shielded because one reader going away must not cancel a range + # the server will not send again. + await asyncio.shield(pending) + batch, queue[:] = list(queue), [] + return batch + + async def _run_pull(self) -> None: + try: + delivered = await workflow.read_stream_messages(self._stream) + arrived = [ + (Cursor(str(message.offset)), message.body) for message in delivered + ] + for queue in self._subscribers: + queue.extend(arrived) + finally: + self._pull = None + + +def _fanouts() -> dict[str, _Fanout]: + instance = workflow.instance() + state = getattr(instance, _RUN_STATE, None) + if state is None: + state = {} + setattr(instance, _RUN_STATE, state) + return state + + +class _NativeReadSource: + def __init__(self, fanout: _Fanout) -> None: + self._fanout = fanout + self._queue = fanout.attach() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + return await self._fanout.next_batch(self._queue) + + def close(self) -> None: + self._fanout.detach(self._queue) + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Nothing is awaited. The server applies the payload when it accepts + # the task, so there is no back pressure to wait on and no round trip + # to pay for. The signature is awaitable because the contract allows a + # provider that does hold a publisher back. + workflow.add_stream_messages([frame], stream_id="", topic=self._topic) + + +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The server-side id of a workflow's inbound stream. + + A workflow names its streams relative to itself, so every provider can + address the same thing without workflow code knowing how it is stored. + Here that is a namespace-level stream id built from the pair, and the + workflow id rather than the run id because the stream has to survive + continue-as-new and reset. + """ + return f"{workflow_id}:{stream}" + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies do not pass through the codec chain on this provider, so + proceeding would store in the clear what the namespace expects encrypted, + and would do it without saying so. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it" + ) + + +# Streams this process has already opened, so a second producer for the same +# stream reuses the handle rather than asking the server to create it again. +# The second create is answered correctly, and it is still a failed call the +# server logs, which is noise an operator has to learn to ignore. +_handles: dict[str, Any] = {} + + +# One channel per target and namespace, shared by every handle in the process. +# A channel is multiplexed and long lived, and callers open a handle per +# subscription, which would otherwise be a connection per subscription. +_channels: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _channels.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _channels[key] = existing + return existing + + +class NativeProducer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + handle: Any, + converter: Any, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + self._handle = handle + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _provider_id(self) -> str: + """The identity the provider dedupes on. + + The attempt is part of it. Deduplication answers "is this the same + append again", and a second attempt writing different words at the same + sequence is not. Folding the attempt in keeps a retried append idempotent + without letting a new generation be swallowed as a duplicate of the old + one. + """ + return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = await self._handle.append( + *frames, + topic=self._topic, + producer_id=self._provider_id, + # The provider dedupes a retried append on this pair, which is a + # different job from telling readers that a new generation started. + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._handle.append( + frame, + topic=self._topic, + producer_id=self._provider_id, + sequence=self._sequence - 1, + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class NativeConsumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, handle: Any, converter: Any) -> None: + self._handle = handle + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + attempts = AttemptTracker() + async for message in self._handle.follow( + from_offset=int(start.token) if start.token else 0 + ): + cursor = Cursor(str(message.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + message.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NativeProvider: + name = "native" + + def configure(self, **options: Any) -> None: + """Nothing to name: the streams are on the server the client is + already connected to. It exists so a process that switches providers + changes one call rather than its structure.""" + if options: + raise TypeError( + f"the native provider takes no options, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Accepted and ignored. Delivery arrives on workflow tasks the server + # dispatches, so no worker is held between records and there is nothing + # for an idle timeout to release. + del idle_timeout + stream_id = inbound_stream_id(workflow.info().workflow_id, stream) + fanouts = _fanouts() + fanout = fanouts.get(stream_id) + if fanout is None: + workflow.subscribe_stream( + stream_id, start_offset=int(start.token) if start.token else 0 + ) + fanout = fanouts[stream_id] = _Fanout(stream_id) + return _NativeReadSource(fanout) + + def open_write(self, topic: str) -> WriteSink: + return _NativeWriteSink(topic) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + _reject_configured_codec(client) + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + streams = _stream_client(client) + stream_id = inbound_stream_id(workflow_id, stream) + handle = _handles.get(stream_id) + if handle is None: + try: + handle = await streams.create(stream_id) + except Exception: + # Created by whoever set the stream up. A producer opening a + # stream it does not own is the ordinary case, not the + # exception. + handle = streams.get(stream_id) + _handles[stream_id] = handle + return NativeProducer( + handle, + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> NativeConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. Naming one reads that inbound + stream instead, which is how a second consumer follows the same input. + """ + _reject_configured_codec(client) + streams = _stream_client(client) + if stream: + handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + else: + handle = streams.workflow_stream(workflow_id) + return NativeConsumer(handle, client.data_converter.payload_converter) + + +_provider.register("native", _NativeProvider) From 2174251e4f26e890c2a6d7b7a51e4a9fe23ffb59 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 093/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/native.py | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f5570b05a..c0044b9cf 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -255,18 +255,18 @@ def __init__(self, handle: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() async for message in self._handle.follow( - from_offset=int(start.token) if start.token else 0 + from_offset=int(after.token) + 1 if after.token else 0 ): cursor = Cursor(str(message.offset)) try: @@ -290,6 +290,16 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one server-side log per stream, whatever the topic + try: + state = await self._handle.describe() + except Exception: + # A stream nobody has published to does not exist yet, and that + # is the same answer as an empty one. + return BEGINNING + return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -317,7 +327,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Accepted and ignored. Delivery arrives on workflow tasks the server @@ -329,7 +339,7 @@ def open_read( fanout = fanouts.get(stream_id) if fanout is None: workflow.subscribe_stream( - stream_id, start_offset=int(start.token) if start.token else 0 + stream_id, start_offset=int(after.token) + 1 if after.token else 0 ) fanout = fanouts[stream_id] = _Fanout(stream_id) return _NativeReadSource(fanout) @@ -342,15 +352,18 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NativeProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the stream the workflow publishes, which the server lets any + producer append to. Inside an activity, leave ``producer_id`` and + ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ _reject_configured_codec(client) if not producer_id: @@ -358,6 +371,14 @@ async def producer( if not attempt: attempt = activity.info().attempt streams = _stream_client(client) + if not stream: + return NativeProducer( + streams.workflow_stream(workflow_id), + client.data_converter.payload_converter, + topic, + producer_id, + attempt, + ) stream_id = inbound_stream_id(workflow_id, stream) handle = _handles.get(stream_id) if handle is None: From 1faf5096b6a2eb5197794f2993927eed45a37d24 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:49:04 -0700 Subject: [PATCH 094/831] Read the delivered message shape the buffer now hands back. The buffer holds a body, topic and offset rather than the wire message, and the cap moved to `workflow_read_stream_messages`. --- tests/worker/test_workflow_stream.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 944761cfa..bb0dcf9ba 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -28,7 +28,7 @@ async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() buffer.extend([message(b"one"), message(b"two")]) - assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert [m.body for m in buffer.take()] == [b"one", b"two"] assert len(buffer) == 0 @@ -41,7 +41,7 @@ async def test_buffer_wakes_a_waiting_reader() -> None: buffer.extend([message(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body.data for m in buffer.take()] == [b"late"] + assert [m.body for m in buffer.take()] == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -64,16 +64,21 @@ async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body.data for m in buffer.take()] == [b"early"] + assert [m.body for m in buffer.take()] == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream``, so a test that reimplements - it proves nothing about the code that ships. + The cap lives inside ``workflow_read_stream_messages``, so a test that + reimplements it proves nothing about the code that ships. Borrowing the + method off the real class is what keeps the test on the shipped path. """ + workflow_read_stream_messages = ( + _WorkflowInstanceImpl.workflow_read_stream_messages + ) + def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} self.read_only_calls: list[str] = [] From 74d6a10e47ac3b25bea7d1513172c36feb8ecd26 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 095/831] Regenerated the protos from the pinned Core. The pinned Core carries the stream additions to the public API, so the command, enum, history and workflow service messages were stale. Only the vendored stream service protos still come from the server checkout. --- temporalio/api/command/v1/__init__.py | 4 + temporalio/api/command/v1/message_pb2.py | 117 +- temporalio/api/command/v1/message_pb2.pyi | 81 ++ temporalio/api/enums/v1/command_type_pb2.py | 6 +- temporalio/api/enums/v1/command_type_pb2.pyi | 4 + temporalio/api/enums/v1/event_type_pb2.py | 6 +- temporalio/api/enums/v1/event_type_pb2.pyi | 20 + temporalio/api/history/v1/__init__.py | 4 + temporalio/api/history/v1/message_pb2.py | 301 +++-- temporalio/api/history/v1/message_pb2.pyi | 122 ++ temporalio/api/stream/v1/__init__.py | 6 +- temporalio/api/stream/v1/message_pb2.py | 103 +- temporalio/api/stream/v1/message_pb2.pyi | 79 +- temporalio/api/streamservice/v1/__init__.py | 16 +- .../api/streamservice/v1/message_pb2.py | 47 +- .../api/streamservice/v1/message_pb2.pyi | 37 +- .../api/streamservice/v1/message_pb2_grpc.py | 20 +- .../streamservice/v1/request_response_pb2.py | 235 ++-- .../streamservice/v1/request_response_pb2.pyi | 333 ++++- .../v1/request_response_pb2_grpc.py | 20 +- .../api/streamservice/v1/service_pb2.py | 31 +- .../api/streamservice/v1/service_pb2.pyi | 8 +- .../api/streamservice/v1/service_pb2_grpc.py | 687 +++++----- .../api/streamservice/v1/stream_state_pb2.py | 62 +- .../api/streamservice/v1/stream_state_pb2.pyi | 113 +- .../streamservice/v1/stream_state_pb2_grpc.py | 20 +- .../v1/request_response_pb2.py | 1125 +++++++++-------- .../v1/request_response_pb2.pyi | 19 + temporalio/bridge/_visitor.py | 28 + .../workflow_activation_pb2.py | 626 +++++---- .../workflow_activation_pb2.pyi | 116 +- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 823 +++++++----- .../workflow_commands_pb2.pyi | 94 +- 34 files changed, 3258 insertions(+), 2059 deletions(-) diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index e0ce8f712..57ad3eb15 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -1,4 +1,5 @@ from .message_pb2 import ( + AddStreamMessagesCommandAttributes, CancelTimerCommandAttributes, CancelWorkflowExecutionCommandAttributes, Command, @@ -16,10 +17,12 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) __all__ = [ + "AddStreamMessagesCommandAttributes", "CancelTimerCommandAttributes", "CancelWorkflowExecutionCommandAttributes", "Command", @@ -37,5 +40,6 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index ad004ae03..cc7cdbb27 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -42,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\x87\x12\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"p\n"AddStreamMessagesCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"\xe0\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12m\n&add_stream_messages_command_attributes\x18\x14 \x01(\x0b\x32;.temporal.api.command.v1.AddStreamMessagesCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -105,6 +108,12 @@ _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ "RequestCancelNexusOperationCommandAttributes" ] +_ADDSTREAMMESSAGESCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "AddStreamMessagesCommandAttributes" +] +_SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeStreamCommandAttributes" +] _COMMAND = DESCRIPTOR.message_types_by_name["Command"] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", @@ -321,6 +330,28 @@ ) _sym_db.RegisterMessage(RequestCancelNexusOperationCommandAttributes) +AddStreamMessagesCommandAttributes = _reflection.GeneratedProtocolMessageType( + "AddStreamMessagesCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGESCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.AddStreamMessagesCommandAttributes) + }, +) +_sym_db.RegisterMessage(AddStreamMessagesCommandAttributes) + +SubscribeStreamCommandAttributes = _reflection.GeneratedProtocolMessageType( + "SubscribeStreamCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAMCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeStreamCommandAttributes) + }, +) +_sym_db.RegisterMessage(SubscribeStreamCommandAttributes) + Command = _reflection.GeneratedProtocolMessageType( "Command", (_message.Message,), @@ -383,44 +414,48 @@ _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_options = ( b"8\001" ) - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 424 - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1118 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1120 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1192 - _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1194 - _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1299 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1301 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1395 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1397 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1488 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1490 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1538 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1540 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1633 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1636 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1819 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1822 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2125 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2127 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2245 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2247 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2343 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2346 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2665 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2585 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2665 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2668 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3608 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3611 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4615 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4617 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4671 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4674 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5157 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5107 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5157 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5159 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5233 - _COMMAND._serialized_start = 5236 - _COMMAND._serialized_end = 7547 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 462 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1156 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1158 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1230 + _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1232 + _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1337 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1339 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1433 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1435 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1526 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1528 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1576 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1578 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1671 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1674 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1857 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1860 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2163 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2165 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2283 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2285 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2381 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2384 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2703 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2623 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2703 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2706 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3646 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3649 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4653 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4655 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4709 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4712 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5195 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5145 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5195 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 + _ADDSTREAMMESSAGESCOMMANDATTRIBUTES._serialized_start = 5273 + _ADDSTREAMMESSAGESCOMMANDATTRIBUTES._serialized_end = 5385 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 5387 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 5462 + _COMMAND._serialized_start = 5465 + _COMMAND._serialized_end = 7993 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 18d0abc8b..87063c178 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -18,6 +18,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1094,6 +1095,62 @@ global___RequestCancelNexusOperationCommandAttributes = ( RequestCancelNexusOperationCommandAttributes ) +class AddStreamMessagesCommandAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the Workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessagesCommandAttributes = AddStreamMessagesCommandAttributes + +class SubscribeStreamCommandAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes + class Command(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -1119,6 +1176,8 @@ class Command(google.protobuf.message.Message): MODIFY_WORKFLOW_PROPERTIES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1209,6 +1268,14 @@ class Command(google.protobuf.message.Message): def request_cancel_nexus_operation_command_attributes( self, ) -> global___RequestCancelNexusOperationCommandAttributes: ... + @property + def add_stream_messages_command_attributes( + self, + ) -> global___AddStreamMessagesCommandAttributes: ... + @property + def subscribe_stream_command_attributes( + self, + ) -> global___SubscribeStreamCommandAttributes: ... def __init__( self, *, @@ -1253,10 +1320,16 @@ class Command(google.protobuf.message.Message): | None = ..., request_cancel_nexus_operation_command_attributes: global___RequestCancelNexusOperationCommandAttributes | None = ..., + add_stream_messages_command_attributes: global___AddStreamMessagesCommandAttributes + | None = ..., + subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages_command_attributes", + b"add_stream_messages_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1291,6 +1364,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1300,6 +1375,8 @@ class Command(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages_command_attributes", + b"add_stream_messages_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1338,6 +1415,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1365,6 +1444,8 @@ class Command(google.protobuf.message.Message): "modify_workflow_properties_command_attributes", "schedule_nexus_operation_command_attributes", "request_cancel_nexus_operation_command_attributes", + "add_stream_messages_command_attributes", + "subscribe_stream_command_attributes", ] | None ): ... diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 6d1c3b6e5..9313ff92a 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x9c\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe5\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12$\n COMMAND_TYPE_ADD_STREAM_MESSAGES\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -39,11 +39,13 @@ COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES = 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION = 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 +COMMAND_TYPE_ADD_STREAM_MESSAGES = 19 +COMMAND_TYPE_SUBSCRIBE_STREAM = 20 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 864 + _COMMANDTYPE._serialized_end = 937 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 9f1bfd240..80ff53ee2 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -44,6 +44,8 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: _CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: _CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 + COMMAND_TYPE_ADD_STREAM_MESSAGES: _CommandType.ValueType # 19 + COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -66,4 +68,6 @@ COMMAND_TYPE_PROTOCOL_MESSAGE: CommandType.ValueType # 14 COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 +COMMAND_TYPE_ADD_STREAM_MESSAGES: CommandType.ValueType # 19 +COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 14ff7984d..a887626de 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\x9e\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -82,11 +82,13 @@ EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58 EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59 EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 +EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED = 62 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 2912 + _EVENTTYPE._serialized_end = 3002 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 16a23b137..dc585288d 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -216,6 +216,16 @@ class _EventTypeEnumTypeWrapper( """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: _EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" + EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: _EventType.ValueType # 61 + """A Workflow subscribed to a stream. Once per subscription, not per + message: consumed offsets ride WorkflowTaskCompleted and payloads never + enter History. + """ + EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED: _EventType.ValueType # 62 + """A Workflow published a batch of messages to a stream. Recorded per + batch, and carrying only the offset range it landed at: the bodies go to + the stream's own log, never into History. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -408,4 +418,14 @@ EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: EventType.ValueType # 59 """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: EventType.ValueType # 61 +"""A Workflow subscribed to a stream. Once per subscription, not per +message: consumed offsets ride WorkflowTaskCompleted and payloads never +enter History. +""" +EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED: EventType.ValueType # 62 +"""A Workflow published a batch of messages to a stream. Recorded per +batch, and carrying only the offset range it landed at: the bodies go to +the stream's own log, never into History. +""" global___EventType = EventType diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index ec7f65962..c7ebb2753 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -57,6 +57,8 @@ WorkflowExecutionUpdateRejectedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, + WorkflowStreamMessagesAddedEventAttributes, + WorkflowStreamSubscribedEventAttributes, WorkflowTaskCompletedEventAttributes, WorkflowTaskFailedEventAttributes, WorkflowTaskScheduledEventAttributes, @@ -123,6 +125,8 @@ "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", + "WorkflowStreamMessagesAddedEventAttributes", + "WorkflowStreamSubscribedEventAttributes", "WorkflowTaskCompletedEventAttributes", "WorkflowTaskFailedEventAttributes", "WorkflowTaskScheduledEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index ac337b708..e0a75ddaa 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -47,6 +47,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -58,7 +61,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\x82\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xca?\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc0\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12<\n\x0estream_cursors\x18\x14 \x03(\x0b\x32$.temporal.api.stream.v1.StreamCursor"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\x96\x01\n*WorkflowStreamMessagesAddedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x15\n\rmessage_count\x18\x04 \x01(\x03"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc3\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12~\n/workflow_stream_messages_added_event_attributes\x18\x43 \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowStreamMessagesAddedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -215,6 +218,12 @@ _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "ActivityPropertiesModifiedExternallyEventAttributes" ] +_WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamMessagesAddedEventAttributes" +] +_WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamSubscribedEventAttributes" +] _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionUpdateAcceptedEventAttributes" ] @@ -819,6 +828,28 @@ ) _sym_db.RegisterMessage(ActivityPropertiesModifiedExternallyEventAttributes) +WorkflowStreamMessagesAddedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamMessagesAddedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamMessagesAddedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamMessagesAddedEventAttributes) + +WorkflowStreamSubscribedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamSubscribedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) + WorkflowExecutionUpdateAcceptedEventAttributes = ( _reflection.GeneratedProtocolMessageType( "WorkflowExecutionUpdateAcceptedEventAttributes", @@ -1210,140 +1241,144 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 663 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3057 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3060 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3196 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3199 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3364 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3367 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3586 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3589 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3717 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3720 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4653 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4656 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4828 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4831 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5247 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5250 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5892 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5895 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6044 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6047 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6438 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6441 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7147 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7150 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7436 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7439 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7671 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7674 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 7960 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 7963 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8161 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8163 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8277 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8280 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8554 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8557 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8704 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8706 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8777 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8780 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 8914 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8917 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9116 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9119 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9254 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9257 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9618 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9538 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9618 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9621 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 9940 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 9943 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10072 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10075 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5992 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5995 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6144 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6147 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6538 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6541 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7247 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7250 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7536 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7539 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7771 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7774 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8060 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8063 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8261 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8263 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8377 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8380 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8654 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8657 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8804 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8806 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8877 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8880 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9014 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9017 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9216 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9219 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9354 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9357 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9718 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9638 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9718 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9721 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10040 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10043 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10172 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10175 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10359 + 10459 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10362 + 10462 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10708 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10711 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 10908 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10911 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11290 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11293 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11632 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11635 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11846 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11849 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12007 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12010 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12148 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12151 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13427 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13430 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13772 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13775 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14070 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14073 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14398 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14401 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14780 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14783 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15108 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15111 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15441 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15444 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15720 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15723 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16453 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16303 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16453 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16456 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16776 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16779 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16923 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 16926 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17146 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17319 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17322 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17593 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17596 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 17760 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 17762 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 17856 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 17858 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 17954 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 17957 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18154 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18157 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 18721 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 18671 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 18721 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 18724 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 18861 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 18864 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19001 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19004 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19140 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19143 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19281 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19284 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19422 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19424 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19540 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19543 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 19694 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 19697 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 19896 - _HISTORYEVENT._serialized_start = 19899 - _HISTORYEVENT._serialized_end = 28037 - _HISTORY._serialized_start = 28039 - _HISTORY._serialized_end = 28103 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10808 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10811 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11008 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11011 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11390 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11393 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11732 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11735 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11946 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11949 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12107 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12110 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12248 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12251 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13527 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13530 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13872 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13875 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14170 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14173 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14498 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14501 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14880 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14883 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15208 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15211 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15541 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15544 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15820 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15823 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16553 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16403 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16553 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16556 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16876 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16879 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17023 + _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES._serialized_start = 17026 + _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES._serialized_end = 17176 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17178 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17302 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17305 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17525 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17528 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17698 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17701 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17972 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17975 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18139 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18141 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18235 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18237 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18333 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18336 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18533 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18536 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19100 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19050 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19100 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19103 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19240 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19243 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19380 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19383 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19519 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19522 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19660 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19663 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19801 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19803 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19919 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19922 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20073 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20076 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20275 + _HISTORYEVENT._serialized_start = 20278 + _HISTORYEVENT._serialized_end = 28665 + _HISTORY._serialized_start = 28667 + _HISTORY._serialized_end = 28731 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 783e9d3b6..6c214d184 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -23,6 +23,7 @@ import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1010,6 +1011,7 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): WORKER_DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int WORKER_DEPLOYMENT_NAME_FIELD_NUMBER: builtins.int DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int + STREAM_CURSORS_FIELD_NUMBER: builtins.int scheduled_event_id: builtins.int """The id of the `WORKFLOW_TASK_SCHEDULED` event this task corresponds to""" started_event_id: builtins.int @@ -1069,6 +1071,15 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): """The Worker Deployment Version that completed this task. Must be set if `versioning_behavior` is set. This value updates workflow execution's `versioning_info.deployment_version`. """ + @property + def stream_cursors( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamCursor + ]: + """The offsets this task consumed, without the payloads. Recorded so replay + can reproduce what the task saw, including a range that was empty. + """ def __init__( self, *, @@ -1088,6 +1099,10 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): worker_deployment_name: builtins.str = ..., deployment_version: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentVersion | None = ..., + stream_cursors: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamCursor + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1123,6 +1138,8 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): b"sdk_metadata", "started_event_id", b"started_event_id", + "stream_cursors", + b"stream_cursors", "versioning_behavior", b"versioning_behavior", "worker_deployment_name", @@ -3603,6 +3620,87 @@ global___ActivityPropertiesModifiedExternallyEventAttributes = ( ActivityPropertiesModifiedExternallyEventAttributes ) +class WorkflowStreamMessagesAddedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + MESSAGE_COUNT_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command published this + batch. + """ + stream_id: builtins.str + """Stream the Workflow published to.""" + first_offset: builtins.int + """Offset the first message of the batch landed at.""" + message_count: builtins.int + """How many messages the batch held. With first_offset this names the range + without carrying any of it, which is what keeps this event a fixed size + no matter how large the batch or its payloads are. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + first_offset: builtins.int = ..., + message_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "first_offset", + b"first_offset", + "message_count", + b"message_count", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamMessagesAddedEventAttributes = ( + WorkflowStreamMessagesAddedEventAttributes +) + +class WorkflowStreamSubscribedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Resolved by the server when the subscription is registered, so replay + reads the resolved value rather than resolving it again. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamSubscribedEventAttributes = ( + WorkflowStreamSubscribedEventAttributes +) + class WorkflowExecutionUpdateAcceptedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4460,6 +4558,8 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( builtins.int ) + WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_MESSAGES_ADDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4745,6 +4845,14 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_execution_time_skipping_transitioned_event_attributes( self, ) -> global___WorkflowExecutionTimeSkippingTransitionedEventAttributes: ... + @property + def workflow_stream_subscribed_event_attributes( + self, + ) -> global___WorkflowStreamSubscribedEventAttributes: ... + @property + def workflow_stream_messages_added_event_attributes( + self, + ) -> global___WorkflowStreamMessagesAddedEventAttributes: ... def __init__( self, *, @@ -4882,6 +4990,10 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_execution_time_skipping_transitioned_event_attributes: global___WorkflowExecutionTimeSkippingTransitionedEventAttributes | None = ..., + workflow_stream_subscribed_event_attributes: global___WorkflowStreamSubscribedEventAttributes + | None = ..., + workflow_stream_messages_added_event_attributes: global___WorkflowStreamMessagesAddedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5004,6 +5116,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_messages_added_event_attributes", + b"workflow_stream_messages_added_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5151,6 +5267,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_messages_added_event_attributes", + b"workflow_stream_messages_added_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5227,6 +5347,8 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_paused_event_attributes", "workflow_execution_unpaused_event_attributes", "workflow_execution_time_skipping_transitioned_event_attributes", + "workflow_stream_subscribed_event_attributes", + "workflow_stream_messages_added_event_attributes", ] | None ): ... diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py index f76c1c334..f18ab9d7b 100644 --- a/temporalio/api/stream/v1/__init__.py +++ b/temporalio/api/stream/v1/__init__.py @@ -1,8 +1,4 @@ -from .message_pb2 import ( - StreamCursor, - StreamMessage, - StreamSlice, -) +from .message_pb2 import StreamCursor, StreamMessage, StreamSlice __all__ = [ "StreamCursor", diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py index da1e5bc91..800c48391 100644 --- a/temporalio/api/stream/v1/message_pb2.py +++ b/temporalio/api/stream/v1/message_pb2.py @@ -2,68 +2,85 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/api/stream/v1/message.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto\"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03\"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' +) - -_STREAMMESSAGE = DESCRIPTOR.message_types_by_name['StreamMessage'] -_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name['MetadataEntry'] -_STREAMSLICE = DESCRIPTOR.message_types_by_name['StreamSlice'] -_STREAMCURSOR = DESCRIPTOR.message_types_by_name['StreamCursor'] -StreamMessage = _reflection.GeneratedProtocolMessageType('StreamMessage', (_message.Message,), { - - 'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), { - 'DESCRIPTOR' : _STREAMMESSAGE_METADATAENTRY, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) - }) - , - 'DESCRIPTOR' : _STREAMMESSAGE, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) - }) +_STREAMMESSAGE = DESCRIPTOR.message_types_by_name["StreamMessage"] +_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name["MetadataEntry"] +_STREAMSLICE = DESCRIPTOR.message_types_by_name["StreamSlice"] +_STREAMCURSOR = DESCRIPTOR.message_types_by_name["StreamCursor"] +StreamMessage = _reflection.GeneratedProtocolMessageType( + "StreamMessage", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _STREAMMESSAGE_METADATAENTRY, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) + }, + ), + "DESCRIPTOR": _STREAMMESSAGE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) + }, +) _sym_db.RegisterMessage(StreamMessage) _sym_db.RegisterMessage(StreamMessage.MetadataEntry) -StreamSlice = _reflection.GeneratedProtocolMessageType('StreamSlice', (_message.Message,), { - 'DESCRIPTOR' : _STREAMSLICE, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) - }) +StreamSlice = _reflection.GeneratedProtocolMessageType( + "StreamSlice", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSLICE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }, +) _sym_db.RegisterMessage(StreamSlice) -StreamCursor = _reflection.GeneratedProtocolMessageType('StreamCursor', (_message.Message,), { - 'DESCRIPTOR' : _STREAMCURSOR, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) - }) +StreamCursor = _reflection.GeneratedProtocolMessageType( + "StreamCursor", + (_message.Message,), + { + "DESCRIPTOR": _STREAMCURSOR, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) + }, +) _sym_db.RegisterMessage(StreamCursor) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1' - _STREAMMESSAGE_METADATAENTRY._options = None - _STREAMMESSAGE_METADATAENTRY._serialized_options = b'8\001' - _STREAMMESSAGE._serialized_start=103 - _STREAMMESSAGE._serialized_end=357 - _STREAMMESSAGE_METADATAENTRY._serialized_start=277 - _STREAMMESSAGE_METADATAENTRY._serialized_end=357 - _STREAMSLICE._serialized_start=360 - _STREAMSLICE._serialized_end=547 - _STREAMCURSOR._serialized_start=549 - _STREAMCURSOR._serialized_end=622 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1" + _STREAMMESSAGE_METADATAENTRY._options = None + _STREAMMESSAGE_METADATAENTRY._serialized_options = b"8\001" + _STREAMMESSAGE._serialized_start = 103 + _STREAMMESSAGE._serialized_end = 357 + _STREAMMESSAGE_METADATAENTRY._serialized_start = 277 + _STREAMMESSAGE_METADATAENTRY._serialized_end = 357 + _STREAMSLICE._serialized_start = 360 + _STREAMSLICE._serialized_end = 547 + _STREAMCURSOR._serialized_start = 549 + _STREAMCURSOR._serialized_end = 622 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi index c1c796da8..d4f5e6f4f 100644 --- a/temporalio/api/stream/v1/message_pb2.pyi +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -2,12 +2,15 @@ @generated by mypy-protobuf. Do not edit manually! isort:skip_file """ + import builtins import collections.abc +import sys + import google.protobuf.descriptor import google.protobuf.internal.containers import google.protobuf.message -import sys + import temporalio.api.common.v1.message_pb2 if sys.version_info >= (3, 8): @@ -34,8 +37,13 @@ class StreamMessage(google.protobuf.message.Message): key: builtins.str = ..., value: temporalio.api.common.v1.message_pb2.Payload | None = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["value", b"value"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... BODY_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int @@ -44,19 +52,40 @@ class StreamMessage(google.protobuf.message.Message): @property def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... @property - def metadata(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, temporalio.api.common.v1.message_pb2.Payload]: ... + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: ... topic: builtins.str topic_sequence: builtins.int def __init__( self, *, body: temporalio.api.common.v1.message_pb2.Payload | None = ..., - metadata: collections.abc.Mapping[builtins.str, temporalio.api.common.v1.message_pb2.Payload] | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., topic: builtins.str = ..., topic_sequence: builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["body", b"body"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["body", b"body", "metadata", b"metadata", "topic", b"topic", "topic_sequence", b"topic_sequence"]) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "metadata", + b"metadata", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... global___StreamMessage = StreamMessage @@ -83,7 +112,11 @@ class StreamSlice(google.protobuf.message.Message): which is a fact replay has to reproduce rather than an absence of one. """ @property - def messages(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___StreamMessage]: ... + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... workflow_task_completed_event_id: builtins.int """The WorkflowTaskCompleted event whose stream_cursors recorded this range. Set only when the server is re-supplying a range for a task being @@ -104,7 +137,23 @@ class StreamSlice(google.protobuf.message.Message): messages: collections.abc.Iterable[global___StreamMessage] | None = ..., workflow_task_completed_event_id: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "messages", b"messages", "run_id", b"run_id", "stream_id", b"stream_id", "to_offset", b"to_offset", "workflow_task_completed_event_id", b"workflow_task_completed_event_id"]) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... global___StreamSlice = StreamSlice @@ -129,6 +178,16 @@ class StreamCursor(google.protobuf.message.Message): from_offset: builtins.int = ..., to_offset: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "stream_id", b"stream_id", "to_offset", b"to_offset"]) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... global___StreamCursor = StreamCursor diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 31f99bded..52dd65b7c 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -11,15 +11,6 @@ StreamMessageBatch, StreamMessageKind, ) - -from .stream_state_pb2 import ( - ConsumerCursor, - ProducerCursor, - StreamLifecycle, - StreamState, - WorkflowStreamCursor, -) - from .request_response_pb2 import ( AddMessagesInput, AddMessagesOutput, @@ -72,6 +63,13 @@ TruncateStreamRequest, TruncateStreamResponse, ) +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) __all__ = [ "AddMessagesInput", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index b4fe8e68a..9e30bd9a8 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -4,43 +4,54 @@ # source: temporalio/api/stream/v1/message.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/message.proto' + "", + "temporalio/api/stream/v1/message.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + ) -> None: ... + BODY_FIELD_NUMBER: _ClassVar[int] METADATA_FIELD_NUMBER: _ClassVar[int] TOPIC_FIELD_NUMBER: _ClassVar[int] @@ -38,10 +49,20 @@ class StreamMessage(_message.Message): topic_sequence: int kind: StreamMessageKind offset: int - def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., + topic: _Optional[str] = ..., + topic_sequence: _Optional[int] = ..., + kind: _Optional[_Union[StreamMessageKind, str]] = ..., + offset: _Optional[int] = ..., + ) -> None: ... class StreamMessageBatch(_message.Message): __slots__ = ("messages",) MESSAGES_FIELD_NUMBER: _ClassVar[int] messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] - def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... + def __init__( + self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ... + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index b1383816d..6b6c2372a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 60dafee45..7e8dbe3e4 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -4,135 +4,150 @@ # source: temporalio/api/stream/v1/request_response.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/request_response.proto' + "", + "temporalio/api/stream/v1/request_response.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.streamservice.v1 import ( + message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.streamservice.v1 import ( + stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + lifecycle: _Optional[_Union[_stream_state_pb2.StreamLifecycle, _Mapping]] = ..., + ) -> None: ... class CreateStreamOutput(_message.Message): __slots__ = ("run_id",) @@ -26,7 +36,17 @@ class CreateStreamOutput(_message.Message): def __init__(self, run_id: _Optional[str] = ...) -> None: ... class AddMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + __slots__ = ( + "namespace", + "stream_id", + "run_id", + "messages", + "producer_id", + "sequence", + "expected_offset", + "use_expected_offset", + "owner_epoch", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] STREAM_ID_FIELD_NUMBER: _ClassVar[int] RUN_ID_FIELD_NUMBER: _ClassVar[int] @@ -45,7 +65,20 @@ class AddMessagesInput(_message.Message): expected_offset: int use_expected_offset: bool owner_epoch: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + producer_id: _Optional[str] = ..., + sequence: _Optional[int] = ..., + expected_offset: _Optional[int] = ..., + use_expected_offset: bool = ..., + owner_epoch: _Optional[int] = ..., + ) -> None: ... class AddMessagesOutput(_message.Message): __slots__ = ("first_offset", "next_offset", "count", "deduplicated") @@ -57,7 +90,13 @@ class AddMessagesOutput(_message.Message): next_offset: int count: int deduplicated: bool - def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + def __init__( + self, + first_offset: _Optional[int] = ..., + next_offset: _Optional[int] = ..., + count: _Optional[int] = ..., + deduplicated: bool = ..., + ) -> None: ... class FinishWritingInput(_message.Message): __slots__ = ("namespace", "stream_id", "producer_id") @@ -67,7 +106,12 @@ class FinishWritingInput(_message.Message): namespace: str stream_id: str producer_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + producer_id: _Optional[str] = ..., + ) -> None: ... class FinishWritingOutput(_message.Message): __slots__ = () @@ -85,7 +129,14 @@ class SubscribeWorkflowInput(_message.Message): stream_name: str stream_id: str start_offset: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + start_offset: _Optional[int] = ..., + ) -> None: ... class SubscribeWorkflowOutput(_message.Message): __slots__ = ("start_offset",) @@ -94,7 +145,15 @@ class SubscribeWorkflowOutput(_message.Message): def __init__(self, start_offset: _Optional[int] = ...) -> None: ... class PollMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + __slots__ = ( + "namespace", + "stream_id", + "run_id", + "from_offset", + "max_messages", + "topics", + "wait_new_messages", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] STREAM_ID_FIELD_NUMBER: _ClassVar[int] RUN_ID_FIELD_NUMBER: _ClassVar[int] @@ -109,7 +168,16 @@ class PollMessagesInput(_message.Message): max_messages: int topics: _containers.RepeatedScalarFieldContainer[str] wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + from_offset: _Optional[int] = ..., + max_messages: _Optional[int] = ..., + topics: _Optional[_Iterable[str]] = ..., + wait_new_messages: bool = ..., + ) -> None: ... class PollMessagesOutput(_message.Message): __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") @@ -123,7 +191,16 @@ class PollMessagesOutput(_message.Message): head_offset: int closed: bool close_reason: _message_pb2_1.Payload - def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + def __init__( + self, + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + next_offset: _Optional[int] = ..., + head_offset: _Optional[int] = ..., + closed: bool = ..., + close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., + ) -> None: ... class DescribeStreamInput(_message.Message): __slots__ = ("namespace", "stream_id") @@ -131,10 +208,20 @@ class DescribeStreamInput(_message.Message): STREAM_ID_FIELD_NUMBER: _ClassVar[int] namespace: str stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + def __init__( + self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + ) -> None: ... class PollWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + __slots__ = ( + "namespace", + "workflow_id", + "stream_name", + "from_offset", + "max_messages", + "topics", + "wait_new_messages", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] STREAM_NAME_FIELD_NUMBER: _ClassVar[int] @@ -149,7 +236,16 @@ class PollWorkflowMessagesInput(_message.Message): max_messages: int topics: _containers.RepeatedScalarFieldContainer[str] wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + from_offset: _Optional[int] = ..., + max_messages: _Optional[int] = ..., + topics: _Optional[_Iterable[str]] = ..., + wait_new_messages: bool = ..., + ) -> None: ... class DescribeWorkflowStreamInput(_message.Message): __slots__ = ("namespace", "workflow_id", "stream_name") @@ -159,10 +255,22 @@ class DescribeWorkflowStreamInput(_message.Message): namespace: str workflow_id: str stream_name: str - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + ) -> None: ... class AddWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + __slots__ = ( + "namespace", + "workflow_id", + "stream_name", + "messages", + "producer_id", + "sequence", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] STREAM_NAME_FIELD_NUMBER: _ClassVar[int] @@ -175,13 +283,25 @@ class AddWorkflowMessagesInput(_message.Message): messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] producer_id: str sequence: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + producer_id: _Optional[str] = ..., + sequence: _Optional[int] = ..., + ) -> None: ... class DescribeStreamOutput(_message.Message): __slots__ = ("state",) STATE_FIELD_NUMBER: _ClassVar[int] state: _stream_state_pb2.StreamState - def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + def __init__( + self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ... + ) -> None: ... class CloseStreamInput(_message.Message): __slots__ = ("namespace", "stream_id", "reason") @@ -191,7 +311,12 @@ class CloseStreamInput(_message.Message): namespace: str stream_id: str reason: _message_pb2_1.Payload - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., + ) -> None: ... class CloseStreamOutput(_message.Message): __slots__ = () @@ -205,7 +330,12 @@ class TruncateStreamInput(_message.Message): namespace: str stream_id: str new_base_offset: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + new_base_offset: _Optional[int] = ..., + ) -> None: ... class TruncateStreamOutput(_message.Message): __slots__ = () @@ -217,7 +347,9 @@ class DeleteStreamInput(_message.Message): STREAM_ID_FIELD_NUMBER: _ClassVar[int] namespace: str stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + def __init__( + self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + ) -> None: ... class DeleteStreamOutput(_message.Message): __slots__ = () @@ -229,13 +361,19 @@ class CreateStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: CreateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ..., + ) -> None: ... class CreateStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: CreateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ... + ) -> None: ... class AddMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -243,13 +381,19 @@ class AddMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: AddMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ..., + ) -> None: ... class AddMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + ) -> None: ... class FinishWritingRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -257,13 +401,19 @@ class FinishWritingRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: FinishWritingInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ..., + ) -> None: ... class FinishWritingResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: FinishWritingOutput - def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ... + ) -> None: ... class SubscribeWorkflowRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -271,13 +421,20 @@ class SubscribeWorkflowRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: SubscribeWorkflowInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ..., + ) -> None: ... class SubscribeWorkflowResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: SubscribeWorkflowOutput - def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, + frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ..., + ) -> None: ... class PollMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -285,13 +442,19 @@ class PollMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: PollMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ..., + ) -> None: ... class PollMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + ) -> None: ... class DescribeStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -299,13 +462,19 @@ class DescribeStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DescribeStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ..., + ) -> None: ... class DescribeStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + ) -> None: ... class PollWorkflowMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -313,13 +482,19 @@ class PollWorkflowMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: PollWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ..., + ) -> None: ... class PollWorkflowMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + ) -> None: ... class DescribeWorkflowStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -327,13 +502,21 @@ class DescribeWorkflowStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DescribeWorkflowStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[ + _Union[DescribeWorkflowStreamInput, _Mapping] + ] = ..., + ) -> None: ... class DescribeWorkflowStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + ) -> None: ... class AddWorkflowMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -341,13 +524,19 @@ class AddWorkflowMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: AddWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ..., + ) -> None: ... class AddWorkflowMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + ) -> None: ... class CloseStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -355,13 +544,19 @@ class CloseStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: CloseStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ..., + ) -> None: ... class CloseStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: CloseStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ... + ) -> None: ... class TruncateStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -369,13 +564,19 @@ class TruncateStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: TruncateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ..., + ) -> None: ... class TruncateStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: TruncateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ... + ) -> None: ... class ListStreamsInput(_message.Message): __slots__ = ("namespace", "page_size", "next_page_token", "query") @@ -387,7 +588,13 @@ class ListStreamsInput(_message.Message): page_size: int next_page_token: bytes query: str - def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + page_size: _Optional[int] = ..., + next_page_token: _Optional[bytes] = ..., + query: _Optional[str] = ..., + ) -> None: ... class StreamListEntry(_message.Message): __slots__ = ("stream_id", "run_id") @@ -395,7 +602,9 @@ class StreamListEntry(_message.Message): RUN_ID_FIELD_NUMBER: _ClassVar[int] stream_id: str run_id: str - def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + def __init__( + self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ... + ) -> None: ... class ListStreamsOutput(_message.Message): __slots__ = ("streams", "next_page_token") @@ -403,7 +612,11 @@ class ListStreamsOutput(_message.Message): NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] next_page_token: bytes - def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + def __init__( + self, + streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., + next_page_token: _Optional[bytes] = ..., + ) -> None: ... class ListStreamsRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -411,13 +624,19 @@ class ListStreamsRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: ListStreamsInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ..., + ) -> None: ... class ListStreamsResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: ListStreamsOutput - def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ... + ) -> None: ... class DeleteStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -425,10 +644,16 @@ class DeleteStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DeleteStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ..., + ) -> None: ... class DeleteStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DeleteStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ... + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index 87cc91022..c8c70bb79 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index 7f376c28e..d5de1d5f8 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -4,35 +4,46 @@ # source: temporalio/api/stream/v1/service.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/service.proto' + "", + "temporalio/api/stream/v1/service.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 - +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/service_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) @@ -35,70 +42,83 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.CreateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True, + ) self.AddMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True, + ) self.FinishWriting = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True, + ) self.SubscribeWorkflow = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True, + ) self.PollMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True, + ) self.DescribeStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True, + ) self.PollWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True, + ) self.DescribeWorkflowStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True, + ) self.AddWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True, + ) self.CloseStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True, + ) self.TruncateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True, + ) self.ListStreams = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True, + ) self.DeleteStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True, + ) class StreamServiceServicer(object): @@ -107,178 +127,182 @@ class StreamServiceServicer(object): def CreateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def FinishWriting(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def SubscribeWorkflow(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollWorkflowMessages(self, request, context): - """Routed on the owner, because the stream it reads has no id of its own. - """ + """Routed on the owner, because the stream it reads has no id of its own.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeWorkflowStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddWorkflowMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def TruncateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def ListStreams(self, request, context): """Served on the frontend only: it queries visibility rather than a stream, so there is no business ID to route on and nothing for a shard to answer. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DeleteStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def add_StreamServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'CreateStream': grpc.unary_unary_rpc_method_handler( - servicer.CreateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, - ), - 'AddMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, - ), - 'FinishWriting': grpc.unary_unary_rpc_method_handler( - servicer.FinishWriting, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, - ), - 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( - servicer.SubscribeWorkflow, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, - ), - 'PollMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, - ), - 'DescribeStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, - ), - 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, - ), - 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeWorkflowStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, - ), - 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, - ), - 'CloseStream': grpc.unary_unary_rpc_method_handler( - servicer.CloseStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, - ), - 'TruncateStream': grpc.unary_unary_rpc_method_handler( - servicer.TruncateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, - ), - 'ListStreams': grpc.unary_unary_rpc_method_handler( - servicer.ListStreams, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, - ), - 'DeleteStream': grpc.unary_unary_rpc_method_handler( - servicer.DeleteStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, - ), + "CreateStream": grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + "AddMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + "FinishWriting": grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + "SubscribeWorkflow": grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + "PollMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + "DescribeStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + "PollWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + "DescribeWorkflowStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + "AddWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + "CloseStream": grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + "TruncateStream": grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + "ListStreams": grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + "DeleteStream": grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_registered_method_handlers( + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) - # This class is part of an EXPERIMENTAL API. +# This class is part of an EXPERIMENTAL API. class StreamService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def CreateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CreateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, options, @@ -289,23 +313,26 @@ def CreateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def AddMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, options, @@ -316,23 +343,26 @@ def AddMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def FinishWriting(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def FinishWriting( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, options, @@ -343,23 +373,26 @@ def FinishWriting(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def SubscribeWorkflow(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def SubscribeWorkflow( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, options, @@ -370,23 +403,26 @@ def SubscribeWorkflow(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def PollMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, options, @@ -397,23 +433,26 @@ def PollMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DescribeStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, options, @@ -424,23 +463,26 @@ def DescribeStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def PollWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, options, @@ -451,23 +493,26 @@ def PollWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DescribeWorkflowStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeWorkflowStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, options, @@ -478,23 +523,26 @@ def DescribeWorkflowStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def AddWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, options, @@ -505,23 +553,26 @@ def AddWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def CloseStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CloseStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, options, @@ -532,23 +583,26 @@ def CloseStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def TruncateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def TruncateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, options, @@ -559,23 +613,26 @@ def TruncateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def ListStreams(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def ListStreams( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, options, @@ -586,23 +643,26 @@ def ListStreams(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DeleteStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DeleteStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, options, @@ -613,4 +673,5 @@ def DeleteStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 234fa94d0..3fe850a2a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -4,18 +4,20 @@ # source: temporalio/api/stream/v1/stream_state.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/stream_state.proto' + "", + "temporalio/api/stream/v1/stream_state.proto", ) # @@protoc_insertion_point(imports) @@ -24,33 +26,43 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[ProducerCursor, _Mapping]] = ..., + ) -> None: ... + class ConsumersEntry(_message.Message): __slots__ = ("key", "value") KEY_FIELD_NUMBER: _ClassVar[int] VALUE_FIELD_NUMBER: _ClassVar[int] key: str value: ConsumerCursor - def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[ConsumerCursor, _Mapping]] = ..., + ) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] @@ -53,7 +80,24 @@ class StreamState(_message.Message): lifecycle: StreamLifecycle redirect_run_id: str close_time: _timestamp_pb2.Timestamp - def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + def __init__( + self, + head_offset: _Optional[int] = ..., + base_offset: _Optional[int] = ..., + last_txn_id: _Optional[int] = ..., + closed: bool = ..., + close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + owner_epoch: _Optional[int] = ..., + bucket_size: _Optional[int] = ..., + collection_id: _Optional[str] = ..., + producers: _Optional[_Mapping[str, ProducerCursor]] = ..., + consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., + lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., + redirect_run_id: _Optional[str] = ..., + close_time: _Optional[ + _Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping] + ] = ..., + ) -> None: ... class ProducerCursor(_message.Message): __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") @@ -67,7 +111,14 @@ class ProducerCursor(_message.Message): count: int content_hash: bytes fenced: bool - def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + def __init__( + self, + seq: _Optional[int] = ..., + first_offset: _Optional[int] = ..., + count: _Optional[int] = ..., + content_hash: _Optional[bytes] = ..., + fenced: bool = ..., + ) -> None: ... class ConsumerCursor(_message.Message): __slots__ = ("workflow_id", "run_id", "offset", "active", "external") @@ -81,10 +132,27 @@ class ConsumerCursor(_message.Message): offset: int active: bool external: bool - def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + def __init__( + self, + workflow_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + offset: _Optional[int] = ..., + active: bool = ..., + external: bool = ..., + ) -> None: ... class WorkflowStreamCursor(_message.Message): - __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + __slots__ = ( + "stream_id", + "collection_id", + "bucket_size", + "offset", + "known_head", + "external", + "pending_from", + "pending_to", + "has_pending", + ) STREAM_ID_FIELD_NUMBER: _ClassVar[int] COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] @@ -103,7 +171,18 @@ class WorkflowStreamCursor(_message.Message): pending_from: int pending_to: int has_pending: bool - def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + def __init__( + self, + stream_id: _Optional[str] = ..., + collection_id: _Optional[str] = ..., + bucket_size: _Optional[int] = ..., + offset: _Optional[int] = ..., + known_head: _Optional[int] = ..., + external: bool = ..., + pending_from: _Optional[int] = ..., + pending_to: _Optional[int] = ..., + has_pending: bool = ..., + ) -> None: ... class StreamLifecycle(_message.Message): __slots__ = ("retention", "max_items") @@ -111,4 +190,10 @@ class StreamLifecycle(_message.Message): MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] retention: _duration_pb2.Duration max_items: int - def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... + def __init__( + self, + retention: _Optional[ + _Union[datetime.timedelta, _duration_pb2.Duration, _Mapping] + ] = ..., + max_items: _Optional[int] = ..., + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index 4e128a2aa..c241cab40 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index e1b2e01c4..1ee64fafd 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -114,6 +114,9 @@ from temporalio.api.sdk.v1 import ( worker_config_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_worker__config__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -131,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xbf\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4214,578 +4217,578 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1646 - _REGISTERNAMESPACEREQUEST._serialized_end = 2294 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2251 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2294 - _REGISTERNAMESPACERESPONSE._serialized_start = 2296 - _REGISTERNAMESPACERESPONSE._serialized_end = 2323 - _LISTNAMESPACESREQUEST._serialized_start = 2326 - _LISTNAMESPACESREQUEST._serialized_end = 2463 - _LISTNAMESPACESRESPONSE._serialized_start = 2466 - _LISTNAMESPACESRESPONSE._serialized_end = 2595 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2597 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2680 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2683 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3196 - _UPDATENAMESPACEREQUEST._serialized_start = 3199 - _UPDATENAMESPACEREQUEST._serialized_end = 3534 - _UPDATENAMESPACERESPONSE._serialized_start = 3537 - _UPDATENAMESPACERESPONSE._serialized_end = 3828 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3830 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3900 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3902 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3930 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3933 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5550 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5553 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5851 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5854 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6152 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6155 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6341 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6344 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6520 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6522 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6642 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6645 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7085 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7088 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8175 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8091 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8175 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8178 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9350 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9445 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9447 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9519 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9764 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9767 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10292 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10294 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10329 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10332 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10818 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10821 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12002 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12005 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12170 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12172 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12284 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12287 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12494 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12496 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12612 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12615 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 12997 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 12999 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13037 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13040 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13247 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13249 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13291 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13294 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13740 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13742 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13829 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13832 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14103 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14105 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14196 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14199 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14581 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14583 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14620 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14623 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 14911 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 14913 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 14954 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 14957 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15217 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15219 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15259 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15262 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15612 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15614 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15691 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15694 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17033 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17036 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17194 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17197 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17646 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17648 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17696 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17699 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 17986 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 17988 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18024 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18026 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18148 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18150 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18183 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18186 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18515 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18518 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18648 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18651 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19180 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19182 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19291 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19293 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19419 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19421 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19538 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19541 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19675 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19677 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19786 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19788 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19914 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19916 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19982 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19985 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20222 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20224 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20252 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20255 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20456 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20372 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20456 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20459 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20820 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20822 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20857 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20859 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 20969 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 20971 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21001 - _SHUTDOWNWORKERREQUEST._serialized_start = 21004 - _SHUTDOWNWORKERREQUEST._serialized_end = 21287 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21289 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21313 - _QUERYWORKFLOWREQUEST._serialized_start = 21316 - _QUERYWORKFLOWREQUEST._serialized_end = 21549 - _QUERYWORKFLOWRESPONSE._serialized_start = 21552 - _QUERYWORKFLOWRESPONSE._serialized_end = 21737 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21739 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21854 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21857 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22522 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22525 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23053 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23056 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24060 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23842 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 23958 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 23960 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24060 - _GETCLUSTERINFOREQUEST._serialized_start = 24062 - _GETCLUSTERINFOREQUEST._serialized_end = 24085 - _GETCLUSTERINFORESPONSE._serialized_start = 24088 - _GETCLUSTERINFORESPONSE._serialized_end = 24553 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24498 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24553 - _GETSYSTEMINFOREQUEST._serialized_start = 24555 - _GETSYSTEMINFOREQUEST._serialized_end = 24577 - _GETSYSTEMINFORESPONSE._serialized_start = 24580 - _GETSYSTEMINFORESPONSE._serialized_end = 25157 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24721 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25157 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25159 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25268 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25271 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25494 - _CREATESCHEDULEREQUEST._serialized_start = 25497 - _CREATESCHEDULEREQUEST._serialized_end = 25829 - _CREATESCHEDULERESPONSE._serialized_start = 25831 - _CREATESCHEDULERESPONSE._serialized_end = 25879 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25881 - _DESCRIBESCHEDULEREQUEST._serialized_end = 25946 - _DESCRIBESCHEDULERESPONSE._serialized_start = 25949 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26220 - _UPDATESCHEDULEREQUEST._serialized_start = 26223 - _UPDATESCHEDULEREQUEST._serialized_end = 26515 - _UPDATESCHEDULERESPONSE._serialized_start = 26517 - _UPDATESCHEDULERESPONSE._serialized_end = 26541 - _PATCHSCHEDULEREQUEST._serialized_start = 26544 - _PATCHSCHEDULEREQUEST._serialized_end = 26700 - _PATCHSCHEDULERESPONSE._serialized_start = 26702 - _PATCHSCHEDULERESPONSE._serialized_end = 26725 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26728 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26896 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26898 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 26981 - _DELETESCHEDULEREQUEST._serialized_start = 26983 - _DELETESCHEDULEREQUEST._serialized_end = 27064 - _DELETESCHEDULERESPONSE._serialized_start = 27066 - _DELETESCHEDULERESPONSE._serialized_end = 27090 - _LISTSCHEDULESREQUEST._serialized_start = 27092 - _LISTSCHEDULESREQUEST._serialized_end = 27200 - _LISTSCHEDULESRESPONSE._serialized_start = 27202 - _LISTSCHEDULESRESPONSE._serialized_end = 27314 - _COUNTSCHEDULESREQUEST._serialized_start = 27316 - _COUNTSCHEDULESREQUEST._serialized_end = 27373 - _COUNTSCHEDULESRESPONSE._serialized_start = 27376 - _COUNTSCHEDULESRESPONSE._serialized_end = 27595 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27598 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28244 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28045 + _REGISTERNAMESPACEREQUEST._serialized_start = 1684 + _REGISTERNAMESPACEREQUEST._serialized_end = 2332 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 + _REGISTERNAMESPACERESPONSE._serialized_start = 2334 + _REGISTERNAMESPACERESPONSE._serialized_end = 2361 + _LISTNAMESPACESREQUEST._serialized_start = 2364 + _LISTNAMESPACESREQUEST._serialized_end = 2501 + _LISTNAMESPACESRESPONSE._serialized_start = 2504 + _LISTNAMESPACESRESPONSE._serialized_end = 2633 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 + _UPDATENAMESPACEREQUEST._serialized_start = 3237 + _UPDATENAMESPACEREQUEST._serialized_end = 3572 + _UPDATENAMESPACERESPONSE._serialized_start = 3575 + _UPDATENAMESPACERESPONSE._serialized_end = 3866 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 + _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 + _SHUTDOWNWORKERREQUEST._serialized_start = 21102 + _SHUTDOWNWORKERREQUEST._serialized_end = 21385 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 + _QUERYWORKFLOWREQUEST._serialized_start = 21414 + _QUERYWORKFLOWREQUEST._serialized_end = 21647 + _QUERYWORKFLOWRESPONSE._serialized_start = 21650 + _QUERYWORKFLOWRESPONSE._serialized_end = 21835 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 + _GETCLUSTERINFOREQUEST._serialized_start = 24160 + _GETCLUSTERINFOREQUEST._serialized_end = 24183 + _GETCLUSTERINFORESPONSE._serialized_start = 24186 + _GETCLUSTERINFORESPONSE._serialized_end = 24651 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 + _GETSYSTEMINFOREQUEST._serialized_start = 24653 + _GETSYSTEMINFOREQUEST._serialized_end = 24675 + _GETSYSTEMINFORESPONSE._serialized_start = 24678 + _GETSYSTEMINFORESPONSE._serialized_end = 25255 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 + _CREATESCHEDULEREQUEST._serialized_start = 25595 + _CREATESCHEDULEREQUEST._serialized_end = 25927 + _CREATESCHEDULERESPONSE._serialized_start = 25929 + _CREATESCHEDULERESPONSE._serialized_end = 25977 + _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 + _UPDATESCHEDULEREQUEST._serialized_start = 26321 + _UPDATESCHEDULEREQUEST._serialized_end = 26613 + _UPDATESCHEDULERESPONSE._serialized_start = 26615 + _UPDATESCHEDULERESPONSE._serialized_end = 26639 + _PATCHSCHEDULEREQUEST._serialized_start = 26642 + _PATCHSCHEDULEREQUEST._serialized_end = 26798 + _PATCHSCHEDULERESPONSE._serialized_start = 26800 + _PATCHSCHEDULERESPONSE._serialized_end = 26823 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 + _DELETESCHEDULEREQUEST._serialized_start = 27081 + _DELETESCHEDULEREQUEST._serialized_end = 27162 + _DELETESCHEDULERESPONSE._serialized_start = 27164 + _DELETESCHEDULERESPONSE._serialized_end = 27188 + _LISTSCHEDULESREQUEST._serialized_start = 27190 + _LISTSCHEDULESREQUEST._serialized_end = 27298 + _LISTSCHEDULESRESPONSE._serialized_start = 27300 + _LISTSCHEDULESRESPONSE._serialized_end = 27412 + _COUNTSCHEDULESREQUEST._serialized_start = 27414 + _COUNTSCHEDULESREQUEST._serialized_end = 27471 + _COUNTSCHEDULESRESPONSE._serialized_start = 27474 + _COUNTSCHEDULESRESPONSE._serialized_end = 27693 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28156 + 28254 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28158 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28231 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28246 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28310 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28312 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28407 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28409 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28525 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28528 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30245 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29580 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29693 + 29791 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29696 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29825 + 29923 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29827 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29891 + 29989 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29893 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 29999 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30001 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30111 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30113 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30175 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30177 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30232 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30248 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30500 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30502 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30574 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30577 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30826 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30829 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 30985 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 30987 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31101 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31104 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31365 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31368 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31627 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31630 - _STARTBATCHOPERATIONREQUEST._serialized_end = 32996 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 32998 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33027 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33029 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33125 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33127 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33155 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33157 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33223 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33226 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33698 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33700 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33791 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33793 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 33914 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 33917 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34102 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34105 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34324 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34327 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34743 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34746 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35100 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35103 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35270 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35272 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35307 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35310 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35530 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35532 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35564 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35567 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 35939 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35733 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 35939 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 35942 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36274 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36068 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36274 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36277 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36613 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36616 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 36935 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 36937 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37037 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37039 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37148 - _PAUSEACTIVITYREQUEST._serialized_start = 37151 - _PAUSEACTIVITYREQUEST._serialized_end = 37350 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37353 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37536 - _PAUSEACTIVITYRESPONSE._serialized_start = 37538 - _PAUSEACTIVITYRESPONSE._serialized_end = 37561 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37563 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37595 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37598 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37878 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37881 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38154 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38156 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38181 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38183 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38217 - _RESETACTIVITYREQUEST._serialized_start = 38220 - _RESETACTIVITYREQUEST._serialized_end = 38527 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38530 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38820 - _RESETACTIVITYRESPONSE._serialized_start = 38822 - _RESETACTIVITYRESPONSE._serialized_end = 38845 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38847 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38879 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38882 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39166 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39169 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39346 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39348 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39454 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39456 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39553 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39556 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39750 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39753 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40014 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40407 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40484 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40487 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40627 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40629 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40737 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40739 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40858 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40861 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41066 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41069 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41254 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41257 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41486 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41489 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 41932 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 41935 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42159 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42161 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42274 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42276 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42332 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42334 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42427 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42430 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43101 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42605 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43101 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43104 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43344 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43346 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43385 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43388 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43588 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43590 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43629 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43631 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43724 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43726 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43758 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43761 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44279 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44331 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44334 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44834 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44836 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44890 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44893 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45311 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45226 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 + _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 + _PAUSEACTIVITYREQUEST._serialized_start = 37249 + _PAUSEACTIVITYREQUEST._serialized_end = 37448 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 + _PAUSEACTIVITYRESPONSE._serialized_start = 37636 + _PAUSEACTIVITYRESPONSE._serialized_end = 37659 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 + _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 + _RESETACTIVITYREQUEST._serialized_start = 38318 + _RESETACTIVITYREQUEST._serialized_end = 38625 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 + _RESETACTIVITYRESPONSE._serialized_start = 38920 + _RESETACTIVITYRESPONSE._serialized_end = 38943 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 + _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 + _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45311 + 45409 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45313 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45423 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45426 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45615 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45617 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45716 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45718 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45787 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45789 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45896 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45898 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46011 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46014 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46241 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46244 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46424 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46426 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46521 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46523 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46588 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46590 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46671 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46673 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46736 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46738 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46766 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46768 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46838 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46840 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 46944 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 46947 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47153 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47155 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47201 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47204 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47359 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47361 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47392 - _LISTWORKERSREQUEST._serialized_start = 47395 - _LISTWORKERSREQUEST._serialized_end = 47525 - _LISTWORKERSRESPONSE._serialized_start = 47528 - _LISTWORKERSRESPONSE._serialized_end = 47693 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47696 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48421 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48263 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48354 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 + _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 + _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 + _LISTWORKERSREQUEST._serialized_start = 47493 + _LISTWORKERSREQUEST._serialized_end = 47623 + _LISTWORKERSRESPONSE._serialized_start = 47626 + _LISTWORKERSRESPONSE._serialized_end = 47791 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48356 + 48454 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48421 + 48519 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48423 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48514 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48517 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48675 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48677 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48762 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48765 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49031 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49033 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49133 - _DESCRIBEWORKERREQUEST._serialized_start = 49135 - _DESCRIBEWORKERREQUEST._serialized_end = 49206 - _DESCRIBEWORKERRESPONSE._serialized_start = 49208 - _DESCRIBEWORKERRESPONSE._serialized_end = 49289 - _COUNTWORKERSREQUEST._serialized_start = 49291 - _COUNTWORKERSREQUEST._serialized_end = 49378 - _COUNTWORKERSRESPONSE._serialized_start = 49380 - _COUNTWORKERSRESPONSE._serialized_end = 49417 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49420 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49561 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49563 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49595 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49598 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49741 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49743 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49777 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49780 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 50957 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 50959 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51068 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51071 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51299 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51302 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51618 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51620 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51706 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51708 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51824 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51826 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 51935 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 51938 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52068 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52071 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52870 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 52922 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 52993 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52996 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53166 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53169 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53480 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53483 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53644 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53647 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53908 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 53910 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54025 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54028 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54167 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54169 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54235 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54238 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54475 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54477 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54552 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54801 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54804 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 54953 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 54955 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 54995 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 54998 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55143 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55145 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55181 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55183 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55271 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55273 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55306 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55309 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55465 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55467 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55513 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55516 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55668 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55670 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55712 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55714 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55809 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55811 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55850 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55853 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56010 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56013 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56245 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 + _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 + _DESCRIBEWORKERREQUEST._serialized_start = 49233 + _DESCRIBEWORKERREQUEST._serialized_end = 49304 + _DESCRIBEWORKERRESPONSE._serialized_start = 49306 + _DESCRIBEWORKERRESPONSE._serialized_end = 49387 + _COUNTWORKERSREQUEST._serialized_start = 49389 + _COUNTWORKERSREQUEST._serialized_end = 49476 + _COUNTWORKERSRESPONSE._serialized_start = 49478 + _COUNTWORKERSRESPONSE._serialized_end = 49515 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index eb9243716..7d7c4897f 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -46,6 +46,7 @@ import temporalio.api.schedule.v1.message_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.sdk.v1.worker_config_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.version.v1.message_pb2 @@ -1276,6 +1277,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): MESSAGES_FIELD_NUMBER: builtins.int POLLER_SCALING_DECISION_FIELD_NUMBER: builtins.int POLLER_GROUP_ID_FIELD_NUMBER: builtins.int + STREAM_SLICES_FIELD_NUMBER: builtins.int POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int task_token: builtins.bytes @@ -1366,6 +1368,17 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): Corresponding RespondQueryTaskCompleted should pass this value for proper routing. """ @property + def stream_slices( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ]: + """Slices of the streams this Workflow consumes. A slice with no + workflow_task_completed_event_id is for the task about to run; one with + it set is re-supplying a range an earlier task consumed, so a worker + replaying from History gets the same bytes that task was given. + """ + @property def poller_group_infos( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ @@ -1421,6 +1434,10 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): poller_scaling_decision: temporalio.api.taskqueue.v1.message_pb2.PollerScalingDecision | None = ..., poller_group_id: builtins.str = ..., + stream_slices: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ] + | None = ..., poller_group_infos: collections.abc.Iterable[ temporalio.api.taskqueue.v1.message_pb2.PollerGroupInfo ] @@ -1484,6 +1501,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"started_event_id", "started_time", b"started_time", + "stream_slices", + b"stream_slices", "task_token", b"task_token", "workflow_execution", diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..77d1b6c7a 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamMessage( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +367,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_messages"): + await self._visit_coresdk_workflow_activation_DeliverStreamMessages( + fs, o.deliver_stream_messages + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any @@ -492,6 +510,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AddStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -551,6 +575,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("add_stream_messages"): + await self._visit_coresdk_workflow_commands_AddStreamMessages( + fs, o.add_stream_messages + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0e1b3a1e6..cd09b8b97 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,311 +2,447 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') - - +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] -_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] -_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] -WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }) +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.update.v1 import ( + message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.activity_result import ( + activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' +) + + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ + "HeadersEntry" +] +_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStart" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartSuccess" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartFailure" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartCancelled" +] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecution" +] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveSignalExternalWorkflow" +] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveRequestCancelExternalWorkflow" +] +_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveNexusOperationStart" +] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] +WorkflowActivation = _reflection.GeneratedProtocolMessageType( + "WorkflowActivation", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }, +) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( + "WorkflowActivationJob", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }, +) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) - }) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( + "DeliverStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }, +) _sym_db.RegisterMessage(DeliverStreamMessages) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _INITIALIZEWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }) +InitializeWorkflow = _reflection.GeneratedProtocolMessageType( + "InitializeWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _INITIALIZEWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }, +) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { - 'DESCRIPTOR' : _FIRETIMER, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }) +FireTimer = _reflection.GeneratedProtocolMessageType( + "FireTimer", + (_message.Message,), + { + "DESCRIPTOR": _FIRETIMER, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }, +) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }) +ResolveActivity = _reflection.GeneratedProtocolMessageType( + "ResolveActivity", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEACTIVITY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }, +) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartSuccess", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartFailure", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartCancelled", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERANDOMSEED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( + "UpdateRandomSeed", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERANDOMSEED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }, +) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _QUERYWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }) +QueryWorkflow = _reflection.GeneratedProtocolMessageType( + "QueryWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _QUERYWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }, +) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }) +CancelWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }, +) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }) +SignalWorkflow = _reflection.GeneratedProtocolMessageType( + "SignalWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }, +) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { - 'DESCRIPTOR' : _NOTIFYHASPATCH, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType( + "NotifyHasPatch", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYHASPATCH, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }, +) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveSignalExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveRequestCancelExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }) - , - 'DESCRIPTOR' : _DOUPDATE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }) +DoUpdate = _reflection.GeneratedProtocolMessageType( + "DoUpdate", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }, + ), + "DESCRIPTOR": _DOUPDATE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }, +) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperationStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }, +) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }, +) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEFROMCACHE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }) +RemoveFromCache = _reflection.GeneratedProtocolMessageType( + "RemoveFromCache", + (_message.Message,), + { + "DESCRIPTOR": _REMOVEFROMCACHE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }, +) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' - _WORKFLOWACTIVATION._serialized_start=570 - _WORKFLOWACTIVATION._serialized_end=1116 - _WORKFLOWACTIVATIONJOB._serialized_start=1119 - _WORKFLOWACTIVATIONJOB._serialized_end=2582 - _DELIVERSTREAMMESSAGES._serialized_start=2585 - _DELIVERSTREAMMESSAGES._serialized_end=2724 - _INITIALIZEWORKFLOW._serialized_start=2727 - _INITIALIZEWORKFLOW._serialized_end=4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 - _FIRETIMER._serialized_start=4133 - _FIRETIMER._serialized_end=4157 - _RESOLVEACTIVITY._serialized_start=4159 - _RESOLVEACTIVITY._serialized_end=4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 - _UPDATERANDOMSEED._serialized_start=5045 - _UPDATERANDOMSEED._serialized_end=5088 - _QUERYWORKFLOW._serialized_start=5091 - _QUERYWORKFLOW._serialized_end=5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 - _CANCELWORKFLOW._serialized_start=5353 - _CANCELWORKFLOW._serialized_end=5385 - _SIGNALWORKFLOW._serialized_start=5388 - _SIGNALWORKFLOW._serialized_end=5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 - _NOTIFYHASPATCH._serialized_start=5679 - _NOTIFYHASPATCH._serialized_end=5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 - _DOUPDATE._serialized_start=5917 - _DOUPDATE._serialized_end=6248 - _DOUPDATE_HEADERSENTRY._serialized_start=4052 - _DOUPDATE_HEADERSENTRY._serialized_end=4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 - _RESOLVENEXUSOPERATION._serialized_start=6407 - _RESOLVENEXUSOPERATION._serialized_end=6496 - _REMOVEFROMCACHE._serialized_start=6499 - _REMOVEFROMCACHE._serialized_end=6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" + ) + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" + _WORKFLOWACTIVATION._serialized_start = 570 + _WORKFLOWACTIVATION._serialized_end = 1116 + _WORKFLOWACTIVATIONJOB._serialized_start = 1119 + _WORKFLOWACTIVATIONJOB._serialized_end = 2582 + _DELIVERSTREAMMESSAGES._serialized_start = 2585 + _DELIVERSTREAMMESSAGES._serialized_end = 2724 + _INITIALIZEWORKFLOW._serialized_start = 2727 + _INITIALIZEWORKFLOW._serialized_end = 4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _FIRETIMER._serialized_start = 4133 + _FIRETIMER._serialized_end = 4157 + _RESOLVEACTIVITY._serialized_start = 4159 + _RESOLVEACTIVITY._serialized_end = 4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 + _UPDATERANDOMSEED._serialized_start = 5045 + _UPDATERANDOMSEED._serialized_end = 5088 + _QUERYWORKFLOW._serialized_start = 5091 + _QUERYWORKFLOW._serialized_end = 5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _CANCELWORKFLOW._serialized_start = 5353 + _CANCELWORKFLOW._serialized_end = 5385 + _SIGNALWORKFLOW._serialized_start = 5388 + _SIGNALWORKFLOW._serialized_end = 5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _NOTIFYHASPATCH._serialized_start = 5679 + _NOTIFYHASPATCH._serialized_end = 5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 + _DOUPDATE._serialized_start = 5917 + _DOUPDATE._serialized_end = 6248 + _DOUPDATE_HEADERSENTRY._serialized_start = 4052 + _DOUPDATE_HEADERSENTRY._serialized_end = 4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 + _RESOLVENEXUSOPERATION._serialized_start = 6407 + _RESOLVENEXUSOPERATION._serialized_end = 6496 + _REMOVEFROMCACHE._serialized_start = 6499 + _REMOVEFROMCACHE._serialized_end = 6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index eab815fc9..5245cd6fc 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,9 +19,9 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -439,6 +439,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" @@ -1451,63 +1508,6 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation -class DeliverStreamMessages(google.protobuf.message.Message): - """Hand a workflow the next range of a stream it subscribed to. - - The range is delivered once, on the task the server decided it belongs to, - and the offsets it covered are recorded in History rather than the payloads. - On replay the server re-supplies the same range by reading the stream again, - so this job appears at the same point with the same contents both times. - - An empty range is still delivered: a task where the subscription saw nothing - is a fact replay has to reproduce, not an absence of one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - FROM_OFFSET_FIELD_NUMBER: builtins.int - TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Id of the stream this range came from.""" - from_offset: builtins.int - """Inclusive.""" - to_offset: builtins.int - """Exclusive. Equal to from_offset when the subscription saw nothing.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - from_offset: builtins.int = ..., - to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "from_offset", - b"from_offset", - "messages", - b"messages", - "stream_id", - b"stream_id", - "to_offset", - b"to_offset", - ], - ) -> None: ... - -global___DeliverStreamMessages = DeliverStreamMessages - class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..44826f2da 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AddStreamMessages, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -21,6 +22,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -28,6 +30,7 @@ __all__ = [ "ActivityCancellationType", + "AddStreamMessages", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -49,6 +52,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index ccfa1a016..3374f951a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,408 +2,583 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.sdk.v1 import ( + event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, +) +from temporalio.api.sdk.v1 import ( + user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' +) + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] -_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] -_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] -_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] -WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWCOMMAND, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] +_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] +_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ + "HeadersEntry" +] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ + "RequestCancelLocalActivity" +] +_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CompleteWorkflowExecution" +] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ContinueAsNewWorkflowExecution" +] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "StartChildWorkflowExecution" +] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CancelChildWorkflowExecution" +] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "RequestCancelExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "SignalExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( + _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UpsertWorkflowSearchAttributes" +] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ + "NexusHeaderEntry" +] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ + "RequestCancelNexusOperation" +] +WorkflowCommand = _reflection.GeneratedProtocolMessageType( + "WorkflowCommand", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWCOMMAND, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }, +) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _ADDSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) - }) +AddStreamMessages = _reflection.GeneratedProtocolMessageType( + "AddStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }, +) _sym_db.RegisterMessage(AddStreamMessages) -SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { - 'DESCRIPTOR' : _SUBSCRIBESTREAM, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) - }) +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) _sym_db.RegisterMessage(SubscribeStream) -StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { - 'DESCRIPTOR' : _STARTTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }) +StartTimer = _reflection.GeneratedProtocolMessageType( + "StartTimer", + (_message.Message,), + { + "DESCRIPTOR": _STARTTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }, +) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { - 'DESCRIPTOR' : _CANCELTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }) +CancelTimer = _reflection.GeneratedProtocolMessageType( + "CancelTimer", + (_message.Message,), + { + "DESCRIPTOR": _CANCELTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }, +) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }) +ScheduleActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULEACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }, +) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleLocalActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULELOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }, +) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }, +) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelLocalActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }, +) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }) +QueryResult = _reflection.GeneratedProtocolMessageType( + "QueryResult", + (_message.Message,), + { + "DESCRIPTOR": _QUERYRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }, +) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { - 'DESCRIPTOR' : _QUERYSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }) +QuerySuccess = _reflection.GeneratedProtocolMessageType( + "QuerySuccess", + (_message.Message,), + { + "DESCRIPTOR": _QUERYSUCCESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }, +) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CompleteWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }, +) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "FailWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _FAILWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }, +) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }) - , - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ContinueAsNewWorkflowExecution", + (_message.Message,), + { + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }, + ), + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }, +) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { - 'DESCRIPTOR' : _SETPATCHMARKER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }) +SetPatchMarker = _reflection.GeneratedProtocolMessageType( + "SetPatchMarker", + (_message.Message,), + { + "DESCRIPTOR": _SETPATCHMARKER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }, +) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }) - , - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }) - , - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "StartChildWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }, + ), + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }, + ), + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "RequestCancelExternalWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "SignalExternalWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelSignalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELSIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }, +) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { - 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( + "UpsertWorkflowSearchAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }, +) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { - 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( + "ModifyWorkflowProperties", + (_message.Message,), + { + "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }, +) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERESPONSE, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }) +UpdateResponse = _reflection.GeneratedProtocolMessageType( + "UpdateResponse", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERESPONSE, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }, +) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { - - 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( + "ScheduleNexusOperation", + (_message.Message,), + { + "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( + "NexusHeaderEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }, + ), + "DESCRIPTOR": _SCHEDULENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }, +) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( + "RequestCancelNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }, +) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' - _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 - _WORKFLOWCOMMAND._serialized_start=556 - _WORKFLOWCOMMAND._serialized_end=2794 - _ADDSTREAMMESSAGES._serialized_start=2796 - _ADDSTREAMMESSAGES._serialized_end=2891 - _SUBSCRIBESTREAM._serialized_start=2893 - _SUBSCRIBESTREAM._serialized_end=2951 - _STARTTIMER._serialized_start=2953 - _STARTTIMER._serialized_end=3036 - _CANCELTIMER._serialized_start=3038 - _CANCELTIMER._serialized_end=3064 - _SCHEDULEACTIVITY._serialized_start=3067 - _SCHEDULEACTIVITY._serialized_end=3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 - _SCHEDULELOCALACTIVITY._serialized_start=3894 - _SCHEDULELOCALACTIVITY._serialized_end=4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 - _REQUESTCANCELACTIVITY._serialized_start=4646 - _REQUESTCANCELACTIVITY._serialized_end=4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 - _QUERYRESULT._serialized_start=4728 - _QUERYRESULT._serialized_end=4884 - _QUERYSUCCESS._serialized_start=4886 - _QUERYSUCCESS._serialized_end=4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 - _FAILWORKFLOWEXECUTION._serialized_start=5031 - _FAILWORKFLOWEXECUTION._serialized_end=5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELWORKFLOWEXECUTION._serialized_start=6024 - _CANCELWORKFLOWEXECUTION._serialized_end=6100 - _SETPATCHMARKER._serialized_start=6102 - _SETPATCHMARKER._serialized_end=6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELSIGNALWORKFLOW._serialized_start=7958 - _CANCELSIGNALWORKFLOW._serialized_end=7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 - _UPDATERESPONSE._serialized_start=8180 - _UPDATERESPONSE._serialized_end=8390 - _SCHEDULENEXUSOPERATION._serialized_start=8393 - _SCHEDULENEXUSOPERATION._serialized_end=8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" + ) + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2794 + _ADDSTREAMMESSAGES._serialized_start = 2796 + _ADDSTREAMMESSAGES._serialized_end = 2891 + _SUBSCRIBESTREAM._serialized_start = 2893 + _SUBSCRIBESTREAM._serialized_end = 2951 + _STARTTIMER._serialized_start = 2953 + _STARTTIMER._serialized_end = 3036 + _CANCELTIMER._serialized_start = 3038 + _CANCELTIMER._serialized_end = 3064 + _SCHEDULEACTIVITY._serialized_start = 3067 + _SCHEDULEACTIVITY._serialized_end = 3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 + _SCHEDULELOCALACTIVITY._serialized_start = 3894 + _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 + _REQUESTCANCELACTIVITY._serialized_start = 4646 + _REQUESTCANCELACTIVITY._serialized_end = 4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 + _QUERYRESULT._serialized_start = 4728 + _QUERYRESULT._serialized_end = 4884 + _QUERYSUCCESS._serialized_start = 4886 + _QUERYSUCCESS._serialized_end = 4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 + _FAILWORKFLOWEXECUTION._serialized_start = 5031 + _FAILWORKFLOWEXECUTION._serialized_end = 5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELWORKFLOWEXECUTION._serialized_start = 6024 + _CANCELWORKFLOWEXECUTION._serialized_end = 6100 + _SETPATCHMARKER._serialized_start = 6102 + _SETPATCHMARKER._serialized_end = 6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELSIGNALWORKFLOW._serialized_start = 7958 + _CANCELSIGNALWORKFLOW._serialized_end = 7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 + _UPDATERESPONSE._serialized_start = 8180 + _UPDATERESPONSE._serialized_end = 8390 + _SCHEDULENEXUSOPERATION._serialized_start = 8393 + _SCHEDULENEXUSOPERATION._serialized_end = 8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index f5a5fdb97..b3977164a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,9 +23,9 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -228,6 +228,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -252,10 +254,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -272,6 +270,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -285,6 +285,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -311,10 +313,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -331,6 +329,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -375,38 +375,14 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class StartTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... - def __init__( - self, - *, - seq: builtins.int = ..., - start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> None: ... - -global___StartTimer = StartTimer - class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -444,14 +420,6 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int @@ -476,6 +444,36 @@ class SubscribeStream(google.protobuf.message.Message): global___SubscribeStream = SubscribeStream +class StartTimer(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int + seq: builtins.int + """Lang's incremental sequence number, used as the operation identifier""" + @property + def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + seq: builtins.int = ..., + start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> None: ... + +global___StartTimer = StartTimer + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor From 4d58ea58c7cfa05f4c88047d7c89c53d68db519c Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 096/831] Sorted and formatted the server-side stream modules. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and `check-protos` reformats what it regenerates. --- scripts/gen_stream_protos.py | 29 +++++++++++++++---- temporalio/client_stream.py | 14 +++++---- temporalio/contrib/server_streams/__init__.py | 12 ++++---- temporalio/streams/providers/native.py | 14 +++++++-- temporalio/workflow/__init__.py | 10 +++---- tests/contrib/test_server_streams.py | 16 ++++++---- tests/worker/test_workflow_stream.py | 4 +-- tests/worker/test_workflow_stream_e2e.py | 6 ++-- 8 files changed, 70 insertions(+), 35 deletions(-) diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index e66f8abb4..f57ff6177 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -34,7 +34,13 @@ # the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` # checkout instead when the submodule is not initialized. UPSTREAM_API = ( - BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + BASE + / "temporalio" + / "bridge" + / "sdk-core" + / "crates" + / "protos" + / "protos" / "api_upstream" ) @@ -43,16 +49,24 @@ def api_proto_path() -> Path: override = os.environ.get("TEMPORAL_API_PROTOS") if override: return Path(override).resolve() - if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + if ( + UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto" + ).is_file(): return UPSTREAM_API raise SystemExit( "no api protos found: initialize the sdk-core submodule or set " "TEMPORAL_API_PROTOS to a temporalio/api checkout" ) + SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") -FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] +FILES = [ + "message.proto", + "stream_state.proto", + "request_response.proto", + "service.proto", +] # Server-only options. They carry shard routing and rate-limit category, which # a client neither reads nor can resolve, since the files defining them are not @@ -63,7 +77,10 @@ def api_proto_path() -> Path: # protoc names a python module after the proto path. These put the generated # modules where this package publishes them. FIX_PY = [ - (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + ( + re.compile(r"from temporalio\.api\.stream\.v1 import"), + "from temporalio.api.streamservice.v1 import", + ), (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), (re.compile(r"from temporal\.api\."), "from temporalio.api."), (re.compile(r"import temporal\.api\."), "import temporalio.api."), @@ -96,7 +113,9 @@ def main() -> None: out.mkdir() subprocess.run( [ - sys.executable, "-m", "grpc_tools.protoc", + sys.executable, + "-m", + "grpc_tools.protoc", f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 75388c9c9..1b5d953bd 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -242,9 +242,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, @@ -401,9 +402,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index e831d763c..b6db1fd7a 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -169,9 +169,7 @@ def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... @overload def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... - def topic( - self, name: str, *, type: type = object - ) -> WorkflowTopicHandle[Any]: + def topic(self, name: str, *, type: type = object) -> WorkflowTopicHandle[Any]: """Bind a topic on this Workflow's stream.""" return WorkflowTopicHandle(name, type) @@ -179,7 +177,9 @@ def topic( class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" - def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + def __init__( + self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client self._name = topic @@ -316,7 +316,9 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown - async for message in self._handle.follow(from_offset=from_offset, topics=topics): + async for message in self._handle.follow( + from_offset=from_offset, topics=topics + ): yield WorkflowStreamItem( topic=message.topic, data=_decode(self._converter, message.data, result_type), diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index c0044b9cf..1243d3784 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -193,7 +193,11 @@ def _provider_id(self) -> str: without letting a new generation be swallowed as a duplicate of the old one. """ - return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) async def append(self, *values: Any) -> Cursor: """Append values and return where the first one landed.""" @@ -240,7 +244,9 @@ async def finish(self) -> None: def _encode(self, value: Any) -> bytes: payload = ( - value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] ) return payload.SerializeToString() @@ -298,7 +304,9 @@ async def latest(self, *, topic: str | None = None) -> Cursor: # A stream nobody has published to does not exist yet, and that # is the same answer as an empty one. return BEGINNING - return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + return ( + Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + ) def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 9189b0db6..17b81aeb3 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,6 +58,7 @@ wait, ) from ._context import ( + DeliveredStreamMessage, Info, ParentInfo, RootInfo, @@ -65,6 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, + add_stream_messages, cancellation_reason, current_update_info, deprecate_patch, @@ -86,20 +88,18 @@ payload_converter, random, random_seed, + read_stream, + read_stream_messages, register_random_seed_callback, set_current_details, sleep, + subscribe_stream, time, time_ns, upsert_memo, upsert_search_attributes, uuid4, uuid7, - DeliveredStreamMessage, - read_stream, - read_stream_messages, - add_stream_messages, - subscribe_stream, wait_condition, ) from ._definition import ( diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 33d86d827..e1fe84c77 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -103,7 +103,9 @@ async def read() -> None: # The Workflow's own publishes bracket the Activity's, and both are on one # log in the order the server took them. - assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + [ + "workflow" + ] assert seen[0].text == "turn started" assert seen[-1].text == "turn ended" assert offsets == list(range(tokens + 2)) @@ -115,7 +117,9 @@ async def read() -> None: assert await late.get_offset() == tokens + 2 replayed = [ item.data.text - async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in late.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert replayed == [e.text for e in seen] @@ -132,14 +136,14 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: activities=[emit_from_activity], max_cached_workflows=0, ): - await client.execute_workflow( - Emitting.run, 3, id=wf_id, task_queue=task_queue - ) + await client.execute_workflow(Emitting.run, 3, id=wf_id, task_queue=task_queue) stream = WorkflowStreamClient.create(client, wf_id) first = [ item - async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert len(first) == 5 diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index bb0dcf9ba..40d6fdf45 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -75,9 +75,7 @@ class _ReadOnlyStub: method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = ( - _WorkflowInstanceImpl.workflow_read_stream_messages - ) + workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 579327217..00d0dfa85 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,9 +17,9 @@ import uuid import pytest -from temporalio.api.enums.v1 import EventType from temporalio import workflow +from temporalio.api.enums.v1 import EventType from temporalio.client import Client from temporalio.worker import Worker @@ -239,6 +239,8 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: async for event in client.get_workflow_handle(wf_id).fetch_history_events(): if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: completed += 1 - assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + assert completed >= 3, ( + f"only {completed} workflow tasks, sticky path not exercised" + ) finally: await streams.close() From e2ca8567b5214c7e6b92f8750ef71be7e1fde0c0 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:30 -0700 Subject: [PATCH 097/831] Made the server-side stream modules pass the type and doc linters. A Standalone Activity has no `workflow_id`, so opening its Workflow's stream now says that rather than sending `None` on the wire. `Optional` and `typing.Sequence` are deprecated spellings the linter rejects. --- temporalio/client_stream.py | 7 +++-- temporalio/contrib/server_streams/__init__.py | 29 +++++++++++-------- temporalio/streams/providers/native.py | 12 ++++++-- tests/test_client_stream.py | 2 +- tests/worker/test_workflow_stream.py | 13 +++++++-- tests/worker/test_workflow_stream_e2e.py | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1b5d953bd..8280b56d4 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,8 +23,9 @@ from __future__ import annotations +from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass -from typing import Any, AsyncIterator, Optional, Sequence +from typing import Any import google.protobuf.duration_pb2 @@ -102,8 +103,8 @@ async def create( self, stream_id: str, *, - retention: Optional[float] = None, - max_items: Optional[int] = None, + retention: float | None = None, + max_items: int | None = None, ) -> "StreamHandle": """Create a stream and return a handle to it. diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index b6db1fd7a..c15184bf4 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -20,16 +20,17 @@ from __future__ import annotations import asyncio +import builtins from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from datetime import timedelta -from typing import Any, Generic, Optional, TypeVar, overload +from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient, WorkflowStreamHandle -from temporalio.converter import DataConverter, PayloadConverter +from temporalio.converter import PayloadConverter __all__ = [ "RawPage", @@ -109,7 +110,7 @@ def _reject_configured_codec(client: Client) -> None: ) -def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: +def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) if as_type is None: @@ -210,8 +211,9 @@ def subscribe( self, *, from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + # Spelled out because `type` in this class body is the property below. + result_type: builtins.type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[T]]: """Read this topic from ``from_offset`` onwards.""" return self._client.subscribe( @@ -236,7 +238,7 @@ def __init__( self._converter = converter self._batch_interval = batch_interval self._buffered: list[tuple[str, Any]] = [] - self._flusher: Optional[asyncio.Task[None]] = None + self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() @classmethod @@ -260,10 +262,13 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - client = activity.client() - return cls.create( - client, activity.info().workflow_id, batch_interval=batch_interval - ) + workflow_id = activity.info().workflow_id + if workflow_id is None: + raise RuntimeError( + "no Workflow stream to open: this Activity was not started by a " + "Workflow" + ) + return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -307,8 +312,8 @@ async def subscribe( *, topics: Sequence[str] = (), from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + result_type: type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[Any]]: """Yield items from ``from_offset`` as they arrive. diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 1243d3784..53d231174 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -171,6 +171,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle self._converter = converter self._topic = topic @@ -255,6 +256,7 @@ class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, handle: Any, converter: Any) -> None: + """Read the stream ``handle`` names, from anywhere.""" self._handle = handle self._converter = converter @@ -297,6 +299,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() @@ -320,9 +323,12 @@ class _NativeProvider: name = "native" def configure(self, **options: Any) -> None: - """Nothing to name: the streams are on the server the client is - already connected to. It exists so a process that switches providers - changes one call rather than its structure.""" + """Take no options. + + The streams are on the server the client is already connected to. + This exists so a process that switches providers changes one call + rather than its structure. + """ if options: raise TypeError( f"the native provider takes no options, got {sorted(options)}" diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index f7df3c7a7..8d1a42f30 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -14,7 +14,7 @@ import asyncio import os import uuid -from typing import AsyncIterator +from collections.abc import AsyncIterator import pytest diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 40d6fdf45..1d154b37c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -9,6 +9,7 @@ from __future__ import annotations import asyncio +from typing import Any import pytest @@ -84,6 +85,12 @@ def __init__(self) -> None: def _assert_not_read_only(self, action: str) -> None: self.read_only_calls.append(action) + async def read(self, stream: str, max_messages: int) -> list[bytes]: + instance: Any = self + return await _WorkflowInstanceImpl.workflow_read_stream( + instance, stream, max_messages + ) + @pytest.mark.parametrize("max_messages", [1, 2, 5]) async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: @@ -92,14 +99,14 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b) for b in bodies]) - got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + got = await stub.read("s", max_messages) assert got == bodies[:max_messages] # Whatever the cap left behind has to still be there: nothing resends it. assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) if len(stub._stream_buffers["s"]): - rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + rest = await stub.read("s", 0) assert got + rest == bodies else: assert got == bodies @@ -112,5 +119,5 @@ async def test_read_is_refused_in_a_read_only_context() -> None: stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + await stub.read("s", 0) assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 00d0dfa85..3ee38fef3 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -104,7 +104,7 @@ def __init__(self) -> None: async def run(self) -> int: published = 0 while True: - await workflow.wait_condition(lambda: self._pending or self._done) + await workflow.wait_condition(lambda: bool(self._pending) or self._done) while self._pending: workflow.add_stream_messages([self._pending.pop(0).encode()]) published += 1 From 41bb888bfe2d395aa37bc17b1380ed96e72ee4e4 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:38 -0700 Subject: [PATCH 098/831] Added the changelog entry for server-side streams. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e32ed2f24..8c6820082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,13 @@ to include examples, links to docs, or any other relevant information. can read, decide on, and write, with a registry that picks the provider when the worker is built. `temporalio.streams.providers.memory` is the in-memory reference provider the conformance tests run against. +- **Experimental**: server-side streams. A workflow reads a stream the server + delivers on its Workflow Tasks and publishes with a command, through + `temporalio.workflow.read_stream`, `subscribe_stream` and + `add_stream_messages`. `temporalio.client_stream` and + `temporalio.contrib.server_streams` reach the same stream from outside a + workflow, and `temporalio.streams.providers.native` puts it behind the shared + stream interface. Requires a server that serves the stream service. ### Changed From 3713d7438f567435b8d4664fc1dad0828ef859c0 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:45:15 -0700 Subject: [PATCH 099/831] Regenerated the vendored stream protos for protobuf 3. This package has to load on a protobuf 3 runtime, and generated code refuses to load on a runtime older than the one it was built against. The protoc of that generation has no `--pyi_out`, so the stubs come from `mypy-protobuf`, which is what the other generated protos already use. --- scripts/gen_stream_protos.py | 7 +- temporalio/api/streamservice/v1/__init__.py | 16 + .../api/streamservice/v1/message_pb2.py | 90 +- .../api/streamservice/v1/message_pb2.pyi | 216 +- .../api/streamservice/v1/message_pb2_grpc.py | 24 - .../api/streamservice/v1/message_pb2_grpc.pyi | 4 + .../streamservice/v1/request_response_pb2.py | 972 +++++++- .../streamservice/v1/request_response_pb2.pyi | 2198 +++++++++++++---- .../v1/request_response_pb2_grpc.py | 24 - .../v1/request_response_pb2_grpc.pyi | 4 + .../api/streamservice/v1/service_pb2.py | 37 +- .../api/streamservice/v1/service_pb2.pyi | 13 +- .../api/streamservice/v1/service_pb2_grpc.py | 146 +- .../api/streamservice/v1/service_pb2_grpc.pyi | 195 ++ .../api/streamservice/v1/stream_state_pb2.py | 146 +- .../api/streamservice/v1/stream_state_pb2.pyi | 556 +++-- .../streamservice/v1/stream_state_pb2_grpc.py | 24 - .../v1/stream_state_pb2_grpc.pyi | 4 + temporalio/client_stream.py | 4 +- 19 files changed, 3550 insertions(+), 1130 deletions(-) create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index f57ff6177..6b6487294 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -9,7 +9,9 @@ Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf runtime this package has to load on. Generated code refuses to load on a runtime older than the one it was built against, and these modules end up in -applications that pin protobuf themselves. +applications that pin protobuf themselves. The stubs come from +``mypy-protobuf`` rather than protoc's own ``--pyi_out``, which that +generation of protoc does not have. Two rewrites make the copies compile against this SDK. The server's own routing and API-category options are dropped, because they mean nothing to a @@ -119,8 +121,9 @@ def main() -> None: f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", - f"--pyi_out={out}", f"--grpc_python_out={out}", + f"--mypy_out={out}", + f"--mypy_grpc_out={out}", *targets, ], check=True, diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 52dd65b7c..ce6edf894 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -19,6 +19,10 @@ AddWorkflowMessagesInput, AddWorkflowMessagesRequest, AddWorkflowMessagesResponse, + AdvanceConsumerHeadInput, + AdvanceConsumerHeadOutput, + AdvanceConsumerHeadRequest, + AdvanceConsumerHeadResponse, CloseStreamInput, CloseStreamOutput, CloseStreamRequest, @@ -53,6 +57,10 @@ PollWorkflowMessagesInput, PollWorkflowMessagesRequest, PollWorkflowMessagesResponse, + RegisterStreamConsumerInput, + RegisterStreamConsumerOutput, + RegisterStreamConsumerRequest, + RegisterStreamConsumerResponse, StreamListEntry, SubscribeWorkflowInput, SubscribeWorkflowOutput, @@ -79,6 +87,10 @@ "AddWorkflowMessagesInput", "AddWorkflowMessagesRequest", "AddWorkflowMessagesResponse", + "AdvanceConsumerHeadInput", + "AdvanceConsumerHeadOutput", + "AdvanceConsumerHeadRequest", + "AdvanceConsumerHeadResponse", "CloseStreamInput", "CloseStreamOutput", "CloseStreamRequest", @@ -115,6 +127,10 @@ "PollWorkflowMessagesRequest", "PollWorkflowMessagesResponse", "ProducerCursor", + "RegisterStreamConsumerInput", + "RegisterStreamConsumerOutput", + "RegisterStreamConsumerRequest", + "RegisterStreamConsumerResponse", "STREAM_MESSAGE_KIND_DATA", "STREAM_MESSAGE_KIND_FLUSH", "STREAM_MESSAGE_KIND_UNSPECIFIED", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index 9e30bd9a8..3bbd8718e 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -1,24 +1,15 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/message.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/message.proto", -) +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -32,26 +23,61 @@ b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamMessageKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamMessageKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamMessageKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 + STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 + STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 + """Producer signalling a delivery boundary. Carries no body and consumes an + offset like any other message. A consumer uses it to end a turn without + waiting out an idle timeout. + """ + +class StreamMessageKind( + _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper +): ... + +STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 +STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 +STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 +"""Producer signalling a delivery boundary. Carries no body and consumes an +offset like any other message. A consumer uses it to end a turn without +waiting out an idle timeout. +""" +global___StreamMessageKind = StreamMessageKind + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], ) -> None: ... - BODY_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - TOPIC_FIELD_NUMBER: _ClassVar[int] - TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - KIND_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - body: _message_pb2.Payload - metadata: _containers.MessageMap[str, _message_pb2.Payload] - topic: str - topic_sequence: int - kind: StreamMessageKind - offset: int + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance. The server does not populate this today.""" + topic: builtins.str + topic_sequence: builtins.int + """Position within this topic. The global offset orders the whole stream; + this lets a consumer reason about one topic without decoding the rest. + """ + kind: global___StreamMessageKind.ValueType + offset: builtins.int + """Position in the whole stream, set on read and never stored. A consumer + that resumes at message granularity needs it, and a topic-filtered read + leaves gaps that make it underivable from the response alone. + """ def __init__( self, - body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., - metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., - topic: _Optional[str] = ..., - topic_sequence: _Optional[int] = ..., - kind: _Optional[_Union[StreamMessageKind, str]] = ..., - offset: _Optional[int] = ..., + *, + body: temporal.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + kind: global___StreamMessageKind.ValueType = ..., + offset: builtins.int = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "offset", + b"offset", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... + +global___StreamMessage = StreamMessage -class StreamMessageBatch(_message.Message): - __slots__ = ("messages",) - MESSAGES_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] +class StreamMessageBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one log node. The server stores + this serialized and opaque; it decodes only to trim a partial first page or + to apply a topic filter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... def __init__( - self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ... + self, + *, + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["messages", b"messages"] ) -> None: ... + +global___StreamMessageBatch = StreamMessageBatch diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index 6b6c2372a..bf947056a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.pyi b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 7e8dbe3e4..b813e2dfc 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/request_response.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/request_response.proto", -) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -35,119 +25,857 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... - -class CreateStreamOutput(_message.Message): - __slots__ = ("run_id",) - RUN_ID_FIELD_NUMBER: _ClassVar[int] - run_id: str - def __init__(self, run_id: _Optional[str] = ...) -> None: ... - -class AddMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "stream_id", - "run_id", - "messages", - "producer_id", - "sequence", - "expected_offset", - "use_expected_offset", - "owner_epoch", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - expected_offset: int - use_expected_offset: bool - owner_epoch: int - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - producer_id: _Optional[str] = ..., - sequence: _Optional[int] = ..., - expected_offset: _Optional[int] = ..., - use_expected_offset: bool = ..., - owner_epoch: _Optional[int] = ..., - ) -> None: ... - -class AddMessagesOutput(_message.Message): - __slots__ = ("first_offset", "next_offset", "count", "deduplicated") - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] - first_offset: int - next_offset: int - count: int - deduplicated: bool - def __init__( - self, - first_offset: _Optional[int] = ..., - next_offset: _Optional[int] = ..., - count: _Optional[int] = ..., - deduplicated: bool = ..., - ) -> None: ... - -class FinishWritingInput(_message.Message): - __slots__ = ("namespace", "stream_id", "producer_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - producer_id: str - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - producer_id: _Optional[str] = ..., - ) -> None: ... - -class FinishWritingOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class SubscribeWorkflowInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - stream_id: str - start_offset: int - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - start_offset: _Optional[int] = ..., - ) -> None: ... - -class SubscribeWorkflowOutput(_message.Message): - __slots__ = ("start_offset",) - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - start_offset: int - def __init__(self, start_offset: _Optional[int] = ...) -> None: ... - -class PollMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "stream_id", - "run_id", - "from_offset", - "max_messages", - "topics", - "wait_new_messages", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - from_offset: _Optional[int] = ..., - max_messages: _Optional[int] = ..., - topics: _Optional[_Iterable[str]] = ..., - wait_new_messages: bool = ..., - ) -> None: ... - -class PollMessagesOutput(_message.Message): - __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") - MESSAGES_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - next_offset: int - head_offset: int - closed: bool - close_reason: _message_pb2_1.Payload - def __init__( - self, - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - next_offset: _Optional[int] = ..., - head_offset: _Optional[int] = ..., - closed: bool = ..., - close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., - ) -> None: ... - -class DescribeStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__( - self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... - ) -> None: ... - -class PollWorkflowMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "workflow_id", - "stream_name", - "from_offset", - "max_messages", - "topics", - "wait_new_messages", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - from_offset: _Optional[int] = ..., - max_messages: _Optional[int] = ..., - topics: _Optional[_Iterable[str]] = ..., - wait_new_messages: bool = ..., - ) -> None: ... - -class DescribeWorkflowStreamInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - ) -> None: ... - -class AddWorkflowMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "workflow_id", - "stream_name", - "messages", - "producer_id", - "sequence", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - producer_id: _Optional[str] = ..., - sequence: _Optional[int] = ..., - ) -> None: ... - -class DescribeStreamOutput(_message.Message): - __slots__ = ("state",) - STATE_FIELD_NUMBER: _ClassVar[int] - state: _stream_state_pb2.StreamState - def __init__( - self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ... - ) -> None: ... - -class CloseStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "reason") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - REASON_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - reason: _message_pb2_1.Payload - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 +import temporalio.api.streamservice.v1.message_pb2 +import temporalio.api.streamservice.v1.stream_state_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CreateStreamInput(google.protobuf.message.Message): + """The frontend-facing shapes are defined here rather than in the public API + because streams have no public API yet. Keeping them in a nested + frontend_request mirrors the other CHASM libraries, so promoting them later + is a package move rather than a redesign. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def lifecycle( + self, + ) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + lifecycle: temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["lifecycle", b"lifecycle"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "lifecycle", + b"lifecycle", + "namespace", + b"namespace", + "stream_id", + b"stream_id", + ], ) -> None: ... -class CloseStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___CreateStreamInput = CreateStreamInput -class TruncateStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "new_base_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - new_base_offset: int +class CreateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + run_id: builtins.str def __init__( self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - new_base_offset: _Optional[int] = ..., + *, + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["run_id", b"run_id"] ) -> None: ... -class TruncateStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___CreateStreamOutput = CreateStreamOutput + +class AddMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class DeleteStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + USE_EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional. Supplying it skips resolving the stream's current run, which is + a persistence lookup on every call. CreateStream returns it. + """ + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Idempotency, all optional. Supply a producer identity and sequence, or an + expected offset, or neither and accept at-least-once. + """ + sequence: builtins.int + expected_offset: builtins.int + """Guarded by use_expected_offset because proto3 optional is not supported + by this repo's helper generator. + """ + use_expected_offset: builtins.bool + owner_epoch: builtins.int def __init__( - self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + expected_offset: builtins.int = ..., + use_expected_offset: builtins.bool = ..., + owner_epoch: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "expected_offset", + b"expected_offset", + "messages", + b"messages", + "namespace", + b"namespace", + "owner_epoch", + b"owner_epoch", + "producer_id", + b"producer_id", + "run_id", + b"run_id", + "sequence", + b"sequence", + "stream_id", + b"stream_id", + "use_expected_offset", + b"use_expected_offset", + ], ) -> None: ... -class DeleteStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___AddMessagesInput = AddMessagesInput + +class AddMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class CreateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CreateStreamInput + FIRST_OFFSET_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + DEDUPLICATED_FIELD_NUMBER: builtins.int + first_offset: builtins.int + next_offset: builtins.int + count: builtins.int + deduplicated: builtins.bool + """True when a retry matched a recorded sequence and nothing was appended.""" def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ..., + *, + first_offset: builtins.int = ..., + next_offset: builtins.int = ..., + count: builtins.int = ..., + deduplicated: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "count", + b"count", + "deduplicated", + b"deduplicated", + "first_offset", + b"first_offset", + "next_offset", + b"next_offset", + ], ) -> None: ... -class CreateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CreateStreamOutput +global___AddMessagesOutput = AddMessagesOutput + +class FinishWritingInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + producer_id: builtins.str def __init__( - self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + producer_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "stream_id", + b"stream_id", + ], ) -> None: ... -class AddMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddMessagesInput +global___FinishWritingInput = FinishWritingInput + +class FinishWritingOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ..., ) -> None: ... -class AddMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput +global___FinishWritingOutput = FinishWritingOutput + +class SubscribeWorkflowInput(google.protobuf.message.Message): + """Registers a Workflow as a consumer of a stream it owns. The cursor lands in + the Workflow's own state, so from then on each of its Workflow Tasks carries + the next range and records what it consumed. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Name of the stream within the Workflow, for a stream it owns.""" + stream_id: builtins.str + """Id of a standalone stream in another execution. Exactly one of this and + stream_name is set. + """ + start_offset: builtins.int + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. + """ def __init__( - self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___SubscribeWorkflowInput = SubscribeWorkflowInput -class FinishWritingRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: FinishWritingInput +class SubscribeWorkflowOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + start_offset: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ..., + *, + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["start_offset", b"start_offset"] ) -> None: ... -class FinishWritingResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: FinishWritingOutput +global___SubscribeWorkflowOutput = SubscribeWorkflowOutput + +class PollMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional, as on AddMessagesInput.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters by exact topic. Offsets are assigned over the unfiltered stream, so + next_offset advances past filtered-out messages too. + """ + wait_new_messages: builtins.bool + """When set and the reader is caught up, block until something arrives, the + stream closes, or the server's long-poll timeout elapses. A timeout returns + an empty response rather than an error, so the caller simply polls again. + """ def __init__( - self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + ], + ) -> None: ... + +global___PollMessagesInput = PollMessagesInput -class SubscribeWorkflowRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: SubscribeWorkflowInput +class PollMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + next_offset: builtins.int + head_offset: builtins.int + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ..., + *, + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + next_offset: builtins.int = ..., + head_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "closed", + b"closed", + "head_offset", + b"head_offset", + "messages", + b"messages", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___PollMessagesOutput = PollMessagesOutput + +class DescribeStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class SubscribeWorkflowResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: SubscribeWorkflowOutput + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str def __init__( self, - frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DescribeStreamInput = DescribeStreamInput -class PollMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollMessagesInput +class PollWorkflowMessagesInput(google.protobuf.message.Message): + """A stream a workflow owns lives inside that workflow's execution, so it has + no standalone id to address it by. It is named by its owner and its name + instead, and routed on the owner. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters as on PollMessagesInput.""" + wait_new_messages: builtins.bool def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___PollWorkflowMessagesInput = PollWorkflowMessagesInput -class PollMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput +class DescribeWorkflowStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str def __init__( - self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], ) -> None: ... -class DescribeStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeStreamInput +global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput + +class AddWorkflowMessagesInput(google.protobuf.message.Message): + """Appending to a stream a workflow owns, from outside that workflow. The + workflow's own publishes ride its Workflow Task instead. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Optional idempotency, as on AddMessagesInput.""" + sequence: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", + b"messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], ) -> None: ... -class DescribeStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput +global___AddWorkflowMessagesInput = AddWorkflowMessagesInput + +class DescribeStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATE_FIELD_NUMBER: builtins.int + @property + def state(self) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamState: ... def __init__( - self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + self, + *, + state: temporalio.api.streamservice.v1.stream_state_pb2.StreamState + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["state", b"state"] ) -> None: ... -class PollWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollWorkflowMessagesInput +global___DescribeStreamOutput = DescribeStreamOutput + +class CloseStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["reason", b"reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "reason", b"reason", "stream_id", b"stream_id" + ], ) -> None: ... -class PollWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput +global___CloseStreamInput = CloseStreamInput + +class CloseStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( - self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + self, ) -> None: ... -class DescribeWorkflowStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeWorkflowStreamInput +global___CloseStreamOutput = CloseStreamOutput + +class TruncateStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + NEW_BASE_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + new_base_offset: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[ - _Union[DescribeWorkflowStreamInput, _Mapping] - ] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + new_base_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "new_base_offset", + b"new_base_offset", + "stream_id", + b"stream_id", + ], ) -> None: ... -class DescribeWorkflowStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput +global___TruncateStreamInput = TruncateStreamInput + +class TruncateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( - self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + self, ) -> None: ... -class AddWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddWorkflowMessagesInput +global___TruncateStreamOutput = TruncateStreamOutput + +class DeleteStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DeleteStreamInput = DeleteStreamInput + +class DeleteStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class AddWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput def __init__( - self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + self, ) -> None: ... -class CloseStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CloseStreamInput +global___DeleteStreamOutput = DeleteStreamOutput + +class CreateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CreateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CreateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CreateStreamRequest = CreateStreamRequest + +class CreateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CreateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CreateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CreateStreamResponse = CreateStreamResponse + +class AddMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddMessagesRequest = AddMessagesRequest + +class AddMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddMessagesResponse = AddMessagesResponse + +class FinishWritingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___FinishWritingInput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___FinishWritingInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class CloseStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CloseStreamOutput +global___FinishWritingRequest = FinishWritingRequest + +class FinishWritingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___FinishWritingOutput: ... def __init__( - self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ... + self, + *, + frontend_response: global___FinishWritingOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class TruncateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: TruncateStreamInput +global___FinishWritingResponse = FinishWritingResponse + +class SubscribeWorkflowRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___SubscribeWorkflowInput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___SubscribeWorkflowInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class TruncateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: TruncateStreamOutput +global___SubscribeWorkflowRequest = SubscribeWorkflowRequest + +class SubscribeWorkflowResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___SubscribeWorkflowOutput: ... def __init__( - self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ... + self, + *, + frontend_response: global___SubscribeWorkflowOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsInput(_message.Message): - __slots__ = ("namespace", "page_size", "next_page_token", "query") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - QUERY_FIELD_NUMBER: _ClassVar[int] - namespace: str - page_size: int - next_page_token: bytes - query: str +global___SubscribeWorkflowResponse = SubscribeWorkflowResponse + +class PollMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollMessagesInput: ... def __init__( self, - namespace: _Optional[str] = ..., - page_size: _Optional[int] = ..., - next_page_token: _Optional[bytes] = ..., - query: _Optional[str] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class StreamListEntry(_message.Message): - __slots__ = ("stream_id", "run_id") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - stream_id: str - run_id: str +global___PollMessagesRequest = PollMessagesRequest + +class PollMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... def __init__( - self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ... + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsOutput(_message.Message): - __slots__ = ("streams", "next_page_token") - STREAMS_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] - next_page_token: bytes +global___PollMessagesResponse = PollMessagesResponse + +class DescribeStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeStreamInput: ... def __init__( self, - streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., - next_page_token: _Optional[bytes] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class ListStreamsRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: ListStreamsInput +global___DescribeStreamRequest = DescribeStreamRequest + +class DescribeStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ..., + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: ListStreamsOutput +global___DescribeStreamResponse = DescribeStreamResponse + +class PollWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollWorkflowMessagesInput: ... def __init__( - self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ... + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class DeleteStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DeleteStreamInput +global___PollWorkflowMessagesRequest = PollWorkflowMessagesRequest + +class PollWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ..., + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class DeleteStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DeleteStreamOutput +global___PollWorkflowMessagesResponse = PollWorkflowMessagesResponse + +class DescribeWorkflowStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeWorkflowStreamInput: ... def __init__( - self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ... + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeWorkflowStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... + +global___DescribeWorkflowStreamRequest = DescribeWorkflowStreamRequest + +class DescribeWorkflowStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeWorkflowStreamResponse = DescribeWorkflowStreamResponse + +class RegisterStreamConsumerInput(google.protobuf.message.Message): + """Registering a consumer on a stream in another execution. Split out from + SubscribeWorkflow because the two halves live on different shards: the pin + goes on the stream, the cursor goes on the consuming workflow, and a handler + can only reach the shard it was routed to. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + consumer_workflow_id: builtins.str + """The workflow that will consume, which names the pin.""" + start_offset: builtins.int + """Negative means from wherever the stream is when the pin is taken. Resolved + here, where the frontier is, and returned so the cursor records a fact. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + consumer_workflow_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_workflow_id", + b"consumer_workflow_id", + "namespace", + b"namespace", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___RegisterStreamConsumerInput = RegisterStreamConsumerInput + +class RegisterStreamConsumerOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + start_offset: builtins.int + collection_id: builtins.str + """What the consumer needs to address the log, all decided by the stream.""" + bucket_size: builtins.int + known_head: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + known_head: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "known_head", + b"known_head", + "start_offset", + b"start_offset", + ], + ) -> None: ... + +global___RegisterStreamConsumerOutput = RegisterStreamConsumerOutput + +class AdvanceConsumerHeadInput(google.protobuf.message.Message): + """Telling one consumer that the frontier moved. Routed to the consumer, which + is not where the stream lives. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """The run that subscribed. A successor from continue-as-new holds no cursor + for this stream, so pushing the frontier at it would land nowhere. + """ + stream_id: builtins.str + head_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_id: builtins.str = ..., + head_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "head_offset", + b"head_offset", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_id", + b"stream_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput + +class AdvanceConsumerHeadOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput + +class AddWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddWorkflowMessagesRequest = AddWorkflowMessagesRequest + +class AddWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddWorkflowMessagesResponse = AddWorkflowMessagesResponse + +class RegisterStreamConsumerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___RegisterStreamConsumerInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___RegisterStreamConsumerInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___RegisterStreamConsumerRequest = RegisterStreamConsumerRequest + +class RegisterStreamConsumerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___RegisterStreamConsumerOutput: ... + def __init__( + self, + *, + frontend_response: global___RegisterStreamConsumerOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___RegisterStreamConsumerResponse = RegisterStreamConsumerResponse + +class AdvanceConsumerHeadRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AdvanceConsumerHeadInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AdvanceConsumerHeadInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AdvanceConsumerHeadRequest = AdvanceConsumerHeadRequest + +class AdvanceConsumerHeadResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AdvanceConsumerHeadOutput: ... + def __init__( + self, + *, + frontend_response: global___AdvanceConsumerHeadOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AdvanceConsumerHeadResponse = AdvanceConsumerHeadResponse + +class CloseStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CloseStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CloseStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CloseStreamRequest = CloseStreamRequest + +class CloseStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CloseStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CloseStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CloseStreamResponse = CloseStreamResponse + +class TruncateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___TruncateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___TruncateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___TruncateStreamRequest = TruncateStreamRequest + +class TruncateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___TruncateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___TruncateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___TruncateStreamResponse = TruncateStreamResponse + +class ListStreamsInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + QUERY_FIELD_NUMBER: builtins.int + namespace: builtins.str + page_size: builtins.int + next_page_token: builtins.bytes + query: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + page_size: builtins.int = ..., + next_page_token: builtins.bytes = ..., + query: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "next_page_token", + b"next_page_token", + "page_size", + b"page_size", + "query", + b"query", + ], + ) -> None: ... + +global___ListStreamsInput = ListStreamsInput + +class StreamListEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___StreamListEntry = StreamListEntry + +class ListStreamsOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAMS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + @property + def streams( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamListEntry + ]: ... + next_page_token: builtins.bytes + def __init__( + self, + *, + streams: collections.abc.Iterable[global___StreamListEntry] | None = ..., + next_page_token: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "next_page_token", b"next_page_token", "streams", b"streams" + ], + ) -> None: ... + +global___ListStreamsOutput = ListStreamsOutput + +class ListStreamsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___ListStreamsInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___ListStreamsInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___ListStreamsRequest = ListStreamsRequest + +class ListStreamsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___ListStreamsOutput: ... + def __init__( + self, + *, + frontend_response: global___ListStreamsOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___ListStreamsResponse = ListStreamsResponse + +class DeleteStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DeleteStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DeleteStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DeleteStreamRequest = DeleteStreamRequest + +class DeleteStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DeleteStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DeleteStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DeleteStreamResponse = DeleteStreamResponse diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index c8c70bb79..bf947056a 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index d5de1d5f8..432abfc5c 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/service.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/service.proto", -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -29,21 +19,16 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16RegisterStreamConsumer\x12H.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerResponse"\x00\x12\xa6\x01\n\x13\x41\x64vanceConsumerHead\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) - class StreamServiceStub(object): """Missing associated documentation comment in .proto file.""" @@ -45,79 +21,76 @@ def __init__(self, channel): "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True, ) self.AddMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True, ) self.FinishWriting = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True, ) self.SubscribeWorkflow = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True, ) self.PollMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True, ) self.DescribeStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True, ) self.PollWorkflowMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True, ) self.DescribeWorkflowStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True, ) self.AddWorkflowMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True, + ) + self.RegisterStreamConsumer = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + ) + self.AdvanceConsumerHead = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, ) self.CloseStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True, ) self.TruncateStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True, ) self.ListStreams = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True, ) self.DeleteStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True, ) @@ -178,6 +151,21 @@ def AddWorkflowMessages(self, request, context): context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") + def RegisterStreamConsumer(self, request, context): + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def AdvanceConsumerHead(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -252,6 +240,16 @@ def add_StreamServiceServicer_to_server(servicer, server): request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, ), + "RegisterStreamConsumer": grpc.unary_unary_rpc_method_handler( + servicer.RegisterStreamConsumer, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.SerializeToString, + ), + "AdvanceConsumerHead": grpc.unary_unary_rpc_method_handler( + servicer.AdvanceConsumerHead, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.SerializeToString, + ), "CloseStream": grpc.unary_unary_rpc_method_handler( servicer.CloseStream, request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, @@ -277,9 +275,6 @@ def add_StreamServiceServicer_to_server(servicer, server): "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers( - "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers - ) # This class is part of an EXPERIMENTAL API. @@ -313,7 +308,6 @@ def CreateStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -343,7 +337,6 @@ def AddMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -373,7 +366,6 @@ def FinishWriting( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -403,7 +395,6 @@ def SubscribeWorkflow( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -433,7 +424,6 @@ def PollMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -463,7 +453,6 @@ def DescribeStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -493,7 +482,6 @@ def PollWorkflowMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -523,7 +511,6 @@ def DescribeWorkflowStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -553,7 +540,64 @@ def AddWorkflowMessages( wait_for_ready, timeout, metadata, - _registered_method=True, + ) + + @staticmethod + def RegisterStreamConsumer( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def AdvanceConsumerHead( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, ) @staticmethod @@ -583,7 +627,6 @@ def CloseStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -613,7 +656,6 @@ def TruncateStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -643,7 +685,6 @@ def ListStreams( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -673,5 +714,4 @@ def DeleteStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi new file mode 100644 index 000000000..1530074ec --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi @@ -0,0 +1,195 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import abc + +import grpc + +import temporalio.api.streamservice.v1.request_response_pb2 + +class StreamServiceStub: + def __init__(self, channel: grpc.Channel) -> None: ... + CreateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse, + ] + AddMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse, + ] + FinishWriting: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse, + ] + SubscribeWorkflow: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse, + ] + PollMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse, + ] + DescribeStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse, + ] + PollWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, + ] + """Routed on the owner, because the stream it reads has no id of its own.""" + DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, + ] + AddWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse, + ] + RegisterStreamConsumer: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse, + ] + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + AdvanceConsumerHead: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse, + ] + CloseStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse, + ] + TruncateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse, + ] + ListStreams: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse, + ] + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + DeleteStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse, + ] + +class StreamServiceServicer(metaclass=abc.ABCMeta): + @abc.abstractmethod + def CreateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse: ... + @abc.abstractmethod + def AddMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse: ... + @abc.abstractmethod + def FinishWriting( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse: ... + @abc.abstractmethod + def SubscribeWorkflow( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse + ): ... + @abc.abstractmethod + def PollMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse: ... + @abc.abstractmethod + def DescribeStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse + ): ... + @abc.abstractmethod + def PollWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: + """Routed on the owner, because the stream it reads has no id of its own.""" + @abc.abstractmethod + def DescribeWorkflowStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse: ... + @abc.abstractmethod + def AddWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse + ): ... + @abc.abstractmethod + def RegisterStreamConsumer( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse: + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + @abc.abstractmethod + def AdvanceConsumerHead( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse + ): ... + @abc.abstractmethod + def CloseStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse: ... + @abc.abstractmethod + def TruncateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse + ): ... + @abc.abstractmethod + def ListStreams( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse: + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + @abc.abstractmethod + def DeleteStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse: ... + +def add_StreamServiceServicer_to_server( + servicer: StreamServiceServicer, server: grpc.Server +) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 3fe850a2a..2ce5a0451 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/stream_state.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/stream_state.proto", -) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -32,37 +22,113 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamState(google.protobuf.message.Message): + """Size is O(producers + consumers), never O(messages). Payload bytes live in + the log, not here, which is what keeps this off the CHASM partial-read path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class ProducersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ProducerCursor: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[ProducerCursor, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: global___ProducerCursor | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + class ConsumersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor - class ConsumersEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: ConsumerCursor + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ConsumerCursor: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[ConsumerCursor, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: global___ConsumerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], ) -> None: ... - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCERS_FIELD_NUMBER: _ClassVar[int] - CONSUMERS_FIELD_NUMBER: _ClassVar[int] - LIFECYCLE_FIELD_NUMBER: _ClassVar[int] - REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] - head_offset: int - base_offset: int - last_txn_id: int - closed: bool - close_reason: _message_pb2.Payload - owner_epoch: int - bucket_size: int - collection_id: str - producers: _containers.MessageMap[str, ProducerCursor] - consumers: _containers.MessageMap[str, ConsumerCursor] - lifecycle: StreamLifecycle - redirect_run_id: str - close_time: _timestamp_pb2.Timestamp + HEAD_OFFSET_FIELD_NUMBER: builtins.int + BASE_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + PRODUCERS_FIELD_NUMBER: builtins.int + CONSUMERS_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + REDIRECT_RUN_ID_FIELD_NUMBER: builtins.int + CLOSE_TIME_FIELD_NUMBER: builtins.int + head_offset: builtins.int + """Visibility frontier. Readers never observe an offset at or past this.""" + base_offset: builtins.int + """Truncation floor. Offsets below this are gone.""" + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + owner_epoch: builtins.int + """Bumped on ownership change so a stale producer's write fails.""" + bucket_size: builtins.int + """Immutable once set. Offsets roll to a new log tree every bucket_size so no + single storage partition grows with the stream. + """ + collection_id: builtins.str + """Identity of the log this stream writes to. Bucket trees are derived from + it, so there is no per-bucket index to store. + """ + @property + def producers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ProducerCursor + ]: ... + @property + def consumers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ConsumerCursor + ]: ... + @property + def lifecycle(self) -> global___StreamLifecycle: ... + redirect_run_id: builtins.str + """Set when a successor run takes ownership, so an in-flight poll can follow + the chain instead of stalling on a superseded run. + """ + @property + def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: + """Wall-clock close time, used to schedule retention deletion.""" def __init__( self, - head_offset: _Optional[int] = ..., - base_offset: _Optional[int] = ..., - last_txn_id: _Optional[int] = ..., - closed: bool = ..., - close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., - owner_epoch: _Optional[int] = ..., - bucket_size: _Optional[int] = ..., - collection_id: _Optional[str] = ..., - producers: _Optional[_Mapping[str, ProducerCursor]] = ..., - consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., - lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., - redirect_run_id: _Optional[str] = ..., - close_time: _Optional[ - _Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping] - ] = ..., + *, + head_offset: builtins.int = ..., + base_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + owner_epoch: builtins.int = ..., + bucket_size: builtins.int = ..., + collection_id: builtins.str = ..., + producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] + | None = ..., + consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] + | None = ..., + lifecycle: global___StreamLifecycle | None = ..., + redirect_run_id: builtins.str = ..., + close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "lifecycle", + b"lifecycle", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "base_offset", + b"base_offset", + "bucket_size", + b"bucket_size", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "closed", + b"closed", + "collection_id", + b"collection_id", + "consumers", + b"consumers", + "head_offset", + b"head_offset", + "lifecycle", + b"lifecycle", + "owner_epoch", + b"owner_epoch", + "producers", + b"producers", + "redirect_run_id", + b"redirect_run_id", + ], ) -> None: ... -class ProducerCursor(_message.Message): - __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") - SEQ_FIELD_NUMBER: _ClassVar[int] - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] - FENCED_FIELD_NUMBER: _ClassVar[int] - seq: int - first_offset: int - count: int - content_hash: bytes - fenced: bool +global___StreamState = StreamState + +class ProducerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + CONTENT_HASH_FIELD_NUMBER: builtins.int + FENCED_FIELD_NUMBER: builtins.int + seq: builtins.int + first_offset: builtins.int + count: builtins.int + content_hash: builtins.bytes + """Distinguishes a genuine retry from a client reusing a sequence with + different content, which must be rejected rather than deduplicated. + """ + fenced: builtins.bool + """Set by FinishWriting. Ends this producer's writes without closing the + stream for anyone else. + """ def __init__( self, - seq: _Optional[int] = ..., - first_offset: _Optional[int] = ..., - count: _Optional[int] = ..., - content_hash: _Optional[bytes] = ..., - fenced: bool = ..., + *, + seq: builtins.int = ..., + first_offset: builtins.int = ..., + count: builtins.int = ..., + content_hash: builtins.bytes = ..., + fenced: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "content_hash", + b"content_hash", + "count", + b"count", + "fenced", + b"fenced", + "first_offset", + b"first_offset", + "seq", + b"seq", + ], + ) -> None: ... + +global___ProducerCursor = ProducerCursor -class ConsumerCursor(_message.Message): - __slots__ = ("workflow_id", "run_id", "offset", "active", "external") - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - ACTIVE_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - workflow_id: str - run_id: str - offset: int - active: bool - external: bool +class ConsumerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + ACTIVE_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + REPLAY_FLOOR_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + offset: builtins.int + """How far this consumer has read. Used to decide whether it needs waking, + not to decide what the stream may drop. + """ + active: builtins.bool + external: builtins.bool + """Set when the consumer is a workflow in another execution, which is the + only case that has to be told the frontier moved. A workflow consuming a + stream it owns sees that while closing its own transaction. + """ + replay_floor: builtins.int + """The oldest offset this consumer's History still depends on. + + It is where the subscription started, not where it has read to. A range + this consumer already consumed is recorded in its History and has to be + re-readable for the workflow to replay, so bytes below the read position + are exactly the ones a replay needs most. It stays put while the consumer + is active and is released when it deregisters. + """ def __init__( self, - workflow_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - offset: _Optional[int] = ..., - active: bool = ..., - external: bool = ..., + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + offset: builtins.int = ..., + active: builtins.bool = ..., + external: builtins.bool = ..., + replay_floor: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "active", + b"active", + "external", + b"external", + "offset", + b"offset", + "replay_floor", + b"replay_floor", + "run_id", + b"run_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___ConsumerCursor = ConsumerCursor -class WorkflowStreamCursor(_message.Message): - __slots__ = ( - "stream_id", - "collection_id", - "bucket_size", - "offset", - "known_head", - "external", - "pending_from", - "pending_to", - "has_pending", - ) - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - PENDING_FROM_FIELD_NUMBER: _ClassVar[int] - PENDING_TO_FIELD_NUMBER: _ClassVar[int] - HAS_PENDING_FIELD_NUMBER: _ClassVar[int] - stream_id: str - collection_id: str - bucket_size: int - offset: int - known_head: int - external: bool - pending_from: int - pending_to: int - has_pending: bool +class WorkflowStreamCursor(google.protobuf.message.Message): + """A consuming Workflow's position in a stream. This lives in the consuming + Workflow's own state rather than on the stream, so advancing it commits in + the same transaction as the WorkflowTaskCompleted event that records the + range. Keeping it on the stream would make the advance a cross-execution + write, and a crash between the two would either redeliver or skip. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + PENDING_FROM_FIELD_NUMBER: builtins.int + PENDING_TO_FIELD_NUMBER: builtins.int + HAS_PENDING_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + collection_id: builtins.str + """Enough to address the log without reading the stream component first.""" + bucket_size: builtins.int + offset: builtins.int + """Next offset to deliver.""" + known_head: builtins.int + """The stream's frontier as of the last delivery. A workflow consuming a + stream in another execution cannot read the real frontier while closing its + own transaction, so this is what tells it a capped slice left more behind. + """ + external: builtins.bool + """Set when the stream lives in another execution, which decides whether the + frontier is read locally or taken from known_head. + """ + pending_from: builtins.int + """The range attached to the Workflow Task currently in flight. Recorded on + the event that closes that task, then folded into offset. An empty range + is still recorded: a task where the subscription saw nothing is a fact + replay has to reproduce. + """ + pending_to: builtins.int + has_pending: builtins.bool + start_offset: builtins.int + """Where this subscription began reading. Retained separately from offset, + which advances, because replay has to tell "committed nothing yet" apart + from "the events recording what was committed are not in this page". + """ def __init__( self, - stream_id: _Optional[str] = ..., - collection_id: _Optional[str] = ..., - bucket_size: _Optional[int] = ..., - offset: _Optional[int] = ..., - known_head: _Optional[int] = ..., - external: bool = ..., - pending_from: _Optional[int] = ..., - pending_to: _Optional[int] = ..., - has_pending: bool = ..., + *, + stream_id: builtins.str = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + offset: builtins.int = ..., + known_head: builtins.int = ..., + external: builtins.bool = ..., + pending_from: builtins.int = ..., + pending_to: builtins.int = ..., + has_pending: builtins.bool = ..., + start_offset: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "external", + b"external", + "has_pending", + b"has_pending", + "known_head", + b"known_head", + "offset", + b"offset", + "pending_from", + b"pending_from", + "pending_to", + b"pending_to", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___WorkflowStreamCursor = WorkflowStreamCursor -class StreamLifecycle(_message.Message): - __slots__ = ("retention", "max_items") - RETENTION_FIELD_NUMBER: _ClassVar[int] - MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] - retention: _duration_pb2.Duration - max_items: int +class StreamLifecycle(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RETENTION_FIELD_NUMBER: builtins.int + MAX_ITEMS_FIELD_NUMBER: builtins.int + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a closed stream stays readable before it is deleted.""" + max_items: builtins.int + """Cap on readable messages. Older whole buckets are reclaimed once the floor + passes them, so a capped stream has bounded storage. + """ def __init__( self, - retention: _Optional[ - _Union[datetime.timedelta, _duration_pb2.Duration, _Mapping] - ] = ..., - max_items: _Optional[int] = ..., + *, + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_items: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["retention", b"retention"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_items", b"max_items", "retention", b"retention" + ], ) -> None: ... + +global___StreamLifecycle = StreamLifecycle diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index c241cab40..bf947056a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 8280b56d4..2de4cb4e0 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -77,7 +77,9 @@ def __init__(self, channel: Any, namespace: str) -> None: """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" self._channel = channel self._namespace = namespace - self._stub = service_pb2_grpc.StreamServiceStub(channel) + # The generated stub is typed for a synchronous channel. This client + # drives it over ``grpc.aio``, where every call is awaited. + self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod def connect(target_host: str, namespace: str = "default") -> "StreamClient": From 5bf0094eec0fac082800afaac403a466d31f3072 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:22:04 -0700 Subject: [PATCH 100/831] Made the demo call the provider lifecycle hooks. A transport that serves outside readers through handlers on the workflow registers them in `prepare`, so without the call an outside reader finds no handler and the demo's follow fails against that provider. --- streams_demo/agent_loop.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index f3f39dca9..79d92c367 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -41,6 +41,15 @@ def decide(token: dict[str, Any]) -> dict[str, Any]: class AgentLoop: """Read, decide, write, until the producer says it has finished.""" + def __init__(self) -> None: + """Let the provider install what it needs before the first task. + + A no-op except on a transport that serves outside readers through + handlers on this workflow, which has to register them before the + first task completes or an early reader finds nothing to talk to. + """ + streams.prepare() + @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: """Decide on at most ``limit`` inputs, then return the trace.""" @@ -92,4 +101,7 @@ async def run(self, limit: int) -> list[dict[str, Any]]: finally: inputs.close() await decisions.finish() + # Lets go of anything the provider parked against this run, so a + # transport that holds a long poll open can let the workflow return. + streams.drain() return trace From 7af879d5930c50f16294c9802804dc3f20dbc716 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 101/831] Added the temporalio.streams interface with a provider registry. --- temporalio/streams/__init__.py | 143 +++++++++++++++ temporalio/streams/_frame.py | 72 ++++++++ temporalio/streams/_handles.py | 215 ++++++++++++++++++++++ temporalio/streams/_policy.py | 56 ++++++ temporalio/streams/_provider.py | 216 +++++++++++++++++++++++ temporalio/streams/_record.py | 90 ++++++++++ temporalio/streams/providers/__init__.py | 19 ++ 7 files changed, 811 insertions(+) create mode 100644 temporalio/streams/__init__.py create mode 100644 temporalio/streams/_frame.py create mode 100644 temporalio/streams/_handles.py create mode 100644 temporalio/streams/_policy.py create mode 100644 temporalio/streams/_provider.py create mode 100644 temporalio/streams/_record.py create mode 100644 temporalio/streams/providers/__init__.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py new file mode 100644 index 000000000..a25c2bdca --- /dev/null +++ b/temporalio/streams/__init__.py @@ -0,0 +1,143 @@ +"""A stream a workflow can read, decide on, and write. + +The contract, in five statements: + +1. **A workflow publishes only to its own stream, and it publishes + transactionally.** :meth:`StreamWriter.publish` returns without the record + being visible. The record appears when the workflow task is accepted, and + never if the task fails, so no reader can see a decision the workflow did + not commit. +2. **Reading is an observation, and the SDK records it.** What + :class:`StreamReader` handed to workflow code, including the boundary where + it found nothing, is committed with the commands that reading produced. + Recovery re-supplies the same records in the same order. +3. **Anything that does I/O publishes on its own account.** An activity, a + local activity, or an outside process writes through :func:`producer`, and + its records are visible as soon as they are written. It carries a producer + id, an attempt and a sequence so a retry can be told from a new generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume. + Do not compare two cursors or do arithmetic on one: one provider numbers + records with integers and another with a millisecond-and-sequence pair. +5. **A workflow names its streams relative to itself, and the provider + resolves them.** ``reader("inputs")`` is this workflow's inbound stream + called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One + provider stores that as a namespace-level stream id and another as a name + under the run's chain key, and workflow code does not have to know which. + The provider itself is chosen when the worker is built. + +Outside a workflow there is no worker to carry the choice, so a process calls +:func:`configure` once before it opens a :func:`producer` or a +:func:`consumer`, and passes :func:`worker_options` to its ``Worker`` and +``Replayer``. Those two calls are where a provider is named. Nothing else in +this module mentions one. + +Reading somebody else's stream is out of scope for the first release. It is +the topology neither prototype has evidence for, and leaving it out is what +lets both of them implement the rest. + +What the contract does not promise: that a :attr:`RecordKind.FINISH` record +means the writing activity succeeded, that a superseded attempt's records can +be withdrawn, or that a stream outlives the retention its provider is +configured for. + +Prototype support for AI-198. The public names are the proposal; providers +live under :mod:`temporalio.streams.providers`, one module each, registered +by name and chosen by :func:`configure`. Everything else is shared. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any, TypeVar + +from temporalio.streams._handles import ReadSource, StreamReader, StreamWriter, WriteSink +from temporalio.streams._provider import ( + Consumer, + Producer, + StreamProvider, + configure, + consumer, + open_read, + open_write, + producer, + worker_options, +) +from temporalio.streams._record import ( + BEGINNING, + Cursor, + RecordKind, + StreamRecord, + Supersession, +) + +__all__ = [ + "BEGINNING", + "Consumer", + "Cursor", + "Producer", + "ReadSource", + "RecordKind", + "StreamProvider", + "StreamReader", + "StreamRecord", + "StreamWriter", + "Supersession", + "WriteSink", + "configure", + "consumer", + "producer", + "worker_options", + "reader", + "writer", +] + +T = TypeVar("T") + + +def reader( + stream: str, + *, + type: type | None = None, + topic: str | None = None, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, +) -> StreamReader[Any]: + """Subscribe this workflow to its inbound stream ``stream``. + + Each call is a separate subscription with its own cursor, so adding, + removing or reordering one renumbers the waits after it. Gate a change + behind :func:`temporalio.workflow.patched` as you would for a timer. + + Args: + stream: The inbound stream's name, relative to this workflow. + type: The value type, used as the decode hint. + topic: Only records on this topic, or every topic when omitted. + start: Where to start. Only honoured on the first subscription of a + run, because after that the recorded cursor decides. + idle_timeout: How long the workflow waits with nothing arriving before + the provider is allowed to release the worker. ``None`` takes the + provider's default. + """ + return StreamReader( + open_read(stream, start=start, idle_timeout=idle_timeout), + topic=topic, + type=type, + ) + + +def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: + """Publish to ``topic`` on the stream this workflow owns. + + Args: + topic: The topic name. + type: Declared for symmetry with :func:`reader` and for documentation. + Encoding follows the value. + """ + del type + return StreamWriter(open_write(topic), topic) + + +# Importing the package registers every provider whose dependencies are +# present in this tree. Import order matters: the registry above must exist +# before a provider module can register with it. +from temporalio.streams import providers as _providers # noqa: E402,F401 diff --git a/temporalio/streams/_frame.py b/temporalio/streams/_frame.py new file mode 100644 index 000000000..c32811d32 --- /dev/null +++ b/temporalio/streams/_frame.py @@ -0,0 +1,72 @@ +"""The record envelope both bindings put on the wire. + +A provider stores an opaque body. The contract needs more than a body: which +topic a record belongs to, whether it is data or a terminal marker, and which +producer attempt wrote it. Neither prototype carries all of that in a channel +of its own, so the interface carries it here and each binding stores the result +as an ordinary body. + +Encoding is synchronous and deterministic because a workflow publishes on the +workflow thread. The header is JSON with sorted keys for that reason, and +because a stored record that a person can read is worth more during an +incident than a few saved bytes. +""" + +from __future__ import annotations + +import json +from typing import Any + +from temporalio.streams._record import RecordKind + +__all__ = ["decode", "encode"] + +_MAGIC = b"tsf1" + + +def encode( + *, + topic: str, + kind: RecordKind, + producer: str, + attempt: int, + sequence: int, + body: bytes, +) -> bytes: + """Wrap one already-encoded body with the contract's metadata.""" + header: dict[str, Any] = {"k": int(kind), "t": topic} + # Omitted rather than written as a default, so a workflow's own publish + # does not carry three fields that only mean something for a producer. + if producer: + header["p"] = producer + if attempt: + header["a"] = attempt + if sequence >= 0: + header["s"] = sequence + raw = json.dumps(header, sort_keys=True, separators=(",", ":")).encode() + return _MAGIC + len(raw).to_bytes(4, "big") + raw + body + + +def decode(frame: bytes) -> tuple[RecordKind, str, str, int, int, bytes]: + """Split a frame into ``(kind, topic, producer, attempt, sequence, body)``. + + Raises: + ValueError: The bytes are not a frame this interface wrote. Reading a + stream someone else populated is a real case, so it fails with a + name rather than an index error. + """ + if len(frame) < 8 or frame[:4] != _MAGIC: + raise ValueError( + "this record was not written through the stream interface, so its " + "topic and producer are unknown" + ) + size = int.from_bytes(frame[4:8], "big") + header = json.loads(frame[8 : 8 + size]) + return ( + RecordKind(header.get("k", int(RecordKind.DATA))), + header.get("t", ""), + header.get("p", ""), + int(header.get("a", 0)), + int(header.get("s", -1)), + frame[8 + size :], + ) diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py new file mode 100644 index 000000000..a6dc9a073 --- /dev/null +++ b/temporalio/streams/_handles.py @@ -0,0 +1,215 @@ +"""The handles workflow code holds. + +Everything provider-specific sits behind the two protocols at the top. A +handle converts values, frames records, filters topics and synthesizes +supersession; a binding only moves bytes. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from typing import Any, Generic, Protocol, TypeVar + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import Cursor, RecordKind, StreamRecord + +__all__ = ["ReadSource", "StreamReader", "StreamWriter", "WriteSink"] + +T = TypeVar("T") + + +class ReadSource(Protocol): + """One subscription, as a provider supplies it.""" + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + """The next records, waiting until there is at least one. + + A batch rather than a record because delivery boundaries are what a + provider actually records, and flattening them here keeps that out of + the contract. + + Raises: + StopAsyncIteration: This subscription has ended. + """ + ... + + def close(self) -> None: + """End the subscription. Idempotent.""" + ... + + +class WriteSink(Protocol): + """One topic on the stream the running workflow owns.""" + + async def publish(self, frame: bytes) -> None: + """Accept one framed record into this workflow task's output. + + Awaitable because a provider may hold the publisher back when its + batch is full. It does not mean the record is visible: it becomes + visible when the workflow task is accepted. + """ + ... + + +def _encode_value(value: Any) -> bytes: + converter = workflow.payload_converter() + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _decode_value(body: bytes, as_type: type | None) -> Any: + converter = workflow.payload_converter() + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class StreamWriter(Generic[T]): + """Publishes to a topic on the stream this workflow owns. + + A workflow can only publish transactionally to a stream it owns, on both + providers. Writing to somebody else's stream is an activity's job, and it + gets the weaker guarantee that goes with doing I/O. + """ + + def __init__(self, sink: WriteSink, topic: str) -> None: + """Prefer :func:`temporalio.streams.writer`.""" + self._sink = sink + self._topic = topic + self._finished = False + + @property + def topic(self) -> str: + """The topic this writer is bound to.""" + return self._topic + + async def publish(self, value: T) -> None: + """Append ``value`` to this topic. + + Returning does not mean the record is visible. It becomes visible when + this workflow task is accepted, and never at all if the task fails, so + a reader cannot see a decision the workflow did not commit. + """ + if self._finished: + raise RuntimeError(f"topic {self._topic!r} was already finished") + await self._sink.publish( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer="", + attempt=0, + sequence=-1, + body=_encode_value(value), + ) + ) + + async def finish(self) -> None: + """Declare this topic complete. + + Says the writer has nothing more to send. It does not say the workflow + or the activity behind it succeeded, and a reader that treats it that + way will accept output from an attempt that later timed out. + """ + if self._finished: + return + self._finished = True + await self._sink.publish( + _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer="", + attempt=0, + sequence=-1, + body=b"", + ) + ) + + +class StreamReader(Generic[T]): + """Reads a stream from inside workflow code. + + Iterating yields every kind of record, including the supersession the + reader synthesizes when a producer's newer attempt appears. Check + ``record.kind``, or use :meth:`values` when the workflow genuinely only + wants data. + """ + + def __init__( + self, + source: ReadSource, + *, + topic: str | None = None, + type: type | None = None, + ) -> None: + """Prefer :func:`temporalio.streams.reader`.""" + self._source = source + self._topic = topic + self._type = type + self._pending: list[StreamRecord[Any]] = [] + self._attempts = AttemptTracker() + self._closed = False + + def __aiter__(self) -> AsyncIterator[StreamRecord[T]]: + """Iterate records until the reader is closed.""" + return self._iterate() + + async def _iterate(self) -> AsyncIterator[StreamRecord[T]]: + while not self._closed: + try: + record = await self.next() + except StopAsyncIteration: + # The provider ended the subscription. Iteration stops rather + # than raising, so a workflow that reads to the end of a + # finished stream leaves the loop instead of failing its task. + return + yield record + + async def values(self) -> AsyncIterator[T]: + """Iterate the data values, dropping control records.""" + async for record in self: + if record.kind is RecordKind.DATA: + yield record.value + + async def next(self) -> StreamRecord[T]: + """The next record, waiting for one if there is none buffered. + + Raises: + StopAsyncIteration: The provider ended the subscription. + """ + while not self._pending: + await self._fill() + return self._pending.pop(0) + + async def _fill(self) -> None: + for cursor, frame in await self._source.next_batch(): + kind, topic, producer, attempt, sequence, body = _frame.decode(frame) + if self._topic is not None and topic != self._topic: + continue + superseded = self._attempts.note(producer, attempt, cursor) + if superseded is not None: + self._pending.append(superseded) + self._pending.append( + StreamRecord( + value=( + _decode_value(body, self._type) + if kind is RecordKind.DATA + else None + ), + cursor=cursor, + kind=kind, + topic=topic, + producer=producer, + attempt=attempt, + sequence=sequence, + ) + ) + + def close(self) -> None: + """End the subscription. Idempotent.""" + self._closed = True + self._source.close() diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py new file mode 100644 index 000000000..24e20ab2f --- /dev/null +++ b/temporalio/streams/_policy.py @@ -0,0 +1,56 @@ +"""Turning a producer's newer attempt into something a reader can act on. + +An activity that streams half an answer and then fails leaves those records in +the stream. Its retry calls the model again and writes different words. No +provider can undo the first half, and a workflow that already acted on it has +committed that decision, so the honest thing is to tell the reader that a new +attempt began and let the application decide. + +This runs in the reader over records it already observed, so it costs no round +trip and replays without the provider being involved. +""" + +from __future__ import annotations + +from temporalio.streams._record import ( + Cursor, + RecordKind, + StreamRecord, + Supersession, +) + +__all__ = ["AttemptTracker"] + + +class AttemptTracker: + """Watches producer attempts on one subscription.""" + + def __init__(self) -> None: + self._attempts: dict[str, int] = {} + + def note( + self, producer: str, attempt: int, cursor: Cursor + ) -> StreamRecord[Supersession] | None: + """A supersession record when this record starts a newer attempt. + + A producer that declares no attempt supersedes nothing, because there + is no generation to compare. That is the same answer as an unnumbered + record: the interface reports what it was told and invents nothing. + """ + if not producer or attempt <= 0: + return None + previous = self._attempts.get(producer, 0) + if attempt <= previous: + return None + self._attempts[producer] = attempt + if previous == 0: + return None + return StreamRecord( + value=Supersession( + producer=producer, previous_attempt=previous, attempt=attempt + ), + cursor=cursor, + kind=RecordKind.SUPERSEDED, + producer=producer, + attempt=attempt, + ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py new file mode 100644 index 000000000..58282cc55 --- /dev/null +++ b/temporalio/streams/_provider.py @@ -0,0 +1,216 @@ +"""The provider registry: where a process names its stream provider. + +A provider only moves bytes. The handles, records, framing and supersession +around it are shared, so every provider module is small: it implements +:class:`StreamProvider` and registers a factory under a short name when it is +imported. One :func:`configure` call decides which factory serves this +process; when exactly one provider is registered, it is the default and the +call can be omitted. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any, Callable, Protocol + +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, StreamRecord + +__all__ = [ + "Consumer", + "Producer", + "StreamProvider", + "configure", + "consumer", + "open_read", + "open_write", + "producer", + "register", + "registered", + "worker_options", +] + + +class Producer(Protocol): + """Appends to a stream from outside workflow code. + + Every append is visible as soon as the provider accepts it, and carries + the producer id, attempt and sequence that let a reader tell a retried + append from a new generation. + """ + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + ... + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + ... + + async def finish(self) -> None: + """Declare this producer's output complete.""" + ... + + +class Consumer(Protocol): + """Reads a stream from outside workflow code, resumably.""" + + def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive.""" + ... + + +class StreamProvider(Protocol): + """What a provider module implements. + + The workflow-side pair (:meth:`open_read`, :meth:`open_write`) runs inside + workflow code and must keep the contract's first two rules: publishes + commit with the workflow task, and reads are recorded observations. The + outside pair (:meth:`producer`, :meth:`consumer`) runs anywhere and moves + framed bytes. A transport-only provider may serve just the outside pair + and raise on the workflow side, naming the provider a worker should use. + """ + + name: str + + def configure(self, **options: Any) -> None: + """Accept this provider's process-level options.""" + ... + + def worker_options(self) -> dict[str, Any]: + """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + ... + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + """Subscribe the running workflow to its inbound stream ``stream``.""" + ... + + def open_write(self, topic: str) -> WriteSink: + """Bind ``topic`` on the stream the running workflow owns.""" + ... + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> Producer: + """Open a producer for ``workflow_id``'s inbound stream ``stream``.""" + ... + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> Consumer: + """Open a reader for what ``workflow_id`` publishes.""" + ... + + +_factories: dict[str, Callable[[], StreamProvider]] = {} +_active: StreamProvider | None = None + + +def register(name: str, factory: Callable[[], StreamProvider]) -> None: + """Make ``factory`` selectable as ``configure(provider=name)``.""" + _factories[name] = factory + + +def registered() -> list[str]: + """The provider names this process can configure.""" + return sorted(_factories) + + +def _make(name: str | None) -> StreamProvider: + if name is None: + if len(_factories) == 1: + name = next(iter(_factories)) + else: + raise RuntimeError( + "name a provider: configure(provider=...) with one of " + f"{registered()}" + ) + factory = _factories.get(name) + if factory is None: + raise RuntimeError( + f"no stream provider {name!r} is registered; available: {registered()}" + ) + return factory() + + +def configure(provider: str | None = None, **options: Any) -> None: + """Name the provider for this process and hand it its options. + + ``provider`` may be omitted when exactly one provider is registered. + """ + global _active + chosen = _make(provider) + chosen.configure(**options) + _active = chosen + + +def _current() -> StreamProvider: + global _active + if _active is None: + chosen = _make(None) + chosen.configure() + _active = chosen + return _active + + +def worker_options() -> dict[str, Any]: + """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + return _current().worker_options() + + +def open_read( + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, +) -> ReadSource: + """Subscribe the running workflow to its inbound stream ``stream``.""" + return _current().open_read(stream, start=start, idle_timeout=idle_timeout) + + +def open_write(topic: str) -> WriteSink: + """Bind ``topic`` on the stream the running workflow owns.""" + return _current().open_write(topic) + + +async def producer( + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, +) -> Producer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``.""" + return await _current().producer( + client, + workflow_id=workflow_id, + stream=stream, + producer_id=producer_id, + attempt=attempt, + ) + + +async def consumer(client: Any, *, workflow_id: str, stream: str = "") -> Consumer: + """Open a reader for what ``workflow_id`` publishes.""" + return await _current().consumer(client, workflow_id=workflow_id, stream=stream) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py new file mode 100644 index 000000000..d458ef0c4 --- /dev/null +++ b/temporalio/streams/_record.py @@ -0,0 +1,90 @@ +"""The value types the stream contract is expressed in. + +Nothing here touches Temporal or a provider, so both bindings share it +unchanged. +""" + +from __future__ import annotations + +import enum +from dataclasses import dataclass +from typing import Generic, TypeVar + +__all__ = [ + "BEGINNING", + "Cursor", + "RecordKind", + "StreamRecord", + "Supersession", +] + +T = TypeVar("T") + + +@enum.unique +class RecordKind(enum.IntEnum): + """What a record is.""" + + DATA = 1 + """Carries a value published by a workflow or a producer.""" + + FINISH = 2 + """The writer of this topic declared it complete. + + Separate from the activity or workflow that wrote it having succeeded. A + reader that treats it as proof of success is wrong: the activity can still + time out after writing it. + """ + + SUPERSEDED = 3 + """A later attempt of the same producer started writing. + + Synthesized by the reader from what it observed, so both providers deliver + it identically and replay reproduces it without the provider's help. + """ + + +@dataclass(frozen=True) +class Cursor: + """A position in a stream, ordered by its provider rather than by value. + + Opaque on purpose. One provider numbers records with integers and another + with a millisecond-and-sequence pair, so comparing tokens here would be + right for one and wrong for the other. Hand a cursor back to resume from + it; ask the reader to compare two. + """ + + token: str + + def __str__(self) -> str: + """The provider's position token.""" + return self.token + + +BEGINNING = Cursor("") +"""Read from the oldest record the stream still retains.""" + + +@dataclass(frozen=True) +class Supersession: + """The body of a :attr:`RecordKind.SUPERSEDED` record.""" + + producer: str + previous_attempt: int + attempt: int + + +@dataclass(frozen=True) +class StreamRecord(Generic[T]): + """One record as workflow code sees it.""" + + value: T + cursor: Cursor + kind: RecordKind = RecordKind.DATA + topic: str = "" + producer: str = "" + """Who wrote it, or empty when the owning workflow wrote it itself.""" + attempt: int = 0 + """The producer's attempt, or 0 when it did not declare one.""" + sequence: int = -1 + """The producer's position within its attempt, or -1 when unnumbered.""" diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py new file mode 100644 index 000000000..dff94b250 --- /dev/null +++ b/temporalio/streams/providers/__init__.py @@ -0,0 +1,19 @@ +"""Stream providers, one module each. + +Importing this package registers every provider whose dependencies are +present. A tree that lacks a provider's dependencies simply does not offer +that name; nothing else changes, because everything above the provider is +shared. +""" + +from __future__ import annotations + +_KNOWN = ("memory", "workflow_streams", "native", "redis", "nexus") + +for _name in _KNOWN: + try: + __import__(f"{__name__}.{_name}") + except ImportError: + # This tree does not carry that provider. The registry error message + # lists what is actually available. + pass From c2f0251b4542d43c9ab3881b527c9d26b1477c30 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 102/831] Added the in-memory reference provider and the conformance tests. --- temporalio/streams/providers/memory.py | 315 ++++++++++++++++++++++ tests/streams/__init__.py | 0 tests/streams/test_streams_conformance.py | 164 +++++++++++ 3 files changed, 479 insertions(+) create mode 100644 temporalio/streams/providers/memory.py create mode 100644 tests/streams/__init__.py create mode 100644 tests/streams/test_streams_conformance.py diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py new file mode 100644 index 000000000..808a84f13 --- /dev/null +++ b/temporalio/streams/providers/memory.py @@ -0,0 +1,315 @@ +"""The in-process reference provider. + +Exists so the conformance suite can exercise the whole surface without a +store, and to document in one file what a provider owes. Two honest limits, +both stated so nobody mistakes this for evidence: + +- It is not replay-safe. Workflow-side state lives in plain process memory, + so run it with a warm workflow cache and do not use it to demonstrate + recovery. +- A workflow's publish becomes visible at ``publish`` time rather than at + task acceptance, so it only approximates rule 1 of the contract. + +The outside surface (producer, consumer, dedupe, supersession, cursors) is +faithful, which is what the conformance tests lean on. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import temporalio.converter +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_DEFAULT_POLL = timedelta(milliseconds=100) + + +class _MemoryStream: + def __init__(self) -> None: + self.frames: list[bytes] = [] + # Dedupe identity is (producer#attempt, first sequence of the append), + # the same pair the storage providers use. + self.seen: dict[tuple[str, int], int] = {} + self._arrival = asyncio.Event() + + def append(self, frames: list[bytes], *, producer_id: str, sequence: int) -> int: + key = (producer_id, sequence) + already = self.seen.get(key) + if already is not None: + return already + offset = len(self.frames) + self.frames.extend(frames) + self.seen[key] = offset + arrival, self._arrival = self._arrival, asyncio.Event() + arrival.set() + return offset + + async def wait_past(self, offset: int) -> None: + while len(self.frames) <= offset: + await self._arrival.wait() + + +_streams: dict[str, _MemoryStream] = {} + + +def _stream(stream_id: str) -> _MemoryStream: + found = _streams.get(stream_id) + if found is None: + found = _streams[stream_id] = _MemoryStream() + return found + + +def reset() -> None: + """Drop every stream. For tests.""" + _streams.clear() + + +def _inbound_id(workflow_id: str, stream: str) -> str: + return f"{workflow_id}:{stream}" if stream else workflow_id + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +class _MemReadSource: + """Workflow-side read that wakes by polling a timer. + + A real provider wakes the workflow by delivering; polling is the price of + having no delivery path, and it is why this provider is for tests. + """ + + def __init__(self, store: _MemoryStream, start: int, poll: timedelta) -> None: + self._store = store + self._cursor = start + self._poll = poll + self._closed = False + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while not self._closed: + frames = self._store.frames + if len(frames) > self._cursor: + batch = [ + (Cursor(str(offset)), frames[offset]) + for offset in range(self._cursor, len(frames)) + ] + self._cursor = len(frames) + return batch + await workflow.sleep(self._poll) + raise StopAsyncIteration + + def close(self) -> None: + self._closed = True + + +class _MemWriteSink: + def __init__(self, store: _MemoryStream, topic: str) -> None: + self._store = store + self._topic = topic + self._sequence = 0 + + async def publish(self, frame: bytes) -> None: + self._store.append( + [frame], + producer_id=f"__workflow__:{self._topic}", + sequence=self._sequence, + ) + self._sequence += 1 + + +class MemoryProducer: + """The outside producer, faithful to the contract.""" + + def __init__( + self, store: _MemoryStream, converter: Any, topic: str, producer_id: str, attempt: int + ) -> None: + self._store = store + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = self._store.append( + frames, + producer_id=self._provider_id, + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + self._store.append( + [frame], producer_id=self._provider_id, sequence=self._sequence - 1 + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class MemoryConsumer: + """The outside reader, with the shared supersession rule.""" + + def __init__(self, store: _MemoryStream, converter: Any) -> None: + self._store = store + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + offset = int(start.token) if start.token else 0 + while True: + await self._store.wait_past(offset) + frames = self._store.frames + while offset < len(frames): + cursor = Cursor(str(offset)) + frame = frames[offset] + offset += 1 + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + frame + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _MemoryProvider: + name = "memory" + + def __init__(self) -> None: + self._poll = _DEFAULT_POLL + + def configure(self, **options: Any) -> None: + poll = options.pop("poll_interval", None) + if poll is not None: + self._poll = poll + if options: + raise TypeError( + f"the memory provider takes only poll_interval, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + store = _stream(_inbound_id(workflow.info().workflow_id, stream)) + return _MemReadSource( + store, + int(start.token) if start.token else 0, + idle_timeout or self._poll, + ) + + def open_write(self, topic: str) -> WriteSink: + store = _stream(_inbound_id(workflow.info().workflow_id, "")) + return _MemWriteSink(store, topic) + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> MemoryProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return MemoryProducer( + _stream(_inbound_id(workflow_id, stream)), + _converter(client), + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> MemoryConsumer: + return MemoryConsumer( + _stream(_inbound_id(workflow_id, stream)), _converter(client) + ) + + +_provider.register("memory", _MemoryProvider) diff --git a/tests/streams/__init__.py b/tests/streams/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py new file mode 100644 index 000000000..d01132851 --- /dev/null +++ b/tests/streams/test_streams_conformance.py @@ -0,0 +1,164 @@ +"""Conformance tests for the stream contract. + +Written against the public surface plus the in-memory reference provider, so +they run with no server and no store. A storage provider reuses the same +expectations through its own fixtures; what this file pins down is the +contract: framing, producer identity, retry deduplication, supersession, +topic filtering, and cursor resumption. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +from temporalio import streams +from temporalio.streams import _frame +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import Cursor, RecordKind +from temporalio.streams.providers import memory + + +@pytest.fixture(autouse=True) +def _fresh_memory_provider(): + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +async def take(records: Any, count: int, timeout: float = 5.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +def test_frame_roundtrip(): + frame = _frame.encode( + topic="decisions", + kind=RecordKind.DATA, + producer="model", + attempt=3, + sequence=7, + body=b"payload-bytes", + ) + kind, topic, producer, attempt, sequence, body = _frame.decode(frame) + assert (kind, topic, producer, attempt, sequence, body) == ( + RecordKind.DATA, + "decisions", + "model", + 3, + 7, + b"payload-bytes", + ) + + +def test_supersession_is_synthesized_from_observations(): + attempts = AttemptTracker() + assert attempts.note("model", 1, Cursor("0")) is None + superseded = attempts.note("model", 2, Cursor("1")) + assert superseded is not None + assert superseded.kind is RecordKind.SUPERSEDED + assert superseded.value.previous_attempt == 1 + # The same attempt again is not a new generation. + assert attempts.note("model", 2, Cursor("2")) is None + + +async def test_append_read_roundtrip(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"id": "r1"}, {"id": "r2"}) + await producer.finish() + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] + assert all(r.producer == "model" and r.attempt == 1 for r in records) + assert [r.sequence for r in records] == [0, 1, 2] + + +async def test_retried_append_is_deduplicated(): + first = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await first.append({"id": "r1"}) + # The retry of the same attempt starts its sequence over and appends the + # same record. The provider must not store it twice. + retry = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await retry.append({"id": "r1"}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 1) + assert records[0].value == {"id": "r1"} + with pytest.raises(asyncio.TimeoutError): + await take(consumer.read(type=dict), 2, timeout=0.2) + + +async def test_new_attempt_supersedes_the_old_one(): + first = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await first.append({"text": "The capital of"}) + second = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=2 + ) + await second.append({"text": "Paris is the capital"}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + + +async def test_topic_filter(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}) + other = await streams.producer( + None, workflow_id="wf", stream="other", producer_id="model", attempt=1 + ) + await other.append({"n": 2}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict, topic="inputs"), 1) + assert records[0].value == {"n": 1} + + +async def test_cursor_resumes_where_it_points(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict), 3) + checkpoint = records[1].cursor + + resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") + again = await take(resumed.read(type=dict, start=checkpoint), 2) + assert [r.value for r in again] == [{"n": 2}, {"n": 3}] + + +def test_unknown_provider_is_a_clear_error(): + with pytest.raises(RuntimeError, match="no stream provider 'nope'"): + streams.configure(provider="nope") From 2815caffadb3a9b8c6ec8d7520f3e9ba779221b0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:35:51 -0700 Subject: [PATCH 103/831] Added the shared demo loop. --- streams_demo/agent_loop.py | 92 ++++++++++++++++++++ streams_demo/provider_setup.py | 21 +++++ streams_demo/run_demo.py | 154 +++++++++++++++++++++++++++++++++ 3 files changed, 267 insertions(+) create mode 100644 streams_demo/agent_loop.py create mode 100644 streams_demo/provider_setup.py create mode 100644 streams_demo/run_demo.py diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py new file mode 100644 index 000000000..afbb7ea4c --- /dev/null +++ b/streams_demo/agent_loop.py @@ -0,0 +1,92 @@ +"""One agent loop, written once, run on both stream providers. + +Reads input, decides on it, publishes the decision, and runs an ordinary +Activity in the same workflow task. Also handles the two control records the +contract defines, so a retried producer and a finished topic are exercised +rather than described. + +This file is byte-identical in the server-side tree and the client-side tree. +Only the worker that runs it differs, and only in which provider it is given. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any + +from temporalio import activity, streams, workflow + +DECISIONS = "decisions" +INPUTS = "inputs" + + +@activity.defn(name="AI198RecordDecision") +async def record_decision(decision: dict[str, Any]) -> str: + """An ordinary command in the same task as the publish.""" + return f"recorded:{decision['source']}:{decision['branch']}" + + +def decide(token: dict[str, Any]) -> dict[str, Any]: + """The decision the workflow is here to make.""" + if token["value"] % 2 == 0: + return {"source": token["id"], "branch": "even", "computed": token["value"] * 10} + return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} + + +@workflow.defn(name="AI198StreamContractDemo", sandboxed=False) +class AgentLoop: + """Read, decide, write, until the producer says it has finished.""" + + @workflow.run + async def run(self, limit: int) -> list[dict[str, Any]]: + inputs = streams.reader( + INPUTS, type=dict, idle_timeout=timedelta(seconds=1) + ) + decisions = streams.writer(DECISIONS) + trace: list[dict[str, Any]] = [] + accepted = 0 + try: + async for record in inputs: + if record.kind is streams.RecordKind.SUPERSEDED: + # A newer attempt of the same producer started writing. The + # decisions already published stand, so the workflow says so + # rather than pretending they can be withdrawn. + trace.append( + { + "kind": "superseded", + "producer": record.producer, + "replaced": record.value.previous_attempt, + "attempt": record.value.attempt, + } + ) + await decisions.publish( + {"retracting_attempt": record.value.previous_attempt} + ) + continue + if record.kind is streams.RecordKind.FINISH: + # The producer says it is done, which is what ends the loop. + # Counting decisions instead would leave the terminal record + # unread and let the workflow finish while its producer is + # still writing. + trace.append({"kind": "finish", "producer": record.producer}) + break + decision = decide(record.value) + await decisions.publish(decision) + receipt = await workflow.execute_activity( + record_decision, + decision, + activity_id=f"decision-{decision['source']}", + start_to_close_timeout=timedelta(seconds=10), + ) + trace.append( + {"kind": "decision", "value": decision, "receipt": receipt} + ) + accepted += 1 + if accepted >= limit: + # A bound so a stuck producer cannot run this forever. The + # terminal record above is the ordinary way out. + break + finally: + inputs.close() + await decisions.finish() + return trace diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py new file mode 100644 index 000000000..81e7108e5 --- /dev/null +++ b/streams_demo/provider_setup.py @@ -0,0 +1,21 @@ +"""Pick the provider for a demo run from the environment. + +``STREAMS_PROVIDER`` names any registered provider; this base tree carries +only ``memory``, and each provider branch adds its own name. The demo needs a +Temporal server to run the workflow either way; ``TEMPORAL_ADDRESS`` points +at it. +""" + +from __future__ import annotations + +import os + +NAME = os.environ.get("STREAMS_PROVIDER", "memory") + +# The memory provider is not replay-safe, so its demo keeps the cache warm. +# Storage providers run with the smallest cache they support instead. +WORKFLOW_CACHE = int(os.environ.get("STREAMS_WORKFLOW_CACHE", "512")) + + +async def open() -> tuple[str, dict]: + return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), {"provider": NAME} diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py new file mode 100644 index 000000000..027a95103 --- /dev/null +++ b/streams_demo/run_demo.py @@ -0,0 +1,154 @@ +"""Run the shared agent loop against whichever provider is configured. + +Three cases, the same on both providers: + +- read, decide, publish and an ordinary Activity in the same workflow task, + with the smallest workflow cache the provider supports, so that as much of + the run as it allows is rebuilt rather than remembered; +- a producer whose second attempt supersedes its first, which the reader has + to report and the workflow has to act on; +- an outside consumer reading what the workflow published. + +Byte-identical in both trees. ``provider_setup`` is what differs, and it is +the only import here that names a provider. +""" + +from __future__ import annotations + +import asyncio +import json +from pathlib import Path +import sys +import time +import uuid +from typing import Any + +from temporalio import streams +from temporalio.api.enums.v1 import EventType +from temporalio.client import Client +from temporalio.worker import Worker + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 +import provider_setup # noqa: E402 + +DECISION_LIMIT = 8 +EXPECTED_OUTPUT = 6 + + +async def collect_output(client: Client, workflow_id: str, want: int) -> list[dict]: + reader = await streams.consumer(client, workflow_id=workflow_id) + seen: list[dict] = [] + async for record in reader.read(type=dict, topic="decisions"): + seen.append({"kind": record.kind.name, "value": record.value}) + if len(seen) >= want: + break + return seen + + +async def main() -> int: + out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" + out.mkdir(exist_ok=True) + target, options = await provider_setup.open() + client = await Client.connect(target, namespace="default") + streams.configure(**options) + + uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex + record: dict[str, Any] = { + "provider": provider_setup.NAME, + "workflow_id": uid, + "target": target, + "max_cached_workflows": provider_setup.WORKFLOW_CACHE, + } + + async with Worker( + client, + task_queue=uid, + workflows=[AgentLoop], + activities=[record_decision], + max_cached_workflows=provider_setup.WORKFLOW_CACHE, + **streams.worker_options(), + ): + handle = await client.start_workflow( + AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid + ) + output = asyncio.create_task(collect_output(client, uid, EXPECTED_OUTPUT)) + + # The first attempt writes two records and then stops, as a failed + # activity would. The second writes different inputs under the same + # logical producer, which is what the reader has to report. + first = await streams.producer( + client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=1 + ) + await first.append({"id": "r1", "value": 1}, {"id": "r2", "value": 2}) + await asyncio.sleep(0.5) + second = await streams.producer( + client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=2 + ) + await second.append({"id": "r3", "value": 3}, {"id": "r4", "value": 4}) + await second.finish() + + # A failed Workflow Task is not an outcome. The server rejects a + # completion that raced newly buffered events, and the retry usually + # gets through, so reading the first failure as the result reports a + # working run as a broken one. Wait for a terminal event, then report + # the retries separately so they are neither the headline nor hidden. + deadline = time.monotonic() + 120 + # Taken from the enum rather than written out, because guessing these + # numbers is how a run that completed gets reported as terminated. + terminal = { + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: "completed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: "workflow_failed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: "execution_timed_out", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: "canceled", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: "terminated", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: "continued_as_new", + } + while time.monotonic() < deadline: + history = await handle.fetch_history() + reached = [ + terminal[e.event_type] + for e in history.events + if e.event_type in terminal + ] + if reached: + record["outcome"] = reached[-1] + if record["outcome"] == "completed": + record["trace"] = await handle.result() + break + await asyncio.sleep(0.1) + else: + record["outcome"] = "timed_out_waiting" + history = await handle.fetch_history() + + retried = [ + e + for e in history.events + if e.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_FAILED + ] + record["task_failures"] = [ + { + "event_id": e.event_id, + "cause": int(e.workflow_task_failed_event_attributes.cause), + "message": e.workflow_task_failed_event_attributes.failure.message, + } + for e in retried + ] + + try: + record["observed_output"] = await asyncio.wait_for(output, timeout=20) + except asyncio.TimeoutError: + output.cancel() + record["observed_output"] = "timed_out" + + history = await handle.fetch_history() + record["history_events"] = len(history.events) + (out / "history.json").write_text(history.to_json()) + await provider_setup.close() + (out / "results.json").write_text(json.dumps(record, indent=2) + "\n") + print(json.dumps(record, indent=2)) + return 0 if record["outcome"] == "completed" else 1 + + +if __name__ == "__main__": + sys.exit(asyncio.run(main())) From ccae2b46b309cf49a7d2fb5fffda49398e8fc398 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 104/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- temporalio/streams/__init__.py | 4 +++ temporalio/streams/_provider.py | 57 ++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index a25c2bdca..699919ffe 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -57,8 +57,10 @@ StreamProvider, configure, consumer, + drain, open_read, open_write, + prepare, producer, worker_options, ) @@ -85,6 +87,8 @@ "WriteSink", "configure", "consumer", + "drain", + "prepare", "producer", "worker_options", "reader", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 58282cc55..48439d754 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -23,8 +23,10 @@ "StreamProvider", "configure", "consumer", + "drain", "open_read", "open_write", + "prepare", "producer", "register", "registered", @@ -121,6 +123,24 @@ async def consumer( """Open a reader for what ``workflow_id`` publishes.""" ... + def prepare(self) -> None: + """Install whatever this provider needs before the workflow runs. + + Optional. A provider that serves outside readers through handlers on + the workflow itself has to register them before the first task + completes, or a reader that arrives early finds nothing to talk to. + """ + ... + + def drain(self) -> None: + """Release anything this provider parked on the workflow's behalf. + + Optional. A provider that parks an outside reader against the running + workflow, as the Workflow Streams transport does with its long-poll + update, has to let go before the workflow can return. + """ + ... + _factories: dict[str, Callable[[], StreamProvider]] = {} _active: StreamProvider | None = None @@ -159,9 +179,18 @@ def configure(provider: str | None = None, **options: Any) -> None: ``provider`` may be omitted when exactly one provider is registered. """ global _active + _active = instance(provider, **options) + + +def instance(provider: str | None = None, **options: Any) -> StreamProvider: + """A configured provider that is not installed as the process default. + + For code that serves one provider while the process is configured with + another, such as a Nexus stream handler delegating to its store. + """ chosen = _make(provider) chosen.configure(**options) - _active = chosen + return chosen def _current() -> StreamProvider: @@ -193,6 +222,32 @@ def open_write(topic: str) -> WriteSink: return _current().open_write(topic) +def prepare() -> None: + """Let the provider install what it needs, before the workflow runs. + + Call it from the workflow's constructor. It is a no-op on providers that + need nothing, so workflow code can call it unconditionally and stay + portable. + """ + provider = _current() + install = getattr(provider, "prepare", None) + if install is not None: + install() + + +def drain() -> None: + """Release anything the provider parked on this workflow's behalf. + + Call it before a workflow that read a stream returns. It is a no-op on + providers that park nothing, so workflow code can call it unconditionally + and stay portable. + """ + provider = _current() + release = getattr(provider, "drain", None) + if release is not None: + release() + + async def producer( client: Any, *, From 8926913e29716b022a57d20738f7b79dda3f327c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 105/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/__init__.py | 25 ++++++----- temporalio/streams/_provider.py | 55 +++++++++++++++++++---- temporalio/streams/_record.py | 4 +- temporalio/streams/providers/memory.py | 20 ++++++--- tests/streams/test_streams_conformance.py | 40 ++++++++++++++++- 5 files changed, 115 insertions(+), 29 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 699919ffe..aaf0a444d 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -12,12 +12,16 @@ it found nothing, is committed with the commands that reading produced. Recovery re-supplies the same records in the same order. 3. **Anything that does I/O publishes on its own account.** An activity, a - local activity, or an outside process writes through :func:`producer`, and - its records are visible as soon as they are written. It carries a producer - id, an attempt and a sequence so a retry can be told from a new generation. -4. **A cursor is opaque and belongs to its provider.** Hand it back to resume. - Do not compare two cursors or do arithmetic on one: one provider numbers - records with integers and another with a millisecond-and-sequence pair. + local activity, or an outside process writes through :func:`producer`, + either into one of the workflow's inbound streams or onto a topic of the + stream the workflow publishes, and its records are visible as soon as they + are written. It carries a producer id, an attempt and a sequence so a retry + can be told from a new generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume + after the record it names. Do not compare two cursors or do arithmetic on + one: one provider numbers records with integers and another with a + millisecond-and-sequence pair. A reader that wants to follow from now asks + the consumer for :meth:`Consumer.latest` instead of guessing a position. 5. **A workflow names its streams relative to itself, and the provider resolves them.** ``reader("inputs")`` is this workflow's inbound stream called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One @@ -103,7 +107,7 @@ def reader( *, type: type | None = None, topic: str | None = None, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> StreamReader[Any]: """Subscribe this workflow to its inbound stream ``stream``. @@ -116,14 +120,15 @@ def reader( stream: The inbound stream's name, relative to this workflow. type: The value type, used as the decode hint. topic: Only records on this topic, or every topic when omitted. - start: Where to start. Only honoured on the first subscription of a - run, because after that the recorded cursor decides. + after: Resume after this record. Only honoured on the first + subscription of a run, because after that the recorded cursor + decides. idle_timeout: How long the workflow waits with nothing arriving before the provider is allowed to release the worker. ``None`` takes the provider's default. """ return StreamReader( - open_read(stream, start=start, idle_timeout=idle_timeout), + open_read(stream, after=after, idle_timeout=idle_timeout), topic=topic, type=type, ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 48439d754..c224b47bf 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -62,11 +62,28 @@ class Consumer(Protocol): def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive.""" + """Yield the records after ``after`` as they arrive. + + ``BEGINNING`` yields everything the stream retains. Any other cursor + came from a record this or another reader saw, and reading resumes + just past it, so a reader that stores the last cursor it handled and + hands it back sees every record exactly once. + """ + ... + + async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the newest record, or ``BEGINNING`` when there is none. + + For a reader that wants to follow from now: ``read(after=latest())`` + yields only what is published after this call returned, which is how + a client that is about to send a message positions itself before + sending, without the workflow having to report a position. ``topic`` + is for the provider that keeps each topic in its own store. + """ ... @@ -95,7 +112,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: """Subscribe the running workflow to its inbound stream ``stream``.""" @@ -110,11 +127,18 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> Producer: - """Open a producer for ``workflow_id``'s inbound stream ``stream``.""" + """Open a producer that appends on ``workflow_id``'s account. + + ``stream`` names one of the workflow's inbound streams. With no + ``stream``, ``topic`` names a topic on the stream the workflow itself + publishes, which is how an activity puts its live output next to the + workflow's own records for the same outside reader. + """ ... async def consumer( @@ -210,11 +234,11 @@ def worker_options() -> dict[str, Any]: def open_read( stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: """Subscribe the running workflow to its inbound stream ``stream``.""" - return _current().open_read(stream, start=start, idle_timeout=idle_timeout) + return _current().open_read(stream, after=after, idle_timeout=idle_timeout) def open_write(topic: str) -> WriteSink: @@ -252,15 +276,28 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> Producer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``.""" + """Open a producer that appends on ``workflow_id``'s account. + + Name either an inbound ``stream`` of the workflow, or a ``topic`` on the + stream the workflow publishes. Inside an activity, leave ``producer_id`` + and ``attempt`` unset: the activity's own id and attempt are the right + answer, and they are what let a reader tell a retry from a new generation. + """ + if bool(stream) == bool(topic): + raise ValueError( + "name exactly one of stream (an inbound stream of the workflow) or " + "topic (a topic on the stream the workflow publishes)" + ) return await _current().producer( client, workflow_id=workflow_id, stream=stream, + topic=topic, producer_id=producer_id, attempt=attempt, ) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index d458ef0c4..4fd322189 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -50,8 +50,8 @@ class Cursor: Opaque on purpose. One provider numbers records with integers and another with a millisecond-and-sequence pair, so comparing tokens here would be - right for one and wrong for the other. Hand a cursor back to resume from - it; ask the reader to compare two. + right for one and wrong for the other. Hand a cursor back to resume after + the record it names; nothing here advances one. """ token: str diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 808a84f13..477a17b68 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -204,12 +204,12 @@ def __init__(self, store: _MemoryStream, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - offset = int(start.token) if start.token else 0 + offset = int(after.token) + 1 if after.token else 0 while True: await self._store.wait_past(offset) frames = self._store.frames @@ -238,6 +238,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one store per stream, so the position is topic-independent + count = len(self._store.frames) + return Cursor(str(count - 1)) if count else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -268,13 +273,13 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: store = _stream(_inbound_id(workflow.info().workflow_id, stream)) return _MemReadSource( store, - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, idle_timeout or self._poll, ) @@ -287,7 +292,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> MemoryProducer: @@ -296,10 +302,12 @@ async def producer( producer_id = activity.info().activity_id attempt = attempt or activity.info().attempt + # With no inbound stream named, the target is the store the workflow's + # own writer appends to, and the frame carries the topic instead. return MemoryProducer( _stream(_inbound_id(workflow_id, stream)), _converter(client), - stream, + stream or topic, producer_id, attempt, ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index d01132851..978ef5ca1 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -152,13 +152,49 @@ async def test_cursor_resumes_where_it_points(): consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") records = await take(consumer.read(type=dict), 3) - checkpoint = records[1].cursor + checkpoint = records[0].cursor + # Resuming after a record hands back everything past it and nothing + # twice, without the reader ever advancing a cursor itself. resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") - again = await take(resumed.read(type=dict, start=checkpoint), 2) + again = await take(resumed.read(type=dict, after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] +async def test_latest_positions_a_reader_at_the_end(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + assert await consumer.latest() == streams.BEGINNING + + await producer.append({"n": 1}, {"n": 2}) + since = await consumer.latest() + await producer.append({"n": 3}) + + # A reader that positioned itself before the last append sees only what + # came after, which is how a client follows a turn it is about to start. + records = await take(consumer.read(type=dict, after=since), 1) + assert [r.value for r in records] == [{"n": 3}] + + +async def test_producer_appends_onto_the_owners_topic(): + # An activity's live output lands on the same topic the workflow + # publishes, so one outside reader follows both. + producer = await streams.producer( + None, workflow_id="wf", topic="events", producer_id="model", attempt=1 + ) + await producer.append({"delta": "hel"}, {"delta": "lo"}) + + consumer = await streams.consumer(None, workflow_id="wf") + records = await take(consumer.read(type=dict, topic="events"), 2) + assert [r.value["delta"] for r in records] == ["hel", "lo"] + assert {r.producer for r in records} == {"model"} + + with pytest.raises(ValueError): + await streams.producer(None, workflow_id="wf", producer_id="model", attempt=1) + + def test_unknown_provider_is_a_clear_error(): with pytest.raises(RuntimeError, match="no stream provider 'nope'"): streams.configure(provider="nope") From 8e36829b37803bc7dcd725e860a8ff9ab28bb4b4 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:37:39 -0700 Subject: [PATCH 106/831] Sorted and formatted the streams package for ruff. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and the new files were written by hand. --- streams_demo/agent_loop.py | 10 ++++++---- streams_demo/run_demo.py | 4 ++-- temporalio/streams/__init__.py | 7 ++++++- temporalio/streams/_provider.py | 3 +-- temporalio/streams/providers/memory.py | 11 +++++++++-- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index afbb7ea4c..e68bb0a58 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -29,7 +29,11 @@ async def record_decision(decision: dict[str, Any]) -> str: def decide(token: dict[str, Any]) -> dict[str, Any]: """The decision the workflow is here to make.""" if token["value"] % 2 == 0: - return {"source": token["id"], "branch": "even", "computed": token["value"] * 10} + return { + "source": token["id"], + "branch": "even", + "computed": token["value"] * 10, + } return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} @@ -39,9 +43,7 @@ class AgentLoop: @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: - inputs = streams.reader( - INPUTS, type=dict, idle_timeout=timedelta(seconds=1) - ) + inputs = streams.reader(INPUTS, type=dict, idle_timeout=timedelta(seconds=1)) decisions = streams.writer(DECISIONS) trace: list[dict[str, Any]] = [] accepted = 0 diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 027a95103..687dc1a05 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -17,10 +17,10 @@ import asyncio import json -from pathlib import Path import sys import time import uuid +from pathlib import Path from typing import Any from temporalio import streams @@ -29,8 +29,8 @@ from temporalio.worker import Worker sys.path.insert(0, str(Path(__file__).resolve().parent)) -from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 import provider_setup # noqa: E402 +from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 DECISION_LIMIT = 8 EXPECTED_OUTPUT = 6 diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index aaf0a444d..caaa03ffb 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -54,7 +54,12 @@ from datetime import timedelta from typing import Any, TypeVar -from temporalio.streams._handles import ReadSource, StreamReader, StreamWriter, WriteSink +from temporalio.streams._handles import ( + ReadSource, + StreamReader, + StreamWriter, + WriteSink, +) from temporalio.streams._provider import ( Consumer, Producer, diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index c224b47bf..a36339a97 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -186,8 +186,7 @@ def _make(name: str | None) -> StreamProvider: name = next(iter(_factories)) else: raise RuntimeError( - "name a provider: configure(provider=...) with one of " - f"{registered()}" + f"name a provider: configure(provider=...) with one of {registered()}" ) factory = _factories.get(name) if factory is None: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 477a17b68..fb2712350 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -131,7 +131,12 @@ class MemoryProducer: """The outside producer, faithful to the contract.""" def __init__( - self, store: _MemoryStream, converter: Any, topic: str, producer_id: str, attempt: int + self, + store: _MemoryStream, + converter: Any, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._store = store self._converter = converter @@ -147,7 +152,9 @@ def attempt(self) -> int: @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: From a62702275b4b2c53e1c432b99491ac124f1c5195 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:37:53 -0700 Subject: [PATCH 107/831] Added the changelog entry for the stream interface. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f016f34ff..568f64b4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,11 @@ to include examples, links to docs, or any other relevant information. ### Added - Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. +- **Experimental**: `temporalio.streams` defines one stream interface a workflow + can read, decide on, and write, with a registry that picks the provider when + the worker is built. `temporalio.streams.providers.memory` is the in-memory + reference provider the conformance tests run against. + ### Changed ### Deprecated From 0fbac2951e3c6292070a15ecb5aca85a7488d6ce Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:48:04 -0700 Subject: [PATCH 108/831] Made the streams package pass the type and doc linters. `prepare` and `drain` are hooks only a transport that parks something against the running workflow needs, so they move to their own protocol rather than making every provider carry two empty methods. The demo's teardown called a `close` that no provider setup defined. --- streams_demo/agent_loop.py | 1 + streams_demo/provider_setup.py | 10 +++++++++ streams_demo/run_demo.py | 2 ++ temporalio/streams/__init__.py | 6 +++++- temporalio/streams/_policy.py | 1 + temporalio/streams/_provider.py | 25 +++++++++++++++++------ temporalio/streams/providers/memory.py | 7 +++++++ tests/streams/test_streams_conformance.py | 2 +- 8 files changed, 46 insertions(+), 8 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index e68bb0a58..f3f39dca9 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -43,6 +43,7 @@ class AgentLoop: @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: + """Decide on at most ``limit`` inputs, then return the trace.""" inputs = streams.reader(INPUTS, type=dict, idle_timeout=timedelta(seconds=1)) decisions = streams.writer(DECISIONS) trace: list[dict[str, Any]] = [] diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index 81e7108e5..52ebbd266 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -18,4 +18,14 @@ async def open() -> tuple[str, dict]: + """The server to connect to and the options :func:`configure` takes.""" return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), {"provider": NAME} + + +async def close() -> None: + """Let go of whatever :func:`open` acquired. + + Nothing here: the memory provider holds no connection. A provider branch + that opens one closes it here, so the demo's teardown reads the same on + every provider. + """ diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 687dc1a05..9d6a62cb5 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -37,6 +37,7 @@ async def collect_output(client: Client, workflow_id: str, want: int) -> list[dict]: + """Read ``want`` decisions off the workflow's stream from outside it.""" reader = await streams.consumer(client, workflow_id=workflow_id) seen: list[dict] = [] async for record in reader.read(type=dict, topic="decisions"): @@ -47,6 +48,7 @@ async def collect_output(client: Client, workflow_id: str, want: int) -> list[di async def main() -> int: + """Run the demo once and write what happened next to this file.""" out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" out.mkdir(exist_ok=True) target, options = await provider_setup.open() diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index caaa03ffb..cd55ee9d4 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -64,6 +64,7 @@ Consumer, Producer, StreamProvider, + StreamProviderLifecycle, configure, consumer, drain, @@ -89,6 +90,7 @@ "ReadSource", "RecordKind", "StreamProvider", + "StreamProviderLifecycle", "StreamReader", "StreamRecord", "StreamWriter", @@ -154,4 +156,6 @@ def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: # Importing the package registers every provider whose dependencies are # present in this tree. Import order matters: the registry above must exist # before a provider module can register with it. -from temporalio.streams import providers as _providers # noqa: E402,F401 +from temporalio.streams import ( + providers as _providers, # noqa: E402,F401 # pyright: ignore[reportUnusedImport] +) diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py index 24e20ab2f..73114bbdb 100644 --- a/temporalio/streams/_policy.py +++ b/temporalio/streams/_policy.py @@ -26,6 +26,7 @@ class AttemptTracker: """Watches producer attempts on one subscription.""" def __init__(self) -> None: + """Start with no producer seen.""" self._attempts: dict[str, int] = {} def note( diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index a36339a97..18e2bb983 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -21,6 +21,7 @@ "Consumer", "Producer", "StreamProvider", + "StreamProviderLifecycle", "configure", "consumer", "drain", @@ -96,6 +97,9 @@ class StreamProvider(Protocol): outside pair (:meth:`producer`, :meth:`consumer`) runs anywhere and moves framed bytes. A transport-only provider may serve just the outside pair and raise on the workflow side, naming the provider a worker should use. + + A provider whose transport parks something against the running workflow + also implements :class:`StreamProviderLifecycle`. """ name: str @@ -147,21 +151,30 @@ async def consumer( """Open a reader for what ``workflow_id`` publishes.""" ... + +class StreamProviderLifecycle(Protocol): + """The hooks a provider adds when it needs the workflow's own lifetime. + + Separate from :class:`StreamProvider` because most transports need + neither, and a provider is not asked to carry a pair of empty methods to + say so. :func:`prepare` and :func:`drain` call whichever half is present. + """ + def prepare(self) -> None: """Install whatever this provider needs before the workflow runs. - Optional. A provider that serves outside readers through handlers on - the workflow itself has to register them before the first task - completes, or a reader that arrives early finds nothing to talk to. + A provider that serves outside readers through handlers on the + workflow itself has to register them before the first task completes, + or a reader that arrives early finds nothing to talk to. """ ... def drain(self) -> None: """Release anything this provider parked on the workflow's behalf. - Optional. A provider that parks an outside reader against the running - workflow, as the Workflow Streams transport does with its long-poll - update, has to let go before the workflow can return. + A provider that parks an outside reader against the running workflow, + as the Workflow Streams transport does with its long-poll update, has + to let go before the workflow can return. """ ... diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index fb2712350..f7e58ef44 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -138,6 +138,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on ``store``.""" self._store = store self._converter = converter self._topic = topic @@ -147,6 +148,7 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property @@ -158,6 +160,7 @@ def _provider_id(self) -> str: ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last one.""" frames = [] for value in values: frames.append( @@ -179,6 +182,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor(str(offset)) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._topic, kind=RecordKind.FINISH, @@ -205,6 +209,7 @@ class MemoryConsumer: """The outside reader, with the shared supersession rule.""" def __init__(self, store: _MemoryStream, converter: Any) -> None: + """Read whatever ``store`` holds, now and as it grows.""" self._store = store self._converter = converter @@ -215,6 +220,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() offset = int(after.token) + 1 if after.token else 0 while True: @@ -246,6 +252,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one store per stream, so the position is topic-independent count = len(self._store.frames) return Cursor(str(count - 1)) if count else BEGINNING diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 978ef5ca1..0c7818064 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -22,7 +22,7 @@ @pytest.fixture(autouse=True) -def _fresh_memory_provider(): +def _fresh_memory_provider(): # pyright: ignore[reportUnusedFunction] memory.reset() streams.configure(provider="memory") yield From 6b8b35ed68d9d1cb2839acf491f418c23b4ec87f Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:22:04 -0700 Subject: [PATCH 109/831] Made the demo call the provider lifecycle hooks. A transport that serves outside readers through handlers on the workflow registers them in `prepare`, so without the call an outside reader finds no handler and the demo's follow fails against that provider. --- streams_demo/agent_loop.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index f3f39dca9..79d92c367 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -41,6 +41,15 @@ def decide(token: dict[str, Any]) -> dict[str, Any]: class AgentLoop: """Read, decide, write, until the producer says it has finished.""" + def __init__(self) -> None: + """Let the provider install what it needs before the first task. + + A no-op except on a transport that serves outside readers through + handlers on this workflow, which has to register them before the + first task completes or an early reader finds nothing to talk to. + """ + streams.prepare() + @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: """Decide on at most ``limit`` inputs, then return the trace.""" @@ -92,4 +101,7 @@ async def run(self, limit: int) -> list[dict[str, Any]]: finally: inputs.close() await decisions.finish() + # Lets go of anything the provider parked against this run, so a + # transport that holds a long poll open can let the workflow return. + streams.drain() return trace From 01b0919e7ca98fbda015f9278e257c071850a499 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 110/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From 2101fba654717414b470f8b585ff12448f48836a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 111/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From 0f48505809ddf4af989f53b3a4e08a365d056796 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 112/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- .../streams/providers/workflow_streams.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From 3e3151734b5bad97eb3952e6acf7bddc46a6367a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 113/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- .../streams/providers/workflow_streams.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) From 1ffad3c80b44f8eeba4567f1d0f471d718408cc1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 114/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From 0c3d50f9d8bf4a31c5f4f0a465dee1f084f3f932 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 115/831] Made the Workflow Streams provider pass the linters. The transport already resolves its payload converter and falls back to the default when it holds no client, so the provider asks it rather than reaching through a client that may not be there. --- .../streams/providers/workflow_streams.py | 13 ++++++-- .../streams/test_workflow_streams_provider.py | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d849f1244..656056381 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -186,6 +186,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to one stream or topic on ``handle``.""" self._handle = handle self._converter = converter self._stream = stream @@ -205,15 +206,19 @@ def _shipped_topic(self) -> str: @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the shipped publish Signal.""" entries = [] for value in values: frame = _frame.encode( @@ -230,6 +235,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor("") async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._frame_topic, kind=RecordKind.FINISH, @@ -274,6 +280,7 @@ def __init__( shipped_topic: str | None, poll_cooldown: timedelta, ) -> None: + """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client self._shipped_topic = shipped_topic self._poll_cooldown = poll_cooldown @@ -285,6 +292,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -362,6 +370,7 @@ def _record( return out async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one log per workflow, whatever the topic head = await self._client.get_offset() return Cursor(str(head - 1)) if head > 0 else BEGINNING @@ -369,7 +378,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._client.data_converter.payload_converter + converter = self._client._payload_converter() if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2b491cbf1..612aaa33d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -12,6 +12,7 @@ import asyncio import os import uuid +from typing import Any import pytest @@ -62,7 +63,7 @@ async def run(self) -> int: return seen -async def take(records, count: int, timeout: float = 30.0) -> list: +async def take(records: Any, count: int, timeout: float = 30.0) -> list: out: list = [] async def _collect() -> None: @@ -77,9 +78,7 @@ async def _collect() -> None: async def test_interface_loop_over_workflow_streams(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -119,9 +118,7 @@ async def test_interface_loop_over_workflow_streams(): async def test_retried_producer_dedupes_and_new_attempt_supersedes(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -135,19 +132,28 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): ) first = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await first.append({"n": 1}) # The retry of the same attempt re-sends its first batch. retry = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await retry.append({"n": 1}) second = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=2, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=2, ) await second.append({"n": 2}) From 17ed5b173fb8776ef2c3b117b700facb1f99ca3a Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 116/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 568f64b4b..735c27ddf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,10 @@ to include examples, links to docs, or any other relevant information. can read, decide on, and write, with a registry that picks the provider when the worker is built. `temporalio.streams.providers.memory` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 591dba5bfe0f999c2d6bf7ceb12b8bc534aa2156 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 117/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 82f726911869b86b8a9cf4f7ac08bd07840548fb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 118/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From ecf4b2b6583069659b5de35bbb668e9d0bcef10a Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 119/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From 371409d5ced29c93356f14c099d30410e3bc6432 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 120/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 735c27ddf..c0f2f8b61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From 4bfe42e270903274594583f74bc3a14fc9697ae7 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 121/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From 105ad9be663064cd7d68f6e22cdf6dd33359e34d Mon Sep 17 00:00:00 2001 From: Brian Strauch Date: Mon, 14 Sep 2026 17:34:56 -0700 Subject: [PATCH 122/831] Support google-genai 2.21 file downloads (#1865) --- CHANGELOG.md | 78 +++++++++++++++++++ pyproject.toml | 2 +- .../contrib/google_genai/_gemini_activity.py | 6 +- temporalio/contrib/google_genai/_models.py | 1 + .../google_genai/_temporal_async_client.py | 8 +- .../contrib/google_genai/_temporal_files.py | 64 +++++++++++++-- tests/contrib/google_genai/test_gemini.py | 28 +++++++ uv.lock | 8 +- 8 files changed, 179 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73c8bc320..796548c8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,84 @@ to include examples, links to docs, or any other relevant information. through `ExternalOutputStreamClient`. Workflow output is staged outside History and becomes readable only after its compact Workflow Task marker is committed. +### Changed + +- Standalone Activities are now generally available (GA). (Standalone Activities as Nexus operations + and Standalone Activities operator commands remain experimental. Operator commands are `pause`, + `unpause`, `updateOptions`, `restoreOriginal`.) +- System Nexus Signal-with-Start Workflow operations now use the typed + `WorkflowOutboundInterceptor.start_signal_with_start_workflow` interception point instead of + the generic `WorkflowOutboundInterceptor.start_nexus_operation` method. +- System Nexus Signal-with-Start Workflow operations now invoke + `WorkflowOutboundInterceptor.start_system_nexus_operation` after their typed interception + point. They continue not to invoke `WorkflowOutboundInterceptor.start_nexus_operation`. +- The experimental `GetNexusOperationResultInput` now includes the Nexus endpoint, service, and + operation. + +### :boom: Breaking Changes + +- Experimental external storage: `ExternalStorage.driver_selector` is now called with a + `StorageDriverSelectContext` instead of a `StorageDriverStoreContext`. Update the annotation; + the new type carries the same `target` field. Since selectors are plain callables, a stale + annotation fails type checking rather than at runtime. +- `client.ActivityExecution` and `client.ActivityExecutionDescription` had some fields removed or renamed + to match RPC API. + - Dataclass parameters for these types were changed to `frozen=True, eq=False, kw_only=True`. + - `scheduled_time` was renamed `schedule_time`. + - `last_failure` was changed from field to method that runs data converter on demand. + - `state_transition_count`, `eager_execution_requested`, `paused` and `long_poll_token` were removed. +- ActivityHandle.describe() long-poll token was removed. The functionality can still be used manually + through raw gRPC API. + +### Fixed + +- `temporalio.contrib.google_genai` now requires `google-genai` 2.21.0 or later + and supports its file download API, including video inputs and download + destinations. +- `temporalio.contrib.deepagents` no longer dedups repeated identical tool, + model, and backend-op calls: each dispatch runs its own Activity, and the + continue-as-new result cache is retired for new executions (a continued run + resumes from the carried transcript and never re-executes prior dispatches, + so a carried cache entry could only serve stale results). Patch-gated + (`deepagents.retire-result-cache`), so histories recorded before this change + replay unchanged; note that deferring the patch keeps the full legacy dedup + cache — including the stale-result behavior this entry describes — and that + a chain upgraded mid-continue-as-new re-executes rather than reuses a + repeated identical call (the conservative direction). +- `contrib.deepagents`: summarization middleware configured with a model name string now routes its LLM calls through Activities instead of running them in the Workflow. + +- **Experimental**: External storage metrics now report the wall-clock time storage was in flight. + Previously each batch's duration was summed, over-reporting the time whenever storage operations + ran concurrently. +- System Nexus Signal-with-Start workflow operations now give custom payload + converters the target workflow's serialization context when encoding their + inner request payloads. +- Cancelling an activity from a signal while the workflow itself is cancelled + no longer causes a nondeterminism error from duplicate activity-cancellation + commands. +- `StrandsPlugin` now disables Botocore retries for its default Bedrock model so + model request retries are handled exclusively by Temporal. +- `temporalio.contrib.openai_agents` now honors the `retry-after-ms` and + `retry-after` headers when OpenAI returns `x-should-retry: true`. Previously + the delay the server asked for was discarded on that path and the activity + retried on its configured interval instead. +- Nexus-context workflow/activity starts no longer set `on_conflict_options` when there are no links + or callbacks to attach. +- The workflow sandbox now passes `pydantic_core` through by default, alongside `pydantic`. + +## [1.32.0] - 2026-08-24 + +### Added + +- Added `temporalio.converter.create_payload_validation_error` to create the + non-retryable application error used when a converted payload fails validation. +- Added experimental `temporalio.contrib.opentelemetry.ReplaySafeMeterProvider` and + `ReplaySafeLoggerProvider` (and exported `ReplaySafeTracerProvider`): wrap an + OpenTelemetry provider so metrics and log events recorded from workflow code (e.g. by + Google ADK) are not duplicated on replay. `GoogleAdkPlugin` warns when a global OTel + provider is not replay-safe. +- Added `LoggingConfig.format` to select compact, pretty, or newline-delimited JSON output for + Core logs written to the console. - Added the `Runtime(disable_environment_info=...)` option to control whether runtime, hosting, and platform information is included in worker heartbeats. diff --git a/pyproject.toml b/pyproject.toml index a6ef530b9..b3f69c9c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ lambda-worker-otel = [ "opentelemetry-sdk-extension-aws>=2.0.0,<3", ] aioboto3 = ["aioboto3>=10.4.0", "types-aioboto3[s3]>=10.4.0"] -google-genai = ["google-genai>=2.10.0,<3.0.0"] +google-genai = ["google-genai>=2.21.0,<3.0.0"] strands-agents = ["strands-agents>=1.39.0"] [project.urls] diff --git a/temporalio/contrib/google_genai/_gemini_activity.py b/temporalio/contrib/google_genai/_gemini_activity.py index 496bbf1ab..dde83bfff 100644 --- a/temporalio/contrib/google_genai/_gemini_activity.py +++ b/temporalio/contrib/google_genai/_gemini_activity.py @@ -198,10 +198,12 @@ async def gemini_files_upload( @activity.defn async def gemini_files_download( req: _GeminiDownloadFileRequest, - ) -> bytes: + ) -> bytes | None: """Download a file using the real genai.Client on the worker.""" return await self._client.aio.files.download( - file=req.file, config=req.config + file=req.file, + destination=req.destination, + config=req.config, ) @activity.defn diff --git a/temporalio/contrib/google_genai/_models.py b/temporalio/contrib/google_genai/_models.py index 2f70d9b4d..21caa8d39 100644 --- a/temporalio/contrib/google_genai/_models.py +++ b/temporalio/contrib/google_genai/_models.py @@ -100,6 +100,7 @@ class _GeminiDownloadFileRequest(BaseModel): """Serializable activity input for a file download.""" file: str + destination: str | None = None config: types.DownloadFileConfig | None = None diff --git a/temporalio/contrib/google_genai/_temporal_async_client.py b/temporalio/contrib/google_genai/_temporal_async_client.py index c77cd5cee..c9abfd988 100644 --- a/temporalio/contrib/google_genai/_temporal_async_client.py +++ b/temporalio/contrib/google_genai/_temporal_async_client.py @@ -255,13 +255,19 @@ def __init__( # Closure-wrap bound-method tools so google-genai's internal # config deep-copy (>= 2.8.0) can't clone the workflow instance. self._models = _TemporalAsyncModels(api_client) - self._files = TemporalAsyncFiles(api_client, activity_config) + self._temporal_files = TemporalAsyncFiles(api_client, activity_config) + self._files = self._temporal_files self._file_search_stores = TemporalAsyncFileSearchStores( api_client, activity_config ) self._temporal_interactions = TemporalAsyncInteractions(activity_config) self._temporal_agents = TemporalAsyncAgents(activity_config) + @property + def files(self) -> TemporalAsyncFiles: + """Temporal-aware files resource; operations run as activities.""" + return self._temporal_files + @property def interactions( # type: ignore[override] self, diff --git a/temporalio/contrib/google_genai/_temporal_files.py b/temporalio/contrib/google_genai/_temporal_files.py index f785c00cb..c2f3a3f53 100644 --- a/temporalio/contrib/google_genai/_temporal_files.py +++ b/temporalio/contrib/google_genai/_temporal_files.py @@ -11,7 +11,7 @@ import io import os from datetime import timedelta -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, overload if TYPE_CHECKING: import google.auth.credentials @@ -100,12 +100,31 @@ async def upload( **act_config, ) + @overload async def download( self, *, - file: str | types.File, + file: str | types.File | types.Video | types.GeneratedVideo, + destination: None = None, config: types.DownloadFileConfigOrDict | None = None, - ) -> bytes: + ) -> bytes: ... + + @overload + async def download( + self, + *, + file: str | types.File | types.Video | types.GeneratedVideo, + destination: str | os.PathLike[str] | io.IOBase, + config: types.DownloadFileConfigOrDict | None = None, + ) -> None: ... + + async def download( + self, + *, + file: str | types.File | types.Video | types.GeneratedVideo, + destination: str | os.PathLike[str] | io.IOBase | None = None, + config: types.DownloadFileConfigOrDict | None = None, + ) -> bytes | None: """Download a file via a Temporal activity.""" act_config: ActivityConfig = {**self._activity_config} if "summary" not in act_config: @@ -119,19 +138,48 @@ async def download( download_config = config _validate_http_options(download_config.http_options) - if isinstance(file, types.File): - if not file.name: - raise ValueError("File object must have a name to download.") + if isinstance(file, types.GeneratedVideo): + file_video = file.video + file_name = file_video.uri if file_video is not None else None + elif isinstance(file, types.Video): + file_name = file.uri + elif isinstance(file, types.File): file_name = file.name else: file_name = file + if not file_name: + raise ValueError("File name is required.") + + if isinstance(destination, io.IOBase): + destination_stream = destination + destination_path = None + elif destination is not None: + destination_stream = None + destination_path = os.fspath(destination) + else: + destination_stream = None + destination_path = None - return await temporal_workflow.execute_activity( + data = await temporal_workflow.execute_activity( "gemini_files_download", - _GeminiDownloadFileRequest(file=file_name, config=download_config), + _GeminiDownloadFileRequest( + file=file_name, + destination=destination_path, + config=download_config, + ), result_type=bytes, **act_config, ) + if destination_stream is not None: + destination_stream.write(data) + return None + if destination_path is not None: + return None + if isinstance(file, types.Video): + file.video_bytes = data + elif isinstance(file, types.GeneratedVideo) and file.video is not None: + file.video.video_bytes = data + return data async def register_files( self, diff --git a/tests/contrib/google_genai/test_gemini.py b/tests/contrib/google_genai/test_gemini.py index 0881f63b3..d48e554e9 100644 --- a/tests/contrib/google_genai/test_gemini.py +++ b/tests/contrib/google_genai/test_gemini.py @@ -742,6 +742,16 @@ async def run(self, file_name: str) -> bytes: return await client.files.download(file=file_name) +@workflow.defn +class FileDownloadToPathWorkflow: + """Workflow that downloads a file to a path on the activity worker.""" + + @workflow.run + async def run(self, file_name: str, destination: str) -> None: + client = TemporalAsyncClient() + await client.files.download(file=file_name, destination=destination) + + @workflow.defn class FileSearchStoreUploadWorkflow: """Workflow that uploads to a file search store.""" @@ -1251,6 +1261,24 @@ async def test_file_download(client: Client): assert result == b"fake file content" +async def test_file_download_to_path(client: Client): + """Download destinations are passed to the activity worker.""" + new_client, api_tracker = apply_plugin(client, []) + + async with new_worker(new_client, FileDownloadToPathWorkflow) as worker: + await new_client.execute_workflow( + FileDownloadToPathWorkflow.run, + args=["files/some-file", "/tmp/downloaded-file"], + id=f"gemini-file-download-to-path-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + + assert len(api_tracker.file_download_requests) == 1 + request = api_tracker.file_download_requests[0] + assert request.file == "files/some-file" + assert request.destination == "/tmp/downloaded-file" + + # =========================================================================== # File search store upload tests # =========================================================================== diff --git a/uv.lock b/uv.lock index 9c625ed14..df077d1e8 100644 --- a/uv.lock +++ b/uv.lock @@ -1354,7 +1354,7 @@ requests = [ [[package]] name = "google-genai" -version = "2.11.0" +version = "2.21.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1368,9 +1368,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/01/e7b5f3aac89200c78318ed7643401e7f5ed3131b0cd353c07483606b1e61/google_genai-2.11.0.tar.gz", hash = "sha256:4c5e524d24b145c96be327f9a7f8f04b0fe4efee0533877795e9848afed01749", size = 622366, upload-time = "2026-07-09T17:49:43.862Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/a7/a45f64f22ab9302b55fcbeb32acb6f313690a7748629b01e451aad1817a3/google_genai-2.21.0.tar.gz", hash = "sha256:0ecc11c6a5b9f5e3cc58e77ae5fead00c6719f8a1b2b654b803f514a9a6b64c0", size = 677301, upload-time = "2026-08-31T21:49:14.508Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/ef/d296c23390160a8b0b1dafb36dd3cb36a39ed40c81cd27e04e6233334186/google_genai-2.11.0-py3-none-any.whl", hash = "sha256:5bc8186100e1d34d691fbe0cba392b7e04e98d286ca952323a6672d054accf95", size = 984162, upload-time = "2026-07-09T17:49:42.15Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/c2419dd5fedd5803ce09810e4e39561a0a13a960b3f48d2581c12e42af3e/google_genai-2.21.0-py3-none-any.whl", hash = "sha256:36b575034be46a03acd603a852e22a6359f2cdd6b26bb1d65d9b7e0cc7ab3648", size = 1080223, upload-time = "2026-08-31T21:49:12.699Z" }, ] [[package]] @@ -4820,7 +4820,7 @@ requires-dist = [ { name = "aioboto3", marker = "extra == 'aioboto3'", specifier = ">=10.4.0" }, { name = "deepagents", marker = "python_full_version >= '3.11' and extra == 'deepagents'", specifier = ">=0.6.12,<0.7" }, { name = "google-adk", marker = "extra == 'google-adk'", specifier = ">=2.2.0,<3" }, - { name = "google-genai", marker = "extra == 'google-genai'", specifier = ">=2.10.0,<3.0.0" }, + { name = "google-genai", marker = "extra == 'google-genai'", specifier = ">=2.21.0,<3.0.0" }, { name = "grpcio", marker = "extra == 'grpc'", specifier = ">=1.48.2,<2" }, { name = "langchain", marker = "python_full_version >= '3.11' and extra == 'deepagents'", specifier = ">=1.3.11,<2" }, { name = "langchain-core", marker = "python_full_version >= '3.11' and extra == 'deepagents'", specifier = ">=1.4.8,<2" }, From e69ad055a5b302e5c34bfb645e22cc14fd04f0f5 Mon Sep 17 00:00:00 2001 From: Brian Strauch Date: Mon, 31 Aug 2026 08:17:37 -0700 Subject: [PATCH 123/831] Fix tests with latest dependencies (#1798) * Support Google ADK 2.7 streaming import * Fix tests with latest dependencies * Apply suggestion from @brianstrauch --- tests/contrib/google_adk_agents/test_adk_streaming.py | 7 ++++++- tests/contrib/google_genai/test_gemini.py | 8 ++++---- tests/nexus/test_temporal_system_nexus.py | 11 ++++------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/tests/contrib/google_adk_agents/test_adk_streaming.py b/tests/contrib/google_adk_agents/test_adk_streaming.py index 30aecd9f4..d426990bb 100644 --- a/tests/contrib/google_adk_agents/test_adk_streaming.py +++ b/tests/contrib/google_adk_agents/test_adk_streaming.py @@ -12,7 +12,12 @@ import pytest from google.adk import Agent -from google.adk.agents.run_config import RunConfig, StreamingMode + +# ADK 2.7 marks StreamingMode as a private re-export. +from google.adk.agents.run_config import ( + RunConfig, + StreamingMode, # pyright: ignore[reportPrivateImportUsage] +) from google.adk.models import BaseLlm, LLMRegistry from google.adk.models.llm_request import LlmRequest from google.adk.models.llm_response import LlmResponse diff --git a/tests/contrib/google_genai/test_gemini.py b/tests/contrib/google_genai/test_gemini.py index d48e554e9..d87d37675 100644 --- a/tests/contrib/google_genai/test_gemini.py +++ b/tests/contrib/google_genai/test_gemini.py @@ -292,8 +292,8 @@ async def gemini_file_search_stores_upload( self, req: _GeminiUploadToFileSearchStoreRequest ) -> types.UploadToFileSearchStoreOperation: self.file_search_store_upload_requests.append(req) - return types.UploadToFileSearchStoreOperation.model_construct( - name="operations/test-op", + return types.UploadToFileSearchStoreOperation.model_validate( + {"name": "operations/test-op"} ) @activity.defn @@ -1415,8 +1415,8 @@ async def _gen(): ) gemini.aio.files.download = AsyncMock(return_value=b"mock download content") # type: ignore[method-assign] gemini.aio.file_search_stores.upload_to_file_search_store = AsyncMock( # type: ignore[method-assign] - return_value=types.UploadToFileSearchStoreOperation.model_construct( - name="operations/mock-op" + return_value=types.UploadToFileSearchStoreOperation.model_validate( + {"name": "operations/mock-op"} ) ) diff --git a/tests/nexus/test_temporal_system_nexus.py b/tests/nexus/test_temporal_system_nexus.py index ff6b36e41..b6c711128 100644 --- a/tests/nexus/test_temporal_system_nexus.py +++ b/tests/nexus/test_temporal_system_nexus.py @@ -343,13 +343,10 @@ def _proto_scalar_sample(field: FieldDescriptor, *, path: str) -> Any: def _field_is_repeated(field: FieldDescriptor) -> bool: - return bool( - getattr( - field, - "is_repeated", - getattr(field, "label") == FieldDescriptor.LABEL_REPEATED, - ) - ) + is_repeated = getattr(field, "is_repeated", None) + if is_repeated is not None: + return bool(is_repeated) + return getattr(field, "label") == FieldDescriptor.LABEL_REPEATED @pytest.mark.parametrize( From 914ee40b73bb008a2348ec3ad648c2f82a94e8d0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:57:16 -0700 Subject: [PATCH 124/831] Adopted main's Nexus system API generator script. The branch's own copy shells out to a binary name the nexgen crate does not install, so generation died before it could diff anything. --- scripts/gen_nexus_system_api.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/scripts/gen_nexus_system_api.py b/scripts/gen_nexus_system_api.py index 7ac1bd2de..e57ca03b3 100644 --- a/scripts/gen_nexus_system_api.py +++ b/scripts/gen_nexus_system_api.py @@ -35,15 +35,28 @@ / "v1" / "request_response.proto" ) +NEX_GEN_VERSION = "0.2.4" def nex_gen_command() -> list[str]: if bin_path := os.environ.get("NEX_GEN_BIN"): return [bin_path] - if shutil.which("nex-gen") is None: - subprocess.check_call(["cargo", "install", "--locked", "nex-gen", "--force"]) - return ["nex-gen"] + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] def build_descriptor_set(descriptor_path: Path) -> None: @@ -114,13 +127,11 @@ def generate_nexus_system_api() -> None: subprocess.check_call( [ *command, - "generate", - "--lang", "python", - "--input", str(wit_path), - "--input", str(wit_deps_dir), + "--native-api", + "--system-nexus", "--support-file", str(python_support_path), "--descriptors", From 14b504284a61de65780ada199cdb7e47c4ab9e14 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 21:12:17 -0700 Subject: [PATCH 125/831] Loosened the status error's response annotation. Under the latest dependency set openai carries its own httpx as httpx2, so pyright will not accept the httpx.Response the test builds. Going through the class object was tried first and did not silence it. --- tests/contrib/openai_agents/test_openai.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/contrib/openai_agents/test_openai.py b/tests/contrib/openai_agents/test_openai.py index 25597ee55..0baae0e6f 100644 --- a/tests/contrib/openai_agents/test_openai.py +++ b/tests/contrib/openai_agents/test_openai.py @@ -1431,8 +1431,16 @@ def status_error(status: int): import httpx raise APIStatusError( message="Something went wrong.", - response=httpx.Response( - status_code=status, request=httpx.Request("GET", url="") + # Under the latest dependency set openai carries its own httpx + # as `httpx2`, so the parameter's `Response` is a different + # class from the one built here and the two are not assignable. + # Only the annotation differs; openai reads the object the same + # way either way. + response=cast( + Any, + httpx.Response( + status_code=status, request=httpx.Request("GET", url="") + ), ), body=None, ) From c4bed86bad249faad85031ac7b897f5ed87bc904 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 21:36:27 -0700 Subject: [PATCH 126/831] Held the external stream suite off the time-skipping server. The same suite on the same Core is 673 passed and 0 failed against a dev server, and fails under time skipping. Which cases fail drifts between fourteen and seventeen across runs, so the suite is held as a whole rather than by a list of names that was never stable. --- .../external_workflow_streams/conftest.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/contrib/external_workflow_streams/conftest.py b/tests/contrib/external_workflow_streams/conftest.py index d6e8483c0..dd1128b9f 100644 --- a/tests/contrib/external_workflow_streams/conftest.py +++ b/tests/contrib/external_workflow_streams/conftest.py @@ -16,6 +16,25 @@ import pytest import pytest_asyncio +from temporalio.testing import WorkflowEnvironment + + +@pytest.fixture(autouse=True) +def skip_under_time_skipping(env: WorkflowEnvironment) -> None: + """Hold this suite to a server whose clock the tests can reason about. + + These cases measure real-server timing: how long a Workflow Task was held + open, the interval a wake sweep runs on, the deadline a shutdown waits out. + The time-skipping server advances the clock whenever workers go idle, which + removes exactly the quantities being measured, so the failures it produces + say nothing about the feature. Which cases fail drifts run to run, between + fourteen and seventeen of them, which is why the whole suite is held rather + than a list of names. The ordinary dev-server step still runs all of it. + """ + if env.supports_time_skipping: + pytest.skip("this suite measures real-server timing; see conftest") + + DEFAULT_REDIS_URL = "redis://127.0.0.1:6379" #: Every key this suite creates starts with this, so a leaked key is From d1d573251c36c07463fa51cfe37e3494699e688e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:32:29 -0700 Subject: [PATCH 127/831] Repinned Core to the finalized combined branch. That branch carries the upstream merge the current bridge needs and the nexus model WIT alignment the generator needs. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 9cc07b5ff..02c0792fd 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 9cc07b5ff8625a839afccecf3a5e939a39a54293 +Subproject commit 02c0792fdb55a0a66dffa1615b3b4c2a95f295e6 From fcaadb450031e6aee711c581f2cd6e53913c4bcf Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:35:48 -0700 Subject: [PATCH 128/831] Regenerated the bridge protos from the repinned Core. The generated module was missing the local-activity marker argument flag its own stub already declared, so the two disagreed about the message. --- .../workflow_commands_pb2.py | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 8facd5fff..4f3e0a9bf 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -51,7 +51,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xe7\x15\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xe7\x15\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -626,8 +626,8 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 10514 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 10602 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 10553 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 10641 _WORKFLOWCOMMAND._serialized_start = 609 _WORKFLOWCOMMAND._serialized_end = 3400 _WORKFLOWSTREAMPROGRESS._serialized_start = 3402 @@ -661,57 +661,57 @@ _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5349 _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5428 _SCHEDULELOCALACTIVITY._serialized_start = 5431 - _SCHEDULELOCALACTIVITY._serialized_end = 6181 + _SCHEDULELOCALACTIVITY._serialized_end = 6220 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5349 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5428 - _REQUESTCANCELACTIVITY._serialized_start = 6183 - _REQUESTCANCELACTIVITY._serialized_end = 6219 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 6221 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 6262 - _QUERYRESULT._serialized_start = 6265 - _QUERYRESULT._serialized_end = 6421 - _QUERYSUCCESS._serialized_start = 6423 - _QUERYSUCCESS._serialized_end = 6488 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 6490 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 6566 - _FAILWORKFLOWEXECUTION._serialized_start = 6568 - _FAILWORKFLOWEXECUTION._serialized_end = 6642 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6645 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7559 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7402 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7478 + _REQUESTCANCELACTIVITY._serialized_start = 6222 + _REQUESTCANCELACTIVITY._serialized_end = 6258 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 6260 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 6301 + _QUERYRESULT._serialized_start = 6304 + _QUERYRESULT._serialized_end = 6460 + _QUERYSUCCESS._serialized_start = 6462 + _QUERYSUCCESS._serialized_end = 6527 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 6529 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 6605 + _FAILWORKFLOWEXECUTION._serialized_start = 6607 + _FAILWORKFLOWEXECUTION._serialized_end = 6681 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6684 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7598 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7441 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7517 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5349 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5428 - _CANCELWORKFLOWEXECUTION._serialized_start = 7561 - _CANCELWORKFLOWEXECUTION._serialized_end = 7637 - _SETPATCHMARKER._serialized_start = 7639 - _SETPATCHMARKER._serialized_end = 7693 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7696 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8870 + _CANCELWORKFLOWEXECUTION._serialized_start = 7600 + _CANCELWORKFLOWEXECUTION._serialized_end = 7676 + _SETPATCHMARKER._serialized_start = 7678 + _SETPATCHMARKER._serialized_end = 7732 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7735 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8909 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5349 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5428 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7402 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7478 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8872 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8946 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8949 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9091 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9094 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9493 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7441 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7517 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8911 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8985 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8988 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9130 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9133 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9532 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5349 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5428 - _CANCELSIGNALWORKFLOW._serialized_start = 9495 - _CANCELSIGNALWORKFLOW._serialized_end = 9530 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9532 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9633 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 9635 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 9714 - _UPDATERESPONSE._serialized_start = 9717 - _UPDATERESPONSE._serialized_end = 9927 - _SCHEDULENEXUSOPERATION._serialized_start = 9930 - _SCHEDULENEXUSOPERATION._serialized_end = 10468 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10418 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10468 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 10470 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 10512 + _CANCELSIGNALWORKFLOW._serialized_start = 9534 + _CANCELSIGNALWORKFLOW._serialized_end = 9569 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9571 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9672 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 9674 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 9753 + _UPDATERESPONSE._serialized_start = 9756 + _UPDATERESPONSE._serialized_end = 9966 + _SCHEDULENEXUSOPERATION._serialized_start = 9969 + _SCHEDULENEXUSOPERATION._serialized_end = 10507 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10457 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10507 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 10509 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 10551 # @@protoc_insertion_point(module_scope) From b85e912aa0e8cd0029c5e196dc9aa15d840e6a0a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 17 Sep 2026 00:09:26 -0700 Subject: [PATCH 129/831] Repaired the changelog the merges had split. A merge spliced the Unreleased and released boundary, duplicating a released section and cutting one entry in half. The file is now upstream's with this stack's entries under Unreleased. --- CHANGELOG.md | 108 ++++++--------------------------------------------- 1 file changed, 12 insertions(+), 96 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a5e57639..f65a4f732 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,21 +18,6 @@ to include examples, links to docs, or any other relevant information. ## [Unreleased] -### Fixed - -- Preserve empty activations in the shared External Workflow Streams input and - output replay schedule. Workflows that read input, publish decisions, and - schedule Activities now reproduce that schedule during replay. Inconsistent - prerelease markers are rejected explicitly rather than guessing where omitted - activations belonged. -- Resume external input waits when cold replay encounters a wake in an already - loaded History page, including Workers with workflow caching disabled. -- Avoid an unnecessary output replacement Workflow Task after stream input has - resumed the Workflow and it is waiting on an Activity or timer. -- Keep an incomplete retained external stream task alive when workflow caching - is disabled; evict it after its normal task boundary instead of repeatedly - interrupting input readiness with shutdown markers. - ### Added - **Experimental**: `temporalio.streams` defines one stream interface a workflow @@ -57,86 +42,6 @@ to include examples, links to docs, or any other relevant information. through `ExternalOutputStreamClient`. Workflow output is staged outside History and becomes readable only after its compact Workflow Task marker is committed. -### Changed - -- Standalone Activities are now generally available (GA). (Standalone Activities as Nexus operations - and Standalone Activities operator commands remain experimental. Operator commands are `pause`, - `unpause`, `updateOptions`, `restoreOriginal`.) -- System Nexus Signal-with-Start Workflow operations now use the typed - `WorkflowOutboundInterceptor.start_signal_with_start_workflow` interception point instead of - the generic `WorkflowOutboundInterceptor.start_nexus_operation` method. -- System Nexus Signal-with-Start Workflow operations now invoke - `WorkflowOutboundInterceptor.start_system_nexus_operation` after their typed interception - point. They continue not to invoke `WorkflowOutboundInterceptor.start_nexus_operation`. -- The experimental `GetNexusOperationResultInput` now includes the Nexus endpoint, service, and - operation. - -### :boom: Breaking Changes - -- Experimental external storage: `ExternalStorage.driver_selector` is now called with a - `StorageDriverSelectContext` instead of a `StorageDriverStoreContext`. Update the annotation; - the new type carries the same `target` field. Since selectors are plain callables, a stale - annotation fails type checking rather than at runtime. -- `client.ActivityExecution` and `client.ActivityExecutionDescription` had some fields removed or renamed - to match RPC API. - - Dataclass parameters for these types were changed to `frozen=True, eq=False, kw_only=True`. - - `scheduled_time` was renamed `schedule_time`. - - `last_failure` was changed from field to method that runs data converter on demand. - - `state_transition_count`, `eager_execution_requested`, `paused` and `long_poll_token` were removed. -- ActivityHandle.describe() long-poll token was removed. The functionality can still be used manually - through raw gRPC API. - -### Fixed - -- `temporalio.contrib.google_genai` now requires `google-genai` 2.21.0 or later - and supports its file download API, including video inputs and download - destinations. -- `temporalio.contrib.deepagents` no longer dedups repeated identical tool, - model, and backend-op calls: each dispatch runs its own Activity, and the - continue-as-new result cache is retired for new executions (a continued run - resumes from the carried transcript and never re-executes prior dispatches, - so a carried cache entry could only serve stale results). Patch-gated - (`deepagents.retire-result-cache`), so histories recorded before this change - replay unchanged; note that deferring the patch keeps the full legacy dedup - cache — including the stale-result behavior this entry describes — and that - a chain upgraded mid-continue-as-new re-executes rather than reuses a - repeated identical call (the conservative direction). -- `contrib.deepagents`: summarization middleware configured with a model name string now routes its LLM calls through Activities instead of running them in the Workflow. - -- **Experimental**: External storage metrics now report the wall-clock time storage was in flight. - Previously each batch's duration was summed, over-reporting the time whenever storage operations - ran concurrently. -- System Nexus Signal-with-Start workflow operations now give custom payload - converters the target workflow's serialization context when encoding their - inner request payloads. -- Cancelling an activity from a signal while the workflow itself is cancelled - no longer causes a nondeterminism error from duplicate activity-cancellation - commands. -- `StrandsPlugin` now disables Botocore retries for its default Bedrock model so - model request retries are handled exclusively by Temporal. -- `temporalio.contrib.openai_agents` now honors the `retry-after-ms` and - `retry-after` headers when OpenAI returns `x-should-retry: true`. Previously - the delay the server asked for was discarded on that path and the activity - retried on its configured interval instead. -- Nexus-context workflow/activity starts no longer set `on_conflict_options` when there are no links - or callbacks to attach. -- The workflow sandbox now passes `pydantic_core` through by default, alongside `pydantic`. - -## [1.32.0] - 2026-08-24 - -### Added - -- Added `temporalio.converter.create_payload_validation_error` to create the - non-retryable application error used when a converted payload fails validation. -- Added experimental `temporalio.contrib.opentelemetry.ReplaySafeMeterProvider` and - `ReplaySafeLoggerProvider` (and exported `ReplaySafeTracerProvider`): wrap an - OpenTelemetry provider so metrics and log events recorded from workflow code (e.g. by - Google ADK) are not duplicated on replay. `GoogleAdkPlugin` warns when a global OTel - provider is not replay-safe. -- Added `LoggingConfig.format` to select compact, pretty, or newline-delimited JSON output for - Core logs written to the console. - - reference provider the conformance tests run against. - **Experimental**: server-side streams. A workflow reads a stream the server delivers on its Workflow Tasks and publishes with a command, through `temporalio.workflow.read_stream`, `subscribe_stream` and @@ -151,7 +56,6 @@ to include examples, links to docs, or any other relevant information. - **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream through the endpoint and never names the store. - - Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. ### Changed @@ -161,6 +65,18 @@ to include examples, links to docs, or any other relevant information. ### Fixed +- Preserve empty activations in the shared External Workflow Streams input and + output replay schedule. Workflows that read input, publish decisions, and + schedule Activities now reproduce that schedule during replay. Inconsistent + prerelease markers are rejected explicitly rather than guessing where omitted + activations belonged. +- Resume external input waits when cold replay encounters a wake in an already + loaded History page, including Workers with workflow caching disabled. +- Avoid an unnecessary output replacement Workflow Task after stream input has + resumed the Workflow and it is waiting on an Activity or timer. +- Keep an incomplete retained external stream task alive when workflow caching + is disabled; evict it after its normal task boundary instead of repeatedly + interrupting input readiness with shutdown markers. - Current workflow and activity payload converter accessors now return the configured converter without SDK-internal transfer type conversion. From 86dc631d4a8ab62b9a7423bcf11b75829177ddac Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:08:51 -0700 Subject: [PATCH 130/831] Gave each mock tool call its own id. A script that drives two tool calls handed both invocations the same completed id, which the Agents SDK now rejects outright rather than tolerating. This diverges from upstream, which still hands out a constant there; unique ids are strictly more correct for a builder handing out completed call ids, so the right long-term home is upstream rather than here. --- temporalio/contrib/openai_agents/testing.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/temporalio/contrib/openai_agents/testing.py b/temporalio/contrib/openai_agents/testing.py index 110ca20b7..3367a81e1 100644 --- a/temporalio/contrib/openai_agents/testing.py +++ b/temporalio/contrib/openai_agents/testing.py @@ -1,5 +1,6 @@ """Testing utilities for OpenAI agents.""" +import uuid from collections.abc import AsyncIterator, Callable, Sequence from typing import Any @@ -73,7 +74,9 @@ def tool_call(arguments: str, name: str) -> ModelResponse: return ResponseBuilders.model_response( ResponseFunctionToolCall( arguments=arguments, - call_id="call", + # A script that calls two tools hands the same completed id to + # two invocations, which the Agents SDK now rejects. + call_id=f"call-{uuid.uuid4()}", name=name, type="function_call", id="id", From c27c62070f9ef99d24396b5034867cd3e5f1b30f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:21:03 -0700 Subject: [PATCH 131/831] Repinned Core to the finalized external repairs branch. That branch now matches upstream's nexus model WIT for the workflow-id policies, which is what the current generator needs. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 975bf0e96..31af05354 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 975bf0e96a9951d7279886be7d837bf09376f617 +Subproject commit 31af05354330bb88a8b1e1f598bde1ddddae1d85 From 6b34091892a7a3bba5b2bbc4dabfc7ac74b2ab74 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:54:00 -0700 Subject: [PATCH 132/831] Regenerated the Nexus system API from the repinned Core. The generator needs its matching support file and the upstream lint exclusions, so both came across with it. One test asserted the old model's field names; the only consumers of that model outside the generated package are a generated re-export in temporalio.workflow and three package-level helpers, none of which touch those fields. --- pyproject.toml | 5 + scripts/nex_gen_support.py | 93 +++++- .../nexus/system/workflow_service/__init__.py | 37 ++- .../workflow_service/_resources/__init__.py | 5 - .../workflow_service/_support/__init__.py | 2 +- .../_support/nex_gen_support.py | 93 +++++- .../_system_nexus_interceptor.py | 95 ++++++ .../nexus/system/workflow_service/models.py | 297 +++++++++++++++--- .../workflow_service/operations/__init__.py | 2 +- .../operations/signal_with_start_workflow.py | 209 ++++++------ .../{service.py => services.py} | 11 +- tests/nexus/test_temporal_system_nexus.py | 9 +- 12 files changed, 669 insertions(+), 189 deletions(-) delete mode 100644 temporalio/nexus/system/workflow_service/_resources/__init__.py create mode 100644 temporalio/nexus/system/workflow_service/_system_nexus_interceptor.py rename temporalio/nexus/system/workflow_service/{service.py => services.py} (58%) diff --git a/pyproject.toml b/pyproject.toml index b3f69c9c2..70f3d2c97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -188,8 +188,13 @@ exclude = [ # Ignore generated code 'temporalio/api', 'temporalio/bridge/proto', + 'temporalio/nexus/system/workflow_service', ] +[[tool.mypy.overrides]] +module = "temporalio.nexus.system.workflow_service.*" +ignore_errors = true + [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 diff --git a/scripts/nex_gen_support.py b/scripts/nex_gen_support.py index 58b51e263..fad21151e 100644 --- a/scripts/nex_gen_support.py +++ b/scripts/nex_gen_support.py @@ -10,6 +10,12 @@ import temporalio.api.workflow.v1 import temporalio.common import temporalio.converter +import temporalio.nexus.system + + +class SignalWithStartWorkflowModelRequest(typing.Protocol): + namespace: str + id: str def retry_policy_from_proto( @@ -52,6 +58,12 @@ def workflow_type_to_proto( return common_pb2.WorkflowType(name=workflow_function_name(workflow_type)) +def workflow_type_from_proto( + proto: common_pb2.WorkflowType, +) -> str: + return proto.name + + def task_queue_from_proto( proto: taskqueue_pb2.TaskQueue, ) -> str: @@ -70,12 +82,33 @@ def workflow_namespace() -> str: return info().namespace +def signal_with_start_workflow_serialization_context( + request: SignalWithStartWorkflowModelRequest, +) -> temporalio.converter.WorkflowSerializationContext: + return temporalio.converter.WorkflowSerializationContext( + namespace=request.namespace, + workflow_id=request.id, + ) + + def payloads_to_proto( values: collections.abc.Sequence[typing.Any], ) -> common_pb2.Payloads: - from temporalio.workflow import payload_converter + return ( + temporalio.nexus.system._current_user_payload_converter().to_payloads_wrapper( + values + ) + ) - return payload_converter().to_payloads_wrapper(values) + +def payloads_from_proto( + proto: common_pb2.Payloads, +) -> list[object]: + return list( + temporalio.nexus.system._current_user_payload_converter().from_payloads_wrapper( + proto + ) + ) def _clone_payload(payload: common_pb2.Payload) -> common_pb2.Payload: @@ -87,20 +120,23 @@ def _clone_payload(payload: common_pb2.Payload) -> common_pb2.Payload: def _value_to_payload(value: object | common_pb2.Payload) -> common_pb2.Payload: if isinstance(value, common_pb2.Payload): return _clone_payload(value) - from temporalio.workflow import payload_converter - - payloads = payload_converter().to_payloads_wrapper([value]) + payloads = ( + temporalio.nexus.system._current_user_payload_converter().to_payloads_wrapper( + [value] + ) + ) return _clone_payload(payloads.payloads[0]) def _payload_to_value(payload: common_pb2.Payload) -> object: wrapper = common_pb2.Payloads() wrapper.payloads.add().CopyFrom(payload) - from temporalio.workflow import payload_converter return typing.cast( object, - payload_converter().from_payloads_wrapper(wrapper)[0], + temporalio.nexus.system._current_user_payload_converter().from_payloads_wrapper( + wrapper + )[0], ) @@ -131,6 +167,21 @@ def memo_to_proto( return message +def header_from_proto( + proto: common_pb2.Header, +) -> collections.abc.Mapping[str, object]: + return {key: _payload_to_value(value) for key, value in proto.fields.items()} + + +def header_to_proto( + header: collections.abc.Mapping[str, object], +) -> common_pb2.Header: + message = common_pb2.Header() + for key, value in header.items(): + message.fields[key].CopyFrom(_value_to_payload(value)) + return message + + def duration_from_proto(proto: google.protobuf.duration_pb2.Duration) -> timedelta: return proto.ToTimedelta() @@ -177,6 +228,12 @@ def search_attributes_to_proto( return proto +def search_attributes_from_proto( + proto: common_pb2.SearchAttributes, +) -> temporalio.common.TypedSearchAttributes: + return temporalio.converter.decode_typed_search_attributes(proto) + + def priority_from_proto( proto: common_pb2.Priority, ) -> temporalio.common.Priority: @@ -193,3 +250,25 @@ def versioning_override_to_proto( versioning_override: temporalio.common.VersioningOverride, ) -> temporalio.api.workflow.v1.VersioningOverride: return versioning_override._to_proto() # pyright: ignore[reportPrivateUsage] + + +def versioning_override_from_proto( + proto: temporalio.api.workflow.v1.VersioningOverride, +) -> temporalio.common.VersioningOverride: + if proto.HasField("pinned") and proto.pinned.HasField("version"): + version = proto.pinned.version + return temporalio.common.PinnedVersioningOverride( + temporalio.common.WorkerDeploymentVersion( + deployment_name=version.deployment_name, + build_id=version.build_id, + ) + ) + if proto.pinned_version: + return temporalio.common.PinnedVersioningOverride( + temporalio.common.WorkerDeploymentVersion.from_canonical_string( + proto.pinned_version + ) + ) + if proto.auto_upgrade: + return temporalio.common.AutoUpgradeVersioningOverride() + raise ValueError("unknown versioning override proto shape") diff --git a/temporalio/nexus/system/workflow_service/__init__.py b/temporalio/nexus/system/workflow_service/__init__.py index 7c24fa125..8397ef186 100644 --- a/temporalio/nexus/system/workflow_service/__init__.py +++ b/temporalio/nexus/system/workflow_service/__init__.py @@ -1,8 +1,15 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations -from . import service as _service +import collections.abc +import typing + +import nexusrpc + +import temporalio.converter + +from . import services as _services from .operations.signal_with_start_workflow import signal_with_start_workflow __all__ = [ @@ -10,9 +17,33 @@ ] +_InputT = typing.TypeVar("_InputT") +_OutputT = typing.TypeVar("_OutputT") + + +_SerializationContextFactory = collections.abc.Callable[ + [_InputT], temporalio.converter.SerializationContext +] + + +class _NexusOperationInfo(typing.Generic[_InputT, _OutputT]): + def __init__( + self, + *, + operation: nexusrpc.Operation[_InputT, _OutputT], + serialization_context: _SerializationContextFactory[_InputT] | None = None, + ) -> None: + self.operation: nexusrpc.Operation[_InputT, _OutputT] = operation + self.serialization_context: _SerializationContextFactory[_InputT] | None = ( + serialization_context + ) + + __nexus_operation_registry__ = { ( "temporal.api.workflowservice.v1.WorkflowService", "SignalWithStartWorkflowExecution", - ): _service.WorkflowService.signal_with_start_workflow, + ): _NexusOperationInfo( + operation=_services.WorkflowService.signal_with_start_workflow, + ), } diff --git a/temporalio/nexus/system/workflow_service/_resources/__init__.py b/temporalio/nexus/system/workflow_service/_resources/__init__.py deleted file mode 100644 index 373efbd33..000000000 --- a/temporalio/nexus/system/workflow_service/_resources/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# Generated by nex-gen. DO NOT EDIT! - -from __future__ import annotations - -__all__ = [] diff --git a/temporalio/nexus/system/workflow_service/_support/__init__.py b/temporalio/nexus/system/workflow_service/_support/__init__.py index 530c33e80..6af0c0c56 100644 --- a/temporalio/nexus/system/workflow_service/_support/__init__.py +++ b/temporalio/nexus/system/workflow_service/_support/__init__.py @@ -1,4 +1,4 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations diff --git a/temporalio/nexus/system/workflow_service/_support/nex_gen_support.py b/temporalio/nexus/system/workflow_service/_support/nex_gen_support.py index 58b51e263..fad21151e 100644 --- a/temporalio/nexus/system/workflow_service/_support/nex_gen_support.py +++ b/temporalio/nexus/system/workflow_service/_support/nex_gen_support.py @@ -10,6 +10,12 @@ import temporalio.api.workflow.v1 import temporalio.common import temporalio.converter +import temporalio.nexus.system + + +class SignalWithStartWorkflowModelRequest(typing.Protocol): + namespace: str + id: str def retry_policy_from_proto( @@ -52,6 +58,12 @@ def workflow_type_to_proto( return common_pb2.WorkflowType(name=workflow_function_name(workflow_type)) +def workflow_type_from_proto( + proto: common_pb2.WorkflowType, +) -> str: + return proto.name + + def task_queue_from_proto( proto: taskqueue_pb2.TaskQueue, ) -> str: @@ -70,12 +82,33 @@ def workflow_namespace() -> str: return info().namespace +def signal_with_start_workflow_serialization_context( + request: SignalWithStartWorkflowModelRequest, +) -> temporalio.converter.WorkflowSerializationContext: + return temporalio.converter.WorkflowSerializationContext( + namespace=request.namespace, + workflow_id=request.id, + ) + + def payloads_to_proto( values: collections.abc.Sequence[typing.Any], ) -> common_pb2.Payloads: - from temporalio.workflow import payload_converter + return ( + temporalio.nexus.system._current_user_payload_converter().to_payloads_wrapper( + values + ) + ) - return payload_converter().to_payloads_wrapper(values) + +def payloads_from_proto( + proto: common_pb2.Payloads, +) -> list[object]: + return list( + temporalio.nexus.system._current_user_payload_converter().from_payloads_wrapper( + proto + ) + ) def _clone_payload(payload: common_pb2.Payload) -> common_pb2.Payload: @@ -87,20 +120,23 @@ def _clone_payload(payload: common_pb2.Payload) -> common_pb2.Payload: def _value_to_payload(value: object | common_pb2.Payload) -> common_pb2.Payload: if isinstance(value, common_pb2.Payload): return _clone_payload(value) - from temporalio.workflow import payload_converter - - payloads = payload_converter().to_payloads_wrapper([value]) + payloads = ( + temporalio.nexus.system._current_user_payload_converter().to_payloads_wrapper( + [value] + ) + ) return _clone_payload(payloads.payloads[0]) def _payload_to_value(payload: common_pb2.Payload) -> object: wrapper = common_pb2.Payloads() wrapper.payloads.add().CopyFrom(payload) - from temporalio.workflow import payload_converter return typing.cast( object, - payload_converter().from_payloads_wrapper(wrapper)[0], + temporalio.nexus.system._current_user_payload_converter().from_payloads_wrapper( + wrapper + )[0], ) @@ -131,6 +167,21 @@ def memo_to_proto( return message +def header_from_proto( + proto: common_pb2.Header, +) -> collections.abc.Mapping[str, object]: + return {key: _payload_to_value(value) for key, value in proto.fields.items()} + + +def header_to_proto( + header: collections.abc.Mapping[str, object], +) -> common_pb2.Header: + message = common_pb2.Header() + for key, value in header.items(): + message.fields[key].CopyFrom(_value_to_payload(value)) + return message + + def duration_from_proto(proto: google.protobuf.duration_pb2.Duration) -> timedelta: return proto.ToTimedelta() @@ -177,6 +228,12 @@ def search_attributes_to_proto( return proto +def search_attributes_from_proto( + proto: common_pb2.SearchAttributes, +) -> temporalio.common.TypedSearchAttributes: + return temporalio.converter.decode_typed_search_attributes(proto) + + def priority_from_proto( proto: common_pb2.Priority, ) -> temporalio.common.Priority: @@ -193,3 +250,25 @@ def versioning_override_to_proto( versioning_override: temporalio.common.VersioningOverride, ) -> temporalio.api.workflow.v1.VersioningOverride: return versioning_override._to_proto() # pyright: ignore[reportPrivateUsage] + + +def versioning_override_from_proto( + proto: temporalio.api.workflow.v1.VersioningOverride, +) -> temporalio.common.VersioningOverride: + if proto.HasField("pinned") and proto.pinned.HasField("version"): + version = proto.pinned.version + return temporalio.common.PinnedVersioningOverride( + temporalio.common.WorkerDeploymentVersion( + deployment_name=version.deployment_name, + build_id=version.build_id, + ) + ) + if proto.pinned_version: + return temporalio.common.PinnedVersioningOverride( + temporalio.common.WorkerDeploymentVersion.from_canonical_string( + proto.pinned_version + ) + ) + if proto.auto_upgrade: + return temporalio.common.AutoUpgradeVersioningOverride() + raise ValueError("unknown versioning override proto shape") diff --git a/temporalio/nexus/system/workflow_service/_system_nexus_interceptor.py b/temporalio/nexus/system/workflow_service/_system_nexus_interceptor.py new file mode 100644 index 000000000..c70b106db --- /dev/null +++ b/temporalio/nexus/system/workflow_service/_system_nexus_interceptor.py @@ -0,0 +1,95 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import abc +import typing + +from . import models + +if typing.TYPE_CHECKING: + import temporalio.workflow + from temporalio.worker._interceptor import StartNexusOperationInput + + +__all__ = [ + "_start_system_nexus_operation", + "_SystemNexusWorkflowOutboundInterceptorBase", + "_SystemNexusWorkflowOutboundInterceptorTerminal", +] + + +_InputT = typing.TypeVar("_InputT") +_OutputT = typing.TypeVar("_OutputT") + + +async def _start_system_nexus_operation( + interceptor: _SystemNexusWorkflowOutboundInterceptorBase, + input: StartNexusOperationInput[_InputT, _OutputT], +) -> temporalio.workflow.NexusOperationHandle[_OutputT]: + if ( + input.service == "temporal.api.workflowservice.v1.WorkflowService" + and input.operation_name == "SignalWithStartWorkflowExecution" + ): + typed_input = typing.cast( + "StartNexusOperationInput[models.SignalWithStartWorkflowRequest, models.SignalWithStartWorkflowResponse]", + input, + ) + # The dispatch check above establishes that this operation's response type is _OutputT. + return typing.cast( + "temporalio.workflow.NexusOperationHandle[_OutputT]", + await interceptor.start_signal_with_start_workflow(typed_input.input), + ) + raise ValueError( + f"unsupported System Nexus operation: {input.service}/{input.operation_name}" + ) + + +class _SystemNexusWorkflowOutboundInterceptorBase(abc.ABC): + @abc.abstractmethod + def _next_system_nexus_interceptor( + self, + ) -> _SystemNexusWorkflowOutboundInterceptorBase: ... + + async def start_signal_with_start_workflow( + self, request: models.SignalWithStartWorkflowRequest + ) -> temporalio.workflow.NexusOperationHandle[ + models.SignalWithStartWorkflowResponse + ]: + """Intercept the SignalWithStartWorkflow operation.""" + return await self._next_system_nexus_interceptor().start_signal_with_start_workflow( + request + ) + + +class _SystemNexusWorkflowOutboundInterceptorTerminal(abc.ABC): + @abc.abstractmethod + async def _intercept_system_nexus_operation( + self, + input: StartNexusOperationInput[_InputT, _OutputT], + ) -> temporalio.workflow.NexusOperationHandle[_OutputT]: ... + + async def start_signal_with_start_workflow( + self, request: models.SignalWithStartWorkflowRequest + ) -> temporalio.workflow.NexusOperationHandle[ + models.SignalWithStartWorkflowResponse + ]: + from temporalio.nexus.system import TEMPORAL_SYSTEM_ENDPOINT + from temporalio.worker._interceptor import StartNexusOperationInput + from temporalio.workflow import NexusOperationCancellationType + + return await self._intercept_system_nexus_operation( + StartNexusOperationInput( + endpoint=TEMPORAL_SYSTEM_ENDPOINT, + service="temporal.api.workflowservice.v1.WorkflowService", + operation="SignalWithStartWorkflowExecution", + input=request, + output_type=models.SignalWithStartWorkflowResponse, + schedule_to_close_timeout=None, + schedule_to_start_timeout=None, + start_to_close_timeout=None, + cancellation_type=NexusOperationCancellationType.WAIT_COMPLETED, + headers=None, + summary=None, + ) + ) diff --git a/temporalio/nexus/system/workflow_service/models.py b/temporalio/nexus/system/workflow_service/models.py index 05e1e3088..df3694863 100644 --- a/temporalio/nexus/system/workflow_service/models.py +++ b/temporalio/nexus/system/workflow_service/models.py @@ -1,4 +1,4 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations @@ -7,25 +7,39 @@ import datetime import typing +import typing_extensions + import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.workflowservice.v1.request_response_pb2 import temporalio.common +import temporalio.converter from ._support import ( + duration_from_proto, duration_to_proto, + memo_from_proto, memo_to_proto, payload_from_proto, payload_to_proto, + payloads_from_proto, payloads_to_proto, + priority_from_proto, priority_to_proto, + retry_policy_from_proto, retry_policy_to_proto, + search_attributes_from_proto, search_attributes_to_proto, signal_function_to_proto, + task_queue_from_proto, task_queue_to_proto, + versioning_override_from_proto, versioning_override_to_proto, + workflow_id_conflict_policy_from_proto, workflow_id_conflict_policy_to_proto, + workflow_id_reuse_policy_from_proto, workflow_id_reuse_policy_to_proto, workflow_namespace, + workflow_type_from_proto, workflow_type_to_proto, ) @@ -59,83 +73,262 @@ class SignalWithStartWorkflowRequest: versioning_override: temporalio.common.VersioningOverride | None = None start_delay: datetime.timedelta | None = None user_metadata: UserMetadata | None = None + namespace: str = dataclasses.field(default_factory=workflow_namespace) + - def to_proto( +class _SignalWithStartWorkflowRequestTransferTypeConverter( + temporalio.converter.TransferTypeConverter[ + SignalWithStartWorkflowRequest, + temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, + ] +): + transfer_type: ( + type[ + temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest + ] + | None + ) = temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest + + @typing_extensions.override + def from_transfer_type( self, + value: temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, + type_hint: type[SignalWithStartWorkflowRequest], + ) -> SignalWithStartWorkflowRequest: + if not value.HasField("workflow_type"): + raise ValueError( + "missing required field SignalWithStartWorkflowRequest.workflow" + ) + workflow = workflow_type_from_proto(value.workflow_type) + if not value.workflow_id: + raise ValueError("missing required field SignalWithStartWorkflowRequest.id") + id = value.workflow_id + if not value.HasField("task_queue"): + raise ValueError( + "missing required field SignalWithStartWorkflowRequest.task_queue" + ) + task_queue = task_queue_from_proto(value.task_queue) + if not value.signal_name: + raise ValueError( + "missing required field SignalWithStartWorkflowRequest.signal" + ) + signal = value.signal_name + return SignalWithStartWorkflowRequest( + workflow=workflow, + args=payloads_from_proto(value.input) if value.HasField("input") else None, + id=id, + task_queue=task_queue, + signal=signal, + signal_args=payloads_from_proto(value.signal_input) + if value.HasField("signal_input") + else None, + execution_timeout=duration_from_proto(value.workflow_execution_timeout) + if value.HasField("workflow_execution_timeout") + else None, + run_timeout=duration_from_proto(value.workflow_run_timeout) + if value.HasField("workflow_run_timeout") + else None, + task_timeout=duration_from_proto(value.workflow_task_timeout) + if value.HasField("workflow_task_timeout") + else None, + request_id=value.request_id if bool(value.request_id) else None, + id_reuse_policy=workflow_id_reuse_policy_from_proto( + value.workflow_id_reuse_policy + ), + id_conflict_policy=workflow_id_conflict_policy_from_proto( + value.workflow_id_conflict_policy + ) + if value.workflow_id_conflict_policy != 0 + else None, + retry_policy=retry_policy_from_proto(value.retry_policy) + if value.HasField("retry_policy") + else None, + cron_schedule=value.cron_schedule if bool(value.cron_schedule) else None, + memo=memo_from_proto(value.memo) if value.HasField("memo") else None, + search_attributes=search_attributes_from_proto(value.search_attributes) + if value.HasField("search_attributes") + else None, + priority=priority_from_proto(value.priority) + if value.HasField("priority") + else None, + versioning_override=versioning_override_from_proto( + value.versioning_override + ) + if value.HasField("versioning_override") + else None, + start_delay=duration_from_proto(value.workflow_start_delay) + if value.HasField("workflow_start_delay") + else None, + user_metadata=_UserMetadataTransferTypeConverter().from_transfer_type( + value.user_metadata, UserMetadata + ) + if value.HasField("user_metadata") + else None, + namespace=value.namespace, + ) + + @typing_extensions.override + def to_transfer_type( + self, + value: SignalWithStartWorkflowRequest, ) -> temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest: message = temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest() - message.workflow_type.CopyFrom(workflow_type_to_proto(self.workflow)) - if self.args is not None: - message.input.CopyFrom(payloads_to_proto(self.args)) - message.workflow_id = self.id - message.task_queue.CopyFrom(task_queue_to_proto(self.task_queue)) - message.signal_name = signal_function_to_proto(self.signal) - if self.signal_args is not None: - message.signal_input.CopyFrom(payloads_to_proto(self.signal_args)) - if self.execution_timeout is not None: + message.workflow_type.CopyFrom(workflow_type_to_proto(value.workflow)) + if value.args is not None: + message.input.CopyFrom(payloads_to_proto(value.args)) + message.workflow_id = value.id + message.task_queue.CopyFrom(task_queue_to_proto(value.task_queue)) + message.signal_name = signal_function_to_proto(value.signal) + if value.signal_args is not None: + message.signal_input.CopyFrom(payloads_to_proto(value.signal_args)) + if value.execution_timeout is not None: message.workflow_execution_timeout.CopyFrom( - duration_to_proto(self.execution_timeout) + duration_to_proto(value.execution_timeout) + ) + if value.run_timeout is not None: + message.workflow_run_timeout.CopyFrom(duration_to_proto(value.run_timeout)) + if value.task_timeout is not None: + message.workflow_task_timeout.CopyFrom( + duration_to_proto(value.task_timeout) ) - if self.run_timeout is not None: - message.workflow_run_timeout.CopyFrom(duration_to_proto(self.run_timeout)) - if self.task_timeout is not None: - message.workflow_task_timeout.CopyFrom(duration_to_proto(self.task_timeout)) - if self.request_id is not None: - message.request_id = self.request_id + if value.request_id is not None: + message.request_id = value.request_id message.workflow_id_reuse_policy = workflow_id_reuse_policy_to_proto( - self.id_reuse_policy + value.id_reuse_policy ) - if self.id_conflict_policy is not None: + if value.id_conflict_policy is not None: message.workflow_id_conflict_policy = workflow_id_conflict_policy_to_proto( - self.id_conflict_policy + value.id_conflict_policy ) - if self.retry_policy is not None: - message.retry_policy.CopyFrom(retry_policy_to_proto(self.retry_policy)) - if self.cron_schedule is not None: - message.cron_schedule = self.cron_schedule - if self.memo is not None: - message.memo.CopyFrom(memo_to_proto(self.memo)) - if self.search_attributes is not None: + if value.retry_policy is not None: + message.retry_policy.CopyFrom(retry_policy_to_proto(value.retry_policy)) + if value.cron_schedule is not None: + message.cron_schedule = value.cron_schedule + if value.memo is not None: + message.memo.CopyFrom(memo_to_proto(value.memo)) + if value.search_attributes is not None: message.search_attributes.CopyFrom( - search_attributes_to_proto(self.search_attributes) + search_attributes_to_proto(value.search_attributes) ) - if self.priority is not None: - message.priority.CopyFrom(priority_to_proto(self.priority)) - if self.versioning_override is not None: + if value.priority is not None: + message.priority.CopyFrom(priority_to_proto(value.priority)) + if value.versioning_override is not None: message.versioning_override.CopyFrom( - versioning_override_to_proto(self.versioning_override) + versioning_override_to_proto(value.versioning_override) ) - if self.start_delay is not None: - message.workflow_start_delay.CopyFrom(duration_to_proto(self.start_delay)) - if self.user_metadata is not None: - message.user_metadata.CopyFrom(self.user_metadata.to_proto()) - message.namespace = workflow_namespace() + if value.start_delay is not None: + message.workflow_start_delay.CopyFrom(duration_to_proto(value.start_delay)) + if value.user_metadata is not None: + message.user_metadata.CopyFrom( + _UserMetadataTransferTypeConverter().to_transfer_type( + value.user_metadata + ) + ) + message.namespace = value.namespace return message +_ = temporalio.converter.transfer_type_convertible( + _SignalWithStartWorkflowRequestTransferTypeConverter +)(SignalWithStartWorkflowRequest) + + @dataclasses.dataclass(slots=True) class UserMetadata: static_summary: typing.Any | None = None static_details: typing.Any | None = None - @classmethod - def from_proto( - cls, - proto: temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata, + +class _UserMetadataTransferTypeConverter( + temporalio.converter.TransferTypeConverter[ + UserMetadata, temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata + ] +): + transfer_type: type[temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata] | None = ( + temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata + ) + + @typing_extensions.override + def from_transfer_type( + self, + value: temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata, + type_hint: type[UserMetadata], ) -> UserMetadata: - return cls( - static_summary=payload_from_proto(proto.summary) - if proto.HasField("summary") + return UserMetadata( + static_summary=payload_from_proto(value.summary) + if value.HasField("summary") else None, - static_details=payload_from_proto(proto.details) - if proto.HasField("details") + static_details=payload_from_proto(value.details) + if value.HasField("details") else None, ) - def to_proto(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: + @typing_extensions.override + def to_transfer_type( + self, + value: UserMetadata, + ) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: message = temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata() - if self.static_summary is not None: - message.summary.CopyFrom(payload_to_proto(self.static_summary)) - if self.static_details is not None: - message.details.CopyFrom(payload_to_proto(self.static_details)) + if value.static_summary is not None: + message.summary.CopyFrom(payload_to_proto(value.static_summary)) + if value.static_details is not None: + message.details.CopyFrom(payload_to_proto(value.static_details)) + return message + + +_ = temporalio.converter.transfer_type_convertible(_UserMetadataTransferTypeConverter)( + UserMetadata +) + + +@dataclasses.dataclass(slots=True) +class SignalWithStartWorkflowResponse: + """ + .. warning:: + This API is experimental and subject to change. + """ + + run_id: str | None = None + started: bool | None = None + + +class _SignalWithStartWorkflowResponseTransferTypeConverter( + temporalio.converter.TransferTypeConverter[ + SignalWithStartWorkflowResponse, + temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, + ] +): + transfer_type: ( + type[ + temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse + ] + | None + ) = temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse + + @typing_extensions.override + def from_transfer_type( + self, + value: temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, + type_hint: type[SignalWithStartWorkflowResponse], + ) -> SignalWithStartWorkflowResponse: + return SignalWithStartWorkflowResponse( + run_id=value.run_id if bool(value.run_id) else None, + started=value.started if bool(value.started) else None, + ) + + @typing_extensions.override + def to_transfer_type( + self, + value: SignalWithStartWorkflowResponse, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse: + message = temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse() + if value.run_id is not None: + message.run_id = value.run_id + if value.started is not None: + message.started = value.started return message + + +_ = temporalio.converter.transfer_type_convertible( + _SignalWithStartWorkflowResponseTransferTypeConverter +)(SignalWithStartWorkflowResponse) diff --git a/temporalio/nexus/system/workflow_service/operations/__init__.py b/temporalio/nexus/system/workflow_service/operations/__init__.py index 67c9cc56b..28d71c338 100644 --- a/temporalio/nexus/system/workflow_service/operations/__init__.py +++ b/temporalio/nexus/system/workflow_service/operations/__init__.py @@ -1,3 +1,3 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations diff --git a/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py b/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py index 0865e5a88..9060fc11c 100644 --- a/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py +++ b/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py @@ -1,4 +1,4 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations @@ -8,7 +8,6 @@ import typing_extensions -import temporalio.api.workflowservice.v1.request_response_pb2 import temporalio.common if typing.TYPE_CHECKING: @@ -16,6 +15,7 @@ from ..models import ( SignalWithStartWorkflowRequest, + SignalWithStartWorkflowResponse, UserMetadata, ) @@ -33,15 +33,14 @@ async def _signal_with_start_workflow( get_external_workflow_handle, ) - request_proto = request.to_proto() nexus_client = create_nexus_client( service="temporal.api.workflowservice.v1.WorkflowService", endpoint="__temporal_system", ) handle = await nexus_client.start_operation( operation="SignalWithStartWorkflowExecution", - input=request_proto, - output_type=temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, + input=request, + output_type=SignalWithStartWorkflowResponse, ) result = await handle return get_external_workflow_handle(request.id, run_id=result.run_id) @@ -77,17 +76,17 @@ async def signal_with_start_workflow( # Overload case: -# - workflow name with optional list-form workflow arguments -# - signal name with optional list-form signal arguments +# - workflow name with positional workflow arguments +# - signal method callable with no signal arguments @typing.overload async def signal_with_start_workflow( workflow: str, - *, - args: list[typing.Any] | None = ..., + *args: object, id: str, task_queue: str, - signal: str, - signal_args: list[typing.Any] | None = ..., + signal: collections.abc.Callable[ + [SelfType], None | collections.abc.Awaitable[None] + ], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -103,23 +102,22 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[object]: ... +) -> ExternalWorkflowHandle[SelfType]: ... # Overload case: -# - workflow method callable with typed positional workflow arguments -# - signal name with optional list-form signal arguments +# - workflow name with positional workflow arguments +# - signal method callable with a typed single signal arguments @typing.overload async def signal_with_start_workflow( - workflow: collections.abc.Callable[ - [SelfType, typing_extensions.Unpack[WorkflowArgs]], - collections.abc.Awaitable[WorkflowResult], - ], - *args: typing_extensions.Unpack[WorkflowArgs], + workflow: str, + *args: object, id: str, task_queue: str, - signal: str, - signal_args: list[typing.Any] | None = ..., + signal: collections.abc.Callable[ + [SelfType, SignalArg], None | collections.abc.Awaitable[None] + ], + signal_args: SignalArg, execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -139,20 +137,16 @@ async def signal_with_start_workflow( # Overload case: -# - workflow method callable with list-form workflow arguments -# - signal name with optional list-form signal arguments +# - workflow name with positional workflow arguments +# - signal callable with list-form signal arguments @typing.overload async def signal_with_start_workflow( - workflow: collections.abc.Callable[ - [SelfType, typing_extensions.Unpack[WorkflowArgs]], - collections.abc.Awaitable[WorkflowResult], - ], - *, - args: list[typing.Any], + workflow: str, + *args: object, id: str, task_queue: str, - signal: str, - signal_args: list[typing.Any] | None = ..., + signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], + signal_args: list[typing.Any], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -168,21 +162,21 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[SelfType]: ... +) -> ExternalWorkflowHandle[object]: ... # Overload case: -# - workflow name with positional workflow arguments -# - signal method callable with no signal arguments +# - workflow name with optional list-form workflow arguments +# - signal name with optional list-form signal arguments @typing.overload async def signal_with_start_workflow( workflow: str, - *args: object, + *, + args: list[typing.Any] | None = ..., id: str, task_queue: str, - signal: collections.abc.Callable[ - [SelfType], None | collections.abc.Awaitable[None] - ], + signal: str, + signal_args: list[typing.Any] | None = ..., execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -198,7 +192,7 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[SelfType]: ... +) -> ExternalWorkflowHandle[object]: ... # Overload case: @@ -233,20 +227,19 @@ async def signal_with_start_workflow( # Overload case: -# - workflow method callable with typed positional workflow arguments -# - signal method callable with no signal arguments +# - workflow name with optional list-form workflow arguments +# - signal method callable with a typed single signal arguments @typing.overload async def signal_with_start_workflow( - workflow: collections.abc.Callable[ - [SelfType, typing_extensions.Unpack[WorkflowArgs]], - collections.abc.Awaitable[WorkflowResult], - ], - *args: typing_extensions.Unpack[WorkflowArgs], + workflow: str, + *, + args: list[typing.Any] | None = ..., id: str, task_queue: str, signal: collections.abc.Callable[ - [SelfType], None | collections.abc.Awaitable[None] + [SelfType, SignalArg], None | collections.abc.Awaitable[None] ], + signal_args: SignalArg, execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -266,21 +259,17 @@ async def signal_with_start_workflow( # Overload case: -# - workflow method callable with list-form workflow arguments -# - signal method callable with no signal arguments +# - workflow name with optional list-form workflow arguments +# - signal callable with list-form signal arguments @typing.overload async def signal_with_start_workflow( - workflow: collections.abc.Callable[ - [SelfType, typing_extensions.Unpack[WorkflowArgs]], - collections.abc.Awaitable[WorkflowResult], - ], + workflow: str, *, - args: list[typing.Any], + args: list[typing.Any] | None = ..., id: str, task_queue: str, - signal: collections.abc.Callable[ - [SelfType], None | collections.abc.Awaitable[None] - ], + signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], + signal_args: list[typing.Any], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -296,22 +285,23 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[SelfType]: ... +) -> ExternalWorkflowHandle[object]: ... # Overload case: -# - workflow name with positional workflow arguments -# - signal method callable with a typed single signal arguments +# - workflow method callable with typed positional workflow arguments +# - signal name with optional list-form signal arguments @typing.overload async def signal_with_start_workflow( - workflow: str, - *args: object, + workflow: collections.abc.Callable[ + [SelfType, typing_extensions.Unpack[WorkflowArgs]], + collections.abc.Awaitable[WorkflowResult], + ], + *args: typing_extensions.Unpack[WorkflowArgs], id: str, task_queue: str, - signal: collections.abc.Callable[ - [SelfType, SignalArg], None | collections.abc.Awaitable[None] - ], - signal_args: SignalArg, + signal: str, + signal_args: list[typing.Any] | None = ..., execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -331,19 +321,20 @@ async def signal_with_start_workflow( # Overload case: -# - workflow name with optional list-form workflow arguments -# - signal method callable with a typed single signal arguments +# - workflow method callable with typed positional workflow arguments +# - signal method callable with no signal arguments @typing.overload async def signal_with_start_workflow( - workflow: str, - *, - args: list[typing.Any] | None = ..., + workflow: collections.abc.Callable[ + [SelfType, typing_extensions.Unpack[WorkflowArgs]], + collections.abc.Awaitable[WorkflowResult], + ], + *args: typing_extensions.Unpack[WorkflowArgs], id: str, task_queue: str, signal: collections.abc.Callable[ - [SelfType, SignalArg], None | collections.abc.Awaitable[None] + [SelfType], None | collections.abc.Awaitable[None] ], - signal_args: SignalArg, execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -397,22 +388,19 @@ async def signal_with_start_workflow( # Overload case: -# - workflow method callable with list-form workflow arguments -# - signal method callable with a typed single signal arguments +# - workflow method callable with typed positional workflow arguments +# - signal callable with list-form signal arguments @typing.overload async def signal_with_start_workflow( workflow: collections.abc.Callable[ [SelfType, typing_extensions.Unpack[WorkflowArgs]], collections.abc.Awaitable[WorkflowResult], ], - *, - args: list[typing.Any], + *args: typing_extensions.Unpack[WorkflowArgs], id: str, task_queue: str, - signal: collections.abc.Callable[ - [SelfType, SignalArg], None | collections.abc.Awaitable[None] - ], - signal_args: SignalArg, + signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], + signal_args: list[typing.Any], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -432,16 +420,20 @@ async def signal_with_start_workflow( # Overload case: -# - workflow name with positional workflow arguments -# - signal callable with list-form signal arguments +# - workflow method callable with list-form workflow arguments +# - signal name with optional list-form signal arguments @typing.overload async def signal_with_start_workflow( - workflow: str, - *args: object, + workflow: collections.abc.Callable[ + [SelfType, typing_extensions.Unpack[WorkflowArgs]], + collections.abc.Awaitable[WorkflowResult], + ], + *, + args: list[typing.Any], id: str, task_queue: str, - signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], - signal_args: list[typing.Any], + signal: str, + signal_args: list[typing.Any] | None = ..., execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -457,21 +449,25 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[object]: ... +) -> ExternalWorkflowHandle[SelfType]: ... # Overload case: -# - workflow name with optional list-form workflow arguments -# - signal callable with list-form signal arguments +# - workflow method callable with list-form workflow arguments +# - signal method callable with no signal arguments @typing.overload async def signal_with_start_workflow( - workflow: str, + workflow: collections.abc.Callable[ + [SelfType, typing_extensions.Unpack[WorkflowArgs]], + collections.abc.Awaitable[WorkflowResult], + ], *, - args: list[typing.Any] | None = ..., + args: list[typing.Any], id: str, task_queue: str, - signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], - signal_args: list[typing.Any], + signal: collections.abc.Callable[ + [SelfType], None | collections.abc.Awaitable[None] + ], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -487,23 +483,26 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[object]: ... +) -> ExternalWorkflowHandle[SelfType]: ... # Overload case: -# - workflow method callable with typed positional workflow arguments -# - signal callable with list-form signal arguments +# - workflow method callable with list-form workflow arguments +# - signal method callable with a typed single signal arguments @typing.overload async def signal_with_start_workflow( workflow: collections.abc.Callable[ [SelfType, typing_extensions.Unpack[WorkflowArgs]], collections.abc.Awaitable[WorkflowResult], ], - *args: typing_extensions.Unpack[WorkflowArgs], + *, + args: list[typing.Any], id: str, task_queue: str, - signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], - signal_args: list[typing.Any], + signal: collections.abc.Callable[ + [SelfType, SignalArg], None | collections.abc.Awaitable[None] + ], + signal_args: SignalArg, execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -629,6 +628,11 @@ async def signal_with_start_workflow( Returns: A workflow handle to the started workflow. """ + if positional_args and args is not None: + raise TypeError("cannot specify both positional arguments and args") + normalized_args: list[typing.Any] | None = ( + list(positional_args) if positional_args else args + ) normalized_signal_args: list[typing.Any] | None if signal_args is None: normalized_signal_args = None @@ -636,11 +640,6 @@ async def signal_with_start_workflow( normalized_signal_args = typing.cast(list[typing.Any], signal_args) else: normalized_signal_args = [signal_args] - if positional_args and args is not None: - raise TypeError("cannot specify both positional arguments and args") - normalized_args: list[typing.Any] | None = ( - list(positional_args) if positional_args else args - ) user_metadata = ( None if static_summary is None and static_details is None diff --git a/temporalio/nexus/system/workflow_service/service.py b/temporalio/nexus/system/workflow_service/services.py similarity index 58% rename from temporalio/nexus/system/workflow_service/service.py rename to temporalio/nexus/system/workflow_service/services.py index 7ce5849ca..c538493e1 100644 --- a/temporalio/nexus/system/workflow_service/service.py +++ b/temporalio/nexus/system/workflow_service/services.py @@ -1,10 +1,13 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations from nexusrpc import Operation, service -import temporalio.api.workflowservice.v1.request_response_pb2 +from .models import ( + SignalWithStartWorkflowRequest, + SignalWithStartWorkflowResponse, +) @service(name="temporal.api.workflowservice.v1.WorkflowService") @@ -16,6 +19,6 @@ class WorkflowService: # .. warning:: This API is experimental and subject to change. signal_with_start_workflow: Operation[ - temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, - temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, + SignalWithStartWorkflowRequest, + SignalWithStartWorkflowResponse, ] = Operation(name="SignalWithStartWorkflowExecution") diff --git a/tests/nexus/test_temporal_system_nexus.py b/tests/nexus/test_temporal_system_nexus.py index b6c711128..dfa466500 100644 --- a/tests/nexus/test_temporal_system_nexus.py +++ b/tests/nexus/test_temporal_system_nexus.py @@ -14,6 +14,7 @@ import temporalio.api.workflowservice.v1.request_response_pb2 as workflowservice_pb2 import temporalio.converter import temporalio.nexus.system as nexus_system +import temporalio.nexus.system.workflow_service.models as workflow_service_models from temporalio import workflow from temporalio.bridge._visitor import PayloadVisitor from temporalio.bridge._visitor_functions import VisitorFunctions @@ -137,12 +138,12 @@ def _assert_start_nexus_operation_interceptor_trace() -> None: assert trace_name == "workflow.start_nexus_operation" trace_input = cast(StartNexusOperationInput[Any, Any], trace_value) request = cast( - workflowservice_pb2.SignalWithStartWorkflowExecutionRequest, + workflow_service_models.SignalWithStartWorkflowRequest, trace_input.input, ) - assert request.workflow_id == "system-nexus-workflow-id" - assert request.signal_name == "test-signal" - assert request.workflow_type.name == "test-workflow" + assert request.id == "system-nexus-workflow-id" + assert request.signal == "test-signal" + assert request.workflow == "test-workflow" class _MarkingPayloadVisitor(VisitorFunctions): From 9437d75ccfa0554bd2e4d4974dea8d62cdb60708 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 17 Sep 2026 00:12:12 -0700 Subject: [PATCH 133/831] Adopted main's payload visitor generator. The generator renames the service module, and the visitor script still looked for the old filename, so the generation sequence died after the model was written. --- scripts/gen_payload_visitor.py | 37 +++++++++++++++++++++++----------- temporalio/bridge/_visitor.py | 5 +++++ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/scripts/gen_payload_visitor.py b/scripts/gen_payload_visitor.py index 0001659f7..7fab85dcd 100644 --- a/scripts/gen_payload_visitor.py +++ b/scripts/gen_payload_visitor.py @@ -2,7 +2,7 @@ import sys from importlib.util import module_from_spec, spec_from_file_location from pathlib import Path -from typing import cast +from typing import cast, get_args, get_origin, get_type_hints import google.protobuf.message import nexusrpc @@ -19,14 +19,15 @@ from temporalio.bridge.proto.workflow_completion.workflow_completion_pb2 import ( WorkflowActivationCompletion, ) +from temporalio.converter._payload_converter import _get_transfer_type_converter def discover_system_nexus_roots() -> list[Descriptor]: - module_path = ( - base_dir / "temporalio" / "nexus" / "system" / "workflow_service" / "service.py" - ) + module_path = base_dir / "temporalio" / "nexus" / "system" / "workflow_service" spec = spec_from_file_location( - "temporalio_nexus_system_workflow_service", module_path + "temporalio_nexus_system_workflow_service", + module_path / "__init__.py", + submodule_search_locations=[str(module_path)], ) if spec is None or spec.loader is None: raise RuntimeError(f"Cannot load generated system service from {module_path}") @@ -35,10 +36,14 @@ def discover_system_nexus_roots() -> list[Descriptor]: spec.loader.exec_module(module) roots: list[Descriptor] = [] - for operation in vars(module.WorkflowService).values(): - if not isinstance(operation, nexusrpc.Operation): + for annotation in get_type_hints(module._services.WorkflowService).values(): + if get_origin(annotation) is not nexusrpc.Operation: continue - for proto_type in (operation.input_type, operation.output_type): + for operation_type in get_args(annotation): + converter = _get_transfer_type_converter(operation_type) + proto_type = ( + converter.transfer_type if converter is not None else operation_type + ) if isinstance(proto_type, type) and issubclass( proto_type, google.protobuf.message.Message ): @@ -119,12 +124,20 @@ def generate(self, roots: list[Descriptor]) -> str: The generated code defines async visitor functions for each reachable protobuf message type starting from WorkflowActivation, including support - for repeated fields and map entries, and a convenience entrypoint - function `visit`. + for repeated fields and map entries. Payload-free roots get no-op methods + so the `visit` entrypoint recognizes them as supported. """ - for r in roots: - self.walk(r) + for root in roots: + if not self.walk(root): + self.methods.append( + f"""\ + async def _visit_{name_for(root)}( + self, fs: VisitorFunctions, o: Any + ) -> None: + pass +""" + ) header = """ from __future__ import annotations diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index ef1e21dbd..f26fc390f 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -621,3 +621,8 @@ async def _visit_temporal_api_workflowservice_v1_SignalWithStartWorkflowExecutio await self._visit_temporal_api_common_v1_Header(fs, o.header) if o.HasField("user_metadata"): await self._visit_temporal_api_sdk_v1_UserMetadata(fs, o.user_metadata) + + async def _visit_temporal_api_workflowservice_v1_SignalWithStartWorkflowExecutionResponse( + self, fs: VisitorFunctions, o: Any + ) -> None: + pass From 99674584e447ce0d48457aeb6cc66555f31b469b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 17 Sep 2026 08:47:15 -0700 Subject: [PATCH 134/831] Qualified the LangGraph docstring's stream references. The server_streams module gives WorkflowStream and WorkflowStreamClient a second definition, so pydoctor can no longer resolve the short names. --- temporalio/contrib/langgraph/_plugin.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/temporalio/contrib/langgraph/_plugin.py b/temporalio/contrib/langgraph/_plugin.py index 03881ca2a..1819c646d 100644 --- a/temporalio/contrib/langgraph/_plugin.py +++ b/temporalio/contrib/langgraph/_plugin.py @@ -104,11 +104,13 @@ class LangGraphPlugin(SimplePlugin): inherited default of either form. streaming_topic: When set, ``langgraph.config.get_stream_writer()`` inside a node publishes to this topic on the workflow's - :class:`WorkflowStream`. The workflow must construct - ``WorkflowStream()`` in its ``@workflow.init`` (the plugin's + :class:`temporalio.contrib.workflow_streams.WorkflowStream`. The + workflow must construct ``WorkflowStream()`` in its + ``@workflow.init`` (the plugin's interceptor verifies this on workflow start). Nodes with ``execute_in='activity'`` publish through - :class:`WorkflowStreamClient` (signal); nodes with + :class:`temporalio.contrib.workflow_streams.WorkflowStreamClient` + (signal); nodes with ``execute_in='workflow'`` publish synchronously to the in-workflow stream (no signal). streaming_batch_interval: How often the activity-side stream From e6007d30c7179d241139050cb72a3104dbaed3f3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 17 Sep 2026 09:13:45 -0700 Subject: [PATCH 135/831] Made the external stream docstrings build under pydoctor. pydoctor resolves single-backtick prose as symbol references, so shell words, tuples and file names were read as missing targets. Two simple tables also lost their column alignment because pydoctor rewrites role references before parsing, so one is now a literal block. --- .../external_workflow_streams/_annotation.py | 2 +- .../contrib/external_workflow_streams/_api.py | 6 +-- .../external_workflow_streams/_errors.py | 32 ++++++------ .../external_workflow_streams/_manager.py | 50 +++++++++---------- .../_output_backend.py | 2 +- .../external_workflow_streams/_producer.py | 12 ++--- .../external_workflow_streams/_redis.py | 26 +++++----- .../external_workflow_streams/_runtime.py | 10 ++-- temporalio/worker/_workflow.py | 4 +- 9 files changed, 73 insertions(+), 71 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_annotation.py b/temporalio/contrib/external_workflow_streams/_annotation.py index d5c55bb53..a55cfb0f8 100644 --- a/temporalio/contrib/external_workflow_streams/_annotation.py +++ b/temporalio/contrib/external_workflow_streams/_annotation.py @@ -154,7 +154,7 @@ class AnnotationBudgetExceeded(temporalio.exceptions.ApplicationError): terminal could not fit an empty annotation, at the point the Workflow makes it. - An :py:class:`~temporalio.exceptions.ApplicationError` marked + An :py:class:`temporalio.exceptions.ApplicationError` marked non-retryable, and that is the substance of this class rather than a detail. A plain exception here fails the *Workflow Task*, and the server retries Workflow Task failures forever: the encoding that overflowed overflows again diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index af33bed81..0a373b10b 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -73,7 +73,7 @@ """ #: Where per-Run subscription state hangs off the Workflow instance. Reserved, -#: and deliberately not in the `__temporal_workflow_stream*` namespace the +#: and deliberately not in the ``__temporal_workflow_stream*`` namespace the #: shipped contrib feature already owns. _RUN_STATE_ATTR = "__temporal_external_stream_state" @@ -183,7 +183,7 @@ class _RunState: runtime: ExternalStreamRuntime | None = None next_wait_id: int = 1 - #: `wait_id -> Future`, resolved by the readiness activation handler. + #: ``wait_id -> Future``, resolved by the readiness activation handler. pending: dict[int, Any] = field(default_factory=dict) @@ -539,7 +539,7 @@ class ExternalStreamSubscription(Generic[AnyType]): **One consumer.** The cursor, the readiness future, and the blocked flag are all the subscription's rather than an iterator's, so two coroutines waiting on it at once is refused with - :class:`~temporalio.contrib.external_workflow_streams._errors.ConcurrentStreamConsumerError` + :class:`temporalio.contrib.external_workflow_streams.ConcurrentStreamConsumerError` rather than served -- see :meth:`_refuse_a_second_waiter` for what sharing them would do. Two consumers of the same *stream* is a supported shape and the way to ask for it is a second ``subscribe()``: delivery is a broadcast diff --git a/temporalio/contrib/external_workflow_streams/_errors.py b/temporalio/contrib/external_workflow_streams/_errors.py index c9450d235..6025ca3f7 100644 --- a/temporalio/contrib/external_workflow_streams/_errors.py +++ b/temporalio/contrib/external_workflow_streams/_errors.py @@ -11,20 +11,22 @@ key on the metrics here rather than on Workflow Task failure counts, which a transient backend outage also increments. -============================ ========================== ==================== -Condition Error type Operator response -============================ ========================== ==================== -Backend unreachable/erroring :class:`StreamStorageError` None -- clears when - the backend recovers -Recorded offset missing, :class:`StreamIntegrityError` Repair or restore -expired, reordered, or the backend, or -miscounted terminate the Run -Bytes intact but undecodable :class:`StreamDecodeError` Align the consumer's - converter with the - producer's -Annotation does not match ordinary nondeterminism Fix or version the -the subscriptions made Workflow code -============================ ========================== ==================== +:: + + ============================ ========================== ==================== + Condition Error type Operator response + ============================ ========================== ==================== + Backend unreachable/erroring ``StreamStorageError`` None -- clears when + the backend recovers + Recorded offset missing, ``StreamIntegrityError`` Repair or restore + expired, reordered, or the backend, or + miscounted terminate the Run + Bytes intact but undecodable ``StreamDecodeError`` Align the consumer's + converter with the + producer's + Annotation does not match ordinary nondeterminism Fix or version the + the subscriptions made Workflow code + ============================ ========================== ==================== There is deliberately **no** ``workflow_failure_exception_types`` registration here: integrity loss *blocks* a Workflow rather than terminating it (ADR-014). @@ -83,7 +85,7 @@ class StreamIntegrityError(StreamError): class StreamDecodeError(StreamError): """A record was present and intact but could not be decoded. - Separated from :class:`StreamIntegrityError` because it is a configuration + Separated from ``StreamIntegrityError`` because it is a configuration error on the *consumer* -- a DataConverter or codec that does not match the producer's -- and reporting it as integrity loss sends an operator to restore a backend that was never damaged (ADR-015). diff --git a/temporalio/contrib/external_workflow_streams/_manager.py b/temporalio/contrib/external_workflow_streams/_manager.py index 86b521e8d..2323b42e1 100644 --- a/temporalio/contrib/external_workflow_streams/_manager.py +++ b/temporalio/contrib/external_workflow_streams/_manager.py @@ -28,13 +28,13 @@ Three cursors, and conflating them is how a speculative read becomes a durable claim: -=================== =================== =========== ================== -Cursor Advances on Owner Survives eviction -=================== =================== =========== ================== -``committed`` marker commit only the marker yes -``delivery`` hand-off to workflow the instance no -``prefetch`` buffering the manager no -=================== =================== =========== ================== +============= ==================== ============ ================= +Cursor Advances on Owner Survives eviction +============= ==================== ============ ================= +``committed`` marker commit only the marker yes +``delivery`` hand-off to workflow the instance no +``prefetch`` buffering the manager no +============= ==================== ============ ================= ``prefetch`` is speculative: reading a record is not consuming it, and consuming it is not committing it. The manager may only move it *backwards* to @@ -227,7 +227,7 @@ class RunStatus: out is only the first thing the activation then has to do. Holds an activation takes *itself* are deliberately not bounded. Those are the -same backend exposure the park handshake already has -- `install_park_intent` +same backend exposure the park handshake already has -- ``install_park_intent`` can hang exactly as a removal can -- so a bound there would move the wait rather than remove it. @@ -316,7 +316,7 @@ class Subscription: _has_room: asyncio.Event = field(default_factory=asyncio.Event, repr=False) _watcher: asyncio.Task[None] | None = field(default=None, repr=False) _cancelled: bool = field(default=False, repr=False) - #: Bumped whenever every speculative read is discarded. A `read_after` + #: Bumped whenever every speculative read is discarded. A ``read_after`` #: already in flight started from the cursor being discarded, so its records #: are speculative too; the watcher compares this across the await and drops #: them rather than appending them on top of the reset -- which would put the @@ -747,7 +747,7 @@ def __init__( self._pending_wake_runs: dict[str, _PendingWake] = {} self._activation_sequences: dict[str, int] = {} #: Wakes the shutdown sweep could not get acknowledged. Reported through - #: `external_stream_shutdown_wake_failed`; kept here so a test can tell + #: ``external_stream_shutdown_wake_failed``; kept here so a test can tell #: "no wake was needed" from "a wake was needed and lost". self.shutdown_wake_failures = 0 self._buffer_size = buffer_size @@ -780,7 +780,7 @@ def __init__( #: Strong references to the in-flight registration-time reconciliations. self._reconciliations: set[asyncio.Task[None]] = set() #: Removals this manager decided on and did not get confirmed, per Run - #: and then per `(stream key, wait_id)`. The durable half of the intent + #: and then per ``(stream key, wait_id)``. The durable half of the intent #: invariant: a removal that failed is a claim about the *backend*, and #: recording it anywhere that a close or an eviction takes away is the #: same as not recording it at all. Drained under `_park_lock`. @@ -858,7 +858,7 @@ def _cancel_watcher(self, subscription: Subscription) -> None: def _start_watcher(self, subscription: Subscription) -> None: """Starts a watcher, and reconciles the park state it inherited. - Both on the manager's own loop, because both are `create_task` calls and + Both on the manager's own loop, because both are ``create_task`` calls and `register` runs on the Workflow executor thread. """ if subscription._cancelled or subscription._watcher is not None: @@ -886,10 +886,10 @@ async def _reconcile_inherited_park(self, subscription: Subscription) -> None: Registration is where a Worker learns such an intent exists, and it is also the moment its status is unambiguous. A subscription is registered by user Workflow code running, and no user code runs inside a park - (`wft-lifecycle.md`), so an intent found here belongs to a park that is + (``wft-lifecycle.md``), so an intent found here belongs to a park that is over: the Core that confirmed it has either moved on or gone with the Worker that held it. What leaving it costs is the invariant's whole - point -- `current_park_generation` keeps answering a generation Core has + point -- ``current_park_generation`` keeps answering a generation Core has discarded, every producer wake names that generation and Core discards it as stale, and because a parked wake's request ID ignores sender identity the second such wake is byte-identical to the first and the @@ -1379,7 +1379,7 @@ def _reannounce_after_cleanup( A stale intent does not only leak. While it was installed every wake for this stream named the generation behind it -- the producer reads - `current_park_generation`, and so does the Worker's own sender -- and + ``current_park_generation``, and so does the Worker's own sender -- and Core discards a non-zero generation that is not the park it is holding. A record that arrived in that window was therefore announced to nobody, and *removing the intent does not announce it*: `_report_ready` counted @@ -1390,12 +1390,12 @@ def _reannounce_after_cleanup( create a Workflow Task. Both outcomes that clear the key announce, and that is why the provider - contract does not answer with a Boolean. `ABSENT` is not "someone else's + contract does not answer with a Boolean. ``ABSENT`` is not "someone else's intent is in the way", it is "the intent this entry named is gone" -- which is what a retry sees after the reply to a delete that in fact succeeded was lost, and what one cleanup owner sees after another finished the job. Reading that as a mismatch would leave the record the - intent silenced silent for good. `MISMATCH` announces nothing: an intent + intent silenced silent for good. ``MISMATCH`` announces nothing: an intent is still installed there, the suppression it causes has not ended, and it belongs to a park this entry knows nothing about. @@ -1428,7 +1428,7 @@ def _park_lock(self, run_id: str) -> asyncio.Lock: """Serializes one Run's park-intent work on the manager's loop. The install/recheck handshake, the resolve, and the reconciliation above - all read-then-write the same `(stream key, wait_id)` objects, and the + all read-then-write the same ``(stream key, wait_id)`` objects, and the reconciliation is scheduled from another thread, so their interleaving is not otherwise constrained. Without this, a reconciliation that overlapped a confirming park could remove the intent that park had just @@ -1493,7 +1493,7 @@ def rearm_ready(self, run_id: str) -> None: Workflow Task whose data had already arrived. Called from the Workflow thread at activation completion, so the work is - hopped onto the manager's loop: `create_task` is not thread-safe, and a + hopped onto the manager's loop: ``create_task`` is not thread-safe, and a task created from the Workflow executor thread is silently never scheduled -- indistinguishable from a stream that never delivers. """ @@ -1803,7 +1803,7 @@ async def _report_ready(self, subscription: Subscription) -> None: leave this method. The watcher calls it in its loop, so an exception escaping ends that watcher for good -- the subscription stays registered, its buffer keeps its records, and nothing ever announces them again. - `_rearm_ready` also launches it with `create_task`, where an exception + `_rearm_ready` also launches it with ``create_task``, where an exception becomes a task result nobody retrieves and the failure is not even logged. """ @@ -1917,7 +1917,7 @@ async def _retry_stale(self, subscription: Subscription) -> str: Returns the result the retries ended on, so the caller can act on it. A Boolean would answer only "was it announced", and the four non-``Accepted`` answers are not interchangeable: they differ in what - happens to the watcher, and `RunNotFound` in particular requires the + happens to the watcher, and ``RunNotFound`` in particular requires the watcher to be torn down. Discarding them left that teardown unreachable from here. @@ -1927,7 +1927,7 @@ async def _retry_stale(self, subscription: Subscription) -> str: Workflow consuming happily, and a wake owed at the end of that costs one empty Workflow Task rather than a silent stall. - `RunNotFound` ends the retries rather than using them up. It is the one + ``RunNotFound`` ends the retries rather than using them up. It is the one answer that cannot change back: the Run is gone from this Worker, so a further report can only be answered the same way, and each attempt costs a delay before the wake this record still needs. @@ -1967,7 +1967,7 @@ async def prepare_park( is waiting on and aborts a legitimate park, which then runs again on the next idle timeout and aborts again; and an intent installed for a wait outside the set is an intent with no park behind it, which is exactly - what `backend-contract.md` forbids leaving in a backend. + what ``backend-contract.md`` forbids leaving in a backend. The order is what closes the append/park race: a producer appends its record *before* it observes the park generation, so an append is either @@ -2328,7 +2328,7 @@ async def cancel(self, run_id: str, wait_id: int) -> None: behind for good. And it is not confined to the closed wait. A stale intent keeps - `parked_wait_ids` non-empty, which suppresses the unparked-wake fallback + ``parked_wait_ids`` non-empty, which suppresses the unparked-wake fallback for the **whole stream**: with no live wait parked, the producer sends only the dead generation, Core discards it as stale, and dedup silences every later publish -- so live waits across the Continue-As-New chain @@ -2684,7 +2684,7 @@ async def _sweep_wake(self, subscription: Subscription) -> None: Counting the failure is deliberately **not** done here for the cancellation case. The grace period expiring cancels this coroutine wherever it is, `_send_owed_wake` re-raises `CancelledError` by design, - and no `except` here could both record the failure and leave the + and no ``except`` here could both record the failure and leave the cancellation intact for the subscriptions after this one -- which are not reached either. The subscription stays in the unaccounted set instead and :meth:`_account_unswept` counts it, which covers being cancelled and diff --git a/temporalio/contrib/external_workflow_streams/_output_backend.py b/temporalio/contrib/external_workflow_streams/_output_backend.py index ec4b1f58e..bcdb154d3 100644 --- a/temporalio/contrib/external_workflow_streams/_output_backend.py +++ b/temporalio/contrib/external_workflow_streams/_output_backend.py @@ -286,7 +286,7 @@ async def append_output( input record's ``(session_id, sequence)`` and byte identity exactly as :meth:`StreamBackend.append`: an identical retry returns the original output record and offset; different bytes under the same key raise - :class:`~temporalio.contrib.external_workflow_streams._backend.AppendConflictError`. + :class:`temporalio.contrib.external_workflow_streams.AppendConflictError`. It may not pass an already-positioned pending stage in client reads. """ diff --git a/temporalio/contrib/external_workflow_streams/_producer.py b/temporalio/contrib/external_workflow_streams/_producer.py index 49ce2876f..18fb0c29b 100644 --- a/temporalio/contrib/external_workflow_streams/_producer.py +++ b/temporalio/contrib/external_workflow_streams/_producer.py @@ -118,17 +118,17 @@ def __init__( whatever ended the attempt (ADR-036). """ self.restart = restart - """Whether the caller must call :meth:`.wake` again instead of retrying. + """Whether the caller must call ``wake()`` again instead of retrying. The wake is three steps -- observe the parked set, claim the generation, Signal -- and only the third produces the requests - :meth:`ProducerTopicHandle.retry_wake` re-sends. A failure in the first + ``ProducerTopicHandle.retry_wake()`` re-sends. A failure in the first two leaves nothing to re-send, so ``pending`` is empty and retrying it would silently do nothing at all: the record would stay durable and unannounced while the caller believed it had recovered. ``True`` therefore says "no wake was composed; compose one". Calling - :meth:`ProducerTopicHandle.wake` again is safe and is the whole recovery + ``ProducerTopicHandle.wake()`` again is safe and is the whole recovery -- it re-observes the parked set, and a parked wake's request ID is derived from the generation rather than from the sender, so a wake some other producer already sent deduplicates against it. @@ -198,7 +198,7 @@ def __init__( """The stream the append was for. Where it must be settled. Carried because a record does not name its own stream and the backend's - idempotency scope does: `(session_id, sequence)` is unused on every + idempotency scope does: ``(session_id, sequence)`` is unused on every *other* stream, so the same record handed to another topic's ``resolve_append`` would append a second copy there rather than deduplicate. The recovery refuses that, and this is what a caller @@ -455,7 +455,7 @@ def __init__( #: Per stream, the appends that never reported an outcome. #: #: Kept because the operation *is* the recovery: only these exact bytes - #: under these exact `(session_id, sequence)` pairs re-append as a no-op + #: under these exact ``(session_id, sequence)`` pairs re-append as a no-op #: if the first attempt landed, and only what the interrupted call owed #: says whether settling it still has a wake to send. A list rather than #: a single slot because concurrent publishes to one stream are supported @@ -872,7 +872,7 @@ def _outstanding(self, record: StreamRecord) -> _UnresolvedAppend: The lookup **is** the safety check, and it is three checks at once. It binds the recovery to the stream, because a record does not name its own - stream and `(session_id, sequence)` is unused on every other one -- so a + stream and ``(session_id, sequence)`` is unused on every other one -- so a record settled against the wrong topic appends a second copy of the value rather than deduplicating, and leaves the real stream still blocked. It binds the recovery to the exact bytes, because idempotency is on identity diff --git a/temporalio/contrib/external_workflow_streams/_redis.py b/temporalio/contrib/external_workflow_streams/_redis.py index dd7cfceb1..c4d69b1cf 100644 --- a/temporalio/contrib/external_workflow_streams/_redis.py +++ b/temporalio/contrib/external_workflow_streams/_redis.py @@ -71,7 +71,7 @@ #: Redis' beginning-of-stream sentinel for `XREAD`. Not an offset: no record #: ever has this id, which is why `BEGINNING` is a distinct cursor form rather -#: than `AFTER(Offset("0-0"))`. +#: than ``AFTER(Offset("0-0"))``. _BEGINNING_SENTINEL: Final = "0-0" _OUTPUT_STAGE_FIELD: Final = "__tes_output_stage" @@ -99,7 +99,7 @@ def _content_hash(record: StreamRecord) -> str: #: Append-if-new-or-identical, atomically. #: -#: Split across two commands without a script, a crash between `XADD` and the +#: Split across two commands without a script, a crash between ``XADD`` and the #: idempotency write would leave a record no retry could recognise as its own, #: so the retry would append a duplicate. _APPEND_LUA: Final = """ @@ -201,7 +201,7 @@ class RedisStreamBackend(StreamBackend, OutputStreamBackend): """Redis Streams as an external workflow stream provider.""" guarantees_immutability: ClassVar[bool | None] = True - """`XADD` entries cannot be rewritten in place -- only deleted or trimmed.""" + """``XADD`` entries cannot be rewritten in place -- only deleted or trimmed.""" provider_id = "redis-streams" provider_format_version = 1 @@ -738,14 +738,14 @@ async def delete_for_test(self, key: StreamKey, offset: Offset) -> None: await self._client.xdel(self.stream_key(key), offset.serialize()) -#: What Redis' glob matcher treats as more than itself. `]` and `^` are special +#: What Redis' glob matcher treats as more than itself. ``]`` and ``^`` are special #: only inside a class, but escaping them too costs nothing and keeps the rule #: one line long. _GLOB_METACHARACTERS: Final = frozenset("*?[]\\") def _as_glob_literal(text: str) -> str: - """A literal string, made safe to embed in a `SCAN MATCH` pattern.""" + """A literal string, made safe to embed in a ``SCAN MATCH`` pattern.""" return "".join( f"\\{character}" if character in _GLOB_METACHARACTERS else character for character in text @@ -756,25 +756,25 @@ def _escaped(key: StreamKey) -> str: r"""One stream identity as a single, unambiguous key component. Percent-encoded per field, then joined -- **not** joined raw. A Workflow ID - and a stream name are user-chosen strings in which `:` is an ordinary + and a stream name are user-chosen strings in which ``:`` is an ordinary character, so joining the raw fields is not injective: ("ns", "wf", r1, f"{r2}:tokens") and ("ns", f"wf:{r1}", r2, "tokens") - both render as `ns:wf:r1:r2:tokens`. Two unrelated Workflows would then share + both render as ``ns:wf:r1:r2:tokens``. Two unrelated Workflows would then share one stream, one idempotency hash, one park intent and one claim -- delivering each other's records, and each concluding the other's claim had already taken - its wake. Same reasoning as `_wake.py`'s length-prefixed request-ID material, + its wake. Same reasoning as ``_wake.py``'s length-prefixed request-ID material, applied to a key rather than to a digest. Percent-encoding rather than length prefixes because a key is read by humans: - an ordinary identity still renders verbatim in `redis-cli`, and only a field + an ordinary identity still renders verbatim in ``redis-cli``, and only a field that actually contains a delimiter pays for it. It buys one property the - length prefix does not -- the encoded form contains no `:`, `*`, `?`, `[` or - `\`, so the derived `:idem`, `:park:` and `:claim:` suffixes stay - unambiguous and `parked_wait_ids`' pattern cannot be widened by a stream name. + length prefix does not -- the encoded form contains no ``:``, ``*``, ``?``, ``[`` or + ``\``, so the derived ``:idem``, ``:park:`` and ``:claim:`` suffixes stay + unambiguous and ``parked_wait_ids``' pattern cannot be widened by a stream name. - Not reversible in practice, and not meant to be: `key_prefix` is + Not reversible in practice, and not meant to be: ``key_prefix`` is operator-supplied and unescaped, so only the identity half round-trips. """ components: tuple[str, ...] = ( diff --git a/temporalio/contrib/external_workflow_streams/_runtime.py b/temporalio/contrib/external_workflow_streams/_runtime.py index 09b38bab0..e57b3aa91 100644 --- a/temporalio/contrib/external_workflow_streams/_runtime.py +++ b/temporalio/contrib/external_workflow_streams/_runtime.py @@ -276,7 +276,7 @@ def __init__( #: the Worker that built this runtime, so `codec_for` hands Workflow #: code a converter carrying the same context every other payload in the #: activation was converted with. Bound out there rather than in here - #: because `with_context` runs user code, and this object lives on the + #: because ``with_context`` runs user code, and this object lives on the #: far side of the sandbox boundary. self._data_converter = data_converter self._default_idle_timeout = default_idle_timeout @@ -332,7 +332,7 @@ def __init__( self._unobserved_segments = 0 self._segment_pending = True self._observed_this_activation = False - #: `wait_id -> Future`, awaited by Workflow code and resolved by the + #: ``wait_id -> Future``, awaited by Workflow code and resolved by the #: readiness activation. It lives here rather than on either side alone #: because the two halves are in different modules and a second map #: would mean the side that resolves is never the side that registered. @@ -343,7 +343,7 @@ def __init__( #: only for the length of one replay job, which is what makes a #: registration made during it checkable against what was recorded. self._replay_bindings: dict[int, StreamBinding] | None = None - #: `wait_id -> the converter a *recorded* wait's records convert with`. + #: ``wait_id -> the converter a *recorded* wait's records convert with``. #: Installed by the Worker before a replay job reaches this thread; see #: :meth:`install_replay_converters` for why it exists and why it is not #: torn down when the replay ends. @@ -411,7 +411,7 @@ def begin_activation(self, history_floor_event_id: int | None = None) -> None: drain a full batch, consume one record and block elsewhere on every activation in turn, so n subscriptions arrive at an activation holding roughly n times the cap between them and hand all of it over in one - `activate()` call. Starting the count at the carry-over makes what an + ``activate()`` call. Starting the count at the carry-over makes what an activation may hand over -- carried-over plus newly delivered -- exactly the cap, whatever the schedule. """ @@ -1312,7 +1312,7 @@ def _verify_binding( Only the **stream name** is compared, not the whole key. The other three components -- namespace, Workflow id, first execution Run id -- are the Run's identity rather than anything the code chose, and a replay harness - legitimately supplies its own: `Replayer` runs under `ReplayNamespace`, + legitimately supplies its own: `Replayer` runs under ``ReplayNamespace``, so comparing the full key would report every replayed history as nondeterministic. The key is still *recorded* whole, because replay has to read the ranges it names. diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index b22b779f3..42fb07ff8 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -249,7 +249,7 @@ def __init__( #: A sandboxed Workflow's `instance` is a proxy that exposes only the #: `WorkflowInstance` protocol, so reaching through it for the runtime #: silently found nothing -- and the jobs that must never reach - #: `activate()` quietly went to `_apply` instead. + #: `activate()` quietly went to ``_apply`` instead. self._external_stream_runtimes: dict[str, Any] = {} # Stages survive activations within the cached Run because Core may # defer the server completion behind a local activity. A marker can be @@ -1252,7 +1252,7 @@ def _replay_stream_converters( to have re-created the subscription that would otherwise carry it. Bound from the Worker's own converter rather than from the runtime's, - which is already bound to this Run: a second `with_context` over the + which is already bound to this Run: a second ``with_context`` over the first would ask a user's component converter to rebind itself, and nothing in the protocol promises that composes. From 8625088316205eed0109591dc67ae0d64e17b366 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:26:33 -0700 Subject: [PATCH 136/831] Added the IDL contract and generation for the stream endpoint. The stream endpoint's shape lived only in hand-written Python, so no other language could be given the contract. This defines it once in a nexusrpc yaml contract and generates the Python bindings from it. The generated _definitions helper is hidden from the API docs and skipped by pydocstyle, the same way the other generated trees are. --- pyproject.toml | 6 +- scripts/gen_streams_nexus_api.py | 80 +++ .../providers/_nexus_generated/__init__.py | 23 + .../_nexus_generated/_definitions.py | 542 ++++++++++++++ .../providers/_nexus_generated/models.py | 670 ++++++++++++++++++ .../providers/_nexus_generated/services.py | 39 + .../providers/temporal_streams.nexusrpc.yaml | 123 ++++ 7 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 scripts/gen_streams_nexus_api.py create mode 100644 temporalio/streams/providers/_nexus_generated/__init__.py create mode 100644 temporalio/streams/providers/_nexus_generated/_definitions.py create mode 100644 temporalio/streams/providers/_nexus_generated/models.py create mode 100644 temporalio/streams/providers/_nexus_generated/services.py create mode 100644 temporalio/streams/providers/temporal_streams.nexusrpc.yaml diff --git a/pyproject.toml b/pyproject.toml index b7077785f..e55c39219 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,9 +125,11 @@ format = [ ] gen-docs = "uv run scripts/gen_docs.py" gen-nexus-system-api = "uv run scripts/gen_nexus_system_api.py" +gen-streams-nexus-api = "uv run scripts/gen_streams_nexus_api.py" gen-protos = [ { cmd = "uv run scripts/gen_protos.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -135,6 +137,7 @@ gen-protos = [ gen-protos-docker = [ { cmd = "uv run scripts/gen_protos_docker.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -207,7 +210,7 @@ ignore_errors = true [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 -match_dir = "^(?!(docs|scripts|tests|api|proto|system|\\.)).*" +match_dir = "^(?!(docs|scripts|tests|api|proto|system|_nexus_generated|\\.)).*" add_ignore = [ # We like to wrap at a certain number of chars, even long summary sentences. # https://github.com/PyCQA/pydocstyle/issues/184 @@ -241,6 +244,7 @@ privacy = [ "HIDDEN:temporalio.worker.workflow_sandbox.importer", "HIDDEN:temporalio.worker.workflow_sandbox.in_sandbox", "HIDDEN:**.*_pb2*", + "HIDDEN:temporalio.streams.providers._nexus_generated._definitions", ] project-name = "Temporal Python" sidebar-expand-depth = 2 diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py new file mode 100644 index 000000000..800aba944 --- /dev/null +++ b/scripts/gen_streams_nexus_api.py @@ -0,0 +1,80 @@ +import os +import shutil +import subprocess +import sys +from pathlib import Path + +base_dir = Path(__file__).parent.parent +providers_dir = base_dir / "temporalio" / "streams" / "providers" +contract_path = providers_dir / "temporal_streams.nexusrpc.yaml" +output_dir = providers_dir / "_nexus_generated" +# Pinned to the version CI installs, because nexgen's output changes between +# releases and check-protos compares against what is committed here. +NEX_GEN_VERSION = "0.2.4" + + +def nex_gen_command() -> list[str]: + if bin_path := os.environ.get("NEX_GEN_BIN"): + return [bin_path] + + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + # Same build as the system API script installs, so one binary + # serves both and neither can overwrite the other's output. + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] + + +def generate_streams_nexus_api() -> None: + if not contract_path.exists(): + raise RuntimeError(f"missing stream contract: {contract_path}") + + command = nex_gen_command() + shutil.rmtree(output_dir, ignore_errors=True) + subprocess.check_call( + [ + *command, + "python", + str(contract_path), + "--output", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + "I", + "--fix", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "format", + str(output_dir), + ] + ) + + +if __name__ == "__main__": + print("Generating stream endpoint Nexus API...", file=sys.stderr) + generate_streams_nexus_api() + print("Done", file=sys.stderr) diff --git a/temporalio/streams/providers/_nexus_generated/__init__.py b/temporalio/streams/providers/_nexus_generated/__init__.py new file mode 100644 index 000000000..c62eaa6dd --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/__init__.py @@ -0,0 +1,23 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from ._definitions import Violation +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, +) +from .services import TemporalStreams + +__all__ = [ + "Violation", + "AppendInput", + "AppendOutput", + "ReadInput", + "ReadOutput", + "RecordWire", + "TemporalStreams", +] diff --git a/temporalio/streams/providers/_nexus_generated/_definitions.py b/temporalio/streams/providers/_nexus_generated/_definitions.py new file mode 100644 index 000000000..dc8de5bb5 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/_definitions.py @@ -0,0 +1,542 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import base64 +import collections.abc +import dataclasses +import datetime +import json +import re +import typing + +import temporalio.converter +import temporalio.exceptions + +__all__ = [ + "Violation", + "_binary64", + "_check_contains", + "_check_date_time", + "_check_duration", + "_check_time", + "_check_unique_items", + "_collect", + "_json_values_equal", + "_format_base64", + "_format_base64url", + "_format_date", + "_format_date_time", + "_format_duration", + "_format_time", + "_parse_base64", + "_parse_base64url", + "_parse_date", + "_parse_date_time", + "_parse_duration", + "_parse_spec_integer", + "_parse_time", + "_quote", + "_transfer_type_convertible", +] + + +@dataclasses.dataclass(frozen=True, slots=True) +class Violation: + """A single constraint failure, located by JSON path.""" + + path: str + reason: str + + +def _quote(value: object) -> str: + """Renders a value in the JSON form every target quotes offending values in.""" + + try: + return json.dumps(value, ensure_ascii=False) + except (TypeError, ValueError): + return repr(value) + + +def _collect( + violations: list[Violation], + path: str, + error: temporalio.exceptions.ApplicationError, +) -> None: + """Re-paths a nested model's violations under `path` and appends them.""" + + if error.type != "PayloadValidationError" or not error.details: + raise error + # Generated failures retain the original list as their first detail. The + # cast is type-checker-only and performs no serialization. + nested_violations = typing.cast(list[Violation], error.details[0]) + for inner in nested_violations: + # A nested violation about the value *itself* carries no path of its own + # (a union branch's own constraint, an element-level check), so the + # prefix is the whole path -- never a dangling separator (P11). + nested = f"{path}.{inner.path}" if inner.path else path + violations.append(Violation(path=nested, reason=inner.reason)) + + +_ModelT = typing.TypeVar("_ModelT") + + +def _transfer_type_convertible( + converter: type[temporalio.converter.TransferTypeConverter[typing.Any, typing.Any]], +) -> collections.abc.Callable[[type[_ModelT]], type[_ModelT]]: + """Registers a transfer type converter on a model class. + + Wraps `temporalio.converter.transfer_type_convertible` to erase the + converter's value-type parameter. Binding it directly on the decorated class + is circular for a static type checker -- the class's type depends on the + decorator, whose value type depends on the class -- which degrades the model + to `Unknown`. Erasing it here keeps the decorator idiomatic at each model and + resolves the cycle. + """ + + return temporalio.converter.transfer_type_convertible(converter) + + +_INTEGER_CAP = (1 << 53) - 1 + + +def _parse_spec_integer( + value: object, path: str, violations: list[Violation] +) -> int | None: + """Parses a JSON number as a spec integer (`1.0` accepted, `1.5` rejected).""" + + # `bool` is a subclass of `int`, so it must be excluded before the int check. + if isinstance(value, bool) or not isinstance(value, (int, float)): + violations.append(Violation(path=path, reason="expected integer")) + return None + if isinstance(value, float): + if not value.is_integer(): + violations.append(Violation(path=path, reason="expected integer")) + return None + out = int(value) + else: + out = value + if abs(out) > _INTEGER_CAP: + violations.append(Violation(path=path, reason="expected integer")) + return None + return out + + +def _binary64(value: float) -> float: + """Narrows a `number` value to the binary64 domain shared by every target.""" + + try: + return float(value) + except OverflowError: + # Past the binary64 range there is nothing to narrow to. The caller's + # finiteness check has already recorded that violation and will raise, so + # hand the value back rather than throwing out of turn and losing the + # other violations collected alongside it. + return value + + +def _json_values_equal(left: typing.Any, right: typing.Any) -> bool: + """Compares JSON values without Python's bool-as-int equality leak.""" + + left_is_number = isinstance(left, (int, float)) and not isinstance(left, bool) + right_is_number = isinstance(right, (int, float)) and not isinstance(right, bool) + if left_is_number or right_is_number: + return left_is_number and right_is_number and left == right + if type(left) is not type(right): + return False + if isinstance(left, list): + left_list = typing.cast("list[typing.Any]", left) + right_list = typing.cast("list[typing.Any]", right) + return len(left_list) == len(right_list) and all( + _json_values_equal(a, b) for a, b in zip(left_list, right_list) + ) + if isinstance(left, dict): + left_dict = typing.cast("dict[typing.Any, typing.Any]", left) + right_dict = typing.cast("dict[typing.Any, typing.Any]", right) + return left_dict.keys() == right_dict.keys() and all( + _json_values_equal(left_dict[key], right_dict[key]) for key in left_dict + ) + return left == right + + +def _check_unique_items( + value: list[typing.Any], path: str, violations: list[Violation] +) -> None: + """Asserts an array's elements are pairwise distinct.""" + + seen: list[typing.Any] = [] + for index, element in enumerate(value): + for earlier, previous in enumerate(seen): + if _json_values_equal(previous, element): + violations.append( + Violation( + path=path, + reason=( + f"duplicate items: element at index {index} " + f"equals index {earlier}" + ), + ) + ) + break + seen.append(element) + + +def _check_contains( + value: list[typing.Any], + matches: typing.Callable[[typing.Any], bool], + min_contains: int, + max_contains: int | None, + bounded_min: bool, + path: str, + violations: list[Violation], +) -> None: + """Asserts how many of an array's elements match the `contains` schema.""" + + match_count = sum(1 for element in value if matches(element)) + if match_count < min_contains: + if bounded_min: + violations.append( + Violation( + path=path, + reason=( + f"too few matching items: at least {min_contains}, " + f"got {match_count}" + ), + ) + ) + else: + violations.append( + Violation(path=path, reason="no element matches the required schema") + ) + if max_contains is not None and match_count > max_contains: + violations.append( + Violation( + path=path, + reason=( + f"too many matching items: at most {max_contains}, " + f"got {match_count}" + ), + ) + ) + + +_TEMPORAL_DATE_TIME_RE = re.compile( + r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])\Z" +) +_TEMPORAL_DATE_RE = re.compile(r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\Z") +_TEMPORAL_TIME_RE = re.compile( + r"^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])?\Z" +) +_TEMPORAL_DURATION_RE = re.compile( + r"^PT(?:[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?|[0-9]+M(?:[0-9]+S)?|[0-9]+S)\Z" +) +_TEMPORAL_MAX_DURATION_SECONDS = ((1 << 63) - 1) // 1_000_000_000 +# A duration component with more digits than the cap itself is over the cap +# whatever those digits are, which is how the magnitude is bounded before `int()` +# sees it: CPython refuses to convert a string of more than 4300 digits. +_TEMPORAL_MAX_DURATION_DIGITS = len(str(_TEMPORAL_MAX_DURATION_SECONDS)) +# `datetime` resolves to microseconds, and `fromisoformat` before Python 3.11 +# parses only the fraction widths `isoformat` writes. +_TEMPORAL_FRACTION_DIGITS = 6 + + +def _days_in_month(year: int, month: int) -> int: + if month in (1, 3, 5, 7, 8, 10, 12): + return 31 + if month in (4, 6, 9, 11): + return 30 + if month == 2: + return 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28 + return 0 + + +def _valid_temporal_calendar(value: str) -> bool: + if len(value) < 10: + return False + try: + year, month, day = int(value[0:4]), int(value[5:7]), int(value[8:10]) + except ValueError: + return False + # `datetime.MINYEAR` is 1, which is also the shared cross-language floor. + # Year 0000 is rejected rather than shifted into range, and + # `_temporal_reason` says so. + if year < datetime.MINYEAR: + return False + maximum = _days_in_month(year, month) + return maximum > 0 and 1 <= day <= maximum + + +def _temporal_reason(name: str, value: str) -> str: + """The reason a rejected temporal string is reported under. + + Year 0000 earns its own clause so the caller sees the shared calendar floor + rather than only a generic malformed-timestamp reason. + """ + + if value[0:4] == "0000": + return ( + f"must be a valid {name}, got {_quote(value)}: year 0000 is not" + f" representable (datetime.MINYEAR is {datetime.MINYEAR})" + ) + return f"must be a valid {name}, got {_quote(value)}" + + +def _temporal_isoformat(value: str) -> str: + """Rewrites a wire temporal into the spelling `fromisoformat` accepts. + + `Z` becomes `+00:00`, and the fractional second is padded or truncated to + exactly `_TEMPORAL_FRACTION_DIGITS`: before Python 3.11 `fromisoformat` + parses only what `isoformat` writes, so an RFC 3339 `.1` or `.1234567` -- + which every other target accepts -- would otherwise raise. Digits past the + sixth are dropped, the loss at `datetime`'s own resolution that P1 allows; + the canonical output re-trims the padding, so `.1` still writes as `.1`. + """ + + normalized = value.upper() + if normalized.endswith("Z"): + normalized = normalized[:-1] + "+00:00" + dot = normalized.find(".") + if dot < 0: + return normalized + end = dot + 1 + while end < len(normalized) and normalized[end].isdigit(): + end += 1 + fraction = normalized[dot + 1 : end].ljust(_TEMPORAL_FRACTION_DIGITS, "0") + return ( + normalized[: dot + 1] + fraction[:_TEMPORAL_FRACTION_DIGITS] + normalized[end:] + ) + + +def _parse_date_time( + value: str, path: str, violations: list[Violation] +) -> datetime.datetime | None: + if _TEMPORAL_DATE_TIME_RE.match(value) is None or not _valid_temporal_calendar( + value + ): + violations.append( + Violation(path=path, reason=_temporal_reason("date-time", value)) + ) + return None + return datetime.datetime.fromisoformat(_temporal_isoformat(value)) + + +def _parse_date( + value: str, path: str, violations: list[Violation] +) -> datetime.date | None: + if _TEMPORAL_DATE_RE.match(value) is None or not _valid_temporal_calendar(value): + violations.append(Violation(path=path, reason=_temporal_reason("date", value))) + return None + return datetime.date.fromisoformat(value) + + +def _parse_time( + value: str, path: str, violations: list[Violation] +) -> datetime.time | None: + if _TEMPORAL_TIME_RE.match(value) is None: + violations.append(Violation(path=path, reason=_temporal_reason("time", value))) + return None + return datetime.time.fromisoformat(_temporal_isoformat(value)) + + +def _parse_duration( + value: str, path: str, violations: list[Violation] +) -> datetime.timedelta | None: + if _TEMPORAL_DURATION_RE.match(value) is None: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + total = 0 + number = "" + for char in value[2:]: + if char.isdigit(): + number += char + continue + digits = number.lstrip("0") + number = "" + if len(digits) > _TEMPORAL_MAX_DURATION_DIGITS: + # Over the cap by digit count alone (see the constant), so the + # conversion `int()` would refuse is never attempted. + total = _TEMPORAL_MAX_DURATION_SECONDS + 1 + break + total += int(digits or "0") * {"H": 3600, "M": 60, "S": 1}[char] + if total > _TEMPORAL_MAX_DURATION_SECONDS: + break + if total > _TEMPORAL_MAX_DURATION_SECONDS: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + return datetime.timedelta(seconds=total) + + +def _check_temporal_offset( + name: str, + value: datetime.datetime | datetime.time, + offset: datetime.timedelta, + path: str, + violations: list[Violation], +) -> None: + """Asserts a UTC offset is a whole number of minutes, the finest the wire + form spells (`tzinfo` allows seconds, which the offset would silently lose). + """ + + if offset % datetime.timedelta(minutes=1): + violations.append( + Violation( + path=path, + reason=( + f"must be a valid {name}, got {_quote(str(value))}: " + f"the UTC offset {offset} is not a whole number of minutes" + ), + ) + ) + + +def _check_date_time( + value: datetime.datetime, path: str, violations: list[Violation] +) -> None: + """Asserts a datetime is writable as a wire date-time (P12). + + A dataclass is constructed unchecked, so a naive datetime -- with no offset + the required wire form could carry -- reaches serialize; without this it + would emit a value this module's own parser rejects. + """ + + offset = value.utcoffset() + if offset is None: + violations.append( + Violation( + path=path, + reason=( + f"must be a valid date-time, got {_quote(str(value))}: " + "a naive datetime carries no UTC offset" + ), + ) + ) + return + _check_temporal_offset("date-time", value, offset, path, violations) + + +def _check_time(value: datetime.time, path: str, violations: list[Violation]) -> None: + """Asserts a time is writable as a wire time (P12). The offset is optional in + the grammar, so only its precision is held to anything.""" + + offset = value.utcoffset() + if offset is not None: + _check_temporal_offset("time", value, offset, path, violations) + + +def _check_duration( + value: datetime.timedelta, path: str, violations: list[Violation] +) -> None: + """Asserts a timedelta is writable as a wire duration (P12): the grammar is + unsigned, whole-second and capped, and a `timedelta` is none of those.""" + + if value < datetime.timedelta(0): + reason = "a duration cannot be negative" + elif value % datetime.timedelta(seconds=1): + reason = "a duration cannot carry a fraction of a second" + elif value.total_seconds() > _TEMPORAL_MAX_DURATION_SECONDS: + reason = f"a duration cannot exceed {_TEMPORAL_MAX_DURATION_SECONDS} seconds" + else: + return + violations.append( + Violation( + path=path, + reason=f"must be a valid duration, got {_quote(str(value))}: {reason}", + ) + ) + + +def _temporal_frac(microsecond: int) -> str: + if microsecond == 0: + return "" + return "." + f"{microsecond:06d}".rstrip("0") + + +def _temporal_offset(value: datetime.datetime | datetime.time) -> str: + offset = value.utcoffset() + if offset is None: + return "" + total = int(offset.total_seconds()) + if total == 0: + return "Z" + sign = "+" if total > 0 else "-" + total = abs(total) + return f"{sign}{total // 3600:02d}:{(total % 3600) // 60:02d}" + + +def _format_date_time(value: datetime.datetime) -> str: + return ( + f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + f"T{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_date(value: datetime.date) -> str: + return f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + + +def _format_time(value: datetime.time) -> str: + return ( + f"{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_duration(value: datetime.timedelta) -> str: + total = int(value.total_seconds()) + if total == 0: + return "PT0S" + hours, remainder = divmod(total, 3600) + minutes, seconds = divmod(remainder, 60) + out = "PT" + if hours: + out += f"{hours}H" + if minutes: + out += f"{minutes}M" + if seconds: + out += f"{seconds}S" + return out + + +_BASE64_RE = re.compile( + "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?\\Z", + re.ASCII, +) +_BASE64URL_RE = re.compile( + "^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048])?\\Z", + re.ASCII, +) + + +def _parse_base64(value: str, path: str, violations: list[Violation]) -> bytes | None: + if _BASE64_RE.match(value) is None: + violations.append( + Violation(path=path, reason=f"must be base64-encoded, got {_quote(value)}") + ) + return None + return base64.b64decode(value, validate=True) + + +def _format_base64(value: bytes) -> str: + return base64.b64encode(value).decode("ascii") + + +def _parse_base64url( + value: str, path: str, violations: list[Violation] +) -> bytes | None: + if _BASE64URL_RE.match(value) is None: + violations.append( + Violation( + path=path, reason=f"must be base64url-encoded, got {_quote(value)}" + ) + ) + return None + return base64.urlsafe_b64decode(value + "=" * (-len(value) % 4)) + + +def _format_base64url(value: bytes) -> str: + return base64.urlsafe_b64encode(value).rstrip(b"=").decode("ascii") diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py new file mode 100644 index 000000000..f22711a4f --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -0,0 +1,670 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import dataclasses +import typing + +import typing_extensions + +import temporalio.converter +import temporalio.exceptions + +from ._definitions import ( + Violation, + _collect, + _parse_spec_integer, + _transfer_type_convertible, +) + + +class _AppendInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendInput"] + ) -> "AppendInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) + else: + stream_value_raw = raw["stream"] + if not isinstance(stream_value_raw, str): + violations.append(Violation(path="stream", reason="expected string")) + else: + stream_value = stream_value_raw + + producer_id_value: str = typing.cast("typing.Any", None) + if "producer_id" not in raw or raw["producer_id"] is None: + violations.append(Violation(path="producer_id", reason="required")) + else: + producer_id_value_raw = raw["producer_id"] + if not isinstance(producer_id_value_raw, str): + violations.append( + Violation(path="producer_id", reason="expected string") + ) + else: + producer_id_value = producer_id_value_raw + + attempt_value: int = typing.cast("typing.Any", None) + if "attempt" not in raw or raw["attempt"] is None: + violations.append(Violation(path="attempt", reason="required")) + else: + attempt_value_raw = raw["attempt"] + attempt_value_parsed = _parse_spec_integer( + attempt_value_raw, "attempt", violations + ) + if attempt_value_parsed is not None: + attempt_value = attempt_value_parsed + + batch_index_value: int = typing.cast("typing.Any", None) + if "batch_index" not in raw or raw["batch_index"] is None: + violations.append(Violation(path="batch_index", reason="required")) + else: + batch_index_value_raw = raw["batch_index"] + batch_index_value_parsed = _parse_spec_integer( + batch_index_value_raw, "batch_index", violations + ) + if batch_index_value_parsed is not None: + batch_index_value = batch_index_value_parsed + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + payloads_value: list[str] | None = None + if "payloads" in raw: + payloads_value_raw = raw["payloads"] + if payloads_value_raw is None: + violations.append( + Violation(path="payloads", reason="explicit null not allowed") + ) + else: + if not isinstance(payloads_value_raw, list): + violations.append( + Violation(path="payloads", reason="expected array") + ) + else: + payloads_value_list: list[str] = [] + for payloads_value_index, payloads_value_element in enumerate( + typing.cast("list[typing.Any]", payloads_value_raw) + ): + payloads_value_item_path = f"payloads[{payloads_value_index}]" + payloads_value_item_violation_count = len(violations) + payloads_value_item: str = typing.cast("typing.Any", None) + if not isinstance(payloads_value_element, str): + violations.append( + Violation( + path=payloads_value_item_path, + reason="expected string", + ) + ) + else: + payloads_value_item = payloads_value_element + if len(violations) == payloads_value_item_violation_count: + payloads_value_list.append(payloads_value_item) + payloads_value = payloads_value_list + + finish_value: bool | None = None + if "finish" in raw: + finish_value_raw = raw["finish"] + if finish_value_raw is None: + violations.append( + Violation(path="finish", reason="explicit null not allowed") + ) + else: + if not isinstance(finish_value_raw, bool): + violations.append( + Violation(path="finish", reason="expected boolean") + ) + else: + finish_value = finish_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "producer_id" + and key != "attempt" + and key != "batch_index" + and key != "topic" + and key != "payloads" + and key != "finish" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendInput( + workflow_id=workflow_id_value, + stream=stream_value, + producer_id=producer_id_value, + attempt=attempt_value, + batch_index=batch_index_value, + topic=topic_value, + payloads=payloads_value, + finish=finish_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + out["stream"] = value.stream + out["producer_id"] = value.producer_id + if abs(value.attempt) > 9007199254740991: + violations.append( + Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") + ) + out["attempt"] = value.attempt + if abs(value.batch_index) > 9007199254740991: + violations.append( + Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") + ) + out["batch_index"] = value.batch_index + if value.topic is not None: + out["topic"] = value.topic + if value.payloads is not None: + out["payloads"] = value.payloads + if value.finish is not None: + out["finish"] = value.finish + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_AppendInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendInput: + """One append call: who is writing, where, and what.""" + + workflow_id: str + """The workflow whose stream is being written.""" + + stream: str + """The named stream to append to. Empty when the producer writes to a topic instead.""" + + producer_id: str + """Identifies the writer across its retries, so its attempts can be ordered.""" + + attempt: int + """The generation this producer is writing. A later attempt supersedes an earlier one.""" + + batch_index: int + """Counts this producer's batches from 1. The handler drops an index it has already + written for this producer attempt. + """ + + topic: str | None = None + """The topic to append to, when stream is empty.""" + + payloads: list[str] | None = None + """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a + call that only finishes. + """ + + finish: bool | None = None + """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + + +class _AppendOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendOutput"] + ) -> "AppendOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + cursor_value: str | None = None + if "cursor" in raw: + cursor_value_raw = raw["cursor"] + if cursor_value_raw is None: + violations.append( + Violation(path="cursor", reason="explicit null not allowed") + ) + else: + if not isinstance(cursor_value_raw, str): + violations.append( + Violation(path="cursor", reason="expected string") + ) + else: + cursor_value = cursor_value_raw + + for key in raw: + if key != "cursor": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendOutput( + cursor=cursor_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + out: dict[str, typing.Any] = {} + if value.cursor is not None: + out["cursor"] = value.cursor + return out + + +@_transfer_type_convertible(_AppendOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + + cursor: str | None = None + """Opaque token naming the last record written by this call. Empty when the call + carried no payloads. + """ + + +class _ReadInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadInput"] + ) -> "ReadInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str | None = None + if "stream" in raw: + stream_value_raw = raw["stream"] + if stream_value_raw is None: + violations.append( + Violation(path="stream", reason="explicit null not allowed") + ) + else: + if not isinstance(stream_value_raw, str): + violations.append( + Violation(path="stream", reason="expected string") + ) + else: + stream_value = stream_value_raw + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + after_token_value: str | None = None + if "after_token" in raw: + after_token_value_raw = raw["after_token"] + if after_token_value_raw is None: + violations.append( + Violation(path="after_token", reason="explicit null not allowed") + ) + else: + if not isinstance(after_token_value_raw, str): + violations.append( + Violation(path="after_token", reason="expected string") + ) + else: + after_token_value = after_token_value_raw + + max_records_value: int | None = None + if "max_records" in raw: + max_records_value_raw = raw["max_records"] + if max_records_value_raw is None: + violations.append( + Violation(path="max_records", reason="explicit null not allowed") + ) + else: + max_records_value_parsed = _parse_spec_integer( + max_records_value_raw, "max_records", violations + ) + if max_records_value_parsed is not None: + max_records_value = max_records_value_parsed + + wait_ms_value: int | None = None + if "wait_ms" in raw: + wait_ms_value_raw = raw["wait_ms"] + if wait_ms_value_raw is None: + violations.append( + Violation(path="wait_ms", reason="explicit null not allowed") + ) + else: + wait_ms_value_parsed = _parse_spec_integer( + wait_ms_value_raw, "wait_ms", violations + ) + if wait_ms_value_parsed is not None: + wait_ms_value = wait_ms_value_parsed + + latest_only_value: bool | None = None + if "latest_only" in raw: + latest_only_value_raw = raw["latest_only"] + if latest_only_value_raw is None: + violations.append( + Violation(path="latest_only", reason="explicit null not allowed") + ) + else: + if not isinstance(latest_only_value_raw, bool): + violations.append( + Violation(path="latest_only", reason="expected boolean") + ) + else: + latest_only_value = latest_only_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "topic" + and key != "after_token" + and key != "max_records" + and key != "wait_ms" + and key != "latest_only" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadInput( + workflow_id=workflow_id_value, + stream=stream_value, + topic=topic_value, + after_token=after_token_value, + max_records=max_records_value, + wait_ms=wait_ms_value, + latest_only=latest_only_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + if value.stream is not None: + out["stream"] = value.stream + if value.topic is not None: + out["topic"] = value.topic + if value.after_token is not None: + out["after_token"] = value.after_token + if value.max_records is not None: + if abs(value.max_records) > 9007199254740991: + violations.append( + Violation( + path="max_records", reason="exceeds ±(2^53-1) integer cap" + ) + ) + out["max_records"] = value.max_records + if value.wait_ms is not None: + if abs(value.wait_ms) > 9007199254740991: + violations.append( + Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") + ) + out["wait_ms"] = value.wait_ms + if value.latest_only is not None: + out["latest_only"] = value.latest_only + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadInput: + """One read call: where to resume from and how long to wait.""" + + workflow_id: str + """The workflow whose stream is being read.""" + + stream: str | None = None + """The named stream to read. Empty reads every stream the workflow publishes.""" + + topic: str | None = None + """Yield only records on this topic. Empty yields every topic.""" + + after_token: str | None = None + """Opaque cursor from an earlier record or append. The read resumes strictly after the + record it names, so a caller never sees that record twice. Empty starts at the + beginning. The token is produced by whichever store sits behind the endpoint, so a + caller cannot tell which one that is. + """ + + max_records: int | None = None + """Return at most this many records. Defaults to 100 when omitted.""" + + wait_ms: int | None = None + """Wait at most this long for records to arrive before answering. Defaults to 5000 when + omitted. A call that collects nothing answers with no records and the caller's own + token. + """ + + latest_only: bool | None = None + """Answer with the newest position and no records, for a reader that wants to follow + from now. + """ + + +class _ReadOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadOutput"] + ) -> "ReadOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + records_value: list[RecordWire] | None = None + if "records" in raw: + records_value_raw = raw["records"] + if records_value_raw is None: + violations.append( + Violation(path="records", reason="explicit null not allowed") + ) + else: + if not isinstance(records_value_raw, list): + violations.append( + Violation(path="records", reason="expected array") + ) + else: + records_value_list: list[RecordWire] = [] + for records_value_index, records_value_element in enumerate( + typing.cast("list[typing.Any]", records_value_raw) + ): + records_value_item_path = f"records[{records_value_index}]" + records_value_item_violation_count = len(violations) + records_value_item: RecordWire = typing.cast("typing.Any", None) + try: + records_value_item = ( + _RecordWireTransferTypeConverter().from_transfer_type( + records_value_element, RecordWire + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, records_value_item_path, error) + if len(violations) == records_value_item_violation_count: + records_value_list.append(records_value_item) + records_value = records_value_list + + next_token_value: str | None = None + if "next_token" in raw: + next_token_value_raw = raw["next_token"] + if next_token_value_raw is None: + violations.append( + Violation(path="next_token", reason="explicit null not allowed") + ) + else: + if not isinstance(next_token_value_raw, str): + violations.append( + Violation(path="next_token", reason="expected string") + ) + else: + next_token_value = next_token_value_raw + + for key in raw: + if key != "records" and key != "next_token": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadOutput( + records=records_value, + next_token=next_token_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadOutput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + if value.records is not None: + records_out: list[typing.Any] = [] + for records_index, records_element in enumerate(value.records): + try: + records_out.append( + _RecordWireTransferTypeConverter().to_transfer_type( + records_element + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, f"records[{records_index}]", error) + out["records"] = records_out + if value.next_token is not None: + out["next_token"] = value.next_token + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadOutput: + """What one read call answered, and where to resume.""" + + records: list[RecordWire] | None = None + """The records after the caller's token, in stream order.""" + + next_token: str | None = None + """Opaque cursor to pass as after_token on the following call. Echoes the caller's own + token when the call collected nothing. + """ + + +class _RecordWireTransferTypeConverter( + temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["RecordWire"] + ) -> "RecordWire": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + token_value: str = typing.cast("typing.Any", None) + if "token" not in raw or raw["token"] is None: + violations.append(Violation(path="token", reason="required")) + else: + token_value_raw = raw["token"] + if not isinstance(token_value_raw, str): + violations.append(Violation(path="token", reason="expected string")) + else: + token_value = token_value_raw + + frame_value: str = typing.cast("typing.Any", None) + if "frame" not in raw or raw["frame"] is None: + violations.append(Violation(path="frame", reason="required")) + else: + frame_value_raw = raw["frame"] + if not isinstance(frame_value_raw, str): + violations.append(Violation(path="frame", reason="expected string")) + else: + frame_value = frame_value_raw + + for key in raw: + if key != "token" and key != "frame": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return RecordWire( + token=token_value, + frame=frame_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "RecordWire") -> typing.Any: + out: dict[str, typing.Any] = {} + out["token"] = value.token + out["frame"] = value.frame + return out + + +@_transfer_type_convertible(_RecordWireTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + + token: str + """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" + + frame: str + """The base64-encoded record frame, carrying the topic, kind, producer, attempt, + sequence and body. + """ diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py new file mode 100644 index 000000000..ce5604d81 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -0,0 +1,39 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from nexusrpc import Operation, service + +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, +) + + +@service +class TemporalStreams: + """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the + store behind it, so an operator switches storage without touching callers. Reads + hand out batches and an append carries one batch per call, because a Nexus operation + per record costs too much for token streams. + """ + + append: Operation[ + AppendInput, + AppendOutput, + ] = Operation(name="append") + """Append one batch on the caller's account. A repeated batch_index for the same + producer attempt is dropped, so a retried call writes once. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. + """ + + read: Operation[ + ReadInput, + ReadOutput, + ] = Operation(name="read") + """Answer with the records after the caller's token, or time out. The call parks until + it has max_records records or wait_ms elapses, whichever comes first, and returns + whatever it collected. + """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml new file mode 100644 index 000000000..ffa849509 --- /dev/null +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -0,0 +1,123 @@ +nexusrpc: "1.0.0" + +services: + TemporalStreams: + fqn: TemporalStreams + description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + operations: + append: + fqn: append + description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + input: { $ref: "#/$defs/AppendInput" } + output: { $ref: "#/$defs/AppendOutput" } + read: + fqn: read + description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + input: { $ref: "#/$defs/ReadInput" } + output: { $ref: "#/$defs/ReadOutput" } + +$defs: + AppendInput: + type: object + description: "One append call: who is writing, where, and what." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being written." + stream: + type: string + description: "The named stream to append to. Empty when the producer writes to a topic instead." + producer_id: + type: string + description: "Identifies the writer across its retries, so its attempts can be ordered." + attempt: + type: integer + description: "The generation this producer is writing. A later attempt supersedes an earlier one." + batch_index: + type: integer + description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + topic: + type: string + description: "The topic to append to, when stream is empty." + payloads: + type: array + items: + type: string + description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + finish: + type: boolean + description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + required: + - workflow_id + - stream + - producer_id + - attempt + - batch_index + additionalProperties: false + + AppendOutput: + type: object + description: "Where the append landed, empty when it wrote nothing." + properties: + cursor: + type: string + description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." + additionalProperties: false + + ReadInput: + type: object + description: "One read call: where to resume from and how long to wait." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being read." + stream: + type: string + description: "The named stream to read. Empty reads every stream the workflow publishes." + topic: + type: string + description: "Yield only records on this topic. Empty yields every topic." + after_token: + type: string + description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + max_records: + type: integer + description: "Return at most this many records. Defaults to 100 when omitted." + wait_ms: + type: integer + description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + latest_only: + type: boolean + description: "Answer with the newest position and no records, for a reader that wants to follow from now." + required: + - workflow_id + additionalProperties: false + + RecordWire: + type: object + description: "One record on the wire: its cursor and its base64 frame." + properties: + token: + type: string + description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + frame: + type: string + description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + required: + - token + - frame + additionalProperties: false + + ReadOutput: + type: object + description: "What one read call answered, and where to resume." + properties: + records: + type: array + items: + $ref: "#/$defs/RecordWire" + description: "The records after the caller's token, in stream order." + next_token: + type: string + description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." + additionalProperties: false From af0993b3b362ea1cb0936b921d6c513c6be62524 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:30:01 -0700 Subject: [PATCH 137/831] Moved the nexus provider onto the generated contract. The five wire dataclasses and the service class now come from the generated module, so the contract has one source. Both halves read the operation and service names off the generated definition instead of hard-coding paths. Field names and operation names on the wire are unchanged. The one wire difference is that a read no longer sends max_records, wait_ms and latest_only when the caller leaves them at their defaults, because the contract marks them optional and the handler applies the documented defaults. Nothing outside this module and its tests speaks this wire. --- temporalio/streams/providers/nexus.py | 205 ++++++++++++-------------- 1 file changed, 93 insertions(+), 112 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 3701a70cb..8e19c2d4d 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -8,6 +8,12 @@ store behind the endpoint is invisible to callers and an operator switches it without touching them. +The wire types and the service definition come from +``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be +handed the same contract. What stays hand-written here is what the +generator cannot express yet: the handler's dedupe and long-poll collect +loop, and the caller's batching, cursor handling and codec. + Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Supersession records are not transported: the caller's reader re-synthesizes them from @@ -25,13 +31,11 @@ import asyncio import base64 -import dataclasses -import json import urllib.error import urllib.request from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta -from typing import Any +from typing import Any, TypeVar import nexusrpc import nexusrpc.handler @@ -42,71 +46,40 @@ from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams.providers._nexus_generated import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, + TemporalStreams, +) _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so configure one of those on the worker" ) +# The contract leaves these unset, so the handler is the one place that says +# what an omitted read bound means. +_DEFAULT_MAX_RECORDS = 100 +_DEFAULT_WAIT_MS = 5000 -@dataclasses.dataclass -class AppendInput: - """One append call: who is writing, where, and what.""" - - workflow_id: str - stream: str - producer_id: str - attempt: int - batch_index: int - topic: str = "" - payloads: list[str] = dataclasses.field(default_factory=list) - finish: bool = False - - -@dataclasses.dataclass -class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" - - cursor: str = "" - - -@dataclasses.dataclass -class ReadInput: - """One read call: where to resume from and how long to wait.""" - - workflow_id: str - stream: str = "" - topic: str = "" - after_token: str = "" - max_records: int = 100 - wait_ms: int = 5000 - # Answer with the newest position and no records, for a reader that - # wants to follow from now. - latest_only: bool = False - - -@dataclasses.dataclass -class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" - - token: str - frame: str - - -@dataclasses.dataclass -class ReadOutput: - """What one read call answered, and where to resume.""" - - records: list[RecordWire] = dataclasses.field(default_factory=list) - next_token: str = "" - - -@nexusrpc.service -class TemporalStreams: - """The stream endpoint's two operations.""" +_definition = nexusrpc.get_service_definition(TemporalStreams) +if _definition is None: # pragma: no cover + raise RuntimeError("the generated stream service carries no nexus definition") +# Both halves read the wire names off the generated definition, so a rename in +# the contract cannot leave the caller posting to a path the handler no longer +# serves. +_SERVICE_NAME = _definition.name +_OPERATION_NAMES = { + operation.method_name: operation.name + for operation in _definition.operation_definitions.values() +} +_APPEND_OPERATION = _OPERATION_NAMES["append"] +_READ_OPERATION = _OPERATION_NAMES["read"] - append: nexusrpc.Operation[AppendInput, AppendOutput] - read: nexusrpc.Operation[ReadInput, ReadOutput] +_OutputT = TypeVar("_OutputT") @nexusrpc.handler.service_handler(service=TemporalStreams) @@ -129,9 +102,10 @@ async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: """Append on the caller's account, dropping a repeated batch.""" + topic = input.topic or "" key = ( input.workflow_id, - input.stream or f"@{input.topic}", + input.stream or f"@{topic}", input.producer_id, input.attempt, ) @@ -143,7 +117,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, - topic=input.topic, + topic=topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -168,14 +142,18 @@ async def read( ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream + self._client, workflow_id=input.workflow_id, stream=input.stream or "" ) topic = input.topic or None if input.latest_only: return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + max_records = ( + _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records + ) + wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.after_token + next_token = input.after_token or "" subscription = delegate.read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, @@ -204,13 +182,13 @@ async def collect() -> None: ) ) next_token = record.cursor.token - if len(records) >= input.max_records: + if len(records) >= max_records: return try: # `wait_for` rather than `asyncio.timeout`, which 3.10 does not # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), input.wait_ms / 1000) + await asyncio.wait_for(collect(), wait_ms / 1000) except asyncio.TimeoutError: pass finally: @@ -222,20 +200,29 @@ async def collect() -> None: return ReadOutput(records=records, next_token=next_token) -def _post(url: str, body: dict) -> dict: +def _post(url: str, body: bytes) -> bytes: request = urllib.request.Request( url, - data=json.dumps(body).encode(), + data=body, headers={"Content-Type": "application/json"}, method="POST", ) try: with urllib.request.urlopen(request, timeout=30) as response: - raw = response.read() + return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") - return json.loads(raw) if raw else {} + + +async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller and + # the worker serving the operation agree on the body without either of + # them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: @@ -276,7 +263,7 @@ async def append(self, *values: Any) -> Cursor: else self._converter.to_payloads([value])[0] ) payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + return Cursor((await self._call(payloads=payloads)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -284,23 +271,21 @@ async def finish(self) -> None: async def _call( self, payloads: list[str] | None = None, finish: bool = False - ) -> dict: + ) -> AppendOutput: self._batch_index += 1 - return await asyncio.to_thread( - _post, - f"{self._base_url}/append", - dataclasses.asdict( - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ) + return await _invoke( + f"{self._base_url}/{_APPEND_OPERATION}", + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + topic=self._topic, + payloads=payloads or [], + finish=finish, ), + AppendOutput, ) @@ -327,28 +312,26 @@ async def read( attempts = AttemptTracker() token = after.token while True: - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - after_token=token, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + after_token=token, ), + ReadOutput, ) - for wire in raw.get("records", []): + for wire in answer.records or []: try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire["frame"]) + base64.b64decode(wire.frame) ) except ValueError: continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire["token"]) + cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -361,23 +344,21 @@ async def read( attempt=attempt, sequence=sequence, ) - token = raw.get("next_token", token) or token + token = answer.next_token or token async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - latest_only=True, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, ), + ReadOutput, ) - token = raw.get("next_token", "") + token = answer.next_token or "" return Cursor(token) if token else BEGINNING def _decode(self, body: bytes, as_type: type | None) -> Any: @@ -397,7 +378,7 @@ def __init__(self) -> None: def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", "TemporalStreams") + service = options.pop("service", _SERVICE_NAME) if options: raise TypeError( "the nexus provider takes endpoint, http_address and service, " From 7d5d47c0153d1e3124e39f30ffa57549bba9c78c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:37:16 -0700 Subject: [PATCH 138/831] Applied the payload codec on the nexus provider's caller side. The caller ran the payload converter but never the codec, so records left the process in the clear even when one was configured. The producer now encodes before posting and the consumer decodes after reading, while the handler stays codec-blind, which is what keeps plaintext out of whoever hosts the endpoint. A data_converter option on the provider says which one to use when there is no client to take it from. --- CHANGELOG.md | 5 +- temporalio/streams/providers/nexus.py | 72 ++++++---- tests/streams/test_nexus_provider.py | 182 ++++++++++++++++++++++++-- 3 files changed, 223 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0f2f8b61..e9d0f64fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,10 @@ to include examples, links to docs, or any other relevant information. naming it. - **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. + through the endpoint and never names the store. Its contract is defined in + `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. + Configure it with `data_converter=` to run a payload codec on the caller + side, so records are encoded before they leave the process. ### Changed diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8e19c2d4d..a73c830ef 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -231,7 +231,7 @@ class NexusProducer: def __init__( self, base_url: str, - converter: Any, + data_converter: temporalio.converter.DataConverter, workflow_id: str, stream: str, topic: str, @@ -240,7 +240,8 @@ def __init__( ) -> None: """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream self._topic = topic @@ -255,15 +256,22 @@ def attempt(self) -> int: async def append(self, *values: Any) -> Cursor: """Append ``values`` through the endpoint.""" - payloads = [] - for value in values: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).cursor or "") + payloads = [ + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + for value in values + ] + if self._codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._codec.encode(payloads) + encoded = [ + base64.b64encode(payload.SerializeToString()).decode() + for payload in payloads + ] + return Cursor((await self._call(payloads=encoded)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -293,11 +301,16 @@ class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + workflow_id: str, + stream: str, ) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream @@ -335,8 +348,11 @@ async def read( superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded + value = ( + await self._decode(body, type) if kind is RecordKind.DATA else None + ) yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, + value=value, cursor=cursor, kind=kind, topic=frame_topic, @@ -361,9 +377,11 @@ async def latest(self, *, topic: str | None = None) -> Cursor: token = answer.next_token or "" return Cursor(token) if token else BEGINNING - def _decode(self, body: bytes, as_type: type | None) -> Any: + async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) + if self._codec is not None: + payload = (await self._codec.decode([payload]))[0] if as_type is None: return self._converter.from_payloads([payload])[0] return self._converter.from_payloads([payload], [as_type])[0] @@ -374,19 +392,22 @@ class _NexusProvider: def __init__(self) -> None: self._base_url: str | None = None + self._data_converter: temporalio.converter.DataConverter | None = None def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") service = options.pop("service", _SERVICE_NAME) + data_converter = options.pop("data_converter", None) if options: raise TypeError( - "the nexus provider takes endpoint, http_address and service, " - f"got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service and " + f"data_converter, got {sorted(options)}" ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + self._data_converter = data_converter def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -427,7 +448,7 @@ async def producer( attempt = attempt or activity.info().attempt return NexusProducer( self._url(), - _converter(client), + self._converter(client), workflow_id, stream, topic, @@ -438,13 +459,14 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), _converter(client), workflow_id, stream) - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + + def _converter(self, client: Any) -> temporalio.converter.DataConverter: + if self._data_converter is not None: + return self._data_converter + if client is None: + return temporalio.converter.DataConverter.default + return client.data_converter _provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index f07e4956c..18679ad5f 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,40 +1,55 @@ -"""Live conformance for the Nexus front. +"""Conformance for the Nexus front. -The caller talks only to the stream endpoint over the server's Nexus HTTP -ingress; the handler worker delegates to the workflow_streams provider, so -this test is the provider-hiding demonstration: nothing on the caller side -names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it -needs a dev server with an HTTP port and a registered Nexus endpoint. +The caller talks only to the stream endpoint; the handler delegates to a +storage provider, so these tests are the provider-hiding demonstration: +nothing on the caller side names or could name the store. -Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), -``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named -``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +The loop test runs over the server's Nexus HTTP ingress and is gated behind +``STREAMS_LIVE=nexus`` because it needs a dev server with an HTTP port and a +registered Nexus endpoint. Environment: ``TEMPORAL_ADDRESS`` (default +``localhost:7233``), ``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), +and an endpoint named ``streams-e2e`` targeting task queue +``streams-handlers-e2e``. + +The codec test stands the endpoint up in this process instead, because what +it checks is the bytes the caller puts on the wire. """ from __future__ import annotations +import asyncio +import base64 +import dataclasses import json import os import subprocess import uuid +from collections.abc import Sequence +from typing import Any, cast import pytest +import temporalio.converter from temporalio import streams +from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams import _frame as frame from temporalio.streams._provider import instance +from temporalio.streams.providers import memory, nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take -pytestmark = pytest.mark.skipif( +live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", ) ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" +APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] def _endpoint_id() -> str: @@ -60,6 +75,7 @@ def _endpoint_id() -> str: return json.loads(out.stdout)["id"] +@live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. @@ -119,3 +135,149 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + + +class ScrambleCodec(temporalio.converter.PayloadCodec): + """Flips every byte of a payload, so the middle holds nothing readable.""" + + KEY = 0x5A + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Wrap each payload as opaque bytes nothing downstream can read.""" + return [ + Payload( + metadata={"encoding": b"binary/plain"}, + data=self._flip(payload.SerializeToString()), + ) + for payload in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Recover the payloads :meth:`encode` wrapped.""" + out: list[Payload] = [] + for payload in payloads: + inner = Payload() + inner.ParseFromString(self._flip(payload.data)) + out.append(inner) + return out + + @classmethod + def _flip(cls, data: bytes) -> bytes: + return bytes(byte ^ cls.KEY for byte in data) + + +async def _dispatch( + handler: TemporalStreamsHandler, operation: str, request: Any +) -> Any: + context = cast("Any", None) # neither operation looks at it + if operation == APPEND_OPERATION: + return await handler.append(context, request) + return await handler.read(context, request) + + +def _in_process_endpoint( + handler: TemporalStreamsHandler, + posted: list[bytes], + answered: list[bytes], +) -> Any: + """Serve the caller's posts from ``handler``, recording both directions.""" + contract = temporalio.converter.DataConverter.default.payload_converter + loop = asyncio.get_running_loop() + + def post(url: str, body: bytes) -> bytes: + posted.append(body) + operation = url.rsplit("/", 1)[1] + request_type = AppendInput if operation == APPEND_OPERATION else ReadInput + request: Any = contract.from_payloads( + [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] + )[0] + if request_type is ReadInput: + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + request.wait_ms = 200 + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + raw = contract.to_payloads([answer])[0].data + answered.append(raw) + return raw + + return post + + +async def _loop_through_an_endpoint( + monkeypatch: pytest.MonkeyPatch, + codec: temporalio.converter.PayloadCodec | None, +) -> tuple[list[Any], list[bytes], list[bytes]]: + memory.reset() + streams.configure(provider="memory") + posted: list[bytes] = [] + answered: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) + front = instance( + "nexus", + endpoint="in-process", + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + workflow_id = "wf-codec" + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"secret": "tuna"}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") + records = await take(consumer.read(type=dict), 2, timeout=30) + memory.reset() + return records, posted, answered + + +def _appended_bytes(posted: list[bytes]) -> bytes: + out = b"" + for body in posted: + for encoded in json.loads(body).get("payloads", []): + out += base64.b64decode(encoded) + return out + + +def _answered_bodies(answered: list[bytes]) -> bytes: + out = b"" + for body in answered: + for record in json.loads(body).get("records", []): + out += frame.decode(base64.b64decode(record["frame"]))[5] + return out + + +async def test_the_caller_encodes_records_with_the_configured_codec( + monkeypatch: pytest.MonkeyPatch, +): + records, posted, answered = await _loop_through_an_endpoint( + monkeypatch, ScrambleCodec() + ) + + # The value survives the hop, so the codec is applied on both sides. + assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"secret": "tuna"} + # Neither direction carried the plaintext. + assert b"tuna" not in _appended_bytes(posted) + assert b"tuna" not in _answered_bodies(answered) + + +async def test_without_a_codec_the_same_records_go_out_in_the_clear( + monkeypatch: pytest.MonkeyPatch, +): + # The contrast is the point: the bytes above differ because of the codec, + # not because the transport obscures them anyway. + records, posted, answered = await _loop_through_an_endpoint(monkeypatch, None) + + assert records[0].value == {"secret": "tuna"} + assert b"tuna" in _appended_bytes(posted) + assert b"tuna" in _answered_bodies(answered) From 696d355f20c899090a5eba2e6d2c2d40803ee84e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:28 -0700 Subject: [PATCH 139/831] Woke outside readers across threads and ignored idle_timeout in memory. A workflow's publish runs on the workflow thread, so waking a consumer parked on another loop needs call_soon_threadsafe. The memory provider also stops reading idle_timeout as its poll period, which gave the parameter a second meaning. --- temporalio/streams/providers/memory.py | 38 ++++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index f7e58ef44..7b6e74fdc 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -31,6 +31,13 @@ _DEFAULT_POLL = timedelta(milliseconds=100) +logger = logging.getLogger(__name__) + + +def _wake(future: asyncio.Future[None]) -> None: + if not future.done(): + future.set_result(None) + class _MemoryStream: def __init__(self) -> None: @@ -38,9 +45,16 @@ def __init__(self) -> None: # Dedupe identity is (producer#attempt, first sequence of the append), # the same pair the storage providers use. self.seen: dict[tuple[str, int], int] = {} - self._arrival = asyncio.Event() - - def append(self, frames: list[bytes], *, producer_id: str, sequence: int) -> int: + # Each waiter is parked with the loop it belongs to. A workflow's + # publish runs on the workflow thread, and waking a foreign loop's + # future from there needs call_soon_threadsafe or the loop stays + # blocked in select until unrelated I/O happens to wake it. + self._waiters: list[tuple[asyncio.AbstractEventLoop, asyncio.Future[None]]] = [] + + def append( + self, frames: list[bytes], *, producer_id: str, sequence: int + ) -> int | None: + """Store ``frames`` and return the first one's offset, or ``None`` for a repeat.""" key = (producer_id, sequence) already = self.seen.get(key) if already is not None: @@ -48,13 +62,17 @@ def append(self, frames: list[bytes], *, producer_id: str, sequence: int) -> int offset = len(self.frames) self.frames.extend(frames) self.seen[key] = offset - arrival, self._arrival = self._arrival, asyncio.Event() - arrival.set() + waiters, self._waiters = self._waiters, [] + for loop, future in waiters: + loop.call_soon_threadsafe(_wake, future) return offset async def wait_past(self, offset: int) -> None: while len(self.frames) <= offset: - await self._arrival.wait() + loop = asyncio.get_running_loop() + future: asyncio.Future[None] = loop.create_future() + self._waiters.append((loop, future)) + await future _streams: dict[str, _MemoryStream] = {} @@ -290,11 +308,13 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + # Ignored: this provider never releases the worker, it polls. Reading + # idle_timeout as the poll period would give the parameter a second + # meaning that a port copying the reference would copy too. + del idle_timeout store = _stream(_inbound_id(workflow.info().workflow_id, stream)) return _MemReadSource( - store, - int(after.token) + 1 if after.token else 0, - idle_timeout or self._poll, + store, int(after.token) + 1 if after.token else 0, self._poll ) def open_write(self, topic: str) -> WriteSink: From ba750700087505d7dc1f6a4160abd9e40aa41a20 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:28 -0700 Subject: [PATCH 140/831] Named the last record in append's cursor and allowed None for it. A caller resuming with read(after=appended) must see only what came later, so the cursor names the last record of the batch. None says nothing was written, or that the transport learns positions at read time. --- temporalio/streams/_provider.py | 11 ++++++++-- temporalio/streams/providers/memory.py | 15 ++++++++------ tests/streams/test_streams_conformance.py | 25 +++++++++++++++++++---- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 18e2bb983..e0011b0c7 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -48,8 +48,15 @@ def attempt(self) -> int: """The generation this producer is writing.""" ... - async def append(self, *values: Any) -> Cursor: - """Append values and return where the first one landed.""" + async def append(self, *values: Any) -> Cursor | None: + """Append values and return the cursor of the last one written. + + The last rather than the first, so ``read(after=appended)`` yields + only what came later. ``None`` when nothing was written, because the + batch was empty or a repeat the provider dropped, and on a transport + that learns positions only at read time; a caller that needs to + position itself on such a transport asks :meth:`Consumer.latest`. + """ ... async def finish(self) -> None: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 7b6e74fdc..2244069b8 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -56,9 +56,8 @@ def append( ) -> int | None: """Store ``frames`` and return the first one's offset, or ``None`` for a repeat.""" key = (producer_id, sequence) - already = self.seen.get(key) - if already is not None: - return already + if key in self.seen: + return None offset = len(self.frames) self.frames.extend(frames) self.seen[key] = offset @@ -177,8 +176,10 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append ``values`` and return the cursor of the last one.""" + async def append(self, *values: Any) -> Cursor | None: + """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + if not values: + return None frames = [] for value in values: frames.append( @@ -197,7 +198,9 @@ async def append(self, *values: Any) -> Cursor: producer_id=self._provider_id, sequence=self._sequence - len(frames), ) - return Cursor(str(offset)) + if offset is None: + return None + return Cursor(str(offset + len(frames) - 1)) async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 0c7818064..a0cae8fc7 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -98,17 +98,18 @@ async def test_retried_append_is_deduplicated(): ) await first.append({"id": "r1"}) # The retry of the same attempt starts its sequence over and appends the - # same record. The provider must not store it twice. + # same record. The provider must not store it twice, and says so by + # returning no position for what it dropped. retry = await streams.producer( None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 ) - await retry.append({"id": "r1"}) + assert await retry.append({"id": "r1"}) is None consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") records = await take(consumer.read(type=dict), 1) assert records[0].value == {"id": "r1"} - with pytest.raises(asyncio.TimeoutError): - await take(consumer.read(type=dict), 2, timeout=0.2) + # The store holds exactly the one record: the newest position is its cursor. + assert await consumer.latest() == records[0].cursor async def test_new_attempt_supersedes_the_old_one(): @@ -161,6 +162,22 @@ async def test_cursor_resumes_where_it_points(): assert [r.value for r in again] == [{"n": 2}, {"n": 3}] +async def test_append_cursor_names_the_last_record_of_the_batch(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + assert appended is not None + await producer.append({"n": 4}) + + # A producer that resumes a reader after its own append must see only + # what came later, not the tail of the batch it just wrote. + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict, after=appended), 1) + assert [r.value for r in records] == [{"n": 4}] + assert await producer.append() is None + + async def test_latest_positions_a_reader_at_the_end(): producer = await streams.producer( None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 From 9de9342f1d6035f565e207472948a0069a58c9ca Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:28 -0700 Subject: [PATCH 141/831] Resolved producer identity once in the package. The activity defaulting rule is an interface rule, and every provider carried its own copy. --- temporalio/streams/_provider.py | 14 +++++++++++++- temporalio/streams/providers/memory.py | 5 ----- tests/streams/test_streams_conformance.py | 3 +++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index e0011b0c7..2d8e14f2b 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -14,6 +14,7 @@ from datetime import timedelta from typing import Any, Callable, Protocol +from temporalio import activity from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, StreamRecord @@ -148,7 +149,9 @@ async def producer( ``stream`` names one of the workflow's inbound streams. With no ``stream``, ``topic`` names a topic on the stream the workflow itself publishes, which is how an activity puts its live output next to the - workflow's own records for the same outside reader. + workflow's own records for the same outside reader. ``producer_id`` + is never empty here: the package resolved it, from the activity + context when the caller left it unset. """ ... @@ -312,6 +315,15 @@ async def producer( "name exactly one of stream (an inbound stream of the workflow) or " "topic (a topic on the stream the workflow publishes)" ) + if not producer_id: + if not activity.in_activity(): + raise ValueError( + "producer_id is required outside an activity; inside one it " + "defaults to the activity's id and attempt" + ) + info = activity.info() + producer_id = info.activity_id + attempt = attempt or info.attempt return await _current().producer( client, workflow_id=workflow_id, diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 2244069b8..64e8feb8f 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -334,11 +334,6 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> MemoryProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt # With no inbound stream named, the target is the store the workflow's # own writer appends to, and the frame carries the topic instead. return MemoryProducer( diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index a0cae8fc7..4db5b9fe9 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -210,6 +210,9 @@ async def test_producer_appends_onto_the_owners_topic(): with pytest.raises(ValueError): await streams.producer(None, workflow_id="wf", producer_id="model", attempt=1) + # Outside an activity there is no identity to fall back on. + with pytest.raises(ValueError, match="producer_id is required"): + await streams.producer(None, workflow_id="wf", stream="inputs") def test_unknown_provider_is_a_clear_error(): From fe4ec72c77ae7afefb73f5a0d4e157492e76d20f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:28 -0700 Subject: [PATCH 142/831] Required an explicit provider and exported instance. Building a provider is process setup. Workers resolve the default through worker_options(); workflow code that opens a stream before that gets a clear error instead of a racy lazy build. --- temporalio/streams/__init__.py | 8 ++++-- temporalio/streams/_provider.py | 33 ++++++++++++++++------- tests/streams/test_streams_conformance.py | 12 ++++++++- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index cd55ee9d4..ea0d86c81 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -33,7 +33,9 @@ :func:`configure` once before it opens a :func:`producer` or a :func:`consumer`, and passes :func:`worker_options` to its ``Worker`` and ``Replayer``. Those two calls are where a provider is named. Nothing else in -this module mentions one. +this module mentions one. Code that needs a second provider next to the +process default, such as a handler that serves one store while its process +talks to another, holds one from :func:`instance`. Reading somebody else's stream is out of scope for the first release. It is the topology neither prototype has evidence for, and leaving it out is what @@ -68,6 +70,7 @@ configure, consumer, drain, + instance, open_read, open_write, prepare, @@ -99,10 +102,11 @@ "configure", "consumer", "drain", + "instance", "prepare", "producer", - "worker_options", "reader", + "worker_options", "writer", ] diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 2d8e14f2b..b22dbbfd8 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -4,8 +4,8 @@ around it are shared, so every provider module is small: it implements :class:`StreamProvider` and registers a factory under a short name when it is imported. One :func:`configure` call decides which factory serves this -process; when exactly one provider is registered, it is the default and the -call can be omitted. +process; :func:`worker_options` makes the same choice for a worker when +exactly one provider is registered. """ from __future__ import annotations @@ -26,6 +26,7 @@ "configure", "consumer", "drain", + "instance", "open_read", "open_write", "prepare", @@ -158,7 +159,7 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> Consumer: - """Open a reader for what ``workflow_id`` publishes.""" + """Open a reader on ``workflow_id``'s own stream, or its inbound ``stream``.""" ... @@ -240,16 +241,25 @@ def instance(provider: str | None = None, **options: Any) -> StreamProvider: def _current() -> StreamProvider: - global _active if _active is None: - chosen = _make(None) - chosen.configure() - _active = chosen + # Building a provider is process setup. Doing it on the first + # workflow's thread would race a second workflow thread for the + # global and hide the choice inside workflow code. + raise RuntimeError( + "no stream provider is configured; call streams.configure() or " + "streams.worker_options() before opening a stream" + ) return _active def worker_options() -> dict[str, Any]: - """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + """What a ``Worker`` or ``Replayer`` needs to serve this provider. + + Every worker calls this, so it is where the default is resolved when + :func:`configure` was not called and exactly one provider is registered. + """ + if _active is None: + configure() return _current().worker_options() @@ -335,5 +345,10 @@ async def producer( async def consumer(client: Any, *, workflow_id: str, stream: str = "") -> Consumer: - """Open a reader for what ``workflow_id`` publishes.""" + """Open a reader on ``workflow_id``'s own stream, or its inbound ``stream``. + + With no ``stream`` the reader follows what the workflow publishes, topic + by topic. With one, it follows the inbound stream of that name, which is + how a process watches what producers hand the workflow. + """ return await _current().consumer(client, workflow_id=workflow_id, stream=stream) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 4db5b9fe9..3a69ea2dd 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -15,7 +15,7 @@ import pytest from temporalio import streams -from temporalio.streams import _frame +from temporalio.streams import _frame, _provider from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import Cursor, RecordKind from temporalio.streams.providers import memory @@ -218,3 +218,13 @@ async def test_producer_appends_onto_the_owners_topic(): def test_unknown_provider_is_a_clear_error(): with pytest.raises(RuntimeError, match="no stream provider 'nope'"): streams.configure(provider="nope") + + +async def test_opening_a_stream_needs_a_configured_provider(): + # Building a provider is process setup, so the first workflow's thread + # is not allowed to do it as a side effect of opening a stream. + _provider._active = None + with pytest.raises(RuntimeError, match="streams.configure"): + await streams.consumer(None, workflow_id="wf") + streams.configure(provider="memory") + assert await streams.consumer(None, workflow_id="wf") is not None From 0af0389ad012f1bef4af9a174baa8eeb3a16af9d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 143/831] Typed the handles and records honestly. reader() and Consumer.read bind T through overloads, StreamRecord.value admits the control bodies it actually carries, writer() drops the type it ignored, and next() leaves the public surface. --- streams_demo/agent_loop.py | 3 ++- temporalio/streams/__init__.py | 33 ++++++++++++++++------- temporalio/streams/_handles.py | 13 +++------ temporalio/streams/_provider.py | 32 +++++++++++++++++++--- temporalio/streams/_record.py | 9 +++++-- temporalio/streams/providers/memory.py | 5 ++-- tests/streams/test_streams_conformance.py | 2 ++ 7 files changed, 70 insertions(+), 27 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index 79d92c367..0ab6831b5 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -59,7 +59,7 @@ async def run(self, limit: int) -> list[dict[str, Any]]: accepted = 0 try: async for record in inputs: - if record.kind is streams.RecordKind.SUPERSEDED: + if isinstance(record.value, streams.Supersession): # A newer attempt of the same producer started writing. The # decisions already published stand, so the workflow says so # rather than pretending they can be withdrawn. @@ -82,6 +82,7 @@ async def run(self, limit: int) -> list[dict[str, Any]]: # still writing. trace.append({"kind": "finish", "producer": record.producer}) break + assert isinstance(record.value, dict) decision = decide(record.value) await decisions.publish(decision) receipt = await workflow.execute_activity( diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index ea0d86c81..1f1f6acba 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -54,7 +54,7 @@ from __future__ import annotations from datetime import timedelta -from typing import Any, TypeVar +from typing import Any, TypeVar, overload from temporalio.streams._handles import ( ReadSource, @@ -113,6 +113,26 @@ T = TypeVar("T") +@overload +def reader( + stream: str, + *, + type: type[T], + after: Cursor = ..., + idle_timeout: timedelta | None = ..., +) -> StreamReader[T]: ... + + +@overload +def reader( + stream: str, + *, + type: None = None, + after: Cursor = ..., + idle_timeout: timedelta | None = ..., +) -> StreamReader[Any]: ... + + def reader( stream: str, *, @@ -145,21 +165,16 @@ def reader( ) -def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: +def writer(topic: str) -> StreamWriter[Any]: """Publish to ``topic`` on the stream this workflow owns. Args: - topic: The topic name. - type: Declared for symmetry with :func:`reader` and for documentation. - Encoding follows the value. + topic: The topic name. Encoding follows each published value. """ - del type return StreamWriter(open_write(topic), topic) # Importing the package registers every provider whose dependencies are # present in this tree. Import order matters: the registry above must exist # before a provider module can register with it. -from temporalio.streams import ( - providers as _providers, # noqa: E402,F401 # pyright: ignore[reportUnusedImport] -) +from temporalio.streams import providers as providers # noqa: E402 diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py index a6dc9a073..24c6defa2 100644 --- a/temporalio/streams/_handles.py +++ b/temporalio/streams/_handles.py @@ -8,7 +8,7 @@ from __future__ import annotations from collections.abc import AsyncIterator -from typing import Any, Generic, Protocol, TypeVar +from typing import Any, Generic, Protocol, TypeVar, cast from temporalio import workflow from temporalio.api.common.v1 import Payload @@ -161,7 +161,7 @@ def __aiter__(self) -> AsyncIterator[StreamRecord[T]]: async def _iterate(self) -> AsyncIterator[StreamRecord[T]]: while not self._closed: try: - record = await self.next() + record = await self._next() except StopAsyncIteration: # The provider ended the subscription. Iteration stops rather # than raising, so a workflow that reads to the end of a @@ -173,14 +173,9 @@ async def values(self) -> AsyncIterator[T]: """Iterate the data values, dropping control records.""" async for record in self: if record.kind is RecordKind.DATA: - yield record.value + yield cast("T", record.value) - async def next(self) -> StreamRecord[T]: - """The next record, waiting for one if there is none buffered. - - Raises: - StopAsyncIteration: The provider ended the subscription. - """ + async def _next(self) -> StreamRecord[T]: while not self._pending: await self._fill() return self._pending.pop(0) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index b22dbbfd8..1f9dc727d 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -10,9 +10,9 @@ from __future__ import annotations -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator from datetime import timedelta -from typing import Any, Callable, Protocol +from typing import Any, Callable, Protocol, TypeVar, overload from temporalio import activity from temporalio.streams._handles import ReadSource, WriteSink @@ -36,6 +36,8 @@ "worker_options", ] +T = TypeVar("T") + class Producer(Protocol): """Appends to a stream from outside workflow code. @@ -69,19 +71,41 @@ async def finish(self) -> None: class Consumer(Protocol): """Reads a stream from outside workflow code, resumably.""" + @overload + def read( + self, + *, + after: Cursor = ..., + topic: str | None = ..., + type: type[T], + ) -> AsyncGenerator[StreamRecord[T], None]: ... + + @overload + def read( + self, + *, + after: Cursor = ..., + topic: str | None = ..., + type: None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: ... + def read( self, *, after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records after ``after`` as they arrive. ``BEGINNING`` yields everything the stream retains. Any other cursor came from a record this or another reader saw, and reading resumes just past it, so a reader that stores the last cursor it handled and - hands it back sees every record exactly once. + hands it back sees every record exactly once. ``topic`` filters the + stream the workflow publishes; an inbound stream has no topics, and + naming one there raises ``ValueError``. The result is a generator so + a caller that stops early can ``aclose()`` it and release whatever + the provider parked against the store. """ ... diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 4fd322189..5eb3e21e4 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -76,9 +76,14 @@ class Supersession: @dataclass(frozen=True) class StreamRecord(Generic[T]): - """One record as workflow code sees it.""" + """One record as workflow code sees it. - value: T + ``value`` follows ``kind``: a data record carries a ``T``, a supersession + carries the :class:`Supersession` it reports, and a finish marker carries + ``None``. Check ``kind`` before reading it. + """ + + value: T | Supersession | None cursor: Cursor kind: RecordKind = RecordKind.DATA topic: str = "" diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 64e8feb8f..fcf873184 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -17,7 +17,8 @@ from __future__ import annotations import asyncio -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any @@ -240,7 +241,7 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() offset = int(after.token) + 1 if after.token else 0 diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 3a69ea2dd..47b6e29d5 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -68,6 +68,7 @@ def test_supersession_is_synthesized_from_observations(): superseded = attempts.note("model", 2, Cursor("1")) assert superseded is not None assert superseded.kind is RecordKind.SUPERSEDED + assert isinstance(superseded.value, streams.Supersession) assert superseded.value.previous_attempt == 1 # The same attempt again is not a new generation. assert attempts.note("model", 2, Cursor("2")) is None @@ -126,6 +127,7 @@ async def test_new_attempt_supersedes_the_old_one(): records = await take(consumer.read(type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED + assert isinstance(records[1].value, streams.Supersession) assert records[1].value.previous_attempt == 1 assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From 8a2bf8d2c99f5c1e588f7cf833b108aef823112a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 144/831] Kept topics off inbound frames and skipped unreadable frames with a warning. An inbound stream's name is its whole address, so its records carry no topic and a topic filter there is a ValueError on every provider. Both readers now skip a frame the interface did not write and log it, instead of one failing the task while the other drops it silently. --- temporalio/streams/__init__.py | 10 +++---- temporalio/streams/_handles.py | 27 ++++++++++--------- temporalio/streams/_provider.py | 16 ++++++++++++ temporalio/streams/_record.py | 1 + temporalio/streams/providers/memory.py | 15 +++++++---- tests/streams/test_streams_conformance.py | 32 ++++++++++++++++------- 6 files changed, 69 insertions(+), 32 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 1f1f6acba..ff2a75c61 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -137,7 +137,6 @@ def reader( stream: str, *, type: type | None = None, - topic: str | None = None, after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> StreamReader[Any]: @@ -147,10 +146,13 @@ def reader( removing or reordering one renumbers the waits after it. Gate a change behind :func:`temporalio.workflow.patched` as you would for a timer. + An inbound stream has no topics: its name is the whole address, and + every record on it arrives with an empty ``topic``. Topics belong to the + stream the workflow publishes, which :func:`consumer` reads from outside. + Args: stream: The inbound stream's name, relative to this workflow. type: The value type, used as the decode hint. - topic: Only records on this topic, or every topic when omitted. after: Resume after this record. Only honoured on the first subscription of a run, because after that the recorded cursor decides. @@ -159,9 +161,7 @@ def reader( provider's default. """ return StreamReader( - open_read(stream, after=after, idle_timeout=idle_timeout), - topic=topic, - type=type, + open_read(stream, after=after, idle_timeout=idle_timeout), type=type ) diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py index 24c6defa2..9571d6e0c 100644 --- a/temporalio/streams/_handles.py +++ b/temporalio/streams/_handles.py @@ -1,8 +1,8 @@ """The handles workflow code holds. Everything provider-specific sits behind the two protocols at the top. A -handle converts values, frames records, filters topics and synthesizes -supersession; a binding only moves bytes. +handle converts values, frames records and synthesizes supersession; a +provider only moves bytes. """ from __future__ import annotations @@ -131,7 +131,7 @@ async def finish(self) -> None: class StreamReader(Generic[T]): - """Reads a stream from inside workflow code. + """Reads an inbound stream from inside workflow code. Iterating yields every kind of record, including the supersession the reader synthesizes when a producer's newer attempt appears. Check @@ -139,16 +139,9 @@ class StreamReader(Generic[T]): wants data. """ - def __init__( - self, - source: ReadSource, - *, - topic: str | None = None, - type: type | None = None, - ) -> None: + def __init__(self, source: ReadSource, *, type: type | None = None) -> None: """Prefer :func:`temporalio.streams.reader`.""" self._source = source - self._topic = topic self._type = type self._pending: list[StreamRecord[Any]] = [] self._attempts = AttemptTracker() @@ -182,8 +175,16 @@ async def _next(self) -> StreamRecord[T]: async def _fill(self) -> None: for cursor, frame in await self._source.next_batch(): - kind, topic, producer, attempt, sequence, body = _frame.decode(frame) - if self._topic is not None and topic != self._topic: + try: + kind, topic, producer, attempt, sequence, body = _frame.decode(frame) + except ValueError as error: + # Skipped rather than raised: a poisoned record would + # otherwise fail this task on every retry and pin the + # workflow, while an outside reader of the same stream + # skips it. The two readers agree on the answer. + workflow.logger.warning( + "skipping stream record at %s: %s", cursor, error + ) continue superseded = self._attempts.note(producer, attempt, cursor) if superseded is not None: diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 1f9dc727d..a2506649f 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -23,6 +23,7 @@ "Producer", "StreamProvider", "StreamProviderLifecycle", + "check_topic", "configure", "consumer", "drain", @@ -328,6 +329,21 @@ def drain() -> None: release() +def check_topic(stream: str, topic: str | None) -> None: + """Reject a topic filter on an inbound stream. + + An inbound record carries no topic; the stream's name is its whole + address, so a filter there could only ever match nothing. Every provider + calls this at the top of its ``read`` so the answer is the same on all + of them. + """ + if stream and topic is not None: + raise ValueError( + f"inbound stream {stream!r} has no topics; topic= applies to the " + "stream the workflow publishes" + ) + + async def producer( client: Any, *, diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 5eb3e21e4..63f140aea 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -87,6 +87,7 @@ class StreamRecord(Generic[T]): cursor: Cursor kind: RecordKind = RecordKind.DATA topic: str = "" + """The topic on the owner's stream, or empty for an inbound record.""" producer: str = "" """Who wrote it, or empty when the owning workflow wrote it itself.""" attempt: int = 0 diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index fcf873184..ec1f78fc4 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -230,10 +230,11 @@ def _encode(self, value: Any) -> bytes: class MemoryConsumer: """The outside reader, with the shared supersession rule.""" - def __init__(self, store: _MemoryStream, converter: Any) -> None: + def __init__(self, store: _MemoryStream, converter: Any, stream: str) -> None: """Read whatever ``store`` holds, now and as it grows.""" self._store = store self._converter = converter + self._stream = stream async def read( self, @@ -243,6 +244,7 @@ async def read( type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() offset = int(after.token) + 1 if after.token else 0 while True: @@ -256,7 +258,9 @@ async def read( kind, frame_topic, source, attempt, sequence, body = _frame.decode( frame ) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) continue if topic is not None and frame_topic != topic: continue @@ -336,11 +340,12 @@ async def producer( attempt: int = 0, ) -> MemoryProducer: # With no inbound stream named, the target is the store the workflow's - # own writer appends to, and the frame carries the topic instead. + # own writer appends to, and the frame carries the topic. An inbound + # record carries none: the stream's name is its whole address. return MemoryProducer( _stream(_inbound_id(workflow_id, stream)), _converter(client), - stream or topic, + topic, producer_id, attempt, ) @@ -349,7 +354,7 @@ async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> MemoryConsumer: return MemoryConsumer( - _stream(_inbound_id(workflow_id, stream)), _converter(client) + _stream(_inbound_id(workflow_id, stream)), _converter(client), stream ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 47b6e29d5..61eea6b70 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -91,6 +91,8 @@ async def test_append_read_roundtrip(): assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] assert all(r.producer == "model" and r.attempt == 1 for r in records) assert [r.sequence for r in records] == [0, 1, 2] + # An inbound stream has no topics; its name is the whole address. + assert all(r.topic == "" for r in records) async def test_retried_append_is_deduplicated(): @@ -132,19 +134,31 @@ async def test_new_attempt_supersedes_the_old_one(): assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 -async def test_topic_filter(): - producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 +async def test_topic_filter_on_the_owners_stream(): + # Two producers on two topics of the stream the workflow publishes. The + # filter is only meaningful on a store that mixes topics, which is this + # one; an inbound stream carries none. + on_a = await streams.producer( + None, workflow_id="wf", topic="a", producer_id="tool-a", attempt=1 ) - await producer.append({"n": 1}) - other = await streams.producer( - None, workflow_id="wf", stream="other", producer_id="model", attempt=1 + await on_a.append({"n": 1}) + on_b = await streams.producer( + None, workflow_id="wf", topic="b", producer_id="tool-b", attempt=1 ) - await other.append({"n": 2}) + await on_b.append({"n": 2}) + + consumer = await streams.consumer(None, workflow_id="wf") + only_a = await take(consumer.read(type=dict, topic="a"), 1) + assert [r.value for r in only_a] == [{"n": 1}] + + both = await take(consumer.read(type=dict), 2) + assert [(r.topic, r.value) for r in both] == [("a", {"n": 1}), ("b", {"n": 2})] + +async def test_inbound_streams_have_no_topics(): consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict, topic="inputs"), 1) - assert records[0].value == {"n": 1} + with pytest.raises(ValueError, match="inbound stream 'inputs' has no topics"): + await take(consumer.read(type=dict, topic="inputs"), 1) async def test_cursor_resumes_where_it_points(): From 35b12128b5a116ece9e6cb3e912fb57e42c48ffb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 145/831] Let a broken provider import surface instead of vanishing from the registry. --- temporalio/streams/providers/__init__.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py index dff94b250..c254db0fb 100644 --- a/temporalio/streams/providers/__init__.py +++ b/temporalio/streams/providers/__init__.py @@ -13,7 +13,13 @@ for _name in _KNOWN: try: __import__(f"{__name__}.{_name}") - except ImportError: - # This tree does not carry that provider. The registry error message - # lists what is actually available. - pass + except ModuleNotFoundError as error: + # Two things may be missing: the provider module itself, or a + # dependency from outside this package. A name missing inside + # temporalio is a broken provider, and hiding that would turn its + # traceback into "no such provider". + missing = error.name or "" + if missing != f"{__name__}.{_name}" and ( + not missing or missing.startswith("temporalio") + ): + raise From 6e48b54c52bad3c903ad053458e3de1dcbf51c12 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 146/831] Added the workflow-side conformance tests. The reader and writer handles run in a real workflow on the memory provider. Rule 1 and rule 2 are strict expected failures there, so a storage provider running this module turns them into passes. --- tests/streams/test_streams_conformance.py | 5 +- tests/streams/test_streams_workflow.py | 208 ++++++++++++++++++++++ 2 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 tests/streams/test_streams_workflow.py diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 61eea6b70..b66756af9 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -1,10 +1,11 @@ -"""Conformance tests for the stream contract. +"""Conformance tests for the stream contract's outside surface. Written against the public surface plus the in-memory reference provider, so they run with no server and no store. A storage provider reuses the same expectations through its own fixtures; what this file pins down is the contract: framing, producer identity, retry deduplication, supersession, -topic filtering, and cursor resumption. +topic filtering, and cursor resumption. The workflow-side handles and the +two rules about workflow tasks live in ``test_streams_workflow``. """ from __future__ import annotations diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py new file mode 100644 index 000000000..40487686d --- /dev/null +++ b/tests/streams/test_streams_workflow.py @@ -0,0 +1,208 @@ +"""Workflow-side conformance for the stream contract. + +Runs the reader and writer handles inside a real workflow on the memory +provider with a warm cache, and states the two rules about workflow tasks as +tests: a publish commits with its task (rule 1), and reads are recorded +observations that replay re-supplies (rule 2). The memory provider keeps +neither and says so in its docstring, so those two are strict expected +failures here. A storage provider that runs this module turns them into +passes; that is the measurement they exist for. +""" + +from __future__ import annotations + +import uuid +from typing import Any + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams.providers import memory +from temporalio.testing import WorkflowEnvironment +from temporalio.worker import Replayer +from tests.helpers import new_worker +from tests.streams.test_streams_conformance import take + +INPUTS = "inputs" +DECISIONS = "decisions" + + +@pytest.fixture(autouse=True) +def _fresh_memory_provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] + if env.supports_time_skipping: + pytest.skip( + "the memory provider polls on a timer, which time skipping turns into a spin" + ) + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + def __init__(self) -> None: + streams.prepare() + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = streams.reader(INPUTS, type=dict) + decisions = streams.writer(DECISIONS) + trace: list[dict[str, Any]] = [] + try: + async for record in inputs: + if isinstance(record.value, streams.Supersession): + trace.append( + { + "kind": "superseded", + "replaced": record.value.previous_attempt, + "attempt": record.value.attempt, + } + ) + await decisions.publish( + {"retracting_attempt": record.value.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer}) + break + assert isinstance(record.value, dict) + await decisions.publish({"decided": record.value["n"]}) + trace.append( + { + "kind": "decision", + "n": record.value["n"], + "attempt": record.attempt, + } + ) + finally: + inputs.close() + await decisions.finish() + # Twice on purpose: a finished topic stays finished, with one marker. + await decisions.finish() + streams.drain() + return trace + + +async def _run_the_loop(client: Client) -> tuple[Any, list[dict[str, Any]]]: + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, ContractLoop, **streams.worker_options()) as worker: + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + first = await streams.producer( + client, + workflow_id=workflow_id, + stream=INPUTS, + producer_id="model", + attempt=1, + ) + await first.append({"n": 1}, {"n": 2}) + second = await streams.producer( + client, + workflow_id=workflow_id, + stream=INPUTS, + producer_id="model", + attempt=2, + ) + await second.append({"n": 3}) + await second.finish() + trace = await handle.result() + return handle, trace + + +async def test_workflow_reads_decides_and_publishes(client: Client): + handle, trace = await _run_the_loop(client) + assert trace == [ + {"kind": "decision", "n": 1, "attempt": 1}, + {"kind": "decision", "n": 2, "attempt": 1}, + {"kind": "superseded", "replaced": 1, "attempt": 2}, + {"kind": "decision", "n": 3, "attempt": 2}, + {"kind": "finish", "producer": "model"}, + ] + + # The outside view of what the workflow published, on its own topic. + consumer = await streams.consumer(client, workflow_id=handle.id) + records = await take(consumer.read(type=dict, topic=DECISIONS), 5) + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"decided": 1}), + (RecordKind.DATA, {"decided": 2}), + (RecordKind.DATA, {"retracting_attempt": 1}), + (RecordKind.DATA, {"decided": 3}), + (RecordKind.FINISH, None), + ] + assert all(r.producer == "" and r.topic == DECISIONS for r in records) + # The second finish() wrote nothing: the marker is the newest record. + assert await consumer.latest() == records[-1].cursor + + +@pytest.mark.xfail( + strict=True, + reason=( + "rule 2: reading is a recorded observation, so replaying the history " + "with the store gone must re-supply the same records; the memory " + "provider reads live process memory instead" + ), +) +async def test_replay_without_the_store_resupplies_the_records(client: Client): + handle, _ = await _run_the_loop(client) + history = await handle.fetch_history() + + memory.reset() + replayer = Replayer(workflows=[ContractLoop], **streams.worker_options()) + await replayer.replay_workflow(history) + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + def __init__(self) -> None: + streams.prepare() + + @workflow.run + async def run(self) -> None: + decisions = streams.writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + await decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + await decisions.finish() + streams.drain() + + +@pytest.mark.xfail( + strict=True, + reason=( + "rule 1: a publish commits with its workflow task, so no reader sees " + "a record from a task that failed; the memory provider makes it " + "visible at publish time" + ), +) +async def test_a_failed_task_publishes_nothing(client: Client): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker( + client, PublishThenFail, **streams.worker_options() + ) as worker: + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=worker.task_queue + ) + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic=DECISIONS), 2, timeout=30) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] From 360d05424b1e31df5e33a37e551c39cf0210398b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 147/831] Replaced stale wording and renamed the demo types. --- streams_demo/agent_loop.py | 6 +++--- streams_demo/run_demo.py | 4 ++-- temporalio/streams/__init__.py | 10 +++++----- temporalio/streams/_frame.py | 6 +++--- temporalio/streams/_handles.py | 6 +++--- temporalio/streams/_record.py | 7 ++++--- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index 0ab6831b5..f6f14b873 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -1,4 +1,4 @@ -"""One agent loop, written once, run on both stream providers. +"""One agent loop, written once, run on every stream provider. Reads input, decides on it, publishes the decision, and runs an ordinary Activity in the same workflow task. Also handles the two control records the @@ -20,7 +20,7 @@ INPUTS = "inputs" -@activity.defn(name="AI198RecordDecision") +@activity.defn(name="RecordDecision") async def record_decision(decision: dict[str, Any]) -> str: """An ordinary command in the same task as the publish.""" return f"recorded:{decision['source']}:{decision['branch']}" @@ -37,7 +37,7 @@ def decide(token: dict[str, Any]) -> dict[str, Any]: return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} -@workflow.defn(name="AI198StreamContractDemo", sandboxed=False) +@workflow.defn(name="StreamContractDemo", sandboxed=False) class AgentLoop: """Read, decide, write, until the producer says it has finished.""" diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 9d6a62cb5..c4fc8e042 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -1,6 +1,6 @@ """Run the shared agent loop against whichever provider is configured. -Three cases, the same on both providers: +Three cases, the same on every provider: - read, decide, publish and an ordinary Activity in the same workflow task, with the smallest workflow cache the provider supports, so that as much of @@ -9,7 +9,7 @@ to report and the workflow has to act on; - an outside consumer reading what the workflow published. -Byte-identical in both trees. ``provider_setup`` is what differs, and it is +Byte-identical in every tree. ``provider_setup`` is what differs, and it is the only import here that names a provider. """ diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index ff2a75c61..c46a9faf0 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -38,17 +38,17 @@ talks to another, holds one from :func:`instance`. Reading somebody else's stream is out of scope for the first release. It is -the topology neither prototype has evidence for, and leaving it out is what -lets both of them implement the rest. +the topology no provider has evidence for, and leaving it out is what lets +every provider implement the rest. What the contract does not promise: that a :attr:`RecordKind.FINISH` record means the writing activity succeeded, that a superseded attempt's records can be withdrawn, or that a stream outlives the retention its provider is configured for. -Prototype support for AI-198. The public names are the proposal; providers -live under :mod:`temporalio.streams.providers`, one module each, registered -by name and chosen by :func:`configure`. Everything else is shared. +The public names are the proposal; providers live under +:mod:`temporalio.streams.providers`, one module each, registered by name and +chosen by :func:`configure`. Everything else is shared. """ from __future__ import annotations diff --git a/temporalio/streams/_frame.py b/temporalio/streams/_frame.py index c32811d32..df4b4dbd6 100644 --- a/temporalio/streams/_frame.py +++ b/temporalio/streams/_frame.py @@ -1,9 +1,9 @@ -"""The record envelope both bindings put on the wire. +"""The record envelope every provider puts on the wire. A provider stores an opaque body. The contract needs more than a body: which topic a record belongs to, whether it is data or a terminal marker, and which -producer attempt wrote it. Neither prototype carries all of that in a channel -of its own, so the interface carries it here and each binding stores the result +producer attempt wrote it. No provider carries all of that in a channel of +its own, so the interface carries it here and each provider stores the result as an ordinary body. Encoding is synchronous and deterministic because a workflow publishes on the diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py index 9571d6e0c..6d821f32c 100644 --- a/temporalio/streams/_handles.py +++ b/temporalio/streams/_handles.py @@ -72,9 +72,9 @@ def _decode_value(body: bytes, as_type: type | None) -> Any: class StreamWriter(Generic[T]): """Publishes to a topic on the stream this workflow owns. - A workflow can only publish transactionally to a stream it owns, on both - providers. Writing to somebody else's stream is an activity's job, and it - gets the weaker guarantee that goes with doing I/O. + A workflow can only publish transactionally to a stream it owns, on + every provider. Writing to somebody else's stream is an activity's job, + and it gets the weaker guarantee that goes with doing I/O. """ def __init__(self, sink: WriteSink, topic: str) -> None: diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 63f140aea..1f08302a8 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -1,6 +1,6 @@ """The value types the stream contract is expressed in. -Nothing here touches Temporal or a provider, so both bindings share it +Nothing here touches Temporal or a provider, so every provider shares it unchanged. """ @@ -39,8 +39,9 @@ class RecordKind(enum.IntEnum): SUPERSEDED = 3 """A later attempt of the same producer started writing. - Synthesized by the reader from what it observed, so both providers deliver - it identically and replay reproduces it without the provider's help. + Synthesized by the reader from what it observed, so every provider + delivers it identically and replay reproduces it without the provider's + help. """ From 936a725541bd338123ff335ad366090213d36a8f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:09:22 -0700 Subject: [PATCH 148/831] Keyed stores by one helper that survives a colon in the workflow id. Joining the workflow id and the stream name with a bare colon let two addresses share a store. Every provider that keys by the pair now goes through stream_key, which percent-encodes both components first. --- temporalio/streams/_ids.py | 28 ++++++++++++++++++++++++++ temporalio/streams/providers/memory.py | 13 +++++------- 2 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 temporalio/streams/_ids.py diff --git a/temporalio/streams/_ids.py b/temporalio/streams/_ids.py new file mode 100644 index 000000000..625522f75 --- /dev/null +++ b/temporalio/streams/_ids.py @@ -0,0 +1,28 @@ +"""The store key a provider derives from a workflow id and a stream name. + +A workflow id may contain any character, ``:`` included, so joining the pair +with a bare ``:`` is ambiguous: ``("a:b", "c")`` and ``("a", "b:c")`` would +land in one store. Every provider that keys a store by the pair goes through +:func:`stream_key`, so they all agree and none of them collides. +""" + +from __future__ import annotations + +__all__ = ["stream_key"] + + +def _escape(component: str) -> str: + # Percent first, so an escaped component cannot be mistaken for one that + # already contained the escape. + return component.replace("%", "%25").replace(":", "%3A") + + +def stream_key(workflow_id: str, stream: str) -> str: + """The key for ``stream`` of ``workflow_id``, or for the owner's stream when empty. + + Both components are percent-encoded before joining, so the only bare ``:`` + in the result is the separator, and an owner-stream key has none. + """ + if not stream: + return _escape(workflow_id) + return f"{_escape(workflow_id)}:{_escape(stream)}" diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index ec1f78fc4..390c10b9c 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -27,6 +27,7 @@ from temporalio.api.common.v1 import Payload from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._ids import stream_key from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -90,10 +91,6 @@ def reset() -> None: _streams.clear() -def _inbound_id(workflow_id: str, stream: str) -> str: - return f"{workflow_id}:{stream}" if stream else workflow_id - - def _converter(client: Any) -> Any: if client is None: return temporalio.converter.DataConverter.default.payload_converter @@ -320,13 +317,13 @@ def open_read( # idle_timeout as the poll period would give the parameter a second # meaning that a port copying the reference would copy too. del idle_timeout - store = _stream(_inbound_id(workflow.info().workflow_id, stream)) + store = _stream(stream_key(workflow.info().workflow_id, stream)) return _MemReadSource( store, int(after.token) + 1 if after.token else 0, self._poll ) def open_write(self, topic: str) -> WriteSink: - store = _stream(_inbound_id(workflow.info().workflow_id, "")) + store = _stream(stream_key(workflow.info().workflow_id, "")) return _MemWriteSink(store, topic) async def producer( @@ -343,7 +340,7 @@ async def producer( # own writer appends to, and the frame carries the topic. An inbound # record carries none: the stream's name is its whole address. return MemoryProducer( - _stream(_inbound_id(workflow_id, stream)), + _stream(stream_key(workflow_id, stream)), _converter(client), topic, producer_id, @@ -354,7 +351,7 @@ async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> MemoryConsumer: return MemoryConsumer( - _stream(_inbound_id(workflow_id, stream)), _converter(client), stream + _stream(stream_key(workflow_id, stream)), _converter(client), stream ) From ad7c5772a7bf398dda47f8bc113964fd8292e126 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:09:22 -0700 Subject: [PATCH 149/831] Added an async close hook next to prepare and drain. A provider that holds a connection pool or an HTTP session needs a moment where the process says it is done. It is a no-op when nothing is configured, so a shutdown path can call it unconditionally. --- temporalio/streams/__init__.py | 10 ++++++++++ temporalio/streams/_provider.py | 30 +++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index c46a9faf0..f564135fd 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -37,6 +37,14 @@ process default, such as a handler that serves one store while its process talks to another, holds one from :func:`instance`. +Three lifecycle hooks let a provider borrow the caller's lifetime, and each +is a no-op on a provider that needs nothing, so portable code calls all +three unconditionally: :func:`prepare` from the workflow's constructor, for a +transport that registers handlers on the workflow; :func:`drain` before the +workflow returns, for one that parks readers against the run; and +:func:`close`, awaited when the process is done with streams, for one that +holds connections. + Reading somebody else's stream is out of scope for the first release. It is the topology no provider has evidence for, and leaving it out is what lets every provider implement the rest. @@ -67,6 +75,7 @@ Producer, StreamProvider, StreamProviderLifecycle, + close, configure, consumer, drain, @@ -99,6 +108,7 @@ "StreamWriter", "Supersession", "WriteSink", + "close", "configure", "consumer", "drain", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index a2506649f..89e32a2c7 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -24,6 +24,7 @@ "StreamProvider", "StreamProviderLifecycle", "check_topic", + "close", "configure", "consumer", "drain", @@ -191,9 +192,10 @@ async def consumer( class StreamProviderLifecycle(Protocol): """The hooks a provider adds when it needs the workflow's own lifetime. - Separate from :class:`StreamProvider` because most transports need - neither, and a provider is not asked to carry a pair of empty methods to - say so. :func:`prepare` and :func:`drain` call whichever half is present. + Separate from :class:`StreamProvider` because most transports need none + of them, and a provider is not asked to carry empty methods to say so. + :func:`prepare`, :func:`drain` and :func:`close` each call the hook when + the provider defines it. """ def prepare(self) -> None: @@ -214,6 +216,14 @@ def drain(self) -> None: """ ... + async def close(self) -> None: + """Release what this provider holds for the process. + + A provider that keeps a connection pool or an HTTP session open needs + a moment where the process says it is done; this is it. + """ + ... + _factories: dict[str, Callable[[], StreamProvider]] = {} _active: StreamProvider | None = None @@ -329,6 +339,20 @@ def drain() -> None: release() +async def close() -> None: + """Release what the provider holds for this process. + + Await it when the process is done with streams. It is a no-op on + providers that hold nothing, and on a process that never configured one, + so a shutdown path can call it unconditionally. + """ + if _active is None: + return + release = getattr(_active, "close", None) + if release is not None: + await release() + + def check_topic(stream: str, topic: str | None) -> None: """Reject a topic filter on an inbound stream. From 27fb594f0897688f0eb705953386027816f41a71 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:09:22 -0700 Subject: [PATCH 150/831] Parametrised the conformance suite over providers. The memory provider always runs; a store branch registers its own setup behind its STREAMS_LIVE gate and declares the capabilities it lacks, which the fixture turns into skips with a reason. Cases read with a topic wherever they can, and two new cases prove colon-bearing addresses never share a store. --- tests/streams/conftest.py | 12 + tests/streams/test_streams_conformance.py | 309 +++++++++++++++++----- 2 files changed, 255 insertions(+), 66 deletions(-) create mode 100644 tests/streams/conftest.py diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py new file mode 100644 index 000000000..1758f2598 --- /dev/null +++ b/tests/streams/conftest.py @@ -0,0 +1,12 @@ +import pytest + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "inbound_stream: the case writes a workflow's inbound stream from outside", + ) + config.addinivalue_line( + "markers", + "unfiltered_read: the case reads the owner's stream without naming a topic", + ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index b66756af9..0a50ce2cb 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -1,35 +1,79 @@ """Conformance tests for the stream contract's outside surface. -Written against the public surface plus the in-memory reference provider, so -they run with no server and no store. A storage provider reuses the same -expectations through its own fixtures; what this file pins down is the -contract: framing, producer identity, retry deduplication, supersession, -topic filtering, and cursor resumption. The workflow-side handles and the -two rules about workflow tasks live in ``test_streams_workflow``. +Written against the public surface, parametrised over the providers this +tree can stand up. The memory provider always runs, with no server and no +store. A storage provider adds itself to ``SETUPS`` behind its own +``STREAMS_LIVE`` gate: its setup configures the provider, hands back the +client the cases should use, and says which capabilities it lacks, so the +cases marked ``inbound_stream`` or ``unfiltered_read`` are skipped with a +reason on a provider that cannot do them. Every other case reads with a +topic, which is what a store that keys by topic needs. + +What this file pins down is the contract: framing, producer identity, retry +deduplication, supersession, topic filtering, cursor resumption, and store +keys that cannot collide. The workflow-side handles and the two rules about +workflow tasks live in ``test_streams_workflow``. """ from __future__ import annotations import asyncio +import uuid +from collections.abc import AsyncIterator, Callable +from dataclasses import dataclass from typing import Any import pytest from temporalio import streams -from temporalio.streams import _frame, _provider +from temporalio.streams import _frame, _ids, _provider from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import Cursor, RecordKind from temporalio.streams.providers import memory -@pytest.fixture(autouse=True) -def _fresh_memory_provider(): # pyright: ignore[reportUnusedFunction] +@dataclass +class ProviderCase: + """One provider under test, and what the cases may ask of it.""" + + name: str + client: Any = None + inbound_streams: bool = True + """Outside producers may write a workflow's inbound stream.""" + unfiltered_reads: bool = True + """A consumer may read the owner's stream without naming a topic.""" + + +async def _memory_case() -> AsyncIterator[ProviderCase]: memory.reset() streams.configure(provider="memory") - yield + yield ProviderCase("memory") memory.reset() +SETUPS: dict[str, Callable[[], AsyncIterator[ProviderCase]]] = {"memory": _memory_case} + +_CAPABILITIES = { + "inbound_stream": lambda case: case.inbound_streams, + "unfiltered_read": lambda case: case.unfiltered_reads, +} + + +@pytest.fixture(params=sorted(SETUPS)) +async def provider(request: pytest.FixtureRequest) -> AsyncIterator[ProviderCase]: + async for case in SETUPS[request.param](): + for marker, supported in _CAPABILITIES.items(): + if request.node.get_closest_marker(marker) and not supported(case): + pytest.skip(f"the {case.name} provider does not support {marker}") + yield case + + +def new_workflow_id() -> str: + # Unique per case, because a storage provider keeps what earlier cases + # wrote and the memory provider only happens to forget. + return f"wf-{uuid.uuid4().hex}" + + async def take(records: Any, count: int, timeout: float = 5.0) -> list: out: list = [] @@ -75,15 +119,28 @@ def test_supersession_is_synthesized_from_observations(): assert attempts.note("model", 2, Cursor("2")) is None -async def test_append_read_roundtrip(): +def test_stream_keys_cannot_collide(): + # A colon in a workflow id must not make two addresses one key. + assert _ids.stream_key("a:b", "c") != _ids.stream_key("a", "b:c") + assert _ids.stream_key("a:b", "") != _ids.stream_key("a", "b") + assert _ids.stream_key("a%3Ab", "c") != _ids.stream_key("a:b", "c") + assert _ids.stream_key("wf", "inputs") == "wf:inputs" + + +async def test_append_read_roundtrip(provider: ProviderCase): + workflow_id = new_workflow_id() producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) await producer.append({"id": "r1"}, {"id": "r2"}) await producer.finish() - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict), 3) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out"), 3) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -92,42 +149,84 @@ async def test_append_read_roundtrip(): assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] assert all(r.producer == "model" and r.attempt == 1 for r in records) assert [r.sequence for r in records] == [0, 1, 2] + assert all(r.topic == "out" for r in records) + + +@pytest.mark.inbound_stream +async def test_inbound_records_carry_no_topic(provider: ProviderCase): + workflow_id = new_workflow_id() + producer = await streams.producer( + provider.client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"id": "r1"}) + await producer.finish() + + consumer = await streams.consumer( + provider.client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 2) + assert [r.kind for r in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"id": "r1"} # An inbound stream has no topics; its name is the whole address. assert all(r.topic == "" for r in records) + with pytest.raises(ValueError, match="inbound stream 'inputs' has no topics"): + await take(consumer.read(type=dict, topic="inputs"), 1) -async def test_retried_append_is_deduplicated(): +async def test_retried_append_is_deduplicated(provider: ProviderCase): + workflow_id = new_workflow_id() first = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) await first.append({"id": "r1"}) # The retry of the same attempt starts its sequence over and appends the # same record. The provider must not store it twice, and says so by # returning no position for what it dropped. retry = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) assert await retry.append({"id": "r1"}) is None - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict), 1) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out"), 1) assert records[0].value == {"id": "r1"} # The store holds exactly the one record: the newest position is its cursor. - assert await consumer.latest() == records[0].cursor + assert await consumer.latest(topic="out") == records[0].cursor -async def test_new_attempt_supersedes_the_old_one(): +async def test_new_attempt_supersedes_the_old_one(provider: ProviderCase): + workflow_id = new_workflow_id() first = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) await first.append({"text": "The capital of"}) second = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=2 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=2, ) await second.append({"text": "Paris is the capital"}) - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict), 3) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out"), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED assert isinstance(records[1].value, streams.Supersession) @@ -135,101 +234,175 @@ async def test_new_attempt_supersedes_the_old_one(): assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 -async def test_topic_filter_on_the_owners_stream(): +async def test_topic_filter_on_the_owners_stream(provider: ProviderCase): # Two producers on two topics of the stream the workflow publishes. The # filter is only meaningful on a store that mixes topics, which is this # one; an inbound stream carries none. + workflow_id = new_workflow_id() on_a = await streams.producer( - None, workflow_id="wf", topic="a", producer_id="tool-a", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="a", + producer_id="tool-a", + attempt=1, ) await on_a.append({"n": 1}) on_b = await streams.producer( - None, workflow_id="wf", topic="b", producer_id="tool-b", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="b", + producer_id="tool-b", + attempt=1, ) await on_b.append({"n": 2}) - consumer = await streams.consumer(None, workflow_id="wf") + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) only_a = await take(consumer.read(type=dict, topic="a"), 1) - assert [r.value for r in only_a] == [{"n": 1}] + assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] + only_b = await take(consumer.read(type=dict, topic="b"), 1) + assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] - both = await take(consumer.read(type=dict), 2) - assert [(r.topic, r.value) for r in both] == [("a", {"n": 1}), ("b", {"n": 2})] +@pytest.mark.unfiltered_read +async def test_a_read_without_a_topic_sees_every_topic(provider: ProviderCase): + workflow_id = new_workflow_id() + on_a = await streams.producer( + provider.client, + workflow_id=workflow_id, + topic="a", + producer_id="tool-a", + attempt=1, + ) + await on_a.append({"n": 1}) + on_b = await streams.producer( + provider.client, + workflow_id=workflow_id, + topic="b", + producer_id="tool-b", + attempt=1, + ) + await on_b.append({"n": 2}) -async def test_inbound_streams_have_no_topics(): - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - with pytest.raises(ValueError, match="inbound stream 'inputs' has no topics"): - await take(consumer.read(type=dict, topic="inputs"), 1) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + both = await take(consumer.read(type=dict), 2) + assert [(r.topic, r.value) for r in both] == [("a", {"n": 1}), ("b", {"n": 2})] -async def test_cursor_resumes_where_it_points(): +async def test_cursor_resumes_where_it_points(provider: ProviderCase): + workflow_id = new_workflow_id() producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict), 3) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out"), 3) checkpoint = records[0].cursor # Resuming after a record hands back everything past it and nothing # twice, without the reader ever advancing a cursor itself. - resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") - again = await take(resumed.read(type=dict, after=checkpoint), 2) + resumed = await streams.consumer(provider.client, workflow_id=workflow_id) + again = await take(resumed.read(type=dict, topic="out", after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] -async def test_append_cursor_names_the_last_record_of_the_batch(): +async def test_append_cursor_names_the_last_record_of_the_batch( + provider: ProviderCase, +): + workflow_id = new_workflow_id() producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - assert appended is not None + if appended is None: + pytest.skip(f"the {provider.name} provider learns positions at read time") await producer.append({"n": 4}) # A producer that resumes a reader after its own append must see only # what came later, not the tail of the batch it just wrote. - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict, after=appended), 1) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out", after=appended), 1) assert [r.value for r in records] == [{"n": 4}] assert await producer.append() is None -async def test_latest_positions_a_reader_at_the_end(): +async def test_latest_positions_a_reader_at_the_end(provider: ProviderCase): + workflow_id = new_workflow_id() producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - assert await consumer.latest() == streams.BEGINNING + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + assert await consumer.latest(topic="out") == streams.BEGINNING await producer.append({"n": 1}, {"n": 2}) - since = await consumer.latest() + since = await consumer.latest(topic="out") await producer.append({"n": 3}) # A reader that positioned itself before the last append sees only what # came after, which is how a client follows a turn it is about to start. - records = await take(consumer.read(type=dict, after=since), 1) + records = await take(consumer.read(type=dict, topic="out", after=since), 1) assert [r.value for r in records] == [{"n": 3}] -async def test_producer_appends_onto_the_owners_topic(): - # An activity's live output lands on the same topic the workflow - # publishes, so one outside reader follows both. - producer = await streams.producer( - None, workflow_id="wf", topic="events", producer_id="model", attempt=1 +@pytest.mark.inbound_stream +async def test_stream_addresses_with_colons_do_not_share_a_store( + provider: ProviderCase, +): + # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. + base = new_workflow_id() + left = await streams.producer( + provider.client, workflow_id=f"{base}:x", stream="y", producer_id="l", attempt=1 ) - await producer.append({"delta": "hel"}, {"delta": "lo"}) - - consumer = await streams.consumer(None, workflow_id="wf") - records = await take(consumer.read(type=dict, topic="events"), 2) - assert [r.value["delta"] for r in records] == ["hel", "lo"] - assert {r.producer for r in records} == {"model"} + right = await streams.producer( + provider.client, workflow_id=base, stream="x:y", producer_id="r", attempt=1 + ) + await left.append({"side": "left"}) + await right.append({"side": "right"}) + seen_left = await streams.consumer( + provider.client, workflow_id=f"{base}:x", stream="y" + ) + only_left = await take(seen_left.read(type=dict), 1) + assert [r.value for r in only_left] == [{"side": "left"}] + assert await seen_left.latest() == only_left[0].cursor + seen_right = await streams.consumer(provider.client, workflow_id=base, stream="x:y") + only_right = await take(seen_right.read(type=dict), 1) + assert [r.value for r in only_right] == [{"side": "right"}] + assert await seen_right.latest() == only_right[0].cursor + + +async def test_producer_needs_exactly_one_address_and_an_identity( + provider: ProviderCase, +): + workflow_id = new_workflow_id() + with pytest.raises(ValueError): + await streams.producer( + provider.client, workflow_id=workflow_id, producer_id="model", attempt=1 + ) with pytest.raises(ValueError): - await streams.producer(None, workflow_id="wf", producer_id="model", attempt=1) + await streams.producer( + provider.client, + workflow_id=workflow_id, + stream="inputs", + topic="out", + producer_id="model", + attempt=1, + ) # Outside an activity there is no identity to fall back on. with pytest.raises(ValueError, match="producer_id is required"): - await streams.producer(None, workflow_id="wf", stream="inputs") + await streams.producer(provider.client, workflow_id=workflow_id, topic="out") def test_unknown_provider_is_a_clear_error(): @@ -243,5 +416,9 @@ async def test_opening_a_stream_needs_a_configured_provider(): _provider._active = None with pytest.raises(RuntimeError, match="streams.configure"): await streams.consumer(None, workflow_id="wf") + # Closing with nothing configured is allowed, so a shutdown path can + # call it unconditionally. + await streams.close() streams.configure(provider="memory") assert await streams.consumer(None, workflow_id="wf") is not None + await streams.close() From 5c242f2691a3f00bc7b7f03e5a06acd21a9dd2ca Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 151/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From d2bde1489d05ccb73565efc1fb8a0d869533c5a6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 152/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From 07fd27afa4fad2eaa0541f40e0b6d5f542626400 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 153/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- .../streams/providers/workflow_streams.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From 97dc5fdbe324304644bc9f17135bfa528657751c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 154/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- .../streams/providers/workflow_streams.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) From fc7db4aa35307f14876d58a9953866f1434ce386 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 155/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From 4132dc378e5b628751906b840a3d79667de7aa93 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 156/831] Made the Workflow Streams provider pass the linters. The transport already resolves its payload converter and falls back to the default when it holds no client, so the provider asks it rather than reaching through a client that may not be there. --- .../streams/providers/workflow_streams.py | 13 ++++++-- .../streams/test_workflow_streams_provider.py | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d849f1244..656056381 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -186,6 +186,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to one stream or topic on ``handle``.""" self._handle = handle self._converter = converter self._stream = stream @@ -205,15 +206,19 @@ def _shipped_topic(self) -> str: @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the shipped publish Signal.""" entries = [] for value in values: frame = _frame.encode( @@ -230,6 +235,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor("") async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._frame_topic, kind=RecordKind.FINISH, @@ -274,6 +280,7 @@ def __init__( shipped_topic: str | None, poll_cooldown: timedelta, ) -> None: + """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client self._shipped_topic = shipped_topic self._poll_cooldown = poll_cooldown @@ -285,6 +292,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -362,6 +370,7 @@ def _record( return out async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one log per workflow, whatever the topic head = await self._client.get_offset() return Cursor(str(head - 1)) if head > 0 else BEGINNING @@ -369,7 +378,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._client.data_converter.payload_converter + converter = self._client._payload_converter() if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2b491cbf1..612aaa33d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -12,6 +12,7 @@ import asyncio import os import uuid +from typing import Any import pytest @@ -62,7 +63,7 @@ async def run(self) -> int: return seen -async def take(records, count: int, timeout: float = 30.0) -> list: +async def take(records: Any, count: int, timeout: float = 30.0) -> list: out: list = [] async def _collect() -> None: @@ -77,9 +78,7 @@ async def _collect() -> None: async def test_interface_loop_over_workflow_streams(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -119,9 +118,7 @@ async def test_interface_loop_over_workflow_streams(): async def test_retried_producer_dedupes_and_new_attempt_supersedes(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -135,19 +132,28 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): ) first = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await first.append({"n": 1}) # The retry of the same attempt re-sends its first batch. retry = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await retry.append({"n": 1}) second = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=2, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=2, ) await second.append({"n": 2}) From 9ac6d5948fb067d66593219ebed91a2fadebecd3 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 157/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 568f64b4b..735c27ddf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,10 @@ to include examples, links to docs, or any other relevant information. can read, decide on, and write, with a registry that picks the provider when the worker is built. `temporalio.streams.providers.memory` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 3f9674c4e2785e0eebc21eb9b78d18054973f0da Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:44:59 -0700 Subject: [PATCH 158/831] Added public accessors to Workflow Streams for code that rides its wire. A provider that reuses the shipped transport needs the publish signal's name, the log past an offset, and the client's handle and converter. Reading them off private attributes breaks silently on the next contrib change. --- .../contrib/workflow_streams/__init__.py | 6 +++- .../contrib/workflow_streams/_client.py | 14 ++++++++++ .../contrib/workflow_streams/_stream.py | 28 ++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/temporalio/contrib/workflow_streams/__init__.py b/temporalio/contrib/workflow_streams/__init__.py index 41f670f0c..3f225bb2f 100644 --- a/temporalio/contrib/workflow_streams/__init__.py +++ b/temporalio/contrib/workflow_streams/__init__.py @@ -13,7 +13,10 @@ """ from temporalio.contrib.workflow_streams._client import WorkflowStreamClient -from temporalio.contrib.workflow_streams._stream import WorkflowStream +from temporalio.contrib.workflow_streams._stream import ( + PUBLISH_SIGNAL_NAME, + WorkflowStream, +) from temporalio.contrib.workflow_streams._topic_handle import ( TopicHandle, WorkflowTopicHandle, @@ -29,6 +32,7 @@ ) __all__ = [ + "PUBLISH_SIGNAL_NAME", "PollInput", "PollResult", "PublishEntry", diff --git a/temporalio/contrib/workflow_streams/_client.py b/temporalio/contrib/workflow_streams/_client.py index 605bf3f03..5c458bdab 100644 --- a/temporalio/contrib/workflow_streams/_client.py +++ b/temporalio/contrib/workflow_streams/_client.py @@ -325,6 +325,20 @@ def topic( self._topic_types[name] = bound return TopicHandle(self, name, bound) + @property + def handle(self) -> WorkflowHandle[Any, Any]: + """The workflow handle this client publishes to and polls. + + Re-targeted when :py:meth:`subscribe` follows a continue-as-new, so + read it when needed rather than caching it. + """ + return self._handle + + @property + def payload_converter(self) -> PayloadConverter: + """The sync payload converter used for per-item encode and decode.""" + return self._payload_converter() + async def flush(self) -> None: """Flush buffered (and pending) items and wait for server confirmation. diff --git a/temporalio/contrib/workflow_streams/_stream.py b/temporalio/contrib/workflow_streams/_stream.py index ae8608c3b..ff0865c29 100644 --- a/temporalio/contrib/workflow_streams/_stream.py +++ b/temporalio/contrib/workflow_streams/_stream.py @@ -50,7 +50,14 @@ _WorkflowStreamWireItem, ) -_PUBLISH_SIGNAL = "__temporal_workflow_stream_publish" +PUBLISH_SIGNAL_NAME = "__temporal_workflow_stream_publish" +"""The signal :class:`WorkflowStream` registers for external publishes. + +Public so code that sends the signal itself, with its own publisher identity, +does not have to copy the name. +""" + +_PUBLISH_SIGNAL = PUBLISH_SIGNAL_NAME _POLL_UPDATE = "__temporal_workflow_stream_poll" _OFFSET_QUERY = "__temporal_workflow_stream_offset" @@ -234,6 +241,25 @@ def topic( self._topic_types[name] = bound return WorkflowTopicHandle(self, name, bound) + @property + def next_offset(self) -> int: + """The global offset the next published item will receive.""" + return self._base_offset + len(self._log) + + def items_from(self, offset: int) -> list[tuple[int, str, Payload]]: + """Return ``(offset, topic, payload)`` for every item at or past ``offset``. + + Reads the log in place, so it is safe to call from a + :func:`temporalio.workflow.wait_condition` predicate. An ``offset`` + below the truncation base starts at the base instead; the offsets in + the result say where the items actually sit. + """ + start = max(offset, self._base_offset) - self._base_offset + return [ + (self._base_offset + index, item.topic, item.data) + for index, item in enumerate(self._log[start:], start) + ] + def get_state( self, *, publisher_ttl: timedelta = timedelta(seconds=900) ) -> WorkflowStreamState: From a29d2be5228d0c03c46cbd973fc4114890360f3c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 159/831] Keyed the Workflow Streams runtime by workflow instance, not run id. The SDK rebuilds an evicted workflow from history as a new object. A process map keyed by run id handed that object the previous instance's log, with no handlers registered on the new one and the records of a failed task still inside. The stream is now found through the handler the shipped class registers on the instance, and the provider reads the contrib module only through its public surface. --- .../streams/providers/workflow_streams.py | 121 ++++++++---------- 1 file changed, 54 insertions(+), 67 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 656056381..8155f7e9d 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -36,6 +36,7 @@ from temporalio.client import Client from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( + PUBLISH_SIGNAL_NAME, PublishEntry, PublishInput, WorkflowStream, @@ -48,77 +49,63 @@ from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord -_RUN_ATTR = "__temporal_streams_ws_runtime" _TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" class _Runtime: - """Per-run holder for the shipped stream object. + """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed - from a method named ``__init__``, and the provider builds it lazily on - the first read or write of a run. + from a method named ``__init__``. """ - def __init__(self) -> None: - self.stream = WorkflowStream() - # The poll Update stops answering once the workflow is closing, and a - # reader between polls at that moment would lose what the final task - # published. The log is workflow state, so a Query still serves it - # after completion. - workflow.set_query_handler(_TAIL_QUERY, self._tail) + def __init__(self, stream: WorkflowStream | None = None) -> None: + self.stream = WorkflowStream() if stream is None else stream + if workflow.get_query_handler(_TAIL_QUERY) is None: + # The poll Update stops answering once the workflow is closing, + # and a reader between polls at that moment would lose what the + # final task published. The log is workflow state, so a Query + # still serves it after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) def _tail(self, from_offset: int) -> list[dict[str, Any]]: - base = self.stream._base_offset return [ { - "offset": base + index, - "topic": item.topic, - "data": base64.b64encode(item.data.data).decode("ascii"), + "offset": offset, + "topic": topic, + "data": base64.b64encode(payload.data).decode("ascii"), } - for index, item in enumerate(self.stream._log) - if base + index >= from_offset + for offset, topic, payload in self.stream.items_from(from_offset) ] -# Held per run rather than on the workflow instance, because the provider is -# asked to install its handlers from the workflow's constructor, and the -# instance is not registered with the runtime yet at that point. -_runtimes: dict[str, _Runtime] = {} +def _registered_stream() -> WorkflowStream | None: + handler = workflow.get_signal_handler(PUBLISH_SIGNAL_NAME) + if handler is None: + return None + stream = getattr(handler, "__self__", None) + if not isinstance(stream, WorkflowStream): + raise RuntimeError( + f"the {PUBLISH_SIGNAL_NAME!r} signal on this workflow is handled by " + "something other than a WorkflowStream, so the workflow_streams " + "provider cannot share its log" + ) + return stream def _runtime() -> _Runtime: - key = workflow.info().run_id - runtime = _runtimes.get(key) - if runtime is None: - runtime = _Runtime() - _runtimes[key] = runtime - return runtime - - -def drain() -> None: - """Release parked pollers so the workflow can return. - - An Option 0 stream dies with its workflow, and a parked long-poll Update - would otherwise hold completion open. Call it right before the workflow - returns, the same obligation the shipped feature's ``detach_pollers`` - documents. A storage provider has no such step, which is one of the - differences the comparison table charges this transport with. - """ - runtime = _runtimes.pop(workflow.info().run_id, None) - if runtime is not None: - runtime.stream.detach_pollers() + # Found on the instance rather than in a process-level map keyed by run + # id: the SDK rebuilds an evicted workflow from history as a new object, + # and a map would hand that object the stale log with its unregistered + # handlers and the records of a task that failed. + stream = _registered_stream() + return _Runtime() if stream is None else _Runtime(stream) class _WSReadSource: - """Reads the signal-fed log the shipped feature keeps in workflow state. - - Reaches into the stream's private log rather than ``get_state()``, - because the snapshot copies the whole log per call and drops offsets, - and this runs inside ``workflow.wait_condition``. - """ + """Reads the signal-fed log the shipped feature keeps in workflow state.""" def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: self._stream = stream @@ -126,29 +113,21 @@ def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> No self._cursor = start self._closed = False - def _end(self) -> int: - return self._stream._base_offset + len(self._stream._log) - async def next_batch(self) -> list[tuple[Cursor, bytes]]: while True: if self._closed: raise StopAsyncIteration - base = self._stream._base_offset - if self._cursor < base: - # Truncated below the cursor; resume at what remains. - self._cursor = base await workflow.wait_condition( - lambda: self._closed or self._end() > self._cursor + lambda: self._closed or self._stream.next_offset > self._cursor ) if self._closed: raise StopAsyncIteration - batch: list[tuple[Cursor, bytes]] = [] - end = self._end() - for offset in range(self._cursor, end): - item = self._stream._log[offset - self._stream._base_offset] - if item.topic == self._shipped_topic: - batch.append((Cursor(str(offset)), item.data.data)) - self._cursor = end + batch = [ + (Cursor(str(offset)), payload.data) + for offset, topic, payload in self._stream.items_from(self._cursor) + if topic == self._shipped_topic + ] + self._cursor = self._stream.next_offset if batch: return batch @@ -254,7 +233,7 @@ def _entry(self, frame: bytes) -> PublishEntry: async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 await self._handle.signal( - _PUBLISH_SIGNAL, + PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, @@ -324,7 +303,7 @@ async def read( async def _tail(self, from_offset: int) -> list[dict[str, Any]]: try: - return await self._client._handle.query( + wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) except Exception: @@ -378,7 +357,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._payload_converter() + converter = self._client.payload_converter if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] @@ -413,8 +392,16 @@ def prepare(self) -> None: _runtime() def drain(self) -> None: - """Release parked pollers so the workflow can return.""" - drain() + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll + Update would otherwise hold completion open. Call it right before + the workflow returns, the same obligation the shipped feature's + ``detach_pollers`` documents. + """ + stream = _registered_stream() + if stream is not None: + stream.detach_pollers() def open_read( self, From 3e3cf88766f2a0045e205a02d7b4777600fc3823 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 160/831] Committed producer sequences only after the publish signal was accepted. A retry after an ambiguous failure used to carry fresh sequences, so the shipped dedupe let the same batch land twice. The batch now stays pending under its signal sequence until the server accepts it, and goes out first if the caller moves on. append returns None because this transport learns positions at read time. --- .../streams/providers/workflow_streams.py | 100 +++++++++++------- 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 8155f7e9d..fb685fc2c 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -42,8 +42,7 @@ WorkflowStream, WorkflowStreamClient, ) -from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL -from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -147,6 +146,11 @@ async def publish(self, frame: bytes) -> None: self._handle.publish(payload) +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + class WorkflowStreamsProducer: """Appends by sending the shipped publish Signal directly. @@ -154,6 +158,12 @@ class WorkflowStreamsProducer: owns the publisher identity: it must be ``producer#attempt`` for the shipped dedupe to drop a retry and pass a new generation, and the client would use its own random id. + + Sequences are committed only after the server accepted the Signal. A + batch whose Signal raised stays pending and goes out again under the + same signal sequence, either when the caller retries the same values or + ahead of whatever the caller sends next, so an ambiguous failure writes + the batch once and loses nothing. """ def __init__( @@ -174,10 +184,7 @@ def __init__( self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 - - @property - def _frame_topic(self) -> str: - return self._stream or self._topic + self._pending: tuple[list[PublishEntry], int] | None = None @property def _shipped_topic(self) -> str: @@ -196,50 +203,67 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append ``values`` through the shipped publish Signal.""" + async def append(self, *values: Any) -> None: + """Append ``values`` through the shipped publish Signal. + + Always ``None``: this transport learns positions at read time. + """ + if not values: + return None + await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + return None + + async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" + await self._send([(RecordKind.FINISH, b"")]) + + def _frames( + self, bodies: list[tuple[RecordKind, bytes]] + ) -> tuple[list[PublishEntry], int]: + sequence = self._sequence entries = [] - for value in values: + for kind, body in bodies: frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.DATA, + topic=self._topic, + kind=kind, producer=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=sequence, + body=body, ) - self._sequence += 1 - entries.append(self._entry(frame)) - await self._send(entries) - return Cursor("") - - async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._send([self._entry(frame)]) - - def _entry(self, frame: bytes) -> PublishEntry: - payload = Payload(data=frame) - return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) - - async def _send(self, entries: list[PublishEntry]) -> None: - self._signal_sequence += 1 + sequence += 1 + entries.append( + PublishEntry( + topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) + ) + ) + return entries, sequence + + async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: + entries, next_sequence = self._frames(bodies) + if self._pending is not None and self._pending[0] != entries: + # The caller moved on from a batch whose Signal raised. It goes + # first, under the signal sequence it already had, so a copy the + # server did accept is dropped and one it never saw lands. The + # new batch is then renumbered behind it. + await self._signal(*self._pending) + entries, next_sequence = self._frames(bodies) + await self._signal(entries, next_sequence) + + async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: + signal_sequence = self._signal_sequence + 1 + self._pending = (entries, next_sequence) await self._handle.signal( PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, - sequence=self._signal_sequence, + sequence=signal_sequence, ), ) + self._signal_sequence = signal_sequence + self._sequence = next_sequence + self._pending = None def _encode(self, value: Any) -> bytes: payload = ( From ba2a7ade89f8d80721d4b8ec3fa59e1ba7b60e4a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 161/831] Adapted the Workflow Streams provider to the interface changes. Inbound frames carry no topic and a topic filter on an inbound stream is rejected through the shared check; producer identity comes resolved from the package; an unreadable frame is skipped with a warning; read is declared as the generator it is. --- .../streams/providers/workflow_streams.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index fb685fc2c..ef2a88312 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -27,7 +27,8 @@ from __future__ import annotations import base64 -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any @@ -52,6 +53,8 @@ _IN = "in:" _OUT = "out:" +logger = logging.getLogger(__name__) + class _Runtime: """A view over the shipped stream object of the running workflow instance. @@ -280,12 +283,13 @@ class WorkflowStreamsConsumer: def __init__( self, stream_client: WorkflowStreamClient, - shipped_topic: str | None, + stream: str, poll_cooldown: timedelta, ) -> None: """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client - self._shipped_topic = shipped_topic + self._stream = stream + self._shipped_topic = f"{_IN}{stream}" if stream else None self._poll_cooldown = poll_cooldown async def read( @@ -294,8 +298,9 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -351,7 +356,9 @@ def _record( cursor = Cursor(str(offset)) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) return [] if topic is not None and frame_topic != topic: return [] @@ -456,11 +463,6 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return WorkflowStreamsProducer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, @@ -475,7 +477,7 @@ async def consumer( ) -> WorkflowStreamsConsumer: return WorkflowStreamsConsumer( WorkflowStreamClient.create(client, workflow_id), - f"{_IN}{stream}" if stream else None, + stream, self._poll_cooldown, ) From 6b43211c9e45cf11ffa3769a92f682f4ec8a0766 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 162/831] Narrowed the tail query's error handling and filtered owner reads by topic. Only a missing handler or a vanished history means there is no tail to serve; anything else, such as a query timeout with no worker polling, is now an error rather than a silent empty stream. An owner-stream read with a topic subscribes to that shipped topic alone instead of dropping inbound items client-side. --- .../streams/providers/workflow_streams.py | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index ef2a88312..049fd60e9 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -20,8 +20,16 @@ - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns an empty cursor. The Signal transport learns positions - at read time; that is this provider's stated deviation. +- ``append`` returns ``None``. The Signal transport learns positions at read + time, so a caller that wants to follow from now asks ``Consumer.latest``. +- The workflow-side stream object belongs to the workflow instance, found + through the handler the shipped class registers on it. An evicted and + rebuilt workflow gets its own, so a task that failed leaks nothing into + the next attempt's log and a replayed run does not see records twice. +- An owner-stream read with a topic subscribes to that shipped topic alone. + Without one it has to take every shipped topic and drop the inbound + items client-side, which spends the poll response cap on records the + reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -34,7 +42,7 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowQueryFailedError from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -303,42 +311,63 @@ async def read( _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 + if self._shipped_topic is not None: + shipped = [self._shipped_topic] + elif topic is not None: + shipped = [f"{_OUT}{topic}"] + else: + shipped = None subscription = self._client.subscribe( - self._shipped_topic, + shipped, from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) - async for item in subscription: - next_offset = item.offset + 1 - record = self._record( - attempts, item.offset, item.topic, item.data.payload.data, topic, type - ) - for out in record: - yield out + try: + async for item in subscription: + next_offset = item.offset + 1 + for out in self._record( + attempts, + item.offset, + item.topic, + item.data.payload.data, + topic, + type, + ): + yield out + finally: + # Lets go of the parked poll when the caller stops early. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() # The subscription ends when the workflow is closing or closed. What # landed after the last poll is still in workflow state, so the tail # comes back by Query rather than being lost with the run. - for wire in await self._tail(next_offset): + for offset, shipped_topic, frame in await self._tail(next_offset): for out in self._record( - attempts, - wire["offset"], - wire["topic"], - base64.b64decode(wire["data"]), - topic, - type, + attempts, offset, shipped_topic, frame, topic, type ): yield out - async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: try: wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) - except Exception: - # A workflow that never opened a stream has no handler to ask, and - # one whose History is gone has nothing left to serve. + except WorkflowQueryFailedError as error: + if "expected but not found" not in str(error): + raise + # The workflow never opened a stream through this provider, so + # there is no tail to serve. return [] + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The History is gone; nothing is left to serve. + return [] + return [ + (item["offset"], item["topic"], base64.b64decode(item["data"])) + for item in wire + ] def _record( self, From c2fe72e3381f856b774afced45a64978ca051fec Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 163/831] Ran the Workflow Streams provider tests on the test environment's server. The tests take the shared client fixture instead of an opt-in live gate, the loop workflow calls the portable lifecycle hooks, and new cases cover a cold workflow cache, the tail of a closed run, and the resend of a batch whose signal failed. --- .../streams/test_workflow_streams_provider.py | 227 +++++++++++++----- 1 file changed, 166 insertions(+), 61 deletions(-) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612aaa33d..612e99e02 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -1,44 +1,46 @@ -"""Live conformance for the workflow_streams provider. +"""Conformance for the workflow_streams provider on the test environment's server. -Runs the interface loop over the shipped Option 0 transport against a real -server: an outside producer appends through the publish Signal, the workflow -reads and republishes through its own state, and an outside consumer follows -the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it -needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +Runs the interface loop over the shipped Option 0 transport: an outside +producer appends through the publish Signal, the workflow reads and +republishes through its own state, and an outside consumer follows the poll +Update while the run is open and the tail Query once it has closed. """ from __future__ import annotations import asyncio -import os +import base64 import uuid from typing import Any import pytest from temporalio import streams, workflow +from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams.providers.workflow_streams import drain -from temporalio.worker import Worker +from temporalio.contrib.workflow_streams import PublishInput +from temporalio.converter import DataConverter +from temporalio.streams import RecordKind, _frame +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from tests.helpers import new_worker -pytestmark = pytest.mark.skipif( - os.environ.get("STREAMS_LIVE") != "workflow_streams", - reason="needs a live server; run with STREAMS_LIVE=workflow_streams", -) + +@pytest.fixture(autouse=True) +def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] + streams.configure(provider="workflow_streams") @workflow.defn class EchoLoop: """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. - Lingers until released, because an Option 0 stream dies with its - workflow: a reader that arrives after close finds nothing, which is the - transport limit the doc states rather than a defect to fix here. + Lingers until released so a reader can follow it while it runs; whoever + arrives after it closed is served by the tail Query instead. """ def __init__(self) -> None: self._released = False + streams.prepare() @workflow.signal def release(self) -> None: @@ -54,11 +56,12 @@ async def run(self) -> int: break if record.kind is not RecordKind.DATA: continue + assert isinstance(record.value, dict) seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() await workflow.wait_condition(lambda: self._released) - drain() + streams.drain() await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -76,59 +79,40 @@ async def _collect() -> None: return out -async def test_interface_loop_over_workflow_streams(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - handle = await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" - ) +async def _feed(client: Client, workflow_id: str) -> None: + producer = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() - producer = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, + +ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] + + +async def test_interface_loop_over_workflow_streams(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await producer.append({"n": 1}, {"n": 2}) - await producer.append({"n": 3}) - await producer.finish() + await _feed(client, workflow_id) consumer = await streams.consumer(client, workflow_id=workflow_id) records = await take(consumer.read(type=dict), 4) - assert [r.kind for r in records] == [ - RecordKind.DATA, - RecordKind.DATA, - RecordKind.DATA, - RecordKind.FINISH, - ] + assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" +async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) first = await streams.producer( @@ -147,7 +131,7 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): producer_id="model", attempt=1, ) - await retry.append({"n": 1}) + assert await retry.append({"n": 1}) is None second = await streams.producer( client, workflow_id=workflow_id, @@ -163,5 +147,126 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): records = await take(consumer.read(type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED + assert isinstance(records[1].value, streams.Supersession) assert records[1].value.previous_attempt == 1 assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + # Inbound records carry no topic; the stream's name is the address. + assert all(r.topic == "" for r in records) + + await second.finish() + await handle.signal(EchoLoop.release) + await handle.result() + + +async def test_cold_cache_serves_each_record_once(client: Client): + # Every task rebuilds the workflow from history, so the stream object + # has to belong to the instance that is running: a stale one would carry + # the previous instance's log and hand out every record twice. + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + inbound = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + arrived = await take(inbound.read(type=dict), 4) + assert [r.kind for r in arrived] == ECHOED + assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + +async def test_a_closed_run_serves_its_tail_by_query(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + # Nothing polled while the run was open. The poll Update is gone with + # the run, so everything below arrives through the tail Query. + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + checkpoint = records[1].cursor + resumed = await streams.consumer(client, workflow_id=workflow_id) + again = await take(resumed.read(type=dict, after=checkpoint), 2) + assert [r.value["echo"] for r in again[:1]] == [3] + assert again[1].kind is RecordKind.FINISH + + +class _FlakyHandle: + """A workflow handle whose first Signal is accepted and then reported failed.""" + + def __init__(self) -> None: + self.sent: list[PublishInput] = [] + self._fail_next = True + + async def signal(self, name: str, arg: PublishInput) -> None: + del name + self.sent.append(arg) + if self._fail_next: + self._fail_next = False + raise ConnectionResetError( + "the server accepted the signal, the reply was lost" + ) + + +def _frames( + publish: PublishInput, +) -> list[tuple[RecordKind, str, str, int, int, bytes]]: + out = [] + for entry in publish.items: + payload = Payload() + payload.ParseFromString(base64.b64decode(entry.data)) + out.append(_frame.decode(payload.data)) + return out + + +def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: + return [ + (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + ] + + +def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: + return WorkflowStreamsProducer( + handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + ) + + +async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + # The retry carries the same signal sequence and the same frame sequence + # as the failed send, so the shipped dedupe drops the copy; the batch + # after it continues the numbering. + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + + +async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 2}, {"n": 3}) + await producer.finish() + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] + assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH From b2a57bf8842dd536835dd3c7b3aa612984be72ae Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 164/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 72df2e31a886164e56cb97b1c559b2c88b65cc3f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 165/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From e4fdeaea8a90f350f6c5548ffa12a549481cbfbc Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 166/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From f0116bebed9c42c708589e5f0b31c1aaa8e66a02 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 167/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 735c27ddf..c0f2f8b61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From e0ac7b1a60c675dc6033511e6c1d96b3570105d4 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 168/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From 7e44174f52d75427f7e7c0ea5ca89fed01caf17c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:26:33 -0700 Subject: [PATCH 169/831] Added the IDL contract and generation for the stream endpoint. The stream endpoint's shape lived only in hand-written Python, so no other language could be given the contract. This defines it once in a nexusrpc yaml contract and generates the Python bindings from it. The generated _definitions helper is hidden from the API docs and skipped by pydocstyle, the same way the other generated trees are. --- pyproject.toml | 6 +- scripts/gen_streams_nexus_api.py | 80 +++ .../providers/_nexus_generated/__init__.py | 23 + .../_nexus_generated/_definitions.py | 542 ++++++++++++++ .../providers/_nexus_generated/models.py | 670 ++++++++++++++++++ .../providers/_nexus_generated/services.py | 39 + .../providers/temporal_streams.nexusrpc.yaml | 123 ++++ 7 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 scripts/gen_streams_nexus_api.py create mode 100644 temporalio/streams/providers/_nexus_generated/__init__.py create mode 100644 temporalio/streams/providers/_nexus_generated/_definitions.py create mode 100644 temporalio/streams/providers/_nexus_generated/models.py create mode 100644 temporalio/streams/providers/_nexus_generated/services.py create mode 100644 temporalio/streams/providers/temporal_streams.nexusrpc.yaml diff --git a/pyproject.toml b/pyproject.toml index b7077785f..e55c39219 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,9 +125,11 @@ format = [ ] gen-docs = "uv run scripts/gen_docs.py" gen-nexus-system-api = "uv run scripts/gen_nexus_system_api.py" +gen-streams-nexus-api = "uv run scripts/gen_streams_nexus_api.py" gen-protos = [ { cmd = "uv run scripts/gen_protos.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -135,6 +137,7 @@ gen-protos = [ gen-protos-docker = [ { cmd = "uv run scripts/gen_protos_docker.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -207,7 +210,7 @@ ignore_errors = true [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 -match_dir = "^(?!(docs|scripts|tests|api|proto|system|\\.)).*" +match_dir = "^(?!(docs|scripts|tests|api|proto|system|_nexus_generated|\\.)).*" add_ignore = [ # We like to wrap at a certain number of chars, even long summary sentences. # https://github.com/PyCQA/pydocstyle/issues/184 @@ -241,6 +244,7 @@ privacy = [ "HIDDEN:temporalio.worker.workflow_sandbox.importer", "HIDDEN:temporalio.worker.workflow_sandbox.in_sandbox", "HIDDEN:**.*_pb2*", + "HIDDEN:temporalio.streams.providers._nexus_generated._definitions", ] project-name = "Temporal Python" sidebar-expand-depth = 2 diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py new file mode 100644 index 000000000..800aba944 --- /dev/null +++ b/scripts/gen_streams_nexus_api.py @@ -0,0 +1,80 @@ +import os +import shutil +import subprocess +import sys +from pathlib import Path + +base_dir = Path(__file__).parent.parent +providers_dir = base_dir / "temporalio" / "streams" / "providers" +contract_path = providers_dir / "temporal_streams.nexusrpc.yaml" +output_dir = providers_dir / "_nexus_generated" +# Pinned to the version CI installs, because nexgen's output changes between +# releases and check-protos compares against what is committed here. +NEX_GEN_VERSION = "0.2.4" + + +def nex_gen_command() -> list[str]: + if bin_path := os.environ.get("NEX_GEN_BIN"): + return [bin_path] + + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + # Same build as the system API script installs, so one binary + # serves both and neither can overwrite the other's output. + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] + + +def generate_streams_nexus_api() -> None: + if not contract_path.exists(): + raise RuntimeError(f"missing stream contract: {contract_path}") + + command = nex_gen_command() + shutil.rmtree(output_dir, ignore_errors=True) + subprocess.check_call( + [ + *command, + "python", + str(contract_path), + "--output", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + "I", + "--fix", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "format", + str(output_dir), + ] + ) + + +if __name__ == "__main__": + print("Generating stream endpoint Nexus API...", file=sys.stderr) + generate_streams_nexus_api() + print("Done", file=sys.stderr) diff --git a/temporalio/streams/providers/_nexus_generated/__init__.py b/temporalio/streams/providers/_nexus_generated/__init__.py new file mode 100644 index 000000000..c62eaa6dd --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/__init__.py @@ -0,0 +1,23 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from ._definitions import Violation +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, +) +from .services import TemporalStreams + +__all__ = [ + "Violation", + "AppendInput", + "AppendOutput", + "ReadInput", + "ReadOutput", + "RecordWire", + "TemporalStreams", +] diff --git a/temporalio/streams/providers/_nexus_generated/_definitions.py b/temporalio/streams/providers/_nexus_generated/_definitions.py new file mode 100644 index 000000000..dc8de5bb5 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/_definitions.py @@ -0,0 +1,542 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import base64 +import collections.abc +import dataclasses +import datetime +import json +import re +import typing + +import temporalio.converter +import temporalio.exceptions + +__all__ = [ + "Violation", + "_binary64", + "_check_contains", + "_check_date_time", + "_check_duration", + "_check_time", + "_check_unique_items", + "_collect", + "_json_values_equal", + "_format_base64", + "_format_base64url", + "_format_date", + "_format_date_time", + "_format_duration", + "_format_time", + "_parse_base64", + "_parse_base64url", + "_parse_date", + "_parse_date_time", + "_parse_duration", + "_parse_spec_integer", + "_parse_time", + "_quote", + "_transfer_type_convertible", +] + + +@dataclasses.dataclass(frozen=True, slots=True) +class Violation: + """A single constraint failure, located by JSON path.""" + + path: str + reason: str + + +def _quote(value: object) -> str: + """Renders a value in the JSON form every target quotes offending values in.""" + + try: + return json.dumps(value, ensure_ascii=False) + except (TypeError, ValueError): + return repr(value) + + +def _collect( + violations: list[Violation], + path: str, + error: temporalio.exceptions.ApplicationError, +) -> None: + """Re-paths a nested model's violations under `path` and appends them.""" + + if error.type != "PayloadValidationError" or not error.details: + raise error + # Generated failures retain the original list as their first detail. The + # cast is type-checker-only and performs no serialization. + nested_violations = typing.cast(list[Violation], error.details[0]) + for inner in nested_violations: + # A nested violation about the value *itself* carries no path of its own + # (a union branch's own constraint, an element-level check), so the + # prefix is the whole path -- never a dangling separator (P11). + nested = f"{path}.{inner.path}" if inner.path else path + violations.append(Violation(path=nested, reason=inner.reason)) + + +_ModelT = typing.TypeVar("_ModelT") + + +def _transfer_type_convertible( + converter: type[temporalio.converter.TransferTypeConverter[typing.Any, typing.Any]], +) -> collections.abc.Callable[[type[_ModelT]], type[_ModelT]]: + """Registers a transfer type converter on a model class. + + Wraps `temporalio.converter.transfer_type_convertible` to erase the + converter's value-type parameter. Binding it directly on the decorated class + is circular for a static type checker -- the class's type depends on the + decorator, whose value type depends on the class -- which degrades the model + to `Unknown`. Erasing it here keeps the decorator idiomatic at each model and + resolves the cycle. + """ + + return temporalio.converter.transfer_type_convertible(converter) + + +_INTEGER_CAP = (1 << 53) - 1 + + +def _parse_spec_integer( + value: object, path: str, violations: list[Violation] +) -> int | None: + """Parses a JSON number as a spec integer (`1.0` accepted, `1.5` rejected).""" + + # `bool` is a subclass of `int`, so it must be excluded before the int check. + if isinstance(value, bool) or not isinstance(value, (int, float)): + violations.append(Violation(path=path, reason="expected integer")) + return None + if isinstance(value, float): + if not value.is_integer(): + violations.append(Violation(path=path, reason="expected integer")) + return None + out = int(value) + else: + out = value + if abs(out) > _INTEGER_CAP: + violations.append(Violation(path=path, reason="expected integer")) + return None + return out + + +def _binary64(value: float) -> float: + """Narrows a `number` value to the binary64 domain shared by every target.""" + + try: + return float(value) + except OverflowError: + # Past the binary64 range there is nothing to narrow to. The caller's + # finiteness check has already recorded that violation and will raise, so + # hand the value back rather than throwing out of turn and losing the + # other violations collected alongside it. + return value + + +def _json_values_equal(left: typing.Any, right: typing.Any) -> bool: + """Compares JSON values without Python's bool-as-int equality leak.""" + + left_is_number = isinstance(left, (int, float)) and not isinstance(left, bool) + right_is_number = isinstance(right, (int, float)) and not isinstance(right, bool) + if left_is_number or right_is_number: + return left_is_number and right_is_number and left == right + if type(left) is not type(right): + return False + if isinstance(left, list): + left_list = typing.cast("list[typing.Any]", left) + right_list = typing.cast("list[typing.Any]", right) + return len(left_list) == len(right_list) and all( + _json_values_equal(a, b) for a, b in zip(left_list, right_list) + ) + if isinstance(left, dict): + left_dict = typing.cast("dict[typing.Any, typing.Any]", left) + right_dict = typing.cast("dict[typing.Any, typing.Any]", right) + return left_dict.keys() == right_dict.keys() and all( + _json_values_equal(left_dict[key], right_dict[key]) for key in left_dict + ) + return left == right + + +def _check_unique_items( + value: list[typing.Any], path: str, violations: list[Violation] +) -> None: + """Asserts an array's elements are pairwise distinct.""" + + seen: list[typing.Any] = [] + for index, element in enumerate(value): + for earlier, previous in enumerate(seen): + if _json_values_equal(previous, element): + violations.append( + Violation( + path=path, + reason=( + f"duplicate items: element at index {index} " + f"equals index {earlier}" + ), + ) + ) + break + seen.append(element) + + +def _check_contains( + value: list[typing.Any], + matches: typing.Callable[[typing.Any], bool], + min_contains: int, + max_contains: int | None, + bounded_min: bool, + path: str, + violations: list[Violation], +) -> None: + """Asserts how many of an array's elements match the `contains` schema.""" + + match_count = sum(1 for element in value if matches(element)) + if match_count < min_contains: + if bounded_min: + violations.append( + Violation( + path=path, + reason=( + f"too few matching items: at least {min_contains}, " + f"got {match_count}" + ), + ) + ) + else: + violations.append( + Violation(path=path, reason="no element matches the required schema") + ) + if max_contains is not None and match_count > max_contains: + violations.append( + Violation( + path=path, + reason=( + f"too many matching items: at most {max_contains}, " + f"got {match_count}" + ), + ) + ) + + +_TEMPORAL_DATE_TIME_RE = re.compile( + r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])\Z" +) +_TEMPORAL_DATE_RE = re.compile(r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\Z") +_TEMPORAL_TIME_RE = re.compile( + r"^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])?\Z" +) +_TEMPORAL_DURATION_RE = re.compile( + r"^PT(?:[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?|[0-9]+M(?:[0-9]+S)?|[0-9]+S)\Z" +) +_TEMPORAL_MAX_DURATION_SECONDS = ((1 << 63) - 1) // 1_000_000_000 +# A duration component with more digits than the cap itself is over the cap +# whatever those digits are, which is how the magnitude is bounded before `int()` +# sees it: CPython refuses to convert a string of more than 4300 digits. +_TEMPORAL_MAX_DURATION_DIGITS = len(str(_TEMPORAL_MAX_DURATION_SECONDS)) +# `datetime` resolves to microseconds, and `fromisoformat` before Python 3.11 +# parses only the fraction widths `isoformat` writes. +_TEMPORAL_FRACTION_DIGITS = 6 + + +def _days_in_month(year: int, month: int) -> int: + if month in (1, 3, 5, 7, 8, 10, 12): + return 31 + if month in (4, 6, 9, 11): + return 30 + if month == 2: + return 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28 + return 0 + + +def _valid_temporal_calendar(value: str) -> bool: + if len(value) < 10: + return False + try: + year, month, day = int(value[0:4]), int(value[5:7]), int(value[8:10]) + except ValueError: + return False + # `datetime.MINYEAR` is 1, which is also the shared cross-language floor. + # Year 0000 is rejected rather than shifted into range, and + # `_temporal_reason` says so. + if year < datetime.MINYEAR: + return False + maximum = _days_in_month(year, month) + return maximum > 0 and 1 <= day <= maximum + + +def _temporal_reason(name: str, value: str) -> str: + """The reason a rejected temporal string is reported under. + + Year 0000 earns its own clause so the caller sees the shared calendar floor + rather than only a generic malformed-timestamp reason. + """ + + if value[0:4] == "0000": + return ( + f"must be a valid {name}, got {_quote(value)}: year 0000 is not" + f" representable (datetime.MINYEAR is {datetime.MINYEAR})" + ) + return f"must be a valid {name}, got {_quote(value)}" + + +def _temporal_isoformat(value: str) -> str: + """Rewrites a wire temporal into the spelling `fromisoformat` accepts. + + `Z` becomes `+00:00`, and the fractional second is padded or truncated to + exactly `_TEMPORAL_FRACTION_DIGITS`: before Python 3.11 `fromisoformat` + parses only what `isoformat` writes, so an RFC 3339 `.1` or `.1234567` -- + which every other target accepts -- would otherwise raise. Digits past the + sixth are dropped, the loss at `datetime`'s own resolution that P1 allows; + the canonical output re-trims the padding, so `.1` still writes as `.1`. + """ + + normalized = value.upper() + if normalized.endswith("Z"): + normalized = normalized[:-1] + "+00:00" + dot = normalized.find(".") + if dot < 0: + return normalized + end = dot + 1 + while end < len(normalized) and normalized[end].isdigit(): + end += 1 + fraction = normalized[dot + 1 : end].ljust(_TEMPORAL_FRACTION_DIGITS, "0") + return ( + normalized[: dot + 1] + fraction[:_TEMPORAL_FRACTION_DIGITS] + normalized[end:] + ) + + +def _parse_date_time( + value: str, path: str, violations: list[Violation] +) -> datetime.datetime | None: + if _TEMPORAL_DATE_TIME_RE.match(value) is None or not _valid_temporal_calendar( + value + ): + violations.append( + Violation(path=path, reason=_temporal_reason("date-time", value)) + ) + return None + return datetime.datetime.fromisoformat(_temporal_isoformat(value)) + + +def _parse_date( + value: str, path: str, violations: list[Violation] +) -> datetime.date | None: + if _TEMPORAL_DATE_RE.match(value) is None or not _valid_temporal_calendar(value): + violations.append(Violation(path=path, reason=_temporal_reason("date", value))) + return None + return datetime.date.fromisoformat(value) + + +def _parse_time( + value: str, path: str, violations: list[Violation] +) -> datetime.time | None: + if _TEMPORAL_TIME_RE.match(value) is None: + violations.append(Violation(path=path, reason=_temporal_reason("time", value))) + return None + return datetime.time.fromisoformat(_temporal_isoformat(value)) + + +def _parse_duration( + value: str, path: str, violations: list[Violation] +) -> datetime.timedelta | None: + if _TEMPORAL_DURATION_RE.match(value) is None: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + total = 0 + number = "" + for char in value[2:]: + if char.isdigit(): + number += char + continue + digits = number.lstrip("0") + number = "" + if len(digits) > _TEMPORAL_MAX_DURATION_DIGITS: + # Over the cap by digit count alone (see the constant), so the + # conversion `int()` would refuse is never attempted. + total = _TEMPORAL_MAX_DURATION_SECONDS + 1 + break + total += int(digits or "0") * {"H": 3600, "M": 60, "S": 1}[char] + if total > _TEMPORAL_MAX_DURATION_SECONDS: + break + if total > _TEMPORAL_MAX_DURATION_SECONDS: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + return datetime.timedelta(seconds=total) + + +def _check_temporal_offset( + name: str, + value: datetime.datetime | datetime.time, + offset: datetime.timedelta, + path: str, + violations: list[Violation], +) -> None: + """Asserts a UTC offset is a whole number of minutes, the finest the wire + form spells (`tzinfo` allows seconds, which the offset would silently lose). + """ + + if offset % datetime.timedelta(minutes=1): + violations.append( + Violation( + path=path, + reason=( + f"must be a valid {name}, got {_quote(str(value))}: " + f"the UTC offset {offset} is not a whole number of minutes" + ), + ) + ) + + +def _check_date_time( + value: datetime.datetime, path: str, violations: list[Violation] +) -> None: + """Asserts a datetime is writable as a wire date-time (P12). + + A dataclass is constructed unchecked, so a naive datetime -- with no offset + the required wire form could carry -- reaches serialize; without this it + would emit a value this module's own parser rejects. + """ + + offset = value.utcoffset() + if offset is None: + violations.append( + Violation( + path=path, + reason=( + f"must be a valid date-time, got {_quote(str(value))}: " + "a naive datetime carries no UTC offset" + ), + ) + ) + return + _check_temporal_offset("date-time", value, offset, path, violations) + + +def _check_time(value: datetime.time, path: str, violations: list[Violation]) -> None: + """Asserts a time is writable as a wire time (P12). The offset is optional in + the grammar, so only its precision is held to anything.""" + + offset = value.utcoffset() + if offset is not None: + _check_temporal_offset("time", value, offset, path, violations) + + +def _check_duration( + value: datetime.timedelta, path: str, violations: list[Violation] +) -> None: + """Asserts a timedelta is writable as a wire duration (P12): the grammar is + unsigned, whole-second and capped, and a `timedelta` is none of those.""" + + if value < datetime.timedelta(0): + reason = "a duration cannot be negative" + elif value % datetime.timedelta(seconds=1): + reason = "a duration cannot carry a fraction of a second" + elif value.total_seconds() > _TEMPORAL_MAX_DURATION_SECONDS: + reason = f"a duration cannot exceed {_TEMPORAL_MAX_DURATION_SECONDS} seconds" + else: + return + violations.append( + Violation( + path=path, + reason=f"must be a valid duration, got {_quote(str(value))}: {reason}", + ) + ) + + +def _temporal_frac(microsecond: int) -> str: + if microsecond == 0: + return "" + return "." + f"{microsecond:06d}".rstrip("0") + + +def _temporal_offset(value: datetime.datetime | datetime.time) -> str: + offset = value.utcoffset() + if offset is None: + return "" + total = int(offset.total_seconds()) + if total == 0: + return "Z" + sign = "+" if total > 0 else "-" + total = abs(total) + return f"{sign}{total // 3600:02d}:{(total % 3600) // 60:02d}" + + +def _format_date_time(value: datetime.datetime) -> str: + return ( + f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + f"T{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_date(value: datetime.date) -> str: + return f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + + +def _format_time(value: datetime.time) -> str: + return ( + f"{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_duration(value: datetime.timedelta) -> str: + total = int(value.total_seconds()) + if total == 0: + return "PT0S" + hours, remainder = divmod(total, 3600) + minutes, seconds = divmod(remainder, 60) + out = "PT" + if hours: + out += f"{hours}H" + if minutes: + out += f"{minutes}M" + if seconds: + out += f"{seconds}S" + return out + + +_BASE64_RE = re.compile( + "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?\\Z", + re.ASCII, +) +_BASE64URL_RE = re.compile( + "^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048])?\\Z", + re.ASCII, +) + + +def _parse_base64(value: str, path: str, violations: list[Violation]) -> bytes | None: + if _BASE64_RE.match(value) is None: + violations.append( + Violation(path=path, reason=f"must be base64-encoded, got {_quote(value)}") + ) + return None + return base64.b64decode(value, validate=True) + + +def _format_base64(value: bytes) -> str: + return base64.b64encode(value).decode("ascii") + + +def _parse_base64url( + value: str, path: str, violations: list[Violation] +) -> bytes | None: + if _BASE64URL_RE.match(value) is None: + violations.append( + Violation( + path=path, reason=f"must be base64url-encoded, got {_quote(value)}" + ) + ) + return None + return base64.urlsafe_b64decode(value + "=" * (-len(value) % 4)) + + +def _format_base64url(value: bytes) -> str: + return base64.urlsafe_b64encode(value).rstrip(b"=").decode("ascii") diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py new file mode 100644 index 000000000..f22711a4f --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -0,0 +1,670 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import dataclasses +import typing + +import typing_extensions + +import temporalio.converter +import temporalio.exceptions + +from ._definitions import ( + Violation, + _collect, + _parse_spec_integer, + _transfer_type_convertible, +) + + +class _AppendInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendInput"] + ) -> "AppendInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) + else: + stream_value_raw = raw["stream"] + if not isinstance(stream_value_raw, str): + violations.append(Violation(path="stream", reason="expected string")) + else: + stream_value = stream_value_raw + + producer_id_value: str = typing.cast("typing.Any", None) + if "producer_id" not in raw or raw["producer_id"] is None: + violations.append(Violation(path="producer_id", reason="required")) + else: + producer_id_value_raw = raw["producer_id"] + if not isinstance(producer_id_value_raw, str): + violations.append( + Violation(path="producer_id", reason="expected string") + ) + else: + producer_id_value = producer_id_value_raw + + attempt_value: int = typing.cast("typing.Any", None) + if "attempt" not in raw or raw["attempt"] is None: + violations.append(Violation(path="attempt", reason="required")) + else: + attempt_value_raw = raw["attempt"] + attempt_value_parsed = _parse_spec_integer( + attempt_value_raw, "attempt", violations + ) + if attempt_value_parsed is not None: + attempt_value = attempt_value_parsed + + batch_index_value: int = typing.cast("typing.Any", None) + if "batch_index" not in raw or raw["batch_index"] is None: + violations.append(Violation(path="batch_index", reason="required")) + else: + batch_index_value_raw = raw["batch_index"] + batch_index_value_parsed = _parse_spec_integer( + batch_index_value_raw, "batch_index", violations + ) + if batch_index_value_parsed is not None: + batch_index_value = batch_index_value_parsed + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + payloads_value: list[str] | None = None + if "payloads" in raw: + payloads_value_raw = raw["payloads"] + if payloads_value_raw is None: + violations.append( + Violation(path="payloads", reason="explicit null not allowed") + ) + else: + if not isinstance(payloads_value_raw, list): + violations.append( + Violation(path="payloads", reason="expected array") + ) + else: + payloads_value_list: list[str] = [] + for payloads_value_index, payloads_value_element in enumerate( + typing.cast("list[typing.Any]", payloads_value_raw) + ): + payloads_value_item_path = f"payloads[{payloads_value_index}]" + payloads_value_item_violation_count = len(violations) + payloads_value_item: str = typing.cast("typing.Any", None) + if not isinstance(payloads_value_element, str): + violations.append( + Violation( + path=payloads_value_item_path, + reason="expected string", + ) + ) + else: + payloads_value_item = payloads_value_element + if len(violations) == payloads_value_item_violation_count: + payloads_value_list.append(payloads_value_item) + payloads_value = payloads_value_list + + finish_value: bool | None = None + if "finish" in raw: + finish_value_raw = raw["finish"] + if finish_value_raw is None: + violations.append( + Violation(path="finish", reason="explicit null not allowed") + ) + else: + if not isinstance(finish_value_raw, bool): + violations.append( + Violation(path="finish", reason="expected boolean") + ) + else: + finish_value = finish_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "producer_id" + and key != "attempt" + and key != "batch_index" + and key != "topic" + and key != "payloads" + and key != "finish" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendInput( + workflow_id=workflow_id_value, + stream=stream_value, + producer_id=producer_id_value, + attempt=attempt_value, + batch_index=batch_index_value, + topic=topic_value, + payloads=payloads_value, + finish=finish_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + out["stream"] = value.stream + out["producer_id"] = value.producer_id + if abs(value.attempt) > 9007199254740991: + violations.append( + Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") + ) + out["attempt"] = value.attempt + if abs(value.batch_index) > 9007199254740991: + violations.append( + Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") + ) + out["batch_index"] = value.batch_index + if value.topic is not None: + out["topic"] = value.topic + if value.payloads is not None: + out["payloads"] = value.payloads + if value.finish is not None: + out["finish"] = value.finish + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_AppendInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendInput: + """One append call: who is writing, where, and what.""" + + workflow_id: str + """The workflow whose stream is being written.""" + + stream: str + """The named stream to append to. Empty when the producer writes to a topic instead.""" + + producer_id: str + """Identifies the writer across its retries, so its attempts can be ordered.""" + + attempt: int + """The generation this producer is writing. A later attempt supersedes an earlier one.""" + + batch_index: int + """Counts this producer's batches from 1. The handler drops an index it has already + written for this producer attempt. + """ + + topic: str | None = None + """The topic to append to, when stream is empty.""" + + payloads: list[str] | None = None + """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a + call that only finishes. + """ + + finish: bool | None = None + """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + + +class _AppendOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendOutput"] + ) -> "AppendOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + cursor_value: str | None = None + if "cursor" in raw: + cursor_value_raw = raw["cursor"] + if cursor_value_raw is None: + violations.append( + Violation(path="cursor", reason="explicit null not allowed") + ) + else: + if not isinstance(cursor_value_raw, str): + violations.append( + Violation(path="cursor", reason="expected string") + ) + else: + cursor_value = cursor_value_raw + + for key in raw: + if key != "cursor": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendOutput( + cursor=cursor_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + out: dict[str, typing.Any] = {} + if value.cursor is not None: + out["cursor"] = value.cursor + return out + + +@_transfer_type_convertible(_AppendOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + + cursor: str | None = None + """Opaque token naming the last record written by this call. Empty when the call + carried no payloads. + """ + + +class _ReadInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadInput"] + ) -> "ReadInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str | None = None + if "stream" in raw: + stream_value_raw = raw["stream"] + if stream_value_raw is None: + violations.append( + Violation(path="stream", reason="explicit null not allowed") + ) + else: + if not isinstance(stream_value_raw, str): + violations.append( + Violation(path="stream", reason="expected string") + ) + else: + stream_value = stream_value_raw + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + after_token_value: str | None = None + if "after_token" in raw: + after_token_value_raw = raw["after_token"] + if after_token_value_raw is None: + violations.append( + Violation(path="after_token", reason="explicit null not allowed") + ) + else: + if not isinstance(after_token_value_raw, str): + violations.append( + Violation(path="after_token", reason="expected string") + ) + else: + after_token_value = after_token_value_raw + + max_records_value: int | None = None + if "max_records" in raw: + max_records_value_raw = raw["max_records"] + if max_records_value_raw is None: + violations.append( + Violation(path="max_records", reason="explicit null not allowed") + ) + else: + max_records_value_parsed = _parse_spec_integer( + max_records_value_raw, "max_records", violations + ) + if max_records_value_parsed is not None: + max_records_value = max_records_value_parsed + + wait_ms_value: int | None = None + if "wait_ms" in raw: + wait_ms_value_raw = raw["wait_ms"] + if wait_ms_value_raw is None: + violations.append( + Violation(path="wait_ms", reason="explicit null not allowed") + ) + else: + wait_ms_value_parsed = _parse_spec_integer( + wait_ms_value_raw, "wait_ms", violations + ) + if wait_ms_value_parsed is not None: + wait_ms_value = wait_ms_value_parsed + + latest_only_value: bool | None = None + if "latest_only" in raw: + latest_only_value_raw = raw["latest_only"] + if latest_only_value_raw is None: + violations.append( + Violation(path="latest_only", reason="explicit null not allowed") + ) + else: + if not isinstance(latest_only_value_raw, bool): + violations.append( + Violation(path="latest_only", reason="expected boolean") + ) + else: + latest_only_value = latest_only_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "topic" + and key != "after_token" + and key != "max_records" + and key != "wait_ms" + and key != "latest_only" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadInput( + workflow_id=workflow_id_value, + stream=stream_value, + topic=topic_value, + after_token=after_token_value, + max_records=max_records_value, + wait_ms=wait_ms_value, + latest_only=latest_only_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + if value.stream is not None: + out["stream"] = value.stream + if value.topic is not None: + out["topic"] = value.topic + if value.after_token is not None: + out["after_token"] = value.after_token + if value.max_records is not None: + if abs(value.max_records) > 9007199254740991: + violations.append( + Violation( + path="max_records", reason="exceeds ±(2^53-1) integer cap" + ) + ) + out["max_records"] = value.max_records + if value.wait_ms is not None: + if abs(value.wait_ms) > 9007199254740991: + violations.append( + Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") + ) + out["wait_ms"] = value.wait_ms + if value.latest_only is not None: + out["latest_only"] = value.latest_only + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadInput: + """One read call: where to resume from and how long to wait.""" + + workflow_id: str + """The workflow whose stream is being read.""" + + stream: str | None = None + """The named stream to read. Empty reads every stream the workflow publishes.""" + + topic: str | None = None + """Yield only records on this topic. Empty yields every topic.""" + + after_token: str | None = None + """Opaque cursor from an earlier record or append. The read resumes strictly after the + record it names, so a caller never sees that record twice. Empty starts at the + beginning. The token is produced by whichever store sits behind the endpoint, so a + caller cannot tell which one that is. + """ + + max_records: int | None = None + """Return at most this many records. Defaults to 100 when omitted.""" + + wait_ms: int | None = None + """Wait at most this long for records to arrive before answering. Defaults to 5000 when + omitted. A call that collects nothing answers with no records and the caller's own + token. + """ + + latest_only: bool | None = None + """Answer with the newest position and no records, for a reader that wants to follow + from now. + """ + + +class _ReadOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadOutput"] + ) -> "ReadOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + records_value: list[RecordWire] | None = None + if "records" in raw: + records_value_raw = raw["records"] + if records_value_raw is None: + violations.append( + Violation(path="records", reason="explicit null not allowed") + ) + else: + if not isinstance(records_value_raw, list): + violations.append( + Violation(path="records", reason="expected array") + ) + else: + records_value_list: list[RecordWire] = [] + for records_value_index, records_value_element in enumerate( + typing.cast("list[typing.Any]", records_value_raw) + ): + records_value_item_path = f"records[{records_value_index}]" + records_value_item_violation_count = len(violations) + records_value_item: RecordWire = typing.cast("typing.Any", None) + try: + records_value_item = ( + _RecordWireTransferTypeConverter().from_transfer_type( + records_value_element, RecordWire + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, records_value_item_path, error) + if len(violations) == records_value_item_violation_count: + records_value_list.append(records_value_item) + records_value = records_value_list + + next_token_value: str | None = None + if "next_token" in raw: + next_token_value_raw = raw["next_token"] + if next_token_value_raw is None: + violations.append( + Violation(path="next_token", reason="explicit null not allowed") + ) + else: + if not isinstance(next_token_value_raw, str): + violations.append( + Violation(path="next_token", reason="expected string") + ) + else: + next_token_value = next_token_value_raw + + for key in raw: + if key != "records" and key != "next_token": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadOutput( + records=records_value, + next_token=next_token_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadOutput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + if value.records is not None: + records_out: list[typing.Any] = [] + for records_index, records_element in enumerate(value.records): + try: + records_out.append( + _RecordWireTransferTypeConverter().to_transfer_type( + records_element + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, f"records[{records_index}]", error) + out["records"] = records_out + if value.next_token is not None: + out["next_token"] = value.next_token + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadOutput: + """What one read call answered, and where to resume.""" + + records: list[RecordWire] | None = None + """The records after the caller's token, in stream order.""" + + next_token: str | None = None + """Opaque cursor to pass as after_token on the following call. Echoes the caller's own + token when the call collected nothing. + """ + + +class _RecordWireTransferTypeConverter( + temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["RecordWire"] + ) -> "RecordWire": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + token_value: str = typing.cast("typing.Any", None) + if "token" not in raw or raw["token"] is None: + violations.append(Violation(path="token", reason="required")) + else: + token_value_raw = raw["token"] + if not isinstance(token_value_raw, str): + violations.append(Violation(path="token", reason="expected string")) + else: + token_value = token_value_raw + + frame_value: str = typing.cast("typing.Any", None) + if "frame" not in raw or raw["frame"] is None: + violations.append(Violation(path="frame", reason="required")) + else: + frame_value_raw = raw["frame"] + if not isinstance(frame_value_raw, str): + violations.append(Violation(path="frame", reason="expected string")) + else: + frame_value = frame_value_raw + + for key in raw: + if key != "token" and key != "frame": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return RecordWire( + token=token_value, + frame=frame_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "RecordWire") -> typing.Any: + out: dict[str, typing.Any] = {} + out["token"] = value.token + out["frame"] = value.frame + return out + + +@_transfer_type_convertible(_RecordWireTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + + token: str + """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" + + frame: str + """The base64-encoded record frame, carrying the topic, kind, producer, attempt, + sequence and body. + """ diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py new file mode 100644 index 000000000..ce5604d81 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -0,0 +1,39 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from nexusrpc import Operation, service + +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, +) + + +@service +class TemporalStreams: + """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the + store behind it, so an operator switches storage without touching callers. Reads + hand out batches and an append carries one batch per call, because a Nexus operation + per record costs too much for token streams. + """ + + append: Operation[ + AppendInput, + AppendOutput, + ] = Operation(name="append") + """Append one batch on the caller's account. A repeated batch_index for the same + producer attempt is dropped, so a retried call writes once. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. + """ + + read: Operation[ + ReadInput, + ReadOutput, + ] = Operation(name="read") + """Answer with the records after the caller's token, or time out. The call parks until + it has max_records records or wait_ms elapses, whichever comes first, and returns + whatever it collected. + """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml new file mode 100644 index 000000000..ffa849509 --- /dev/null +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -0,0 +1,123 @@ +nexusrpc: "1.0.0" + +services: + TemporalStreams: + fqn: TemporalStreams + description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + operations: + append: + fqn: append + description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + input: { $ref: "#/$defs/AppendInput" } + output: { $ref: "#/$defs/AppendOutput" } + read: + fqn: read + description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + input: { $ref: "#/$defs/ReadInput" } + output: { $ref: "#/$defs/ReadOutput" } + +$defs: + AppendInput: + type: object + description: "One append call: who is writing, where, and what." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being written." + stream: + type: string + description: "The named stream to append to. Empty when the producer writes to a topic instead." + producer_id: + type: string + description: "Identifies the writer across its retries, so its attempts can be ordered." + attempt: + type: integer + description: "The generation this producer is writing. A later attempt supersedes an earlier one." + batch_index: + type: integer + description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + topic: + type: string + description: "The topic to append to, when stream is empty." + payloads: + type: array + items: + type: string + description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + finish: + type: boolean + description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + required: + - workflow_id + - stream + - producer_id + - attempt + - batch_index + additionalProperties: false + + AppendOutput: + type: object + description: "Where the append landed, empty when it wrote nothing." + properties: + cursor: + type: string + description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." + additionalProperties: false + + ReadInput: + type: object + description: "One read call: where to resume from and how long to wait." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being read." + stream: + type: string + description: "The named stream to read. Empty reads every stream the workflow publishes." + topic: + type: string + description: "Yield only records on this topic. Empty yields every topic." + after_token: + type: string + description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + max_records: + type: integer + description: "Return at most this many records. Defaults to 100 when omitted." + wait_ms: + type: integer + description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + latest_only: + type: boolean + description: "Answer with the newest position and no records, for a reader that wants to follow from now." + required: + - workflow_id + additionalProperties: false + + RecordWire: + type: object + description: "One record on the wire: its cursor and its base64 frame." + properties: + token: + type: string + description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + frame: + type: string + description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + required: + - token + - frame + additionalProperties: false + + ReadOutput: + type: object + description: "What one read call answered, and where to resume." + properties: + records: + type: array + items: + $ref: "#/$defs/RecordWire" + description: "The records after the caller's token, in stream order." + next_token: + type: string + description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." + additionalProperties: false From 6fe4af6b3fb5c4902fde007b569d414b00278975 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:30:01 -0700 Subject: [PATCH 170/831] Moved the nexus provider onto the generated contract. The five wire dataclasses and the service class now come from the generated module, so the contract has one source. Both halves read the operation and service names off the generated definition instead of hard-coding paths. Field names and operation names on the wire are unchanged. The one wire difference is that a read no longer sends max_records, wait_ms and latest_only when the caller leaves them at their defaults, because the contract marks them optional and the handler applies the documented defaults. Nothing outside this module and its tests speaks this wire. --- temporalio/streams/providers/nexus.py | 205 ++++++++++++-------------- 1 file changed, 93 insertions(+), 112 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 3701a70cb..8e19c2d4d 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -8,6 +8,12 @@ store behind the endpoint is invisible to callers and an operator switches it without touching them. +The wire types and the service definition come from +``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be +handed the same contract. What stays hand-written here is what the +generator cannot express yet: the handler's dedupe and long-poll collect +loop, and the caller's batching, cursor handling and codec. + Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Supersession records are not transported: the caller's reader re-synthesizes them from @@ -25,13 +31,11 @@ import asyncio import base64 -import dataclasses -import json import urllib.error import urllib.request from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta -from typing import Any +from typing import Any, TypeVar import nexusrpc import nexusrpc.handler @@ -42,71 +46,40 @@ from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams.providers._nexus_generated import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, + TemporalStreams, +) _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so configure one of those on the worker" ) +# The contract leaves these unset, so the handler is the one place that says +# what an omitted read bound means. +_DEFAULT_MAX_RECORDS = 100 +_DEFAULT_WAIT_MS = 5000 -@dataclasses.dataclass -class AppendInput: - """One append call: who is writing, where, and what.""" - - workflow_id: str - stream: str - producer_id: str - attempt: int - batch_index: int - topic: str = "" - payloads: list[str] = dataclasses.field(default_factory=list) - finish: bool = False - - -@dataclasses.dataclass -class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" - - cursor: str = "" - - -@dataclasses.dataclass -class ReadInput: - """One read call: where to resume from and how long to wait.""" - - workflow_id: str - stream: str = "" - topic: str = "" - after_token: str = "" - max_records: int = 100 - wait_ms: int = 5000 - # Answer with the newest position and no records, for a reader that - # wants to follow from now. - latest_only: bool = False - - -@dataclasses.dataclass -class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" - - token: str - frame: str - - -@dataclasses.dataclass -class ReadOutput: - """What one read call answered, and where to resume.""" - - records: list[RecordWire] = dataclasses.field(default_factory=list) - next_token: str = "" - - -@nexusrpc.service -class TemporalStreams: - """The stream endpoint's two operations.""" +_definition = nexusrpc.get_service_definition(TemporalStreams) +if _definition is None: # pragma: no cover + raise RuntimeError("the generated stream service carries no nexus definition") +# Both halves read the wire names off the generated definition, so a rename in +# the contract cannot leave the caller posting to a path the handler no longer +# serves. +_SERVICE_NAME = _definition.name +_OPERATION_NAMES = { + operation.method_name: operation.name + for operation in _definition.operation_definitions.values() +} +_APPEND_OPERATION = _OPERATION_NAMES["append"] +_READ_OPERATION = _OPERATION_NAMES["read"] - append: nexusrpc.Operation[AppendInput, AppendOutput] - read: nexusrpc.Operation[ReadInput, ReadOutput] +_OutputT = TypeVar("_OutputT") @nexusrpc.handler.service_handler(service=TemporalStreams) @@ -129,9 +102,10 @@ async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: """Append on the caller's account, dropping a repeated batch.""" + topic = input.topic or "" key = ( input.workflow_id, - input.stream or f"@{input.topic}", + input.stream or f"@{topic}", input.producer_id, input.attempt, ) @@ -143,7 +117,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, - topic=input.topic, + topic=topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -168,14 +142,18 @@ async def read( ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream + self._client, workflow_id=input.workflow_id, stream=input.stream or "" ) topic = input.topic or None if input.latest_only: return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + max_records = ( + _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records + ) + wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.after_token + next_token = input.after_token or "" subscription = delegate.read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, @@ -204,13 +182,13 @@ async def collect() -> None: ) ) next_token = record.cursor.token - if len(records) >= input.max_records: + if len(records) >= max_records: return try: # `wait_for` rather than `asyncio.timeout`, which 3.10 does not # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), input.wait_ms / 1000) + await asyncio.wait_for(collect(), wait_ms / 1000) except asyncio.TimeoutError: pass finally: @@ -222,20 +200,29 @@ async def collect() -> None: return ReadOutput(records=records, next_token=next_token) -def _post(url: str, body: dict) -> dict: +def _post(url: str, body: bytes) -> bytes: request = urllib.request.Request( url, - data=json.dumps(body).encode(), + data=body, headers={"Content-Type": "application/json"}, method="POST", ) try: with urllib.request.urlopen(request, timeout=30) as response: - raw = response.read() + return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") - return json.loads(raw) if raw else {} + + +async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller and + # the worker serving the operation agree on the body without either of + # them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: @@ -276,7 +263,7 @@ async def append(self, *values: Any) -> Cursor: else self._converter.to_payloads([value])[0] ) payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + return Cursor((await self._call(payloads=payloads)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -284,23 +271,21 @@ async def finish(self) -> None: async def _call( self, payloads: list[str] | None = None, finish: bool = False - ) -> dict: + ) -> AppendOutput: self._batch_index += 1 - return await asyncio.to_thread( - _post, - f"{self._base_url}/append", - dataclasses.asdict( - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ) + return await _invoke( + f"{self._base_url}/{_APPEND_OPERATION}", + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + topic=self._topic, + payloads=payloads or [], + finish=finish, ), + AppendOutput, ) @@ -327,28 +312,26 @@ async def read( attempts = AttemptTracker() token = after.token while True: - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - after_token=token, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + after_token=token, ), + ReadOutput, ) - for wire in raw.get("records", []): + for wire in answer.records or []: try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire["frame"]) + base64.b64decode(wire.frame) ) except ValueError: continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire["token"]) + cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -361,23 +344,21 @@ async def read( attempt=attempt, sequence=sequence, ) - token = raw.get("next_token", token) or token + token = answer.next_token or token async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - latest_only=True, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, ), + ReadOutput, ) - token = raw.get("next_token", "") + token = answer.next_token or "" return Cursor(token) if token else BEGINNING def _decode(self, body: bytes, as_type: type | None) -> Any: @@ -397,7 +378,7 @@ def __init__(self) -> None: def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", "TemporalStreams") + service = options.pop("service", _SERVICE_NAME) if options: raise TypeError( "the nexus provider takes endpoint, http_address and service, " From f91b6fd2d6509ee8bbeeeb8324018fca1ccc9ac0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:37:16 -0700 Subject: [PATCH 171/831] Applied the payload codec on the nexus provider's caller side. The caller ran the payload converter but never the codec, so records left the process in the clear even when one was configured. The producer now encodes before posting and the consumer decodes after reading, while the handler stays codec-blind, which is what keeps plaintext out of whoever hosts the endpoint. A data_converter option on the provider says which one to use when there is no client to take it from. --- CHANGELOG.md | 5 +- temporalio/streams/providers/nexus.py | 72 ++++++---- tests/streams/test_nexus_provider.py | 182 ++++++++++++++++++++++++-- 3 files changed, 223 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0f2f8b61..e9d0f64fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,10 @@ to include examples, links to docs, or any other relevant information. naming it. - **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. + through the endpoint and never names the store. Its contract is defined in + `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. + Configure it with `data_converter=` to run a payload codec on the caller + side, so records are encoded before they leave the process. ### Changed diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8e19c2d4d..a73c830ef 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -231,7 +231,7 @@ class NexusProducer: def __init__( self, base_url: str, - converter: Any, + data_converter: temporalio.converter.DataConverter, workflow_id: str, stream: str, topic: str, @@ -240,7 +240,8 @@ def __init__( ) -> None: """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream self._topic = topic @@ -255,15 +256,22 @@ def attempt(self) -> int: async def append(self, *values: Any) -> Cursor: """Append ``values`` through the endpoint.""" - payloads = [] - for value in values: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).cursor or "") + payloads = [ + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + for value in values + ] + if self._codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._codec.encode(payloads) + encoded = [ + base64.b64encode(payload.SerializeToString()).decode() + for payload in payloads + ] + return Cursor((await self._call(payloads=encoded)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -293,11 +301,16 @@ class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + workflow_id: str, + stream: str, ) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream @@ -335,8 +348,11 @@ async def read( superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded + value = ( + await self._decode(body, type) if kind is RecordKind.DATA else None + ) yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, + value=value, cursor=cursor, kind=kind, topic=frame_topic, @@ -361,9 +377,11 @@ async def latest(self, *, topic: str | None = None) -> Cursor: token = answer.next_token or "" return Cursor(token) if token else BEGINNING - def _decode(self, body: bytes, as_type: type | None) -> Any: + async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) + if self._codec is not None: + payload = (await self._codec.decode([payload]))[0] if as_type is None: return self._converter.from_payloads([payload])[0] return self._converter.from_payloads([payload], [as_type])[0] @@ -374,19 +392,22 @@ class _NexusProvider: def __init__(self) -> None: self._base_url: str | None = None + self._data_converter: temporalio.converter.DataConverter | None = None def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") service = options.pop("service", _SERVICE_NAME) + data_converter = options.pop("data_converter", None) if options: raise TypeError( - "the nexus provider takes endpoint, http_address and service, " - f"got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service and " + f"data_converter, got {sorted(options)}" ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + self._data_converter = data_converter def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -427,7 +448,7 @@ async def producer( attempt = attempt or activity.info().attempt return NexusProducer( self._url(), - _converter(client), + self._converter(client), workflow_id, stream, topic, @@ -438,13 +459,14 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), _converter(client), workflow_id, stream) - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + + def _converter(self, client: Any) -> temporalio.converter.DataConverter: + if self._data_converter is not None: + return self._data_converter + if client is None: + return temporalio.converter.DataConverter.default + return client.data_converter _provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index f07e4956c..18679ad5f 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,40 +1,55 @@ -"""Live conformance for the Nexus front. +"""Conformance for the Nexus front. -The caller talks only to the stream endpoint over the server's Nexus HTTP -ingress; the handler worker delegates to the workflow_streams provider, so -this test is the provider-hiding demonstration: nothing on the caller side -names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it -needs a dev server with an HTTP port and a registered Nexus endpoint. +The caller talks only to the stream endpoint; the handler delegates to a +storage provider, so these tests are the provider-hiding demonstration: +nothing on the caller side names or could name the store. -Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), -``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named -``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +The loop test runs over the server's Nexus HTTP ingress and is gated behind +``STREAMS_LIVE=nexus`` because it needs a dev server with an HTTP port and a +registered Nexus endpoint. Environment: ``TEMPORAL_ADDRESS`` (default +``localhost:7233``), ``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), +and an endpoint named ``streams-e2e`` targeting task queue +``streams-handlers-e2e``. + +The codec test stands the endpoint up in this process instead, because what +it checks is the bytes the caller puts on the wire. """ from __future__ import annotations +import asyncio +import base64 +import dataclasses import json import os import subprocess import uuid +from collections.abc import Sequence +from typing import Any, cast import pytest +import temporalio.converter from temporalio import streams +from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams import _frame as frame from temporalio.streams._provider import instance +from temporalio.streams.providers import memory, nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take -pytestmark = pytest.mark.skipif( +live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", ) ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" +APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] def _endpoint_id() -> str: @@ -60,6 +75,7 @@ def _endpoint_id() -> str: return json.loads(out.stdout)["id"] +@live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. @@ -119,3 +135,149 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + + +class ScrambleCodec(temporalio.converter.PayloadCodec): + """Flips every byte of a payload, so the middle holds nothing readable.""" + + KEY = 0x5A + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Wrap each payload as opaque bytes nothing downstream can read.""" + return [ + Payload( + metadata={"encoding": b"binary/plain"}, + data=self._flip(payload.SerializeToString()), + ) + for payload in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Recover the payloads :meth:`encode` wrapped.""" + out: list[Payload] = [] + for payload in payloads: + inner = Payload() + inner.ParseFromString(self._flip(payload.data)) + out.append(inner) + return out + + @classmethod + def _flip(cls, data: bytes) -> bytes: + return bytes(byte ^ cls.KEY for byte in data) + + +async def _dispatch( + handler: TemporalStreamsHandler, operation: str, request: Any +) -> Any: + context = cast("Any", None) # neither operation looks at it + if operation == APPEND_OPERATION: + return await handler.append(context, request) + return await handler.read(context, request) + + +def _in_process_endpoint( + handler: TemporalStreamsHandler, + posted: list[bytes], + answered: list[bytes], +) -> Any: + """Serve the caller's posts from ``handler``, recording both directions.""" + contract = temporalio.converter.DataConverter.default.payload_converter + loop = asyncio.get_running_loop() + + def post(url: str, body: bytes) -> bytes: + posted.append(body) + operation = url.rsplit("/", 1)[1] + request_type = AppendInput if operation == APPEND_OPERATION else ReadInput + request: Any = contract.from_payloads( + [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] + )[0] + if request_type is ReadInput: + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + request.wait_ms = 200 + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + raw = contract.to_payloads([answer])[0].data + answered.append(raw) + return raw + + return post + + +async def _loop_through_an_endpoint( + monkeypatch: pytest.MonkeyPatch, + codec: temporalio.converter.PayloadCodec | None, +) -> tuple[list[Any], list[bytes], list[bytes]]: + memory.reset() + streams.configure(provider="memory") + posted: list[bytes] = [] + answered: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) + front = instance( + "nexus", + endpoint="in-process", + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + workflow_id = "wf-codec" + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"secret": "tuna"}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") + records = await take(consumer.read(type=dict), 2, timeout=30) + memory.reset() + return records, posted, answered + + +def _appended_bytes(posted: list[bytes]) -> bytes: + out = b"" + for body in posted: + for encoded in json.loads(body).get("payloads", []): + out += base64.b64decode(encoded) + return out + + +def _answered_bodies(answered: list[bytes]) -> bytes: + out = b"" + for body in answered: + for record in json.loads(body).get("records", []): + out += frame.decode(base64.b64decode(record["frame"]))[5] + return out + + +async def test_the_caller_encodes_records_with_the_configured_codec( + monkeypatch: pytest.MonkeyPatch, +): + records, posted, answered = await _loop_through_an_endpoint( + monkeypatch, ScrambleCodec() + ) + + # The value survives the hop, so the codec is applied on both sides. + assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"secret": "tuna"} + # Neither direction carried the plaintext. + assert b"tuna" not in _appended_bytes(posted) + assert b"tuna" not in _answered_bodies(answered) + + +async def test_without_a_codec_the_same_records_go_out_in_the_clear( + monkeypatch: pytest.MonkeyPatch, +): + # The contrast is the point: the bytes above differ because of the codec, + # not because the transport obscures them anyway. + records, posted, answered = await _loop_through_an_endpoint(monkeypatch, None) + + assert records[0].value == {"secret": "tuna"} + assert b"tuna" in _appended_bytes(posted) + assert b"tuna" in _answered_bodies(answered) From 9a8fe93d38a0b697af7fbda81f38cd1f62a1f031 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 172/831] Made the stream contract generator refuse a nexgen other than the pinned one. The output differs between releases, so a developer with another version on PATH would regenerate different code and only see the drift in CI. --- scripts/gen_streams_nexus_api.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py index 800aba944..2d4f16c6d 100644 --- a/scripts/gen_streams_nexus_api.py +++ b/scripts/gen_streams_nexus_api.py @@ -36,11 +36,26 @@ def nex_gen_command() -> list[str]: return ["nexgen"] +def check_version(command: list[str]) -> None: + # A different release on PATH would regenerate different code locally + # and the drift would only show in CI, so refuse before writing anything. + reported = subprocess.check_output([*command, "--version"], text=True).strip() + found = reported.split()[-1] if reported else "" + if found != NEX_GEN_VERSION: + raise SystemExit( + f"found nexgen {found or '?'} at {command[0]}, but the stream contract is " + f"generated with {NEX_GEN_VERSION}. Install it with `cargo install --locked " + f"nexgen --version {NEX_GEN_VERSION} --features advanced` or point " + "NEX_GEN_BIN at that binary." + ) + + def generate_streams_nexus_api() -> None: if not contract_path.exists(): raise RuntimeError(f"missing stream contract: {contract_path}") command = nex_gen_command() + check_version(command) shutil.rmtree(output_dir, ignore_errors=True) subprocess.check_call( [ From 01f8fccf5b2a67b9b2e72fa3eef7ca1dc95e4c3c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 173/831] Regenerated the stream contract with byte payloads, read bounds and tolerant outputs. Payload fields carry contentEncoding base64 so both halves pass bytes and the generated code does the encoding. max_records and wait_ms carry the bounds the validator enforces, outputs accept unknown fields so a handler can add one before every caller is rebuilt, and descriptions are folded at 100 columns. --- .../providers/_nexus_generated/models.py | 201 +++++++++++++++--- .../providers/_nexus_generated/services.py | 8 +- .../providers/temporal_streams.nexusrpc.yaml | 108 ++++++++-- 3 files changed, 261 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index f22711a4f..d00cbcc63 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -13,10 +13,20 @@ from ._definitions import ( Violation, _collect, + _format_base64, + _parse_base64, _parse_spec_integer, _transfer_type_convertible, ) +_APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) + + +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) + + +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) + class _AppendInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] @@ -87,6 +97,13 @@ def from_transfer_type( ) if batch_index_value_parsed is not None: batch_index_value = batch_index_value_parsed + if batch_index_value < 1: + violations.append( + Violation( + path="batch_index", + reason=f"must be >= 1, got {batch_index_value}", + ) + ) topic_value: str | None = None if "topic" in raw: @@ -101,7 +118,7 @@ def from_transfer_type( else: topic_value = topic_value_raw - payloads_value: list[str] | None = None + payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] if payloads_value_raw is None: @@ -114,13 +131,13 @@ def from_transfer_type( Violation(path="payloads", reason="expected array") ) else: - payloads_value_list: list[str] = [] + payloads_value_list: list[bytes] = [] for payloads_value_index, payloads_value_element in enumerate( typing.cast("list[typing.Any]", payloads_value_raw) ): payloads_value_item_path = f"payloads[{payloads_value_index}]" payloads_value_item_violation_count = len(violations) - payloads_value_item: str = typing.cast("typing.Any", None) + payloads_value_item: bytes = typing.cast("typing.Any", None) if not isinstance(payloads_value_element, str): violations.append( Violation( @@ -129,7 +146,13 @@ def from_transfer_type( ) ) else: - payloads_value_item = payloads_value_element + payloads_value_item_parsed = _parse_base64( + payloads_value_element, + payloads_value_item_path, + violations, + ) + if payloads_value_item_parsed is not None: + payloads_value_item = payloads_value_item_parsed if len(violations) == payloads_value_item_violation_count: payloads_value_list.append(payloads_value_item) payloads_value = payloads_value_list @@ -190,11 +213,17 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") ) + if value.batch_index < 1: + violations.append( + Violation( + path="batch_index", reason=f"must be >= 1, got {value.batch_index}" + ) + ) out["batch_index"] = value.batch_index if value.topic is not None: out["topic"] = value.topic if value.payloads is not None: - out["payloads"] = value.payloads + out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: out["finish"] = value.finish if violations: @@ -221,15 +250,16 @@ class AppendInput: batch_index: int """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt. + written for this producer attempt, and rejects one that skips ahead or that resumes + an attempt it never saw start. """ topic: str | None = None """The topic to append to, when stream is empty.""" - payloads: list[str] | None = None - """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a - call that only finishes. + payloads: list[bytes] | None = None + """The records to write, each a serialized Temporal Payload. Empty on a call that only + finishes. """ finish: bool | None = None @@ -265,33 +295,53 @@ def from_transfer_type( else: cursor_value = cursor_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "cursor": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _APPEND_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return AppendOutput( cursor=cursor_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} if value.cursor is not None: out["cursor"] = value.cursor + for key, entry in value.additional_properties.items(): + if key in _APPEND_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_AppendOutputTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" + """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Empty when the call - carried no payloads. + """Opaque token naming the last record written by this call. Absent when the call + carried no payloads, when the batch was a repeat the handler dropped, or when the + store learns positions only at read time. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _ReadInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] @@ -375,6 +425,20 @@ def from_transfer_type( ) if max_records_value_parsed is not None: max_records_value = max_records_value_parsed + if max_records_value < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {max_records_value}", + ) + ) + if max_records_value > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {max_records_value}", + ) + ) wait_ms_value: int | None = None if "wait_ms" in raw: @@ -389,6 +453,20 @@ def from_transfer_type( ) if wait_ms_value_parsed is not None: wait_ms_value = wait_ms_value_parsed + if wait_ms_value < 0: + violations.append( + Violation( + path="wait_ms", + reason=f"must be >= 0, got {wait_ms_value}", + ) + ) + if wait_ms_value > 60000: + violations.append( + Violation( + path="wait_ms", + reason=f"must be <= 60000, got {wait_ms_value}", + ) + ) latest_only_value: bool | None = None if "latest_only" in raw: @@ -446,12 +524,38 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: path="max_records", reason="exceeds ±(2^53-1) integer cap" ) ) + if value.max_records < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {value.max_records}", + ) + ) + if value.max_records > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {value.max_records}", + ) + ) out["max_records"] = value.max_records if value.wait_ms is not None: if abs(value.wait_ms) > 9007199254740991: violations.append( Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") ) + if value.wait_ms < 0: + violations.append( + Violation( + path="wait_ms", reason=f"must be >= 0, got {value.wait_ms}" + ) + ) + if value.wait_ms > 60000: + violations.append( + Violation( + path="wait_ms", reason=f"must be <= 60000, got {value.wait_ms}" + ) + ) out["wait_ms"] = value.wait_ms if value.latest_only is not None: out["latest_only"] = value.latest_only @@ -472,7 +576,9 @@ class ReadInput: """The named stream to read. Empty reads every stream the workflow publishes.""" topic: str | None = None - """Yield only records on this topic. Empty yields every topic.""" + """Yield only records on this topic. Empty yields every topic. Only meaningful when + stream is empty, because an inbound stream has no topics. + """ after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the @@ -485,9 +591,9 @@ class ReadInput: """Return at most this many records. Defaults to 100 when omitted.""" wait_ms: int | None = None - """Wait at most this long for records to arrive before answering. Defaults to 5000 when - omitted. A call that collects nothing answers with no records and the caller's own - token. + """Wait at most this long for records to arrive before answering. The handler shortens + it to fit the request deadline. A call that collects nothing answers with no records + and the caller's own token. """ latest_only: bool | None = None @@ -557,14 +663,16 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "records" and key != "next_token": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _READ_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return ReadOutput( records=records_value, next_token=next_token_value, + additional_properties=additional_properties, ) @typing_extensions.override @@ -585,6 +693,16 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + for key, entry in value.additional_properties.items(): + if key in _READ_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry if violations: raise temporalio.converter.create_payload_validation_error(violations) return out @@ -603,6 +721,10 @@ class ReadOutput: token when the call collected nothing. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _RecordWireTransferTypeConverter( temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] @@ -628,7 +750,7 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: str = typing.cast("typing.Any", None) + frame_value: bytes = typing.cast("typing.Any", None) if "frame" not in raw or raw["frame"] is None: violations.append(Violation(path="frame", reason="required")) else: @@ -636,35 +758,54 @@ def from_transfer_type( if not isinstance(frame_value_raw, str): violations.append(Violation(path="frame", reason="expected string")) else: - frame_value = frame_value_raw + frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) + if frame_value_parsed is not None: + frame_value = frame_value_parsed + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "token" and key != "frame": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _RECORD_WIRE_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, frame=frame_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "RecordWire") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = value.frame + out["frame"] = _format_base64(value.frame) + for key, entry in value.additional_properties.items(): + if key in _RECORD_WIRE_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" + """One record on the wire: its cursor and its frame.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: str - """The base64-encoded record frame, carrying the topic, kind, producer, attempt, - sequence and body. - """ + frame: bytes + """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index ce5604d81..e0673aeab 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -24,9 +24,11 @@ class TemporalStreams: AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. A repeated batch_index for the same - producer attempt is dropped, so a retried call writes once. Supersession records are - not transported: a reader re-synthesizes them from the attempts it observes. + """Append one batch on the caller's account. The handler drops a batch_index it has + already written for this producer attempt, so a retried call writes once, and + rejects an index that skips ahead or a producer attempt it has no state for. + Supersession records are not transported: a reader re-synthesizes them from the + attempts it observes. """ read: Operation[ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index ffa849509..a1cc34631 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -1,18 +1,35 @@ +# The stream endpoint's wire contract. Inputs reject unknown fields so a typo +# fails loudly at the handler; outputs accept them so a handler can add a +# field before every caller has been rebuilt from the newer contract. nexusrpc: "1.0.0" services: TemporalStreams: fqn: TemporalStreams - description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + description: >- + The stream endpoint's two operations. One Temporal-authenticated endpoint + hides the store behind it, so an operator switches storage without + touching callers. Reads hand out batches and an append carries one batch + per call, because a Nexus operation per record costs too much for token + streams. operations: append: fqn: append - description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + description: >- + Append one batch on the caller's account. The handler drops a + batch_index it has already written for this producer attempt, so a + retried call writes once, and rejects an index that skips ahead or a + producer attempt it has no state for. Supersession records are not + transported: a reader re-synthesizes them from the attempts it + observes. input: { $ref: "#/$defs/AppendInput" } output: { $ref: "#/$defs/AppendOutput" } read: fqn: read - description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + description: >- + Answer with the records after the caller's token, or time out. The + call parks until it has max_records records or wait_ms elapses, + whichever comes first, and returns whatever it collected. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -26,16 +43,26 @@ $defs: description: "The workflow whose stream is being written." stream: type: string - description: "The named stream to append to. Empty when the producer writes to a topic instead." + description: >- + The named stream to append to. Empty when the producer writes to a + topic instead. producer_id: type: string - description: "Identifies the writer across its retries, so its attempts can be ordered." + description: >- + Identifies the writer across its retries, so its attempts can be + ordered. attempt: type: integer - description: "The generation this producer is writing. A later attempt supersedes an earlier one." + description: >- + The generation this producer is writing. A later attempt supersedes + an earlier one. batch_index: type: integer - description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + minimum: 1 + description: >- + Counts this producer's batches from 1. The handler drops an index it + has already written for this producer attempt, and rejects one that + skips ahead or that resumes an attempt it never saw start. topic: type: string description: "The topic to append to, when stream is empty." @@ -43,10 +70,15 @@ $defs: type: array items: type: string - description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + contentEncoding: base64 + description: >- + The records to write, each a serialized Temporal Payload. Empty on a + call that only finishes. finish: type: boolean - description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + description: >- + Mark this producer done after writing the batch, so a reader stops + waiting on it. required: - workflow_id - stream @@ -57,12 +89,16 @@ $defs: AppendOutput: type: object - description: "Where the append landed, empty when it wrote nothing." + description: "Where the append landed, when the store can say." properties: cursor: type: string - description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." - additionalProperties: false + description: >- + Opaque token naming the last record written by this call. Absent + when the call carried no payloads, when the batch was a repeat the + handler dropped, or when the store learns positions only at read + time. + additionalProperties: true ReadInput: type: object @@ -73,40 +109,64 @@ $defs: description: "The workflow whose stream is being read." stream: type: string - description: "The named stream to read. Empty reads every stream the workflow publishes." + description: >- + The named stream to read. Empty reads every stream the workflow + publishes. topic: type: string - description: "Yield only records on this topic. Empty yields every topic." + description: >- + Yield only records on this topic. Empty yields every topic. Only + meaningful when stream is empty, because an inbound stream has no + topics. after_token: type: string - description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + description: >- + Opaque cursor from an earlier record or append. The read resumes + strictly after the record it names, so a caller never sees that + record twice. Empty starts at the beginning. The token is produced by + whichever store sits behind the endpoint, so a caller cannot tell + which one that is. max_records: type: integer + minimum: 1 + maximum: 1000 description: "Return at most this many records. Defaults to 100 when omitted." wait_ms: type: integer - description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + minimum: 0 + maximum: 60000 + description: >- + Wait at most this long for records to arrive before answering. The + handler shortens it to fit the request deadline. A call that collects + nothing answers with no records and the caller's own token. latest_only: type: boolean - description: "Answer with the newest position and no records, for a reader that wants to follow from now." + description: >- + Answer with the newest position and no records, for a reader that + wants to follow from now. required: - workflow_id additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its base64 frame." + description: "One record on the wire: its cursor and its frame." properties: token: type: string - description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + description: >- + Opaque cursor naming this record. Pass it as after_token to resume + just past it. frame: type: string - description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + contentEncoding: base64 + description: >- + The record frame, carrying the topic, kind, producer, attempt, + sequence and body. required: - token - frame - additionalProperties: false + additionalProperties: true ReadOutput: type: object @@ -119,5 +179,7 @@ $defs: description: "The records after the caller's token, in stream order." next_token: type: string - description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." - additionalProperties: false + description: >- + Opaque cursor to pass as after_token on the following call. Echoes + the caller's own token when the call collected nothing. + additionalProperties: true From 52725d365e6c223dd5086c72ff05beb1c1a84313 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 174/831] Reworked the Nexus front's dedupe, reads, error mapping and endpoint lookup. The handler refuses to continue a producer attempt it has no state for and rejects an index that skips ahead, so a restarted or load-balanced handler cannot lose records behind a success answer. Reads come from one parked subscription per stream, pass bodies through as raw payloads so a codec survives the hop, and stop at the request deadline. The caller commits its batch index only after the endpoint answered, resends a failed batch under the same index, maps transport failures to one error type, and resolves an endpoint name through the operator service. --- temporalio/streams/providers/nexus.py | 685 +++++++++++++++++++------- 1 file changed, 508 insertions(+), 177 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index a73c830ef..8c311d1d9 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -15,33 +15,51 @@ loop, and the caller's batching, cursor handling and codec. Reads hand out batches and an append carries one batch per call, because a -Nexus operation per record costs too much for token streams. Supersession -records are not transported: the caller's reader re-synthesizes them from -the attempts it observes, which is the policy module's job on every -provider. Cursors pass through opaque, so the caller cannot tell which store -produced them. - -One stated prototype limit: append deduplication holds at the handler by -batch index per producer, so a handler restart during a producer's life can -double-append. The store-level fix, a sequence-explicit append in the IDL -contract, is listed in the design doc's work table. +Nexus operation per record costs too much for token streams. Record bodies +cross the handler untouched: it reads the store as raw payloads and frames +them as they are, so a codec that changes the payload encoding survives the +hop and the handler's worker never needs the key. Supersession records are +not transported: the caller's reader re-synthesizes them from the attempts +it observes, which is the policy module's job on every provider. Cursors +pass through opaque, so the caller cannot tell which store produced them. + +The handler keeps one parked read per ``(workflow, stream, topic)`` and +serves consecutive calls from it, so an idle caller does not leave one +abandoned long poll on the store per call. A call whose token does not +match the parked position replaces the subscription, and an idle one is +released after a minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, +by batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh +delegate whose numbering the store would drop as a repeat; the caller opens +a new attempt, which readers report as a supersession. The store-level fix, +a sequence-explicit append in the contract, is listed in the design doc's +work table. And any caller the endpoint admits may touch any workflow's +streams in the namespace; the endpoint's own authorization is the boundary. """ from __future__ import annotations import asyncio -import base64 +import logging +import time import urllib.error import urllib.request -from collections.abc import AsyncGenerator, AsyncIterator -from datetime import timedelta +from collections import OrderedDict +from collections.abc import AsyncGenerator, Mapping +from dataclasses import dataclass +from datetime import datetime, timedelta, timezone from typing import Any, TypeVar import nexusrpc import nexusrpc.handler +from google.protobuf.message import DecodeError import temporalio.converter from temporalio.api.common.v1 import Payload +from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.common import RawValue from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -61,9 +79,16 @@ ) # The contract leaves these unset, so the handler is the one place that says -# what an omitted read bound means. +# what an omitted read bound means. The wait is long because the handler +# shortens it to the request deadline anyway, and a shorter default only +# means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 5000 +_DEFAULT_WAIT_MS = 30_000 +_DEADLINE_MARGIN = timedelta(milliseconds=500) +_DEFAULT_MAX_PRODUCERS = 10_000 +_DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) +_QUEUE_DEPTH = 1000 +_APPEND_TIMEOUT_MS = 30_000 _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -81,6 +106,34 @@ _OutputT = TypeVar("_OutputT") +logger = logging.getLogger(__name__) + + +def _bad_request(message: str) -> nexusrpc.HandlerError: + return nexusrpc.HandlerError( + message, + type=nexusrpc.HandlerErrorType.BAD_REQUEST, + retryable_override=False, + ) + + +@dataclass +class _Subscription: + """One parked read on the store, shared by consecutive calls.""" + + records: asyncio.Queue[StreamRecord[Any]] + position: str + last_used: float + pump: asyncio.Task[None] | None = None + failure: BaseException | None = None + done: bool = False + + +@dataclass +class _ProducerState: + delegate: Any + batch_index: int + @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: @@ -91,17 +144,45 @@ class TemporalStreamsHandler: run handlers for a new store next to handlers for the old one. """ - def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: - """Serve the endpoint out of the provider named by ``provider``.""" + def __init__( + self, + client: Any, + provider: str, + *, + max_producers: int = _DEFAULT_MAX_PRODUCERS, + subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, + **provider_options: Any, + ) -> None: + """Serve the endpoint out of the provider named by ``provider``. + + ``max_producers`` bounds the dedupe state kept per producer attempt; + the oldest is evicted, and a producer evicted mid-life gets a clear + refusal on its next batch rather than a silent drop. + ``subscription_idle`` is how long a parked read outlives its last + caller. + """ self._client = client self._delegate = _provider.instance(provider, **provider_options) - self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + OrderedDict() + ) + self._max_producers = max_producers + self._subscriptions: dict[tuple[str, str, str], _Subscription] = {} + self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} + self._subscription_idle = subscription_idle.total_seconds() @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch.""" + """Append on the caller's account, dropping a repeated batch. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips + ahead, when it continues a producer attempt this handler has + no state for, or when a payload is not a serialized + ``Payload``. + """ topic = input.topic or "" key = ( input.workflow_id, @@ -109,10 +190,18 @@ async def append( input.producer_id, input.attempt, ) - cached = self._producers.get(key) - if cached is not None and input.batch_index <= cached[1]: - return AppendOutput() - if cached is None: + state = self._producers.get(key) + if state is None: + if input.batch_index != 1: + # A fresh delegate would restart its numbering at zero, and + # the store would drop that as a repeat of the first batch. + # Refusing here turns a silent loss into a failure the caller + # can act on by opening a new attempt. + raise _bad_request( + f"producer {input.producer_id!r} attempt {input.attempt} resumed " + f"at batch {input.batch_index} on a handler that has no state for " + "it; open a new attempt" + ) delegate = await self._delegate.producer( self._client, workflow_id=input.workflow_id, @@ -121,117 +210,304 @@ async def append( producer_id=input.producer_id, attempt=input.attempt, ) - else: - delegate = cached[0] - self._producers[key] = (delegate, input.batch_index) - cursor = "" - if input.payloads: - payloads = [] - for encoded in input.payloads: - payload = Payload() - payload.ParseFromString(base64.b64decode(encoded)) - payloads.append(payload) - cursor = (await delegate.append(*payloads)).token + state = _ProducerState(delegate, 0) + elif input.batch_index <= state.batch_index: + # A repeat, or a producer that restarted its numbering: either + # way the store already holds the batch. + self._producers.move_to_end(key) + return AppendOutput() + elif input.batch_index != state.batch_index + 1: + raise _bad_request( + f"batch {input.batch_index} skips ahead of {state.batch_index} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) + payloads = self._payloads(input.payloads) + cursor: str | None = None + if payloads: + appended = await state.delegate.append(*payloads) + cursor = appended.token if appended is not None else None if input.finish: - await delegate.finish() + await state.delegate.finish() + self._producers.pop(key, None) + return AppendOutput(cursor=cursor) + # Recorded only once the store accepted the batch, so a failed append + # is not mistaken for a repeat when the caller retries it. + state.batch_index = input.batch_index + self._producers[key] = state + self._producers.move_to_end(key) + while len(self._producers) > self._max_producers: + self._producers.popitem(last=False) return AppendOutput(cursor=cursor) + @staticmethod + def _payloads(encoded: list[bytes] | None) -> list[Payload]: + payloads = [] + for index, raw in enumerate(encoded or []): + payload = Payload() + try: + payload.ParseFromString(raw) + except DecodeError as error: + raise _bad_request( + f"payloads[{index}] is not a serialized Temporal Payload: {error}" + ) from error + payloads.append(payload) + return payloads + @nexusrpc.handler.sync_operation async def read( - self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream or "" - ) + stream = input.stream or "" topic = input.topic or None if input.latest_only: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=stream + ) return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms - converter = temporalio.converter.DataConverter.default.payload_converter - records: list[RecordWire] = [] - next_token = input.after_token or "" - subscription = delegate.read( - after=Cursor(input.after_token) if input.after_token else BEGINNING, - topic=topic, - ) - - async def collect() -> None: - nonlocal next_token - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + if ctx.request_deadline is not None: + # The server answers the caller with a timeout at the deadline + # whatever this call does, so collecting past it only holds the + # slot for an answer nobody receives. + deadline = ctx.request_deadline + if deadline.tzinfo is None: + deadline = deadline.replace(tzinfo=timezone.utc) + left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN + wait = max(0.0, min(wait, left.total_seconds())) + after = input.after_token or "" + key = (input.workflow_id, stream, topic or "") + await self._expire_subscriptions() + lock = self._read_locks.setdefault(key, asyncio.Lock()) + async with lock: + subscription = self._subscriptions.get(key) + if subscription is None or subscription.position != after: + if subscription is not None: + await self._drop(key) + subscription = await self._subscribe( + key, input.workflow_id, stream, topic, after ) - next_token = record.cursor.token - if len(records) >= max_records: - return + records, next_token = await self._drain(subscription, max_records, wait) + subscription.position = next_token + subscription.last_used = time.monotonic() + if subscription.done and subscription.records.empty(): + # The store ended the read, as the Workflow Streams delegate + # does when the run closes. Nothing more will arrive on it. + await self._drop(key) + return ReadOutput(records=records, next_token=next_token) + + async def _subscribe( + self, + key: tuple[str, str, str], + workflow_id: str, + stream: str, + topic: str | None, + after: str, + ) -> _Subscription: + delegate = await self._delegate.consumer( + self._client, workflow_id=workflow_id, stream=stream + ) + # Raw payloads: the handler frames what the store holds without + # decoding it, so an encoding only the caller's codec understands + # passes through untouched. + source = delegate.read( + after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + ) + subscription = _Subscription( + records=asyncio.Queue(maxsize=_QUEUE_DEPTH), + position=after, + last_used=time.monotonic(), + ) + async def pump() -> None: + try: + async for record in source: + if record.kind is RecordKind.SUPERSEDED: + continue + await subscription.records.put(record) + except asyncio.CancelledError: + raise + except Exception as error: + subscription.failure = error + finally: + subscription.done = True + if isinstance(source, AsyncGenerator): + await source.aclose() + + subscription.pump = asyncio.create_task(pump()) + self._subscriptions[key] = subscription + return subscription + + async def _drain( + self, subscription: _Subscription, max_records: int, wait: float + ) -> tuple[list[RecordWire], str]: + records: list[RecordWire] = [] + next_token = subscription.position + queue = subscription.records + deadline = time.monotonic() + wait + while len(records) < max_records: + if queue.empty(): + remaining = deadline - time.monotonic() + if records or remaining <= 0: + break + if subscription.done: + # Honour the wait even though nothing can arrive, so a + # caller polling a closed stream does not spin on the + # endpoint. + await asyncio.sleep(remaining) + break + try: + record = await asyncio.wait_for(queue.get(), remaining) + except asyncio.TimeoutError: + break + else: + record = queue.get_nowait() + records.append(self._wire(record)) + next_token = record.cursor.token + if not records and subscription.failure is not None: + failure, subscription.failure = subscription.failure, None + raise failure + return records, next_token + + @staticmethod + def _wire(record: StreamRecord[Any]) -> RecordWire: + body = ( + record.value.payload.SerializeToString() + if isinstance(record.value, RawValue) + else b"" + ) + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + return RecordWire(token=record.cursor.token, frame=frame) + + async def close(self) -> None: + """Release every parked read. + + Call it when the worker hosting this handler stops, so subscriptions + waiting on the store do not outlive it. + """ + for key in list(self._subscriptions): + await self._drop(key) + self._read_locks.clear() + + async def _drop(self, key: tuple[str, str, str]) -> None: + subscription = self._subscriptions.pop(key, None) + if subscription is None or subscription.pump is None: + return + subscription.pump.cancel() try: - # `wait_for` rather than `asyncio.timeout`, which 3.10 does not - # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), wait_ms / 1000) - except asyncio.TimeoutError: + await subscription.pump + except (asyncio.CancelledError, Exception): pass - finally: - # The delegate's read parks against its store, and this call - # answers before the caller asks again, so let it go now rather - # than when the collector is next swept. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - return ReadOutput(records=records, next_token=next_token) + async def _expire_subscriptions(self) -> None: + cutoff = time.monotonic() - self._subscription_idle + for key in [k for k, s in self._subscriptions.items() if s.last_used < cutoff]: + lock = self._read_locks.get(key) + if lock is not None and lock.locked(): + continue + await self._drop(key) + self._read_locks.pop(key, None) + + +class StreamEndpointError(RuntimeError): + """The stream endpoint refused a call or could not be reached. -def _post(url: str, body: bytes) -> bytes: + ``status`` is the HTTP status when the endpoint answered, and ``None`` + when the connection itself failed. + """ + + def __init__(self, message: str, *, status: int | None = None) -> None: + """Carry the endpoint's answer, or the reason it gave none.""" + super().__init__(message) + self.status = status + + +def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: request = urllib.request.Request( url, data=body, - headers={"Content-Type": "application/json"}, + headers={ + "Content-Type": "application/json", + # Tells the server how long the handler may park, so it does not + # time the call out ahead of a wait the caller asked for. + "Request-Timeout": f"{timeout_ms}ms", + **headers, + }, method="POST", ) try: - with urllib.request.urlopen(request, timeout=30) as response: + with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") - raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + raise StreamEndpointError( + f"stream endpoint call failed ({error.code}): {detail}", status=error.code + ) from error + except urllib.error.URLError as error: + raise StreamEndpointError( + f"stream endpoint unreachable at {url}: {error.reason}" + ) from error + +class _Front: + """Everything the caller half needs to reach one endpoint.""" -async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: - # The contract types carry their own JSON encoding, so the raw caller and - # the worker serving the operation agree on the body without either of - # them spelling the fields out. - contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) - payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") - return contract.from_payloads([payload], [output])[0] + def __init__( + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + headers: Mapping[str, str], + wait_ms: int, + max_records: int, + ) -> None: + self.base_url = base_url + self.converter = data_converter.payload_converter + self.codec = data_converter.payload_codec + self.headers = dict(headers) + self.wait_ms = wait_ms + self.max_records = max_records + + async def invoke( + self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + ) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller + # and the worker serving the operation agree on the body without + # either of them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread( + _post, + f"{self.base_url}/{operation}", + contract.to_payloads([request])[0].data, + self.headers, + timeout_ms, + ) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it.""" + """Appends through the stream endpoint; framing happens behind it. + + Calls are serialized and the batch index is committed only once the + endpoint answered. A batch whose call raised stays pending and is sent + again under the same index, either when the caller retries the same + values or ahead of whatever the caller sends next, so an ambiguous + failure writes the batch once and loses nothing. + """ def __init__( self, - base_url: str, - data_converter: temporalio.converter.DataConverter, + front: _Front, workflow_id: str, stream: str, topic: str, @@ -239,78 +515,92 @@ def __init__( attempt: int, ) -> None: """Bind this producer to one stream or topic on the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None + self._lock = asyncio.Lock() @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the endpoint.""" + if not values: + return None payloads = [ value if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + else self._front.converter.to_payloads([value])[0] for value in values ] - if self._codec is not None: - # The endpoint is the edge of this process, so a configured codec - # runs here rather than at the handler: whoever hosts the endpoint - # never holds the plaintext. - payloads = await self._codec.encode(payloads) - encoded = [ - base64.b64encode(payload.SerializeToString()).decode() - for payload in payloads - ] - return Cursor((await self._call(payloads=encoded)).cursor or "") + answer = await self._call(payloads, finish=False) + return Cursor(answer.cursor) if answer.cursor else None async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" - await self._call(finish=True) + await self._call([], finish=True) + + async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: + # Identity is taken before the codec runs: a codec may encrypt with a + # fresh nonce each time, and the retry has to be recognised anyway. + identity = tuple(payload.SerializeToString() for payload in payloads) + if self._front.codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._front.codec.encode(payloads) + encoded = [payload.SerializeToString() for payload in payloads] + async with self._lock: + if self._pending is not None and self._pending[1:] != (identity, finish): + # The caller moved on from a batch the endpoint may or may + # not have applied. It goes first under its own index, so the + # handler drops it if it landed and writes it if not, and the + # new batch takes the index after it. + await self._send(*self._pending) + elif self._pending is not None: + return await self._send(*self._pending) + request = self._request(self._batch_index + 1, encoded, finish) + return await self._send(request, identity, finish) + + def _request( + self, batch_index: int, payloads: list[bytes], finish: bool + ) -> AppendInput: + return AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=batch_index, + topic=self._topic, + payloads=payloads, + finish=finish, + ) - async def _call( - self, payloads: list[str] | None = None, finish: bool = False + async def _send( + self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: - self._batch_index += 1 - return await _invoke( - f"{self._base_url}/{_APPEND_OPERATION}", - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ), - AppendOutput, + self._pending = (request, identity, finish) + answer = await self._front.invoke( + _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS ) + self._batch_index = request.batch_index + self._pending = None + return answer class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - workflow_id: str, - stream: str, - ) -> None: + def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream @@ -320,31 +610,37 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, one endpoint batch at a time.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() token = after.token while True: - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, topic=topic or "", after_token=token, + max_records=self._front.max_records, + wait_ms=self._front.wait_ms, ), ReadOutput, + timeout_ms=self._front.wait_ms + 5000, ) for wire in answer.records or []: + cursor = Cursor(wire.token) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire.frame) + wire.frame ) - except ValueError: + except ValueError as error: + # Same answer as every other reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -364,8 +660,8 @@ async def read( async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, @@ -373,6 +669,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: latest_only=True, ), ReadOutput, + timeout_ms=_APPEND_TIMEOUT_MS, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING @@ -380,34 +677,58 @@ async def latest(self, *, topic: str | None = None) -> Cursor: async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - if self._codec is not None: - payload = (await self._codec.decode([payload]))[0] + if self._front.codec is not None: + payload = (await self._front.codec.decode([payload]))[0] if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + return self._front.converter.from_payloads([payload])[0] + return self._front.converter.from_payloads([payload], [as_type])[0] class _NexusProvider: name = "nexus" def __init__(self) -> None: - self._base_url: str | None = None + self._endpoint: str | None = None + self._endpoint_id: str | None = None + self._http_address = "http://127.0.0.1:7243" + self._service = _SERVICE_NAME self._data_converter: temporalio.converter.DataConverter | None = None + self._client: Any = None + self._headers: dict[str, str] = {} + self._wait_ms = _DEFAULT_WAIT_MS + self._max_records = _DEFAULT_MAX_RECORDS def configure(self, **options: Any) -> None: + """Point the caller half at one endpoint. + + ``endpoint`` is the endpoint's name when ``client`` is given, and is + resolved to its id through the operator service on first use; without + a client it has to be the id, because the HTTP ingress dispatches by + id. ``headers`` go on every request, which is where an authorization + header belongs. ``wait_ms`` and ``max_records`` are the read bounds + the caller asks the handler for. + """ endpoint = options.pop("endpoint", None) - http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", _SERVICE_NAME) - data_converter = options.pop("data_converter", None) + self._http_address = options.pop("http_address", self._http_address) + self._service = options.pop("service", _SERVICE_NAME) + self._data_converter = options.pop("data_converter", None) + self._client = options.pop("client", None) + self._headers = dict(options.pop("headers", None) or {}) + self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) + self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) if options: raise TypeError( - "the nexus provider takes endpoint, http_address, service and " - f"data_converter, got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service, " + f"data_converter, client, headers, wait_ms and max_records, got " + f"{sorted(options)}" ) if not endpoint: - raise TypeError("the nexus provider needs endpoint=") - self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - self._data_converter = data_converter + raise TypeError( + "the nexus provider needs endpoint= together with " + "client=, or endpoint= on its own" + ) + self._endpoint = endpoint + self._endpoint_id = None def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -426,10 +747,31 @@ def open_write(self, topic: str) -> WriteSink: del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) - def _url(self) -> str: - if self._base_url is None: + async def _front(self, client: Any) -> _Front: + if self._endpoint is None: raise RuntimeError("configure the nexus provider before opening handles") - return self._base_url + if self._endpoint_id is None: + resolver = self._client if self._client is not None else client + if resolver is None: + self._endpoint_id = self._endpoint + else: + found = await resolver.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") + self._endpoint_id = found.endpoints[0].id + base_url = ( + f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" + f"/services/{self._service}" + ) + return _Front( + base_url, + self._converter(client), + self._headers, + self._wait_ms, + self._max_records, + ) async def producer( self, @@ -441,25 +783,14 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> NexusProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return NexusProducer( - self._url(), - self._converter(client), - workflow_id, - stream, - topic, - producer_id, - attempt, + await self._front(client), workflow_id, stream, topic, producer_id, attempt ) async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + return NexusConsumer(await self._front(client), workflow_id, stream) def _converter(self, client: Any) -> temporalio.converter.DataConverter: if self._data_converter is not None: From ecbe7b74423a466a2de4fc27e45da48fb355911a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 175/831] Covered the Nexus front's refusals, retries, subscription reuse and deadline clamp. --- tests/streams/test_nexus_provider.py | 334 ++++++++++++++++++++++----- 1 file changed, 274 insertions(+), 60 deletions(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 18679ad5f..77cec6f4e 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -11,8 +11,8 @@ and an endpoint named ``streams-e2e`` targeting task queue ``streams-handlers-e2e``. -The codec test stands the endpoint up in this process instead, because what -it checks is the bytes the caller puts on the wire. +Everything else stands the endpoint up in this process, because what it +checks is the bytes the caller puts on the wire and the handler's own rules. """ from __future__ import annotations @@ -22,11 +22,13 @@ import dataclasses import json import os -import subprocess import uuid -from collections.abc import Sequence -from typing import Any, cast +from collections.abc import Mapping, Sequence +from datetime import datetime, timedelta, timezone +from typing import Any +import nexusrpc +import nexusrpc.handler import pytest import temporalio.converter @@ -38,7 +40,10 @@ from temporalio.streams._provider import instance from temporalio.streams.providers import memory, nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.streams.providers.nexus import ( + StreamEndpointError, + TemporalStreamsHandler, +) from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take @@ -50,51 +55,27 @@ ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] - - -def _endpoint_id() -> str: - # The HTTP ingress dispatches by endpoint id, not name. - out = subprocess.run( - [ - "temporal", - "operator", - "nexus", - "endpoint", - "get", - "--name", - ENDPOINT, - "-o", - "json", - "--address", - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), - ], - capture_output=True, - text=True, - check=True, - ) - return json.loads(out.stdout)["id"] +READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] @live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage - # provider; only the caller goes through the front. + # provider; only the caller goes through the front, and it names the + # endpoint the way an operator does, by name. streams.configure(provider="workflow_streams") client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", - endpoint=_endpoint_id(), + endpoint=ENDPOINT, + client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + wait_ms=5000, ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + handler = TemporalStreamsHandler(client, provider="workflow_streams") - async with Worker( - client, - task_queue=HANDLER_TQ, - nexus_service_handlers=[ - TemporalStreamsHandler(client, provider="workflow_streams") - ], - ): + async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", @@ -135,10 +116,11 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + await handler.close() class ScrambleCodec(temporalio.converter.PayloadCodec): - """Flips every byte of a payload, so the middle holds nothing readable.""" + """Flips every byte and labels the result with an encoding only it can read.""" KEY = 0x5A @@ -146,7 +128,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: """Wrap each payload as opaque bytes nothing downstream can read.""" return [ Payload( - metadata={"encoding": b"binary/plain"}, + metadata={"encoding": b"binary/scrambled"}, data=self._flip(payload.SerializeToString()), ) for payload in payloads @@ -166,45 +148,98 @@ def _flip(cls, data: bytes) -> bytes: return bytes(byte ^ cls.KEY for byte in data) +class _NeverCancelled(nexusrpc.handler.OperationTaskCancellation): + def is_cancelled(self) -> bool: + return False + + def cancellation_reason(self) -> str | None: + return None + + def wait_until_cancelled_sync(self, timeout: float | None = None) -> bool: + del timeout + return False + + async def wait_until_cancelled(self) -> None: + await asyncio.Event().wait() + + +def _context( + operation: str, deadline: datetime | None = None +) -> nexusrpc.handler.StartOperationContext: + return nexusrpc.handler.StartOperationContext( + service=nexus._SERVICE_NAME, # pyright: ignore[reportPrivateUsage] + operation=operation, + headers={}, + task_cancellation=_NeverCancelled(), + request_deadline=deadline, + request_id=uuid.uuid4().hex, + ) + + async def _dispatch( handler: TemporalStreamsHandler, operation: str, request: Any ) -> Any: - context = cast("Any", None) # neither operation looks at it if operation == APPEND_OPERATION: - return await handler.append(context, request) - return await handler.read(context, request) + return await handler.append(_context(operation), request) + return await handler.read(_context(operation), request) def _in_process_endpoint( handler: TemporalStreamsHandler, posted: list[bytes], answered: list[bytes], + *, + fail_after_applying: list[str] | None = None, ) -> Any: - """Serve the caller's posts from ``handler``, recording both directions.""" + """Serve the caller's posts from ``handler``, recording both directions. + + ``fail_after_applying`` names operations whose first call is applied and + then reported as a transport failure, the ambiguous case a retry has to + survive. + """ contract = temporalio.converter.DataConverter.default.payload_converter loop = asyncio.get_running_loop() + failing = set(fail_after_applying or []) - def post(url: str, body: bytes) -> bytes: + def post( + url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + ) -> bytes: + del headers, timeout_ms posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput request: Any = contract.from_payloads( [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] )[0] - if request_type is ReadInput: - # This endpoint has no other traffic to wait for, so park briefly - # rather than for the contract's default. - request.wait_ms = 200 - answer = asyncio.run_coroutine_threadsafe( - _dispatch(handler, operation, request), loop - ).result() + try: + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + except nexusrpc.HandlerError as error: + raise StreamEndpointError(str(error), status=400) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) + if operation in failing: + failing.discard(operation) + raise StreamEndpointError("connection reset after the handler answered") return raw return post +def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: + return instance( + "nexus", + endpoint="in-process", + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + wait_ms=200, + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + + async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, @@ -215,13 +250,7 @@ async def _loop_through_an_endpoint( answered: list[bytes] = [] handler = TemporalStreamsHandler(None, provider="memory") monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = instance( - "nexus", - endpoint="in-process", - data_converter=dataclasses.replace( - temporalio.converter.DataConverter.default, payload_codec=codec - ), - ) + front = _front(codec) workflow_id = "wf-codec" producer = await front.producer( @@ -263,7 +292,9 @@ async def test_the_caller_encodes_records_with_the_configured_codec( monkeypatch, ScrambleCodec() ) - # The value survives the hop, so the codec is applied on both sides. + # The value survives the hop although the handler cannot read the + # encoding, so the body passed through it untouched and the codec ran on + # the caller alone. assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] assert records[0].value == {"secret": "tuna"} # Neither direction carried the plaintext. @@ -281,3 +312,186 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( assert records[0].value == {"secret": "tuna"} assert b"tuna" in _appended_bytes(posted) assert b"tuna" in _answered_bodies(answered) + + +def _append( + workflow_id: str, batch_index: int, *values: Any, finish: bool = False +) -> AppendInput: + converter = temporalio.converter.DataConverter.default.payload_converter + return AppendInput( + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + batch_index=batch_index, + payloads=[ + converter.to_payloads([value])[0].SerializeToString() for value in values + ], + finish=finish, + ) + + +async def _stored(workflow_id: str) -> list[Any]: + consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") + out: list[Any] = [] + async for record in consumer.read(type=dict): + if record.kind is RecordKind.DATA: + out.append(record.value) + if await consumer.latest() == record.cursor: + break + return out + + +@pytest.fixture +def _memory_store(): # pyright: ignore[reportUnusedFunction] + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): + # A second handler instance stands in for a restarted or load-balanced + # handler worker: it shares the store but not the dedupe state. + first = TemporalStreamsHandler(None, provider="memory") + second = TemporalStreamsHandler(None, provider="memory") + await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert failed.value.retryable_override is False + # The store holds the first batch and nothing was silently lost or doubled. + assert await _stored("wf") == [{"n": 1}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_handler_drops_repeats_and_rejects_gaps(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # An exact repeat is dropped with a success answer and no position. + repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert repeat.cursor is None + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_malformed_payload_is_the_callers_fault(): + handler = TemporalStreamsHandler(None, provider="memory") + request = _append("wf", 1) + request.payloads = [b"\xff\xfe not a payload"] + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, request) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + await producer.finish() + indexes = [json.loads(body)["batch_index"] for body in posted] + # The retry re-sent index 1, which the handler dropped as a repeat, so + # the store holds each record once. + assert indexes == [1, 1, 2, 3] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_failed_append_goes_out_before_the_next_one( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + # The caller moves on without retrying; the pending batch is replayed + # first under its own index and the new one takes the next. + await producer.append({"n": 2}) + indexes = [json.loads(body)["batch_index"] for body in posted] + assert indexes == [1, 1, 2] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_consecutive_reads_share_one_parked_subscription(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) + first = await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ) + assert len(first.records) == 1 + parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] + pump = next(iter(parked.values())).pump + # A call that resumes where the last one stopped drains the same + # subscription instead of parking a second read on the store. + second = await _dispatch( + handler, + READ_OPERATION, + ReadInput( + workflow_id="wf", + stream="inputs", + after_token=first.next_token, + max_records=1, + wait_ms=200, + ), + ) + assert len(second.records) == 1 + assert second.next_token != first.next_token + assert len(parked) == 1 and next(iter(parked.values())).pump is pump + # A call from somewhere else replaces it. + await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ) + assert len(parked) == 1 and next(iter(parked.values())).pump is not pump + await handler.close() + assert not parked + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_read_wait_is_cut_to_the_request_deadline(): + handler = TemporalStreamsHandler(None, provider="memory") + started = asyncio.get_running_loop().time() + answer = await handler.read( + _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), + ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ) + assert answer.records == [] and answer.next_token == "" + assert asyncio.get_running_loop().time() - started < 5 + await handler.close() From 0972c50a7bea03c409c83fb03972cac4d35942ca Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:12:44 -0700 Subject: [PATCH 176/831] Renamed the store key helper to inbound_stream_id for the provider branches. The native and Redis providers import it under that name, so the interface exports the name they were told to use. --- temporalio/streams/_ids.py | 11 +++++++---- temporalio/streams/providers/memory.py | 10 +++++----- tests/streams/test_streams_conformance.py | 10 +++++----- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/temporalio/streams/_ids.py b/temporalio/streams/_ids.py index 625522f75..5f4161053 100644 --- a/temporalio/streams/_ids.py +++ b/temporalio/streams/_ids.py @@ -3,12 +3,12 @@ A workflow id may contain any character, ``:`` included, so joining the pair with a bare ``:`` is ambiguous: ``("a:b", "c")`` and ``("a", "b:c")`` would land in one store. Every provider that keys a store by the pair goes through -:func:`stream_key`, so they all agree and none of them collides. +:func:`inbound_stream_id`, so they all agree and none of them collides. """ from __future__ import annotations -__all__ = ["stream_key"] +__all__ = ["inbound_stream_id"] def _escape(component: str) -> str: @@ -17,8 +17,11 @@ def _escape(component: str) -> str: return component.replace("%", "%25").replace(":", "%3A") -def stream_key(workflow_id: str, stream: str) -> str: - """The key for ``stream`` of ``workflow_id``, or for the owner's stream when empty. +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The store id for inbound ``stream`` of ``workflow_id``. + + With an empty ``stream`` it is the id of the stream the workflow itself + publishes, so one function keys both. Both components are percent-encoded before joining, so the only bare ``:`` in the result is the separator, and an owner-stream key has none. diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 390c10b9c..4a3cf3298 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -27,7 +27,7 @@ from temporalio.api.common.v1 import Payload from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._ids import stream_key +from temporalio.streams._ids import inbound_stream_id from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -317,13 +317,13 @@ def open_read( # idle_timeout as the poll period would give the parameter a second # meaning that a port copying the reference would copy too. del idle_timeout - store = _stream(stream_key(workflow.info().workflow_id, stream)) + store = _stream(inbound_stream_id(workflow.info().workflow_id, stream)) return _MemReadSource( store, int(after.token) + 1 if after.token else 0, self._poll ) def open_write(self, topic: str) -> WriteSink: - store = _stream(stream_key(workflow.info().workflow_id, "")) + store = _stream(inbound_stream_id(workflow.info().workflow_id, "")) return _MemWriteSink(store, topic) async def producer( @@ -340,7 +340,7 @@ async def producer( # own writer appends to, and the frame carries the topic. An inbound # record carries none: the stream's name is its whole address. return MemoryProducer( - _stream(stream_key(workflow_id, stream)), + _stream(inbound_stream_id(workflow_id, stream)), _converter(client), topic, producer_id, @@ -351,7 +351,7 @@ async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> MemoryConsumer: return MemoryConsumer( - _stream(stream_key(workflow_id, stream)), _converter(client), stream + _stream(inbound_stream_id(workflow_id, stream)), _converter(client), stream ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 0a50ce2cb..7d76d85d6 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -119,12 +119,12 @@ def test_supersession_is_synthesized_from_observations(): assert attempts.note("model", 2, Cursor("2")) is None -def test_stream_keys_cannot_collide(): +def test_inbound_stream_ids_cannot_collide(): # A colon in a workflow id must not make two addresses one key. - assert _ids.stream_key("a:b", "c") != _ids.stream_key("a", "b:c") - assert _ids.stream_key("a:b", "") != _ids.stream_key("a", "b") - assert _ids.stream_key("a%3Ab", "c") != _ids.stream_key("a:b", "c") - assert _ids.stream_key("wf", "inputs") == "wf:inputs" + assert _ids.inbound_stream_id("a:b", "c") != _ids.inbound_stream_id("a", "b:c") + assert _ids.inbound_stream_id("a:b", "") != _ids.inbound_stream_id("a", "b") + assert _ids.inbound_stream_id("a%3Ab", "c") != _ids.inbound_stream_id("a:b", "c") + assert _ids.inbound_stream_id("wf", "inputs") == "wf:inputs" async def test_append_read_roundtrip(provider: ProviderCase): From d744abc4b85f33e61a67fa68df9e1fe1efda2624 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 177/831] Pinned Core to the stream revision and regenerated bridge protos. --- .gitmodules | 2 +- .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 613 ++++++-------- .../workflow_activation_pb2.pyi | 68 ++ .../workflow_commands_pb2.py | 800 +++++++----------- .../workflow_commands_pb2.pyi | 90 ++ temporalio/bridge/sdk-core | 2 +- 7 files changed, 737 insertions(+), 840 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..ae7639820 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamMessages, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamMessages", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..0e1b3a1e6 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,430 +2,311 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.update.v1 import ( - message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, -) -from temporalio.bridge.proto.activity_result import ( - activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' -) - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ - "HeadersEntry" -] -_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStart" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartSuccess" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartFailure" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartCancelled" -] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecution" -] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveSignalExternalWorkflow" -] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveRequestCancelExternalWorkflow" -] -_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveNexusOperationStart" -] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] -WorkflowActivation = _reflection.GeneratedProtocolMessageType( - "WorkflowActivation", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }, -) + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] +_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] +_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] +WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( - "WorkflowActivationJob", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }, -) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }) _sym_db.RegisterMessage(WorkflowActivationJob) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType( - "InitializeWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _INITIALIZEWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }, -) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }) +_sym_db.RegisterMessage(DeliverStreamMessages) + +InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _INITIALIZEWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType( - "FireTimer", - (_message.Message,), - { - "DESCRIPTOR": _FIRETIMER, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }, -) +FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { + 'DESCRIPTOR' : _FIRETIMER, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType( - "ResolveActivity", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEACTIVITY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }, -) +ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }, -) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartSuccess", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }, -) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartFailure", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }, -) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartCancelled", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }, -) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }, -) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( - "UpdateRandomSeed", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERANDOMSEED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }, -) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERANDOMSEED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType( - "QueryWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _QUERYWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }, -) +QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _QUERYWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }, -) +CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType( - "SignalWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }, -) +SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType( - "NotifyHasPatch", - (_message.Message,), - { - "DESCRIPTOR": _NOTIFYHASPATCH, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }, -) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { + 'DESCRIPTOR' : _NOTIFYHASPATCH, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveSignalExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }, -) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveRequestCancelExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }, -) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType( - "DoUpdate", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }, - ), - "DESCRIPTOR": _DOUPDATE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }, -) +DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }) + , + 'DESCRIPTOR' : _DOUPDATE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperationStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }, -) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }, -) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType( - "RemoveFromCache", - (_message.Message,), - { - "DESCRIPTOR": _REMOVEFROMCACHE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }, -) +RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { + 'DESCRIPTOR' : _REMOVEFROMCACHE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" - ) - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' + _WORKFLOWACTIVATION._serialized_start=570 + _WORKFLOWACTIVATION._serialized_end=1116 + _WORKFLOWACTIVATIONJOB._serialized_start=1119 + _WORKFLOWACTIVATIONJOB._serialized_end=2582 + _DELIVERSTREAMMESSAGES._serialized_start=2585 + _DELIVERSTREAMMESSAGES._serialized_end=2724 + _INITIALIZEWORKFLOW._serialized_start=2727 + _INITIALIZEWORKFLOW._serialized_end=4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 + _FIRETIMER._serialized_start=4133 + _FIRETIMER._serialized_end=4157 + _RESOLVEACTIVITY._serialized_start=4159 + _RESOLVEACTIVITY._serialized_end=4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 + _UPDATERANDOMSEED._serialized_start=5045 + _UPDATERANDOMSEED._serialized_end=5088 + _QUERYWORKFLOW._serialized_start=5091 + _QUERYWORKFLOW._serialized_end=5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 + _CANCELWORKFLOW._serialized_start=5353 + _CANCELWORKFLOW._serialized_end=5385 + _SIGNALWORKFLOW._serialized_start=5388 + _SIGNALWORKFLOW._serialized_end=5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 + _NOTIFYHASPATCH._serialized_start=5679 + _NOTIFYHASPATCH._serialized_end=5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 + _DOUPDATE._serialized_start=5917 + _DOUPDATE._serialized_end=6248 + _DOUPDATE_HEADERSENTRY._serialized_start=4052 + _DOUPDATE_HEADERSENTRY._serialized_end=4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 + _RESOLVENEXUSOPERATION._serialized_start=6407 + _RESOLVENEXUSOPERATION._serialized_end=6496 + _REMOVEFROMCACHE._serialized_start=6499 + _REMOVEFROMCACHE._serialized_end=6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..eab815fc9 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.update.v1.message_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_messages(self) -> global___DeliverStreamMessages: + """A range of a stream the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +327,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +335,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -368,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -421,6 +431,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_messages", "remove_from_cache", ] | None @@ -1440,6 +1451,63 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0cdc02c6b..ccfa1a016 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,552 +2,408 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" - +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.sdk.v1 import ( - event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, -) -from temporalio.api.sdk.v1 import ( - user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' -) - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] -_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ - "HeadersEntry" -] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ - "RequestCancelLocalActivity" -] -_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CompleteWorkflowExecution" -] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ContinueAsNewWorkflowExecution" -] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "StartChildWorkflowExecution" -] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CancelChildWorkflowExecution" -] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "RequestCancelExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "SignalExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( - _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ - "UpsertWorkflowSearchAttributes" -] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ - "NexusHeaderEntry" -] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ - "RequestCancelNexusOperation" -] -WorkflowCommand = _reflection.GeneratedProtocolMessageType( - "WorkflowCommand", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWCOMMAND, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }, -) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] +_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] +_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] +_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] +WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWCOMMAND, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }) _sym_db.RegisterMessage(WorkflowCommand) -StartTimer = _reflection.GeneratedProtocolMessageType( - "StartTimer", - (_message.Message,), - { - "DESCRIPTOR": _STARTTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }, -) +AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _ADDSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }) +_sym_db.RegisterMessage(AddStreamMessages) + +SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTREAM, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }) +_sym_db.RegisterMessage(SubscribeStream) + +StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { + 'DESCRIPTOR' : _STARTTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType( - "CancelTimer", - (_message.Message,), - { - "DESCRIPTOR": _CANCELTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }, -) +CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { + 'DESCRIPTOR' : _CANCELTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULEACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }, -) +ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleLocalActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULELOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }, -) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }, -) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelLocalActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }, -) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType( - "QueryResult", - (_message.Message,), - { - "DESCRIPTOR": _QUERYRESULT, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }, -) +QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { + 'DESCRIPTOR' : _QUERYRESULT, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType( - "QuerySuccess", - (_message.Message,), - { - "DESCRIPTOR": _QUERYSUCCESS, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }, -) +QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { + 'DESCRIPTOR' : _QUERYSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CompleteWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }, -) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "FailWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _FAILWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }, -) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ContinueAsNewWorkflowExecution", - (_message.Message,), - { - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }, - ), - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }, -) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }) + , + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }, -) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType( - "SetPatchMarker", - (_message.Message,), - { - "DESCRIPTOR": _SETPATCHMARKER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }, -) +SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { + 'DESCRIPTOR' : _SETPATCHMARKER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "StartChildWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }, - ), - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }, - ), - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }, -) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }) + , + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }) + , + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }, -) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "RequestCancelExternalWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }, -) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "SignalExternalWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }, -) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelSignalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELSIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }, -) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( - "UpsertWorkflowSearchAttributes", - (_message.Message,), - { - "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }, -) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { + 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( - "ModifyWorkflowProperties", - (_message.Message,), - { - "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }, -) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { + 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType( - "UpdateResponse", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERESPONSE, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }, -) +UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERESPONSE, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( - "ScheduleNexusOperation", - (_message.Message,), - { - "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( - "NexusHeaderEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }, - ), - "DESCRIPTOR": _SCHEDULENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }, -) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { + + 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( - "RequestCancelNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }, -) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" - ) - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8672 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8760 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4339 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4341 - _REQUESTCANCELACTIVITY._serialized_end = 4377 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4379 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4420 - _QUERYRESULT._serialized_start = 4423 - _QUERYRESULT._serialized_end = 4579 - _QUERYSUCCESS._serialized_start = 4581 - _QUERYSUCCESS._serialized_end = 4646 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4648 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4724 - _FAILWORKFLOWEXECUTION._serialized_start = 4726 - _FAILWORKFLOWEXECUTION._serialized_end = 4800 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4803 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5717 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5719 - _CANCELWORKFLOWEXECUTION._serialized_end = 5795 - _SETPATCHMARKER._serialized_start = 5797 - _SETPATCHMARKER._serialized_end = 5851 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5854 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7028 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7030 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7104 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7107 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7249 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7252 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7651 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7653 - _CANCELSIGNALWORKFLOW._serialized_end = 7688 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7690 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7791 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7793 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7872 - _UPDATERESPONSE._serialized_start = 7875 - _UPDATERESPONSE._serialized_end = 8085 - _SCHEDULENEXUSOPERATION._serialized_start = 8088 - _SCHEDULENEXUSOPERATION._serialized_end = 8626 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8576 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8626 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8628 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8670 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' + _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 + _WORKFLOWCOMMAND._serialized_start=556 + _WORKFLOWCOMMAND._serialized_end=2794 + _ADDSTREAMMESSAGES._serialized_start=2796 + _ADDSTREAMMESSAGES._serialized_end=2891 + _SUBSCRIBESTREAM._serialized_start=2893 + _SUBSCRIBESTREAM._serialized_end=2951 + _STARTTIMER._serialized_start=2953 + _STARTTIMER._serialized_end=3036 + _CANCELTIMER._serialized_start=3038 + _CANCELTIMER._serialized_end=3064 + _SCHEDULEACTIVITY._serialized_start=3067 + _SCHEDULEACTIVITY._serialized_end=3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 + _SCHEDULELOCALACTIVITY._serialized_start=3894 + _SCHEDULELOCALACTIVITY._serialized_end=4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 + _REQUESTCANCELACTIVITY._serialized_start=4646 + _REQUESTCANCELACTIVITY._serialized_end=4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 + _QUERYRESULT._serialized_start=4728 + _QUERYRESULT._serialized_end=4884 + _QUERYSUCCESS._serialized_start=4886 + _QUERYSUCCESS._serialized_end=4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 + _FAILWORKFLOWEXECUTION._serialized_start=5031 + _FAILWORKFLOWEXECUTION._serialized_end=5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELWORKFLOWEXECUTION._serialized_start=6024 + _CANCELWORKFLOWEXECUTION._serialized_end=6100 + _SETPATCHMARKER._serialized_start=6102 + _SETPATCHMARKER._serialized_end=6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELSIGNALWORKFLOW._serialized_start=7958 + _CANCELSIGNALWORKFLOW._serialized_end=7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 + _UPDATERESPONSE._serialized_start=8180 + _UPDATERESPONSE._serialized_end=8390 + _SCHEDULENEXUSOPERATION._serialized_start=8393 + _SCHEDULENEXUSOPERATION._serialized_end=8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index ad4a5f487..040a2267c 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,6 +23,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,10 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: ... + @property + def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( self, *, @@ -215,6 +222,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... def HasField( self, @@ -243,6 +252,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -298,6 +311,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -350,6 +367,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "add_stream_messages", ] | None ): ... @@ -386,6 +405,77 @@ class StartTimer(google.protobuf.message.Message): global___StartTimer = StartTimer +class AddStreamMessages(google.protobuf.message.Message): + """Publish a batch of messages to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand messages cost the same in History as one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessages = AddStreamMessages + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 85b71d7ec..3d1f82e66 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 85b71d7ecd4f2bf677fa1cee17f3fbc1ab10f1b9 +Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 From 33b12112c4d89d2436c2f43f87fd9dfde97c3d29 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 178/831] Added the vendored stream API protos. --- scripts/gen_stream_protos.py | 161 +++++ temporalio/api/stream/__init__.py | 0 temporalio/api/stream/v1/__init__.py | 11 + temporalio/api/stream/v1/message_pb2.py | 69 ++ temporalio/api/stream/v1/message_pb2.pyi | 134 ++++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 138 ++++ .../api/streamservice/v1/message_pb2.py | 46 ++ .../api/streamservice/v1/message_pb2.pyi | 47 ++ .../api/streamservice/v1/message_pb2_grpc.py | 24 + .../streamservice/v1/request_response_pb2.py | 138 ++++ .../streamservice/v1/request_response_pb2.pyi | 434 ++++++++++++ .../v1/request_response_pb2_grpc.py | 24 + .../api/streamservice/v1/service_pb2.py | 38 ++ .../api/streamservice/v1/service_pb2.pyi | 5 + .../api/streamservice/v1/service_pb2_grpc.py | 616 ++++++++++++++++++ .../api/streamservice/v1/stream_state_pb2.py | 56 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 114 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 24 + 19 files changed, 2079 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/stream/__init__.py create mode 100644 temporalio/api/stream/v1/__init__.py create mode 100644 temporalio/api/stream/v1/message_pb2.py create mode 100644 temporalio/api/stream/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..e66f8abb4 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,161 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, "-m", "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--pyi_out={out}", + f"--grpc_python_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/stream/__init__.py b/temporalio/api/stream/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py new file mode 100644 index 000000000..f76c1c334 --- /dev/null +++ b/temporalio/api/stream/v1/__init__.py @@ -0,0 +1,11 @@ +from .message_pb2 import ( + StreamCursor, + StreamMessage, + StreamSlice, +) + +__all__ = [ + "StreamCursor", + "StreamMessage", + "StreamSlice", +] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py new file mode 100644 index 000000000..da1e5bc91 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/stream/v1/message.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto\"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03\"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3') + + + +_STREAMMESSAGE = DESCRIPTOR.message_types_by_name['StreamMessage'] +_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name['MetadataEntry'] +_STREAMSLICE = DESCRIPTOR.message_types_by_name['StreamSlice'] +_STREAMCURSOR = DESCRIPTOR.message_types_by_name['StreamCursor'] +StreamMessage = _reflection.GeneratedProtocolMessageType('StreamMessage', (_message.Message,), { + + 'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), { + 'DESCRIPTOR' : _STREAMMESSAGE_METADATAENTRY, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) + }) + , + 'DESCRIPTOR' : _STREAMMESSAGE, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) + }) +_sym_db.RegisterMessage(StreamMessage) +_sym_db.RegisterMessage(StreamMessage.MetadataEntry) + +StreamSlice = _reflection.GeneratedProtocolMessageType('StreamSlice', (_message.Message,), { + 'DESCRIPTOR' : _STREAMSLICE, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }) +_sym_db.RegisterMessage(StreamSlice) + +StreamCursor = _reflection.GeneratedProtocolMessageType('StreamCursor', (_message.Message,), { + 'DESCRIPTOR' : _STREAMCURSOR, + '__module__' : 'temporalio.api.stream.v1.message_pb2' + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) + }) +_sym_db.RegisterMessage(StreamCursor) + +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1' + _STREAMMESSAGE_METADATAENTRY._options = None + _STREAMMESSAGE_METADATAENTRY._serialized_options = b'8\001' + _STREAMMESSAGE._serialized_start=103 + _STREAMMESSAGE._serialized_end=357 + _STREAMMESSAGE_METADATAENTRY._serialized_start=277 + _STREAMMESSAGE_METADATAENTRY._serialized_end=357 + _STREAMSLICE._serialized_start=360 + _STREAMSLICE._serialized_end=547 + _STREAMCURSOR._serialized_start=549 + _STREAMCURSOR._serialized_end=622 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi new file mode 100644 index 000000000..c1c796da8 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -0,0 +1,134 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" +import builtins +import collections.abc +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message +import sys +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["value", b"value"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + @property + def metadata(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, temporalio.api.common.v1.message_pb2.Payload]: ... + topic: builtins.str + topic_sequence: builtins.int + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[builtins.str, temporalio.api.common.v1.message_pb2.Payload] | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + ) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["body", b"body"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["body", b"body", "metadata", b"metadata", "topic", b"topic", "topic_sequence", b"topic_sequence"]) -> None: ... + +global___StreamMessage = StreamMessage + +class StreamSlice(google.protobuf.message.Message): + """A contiguous range of a stream delivered to a Workflow Task, along with the + offsets it covers. The offsets are what History records; the messages + themselves are never written to History. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription observed nothing, + which is a fact replay has to reproduce rather than an absence of one. + """ + @property + def messages(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___StreamMessage]: ... + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event whose stream_cursors recorded this range. + Set only when the server is re-supplying a range for a task being + replayed; a slice for the task now being started leaves it unset, because + the event closing that task does not exist yet. + + Replay needs this because a Workflow Task response carries one slice set + while a cache miss replays every prior task, so the ranges have to be + matched to the events that recorded them rather than to the response. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + workflow_task_completed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "messages", b"messages", "run_id", b"run_id", "stream_id", b"stream_id", "to_offset", b"to_offset", "workflow_task_completed_event_id", b"workflow_task_completed_event_id"]) -> None: ... + +global___StreamSlice = StreamSlice + +class StreamCursor(google.protobuf.message.Message): + """The offsets a Workflow Task consumed, without the payloads. Recorded on + WorkflowTaskCompleted so History grows with Workflow Tasks rather than with + messages. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + from_offset: builtins.int + to_offset: builtins.int + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "stream_id", b"stream_id", "to_offset", b"to_offset"]) -> None: ... + +global___StreamCursor = StreamCursor diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..31f99bded --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,138 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + STREAM_MESSAGE_KIND_DATA, + STREAM_MESSAGE_KIND_FLUSH, + STREAM_MESSAGE_KIND_UNSPECIFIED, + StreamMessage, + StreamMessageBatch, + StreamMessageKind, +) + +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "STREAM_MESSAGE_KIND_DATA", + "STREAM_MESSAGE_KIND_FLUSH", + "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamLifecycle", + "StreamListEntry", + "StreamMessage", + "StreamMessageBatch", + "StreamMessageKind", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..b4fe8e68a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/message.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/message.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z None: ... + BODY_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + body: _message_pb2.Payload + metadata: _containers.MessageMap[str, _message_pb2.Payload] + topic: str + topic_sequence: int + kind: StreamMessageKind + offset: int + def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + +class StreamMessageBatch(_message.Message): + __slots__ = ("messages",) + MESSAGES_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] + def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..b1383816d --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..60dafee45 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/request_response.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/request_response.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + +class CreateStreamOutput(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class AddMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + expected_offset: int + use_expected_offset: bool + owner_epoch: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + +class AddMessagesOutput(_message.Message): + __slots__ = ("first_offset", "next_offset", "count", "deduplicated") + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] + first_offset: int + next_offset: int + count: int + deduplicated: bool + def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + +class FinishWritingInput(_message.Message): + __slots__ = ("namespace", "stream_id", "producer_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + producer_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + +class FinishWritingOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SubscribeWorkflowInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + stream_id: str + start_offset: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class SubscribeWorkflowOutput(_message.Message): + __slots__ = ("start_offset",) + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + start_offset: int + def __init__(self, start_offset: _Optional[int] = ...) -> None: ... + +class PollMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class PollMessagesOutput(_message.Message): + __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") + MESSAGES_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + next_offset: int + head_offset: int + closed: bool + close_reason: _message_pb2_1.Payload + def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class DescribeStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class PollWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class DescribeWorkflowStreamInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + +class AddWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + +class DescribeStreamOutput(_message.Message): + __slots__ = ("state",) + STATE_FIELD_NUMBER: _ClassVar[int] + state: _stream_state_pb2.StreamState + def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + +class CloseStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "reason") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + reason: _message_pb2_1.Payload + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class CloseStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TruncateStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "new_base_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + new_base_offset: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + +class TruncateStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class DeleteStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class CreateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CreateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + +class CreateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CreateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + +class AddMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + +class AddMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class FinishWritingRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: FinishWritingInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + +class FinishWritingResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: FinishWritingOutput + def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: SubscribeWorkflowInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: SubscribeWorkflowOutput + def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + +class PollMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + +class PollMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeWorkflowStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class CloseStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CloseStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + +class CloseStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CloseStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + +class TruncateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: TruncateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + +class TruncateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: TruncateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + +class ListStreamsInput(_message.Message): + __slots__ = ("namespace", "page_size", "next_page_token", "query") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + namespace: str + page_size: int + next_page_token: bytes + query: str + def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + +class StreamListEntry(_message.Message): + __slots__ = ("stream_id", "run_id") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + stream_id: str + run_id: str + def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + +class ListStreamsOutput(_message.Message): + __slots__ = ("streams", "next_page_token") + STREAMS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] + next_page_token: bytes + def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + +class ListStreamsRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: ListStreamsInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + +class ListStreamsResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: ListStreamsOutput + def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + +class DeleteStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DeleteStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + +class DeleteStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DeleteStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..87cc91022 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..7f376c28e --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class StreamServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True) + self.AddMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True) + self.FinishWriting = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True) + self.SubscribeWorkflow = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True) + self.PollMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True) + self.DescribeStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True) + self.PollWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True) + self.DescribeWorkflowStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True) + self.AddWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True) + self.CloseStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True) + self.TruncateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True) + self.ListStreams = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True) + self.DeleteStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True) + + +class StreamServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def CreateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinishWriting(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeWorkflow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollWorkflowMessages(self, request, context): + """Routed on the owner, because the stream it reads has no id of its own. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeWorkflowStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkflowMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TruncateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListStreams(self, request, context): + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_StreamServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateStream': grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + 'AddMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + 'FinishWriting': grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + 'PollMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + 'DescribeStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + 'CloseStream': grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + 'TruncateStream': grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + 'ListStreams': grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + 'DeleteStream': grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class StreamService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinishWriting(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeWorkflow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeWorkflowStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CloseStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def TruncateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListStreams(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..234fa94d0 --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/stream_state.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/stream_state.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z None: ... + class ConsumersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ConsumerCursor + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCERS_FIELD_NUMBER: _ClassVar[int] + CONSUMERS_FIELD_NUMBER: _ClassVar[int] + LIFECYCLE_FIELD_NUMBER: _ClassVar[int] + REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] + head_offset: int + base_offset: int + last_txn_id: int + closed: bool + close_reason: _message_pb2.Payload + owner_epoch: int + bucket_size: int + collection_id: str + producers: _containers.MessageMap[str, ProducerCursor] + consumers: _containers.MessageMap[str, ConsumerCursor] + lifecycle: StreamLifecycle + redirect_run_id: str + close_time: _timestamp_pb2.Timestamp + def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProducerCursor(_message.Message): + __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") + SEQ_FIELD_NUMBER: _ClassVar[int] + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] + FENCED_FIELD_NUMBER: _ClassVar[int] + seq: int + first_offset: int + count: int + content_hash: bytes + fenced: bool + def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + +class ConsumerCursor(_message.Message): + __slots__ = ("workflow_id", "run_id", "offset", "active", "external") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + run_id: str + offset: int + active: bool + external: bool + def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + +class WorkflowStreamCursor(_message.Message): + __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + PENDING_FROM_FIELD_NUMBER: _ClassVar[int] + PENDING_TO_FIELD_NUMBER: _ClassVar[int] + HAS_PENDING_FIELD_NUMBER: _ClassVar[int] + stream_id: str + collection_id: str + bucket_size: int + offset: int + known_head: int + external: bool + pending_from: int + pending_to: int + has_pending: bool + def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + +class StreamLifecycle(_message.Message): + __slots__ = ("retention", "max_items") + RETENTION_FIELD_NUMBER: _ClassVar[int] + MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] + retention: _duration_pb2.Duration + max_items: int + def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..4e128a2aa --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) From bea89041c8abca43d5ee7b0c558944c6145751f5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 179/831] Added the stream client and the workflow stream surface. --- temporalio/client_stream.py | 476 +++++++++++++++++++++++ temporalio/worker/_workflow_instance.py | 142 +++++++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 119 ++++++ tests/test_client_stream.py | 128 ++++++ tests/worker/test_workflow_stream.py | 113 ++++++ tests/worker/test_workflow_stream_e2e.py | 244 ++++++++++++ 7 files changed, 1232 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py create mode 100644 tests/worker/test_workflow_stream.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..75388c9c9 --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,476 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` + instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, AsyncIterator, Optional, Sequence + +import google.protobuf.duration_pb2 + +import temporalio.api.common.v1 +import temporalio.api.streamservice.v1 as stream +from temporalio.api.streamservice.v1 import service_pb2_grpc + +__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] + + +@dataclass(frozen=True) +class Message: + """One item read from a stream. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back messages whose offsets are not contiguous. To resume at the + boundary of a whole read, checkpoint the ``next_offset`` that + :meth:`StreamHandle.read` returns instead. + """ + + data: bytes + topic: str = "" + offset: int = 0 + """Where this message sits in the whole stream. + + A topic filter leaves gaps, so a reader that resumes between messages has + to take this rather than count what it received. + """ + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. + """ + + messages: list[Message] + next_offset: int + head_offset: int + closed: bool + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + self._stub = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> "StreamClient": + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + try: + import grpc + except ImportError as err: + raise RuntimeError( + "temporalio.client_stream requires the grpc extra: " + "pip install 'temporalio[grpc]'" + ) from err + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: Optional[float] = None, + max_items: Optional[int] = None, + ) -> "StreamHandle": + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many messages remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await self._stub.CreateStream( + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ) + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> "StreamHandle": + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "" + ) -> "WorkflowStreamHandle": + """Open a stream a workflow publishes to. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.add_stream_messages`` writes to when it is given none. + + The stream is created by the workflow's first publish. Reading one that + does not exist yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when the + workflow publishes. + """ + return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + + +class StreamHandle: + """A handle to one stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append messages and return the offset the first one landed at. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice. Without them the append is at-least-once, which is + only the right trade when duplicates are harmless. + """ + response = await self._stub.AddMessages( + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, returning the messages and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=offset, + topics=list(topics), + wait_new_messages=True, + ) + ) + ) + out = response.frontend_response + for msg in out.messages: + yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) + offset = out.next_offset + if out.closed and offset >= out.head_offset: + return + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await self._stub.FinishWriting( + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ) + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await self._stub.CloseStream( + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await self._stub.DescribeStream( + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow publishes to. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, stub: Any, namespace: str, workflow_id: str, name: str = "" + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await self._stub.AddWorkflowMessages( + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for msg in page.messages: + yield msg + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_messages: int = 0, + wait: bool = True, + ) -> "Page": + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + """ + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return Page( + messages=[ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await self._stub.DescribeWorkflowStream( + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + ) + ) + ) + return response.frontend_response.state diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 108431021..f98e38a67 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -269,6 +270,71 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# which would replay and re-issue the same rejected command forever, into an +# error the workflow author can see. +_MAX_STREAM_MESSAGES_PER_BATCH = 1000 + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self) -> None: + self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._waiters: list[asyncio.Future] = [] + + def extend( + self, + messages: Sequence[temporalio.api.stream.v1.StreamMessage], + from_offset: int = 0, + ) -> None: + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not messages: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-message field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + self._messages.extend( + temporalio.workflow.DeliveredStreamMessage( + body=message.body.data, + topic=message.topic, + offset=from_offset + index, + ) + for index, message in enumerate(messages) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: + taken, self._messages = self._messages, [] + return taken + + def put_back( + self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._messages[:0] = messages + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._messages) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -396,6 +462,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -611,6 +682,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_messages"): + self._apply_deliver_stream_messages(job.deliver_stream_messages) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1136,6 +1209,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_messages( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer() + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.messages, job.from_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1300,6 +1386,62 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. The + # server treats a repeat subscription to the same stream as a no-op. + self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: + if not messages: + raise ValueError("add_stream_messages needs at least one message") + if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " + f"got {len(messages)}" + ) + command = self._add_command() + command.add_stream_messages.stream_id = stream_id + for body in messages: + # The bodies ride the command and never enter History, so the event + # this produces stays the same size whatever is published here. + message = command.add_stream_messages.messages.add() + message.body.data = body + # Every other Temporal payload names its encoding, and the UI, the + # CLI and any codec server rely on that to decode what they read. + message.body.metadata["encoding"] = b"binary/plain" + message.topic = topic + + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: + return [ + m.body + for m in await self.workflow_read_stream_messages(stream_id, max_messages) + ] + + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[temporalio.workflow.DeliveredStreamMessage]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_messages and len(taken) > max_messages: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_messages:]) + taken = taken[:max_messages] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..9189b0db6 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -95,6 +95,11 @@ upsert_search_attributes, uuid4, uuid7, + DeliveredStreamMessage, + read_stream, + read_stream_messages, + add_stream_messages, + subscribe_stream, wait_condition, ) from ._definition import ( @@ -227,6 +232,11 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamMessage", + "read_stream", + "read_stream_messages", + "add_stream_messages", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..423d77d01 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -312,6 +312,24 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: ... + + @abstractmethod + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: ... + + @abstractmethod + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[DeliveredStreamMessage]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -945,6 +963,107 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream` returns them. Safe to call again: the server treats + a second subscription to the same stream as a no-op, which is what makes + calling it on every replay harmless. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. + + Args: + stream_id: Stream to consume. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def add_stream_messages( + messages: Sequence[bytes], + *, + stream_id: str = "", + topic: str = "", +) -> None: + """Publish a batch of messages to a stream this workflow owns. + + Returns as soon as the command is issued. The bodies go to the stream's own + log rather than into History, which gets one fixed-size event naming the + offset range, so a batch of a thousand costs History the same as a batch of + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Batch where you can. The event is per call, and a workflow is bounded by the + history event count, so one call with a hundred messages leaves far more + room than a hundred calls with one. + + Args: + messages: Bodies to append, in order. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + topic: Optional topic, which readers can filter on. Offsets are still + assigned over the unfiltered stream. + """ + _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + + +@dataclass(frozen=True) +class DeliveredStreamMessage: + """One message a consuming workflow was given, with where it sat.""" + + body: bytes + topic: str + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_messages( + stream_id: str, *, max_messages: int = 0 +) -> list[DeliveredStreamMessage]: + """Read the next messages, keeping their topic and position. + + Same delivery as :func:`read_stream`. A reader that has to name where it + got to, filter a topic, or hand a position to something outside the + workflow needs more than the bodies. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_messages( + stream_id, max_messages + ) + + +async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: + """Read the next messages of a stream this workflow consumes. + + Waits until at least one message is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. + + Subscribe out of band with the stream client. This only reads what has + already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + + Returns: + The message bodies, in stream order. + """ + return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..f7df3c7a7 --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,128 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import AsyncIterator + +import pytest + +from temporalio.client_stream import StreamClient, StreamHandle + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +@pytest.fixture +async def stream() -> AsyncIterator[StreamHandle]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + finally: + await client.close() + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + assert await stream.append(b"alpha", b"beta") == 0 + assert await stream.append(b"gamma") == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(b"alpha", b"beta", b"gamma") + + messages, next_offset = await stream.read() + assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + assert next_offset == 3 + + messages, next_offset = await stream.read(from_offset=1) + assert [m.data for m in messages] == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(b"alpha") + + messages, next_offset = await stream.read(from_offset=1) + assert messages == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same message twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(b"once", producer_id="p1", sequence=1) + retry = await stream.append(b"once", producer_id="p1", sequence=1) + assert first == retry == 0 + + messages, _ = await stream.read() + assert [m.data for m in messages] == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(b"tok", topic="tokens") + await stream.append(b"prog", topic="progress") + await stream.append(b"tok2", topic="tokens") + + messages, next_offset = await stream.read(topics=["tokens"]) + assert [m.data for m in messages] == [b"tok", b"tok2"] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for message in stream.follow(): + received.append(message.data) + + task = asyncio.create_task(follower()) + await stream.append(b"one") + await asyncio.sleep(0.2) + await stream.append(b"two") + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(b"one", b"two") + await stream.close() + + received = [m.data async for m in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(b"one", b"two") + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..944761cfa --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,113 @@ +"""In-workflow consumption of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering and the workflow-facing read directly, which is the part +this SDK owns; the delivery decision itself lives in the server and sdk-core. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.worker._workflow_instance import ( + _StreamBuffer, + _WorkflowInstanceImpl, +) + + +def message(body: bytes) -> api_stream.StreamMessage: + return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"one"), message(b"two")]) + + assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([message(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert [m.body.data for m in buffer.take()] == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert [m.body.data for m in buffer.take()] == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream``, so a test that reimplements + it proves nothing about the code that ships. + """ + + def __init__(self) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self.read_only_calls: list[str] = [] + + def _assert_not_read_only(self, action: str) -> None: + self.read_only_calls.append(action) + + +@pytest.mark.parametrize("max_messages", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: + stub = _ReadOnlyStub() + bodies = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b) for b in bodies]) + + got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + + assert got == bodies[:max_messages] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + + if len(stub._stream_buffers["s"]): + rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert got + rest == bodies + else: + assert got == bodies + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub() + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b"a")]) + + await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..579327217 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,244 @@ +"""A workflow publishing to a stream it owns and reading its own messages back. + +Path A and Path C together, both from workflow code. Needs a Temporal server +built from the AI-198 branch, because neither the stream service nor the +commands exist on a released one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest +from temporalio.api.enums.v1 import EventType + +from temporalio import workflow +from temporalio.client import Client +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +STREAM = "output" + +# Event type numbers rather than names: this SDK's api protos predate both +# events, so the attributes arrive as unknown fields and only the type is +# readable here. The server's own tests are where the offsets are asserted. +EVENT_STREAM_SUBSCRIBED = 61 +EVENT_STREAM_MESSAGES_ADDED = 62 + + +@workflow.defn +class PublishAndRead: + @workflow.run + async def run(self) -> list[str]: + # Published before subscribing, because a subscription resolves against + # the streams the workflow already owns and this is what creates one. + workflow.add_stream_messages( + [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + ) + workflow.add_stream_messages([b"delta"], stream_id=STREAM) + + workflow.subscribe_stream(STREAM, start_offset=0) + + received: list[str] = [] + while len(received) < 4: + for body in await workflow.read_stream(STREAM): + received.append(body.decode()) + return received + + +async def test_workflow_reads_back_what_it_published() -> None: + client = await Client.connect(TARGET or "") + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=wf_id, task_queue=task_queue + ), + timeout=60, + ) + + assert result == ["alpha", "beta", "gamma", "delta"] + + counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + + # Two calls carrying four messages, so two events: the event is per batch, + # which is what makes batching free. + assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class PublishOnSignal: + """Publishes a token per signal, which is the shape an agent turn has.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + self._done = False + + @workflow.run + async def run(self) -> int: + published = 0 + while True: + await workflow.wait_condition(lambda: self._pending or self._done) + while self._pending: + workflow.add_stream_messages([self._pending.pop(0).encode()]) + published += 1 + if self._done: + return published + + @workflow.signal + async def emit(self, token: str) -> None: + self._pending.append(token) + + @workflow.signal + async def finish(self) -> None: + self._done = True + + +async def test_a_client_follows_what_a_workflow_publishes() -> None: + """The harness shape: the workflow writes, something outside it reads live. + + A stream a workflow owns has no id, so the reader addresses it by the + owner. It also attaches before the first publish, which is what a UI opening + on a session does. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "follow-tq-" + uuid.uuid4().hex[:8] + wf_id = "follow-wf-" + uuid.uuid4().hex[:8] + + tokens = [f"token-{i}" for i in range(5)] + received: list[str] = [] + + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishOnSignal], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + PublishOnSignal.run, id=wf_id, task_queue=task_queue + ) + + # Attached before anything is published, so the stream does not + # exist yet and the first poll has to park rather than fail. + reader = streams.workflow_stream(wf_id) + assert (await reader.describe()).head_offset == 0 + + async def follow() -> None: + async for message in reader.follow(): + received.append(message.data.decode()) + if len(received) == len(tokens): + return + + following = asyncio.ensure_future(follow()) + for token in tokens: + await handle.signal(PublishOnSignal.emit, token) + await asyncio.wait_for(following, timeout=60) + + await handle.signal(PublishOnSignal.finish) + assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) + finally: + await streams.close() + + assert received == tokens + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each `read_stream` that finds nothing + blocks, which ends a Workflow Task, so the run spans several. With the + cache on, every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for body in await workflow.read_stream(stream_id): + seen.append(body.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + Every other end-to-end test here disables it, so the sticky path was never + exercised. The server sends no replay slice for a sticky task, while the + sticky history still carries the previous task's consumed range, and the + two together used to fail every task after the first consumed range. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, + task_queue=task_queue, + workflows=[ConsumeAcrossTasks], + # Left at the default deliberately. This is what the test is for. + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=wf_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append(*[t.encode() for t in batch]) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + # More than one Workflow Task ran, otherwise the test proves nothing. + completed = 0 + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: + completed += 1 + assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + finally: + await streams.close() From 07d0fac5888587025bed273f618813c7fe45f34f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 180/831] Added the Workflow Streams surface over a server-side stream. --- temporalio/contrib/server_streams/__init__.py | 397 ++++++++++++++++++ tests/contrib/test_server_streams.py | 154 +++++++ 2 files changed, 551 insertions(+) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..e831d763c --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,397 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per batch rather than a +Signal per batch. A consumer reads the log directly rather than long-polling an +Update, so there is no per-Workflow limit on how many can read at once, and a +closed Workflow stays readable until its stream's retention expires. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, Optional, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.converter import DataConverter, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still encoded. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + """ + + items: list["WorkflowStreamItem[bytes]"] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _encode(converter: PayloadConverter, value: Any) -> bytes: + """Serialize one value to a stream message body. + + The payload rather than the bare bytes, so the encoding metadata the + consumer needs to decode into a type travels with it. + + The codec chain is not applied. It cannot be applied here: a codec is async + and a Workflow publishing to a stream is not, so running one inside Workflow + code would be I/O on the Workflow thread. Regular payloads solve this in the + Worker, encoding on the way out and decoding on the way in, and a stream + needs the same plumbing before a codec can be honoured. + + It is not applied on the client path either, deliberately. Encoding one side + and not the other is worse than encoding neither: an Activity's messages + would reach a consuming Workflow as ciphertext it has no way to decode. + :func:`_reject_configured_codec` is what keeps that from happening quietly. + """ + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies bypass the codec chain, so proceeding would write payloads + this namespace expects to be encrypted in the clear, and would do it + silently. Raising is the only honest answer until the Worker-side plumbing + exists. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it. Publishing would store them " + "unencoded. Use a client without a codec, or wait for codec support " + "on streams." + ) + + +def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns as soon as the Command is issued. There is nothing to await: + the append is applied in the Workflow Task's own commit, so it costs + this Workflow no round trip and no extra transition. + """ + workflow.add_stream_messages( + [_encode(workflow.payload_converter(), value)], topic=self._name + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic( + self, name: str, *, type: type = object + ) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`.""" + self._handle = handle + self._converter = converter + self._batch_interval = batch_interval + self._buffered: list[tuple[str, Any]] = [] + self._flusher: Optional[asyncio.Task[None]] = None + self._wake = asyncio.Event() + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> "WorkflowStreamClient": + """Open the stream owned by ``workflow_id``.""" + _reject_configured_codec(client) + return cls( + _stream_client(client).workflow_stream(workflow_id), + client.data_converter.payload_converter, + batch_interval, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> "WorkflowStreamClient": + """Open the stream owned by the Workflow that scheduled this Activity.""" + client = activity.client() + return cls.create( + client, activity.info().workflow_id, batch_interval=batch_interval + ) + + async def __aenter__(self) -> "WorkflowStreamClient": + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. + """ + if self._flusher is not None: + self._flusher.cancel() + try: + await self._flusher + except asyncio.CancelledError: + pass + self._flusher = None + await self.flush() + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + async for message in self._handle.follow(from_offset=from_offset, topics=topics): + yield WorkflowStreamItem( + topic=message.topic, + data=_decode(self._converter, message.data, result_type), + offset=message.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> "RawPage": + """One read, with the bodies left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) + for m in page.messages + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + # One append per topic, because a batch carries a single topic. The + # harness case is one topic, so this is one append. + by_topic: dict[str, list[bytes]] = {} + for topic, value in pending: + by_topic.setdefault(topic, []).append(_encode(self._converter, value)) + for topic, bodies in by_topic.items(): + await self._handle.append(*bodies, topic=topic) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while True: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + +# One channel per target, shared by every handle in the process. The channel is +# multiplexed and long-lived, and callers here open a client per subscription, +# which would otherwise be a connection per subscription. +_clients: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop too: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _clients.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _clients[key] = existing + return existing diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..33d86d827 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,154 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow( + Emitting.run, 3, id=wf_id, task_queue=task_queue + ) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] From 272c1bd603f01c25c8e3f3a84fc553889b0d766a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:57:03 -0700 Subject: [PATCH 181/831] Added the native provider module. --- temporalio/streams/providers/native.py | 398 +++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 temporalio/streams/providers/native.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..f5570b05a --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,398 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server. A workflow publishes with a command that +the server applies in the same transaction that accepts the workflow task, and +consumes ranges the server attaches to the workflow task it dispatches. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_STATE = "__temporal_streams_state" + + +class _Fanout: + """One server subscription, shared by every reader of that stream. + + The server sends a range once. Whoever reads it first would otherwise take + it from the others, so the pull happens here and the result goes to all + live readers. + """ + + def __init__(self, stream: str) -> None: + self._stream = stream + self._subscribers: list[list[tuple[Cursor, bytes]]] = [] + self._pull: asyncio.Future[None] | None = None + + def attach(self) -> list[tuple[Cursor, bytes]]: + queue: list[tuple[Cursor, bytes]] = [] + self._subscribers.append(queue) + return queue + + def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: + if queue in self._subscribers: + self._subscribers.remove(queue) + + async def next_batch( + self, queue: list[tuple[Cursor, bytes]] + ) -> list[tuple[Cursor, bytes]]: + while not queue: + pending = self._pull + if pending is None: + pending = self._pull = asyncio.ensure_future(self._run_pull()) + # Shielded because one reader going away must not cancel a range + # the server will not send again. + await asyncio.shield(pending) + batch, queue[:] = list(queue), [] + return batch + + async def _run_pull(self) -> None: + try: + delivered = await workflow.read_stream_messages(self._stream) + arrived = [ + (Cursor(str(message.offset)), message.body) for message in delivered + ] + for queue in self._subscribers: + queue.extend(arrived) + finally: + self._pull = None + + +def _fanouts() -> dict[str, _Fanout]: + instance = workflow.instance() + state = getattr(instance, _RUN_STATE, None) + if state is None: + state = {} + setattr(instance, _RUN_STATE, state) + return state + + +class _NativeReadSource: + def __init__(self, fanout: _Fanout) -> None: + self._fanout = fanout + self._queue = fanout.attach() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + return await self._fanout.next_batch(self._queue) + + def close(self) -> None: + self._fanout.detach(self._queue) + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Nothing is awaited. The server applies the payload when it accepts + # the task, so there is no back pressure to wait on and no round trip + # to pay for. The signature is awaitable because the contract allows a + # provider that does hold a publisher back. + workflow.add_stream_messages([frame], stream_id="", topic=self._topic) + + +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The server-side id of a workflow's inbound stream. + + A workflow names its streams relative to itself, so every provider can + address the same thing without workflow code knowing how it is stored. + Here that is a namespace-level stream id built from the pair, and the + workflow id rather than the run id because the stream has to survive + continue-as-new and reset. + """ + return f"{workflow_id}:{stream}" + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies do not pass through the codec chain on this provider, so + proceeding would store in the clear what the namespace expects encrypted, + and would do it without saying so. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it" + ) + + +# Streams this process has already opened, so a second producer for the same +# stream reuses the handle rather than asking the server to create it again. +# The second create is answered correctly, and it is still a failed call the +# server logs, which is noise an operator has to learn to ignore. +_handles: dict[str, Any] = {} + + +# One channel per target and namespace, shared by every handle in the process. +# A channel is multiplexed and long lived, and callers open a handle per +# subscription, which would otherwise be a connection per subscription. +_channels: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _channels.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _channels[key] = existing + return existing + + +class NativeProducer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + handle: Any, + converter: Any, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + self._handle = handle + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _provider_id(self) -> str: + """The identity the provider dedupes on. + + The attempt is part of it. Deduplication answers "is this the same + append again", and a second attempt writing different words at the same + sequence is not. Folding the attempt in keeps a retried append idempotent + without letting a new generation be swallowed as a duplicate of the old + one. + """ + return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = await self._handle.append( + *frames, + topic=self._topic, + producer_id=self._provider_id, + # The provider dedupes a retried append on this pair, which is a + # different job from telling readers that a new generation started. + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._handle.append( + frame, + topic=self._topic, + producer_id=self._provider_id, + sequence=self._sequence - 1, + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class NativeConsumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, handle: Any, converter: Any) -> None: + self._handle = handle + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + attempts = AttemptTracker() + async for message in self._handle.follow( + from_offset=int(start.token) if start.token else 0 + ): + cursor = Cursor(str(message.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + message.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NativeProvider: + name = "native" + + def configure(self, **options: Any) -> None: + """Nothing to name: the streams are on the server the client is + already connected to. It exists so a process that switches providers + changes one call rather than its structure.""" + if options: + raise TypeError( + f"the native provider takes no options, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Accepted and ignored. Delivery arrives on workflow tasks the server + # dispatches, so no worker is held between records and there is nothing + # for an idle timeout to release. + del idle_timeout + stream_id = inbound_stream_id(workflow.info().workflow_id, stream) + fanouts = _fanouts() + fanout = fanouts.get(stream_id) + if fanout is None: + workflow.subscribe_stream( + stream_id, start_offset=int(start.token) if start.token else 0 + ) + fanout = fanouts[stream_id] = _Fanout(stream_id) + return _NativeReadSource(fanout) + + def open_write(self, topic: str) -> WriteSink: + return _NativeWriteSink(topic) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + _reject_configured_codec(client) + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + streams = _stream_client(client) + stream_id = inbound_stream_id(workflow_id, stream) + handle = _handles.get(stream_id) + if handle is None: + try: + handle = await streams.create(stream_id) + except Exception: + # Created by whoever set the stream up. A producer opening a + # stream it does not own is the ordinary case, not the + # exception. + handle = streams.get(stream_id) + _handles[stream_id] = handle + return NativeProducer( + handle, + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> NativeConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. Naming one reads that inbound + stream instead, which is how a second consumer follows the same input. + """ + _reject_configured_codec(client) + streams = _stream_client(client) + if stream: + handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + else: + handle = streams.workflow_stream(workflow_id) + return NativeConsumer(handle, client.data_converter.payload_converter) + + +_provider.register("native", _NativeProvider) From f5edf225d507d5ef9b5ca4aa12a93fcfe5446e16 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 182/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/native.py | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f5570b05a..c0044b9cf 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -255,18 +255,18 @@ def __init__(self, handle: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() async for message in self._handle.follow( - from_offset=int(start.token) if start.token else 0 + from_offset=int(after.token) + 1 if after.token else 0 ): cursor = Cursor(str(message.offset)) try: @@ -290,6 +290,16 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one server-side log per stream, whatever the topic + try: + state = await self._handle.describe() + except Exception: + # A stream nobody has published to does not exist yet, and that + # is the same answer as an empty one. + return BEGINNING + return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -317,7 +327,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Accepted and ignored. Delivery arrives on workflow tasks the server @@ -329,7 +339,7 @@ def open_read( fanout = fanouts.get(stream_id) if fanout is None: workflow.subscribe_stream( - stream_id, start_offset=int(start.token) if start.token else 0 + stream_id, start_offset=int(after.token) + 1 if after.token else 0 ) fanout = fanouts[stream_id] = _Fanout(stream_id) return _NativeReadSource(fanout) @@ -342,15 +352,18 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NativeProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the stream the workflow publishes, which the server lets any + producer append to. Inside an activity, leave ``producer_id`` and + ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ _reject_configured_codec(client) if not producer_id: @@ -358,6 +371,14 @@ async def producer( if not attempt: attempt = activity.info().attempt streams = _stream_client(client) + if not stream: + return NativeProducer( + streams.workflow_stream(workflow_id), + client.data_converter.payload_converter, + topic, + producer_id, + attempt, + ) stream_id = inbound_stream_id(workflow_id, stream) handle = _handles.get(stream_id) if handle is None: From 191715a09ed3ff7ef3ff6869f86552793d4d0e00 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:49:04 -0700 Subject: [PATCH 183/831] Read the delivered message shape the buffer now hands back. The buffer holds a body, topic and offset rather than the wire message, and the cap moved to `workflow_read_stream_messages`. --- tests/worker/test_workflow_stream.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 944761cfa..bb0dcf9ba 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -28,7 +28,7 @@ async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() buffer.extend([message(b"one"), message(b"two")]) - assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert [m.body for m in buffer.take()] == [b"one", b"two"] assert len(buffer) == 0 @@ -41,7 +41,7 @@ async def test_buffer_wakes_a_waiting_reader() -> None: buffer.extend([message(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body.data for m in buffer.take()] == [b"late"] + assert [m.body for m in buffer.take()] == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -64,16 +64,21 @@ async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body.data for m in buffer.take()] == [b"early"] + assert [m.body for m in buffer.take()] == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream``, so a test that reimplements - it proves nothing about the code that ships. + The cap lives inside ``workflow_read_stream_messages``, so a test that + reimplements it proves nothing about the code that ships. Borrowing the + method off the real class is what keeps the test on the shipped path. """ + workflow_read_stream_messages = ( + _WorkflowInstanceImpl.workflow_read_stream_messages + ) + def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} self.read_only_calls: list[str] = [] From 0f532729b9955dcc4197ceb99263c3df3e4d7a4f Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 184/831] Regenerated the protos from the pinned Core. The pinned Core carries the stream additions to the public API, so the command, enum, history and workflow service messages were stale. Only the vendored stream service protos still come from the server checkout. --- temporalio/api/command/v1/__init__.py | 4 + temporalio/api/command/v1/message_pb2.py | 117 +- temporalio/api/command/v1/message_pb2.pyi | 81 ++ temporalio/api/enums/v1/command_type_pb2.py | 6 +- temporalio/api/enums/v1/command_type_pb2.pyi | 4 + temporalio/api/enums/v1/event_type_pb2.py | 6 +- temporalio/api/enums/v1/event_type_pb2.pyi | 20 + temporalio/api/history/v1/__init__.py | 4 + temporalio/api/history/v1/message_pb2.py | 301 +++-- temporalio/api/history/v1/message_pb2.pyi | 122 ++ temporalio/api/stream/v1/__init__.py | 6 +- temporalio/api/stream/v1/message_pb2.py | 103 +- temporalio/api/stream/v1/message_pb2.pyi | 79 +- temporalio/api/streamservice/v1/__init__.py | 16 +- .../api/streamservice/v1/message_pb2.py | 47 +- .../api/streamservice/v1/message_pb2.pyi | 37 +- .../api/streamservice/v1/message_pb2_grpc.py | 20 +- .../streamservice/v1/request_response_pb2.py | 235 ++-- .../streamservice/v1/request_response_pb2.pyi | 333 ++++- .../v1/request_response_pb2_grpc.py | 20 +- .../api/streamservice/v1/service_pb2.py | 31 +- .../api/streamservice/v1/service_pb2.pyi | 8 +- .../api/streamservice/v1/service_pb2_grpc.py | 687 +++++----- .../api/streamservice/v1/stream_state_pb2.py | 62 +- .../api/streamservice/v1/stream_state_pb2.pyi | 113 +- .../streamservice/v1/stream_state_pb2_grpc.py | 20 +- .../v1/request_response_pb2.py | 1125 +++++++++-------- .../v1/request_response_pb2.pyi | 19 + temporalio/bridge/_visitor.py | 28 + .../workflow_activation_pb2.py | 626 +++++---- .../workflow_activation_pb2.pyi | 116 +- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 823 +++++++----- .../workflow_commands_pb2.pyi | 94 +- 34 files changed, 3258 insertions(+), 2059 deletions(-) diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index e0ce8f712..57ad3eb15 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -1,4 +1,5 @@ from .message_pb2 import ( + AddStreamMessagesCommandAttributes, CancelTimerCommandAttributes, CancelWorkflowExecutionCommandAttributes, Command, @@ -16,10 +17,12 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) __all__ = [ + "AddStreamMessagesCommandAttributes", "CancelTimerCommandAttributes", "CancelWorkflowExecutionCommandAttributes", "Command", @@ -37,5 +40,6 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index ad004ae03..cc7cdbb27 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -42,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\x87\x12\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"p\n"AddStreamMessagesCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"\xe0\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12m\n&add_stream_messages_command_attributes\x18\x14 \x01(\x0b\x32;.temporal.api.command.v1.AddStreamMessagesCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -105,6 +108,12 @@ _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ "RequestCancelNexusOperationCommandAttributes" ] +_ADDSTREAMMESSAGESCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "AddStreamMessagesCommandAttributes" +] +_SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeStreamCommandAttributes" +] _COMMAND = DESCRIPTOR.message_types_by_name["Command"] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", @@ -321,6 +330,28 @@ ) _sym_db.RegisterMessage(RequestCancelNexusOperationCommandAttributes) +AddStreamMessagesCommandAttributes = _reflection.GeneratedProtocolMessageType( + "AddStreamMessagesCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGESCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.AddStreamMessagesCommandAttributes) + }, +) +_sym_db.RegisterMessage(AddStreamMessagesCommandAttributes) + +SubscribeStreamCommandAttributes = _reflection.GeneratedProtocolMessageType( + "SubscribeStreamCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAMCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeStreamCommandAttributes) + }, +) +_sym_db.RegisterMessage(SubscribeStreamCommandAttributes) + Command = _reflection.GeneratedProtocolMessageType( "Command", (_message.Message,), @@ -383,44 +414,48 @@ _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_options = ( b"8\001" ) - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 424 - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1118 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1120 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1192 - _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1194 - _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1299 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1301 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1395 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1397 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1488 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1490 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1538 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1540 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1633 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1636 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1819 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1822 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2125 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2127 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2245 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2247 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2343 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2346 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2665 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2585 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2665 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2668 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3608 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3611 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4615 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4617 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4671 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4674 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5157 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5107 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5157 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5159 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5233 - _COMMAND._serialized_start = 5236 - _COMMAND._serialized_end = 7547 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 462 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1156 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1158 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1230 + _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1232 + _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1337 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1339 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1433 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1435 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1526 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1528 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1576 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1578 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1671 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1674 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1857 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1860 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2163 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2165 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2283 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2285 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2381 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2384 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2703 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2623 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2703 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2706 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3646 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3649 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4653 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4655 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4709 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4712 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5195 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5145 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5195 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 + _ADDSTREAMMESSAGESCOMMANDATTRIBUTES._serialized_start = 5273 + _ADDSTREAMMESSAGESCOMMANDATTRIBUTES._serialized_end = 5385 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 5387 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 5462 + _COMMAND._serialized_start = 5465 + _COMMAND._serialized_end = 7993 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 18d0abc8b..87063c178 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -18,6 +18,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1094,6 +1095,62 @@ global___RequestCancelNexusOperationCommandAttributes = ( RequestCancelNexusOperationCommandAttributes ) +class AddStreamMessagesCommandAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the Workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessagesCommandAttributes = AddStreamMessagesCommandAttributes + +class SubscribeStreamCommandAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes + class Command(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -1119,6 +1176,8 @@ class Command(google.protobuf.message.Message): MODIFY_WORKFLOW_PROPERTIES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1209,6 +1268,14 @@ class Command(google.protobuf.message.Message): def request_cancel_nexus_operation_command_attributes( self, ) -> global___RequestCancelNexusOperationCommandAttributes: ... + @property + def add_stream_messages_command_attributes( + self, + ) -> global___AddStreamMessagesCommandAttributes: ... + @property + def subscribe_stream_command_attributes( + self, + ) -> global___SubscribeStreamCommandAttributes: ... def __init__( self, *, @@ -1253,10 +1320,16 @@ class Command(google.protobuf.message.Message): | None = ..., request_cancel_nexus_operation_command_attributes: global___RequestCancelNexusOperationCommandAttributes | None = ..., + add_stream_messages_command_attributes: global___AddStreamMessagesCommandAttributes + | None = ..., + subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages_command_attributes", + b"add_stream_messages_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1291,6 +1364,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1300,6 +1375,8 @@ class Command(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages_command_attributes", + b"add_stream_messages_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1338,6 +1415,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1365,6 +1444,8 @@ class Command(google.protobuf.message.Message): "modify_workflow_properties_command_attributes", "schedule_nexus_operation_command_attributes", "request_cancel_nexus_operation_command_attributes", + "add_stream_messages_command_attributes", + "subscribe_stream_command_attributes", ] | None ): ... diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 6d1c3b6e5..9313ff92a 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x9c\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe5\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12$\n COMMAND_TYPE_ADD_STREAM_MESSAGES\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -39,11 +39,13 @@ COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES = 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION = 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 +COMMAND_TYPE_ADD_STREAM_MESSAGES = 19 +COMMAND_TYPE_SUBSCRIBE_STREAM = 20 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 864 + _COMMANDTYPE._serialized_end = 937 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 9f1bfd240..80ff53ee2 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -44,6 +44,8 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: _CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: _CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 + COMMAND_TYPE_ADD_STREAM_MESSAGES: _CommandType.ValueType # 19 + COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -66,4 +68,6 @@ COMMAND_TYPE_PROTOCOL_MESSAGE: CommandType.ValueType # 14 COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 +COMMAND_TYPE_ADD_STREAM_MESSAGES: CommandType.ValueType # 19 +COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 14ff7984d..a887626de 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\x9e\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -82,11 +82,13 @@ EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58 EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59 EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 +EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED = 62 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 2912 + _EVENTTYPE._serialized_end = 3002 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 16a23b137..dc585288d 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -216,6 +216,16 @@ class _EventTypeEnumTypeWrapper( """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: _EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" + EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: _EventType.ValueType # 61 + """A Workflow subscribed to a stream. Once per subscription, not per + message: consumed offsets ride WorkflowTaskCompleted and payloads never + enter History. + """ + EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED: _EventType.ValueType # 62 + """A Workflow published a batch of messages to a stream. Recorded per + batch, and carrying only the offset range it landed at: the bodies go to + the stream's own log, never into History. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -408,4 +418,14 @@ EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: EventType.ValueType # 59 """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: EventType.ValueType # 61 +"""A Workflow subscribed to a stream. Once per subscription, not per +message: consumed offsets ride WorkflowTaskCompleted and payloads never +enter History. +""" +EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED: EventType.ValueType # 62 +"""A Workflow published a batch of messages to a stream. Recorded per +batch, and carrying only the offset range it landed at: the bodies go to +the stream's own log, never into History. +""" global___EventType = EventType diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index ec7f65962..c7ebb2753 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -57,6 +57,8 @@ WorkflowExecutionUpdateRejectedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, + WorkflowStreamMessagesAddedEventAttributes, + WorkflowStreamSubscribedEventAttributes, WorkflowTaskCompletedEventAttributes, WorkflowTaskFailedEventAttributes, WorkflowTaskScheduledEventAttributes, @@ -123,6 +125,8 @@ "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", + "WorkflowStreamMessagesAddedEventAttributes", + "WorkflowStreamSubscribedEventAttributes", "WorkflowTaskCompletedEventAttributes", "WorkflowTaskFailedEventAttributes", "WorkflowTaskScheduledEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index ac337b708..e0a75ddaa 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -47,6 +47,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -58,7 +61,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\x82\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xca?\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc0\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12<\n\x0estream_cursors\x18\x14 \x03(\x0b\x32$.temporal.api.stream.v1.StreamCursor"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\x96\x01\n*WorkflowStreamMessagesAddedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x15\n\rmessage_count\x18\x04 \x01(\x03"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc3\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12~\n/workflow_stream_messages_added_event_attributes\x18\x43 \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowStreamMessagesAddedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -215,6 +218,12 @@ _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "ActivityPropertiesModifiedExternallyEventAttributes" ] +_WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamMessagesAddedEventAttributes" +] +_WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamSubscribedEventAttributes" +] _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionUpdateAcceptedEventAttributes" ] @@ -819,6 +828,28 @@ ) _sym_db.RegisterMessage(ActivityPropertiesModifiedExternallyEventAttributes) +WorkflowStreamMessagesAddedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamMessagesAddedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamMessagesAddedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamMessagesAddedEventAttributes) + +WorkflowStreamSubscribedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamSubscribedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) + WorkflowExecutionUpdateAcceptedEventAttributes = ( _reflection.GeneratedProtocolMessageType( "WorkflowExecutionUpdateAcceptedEventAttributes", @@ -1210,140 +1241,144 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 663 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3057 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3060 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3196 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3199 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3364 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3367 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3586 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3589 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3717 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3720 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4653 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4656 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4828 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4831 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5247 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5250 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5892 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5895 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6044 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6047 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6438 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6441 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7147 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7150 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7436 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7439 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7671 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7674 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 7960 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 7963 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8161 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8163 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8277 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8280 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8554 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8557 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8704 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8706 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8777 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8780 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 8914 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8917 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9116 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9119 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9254 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9257 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9618 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9538 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9618 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9621 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 9940 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 9943 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10072 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10075 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5992 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5995 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6144 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6147 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6538 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6541 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7247 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7250 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7536 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7539 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7771 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7774 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8060 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8063 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8261 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8263 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8377 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8380 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8654 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8657 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8804 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8806 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8877 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8880 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9014 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9017 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9216 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9219 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9354 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9357 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9718 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9638 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9718 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9721 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10040 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10043 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10172 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10175 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10359 + 10459 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10362 + 10462 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10708 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10711 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 10908 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10911 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11290 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11293 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11632 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11635 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11846 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11849 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12007 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12010 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12148 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12151 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13427 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13430 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13772 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13775 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14070 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14073 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14398 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14401 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14780 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14783 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15108 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15111 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15441 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15444 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15720 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15723 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16453 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16303 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16453 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16456 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16776 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16779 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16923 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 16926 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17146 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17319 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17322 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17593 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17596 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 17760 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 17762 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 17856 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 17858 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 17954 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 17957 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18154 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18157 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 18721 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 18671 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 18721 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 18724 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 18861 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 18864 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19001 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19004 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19140 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19143 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19281 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19284 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19422 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19424 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19540 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19543 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 19694 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 19697 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 19896 - _HISTORYEVENT._serialized_start = 19899 - _HISTORYEVENT._serialized_end = 28037 - _HISTORY._serialized_start = 28039 - _HISTORY._serialized_end = 28103 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10808 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10811 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11008 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11011 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11390 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11393 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11732 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11735 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11946 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11949 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12107 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12110 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12248 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12251 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13527 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13530 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13872 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13875 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14170 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14173 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14498 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14501 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14880 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14883 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15208 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15211 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15541 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15544 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15820 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15823 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16553 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16403 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16553 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16556 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16876 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16879 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17023 + _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES._serialized_start = 17026 + _WORKFLOWSTREAMMESSAGESADDEDEVENTATTRIBUTES._serialized_end = 17176 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17178 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17302 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17305 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17525 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17528 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17698 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17701 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17972 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17975 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18139 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18141 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18235 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18237 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18333 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18336 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18533 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18536 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19100 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19050 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19100 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19103 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19240 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19243 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19380 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19383 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19519 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19522 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19660 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19663 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19801 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19803 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19919 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19922 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20073 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20076 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20275 + _HISTORYEVENT._serialized_start = 20278 + _HISTORYEVENT._serialized_end = 28665 + _HISTORY._serialized_start = 28667 + _HISTORY._serialized_end = 28731 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 783e9d3b6..6c214d184 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -23,6 +23,7 @@ import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1010,6 +1011,7 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): WORKER_DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int WORKER_DEPLOYMENT_NAME_FIELD_NUMBER: builtins.int DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int + STREAM_CURSORS_FIELD_NUMBER: builtins.int scheduled_event_id: builtins.int """The id of the `WORKFLOW_TASK_SCHEDULED` event this task corresponds to""" started_event_id: builtins.int @@ -1069,6 +1071,15 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): """The Worker Deployment Version that completed this task. Must be set if `versioning_behavior` is set. This value updates workflow execution's `versioning_info.deployment_version`. """ + @property + def stream_cursors( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamCursor + ]: + """The offsets this task consumed, without the payloads. Recorded so replay + can reproduce what the task saw, including a range that was empty. + """ def __init__( self, *, @@ -1088,6 +1099,10 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): worker_deployment_name: builtins.str = ..., deployment_version: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentVersion | None = ..., + stream_cursors: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamCursor + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1123,6 +1138,8 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): b"sdk_metadata", "started_event_id", b"started_event_id", + "stream_cursors", + b"stream_cursors", "versioning_behavior", b"versioning_behavior", "worker_deployment_name", @@ -3603,6 +3620,87 @@ global___ActivityPropertiesModifiedExternallyEventAttributes = ( ActivityPropertiesModifiedExternallyEventAttributes ) +class WorkflowStreamMessagesAddedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + MESSAGE_COUNT_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command published this + batch. + """ + stream_id: builtins.str + """Stream the Workflow published to.""" + first_offset: builtins.int + """Offset the first message of the batch landed at.""" + message_count: builtins.int + """How many messages the batch held. With first_offset this names the range + without carrying any of it, which is what keeps this event a fixed size + no matter how large the batch or its payloads are. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + first_offset: builtins.int = ..., + message_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "first_offset", + b"first_offset", + "message_count", + b"message_count", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamMessagesAddedEventAttributes = ( + WorkflowStreamMessagesAddedEventAttributes +) + +class WorkflowStreamSubscribedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Resolved by the server when the subscription is registered, so replay + reads the resolved value rather than resolving it again. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamSubscribedEventAttributes = ( + WorkflowStreamSubscribedEventAttributes +) + class WorkflowExecutionUpdateAcceptedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4460,6 +4558,8 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( builtins.int ) + WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_MESSAGES_ADDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4745,6 +4845,14 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_execution_time_skipping_transitioned_event_attributes( self, ) -> global___WorkflowExecutionTimeSkippingTransitionedEventAttributes: ... + @property + def workflow_stream_subscribed_event_attributes( + self, + ) -> global___WorkflowStreamSubscribedEventAttributes: ... + @property + def workflow_stream_messages_added_event_attributes( + self, + ) -> global___WorkflowStreamMessagesAddedEventAttributes: ... def __init__( self, *, @@ -4882,6 +4990,10 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_execution_time_skipping_transitioned_event_attributes: global___WorkflowExecutionTimeSkippingTransitionedEventAttributes | None = ..., + workflow_stream_subscribed_event_attributes: global___WorkflowStreamSubscribedEventAttributes + | None = ..., + workflow_stream_messages_added_event_attributes: global___WorkflowStreamMessagesAddedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5004,6 +5116,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_messages_added_event_attributes", + b"workflow_stream_messages_added_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5151,6 +5267,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_messages_added_event_attributes", + b"workflow_stream_messages_added_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5227,6 +5347,8 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_paused_event_attributes", "workflow_execution_unpaused_event_attributes", "workflow_execution_time_skipping_transitioned_event_attributes", + "workflow_stream_subscribed_event_attributes", + "workflow_stream_messages_added_event_attributes", ] | None ): ... diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py index f76c1c334..f18ab9d7b 100644 --- a/temporalio/api/stream/v1/__init__.py +++ b/temporalio/api/stream/v1/__init__.py @@ -1,8 +1,4 @@ -from .message_pb2 import ( - StreamCursor, - StreamMessage, - StreamSlice, -) +from .message_pb2 import StreamCursor, StreamMessage, StreamSlice __all__ = [ "StreamCursor", diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py index da1e5bc91..800c48391 100644 --- a/temporalio/api/stream/v1/message_pb2.py +++ b/temporalio/api/stream/v1/message_pb2.py @@ -2,68 +2,85 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/api/stream/v1/message.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto\"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03\"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xfe\x01\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x45\n\x08metadata\x18\x02 \x03(\x0b\x32\x33.temporal.api.stream.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xbb\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x37\n\x08messages\x18\x05 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"I\n\x0cStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' +) - -_STREAMMESSAGE = DESCRIPTOR.message_types_by_name['StreamMessage'] -_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name['MetadataEntry'] -_STREAMSLICE = DESCRIPTOR.message_types_by_name['StreamSlice'] -_STREAMCURSOR = DESCRIPTOR.message_types_by_name['StreamCursor'] -StreamMessage = _reflection.GeneratedProtocolMessageType('StreamMessage', (_message.Message,), { - - 'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), { - 'DESCRIPTOR' : _STREAMMESSAGE_METADATAENTRY, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) - }) - , - 'DESCRIPTOR' : _STREAMMESSAGE, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) - }) +_STREAMMESSAGE = DESCRIPTOR.message_types_by_name["StreamMessage"] +_STREAMMESSAGE_METADATAENTRY = _STREAMMESSAGE.nested_types_by_name["MetadataEntry"] +_STREAMSLICE = DESCRIPTOR.message_types_by_name["StreamSlice"] +_STREAMCURSOR = DESCRIPTOR.message_types_by_name["StreamCursor"] +StreamMessage = _reflection.GeneratedProtocolMessageType( + "StreamMessage", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _STREAMMESSAGE_METADATAENTRY, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage.MetadataEntry) + }, + ), + "DESCRIPTOR": _STREAMMESSAGE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamMessage) + }, +) _sym_db.RegisterMessage(StreamMessage) _sym_db.RegisterMessage(StreamMessage.MetadataEntry) -StreamSlice = _reflection.GeneratedProtocolMessageType('StreamSlice', (_message.Message,), { - 'DESCRIPTOR' : _STREAMSLICE, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) - }) +StreamSlice = _reflection.GeneratedProtocolMessageType( + "StreamSlice", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSLICE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }, +) _sym_db.RegisterMessage(StreamSlice) -StreamCursor = _reflection.GeneratedProtocolMessageType('StreamCursor', (_message.Message,), { - 'DESCRIPTOR' : _STREAMCURSOR, - '__module__' : 'temporalio.api.stream.v1.message_pb2' - # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) - }) +StreamCursor = _reflection.GeneratedProtocolMessageType( + "StreamCursor", + (_message.Message,), + { + "DESCRIPTOR": _STREAMCURSOR, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamCursor) + }, +) _sym_db.RegisterMessage(StreamCursor) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1' - _STREAMMESSAGE_METADATAENTRY._options = None - _STREAMMESSAGE_METADATAENTRY._serialized_options = b'8\001' - _STREAMMESSAGE._serialized_start=103 - _STREAMMESSAGE._serialized_end=357 - _STREAMMESSAGE_METADATAENTRY._serialized_start=277 - _STREAMMESSAGE_METADATAENTRY._serialized_end=357 - _STREAMSLICE._serialized_start=360 - _STREAMSLICE._serialized_end=547 - _STREAMCURSOR._serialized_start=549 - _STREAMCURSOR._serialized_end=622 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1" + _STREAMMESSAGE_METADATAENTRY._options = None + _STREAMMESSAGE_METADATAENTRY._serialized_options = b"8\001" + _STREAMMESSAGE._serialized_start = 103 + _STREAMMESSAGE._serialized_end = 357 + _STREAMMESSAGE_METADATAENTRY._serialized_start = 277 + _STREAMMESSAGE_METADATAENTRY._serialized_end = 357 + _STREAMSLICE._serialized_start = 360 + _STREAMSLICE._serialized_end = 547 + _STREAMCURSOR._serialized_start = 549 + _STREAMCURSOR._serialized_end = 622 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi index c1c796da8..d4f5e6f4f 100644 --- a/temporalio/api/stream/v1/message_pb2.pyi +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -2,12 +2,15 @@ @generated by mypy-protobuf. Do not edit manually! isort:skip_file """ + import builtins import collections.abc +import sys + import google.protobuf.descriptor import google.protobuf.internal.containers import google.protobuf.message -import sys + import temporalio.api.common.v1.message_pb2 if sys.version_info >= (3, 8): @@ -34,8 +37,13 @@ class StreamMessage(google.protobuf.message.Message): key: builtins.str = ..., value: temporalio.api.common.v1.message_pb2.Payload | None = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["value", b"value"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["key", b"key", "value", b"value"]) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... BODY_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int @@ -44,19 +52,40 @@ class StreamMessage(google.protobuf.message.Message): @property def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... @property - def metadata(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, temporalio.api.common.v1.message_pb2.Payload]: ... + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: ... topic: builtins.str topic_sequence: builtins.int def __init__( self, *, body: temporalio.api.common.v1.message_pb2.Payload | None = ..., - metadata: collections.abc.Mapping[builtins.str, temporalio.api.common.v1.message_pb2.Payload] | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., topic: builtins.str = ..., topic_sequence: builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["body", b"body"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["body", b"body", "metadata", b"metadata", "topic", b"topic", "topic_sequence", b"topic_sequence"]) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "metadata", + b"metadata", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... global___StreamMessage = StreamMessage @@ -83,7 +112,11 @@ class StreamSlice(google.protobuf.message.Message): which is a fact replay has to reproduce rather than an absence of one. """ @property - def messages(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___StreamMessage]: ... + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... workflow_task_completed_event_id: builtins.int """The WorkflowTaskCompleted event whose stream_cursors recorded this range. Set only when the server is re-supplying a range for a task being @@ -104,7 +137,23 @@ class StreamSlice(google.protobuf.message.Message): messages: collections.abc.Iterable[global___StreamMessage] | None = ..., workflow_task_completed_event_id: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "messages", b"messages", "run_id", b"run_id", "stream_id", b"stream_id", "to_offset", b"to_offset", "workflow_task_completed_event_id", b"workflow_task_completed_event_id"]) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... global___StreamSlice = StreamSlice @@ -129,6 +178,16 @@ class StreamCursor(google.protobuf.message.Message): from_offset: builtins.int = ..., to_offset: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing_extensions.Literal["from_offset", b"from_offset", "stream_id", b"stream_id", "to_offset", b"to_offset"]) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... global___StreamCursor = StreamCursor diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 31f99bded..52dd65b7c 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -11,15 +11,6 @@ StreamMessageBatch, StreamMessageKind, ) - -from .stream_state_pb2 import ( - ConsumerCursor, - ProducerCursor, - StreamLifecycle, - StreamState, - WorkflowStreamCursor, -) - from .request_response_pb2 import ( AddMessagesInput, AddMessagesOutput, @@ -72,6 +63,13 @@ TruncateStreamRequest, TruncateStreamResponse, ) +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) __all__ = [ "AddMessagesInput", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index b4fe8e68a..9e30bd9a8 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -4,43 +4,54 @@ # source: temporalio/api/stream/v1/message.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/message.proto' + "", + "temporalio/api/stream/v1/message.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + ) -> None: ... + BODY_FIELD_NUMBER: _ClassVar[int] METADATA_FIELD_NUMBER: _ClassVar[int] TOPIC_FIELD_NUMBER: _ClassVar[int] @@ -38,10 +49,20 @@ class StreamMessage(_message.Message): topic_sequence: int kind: StreamMessageKind offset: int - def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., + topic: _Optional[str] = ..., + topic_sequence: _Optional[int] = ..., + kind: _Optional[_Union[StreamMessageKind, str]] = ..., + offset: _Optional[int] = ..., + ) -> None: ... class StreamMessageBatch(_message.Message): __slots__ = ("messages",) MESSAGES_FIELD_NUMBER: _ClassVar[int] messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] - def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... + def __init__( + self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ... + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index b1383816d..6b6c2372a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 60dafee45..7e8dbe3e4 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -4,135 +4,150 @@ # source: temporalio/api/stream/v1/request_response.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/request_response.proto' + "", + "temporalio/api/stream/v1/request_response.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.streamservice.v1 import ( + message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.streamservice.v1 import ( + stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + lifecycle: _Optional[_Union[_stream_state_pb2.StreamLifecycle, _Mapping]] = ..., + ) -> None: ... class CreateStreamOutput(_message.Message): __slots__ = ("run_id",) @@ -26,7 +36,17 @@ class CreateStreamOutput(_message.Message): def __init__(self, run_id: _Optional[str] = ...) -> None: ... class AddMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + __slots__ = ( + "namespace", + "stream_id", + "run_id", + "messages", + "producer_id", + "sequence", + "expected_offset", + "use_expected_offset", + "owner_epoch", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] STREAM_ID_FIELD_NUMBER: _ClassVar[int] RUN_ID_FIELD_NUMBER: _ClassVar[int] @@ -45,7 +65,20 @@ class AddMessagesInput(_message.Message): expected_offset: int use_expected_offset: bool owner_epoch: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + producer_id: _Optional[str] = ..., + sequence: _Optional[int] = ..., + expected_offset: _Optional[int] = ..., + use_expected_offset: bool = ..., + owner_epoch: _Optional[int] = ..., + ) -> None: ... class AddMessagesOutput(_message.Message): __slots__ = ("first_offset", "next_offset", "count", "deduplicated") @@ -57,7 +90,13 @@ class AddMessagesOutput(_message.Message): next_offset: int count: int deduplicated: bool - def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + def __init__( + self, + first_offset: _Optional[int] = ..., + next_offset: _Optional[int] = ..., + count: _Optional[int] = ..., + deduplicated: bool = ..., + ) -> None: ... class FinishWritingInput(_message.Message): __slots__ = ("namespace", "stream_id", "producer_id") @@ -67,7 +106,12 @@ class FinishWritingInput(_message.Message): namespace: str stream_id: str producer_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + producer_id: _Optional[str] = ..., + ) -> None: ... class FinishWritingOutput(_message.Message): __slots__ = () @@ -85,7 +129,14 @@ class SubscribeWorkflowInput(_message.Message): stream_name: str stream_id: str start_offset: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + start_offset: _Optional[int] = ..., + ) -> None: ... class SubscribeWorkflowOutput(_message.Message): __slots__ = ("start_offset",) @@ -94,7 +145,15 @@ class SubscribeWorkflowOutput(_message.Message): def __init__(self, start_offset: _Optional[int] = ...) -> None: ... class PollMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + __slots__ = ( + "namespace", + "stream_id", + "run_id", + "from_offset", + "max_messages", + "topics", + "wait_new_messages", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] STREAM_ID_FIELD_NUMBER: _ClassVar[int] RUN_ID_FIELD_NUMBER: _ClassVar[int] @@ -109,7 +168,16 @@ class PollMessagesInput(_message.Message): max_messages: int topics: _containers.RepeatedScalarFieldContainer[str] wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + from_offset: _Optional[int] = ..., + max_messages: _Optional[int] = ..., + topics: _Optional[_Iterable[str]] = ..., + wait_new_messages: bool = ..., + ) -> None: ... class PollMessagesOutput(_message.Message): __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") @@ -123,7 +191,16 @@ class PollMessagesOutput(_message.Message): head_offset: int closed: bool close_reason: _message_pb2_1.Payload - def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + def __init__( + self, + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + next_offset: _Optional[int] = ..., + head_offset: _Optional[int] = ..., + closed: bool = ..., + close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., + ) -> None: ... class DescribeStreamInput(_message.Message): __slots__ = ("namespace", "stream_id") @@ -131,10 +208,20 @@ class DescribeStreamInput(_message.Message): STREAM_ID_FIELD_NUMBER: _ClassVar[int] namespace: str stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + def __init__( + self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + ) -> None: ... class PollWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + __slots__ = ( + "namespace", + "workflow_id", + "stream_name", + "from_offset", + "max_messages", + "topics", + "wait_new_messages", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] STREAM_NAME_FIELD_NUMBER: _ClassVar[int] @@ -149,7 +236,16 @@ class PollWorkflowMessagesInput(_message.Message): max_messages: int topics: _containers.RepeatedScalarFieldContainer[str] wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + from_offset: _Optional[int] = ..., + max_messages: _Optional[int] = ..., + topics: _Optional[_Iterable[str]] = ..., + wait_new_messages: bool = ..., + ) -> None: ... class DescribeWorkflowStreamInput(_message.Message): __slots__ = ("namespace", "workflow_id", "stream_name") @@ -159,10 +255,22 @@ class DescribeWorkflowStreamInput(_message.Message): namespace: str workflow_id: str stream_name: str - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + ) -> None: ... class AddWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + __slots__ = ( + "namespace", + "workflow_id", + "stream_name", + "messages", + "producer_id", + "sequence", + ) NAMESPACE_FIELD_NUMBER: _ClassVar[int] WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] STREAM_NAME_FIELD_NUMBER: _ClassVar[int] @@ -175,13 +283,25 @@ class AddWorkflowMessagesInput(_message.Message): messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] producer_id: str sequence: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + workflow_id: _Optional[str] = ..., + stream_name: _Optional[str] = ..., + messages: _Optional[ + _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] + ] = ..., + producer_id: _Optional[str] = ..., + sequence: _Optional[int] = ..., + ) -> None: ... class DescribeStreamOutput(_message.Message): __slots__ = ("state",) STATE_FIELD_NUMBER: _ClassVar[int] state: _stream_state_pb2.StreamState - def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + def __init__( + self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ... + ) -> None: ... class CloseStreamInput(_message.Message): __slots__ = ("namespace", "stream_id", "reason") @@ -191,7 +311,12 @@ class CloseStreamInput(_message.Message): namespace: str stream_id: str reason: _message_pb2_1.Payload - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., + ) -> None: ... class CloseStreamOutput(_message.Message): __slots__ = () @@ -205,7 +330,12 @@ class TruncateStreamInput(_message.Message): namespace: str stream_id: str new_base_offset: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + stream_id: _Optional[str] = ..., + new_base_offset: _Optional[int] = ..., + ) -> None: ... class TruncateStreamOutput(_message.Message): __slots__ = () @@ -217,7 +347,9 @@ class DeleteStreamInput(_message.Message): STREAM_ID_FIELD_NUMBER: _ClassVar[int] namespace: str stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + def __init__( + self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + ) -> None: ... class DeleteStreamOutput(_message.Message): __slots__ = () @@ -229,13 +361,19 @@ class CreateStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: CreateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ..., + ) -> None: ... class CreateStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: CreateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ... + ) -> None: ... class AddMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -243,13 +381,19 @@ class AddMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: AddMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ..., + ) -> None: ... class AddMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + ) -> None: ... class FinishWritingRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -257,13 +401,19 @@ class FinishWritingRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: FinishWritingInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ..., + ) -> None: ... class FinishWritingResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: FinishWritingOutput - def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ... + ) -> None: ... class SubscribeWorkflowRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -271,13 +421,20 @@ class SubscribeWorkflowRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: SubscribeWorkflowInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ..., + ) -> None: ... class SubscribeWorkflowResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: SubscribeWorkflowOutput - def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, + frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ..., + ) -> None: ... class PollMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -285,13 +442,19 @@ class PollMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: PollMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ..., + ) -> None: ... class PollMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + ) -> None: ... class DescribeStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -299,13 +462,19 @@ class DescribeStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DescribeStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ..., + ) -> None: ... class DescribeStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + ) -> None: ... class PollWorkflowMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -313,13 +482,19 @@ class PollWorkflowMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: PollWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ..., + ) -> None: ... class PollWorkflowMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + ) -> None: ... class DescribeWorkflowStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -327,13 +502,21 @@ class DescribeWorkflowStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DescribeWorkflowStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[ + _Union[DescribeWorkflowStreamInput, _Mapping] + ] = ..., + ) -> None: ... class DescribeWorkflowStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + ) -> None: ... class AddWorkflowMessagesRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -341,13 +524,19 @@ class AddWorkflowMessagesRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: AddWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ..., + ) -> None: ... class AddWorkflowMessagesResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + ) -> None: ... class CloseStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -355,13 +544,19 @@ class CloseStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: CloseStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ..., + ) -> None: ... class CloseStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: CloseStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ... + ) -> None: ... class TruncateStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -369,13 +564,19 @@ class TruncateStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: TruncateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ..., + ) -> None: ... class TruncateStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: TruncateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ... + ) -> None: ... class ListStreamsInput(_message.Message): __slots__ = ("namespace", "page_size", "next_page_token", "query") @@ -387,7 +588,13 @@ class ListStreamsInput(_message.Message): page_size: int next_page_token: bytes query: str - def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + def __init__( + self, + namespace: _Optional[str] = ..., + page_size: _Optional[int] = ..., + next_page_token: _Optional[bytes] = ..., + query: _Optional[str] = ..., + ) -> None: ... class StreamListEntry(_message.Message): __slots__ = ("stream_id", "run_id") @@ -395,7 +602,9 @@ class StreamListEntry(_message.Message): RUN_ID_FIELD_NUMBER: _ClassVar[int] stream_id: str run_id: str - def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + def __init__( + self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ... + ) -> None: ... class ListStreamsOutput(_message.Message): __slots__ = ("streams", "next_page_token") @@ -403,7 +612,11 @@ class ListStreamsOutput(_message.Message): NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] next_page_token: bytes - def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + def __init__( + self, + streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., + next_page_token: _Optional[bytes] = ..., + ) -> None: ... class ListStreamsRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -411,13 +624,19 @@ class ListStreamsRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: ListStreamsInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ..., + ) -> None: ... class ListStreamsResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: ListStreamsOutput - def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ... + ) -> None: ... class DeleteStreamRequest(_message.Message): __slots__ = ("namespace_id", "frontend_request") @@ -425,10 +644,16 @@ class DeleteStreamRequest(_message.Message): FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] namespace_id: str frontend_request: DeleteStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + def __init__( + self, + namespace_id: _Optional[str] = ..., + frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ..., + ) -> None: ... class DeleteStreamResponse(_message.Message): __slots__ = ("frontend_response",) FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] frontend_response: DeleteStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... + def __init__( + self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ... + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index 87cc91022..c8c70bb79 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index 7f376c28e..d5de1d5f8 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -4,35 +4,46 @@ # source: temporalio/api/stream/v1/service.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/service.proto' + "", + "temporalio/api/stream/v1/service.proto", ) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 - +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/service_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) @@ -35,70 +42,83 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.CreateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True, + ) self.AddMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True, + ) self.FinishWriting = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True, + ) self.SubscribeWorkflow = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True, + ) self.PollMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True, + ) self.DescribeStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True, + ) self.PollWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True, + ) self.DescribeWorkflowStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True, + ) self.AddWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True, + ) self.CloseStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True, + ) self.TruncateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True, + ) self.ListStreams = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True, + ) self.DeleteStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True, + ) class StreamServiceServicer(object): @@ -107,178 +127,182 @@ class StreamServiceServicer(object): def CreateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def FinishWriting(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def SubscribeWorkflow(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollWorkflowMessages(self, request, context): - """Routed on the owner, because the stream it reads has no id of its own. - """ + """Routed on the owner, because the stream it reads has no id of its own.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeWorkflowStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddWorkflowMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def TruncateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def ListStreams(self, request, context): """Served on the frontend only: it queries visibility rather than a stream, so there is no business ID to route on and nothing for a shard to answer. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DeleteStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def add_StreamServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'CreateStream': grpc.unary_unary_rpc_method_handler( - servicer.CreateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, - ), - 'AddMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, - ), - 'FinishWriting': grpc.unary_unary_rpc_method_handler( - servicer.FinishWriting, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, - ), - 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( - servicer.SubscribeWorkflow, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, - ), - 'PollMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, - ), - 'DescribeStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, - ), - 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, - ), - 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeWorkflowStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, - ), - 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, - ), - 'CloseStream': grpc.unary_unary_rpc_method_handler( - servicer.CloseStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, - ), - 'TruncateStream': grpc.unary_unary_rpc_method_handler( - servicer.TruncateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, - ), - 'ListStreams': grpc.unary_unary_rpc_method_handler( - servicer.ListStreams, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, - ), - 'DeleteStream': grpc.unary_unary_rpc_method_handler( - servicer.DeleteStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, - ), + "CreateStream": grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + "AddMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + "FinishWriting": grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + "SubscribeWorkflow": grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + "PollMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + "DescribeStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + "PollWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + "DescribeWorkflowStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + "AddWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + "CloseStream": grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + "TruncateStream": grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + "ListStreams": grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + "DeleteStream": grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_registered_method_handlers( + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) - # This class is part of an EXPERIMENTAL API. +# This class is part of an EXPERIMENTAL API. class StreamService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def CreateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CreateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, options, @@ -289,23 +313,26 @@ def CreateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def AddMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, options, @@ -316,23 +343,26 @@ def AddMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def FinishWriting(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def FinishWriting( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, options, @@ -343,23 +373,26 @@ def FinishWriting(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def SubscribeWorkflow(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def SubscribeWorkflow( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, options, @@ -370,23 +403,26 @@ def SubscribeWorkflow(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def PollMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, options, @@ -397,23 +433,26 @@ def PollMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DescribeStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, options, @@ -424,23 +463,26 @@ def DescribeStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def PollWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, options, @@ -451,23 +493,26 @@ def PollWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DescribeWorkflowStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeWorkflowStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, options, @@ -478,23 +523,26 @@ def DescribeWorkflowStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def AddWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, options, @@ -505,23 +553,26 @@ def AddWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def CloseStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CloseStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, options, @@ -532,23 +583,26 @@ def CloseStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def TruncateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def TruncateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, options, @@ -559,23 +613,26 @@ def TruncateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def ListStreams(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def ListStreams( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, options, @@ -586,23 +643,26 @@ def ListStreams(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) @staticmethod - def DeleteStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DeleteStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, options, @@ -613,4 +673,5 @@ def DeleteStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + _registered_method=True, + ) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 234fa94d0..3fe850a2a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -4,18 +4,20 @@ # source: temporalio/api/stream/v1/stream_state.proto # Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + _runtime_version.ValidateProtobufRuntimeVersion( _runtime_version.Domain.PUBLIC, 6, 31, 1, - '', - 'temporalio/api/stream/v1/stream_state.proto' + "", + "temporalio/api/stream/v1/stream_state.proto", ) # @@protoc_insertion_point(imports) @@ -24,33 +26,43 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[ProducerCursor, _Mapping]] = ..., + ) -> None: ... + class ConsumersEntry(_message.Message): __slots__ = ("key", "value") KEY_FIELD_NUMBER: _ClassVar[int] VALUE_FIELD_NUMBER: _ClassVar[int] key: str value: ConsumerCursor - def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + def __init__( + self, + key: _Optional[str] = ..., + value: _Optional[_Union[ConsumerCursor, _Mapping]] = ..., + ) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] @@ -53,7 +80,24 @@ class StreamState(_message.Message): lifecycle: StreamLifecycle redirect_run_id: str close_time: _timestamp_pb2.Timestamp - def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + def __init__( + self, + head_offset: _Optional[int] = ..., + base_offset: _Optional[int] = ..., + last_txn_id: _Optional[int] = ..., + closed: bool = ..., + close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + owner_epoch: _Optional[int] = ..., + bucket_size: _Optional[int] = ..., + collection_id: _Optional[str] = ..., + producers: _Optional[_Mapping[str, ProducerCursor]] = ..., + consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., + lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., + redirect_run_id: _Optional[str] = ..., + close_time: _Optional[ + _Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping] + ] = ..., + ) -> None: ... class ProducerCursor(_message.Message): __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") @@ -67,7 +111,14 @@ class ProducerCursor(_message.Message): count: int content_hash: bytes fenced: bool - def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + def __init__( + self, + seq: _Optional[int] = ..., + first_offset: _Optional[int] = ..., + count: _Optional[int] = ..., + content_hash: _Optional[bytes] = ..., + fenced: bool = ..., + ) -> None: ... class ConsumerCursor(_message.Message): __slots__ = ("workflow_id", "run_id", "offset", "active", "external") @@ -81,10 +132,27 @@ class ConsumerCursor(_message.Message): offset: int active: bool external: bool - def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + def __init__( + self, + workflow_id: _Optional[str] = ..., + run_id: _Optional[str] = ..., + offset: _Optional[int] = ..., + active: bool = ..., + external: bool = ..., + ) -> None: ... class WorkflowStreamCursor(_message.Message): - __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + __slots__ = ( + "stream_id", + "collection_id", + "bucket_size", + "offset", + "known_head", + "external", + "pending_from", + "pending_to", + "has_pending", + ) STREAM_ID_FIELD_NUMBER: _ClassVar[int] COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] @@ -103,7 +171,18 @@ class WorkflowStreamCursor(_message.Message): pending_from: int pending_to: int has_pending: bool - def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + def __init__( + self, + stream_id: _Optional[str] = ..., + collection_id: _Optional[str] = ..., + bucket_size: _Optional[int] = ..., + offset: _Optional[int] = ..., + known_head: _Optional[int] = ..., + external: bool = ..., + pending_from: _Optional[int] = ..., + pending_to: _Optional[int] = ..., + has_pending: bool = ..., + ) -> None: ... class StreamLifecycle(_message.Message): __slots__ = ("retention", "max_items") @@ -111,4 +190,10 @@ class StreamLifecycle(_message.Message): MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] retention: _duration_pb2.Duration max_items: int - def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... + def __init__( + self, + retention: _Optional[ + _Union[datetime.timedelta, _duration_pb2.Duration, _Mapping] + ] = ..., + max_items: _Optional[int] = ..., + ) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index 4e128a2aa..c241cab40 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,24 +1,28 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc + import warnings +import grpc -GRPC_GENERATED_VERSION = '1.78.0' +GRPC_GENERATED_VERSION = "1.78.0" GRPC_VERSION = grpc.__version__ _version_not_supported = False try: from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) + + _version_not_supported = first_version_is_lower( + GRPC_VERSION, GRPC_GENERATED_VERSION + ) except ImportError: _version_not_supported = True if _version_not_supported: raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + f"The grpc package installed is at version {GRPC_VERSION}," + + " but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on" + + f" grpcio>={GRPC_GENERATED_VERSION}." + + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" + + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." ) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index e1b2e01c4..1ee64fafd 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -114,6 +114,9 @@ from temporalio.api.sdk.v1 import ( worker_config_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_worker__config__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -131,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xbf\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4214,578 +4217,578 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1646 - _REGISTERNAMESPACEREQUEST._serialized_end = 2294 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2251 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2294 - _REGISTERNAMESPACERESPONSE._serialized_start = 2296 - _REGISTERNAMESPACERESPONSE._serialized_end = 2323 - _LISTNAMESPACESREQUEST._serialized_start = 2326 - _LISTNAMESPACESREQUEST._serialized_end = 2463 - _LISTNAMESPACESRESPONSE._serialized_start = 2466 - _LISTNAMESPACESRESPONSE._serialized_end = 2595 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2597 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2680 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2683 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3196 - _UPDATENAMESPACEREQUEST._serialized_start = 3199 - _UPDATENAMESPACEREQUEST._serialized_end = 3534 - _UPDATENAMESPACERESPONSE._serialized_start = 3537 - _UPDATENAMESPACERESPONSE._serialized_end = 3828 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3830 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3900 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3902 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3930 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3933 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5550 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5553 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5851 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5854 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6152 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6155 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6341 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6344 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6520 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6522 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6642 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6645 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7085 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7088 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8175 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8091 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8175 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8178 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9350 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9445 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9447 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9519 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9764 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9767 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10292 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10294 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10329 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10332 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10818 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10821 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12002 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12005 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12170 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12172 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12284 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12287 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12494 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12496 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12612 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12615 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 12997 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 12999 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13037 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13040 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13247 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13249 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13291 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13294 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13740 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13742 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13829 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13832 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14103 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14105 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14196 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14199 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14581 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14583 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14620 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14623 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 14911 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 14913 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 14954 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 14957 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15217 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15219 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15259 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15262 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15612 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15614 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15691 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15694 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17033 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17036 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17194 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17197 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17646 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17648 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17696 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17699 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 17986 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 17988 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18024 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18026 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18148 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18150 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18183 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18186 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18515 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18518 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18648 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18651 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19180 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19182 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19291 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19293 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19419 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19421 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19538 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19541 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19675 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19677 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19786 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19788 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19914 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19916 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19982 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19985 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20222 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20224 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20252 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20255 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20456 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20372 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20456 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20459 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20820 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20822 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20857 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20859 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 20969 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 20971 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21001 - _SHUTDOWNWORKERREQUEST._serialized_start = 21004 - _SHUTDOWNWORKERREQUEST._serialized_end = 21287 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21289 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21313 - _QUERYWORKFLOWREQUEST._serialized_start = 21316 - _QUERYWORKFLOWREQUEST._serialized_end = 21549 - _QUERYWORKFLOWRESPONSE._serialized_start = 21552 - _QUERYWORKFLOWRESPONSE._serialized_end = 21737 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21739 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21854 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21857 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22522 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22525 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23053 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23056 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24060 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23842 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 23958 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 23960 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24060 - _GETCLUSTERINFOREQUEST._serialized_start = 24062 - _GETCLUSTERINFOREQUEST._serialized_end = 24085 - _GETCLUSTERINFORESPONSE._serialized_start = 24088 - _GETCLUSTERINFORESPONSE._serialized_end = 24553 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24498 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24553 - _GETSYSTEMINFOREQUEST._serialized_start = 24555 - _GETSYSTEMINFOREQUEST._serialized_end = 24577 - _GETSYSTEMINFORESPONSE._serialized_start = 24580 - _GETSYSTEMINFORESPONSE._serialized_end = 25157 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24721 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25157 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25159 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25268 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25271 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25494 - _CREATESCHEDULEREQUEST._serialized_start = 25497 - _CREATESCHEDULEREQUEST._serialized_end = 25829 - _CREATESCHEDULERESPONSE._serialized_start = 25831 - _CREATESCHEDULERESPONSE._serialized_end = 25879 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25881 - _DESCRIBESCHEDULEREQUEST._serialized_end = 25946 - _DESCRIBESCHEDULERESPONSE._serialized_start = 25949 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26220 - _UPDATESCHEDULEREQUEST._serialized_start = 26223 - _UPDATESCHEDULEREQUEST._serialized_end = 26515 - _UPDATESCHEDULERESPONSE._serialized_start = 26517 - _UPDATESCHEDULERESPONSE._serialized_end = 26541 - _PATCHSCHEDULEREQUEST._serialized_start = 26544 - _PATCHSCHEDULEREQUEST._serialized_end = 26700 - _PATCHSCHEDULERESPONSE._serialized_start = 26702 - _PATCHSCHEDULERESPONSE._serialized_end = 26725 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26728 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26896 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26898 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 26981 - _DELETESCHEDULEREQUEST._serialized_start = 26983 - _DELETESCHEDULEREQUEST._serialized_end = 27064 - _DELETESCHEDULERESPONSE._serialized_start = 27066 - _DELETESCHEDULERESPONSE._serialized_end = 27090 - _LISTSCHEDULESREQUEST._serialized_start = 27092 - _LISTSCHEDULESREQUEST._serialized_end = 27200 - _LISTSCHEDULESRESPONSE._serialized_start = 27202 - _LISTSCHEDULESRESPONSE._serialized_end = 27314 - _COUNTSCHEDULESREQUEST._serialized_start = 27316 - _COUNTSCHEDULESREQUEST._serialized_end = 27373 - _COUNTSCHEDULESRESPONSE._serialized_start = 27376 - _COUNTSCHEDULESRESPONSE._serialized_end = 27595 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27598 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28244 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28045 + _REGISTERNAMESPACEREQUEST._serialized_start = 1684 + _REGISTERNAMESPACEREQUEST._serialized_end = 2332 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 + _REGISTERNAMESPACERESPONSE._serialized_start = 2334 + _REGISTERNAMESPACERESPONSE._serialized_end = 2361 + _LISTNAMESPACESREQUEST._serialized_start = 2364 + _LISTNAMESPACESREQUEST._serialized_end = 2501 + _LISTNAMESPACESRESPONSE._serialized_start = 2504 + _LISTNAMESPACESRESPONSE._serialized_end = 2633 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 + _UPDATENAMESPACEREQUEST._serialized_start = 3237 + _UPDATENAMESPACEREQUEST._serialized_end = 3572 + _UPDATENAMESPACERESPONSE._serialized_start = 3575 + _UPDATENAMESPACERESPONSE._serialized_end = 3866 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 + _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 + _SHUTDOWNWORKERREQUEST._serialized_start = 21102 + _SHUTDOWNWORKERREQUEST._serialized_end = 21385 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 + _QUERYWORKFLOWREQUEST._serialized_start = 21414 + _QUERYWORKFLOWREQUEST._serialized_end = 21647 + _QUERYWORKFLOWRESPONSE._serialized_start = 21650 + _QUERYWORKFLOWRESPONSE._serialized_end = 21835 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 + _GETCLUSTERINFOREQUEST._serialized_start = 24160 + _GETCLUSTERINFOREQUEST._serialized_end = 24183 + _GETCLUSTERINFORESPONSE._serialized_start = 24186 + _GETCLUSTERINFORESPONSE._serialized_end = 24651 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 + _GETSYSTEMINFOREQUEST._serialized_start = 24653 + _GETSYSTEMINFOREQUEST._serialized_end = 24675 + _GETSYSTEMINFORESPONSE._serialized_start = 24678 + _GETSYSTEMINFORESPONSE._serialized_end = 25255 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 + _CREATESCHEDULEREQUEST._serialized_start = 25595 + _CREATESCHEDULEREQUEST._serialized_end = 25927 + _CREATESCHEDULERESPONSE._serialized_start = 25929 + _CREATESCHEDULERESPONSE._serialized_end = 25977 + _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 + _UPDATESCHEDULEREQUEST._serialized_start = 26321 + _UPDATESCHEDULEREQUEST._serialized_end = 26613 + _UPDATESCHEDULERESPONSE._serialized_start = 26615 + _UPDATESCHEDULERESPONSE._serialized_end = 26639 + _PATCHSCHEDULEREQUEST._serialized_start = 26642 + _PATCHSCHEDULEREQUEST._serialized_end = 26798 + _PATCHSCHEDULERESPONSE._serialized_start = 26800 + _PATCHSCHEDULERESPONSE._serialized_end = 26823 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 + _DELETESCHEDULEREQUEST._serialized_start = 27081 + _DELETESCHEDULEREQUEST._serialized_end = 27162 + _DELETESCHEDULERESPONSE._serialized_start = 27164 + _DELETESCHEDULERESPONSE._serialized_end = 27188 + _LISTSCHEDULESREQUEST._serialized_start = 27190 + _LISTSCHEDULESREQUEST._serialized_end = 27298 + _LISTSCHEDULESRESPONSE._serialized_start = 27300 + _LISTSCHEDULESRESPONSE._serialized_end = 27412 + _COUNTSCHEDULESREQUEST._serialized_start = 27414 + _COUNTSCHEDULESREQUEST._serialized_end = 27471 + _COUNTSCHEDULESRESPONSE._serialized_start = 27474 + _COUNTSCHEDULESRESPONSE._serialized_end = 27693 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28156 + 28254 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28158 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28231 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28246 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28310 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28312 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28407 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28409 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28525 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28528 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30245 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29580 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29693 + 29791 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29696 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29825 + 29923 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29827 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29891 + 29989 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29893 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 29999 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30001 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30111 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30113 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30175 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30177 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30232 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30248 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30500 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30502 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30574 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30577 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30826 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30829 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 30985 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 30987 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31101 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31104 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31365 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31368 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31627 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31630 - _STARTBATCHOPERATIONREQUEST._serialized_end = 32996 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 32998 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33027 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33029 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33125 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33127 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33155 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33157 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33223 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33226 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33698 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33700 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33791 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33793 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 33914 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 33917 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34102 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34105 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34324 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34327 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34743 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34746 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35100 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35103 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35270 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35272 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35307 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35310 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35530 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35532 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35564 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35567 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 35939 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35733 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 35939 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 35942 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36274 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36068 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36274 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36277 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36613 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36616 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 36935 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 36937 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37037 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37039 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37148 - _PAUSEACTIVITYREQUEST._serialized_start = 37151 - _PAUSEACTIVITYREQUEST._serialized_end = 37350 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37353 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37536 - _PAUSEACTIVITYRESPONSE._serialized_start = 37538 - _PAUSEACTIVITYRESPONSE._serialized_end = 37561 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37563 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37595 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37598 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37878 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37881 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38154 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38156 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38181 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38183 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38217 - _RESETACTIVITYREQUEST._serialized_start = 38220 - _RESETACTIVITYREQUEST._serialized_end = 38527 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38530 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38820 - _RESETACTIVITYRESPONSE._serialized_start = 38822 - _RESETACTIVITYRESPONSE._serialized_end = 38845 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38847 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38879 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38882 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39166 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39169 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39346 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39348 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39454 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39456 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39553 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39556 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39750 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39753 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40014 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40407 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40484 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40487 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40627 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40629 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40737 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40739 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40858 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40861 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41066 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41069 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41254 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41257 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41486 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41489 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 41932 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 41935 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42159 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42161 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42274 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42276 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42332 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42334 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42427 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42430 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43101 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42605 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43101 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43104 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43344 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43346 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43385 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43388 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43588 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43590 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43629 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43631 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43724 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43726 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43758 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43761 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44279 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44331 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44334 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44834 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44836 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44890 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44893 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45311 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45226 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 + _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 + _PAUSEACTIVITYREQUEST._serialized_start = 37249 + _PAUSEACTIVITYREQUEST._serialized_end = 37448 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 + _PAUSEACTIVITYRESPONSE._serialized_start = 37636 + _PAUSEACTIVITYRESPONSE._serialized_end = 37659 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 + _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 + _RESETACTIVITYREQUEST._serialized_start = 38318 + _RESETACTIVITYREQUEST._serialized_end = 38625 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 + _RESETACTIVITYRESPONSE._serialized_start = 38920 + _RESETACTIVITYRESPONSE._serialized_end = 38943 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 + _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 + _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45311 + 45409 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45313 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45423 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45426 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45615 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45617 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45716 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45718 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45787 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45789 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45896 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45898 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46011 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46014 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46241 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46244 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46424 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46426 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46521 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46523 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46588 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46590 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46671 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46673 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46736 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46738 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46766 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46768 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46838 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46840 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 46944 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 46947 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47153 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47155 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47201 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47204 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47359 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47361 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47392 - _LISTWORKERSREQUEST._serialized_start = 47395 - _LISTWORKERSREQUEST._serialized_end = 47525 - _LISTWORKERSRESPONSE._serialized_start = 47528 - _LISTWORKERSRESPONSE._serialized_end = 47693 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47696 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48421 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48263 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48354 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 + _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 + _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 + _LISTWORKERSREQUEST._serialized_start = 47493 + _LISTWORKERSREQUEST._serialized_end = 47623 + _LISTWORKERSRESPONSE._serialized_start = 47626 + _LISTWORKERSRESPONSE._serialized_end = 47791 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48356 + 48454 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48421 + 48519 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48423 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48514 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48517 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48675 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48677 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48762 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48765 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49031 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49033 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49133 - _DESCRIBEWORKERREQUEST._serialized_start = 49135 - _DESCRIBEWORKERREQUEST._serialized_end = 49206 - _DESCRIBEWORKERRESPONSE._serialized_start = 49208 - _DESCRIBEWORKERRESPONSE._serialized_end = 49289 - _COUNTWORKERSREQUEST._serialized_start = 49291 - _COUNTWORKERSREQUEST._serialized_end = 49378 - _COUNTWORKERSRESPONSE._serialized_start = 49380 - _COUNTWORKERSRESPONSE._serialized_end = 49417 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49420 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49561 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49563 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49595 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49598 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49741 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49743 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49777 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49780 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 50957 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 50959 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51068 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51071 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51299 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51302 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51618 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51620 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51706 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51708 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51824 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51826 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 51935 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 51938 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52068 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52071 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52870 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 52922 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 52993 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52996 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53166 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53169 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53480 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53483 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53644 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53647 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53908 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 53910 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54025 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54028 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54167 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54169 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54235 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54238 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54475 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54477 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54552 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54801 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54804 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 54953 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 54955 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 54995 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 54998 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55143 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55145 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55181 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55183 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55271 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55273 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55306 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55309 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55465 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55467 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55513 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55516 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55668 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55670 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55712 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55714 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55809 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55811 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55850 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55853 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56010 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56013 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56245 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 + _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 + _DESCRIBEWORKERREQUEST._serialized_start = 49233 + _DESCRIBEWORKERREQUEST._serialized_end = 49304 + _DESCRIBEWORKERRESPONSE._serialized_start = 49306 + _DESCRIBEWORKERRESPONSE._serialized_end = 49387 + _COUNTWORKERSREQUEST._serialized_start = 49389 + _COUNTWORKERSREQUEST._serialized_end = 49476 + _COUNTWORKERSRESPONSE._serialized_start = 49478 + _COUNTWORKERSRESPONSE._serialized_end = 49515 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index eb9243716..7d7c4897f 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -46,6 +46,7 @@ import temporalio.api.schedule.v1.message_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.sdk.v1.worker_config_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.version.v1.message_pb2 @@ -1276,6 +1277,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): MESSAGES_FIELD_NUMBER: builtins.int POLLER_SCALING_DECISION_FIELD_NUMBER: builtins.int POLLER_GROUP_ID_FIELD_NUMBER: builtins.int + STREAM_SLICES_FIELD_NUMBER: builtins.int POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int task_token: builtins.bytes @@ -1366,6 +1368,17 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): Corresponding RespondQueryTaskCompleted should pass this value for proper routing. """ @property + def stream_slices( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ]: + """Slices of the streams this Workflow consumes. A slice with no + workflow_task_completed_event_id is for the task about to run; one with + it set is re-supplying a range an earlier task consumed, so a worker + replaying from History gets the same bytes that task was given. + """ + @property def poller_group_infos( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ @@ -1421,6 +1434,10 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): poller_scaling_decision: temporalio.api.taskqueue.v1.message_pb2.PollerScalingDecision | None = ..., poller_group_id: builtins.str = ..., + stream_slices: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ] + | None = ..., poller_group_infos: collections.abc.Iterable[ temporalio.api.taskqueue.v1.message_pb2.PollerGroupInfo ] @@ -1484,6 +1501,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"started_event_id", "started_time", b"started_time", + "stream_slices", + b"stream_slices", "task_token", b"task_token", "workflow_execution", diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..77d1b6c7a 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamMessage( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +367,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_messages"): + await self._visit_coresdk_workflow_activation_DeliverStreamMessages( + fs, o.deliver_stream_messages + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any @@ -492,6 +510,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AddStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -551,6 +575,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("add_stream_messages"): + await self._visit_coresdk_workflow_commands_AddStreamMessages( + fs, o.add_stream_messages + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0e1b3a1e6..cd09b8b97 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,311 +2,447 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') - - +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] -_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] -_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] -WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }) +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.update.v1 import ( + message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.activity_result import ( + activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' +) + + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ + "HeadersEntry" +] +_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStart" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartSuccess" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartFailure" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartCancelled" +] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecution" +] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveSignalExternalWorkflow" +] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveRequestCancelExternalWorkflow" +] +_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveNexusOperationStart" +] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] +WorkflowActivation = _reflection.GeneratedProtocolMessageType( + "WorkflowActivation", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }, +) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( + "WorkflowActivationJob", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }, +) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) - }) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( + "DeliverStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }, +) _sym_db.RegisterMessage(DeliverStreamMessages) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _INITIALIZEWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }) +InitializeWorkflow = _reflection.GeneratedProtocolMessageType( + "InitializeWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _INITIALIZEWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }, +) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { - 'DESCRIPTOR' : _FIRETIMER, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }) +FireTimer = _reflection.GeneratedProtocolMessageType( + "FireTimer", + (_message.Message,), + { + "DESCRIPTOR": _FIRETIMER, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }, +) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }) +ResolveActivity = _reflection.GeneratedProtocolMessageType( + "ResolveActivity", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEACTIVITY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }, +) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartSuccess", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartFailure", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartCancelled", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERANDOMSEED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( + "UpdateRandomSeed", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERANDOMSEED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }, +) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _QUERYWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }) +QueryWorkflow = _reflection.GeneratedProtocolMessageType( + "QueryWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _QUERYWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }, +) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }) +CancelWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }, +) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }) +SignalWorkflow = _reflection.GeneratedProtocolMessageType( + "SignalWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }, +) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { - 'DESCRIPTOR' : _NOTIFYHASPATCH, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType( + "NotifyHasPatch", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYHASPATCH, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }, +) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveSignalExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveRequestCancelExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }) - , - 'DESCRIPTOR' : _DOUPDATE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }) +DoUpdate = _reflection.GeneratedProtocolMessageType( + "DoUpdate", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }, + ), + "DESCRIPTOR": _DOUPDATE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }, +) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperationStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }, +) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }, +) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEFROMCACHE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }) +RemoveFromCache = _reflection.GeneratedProtocolMessageType( + "RemoveFromCache", + (_message.Message,), + { + "DESCRIPTOR": _REMOVEFROMCACHE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }, +) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' - _WORKFLOWACTIVATION._serialized_start=570 - _WORKFLOWACTIVATION._serialized_end=1116 - _WORKFLOWACTIVATIONJOB._serialized_start=1119 - _WORKFLOWACTIVATIONJOB._serialized_end=2582 - _DELIVERSTREAMMESSAGES._serialized_start=2585 - _DELIVERSTREAMMESSAGES._serialized_end=2724 - _INITIALIZEWORKFLOW._serialized_start=2727 - _INITIALIZEWORKFLOW._serialized_end=4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 - _FIRETIMER._serialized_start=4133 - _FIRETIMER._serialized_end=4157 - _RESOLVEACTIVITY._serialized_start=4159 - _RESOLVEACTIVITY._serialized_end=4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 - _UPDATERANDOMSEED._serialized_start=5045 - _UPDATERANDOMSEED._serialized_end=5088 - _QUERYWORKFLOW._serialized_start=5091 - _QUERYWORKFLOW._serialized_end=5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 - _CANCELWORKFLOW._serialized_start=5353 - _CANCELWORKFLOW._serialized_end=5385 - _SIGNALWORKFLOW._serialized_start=5388 - _SIGNALWORKFLOW._serialized_end=5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 - _NOTIFYHASPATCH._serialized_start=5679 - _NOTIFYHASPATCH._serialized_end=5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 - _DOUPDATE._serialized_start=5917 - _DOUPDATE._serialized_end=6248 - _DOUPDATE_HEADERSENTRY._serialized_start=4052 - _DOUPDATE_HEADERSENTRY._serialized_end=4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 - _RESOLVENEXUSOPERATION._serialized_start=6407 - _RESOLVENEXUSOPERATION._serialized_end=6496 - _REMOVEFROMCACHE._serialized_start=6499 - _REMOVEFROMCACHE._serialized_end=6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" + ) + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" + _WORKFLOWACTIVATION._serialized_start = 570 + _WORKFLOWACTIVATION._serialized_end = 1116 + _WORKFLOWACTIVATIONJOB._serialized_start = 1119 + _WORKFLOWACTIVATIONJOB._serialized_end = 2582 + _DELIVERSTREAMMESSAGES._serialized_start = 2585 + _DELIVERSTREAMMESSAGES._serialized_end = 2724 + _INITIALIZEWORKFLOW._serialized_start = 2727 + _INITIALIZEWORKFLOW._serialized_end = 4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _FIRETIMER._serialized_start = 4133 + _FIRETIMER._serialized_end = 4157 + _RESOLVEACTIVITY._serialized_start = 4159 + _RESOLVEACTIVITY._serialized_end = 4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 + _UPDATERANDOMSEED._serialized_start = 5045 + _UPDATERANDOMSEED._serialized_end = 5088 + _QUERYWORKFLOW._serialized_start = 5091 + _QUERYWORKFLOW._serialized_end = 5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _CANCELWORKFLOW._serialized_start = 5353 + _CANCELWORKFLOW._serialized_end = 5385 + _SIGNALWORKFLOW._serialized_start = 5388 + _SIGNALWORKFLOW._serialized_end = 5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _NOTIFYHASPATCH._serialized_start = 5679 + _NOTIFYHASPATCH._serialized_end = 5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 + _DOUPDATE._serialized_start = 5917 + _DOUPDATE._serialized_end = 6248 + _DOUPDATE_HEADERSENTRY._serialized_start = 4052 + _DOUPDATE_HEADERSENTRY._serialized_end = 4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 + _RESOLVENEXUSOPERATION._serialized_start = 6407 + _RESOLVENEXUSOPERATION._serialized_end = 6496 + _REMOVEFROMCACHE._serialized_start = 6499 + _REMOVEFROMCACHE._serialized_end = 6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index eab815fc9..5245cd6fc 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,9 +19,9 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -439,6 +439,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" @@ -1451,63 +1508,6 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation -class DeliverStreamMessages(google.protobuf.message.Message): - """Hand a workflow the next range of a stream it subscribed to. - - The range is delivered once, on the task the server decided it belongs to, - and the offsets it covered are recorded in History rather than the payloads. - On replay the server re-supplies the same range by reading the stream again, - so this job appears at the same point with the same contents both times. - - An empty range is still delivered: a task where the subscription saw nothing - is a fact replay has to reproduce, not an absence of one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - FROM_OFFSET_FIELD_NUMBER: builtins.int - TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Id of the stream this range came from.""" - from_offset: builtins.int - """Inclusive.""" - to_offset: builtins.int - """Exclusive. Equal to from_offset when the subscription saw nothing.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - from_offset: builtins.int = ..., - to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "from_offset", - b"from_offset", - "messages", - b"messages", - "stream_id", - b"stream_id", - "to_offset", - b"to_offset", - ], - ) -> None: ... - -global___DeliverStreamMessages = DeliverStreamMessages - class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..44826f2da 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AddStreamMessages, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -21,6 +22,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -28,6 +30,7 @@ __all__ = [ "ActivityCancellationType", + "AddStreamMessages", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -49,6 +52,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index ccfa1a016..3374f951a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,408 +2,583 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.sdk.v1 import ( + event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, +) +from temporalio.api.sdk.v1 import ( + user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' +) + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] -_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] -_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] -_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] -WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWCOMMAND, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] +_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] +_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ + "HeadersEntry" +] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ + "RequestCancelLocalActivity" +] +_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CompleteWorkflowExecution" +] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ContinueAsNewWorkflowExecution" +] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "StartChildWorkflowExecution" +] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CancelChildWorkflowExecution" +] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "RequestCancelExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "SignalExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( + _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UpsertWorkflowSearchAttributes" +] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ + "NexusHeaderEntry" +] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ + "RequestCancelNexusOperation" +] +WorkflowCommand = _reflection.GeneratedProtocolMessageType( + "WorkflowCommand", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWCOMMAND, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }, +) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _ADDSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) - }) +AddStreamMessages = _reflection.GeneratedProtocolMessageType( + "AddStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }, +) _sym_db.RegisterMessage(AddStreamMessages) -SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { - 'DESCRIPTOR' : _SUBSCRIBESTREAM, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) - }) +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) _sym_db.RegisterMessage(SubscribeStream) -StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { - 'DESCRIPTOR' : _STARTTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }) +StartTimer = _reflection.GeneratedProtocolMessageType( + "StartTimer", + (_message.Message,), + { + "DESCRIPTOR": _STARTTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }, +) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { - 'DESCRIPTOR' : _CANCELTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }) +CancelTimer = _reflection.GeneratedProtocolMessageType( + "CancelTimer", + (_message.Message,), + { + "DESCRIPTOR": _CANCELTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }, +) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }) +ScheduleActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULEACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }, +) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleLocalActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULELOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }, +) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }, +) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelLocalActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }, +) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }) +QueryResult = _reflection.GeneratedProtocolMessageType( + "QueryResult", + (_message.Message,), + { + "DESCRIPTOR": _QUERYRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }, +) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { - 'DESCRIPTOR' : _QUERYSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }) +QuerySuccess = _reflection.GeneratedProtocolMessageType( + "QuerySuccess", + (_message.Message,), + { + "DESCRIPTOR": _QUERYSUCCESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }, +) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CompleteWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }, +) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "FailWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _FAILWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }, +) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }) - , - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ContinueAsNewWorkflowExecution", + (_message.Message,), + { + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }, + ), + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }, +) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { - 'DESCRIPTOR' : _SETPATCHMARKER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }) +SetPatchMarker = _reflection.GeneratedProtocolMessageType( + "SetPatchMarker", + (_message.Message,), + { + "DESCRIPTOR": _SETPATCHMARKER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }, +) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }) - , - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }) - , - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "StartChildWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }, + ), + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }, + ), + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "RequestCancelExternalWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "SignalExternalWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelSignalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELSIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }, +) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { - 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( + "UpsertWorkflowSearchAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }, +) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { - 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( + "ModifyWorkflowProperties", + (_message.Message,), + { + "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }, +) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERESPONSE, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }) +UpdateResponse = _reflection.GeneratedProtocolMessageType( + "UpdateResponse", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERESPONSE, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }, +) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { - - 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( + "ScheduleNexusOperation", + (_message.Message,), + { + "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( + "NexusHeaderEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }, + ), + "DESCRIPTOR": _SCHEDULENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }, +) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( + "RequestCancelNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }, +) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' - _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 - _WORKFLOWCOMMAND._serialized_start=556 - _WORKFLOWCOMMAND._serialized_end=2794 - _ADDSTREAMMESSAGES._serialized_start=2796 - _ADDSTREAMMESSAGES._serialized_end=2891 - _SUBSCRIBESTREAM._serialized_start=2893 - _SUBSCRIBESTREAM._serialized_end=2951 - _STARTTIMER._serialized_start=2953 - _STARTTIMER._serialized_end=3036 - _CANCELTIMER._serialized_start=3038 - _CANCELTIMER._serialized_end=3064 - _SCHEDULEACTIVITY._serialized_start=3067 - _SCHEDULEACTIVITY._serialized_end=3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 - _SCHEDULELOCALACTIVITY._serialized_start=3894 - _SCHEDULELOCALACTIVITY._serialized_end=4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 - _REQUESTCANCELACTIVITY._serialized_start=4646 - _REQUESTCANCELACTIVITY._serialized_end=4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 - _QUERYRESULT._serialized_start=4728 - _QUERYRESULT._serialized_end=4884 - _QUERYSUCCESS._serialized_start=4886 - _QUERYSUCCESS._serialized_end=4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 - _FAILWORKFLOWEXECUTION._serialized_start=5031 - _FAILWORKFLOWEXECUTION._serialized_end=5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELWORKFLOWEXECUTION._serialized_start=6024 - _CANCELWORKFLOWEXECUTION._serialized_end=6100 - _SETPATCHMARKER._serialized_start=6102 - _SETPATCHMARKER._serialized_end=6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELSIGNALWORKFLOW._serialized_start=7958 - _CANCELSIGNALWORKFLOW._serialized_end=7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 - _UPDATERESPONSE._serialized_start=8180 - _UPDATERESPONSE._serialized_end=8390 - _SCHEDULENEXUSOPERATION._serialized_start=8393 - _SCHEDULENEXUSOPERATION._serialized_end=8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" + ) + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2794 + _ADDSTREAMMESSAGES._serialized_start = 2796 + _ADDSTREAMMESSAGES._serialized_end = 2891 + _SUBSCRIBESTREAM._serialized_start = 2893 + _SUBSCRIBESTREAM._serialized_end = 2951 + _STARTTIMER._serialized_start = 2953 + _STARTTIMER._serialized_end = 3036 + _CANCELTIMER._serialized_start = 3038 + _CANCELTIMER._serialized_end = 3064 + _SCHEDULEACTIVITY._serialized_start = 3067 + _SCHEDULEACTIVITY._serialized_end = 3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 + _SCHEDULELOCALACTIVITY._serialized_start = 3894 + _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 + _REQUESTCANCELACTIVITY._serialized_start = 4646 + _REQUESTCANCELACTIVITY._serialized_end = 4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 + _QUERYRESULT._serialized_start = 4728 + _QUERYRESULT._serialized_end = 4884 + _QUERYSUCCESS._serialized_start = 4886 + _QUERYSUCCESS._serialized_end = 4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 + _FAILWORKFLOWEXECUTION._serialized_start = 5031 + _FAILWORKFLOWEXECUTION._serialized_end = 5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELWORKFLOWEXECUTION._serialized_start = 6024 + _CANCELWORKFLOWEXECUTION._serialized_end = 6100 + _SETPATCHMARKER._serialized_start = 6102 + _SETPATCHMARKER._serialized_end = 6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELSIGNALWORKFLOW._serialized_start = 7958 + _CANCELSIGNALWORKFLOW._serialized_end = 7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 + _UPDATERESPONSE._serialized_start = 8180 + _UPDATERESPONSE._serialized_end = 8390 + _SCHEDULENEXUSOPERATION._serialized_start = 8393 + _SCHEDULENEXUSOPERATION._serialized_end = 8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 040a2267c..bcf1bf7eb 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,9 +23,9 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -228,6 +228,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -252,10 +254,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -272,6 +270,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -285,6 +285,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -311,10 +313,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -331,6 +329,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -375,38 +375,14 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class StartTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... - def __init__( - self, - *, - seq: builtins.int = ..., - start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> None: ... - -global___StartTimer = StartTimer - class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -444,14 +420,6 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int @@ -476,6 +444,36 @@ class SubscribeStream(google.protobuf.message.Message): global___SubscribeStream = SubscribeStream +class StartTimer(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int + seq: builtins.int + """Lang's incremental sequence number, used as the operation identifier""" + @property + def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + seq: builtins.int = ..., + start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> None: ... + +global___StartTimer = StartTimer + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor From 4e2d09a58ca55338d131b10ab6f8db152574c042 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 185/831] Sorted and formatted the server-side stream modules. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and `check-protos` reformats what it regenerates. --- scripts/gen_stream_protos.py | 29 +++++++++++++++---- temporalio/client_stream.py | 14 +++++---- temporalio/contrib/server_streams/__init__.py | 12 ++++---- temporalio/streams/providers/native.py | 14 +++++++-- temporalio/workflow/__init__.py | 10 +++---- tests/contrib/test_server_streams.py | 16 ++++++---- tests/worker/test_workflow_stream.py | 4 +-- tests/worker/test_workflow_stream_e2e.py | 6 ++-- 8 files changed, 70 insertions(+), 35 deletions(-) diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index e66f8abb4..f57ff6177 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -34,7 +34,13 @@ # the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` # checkout instead when the submodule is not initialized. UPSTREAM_API = ( - BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + BASE + / "temporalio" + / "bridge" + / "sdk-core" + / "crates" + / "protos" + / "protos" / "api_upstream" ) @@ -43,16 +49,24 @@ def api_proto_path() -> Path: override = os.environ.get("TEMPORAL_API_PROTOS") if override: return Path(override).resolve() - if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + if ( + UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto" + ).is_file(): return UPSTREAM_API raise SystemExit( "no api protos found: initialize the sdk-core submodule or set " "TEMPORAL_API_PROTOS to a temporalio/api checkout" ) + SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") -FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] +FILES = [ + "message.proto", + "stream_state.proto", + "request_response.proto", + "service.proto", +] # Server-only options. They carry shard routing and rate-limit category, which # a client neither reads nor can resolve, since the files defining them are not @@ -63,7 +77,10 @@ def api_proto_path() -> Path: # protoc names a python module after the proto path. These put the generated # modules where this package publishes them. FIX_PY = [ - (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + ( + re.compile(r"from temporalio\.api\.stream\.v1 import"), + "from temporalio.api.streamservice.v1 import", + ), (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), (re.compile(r"from temporal\.api\."), "from temporalio.api."), (re.compile(r"import temporal\.api\."), "import temporalio.api."), @@ -96,7 +113,9 @@ def main() -> None: out.mkdir() subprocess.run( [ - sys.executable, "-m", "grpc_tools.protoc", + sys.executable, + "-m", + "grpc_tools.protoc", f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 75388c9c9..1b5d953bd 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -242,9 +242,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, @@ -401,9 +402,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index e831d763c..b6db1fd7a 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -169,9 +169,7 @@ def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... @overload def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... - def topic( - self, name: str, *, type: type = object - ) -> WorkflowTopicHandle[Any]: + def topic(self, name: str, *, type: type = object) -> WorkflowTopicHandle[Any]: """Bind a topic on this Workflow's stream.""" return WorkflowTopicHandle(name, type) @@ -179,7 +177,9 @@ def topic( class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" - def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + def __init__( + self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client self._name = topic @@ -316,7 +316,9 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown - async for message in self._handle.follow(from_offset=from_offset, topics=topics): + async for message in self._handle.follow( + from_offset=from_offset, topics=topics + ): yield WorkflowStreamItem( topic=message.topic, data=_decode(self._converter, message.data, result_type), diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index c0044b9cf..1243d3784 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -193,7 +193,11 @@ def _provider_id(self) -> str: without letting a new generation be swallowed as a duplicate of the old one. """ - return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) async def append(self, *values: Any) -> Cursor: """Append values and return where the first one landed.""" @@ -240,7 +244,9 @@ async def finish(self) -> None: def _encode(self, value: Any) -> bytes: payload = ( - value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] ) return payload.SerializeToString() @@ -298,7 +304,9 @@ async def latest(self, *, topic: str | None = None) -> Cursor: # A stream nobody has published to does not exist yet, and that # is the same answer as an empty one. return BEGINNING - return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + return ( + Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + ) def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 9189b0db6..17b81aeb3 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,6 +58,7 @@ wait, ) from ._context import ( + DeliveredStreamMessage, Info, ParentInfo, RootInfo, @@ -65,6 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, + add_stream_messages, cancellation_reason, current_update_info, deprecate_patch, @@ -86,20 +88,18 @@ payload_converter, random, random_seed, + read_stream, + read_stream_messages, register_random_seed_callback, set_current_details, sleep, + subscribe_stream, time, time_ns, upsert_memo, upsert_search_attributes, uuid4, uuid7, - DeliveredStreamMessage, - read_stream, - read_stream_messages, - add_stream_messages, - subscribe_stream, wait_condition, ) from ._definition import ( diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 33d86d827..e1fe84c77 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -103,7 +103,9 @@ async def read() -> None: # The Workflow's own publishes bracket the Activity's, and both are on one # log in the order the server took them. - assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + [ + "workflow" + ] assert seen[0].text == "turn started" assert seen[-1].text == "turn ended" assert offsets == list(range(tokens + 2)) @@ -115,7 +117,9 @@ async def read() -> None: assert await late.get_offset() == tokens + 2 replayed = [ item.data.text - async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in late.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert replayed == [e.text for e in seen] @@ -132,14 +136,14 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: activities=[emit_from_activity], max_cached_workflows=0, ): - await client.execute_workflow( - Emitting.run, 3, id=wf_id, task_queue=task_queue - ) + await client.execute_workflow(Emitting.run, 3, id=wf_id, task_queue=task_queue) stream = WorkflowStreamClient.create(client, wf_id) first = [ item - async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert len(first) == 5 diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index bb0dcf9ba..40d6fdf45 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -75,9 +75,7 @@ class _ReadOnlyStub: method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = ( - _WorkflowInstanceImpl.workflow_read_stream_messages - ) + workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 579327217..00d0dfa85 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,9 +17,9 @@ import uuid import pytest -from temporalio.api.enums.v1 import EventType from temporalio import workflow +from temporalio.api.enums.v1 import EventType from temporalio.client import Client from temporalio.worker import Worker @@ -239,6 +239,8 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: async for event in client.get_workflow_handle(wf_id).fetch_history_events(): if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: completed += 1 - assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + assert completed >= 3, ( + f"only {completed} workflow tasks, sticky path not exercised" + ) finally: await streams.close() From f028bf59a60643131841b4f136d6ebf18a716f28 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:30 -0700 Subject: [PATCH 186/831] Made the server-side stream modules pass the type and doc linters. A Standalone Activity has no `workflow_id`, so opening its Workflow's stream now says that rather than sending `None` on the wire. `Optional` and `typing.Sequence` are deprecated spellings the linter rejects. --- temporalio/client_stream.py | 7 +++-- temporalio/contrib/server_streams/__init__.py | 29 +++++++++++-------- temporalio/streams/providers/native.py | 12 ++++++-- tests/test_client_stream.py | 2 +- tests/worker/test_workflow_stream.py | 13 +++++++-- tests/worker/test_workflow_stream_e2e.py | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1b5d953bd..8280b56d4 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,8 +23,9 @@ from __future__ import annotations +from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass -from typing import Any, AsyncIterator, Optional, Sequence +from typing import Any import google.protobuf.duration_pb2 @@ -102,8 +103,8 @@ async def create( self, stream_id: str, *, - retention: Optional[float] = None, - max_items: Optional[int] = None, + retention: float | None = None, + max_items: int | None = None, ) -> "StreamHandle": """Create a stream and return a handle to it. diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index b6db1fd7a..c15184bf4 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -20,16 +20,17 @@ from __future__ import annotations import asyncio +import builtins from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from datetime import timedelta -from typing import Any, Generic, Optional, TypeVar, overload +from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient, WorkflowStreamHandle -from temporalio.converter import DataConverter, PayloadConverter +from temporalio.converter import PayloadConverter __all__ = [ "RawPage", @@ -109,7 +110,7 @@ def _reject_configured_codec(client: Client) -> None: ) -def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: +def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) if as_type is None: @@ -210,8 +211,9 @@ def subscribe( self, *, from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + # Spelled out because `type` in this class body is the property below. + result_type: builtins.type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[T]]: """Read this topic from ``from_offset`` onwards.""" return self._client.subscribe( @@ -236,7 +238,7 @@ def __init__( self._converter = converter self._batch_interval = batch_interval self._buffered: list[tuple[str, Any]] = [] - self._flusher: Optional[asyncio.Task[None]] = None + self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() @classmethod @@ -260,10 +262,13 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - client = activity.client() - return cls.create( - client, activity.info().workflow_id, batch_interval=batch_interval - ) + workflow_id = activity.info().workflow_id + if workflow_id is None: + raise RuntimeError( + "no Workflow stream to open: this Activity was not started by a " + "Workflow" + ) + return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -307,8 +312,8 @@ async def subscribe( *, topics: Sequence[str] = (), from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + result_type: type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[Any]]: """Yield items from ``from_offset`` as they arrive. diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 1243d3784..53d231174 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -171,6 +171,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle self._converter = converter self._topic = topic @@ -255,6 +256,7 @@ class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, handle: Any, converter: Any) -> None: + """Read the stream ``handle`` names, from anywhere.""" self._handle = handle self._converter = converter @@ -297,6 +299,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() @@ -320,9 +323,12 @@ class _NativeProvider: name = "native" def configure(self, **options: Any) -> None: - """Nothing to name: the streams are on the server the client is - already connected to. It exists so a process that switches providers - changes one call rather than its structure.""" + """Take no options. + + The streams are on the server the client is already connected to. + This exists so a process that switches providers changes one call + rather than its structure. + """ if options: raise TypeError( f"the native provider takes no options, got {sorted(options)}" diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index f7df3c7a7..8d1a42f30 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -14,7 +14,7 @@ import asyncio import os import uuid -from typing import AsyncIterator +from collections.abc import AsyncIterator import pytest diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 40d6fdf45..1d154b37c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -9,6 +9,7 @@ from __future__ import annotations import asyncio +from typing import Any import pytest @@ -84,6 +85,12 @@ def __init__(self) -> None: def _assert_not_read_only(self, action: str) -> None: self.read_only_calls.append(action) + async def read(self, stream: str, max_messages: int) -> list[bytes]: + instance: Any = self + return await _WorkflowInstanceImpl.workflow_read_stream( + instance, stream, max_messages + ) + @pytest.mark.parametrize("max_messages", [1, 2, 5]) async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: @@ -92,14 +99,14 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b) for b in bodies]) - got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + got = await stub.read("s", max_messages) assert got == bodies[:max_messages] # Whatever the cap left behind has to still be there: nothing resends it. assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) if len(stub._stream_buffers["s"]): - rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + rest = await stub.read("s", 0) assert got + rest == bodies else: assert got == bodies @@ -112,5 +119,5 @@ async def test_read_is_refused_in_a_read_only_context() -> None: stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + await stub.read("s", 0) assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 00d0dfa85..3ee38fef3 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -104,7 +104,7 @@ def __init__(self) -> None: async def run(self) -> int: published = 0 while True: - await workflow.wait_condition(lambda: self._pending or self._done) + await workflow.wait_condition(lambda: bool(self._pending) or self._done) while self._pending: workflow.add_stream_messages([self._pending.pop(0).encode()]) published += 1 From cf662c62895f584e91c184ba7b00c0dd330bc3e7 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:38 -0700 Subject: [PATCH 187/831] Added the changelog entry for server-side streams. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 568f64b4b..470300e50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,13 @@ to include examples, links to docs, or any other relevant information. can read, decide on, and write, with a registry that picks the provider when the worker is built. `temporalio.streams.providers.memory` is the in-memory reference provider the conformance tests run against. +- **Experimental**: server-side streams. A workflow reads a stream the server + delivers on its Workflow Tasks and publishes with a command, through + `temporalio.workflow.read_stream`, `subscribe_stream` and + `add_stream_messages`. `temporalio.client_stream` and + `temporalio.contrib.server_streams` reach the same stream from outside a + workflow, and `temporalio.streams.providers.native` puts it behind the shared + stream interface. Requires a server that serves the stream service. ### Changed From da726a50bbeaba717c3747daa485aa9beccc91d1 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:45:15 -0700 Subject: [PATCH 188/831] Regenerated the vendored stream protos for protobuf 3. This package has to load on a protobuf 3 runtime, and generated code refuses to load on a runtime older than the one it was built against. The protoc of that generation has no `--pyi_out`, so the stubs come from `mypy-protobuf`, which is what the other generated protos already use. --- scripts/gen_stream_protos.py | 7 +- temporalio/api/streamservice/v1/__init__.py | 16 + .../api/streamservice/v1/message_pb2.py | 90 +- .../api/streamservice/v1/message_pb2.pyi | 216 +- .../api/streamservice/v1/message_pb2_grpc.py | 24 - .../api/streamservice/v1/message_pb2_grpc.pyi | 4 + .../streamservice/v1/request_response_pb2.py | 972 +++++++- .../streamservice/v1/request_response_pb2.pyi | 2198 +++++++++++++---- .../v1/request_response_pb2_grpc.py | 24 - .../v1/request_response_pb2_grpc.pyi | 4 + .../api/streamservice/v1/service_pb2.py | 37 +- .../api/streamservice/v1/service_pb2.pyi | 13 +- .../api/streamservice/v1/service_pb2_grpc.py | 146 +- .../api/streamservice/v1/service_pb2_grpc.pyi | 195 ++ .../api/streamservice/v1/stream_state_pb2.py | 146 +- .../api/streamservice/v1/stream_state_pb2.pyi | 556 +++-- .../streamservice/v1/stream_state_pb2_grpc.py | 24 - .../v1/stream_state_pb2_grpc.pyi | 4 + temporalio/client_stream.py | 4 +- 19 files changed, 3550 insertions(+), 1130 deletions(-) create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index f57ff6177..6b6487294 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -9,7 +9,9 @@ Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf runtime this package has to load on. Generated code refuses to load on a runtime older than the one it was built against, and these modules end up in -applications that pin protobuf themselves. +applications that pin protobuf themselves. The stubs come from +``mypy-protobuf`` rather than protoc's own ``--pyi_out``, which that +generation of protoc does not have. Two rewrites make the copies compile against this SDK. The server's own routing and API-category options are dropped, because they mean nothing to a @@ -119,8 +121,9 @@ def main() -> None: f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", - f"--pyi_out={out}", f"--grpc_python_out={out}", + f"--mypy_out={out}", + f"--mypy_grpc_out={out}", *targets, ], check=True, diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 52dd65b7c..ce6edf894 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -19,6 +19,10 @@ AddWorkflowMessagesInput, AddWorkflowMessagesRequest, AddWorkflowMessagesResponse, + AdvanceConsumerHeadInput, + AdvanceConsumerHeadOutput, + AdvanceConsumerHeadRequest, + AdvanceConsumerHeadResponse, CloseStreamInput, CloseStreamOutput, CloseStreamRequest, @@ -53,6 +57,10 @@ PollWorkflowMessagesInput, PollWorkflowMessagesRequest, PollWorkflowMessagesResponse, + RegisterStreamConsumerInput, + RegisterStreamConsumerOutput, + RegisterStreamConsumerRequest, + RegisterStreamConsumerResponse, StreamListEntry, SubscribeWorkflowInput, SubscribeWorkflowOutput, @@ -79,6 +87,10 @@ "AddWorkflowMessagesInput", "AddWorkflowMessagesRequest", "AddWorkflowMessagesResponse", + "AdvanceConsumerHeadInput", + "AdvanceConsumerHeadOutput", + "AdvanceConsumerHeadRequest", + "AdvanceConsumerHeadResponse", "CloseStreamInput", "CloseStreamOutput", "CloseStreamRequest", @@ -115,6 +127,10 @@ "PollWorkflowMessagesRequest", "PollWorkflowMessagesResponse", "ProducerCursor", + "RegisterStreamConsumerInput", + "RegisterStreamConsumerOutput", + "RegisterStreamConsumerRequest", + "RegisterStreamConsumerResponse", "STREAM_MESSAGE_KIND_DATA", "STREAM_MESSAGE_KIND_FLUSH", "STREAM_MESSAGE_KIND_UNSPECIFIED", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index 9e30bd9a8..3bbd8718e 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -1,24 +1,15 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/message.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/message.proto", -) +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -32,26 +23,61 @@ b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamMessageKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamMessageKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamMessageKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 + STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 + STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 + """Producer signalling a delivery boundary. Carries no body and consumes an + offset like any other message. A consumer uses it to end a turn without + waiting out an idle timeout. + """ + +class StreamMessageKind( + _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper +): ... + +STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 +STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 +STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 +"""Producer signalling a delivery boundary. Carries no body and consumes an +offset like any other message. A consumer uses it to end a turn without +waiting out an idle timeout. +""" +global___StreamMessageKind = StreamMessageKind + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], ) -> None: ... - BODY_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - TOPIC_FIELD_NUMBER: _ClassVar[int] - TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - KIND_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - body: _message_pb2.Payload - metadata: _containers.MessageMap[str, _message_pb2.Payload] - topic: str - topic_sequence: int - kind: StreamMessageKind - offset: int + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance. The server does not populate this today.""" + topic: builtins.str + topic_sequence: builtins.int + """Position within this topic. The global offset orders the whole stream; + this lets a consumer reason about one topic without decoding the rest. + """ + kind: global___StreamMessageKind.ValueType + offset: builtins.int + """Position in the whole stream, set on read and never stored. A consumer + that resumes at message granularity needs it, and a topic-filtered read + leaves gaps that make it underivable from the response alone. + """ def __init__( self, - body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., - metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., - topic: _Optional[str] = ..., - topic_sequence: _Optional[int] = ..., - kind: _Optional[_Union[StreamMessageKind, str]] = ..., - offset: _Optional[int] = ..., + *, + body: temporal.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + kind: global___StreamMessageKind.ValueType = ..., + offset: builtins.int = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "offset", + b"offset", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... + +global___StreamMessage = StreamMessage -class StreamMessageBatch(_message.Message): - __slots__ = ("messages",) - MESSAGES_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] +class StreamMessageBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one log node. The server stores + this serialized and opaque; it decodes only to trim a partial first page or + to apply a topic filter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... def __init__( - self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ... + self, + *, + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["messages", b"messages"] ) -> None: ... + +global___StreamMessageBatch = StreamMessageBatch diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index 6b6c2372a..bf947056a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.pyi b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 7e8dbe3e4..b813e2dfc 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/request_response.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/request_response.proto", -) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -35,119 +25,857 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... - -class CreateStreamOutput(_message.Message): - __slots__ = ("run_id",) - RUN_ID_FIELD_NUMBER: _ClassVar[int] - run_id: str - def __init__(self, run_id: _Optional[str] = ...) -> None: ... - -class AddMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "stream_id", - "run_id", - "messages", - "producer_id", - "sequence", - "expected_offset", - "use_expected_offset", - "owner_epoch", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - expected_offset: int - use_expected_offset: bool - owner_epoch: int - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - producer_id: _Optional[str] = ..., - sequence: _Optional[int] = ..., - expected_offset: _Optional[int] = ..., - use_expected_offset: bool = ..., - owner_epoch: _Optional[int] = ..., - ) -> None: ... - -class AddMessagesOutput(_message.Message): - __slots__ = ("first_offset", "next_offset", "count", "deduplicated") - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] - first_offset: int - next_offset: int - count: int - deduplicated: bool - def __init__( - self, - first_offset: _Optional[int] = ..., - next_offset: _Optional[int] = ..., - count: _Optional[int] = ..., - deduplicated: bool = ..., - ) -> None: ... - -class FinishWritingInput(_message.Message): - __slots__ = ("namespace", "stream_id", "producer_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - producer_id: str - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - producer_id: _Optional[str] = ..., - ) -> None: ... - -class FinishWritingOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class SubscribeWorkflowInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - stream_id: str - start_offset: int - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - start_offset: _Optional[int] = ..., - ) -> None: ... - -class SubscribeWorkflowOutput(_message.Message): - __slots__ = ("start_offset",) - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - start_offset: int - def __init__(self, start_offset: _Optional[int] = ...) -> None: ... - -class PollMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "stream_id", - "run_id", - "from_offset", - "max_messages", - "topics", - "wait_new_messages", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - from_offset: _Optional[int] = ..., - max_messages: _Optional[int] = ..., - topics: _Optional[_Iterable[str]] = ..., - wait_new_messages: bool = ..., - ) -> None: ... - -class PollMessagesOutput(_message.Message): - __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") - MESSAGES_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - next_offset: int - head_offset: int - closed: bool - close_reason: _message_pb2_1.Payload - def __init__( - self, - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - next_offset: _Optional[int] = ..., - head_offset: _Optional[int] = ..., - closed: bool = ..., - close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., - ) -> None: ... - -class DescribeStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__( - self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... - ) -> None: ... - -class PollWorkflowMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "workflow_id", - "stream_name", - "from_offset", - "max_messages", - "topics", - "wait_new_messages", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - from_offset: _Optional[int] = ..., - max_messages: _Optional[int] = ..., - topics: _Optional[_Iterable[str]] = ..., - wait_new_messages: bool = ..., - ) -> None: ... - -class DescribeWorkflowStreamInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - ) -> None: ... - -class AddWorkflowMessagesInput(_message.Message): - __slots__ = ( - "namespace", - "workflow_id", - "stream_name", - "messages", - "producer_id", - "sequence", - ) - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - def __init__( - self, - namespace: _Optional[str] = ..., - workflow_id: _Optional[str] = ..., - stream_name: _Optional[str] = ..., - messages: _Optional[ - _Iterable[_Union[_message_pb2.StreamMessage, _Mapping]] - ] = ..., - producer_id: _Optional[str] = ..., - sequence: _Optional[int] = ..., - ) -> None: ... - -class DescribeStreamOutput(_message.Message): - __slots__ = ("state",) - STATE_FIELD_NUMBER: _ClassVar[int] - state: _stream_state_pb2.StreamState - def __init__( - self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ... - ) -> None: ... - -class CloseStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "reason") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - REASON_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - reason: _message_pb2_1.Payload - def __init__( - self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ..., +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 +import temporalio.api.streamservice.v1.message_pb2 +import temporalio.api.streamservice.v1.stream_state_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CreateStreamInput(google.protobuf.message.Message): + """The frontend-facing shapes are defined here rather than in the public API + because streams have no public API yet. Keeping them in a nested + frontend_request mirrors the other CHASM libraries, so promoting them later + is a package move rather than a redesign. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def lifecycle( + self, + ) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + lifecycle: temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["lifecycle", b"lifecycle"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "lifecycle", + b"lifecycle", + "namespace", + b"namespace", + "stream_id", + b"stream_id", + ], ) -> None: ... -class CloseStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___CreateStreamInput = CreateStreamInput -class TruncateStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "new_base_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - new_base_offset: int +class CreateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + run_id: builtins.str def __init__( self, - namespace: _Optional[str] = ..., - stream_id: _Optional[str] = ..., - new_base_offset: _Optional[int] = ..., + *, + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["run_id", b"run_id"] ) -> None: ... -class TruncateStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___CreateStreamOutput = CreateStreamOutput + +class AddMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class DeleteStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + USE_EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional. Supplying it skips resolving the stream's current run, which is + a persistence lookup on every call. CreateStream returns it. + """ + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Idempotency, all optional. Supply a producer identity and sequence, or an + expected offset, or neither and accept at-least-once. + """ + sequence: builtins.int + expected_offset: builtins.int + """Guarded by use_expected_offset because proto3 optional is not supported + by this repo's helper generator. + """ + use_expected_offset: builtins.bool + owner_epoch: builtins.int def __init__( - self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + expected_offset: builtins.int = ..., + use_expected_offset: builtins.bool = ..., + owner_epoch: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "expected_offset", + b"expected_offset", + "messages", + b"messages", + "namespace", + b"namespace", + "owner_epoch", + b"owner_epoch", + "producer_id", + b"producer_id", + "run_id", + b"run_id", + "sequence", + b"sequence", + "stream_id", + b"stream_id", + "use_expected_offset", + b"use_expected_offset", + ], ) -> None: ... -class DeleteStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... +global___AddMessagesInput = AddMessagesInput + +class AddMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class CreateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CreateStreamInput + FIRST_OFFSET_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + DEDUPLICATED_FIELD_NUMBER: builtins.int + first_offset: builtins.int + next_offset: builtins.int + count: builtins.int + deduplicated: builtins.bool + """True when a retry matched a recorded sequence and nothing was appended.""" def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ..., + *, + first_offset: builtins.int = ..., + next_offset: builtins.int = ..., + count: builtins.int = ..., + deduplicated: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "count", + b"count", + "deduplicated", + b"deduplicated", + "first_offset", + b"first_offset", + "next_offset", + b"next_offset", + ], ) -> None: ... -class CreateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CreateStreamOutput +global___AddMessagesOutput = AddMessagesOutput + +class FinishWritingInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + producer_id: builtins.str def __init__( - self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + producer_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "stream_id", + b"stream_id", + ], ) -> None: ... -class AddMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddMessagesInput +global___FinishWritingInput = FinishWritingInput + +class FinishWritingOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ..., ) -> None: ... -class AddMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput +global___FinishWritingOutput = FinishWritingOutput + +class SubscribeWorkflowInput(google.protobuf.message.Message): + """Registers a Workflow as a consumer of a stream it owns. The cursor lands in + the Workflow's own state, so from then on each of its Workflow Tasks carries + the next range and records what it consumed. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Name of the stream within the Workflow, for a stream it owns.""" + stream_id: builtins.str + """Id of a standalone stream in another execution. Exactly one of this and + stream_name is set. + """ + start_offset: builtins.int + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. + """ def __init__( - self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___SubscribeWorkflowInput = SubscribeWorkflowInput -class FinishWritingRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: FinishWritingInput +class SubscribeWorkflowOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + start_offset: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ..., + *, + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["start_offset", b"start_offset"] ) -> None: ... -class FinishWritingResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: FinishWritingOutput +global___SubscribeWorkflowOutput = SubscribeWorkflowOutput + +class PollMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional, as on AddMessagesInput.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters by exact topic. Offsets are assigned over the unfiltered stream, so + next_offset advances past filtered-out messages too. + """ + wait_new_messages: builtins.bool + """When set and the reader is caught up, block until something arrives, the + stream closes, or the server's long-poll timeout elapses. A timeout returns + an empty response rather than an error, so the caller simply polls again. + """ def __init__( - self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + ], + ) -> None: ... + +global___PollMessagesInput = PollMessagesInput -class SubscribeWorkflowRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: SubscribeWorkflowInput +class PollMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + next_offset: builtins.int + head_offset: builtins.int + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ..., + *, + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + next_offset: builtins.int = ..., + head_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "closed", + b"closed", + "head_offset", + b"head_offset", + "messages", + b"messages", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___PollMessagesOutput = PollMessagesOutput + +class DescribeStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class SubscribeWorkflowResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: SubscribeWorkflowOutput + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str def __init__( self, - frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DescribeStreamInput = DescribeStreamInput -class PollMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollMessagesInput +class PollWorkflowMessagesInput(google.protobuf.message.Message): + """A stream a workflow owns lives inside that workflow's execution, so it has + no standalone id to address it by. It is named by its owner and its name + instead, and routed on the owner. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters as on PollMessagesInput.""" + wait_new_messages: builtins.bool def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___PollWorkflowMessagesInput = PollWorkflowMessagesInput -class PollMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput +class DescribeWorkflowStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str def __init__( - self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], ) -> None: ... -class DescribeStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeStreamInput +global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput + +class AddWorkflowMessagesInput(google.protobuf.message.Message): + """Appending to a stream a workflow owns, from outside that workflow. The + workflow's own publishes ride its Workflow Task instead. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Optional idempotency, as on AddMessagesInput.""" + sequence: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", + b"messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], ) -> None: ... -class DescribeStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput +global___AddWorkflowMessagesInput = AddWorkflowMessagesInput + +class DescribeStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATE_FIELD_NUMBER: builtins.int + @property + def state(self) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamState: ... def __init__( - self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + self, + *, + state: temporalio.api.streamservice.v1.stream_state_pb2.StreamState + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["state", b"state"] ) -> None: ... -class PollWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollWorkflowMessagesInput +global___DescribeStreamOutput = DescribeStreamOutput + +class CloseStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["reason", b"reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "reason", b"reason", "stream_id", b"stream_id" + ], ) -> None: ... -class PollWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput +global___CloseStreamInput = CloseStreamInput + +class CloseStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( - self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ... + self, ) -> None: ... -class DescribeWorkflowStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeWorkflowStreamInput +global___CloseStreamOutput = CloseStreamOutput + +class TruncateStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + NEW_BASE_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + new_base_offset: builtins.int def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[ - _Union[DescribeWorkflowStreamInput, _Mapping] - ] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + new_base_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "new_base_offset", + b"new_base_offset", + "stream_id", + b"stream_id", + ], ) -> None: ... -class DescribeWorkflowStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput +global___TruncateStreamInput = TruncateStreamInput + +class TruncateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + def __init__( - self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ... + self, ) -> None: ... -class AddWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddWorkflowMessagesInput +global___TruncateStreamOutput = TruncateStreamOutput + +class DeleteStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ..., + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DeleteStreamInput = DeleteStreamInput + +class DeleteStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor -class AddWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput def __init__( - self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ... + self, ) -> None: ... -class CloseStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CloseStreamInput +global___DeleteStreamOutput = DeleteStreamOutput + +class CreateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CreateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CreateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CreateStreamRequest = CreateStreamRequest + +class CreateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CreateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CreateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CreateStreamResponse = CreateStreamResponse + +class AddMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddMessagesRequest = AddMessagesRequest + +class AddMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddMessagesResponse = AddMessagesResponse + +class FinishWritingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___FinishWritingInput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___FinishWritingInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class CloseStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CloseStreamOutput +global___FinishWritingRequest = FinishWritingRequest + +class FinishWritingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___FinishWritingOutput: ... def __init__( - self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ... + self, + *, + frontend_response: global___FinishWritingOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class TruncateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: TruncateStreamInput +global___FinishWritingResponse = FinishWritingResponse + +class SubscribeWorkflowRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___SubscribeWorkflowInput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___SubscribeWorkflowInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class TruncateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: TruncateStreamOutput +global___SubscribeWorkflowRequest = SubscribeWorkflowRequest + +class SubscribeWorkflowResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___SubscribeWorkflowOutput: ... def __init__( - self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ... + self, + *, + frontend_response: global___SubscribeWorkflowOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsInput(_message.Message): - __slots__ = ("namespace", "page_size", "next_page_token", "query") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - QUERY_FIELD_NUMBER: _ClassVar[int] - namespace: str - page_size: int - next_page_token: bytes - query: str +global___SubscribeWorkflowResponse = SubscribeWorkflowResponse + +class PollMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollMessagesInput: ... def __init__( self, - namespace: _Optional[str] = ..., - page_size: _Optional[int] = ..., - next_page_token: _Optional[bytes] = ..., - query: _Optional[str] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class StreamListEntry(_message.Message): - __slots__ = ("stream_id", "run_id") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - stream_id: str - run_id: str +global___PollMessagesRequest = PollMessagesRequest + +class PollMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... def __init__( - self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ... + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsOutput(_message.Message): - __slots__ = ("streams", "next_page_token") - STREAMS_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] - next_page_token: bytes +global___PollMessagesResponse = PollMessagesResponse + +class DescribeStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeStreamInput: ... def __init__( self, - streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., - next_page_token: _Optional[bytes] = ..., + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class ListStreamsRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: ListStreamsInput +global___DescribeStreamRequest = DescribeStreamRequest + +class DescribeStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ..., + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class ListStreamsResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: ListStreamsOutput +global___DescribeStreamResponse = DescribeStreamResponse + +class PollWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollWorkflowMessagesInput: ... def __init__( - self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ... + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... -class DeleteStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DeleteStreamInput +global___PollWorkflowMessagesRequest = PollWorkflowMessagesRequest + +class PollWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... def __init__( self, - namespace_id: _Optional[str] = ..., - frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ..., + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], ) -> None: ... -class DeleteStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DeleteStreamOutput +global___PollWorkflowMessagesResponse = PollWorkflowMessagesResponse + +class DescribeWorkflowStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeWorkflowStreamInput: ... def __init__( - self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ... + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeWorkflowStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], ) -> None: ... + +global___DescribeWorkflowStreamRequest = DescribeWorkflowStreamRequest + +class DescribeWorkflowStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeWorkflowStreamResponse = DescribeWorkflowStreamResponse + +class RegisterStreamConsumerInput(google.protobuf.message.Message): + """Registering a consumer on a stream in another execution. Split out from + SubscribeWorkflow because the two halves live on different shards: the pin + goes on the stream, the cursor goes on the consuming workflow, and a handler + can only reach the shard it was routed to. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + consumer_workflow_id: builtins.str + """The workflow that will consume, which names the pin.""" + start_offset: builtins.int + """Negative means from wherever the stream is when the pin is taken. Resolved + here, where the frontier is, and returned so the cursor records a fact. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + consumer_workflow_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_workflow_id", + b"consumer_workflow_id", + "namespace", + b"namespace", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___RegisterStreamConsumerInput = RegisterStreamConsumerInput + +class RegisterStreamConsumerOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + start_offset: builtins.int + collection_id: builtins.str + """What the consumer needs to address the log, all decided by the stream.""" + bucket_size: builtins.int + known_head: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + known_head: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "known_head", + b"known_head", + "start_offset", + b"start_offset", + ], + ) -> None: ... + +global___RegisterStreamConsumerOutput = RegisterStreamConsumerOutput + +class AdvanceConsumerHeadInput(google.protobuf.message.Message): + """Telling one consumer that the frontier moved. Routed to the consumer, which + is not where the stream lives. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """The run that subscribed. A successor from continue-as-new holds no cursor + for this stream, so pushing the frontier at it would land nowhere. + """ + stream_id: builtins.str + head_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_id: builtins.str = ..., + head_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "head_offset", + b"head_offset", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_id", + b"stream_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput + +class AdvanceConsumerHeadOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput + +class AddWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddWorkflowMessagesRequest = AddWorkflowMessagesRequest + +class AddWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddWorkflowMessagesResponse = AddWorkflowMessagesResponse + +class RegisterStreamConsumerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___RegisterStreamConsumerInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___RegisterStreamConsumerInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___RegisterStreamConsumerRequest = RegisterStreamConsumerRequest + +class RegisterStreamConsumerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___RegisterStreamConsumerOutput: ... + def __init__( + self, + *, + frontend_response: global___RegisterStreamConsumerOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___RegisterStreamConsumerResponse = RegisterStreamConsumerResponse + +class AdvanceConsumerHeadRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AdvanceConsumerHeadInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AdvanceConsumerHeadInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AdvanceConsumerHeadRequest = AdvanceConsumerHeadRequest + +class AdvanceConsumerHeadResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AdvanceConsumerHeadOutput: ... + def __init__( + self, + *, + frontend_response: global___AdvanceConsumerHeadOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AdvanceConsumerHeadResponse = AdvanceConsumerHeadResponse + +class CloseStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CloseStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CloseStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CloseStreamRequest = CloseStreamRequest + +class CloseStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CloseStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CloseStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CloseStreamResponse = CloseStreamResponse + +class TruncateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___TruncateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___TruncateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___TruncateStreamRequest = TruncateStreamRequest + +class TruncateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___TruncateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___TruncateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___TruncateStreamResponse = TruncateStreamResponse + +class ListStreamsInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + QUERY_FIELD_NUMBER: builtins.int + namespace: builtins.str + page_size: builtins.int + next_page_token: builtins.bytes + query: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + page_size: builtins.int = ..., + next_page_token: builtins.bytes = ..., + query: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "next_page_token", + b"next_page_token", + "page_size", + b"page_size", + "query", + b"query", + ], + ) -> None: ... + +global___ListStreamsInput = ListStreamsInput + +class StreamListEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___StreamListEntry = StreamListEntry + +class ListStreamsOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAMS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + @property + def streams( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamListEntry + ]: ... + next_page_token: builtins.bytes + def __init__( + self, + *, + streams: collections.abc.Iterable[global___StreamListEntry] | None = ..., + next_page_token: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "next_page_token", b"next_page_token", "streams", b"streams" + ], + ) -> None: ... + +global___ListStreamsOutput = ListStreamsOutput + +class ListStreamsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___ListStreamsInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___ListStreamsInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___ListStreamsRequest = ListStreamsRequest + +class ListStreamsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___ListStreamsOutput: ... + def __init__( + self, + *, + frontend_response: global___ListStreamsOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___ListStreamsResponse = ListStreamsResponse + +class DeleteStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DeleteStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DeleteStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DeleteStreamRequest = DeleteStreamRequest + +class DeleteStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DeleteStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DeleteStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DeleteStreamResponse = DeleteStreamResponse diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index c8c70bb79..bf947056a 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index d5de1d5f8..432abfc5c 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/service.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/service.proto", -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -29,21 +19,16 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16RegisterStreamConsumer\x12H.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerResponse"\x00\x12\xa6\x01\n\x13\x41\x64vanceConsumerHead\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) - class StreamServiceStub(object): """Missing associated documentation comment in .proto file.""" @@ -45,79 +21,76 @@ def __init__(self, channel): "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True, ) self.AddMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True, ) self.FinishWriting = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True, ) self.SubscribeWorkflow = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True, ) self.PollMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True, ) self.DescribeStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True, ) self.PollWorkflowMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True, ) self.DescribeWorkflowStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True, ) self.AddWorkflowMessages = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True, + ) + self.RegisterStreamConsumer = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + ) + self.AdvanceConsumerHead = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, ) self.CloseStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True, ) self.TruncateStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True, ) self.ListStreams = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True, ) self.DeleteStream = channel.unary_unary( "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True, ) @@ -178,6 +151,21 @@ def AddWorkflowMessages(self, request, context): context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") + def RegisterStreamConsumer(self, request, context): + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def AdvanceConsumerHead(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -252,6 +240,16 @@ def add_StreamServiceServicer_to_server(servicer, server): request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, ), + "RegisterStreamConsumer": grpc.unary_unary_rpc_method_handler( + servicer.RegisterStreamConsumer, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.SerializeToString, + ), + "AdvanceConsumerHead": grpc.unary_unary_rpc_method_handler( + servicer.AdvanceConsumerHead, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.SerializeToString, + ), "CloseStream": grpc.unary_unary_rpc_method_handler( servicer.CloseStream, request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, @@ -277,9 +275,6 @@ def add_StreamServiceServicer_to_server(servicer, server): "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers( - "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers - ) # This class is part of an EXPERIMENTAL API. @@ -313,7 +308,6 @@ def CreateStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -343,7 +337,6 @@ def AddMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -373,7 +366,6 @@ def FinishWriting( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -403,7 +395,6 @@ def SubscribeWorkflow( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -433,7 +424,6 @@ def PollMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -463,7 +453,6 @@ def DescribeStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -493,7 +482,6 @@ def PollWorkflowMessages( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -523,7 +511,6 @@ def DescribeWorkflowStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -553,7 +540,64 @@ def AddWorkflowMessages( wait_for_ready, timeout, metadata, - _registered_method=True, + ) + + @staticmethod + def RegisterStreamConsumer( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def AdvanceConsumerHead( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, ) @staticmethod @@ -583,7 +627,6 @@ def CloseStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -613,7 +656,6 @@ def TruncateStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -643,7 +685,6 @@ def ListStreams( wait_for_ready, timeout, metadata, - _registered_method=True, ) @staticmethod @@ -673,5 +714,4 @@ def DeleteStream( wait_for_ready, timeout, metadata, - _registered_method=True, ) diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi new file mode 100644 index 000000000..1530074ec --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi @@ -0,0 +1,195 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import abc + +import grpc + +import temporalio.api.streamservice.v1.request_response_pb2 + +class StreamServiceStub: + def __init__(self, channel: grpc.Channel) -> None: ... + CreateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse, + ] + AddMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse, + ] + FinishWriting: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse, + ] + SubscribeWorkflow: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse, + ] + PollMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse, + ] + DescribeStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse, + ] + PollWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, + ] + """Routed on the owner, because the stream it reads has no id of its own.""" + DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, + ] + AddWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse, + ] + RegisterStreamConsumer: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse, + ] + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + AdvanceConsumerHead: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse, + ] + CloseStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse, + ] + TruncateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse, + ] + ListStreams: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse, + ] + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + DeleteStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse, + ] + +class StreamServiceServicer(metaclass=abc.ABCMeta): + @abc.abstractmethod + def CreateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse: ... + @abc.abstractmethod + def AddMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse: ... + @abc.abstractmethod + def FinishWriting( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse: ... + @abc.abstractmethod + def SubscribeWorkflow( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse + ): ... + @abc.abstractmethod + def PollMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse: ... + @abc.abstractmethod + def DescribeStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse + ): ... + @abc.abstractmethod + def PollWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: + """Routed on the owner, because the stream it reads has no id of its own.""" + @abc.abstractmethod + def DescribeWorkflowStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse: ... + @abc.abstractmethod + def AddWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse + ): ... + @abc.abstractmethod + def RegisterStreamConsumer( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse: + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + @abc.abstractmethod + def AdvanceConsumerHead( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse + ): ... + @abc.abstractmethod + def CloseStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse: ... + @abc.abstractmethod + def TruncateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse + ): ... + @abc.abstractmethod + def ListStreams( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse: + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + @abc.abstractmethod + def DeleteStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse: ... + +def add_StreamServiceServicer_to_server( + servicer: StreamServiceServicer, server: grpc.Server +) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 3fe850a2a..2ce5a0451 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -1,24 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/stream_state.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - "", - "temporalio/api/stream/v1/stream_state.proto", -) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -32,37 +22,113 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamState(google.protobuf.message.Message): + """Size is O(producers + consumers), never O(messages). Payload bytes live in + the log, not here, which is what keeps this off the CHASM partial-read path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class ProducersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ProducerCursor: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[ProducerCursor, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: global___ProducerCursor | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + class ConsumersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor - class ConsumersEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: ConsumerCursor + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ConsumerCursor: ... def __init__( self, - key: _Optional[str] = ..., - value: _Optional[_Union[ConsumerCursor, _Mapping]] = ..., + *, + key: builtins.str = ..., + value: global___ConsumerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], ) -> None: ... - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCERS_FIELD_NUMBER: _ClassVar[int] - CONSUMERS_FIELD_NUMBER: _ClassVar[int] - LIFECYCLE_FIELD_NUMBER: _ClassVar[int] - REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] - head_offset: int - base_offset: int - last_txn_id: int - closed: bool - close_reason: _message_pb2.Payload - owner_epoch: int - bucket_size: int - collection_id: str - producers: _containers.MessageMap[str, ProducerCursor] - consumers: _containers.MessageMap[str, ConsumerCursor] - lifecycle: StreamLifecycle - redirect_run_id: str - close_time: _timestamp_pb2.Timestamp + HEAD_OFFSET_FIELD_NUMBER: builtins.int + BASE_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + PRODUCERS_FIELD_NUMBER: builtins.int + CONSUMERS_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + REDIRECT_RUN_ID_FIELD_NUMBER: builtins.int + CLOSE_TIME_FIELD_NUMBER: builtins.int + head_offset: builtins.int + """Visibility frontier. Readers never observe an offset at or past this.""" + base_offset: builtins.int + """Truncation floor. Offsets below this are gone.""" + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + owner_epoch: builtins.int + """Bumped on ownership change so a stale producer's write fails.""" + bucket_size: builtins.int + """Immutable once set. Offsets roll to a new log tree every bucket_size so no + single storage partition grows with the stream. + """ + collection_id: builtins.str + """Identity of the log this stream writes to. Bucket trees are derived from + it, so there is no per-bucket index to store. + """ + @property + def producers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ProducerCursor + ]: ... + @property + def consumers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ConsumerCursor + ]: ... + @property + def lifecycle(self) -> global___StreamLifecycle: ... + redirect_run_id: builtins.str + """Set when a successor run takes ownership, so an in-flight poll can follow + the chain instead of stalling on a superseded run. + """ + @property + def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: + """Wall-clock close time, used to schedule retention deletion.""" def __init__( self, - head_offset: _Optional[int] = ..., - base_offset: _Optional[int] = ..., - last_txn_id: _Optional[int] = ..., - closed: bool = ..., - close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., - owner_epoch: _Optional[int] = ..., - bucket_size: _Optional[int] = ..., - collection_id: _Optional[str] = ..., - producers: _Optional[_Mapping[str, ProducerCursor]] = ..., - consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., - lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., - redirect_run_id: _Optional[str] = ..., - close_time: _Optional[ - _Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping] - ] = ..., + *, + head_offset: builtins.int = ..., + base_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + owner_epoch: builtins.int = ..., + bucket_size: builtins.int = ..., + collection_id: builtins.str = ..., + producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] + | None = ..., + consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] + | None = ..., + lifecycle: global___StreamLifecycle | None = ..., + redirect_run_id: builtins.str = ..., + close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "lifecycle", + b"lifecycle", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "base_offset", + b"base_offset", + "bucket_size", + b"bucket_size", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "closed", + b"closed", + "collection_id", + b"collection_id", + "consumers", + b"consumers", + "head_offset", + b"head_offset", + "lifecycle", + b"lifecycle", + "owner_epoch", + b"owner_epoch", + "producers", + b"producers", + "redirect_run_id", + b"redirect_run_id", + ], ) -> None: ... -class ProducerCursor(_message.Message): - __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") - SEQ_FIELD_NUMBER: _ClassVar[int] - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] - FENCED_FIELD_NUMBER: _ClassVar[int] - seq: int - first_offset: int - count: int - content_hash: bytes - fenced: bool +global___StreamState = StreamState + +class ProducerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + CONTENT_HASH_FIELD_NUMBER: builtins.int + FENCED_FIELD_NUMBER: builtins.int + seq: builtins.int + first_offset: builtins.int + count: builtins.int + content_hash: builtins.bytes + """Distinguishes a genuine retry from a client reusing a sequence with + different content, which must be rejected rather than deduplicated. + """ + fenced: builtins.bool + """Set by FinishWriting. Ends this producer's writes without closing the + stream for anyone else. + """ def __init__( self, - seq: _Optional[int] = ..., - first_offset: _Optional[int] = ..., - count: _Optional[int] = ..., - content_hash: _Optional[bytes] = ..., - fenced: bool = ..., + *, + seq: builtins.int = ..., + first_offset: builtins.int = ..., + count: builtins.int = ..., + content_hash: builtins.bytes = ..., + fenced: builtins.bool = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "content_hash", + b"content_hash", + "count", + b"count", + "fenced", + b"fenced", + "first_offset", + b"first_offset", + "seq", + b"seq", + ], + ) -> None: ... + +global___ProducerCursor = ProducerCursor -class ConsumerCursor(_message.Message): - __slots__ = ("workflow_id", "run_id", "offset", "active", "external") - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - ACTIVE_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - workflow_id: str - run_id: str - offset: int - active: bool - external: bool +class ConsumerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + ACTIVE_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + REPLAY_FLOOR_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + offset: builtins.int + """How far this consumer has read. Used to decide whether it needs waking, + not to decide what the stream may drop. + """ + active: builtins.bool + external: builtins.bool + """Set when the consumer is a workflow in another execution, which is the + only case that has to be told the frontier moved. A workflow consuming a + stream it owns sees that while closing its own transaction. + """ + replay_floor: builtins.int + """The oldest offset this consumer's History still depends on. + + It is where the subscription started, not where it has read to. A range + this consumer already consumed is recorded in its History and has to be + re-readable for the workflow to replay, so bytes below the read position + are exactly the ones a replay needs most. It stays put while the consumer + is active and is released when it deregisters. + """ def __init__( self, - workflow_id: _Optional[str] = ..., - run_id: _Optional[str] = ..., - offset: _Optional[int] = ..., - active: bool = ..., - external: bool = ..., + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + offset: builtins.int = ..., + active: builtins.bool = ..., + external: builtins.bool = ..., + replay_floor: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "active", + b"active", + "external", + b"external", + "offset", + b"offset", + "replay_floor", + b"replay_floor", + "run_id", + b"run_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___ConsumerCursor = ConsumerCursor -class WorkflowStreamCursor(_message.Message): - __slots__ = ( - "stream_id", - "collection_id", - "bucket_size", - "offset", - "known_head", - "external", - "pending_from", - "pending_to", - "has_pending", - ) - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - PENDING_FROM_FIELD_NUMBER: _ClassVar[int] - PENDING_TO_FIELD_NUMBER: _ClassVar[int] - HAS_PENDING_FIELD_NUMBER: _ClassVar[int] - stream_id: str - collection_id: str - bucket_size: int - offset: int - known_head: int - external: bool - pending_from: int - pending_to: int - has_pending: bool +class WorkflowStreamCursor(google.protobuf.message.Message): + """A consuming Workflow's position in a stream. This lives in the consuming + Workflow's own state rather than on the stream, so advancing it commits in + the same transaction as the WorkflowTaskCompleted event that records the + range. Keeping it on the stream would make the advance a cross-execution + write, and a crash between the two would either redeliver or skip. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + PENDING_FROM_FIELD_NUMBER: builtins.int + PENDING_TO_FIELD_NUMBER: builtins.int + HAS_PENDING_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + collection_id: builtins.str + """Enough to address the log without reading the stream component first.""" + bucket_size: builtins.int + offset: builtins.int + """Next offset to deliver.""" + known_head: builtins.int + """The stream's frontier as of the last delivery. A workflow consuming a + stream in another execution cannot read the real frontier while closing its + own transaction, so this is what tells it a capped slice left more behind. + """ + external: builtins.bool + """Set when the stream lives in another execution, which decides whether the + frontier is read locally or taken from known_head. + """ + pending_from: builtins.int + """The range attached to the Workflow Task currently in flight. Recorded on + the event that closes that task, then folded into offset. An empty range + is still recorded: a task where the subscription saw nothing is a fact + replay has to reproduce. + """ + pending_to: builtins.int + has_pending: builtins.bool + start_offset: builtins.int + """Where this subscription began reading. Retained separately from offset, + which advances, because replay has to tell "committed nothing yet" apart + from "the events recording what was committed are not in this page". + """ def __init__( self, - stream_id: _Optional[str] = ..., - collection_id: _Optional[str] = ..., - bucket_size: _Optional[int] = ..., - offset: _Optional[int] = ..., - known_head: _Optional[int] = ..., - external: bool = ..., - pending_from: _Optional[int] = ..., - pending_to: _Optional[int] = ..., - has_pending: bool = ..., + *, + stream_id: builtins.str = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + offset: builtins.int = ..., + known_head: builtins.int = ..., + external: builtins.bool = ..., + pending_from: builtins.int = ..., + pending_to: builtins.int = ..., + has_pending: builtins.bool = ..., + start_offset: builtins.int = ..., ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "external", + b"external", + "has_pending", + b"has_pending", + "known_head", + b"known_head", + "offset", + b"offset", + "pending_from", + b"pending_from", + "pending_to", + b"pending_to", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___WorkflowStreamCursor = WorkflowStreamCursor -class StreamLifecycle(_message.Message): - __slots__ = ("retention", "max_items") - RETENTION_FIELD_NUMBER: _ClassVar[int] - MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] - retention: _duration_pb2.Duration - max_items: int +class StreamLifecycle(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RETENTION_FIELD_NUMBER: builtins.int + MAX_ITEMS_FIELD_NUMBER: builtins.int + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a closed stream stays readable before it is deleted.""" + max_items: builtins.int + """Cap on readable messages. Older whole buckets are reclaimed once the floor + passes them, so a capped stream has bounded storage. + """ def __init__( self, - retention: _Optional[ - _Union[datetime.timedelta, _duration_pb2.Duration, _Mapping] - ] = ..., - max_items: _Optional[int] = ..., + *, + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_items: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["retention", b"retention"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_items", b"max_items", "retention", b"retention" + ], ) -> None: ... + +global___StreamLifecycle = StreamLifecycle diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index c241cab40..bf947056a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,28 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import warnings - import grpc - -GRPC_GENERATED_VERSION = "1.78.0" -GRPC_VERSION = grpc.__version__ -_version_not_supported = False - -try: - from grpc._utilities import first_version_is_lower - - _version_not_supported = first_version_is_lower( - GRPC_VERSION, GRPC_GENERATED_VERSION - ) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f"The grpc package installed is at version {GRPC_VERSION}," - + " but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on" - + f" grpcio>={GRPC_GENERATED_VERSION}." - + f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}" - + f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}." - ) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 8280b56d4..2de4cb4e0 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -77,7 +77,9 @@ def __init__(self, channel: Any, namespace: str) -> None: """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" self._channel = channel self._namespace = namespace - self._stub = service_pb2_grpc.StreamServiceStub(channel) + # The generated stub is typed for a synchronous channel. This client + # drives it over ``grpc.aio``, where every call is awaited. + self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod def connect(target_host: str, namespace: str = "default") -> "StreamClient": From e9a2cc03ebe39467a2a07eb56c4d294b13398b8c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:44:45 -0700 Subject: [PATCH 189/831] Repinned Core to the finalized replay-slice branch. The stream client needs the replay slice lookahead fix that branch finished. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 3d1f82e66..f88f78c3f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 +Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c From d07c320a4630a7bd913e2574fc2dcc393f9c6bc9 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:47:50 -0700 Subject: [PATCH 190/831] Qualified the LangGraph docstring's stream references. The new server_streams module gives WorkflowStream and WorkflowStreamClient a second definition, so pydoctor can no longer resolve the short names. --- temporalio/contrib/langgraph/_plugin.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/temporalio/contrib/langgraph/_plugin.py b/temporalio/contrib/langgraph/_plugin.py index 03881ca2a..1819c646d 100644 --- a/temporalio/contrib/langgraph/_plugin.py +++ b/temporalio/contrib/langgraph/_plugin.py @@ -104,11 +104,13 @@ class LangGraphPlugin(SimplePlugin): inherited default of either form. streaming_topic: When set, ``langgraph.config.get_stream_writer()`` inside a node publishes to this topic on the workflow's - :class:`WorkflowStream`. The workflow must construct - ``WorkflowStream()`` in its ``@workflow.init`` (the plugin's + :class:`temporalio.contrib.workflow_streams.WorkflowStream`. The + workflow must construct ``WorkflowStream()`` in its + ``@workflow.init`` (the plugin's interceptor verifies this on workflow start). Nodes with ``execute_in='activity'`` publish through - :class:`WorkflowStreamClient` (signal); nodes with + :class:`temporalio.contrib.workflow_streams.WorkflowStreamClient` + (signal); nodes with ``execute_in='workflow'`` publish synchronously to the in-workflow stream (no signal). streaming_batch_interval: How often the activity-side stream From 5cafc111539f9eab4e5bfaf476d94b9e8c373d4c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:28:27 -0700 Subject: [PATCH 191/831] Repinned Core to the WIT-aligned replay-slice head. That head matches upstream's nexus model WIT for the workflow-id policies, which the current generator requires. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index f88f78c3f..4076ef24f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c +Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 From 0e4bdaea1270c4b8dfe5029d6f10f3970fec612a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:30:52 -0700 Subject: [PATCH 192/831] Regenerated the bridge protos from the repinned Core. The generated module was missing the local-activity marker argument flag its own stub already declared, so the two disagreed about the message. --- .../workflow_commands_pb2.py | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 3374f951a..0d81e37f5 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -511,8 +511,8 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 _WORKFLOWCOMMAND._serialized_start = 556 _WORKFLOWCOMMAND._serialized_end = 2794 _ADDSTREAMMESSAGES._serialized_start = 2796 @@ -528,57 +528,57 @@ _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY._serialized_end = 4683 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4646 - _REQUESTCANCELACTIVITY._serialized_end = 4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 - _QUERYRESULT._serialized_start = 4728 - _QUERYRESULT._serialized_end = 4884 - _QUERYSUCCESS._serialized_start = 4886 - _QUERYSUCCESS._serialized_end = 4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 - _FAILWORKFLOWEXECUTION._serialized_start = 5031 - _FAILWORKFLOWEXECUTION._serialized_end = 5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _REQUESTCANCELACTIVITY._serialized_start = 4685 + _REQUESTCANCELACTIVITY._serialized_end = 4721 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 + _QUERYRESULT._serialized_start = 4767 + _QUERYRESULT._serialized_end = 4923 + _QUERYSUCCESS._serialized_start = 4925 + _QUERYSUCCESS._serialized_end = 4990 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 + _FAILWORKFLOWEXECUTION._serialized_start = 5070 + _FAILWORKFLOWEXECUTION._serialized_end = 5144 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6024 - _CANCELWORKFLOWEXECUTION._serialized_end = 6100 - _SETPATCHMARKER._serialized_start = 6102 - _SETPATCHMARKER._serialized_end = 6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _CANCELWORKFLOWEXECUTION._serialized_start = 6063 + _CANCELWORKFLOWEXECUTION._serialized_end = 6139 + _SETPATCHMARKER._serialized_start = 6141 + _SETPATCHMARKER._serialized_end = 6195 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7958 - _CANCELSIGNALWORKFLOW._serialized_end = 7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 - _UPDATERESPONSE._serialized_start = 8180 - _UPDATERESPONSE._serialized_end = 8390 - _SCHEDULENEXUSOPERATION._serialized_start = 8393 - _SCHEDULENEXUSOPERATION._serialized_end = 8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 + _CANCELSIGNALWORKFLOW._serialized_start = 7997 + _CANCELSIGNALWORKFLOW._serialized_end = 8032 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 + _UPDATERESPONSE._serialized_start = 8219 + _UPDATERESPONSE._serialized_end = 8429 + _SCHEDULENEXUSOPERATION._serialized_start = 8432 + _SCHEDULENEXUSOPERATION._serialized_end = 8970 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 # @@protoc_insertion_point(module_scope) From 6445ee989ab375a402fbe9eb1de5b2c248424bc7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:21:21 -0700 Subject: [PATCH 193/831] Adapted the native provider to the interface changes. The append cursor names the last record and is None for a batch the server deduplicated, so the stream client reports what the server said about the append. Producer identity is resolved by the package, inbound frames carry no topic, and the inbound id comes from the shared helper. --- temporalio/client_stream.py | 47 ++++++++++++--- temporalio/streams/providers/native.py | 83 +++++++++++++------------- tests/test_client_stream.py | 11 +++- 3 files changed, 89 insertions(+), 52 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 2de4cb4e0..1cd775043 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -33,7 +33,28 @@ import temporalio.api.streamservice.v1 as stream from temporalio.api.streamservice.v1 import service_pb2_grpc -__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] +__all__ = [ + "Appended", + "Message", + "Page", + "StreamClient", + "StreamHandle", + "WorkflowStreamHandle", +] + + +@dataclass(frozen=True) +class Appended: + """Where one append landed. + + ``deduplicated`` says the server already held this producer's batch at + this sequence and wrote nothing; the offsets are then the original ones. + """ + + first_offset: int + next_offset: int + count: int + deduplicated: bool = False @dataclass(frozen=True) @@ -185,13 +206,14 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: - """Append messages and return the offset the first one landed at. + ) -> Appended: + """Append messages and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than - appending twice. Without them the append is at-least-once, which is - only the right trade when duplicates are harmless. + appending twice, and says so. Without them the append is + at-least-once, which is only the right trade when duplicates are + harmless. """ response = await self._stub.AddMessages( stream.AddMessagesRequest( @@ -214,7 +236,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -352,7 +374,7 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: + ) -> Appended: """Append from outside the workflow, as :meth:`StreamHandle.append`. Batch where you can. The append costs one transition on the owning @@ -380,7 +402,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -479,3 +501,12 @@ async def describe(self) -> stream.StreamState: ) ) return response.frontend_response.state + + +def _appended(out: stream.AddMessagesOutput) -> Appended: + return Appended( + first_offset=out.first_offset, + next_offset=out.next_offset, + count=out.count, + deduplicated=out.deduplicated, + ) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 53d231174..f886d467b 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -8,21 +8,25 @@ from __future__ import annotations import asyncio -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any -from temporalio import activity, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._ids import inbound_stream_id from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_STATE = "__temporal_streams_state" +logger = logging.getLogger(__name__) + class _Fanout: """One server subscription, shared by every reader of that stream. @@ -104,18 +108,6 @@ async def publish(self, frame: bytes) -> None: workflow.add_stream_messages([frame], stream_id="", topic=self._topic) -def inbound_stream_id(workflow_id: str, stream: str) -> str: - """The server-side id of a workflow's inbound stream. - - A workflow names its streams relative to itself, so every provider can - address the same thing without workflow code knowing how it is stored. - Here that is a namespace-level stream id built from the pair, and the - workflow id rather than the run id because the stream has to survive - continue-as-new and reset. - """ - return f"{workflow_id}:{stream}" - - def _reject_configured_codec(client: Client) -> None: """Refuse a namespace whose payloads are meant to be encoded. @@ -200,8 +192,10 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append values and return where the first one landed.""" + async def append(self, *values: Any) -> Cursor | None: + """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + if not values: + return None frames = [] for value in values: frames.append( @@ -215,7 +209,7 @@ async def append(self, *values: Any) -> Cursor: ) ) self._sequence += 1 - offset = await self._handle.append( + appended = await self._handle.append( *frames, topic=self._topic, producer_id=self._provider_id, @@ -223,7 +217,9 @@ async def append(self, *values: Any) -> Cursor: # different job from telling readers that a new generation started. sequence=self._sequence - len(frames), ) - return Cursor(str(offset)) + if appended.deduplicated: + return None + return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: """Declare this stream complete.""" @@ -255,10 +251,16 @@ def _encode(self, value: Any) -> bytes: class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" - def __init__(self, handle: Any, converter: Any) -> None: - """Read the stream ``handle`` names, from anywhere.""" + def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: + """Read the stream ``handle`` names, from anywhere. + + ``stream`` is the inbound name the caller used, empty for the owner's + stream; ``address`` is what the server calls it, for log lines. + """ self._handle = handle self._converter = converter + self._stream = stream + self._address = address async def read( self, @@ -266,12 +268,13 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() async for message in self._handle.follow( from_offset=int(after.token) + 1 if after.token else 0 @@ -281,7 +284,11 @@ async def read( kind, frame_topic, source, attempt, sequence, body = _frame.decode( message.data ) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning( + "skipping record %s of stream %s: %s", cursor, self._address, error + ) continue if topic is not None and frame_topic != topic: continue @@ -373,22 +380,19 @@ async def producer( ) -> NativeProducer: """Open a producer on ``workflow_id``'s account. - ``stream`` names an inbound stream; with none, ``topic`` names a topic - on the stream the workflow publishes, which the server lets any - producer append to. Inside an activity, leave ``producer_id`` and - ``attempt`` unset: the activity's own id and attempt are the right - answer and are what let a reader tell a retry from a new generation. + ``stream`` names an inbound stream, a namespace-level stream the + server keys by the pair. With none, ``topic`` names a topic on the + stream the workflow publishes, which the server lets any producer + append to. An inbound record carries no topic: the stream's name is + its whole address. """ _reject_configured_codec(client) - if not producer_id: - producer_id = activity.info().activity_id - if not attempt: - attempt = activity.info().attempt streams = _stream_client(client) + converter = client.data_converter.payload_converter if not stream: return NativeProducer( streams.workflow_stream(workflow_id), - client.data_converter.payload_converter, + converter, topic, producer_id, attempt, @@ -404,13 +408,7 @@ async def producer( # exception. handle = streams.get(stream_id) _handles[stream_id] = handle - return NativeProducer( - handle, - client.data_converter.payload_converter, - stream, - producer_id, - attempt, - ) + return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( self, client: Client, *, workflow_id: str, stream: str = "" @@ -423,11 +421,14 @@ async def consumer( """ _reject_configured_codec(client) streams = _stream_client(client) + address = inbound_stream_id(workflow_id, stream) if stream: - handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + handle: Any = streams.get(address) else: handle = streams.workflow_stream(workflow_id) - return NativeConsumer(handle, client.data_converter.payload_converter) + return NativeConsumer( + handle, client.data_converter.payload_converter, stream, address + ) _provider.register("native", _NativeProvider) diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index 8d1a42f30..fde925cca 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -40,8 +40,10 @@ async def stream() -> AsyncIterator[StreamHandle]: async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - assert await stream.append(b"alpha", b"beta") == 0 - assert await stream.append(b"gamma") == 2 + first = await stream.append(b"alpha", b"beta") + assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) + assert not first.deduplicated + assert (await stream.append(b"gamma")).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: @@ -69,7 +71,10 @@ async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: first = await stream.append(b"once", producer_id="p1", sequence=1) retry = await stream.append(b"once", producer_id="p1", sequence=1) - assert first == retry == 0 + assert first.first_offset == retry.first_offset == 0 + assert not first.deduplicated + # The retry is told it wrote nothing, so a producer can report no position. + assert retry.deduplicated messages, _ = await stream.read() assert [m.data for m in messages] == [b"once"] From 4cc70ed1cce6a76a0bd9df0264a289a7074833a8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:22:26 -0700 Subject: [PATCH 194/831] Let a provider setup own the workflow the conformance cases address. A store keeps a workflow's stream with the workflow and refuses a producer on an execution that does not exist, so the case has to be handed one that does. --- tests/streams/test_streams_conformance.py | 39 +++++++++++++---------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 7d76d85d6..c4f30f832 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -4,10 +4,11 @@ tree can stand up. The memory provider always runs, with no server and no store. A storage provider adds itself to ``SETUPS`` behind its own ``STREAMS_LIVE`` gate: its setup configures the provider, hands back the -client the cases should use, and says which capabilities it lacks, so the -cases marked ``inbound_stream`` or ``unfiltered_read`` are skipped with a -reason on a provider that cannot do them. Every other case reads with a -topic, which is what a store that keys by topic needs. +client the cases should use and a workflow that exists for the case to +address, and says which capabilities it lacks, so the cases marked +``inbound_stream`` or ``unfiltered_read`` are skipped with a reason on a +provider that cannot do them. Every other case reads with a topic, which is +what a store that keys by topic needs. What this file pins down is the contract: framing, producer identity, retry deduplication, supersession, topic filtering, cursor resumption, and store @@ -38,6 +39,12 @@ class ProviderCase: name: str client: Any = None + workflow_id: str = "" + """The workflow whose streams the case addresses. + + A store keeps a workflow's stream with the workflow, so the setup makes + the execution exist before the case opens a producer on its account. + """ inbound_streams: bool = True """Outside producers may write a workflow's inbound stream.""" unfiltered_reads: bool = True @@ -47,7 +54,7 @@ class ProviderCase: async def _memory_case() -> AsyncIterator[ProviderCase]: memory.reset() streams.configure(provider="memory") - yield ProviderCase("memory") + yield ProviderCase("memory", workflow_id=new_workflow_id()) memory.reset() @@ -128,7 +135,7 @@ def test_inbound_stream_ids_cannot_collide(): async def test_append_read_roundtrip(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -154,7 +161,7 @@ async def test_append_read_roundtrip(provider: ProviderCase): @pytest.mark.inbound_stream async def test_inbound_records_carry_no_topic(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -178,7 +185,7 @@ async def test_inbound_records_carry_no_topic(provider: ProviderCase): async def test_retried_append_is_deduplicated(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id first = await streams.producer( provider.client, workflow_id=workflow_id, @@ -207,7 +214,7 @@ async def test_retried_append_is_deduplicated(provider: ProviderCase): async def test_new_attempt_supersedes_the_old_one(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id first = await streams.producer( provider.client, workflow_id=workflow_id, @@ -238,7 +245,7 @@ async def test_topic_filter_on_the_owners_stream(provider: ProviderCase): # Two producers on two topics of the stream the workflow publishes. The # filter is only meaningful on a store that mixes topics, which is this # one; an inbound stream carries none. - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id on_a = await streams.producer( provider.client, workflow_id=workflow_id, @@ -265,7 +272,7 @@ async def test_topic_filter_on_the_owners_stream(provider: ProviderCase): @pytest.mark.unfiltered_read async def test_a_read_without_a_topic_sees_every_topic(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id on_a = await streams.producer( provider.client, workflow_id=workflow_id, @@ -289,7 +296,7 @@ async def test_a_read_without_a_topic_sees_every_topic(provider: ProviderCase): async def test_cursor_resumes_where_it_points(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -313,7 +320,7 @@ async def test_cursor_resumes_where_it_points(provider: ProviderCase): async def test_append_cursor_names_the_last_record_of_the_batch( provider: ProviderCase, ): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -335,7 +342,7 @@ async def test_append_cursor_names_the_last_record_of_the_batch( async def test_latest_positions_a_reader_at_the_end(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -361,7 +368,7 @@ async def test_stream_addresses_with_colons_do_not_share_a_store( provider: ProviderCase, ): # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. - base = new_workflow_id() + base = provider.workflow_id left = await streams.producer( provider.client, workflow_id=f"{base}:x", stream="y", producer_id="l", attempt=1 ) @@ -386,7 +393,7 @@ async def test_stream_addresses_with_colons_do_not_share_a_store( async def test_producer_needs_exactly_one_address_and_an_identity( provider: ProviderCase, ): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id with pytest.raises(ValueError): await streams.producer( provider.client, workflow_id=workflow_id, producer_id="model", attempt=1 From 167d55401a4fc146e537c4220958d23bc39c3992 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:23:39 -0700 Subject: [PATCH 195/831] Registered the native provider in the conformance suite. Behind STREAMS_LIVE=native, against the server at TEMPORAL_ADDRESS. --- tests/streams/test_streams_conformance.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index c4f30f832..dc389a33e 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -19,6 +19,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Callable from dataclasses import dataclass @@ -27,6 +28,7 @@ import pytest from temporalio import streams +from temporalio.client import Client from temporalio.streams import _frame, _ids, _provider from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import Cursor, RecordKind @@ -58,7 +60,27 @@ async def _memory_case() -> AsyncIterator[ProviderCase]: memory.reset() +async def _native_case() -> AsyncIterator[ProviderCase]: + streams.configure(provider="native") + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) + # The execution only has to exist for the server to attach a stream to + # it; no worker ever picks the task up, and the case terminates it. + owner = await client.start_workflow( + "StreamOwner", + id=new_workflow_id(), + task_queue="streams-conformance-unserved", + ) + try: + yield ProviderCase("native", client, workflow_id=owner.id) + finally: + await owner.terminate("conformance case finished") + await streams.close() + + SETUPS: dict[str, Callable[[], AsyncIterator[ProviderCase]]] = {"memory": _memory_case} +if os.environ.get("STREAMS_LIVE") == "native": + # Needs a server built from the stream-carrying branch at TEMPORAL_ADDRESS. + SETUPS["native"] = _native_case _CAPABILITIES = { "inbound_stream": lambda case: case.inbound_streams, From 905e7eed98c0245e07a17443f29e612f21cd9117 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:26:36 -0700 Subject: [PATCH 196/831] Pinned native stream handles to a run and closed their channels. A handle on a workflow's stream resolves the run once when it opens, so a follower is not redirected to a successor's empty stream after continue-as-new. The channel cache is keyed by the loop object and closed through the provider's close hook, and latest() reads a missing stream as empty but lets every other failure through. --- temporalio/client_stream.py | 77 +++++++++++++++++++++++++- temporalio/streams/providers/native.py | 60 +++++++++++--------- 2 files changed, 108 insertions(+), 29 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1cd775043..15760a980 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,6 +23,8 @@ from __future__ import annotations +import asyncio +import weakref from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from typing import Any @@ -40,6 +42,8 @@ "StreamClient", "StreamHandle", "WorkflowStreamHandle", + "close_shared_clients", + "shared_client", ] @@ -164,7 +168,7 @@ def get(self, stream_id: str) -> "StreamHandle": return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( - self, workflow_id: str, name: str = "" + self, workflow_id: str, name: str = "", *, owner_run_id: str = "" ) -> "WorkflowStreamHandle": """Open a stream a workflow publishes to. @@ -177,8 +181,13 @@ def workflow_stream( does not exist yet is not an error: it reads as empty and a :meth:`WorkflowStreamHandle.follow` parked on it wakes when the workflow publishes. + + ``owner_run_id`` pins the handle to one run of the workflow; see + :meth:`WorkflowStreamHandle.pin` for why a follower wants that. """ - return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + return WorkflowStreamHandle( + self._stub, self._namespace, workflow_id, name, owner_run_id + ) class StreamHandle: @@ -350,13 +359,19 @@ class WorkflowStreamHandle: """ def __init__( - self, stub: Any, namespace: str, workflow_id: str, name: str = "" + self, + stub: Any, + namespace: str, + workflow_id: str, + name: str = "", + owner_run_id: str = "", ) -> None: """Prefer :meth:`StreamClient.workflow_stream`.""" self._stub = stub self._namespace = namespace self._workflow_id = workflow_id self._name = name + self._owner_run_id = owner_run_id @property def workflow_id(self) -> str: @@ -368,6 +383,25 @@ def name(self) -> str: """Name the owner publishes under, empty for its default stream.""" return self._name + @property + def owner_run_id(self) -> str: + """The run this handle is pinned to, empty while it follows the current run.""" + return self._owner_run_id + + def pin(self, run_id: str) -> None: + """Address one run of the workflow from now on. + + Unpinned, every call resolves to whichever run is current. A follower + holding an offset from one run would then be redirected when the + workflow continues as new: the successor's stream starts empty at + offset zero, so the server reads the follower's offset as "caught up", + parks it until the successor has published that many records, and + then skips exactly that many. Pinned, the run's end shows up as + ``closed`` on the page, and the caller decides whether to follow the + successor from the beginning. + """ + self._owner_run_id = run_id + async def append( self, *messages: bytes, @@ -386,6 +420,7 @@ async def append( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, messages=[ stream.StreamMessage( @@ -418,6 +453,7 @@ async def read( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -460,12 +496,14 @@ async def poll( :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. + On a pinned handle ``closed`` also says the run has ended. """ response = await self._stub.PollWorkflowMessages( stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -496,6 +534,7 @@ async def describe(self) -> stream.StreamState: frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, ) ) @@ -510,3 +549,35 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: count=out.count, deduplicated=out.deduplicated, ) + + +# One channel per loop, target and namespace, shared by every handle in the +# process. A channel is multiplexed and long lived, and callers open a handle +# per subscription, which would otherwise be a connection per subscription. The +# loop is the key because a grpc.aio channel belongs to the loop that made it, +# and it is held weakly so a loop that is gone cannot lend its channel to a +# successor that happens to reuse its id. +_shared: weakref.WeakKeyDictionary[ + asyncio.AbstractEventLoop, dict[tuple[str, str], StreamClient] +] = weakref.WeakKeyDictionary() + + +def shared_client(target_host: str, namespace: str) -> StreamClient: + """The process-wide client for ``target_host`` and ``namespace`` on this loop.""" + per_loop = _shared.setdefault(asyncio.get_running_loop(), {}) + key = (target_host, namespace) + existing = per_loop.get(key) + if existing is None: + existing = per_loop[key] = StreamClient.connect(target_host, namespace) + return existing + + +async def close_shared_clients() -> None: + """Close every shared client this loop opened. + + For a process that is done with streams, and for tests, which open a + loop per case and would otherwise leave a channel behind on each. + """ + per_loop = _shared.pop(asyncio.get_running_loop(), {}) + for client in per_loop.values(): + await client.close() diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f886d467b..6dfdd4c25 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -13,10 +13,12 @@ from datetime import timedelta from typing import Any +import grpc + from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.client_stream import StreamClient +from temporalio.client_stream import StreamClient, close_shared_clients, shared_client from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._ids import inbound_stream_id @@ -126,24 +128,23 @@ def _reject_configured_codec(client: Client) -> None: # stream reuses the handle rather than asking the server to create it again. # The second create is answered correctly, and it is still a failed call the # server logs, which is noise an operator has to learn to ignore. -_handles: dict[str, Any] = {} +_handles: dict[tuple[str, str, str], Any] = {} -# One channel per target and namespace, shared by every handle in the process. -# A channel is multiplexed and long lived, and callers open a handle per -# subscription, which would otherwise be a connection per subscription. -_channels: dict[tuple[int, str, str], StreamClient] = {} +def _stream_client(client: Client) -> StreamClient: + return shared_client(client.service_client.config.target_host, client.namespace) -def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _channels.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _channels[key] = existing - return existing +async def _owner_run(client: Client, workflow_id: str) -> str: + """The run whose stream a handle on ``workflow_id`` should address. + + Resolved once, when the handle opens. Left to the server, a follower whose + workflow continued as new would be redirected to the successor, whose + stream starts empty, and its offset read as "caught up" rather than as a + position on the run it was watching. A producer is pinned for the same + reason: an activity's output belongs to the run that scheduled it. + """ + return (await client.get_workflow_handle(workflow_id).describe()).run_id class NativeProducer: @@ -310,9 +311,12 @@ async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() - except Exception: + except grpc.aio.AioRpcError as error: # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. + # is the same answer as an empty one. Any other failure is not: + # a reader that took it for "empty" would replay the whole stream. + if error.code() is not grpc.StatusCode.NOT_FOUND: + raise return BEGINNING return ( Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING @@ -344,6 +348,10 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + async def close(self) -> None: + """Close the channels this process opened to the stream service.""" + await close_shared_clients() + def open_read( self, stream: str, @@ -390,15 +398,13 @@ async def producer( streams = _stream_client(client) converter = client.data_converter.payload_converter if not stream: - return NativeProducer( - streams.workflow_stream(workflow_id), - converter, - topic, - producer_id, - attempt, + handle: Any = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) ) + return NativeProducer(handle, converter, topic, producer_id, attempt) stream_id = inbound_stream_id(workflow_id, stream) - handle = _handles.get(stream_id) + key = (client.service_client.config.target_host, client.namespace, stream_id) + handle = _handles.get(key) if handle is None: try: handle = await streams.create(stream_id) @@ -407,7 +413,7 @@ async def producer( # stream it does not own is the ordinary case, not the # exception. handle = streams.get(stream_id) - _handles[stream_id] = handle + _handles[key] = handle return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( @@ -425,7 +431,9 @@ async def consumer( if stream: handle: Any = streams.get(address) else: - handle = streams.workflow_stream(workflow_id) + handle = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) + ) return NativeConsumer( handle, client.data_converter.payload_converter, stream, address ) From 4745373c61094fe291e16c8a5d5a67d53f2835de Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:28:14 -0700 Subject: [PATCH 197/831] Stopped the flusher without cancelling it and pinned the contrib client. A cancel landing inside the flusher's append unwound with the batch it had taken off the buffer. The client now asks it to stop and waits. The handle is pinned to the run it opened on, from the activity's own run id or one describe, and the channel cache is the shared one. --- temporalio/contrib/server_streams/__init__.py | 100 +++++++++++------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index c15184bf4..690402974 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -21,15 +21,15 @@ import asyncio import builtins -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass from datetime import timedelta from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.client import Client, WorkflowExecutionDescription +from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client from temporalio.converter import PayloadConverter __all__ = [ @@ -78,16 +78,15 @@ def _encode(converter: PayloadConverter, value: Any) -> bytes: The payload rather than the bare bytes, so the encoding metadata the consumer needs to decode into a type travels with it. - The codec chain is not applied. It cannot be applied here: a codec is async - and a Workflow publishing to a stream is not, so running one inside Workflow - code would be I/O on the Workflow thread. Regular payloads solve this in the - Worker, encoding on the way out and decoding on the way in, and a stream - needs the same plumbing before a codec can be honoured. - - It is not applied on the client path either, deliberately. Encoding one side - and not the other is worse than encoding neither: an Activity's messages - would reach a consuming Workflow as ciphertext it has no way to decode. - :func:`_reject_configured_codec` is what keeps that from happening quietly. + The codec chain is not applied here. Inside a Workflow it does not have to + be: the Worker runs the payload visitor with its codec over the commands + and activations, so a body that rides ``add_stream_messages`` is encoded + on the way out and one that arrives on ``deliver_stream_messages`` is + decoded on the way in, as every other payload is. The client path has no + such pass, and encoding one side but not the other is worse than encoding + neither: an Activity's messages would reach a consuming Workflow as + ciphertext it has no way to decode. :func:`_reject_configured_codec` + refuses a client with a codec until the client path applies one too. """ payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] return payload.SerializeToString() @@ -232,14 +231,22 @@ def __init__( handle: WorkflowStreamHandle, converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + *, + describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: - """Prefer :meth:`create` or :meth:`from_within_activity`.""" + """Prefer :meth:`create` or :meth:`from_within_activity`. + + ``describe`` is how an unpinned handle learns which run it follows; + see :meth:`WorkflowStreamHandle.pin`. + """ self._handle = handle self._converter = converter self._batch_interval = batch_interval + self._describe = describe self._buffered: list[tuple[str, Any]] = [] self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() + self._closed = False @classmethod def create( @@ -247,14 +254,24 @@ def create( client: Client, workflow_id: str, *, + owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, ) -> "WorkflowStreamClient": - """Open the stream owned by ``workflow_id``.""" + """Open the stream owned by ``workflow_id``. + + Without ``owner_run_id`` the current run is looked up on the first + call and the handle pinned to it, so a reader following across a + continue-as-new sees the run end rather than being moved to the + successor's stream at a stale offset. + """ _reject_configured_codec(client) return cls( - _stream_client(client).workflow_stream(workflow_id), + _stream_client(client).workflow_stream( + workflow_id, owner_run_id=owner_run_id + ), client.data_converter.payload_converter, batch_interval, + describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod @@ -262,13 +279,20 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - workflow_id = activity.info().workflow_id - if workflow_id is None: + info = activity.info() + if info.workflow_id is None: raise RuntimeError( "no Workflow stream to open: this Activity was not started by a " "Workflow" ) - return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) + # The Activity's output belongs to the run that scheduled it, and the + # Activity already knows which run that is. + return cls.create( + activity.client(), + info.workflow_id, + owner_run_id=info.workflow_run_id or "", + batch_interval=batch_interval, + ) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -279,17 +303,22 @@ async def __aexit__(self, *_exc: object) -> None: """Drain what is buffered before letting the caller go. An Activity that returned with a batch still buffered would have - reported work its readers never saw. + reported work its readers never saw. The flusher is asked to stop + rather than cancelled: a cancel landing inside its append would + unwind with the batch it had already taken off the buffer. """ + self._closed = True + self._wake.set() if self._flusher is not None: - self._flusher.cancel() - try: - await self._flusher - except asyncio.CancelledError: - pass + await self._flusher self._flusher = None await self.flush() + async def _pin(self) -> None: + if self._handle.owner_run_id or self._describe is None: + return + self._handle.pin((await self._describe()).run_id) + @overload def topic(self, name: str) -> TopicHandle[Any]: ... @@ -305,6 +334,7 @@ async def get_offset(self) -> int: A reader that wants only what comes next starts here. """ + await self._pin() return (await self._handle.describe()).head_offset async def subscribe( @@ -321,6 +351,7 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown + await self._pin() async for message in self._handle.follow( from_offset=from_offset, topics=topics ): @@ -342,6 +373,7 @@ async def poll_raw( For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. """ + await self._pin() page = await self._handle.poll( from_offset=from_offset, topics=topics, wait=wait ) @@ -360,6 +392,7 @@ async def flush(self) -> None: pending, self._buffered = self._buffered, [] if not pending: return + await self._pin() # One append per topic, because a batch carries a single topic. The # harness case is one topic, so this is one append. by_topic: dict[str, list[bytes]] = {} @@ -376,7 +409,7 @@ def _flush_soon(self) -> None: async def _run_flusher(self) -> None: """Append on a fixed cadence, so a slow producer still gets delivered.""" - while True: + while not self._closed: try: await asyncio.wait_for( self._wake.wait(), self._batch_interval.total_seconds() @@ -387,18 +420,5 @@ async def _run_flusher(self) -> None: await self.flush() -# One channel per target, shared by every handle in the process. The channel is -# multiplexed and long-lived, and callers here open a client per subscription, -# which would otherwise be a connection per subscription. -_clients: dict[tuple[int, str, str], StreamClient] = {} - - def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop too: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _clients.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _clients[key] = existing - return existing + return shared_client(client.service_client.config.target_host, client.namespace) From c673a34227afac116775efe8b23dfb188ff951f3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:23 -0700 Subject: [PATCH 198/831] Checked stream ranges for continuity and mirrored the byte limits. A range is recorded as consumed once and never resent, so a repeated, skipped or mis-sized delivery would hand the workflow duplicate or shifted bodies with nothing to say so. The worker also refuses a publish over the server's per-message and per-batch byte limits before the command exists, for the reason the count limit already gave. --- temporalio/worker/_workflow_instance.py | 53 +++++++++++++--- tests/worker/test_workflow_stream.py | 84 +++++++++++++++++++++++-- 2 files changed, 123 insertions(+), 14 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index f98e38a67..76710b382 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -270,10 +270,12 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# Match the server's per-batch limits. Rejecting here turns a wedged workflow, # which would replay and re-issue the same rejected command forever, into an # error the workflow author can see. _MAX_STREAM_MESSAGES_PER_BATCH = 1000 +_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +_MAX_STREAM_BATCH_BYTES = 2 << 20 class _StreamBuffer: @@ -285,15 +287,38 @@ class _StreamBuffer: dropped. """ - def __init__(self) -> None: + def __init__(self, stream_id: str = "") -> None: + self._stream_id = stream_id self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] self._waiters: list[asyncio.Future] = [] + # Where the next range has to start. Unknown until the first one + # arrives, because a subscription may start wherever the stream is and + # the server is the one that resolves that. + self._next_offset: int | None = None def extend( self, messages: Sequence[temporalio.api.stream.v1.StreamMessage], from_offset: int = 0, + to_offset: int | None = None, ) -> None: + if to_offset is None: + to_offset = from_offset + len(messages) + # A range is recorded as consumed once and never resent, so one that + # repeats, skips or mis-sizes would hand the workflow duplicate or + # shifted bodies with nothing to say so. Failing the task is what makes + # the fault visible. + if to_offset - from_offset != len(messages): + raise RuntimeError( + f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"for offsets [{from_offset}, {to_offset})" + ) + if self._next_offset is not None and from_offset != self._next_offset: + raise RuntimeError( + f"stream {self._stream_id!r} delivered offsets [{from_offset}, " + f"{to_offset}) but the last range ended at {self._next_offset}" + ) + self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. if not messages: @@ -1218,9 +1243,9 @@ def _apply_deliver_stream_messages( # Nothing subscribed. The range is already recorded as consumed and # will not be sent again, so buffering it is the only way a # subscription made later in the same task still sees it. - buffer = _StreamBuffer() + buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset) + buffer.extend(job.messages, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1388,9 +1413,9 @@ def get_info(self) -> temporalio.workflow.Info: def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: # Reissued on every replay, so the buffer has to exist before the first - # range arrives and the command has to be harmless the second time. The - # server treats a repeat subscription to the same stream as a no-op. - self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + # range arrives and the command has to be harmless the second time. A + # repeat subscription leaves the server-side cursor where it is. + self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) command = self._add_command() command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset @@ -1405,6 +1430,18 @@ def workflow_add_stream_messages( f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " f"got {len(messages)}" ) + total = 0 + for body in messages: + if len(body) > _MAX_STREAM_MESSAGE_BYTES: + raise ValueError( + f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " + f"bytes, got {len(body)}" + ) + total += len(body) + if total > _MAX_STREAM_BATCH_BYTES: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" + ) command = self._add_command() command.add_stream_messages.stream_id = stream_id for body in messages: @@ -1432,7 +1469,7 @@ async def workflow_read_stream_messages( # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. self._assert_not_read_only("read stream") - buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) while not len(buffer): await buffer.wait_future() taken = buffer.take() diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 1d154b37c..93b596b8c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -15,10 +15,14 @@ import temporalio.api.common.v1 import temporalio.api.stream.v1 as api_stream +from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( + _MAX_STREAM_BATCH_BYTES, + _MAX_STREAM_MESSAGE_BYTES, _StreamBuffer, _WorkflowInstanceImpl, ) +from temporalio.workflow import ReadOnlyContextError def message(body: bytes) -> api_stream.StreamMessage: @@ -78,12 +82,13 @@ class _ReadOnlyStub: workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages - def __init__(self) -> None: + def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} - self.read_only_calls: list[str] = [] + self._read_only = read_only def _assert_not_read_only(self, action: str) -> None: - self.read_only_calls.append(action) + if self._read_only: + raise ReadOnlyContextError(f"cannot {action} in a read-only context") async def read(self, stream: str, max_messages: int) -> list[bytes]: instance: Any = self @@ -115,9 +120,76 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> # A query activation carries no ranges, so a read there would wait on a future # nothing can resolve and the query would time out saying nothing. async def test_read_is_refused_in_a_read_only_context() -> None: - stub = _ReadOnlyStub() + stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await stub.read("s", 0) - assert stub.read_only_calls == ["read stream"] + with pytest.raises(ReadOnlyContextError, match="read stream"): + await stub.read("s", 0) + # Refused before the buffer was touched, so the range is still there for + # the task that is allowed to read it. + assert len(stub._stream_buffers["s"]) == 1 + + +# A range is recorded as consumed once and never resent, so the buffer is the +# only place a repeated, skipped or mis-sized delivery can still be noticed. +async def test_ranges_have_to_abut_the_last_one() -> None: + buffer = _StreamBuffer("s") + buffer.extend([message(b"a"), message(b"b")], 0, 2) + # An empty range moves the expectation too: the server recorded it. + buffer.extend([], 2, 2) + buffer.extend([message(b"c")], 2, 3) + assert [m.offset for m in buffer.take()] == [0, 1, 2] + + with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): + buffer.extend([message(b"c")], 2, 3) + with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): + buffer.extend([message(b"f")], 5, 6) + + +async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: + buffer = _StreamBuffer("s") + with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): + buffer.extend([message(b"a"), message(b"b")], 0, 1) + assert len(buffer) == 0 + + +class _CommandStub: + """Drives the real publish path and keeps the commands it issued.""" + + workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + def _add_command(self) -> WorkflowCommand: + command = WorkflowCommand() + self.commands.append(command) + return command + + def publish(self, *bodies: bytes) -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + + +# The server refuses an oversized publish, and a refused command is reissued +# on every replay, so the limits have to be applied before the command exists. +def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): + stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) + assert len(stub.commands) == 1 + + +def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) + stub.publish(half, half) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): + stub.publish(half, half, b"x") + assert len(stub.commands) == 1 From 47946f7a928aea78ab25c047014ba2911ffb694b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:24 -0700 Subject: [PATCH 199/831] Corrected the subscribe docstring and two stale test comments. --- temporalio/workflow/_context.py | 7 ++++--- tests/contrib/test_server_streams.py | 2 -- tests/worker/test_workflow_stream_e2e.py | 7 ++----- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 423d77d01..5e3e38123 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -967,9 +967,10 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: """Subscribe this workflow to a stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: the server treats - a second subscription to the same stream as a no-op, which is what makes - calling it on every replay harmless. + and :func:`read_stream` returns them. Safe to call again: a second + subscription to a stream this run already consumes does not move its + cursor, though it does write one event. Calling it on every replay is + harmless because replay matches the command to the event already recorded. Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index e1fe84c77..9b339dfe4 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -82,8 +82,6 @@ async def test_both_producers_reach_one_subscriber() -> None: Emitting.run, tokens, id=wf_id, task_queue=task_queue ) - # Subscribed before the Workflow has published anything, which is what - # a consumer attaching to a session does. # Subscribed before the Workflow has published anything, which is what # a consumer attaching to a session does. stream = WorkflowStreamClient.create(client, wf_id) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 3ee38fef3..31296b2c8 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -32,11 +32,8 @@ STREAM = "output" -# Event type numbers rather than names: this SDK's api protos predate both -# events, so the attributes arrive as unknown fields and only the type is -# readable here. The server's own tests are where the offsets are asserted. -EVENT_STREAM_SUBSCRIBED = 61 -EVENT_STREAM_MESSAGES_ADDED = 62 +EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED +EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED @workflow.defn From a3f50cd551f520e065e2fe220109558a8477f12e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:28 -0700 Subject: [PATCH 200/831] Woke outside readers across threads and ignored idle_timeout in memory. A workflow's publish runs on the workflow thread, so waking a consumer parked on another loop needs call_soon_threadsafe. The memory provider also stops reading idle_timeout as its poll period, which gave the parameter a second meaning. --- temporalio/streams/providers/memory.py | 38 ++++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index f7e58ef44..7b6e74fdc 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -31,6 +31,13 @@ _DEFAULT_POLL = timedelta(milliseconds=100) +logger = logging.getLogger(__name__) + + +def _wake(future: asyncio.Future[None]) -> None: + if not future.done(): + future.set_result(None) + class _MemoryStream: def __init__(self) -> None: @@ -38,9 +45,16 @@ def __init__(self) -> None: # Dedupe identity is (producer#attempt, first sequence of the append), # the same pair the storage providers use. self.seen: dict[tuple[str, int], int] = {} - self._arrival = asyncio.Event() - - def append(self, frames: list[bytes], *, producer_id: str, sequence: int) -> int: + # Each waiter is parked with the loop it belongs to. A workflow's + # publish runs on the workflow thread, and waking a foreign loop's + # future from there needs call_soon_threadsafe or the loop stays + # blocked in select until unrelated I/O happens to wake it. + self._waiters: list[tuple[asyncio.AbstractEventLoop, asyncio.Future[None]]] = [] + + def append( + self, frames: list[bytes], *, producer_id: str, sequence: int + ) -> int | None: + """Store ``frames`` and return the first one's offset, or ``None`` for a repeat.""" key = (producer_id, sequence) already = self.seen.get(key) if already is not None: @@ -48,13 +62,17 @@ def append(self, frames: list[bytes], *, producer_id: str, sequence: int) -> int offset = len(self.frames) self.frames.extend(frames) self.seen[key] = offset - arrival, self._arrival = self._arrival, asyncio.Event() - arrival.set() + waiters, self._waiters = self._waiters, [] + for loop, future in waiters: + loop.call_soon_threadsafe(_wake, future) return offset async def wait_past(self, offset: int) -> None: while len(self.frames) <= offset: - await self._arrival.wait() + loop = asyncio.get_running_loop() + future: asyncio.Future[None] = loop.create_future() + self._waiters.append((loop, future)) + await future _streams: dict[str, _MemoryStream] = {} @@ -290,11 +308,13 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + # Ignored: this provider never releases the worker, it polls. Reading + # idle_timeout as the poll period would give the parameter a second + # meaning that a port copying the reference would copy too. + del idle_timeout store = _stream(_inbound_id(workflow.info().workflow_id, stream)) return _MemReadSource( - store, - int(after.token) + 1 if after.token else 0, - idle_timeout or self._poll, + store, int(after.token) + 1 if after.token else 0, self._poll ) def open_write(self, topic: str) -> WriteSink: From 528b811a1ee7419ea3c3ddf160a72aed5fba4124 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:28 -0700 Subject: [PATCH 201/831] Named the last record in append's cursor and allowed None for it. A caller resuming with read(after=appended) must see only what came later, so the cursor names the last record of the batch. None says nothing was written, or that the transport learns positions at read time. --- temporalio/streams/_provider.py | 11 ++++++++-- temporalio/streams/providers/memory.py | 15 ++++++++------ tests/streams/test_streams_conformance.py | 25 +++++++++++++++++++---- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 18e2bb983..e0011b0c7 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -48,8 +48,15 @@ def attempt(self) -> int: """The generation this producer is writing.""" ... - async def append(self, *values: Any) -> Cursor: - """Append values and return where the first one landed.""" + async def append(self, *values: Any) -> Cursor | None: + """Append values and return the cursor of the last one written. + + The last rather than the first, so ``read(after=appended)`` yields + only what came later. ``None`` when nothing was written, because the + batch was empty or a repeat the provider dropped, and on a transport + that learns positions only at read time; a caller that needs to + position itself on such a transport asks :meth:`Consumer.latest`. + """ ... async def finish(self) -> None: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 7b6e74fdc..2244069b8 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -56,9 +56,8 @@ def append( ) -> int | None: """Store ``frames`` and return the first one's offset, or ``None`` for a repeat.""" key = (producer_id, sequence) - already = self.seen.get(key) - if already is not None: - return already + if key in self.seen: + return None offset = len(self.frames) self.frames.extend(frames) self.seen[key] = offset @@ -177,8 +176,10 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append ``values`` and return the cursor of the last one.""" + async def append(self, *values: Any) -> Cursor | None: + """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + if not values: + return None frames = [] for value in values: frames.append( @@ -197,7 +198,9 @@ async def append(self, *values: Any) -> Cursor: producer_id=self._provider_id, sequence=self._sequence - len(frames), ) - return Cursor(str(offset)) + if offset is None: + return None + return Cursor(str(offset + len(frames) - 1)) async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 0c7818064..a0cae8fc7 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -98,17 +98,18 @@ async def test_retried_append_is_deduplicated(): ) await first.append({"id": "r1"}) # The retry of the same attempt starts its sequence over and appends the - # same record. The provider must not store it twice. + # same record. The provider must not store it twice, and says so by + # returning no position for what it dropped. retry = await streams.producer( None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 ) - await retry.append({"id": "r1"}) + assert await retry.append({"id": "r1"}) is None consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") records = await take(consumer.read(type=dict), 1) assert records[0].value == {"id": "r1"} - with pytest.raises(asyncio.TimeoutError): - await take(consumer.read(type=dict), 2, timeout=0.2) + # The store holds exactly the one record: the newest position is its cursor. + assert await consumer.latest() == records[0].cursor async def test_new_attempt_supersedes_the_old_one(): @@ -161,6 +162,22 @@ async def test_cursor_resumes_where_it_points(): assert [r.value for r in again] == [{"n": 2}, {"n": 3}] +async def test_append_cursor_names_the_last_record_of_the_batch(): + producer = await streams.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + assert appended is not None + await producer.append({"n": 4}) + + # A producer that resumes a reader after its own append must see only + # what came later, not the tail of the batch it just wrote. + consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") + records = await take(consumer.read(type=dict, after=appended), 1) + assert [r.value for r in records] == [{"n": 4}] + assert await producer.append() is None + + async def test_latest_positions_a_reader_at_the_end(): producer = await streams.producer( None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 From 217497f8f53508a14cbdaa9e240a3edd0b39e3f2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:28 -0700 Subject: [PATCH 202/831] Resolved producer identity once in the package. The activity defaulting rule is an interface rule, and every provider carried its own copy. --- temporalio/streams/_provider.py | 14 +++++++++++++- temporalio/streams/providers/memory.py | 5 ----- tests/streams/test_streams_conformance.py | 3 +++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index e0011b0c7..2d8e14f2b 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -14,6 +14,7 @@ from datetime import timedelta from typing import Any, Callable, Protocol +from temporalio import activity from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, StreamRecord @@ -148,7 +149,9 @@ async def producer( ``stream`` names one of the workflow's inbound streams. With no ``stream``, ``topic`` names a topic on the stream the workflow itself publishes, which is how an activity puts its live output next to the - workflow's own records for the same outside reader. + workflow's own records for the same outside reader. ``producer_id`` + is never empty here: the package resolved it, from the activity + context when the caller left it unset. """ ... @@ -312,6 +315,15 @@ async def producer( "name exactly one of stream (an inbound stream of the workflow) or " "topic (a topic on the stream the workflow publishes)" ) + if not producer_id: + if not activity.in_activity(): + raise ValueError( + "producer_id is required outside an activity; inside one it " + "defaults to the activity's id and attempt" + ) + info = activity.info() + producer_id = info.activity_id + attempt = attempt or info.attempt return await _current().producer( client, workflow_id=workflow_id, diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 2244069b8..64e8feb8f 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -334,11 +334,6 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> MemoryProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt # With no inbound stream named, the target is the store the workflow's # own writer appends to, and the frame carries the topic instead. return MemoryProducer( diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index a0cae8fc7..4db5b9fe9 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -210,6 +210,9 @@ async def test_producer_appends_onto_the_owners_topic(): with pytest.raises(ValueError): await streams.producer(None, workflow_id="wf", producer_id="model", attempt=1) + # Outside an activity there is no identity to fall back on. + with pytest.raises(ValueError, match="producer_id is required"): + await streams.producer(None, workflow_id="wf", stream="inputs") def test_unknown_provider_is_a_clear_error(): From 8495140aea9ce8bdf1cc4db4d4633512c593669e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:28 -0700 Subject: [PATCH 203/831] Required an explicit provider and exported instance. Building a provider is process setup. Workers resolve the default through worker_options(); workflow code that opens a stream before that gets a clear error instead of a racy lazy build. --- temporalio/streams/__init__.py | 8 ++++-- temporalio/streams/_provider.py | 33 ++++++++++++++++------- tests/streams/test_streams_conformance.py | 12 ++++++++- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index cd55ee9d4..ea0d86c81 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -33,7 +33,9 @@ :func:`configure` once before it opens a :func:`producer` or a :func:`consumer`, and passes :func:`worker_options` to its ``Worker`` and ``Replayer``. Those two calls are where a provider is named. Nothing else in -this module mentions one. +this module mentions one. Code that needs a second provider next to the +process default, such as a handler that serves one store while its process +talks to another, holds one from :func:`instance`. Reading somebody else's stream is out of scope for the first release. It is the topology neither prototype has evidence for, and leaving it out is what @@ -68,6 +70,7 @@ configure, consumer, drain, + instance, open_read, open_write, prepare, @@ -99,10 +102,11 @@ "configure", "consumer", "drain", + "instance", "prepare", "producer", - "worker_options", "reader", + "worker_options", "writer", ] diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 2d8e14f2b..b22dbbfd8 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -4,8 +4,8 @@ around it are shared, so every provider module is small: it implements :class:`StreamProvider` and registers a factory under a short name when it is imported. One :func:`configure` call decides which factory serves this -process; when exactly one provider is registered, it is the default and the -call can be omitted. +process; :func:`worker_options` makes the same choice for a worker when +exactly one provider is registered. """ from __future__ import annotations @@ -26,6 +26,7 @@ "configure", "consumer", "drain", + "instance", "open_read", "open_write", "prepare", @@ -158,7 +159,7 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> Consumer: - """Open a reader for what ``workflow_id`` publishes.""" + """Open a reader on ``workflow_id``'s own stream, or its inbound ``stream``.""" ... @@ -240,16 +241,25 @@ def instance(provider: str | None = None, **options: Any) -> StreamProvider: def _current() -> StreamProvider: - global _active if _active is None: - chosen = _make(None) - chosen.configure() - _active = chosen + # Building a provider is process setup. Doing it on the first + # workflow's thread would race a second workflow thread for the + # global and hide the choice inside workflow code. + raise RuntimeError( + "no stream provider is configured; call streams.configure() or " + "streams.worker_options() before opening a stream" + ) return _active def worker_options() -> dict[str, Any]: - """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + """What a ``Worker`` or ``Replayer`` needs to serve this provider. + + Every worker calls this, so it is where the default is resolved when + :func:`configure` was not called and exactly one provider is registered. + """ + if _active is None: + configure() return _current().worker_options() @@ -335,5 +345,10 @@ async def producer( async def consumer(client: Any, *, workflow_id: str, stream: str = "") -> Consumer: - """Open a reader for what ``workflow_id`` publishes.""" + """Open a reader on ``workflow_id``'s own stream, or its inbound ``stream``. + + With no ``stream`` the reader follows what the workflow publishes, topic + by topic. With one, it follows the inbound stream of that name, which is + how a process watches what producers hand the workflow. + """ return await _current().consumer(client, workflow_id=workflow_id, stream=stream) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 4db5b9fe9..3a69ea2dd 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -15,7 +15,7 @@ import pytest from temporalio import streams -from temporalio.streams import _frame +from temporalio.streams import _frame, _provider from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import Cursor, RecordKind from temporalio.streams.providers import memory @@ -218,3 +218,13 @@ async def test_producer_appends_onto_the_owners_topic(): def test_unknown_provider_is_a_clear_error(): with pytest.raises(RuntimeError, match="no stream provider 'nope'"): streams.configure(provider="nope") + + +async def test_opening_a_stream_needs_a_configured_provider(): + # Building a provider is process setup, so the first workflow's thread + # is not allowed to do it as a side effect of opening a stream. + _provider._active = None + with pytest.raises(RuntimeError, match="streams.configure"): + await streams.consumer(None, workflow_id="wf") + streams.configure(provider="memory") + assert await streams.consumer(None, workflow_id="wf") is not None From ad177b2570f9c2b3f2dd840648a61f95086c016f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 204/831] Typed the handles and records honestly. reader() and Consumer.read bind T through overloads, StreamRecord.value admits the control bodies it actually carries, writer() drops the type it ignored, and next() leaves the public surface. --- streams_demo/agent_loop.py | 3 ++- temporalio/streams/__init__.py | 33 ++++++++++++++++------- temporalio/streams/_handles.py | 13 +++------ temporalio/streams/_provider.py | 32 +++++++++++++++++++--- temporalio/streams/_record.py | 9 +++++-- temporalio/streams/providers/memory.py | 5 ++-- tests/streams/test_streams_conformance.py | 2 ++ 7 files changed, 70 insertions(+), 27 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index 79d92c367..0ab6831b5 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -59,7 +59,7 @@ async def run(self, limit: int) -> list[dict[str, Any]]: accepted = 0 try: async for record in inputs: - if record.kind is streams.RecordKind.SUPERSEDED: + if isinstance(record.value, streams.Supersession): # A newer attempt of the same producer started writing. The # decisions already published stand, so the workflow says so # rather than pretending they can be withdrawn. @@ -82,6 +82,7 @@ async def run(self, limit: int) -> list[dict[str, Any]]: # still writing. trace.append({"kind": "finish", "producer": record.producer}) break + assert isinstance(record.value, dict) decision = decide(record.value) await decisions.publish(decision) receipt = await workflow.execute_activity( diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index ea0d86c81..1f1f6acba 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -54,7 +54,7 @@ from __future__ import annotations from datetime import timedelta -from typing import Any, TypeVar +from typing import Any, TypeVar, overload from temporalio.streams._handles import ( ReadSource, @@ -113,6 +113,26 @@ T = TypeVar("T") +@overload +def reader( + stream: str, + *, + type: type[T], + after: Cursor = ..., + idle_timeout: timedelta | None = ..., +) -> StreamReader[T]: ... + + +@overload +def reader( + stream: str, + *, + type: None = None, + after: Cursor = ..., + idle_timeout: timedelta | None = ..., +) -> StreamReader[Any]: ... + + def reader( stream: str, *, @@ -145,21 +165,16 @@ def reader( ) -def writer(topic: str, *, type: type | None = None) -> StreamWriter[Any]: +def writer(topic: str) -> StreamWriter[Any]: """Publish to ``topic`` on the stream this workflow owns. Args: - topic: The topic name. - type: Declared for symmetry with :func:`reader` and for documentation. - Encoding follows the value. + topic: The topic name. Encoding follows each published value. """ - del type return StreamWriter(open_write(topic), topic) # Importing the package registers every provider whose dependencies are # present in this tree. Import order matters: the registry above must exist # before a provider module can register with it. -from temporalio.streams import ( - providers as _providers, # noqa: E402,F401 # pyright: ignore[reportUnusedImport] -) +from temporalio.streams import providers as providers # noqa: E402 diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py index a6dc9a073..24c6defa2 100644 --- a/temporalio/streams/_handles.py +++ b/temporalio/streams/_handles.py @@ -8,7 +8,7 @@ from __future__ import annotations from collections.abc import AsyncIterator -from typing import Any, Generic, Protocol, TypeVar +from typing import Any, Generic, Protocol, TypeVar, cast from temporalio import workflow from temporalio.api.common.v1 import Payload @@ -161,7 +161,7 @@ def __aiter__(self) -> AsyncIterator[StreamRecord[T]]: async def _iterate(self) -> AsyncIterator[StreamRecord[T]]: while not self._closed: try: - record = await self.next() + record = await self._next() except StopAsyncIteration: # The provider ended the subscription. Iteration stops rather # than raising, so a workflow that reads to the end of a @@ -173,14 +173,9 @@ async def values(self) -> AsyncIterator[T]: """Iterate the data values, dropping control records.""" async for record in self: if record.kind is RecordKind.DATA: - yield record.value + yield cast("T", record.value) - async def next(self) -> StreamRecord[T]: - """The next record, waiting for one if there is none buffered. - - Raises: - StopAsyncIteration: The provider ended the subscription. - """ + async def _next(self) -> StreamRecord[T]: while not self._pending: await self._fill() return self._pending.pop(0) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index b22dbbfd8..1f9dc727d 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -10,9 +10,9 @@ from __future__ import annotations -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator from datetime import timedelta -from typing import Any, Callable, Protocol +from typing import Any, Callable, Protocol, TypeVar, overload from temporalio import activity from temporalio.streams._handles import ReadSource, WriteSink @@ -36,6 +36,8 @@ "worker_options", ] +T = TypeVar("T") + class Producer(Protocol): """Appends to a stream from outside workflow code. @@ -69,19 +71,41 @@ async def finish(self) -> None: class Consumer(Protocol): """Reads a stream from outside workflow code, resumably.""" + @overload + def read( + self, + *, + after: Cursor = ..., + topic: str | None = ..., + type: type[T], + ) -> AsyncGenerator[StreamRecord[T], None]: ... + + @overload + def read( + self, + *, + after: Cursor = ..., + topic: str | None = ..., + type: None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: ... + def read( self, *, after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records after ``after`` as they arrive. ``BEGINNING`` yields everything the stream retains. Any other cursor came from a record this or another reader saw, and reading resumes just past it, so a reader that stores the last cursor it handled and - hands it back sees every record exactly once. + hands it back sees every record exactly once. ``topic`` filters the + stream the workflow publishes; an inbound stream has no topics, and + naming one there raises ``ValueError``. The result is a generator so + a caller that stops early can ``aclose()`` it and release whatever + the provider parked against the store. """ ... diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 4fd322189..5eb3e21e4 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -76,9 +76,14 @@ class Supersession: @dataclass(frozen=True) class StreamRecord(Generic[T]): - """One record as workflow code sees it.""" + """One record as workflow code sees it. - value: T + ``value`` follows ``kind``: a data record carries a ``T``, a supersession + carries the :class:`Supersession` it reports, and a finish marker carries + ``None``. Check ``kind`` before reading it. + """ + + value: T | Supersession | None cursor: Cursor kind: RecordKind = RecordKind.DATA topic: str = "" diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 64e8feb8f..fcf873184 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -17,7 +17,8 @@ from __future__ import annotations import asyncio -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any @@ -240,7 +241,7 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() offset = int(after.token) + 1 if after.token else 0 diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 3a69ea2dd..47b6e29d5 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -68,6 +68,7 @@ def test_supersession_is_synthesized_from_observations(): superseded = attempts.note("model", 2, Cursor("1")) assert superseded is not None assert superseded.kind is RecordKind.SUPERSEDED + assert isinstance(superseded.value, streams.Supersession) assert superseded.value.previous_attempt == 1 # The same attempt again is not a new generation. assert attempts.note("model", 2, Cursor("2")) is None @@ -126,6 +127,7 @@ async def test_new_attempt_supersedes_the_old_one(): records = await take(consumer.read(type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED + assert isinstance(records[1].value, streams.Supersession) assert records[1].value.previous_attempt == 1 assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From 952adfb69d042927ecdc08fc5ee05d72a09089e9 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 205/831] Kept topics off inbound frames and skipped unreadable frames with a warning. An inbound stream's name is its whole address, so its records carry no topic and a topic filter there is a ValueError on every provider. Both readers now skip a frame the interface did not write and log it, instead of one failing the task while the other drops it silently. --- temporalio/streams/__init__.py | 10 +++---- temporalio/streams/_handles.py | 27 ++++++++++--------- temporalio/streams/_provider.py | 16 ++++++++++++ temporalio/streams/_record.py | 1 + temporalio/streams/providers/memory.py | 15 +++++++---- tests/streams/test_streams_conformance.py | 32 ++++++++++++++++------- 6 files changed, 69 insertions(+), 32 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 1f1f6acba..ff2a75c61 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -137,7 +137,6 @@ def reader( stream: str, *, type: type | None = None, - topic: str | None = None, after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> StreamReader[Any]: @@ -147,10 +146,13 @@ def reader( removing or reordering one renumbers the waits after it. Gate a change behind :func:`temporalio.workflow.patched` as you would for a timer. + An inbound stream has no topics: its name is the whole address, and + every record on it arrives with an empty ``topic``. Topics belong to the + stream the workflow publishes, which :func:`consumer` reads from outside. + Args: stream: The inbound stream's name, relative to this workflow. type: The value type, used as the decode hint. - topic: Only records on this topic, or every topic when omitted. after: Resume after this record. Only honoured on the first subscription of a run, because after that the recorded cursor decides. @@ -159,9 +161,7 @@ def reader( provider's default. """ return StreamReader( - open_read(stream, after=after, idle_timeout=idle_timeout), - topic=topic, - type=type, + open_read(stream, after=after, idle_timeout=idle_timeout), type=type ) diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py index 24c6defa2..9571d6e0c 100644 --- a/temporalio/streams/_handles.py +++ b/temporalio/streams/_handles.py @@ -1,8 +1,8 @@ """The handles workflow code holds. Everything provider-specific sits behind the two protocols at the top. A -handle converts values, frames records, filters topics and synthesizes -supersession; a binding only moves bytes. +handle converts values, frames records and synthesizes supersession; a +provider only moves bytes. """ from __future__ import annotations @@ -131,7 +131,7 @@ async def finish(self) -> None: class StreamReader(Generic[T]): - """Reads a stream from inside workflow code. + """Reads an inbound stream from inside workflow code. Iterating yields every kind of record, including the supersession the reader synthesizes when a producer's newer attempt appears. Check @@ -139,16 +139,9 @@ class StreamReader(Generic[T]): wants data. """ - def __init__( - self, - source: ReadSource, - *, - topic: str | None = None, - type: type | None = None, - ) -> None: + def __init__(self, source: ReadSource, *, type: type | None = None) -> None: """Prefer :func:`temporalio.streams.reader`.""" self._source = source - self._topic = topic self._type = type self._pending: list[StreamRecord[Any]] = [] self._attempts = AttemptTracker() @@ -182,8 +175,16 @@ async def _next(self) -> StreamRecord[T]: async def _fill(self) -> None: for cursor, frame in await self._source.next_batch(): - kind, topic, producer, attempt, sequence, body = _frame.decode(frame) - if self._topic is not None and topic != self._topic: + try: + kind, topic, producer, attempt, sequence, body = _frame.decode(frame) + except ValueError as error: + # Skipped rather than raised: a poisoned record would + # otherwise fail this task on every retry and pin the + # workflow, while an outside reader of the same stream + # skips it. The two readers agree on the answer. + workflow.logger.warning( + "skipping stream record at %s: %s", cursor, error + ) continue superseded = self._attempts.note(producer, attempt, cursor) if superseded is not None: diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 1f9dc727d..a2506649f 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -23,6 +23,7 @@ "Producer", "StreamProvider", "StreamProviderLifecycle", + "check_topic", "configure", "consumer", "drain", @@ -328,6 +329,21 @@ def drain() -> None: release() +def check_topic(stream: str, topic: str | None) -> None: + """Reject a topic filter on an inbound stream. + + An inbound record carries no topic; the stream's name is its whole + address, so a filter there could only ever match nothing. Every provider + calls this at the top of its ``read`` so the answer is the same on all + of them. + """ + if stream and topic is not None: + raise ValueError( + f"inbound stream {stream!r} has no topics; topic= applies to the " + "stream the workflow publishes" + ) + + async def producer( client: Any, *, diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 5eb3e21e4..63f140aea 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -87,6 +87,7 @@ class StreamRecord(Generic[T]): cursor: Cursor kind: RecordKind = RecordKind.DATA topic: str = "" + """The topic on the owner's stream, or empty for an inbound record.""" producer: str = "" """Who wrote it, or empty when the owning workflow wrote it itself.""" attempt: int = 0 diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index fcf873184..ec1f78fc4 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -230,10 +230,11 @@ def _encode(self, value: Any) -> bytes: class MemoryConsumer: """The outside reader, with the shared supersession rule.""" - def __init__(self, store: _MemoryStream, converter: Any) -> None: + def __init__(self, store: _MemoryStream, converter: Any, stream: str) -> None: """Read whatever ``store`` holds, now and as it grows.""" self._store = store self._converter = converter + self._stream = stream async def read( self, @@ -243,6 +244,7 @@ async def read( type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() offset = int(after.token) + 1 if after.token else 0 while True: @@ -256,7 +258,9 @@ async def read( kind, frame_topic, source, attempt, sequence, body = _frame.decode( frame ) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) continue if topic is not None and frame_topic != topic: continue @@ -336,11 +340,12 @@ async def producer( attempt: int = 0, ) -> MemoryProducer: # With no inbound stream named, the target is the store the workflow's - # own writer appends to, and the frame carries the topic instead. + # own writer appends to, and the frame carries the topic. An inbound + # record carries none: the stream's name is its whole address. return MemoryProducer( _stream(_inbound_id(workflow_id, stream)), _converter(client), - stream or topic, + topic, producer_id, attempt, ) @@ -349,7 +354,7 @@ async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> MemoryConsumer: return MemoryConsumer( - _stream(_inbound_id(workflow_id, stream)), _converter(client) + _stream(_inbound_id(workflow_id, stream)), _converter(client), stream ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 47b6e29d5..61eea6b70 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -91,6 +91,8 @@ async def test_append_read_roundtrip(): assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] assert all(r.producer == "model" and r.attempt == 1 for r in records) assert [r.sequence for r in records] == [0, 1, 2] + # An inbound stream has no topics; its name is the whole address. + assert all(r.topic == "" for r in records) async def test_retried_append_is_deduplicated(): @@ -132,19 +134,31 @@ async def test_new_attempt_supersedes_the_old_one(): assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 -async def test_topic_filter(): - producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 +async def test_topic_filter_on_the_owners_stream(): + # Two producers on two topics of the stream the workflow publishes. The + # filter is only meaningful on a store that mixes topics, which is this + # one; an inbound stream carries none. + on_a = await streams.producer( + None, workflow_id="wf", topic="a", producer_id="tool-a", attempt=1 ) - await producer.append({"n": 1}) - other = await streams.producer( - None, workflow_id="wf", stream="other", producer_id="model", attempt=1 + await on_a.append({"n": 1}) + on_b = await streams.producer( + None, workflow_id="wf", topic="b", producer_id="tool-b", attempt=1 ) - await other.append({"n": 2}) + await on_b.append({"n": 2}) + + consumer = await streams.consumer(None, workflow_id="wf") + only_a = await take(consumer.read(type=dict, topic="a"), 1) + assert [r.value for r in only_a] == [{"n": 1}] + + both = await take(consumer.read(type=dict), 2) + assert [(r.topic, r.value) for r in both] == [("a", {"n": 1}), ("b", {"n": 2})] + +async def test_inbound_streams_have_no_topics(): consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict, topic="inputs"), 1) - assert records[0].value == {"n": 1} + with pytest.raises(ValueError, match="inbound stream 'inputs' has no topics"): + await take(consumer.read(type=dict, topic="inputs"), 1) async def test_cursor_resumes_where_it_points(): From 276cb15b3c54248d251340ef3cb64a8933d63509 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 206/831] Let a broken provider import surface instead of vanishing from the registry. --- temporalio/streams/providers/__init__.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py index dff94b250..c254db0fb 100644 --- a/temporalio/streams/providers/__init__.py +++ b/temporalio/streams/providers/__init__.py @@ -13,7 +13,13 @@ for _name in _KNOWN: try: __import__(f"{__name__}.{_name}") - except ImportError: - # This tree does not carry that provider. The registry error message - # lists what is actually available. - pass + except ModuleNotFoundError as error: + # Two things may be missing: the provider module itself, or a + # dependency from outside this package. A name missing inside + # temporalio is a broken provider, and hiding that would turn its + # traceback into "no such provider". + missing = error.name or "" + if missing != f"{__name__}.{_name}" and ( + not missing or missing.startswith("temporalio") + ): + raise From 785402dee2eb706157ed481f812aa5222fb647ee Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 207/831] Added the workflow-side conformance tests. The reader and writer handles run in a real workflow on the memory provider. Rule 1 and rule 2 are strict expected failures there, so a storage provider running this module turns them into passes. --- tests/streams/test_streams_conformance.py | 5 +- tests/streams/test_streams_workflow.py | 208 ++++++++++++++++++++++ 2 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 tests/streams/test_streams_workflow.py diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 61eea6b70..b66756af9 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -1,10 +1,11 @@ -"""Conformance tests for the stream contract. +"""Conformance tests for the stream contract's outside surface. Written against the public surface plus the in-memory reference provider, so they run with no server and no store. A storage provider reuses the same expectations through its own fixtures; what this file pins down is the contract: framing, producer identity, retry deduplication, supersession, -topic filtering, and cursor resumption. +topic filtering, and cursor resumption. The workflow-side handles and the +two rules about workflow tasks live in ``test_streams_workflow``. """ from __future__ import annotations diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py new file mode 100644 index 000000000..40487686d --- /dev/null +++ b/tests/streams/test_streams_workflow.py @@ -0,0 +1,208 @@ +"""Workflow-side conformance for the stream contract. + +Runs the reader and writer handles inside a real workflow on the memory +provider with a warm cache, and states the two rules about workflow tasks as +tests: a publish commits with its task (rule 1), and reads are recorded +observations that replay re-supplies (rule 2). The memory provider keeps +neither and says so in its docstring, so those two are strict expected +failures here. A storage provider that runs this module turns them into +passes; that is the measurement they exist for. +""" + +from __future__ import annotations + +import uuid +from typing import Any + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams.providers import memory +from temporalio.testing import WorkflowEnvironment +from temporalio.worker import Replayer +from tests.helpers import new_worker +from tests.streams.test_streams_conformance import take + +INPUTS = "inputs" +DECISIONS = "decisions" + + +@pytest.fixture(autouse=True) +def _fresh_memory_provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] + if env.supports_time_skipping: + pytest.skip( + "the memory provider polls on a timer, which time skipping turns into a spin" + ) + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + def __init__(self) -> None: + streams.prepare() + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = streams.reader(INPUTS, type=dict) + decisions = streams.writer(DECISIONS) + trace: list[dict[str, Any]] = [] + try: + async for record in inputs: + if isinstance(record.value, streams.Supersession): + trace.append( + { + "kind": "superseded", + "replaced": record.value.previous_attempt, + "attempt": record.value.attempt, + } + ) + await decisions.publish( + {"retracting_attempt": record.value.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer}) + break + assert isinstance(record.value, dict) + await decisions.publish({"decided": record.value["n"]}) + trace.append( + { + "kind": "decision", + "n": record.value["n"], + "attempt": record.attempt, + } + ) + finally: + inputs.close() + await decisions.finish() + # Twice on purpose: a finished topic stays finished, with one marker. + await decisions.finish() + streams.drain() + return trace + + +async def _run_the_loop(client: Client) -> tuple[Any, list[dict[str, Any]]]: + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, ContractLoop, **streams.worker_options()) as worker: + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + first = await streams.producer( + client, + workflow_id=workflow_id, + stream=INPUTS, + producer_id="model", + attempt=1, + ) + await first.append({"n": 1}, {"n": 2}) + second = await streams.producer( + client, + workflow_id=workflow_id, + stream=INPUTS, + producer_id="model", + attempt=2, + ) + await second.append({"n": 3}) + await second.finish() + trace = await handle.result() + return handle, trace + + +async def test_workflow_reads_decides_and_publishes(client: Client): + handle, trace = await _run_the_loop(client) + assert trace == [ + {"kind": "decision", "n": 1, "attempt": 1}, + {"kind": "decision", "n": 2, "attempt": 1}, + {"kind": "superseded", "replaced": 1, "attempt": 2}, + {"kind": "decision", "n": 3, "attempt": 2}, + {"kind": "finish", "producer": "model"}, + ] + + # The outside view of what the workflow published, on its own topic. + consumer = await streams.consumer(client, workflow_id=handle.id) + records = await take(consumer.read(type=dict, topic=DECISIONS), 5) + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"decided": 1}), + (RecordKind.DATA, {"decided": 2}), + (RecordKind.DATA, {"retracting_attempt": 1}), + (RecordKind.DATA, {"decided": 3}), + (RecordKind.FINISH, None), + ] + assert all(r.producer == "" and r.topic == DECISIONS for r in records) + # The second finish() wrote nothing: the marker is the newest record. + assert await consumer.latest() == records[-1].cursor + + +@pytest.mark.xfail( + strict=True, + reason=( + "rule 2: reading is a recorded observation, so replaying the history " + "with the store gone must re-supply the same records; the memory " + "provider reads live process memory instead" + ), +) +async def test_replay_without_the_store_resupplies_the_records(client: Client): + handle, _ = await _run_the_loop(client) + history = await handle.fetch_history() + + memory.reset() + replayer = Replayer(workflows=[ContractLoop], **streams.worker_options()) + await replayer.replay_workflow(history) + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + def __init__(self) -> None: + streams.prepare() + + @workflow.run + async def run(self) -> None: + decisions = streams.writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + await decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + await decisions.finish() + streams.drain() + + +@pytest.mark.xfail( + strict=True, + reason=( + "rule 1: a publish commits with its workflow task, so no reader sees " + "a record from a task that failed; the memory provider makes it " + "visible at publish time" + ), +) +async def test_a_failed_task_publishes_nothing(client: Client): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker( + client, PublishThenFail, **streams.worker_options() + ) as worker: + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=worker.task_queue + ) + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic=DECISIONS), 2, timeout=30) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] From 73256437fd666a641d077d2f5c78aec9e969f61e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:41:29 -0700 Subject: [PATCH 208/831] Replaced stale wording and renamed the demo types. --- streams_demo/agent_loop.py | 6 +++--- streams_demo/run_demo.py | 4 ++-- temporalio/streams/__init__.py | 10 +++++----- temporalio/streams/_frame.py | 6 +++--- temporalio/streams/_handles.py | 6 +++--- temporalio/streams/_record.py | 7 ++++--- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index 0ab6831b5..f6f14b873 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -1,4 +1,4 @@ -"""One agent loop, written once, run on both stream providers. +"""One agent loop, written once, run on every stream provider. Reads input, decides on it, publishes the decision, and runs an ordinary Activity in the same workflow task. Also handles the two control records the @@ -20,7 +20,7 @@ INPUTS = "inputs" -@activity.defn(name="AI198RecordDecision") +@activity.defn(name="RecordDecision") async def record_decision(decision: dict[str, Any]) -> str: """An ordinary command in the same task as the publish.""" return f"recorded:{decision['source']}:{decision['branch']}" @@ -37,7 +37,7 @@ def decide(token: dict[str, Any]) -> dict[str, Any]: return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} -@workflow.defn(name="AI198StreamContractDemo", sandboxed=False) +@workflow.defn(name="StreamContractDemo", sandboxed=False) class AgentLoop: """Read, decide, write, until the producer says it has finished.""" diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 9d6a62cb5..c4fc8e042 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -1,6 +1,6 @@ """Run the shared agent loop against whichever provider is configured. -Three cases, the same on both providers: +Three cases, the same on every provider: - read, decide, publish and an ordinary Activity in the same workflow task, with the smallest workflow cache the provider supports, so that as much of @@ -9,7 +9,7 @@ to report and the workflow has to act on; - an outside consumer reading what the workflow published. -Byte-identical in both trees. ``provider_setup`` is what differs, and it is +Byte-identical in every tree. ``provider_setup`` is what differs, and it is the only import here that names a provider. """ diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index ff2a75c61..c46a9faf0 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -38,17 +38,17 @@ talks to another, holds one from :func:`instance`. Reading somebody else's stream is out of scope for the first release. It is -the topology neither prototype has evidence for, and leaving it out is what -lets both of them implement the rest. +the topology no provider has evidence for, and leaving it out is what lets +every provider implement the rest. What the contract does not promise: that a :attr:`RecordKind.FINISH` record means the writing activity succeeded, that a superseded attempt's records can be withdrawn, or that a stream outlives the retention its provider is configured for. -Prototype support for AI-198. The public names are the proposal; providers -live under :mod:`temporalio.streams.providers`, one module each, registered -by name and chosen by :func:`configure`. Everything else is shared. +The public names are the proposal; providers live under +:mod:`temporalio.streams.providers`, one module each, registered by name and +chosen by :func:`configure`. Everything else is shared. """ from __future__ import annotations diff --git a/temporalio/streams/_frame.py b/temporalio/streams/_frame.py index c32811d32..df4b4dbd6 100644 --- a/temporalio/streams/_frame.py +++ b/temporalio/streams/_frame.py @@ -1,9 +1,9 @@ -"""The record envelope both bindings put on the wire. +"""The record envelope every provider puts on the wire. A provider stores an opaque body. The contract needs more than a body: which topic a record belongs to, whether it is data or a terminal marker, and which -producer attempt wrote it. Neither prototype carries all of that in a channel -of its own, so the interface carries it here and each binding stores the result +producer attempt wrote it. No provider carries all of that in a channel of +its own, so the interface carries it here and each provider stores the result as an ordinary body. Encoding is synchronous and deterministic because a workflow publishes on the diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py index 9571d6e0c..6d821f32c 100644 --- a/temporalio/streams/_handles.py +++ b/temporalio/streams/_handles.py @@ -72,9 +72,9 @@ def _decode_value(body: bytes, as_type: type | None) -> Any: class StreamWriter(Generic[T]): """Publishes to a topic on the stream this workflow owns. - A workflow can only publish transactionally to a stream it owns, on both - providers. Writing to somebody else's stream is an activity's job, and it - gets the weaker guarantee that goes with doing I/O. + A workflow can only publish transactionally to a stream it owns, on + every provider. Writing to somebody else's stream is an activity's job, + and it gets the weaker guarantee that goes with doing I/O. """ def __init__(self, sink: WriteSink, topic: str) -> None: diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 63f140aea..1f08302a8 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -1,6 +1,6 @@ """The value types the stream contract is expressed in. -Nothing here touches Temporal or a provider, so both bindings share it +Nothing here touches Temporal or a provider, so every provider shares it unchanged. """ @@ -39,8 +39,9 @@ class RecordKind(enum.IntEnum): SUPERSEDED = 3 """A later attempt of the same producer started writing. - Synthesized by the reader from what it observed, so both providers deliver - it identically and replay reproduces it without the provider's help. + Synthesized by the reader from what it observed, so every provider + delivers it identically and replay reproduces it without the provider's + help. """ From 0c7616c8df66f410be16ac9206124a51476a66db Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:09:22 -0700 Subject: [PATCH 209/831] Keyed stores by one helper that survives a colon in the workflow id. Joining the workflow id and the stream name with a bare colon let two addresses share a store. Every provider that keys by the pair now goes through stream_key, which percent-encodes both components first. --- temporalio/streams/_ids.py | 28 ++++++++++++++++++++++++++ temporalio/streams/providers/memory.py | 13 +++++------- 2 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 temporalio/streams/_ids.py diff --git a/temporalio/streams/_ids.py b/temporalio/streams/_ids.py new file mode 100644 index 000000000..625522f75 --- /dev/null +++ b/temporalio/streams/_ids.py @@ -0,0 +1,28 @@ +"""The store key a provider derives from a workflow id and a stream name. + +A workflow id may contain any character, ``:`` included, so joining the pair +with a bare ``:`` is ambiguous: ``("a:b", "c")`` and ``("a", "b:c")`` would +land in one store. Every provider that keys a store by the pair goes through +:func:`stream_key`, so they all agree and none of them collides. +""" + +from __future__ import annotations + +__all__ = ["stream_key"] + + +def _escape(component: str) -> str: + # Percent first, so an escaped component cannot be mistaken for one that + # already contained the escape. + return component.replace("%", "%25").replace(":", "%3A") + + +def stream_key(workflow_id: str, stream: str) -> str: + """The key for ``stream`` of ``workflow_id``, or for the owner's stream when empty. + + Both components are percent-encoded before joining, so the only bare ``:`` + in the result is the separator, and an owner-stream key has none. + """ + if not stream: + return _escape(workflow_id) + return f"{_escape(workflow_id)}:{_escape(stream)}" diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index ec1f78fc4..390c10b9c 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -27,6 +27,7 @@ from temporalio.api.common.v1 import Payload from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._ids import stream_key from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -90,10 +91,6 @@ def reset() -> None: _streams.clear() -def _inbound_id(workflow_id: str, stream: str) -> str: - return f"{workflow_id}:{stream}" if stream else workflow_id - - def _converter(client: Any) -> Any: if client is None: return temporalio.converter.DataConverter.default.payload_converter @@ -320,13 +317,13 @@ def open_read( # idle_timeout as the poll period would give the parameter a second # meaning that a port copying the reference would copy too. del idle_timeout - store = _stream(_inbound_id(workflow.info().workflow_id, stream)) + store = _stream(stream_key(workflow.info().workflow_id, stream)) return _MemReadSource( store, int(after.token) + 1 if after.token else 0, self._poll ) def open_write(self, topic: str) -> WriteSink: - store = _stream(_inbound_id(workflow.info().workflow_id, "")) + store = _stream(stream_key(workflow.info().workflow_id, "")) return _MemWriteSink(store, topic) async def producer( @@ -343,7 +340,7 @@ async def producer( # own writer appends to, and the frame carries the topic. An inbound # record carries none: the stream's name is its whole address. return MemoryProducer( - _stream(_inbound_id(workflow_id, stream)), + _stream(stream_key(workflow_id, stream)), _converter(client), topic, producer_id, @@ -354,7 +351,7 @@ async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> MemoryConsumer: return MemoryConsumer( - _stream(_inbound_id(workflow_id, stream)), _converter(client), stream + _stream(stream_key(workflow_id, stream)), _converter(client), stream ) From 836873534186e32594937e4401b15654f440caa8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:09:22 -0700 Subject: [PATCH 210/831] Added an async close hook next to prepare and drain. A provider that holds a connection pool or an HTTP session needs a moment where the process says it is done. It is a no-op when nothing is configured, so a shutdown path can call it unconditionally. --- temporalio/streams/__init__.py | 10 ++++++++++ temporalio/streams/_provider.py | 30 +++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index c46a9faf0..f564135fd 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -37,6 +37,14 @@ process default, such as a handler that serves one store while its process talks to another, holds one from :func:`instance`. +Three lifecycle hooks let a provider borrow the caller's lifetime, and each +is a no-op on a provider that needs nothing, so portable code calls all +three unconditionally: :func:`prepare` from the workflow's constructor, for a +transport that registers handlers on the workflow; :func:`drain` before the +workflow returns, for one that parks readers against the run; and +:func:`close`, awaited when the process is done with streams, for one that +holds connections. + Reading somebody else's stream is out of scope for the first release. It is the topology no provider has evidence for, and leaving it out is what lets every provider implement the rest. @@ -67,6 +75,7 @@ Producer, StreamProvider, StreamProviderLifecycle, + close, configure, consumer, drain, @@ -99,6 +108,7 @@ "StreamWriter", "Supersession", "WriteSink", + "close", "configure", "consumer", "drain", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index a2506649f..89e32a2c7 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -24,6 +24,7 @@ "StreamProvider", "StreamProviderLifecycle", "check_topic", + "close", "configure", "consumer", "drain", @@ -191,9 +192,10 @@ async def consumer( class StreamProviderLifecycle(Protocol): """The hooks a provider adds when it needs the workflow's own lifetime. - Separate from :class:`StreamProvider` because most transports need - neither, and a provider is not asked to carry a pair of empty methods to - say so. :func:`prepare` and :func:`drain` call whichever half is present. + Separate from :class:`StreamProvider` because most transports need none + of them, and a provider is not asked to carry empty methods to say so. + :func:`prepare`, :func:`drain` and :func:`close` each call the hook when + the provider defines it. """ def prepare(self) -> None: @@ -214,6 +216,14 @@ def drain(self) -> None: """ ... + async def close(self) -> None: + """Release what this provider holds for the process. + + A provider that keeps a connection pool or an HTTP session open needs + a moment where the process says it is done; this is it. + """ + ... + _factories: dict[str, Callable[[], StreamProvider]] = {} _active: StreamProvider | None = None @@ -329,6 +339,20 @@ def drain() -> None: release() +async def close() -> None: + """Release what the provider holds for this process. + + Await it when the process is done with streams. It is a no-op on + providers that hold nothing, and on a process that never configured one, + so a shutdown path can call it unconditionally. + """ + if _active is None: + return + release = getattr(_active, "close", None) + if release is not None: + await release() + + def check_topic(stream: str, topic: str | None) -> None: """Reject a topic filter on an inbound stream. From e3522aee6434c1556613703ea7256b2a54c81e4a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:09:22 -0700 Subject: [PATCH 211/831] Parametrised the conformance suite over providers. The memory provider always runs; a store branch registers its own setup behind its STREAMS_LIVE gate and declares the capabilities it lacks, which the fixture turns into skips with a reason. Cases read with a topic wherever they can, and two new cases prove colon-bearing addresses never share a store. --- tests/streams/conftest.py | 12 + tests/streams/test_streams_conformance.py | 309 +++++++++++++++++----- 2 files changed, 255 insertions(+), 66 deletions(-) create mode 100644 tests/streams/conftest.py diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py new file mode 100644 index 000000000..1758f2598 --- /dev/null +++ b/tests/streams/conftest.py @@ -0,0 +1,12 @@ +import pytest + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "inbound_stream: the case writes a workflow's inbound stream from outside", + ) + config.addinivalue_line( + "markers", + "unfiltered_read: the case reads the owner's stream without naming a topic", + ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index b66756af9..0a50ce2cb 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -1,35 +1,79 @@ """Conformance tests for the stream contract's outside surface. -Written against the public surface plus the in-memory reference provider, so -they run with no server and no store. A storage provider reuses the same -expectations through its own fixtures; what this file pins down is the -contract: framing, producer identity, retry deduplication, supersession, -topic filtering, and cursor resumption. The workflow-side handles and the -two rules about workflow tasks live in ``test_streams_workflow``. +Written against the public surface, parametrised over the providers this +tree can stand up. The memory provider always runs, with no server and no +store. A storage provider adds itself to ``SETUPS`` behind its own +``STREAMS_LIVE`` gate: its setup configures the provider, hands back the +client the cases should use, and says which capabilities it lacks, so the +cases marked ``inbound_stream`` or ``unfiltered_read`` are skipped with a +reason on a provider that cannot do them. Every other case reads with a +topic, which is what a store that keys by topic needs. + +What this file pins down is the contract: framing, producer identity, retry +deduplication, supersession, topic filtering, cursor resumption, and store +keys that cannot collide. The workflow-side handles and the two rules about +workflow tasks live in ``test_streams_workflow``. """ from __future__ import annotations import asyncio +import uuid +from collections.abc import AsyncIterator, Callable +from dataclasses import dataclass from typing import Any import pytest from temporalio import streams -from temporalio.streams import _frame, _provider +from temporalio.streams import _frame, _ids, _provider from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import Cursor, RecordKind from temporalio.streams.providers import memory -@pytest.fixture(autouse=True) -def _fresh_memory_provider(): # pyright: ignore[reportUnusedFunction] +@dataclass +class ProviderCase: + """One provider under test, and what the cases may ask of it.""" + + name: str + client: Any = None + inbound_streams: bool = True + """Outside producers may write a workflow's inbound stream.""" + unfiltered_reads: bool = True + """A consumer may read the owner's stream without naming a topic.""" + + +async def _memory_case() -> AsyncIterator[ProviderCase]: memory.reset() streams.configure(provider="memory") - yield + yield ProviderCase("memory") memory.reset() +SETUPS: dict[str, Callable[[], AsyncIterator[ProviderCase]]] = {"memory": _memory_case} + +_CAPABILITIES = { + "inbound_stream": lambda case: case.inbound_streams, + "unfiltered_read": lambda case: case.unfiltered_reads, +} + + +@pytest.fixture(params=sorted(SETUPS)) +async def provider(request: pytest.FixtureRequest) -> AsyncIterator[ProviderCase]: + async for case in SETUPS[request.param](): + for marker, supported in _CAPABILITIES.items(): + if request.node.get_closest_marker(marker) and not supported(case): + pytest.skip(f"the {case.name} provider does not support {marker}") + yield case + + +def new_workflow_id() -> str: + # Unique per case, because a storage provider keeps what earlier cases + # wrote and the memory provider only happens to forget. + return f"wf-{uuid.uuid4().hex}" + + async def take(records: Any, count: int, timeout: float = 5.0) -> list: out: list = [] @@ -75,15 +119,28 @@ def test_supersession_is_synthesized_from_observations(): assert attempts.note("model", 2, Cursor("2")) is None -async def test_append_read_roundtrip(): +def test_stream_keys_cannot_collide(): + # A colon in a workflow id must not make two addresses one key. + assert _ids.stream_key("a:b", "c") != _ids.stream_key("a", "b:c") + assert _ids.stream_key("a:b", "") != _ids.stream_key("a", "b") + assert _ids.stream_key("a%3Ab", "c") != _ids.stream_key("a:b", "c") + assert _ids.stream_key("wf", "inputs") == "wf:inputs" + + +async def test_append_read_roundtrip(provider: ProviderCase): + workflow_id = new_workflow_id() producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) await producer.append({"id": "r1"}, {"id": "r2"}) await producer.finish() - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict), 3) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out"), 3) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -92,42 +149,84 @@ async def test_append_read_roundtrip(): assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] assert all(r.producer == "model" and r.attempt == 1 for r in records) assert [r.sequence for r in records] == [0, 1, 2] + assert all(r.topic == "out" for r in records) + + +@pytest.mark.inbound_stream +async def test_inbound_records_carry_no_topic(provider: ProviderCase): + workflow_id = new_workflow_id() + producer = await streams.producer( + provider.client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"id": "r1"}) + await producer.finish() + + consumer = await streams.consumer( + provider.client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 2) + assert [r.kind for r in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"id": "r1"} # An inbound stream has no topics; its name is the whole address. assert all(r.topic == "" for r in records) + with pytest.raises(ValueError, match="inbound stream 'inputs' has no topics"): + await take(consumer.read(type=dict, topic="inputs"), 1) -async def test_retried_append_is_deduplicated(): +async def test_retried_append_is_deduplicated(provider: ProviderCase): + workflow_id = new_workflow_id() first = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) await first.append({"id": "r1"}) # The retry of the same attempt starts its sequence over and appends the # same record. The provider must not store it twice, and says so by # returning no position for what it dropped. retry = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) assert await retry.append({"id": "r1"}) is None - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict), 1) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out"), 1) assert records[0].value == {"id": "r1"} # The store holds exactly the one record: the newest position is its cursor. - assert await consumer.latest() == records[0].cursor + assert await consumer.latest(topic="out") == records[0].cursor -async def test_new_attempt_supersedes_the_old_one(): +async def test_new_attempt_supersedes_the_old_one(provider: ProviderCase): + workflow_id = new_workflow_id() first = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) await first.append({"text": "The capital of"}) second = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=2 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=2, ) await second.append({"text": "Paris is the capital"}) - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict), 3) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out"), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED assert isinstance(records[1].value, streams.Supersession) @@ -135,101 +234,175 @@ async def test_new_attempt_supersedes_the_old_one(): assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 -async def test_topic_filter_on_the_owners_stream(): +async def test_topic_filter_on_the_owners_stream(provider: ProviderCase): # Two producers on two topics of the stream the workflow publishes. The # filter is only meaningful on a store that mixes topics, which is this # one; an inbound stream carries none. + workflow_id = new_workflow_id() on_a = await streams.producer( - None, workflow_id="wf", topic="a", producer_id="tool-a", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="a", + producer_id="tool-a", + attempt=1, ) await on_a.append({"n": 1}) on_b = await streams.producer( - None, workflow_id="wf", topic="b", producer_id="tool-b", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="b", + producer_id="tool-b", + attempt=1, ) await on_b.append({"n": 2}) - consumer = await streams.consumer(None, workflow_id="wf") + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) only_a = await take(consumer.read(type=dict, topic="a"), 1) - assert [r.value for r in only_a] == [{"n": 1}] + assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] + only_b = await take(consumer.read(type=dict, topic="b"), 1) + assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] - both = await take(consumer.read(type=dict), 2) - assert [(r.topic, r.value) for r in both] == [("a", {"n": 1}), ("b", {"n": 2})] +@pytest.mark.unfiltered_read +async def test_a_read_without_a_topic_sees_every_topic(provider: ProviderCase): + workflow_id = new_workflow_id() + on_a = await streams.producer( + provider.client, + workflow_id=workflow_id, + topic="a", + producer_id="tool-a", + attempt=1, + ) + await on_a.append({"n": 1}) + on_b = await streams.producer( + provider.client, + workflow_id=workflow_id, + topic="b", + producer_id="tool-b", + attempt=1, + ) + await on_b.append({"n": 2}) -async def test_inbound_streams_have_no_topics(): - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - with pytest.raises(ValueError, match="inbound stream 'inputs' has no topics"): - await take(consumer.read(type=dict, topic="inputs"), 1) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + both = await take(consumer.read(type=dict), 2) + assert [(r.topic, r.value) for r in both] == [("a", {"n": 1}), ("b", {"n": 2})] -async def test_cursor_resumes_where_it_points(): +async def test_cursor_resumes_where_it_points(provider: ProviderCase): + workflow_id = new_workflow_id() producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict), 3) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out"), 3) checkpoint = records[0].cursor # Resuming after a record hands back everything past it and nothing # twice, without the reader ever advancing a cursor itself. - resumed = await streams.consumer(None, workflow_id="wf", stream="inputs") - again = await take(resumed.read(type=dict, after=checkpoint), 2) + resumed = await streams.consumer(provider.client, workflow_id=workflow_id) + again = await take(resumed.read(type=dict, topic="out", after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] -async def test_append_cursor_names_the_last_record_of_the_batch(): +async def test_append_cursor_names_the_last_record_of_the_batch( + provider: ProviderCase, +): + workflow_id = new_workflow_id() producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - assert appended is not None + if appended is None: + pytest.skip(f"the {provider.name} provider learns positions at read time") await producer.append({"n": 4}) # A producer that resumes a reader after its own append must see only # what came later, not the tail of the batch it just wrote. - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - records = await take(consumer.read(type=dict, after=appended), 1) + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic="out", after=appended), 1) assert [r.value for r in records] == [{"n": 4}] assert await producer.append() is None -async def test_latest_positions_a_reader_at_the_end(): +async def test_latest_positions_a_reader_at_the_end(provider: ProviderCase): + workflow_id = new_workflow_id() producer = await streams.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + provider.client, + workflow_id=workflow_id, + topic="out", + producer_id="model", + attempt=1, ) - consumer = await streams.consumer(None, workflow_id="wf", stream="inputs") - assert await consumer.latest() == streams.BEGINNING + consumer = await streams.consumer(provider.client, workflow_id=workflow_id) + assert await consumer.latest(topic="out") == streams.BEGINNING await producer.append({"n": 1}, {"n": 2}) - since = await consumer.latest() + since = await consumer.latest(topic="out") await producer.append({"n": 3}) # A reader that positioned itself before the last append sees only what # came after, which is how a client follows a turn it is about to start. - records = await take(consumer.read(type=dict, after=since), 1) + records = await take(consumer.read(type=dict, topic="out", after=since), 1) assert [r.value for r in records] == [{"n": 3}] -async def test_producer_appends_onto_the_owners_topic(): - # An activity's live output lands on the same topic the workflow - # publishes, so one outside reader follows both. - producer = await streams.producer( - None, workflow_id="wf", topic="events", producer_id="model", attempt=1 +@pytest.mark.inbound_stream +async def test_stream_addresses_with_colons_do_not_share_a_store( + provider: ProviderCase, +): + # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. + base = new_workflow_id() + left = await streams.producer( + provider.client, workflow_id=f"{base}:x", stream="y", producer_id="l", attempt=1 ) - await producer.append({"delta": "hel"}, {"delta": "lo"}) - - consumer = await streams.consumer(None, workflow_id="wf") - records = await take(consumer.read(type=dict, topic="events"), 2) - assert [r.value["delta"] for r in records] == ["hel", "lo"] - assert {r.producer for r in records} == {"model"} + right = await streams.producer( + provider.client, workflow_id=base, stream="x:y", producer_id="r", attempt=1 + ) + await left.append({"side": "left"}) + await right.append({"side": "right"}) + seen_left = await streams.consumer( + provider.client, workflow_id=f"{base}:x", stream="y" + ) + only_left = await take(seen_left.read(type=dict), 1) + assert [r.value for r in only_left] == [{"side": "left"}] + assert await seen_left.latest() == only_left[0].cursor + seen_right = await streams.consumer(provider.client, workflow_id=base, stream="x:y") + only_right = await take(seen_right.read(type=dict), 1) + assert [r.value for r in only_right] == [{"side": "right"}] + assert await seen_right.latest() == only_right[0].cursor + + +async def test_producer_needs_exactly_one_address_and_an_identity( + provider: ProviderCase, +): + workflow_id = new_workflow_id() + with pytest.raises(ValueError): + await streams.producer( + provider.client, workflow_id=workflow_id, producer_id="model", attempt=1 + ) with pytest.raises(ValueError): - await streams.producer(None, workflow_id="wf", producer_id="model", attempt=1) + await streams.producer( + provider.client, + workflow_id=workflow_id, + stream="inputs", + topic="out", + producer_id="model", + attempt=1, + ) # Outside an activity there is no identity to fall back on. with pytest.raises(ValueError, match="producer_id is required"): - await streams.producer(None, workflow_id="wf", stream="inputs") + await streams.producer(provider.client, workflow_id=workflow_id, topic="out") def test_unknown_provider_is_a_clear_error(): @@ -243,5 +416,9 @@ async def test_opening_a_stream_needs_a_configured_provider(): _provider._active = None with pytest.raises(RuntimeError, match="streams.configure"): await streams.consumer(None, workflow_id="wf") + # Closing with nothing configured is allowed, so a shutdown path can + # call it unconditionally. + await streams.close() streams.configure(provider="memory") assert await streams.consumer(None, workflow_id="wf") is not None + await streams.close() From 66639ad780e53cf72ef1c5f866ba808eb6a5515a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:35:47 -0700 Subject: [PATCH 212/831] Recorded whether a provider reports a dropped repeat. A store whose append answers a repeat with the original position cannot return None for it without a second round trip; the case states what such a provider does instead. --- tests/streams/test_streams_conformance.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index dc389a33e..cac76969c 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -51,6 +51,13 @@ class ProviderCase: """Outside producers may write a workflow's inbound stream.""" unfiltered_reads: bool = True """A consumer may read the owner's stream without naming a topic.""" + reports_dropped_repeats: bool = True + """``append`` returns ``None`` for a repeat it dropped. + + A store that answers a repeat with the original position instead still + holds the record once; it just cannot say at append time that this call + wrote nothing. + """ async def _memory_case() -> AsyncIterator[ProviderCase]: @@ -218,7 +225,8 @@ async def test_retried_append_is_deduplicated(provider: ProviderCase): await first.append({"id": "r1"}) # The retry of the same attempt starts its sequence over and appends the # same record. The provider must not store it twice, and says so by - # returning no position for what it dropped. + # returning no position for what it dropped, or the original one when + # its store cannot tell the two apart at append time. retry = await streams.producer( provider.client, workflow_id=workflow_id, @@ -226,11 +234,15 @@ async def test_retried_append_is_deduplicated(provider: ProviderCase): producer_id="model", attempt=1, ) - assert await retry.append({"id": "r1"}) is None + dropped = await retry.append({"id": "r1"}) consumer = await streams.consumer(provider.client, workflow_id=workflow_id) records = await take(consumer.read(type=dict, topic="out"), 1) assert records[0].value == {"id": "r1"} + if provider.reports_dropped_repeats: + assert dropped is None + else: + assert dropped == records[0].cursor # The store holds exactly the one record: the newest position is its cursor. assert await consumer.latest(topic="out") == records[0].cursor From 31f6fc0658cdb1932cedb38bf6b7519b043746df Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:22:26 -0700 Subject: [PATCH 213/831] Let a provider setup own the workflow the conformance cases address. A store keeps a workflow's stream with the workflow and refuses a producer on an execution that does not exist, so the case has to be handed one that does. --- tests/streams/test_streams_conformance.py | 39 +++++++++++++---------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 0a50ce2cb..e51fddb78 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -4,10 +4,11 @@ tree can stand up. The memory provider always runs, with no server and no store. A storage provider adds itself to ``SETUPS`` behind its own ``STREAMS_LIVE`` gate: its setup configures the provider, hands back the -client the cases should use, and says which capabilities it lacks, so the -cases marked ``inbound_stream`` or ``unfiltered_read`` are skipped with a -reason on a provider that cannot do them. Every other case reads with a -topic, which is what a store that keys by topic needs. +client the cases should use and a workflow that exists for the case to +address, and says which capabilities it lacks, so the cases marked +``inbound_stream`` or ``unfiltered_read`` are skipped with a reason on a +provider that cannot do them. Every other case reads with a topic, which is +what a store that keys by topic needs. What this file pins down is the contract: framing, producer identity, retry deduplication, supersession, topic filtering, cursor resumption, and store @@ -38,6 +39,12 @@ class ProviderCase: name: str client: Any = None + workflow_id: str = "" + """The workflow whose streams the case addresses. + + A store keeps a workflow's stream with the workflow, so the setup makes + the execution exist before the case opens a producer on its account. + """ inbound_streams: bool = True """Outside producers may write a workflow's inbound stream.""" unfiltered_reads: bool = True @@ -47,7 +54,7 @@ class ProviderCase: async def _memory_case() -> AsyncIterator[ProviderCase]: memory.reset() streams.configure(provider="memory") - yield ProviderCase("memory") + yield ProviderCase("memory", workflow_id=new_workflow_id()) memory.reset() @@ -128,7 +135,7 @@ def test_stream_keys_cannot_collide(): async def test_append_read_roundtrip(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -154,7 +161,7 @@ async def test_append_read_roundtrip(provider: ProviderCase): @pytest.mark.inbound_stream async def test_inbound_records_carry_no_topic(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -178,7 +185,7 @@ async def test_inbound_records_carry_no_topic(provider: ProviderCase): async def test_retried_append_is_deduplicated(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id first = await streams.producer( provider.client, workflow_id=workflow_id, @@ -207,7 +214,7 @@ async def test_retried_append_is_deduplicated(provider: ProviderCase): async def test_new_attempt_supersedes_the_old_one(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id first = await streams.producer( provider.client, workflow_id=workflow_id, @@ -238,7 +245,7 @@ async def test_topic_filter_on_the_owners_stream(provider: ProviderCase): # Two producers on two topics of the stream the workflow publishes. The # filter is only meaningful on a store that mixes topics, which is this # one; an inbound stream carries none. - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id on_a = await streams.producer( provider.client, workflow_id=workflow_id, @@ -265,7 +272,7 @@ async def test_topic_filter_on_the_owners_stream(provider: ProviderCase): @pytest.mark.unfiltered_read async def test_a_read_without_a_topic_sees_every_topic(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id on_a = await streams.producer( provider.client, workflow_id=workflow_id, @@ -289,7 +296,7 @@ async def test_a_read_without_a_topic_sees_every_topic(provider: ProviderCase): async def test_cursor_resumes_where_it_points(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -313,7 +320,7 @@ async def test_cursor_resumes_where_it_points(provider: ProviderCase): async def test_append_cursor_names_the_last_record_of_the_batch( provider: ProviderCase, ): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -335,7 +342,7 @@ async def test_append_cursor_names_the_last_record_of_the_batch( async def test_latest_positions_a_reader_at_the_end(provider: ProviderCase): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id producer = await streams.producer( provider.client, workflow_id=workflow_id, @@ -361,7 +368,7 @@ async def test_stream_addresses_with_colons_do_not_share_a_store( provider: ProviderCase, ): # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. - base = new_workflow_id() + base = provider.workflow_id left = await streams.producer( provider.client, workflow_id=f"{base}:x", stream="y", producer_id="l", attempt=1 ) @@ -386,7 +393,7 @@ async def test_stream_addresses_with_colons_do_not_share_a_store( async def test_producer_needs_exactly_one_address_and_an_identity( provider: ProviderCase, ): - workflow_id = new_workflow_id() + workflow_id = provider.workflow_id with pytest.raises(ValueError): await streams.producer( provider.client, workflow_id=workflow_id, producer_id="model", attempt=1 From f507eefbb78be70fb24c0ddbca5ac0ba76c2cbca Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:35:47 -0700 Subject: [PATCH 214/831] Recorded whether a provider reports a dropped repeat. A store whose append answers a repeat with the original position cannot return None for it without a second round trip; the case states what such a provider does instead. --- tests/streams/test_streams_conformance.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index e51fddb78..35f65ad0e 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -49,6 +49,13 @@ class ProviderCase: """Outside producers may write a workflow's inbound stream.""" unfiltered_reads: bool = True """A consumer may read the owner's stream without naming a topic.""" + reports_dropped_repeats: bool = True + """``append`` returns ``None`` for a repeat it dropped. + + A store that answers a repeat with the original position instead still + holds the record once; it just cannot say at append time that this call + wrote nothing. + """ async def _memory_case() -> AsyncIterator[ProviderCase]: @@ -196,7 +203,8 @@ async def test_retried_append_is_deduplicated(provider: ProviderCase): await first.append({"id": "r1"}) # The retry of the same attempt starts its sequence over and appends the # same record. The provider must not store it twice, and says so by - # returning no position for what it dropped. + # returning no position for what it dropped, or the original one when + # its store cannot tell the two apart at append time. retry = await streams.producer( provider.client, workflow_id=workflow_id, @@ -204,11 +212,15 @@ async def test_retried_append_is_deduplicated(provider: ProviderCase): producer_id="model", attempt=1, ) - assert await retry.append({"id": "r1"}) is None + dropped = await retry.append({"id": "r1"}) consumer = await streams.consumer(provider.client, workflow_id=workflow_id) records = await take(consumer.read(type=dict, topic="out"), 1) assert records[0].value == {"id": "r1"} + if provider.reports_dropped_repeats: + assert dropped is None + else: + assert dropped == records[0].cursor # The store holds exactly the one record: the newest position is its cursor. assert await consumer.latest(topic="out") == records[0].cursor From 17bbcfa2aac293afe105c86083c9c8460f3f2f64 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:36:46 -0700 Subject: [PATCH 215/831] Dropped the committed demo output and corrected two comments. The run output named a provider this tree does not register, and run output churns on every run; the doc keeps the numbers. --- .gitignore | 3 + streams_demo/provider_setup.py | 7 +- streams_demo/results-external/history.json | 1040 ------------------- streams_demo/results-external/results.json | 107 -- temporalio/contrib/openai_agents/testing.py | 4 +- 5 files changed, 8 insertions(+), 1153 deletions(-) delete mode 100644 streams_demo/results-external/history.json delete mode 100644 streams_demo/results-external/results.json diff --git a/.gitignore b/.gitignore index 8cd439e05..42baf649d 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ temporalio/bridge/temporal_sdk_bridge* tags /.claude tmpclaude-* + +# Demo run output, written per provider; the numbers live in the doc. +streams_demo/results-*/ diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index 52ebbd266..aab3b6cfc 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -1,9 +1,8 @@ """Pick the provider for a demo run from the environment. -``STREAMS_PROVIDER`` names any registered provider; this base tree carries -only ``memory``, and each provider branch adds its own name. The demo needs a -Temporal server to run the workflow either way; ``TEMPORAL_ADDRESS`` points -at it. +``STREAMS_PROVIDER`` names any registered provider; this tree carries +``memory`` and ``redis``. The demo needs a Temporal server to run the +workflow either way; ``TEMPORAL_ADDRESS`` points at it. """ from __future__ import annotations diff --git a/streams_demo/results-external/history.json b/streams_demo/results-external/history.json deleted file mode 100644 index 1013bf0e7..000000000 --- a/streams_demo/results-external/history.json +++ /dev/null @@ -1,1040 +0,0 @@ -{ - "events": [ - { - "eventId": "1", - "eventTime": "2026-09-06T18:23:04.307989Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", - "taskId": "1052794", - "workflowExecutionStartedEventAttributes": { - "workflowType": { - "name": "AI198StreamContractDemo" - }, - "taskQueue": { - "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "kind": "TASK_QUEUE_KIND_NORMAL" - }, - "input": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "OA==" - } - ] - }, - "workflowTaskTimeout": "10s", - "originalExecutionRunId": "01a077f5-ac73-7f13-9fa6-ebc5c0821a69", - "identity": "34059@Mac.lan", - "firstExecutionRunId": "01a077f5-ac73-7f13-9fa6-ebc5c0821a69", - "attempt": 1, - "firstWorkflowTaskBackoff": "0s", - "workflowId": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "priority": {} - } - }, - { - "eventId": "2", - "eventTime": "2026-09-06T18:23:04.308024Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052795", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "kind": "TASK_QUEUE_KIND_NORMAL" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "3", - "eventTime": "2026-09-06T18:23:04.310387Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052800", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "2", - "identity": "34059@Mac.lan", - "requestId": "26ca0dc2-9c92-4899-9736-a16e48687a91", - "historySizeBytes": "406", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "4", - "eventTime": "2026-09-06T18:23:04.324822Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1052805", - "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "2", - "startedEventId": "3", - "identity": "34059@Mac.lan", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - }, - "sdkMetadata": { - "coreUsedFlags": [ - 1, - 2, - 3 - ], - "sdkName": "temporal-python", - "sdkVersion": "1.31.0" - }, - "meteringMetadata": {} - } - }, - { - "eventId": "5", - "eventTime": "2026-09-06T18:23:04.324847Z", - "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1052806", - "markerRecordedEventAttributes": { - "markerName": "core_external_stream", - "details": { - "external_stream": { - "payloads": [ - { - "metadata": { - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAEQARoECAEQASK+AQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAA1yZWRpcy1zdHJlYW1zAQIAAQIBAQ8xNzg4NzE4OTg0MzIyLTAPMTc4ODcxODk4NDMyMi0wAQABAwEBAQ8xNzg4NzE4OTg0MzIyLTAoBjKdAQgBEAEaIGV1MFlKZjgxdXJfTDZ0YU9lZUlxRVVJUzNsQnVGNzBaIAEqJDAxYTA3N2Y1LWFjNzMtN2YxMy05ZmE2LWViYzVjMDgyMWE2OTIyCglkZWNpc2lvbnMQARi0ASIgjBxO69u2MphhOmkhkT4NDYD9yThaPpqKHcAWa2oslZg6AwoBADoDCgEBQg1yZWRpcy1zdHJlYW1zSAE=" - } - ] - } - }, - "workflowTaskCompletedEventId": "4" - } - }, - { - "eventId": "6", - "eventTime": "2026-09-06T18:23:04.324856Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", - "taskId": "1052807", - "activityTaskScheduledEventAttributes": { - "activityId": "decision-r1", - "activityType": { - "name": "AI198RecordDecision" - }, - "taskQueue": { - "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "kind": "TASK_QUEUE_KIND_NORMAL" - }, - "header": {}, - "input": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "eyJicmFuY2giOiJvZGQiLCJjb21wdXRlZCI6MTAxLCJzb3VyY2UiOiJyMSJ9" - } - ] - }, - "scheduleToCloseTimeout": "0s", - "scheduleToStartTimeout": "0s", - "startToCloseTimeout": "10s", - "heartbeatTimeout": "0s", - "workflowTaskCompletedEventId": "4", - "retryPolicy": { - "initialInterval": "1s", - "backoffCoefficient": 2.0, - "maximumInterval": "100s" - }, - "useWorkflowBuildId": true, - "priority": {} - } - }, - { - "eventId": "7", - "eventTime": "2026-09-06T18:23:04.324868Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", - "taskId": "1052811", - "activityTaskStartedEventAttributes": { - "scheduledEventId": "6", - "identity": "34059@Mac.lan", - "requestId": "47dd481e-e301-4a50-b342-23ff777038be", - "attempt": 1, - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "8", - "eventTime": "2026-09-06T18:23:04.326319Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", - "taskId": "1052812", - "activityTaskCompletedEventAttributes": { - "result": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "InJlY29yZGVkOnIxOm9kZCI=" - } - ] - }, - "scheduledEventId": "6", - "startedEventId": "7", - "identity": "34059@Mac.lan" - } - }, - { - "eventId": "9", - "eventTime": "2026-09-06T18:23:04.326325Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052813", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", - "kind": "TASK_QUEUE_KIND_STICKY", - "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "10", - "eventTime": "2026-09-06T18:23:04.326970Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052817", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "9", - "identity": "34059@Mac.lan", - "requestId": "bd8c44cb-8931-4f15-be7f-9c0ef23bebf0", - "historySizeBytes": "1711", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "11", - "eventTime": "2026-09-06T18:23:04.334247Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1052823", - "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "9", - "startedEventId": "10", - "identity": "34059@Mac.lan", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - }, - "sdkMetadata": {}, - "meteringMetadata": {} - } - }, - { - "eventId": "12", - "eventTime": "2026-09-06T18:23:04.334266Z", - "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1052824", - "markerRecordedEventAttributes": { - "markerName": "core_external_stream", - "details": { - "external_stream": { - "payloads": [ - { - "metadata": { - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAEQAhoECAEQAiLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0MzIyLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODk4NDMzMi0wDzE3ODg3MTg5ODQzMzItMAEAAQMBAQEPMTc4ODcxODk4NDMzMi0wKAYynQEIARABGiAxUTNvYU1sREF6aXVQNkNwR3l5U1BRa3J2bVhuNGotUSAIKiQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkyMgoJZGVjaXNpb25zEAEYtAEiIEG2KSpLbvL+t7NXgoIazG7djtT9TCEi2Caa1YjB4xlZOgMKAQA6AwoBAUINcmVkaXMtc3RyZWFtc0gB" - } - ] - } - }, - "workflowTaskCompletedEventId": "11" - } - }, - { - "eventId": "13", - "eventTime": "2026-09-06T18:23:04.334272Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", - "taskId": "1052825", - "activityTaskScheduledEventAttributes": { - "activityId": "decision-r2", - "activityType": { - "name": "AI198RecordDecision" - }, - "taskQueue": { - "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "kind": "TASK_QUEUE_KIND_NORMAL" - }, - "header": {}, - "input": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "eyJicmFuY2giOiJldmVuIiwiY29tcHV0ZWQiOjIwLCJzb3VyY2UiOiJyMiJ9" - } - ] - }, - "scheduleToCloseTimeout": "0s", - "scheduleToStartTimeout": "0s", - "startToCloseTimeout": "10s", - "heartbeatTimeout": "0s", - "workflowTaskCompletedEventId": "11", - "retryPolicy": { - "initialInterval": "1s", - "backoffCoefficient": 2.0, - "maximumInterval": "100s" - }, - "useWorkflowBuildId": true, - "priority": {} - } - }, - { - "eventId": "14", - "eventTime": "2026-09-06T18:23:04.331874Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1052826", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZjUtYWM3My03ZjEzLTlmYTYtZWJjNWMwODIxYTY5Mgdtb2RlbCMx" - } - ] - }, - "identity": "34059@Mac.lan", - "requestId": "c70d6ed3-a072-5673-8c23-4d7fb2864d3f" - } - }, - { - "eventId": "15", - "eventTime": "2026-09-06T18:23:04.334287Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052827", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", - "kind": "TASK_QUEUE_KIND_STICKY", - "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "16", - "eventTime": "2026-09-06T18:23:04.334301Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052828", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "15", - "identity": "34059@Mac.lan", - "requestId": "request-from-RespondWorkflowTaskCompleted", - "historySizeBytes": "1831", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "17", - "eventTime": "2026-09-06T18:23:04.336066Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1052833", - "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "15", - "startedEventId": "16", - "identity": "34059@Mac.lan", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - }, - "sdkMetadata": {}, - "meteringMetadata": {} - } - }, - { - "eventId": "18", - "eventTime": "2026-09-06T18:23:04.336077Z", - "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1052834", - "markerRecordedEventAttributes": { - "markerName": "core_external_stream", - "details": { - "external_stream": { - "payloads": [ - { - "metadata": { - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAEQAhoECAEQAiKoAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0MzMyLTANcmVkaXMtc3RyZWFtcwECAAEDAQEBDzE3ODg3MTg5ODQzMzItMCgI" - } - ] - } - }, - "workflowTaskCompletedEventId": "17" - } - }, - { - "eventId": "19", - "eventTime": "2026-09-06T18:23:04.334282Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", - "taskId": "1052835", - "activityTaskStartedEventAttributes": { - "scheduledEventId": "13", - "identity": "34059@Mac.lan", - "requestId": "9fc0cd1b-60de-4c07-b64d-b2b9e8cd3c8e", - "attempt": 1, - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "20", - "eventTime": "2026-09-06T18:23:04.335841Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", - "taskId": "1052836", - "activityTaskCompletedEventAttributes": { - "result": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "InJlY29yZGVkOnIyOmV2ZW4i" - } - ] - }, - "scheduledEventId": "13", - "startedEventId": "19", - "identity": "34059@Mac.lan" - } - }, - { - "eventId": "21", - "eventTime": "2026-09-06T18:23:04.336080Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052837", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", - "kind": "TASK_QUEUE_KIND_STICKY", - "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "22", - "eventTime": "2026-09-06T18:23:04.336092Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052838", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "21", - "identity": "34059@Mac.lan", - "requestId": "request-from-RespondWorkflowTaskCompleted", - "historySizeBytes": "3174", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "23", - "eventTime": "2026-09-06T18:23:04.856009Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1052843", - "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "21", - "startedEventId": "22", - "identity": "34059@Mac.lan", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - }, - "sdkMetadata": {}, - "meteringMetadata": {} - } - }, - { - "eventId": "24", - "eventTime": "2026-09-06T18:23:04.856043Z", - "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1052844", - "markerRecordedEventAttributes": { - "markerName": "core_external_stream", - "details": { - "external_stream": { - "payloads": [ - { - "metadata": { - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAEQAxoECAEQAyLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0MzMyLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODk4NDg1MS0wDzE3ODg3MTg5ODQ4NTEtMAEAAQMBAQEPMTc4ODcxODk4NDg1MS0wKAYynQEIARABGiBhekMwV1J5bktxbVRMUjNMLWFLdDZNRjVuc25jTzRMdCAUKiQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkyMgoJZGVjaXNpb25zEAIY0wIiIMlkAX98qOr68/irYtiKi0b09uWIahOZe6Q558yOXlphOgMKAQA6AwoBAkINcmVkaXMtc3RyZWFtc0gB" - } - ] - } - }, - "workflowTaskCompletedEventId": "23" - } - }, - { - "eventId": "25", - "eventTime": "2026-09-06T18:23:04.856056Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", - "taskId": "1052845", - "activityTaskScheduledEventAttributes": { - "activityId": "decision-r3", - "activityType": { - "name": "AI198RecordDecision" - }, - "taskQueue": { - "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "kind": "TASK_QUEUE_KIND_NORMAL" - }, - "header": {}, - "input": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "eyJicmFuY2giOiJvZGQiLCJjb21wdXRlZCI6MTAzLCJzb3VyY2UiOiJyMyJ9" - } - ] - }, - "scheduleToCloseTimeout": "0s", - "scheduleToStartTimeout": "0s", - "startToCloseTimeout": "10s", - "heartbeatTimeout": "0s", - "workflowTaskCompletedEventId": "23", - "retryPolicy": { - "initialInterval": "1s", - "backoffCoefficient": 2.0, - "maximumInterval": "100s" - }, - "useWorkflowBuildId": true, - "priority": {} - } - }, - { - "eventId": "26", - "eventTime": "2026-09-06T18:23:04.341085Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1052846", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZjUtYWM3My03ZjEzLTlmYTYtZWJjNWMwODIxYTY5Mgdtb2RlbCMx" - } - ] - }, - "identity": "34059@Mac.lan", - "requestId": "0da6d15a-59e2-5ce9-89c3-fdb107a4d620" - } - }, - { - "eventId": "27", - "eventTime": "2026-09-06T18:23:04.856092Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052847", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", - "kind": "TASK_QUEUE_KIND_STICKY", - "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "28", - "eventTime": "2026-09-06T18:23:04.856126Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052848", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "27", - "identity": "34059@Mac.lan", - "requestId": "request-from-RespondWorkflowTaskCompleted", - "historySizeBytes": "4035", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "29", - "eventTime": "2026-09-06T18:23:04.860129Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1052853", - "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "27", - "startedEventId": "28", - "identity": "34059@Mac.lan", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - }, - "sdkMetadata": {}, - "meteringMetadata": {} - } - }, - { - "eventId": "30", - "eventTime": "2026-09-06T18:23:04.860156Z", - "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1052854", - "markerRecordedEventAttributes": { - "markerName": "core_external_stream", - "details": { - "external_stream": { - "payloads": [ - { - "metadata": { - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAEQAxoECAEQAyKoAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0ODUxLTANcmVkaXMtc3RyZWFtcwECAAEDAQEBDzE3ODg3MTg5ODQ4NTEtMCgI" - } - ] - } - }, - "workflowTaskCompletedEventId": "29" - } - }, - { - "eventId": "31", - "eventTime": "2026-09-06T18:23:04.856080Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", - "taskId": "1052855", - "activityTaskStartedEventAttributes": { - "scheduledEventId": "25", - "identity": "34059@Mac.lan", - "requestId": "ae70d169-fcae-4c8b-b56f-24ef10977f72", - "attempt": 1, - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "32", - "eventTime": "2026-09-06T18:23:04.859154Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", - "taskId": "1052856", - "activityTaskCompletedEventAttributes": { - "result": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "InJlY29yZGVkOnIzOm9kZCI=" - } - ] - }, - "scheduledEventId": "25", - "startedEventId": "31", - "identity": "34059@Mac.lan" - } - }, - { - "eventId": "33", - "eventTime": "2026-09-06T18:23:04.860164Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052857", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", - "kind": "TASK_QUEUE_KIND_STICKY", - "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "34", - "eventTime": "2026-09-06T18:23:04.860195Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052858", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "33", - "identity": "34059@Mac.lan", - "requestId": "request-from-RespondWorkflowTaskCompleted", - "historySizeBytes": "5378", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "35", - "eventTime": "2026-09-06T18:23:04.873800Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1052863", - "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "33", - "startedEventId": "34", - "identity": "34059@Mac.lan", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - }, - "sdkMetadata": {}, - "meteringMetadata": {} - } - }, - { - "eventId": "36", - "eventTime": "2026-09-06T18:23:04.873824Z", - "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1052864", - "markerRecordedEventAttributes": { - "markerName": "core_external_stream", - "details": { - "external_stream": { - "payloads": [ - { - "metadata": { - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAEQBBoECAEQBCLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0ODUxLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODk4NDg3MC0wDzE3ODg3MTg5ODQ4NzAtMAEAAQMBAQEPMTc4ODcxODk4NDg3MC0wKAYynQEIARABGiBBU25qczFkZkowaTZZdHdBSkt0RW9XTlZUek9jcUxTbCAgKiQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkyMgoJZGVjaXNpb25zEAEYtAEiID5nSwItjUt3xrIwLwmnksCGdUXwRytSYqhf4/HFL9GVOgMKAQA6AwoBAUINcmVkaXMtc3RyZWFtc0gB" - } - ] - } - }, - "workflowTaskCompletedEventId": "35" - } - }, - { - "eventId": "37", - "eventTime": "2026-09-06T18:23:04.873833Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", - "taskId": "1052865", - "activityTaskScheduledEventAttributes": { - "activityId": "decision-r4", - "activityType": { - "name": "AI198RecordDecision" - }, - "taskQueue": { - "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "kind": "TASK_QUEUE_KIND_NORMAL" - }, - "header": {}, - "input": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "eyJicmFuY2giOiJldmVuIiwiY29tcHV0ZWQiOjQwLCJzb3VyY2UiOiJyNCJ9" - } - ] - }, - "scheduleToCloseTimeout": "0s", - "scheduleToStartTimeout": "0s", - "startToCloseTimeout": "10s", - "heartbeatTimeout": "0s", - "workflowTaskCompletedEventId": "35", - "retryPolicy": { - "initialInterval": "1s", - "backoffCoefficient": 2.0, - "maximumInterval": "100s" - }, - "useWorkflowBuildId": true, - "priority": {} - } - }, - { - "eventId": "38", - "eventTime": "2026-09-06T18:23:04.869822Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1052866", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZjUtYWM3My03ZjEzLTlmYTYtZWJjNWMwODIxYTY5Mgdtb2RlbCMy" - } - ] - }, - "identity": "34059@Mac.lan", - "requestId": "5d10fc28-9e67-5c92-8e99-a7efb1f1d9cb" - } - }, - { - "eventId": "39", - "eventTime": "2026-09-06T18:23:04.873860Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052867", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", - "kind": "TASK_QUEUE_KIND_STICKY", - "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "40", - "eventTime": "2026-09-06T18:23:04.873883Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052868", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "39", - "identity": "34059@Mac.lan", - "requestId": "request-from-RespondWorkflowTaskCompleted", - "historySizeBytes": "6238", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "41", - "eventTime": "2026-09-06T18:23:04.876306Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1052873", - "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "39", - "startedEventId": "40", - "identity": "34059@Mac.lan", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - }, - "sdkMetadata": {}, - "meteringMetadata": {} - } - }, - { - "eventId": "42", - "eventTime": "2026-09-06T18:23:04.876327Z", - "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1052874", - "markerRecordedEventAttributes": { - "markerName": "core_external_stream", - "details": { - "external_stream": { - "payloads": [ - { - "metadata": { - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAEQBBoECAEQBCKoAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0ODcwLTANcmVkaXMtc3RyZWFtcwECAAEDAQEBDzE3ODg3MTg5ODQ4NzAtMCgI" - } - ] - } - }, - "workflowTaskCompletedEventId": "41" - } - }, - { - "eventId": "43", - "eventTime": "2026-09-06T18:23:04.873853Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", - "taskId": "1052875", - "activityTaskStartedEventAttributes": { - "scheduledEventId": "37", - "identity": "34059@Mac.lan", - "requestId": "23c51461-54a6-4666-9081-7a1f0ab7dfd2", - "attempt": 1, - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "44", - "eventTime": "2026-09-06T18:23:04.875977Z", - "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", - "taskId": "1052876", - "activityTaskCompletedEventAttributes": { - "result": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "InJlY29yZGVkOnI0OmV2ZW4i" - } - ] - }, - "scheduledEventId": "37", - "startedEventId": "43", - "identity": "34059@Mac.lan" - } - }, - { - "eventId": "45", - "eventTime": "2026-09-06T18:23:04.876333Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052877", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "34059@Mac.lan-37fc3e6910fe473798ebf07f75c25409", - "kind": "TASK_QUEUE_KIND_STICKY", - "normalName": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "46", - "eventTime": "2026-09-06T18:23:04.876353Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052878", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "45", - "identity": "34059@Mac.lan", - "requestId": "request-from-RespondWorkflowTaskCompleted", - "historySizeBytes": "7581", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "47", - "eventTime": "2026-09-06T18:23:04.886126Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_FAILED", - "taskId": "1052882", - "workflowTaskFailedEventAttributes": { - "scheduledEventId": "45", - "startedEventId": "46", - "cause": "WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND", - "failure": { - "message": "UnhandledCommand", - "serverFailureInfo": {} - }, - "identity": "34059@Mac.lan" - } - }, - { - "eventId": "48", - "eventTime": "2026-09-06T18:23:04.883008Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", - "taskId": "1052883", - "workflowExecutionSignaledEventAttributes": { - "signalName": "__temporal_external_stream_wake", - "input": { - "payloads": [ - { - "metadata": { - "messageType": "Y29yZXNkay5leHRlcm5hbF9zdHJlYW0uV2FrZVNpZ25hbA==", - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAESBmlucHV0cyokMDFhMDc3ZjUtYWM3My03ZjEzLTlmYTYtZWJjNWMwODIxYTY5Mgdtb2RlbCMy" - } - ] - }, - "identity": "34059@Mac.lan", - "requestId": "da1874cc-ecf7-5813-8e2d-807bf5d43193" - } - }, - { - "eventId": "49", - "eventTime": "2026-09-06T18:23:04.886152Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", - "taskId": "1052884", - "workflowTaskScheduledEventAttributes": { - "taskQueue": { - "name": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "kind": "TASK_QUEUE_KIND_NORMAL" - }, - "startToCloseTimeout": "10s", - "attempt": 1 - } - }, - { - "eventId": "50", - "eventTime": "2026-09-06T18:23:04.886996Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", - "taskId": "1052887", - "workflowTaskStartedEventAttributes": { - "scheduledEventId": "49", - "identity": "34059@Mac.lan", - "requestId": "40f8ac65-5593-41c0-8cd7-a618c78e8bea", - "historySizeBytes": "8865", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - } - } - }, - { - "eventId": "51", - "eventTime": "2026-09-06T18:23:05.303033Z", - "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", - "taskId": "1052891", - "workflowTaskCompletedEventAttributes": { - "scheduledEventId": "49", - "startedEventId": "50", - "identity": "34059@Mac.lan", - "workerVersion": { - "buildId": "bea38d1926cc20b3f7972bbc95740895" - }, - "sdkMetadata": {}, - "meteringMetadata": {} - } - }, - { - "eventId": "52", - "eventTime": "2026-09-06T18:23:05.303054Z", - "eventType": "EVENT_TYPE_MARKER_RECORDED", - "taskId": "1052892", - "markerRecordedEventAttributes": { - "markerName": "core_external_stream", - "details": { - "external_stream": { - "payloads": [ - { - "metadata": { - "encoding": "YmluYXJ5L3Byb3RvYnVm" - }, - "data": "CAEQARoECAEQBSLOAQEBAQEHZGVmYXVsdDhhaTE5OC1jb250cmFjdC1leHRlcm5hbC03Y2EzNDk5OTJkYmY0MTgxYWJkZTNhOGVjNTc4NDljOSQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkGaW5wdXRzAQ8xNzg4NzE4OTg0ODcwLTANcmVkaXMtc3RyZWFtcwECAAECAQEPMTc4ODcxODk4NDg4My0wDzE3ODg3MTg5ODQ4ODMtMAEAAQMBAQEPMTc4ODcxODk4NDg4My0wKAcynAEIARABGiBxeUxQdjZoN0NUZUpfd3IxZzUwOE82NEtPeTRXX0FWOCAwKiQwMWEwNzdmNS1hYzczLTdmMTMtOWZhNi1lYmM1YzA4MjFhNjkyMQoJZGVjaXNpb25zEAEYbSIg3ClteUJUVTZweyuvvwlOF9DoWSLrxmpqEsPbZESWN6I6AwoBADoDCgEBQg1yZWRpcy1zdHJlYW1zSAE=" - } - ] - } - }, - "workflowTaskCompletedEventId": "51" - } - }, - { - "eventId": "53", - "eventTime": "2026-09-06T18:23:05.303058Z", - "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", - "taskId": "1052893", - "workflowExecutionCompletedEventAttributes": { - "result": { - "payloads": [ - { - "metadata": { - "encoding": "anNvbi9wbGFpbg==" - }, - "data": "W3sia2luZCI6ImRlY2lzaW9uIiwicmVjZWlwdCI6InJlY29yZGVkOnIxOm9kZCIsInZhbHVlIjp7ImJyYW5jaCI6Im9kZCIsImNvbXB1dGVkIjoxMDEsInNvdXJjZSI6InIxIn19LHsia2luZCI6ImRlY2lzaW9uIiwicmVjZWlwdCI6InJlY29yZGVkOnIyOmV2ZW4iLCJ2YWx1ZSI6eyJicmFuY2giOiJldmVuIiwiY29tcHV0ZWQiOjIwLCJzb3VyY2UiOiJyMiJ9fSx7ImF0dGVtcHQiOjIsImtpbmQiOiJzdXBlcnNlZGVkIiwicHJvZHVjZXIiOiJtb2RlbCIsInJlcGxhY2VkIjoxfSx7ImtpbmQiOiJkZWNpc2lvbiIsInJlY2VpcHQiOiJyZWNvcmRlZDpyMzpvZGQiLCJ2YWx1ZSI6eyJicmFuY2giOiJvZGQiLCJjb21wdXRlZCI6MTAzLCJzb3VyY2UiOiJyMyJ9fSx7ImtpbmQiOiJkZWNpc2lvbiIsInJlY2VpcHQiOiJyZWNvcmRlZDpyNDpldmVuIiwidmFsdWUiOnsiYnJhbmNoIjoiZXZlbiIsImNvbXB1dGVkIjo0MCwic291cmNlIjoicjQifX0seyJraW5kIjoiZmluaXNoIiwicHJvZHVjZXIiOiJtb2RlbCJ9XQ==" - } - ] - }, - "workflowTaskCompletedEventId": "51" - } - } - ] -} \ No newline at end of file diff --git a/streams_demo/results-external/results.json b/streams_demo/results-external/results.json deleted file mode 100644 index 149ce1ef9..000000000 --- a/streams_demo/results-external/results.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "provider": "external", - "workflow_id": "ai198-contract-external-7ca349992dbf4181abde3a8ec57849c9", - "target": "127.0.0.1:53266", - "max_cached_workflows": 2, - "outcome": "completed", - "trace": [ - { - "kind": "decision", - "receipt": "recorded:r1:odd", - "value": { - "branch": "odd", - "computed": 101, - "source": "r1" - } - }, - { - "kind": "decision", - "receipt": "recorded:r2:even", - "value": { - "branch": "even", - "computed": 20, - "source": "r2" - } - }, - { - "attempt": 2, - "kind": "superseded", - "producer": "model", - "replaced": 1 - }, - { - "kind": "decision", - "receipt": "recorded:r3:odd", - "value": { - "branch": "odd", - "computed": 103, - "source": "r3" - } - }, - { - "kind": "decision", - "receipt": "recorded:r4:even", - "value": { - "branch": "even", - "computed": 40, - "source": "r4" - } - }, - { - "kind": "finish", - "producer": "model" - } - ], - "task_failures": [ - { - "event_id": 47, - "cause": 1, - "message": "UnhandledCommand" - } - ], - "observed_output": [ - { - "kind": "DATA", - "value": { - "branch": "odd", - "computed": 101, - "source": "r1" - } - }, - { - "kind": "DATA", - "value": { - "branch": "even", - "computed": 20, - "source": "r2" - } - }, - { - "kind": "DATA", - "value": { - "retracting_attempt": 1 - } - }, - { - "kind": "DATA", - "value": { - "branch": "odd", - "computed": 103, - "source": "r3" - } - }, - { - "kind": "DATA", - "value": { - "branch": "even", - "computed": 40, - "source": "r4" - } - }, - { - "kind": "FINISH", - "value": null - } - ], - "history_events": 53 -} diff --git a/temporalio/contrib/openai_agents/testing.py b/temporalio/contrib/openai_agents/testing.py index 3367a81e1..3fcd6a573 100644 --- a/temporalio/contrib/openai_agents/testing.py +++ b/temporalio/contrib/openai_agents/testing.py @@ -74,8 +74,8 @@ def tool_call(arguments: str, name: str) -> ModelResponse: return ResponseBuilders.model_response( ResponseFunctionToolCall( arguments=arguments, - # A script that calls two tools hands the same completed id to - # two invocations, which the Agents SDK now rejects. + # The Agents SDK rejects two invocations sharing one completed + # call id, and a script that calls two tools would hand them one. call_id=f"call-{uuid.uuid4()}", name=name, type="function_call", From f71a030fd9abaf526057f286edf8edb3d8eb3914 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:39:11 -0700 Subject: [PATCH 216/831] Adapted the Redis provider to the interface changes. The append cursor names the last record and is None for an empty batch; a publish on the owner's stream answers with the whole record, so its offset is taken before the token is. Producer identity is resolved by the package, inbound frames carry no topic, undecodable frames are skipped with a warning, and the Redis client is opened on first use and released by the close hook, with the socket timeout derived from the backend's block period and the URL read from the same variable Max's suite uses. --- temporalio/streams/providers/redis.py | 144 +++++++++++++++++--------- 1 file changed, 93 insertions(+), 51 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index ad5fbcd9c..3cc24e538 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -5,21 +5,23 @@ a marker in History proves the workflow task that produced it was accepted. Consumption is recorded the same way, as ranges and boundaries in History. -``configure`` builds the backend from ``url`` and ``key_prefix`` (defaulting -to ``AI198_REDIS_URL`` and ``AI198_REDIS_PREFIX``), or takes a constructed -``backend`` when the caller wants to own its lifecycle. +``configure`` takes ``url`` and ``key_prefix`` (defaulting to +``TEMPORAL_TEST_REDIS_URL``, then ``AI198_REDIS_URL``, and +``AI198_REDIS_PREFIX``), or a constructed ``backend`` when the caller wants to +own its lifecycle. The Redis client is opened on first use, so it belongs to +the loop that uses it, and released by ``close``. """ from __future__ import annotations import asyncio +import logging import os import time -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any -from temporalio import activity from temporalio.api.common.v1 import Payload from temporalio.client import Client, WorkflowExecutionStatus from temporalio.contrib.external_workflow_streams import ( @@ -28,6 +30,7 @@ ExternalOutputStreamProducer, ExternalStreamProducer, Offset, + OutputStreamRecord, WakeNotAcknowledgedError, WorkflowChainKey, external_output_stream, @@ -36,11 +39,14 @@ from temporalio.contrib.external_workflow_streams import ( BEGINNING as PROVIDER_BEGINNING, ) +from temporalio.contrib.external_workflow_streams._backend import DEFAULT_WATCH_BLOCK from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +logger = logging.getLogger(__name__) + class _ExternalReadSource: def __init__(self, subscription: Any) -> None: @@ -77,6 +83,12 @@ async def _chain_key(client: Client, workflow_id: str) -> WorkflowChainKey: ) +def _placed(result: Any) -> Offset: + # An inbound topic answers a publish with the offset. The owner's output + # stream answers with the whole record, whose text form is not a position. + return result.offset if isinstance(result, OutputStreamRecord) else result + + class RedisProducer: """Appends to a stream from outside workflow code. @@ -90,16 +102,20 @@ def __init__( self, topic: Any, converter: Any, - stream: str, + frame_topic: str, producer_id: str, attempt: int, client: Client | None = None, workflow_id: str = "", ) -> None: - """Bind this producer to ``topic`` on the external store.""" + """Bind this producer to ``topic`` on the external store. + + ``frame_topic`` is what each record carries: the topic name on the + owner's stream, empty on an inbound stream. + """ self._topic = topic self._converter = converter - self._stream = stream + self._frame_topic = frame_topic self._producer_id = producer_id self._attempt = attempt self._client = client @@ -111,12 +127,17 @@ def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor: - """Append values and return where the first one landed.""" - first: Any = None + async def append(self, *values: Any) -> Cursor | None: + """Append ``values`` and return the last one's cursor, or ``None`` for none. + + A repeat of an earlier append comes back with the original position. + The store drops the duplicate, but this seam does not say so, and a + reader resuming after that position still sees only what came later. + """ + last: Offset | None = None for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -124,15 +145,13 @@ async def append(self, *values: Any) -> Cursor: body=self._encode(value), ) self._sequence += 1 - offset = await self._topic.publish(frame) - if first is None: - first = offset - return Cursor(str(first)) + last = _placed(await self._topic.publish(frame)) + return None if last is None else Cursor(last.token) async def finish(self) -> None: """Declare this stream complete.""" frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -183,10 +202,11 @@ def _encode(self, value: Any) -> bytes: class RedisConsumer: """Reads a stream from outside workflow code, resumably.""" - def __init__(self, client: Any, converter: Any) -> None: + def __init__(self, client: Any, converter: Any, workflow_id: str) -> None: """Read what ``client`` reaches in the external store.""" self._client = client self._converter = converter + self._workflow_id = workflow_id async def read( self, @@ -194,22 +214,34 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ + # Only the owner's stream is readable from here, so the inbound check + # can never fire; it runs so every provider answers a topic the same way. + _provider.check_topic("", topic) + name = self._require_topic(topic) attempts = AttemptTracker() boundary = AFTER(Offset(after.token)) if after.token else PROVIDER_BEGINNING - handle = self._client.topic(self._require_topic(topic), type=bytes) + handle = self._client.topic(name, type=bytes) async for item in handle.subscribe(after=boundary): cursor = Cursor(str(item.offset)) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( item.data ) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning( + "skipping record %s of %s topic %s: %s", + cursor, + self._workflow_id, + name, + error, + ) continue superseded = attempts.note(source, attempt, cursor) if superseded is not None: @@ -253,6 +285,9 @@ class _RedisProvider: def __init__(self) -> None: self._backend: Any = None + self._owned_client: Any = None + self._url = "" + self._key_prefix = "" def configure(self, **options: Any) -> None: backend = options.pop("backend", None) @@ -263,36 +298,47 @@ def configure(self, **options: Any) -> None: "the redis provider takes backend, url and key_prefix, got " f"{sorted(options)}" ) - if backend is not None: - self._backend = backend - return - import redis.asyncio - - from temporalio.contrib.external_workflow_streams._redis import ( - RedisStreamBackend, + self._backend = backend + self._url = ( + url + or os.environ.get("TEMPORAL_TEST_REDIS_URL") + or os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6379") ) - - # redis-py defaults to a socket timeout equal to this provider's own - # blocking read, so an idle read would abandon a healthy socket. - self._backend = RedisStreamBackend( - client=redis.asyncio.from_url( - url or os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), - decode_responses=False, - socket_timeout=30, - ), - key_prefix=key_prefix - or os.environ.get("AI198_REDIS_PREFIX", "ai198-contract"), + self._key_prefix = key_prefix or os.environ.get( + "AI198_REDIS_PREFIX", "ai198-contract" ) def _require_backend(self) -> Any: if self._backend is None: - raise RuntimeError( - "no store configured; call temporalio.streams.configure(" - 'provider="redis", ...) before opening a producer, a consumer ' - "or a worker" + import redis.asyncio + + from temporalio.contrib.external_workflow_streams._redis import ( + RedisStreamBackend, + ) + + # A dead peer would otherwise hold a blocking read open forever. + # Several block periods, so a healthy socket that is merely idle + # inside one XREAD window is never abandoned. + self._owned_client = redis.asyncio.from_url( + self._url, + decode_responses=False, + socket_timeout=DEFAULT_WATCH_BLOCK.total_seconds() * 6, + ) + self._backend = RedisStreamBackend( + client=self._owned_client, key_prefix=self._key_prefix ) return self._backend + async def close(self) -> None: + """Release the Redis connections this provider opened. + + A backend the caller handed in stays the caller's to close. + """ + client, self._owned_client = self._owned_client, None + if client is not None: + self._backend = None + await client.aclose() + def worker_options(self) -> dict[str, Any]: return {"external_stream_backend": self._require_backend()} @@ -335,14 +381,9 @@ async def producer( ``stream`` names an inbound stream; with none, ``topic`` names a topic on the workflow's output stream, appended directly rather than through - the workflow's staged commit. Inside an activity, leave ``producer_id`` - and ``attempt`` unset: the activity's own id and attempt are the right - answer and are what let a reader tell a retry from a new generation. + the workflow's staged commit. An inbound record carries no topic: the + stream's name is its whole address. """ - if not producer_id: - producer_id = activity.info().activity_id - if not attempt: - attempt = activity.info().attempt # The attempt is part of it. Deduplication answers "is this the # same append again", and a second attempt writing different words # at the same sequence is not: this provider rejects that outright. @@ -367,7 +408,7 @@ async def producer( return RedisProducer( session.topic(stream or topic, type=bytes), client.data_converter.payload_converter, - stream or topic, + topic, producer_id, attempt, client, @@ -396,6 +437,7 @@ async def consumer( client=client, ), client.data_converter.payload_converter, + workflow_id, ) From 6fb7abed160e8a08f6739e8386d3c1dc6ea6972d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:39:12 -0700 Subject: [PATCH 217/831] Registered the Redis provider in the conformance suite. Behind STREAMS_LIVE=redis. Each topic is its own store and an inbound stream is not readable from outside, so the case declares both, and a dropped repeat answers with the original position. --- tests/streams/test_streams_conformance.py | 35 +++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 35f65ad0e..e407144dd 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -19,6 +19,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Callable from dataclasses import dataclass @@ -27,6 +28,7 @@ import pytest from temporalio import streams +from temporalio.client import Client from temporalio.streams import _frame, _ids, _provider from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import Cursor, RecordKind @@ -65,7 +67,40 @@ async def _memory_case() -> AsyncIterator[ProviderCase]: memory.reset() +async def _redis_case() -> AsyncIterator[ProviderCase]: + # A prefix per case, because the store keeps what earlier cases wrote. + streams.configure( + provider="redis", key_prefix=f"streams-conformance-{uuid.uuid4().hex}" + ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) + # The store keys a workflow's streams under its chain, which is read from + # the execution, so one has to exist; no worker ever picks its task up. + owner = await client.start_workflow( + "StreamOwner", + id=new_workflow_id(), + task_queue="streams-conformance-unserved", + ) + try: + yield ProviderCase( + "redis", + client, + workflow_id=owner.id, + # Each topic is its own store, and an inbound stream is not + # readable from outside; a dropped repeat answers with the + # original position because the store's seam does not say. + inbound_streams=False, + unfiltered_reads=False, + reports_dropped_repeats=False, + ) + finally: + await owner.terminate("conformance case finished") + await streams.close() + + SETUPS: dict[str, Callable[[], AsyncIterator[ProviderCase]]] = {"memory": _memory_case} +if os.environ.get("STREAMS_LIVE") == "redis": + # Needs a dev server at TEMPORAL_ADDRESS and a Redis at TEMPORAL_TEST_REDIS_URL. + SETUPS["redis"] = _redis_case _CAPABILITIES = { "inbound_stream": lambda case: case.inbound_streams, From 05ac20da79ab0627fe57bb699cff9ab192dc7f0d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:39:12 -0700 Subject: [PATCH 218/831] Ran the interface loop and the replay query in one Redis live module. The loop reuses the interface's ContractLoop rather than defining a second workflow under a type name another provider's test module already registers. --- tests/streams/test_redis_replay.py | 97 +++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 30 deletions(-) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index f47e6937b..63fbe5796 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -1,21 +1,27 @@ -"""A query against a completed run replays it on the client-side provider. - -Gated behind ``STREAMS_LIVE=redis``; needs a dev server (``TEMPORAL_ADDRESS``) -and a Redis (``AI198_REDIS_URL``). +"""Live checks for the client-side (Redis) provider inside a workflow. + +The conformance suite covers the outside surface when ``STREAMS_LIVE=redis``. +This module runs the interface loop inside a workflow over the staged commit, +then queries a completed run, which replays it. Both need a dev server +(``TEMPORAL_ADDRESS``) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or +``AI198_REDIS_URL``). The worker keeps a warm cache because the provider holds +the task open between records. """ from __future__ import annotations -import asyncio import os import uuid -from typing import Any +from collections.abc import AsyncIterator import pytest from temporalio import streams, workflow from temporalio.client import Client +from temporalio.streams import RecordKind from temporalio.worker import Worker +from tests.streams.test_streams_conformance import take +from tests.streams.test_streams_workflow import DECISIONS, INPUTS, ContractLoop pytestmark = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "redis", @@ -23,17 +29,54 @@ ) -async def take(records: Any, count: int, timeout: float = 5.0) -> list: - out: list = [] +@pytest.fixture +async def live_client() -> AsyncIterator[Client]: + # A prefix per case, because the store keeps what earlier cases wrote. + streams.configure(provider="redis", key_prefix=f"streams-redis-{uuid.uuid4().hex}") + try: + yield await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) + finally: + await streams.close() - async def _collect() -> None: - async for record in records: - out.append(record) - if len(out) >= count: - return - await asyncio.wait_for(_collect(), timeout) - return out +async def test_interface_loop_over_redis(live_client: Client): + workflow_id = f"streams-redis-live-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[ContractLoop], + max_cached_workflows=100, + **streams.worker_options(), + ): + handle = await live_client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + producer = await streams.producer( + live_client, + workflow_id=workflow_id, + stream=INPUTS, + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(live_client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict, topic=DECISIONS), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["decided"] for r in records[:3]] == [1, 2, 3] + assert await handle.result() == [ + {"kind": "decision", "n": 1, "attempt": 1}, + {"kind": "decision", "n": 2, "attempt": 1}, + {"kind": "decision", "n": 3, "attempt": 1}, + {"kind": "finish", "producer": "model"}, + ] @workflow.defn @@ -61,29 +104,23 @@ def probe(self) -> int: return 1 -async def test_query_after_completion_replays_the_final_task(): - # The final task's publishes were woken by a signal, which the activation - # applies before the replay marker, so the marker's expectations have to be - # installed before that task's code runs or the replay records nothing - # against a manifest of three. - streams.configure( - provider="redis", - url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6399"), - key_prefix=f"streams-redis-replay-{uuid.uuid4().hex}", - ) - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) +async def test_query_after_completion_replays_the_final_task(live_client: Client): + # A query against a completed run replays it. The final task's publishes + # were woken by a signal, which the activation applies before the replay + # marker, so the marker's expectations have to be installed before that + # task's code runs or the replay records nothing against a manifest of + # three. workflow_id = f"streams-redis-replay-{uuid.uuid4().hex}" - async with Worker( - client, + live_client, task_queue=f"tq-{workflow_id}", workflows=[SignalWokenPublish], **streams.worker_options(), ): - handle = await client.start_workflow( + handle = await live_client.start_workflow( SignalWokenPublish.run, id=workflow_id, task_queue=f"tq-{workflow_id}" ) - consumer = await streams.consumer(client, workflow_id=workflow_id) + consumer = await streams.consumer(live_client, workflow_id=workflow_id) await take(consumer.read(type=dict, topic="out"), 1, timeout=60) await handle.signal(SignalWokenPublish.close) assert await handle.result() == 4 From e1d1b22fe83a90136128c53580d2f3dd6ca2acf9 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:12:44 -0700 Subject: [PATCH 219/831] Renamed the store key helper to inbound_stream_id for the provider branches. The native and Redis providers import it under that name, so the interface exports the name they were told to use. --- temporalio/streams/_ids.py | 11 +++++++---- temporalio/streams/providers/memory.py | 10 +++++----- tests/streams/test_streams_conformance.py | 10 +++++----- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/temporalio/streams/_ids.py b/temporalio/streams/_ids.py index 625522f75..5f4161053 100644 --- a/temporalio/streams/_ids.py +++ b/temporalio/streams/_ids.py @@ -3,12 +3,12 @@ A workflow id may contain any character, ``:`` included, so joining the pair with a bare ``:`` is ambiguous: ``("a:b", "c")`` and ``("a", "b:c")`` would land in one store. Every provider that keys a store by the pair goes through -:func:`stream_key`, so they all agree and none of them collides. +:func:`inbound_stream_id`, so they all agree and none of them collides. """ from __future__ import annotations -__all__ = ["stream_key"] +__all__ = ["inbound_stream_id"] def _escape(component: str) -> str: @@ -17,8 +17,11 @@ def _escape(component: str) -> str: return component.replace("%", "%25").replace(":", "%3A") -def stream_key(workflow_id: str, stream: str) -> str: - """The key for ``stream`` of ``workflow_id``, or for the owner's stream when empty. +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The store id for inbound ``stream`` of ``workflow_id``. + + With an empty ``stream`` it is the id of the stream the workflow itself + publishes, so one function keys both. Both components are percent-encoded before joining, so the only bare ``:`` in the result is the separator, and an owner-stream key has none. diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 390c10b9c..4a3cf3298 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -27,7 +27,7 @@ from temporalio.api.common.v1 import Payload from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._ids import stream_key +from temporalio.streams._ids import inbound_stream_id from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -317,13 +317,13 @@ def open_read( # idle_timeout as the poll period would give the parameter a second # meaning that a port copying the reference would copy too. del idle_timeout - store = _stream(stream_key(workflow.info().workflow_id, stream)) + store = _stream(inbound_stream_id(workflow.info().workflow_id, stream)) return _MemReadSource( store, int(after.token) + 1 if after.token else 0, self._poll ) def open_write(self, topic: str) -> WriteSink: - store = _stream(stream_key(workflow.info().workflow_id, "")) + store = _stream(inbound_stream_id(workflow.info().workflow_id, "")) return _MemWriteSink(store, topic) async def producer( @@ -340,7 +340,7 @@ async def producer( # own writer appends to, and the frame carries the topic. An inbound # record carries none: the stream's name is its whole address. return MemoryProducer( - _stream(stream_key(workflow_id, stream)), + _stream(inbound_stream_id(workflow_id, stream)), _converter(client), topic, producer_id, @@ -351,7 +351,7 @@ async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> MemoryConsumer: return MemoryConsumer( - _stream(stream_key(workflow_id, stream)), _converter(client), stream + _stream(inbound_stream_id(workflow_id, stream)), _converter(client), stream ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index e407144dd..1cffded48 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -168,12 +168,12 @@ def test_supersession_is_synthesized_from_observations(): assert attempts.note("model", 2, Cursor("2")) is None -def test_stream_keys_cannot_collide(): +def test_inbound_stream_ids_cannot_collide(): # A colon in a workflow id must not make two addresses one key. - assert _ids.stream_key("a:b", "c") != _ids.stream_key("a", "b:c") - assert _ids.stream_key("a:b", "") != _ids.stream_key("a", "b") - assert _ids.stream_key("a%3Ab", "c") != _ids.stream_key("a:b", "c") - assert _ids.stream_key("wf", "inputs") == "wf:inputs" + assert _ids.inbound_stream_id("a:b", "c") != _ids.inbound_stream_id("a", "b:c") + assert _ids.inbound_stream_id("a:b", "") != _ids.inbound_stream_id("a", "b") + assert _ids.inbound_stream_id("a%3Ab", "c") != _ids.inbound_stream_id("a:b", "c") + assert _ids.inbound_stream_id("wf", "inputs") == "wf:inputs" async def test_append_read_roundtrip(provider: ProviderCase): From 11b67faed0bffa797dcfe52ff9ab678f6441885c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:44:38 -0700 Subject: [PATCH 220/831] Repinned Core to the reviewed moe/AI-198-fix-replay-slice-lookahead head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 4076ef24f..a67781227 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 +Subproject commit a67781227a88df50a0617247d20d4908f96d4593 From 8b9f1104d64baaeb724dac94bc0af2e92b8f9026 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:44:40 -0700 Subject: [PATCH 221/831] Repinned Core to the reviewed moe/AI-198-external-core-repairs head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 31af05354..7df8a5b7a 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 31af05354330bb88a8b1e1f598bde1ddddae1d85 +Subproject commit 7df8a5b7a47b8112eb611c9777e04e44bf2d6fc6 From 8b348ff3e231228318fa88845fb5c0c9185e6bf4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:47:29 -0700 Subject: [PATCH 222/831] Regenerated the bridge protos from the repinned Core. The native activation job and the two native commands moved to the field numbers the combined Core tree uses, so both trees agree. --- .../workflow_activation_pb2.py | 2 +- .../workflow_activation_pb2.pyi | 7 +++++- .../workflow_commands_pb2.py | 2 +- .../workflow_commands_pb2.pyi | 22 ++++++++++++------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index cd09b8b97..5df8ff627 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,7 +47,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 5245cd6fc..a6787024a 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -298,7 +298,12 @@ class WorkflowActivationJob(google.protobuf.message.Message): """A nexus operation resolved.""" @property def deliver_stream_messages(self) -> global___DeliverStreamMessages: - """A range of a stream the workflow subscribed to.""" + """17 to 20 are taken by the external stream jobs, which are developed + alongside this one and share this message. The number below is fixed + with that family and must not be reused. + + A range of a stream the workflow subscribed to. + """ @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0d81e37f5..44f658d1e 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index bcf1bf7eb..18b6e2ff9 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -181,7 +181,11 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property - def subscribe_stream(self) -> global___SubscribeStream: ... + def subscribe_stream(self) -> global___SubscribeStream: + """23 to 28 are taken by the external stream commands, which are developed + alongside these and share this message. The two numbers below are fixed + with that family and must not be reused. + """ @property def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( @@ -376,13 +380,7 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand class AddStreamMessages(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - Publish a batch of messages to a stream this workflow owns. + """Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -420,6 +418,14 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int From 8b49c07a6210074ff17dabfd4ab139be0ec0de90 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:59:24 -0700 Subject: [PATCH 223/831] Regenerated the bridge protos from the repinned Core. --- .../workflow_activation_pb2.pyi | 6 +++++- .../workflow_commands_pb2.pyi | 21 ++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 670aad2f4..bb88ff660 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -327,7 +327,11 @@ class WorkflowActivationJob(google.protobuf.message.Message): """ @property def deliver_stream_messages(self) -> global___DeliverStreamMessages: - """A range of a stream the workflow subscribed to.""" + """The number below is shared with the native stream tree, which leaves 17 + to 20 to the jobs above, and must not be reused. + + A range of a stream the workflow subscribed to. + """ @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 14e60ba8c..6c8980e55 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -202,7 +202,10 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___WorkflowOutputStreamBuffered: ... @property - def subscribe_stream(self) -> global___SubscribeStream: ... + def subscribe_stream(self) -> global___SubscribeStream: + """The two numbers below are shared with the native stream tree, which + leaves 23 to 28 to the commands above, and must not be reused. + """ @property def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( @@ -744,13 +747,7 @@ class WorkflowOutputStreamBuffered(google.protobuf.message.Message): global___WorkflowOutputStreamBuffered = WorkflowOutputStreamBuffered class AddStreamMessages(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - Publish a batch of messages to a stream this workflow owns. + """Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -788,6 +785,14 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int From 5d28a6131df6e704b3382773f0437be7e4ac2315 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:59:24 -0700 Subject: [PATCH 224/831] Retitled the native live module as the interface loop it runs. --- tests/streams/test_native_provider.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/streams/test_native_provider.py b/tests/streams/test_native_provider.py index f8523e40e..0a46f89d3 100644 --- a/tests/streams/test_native_provider.py +++ b/tests/streams/test_native_provider.py @@ -1,7 +1,8 @@ -"""Live conformance for the server-side (native) provider. +"""Live interface loop over the server-side (native) provider. -Runs the same interface loop the other providers run, against a Temporal -server that carries the stream service. Gated behind ``STREAMS_LIVE=native``; +Runs the interface loop the other providers run, inside a workflow, against +a Temporal server that carries the stream service; the conformance suite +covers the outside surface under the same gate. Gated behind ``STREAMS_LIVE=native``; ``TEMPORAL_ADDRESS`` must point at a server built from ``moedash/temporal`` ``moe/AI-198-server-side-streams``. """ From 144580c872dcd7d227bb4a6afe9b80fc67386b65 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:32:40 -0700 Subject: [PATCH 225/831] Added the StreamError family for stream conditions. --- temporalio/streams/__init__.py | 12 ++++++++++ temporalio/streams/_errors.py | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 temporalio/streams/_errors.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index f564135fd..0b43830cb 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -64,6 +64,13 @@ from datetime import timedelta from typing import Any, TypeVar, overload +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) from temporalio.streams._handles import ( ReadSource, StreamReader, @@ -101,10 +108,15 @@ "Producer", "ReadSource", "RecordKind", + "StreamCursorError", + "StreamError", + "StreamNotFoundError", + "StreamProducerError", "StreamProvider", "StreamProviderLifecycle", "StreamReader", "StreamRecord", + "StreamUnsupportedError", "StreamWriter", "Supersession", "WriteSink", diff --git a/temporalio/streams/_errors.py b/temporalio/streams/_errors.py new file mode 100644 index 000000000..f00bf1c3a --- /dev/null +++ b/temporalio/streams/_errors.py @@ -0,0 +1,40 @@ +"""The errors a stream call raises. + +Every stream condition is a :class:`StreamError`, so a caller can catch by +meaning the way it catches other :class:`temporalio.exceptions.TemporalError` +subclasses. Argument mistakes stay ``ValueError``. A provider's transport +failure surfaces as :class:`temporalio.service.RPCError`, never as the +transport's own exception type. +""" + +from __future__ import annotations + +import temporalio.exceptions + +__all__ = [ + "StreamCursorError", + "StreamError", + "StreamNotFoundError", + "StreamProducerError", + "StreamUnsupportedError", +] + + +class StreamError(temporalio.exceptions.TemporalError): + """Base for stream conditions.""" + + +class StreamNotFoundError(StreamError): + """The workflow, chain or topic does not exist or is past retention.""" + + +class StreamCursorError(StreamError): + """The cursor was minted by another provider or names a record no longer retained.""" + + +class StreamProducerError(StreamError): + """The producer attempt or sequence conflicts with what the store holds.""" + + +class StreamUnsupportedError(StreamError): + """This provider does not offer the requested capability.""" From 22d79ec125b59c0af905ba823b561e3a0f22e138 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:37:55 -0700 Subject: [PATCH 226/831] Vendored the stream additions to the public API protos. The Core submodule does not pin the api branch that carries them yet, so the generator stages the pinned API tree, applies the branch's diff and regenerates only the files it touches. --- scripts/gen_stream_api_protos.py | 101 ++ temporalio/api/command/v1/__init__.py | 4 + temporalio/api/command/v1/message_pb2.py | 117 +- temporalio/api/command/v1/message_pb2.pyi | 105 ++ temporalio/api/enums/v1/command_type_pb2.py | 6 +- temporalio/api/enums/v1/command_type_pb2.pyi | 4 + temporalio/api/enums/v1/event_type_pb2.py | 6 +- temporalio/api/enums/v1/event_type_pb2.pyi | 20 + temporalio/api/enums/v1/failed_cause_pb2.py | 27 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 30 + temporalio/api/history/v1/__init__.py | 4 + temporalio/api/history/v1/message_pb2.py | 301 +++-- temporalio/api/history/v1/message_pb2.pyi | 131 ++ temporalio/api/stream/__init__.py | 0 temporalio/api/stream/v1/__init__.py | 8 + temporalio/api/stream/v1/message_pb2.py | 95 ++ temporalio/api/stream/v1/message_pb2.pyi | 267 ++++ .../v1/request_response_pb2.py | 1125 +++++++++-------- .../v1/request_response_pb2.pyi | 17 + 19 files changed, 1617 insertions(+), 751 deletions(-) create mode 100644 scripts/gen_stream_api_protos.py create mode 100644 temporalio/api/stream/__init__.py create mode 100644 temporalio/api/stream/v1/__init__.py create mode 100644 temporalio/api/stream/v1/message_pb2.py create mode 100644 temporalio/api/stream/v1/message_pb2.pyi diff --git a/scripts/gen_stream_api_protos.py b/scripts/gen_stream_api_protos.py new file mode 100644 index 000000000..eeb7bb350 --- /dev/null +++ b/scripts/gen_stream_api_protos.py @@ -0,0 +1,101 @@ +"""Regenerate the stream additions to the vendored public API protos. + +The stream protos live on a branch of the api repo that the Core submodule +does not pin yet. Regenerating everything from that branch would also pull in +whatever else moved on the api main line since the pin, so this stages the +API protos the submodule pins, applies the branch's own diff on top, and +regenerates only the files that diff touches. Every other module under +``temporalio/api`` stays byte-identical. + + uv run --python 3.10 --no-project --with "grpcio-tools==1.48.2" \\ + --with "mypy-protobuf==3.3.0" --with "protobuf<4" \\ + scripts/gen_stream_api_protos.py /path/to/api origin/main..origin/ + +The toolchain pins match ``scripts/_proto/Dockerfile``. Generated code refuses +to load on a protobuf runtime older than the one it was built against, and +these modules end up in applications that pin protobuf themselves. Run +``uv run poe format`` afterwards, as the ``gen-protos`` task does. +""" + +from __future__ import annotations + +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +sys.path.insert(0, str(BASE / "scripts")) + +import gen_protos # noqa: E402 + +API_OUT = BASE / "temporalio" / "api" + + +def main() -> None: + if len(sys.argv) != 3: + sys.exit("usage: gen_stream_api_protos.py /path/to/api-checkout ..") + api = Path(sys.argv[1]).resolve() + revisions = sys.argv[2] + diff = subprocess.run( + ["git", "-C", str(api), "diff", revisions, "--", "temporal/"], + check=True, + capture_output=True, + text=True, + ).stdout + touched = subprocess.run( + ["git", "-C", str(api), "diff", "--name-only", revisions, "--", "temporal/"], + check=True, + capture_output=True, + text=True, + ).stdout.split() + if not touched: + sys.exit(f"{revisions} touches no proto under temporal/") + + with tempfile.TemporaryDirectory() as tmp: + stage = Path(tmp) / "stage" + shutil.copytree(gen_protos.api_proto_dir / "temporal", stage / "temporal") + subprocess.run( + ["patch", "-p1", "--silent"], + check=True, + cwd=stage, + input=diff, + text=True, + ) + out = Path(tmp) / "out" + out.mkdir() + subprocess.check_call( + [ + sys.executable, + "-mgrpc_tools.protoc", + f"--proto_path={stage}", + f"--python_out={out}", + f"--mypy_out={out}", + *touched, + ] + ) + packages: set[Path] = set() + for proto in touched: + relative = Path(proto).relative_to("temporal/api").with_suffix("") + for suffix in ("_pb2.py", "_pb2.pyi"): + generated = ( + out + / "temporal" + / "api" + / relative.with_name(relative.name + suffix) + ) + target = API_OUT / relative.with_name(relative.name + suffix) + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(generated, target) + print(f"wrote {target.relative_to(BASE)}") + packages.add(target.parent) + + for package in sorted(packages): + (package.parent / "__init__.py").touch() + gen_protos.fix_generated_output(package) + print(f"rewrote {(package / '__init__.py').relative_to(BASE)}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index e0ce8f712..d1b241274 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -1,4 +1,5 @@ from .message_pb2 import ( + AppendStreamRecordsCommandAttributes, CancelTimerCommandAttributes, CancelWorkflowExecutionCommandAttributes, Command, @@ -16,10 +17,12 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) __all__ = [ + "AppendStreamRecordsCommandAttributes", "CancelTimerCommandAttributes", "CancelWorkflowExecutionCommandAttributes", "Command", @@ -37,5 +40,6 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index ad004ae03..8c36c1f7b 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -42,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\x87\x12\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x42\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -106,6 +109,12 @@ "RequestCancelNexusOperationCommandAttributes" ] _COMMAND = DESCRIPTOR.message_types_by_name["Command"] +_APPENDSTREAMRECORDSCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "AppendStreamRecordsCommandAttributes" +] +_SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeStreamCommandAttributes" +] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", (_message.Message,), @@ -332,6 +341,28 @@ ) _sym_db.RegisterMessage(Command) +AppendStreamRecordsCommandAttributes = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecordsCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _APPENDSTREAMRECORDSCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.AppendStreamRecordsCommandAttributes) + }, +) +_sym_db.RegisterMessage(AppendStreamRecordsCommandAttributes) + +SubscribeStreamCommandAttributes = _reflection.GeneratedProtocolMessageType( + "SubscribeStreamCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAMCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeStreamCommandAttributes) + }, +) +_sym_db.RegisterMessage(SubscribeStreamCommandAttributes) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\032io.temporal.api.command.v1B\014MessageProtoP\001Z%go.temporal.io/api/command/v1;command\252\002\031Temporalio.Api.Command.V1\352\002\034Temporalio::Api::Command::V1" @@ -383,44 +414,48 @@ _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_options = ( b"8\001" ) - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 424 - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1118 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1120 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1192 - _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1194 - _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1299 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1301 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1395 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1397 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1488 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1490 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1538 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1540 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1633 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1636 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1819 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1822 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2125 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2127 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2245 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2247 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2343 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2346 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2665 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2585 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2665 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2668 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3608 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3611 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4615 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4617 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4671 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4674 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5157 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5107 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5157 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5159 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5233 - _COMMAND._serialized_start = 5236 - _COMMAND._serialized_end = 7547 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 462 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1156 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1158 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1230 + _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1232 + _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1337 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1339 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1433 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1435 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1526 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1528 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1576 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1578 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1671 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1674 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1857 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1860 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2163 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2165 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2283 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2285 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2381 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2384 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2703 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2623 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2703 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2706 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3646 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3649 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4653 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4655 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4709 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4712 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5195 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5145 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5195 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 + _COMMAND._serialized_start = 5274 + _COMMAND._serialized_end = 7806 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7808 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7920 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7922 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 7997 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 18d0abc8b..f623eecfd 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -18,6 +18,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1119,6 +1120,8 @@ class Command(google.protobuf.message.Message): MODIFY_WORKFLOW_PROPERTIES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1209,6 +1212,14 @@ class Command(google.protobuf.message.Message): def request_cancel_nexus_operation_command_attributes( self, ) -> global___RequestCancelNexusOperationCommandAttributes: ... + @property + def append_stream_records_command_attributes( + self, + ) -> global___AppendStreamRecordsCommandAttributes: ... + @property + def subscribe_stream_command_attributes( + self, + ) -> global___SubscribeStreamCommandAttributes: ... def __init__( self, *, @@ -1253,10 +1264,16 @@ class Command(google.protobuf.message.Message): | None = ..., request_cancel_nexus_operation_command_attributes: global___RequestCancelNexusOperationCommandAttributes | None = ..., + append_stream_records_command_attributes: global___AppendStreamRecordsCommandAttributes + | None = ..., + subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "append_stream_records_command_attributes", + b"append_stream_records_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1291,6 +1308,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1300,6 +1319,8 @@ class Command(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "append_stream_records_command_attributes", + b"append_stream_records_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1338,6 +1359,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1365,8 +1388,90 @@ class Command(google.protobuf.message.Message): "modify_workflow_properties_command_attributes", "schedule_nexus_operation_command_attributes", "request_cancel_nexus_operation_command_attributes", + "append_stream_records_command_attributes", + "subscribe_stream_command_attributes", ] | None ): ... global___Command = Command + +class AppendStreamRecordsCommandAttributes(google.protobuf.message.Message): + """Appends records to a stream the Workflow owns. Applied inside the Workflow + Task's own commit. Produces one `WorkflowStreamRecordsAppended` event + carrying the offset range and none of the payload; it schedules no further + work. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the Workflow's default output stream.""" + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: + """Stored in order. The server sets `producer_id` to empty on each record, + because the owning Workflow is the producer here. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "records", b"records", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AppendStreamRecordsCommandAttributes = AppendStreamRecordsCommandAttributes + +class SubscribeStreamCommandAttributes(google.protobuf.message.Message): + """Subscribe this Workflow to a stream, so later Workflow Tasks carry the ranges + it has not consumed yet. + + The stream's addressing is resolved by the server rather than supplied here. + A Workflow cannot look it up without doing I/O, and a value it carried would + be a reading rather than a fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Stream to consume. A stream in another execution is addressed by its id; + one this Workflow owns is addressed by the name it was published under. + The server resolves an owned name first and falls back to a standalone + id, so a Workflow that owns a stream under this name cannot reach a + standalone stream with the same id. + """ + start_offset: builtins.int + """Where to start. Negative means from wherever the stream is when the + subscription is registered, which the server resolves and records so + replay does not resolve it again. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 6d1c3b6e5..17f70d8a6 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x9c\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe7\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -39,11 +39,13 @@ COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES = 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION = 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 +COMMAND_TYPE_APPEND_STREAM_RECORDS = 19 +COMMAND_TYPE_SUBSCRIBE_STREAM = 20 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 864 + _COMMANDTYPE._serialized_end = 939 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 9f1bfd240..c6f21ab4b 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -44,6 +44,8 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: _CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: _CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 + COMMAND_TYPE_APPEND_STREAM_RECORDS: _CommandType.ValueType # 19 + COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -66,4 +68,6 @@ COMMAND_TYPE_PROTOCOL_MESSAGE: CommandType.ValueType # 14 COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 +COMMAND_TYPE_APPEND_STREAM_RECORDS: CommandType.ValueType # 19 +COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 14ff7984d..a41b486ee 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\x9e\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -82,11 +82,13 @@ EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58 EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59 EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 +EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED = 62 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 2912 + _EVENTTYPE._serialized_end = 3004 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 16a23b137..84db38b61 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -216,6 +216,16 @@ class _EventTypeEnumTypeWrapper( """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: _EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" + EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: _EventType.ValueType # 61 + """A Workflow subscribed to a stream. Recorded once per subscription, not + per record: the offsets a task consumed ride WorkflowTaskCompleted and + the payloads never enter History at all. + """ + EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: _EventType.ValueType # 62 + """A Workflow appended a batch of records to a stream. Recorded per + batch, and carrying only the offset range it landed at: the bodies go to + the stream's own log, never into History. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -408,4 +418,14 @@ EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: EventType.ValueType # 59 """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: EventType.ValueType # 61 +"""A Workflow subscribed to a stream. Recorded once per subscription, not +per record: the offsets a task consumed ride WorkflowTaskCompleted and +the payloads never enter History at all. +""" +EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: EventType.ValueType # 62 +"""A Workflow appended a batch of records to a stream. Recorded per +batch, and carrying only the offset range it landed at: the bodies go to +the stream's own log, never into History. +""" global___EventType = EventType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 03eb094f9..70229ee81 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x90\x14\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _WORKFLOWTASKFAILEDCAUSE = DESCRIPTOR.enum_types_by_name["WorkflowTaskFailedCause"] @@ -86,6 +86,9 @@ WORKFLOW_TASK_FAILED_CAUSE_EXTERNAL_STORAGE_FAILURE = 38 WORKFLOW_TASK_FAILED_CAUSE_WORKFLOW_PAUSE_REQUESTED_BEFORE_TASK_STARTED = 39 WORKFLOW_TASK_FAILED_CAUSE_REQUEST_TOO_LARGE = 40 +WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES = 41 +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES = 42 +WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE = 43 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS = 1 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND = 2 @@ -117,15 +120,15 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020FailedCauseProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _WORKFLOWTASKFAILEDCAUSE._serialized_start = 68 - _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2644 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2647 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 2967 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2970 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3243 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3246 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3600 - _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3603 - _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4138 - _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4141 - _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4284 + _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2834 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2837 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3157 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3160 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3433 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3436 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3790 + _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3793 + _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4328 + _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4331 + _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4474 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.pyi b/temporalio/api/enums/v1/failed_cause_pb2.pyi index 7e034978f..50124d1a9 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.pyi +++ b/temporalio/api/enums/v1/failed_cause_pb2.pyi @@ -188,6 +188,21 @@ class _WorkflowTaskFailedCauseEnumTypeWrapper( _WorkflowTaskFailedCause.ValueType ) # 40 """A workflow task failed because the request exceeded a size limit.""" + WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 41 + """A workflow task completed with an invalid AppendStreamRecords command.""" + WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 42 + """A workflow task completed with an invalid SubscribeStream command.""" + WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( + _WorkflowTaskFailedCause.ValueType + ) # 43 + """A workflow task could not be started because a stream range it consumed and recorded in + History can no longer be served, for example after truncation or because it exceeds the + replay bound. Check the workflow task failure message for more information. + """ class WorkflowTaskFailedCause( _WorkflowTaskFailedCause, metaclass=_WorkflowTaskFailedCauseEnumTypeWrapper @@ -346,6 +361,21 @@ WORKFLOW_TASK_FAILED_CAUSE_WORKFLOW_PAUSE_REQUESTED_BEFORE_TASK_STARTED: ( """A workflow task is failed because the workflow is paused before the task is started.""" WORKFLOW_TASK_FAILED_CAUSE_REQUEST_TOO_LARGE: WorkflowTaskFailedCause.ValueType # 40 """A workflow task failed because the request exceeded a size limit.""" +WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 41 +"""A workflow task completed with an invalid AppendStreamRecords command.""" +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 42 +"""A workflow task completed with an invalid SubscribeStream command.""" +WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( + WorkflowTaskFailedCause.ValueType +) # 43 +"""A workflow task could not be started because a stream range it consumed and recorded in +History can no longer be served, for example after truncation or because it exceeds the +replay bound. Check the workflow task failure message for more information. +""" global___WorkflowTaskFailedCause = WorkflowTaskFailedCause class _StartChildWorkflowExecutionFailedCause: diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index ec7f65962..13d56f93a 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -57,6 +57,8 @@ WorkflowExecutionUpdateRejectedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, + WorkflowStreamRecordsAppendedEventAttributes, + WorkflowStreamSubscribedEventAttributes, WorkflowTaskCompletedEventAttributes, WorkflowTaskFailedEventAttributes, WorkflowTaskScheduledEventAttributes, @@ -123,6 +125,8 @@ "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", + "WorkflowStreamRecordsAppendedEventAttributes", + "WorkflowStreamSubscribedEventAttributes", "WorkflowTaskCompletedEventAttributes", "WorkflowTaskFailedEventAttributes", "WorkflowTaskScheduledEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index ac337b708..14b3cbfb9 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -47,6 +47,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -58,7 +61,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\x82\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xca?\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -215,6 +218,12 @@ _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "ActivityPropertiesModifiedExternallyEventAttributes" ] +_WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamSubscribedEventAttributes" +] +_WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamRecordsAppendedEventAttributes" +] _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionUpdateAcceptedEventAttributes" ] @@ -819,6 +828,28 @@ ) _sym_db.RegisterMessage(ActivityPropertiesModifiedExternallyEventAttributes) +WorkflowStreamSubscribedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamSubscribedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) + +WorkflowStreamRecordsAppendedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamRecordsAppendedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamRecordsAppendedEventAttributes) + WorkflowExecutionUpdateAcceptedEventAttributes = ( _reflection.GeneratedProtocolMessageType( "WorkflowExecutionUpdateAcceptedEventAttributes", @@ -1210,140 +1241,144 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 663 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3057 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3060 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3196 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3199 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3364 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3367 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3586 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3589 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3717 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3720 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4653 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4656 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4828 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4831 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5247 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5250 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5892 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5895 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6044 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6047 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6438 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6441 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7147 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7150 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7436 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7439 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7671 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7674 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 7960 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 7963 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8161 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8163 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8277 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8280 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8554 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8557 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8704 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8706 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8777 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8780 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 8914 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8917 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9116 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9119 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9254 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9257 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9618 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9538 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9618 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9621 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 9940 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 9943 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10072 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10075 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5999 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6002 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6151 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6154 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6545 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6548 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7254 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7257 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7543 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7546 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7778 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7781 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8067 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8070 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8268 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8270 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8384 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8387 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8661 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8664 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8811 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8813 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8884 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8887 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9021 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9024 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9223 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9226 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9361 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9364 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9725 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9645 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9725 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9728 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10047 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10050 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10179 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10182 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10359 + 10466 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10362 + 10469 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10708 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10711 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 10908 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10911 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11290 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11293 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11632 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11635 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11846 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11849 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12007 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12010 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12148 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12151 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13427 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13430 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13772 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13775 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14070 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14073 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14398 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14401 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14780 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14783 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15108 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15111 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15441 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15444 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15720 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15723 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16453 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16303 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16453 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16456 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16776 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16779 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16923 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 16926 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17146 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17319 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17322 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17593 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17596 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 17760 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 17762 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 17856 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 17858 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 17954 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 17957 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18154 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18157 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 18721 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 18671 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 18721 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 18724 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 18861 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 18864 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19001 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19004 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19140 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19143 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19281 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19284 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19422 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19424 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19540 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19543 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 19694 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 19697 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 19896 - _HISTORYEVENT._serialized_start = 19899 - _HISTORYEVENT._serialized_end = 28037 - _HISTORY._serialized_start = 28039 - _HISTORY._serialized_end = 28103 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10815 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10818 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11015 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11018 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11397 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11400 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11739 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11742 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11953 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11956 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12114 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12117 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12255 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12258 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13534 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13537 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13879 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13882 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14177 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14180 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14505 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14508 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14887 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14890 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15215 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15218 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15548 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15551 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15827 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15830 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16560 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16410 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16560 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16563 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16883 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16886 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17030 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17032 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17156 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17159 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17310 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17313 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17533 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17536 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17706 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17709 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17980 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17983 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18147 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18149 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18243 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18245 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18341 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18344 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18541 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18544 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19108 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19058 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19108 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19111 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19248 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19251 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19388 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19391 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19527 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19530 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19668 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19671 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19809 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19811 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19927 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19930 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20081 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20084 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20283 + _HISTORYEVENT._serialized_start = 20286 + _HISTORYEVENT._serialized_end = 28678 + _HISTORY._serialized_start = 28680 + _HISTORY._serialized_end = 28744 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 783e9d3b6..bc708a6cb 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -23,6 +23,7 @@ import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1010,6 +1011,7 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): WORKER_DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int WORKER_DEPLOYMENT_NAME_FIELD_NUMBER: builtins.int DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int + CONSUMED_STREAM_RANGES_FIELD_NUMBER: builtins.int scheduled_event_id: builtins.int """The id of the `WORKFLOW_TASK_SCHEDULED` event this task corresponds to""" started_event_id: builtins.int @@ -1069,6 +1071,18 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): """The Worker Deployment Version that completed this task. Must be set if `versioning_behavior` is set. This value updates workflow execution's `versioning_info.deployment_version`. """ + @property + def consumed_stream_ranges( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRange + ]: + """Offset ranges this Workflow Task consumed from streams it subscribes to. + Recorded on every task where a subscription is active, including when it + observed nothing: an empty range is a fact replay must reproduce, and + omitting it would let replay deliver records the Workflow did not have. + Numbered 20 to leave 14 through 19 free for fields added on the main line. + """ def __init__( self, *, @@ -1088,6 +1102,10 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): worker_deployment_name: builtins.str = ..., deployment_version: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentVersion | None = ..., + consumed_stream_ranges: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRange + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1109,6 +1127,8 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "binary_checksum", b"binary_checksum", + "consumed_stream_ranges", + b"consumed_stream_ranges", "deployment", b"deployment", "deployment_version", @@ -3603,6 +3623,93 @@ global___ActivityPropertiesModifiedExternallyEventAttributes = ( ActivityPropertiesModifiedExternallyEventAttributes ) +class WorkflowStreamSubscribedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command created this + subscription. + """ + stream_id: builtins.str + """Stream the Workflow subscribed to.""" + start_offset: builtins.int + """The offset the subscription actually starts from. Resolved by the server + when the subscription is registered and recorded here, so replay reads + the resolved value rather than resolving it again against a stream that + has since moved. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamSubscribedEventAttributes = ( + WorkflowStreamSubscribedEventAttributes +) + +class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + RECORD_COUNT_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command appended this + batch. + """ + stream_id: builtins.str + """Stream the Workflow appended to.""" + first_offset: builtins.int + """Offset the first record of the batch landed at.""" + record_count: builtins.int + """How many records the batch held. With first_offset this names the range + without carrying any of it, which is what keeps this event a fixed size + no matter how large the batch or its payloads are. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + first_offset: builtins.int = ..., + record_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "first_offset", + b"first_offset", + "record_count", + b"record_count", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamRecordsAppendedEventAttributes = ( + WorkflowStreamRecordsAppendedEventAttributes +) + class WorkflowExecutionUpdateAcceptedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4460,6 +4567,8 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( builtins.int ) + WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_RECORDS_APPENDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4745,6 +4854,14 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_execution_time_skipping_transitioned_event_attributes( self, ) -> global___WorkflowExecutionTimeSkippingTransitionedEventAttributes: ... + @property + def workflow_stream_subscribed_event_attributes( + self, + ) -> global___WorkflowStreamSubscribedEventAttributes: ... + @property + def workflow_stream_records_appended_event_attributes( + self, + ) -> global___WorkflowStreamRecordsAppendedEventAttributes: ... def __init__( self, *, @@ -4882,6 +4999,10 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_execution_time_skipping_transitioned_event_attributes: global___WorkflowExecutionTimeSkippingTransitionedEventAttributes | None = ..., + workflow_stream_subscribed_event_attributes: global___WorkflowStreamSubscribedEventAttributes + | None = ..., + workflow_stream_records_appended_event_attributes: global___WorkflowStreamRecordsAppendedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5004,6 +5125,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_records_appended_event_attributes", + b"workflow_stream_records_appended_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5151,6 +5276,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_records_appended_event_attributes", + b"workflow_stream_records_appended_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5227,6 +5356,8 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_paused_event_attributes", "workflow_execution_unpaused_event_attributes", "workflow_execution_time_skipping_transitioned_event_attributes", + "workflow_stream_subscribed_event_attributes", + "workflow_stream_records_appended_event_attributes", ] | None ): ... diff --git a/temporalio/api/stream/__init__.py b/temporalio/api/stream/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py new file mode 100644 index 000000000..9d54188ec --- /dev/null +++ b/temporalio/api/stream/v1/__init__.py @@ -0,0 +1,8 @@ +from .message_pb2 import StreamRange, StreamRecord, StreamRecordKind, StreamSlice + +__all__ = [ + "StreamRange", + "StreamRecord", + "StreamRecordKind", + "StreamSlice", +] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py new file mode 100644 index 000000000..c28393a50 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/stream/v1/message.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xd4\x02\n\x0cStreamRecord\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x44\n\x08metadata\x18\x02 \x03(\x0b\x32\x32.temporal.api.stream.v1.StreamRecord.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x36\n\x04kind\x18\x04 \x01(\x0e\x32(.temporal.api.stream.v1.StreamRecordKind\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x03\x12\x10\n\x08sequence\x18\x07 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xb9\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x35\n\x07records\x18\x05 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"H\n\x0bStreamRange\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03*r\n\x10StreamRecordKind\x12"\n\x1eSTREAM_RECORD_KIND_UNSPECIFIED\x10\x00\x12\x1b\n\x17STREAM_RECORD_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_RECORD_KIND_FINISH\x10\x02\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' +) + +_STREAMRECORDKIND = DESCRIPTOR.enum_types_by_name["StreamRecordKind"] +StreamRecordKind = enum_type_wrapper.EnumTypeWrapper(_STREAMRECORDKIND) +STREAM_RECORD_KIND_UNSPECIFIED = 0 +STREAM_RECORD_KIND_DATA = 1 +STREAM_RECORD_KIND_FINISH = 2 + + +_STREAMRECORD = DESCRIPTOR.message_types_by_name["StreamRecord"] +_STREAMRECORD_METADATAENTRY = _STREAMRECORD.nested_types_by_name["MetadataEntry"] +_STREAMSLICE = DESCRIPTOR.message_types_by_name["StreamSlice"] +_STREAMRANGE = DESCRIPTOR.message_types_by_name["StreamRange"] +StreamRecord = _reflection.GeneratedProtocolMessageType( + "StreamRecord", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _STREAMRECORD_METADATAENTRY, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRecord.MetadataEntry) + }, + ), + "DESCRIPTOR": _STREAMRECORD, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRecord) + }, +) +_sym_db.RegisterMessage(StreamRecord) +_sym_db.RegisterMessage(StreamRecord.MetadataEntry) + +StreamSlice = _reflection.GeneratedProtocolMessageType( + "StreamSlice", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSLICE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }, +) +_sym_db.RegisterMessage(StreamSlice) + +StreamRange = _reflection.GeneratedProtocolMessageType( + "StreamRange", + (_message.Message,), + { + "DESCRIPTOR": _STREAMRANGE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRange) + }, +) +_sym_db.RegisterMessage(StreamRange) + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1" + _STREAMRECORD_METADATAENTRY._options = None + _STREAMRECORD_METADATAENTRY._serialized_options = b"8\001" + _STREAMRECORDKIND._serialized_start = 707 + _STREAMRECORDKIND._serialized_end = 821 + _STREAMRECORD._serialized_start = 103 + _STREAMRECORD._serialized_end = 443 + _STREAMRECORD_METADATAENTRY._serialized_start = 363 + _STREAMRECORD_METADATAENTRY._serialized_end = 443 + _STREAMSLICE._serialized_start = 446 + _STREAMSLICE._serialized_end = 631 + _STREAMRANGE._serialized_start = 633 + _STREAMRANGE._serialized_end = 705 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi new file mode 100644 index 000000000..74a6d4a75 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -0,0 +1,267 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys +import typing + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamRecordKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamRecordKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamRecordKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_RECORD_KIND_UNSPECIFIED: _StreamRecordKind.ValueType # 0 + """Read as DATA.""" + STREAM_RECORD_KIND_DATA: _StreamRecordKind.ValueType # 1 + """A value the producer published; `body` carries it.""" + STREAM_RECORD_KIND_FINISH: _StreamRecordKind.ValueType # 2 + """The producer named by `producer_id` writes nothing more on `topic`. + Says nothing about that producer's outcome and does not end the stream. + """ + +class StreamRecordKind(_StreamRecordKind, metaclass=_StreamRecordKindEnumTypeWrapper): + """What a record means to a reader. Kept on the record itself so every store + and every language reads it the same way without a private envelope. + """ + +STREAM_RECORD_KIND_UNSPECIFIED: StreamRecordKind.ValueType # 0 +"""Read as DATA.""" +STREAM_RECORD_KIND_DATA: StreamRecordKind.ValueType # 1 +"""A value the producer published; `body` carries it.""" +STREAM_RECORD_KIND_FINISH: StreamRecordKind.ValueType # 2 +"""The producer named by `producer_id` writes nothing more on `topic`. +Says nothing about that producer's outcome and does not end the stream. +""" +global___StreamRecordKind = StreamRecordKind + +class StreamRecord(google.protobuf.message.Message): + """One entry in a stream. The record is the wire format: stores keep it + serialized as is and readers in every language decode the same bytes. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: + """The value the producer published, stored as sent. A payload codec + applies here as it does to any other payload. + """ + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance, stored as sent.""" + topic: builtins.str + """Producer-supplied grouping label, stored as sent.""" + kind: global___StreamRecordKind.ValueType + """How to read this record. Unspecified is read as DATA.""" + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did.""" + attempt: builtins.int + """The producer's attempt. Readers treat a later attempt by the same + producer as superseding what the earlier one wrote. + """ + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. + Stored as sent; the server does not assign, validate or order by it. + """ + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + kind: global___StreamRecordKind.ValueType = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., + sequence: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "attempt", + b"attempt", + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "topic", + b"topic", + ], + ) -> None: ... + +global___StreamRecord = StreamRecord + +class StreamSlice(google.protobuf.message.Message): + """A contiguous range of a stream delivered to a Workflow Task, along with the + offsets it covers. The offsets are what History records; the records + themselves are never written to History. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + """Run id of the execution that owns the stream. Set on both a slice for the + task being started and a re-supplied one. + """ + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription observed nothing, + which is a fact replay has to reproduce rather than an absence of one. + """ + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamRecord + ]: ... + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event whose consumed_stream_ranges recorded + this range. Set only when the server is re-supplying a range for a task + being replayed; a slice for the task now being started leaves it unset, + because the event closing that task does not exist yet. + + Replay needs this because a Workflow Task response carries one slice set + while a cache miss replays every prior task, so the ranges have to be + matched to the events that recorded them rather than to the response. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + records: collections.abc.Iterable[global___StreamRecord] | None = ..., + workflow_task_completed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "records", + b"records", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___StreamSlice = StreamSlice + +class StreamRange(google.protobuf.message.Message): + """The offsets a Workflow Task consumed, without the payloads. Recorded on + WorkflowTaskCompleted so History grows with Workflow Tasks rather than with + records. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive.""" + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___StreamRange = StreamRange diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index e1b2e01c4..cdf2becc2 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -114,6 +114,9 @@ from temporalio.api.sdk.v1 import ( worker_config_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_worker__config__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -131,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xbf\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4214,578 +4217,578 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1646 - _REGISTERNAMESPACEREQUEST._serialized_end = 2294 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2251 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2294 - _REGISTERNAMESPACERESPONSE._serialized_start = 2296 - _REGISTERNAMESPACERESPONSE._serialized_end = 2323 - _LISTNAMESPACESREQUEST._serialized_start = 2326 - _LISTNAMESPACESREQUEST._serialized_end = 2463 - _LISTNAMESPACESRESPONSE._serialized_start = 2466 - _LISTNAMESPACESRESPONSE._serialized_end = 2595 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2597 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2680 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2683 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3196 - _UPDATENAMESPACEREQUEST._serialized_start = 3199 - _UPDATENAMESPACEREQUEST._serialized_end = 3534 - _UPDATENAMESPACERESPONSE._serialized_start = 3537 - _UPDATENAMESPACERESPONSE._serialized_end = 3828 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3830 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3900 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3902 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3930 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3933 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5550 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5553 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5851 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5854 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6152 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6155 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6341 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6344 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6520 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6522 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6642 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6645 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7085 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7088 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8175 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8091 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8175 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8178 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9350 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9445 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9447 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9519 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9764 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9767 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10292 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10294 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10329 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10332 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10818 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10821 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12002 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12005 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12170 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12172 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12284 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12287 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12494 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12496 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12612 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12615 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 12997 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 12999 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13037 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13040 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13247 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13249 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13291 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13294 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13740 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13742 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13829 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13832 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14103 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14105 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14196 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14199 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14581 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14583 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14620 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14623 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 14911 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 14913 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 14954 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 14957 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15217 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15219 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15259 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15262 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15612 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15614 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15691 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15694 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17033 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17036 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17194 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17197 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17646 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17648 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17696 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17699 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 17986 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 17988 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18024 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18026 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18148 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18150 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18183 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18186 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18515 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18518 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18648 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18651 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19180 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19182 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19291 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19293 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19419 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19421 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19538 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19541 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19675 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19677 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19786 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19788 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19914 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19916 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19982 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19985 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20222 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20224 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20252 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20255 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20456 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20372 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20456 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20459 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20820 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20822 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20857 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20859 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 20969 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 20971 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21001 - _SHUTDOWNWORKERREQUEST._serialized_start = 21004 - _SHUTDOWNWORKERREQUEST._serialized_end = 21287 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21289 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21313 - _QUERYWORKFLOWREQUEST._serialized_start = 21316 - _QUERYWORKFLOWREQUEST._serialized_end = 21549 - _QUERYWORKFLOWRESPONSE._serialized_start = 21552 - _QUERYWORKFLOWRESPONSE._serialized_end = 21737 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21739 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21854 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21857 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22522 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22525 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23053 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23056 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24060 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23842 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 23958 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 23960 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24060 - _GETCLUSTERINFOREQUEST._serialized_start = 24062 - _GETCLUSTERINFOREQUEST._serialized_end = 24085 - _GETCLUSTERINFORESPONSE._serialized_start = 24088 - _GETCLUSTERINFORESPONSE._serialized_end = 24553 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24498 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24553 - _GETSYSTEMINFOREQUEST._serialized_start = 24555 - _GETSYSTEMINFOREQUEST._serialized_end = 24577 - _GETSYSTEMINFORESPONSE._serialized_start = 24580 - _GETSYSTEMINFORESPONSE._serialized_end = 25157 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24721 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25157 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25159 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25268 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25271 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25494 - _CREATESCHEDULEREQUEST._serialized_start = 25497 - _CREATESCHEDULEREQUEST._serialized_end = 25829 - _CREATESCHEDULERESPONSE._serialized_start = 25831 - _CREATESCHEDULERESPONSE._serialized_end = 25879 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25881 - _DESCRIBESCHEDULEREQUEST._serialized_end = 25946 - _DESCRIBESCHEDULERESPONSE._serialized_start = 25949 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26220 - _UPDATESCHEDULEREQUEST._serialized_start = 26223 - _UPDATESCHEDULEREQUEST._serialized_end = 26515 - _UPDATESCHEDULERESPONSE._serialized_start = 26517 - _UPDATESCHEDULERESPONSE._serialized_end = 26541 - _PATCHSCHEDULEREQUEST._serialized_start = 26544 - _PATCHSCHEDULEREQUEST._serialized_end = 26700 - _PATCHSCHEDULERESPONSE._serialized_start = 26702 - _PATCHSCHEDULERESPONSE._serialized_end = 26725 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26728 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26896 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26898 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 26981 - _DELETESCHEDULEREQUEST._serialized_start = 26983 - _DELETESCHEDULEREQUEST._serialized_end = 27064 - _DELETESCHEDULERESPONSE._serialized_start = 27066 - _DELETESCHEDULERESPONSE._serialized_end = 27090 - _LISTSCHEDULESREQUEST._serialized_start = 27092 - _LISTSCHEDULESREQUEST._serialized_end = 27200 - _LISTSCHEDULESRESPONSE._serialized_start = 27202 - _LISTSCHEDULESRESPONSE._serialized_end = 27314 - _COUNTSCHEDULESREQUEST._serialized_start = 27316 - _COUNTSCHEDULESREQUEST._serialized_end = 27373 - _COUNTSCHEDULESRESPONSE._serialized_start = 27376 - _COUNTSCHEDULESRESPONSE._serialized_end = 27595 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27598 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28244 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28045 + _REGISTERNAMESPACEREQUEST._serialized_start = 1684 + _REGISTERNAMESPACEREQUEST._serialized_end = 2332 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 + _REGISTERNAMESPACERESPONSE._serialized_start = 2334 + _REGISTERNAMESPACERESPONSE._serialized_end = 2361 + _LISTNAMESPACESREQUEST._serialized_start = 2364 + _LISTNAMESPACESREQUEST._serialized_end = 2501 + _LISTNAMESPACESRESPONSE._serialized_start = 2504 + _LISTNAMESPACESRESPONSE._serialized_end = 2633 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 + _UPDATENAMESPACEREQUEST._serialized_start = 3237 + _UPDATENAMESPACEREQUEST._serialized_end = 3572 + _UPDATENAMESPACERESPONSE._serialized_start = 3575 + _UPDATENAMESPACERESPONSE._serialized_end = 3866 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 + _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 + _SHUTDOWNWORKERREQUEST._serialized_start = 21102 + _SHUTDOWNWORKERREQUEST._serialized_end = 21385 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 + _QUERYWORKFLOWREQUEST._serialized_start = 21414 + _QUERYWORKFLOWREQUEST._serialized_end = 21647 + _QUERYWORKFLOWRESPONSE._serialized_start = 21650 + _QUERYWORKFLOWRESPONSE._serialized_end = 21835 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 + _GETCLUSTERINFOREQUEST._serialized_start = 24160 + _GETCLUSTERINFOREQUEST._serialized_end = 24183 + _GETCLUSTERINFORESPONSE._serialized_start = 24186 + _GETCLUSTERINFORESPONSE._serialized_end = 24651 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 + _GETSYSTEMINFOREQUEST._serialized_start = 24653 + _GETSYSTEMINFOREQUEST._serialized_end = 24675 + _GETSYSTEMINFORESPONSE._serialized_start = 24678 + _GETSYSTEMINFORESPONSE._serialized_end = 25255 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 + _CREATESCHEDULEREQUEST._serialized_start = 25595 + _CREATESCHEDULEREQUEST._serialized_end = 25927 + _CREATESCHEDULERESPONSE._serialized_start = 25929 + _CREATESCHEDULERESPONSE._serialized_end = 25977 + _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 + _UPDATESCHEDULEREQUEST._serialized_start = 26321 + _UPDATESCHEDULEREQUEST._serialized_end = 26613 + _UPDATESCHEDULERESPONSE._serialized_start = 26615 + _UPDATESCHEDULERESPONSE._serialized_end = 26639 + _PATCHSCHEDULEREQUEST._serialized_start = 26642 + _PATCHSCHEDULEREQUEST._serialized_end = 26798 + _PATCHSCHEDULERESPONSE._serialized_start = 26800 + _PATCHSCHEDULERESPONSE._serialized_end = 26823 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 + _DELETESCHEDULEREQUEST._serialized_start = 27081 + _DELETESCHEDULEREQUEST._serialized_end = 27162 + _DELETESCHEDULERESPONSE._serialized_start = 27164 + _DELETESCHEDULERESPONSE._serialized_end = 27188 + _LISTSCHEDULESREQUEST._serialized_start = 27190 + _LISTSCHEDULESREQUEST._serialized_end = 27298 + _LISTSCHEDULESRESPONSE._serialized_start = 27300 + _LISTSCHEDULESRESPONSE._serialized_end = 27412 + _COUNTSCHEDULESREQUEST._serialized_start = 27414 + _COUNTSCHEDULESREQUEST._serialized_end = 27471 + _COUNTSCHEDULESRESPONSE._serialized_start = 27474 + _COUNTSCHEDULESRESPONSE._serialized_end = 27693 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28156 + 28254 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28158 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28231 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28246 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28310 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28312 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28407 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28409 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28525 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28528 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30245 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29580 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29693 + 29791 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29696 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29825 + 29923 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29827 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29891 + 29989 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29893 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 29999 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30001 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30111 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30113 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30175 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30177 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30232 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30248 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30500 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30502 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30574 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30577 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30826 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30829 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 30985 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 30987 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31101 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31104 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31365 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31368 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31627 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31630 - _STARTBATCHOPERATIONREQUEST._serialized_end = 32996 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 32998 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33027 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33029 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33125 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33127 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33155 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33157 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33223 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33226 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33698 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33700 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33791 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33793 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 33914 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 33917 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34102 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34105 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34324 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34327 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34743 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34746 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35100 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35103 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35270 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35272 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35307 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35310 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35530 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35532 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35564 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35567 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 35939 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35733 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 35939 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 35942 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36274 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36068 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36274 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36277 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36613 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36616 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 36935 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 36937 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37037 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37039 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37148 - _PAUSEACTIVITYREQUEST._serialized_start = 37151 - _PAUSEACTIVITYREQUEST._serialized_end = 37350 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37353 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37536 - _PAUSEACTIVITYRESPONSE._serialized_start = 37538 - _PAUSEACTIVITYRESPONSE._serialized_end = 37561 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37563 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37595 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37598 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37878 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37881 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38154 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38156 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38181 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38183 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38217 - _RESETACTIVITYREQUEST._serialized_start = 38220 - _RESETACTIVITYREQUEST._serialized_end = 38527 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38530 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38820 - _RESETACTIVITYRESPONSE._serialized_start = 38822 - _RESETACTIVITYRESPONSE._serialized_end = 38845 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38847 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38879 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38882 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39166 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39169 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39346 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39348 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39454 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39456 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39553 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39556 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39750 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39753 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40014 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40407 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40484 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40487 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40627 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40629 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40737 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40739 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40858 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40861 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41066 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41069 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41254 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41257 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41486 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41489 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 41932 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 41935 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42159 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42161 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42274 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42276 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42332 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42334 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42427 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42430 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43101 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42605 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43101 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43104 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43344 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43346 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43385 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43388 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43588 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43590 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43629 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43631 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43724 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43726 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43758 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43761 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44279 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44331 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44334 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44834 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44836 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44890 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44893 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45311 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45226 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 + _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 + _PAUSEACTIVITYREQUEST._serialized_start = 37249 + _PAUSEACTIVITYREQUEST._serialized_end = 37448 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 + _PAUSEACTIVITYRESPONSE._serialized_start = 37636 + _PAUSEACTIVITYRESPONSE._serialized_end = 37659 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 + _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 + _RESETACTIVITYREQUEST._serialized_start = 38318 + _RESETACTIVITYREQUEST._serialized_end = 38625 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 + _RESETACTIVITYRESPONSE._serialized_start = 38920 + _RESETACTIVITYRESPONSE._serialized_end = 38943 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 + _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 + _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45311 + 45409 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45313 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45423 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45426 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45615 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45617 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45716 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45718 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45787 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45789 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45896 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45898 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46011 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46014 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46241 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46244 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46424 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46426 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46521 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46523 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46588 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46590 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46671 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46673 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46736 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46738 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46766 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46768 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46838 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46840 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 46944 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 46947 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47153 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47155 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47201 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47204 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47359 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47361 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47392 - _LISTWORKERSREQUEST._serialized_start = 47395 - _LISTWORKERSREQUEST._serialized_end = 47525 - _LISTWORKERSRESPONSE._serialized_start = 47528 - _LISTWORKERSRESPONSE._serialized_end = 47693 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47696 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48421 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48263 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48354 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 + _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 + _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 + _LISTWORKERSREQUEST._serialized_start = 47493 + _LISTWORKERSREQUEST._serialized_end = 47623 + _LISTWORKERSRESPONSE._serialized_start = 47626 + _LISTWORKERSRESPONSE._serialized_end = 47791 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48356 + 48454 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48421 + 48519 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48423 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48514 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48517 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48675 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48677 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48762 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48765 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49031 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49033 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49133 - _DESCRIBEWORKERREQUEST._serialized_start = 49135 - _DESCRIBEWORKERREQUEST._serialized_end = 49206 - _DESCRIBEWORKERRESPONSE._serialized_start = 49208 - _DESCRIBEWORKERRESPONSE._serialized_end = 49289 - _COUNTWORKERSREQUEST._serialized_start = 49291 - _COUNTWORKERSREQUEST._serialized_end = 49378 - _COUNTWORKERSRESPONSE._serialized_start = 49380 - _COUNTWORKERSRESPONSE._serialized_end = 49417 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49420 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49561 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49563 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49595 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49598 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49741 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49743 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49777 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49780 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 50957 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 50959 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51068 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51071 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51299 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51302 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51618 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51620 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51706 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51708 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51824 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51826 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 51935 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 51938 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52068 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52071 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52870 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 52922 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 52993 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52996 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53166 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53169 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53480 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53483 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53644 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53647 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53908 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 53910 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54025 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54028 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54167 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54169 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54235 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54238 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54475 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54477 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54552 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54801 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54804 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 54953 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 54955 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 54995 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 54998 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55143 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55145 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55181 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55183 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55271 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55273 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55306 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55309 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55465 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55467 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55513 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55516 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55668 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55670 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55712 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55714 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55809 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55811 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55850 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55853 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56010 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56013 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56245 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 + _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 + _DESCRIBEWORKERREQUEST._serialized_start = 49233 + _DESCRIBEWORKERREQUEST._serialized_end = 49304 + _DESCRIBEWORKERRESPONSE._serialized_start = 49306 + _DESCRIBEWORKERRESPONSE._serialized_end = 49387 + _COUNTWORKERSREQUEST._serialized_start = 49389 + _COUNTWORKERSREQUEST._serialized_end = 49476 + _COUNTWORKERSRESPONSE._serialized_start = 49478 + _COUNTWORKERSRESPONSE._serialized_end = 49515 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index eb9243716..e66c90384 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -46,6 +46,7 @@ import temporalio.api.schedule.v1.message_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.sdk.v1.worker_config_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.version.v1.message_pb2 @@ -1278,6 +1279,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_ID_FIELD_NUMBER: builtins.int POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int + STREAM_SLICES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1392,6 +1394,15 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): 3. If every group has some pending polls, assign the next poll to a group randomly according to the weights. """ + @property + def stream_slices( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ]: + """Stream data attached to this task. Delivered out of band so the payloads + never enter History; only the offset ranges are recorded there. + """ def __init__( self, *, @@ -1427,6 +1438,10 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): | None = ..., poller_groups_info: temporalio.api.taskqueue.v1.message_pb2.PollerGroupsInfo | None = ..., + stream_slices: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1484,6 +1499,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"started_event_id", "started_time", b"started_time", + "stream_slices", + b"stream_slices", "task_token", b"task_token", "workflow_execution", From 1effd48cccc5c317f9cae308a5482d4720c3db33 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:54:17 -0700 Subject: [PATCH 227/831] Split the stream provider in two and made the proto the record. The registry, its string names and the private frame envelope go. A provider is an object that serves workers as a plugin and hands out handles outside them, and every store keeps the StreamRecord proto. --- temporalio/streams/__init__.py | 204 ++------- temporalio/streams/_frame.py | 72 --- temporalio/streams/_handles.py | 211 --------- temporalio/streams/_ids.py | 19 +- temporalio/streams/_policy.py | 33 +- temporalio/streams/_provider.py | 487 +++++++------------- temporalio/streams/_record.py | 58 ++- temporalio/streams/_wire.py | 181 ++++++++ temporalio/streams/providers/__init__.py | 79 +++- temporalio/streams/providers/memory.py | 545 +++++++++++++---------- 10 files changed, 832 insertions(+), 1057 deletions(-) delete mode 100644 temporalio/streams/_frame.py delete mode 100644 temporalio/streams/_handles.py create mode 100644 temporalio/streams/_wire.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 0b43830cb..30d1f9a98 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -1,69 +1,58 @@ -"""A stream a workflow can read, decide on, and write. +"""Streams: a channel a workflow reads, decides on, and writes. + +.. warning:: + This module is experimental and may change in future versions. The + design is meant to be the shape that goes GA; the label is the SDK's + release convention, not a licence to break it. The contract, in five statements: -1. **A workflow publishes only to its own stream, and it publishes - transactionally.** :meth:`StreamWriter.publish` returns without the record - being visible. The record appears when the workflow task is accepted, and - never if the task fails, so no reader can see a decision the workflow did - not commit. +1. **A workflow publishes only to topics of its own stream, and it publishes + transactionally.** :meth:`temporalio.workflow.StreamWriter.publish` + returns at once. The record is visible when the Workflow Task is accepted, + and never if the task fails, so no reader can see a decision the workflow + did not commit. 2. **Reading is an observation, and the SDK records it.** What - :class:`StreamReader` handed to workflow code, including the boundary where - it found nothing, is committed with the commands that reading produced. - Recovery re-supplies the same records in the same order. -3. **Anything that does I/O publishes on its own account.** An activity, a - local activity, or an outside process writes through :func:`producer`, - either into one of the workflow's inbound streams or onto a topic of the - stream the workflow publishes, and its records are visible as soon as they - are written. It carries a producer id, an attempt and a sequence so a retry - can be told from a new generation. + :class:`temporalio.workflow.StreamReader` handed to workflow code, + including the boundary where it found nothing, is committed with the + commands that reading produced. Recovery re-supplies the same records in + the same order. +3. **Anything that does I/O publishes on its own account.** An activity or an + outside process writes through a :class:`StreamProducer` with a producer + id, an attempt and a sequence, and its records are visible as soon as the + store accepts them. Those three let a reader tell a retry from a new + generation. 4. **A cursor is opaque and belongs to its provider.** Hand it back to resume - after the record it names. Do not compare two cursors or do arithmetic on - one: one provider numbers records with integers and another with a - millisecond-and-sequence pair. A reader that wants to follow from now asks - the consumer for :meth:`Consumer.latest` instead of guessing a position. -5. **A workflow names its streams relative to itself, and the provider - resolves them.** ``reader("inputs")`` is this workflow's inbound stream - called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One - provider stores that as a namespace-level stream id and another as a name - under the run's chain key, and workflow code does not have to know which. - The provider itself is chosen when the worker is built. - -Outside a workflow there is no worker to carry the choice, so a process calls -:func:`configure` once before it opens a :func:`producer` or a -:func:`consumer`, and passes :func:`worker_options` to its ``Worker`` and -``Replayer``. Those two calls are where a provider is named. Nothing else in -this module mentions one. Code that needs a second provider next to the -process default, such as a handler that serves one store while its process -talks to another, holds one from :func:`instance`. - -Three lifecycle hooks let a provider borrow the caller's lifetime, and each -is a no-op on a provider that needs nothing, so portable code calls all -three unconditionally: :func:`prepare` from the workflow's constructor, for a -transport that registers handlers on the workflow; :func:`drain` before the -workflow returns, for one that parks readers against the run; and -:func:`close`, awaited when the process is done with streams, for one that -holds connections. - -Reading somebody else's stream is out of scope for the first release. It is -the topology no provider has evidence for, and leaving it out is what lets -every provider implement the rest. + strictly after the record it names; :meth:`StreamHandle.latest` positions a + follower. Do not compare two cursors or do arithmetic on one. +5. **A workflow addresses its streams relative to itself, by topic.** A topic + can be written by the workflow and by outside producers, and read by the + workflow and by outside consumers; which of those happen is the + application's business. + +Workflow-side entry points live in :mod:`temporalio.workflow`: +:func:`temporalio.workflow.stream_reader` and +:func:`temporalio.workflow.stream_writer`. Outside a workflow, a handle comes +from a provider instance: ``provider.get_stream_handle(client, workflow_id)``. +A provider is an object; when it serves workers it is also a +:class:`temporalio.worker.Plugin`, passed as ``Worker(plugins=[provider])`` +and ``Replayer(plugins=[provider])``. This module keeps the shared types, the +errors and the protocols a provider implements; nothing here that workflow +code imports does I/O. What the contract does not promise: that a :attr:`RecordKind.FINISH` record means the writing activity succeeded, that a superseded attempt's records can be withdrawn, or that a stream outlives the retention its provider is -configured for. +configured for. Reading somebody else's stream is out of scope for this +release. -The public names are the proposal; providers live under -:mod:`temporalio.streams.providers`, one module each, registered by name and -chosen by :func:`configure`. Everything else is shared. +The record on the wire is ``temporal.api.stream.v1.StreamRecord`` on every +provider, with the user's value in ``body`` as an ordinary payload, so a +reader in any language decodes the same bytes and a payload codec applies. """ from __future__ import annotations -from datetime import timedelta -from typing import Any, TypeVar, overload - from temporalio.streams._errors import ( StreamCursorError, StreamError, @@ -71,27 +60,13 @@ StreamProducerError, StreamUnsupportedError, ) -from temporalio.streams._handles import ( - ReadSource, - StreamReader, - StreamWriter, - WriteSink, -) from temporalio.streams._provider import ( - Consumer, - Producer, + ReadSource, + StreamHandle, + StreamProducer, StreamProvider, - StreamProviderLifecycle, - close, - configure, - consumer, - drain, - instance, - open_read, - open_write, - prepare, - producer, - worker_options, + WorkflowStreamProvider, + WriteSink, ) from temporalio.streams._record import ( BEGINNING, @@ -103,100 +78,19 @@ __all__ = [ "BEGINNING", - "Consumer", "Cursor", - "Producer", "ReadSource", "RecordKind", "StreamCursorError", "StreamError", + "StreamHandle", "StreamNotFoundError", + "StreamProducer", "StreamProducerError", "StreamProvider", - "StreamProviderLifecycle", - "StreamReader", "StreamRecord", "StreamUnsupportedError", - "StreamWriter", "Supersession", + "WorkflowStreamProvider", "WriteSink", - "close", - "configure", - "consumer", - "drain", - "instance", - "prepare", - "producer", - "reader", - "worker_options", - "writer", ] - -T = TypeVar("T") - - -@overload -def reader( - stream: str, - *, - type: type[T], - after: Cursor = ..., - idle_timeout: timedelta | None = ..., -) -> StreamReader[T]: ... - - -@overload -def reader( - stream: str, - *, - type: None = None, - after: Cursor = ..., - idle_timeout: timedelta | None = ..., -) -> StreamReader[Any]: ... - - -def reader( - stream: str, - *, - type: type | None = None, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, -) -> StreamReader[Any]: - """Subscribe this workflow to its inbound stream ``stream``. - - Each call is a separate subscription with its own cursor, so adding, - removing or reordering one renumbers the waits after it. Gate a change - behind :func:`temporalio.workflow.patched` as you would for a timer. - - An inbound stream has no topics: its name is the whole address, and - every record on it arrives with an empty ``topic``. Topics belong to the - stream the workflow publishes, which :func:`consumer` reads from outside. - - Args: - stream: The inbound stream's name, relative to this workflow. - type: The value type, used as the decode hint. - after: Resume after this record. Only honoured on the first - subscription of a run, because after that the recorded cursor - decides. - idle_timeout: How long the workflow waits with nothing arriving before - the provider is allowed to release the worker. ``None`` takes the - provider's default. - """ - return StreamReader( - open_read(stream, after=after, idle_timeout=idle_timeout), type=type - ) - - -def writer(topic: str) -> StreamWriter[Any]: - """Publish to ``topic`` on the stream this workflow owns. - - Args: - topic: The topic name. Encoding follows each published value. - """ - return StreamWriter(open_write(topic), topic) - - -# Importing the package registers every provider whose dependencies are -# present in this tree. Import order matters: the registry above must exist -# before a provider module can register with it. -from temporalio.streams import providers as providers # noqa: E402 diff --git a/temporalio/streams/_frame.py b/temporalio/streams/_frame.py deleted file mode 100644 index df4b4dbd6..000000000 --- a/temporalio/streams/_frame.py +++ /dev/null @@ -1,72 +0,0 @@ -"""The record envelope every provider puts on the wire. - -A provider stores an opaque body. The contract needs more than a body: which -topic a record belongs to, whether it is data or a terminal marker, and which -producer attempt wrote it. No provider carries all of that in a channel of -its own, so the interface carries it here and each provider stores the result -as an ordinary body. - -Encoding is synchronous and deterministic because a workflow publishes on the -workflow thread. The header is JSON with sorted keys for that reason, and -because a stored record that a person can read is worth more during an -incident than a few saved bytes. -""" - -from __future__ import annotations - -import json -from typing import Any - -from temporalio.streams._record import RecordKind - -__all__ = ["decode", "encode"] - -_MAGIC = b"tsf1" - - -def encode( - *, - topic: str, - kind: RecordKind, - producer: str, - attempt: int, - sequence: int, - body: bytes, -) -> bytes: - """Wrap one already-encoded body with the contract's metadata.""" - header: dict[str, Any] = {"k": int(kind), "t": topic} - # Omitted rather than written as a default, so a workflow's own publish - # does not carry three fields that only mean something for a producer. - if producer: - header["p"] = producer - if attempt: - header["a"] = attempt - if sequence >= 0: - header["s"] = sequence - raw = json.dumps(header, sort_keys=True, separators=(",", ":")).encode() - return _MAGIC + len(raw).to_bytes(4, "big") + raw + body - - -def decode(frame: bytes) -> tuple[RecordKind, str, str, int, int, bytes]: - """Split a frame into ``(kind, topic, producer, attempt, sequence, body)``. - - Raises: - ValueError: The bytes are not a frame this interface wrote. Reading a - stream someone else populated is a real case, so it fails with a - name rather than an index error. - """ - if len(frame) < 8 or frame[:4] != _MAGIC: - raise ValueError( - "this record was not written through the stream interface, so its " - "topic and producer are unknown" - ) - size = int.from_bytes(frame[4:8], "big") - header = json.loads(frame[8 : 8 + size]) - return ( - RecordKind(header.get("k", int(RecordKind.DATA))), - header.get("t", ""), - header.get("p", ""), - int(header.get("a", 0)), - int(header.get("s", -1)), - frame[8 + size :], - ) diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py deleted file mode 100644 index 6d821f32c..000000000 --- a/temporalio/streams/_handles.py +++ /dev/null @@ -1,211 +0,0 @@ -"""The handles workflow code holds. - -Everything provider-specific sits behind the two protocols at the top. A -handle converts values, frames records and synthesizes supersession; a -provider only moves bytes. -""" - -from __future__ import annotations - -from collections.abc import AsyncIterator -from typing import Any, Generic, Protocol, TypeVar, cast - -from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.streams import _frame -from temporalio.streams._policy import AttemptTracker -from temporalio.streams._record import Cursor, RecordKind, StreamRecord - -__all__ = ["ReadSource", "StreamReader", "StreamWriter", "WriteSink"] - -T = TypeVar("T") - - -class ReadSource(Protocol): - """One subscription, as a provider supplies it.""" - - async def next_batch(self) -> list[tuple[Cursor, bytes]]: - """The next records, waiting until there is at least one. - - A batch rather than a record because delivery boundaries are what a - provider actually records, and flattening them here keeps that out of - the contract. - - Raises: - StopAsyncIteration: This subscription has ended. - """ - ... - - def close(self) -> None: - """End the subscription. Idempotent.""" - ... - - -class WriteSink(Protocol): - """One topic on the stream the running workflow owns.""" - - async def publish(self, frame: bytes) -> None: - """Accept one framed record into this workflow task's output. - - Awaitable because a provider may hold the publisher back when its - batch is full. It does not mean the record is visible: it becomes - visible when the workflow task is accepted. - """ - ... - - -def _encode_value(value: Any) -> bytes: - converter = workflow.payload_converter() - payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] - return payload.SerializeToString() - - -def _decode_value(body: bytes, as_type: type | None) -> Any: - converter = workflow.payload_converter() - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] - - -class StreamWriter(Generic[T]): - """Publishes to a topic on the stream this workflow owns. - - A workflow can only publish transactionally to a stream it owns, on - every provider. Writing to somebody else's stream is an activity's job, - and it gets the weaker guarantee that goes with doing I/O. - """ - - def __init__(self, sink: WriteSink, topic: str) -> None: - """Prefer :func:`temporalio.streams.writer`.""" - self._sink = sink - self._topic = topic - self._finished = False - - @property - def topic(self) -> str: - """The topic this writer is bound to.""" - return self._topic - - async def publish(self, value: T) -> None: - """Append ``value`` to this topic. - - Returning does not mean the record is visible. It becomes visible when - this workflow task is accepted, and never at all if the task fails, so - a reader cannot see a decision the workflow did not commit. - """ - if self._finished: - raise RuntimeError(f"topic {self._topic!r} was already finished") - await self._sink.publish( - _frame.encode( - topic=self._topic, - kind=RecordKind.DATA, - producer="", - attempt=0, - sequence=-1, - body=_encode_value(value), - ) - ) - - async def finish(self) -> None: - """Declare this topic complete. - - Says the writer has nothing more to send. It does not say the workflow - or the activity behind it succeeded, and a reader that treats it that - way will accept output from an attempt that later timed out. - """ - if self._finished: - return - self._finished = True - await self._sink.publish( - _frame.encode( - topic=self._topic, - kind=RecordKind.FINISH, - producer="", - attempt=0, - sequence=-1, - body=b"", - ) - ) - - -class StreamReader(Generic[T]): - """Reads an inbound stream from inside workflow code. - - Iterating yields every kind of record, including the supersession the - reader synthesizes when a producer's newer attempt appears. Check - ``record.kind``, or use :meth:`values` when the workflow genuinely only - wants data. - """ - - def __init__(self, source: ReadSource, *, type: type | None = None) -> None: - """Prefer :func:`temporalio.streams.reader`.""" - self._source = source - self._type = type - self._pending: list[StreamRecord[Any]] = [] - self._attempts = AttemptTracker() - self._closed = False - - def __aiter__(self) -> AsyncIterator[StreamRecord[T]]: - """Iterate records until the reader is closed.""" - return self._iterate() - - async def _iterate(self) -> AsyncIterator[StreamRecord[T]]: - while not self._closed: - try: - record = await self._next() - except StopAsyncIteration: - # The provider ended the subscription. Iteration stops rather - # than raising, so a workflow that reads to the end of a - # finished stream leaves the loop instead of failing its task. - return - yield record - - async def values(self) -> AsyncIterator[T]: - """Iterate the data values, dropping control records.""" - async for record in self: - if record.kind is RecordKind.DATA: - yield cast("T", record.value) - - async def _next(self) -> StreamRecord[T]: - while not self._pending: - await self._fill() - return self._pending.pop(0) - - async def _fill(self) -> None: - for cursor, frame in await self._source.next_batch(): - try: - kind, topic, producer, attempt, sequence, body = _frame.decode(frame) - except ValueError as error: - # Skipped rather than raised: a poisoned record would - # otherwise fail this task on every retry and pin the - # workflow, while an outside reader of the same stream - # skips it. The two readers agree on the answer. - workflow.logger.warning( - "skipping stream record at %s: %s", cursor, error - ) - continue - superseded = self._attempts.note(producer, attempt, cursor) - if superseded is not None: - self._pending.append(superseded) - self._pending.append( - StreamRecord( - value=( - _decode_value(body, self._type) - if kind is RecordKind.DATA - else None - ), - cursor=cursor, - kind=kind, - topic=topic, - producer=producer, - attempt=attempt, - sequence=sequence, - ) - ) - - def close(self) -> None: - """End the subscription. Idempotent.""" - self._closed = True - self._source.close() diff --git a/temporalio/streams/_ids.py b/temporalio/streams/_ids.py index 5f4161053..2a76dcf19 100644 --- a/temporalio/streams/_ids.py +++ b/temporalio/streams/_ids.py @@ -1,14 +1,14 @@ -"""The store key a provider derives from a workflow id and a stream name. +"""The store key a provider derives from a workflow id and a topic. A workflow id may contain any character, ``:`` included, so joining the pair with a bare ``:`` is ambiguous: ``("a:b", "c")`` and ``("a", "b:c")`` would land in one store. Every provider that keys a store by the pair goes through -:func:`inbound_stream_id`, so they all agree and none of them collides. +:func:`topic_key`, so they all agree and none of them collides. """ from __future__ import annotations -__all__ = ["inbound_stream_id"] +__all__ = ["topic_key"] def _escape(component: str) -> str: @@ -17,15 +17,10 @@ def _escape(component: str) -> str: return component.replace("%", "%25").replace(":", "%3A") -def inbound_stream_id(workflow_id: str, stream: str) -> str: - """The store id for inbound ``stream`` of ``workflow_id``. - - With an empty ``stream`` it is the id of the stream the workflow itself - publishes, so one function keys both. +def topic_key(workflow_id: str, topic: str) -> str: + """The store key for ``topic`` of ``workflow_id``'s stream. Both components are percent-encoded before joining, so the only bare ``:`` - in the result is the separator, and an owner-stream key has none. + in the result is the separator. """ - if not stream: - return _escape(workflow_id) - return f"{_escape(workflow_id)}:{_escape(stream)}" + return f"{_escape(workflow_id)}:{_escape(topic)}" diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py index 73114bbdb..81949e4fc 100644 --- a/temporalio/streams/_policy.py +++ b/temporalio/streams/_policy.py @@ -12,6 +12,8 @@ from __future__ import annotations +from typing import Any + from temporalio.streams._record import ( Cursor, RecordKind, @@ -30,28 +32,35 @@ def __init__(self) -> None: self._attempts: dict[str, int] = {} def note( - self, producer: str, attempt: int, cursor: Cursor - ) -> StreamRecord[Supersession] | None: + self, producer_id: str, attempt: int, *, topic: str, previous: Cursor + ) -> StreamRecord[Any] | None: """A supersession record when this record starts a newer attempt. + ``previous`` is the cursor of the last record delivered before the one + being noted, or the cursor the read started from. The synthesized + record carries it, so a consumer that checkpoints the supersession and + resumes after it is handed the new attempt's first record next rather + than skipping it. + A producer that declares no attempt supersedes nothing, because there is no generation to compare. That is the same answer as an unnumbered record: the interface reports what it was told and invents nothing. """ - if not producer or attempt <= 0: + if not producer_id or attempt <= 0: return None - previous = self._attempts.get(producer, 0) - if attempt <= previous: + seen = self._attempts.get(producer_id, 0) + if attempt <= seen: return None - self._attempts[producer] = attempt - if previous == 0: + self._attempts[producer_id] = attempt + if seen == 0: return None return StreamRecord( - value=Supersession( - producer=producer, previous_attempt=previous, attempt=attempt - ), - cursor=cursor, kind=RecordKind.SUPERSEDED, - producer=producer, + cursor=previous, + topic=topic, + producer_id=producer_id, attempt=attempt, + supersession=Supersession( + producer_id=producer_id, previous_attempt=seen, attempt=attempt + ), ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 89e32a2c7..6992f0a14 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -1,418 +1,253 @@ -"""The provider registry: where a process names its stream provider. - -A provider only moves bytes. The handles, records, framing and supersession -around it are shared, so every provider module is small: it implements -:class:`StreamProvider` and registers a factory under a short name when it is -imported. One :func:`configure` call decides which factory serves this -process; :func:`worker_options` makes the same choice for a worker when -exactly one provider is registered. +"""What a provider implements, in two halves. + +:class:`WorkflowStreamProvider` runs on the workflow thread and must keep the +contract's first two rules: publishes commit with the Workflow Task, and reads +are recorded observations. Nothing it needs may do I/O. :class:`StreamProvider` +is the half a process holds: it makes the workflow half for a worker and hands +out :class:`StreamHandle` objects to code outside a workflow. A Python provider +usually implements both on one class; the split is what lets a language whose +workflow code is bundled separately name the two halves in two packages. + +A provider only moves ``temporal.api.stream.v1.StreamRecord`` protos. The +handles around it convert values, synthesize supersession and mint cursors. """ from __future__ import annotations from collections.abc import AsyncGenerator -from datetime import timedelta -from typing import Any, Callable, Protocol, TypeVar, overload +from typing import TYPE_CHECKING, Any, Protocol, TypeVar, overload -from temporalio import activity -from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.api.stream.v1 import StreamRecord as WireRecord from temporalio.streams._record import BEGINNING, Cursor, StreamRecord +if TYPE_CHECKING: + from temporalio.client import Client + __all__ = [ - "Consumer", - "Producer", + "ReadSource", + "StreamHandle", + "StreamProducer", "StreamProvider", - "StreamProviderLifecycle", - "check_topic", - "close", - "configure", - "consumer", - "drain", - "instance", - "open_read", - "open_write", - "prepare", - "producer", - "register", - "registered", - "worker_options", + "WorkflowStreamProvider", + "WriteSink", ] T = TypeVar("T") -class Producer(Protocol): - """Appends to a stream from outside workflow code. +class StreamProducer(Protocol): + """Appends to one topic from outside workflow code. - Every append is visible as soon as the provider accepts it, and carries - the producer id, attempt and sequence that let a reader tell a retried - append from a new generation. + Every append is visible as soon as the store accepts it, and carries the + producer id, attempt and sequence that let a reader tell a retried append + from a new generation. """ + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + ... + @property def attempt(self) -> int: - """The generation this producer is writing.""" + """The generation this producer is writing, or 0 when undeclared.""" ... async def append(self, *values: Any) -> Cursor | None: - """Append values and return the cursor of the last one written. - - The last rather than the first, so ``read(after=appended)`` yields - only what came later. ``None`` when nothing was written, because the - batch was empty or a repeat the provider dropped, and on a transport - that learns positions only at read time; a caller that needs to - position itself on such a transport asks :meth:`Consumer.latest`. + """Append ``values`` and return the cursor of the last record as the store holds it. + + A repeat of an earlier append (same producer, attempt and sequence) is + written once and returns the position the original landed at. An + empty call writes nothing and returns the same value a repeat would: + the position of this producer's last record, or ``BEGINNING`` when it + has written none. ``None`` means one thing only: this provider learns + positions at read time, and a caller that needs one positions itself + with :meth:`StreamHandle.latest`. + + Raises: + StreamProducerError: The attempt or sequence conflicts with what + the store holds. """ ... async def finish(self) -> None: - """Declare this producer's output complete.""" + """Write ``FINISH`` for this producer on this topic. + + Says this producer has nothing more to send. It does not say the + activity behind it succeeded, and it does not end anyone's read. + """ ... -class Consumer(Protocol): - """Reads a stream from outside workflow code, resumably.""" +class StreamHandle(Protocol): + """One workflow's stream, addressed by topic, from outside workflow code. + + A handle follows the workflow's execution chain unless it was opened with + a ``run_id``, in which case it is pinned to that run. A transport failure + surfaces as :class:`temporalio.service.RPCError`, never as the transport's + own exception type. + """ @overload def read( - self, - *, - after: Cursor = ..., - topic: str | None = ..., - type: type[T], + self, *, topic: str, after: Cursor = ..., result_type: type[T] ) -> AsyncGenerator[StreamRecord[T], None]: ... @overload def read( - self, - *, - after: Cursor = ..., - topic: str | None = ..., - type: None = None, + self, *, topic: str, after: Cursor = ..., result_type: None = None ) -> AsyncGenerator[StreamRecord[Any], None]: ... def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield the records after ``after`` as they arrive. - - ``BEGINNING`` yields everything the stream retains. Any other cursor - came from a record this or another reader saw, and reading resumes - just past it, so a reader that stores the last cursor it handled and - hands it back sees every record exactly once. ``topic`` filters the - stream the workflow publishes; an inbound stream has no topics, and - naming one there raises ``ValueError``. The result is a generator so - a caller that stops early can ``aclose()`` it and release whatever - the provider parked against the store. + """Yield the records on ``topic`` after ``after`` as they arrive. + + ``BEGINNING`` yields everything the topic retains. Any other cursor + came from a record a reader saw, and reading resumes just past it, so + a reader that stores the last cursor it handled and hands it back + sees every record exactly once. The read ends when the owning + execution, or its chain, is closed and every retained record after + ``after`` has been delivered; until then it waits. The result is a + generator, so a caller that stops early can ``aclose()`` it and + release whatever the provider parked against the store. + + Raises: + StreamCursorError: ``after`` came from another provider or names + a record no longer retained. Raised by this call, not by the + first iteration. + StreamNotFoundError: The workflow or topic does not exist or is + past retention. """ ... - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the newest record, or ``BEGINNING`` when there is none. + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest record on ``topic``, or ``BEGINNING`` when empty. For a reader that wants to follow from now: ``read(after=latest())`` yields only what is published after this call returned, which is how a client that is about to send a message positions itself before - sending, without the workflow having to report a position. ``topic`` - is for the provider that keeps each topic in its own store. + sending, without the workflow having to report a position. """ ... + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> StreamProducer: + """A producer on ``topic``. -class StreamProvider(Protocol): - """What a provider module implements. + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer, and they are what + let a reader tell a retry from a new generation. Outside one, + ``producer_id`` is required and an empty one raises ``ValueError``. + """ + ... - The workflow-side pair (:meth:`open_read`, :meth:`open_write`) runs inside - workflow code and must keep the contract's first two rules: publishes - commit with the workflow task, and reads are recorded observations. The - outside pair (:meth:`producer`, :meth:`consumer`) runs anywhere and moves - framed bytes. A transport-only provider may serve just the outside pair - and raise on the workflow side, naming the provider a worker should use. - A provider whose transport parks something against the running workflow - also implements :class:`StreamProviderLifecycle`. - """ +class ReadSource(Protocol): + """One subscription, as a provider supplies it to the workflow thread.""" - name: str + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + """The next records with their positions, waiting until there is at least one. - def configure(self, **options: Any) -> None: - """Accept this provider's process-level options.""" - ... + A batch rather than a record because delivery boundaries are what a + provider actually records, and flattening them here keeps that out of + the contract. A record that cannot be parsed into a ``StreamRecord`` + proto is the provider's to skip. - def worker_options(self) -> dict[str, Any]: - """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + Raises: + StopAsyncIteration: This subscription has ended. + """ ... - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - """Subscribe the running workflow to its inbound stream ``stream``.""" + def close(self) -> None: + """End the subscription. Idempotent.""" ... - def open_write(self, topic: str) -> WriteSink: - """Bind ``topic`` on the stream the running workflow owns.""" - ... - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> Producer: - """Open a producer that appends on ``workflow_id``'s account. - - ``stream`` names one of the workflow's inbound streams. With no - ``stream``, ``topic`` names a topic on the stream the workflow itself - publishes, which is how an activity puts its live output next to the - workflow's own records for the same outside reader. ``producer_id`` - is never empty here: the package resolved it, from the activity - context when the caller left it unset. - """ - ... +class WriteSink(Protocol): + """One topic of the running workflow's stream, as a provider binds it.""" + + def publish(self, record: WireRecord) -> None: + """Take one record into this Workflow Task's output. - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> Consumer: - """Open a reader on ``workflow_id``'s own stream, or its inbound ``stream``.""" + Synchronous: there is nothing to wait for inside a task, because the + task is the visibility boundary. The provider commits what it buffered + when the task completes and drops it when the task fails. A record + the provider cannot stage raises :class:`temporalio.streams.StreamError` + and fails the task, loudly. + """ ... -class StreamProviderLifecycle(Protocol): - """The hooks a provider adds when it needs the workflow's own lifetime. +class WorkflowStreamProvider(Protocol): + """The half of a provider that runs on the workflow thread. - Separate from :class:`StreamProvider` because most transports need none - of them, and a provider is not asked to carry empty methods to say so. - :func:`prepare`, :func:`drain` and :func:`close` each call the hook when - the provider defines it. + Imports nothing that does I/O. The worker creates one per workflow + instance through :meth:`StreamProvider.workflow_provider`, so state kept + here dies with the instance the way handlers do. """ - def prepare(self) -> None: - """Install whatever this provider needs before the workflow runs. + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + """Subscribe the running workflow to ``topic`` of its own stream. - A provider that serves outside readers through handlers on the - workflow itself has to register them before the first task completes, - or a reader that arrives early finds nothing to talk to. + Raises: + StreamCursorError: ``after`` was minted by another provider. """ ... - def drain(self) -> None: - """Release anything this provider parked on the workflow's behalf. - - A provider that parks an outside reader against the running workflow, - as the Workflow Streams transport does with its long-poll update, has - to let go before the workflow can return. - """ + def open_writer(self, topic: str) -> WriteSink: + """Bind ``topic`` of the running workflow's stream for publishing.""" ... - async def close(self) -> None: - """Release what this provider holds for the process. + def on_workflow_start(self) -> None: + """Called before the workflow function runs. - A provider that keeps a connection pool or an HTTP session open needs - a moment where the process says it is done; this is it. + A provider that serves outside readers through handlers on the + workflow registers them here, before the first task completes. """ ... + async def on_workflow_finish(self) -> None: + """Called after the workflow function returns, raises or continues as new. -_factories: dict[str, Callable[[], StreamProvider]] = {} -_active: StreamProvider | None = None - - -def register(name: str, factory: Callable[[], StreamProvider]) -> None: - """Make ``factory`` selectable as ``configure(provider=name)``.""" - _factories[name] = factory - - -def registered() -> list[str]: - """The provider names this process can configure.""" - return sorted(_factories) - - -def _make(name: str | None) -> StreamProvider: - if name is None: - if len(_factories) == 1: - name = next(iter(_factories)) - else: - raise RuntimeError( - f"name a provider: configure(provider=...) with one of {registered()}" - ) - factory = _factories.get(name) - if factory is None: - raise RuntimeError( - f"no stream provider {name!r} is registered; available: {registered()}" - ) - return factory() - - -def configure(provider: str | None = None, **options: Any) -> None: - """Name the provider for this process and hand it its options. - - ``provider`` may be omitted when exactly one provider is registered. - """ - global _active - _active = instance(provider, **options) - - -def instance(provider: str | None = None, **options: Any) -> StreamProvider: - """A configured provider that is not installed as the process default. - - For code that serves one provider while the process is configured with - another, such as a Nexus stream handler delegating to its store. - """ - chosen = _make(provider) - chosen.configure(**options) - return chosen - - -def _current() -> StreamProvider: - if _active is None: - # Building a provider is process setup. Doing it on the first - # workflow's thread would race a second workflow thread for the - # global and hide the choice inside workflow code. - raise RuntimeError( - "no stream provider is configured; call streams.configure() or " - "streams.worker_options() before opening a stream" - ) - return _active - - -def worker_options() -> dict[str, Any]: - """What a ``Worker`` or ``Replayer`` needs to serve this provider. - - Every worker calls this, so it is where the default is resolved when - :func:`configure` was not called and exactly one provider is registered. - """ - if _active is None: - configure() - return _current().worker_options() - - -def open_read( - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, -) -> ReadSource: - """Subscribe the running workflow to its inbound stream ``stream``.""" - return _current().open_read(stream, after=after, idle_timeout=idle_timeout) - - -def open_write(topic: str) -> WriteSink: - """Bind ``topic`` on the stream the running workflow owns.""" - return _current().open_write(topic) - - -def prepare() -> None: - """Let the provider install what it needs, before the workflow runs. - - Call it from the workflow's constructor. It is a no-op on providers that - need nothing, so workflow code can call it unconditionally and stay - portable. - """ - provider = _current() - install = getattr(provider, "prepare", None) - if install is not None: - install() + A provider that parked an outside reader against the run lets go + here, so the workflow can close. + """ + ... -def drain() -> None: - """Release anything the provider parked on this workflow's behalf. +class StreamProvider(Protocol): + """What a store ships. Also a :class:`temporalio.worker.Plugin` when it serves workers. - Call it before a workflow that read a stream returns. It is a no-op on - providers that park nothing, so workflow code can call it unconditionally - and stay portable. + Construct one, pass it to ``Worker(plugins=[provider])`` and + ``Replayer(plugins=[provider])``, and open handles from it anywhere else. + Nothing is global: two workers in one process may hold two providers. """ - provider = _current() - release = getattr(provider, "drain", None) - if release is not None: - release() - -async def close() -> None: - """Release what the provider holds for this process. + def workflow_provider(self) -> WorkflowStreamProvider: + """The half that serves one workflow instance on its thread.""" + ... - Await it when the process is done with streams. It is a no-op on - providers that hold nothing, and on a process that never configured one, - so a shutdown path can call it unconditionally. - """ - if _active is None: - return - release = getattr(_active, "close", None) - if release is not None: - await release() + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> StreamHandle: + """A handle on ``workflow_id``'s stream. + Without ``run_id`` it follows the execution chain, so a consumer keeps + reading across continue-as-new; with one it is pinned to that run. + """ + ... -def check_topic(stream: str, topic: str | None) -> None: - """Reject a topic filter on an inbound stream. + async def close(self) -> None: + """Release what this provider holds for the process. - An inbound record carries no topic; the stream's name is its whole - address, so a filter there could only ever match nothing. Every provider - calls this at the top of its ``read`` so the answer is the same on all - of them. - """ - if stream and topic is not None: - raise ValueError( - f"inbound stream {stream!r} has no topics; topic= applies to the " - "stream the workflow publishes" - ) - - -async def producer( - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, -) -> Producer: - """Open a producer that appends on ``workflow_id``'s account. - - Name either an inbound ``stream`` of the workflow, or a ``topic`` on the - stream the workflow publishes. Inside an activity, leave ``producer_id`` - and ``attempt`` unset: the activity's own id and attempt are the right - answer, and they are what let a reader tell a retry from a new generation. - """ - if bool(stream) == bool(topic): - raise ValueError( - "name exactly one of stream (an inbound stream of the workflow) or " - "topic (a topic on the stream the workflow publishes)" - ) - if not producer_id: - if not activity.in_activity(): - raise ValueError( - "producer_id is required outside an activity; inside one it " - "defaults to the activity's id and attempt" - ) - info = activity.info() - producer_id = info.activity_id - attempt = attempt or info.attempt - return await _current().producer( - client, - workflow_id=workflow_id, - stream=stream, - topic=topic, - producer_id=producer_id, - attempt=attempt, - ) - - -async def consumer(client: Any, *, workflow_id: str, stream: str = "") -> Consumer: - """Open a reader on ``workflow_id``'s own stream, or its inbound ``stream``. - - With no ``stream`` the reader follows what the workflow publishes, topic - by topic. With one, it follows the inbound stream of that name, which is - how a process watches what producers hand the workflow. - """ - return await _current().consumer(client, workflow_id=workflow_id, stream=stream) + A provider that keeps a connection pool or an HTTP session open needs + a moment where the process says it is done; this is it. A provider + that holds nothing returns at once. + """ + ... diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 1f08302a8..fef63e51c 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -23,25 +23,38 @@ @enum.unique class RecordKind(enum.IntEnum): - """What a record is.""" + """What a record is. + + Mirrors ``temporal.api.stream.v1.StreamRecordKind`` value for value, so a + record's kind crosses the wire as the integer the proto holds. + """ + + UNSPECIFIED = 0 + """The proto's zero value. + + A stored record whose writer set no kind is read as :attr:`DATA`, as the + proto defines it, so a reader never sees this kind on a record. + """ DATA = 1 """Carries a value published by a workflow or a producer.""" FINISH = 2 - """The writer of this topic declared it complete. + """The producer named in ``producer_id`` will write nothing more on this topic. - Separate from the activity or workflow that wrote it having succeeded. A - reader that treats it as proof of success is wrong: the activity can still - time out after writing it. + An empty ``producer_id`` names the owning workflow. It does not end a + read, which ends when the owning execution or its chain is closed and the + retained tail has been delivered, and it says nothing about the producer's + outcome: an activity can still time out after writing it. """ SUPERSEDED = 3 """A later attempt of the same producer started writing. - Synthesized by the reader from what it observed, so every provider - delivers it identically and replay reproduces it without the provider's - help. + Synthesized by the reader from what it observed, never stored, so every + provider delivers it identically and replay reproduces it without the + provider's help. Its cursor is the position before the new attempt's + first record, so resuming after it delivers that record next. """ @@ -52,7 +65,9 @@ class Cursor: Opaque on purpose. One provider numbers records with integers and another with a millisecond-and-sequence pair, so comparing tokens here would be right for one and wrong for the other. Hand a cursor back to resume after - the record it names; nothing here advances one. + the record it names; nothing here advances one. The token starts with the + name of the provider that minted it, and a provider refuses a token from + another with :class:`temporalio.streams.StreamCursorError`. """ token: str @@ -68,30 +83,33 @@ def __str__(self) -> str: @dataclass(frozen=True) class Supersession: - """The body of a :attr:`RecordKind.SUPERSEDED` record.""" + """What a :attr:`RecordKind.SUPERSEDED` record reports.""" - producer: str + producer_id: str previous_attempt: int attempt: int @dataclass(frozen=True) class StreamRecord(Generic[T]): - """One record as workflow code sees it. + """One record as a reader sees it. - ``value`` follows ``kind``: a data record carries a ``T``, a supersession - carries the :class:`Supersession` it reports, and a finish marker carries - ``None``. Check ``kind`` before reading it. + ``value`` is set on a :attr:`RecordKind.DATA` record and ``supersession`` + on a :attr:`RecordKind.SUPERSEDED` one; every other kind carries neither. + Each field means one thing, so a consumer narrows on ``kind`` and reads + the field that kind promises. """ - value: T | Supersession | None + kind: RecordKind cursor: Cursor - kind: RecordKind = RecordKind.DATA - topic: str = "" - """The topic on the owner's stream, or empty for an inbound record.""" - producer: str = "" + topic: str + producer_id: str = "" """Who wrote it, or empty when the owning workflow wrote it itself.""" attempt: int = 0 """The producer's attempt, or 0 when it did not declare one.""" sequence: int = -1 """The producer's position within its attempt, or -1 when unnumbered.""" + value: T | None = None + """The published value. Set on ``DATA`` only.""" + supersession: Supersession | None = None + """The attempt change being reported. Set on ``SUPERSEDED`` only.""" diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py new file mode 100644 index 000000000..52299f44e --- /dev/null +++ b/temporalio/streams/_wire.py @@ -0,0 +1,181 @@ +"""How a record crosses a provider: the proto is the record. + +``temporal.api.stream.v1.StreamRecord`` is the wire format on every provider. +A store that keeps bytes keeps ``SerializeToString()`` of it, the native +server stores the proto it is handed, and a reader in any language parses the +same bytes. ``body`` is the user's payload, produced and consumed through the +payload converter, so a codec applies to it like any other payload and a +pre-encoded :class:`temporalio.common.RawValue` passes through untouched. + +Cursors are self-describing: a token starts with the name of the provider that +minted it, so a provider can refuse a foreign one at the call rather than +misreading it deep in a generator. +""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any + +import temporalio.converter +from temporalio.api.stream.v1 import StreamRecord as WireRecord +from temporalio.api.stream.v1 import StreamRecordKind +from temporalio.streams._errors import StreamCursorError +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +__all__ = [ + "RecordDecoder", + "WireRecord", + "cursor_position", + "from_wire", + "mint_cursor", + "producer_identity", + "to_wire", +] + + +def to_wire( + converter: temporalio.converter.PayloadConverter, + *, + topic: str, + kind: RecordKind, + value: Any = None, + producer_id: str = "", + attempt: int = 0, + sequence: int = -1, +) -> WireRecord: + """Build the record a provider stores or ships. + + Only a ``DATA`` record carries a body; the converter encodes ``value`` + into it, which is where a pre-encoded ``RawValue`` passes through. + """ + record = WireRecord( + topic=topic, + kind=StreamRecordKind.ValueType(int(kind)), + producer_id=producer_id, + attempt=attempt, + sequence=sequence, + ) + if kind is RecordKind.DATA: + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record + + +def from_wire( + converter: temporalio.converter.PayloadConverter, + cursor: Cursor, + wire: WireRecord, + result_type: type | None, +) -> StreamRecord[Any]: + """Turn a stored record into the record a reader yields. + + Raises: + ValueError: The kind is one no store may hold, such as a synthesized + ``SUPERSEDED`` or a value this SDK does not know. + """ + kind = RecordKind(wire.kind) + if kind is RecordKind.SUPERSEDED: + raise ValueError("a SUPERSEDED record is synthesized by readers, never stored") + if kind is RecordKind.UNSPECIFIED: + # The proto defines an unset kind as DATA, so every reader agrees. + kind = RecordKind.DATA + value: Any = None + if kind is RecordKind.DATA and wire.HasField("body"): + hints = [result_type] if result_type is not None else None + value = converter.from_payloads([wire.body], hints)[0] + return StreamRecord( + kind=kind, + cursor=cursor, + topic=wire.topic, + producer_id=wire.producer_id, + attempt=wire.attempt, + sequence=wire.sequence, + value=value, + ) + + +class RecordDecoder: + """Turns the records a provider hands over into the records a reader yields. + + One per read. It synthesizes supersession from the attempts it observes, + positions each synthesized record at the cursor before the record that + triggered it, and skips a record it cannot decode with a warning rather + than raising, so a poisoned record cannot pin a workflow on every retry + while an outside reader of the same stream moves past it. + """ + + def __init__( + self, + converter: temporalio.converter.PayloadConverter, + result_type: type | None, + *, + after: Cursor, + warn: Callable[[str], None], + ) -> None: + """Decode with ``converter`` into ``result_type``, resuming after ``after``.""" + self._converter = converter + self._result_type = result_type + self._previous = after + self._warn = warn + self._attempts = AttemptTracker() + + def decode(self, cursor: Cursor, wire: WireRecord) -> list[StreamRecord[Any]]: + """The records to yield for one stored record, in order.""" + try: + record = from_wire(self._converter, cursor, wire, self._result_type) + except Exception as error: + self._warn(f"skipping stream record at {cursor}: {error}") + # The skipped record still holds its position, so a resume after + # it moves on rather than tripping over it again. + self._previous = cursor + return [] + out: list[StreamRecord[Any]] = [] + superseded = self._attempts.note( + wire.producer_id, wire.attempt, topic=wire.topic, previous=self._previous + ) + if superseded is not None: + out.append(superseded) + out.append(record) + self._previous = cursor + return out + + +def mint_cursor(provider: str, position: str) -> Cursor: + """A cursor that names ``position`` and the provider that understands it.""" + return Cursor(f"{provider}:{position}") + + +def cursor_position(cursor: Cursor, *, provider: str) -> str | None: + """The position inside a cursor ``provider`` minted, or ``None`` for BEGINNING. + + Raises: + StreamCursorError: The cursor came from another provider. + """ + if cursor == BEGINNING: + return None + prefix = f"{provider}:" + if not cursor.token.startswith(prefix): + raise StreamCursorError( + f"cursor {cursor.token!r} was not minted by the {provider} stream provider" + ) + return cursor.token[len(prefix) :] + + +def producer_identity(producer_id: str, attempt: int) -> tuple[str, int]: + """Resolve who a producer is, defaulting to the running activity. + + Imported lazily so the module workflow code imports carries no activity + machinery; the default only means anything inside an activity anyway. + """ + if producer_id: + return producer_id, attempt + import temporalio.activity + + if not temporalio.activity.in_activity(): + raise ValueError( + "producer_id is required outside an activity; inside one it defaults " + "to the activity's id and attempt" + ) + info = temporalio.activity.info() + return info.activity_id, attempt or info.attempt diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py index c254db0fb..911620e6c 100644 --- a/temporalio/streams/providers/__init__.py +++ b/temporalio/streams/providers/__init__.py @@ -1,25 +1,66 @@ """Stream providers, one module each. -Importing this package registers every provider whose dependencies are -present. A tree that lacks a provider's dependencies simply does not offer -that name; nothing else changes, because everything above the provider is -shared. +A provider that serves workers is a :class:`temporalio.worker.Plugin`. +:class:`ProviderPlugin` is the plugin half the providers in this tree share: +it hands the provider to the worker and the replayer as their +``stream_provider`` and leaves their execution alone. A provider that holds +connections closes them through its own ``close()``, not with the worker, +because the same provider serves handles outside any worker. """ from __future__ import annotations -_KNOWN = ("memory", "workflow_streams", "native", "redis", "nexus") - -for _name in _KNOWN: - try: - __import__(f"{__name__}.{_name}") - except ModuleNotFoundError as error: - # Two things may be missing: the provider module itself, or a - # dependency from outside this package. A name missing inside - # temporalio is a broken provider, and hiding that would turn its - # traceback into "no such provider". - missing = error.name or "" - if missing != f"{__name__}.{_name}" and ( - not missing or missing.startswith("temporalio") - ): - raise +from collections.abc import AsyncIterator, Awaitable, Callable +from contextlib import AbstractAsyncContextManager + +import temporalio.worker +from temporalio.client import WorkflowHistory +from temporalio.streams._provider import StreamProvider +from temporalio.worker import ( + Replayer, + ReplayerConfig, + Worker, + WorkerConfig, + WorkflowReplayResult, +) + +__all__ = ["ProviderPlugin"] + + +class ProviderPlugin(StreamProvider, temporalio.worker.Plugin): + """The worker plugin every provider in this tree is built on. + + Subclasses implement :class:`temporalio.streams.StreamProvider`; this + class supplies the four plugin hooks, so ``Worker(plugins=[provider])`` + and ``Replayer(plugins=[provider])`` reach the provider through their + ``stream_provider`` option and the worker installs the interceptor that + calls the workflow half's lifecycle hooks. + """ + + def configure_worker(self, config: WorkerConfig) -> WorkerConfig: + """Set this provider as the worker's ``stream_provider``.""" + config["stream_provider"] = self + return config + + def configure_replayer(self, config: ReplayerConfig) -> ReplayerConfig: + """Set this provider as the replayer's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def run_worker( + self, worker: Worker, next: Callable[[Worker], Awaitable[None]] + ) -> None: + """Run the worker unchanged.""" + await next(worker) + + def run_replayer( + self, + replayer: Replayer, + histories: AsyncIterator[WorkflowHistory], + next: Callable[ + [Replayer, AsyncIterator[WorkflowHistory]], + AbstractAsyncContextManager[AsyncIterator[WorkflowReplayResult]], + ], + ) -> AbstractAsyncContextManager[AsyncIterator[WorkflowReplayResult]]: + """Run the replayer unchanged.""" + return next(replayer, histories) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 4a3cf3298..2a6087b2d 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -1,17 +1,25 @@ """The in-process reference provider. Exists so the conformance suite can exercise the whole surface without a -store, and to document in one file what a provider owes. Two honest limits, -both stated so nobody mistakes this for evidence: +store, and to document in one file what a provider owes. Its limits, stated +so nobody mistakes it for evidence: - It is not replay-safe. Workflow-side state lives in plain process memory, so run it with a warm workflow cache and do not use it to demonstrate recovery. - A workflow's publish becomes visible at ``publish`` time rather than at - task acceptance, so it only approximates rule 1 of the contract. - -The outside surface (producer, consumer, dedupe, supersession, cursors) is -faithful, which is what the conformance tests lean on. + task acceptance, and a failed task's records stay, so it only approximates + rule 1 of the contract. +- Topics are keyed by workflow id rather than by run, so a successor run's + reader from ``BEGINNING`` sees the chain's records. A ``run_id`` on a + handle only decides which run's close ends a read. +- It learns that a workflow closed by describing it, so a handle opened + without a client reads until the caller closes it. + +The outside surface (producer identity, retry deduplication, positions, +supersession, cursors) is faithful, which is what the conformance tests lean +on. One list per topic; a topic is written by the workflow and by outside +producers alike and read from either side. """ from __future__ import annotations @@ -22,16 +30,29 @@ from datetime import timedelta from typing import Any +from google.protobuf.message import DecodeError + import temporalio.converter from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._ids import inbound_stream_id -from temporalio.streams._policy import AttemptTracker +from temporalio.client import Client, WorkflowExecutionStatus +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError +from temporalio.streams._ids import topic_key +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["MemoryProducer", "MemoryStreamHandle", "MemoryStreams"] -_DEFAULT_POLL = timedelta(milliseconds=100) +_PROVIDER = "memory" logger = logging.getLogger(__name__) @@ -41,12 +62,15 @@ def _wake(future: asyncio.Future[None]) -> None: future.set_result(None) -class _MemoryStream: +class _Topic: + """One topic's records, and the waiters parked on its tail.""" + def __init__(self) -> None: - self.frames: list[bytes] = [] + self.records: list[bytes] = [] # Dedupe identity is (producer#attempt, first sequence of the append), - # the same pair the storage providers use. - self.seen: dict[tuple[str, int], int] = {} + # the same pair the storage providers use, mapped to where the batch + # landed so a repeat can answer with the original position. + self.seen: dict[tuple[str, int], tuple[int, int]] = {} # Each waiter is parked with the loop it belongs to. A workflow's # publish runs on the workflow thread, and waking a foreign loop's # future from there needs call_soon_threadsafe or the loop stays @@ -54,47 +78,50 @@ def __init__(self) -> None: self._waiters: list[tuple[asyncio.AbstractEventLoop, asyncio.Future[None]]] = [] def append( - self, frames: list[bytes], *, producer_id: str, sequence: int - ) -> int | None: - """Store ``frames`` and return the first one's offset, or ``None`` for a repeat.""" - key = (producer_id, sequence) - if key in self.seen: - return None - offset = len(self.frames) - self.frames.extend(frames) - self.seen[key] = offset + self, + wires: list[WireRecord], + *, + writer: str | None = None, + sequence: int = 0, + ) -> tuple[int, int]: + """Store ``wires`` and return where they landed as ``(first offset, count)``. + + With a ``writer``, a repeat of ``(writer, sequence)`` stores nothing + and returns where the original landed. + """ + key = (writer or "", sequence) + if writer is not None and key in self.seen: + return self.seen[key] + first = len(self.records) + self.records.extend(wire.SerializeToString() for wire in wires) + if writer is not None: + self.seen[key] = (first, len(wires)) waiters, self._waiters = self._waiters, [] for loop, future in waiters: loop.call_soon_threadsafe(_wake, future) - return offset - - async def wait_past(self, offset: int) -> None: - while len(self.frames) <= offset: - loop = asyncio.get_running_loop() - future: asyncio.Future[None] = loop.create_future() - self._waiters.append((loop, future)) - await future - - -_streams: dict[str, _MemoryStream] = {} - - -def _stream(stream_id: str) -> _MemoryStream: - found = _streams.get(stream_id) - if found is None: - found = _streams[stream_id] = _MemoryStream() - return found - - -def reset() -> None: - """Drop every stream. For tests.""" - _streams.clear() - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return first, len(wires) + + async def wait_past(self, offset: int, timeout: float | None) -> None: + """Wait until a record exists at ``offset``, or ``timeout`` passes.""" + if len(self.records) > offset: + return + loop = asyncio.get_running_loop() + future: asyncio.Future[None] = loop.create_future() + self._waiters.append((loop, future)) + try: + await asyncio.wait_for(future, timeout) + except asyncio.TimeoutError: + self._waiters = [w for w in self._waiters if w[1] is not future] + + +def _parse(cursor: Cursor, raw: bytes, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(raw) + except DecodeError as error: + # Same answer as an undecodable body: skip and say so, so one bad + # record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None class _MemReadSource: @@ -104,22 +131,26 @@ class _MemReadSource: having no delivery path, and it is why this provider is for tests. """ - def __init__(self, store: _MemoryStream, start: int, poll: timedelta) -> None: + def __init__(self, store: _Topic, start: int, poll: timedelta) -> None: self._store = store - self._cursor = start + self._offset = start self._poll = poll self._closed = False - async def next_batch(self) -> list[tuple[Cursor, bytes]]: + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: while not self._closed: - frames = self._store.frames - if len(frames) > self._cursor: - batch = [ - (Cursor(str(offset)), frames[offset]) - for offset in range(self._cursor, len(frames)) - ] - self._cursor = len(frames) - return batch + records = self._store.records + if len(records) > self._offset: + batch: list[tuple[Cursor, WireRecord]] = [] + for offset in range(self._offset, len(records)): + cursor = mint_cursor(_PROVIDER, str(offset)) + wire = _parse(cursor, records[offset], workflow.logger.warning) + if wire is not None: + batch.append((cursor, wire)) + self._offset = len(records) + if batch: + return batch + continue await workflow.sleep(self._poll) raise StopAsyncIteration @@ -128,18 +159,34 @@ def close(self) -> None: class _MemWriteSink: - def __init__(self, store: _MemoryStream, topic: str) -> None: + def __init__(self, store: _Topic) -> None: self._store = store - self._topic = topic - self._sequence = 0 - async def publish(self, frame: bytes) -> None: - self._store.append( - [frame], - producer_id=f"__workflow__:{self._topic}", - sequence=self._sequence, - ) - self._sequence += 1 + def publish(self, record: WireRecord) -> None: + # Visible at once rather than at task acceptance: the documented gap + # between this provider and rule 1. + self._store.append([record]) + + +class _MemoryWorkflowProvider: + """The workflow half. Nothing to install and nothing to release.""" + + def __init__(self, streams: MemoryStreams) -> None: + self._streams = streams + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + start = self._streams._offset_after(after) + store = self._streams._topic(workflow.info().workflow_id, topic) + return _MemReadSource(store, start, self._streams._poll) + + def open_writer(self, topic: str) -> WriteSink: + return _MemWriteSink(self._streams._topic(workflow.info().workflow_id, topic)) + + def on_workflow_start(self) -> None: + pass + + async def on_workflow_finish(self) -> None: + pass class MemoryProducer: @@ -147,19 +194,25 @@ class MemoryProducer: def __init__( self, - store: _MemoryStream, - converter: Any, + store: _Topic, + converter: temporalio.converter.PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to ``topic`` on ``store``.""" + """Bind this producer to ``topic``'s ``store``.""" self._store = store self._converter = converter self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -167,192 +220,224 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: + def _writer(self) -> str: return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed; an empty call returns + the position of this producer's last record. + """ if not values: - return None - frames = [] - for value in values: - frames.append( - _frame.encode( + return self._last + return self._write( + [ + to_wire( + self._converter, topic=self._topic, kind=RecordKind.DATA, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=self._sequence + index, ) - ) - self._sequence += 1 - offset = self._store.append( - frames, - producer_id=self._provider_id, - sequence=self._sequence - len(frames), + for index, value in enumerate(values) + ] ) - if offset is None: - return None - return Cursor(str(offset + len(frames) - 1)) async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - frame = _frame.encode( - topic=self._topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - self._store.append( - [frame], producer_id=self._provider_id, sequence=self._sequence - 1 + """Write ``FINISH`` for this producer on this topic.""" + self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] ) - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + def _write(self, wires: list[WireRecord]) -> Cursor: + first, count = self._store.append( + wires, writer=self._writer, sequence=self._sequence ) - return payload.SerializeToString() + self._sequence += len(wires) + self._last = mint_cursor(_PROVIDER, str(first + count - 1)) + return self._last -class MemoryConsumer: - """The outside reader, with the shared supersession rule.""" +class MemoryStreamHandle: + """One workflow's stream from outside, with the shared reader rules.""" - def __init__(self, store: _MemoryStream, converter: Any, stream: str) -> None: - """Read whatever ``store`` holds, now and as it grows.""" - self._store = store - self._converter = converter - self._stream = stream + def __init__( + self, + streams: MemoryStreams, + client: Client | None, + workflow_id: str, + run_id: str | None, + ) -> None: + """Address ``workflow_id``'s topics in ``streams``.""" + self._streams = streams + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = ( + client.data_converter.payload_converter + if client is not None + else temporalio.converter.DataConverter.default.payload_converter + ) - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, waiting for ones not written yet.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - offset = int(after.token) + 1 if after.token else 0 + """Yield records on ``topic`` after ``after`` until the workflow closes.""" + store = self._streams._topic(self._workflow_id, topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + start = self._streams._offset_after(after) + return self._read(store, start, after, result_type) + + async def _read( + self, + store: _Topic, + offset: int, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + closed = False while True: - await self._store.wait_past(offset) - frames = self._store.frames - while offset < len(frames): - cursor = Cursor(str(offset)) - frame = frames[offset] + records = store.records + while offset < len(records): + cursor = mint_cursor(_PROVIDER, str(offset)) + wire = _parse(cursor, records[offset], logger.warning) offset += 1 - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - frame - ) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning("skipping stream record at %s: %s", cursor, error) + if wire is None: continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, + for record in decoder.decode(cursor, wire): + yield record + if closed: + return + # One more pass after learning the workflow closed, so a record + # that landed between the scan and the describe is not lost. + closed = await self._closed() + if not closed: + await store.wait_past( + offset, + None + if self._client is None + else self._streams._poll.total_seconds(), ) - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one store per stream, so the position is topic-independent - count = len(self._store.frames) - return Cursor(str(count - 1)) if count else BEGINNING - - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] - - -class _MemoryProvider: - name = "memory" - - def __init__(self) -> None: - self._poll = _DEFAULT_POLL - - def configure(self, **options: Any) -> None: - poll = options.pop("poll_interval", None) - if poll is not None: - self._poll = poll - if options: - raise TypeError( - f"the memory provider takes only poll_interval, got {sorted(options)}" - ) - - def worker_options(self) -> dict[str, Any]: - return {} - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Ignored: this provider never releases the worker, it polls. Reading - # idle_timeout as the poll period would give the parameter a second - # meaning that a port copying the reference would copy too. - del idle_timeout - store = _stream(inbound_stream_id(workflow.info().workflow_id, stream)) - return _MemReadSource( - store, int(after.token) + 1 if after.token else 0, self._poll + async def _closed(self) -> bool: + if self._client is None: + return False + handle = self._client.get_workflow_handle( + self._workflow_id, run_id=self._run_id + ) + try: + description = await handle.describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + # A producer may write before the workflow exists; there is + # nothing to follow yet, so keep waiting. + return False + raise + status = description.status + if status is None or status == WorkflowExecutionStatus.RUNNING: + return False + # Following the chain, a run that continued as new is not the end: + # the next describe without a run id finds its successor. + return not ( + self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW ) - def open_write(self, topic: str) -> WriteSink: - store = _stream(inbound_stream_id(workflow.info().workflow_id, "")) - return _MemWriteSink(store, topic) + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest record on ``topic``, for following from now.""" + count = len(self._streams._topic(self._workflow_id, topic).records) + return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 ) -> MemoryProducer: - # With no inbound stream named, the target is the store the workflow's - # own writer appends to, and the frame carries the topic. An inbound - # record carries none: the stream's name is its whole address. - return MemoryProducer( - _stream(inbound_stream_id(workflow_id, stream)), - _converter(client), - topic, - producer_id, - attempt, - ) + """A producer on ``topic``; inside an activity its identity is the activity's.""" + store = self._streams._topic(self._workflow_id, topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return MemoryProducer(store, self._converter, topic, producer_id, attempt) - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> MemoryConsumer: - return MemoryConsumer( - _stream(inbound_stream_id(workflow_id, stream)), _converter(client), stream - ) +class MemoryStreams(ProviderPlugin): + """The in-memory provider, one list per topic. -_provider.register("memory", _MemoryProvider) + Construct one and pass the same instance to the worker and to the code + that opens handles; two instances share nothing. + """ + + def __init__( + self, *, poll_interval: timedelta = timedelta(milliseconds=100) + ) -> None: + """Create an empty provider. + + Args: + poll_interval: How often a workflow-side reader with nothing to + read checks again, and how often an outside reader asks + whether the workflow closed. + """ + self._poll = poll_interval + self._topics: dict[str, _Topic] = {} + + def reset(self) -> None: + """Drop every topic. For tests.""" + self._topics.clear() + + def workflow_provider(self) -> _MemoryWorkflowProvider: + """The workflow half, over this provider's topics.""" + return _MemoryWorkflowProvider(self) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> MemoryStreamHandle: + """A handle on ``workflow_id``'s topics. + + ``client`` may be ``None`` here, unlike on a storage provider; then + the handle cannot see the workflow close and a read waits until the + caller closes it. + """ + return MemoryStreamHandle(self, client, workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: the provider holds no connection.""" + + def _topic(self, workflow_id: str, topic: str) -> _Topic: + if not topic: + raise ValueError("topic must not be empty") + key = topic_key(workflow_id, topic) + found = self._topics.get(key) + if found is None: + found = self._topics[key] = _Topic() + return found + + def _offset_after(self, after: Cursor) -> int: + position = cursor_position(after, provider=_PROVIDER) + if position is None: + return 0 + try: + return int(position) + 1 + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a position on the memory provider" + ) from None From ebbdfa2ea70b3929eb3e00a3d1f17d9c9c5c54f0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:54:17 -0700 Subject: [PATCH 228/831] Carried the stream provider from the worker into the workflow runtime. workflow.stream_reader() and stream_writer() reach it the way payload_converter() does, and the worker brackets the workflow function with the provider's lifecycle hooks so no workflow code has to. --- temporalio/worker/_replayer.py | 7 +- temporalio/worker/_worker.py | 9 + temporalio/worker/_workflow.py | 28 +++ temporalio/worker/_workflow_instance.py | 19 ++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 4 + temporalio/workflow/_streams.py | 257 ++++++++++++++++++++++++ 7 files changed, 333 insertions(+), 1 deletion(-) create mode 100644 temporalio/workflow/_streams.py diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index b3eb1a4d1..c7ae8d59d 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -17,6 +17,7 @@ import temporalio.client import temporalio.converter import temporalio.runtime +import temporalio.streams import temporalio.worker import temporalio.workflow @@ -56,13 +57,14 @@ def __init__( runtime: temporalio.runtime.Runtime | None = None, disable_safe_workflow_eviction: bool = False, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: """Create a replayer to replay workflows from history. See :py:meth:`temporalio.worker.Worker.__init__` for a description of most of the arguments. Most of the same arguments need to be passed to the replayer that were passed to the worker when the workflow originally - ran. + ran, ``stream_provider`` included when the workflow used streams. Note, unlike the worker, for the replayer the workflow_task_executor will default to a new thread pool executor with no max_workers set that @@ -86,6 +88,7 @@ def __init__( runtime=runtime, disable_safe_workflow_eviction=disable_safe_workflow_eviction, header_codec_behavior=header_codec_behavior, + stream_provider=stream_provider, ) self._initial_config = self._config.copy() self._default_workflow_logic_flags = set(_DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS) @@ -287,6 +290,7 @@ def on_eviction_hook( default_workflow_logic_flags=frozenset( self._default_workflow_logic_flags ), + stream_provider=self._config.get("stream_provider"), ) external_storage = data_converter.external_storage storage_driver_types = ( @@ -433,6 +437,7 @@ class ReplayerConfig(TypedDict, total=False): runtime: temporalio.runtime.Runtime | None disable_safe_workflow_eviction: bool header_codec_behavior: HeaderCodecBehavior + stream_provider: temporalio.streams.StreamProvider | None @dataclass(frozen=True) diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index 60f824c4d..3adbd7231 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -24,6 +24,7 @@ import temporalio.common import temporalio.runtime import temporalio.service +import temporalio.streams from temporalio.common import ( HeaderCodecBehavior, VersioningBehavior, @@ -152,6 +153,7 @@ def __init__( ), disable_payload_error_limit: bool = False, max_workflow_task_external_storage_concurrency: int = _DEFAULT_WORKFLOW_TASK_EXTERNAL_STORAGE_CONCURRENCY, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: """Create a worker to process workflows and/or activities. @@ -343,6 +345,10 @@ def __init__( Defaults to 3. Adjust this value based on your workload's needs. Please report any issues you encounter with this setting or if you feel the default should be changed. + stream_provider: Experimental. The stream provider that workflows + on this worker read and publish through, see + :py:mod:`temporalio.streams`. A provider that is also a + :py:class:`Plugin` sets this itself when passed in ``plugins``. WARNING: This setting is experimental. """ @@ -392,6 +398,7 @@ def __init__( nexus_task_poller_behavior=nexus_task_poller_behavior, disable_payload_error_limit=disable_payload_error_limit, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, + stream_provider=stream_provider, ) plugins_from_client = cast( @@ -565,6 +572,7 @@ def check_activity(activity: str): encode_headers=client_config["header_codec_behavior"] != HeaderCodecBehavior.NO_CODEC, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, + stream_provider=config.get("stream_provider"), ) tuner = config.get("tuner") @@ -1020,6 +1028,7 @@ class WorkerConfig(TypedDict, total=False): nexus_task_poller_behavior: PollerBehavior disable_payload_error_limit: bool max_workflow_task_external_storage_concurrency: int + stream_provider: temporalio.streams.StreamProvider | None def _warn_if_activity_executor_max_workers_is_inconsistent( diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 1b217b4a5..b5e4cb411 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -13,6 +13,7 @@ from dataclasses import dataclass from datetime import timezone from types import TracebackType +from typing import Any import temporalio.api.common.v1 import temporalio.bridge.proto.common @@ -24,6 +25,7 @@ import temporalio.converter import temporalio.converter._extstore import temporalio.exceptions +import temporalio.streams import temporalio.workflow from temporalio.bridge.worker import PollShutdownError from temporalio.converter import StorageDriverStoreContext, StorageDriverWorkflowInfo @@ -35,6 +37,7 @@ _relax_sandbox_for_debugger, ) from ._interceptor import ( + ExecuteWorkflowInput, Interceptor, WorkflowInboundInterceptor, WorkflowInterceptorClassInput, @@ -55,6 +58,24 @@ LOG_PROTOS = False +class _StreamHooksInterceptor(WorkflowInboundInterceptor): + """Brackets the workflow function with the stream provider's lifecycle hooks. + + Installed by the worker when it has a stream provider, so no workflow + code has to call anything before it runs or before it returns. The finish + hook runs however the function ends, continue-as-new included, because + a provider that parked a reader against the run has to let go either way. + """ + + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: + provider = temporalio.workflow._Runtime.current().workflow_streams().provider + provider.on_workflow_start() + try: + return await self.next.execute_workflow(input) + finally: + await provider.on_workflow_finish() + + # Value was chosen abitrarily as a small number that allows some concurrency and prevents # large numbers of concurrent external storage operations causing resource contention. # This default limit is per workflow task activation and does not limit the total number @@ -104,6 +125,7 @@ def __init__( encode_headers: bool, max_workflow_task_external_storage_concurrency: int, default_workflow_logic_flags: frozenset[_WorkflowLogicFlag] | None = None, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: # Debug mode is enabled if specified or if the TEMPORAL_DEBUG env var is truthy debug_mode = debug_mode or bool(os.environ.get("TEMPORAL_DEBUG")) @@ -162,6 +184,11 @@ def __init__( __temporal_assert_local_activity_valid=assert_local_activity_valid, ) ) + self._stream_provider = stream_provider + if stream_provider is not None: + # Innermost, so the lifecycle hooks bracket the workflow function + # itself, after every user interceptor has done its own setup. + self._interceptor_classes.append(_StreamHooksInterceptor) self._workflow_failure_exception_types = workflow_failure_exception_types self._patch_activation_callback = patch_activation_callback @@ -740,6 +767,7 @@ def _create_workflow_instance( last_completion_result=init.last_completion_result, last_failure=last_failure, default_workflow_logic_flags=frozenset(self._default_workflow_logic_flags), + stream_provider=self._stream_provider, ) if defn.sandboxed: return self._workflow_runner.create_instance(det) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 108431021..26f796e57 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -58,7 +58,9 @@ import temporalio.converter import temporalio.exceptions import temporalio.nexus.system +import temporalio.streams import temporalio.workflow +import temporalio.workflow._streams from temporalio.converter import StorageDriverStoreContext, StorageDriverWorkflowInfo from temporalio.converter._payload_converter import ( _TemporalTransferTypePayloadConverter, @@ -179,6 +181,7 @@ class WorkflowInstanceDetails: default_workflow_logic_flags: frozenset[_WorkflowLogicFlag] = field( default_factory=lambda: _DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS ) + stream_provider: temporalio.streams.StreamProvider | None = None class WorkflowInstance(ABC): @@ -298,6 +301,8 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: det.worker_level_failure_exception_types ) self._patch_activation_callback = det.patch_activation_callback + self._stream_provider = det.stream_provider + self._streams: temporalio.workflow._streams._WorkflowStreams | None = None self._default_workflow_logic_flags = det.default_workflow_logic_flags self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False @@ -1774,6 +1779,20 @@ async def workflow_start_nexus_operation( ) ) + def workflow_streams(self) -> temporalio.workflow._streams._WorkflowStreams: + if self._streams is None: + if self._stream_provider is None: + raise RuntimeError( + "no stream provider is configured on this worker; pass one with " + "Worker(plugins=[provider]) or stream_provider=" + ) + # The workflow half is made per instance, so whatever it keeps + # dies with the instance the way handlers do. + self._streams = temporalio.workflow._streams._WorkflowStreams( + self._stream_provider.workflow_provider() + ) + return self._streams + def workflow_time_ns(self) -> int: return self._time_ns diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..f63135bf4 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -147,6 +147,12 @@ logger, unsafe, ) +from ._streams import ( + StreamReader, + StreamWriter, + stream_reader, + stream_writer, +) from ._workflow_ops import ( ChildWorkflowCancellationType, ChildWorkflowConfig, @@ -252,6 +258,10 @@ "SandboxImportNotificationPolicy", "logger", "unsafe", + "StreamReader", + "StreamWriter", + "stream_reader", + "stream_writer", "ChildWorkflowCancellationType", "ChildWorkflowConfig", "ChildWorkflowHandle", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..25523836a 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -24,6 +24,7 @@ from ._activities import ActivityCancellationType, ActivityHandle from ._exceptions import ContinueAsNewVersioningBehavior, VersioningIntent from ._nexus import NexusOperationCancellationType, NexusOperationHandle + from ._streams import _WorkflowStreams from ._workflow_ops import ( ChildWorkflowCancellationType, ChildWorkflowHandle, @@ -475,6 +476,9 @@ async def workflow_start_nexus_operation( summary: str | None, ) -> NexusOperationHandle[OutputT]: ... + @abstractmethod + def workflow_streams(self) -> _WorkflowStreams: ... + @abstractmethod def workflow_time_ns(self) -> int: ... diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py new file mode 100644 index 000000000..029da59a1 --- /dev/null +++ b/temporalio/workflow/_streams.py @@ -0,0 +1,257 @@ +"""Streams from inside workflow code. + +.. warning:: + This module is experimental and may change in future versions. + +The reader and writer here are the same on every provider. They convert +values, synthesize supersession and buffer nothing the provider did not hand +them; everything provider-specific sits behind the ``ReadSource`` and +``WriteSink`` that the provider's workflow half opens. The provider itself +comes from the worker, the way the payload converter does. +""" + +from __future__ import annotations + +import asyncio +from collections import deque +from collections.abc import AsyncIterator, Callable +from typing import Any, Generic, TypeVar, cast, overload + +from temporalio.streams._provider import ReadSource, WorkflowStreamProvider, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import RecordDecoder, to_wire +from temporalio.workflow._context import _Runtime, payload_converter +from temporalio.workflow._sandbox import logger + +__all__ = ["StreamReader", "StreamWriter", "stream_reader", "stream_writer"] + +T = TypeVar("T") + + +class _WorkflowStreams: + """The stream state a workflow instance carries: its provider half and open readers.""" + + def __init__(self, provider: WorkflowStreamProvider) -> None: + self.provider = provider + self.readers: dict[str, StreamReader[Any]] = {} + + +class StreamReader(Generic[T]): + """Reads one topic of this workflow's stream from inside workflow code. + + The reader is the async iterator: ``async for record in reader`` yields + every kind of record, including the supersession the reader synthesizes + when a producer's newer attempt appears. Check ``record.kind``, or + iterate :meth:`values` when the workflow only wants data. Iteration ends + when the reader is closed or the provider ends the subscription. One loop + per reader: two loops on one reader share its buffer and interleave. + """ + + def __init__( + self, + source: ReadSource, + *, + topic: str, + result_type: type | None, + after: Cursor, + on_close: Callable[[], None], + ) -> None: + """Prefer :func:`temporalio.workflow.stream_reader`.""" + self._source = source + self._topic = topic + self._result_type = result_type + self._decoder = RecordDecoder( + payload_converter(), result_type, after=after, warn=logger.warning + ) + self._pending: deque[StreamRecord[T]] = deque() + self._lock = asyncio.Lock() + self._closed = False + self._ended = False + self._on_close = on_close + + @property + def topic(self) -> str: + """The topic this reader is subscribed to.""" + return self._topic + + def __aiter__(self) -> StreamReader[T]: + """The reader is its own iterator.""" + return self + + async def __anext__(self) -> StreamRecord[T]: + """The next record, waiting for one to arrive.""" + while True: + if self._pending: + return self._pending.popleft() + if self._closed or self._ended: + raise StopAsyncIteration + await self._fill() + + async def _fill(self) -> None: + # Two loops on one reader must not race the source, so one batch + # fetch is in flight at a time and the second loop takes what the + # first one buffered. + async with self._lock: + if self._pending or self._closed or self._ended: + return + try: + batch = await self._source.next_batch() + except StopAsyncIteration: + # The provider ended the subscription. Iteration stops rather + # than raising, so a workflow that reads to the end of a + # finished stream leaves the loop instead of failing its task. + self._ended = True + return + for cursor, wire in batch: + self._pending.extend(self._decoder.decode(cursor, wire)) + + async def values(self) -> AsyncIterator[T]: + """Iterate the data values, dropping control records.""" + async for record in self: + if record.kind is RecordKind.DATA: + yield cast("T", record.value) + + def close(self) -> None: + """End the subscription. Idempotent. + + A later :func:`temporalio.workflow.stream_reader` on the same topic + opens a new subscription, which is a new command. + """ + if self._closed: + return + self._closed = True + self._source.close() + self._on_close() + + +class StreamWriter: + """Publishes to one topic of this workflow's stream. + + A workflow can only publish transactionally to its own stream, on every + provider. Writing to somebody else's stream is an activity's job, and it + gets the weaker guarantee that goes with doing I/O. + """ + + def __init__(self, sink: WriteSink, topic: str) -> None: + """Prefer :func:`temporalio.workflow.stream_writer`.""" + self._sink = sink + self._topic = topic + self._finished = False + + @property + def topic(self) -> str: + """The topic this writer is bound to.""" + return self._topic + + def publish(self, value: Any) -> None: + """Append ``value`` to this topic. + + Synchronous, because there is nothing to wait for inside a task: the + record becomes visible when this Workflow Task is accepted, and never + at all if the task fails, so a reader cannot see a decision the + workflow did not commit. A :class:`temporalio.common.RawValue` passes + through pre-encoded. + + Raises: + ValueError: :meth:`finish` was already called on this writer. + """ + if self._finished: + raise ValueError(f"topic {self._topic!r} was already finished") + self._sink.publish( + to_wire( + payload_converter(), + topic=self._topic, + kind=RecordKind.DATA, + value=value, + ) + ) + + def finish(self) -> None: + """Write ``FINISH`` for this workflow on this topic. Idempotent. + + Says this workflow has nothing more to send on the topic. It does not + say the workflow succeeded, and it does not end anyone's read. + """ + if self._finished: + return + self._finished = True + self._sink.publish( + to_wire(payload_converter(), topic=self._topic, kind=RecordKind.FINISH) + ) + + +@overload +def stream_reader( + topic: str, *, result_type: type[T], after: Cursor = ... +) -> StreamReader[T]: ... + + +@overload +def stream_reader( + topic: str, *, result_type: None = None, after: Cursor = ... +) -> StreamReader[Any]: ... + + +def stream_reader( + topic: str, *, result_type: type | None = None, after: Cursor = BEGINNING +) -> StreamReader[Any]: + """Subscribe this workflow to ``topic`` of its own stream. + + One subscription per topic per run. A second call for the same topic + returns the reader already open on it, so records go to whichever loop + pulls first; such a call may pass neither ``after`` nor a different + ``result_type``. Adding a reader on a new topic is a new command, so gate + it with :func:`temporalio.workflow.patched` as you would a timer. A + reader in a successor run starts a new subscription: nothing crosses + continue-as-new implicitly. + + Args: + topic: The topic, relative to this workflow's stream. + result_type: The value type, used as the decode hint. + :class:`temporalio.common.RawValue` returns the payload untouched. + after: Resume strictly after this record. Honoured on the first + subscription of a run, because after that the recorded + observations decide. + + Raises: + ValueError: ``topic`` is empty, or a reader on it is already open and + this call asked for a different position or type. + temporalio.streams.StreamCursorError: ``after`` was minted by another + provider. + """ + if not topic: + raise ValueError("topic must not be empty") + state: _WorkflowStreams = _Runtime.current().workflow_streams() + existing = state.readers.get(topic) + if existing is not None: + if after != BEGINNING or result_type is not existing._result_type: + raise ValueError( + f"topic {topic!r} already has a reader in this run; a second " + "stream_reader shares it and takes no after= or other result_type=" + ) + return existing + source = state.provider.open_reader(topic, after=after) + + def forget() -> None: + state.readers.pop(topic, None) + + reader: StreamReader[Any] = StreamReader( + source, topic=topic, result_type=result_type, after=after, on_close=forget + ) + state.readers[topic] = reader + return reader + + +def stream_writer(topic: str) -> StreamWriter: + """Publish to ``topic`` of this workflow's stream. + + Args: + topic: The topic name. Encoding follows each published value. + + Raises: + ValueError: ``topic`` is empty. + """ + if not topic: + raise ValueError("topic must not be empty") + provider = _Runtime.current().workflow_streams().provider + return StreamWriter(provider.open_writer(topic), topic) From ffae7a40c603596ff10f2bc248d278c7abc263d4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:54:17 -0700 Subject: [PATCH 229/831] Moved the stream conformance suite onto the new surface. Adds the cases for supersession cursors, append positions, a read that ends when the chain closes, chain following, foreign cursors, the lifecycle hooks and a subscription shared by two readers. --- tests/streams/conftest.py | 6 +- tests/streams/test_streams_conformance.py | 492 ++++++++++------------ tests/streams/test_streams_workflow.py | 381 +++++++++++++---- 3 files changed, 537 insertions(+), 342 deletions(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 1758f2598..12663fa23 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -4,9 +4,5 @@ def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( "markers", - "inbound_stream: the case writes a workflow's inbound stream from outside", - ) - config.addinivalue_line( - "markers", - "unfiltered_read: the case reads the owner's stream without naming a topic", + "reports_positions: the case needs append() to return where records landed", ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 7d76d85d6..50a59bb0f 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -3,16 +3,16 @@ Written against the public surface, parametrised over the providers this tree can stand up. The memory provider always runs, with no server and no store. A storage provider adds itself to ``SETUPS`` behind its own -``STREAMS_LIVE`` gate: its setup configures the provider, hands back the -client the cases should use, and says which capabilities it lacks, so the -cases marked ``inbound_stream`` or ``unfiltered_read`` are skipped with a -reason on a provider that cannot do them. Every other case reads with a -topic, which is what a store that keys by topic needs. - -What this file pins down is the contract: framing, producer identity, retry -deduplication, supersession, topic filtering, cursor resumption, and store -keys that cannot collide. The workflow-side handles and the two rules about -workflow tasks live in ``test_streams_workflow``. +``STREAMS_LIVE`` gate: its setup hands back a provider instance, the client +the cases should use, and says which capabilities it lacks, so the cases +marked ``reports_positions`` are skipped with a reason on a provider whose +``append()`` learns positions at read time. + +What this file pins down is the contract: the record on the wire, producer +identity, retry deduplication, positions, supersession, topic addressing, +cursor resumption, cursor ownership, and store keys that cannot collide. The +workflow-side handles and the two rules about Workflow Tasks live in +``test_streams_workflow``. """ from __future__ import annotations @@ -21,15 +21,27 @@ import uuid from collections.abc import AsyncIterator, Callable from dataclasses import dataclass -from typing import Any +from typing import Any, cast import pytest -from temporalio import streams -from temporalio.streams import _frame, _ids, _provider +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.converter import DataConverter +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamHandle, + StreamProvider, + Supersession, + _ids, + _wire, +) from temporalio.streams._policy import AttemptTracker -from temporalio.streams._record import Cursor, RecordKind -from temporalio.streams.providers import memory +from temporalio.streams.providers.memory import MemoryStreams @dataclass @@ -37,35 +49,40 @@ class ProviderCase: """One provider under test, and what the cases may ask of it.""" name: str - client: Any = None - inbound_streams: bool = True - """Outside producers may write a workflow's inbound stream.""" - unfiltered_reads: bool = True - """A consumer may read the owner's stream without naming a topic.""" + provider: StreamProvider + client: Client | None = None + reports_positions: bool = True + """``append()`` returns where the records landed.""" + + def handle(self, workflow_id: str, *, run_id: str | None = None) -> StreamHandle: + # The memory provider takes no client; every storage provider's setup + # supplies one, so the cast only ever lies for the provider that + # does not read it. + return self.provider.get_stream_handle( + cast(Client, self.client), workflow_id, run_id=run_id + ) async def _memory_case() -> AsyncIterator[ProviderCase]: - memory.reset() - streams.configure(provider="memory") - yield ProviderCase("memory") - memory.reset() + provider = MemoryStreams() + yield ProviderCase("memory", provider) + provider.reset() SETUPS: dict[str, Callable[[], AsyncIterator[ProviderCase]]] = {"memory": _memory_case} _CAPABILITIES = { - "inbound_stream": lambda case: case.inbound_streams, - "unfiltered_read": lambda case: case.unfiltered_reads, + "reports_positions": lambda case: case.reports_positions, } @pytest.fixture(params=sorted(SETUPS)) -async def provider(request: pytest.FixtureRequest) -> AsyncIterator[ProviderCase]: - async for case in SETUPS[request.param](): +async def case(request: pytest.FixtureRequest) -> AsyncIterator[ProviderCase]: + async for provider_case in SETUPS[request.param](): for marker, supported in _CAPABILITIES.items(): - if request.node.get_closest_marker(marker) and not supported(case): - pytest.skip(f"the {case.name} provider does not support {marker}") - yield case + if request.node.get_closest_marker(marker) and not supported(provider_case): + pytest.skip(f"the {provider_case.name} provider does not {marker}") + yield provider_case def new_workflow_id() -> str: @@ -87,338 +104,281 @@ async def _collect() -> None: return out -def test_frame_roundtrip(): - frame = _frame.encode( +def test_record_roundtrips_through_the_wire(): + converter = DataConverter.default.payload_converter + wire = _wire.to_wire( + converter, topic="decisions", kind=RecordKind.DATA, - producer="model", + value={"n": 1}, + producer_id="model", attempt=3, sequence=7, - body=b"payload-bytes", - ) - kind, topic, producer, attempt, sequence, body = _frame.decode(frame) - assert (kind, topic, producer, attempt, sequence, body) == ( - RecordKind.DATA, - "decisions", - "model", - 3, - 7, - b"payload-bytes", ) + parsed = _wire.WireRecord.FromString(wire.SerializeToString()) + record = _wire.from_wire(converter, Cursor("memory:0"), parsed, dict) + assert ( + record.kind, + record.topic, + record.producer_id, + record.attempt, + record.sequence, + record.value, + ) == (RecordKind.DATA, "decisions", "model", 3, 7, {"n": 1}) + assert record.supersession is None + finish = _wire.to_wire(converter, topic="decisions", kind=RecordKind.FINISH) + assert not finish.HasField("body") + assert _wire.from_wire(converter, Cursor("memory:1"), finish, dict).value is None + + +def test_a_stored_supersession_is_not_a_record(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", kind=int(RecordKind.SUPERSEDED)) # type: ignore[arg-type] + with pytest.raises(ValueError, match="synthesized"): + _wire.from_wire(converter, Cursor("memory:0"), wire, None) + + +def test_an_unset_kind_is_read_as_data(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", body=converter.to_payloads([{"n": 1}])[0]) + record = _wire.from_wire(converter, Cursor("memory:0"), wire, dict) + assert record.kind is RecordKind.DATA + assert record.value == {"n": 1} def test_supersession_is_synthesized_from_observations(): attempts = AttemptTracker() - assert attempts.note("model", 1, Cursor("0")) is None - superseded = attempts.note("model", 2, Cursor("1")) + assert attempts.note("model", 1, topic="t", previous=BEGINNING) is None + superseded = attempts.note("model", 2, topic="t", previous=Cursor("memory:0")) assert superseded is not None assert superseded.kind is RecordKind.SUPERSEDED - assert isinstance(superseded.value, streams.Supersession) - assert superseded.value.previous_attempt == 1 + assert superseded.supersession == Supersession("model", 1, 2) + assert superseded.value is None + # Positioned before the triggering record, so a resume after it delivers + # that record next. + assert superseded.cursor == Cursor("memory:0") # The same attempt again is not a new generation. - assert attempts.note("model", 2, Cursor("2")) is None + assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None -def test_inbound_stream_ids_cannot_collide(): +def test_topic_keys_cannot_collide(): # A colon in a workflow id must not make two addresses one key. - assert _ids.inbound_stream_id("a:b", "c") != _ids.inbound_stream_id("a", "b:c") - assert _ids.inbound_stream_id("a:b", "") != _ids.inbound_stream_id("a", "b") - assert _ids.inbound_stream_id("a%3Ab", "c") != _ids.inbound_stream_id("a:b", "c") - assert _ids.inbound_stream_id("wf", "inputs") == "wf:inputs" + assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") + assert _ids.topic_key("a%3Ab", "c") != _ids.topic_key("a:b", "c") + assert _ids.topic_key("wf", "inputs") == "wf:inputs" -async def test_append_read_roundtrip(provider: ProviderCase): +def test_cursors_name_their_provider(): + assert _wire.cursor_position(BEGINNING, provider="memory") is None + assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" + with pytest.raises(StreamCursorError): + _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") + + +async def test_append_read_roundtrip(case: ProviderCase): workflow_id = new_workflow_id() - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) + stream = case.handle(workflow_id) + producer = stream.producer(topic="out", producer_id="model", attempt=1) + assert (producer.producer_id, producer.attempt) == ("model", 1) await producer.append({"id": "r1"}, {"id": "r2"}) await producer.finish() - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out"), 3) + records = await take(stream.read(topic="out", result_type=dict), 3) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH, ] assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] - assert all(r.producer == "model" and r.attempt == 1 for r in records) + assert records[2].value is None + assert all(r.producer_id == "model" and r.attempt == 1 for r in records) assert [r.sequence for r in records] == [0, 1, 2] assert all(r.topic == "out" for r in records) -@pytest.mark.inbound_stream -async def test_inbound_records_carry_no_topic(provider: ProviderCase): +async def test_raw_values_pass_through_untouched(case: ProviderCase): workflow_id = new_workflow_id() - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - await producer.append({"id": "r1"}) - await producer.finish() + stream = case.handle(workflow_id) + payload = Payload(metadata={"encoding": b"binary/plain"}, data=b"\x00\x01raw") + producer = stream.producer(topic="out", producer_id="model", attempt=1) + await producer.append(RawValue(payload)) - consumer = await streams.consumer( - provider.client, workflow_id=workflow_id, stream="inputs" - ) - records = await take(consumer.read(type=dict), 2) - assert [r.kind for r in records] == [RecordKind.DATA, RecordKind.FINISH] - assert records[0].value == {"id": "r1"} - # An inbound stream has no topics; its name is the whole address. - assert all(r.topic == "" for r in records) - with pytest.raises(ValueError, match="inbound stream 'inputs' has no topics"): - await take(consumer.read(type=dict, topic="inputs"), 1) + records = await take(stream.read(topic="out", result_type=RawValue), 1) + assert isinstance(records[0].value, RawValue) + assert records[0].value.payload == payload -async def test_retried_append_is_deduplicated(provider: ProviderCase): +@pytest.mark.reports_positions +async def test_retried_append_returns_the_original_position(case: ProviderCase): workflow_id = new_workflow_id() - first = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) - await first.append({"id": "r1"}) + stream = case.handle(workflow_id) + first = stream.producer(topic="out", producer_id="model", attempt=1) + landed = await first.append({"id": "r1"}) + assert landed is not None # The retry of the same attempt starts its sequence over and appends the - # same record. The provider must not store it twice, and says so by - # returning no position for what it dropped. - retry = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) - assert await retry.append({"id": "r1"}) is None - - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out"), 1) + # same record. The provider stores it once and answers with where the + # original landed, so the retry can checkpoint the same position. + retry = stream.producer(topic="out", producer_id="model", attempt=1) + assert await retry.append({"id": "r1"}) == landed + # An empty call writes nothing and answers the same way. + assert await retry.append() == landed + + records = await take(stream.read(topic="out", result_type=dict), 1) assert records[0].value == {"id": "r1"} + assert records[0].cursor == landed # The store holds exactly the one record: the newest position is its cursor. - assert await consumer.latest(topic="out") == records[0].cursor + assert await stream.latest(topic="out") == landed -async def test_new_attempt_supersedes_the_old_one(provider: ProviderCase): +async def test_retried_append_is_stored_once(case: ProviderCase): workflow_id = new_workflow_id() - first = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) + stream = case.handle(workflow_id) + first = stream.producer(topic="out", producer_id="model", attempt=1) + await first.append({"id": "r1"}) + retry = stream.producer(topic="out", producer_id="model", attempt=1) + await retry.append({"id": "r1"}) + await retry.append({"id": "r2"}) + + records = await take(stream.read(topic="out", result_type=dict), 2) + assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] + + +async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): + workflow_id = new_workflow_id() + stream = case.handle(workflow_id) + first = stream.producer(topic="out", producer_id="model", attempt=1) await first.append({"text": "The capital of"}) - second = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=2, - ) + second = stream.producer(topic="out", producer_id="model", attempt=2) await second.append({"text": "Paris is the capital"}) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out"), 3) + records = await take(stream.read(topic="out", result_type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED - assert isinstance(records[1].value, streams.Supersession) - assert records[1].value.previous_attempt == 1 + assert records[1].supersession == Supersession("model", 1, 2) + assert records[1].value is None assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 -async def test_topic_filter_on_the_owners_stream(provider: ProviderCase): - # Two producers on two topics of the stream the workflow publishes. The - # filter is only meaningful on a store that mixes topics, which is this - # one; an inbound stream carries none. +async def test_a_superseded_record_resumes_to_the_triggering_record( + case: ProviderCase, +): workflow_id = new_workflow_id() - on_a = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="a", - producer_id="tool-a", - attempt=1, - ) - await on_a.append({"n": 1}) - on_b = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="b", - producer_id="tool-b", - attempt=1, + stream = case.handle(workflow_id) + first = stream.producer(topic="out", producer_id="model", attempt=1) + await first.append({"n": 1}) + second = stream.producer(topic="out", producer_id="model", attempt=2) + await second.append({"n": 2}) + + records = await take(stream.read(topic="out", result_type=dict), 3) + superseded = records[1] + assert superseded.kind is RecordKind.SUPERSEDED + # The synthesized record sits at the position before the new attempt's + # first record, so a consumer that checkpoints it and restarts is handed + # that record rather than skipping it. + assert superseded.cursor == records[0].cursor + resumed = await take( + stream.read(topic="out", result_type=dict, after=superseded.cursor), 1 ) - await on_b.append({"n": 2}) - - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - only_a = await take(consumer.read(type=dict, topic="a"), 1) - assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] - only_b = await take(consumer.read(type=dict, topic="b"), 1) - assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] + assert resumed[0].kind is RecordKind.DATA + assert resumed[0].value == {"n": 2} -@pytest.mark.unfiltered_read -async def test_a_read_without_a_topic_sees_every_topic(provider: ProviderCase): +async def test_topics_are_addressed_by_name(case: ProviderCase): + # Two producers on two topics of the same workflow's stream: each read + # names its topic and sees only that topic's records. workflow_id = new_workflow_id() - on_a = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="a", - producer_id="tool-a", - attempt=1, - ) + stream = case.handle(workflow_id) + on_a = stream.producer(topic="a", producer_id="tool-a", attempt=1) await on_a.append({"n": 1}) - on_b = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="b", - producer_id="tool-b", - attempt=1, - ) + on_b = stream.producer(topic="b", producer_id="tool-b", attempt=1) await on_b.append({"n": 2}) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - both = await take(consumer.read(type=dict), 2) - assert [(r.topic, r.value) for r in both] == [("a", {"n": 1}), ("b", {"n": 2})] + only_a = await take(stream.read(topic="a", result_type=dict), 1) + assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] + only_b = await take(stream.read(topic="b", result_type=dict), 1) + assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] -async def test_cursor_resumes_where_it_points(provider: ProviderCase): +async def test_cursor_resumes_where_it_points(case: ProviderCase): workflow_id = new_workflow_id() - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) + stream = case.handle(workflow_id) + producer = stream.producer(topic="out", producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out"), 3) + records = await take(stream.read(topic="out", result_type=dict), 3) checkpoint = records[0].cursor # Resuming after a record hands back everything past it and nothing # twice, without the reader ever advancing a cursor itself. - resumed = await streams.consumer(provider.client, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, topic="out", after=checkpoint), 2) + again = await take(stream.read(topic="out", result_type=dict, after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] -async def test_append_cursor_names_the_last_record_of_the_batch( - provider: ProviderCase, -): +@pytest.mark.reports_positions +async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCase): workflow_id = new_workflow_id() - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) + stream = case.handle(workflow_id) + producer = stream.producer(topic="out", producer_id="model", attempt=1) appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - if appended is None: - pytest.skip(f"the {provider.name} provider learns positions at read time") - await producer.append({"n": 4}) + assert appended is not None + then = await producer.append({"n": 4}) # A producer that resumes a reader after its own append must see only # what came later, not the tail of the batch it just wrote. - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out", after=appended), 1) + records = await take(stream.read(topic="out", result_type=dict, after=appended), 1) assert [r.value for r in records] == [{"n": 4}] - assert await producer.append() is None + assert records[0].cursor == then + assert await producer.append() == then -async def test_latest_positions_a_reader_at_the_end(provider: ProviderCase): +async def test_latest_positions_a_reader_at_the_end(case: ProviderCase): workflow_id = new_workflow_id() - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - assert await consumer.latest(topic="out") == streams.BEGINNING + stream = case.handle(workflow_id) + producer = stream.producer(topic="out", producer_id="model", attempt=1) + assert await stream.latest(topic="out") == BEGINNING await producer.append({"n": 1}, {"n": 2}) - since = await consumer.latest(topic="out") + since = await stream.latest(topic="out") await producer.append({"n": 3}) # A reader that positioned itself before the last append sees only what # came after, which is how a client follows a turn it is about to start. - records = await take(consumer.read(type=dict, topic="out", after=since), 1) + records = await take(stream.read(topic="out", result_type=dict, after=since), 1) assert [r.value for r in records] == [{"n": 3}] -@pytest.mark.inbound_stream -async def test_stream_addresses_with_colons_do_not_share_a_store( - provider: ProviderCase, -): +async def test_topic_addresses_with_colons_do_not_share_a_store(case: ProviderCase): # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. base = new_workflow_id() - left = await streams.producer( - provider.client, workflow_id=f"{base}:x", stream="y", producer_id="l", attempt=1 - ) - right = await streams.producer( - provider.client, workflow_id=base, stream="x:y", producer_id="r", attempt=1 + left = case.handle(f"{base}:x") + right = case.handle(base) + await left.producer(topic="y", producer_id="l", attempt=1).append({"side": "left"}) + await right.producer(topic="x:y", producer_id="r", attempt=1).append( + {"side": "right"} ) - await left.append({"side": "left"}) - await right.append({"side": "right"}) - seen_left = await streams.consumer( - provider.client, workflow_id=f"{base}:x", stream="y" - ) - only_left = await take(seen_left.read(type=dict), 1) + only_left = await take(left.read(topic="y", result_type=dict), 1) assert [r.value for r in only_left] == [{"side": "left"}] - assert await seen_left.latest() == only_left[0].cursor - seen_right = await streams.consumer(provider.client, workflow_id=base, stream="x:y") - only_right = await take(seen_right.read(type=dict), 1) + assert await left.latest(topic="y") == only_left[0].cursor + only_right = await take(right.read(topic="x:y", result_type=dict), 1) assert [r.value for r in only_right] == [{"side": "right"}] - assert await seen_right.latest() == only_right[0].cursor + assert await right.latest(topic="x:y") == only_right[0].cursor -async def test_producer_needs_exactly_one_address_and_an_identity( - provider: ProviderCase, -): - workflow_id = new_workflow_id() +async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): + stream = case.handle(new_workflow_id()) + # Refused by read() itself, not by the first iteration of its generator, + # so the caller's except clause is where the mistake surfaces. + with pytest.raises(StreamCursorError): + stream.read(topic="out", after=Cursor("elsewhere:42")) + + +async def test_argument_mistakes_are_value_errors(case: ProviderCase): + stream = case.handle(new_workflow_id()) with pytest.raises(ValueError): - await streams.producer( - provider.client, workflow_id=workflow_id, producer_id="model", attempt=1 - ) + stream.read(topic="") with pytest.raises(ValueError): - await streams.producer( - provider.client, - workflow_id=workflow_id, - stream="inputs", - topic="out", - producer_id="model", - attempt=1, - ) + stream.producer(topic="", producer_id="model", attempt=1) # Outside an activity there is no identity to fall back on. with pytest.raises(ValueError, match="producer_id is required"): - await streams.producer(provider.client, workflow_id=workflow_id, topic="out") - - -def test_unknown_provider_is_a_clear_error(): - with pytest.raises(RuntimeError, match="no stream provider 'nope'"): - streams.configure(provider="nope") - - -async def test_opening_a_stream_needs_a_configured_provider(): - # Building a provider is process setup, so the first workflow's thread - # is not allowed to do it as a side effect of opening a stream. - _provider._active = None - with pytest.raises(RuntimeError, match="streams.configure"): - await streams.consumer(None, workflow_id="wf") - # Closing with nothing configured is allowed, so a shutdown path can - # call it unconditionally. - await streams.close() - streams.configure(provider="memory") - assert await streams.consumer(None, workflow_id="wf") is not None - await streams.close() + stream.producer(topic="out") diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index 40487686d..58fb274ef 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -1,25 +1,37 @@ """Workflow-side conformance for the stream contract. -Runs the reader and writer handles inside a real workflow on the memory -provider with a warm cache, and states the two rules about workflow tasks as -tests: a publish commits with its task (rule 1), and reads are recorded -observations that replay re-supplies (rule 2). The memory provider keeps -neither and says so in its docstring, so those two are strict expected -failures here. A storage provider that runs this module turns them into -passes; that is the measurement they exist for. +Runs the reader and writer inside a real workflow on the memory provider +with a warm cache, and states the two rules about Workflow Tasks as tests: a +publish commits with its task (rule 1), and reads are recorded observations +that replay re-supplies (rule 2). The memory provider keeps neither and says +so in its docstring, so those two are strict expected failures here. A +storage provider that runs this module turns them into passes; that is the +measurement they exist for. + +The rest is what the portable surface promises on every provider: the +lifecycle hooks the worker calls, one subscription per topic per run, a read +that ends when the chain closes, a handle that follows continue-as-new, and +a topic shared by the workflow and an outside producer. """ from __future__ import annotations +import asyncio import uuid from typing import Any import pytest -from temporalio import streams, workflow +from temporalio import workflow from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams.providers import memory +from temporalio.streams import ( + Cursor, + ReadSource, + RecordKind, + StreamCursorError, + WriteSink, +) +from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import WorkflowEnvironment from temporalio.worker import Replayer from tests.helpers import new_worker @@ -29,49 +41,46 @@ DECISIONS = "decisions" -@pytest.fixture(autouse=True) -def _fresh_memory_provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] +@pytest.fixture +def provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] if env.supports_time_skipping: pytest.skip( "the memory provider polls on a timer, which time skipping turns into a spin" ) - memory.reset() - streams.configure(provider="memory") - yield - memory.reset() + streams = MemoryStreams() + yield streams + streams.reset() @workflow.defn class ContractLoop: """Reads ``inputs``, publishes a decision per value, reports control records.""" - def __init__(self) -> None: - streams.prepare() - @workflow.run async def run(self) -> list[dict[str, Any]]: - inputs = streams.reader(INPUTS, type=dict) - decisions = streams.writer(DECISIONS) + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) trace: list[dict[str, Any]] = [] try: async for record in inputs: - if isinstance(record.value, streams.Supersession): + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None trace.append( { "kind": "superseded", - "replaced": record.value.previous_attempt, - "attempt": record.value.attempt, + "replaced": record.supersession.previous_attempt, + "attempt": record.supersession.attempt, } ) - await decisions.publish( - {"retracting_attempt": record.value.previous_attempt} + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} ) continue if record.kind is RecordKind.FINISH: - trace.append({"kind": "finish", "producer": record.producer}) + trace.append({"kind": "finish", "producer": record.producer_id}) break - assert isinstance(record.value, dict) - await decisions.publish({"decided": record.value["n"]}) + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) trace.append( { "kind": "decision", @@ -81,42 +90,34 @@ async def run(self) -> list[dict[str, Any]]: ) finally: inputs.close() - await decisions.finish() + decisions.finish() # Twice on purpose: a finished topic stays finished, with one marker. - await decisions.finish() - streams.drain() + decisions.finish() return trace -async def _run_the_loop(client: Client) -> tuple[Any, list[dict[str, Any]]]: +async def _run_the_loop( + client: Client, provider: MemoryStreams +) -> tuple[Any, list[dict[str, Any]]]: workflow_id = f"streams-wf-{uuid.uuid4().hex}" - async with new_worker(client, ContractLoop, **streams.worker_options()) as worker: + async with new_worker(client, ContractLoop, plugins=[provider]) as worker: handle = await client.start_workflow( ContractLoop.run, id=workflow_id, task_queue=worker.task_queue ) - first = await streams.producer( - client, - workflow_id=workflow_id, - stream=INPUTS, - producer_id="model", - attempt=1, - ) + stream = provider.get_stream_handle(client, workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await first.append({"n": 1}, {"n": 2}) - second = await streams.producer( - client, - workflow_id=workflow_id, - stream=INPUTS, - producer_id="model", - attempt=2, - ) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"n": 3}) await second.finish() trace = await handle.result() return handle, trace -async def test_workflow_reads_decides_and_publishes(client: Client): - handle, trace = await _run_the_loop(client) +async def test_workflow_reads_decides_and_publishes( + client: Client, provider: MemoryStreams +): + handle, trace = await _run_the_loop(client, provider) assert trace == [ {"kind": "decision", "n": 1, "attempt": 1}, {"kind": "decision", "n": 2, "attempt": 1}, @@ -126,8 +127,8 @@ async def test_workflow_reads_decides_and_publishes(client: Client): ] # The outside view of what the workflow published, on its own topic. - consumer = await streams.consumer(client, workflow_id=handle.id) - records = await take(consumer.read(type=dict, topic=DECISIONS), 5) + stream = provider.get_stream_handle(client, handle.id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 5) assert [(r.kind, r.value) for r in records] == [ (RecordKind.DATA, {"decided": 1}), (RecordKind.DATA, {"decided": 2}), @@ -135,9 +136,30 @@ async def test_workflow_reads_decides_and_publishes(client: Client): (RecordKind.DATA, {"decided": 3}), (RecordKind.FINISH, None), ] - assert all(r.producer == "" and r.topic == DECISIONS for r in records) + assert all(r.producer_id == "" and r.topic == DECISIONS for r in records) # The second finish() wrote nothing: the marker is the newest record. - assert await consumer.latest() == records[-1].cursor + assert await stream.latest(topic=DECISIONS) == records[-1].cursor + + +async def test_read_ends_when_the_workflow_closes_and_the_tail_is_delivered( + client: Client, provider: MemoryStreams +): + handle, _ = await _run_the_loop(client, provider) + stream = provider.get_stream_handle(client, handle.id) + + async def read_everything() -> list[Any]: + return [r.value async for r in stream.read(topic=DECISIONS, result_type=dict)] + + # No count and no early break: the read ends by itself once the workflow + # is closed and everything it retained has been handed over. + values = await asyncio.wait_for(read_everything(), 30) + assert values == [ + {"decided": 1}, + {"decided": 2}, + {"retracting_attempt": 1}, + {"decided": 3}, + None, + ] @pytest.mark.xfail( @@ -148,12 +170,14 @@ async def test_workflow_reads_decides_and_publishes(client: Client): "provider reads live process memory instead" ), ) -async def test_replay_without_the_store_resupplies_the_records(client: Client): - handle, _ = await _run_the_loop(client) +async def test_replay_without_the_store_resupplies_the_records( + client: Client, provider: MemoryStreams +): + handle, _ = await _run_the_loop(client, provider) history = await handle.fetch_history() - memory.reset() - replayer = Replayer(workflows=[ContractLoop], **streams.worker_options()) + provider.reset() + replayer = Replayer(workflows=[ContractLoop], plugins=[provider]) await replayer.replay_workflow(history) @@ -167,20 +191,16 @@ async def test_replay_without_the_store_resupplies_the_records(client: Client): class PublishThenFail: """Publishes, then fails its first workflow task; the retry publishes again.""" - def __init__(self) -> None: - streams.prepare() - @workflow.run async def run(self) -> None: - decisions = streams.writer(DECISIONS) + decisions = workflow.stream_writer(DECISIONS) run_id = workflow.info().run_id committed = run_id in _failed_once - await decisions.publish({"committed": committed}) + decisions.publish({"committed": committed}) if not committed: _failed_once.add(run_id) raise RuntimeError("the first task fails after publishing") - await decisions.finish() - streams.drain() + decisions.finish() @pytest.mark.xfail( @@ -191,18 +211,237 @@ async def run(self) -> None: "visible at publish time" ), ) -async def test_a_failed_task_publishes_nothing(client: Client): +async def test_a_failed_task_publishes_nothing(client: Client, provider: MemoryStreams): workflow_id = f"streams-wf-{uuid.uuid4().hex}" - async with new_worker( - client, PublishThenFail, **streams.worker_options() - ) as worker: + async with new_worker(client, PublishThenFail, plugins=[provider]) as worker: handle = await client.start_workflow( PublishThenFail.run, id=workflow_id, task_queue=worker.task_queue ) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic=DECISIONS), 2, timeout=30) + stream = provider.get_stream_handle(client, workflow_id) + records = await take( + stream.read(topic=DECISIONS, result_type=dict), 2, timeout=30 + ) await handle.result() assert [(r.kind, r.value) for r in records] == [ (RecordKind.DATA, {"committed": True}), (RecordKind.FINISH, None), ] + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +class _RecordingHalf: + """A workflow half that logs the hooks the worker calls, then delegates.""" + + def __init__(self, inner: Any, calls: list[tuple[str, str]]) -> None: + self._inner = inner + self._calls = calls + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + return self._inner.open_reader(topic, after=after) + + def open_writer(self, topic: str) -> WriteSink: + return self._inner.open_writer(topic) + + def on_workflow_start(self) -> None: + self._calls.append(("start", workflow.info().run_id)) + + async def on_workflow_finish(self) -> None: + self._calls.append(("finish", workflow.info().run_id)) + + +class HookedMemory(MemoryStreams): + """The memory provider with its lifecycle hooks made visible.""" + + def __init__(self) -> None: + super().__init__() + self.calls: list[tuple[str, str]] = [] + + def workflow_provider(self) -> Any: + return _RecordingHalf(super().workflow_provider(), self.calls) + + +@pytest.mark.usefixtures("provider") +async def test_the_worker_calls_the_lifecycle_hooks_around_every_run(client: Client): + hooked = HookedMemory() + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[hooked]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + # Start before the function, finish after it, on both runs: the finish + # hook runs on the continue-as-new exit too, so a provider that parked + # something against the first run can let go before the successor starts. + kinds = [kind for kind, _ in hooked.calls] + assert kinds == ["start", "finish", "start", "finish"] + runs = [run_id for _, run_id in hooked.calls] + assert runs[0] == runs[1] and runs[2] == runs[3] and runs[0] != runs[2] + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[provider]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 30) + await handle.result() + # The chain is followed: the successor's records arrive on the same read, + # and the read ends only when the last run of the chain is closed. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + + +@workflow.defn +class SharedReaders: + """Opens the same topic twice and pulls from both readers in turn.""" + + @workflow.run + async def run(self) -> list[Any]: + first = workflow.stream_reader(INPUTS, result_type=dict) + second = workflow.stream_reader(INPUTS, result_type=dict) + trace: list[Any] = ["shared" if first is second else "separate"] + try: + workflow.stream_reader(INPUTS, result_type=dict, after=Cursor("memory:0")) + except ValueError: + trace.append("after-rejected") + try: + workflow.stream_reader(INPUTS, result_type=list) + except ValueError: + trace.append("type-rejected") + trace.append((await first.__anext__()).value) + trace.append((await second.__anext__()).value) + first.close() + return trace + + +async def test_a_second_reader_on_a_topic_shares_the_subscription( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, SharedReaders, plugins=[provider]) as worker: + handle = await client.start_workflow( + SharedReaders.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=INPUTS, producer_id="model", attempt=1).append( + {"n": 1}, {"n": 2} + ) + assert await handle.result() == [ + "shared", + "after-rejected", + "type-rejected", + {"n": 1}, + {"n": 2}, + ] + + +@workflow.defn +class ForeignCursor: + """Resumes from a cursor another provider minted.""" + + @workflow.run + async def run(self) -> str: + try: + workflow.stream_reader(INPUTS, after=Cursor("elsewhere:1")) + except StreamCursorError: + return "refused" + return "accepted" + + +async def test_the_workflow_reader_refuses_a_foreign_cursor( + client: Client, provider: MemoryStreams +): + async with new_worker(client, ForeignCursor, plugins=[provider]) as worker: + result = await client.execute_workflow( + ForeignCursor.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert result == "refused" + + +@workflow.defn +class NoProvider: + """Opens a stream on a worker that has no provider.""" + + @workflow.run + async def run(self) -> str: + try: + workflow.stream_reader(INPUTS) + except RuntimeError as error: + return str(error) + return "opened" + + +async def test_a_worker_without_a_provider_says_so(client: Client): + async with new_worker(client, NoProvider) as worker: + result = await client.execute_workflow( + NoProvider.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert "no stream provider is configured" in result + + +@workflow.defn +class OneLine: + """Publishes one record and finishes the topic.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"from": "workflow"}) + decisions.finish() + + +async def test_an_outside_producer_and_the_workflow_share_a_topic( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, OneLine, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=DECISIONS, producer_id="tool", attempt=1).append( + {"from": "producer"} + ) + handle = await client.start_workflow( + OneLine.run, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + + records = await asyncio.wait_for(read_everything(), 30) + # Both writers land on one topic in one order, each under its own + # identity: the producer's records carry its id, the workflow's carry none. + assert [(r.producer_id, r.kind, r.value) for r in records] == [ + ("tool", RecordKind.DATA, {"from": "producer"}), + ("", RecordKind.DATA, {"from": "workflow"}), + ("", RecordKind.FINISH, None), + ] From 3f16fd36543d76e21dd09b30f26b32e5d3071b63 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:54:17 -0700 Subject: [PATCH 230/831] Moved the stream demo and changelog entry onto the new surface. --- CHANGELOG.md | 8 +++++-- streams_demo/agent_loop.py | 42 +++++++++++++--------------------- streams_demo/provider_setup.py | 27 +++++++++++++--------- streams_demo/run_demo.py | 29 ++++++++++------------- 4 files changed, 50 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 568f64b4b..06eb5da58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,8 +22,12 @@ to include examples, links to docs, or any other relevant information. - Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. - **Experimental**: `temporalio.streams` defines one stream interface a workflow - can read, decide on, and write, with a registry that picks the provider when - the worker is built. `temporalio.streams.providers.memory` is the in-memory + can read, decide on, and write. `workflow.stream_reader()` and + `workflow.stream_writer()` are the workflow-side entry points, a provider is a + worker plugin passed as `Worker(plugins=[provider])`, and + `provider.get_stream_handle()` reads and appends from outside. The record on + the wire is `temporal.api.stream.v1.StreamRecord` on every provider. + `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. ### Changed diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index f6f14b873..330cb54c2 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -14,7 +14,8 @@ from datetime import timedelta from typing import Any -from temporalio import activity, streams, workflow +from temporalio import activity, workflow +from temporalio.streams import RecordKind DECISIONS = "decisions" INPUTS = "inputs" @@ -41,50 +42,42 @@ def decide(token: dict[str, Any]) -> dict[str, Any]: class AgentLoop: """Read, decide, write, until the producer says it has finished.""" - def __init__(self) -> None: - """Let the provider install what it needs before the first task. - - A no-op except on a transport that serves outside readers through - handlers on this workflow, which has to register them before the - first task completes or an early reader finds nothing to talk to. - """ - streams.prepare() - @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: """Decide on at most ``limit`` inputs, then return the trace.""" - inputs = streams.reader(INPUTS, type=dict, idle_timeout=timedelta(seconds=1)) - decisions = streams.writer(DECISIONS) + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) trace: list[dict[str, Any]] = [] accepted = 0 try: async for record in inputs: - if isinstance(record.value, streams.Supersession): + if record.kind is RecordKind.SUPERSEDED: # A newer attempt of the same producer started writing. The # decisions already published stand, so the workflow says so # rather than pretending they can be withdrawn. + assert record.supersession is not None trace.append( { "kind": "superseded", - "producer": record.producer, - "replaced": record.value.previous_attempt, - "attempt": record.value.attempt, + "producer": record.producer_id, + "replaced": record.supersession.previous_attempt, + "attempt": record.supersession.attempt, } ) - await decisions.publish( - {"retracting_attempt": record.value.previous_attempt} + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} ) continue - if record.kind is streams.RecordKind.FINISH: + if record.kind is RecordKind.FINISH: # The producer says it is done, which is what ends the loop. # Counting decisions instead would leave the terminal record # unread and let the workflow finish while its producer is # still writing. - trace.append({"kind": "finish", "producer": record.producer}) + trace.append({"kind": "finish", "producer": record.producer_id}) break - assert isinstance(record.value, dict) + assert record.value is not None decision = decide(record.value) - await decisions.publish(decision) + decisions.publish(decision) receipt = await workflow.execute_activity( record_decision, decision, @@ -101,8 +94,5 @@ async def run(self, limit: int) -> list[dict[str, Any]]: break finally: inputs.close() - await decisions.finish() - # Lets go of anything the provider parked against this run, so a - # transport that holds a long poll open can let the workflow return. - streams.drain() + decisions.finish() return trace diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index 52ebbd266..2e4bcc350 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -1,15 +1,17 @@ """Pick the provider for a demo run from the environment. -``STREAMS_PROVIDER`` names any registered provider; this base tree carries -only ``memory``, and each provider branch adds its own name. The demo needs a -Temporal server to run the workflow either way; ``TEMPORAL_ADDRESS`` points -at it. +``STREAMS_PROVIDER`` names a provider; this base tree carries only ``memory``, +and each provider branch adds its own name here. The demo needs a Temporal +server to run the workflow either way; ``TEMPORAL_ADDRESS`` points at it. """ from __future__ import annotations import os +from temporalio.streams.providers import ProviderPlugin +from temporalio.streams.providers.memory import MemoryStreams + NAME = os.environ.get("STREAMS_PROVIDER", "memory") # The memory provider is not replay-safe, so its demo keeps the cache warm. @@ -17,15 +19,18 @@ WORKFLOW_CACHE = int(os.environ.get("STREAMS_WORKFLOW_CACHE", "512")) -async def open() -> tuple[str, dict]: - """The server to connect to and the options :func:`configure` takes.""" - return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), {"provider": NAME} +async def open() -> tuple[str, ProviderPlugin]: + """The server to connect to and the provider the worker and the client share.""" + if NAME != "memory": + raise SystemExit(f"this tree carries no stream provider named {NAME!r}") + return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), MemoryStreams() -async def close() -> None: +async def close(provider: ProviderPlugin) -> None: """Let go of whatever :func:`open` acquired. - Nothing here: the memory provider holds no connection. A provider branch - that opens one closes it here, so the demo's teardown reads the same on - every provider. + The memory provider holds no connection, so this is its ``close()`` and + nothing more. A provider branch that opens one closes it the same way, so + the demo's teardown reads the same on every provider. """ + await provider.close() diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index c4fc8e042..1238fad11 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -7,7 +7,7 @@ the run as it allows is rebuilt rather than remembered; - a producer whose second attempt supersedes its first, which the reader has to report and the workflow has to act on; -- an outside consumer reading what the workflow published. +- an outside reader following what the workflow published. Byte-identical in every tree. ``provider_setup`` is what differs, and it is the only import here that names a provider. @@ -23,24 +23,23 @@ from pathlib import Path from typing import Any -from temporalio import streams from temporalio.api.enums.v1 import EventType from temporalio.client import Client +from temporalio.streams import StreamHandle from temporalio.worker import Worker sys.path.insert(0, str(Path(__file__).resolve().parent)) import provider_setup # noqa: E402 -from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 +from agent_loop import DECISIONS, INPUTS, AgentLoop, record_decision # noqa: E402 DECISION_LIMIT = 8 EXPECTED_OUTPUT = 6 -async def collect_output(client: Client, workflow_id: str, want: int) -> list[dict]: +async def collect_output(stream: StreamHandle, want: int) -> list[dict]: """Read ``want`` decisions off the workflow's stream from outside it.""" - reader = await streams.consumer(client, workflow_id=workflow_id) seen: list[dict] = [] - async for record in reader.read(type=dict, topic="decisions"): + async for record in stream.read(topic=DECISIONS, result_type=dict): seen.append({"kind": record.kind.name, "value": record.value}) if len(seen) >= want: break @@ -51,9 +50,8 @@ async def main() -> int: """Run the demo once and write what happened next to this file.""" out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" out.mkdir(exist_ok=True) - target, options = await provider_setup.open() + target, provider = await provider_setup.open() client = await Client.connect(target, namespace="default") - streams.configure(**options) uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex record: dict[str, Any] = { @@ -69,24 +67,21 @@ async def main() -> int: workflows=[AgentLoop], activities=[record_decision], max_cached_workflows=provider_setup.WORKFLOW_CACHE, - **streams.worker_options(), + plugins=[provider], ): handle = await client.start_workflow( AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid ) - output = asyncio.create_task(collect_output(client, uid, EXPECTED_OUTPUT)) + stream = provider.get_stream_handle(client, uid) + output = asyncio.create_task(collect_output(stream, EXPECTED_OUTPUT)) # The first attempt writes two records and then stops, as a failed # activity would. The second writes different inputs under the same # logical producer, which is what the reader has to report. - first = await streams.producer( - client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=1 - ) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await first.append({"id": "r1", "value": 1}, {"id": "r2", "value": 2}) await asyncio.sleep(0.5) - second = await streams.producer( - client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=2 - ) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"id": "r3", "value": 3}, {"id": "r4", "value": 4}) await second.finish() @@ -146,7 +141,7 @@ async def main() -> int: history = await handle.fetch_history() record["history_events"] = len(history.events) (out / "history.json").write_text(history.to_json()) - await provider_setup.close() + await provider_setup.close(provider) (out / "results.json").write_text(json.dumps(record, indent=2) + "\n") print(json.dumps(record, indent=2)) return 0 if record["outcome"] == "completed" else 1 From e5f21dfc1b82fc5cfb5d2d772f36616c944cf198 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:00:38 -0700 Subject: [PATCH 231/831] Let a conformance case start the workflow that owns a stream. A store that lives inside a running workflow has no stream until that workflow runs, so a provider's setup can hand the cases a host that starts it before they open a handle. --- tests/streams/test_streams_conformance.py | 65 ++++++++++++++--------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 50a59bb0f..451fe4391 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -2,11 +2,14 @@ Written against the public surface, parametrised over the providers this tree can stand up. The memory provider always runs, with no server and no -store. A storage provider adds itself to ``SETUPS`` behind its own -``STREAMS_LIVE`` gate: its setup hands back a provider instance, the client -the cases should use, and says which capabilities it lacks, so the cases -marked ``reports_positions`` are skipped with a reason on a provider whose -``append()`` learns positions at read time. +store. A storage provider adds itself to ``SETUPS``, behind its own +``STREAMS_LIVE`` gate when it needs a store the test environment does not +start: its setup receives the environment's client and hands back a provider +instance, the client the cases should use, a ``host`` that starts the +workflow owning a stream when the store lives inside a running workflow, and +which capabilities it lacks, so the cases marked ``reports_positions`` are +skipped with a reason on a provider whose ``append()`` learns positions at +read time. What this file pins down is the contract: the record on the wire, producer identity, retry deduplication, positions, supersession, topic addressing, @@ -19,7 +22,7 @@ import asyncio import uuid -from collections.abc import AsyncIterator, Callable +from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass from typing import Any, cast @@ -53,8 +56,14 @@ class ProviderCase: client: Client | None = None reports_positions: bool = True """``append()`` returns where the records landed.""" - - def handle(self, workflow_id: str, *, run_id: str | None = None) -> StreamHandle: + host: Callable[[str], Awaitable[None]] | None = None + """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" + + async def open( + self, workflow_id: str, *, run_id: str | None = None + ) -> StreamHandle: + if self.host is not None: + await self.host(workflow_id) # The memory provider takes no client; every storage provider's setup # supplies one, so the cast only ever lies for the provider that # does not read it. @@ -63,13 +72,15 @@ def handle(self, workflow_id: str, *, run_id: str | None = None) -> StreamHandle ) -async def _memory_case() -> AsyncIterator[ProviderCase]: +async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider = MemoryStreams() yield ProviderCase("memory", provider) provider.reset() -SETUPS: dict[str, Callable[[], AsyncIterator[ProviderCase]]] = {"memory": _memory_case} +SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { + "memory": _memory_case +} _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, @@ -77,8 +88,10 @@ async def _memory_case() -> AsyncIterator[ProviderCase]: @pytest.fixture(params=sorted(SETUPS)) -async def case(request: pytest.FixtureRequest) -> AsyncIterator[ProviderCase]: - async for provider_case in SETUPS[request.param](): +async def case( + request: pytest.FixtureRequest, client: Client +) -> AsyncIterator[ProviderCase]: + async for provider_case in SETUPS[request.param](client): for marker, supported in _CAPABILITIES.items(): if request.node.get_closest_marker(marker) and not supported(provider_case): pytest.skip(f"the {provider_case.name} provider does not {marker}") @@ -177,7 +190,7 @@ def test_cursors_name_their_provider(): async def test_append_read_roundtrip(case: ProviderCase): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) producer = stream.producer(topic="out", producer_id="model", attempt=1) assert (producer.producer_id, producer.attempt) == ("model", 1) await producer.append({"id": "r1"}, {"id": "r2"}) @@ -198,7 +211,7 @@ async def test_append_read_roundtrip(case: ProviderCase): async def test_raw_values_pass_through_untouched(case: ProviderCase): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) payload = Payload(metadata={"encoding": b"binary/plain"}, data=b"\x00\x01raw") producer = stream.producer(topic="out", producer_id="model", attempt=1) await producer.append(RawValue(payload)) @@ -211,7 +224,7 @@ async def test_raw_values_pass_through_untouched(case: ProviderCase): @pytest.mark.reports_positions async def test_retried_append_returns_the_original_position(case: ProviderCase): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) first = stream.producer(topic="out", producer_id="model", attempt=1) landed = await first.append({"id": "r1"}) assert landed is not None @@ -232,7 +245,7 @@ async def test_retried_append_returns_the_original_position(case: ProviderCase): async def test_retried_append_is_stored_once(case: ProviderCase): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) first = stream.producer(topic="out", producer_id="model", attempt=1) await first.append({"id": "r1"}) retry = stream.producer(topic="out", producer_id="model", attempt=1) @@ -245,7 +258,7 @@ async def test_retried_append_is_stored_once(case: ProviderCase): async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) first = stream.producer(topic="out", producer_id="model", attempt=1) await first.append({"text": "The capital of"}) second = stream.producer(topic="out", producer_id="model", attempt=2) @@ -263,7 +276,7 @@ async def test_a_superseded_record_resumes_to_the_triggering_record( case: ProviderCase, ): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) first = stream.producer(topic="out", producer_id="model", attempt=1) await first.append({"n": 1}) second = stream.producer(topic="out", producer_id="model", attempt=2) @@ -287,7 +300,7 @@ async def test_topics_are_addressed_by_name(case: ProviderCase): # Two producers on two topics of the same workflow's stream: each read # names its topic and sees only that topic's records. workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) on_a = stream.producer(topic="a", producer_id="tool-a", attempt=1) await on_a.append({"n": 1}) on_b = stream.producer(topic="b", producer_id="tool-b", attempt=1) @@ -301,7 +314,7 @@ async def test_topics_are_addressed_by_name(case: ProviderCase): async def test_cursor_resumes_where_it_points(case: ProviderCase): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) producer = stream.producer(topic="out", producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}, {"n": 3}) @@ -317,7 +330,7 @@ async def test_cursor_resumes_where_it_points(case: ProviderCase): @pytest.mark.reports_positions async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCase): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) producer = stream.producer(topic="out", producer_id="model", attempt=1) appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) assert appended is not None @@ -333,7 +346,7 @@ async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCa async def test_latest_positions_a_reader_at_the_end(case: ProviderCase): workflow_id = new_workflow_id() - stream = case.handle(workflow_id) + stream = await case.open(workflow_id) producer = stream.producer(topic="out", producer_id="model", attempt=1) assert await stream.latest(topic="out") == BEGINNING @@ -350,8 +363,8 @@ async def test_latest_positions_a_reader_at_the_end(case: ProviderCase): async def test_topic_addresses_with_colons_do_not_share_a_store(case: ProviderCase): # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. base = new_workflow_id() - left = case.handle(f"{base}:x") - right = case.handle(base) + left = await case.open(f"{base}:x") + right = await case.open(base) await left.producer(topic="y", producer_id="l", attempt=1).append({"side": "left"}) await right.producer(topic="x:y", producer_id="r", attempt=1).append( {"side": "right"} @@ -366,7 +379,7 @@ async def test_topic_addresses_with_colons_do_not_share_a_store(case: ProviderCa async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): - stream = case.handle(new_workflow_id()) + stream = await case.open(new_workflow_id()) # Refused by read() itself, not by the first iteration of its generator, # so the caller's except clause is where the mistake surfaces. with pytest.raises(StreamCursorError): @@ -374,7 +387,7 @@ async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): async def test_argument_mistakes_are_value_errors(case: ProviderCase): - stream = case.handle(new_workflow_id()) + stream = await case.open(new_workflow_id()) with pytest.raises(ValueError): stream.read(topic="") with pytest.raises(ValueError): From fbf94e78469461b94e1599da623c3cc410cdbc14 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 232/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From 09891a5430a05cac2c74e12ddad4a7947c520cbb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 233/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From a8d556c365022aa8a09a619d966cb7c0730e2f3b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 234/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- .../streams/providers/workflow_streams.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From b13fb882a4f5a77723517f856aef392db9b4867c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 235/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- .../streams/providers/workflow_streams.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) From 56862e38cdb20b074a2a50aa8fc727e9ae68e650 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 236/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From 29dd56eb40a54481e6f36c7fd111d824a94e9141 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 237/831] Made the Workflow Streams provider pass the linters. The transport already resolves its payload converter and falls back to the default when it holds no client, so the provider asks it rather than reaching through a client that may not be there. --- .../streams/providers/workflow_streams.py | 13 ++++++-- .../streams/test_workflow_streams_provider.py | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d849f1244..656056381 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -186,6 +186,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to one stream or topic on ``handle``.""" self._handle = handle self._converter = converter self._stream = stream @@ -205,15 +206,19 @@ def _shipped_topic(self) -> str: @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the shipped publish Signal.""" entries = [] for value in values: frame = _frame.encode( @@ -230,6 +235,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor("") async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._frame_topic, kind=RecordKind.FINISH, @@ -274,6 +280,7 @@ def __init__( shipped_topic: str | None, poll_cooldown: timedelta, ) -> None: + """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client self._shipped_topic = shipped_topic self._poll_cooldown = poll_cooldown @@ -285,6 +292,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -362,6 +370,7 @@ def _record( return out async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one log per workflow, whatever the topic head = await self._client.get_offset() return Cursor(str(head - 1)) if head > 0 else BEGINNING @@ -369,7 +378,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._client.data_converter.payload_converter + converter = self._client._payload_converter() if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2b491cbf1..612aaa33d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -12,6 +12,7 @@ import asyncio import os import uuid +from typing import Any import pytest @@ -62,7 +63,7 @@ async def run(self) -> int: return seen -async def take(records, count: int, timeout: float = 30.0) -> list: +async def take(records: Any, count: int, timeout: float = 30.0) -> list: out: list = [] async def _collect() -> None: @@ -77,9 +78,7 @@ async def _collect() -> None: async def test_interface_loop_over_workflow_streams(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -119,9 +118,7 @@ async def test_interface_loop_over_workflow_streams(): async def test_retried_producer_dedupes_and_new_attempt_supersedes(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -135,19 +132,28 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): ) first = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await first.append({"n": 1}) # The retry of the same attempt re-sends its first batch. retry = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await retry.append({"n": 1}) second = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=2, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=2, ) await second.append({"n": 2}) From 948d9a7afddfbc2b58edc4a5af66b2c27f567032 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 238/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06eb5da58..ee4f256cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,10 @@ to include examples, links to docs, or any other relevant information. the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 270b4a14da55aa0e37a593d19a289db82cb03643 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:44:59 -0700 Subject: [PATCH 239/831] Added public accessors to Workflow Streams for code that rides its wire. A provider that reuses the shipped transport needs the publish signal's name, the log past an offset, and the client's handle and converter. Reading them off private attributes breaks silently on the next contrib change. --- .../contrib/workflow_streams/__init__.py | 6 +++- .../contrib/workflow_streams/_client.py | 14 ++++++++++ .../contrib/workflow_streams/_stream.py | 28 ++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/temporalio/contrib/workflow_streams/__init__.py b/temporalio/contrib/workflow_streams/__init__.py index 41f670f0c..3f225bb2f 100644 --- a/temporalio/contrib/workflow_streams/__init__.py +++ b/temporalio/contrib/workflow_streams/__init__.py @@ -13,7 +13,10 @@ """ from temporalio.contrib.workflow_streams._client import WorkflowStreamClient -from temporalio.contrib.workflow_streams._stream import WorkflowStream +from temporalio.contrib.workflow_streams._stream import ( + PUBLISH_SIGNAL_NAME, + WorkflowStream, +) from temporalio.contrib.workflow_streams._topic_handle import ( TopicHandle, WorkflowTopicHandle, @@ -29,6 +32,7 @@ ) __all__ = [ + "PUBLISH_SIGNAL_NAME", "PollInput", "PollResult", "PublishEntry", diff --git a/temporalio/contrib/workflow_streams/_client.py b/temporalio/contrib/workflow_streams/_client.py index 605bf3f03..5c458bdab 100644 --- a/temporalio/contrib/workflow_streams/_client.py +++ b/temporalio/contrib/workflow_streams/_client.py @@ -325,6 +325,20 @@ def topic( self._topic_types[name] = bound return TopicHandle(self, name, bound) + @property + def handle(self) -> WorkflowHandle[Any, Any]: + """The workflow handle this client publishes to and polls. + + Re-targeted when :py:meth:`subscribe` follows a continue-as-new, so + read it when needed rather than caching it. + """ + return self._handle + + @property + def payload_converter(self) -> PayloadConverter: + """The sync payload converter used for per-item encode and decode.""" + return self._payload_converter() + async def flush(self) -> None: """Flush buffered (and pending) items and wait for server confirmation. diff --git a/temporalio/contrib/workflow_streams/_stream.py b/temporalio/contrib/workflow_streams/_stream.py index ae8608c3b..ff0865c29 100644 --- a/temporalio/contrib/workflow_streams/_stream.py +++ b/temporalio/contrib/workflow_streams/_stream.py @@ -50,7 +50,14 @@ _WorkflowStreamWireItem, ) -_PUBLISH_SIGNAL = "__temporal_workflow_stream_publish" +PUBLISH_SIGNAL_NAME = "__temporal_workflow_stream_publish" +"""The signal :class:`WorkflowStream` registers for external publishes. + +Public so code that sends the signal itself, with its own publisher identity, +does not have to copy the name. +""" + +_PUBLISH_SIGNAL = PUBLISH_SIGNAL_NAME _POLL_UPDATE = "__temporal_workflow_stream_poll" _OFFSET_QUERY = "__temporal_workflow_stream_offset" @@ -234,6 +241,25 @@ def topic( self._topic_types[name] = bound return WorkflowTopicHandle(self, name, bound) + @property + def next_offset(self) -> int: + """The global offset the next published item will receive.""" + return self._base_offset + len(self._log) + + def items_from(self, offset: int) -> list[tuple[int, str, Payload]]: + """Return ``(offset, topic, payload)`` for every item at or past ``offset``. + + Reads the log in place, so it is safe to call from a + :func:`temporalio.workflow.wait_condition` predicate. An ``offset`` + below the truncation base starts at the base instead; the offsets in + the result say where the items actually sit. + """ + start = max(offset, self._base_offset) - self._base_offset + return [ + (self._base_offset + index, item.topic, item.data) + for index, item in enumerate(self._log[start:], start) + ] + def get_state( self, *, publisher_ttl: timedelta = timedelta(seconds=900) ) -> WorkflowStreamState: From 6cb1c43a005ab43d6ff602c37d9c641d98db48e7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 240/831] Keyed the Workflow Streams runtime by workflow instance, not run id. The SDK rebuilds an evicted workflow from history as a new object. A process map keyed by run id handed that object the previous instance's log, with no handlers registered on the new one and the records of a failed task still inside. The stream is now found through the handler the shipped class registers on the instance, and the provider reads the contrib module only through its public surface. --- .../streams/providers/workflow_streams.py | 121 ++++++++---------- 1 file changed, 54 insertions(+), 67 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 656056381..8155f7e9d 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -36,6 +36,7 @@ from temporalio.client import Client from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( + PUBLISH_SIGNAL_NAME, PublishEntry, PublishInput, WorkflowStream, @@ -48,77 +49,63 @@ from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord -_RUN_ATTR = "__temporal_streams_ws_runtime" _TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" class _Runtime: - """Per-run holder for the shipped stream object. + """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed - from a method named ``__init__``, and the provider builds it lazily on - the first read or write of a run. + from a method named ``__init__``. """ - def __init__(self) -> None: - self.stream = WorkflowStream() - # The poll Update stops answering once the workflow is closing, and a - # reader between polls at that moment would lose what the final task - # published. The log is workflow state, so a Query still serves it - # after completion. - workflow.set_query_handler(_TAIL_QUERY, self._tail) + def __init__(self, stream: WorkflowStream | None = None) -> None: + self.stream = WorkflowStream() if stream is None else stream + if workflow.get_query_handler(_TAIL_QUERY) is None: + # The poll Update stops answering once the workflow is closing, + # and a reader between polls at that moment would lose what the + # final task published. The log is workflow state, so a Query + # still serves it after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) def _tail(self, from_offset: int) -> list[dict[str, Any]]: - base = self.stream._base_offset return [ { - "offset": base + index, - "topic": item.topic, - "data": base64.b64encode(item.data.data).decode("ascii"), + "offset": offset, + "topic": topic, + "data": base64.b64encode(payload.data).decode("ascii"), } - for index, item in enumerate(self.stream._log) - if base + index >= from_offset + for offset, topic, payload in self.stream.items_from(from_offset) ] -# Held per run rather than on the workflow instance, because the provider is -# asked to install its handlers from the workflow's constructor, and the -# instance is not registered with the runtime yet at that point. -_runtimes: dict[str, _Runtime] = {} +def _registered_stream() -> WorkflowStream | None: + handler = workflow.get_signal_handler(PUBLISH_SIGNAL_NAME) + if handler is None: + return None + stream = getattr(handler, "__self__", None) + if not isinstance(stream, WorkflowStream): + raise RuntimeError( + f"the {PUBLISH_SIGNAL_NAME!r} signal on this workflow is handled by " + "something other than a WorkflowStream, so the workflow_streams " + "provider cannot share its log" + ) + return stream def _runtime() -> _Runtime: - key = workflow.info().run_id - runtime = _runtimes.get(key) - if runtime is None: - runtime = _Runtime() - _runtimes[key] = runtime - return runtime - - -def drain() -> None: - """Release parked pollers so the workflow can return. - - An Option 0 stream dies with its workflow, and a parked long-poll Update - would otherwise hold completion open. Call it right before the workflow - returns, the same obligation the shipped feature's ``detach_pollers`` - documents. A storage provider has no such step, which is one of the - differences the comparison table charges this transport with. - """ - runtime = _runtimes.pop(workflow.info().run_id, None) - if runtime is not None: - runtime.stream.detach_pollers() + # Found on the instance rather than in a process-level map keyed by run + # id: the SDK rebuilds an evicted workflow from history as a new object, + # and a map would hand that object the stale log with its unregistered + # handlers and the records of a task that failed. + stream = _registered_stream() + return _Runtime() if stream is None else _Runtime(stream) class _WSReadSource: - """Reads the signal-fed log the shipped feature keeps in workflow state. - - Reaches into the stream's private log rather than ``get_state()``, - because the snapshot copies the whole log per call and drops offsets, - and this runs inside ``workflow.wait_condition``. - """ + """Reads the signal-fed log the shipped feature keeps in workflow state.""" def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: self._stream = stream @@ -126,29 +113,21 @@ def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> No self._cursor = start self._closed = False - def _end(self) -> int: - return self._stream._base_offset + len(self._stream._log) - async def next_batch(self) -> list[tuple[Cursor, bytes]]: while True: if self._closed: raise StopAsyncIteration - base = self._stream._base_offset - if self._cursor < base: - # Truncated below the cursor; resume at what remains. - self._cursor = base await workflow.wait_condition( - lambda: self._closed or self._end() > self._cursor + lambda: self._closed or self._stream.next_offset > self._cursor ) if self._closed: raise StopAsyncIteration - batch: list[tuple[Cursor, bytes]] = [] - end = self._end() - for offset in range(self._cursor, end): - item = self._stream._log[offset - self._stream._base_offset] - if item.topic == self._shipped_topic: - batch.append((Cursor(str(offset)), item.data.data)) - self._cursor = end + batch = [ + (Cursor(str(offset)), payload.data) + for offset, topic, payload in self._stream.items_from(self._cursor) + if topic == self._shipped_topic + ] + self._cursor = self._stream.next_offset if batch: return batch @@ -254,7 +233,7 @@ def _entry(self, frame: bytes) -> PublishEntry: async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 await self._handle.signal( - _PUBLISH_SIGNAL, + PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, @@ -324,7 +303,7 @@ async def read( async def _tail(self, from_offset: int) -> list[dict[str, Any]]: try: - return await self._client._handle.query( + wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) except Exception: @@ -378,7 +357,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._payload_converter() + converter = self._client.payload_converter if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] @@ -413,8 +392,16 @@ def prepare(self) -> None: _runtime() def drain(self) -> None: - """Release parked pollers so the workflow can return.""" - drain() + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll + Update would otherwise hold completion open. Call it right before + the workflow returns, the same obligation the shipped feature's + ``detach_pollers`` documents. + """ + stream = _registered_stream() + if stream is not None: + stream.detach_pollers() def open_read( self, From 943e574dd09e5c4db0ed3c136971e544dd0be062 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 241/831] Committed producer sequences only after the publish signal was accepted. A retry after an ambiguous failure used to carry fresh sequences, so the shipped dedupe let the same batch land twice. The batch now stays pending under its signal sequence until the server accepts it, and goes out first if the caller moves on. append returns None because this transport learns positions at read time. --- .../streams/providers/workflow_streams.py | 100 +++++++++++------- 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 8155f7e9d..fb685fc2c 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -42,8 +42,7 @@ WorkflowStream, WorkflowStreamClient, ) -from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL -from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -147,6 +146,11 @@ async def publish(self, frame: bytes) -> None: self._handle.publish(payload) +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + class WorkflowStreamsProducer: """Appends by sending the shipped publish Signal directly. @@ -154,6 +158,12 @@ class WorkflowStreamsProducer: owns the publisher identity: it must be ``producer#attempt`` for the shipped dedupe to drop a retry and pass a new generation, and the client would use its own random id. + + Sequences are committed only after the server accepted the Signal. A + batch whose Signal raised stays pending and goes out again under the + same signal sequence, either when the caller retries the same values or + ahead of whatever the caller sends next, so an ambiguous failure writes + the batch once and loses nothing. """ def __init__( @@ -174,10 +184,7 @@ def __init__( self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 - - @property - def _frame_topic(self) -> str: - return self._stream or self._topic + self._pending: tuple[list[PublishEntry], int] | None = None @property def _shipped_topic(self) -> str: @@ -196,50 +203,67 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append ``values`` through the shipped publish Signal.""" + async def append(self, *values: Any) -> None: + """Append ``values`` through the shipped publish Signal. + + Always ``None``: this transport learns positions at read time. + """ + if not values: + return None + await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + return None + + async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" + await self._send([(RecordKind.FINISH, b"")]) + + def _frames( + self, bodies: list[tuple[RecordKind, bytes]] + ) -> tuple[list[PublishEntry], int]: + sequence = self._sequence entries = [] - for value in values: + for kind, body in bodies: frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.DATA, + topic=self._topic, + kind=kind, producer=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=sequence, + body=body, ) - self._sequence += 1 - entries.append(self._entry(frame)) - await self._send(entries) - return Cursor("") - - async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._send([self._entry(frame)]) - - def _entry(self, frame: bytes) -> PublishEntry: - payload = Payload(data=frame) - return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) - - async def _send(self, entries: list[PublishEntry]) -> None: - self._signal_sequence += 1 + sequence += 1 + entries.append( + PublishEntry( + topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) + ) + ) + return entries, sequence + + async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: + entries, next_sequence = self._frames(bodies) + if self._pending is not None and self._pending[0] != entries: + # The caller moved on from a batch whose Signal raised. It goes + # first, under the signal sequence it already had, so a copy the + # server did accept is dropped and one it never saw lands. The + # new batch is then renumbered behind it. + await self._signal(*self._pending) + entries, next_sequence = self._frames(bodies) + await self._signal(entries, next_sequence) + + async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: + signal_sequence = self._signal_sequence + 1 + self._pending = (entries, next_sequence) await self._handle.signal( PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, - sequence=self._signal_sequence, + sequence=signal_sequence, ), ) + self._signal_sequence = signal_sequence + self._sequence = next_sequence + self._pending = None def _encode(self, value: Any) -> bytes: payload = ( From 5fb740052132efd144675237a4d59f881f349edc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 242/831] Adapted the Workflow Streams provider to the interface changes. Inbound frames carry no topic and a topic filter on an inbound stream is rejected through the shared check; producer identity comes resolved from the package; an unreadable frame is skipped with a warning; read is declared as the generator it is. --- .../streams/providers/workflow_streams.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index fb685fc2c..ef2a88312 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -27,7 +27,8 @@ from __future__ import annotations import base64 -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any @@ -52,6 +53,8 @@ _IN = "in:" _OUT = "out:" +logger = logging.getLogger(__name__) + class _Runtime: """A view over the shipped stream object of the running workflow instance. @@ -280,12 +283,13 @@ class WorkflowStreamsConsumer: def __init__( self, stream_client: WorkflowStreamClient, - shipped_topic: str | None, + stream: str, poll_cooldown: timedelta, ) -> None: """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client - self._shipped_topic = shipped_topic + self._stream = stream + self._shipped_topic = f"{_IN}{stream}" if stream else None self._poll_cooldown = poll_cooldown async def read( @@ -294,8 +298,9 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -351,7 +356,9 @@ def _record( cursor = Cursor(str(offset)) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) return [] if topic is not None and frame_topic != topic: return [] @@ -456,11 +463,6 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return WorkflowStreamsProducer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, @@ -475,7 +477,7 @@ async def consumer( ) -> WorkflowStreamsConsumer: return WorkflowStreamsConsumer( WorkflowStreamClient.create(client, workflow_id), - f"{_IN}{stream}" if stream else None, + stream, self._poll_cooldown, ) From e16a0af7d0a7c75db1f7f681e7226e012750f138 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 243/831] Narrowed the tail query's error handling and filtered owner reads by topic. Only a missing handler or a vanished history means there is no tail to serve; anything else, such as a query timeout with no worker polling, is now an error rather than a silent empty stream. An owner-stream read with a topic subscribes to that shipped topic alone instead of dropping inbound items client-side. --- .../streams/providers/workflow_streams.py | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index ef2a88312..049fd60e9 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -20,8 +20,16 @@ - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns an empty cursor. The Signal transport learns positions - at read time; that is this provider's stated deviation. +- ``append`` returns ``None``. The Signal transport learns positions at read + time, so a caller that wants to follow from now asks ``Consumer.latest``. +- The workflow-side stream object belongs to the workflow instance, found + through the handler the shipped class registers on it. An evicted and + rebuilt workflow gets its own, so a task that failed leaks nothing into + the next attempt's log and a replayed run does not see records twice. +- An owner-stream read with a topic subscribes to that shipped topic alone. + Without one it has to take every shipped topic and drop the inbound + items client-side, which spends the poll response cap on records the + reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -34,7 +42,7 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowQueryFailedError from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -303,42 +311,63 @@ async def read( _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 + if self._shipped_topic is not None: + shipped = [self._shipped_topic] + elif topic is not None: + shipped = [f"{_OUT}{topic}"] + else: + shipped = None subscription = self._client.subscribe( - self._shipped_topic, + shipped, from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) - async for item in subscription: - next_offset = item.offset + 1 - record = self._record( - attempts, item.offset, item.topic, item.data.payload.data, topic, type - ) - for out in record: - yield out + try: + async for item in subscription: + next_offset = item.offset + 1 + for out in self._record( + attempts, + item.offset, + item.topic, + item.data.payload.data, + topic, + type, + ): + yield out + finally: + # Lets go of the parked poll when the caller stops early. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() # The subscription ends when the workflow is closing or closed. What # landed after the last poll is still in workflow state, so the tail # comes back by Query rather than being lost with the run. - for wire in await self._tail(next_offset): + for offset, shipped_topic, frame in await self._tail(next_offset): for out in self._record( - attempts, - wire["offset"], - wire["topic"], - base64.b64decode(wire["data"]), - topic, - type, + attempts, offset, shipped_topic, frame, topic, type ): yield out - async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: try: wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) - except Exception: - # A workflow that never opened a stream has no handler to ask, and - # one whose History is gone has nothing left to serve. + except WorkflowQueryFailedError as error: + if "expected but not found" not in str(error): + raise + # The workflow never opened a stream through this provider, so + # there is no tail to serve. return [] + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The History is gone; nothing is left to serve. + return [] + return [ + (item["offset"], item["topic"], base64.b64decode(item["data"])) + for item in wire + ] def _record( self, From 252f64f72f4605496bbefd09a81be76efc555212 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 244/831] Ran the Workflow Streams provider tests on the test environment's server. The tests take the shared client fixture instead of an opt-in live gate, the loop workflow calls the portable lifecycle hooks, and new cases cover a cold workflow cache, the tail of a closed run, and the resend of a batch whose signal failed. --- .../streams/test_workflow_streams_provider.py | 227 +++++++++++++----- 1 file changed, 166 insertions(+), 61 deletions(-) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612aaa33d..612e99e02 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -1,44 +1,46 @@ -"""Live conformance for the workflow_streams provider. +"""Conformance for the workflow_streams provider on the test environment's server. -Runs the interface loop over the shipped Option 0 transport against a real -server: an outside producer appends through the publish Signal, the workflow -reads and republishes through its own state, and an outside consumer follows -the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it -needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +Runs the interface loop over the shipped Option 0 transport: an outside +producer appends through the publish Signal, the workflow reads and +republishes through its own state, and an outside consumer follows the poll +Update while the run is open and the tail Query once it has closed. """ from __future__ import annotations import asyncio -import os +import base64 import uuid from typing import Any import pytest from temporalio import streams, workflow +from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams.providers.workflow_streams import drain -from temporalio.worker import Worker +from temporalio.contrib.workflow_streams import PublishInput +from temporalio.converter import DataConverter +from temporalio.streams import RecordKind, _frame +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from tests.helpers import new_worker -pytestmark = pytest.mark.skipif( - os.environ.get("STREAMS_LIVE") != "workflow_streams", - reason="needs a live server; run with STREAMS_LIVE=workflow_streams", -) + +@pytest.fixture(autouse=True) +def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] + streams.configure(provider="workflow_streams") @workflow.defn class EchoLoop: """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. - Lingers until released, because an Option 0 stream dies with its - workflow: a reader that arrives after close finds nothing, which is the - transport limit the doc states rather than a defect to fix here. + Lingers until released so a reader can follow it while it runs; whoever + arrives after it closed is served by the tail Query instead. """ def __init__(self) -> None: self._released = False + streams.prepare() @workflow.signal def release(self) -> None: @@ -54,11 +56,12 @@ async def run(self) -> int: break if record.kind is not RecordKind.DATA: continue + assert isinstance(record.value, dict) seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() await workflow.wait_condition(lambda: self._released) - drain() + streams.drain() await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -76,59 +79,40 @@ async def _collect() -> None: return out -async def test_interface_loop_over_workflow_streams(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - handle = await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" - ) +async def _feed(client: Client, workflow_id: str) -> None: + producer = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() - producer = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, + +ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] + + +async def test_interface_loop_over_workflow_streams(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await producer.append({"n": 1}, {"n": 2}) - await producer.append({"n": 3}) - await producer.finish() + await _feed(client, workflow_id) consumer = await streams.consumer(client, workflow_id=workflow_id) records = await take(consumer.read(type=dict), 4) - assert [r.kind for r in records] == [ - RecordKind.DATA, - RecordKind.DATA, - RecordKind.DATA, - RecordKind.FINISH, - ] + assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" +async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) first = await streams.producer( @@ -147,7 +131,7 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): producer_id="model", attempt=1, ) - await retry.append({"n": 1}) + assert await retry.append({"n": 1}) is None second = await streams.producer( client, workflow_id=workflow_id, @@ -163,5 +147,126 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): records = await take(consumer.read(type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED + assert isinstance(records[1].value, streams.Supersession) assert records[1].value.previous_attempt == 1 assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + # Inbound records carry no topic; the stream's name is the address. + assert all(r.topic == "" for r in records) + + await second.finish() + await handle.signal(EchoLoop.release) + await handle.result() + + +async def test_cold_cache_serves_each_record_once(client: Client): + # Every task rebuilds the workflow from history, so the stream object + # has to belong to the instance that is running: a stale one would carry + # the previous instance's log and hand out every record twice. + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + inbound = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + arrived = await take(inbound.read(type=dict), 4) + assert [r.kind for r in arrived] == ECHOED + assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + +async def test_a_closed_run_serves_its_tail_by_query(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + # Nothing polled while the run was open. The poll Update is gone with + # the run, so everything below arrives through the tail Query. + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + checkpoint = records[1].cursor + resumed = await streams.consumer(client, workflow_id=workflow_id) + again = await take(resumed.read(type=dict, after=checkpoint), 2) + assert [r.value["echo"] for r in again[:1]] == [3] + assert again[1].kind is RecordKind.FINISH + + +class _FlakyHandle: + """A workflow handle whose first Signal is accepted and then reported failed.""" + + def __init__(self) -> None: + self.sent: list[PublishInput] = [] + self._fail_next = True + + async def signal(self, name: str, arg: PublishInput) -> None: + del name + self.sent.append(arg) + if self._fail_next: + self._fail_next = False + raise ConnectionResetError( + "the server accepted the signal, the reply was lost" + ) + + +def _frames( + publish: PublishInput, +) -> list[tuple[RecordKind, str, str, int, int, bytes]]: + out = [] + for entry in publish.items: + payload = Payload() + payload.ParseFromString(base64.b64decode(entry.data)) + out.append(_frame.decode(payload.data)) + return out + + +def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: + return [ + (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + ] + + +def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: + return WorkflowStreamsProducer( + handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + ) + + +async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + # The retry carries the same signal sequence and the same frame sequence + # as the failed send, so the shipped dedupe drops the copy; the batch + # after it continues the numbering. + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + + +async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 2}, {"n": 3}) + await producer.finish() + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] + assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH From 6365155db7c673bef5321a4577b2d7bc7c4cb762 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:06:16 -0700 Subject: [PATCH 245/831] Rewrote the Workflow Streams provider on the plugin surface. Topics are the shipped topics of the same name, the record is the StreamRecord proto inside the item payload, and cursors name the run because a log is not carried across continue-as-new. --- .../streams/providers/workflow_streams.py | 684 +++++++++++------- 1 file changed, 409 insertions(+), 275 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 049fd60e9..6f18dce46 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -1,35 +1,33 @@ -"""The provider over today's Workflow Streams (Option 0). +"""The provider over the shipped Workflow Streams transport (Option 0). Speaks the shipped contrib feature's wire format, the ``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code -and existing Workflow Streams code interoperate on one stream, and old -histories replay. Records live in the owning workflow's History, which is -also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers) are transport properties and remain. Reads after -the workflow closes go through one Query this provider adds, which serves -the log from workflow state for as long as the History is retained, so a -reader between polls when the workflow completed still gets the tail. +and existing Workflow Streams code share one log, and old histories replay. +Records live in the owning workflow's History, which is also this provider's +limit: the shipped caps (payloads in History, the Signal cap, bounded +subscribers) are transport properties and remain. The mapping, in one place: -- An interface record's frame rides as the item's ``Payload`` data. -- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. A producer - appending onto the workflow's own topic ``t`` writes ``out:t`` as well, - which is what today's activities already do through the publish Signal. +- A topic is the shipped topic of the same name in the workflow's one log. + A record rides as the item's ``Payload``: its data is the serialized + ``StreamRecord`` proto and its encoding is ``binary/plain``. The shipped + code stores and returns that ``Payload`` untouched, so the body's own + encoding never meets the transport. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns ``None``. The Signal transport learns positions at read - time, so a caller that wants to follow from now asks ``Consumer.latest``. +- ``append()`` returns ``None``. The Signal transport learns positions at + read time, so a caller that wants to follow from now asks ``latest()``. +- A log belongs to one run and is not carried across continue-as-new, so a + cursor names the run as well as the offset. A handle without a run id + reads run after run: each log through the poll Update while its run is + open and through the tail Query once it has closed, then the successor's + from its first record. - The workflow-side stream object belongs to the workflow instance, found through the handler the shipped class registers on it. An evicted and rebuilt workflow gets its own, so a task that failed leaks nothing into the next attempt's log and a replayed run does not see records twice. -- An owner-stream read with a topic subscribes to that shipped topic alone. - Without one it has to take every shipped topic and drop the inbound - items client-side, which spends the poll response cap on records the - reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -40,9 +38,17 @@ from datetime import timedelta from typing import Any +from google.protobuf.message import DecodeError + from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client, WorkflowQueryFailedError +from temporalio.client import ( + Client, + WorkflowExecutionStatus, + WorkflowHandle, + WorkflowHistoryEventFilterType, + WorkflowQueryFailedError, +) from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -51,20 +57,80 @@ WorkflowStream, WorkflowStreamClient, ) +from temporalio.converter import PayloadConverter from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = [ + "WorkflowStreamsHandle", + "WorkflowStreamsProducer", + "WorkflowStreamsProvider", +] +_PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" -_IN = "in:" -_OUT = "out:" +_ENCODING = b"binary/plain" logger = logging.getLogger(__name__) -class _Runtime: +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") + + +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "workflow_streams provider" + ) from None + + +def _wrap(record: WireRecord) -> Payload: + return Payload(metadata={"encoding": _ENCODING}, data=record.SerializeToString()) + + +def _unwrap(cursor: Cursor, payload: Payload, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(payload.data) + except DecodeError as error: + # An item another publisher put on this topic, or a corrupt one: + # skip and say so, so one bad record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None + + +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + +class _InstanceStream: """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed @@ -85,7 +151,7 @@ def _tail(self, from_offset: int) -> list[dict[str, Any]]: { "offset": offset, "topic": topic, - "data": base64.b64encode(payload.data).decode("ascii"), + "data": base64.b64encode(payload.SerializeToString()).decode("ascii"), } for offset, topic, payload in self.stream.items_from(from_offset) ] @@ -105,39 +171,45 @@ def _registered_stream() -> WorkflowStream | None: return stream -def _runtime() -> _Runtime: +def _instance() -> _InstanceStream: # Found on the instance rather than in a process-level map keyed by run # id: the SDK rebuilds an evicted workflow from history as a new object, # and a map would hand that object the stale log with its unregistered # handlers and the records of a task that failed. stream = _registered_stream() - return _Runtime() if stream is None else _Runtime(stream) + return _InstanceStream() if stream is None else _InstanceStream(stream) class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state.""" - def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + def __init__( + self, stream: WorkflowStream, topic: str, start: int, run_id: str + ) -> None: self._stream = stream - self._shipped_topic = shipped_topic - self._cursor = start + self._topic = topic + self._offset = start + self._run_id = run_id self._closed = False - async def next_batch(self) -> list[tuple[Cursor, bytes]]: + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: while True: if self._closed: raise StopAsyncIteration await workflow.wait_condition( - lambda: self._closed or self._stream.next_offset > self._cursor + lambda: self._closed or self._stream.next_offset > self._offset ) if self._closed: raise StopAsyncIteration - batch = [ - (Cursor(str(offset)), payload.data) - for offset, topic, payload in self._stream.items_from(self._cursor) - if topic == self._shipped_topic - ] - self._cursor = self._stream.next_offset + batch: list[tuple[Cursor, WireRecord]] = [] + for offset, topic, payload in self._stream.items_from(self._offset): + if topic != self._topic: + continue + cursor = _cursor(self._run_id, offset) + wire = _unwrap(cursor, payload, workflow.logger.warning) + if wire is not None: + batch.append((cursor, wire)) + self._offset = self._stream.next_offset if batch: return batch @@ -146,20 +218,51 @@ def close(self) -> None: class _WSWriteSink: - def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: - self._handle = stream.topic(shipped_topic) + def __init__(self, stream: WorkflowStream, topic: str) -> None: + self._handle = stream.topic(topic) - async def publish(self, frame: bytes) -> None: + def publish(self, record: WireRecord) -> None: # Appending to workflow state commits with the task, and a poll # Update's result rides the same task completion, so a failed task # leaks nothing: rule 1 through the shipped mechanics. - payload = workflow.payload_converter().to_payloads([frame])[0] - self._handle.publish(payload) + self._handle.publish(_wrap(record)) -def _entry_data(payload: Payload) -> str: - # The documented wire form of PublishEntry.data. - return base64.b64encode(payload.SerializeToString()).decode("ascii") +class _WSWorkflowProvider: + """The workflow half: the shipped stream object of the running instance.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's log is its own" + ) + start = named[1] + 1 + return _WSReadSource(_instance().stream, topic, start, run_id) + + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _WSWriteSink(_instance().stream, topic) + + def on_workflow_start(self) -> None: + # Registered before the first task completes, because an outside + # reader can poll before workflow code has opened anything, and an + # Update with no handler yet is rejected rather than held. + _instance() + + async def on_workflow_finish(self) -> None: + # An Option 0 stream dies with its run, and a parked long-poll Update + # would otherwise hold completion open. Same recipe the shipped + # feature documents before a return or a continue-as-new. + stream = _registered_stream() + if stream is None: + return + stream.detach_pollers() + await workflow.wait_condition(workflow.all_handlers_finished) class WorkflowStreamsProducer: @@ -180,16 +283,14 @@ class WorkflowStreamsProducer: def __init__( self, handle: Any, - converter: Any, - stream: str, + converter: PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on ``handle``.""" + """Bind this producer to ``topic`` on the workflow behind ``handle``.""" self._handle = handle self._converter = converter - self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt @@ -198,8 +299,9 @@ def __init__( self._pending: tuple[list[PublishEntry], int] | None = None @property - def _shipped_topic(self) -> str: - return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -207,152 +309,258 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: + def _publisher_id(self) -> str: return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> None: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the shipped publish Signal. - Always ``None``: this transport learns positions at read time. + Always ``None``: this transport learns positions at read time, so a + caller that wants to follow from now asks + :meth:`WorkflowStreamsHandle.latest`. """ if not values: return None - await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + await self._send([(RecordKind.DATA, value) for value in values]) return None async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - await self._send([(RecordKind.FINISH, b"")]) + """Write ``FINISH`` for this producer on this topic.""" + await self._send([(RecordKind.FINISH, None)]) - def _frames( - self, bodies: list[tuple[RecordKind, bytes]] + def _entries( + self, batch: list[tuple[RecordKind, Any]] ) -> tuple[list[PublishEntry], int]: sequence = self._sequence entries = [] - for kind, body in bodies: - frame = _frame.encode( + for kind, value in batch: + wire = to_wire( + self._converter, topic=self._topic, kind=kind, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, sequence=sequence, - body=body, ) sequence += 1 entries.append( - PublishEntry( - topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) - ) + PublishEntry(topic=self._topic, data=_entry_data(_wrap(wire))) ) return entries, sequence - async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: - entries, next_sequence = self._frames(bodies) + async def _send(self, batch: list[tuple[RecordKind, Any]]) -> None: + entries, next_sequence = self._entries(batch) if self._pending is not None and self._pending[0] != entries: # The caller moved on from a batch whose Signal raised. It goes # first, under the signal sequence it already had, so a copy the # server did accept is dropped and one it never saw lands. The # new batch is then renumbered behind it. await self._signal(*self._pending) - entries, next_sequence = self._frames(bodies) + entries, next_sequence = self._entries(batch) await self._signal(entries, next_sequence) async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: signal_sequence = self._signal_sequence + 1 self._pending = (entries, next_sequence) - await self._handle.signal( - PUBLISH_SIGNAL_NAME, - PublishInput( - items=entries, - publisher_id=self._provider_id, - sequence=signal_sequence, - ), - ) + try: + await self._handle.signal( + PUBLISH_SIGNAL_NAME, + PublishInput( + items=entries, + publisher_id=self._publisher_id, + sequence=signal_sequence, + ), + ) + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._handle.id!r} was not found, so its stream " + "cannot be appended to" + ) from error + raise self._signal_sequence = signal_sequence self._sequence = next_sequence self._pending = None - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - return payload.SerializeToString() - -class WorkflowStreamsConsumer: - """Reads through the shipped long-poll Update, with shared supersession.""" +class WorkflowStreamsHandle: + """One workflow's log from outside, through the shipped poll Update and a tail Query.""" def __init__( self, - stream_client: WorkflowStreamClient, - stream: str, + client: Client, + workflow_id: str, + run_id: str | None, poll_cooldown: timedelta, ) -> None: - """Read what ``stream_client`` reaches, one long poll at a time.""" - self._client = stream_client - self._stream = stream - self._shipped_topic = f"{_IN}{stream}" if stream else None + """Address ``workflow_id``'s log, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id self._poll_cooldown = poll_cooldown + self._converter = client.data_converter.payload_converter - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, waiting for ones not written yet.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - next_offset = int(after.token) + 1 if after.token else 0 - if self._shipped_topic is not None: - shipped = [self._shipped_topic] - elif topic is not None: - shipped = [f"{_OUT}{topic}"] - else: - shipped = None - subscription = self._client.subscribe( - shipped, - from_offset=next_offset, - result_type=RawValue, - poll_cooldown=self._poll_cooldown, + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) + + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning ) - try: - async for item in subscription: - next_offset = item.offset + 1 - for out in self._record( - attempts, - item.offset, - item.topic, - item.data.payload.data, - topic, - type, - ): - yield out - finally: - # Lets go of the parked poll when the caller stops early. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - # The subscription ends when the workflow is closing or closed. What - # landed after the last poll is still in workflow state, so the tail - # comes back by Query rather than being lost with the run. - for offset, shipped_topic, frame in await self._tail(next_offset): - for out in self._record( - attempts, offset, shipped_topic, frame, topic, type + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + handle = self._handle(run_id) + next_offset = offset + # Pinned to one run, with no client for the shipped chain + # following: a log is not carried across continue-as-new, so + # the successor's offsets start over and this loop is what + # moves from one run to the next. + subscription = WorkflowStreamClient(handle).subscribe( + topic, + from_offset=offset, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + try: + async for item in subscription: + next_offset = item.offset + 1 + if item.topic != topic: + continue + for record in self._records( + decoder, run_id, item.offset, item.data.payload + ): + yield record + except RPCError as error: + # The run closed and its poll Update went with it, or the + # workflow does not exist; the describe below tells which. + if error.status != RPCStatusCode.NOT_FOUND: + raise + finally: + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() + status = await self._status(handle) + if status is None: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} run {run_id!r} was not found" + ) + if status == WorkflowExecutionStatus.RUNNING: + # The subscription ended early, on an RPC timeout for + # instance; the run is still open, so pick up where it left. + offset = next_offset + continue + # What landed after the last poll is still in workflow state, so + # the tail comes back by Query rather than being lost with the run. + for offset_, shipped_topic, payload in await self._tail( + handle, next_offset + ): + if shipped_topic != topic: + continue + for record in self._records(decoder, run_id, offset_, payload): + yield record + if ( + self._run_id is not None + or status != WorkflowExecutionStatus.CONTINUED_AS_NEW ): - yield out + return + successor = await self._successor(handle) + if successor is None: + return + run_id, offset = successor, 0 + + def _records( + self, decoder: RecordDecoder, run_id: str, offset: int, payload: Payload + ) -> list[StreamRecord[Any]]: + cursor = _cursor(run_id, offset) + wire = _unwrap(cursor, payload, logger.warning) + if wire is None: + return [] + return decoder.decode(cursor, wire) + + def _handle(self, run_id: str | None) -> WorkflowHandle[Any, Any]: + return self._client.get_workflow_handle(self._workflow_id, run_id=run_id) - async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: + async def _status( + self, handle: WorkflowHandle[Any, Any] + ) -> WorkflowExecutionStatus | None: try: - wire = await self._client.handle.query( - _TAIL_QUERY, from_offset, result_type=list - ) + return (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + return None + raise + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + try: + run_id = (await self._handle(None).describe()).run_id + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert run_id is not None + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + try: + async for event in self._handle(run_id).fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The run's History is gone: the chain's retained part starts here. + return None + + async def _successor(self, handle: WorkflowHandle[Any, Any]) -> str | None: + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + async for event in events: + if event.HasField("workflow_execution_continued_as_new_event_attributes"): + attributes = event.workflow_execution_continued_as_new_event_attributes + return attributes.new_execution_run_id or None + return None + + async def _tail( + self, handle: WorkflowHandle[Any, Any], from_offset: int + ) -> list[tuple[int, str, Payload]]: + try: + wire = await handle.query(_TAIL_QUERY, from_offset, result_type=list) except WorkflowQueryFailedError as error: if "expected but not found" not in str(error): raise @@ -365,150 +573,76 @@ async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: # The History is gone; nothing is left to serve. return [] return [ - (item["offset"], item["topic"], base64.b64decode(item["data"])) + ( + item["offset"], + item["topic"], + Payload.FromString(base64.b64decode(item["data"])), + ) for item in wire ] - def _record( - self, - attempts: AttemptTracker, - offset: int, - shipped_topic: str, - frame: bytes, - topic: str | None, - type: type | None, - ) -> list[StreamRecord[Any]]: - if self._shipped_topic is None and not shipped_topic.startswith(_OUT): - return [] - if self._shipped_topic is not None and shipped_topic != self._shipped_topic: - return [] - cursor = Cursor(str(offset)) + async def latest(self, *, topic: str) -> Cursor: + """The newest position in the log, which orders every topic of this workflow. + + The log is one per run, so the cursor names the run it was read from: + the pinned run, or the latest run of the chain. + """ + _require_topic(topic) + handle = self._handle(self._run_id) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning("skipping stream record at %s: %s", cursor, error) - return [] - if topic is not None and frame_topic != topic: - return [] - out: list[StreamRecord[Any]] = [] - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - out.append(superseded) - out.append( - StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + description = await handle.describe() + head = await WorkflowStreamClient(handle).get_offset() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + run_id = description.run_id + assert run_id is not None + if head > 0: + return _cursor(run_id, head - 1) + # An empty log on the chain's first run is the beginning of the + # stream; on a successor it is a position of its own, because + # BEGINNING would send a chain-following read back to the first run. + if await self._predecessor(run_id) is None: + return BEGINNING + return _cursor(run_id, -1) + + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> WorkflowStreamsProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return WorkflowStreamsProducer( + self._handle(self._run_id), self._converter, topic, producer_id, attempt ) - return out - - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one log per workflow, whatever the topic - head = await self._client.get_offset() - return Cursor(str(head - 1)) if head > 0 else BEGINNING - - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - converter = self._client.payload_converter - if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] - - -class _WorkflowStreamsProvider: - name = "workflow_streams" - - def __init__(self) -> None: - self._poll_cooldown = timedelta(milliseconds=100) - - def configure(self, **options: Any) -> None: - cooldown = options.pop("poll_cooldown", None) - if cooldown is not None: - self._poll_cooldown = cooldown - if options: - raise TypeError( - "the workflow_streams provider takes only poll_cooldown, " - f"got {sorted(options)}" - ) - - def worker_options(self) -> dict[str, Any]: - return {} - def prepare(self) -> None: - """Register the shipped publish signal and poll update handlers. - Done here rather than on the first read, because an outside reader - can poll before workflow code has opened anything, and an update with - no handler yet is rejected rather than held. - """ - _runtime() +class WorkflowStreamsProvider(ProviderPlugin): + """The provider over the shipped Workflow Streams transport.""" - def drain(self) -> None: - """Release parked pollers so the workflow can return. + def __init__( + self, *, poll_cooldown: timedelta = timedelta(milliseconds=100) + ) -> None: + """Create the provider. - An Option 0 stream dies with its workflow, and a parked long-poll - Update would otherwise hold completion open. Call it right before - the workflow returns, the same obligation the shipped feature's - ``detach_pollers`` documents. + Args: + poll_cooldown: How long an outside reader that is caught up waits + between polls. Backlogs drain at full speed regardless. """ - stream = _registered_stream() - if stream is not None: - stream.detach_pollers() - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Ignored: a publish Signal is a workflow event, so the wait below - # wakes on delivery and nothing is held between records. - del idle_timeout - return _WSReadSource( - _runtime().stream, - f"{_IN}{stream}", - int(after.token) + 1 if after.token else 0, - ) - - def open_write(self, topic: str) -> WriteSink: - return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> WorkflowStreamsProducer: - return WorkflowStreamsProducer( - client.get_workflow_handle(workflow_id), - client.data_converter.payload_converter, - stream, - topic, - producer_id, - attempt, - ) + self._poll_cooldown = poll_cooldown - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> WorkflowStreamsConsumer: - return WorkflowStreamsConsumer( - WorkflowStreamClient.create(client, workflow_id), - stream, - self._poll_cooldown, - ) + def workflow_provider(self) -> _WSWorkflowProvider: + """The workflow half, over the running instance's shipped stream object.""" + return _WSWorkflowProvider() + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> WorkflowStreamsHandle: + """A handle on ``workflow_id``'s log; without ``run_id`` it follows the chain.""" + return WorkflowStreamsHandle(client, workflow_id, run_id, self._poll_cooldown) -_provider.register("workflow_streams", _WorkflowStreamsProvider) + async def close(self) -> None: + """Nothing to release: the provider holds no connection of its own.""" From a5d0fc59037209d5d3727f4153629305c25fbb47 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:06:16 -0700 Subject: [PATCH 246/831] Ran the conformance suite over Workflow Streams and covered chain reads. The provider registers in SETUPS with a host workflow that owns the stream, and its own tests cover the tail Query, a read that ends, and a handle that follows continue-as-new run by run. --- CHANGELOG.md | 10 +- tests/streams/test_streams_conformance.py | 49 +++- .../streams/test_workflow_streams_provider.py | 239 +++++++++++------- 3 files changed, 205 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee4f256cd..5a2eca55e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,10 +29,12 @@ to include examples, links to docs, or any other relevant information. the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. -- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the - stream interface over the shipped Workflow Streams transport, so a workflow - reads and publishes through `temporalio.contrib.workflow_streams` without - naming it. +- **Experimental**: `temporalio.streams.providers.workflow_streams.WorkflowStreamsProvider` + serves the stream interface over the shipped Workflow Streams transport as a + worker plugin, so a workflow reads and publishes through + `temporalio.contrib.workflow_streams` without naming it. Records are the + `StreamRecord` proto inside the shipped item payload, and a handle without a + run id follows continue-as-new run by run. ### Changed diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 451fe4391..4f1673a3f 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -24,12 +24,14 @@ import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass +from datetime import timedelta from typing import Any, cast import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -45,6 +47,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider +from tests.helpers import new_worker @dataclass @@ -78,8 +82,49 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: + # No STREAMS_LIVE gate: the store is the workflow's own History, which the + # test environment's server provides. + provider = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase( + "workflow_streams", + provider, + client, + reports_positions=False, + host=host, + ) + for handle in hosts.values(): + await handle.terminate() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { - "memory": _memory_case + "memory": _memory_case, + "workflow_streams": _workflow_streams_case, } _CAPABILITIES = { diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612e99e02..28f2f631d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -2,8 +2,10 @@ Runs the interface loop over the shipped Option 0 transport: an outside producer appends through the publish Signal, the workflow reads and -republishes through its own state, and an outside consumer follows the poll -Update while the run is open and the tail Query once it has closed. +republishes through its own state, and an outside reader follows the poll +Update while the run is open and the tail Query once it has closed. The +outside-surface cases shared by every provider run from +``test_streams_conformance``; this file covers what the transport adds. """ from __future__ import annotations @@ -11,23 +13,31 @@ import asyncio import base64 import uuid +from datetime import timedelta from typing import Any import pytest -from temporalio import streams, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.contrib.workflow_streams import PublishInput from temporalio.converter import DataConverter -from temporalio.streams import RecordKind, _frame -from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from temporalio.streams import RecordKind, Supersession +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers.workflow_streams import ( + WorkflowStreamsProducer, + WorkflowStreamsProvider, +) from tests.helpers import new_worker +INPUTS = "inputs" +DECISIONS = "decisions" -@pytest.fixture(autouse=True) -def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] - streams.configure(provider="workflow_streams") + +@pytest.fixture +def provider() -> WorkflowStreamsProvider: + return WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) @workflow.defn @@ -40,7 +50,6 @@ class EchoLoop: def __init__(self) -> None: self._released = False - streams.prepare() @workflow.signal def release(self) -> None: @@ -48,21 +57,19 @@ def release(self) -> None: @workflow.run async def run(self) -> int: - inputs = streams.reader("inputs", type=dict) - decisions = streams.writer("decisions") + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) seen = 0 async for record in inputs: if record.kind is RecordKind.FINISH: break if record.kind is not RecordKind.DATA: continue - assert isinstance(record.value, dict) + assert record.value is not None seen += 1 - await decisions.publish({"echo": record.value["n"]}) - await decisions.finish() + decisions.publish({"echo": record.value["n"]}) + decisions.finish() await workflow.wait_condition(lambda: self._released) - streams.drain() - await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -79,10 +86,11 @@ async def _collect() -> None: return out -async def _feed(client: Client, workflow_id: str) -> None: - producer = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 - ) +async def _feed( + provider: WorkflowStreamsProvider, client: Client, workflow_id: str +) -> None: + stream = provider.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() @@ -91,92 +99,77 @@ async def _feed(client: Client, workflow_id: str) -> None: ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] -async def test_interface_loop_over_workflow_streams(client: Client): +async def test_interface_loop_over_workflow_streams( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + assert all(r.topic == DECISIONS and r.producer_id == "" for r in records) await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): +async def test_retried_producer_dedupes_and_new_attempt_supersedes( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) + stream = provider.get_stream_handle(client, workflow_id) - first = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - await first.append({"n": 1}) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # Positions are learnt at read time on this transport. + assert await first.append({"n": 1}) is None # The retry of the same attempt re-sends its first batch. - retry = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - assert await retry.append({"n": 1}) is None - second = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=2, - ) + retry = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await retry.append({"n": 1}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"n": 2}) - consumer = await streams.consumer( - client, workflow_id=workflow_id, stream="inputs" - ) - records = await take(consumer.read(type=dict), 3) + records = await take(stream.read(topic=INPUTS, result_type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED - assert isinstance(records[1].value, streams.Supersession) - assert records[1].value.previous_attempt == 1 + assert records[1].supersession == Supersession("model", 1, 2) assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 - # Inbound records carry no topic; the stream's name is the address. - assert all(r.topic == "" for r in records) + assert all(r.topic == INPUTS for r in records) await second.finish() await handle.signal(EchoLoop.release) await handle.result() -async def test_cold_cache_serves_each_record_once(client: Client): +async def test_cold_cache_serves_each_record_once( + client: Client, provider: WorkflowStreamsProvider +): # Every task rebuilds the workflow from history, so the stream object # has to belong to the instance that is running: a stale one would carry # the previous instance's log and hand out every record twice. workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + async with new_worker( + client, EchoLoop, plugins=[provider], max_cached_workflows=0 + ) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - inbound = await streams.consumer( - client, workflow_id=workflow_id, stream="inputs" - ) - arrived = await take(inbound.read(type=dict), 4) + arrived = await take(stream.read(topic=INPUTS, result_type=dict), 4) assert [r.kind for r in arrived] == ECHOED assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] @@ -184,33 +177,106 @@ async def test_cold_cache_serves_each_record_once(client: Client): assert await handle.result() == 3 -async def test_a_closed_run_serves_its_tail_by_query(client: Client): +async def test_a_closed_run_serves_its_tail_by_query_and_the_read_ends( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) await handle.signal(EchoLoop.release) assert await handle.result() == 3 # Nothing polled while the run was open. The poll Update is gone with - # the run, so everything below arrives through the tail Query. - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + # the run, so everything below arrives through the tail Query, and + # the read ends by itself once the tail is delivered. + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + + records = await asyncio.wait_for(read_everything(), 30) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] checkpoint = records[1].cursor - resumed = await streams.consumer(client, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2 + ) assert [r.value["echo"] for r in again[:1]] == [3] assert again[1].kind is RecordKind.FINISH +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[provider]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + first_run = handle.first_execution_run_id + assert first_run is not None + + chain = provider.get_stream_handle(client, workflow_id) + + async def read_everything(stream: Any) -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + # Each run keeps its own log, so following the chain means reading + # the first run to its close and then the successor from its start. + assert await asyncio.wait_for(read_everything(chain), 30) == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + pinned = provider.get_stream_handle(client, workflow_id, run_id=first_run) + assert await asyncio.wait_for(read_everything(pinned), 30) == [ + (RecordKind.DATA, {"run": 0}), + ] + # A cursor from the first run resumes into the successor. + records = await take(chain.read(topic=DECISIONS, result_type=dict), 1) + resumed = await asyncio.wait_for( + asyncio.ensure_future( + _values( + chain.read( + topic=DECISIONS, result_type=dict, after=records[0].cursor + ) + ) + ), + 30, + ) + assert resumed == [{"run": 1}, None] + + +async def _values(records: Any) -> list[Any]: + return [r.value async for r in records] + + class _FlakyHandle: """A workflow handle whose first Signal is accepted and then reported failed.""" + id = "flaky" + def __init__(self) -> None: self.sent: list[PublishInput] = [] self._fail_next = True @@ -225,26 +291,24 @@ async def signal(self, name: str, arg: PublishInput) -> None: ) -def _frames( - publish: PublishInput, -) -> list[tuple[RecordKind, str, str, int, int, bytes]]: +def _wires(publish: PublishInput) -> list[WireRecord]: out = [] for entry in publish.items: - payload = Payload() - payload.ParseFromString(base64.b64decode(entry.data)) - out.append(_frame.decode(payload.data)) + payload = Payload.FromString(base64.b64decode(entry.data)) + out.append(WireRecord.FromString(payload.data)) return out def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: return [ - (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + (publish.sequence, [wire.sequence for wire in _wires(publish)]) + for publish in sent ] def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: return WorkflowStreamsProducer( - handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + handle, DataConverter.default.payload_converter, INPUTS, "model", 1 ) @@ -255,10 +319,11 @@ async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): await producer.append({"n": 1}) await producer.append({"n": 1}) await producer.append({"n": 2}) - # The retry carries the same signal sequence and the same frame sequence - # as the failed send, so the shipped dedupe drops the copy; the batch - # after it continues the numbering. + # The retry carries the same signal sequence and the same record + # sequence as the failed send, so the shipped dedupe drops the copy; the + # batch after it continues the numbering. assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + assert all(publish.publisher_id == "model#1" for publish in handle.sent) async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): @@ -269,4 +334,4 @@ async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): await producer.append({"n": 2}, {"n": 3}) await producer.finish() assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] - assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH + assert _wires(handle.sent[-1])[0].kind == int(RecordKind.FINISH) From ca393799ce9c622dfb691fb06a0c905a118a3b9c Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 247/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a2eca55e..ad45c0bbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,10 @@ to include examples, links to docs, or any other relevant information. `temporalio.contrib.workflow_streams` without naming it. Records are the `StreamRecord` proto inside the shipped item payload, and a handle without a run id follows continue-as-new run by run. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 5751423f5c846b8521160e8674136eb41d4e678b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 248/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 72ca038637fbed45771931d26bf3f6060010c126 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 249/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From 2e955ce4c9157da09ca50cfd7bef3c932e559f45 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 250/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From b721ede629e7c0292679a2be8c6a3231472fbdba Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 251/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad45c0bbd..d9709fa3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From bbcad9a62bb5c1b3aee33f394972a8348a340987 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 252/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From 4a661ea657f79c15f2dbbcf6a7fcd21f4c461e8b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:26:33 -0700 Subject: [PATCH 253/831] Added the IDL contract and generation for the stream endpoint. The stream endpoint's shape lived only in hand-written Python, so no other language could be given the contract. This defines it once in a nexusrpc yaml contract and generates the Python bindings from it. The generated _definitions helper is hidden from the API docs and skipped by pydocstyle, the same way the other generated trees are. --- pyproject.toml | 6 +- scripts/gen_streams_nexus_api.py | 80 +++ .../providers/_nexus_generated/__init__.py | 23 + .../_nexus_generated/_definitions.py | 542 ++++++++++++++ .../providers/_nexus_generated/models.py | 670 ++++++++++++++++++ .../providers/_nexus_generated/services.py | 39 + .../providers/temporal_streams.nexusrpc.yaml | 123 ++++ 7 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 scripts/gen_streams_nexus_api.py create mode 100644 temporalio/streams/providers/_nexus_generated/__init__.py create mode 100644 temporalio/streams/providers/_nexus_generated/_definitions.py create mode 100644 temporalio/streams/providers/_nexus_generated/models.py create mode 100644 temporalio/streams/providers/_nexus_generated/services.py create mode 100644 temporalio/streams/providers/temporal_streams.nexusrpc.yaml diff --git a/pyproject.toml b/pyproject.toml index b7077785f..e55c39219 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,9 +125,11 @@ format = [ ] gen-docs = "uv run scripts/gen_docs.py" gen-nexus-system-api = "uv run scripts/gen_nexus_system_api.py" +gen-streams-nexus-api = "uv run scripts/gen_streams_nexus_api.py" gen-protos = [ { cmd = "uv run scripts/gen_protos.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -135,6 +137,7 @@ gen-protos = [ gen-protos-docker = [ { cmd = "uv run scripts/gen_protos_docker.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -207,7 +210,7 @@ ignore_errors = true [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 -match_dir = "^(?!(docs|scripts|tests|api|proto|system|\\.)).*" +match_dir = "^(?!(docs|scripts|tests|api|proto|system|_nexus_generated|\\.)).*" add_ignore = [ # We like to wrap at a certain number of chars, even long summary sentences. # https://github.com/PyCQA/pydocstyle/issues/184 @@ -241,6 +244,7 @@ privacy = [ "HIDDEN:temporalio.worker.workflow_sandbox.importer", "HIDDEN:temporalio.worker.workflow_sandbox.in_sandbox", "HIDDEN:**.*_pb2*", + "HIDDEN:temporalio.streams.providers._nexus_generated._definitions", ] project-name = "Temporal Python" sidebar-expand-depth = 2 diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py new file mode 100644 index 000000000..800aba944 --- /dev/null +++ b/scripts/gen_streams_nexus_api.py @@ -0,0 +1,80 @@ +import os +import shutil +import subprocess +import sys +from pathlib import Path + +base_dir = Path(__file__).parent.parent +providers_dir = base_dir / "temporalio" / "streams" / "providers" +contract_path = providers_dir / "temporal_streams.nexusrpc.yaml" +output_dir = providers_dir / "_nexus_generated" +# Pinned to the version CI installs, because nexgen's output changes between +# releases and check-protos compares against what is committed here. +NEX_GEN_VERSION = "0.2.4" + + +def nex_gen_command() -> list[str]: + if bin_path := os.environ.get("NEX_GEN_BIN"): + return [bin_path] + + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + # Same build as the system API script installs, so one binary + # serves both and neither can overwrite the other's output. + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] + + +def generate_streams_nexus_api() -> None: + if not contract_path.exists(): + raise RuntimeError(f"missing stream contract: {contract_path}") + + command = nex_gen_command() + shutil.rmtree(output_dir, ignore_errors=True) + subprocess.check_call( + [ + *command, + "python", + str(contract_path), + "--output", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + "I", + "--fix", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "format", + str(output_dir), + ] + ) + + +if __name__ == "__main__": + print("Generating stream endpoint Nexus API...", file=sys.stderr) + generate_streams_nexus_api() + print("Done", file=sys.stderr) diff --git a/temporalio/streams/providers/_nexus_generated/__init__.py b/temporalio/streams/providers/_nexus_generated/__init__.py new file mode 100644 index 000000000..c62eaa6dd --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/__init__.py @@ -0,0 +1,23 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from ._definitions import Violation +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, +) +from .services import TemporalStreams + +__all__ = [ + "Violation", + "AppendInput", + "AppendOutput", + "ReadInput", + "ReadOutput", + "RecordWire", + "TemporalStreams", +] diff --git a/temporalio/streams/providers/_nexus_generated/_definitions.py b/temporalio/streams/providers/_nexus_generated/_definitions.py new file mode 100644 index 000000000..dc8de5bb5 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/_definitions.py @@ -0,0 +1,542 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import base64 +import collections.abc +import dataclasses +import datetime +import json +import re +import typing + +import temporalio.converter +import temporalio.exceptions + +__all__ = [ + "Violation", + "_binary64", + "_check_contains", + "_check_date_time", + "_check_duration", + "_check_time", + "_check_unique_items", + "_collect", + "_json_values_equal", + "_format_base64", + "_format_base64url", + "_format_date", + "_format_date_time", + "_format_duration", + "_format_time", + "_parse_base64", + "_parse_base64url", + "_parse_date", + "_parse_date_time", + "_parse_duration", + "_parse_spec_integer", + "_parse_time", + "_quote", + "_transfer_type_convertible", +] + + +@dataclasses.dataclass(frozen=True, slots=True) +class Violation: + """A single constraint failure, located by JSON path.""" + + path: str + reason: str + + +def _quote(value: object) -> str: + """Renders a value in the JSON form every target quotes offending values in.""" + + try: + return json.dumps(value, ensure_ascii=False) + except (TypeError, ValueError): + return repr(value) + + +def _collect( + violations: list[Violation], + path: str, + error: temporalio.exceptions.ApplicationError, +) -> None: + """Re-paths a nested model's violations under `path` and appends them.""" + + if error.type != "PayloadValidationError" or not error.details: + raise error + # Generated failures retain the original list as their first detail. The + # cast is type-checker-only and performs no serialization. + nested_violations = typing.cast(list[Violation], error.details[0]) + for inner in nested_violations: + # A nested violation about the value *itself* carries no path of its own + # (a union branch's own constraint, an element-level check), so the + # prefix is the whole path -- never a dangling separator (P11). + nested = f"{path}.{inner.path}" if inner.path else path + violations.append(Violation(path=nested, reason=inner.reason)) + + +_ModelT = typing.TypeVar("_ModelT") + + +def _transfer_type_convertible( + converter: type[temporalio.converter.TransferTypeConverter[typing.Any, typing.Any]], +) -> collections.abc.Callable[[type[_ModelT]], type[_ModelT]]: + """Registers a transfer type converter on a model class. + + Wraps `temporalio.converter.transfer_type_convertible` to erase the + converter's value-type parameter. Binding it directly on the decorated class + is circular for a static type checker -- the class's type depends on the + decorator, whose value type depends on the class -- which degrades the model + to `Unknown`. Erasing it here keeps the decorator idiomatic at each model and + resolves the cycle. + """ + + return temporalio.converter.transfer_type_convertible(converter) + + +_INTEGER_CAP = (1 << 53) - 1 + + +def _parse_spec_integer( + value: object, path: str, violations: list[Violation] +) -> int | None: + """Parses a JSON number as a spec integer (`1.0` accepted, `1.5` rejected).""" + + # `bool` is a subclass of `int`, so it must be excluded before the int check. + if isinstance(value, bool) or not isinstance(value, (int, float)): + violations.append(Violation(path=path, reason="expected integer")) + return None + if isinstance(value, float): + if not value.is_integer(): + violations.append(Violation(path=path, reason="expected integer")) + return None + out = int(value) + else: + out = value + if abs(out) > _INTEGER_CAP: + violations.append(Violation(path=path, reason="expected integer")) + return None + return out + + +def _binary64(value: float) -> float: + """Narrows a `number` value to the binary64 domain shared by every target.""" + + try: + return float(value) + except OverflowError: + # Past the binary64 range there is nothing to narrow to. The caller's + # finiteness check has already recorded that violation and will raise, so + # hand the value back rather than throwing out of turn and losing the + # other violations collected alongside it. + return value + + +def _json_values_equal(left: typing.Any, right: typing.Any) -> bool: + """Compares JSON values without Python's bool-as-int equality leak.""" + + left_is_number = isinstance(left, (int, float)) and not isinstance(left, bool) + right_is_number = isinstance(right, (int, float)) and not isinstance(right, bool) + if left_is_number or right_is_number: + return left_is_number and right_is_number and left == right + if type(left) is not type(right): + return False + if isinstance(left, list): + left_list = typing.cast("list[typing.Any]", left) + right_list = typing.cast("list[typing.Any]", right) + return len(left_list) == len(right_list) and all( + _json_values_equal(a, b) for a, b in zip(left_list, right_list) + ) + if isinstance(left, dict): + left_dict = typing.cast("dict[typing.Any, typing.Any]", left) + right_dict = typing.cast("dict[typing.Any, typing.Any]", right) + return left_dict.keys() == right_dict.keys() and all( + _json_values_equal(left_dict[key], right_dict[key]) for key in left_dict + ) + return left == right + + +def _check_unique_items( + value: list[typing.Any], path: str, violations: list[Violation] +) -> None: + """Asserts an array's elements are pairwise distinct.""" + + seen: list[typing.Any] = [] + for index, element in enumerate(value): + for earlier, previous in enumerate(seen): + if _json_values_equal(previous, element): + violations.append( + Violation( + path=path, + reason=( + f"duplicate items: element at index {index} " + f"equals index {earlier}" + ), + ) + ) + break + seen.append(element) + + +def _check_contains( + value: list[typing.Any], + matches: typing.Callable[[typing.Any], bool], + min_contains: int, + max_contains: int | None, + bounded_min: bool, + path: str, + violations: list[Violation], +) -> None: + """Asserts how many of an array's elements match the `contains` schema.""" + + match_count = sum(1 for element in value if matches(element)) + if match_count < min_contains: + if bounded_min: + violations.append( + Violation( + path=path, + reason=( + f"too few matching items: at least {min_contains}, " + f"got {match_count}" + ), + ) + ) + else: + violations.append( + Violation(path=path, reason="no element matches the required schema") + ) + if max_contains is not None and match_count > max_contains: + violations.append( + Violation( + path=path, + reason=( + f"too many matching items: at most {max_contains}, " + f"got {match_count}" + ), + ) + ) + + +_TEMPORAL_DATE_TIME_RE = re.compile( + r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])\Z" +) +_TEMPORAL_DATE_RE = re.compile(r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\Z") +_TEMPORAL_TIME_RE = re.compile( + r"^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])?\Z" +) +_TEMPORAL_DURATION_RE = re.compile( + r"^PT(?:[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?|[0-9]+M(?:[0-9]+S)?|[0-9]+S)\Z" +) +_TEMPORAL_MAX_DURATION_SECONDS = ((1 << 63) - 1) // 1_000_000_000 +# A duration component with more digits than the cap itself is over the cap +# whatever those digits are, which is how the magnitude is bounded before `int()` +# sees it: CPython refuses to convert a string of more than 4300 digits. +_TEMPORAL_MAX_DURATION_DIGITS = len(str(_TEMPORAL_MAX_DURATION_SECONDS)) +# `datetime` resolves to microseconds, and `fromisoformat` before Python 3.11 +# parses only the fraction widths `isoformat` writes. +_TEMPORAL_FRACTION_DIGITS = 6 + + +def _days_in_month(year: int, month: int) -> int: + if month in (1, 3, 5, 7, 8, 10, 12): + return 31 + if month in (4, 6, 9, 11): + return 30 + if month == 2: + return 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28 + return 0 + + +def _valid_temporal_calendar(value: str) -> bool: + if len(value) < 10: + return False + try: + year, month, day = int(value[0:4]), int(value[5:7]), int(value[8:10]) + except ValueError: + return False + # `datetime.MINYEAR` is 1, which is also the shared cross-language floor. + # Year 0000 is rejected rather than shifted into range, and + # `_temporal_reason` says so. + if year < datetime.MINYEAR: + return False + maximum = _days_in_month(year, month) + return maximum > 0 and 1 <= day <= maximum + + +def _temporal_reason(name: str, value: str) -> str: + """The reason a rejected temporal string is reported under. + + Year 0000 earns its own clause so the caller sees the shared calendar floor + rather than only a generic malformed-timestamp reason. + """ + + if value[0:4] == "0000": + return ( + f"must be a valid {name}, got {_quote(value)}: year 0000 is not" + f" representable (datetime.MINYEAR is {datetime.MINYEAR})" + ) + return f"must be a valid {name}, got {_quote(value)}" + + +def _temporal_isoformat(value: str) -> str: + """Rewrites a wire temporal into the spelling `fromisoformat` accepts. + + `Z` becomes `+00:00`, and the fractional second is padded or truncated to + exactly `_TEMPORAL_FRACTION_DIGITS`: before Python 3.11 `fromisoformat` + parses only what `isoformat` writes, so an RFC 3339 `.1` or `.1234567` -- + which every other target accepts -- would otherwise raise. Digits past the + sixth are dropped, the loss at `datetime`'s own resolution that P1 allows; + the canonical output re-trims the padding, so `.1` still writes as `.1`. + """ + + normalized = value.upper() + if normalized.endswith("Z"): + normalized = normalized[:-1] + "+00:00" + dot = normalized.find(".") + if dot < 0: + return normalized + end = dot + 1 + while end < len(normalized) and normalized[end].isdigit(): + end += 1 + fraction = normalized[dot + 1 : end].ljust(_TEMPORAL_FRACTION_DIGITS, "0") + return ( + normalized[: dot + 1] + fraction[:_TEMPORAL_FRACTION_DIGITS] + normalized[end:] + ) + + +def _parse_date_time( + value: str, path: str, violations: list[Violation] +) -> datetime.datetime | None: + if _TEMPORAL_DATE_TIME_RE.match(value) is None or not _valid_temporal_calendar( + value + ): + violations.append( + Violation(path=path, reason=_temporal_reason("date-time", value)) + ) + return None + return datetime.datetime.fromisoformat(_temporal_isoformat(value)) + + +def _parse_date( + value: str, path: str, violations: list[Violation] +) -> datetime.date | None: + if _TEMPORAL_DATE_RE.match(value) is None or not _valid_temporal_calendar(value): + violations.append(Violation(path=path, reason=_temporal_reason("date", value))) + return None + return datetime.date.fromisoformat(value) + + +def _parse_time( + value: str, path: str, violations: list[Violation] +) -> datetime.time | None: + if _TEMPORAL_TIME_RE.match(value) is None: + violations.append(Violation(path=path, reason=_temporal_reason("time", value))) + return None + return datetime.time.fromisoformat(_temporal_isoformat(value)) + + +def _parse_duration( + value: str, path: str, violations: list[Violation] +) -> datetime.timedelta | None: + if _TEMPORAL_DURATION_RE.match(value) is None: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + total = 0 + number = "" + for char in value[2:]: + if char.isdigit(): + number += char + continue + digits = number.lstrip("0") + number = "" + if len(digits) > _TEMPORAL_MAX_DURATION_DIGITS: + # Over the cap by digit count alone (see the constant), so the + # conversion `int()` would refuse is never attempted. + total = _TEMPORAL_MAX_DURATION_SECONDS + 1 + break + total += int(digits or "0") * {"H": 3600, "M": 60, "S": 1}[char] + if total > _TEMPORAL_MAX_DURATION_SECONDS: + break + if total > _TEMPORAL_MAX_DURATION_SECONDS: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + return datetime.timedelta(seconds=total) + + +def _check_temporal_offset( + name: str, + value: datetime.datetime | datetime.time, + offset: datetime.timedelta, + path: str, + violations: list[Violation], +) -> None: + """Asserts a UTC offset is a whole number of minutes, the finest the wire + form spells (`tzinfo` allows seconds, which the offset would silently lose). + """ + + if offset % datetime.timedelta(minutes=1): + violations.append( + Violation( + path=path, + reason=( + f"must be a valid {name}, got {_quote(str(value))}: " + f"the UTC offset {offset} is not a whole number of minutes" + ), + ) + ) + + +def _check_date_time( + value: datetime.datetime, path: str, violations: list[Violation] +) -> None: + """Asserts a datetime is writable as a wire date-time (P12). + + A dataclass is constructed unchecked, so a naive datetime -- with no offset + the required wire form could carry -- reaches serialize; without this it + would emit a value this module's own parser rejects. + """ + + offset = value.utcoffset() + if offset is None: + violations.append( + Violation( + path=path, + reason=( + f"must be a valid date-time, got {_quote(str(value))}: " + "a naive datetime carries no UTC offset" + ), + ) + ) + return + _check_temporal_offset("date-time", value, offset, path, violations) + + +def _check_time(value: datetime.time, path: str, violations: list[Violation]) -> None: + """Asserts a time is writable as a wire time (P12). The offset is optional in + the grammar, so only its precision is held to anything.""" + + offset = value.utcoffset() + if offset is not None: + _check_temporal_offset("time", value, offset, path, violations) + + +def _check_duration( + value: datetime.timedelta, path: str, violations: list[Violation] +) -> None: + """Asserts a timedelta is writable as a wire duration (P12): the grammar is + unsigned, whole-second and capped, and a `timedelta` is none of those.""" + + if value < datetime.timedelta(0): + reason = "a duration cannot be negative" + elif value % datetime.timedelta(seconds=1): + reason = "a duration cannot carry a fraction of a second" + elif value.total_seconds() > _TEMPORAL_MAX_DURATION_SECONDS: + reason = f"a duration cannot exceed {_TEMPORAL_MAX_DURATION_SECONDS} seconds" + else: + return + violations.append( + Violation( + path=path, + reason=f"must be a valid duration, got {_quote(str(value))}: {reason}", + ) + ) + + +def _temporal_frac(microsecond: int) -> str: + if microsecond == 0: + return "" + return "." + f"{microsecond:06d}".rstrip("0") + + +def _temporal_offset(value: datetime.datetime | datetime.time) -> str: + offset = value.utcoffset() + if offset is None: + return "" + total = int(offset.total_seconds()) + if total == 0: + return "Z" + sign = "+" if total > 0 else "-" + total = abs(total) + return f"{sign}{total // 3600:02d}:{(total % 3600) // 60:02d}" + + +def _format_date_time(value: datetime.datetime) -> str: + return ( + f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + f"T{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_date(value: datetime.date) -> str: + return f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + + +def _format_time(value: datetime.time) -> str: + return ( + f"{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_duration(value: datetime.timedelta) -> str: + total = int(value.total_seconds()) + if total == 0: + return "PT0S" + hours, remainder = divmod(total, 3600) + minutes, seconds = divmod(remainder, 60) + out = "PT" + if hours: + out += f"{hours}H" + if minutes: + out += f"{minutes}M" + if seconds: + out += f"{seconds}S" + return out + + +_BASE64_RE = re.compile( + "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?\\Z", + re.ASCII, +) +_BASE64URL_RE = re.compile( + "^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048])?\\Z", + re.ASCII, +) + + +def _parse_base64(value: str, path: str, violations: list[Violation]) -> bytes | None: + if _BASE64_RE.match(value) is None: + violations.append( + Violation(path=path, reason=f"must be base64-encoded, got {_quote(value)}") + ) + return None + return base64.b64decode(value, validate=True) + + +def _format_base64(value: bytes) -> str: + return base64.b64encode(value).decode("ascii") + + +def _parse_base64url( + value: str, path: str, violations: list[Violation] +) -> bytes | None: + if _BASE64URL_RE.match(value) is None: + violations.append( + Violation( + path=path, reason=f"must be base64url-encoded, got {_quote(value)}" + ) + ) + return None + return base64.urlsafe_b64decode(value + "=" * (-len(value) % 4)) + + +def _format_base64url(value: bytes) -> str: + return base64.urlsafe_b64encode(value).rstrip(b"=").decode("ascii") diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py new file mode 100644 index 000000000..f22711a4f --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -0,0 +1,670 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import dataclasses +import typing + +import typing_extensions + +import temporalio.converter +import temporalio.exceptions + +from ._definitions import ( + Violation, + _collect, + _parse_spec_integer, + _transfer_type_convertible, +) + + +class _AppendInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendInput"] + ) -> "AppendInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) + else: + stream_value_raw = raw["stream"] + if not isinstance(stream_value_raw, str): + violations.append(Violation(path="stream", reason="expected string")) + else: + stream_value = stream_value_raw + + producer_id_value: str = typing.cast("typing.Any", None) + if "producer_id" not in raw or raw["producer_id"] is None: + violations.append(Violation(path="producer_id", reason="required")) + else: + producer_id_value_raw = raw["producer_id"] + if not isinstance(producer_id_value_raw, str): + violations.append( + Violation(path="producer_id", reason="expected string") + ) + else: + producer_id_value = producer_id_value_raw + + attempt_value: int = typing.cast("typing.Any", None) + if "attempt" not in raw or raw["attempt"] is None: + violations.append(Violation(path="attempt", reason="required")) + else: + attempt_value_raw = raw["attempt"] + attempt_value_parsed = _parse_spec_integer( + attempt_value_raw, "attempt", violations + ) + if attempt_value_parsed is not None: + attempt_value = attempt_value_parsed + + batch_index_value: int = typing.cast("typing.Any", None) + if "batch_index" not in raw or raw["batch_index"] is None: + violations.append(Violation(path="batch_index", reason="required")) + else: + batch_index_value_raw = raw["batch_index"] + batch_index_value_parsed = _parse_spec_integer( + batch_index_value_raw, "batch_index", violations + ) + if batch_index_value_parsed is not None: + batch_index_value = batch_index_value_parsed + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + payloads_value: list[str] | None = None + if "payloads" in raw: + payloads_value_raw = raw["payloads"] + if payloads_value_raw is None: + violations.append( + Violation(path="payloads", reason="explicit null not allowed") + ) + else: + if not isinstance(payloads_value_raw, list): + violations.append( + Violation(path="payloads", reason="expected array") + ) + else: + payloads_value_list: list[str] = [] + for payloads_value_index, payloads_value_element in enumerate( + typing.cast("list[typing.Any]", payloads_value_raw) + ): + payloads_value_item_path = f"payloads[{payloads_value_index}]" + payloads_value_item_violation_count = len(violations) + payloads_value_item: str = typing.cast("typing.Any", None) + if not isinstance(payloads_value_element, str): + violations.append( + Violation( + path=payloads_value_item_path, + reason="expected string", + ) + ) + else: + payloads_value_item = payloads_value_element + if len(violations) == payloads_value_item_violation_count: + payloads_value_list.append(payloads_value_item) + payloads_value = payloads_value_list + + finish_value: bool | None = None + if "finish" in raw: + finish_value_raw = raw["finish"] + if finish_value_raw is None: + violations.append( + Violation(path="finish", reason="explicit null not allowed") + ) + else: + if not isinstance(finish_value_raw, bool): + violations.append( + Violation(path="finish", reason="expected boolean") + ) + else: + finish_value = finish_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "producer_id" + and key != "attempt" + and key != "batch_index" + and key != "topic" + and key != "payloads" + and key != "finish" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendInput( + workflow_id=workflow_id_value, + stream=stream_value, + producer_id=producer_id_value, + attempt=attempt_value, + batch_index=batch_index_value, + topic=topic_value, + payloads=payloads_value, + finish=finish_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + out["stream"] = value.stream + out["producer_id"] = value.producer_id + if abs(value.attempt) > 9007199254740991: + violations.append( + Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") + ) + out["attempt"] = value.attempt + if abs(value.batch_index) > 9007199254740991: + violations.append( + Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") + ) + out["batch_index"] = value.batch_index + if value.topic is not None: + out["topic"] = value.topic + if value.payloads is not None: + out["payloads"] = value.payloads + if value.finish is not None: + out["finish"] = value.finish + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_AppendInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendInput: + """One append call: who is writing, where, and what.""" + + workflow_id: str + """The workflow whose stream is being written.""" + + stream: str + """The named stream to append to. Empty when the producer writes to a topic instead.""" + + producer_id: str + """Identifies the writer across its retries, so its attempts can be ordered.""" + + attempt: int + """The generation this producer is writing. A later attempt supersedes an earlier one.""" + + batch_index: int + """Counts this producer's batches from 1. The handler drops an index it has already + written for this producer attempt. + """ + + topic: str | None = None + """The topic to append to, when stream is empty.""" + + payloads: list[str] | None = None + """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a + call that only finishes. + """ + + finish: bool | None = None + """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + + +class _AppendOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendOutput"] + ) -> "AppendOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + cursor_value: str | None = None + if "cursor" in raw: + cursor_value_raw = raw["cursor"] + if cursor_value_raw is None: + violations.append( + Violation(path="cursor", reason="explicit null not allowed") + ) + else: + if not isinstance(cursor_value_raw, str): + violations.append( + Violation(path="cursor", reason="expected string") + ) + else: + cursor_value = cursor_value_raw + + for key in raw: + if key != "cursor": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendOutput( + cursor=cursor_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + out: dict[str, typing.Any] = {} + if value.cursor is not None: + out["cursor"] = value.cursor + return out + + +@_transfer_type_convertible(_AppendOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + + cursor: str | None = None + """Opaque token naming the last record written by this call. Empty when the call + carried no payloads. + """ + + +class _ReadInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadInput"] + ) -> "ReadInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str | None = None + if "stream" in raw: + stream_value_raw = raw["stream"] + if stream_value_raw is None: + violations.append( + Violation(path="stream", reason="explicit null not allowed") + ) + else: + if not isinstance(stream_value_raw, str): + violations.append( + Violation(path="stream", reason="expected string") + ) + else: + stream_value = stream_value_raw + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + after_token_value: str | None = None + if "after_token" in raw: + after_token_value_raw = raw["after_token"] + if after_token_value_raw is None: + violations.append( + Violation(path="after_token", reason="explicit null not allowed") + ) + else: + if not isinstance(after_token_value_raw, str): + violations.append( + Violation(path="after_token", reason="expected string") + ) + else: + after_token_value = after_token_value_raw + + max_records_value: int | None = None + if "max_records" in raw: + max_records_value_raw = raw["max_records"] + if max_records_value_raw is None: + violations.append( + Violation(path="max_records", reason="explicit null not allowed") + ) + else: + max_records_value_parsed = _parse_spec_integer( + max_records_value_raw, "max_records", violations + ) + if max_records_value_parsed is not None: + max_records_value = max_records_value_parsed + + wait_ms_value: int | None = None + if "wait_ms" in raw: + wait_ms_value_raw = raw["wait_ms"] + if wait_ms_value_raw is None: + violations.append( + Violation(path="wait_ms", reason="explicit null not allowed") + ) + else: + wait_ms_value_parsed = _parse_spec_integer( + wait_ms_value_raw, "wait_ms", violations + ) + if wait_ms_value_parsed is not None: + wait_ms_value = wait_ms_value_parsed + + latest_only_value: bool | None = None + if "latest_only" in raw: + latest_only_value_raw = raw["latest_only"] + if latest_only_value_raw is None: + violations.append( + Violation(path="latest_only", reason="explicit null not allowed") + ) + else: + if not isinstance(latest_only_value_raw, bool): + violations.append( + Violation(path="latest_only", reason="expected boolean") + ) + else: + latest_only_value = latest_only_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "topic" + and key != "after_token" + and key != "max_records" + and key != "wait_ms" + and key != "latest_only" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadInput( + workflow_id=workflow_id_value, + stream=stream_value, + topic=topic_value, + after_token=after_token_value, + max_records=max_records_value, + wait_ms=wait_ms_value, + latest_only=latest_only_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + if value.stream is not None: + out["stream"] = value.stream + if value.topic is not None: + out["topic"] = value.topic + if value.after_token is not None: + out["after_token"] = value.after_token + if value.max_records is not None: + if abs(value.max_records) > 9007199254740991: + violations.append( + Violation( + path="max_records", reason="exceeds ±(2^53-1) integer cap" + ) + ) + out["max_records"] = value.max_records + if value.wait_ms is not None: + if abs(value.wait_ms) > 9007199254740991: + violations.append( + Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") + ) + out["wait_ms"] = value.wait_ms + if value.latest_only is not None: + out["latest_only"] = value.latest_only + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadInput: + """One read call: where to resume from and how long to wait.""" + + workflow_id: str + """The workflow whose stream is being read.""" + + stream: str | None = None + """The named stream to read. Empty reads every stream the workflow publishes.""" + + topic: str | None = None + """Yield only records on this topic. Empty yields every topic.""" + + after_token: str | None = None + """Opaque cursor from an earlier record or append. The read resumes strictly after the + record it names, so a caller never sees that record twice. Empty starts at the + beginning. The token is produced by whichever store sits behind the endpoint, so a + caller cannot tell which one that is. + """ + + max_records: int | None = None + """Return at most this many records. Defaults to 100 when omitted.""" + + wait_ms: int | None = None + """Wait at most this long for records to arrive before answering. Defaults to 5000 when + omitted. A call that collects nothing answers with no records and the caller's own + token. + """ + + latest_only: bool | None = None + """Answer with the newest position and no records, for a reader that wants to follow + from now. + """ + + +class _ReadOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadOutput"] + ) -> "ReadOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + records_value: list[RecordWire] | None = None + if "records" in raw: + records_value_raw = raw["records"] + if records_value_raw is None: + violations.append( + Violation(path="records", reason="explicit null not allowed") + ) + else: + if not isinstance(records_value_raw, list): + violations.append( + Violation(path="records", reason="expected array") + ) + else: + records_value_list: list[RecordWire] = [] + for records_value_index, records_value_element in enumerate( + typing.cast("list[typing.Any]", records_value_raw) + ): + records_value_item_path = f"records[{records_value_index}]" + records_value_item_violation_count = len(violations) + records_value_item: RecordWire = typing.cast("typing.Any", None) + try: + records_value_item = ( + _RecordWireTransferTypeConverter().from_transfer_type( + records_value_element, RecordWire + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, records_value_item_path, error) + if len(violations) == records_value_item_violation_count: + records_value_list.append(records_value_item) + records_value = records_value_list + + next_token_value: str | None = None + if "next_token" in raw: + next_token_value_raw = raw["next_token"] + if next_token_value_raw is None: + violations.append( + Violation(path="next_token", reason="explicit null not allowed") + ) + else: + if not isinstance(next_token_value_raw, str): + violations.append( + Violation(path="next_token", reason="expected string") + ) + else: + next_token_value = next_token_value_raw + + for key in raw: + if key != "records" and key != "next_token": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadOutput( + records=records_value, + next_token=next_token_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadOutput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + if value.records is not None: + records_out: list[typing.Any] = [] + for records_index, records_element in enumerate(value.records): + try: + records_out.append( + _RecordWireTransferTypeConverter().to_transfer_type( + records_element + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, f"records[{records_index}]", error) + out["records"] = records_out + if value.next_token is not None: + out["next_token"] = value.next_token + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadOutput: + """What one read call answered, and where to resume.""" + + records: list[RecordWire] | None = None + """The records after the caller's token, in stream order.""" + + next_token: str | None = None + """Opaque cursor to pass as after_token on the following call. Echoes the caller's own + token when the call collected nothing. + """ + + +class _RecordWireTransferTypeConverter( + temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["RecordWire"] + ) -> "RecordWire": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + token_value: str = typing.cast("typing.Any", None) + if "token" not in raw or raw["token"] is None: + violations.append(Violation(path="token", reason="required")) + else: + token_value_raw = raw["token"] + if not isinstance(token_value_raw, str): + violations.append(Violation(path="token", reason="expected string")) + else: + token_value = token_value_raw + + frame_value: str = typing.cast("typing.Any", None) + if "frame" not in raw or raw["frame"] is None: + violations.append(Violation(path="frame", reason="required")) + else: + frame_value_raw = raw["frame"] + if not isinstance(frame_value_raw, str): + violations.append(Violation(path="frame", reason="expected string")) + else: + frame_value = frame_value_raw + + for key in raw: + if key != "token" and key != "frame": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return RecordWire( + token=token_value, + frame=frame_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "RecordWire") -> typing.Any: + out: dict[str, typing.Any] = {} + out["token"] = value.token + out["frame"] = value.frame + return out + + +@_transfer_type_convertible(_RecordWireTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + + token: str + """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" + + frame: str + """The base64-encoded record frame, carrying the topic, kind, producer, attempt, + sequence and body. + """ diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py new file mode 100644 index 000000000..ce5604d81 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -0,0 +1,39 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from nexusrpc import Operation, service + +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, +) + + +@service +class TemporalStreams: + """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the + store behind it, so an operator switches storage without touching callers. Reads + hand out batches and an append carries one batch per call, because a Nexus operation + per record costs too much for token streams. + """ + + append: Operation[ + AppendInput, + AppendOutput, + ] = Operation(name="append") + """Append one batch on the caller's account. A repeated batch_index for the same + producer attempt is dropped, so a retried call writes once. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. + """ + + read: Operation[ + ReadInput, + ReadOutput, + ] = Operation(name="read") + """Answer with the records after the caller's token, or time out. The call parks until + it has max_records records or wait_ms elapses, whichever comes first, and returns + whatever it collected. + """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml new file mode 100644 index 000000000..ffa849509 --- /dev/null +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -0,0 +1,123 @@ +nexusrpc: "1.0.0" + +services: + TemporalStreams: + fqn: TemporalStreams + description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + operations: + append: + fqn: append + description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + input: { $ref: "#/$defs/AppendInput" } + output: { $ref: "#/$defs/AppendOutput" } + read: + fqn: read + description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + input: { $ref: "#/$defs/ReadInput" } + output: { $ref: "#/$defs/ReadOutput" } + +$defs: + AppendInput: + type: object + description: "One append call: who is writing, where, and what." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being written." + stream: + type: string + description: "The named stream to append to. Empty when the producer writes to a topic instead." + producer_id: + type: string + description: "Identifies the writer across its retries, so its attempts can be ordered." + attempt: + type: integer + description: "The generation this producer is writing. A later attempt supersedes an earlier one." + batch_index: + type: integer + description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + topic: + type: string + description: "The topic to append to, when stream is empty." + payloads: + type: array + items: + type: string + description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + finish: + type: boolean + description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + required: + - workflow_id + - stream + - producer_id + - attempt + - batch_index + additionalProperties: false + + AppendOutput: + type: object + description: "Where the append landed, empty when it wrote nothing." + properties: + cursor: + type: string + description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." + additionalProperties: false + + ReadInput: + type: object + description: "One read call: where to resume from and how long to wait." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being read." + stream: + type: string + description: "The named stream to read. Empty reads every stream the workflow publishes." + topic: + type: string + description: "Yield only records on this topic. Empty yields every topic." + after_token: + type: string + description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + max_records: + type: integer + description: "Return at most this many records. Defaults to 100 when omitted." + wait_ms: + type: integer + description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + latest_only: + type: boolean + description: "Answer with the newest position and no records, for a reader that wants to follow from now." + required: + - workflow_id + additionalProperties: false + + RecordWire: + type: object + description: "One record on the wire: its cursor and its base64 frame." + properties: + token: + type: string + description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + frame: + type: string + description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + required: + - token + - frame + additionalProperties: false + + ReadOutput: + type: object + description: "What one read call answered, and where to resume." + properties: + records: + type: array + items: + $ref: "#/$defs/RecordWire" + description: "The records after the caller's token, in stream order." + next_token: + type: string + description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." + additionalProperties: false From 23e1d3a08ac14c702edbf039537149ef2023297f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:30:01 -0700 Subject: [PATCH 254/831] Moved the nexus provider onto the generated contract. The five wire dataclasses and the service class now come from the generated module, so the contract has one source. Both halves read the operation and service names off the generated definition instead of hard-coding paths. Field names and operation names on the wire are unchanged. The one wire difference is that a read no longer sends max_records, wait_ms and latest_only when the caller leaves them at their defaults, because the contract marks them optional and the handler applies the documented defaults. Nothing outside this module and its tests speaks this wire. --- temporalio/streams/providers/nexus.py | 205 ++++++++++++-------------- 1 file changed, 93 insertions(+), 112 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 3701a70cb..8e19c2d4d 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -8,6 +8,12 @@ store behind the endpoint is invisible to callers and an operator switches it without touching them. +The wire types and the service definition come from +``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be +handed the same contract. What stays hand-written here is what the +generator cannot express yet: the handler's dedupe and long-poll collect +loop, and the caller's batching, cursor handling and codec. + Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Supersession records are not transported: the caller's reader re-synthesizes them from @@ -25,13 +31,11 @@ import asyncio import base64 -import dataclasses -import json import urllib.error import urllib.request from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta -from typing import Any +from typing import Any, TypeVar import nexusrpc import nexusrpc.handler @@ -42,71 +46,40 @@ from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams.providers._nexus_generated import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, + TemporalStreams, +) _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so configure one of those on the worker" ) +# The contract leaves these unset, so the handler is the one place that says +# what an omitted read bound means. +_DEFAULT_MAX_RECORDS = 100 +_DEFAULT_WAIT_MS = 5000 -@dataclasses.dataclass -class AppendInput: - """One append call: who is writing, where, and what.""" - - workflow_id: str - stream: str - producer_id: str - attempt: int - batch_index: int - topic: str = "" - payloads: list[str] = dataclasses.field(default_factory=list) - finish: bool = False - - -@dataclasses.dataclass -class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" - - cursor: str = "" - - -@dataclasses.dataclass -class ReadInput: - """One read call: where to resume from and how long to wait.""" - - workflow_id: str - stream: str = "" - topic: str = "" - after_token: str = "" - max_records: int = 100 - wait_ms: int = 5000 - # Answer with the newest position and no records, for a reader that - # wants to follow from now. - latest_only: bool = False - - -@dataclasses.dataclass -class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" - - token: str - frame: str - - -@dataclasses.dataclass -class ReadOutput: - """What one read call answered, and where to resume.""" - - records: list[RecordWire] = dataclasses.field(default_factory=list) - next_token: str = "" - - -@nexusrpc.service -class TemporalStreams: - """The stream endpoint's two operations.""" +_definition = nexusrpc.get_service_definition(TemporalStreams) +if _definition is None: # pragma: no cover + raise RuntimeError("the generated stream service carries no nexus definition") +# Both halves read the wire names off the generated definition, so a rename in +# the contract cannot leave the caller posting to a path the handler no longer +# serves. +_SERVICE_NAME = _definition.name +_OPERATION_NAMES = { + operation.method_name: operation.name + for operation in _definition.operation_definitions.values() +} +_APPEND_OPERATION = _OPERATION_NAMES["append"] +_READ_OPERATION = _OPERATION_NAMES["read"] - append: nexusrpc.Operation[AppendInput, AppendOutput] - read: nexusrpc.Operation[ReadInput, ReadOutput] +_OutputT = TypeVar("_OutputT") @nexusrpc.handler.service_handler(service=TemporalStreams) @@ -129,9 +102,10 @@ async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: """Append on the caller's account, dropping a repeated batch.""" + topic = input.topic or "" key = ( input.workflow_id, - input.stream or f"@{input.topic}", + input.stream or f"@{topic}", input.producer_id, input.attempt, ) @@ -143,7 +117,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, - topic=input.topic, + topic=topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -168,14 +142,18 @@ async def read( ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream + self._client, workflow_id=input.workflow_id, stream=input.stream or "" ) topic = input.topic or None if input.latest_only: return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + max_records = ( + _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records + ) + wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.after_token + next_token = input.after_token or "" subscription = delegate.read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, @@ -204,13 +182,13 @@ async def collect() -> None: ) ) next_token = record.cursor.token - if len(records) >= input.max_records: + if len(records) >= max_records: return try: # `wait_for` rather than `asyncio.timeout`, which 3.10 does not # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), input.wait_ms / 1000) + await asyncio.wait_for(collect(), wait_ms / 1000) except asyncio.TimeoutError: pass finally: @@ -222,20 +200,29 @@ async def collect() -> None: return ReadOutput(records=records, next_token=next_token) -def _post(url: str, body: dict) -> dict: +def _post(url: str, body: bytes) -> bytes: request = urllib.request.Request( url, - data=json.dumps(body).encode(), + data=body, headers={"Content-Type": "application/json"}, method="POST", ) try: with urllib.request.urlopen(request, timeout=30) as response: - raw = response.read() + return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") - return json.loads(raw) if raw else {} + + +async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller and + # the worker serving the operation agree on the body without either of + # them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: @@ -276,7 +263,7 @@ async def append(self, *values: Any) -> Cursor: else self._converter.to_payloads([value])[0] ) payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + return Cursor((await self._call(payloads=payloads)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -284,23 +271,21 @@ async def finish(self) -> None: async def _call( self, payloads: list[str] | None = None, finish: bool = False - ) -> dict: + ) -> AppendOutput: self._batch_index += 1 - return await asyncio.to_thread( - _post, - f"{self._base_url}/append", - dataclasses.asdict( - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ) + return await _invoke( + f"{self._base_url}/{_APPEND_OPERATION}", + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + topic=self._topic, + payloads=payloads or [], + finish=finish, ), + AppendOutput, ) @@ -327,28 +312,26 @@ async def read( attempts = AttemptTracker() token = after.token while True: - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - after_token=token, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + after_token=token, ), + ReadOutput, ) - for wire in raw.get("records", []): + for wire in answer.records or []: try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire["frame"]) + base64.b64decode(wire.frame) ) except ValueError: continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire["token"]) + cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -361,23 +344,21 @@ async def read( attempt=attempt, sequence=sequence, ) - token = raw.get("next_token", token) or token + token = answer.next_token or token async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - latest_only=True, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, ), + ReadOutput, ) - token = raw.get("next_token", "") + token = answer.next_token or "" return Cursor(token) if token else BEGINNING def _decode(self, body: bytes, as_type: type | None) -> Any: @@ -397,7 +378,7 @@ def __init__(self) -> None: def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", "TemporalStreams") + service = options.pop("service", _SERVICE_NAME) if options: raise TypeError( "the nexus provider takes endpoint, http_address and service, " From 2bb840b57403fa5d11107bf5f0357a894054bbb8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:37:16 -0700 Subject: [PATCH 255/831] Applied the payload codec on the nexus provider's caller side. The caller ran the payload converter but never the codec, so records left the process in the clear even when one was configured. The producer now encodes before posting and the consumer decodes after reading, while the handler stays codec-blind, which is what keeps plaintext out of whoever hosts the endpoint. A data_converter option on the provider says which one to use when there is no client to take it from. --- CHANGELOG.md | 5 +- temporalio/streams/providers/nexus.py | 72 ++++++---- tests/streams/test_nexus_provider.py | 182 ++++++++++++++++++++++++-- 3 files changed, 223 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9709fa3f..7d6d93c86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,10 @@ to include examples, links to docs, or any other relevant information. naming it. - **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. + through the endpoint and never names the store. Its contract is defined in + `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. + Configure it with `data_converter=` to run a payload codec on the caller + side, so records are encoded before they leave the process. ### Changed diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8e19c2d4d..a73c830ef 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -231,7 +231,7 @@ class NexusProducer: def __init__( self, base_url: str, - converter: Any, + data_converter: temporalio.converter.DataConverter, workflow_id: str, stream: str, topic: str, @@ -240,7 +240,8 @@ def __init__( ) -> None: """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream self._topic = topic @@ -255,15 +256,22 @@ def attempt(self) -> int: async def append(self, *values: Any) -> Cursor: """Append ``values`` through the endpoint.""" - payloads = [] - for value in values: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).cursor or "") + payloads = [ + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + for value in values + ] + if self._codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._codec.encode(payloads) + encoded = [ + base64.b64encode(payload.SerializeToString()).decode() + for payload in payloads + ] + return Cursor((await self._call(payloads=encoded)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -293,11 +301,16 @@ class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + workflow_id: str, + stream: str, ) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream @@ -335,8 +348,11 @@ async def read( superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded + value = ( + await self._decode(body, type) if kind is RecordKind.DATA else None + ) yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, + value=value, cursor=cursor, kind=kind, topic=frame_topic, @@ -361,9 +377,11 @@ async def latest(self, *, topic: str | None = None) -> Cursor: token = answer.next_token or "" return Cursor(token) if token else BEGINNING - def _decode(self, body: bytes, as_type: type | None) -> Any: + async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) + if self._codec is not None: + payload = (await self._codec.decode([payload]))[0] if as_type is None: return self._converter.from_payloads([payload])[0] return self._converter.from_payloads([payload], [as_type])[0] @@ -374,19 +392,22 @@ class _NexusProvider: def __init__(self) -> None: self._base_url: str | None = None + self._data_converter: temporalio.converter.DataConverter | None = None def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") service = options.pop("service", _SERVICE_NAME) + data_converter = options.pop("data_converter", None) if options: raise TypeError( - "the nexus provider takes endpoint, http_address and service, " - f"got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service and " + f"data_converter, got {sorted(options)}" ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + self._data_converter = data_converter def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -427,7 +448,7 @@ async def producer( attempt = attempt or activity.info().attempt return NexusProducer( self._url(), - _converter(client), + self._converter(client), workflow_id, stream, topic, @@ -438,13 +459,14 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), _converter(client), workflow_id, stream) - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + + def _converter(self, client: Any) -> temporalio.converter.DataConverter: + if self._data_converter is not None: + return self._data_converter + if client is None: + return temporalio.converter.DataConverter.default + return client.data_converter _provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index f07e4956c..18679ad5f 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,40 +1,55 @@ -"""Live conformance for the Nexus front. +"""Conformance for the Nexus front. -The caller talks only to the stream endpoint over the server's Nexus HTTP -ingress; the handler worker delegates to the workflow_streams provider, so -this test is the provider-hiding demonstration: nothing on the caller side -names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it -needs a dev server with an HTTP port and a registered Nexus endpoint. +The caller talks only to the stream endpoint; the handler delegates to a +storage provider, so these tests are the provider-hiding demonstration: +nothing on the caller side names or could name the store. -Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), -``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named -``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +The loop test runs over the server's Nexus HTTP ingress and is gated behind +``STREAMS_LIVE=nexus`` because it needs a dev server with an HTTP port and a +registered Nexus endpoint. Environment: ``TEMPORAL_ADDRESS`` (default +``localhost:7233``), ``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), +and an endpoint named ``streams-e2e`` targeting task queue +``streams-handlers-e2e``. + +The codec test stands the endpoint up in this process instead, because what +it checks is the bytes the caller puts on the wire. """ from __future__ import annotations +import asyncio +import base64 +import dataclasses import json import os import subprocess import uuid +from collections.abc import Sequence +from typing import Any, cast import pytest +import temporalio.converter from temporalio import streams +from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams import _frame as frame from temporalio.streams._provider import instance +from temporalio.streams.providers import memory, nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take -pytestmark = pytest.mark.skipif( +live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", ) ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" +APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] def _endpoint_id() -> str: @@ -60,6 +75,7 @@ def _endpoint_id() -> str: return json.loads(out.stdout)["id"] +@live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. @@ -119,3 +135,149 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + + +class ScrambleCodec(temporalio.converter.PayloadCodec): + """Flips every byte of a payload, so the middle holds nothing readable.""" + + KEY = 0x5A + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Wrap each payload as opaque bytes nothing downstream can read.""" + return [ + Payload( + metadata={"encoding": b"binary/plain"}, + data=self._flip(payload.SerializeToString()), + ) + for payload in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Recover the payloads :meth:`encode` wrapped.""" + out: list[Payload] = [] + for payload in payloads: + inner = Payload() + inner.ParseFromString(self._flip(payload.data)) + out.append(inner) + return out + + @classmethod + def _flip(cls, data: bytes) -> bytes: + return bytes(byte ^ cls.KEY for byte in data) + + +async def _dispatch( + handler: TemporalStreamsHandler, operation: str, request: Any +) -> Any: + context = cast("Any", None) # neither operation looks at it + if operation == APPEND_OPERATION: + return await handler.append(context, request) + return await handler.read(context, request) + + +def _in_process_endpoint( + handler: TemporalStreamsHandler, + posted: list[bytes], + answered: list[bytes], +) -> Any: + """Serve the caller's posts from ``handler``, recording both directions.""" + contract = temporalio.converter.DataConverter.default.payload_converter + loop = asyncio.get_running_loop() + + def post(url: str, body: bytes) -> bytes: + posted.append(body) + operation = url.rsplit("/", 1)[1] + request_type = AppendInput if operation == APPEND_OPERATION else ReadInput + request: Any = contract.from_payloads( + [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] + )[0] + if request_type is ReadInput: + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + request.wait_ms = 200 + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + raw = contract.to_payloads([answer])[0].data + answered.append(raw) + return raw + + return post + + +async def _loop_through_an_endpoint( + monkeypatch: pytest.MonkeyPatch, + codec: temporalio.converter.PayloadCodec | None, +) -> tuple[list[Any], list[bytes], list[bytes]]: + memory.reset() + streams.configure(provider="memory") + posted: list[bytes] = [] + answered: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) + front = instance( + "nexus", + endpoint="in-process", + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + workflow_id = "wf-codec" + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"secret": "tuna"}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") + records = await take(consumer.read(type=dict), 2, timeout=30) + memory.reset() + return records, posted, answered + + +def _appended_bytes(posted: list[bytes]) -> bytes: + out = b"" + for body in posted: + for encoded in json.loads(body).get("payloads", []): + out += base64.b64decode(encoded) + return out + + +def _answered_bodies(answered: list[bytes]) -> bytes: + out = b"" + for body in answered: + for record in json.loads(body).get("records", []): + out += frame.decode(base64.b64decode(record["frame"]))[5] + return out + + +async def test_the_caller_encodes_records_with_the_configured_codec( + monkeypatch: pytest.MonkeyPatch, +): + records, posted, answered = await _loop_through_an_endpoint( + monkeypatch, ScrambleCodec() + ) + + # The value survives the hop, so the codec is applied on both sides. + assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"secret": "tuna"} + # Neither direction carried the plaintext. + assert b"tuna" not in _appended_bytes(posted) + assert b"tuna" not in _answered_bodies(answered) + + +async def test_without_a_codec_the_same_records_go_out_in_the_clear( + monkeypatch: pytest.MonkeyPatch, +): + # The contrast is the point: the bytes above differ because of the codec, + # not because the transport obscures them anyway. + records, posted, answered = await _loop_through_an_endpoint(monkeypatch, None) + + assert records[0].value == {"secret": "tuna"} + assert b"tuna" in _appended_bytes(posted) + assert b"tuna" in _answered_bodies(answered) From 96a1f955f26496030801692c7df399d5cb39e7a3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 256/831] Made the stream contract generator refuse a nexgen other than the pinned one. The output differs between releases, so a developer with another version on PATH would regenerate different code and only see the drift in CI. --- scripts/gen_streams_nexus_api.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py index 800aba944..2d4f16c6d 100644 --- a/scripts/gen_streams_nexus_api.py +++ b/scripts/gen_streams_nexus_api.py @@ -36,11 +36,26 @@ def nex_gen_command() -> list[str]: return ["nexgen"] +def check_version(command: list[str]) -> None: + # A different release on PATH would regenerate different code locally + # and the drift would only show in CI, so refuse before writing anything. + reported = subprocess.check_output([*command, "--version"], text=True).strip() + found = reported.split()[-1] if reported else "" + if found != NEX_GEN_VERSION: + raise SystemExit( + f"found nexgen {found or '?'} at {command[0]}, but the stream contract is " + f"generated with {NEX_GEN_VERSION}. Install it with `cargo install --locked " + f"nexgen --version {NEX_GEN_VERSION} --features advanced` or point " + "NEX_GEN_BIN at that binary." + ) + + def generate_streams_nexus_api() -> None: if not contract_path.exists(): raise RuntimeError(f"missing stream contract: {contract_path}") command = nex_gen_command() + check_version(command) shutil.rmtree(output_dir, ignore_errors=True) subprocess.check_call( [ From 13234aeb7a6c64e501c8e361880d6675f9f0887d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 257/831] Regenerated the stream contract with byte payloads, read bounds and tolerant outputs. Payload fields carry contentEncoding base64 so both halves pass bytes and the generated code does the encoding. max_records and wait_ms carry the bounds the validator enforces, outputs accept unknown fields so a handler can add one before every caller is rebuilt, and descriptions are folded at 100 columns. --- .../providers/_nexus_generated/models.py | 201 +++++++++++++++--- .../providers/_nexus_generated/services.py | 8 +- .../providers/temporal_streams.nexusrpc.yaml | 108 ++++++++-- 3 files changed, 261 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index f22711a4f..d00cbcc63 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -13,10 +13,20 @@ from ._definitions import ( Violation, _collect, + _format_base64, + _parse_base64, _parse_spec_integer, _transfer_type_convertible, ) +_APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) + + +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) + + +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) + class _AppendInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] @@ -87,6 +97,13 @@ def from_transfer_type( ) if batch_index_value_parsed is not None: batch_index_value = batch_index_value_parsed + if batch_index_value < 1: + violations.append( + Violation( + path="batch_index", + reason=f"must be >= 1, got {batch_index_value}", + ) + ) topic_value: str | None = None if "topic" in raw: @@ -101,7 +118,7 @@ def from_transfer_type( else: topic_value = topic_value_raw - payloads_value: list[str] | None = None + payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] if payloads_value_raw is None: @@ -114,13 +131,13 @@ def from_transfer_type( Violation(path="payloads", reason="expected array") ) else: - payloads_value_list: list[str] = [] + payloads_value_list: list[bytes] = [] for payloads_value_index, payloads_value_element in enumerate( typing.cast("list[typing.Any]", payloads_value_raw) ): payloads_value_item_path = f"payloads[{payloads_value_index}]" payloads_value_item_violation_count = len(violations) - payloads_value_item: str = typing.cast("typing.Any", None) + payloads_value_item: bytes = typing.cast("typing.Any", None) if not isinstance(payloads_value_element, str): violations.append( Violation( @@ -129,7 +146,13 @@ def from_transfer_type( ) ) else: - payloads_value_item = payloads_value_element + payloads_value_item_parsed = _parse_base64( + payloads_value_element, + payloads_value_item_path, + violations, + ) + if payloads_value_item_parsed is not None: + payloads_value_item = payloads_value_item_parsed if len(violations) == payloads_value_item_violation_count: payloads_value_list.append(payloads_value_item) payloads_value = payloads_value_list @@ -190,11 +213,17 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") ) + if value.batch_index < 1: + violations.append( + Violation( + path="batch_index", reason=f"must be >= 1, got {value.batch_index}" + ) + ) out["batch_index"] = value.batch_index if value.topic is not None: out["topic"] = value.topic if value.payloads is not None: - out["payloads"] = value.payloads + out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: out["finish"] = value.finish if violations: @@ -221,15 +250,16 @@ class AppendInput: batch_index: int """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt. + written for this producer attempt, and rejects one that skips ahead or that resumes + an attempt it never saw start. """ topic: str | None = None """The topic to append to, when stream is empty.""" - payloads: list[str] | None = None - """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a - call that only finishes. + payloads: list[bytes] | None = None + """The records to write, each a serialized Temporal Payload. Empty on a call that only + finishes. """ finish: bool | None = None @@ -265,33 +295,53 @@ def from_transfer_type( else: cursor_value = cursor_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "cursor": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _APPEND_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return AppendOutput( cursor=cursor_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} if value.cursor is not None: out["cursor"] = value.cursor + for key, entry in value.additional_properties.items(): + if key in _APPEND_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_AppendOutputTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" + """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Empty when the call - carried no payloads. + """Opaque token naming the last record written by this call. Absent when the call + carried no payloads, when the batch was a repeat the handler dropped, or when the + store learns positions only at read time. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _ReadInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] @@ -375,6 +425,20 @@ def from_transfer_type( ) if max_records_value_parsed is not None: max_records_value = max_records_value_parsed + if max_records_value < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {max_records_value}", + ) + ) + if max_records_value > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {max_records_value}", + ) + ) wait_ms_value: int | None = None if "wait_ms" in raw: @@ -389,6 +453,20 @@ def from_transfer_type( ) if wait_ms_value_parsed is not None: wait_ms_value = wait_ms_value_parsed + if wait_ms_value < 0: + violations.append( + Violation( + path="wait_ms", + reason=f"must be >= 0, got {wait_ms_value}", + ) + ) + if wait_ms_value > 60000: + violations.append( + Violation( + path="wait_ms", + reason=f"must be <= 60000, got {wait_ms_value}", + ) + ) latest_only_value: bool | None = None if "latest_only" in raw: @@ -446,12 +524,38 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: path="max_records", reason="exceeds ±(2^53-1) integer cap" ) ) + if value.max_records < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {value.max_records}", + ) + ) + if value.max_records > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {value.max_records}", + ) + ) out["max_records"] = value.max_records if value.wait_ms is not None: if abs(value.wait_ms) > 9007199254740991: violations.append( Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") ) + if value.wait_ms < 0: + violations.append( + Violation( + path="wait_ms", reason=f"must be >= 0, got {value.wait_ms}" + ) + ) + if value.wait_ms > 60000: + violations.append( + Violation( + path="wait_ms", reason=f"must be <= 60000, got {value.wait_ms}" + ) + ) out["wait_ms"] = value.wait_ms if value.latest_only is not None: out["latest_only"] = value.latest_only @@ -472,7 +576,9 @@ class ReadInput: """The named stream to read. Empty reads every stream the workflow publishes.""" topic: str | None = None - """Yield only records on this topic. Empty yields every topic.""" + """Yield only records on this topic. Empty yields every topic. Only meaningful when + stream is empty, because an inbound stream has no topics. + """ after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the @@ -485,9 +591,9 @@ class ReadInput: """Return at most this many records. Defaults to 100 when omitted.""" wait_ms: int | None = None - """Wait at most this long for records to arrive before answering. Defaults to 5000 when - omitted. A call that collects nothing answers with no records and the caller's own - token. + """Wait at most this long for records to arrive before answering. The handler shortens + it to fit the request deadline. A call that collects nothing answers with no records + and the caller's own token. """ latest_only: bool | None = None @@ -557,14 +663,16 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "records" and key != "next_token": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _READ_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return ReadOutput( records=records_value, next_token=next_token_value, + additional_properties=additional_properties, ) @typing_extensions.override @@ -585,6 +693,16 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + for key, entry in value.additional_properties.items(): + if key in _READ_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry if violations: raise temporalio.converter.create_payload_validation_error(violations) return out @@ -603,6 +721,10 @@ class ReadOutput: token when the call collected nothing. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _RecordWireTransferTypeConverter( temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] @@ -628,7 +750,7 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: str = typing.cast("typing.Any", None) + frame_value: bytes = typing.cast("typing.Any", None) if "frame" not in raw or raw["frame"] is None: violations.append(Violation(path="frame", reason="required")) else: @@ -636,35 +758,54 @@ def from_transfer_type( if not isinstance(frame_value_raw, str): violations.append(Violation(path="frame", reason="expected string")) else: - frame_value = frame_value_raw + frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) + if frame_value_parsed is not None: + frame_value = frame_value_parsed + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "token" and key != "frame": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _RECORD_WIRE_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, frame=frame_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "RecordWire") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = value.frame + out["frame"] = _format_base64(value.frame) + for key, entry in value.additional_properties.items(): + if key in _RECORD_WIRE_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" + """One record on the wire: its cursor and its frame.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: str - """The base64-encoded record frame, carrying the topic, kind, producer, attempt, - sequence and body. - """ + frame: bytes + """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index ce5604d81..e0673aeab 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -24,9 +24,11 @@ class TemporalStreams: AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. A repeated batch_index for the same - producer attempt is dropped, so a retried call writes once. Supersession records are - not transported: a reader re-synthesizes them from the attempts it observes. + """Append one batch on the caller's account. The handler drops a batch_index it has + already written for this producer attempt, so a retried call writes once, and + rejects an index that skips ahead or a producer attempt it has no state for. + Supersession records are not transported: a reader re-synthesizes them from the + attempts it observes. """ read: Operation[ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index ffa849509..a1cc34631 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -1,18 +1,35 @@ +# The stream endpoint's wire contract. Inputs reject unknown fields so a typo +# fails loudly at the handler; outputs accept them so a handler can add a +# field before every caller has been rebuilt from the newer contract. nexusrpc: "1.0.0" services: TemporalStreams: fqn: TemporalStreams - description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + description: >- + The stream endpoint's two operations. One Temporal-authenticated endpoint + hides the store behind it, so an operator switches storage without + touching callers. Reads hand out batches and an append carries one batch + per call, because a Nexus operation per record costs too much for token + streams. operations: append: fqn: append - description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + description: >- + Append one batch on the caller's account. The handler drops a + batch_index it has already written for this producer attempt, so a + retried call writes once, and rejects an index that skips ahead or a + producer attempt it has no state for. Supersession records are not + transported: a reader re-synthesizes them from the attempts it + observes. input: { $ref: "#/$defs/AppendInput" } output: { $ref: "#/$defs/AppendOutput" } read: fqn: read - description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + description: >- + Answer with the records after the caller's token, or time out. The + call parks until it has max_records records or wait_ms elapses, + whichever comes first, and returns whatever it collected. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -26,16 +43,26 @@ $defs: description: "The workflow whose stream is being written." stream: type: string - description: "The named stream to append to. Empty when the producer writes to a topic instead." + description: >- + The named stream to append to. Empty when the producer writes to a + topic instead. producer_id: type: string - description: "Identifies the writer across its retries, so its attempts can be ordered." + description: >- + Identifies the writer across its retries, so its attempts can be + ordered. attempt: type: integer - description: "The generation this producer is writing. A later attempt supersedes an earlier one." + description: >- + The generation this producer is writing. A later attempt supersedes + an earlier one. batch_index: type: integer - description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + minimum: 1 + description: >- + Counts this producer's batches from 1. The handler drops an index it + has already written for this producer attempt, and rejects one that + skips ahead or that resumes an attempt it never saw start. topic: type: string description: "The topic to append to, when stream is empty." @@ -43,10 +70,15 @@ $defs: type: array items: type: string - description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + contentEncoding: base64 + description: >- + The records to write, each a serialized Temporal Payload. Empty on a + call that only finishes. finish: type: boolean - description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + description: >- + Mark this producer done after writing the batch, so a reader stops + waiting on it. required: - workflow_id - stream @@ -57,12 +89,16 @@ $defs: AppendOutput: type: object - description: "Where the append landed, empty when it wrote nothing." + description: "Where the append landed, when the store can say." properties: cursor: type: string - description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." - additionalProperties: false + description: >- + Opaque token naming the last record written by this call. Absent + when the call carried no payloads, when the batch was a repeat the + handler dropped, or when the store learns positions only at read + time. + additionalProperties: true ReadInput: type: object @@ -73,40 +109,64 @@ $defs: description: "The workflow whose stream is being read." stream: type: string - description: "The named stream to read. Empty reads every stream the workflow publishes." + description: >- + The named stream to read. Empty reads every stream the workflow + publishes. topic: type: string - description: "Yield only records on this topic. Empty yields every topic." + description: >- + Yield only records on this topic. Empty yields every topic. Only + meaningful when stream is empty, because an inbound stream has no + topics. after_token: type: string - description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + description: >- + Opaque cursor from an earlier record or append. The read resumes + strictly after the record it names, so a caller never sees that + record twice. Empty starts at the beginning. The token is produced by + whichever store sits behind the endpoint, so a caller cannot tell + which one that is. max_records: type: integer + minimum: 1 + maximum: 1000 description: "Return at most this many records. Defaults to 100 when omitted." wait_ms: type: integer - description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + minimum: 0 + maximum: 60000 + description: >- + Wait at most this long for records to arrive before answering. The + handler shortens it to fit the request deadline. A call that collects + nothing answers with no records and the caller's own token. latest_only: type: boolean - description: "Answer with the newest position and no records, for a reader that wants to follow from now." + description: >- + Answer with the newest position and no records, for a reader that + wants to follow from now. required: - workflow_id additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its base64 frame." + description: "One record on the wire: its cursor and its frame." properties: token: type: string - description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + description: >- + Opaque cursor naming this record. Pass it as after_token to resume + just past it. frame: type: string - description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + contentEncoding: base64 + description: >- + The record frame, carrying the topic, kind, producer, attempt, + sequence and body. required: - token - frame - additionalProperties: false + additionalProperties: true ReadOutput: type: object @@ -119,5 +179,7 @@ $defs: description: "The records after the caller's token, in stream order." next_token: type: string - description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." - additionalProperties: false + description: >- + Opaque cursor to pass as after_token on the following call. Echoes + the caller's own token when the call collected nothing. + additionalProperties: true From ee5dbe3bdd9420f833da642ba72e7adbb63a7543 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 258/831] Reworked the Nexus front's dedupe, reads, error mapping and endpoint lookup. The handler refuses to continue a producer attempt it has no state for and rejects an index that skips ahead, so a restarted or load-balanced handler cannot lose records behind a success answer. Reads come from one parked subscription per stream, pass bodies through as raw payloads so a codec survives the hop, and stop at the request deadline. The caller commits its batch index only after the endpoint answered, resends a failed batch under the same index, maps transport failures to one error type, and resolves an endpoint name through the operator service. --- temporalio/streams/providers/nexus.py | 685 +++++++++++++++++++------- 1 file changed, 508 insertions(+), 177 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index a73c830ef..8c311d1d9 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -15,33 +15,51 @@ loop, and the caller's batching, cursor handling and codec. Reads hand out batches and an append carries one batch per call, because a -Nexus operation per record costs too much for token streams. Supersession -records are not transported: the caller's reader re-synthesizes them from -the attempts it observes, which is the policy module's job on every -provider. Cursors pass through opaque, so the caller cannot tell which store -produced them. - -One stated prototype limit: append deduplication holds at the handler by -batch index per producer, so a handler restart during a producer's life can -double-append. The store-level fix, a sequence-explicit append in the IDL -contract, is listed in the design doc's work table. +Nexus operation per record costs too much for token streams. Record bodies +cross the handler untouched: it reads the store as raw payloads and frames +them as they are, so a codec that changes the payload encoding survives the +hop and the handler's worker never needs the key. Supersession records are +not transported: the caller's reader re-synthesizes them from the attempts +it observes, which is the policy module's job on every provider. Cursors +pass through opaque, so the caller cannot tell which store produced them. + +The handler keeps one parked read per ``(workflow, stream, topic)`` and +serves consecutive calls from it, so an idle caller does not leave one +abandoned long poll on the store per call. A call whose token does not +match the parked position replaces the subscription, and an idle one is +released after a minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, +by batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh +delegate whose numbering the store would drop as a repeat; the caller opens +a new attempt, which readers report as a supersession. The store-level fix, +a sequence-explicit append in the contract, is listed in the design doc's +work table. And any caller the endpoint admits may touch any workflow's +streams in the namespace; the endpoint's own authorization is the boundary. """ from __future__ import annotations import asyncio -import base64 +import logging +import time import urllib.error import urllib.request -from collections.abc import AsyncGenerator, AsyncIterator -from datetime import timedelta +from collections import OrderedDict +from collections.abc import AsyncGenerator, Mapping +from dataclasses import dataclass +from datetime import datetime, timedelta, timezone from typing import Any, TypeVar import nexusrpc import nexusrpc.handler +from google.protobuf.message import DecodeError import temporalio.converter from temporalio.api.common.v1 import Payload +from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.common import RawValue from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -61,9 +79,16 @@ ) # The contract leaves these unset, so the handler is the one place that says -# what an omitted read bound means. +# what an omitted read bound means. The wait is long because the handler +# shortens it to the request deadline anyway, and a shorter default only +# means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 5000 +_DEFAULT_WAIT_MS = 30_000 +_DEADLINE_MARGIN = timedelta(milliseconds=500) +_DEFAULT_MAX_PRODUCERS = 10_000 +_DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) +_QUEUE_DEPTH = 1000 +_APPEND_TIMEOUT_MS = 30_000 _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -81,6 +106,34 @@ _OutputT = TypeVar("_OutputT") +logger = logging.getLogger(__name__) + + +def _bad_request(message: str) -> nexusrpc.HandlerError: + return nexusrpc.HandlerError( + message, + type=nexusrpc.HandlerErrorType.BAD_REQUEST, + retryable_override=False, + ) + + +@dataclass +class _Subscription: + """One parked read on the store, shared by consecutive calls.""" + + records: asyncio.Queue[StreamRecord[Any]] + position: str + last_used: float + pump: asyncio.Task[None] | None = None + failure: BaseException | None = None + done: bool = False + + +@dataclass +class _ProducerState: + delegate: Any + batch_index: int + @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: @@ -91,17 +144,45 @@ class TemporalStreamsHandler: run handlers for a new store next to handlers for the old one. """ - def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: - """Serve the endpoint out of the provider named by ``provider``.""" + def __init__( + self, + client: Any, + provider: str, + *, + max_producers: int = _DEFAULT_MAX_PRODUCERS, + subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, + **provider_options: Any, + ) -> None: + """Serve the endpoint out of the provider named by ``provider``. + + ``max_producers`` bounds the dedupe state kept per producer attempt; + the oldest is evicted, and a producer evicted mid-life gets a clear + refusal on its next batch rather than a silent drop. + ``subscription_idle`` is how long a parked read outlives its last + caller. + """ self._client = client self._delegate = _provider.instance(provider, **provider_options) - self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + OrderedDict() + ) + self._max_producers = max_producers + self._subscriptions: dict[tuple[str, str, str], _Subscription] = {} + self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} + self._subscription_idle = subscription_idle.total_seconds() @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch.""" + """Append on the caller's account, dropping a repeated batch. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips + ahead, when it continues a producer attempt this handler has + no state for, or when a payload is not a serialized + ``Payload``. + """ topic = input.topic or "" key = ( input.workflow_id, @@ -109,10 +190,18 @@ async def append( input.producer_id, input.attempt, ) - cached = self._producers.get(key) - if cached is not None and input.batch_index <= cached[1]: - return AppendOutput() - if cached is None: + state = self._producers.get(key) + if state is None: + if input.batch_index != 1: + # A fresh delegate would restart its numbering at zero, and + # the store would drop that as a repeat of the first batch. + # Refusing here turns a silent loss into a failure the caller + # can act on by opening a new attempt. + raise _bad_request( + f"producer {input.producer_id!r} attempt {input.attempt} resumed " + f"at batch {input.batch_index} on a handler that has no state for " + "it; open a new attempt" + ) delegate = await self._delegate.producer( self._client, workflow_id=input.workflow_id, @@ -121,117 +210,304 @@ async def append( producer_id=input.producer_id, attempt=input.attempt, ) - else: - delegate = cached[0] - self._producers[key] = (delegate, input.batch_index) - cursor = "" - if input.payloads: - payloads = [] - for encoded in input.payloads: - payload = Payload() - payload.ParseFromString(base64.b64decode(encoded)) - payloads.append(payload) - cursor = (await delegate.append(*payloads)).token + state = _ProducerState(delegate, 0) + elif input.batch_index <= state.batch_index: + # A repeat, or a producer that restarted its numbering: either + # way the store already holds the batch. + self._producers.move_to_end(key) + return AppendOutput() + elif input.batch_index != state.batch_index + 1: + raise _bad_request( + f"batch {input.batch_index} skips ahead of {state.batch_index} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) + payloads = self._payloads(input.payloads) + cursor: str | None = None + if payloads: + appended = await state.delegate.append(*payloads) + cursor = appended.token if appended is not None else None if input.finish: - await delegate.finish() + await state.delegate.finish() + self._producers.pop(key, None) + return AppendOutput(cursor=cursor) + # Recorded only once the store accepted the batch, so a failed append + # is not mistaken for a repeat when the caller retries it. + state.batch_index = input.batch_index + self._producers[key] = state + self._producers.move_to_end(key) + while len(self._producers) > self._max_producers: + self._producers.popitem(last=False) return AppendOutput(cursor=cursor) + @staticmethod + def _payloads(encoded: list[bytes] | None) -> list[Payload]: + payloads = [] + for index, raw in enumerate(encoded or []): + payload = Payload() + try: + payload.ParseFromString(raw) + except DecodeError as error: + raise _bad_request( + f"payloads[{index}] is not a serialized Temporal Payload: {error}" + ) from error + payloads.append(payload) + return payloads + @nexusrpc.handler.sync_operation async def read( - self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream or "" - ) + stream = input.stream or "" topic = input.topic or None if input.latest_only: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=stream + ) return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms - converter = temporalio.converter.DataConverter.default.payload_converter - records: list[RecordWire] = [] - next_token = input.after_token or "" - subscription = delegate.read( - after=Cursor(input.after_token) if input.after_token else BEGINNING, - topic=topic, - ) - - async def collect() -> None: - nonlocal next_token - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + if ctx.request_deadline is not None: + # The server answers the caller with a timeout at the deadline + # whatever this call does, so collecting past it only holds the + # slot for an answer nobody receives. + deadline = ctx.request_deadline + if deadline.tzinfo is None: + deadline = deadline.replace(tzinfo=timezone.utc) + left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN + wait = max(0.0, min(wait, left.total_seconds())) + after = input.after_token or "" + key = (input.workflow_id, stream, topic or "") + await self._expire_subscriptions() + lock = self._read_locks.setdefault(key, asyncio.Lock()) + async with lock: + subscription = self._subscriptions.get(key) + if subscription is None or subscription.position != after: + if subscription is not None: + await self._drop(key) + subscription = await self._subscribe( + key, input.workflow_id, stream, topic, after ) - next_token = record.cursor.token - if len(records) >= max_records: - return + records, next_token = await self._drain(subscription, max_records, wait) + subscription.position = next_token + subscription.last_used = time.monotonic() + if subscription.done and subscription.records.empty(): + # The store ended the read, as the Workflow Streams delegate + # does when the run closes. Nothing more will arrive on it. + await self._drop(key) + return ReadOutput(records=records, next_token=next_token) + + async def _subscribe( + self, + key: tuple[str, str, str], + workflow_id: str, + stream: str, + topic: str | None, + after: str, + ) -> _Subscription: + delegate = await self._delegate.consumer( + self._client, workflow_id=workflow_id, stream=stream + ) + # Raw payloads: the handler frames what the store holds without + # decoding it, so an encoding only the caller's codec understands + # passes through untouched. + source = delegate.read( + after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + ) + subscription = _Subscription( + records=asyncio.Queue(maxsize=_QUEUE_DEPTH), + position=after, + last_used=time.monotonic(), + ) + async def pump() -> None: + try: + async for record in source: + if record.kind is RecordKind.SUPERSEDED: + continue + await subscription.records.put(record) + except asyncio.CancelledError: + raise + except Exception as error: + subscription.failure = error + finally: + subscription.done = True + if isinstance(source, AsyncGenerator): + await source.aclose() + + subscription.pump = asyncio.create_task(pump()) + self._subscriptions[key] = subscription + return subscription + + async def _drain( + self, subscription: _Subscription, max_records: int, wait: float + ) -> tuple[list[RecordWire], str]: + records: list[RecordWire] = [] + next_token = subscription.position + queue = subscription.records + deadline = time.monotonic() + wait + while len(records) < max_records: + if queue.empty(): + remaining = deadline - time.monotonic() + if records or remaining <= 0: + break + if subscription.done: + # Honour the wait even though nothing can arrive, so a + # caller polling a closed stream does not spin on the + # endpoint. + await asyncio.sleep(remaining) + break + try: + record = await asyncio.wait_for(queue.get(), remaining) + except asyncio.TimeoutError: + break + else: + record = queue.get_nowait() + records.append(self._wire(record)) + next_token = record.cursor.token + if not records and subscription.failure is not None: + failure, subscription.failure = subscription.failure, None + raise failure + return records, next_token + + @staticmethod + def _wire(record: StreamRecord[Any]) -> RecordWire: + body = ( + record.value.payload.SerializeToString() + if isinstance(record.value, RawValue) + else b"" + ) + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + return RecordWire(token=record.cursor.token, frame=frame) + + async def close(self) -> None: + """Release every parked read. + + Call it when the worker hosting this handler stops, so subscriptions + waiting on the store do not outlive it. + """ + for key in list(self._subscriptions): + await self._drop(key) + self._read_locks.clear() + + async def _drop(self, key: tuple[str, str, str]) -> None: + subscription = self._subscriptions.pop(key, None) + if subscription is None or subscription.pump is None: + return + subscription.pump.cancel() try: - # `wait_for` rather than `asyncio.timeout`, which 3.10 does not - # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), wait_ms / 1000) - except asyncio.TimeoutError: + await subscription.pump + except (asyncio.CancelledError, Exception): pass - finally: - # The delegate's read parks against its store, and this call - # answers before the caller asks again, so let it go now rather - # than when the collector is next swept. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - return ReadOutput(records=records, next_token=next_token) + async def _expire_subscriptions(self) -> None: + cutoff = time.monotonic() - self._subscription_idle + for key in [k for k, s in self._subscriptions.items() if s.last_used < cutoff]: + lock = self._read_locks.get(key) + if lock is not None and lock.locked(): + continue + await self._drop(key) + self._read_locks.pop(key, None) + + +class StreamEndpointError(RuntimeError): + """The stream endpoint refused a call or could not be reached. -def _post(url: str, body: bytes) -> bytes: + ``status`` is the HTTP status when the endpoint answered, and ``None`` + when the connection itself failed. + """ + + def __init__(self, message: str, *, status: int | None = None) -> None: + """Carry the endpoint's answer, or the reason it gave none.""" + super().__init__(message) + self.status = status + + +def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: request = urllib.request.Request( url, data=body, - headers={"Content-Type": "application/json"}, + headers={ + "Content-Type": "application/json", + # Tells the server how long the handler may park, so it does not + # time the call out ahead of a wait the caller asked for. + "Request-Timeout": f"{timeout_ms}ms", + **headers, + }, method="POST", ) try: - with urllib.request.urlopen(request, timeout=30) as response: + with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") - raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + raise StreamEndpointError( + f"stream endpoint call failed ({error.code}): {detail}", status=error.code + ) from error + except urllib.error.URLError as error: + raise StreamEndpointError( + f"stream endpoint unreachable at {url}: {error.reason}" + ) from error + +class _Front: + """Everything the caller half needs to reach one endpoint.""" -async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: - # The contract types carry their own JSON encoding, so the raw caller and - # the worker serving the operation agree on the body without either of - # them spelling the fields out. - contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) - payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") - return contract.from_payloads([payload], [output])[0] + def __init__( + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + headers: Mapping[str, str], + wait_ms: int, + max_records: int, + ) -> None: + self.base_url = base_url + self.converter = data_converter.payload_converter + self.codec = data_converter.payload_codec + self.headers = dict(headers) + self.wait_ms = wait_ms + self.max_records = max_records + + async def invoke( + self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + ) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller + # and the worker serving the operation agree on the body without + # either of them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread( + _post, + f"{self.base_url}/{operation}", + contract.to_payloads([request])[0].data, + self.headers, + timeout_ms, + ) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it.""" + """Appends through the stream endpoint; framing happens behind it. + + Calls are serialized and the batch index is committed only once the + endpoint answered. A batch whose call raised stays pending and is sent + again under the same index, either when the caller retries the same + values or ahead of whatever the caller sends next, so an ambiguous + failure writes the batch once and loses nothing. + """ def __init__( self, - base_url: str, - data_converter: temporalio.converter.DataConverter, + front: _Front, workflow_id: str, stream: str, topic: str, @@ -239,78 +515,92 @@ def __init__( attempt: int, ) -> None: """Bind this producer to one stream or topic on the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None + self._lock = asyncio.Lock() @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the endpoint.""" + if not values: + return None payloads = [ value if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + else self._front.converter.to_payloads([value])[0] for value in values ] - if self._codec is not None: - # The endpoint is the edge of this process, so a configured codec - # runs here rather than at the handler: whoever hosts the endpoint - # never holds the plaintext. - payloads = await self._codec.encode(payloads) - encoded = [ - base64.b64encode(payload.SerializeToString()).decode() - for payload in payloads - ] - return Cursor((await self._call(payloads=encoded)).cursor or "") + answer = await self._call(payloads, finish=False) + return Cursor(answer.cursor) if answer.cursor else None async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" - await self._call(finish=True) + await self._call([], finish=True) + + async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: + # Identity is taken before the codec runs: a codec may encrypt with a + # fresh nonce each time, and the retry has to be recognised anyway. + identity = tuple(payload.SerializeToString() for payload in payloads) + if self._front.codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._front.codec.encode(payloads) + encoded = [payload.SerializeToString() for payload in payloads] + async with self._lock: + if self._pending is not None and self._pending[1:] != (identity, finish): + # The caller moved on from a batch the endpoint may or may + # not have applied. It goes first under its own index, so the + # handler drops it if it landed and writes it if not, and the + # new batch takes the index after it. + await self._send(*self._pending) + elif self._pending is not None: + return await self._send(*self._pending) + request = self._request(self._batch_index + 1, encoded, finish) + return await self._send(request, identity, finish) + + def _request( + self, batch_index: int, payloads: list[bytes], finish: bool + ) -> AppendInput: + return AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=batch_index, + topic=self._topic, + payloads=payloads, + finish=finish, + ) - async def _call( - self, payloads: list[str] | None = None, finish: bool = False + async def _send( + self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: - self._batch_index += 1 - return await _invoke( - f"{self._base_url}/{_APPEND_OPERATION}", - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ), - AppendOutput, + self._pending = (request, identity, finish) + answer = await self._front.invoke( + _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS ) + self._batch_index = request.batch_index + self._pending = None + return answer class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - workflow_id: str, - stream: str, - ) -> None: + def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream @@ -320,31 +610,37 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, one endpoint batch at a time.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() token = after.token while True: - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, topic=topic or "", after_token=token, + max_records=self._front.max_records, + wait_ms=self._front.wait_ms, ), ReadOutput, + timeout_ms=self._front.wait_ms + 5000, ) for wire in answer.records or []: + cursor = Cursor(wire.token) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire.frame) + wire.frame ) - except ValueError: + except ValueError as error: + # Same answer as every other reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -364,8 +660,8 @@ async def read( async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, @@ -373,6 +669,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: latest_only=True, ), ReadOutput, + timeout_ms=_APPEND_TIMEOUT_MS, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING @@ -380,34 +677,58 @@ async def latest(self, *, topic: str | None = None) -> Cursor: async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - if self._codec is not None: - payload = (await self._codec.decode([payload]))[0] + if self._front.codec is not None: + payload = (await self._front.codec.decode([payload]))[0] if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + return self._front.converter.from_payloads([payload])[0] + return self._front.converter.from_payloads([payload], [as_type])[0] class _NexusProvider: name = "nexus" def __init__(self) -> None: - self._base_url: str | None = None + self._endpoint: str | None = None + self._endpoint_id: str | None = None + self._http_address = "http://127.0.0.1:7243" + self._service = _SERVICE_NAME self._data_converter: temporalio.converter.DataConverter | None = None + self._client: Any = None + self._headers: dict[str, str] = {} + self._wait_ms = _DEFAULT_WAIT_MS + self._max_records = _DEFAULT_MAX_RECORDS def configure(self, **options: Any) -> None: + """Point the caller half at one endpoint. + + ``endpoint`` is the endpoint's name when ``client`` is given, and is + resolved to its id through the operator service on first use; without + a client it has to be the id, because the HTTP ingress dispatches by + id. ``headers`` go on every request, which is where an authorization + header belongs. ``wait_ms`` and ``max_records`` are the read bounds + the caller asks the handler for. + """ endpoint = options.pop("endpoint", None) - http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", _SERVICE_NAME) - data_converter = options.pop("data_converter", None) + self._http_address = options.pop("http_address", self._http_address) + self._service = options.pop("service", _SERVICE_NAME) + self._data_converter = options.pop("data_converter", None) + self._client = options.pop("client", None) + self._headers = dict(options.pop("headers", None) or {}) + self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) + self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) if options: raise TypeError( - "the nexus provider takes endpoint, http_address, service and " - f"data_converter, got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service, " + f"data_converter, client, headers, wait_ms and max_records, got " + f"{sorted(options)}" ) if not endpoint: - raise TypeError("the nexus provider needs endpoint=") - self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - self._data_converter = data_converter + raise TypeError( + "the nexus provider needs endpoint= together with " + "client=, or endpoint= on its own" + ) + self._endpoint = endpoint + self._endpoint_id = None def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -426,10 +747,31 @@ def open_write(self, topic: str) -> WriteSink: del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) - def _url(self) -> str: - if self._base_url is None: + async def _front(self, client: Any) -> _Front: + if self._endpoint is None: raise RuntimeError("configure the nexus provider before opening handles") - return self._base_url + if self._endpoint_id is None: + resolver = self._client if self._client is not None else client + if resolver is None: + self._endpoint_id = self._endpoint + else: + found = await resolver.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") + self._endpoint_id = found.endpoints[0].id + base_url = ( + f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" + f"/services/{self._service}" + ) + return _Front( + base_url, + self._converter(client), + self._headers, + self._wait_ms, + self._max_records, + ) async def producer( self, @@ -441,25 +783,14 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> NexusProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return NexusProducer( - self._url(), - self._converter(client), - workflow_id, - stream, - topic, - producer_id, - attempt, + await self._front(client), workflow_id, stream, topic, producer_id, attempt ) async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + return NexusConsumer(await self._front(client), workflow_id, stream) def _converter(self, client: Any) -> temporalio.converter.DataConverter: if self._data_converter is not None: From 5468b39ad47882005a113483a0a0de13de83bfea Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 259/831] Covered the Nexus front's refusals, retries, subscription reuse and deadline clamp. --- tests/streams/test_nexus_provider.py | 334 ++++++++++++++++++++++----- 1 file changed, 274 insertions(+), 60 deletions(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 18679ad5f..77cec6f4e 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -11,8 +11,8 @@ and an endpoint named ``streams-e2e`` targeting task queue ``streams-handlers-e2e``. -The codec test stands the endpoint up in this process instead, because what -it checks is the bytes the caller puts on the wire. +Everything else stands the endpoint up in this process, because what it +checks is the bytes the caller puts on the wire and the handler's own rules. """ from __future__ import annotations @@ -22,11 +22,13 @@ import dataclasses import json import os -import subprocess import uuid -from collections.abc import Sequence -from typing import Any, cast +from collections.abc import Mapping, Sequence +from datetime import datetime, timedelta, timezone +from typing import Any +import nexusrpc +import nexusrpc.handler import pytest import temporalio.converter @@ -38,7 +40,10 @@ from temporalio.streams._provider import instance from temporalio.streams.providers import memory, nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.streams.providers.nexus import ( + StreamEndpointError, + TemporalStreamsHandler, +) from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take @@ -50,51 +55,27 @@ ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] - - -def _endpoint_id() -> str: - # The HTTP ingress dispatches by endpoint id, not name. - out = subprocess.run( - [ - "temporal", - "operator", - "nexus", - "endpoint", - "get", - "--name", - ENDPOINT, - "-o", - "json", - "--address", - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), - ], - capture_output=True, - text=True, - check=True, - ) - return json.loads(out.stdout)["id"] +READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] @live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage - # provider; only the caller goes through the front. + # provider; only the caller goes through the front, and it names the + # endpoint the way an operator does, by name. streams.configure(provider="workflow_streams") client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", - endpoint=_endpoint_id(), + endpoint=ENDPOINT, + client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + wait_ms=5000, ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + handler = TemporalStreamsHandler(client, provider="workflow_streams") - async with Worker( - client, - task_queue=HANDLER_TQ, - nexus_service_handlers=[ - TemporalStreamsHandler(client, provider="workflow_streams") - ], - ): + async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", @@ -135,10 +116,11 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + await handler.close() class ScrambleCodec(temporalio.converter.PayloadCodec): - """Flips every byte of a payload, so the middle holds nothing readable.""" + """Flips every byte and labels the result with an encoding only it can read.""" KEY = 0x5A @@ -146,7 +128,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: """Wrap each payload as opaque bytes nothing downstream can read.""" return [ Payload( - metadata={"encoding": b"binary/plain"}, + metadata={"encoding": b"binary/scrambled"}, data=self._flip(payload.SerializeToString()), ) for payload in payloads @@ -166,45 +148,98 @@ def _flip(cls, data: bytes) -> bytes: return bytes(byte ^ cls.KEY for byte in data) +class _NeverCancelled(nexusrpc.handler.OperationTaskCancellation): + def is_cancelled(self) -> bool: + return False + + def cancellation_reason(self) -> str | None: + return None + + def wait_until_cancelled_sync(self, timeout: float | None = None) -> bool: + del timeout + return False + + async def wait_until_cancelled(self) -> None: + await asyncio.Event().wait() + + +def _context( + operation: str, deadline: datetime | None = None +) -> nexusrpc.handler.StartOperationContext: + return nexusrpc.handler.StartOperationContext( + service=nexus._SERVICE_NAME, # pyright: ignore[reportPrivateUsage] + operation=operation, + headers={}, + task_cancellation=_NeverCancelled(), + request_deadline=deadline, + request_id=uuid.uuid4().hex, + ) + + async def _dispatch( handler: TemporalStreamsHandler, operation: str, request: Any ) -> Any: - context = cast("Any", None) # neither operation looks at it if operation == APPEND_OPERATION: - return await handler.append(context, request) - return await handler.read(context, request) + return await handler.append(_context(operation), request) + return await handler.read(_context(operation), request) def _in_process_endpoint( handler: TemporalStreamsHandler, posted: list[bytes], answered: list[bytes], + *, + fail_after_applying: list[str] | None = None, ) -> Any: - """Serve the caller's posts from ``handler``, recording both directions.""" + """Serve the caller's posts from ``handler``, recording both directions. + + ``fail_after_applying`` names operations whose first call is applied and + then reported as a transport failure, the ambiguous case a retry has to + survive. + """ contract = temporalio.converter.DataConverter.default.payload_converter loop = asyncio.get_running_loop() + failing = set(fail_after_applying or []) - def post(url: str, body: bytes) -> bytes: + def post( + url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + ) -> bytes: + del headers, timeout_ms posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput request: Any = contract.from_payloads( [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] )[0] - if request_type is ReadInput: - # This endpoint has no other traffic to wait for, so park briefly - # rather than for the contract's default. - request.wait_ms = 200 - answer = asyncio.run_coroutine_threadsafe( - _dispatch(handler, operation, request), loop - ).result() + try: + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + except nexusrpc.HandlerError as error: + raise StreamEndpointError(str(error), status=400) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) + if operation in failing: + failing.discard(operation) + raise StreamEndpointError("connection reset after the handler answered") return raw return post +def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: + return instance( + "nexus", + endpoint="in-process", + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + wait_ms=200, + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + + async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, @@ -215,13 +250,7 @@ async def _loop_through_an_endpoint( answered: list[bytes] = [] handler = TemporalStreamsHandler(None, provider="memory") monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = instance( - "nexus", - endpoint="in-process", - data_converter=dataclasses.replace( - temporalio.converter.DataConverter.default, payload_codec=codec - ), - ) + front = _front(codec) workflow_id = "wf-codec" producer = await front.producer( @@ -263,7 +292,9 @@ async def test_the_caller_encodes_records_with_the_configured_codec( monkeypatch, ScrambleCodec() ) - # The value survives the hop, so the codec is applied on both sides. + # The value survives the hop although the handler cannot read the + # encoding, so the body passed through it untouched and the codec ran on + # the caller alone. assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] assert records[0].value == {"secret": "tuna"} # Neither direction carried the plaintext. @@ -281,3 +312,186 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( assert records[0].value == {"secret": "tuna"} assert b"tuna" in _appended_bytes(posted) assert b"tuna" in _answered_bodies(answered) + + +def _append( + workflow_id: str, batch_index: int, *values: Any, finish: bool = False +) -> AppendInput: + converter = temporalio.converter.DataConverter.default.payload_converter + return AppendInput( + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + batch_index=batch_index, + payloads=[ + converter.to_payloads([value])[0].SerializeToString() for value in values + ], + finish=finish, + ) + + +async def _stored(workflow_id: str) -> list[Any]: + consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") + out: list[Any] = [] + async for record in consumer.read(type=dict): + if record.kind is RecordKind.DATA: + out.append(record.value) + if await consumer.latest() == record.cursor: + break + return out + + +@pytest.fixture +def _memory_store(): # pyright: ignore[reportUnusedFunction] + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): + # A second handler instance stands in for a restarted or load-balanced + # handler worker: it shares the store but not the dedupe state. + first = TemporalStreamsHandler(None, provider="memory") + second = TemporalStreamsHandler(None, provider="memory") + await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert failed.value.retryable_override is False + # The store holds the first batch and nothing was silently lost or doubled. + assert await _stored("wf") == [{"n": 1}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_handler_drops_repeats_and_rejects_gaps(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # An exact repeat is dropped with a success answer and no position. + repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert repeat.cursor is None + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_malformed_payload_is_the_callers_fault(): + handler = TemporalStreamsHandler(None, provider="memory") + request = _append("wf", 1) + request.payloads = [b"\xff\xfe not a payload"] + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, request) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + await producer.finish() + indexes = [json.loads(body)["batch_index"] for body in posted] + # The retry re-sent index 1, which the handler dropped as a repeat, so + # the store holds each record once. + assert indexes == [1, 1, 2, 3] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_failed_append_goes_out_before_the_next_one( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + # The caller moves on without retrying; the pending batch is replayed + # first under its own index and the new one takes the next. + await producer.append({"n": 2}) + indexes = [json.loads(body)["batch_index"] for body in posted] + assert indexes == [1, 1, 2] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_consecutive_reads_share_one_parked_subscription(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) + first = await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ) + assert len(first.records) == 1 + parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] + pump = next(iter(parked.values())).pump + # A call that resumes where the last one stopped drains the same + # subscription instead of parking a second read on the store. + second = await _dispatch( + handler, + READ_OPERATION, + ReadInput( + workflow_id="wf", + stream="inputs", + after_token=first.next_token, + max_records=1, + wait_ms=200, + ), + ) + assert len(second.records) == 1 + assert second.next_token != first.next_token + assert len(parked) == 1 and next(iter(parked.values())).pump is pump + # A call from somewhere else replaces it. + await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ) + assert len(parked) == 1 and next(iter(parked.values())).pump is not pump + await handler.close() + assert not parked + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_read_wait_is_cut_to_the_request_deadline(): + handler = TemporalStreamsHandler(None, provider="memory") + started = asyncio.get_running_loop().time() + answer = await handler.read( + _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), + ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ) + assert answer.records == [] and answer.next_token == "" + assert asyncio.get_running_loop().time() - started < 5 + await handler.close() From 31f9748d7e198dd0fcd6d02b1d12571f8cef72e4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 260/831] Carried the StreamRecord proto and producer identity on the stream contract. A record crosses the endpoint as the serialized proto every store keeps, an append names its topic, run and sequence, and a read says when the store ended it. --- .../providers/_nexus_generated/models.py | 245 +++++++++++------- .../providers/_nexus_generated/services.py | 17 +- .../providers/temporal_streams.nexusrpc.yaml | 96 ++++--- 3 files changed, 224 insertions(+), 134 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index d00cbcc63..2677843ef 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -22,10 +22,10 @@ _APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) -_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token", "done"}) -_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "record"}) class _AppendInputTransferTypeConverter( @@ -54,15 +54,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str = typing.cast("typing.Any", None) - if "stream" not in raw or raw["stream"] is None: - violations.append(Violation(path="stream", reason="required")) + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: + violations.append( + Violation(path="run_id", reason="explicit null not allowed") + ) + else: + if not isinstance(run_id_value_raw, str): + violations.append( + Violation(path="run_id", reason="expected string") + ) + else: + run_id_value = run_id_value_raw + + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) else: - stream_value_raw = raw["stream"] - if not isinstance(stream_value_raw, str): - violations.append(Violation(path="stream", reason="expected string")) + topic_value_raw = raw["topic"] + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - stream_value = stream_value_raw + topic_value = topic_value_raw producer_id_value: str = typing.cast("typing.Any", None) if "producer_id" not in raw or raw["producer_id"] is None: @@ -87,6 +102,24 @@ def from_transfer_type( if attempt_value_parsed is not None: attempt_value = attempt_value_parsed + sequence_value: int = typing.cast("typing.Any", None) + if "sequence" not in raw or raw["sequence"] is None: + violations.append(Violation(path="sequence", reason="required")) + else: + sequence_value_raw = raw["sequence"] + sequence_value_parsed = _parse_spec_integer( + sequence_value_raw, "sequence", violations + ) + if sequence_value_parsed is not None: + sequence_value = sequence_value_parsed + if sequence_value < 0: + violations.append( + Violation( + path="sequence", + reason=f"must be >= 0, got {sequence_value}", + ) + ) + batch_index_value: int = typing.cast("typing.Any", None) if "batch_index" not in raw or raw["batch_index"] is None: violations.append(Violation(path="batch_index", reason="required")) @@ -105,19 +138,6 @@ def from_transfer_type( ) ) - topic_value: str | None = None - if "topic" in raw: - topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) - else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw - payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] @@ -175,11 +195,12 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" + and key != "topic" and key != "producer_id" and key != "attempt" + and key != "sequence" and key != "batch_index" - and key != "topic" and key != "payloads" and key != "finish" ): @@ -188,11 +209,12 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return AppendInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, + topic=topic_value, producer_id=producer_id_value, attempt=attempt_value, + sequence=sequence_value, batch_index=batch_index_value, - topic=topic_value, payloads=payloads_value, finish=finish_value, ) @@ -202,13 +224,24 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - out["stream"] = value.stream + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic out["producer_id"] = value.producer_id if abs(value.attempt) > 9007199254740991: violations.append( Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") ) out["attempt"] = value.attempt + if abs(value.sequence) > 9007199254740991: + violations.append( + Violation(path="sequence", reason="exceeds ±(2^53-1) integer cap") + ) + if value.sequence < 0: + violations.append( + Violation(path="sequence", reason=f"must be >= 0, got {value.sequence}") + ) + out["sequence"] = value.sequence if abs(value.batch_index) > 9007199254740991: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") @@ -220,8 +253,6 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: ) ) out["batch_index"] = value.batch_index - if value.topic is not None: - out["topic"] = value.topic if value.payloads is not None: out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: @@ -239,31 +270,45 @@ class AppendInput: workflow_id: str """The workflow whose stream is being written.""" - stream: str - """The named stream to append to. Empty when the producer writes to a topic instead.""" + run_id: str | None = None + """The run to address. Empty addresses the workflow's execution chain, which is what a + producer normally wants. + """ + + topic: str + """The topic of the workflow's stream to append to.""" producer_id: str - """Identifies the writer across its retries, so its attempts can be ordered.""" + """Identifies the writer across its retries, so its attempts can be ordered. Never + empty here: the caller resolved it, from the activity context when it was not given. + """ attempt: int """The generation this producer is writing. A later attempt supersedes an earlier one.""" - batch_index: int - """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt, and rejects one that skips ahead or that resumes - an attempt it never saw start. + sequence: int + """The producer's sequence of the first record in this batch; the batch is numbered + from it and a finish takes the next number. It has to continue where the previous + batch ended, so the handler and the store agree on every record's position within + the attempt. """ - topic: str | None = None - """The topic to append to, when stream is empty.""" + batch_index: int + """Counts this producer's batches from 1. The handler answers a repeat of the last + index with the original's position, and refuses one that skips ahead, one already + behind the last, or one that resumes an attempt it never saw start. + """ payloads: list[bytes] | None = None - """The records to write, each a serialized Temporal Payload. Empty on a call that only - finishes. + """The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the caller has already + run on them. Empty on a call that only finishes. """ finish: bool | None = None - """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + """Write FINISH for this producer after the batch: it will write nothing more on the + topic. Says nothing about the producer's outcome. + """ class _AppendOutputTransferTypeConverter( @@ -333,9 +378,9 @@ class AppendOutput: """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Absent when the call - carried no payloads, when the batch was a repeat the handler dropped, or when the - store learns positions only at read time. + """Opaque token naming the last record written by this call, or by the original when + the call repeated the last batch. Absent when the store learns positions only at + read time; such a caller positions itself with a latest_only read. """ additional_properties: dict[str, typing.Any] = dataclasses.field( @@ -369,33 +414,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str | None = None - if "stream" in raw: - stream_value_raw = raw["stream"] - if stream_value_raw is None: + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: violations.append( - Violation(path="stream", reason="explicit null not allowed") + Violation(path="run_id", reason="explicit null not allowed") ) else: - if not isinstance(stream_value_raw, str): + if not isinstance(run_id_value_raw, str): violations.append( - Violation(path="stream", reason="expected string") + Violation(path="run_id", reason="expected string") ) else: - stream_value = stream_value_raw + run_id_value = run_id_value_raw - topic_value: str | None = None - if "topic" in raw: + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) + else: topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw + topic_value = topic_value_raw after_token_value: str | None = None if "after_token" in raw: @@ -486,7 +528,7 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" and key != "topic" and key != "after_token" and key != "max_records" @@ -498,7 +540,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return ReadInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, topic=topic_value, after_token=after_token_value, max_records=max_records_value, @@ -511,10 +553,9 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - if value.stream is not None: - out["stream"] = value.stream - if value.topic is not None: - out["topic"] = value.topic + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic if value.after_token is not None: out["after_token"] = value.after_token if value.max_records is not None: @@ -572,19 +613,19 @@ class ReadInput: workflow_id: str """The workflow whose stream is being read.""" - stream: str | None = None - """The named stream to read. Empty reads every stream the workflow publishes.""" - - topic: str | None = None - """Yield only records on this topic. Empty yields every topic. Only meaningful when - stream is empty, because an inbound stream has no topics. + run_id: str | None = None + """Pin the read to this run. Empty follows the workflow's execution chain across + continue-as-new. """ + topic: str + """The topic of the workflow's stream to read.""" + after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a - caller cannot tell which one that is. + caller cannot tell which one that is, and a token from another store is refused. """ max_records: int | None = None @@ -663,6 +704,19 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + done_value: bool | None = None + if "done" in raw: + done_value_raw = raw["done"] + if done_value_raw is None: + violations.append( + Violation(path="done", reason="explicit null not allowed") + ) + else: + if not isinstance(done_value_raw, bool): + violations.append(Violation(path="done", reason="expected boolean")) + else: + done_value = done_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: if key not in _READ_OUTPUT_DECLARED: @@ -672,6 +726,7 @@ def from_transfer_type( return ReadOutput( records=records_value, next_token=next_token_value, + done=done_value, additional_properties=additional_properties, ) @@ -693,6 +748,8 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + if value.done is not None: + out["done"] = value.done for key, entry in value.additional_properties.items(): if key in _READ_OUTPUT_DECLARED: violations.append( @@ -721,6 +778,12 @@ class ReadOutput: token when the call collected nothing. """ + done: bool | None = None + """The store ended the read: the owning execution, or its chain, is closed and every + retained record after the caller's token has been delivered. Nothing more will + arrive, so the caller stops. + """ + additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict ) @@ -750,17 +813,19 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: bytes = typing.cast("typing.Any", None) - if "frame" not in raw or raw["frame"] is None: - violations.append(Violation(path="frame", reason="required")) + record_value: bytes = typing.cast("typing.Any", None) + if "record" not in raw or raw["record"] is None: + violations.append(Violation(path="record", reason="required")) else: - frame_value_raw = raw["frame"] - if not isinstance(frame_value_raw, str): - violations.append(Violation(path="frame", reason="expected string")) + record_value_raw = raw["record"] + if not isinstance(record_value_raw, str): + violations.append(Violation(path="record", reason="expected string")) else: - frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) - if frame_value_parsed is not None: - frame_value = frame_value_parsed + record_value_parsed = _parse_base64( + record_value_raw, "record", violations + ) + if record_value_parsed is not None: + record_value = record_value_parsed additional_properties: dict[str, typing.Any] = {} for key in raw: @@ -770,7 +835,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, - frame=frame_value, + record=record_value, additional_properties=additional_properties, ) @@ -779,7 +844,7 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = _format_base64(value.frame) + out["record"] = _format_base64(value.record) for key, entry in value.additional_properties.items(): if key in _RECORD_WIRE_DECLARED: violations.append( @@ -798,13 +863,15 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its frame.""" + """One record on the wire: its cursor and the record itself.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: bytes - """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + record: bytes + """The serialized temporal.api.stream.v1.StreamRecord: topic, kind, producer_id, + attempt, sequence and body, as the store holds it. + """ additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index e0673aeab..591e31046 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -17,18 +17,20 @@ class TemporalStreams: """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation - per record costs too much for token streams. + per record costs too much for token streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so a caller + in any language decodes it with the api protos alone. """ append: Operation[ AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. The handler drops a batch_index it has - already written for this producer attempt, so a retried call writes once, and - rejects an index that skips ahead or a producer attempt it has no state for. - Supersession records are not transported: a reader re-synthesizes them from the - attempts it observes. + """Append one batch on the caller's account. The handler writes a batch once: a repeat + of the last batch_index answers with where the original landed, and an index that + skips ahead, one already behind the last, a sequence that does not continue, or a + producer attempt the handler has no state for is refused. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. """ read: Operation[ @@ -37,5 +39,6 @@ class TemporalStreams: ] = Operation(name="read") """Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns - whatever it collected. + whatever it collected. It says when the store has ended the read, so the caller can + stop. """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index a1cc34631..bf97209b3 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -11,15 +11,18 @@ services: hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token - streams. + streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so + a caller in any language decodes it with the api protos alone. operations: append: fqn: append description: >- - Append one batch on the caller's account. The handler drops a - batch_index it has already written for this producer attempt, so a - retried call writes once, and rejects an index that skips ahead or a - producer attempt it has no state for. Supersession records are not + Append one batch on the caller's account. The handler writes a batch + once: a repeat of the last batch_index answers with where the + original landed, and an index that skips ahead, one already behind + the last, a sequence that does not continue, or a producer attempt + the handler has no state for is refused. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes. input: { $ref: "#/$defs/AppendInput" } @@ -29,7 +32,8 @@ services: description: >- Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, - whichever comes first, and returns whatever it collected. + whichever comes first, and returns whatever it collected. It says + when the store has ended the read, so the caller can stop. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -41,49 +45,61 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being written." - stream: + run_id: type: string description: >- - The named stream to append to. Empty when the producer writes to a - topic instead. + The run to address. Empty addresses the workflow's execution chain, + which is what a producer normally wants. + topic: + type: string + description: "The topic of the workflow's stream to append to." producer_id: type: string description: >- Identifies the writer across its retries, so its attempts can be - ordered. + ordered. Never empty here: the caller resolved it, from the activity + context when it was not given. attempt: type: integer description: >- The generation this producer is writing. A later attempt supersedes an earlier one. + sequence: + type: integer + minimum: 0 + description: >- + The producer's sequence of the first record in this batch; the batch + is numbered from it and a finish takes the next number. It has to + continue where the previous batch ended, so the handler and the + store agree on every record's position within the attempt. batch_index: type: integer minimum: 1 description: >- - Counts this producer's batches from 1. The handler drops an index it - has already written for this producer attempt, and rejects one that - skips ahead or that resumes an attempt it never saw start. - topic: - type: string - description: "The topic to append to, when stream is empty." + Counts this producer's batches from 1. The handler answers a repeat + of the last index with the original's position, and refuses one that + skips ahead, one already behind the last, or one that resumes an + attempt it never saw start. payloads: type: array items: type: string contentEncoding: base64 description: >- - The records to write, each a serialized Temporal Payload. Empty on a - call that only finishes. + The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the + caller has already run on them. Empty on a call that only finishes. finish: type: boolean description: >- - Mark this producer done after writing the batch, so a reader stops - waiting on it. + Write FINISH for this producer after the batch: it will write nothing + more on the topic. Says nothing about the producer's outcome. required: - workflow_id - - stream + - topic - producer_id - attempt + - sequence - batch_index additionalProperties: false @@ -94,10 +110,10 @@ $defs: cursor: type: string description: >- - Opaque token naming the last record written by this call. Absent - when the call carried no payloads, when the batch was a repeat the - handler dropped, or when the store learns positions only at read - time. + Opaque token naming the last record written by this call, or by the + original when the call repeated the last batch. Absent when the + store learns positions only at read time; such a caller positions + itself with a latest_only read. additionalProperties: true ReadInput: @@ -107,17 +123,14 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being read." - stream: + run_id: type: string description: >- - The named stream to read. Empty reads every stream the workflow - publishes. + Pin the read to this run. Empty follows the workflow's execution + chain across continue-as-new. topic: type: string - description: >- - Yield only records on this topic. Empty yields every topic. Only - meaningful when stream is empty, because an inbound stream has no - topics. + description: "The topic of the workflow's stream to read." after_token: type: string description: >- @@ -125,7 +138,7 @@ $defs: strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell - which one that is. + which one that is, and a token from another store is refused. max_records: type: integer minimum: 1 @@ -146,26 +159,27 @@ $defs: wants to follow from now. required: - workflow_id + - topic additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its frame." + description: "One record on the wire: its cursor and the record itself." properties: token: type: string description: >- Opaque cursor naming this record. Pass it as after_token to resume just past it. - frame: + record: type: string contentEncoding: base64 description: >- - The record frame, carrying the topic, kind, producer, attempt, - sequence and body. + The serialized temporal.api.stream.v1.StreamRecord: topic, kind, + producer_id, attempt, sequence and body, as the store holds it. required: - token - - frame + - record additionalProperties: true ReadOutput: @@ -182,4 +196,10 @@ $defs: description: >- Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing. + done: + type: boolean + description: >- + The store ended the read: the owning execution, or its chain, is + closed and every retained record after the caller's token has been + delivered. Nothing more will arrive, so the caller stops. additionalProperties: true From a9e2672cd707f75c1a0d68b5e0d720d21e94cd43 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 261/831] Rewrote the Nexus front on the plugin surface. NexusStreams is the outside half only and the handler fronts a storage provider's own handles. Endpoint failures reach the caller as the stream condition the store raised or as an RPCError, never as an HTTP error. --- temporalio/streams/providers/nexus.py | 813 +++++++++++++++----------- 1 file changed, 468 insertions(+), 345 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8c311d1d9..07da0318b 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -1,47 +1,58 @@ """The Nexus front: the outside surface behind one Temporal-authenticated endpoint. -Two halves in one module. The provider half implements only :func:`producer` -and :func:`consumer`; the workflow side raises, naming a storage provider, -because a workflow's publishes and reads ride the Workflow Task and cannot -cross an RPC. The handler half runs in a worker configured with any storage -provider and serves two sync operations, ``append`` and ``read``, so the -store behind the endpoint is invisible to callers and an operator switches -it without touching them. +Two halves in one module. :class:`NexusStreams` is a provider that implements +the outside half only: it hands out handles that append and read through the +endpoint, and it has no workflow half, because a workflow's publishes and +reads ride the Workflow Task and cannot cross an RPC. +:class:`TemporalStreamsHandler` runs in a worker next to any storage provider +and serves two sync operations, ``append`` and ``read``, by fronting that +provider's own handles, so the store behind the endpoint is invisible to +callers and an operator switches it without touching them. The wire types and the service definition come from ``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be -handed the same contract. What stays hand-written here is what the -generator cannot express yet: the handler's dedupe and long-poll collect -loop, and the caller's batching, cursor handling and codec. +handed the same contract. A record crosses as the serialized +``temporal.api.stream.v1.StreamRecord``, the same bytes every store keeps, so +a caller in another language decodes it with the api protos alone. What stays +hand-written here is what the generator cannot express yet: the handler's +dedupe and long-poll collect loop, and the caller's batching, cursor handling +and codec. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Record bodies -cross the handler untouched: it reads the store as raw payloads and frames +cross the handler untouched: it reads the store as raw payloads and forwards them as they are, so a codec that changes the payload encoding survives the hop and the handler's worker never needs the key. Supersession records are -not transported: the caller's reader re-synthesizes them from the attempts -it observes, which is the policy module's job on every provider. Cursors -pass through opaque, so the caller cannot tell which store produced them. - -The handler keeps one parked read per ``(workflow, stream, topic)`` and -serves consecutive calls from it, so an idle caller does not leave one -abandoned long poll on the store per call. A call whose token does not -match the parked position replaces the subscription, and an idle one is -released after a minute; that is the residual cost. - -Two stated prototype limits. Append deduplication lives in handler memory, -by batch index per producer attempt, so a handler that has no state for a -producer attempt refuses to continue it rather than starting a fresh -delegate whose numbering the store would drop as a repeat; the caller opens -a new attempt, which readers report as a supersession. The store-level fix, -a sequence-explicit append in the contract, is listed in the design doc's -work table. And any caller the endpoint admits may touch any workflow's -streams in the namespace; the endpoint's own authorization is the boundary. +not transported: the caller's reader re-synthesizes them from the attempts it +observes, which is the policy module's job on every provider. Cursors pass +through opaque, so the caller cannot tell which store produced them; a +foreign one is refused by the store behind the endpoint and reaches the +caller on the first read. + +The handler keeps one parked read per ``(workflow, run, topic)`` and serves +consecutive calls from it, so an idle caller does not leave one abandoned +long poll on the store per call. A call whose token does not match the parked +position replaces the subscription, and an idle one is released after a +minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, by +batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh delegate +whose numbering the store would drop as a repeat; the caller opens a new +attempt, which readers report as a supersession. And any caller the endpoint +admits may touch any workflow's streams in the namespace; the endpoint's own +authorization is the boundary. + +A failure from the endpoint reaches the caller as the +:class:`temporalio.streams.StreamError` the store raised, when the handler +named one, and as :class:`temporalio.service.RPCError` otherwise, never as an +HTTP or urllib exception. """ from __future__ import annotations import asyncio +import json import logging import time import urllib.error @@ -50,7 +61,7 @@ from collections.abc import AsyncGenerator, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, TypeVar +from typing import Any, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler @@ -59,11 +70,24 @@ import temporalio.converter from temporalio.api.common.v1 import Payload from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.client import Client from temporalio.common import RawValue -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import StreamHandle, StreamProducer, StreamProvider from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + producer_identity, + to_wire, +) from temporalio.streams.providers._nexus_generated import ( AppendInput, AppendOutput, @@ -73,9 +97,16 @@ TemporalStreams, ) +__all__ = [ + "NexusProducer", + "NexusStreamHandle", + "NexusStreams", + "TemporalStreamsHandler", +] + _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " - "through a storage provider, so configure one of those on the worker" + "through a storage provider, so give the worker one of those" ) # The contract leaves these unset, so the handler is the one place that says @@ -83,12 +114,13 @@ # shortens it to the request deadline anyway, and a shorter default only # means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 30_000 +_DEFAULT_READ_WAIT = timedelta(seconds=30) _DEADLINE_MARGIN = timedelta(milliseconds=500) _DEFAULT_MAX_PRODUCERS = 10_000 _DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) _QUEUE_DEPTH = 1000 -_APPEND_TIMEOUT_MS = 30_000 +_APPEND_TIMEOUT = timedelta(seconds=30) +_ROUND_TRIP_MARGIN = timedelta(seconds=5) _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -104,16 +136,58 @@ _APPEND_OPERATION = _OPERATION_NAMES["append"] _READ_OPERATION = _OPERATION_NAMES["read"] +# The stream conditions that cross the endpoint under their own name, so the +# caller raises the class the store raised. +_STREAM_ERRORS: dict[str, type[StreamError]] = { + cls.__name__: cls + for cls in ( + StreamError, + StreamNotFoundError, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, + ) +} +_HTTP_TO_RPC = { + 400: RPCStatusCode.INVALID_ARGUMENT, + 401: RPCStatusCode.UNAUTHENTICATED, + 403: RPCStatusCode.PERMISSION_DENIED, + 404: RPCStatusCode.NOT_FOUND, + 408: RPCStatusCode.DEADLINE_EXCEEDED, + 409: RPCStatusCode.ALREADY_EXISTS, + 412: RPCStatusCode.FAILED_PRECONDITION, + 429: RPCStatusCode.RESOURCE_EXHAUSTED, + 500: RPCStatusCode.INTERNAL, + 501: RPCStatusCode.UNIMPLEMENTED, + 503: RPCStatusCode.UNAVAILABLE, + 504: RPCStatusCode.DEADLINE_EXCEEDED, +} + _OutputT = TypeVar("_OutputT") logger = logging.getLogger(__name__) +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _handler_error(error: StreamError) -> nexusrpc.HandlerError: + """Carry a stream condition across the endpoint under its own class name.""" + kind = ( + nexusrpc.HandlerErrorType.NOT_FOUND + if isinstance(error, StreamNotFoundError) + else nexusrpc.HandlerErrorType.BAD_REQUEST + ) + return nexusrpc.HandlerError( + f"{type(error).__name__}: {error}", type=kind, retryable_override=False + ) + + def _bad_request(message: str) -> nexusrpc.HandlerError: return nexusrpc.HandlerError( - message, - type=nexusrpc.HandlerErrorType.BAD_REQUEST, - retryable_override=False, + message, type=nexusrpc.HandlerErrorType.BAD_REQUEST, retryable_override=False ) @@ -131,29 +205,30 @@ class _Subscription: @dataclass class _ProducerState: - delegate: Any + delegate: StreamProducer batch_index: int + sequence: int + last_cursor: str | None @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: - """Serves the stream endpoint, delegating to one storage provider. + """Serves the stream endpoint by fronting one storage provider's handles. - The delegate is an explicit instance rather than the process default, so - a caller and a handler can coexist in one process, and so an operator can + The provider is an explicit instance the application constructed, so a + caller and a handler can coexist in one process, and so an operator can run handlers for a new store next to handlers for the old one. """ def __init__( self, - client: Any, - provider: str, + provider: StreamProvider, + client: Client | None, *, max_producers: int = _DEFAULT_MAX_PRODUCERS, subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, - **provider_options: Any, ) -> None: - """Serve the endpoint out of the provider named by ``provider``. + """Serve the endpoint out of ``provider``'s handles, opened with ``client``. ``max_producers`` bounds the dedupe state kept per producer attempt; the oldest is evicted, and a producer evicted mid-life gets a clear @@ -161,9 +236,9 @@ def __init__( ``subscription_idle`` is how long a parked read outlives its last caller. """ + self._provider = provider self._client = client - self._delegate = _provider.instance(provider, **provider_options) - self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + self._producers: OrderedDict[tuple[str, str, str, str, int], _ProducerState] = ( OrderedDict() ) self._max_producers = max_producers @@ -171,60 +246,82 @@ def __init__( self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} self._subscription_idle = subscription_idle.total_seconds() + def _stream(self, workflow_id: str, run_id: str | None) -> StreamHandle: + # A storage provider wants a client; the memory provider, which the + # tests front, accepts none, so the cast only lies where it is unread. + return self._provider.get_stream_handle( + cast(Client, self._client), workflow_id, run_id=run_id or None + ) + @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch. + """Append on the caller's account, writing a repeated batch once. Raises: - nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips - ahead, when it continues a producer attempt this handler has - no state for, or when a payload is not a serialized - ``Payload``. + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index or + sequence does not continue the producer attempt, when the + attempt is one this handler has no state for, or when a + payload is not a serialized ``Payload``; ``NOT_FOUND`` when + the store has no such workflow. """ - topic = input.topic or "" + try: + return await self._append(input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _append(self, input: AppendInput) -> AppendOutput: + _require_topic(input.topic) key = ( input.workflow_id, - input.stream or f"@{topic}", + input.run_id or "", + input.topic, input.producer_id, input.attempt, ) state = self._producers.get(key) if state is None: - if input.batch_index != 1: + if input.batch_index != 1 or input.sequence != 0: # A fresh delegate would restart its numbering at zero, and # the store would drop that as a repeat of the first batch. # Refusing here turns a silent loss into a failure the caller # can act on by opening a new attempt. - raise _bad_request( + raise StreamProducerError( f"producer {input.producer_id!r} attempt {input.attempt} resumed " f"at batch {input.batch_index} on a handler that has no state for " "it; open a new attempt" ) - delegate = await self._delegate.producer( - self._client, - workflow_id=input.workflow_id, - stream=input.stream, - topic=topic, - producer_id=input.producer_id, - attempt=input.attempt, + delegate = self._stream(input.workflow_id, input.run_id).producer( + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt ) - state = _ProducerState(delegate, 0) - elif input.batch_index <= state.batch_index: - # A repeat, or a producer that restarted its numbering: either - # way the store already holds the batch. + state = _ProducerState(delegate, 0, 0, None) + elif input.batch_index == state.batch_index: + # The last batch again: the store already holds it, and where it + # landed is the answer the original got. self._producers.move_to_end(key) - return AppendOutput() + return AppendOutput(cursor=state.last_cursor) + elif input.batch_index < state.batch_index: + raise StreamProducerError( + f"batch {input.batch_index} was written and is no longer the last " + f"for producer {input.producer_id!r} attempt {input.attempt}" + ) elif input.batch_index != state.batch_index + 1: - raise _bad_request( + raise StreamProducerError( f"batch {input.batch_index} skips ahead of {state.batch_index} for " f"producer {input.producer_id!r} attempt {input.attempt}" ) + if input.sequence != state.sequence: + raise StreamProducerError( + f"sequence {input.sequence} does not continue at {state.sequence} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) payloads = self._payloads(input.payloads) cursor: str | None = None if payloads: - appended = await state.delegate.append(*payloads) + appended = await state.delegate.append(*(RawValue(p) for p in payloads)) cursor = appended.token if appended is not None else None if input.finish: await state.delegate.finish() @@ -233,6 +330,8 @@ async def append( # Recorded only once the store accepted the batch, so a failed append # is not mistaken for a repeat when the caller retries it. state.batch_index = input.batch_index + state.sequence += len(payloads) + state.last_cursor = cursor self._producers[key] = state self._producers.move_to_end(key) while len(self._producers) > self._max_producers: @@ -243,32 +342,46 @@ async def append( def _payloads(encoded: list[bytes] | None) -> list[Payload]: payloads = [] for index, raw in enumerate(encoded or []): - payload = Payload() try: - payload.ParseFromString(raw) + payloads.append(Payload.FromString(raw)) except DecodeError as error: raise _bad_request( f"payloads[{index}] is not a serialized Temporal Payload: {error}" ) from error - payloads.append(payload) return payloads @nexusrpc.handler.sync_operation async def read( self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: - """Answer with the records after the caller's token, or time out.""" - stream = input.stream or "" - topic = input.topic or None + """Answer with the records after the caller's token, or time out. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the store refuses the + token, ``NOT_FOUND`` when it has no such workflow. + """ + try: + return await self._read(ctx, input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _read( + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + _require_topic(input.topic) + stream = self._stream(input.workflow_id, input.run_id) if input.latest_only: - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=stream - ) - return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + return ReadOutput(next_token=(await stream.latest(topic=input.topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + wait = ( + _DEFAULT_READ_WAIT.total_seconds() + if input.wait_ms is None + else input.wait_ms / 1000 + ) if ctx.request_deadline is not None: # The server answers the caller with a timeout at the deadline # whatever this call does, so collecting past it only holds the @@ -279,7 +392,7 @@ async def read( left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN wait = max(0.0, min(wait, left.total_seconds())) after = input.after_token or "" - key = (input.workflow_id, stream, topic or "") + key = (input.workflow_id, input.run_id or "", input.topic) await self._expire_subscriptions() lock = self._read_locks.setdefault(key, asyncio.Lock()) async with lock: @@ -287,34 +400,31 @@ async def read( if subscription is None or subscription.position != after: if subscription is not None: await self._drop(key) - subscription = await self._subscribe( - key, input.workflow_id, stream, topic, after - ) + subscription = self._subscribe(key, stream, input.topic, after) records, next_token = await self._drain(subscription, max_records, wait) subscription.position = next_token subscription.last_used = time.monotonic() - if subscription.done and subscription.records.empty(): - # The store ended the read, as the Workflow Streams delegate - # does when the run closes. Nothing more will arrive on it. + done = ( + subscription.done + and subscription.records.empty() + and subscription.failure is None + ) + if done: + # The store ended the read: the run or chain is closed and the + # tail has been handed over. Nothing more will arrive on it. await self._drop(key) - return ReadOutput(records=records, next_token=next_token) + return ReadOutput(records=records, next_token=next_token, done=done) - async def _subscribe( - self, - key: tuple[str, str, str], - workflow_id: str, - stream: str, - topic: str | None, - after: str, + def _subscribe( + self, key: tuple[str, str, str], stream: StreamHandle, topic: str, after: str ) -> _Subscription: - delegate = await self._delegate.consumer( - self._client, workflow_id=workflow_id, stream=stream - ) - # Raw payloads: the handler frames what the store holds without + # Raw payloads: the handler forwards what the store holds without # decoding it, so an encoding only the caller's codec understands - # passes through untouched. - source = delegate.read( - after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + # passes through untouched. A foreign token is refused right here. + source = stream.read( + topic=topic, + after=Cursor(after) if after else BEGINNING, + result_type=RawValue, ) subscription = _Subscription( records=asyncio.Queue(maxsize=_QUEUE_DEPTH), @@ -334,8 +444,7 @@ async def pump() -> None: subscription.failure = error finally: subscription.done = True - if isinstance(source, AsyncGenerator): - await source.aclose() + await source.aclose() subscription.pump = asyncio.create_task(pump()) self._subscriptions[key] = subscription @@ -354,8 +463,10 @@ async def _drain( if records or remaining <= 0: break if subscription.done: + if subscription.failure is None: + break # Honour the wait even though nothing can arrive, so a - # caller polling a closed stream does not spin on the + # caller polling a failed stream does not spin on the # endpoint. await asyncio.sleep(remaining) break @@ -374,20 +485,19 @@ async def _drain( @staticmethod def _wire(record: StreamRecord[Any]) -> RecordWire: - body = ( - record.value.payload.SerializeToString() - if isinstance(record.value, RawValue) - else b"" - ) - frame = _frame.encode( + # The record read as RawValue carries the stored body untouched; the + # default converter passes a RawValue through, so no encoding happens + # here. + wire = to_wire( + temporalio.converter.DataConverter.default.payload_converter, topic=record.topic, kind=record.kind, - producer=record.producer, + value=record.value, + producer_id=record.producer_id, attempt=record.attempt, sequence=record.sequence, - body=body, ) - return RecordWire(token=record.cursor.token, frame=frame) + return RecordWire(token=record.cursor.token, record=wire.SerializeToString()) async def close(self) -> None: """Release every parked read. @@ -419,20 +529,44 @@ async def _expire_subscriptions(self) -> None: self._read_locks.pop(key, None) -class StreamEndpointError(RuntimeError): - """The stream endpoint refused a call or could not be reached. +class _EndpointFailure(Exception): + """What the transport saw: the endpoint's answer, or the reason it gave none.""" - ``status`` is the HTTP status when the endpoint answered, and ``None`` - when the connection itself failed. - """ - - def __init__(self, message: str, *, status: int | None = None) -> None: - """Carry the endpoint's answer, or the reason it gave none.""" - super().__init__(message) + def __init__(self, detail: str, status: int | None) -> None: + super().__init__(detail) + self.detail = detail self.status = status -def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: +def _translate(failure: _EndpointFailure) -> Exception: + """The exception a caller raises for an endpoint failure. + + The handler names a stream condition by its class in the failure message, + so the same class is raised here; anything else is an ``RPCError`` with + the status the HTTP answer maps to, or ``UNAVAILABLE`` when there was none. + """ + message = failure.detail + try: + parsed = json.loads(message) + if isinstance(parsed, dict) and isinstance(parsed.get("message"), str): + message = parsed["message"] + except ValueError: + pass + if failure.status is not None: + for name, cls in _STREAM_ERRORS.items(): + prefix = f"{name}: " + if message.startswith(prefix): + return cls(message[len(prefix) :]) + status = _HTTP_TO_RPC.get(failure.status, RPCStatusCode.UNKNOWN) + else: + status = RPCStatusCode.UNAVAILABLE + return RPCError(message, status, b"") + + +def _post( + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta +) -> bytes: + timeout_ms = int(timeout.total_seconds() * 1000) request = urllib.request.Request( url, data=body, @@ -446,57 +580,74 @@ def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> method="POST", ) try: - with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: + with urllib.request.urlopen( + request, timeout=(timeout + _ROUND_TRIP_MARGIN).total_seconds() + ) as response: return response.read() except urllib.error.HTTPError as error: - detail = error.read().decode(errors="replace") - raise StreamEndpointError( - f"stream endpoint call failed ({error.code}): {detail}", status=error.code + raise _EndpointFailure( + error.read().decode(errors="replace"), error.code ) from error except urllib.error.URLError as error: - raise StreamEndpointError( - f"stream endpoint unreachable at {url}: {error.reason}" + raise _EndpointFailure( + f"stream endpoint unreachable at {url}: {error.reason}", None ) from error class _Front: - """Everything the caller half needs to reach one endpoint.""" + """Everything a handle needs to reach one endpoint.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - headers: Mapping[str, str], - wait_ms: int, - max_records: int, - ) -> None: - self.base_url = base_url + def __init__(self, streams: NexusStreams, client: Client | None) -> None: + self._streams = streams + self._client = client + data_converter = streams._data_converter + if data_converter is None: + data_converter = ( + client.data_converter + if client is not None + else temporalio.converter.DataConverter.default + ) self.converter = data_converter.payload_converter self.codec = data_converter.payload_codec - self.headers = dict(headers) - self.wait_ms = wait_ms - self.max_records = max_records + self.read_wait = streams._read_wait + self.max_records = streams._max_records + + async def _base_url(self) -> str: + endpoint_id = await self._streams._endpoint_id(self._client) + return ( + f"{self._streams._http_address}/nexus/endpoints/{endpoint_id}" + f"/services/{_SERVICE_NAME}" + ) async def invoke( - self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + self, + operation: str, + request: Any, + output: type[_OutputT], + *, + timeout: timedelta, ) -> _OutputT: # The contract types carry their own JSON encoding, so the raw caller # and the worker serving the operation agree on the body without # either of them spelling the fields out. contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread( - _post, - f"{self.base_url}/{operation}", - contract.to_payloads([request])[0].data, - self.headers, - timeout_ms, - ) + url = f"{await self._base_url()}/{operation}" + try: + raw = await asyncio.to_thread( + _post, + url, + contract.to_payloads([request])[0].data, + self._streams._headers, + timeout, + ) + except _EndpointFailure as failure: + raise _translate(failure) from failure payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it. + """Appends through the stream endpoint; the store behind it does the rest. Calls are serialized and the batch index is committed only once the endpoint answered. A batch whose call raised stays pending and is sent @@ -509,42 +660,50 @@ def __init__( self, front: _Front, workflow_id: str, - stream: str, + run_id: str | None, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on the endpoint.""" + """Bind this producer to ``topic`` on the workflow behind the endpoint.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._sequence = 0 + self._last: Cursor | None = BEGINNING self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None self._lock = asyncio.Lock() + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` through the endpoint.""" + """Append ``values`` through the endpoint and return where the last one landed. + + A repeat answers with the original's position and an empty call with + the last one; ``None`` when the store behind the endpoint learns + positions only at read time. + """ if not values: - return None - payloads = [ - value - if isinstance(value, Payload) - else self._front.converter.to_payloads([value])[0] - for value in values - ] + return self._last + payloads = self._front.converter.to_payloads(list(values)) answer = await self._call(payloads, finish=False) - return Cursor(answer.cursor) if answer.cursor else None + self._last = Cursor(answer.cursor) if answer.cursor else None + return self._last async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" + """Write ``FINISH`` for this producer on this topic.""" await self._call([], finish=True) async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: @@ -566,238 +725,202 @@ async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: await self._send(*self._pending) elif self._pending is not None: return await self._send(*self._pending) - request = self._request(self._batch_index + 1, encoded, finish) + request = AppendInput( + workflow_id=self._workflow_id, + run_id=self._run_id, + topic=self._topic, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + batch_index=self._batch_index + 1, + payloads=encoded, + finish=finish, + ) return await self._send(request, identity, finish) - def _request( - self, batch_index: int, payloads: list[bytes], finish: bool - ) -> AppendInput: - return AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=batch_index, - topic=self._topic, - payloads=payloads, - finish=finish, - ) - async def _send( self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: self._pending = (request, identity, finish) answer = await self._front.invoke( - _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS + _APPEND_OPERATION, request, AppendOutput, timeout=_APPEND_TIMEOUT ) self._batch_index = request.batch_index + self._sequence = request.sequence + len(request.payloads or []) + int(finish) self._pending = None return answer -class NexusConsumer: - """Reads batches from the stream endpoint, re-synthesizing supersession.""" +class NexusStreamHandle: + """One workflow's stream through the endpoint, re-synthesizing supersession.""" - def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: - """Read what ``workflow_id`` publishes, through the endpoint.""" + def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s stream, pinned to ``run_id`` when one is given.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after``, one endpoint batch at a time. + + The token is opaque here, so a cursor from another store is refused by + the store behind the endpoint and raises + :class:`temporalio.streams.StreamCursorError` on the first iteration. + """ + _require_topic(topic) + return self._read(topic, after, result_type) + + async def _read( + self, topic: str, after: Cursor, result_type: type | None ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, one endpoint batch at a time.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() + decoder = RecordDecoder( + self._front.converter, result_type, after=after, warn=logger.warning + ) token = after.token while True: answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, after_token=token, max_records=self._front.max_records, - wait_ms=self._front.wait_ms, + wait_ms=int(self._front.read_wait.total_seconds() * 1000), ), ReadOutput, - timeout_ms=self._front.wait_ms + 5000, + timeout=self._front.read_wait + _ROUND_TRIP_MARGIN, ) for wire in answer.records or []: cursor = Cursor(wire.token) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - wire.frame - ) - except ValueError as error: + record = WireRecord.FromString(wire.record) + except DecodeError as error: # Same answer as every other reader: skip and say so. logger.warning("skipping stream record at %s: %s", cursor, error) continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - value = ( - await self._decode(body, type) if kind is RecordKind.DATA else None - ) - yield StreamRecord( - value=value, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + if self._front.codec is not None and record.HasField("body"): + record.body.CopyFrom( + (await self._front.codec.decode([record.body]))[0] + ) + for out in decoder.decode(cursor, record): + yield out token = answer.next_token or token + if answer.done: + return - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" + async def latest(self, *, topic: str) -> Cursor: + """The newest position on ``topic`` behind the endpoint, for following from now.""" + _require_topic(topic) answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, latest_only=True, ), ReadOutput, - timeout_ms=_APPEND_TIMEOUT_MS, + timeout=_APPEND_TIMEOUT, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING - async def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if self._front.codec is not None: - payload = (await self._front.codec.decode([payload]))[0] - if as_type is None: - return self._front.converter.from_payloads([payload])[0] - return self._front.converter.from_payloads([payload], [as_type])[0] - - -class _NexusProvider: - name = "nexus" - - def __init__(self) -> None: - self._endpoint: str | None = None - self._endpoint_id: str | None = None - self._http_address = "http://127.0.0.1:7243" - self._service = _SERVICE_NAME - self._data_converter: temporalio.converter.DataConverter | None = None - self._client: Any = None - self._headers: dict[str, str] = {} - self._wait_ms = _DEFAULT_WAIT_MS - self._max_records = _DEFAULT_MAX_RECORDS - - def configure(self, **options: Any) -> None: - """Point the caller half at one endpoint. - - ``endpoint`` is the endpoint's name when ``client`` is given, and is - resolved to its id through the operator service on first use; without - a client it has to be the id, because the HTTP ingress dispatches by - id. ``headers`` go on every request, which is where an authorization - header belongs. ``wait_ms`` and ``max_records`` are the read bounds - the caller asks the handler for. - """ - endpoint = options.pop("endpoint", None) - self._http_address = options.pop("http_address", self._http_address) - self._service = options.pop("service", _SERVICE_NAME) - self._data_converter = options.pop("data_converter", None) - self._client = options.pop("client", None) - self._headers = dict(options.pop("headers", None) or {}) - self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) - self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) - if options: - raise TypeError( - "the nexus provider takes endpoint, http_address, service, " - f"data_converter, client, headers, wait_ms and max_records, got " - f"{sorted(options)}" - ) - if not endpoint: - raise TypeError( - "the nexus provider needs endpoint= together with " - "client=, or endpoint= on its own" - ) - self._endpoint = endpoint - self._endpoint_id = None - - def worker_options(self) -> dict[str, Any]: - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - del stream, after, idle_timeout - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_write(self, topic: str) -> WriteSink: - del topic - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - async def _front(self, client: Any) -> _Front: - if self._endpoint is None: - raise RuntimeError("configure the nexus provider before opening handles") - if self._endpoint_id is None: - resolver = self._client if self._client is not None else client - if resolver is None: - self._endpoint_id = self._endpoint - else: - found = await resolver.operator_service.list_nexus_endpoints( - ListNexusEndpointsRequest(name=self._endpoint) - ) - if not found.endpoints: - raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") - self._endpoint_id = found.endpoints[0].id - base_url = ( - f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" - f"/services/{self._service}" - ) - return _Front( - base_url, - self._converter(client), - self._headers, - self._wait_ms, - self._max_records, - ) - - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 ) -> NexusProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) return NexusProducer( - await self._front(client), workflow_id, stream, topic, producer_id, attempt + self._front, self._workflow_id, self._run_id, topic, producer_id, attempt ) - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> NexusConsumer: - return NexusConsumer(await self._front(client), workflow_id, stream) - def _converter(self, client: Any) -> temporalio.converter.DataConverter: - if self._data_converter is not None: - return self._data_converter - if client is None: - return temporalio.converter.DataConverter.default - return client.data_converter +class NexusStreams(StreamProvider): + """The outside half of a provider, over one Nexus endpoint. + Not a worker plugin: a workflow publishes and reads through the storage + provider its worker was given, and this front only serves code outside a + workflow. The endpoint hides which store that is. + """ -_provider.register("nexus", _NexusProvider) + def __init__( + self, + *, + endpoint: str, + http_address: str = "http://127.0.0.1:7243", + headers: Mapping[str, str] | None = None, + read_wait: timedelta = _DEFAULT_READ_WAIT, + max_records: int = _DEFAULT_MAX_RECORDS, + data_converter: temporalio.converter.DataConverter | None = None, + ) -> None: + """Point the front at one endpoint. + + Args: + endpoint: The Nexus endpoint's name, resolved to its id through + the operator service of the client a handle is opened with. + When a handle is opened without a client it has to be the id, + because the HTTP ingress dispatches by id. + http_address: The server's Nexus HTTP ingress. + headers: Sent on every request; where an authorization header + belongs. + read_wait: How long the handler may park a read before answering + with what it has. + max_records: The most records one read answer carries. + data_converter: Overrides the client's converter for record + bodies. A payload codec configured here runs on this side of + the endpoint, so records are encoded before they leave the + process and the handler's worker never holds the key. + """ + if not endpoint: + raise ValueError("endpoint must not be empty") + self._endpoint = endpoint + self._http_address = http_address.rstrip("/") + self._headers = dict(headers or {}) + self._read_wait = read_wait + self._max_records = max_records + self._data_converter = data_converter + self._resolved: str | None = None + self._resolving = asyncio.Lock() + + def workflow_provider(self) -> NoReturn: + """Raise: this front has no workflow half.""" + raise StreamUnsupportedError(_WORKFLOW_SIDE_ERROR) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> NexusStreamHandle: + """A handle on ``workflow_id``'s stream through the endpoint. + + ``client`` is not used for transport: it resolves the endpoint's name + and supplies the data converter when none was configured. + """ + return NexusStreamHandle(_Front(self, client), workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: each call opens and closes its own connection.""" + + async def _endpoint_id(self, client: Client | None) -> str: + if self._resolved is not None: + return self._resolved + async with self._resolving: + if self._resolved is None: + if client is None: + self._resolved = self._endpoint + else: + found = await client.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise ValueError( + f"no nexus endpoint is named {self._endpoint!r}" + ) + self._resolved = found.endpoints[0].id + return self._resolved From 2db64db65be81344358d14ab42900b48373966db Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 262/831] Covered the Nexus front on the new surface. --- CHANGELOG.md | 15 +- tests/streams/test_nexus_provider.py | 311 +++++++++++++++++---------- 2 files changed, 204 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d6d93c86..3ba06e4c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,12 +39,15 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. -- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus - endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. Its contract is defined in - `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. - Configure it with `data_converter=` to run a payload codec on the caller - side, so records are encoded before they leave the process. +- **Experimental**: `temporalio.streams.providers.nexus.NexusStreams` puts one + Nexus endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store, and + `TemporalStreamsHandler` serves that endpoint by fronting the provider's own + handles. Its contract is defined in `temporal_streams.nexusrpc.yaml` and the + bindings are generated from it; a record crosses as the serialized + `StreamRecord` proto. Configure the front with `data_converter=` to run a + payload codec on the caller side, so records are encoded before they leave + the process. ### Changed diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 77cec6f4e..ecb0e7cf3 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,7 +1,7 @@ """Conformance for the Nexus front. -The caller talks only to the stream endpoint; the handler delegates to a -storage provider, so these tests are the provider-hiding demonstration: +The caller talks only to the stream endpoint; the handler fronts a storage +provider's own handles, so these tests are the provider-hiding demonstration: nothing on the caller side names or could name the store. The loop test runs over the server's Nexus HTTP ingress and is gated behind @@ -32,20 +32,27 @@ import pytest import temporalio.converter -from temporalio import streams from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams import _frame as frame -from temporalio.streams._provider import instance -from temporalio.streams.providers import memory, nexus -from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import ( - StreamEndpointError, - TemporalStreamsHandler, +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, ) +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers import nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.worker import Worker +from tests.helpers import new_worker from tests.streams.test_workflow_streams_provider import EchoLoop, take +from tests.streams.test_workflow_streams_provider import _feed as feed_echo_loop live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", @@ -56,6 +63,8 @@ HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] +INPUTS = "inputs" +DECISIONS = "decisions" @live_only @@ -63,42 +72,34 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front, and it names the # endpoint the way an operator does, by name. - streams.configure(provider="workflow_streams") + store = WorkflowStreamsProvider() client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - front = instance( - "nexus", + front = NexusStreams( endpoint=ENDPOINT, - client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), - wait_ms=5000, + read_wait=timedelta(seconds=5), ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" - handler = TemporalStreamsHandler(client, provider="workflow_streams") + handler = TemporalStreamsHandler(store, client) async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", workflows=[EchoLoop], - **streams.worker_options(), + plugins=[store], ): handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" ) - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + stream = front.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4, timeout=60) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4, 60) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -110,8 +111,9 @@ async def test_interface_loop_through_the_nexus_front(): # An opaque cursor from behind the front resumes a fresh reader # just past the record it names. checkpoint = records[0].cursor - resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2, 60 + ) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) @@ -136,12 +138,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: """Recover the payloads :meth:`encode` wrapped.""" - out: list[Payload] = [] - for payload in payloads: - inner = Payload() - inner.ParseFromString(self._flip(payload.data)) - out.append(inner) - return out + return [Payload.FromString(self._flip(payload.data)) for payload in payloads] @classmethod def _flip(cls, data: bytes) -> bytes: @@ -202,9 +199,9 @@ def _in_process_endpoint( failing = set(fail_after_applying or []) def post( - url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta ) -> bytes: - del headers, timeout_ms + del headers, timeout posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput @@ -216,24 +213,30 @@ def post( _dispatch(handler, operation, request), loop ).result() except nexusrpc.HandlerError as error: - raise StreamEndpointError(str(error), status=400) from error + # The ingress answers a handler error with a failure body and the + # status its type maps to. + status = 404 if error.type is nexusrpc.HandlerErrorType.NOT_FOUND else 400 + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + json.dumps({"message": str(error)}), status + ) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) if operation in failing: failing.discard(operation) - raise StreamEndpointError("connection reset after the handler answered") + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + "connection reset after the handler answered", None + ) return raw return post -def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: - return instance( - "nexus", +def _front(codec: temporalio.converter.PayloadCodec | None) -> NexusStreams: + return NexusStreams( endpoint="in-process", # This endpoint has no other traffic to wait for, so park briefly # rather than for the contract's default. - wait_ms=200, + read_wait=timedelta(milliseconds=200), data_converter=dataclasses.replace( temporalio.converter.DataConverter.default, payload_codec=codec ), @@ -244,28 +247,19 @@ async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, ) -> tuple[list[Any], list[bytes], list[bytes]]: - memory.reset() - streams.configure(provider="memory") + store = MemoryStreams() posted: list[bytes] = [] answered: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = _front(codec) - workflow_id = "wf-codec" + stream = _front(codec).get_stream_handle(None, "wf-codec") - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"secret": "tuna"}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") - records = await take(consumer.read(type=dict), 2, timeout=30) - memory.reset() + records = await take(stream.read(topic=INPUTS, result_type=dict), 2, timeout=30) + await handler.close() return records, posted, answered @@ -281,7 +275,8 @@ def _answered_bodies(answered: list[bytes]) -> bytes: out = b"" for body in answered: for record in json.loads(body).get("records", []): - out += frame.decode(base64.b64decode(record["frame"]))[5] + wire = WireRecord.FromString(base64.b64decode(record["record"])) + out += wire.body.SerializeToString() return out @@ -315,14 +310,21 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( def _append( - workflow_id: str, batch_index: int, *values: Any, finish: bool = False + workflow_id: str, + batch_index: int, + *values: Any, + sequence: int | None = None, + finish: bool = False, ) -> AppendInput: converter = temporalio.converter.DataConverter.default.payload_converter return AppendInput( workflow_id=workflow_id, - stream="inputs", + topic=INPUTS, producer_id="model", attempt=1, + # Batches of one, numbered in step with the batch index unless a + # case wants them out of step. + sequence=batch_index - 1 if sequence is None else sequence, batch_index=batch_index, payloads=[ converter.to_payloads([value])[0].SerializeToString() for value in values @@ -331,57 +333,62 @@ def _append( ) -async def _stored(workflow_id: str) -> list[Any]: - consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") +async def _stored(store: MemoryStreams, workflow_id: str) -> list[Any]: + stream = store.get_stream_handle(None, workflow_id) + end = await stream.latest(topic=INPUTS) + if end == BEGINNING: + return [] out: list[Any] = [] - async for record in consumer.read(type=dict): + async for record in stream.read(topic=INPUTS, result_type=dict): if record.kind is RecordKind.DATA: out.append(record.value) - if await consumer.latest() == record.cursor: + if record.cursor == end: break return out -@pytest.fixture -def _memory_store(): # pyright: ignore[reportUnusedFunction] - memory.reset() - streams.configure(provider="memory") - yield - memory.reset() - - -@pytest.mark.usefixtures("_memory_store") async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): # A second handler instance stands in for a restarted or load-balanced # handler worker: it shares the store but not the dedupe state. - first = TemporalStreamsHandler(None, provider="memory") - second = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + first = TemporalStreamsHandler(store, None) + second = TemporalStreamsHandler(store, None) await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) with pytest.raises(nexusrpc.HandlerError) as failed: await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST assert failed.value.retryable_override is False + # Named so the caller can raise the same class. + assert str(failed.value).startswith("StreamProducerError: ") # The store holds the first batch and nothing was silently lost or doubled. - assert await _stored("wf") == [{"n": 1}] + assert await _stored(store, "wf") == [{"n": 1}] -@pytest.mark.usefixtures("_memory_store") -async def test_the_handler_drops_repeats_and_rejects_gaps(): - handler = TemporalStreamsHandler(None, provider="memory") +async def test_the_handler_answers_repeats_and_rejects_gaps(): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) - await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - # An exact repeat is dropped with a success answer and no position. + second = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # A repeat of the last batch is written once and answers with where the + # original landed, so a retrying caller checkpoints the same position. repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - assert repeat.cursor is None - with pytest.raises(nexusrpc.HandlerError) as failed: + assert repeat.cursor == second.cursor + with pytest.raises(nexusrpc.HandlerError) as skipped: await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) - assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert skipped.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + with pytest.raises(nexusrpc.HandlerError) as behind: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + assert str(behind.value).startswith("StreamProducerError: ") + with pytest.raises(nexusrpc.HandlerError) as renumbered: + await _dispatch( + handler, APPEND_OPERATION, _append("wf", 3, {"n": 3}, sequence=7) + ) + assert "sequence 7 does not continue at 2" in str(renumbered.value) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] -@pytest.mark.usefixtures("_memory_store") async def test_a_malformed_payload_is_the_callers_fault(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) request = _append("wf", 1) request.payloads = [b"\xff\xfe not a payload"] with pytest.raises(nexusrpc.HandlerError) as failed: @@ -389,12 +396,12 @@ async def test_a_malformed_payload_is_the_callers_fault(): assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST -@pytest.mark.usefixtures("_memory_store") async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -402,28 +409,41 @@ async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # A transport failure is an RPCError, never the transport's own type. + with pytest.raises(RPCError) as failed: await producer.append({"n": 1}) - await producer.append({"n": 1}) + assert failed.value.status == RPCStatusCode.UNAVAILABLE + landed = await producer.append({"n": 1}) await producer.append({"n": 2}) await producer.finish() indexes = [json.loads(body)["batch_index"] for body in posted] - # The retry re-sent index 1, which the handler dropped as a repeat, so - # the store holds each record once. + sequences = [json.loads(body)["sequence"] for body in posted] + # The retry re-sent index 1, which the handler answered as a repeat with + # the original's position, so the store holds each record once. assert indexes == [1, 1, 2, 3] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert sequences == [0, 0, 1, 2] + assert landed == await _memory_position(store, "wf", 0) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def _memory_position( + store: MemoryStreams, workflow_id: str, index: int +) -> Cursor: + records = await take( + store.get_stream_handle(None, workflow_id).read(topic=INPUTS, result_type=dict), + index + 1, + ) + return records[index].cursor -@pytest.mark.usefixtures("_memory_store") async def test_a_failed_append_goes_out_before_the_next_one( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -431,28 +451,52 @@ async def test_a_failed_append_goes_out_before_the_next_one( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + with pytest.raises(RPCError): await producer.append({"n": 1}) # The caller moves on without retrying; the pending batch is replayed # first under its own index and the new one takes the next. await producer.append({"n": 2}) indexes = [json.loads(body)["batch_index"] for body in posted] assert indexes == [1, 1, 2] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def test_a_stream_condition_crosses_the_endpoint_under_its_own_class( + monkeypatch: pytest.MonkeyPatch, +): + handler = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + stream = _front(None).get_stream_handle(None, "wf") + # The token is opaque on this side, so the store behind the endpoint is + # what refuses it, and the refusal arrives on the first read as the class + # the store raised. + with pytest.raises(StreamCursorError): + await take(stream.read(topic=INPUTS, after=Cursor("elsewhere:1")), 1) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + # A second handler has no state for the attempt; the caller learns that + # as a producer conflict. + fresh = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(fresh, [], [])) + with pytest.raises(StreamProducerError): + await producer.append({"n": 2}) + await handler.close() + + +def test_the_front_has_no_workflow_half(): + with pytest.raises(StreamUnsupportedError): + _front(None).workflow_provider() -@pytest.mark.usefixtures("_memory_store") async def test_consecutive_reads_share_one_parked_subscription(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) first = await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, max_records=1, wait_ms=200), ) assert len(first.records) == 1 parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] @@ -464,7 +508,7 @@ async def test_consecutive_reads_share_one_parked_subscription(): READ_OPERATION, ReadInput( workflow_id="wf", - stream="inputs", + topic=INPUTS, after_token=first.next_token, max_records=1, wait_ms=200, @@ -477,21 +521,56 @@ async def test_consecutive_reads_share_one_parked_subscription(): await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=200), ) assert len(parked) == 1 and next(iter(parked.values())).pump is not pump await handler.close() assert not parked -@pytest.mark.usefixtures("_memory_store") async def test_the_read_wait_is_cut_to_the_request_deadline(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) started = asyncio.get_running_loop().time() answer = await handler.read( _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), - ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=60000), ) - assert answer.records == [] and answer.next_token == "" + assert answer.records == [] and answer.next_token == "" and not answer.done assert asyncio.get_running_loop().time() - started < 5 await handler.close() + + +async def test_the_read_ends_when_the_store_ends_it( + client: Client, monkeypatch: pytest.MonkeyPatch +): + # Behind the endpoint sits the Workflow Streams store, whose read ends + # once the run has closed and its tail is served. The front carries that + # end to the caller, whose loop leaves by itself. + store = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + handler = TemporalStreamsHandler(store, client) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + workflow_id = f"streams-nexus-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, plugins=[store]) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await feed_echo_loop(store, client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + stream = _front(None).get_stream_handle(None, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 30) + await handler.close() + assert records == [ + (RecordKind.DATA, {"echo": 1}), + (RecordKind.DATA, {"echo": 2}), + (RecordKind.DATA, {"echo": 3}), + (RecordKind.FINISH, None), + ] From 75b26bd6f036c0e47e10ff8ff874bfcec1cea7a1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 263/831] Pinned Core to the stream revision and regenerated bridge protos. --- .gitmodules | 2 +- .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 613 ++++++-------- .../workflow_activation_pb2.pyi | 68 ++ .../workflow_commands_pb2.py | 800 +++++++----------- .../workflow_commands_pb2.pyi | 90 ++ temporalio/bridge/sdk-core | 2 +- 7 files changed, 737 insertions(+), 840 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..ae7639820 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamMessages, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamMessages", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..0e1b3a1e6 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,430 +2,311 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.update.v1 import ( - message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, -) -from temporalio.bridge.proto.activity_result import ( - activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' -) - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ - "HeadersEntry" -] -_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStart" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartSuccess" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartFailure" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartCancelled" -] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecution" -] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveSignalExternalWorkflow" -] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveRequestCancelExternalWorkflow" -] -_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveNexusOperationStart" -] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] -WorkflowActivation = _reflection.GeneratedProtocolMessageType( - "WorkflowActivation", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }, -) + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] +_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] +_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] +WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( - "WorkflowActivationJob", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }, -) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }) _sym_db.RegisterMessage(WorkflowActivationJob) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType( - "InitializeWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _INITIALIZEWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }, -) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }) +_sym_db.RegisterMessage(DeliverStreamMessages) + +InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _INITIALIZEWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType( - "FireTimer", - (_message.Message,), - { - "DESCRIPTOR": _FIRETIMER, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }, -) +FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { + 'DESCRIPTOR' : _FIRETIMER, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType( - "ResolveActivity", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEACTIVITY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }, -) +ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }, -) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartSuccess", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }, -) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartFailure", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }, -) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartCancelled", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }, -) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }, -) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( - "UpdateRandomSeed", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERANDOMSEED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }, -) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERANDOMSEED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType( - "QueryWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _QUERYWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }, -) +QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _QUERYWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }, -) +CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType( - "SignalWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }, -) +SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType( - "NotifyHasPatch", - (_message.Message,), - { - "DESCRIPTOR": _NOTIFYHASPATCH, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }, -) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { + 'DESCRIPTOR' : _NOTIFYHASPATCH, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveSignalExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }, -) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveRequestCancelExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }, -) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType( - "DoUpdate", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }, - ), - "DESCRIPTOR": _DOUPDATE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }, -) +DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }) + , + 'DESCRIPTOR' : _DOUPDATE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperationStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }, -) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }, -) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType( - "RemoveFromCache", - (_message.Message,), - { - "DESCRIPTOR": _REMOVEFROMCACHE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }, -) +RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { + 'DESCRIPTOR' : _REMOVEFROMCACHE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" - ) - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' + _WORKFLOWACTIVATION._serialized_start=570 + _WORKFLOWACTIVATION._serialized_end=1116 + _WORKFLOWACTIVATIONJOB._serialized_start=1119 + _WORKFLOWACTIVATIONJOB._serialized_end=2582 + _DELIVERSTREAMMESSAGES._serialized_start=2585 + _DELIVERSTREAMMESSAGES._serialized_end=2724 + _INITIALIZEWORKFLOW._serialized_start=2727 + _INITIALIZEWORKFLOW._serialized_end=4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 + _FIRETIMER._serialized_start=4133 + _FIRETIMER._serialized_end=4157 + _RESOLVEACTIVITY._serialized_start=4159 + _RESOLVEACTIVITY._serialized_end=4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 + _UPDATERANDOMSEED._serialized_start=5045 + _UPDATERANDOMSEED._serialized_end=5088 + _QUERYWORKFLOW._serialized_start=5091 + _QUERYWORKFLOW._serialized_end=5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 + _CANCELWORKFLOW._serialized_start=5353 + _CANCELWORKFLOW._serialized_end=5385 + _SIGNALWORKFLOW._serialized_start=5388 + _SIGNALWORKFLOW._serialized_end=5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 + _NOTIFYHASPATCH._serialized_start=5679 + _NOTIFYHASPATCH._serialized_end=5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 + _DOUPDATE._serialized_start=5917 + _DOUPDATE._serialized_end=6248 + _DOUPDATE_HEADERSENTRY._serialized_start=4052 + _DOUPDATE_HEADERSENTRY._serialized_end=4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 + _RESOLVENEXUSOPERATION._serialized_start=6407 + _RESOLVENEXUSOPERATION._serialized_end=6496 + _REMOVEFROMCACHE._serialized_start=6499 + _REMOVEFROMCACHE._serialized_end=6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..eab815fc9 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.update.v1.message_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_messages(self) -> global___DeliverStreamMessages: + """A range of a stream the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +327,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +335,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -368,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -421,6 +431,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_messages", "remove_from_cache", ] | None @@ -1440,6 +1451,63 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0cdc02c6b..ccfa1a016 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,552 +2,408 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" - +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.sdk.v1 import ( - event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, -) -from temporalio.api.sdk.v1 import ( - user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' -) - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] -_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ - "HeadersEntry" -] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ - "RequestCancelLocalActivity" -] -_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CompleteWorkflowExecution" -] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ContinueAsNewWorkflowExecution" -] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "StartChildWorkflowExecution" -] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CancelChildWorkflowExecution" -] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "RequestCancelExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "SignalExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( - _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ - "UpsertWorkflowSearchAttributes" -] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ - "NexusHeaderEntry" -] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ - "RequestCancelNexusOperation" -] -WorkflowCommand = _reflection.GeneratedProtocolMessageType( - "WorkflowCommand", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWCOMMAND, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }, -) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] +_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] +_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] +_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] +WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWCOMMAND, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }) _sym_db.RegisterMessage(WorkflowCommand) -StartTimer = _reflection.GeneratedProtocolMessageType( - "StartTimer", - (_message.Message,), - { - "DESCRIPTOR": _STARTTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }, -) +AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _ADDSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }) +_sym_db.RegisterMessage(AddStreamMessages) + +SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTREAM, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }) +_sym_db.RegisterMessage(SubscribeStream) + +StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { + 'DESCRIPTOR' : _STARTTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType( - "CancelTimer", - (_message.Message,), - { - "DESCRIPTOR": _CANCELTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }, -) +CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { + 'DESCRIPTOR' : _CANCELTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULEACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }, -) +ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleLocalActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULELOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }, -) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }, -) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelLocalActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }, -) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType( - "QueryResult", - (_message.Message,), - { - "DESCRIPTOR": _QUERYRESULT, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }, -) +QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { + 'DESCRIPTOR' : _QUERYRESULT, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType( - "QuerySuccess", - (_message.Message,), - { - "DESCRIPTOR": _QUERYSUCCESS, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }, -) +QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { + 'DESCRIPTOR' : _QUERYSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CompleteWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }, -) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "FailWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _FAILWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }, -) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ContinueAsNewWorkflowExecution", - (_message.Message,), - { - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }, - ), - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }, -) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }) + , + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }, -) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType( - "SetPatchMarker", - (_message.Message,), - { - "DESCRIPTOR": _SETPATCHMARKER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }, -) +SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { + 'DESCRIPTOR' : _SETPATCHMARKER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "StartChildWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }, - ), - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }, - ), - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }, -) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }) + , + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }) + , + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }, -) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "RequestCancelExternalWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }, -) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "SignalExternalWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }, -) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelSignalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELSIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }, -) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( - "UpsertWorkflowSearchAttributes", - (_message.Message,), - { - "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }, -) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { + 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( - "ModifyWorkflowProperties", - (_message.Message,), - { - "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }, -) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { + 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType( - "UpdateResponse", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERESPONSE, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }, -) +UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERESPONSE, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( - "ScheduleNexusOperation", - (_message.Message,), - { - "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( - "NexusHeaderEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }, - ), - "DESCRIPTOR": _SCHEDULENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }, -) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { + + 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( - "RequestCancelNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }, -) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" - ) - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8672 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8760 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4339 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4341 - _REQUESTCANCELACTIVITY._serialized_end = 4377 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4379 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4420 - _QUERYRESULT._serialized_start = 4423 - _QUERYRESULT._serialized_end = 4579 - _QUERYSUCCESS._serialized_start = 4581 - _QUERYSUCCESS._serialized_end = 4646 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4648 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4724 - _FAILWORKFLOWEXECUTION._serialized_start = 4726 - _FAILWORKFLOWEXECUTION._serialized_end = 4800 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4803 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5717 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5719 - _CANCELWORKFLOWEXECUTION._serialized_end = 5795 - _SETPATCHMARKER._serialized_start = 5797 - _SETPATCHMARKER._serialized_end = 5851 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5854 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7028 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7030 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7104 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7107 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7249 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7252 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7651 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7653 - _CANCELSIGNALWORKFLOW._serialized_end = 7688 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7690 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7791 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7793 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7872 - _UPDATERESPONSE._serialized_start = 7875 - _UPDATERESPONSE._serialized_end = 8085 - _SCHEDULENEXUSOPERATION._serialized_start = 8088 - _SCHEDULENEXUSOPERATION._serialized_end = 8626 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8576 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8626 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8628 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8670 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' + _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 + _WORKFLOWCOMMAND._serialized_start=556 + _WORKFLOWCOMMAND._serialized_end=2794 + _ADDSTREAMMESSAGES._serialized_start=2796 + _ADDSTREAMMESSAGES._serialized_end=2891 + _SUBSCRIBESTREAM._serialized_start=2893 + _SUBSCRIBESTREAM._serialized_end=2951 + _STARTTIMER._serialized_start=2953 + _STARTTIMER._serialized_end=3036 + _CANCELTIMER._serialized_start=3038 + _CANCELTIMER._serialized_end=3064 + _SCHEDULEACTIVITY._serialized_start=3067 + _SCHEDULEACTIVITY._serialized_end=3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 + _SCHEDULELOCALACTIVITY._serialized_start=3894 + _SCHEDULELOCALACTIVITY._serialized_end=4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 + _REQUESTCANCELACTIVITY._serialized_start=4646 + _REQUESTCANCELACTIVITY._serialized_end=4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 + _QUERYRESULT._serialized_start=4728 + _QUERYRESULT._serialized_end=4884 + _QUERYSUCCESS._serialized_start=4886 + _QUERYSUCCESS._serialized_end=4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 + _FAILWORKFLOWEXECUTION._serialized_start=5031 + _FAILWORKFLOWEXECUTION._serialized_end=5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELWORKFLOWEXECUTION._serialized_start=6024 + _CANCELWORKFLOWEXECUTION._serialized_end=6100 + _SETPATCHMARKER._serialized_start=6102 + _SETPATCHMARKER._serialized_end=6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELSIGNALWORKFLOW._serialized_start=7958 + _CANCELSIGNALWORKFLOW._serialized_end=7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 + _UPDATERESPONSE._serialized_start=8180 + _UPDATERESPONSE._serialized_end=8390 + _SCHEDULENEXUSOPERATION._serialized_start=8393 + _SCHEDULENEXUSOPERATION._serialized_end=8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index ad4a5f487..040a2267c 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,6 +23,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,10 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: ... + @property + def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( self, *, @@ -215,6 +222,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... def HasField( self, @@ -243,6 +252,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -298,6 +311,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -350,6 +367,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "add_stream_messages", ] | None ): ... @@ -386,6 +405,77 @@ class StartTimer(google.protobuf.message.Message): global___StartTimer = StartTimer +class AddStreamMessages(google.protobuf.message.Message): + """Publish a batch of messages to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand messages cost the same in History as one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessages = AddStreamMessages + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 85b71d7ec..3d1f82e66 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 85b71d7ecd4f2bf677fa1cee17f3fbc1ab10f1b9 +Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 From fb397d396f445e1d5a3f9772ec897480c9fa6039 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 264/831] Added the vendored stream API protos. --- scripts/gen_stream_protos.py | 161 +++++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 138 ++++ .../api/streamservice/v1/message_pb2.py | 46 ++ .../api/streamservice/v1/message_pb2.pyi | 47 ++ .../api/streamservice/v1/message_pb2_grpc.py | 24 + .../streamservice/v1/request_response_pb2.py | 138 ++++ .../streamservice/v1/request_response_pb2.pyi | 434 ++++++++++++ .../v1/request_response_pb2_grpc.py | 24 + .../api/streamservice/v1/service_pb2.py | 38 ++ .../api/streamservice/v1/service_pb2.pyi | 5 + .../api/streamservice/v1/service_pb2_grpc.py | 616 ++++++++++++++++++ .../api/streamservice/v1/stream_state_pb2.py | 56 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 114 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 24 + 15 files changed, 1865 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..e66f8abb4 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,161 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, "-m", "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--pyi_out={out}", + f"--grpc_python_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..31f99bded --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,138 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + STREAM_MESSAGE_KIND_DATA, + STREAM_MESSAGE_KIND_FLUSH, + STREAM_MESSAGE_KIND_UNSPECIFIED, + StreamMessage, + StreamMessageBatch, + StreamMessageKind, +) + +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "STREAM_MESSAGE_KIND_DATA", + "STREAM_MESSAGE_KIND_FLUSH", + "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamLifecycle", + "StreamListEntry", + "StreamMessage", + "StreamMessageBatch", + "StreamMessageKind", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..b4fe8e68a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/message.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/message.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z None: ... + BODY_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + body: _message_pb2.Payload + metadata: _containers.MessageMap[str, _message_pb2.Payload] + topic: str + topic_sequence: int + kind: StreamMessageKind + offset: int + def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + +class StreamMessageBatch(_message.Message): + __slots__ = ("messages",) + MESSAGES_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] + def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..b1383816d --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..60dafee45 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/request_response.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/request_response.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + +class CreateStreamOutput(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class AddMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + expected_offset: int + use_expected_offset: bool + owner_epoch: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + +class AddMessagesOutput(_message.Message): + __slots__ = ("first_offset", "next_offset", "count", "deduplicated") + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] + first_offset: int + next_offset: int + count: int + deduplicated: bool + def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + +class FinishWritingInput(_message.Message): + __slots__ = ("namespace", "stream_id", "producer_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + producer_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + +class FinishWritingOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SubscribeWorkflowInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + stream_id: str + start_offset: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class SubscribeWorkflowOutput(_message.Message): + __slots__ = ("start_offset",) + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + start_offset: int + def __init__(self, start_offset: _Optional[int] = ...) -> None: ... + +class PollMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class PollMessagesOutput(_message.Message): + __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") + MESSAGES_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + next_offset: int + head_offset: int + closed: bool + close_reason: _message_pb2_1.Payload + def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class DescribeStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class PollWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class DescribeWorkflowStreamInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + +class AddWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + +class DescribeStreamOutput(_message.Message): + __slots__ = ("state",) + STATE_FIELD_NUMBER: _ClassVar[int] + state: _stream_state_pb2.StreamState + def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + +class CloseStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "reason") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + reason: _message_pb2_1.Payload + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class CloseStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TruncateStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "new_base_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + new_base_offset: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + +class TruncateStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class DeleteStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class CreateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CreateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + +class CreateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CreateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + +class AddMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + +class AddMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class FinishWritingRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: FinishWritingInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + +class FinishWritingResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: FinishWritingOutput + def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: SubscribeWorkflowInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: SubscribeWorkflowOutput + def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + +class PollMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + +class PollMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeWorkflowStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class CloseStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CloseStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + +class CloseStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CloseStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + +class TruncateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: TruncateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + +class TruncateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: TruncateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + +class ListStreamsInput(_message.Message): + __slots__ = ("namespace", "page_size", "next_page_token", "query") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + namespace: str + page_size: int + next_page_token: bytes + query: str + def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + +class StreamListEntry(_message.Message): + __slots__ = ("stream_id", "run_id") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + stream_id: str + run_id: str + def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + +class ListStreamsOutput(_message.Message): + __slots__ = ("streams", "next_page_token") + STREAMS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] + next_page_token: bytes + def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + +class ListStreamsRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: ListStreamsInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + +class ListStreamsResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: ListStreamsOutput + def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + +class DeleteStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DeleteStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + +class DeleteStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DeleteStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..87cc91022 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..7f376c28e --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class StreamServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True) + self.AddMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True) + self.FinishWriting = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True) + self.SubscribeWorkflow = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True) + self.PollMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True) + self.DescribeStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True) + self.PollWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True) + self.DescribeWorkflowStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True) + self.AddWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True) + self.CloseStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True) + self.TruncateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True) + self.ListStreams = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True) + self.DeleteStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True) + + +class StreamServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def CreateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinishWriting(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeWorkflow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollWorkflowMessages(self, request, context): + """Routed on the owner, because the stream it reads has no id of its own. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeWorkflowStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkflowMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TruncateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListStreams(self, request, context): + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_StreamServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateStream': grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + 'AddMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + 'FinishWriting': grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + 'PollMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + 'DescribeStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + 'CloseStream': grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + 'TruncateStream': grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + 'ListStreams': grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + 'DeleteStream': grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class StreamService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinishWriting(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeWorkflow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeWorkflowStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CloseStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def TruncateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListStreams(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..234fa94d0 --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/stream_state.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/stream_state.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z None: ... + class ConsumersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ConsumerCursor + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCERS_FIELD_NUMBER: _ClassVar[int] + CONSUMERS_FIELD_NUMBER: _ClassVar[int] + LIFECYCLE_FIELD_NUMBER: _ClassVar[int] + REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] + head_offset: int + base_offset: int + last_txn_id: int + closed: bool + close_reason: _message_pb2.Payload + owner_epoch: int + bucket_size: int + collection_id: str + producers: _containers.MessageMap[str, ProducerCursor] + consumers: _containers.MessageMap[str, ConsumerCursor] + lifecycle: StreamLifecycle + redirect_run_id: str + close_time: _timestamp_pb2.Timestamp + def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProducerCursor(_message.Message): + __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") + SEQ_FIELD_NUMBER: _ClassVar[int] + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] + FENCED_FIELD_NUMBER: _ClassVar[int] + seq: int + first_offset: int + count: int + content_hash: bytes + fenced: bool + def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + +class ConsumerCursor(_message.Message): + __slots__ = ("workflow_id", "run_id", "offset", "active", "external") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + run_id: str + offset: int + active: bool + external: bool + def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + +class WorkflowStreamCursor(_message.Message): + __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + PENDING_FROM_FIELD_NUMBER: _ClassVar[int] + PENDING_TO_FIELD_NUMBER: _ClassVar[int] + HAS_PENDING_FIELD_NUMBER: _ClassVar[int] + stream_id: str + collection_id: str + bucket_size: int + offset: int + known_head: int + external: bool + pending_from: int + pending_to: int + has_pending: bool + def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + +class StreamLifecycle(_message.Message): + __slots__ = ("retention", "max_items") + RETENTION_FIELD_NUMBER: _ClassVar[int] + MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] + retention: _duration_pb2.Duration + max_items: int + def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..4e128a2aa --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) From 5dc92db7bf13648eeaee767409e5daafba2e780f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 265/831] Added the stream client and the workflow stream surface. --- temporalio/client_stream.py | 476 +++++++++++++++++++++++ temporalio/worker/_workflow_instance.py | 142 +++++++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 119 ++++++ tests/test_client_stream.py | 128 ++++++ tests/worker/test_workflow_stream.py | 113 ++++++ tests/worker/test_workflow_stream_e2e.py | 244 ++++++++++++ 7 files changed, 1232 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py create mode 100644 tests/worker/test_workflow_stream.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..75388c9c9 --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,476 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` + instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, AsyncIterator, Optional, Sequence + +import google.protobuf.duration_pb2 + +import temporalio.api.common.v1 +import temporalio.api.streamservice.v1 as stream +from temporalio.api.streamservice.v1 import service_pb2_grpc + +__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] + + +@dataclass(frozen=True) +class Message: + """One item read from a stream. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back messages whose offsets are not contiguous. To resume at the + boundary of a whole read, checkpoint the ``next_offset`` that + :meth:`StreamHandle.read` returns instead. + """ + + data: bytes + topic: str = "" + offset: int = 0 + """Where this message sits in the whole stream. + + A topic filter leaves gaps, so a reader that resumes between messages has + to take this rather than count what it received. + """ + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. + """ + + messages: list[Message] + next_offset: int + head_offset: int + closed: bool + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + self._stub = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> "StreamClient": + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + try: + import grpc + except ImportError as err: + raise RuntimeError( + "temporalio.client_stream requires the grpc extra: " + "pip install 'temporalio[grpc]'" + ) from err + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: Optional[float] = None, + max_items: Optional[int] = None, + ) -> "StreamHandle": + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many messages remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await self._stub.CreateStream( + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ) + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> "StreamHandle": + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "" + ) -> "WorkflowStreamHandle": + """Open a stream a workflow publishes to. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.add_stream_messages`` writes to when it is given none. + + The stream is created by the workflow's first publish. Reading one that + does not exist yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when the + workflow publishes. + """ + return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + + +class StreamHandle: + """A handle to one stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append messages and return the offset the first one landed at. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice. Without them the append is at-least-once, which is + only the right trade when duplicates are harmless. + """ + response = await self._stub.AddMessages( + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, returning the messages and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=offset, + topics=list(topics), + wait_new_messages=True, + ) + ) + ) + out = response.frontend_response + for msg in out.messages: + yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) + offset = out.next_offset + if out.closed and offset >= out.head_offset: + return + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await self._stub.FinishWriting( + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ) + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await self._stub.CloseStream( + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await self._stub.DescribeStream( + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow publishes to. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, stub: Any, namespace: str, workflow_id: str, name: str = "" + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await self._stub.AddWorkflowMessages( + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for msg in page.messages: + yield msg + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_messages: int = 0, + wait: bool = True, + ) -> "Page": + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + """ + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return Page( + messages=[ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await self._stub.DescribeWorkflowStream( + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + ) + ) + ) + return response.frontend_response.state diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 26f796e57..66833dd8c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -272,6 +273,71 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# which would replay and re-issue the same rejected command forever, into an +# error the workflow author can see. +_MAX_STREAM_MESSAGES_PER_BATCH = 1000 + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self) -> None: + self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._waiters: list[asyncio.Future] = [] + + def extend( + self, + messages: Sequence[temporalio.api.stream.v1.StreamMessage], + from_offset: int = 0, + ) -> None: + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not messages: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-message field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + self._messages.extend( + temporalio.workflow.DeliveredStreamMessage( + body=message.body.data, + topic=message.topic, + offset=from_offset + index, + ) + for index, message in enumerate(messages) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: + taken, self._messages = self._messages, [] + return taken + + def put_back( + self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._messages[:0] = messages + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._messages) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -401,6 +467,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -616,6 +687,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_messages"): + self._apply_deliver_stream_messages(job.deliver_stream_messages) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1141,6 +1214,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_messages( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer() + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.messages, job.from_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1305,6 +1391,62 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. The + # server treats a repeat subscription to the same stream as a no-op. + self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: + if not messages: + raise ValueError("add_stream_messages needs at least one message") + if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " + f"got {len(messages)}" + ) + command = self._add_command() + command.add_stream_messages.stream_id = stream_id + for body in messages: + # The bodies ride the command and never enter History, so the event + # this produces stays the same size whatever is published here. + message = command.add_stream_messages.messages.add() + message.body.data = body + # Every other Temporal payload names its encoding, and the UI, the + # CLI and any codec server rely on that to decode what they read. + message.body.metadata["encoding"] = b"binary/plain" + message.topic = topic + + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: + return [ + m.body + for m in await self.workflow_read_stream_messages(stream_id, max_messages) + ] + + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[temporalio.workflow.DeliveredStreamMessage]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_messages and len(taken) > max_messages: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_messages:]) + taken = taken[:max_messages] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index f63135bf4..28e711d9b 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -95,6 +95,11 @@ upsert_search_attributes, uuid4, uuid7, + DeliveredStreamMessage, + read_stream, + read_stream_messages, + add_stream_messages, + subscribe_stream, wait_condition, ) from ._definition import ( @@ -233,6 +238,11 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamMessage", + "read_stream", + "read_stream_messages", + "add_stream_messages", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 25523836a..450051456 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -313,6 +313,24 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: ... + + @abstractmethod + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: ... + + @abstractmethod + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[DeliveredStreamMessage]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -949,6 +967,107 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream` returns them. Safe to call again: the server treats + a second subscription to the same stream as a no-op, which is what makes + calling it on every replay harmless. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. + + Args: + stream_id: Stream to consume. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def add_stream_messages( + messages: Sequence[bytes], + *, + stream_id: str = "", + topic: str = "", +) -> None: + """Publish a batch of messages to a stream this workflow owns. + + Returns as soon as the command is issued. The bodies go to the stream's own + log rather than into History, which gets one fixed-size event naming the + offset range, so a batch of a thousand costs History the same as a batch of + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Batch where you can. The event is per call, and a workflow is bounded by the + history event count, so one call with a hundred messages leaves far more + room than a hundred calls with one. + + Args: + messages: Bodies to append, in order. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + topic: Optional topic, which readers can filter on. Offsets are still + assigned over the unfiltered stream. + """ + _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + + +@dataclass(frozen=True) +class DeliveredStreamMessage: + """One message a consuming workflow was given, with where it sat.""" + + body: bytes + topic: str + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_messages( + stream_id: str, *, max_messages: int = 0 +) -> list[DeliveredStreamMessage]: + """Read the next messages, keeping their topic and position. + + Same delivery as :func:`read_stream`. A reader that has to name where it + got to, filter a topic, or hand a position to something outside the + workflow needs more than the bodies. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_messages( + stream_id, max_messages + ) + + +async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: + """Read the next messages of a stream this workflow consumes. + + Waits until at least one message is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. + + Subscribe out of band with the stream client. This only reads what has + already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + + Returns: + The message bodies, in stream order. + """ + return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..f7df3c7a7 --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,128 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import AsyncIterator + +import pytest + +from temporalio.client_stream import StreamClient, StreamHandle + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +@pytest.fixture +async def stream() -> AsyncIterator[StreamHandle]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + finally: + await client.close() + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + assert await stream.append(b"alpha", b"beta") == 0 + assert await stream.append(b"gamma") == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(b"alpha", b"beta", b"gamma") + + messages, next_offset = await stream.read() + assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + assert next_offset == 3 + + messages, next_offset = await stream.read(from_offset=1) + assert [m.data for m in messages] == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(b"alpha") + + messages, next_offset = await stream.read(from_offset=1) + assert messages == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same message twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(b"once", producer_id="p1", sequence=1) + retry = await stream.append(b"once", producer_id="p1", sequence=1) + assert first == retry == 0 + + messages, _ = await stream.read() + assert [m.data for m in messages] == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(b"tok", topic="tokens") + await stream.append(b"prog", topic="progress") + await stream.append(b"tok2", topic="tokens") + + messages, next_offset = await stream.read(topics=["tokens"]) + assert [m.data for m in messages] == [b"tok", b"tok2"] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for message in stream.follow(): + received.append(message.data) + + task = asyncio.create_task(follower()) + await stream.append(b"one") + await asyncio.sleep(0.2) + await stream.append(b"two") + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(b"one", b"two") + await stream.close() + + received = [m.data async for m in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(b"one", b"two") + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..944761cfa --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,113 @@ +"""In-workflow consumption of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering and the workflow-facing read directly, which is the part +this SDK owns; the delivery decision itself lives in the server and sdk-core. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.worker._workflow_instance import ( + _StreamBuffer, + _WorkflowInstanceImpl, +) + + +def message(body: bytes) -> api_stream.StreamMessage: + return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"one"), message(b"two")]) + + assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([message(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert [m.body.data for m in buffer.take()] == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert [m.body.data for m in buffer.take()] == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream``, so a test that reimplements + it proves nothing about the code that ships. + """ + + def __init__(self) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self.read_only_calls: list[str] = [] + + def _assert_not_read_only(self, action: str) -> None: + self.read_only_calls.append(action) + + +@pytest.mark.parametrize("max_messages", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: + stub = _ReadOnlyStub() + bodies = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b) for b in bodies]) + + got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + + assert got == bodies[:max_messages] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + + if len(stub._stream_buffers["s"]): + rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert got + rest == bodies + else: + assert got == bodies + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub() + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b"a")]) + + await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..579327217 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,244 @@ +"""A workflow publishing to a stream it owns and reading its own messages back. + +Path A and Path C together, both from workflow code. Needs a Temporal server +built from the AI-198 branch, because neither the stream service nor the +commands exist on a released one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest +from temporalio.api.enums.v1 import EventType + +from temporalio import workflow +from temporalio.client import Client +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +STREAM = "output" + +# Event type numbers rather than names: this SDK's api protos predate both +# events, so the attributes arrive as unknown fields and only the type is +# readable here. The server's own tests are where the offsets are asserted. +EVENT_STREAM_SUBSCRIBED = 61 +EVENT_STREAM_MESSAGES_ADDED = 62 + + +@workflow.defn +class PublishAndRead: + @workflow.run + async def run(self) -> list[str]: + # Published before subscribing, because a subscription resolves against + # the streams the workflow already owns and this is what creates one. + workflow.add_stream_messages( + [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + ) + workflow.add_stream_messages([b"delta"], stream_id=STREAM) + + workflow.subscribe_stream(STREAM, start_offset=0) + + received: list[str] = [] + while len(received) < 4: + for body in await workflow.read_stream(STREAM): + received.append(body.decode()) + return received + + +async def test_workflow_reads_back_what_it_published() -> None: + client = await Client.connect(TARGET or "") + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=wf_id, task_queue=task_queue + ), + timeout=60, + ) + + assert result == ["alpha", "beta", "gamma", "delta"] + + counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + + # Two calls carrying four messages, so two events: the event is per batch, + # which is what makes batching free. + assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class PublishOnSignal: + """Publishes a token per signal, which is the shape an agent turn has.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + self._done = False + + @workflow.run + async def run(self) -> int: + published = 0 + while True: + await workflow.wait_condition(lambda: self._pending or self._done) + while self._pending: + workflow.add_stream_messages([self._pending.pop(0).encode()]) + published += 1 + if self._done: + return published + + @workflow.signal + async def emit(self, token: str) -> None: + self._pending.append(token) + + @workflow.signal + async def finish(self) -> None: + self._done = True + + +async def test_a_client_follows_what_a_workflow_publishes() -> None: + """The harness shape: the workflow writes, something outside it reads live. + + A stream a workflow owns has no id, so the reader addresses it by the + owner. It also attaches before the first publish, which is what a UI opening + on a session does. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "follow-tq-" + uuid.uuid4().hex[:8] + wf_id = "follow-wf-" + uuid.uuid4().hex[:8] + + tokens = [f"token-{i}" for i in range(5)] + received: list[str] = [] + + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishOnSignal], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + PublishOnSignal.run, id=wf_id, task_queue=task_queue + ) + + # Attached before anything is published, so the stream does not + # exist yet and the first poll has to park rather than fail. + reader = streams.workflow_stream(wf_id) + assert (await reader.describe()).head_offset == 0 + + async def follow() -> None: + async for message in reader.follow(): + received.append(message.data.decode()) + if len(received) == len(tokens): + return + + following = asyncio.ensure_future(follow()) + for token in tokens: + await handle.signal(PublishOnSignal.emit, token) + await asyncio.wait_for(following, timeout=60) + + await handle.signal(PublishOnSignal.finish) + assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) + finally: + await streams.close() + + assert received == tokens + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each `read_stream` that finds nothing + blocks, which ends a Workflow Task, so the run spans several. With the + cache on, every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for body in await workflow.read_stream(stream_id): + seen.append(body.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + Every other end-to-end test here disables it, so the sticky path was never + exercised. The server sends no replay slice for a sticky task, while the + sticky history still carries the previous task's consumed range, and the + two together used to fail every task after the first consumed range. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, + task_queue=task_queue, + workflows=[ConsumeAcrossTasks], + # Left at the default deliberately. This is what the test is for. + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=wf_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append(*[t.encode() for t in batch]) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + # More than one Workflow Task ran, otherwise the test proves nothing. + completed = 0 + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: + completed += 1 + assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + finally: + await streams.close() From e1d34b026b192e5dd2e8d49840bb0bbb0dbdb3a1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 266/831] Added the Workflow Streams surface over a server-side stream. --- temporalio/contrib/server_streams/__init__.py | 397 ++++++++++++++++++ tests/contrib/test_server_streams.py | 154 +++++++ 2 files changed, 551 insertions(+) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..e831d763c --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,397 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per batch rather than a +Signal per batch. A consumer reads the log directly rather than long-polling an +Update, so there is no per-Workflow limit on how many can read at once, and a +closed Workflow stays readable until its stream's retention expires. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, Optional, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.converter import DataConverter, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still encoded. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + """ + + items: list["WorkflowStreamItem[bytes]"] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _encode(converter: PayloadConverter, value: Any) -> bytes: + """Serialize one value to a stream message body. + + The payload rather than the bare bytes, so the encoding metadata the + consumer needs to decode into a type travels with it. + + The codec chain is not applied. It cannot be applied here: a codec is async + and a Workflow publishing to a stream is not, so running one inside Workflow + code would be I/O on the Workflow thread. Regular payloads solve this in the + Worker, encoding on the way out and decoding on the way in, and a stream + needs the same plumbing before a codec can be honoured. + + It is not applied on the client path either, deliberately. Encoding one side + and not the other is worse than encoding neither: an Activity's messages + would reach a consuming Workflow as ciphertext it has no way to decode. + :func:`_reject_configured_codec` is what keeps that from happening quietly. + """ + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies bypass the codec chain, so proceeding would write payloads + this namespace expects to be encrypted in the clear, and would do it + silently. Raising is the only honest answer until the Worker-side plumbing + exists. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it. Publishing would store them " + "unencoded. Use a client without a codec, or wait for codec support " + "on streams." + ) + + +def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns as soon as the Command is issued. There is nothing to await: + the append is applied in the Workflow Task's own commit, so it costs + this Workflow no round trip and no extra transition. + """ + workflow.add_stream_messages( + [_encode(workflow.payload_converter(), value)], topic=self._name + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic( + self, name: str, *, type: type = object + ) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`.""" + self._handle = handle + self._converter = converter + self._batch_interval = batch_interval + self._buffered: list[tuple[str, Any]] = [] + self._flusher: Optional[asyncio.Task[None]] = None + self._wake = asyncio.Event() + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> "WorkflowStreamClient": + """Open the stream owned by ``workflow_id``.""" + _reject_configured_codec(client) + return cls( + _stream_client(client).workflow_stream(workflow_id), + client.data_converter.payload_converter, + batch_interval, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> "WorkflowStreamClient": + """Open the stream owned by the Workflow that scheduled this Activity.""" + client = activity.client() + return cls.create( + client, activity.info().workflow_id, batch_interval=batch_interval + ) + + async def __aenter__(self) -> "WorkflowStreamClient": + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. + """ + if self._flusher is not None: + self._flusher.cancel() + try: + await self._flusher + except asyncio.CancelledError: + pass + self._flusher = None + await self.flush() + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + async for message in self._handle.follow(from_offset=from_offset, topics=topics): + yield WorkflowStreamItem( + topic=message.topic, + data=_decode(self._converter, message.data, result_type), + offset=message.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> "RawPage": + """One read, with the bodies left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) + for m in page.messages + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + # One append per topic, because a batch carries a single topic. The + # harness case is one topic, so this is one append. + by_topic: dict[str, list[bytes]] = {} + for topic, value in pending: + by_topic.setdefault(topic, []).append(_encode(self._converter, value)) + for topic, bodies in by_topic.items(): + await self._handle.append(*bodies, topic=topic) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while True: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + +# One channel per target, shared by every handle in the process. The channel is +# multiplexed and long-lived, and callers here open a client per subscription, +# which would otherwise be a connection per subscription. +_clients: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop too: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _clients.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _clients[key] = existing + return existing diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..33d86d827 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,154 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow( + Emitting.run, 3, id=wf_id, task_queue=task_queue + ) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] From 9e900594253db0f7420b1c123f5ab8a6071592e1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:57:03 -0700 Subject: [PATCH 267/831] Added the native provider module. --- temporalio/streams/providers/native.py | 398 +++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 temporalio/streams/providers/native.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..f5570b05a --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,398 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server. A workflow publishes with a command that +the server applies in the same transaction that accepts the workflow task, and +consumes ranges the server attaches to the workflow task it dispatches. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_STATE = "__temporal_streams_state" + + +class _Fanout: + """One server subscription, shared by every reader of that stream. + + The server sends a range once. Whoever reads it first would otherwise take + it from the others, so the pull happens here and the result goes to all + live readers. + """ + + def __init__(self, stream: str) -> None: + self._stream = stream + self._subscribers: list[list[tuple[Cursor, bytes]]] = [] + self._pull: asyncio.Future[None] | None = None + + def attach(self) -> list[tuple[Cursor, bytes]]: + queue: list[tuple[Cursor, bytes]] = [] + self._subscribers.append(queue) + return queue + + def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: + if queue in self._subscribers: + self._subscribers.remove(queue) + + async def next_batch( + self, queue: list[tuple[Cursor, bytes]] + ) -> list[tuple[Cursor, bytes]]: + while not queue: + pending = self._pull + if pending is None: + pending = self._pull = asyncio.ensure_future(self._run_pull()) + # Shielded because one reader going away must not cancel a range + # the server will not send again. + await asyncio.shield(pending) + batch, queue[:] = list(queue), [] + return batch + + async def _run_pull(self) -> None: + try: + delivered = await workflow.read_stream_messages(self._stream) + arrived = [ + (Cursor(str(message.offset)), message.body) for message in delivered + ] + for queue in self._subscribers: + queue.extend(arrived) + finally: + self._pull = None + + +def _fanouts() -> dict[str, _Fanout]: + instance = workflow.instance() + state = getattr(instance, _RUN_STATE, None) + if state is None: + state = {} + setattr(instance, _RUN_STATE, state) + return state + + +class _NativeReadSource: + def __init__(self, fanout: _Fanout) -> None: + self._fanout = fanout + self._queue = fanout.attach() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + return await self._fanout.next_batch(self._queue) + + def close(self) -> None: + self._fanout.detach(self._queue) + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Nothing is awaited. The server applies the payload when it accepts + # the task, so there is no back pressure to wait on and no round trip + # to pay for. The signature is awaitable because the contract allows a + # provider that does hold a publisher back. + workflow.add_stream_messages([frame], stream_id="", topic=self._topic) + + +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The server-side id of a workflow's inbound stream. + + A workflow names its streams relative to itself, so every provider can + address the same thing without workflow code knowing how it is stored. + Here that is a namespace-level stream id built from the pair, and the + workflow id rather than the run id because the stream has to survive + continue-as-new and reset. + """ + return f"{workflow_id}:{stream}" + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies do not pass through the codec chain on this provider, so + proceeding would store in the clear what the namespace expects encrypted, + and would do it without saying so. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it" + ) + + +# Streams this process has already opened, so a second producer for the same +# stream reuses the handle rather than asking the server to create it again. +# The second create is answered correctly, and it is still a failed call the +# server logs, which is noise an operator has to learn to ignore. +_handles: dict[str, Any] = {} + + +# One channel per target and namespace, shared by every handle in the process. +# A channel is multiplexed and long lived, and callers open a handle per +# subscription, which would otherwise be a connection per subscription. +_channels: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _channels.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _channels[key] = existing + return existing + + +class NativeProducer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + handle: Any, + converter: Any, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + self._handle = handle + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _provider_id(self) -> str: + """The identity the provider dedupes on. + + The attempt is part of it. Deduplication answers "is this the same + append again", and a second attempt writing different words at the same + sequence is not. Folding the attempt in keeps a retried append idempotent + without letting a new generation be swallowed as a duplicate of the old + one. + """ + return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = await self._handle.append( + *frames, + topic=self._topic, + producer_id=self._provider_id, + # The provider dedupes a retried append on this pair, which is a + # different job from telling readers that a new generation started. + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._handle.append( + frame, + topic=self._topic, + producer_id=self._provider_id, + sequence=self._sequence - 1, + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class NativeConsumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, handle: Any, converter: Any) -> None: + self._handle = handle + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + attempts = AttemptTracker() + async for message in self._handle.follow( + from_offset=int(start.token) if start.token else 0 + ): + cursor = Cursor(str(message.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + message.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NativeProvider: + name = "native" + + def configure(self, **options: Any) -> None: + """Nothing to name: the streams are on the server the client is + already connected to. It exists so a process that switches providers + changes one call rather than its structure.""" + if options: + raise TypeError( + f"the native provider takes no options, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Accepted and ignored. Delivery arrives on workflow tasks the server + # dispatches, so no worker is held between records and there is nothing + # for an idle timeout to release. + del idle_timeout + stream_id = inbound_stream_id(workflow.info().workflow_id, stream) + fanouts = _fanouts() + fanout = fanouts.get(stream_id) + if fanout is None: + workflow.subscribe_stream( + stream_id, start_offset=int(start.token) if start.token else 0 + ) + fanout = fanouts[stream_id] = _Fanout(stream_id) + return _NativeReadSource(fanout) + + def open_write(self, topic: str) -> WriteSink: + return _NativeWriteSink(topic) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + _reject_configured_codec(client) + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + streams = _stream_client(client) + stream_id = inbound_stream_id(workflow_id, stream) + handle = _handles.get(stream_id) + if handle is None: + try: + handle = await streams.create(stream_id) + except Exception: + # Created by whoever set the stream up. A producer opening a + # stream it does not own is the ordinary case, not the + # exception. + handle = streams.get(stream_id) + _handles[stream_id] = handle + return NativeProducer( + handle, + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> NativeConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. Naming one reads that inbound + stream instead, which is how a second consumer follows the same input. + """ + _reject_configured_codec(client) + streams = _stream_client(client) + if stream: + handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + else: + handle = streams.workflow_stream(workflow_id) + return NativeConsumer(handle, client.data_converter.payload_converter) + + +_provider.register("native", _NativeProvider) From 17d05c6c93c2be5da8bd19267b978dec09819372 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 268/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/native.py | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f5570b05a..c0044b9cf 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -255,18 +255,18 @@ def __init__(self, handle: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() async for message in self._handle.follow( - from_offset=int(start.token) if start.token else 0 + from_offset=int(after.token) + 1 if after.token else 0 ): cursor = Cursor(str(message.offset)) try: @@ -290,6 +290,16 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one server-side log per stream, whatever the topic + try: + state = await self._handle.describe() + except Exception: + # A stream nobody has published to does not exist yet, and that + # is the same answer as an empty one. + return BEGINNING + return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -317,7 +327,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Accepted and ignored. Delivery arrives on workflow tasks the server @@ -329,7 +339,7 @@ def open_read( fanout = fanouts.get(stream_id) if fanout is None: workflow.subscribe_stream( - stream_id, start_offset=int(start.token) if start.token else 0 + stream_id, start_offset=int(after.token) + 1 if after.token else 0 ) fanout = fanouts[stream_id] = _Fanout(stream_id) return _NativeReadSource(fanout) @@ -342,15 +352,18 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NativeProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the stream the workflow publishes, which the server lets any + producer append to. Inside an activity, leave ``producer_id`` and + ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ _reject_configured_codec(client) if not producer_id: @@ -358,6 +371,14 @@ async def producer( if not attempt: attempt = activity.info().attempt streams = _stream_client(client) + if not stream: + return NativeProducer( + streams.workflow_stream(workflow_id), + client.data_converter.payload_converter, + topic, + producer_id, + attempt, + ) stream_id = inbound_stream_id(workflow_id, stream) handle = _handles.get(stream_id) if handle is None: From 92dc8c178f858fd2538b3f59220cfe6f42938dc2 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:49:04 -0700 Subject: [PATCH 269/831] Read the delivered message shape the buffer now hands back. The buffer holds a body, topic and offset rather than the wire message, and the cap moved to `workflow_read_stream_messages`. --- tests/worker/test_workflow_stream.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 944761cfa..bb0dcf9ba 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -28,7 +28,7 @@ async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() buffer.extend([message(b"one"), message(b"two")]) - assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert [m.body for m in buffer.take()] == [b"one", b"two"] assert len(buffer) == 0 @@ -41,7 +41,7 @@ async def test_buffer_wakes_a_waiting_reader() -> None: buffer.extend([message(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body.data for m in buffer.take()] == [b"late"] + assert [m.body for m in buffer.take()] == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -64,16 +64,21 @@ async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body.data for m in buffer.take()] == [b"early"] + assert [m.body for m in buffer.take()] == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream``, so a test that reimplements - it proves nothing about the code that ships. + The cap lives inside ``workflow_read_stream_messages``, so a test that + reimplements it proves nothing about the code that ships. Borrowing the + method off the real class is what keeps the test on the shipped path. """ + workflow_read_stream_messages = ( + _WorkflowInstanceImpl.workflow_read_stream_messages + ) + def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} self.read_only_calls: list[str] = [] From b72223f1bb82c0ed135df0c25eaf810b8257d7fb Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 270/831] Regenerated the protos from the pinned Core. The pinned Core carries the stream additions to the public API, so the command, enum, history and workflow service messages were stale. Only the vendored stream service protos still come from the server checkout. --- temporalio/bridge/_visitor.py | 28 + .../workflow_activation_pb2.py | 626 +++++++------ .../workflow_activation_pb2.pyi | 116 +-- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 823 +++++++++++------- .../workflow_commands_pb2.pyi | 94 +- 6 files changed, 1016 insertions(+), 675 deletions(-) diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..77d1b6c7a 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamMessage( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +367,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_messages"): + await self._visit_coresdk_workflow_activation_DeliverStreamMessages( + fs, o.deliver_stream_messages + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any @@ -492,6 +510,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AddStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -551,6 +575,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("add_stream_messages"): + await self._visit_coresdk_workflow_commands_AddStreamMessages( + fs, o.add_stream_messages + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0e1b3a1e6..cd09b8b97 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,311 +2,447 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') - - +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] -_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] -_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] -WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }) +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.update.v1 import ( + message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.activity_result import ( + activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' +) + + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ + "HeadersEntry" +] +_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStart" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartSuccess" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartFailure" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartCancelled" +] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecution" +] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveSignalExternalWorkflow" +] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveRequestCancelExternalWorkflow" +] +_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveNexusOperationStart" +] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] +WorkflowActivation = _reflection.GeneratedProtocolMessageType( + "WorkflowActivation", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }, +) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( + "WorkflowActivationJob", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }, +) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) - }) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( + "DeliverStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }, +) _sym_db.RegisterMessage(DeliverStreamMessages) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _INITIALIZEWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }) +InitializeWorkflow = _reflection.GeneratedProtocolMessageType( + "InitializeWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _INITIALIZEWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }, +) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { - 'DESCRIPTOR' : _FIRETIMER, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }) +FireTimer = _reflection.GeneratedProtocolMessageType( + "FireTimer", + (_message.Message,), + { + "DESCRIPTOR": _FIRETIMER, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }, +) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }) +ResolveActivity = _reflection.GeneratedProtocolMessageType( + "ResolveActivity", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEACTIVITY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }, +) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartSuccess", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartFailure", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartCancelled", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERANDOMSEED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( + "UpdateRandomSeed", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERANDOMSEED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }, +) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _QUERYWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }) +QueryWorkflow = _reflection.GeneratedProtocolMessageType( + "QueryWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _QUERYWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }, +) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }) +CancelWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }, +) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }) +SignalWorkflow = _reflection.GeneratedProtocolMessageType( + "SignalWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }, +) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { - 'DESCRIPTOR' : _NOTIFYHASPATCH, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType( + "NotifyHasPatch", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYHASPATCH, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }, +) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveSignalExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveRequestCancelExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }) - , - 'DESCRIPTOR' : _DOUPDATE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }) +DoUpdate = _reflection.GeneratedProtocolMessageType( + "DoUpdate", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }, + ), + "DESCRIPTOR": _DOUPDATE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }, +) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperationStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }, +) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }, +) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEFROMCACHE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }) +RemoveFromCache = _reflection.GeneratedProtocolMessageType( + "RemoveFromCache", + (_message.Message,), + { + "DESCRIPTOR": _REMOVEFROMCACHE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }, +) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' - _WORKFLOWACTIVATION._serialized_start=570 - _WORKFLOWACTIVATION._serialized_end=1116 - _WORKFLOWACTIVATIONJOB._serialized_start=1119 - _WORKFLOWACTIVATIONJOB._serialized_end=2582 - _DELIVERSTREAMMESSAGES._serialized_start=2585 - _DELIVERSTREAMMESSAGES._serialized_end=2724 - _INITIALIZEWORKFLOW._serialized_start=2727 - _INITIALIZEWORKFLOW._serialized_end=4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 - _FIRETIMER._serialized_start=4133 - _FIRETIMER._serialized_end=4157 - _RESOLVEACTIVITY._serialized_start=4159 - _RESOLVEACTIVITY._serialized_end=4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 - _UPDATERANDOMSEED._serialized_start=5045 - _UPDATERANDOMSEED._serialized_end=5088 - _QUERYWORKFLOW._serialized_start=5091 - _QUERYWORKFLOW._serialized_end=5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 - _CANCELWORKFLOW._serialized_start=5353 - _CANCELWORKFLOW._serialized_end=5385 - _SIGNALWORKFLOW._serialized_start=5388 - _SIGNALWORKFLOW._serialized_end=5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 - _NOTIFYHASPATCH._serialized_start=5679 - _NOTIFYHASPATCH._serialized_end=5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 - _DOUPDATE._serialized_start=5917 - _DOUPDATE._serialized_end=6248 - _DOUPDATE_HEADERSENTRY._serialized_start=4052 - _DOUPDATE_HEADERSENTRY._serialized_end=4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 - _RESOLVENEXUSOPERATION._serialized_start=6407 - _RESOLVENEXUSOPERATION._serialized_end=6496 - _REMOVEFROMCACHE._serialized_start=6499 - _REMOVEFROMCACHE._serialized_end=6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" + ) + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" + _WORKFLOWACTIVATION._serialized_start = 570 + _WORKFLOWACTIVATION._serialized_end = 1116 + _WORKFLOWACTIVATIONJOB._serialized_start = 1119 + _WORKFLOWACTIVATIONJOB._serialized_end = 2582 + _DELIVERSTREAMMESSAGES._serialized_start = 2585 + _DELIVERSTREAMMESSAGES._serialized_end = 2724 + _INITIALIZEWORKFLOW._serialized_start = 2727 + _INITIALIZEWORKFLOW._serialized_end = 4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _FIRETIMER._serialized_start = 4133 + _FIRETIMER._serialized_end = 4157 + _RESOLVEACTIVITY._serialized_start = 4159 + _RESOLVEACTIVITY._serialized_end = 4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 + _UPDATERANDOMSEED._serialized_start = 5045 + _UPDATERANDOMSEED._serialized_end = 5088 + _QUERYWORKFLOW._serialized_start = 5091 + _QUERYWORKFLOW._serialized_end = 5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _CANCELWORKFLOW._serialized_start = 5353 + _CANCELWORKFLOW._serialized_end = 5385 + _SIGNALWORKFLOW._serialized_start = 5388 + _SIGNALWORKFLOW._serialized_end = 5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _NOTIFYHASPATCH._serialized_start = 5679 + _NOTIFYHASPATCH._serialized_end = 5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 + _DOUPDATE._serialized_start = 5917 + _DOUPDATE._serialized_end = 6248 + _DOUPDATE_HEADERSENTRY._serialized_start = 4052 + _DOUPDATE_HEADERSENTRY._serialized_end = 4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 + _RESOLVENEXUSOPERATION._serialized_start = 6407 + _RESOLVENEXUSOPERATION._serialized_end = 6496 + _REMOVEFROMCACHE._serialized_start = 6499 + _REMOVEFROMCACHE._serialized_end = 6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index eab815fc9..5245cd6fc 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,9 +19,9 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -439,6 +439,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" @@ -1451,63 +1508,6 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation -class DeliverStreamMessages(google.protobuf.message.Message): - """Hand a workflow the next range of a stream it subscribed to. - - The range is delivered once, on the task the server decided it belongs to, - and the offsets it covered are recorded in History rather than the payloads. - On replay the server re-supplies the same range by reading the stream again, - so this job appears at the same point with the same contents both times. - - An empty range is still delivered: a task where the subscription saw nothing - is a fact replay has to reproduce, not an absence of one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - FROM_OFFSET_FIELD_NUMBER: builtins.int - TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Id of the stream this range came from.""" - from_offset: builtins.int - """Inclusive.""" - to_offset: builtins.int - """Exclusive. Equal to from_offset when the subscription saw nothing.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - from_offset: builtins.int = ..., - to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "from_offset", - b"from_offset", - "messages", - b"messages", - "stream_id", - b"stream_id", - "to_offset", - b"to_offset", - ], - ) -> None: ... - -global___DeliverStreamMessages = DeliverStreamMessages - class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..44826f2da 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AddStreamMessages, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -21,6 +22,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -28,6 +30,7 @@ __all__ = [ "ActivityCancellationType", + "AddStreamMessages", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -49,6 +52,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index ccfa1a016..3374f951a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,408 +2,583 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.sdk.v1 import ( + event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, +) +from temporalio.api.sdk.v1 import ( + user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' +) + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] -_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] -_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] -_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] -WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWCOMMAND, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] +_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] +_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ + "HeadersEntry" +] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ + "RequestCancelLocalActivity" +] +_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CompleteWorkflowExecution" +] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ContinueAsNewWorkflowExecution" +] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "StartChildWorkflowExecution" +] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CancelChildWorkflowExecution" +] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "RequestCancelExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "SignalExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( + _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UpsertWorkflowSearchAttributes" +] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ + "NexusHeaderEntry" +] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ + "RequestCancelNexusOperation" +] +WorkflowCommand = _reflection.GeneratedProtocolMessageType( + "WorkflowCommand", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWCOMMAND, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }, +) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _ADDSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) - }) +AddStreamMessages = _reflection.GeneratedProtocolMessageType( + "AddStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }, +) _sym_db.RegisterMessage(AddStreamMessages) -SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { - 'DESCRIPTOR' : _SUBSCRIBESTREAM, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) - }) +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) _sym_db.RegisterMessage(SubscribeStream) -StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { - 'DESCRIPTOR' : _STARTTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }) +StartTimer = _reflection.GeneratedProtocolMessageType( + "StartTimer", + (_message.Message,), + { + "DESCRIPTOR": _STARTTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }, +) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { - 'DESCRIPTOR' : _CANCELTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }) +CancelTimer = _reflection.GeneratedProtocolMessageType( + "CancelTimer", + (_message.Message,), + { + "DESCRIPTOR": _CANCELTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }, +) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }) +ScheduleActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULEACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }, +) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleLocalActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULELOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }, +) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }, +) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelLocalActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }, +) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }) +QueryResult = _reflection.GeneratedProtocolMessageType( + "QueryResult", + (_message.Message,), + { + "DESCRIPTOR": _QUERYRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }, +) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { - 'DESCRIPTOR' : _QUERYSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }) +QuerySuccess = _reflection.GeneratedProtocolMessageType( + "QuerySuccess", + (_message.Message,), + { + "DESCRIPTOR": _QUERYSUCCESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }, +) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CompleteWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }, +) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "FailWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _FAILWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }, +) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }) - , - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ContinueAsNewWorkflowExecution", + (_message.Message,), + { + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }, + ), + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }, +) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { - 'DESCRIPTOR' : _SETPATCHMARKER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }) +SetPatchMarker = _reflection.GeneratedProtocolMessageType( + "SetPatchMarker", + (_message.Message,), + { + "DESCRIPTOR": _SETPATCHMARKER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }, +) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }) - , - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }) - , - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "StartChildWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }, + ), + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }, + ), + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "RequestCancelExternalWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "SignalExternalWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelSignalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELSIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }, +) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { - 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( + "UpsertWorkflowSearchAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }, +) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { - 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( + "ModifyWorkflowProperties", + (_message.Message,), + { + "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }, +) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERESPONSE, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }) +UpdateResponse = _reflection.GeneratedProtocolMessageType( + "UpdateResponse", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERESPONSE, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }, +) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { - - 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( + "ScheduleNexusOperation", + (_message.Message,), + { + "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( + "NexusHeaderEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }, + ), + "DESCRIPTOR": _SCHEDULENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }, +) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( + "RequestCancelNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }, +) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' - _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 - _WORKFLOWCOMMAND._serialized_start=556 - _WORKFLOWCOMMAND._serialized_end=2794 - _ADDSTREAMMESSAGES._serialized_start=2796 - _ADDSTREAMMESSAGES._serialized_end=2891 - _SUBSCRIBESTREAM._serialized_start=2893 - _SUBSCRIBESTREAM._serialized_end=2951 - _STARTTIMER._serialized_start=2953 - _STARTTIMER._serialized_end=3036 - _CANCELTIMER._serialized_start=3038 - _CANCELTIMER._serialized_end=3064 - _SCHEDULEACTIVITY._serialized_start=3067 - _SCHEDULEACTIVITY._serialized_end=3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 - _SCHEDULELOCALACTIVITY._serialized_start=3894 - _SCHEDULELOCALACTIVITY._serialized_end=4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 - _REQUESTCANCELACTIVITY._serialized_start=4646 - _REQUESTCANCELACTIVITY._serialized_end=4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 - _QUERYRESULT._serialized_start=4728 - _QUERYRESULT._serialized_end=4884 - _QUERYSUCCESS._serialized_start=4886 - _QUERYSUCCESS._serialized_end=4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 - _FAILWORKFLOWEXECUTION._serialized_start=5031 - _FAILWORKFLOWEXECUTION._serialized_end=5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELWORKFLOWEXECUTION._serialized_start=6024 - _CANCELWORKFLOWEXECUTION._serialized_end=6100 - _SETPATCHMARKER._serialized_start=6102 - _SETPATCHMARKER._serialized_end=6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELSIGNALWORKFLOW._serialized_start=7958 - _CANCELSIGNALWORKFLOW._serialized_end=7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 - _UPDATERESPONSE._serialized_start=8180 - _UPDATERESPONSE._serialized_end=8390 - _SCHEDULENEXUSOPERATION._serialized_start=8393 - _SCHEDULENEXUSOPERATION._serialized_end=8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" + ) + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2794 + _ADDSTREAMMESSAGES._serialized_start = 2796 + _ADDSTREAMMESSAGES._serialized_end = 2891 + _SUBSCRIBESTREAM._serialized_start = 2893 + _SUBSCRIBESTREAM._serialized_end = 2951 + _STARTTIMER._serialized_start = 2953 + _STARTTIMER._serialized_end = 3036 + _CANCELTIMER._serialized_start = 3038 + _CANCELTIMER._serialized_end = 3064 + _SCHEDULEACTIVITY._serialized_start = 3067 + _SCHEDULEACTIVITY._serialized_end = 3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 + _SCHEDULELOCALACTIVITY._serialized_start = 3894 + _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 + _REQUESTCANCELACTIVITY._serialized_start = 4646 + _REQUESTCANCELACTIVITY._serialized_end = 4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 + _QUERYRESULT._serialized_start = 4728 + _QUERYRESULT._serialized_end = 4884 + _QUERYSUCCESS._serialized_start = 4886 + _QUERYSUCCESS._serialized_end = 4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 + _FAILWORKFLOWEXECUTION._serialized_start = 5031 + _FAILWORKFLOWEXECUTION._serialized_end = 5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELWORKFLOWEXECUTION._serialized_start = 6024 + _CANCELWORKFLOWEXECUTION._serialized_end = 6100 + _SETPATCHMARKER._serialized_start = 6102 + _SETPATCHMARKER._serialized_end = 6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELSIGNALWORKFLOW._serialized_start = 7958 + _CANCELSIGNALWORKFLOW._serialized_end = 7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 + _UPDATERESPONSE._serialized_start = 8180 + _UPDATERESPONSE._serialized_end = 8390 + _SCHEDULENEXUSOPERATION._serialized_start = 8393 + _SCHEDULENEXUSOPERATION._serialized_end = 8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 040a2267c..bcf1bf7eb 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,9 +23,9 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -228,6 +228,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -252,10 +254,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -272,6 +270,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -285,6 +285,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -311,10 +313,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -331,6 +329,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -375,38 +375,14 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class StartTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... - def __init__( - self, - *, - seq: builtins.int = ..., - start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> None: ... - -global___StartTimer = StartTimer - class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -444,14 +420,6 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int @@ -476,6 +444,36 @@ class SubscribeStream(google.protobuf.message.Message): global___SubscribeStream = SubscribeStream +class StartTimer(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int + seq: builtins.int + """Lang's incremental sequence number, used as the operation identifier""" + @property + def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + seq: builtins.int = ..., + start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> None: ... + +global___StartTimer = StartTimer + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor From 29dcc23d059a08025fd1a72131ee6ac2cbe46af2 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 271/831] Sorted and formatted the server-side stream modules. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and `check-protos` reformats what it regenerates. --- scripts/gen_stream_protos.py | 29 +++++++++++++++---- temporalio/client_stream.py | 14 +++++---- temporalio/contrib/server_streams/__init__.py | 12 ++++---- temporalio/streams/providers/native.py | 14 +++++++-- temporalio/workflow/__init__.py | 10 +++---- tests/contrib/test_server_streams.py | 16 ++++++---- tests/worker/test_workflow_stream.py | 4 +-- tests/worker/test_workflow_stream_e2e.py | 6 ++-- 8 files changed, 70 insertions(+), 35 deletions(-) diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index e66f8abb4..f57ff6177 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -34,7 +34,13 @@ # the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` # checkout instead when the submodule is not initialized. UPSTREAM_API = ( - BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + BASE + / "temporalio" + / "bridge" + / "sdk-core" + / "crates" + / "protos" + / "protos" / "api_upstream" ) @@ -43,16 +49,24 @@ def api_proto_path() -> Path: override = os.environ.get("TEMPORAL_API_PROTOS") if override: return Path(override).resolve() - if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + if ( + UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto" + ).is_file(): return UPSTREAM_API raise SystemExit( "no api protos found: initialize the sdk-core submodule or set " "TEMPORAL_API_PROTOS to a temporalio/api checkout" ) + SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") -FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] +FILES = [ + "message.proto", + "stream_state.proto", + "request_response.proto", + "service.proto", +] # Server-only options. They carry shard routing and rate-limit category, which # a client neither reads nor can resolve, since the files defining them are not @@ -63,7 +77,10 @@ def api_proto_path() -> Path: # protoc names a python module after the proto path. These put the generated # modules where this package publishes them. FIX_PY = [ - (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + ( + re.compile(r"from temporalio\.api\.stream\.v1 import"), + "from temporalio.api.streamservice.v1 import", + ), (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), (re.compile(r"from temporal\.api\."), "from temporalio.api."), (re.compile(r"import temporal\.api\."), "import temporalio.api."), @@ -96,7 +113,9 @@ def main() -> None: out.mkdir() subprocess.run( [ - sys.executable, "-m", "grpc_tools.protoc", + sys.executable, + "-m", + "grpc_tools.protoc", f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 75388c9c9..1b5d953bd 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -242,9 +242,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, @@ -401,9 +402,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index e831d763c..b6db1fd7a 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -169,9 +169,7 @@ def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... @overload def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... - def topic( - self, name: str, *, type: type = object - ) -> WorkflowTopicHandle[Any]: + def topic(self, name: str, *, type: type = object) -> WorkflowTopicHandle[Any]: """Bind a topic on this Workflow's stream.""" return WorkflowTopicHandle(name, type) @@ -179,7 +177,9 @@ def topic( class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" - def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + def __init__( + self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client self._name = topic @@ -316,7 +316,9 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown - async for message in self._handle.follow(from_offset=from_offset, topics=topics): + async for message in self._handle.follow( + from_offset=from_offset, topics=topics + ): yield WorkflowStreamItem( topic=message.topic, data=_decode(self._converter, message.data, result_type), diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index c0044b9cf..1243d3784 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -193,7 +193,11 @@ def _provider_id(self) -> str: without letting a new generation be swallowed as a duplicate of the old one. """ - return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) async def append(self, *values: Any) -> Cursor: """Append values and return where the first one landed.""" @@ -240,7 +244,9 @@ async def finish(self) -> None: def _encode(self, value: Any) -> bytes: payload = ( - value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] ) return payload.SerializeToString() @@ -298,7 +304,9 @@ async def latest(self, *, topic: str | None = None) -> Cursor: # A stream nobody has published to does not exist yet, and that # is the same answer as an empty one. return BEGINNING - return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + return ( + Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + ) def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 28e711d9b..8d57b75e7 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,6 +58,7 @@ wait, ) from ._context import ( + DeliveredStreamMessage, Info, ParentInfo, RootInfo, @@ -65,6 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, + add_stream_messages, cancellation_reason, current_update_info, deprecate_patch, @@ -86,20 +88,18 @@ payload_converter, random, random_seed, + read_stream, + read_stream_messages, register_random_seed_callback, set_current_details, sleep, + subscribe_stream, time, time_ns, upsert_memo, upsert_search_attributes, uuid4, uuid7, - DeliveredStreamMessage, - read_stream, - read_stream_messages, - add_stream_messages, - subscribe_stream, wait_condition, ) from ._definition import ( diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 33d86d827..e1fe84c77 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -103,7 +103,9 @@ async def read() -> None: # The Workflow's own publishes bracket the Activity's, and both are on one # log in the order the server took them. - assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + [ + "workflow" + ] assert seen[0].text == "turn started" assert seen[-1].text == "turn ended" assert offsets == list(range(tokens + 2)) @@ -115,7 +117,9 @@ async def read() -> None: assert await late.get_offset() == tokens + 2 replayed = [ item.data.text - async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in late.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert replayed == [e.text for e in seen] @@ -132,14 +136,14 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: activities=[emit_from_activity], max_cached_workflows=0, ): - await client.execute_workflow( - Emitting.run, 3, id=wf_id, task_queue=task_queue - ) + await client.execute_workflow(Emitting.run, 3, id=wf_id, task_queue=task_queue) stream = WorkflowStreamClient.create(client, wf_id) first = [ item - async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert len(first) == 5 diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index bb0dcf9ba..40d6fdf45 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -75,9 +75,7 @@ class _ReadOnlyStub: method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = ( - _WorkflowInstanceImpl.workflow_read_stream_messages - ) + workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 579327217..00d0dfa85 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,9 +17,9 @@ import uuid import pytest -from temporalio.api.enums.v1 import EventType from temporalio import workflow +from temporalio.api.enums.v1 import EventType from temporalio.client import Client from temporalio.worker import Worker @@ -239,6 +239,8 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: async for event in client.get_workflow_handle(wf_id).fetch_history_events(): if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: completed += 1 - assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + assert completed >= 3, ( + f"only {completed} workflow tasks, sticky path not exercised" + ) finally: await streams.close() From 086cac5bd4fdcc36a1329a0317ef618739e71da5 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:30 -0700 Subject: [PATCH 272/831] Made the server-side stream modules pass the type and doc linters. A Standalone Activity has no `workflow_id`, so opening its Workflow's stream now says that rather than sending `None` on the wire. `Optional` and `typing.Sequence` are deprecated spellings the linter rejects. --- temporalio/client_stream.py | 7 +++-- temporalio/contrib/server_streams/__init__.py | 29 +++++++++++-------- temporalio/streams/providers/native.py | 12 ++++++-- tests/test_client_stream.py | 2 +- tests/worker/test_workflow_stream.py | 13 +++++++-- tests/worker/test_workflow_stream_e2e.py | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1b5d953bd..8280b56d4 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,8 +23,9 @@ from __future__ import annotations +from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass -from typing import Any, AsyncIterator, Optional, Sequence +from typing import Any import google.protobuf.duration_pb2 @@ -102,8 +103,8 @@ async def create( self, stream_id: str, *, - retention: Optional[float] = None, - max_items: Optional[int] = None, + retention: float | None = None, + max_items: int | None = None, ) -> "StreamHandle": """Create a stream and return a handle to it. diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index b6db1fd7a..c15184bf4 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -20,16 +20,17 @@ from __future__ import annotations import asyncio +import builtins from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from datetime import timedelta -from typing import Any, Generic, Optional, TypeVar, overload +from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient, WorkflowStreamHandle -from temporalio.converter import DataConverter, PayloadConverter +from temporalio.converter import PayloadConverter __all__ = [ "RawPage", @@ -109,7 +110,7 @@ def _reject_configured_codec(client: Client) -> None: ) -def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: +def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) if as_type is None: @@ -210,8 +211,9 @@ def subscribe( self, *, from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + # Spelled out because `type` in this class body is the property below. + result_type: builtins.type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[T]]: """Read this topic from ``from_offset`` onwards.""" return self._client.subscribe( @@ -236,7 +238,7 @@ def __init__( self._converter = converter self._batch_interval = batch_interval self._buffered: list[tuple[str, Any]] = [] - self._flusher: Optional[asyncio.Task[None]] = None + self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() @classmethod @@ -260,10 +262,13 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - client = activity.client() - return cls.create( - client, activity.info().workflow_id, batch_interval=batch_interval - ) + workflow_id = activity.info().workflow_id + if workflow_id is None: + raise RuntimeError( + "no Workflow stream to open: this Activity was not started by a " + "Workflow" + ) + return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -307,8 +312,8 @@ async def subscribe( *, topics: Sequence[str] = (), from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + result_type: type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[Any]]: """Yield items from ``from_offset`` as they arrive. diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 1243d3784..53d231174 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -171,6 +171,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle self._converter = converter self._topic = topic @@ -255,6 +256,7 @@ class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, handle: Any, converter: Any) -> None: + """Read the stream ``handle`` names, from anywhere.""" self._handle = handle self._converter = converter @@ -297,6 +299,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() @@ -320,9 +323,12 @@ class _NativeProvider: name = "native" def configure(self, **options: Any) -> None: - """Nothing to name: the streams are on the server the client is - already connected to. It exists so a process that switches providers - changes one call rather than its structure.""" + """Take no options. + + The streams are on the server the client is already connected to. + This exists so a process that switches providers changes one call + rather than its structure. + """ if options: raise TypeError( f"the native provider takes no options, got {sorted(options)}" diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index f7df3c7a7..8d1a42f30 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -14,7 +14,7 @@ import asyncio import os import uuid -from typing import AsyncIterator +from collections.abc import AsyncIterator import pytest diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 40d6fdf45..1d154b37c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -9,6 +9,7 @@ from __future__ import annotations import asyncio +from typing import Any import pytest @@ -84,6 +85,12 @@ def __init__(self) -> None: def _assert_not_read_only(self, action: str) -> None: self.read_only_calls.append(action) + async def read(self, stream: str, max_messages: int) -> list[bytes]: + instance: Any = self + return await _WorkflowInstanceImpl.workflow_read_stream( + instance, stream, max_messages + ) + @pytest.mark.parametrize("max_messages", [1, 2, 5]) async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: @@ -92,14 +99,14 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b) for b in bodies]) - got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + got = await stub.read("s", max_messages) assert got == bodies[:max_messages] # Whatever the cap left behind has to still be there: nothing resends it. assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) if len(stub._stream_buffers["s"]): - rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + rest = await stub.read("s", 0) assert got + rest == bodies else: assert got == bodies @@ -112,5 +119,5 @@ async def test_read_is_refused_in_a_read_only_context() -> None: stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + await stub.read("s", 0) assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 00d0dfa85..3ee38fef3 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -104,7 +104,7 @@ def __init__(self) -> None: async def run(self) -> int: published = 0 while True: - await workflow.wait_condition(lambda: self._pending or self._done) + await workflow.wait_condition(lambda: bool(self._pending) or self._done) while self._pending: workflow.add_stream_messages([self._pending.pop(0).encode()]) published += 1 From ba16ff9b93829d70c301b0fa7f4ce5e6e0f6dc21 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:38 -0700 Subject: [PATCH 273/831] Added the changelog entry for server-side streams. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06eb5da58..115b0d3dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,13 @@ to include examples, links to docs, or any other relevant information. the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: server-side streams. A workflow reads a stream the server + delivers on its Workflow Tasks and publishes with a command, through + `temporalio.workflow.read_stream`, `subscribe_stream` and + `add_stream_messages`. `temporalio.client_stream` and + `temporalio.contrib.server_streams` reach the same stream from outside a + workflow, and `temporalio.streams.providers.native` puts it behind the shared + stream interface. Requires a server that serves the stream service. ### Changed From a0f8c4d1c2dcc51925c6425772712aa91972fc1a Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:45:15 -0700 Subject: [PATCH 274/831] Regenerated the vendored stream protos for protobuf 3. This package has to load on a protobuf 3 runtime, and generated code refuses to load on a runtime older than the one it was built against. The protoc of that generation has no `--pyi_out`, so the stubs come from `mypy-protobuf`, which is what the other generated protos already use. --- scripts/gen_stream_protos.py | 7 +- temporalio/api/streamservice/v1/__init__.py | 16 + .../api/streamservice/v1/message_pb2.py | 97 +- .../api/streamservice/v1/message_pb2.pyi | 215 +- .../api/streamservice/v1/message_pb2_grpc.py | 22 +- .../api/streamservice/v1/message_pb2_grpc.pyi | 4 + .../streamservice/v1/request_response_pb2.py | 993 +++++++- .../streamservice/v1/request_response_pb2.pyi | 2201 +++++++++++++---- .../v1/request_response_pb2_grpc.py | 22 +- .../v1/request_response_pb2_grpc.pyi | 4 + .../api/streamservice/v1/service_pb2.py | 40 +- .../api/streamservice/v1/service_pb2.pyi | 11 +- .../api/streamservice/v1/service_pb2_grpc.py | 751 +++--- .../api/streamservice/v1/service_pb2_grpc.pyi | 195 ++ .../api/streamservice/v1/stream_state_pb2.py | 160 +- .../api/streamservice/v1/stream_state_pb2.pyi | 525 +++- .../streamservice/v1/stream_state_pb2_grpc.py | 22 +- .../v1/stream_state_pb2_grpc.pyi | 4 + temporalio/client_stream.py | 4 +- 19 files changed, 4085 insertions(+), 1208 deletions(-) create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index f57ff6177..6b6487294 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -9,7 +9,9 @@ Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf runtime this package has to load on. Generated code refuses to load on a runtime older than the one it was built against, and these modules end up in -applications that pin protobuf themselves. +applications that pin protobuf themselves. The stubs come from +``mypy-protobuf`` rather than protoc's own ``--pyi_out``, which that +generation of protoc does not have. Two rewrites make the copies compile against this SDK. The server's own routing and API-category options are dropped, because they mean nothing to a @@ -119,8 +121,9 @@ def main() -> None: f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", - f"--pyi_out={out}", f"--grpc_python_out={out}", + f"--mypy_out={out}", + f"--mypy_grpc_out={out}", *targets, ], check=True, diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 31f99bded..7e2ebef29 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -28,6 +28,10 @@ AddWorkflowMessagesInput, AddWorkflowMessagesRequest, AddWorkflowMessagesResponse, + AdvanceConsumerHeadInput, + AdvanceConsumerHeadOutput, + AdvanceConsumerHeadRequest, + AdvanceConsumerHeadResponse, CloseStreamInput, CloseStreamOutput, CloseStreamRequest, @@ -62,6 +66,10 @@ PollWorkflowMessagesInput, PollWorkflowMessagesRequest, PollWorkflowMessagesResponse, + RegisterStreamConsumerInput, + RegisterStreamConsumerOutput, + RegisterStreamConsumerRequest, + RegisterStreamConsumerResponse, StreamListEntry, SubscribeWorkflowInput, SubscribeWorkflowOutput, @@ -81,6 +89,10 @@ "AddWorkflowMessagesInput", "AddWorkflowMessagesRequest", "AddWorkflowMessagesResponse", + "AdvanceConsumerHeadInput", + "AdvanceConsumerHeadOutput", + "AdvanceConsumerHeadRequest", + "AdvanceConsumerHeadResponse", "CloseStreamInput", "CloseStreamOutput", "CloseStreamRequest", @@ -117,6 +129,10 @@ "PollWorkflowMessagesRequest", "PollWorkflowMessagesResponse", "ProducerCursor", + "RegisterStreamConsumerInput", + "RegisterStreamConsumerOutput", + "RegisterStreamConsumerRequest", + "RegisterStreamConsumerResponse", "STREAM_MESSAGE_KIND_DATA", "STREAM_MESSAGE_KIND_FLUSH", "STREAM_MESSAGE_KIND_UNSPECIFIED", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index b4fe8e68a..3bbd8718e 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -1,46 +1,83 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/message.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/message.proto' -) +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ None: ... - BODY_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - TOPIC_FIELD_NUMBER: _ClassVar[int] - TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - KIND_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - body: _message_pb2.Payload - metadata: _containers.MessageMap[str, _message_pb2.Payload] - topic: str - topic_sequence: int - kind: StreamMessageKind - offset: int - def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... - -class StreamMessageBatch(_message.Message): - __slots__ = ("messages",) - MESSAGES_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] - def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys +import typing + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamMessageKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamMessageKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamMessageKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 + STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 + STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 + """Producer signalling a delivery boundary. Carries no body and consumes an + offset like any other message. A consumer uses it to end a turn without + waiting out an idle timeout. + """ + +class StreamMessageKind( + _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper +): ... + +STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 +STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 +STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 +"""Producer signalling a delivery boundary. Carries no body and consumes an +offset like any other message. A consumer uses it to end a turn without +waiting out an idle timeout. +""" +global___StreamMessageKind = StreamMessageKind + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance. The server does not populate this today.""" + topic: builtins.str + topic_sequence: builtins.int + """Position within this topic. The global offset orders the whole stream; + this lets a consumer reason about one topic without decoding the rest. + """ + kind: global___StreamMessageKind.ValueType + offset: builtins.int + """Position in the whole stream, set on read and never stored. A consumer + that resumes at message granularity needs it, and a topic-filtered read + leaves gaps that make it underivable from the response alone. + """ + def __init__( + self, + *, + body: temporal.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + kind: global___StreamMessageKind.ValueType = ..., + offset: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "offset", + b"offset", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... + +global___StreamMessage = StreamMessage + +class StreamMessageBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one log node. The server stores + this serialized and opaque; it decodes only to trim a partial first page or + to apply a topic filter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... + def __init__( + self, + *, + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["messages", b"messages"] + ) -> None: ... + +global___StreamMessageBatch = StreamMessageBatch diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index b1383816d..bf947056a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.pyi b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 60dafee45..b813e2dfc 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -1,138 +1,881 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/request_response.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/request_response.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... - -class CreateStreamOutput(_message.Message): - __slots__ = ("run_id",) - RUN_ID_FIELD_NUMBER: _ClassVar[int] - run_id: str - def __init__(self, run_id: _Optional[str] = ...) -> None: ... - -class AddMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - expected_offset: int - use_expected_offset: bool - owner_epoch: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... - -class AddMessagesOutput(_message.Message): - __slots__ = ("first_offset", "next_offset", "count", "deduplicated") - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] - first_offset: int - next_offset: int - count: int - deduplicated: bool - def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... - -class FinishWritingInput(_message.Message): - __slots__ = ("namespace", "stream_id", "producer_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - producer_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... - -class FinishWritingOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class SubscribeWorkflowInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - stream_id: str - start_offset: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... - -class SubscribeWorkflowOutput(_message.Message): - __slots__ = ("start_offset",) - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - start_offset: int - def __init__(self, start_offset: _Optional[int] = ...) -> None: ... - -class PollMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... - -class PollMessagesOutput(_message.Message): - __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") - MESSAGES_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - next_offset: int - head_offset: int - closed: bool - close_reason: _message_pb2_1.Payload - def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... - -class DescribeStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... - -class PollWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... - -class DescribeWorkflowStreamInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... - -class AddWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... - -class DescribeStreamOutput(_message.Message): - __slots__ = ("state",) - STATE_FIELD_NUMBER: _ClassVar[int] - state: _stream_state_pb2.StreamState - def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... - -class CloseStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "reason") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - REASON_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - reason: _message_pb2_1.Payload - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... - -class CloseStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class TruncateStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "new_base_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - new_base_offset: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... - -class TruncateStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class DeleteStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... - -class DeleteStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class CreateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CreateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... - -class CreateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CreateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... - -class AddMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... - -class AddMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... - -class FinishWritingRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: FinishWritingInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... - -class FinishWritingResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: FinishWritingOutput - def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... - -class SubscribeWorkflowRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: SubscribeWorkflowInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... - -class SubscribeWorkflowResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: SubscribeWorkflowOutput - def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... - -class PollMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... - -class PollMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... - -class DescribeStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... - -class DescribeStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... - -class PollWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... - -class PollWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... - -class DescribeWorkflowStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeWorkflowStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... - -class DescribeWorkflowStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... - -class AddWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... - -class AddWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... - -class CloseStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CloseStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... - -class CloseStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CloseStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... - -class TruncateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: TruncateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... - -class TruncateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: TruncateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... - -class ListStreamsInput(_message.Message): - __slots__ = ("namespace", "page_size", "next_page_token", "query") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - QUERY_FIELD_NUMBER: _ClassVar[int] - namespace: str - page_size: int - next_page_token: bytes - query: str - def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... - -class StreamListEntry(_message.Message): - __slots__ = ("stream_id", "run_id") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - stream_id: str - run_id: str - def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... - -class ListStreamsOutput(_message.Message): - __slots__ = ("streams", "next_page_token") - STREAMS_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] - next_page_token: bytes - def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... - -class ListStreamsRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: ListStreamsInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... - -class ListStreamsResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: ListStreamsOutput - def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... - -class DeleteStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DeleteStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... - -class DeleteStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DeleteStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 +import temporalio.api.streamservice.v1.message_pb2 +import temporalio.api.streamservice.v1.stream_state_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CreateStreamInput(google.protobuf.message.Message): + """The frontend-facing shapes are defined here rather than in the public API + because streams have no public API yet. Keeping them in a nested + frontend_request mirrors the other CHASM libraries, so promoting them later + is a package move rather than a redesign. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def lifecycle( + self, + ) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + lifecycle: temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["lifecycle", b"lifecycle"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "lifecycle", + b"lifecycle", + "namespace", + b"namespace", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___CreateStreamInput = CreateStreamInput + +class CreateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + run_id: builtins.str + def __init__( + self, + *, + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["run_id", b"run_id"] + ) -> None: ... + +global___CreateStreamOutput = CreateStreamOutput + +class AddMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + USE_EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional. Supplying it skips resolving the stream's current run, which is + a persistence lookup on every call. CreateStream returns it. + """ + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Idempotency, all optional. Supply a producer identity and sequence, or an + expected offset, or neither and accept at-least-once. + """ + sequence: builtins.int + expected_offset: builtins.int + """Guarded by use_expected_offset because proto3 optional is not supported + by this repo's helper generator. + """ + use_expected_offset: builtins.bool + owner_epoch: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + expected_offset: builtins.int = ..., + use_expected_offset: builtins.bool = ..., + owner_epoch: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "expected_offset", + b"expected_offset", + "messages", + b"messages", + "namespace", + b"namespace", + "owner_epoch", + b"owner_epoch", + "producer_id", + b"producer_id", + "run_id", + b"run_id", + "sequence", + b"sequence", + "stream_id", + b"stream_id", + "use_expected_offset", + b"use_expected_offset", + ], + ) -> None: ... + +global___AddMessagesInput = AddMessagesInput + +class AddMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FIRST_OFFSET_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + DEDUPLICATED_FIELD_NUMBER: builtins.int + first_offset: builtins.int + next_offset: builtins.int + count: builtins.int + deduplicated: builtins.bool + """True when a retry matched a recorded sequence and nothing was appended.""" + def __init__( + self, + *, + first_offset: builtins.int = ..., + next_offset: builtins.int = ..., + count: builtins.int = ..., + deduplicated: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "count", + b"count", + "deduplicated", + b"deduplicated", + "first_offset", + b"first_offset", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___AddMessagesOutput = AddMessagesOutput + +class FinishWritingInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + producer_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + producer_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___FinishWritingInput = FinishWritingInput + +class FinishWritingOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___FinishWritingOutput = FinishWritingOutput + +class SubscribeWorkflowInput(google.protobuf.message.Message): + """Registers a Workflow as a consumer of a stream it owns. The cursor lands in + the Workflow's own state, so from then on each of its Workflow Tasks carries + the next range and records what it consumed. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Name of the stream within the Workflow, for a stream it owns.""" + stream_id: builtins.str + """Id of a standalone stream in another execution. Exactly one of this and + stream_name is set. + """ + start_offset: builtins.int + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___SubscribeWorkflowInput = SubscribeWorkflowInput + +class SubscribeWorkflowOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + start_offset: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["start_offset", b"start_offset"] + ) -> None: ... + +global___SubscribeWorkflowOutput = SubscribeWorkflowOutput + +class PollMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional, as on AddMessagesInput.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters by exact topic. Offsets are assigned over the unfiltered stream, so + next_offset advances past filtered-out messages too. + """ + wait_new_messages: builtins.bool + """When set and the reader is caught up, block until something arrives, the + stream closes, or the server's long-poll timeout elapses. A timeout returns + an empty response rather than an error, so the caller simply polls again. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + ], + ) -> None: ... + +global___PollMessagesInput = PollMessagesInput + +class PollMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + next_offset: builtins.int + head_offset: builtins.int + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + next_offset: builtins.int = ..., + head_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "closed", + b"closed", + "head_offset", + b"head_offset", + "messages", + b"messages", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___PollMessagesOutput = PollMessagesOutput + +class DescribeStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DescribeStreamInput = DescribeStreamInput + +class PollWorkflowMessagesInput(google.protobuf.message.Message): + """A stream a workflow owns lives inside that workflow's execution, so it has + no standalone id to address it by. It is named by its owner and its name + instead, and routed on the owner. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters as on PollMessagesInput.""" + wait_new_messages: builtins.bool + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___PollWorkflowMessagesInput = PollWorkflowMessagesInput + +class DescribeWorkflowStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput + +class AddWorkflowMessagesInput(google.protobuf.message.Message): + """Appending to a stream a workflow owns, from outside that workflow. The + workflow's own publishes ride its Workflow Task instead. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Optional idempotency, as on AddMessagesInput.""" + sequence: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", + b"messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AddWorkflowMessagesInput = AddWorkflowMessagesInput + +class DescribeStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATE_FIELD_NUMBER: builtins.int + @property + def state(self) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamState: ... + def __init__( + self, + *, + state: temporalio.api.streamservice.v1.stream_state_pb2.StreamState + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> None: ... + +global___DescribeStreamOutput = DescribeStreamOutput + +class CloseStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["reason", b"reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "reason", b"reason", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___CloseStreamInput = CloseStreamInput + +class CloseStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___CloseStreamOutput = CloseStreamOutput + +class TruncateStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + NEW_BASE_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + new_base_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + new_base_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "new_base_offset", + b"new_base_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___TruncateStreamInput = TruncateStreamInput + +class TruncateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___TruncateStreamOutput = TruncateStreamOutput + +class DeleteStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DeleteStreamInput = DeleteStreamInput + +class DeleteStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___DeleteStreamOutput = DeleteStreamOutput + +class CreateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CreateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CreateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CreateStreamRequest = CreateStreamRequest + +class CreateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CreateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CreateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CreateStreamResponse = CreateStreamResponse + +class AddMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddMessagesRequest = AddMessagesRequest + +class AddMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddMessagesResponse = AddMessagesResponse + +class FinishWritingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___FinishWritingInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___FinishWritingInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___FinishWritingRequest = FinishWritingRequest + +class FinishWritingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___FinishWritingOutput: ... + def __init__( + self, + *, + frontend_response: global___FinishWritingOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___FinishWritingResponse = FinishWritingResponse + +class SubscribeWorkflowRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___SubscribeWorkflowInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___SubscribeWorkflowInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___SubscribeWorkflowRequest = SubscribeWorkflowRequest + +class SubscribeWorkflowResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___SubscribeWorkflowOutput: ... + def __init__( + self, + *, + frontend_response: global___SubscribeWorkflowOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___SubscribeWorkflowResponse = SubscribeWorkflowResponse + +class PollMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollMessagesRequest = PollMessagesRequest + +class PollMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollMessagesResponse = PollMessagesResponse + +class DescribeStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeStreamRequest = DescribeStreamRequest + +class DescribeStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeStreamResponse = DescribeStreamResponse + +class PollWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollWorkflowMessagesRequest = PollWorkflowMessagesRequest + +class PollWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollWorkflowMessagesResponse = PollWorkflowMessagesResponse + +class DescribeWorkflowStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeWorkflowStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeWorkflowStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeWorkflowStreamRequest = DescribeWorkflowStreamRequest + +class DescribeWorkflowStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeWorkflowStreamResponse = DescribeWorkflowStreamResponse + +class RegisterStreamConsumerInput(google.protobuf.message.Message): + """Registering a consumer on a stream in another execution. Split out from + SubscribeWorkflow because the two halves live on different shards: the pin + goes on the stream, the cursor goes on the consuming workflow, and a handler + can only reach the shard it was routed to. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + consumer_workflow_id: builtins.str + """The workflow that will consume, which names the pin.""" + start_offset: builtins.int + """Negative means from wherever the stream is when the pin is taken. Resolved + here, where the frontier is, and returned so the cursor records a fact. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + consumer_workflow_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_workflow_id", + b"consumer_workflow_id", + "namespace", + b"namespace", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___RegisterStreamConsumerInput = RegisterStreamConsumerInput + +class RegisterStreamConsumerOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + start_offset: builtins.int + collection_id: builtins.str + """What the consumer needs to address the log, all decided by the stream.""" + bucket_size: builtins.int + known_head: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + known_head: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "known_head", + b"known_head", + "start_offset", + b"start_offset", + ], + ) -> None: ... + +global___RegisterStreamConsumerOutput = RegisterStreamConsumerOutput + +class AdvanceConsumerHeadInput(google.protobuf.message.Message): + """Telling one consumer that the frontier moved. Routed to the consumer, which + is not where the stream lives. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """The run that subscribed. A successor from continue-as-new holds no cursor + for this stream, so pushing the frontier at it would land nowhere. + """ + stream_id: builtins.str + head_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_id: builtins.str = ..., + head_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "head_offset", + b"head_offset", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_id", + b"stream_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput + +class AdvanceConsumerHeadOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput + +class AddWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddWorkflowMessagesRequest = AddWorkflowMessagesRequest + +class AddWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddWorkflowMessagesResponse = AddWorkflowMessagesResponse + +class RegisterStreamConsumerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___RegisterStreamConsumerInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___RegisterStreamConsumerInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___RegisterStreamConsumerRequest = RegisterStreamConsumerRequest + +class RegisterStreamConsumerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___RegisterStreamConsumerOutput: ... + def __init__( + self, + *, + frontend_response: global___RegisterStreamConsumerOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___RegisterStreamConsumerResponse = RegisterStreamConsumerResponse + +class AdvanceConsumerHeadRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AdvanceConsumerHeadInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AdvanceConsumerHeadInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AdvanceConsumerHeadRequest = AdvanceConsumerHeadRequest + +class AdvanceConsumerHeadResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AdvanceConsumerHeadOutput: ... + def __init__( + self, + *, + frontend_response: global___AdvanceConsumerHeadOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AdvanceConsumerHeadResponse = AdvanceConsumerHeadResponse + +class CloseStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CloseStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CloseStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CloseStreamRequest = CloseStreamRequest + +class CloseStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CloseStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CloseStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CloseStreamResponse = CloseStreamResponse + +class TruncateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___TruncateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___TruncateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___TruncateStreamRequest = TruncateStreamRequest + +class TruncateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___TruncateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___TruncateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___TruncateStreamResponse = TruncateStreamResponse + +class ListStreamsInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + QUERY_FIELD_NUMBER: builtins.int + namespace: builtins.str + page_size: builtins.int + next_page_token: builtins.bytes + query: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + page_size: builtins.int = ..., + next_page_token: builtins.bytes = ..., + query: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "next_page_token", + b"next_page_token", + "page_size", + b"page_size", + "query", + b"query", + ], + ) -> None: ... + +global___ListStreamsInput = ListStreamsInput + +class StreamListEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___StreamListEntry = StreamListEntry + +class ListStreamsOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAMS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + @property + def streams( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamListEntry + ]: ... + next_page_token: builtins.bytes + def __init__( + self, + *, + streams: collections.abc.Iterable[global___StreamListEntry] | None = ..., + next_page_token: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "next_page_token", b"next_page_token", "streams", b"streams" + ], + ) -> None: ... + +global___ListStreamsOutput = ListStreamsOutput + +class ListStreamsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___ListStreamsInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___ListStreamsInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___ListStreamsRequest = ListStreamsRequest + +class ListStreamsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___ListStreamsOutput: ... + def __init__( + self, + *, + frontend_response: global___ListStreamsOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___ListStreamsResponse = ListStreamsResponse + +class DeleteStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DeleteStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DeleteStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DeleteStreamRequest = DeleteStreamRequest + +class DeleteStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DeleteStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DeleteStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DeleteStreamResponse = DeleteStreamResponse diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index 87cc91022..bf947056a 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index 7f376c28e..432abfc5c 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -1,38 +1,34 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/service.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/service.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xce\x12\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16RegisterStreamConsumer\x12H.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerResponse"\x00\x12\xa6\x01\n\x13\x41\x64vanceConsumerHead\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) + +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) class StreamServiceStub(object): @@ -35,70 +18,80 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.CreateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + ) self.AddMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + ) self.FinishWriting = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + ) self.SubscribeWorkflow = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + ) self.PollMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + ) self.DescribeStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + ) self.PollWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + ) self.DescribeWorkflowStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + ) self.AddWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + ) + self.RegisterStreamConsumer = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + ) + self.AdvanceConsumerHead = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + ) self.CloseStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + ) self.TruncateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + ) self.ListStreams = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + ) self.DeleteStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + ) class StreamServiceServicer(object): @@ -107,178 +100,204 @@ class StreamServiceServicer(object): def CreateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def FinishWriting(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def SubscribeWorkflow(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollWorkflowMessages(self, request, context): - """Routed on the owner, because the stream it reads has no id of its own. - """ + """Routed on the owner, because the stream it reads has no id of its own.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeWorkflowStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddWorkflowMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def RegisterStreamConsumer(self, request, context): + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def AdvanceConsumerHead(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def TruncateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def ListStreams(self, request, context): """Served on the frontend only: it queries visibility rather than a stream, so there is no business ID to route on and nothing for a shard to answer. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DeleteStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def add_StreamServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'CreateStream': grpc.unary_unary_rpc_method_handler( - servicer.CreateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, - ), - 'AddMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, - ), - 'FinishWriting': grpc.unary_unary_rpc_method_handler( - servicer.FinishWriting, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, - ), - 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( - servicer.SubscribeWorkflow, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, - ), - 'PollMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, - ), - 'DescribeStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, - ), - 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, - ), - 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeWorkflowStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, - ), - 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, - ), - 'CloseStream': grpc.unary_unary_rpc_method_handler( - servicer.CloseStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, - ), - 'TruncateStream': grpc.unary_unary_rpc_method_handler( - servicer.TruncateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, - ), - 'ListStreams': grpc.unary_unary_rpc_method_handler( - servicer.ListStreams, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, - ), - 'DeleteStream': grpc.unary_unary_rpc_method_handler( - servicer.DeleteStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, - ), + "CreateStream": grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + "AddMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + "FinishWriting": grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + "SubscribeWorkflow": grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + "PollMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + "DescribeStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + "PollWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + "DescribeWorkflowStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + "AddWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + "RegisterStreamConsumer": grpc.unary_unary_rpc_method_handler( + servicer.RegisterStreamConsumer, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.SerializeToString, + ), + "AdvanceConsumerHead": grpc.unary_unary_rpc_method_handler( + servicer.AdvanceConsumerHead, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.SerializeToString, + ), + "CloseStream": grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + "TruncateStream": grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + "ListStreams": grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + "DeleteStream": grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) - # This class is part of an EXPERIMENTAL API. +# This class is part of an EXPERIMENTAL API. class StreamService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def CreateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CreateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, options, @@ -289,23 +308,25 @@ def CreateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def AddMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, options, @@ -316,23 +337,25 @@ def AddMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def FinishWriting(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def FinishWriting( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, options, @@ -343,23 +366,25 @@ def FinishWriting(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def SubscribeWorkflow(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def SubscribeWorkflow( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, options, @@ -370,23 +395,25 @@ def SubscribeWorkflow(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def PollMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, options, @@ -397,23 +424,25 @@ def PollMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DescribeStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, options, @@ -424,23 +453,25 @@ def DescribeStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def PollWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, options, @@ -451,23 +482,25 @@ def PollWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DescribeWorkflowStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeWorkflowStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, options, @@ -478,23 +511,25 @@ def DescribeWorkflowStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def AddWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, options, @@ -505,23 +540,83 @@ def AddWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) + + @staticmethod + def RegisterStreamConsumer( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) @staticmethod - def CloseStream(request, + def AdvanceConsumerHead( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def CloseStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, options, @@ -532,23 +627,25 @@ def CloseStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def TruncateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def TruncateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, options, @@ -559,23 +656,25 @@ def TruncateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def ListStreams(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def ListStreams( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, options, @@ -586,23 +685,25 @@ def ListStreams(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DeleteStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DeleteStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, options, @@ -613,4 +714,4 @@ def DeleteStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi new file mode 100644 index 000000000..1530074ec --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi @@ -0,0 +1,195 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import abc + +import grpc + +import temporalio.api.streamservice.v1.request_response_pb2 + +class StreamServiceStub: + def __init__(self, channel: grpc.Channel) -> None: ... + CreateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse, + ] + AddMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse, + ] + FinishWriting: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse, + ] + SubscribeWorkflow: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse, + ] + PollMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse, + ] + DescribeStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse, + ] + PollWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, + ] + """Routed on the owner, because the stream it reads has no id of its own.""" + DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, + ] + AddWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse, + ] + RegisterStreamConsumer: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse, + ] + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + AdvanceConsumerHead: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse, + ] + CloseStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse, + ] + TruncateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse, + ] + ListStreams: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse, + ] + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + DeleteStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse, + ] + +class StreamServiceServicer(metaclass=abc.ABCMeta): + @abc.abstractmethod + def CreateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse: ... + @abc.abstractmethod + def AddMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse: ... + @abc.abstractmethod + def FinishWriting( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse: ... + @abc.abstractmethod + def SubscribeWorkflow( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse + ): ... + @abc.abstractmethod + def PollMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse: ... + @abc.abstractmethod + def DescribeStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse + ): ... + @abc.abstractmethod + def PollWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: + """Routed on the owner, because the stream it reads has no id of its own.""" + @abc.abstractmethod + def DescribeWorkflowStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse: ... + @abc.abstractmethod + def AddWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse + ): ... + @abc.abstractmethod + def RegisterStreamConsumer( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse: + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + @abc.abstractmethod + def AdvanceConsumerHead( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse + ): ... + @abc.abstractmethod + def CloseStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse: ... + @abc.abstractmethod + def TruncateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse + ): ... + @abc.abstractmethod + def ListStreams( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse: + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + @abc.abstractmethod + def DeleteStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse: ... + +def add_StreamServiceServicer_to_server( + servicer: StreamServiceServicer, server: grpc.Server +) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 234fa94d0..2ce5a0451 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -1,22 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/stream_state.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/stream_state.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -24,33 +16,119 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ None: ... - class ConsumersEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: ConsumerCursor - def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCERS_FIELD_NUMBER: _ClassVar[int] - CONSUMERS_FIELD_NUMBER: _ClassVar[int] - LIFECYCLE_FIELD_NUMBER: _ClassVar[int] - REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] - head_offset: int - base_offset: int - last_txn_id: int - closed: bool - close_reason: _message_pb2.Payload - owner_epoch: int - bucket_size: int - collection_id: str - producers: _containers.MessageMap[str, ProducerCursor] - consumers: _containers.MessageMap[str, ConsumerCursor] - lifecycle: StreamLifecycle - redirect_run_id: str - close_time: _timestamp_pb2.Timestamp - def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... - -class ProducerCursor(_message.Message): - __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") - SEQ_FIELD_NUMBER: _ClassVar[int] - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] - FENCED_FIELD_NUMBER: _ClassVar[int] - seq: int - first_offset: int - count: int - content_hash: bytes - fenced: bool - def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... - -class ConsumerCursor(_message.Message): - __slots__ = ("workflow_id", "run_id", "offset", "active", "external") - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - ACTIVE_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - workflow_id: str - run_id: str - offset: int - active: bool - external: bool - def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... - -class WorkflowStreamCursor(_message.Message): - __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - PENDING_FROM_FIELD_NUMBER: _ClassVar[int] - PENDING_TO_FIELD_NUMBER: _ClassVar[int] - HAS_PENDING_FIELD_NUMBER: _ClassVar[int] - stream_id: str - collection_id: str - bucket_size: int - offset: int - known_head: int - external: bool - pending_from: int - pending_to: int - has_pending: bool - def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... - -class StreamLifecycle(_message.Message): - __slots__ = ("retention", "max_items") - RETENTION_FIELD_NUMBER: _ClassVar[int] - MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] - retention: _duration_pb2.Duration - max_items: int - def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.duration_pb2 +import google.protobuf.internal.containers +import google.protobuf.message +import google.protobuf.timestamp_pb2 + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamState(google.protobuf.message.Message): + """Size is O(producers + consumers), never O(messages). Payload bytes live in + the log, not here, which is what keeps this off the CHASM partial-read path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class ProducersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ProducerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ProducerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + class ConsumersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ConsumerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ConsumerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + HEAD_OFFSET_FIELD_NUMBER: builtins.int + BASE_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + PRODUCERS_FIELD_NUMBER: builtins.int + CONSUMERS_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + REDIRECT_RUN_ID_FIELD_NUMBER: builtins.int + CLOSE_TIME_FIELD_NUMBER: builtins.int + head_offset: builtins.int + """Visibility frontier. Readers never observe an offset at or past this.""" + base_offset: builtins.int + """Truncation floor. Offsets below this are gone.""" + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + owner_epoch: builtins.int + """Bumped on ownership change so a stale producer's write fails.""" + bucket_size: builtins.int + """Immutable once set. Offsets roll to a new log tree every bucket_size so no + single storage partition grows with the stream. + """ + collection_id: builtins.str + """Identity of the log this stream writes to. Bucket trees are derived from + it, so there is no per-bucket index to store. + """ + @property + def producers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ProducerCursor + ]: ... + @property + def consumers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ConsumerCursor + ]: ... + @property + def lifecycle(self) -> global___StreamLifecycle: ... + redirect_run_id: builtins.str + """Set when a successor run takes ownership, so an in-flight poll can follow + the chain instead of stalling on a superseded run. + """ + @property + def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: + """Wall-clock close time, used to schedule retention deletion.""" + def __init__( + self, + *, + head_offset: builtins.int = ..., + base_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + owner_epoch: builtins.int = ..., + bucket_size: builtins.int = ..., + collection_id: builtins.str = ..., + producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] + | None = ..., + consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] + | None = ..., + lifecycle: global___StreamLifecycle | None = ..., + redirect_run_id: builtins.str = ..., + close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "lifecycle", + b"lifecycle", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "base_offset", + b"base_offset", + "bucket_size", + b"bucket_size", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "closed", + b"closed", + "collection_id", + b"collection_id", + "consumers", + b"consumers", + "head_offset", + b"head_offset", + "lifecycle", + b"lifecycle", + "owner_epoch", + b"owner_epoch", + "producers", + b"producers", + "redirect_run_id", + b"redirect_run_id", + ], + ) -> None: ... + +global___StreamState = StreamState + +class ProducerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + CONTENT_HASH_FIELD_NUMBER: builtins.int + FENCED_FIELD_NUMBER: builtins.int + seq: builtins.int + first_offset: builtins.int + count: builtins.int + content_hash: builtins.bytes + """Distinguishes a genuine retry from a client reusing a sequence with + different content, which must be rejected rather than deduplicated. + """ + fenced: builtins.bool + """Set by FinishWriting. Ends this producer's writes without closing the + stream for anyone else. + """ + def __init__( + self, + *, + seq: builtins.int = ..., + first_offset: builtins.int = ..., + count: builtins.int = ..., + content_hash: builtins.bytes = ..., + fenced: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "content_hash", + b"content_hash", + "count", + b"count", + "fenced", + b"fenced", + "first_offset", + b"first_offset", + "seq", + b"seq", + ], + ) -> None: ... + +global___ProducerCursor = ProducerCursor + +class ConsumerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + ACTIVE_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + REPLAY_FLOOR_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + offset: builtins.int + """How far this consumer has read. Used to decide whether it needs waking, + not to decide what the stream may drop. + """ + active: builtins.bool + external: builtins.bool + """Set when the consumer is a workflow in another execution, which is the + only case that has to be told the frontier moved. A workflow consuming a + stream it owns sees that while closing its own transaction. + """ + replay_floor: builtins.int + """The oldest offset this consumer's History still depends on. + + It is where the subscription started, not where it has read to. A range + this consumer already consumed is recorded in its History and has to be + re-readable for the workflow to replay, so bytes below the read position + are exactly the ones a replay needs most. It stays put while the consumer + is active and is released when it deregisters. + """ + def __init__( + self, + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + offset: builtins.int = ..., + active: builtins.bool = ..., + external: builtins.bool = ..., + replay_floor: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "active", + b"active", + "external", + b"external", + "offset", + b"offset", + "replay_floor", + b"replay_floor", + "run_id", + b"run_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___ConsumerCursor = ConsumerCursor + +class WorkflowStreamCursor(google.protobuf.message.Message): + """A consuming Workflow's position in a stream. This lives in the consuming + Workflow's own state rather than on the stream, so advancing it commits in + the same transaction as the WorkflowTaskCompleted event that records the + range. Keeping it on the stream would make the advance a cross-execution + write, and a crash between the two would either redeliver or skip. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + PENDING_FROM_FIELD_NUMBER: builtins.int + PENDING_TO_FIELD_NUMBER: builtins.int + HAS_PENDING_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + collection_id: builtins.str + """Enough to address the log without reading the stream component first.""" + bucket_size: builtins.int + offset: builtins.int + """Next offset to deliver.""" + known_head: builtins.int + """The stream's frontier as of the last delivery. A workflow consuming a + stream in another execution cannot read the real frontier while closing its + own transaction, so this is what tells it a capped slice left more behind. + """ + external: builtins.bool + """Set when the stream lives in another execution, which decides whether the + frontier is read locally or taken from known_head. + """ + pending_from: builtins.int + """The range attached to the Workflow Task currently in flight. Recorded on + the event that closes that task, then folded into offset. An empty range + is still recorded: a task where the subscription saw nothing is a fact + replay has to reproduce. + """ + pending_to: builtins.int + has_pending: builtins.bool + start_offset: builtins.int + """Where this subscription began reading. Retained separately from offset, + which advances, because replay has to tell "committed nothing yet" apart + from "the events recording what was committed are not in this page". + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + offset: builtins.int = ..., + known_head: builtins.int = ..., + external: builtins.bool = ..., + pending_from: builtins.int = ..., + pending_to: builtins.int = ..., + has_pending: builtins.bool = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "external", + b"external", + "has_pending", + b"has_pending", + "known_head", + b"known_head", + "offset", + b"offset", + "pending_from", + b"pending_from", + "pending_to", + b"pending_to", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___WorkflowStreamCursor = WorkflowStreamCursor + +class StreamLifecycle(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RETENTION_FIELD_NUMBER: builtins.int + MAX_ITEMS_FIELD_NUMBER: builtins.int + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a closed stream stays readable before it is deleted.""" + max_items: builtins.int + """Cap on readable messages. Older whole buckets are reclaimed once the floor + passes them, so a capped stream has bounded storage. + """ + def __init__( + self, + *, + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_items: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["retention", b"retention"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_items", b"max_items", "retention", b"retention" + ], + ) -> None: ... + +global___StreamLifecycle = StreamLifecycle diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index 4e128a2aa..bf947056a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 8280b56d4..2de4cb4e0 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -77,7 +77,9 @@ def __init__(self, channel: Any, namespace: str) -> None: """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" self._channel = channel self._namespace = namespace - self._stub = service_pb2_grpc.StreamServiceStub(channel) + # The generated stub is typed for a synchronous channel. This client + # drives it over ``grpc.aio``, where every call is awaited. + self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod def connect(target_host: str, namespace: str = "default") -> "StreamClient": From 3016733184443cbe91725e961f1f1286a0c464ab Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:44:45 -0700 Subject: [PATCH 275/831] Repinned Core to the finalized replay-slice branch. The stream client needs the replay slice lookahead fix that branch finished. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 3d1f82e66..f88f78c3f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 +Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c From f0d5a339e7e8146b04a76021a62f72a6ebd63ae0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:47:50 -0700 Subject: [PATCH 276/831] Qualified the LangGraph docstring's stream references. The new server_streams module gives WorkflowStream and WorkflowStreamClient a second definition, so pydoctor can no longer resolve the short names. --- temporalio/contrib/langgraph/_plugin.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/temporalio/contrib/langgraph/_plugin.py b/temporalio/contrib/langgraph/_plugin.py index 03881ca2a..1819c646d 100644 --- a/temporalio/contrib/langgraph/_plugin.py +++ b/temporalio/contrib/langgraph/_plugin.py @@ -104,11 +104,13 @@ class LangGraphPlugin(SimplePlugin): inherited default of either form. streaming_topic: When set, ``langgraph.config.get_stream_writer()`` inside a node publishes to this topic on the workflow's - :class:`WorkflowStream`. The workflow must construct - ``WorkflowStream()`` in its ``@workflow.init`` (the plugin's + :class:`temporalio.contrib.workflow_streams.WorkflowStream`. The + workflow must construct ``WorkflowStream()`` in its + ``@workflow.init`` (the plugin's interceptor verifies this on workflow start). Nodes with ``execute_in='activity'`` publish through - :class:`WorkflowStreamClient` (signal); nodes with + :class:`temporalio.contrib.workflow_streams.WorkflowStreamClient` + (signal); nodes with ``execute_in='workflow'`` publish synchronously to the in-workflow stream (no signal). streaming_batch_interval: How often the activity-side stream From 2d55da84e423fb42e1d1c98a2c83e93c3b444e67 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:28:27 -0700 Subject: [PATCH 277/831] Repinned Core to the WIT-aligned replay-slice head. That head matches upstream's nexus model WIT for the workflow-id policies, which the current generator requires. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index f88f78c3f..4076ef24f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c +Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 From 15dc6446a2eb331bde4ed6c559f65265a49a4155 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:30:52 -0700 Subject: [PATCH 278/831] Regenerated the bridge protos from the repinned Core. The generated module was missing the local-activity marker argument flag its own stub already declared, so the two disagreed about the message. --- .../workflow_commands_pb2.py | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 3374f951a..0d81e37f5 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -511,8 +511,8 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 _WORKFLOWCOMMAND._serialized_start = 556 _WORKFLOWCOMMAND._serialized_end = 2794 _ADDSTREAMMESSAGES._serialized_start = 2796 @@ -528,57 +528,57 @@ _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY._serialized_end = 4683 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4646 - _REQUESTCANCELACTIVITY._serialized_end = 4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 - _QUERYRESULT._serialized_start = 4728 - _QUERYRESULT._serialized_end = 4884 - _QUERYSUCCESS._serialized_start = 4886 - _QUERYSUCCESS._serialized_end = 4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 - _FAILWORKFLOWEXECUTION._serialized_start = 5031 - _FAILWORKFLOWEXECUTION._serialized_end = 5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _REQUESTCANCELACTIVITY._serialized_start = 4685 + _REQUESTCANCELACTIVITY._serialized_end = 4721 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 + _QUERYRESULT._serialized_start = 4767 + _QUERYRESULT._serialized_end = 4923 + _QUERYSUCCESS._serialized_start = 4925 + _QUERYSUCCESS._serialized_end = 4990 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 + _FAILWORKFLOWEXECUTION._serialized_start = 5070 + _FAILWORKFLOWEXECUTION._serialized_end = 5144 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6024 - _CANCELWORKFLOWEXECUTION._serialized_end = 6100 - _SETPATCHMARKER._serialized_start = 6102 - _SETPATCHMARKER._serialized_end = 6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _CANCELWORKFLOWEXECUTION._serialized_start = 6063 + _CANCELWORKFLOWEXECUTION._serialized_end = 6139 + _SETPATCHMARKER._serialized_start = 6141 + _SETPATCHMARKER._serialized_end = 6195 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7958 - _CANCELSIGNALWORKFLOW._serialized_end = 7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 - _UPDATERESPONSE._serialized_start = 8180 - _UPDATERESPONSE._serialized_end = 8390 - _SCHEDULENEXUSOPERATION._serialized_start = 8393 - _SCHEDULENEXUSOPERATION._serialized_end = 8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 + _CANCELSIGNALWORKFLOW._serialized_start = 7997 + _CANCELSIGNALWORKFLOW._serialized_end = 8032 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 + _UPDATERESPONSE._serialized_start = 8219 + _UPDATERESPONSE._serialized_end = 8429 + _SCHEDULENEXUSOPERATION._serialized_start = 8432 + _SCHEDULENEXUSOPERATION._serialized_end = 8970 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 # @@protoc_insertion_point(module_scope) From 1c40ae063176fc519e7a6f021e4e16fef6031135 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:21:21 -0700 Subject: [PATCH 279/831] Adapted the native provider to the interface changes. The append cursor names the last record and is None for a batch the server deduplicated, so the stream client reports what the server said about the append. Producer identity is resolved by the package, inbound frames carry no topic, and the inbound id comes from the shared helper. --- temporalio/client_stream.py | 47 ++++++++++++--- temporalio/streams/providers/native.py | 83 +++++++++++++------------- tests/test_client_stream.py | 11 +++- 3 files changed, 89 insertions(+), 52 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 2de4cb4e0..1cd775043 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -33,7 +33,28 @@ import temporalio.api.streamservice.v1 as stream from temporalio.api.streamservice.v1 import service_pb2_grpc -__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] +__all__ = [ + "Appended", + "Message", + "Page", + "StreamClient", + "StreamHandle", + "WorkflowStreamHandle", +] + + +@dataclass(frozen=True) +class Appended: + """Where one append landed. + + ``deduplicated`` says the server already held this producer's batch at + this sequence and wrote nothing; the offsets are then the original ones. + """ + + first_offset: int + next_offset: int + count: int + deduplicated: bool = False @dataclass(frozen=True) @@ -185,13 +206,14 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: - """Append messages and return the offset the first one landed at. + ) -> Appended: + """Append messages and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than - appending twice. Without them the append is at-least-once, which is - only the right trade when duplicates are harmless. + appending twice, and says so. Without them the append is + at-least-once, which is only the right trade when duplicates are + harmless. """ response = await self._stub.AddMessages( stream.AddMessagesRequest( @@ -214,7 +236,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -352,7 +374,7 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: + ) -> Appended: """Append from outside the workflow, as :meth:`StreamHandle.append`. Batch where you can. The append costs one transition on the owning @@ -380,7 +402,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -479,3 +501,12 @@ async def describe(self) -> stream.StreamState: ) ) return response.frontend_response.state + + +def _appended(out: stream.AddMessagesOutput) -> Appended: + return Appended( + first_offset=out.first_offset, + next_offset=out.next_offset, + count=out.count, + deduplicated=out.deduplicated, + ) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 53d231174..f886d467b 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -8,21 +8,25 @@ from __future__ import annotations import asyncio -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any -from temporalio import activity, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._ids import inbound_stream_id from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_STATE = "__temporal_streams_state" +logger = logging.getLogger(__name__) + class _Fanout: """One server subscription, shared by every reader of that stream. @@ -104,18 +108,6 @@ async def publish(self, frame: bytes) -> None: workflow.add_stream_messages([frame], stream_id="", topic=self._topic) -def inbound_stream_id(workflow_id: str, stream: str) -> str: - """The server-side id of a workflow's inbound stream. - - A workflow names its streams relative to itself, so every provider can - address the same thing without workflow code knowing how it is stored. - Here that is a namespace-level stream id built from the pair, and the - workflow id rather than the run id because the stream has to survive - continue-as-new and reset. - """ - return f"{workflow_id}:{stream}" - - def _reject_configured_codec(client: Client) -> None: """Refuse a namespace whose payloads are meant to be encoded. @@ -200,8 +192,10 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append values and return where the first one landed.""" + async def append(self, *values: Any) -> Cursor | None: + """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + if not values: + return None frames = [] for value in values: frames.append( @@ -215,7 +209,7 @@ async def append(self, *values: Any) -> Cursor: ) ) self._sequence += 1 - offset = await self._handle.append( + appended = await self._handle.append( *frames, topic=self._topic, producer_id=self._provider_id, @@ -223,7 +217,9 @@ async def append(self, *values: Any) -> Cursor: # different job from telling readers that a new generation started. sequence=self._sequence - len(frames), ) - return Cursor(str(offset)) + if appended.deduplicated: + return None + return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: """Declare this stream complete.""" @@ -255,10 +251,16 @@ def _encode(self, value: Any) -> bytes: class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" - def __init__(self, handle: Any, converter: Any) -> None: - """Read the stream ``handle`` names, from anywhere.""" + def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: + """Read the stream ``handle`` names, from anywhere. + + ``stream`` is the inbound name the caller used, empty for the owner's + stream; ``address`` is what the server calls it, for log lines. + """ self._handle = handle self._converter = converter + self._stream = stream + self._address = address async def read( self, @@ -266,12 +268,13 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() async for message in self._handle.follow( from_offset=int(after.token) + 1 if after.token else 0 @@ -281,7 +284,11 @@ async def read( kind, frame_topic, source, attempt, sequence, body = _frame.decode( message.data ) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning( + "skipping record %s of stream %s: %s", cursor, self._address, error + ) continue if topic is not None and frame_topic != topic: continue @@ -373,22 +380,19 @@ async def producer( ) -> NativeProducer: """Open a producer on ``workflow_id``'s account. - ``stream`` names an inbound stream; with none, ``topic`` names a topic - on the stream the workflow publishes, which the server lets any - producer append to. Inside an activity, leave ``producer_id`` and - ``attempt`` unset: the activity's own id and attempt are the right - answer and are what let a reader tell a retry from a new generation. + ``stream`` names an inbound stream, a namespace-level stream the + server keys by the pair. With none, ``topic`` names a topic on the + stream the workflow publishes, which the server lets any producer + append to. An inbound record carries no topic: the stream's name is + its whole address. """ _reject_configured_codec(client) - if not producer_id: - producer_id = activity.info().activity_id - if not attempt: - attempt = activity.info().attempt streams = _stream_client(client) + converter = client.data_converter.payload_converter if not stream: return NativeProducer( streams.workflow_stream(workflow_id), - client.data_converter.payload_converter, + converter, topic, producer_id, attempt, @@ -404,13 +408,7 @@ async def producer( # exception. handle = streams.get(stream_id) _handles[stream_id] = handle - return NativeProducer( - handle, - client.data_converter.payload_converter, - stream, - producer_id, - attempt, - ) + return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( self, client: Client, *, workflow_id: str, stream: str = "" @@ -423,11 +421,14 @@ async def consumer( """ _reject_configured_codec(client) streams = _stream_client(client) + address = inbound_stream_id(workflow_id, stream) if stream: - handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + handle: Any = streams.get(address) else: handle = streams.workflow_stream(workflow_id) - return NativeConsumer(handle, client.data_converter.payload_converter) + return NativeConsumer( + handle, client.data_converter.payload_converter, stream, address + ) _provider.register("native", _NativeProvider) diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index 8d1a42f30..fde925cca 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -40,8 +40,10 @@ async def stream() -> AsyncIterator[StreamHandle]: async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - assert await stream.append(b"alpha", b"beta") == 0 - assert await stream.append(b"gamma") == 2 + first = await stream.append(b"alpha", b"beta") + assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) + assert not first.deduplicated + assert (await stream.append(b"gamma")).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: @@ -69,7 +71,10 @@ async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: first = await stream.append(b"once", producer_id="p1", sequence=1) retry = await stream.append(b"once", producer_id="p1", sequence=1) - assert first == retry == 0 + assert first.first_offset == retry.first_offset == 0 + assert not first.deduplicated + # The retry is told it wrote nothing, so a producer can report no position. + assert retry.deduplicated messages, _ = await stream.read() assert [m.data for m in messages] == [b"once"] From edeed5f047267c14f3e27eaf330385dcdbaa328c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:26:36 -0700 Subject: [PATCH 280/831] Pinned native stream handles to a run and closed their channels. A handle on a workflow's stream resolves the run once when it opens, so a follower is not redirected to a successor's empty stream after continue-as-new. The channel cache is keyed by the loop object and closed through the provider's close hook, and latest() reads a missing stream as empty but lets every other failure through. --- temporalio/client_stream.py | 77 +++++++++++++++++++++++++- temporalio/streams/providers/native.py | 60 +++++++++++--------- 2 files changed, 108 insertions(+), 29 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1cd775043..15760a980 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,6 +23,8 @@ from __future__ import annotations +import asyncio +import weakref from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from typing import Any @@ -40,6 +42,8 @@ "StreamClient", "StreamHandle", "WorkflowStreamHandle", + "close_shared_clients", + "shared_client", ] @@ -164,7 +168,7 @@ def get(self, stream_id: str) -> "StreamHandle": return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( - self, workflow_id: str, name: str = "" + self, workflow_id: str, name: str = "", *, owner_run_id: str = "" ) -> "WorkflowStreamHandle": """Open a stream a workflow publishes to. @@ -177,8 +181,13 @@ def workflow_stream( does not exist yet is not an error: it reads as empty and a :meth:`WorkflowStreamHandle.follow` parked on it wakes when the workflow publishes. + + ``owner_run_id`` pins the handle to one run of the workflow; see + :meth:`WorkflowStreamHandle.pin` for why a follower wants that. """ - return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + return WorkflowStreamHandle( + self._stub, self._namespace, workflow_id, name, owner_run_id + ) class StreamHandle: @@ -350,13 +359,19 @@ class WorkflowStreamHandle: """ def __init__( - self, stub: Any, namespace: str, workflow_id: str, name: str = "" + self, + stub: Any, + namespace: str, + workflow_id: str, + name: str = "", + owner_run_id: str = "", ) -> None: """Prefer :meth:`StreamClient.workflow_stream`.""" self._stub = stub self._namespace = namespace self._workflow_id = workflow_id self._name = name + self._owner_run_id = owner_run_id @property def workflow_id(self) -> str: @@ -368,6 +383,25 @@ def name(self) -> str: """Name the owner publishes under, empty for its default stream.""" return self._name + @property + def owner_run_id(self) -> str: + """The run this handle is pinned to, empty while it follows the current run.""" + return self._owner_run_id + + def pin(self, run_id: str) -> None: + """Address one run of the workflow from now on. + + Unpinned, every call resolves to whichever run is current. A follower + holding an offset from one run would then be redirected when the + workflow continues as new: the successor's stream starts empty at + offset zero, so the server reads the follower's offset as "caught up", + parks it until the successor has published that many records, and + then skips exactly that many. Pinned, the run's end shows up as + ``closed`` on the page, and the caller decides whether to follow the + successor from the beginning. + """ + self._owner_run_id = run_id + async def append( self, *messages: bytes, @@ -386,6 +420,7 @@ async def append( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, messages=[ stream.StreamMessage( @@ -418,6 +453,7 @@ async def read( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -460,12 +496,14 @@ async def poll( :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. + On a pinned handle ``closed`` also says the run has ended. """ response = await self._stub.PollWorkflowMessages( stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -496,6 +534,7 @@ async def describe(self) -> stream.StreamState: frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, ) ) @@ -510,3 +549,35 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: count=out.count, deduplicated=out.deduplicated, ) + + +# One channel per loop, target and namespace, shared by every handle in the +# process. A channel is multiplexed and long lived, and callers open a handle +# per subscription, which would otherwise be a connection per subscription. The +# loop is the key because a grpc.aio channel belongs to the loop that made it, +# and it is held weakly so a loop that is gone cannot lend its channel to a +# successor that happens to reuse its id. +_shared: weakref.WeakKeyDictionary[ + asyncio.AbstractEventLoop, dict[tuple[str, str], StreamClient] +] = weakref.WeakKeyDictionary() + + +def shared_client(target_host: str, namespace: str) -> StreamClient: + """The process-wide client for ``target_host`` and ``namespace`` on this loop.""" + per_loop = _shared.setdefault(asyncio.get_running_loop(), {}) + key = (target_host, namespace) + existing = per_loop.get(key) + if existing is None: + existing = per_loop[key] = StreamClient.connect(target_host, namespace) + return existing + + +async def close_shared_clients() -> None: + """Close every shared client this loop opened. + + For a process that is done with streams, and for tests, which open a + loop per case and would otherwise leave a channel behind on each. + """ + per_loop = _shared.pop(asyncio.get_running_loop(), {}) + for client in per_loop.values(): + await client.close() diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f886d467b..6dfdd4c25 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -13,10 +13,12 @@ from datetime import timedelta from typing import Any +import grpc + from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.client_stream import StreamClient +from temporalio.client_stream import StreamClient, close_shared_clients, shared_client from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._ids import inbound_stream_id @@ -126,24 +128,23 @@ def _reject_configured_codec(client: Client) -> None: # stream reuses the handle rather than asking the server to create it again. # The second create is answered correctly, and it is still a failed call the # server logs, which is noise an operator has to learn to ignore. -_handles: dict[str, Any] = {} +_handles: dict[tuple[str, str, str], Any] = {} -# One channel per target and namespace, shared by every handle in the process. -# A channel is multiplexed and long lived, and callers open a handle per -# subscription, which would otherwise be a connection per subscription. -_channels: dict[tuple[int, str, str], StreamClient] = {} +def _stream_client(client: Client) -> StreamClient: + return shared_client(client.service_client.config.target_host, client.namespace) -def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _channels.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _channels[key] = existing - return existing +async def _owner_run(client: Client, workflow_id: str) -> str: + """The run whose stream a handle on ``workflow_id`` should address. + + Resolved once, when the handle opens. Left to the server, a follower whose + workflow continued as new would be redirected to the successor, whose + stream starts empty, and its offset read as "caught up" rather than as a + position on the run it was watching. A producer is pinned for the same + reason: an activity's output belongs to the run that scheduled it. + """ + return (await client.get_workflow_handle(workflow_id).describe()).run_id class NativeProducer: @@ -310,9 +311,12 @@ async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() - except Exception: + except grpc.aio.AioRpcError as error: # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. + # is the same answer as an empty one. Any other failure is not: + # a reader that took it for "empty" would replay the whole stream. + if error.code() is not grpc.StatusCode.NOT_FOUND: + raise return BEGINNING return ( Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING @@ -344,6 +348,10 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + async def close(self) -> None: + """Close the channels this process opened to the stream service.""" + await close_shared_clients() + def open_read( self, stream: str, @@ -390,15 +398,13 @@ async def producer( streams = _stream_client(client) converter = client.data_converter.payload_converter if not stream: - return NativeProducer( - streams.workflow_stream(workflow_id), - converter, - topic, - producer_id, - attempt, + handle: Any = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) ) + return NativeProducer(handle, converter, topic, producer_id, attempt) stream_id = inbound_stream_id(workflow_id, stream) - handle = _handles.get(stream_id) + key = (client.service_client.config.target_host, client.namespace, stream_id) + handle = _handles.get(key) if handle is None: try: handle = await streams.create(stream_id) @@ -407,7 +413,7 @@ async def producer( # stream it does not own is the ordinary case, not the # exception. handle = streams.get(stream_id) - _handles[stream_id] = handle + _handles[key] = handle return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( @@ -425,7 +431,9 @@ async def consumer( if stream: handle: Any = streams.get(address) else: - handle = streams.workflow_stream(workflow_id) + handle = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) + ) return NativeConsumer( handle, client.data_converter.payload_converter, stream, address ) From 5d0906eae05f4c85cc031d52234cd81b96fd64e9 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:28:14 -0700 Subject: [PATCH 281/831] Stopped the flusher without cancelling it and pinned the contrib client. A cancel landing inside the flusher's append unwound with the batch it had taken off the buffer. The client now asks it to stop and waits. The handle is pinned to the run it opened on, from the activity's own run id or one describe, and the channel cache is the shared one. --- temporalio/contrib/server_streams/__init__.py | 100 +++++++++++------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index c15184bf4..690402974 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -21,15 +21,15 @@ import asyncio import builtins -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass from datetime import timedelta from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.client import Client, WorkflowExecutionDescription +from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client from temporalio.converter import PayloadConverter __all__ = [ @@ -78,16 +78,15 @@ def _encode(converter: PayloadConverter, value: Any) -> bytes: The payload rather than the bare bytes, so the encoding metadata the consumer needs to decode into a type travels with it. - The codec chain is not applied. It cannot be applied here: a codec is async - and a Workflow publishing to a stream is not, so running one inside Workflow - code would be I/O on the Workflow thread. Regular payloads solve this in the - Worker, encoding on the way out and decoding on the way in, and a stream - needs the same plumbing before a codec can be honoured. - - It is not applied on the client path either, deliberately. Encoding one side - and not the other is worse than encoding neither: an Activity's messages - would reach a consuming Workflow as ciphertext it has no way to decode. - :func:`_reject_configured_codec` is what keeps that from happening quietly. + The codec chain is not applied here. Inside a Workflow it does not have to + be: the Worker runs the payload visitor with its codec over the commands + and activations, so a body that rides ``add_stream_messages`` is encoded + on the way out and one that arrives on ``deliver_stream_messages`` is + decoded on the way in, as every other payload is. The client path has no + such pass, and encoding one side but not the other is worse than encoding + neither: an Activity's messages would reach a consuming Workflow as + ciphertext it has no way to decode. :func:`_reject_configured_codec` + refuses a client with a codec until the client path applies one too. """ payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] return payload.SerializeToString() @@ -232,14 +231,22 @@ def __init__( handle: WorkflowStreamHandle, converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + *, + describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: - """Prefer :meth:`create` or :meth:`from_within_activity`.""" + """Prefer :meth:`create` or :meth:`from_within_activity`. + + ``describe`` is how an unpinned handle learns which run it follows; + see :meth:`WorkflowStreamHandle.pin`. + """ self._handle = handle self._converter = converter self._batch_interval = batch_interval + self._describe = describe self._buffered: list[tuple[str, Any]] = [] self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() + self._closed = False @classmethod def create( @@ -247,14 +254,24 @@ def create( client: Client, workflow_id: str, *, + owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, ) -> "WorkflowStreamClient": - """Open the stream owned by ``workflow_id``.""" + """Open the stream owned by ``workflow_id``. + + Without ``owner_run_id`` the current run is looked up on the first + call and the handle pinned to it, so a reader following across a + continue-as-new sees the run end rather than being moved to the + successor's stream at a stale offset. + """ _reject_configured_codec(client) return cls( - _stream_client(client).workflow_stream(workflow_id), + _stream_client(client).workflow_stream( + workflow_id, owner_run_id=owner_run_id + ), client.data_converter.payload_converter, batch_interval, + describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod @@ -262,13 +279,20 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - workflow_id = activity.info().workflow_id - if workflow_id is None: + info = activity.info() + if info.workflow_id is None: raise RuntimeError( "no Workflow stream to open: this Activity was not started by a " "Workflow" ) - return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) + # The Activity's output belongs to the run that scheduled it, and the + # Activity already knows which run that is. + return cls.create( + activity.client(), + info.workflow_id, + owner_run_id=info.workflow_run_id or "", + batch_interval=batch_interval, + ) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -279,17 +303,22 @@ async def __aexit__(self, *_exc: object) -> None: """Drain what is buffered before letting the caller go. An Activity that returned with a batch still buffered would have - reported work its readers never saw. + reported work its readers never saw. The flusher is asked to stop + rather than cancelled: a cancel landing inside its append would + unwind with the batch it had already taken off the buffer. """ + self._closed = True + self._wake.set() if self._flusher is not None: - self._flusher.cancel() - try: - await self._flusher - except asyncio.CancelledError: - pass + await self._flusher self._flusher = None await self.flush() + async def _pin(self) -> None: + if self._handle.owner_run_id or self._describe is None: + return + self._handle.pin((await self._describe()).run_id) + @overload def topic(self, name: str) -> TopicHandle[Any]: ... @@ -305,6 +334,7 @@ async def get_offset(self) -> int: A reader that wants only what comes next starts here. """ + await self._pin() return (await self._handle.describe()).head_offset async def subscribe( @@ -321,6 +351,7 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown + await self._pin() async for message in self._handle.follow( from_offset=from_offset, topics=topics ): @@ -342,6 +373,7 @@ async def poll_raw( For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. """ + await self._pin() page = await self._handle.poll( from_offset=from_offset, topics=topics, wait=wait ) @@ -360,6 +392,7 @@ async def flush(self) -> None: pending, self._buffered = self._buffered, [] if not pending: return + await self._pin() # One append per topic, because a batch carries a single topic. The # harness case is one topic, so this is one append. by_topic: dict[str, list[bytes]] = {} @@ -376,7 +409,7 @@ def _flush_soon(self) -> None: async def _run_flusher(self) -> None: """Append on a fixed cadence, so a slow producer still gets delivered.""" - while True: + while not self._closed: try: await asyncio.wait_for( self._wake.wait(), self._batch_interval.total_seconds() @@ -387,18 +420,5 @@ async def _run_flusher(self) -> None: await self.flush() -# One channel per target, shared by every handle in the process. The channel is -# multiplexed and long-lived, and callers here open a client per subscription, -# which would otherwise be a connection per subscription. -_clients: dict[tuple[int, str, str], StreamClient] = {} - - def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop too: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _clients.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _clients[key] = existing - return existing + return shared_client(client.service_client.config.target_host, client.namespace) From 057f401608a7bef96ab715574d79c716d67b2e31 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:23 -0700 Subject: [PATCH 282/831] Checked stream ranges for continuity and mirrored the byte limits. A range is recorded as consumed once and never resent, so a repeated, skipped or mis-sized delivery would hand the workflow duplicate or shifted bodies with nothing to say so. The worker also refuses a publish over the server's per-message and per-batch byte limits before the command exists, for the reason the count limit already gave. --- temporalio/worker/_workflow_instance.py | 53 +++++++++++++--- tests/worker/test_workflow_stream.py | 84 +++++++++++++++++++++++-- 2 files changed, 123 insertions(+), 14 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 66833dd8c..0a17d2b22 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -273,10 +273,12 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# Match the server's per-batch limits. Rejecting here turns a wedged workflow, # which would replay and re-issue the same rejected command forever, into an # error the workflow author can see. _MAX_STREAM_MESSAGES_PER_BATCH = 1000 +_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +_MAX_STREAM_BATCH_BYTES = 2 << 20 class _StreamBuffer: @@ -288,15 +290,38 @@ class _StreamBuffer: dropped. """ - def __init__(self) -> None: + def __init__(self, stream_id: str = "") -> None: + self._stream_id = stream_id self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] self._waiters: list[asyncio.Future] = [] + # Where the next range has to start. Unknown until the first one + # arrives, because a subscription may start wherever the stream is and + # the server is the one that resolves that. + self._next_offset: int | None = None def extend( self, messages: Sequence[temporalio.api.stream.v1.StreamMessage], from_offset: int = 0, + to_offset: int | None = None, ) -> None: + if to_offset is None: + to_offset = from_offset + len(messages) + # A range is recorded as consumed once and never resent, so one that + # repeats, skips or mis-sizes would hand the workflow duplicate or + # shifted bodies with nothing to say so. Failing the task is what makes + # the fault visible. + if to_offset - from_offset != len(messages): + raise RuntimeError( + f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"for offsets [{from_offset}, {to_offset})" + ) + if self._next_offset is not None and from_offset != self._next_offset: + raise RuntimeError( + f"stream {self._stream_id!r} delivered offsets [{from_offset}, " + f"{to_offset}) but the last range ended at {self._next_offset}" + ) + self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. if not messages: @@ -1223,9 +1248,9 @@ def _apply_deliver_stream_messages( # Nothing subscribed. The range is already recorded as consumed and # will not be sent again, so buffering it is the only way a # subscription made later in the same task still sees it. - buffer = _StreamBuffer() + buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset) + buffer.extend(job.messages, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1393,9 +1418,9 @@ def get_info(self) -> temporalio.workflow.Info: def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: # Reissued on every replay, so the buffer has to exist before the first - # range arrives and the command has to be harmless the second time. The - # server treats a repeat subscription to the same stream as a no-op. - self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + # range arrives and the command has to be harmless the second time. A + # repeat subscription leaves the server-side cursor where it is. + self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) command = self._add_command() command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset @@ -1410,6 +1435,18 @@ def workflow_add_stream_messages( f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " f"got {len(messages)}" ) + total = 0 + for body in messages: + if len(body) > _MAX_STREAM_MESSAGE_BYTES: + raise ValueError( + f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " + f"bytes, got {len(body)}" + ) + total += len(body) + if total > _MAX_STREAM_BATCH_BYTES: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" + ) command = self._add_command() command.add_stream_messages.stream_id = stream_id for body in messages: @@ -1437,7 +1474,7 @@ async def workflow_read_stream_messages( # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. self._assert_not_read_only("read stream") - buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) while not len(buffer): await buffer.wait_future() taken = buffer.take() diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 1d154b37c..93b596b8c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -15,10 +15,14 @@ import temporalio.api.common.v1 import temporalio.api.stream.v1 as api_stream +from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( + _MAX_STREAM_BATCH_BYTES, + _MAX_STREAM_MESSAGE_BYTES, _StreamBuffer, _WorkflowInstanceImpl, ) +from temporalio.workflow import ReadOnlyContextError def message(body: bytes) -> api_stream.StreamMessage: @@ -78,12 +82,13 @@ class _ReadOnlyStub: workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages - def __init__(self) -> None: + def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} - self.read_only_calls: list[str] = [] + self._read_only = read_only def _assert_not_read_only(self, action: str) -> None: - self.read_only_calls.append(action) + if self._read_only: + raise ReadOnlyContextError(f"cannot {action} in a read-only context") async def read(self, stream: str, max_messages: int) -> list[bytes]: instance: Any = self @@ -115,9 +120,76 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> # A query activation carries no ranges, so a read there would wait on a future # nothing can resolve and the query would time out saying nothing. async def test_read_is_refused_in_a_read_only_context() -> None: - stub = _ReadOnlyStub() + stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await stub.read("s", 0) - assert stub.read_only_calls == ["read stream"] + with pytest.raises(ReadOnlyContextError, match="read stream"): + await stub.read("s", 0) + # Refused before the buffer was touched, so the range is still there for + # the task that is allowed to read it. + assert len(stub._stream_buffers["s"]) == 1 + + +# A range is recorded as consumed once and never resent, so the buffer is the +# only place a repeated, skipped or mis-sized delivery can still be noticed. +async def test_ranges_have_to_abut_the_last_one() -> None: + buffer = _StreamBuffer("s") + buffer.extend([message(b"a"), message(b"b")], 0, 2) + # An empty range moves the expectation too: the server recorded it. + buffer.extend([], 2, 2) + buffer.extend([message(b"c")], 2, 3) + assert [m.offset for m in buffer.take()] == [0, 1, 2] + + with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): + buffer.extend([message(b"c")], 2, 3) + with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): + buffer.extend([message(b"f")], 5, 6) + + +async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: + buffer = _StreamBuffer("s") + with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): + buffer.extend([message(b"a"), message(b"b")], 0, 1) + assert len(buffer) == 0 + + +class _CommandStub: + """Drives the real publish path and keeps the commands it issued.""" + + workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + def _add_command(self) -> WorkflowCommand: + command = WorkflowCommand() + self.commands.append(command) + return command + + def publish(self, *bodies: bytes) -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + + +# The server refuses an oversized publish, and a refused command is reissued +# on every replay, so the limits have to be applied before the command exists. +def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): + stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) + assert len(stub.commands) == 1 + + +def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) + stub.publish(half, half) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): + stub.publish(half, half, b"x") + assert len(stub.commands) == 1 From 9d591d51ec5232dcf47add4440ebcd2d1bb902d1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:24 -0700 Subject: [PATCH 283/831] Corrected the subscribe docstring and two stale test comments. --- temporalio/workflow/_context.py | 7 ++++--- tests/contrib/test_server_streams.py | 2 -- tests/worker/test_workflow_stream_e2e.py | 7 ++----- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 450051456..57183aafb 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -971,9 +971,10 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: """Subscribe this workflow to a stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: the server treats - a second subscription to the same stream as a no-op, which is what makes - calling it on every replay harmless. + and :func:`read_stream` returns them. Safe to call again: a second + subscription to a stream this run already consumes does not move its + cursor, though it does write one event. Calling it on every replay is + harmless because replay matches the command to the event already recorded. Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index e1fe84c77..9b339dfe4 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -82,8 +82,6 @@ async def test_both_producers_reach_one_subscriber() -> None: Emitting.run, tokens, id=wf_id, task_queue=task_queue ) - # Subscribed before the Workflow has published anything, which is what - # a consumer attaching to a session does. # Subscribed before the Workflow has published anything, which is what # a consumer attaching to a session does. stream = WorkflowStreamClient.create(client, wf_id) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 3ee38fef3..31296b2c8 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -32,11 +32,8 @@ STREAM = "output" -# Event type numbers rather than names: this SDK's api protos predate both -# events, so the attributes arrive as unknown fields and only the type is -# readable here. The server's own tests are where the offsets are asserted. -EVENT_STREAM_SUBSCRIBED = 61 -EVENT_STREAM_MESSAGES_ADDED = 62 +EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED +EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED @workflow.defn From 3293baa96b95a1bf702014bf81d8b844eed7a28a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:44:38 -0700 Subject: [PATCH 284/831] Repinned Core to the reviewed moe/AI-198-fix-replay-slice-lookahead head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 4076ef24f..a67781227 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 +Subproject commit a67781227a88df50a0617247d20d4908f96d4593 From 2dbe445cb986519c34573abf352cb7a987278078 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:47:29 -0700 Subject: [PATCH 285/831] Regenerated the bridge protos from the repinned Core. The native activation job and the two native commands moved to the field numbers the combined Core tree uses, so both trees agree. --- .../workflow_activation_pb2.py | 2 +- .../workflow_activation_pb2.pyi | 7 +++++- .../workflow_commands_pb2.py | 2 +- .../workflow_commands_pb2.pyi | 22 ++++++++++++------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index cd09b8b97..5df8ff627 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,7 +47,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 5245cd6fc..a6787024a 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -298,7 +298,12 @@ class WorkflowActivationJob(google.protobuf.message.Message): """A nexus operation resolved.""" @property def deliver_stream_messages(self) -> global___DeliverStreamMessages: - """A range of a stream the workflow subscribed to.""" + """17 to 20 are taken by the external stream jobs, which are developed + alongside this one and share this message. The number below is fixed + with that family and must not be reused. + + A range of a stream the workflow subscribed to. + """ @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0d81e37f5..44f658d1e 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index bcf1bf7eb..18b6e2ff9 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -181,7 +181,11 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property - def subscribe_stream(self) -> global___SubscribeStream: ... + def subscribe_stream(self) -> global___SubscribeStream: + """23 to 28 are taken by the external stream commands, which are developed + alongside these and share this message. The two numbers below are fixed + with that family and must not be reused. + """ @property def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( @@ -376,13 +380,7 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand class AddStreamMessages(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - Publish a batch of messages to a stream this workflow owns. + """Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -420,6 +418,14 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int From 2d5e82271d8cabc546222da691e06faf5e603932 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:24:50 -0700 Subject: [PATCH 286/831] Repinned Core to the reviewed replay-slice head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index a67781227..97cd17296 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit a67781227a88df50a0617247d20d4908f96d4593 +Subproject commit 97cd17296fcc6178407c770f96f354bcc4e9f540 From 78f44fd9ee5ceeb756801aa477a8bd9026c59837 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:31:31 -0700 Subject: [PATCH 287/831] Regenerated the bridge protos from the repinned Core. The activation job is now deliver_stream_records and the command append_stream_records, both carrying StreamRecord, so the payload visitor reaches each record's body and metadata. --- temporalio/bridge/_visitor.py | 26 +-- .../proto/workflow_activation/__init__.py | 4 +- .../workflow_activation_pb2.py | 116 ++++++------- .../workflow_activation_pb2.pyi | 34 ++-- .../proto/workflow_commands/__init__.py | 4 +- .../workflow_commands_pb2.py | 152 +++++++++--------- .../workflow_commands_pb2.pyi | 38 ++--- 7 files changed, 188 insertions(+), 186 deletions(-) diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index 77d1b6c7a..c04d1c60f 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,7 +308,7 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) - async def _visit_temporal_api_stream_v1_StreamMessage( + async def _visit_temporal_api_stream_v1_StreamRecord( self, fs: VisitorFunctions, o: Any ): if o.HasField("body"): @@ -316,11 +316,11 @@ async def _visit_temporal_api_stream_v1_StreamMessage( for v in o.metadata.values(): await self._visit_temporal_api_common_v1_Payload(fs, v) - async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + async def _visit_coresdk_workflow_activation_DeliverStreamRecords( self, fs: VisitorFunctions, o: Any ): - for v in o.messages: - await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any @@ -367,9 +367,9 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) - elif o.HasField("deliver_stream_messages"): - await self._visit_coresdk_workflow_activation_DeliverStreamMessages( - fs, o.deliver_stream_messages + elif o.HasField("deliver_stream_records"): + await self._visit_coresdk_workflow_activation_DeliverStreamRecords( + fs, o.deliver_stream_records ) async def _visit_coresdk_workflow_activation_WorkflowActivation( @@ -510,11 +510,11 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) - async def _visit_coresdk_workflow_commands_AddStreamMessages( + async def _visit_coresdk_workflow_commands_AppendStreamRecords( self, fs: VisitorFunctions, o: Any ): - for v in o.messages: - await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any @@ -575,9 +575,9 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) - elif o.HasField("add_stream_messages"): - await self._visit_coresdk_workflow_commands_AddStreamMessages( - fs, o.add_stream_messages + elif o.HasField("append_stream_records"): + await self._visit_coresdk_workflow_commands_AppendStreamRecords( + fs, o.append_stream_records ) async def _visit_coresdk_workflow_completion_Success( diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index ae7639820..f17880890 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,6 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, - DeliverStreamMessages, + DeliverStreamRecords, DoUpdate, FireTimer, InitializeWorkflow, @@ -25,7 +25,7 @@ __all__ = [ "CancelWorkflow", - "DeliverStreamMessages", + "DeliverStreamRecords", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 5df8ff627..7f6d3e782 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,13 +47,13 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ "HeadersEntry" @@ -118,16 +118,16 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( - "DeliverStreamMessages", +DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( + "DeliverStreamRecords", (_message.Message,), { - "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "DESCRIPTOR": _DELIVERSTREAMRECORDS, "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamRecords) }, ) -_sym_db.RegisterMessage(DeliverStreamMessages) +_sym_db.RegisterMessage(DeliverStreamRecords) InitializeWorkflow = _reflection.GeneratedProtocolMessageType( "InitializeWorkflow", @@ -394,55 +394,55 @@ _WORKFLOWACTIVATION._serialized_start = 570 _WORKFLOWACTIVATION._serialized_end = 1116 _WORKFLOWACTIVATIONJOB._serialized_start = 1119 - _WORKFLOWACTIVATIONJOB._serialized_end = 2582 - _DELIVERSTREAMMESSAGES._serialized_start = 2585 - _DELIVERSTREAMMESSAGES._serialized_end = 2724 - _INITIALIZEWORKFLOW._serialized_start = 2727 - _INITIALIZEWORKFLOW._serialized_end = 4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _FIRETIMER._serialized_start = 4133 - _FIRETIMER._serialized_end = 4157 - _RESOLVEACTIVITY._serialized_start = 4159 - _RESOLVEACTIVITY._serialized_end = 4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 - _UPDATERANDOMSEED._serialized_start = 5045 - _UPDATERANDOMSEED._serialized_end = 5088 - _QUERYWORKFLOW._serialized_start = 5091 - _QUERYWORKFLOW._serialized_end = 5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _CANCELWORKFLOW._serialized_start = 5353 - _CANCELWORKFLOW._serialized_end = 5385 - _SIGNALWORKFLOW._serialized_start = 5388 - _SIGNALWORKFLOW._serialized_end = 5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _NOTIFYHASPATCH._serialized_start = 5679 - _NOTIFYHASPATCH._serialized_end = 5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 - _DOUPDATE._serialized_start = 5917 - _DOUPDATE._serialized_end = 6248 - _DOUPDATE_HEADERSENTRY._serialized_start = 4052 - _DOUPDATE_HEADERSENTRY._serialized_end = 4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 - _RESOLVENEXUSOPERATION._serialized_start = 6407 - _RESOLVENEXUSOPERATION._serialized_end = 6496 - _REMOVEFROMCACHE._serialized_start = 6499 - _REMOVEFROMCACHE._serialized_end = 6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 + _WORKFLOWACTIVATIONJOB._serialized_end = 2580 + _DELIVERSTREAMRECORDS._serialized_start = 2583 + _DELIVERSTREAMRECORDS._serialized_end = 2719 + _INITIALIZEWORKFLOW._serialized_start = 2722 + _INITIALIZEWORKFLOW._serialized_end = 4126 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _FIRETIMER._serialized_start = 4128 + _FIRETIMER._serialized_end = 4152 + _RESOLVEACTIVITY._serialized_start = 4154 + _RESOLVEACTIVITY._serialized_end = 4263 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4266 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4603 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4605 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4664 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4667 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4833 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4835 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4931 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4933 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5038 + _UPDATERANDOMSEED._serialized_start = 5040 + _UPDATERANDOMSEED._serialized_end = 5083 + _QUERYWORKFLOW._serialized_start = 5086 + _QUERYWORKFLOW._serialized_end = 5346 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _CANCELWORKFLOW._serialized_start = 5348 + _CANCELWORKFLOW._serialized_end = 5380 + _SIGNALWORKFLOW._serialized_start = 5383 + _SIGNALWORKFLOW._serialized_end = 5672 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _NOTIFYHASPATCH._serialized_start = 5674 + _NOTIFYHASPATCH._serialized_end = 5708 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5710 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5805 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5807 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5909 + _DOUPDATE._serialized_start = 5912 + _DOUPDATE._serialized_end = 6243 + _DOUPDATE_HEADERSENTRY._serialized_start = 4047 + _DOUPDATE_HEADERSENTRY._serialized_end = 4126 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6246 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6400 + _RESOLVENEXUSOPERATION._serialized_start = 6402 + _RESOLVENEXUSOPERATION._serialized_end = 6491 + _REMOVEFROMCACHE._serialized_start = 6494 + _REMOVEFROMCACHE._serialized_end = 6846 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6608 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6846 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index a6787024a..ac9ac13f7 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -236,7 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int - DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int + DELIVER_STREAM_RECORDS_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -297,7 +297,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property - def deliver_stream_messages(self) -> global___DeliverStreamMessages: + def deliver_stream_records(self) -> global___DeliverStreamRecords: """17 to 20 are taken by the external stream jobs, which are developed alongside this one and share this message. The number below is fixed with that family and must not be reused. @@ -332,7 +332,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., - deliver_stream_messages: global___DeliverStreamMessages | None = ..., + deliver_stream_records: global___DeliverStreamRecords | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -340,8 +340,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -381,8 +381,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -436,7 +436,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", - "deliver_stream_messages", + "deliver_stream_records", "remove_from_cache", ] | None @@ -444,7 +444,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob -class DeliverStreamMessages(google.protobuf.message.Message): +class DeliverStreamRecords(google.protobuf.message.Message): """Hand a workflow the next range of a stream it subscribed to. The range is delivered once, on the task the server decided it belongs to, @@ -461,7 +461,7 @@ class DeliverStreamMessages(google.protobuf.message.Message): STREAM_ID_FIELD_NUMBER: builtins.int FROM_OFFSET_FIELD_NUMBER: builtins.int TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int stream_id: builtins.str """Id of the stream this range came from.""" from_offset: builtins.int @@ -469,10 +469,10 @@ class DeliverStreamMessages(google.protobuf.message.Message): to_offset: builtins.int """Exclusive. Equal to from_offset when the subscription saw nothing.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage + temporalio.api.stream.v1.message_pb2.StreamRecord ]: ... def __init__( self, @@ -480,8 +480,8 @@ class DeliverStreamMessages(google.protobuf.message.Message): stream_id: builtins.str = ..., from_offset: builtins.int = ..., to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord ] | None = ..., ) -> None: ... @@ -490,8 +490,8 @@ class DeliverStreamMessages(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "from_offset", b"from_offset", - "messages", - b"messages", + "records", + b"records", "stream_id", b"stream_id", "to_offset", @@ -499,7 +499,7 @@ class DeliverStreamMessages(google.protobuf.message.Message): ], ) -> None: ... -global___DeliverStreamMessages = DeliverStreamMessages +global___DeliverStreamRecords = DeliverStreamRecords class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 44826f2da..9fb1c8f08 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,6 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, - AddStreamMessages, + AppendStreamRecords, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -30,7 +30,7 @@ __all__ = [ "ActivityCancellationType", - "AddStreamMessages", + "AppendStreamRecords", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 44f658d1e..5af8f0744 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,7 +59,7 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] _SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] @@ -135,16 +135,16 @@ ) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType( - "AddStreamMessages", +AppendStreamRecords = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecords", (_message.Message,), { - "DESCRIPTOR": _ADDSTREAMMESSAGES, + "DESCRIPTOR": _APPENDSTREAMRECORDS, "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AppendStreamRecords) }, ) -_sym_db.RegisterMessage(AddStreamMessages) +_sym_db.RegisterMessage(AppendStreamRecords) SubscribeStream = _reflection.GeneratedProtocolMessageType( "SubscribeStream", @@ -511,74 +511,74 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9020 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9108 _WORKFLOWCOMMAND._serialized_start = 556 - _WORKFLOWCOMMAND._serialized_end = 2794 - _ADDSTREAMMESSAGES._serialized_start = 2796 - _ADDSTREAMMESSAGES._serialized_end = 2891 - _SUBSCRIBESTREAM._serialized_start = 2893 - _SUBSCRIBESTREAM._serialized_end = 2951 - _STARTTIMER._serialized_start = 2953 - _STARTTIMER._serialized_end = 3036 - _CANCELTIMER._serialized_start = 3038 - _CANCELTIMER._serialized_end = 3064 - _SCHEDULEACTIVITY._serialized_start = 3067 - _SCHEDULEACTIVITY._serialized_end = 3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 - _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4683 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4685 - _REQUESTCANCELACTIVITY._serialized_end = 4721 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 - _QUERYRESULT._serialized_start = 4767 - _QUERYRESULT._serialized_end = 4923 - _QUERYSUCCESS._serialized_start = 4925 - _QUERYSUCCESS._serialized_end = 4990 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 - _FAILWORKFLOWEXECUTION._serialized_start = 5070 - _FAILWORKFLOWEXECUTION._serialized_end = 5144 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6063 - _CANCELWORKFLOWEXECUTION._serialized_end = 6139 - _SETPATCHMARKER._serialized_start = 6141 - _SETPATCHMARKER._serialized_end = 6195 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7997 - _CANCELSIGNALWORKFLOW._serialized_end = 8032 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 - _UPDATERESPONSE._serialized_start = 8219 - _UPDATERESPONSE._serialized_end = 8429 - _SCHEDULENEXUSOPERATION._serialized_start = 8432 - _SCHEDULENEXUSOPERATION._serialized_end = 8970 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 + _WORKFLOWCOMMAND._serialized_end = 2798 + _APPENDSTREAMRECORDS._serialized_start = 2800 + _APPENDSTREAMRECORDS._serialized_end = 2895 + _SUBSCRIBESTREAM._serialized_start = 2897 + _SUBSCRIBESTREAM._serialized_end = 2955 + _STARTTIMER._serialized_start = 2957 + _STARTTIMER._serialized_end = 3040 + _CANCELTIMER._serialized_start = 3042 + _CANCELTIMER._serialized_end = 3068 + _SCHEDULEACTIVITY._serialized_start = 3071 + _SCHEDULEACTIVITY._serialized_end = 3895 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3895 + _SCHEDULELOCALACTIVITY._serialized_start = 3898 + _SCHEDULELOCALACTIVITY._serialized_end = 4687 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3895 + _REQUESTCANCELACTIVITY._serialized_start = 4689 + _REQUESTCANCELACTIVITY._serialized_end = 4725 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4727 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4768 + _QUERYRESULT._serialized_start = 4771 + _QUERYRESULT._serialized_end = 4927 + _QUERYSUCCESS._serialized_start = 4929 + _QUERYSUCCESS._serialized_end = 4994 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4996 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5072 + _FAILWORKFLOWEXECUTION._serialized_start = 5074 + _FAILWORKFLOWEXECUTION._serialized_end = 5148 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5151 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6065 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELWORKFLOWEXECUTION._serialized_start = 6067 + _CANCELWORKFLOWEXECUTION._serialized_end = 6143 + _SETPATCHMARKER._serialized_start = 6145 + _SETPATCHMARKER._serialized_end = 6199 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6202 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7376 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7378 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7452 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7455 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7597 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7600 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7999 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELSIGNALWORKFLOW._serialized_start = 8001 + _CANCELSIGNALWORKFLOW._serialized_end = 8036 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8038 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8139 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8141 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8220 + _UPDATERESPONSE._serialized_start = 8223 + _UPDATERESPONSE._serialized_end = 8433 + _SCHEDULENEXUSOPERATION._serialized_start = 8436 + _SCHEDULENEXUSOPERATION._serialized_end = 8974 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8924 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8974 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8976 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9018 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 18b6e2ff9..b4848ddb1 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -105,7 +105,7 @@ class WorkflowCommand(google.protobuf.message.Message): SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int - ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -187,7 +187,7 @@ class WorkflowCommand(google.protobuf.message.Message): with that family and must not be reused. """ @property - def add_stream_messages(self) -> global___AddStreamMessages: ... + def append_stream_records(self) -> global___AppendStreamRecords: ... def __init__( self, *, @@ -227,13 +227,13 @@ class WorkflowCommand(google.protobuf.message.Message): request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., subscribe_stream: global___SubscribeStream | None = ..., - add_stream_messages: global___AddStreamMessages | None = ..., + append_stream_records: global___AppendStreamRecords | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "add_stream_messages", - b"add_stream_messages", + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -289,8 +289,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "add_stream_messages", - b"add_stream_messages", + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -372,50 +372,52 @@ class WorkflowCommand(google.protobuf.message.Message): "schedule_nexus_operation", "request_cancel_nexus_operation", "subscribe_stream", - "add_stream_messages", + "append_stream_records", ] | None ): ... global___WorkflowCommand = WorkflowCommand -class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch - size free: a thousand messages cost the same in History as one. + size free: a thousand records cost the same in History as one. The server + stores each record with an empty producer id, because the workflow is the + producer here. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int stream_id: builtins.str """Empty means the workflow's default output stream.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage + temporalio.api.stream.v1.message_pb2.StreamRecord ]: ... def __init__( self, *, stream_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord ] | None = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "messages", b"messages", "stream_id", b"stream_id" + "records", b"records", "stream_id", b"stream_id" ], ) -> None: ... -global___AddStreamMessages = AddStreamMessages +global___AppendStreamRecords = AppendStreamRecords class SubscribeStream(google.protobuf.message.Message): """Subscribe this workflow to a stream, so later Workflow Tasks carry the From e7db5aa2e6687286039eba3d67b88811730a03bb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:33:01 -0700 Subject: [PATCH 288/831] Regenerated the vendored stream service protos from the record server. --- temporalio/api/streamservice/v1/__init__.py | 34 +-- .../api/streamservice/v1/message_pb2.py | 62 +++-- .../api/streamservice/v1/message_pb2.pyi | 99 ++++---- .../streamservice/v1/request_response_pb2.py | 224 +++++++++--------- .../streamservice/v1/request_response_pb2.pyi | 123 ++++++---- .../api/streamservice/v1/stream_state_pb2.py | 42 ++-- .../api/streamservice/v1/stream_state_pb2.pyi | 93 +++++--- 7 files changed, 363 insertions(+), 314 deletions(-) diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 7e2ebef29..1e909c223 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -4,22 +4,9 @@ # is still defined in the server. See temporalio/client_stream.py. from .message_pb2 import ( - STREAM_MESSAGE_KIND_DATA, - STREAM_MESSAGE_KIND_FLUSH, - STREAM_MESSAGE_KIND_UNSPECIFIED, - StreamMessage, - StreamMessageBatch, - StreamMessageKind, + StreamRecord, + StreamRecordBatch, ) - -from .stream_state_pb2 import ( - ConsumerCursor, - ProducerCursor, - StreamLifecycle, - StreamState, - WorkflowStreamCursor, -) - from .request_response_pb2 import ( AddMessagesInput, AddMessagesOutput, @@ -80,6 +67,14 @@ TruncateStreamRequest, TruncateStreamResponse, ) +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamBudget, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) __all__ = [ "AddMessagesInput", @@ -133,14 +128,11 @@ "RegisterStreamConsumerOutput", "RegisterStreamConsumerRequest", "RegisterStreamConsumerResponse", - "STREAM_MESSAGE_KIND_DATA", - "STREAM_MESSAGE_KIND_FLUSH", - "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamBudget", "StreamLifecycle", "StreamListEntry", - "StreamMessage", - "StreamMessageBatch", - "StreamMessageKind", + "StreamRecord", + "StreamRecordBatch", "StreamState", "SubscribeWorkflowInput", "SubscribeWorkflowOutput", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index 3bbd8718e..8876ac29b 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -8,7 +8,6 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper # @@protoc_insertion_point(imports) @@ -18,66 +17,61 @@ from temporalio.api.common.v1 import ( message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ= (3, 10): +if sys.version_info >= (3, 8): import typing as typing_extensions else: import typing_extensions DESCRIPTOR: google.protobuf.descriptor.FileDescriptor -class _StreamMessageKind: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _StreamMessageKindEnumTypeWrapper( - google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ - _StreamMessageKind.ValueType - ], - builtins.type, -): # noqa: F821 - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 - STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 - STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 - """Producer signalling a delivery boundary. Carries no body and consumes an - offset like any other message. A consumer uses it to end a turn without - waiting out an idle timeout. +class StreamRecord(google.protobuf.message.Message): + """The stored shape of temporal.api.stream.v1.StreamRecord plus the offset a + read assigns. Field for field the public record, so one crosses the frontend + in either direction without translation. """ -class StreamMessageKind( - _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper -): ... - -STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 -STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 -STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 -"""Producer signalling a delivery boundary. Carries no body and consumes an -offset like any other message. A consumer uses it to end a turn without -waiting out an idle timeout. -""" -global___StreamMessageKind = StreamMessageKind - -class StreamMessage(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor class MetadataEntry(google.protobuf.message.Message): @@ -82,9 +54,11 @@ class StreamMessage(google.protobuf.message.Message): BODY_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int TOPIC_FIELD_NUMBER: builtins.int - TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int KIND_FIELD_NUMBER: builtins.int OFFSET_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int @property def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... @property @@ -93,18 +67,29 @@ class StreamMessage(google.protobuf.message.Message): ) -> google.protobuf.internal.containers.MessageMap[ builtins.str, temporal.api.common.v1.message_pb2.Payload ]: - """Producer-supplied provenance. The server does not populate this today.""" + """Producer-supplied provenance, stored as sent.""" topic: builtins.str - topic_sequence: builtins.int - """Position within this topic. The global offset orders the whole stream; - this lets a consumer reason about one topic without decoding the rest. + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. Stored + as sent; the global offset is what orders the stream. + """ + kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType + """Settled to DATA on append when left unspecified, so a retry hashes the + same bytes and a reader never sees the zero value. """ - kind: global___StreamMessageKind.ValueType offset: builtins.int """Position in the whole stream, set on read and never stored. A consumer - that resumes at message granularity needs it, and a topic-filtered read + that resumes at record granularity needs it, and a topic-filtered read leaves gaps that make it underivable from the response alone. """ + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did: its publish + command clears the field, whatever the worker sent. + """ + attempt: builtins.int + """The producer's attempt, stored as sent. Readers treat a later attempt by + the same producer as superseding what the earlier one wrote. + """ def __init__( self, *, @@ -114,9 +99,11 @@ class StreamMessage(google.protobuf.message.Message): ] | None = ..., topic: builtins.str = ..., - topic_sequence: builtins.int = ..., - kind: global___StreamMessageKind.ValueType = ..., + sequence: builtins.int = ..., + kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType = ..., offset: builtins.int = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["body", b"body"] @@ -124,6 +111,8 @@ class StreamMessage(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "attempt", + b"attempt", "body", b"body", "kind", @@ -132,37 +121,39 @@ class StreamMessage(google.protobuf.message.Message): b"metadata", "offset", b"offset", + "producer_id", + b"producer_id", + "sequence", + b"sequence", "topic", b"topic", - "topic_sequence", - b"topic_sequence", ], ) -> None: ... -global___StreamMessage = StreamMessage +global___StreamRecord = StreamRecord -class StreamMessageBatch(google.protobuf.message.Message): - """One append is one batch, and one batch is one log node. The server stores +class StreamRecordBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one data node. The server stores this serialized and opaque; it decodes only to trim a partial first page or to apply a topic filter. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - global___StreamMessage + global___StreamRecord ]: ... def __init__( self, *, - messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + records: collections.abc.Iterable[global___StreamRecord] | None = ..., ) -> None: ... def ClearField( - self, field_name: typing_extensions.Literal["messages", b"messages"] + self, field_name: typing_extensions.Literal["records", b"records"] ) -> None: ... -global___StreamMessageBatch = StreamMessageBatch +global___StreamRecordBatch = StreamRecordBatch diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index b813e2dfc..3df3e3c35 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -25,7 +25,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"\x94\x01\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x06 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xc4\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x08 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"p\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x04 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xe0\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x07 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x90\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"T\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... producer_id: builtins.str """Idempotency, all optional. Supply a producer identity and sequence, or an @@ -115,36 +114,32 @@ class AddMessagesInput(google.protobuf.message.Message): by this repo's helper generator. """ use_expected_offset: builtins.bool - owner_epoch: builtins.int def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., run_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., producer_id: builtins.str = ..., sequence: builtins.int = ..., expected_offset: builtins.int = ..., use_expected_offset: builtins.bool = ..., - owner_epoch: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ "expected_offset", b"expected_offset", - "messages", - b"messages", "namespace", b"namespace", - "owner_epoch", - b"owner_epoch", "producer_id", b"producer_id", + "records", + b"records", "run_id", b"run_id", "sequence", @@ -331,7 +326,7 @@ class PollMessagesInput(google.protobuf.message.Message): self, ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: """Filters by exact topic. Offsets are assigned over the unfiltered stream, so - next_offset advances past filtered-out messages too. + next_offset advances past filtered-out records too. """ wait_new_messages: builtins.bool """When set and the reader is caught up, block until something arrives, the @@ -374,33 +369,39 @@ global___PollMessagesInput = PollMessagesInput class PollMessagesOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int NEXT_OFFSET_FIELD_NUMBER: builtins.int HEAD_OFFSET_FIELD_NUMBER: builtins.int CLOSED_FIELD_NUMBER: builtins.int CLOSE_REASON_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... next_offset: builtins.int head_offset: builtins.int closed: builtins.bool @property def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + run_id: builtins.str + """The execution holding the stream. A workflow task slice built from this + read names the run it came from. + """ def __init__( self, *, - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., next_offset: builtins.int = ..., head_offset: builtins.int = ..., closed: builtins.bool = ..., close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + run_id: builtins.str = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] @@ -414,10 +415,12 @@ class PollMessagesOutput(google.protobuf.message.Message): b"closed", "head_offset", b"head_offset", - "messages", - b"messages", "next_offset", b"next_offset", + "records", + b"records", + "run_id", + b"run_id", ], ) -> None: ... @@ -564,7 +567,7 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): WORKFLOW_ID_FIELD_NUMBER: builtins.int OWNER_RUN_ID_FIELD_NUMBER: builtins.int STREAM_NAME_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int PRODUCER_ID_FIELD_NUMBER: builtins.int SEQUENCE_FIELD_NUMBER: builtins.int namespace: builtins.str @@ -577,10 +580,10 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): stream_name: builtins.str """Empty means the workflow's default output stream.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... producer_id: builtins.str """Optional idempotency, as on AddMessagesInput.""" @@ -592,8 +595,8 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): workflow_id: builtins.str = ..., owner_run_id: builtins.str = ..., stream_name: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., producer_id: builtins.str = ..., @@ -602,14 +605,14 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "messages", - b"messages", "namespace", b"namespace", "owner_run_id", b"owner_run_id", "producer_id", b"producer_id", + "records", + b"records", "sequence", b"sequence", "stream_name", @@ -724,18 +727,25 @@ class DeleteStreamInput(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int + FORCE_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str + force: builtins.bool + """Delete even while a workflow consumer is active. Without it the call is + refused, because the consumer's History depends on ranges the deletion + takes with it. + """ def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., + force: builtins.bool = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "namespace", b"namespace", "stream_id", b"stream_id" + "force", b"force", "namespace", b"namespace", "stream_id", b"stream_id" ], ) -> None: ... @@ -1186,11 +1196,16 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + CONSUMER_RUN_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str consumer_workflow_id: builtins.str - """The workflow that will consume, which names the pin.""" + """The workflow that will consume. Together with the run it names the pin, + so a later run of the same workflow id registers fresh rather than + inheriting a closed run's floor. + """ + consumer_run_id: builtins.str start_offset: builtins.int """Negative means from wherever the stream is when the pin is taken. Resolved here, where the frontier is, and returned so the cursor records a fact. @@ -1201,11 +1216,14 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): namespace: builtins.str = ..., stream_id: builtins.str = ..., consumer_workflow_id: builtins.str = ..., + consumer_run_id: builtins.str = ..., start_offset: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ + "consumer_run_id", + b"consumer_run_id", "consumer_workflow_id", b"consumer_workflow_id", "namespace", @@ -1223,33 +1241,22 @@ class RegisterStreamConsumerOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor START_OFFSET_FIELD_NUMBER: builtins.int - COLLECTION_ID_FIELD_NUMBER: builtins.int - BUCKET_SIZE_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int start_offset: builtins.int - collection_id: builtins.str - """What the consumer needs to address the log, all decided by the stream.""" - bucket_size: builtins.int known_head: builtins.int + """The frontier at registration, so the cursor starts with a known head + instead of waiting for the first push. + """ def __init__( self, *, start_offset: builtins.int = ..., - collection_id: builtins.str = ..., - bucket_size: builtins.int = ..., known_head: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "bucket_size", - b"bucket_size", - "collection_id", - b"collection_id", - "known_head", - b"known_head", - "start_offset", - b"start_offset", + "known_head", b"known_head", "start_offset", b"start_offset" ], ) -> None: ... @@ -1305,8 +1312,36 @@ global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput class AdvanceConsumerHeadOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor + CONSUMER_CLOSED_FIELD_NUMBER: builtins.int + SUCCESSOR_RUN_ID_FIELD_NUMBER: builtins.int + SUCCESSOR_START_OFFSET_FIELD_NUMBER: builtins.int + consumer_closed: builtins.bool + """The run that held the pin is closed and no current run of the workflow + consumes the stream, so the stream can release the pin. + """ + successor_run_id: builtins.str + """The run that held the pin is closed but a successor carries the + subscription, so the stream re-keys the pin to it, with the floor the + successor's cursor started from. + """ + successor_start_offset: builtins.int def __init__( self, + *, + consumer_closed: builtins.bool = ..., + successor_run_id: builtins.str = ..., + successor_start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_closed", + b"consumer_closed", + "successor_run_id", + b"successor_run_id", + "successor_start_offset", + b"successor_start_offset", + ], ) -> None: ... global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 2ce5a0451..9f334a50f 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -22,13 +22,14 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xe5\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"}\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\x12\x14\n\x0creplay_floor\x18\x06 \x01(\x03"\xe0\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\x12\x14\n\x0cstart_offset\x18\n \x01(\x03"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ temporal.api.common.v1.message_pb2.Payload: ... - owner_epoch: builtins.int - """Bumped on ownership change so a stale producer's write fails.""" - bucket_size: builtins.int - """Immutable once set. Offsets roll to a new log tree every bucket_size so no - single storage partition grows with the stream. - """ - collection_id: builtins.str - """Identity of the log this stream writes to. Bucket trees are derived from - it, so there is no per-bucket index to store. - """ @property def producers( self, @@ -123,6 +114,21 @@ class StreamState(google.protobuf.message.Message): @property def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: """Wall-clock close time, used to schedule retention deletion.""" + @property + def budget(self) -> global___StreamBudget: + """Set on a stream a workflow owns. Its batches are the owning execution's + mutable state, so appends past the budget are refused rather than left to + the execution size limit, which terminates the workflow. + """ + appended_bytes: builtins.int + """Bytes appended over the stream's life, kept for the budget check. A stream + with a budget never reclaims, so this is also what it holds. + """ + notify_pending: builtins.bool + """A notify task is scheduled and has not run yet. Appends while it is set + schedule none of their own; the task reads the head when it runs, so it + carries every append that landed before it. + """ def __init__( self, *, @@ -130,9 +136,6 @@ class StreamState(google.protobuf.message.Message): base_offset: builtins.int = ..., closed: builtins.bool = ..., close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., - owner_epoch: builtins.int = ..., - bucket_size: builtins.int = ..., - collection_id: builtins.str = ..., producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] | None = ..., consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] @@ -140,10 +143,15 @@ class StreamState(google.protobuf.message.Message): lifecycle: global___StreamLifecycle | None = ..., redirect_run_id: builtins.str = ..., close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + budget: global___StreamBudget | None = ..., + appended_bytes: builtins.int = ..., + notify_pending: builtins.bool = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "budget", + b"budget", "close_reason", b"close_reason", "close_time", @@ -155,26 +163,26 @@ class StreamState(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "appended_bytes", + b"appended_bytes", "base_offset", b"base_offset", - "bucket_size", - b"bucket_size", + "budget", + b"budget", "close_reason", b"close_reason", "close_time", b"close_time", "closed", b"closed", - "collection_id", - b"collection_id", "consumers", b"consumers", "head_offset", b"head_offset", "lifecycle", b"lifecycle", - "owner_epoch", - b"owner_epoch", + "notify_pending", + b"notify_pending", "producers", b"producers", "redirect_run_id", @@ -184,6 +192,32 @@ class StreamState(google.protobuf.message.Message): global___StreamState = StreamState +class StreamBudget(google.protobuf.message.Message): + """Hard bounds on what a stream may hold. Distinct from StreamLifecycle.max_items, + which reclaims the oldest messages: a budget refuses the newest. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAX_ITEMS_FIELD_NUMBER: builtins.int + MAX_BYTES_FIELD_NUMBER: builtins.int + max_items: builtins.int + max_bytes: builtins.int + def __init__( + self, + *, + max_items: builtins.int = ..., + max_bytes: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_bytes", b"max_bytes", "max_items", b"max_items" + ], + ) -> None: ... + +global___StreamBudget = StreamBudget + class ProducerCursor(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -301,8 +335,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int - COLLECTION_ID_FIELD_NUMBER: builtins.int - BUCKET_SIZE_FIELD_NUMBER: builtins.int OFFSET_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int EXTERNAL_FIELD_NUMBER: builtins.int @@ -311,9 +343,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): HAS_PENDING_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int stream_id: builtins.str - collection_id: builtins.str - """Enough to address the log without reading the stream component first.""" - bucket_size: builtins.int offset: builtins.int """Next offset to deliver.""" known_head: builtins.int @@ -342,8 +371,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): self, *, stream_id: builtins.str = ..., - collection_id: builtins.str = ..., - bucket_size: builtins.int = ..., offset: builtins.int = ..., known_head: builtins.int = ..., external: builtins.bool = ..., @@ -355,10 +382,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "bucket_size", - b"bucket_size", - "collection_id", - b"collection_id", "external", b"external", "has_pending", @@ -389,7 +412,7 @@ class StreamLifecycle(google.protobuf.message.Message): def retention(self) -> google.protobuf.duration_pb2.Duration: """How long a closed stream stays readable before it is deleted.""" max_items: builtins.int - """Cap on readable messages. Older whole buckets are reclaimed once the floor + """Cap on readable messages. Whole batches are reclaimed once the floor passes them, so a capped stream has bounded storage. """ def __init__( From be2be23a1370375d40292f9e06f5aaf11f685684 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 289/831] Moved the workflow stream runtime to records and batched a task's publishes. The delivered job and the publish command carry StreamRecord protos, and a task's publishes on one stream are held until the task completes so they become one command and one History event. --- temporalio/worker/_workflow_instance.py | 197 +++++++++++++--------- temporalio/workflow/__init__.py | 14 +- temporalio/workflow/_context.py | 105 +++++------- tests/worker/test_workflow_stream.py | 209 +++++++++++++++++------- 4 files changed, 319 insertions(+), 206 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 0a17d2b22..9b1e1ea0b 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -273,14 +273,45 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Match the server's per-batch limits. Rejecting here turns a wedged workflow, -# which would replay and re-issue the same rejected command forever, into an -# error the workflow author can see. -_MAX_STREAM_MESSAGES_PER_BATCH = 1000 -_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +# Match the server's per-batch limits. A record over its limit is refused where +# it is published, because a rejected command would be reissued on every +# replay; a task's records are split into commands that fit the batch limits. +_MAX_STREAM_RECORDS_PER_BATCH = 1000 +_MAX_STREAM_RECORD_BYTES = 1 << 20 _MAX_STREAM_BATCH_BYTES = 2 << 20 +def _stream_batches( + records: Sequence[temporalio.api.stream.v1.StreamRecord], +) -> Iterator[list[temporalio.api.stream.v1.StreamRecord]]: + """Split one task's records for a stream into batches the server accepts.""" + batch: list[temporalio.api.stream.v1.StreamRecord] = [] + size = 0 + for record in records: + record_size = record.ByteSize() + if batch and ( + len(batch) >= _MAX_STREAM_RECORDS_PER_BATCH + or size + record_size > _MAX_STREAM_BATCH_BYTES + ): + yield batch + batch, size = [], 0 + batch.append(record) + size += record_size + if batch: + yield batch + + +def _is_completion_command( + command: temporalio.bridge.proto.workflow_commands.WorkflowCommand, +) -> bool: + return ( + command.HasField("complete_workflow_execution") + or command.HasField("continue_as_new_workflow_execution") + or command.HasField("fail_workflow_execution") + or command.HasField("cancel_workflow_execution") + ) + + class _StreamBuffer: """Holds the stream ranges delivered to a workflow so far. @@ -292,7 +323,7 @@ class _StreamBuffer: def __init__(self, stream_id: str = "") -> None: self._stream_id = stream_id - self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._records: list[temporalio.workflow.DeliveredStreamRecord] = [] self._waiters: list[asyncio.Future] = [] # Where the next range has to start. Unknown until the first one # arrives, because a subscription may start wherever the stream is and @@ -301,19 +332,19 @@ def __init__(self, stream_id: str = "") -> None: def extend( self, - messages: Sequence[temporalio.api.stream.v1.StreamMessage], + records: Sequence[temporalio.api.stream.v1.StreamRecord], from_offset: int = 0, to_offset: int | None = None, ) -> None: if to_offset is None: - to_offset = from_offset + len(messages) + to_offset = from_offset + len(records) # A range is recorded as consumed once and never resent, so one that # repeats, skips or mis-sizes would hand the workflow duplicate or - # shifted bodies with nothing to say so. Failing the task is what makes - # the fault visible. - if to_offset - from_offset != len(messages): + # shifted records with nothing to say so. Failing the task is what + # makes the fault visible. + if to_offset - from_offset != len(records): raise RuntimeError( - f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"stream {self._stream_id!r} delivered {len(records)} records " f"for offsets [{from_offset}, {to_offset})" ) if self._next_offset is not None and from_offset != self._next_offset: @@ -324,34 +355,35 @@ def extend( self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. - if not messages: + if not records: return # Offsets are dense inside a delivered range and the range arrives in # order, so counting from its start is the position rather than an - # estimate of it. The per-message field is not on the activation, and a + # estimate of it. The per-record field is not on the activation, and a # reader that has to resume elsewhere needs a position it can name. - self._messages.extend( - temporalio.workflow.DeliveredStreamMessage( - body=message.body.data, - topic=message.topic, - offset=from_offset + index, + for index, record in enumerate(records): + # Copied so the buffer outlives the activation that carried it. + kept = temporalio.api.stream.v1.StreamRecord() + kept.CopyFrom(record) + self._records.append( + temporalio.workflow.DeliveredStreamRecord( + record=kept, offset=from_offset + index + ) ) - for index, message in enumerate(messages) - ) waiters, self._waiters = self._waiters, [] for waiter in waiters: if not waiter.done(): waiter.set_result(None) - def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: - taken, self._messages = self._messages, [] + def take(self) -> list[temporalio.workflow.DeliveredStreamRecord]: + taken, self._records = self._records, [] return taken def put_back( - self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + self, records: Sequence[temporalio.workflow.DeliveredStreamRecord] ) -> None: """Return an unread tail to the front of the buffer.""" - self._messages[:0] = messages + self._records[:0] = records def wait_future(self) -> asyncio.Future: loop = asyncio.get_event_loop() @@ -360,7 +392,7 @@ def wait_future(self) -> asyncio.Future: return fut def __len__(self) -> int: - return len(self._messages) + return len(self._records) class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] @@ -496,6 +528,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: # arrive whether or not anything is reading yet, because the server has # already recorded them as consumed and will not send them again. self._stream_buffers: dict[str, _StreamBuffer] = {} + # Records this task's publishes append, by stream, until the task + # completes and they become commands. + self._stream_appends: dict[ + str, list[temporalio.api.stream.v1.StreamRecord] + ] = {} # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down @@ -557,6 +594,9 @@ def activate( temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion() ) self._current_completion.successful.SetInParent() + # A failed task's publishes never became commands, so nothing carries + # over into this one. + self._stream_appends = {} self._current_activation_error: Exception | None = None self._deployment_version_for_current_task = ( @@ -648,6 +688,9 @@ def activate( ) activation_err = None + if activation_err is None and not self._deleting: + self._flush_stream_appends() + # Apply versioning behavior if one was established if self._versioning_behavior: self._current_completion.successful.versioning_behavior = ( @@ -712,8 +755,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) - elif job.HasField("deliver_stream_messages"): - self._apply_deliver_stream_messages(job.deliver_stream_messages) + elif job.HasField("deliver_stream_records"): + self._apply_deliver_stream_records(job.deliver_stream_records) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1239,9 +1282,9 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) - def _apply_deliver_stream_messages( + def _apply_deliver_stream_records( self, - job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamRecords, ) -> None: buffer = self._stream_buffers.get(job.stream_id) if buffer is None: @@ -1250,7 +1293,7 @@ def _apply_deliver_stream_messages( # subscription made later in the same task still sees it. buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset, job.to_offset) + buffer.extend(job.records, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1425,51 +1468,53 @@ def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset - def workflow_add_stream_messages( - self, stream_id: str, messages: Sequence[bytes], topic: str + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: - if not messages: - raise ValueError("add_stream_messages needs at least one message") - if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: - raise ValueError( - f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " - f"got {len(messages)}" - ) - total = 0 - for body in messages: - if len(body) > _MAX_STREAM_MESSAGE_BYTES: + self._assert_not_read_only("append stream records") + if not records: + raise ValueError("append_stream_records needs at least one record") + kept: list[temporalio.api.stream.v1.StreamRecord] = [] + for record in records: + if record.ByteSize() > _MAX_STREAM_RECORD_BYTES: raise ValueError( - f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " - f"bytes, got {len(body)}" + f"a stream record is limited to {_MAX_STREAM_RECORD_BYTES} " + f"bytes, got {record.ByteSize()}" ) - total += len(body) - if total > _MAX_STREAM_BATCH_BYTES: - raise ValueError( - f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" - ) - command = self._add_command() - command.add_stream_messages.stream_id = stream_id - for body in messages: - # The bodies ride the command and never enter History, so the event - # this produces stays the same size whatever is published here. - message = command.add_stream_messages.messages.add() - message.body.data = body - # Every other Temporal payload names its encoding, and the UI, the - # CLI and any codec server rely on that to decode what they read. - message.body.metadata["encoding"] = b"binary/plain" - message.topic = topic - - async def workflow_read_stream( - self, stream_id: str, max_messages: int - ) -> list[bytes]: - return [ - m.body - for m in await self.workflow_read_stream_messages(stream_id, max_messages) - ] - - async def workflow_read_stream_messages( - self, stream_id: str, max_messages: int - ) -> list[temporalio.workflow.DeliveredStreamMessage]: + copy = temporalio.api.stream.v1.StreamRecord() + copy.CopyFrom(record) + # The workflow is the producer here, whatever the caller set. + copy.producer_id = "" + kept.append(copy) + # Held until the task completes, so a task's publishes on one stream + # become one command and one History event however many there were. + self._stream_appends.setdefault(stream_id, []).extend(kept) + + def _flush_stream_appends(self) -> None: + appends, self._stream_appends = self._stream_appends, {} + if not appends: + return + commands = self._current_completion.successful.commands + # Ahead of any command that ends the run, because the server accepts + # nothing after one of those. + insert_at = len(commands) + for index, command in enumerate(commands): + if _is_completion_command(command): + insert_at = index + break + for stream_id, records in appends.items(): + for batch in _stream_batches(records): + command = temporalio.bridge.proto.workflow_commands.WorkflowCommand() + command.append_stream_records.stream_id = stream_id + command.append_stream_records.records.extend(batch) + commands.insert(insert_at, command) + insert_at += 1 + + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[temporalio.workflow.DeliveredStreamRecord]: # Ranges arrive on Workflow Tasks, and a query activation carries none, # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. @@ -1478,10 +1523,10 @@ async def workflow_read_stream_messages( while not len(buffer): await buffer.wait_future() taken = buffer.take() - if max_messages and len(taken) > max_messages: + if max_records and len(taken) > max_records: # Put the tail back rather than dropping it: nothing will resend it. - buffer.put_back(taken[max_messages:]) - taken = taken[:max_messages] + buffer.put_back(taken[max_records:]) + taken = taken[:max_records] return taken def workflow_get_current_history_length(self) -> int: diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 8d57b75e7..18d04cb0c 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,7 +58,7 @@ wait, ) from ._context import ( - DeliveredStreamMessage, + DeliveredStreamRecord, Info, ParentInfo, RootInfo, @@ -66,7 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, - add_stream_messages, + append_stream_records, cancellation_reason, current_update_info, deprecate_patch, @@ -88,8 +88,7 @@ payload_converter, random, random_seed, - read_stream, - read_stream_messages, + read_stream_records, register_random_seed_callback, set_current_details, sleep, @@ -238,10 +237,9 @@ "upsert_search_attributes", "uuid4", "uuid7", - "DeliveredStreamMessage", - "read_stream", - "read_stream_messages", - "add_stream_messages", + "DeliveredStreamRecord", + "read_stream_records", + "append_stream_records", "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 57183aafb..8b6c07782 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -14,6 +14,7 @@ from nexusrpc import InputT, OutputT import temporalio.api.common.v1 +import temporalio.api.stream.v1 import temporalio.common import temporalio.converter @@ -317,19 +318,16 @@ def workflow_get_current_deployment_version( def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... @abstractmethod - def workflow_add_stream_messages( - self, stream_id: str, messages: Sequence[bytes], topic: str + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: ... @abstractmethod - async def workflow_read_stream( - self, stream_id: str, max_messages: int - ) -> list[bytes]: ... - - @abstractmethod - async def workflow_read_stream_messages( - self, stream_id: str, max_messages: int - ) -> list[DeliveredStreamMessage]: ... + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[DeliveredStreamRecord]: ... @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -968,10 +966,10 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: - """Subscribe this workflow to a stream. + """Subscribe this workflow to a server-side stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: a second + and :func:`read_stream_records` returns them. Safe to call again: a second subscription to a stream this run already consumes does not move its cursor, though it does write one event. Calling it on every replay is harmless because replay matches the command to the event already recorded. @@ -979,10 +977,12 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up without doing I/O and a value it carried would be a reading rather than a - fact. + fact. A name this workflow has not written yet names a stream it owns, and + subscribing creates it. Args: - stream_id: Stream to consume. + stream_id: Stream to consume: the name of one this workflow owns, or + the id of a standalone stream. start_offset: Where to start. Negative means from wherever the stream is when the subscription is registered; the server resolves that once and records it, so replay does not resolve it again. @@ -990,83 +990,60 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) -def add_stream_messages( - messages: Sequence[bytes], +def append_stream_records( + records: Sequence[temporalio.api.stream.v1.StreamRecord], *, stream_id: str = "", - topic: str = "", ) -> None: - """Publish a batch of messages to a stream this workflow owns. + """Publish records to a server-side stream this workflow owns. - Returns as soon as the command is issued. The bodies go to the stream's own - log rather than into History, which gets one fixed-size event naming the - offset range, so a batch of a thousand costs History the same as a batch of + Returns at once. The records become one command when this Workflow Task + completes, so they are visible when the task is accepted and never if it + fails. Their bodies go to the stream's own log rather than into History, + which gets one fixed-size event naming the offset range, so a task that + publishes a thousand records costs History the same as one that publishes one. Readers do not have to exist yet, and adding one costs the writer nothing. - Batch where you can. The event is per call, and a workflow is bounded by the - history event count, so one call with a hundred messages leaves far more - room than a hundred calls with one. - Args: - messages: Bodies to append, in order. + records: Records to append, in order. The server stores each with an + empty ``producer_id``, because the workflow is the producer. stream_id: Stream to publish to. Empty means the workflow's default output stream. - topic: Optional topic, which readers can filter on. Offsets are still - assigned over the unfiltered stream. + + Raises: + ValueError: ``records`` is empty or one of them is over the server's + per-record size limit. """ - _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + _Runtime.current().workflow_append_stream_records(stream_id, records) @dataclass(frozen=True) -class DeliveredStreamMessage: - """One message a consuming workflow was given, with where it sat.""" +class DeliveredStreamRecord: + """One record a consuming workflow was given, with where it sat.""" - body: bytes - topic: str + record: temporalio.api.stream.v1.StreamRecord offset: int """Its position in the whole stream, which is what a reader resumes from.""" -async def read_stream_messages( - stream_id: str, *, max_messages: int = 0 -) -> list[DeliveredStreamMessage]: - """Read the next messages, keeping their topic and position. - - Same delivery as :func:`read_stream`. A reader that has to name where it - got to, filter a topic, or hand a position to something outside the - workflow needs more than the bodies. - - Args: - stream_id: Stream to read from. - max_messages: Most messages to return at once, or 0 for everything - available. - """ - return await _Runtime.current().workflow_read_stream_messages( - stream_id, max_messages - ) - +async def read_stream_records( + stream_id: str, *, max_records: int = 0 +) -> list[DeliveredStreamRecord]: + """Read the next records of a server-side stream this workflow consumes. -async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: - """Read the next messages of a stream this workflow consumes. - - Waits until at least one message is available. Ranges arrive on Workflow + Waits until at least one record is available. Ranges arrive on Workflow Tasks, and only the offsets they covered are written to History, so this is deterministic on replay: the server re-supplies the same ranges by reading - the stream again. - - Subscribe out of band with the stream client. This only reads what has - already been delivered to this workflow. + the stream again. Subscribe first with :func:`subscribe_stream`; this only + reads what has already been delivered to this workflow. Args: stream_id: Stream to read from. - max_messages: Most messages to return at once, or 0 for everything + max_records: Most records to return at once, or 0 for everything available. - - Returns: - The message bodies, in stream order. """ - return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + return await _Runtime.current().workflow_read_stream_records(stream_id, max_records) async def wait_condition( diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 93b596b8c..9083e74a9 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -1,9 +1,10 @@ -"""In-workflow consumption of a server-side stream. +"""In-workflow consumption and publication of a server-side stream. Ranges arrive on Workflow Tasks and only the offsets they covered are written to History, so replay is served by the server reading the stream again. These tests -drive the buffering and the workflow-facing read directly, which is the part -this SDK owns; the delivery decision itself lives in the server and sdk-core. +drive the buffering, the workflow-facing read and the per-task publish directly, +which is the part this SDK owns; the delivery decision itself lives in the +server and sdk-core. """ from __future__ import annotations @@ -18,22 +19,29 @@ from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( _MAX_STREAM_BATCH_BYTES, - _MAX_STREAM_MESSAGE_BYTES, + _MAX_STREAM_RECORD_BYTES, + _MAX_STREAM_RECORDS_PER_BATCH, _StreamBuffer, _WorkflowInstanceImpl, ) from temporalio.workflow import ReadOnlyContextError -def message(body: bytes) -> api_stream.StreamMessage: - return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) +def record(body: bytes, topic: str = "") -> api_stream.StreamRecord: + return api_stream.StreamRecord( + body=temporalio.api.common.v1.Payload(data=body), topic=topic + ) + + +def bodies(delivered: list[Any]) -> list[bytes]: + return [item.record.body.data for item in delivered] async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() - buffer.extend([message(b"one"), message(b"two")]) + buffer.extend([record(b"one"), record(b"two")]) - assert [m.body for m in buffer.take()] == [b"one", b"two"] + assert bodies(buffer.take()) == [b"one", b"two"] assert len(buffer) == 0 @@ -44,9 +52,9 @@ async def test_buffer_wakes_a_waiting_reader() -> None: waiter = buffer.wait_future() assert not waiter.done() - buffer.extend([message(b"late")]) + buffer.extend([record(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body for m in buffer.take()] == [b"late"] + assert bodies(buffer.take()) == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -63,24 +71,24 @@ async def test_empty_range_does_not_wake_a_reader() -> None: async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: buffer = _StreamBuffer() - buffer.extend([message(b"early")]) + buffer.extend([record(b"early")]) # No waiting: the data is already there. assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body for m in buffer.take()] == [b"early"] + assert bodies(buffer.take()) == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream_messages``, so a test that + The cap lives inside ``workflow_read_stream_records``, so a test that reimplements it proves nothing about the code that ships. Borrowing the method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages + workflow_read_stream_records = _WorkflowInstanceImpl.workflow_read_stream_records def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} @@ -90,31 +98,33 @@ def _assert_not_read_only(self, action: str) -> None: if self._read_only: raise ReadOnlyContextError(f"cannot {action} in a read-only context") - async def read(self, stream: str, max_messages: int) -> list[bytes]: + async def read(self, stream: str, max_records: int) -> list[bytes]: instance: Any = self - return await _WorkflowInstanceImpl.workflow_read_stream( - instance, stream, max_messages + return bodies( + await _WorkflowInstanceImpl.workflow_read_stream_records( + instance, stream, max_records + ) ) -@pytest.mark.parametrize("max_messages", [1, 2, 5]) -async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: +@pytest.mark.parametrize("max_records", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_records: int) -> None: stub = _ReadOnlyStub() - bodies = [b"a", b"b", b"c"] + expected = [b"a", b"b", b"c"] stub._stream_buffers["s"] = _StreamBuffer() - stub._stream_buffers["s"].extend([message(b) for b in bodies]) + stub._stream_buffers["s"].extend([record(b) for b in expected]) - got = await stub.read("s", max_messages) + got = await stub.read("s", max_records) - assert got == bodies[:max_messages] + assert got == expected[:max_records] # Whatever the cap left behind has to still be there: nothing resends it. - assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + assert len(stub._stream_buffers["s"]) == max(0, len(expected) - max_records) if len(stub._stream_buffers["s"]): rest = await stub.read("s", 0) - assert got + rest == bodies + assert got + rest == expected else: - assert got == bodies + assert got == expected # A query activation carries no ranges, so a read there would wait on a future @@ -122,7 +132,7 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> async def test_read_is_refused_in_a_read_only_context() -> None: stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() - stub._stream_buffers["s"].extend([message(b"a")]) + stub._stream_buffers["s"].extend([record(b"a")]) with pytest.raises(ReadOnlyContextError, match="read stream"): await stub.read("s", 0) @@ -135,61 +145,144 @@ async def test_read_is_refused_in_a_read_only_context() -> None: # only place a repeated, skipped or mis-sized delivery can still be noticed. async def test_ranges_have_to_abut_the_last_one() -> None: buffer = _StreamBuffer("s") - buffer.extend([message(b"a"), message(b"b")], 0, 2) + buffer.extend([record(b"a"), record(b"b")], 0, 2) # An empty range moves the expectation too: the server recorded it. buffer.extend([], 2, 2) - buffer.extend([message(b"c")], 2, 3) - assert [m.offset for m in buffer.take()] == [0, 1, 2] + buffer.extend([record(b"c")], 2, 3) + assert [item.offset for item in buffer.take()] == [0, 1, 2] with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): - buffer.extend([message(b"c")], 2, 3) + buffer.extend([record(b"c")], 2, 3) with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): - buffer.extend([message(b"f")], 5, 6) + buffer.extend([record(b"f")], 5, 6) -async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: +async def test_a_range_has_to_carry_as_many_records_as_it_spans() -> None: buffer = _StreamBuffer("s") - with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): - buffer.extend([message(b"a"), message(b"b")], 0, 1) + with pytest.raises(RuntimeError, match=r"2 records for offsets \[0, 1\)"): + buffer.extend([record(b"a"), record(b"b")], 0, 1) assert len(buffer) == 0 +class _Completion: + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + +class _Successful: + def __init__(self) -> None: + self.successful = _Completion() + + class _CommandStub: - """Drives the real publish path and keeps the commands it issued.""" + """Drives the real publish path and keeps the commands it issued. + + The completion's command list is a plain list here, which supports the + same ``insert`` the protobuf container does. + """ - workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + workflow_append_stream_records = ( + _WorkflowInstanceImpl.workflow_append_stream_records + ) + _flush_stream_appends = _WorkflowInstanceImpl._flush_stream_appends def __init__(self) -> None: - self.commands: list[WorkflowCommand] = [] + self._stream_appends: dict[str, list[api_stream.StreamRecord]] = {} + self._current_completion = _Successful() + + def _assert_not_read_only(self, _action: str) -> None: + pass + + @property + def commands(self) -> list[WorkflowCommand]: + return self._current_completion.successful.commands - def _add_command(self) -> WorkflowCommand: - command = WorkflowCommand() - self.commands.append(command) - return command + def publish(self, *records: api_stream.StreamRecord, stream_id: str = "") -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_append_stream_records( + instance, stream_id, list(records) + ) - def publish(self, *bodies: bytes) -> None: + def flush(self) -> None: instance: Any = self - _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + _WorkflowInstanceImpl._flush_stream_appends(instance) -# The server refuses an oversized publish, and a refused command is reissued -# on every replay, so the limits have to be applied before the command exists. -def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: +# A task's publishes on one stream become one command, whatever their number, +# because the event the command produces is what bounds a workflow's History. +def test_a_tasks_publishes_on_one_stream_become_one_command() -> None: stub = _CommandStub() - stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) - assert len(stub.commands) == 1 + stub.publish(record(b"a"), record(b"b")) + stub.publish(record(b"c")) + stub.publish(record(b"d"), stream_id="other") + assert stub.commands == [] + + stub.flush() + + by_stream = { + command.append_stream_records.stream_id: [ + r.body.data for r in command.append_stream_records.records + ] + for command in stub.commands + } + assert by_stream == {"": [b"a", b"b", b"c"], "other": [b"d"]} + # Flushed once: a second flush has nothing left to say. + stub.flush() + assert len(stub.commands) == 2 + + +# The workflow is the producer of what it publishes, whatever the caller set. +def test_the_workflows_records_carry_no_producer() -> None: + stub = _CommandStub() + stub.publish(api_stream.StreamRecord(producer_id="someone", attempt=3)) + stub.flush() + assert stub.commands[0].append_stream_records.records[0].producer_id == "" - with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): - stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) - assert len(stub.commands) == 1 +# The server accepts nothing after a command that ends the run, so the +# publishes have to go ahead of it. +def test_publishes_are_flushed_ahead_of_the_completion_command() -> None: + stub = _CommandStub() + stub.publish(record(b"a")) + done = WorkflowCommand() + done.complete_workflow_execution.SetInParent() + stub.commands.append(done) + + stub.flush() -def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + assert [c.WhichOneof("variant") for c in stub.commands] == [ + "append_stream_records", + "complete_workflow_execution", + ] + + +# The server refuses an oversized record, and a refused command is reissued on +# every replay, so the limit has to be applied before the record is buffered. +def test_a_record_over_the_server_limit_is_refused_before_the_command() -> None: stub = _CommandStub() - half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) - stub.publish(half, half) + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16))) + with pytest.raises(ValueError, match=f"{_MAX_STREAM_RECORD_BYTES} bytes"): + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES + 1))) + stub.flush() assert len(stub.commands) == 1 - with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): - stub.publish(half, half, b"x") - assert len(stub.commands) == 1 + +# A task that publishes more than one batch holds is split into commands the +# server accepts, by count and by bytes, rather than refused. +def test_a_task_over_the_batch_limits_is_split_into_commands() -> None: + stub = _CommandStub() + stub.publish(*(record(b"x") for _ in range(_MAX_STREAM_RECORDS_PER_BATCH + 1))) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [ + _MAX_STREAM_RECORDS_PER_BATCH, + 1, + ] + + stub = _CommandStub() + # Two records that fit one batch together, then one whose framing alone + # overflows the room they leave. + big = record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16)) + room = _MAX_STREAM_BATCH_BYTES - 2 * big.ByteSize() + stub.publish(big, big, record(b"y" * room)) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [2, 1] From 846b291d1b03a269049e338c788c19977595fabf Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 290/831] Moved the stream client and the contrib surface to records and SDK errors. Every stub call translates the transport's failure into StreamNotFoundError or RPCError, and the client's payload codec is applied to bodies so the two sides of a namespace with a codec agree. --- temporalio/client_stream.py | 347 ++++++++++-------- temporalio/contrib/server_streams/__init__.py | 150 ++++---- tests/contrib/test_server_streams.py | 7 +- tests/test_client_stream.py | 121 ++++-- 4 files changed, 360 insertions(+), 265 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 15760a980..b482941af 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -3,7 +3,8 @@ A stream is a durable, offset-addressed append-only sequence that lives beside Workflow History rather than inside it. Appending schedules no Workflow Task, and each reader holds its own cursor, so adding a reader costs nothing on the -write side. +write side. The record is ``temporal.api.stream.v1.StreamRecord`` on the wire +and in the store, so a reader in any language decodes the same bytes. Prototype support for AI-198. Four things about it are temporary and will change before this is a real feature: @@ -15,37 +16,47 @@ coming from the api submodule, because the service is still defined in the server. That is why the wire names read as server-internal. - **This client is for use outside a Workflow.** Workflow code publishes and - consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` - instead. + consumes with ``workflow.append_stream_records`` and + ``workflow.read_stream_records`` instead. - **No TLS or API-key support**, for the same reason: the channel is built here rather than by the machinery that normally handles that. + +A failed call raises :class:`temporalio.streams.StreamNotFoundError` when the +server answers ``NOT_FOUND`` and :class:`temporalio.service.RPCError` +otherwise, never the transport's own exception type. """ from __future__ import annotations import asyncio import weakref -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass -from typing import Any +from typing import Any, TypeVar import google.protobuf.duration_pb2 +import grpc +import grpc.aio -import temporalio.api.common.v1 import temporalio.api.streamservice.v1 as stream +from temporalio.api.stream.v1 import StreamRecord from temporalio.api.streamservice.v1 import service_pb2_grpc +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import StreamNotFoundError __all__ = [ "Appended", - "Message", "Page", "StreamClient", + "StreamEntry", "StreamHandle", "WorkflowStreamHandle", "close_shared_clients", "shared_client", ] +_T = TypeVar("_T") + @dataclass(frozen=True) class Appended: @@ -62,23 +73,16 @@ class Appended: @dataclass(frozen=True) -class Message: - """One item read from a stream. +class StreamEntry: + """One record read from a stream, with where it sits. Offsets are assigned over the unfiltered stream, so a topic-filtered read - hands back messages whose offsets are not contiguous. To resume at the - boundary of a whole read, checkpoint the ``next_offset`` that - :meth:`StreamHandle.read` returns instead. + hands back entries whose offsets are not contiguous. A reader that resumes + between records takes ``offset`` rather than counting what it received. """ - data: bytes - topic: str = "" + record: StreamRecord offset: int = 0 - """Where this message sits in the whole stream. - - A topic filter leaves gaps, so a reader that resumes between messages has - to take this rather than count what it received. - """ @dataclass(frozen=True) @@ -86,13 +90,73 @@ class Page: """One read of a stream. ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can - be added and this reader has everything. + be added and this reader has everything. ``run_id`` names the execution + holding the stream, which is how a reader of a workflow's stream learns + which run it is on when it did not pin one. """ - messages: list[Message] + entries: list[StreamEntry] next_offset: int head_offset: int closed: bool + run_id: str = "" + + +def _to_service(record: StreamRecord) -> stream.StreamRecord: + # Field for field the public record; the stored shape only adds the offset + # a read assigns. An unset body stays unset so a FINISH record reads back + # as one. + out = stream.StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return out + + +def _to_public(record: stream.StreamRecord) -> StreamEntry: + out = StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return StreamEntry(record=out, offset=record.offset) + + +def _translate(error: grpc.aio.AioRpcError) -> Exception: + code = error.code() + details = error.details() or code.name + if code is grpc.StatusCode.NOT_FOUND: + return StreamNotFoundError(details) + raw = b"" + # The aio metadata iterates as (key, value) pairs at runtime, whatever + # shape the stubs give its items. + trailing: Any = error.trailing_metadata() + for item in trailing or (): + key, value = item[0], item[1] + if key == "grpc-status-details-bin" and isinstance(value, bytes): + raw = value + return RPCError(details, RPCStatusCode(code.value[0]), raw) + + +async def _call(method: Callable[[Any], Awaitable[_T]], request: Any) -> _T: + """Make one stub call, translating the transport's failure to the SDK's.""" + try: + return await method(request) + except grpc.aio.AioRpcError as error: + raise _translate(error) from error class StreamClient: @@ -107,19 +171,12 @@ def __init__(self, channel: Any, namespace: str) -> None: self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod - def connect(target_host: str, namespace: str = "default") -> "StreamClient": + def connect(target_host: str, namespace: str = "default") -> StreamClient: """Open a channel to a frontend. Separate from ``Client.connect`` because this does not share the connection the rest of the SDK uses. """ - try: - import grpc - except ImportError as err: - raise RuntimeError( - "temporalio.client_stream requires the grpc extra: " - "pip install 'temporalio[grpc]'" - ) from err return StreamClient(grpc.aio.insecure_channel(target_host), namespace) async def close(self) -> None: @@ -132,11 +189,11 @@ async def create( *, retention: float | None = None, max_items: int | None = None, - ) -> "StreamHandle": + ) -> StreamHandle: """Create a stream and return a handle to it. ``retention`` is how long a closed stream stays readable, in seconds. - ``max_items`` caps how many messages remain readable, dropping the + ``max_items`` caps how many records remain readable, dropping the oldest, which bounds storage for a stream nobody truncates. """ lifecycle = stream.StreamLifecycle() @@ -147,14 +204,15 @@ async def create( if max_items is not None: lifecycle.max_items = max_items - response = await self._stub.CreateStream( + response = await _call( + self._stub.CreateStream, stream.CreateStreamRequest( frontend_request=stream.CreateStreamInput( namespace=self._namespace, stream_id=stream_id, lifecycle=lifecycle, ) - ) + ), ) return StreamHandle( self._stub, @@ -163,24 +221,25 @@ async def create( run_id=response.frontend_response.run_id, ) - def get(self, stream_id: str) -> "StreamHandle": + def get(self, stream_id: str) -> StreamHandle: """Open an existing stream without a round trip.""" return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( self, workflow_id: str, name: str = "", *, owner_run_id: str = "" - ) -> "WorkflowStreamHandle": - """Open a stream a workflow publishes to. + ) -> WorkflowStreamHandle: + """Open a stream a workflow owns. A stream a workflow owns lives inside that workflow's execution and has no id of its own, so it is named by its owner and its name. An empty name is the workflow's default output stream, which is what - ``workflow.add_stream_messages`` writes to when it is given none. + ``workflow.append_stream_records`` writes to when it is given none. - The stream is created by the workflow's first publish. Reading one that - does not exist yet is not an error: it reads as empty and a - :meth:`WorkflowStreamHandle.follow` parked on it wakes when the - workflow publishes. + The stream is created by the workflow's first publish or subscription, + or by the first append from outside. Reading one that does not exist + yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when something + is written. ``owner_run_id`` pins the handle to one run of the workflow; see :meth:`WorkflowStreamHandle.pin` for why a follower wants that. @@ -191,7 +250,7 @@ def workflow_stream( class StreamHandle: - """A handle to one stream.""" + """A handle to one standalone stream.""" def __init__( self, stub: Any, namespace: str, stream_id: str, run_id: str = "" @@ -211,12 +270,11 @@ def id(self) -> str: async def append( self, - *messages: bytes, - topic: str = "", + *records: StreamRecord, producer_id: str = "", sequence: int = 0, ) -> Appended: - """Append messages and return where they landed. + """Append records and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than @@ -224,26 +282,18 @@ async def append( at-least-once, which is only the right trade when duplicates are harmless. """ - response = await self._stub.AddMessages( + response = await _call( + self._stub.AddMessages, stream.AddMessagesRequest( frontend_request=stream.AddMessagesInput( namespace=self._namespace, stream_id=self._id, run_id=self._run_id, - messages=[ - stream.StreamMessage( - body=temporalio.api.common.v1.Payload( - data=m, metadata={"encoding": b"binary/plain"} - ), - topic=topic, - kind=stream.STREAM_MESSAGE_KIND_DATA, - ) - for m in messages - ], + records=[_to_service(record) for record in records], producer_id=producer_id, sequence=sequence, ) - ) + ), ) return _appended(response.frontend_response) @@ -251,43 +301,29 @@ async def read( self, *, from_offset: int = 0, - max_messages: int = 0, + max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, - ) -> tuple[list[Message], int]: - """Read once from ``from_offset``, returning the messages and the + ) -> tuple[list[StreamEntry], int]: + """Read once from ``from_offset``, returning the entries and the offset to read from next. With ``wait`` set, blocks until something arrives, the stream closes, or the server's long-poll window elapses. A window that elapses returns an empty list rather than raising, so the caller just reads again. """ - response = await self._stub.PollMessages( - stream.PollMessagesRequest( - frontend_request=stream.PollMessagesInput( - namespace=self._namespace, - stream_id=self._id, - run_id=self._run_id, - from_offset=from_offset, - max_messages=max_messages, - topics=list(topics), - wait_new_messages=wait, - ) - ) + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait ) - out = response.frontend_response - return [ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], (out.next_offset) + return page.entries, page.next_offset async def follow( self, *, from_offset: int = 0, topics: Sequence[str] = (), - ) -> AsyncIterator[Message]: - """Yield messages as they arrive, starting at ``from_offset``. + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, starting at ``from_offset``. Ends once the stream is closed and this reader has drained it. A closed stream stays readable until its retention expires, so a reader that @@ -296,61 +332,77 @@ async def follow( """ offset = from_offset while True: - response = await self._stub.PollMessages( - stream.PollMessagesRequest( - frontend_request=stream.PollMessagesInput( - namespace=self._namespace, - stream_id=self._id, - run_id=self._run_id, - from_offset=offset, - topics=list(topics), - wait_new_messages=True, - ) - ) - ) - out = response.frontend_response - for msg in out.messages: - yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) - offset = out.next_offset - if out.closed and offset >= out.head_offset: + page = await self.poll(from_offset=offset, topics=topics) + for entry in page.entries: + yield entry + offset = page.next_offset + if page.closed and offset >= page.head_offset: return + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_records: int = 0, + wait: bool = True, + ) -> Page: + """One read, with everything the caller needs to decide what to do next.""" + response = await _call( + self._stub.PollMessages, + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_records, + topics=list(topics), + wait_new_messages=wait, + ) + ), + ) + return _page(response.frontend_response) + async def finish_writing(self, producer_id: str) -> None: """Declare one producer done without ending the stream for others.""" - await self._stub.FinishWriting( + await _call( + self._stub.FinishWriting, stream.FinishWritingRequest( frontend_request=stream.FinishWritingInput( namespace=self._namespace, stream_id=self._id, producer_id=producer_id, ) - ) + ), ) async def close(self) -> None: """Seal the stream. Readers can still drain what is already there.""" - await self._stub.CloseStream( + await _call( + self._stub.CloseStream, stream.CloseStreamRequest( frontend_request=stream.CloseStreamInput( namespace=self._namespace, stream_id=self._id ) - ) + ), ) async def describe(self) -> stream.StreamState: """Read the stream's current frontier, floor and closed state.""" - response = await self._stub.DescribeStream( + response = await _call( + self._stub.DescribeStream, stream.DescribeStreamRequest( frontend_request=stream.DescribeStreamInput( namespace=self._namespace, stream_id=self._id ) - ) + ), ) return response.frontend_response.state class WorkflowStreamHandle: - """A handle to a stream a workflow publishes to. + """A handle to a stream a workflow owns. The workflow writes to it from inside its Workflow Task, which costs it no transition of its own. Anything else writes through :meth:`append`, which @@ -404,8 +456,7 @@ def pin(self, run_id: str) -> None: async def append( self, - *messages: bytes, - topic: str = "", + *records: StreamRecord, producer_id: str = "", sequence: int = 0, ) -> Appended: @@ -415,27 +466,19 @@ async def append( execution whatever its size, so a batch of a hundred costs what a batch of one does. """ - response = await self._stub.AddWorkflowMessages( + response = await _call( + self._stub.AddWorkflowMessages, stream.AddWorkflowMessagesRequest( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, owner_run_id=self._owner_run_id, stream_name=self._name, - messages=[ - stream.StreamMessage( - body=temporalio.api.common.v1.Payload( - data=m, metadata={"encoding": b"binary/plain"} - ), - topic=topic, - kind=stream.STREAM_MESSAGE_KIND_DATA, - ) - for m in messages - ], + records=[_to_service(record) for record in records], producer_id=producer_id, sequence=sequence, ) - ) + ), ) return _appended(response.frontend_response) @@ -443,43 +486,28 @@ async def read( self, *, from_offset: int = 0, - max_messages: int = 0, + max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, - ) -> tuple[list[Message], int]: + ) -> tuple[list[StreamEntry], int]: """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" - response = await self._stub.PollWorkflowMessages( - stream.PollWorkflowMessagesRequest( - frontend_request=stream.PollWorkflowMessagesInput( - namespace=self._namespace, - workflow_id=self._workflow_id, - owner_run_id=self._owner_run_id, - stream_name=self._name, - from_offset=from_offset, - max_messages=max_messages, - topics=list(topics), - wait_new_messages=wait, - ) - ) + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait ) - out = response.frontend_response - return [ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], (out.next_offset) + return page.entries, page.next_offset async def follow( self, *, from_offset: int = 0, topics: Sequence[str] = (), - ) -> AsyncIterator[Message]: - """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, as :meth:`StreamHandle.follow`.""" offset = from_offset while True: page = await self.poll(from_offset=offset, topics=topics) - for msg in page.messages: - yield msg + for entry in page.entries: + yield entry offset = page.next_offset if page.closed and offset >= page.head_offset: return @@ -489,16 +517,17 @@ async def poll( *, from_offset: int = 0, topics: Sequence[str] = (), - max_messages: int = 0, + max_records: int = 0, wait: bool = True, - ) -> "Page": + ) -> Page: """One read, with everything the caller needs to decide what to do next. :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. On a pinned handle ``closed`` also says the run has ended. """ - response = await self._stub.PollWorkflowMessages( + response = await _call( + self._stub.PollWorkflowMessages, stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, @@ -506,22 +535,13 @@ async def poll( owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, - max_messages=max_messages, + max_messages=max_records, topics=list(topics), wait_new_messages=wait, ) - ) - ) - out = response.frontend_response - return Page( - messages=[ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], - next_offset=out.next_offset, - head_offset=out.head_offset, - closed=out.closed, + ), ) + return _page(response.frontend_response) async def describe(self) -> stream.StreamState: """Read the stream's current frontier, floor and closed state. @@ -529,7 +549,8 @@ async def describe(self) -> stream.StreamState: A reader that wants only what comes next starts from the head this reports rather than from zero. """ - response = await self._stub.DescribeWorkflowStream( + response = await _call( + self._stub.DescribeWorkflowStream, stream.DescribeWorkflowStreamRequest( frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, @@ -537,7 +558,7 @@ async def describe(self) -> stream.StreamState: owner_run_id=self._owner_run_id, stream_name=self._name, ) - ) + ), ) return response.frontend_response.state @@ -551,6 +572,16 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: ) +def _page(out: stream.PollMessagesOutput) -> Page: + return Page( + entries=[_to_public(record) for record in out.records], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + run_id=out.run_id, + ) + + # One channel per loop, target and namespace, shared by every handle in the # process. A channel is multiplexed and long lived, and callers open a handle # per subscription, which would otherwise be a connection per subscription. The diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index 690402974..95eb48d7e 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -7,10 +7,16 @@ still subscribes by topic from an offset. What changes is underneath. A publish is a Workflow Command whose payload never -enters History, so History gets one fixed-size event per batch rather than a -Signal per batch. A consumer reads the log directly rather than long-polling an -Update, so there is no per-Workflow limit on how many can read at once, and a -closed Workflow stays readable until its stream's retention expires. +enters History, so History gets one fixed-size event per Workflow Task rather +than a Signal per batch. A consumer reads the log directly rather than +long-polling an Update, so there is no per-Workflow limit on how many can read +at once, and a closed Workflow stays readable until its stream's retention +expires. + +As in the shipped feature, a topic here is a label on a record in the +Workflow's one default stream, which a consumer filters on. The provider in +:mod:`temporalio.streams.providers.native` keeps one stream per topic instead; +the two do not share a log. Prototype support for AI-198. It needs a server built from that branch, and it opens its own gRPC channel because sdk-core does not know the stream service @@ -27,10 +33,11 @@ from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow -from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client import Client, WorkflowExecutionDescription from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client -from temporalio.converter import PayloadConverter +from temporalio.common import RawValue +from temporalio.converter import PayloadCodec, PayloadConverter __all__ = [ "RawPage", @@ -48,12 +55,14 @@ @dataclass class RawPage: - """One read whose items are still encoded. + """One read whose items are still the stored records. ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + The bodies are as the server holds them, codec included, for a caller + that forwards records rather than using them. """ - items: list["WorkflowStreamItem[bytes]"] + items: list[WorkflowStreamItem[StreamRecord]] next_offset: int head_offset: int closed: bool @@ -72,49 +81,24 @@ class WorkflowStreamItem(Generic[T]): offset: int = 0 -def _encode(converter: PayloadConverter, value: Any) -> bytes: - """Serialize one value to a stream message body. - - The payload rather than the bare bytes, so the encoding metadata the - consumer needs to decode into a type travels with it. - - The codec chain is not applied here. Inside a Workflow it does not have to - be: the Worker runs the payload visitor with its codec over the commands - and activations, so a body that rides ``add_stream_messages`` is encoded - on the way out and one that arrives on ``deliver_stream_messages`` is - decoded on the way in, as every other payload is. The client path has no - such pass, and encoding one side but not the other is worse than encoding - neither: an Activity's messages would reach a consuming Workflow as - ciphertext it has no way to decode. :func:`_reject_configured_codec` - refuses a client with a codec until the client path applies one too. - """ - payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] - return payload.SerializeToString() - - -def _reject_configured_codec(client: Client) -> None: - """Refuse a namespace whose payloads are meant to be encoded. +def _record(converter: PayloadConverter, topic: str, value: Any) -> StreamRecord: + """The record one published value becomes. - Stream bodies bypass the codec chain, so proceeding would write payloads - this namespace expects to be encrypted in the clear, and would do it - silently. Raising is the only honest answer until the Worker-side plumbing - exists. + The body is the value's payload, so the encoding metadata the consumer + needs to decode into a type travels with it and a + :class:`temporalio.common.RawValue` passes through pre-encoded. """ - if client.data_converter.payload_codec is not None: - raise RuntimeError( - "this client has a payload codec configured, and server-side stream " - "bodies do not pass through it. Publishing would store them " - "unencoded. Use a client without a codec, or wait for codec support " - "on streams." - ) + record = StreamRecord(topic=topic, kind=StreamRecordKind.STREAM_RECORD_KIND_DATA) + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record -def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) +def _decode( + converter: PayloadConverter, record: StreamRecord, as_type: type | None +) -> Any: if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] + return converter.from_payloads([record.body])[0] + return converter.from_payloads([record.body], [as_type])[0] class WorkflowTopicHandle(Generic[T]): @@ -135,15 +119,17 @@ def type(self) -> type[T]: """The value type this handle is bound to.""" return self._type - def publish(self, value: T | Payload) -> None: + def publish(self, value: T | RawValue) -> None: """Append ``value`` to the Workflow's stream on this topic. - Returns as soon as the Command is issued. There is nothing to await: - the append is applied in the Workflow Task's own commit, so it costs - this Workflow no round trip and no extra transition. + Returns at once. There is nothing to await: the Workflow Task's + publishes become one command the server applies in the task's own + commit, so it costs this Workflow no round trip and no extra + transition. The Worker's payload codec applies to the body as it does + to any other payload the Workflow sends. """ - workflow.add_stream_messages( - [_encode(workflow.payload_converter(), value)], topic=self._name + workflow.append_stream_records( + [_record(workflow.payload_converter(), self._name, value)] ) @@ -178,7 +164,7 @@ class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" def __init__( - self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + self, client: WorkflowStreamClient, topic: str, value_type: type[T] ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client @@ -195,7 +181,7 @@ def type(self) -> type[T]: """The value type this handle is bound to.""" return self._type - def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + def publish(self, value: T | RawValue, *, force_flush: bool = False) -> None: """Buffer ``value`` for the next flush. Buffered rather than sent, because an append costs one transition on @@ -232,15 +218,20 @@ def __init__( converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, *, + codec: PayloadCodec | None = None, describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: """Prefer :meth:`create` or :meth:`from_within_activity`. + ``codec`` is applied to every body this client sends and receives, so + a namespace whose payloads are encoded agrees with the Worker, whose + payload visitor applies the same codec to the Workflow's publishes. ``describe`` is how an unpinned handle learns which run it follows; see :meth:`WorkflowStreamHandle.pin`. """ self._handle = handle self._converter = converter + self._codec = codec self._batch_interval = batch_interval self._describe = describe self._buffered: list[tuple[str, Any]] = [] @@ -256,7 +247,7 @@ def create( *, owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, - ) -> "WorkflowStreamClient": + ) -> WorkflowStreamClient: """Open the stream owned by ``workflow_id``. Without ``owner_run_id`` the current run is looked up on the first @@ -264,20 +255,20 @@ def create( continue-as-new sees the run end rather than being moved to the successor's stream at a stale offset. """ - _reject_configured_codec(client) return cls( _stream_client(client).workflow_stream( workflow_id, owner_run_id=owner_run_id ), client.data_converter.payload_converter, batch_interval, + codec=client.data_converter.payload_codec, describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL - ) -> "WorkflowStreamClient": + ) -> WorkflowStreamClient: """Open the stream owned by the Workflow that scheduled this Activity.""" info = activity.info() if info.workflow_id is None: @@ -294,7 +285,7 @@ def from_within_activity( batch_interval=batch_interval, ) - async def __aenter__(self) -> "WorkflowStreamClient": + async def __aenter__(self) -> WorkflowStreamClient: """Start the background flusher.""" self._flusher = asyncio.create_task(self._run_flusher()) return self @@ -352,13 +343,12 @@ async def subscribe( """ del poll_cooldown await self._pin() - async for message in self._handle.follow( - from_offset=from_offset, topics=topics - ): + async for entry in self._handle.follow(from_offset=from_offset, topics=topics): + record = await self._decoded(entry.record) yield WorkflowStreamItem( - topic=message.topic, - data=_decode(self._converter, message.data, result_type), - offset=message.offset, + topic=record.topic, + data=_decode(self._converter, record, result_type), + offset=entry.offset, ) async def poll_raw( @@ -367,8 +357,8 @@ async def poll_raw( topics: Sequence[str] = (), from_offset: int = 0, wait: bool = True, - ) -> "RawPage": - """One read, with the bodies left as they were stored. + ) -> RawPage: + """One read, with the records left as they were stored. For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. @@ -379,8 +369,10 @@ async def poll_raw( ) return RawPage( items=[ - WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) - for m in page.messages + WorkflowStreamItem( + topic=entry.record.topic, data=entry.record, offset=entry.offset + ) + for entry in page.entries ], next_offset=page.next_offset, head_offset=page.head_offset, @@ -393,13 +385,11 @@ async def flush(self) -> None: if not pending: return await self._pin() - # One append per topic, because a batch carries a single topic. The - # harness case is one topic, so this is one append. - by_topic: dict[str, list[bytes]] = {} - for topic, value in pending: - by_topic.setdefault(topic, []).append(_encode(self._converter, value)) - for topic, bodies in by_topic.items(): - await self._handle.append(*bodies, topic=topic) + records = [ + await self._encoded(_record(self._converter, topic, value)) + for topic, value in pending + ] + await self._handle.append(*records) def _buffer(self, topic: str, value: Any) -> None: self._buffered.append((topic, value)) @@ -419,6 +409,16 @@ async def _run_flusher(self) -> None: self._wake.clear() await self.flush() + async def _encoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.encode([record.body]))[0]) + return record + + async def _decoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.decode([record.body]))[0]) + return record + def _stream_client(client: Client) -> StreamClient: return shared_client(client.service_client.config.target_host, client.namespace) diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 9b339dfe4..540f7f7d7 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -4,7 +4,7 @@ application does not have to know which of them wrote a given item. Needs a Temporal server built from the AI-198 branch: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/contrib/test_server_streams.py """ from __future__ import annotations @@ -154,3 +154,8 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: ) ] assert resumed == [item.data.text for item in first[2:]] + + # The raw page carries the stored records themselves. + raw = await stream.poll_raw(topics=[TOPIC], from_offset=0, wait=False) + assert [item.data.topic for item in raw.items] == [TOPIC] * 5 + assert raw.closed and raw.next_offset == raw.head_offset == 5 diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index fde925cca..e3f16f38e 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -3,7 +3,7 @@ These need a Temporal server built from the AI-198 branch, because the stream service does not exist on a released server. Point them at one: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/test_client_stream.py Skipped otherwise, rather than silently passing against a server that has no idea what a stream is. @@ -18,7 +18,11 @@ import pytest +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client_stream import StreamClient, StreamHandle +from temporalio.service import RPCError +from temporalio.streams import StreamNotFoundError TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -28,68 +32,113 @@ ) +def rec(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +def data(entries: list) -> list[bytes]: + return [entry.record.body.data for entry in entries] + + @pytest.fixture -async def stream() -> AsyncIterator[StreamHandle]: +async def streams() -> AsyncIterator[StreamClient]: client = StreamClient.connect( TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") ) try: - yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + yield client finally: await client.close() +@pytest.fixture +async def stream(streams: StreamClient) -> StreamHandle: + return await streams.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + + async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - first = await stream.append(b"alpha", b"beta") + first = await stream.append(rec(b"alpha"), rec(b"beta")) assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) assert not first.deduplicated - assert (await stream.append(b"gamma")).first_offset == 2 + assert (await stream.append(rec(b"gamma"))).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: - await stream.append(b"alpha", b"beta", b"gamma") + await stream.append(rec(b"alpha"), rec(b"beta"), rec(b"gamma")) - messages, next_offset = await stream.read() - assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + entries, next_offset = await stream.read() + assert data(entries) == [b"alpha", b"beta", b"gamma"] + assert [entry.offset for entry in entries] == [0, 1, 2] assert next_offset == 3 - messages, next_offset = await stream.read(from_offset=1) - assert [m.data for m in messages] == [b"beta", b"gamma"] + entries, next_offset = await stream.read(from_offset=1) + assert data(entries) == [b"beta", b"gamma"] assert next_offset == 3 async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: - await stream.append(b"alpha") + await stream.append(rec(b"alpha")) - messages, next_offset = await stream.read(from_offset=1) - assert messages == [] + entries, next_offset = await stream.read(from_offset=1) + assert entries == [] assert next_offset == 1, "a caught-up reader keeps its cursor" # Without an identity the append is at-least-once, so this is the only way a -# producer that retries can avoid writing the same message twice. +# producer that retries can avoid writing the same record twice. async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: - first = await stream.append(b"once", producer_id="p1", sequence=1) - retry = await stream.append(b"once", producer_id="p1", sequence=1) + first = await stream.append(rec(b"once"), producer_id="p1", sequence=1) + retry = await stream.append(rec(b"once"), producer_id="p1", sequence=1) assert first.first_offset == retry.first_offset == 0 assert not first.deduplicated - # The retry is told it wrote nothing, so a producer can report no position. + # The retry is told it wrote nothing and where the original landed. assert retry.deduplicated + assert retry.next_offset == first.next_offset - messages, _ = await stream.read() - assert [m.data for m in messages] == [b"once"] + entries, _ = await stream.read() + assert data(entries) == [b"once"] async def test_topics_filter_a_read(stream: StreamHandle) -> None: - await stream.append(b"tok", topic="tokens") - await stream.append(b"prog", topic="progress") - await stream.append(b"tok2", topic="tokens") + await stream.append(rec(b"tok", topic="tokens")) + await stream.append(rec(b"prog", topic="progress")) + await stream.append(rec(b"tok2", topic="tokens")) - messages, next_offset = await stream.read(topics=["tokens"]) - assert [m.data for m in messages] == [b"tok", b"tok2"] + entries, next_offset = await stream.read(topics=["tokens"]) + assert data(entries) == [b"tok", b"tok2"] + assert [entry.offset for entry in entries] == [0, 2] assert next_offset == 3, "the cursor advances past filtered-out offsets too" +# The record comes back as it went in: kind, producer identity and sequence +# are the server's to store, not to interpret. +async def test_the_record_roundtrips_field_for_field(stream: StreamHandle) -> None: + sent = rec(b"x", topic="t") + sent.producer_id = "model" + sent.attempt = 2 + sent.sequence = 7 + sent.metadata["trace"].CopyFrom(Payload(data=b"abc")) + finish = StreamRecord( + topic="t", kind=StreamRecordKind.STREAM_RECORD_KIND_FINISH, producer_id="model" + ) + await stream.append(sent, finish) + + entries, _ = await stream.read() + got = entries[0].record + assert (got.topic, got.producer_id, got.attempt, got.sequence) == ( + "t", + "model", + 2, + 7, + ) + assert got.kind == StreamRecordKind.STREAM_RECORD_KIND_DATA + assert got.metadata["trace"].data == b"abc" + assert entries[1].record.kind == StreamRecordKind.STREAM_RECORD_KIND_FINISH + assert not entries[1].record.HasField("body") + + # A closed stream stays readable, which is what removes the shutdown handshake # between producer and consumer. async def test_follow_drains_then_ends_when_the_stream_closes( @@ -98,13 +147,13 @@ async def test_follow_drains_then_ends_when_the_stream_closes( received: list[bytes] = [] async def follower() -> None: - async for message in stream.follow(): - received.append(message.data) + async for entry in stream.follow(): + received.append(entry.record.body.data) task = asyncio.create_task(follower()) - await stream.append(b"one") + await stream.append(rec(b"one")) await asyncio.sleep(0.2) - await stream.append(b"two") + await stream.append(rec(b"two")) await asyncio.sleep(0.2) await stream.close() @@ -115,15 +164,15 @@ async def follower() -> None: async def test_follow_started_late_still_sees_everything( stream: StreamHandle, ) -> None: - await stream.append(b"one", b"two") + await stream.append(rec(b"one"), rec(b"two")) await stream.close() - received = [m.data async for m in stream.follow()] + received = [entry.record.body.data async for entry in stream.follow()] assert received == [b"one", b"two"] async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: - await stream.append(b"one", b"two") + await stream.append(rec(b"one"), rec(b"two")) state = await stream.describe() assert state.head_offset == 2 @@ -131,3 +180,13 @@ async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: await stream.close() assert (await stream.describe()).closed + + +# The transport's own exception never escapes: a missing stream is the SDK's +# not-found error and anything else is its RPC error. +async def test_failures_surface_as_sdk_errors(streams: StreamClient) -> None: + missing = streams.get("py-test-missing-" + uuid.uuid4().hex[:8]) + with pytest.raises(StreamNotFoundError): + await missing.describe() + with pytest.raises((StreamNotFoundError, RPCError)): + await missing.append(rec(b"x")) From e4954970931b5f578fc731fd67fd2c4d879a978e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 291/831] Rewrote the native provider with one owned stream per topic. The workflow subscribes to the topic by name and publishes with the batched command; outside code appends and long-polls the same stream, following the run chain by cursor unless pinned. --- CHANGELOG.md | 14 +- temporalio/streams/providers/native.py | 698 +++++++++++----------- tests/streams/test_streams_conformance.py | 48 +- tests/worker/test_workflow_stream_e2e.py | 420 ++++++++----- 4 files changed, 693 insertions(+), 487 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 115b0d3dc..77a201faf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,13 +29,15 @@ to include examples, links to docs, or any other relevant information. the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. -- **Experimental**: server-side streams. A workflow reads a stream the server - delivers on its Workflow Tasks and publishes with a command, through - `temporalio.workflow.read_stream`, `subscribe_stream` and - `add_stream_messages`. `temporalio.client_stream` and +- **Experimental**: server-side streams. A workflow publishes to a stream it + owns with a command the server applies in its Workflow Task's commit, and + reads the ranges the server delivers on its Workflow Tasks, through + `temporalio.workflow.append_stream_records`, `subscribe_stream` and + `read_stream_records`. `temporalio.client_stream` and `temporalio.contrib.server_streams` reach the same stream from outside a - workflow, and `temporalio.streams.providers.native` puts it behind the shared - stream interface. Requires a server that serves the stream service. + workflow, and `temporalio.streams.providers.native.NativeStreams` puts it + behind the shared stream interface with one owned stream per topic. Requires + a server that serves the stream service. ### Changed diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 6dfdd4c25..ff0621031 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -1,176 +1,195 @@ """The server-side (native) provider. -Streams live on the Temporal server. A workflow publishes with a command that -the server applies in the same transaction that accepts the workflow task, and -consumes ranges the server attaches to the workflow task it dispatches. +Streams live on the Temporal server, beside the workflow that owns them. A +topic is one owned stream named after the topic, created by whoever touches it +first: the workflow publishes to it with a command the server applies in the +transaction that accepts the Workflow Task, subscribes to it by name and reads +the ranges the server delivers on its Workflow Tasks; outside code appends and +reads through the stream service, and the workflow's records and an outside +producer's land in one log in the order the server accepted them. + +A cursor names the run as well as the offset, because an owned stream belongs +to one run and a successor's starts over at zero. A handle without a run id +reads run after run, learning from the poll that a run's stream is closed and +from the run's close event who came next; with a run id it is pinned. + +Prototype support for AI-198. It needs a server built from that branch and +opens its own gRPC channel to it, because sdk-core does not know the stream +service yet, which is also why it does not support TLS or API keys. """ from __future__ import annotations -import asyncio import logging from collections.abc import AsyncGenerator -from datetime import timedelta from typing import Any -import grpc - from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, close_shared_clients, shared_client -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._ids import inbound_stream_id -from temporalio.streams._policy import AttemptTracker +from temporalio.client import Client, WorkflowHistoryEventFilterType +from temporalio.client_stream import ( + StreamClient, + WorkflowStreamHandle, + close_shared_clients, + shared_client, +) +from temporalio.converter import PayloadCodec, PayloadConverter +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["NativeProducer", "NativeStreamHandle", "NativeStreams"] -_RUN_STATE = "__temporal_streams_state" +_PROVIDER = "native" logger = logging.getLogger(__name__) -class _Fanout: - """One server subscription, shared by every reader of that stream. +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") - The server sends a range once. Whoever reads it first would otherwise take - it from the others, so the pull happens here and the result goes to all - live readers. - """ - def __init__(self, stream: str) -> None: - self._stream = stream - self._subscribers: list[list[tuple[Cursor, bytes]]] = [] - self._pull: asyncio.Future[None] | None = None - - def attach(self) -> list[tuple[Cursor, bytes]]: - queue: list[tuple[Cursor, bytes]] = [] - self._subscribers.append(queue) - return queue - - def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: - if queue in self._subscribers: - self._subscribers.remove(queue) - - async def next_batch( - self, queue: list[tuple[Cursor, bytes]] - ) -> list[tuple[Cursor, bytes]]: - while not queue: - pending = self._pull - if pending is None: - pending = self._pull = asyncio.ensure_future(self._run_pull()) - # Shielded because one reader going away must not cancel a range - # the server will not send again. - await asyncio.shield(pending) - batch, queue[:] = list(queue), [] - return batch - - async def _run_pull(self) -> None: - try: - delivered = await workflow.read_stream_messages(self._stream) - arrived = [ - (Cursor(str(message.offset)), message.body) for message in delivered - ] - for queue in self._subscribers: - queue.extend(arrived) - finally: - self._pull = None +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") -def _fanouts() -> dict[str, _Fanout]: - instance = workflow.instance() - state = getattr(instance, _RUN_STATE, None) - if state is None: - state = {} - setattr(instance, _RUN_STATE, state) - return state +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "native provider" + ) from None -class _NativeReadSource: - def __init__(self, fanout: _Fanout) -> None: - self._fanout = fanout - self._queue = fanout.attach() +async def _encode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + # The worker's payload visitor runs a codec over the bodies a workflow + # publishes and receives; the outside half has no such pass, so it applies + # the client's codec here or the two sides would not agree. + if codec is None or not record.HasField("body"): + return record + encoded = await codec.encode([record.body]) + record.body.CopyFrom(encoded[0]) + return record - async def next_batch(self) -> list[tuple[Cursor, bytes]]: - return await self._fanout.next_batch(self._queue) - def close(self) -> None: - self._fanout.detach(self._queue) - - -class _NativeWriteSink: - def __init__(self, topic: str) -> None: - self._topic = topic +async def _decode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + if codec is None or not record.HasField("body"): + return record + decoded = await codec.decode([record.body]) + record.body.CopyFrom(decoded[0]) + return record - async def publish(self, frame: bytes) -> None: - # Nothing is awaited. The server applies the payload when it accepts - # the task, so there is no back pressure to wait on and no round trip - # to pay for. The signature is awaitable because the contract allows a - # provider that does hold a publisher back. - workflow.add_stream_messages([frame], stream_id="", topic=self._topic) +class _NativeReadSource: + """One subscription of the running workflow, fed by delivered ranges.""" -def _reject_configured_codec(client: Client) -> None: - """Refuse a namespace whose payloads are meant to be encoded. + def __init__(self, stream_id: str, run_id: str) -> None: + self._stream_id = stream_id + self._run_id = run_id + self._closed = False - Stream bodies do not pass through the codec chain on this provider, so - proceeding would store in the clear what the namespace expects encrypted, - and would do it without saying so. - """ - if client.data_converter.payload_codec is not None: - raise RuntimeError( - "this client has a payload codec configured, and server-side stream " - "bodies do not pass through it" - ) + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + if self._closed: + raise StopAsyncIteration + delivered = await workflow.read_stream_records(self._stream_id) + return [(_cursor(self._run_id, item.offset), item.record) for item in delivered] + def close(self) -> None: + self._closed = True -# Streams this process has already opened, so a second producer for the same -# stream reuses the handle rather than asking the server to create it again. -# The second create is answered correctly, and it is still a failed call the -# server logs, which is noise an operator has to learn to ignore. -_handles: dict[tuple[str, str, str], Any] = {} +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic -def _stream_client(client: Client) -> StreamClient: - return shared_client(client.service_client.config.target_host, client.namespace) + def publish(self, record: WireRecord) -> None: + # Held by the runtime until the task completes, when the task's + # records on this topic become one command the server applies with + # the task: rule 1 through the server's own commit. + workflow.append_stream_records([record], stream_id=self._topic) + + +class _NativeWorkflowProvider: + """The workflow half: the server's commands and delivered ranges.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's stream is its own" + ) + start = named[1] + 1 + workflow.subscribe_stream(topic, start_offset=start) + return _NativeReadSource(topic, run_id) + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _NativeWriteSink(topic) -async def _owner_run(client: Client, workflow_id: str) -> str: - """The run whose stream a handle on ``workflow_id`` should address. + def on_workflow_start(self) -> None: + pass - Resolved once, when the handle opens. Left to the server, a follower whose - workflow continued as new would be redirected to the successor, whose - stream starts empty, and its offset read as "caught up" rather than as a - position on the run it was watching. A producer is pinned for the same - reason: an activity's output belongs to the run that scheduled it. - """ - return (await client.get_workflow_handle(workflow_id).describe()).run_id + async def on_workflow_finish(self) -> None: + pass class NativeProducer: - """Appends to a stream from outside workflow code. + """Appends to a topic from outside workflow code. - Every append is visible as soon as it is written. That is the point for an - activity streaming model output, and it is why an activity carries its own - identity: the retry of a failed attempt has no commit boundary to sort it - out afterwards. + Every append is visible as soon as the server accepts it. That is the + point for an activity streaming model output, and it is why an activity + carries its own identity: the retry of a failed attempt has no commit + boundary to sort it out afterwards. """ def __init__( self, - handle: Any, - converter: Any, + handle: WorkflowStreamHandle, + pin: Any, + codec: PayloadCodec | None, + converter: PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle + self._pin = pin + self._codec = codec self._converter = converter self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -178,265 +197,260 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: - """The identity the provider dedupes on. - - The attempt is part of it. Deduplication answers "is this the same - append again", and a second attempt writing different words at the same - sequence is not. Folding the attempt in keeps a retried append idempotent - without letting a new generation be swallowed as a duplicate of the old - one. - """ + def _writer(self) -> str: + # The server dedupes on this and the sequence. The attempt is part of + # it so a retried append is dropped while a new generation writing + # different words at the same sequence is not. return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed, because the server + answers a deduplicated batch with the original offsets; an empty call + returns the position of this producer's last record. + """ if not values: - return None - frames = [] - for value in values: - frames.append( - _frame.encode( + return self._last + return await self._write( + [ + to_wire( + self._converter, topic=self._topic, kind=RecordKind.DATA, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=self._sequence + index, ) - ) - self._sequence += 1 - appended = await self._handle.append( - *frames, - topic=self._topic, - producer_id=self._provider_id, - # The provider dedupes a retried append on this pair, which is a - # different job from telling readers that a new generation started. - sequence=self._sequence - len(frames), + for index, value in enumerate(values) + ] ) - if appended.deduplicated: - return None - return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: - """Declare this stream complete.""" - frame = _frame.encode( - topic=self._topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._handle.append( - frame, - topic=self._topic, - producer_id=self._provider_id, - sequence=self._sequence - 1, + """Write ``FINISH`` for this producer on this topic.""" + await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] ) - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + async def _write(self, records: list[WireRecord]) -> Cursor: + # Pinned before the first write, so every cursor this producer hands + # out names the run its records landed in. + if not self._handle.owner_run_id: + self._handle.pin(await self._pin()) + for record in records: + await _encode_body(self._codec, record) + appended = await self._handle.append( + *records, producer_id=self._writer, sequence=self._sequence ) - return payload.SerializeToString() - - -class NativeConsumer: - """Reads a stream from outside workflow code, resumably.""" - - def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: - """Read the stream ``handle`` names, from anywhere. + self._sequence += len(records) + self._last = _cursor(self._handle.owner_run_id, appended.next_offset - 1) + return self._last + + +class NativeStreamHandle: + """One workflow's topics from outside, over the stream service.""" + + def __init__(self, client: Client, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s topics, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = client.data_converter.payload_converter + self._codec = client.data_converter.payload_codec + self._streams: StreamClient | None = None + + def _service(self) -> StreamClient: + # Resolved on first use, because the shared channel belongs to the + # running loop and a handle may be made before there is one. + if self._streams is None: + self._streams = shared_client( + self._client.service_client.config.target_host, + self._client.namespace, + ) + return self._streams - ``stream`` is the inbound name the caller used, empty for the owner's - stream; ``address`` is what the server calls it, for log lines. - """ - self._handle = handle - self._converter = converter - self._stream = stream - self._address = address + def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: + return self._service().workflow_stream( + self._workflow_id, topic, owner_run_id=run_id + ) - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield the records after ``after`` as they arrive. + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) - Applies the same supersession rule as a workflow reader, so a browser - and a workflow watching one activity agree on which attempt is current. + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + stream = self._stream(topic, run_id) + while True: + page = await stream.poll(from_offset=offset) + for entry in page.entries: + record = await _decode_body(self._codec, entry.record) + for out in decoder.decode(_cursor(run_id, entry.offset), record): + yield out + offset = page.next_offset + # On a pinned stream the server reports the run's end as closed, + # and a closed stream is finished once its head is delivered. + if page.closed and offset >= page.head_offset: + break + if self._run_id is not None: + return + successor = await self._successor(run_id) + if successor is None: + return + run_id, offset = successor, 0 + + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest record on ``topic``, naming the run it was read from. + + An empty topic on the chain's first run is the beginning of the + stream; on a successor it is a position of its own, because + ``BEGINNING`` would send a chain-following read back to the first run. """ - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - async for message in self._handle.follow( - from_offset=int(after.token) + 1 if after.token else 0 - ): - cursor = Cursor(str(message.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - message.data - ) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning( - "skipping record %s of stream %s: %s", cursor, self._address, error - ) - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + _require_topic(topic) + run_id = self._run_id or await self._current_run() + try: + head = (await self._stream(topic, run_id).describe()).head_offset + except StreamNotFoundError: + # A topic nobody has written yet does not exist on the server, + # which is the same answer as an empty one. + head = 0 + if head > 0: + return _cursor(run_id, head - 1) + if self._run_id is None and await self._predecessor(run_id) is not None: + return _cursor(run_id, -1) + return BEGINNING + + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> NativeProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return NativeProducer( + self._stream(topic, self._run_id or ""), + self._current_run, + self._codec, + self._converter, + topic, + producer_id, + attempt, + ) - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one server-side log per stream, whatever the topic + async def _current_run(self) -> str: + try: + description = await self._client.get_workflow_handle( + self._workflow_id + ).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert description.run_id is not None + return description.run_id + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + run_id = await self._current_run() + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) try: - state = await self._handle.describe() - except grpc.aio.AioRpcError as error: - # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. Any other failure is not: - # a reader that took it for "empty" would replay the whole stream. - if error.code() is not grpc.StatusCode.NOT_FOUND: + async for event in handle.fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: raise - return BEGINNING - return ( - Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING - ) + # The run's History is gone: the chain's retained part starts here. + return None - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + async def _successor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + try: + async for event in events: + if event.HasField( + "workflow_execution_continued_as_new_event_attributes" + ): + attributes = ( + event.workflow_execution_continued_as_new_event_attributes + ) + return attributes.new_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + return None -class _NativeProvider: - name = "native" +class NativeStreams(ProviderPlugin): + """The server-side provider. - def configure(self, **options: Any) -> None: - """Take no options. + Takes no options: the streams are on the server the client is already + connected to. Construct one, pass it to the worker as a plugin and open + handles from it anywhere else; :meth:`close` releases the channels this + process opened to the stream service. + """ - The streams are on the server the client is already connected to. - This exists so a process that switches providers changes one call - rather than its structure. - """ - if options: - raise TypeError( - f"the native provider takes no options, got {sorted(options)}" - ) + def workflow_provider(self) -> _NativeWorkflowProvider: + """The workflow half, over the server's commands and delivered ranges.""" + return _NativeWorkflowProvider() - def worker_options(self) -> dict[str, Any]: - return {} + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> NativeStreamHandle: + """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain.""" + return NativeStreamHandle(client, workflow_id, run_id) async def close(self) -> None: """Close the channels this process opened to the stream service.""" await close_shared_clients() - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Accepted and ignored. Delivery arrives on workflow tasks the server - # dispatches, so no worker is held between records and there is nothing - # for an idle timeout to release. - del idle_timeout - stream_id = inbound_stream_id(workflow.info().workflow_id, stream) - fanouts = _fanouts() - fanout = fanouts.get(stream_id) - if fanout is None: - workflow.subscribe_stream( - stream_id, start_offset=int(after.token) + 1 if after.token else 0 - ) - fanout = fanouts[stream_id] = _Fanout(stream_id) - return _NativeReadSource(fanout) - - def open_write(self, topic: str) -> WriteSink: - return _NativeWriteSink(topic) - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> NativeProducer: - """Open a producer on ``workflow_id``'s account. - - ``stream`` names an inbound stream, a namespace-level stream the - server keys by the pair. With none, ``topic`` names a topic on the - stream the workflow publishes, which the server lets any producer - append to. An inbound record carries no topic: the stream's name is - its whole address. - """ - _reject_configured_codec(client) - streams = _stream_client(client) - converter = client.data_converter.payload_converter - if not stream: - handle: Any = streams.workflow_stream( - workflow_id, owner_run_id=await _owner_run(client, workflow_id) - ) - return NativeProducer(handle, converter, topic, producer_id, attempt) - stream_id = inbound_stream_id(workflow_id, stream) - key = (client.service_client.config.target_host, client.namespace, stream_id) - handle = _handles.get(key) - if handle is None: - try: - handle = await streams.create(stream_id) - except Exception: - # Created by whoever set the stream up. A producer opening a - # stream it does not own is the ordinary case, not the - # exception. - handle = streams.get(stream_id) - _handles[key] = handle - return NativeProducer(handle, converter, topic, producer_id, attempt) - - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> NativeConsumer: - """Open a reader for what ``workflow_id`` publishes. - - An empty ``stream`` reads what the workflow wrote through - :func:`temporalio.streams.writer`. Naming one reads that inbound - stream instead, which is how a second consumer follows the same input. - """ - _reject_configured_codec(client) - streams = _stream_client(client) - address = inbound_stream_id(workflow_id, stream) - if stream: - handle: Any = streams.get(address) - else: - handle = streams.workflow_stream( - workflow_id, owner_run_id=await _owner_run(client, workflow_id) - ) - return NativeConsumer( - handle, client.data_converter.payload_converter, stream, address - ) - - -_provider.register("native", _NativeProvider) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 451fe4391..e9f016cb7 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,6 +21,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass @@ -28,8 +29,9 @@ import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -45,6 +47,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.native import NativeStreams +from tests.helpers import new_worker @dataclass @@ -78,9 +82,51 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: + # The store is a server built from the stream-carrying branch, which the + # test environment's own server is not; TEMPORAL_ADDRESS names it. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = NativeStreams() + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase("native", provider, client, host=host) + for handle in hosts.values(): + await handle.terminate() + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { "memory": _memory_case } +if os.environ.get("STREAMS_LIVE") == "native": + SETUPS["native"] = _native_case _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 31296b2c8..a41b2a495 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -1,10 +1,12 @@ -"""A workflow publishing to a stream it owns and reading its own messages back. +"""The native provider inside a real workflow, against a server that has streams. -Path A and Path C together, both from workflow code. Needs a Temporal server -built from the AI-198 branch, because neither the stream service nor the -commands exist on a released one: +The two rules the memory provider cannot keep are the measurement here: a +publish commits with its Workflow Task and never lands if the task fails, and +a read is a recorded observation the server re-supplies on replay. Needs a +Temporal server built from the AI-198 branch, because neither the stream +service nor the commands exist on a released one: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/worker/test_workflow_stream_e2e.py Skipped otherwise, rather than passing against a server that has no idea what a stream is. @@ -15,13 +17,20 @@ import asyncio import os import uuid +from typing import Any import pytest from temporalio import workflow +from temporalio.api.common.v1 import Payload from temporalio.api.enums.v1 import EventType +from temporalio.api.stream.v1 import StreamRecord from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import RecordKind +from temporalio.streams.providers.native import NativeStreams from temporalio.worker import Worker +from tests.streams.test_streams_conformance import take TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -30,36 +39,264 @@ reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", ) -STREAM = "output" +INPUTS = "inputs" +DECISIONS = "decisions" EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED -EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED +EVENT_STREAM_RECORDS_APPENDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED + + +async def _connect() -> Client: + return await Client.connect(TARGET or "") + + +async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: + counts = { + EVENT_STREAM_RECORDS_APPENDED: 0, + EVENT_STREAM_SUBSCRIBED: 0, + EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: 0, + } + async for event in client.get_workflow_handle(workflow_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + return counts + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "replaced": record.supersession.previous_attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) + trace.append({"kind": "decision", "n": record.value["n"]}) + decisions.finish() + return trace + + +async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None: + """Rule 2 on the native provider: every task replays from the server. + + With the cache off, each Workflow Task rebuilds the workflow from History + and the server re-supplies the ranges earlier tasks consumed, so the loop + completing at all means the same records came back in the same order. + """ + client = await _connect() + provider = NativeStreams() + task_queue = "loop-tq-" + uuid.uuid4().hex[:8] + workflow_id = "loop-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + plugins=[provider], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"n": 1}, {"n": 2}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"n": 3}) + await second.finish() + trace = await asyncio.wait_for(handle.result(), 60) + + assert trace == [ + {"kind": "decision", "n": 1}, + {"kind": "decision", "n": 2}, + {"kind": "superseded", "replaced": 1}, + {"kind": "decision", "n": 3}, + {"kind": "finish", "producer": "model"}, + ] + + # The read ends by itself: the workflow is closed and the tail + # delivered, with the workflow's own records carrying no producer. + async def read_everything() -> list[Any]: + return [ + (r.producer_id, r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + assert await asyncio.wait_for(read_everything(), 60) == [ + ("", RecordKind.DATA, {"decided": 1}), + ("", RecordKind.DATA, {"decided": 2}), + ("", RecordKind.DATA, {"retracting_attempt": 1}), + ("", RecordKind.DATA, {"decided": 3}), + ("", RecordKind.FINISH, None), + ] + counts = await _event_counts(client, workflow_id) + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + # Several tasks published, one event each; the loop spanned more than + # one task or the cold cache proved nothing. + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 2 + assert ( + 1 + <= counts[EVENT_STREAM_RECORDS_APPENDED] + <= counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] + ) + finally: + await provider.close() + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + decisions.finish() + + +async def test_a_failed_task_publishes_nothing() -> None: + """Rule 1 on the native provider: the server applies the command with the task.""" + client = await _connect() + provider = NativeStreams() + task_queue = "fail-tq-" + uuid.uuid4().hex[:8] + workflow_id = "fail-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishThenFail], + plugins=[provider], + ): + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + records = await take( + stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60 + ) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] + finally: + await provider.close() + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new() -> None: + client = await _connect() + provider = NativeStreams() + task_queue = "relay-tq-" + uuid.uuid4().hex[:8] + workflow_id = "relay-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, task_queue=task_queue, workflows=[Relay], plugins=[provider] + ): + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 60) + await handle.result() + # The chain is followed: the successor's record arrives on the same + # read, each cursor names its run, and the read ends with the chain. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + # Pinned to the last run, a handle sees that run's stream alone. + last_run = (await client.get_workflow_handle(workflow_id).describe()).run_id + pinned = provider.get_stream_handle(client, workflow_id, run_id=last_run) + only_last = [ + r.value async for r in pinned.read(topic=DECISIONS, result_type=dict) + ] + assert only_last == [{"run": 1}, None] + finally: + await provider.close() @workflow.defn class PublishAndRead: + """Publishes through the low-level surface and reads its own records back.""" + @workflow.run async def run(self) -> list[str]: - # Published before subscribing, because a subscription resolves against - # the streams the workflow already owns and this is what creates one. - workflow.add_stream_messages( - [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + workflow.append_stream_records( + [_record(b"alpha", "progress"), _record(b"beta", "progress")], + stream_id="output", ) - workflow.add_stream_messages([b"delta"], stream_id=STREAM) - - workflow.subscribe_stream(STREAM, start_offset=0) + workflow.append_stream_records([_record(b"gamma")], stream_id="output") + # A name this workflow has not written yet still names a stream it + # owns, so subscribing creates the one the later publish lands in. + workflow.subscribe_stream("output", start_offset=0) received: list[str] = [] - while len(received) < 4: - for body in await workflow.read_stream(STREAM): - received.append(body.decode()) + while len(received) < 3: + for item in await workflow.read_stream_records("output"): + received.append(item.record.body.data.decode()) return received -async def test_workflow_reads_back_what_it_published() -> None: - client = await Client.connect(TARGET or "") +def _record(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +async def test_a_tasks_publishes_become_one_event() -> None: + client = await _connect() task_queue = "publish-tq-" + uuid.uuid4().hex[:8] - wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + workflow_id = "publish-wf-" + uuid.uuid4().hex[:8] async with Worker( client, @@ -71,111 +308,26 @@ async def test_workflow_reads_back_what_it_published() -> None: ): result = await asyncio.wait_for( client.execute_workflow( - PublishAndRead.run, id=wf_id, task_queue=task_queue + PublishAndRead.run, id=workflow_id, task_queue=task_queue ), timeout=60, ) + assert result == ["alpha", "beta", "gamma"] - assert result == ["alpha", "beta", "gamma", "delta"] - - counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} - async for event in client.get_workflow_handle(wf_id).fetch_history_events(): - if event.event_type in counts: - counts[event.event_type] += 1 - - # Two calls carrying four messages, so two events: the event is per batch, - # which is what makes batching free. - assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + counts = await _event_counts(client, workflow_id) + # Two calls in one task carrying three records, so one event: the event is + # per task and stream, which is what makes publishing often free. + assert counts[EVENT_STREAM_RECORDS_APPENDED] == 1 assert counts[EVENT_STREAM_SUBSCRIBED] == 1 -@workflow.defn -class PublishOnSignal: - """Publishes a token per signal, which is the shape an agent turn has.""" - - def __init__(self) -> None: - self._pending: list[str] = [] - self._done = False - - @workflow.run - async def run(self) -> int: - published = 0 - while True: - await workflow.wait_condition(lambda: bool(self._pending) or self._done) - while self._pending: - workflow.add_stream_messages([self._pending.pop(0).encode()]) - published += 1 - if self._done: - return published - - @workflow.signal - async def emit(self, token: str) -> None: - self._pending.append(token) - - @workflow.signal - async def finish(self) -> None: - self._done = True - - -async def test_a_client_follows_what_a_workflow_publishes() -> None: - """The harness shape: the workflow writes, something outside it reads live. - - A stream a workflow owns has no id, so the reader addresses it by the - owner. It also attaches before the first publish, which is what a UI opening - on a session does. - """ - from temporalio.client_stream import StreamClient - - client = await Client.connect(TARGET or "") - streams = StreamClient.connect(TARGET or "") - task_queue = "follow-tq-" + uuid.uuid4().hex[:8] - wf_id = "follow-wf-" + uuid.uuid4().hex[:8] - - tokens = [f"token-{i}" for i in range(5)] - received: list[str] = [] - - try: - async with Worker( - client, - task_queue=task_queue, - workflows=[PublishOnSignal], - max_cached_workflows=0, - ): - handle = await client.start_workflow( - PublishOnSignal.run, id=wf_id, task_queue=task_queue - ) - - # Attached before anything is published, so the stream does not - # exist yet and the first poll has to park rather than fail. - reader = streams.workflow_stream(wf_id) - assert (await reader.describe()).head_offset == 0 - - async def follow() -> None: - async for message in reader.follow(): - received.append(message.data.decode()) - if len(received) == len(tokens): - return - - following = asyncio.ensure_future(follow()) - for token in tokens: - await handle.signal(PublishOnSignal.emit, token) - await asyncio.wait_for(following, timeout=60) - - await handle.signal(PublishOnSignal.finish) - assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) - finally: - await streams.close() - - assert received == tokens - - @workflow.defn class ConsumeAcrossTasks: - """Reads a stream over several Workflow Tasks, then reports what it saw. + """Reads a standalone stream over several Workflow Tasks, then reports what it saw. - The turn structure is the point: each `read_stream` that finds nothing - blocks, which ends a Workflow Task, so the run spans several. With the - cache on, every task after the first is sticky. + The turn structure is the point: each read that finds nothing blocks, + which ends a Workflow Task, so the run spans several. With the cache on, + every task after the first is sticky. """ @workflow.run @@ -183,25 +335,22 @@ async def run(self, stream_id: str, expected: int) -> list[str]: workflow.subscribe_stream(stream_id, start_offset=0) seen: list[str] = [] while len(seen) < expected: - for body in await workflow.read_stream(stream_id): - seen.append(body.decode()) + for item in await workflow.read_stream_records(stream_id): + seen.append(item.record.body.data.decode()) return seen async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: """The workflow cache stays on, which is what a real worker does. - Every other end-to-end test here disables it, so the sticky path was never - exercised. The server sends no replay slice for a sticky task, while the - sticky history still carries the previous task's consumed range, and the - two together used to fail every task after the first consumed range. + The server sends no replay slice for a sticky task, while the sticky + history still carries the previous task's consumed range, and the two + together have to agree on every task after the first consumed range. """ - from temporalio.client_stream import StreamClient - - client = await Client.connect(TARGET or "") + client = await _connect() streams = StreamClient.connect(TARGET or "") task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] - wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + workflow_id = "sticky-wf-" + uuid.uuid4().hex[:8] stream_id = "sticky-src-" + uuid.uuid4().hex[:8] batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] @@ -210,15 +359,12 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: try: await streams.create(stream_id) async with Worker( - client, - task_queue=task_queue, - workflows=[ConsumeAcrossTasks], - # Left at the default deliberately. This is what the test is for. + client, task_queue=task_queue, workflows=[ConsumeAcrossTasks] ): handle = await client.start_workflow( ConsumeAcrossTasks.run, args=[stream_id, len(expected)], - id=wf_id, + id=workflow_id, task_queue=task_queue, ) @@ -226,18 +372,16 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: # them. Without the gap the appends coalesce into one task and the # sticky path is never taken. for batch in batches: - await streams.get(stream_id).append(*[t.encode() for t in batch]) + await streams.get(stream_id).append( + *[_record(t.encode()) for t in batch] + ) await asyncio.sleep(0.4) assert await asyncio.wait_for(handle.result(), timeout=60) == expected - # More than one Workflow Task ran, otherwise the test proves nothing. - completed = 0 - async for event in client.get_workflow_handle(wf_id).fetch_history_events(): - if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: - completed += 1 - assert completed >= 3, ( - f"only {completed} workflow tasks, sticky path not exercised" + counts = await _event_counts(client, workflow_id) + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 3, ( + "sticky path not exercised" ) finally: await streams.close() From 362b643c8732cf94e74d1dacb277131d03fce3cb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:32:40 -0700 Subject: [PATCH 292/831] Added the StreamError family for stream conditions. --- temporalio/streams/__init__.py | 12 ++++++++++ temporalio/streams/_errors.py | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 temporalio/streams/_errors.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index f564135fd..0b43830cb 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -64,6 +64,13 @@ from datetime import timedelta from typing import Any, TypeVar, overload +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) from temporalio.streams._handles import ( ReadSource, StreamReader, @@ -101,10 +108,15 @@ "Producer", "ReadSource", "RecordKind", + "StreamCursorError", + "StreamError", + "StreamNotFoundError", + "StreamProducerError", "StreamProvider", "StreamProviderLifecycle", "StreamReader", "StreamRecord", + "StreamUnsupportedError", "StreamWriter", "Supersession", "WriteSink", diff --git a/temporalio/streams/_errors.py b/temporalio/streams/_errors.py new file mode 100644 index 000000000..f00bf1c3a --- /dev/null +++ b/temporalio/streams/_errors.py @@ -0,0 +1,40 @@ +"""The errors a stream call raises. + +Every stream condition is a :class:`StreamError`, so a caller can catch by +meaning the way it catches other :class:`temporalio.exceptions.TemporalError` +subclasses. Argument mistakes stay ``ValueError``. A provider's transport +failure surfaces as :class:`temporalio.service.RPCError`, never as the +transport's own exception type. +""" + +from __future__ import annotations + +import temporalio.exceptions + +__all__ = [ + "StreamCursorError", + "StreamError", + "StreamNotFoundError", + "StreamProducerError", + "StreamUnsupportedError", +] + + +class StreamError(temporalio.exceptions.TemporalError): + """Base for stream conditions.""" + + +class StreamNotFoundError(StreamError): + """The workflow, chain or topic does not exist or is past retention.""" + + +class StreamCursorError(StreamError): + """The cursor was minted by another provider or names a record no longer retained.""" + + +class StreamProducerError(StreamError): + """The producer attempt or sequence conflicts with what the store holds.""" + + +class StreamUnsupportedError(StreamError): + """This provider does not offer the requested capability.""" From 600f6d597189d809d6e9af51ca453c4fee202d77 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:37:55 -0700 Subject: [PATCH 293/831] Vendored the stream additions to the public API protos. The Core submodule does not pin the api branch that carries them yet, so the generator stages the pinned API tree, applies the branch's diff and regenerates only the files it touches. --- scripts/gen_stream_api_protos.py | 101 ++ temporalio/api/command/v1/__init__.py | 4 + temporalio/api/command/v1/message_pb2.py | 117 +- temporalio/api/command/v1/message_pb2.pyi | 105 ++ temporalio/api/enums/v1/command_type_pb2.py | 6 +- temporalio/api/enums/v1/command_type_pb2.pyi | 4 + temporalio/api/enums/v1/event_type_pb2.py | 6 +- temporalio/api/enums/v1/event_type_pb2.pyi | 20 + temporalio/api/enums/v1/failed_cause_pb2.py | 27 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 30 + temporalio/api/history/v1/__init__.py | 4 + temporalio/api/history/v1/message_pb2.py | 301 +++-- temporalio/api/history/v1/message_pb2.pyi | 131 ++ temporalio/api/stream/__init__.py | 0 temporalio/api/stream/v1/__init__.py | 8 + temporalio/api/stream/v1/message_pb2.py | 95 ++ temporalio/api/stream/v1/message_pb2.pyi | 267 ++++ .../v1/request_response_pb2.py | 1125 +++++++++-------- .../v1/request_response_pb2.pyi | 17 + 19 files changed, 1617 insertions(+), 751 deletions(-) create mode 100644 scripts/gen_stream_api_protos.py create mode 100644 temporalio/api/stream/__init__.py create mode 100644 temporalio/api/stream/v1/__init__.py create mode 100644 temporalio/api/stream/v1/message_pb2.py create mode 100644 temporalio/api/stream/v1/message_pb2.pyi diff --git a/scripts/gen_stream_api_protos.py b/scripts/gen_stream_api_protos.py new file mode 100644 index 000000000..eeb7bb350 --- /dev/null +++ b/scripts/gen_stream_api_protos.py @@ -0,0 +1,101 @@ +"""Regenerate the stream additions to the vendored public API protos. + +The stream protos live on a branch of the api repo that the Core submodule +does not pin yet. Regenerating everything from that branch would also pull in +whatever else moved on the api main line since the pin, so this stages the +API protos the submodule pins, applies the branch's own diff on top, and +regenerates only the files that diff touches. Every other module under +``temporalio/api`` stays byte-identical. + + uv run --python 3.10 --no-project --with "grpcio-tools==1.48.2" \\ + --with "mypy-protobuf==3.3.0" --with "protobuf<4" \\ + scripts/gen_stream_api_protos.py /path/to/api origin/main..origin/ + +The toolchain pins match ``scripts/_proto/Dockerfile``. Generated code refuses +to load on a protobuf runtime older than the one it was built against, and +these modules end up in applications that pin protobuf themselves. Run +``uv run poe format`` afterwards, as the ``gen-protos`` task does. +""" + +from __future__ import annotations + +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +sys.path.insert(0, str(BASE / "scripts")) + +import gen_protos # noqa: E402 + +API_OUT = BASE / "temporalio" / "api" + + +def main() -> None: + if len(sys.argv) != 3: + sys.exit("usage: gen_stream_api_protos.py /path/to/api-checkout ..") + api = Path(sys.argv[1]).resolve() + revisions = sys.argv[2] + diff = subprocess.run( + ["git", "-C", str(api), "diff", revisions, "--", "temporal/"], + check=True, + capture_output=True, + text=True, + ).stdout + touched = subprocess.run( + ["git", "-C", str(api), "diff", "--name-only", revisions, "--", "temporal/"], + check=True, + capture_output=True, + text=True, + ).stdout.split() + if not touched: + sys.exit(f"{revisions} touches no proto under temporal/") + + with tempfile.TemporaryDirectory() as tmp: + stage = Path(tmp) / "stage" + shutil.copytree(gen_protos.api_proto_dir / "temporal", stage / "temporal") + subprocess.run( + ["patch", "-p1", "--silent"], + check=True, + cwd=stage, + input=diff, + text=True, + ) + out = Path(tmp) / "out" + out.mkdir() + subprocess.check_call( + [ + sys.executable, + "-mgrpc_tools.protoc", + f"--proto_path={stage}", + f"--python_out={out}", + f"--mypy_out={out}", + *touched, + ] + ) + packages: set[Path] = set() + for proto in touched: + relative = Path(proto).relative_to("temporal/api").with_suffix("") + for suffix in ("_pb2.py", "_pb2.pyi"): + generated = ( + out + / "temporal" + / "api" + / relative.with_name(relative.name + suffix) + ) + target = API_OUT / relative.with_name(relative.name + suffix) + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(generated, target) + print(f"wrote {target.relative_to(BASE)}") + packages.add(target.parent) + + for package in sorted(packages): + (package.parent / "__init__.py").touch() + gen_protos.fix_generated_output(package) + print(f"rewrote {(package / '__init__.py').relative_to(BASE)}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index e0ce8f712..d1b241274 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -1,4 +1,5 @@ from .message_pb2 import ( + AppendStreamRecordsCommandAttributes, CancelTimerCommandAttributes, CancelWorkflowExecutionCommandAttributes, Command, @@ -16,10 +17,12 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) __all__ = [ + "AppendStreamRecordsCommandAttributes", "CancelTimerCommandAttributes", "CancelWorkflowExecutionCommandAttributes", "Command", @@ -37,5 +40,6 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index ad004ae03..8c36c1f7b 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -42,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\x87\x12\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x42\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -106,6 +109,12 @@ "RequestCancelNexusOperationCommandAttributes" ] _COMMAND = DESCRIPTOR.message_types_by_name["Command"] +_APPENDSTREAMRECORDSCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "AppendStreamRecordsCommandAttributes" +] +_SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeStreamCommandAttributes" +] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", (_message.Message,), @@ -332,6 +341,28 @@ ) _sym_db.RegisterMessage(Command) +AppendStreamRecordsCommandAttributes = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecordsCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _APPENDSTREAMRECORDSCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.AppendStreamRecordsCommandAttributes) + }, +) +_sym_db.RegisterMessage(AppendStreamRecordsCommandAttributes) + +SubscribeStreamCommandAttributes = _reflection.GeneratedProtocolMessageType( + "SubscribeStreamCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAMCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeStreamCommandAttributes) + }, +) +_sym_db.RegisterMessage(SubscribeStreamCommandAttributes) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\032io.temporal.api.command.v1B\014MessageProtoP\001Z%go.temporal.io/api/command/v1;command\252\002\031Temporalio.Api.Command.V1\352\002\034Temporalio::Api::Command::V1" @@ -383,44 +414,48 @@ _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_options = ( b"8\001" ) - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 424 - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1118 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1120 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1192 - _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1194 - _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1299 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1301 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1395 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1397 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1488 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1490 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1538 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1540 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1633 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1636 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1819 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1822 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2125 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2127 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2245 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2247 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2343 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2346 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2665 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2585 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2665 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2668 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3608 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3611 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4615 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4617 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4671 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4674 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5157 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5107 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5157 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5159 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5233 - _COMMAND._serialized_start = 5236 - _COMMAND._serialized_end = 7547 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 462 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1156 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1158 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1230 + _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1232 + _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1337 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1339 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1433 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1435 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1526 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1528 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1576 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1578 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1671 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1674 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1857 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1860 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2163 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2165 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2283 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2285 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2381 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2384 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2703 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2623 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2703 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2706 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3646 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3649 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4653 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4655 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4709 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4712 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5195 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5145 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5195 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 + _COMMAND._serialized_start = 5274 + _COMMAND._serialized_end = 7806 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7808 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7920 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7922 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 7997 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 18d0abc8b..f623eecfd 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -18,6 +18,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1119,6 +1120,8 @@ class Command(google.protobuf.message.Message): MODIFY_WORKFLOW_PROPERTIES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1209,6 +1212,14 @@ class Command(google.protobuf.message.Message): def request_cancel_nexus_operation_command_attributes( self, ) -> global___RequestCancelNexusOperationCommandAttributes: ... + @property + def append_stream_records_command_attributes( + self, + ) -> global___AppendStreamRecordsCommandAttributes: ... + @property + def subscribe_stream_command_attributes( + self, + ) -> global___SubscribeStreamCommandAttributes: ... def __init__( self, *, @@ -1253,10 +1264,16 @@ class Command(google.protobuf.message.Message): | None = ..., request_cancel_nexus_operation_command_attributes: global___RequestCancelNexusOperationCommandAttributes | None = ..., + append_stream_records_command_attributes: global___AppendStreamRecordsCommandAttributes + | None = ..., + subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "append_stream_records_command_attributes", + b"append_stream_records_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1291,6 +1308,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1300,6 +1319,8 @@ class Command(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "append_stream_records_command_attributes", + b"append_stream_records_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1338,6 +1359,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1365,8 +1388,90 @@ class Command(google.protobuf.message.Message): "modify_workflow_properties_command_attributes", "schedule_nexus_operation_command_attributes", "request_cancel_nexus_operation_command_attributes", + "append_stream_records_command_attributes", + "subscribe_stream_command_attributes", ] | None ): ... global___Command = Command + +class AppendStreamRecordsCommandAttributes(google.protobuf.message.Message): + """Appends records to a stream the Workflow owns. Applied inside the Workflow + Task's own commit. Produces one `WorkflowStreamRecordsAppended` event + carrying the offset range and none of the payload; it schedules no further + work. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the Workflow's default output stream.""" + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: + """Stored in order. The server sets `producer_id` to empty on each record, + because the owning Workflow is the producer here. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "records", b"records", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AppendStreamRecordsCommandAttributes = AppendStreamRecordsCommandAttributes + +class SubscribeStreamCommandAttributes(google.protobuf.message.Message): + """Subscribe this Workflow to a stream, so later Workflow Tasks carry the ranges + it has not consumed yet. + + The stream's addressing is resolved by the server rather than supplied here. + A Workflow cannot look it up without doing I/O, and a value it carried would + be a reading rather than a fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Stream to consume. A stream in another execution is addressed by its id; + one this Workflow owns is addressed by the name it was published under. + The server resolves an owned name first and falls back to a standalone + id, so a Workflow that owns a stream under this name cannot reach a + standalone stream with the same id. + """ + start_offset: builtins.int + """Where to start. Negative means from wherever the stream is when the + subscription is registered, which the server resolves and records so + replay does not resolve it again. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 6d1c3b6e5..17f70d8a6 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x9c\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe7\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -39,11 +39,13 @@ COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES = 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION = 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 +COMMAND_TYPE_APPEND_STREAM_RECORDS = 19 +COMMAND_TYPE_SUBSCRIBE_STREAM = 20 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 864 + _COMMANDTYPE._serialized_end = 939 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 9f1bfd240..c6f21ab4b 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -44,6 +44,8 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: _CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: _CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 + COMMAND_TYPE_APPEND_STREAM_RECORDS: _CommandType.ValueType # 19 + COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -66,4 +68,6 @@ COMMAND_TYPE_PROTOCOL_MESSAGE: CommandType.ValueType # 14 COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 +COMMAND_TYPE_APPEND_STREAM_RECORDS: CommandType.ValueType # 19 +COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 14ff7984d..a41b486ee 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\x9e\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -82,11 +82,13 @@ EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58 EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59 EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 +EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED = 62 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 2912 + _EVENTTYPE._serialized_end = 3004 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 16a23b137..84db38b61 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -216,6 +216,16 @@ class _EventTypeEnumTypeWrapper( """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: _EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" + EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: _EventType.ValueType # 61 + """A Workflow subscribed to a stream. Recorded once per subscription, not + per record: the offsets a task consumed ride WorkflowTaskCompleted and + the payloads never enter History at all. + """ + EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: _EventType.ValueType # 62 + """A Workflow appended a batch of records to a stream. Recorded per + batch, and carrying only the offset range it landed at: the bodies go to + the stream's own log, never into History. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -408,4 +418,14 @@ EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: EventType.ValueType # 59 """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: EventType.ValueType # 61 +"""A Workflow subscribed to a stream. Recorded once per subscription, not +per record: the offsets a task consumed ride WorkflowTaskCompleted and +the payloads never enter History at all. +""" +EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: EventType.ValueType # 62 +"""A Workflow appended a batch of records to a stream. Recorded per +batch, and carrying only the offset range it landed at: the bodies go to +the stream's own log, never into History. +""" global___EventType = EventType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 03eb094f9..70229ee81 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x90\x14\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _WORKFLOWTASKFAILEDCAUSE = DESCRIPTOR.enum_types_by_name["WorkflowTaskFailedCause"] @@ -86,6 +86,9 @@ WORKFLOW_TASK_FAILED_CAUSE_EXTERNAL_STORAGE_FAILURE = 38 WORKFLOW_TASK_FAILED_CAUSE_WORKFLOW_PAUSE_REQUESTED_BEFORE_TASK_STARTED = 39 WORKFLOW_TASK_FAILED_CAUSE_REQUEST_TOO_LARGE = 40 +WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES = 41 +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES = 42 +WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE = 43 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS = 1 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND = 2 @@ -117,15 +120,15 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020FailedCauseProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _WORKFLOWTASKFAILEDCAUSE._serialized_start = 68 - _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2644 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2647 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 2967 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2970 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3243 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3246 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3600 - _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3603 - _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4138 - _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4141 - _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4284 + _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2834 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2837 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3157 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3160 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3433 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3436 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3790 + _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3793 + _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4328 + _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4331 + _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4474 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.pyi b/temporalio/api/enums/v1/failed_cause_pb2.pyi index be1c22442..c90da0713 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.pyi +++ b/temporalio/api/enums/v1/failed_cause_pb2.pyi @@ -188,6 +188,21 @@ class _WorkflowTaskFailedCauseEnumTypeWrapper( _WorkflowTaskFailedCause.ValueType ) # 40 """A workflow task failed because the request exceeded a size limit.""" + WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 41 + """A workflow task completed with an invalid AppendStreamRecords command.""" + WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 42 + """A workflow task completed with an invalid SubscribeStream command.""" + WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( + _WorkflowTaskFailedCause.ValueType + ) # 43 + """A workflow task could not be started because a stream range it consumed and recorded in + History can no longer be served, for example after truncation or because it exceeds the + replay bound. Check the workflow task failure message for more information. + """ class WorkflowTaskFailedCause( _WorkflowTaskFailedCause, metaclass=_WorkflowTaskFailedCauseEnumTypeWrapper @@ -346,6 +361,21 @@ WORKFLOW_TASK_FAILED_CAUSE_WORKFLOW_PAUSE_REQUESTED_BEFORE_TASK_STARTED: ( """A workflow task is failed because the workflow is paused before the task is started.""" WORKFLOW_TASK_FAILED_CAUSE_REQUEST_TOO_LARGE: WorkflowTaskFailedCause.ValueType # 40 """A workflow task failed because the request exceeded a size limit.""" +WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 41 +"""A workflow task completed with an invalid AppendStreamRecords command.""" +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 42 +"""A workflow task completed with an invalid SubscribeStream command.""" +WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( + WorkflowTaskFailedCause.ValueType +) # 43 +"""A workflow task could not be started because a stream range it consumed and recorded in +History can no longer be served, for example after truncation or because it exceeds the +replay bound. Check the workflow task failure message for more information. +""" global___WorkflowTaskFailedCause = WorkflowTaskFailedCause class _StartChildWorkflowExecutionFailedCause: diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index ec7f65962..13d56f93a 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -57,6 +57,8 @@ WorkflowExecutionUpdateRejectedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, + WorkflowStreamRecordsAppendedEventAttributes, + WorkflowStreamSubscribedEventAttributes, WorkflowTaskCompletedEventAttributes, WorkflowTaskFailedEventAttributes, WorkflowTaskScheduledEventAttributes, @@ -123,6 +125,8 @@ "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", + "WorkflowStreamRecordsAppendedEventAttributes", + "WorkflowStreamSubscribedEventAttributes", "WorkflowTaskCompletedEventAttributes", "WorkflowTaskFailedEventAttributes", "WorkflowTaskScheduledEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index ac337b708..14b3cbfb9 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -47,6 +47,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -58,7 +61,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\x82\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xca?\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -215,6 +218,12 @@ _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "ActivityPropertiesModifiedExternallyEventAttributes" ] +_WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamSubscribedEventAttributes" +] +_WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamRecordsAppendedEventAttributes" +] _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionUpdateAcceptedEventAttributes" ] @@ -819,6 +828,28 @@ ) _sym_db.RegisterMessage(ActivityPropertiesModifiedExternallyEventAttributes) +WorkflowStreamSubscribedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamSubscribedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) + +WorkflowStreamRecordsAppendedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamRecordsAppendedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamRecordsAppendedEventAttributes) + WorkflowExecutionUpdateAcceptedEventAttributes = ( _reflection.GeneratedProtocolMessageType( "WorkflowExecutionUpdateAcceptedEventAttributes", @@ -1210,140 +1241,144 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 663 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3057 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3060 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3196 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3199 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3364 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3367 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3586 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3589 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3717 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3720 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4653 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4656 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4828 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4831 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5247 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5250 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5892 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5895 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6044 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6047 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6438 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6441 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7147 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7150 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7436 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7439 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7671 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7674 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 7960 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 7963 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8161 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8163 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8277 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8280 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8554 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8557 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8704 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8706 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8777 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8780 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 8914 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8917 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9116 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9119 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9254 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9257 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9618 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9538 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9618 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9621 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 9940 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 9943 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10072 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10075 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5999 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6002 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6151 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6154 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6545 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6548 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7254 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7257 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7543 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7546 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7778 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7781 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8067 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8070 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8268 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8270 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8384 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8387 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8661 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8664 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8811 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8813 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8884 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8887 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9021 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9024 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9223 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9226 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9361 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9364 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9725 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9645 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9725 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9728 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10047 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10050 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10179 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10182 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10359 + 10466 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10362 + 10469 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10708 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10711 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 10908 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10911 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11290 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11293 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11632 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11635 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11846 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11849 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12007 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12010 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12148 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12151 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13427 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13430 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13772 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13775 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14070 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14073 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14398 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14401 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14780 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14783 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15108 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15111 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15441 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15444 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15720 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15723 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16453 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16303 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16453 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16456 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16776 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16779 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16923 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 16926 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17146 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17319 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17322 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17593 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17596 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 17760 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 17762 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 17856 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 17858 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 17954 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 17957 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18154 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18157 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 18721 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 18671 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 18721 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 18724 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 18861 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 18864 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19001 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19004 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19140 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19143 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19281 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19284 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19422 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19424 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19540 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19543 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 19694 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 19697 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 19896 - _HISTORYEVENT._serialized_start = 19899 - _HISTORYEVENT._serialized_end = 28037 - _HISTORY._serialized_start = 28039 - _HISTORY._serialized_end = 28103 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10815 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10818 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11015 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11018 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11397 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11400 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11739 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11742 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11953 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11956 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12114 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12117 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12255 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12258 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13534 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13537 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13879 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13882 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14177 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14180 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14505 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14508 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14887 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14890 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15215 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15218 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15548 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15551 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15827 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15830 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16560 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16410 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16560 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16563 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16883 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16886 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17030 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17032 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17156 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17159 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17310 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17313 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17533 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17536 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17706 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17709 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17980 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17983 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18147 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18149 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18243 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18245 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18341 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18344 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18541 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18544 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19108 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19058 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19108 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19111 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19248 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19251 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19388 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19391 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19527 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19530 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19668 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19671 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19809 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19811 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19927 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19930 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20081 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20084 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20283 + _HISTORYEVENT._serialized_start = 20286 + _HISTORYEVENT._serialized_end = 28678 + _HISTORY._serialized_start = 28680 + _HISTORY._serialized_end = 28744 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 783e9d3b6..bc708a6cb 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -23,6 +23,7 @@ import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1010,6 +1011,7 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): WORKER_DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int WORKER_DEPLOYMENT_NAME_FIELD_NUMBER: builtins.int DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int + CONSUMED_STREAM_RANGES_FIELD_NUMBER: builtins.int scheduled_event_id: builtins.int """The id of the `WORKFLOW_TASK_SCHEDULED` event this task corresponds to""" started_event_id: builtins.int @@ -1069,6 +1071,18 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): """The Worker Deployment Version that completed this task. Must be set if `versioning_behavior` is set. This value updates workflow execution's `versioning_info.deployment_version`. """ + @property + def consumed_stream_ranges( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRange + ]: + """Offset ranges this Workflow Task consumed from streams it subscribes to. + Recorded on every task where a subscription is active, including when it + observed nothing: an empty range is a fact replay must reproduce, and + omitting it would let replay deliver records the Workflow did not have. + Numbered 20 to leave 14 through 19 free for fields added on the main line. + """ def __init__( self, *, @@ -1088,6 +1102,10 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): worker_deployment_name: builtins.str = ..., deployment_version: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentVersion | None = ..., + consumed_stream_ranges: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRange + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1109,6 +1127,8 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "binary_checksum", b"binary_checksum", + "consumed_stream_ranges", + b"consumed_stream_ranges", "deployment", b"deployment", "deployment_version", @@ -3603,6 +3623,93 @@ global___ActivityPropertiesModifiedExternallyEventAttributes = ( ActivityPropertiesModifiedExternallyEventAttributes ) +class WorkflowStreamSubscribedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command created this + subscription. + """ + stream_id: builtins.str + """Stream the Workflow subscribed to.""" + start_offset: builtins.int + """The offset the subscription actually starts from. Resolved by the server + when the subscription is registered and recorded here, so replay reads + the resolved value rather than resolving it again against a stream that + has since moved. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamSubscribedEventAttributes = ( + WorkflowStreamSubscribedEventAttributes +) + +class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + RECORD_COUNT_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command appended this + batch. + """ + stream_id: builtins.str + """Stream the Workflow appended to.""" + first_offset: builtins.int + """Offset the first record of the batch landed at.""" + record_count: builtins.int + """How many records the batch held. With first_offset this names the range + without carrying any of it, which is what keeps this event a fixed size + no matter how large the batch or its payloads are. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + first_offset: builtins.int = ..., + record_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "first_offset", + b"first_offset", + "record_count", + b"record_count", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamRecordsAppendedEventAttributes = ( + WorkflowStreamRecordsAppendedEventAttributes +) + class WorkflowExecutionUpdateAcceptedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4460,6 +4567,8 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( builtins.int ) + WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_RECORDS_APPENDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4745,6 +4854,14 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_execution_time_skipping_transitioned_event_attributes( self, ) -> global___WorkflowExecutionTimeSkippingTransitionedEventAttributes: ... + @property + def workflow_stream_subscribed_event_attributes( + self, + ) -> global___WorkflowStreamSubscribedEventAttributes: ... + @property + def workflow_stream_records_appended_event_attributes( + self, + ) -> global___WorkflowStreamRecordsAppendedEventAttributes: ... def __init__( self, *, @@ -4882,6 +4999,10 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_execution_time_skipping_transitioned_event_attributes: global___WorkflowExecutionTimeSkippingTransitionedEventAttributes | None = ..., + workflow_stream_subscribed_event_attributes: global___WorkflowStreamSubscribedEventAttributes + | None = ..., + workflow_stream_records_appended_event_attributes: global___WorkflowStreamRecordsAppendedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5004,6 +5125,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_records_appended_event_attributes", + b"workflow_stream_records_appended_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5151,6 +5276,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_records_appended_event_attributes", + b"workflow_stream_records_appended_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5227,6 +5356,8 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_paused_event_attributes", "workflow_execution_unpaused_event_attributes", "workflow_execution_time_skipping_transitioned_event_attributes", + "workflow_stream_subscribed_event_attributes", + "workflow_stream_records_appended_event_attributes", ] | None ): ... diff --git a/temporalio/api/stream/__init__.py b/temporalio/api/stream/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py new file mode 100644 index 000000000..9d54188ec --- /dev/null +++ b/temporalio/api/stream/v1/__init__.py @@ -0,0 +1,8 @@ +from .message_pb2 import StreamRange, StreamRecord, StreamRecordKind, StreamSlice + +__all__ = [ + "StreamRange", + "StreamRecord", + "StreamRecordKind", + "StreamSlice", +] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py new file mode 100644 index 000000000..c28393a50 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/stream/v1/message.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xd4\x02\n\x0cStreamRecord\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x44\n\x08metadata\x18\x02 \x03(\x0b\x32\x32.temporal.api.stream.v1.StreamRecord.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x36\n\x04kind\x18\x04 \x01(\x0e\x32(.temporal.api.stream.v1.StreamRecordKind\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x03\x12\x10\n\x08sequence\x18\x07 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xb9\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x35\n\x07records\x18\x05 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"H\n\x0bStreamRange\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03*r\n\x10StreamRecordKind\x12"\n\x1eSTREAM_RECORD_KIND_UNSPECIFIED\x10\x00\x12\x1b\n\x17STREAM_RECORD_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_RECORD_KIND_FINISH\x10\x02\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' +) + +_STREAMRECORDKIND = DESCRIPTOR.enum_types_by_name["StreamRecordKind"] +StreamRecordKind = enum_type_wrapper.EnumTypeWrapper(_STREAMRECORDKIND) +STREAM_RECORD_KIND_UNSPECIFIED = 0 +STREAM_RECORD_KIND_DATA = 1 +STREAM_RECORD_KIND_FINISH = 2 + + +_STREAMRECORD = DESCRIPTOR.message_types_by_name["StreamRecord"] +_STREAMRECORD_METADATAENTRY = _STREAMRECORD.nested_types_by_name["MetadataEntry"] +_STREAMSLICE = DESCRIPTOR.message_types_by_name["StreamSlice"] +_STREAMRANGE = DESCRIPTOR.message_types_by_name["StreamRange"] +StreamRecord = _reflection.GeneratedProtocolMessageType( + "StreamRecord", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _STREAMRECORD_METADATAENTRY, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRecord.MetadataEntry) + }, + ), + "DESCRIPTOR": _STREAMRECORD, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRecord) + }, +) +_sym_db.RegisterMessage(StreamRecord) +_sym_db.RegisterMessage(StreamRecord.MetadataEntry) + +StreamSlice = _reflection.GeneratedProtocolMessageType( + "StreamSlice", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSLICE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }, +) +_sym_db.RegisterMessage(StreamSlice) + +StreamRange = _reflection.GeneratedProtocolMessageType( + "StreamRange", + (_message.Message,), + { + "DESCRIPTOR": _STREAMRANGE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRange) + }, +) +_sym_db.RegisterMessage(StreamRange) + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1" + _STREAMRECORD_METADATAENTRY._options = None + _STREAMRECORD_METADATAENTRY._serialized_options = b"8\001" + _STREAMRECORDKIND._serialized_start = 707 + _STREAMRECORDKIND._serialized_end = 821 + _STREAMRECORD._serialized_start = 103 + _STREAMRECORD._serialized_end = 443 + _STREAMRECORD_METADATAENTRY._serialized_start = 363 + _STREAMRECORD_METADATAENTRY._serialized_end = 443 + _STREAMSLICE._serialized_start = 446 + _STREAMSLICE._serialized_end = 631 + _STREAMRANGE._serialized_start = 633 + _STREAMRANGE._serialized_end = 705 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi new file mode 100644 index 000000000..74a6d4a75 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -0,0 +1,267 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys +import typing + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamRecordKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamRecordKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamRecordKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_RECORD_KIND_UNSPECIFIED: _StreamRecordKind.ValueType # 0 + """Read as DATA.""" + STREAM_RECORD_KIND_DATA: _StreamRecordKind.ValueType # 1 + """A value the producer published; `body` carries it.""" + STREAM_RECORD_KIND_FINISH: _StreamRecordKind.ValueType # 2 + """The producer named by `producer_id` writes nothing more on `topic`. + Says nothing about that producer's outcome and does not end the stream. + """ + +class StreamRecordKind(_StreamRecordKind, metaclass=_StreamRecordKindEnumTypeWrapper): + """What a record means to a reader. Kept on the record itself so every store + and every language reads it the same way without a private envelope. + """ + +STREAM_RECORD_KIND_UNSPECIFIED: StreamRecordKind.ValueType # 0 +"""Read as DATA.""" +STREAM_RECORD_KIND_DATA: StreamRecordKind.ValueType # 1 +"""A value the producer published; `body` carries it.""" +STREAM_RECORD_KIND_FINISH: StreamRecordKind.ValueType # 2 +"""The producer named by `producer_id` writes nothing more on `topic`. +Says nothing about that producer's outcome and does not end the stream. +""" +global___StreamRecordKind = StreamRecordKind + +class StreamRecord(google.protobuf.message.Message): + """One entry in a stream. The record is the wire format: stores keep it + serialized as is and readers in every language decode the same bytes. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: + """The value the producer published, stored as sent. A payload codec + applies here as it does to any other payload. + """ + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance, stored as sent.""" + topic: builtins.str + """Producer-supplied grouping label, stored as sent.""" + kind: global___StreamRecordKind.ValueType + """How to read this record. Unspecified is read as DATA.""" + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did.""" + attempt: builtins.int + """The producer's attempt. Readers treat a later attempt by the same + producer as superseding what the earlier one wrote. + """ + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. + Stored as sent; the server does not assign, validate or order by it. + """ + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + kind: global___StreamRecordKind.ValueType = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., + sequence: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "attempt", + b"attempt", + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "topic", + b"topic", + ], + ) -> None: ... + +global___StreamRecord = StreamRecord + +class StreamSlice(google.protobuf.message.Message): + """A contiguous range of a stream delivered to a Workflow Task, along with the + offsets it covers. The offsets are what History records; the records + themselves are never written to History. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + """Run id of the execution that owns the stream. Set on both a slice for the + task being started and a re-supplied one. + """ + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription observed nothing, + which is a fact replay has to reproduce rather than an absence of one. + """ + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamRecord + ]: ... + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event whose consumed_stream_ranges recorded + this range. Set only when the server is re-supplying a range for a task + being replayed; a slice for the task now being started leaves it unset, + because the event closing that task does not exist yet. + + Replay needs this because a Workflow Task response carries one slice set + while a cache miss replays every prior task, so the ranges have to be + matched to the events that recorded them rather than to the response. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + records: collections.abc.Iterable[global___StreamRecord] | None = ..., + workflow_task_completed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "records", + b"records", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___StreamSlice = StreamSlice + +class StreamRange(google.protobuf.message.Message): + """The offsets a Workflow Task consumed, without the payloads. Recorded on + WorkflowTaskCompleted so History grows with Workflow Tasks rather than with + records. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive.""" + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___StreamRange = StreamRange diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index e1b2e01c4..cdf2becc2 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -114,6 +114,9 @@ from temporalio.api.sdk.v1 import ( worker_config_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_worker__config__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -131,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xbf\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4214,578 +4217,578 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1646 - _REGISTERNAMESPACEREQUEST._serialized_end = 2294 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2251 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2294 - _REGISTERNAMESPACERESPONSE._serialized_start = 2296 - _REGISTERNAMESPACERESPONSE._serialized_end = 2323 - _LISTNAMESPACESREQUEST._serialized_start = 2326 - _LISTNAMESPACESREQUEST._serialized_end = 2463 - _LISTNAMESPACESRESPONSE._serialized_start = 2466 - _LISTNAMESPACESRESPONSE._serialized_end = 2595 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2597 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2680 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2683 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3196 - _UPDATENAMESPACEREQUEST._serialized_start = 3199 - _UPDATENAMESPACEREQUEST._serialized_end = 3534 - _UPDATENAMESPACERESPONSE._serialized_start = 3537 - _UPDATENAMESPACERESPONSE._serialized_end = 3828 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3830 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3900 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3902 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3930 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3933 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5550 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5553 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5851 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5854 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6152 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6155 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6341 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6344 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6520 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6522 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6642 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6645 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7085 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7088 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8175 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8091 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8175 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8178 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9350 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9445 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9447 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9519 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9764 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9767 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10292 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10294 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10329 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10332 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10818 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10821 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12002 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12005 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12170 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12172 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12284 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12287 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12494 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12496 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12612 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12615 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 12997 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 12999 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13037 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13040 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13247 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13249 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13291 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13294 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13740 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13742 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13829 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13832 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14103 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14105 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14196 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14199 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14581 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14583 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14620 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14623 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 14911 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 14913 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 14954 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 14957 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15217 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15219 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15259 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15262 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15612 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15614 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15691 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15694 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17033 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17036 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17194 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17197 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17646 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17648 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17696 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17699 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 17986 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 17988 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18024 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18026 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18148 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18150 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18183 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18186 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18515 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18518 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18648 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18651 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19180 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19182 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19291 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19293 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19419 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19421 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19538 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19541 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19675 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19677 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19786 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19788 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19914 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19916 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19982 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19985 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20222 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20224 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20252 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20255 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20456 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20372 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20456 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20459 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20820 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20822 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20857 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20859 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 20969 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 20971 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21001 - _SHUTDOWNWORKERREQUEST._serialized_start = 21004 - _SHUTDOWNWORKERREQUEST._serialized_end = 21287 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21289 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21313 - _QUERYWORKFLOWREQUEST._serialized_start = 21316 - _QUERYWORKFLOWREQUEST._serialized_end = 21549 - _QUERYWORKFLOWRESPONSE._serialized_start = 21552 - _QUERYWORKFLOWRESPONSE._serialized_end = 21737 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21739 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21854 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21857 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22522 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22525 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23053 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23056 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24060 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23842 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 23958 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 23960 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24060 - _GETCLUSTERINFOREQUEST._serialized_start = 24062 - _GETCLUSTERINFOREQUEST._serialized_end = 24085 - _GETCLUSTERINFORESPONSE._serialized_start = 24088 - _GETCLUSTERINFORESPONSE._serialized_end = 24553 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24498 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24553 - _GETSYSTEMINFOREQUEST._serialized_start = 24555 - _GETSYSTEMINFOREQUEST._serialized_end = 24577 - _GETSYSTEMINFORESPONSE._serialized_start = 24580 - _GETSYSTEMINFORESPONSE._serialized_end = 25157 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24721 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25157 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25159 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25268 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25271 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25494 - _CREATESCHEDULEREQUEST._serialized_start = 25497 - _CREATESCHEDULEREQUEST._serialized_end = 25829 - _CREATESCHEDULERESPONSE._serialized_start = 25831 - _CREATESCHEDULERESPONSE._serialized_end = 25879 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25881 - _DESCRIBESCHEDULEREQUEST._serialized_end = 25946 - _DESCRIBESCHEDULERESPONSE._serialized_start = 25949 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26220 - _UPDATESCHEDULEREQUEST._serialized_start = 26223 - _UPDATESCHEDULEREQUEST._serialized_end = 26515 - _UPDATESCHEDULERESPONSE._serialized_start = 26517 - _UPDATESCHEDULERESPONSE._serialized_end = 26541 - _PATCHSCHEDULEREQUEST._serialized_start = 26544 - _PATCHSCHEDULEREQUEST._serialized_end = 26700 - _PATCHSCHEDULERESPONSE._serialized_start = 26702 - _PATCHSCHEDULERESPONSE._serialized_end = 26725 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26728 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26896 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26898 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 26981 - _DELETESCHEDULEREQUEST._serialized_start = 26983 - _DELETESCHEDULEREQUEST._serialized_end = 27064 - _DELETESCHEDULERESPONSE._serialized_start = 27066 - _DELETESCHEDULERESPONSE._serialized_end = 27090 - _LISTSCHEDULESREQUEST._serialized_start = 27092 - _LISTSCHEDULESREQUEST._serialized_end = 27200 - _LISTSCHEDULESRESPONSE._serialized_start = 27202 - _LISTSCHEDULESRESPONSE._serialized_end = 27314 - _COUNTSCHEDULESREQUEST._serialized_start = 27316 - _COUNTSCHEDULESREQUEST._serialized_end = 27373 - _COUNTSCHEDULESRESPONSE._serialized_start = 27376 - _COUNTSCHEDULESRESPONSE._serialized_end = 27595 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27598 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28244 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28045 + _REGISTERNAMESPACEREQUEST._serialized_start = 1684 + _REGISTERNAMESPACEREQUEST._serialized_end = 2332 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 + _REGISTERNAMESPACERESPONSE._serialized_start = 2334 + _REGISTERNAMESPACERESPONSE._serialized_end = 2361 + _LISTNAMESPACESREQUEST._serialized_start = 2364 + _LISTNAMESPACESREQUEST._serialized_end = 2501 + _LISTNAMESPACESRESPONSE._serialized_start = 2504 + _LISTNAMESPACESRESPONSE._serialized_end = 2633 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 + _UPDATENAMESPACEREQUEST._serialized_start = 3237 + _UPDATENAMESPACEREQUEST._serialized_end = 3572 + _UPDATENAMESPACERESPONSE._serialized_start = 3575 + _UPDATENAMESPACERESPONSE._serialized_end = 3866 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 + _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 + _SHUTDOWNWORKERREQUEST._serialized_start = 21102 + _SHUTDOWNWORKERREQUEST._serialized_end = 21385 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 + _QUERYWORKFLOWREQUEST._serialized_start = 21414 + _QUERYWORKFLOWREQUEST._serialized_end = 21647 + _QUERYWORKFLOWRESPONSE._serialized_start = 21650 + _QUERYWORKFLOWRESPONSE._serialized_end = 21835 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 + _GETCLUSTERINFOREQUEST._serialized_start = 24160 + _GETCLUSTERINFOREQUEST._serialized_end = 24183 + _GETCLUSTERINFORESPONSE._serialized_start = 24186 + _GETCLUSTERINFORESPONSE._serialized_end = 24651 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 + _GETSYSTEMINFOREQUEST._serialized_start = 24653 + _GETSYSTEMINFOREQUEST._serialized_end = 24675 + _GETSYSTEMINFORESPONSE._serialized_start = 24678 + _GETSYSTEMINFORESPONSE._serialized_end = 25255 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 + _CREATESCHEDULEREQUEST._serialized_start = 25595 + _CREATESCHEDULEREQUEST._serialized_end = 25927 + _CREATESCHEDULERESPONSE._serialized_start = 25929 + _CREATESCHEDULERESPONSE._serialized_end = 25977 + _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 + _UPDATESCHEDULEREQUEST._serialized_start = 26321 + _UPDATESCHEDULEREQUEST._serialized_end = 26613 + _UPDATESCHEDULERESPONSE._serialized_start = 26615 + _UPDATESCHEDULERESPONSE._serialized_end = 26639 + _PATCHSCHEDULEREQUEST._serialized_start = 26642 + _PATCHSCHEDULEREQUEST._serialized_end = 26798 + _PATCHSCHEDULERESPONSE._serialized_start = 26800 + _PATCHSCHEDULERESPONSE._serialized_end = 26823 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 + _DELETESCHEDULEREQUEST._serialized_start = 27081 + _DELETESCHEDULEREQUEST._serialized_end = 27162 + _DELETESCHEDULERESPONSE._serialized_start = 27164 + _DELETESCHEDULERESPONSE._serialized_end = 27188 + _LISTSCHEDULESREQUEST._serialized_start = 27190 + _LISTSCHEDULESREQUEST._serialized_end = 27298 + _LISTSCHEDULESRESPONSE._serialized_start = 27300 + _LISTSCHEDULESRESPONSE._serialized_end = 27412 + _COUNTSCHEDULESREQUEST._serialized_start = 27414 + _COUNTSCHEDULESREQUEST._serialized_end = 27471 + _COUNTSCHEDULESRESPONSE._serialized_start = 27474 + _COUNTSCHEDULESRESPONSE._serialized_end = 27693 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28156 + 28254 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28158 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28231 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28246 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28310 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28312 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28407 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28409 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28525 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28528 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30245 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29580 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29693 + 29791 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29696 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29825 + 29923 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29827 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29891 + 29989 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29893 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 29999 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30001 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30111 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30113 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30175 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30177 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30232 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30248 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30500 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30502 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30574 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30577 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30826 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30829 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 30985 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 30987 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31101 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31104 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31365 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31368 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31627 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31630 - _STARTBATCHOPERATIONREQUEST._serialized_end = 32996 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 32998 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33027 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33029 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33125 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33127 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33155 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33157 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33223 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33226 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33698 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33700 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33791 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33793 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 33914 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 33917 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34102 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34105 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34324 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34327 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34743 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34746 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35100 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35103 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35270 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35272 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35307 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35310 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35530 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35532 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35564 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35567 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 35939 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35733 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 35939 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 35942 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36274 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36068 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36274 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36277 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36613 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36616 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 36935 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 36937 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37037 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37039 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37148 - _PAUSEACTIVITYREQUEST._serialized_start = 37151 - _PAUSEACTIVITYREQUEST._serialized_end = 37350 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37353 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37536 - _PAUSEACTIVITYRESPONSE._serialized_start = 37538 - _PAUSEACTIVITYRESPONSE._serialized_end = 37561 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37563 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37595 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37598 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37878 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37881 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38154 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38156 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38181 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38183 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38217 - _RESETACTIVITYREQUEST._serialized_start = 38220 - _RESETACTIVITYREQUEST._serialized_end = 38527 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38530 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38820 - _RESETACTIVITYRESPONSE._serialized_start = 38822 - _RESETACTIVITYRESPONSE._serialized_end = 38845 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38847 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38879 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38882 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39166 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39169 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39346 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39348 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39454 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39456 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39553 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39556 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39750 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39753 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40014 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40407 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40484 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40487 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40627 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40629 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40737 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40739 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40858 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40861 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41066 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41069 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41254 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41257 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41486 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41489 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 41932 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 41935 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42159 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42161 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42274 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42276 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42332 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42334 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42427 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42430 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43101 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42605 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43101 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43104 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43344 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43346 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43385 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43388 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43588 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43590 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43629 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43631 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43724 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43726 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43758 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43761 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44279 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44331 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44334 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44834 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44836 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44890 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44893 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45311 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45226 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 + _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 + _PAUSEACTIVITYREQUEST._serialized_start = 37249 + _PAUSEACTIVITYREQUEST._serialized_end = 37448 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 + _PAUSEACTIVITYRESPONSE._serialized_start = 37636 + _PAUSEACTIVITYRESPONSE._serialized_end = 37659 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 + _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 + _RESETACTIVITYREQUEST._serialized_start = 38318 + _RESETACTIVITYREQUEST._serialized_end = 38625 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 + _RESETACTIVITYRESPONSE._serialized_start = 38920 + _RESETACTIVITYRESPONSE._serialized_end = 38943 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 + _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 + _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45311 + 45409 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45313 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45423 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45426 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45615 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45617 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45716 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45718 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45787 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45789 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45896 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45898 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46011 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46014 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46241 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46244 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46424 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46426 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46521 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46523 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46588 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46590 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46671 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46673 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46736 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46738 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46766 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46768 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46838 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46840 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 46944 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 46947 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47153 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47155 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47201 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47204 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47359 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47361 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47392 - _LISTWORKERSREQUEST._serialized_start = 47395 - _LISTWORKERSREQUEST._serialized_end = 47525 - _LISTWORKERSRESPONSE._serialized_start = 47528 - _LISTWORKERSRESPONSE._serialized_end = 47693 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47696 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48421 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48263 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48354 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 + _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 + _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 + _LISTWORKERSREQUEST._serialized_start = 47493 + _LISTWORKERSREQUEST._serialized_end = 47623 + _LISTWORKERSRESPONSE._serialized_start = 47626 + _LISTWORKERSRESPONSE._serialized_end = 47791 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48356 + 48454 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48421 + 48519 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48423 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48514 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48517 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48675 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48677 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48762 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48765 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49031 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49033 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49133 - _DESCRIBEWORKERREQUEST._serialized_start = 49135 - _DESCRIBEWORKERREQUEST._serialized_end = 49206 - _DESCRIBEWORKERRESPONSE._serialized_start = 49208 - _DESCRIBEWORKERRESPONSE._serialized_end = 49289 - _COUNTWORKERSREQUEST._serialized_start = 49291 - _COUNTWORKERSREQUEST._serialized_end = 49378 - _COUNTWORKERSRESPONSE._serialized_start = 49380 - _COUNTWORKERSRESPONSE._serialized_end = 49417 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49420 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49561 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49563 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49595 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49598 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49741 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49743 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49777 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49780 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 50957 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 50959 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51068 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51071 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51299 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51302 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51618 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51620 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51706 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51708 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51824 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51826 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 51935 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 51938 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52068 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52071 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52870 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 52922 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 52993 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52996 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53166 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53169 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53480 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53483 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53644 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53647 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53908 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 53910 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54025 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54028 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54167 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54169 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54235 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54238 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54475 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54477 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54552 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54801 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54804 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 54953 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 54955 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 54995 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 54998 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55143 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55145 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55181 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55183 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55271 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55273 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55306 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55309 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55465 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55467 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55513 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55516 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55668 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55670 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55712 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55714 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55809 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55811 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55850 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55853 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56010 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56013 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56245 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 + _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 + _DESCRIBEWORKERREQUEST._serialized_start = 49233 + _DESCRIBEWORKERREQUEST._serialized_end = 49304 + _DESCRIBEWORKERRESPONSE._serialized_start = 49306 + _DESCRIBEWORKERRESPONSE._serialized_end = 49387 + _COUNTWORKERSREQUEST._serialized_start = 49389 + _COUNTWORKERSREQUEST._serialized_end = 49476 + _COUNTWORKERSRESPONSE._serialized_start = 49478 + _COUNTWORKERSRESPONSE._serialized_end = 49515 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index eb9243716..e66c90384 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -46,6 +46,7 @@ import temporalio.api.schedule.v1.message_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.sdk.v1.worker_config_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.version.v1.message_pb2 @@ -1278,6 +1279,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_ID_FIELD_NUMBER: builtins.int POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int + STREAM_SLICES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1392,6 +1394,15 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): 3. If every group has some pending polls, assign the next poll to a group randomly according to the weights. """ + @property + def stream_slices( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ]: + """Stream data attached to this task. Delivered out of band so the payloads + never enter History; only the offset ranges are recorded there. + """ def __init__( self, *, @@ -1427,6 +1438,10 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): | None = ..., poller_groups_info: temporalio.api.taskqueue.v1.message_pb2.PollerGroupsInfo | None = ..., + stream_slices: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1484,6 +1499,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"started_event_id", "started_time", b"started_time", + "stream_slices", + b"stream_slices", "task_token", b"task_token", "workflow_execution", From 4362c3167c5f771699a128548c309e8efea8bd84 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:54:17 -0700 Subject: [PATCH 294/831] Split the stream provider in two and made the proto the record. The registry, its string names and the private frame envelope go. A provider is an object that serves workers as a plugin and hands out handles outside them, and every store keeps the StreamRecord proto. --- temporalio/streams/__init__.py | 204 ++------- temporalio/streams/_frame.py | 72 --- temporalio/streams/_handles.py | 211 --------- temporalio/streams/_ids.py | 19 +- temporalio/streams/_policy.py | 33 +- temporalio/streams/_provider.py | 487 +++++++------------- temporalio/streams/_record.py | 58 ++- temporalio/streams/_wire.py | 181 ++++++++ temporalio/streams/providers/__init__.py | 79 +++- temporalio/streams/providers/memory.py | 545 +++++++++++++---------- 10 files changed, 832 insertions(+), 1057 deletions(-) delete mode 100644 temporalio/streams/_frame.py delete mode 100644 temporalio/streams/_handles.py create mode 100644 temporalio/streams/_wire.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 0b43830cb..30d1f9a98 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -1,69 +1,58 @@ -"""A stream a workflow can read, decide on, and write. +"""Streams: a channel a workflow reads, decides on, and writes. + +.. warning:: + This module is experimental and may change in future versions. The + design is meant to be the shape that goes GA; the label is the SDK's + release convention, not a licence to break it. The contract, in five statements: -1. **A workflow publishes only to its own stream, and it publishes - transactionally.** :meth:`StreamWriter.publish` returns without the record - being visible. The record appears when the workflow task is accepted, and - never if the task fails, so no reader can see a decision the workflow did - not commit. +1. **A workflow publishes only to topics of its own stream, and it publishes + transactionally.** :meth:`temporalio.workflow.StreamWriter.publish` + returns at once. The record is visible when the Workflow Task is accepted, + and never if the task fails, so no reader can see a decision the workflow + did not commit. 2. **Reading is an observation, and the SDK records it.** What - :class:`StreamReader` handed to workflow code, including the boundary where - it found nothing, is committed with the commands that reading produced. - Recovery re-supplies the same records in the same order. -3. **Anything that does I/O publishes on its own account.** An activity, a - local activity, or an outside process writes through :func:`producer`, - either into one of the workflow's inbound streams or onto a topic of the - stream the workflow publishes, and its records are visible as soon as they - are written. It carries a producer id, an attempt and a sequence so a retry - can be told from a new generation. + :class:`temporalio.workflow.StreamReader` handed to workflow code, + including the boundary where it found nothing, is committed with the + commands that reading produced. Recovery re-supplies the same records in + the same order. +3. **Anything that does I/O publishes on its own account.** An activity or an + outside process writes through a :class:`StreamProducer` with a producer + id, an attempt and a sequence, and its records are visible as soon as the + store accepts them. Those three let a reader tell a retry from a new + generation. 4. **A cursor is opaque and belongs to its provider.** Hand it back to resume - after the record it names. Do not compare two cursors or do arithmetic on - one: one provider numbers records with integers and another with a - millisecond-and-sequence pair. A reader that wants to follow from now asks - the consumer for :meth:`Consumer.latest` instead of guessing a position. -5. **A workflow names its streams relative to itself, and the provider - resolves them.** ``reader("inputs")`` is this workflow's inbound stream - called ``inputs``; ``writer("decisions")`` is a topic it publishes on. One - provider stores that as a namespace-level stream id and another as a name - under the run's chain key, and workflow code does not have to know which. - The provider itself is chosen when the worker is built. - -Outside a workflow there is no worker to carry the choice, so a process calls -:func:`configure` once before it opens a :func:`producer` or a -:func:`consumer`, and passes :func:`worker_options` to its ``Worker`` and -``Replayer``. Those two calls are where a provider is named. Nothing else in -this module mentions one. Code that needs a second provider next to the -process default, such as a handler that serves one store while its process -talks to another, holds one from :func:`instance`. - -Three lifecycle hooks let a provider borrow the caller's lifetime, and each -is a no-op on a provider that needs nothing, so portable code calls all -three unconditionally: :func:`prepare` from the workflow's constructor, for a -transport that registers handlers on the workflow; :func:`drain` before the -workflow returns, for one that parks readers against the run; and -:func:`close`, awaited when the process is done with streams, for one that -holds connections. - -Reading somebody else's stream is out of scope for the first release. It is -the topology no provider has evidence for, and leaving it out is what lets -every provider implement the rest. + strictly after the record it names; :meth:`StreamHandle.latest` positions a + follower. Do not compare two cursors or do arithmetic on one. +5. **A workflow addresses its streams relative to itself, by topic.** A topic + can be written by the workflow and by outside producers, and read by the + workflow and by outside consumers; which of those happen is the + application's business. + +Workflow-side entry points live in :mod:`temporalio.workflow`: +:func:`temporalio.workflow.stream_reader` and +:func:`temporalio.workflow.stream_writer`. Outside a workflow, a handle comes +from a provider instance: ``provider.get_stream_handle(client, workflow_id)``. +A provider is an object; when it serves workers it is also a +:class:`temporalio.worker.Plugin`, passed as ``Worker(plugins=[provider])`` +and ``Replayer(plugins=[provider])``. This module keeps the shared types, the +errors and the protocols a provider implements; nothing here that workflow +code imports does I/O. What the contract does not promise: that a :attr:`RecordKind.FINISH` record means the writing activity succeeded, that a superseded attempt's records can be withdrawn, or that a stream outlives the retention its provider is -configured for. +configured for. Reading somebody else's stream is out of scope for this +release. -The public names are the proposal; providers live under -:mod:`temporalio.streams.providers`, one module each, registered by name and -chosen by :func:`configure`. Everything else is shared. +The record on the wire is ``temporal.api.stream.v1.StreamRecord`` on every +provider, with the user's value in ``body`` as an ordinary payload, so a +reader in any language decodes the same bytes and a payload codec applies. """ from __future__ import annotations -from datetime import timedelta -from typing import Any, TypeVar, overload - from temporalio.streams._errors import ( StreamCursorError, StreamError, @@ -71,27 +60,13 @@ StreamProducerError, StreamUnsupportedError, ) -from temporalio.streams._handles import ( - ReadSource, - StreamReader, - StreamWriter, - WriteSink, -) from temporalio.streams._provider import ( - Consumer, - Producer, + ReadSource, + StreamHandle, + StreamProducer, StreamProvider, - StreamProviderLifecycle, - close, - configure, - consumer, - drain, - instance, - open_read, - open_write, - prepare, - producer, - worker_options, + WorkflowStreamProvider, + WriteSink, ) from temporalio.streams._record import ( BEGINNING, @@ -103,100 +78,19 @@ __all__ = [ "BEGINNING", - "Consumer", "Cursor", - "Producer", "ReadSource", "RecordKind", "StreamCursorError", "StreamError", + "StreamHandle", "StreamNotFoundError", + "StreamProducer", "StreamProducerError", "StreamProvider", - "StreamProviderLifecycle", - "StreamReader", "StreamRecord", "StreamUnsupportedError", - "StreamWriter", "Supersession", + "WorkflowStreamProvider", "WriteSink", - "close", - "configure", - "consumer", - "drain", - "instance", - "prepare", - "producer", - "reader", - "worker_options", - "writer", ] - -T = TypeVar("T") - - -@overload -def reader( - stream: str, - *, - type: type[T], - after: Cursor = ..., - idle_timeout: timedelta | None = ..., -) -> StreamReader[T]: ... - - -@overload -def reader( - stream: str, - *, - type: None = None, - after: Cursor = ..., - idle_timeout: timedelta | None = ..., -) -> StreamReader[Any]: ... - - -def reader( - stream: str, - *, - type: type | None = None, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, -) -> StreamReader[Any]: - """Subscribe this workflow to its inbound stream ``stream``. - - Each call is a separate subscription with its own cursor, so adding, - removing or reordering one renumbers the waits after it. Gate a change - behind :func:`temporalio.workflow.patched` as you would for a timer. - - An inbound stream has no topics: its name is the whole address, and - every record on it arrives with an empty ``topic``. Topics belong to the - stream the workflow publishes, which :func:`consumer` reads from outside. - - Args: - stream: The inbound stream's name, relative to this workflow. - type: The value type, used as the decode hint. - after: Resume after this record. Only honoured on the first - subscription of a run, because after that the recorded cursor - decides. - idle_timeout: How long the workflow waits with nothing arriving before - the provider is allowed to release the worker. ``None`` takes the - provider's default. - """ - return StreamReader( - open_read(stream, after=after, idle_timeout=idle_timeout), type=type - ) - - -def writer(topic: str) -> StreamWriter[Any]: - """Publish to ``topic`` on the stream this workflow owns. - - Args: - topic: The topic name. Encoding follows each published value. - """ - return StreamWriter(open_write(topic), topic) - - -# Importing the package registers every provider whose dependencies are -# present in this tree. Import order matters: the registry above must exist -# before a provider module can register with it. -from temporalio.streams import providers as providers # noqa: E402 diff --git a/temporalio/streams/_frame.py b/temporalio/streams/_frame.py deleted file mode 100644 index df4b4dbd6..000000000 --- a/temporalio/streams/_frame.py +++ /dev/null @@ -1,72 +0,0 @@ -"""The record envelope every provider puts on the wire. - -A provider stores an opaque body. The contract needs more than a body: which -topic a record belongs to, whether it is data or a terminal marker, and which -producer attempt wrote it. No provider carries all of that in a channel of -its own, so the interface carries it here and each provider stores the result -as an ordinary body. - -Encoding is synchronous and deterministic because a workflow publishes on the -workflow thread. The header is JSON with sorted keys for that reason, and -because a stored record that a person can read is worth more during an -incident than a few saved bytes. -""" - -from __future__ import annotations - -import json -from typing import Any - -from temporalio.streams._record import RecordKind - -__all__ = ["decode", "encode"] - -_MAGIC = b"tsf1" - - -def encode( - *, - topic: str, - kind: RecordKind, - producer: str, - attempt: int, - sequence: int, - body: bytes, -) -> bytes: - """Wrap one already-encoded body with the contract's metadata.""" - header: dict[str, Any] = {"k": int(kind), "t": topic} - # Omitted rather than written as a default, so a workflow's own publish - # does not carry three fields that only mean something for a producer. - if producer: - header["p"] = producer - if attempt: - header["a"] = attempt - if sequence >= 0: - header["s"] = sequence - raw = json.dumps(header, sort_keys=True, separators=(",", ":")).encode() - return _MAGIC + len(raw).to_bytes(4, "big") + raw + body - - -def decode(frame: bytes) -> tuple[RecordKind, str, str, int, int, bytes]: - """Split a frame into ``(kind, topic, producer, attempt, sequence, body)``. - - Raises: - ValueError: The bytes are not a frame this interface wrote. Reading a - stream someone else populated is a real case, so it fails with a - name rather than an index error. - """ - if len(frame) < 8 or frame[:4] != _MAGIC: - raise ValueError( - "this record was not written through the stream interface, so its " - "topic and producer are unknown" - ) - size = int.from_bytes(frame[4:8], "big") - header = json.loads(frame[8 : 8 + size]) - return ( - RecordKind(header.get("k", int(RecordKind.DATA))), - header.get("t", ""), - header.get("p", ""), - int(header.get("a", 0)), - int(header.get("s", -1)), - frame[8 + size :], - ) diff --git a/temporalio/streams/_handles.py b/temporalio/streams/_handles.py deleted file mode 100644 index 6d821f32c..000000000 --- a/temporalio/streams/_handles.py +++ /dev/null @@ -1,211 +0,0 @@ -"""The handles workflow code holds. - -Everything provider-specific sits behind the two protocols at the top. A -handle converts values, frames records and synthesizes supersession; a -provider only moves bytes. -""" - -from __future__ import annotations - -from collections.abc import AsyncIterator -from typing import Any, Generic, Protocol, TypeVar, cast - -from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.streams import _frame -from temporalio.streams._policy import AttemptTracker -from temporalio.streams._record import Cursor, RecordKind, StreamRecord - -__all__ = ["ReadSource", "StreamReader", "StreamWriter", "WriteSink"] - -T = TypeVar("T") - - -class ReadSource(Protocol): - """One subscription, as a provider supplies it.""" - - async def next_batch(self) -> list[tuple[Cursor, bytes]]: - """The next records, waiting until there is at least one. - - A batch rather than a record because delivery boundaries are what a - provider actually records, and flattening them here keeps that out of - the contract. - - Raises: - StopAsyncIteration: This subscription has ended. - """ - ... - - def close(self) -> None: - """End the subscription. Idempotent.""" - ... - - -class WriteSink(Protocol): - """One topic on the stream the running workflow owns.""" - - async def publish(self, frame: bytes) -> None: - """Accept one framed record into this workflow task's output. - - Awaitable because a provider may hold the publisher back when its - batch is full. It does not mean the record is visible: it becomes - visible when the workflow task is accepted. - """ - ... - - -def _encode_value(value: Any) -> bytes: - converter = workflow.payload_converter() - payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] - return payload.SerializeToString() - - -def _decode_value(body: bytes, as_type: type | None) -> Any: - converter = workflow.payload_converter() - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] - - -class StreamWriter(Generic[T]): - """Publishes to a topic on the stream this workflow owns. - - A workflow can only publish transactionally to a stream it owns, on - every provider. Writing to somebody else's stream is an activity's job, - and it gets the weaker guarantee that goes with doing I/O. - """ - - def __init__(self, sink: WriteSink, topic: str) -> None: - """Prefer :func:`temporalio.streams.writer`.""" - self._sink = sink - self._topic = topic - self._finished = False - - @property - def topic(self) -> str: - """The topic this writer is bound to.""" - return self._topic - - async def publish(self, value: T) -> None: - """Append ``value`` to this topic. - - Returning does not mean the record is visible. It becomes visible when - this workflow task is accepted, and never at all if the task fails, so - a reader cannot see a decision the workflow did not commit. - """ - if self._finished: - raise RuntimeError(f"topic {self._topic!r} was already finished") - await self._sink.publish( - _frame.encode( - topic=self._topic, - kind=RecordKind.DATA, - producer="", - attempt=0, - sequence=-1, - body=_encode_value(value), - ) - ) - - async def finish(self) -> None: - """Declare this topic complete. - - Says the writer has nothing more to send. It does not say the workflow - or the activity behind it succeeded, and a reader that treats it that - way will accept output from an attempt that later timed out. - """ - if self._finished: - return - self._finished = True - await self._sink.publish( - _frame.encode( - topic=self._topic, - kind=RecordKind.FINISH, - producer="", - attempt=0, - sequence=-1, - body=b"", - ) - ) - - -class StreamReader(Generic[T]): - """Reads an inbound stream from inside workflow code. - - Iterating yields every kind of record, including the supersession the - reader synthesizes when a producer's newer attempt appears. Check - ``record.kind``, or use :meth:`values` when the workflow genuinely only - wants data. - """ - - def __init__(self, source: ReadSource, *, type: type | None = None) -> None: - """Prefer :func:`temporalio.streams.reader`.""" - self._source = source - self._type = type - self._pending: list[StreamRecord[Any]] = [] - self._attempts = AttemptTracker() - self._closed = False - - def __aiter__(self) -> AsyncIterator[StreamRecord[T]]: - """Iterate records until the reader is closed.""" - return self._iterate() - - async def _iterate(self) -> AsyncIterator[StreamRecord[T]]: - while not self._closed: - try: - record = await self._next() - except StopAsyncIteration: - # The provider ended the subscription. Iteration stops rather - # than raising, so a workflow that reads to the end of a - # finished stream leaves the loop instead of failing its task. - return - yield record - - async def values(self) -> AsyncIterator[T]: - """Iterate the data values, dropping control records.""" - async for record in self: - if record.kind is RecordKind.DATA: - yield cast("T", record.value) - - async def _next(self) -> StreamRecord[T]: - while not self._pending: - await self._fill() - return self._pending.pop(0) - - async def _fill(self) -> None: - for cursor, frame in await self._source.next_batch(): - try: - kind, topic, producer, attempt, sequence, body = _frame.decode(frame) - except ValueError as error: - # Skipped rather than raised: a poisoned record would - # otherwise fail this task on every retry and pin the - # workflow, while an outside reader of the same stream - # skips it. The two readers agree on the answer. - workflow.logger.warning( - "skipping stream record at %s: %s", cursor, error - ) - continue - superseded = self._attempts.note(producer, attempt, cursor) - if superseded is not None: - self._pending.append(superseded) - self._pending.append( - StreamRecord( - value=( - _decode_value(body, self._type) - if kind is RecordKind.DATA - else None - ), - cursor=cursor, - kind=kind, - topic=topic, - producer=producer, - attempt=attempt, - sequence=sequence, - ) - ) - - def close(self) -> None: - """End the subscription. Idempotent.""" - self._closed = True - self._source.close() diff --git a/temporalio/streams/_ids.py b/temporalio/streams/_ids.py index 5f4161053..2a76dcf19 100644 --- a/temporalio/streams/_ids.py +++ b/temporalio/streams/_ids.py @@ -1,14 +1,14 @@ -"""The store key a provider derives from a workflow id and a stream name. +"""The store key a provider derives from a workflow id and a topic. A workflow id may contain any character, ``:`` included, so joining the pair with a bare ``:`` is ambiguous: ``("a:b", "c")`` and ``("a", "b:c")`` would land in one store. Every provider that keys a store by the pair goes through -:func:`inbound_stream_id`, so they all agree and none of them collides. +:func:`topic_key`, so they all agree and none of them collides. """ from __future__ import annotations -__all__ = ["inbound_stream_id"] +__all__ = ["topic_key"] def _escape(component: str) -> str: @@ -17,15 +17,10 @@ def _escape(component: str) -> str: return component.replace("%", "%25").replace(":", "%3A") -def inbound_stream_id(workflow_id: str, stream: str) -> str: - """The store id for inbound ``stream`` of ``workflow_id``. - - With an empty ``stream`` it is the id of the stream the workflow itself - publishes, so one function keys both. +def topic_key(workflow_id: str, topic: str) -> str: + """The store key for ``topic`` of ``workflow_id``'s stream. Both components are percent-encoded before joining, so the only bare ``:`` - in the result is the separator, and an owner-stream key has none. + in the result is the separator. """ - if not stream: - return _escape(workflow_id) - return f"{_escape(workflow_id)}:{_escape(stream)}" + return f"{_escape(workflow_id)}:{_escape(topic)}" diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py index 73114bbdb..81949e4fc 100644 --- a/temporalio/streams/_policy.py +++ b/temporalio/streams/_policy.py @@ -12,6 +12,8 @@ from __future__ import annotations +from typing import Any + from temporalio.streams._record import ( Cursor, RecordKind, @@ -30,28 +32,35 @@ def __init__(self) -> None: self._attempts: dict[str, int] = {} def note( - self, producer: str, attempt: int, cursor: Cursor - ) -> StreamRecord[Supersession] | None: + self, producer_id: str, attempt: int, *, topic: str, previous: Cursor + ) -> StreamRecord[Any] | None: """A supersession record when this record starts a newer attempt. + ``previous`` is the cursor of the last record delivered before the one + being noted, or the cursor the read started from. The synthesized + record carries it, so a consumer that checkpoints the supersession and + resumes after it is handed the new attempt's first record next rather + than skipping it. + A producer that declares no attempt supersedes nothing, because there is no generation to compare. That is the same answer as an unnumbered record: the interface reports what it was told and invents nothing. """ - if not producer or attempt <= 0: + if not producer_id or attempt <= 0: return None - previous = self._attempts.get(producer, 0) - if attempt <= previous: + seen = self._attempts.get(producer_id, 0) + if attempt <= seen: return None - self._attempts[producer] = attempt - if previous == 0: + self._attempts[producer_id] = attempt + if seen == 0: return None return StreamRecord( - value=Supersession( - producer=producer, previous_attempt=previous, attempt=attempt - ), - cursor=cursor, kind=RecordKind.SUPERSEDED, - producer=producer, + cursor=previous, + topic=topic, + producer_id=producer_id, attempt=attempt, + supersession=Supersession( + producer_id=producer_id, previous_attempt=seen, attempt=attempt + ), ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 89e32a2c7..6992f0a14 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -1,418 +1,253 @@ -"""The provider registry: where a process names its stream provider. - -A provider only moves bytes. The handles, records, framing and supersession -around it are shared, so every provider module is small: it implements -:class:`StreamProvider` and registers a factory under a short name when it is -imported. One :func:`configure` call decides which factory serves this -process; :func:`worker_options` makes the same choice for a worker when -exactly one provider is registered. +"""What a provider implements, in two halves. + +:class:`WorkflowStreamProvider` runs on the workflow thread and must keep the +contract's first two rules: publishes commit with the Workflow Task, and reads +are recorded observations. Nothing it needs may do I/O. :class:`StreamProvider` +is the half a process holds: it makes the workflow half for a worker and hands +out :class:`StreamHandle` objects to code outside a workflow. A Python provider +usually implements both on one class; the split is what lets a language whose +workflow code is bundled separately name the two halves in two packages. + +A provider only moves ``temporal.api.stream.v1.StreamRecord`` protos. The +handles around it convert values, synthesize supersession and mint cursors. """ from __future__ import annotations from collections.abc import AsyncGenerator -from datetime import timedelta -from typing import Any, Callable, Protocol, TypeVar, overload +from typing import TYPE_CHECKING, Any, Protocol, TypeVar, overload -from temporalio import activity -from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.api.stream.v1 import StreamRecord as WireRecord from temporalio.streams._record import BEGINNING, Cursor, StreamRecord +if TYPE_CHECKING: + from temporalio.client import Client + __all__ = [ - "Consumer", - "Producer", + "ReadSource", + "StreamHandle", + "StreamProducer", "StreamProvider", - "StreamProviderLifecycle", - "check_topic", - "close", - "configure", - "consumer", - "drain", - "instance", - "open_read", - "open_write", - "prepare", - "producer", - "register", - "registered", - "worker_options", + "WorkflowStreamProvider", + "WriteSink", ] T = TypeVar("T") -class Producer(Protocol): - """Appends to a stream from outside workflow code. +class StreamProducer(Protocol): + """Appends to one topic from outside workflow code. - Every append is visible as soon as the provider accepts it, and carries - the producer id, attempt and sequence that let a reader tell a retried - append from a new generation. + Every append is visible as soon as the store accepts it, and carries the + producer id, attempt and sequence that let a reader tell a retried append + from a new generation. """ + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + ... + @property def attempt(self) -> int: - """The generation this producer is writing.""" + """The generation this producer is writing, or 0 when undeclared.""" ... async def append(self, *values: Any) -> Cursor | None: - """Append values and return the cursor of the last one written. - - The last rather than the first, so ``read(after=appended)`` yields - only what came later. ``None`` when nothing was written, because the - batch was empty or a repeat the provider dropped, and on a transport - that learns positions only at read time; a caller that needs to - position itself on such a transport asks :meth:`Consumer.latest`. + """Append ``values`` and return the cursor of the last record as the store holds it. + + A repeat of an earlier append (same producer, attempt and sequence) is + written once and returns the position the original landed at. An + empty call writes nothing and returns the same value a repeat would: + the position of this producer's last record, or ``BEGINNING`` when it + has written none. ``None`` means one thing only: this provider learns + positions at read time, and a caller that needs one positions itself + with :meth:`StreamHandle.latest`. + + Raises: + StreamProducerError: The attempt or sequence conflicts with what + the store holds. """ ... async def finish(self) -> None: - """Declare this producer's output complete.""" + """Write ``FINISH`` for this producer on this topic. + + Says this producer has nothing more to send. It does not say the + activity behind it succeeded, and it does not end anyone's read. + """ ... -class Consumer(Protocol): - """Reads a stream from outside workflow code, resumably.""" +class StreamHandle(Protocol): + """One workflow's stream, addressed by topic, from outside workflow code. + + A handle follows the workflow's execution chain unless it was opened with + a ``run_id``, in which case it is pinned to that run. A transport failure + surfaces as :class:`temporalio.service.RPCError`, never as the transport's + own exception type. + """ @overload def read( - self, - *, - after: Cursor = ..., - topic: str | None = ..., - type: type[T], + self, *, topic: str, after: Cursor = ..., result_type: type[T] ) -> AsyncGenerator[StreamRecord[T], None]: ... @overload def read( - self, - *, - after: Cursor = ..., - topic: str | None = ..., - type: None = None, + self, *, topic: str, after: Cursor = ..., result_type: None = None ) -> AsyncGenerator[StreamRecord[Any], None]: ... def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield the records after ``after`` as they arrive. - - ``BEGINNING`` yields everything the stream retains. Any other cursor - came from a record this or another reader saw, and reading resumes - just past it, so a reader that stores the last cursor it handled and - hands it back sees every record exactly once. ``topic`` filters the - stream the workflow publishes; an inbound stream has no topics, and - naming one there raises ``ValueError``. The result is a generator so - a caller that stops early can ``aclose()`` it and release whatever - the provider parked against the store. + """Yield the records on ``topic`` after ``after`` as they arrive. + + ``BEGINNING`` yields everything the topic retains. Any other cursor + came from a record a reader saw, and reading resumes just past it, so + a reader that stores the last cursor it handled and hands it back + sees every record exactly once. The read ends when the owning + execution, or its chain, is closed and every retained record after + ``after`` has been delivered; until then it waits. The result is a + generator, so a caller that stops early can ``aclose()`` it and + release whatever the provider parked against the store. + + Raises: + StreamCursorError: ``after`` came from another provider or names + a record no longer retained. Raised by this call, not by the + first iteration. + StreamNotFoundError: The workflow or topic does not exist or is + past retention. """ ... - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the newest record, or ``BEGINNING`` when there is none. + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest record on ``topic``, or ``BEGINNING`` when empty. For a reader that wants to follow from now: ``read(after=latest())`` yields only what is published after this call returned, which is how a client that is about to send a message positions itself before - sending, without the workflow having to report a position. ``topic`` - is for the provider that keeps each topic in its own store. + sending, without the workflow having to report a position. """ ... + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> StreamProducer: + """A producer on ``topic``. -class StreamProvider(Protocol): - """What a provider module implements. + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer, and they are what + let a reader tell a retry from a new generation. Outside one, + ``producer_id`` is required and an empty one raises ``ValueError``. + """ + ... - The workflow-side pair (:meth:`open_read`, :meth:`open_write`) runs inside - workflow code and must keep the contract's first two rules: publishes - commit with the workflow task, and reads are recorded observations. The - outside pair (:meth:`producer`, :meth:`consumer`) runs anywhere and moves - framed bytes. A transport-only provider may serve just the outside pair - and raise on the workflow side, naming the provider a worker should use. - A provider whose transport parks something against the running workflow - also implements :class:`StreamProviderLifecycle`. - """ +class ReadSource(Protocol): + """One subscription, as a provider supplies it to the workflow thread.""" - name: str + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + """The next records with their positions, waiting until there is at least one. - def configure(self, **options: Any) -> None: - """Accept this provider's process-level options.""" - ... + A batch rather than a record because delivery boundaries are what a + provider actually records, and flattening them here keeps that out of + the contract. A record that cannot be parsed into a ``StreamRecord`` + proto is the provider's to skip. - def worker_options(self) -> dict[str, Any]: - """What a ``Worker`` or ``Replayer`` needs to serve this provider.""" + Raises: + StopAsyncIteration: This subscription has ended. + """ ... - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - """Subscribe the running workflow to its inbound stream ``stream``.""" + def close(self) -> None: + """End the subscription. Idempotent.""" ... - def open_write(self, topic: str) -> WriteSink: - """Bind ``topic`` on the stream the running workflow owns.""" - ... - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> Producer: - """Open a producer that appends on ``workflow_id``'s account. - - ``stream`` names one of the workflow's inbound streams. With no - ``stream``, ``topic`` names a topic on the stream the workflow itself - publishes, which is how an activity puts its live output next to the - workflow's own records for the same outside reader. ``producer_id`` - is never empty here: the package resolved it, from the activity - context when the caller left it unset. - """ - ... +class WriteSink(Protocol): + """One topic of the running workflow's stream, as a provider binds it.""" + + def publish(self, record: WireRecord) -> None: + """Take one record into this Workflow Task's output. - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> Consumer: - """Open a reader on ``workflow_id``'s own stream, or its inbound ``stream``.""" + Synchronous: there is nothing to wait for inside a task, because the + task is the visibility boundary. The provider commits what it buffered + when the task completes and drops it when the task fails. A record + the provider cannot stage raises :class:`temporalio.streams.StreamError` + and fails the task, loudly. + """ ... -class StreamProviderLifecycle(Protocol): - """The hooks a provider adds when it needs the workflow's own lifetime. +class WorkflowStreamProvider(Protocol): + """The half of a provider that runs on the workflow thread. - Separate from :class:`StreamProvider` because most transports need none - of them, and a provider is not asked to carry empty methods to say so. - :func:`prepare`, :func:`drain` and :func:`close` each call the hook when - the provider defines it. + Imports nothing that does I/O. The worker creates one per workflow + instance through :meth:`StreamProvider.workflow_provider`, so state kept + here dies with the instance the way handlers do. """ - def prepare(self) -> None: - """Install whatever this provider needs before the workflow runs. + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + """Subscribe the running workflow to ``topic`` of its own stream. - A provider that serves outside readers through handlers on the - workflow itself has to register them before the first task completes, - or a reader that arrives early finds nothing to talk to. + Raises: + StreamCursorError: ``after`` was minted by another provider. """ ... - def drain(self) -> None: - """Release anything this provider parked on the workflow's behalf. - - A provider that parks an outside reader against the running workflow, - as the Workflow Streams transport does with its long-poll update, has - to let go before the workflow can return. - """ + def open_writer(self, topic: str) -> WriteSink: + """Bind ``topic`` of the running workflow's stream for publishing.""" ... - async def close(self) -> None: - """Release what this provider holds for the process. + def on_workflow_start(self) -> None: + """Called before the workflow function runs. - A provider that keeps a connection pool or an HTTP session open needs - a moment where the process says it is done; this is it. + A provider that serves outside readers through handlers on the + workflow registers them here, before the first task completes. """ ... + async def on_workflow_finish(self) -> None: + """Called after the workflow function returns, raises or continues as new. -_factories: dict[str, Callable[[], StreamProvider]] = {} -_active: StreamProvider | None = None - - -def register(name: str, factory: Callable[[], StreamProvider]) -> None: - """Make ``factory`` selectable as ``configure(provider=name)``.""" - _factories[name] = factory - - -def registered() -> list[str]: - """The provider names this process can configure.""" - return sorted(_factories) - - -def _make(name: str | None) -> StreamProvider: - if name is None: - if len(_factories) == 1: - name = next(iter(_factories)) - else: - raise RuntimeError( - f"name a provider: configure(provider=...) with one of {registered()}" - ) - factory = _factories.get(name) - if factory is None: - raise RuntimeError( - f"no stream provider {name!r} is registered; available: {registered()}" - ) - return factory() - - -def configure(provider: str | None = None, **options: Any) -> None: - """Name the provider for this process and hand it its options. - - ``provider`` may be omitted when exactly one provider is registered. - """ - global _active - _active = instance(provider, **options) - - -def instance(provider: str | None = None, **options: Any) -> StreamProvider: - """A configured provider that is not installed as the process default. - - For code that serves one provider while the process is configured with - another, such as a Nexus stream handler delegating to its store. - """ - chosen = _make(provider) - chosen.configure(**options) - return chosen - - -def _current() -> StreamProvider: - if _active is None: - # Building a provider is process setup. Doing it on the first - # workflow's thread would race a second workflow thread for the - # global and hide the choice inside workflow code. - raise RuntimeError( - "no stream provider is configured; call streams.configure() or " - "streams.worker_options() before opening a stream" - ) - return _active - - -def worker_options() -> dict[str, Any]: - """What a ``Worker`` or ``Replayer`` needs to serve this provider. - - Every worker calls this, so it is where the default is resolved when - :func:`configure` was not called and exactly one provider is registered. - """ - if _active is None: - configure() - return _current().worker_options() - - -def open_read( - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, -) -> ReadSource: - """Subscribe the running workflow to its inbound stream ``stream``.""" - return _current().open_read(stream, after=after, idle_timeout=idle_timeout) - - -def open_write(topic: str) -> WriteSink: - """Bind ``topic`` on the stream the running workflow owns.""" - return _current().open_write(topic) - - -def prepare() -> None: - """Let the provider install what it needs, before the workflow runs. - - Call it from the workflow's constructor. It is a no-op on providers that - need nothing, so workflow code can call it unconditionally and stay - portable. - """ - provider = _current() - install = getattr(provider, "prepare", None) - if install is not None: - install() + A provider that parked an outside reader against the run lets go + here, so the workflow can close. + """ + ... -def drain() -> None: - """Release anything the provider parked on this workflow's behalf. +class StreamProvider(Protocol): + """What a store ships. Also a :class:`temporalio.worker.Plugin` when it serves workers. - Call it before a workflow that read a stream returns. It is a no-op on - providers that park nothing, so workflow code can call it unconditionally - and stay portable. + Construct one, pass it to ``Worker(plugins=[provider])`` and + ``Replayer(plugins=[provider])``, and open handles from it anywhere else. + Nothing is global: two workers in one process may hold two providers. """ - provider = _current() - release = getattr(provider, "drain", None) - if release is not None: - release() - -async def close() -> None: - """Release what the provider holds for this process. + def workflow_provider(self) -> WorkflowStreamProvider: + """The half that serves one workflow instance on its thread.""" + ... - Await it when the process is done with streams. It is a no-op on - providers that hold nothing, and on a process that never configured one, - so a shutdown path can call it unconditionally. - """ - if _active is None: - return - release = getattr(_active, "close", None) - if release is not None: - await release() + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> StreamHandle: + """A handle on ``workflow_id``'s stream. + Without ``run_id`` it follows the execution chain, so a consumer keeps + reading across continue-as-new; with one it is pinned to that run. + """ + ... -def check_topic(stream: str, topic: str | None) -> None: - """Reject a topic filter on an inbound stream. + async def close(self) -> None: + """Release what this provider holds for the process. - An inbound record carries no topic; the stream's name is its whole - address, so a filter there could only ever match nothing. Every provider - calls this at the top of its ``read`` so the answer is the same on all - of them. - """ - if stream and topic is not None: - raise ValueError( - f"inbound stream {stream!r} has no topics; topic= applies to the " - "stream the workflow publishes" - ) - - -async def producer( - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, -) -> Producer: - """Open a producer that appends on ``workflow_id``'s account. - - Name either an inbound ``stream`` of the workflow, or a ``topic`` on the - stream the workflow publishes. Inside an activity, leave ``producer_id`` - and ``attempt`` unset: the activity's own id and attempt are the right - answer, and they are what let a reader tell a retry from a new generation. - """ - if bool(stream) == bool(topic): - raise ValueError( - "name exactly one of stream (an inbound stream of the workflow) or " - "topic (a topic on the stream the workflow publishes)" - ) - if not producer_id: - if not activity.in_activity(): - raise ValueError( - "producer_id is required outside an activity; inside one it " - "defaults to the activity's id and attempt" - ) - info = activity.info() - producer_id = info.activity_id - attempt = attempt or info.attempt - return await _current().producer( - client, - workflow_id=workflow_id, - stream=stream, - topic=topic, - producer_id=producer_id, - attempt=attempt, - ) - - -async def consumer(client: Any, *, workflow_id: str, stream: str = "") -> Consumer: - """Open a reader on ``workflow_id``'s own stream, or its inbound ``stream``. - - With no ``stream`` the reader follows what the workflow publishes, topic - by topic. With one, it follows the inbound stream of that name, which is - how a process watches what producers hand the workflow. - """ - return await _current().consumer(client, workflow_id=workflow_id, stream=stream) + A provider that keeps a connection pool or an HTTP session open needs + a moment where the process says it is done; this is it. A provider + that holds nothing returns at once. + """ + ... diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 1f08302a8..fef63e51c 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -23,25 +23,38 @@ @enum.unique class RecordKind(enum.IntEnum): - """What a record is.""" + """What a record is. + + Mirrors ``temporal.api.stream.v1.StreamRecordKind`` value for value, so a + record's kind crosses the wire as the integer the proto holds. + """ + + UNSPECIFIED = 0 + """The proto's zero value. + + A stored record whose writer set no kind is read as :attr:`DATA`, as the + proto defines it, so a reader never sees this kind on a record. + """ DATA = 1 """Carries a value published by a workflow or a producer.""" FINISH = 2 - """The writer of this topic declared it complete. + """The producer named in ``producer_id`` will write nothing more on this topic. - Separate from the activity or workflow that wrote it having succeeded. A - reader that treats it as proof of success is wrong: the activity can still - time out after writing it. + An empty ``producer_id`` names the owning workflow. It does not end a + read, which ends when the owning execution or its chain is closed and the + retained tail has been delivered, and it says nothing about the producer's + outcome: an activity can still time out after writing it. """ SUPERSEDED = 3 """A later attempt of the same producer started writing. - Synthesized by the reader from what it observed, so every provider - delivers it identically and replay reproduces it without the provider's - help. + Synthesized by the reader from what it observed, never stored, so every + provider delivers it identically and replay reproduces it without the + provider's help. Its cursor is the position before the new attempt's + first record, so resuming after it delivers that record next. """ @@ -52,7 +65,9 @@ class Cursor: Opaque on purpose. One provider numbers records with integers and another with a millisecond-and-sequence pair, so comparing tokens here would be right for one and wrong for the other. Hand a cursor back to resume after - the record it names; nothing here advances one. + the record it names; nothing here advances one. The token starts with the + name of the provider that minted it, and a provider refuses a token from + another with :class:`temporalio.streams.StreamCursorError`. """ token: str @@ -68,30 +83,33 @@ def __str__(self) -> str: @dataclass(frozen=True) class Supersession: - """The body of a :attr:`RecordKind.SUPERSEDED` record.""" + """What a :attr:`RecordKind.SUPERSEDED` record reports.""" - producer: str + producer_id: str previous_attempt: int attempt: int @dataclass(frozen=True) class StreamRecord(Generic[T]): - """One record as workflow code sees it. + """One record as a reader sees it. - ``value`` follows ``kind``: a data record carries a ``T``, a supersession - carries the :class:`Supersession` it reports, and a finish marker carries - ``None``. Check ``kind`` before reading it. + ``value`` is set on a :attr:`RecordKind.DATA` record and ``supersession`` + on a :attr:`RecordKind.SUPERSEDED` one; every other kind carries neither. + Each field means one thing, so a consumer narrows on ``kind`` and reads + the field that kind promises. """ - value: T | Supersession | None + kind: RecordKind cursor: Cursor - kind: RecordKind = RecordKind.DATA - topic: str = "" - """The topic on the owner's stream, or empty for an inbound record.""" - producer: str = "" + topic: str + producer_id: str = "" """Who wrote it, or empty when the owning workflow wrote it itself.""" attempt: int = 0 """The producer's attempt, or 0 when it did not declare one.""" sequence: int = -1 """The producer's position within its attempt, or -1 when unnumbered.""" + value: T | None = None + """The published value. Set on ``DATA`` only.""" + supersession: Supersession | None = None + """The attempt change being reported. Set on ``SUPERSEDED`` only.""" diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py new file mode 100644 index 000000000..52299f44e --- /dev/null +++ b/temporalio/streams/_wire.py @@ -0,0 +1,181 @@ +"""How a record crosses a provider: the proto is the record. + +``temporal.api.stream.v1.StreamRecord`` is the wire format on every provider. +A store that keeps bytes keeps ``SerializeToString()`` of it, the native +server stores the proto it is handed, and a reader in any language parses the +same bytes. ``body`` is the user's payload, produced and consumed through the +payload converter, so a codec applies to it like any other payload and a +pre-encoded :class:`temporalio.common.RawValue` passes through untouched. + +Cursors are self-describing: a token starts with the name of the provider that +minted it, so a provider can refuse a foreign one at the call rather than +misreading it deep in a generator. +""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any + +import temporalio.converter +from temporalio.api.stream.v1 import StreamRecord as WireRecord +from temporalio.api.stream.v1 import StreamRecordKind +from temporalio.streams._errors import StreamCursorError +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +__all__ = [ + "RecordDecoder", + "WireRecord", + "cursor_position", + "from_wire", + "mint_cursor", + "producer_identity", + "to_wire", +] + + +def to_wire( + converter: temporalio.converter.PayloadConverter, + *, + topic: str, + kind: RecordKind, + value: Any = None, + producer_id: str = "", + attempt: int = 0, + sequence: int = -1, +) -> WireRecord: + """Build the record a provider stores or ships. + + Only a ``DATA`` record carries a body; the converter encodes ``value`` + into it, which is where a pre-encoded ``RawValue`` passes through. + """ + record = WireRecord( + topic=topic, + kind=StreamRecordKind.ValueType(int(kind)), + producer_id=producer_id, + attempt=attempt, + sequence=sequence, + ) + if kind is RecordKind.DATA: + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record + + +def from_wire( + converter: temporalio.converter.PayloadConverter, + cursor: Cursor, + wire: WireRecord, + result_type: type | None, +) -> StreamRecord[Any]: + """Turn a stored record into the record a reader yields. + + Raises: + ValueError: The kind is one no store may hold, such as a synthesized + ``SUPERSEDED`` or a value this SDK does not know. + """ + kind = RecordKind(wire.kind) + if kind is RecordKind.SUPERSEDED: + raise ValueError("a SUPERSEDED record is synthesized by readers, never stored") + if kind is RecordKind.UNSPECIFIED: + # The proto defines an unset kind as DATA, so every reader agrees. + kind = RecordKind.DATA + value: Any = None + if kind is RecordKind.DATA and wire.HasField("body"): + hints = [result_type] if result_type is not None else None + value = converter.from_payloads([wire.body], hints)[0] + return StreamRecord( + kind=kind, + cursor=cursor, + topic=wire.topic, + producer_id=wire.producer_id, + attempt=wire.attempt, + sequence=wire.sequence, + value=value, + ) + + +class RecordDecoder: + """Turns the records a provider hands over into the records a reader yields. + + One per read. It synthesizes supersession from the attempts it observes, + positions each synthesized record at the cursor before the record that + triggered it, and skips a record it cannot decode with a warning rather + than raising, so a poisoned record cannot pin a workflow on every retry + while an outside reader of the same stream moves past it. + """ + + def __init__( + self, + converter: temporalio.converter.PayloadConverter, + result_type: type | None, + *, + after: Cursor, + warn: Callable[[str], None], + ) -> None: + """Decode with ``converter`` into ``result_type``, resuming after ``after``.""" + self._converter = converter + self._result_type = result_type + self._previous = after + self._warn = warn + self._attempts = AttemptTracker() + + def decode(self, cursor: Cursor, wire: WireRecord) -> list[StreamRecord[Any]]: + """The records to yield for one stored record, in order.""" + try: + record = from_wire(self._converter, cursor, wire, self._result_type) + except Exception as error: + self._warn(f"skipping stream record at {cursor}: {error}") + # The skipped record still holds its position, so a resume after + # it moves on rather than tripping over it again. + self._previous = cursor + return [] + out: list[StreamRecord[Any]] = [] + superseded = self._attempts.note( + wire.producer_id, wire.attempt, topic=wire.topic, previous=self._previous + ) + if superseded is not None: + out.append(superseded) + out.append(record) + self._previous = cursor + return out + + +def mint_cursor(provider: str, position: str) -> Cursor: + """A cursor that names ``position`` and the provider that understands it.""" + return Cursor(f"{provider}:{position}") + + +def cursor_position(cursor: Cursor, *, provider: str) -> str | None: + """The position inside a cursor ``provider`` minted, or ``None`` for BEGINNING. + + Raises: + StreamCursorError: The cursor came from another provider. + """ + if cursor == BEGINNING: + return None + prefix = f"{provider}:" + if not cursor.token.startswith(prefix): + raise StreamCursorError( + f"cursor {cursor.token!r} was not minted by the {provider} stream provider" + ) + return cursor.token[len(prefix) :] + + +def producer_identity(producer_id: str, attempt: int) -> tuple[str, int]: + """Resolve who a producer is, defaulting to the running activity. + + Imported lazily so the module workflow code imports carries no activity + machinery; the default only means anything inside an activity anyway. + """ + if producer_id: + return producer_id, attempt + import temporalio.activity + + if not temporalio.activity.in_activity(): + raise ValueError( + "producer_id is required outside an activity; inside one it defaults " + "to the activity's id and attempt" + ) + info = temporalio.activity.info() + return info.activity_id, attempt or info.attempt diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py index c254db0fb..911620e6c 100644 --- a/temporalio/streams/providers/__init__.py +++ b/temporalio/streams/providers/__init__.py @@ -1,25 +1,66 @@ """Stream providers, one module each. -Importing this package registers every provider whose dependencies are -present. A tree that lacks a provider's dependencies simply does not offer -that name; nothing else changes, because everything above the provider is -shared. +A provider that serves workers is a :class:`temporalio.worker.Plugin`. +:class:`ProviderPlugin` is the plugin half the providers in this tree share: +it hands the provider to the worker and the replayer as their +``stream_provider`` and leaves their execution alone. A provider that holds +connections closes them through its own ``close()``, not with the worker, +because the same provider serves handles outside any worker. """ from __future__ import annotations -_KNOWN = ("memory", "workflow_streams", "native", "redis", "nexus") - -for _name in _KNOWN: - try: - __import__(f"{__name__}.{_name}") - except ModuleNotFoundError as error: - # Two things may be missing: the provider module itself, or a - # dependency from outside this package. A name missing inside - # temporalio is a broken provider, and hiding that would turn its - # traceback into "no such provider". - missing = error.name or "" - if missing != f"{__name__}.{_name}" and ( - not missing or missing.startswith("temporalio") - ): - raise +from collections.abc import AsyncIterator, Awaitable, Callable +from contextlib import AbstractAsyncContextManager + +import temporalio.worker +from temporalio.client import WorkflowHistory +from temporalio.streams._provider import StreamProvider +from temporalio.worker import ( + Replayer, + ReplayerConfig, + Worker, + WorkerConfig, + WorkflowReplayResult, +) + +__all__ = ["ProviderPlugin"] + + +class ProviderPlugin(StreamProvider, temporalio.worker.Plugin): + """The worker plugin every provider in this tree is built on. + + Subclasses implement :class:`temporalio.streams.StreamProvider`; this + class supplies the four plugin hooks, so ``Worker(plugins=[provider])`` + and ``Replayer(plugins=[provider])`` reach the provider through their + ``stream_provider`` option and the worker installs the interceptor that + calls the workflow half's lifecycle hooks. + """ + + def configure_worker(self, config: WorkerConfig) -> WorkerConfig: + """Set this provider as the worker's ``stream_provider``.""" + config["stream_provider"] = self + return config + + def configure_replayer(self, config: ReplayerConfig) -> ReplayerConfig: + """Set this provider as the replayer's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def run_worker( + self, worker: Worker, next: Callable[[Worker], Awaitable[None]] + ) -> None: + """Run the worker unchanged.""" + await next(worker) + + def run_replayer( + self, + replayer: Replayer, + histories: AsyncIterator[WorkflowHistory], + next: Callable[ + [Replayer, AsyncIterator[WorkflowHistory]], + AbstractAsyncContextManager[AsyncIterator[WorkflowReplayResult]], + ], + ) -> AbstractAsyncContextManager[AsyncIterator[WorkflowReplayResult]]: + """Run the replayer unchanged.""" + return next(replayer, histories) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 4a3cf3298..2a6087b2d 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -1,17 +1,25 @@ """The in-process reference provider. Exists so the conformance suite can exercise the whole surface without a -store, and to document in one file what a provider owes. Two honest limits, -both stated so nobody mistakes this for evidence: +store, and to document in one file what a provider owes. Its limits, stated +so nobody mistakes it for evidence: - It is not replay-safe. Workflow-side state lives in plain process memory, so run it with a warm workflow cache and do not use it to demonstrate recovery. - A workflow's publish becomes visible at ``publish`` time rather than at - task acceptance, so it only approximates rule 1 of the contract. - -The outside surface (producer, consumer, dedupe, supersession, cursors) is -faithful, which is what the conformance tests lean on. + task acceptance, and a failed task's records stay, so it only approximates + rule 1 of the contract. +- Topics are keyed by workflow id rather than by run, so a successor run's + reader from ``BEGINNING`` sees the chain's records. A ``run_id`` on a + handle only decides which run's close ends a read. +- It learns that a workflow closed by describing it, so a handle opened + without a client reads until the caller closes it. + +The outside surface (producer identity, retry deduplication, positions, +supersession, cursors) is faithful, which is what the conformance tests lean +on. One list per topic; a topic is written by the workflow and by outside +producers alike and read from either side. """ from __future__ import annotations @@ -22,16 +30,29 @@ from datetime import timedelta from typing import Any +from google.protobuf.message import DecodeError + import temporalio.converter from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._ids import inbound_stream_id -from temporalio.streams._policy import AttemptTracker +from temporalio.client import Client, WorkflowExecutionStatus +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError +from temporalio.streams._ids import topic_key +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["MemoryProducer", "MemoryStreamHandle", "MemoryStreams"] -_DEFAULT_POLL = timedelta(milliseconds=100) +_PROVIDER = "memory" logger = logging.getLogger(__name__) @@ -41,12 +62,15 @@ def _wake(future: asyncio.Future[None]) -> None: future.set_result(None) -class _MemoryStream: +class _Topic: + """One topic's records, and the waiters parked on its tail.""" + def __init__(self) -> None: - self.frames: list[bytes] = [] + self.records: list[bytes] = [] # Dedupe identity is (producer#attempt, first sequence of the append), - # the same pair the storage providers use. - self.seen: dict[tuple[str, int], int] = {} + # the same pair the storage providers use, mapped to where the batch + # landed so a repeat can answer with the original position. + self.seen: dict[tuple[str, int], tuple[int, int]] = {} # Each waiter is parked with the loop it belongs to. A workflow's # publish runs on the workflow thread, and waking a foreign loop's # future from there needs call_soon_threadsafe or the loop stays @@ -54,47 +78,50 @@ def __init__(self) -> None: self._waiters: list[tuple[asyncio.AbstractEventLoop, asyncio.Future[None]]] = [] def append( - self, frames: list[bytes], *, producer_id: str, sequence: int - ) -> int | None: - """Store ``frames`` and return the first one's offset, or ``None`` for a repeat.""" - key = (producer_id, sequence) - if key in self.seen: - return None - offset = len(self.frames) - self.frames.extend(frames) - self.seen[key] = offset + self, + wires: list[WireRecord], + *, + writer: str | None = None, + sequence: int = 0, + ) -> tuple[int, int]: + """Store ``wires`` and return where they landed as ``(first offset, count)``. + + With a ``writer``, a repeat of ``(writer, sequence)`` stores nothing + and returns where the original landed. + """ + key = (writer or "", sequence) + if writer is not None and key in self.seen: + return self.seen[key] + first = len(self.records) + self.records.extend(wire.SerializeToString() for wire in wires) + if writer is not None: + self.seen[key] = (first, len(wires)) waiters, self._waiters = self._waiters, [] for loop, future in waiters: loop.call_soon_threadsafe(_wake, future) - return offset - - async def wait_past(self, offset: int) -> None: - while len(self.frames) <= offset: - loop = asyncio.get_running_loop() - future: asyncio.Future[None] = loop.create_future() - self._waiters.append((loop, future)) - await future - - -_streams: dict[str, _MemoryStream] = {} - - -def _stream(stream_id: str) -> _MemoryStream: - found = _streams.get(stream_id) - if found is None: - found = _streams[stream_id] = _MemoryStream() - return found - - -def reset() -> None: - """Drop every stream. For tests.""" - _streams.clear() - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return first, len(wires) + + async def wait_past(self, offset: int, timeout: float | None) -> None: + """Wait until a record exists at ``offset``, or ``timeout`` passes.""" + if len(self.records) > offset: + return + loop = asyncio.get_running_loop() + future: asyncio.Future[None] = loop.create_future() + self._waiters.append((loop, future)) + try: + await asyncio.wait_for(future, timeout) + except asyncio.TimeoutError: + self._waiters = [w for w in self._waiters if w[1] is not future] + + +def _parse(cursor: Cursor, raw: bytes, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(raw) + except DecodeError as error: + # Same answer as an undecodable body: skip and say so, so one bad + # record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None class _MemReadSource: @@ -104,22 +131,26 @@ class _MemReadSource: having no delivery path, and it is why this provider is for tests. """ - def __init__(self, store: _MemoryStream, start: int, poll: timedelta) -> None: + def __init__(self, store: _Topic, start: int, poll: timedelta) -> None: self._store = store - self._cursor = start + self._offset = start self._poll = poll self._closed = False - async def next_batch(self) -> list[tuple[Cursor, bytes]]: + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: while not self._closed: - frames = self._store.frames - if len(frames) > self._cursor: - batch = [ - (Cursor(str(offset)), frames[offset]) - for offset in range(self._cursor, len(frames)) - ] - self._cursor = len(frames) - return batch + records = self._store.records + if len(records) > self._offset: + batch: list[tuple[Cursor, WireRecord]] = [] + for offset in range(self._offset, len(records)): + cursor = mint_cursor(_PROVIDER, str(offset)) + wire = _parse(cursor, records[offset], workflow.logger.warning) + if wire is not None: + batch.append((cursor, wire)) + self._offset = len(records) + if batch: + return batch + continue await workflow.sleep(self._poll) raise StopAsyncIteration @@ -128,18 +159,34 @@ def close(self) -> None: class _MemWriteSink: - def __init__(self, store: _MemoryStream, topic: str) -> None: + def __init__(self, store: _Topic) -> None: self._store = store - self._topic = topic - self._sequence = 0 - async def publish(self, frame: bytes) -> None: - self._store.append( - [frame], - producer_id=f"__workflow__:{self._topic}", - sequence=self._sequence, - ) - self._sequence += 1 + def publish(self, record: WireRecord) -> None: + # Visible at once rather than at task acceptance: the documented gap + # between this provider and rule 1. + self._store.append([record]) + + +class _MemoryWorkflowProvider: + """The workflow half. Nothing to install and nothing to release.""" + + def __init__(self, streams: MemoryStreams) -> None: + self._streams = streams + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + start = self._streams._offset_after(after) + store = self._streams._topic(workflow.info().workflow_id, topic) + return _MemReadSource(store, start, self._streams._poll) + + def open_writer(self, topic: str) -> WriteSink: + return _MemWriteSink(self._streams._topic(workflow.info().workflow_id, topic)) + + def on_workflow_start(self) -> None: + pass + + async def on_workflow_finish(self) -> None: + pass class MemoryProducer: @@ -147,19 +194,25 @@ class MemoryProducer: def __init__( self, - store: _MemoryStream, - converter: Any, + store: _Topic, + converter: temporalio.converter.PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to ``topic`` on ``store``.""" + """Bind this producer to ``topic``'s ``store``.""" self._store = store self._converter = converter self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -167,192 +220,224 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: + def _writer(self) -> str: return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed; an empty call returns + the position of this producer's last record. + """ if not values: - return None - frames = [] - for value in values: - frames.append( - _frame.encode( + return self._last + return self._write( + [ + to_wire( + self._converter, topic=self._topic, kind=RecordKind.DATA, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=self._sequence + index, ) - ) - self._sequence += 1 - offset = self._store.append( - frames, - producer_id=self._provider_id, - sequence=self._sequence - len(frames), + for index, value in enumerate(values) + ] ) - if offset is None: - return None - return Cursor(str(offset + len(frames) - 1)) async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - frame = _frame.encode( - topic=self._topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - self._store.append( - [frame], producer_id=self._provider_id, sequence=self._sequence - 1 + """Write ``FINISH`` for this producer on this topic.""" + self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] ) - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + def _write(self, wires: list[WireRecord]) -> Cursor: + first, count = self._store.append( + wires, writer=self._writer, sequence=self._sequence ) - return payload.SerializeToString() + self._sequence += len(wires) + self._last = mint_cursor(_PROVIDER, str(first + count - 1)) + return self._last -class MemoryConsumer: - """The outside reader, with the shared supersession rule.""" +class MemoryStreamHandle: + """One workflow's stream from outside, with the shared reader rules.""" - def __init__(self, store: _MemoryStream, converter: Any, stream: str) -> None: - """Read whatever ``store`` holds, now and as it grows.""" - self._store = store - self._converter = converter - self._stream = stream + def __init__( + self, + streams: MemoryStreams, + client: Client | None, + workflow_id: str, + run_id: str | None, + ) -> None: + """Address ``workflow_id``'s topics in ``streams``.""" + self._streams = streams + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = ( + client.data_converter.payload_converter + if client is not None + else temporalio.converter.DataConverter.default.payload_converter + ) - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, waiting for ones not written yet.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - offset = int(after.token) + 1 if after.token else 0 + """Yield records on ``topic`` after ``after`` until the workflow closes.""" + store = self._streams._topic(self._workflow_id, topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + start = self._streams._offset_after(after) + return self._read(store, start, after, result_type) + + async def _read( + self, + store: _Topic, + offset: int, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + closed = False while True: - await self._store.wait_past(offset) - frames = self._store.frames - while offset < len(frames): - cursor = Cursor(str(offset)) - frame = frames[offset] + records = store.records + while offset < len(records): + cursor = mint_cursor(_PROVIDER, str(offset)) + wire = _parse(cursor, records[offset], logger.warning) offset += 1 - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - frame - ) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning("skipping stream record at %s: %s", cursor, error) + if wire is None: continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, + for record in decoder.decode(cursor, wire): + yield record + if closed: + return + # One more pass after learning the workflow closed, so a record + # that landed between the scan and the describe is not lost. + closed = await self._closed() + if not closed: + await store.wait_past( + offset, + None + if self._client is None + else self._streams._poll.total_seconds(), ) - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one store per stream, so the position is topic-independent - count = len(self._store.frames) - return Cursor(str(count - 1)) if count else BEGINNING - - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] - - -class _MemoryProvider: - name = "memory" - - def __init__(self) -> None: - self._poll = _DEFAULT_POLL - - def configure(self, **options: Any) -> None: - poll = options.pop("poll_interval", None) - if poll is not None: - self._poll = poll - if options: - raise TypeError( - f"the memory provider takes only poll_interval, got {sorted(options)}" - ) - - def worker_options(self) -> dict[str, Any]: - return {} - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Ignored: this provider never releases the worker, it polls. Reading - # idle_timeout as the poll period would give the parameter a second - # meaning that a port copying the reference would copy too. - del idle_timeout - store = _stream(inbound_stream_id(workflow.info().workflow_id, stream)) - return _MemReadSource( - store, int(after.token) + 1 if after.token else 0, self._poll + async def _closed(self) -> bool: + if self._client is None: + return False + handle = self._client.get_workflow_handle( + self._workflow_id, run_id=self._run_id + ) + try: + description = await handle.describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + # A producer may write before the workflow exists; there is + # nothing to follow yet, so keep waiting. + return False + raise + status = description.status + if status is None or status == WorkflowExecutionStatus.RUNNING: + return False + # Following the chain, a run that continued as new is not the end: + # the next describe without a run id finds its successor. + return not ( + self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW ) - def open_write(self, topic: str) -> WriteSink: - store = _stream(inbound_stream_id(workflow.info().workflow_id, "")) - return _MemWriteSink(store, topic) + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest record on ``topic``, for following from now.""" + count = len(self._streams._topic(self._workflow_id, topic).records) + return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 ) -> MemoryProducer: - # With no inbound stream named, the target is the store the workflow's - # own writer appends to, and the frame carries the topic. An inbound - # record carries none: the stream's name is its whole address. - return MemoryProducer( - _stream(inbound_stream_id(workflow_id, stream)), - _converter(client), - topic, - producer_id, - attempt, - ) + """A producer on ``topic``; inside an activity its identity is the activity's.""" + store = self._streams._topic(self._workflow_id, topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return MemoryProducer(store, self._converter, topic, producer_id, attempt) - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> MemoryConsumer: - return MemoryConsumer( - _stream(inbound_stream_id(workflow_id, stream)), _converter(client), stream - ) +class MemoryStreams(ProviderPlugin): + """The in-memory provider, one list per topic. -_provider.register("memory", _MemoryProvider) + Construct one and pass the same instance to the worker and to the code + that opens handles; two instances share nothing. + """ + + def __init__( + self, *, poll_interval: timedelta = timedelta(milliseconds=100) + ) -> None: + """Create an empty provider. + + Args: + poll_interval: How often a workflow-side reader with nothing to + read checks again, and how often an outside reader asks + whether the workflow closed. + """ + self._poll = poll_interval + self._topics: dict[str, _Topic] = {} + + def reset(self) -> None: + """Drop every topic. For tests.""" + self._topics.clear() + + def workflow_provider(self) -> _MemoryWorkflowProvider: + """The workflow half, over this provider's topics.""" + return _MemoryWorkflowProvider(self) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> MemoryStreamHandle: + """A handle on ``workflow_id``'s topics. + + ``client`` may be ``None`` here, unlike on a storage provider; then + the handle cannot see the workflow close and a read waits until the + caller closes it. + """ + return MemoryStreamHandle(self, client, workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: the provider holds no connection.""" + + def _topic(self, workflow_id: str, topic: str) -> _Topic: + if not topic: + raise ValueError("topic must not be empty") + key = topic_key(workflow_id, topic) + found = self._topics.get(key) + if found is None: + found = self._topics[key] = _Topic() + return found + + def _offset_after(self, after: Cursor) -> int: + position = cursor_position(after, provider=_PROVIDER) + if position is None: + return 0 + try: + return int(position) + 1 + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a position on the memory provider" + ) from None From e05e65198fc18cc1e36c20dcaeafe6930d9d99f4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:54:17 -0700 Subject: [PATCH 295/831] Carried the stream provider from the worker into the workflow runtime. workflow.stream_reader() and stream_writer() reach it the way payload_converter() does, and the worker brackets the workflow function with the provider's lifecycle hooks so no workflow code has to. --- temporalio/worker/_replayer.py | 7 +- temporalio/worker/_worker.py | 9 + temporalio/worker/_workflow.py | 27 +++ temporalio/worker/_workflow_instance.py | 19 ++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 4 + temporalio/workflow/_streams.py | 257 ++++++++++++++++++++++++ 7 files changed, 332 insertions(+), 1 deletion(-) create mode 100644 temporalio/workflow/_streams.py diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index 55cec4ca7..1387face7 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -18,6 +18,7 @@ import temporalio.client import temporalio.converter import temporalio.runtime +import temporalio.streams import temporalio.worker import temporalio.workflow @@ -58,13 +59,14 @@ def __init__( disable_safe_workflow_eviction: bool = False, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, external_stream_backend: Any | None = None, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: """Create a replayer to replay workflows from history. See :py:meth:`temporalio.worker.Worker.__init__` for a description of most of the arguments. Most of the same arguments need to be passed to the replayer that were passed to the worker when the workflow originally - ran. + ran, ``stream_provider`` included when the workflow used streams. Note, unlike the worker, for the replayer the workflow_task_executor will default to a new thread pool executor with no max_workers set that @@ -96,6 +98,7 @@ def __init__( disable_safe_workflow_eviction=disable_safe_workflow_eviction, header_codec_behavior=header_codec_behavior, external_stream_backend=external_stream_backend, + stream_provider=stream_provider, ) self._initial_config = self._config.copy() self._default_workflow_logic_flags = set(_DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS) @@ -298,6 +301,7 @@ def on_eviction_hook( default_workflow_logic_flags=frozenset( self._default_workflow_logic_flags ), + stream_provider=self._config.get("stream_provider"), ) external_storage = data_converter.external_storage storage_driver_types = ( @@ -445,6 +449,7 @@ class ReplayerConfig(TypedDict, total=False): disable_safe_workflow_eviction: bool header_codec_behavior: HeaderCodecBehavior external_stream_backend: Any | None + stream_provider: temporalio.streams.StreamProvider | None @dataclass(frozen=True) diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index 4da7c13b3..889c063e2 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -24,6 +24,7 @@ import temporalio.common import temporalio.runtime import temporalio.service +import temporalio.streams from temporalio.common import ( HeaderCodecBehavior, VersioningBehavior, @@ -153,6 +154,7 @@ def __init__( disable_payload_error_limit: bool = False, max_workflow_task_external_storage_concurrency: int = _DEFAULT_WORKFLOW_TASK_EXTERNAL_STORAGE_CONCURRENCY, external_stream_backend: Any | None = None, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: """Create a worker to process workflows and/or activities. @@ -354,6 +356,10 @@ def __init__( Defaults to 3. Adjust this value based on your workload's needs. Please report any issues you encounter with this setting or if you feel the default should be changed. + stream_provider: Experimental. The stream provider that workflows + on this worker read and publish through, see + :py:mod:`temporalio.streams`. A provider that is also a + :py:class:`Plugin` sets this itself when passed in ``plugins``. WARNING: This setting is experimental. """ @@ -404,6 +410,7 @@ def __init__( disable_payload_error_limit=disable_payload_error_limit, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, external_stream_backend=external_stream_backend, + stream_provider=stream_provider, ) plugins_from_client = cast( @@ -593,6 +600,7 @@ def check_activity(activity: str): != HeaderCodecBehavior.NO_CODEC, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, external_stream_backend=self._external_stream_backend, + stream_provider=config.get("stream_provider"), ) tuner = config.get("tuner") @@ -1080,6 +1088,7 @@ class WorkerConfig(TypedDict, total=False): disable_payload_error_limit: bool max_workflow_task_external_storage_concurrency: int external_stream_backend: Any | None + stream_provider: temporalio.streams.StreamProvider | None def _warn_if_activity_executor_max_workers_is_inconsistent( diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 42fb07ff8..481a0a86d 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -27,6 +27,7 @@ import temporalio.converter import temporalio.converter._extstore import temporalio.exceptions +import temporalio.streams import temporalio.workflow from temporalio.bridge.worker import PollShutdownError from temporalio.converter import StorageDriverStoreContext, StorageDriverWorkflowInfo @@ -38,6 +39,7 @@ _relax_sandbox_for_debugger, ) from ._interceptor import ( + ExecuteWorkflowInput, Interceptor, WorkflowInboundInterceptor, WorkflowInterceptorClassInput, @@ -59,6 +61,24 @@ LOG_PROTOS = False +class _StreamHooksInterceptor(WorkflowInboundInterceptor): + """Brackets the workflow function with the stream provider's lifecycle hooks. + + Installed by the worker when it has a stream provider, so no workflow + code has to call anything before it runs or before it returns. The finish + hook runs however the function ends, continue-as-new included, because + a provider that parked a reader against the run has to let go either way. + """ + + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: + provider = temporalio.workflow._Runtime.current().workflow_streams().provider + provider.on_workflow_start() + try: + return await self.next.execute_workflow(input) + finally: + await provider.on_workflow_finish() + + # Value was chosen abitrarily as a small number that allows some concurrency and prevents # large numbers of concurrent external storage operations causing resource contention. # This default limit is per workflow task activation and does not limit the total number @@ -158,6 +178,7 @@ def __init__( default_workflow_logic_flags: frozenset[_WorkflowLogicFlag] | None = None, external_stream_backend: Any | None = None, client: Any = None, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: # Debug mode is enabled if specified or if the TEMPORAL_DEBUG env var is truthy debug_mode = debug_mode or bool(os.environ.get("TEMPORAL_DEBUG")) @@ -216,6 +237,11 @@ def __init__( __temporal_assert_local_activity_valid=assert_local_activity_valid, ) ) + self._stream_provider = stream_provider + if stream_provider is not None: + # Innermost, so the lifecycle hooks bracket the workflow function + # itself, after every user interceptor has done its own setup. + self._interceptor_classes.append(_StreamHooksInterceptor) # External Workflow Streams. The manager is per-Worker and owns the # backend connection and watcher tasks; it is created lazily on the @@ -968,6 +994,7 @@ def _create_workflow_instance( default_workflow_logic_flags=frozenset(self._default_workflow_logic_flags), external_stream_runtime=runtime, external_streams_configured=self._external_streams_configured, + stream_provider=self._stream_provider, ) if defn.sandboxed: return self._workflow_runner.create_instance(det) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 88e7a891b..992bf7ed9 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -58,7 +58,9 @@ import temporalio.converter import temporalio.exceptions import temporalio.nexus.system +import temporalio.streams import temporalio.workflow +import temporalio.workflow._streams from temporalio.converter import StorageDriverStoreContext, StorageDriverWorkflowInfo from temporalio.service import __version__ @@ -198,6 +200,7 @@ class WorkflowInstanceDetails: """ external_streams_configured: bool = False """Whether Workflow code may use the runtime for new subscriptions.""" + stream_provider: temporalio.streams.StreamProvider | None = None class WorkflowInstance(ABC): @@ -328,6 +331,8 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: det.worker_level_failure_exception_types ) self._patch_activation_callback = det.patch_activation_callback + self._stream_provider = det.stream_provider + self._streams: temporalio.workflow._streams._WorkflowStreams | None = None self._default_workflow_logic_flags = det.default_workflow_logic_flags self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False @@ -2079,6 +2084,20 @@ async def workflow_start_nexus_operation( ) ) + def workflow_streams(self) -> temporalio.workflow._streams._WorkflowStreams: + if self._streams is None: + if self._stream_provider is None: + raise RuntimeError( + "no stream provider is configured on this worker; pass one with " + "Worker(plugins=[provider]) or stream_provider=" + ) + # The workflow half is made per instance, so whatever it keeps + # dies with the instance the way handlers do. + self._streams = temporalio.workflow._streams._WorkflowStreams( + self._stream_provider.workflow_provider() + ) + return self._streams + def workflow_time_ns(self) -> int: return self._time_ns diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..f63135bf4 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -147,6 +147,12 @@ logger, unsafe, ) +from ._streams import ( + StreamReader, + StreamWriter, + stream_reader, + stream_writer, +) from ._workflow_ops import ( ChildWorkflowCancellationType, ChildWorkflowConfig, @@ -252,6 +258,10 @@ "SandboxImportNotificationPolicy", "logger", "unsafe", + "StreamReader", + "StreamWriter", + "stream_reader", + "stream_writer", "ChildWorkflowCancellationType", "ChildWorkflowConfig", "ChildWorkflowHandle", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..25523836a 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -24,6 +24,7 @@ from ._activities import ActivityCancellationType, ActivityHandle from ._exceptions import ContinueAsNewVersioningBehavior, VersioningIntent from ._nexus import NexusOperationCancellationType, NexusOperationHandle + from ._streams import _WorkflowStreams from ._workflow_ops import ( ChildWorkflowCancellationType, ChildWorkflowHandle, @@ -475,6 +476,9 @@ async def workflow_start_nexus_operation( summary: str | None, ) -> NexusOperationHandle[OutputT]: ... + @abstractmethod + def workflow_streams(self) -> _WorkflowStreams: ... + @abstractmethod def workflow_time_ns(self) -> int: ... diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py new file mode 100644 index 000000000..029da59a1 --- /dev/null +++ b/temporalio/workflow/_streams.py @@ -0,0 +1,257 @@ +"""Streams from inside workflow code. + +.. warning:: + This module is experimental and may change in future versions. + +The reader and writer here are the same on every provider. They convert +values, synthesize supersession and buffer nothing the provider did not hand +them; everything provider-specific sits behind the ``ReadSource`` and +``WriteSink`` that the provider's workflow half opens. The provider itself +comes from the worker, the way the payload converter does. +""" + +from __future__ import annotations + +import asyncio +from collections import deque +from collections.abc import AsyncIterator, Callable +from typing import Any, Generic, TypeVar, cast, overload + +from temporalio.streams._provider import ReadSource, WorkflowStreamProvider, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import RecordDecoder, to_wire +from temporalio.workflow._context import _Runtime, payload_converter +from temporalio.workflow._sandbox import logger + +__all__ = ["StreamReader", "StreamWriter", "stream_reader", "stream_writer"] + +T = TypeVar("T") + + +class _WorkflowStreams: + """The stream state a workflow instance carries: its provider half and open readers.""" + + def __init__(self, provider: WorkflowStreamProvider) -> None: + self.provider = provider + self.readers: dict[str, StreamReader[Any]] = {} + + +class StreamReader(Generic[T]): + """Reads one topic of this workflow's stream from inside workflow code. + + The reader is the async iterator: ``async for record in reader`` yields + every kind of record, including the supersession the reader synthesizes + when a producer's newer attempt appears. Check ``record.kind``, or + iterate :meth:`values` when the workflow only wants data. Iteration ends + when the reader is closed or the provider ends the subscription. One loop + per reader: two loops on one reader share its buffer and interleave. + """ + + def __init__( + self, + source: ReadSource, + *, + topic: str, + result_type: type | None, + after: Cursor, + on_close: Callable[[], None], + ) -> None: + """Prefer :func:`temporalio.workflow.stream_reader`.""" + self._source = source + self._topic = topic + self._result_type = result_type + self._decoder = RecordDecoder( + payload_converter(), result_type, after=after, warn=logger.warning + ) + self._pending: deque[StreamRecord[T]] = deque() + self._lock = asyncio.Lock() + self._closed = False + self._ended = False + self._on_close = on_close + + @property + def topic(self) -> str: + """The topic this reader is subscribed to.""" + return self._topic + + def __aiter__(self) -> StreamReader[T]: + """The reader is its own iterator.""" + return self + + async def __anext__(self) -> StreamRecord[T]: + """The next record, waiting for one to arrive.""" + while True: + if self._pending: + return self._pending.popleft() + if self._closed or self._ended: + raise StopAsyncIteration + await self._fill() + + async def _fill(self) -> None: + # Two loops on one reader must not race the source, so one batch + # fetch is in flight at a time and the second loop takes what the + # first one buffered. + async with self._lock: + if self._pending or self._closed or self._ended: + return + try: + batch = await self._source.next_batch() + except StopAsyncIteration: + # The provider ended the subscription. Iteration stops rather + # than raising, so a workflow that reads to the end of a + # finished stream leaves the loop instead of failing its task. + self._ended = True + return + for cursor, wire in batch: + self._pending.extend(self._decoder.decode(cursor, wire)) + + async def values(self) -> AsyncIterator[T]: + """Iterate the data values, dropping control records.""" + async for record in self: + if record.kind is RecordKind.DATA: + yield cast("T", record.value) + + def close(self) -> None: + """End the subscription. Idempotent. + + A later :func:`temporalio.workflow.stream_reader` on the same topic + opens a new subscription, which is a new command. + """ + if self._closed: + return + self._closed = True + self._source.close() + self._on_close() + + +class StreamWriter: + """Publishes to one topic of this workflow's stream. + + A workflow can only publish transactionally to its own stream, on every + provider. Writing to somebody else's stream is an activity's job, and it + gets the weaker guarantee that goes with doing I/O. + """ + + def __init__(self, sink: WriteSink, topic: str) -> None: + """Prefer :func:`temporalio.workflow.stream_writer`.""" + self._sink = sink + self._topic = topic + self._finished = False + + @property + def topic(self) -> str: + """The topic this writer is bound to.""" + return self._topic + + def publish(self, value: Any) -> None: + """Append ``value`` to this topic. + + Synchronous, because there is nothing to wait for inside a task: the + record becomes visible when this Workflow Task is accepted, and never + at all if the task fails, so a reader cannot see a decision the + workflow did not commit. A :class:`temporalio.common.RawValue` passes + through pre-encoded. + + Raises: + ValueError: :meth:`finish` was already called on this writer. + """ + if self._finished: + raise ValueError(f"topic {self._topic!r} was already finished") + self._sink.publish( + to_wire( + payload_converter(), + topic=self._topic, + kind=RecordKind.DATA, + value=value, + ) + ) + + def finish(self) -> None: + """Write ``FINISH`` for this workflow on this topic. Idempotent. + + Says this workflow has nothing more to send on the topic. It does not + say the workflow succeeded, and it does not end anyone's read. + """ + if self._finished: + return + self._finished = True + self._sink.publish( + to_wire(payload_converter(), topic=self._topic, kind=RecordKind.FINISH) + ) + + +@overload +def stream_reader( + topic: str, *, result_type: type[T], after: Cursor = ... +) -> StreamReader[T]: ... + + +@overload +def stream_reader( + topic: str, *, result_type: None = None, after: Cursor = ... +) -> StreamReader[Any]: ... + + +def stream_reader( + topic: str, *, result_type: type | None = None, after: Cursor = BEGINNING +) -> StreamReader[Any]: + """Subscribe this workflow to ``topic`` of its own stream. + + One subscription per topic per run. A second call for the same topic + returns the reader already open on it, so records go to whichever loop + pulls first; such a call may pass neither ``after`` nor a different + ``result_type``. Adding a reader on a new topic is a new command, so gate + it with :func:`temporalio.workflow.patched` as you would a timer. A + reader in a successor run starts a new subscription: nothing crosses + continue-as-new implicitly. + + Args: + topic: The topic, relative to this workflow's stream. + result_type: The value type, used as the decode hint. + :class:`temporalio.common.RawValue` returns the payload untouched. + after: Resume strictly after this record. Honoured on the first + subscription of a run, because after that the recorded + observations decide. + + Raises: + ValueError: ``topic`` is empty, or a reader on it is already open and + this call asked for a different position or type. + temporalio.streams.StreamCursorError: ``after`` was minted by another + provider. + """ + if not topic: + raise ValueError("topic must not be empty") + state: _WorkflowStreams = _Runtime.current().workflow_streams() + existing = state.readers.get(topic) + if existing is not None: + if after != BEGINNING or result_type is not existing._result_type: + raise ValueError( + f"topic {topic!r} already has a reader in this run; a second " + "stream_reader shares it and takes no after= or other result_type=" + ) + return existing + source = state.provider.open_reader(topic, after=after) + + def forget() -> None: + state.readers.pop(topic, None) + + reader: StreamReader[Any] = StreamReader( + source, topic=topic, result_type=result_type, after=after, on_close=forget + ) + state.readers[topic] = reader + return reader + + +def stream_writer(topic: str) -> StreamWriter: + """Publish to ``topic`` of this workflow's stream. + + Args: + topic: The topic name. Encoding follows each published value. + + Raises: + ValueError: ``topic`` is empty. + """ + if not topic: + raise ValueError("topic must not be empty") + provider = _Runtime.current().workflow_streams().provider + return StreamWriter(provider.open_writer(topic), topic) From d37f8ade2c96c335f5cedda99e462ba85081ba55 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:54:17 -0700 Subject: [PATCH 296/831] Moved the stream conformance suite onto the new surface. Adds the cases for supersession cursors, append positions, a read that ends when the chain closes, chain following, foreign cursors, the lifecycle hooks and a subscription shared by two readers. --- tests/streams/conftest.py | 6 +- tests/streams/test_streams_conformance.py | 595 ++++++++++------------ tests/streams/test_streams_workflow.py | 381 +++++++++++--- 3 files changed, 568 insertions(+), 414 deletions(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 1758f2598..12663fa23 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -4,9 +4,5 @@ def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( "markers", - "inbound_stream: the case writes a workflow's inbound stream from outside", - ) - config.addinivalue_line( - "markers", - "unfiltered_read: the case reads the owner's stream without naming a topic", + "reports_positions: the case needs append() to return where records landed", ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 1cffded48..451fe4391 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -2,37 +2,49 @@ Written against the public surface, parametrised over the providers this tree can stand up. The memory provider always runs, with no server and no -store. A storage provider adds itself to ``SETUPS`` behind its own -``STREAMS_LIVE`` gate: its setup configures the provider, hands back the -client the cases should use and a workflow that exists for the case to -address, and says which capabilities it lacks, so the cases marked -``inbound_stream`` or ``unfiltered_read`` are skipped with a reason on a -provider that cannot do them. Every other case reads with a topic, which is -what a store that keys by topic needs. - -What this file pins down is the contract: framing, producer identity, retry -deduplication, supersession, topic filtering, cursor resumption, and store -keys that cannot collide. The workflow-side handles and the two rules about -workflow tasks live in ``test_streams_workflow``. +store. A storage provider adds itself to ``SETUPS``, behind its own +``STREAMS_LIVE`` gate when it needs a store the test environment does not +start: its setup receives the environment's client and hands back a provider +instance, the client the cases should use, a ``host`` that starts the +workflow owning a stream when the store lives inside a running workflow, and +which capabilities it lacks, so the cases marked ``reports_positions`` are +skipped with a reason on a provider whose ``append()`` learns positions at +read time. + +What this file pins down is the contract: the record on the wire, producer +identity, retry deduplication, positions, supersession, topic addressing, +cursor resumption, cursor ownership, and store keys that cannot collide. The +workflow-side handles and the two rules about Workflow Tasks live in +``test_streams_workflow``. """ from __future__ import annotations import asyncio -import os import uuid -from collections.abc import AsyncIterator, Callable +from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass -from typing import Any +from typing import Any, cast import pytest -from temporalio import streams +from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import _frame, _ids, _provider +from temporalio.common import RawValue +from temporalio.converter import DataConverter +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamHandle, + StreamProvider, + Supersession, + _ids, + _wire, +) from temporalio.streams._policy import AttemptTracker -from temporalio.streams._record import Cursor, RecordKind -from temporalio.streams.providers import memory +from temporalio.streams.providers.memory import MemoryStreams @dataclass @@ -40,81 +52,50 @@ class ProviderCase: """One provider under test, and what the cases may ask of it.""" name: str - client: Any = None - workflow_id: str = "" - """The workflow whose streams the case addresses. - - A store keeps a workflow's stream with the workflow, so the setup makes - the execution exist before the case opens a producer on its account. - """ - inbound_streams: bool = True - """Outside producers may write a workflow's inbound stream.""" - unfiltered_reads: bool = True - """A consumer may read the owner's stream without naming a topic.""" - reports_dropped_repeats: bool = True - """``append`` returns ``None`` for a repeat it dropped. - - A store that answers a repeat with the original position instead still - holds the record once; it just cannot say at append time that this call - wrote nothing. - """ - - -async def _memory_case() -> AsyncIterator[ProviderCase]: - memory.reset() - streams.configure(provider="memory") - yield ProviderCase("memory", workflow_id=new_workflow_id()) - memory.reset() - - -async def _redis_case() -> AsyncIterator[ProviderCase]: - # A prefix per case, because the store keeps what earlier cases wrote. - streams.configure( - provider="redis", key_prefix=f"streams-conformance-{uuid.uuid4().hex}" - ) - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - # The store keys a workflow's streams under its chain, which is read from - # the execution, so one has to exist; no worker ever picks its task up. - owner = await client.start_workflow( - "StreamOwner", - id=new_workflow_id(), - task_queue="streams-conformance-unserved", - ) - try: - yield ProviderCase( - "redis", - client, - workflow_id=owner.id, - # Each topic is its own store, and an inbound stream is not - # readable from outside; a dropped repeat answers with the - # original position because the store's seam does not say. - inbound_streams=False, - unfiltered_reads=False, - reports_dropped_repeats=False, + provider: StreamProvider + client: Client | None = None + reports_positions: bool = True + """``append()`` returns where the records landed.""" + host: Callable[[str], Awaitable[None]] | None = None + """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" + + async def open( + self, workflow_id: str, *, run_id: str | None = None + ) -> StreamHandle: + if self.host is not None: + await self.host(workflow_id) + # The memory provider takes no client; every storage provider's setup + # supplies one, so the cast only ever lies for the provider that + # does not read it. + return self.provider.get_stream_handle( + cast(Client, self.client), workflow_id, run_id=run_id ) - finally: - await owner.terminate("conformance case finished") - await streams.close() -SETUPS: dict[str, Callable[[], AsyncIterator[ProviderCase]]] = {"memory": _memory_case} -if os.environ.get("STREAMS_LIVE") == "redis": - # Needs a dev server at TEMPORAL_ADDRESS and a Redis at TEMPORAL_TEST_REDIS_URL. - SETUPS["redis"] = _redis_case +async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: + provider = MemoryStreams() + yield ProviderCase("memory", provider) + provider.reset() + + +SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { + "memory": _memory_case +} _CAPABILITIES = { - "inbound_stream": lambda case: case.inbound_streams, - "unfiltered_read": lambda case: case.unfiltered_reads, + "reports_positions": lambda case: case.reports_positions, } @pytest.fixture(params=sorted(SETUPS)) -async def provider(request: pytest.FixtureRequest) -> AsyncIterator[ProviderCase]: - async for case in SETUPS[request.param](): +async def case( + request: pytest.FixtureRequest, client: Client +) -> AsyncIterator[ProviderCase]: + async for provider_case in SETUPS[request.param](client): for marker, supported in _CAPABILITIES.items(): - if request.node.get_closest_marker(marker) and not supported(case): - pytest.skip(f"the {case.name} provider does not support {marker}") - yield case + if request.node.get_closest_marker(marker) and not supported(provider_case): + pytest.skip(f"the {provider_case.name} provider does not {marker}") + yield provider_case def new_workflow_id() -> str: @@ -136,343 +117,281 @@ async def _collect() -> None: return out -def test_frame_roundtrip(): - frame = _frame.encode( +def test_record_roundtrips_through_the_wire(): + converter = DataConverter.default.payload_converter + wire = _wire.to_wire( + converter, topic="decisions", kind=RecordKind.DATA, - producer="model", + value={"n": 1}, + producer_id="model", attempt=3, sequence=7, - body=b"payload-bytes", - ) - kind, topic, producer, attempt, sequence, body = _frame.decode(frame) - assert (kind, topic, producer, attempt, sequence, body) == ( - RecordKind.DATA, - "decisions", - "model", - 3, - 7, - b"payload-bytes", ) + parsed = _wire.WireRecord.FromString(wire.SerializeToString()) + record = _wire.from_wire(converter, Cursor("memory:0"), parsed, dict) + assert ( + record.kind, + record.topic, + record.producer_id, + record.attempt, + record.sequence, + record.value, + ) == (RecordKind.DATA, "decisions", "model", 3, 7, {"n": 1}) + assert record.supersession is None + finish = _wire.to_wire(converter, topic="decisions", kind=RecordKind.FINISH) + assert not finish.HasField("body") + assert _wire.from_wire(converter, Cursor("memory:1"), finish, dict).value is None + + +def test_a_stored_supersession_is_not_a_record(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", kind=int(RecordKind.SUPERSEDED)) # type: ignore[arg-type] + with pytest.raises(ValueError, match="synthesized"): + _wire.from_wire(converter, Cursor("memory:0"), wire, None) + + +def test_an_unset_kind_is_read_as_data(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", body=converter.to_payloads([{"n": 1}])[0]) + record = _wire.from_wire(converter, Cursor("memory:0"), wire, dict) + assert record.kind is RecordKind.DATA + assert record.value == {"n": 1} def test_supersession_is_synthesized_from_observations(): attempts = AttemptTracker() - assert attempts.note("model", 1, Cursor("0")) is None - superseded = attempts.note("model", 2, Cursor("1")) + assert attempts.note("model", 1, topic="t", previous=BEGINNING) is None + superseded = attempts.note("model", 2, topic="t", previous=Cursor("memory:0")) assert superseded is not None assert superseded.kind is RecordKind.SUPERSEDED - assert isinstance(superseded.value, streams.Supersession) - assert superseded.value.previous_attempt == 1 + assert superseded.supersession == Supersession("model", 1, 2) + assert superseded.value is None + # Positioned before the triggering record, so a resume after it delivers + # that record next. + assert superseded.cursor == Cursor("memory:0") # The same attempt again is not a new generation. - assert attempts.note("model", 2, Cursor("2")) is None + assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None -def test_inbound_stream_ids_cannot_collide(): +def test_topic_keys_cannot_collide(): # A colon in a workflow id must not make two addresses one key. - assert _ids.inbound_stream_id("a:b", "c") != _ids.inbound_stream_id("a", "b:c") - assert _ids.inbound_stream_id("a:b", "") != _ids.inbound_stream_id("a", "b") - assert _ids.inbound_stream_id("a%3Ab", "c") != _ids.inbound_stream_id("a:b", "c") - assert _ids.inbound_stream_id("wf", "inputs") == "wf:inputs" - - -async def test_append_read_roundtrip(provider: ProviderCase): - workflow_id = provider.workflow_id - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) + assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") + assert _ids.topic_key("a%3Ab", "c") != _ids.topic_key("a:b", "c") + assert _ids.topic_key("wf", "inputs") == "wf:inputs" + + +def test_cursors_name_their_provider(): + assert _wire.cursor_position(BEGINNING, provider="memory") is None + assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" + with pytest.raises(StreamCursorError): + _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") + + +async def test_append_read_roundtrip(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic="out", producer_id="model", attempt=1) + assert (producer.producer_id, producer.attempt) == ("model", 1) await producer.append({"id": "r1"}, {"id": "r2"}) await producer.finish() - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out"), 3) + records = await take(stream.read(topic="out", result_type=dict), 3) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH, ] assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] - assert all(r.producer == "model" and r.attempt == 1 for r in records) + assert records[2].value is None + assert all(r.producer_id == "model" and r.attempt == 1 for r in records) assert [r.sequence for r in records] == [0, 1, 2] assert all(r.topic == "out" for r in records) -@pytest.mark.inbound_stream -async def test_inbound_records_carry_no_topic(provider: ProviderCase): - workflow_id = provider.workflow_id - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - await producer.append({"id": "r1"}) - await producer.finish() +async def test_raw_values_pass_through_untouched(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + payload = Payload(metadata={"encoding": b"binary/plain"}, data=b"\x00\x01raw") + producer = stream.producer(topic="out", producer_id="model", attempt=1) + await producer.append(RawValue(payload)) + + records = await take(stream.read(topic="out", result_type=RawValue), 1) + assert isinstance(records[0].value, RawValue) + assert records[0].value.payload == payload - consumer = await streams.consumer( - provider.client, workflow_id=workflow_id, stream="inputs" - ) - records = await take(consumer.read(type=dict), 2) - assert [r.kind for r in records] == [RecordKind.DATA, RecordKind.FINISH] - assert records[0].value == {"id": "r1"} - # An inbound stream has no topics; its name is the whole address. - assert all(r.topic == "" for r in records) - with pytest.raises(ValueError, match="inbound stream 'inputs' has no topics"): - await take(consumer.read(type=dict, topic="inputs"), 1) - - -async def test_retried_append_is_deduplicated(provider: ProviderCase): - workflow_id = provider.workflow_id - first = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) - await first.append({"id": "r1"}) - # The retry of the same attempt starts its sequence over and appends the - # same record. The provider must not store it twice, and says so by - # returning no position for what it dropped, or the original one when - # its store cannot tell the two apart at append time. - retry = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) - dropped = await retry.append({"id": "r1"}) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out"), 1) +@pytest.mark.reports_positions +async def test_retried_append_returns_the_original_position(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic="out", producer_id="model", attempt=1) + landed = await first.append({"id": "r1"}) + assert landed is not None + # The retry of the same attempt starts its sequence over and appends the + # same record. The provider stores it once and answers with where the + # original landed, so the retry can checkpoint the same position. + retry = stream.producer(topic="out", producer_id="model", attempt=1) + assert await retry.append({"id": "r1"}) == landed + # An empty call writes nothing and answers the same way. + assert await retry.append() == landed + + records = await take(stream.read(topic="out", result_type=dict), 1) assert records[0].value == {"id": "r1"} - if provider.reports_dropped_repeats: - assert dropped is None - else: - assert dropped == records[0].cursor + assert records[0].cursor == landed # The store holds exactly the one record: the newest position is its cursor. - assert await consumer.latest(topic="out") == records[0].cursor + assert await stream.latest(topic="out") == landed -async def test_new_attempt_supersedes_the_old_one(provider: ProviderCase): - workflow_id = provider.workflow_id - first = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) +async def test_retried_append_is_stored_once(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic="out", producer_id="model", attempt=1) + await first.append({"id": "r1"}) + retry = stream.producer(topic="out", producer_id="model", attempt=1) + await retry.append({"id": "r1"}) + await retry.append({"id": "r2"}) + + records = await take(stream.read(topic="out", result_type=dict), 2) + assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] + + +async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic="out", producer_id="model", attempt=1) await first.append({"text": "The capital of"}) - second = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=2, - ) + second = stream.producer(topic="out", producer_id="model", attempt=2) await second.append({"text": "Paris is the capital"}) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out"), 3) + records = await take(stream.read(topic="out", result_type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED - assert isinstance(records[1].value, streams.Supersession) - assert records[1].value.previous_attempt == 1 + assert records[1].supersession == Supersession("model", 1, 2) + assert records[1].value is None assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 -async def test_topic_filter_on_the_owners_stream(provider: ProviderCase): - # Two producers on two topics of the stream the workflow publishes. The - # filter is only meaningful on a store that mixes topics, which is this - # one; an inbound stream carries none. - workflow_id = provider.workflow_id - on_a = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="a", - producer_id="tool-a", - attempt=1, - ) - await on_a.append({"n": 1}) - on_b = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="b", - producer_id="tool-b", - attempt=1, +async def test_a_superseded_record_resumes_to_the_triggering_record( + case: ProviderCase, +): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic="out", producer_id="model", attempt=1) + await first.append({"n": 1}) + second = stream.producer(topic="out", producer_id="model", attempt=2) + await second.append({"n": 2}) + + records = await take(stream.read(topic="out", result_type=dict), 3) + superseded = records[1] + assert superseded.kind is RecordKind.SUPERSEDED + # The synthesized record sits at the position before the new attempt's + # first record, so a consumer that checkpoints it and restarts is handed + # that record rather than skipping it. + assert superseded.cursor == records[0].cursor + resumed = await take( + stream.read(topic="out", result_type=dict, after=superseded.cursor), 1 ) - await on_b.append({"n": 2}) - - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - only_a = await take(consumer.read(type=dict, topic="a"), 1) - assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] - only_b = await take(consumer.read(type=dict, topic="b"), 1) - assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] + assert resumed[0].kind is RecordKind.DATA + assert resumed[0].value == {"n": 2} -@pytest.mark.unfiltered_read -async def test_a_read_without_a_topic_sees_every_topic(provider: ProviderCase): - workflow_id = provider.workflow_id - on_a = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="a", - producer_id="tool-a", - attempt=1, - ) +async def test_topics_are_addressed_by_name(case: ProviderCase): + # Two producers on two topics of the same workflow's stream: each read + # names its topic and sees only that topic's records. + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + on_a = stream.producer(topic="a", producer_id="tool-a", attempt=1) await on_a.append({"n": 1}) - on_b = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="b", - producer_id="tool-b", - attempt=1, - ) + on_b = stream.producer(topic="b", producer_id="tool-b", attempt=1) await on_b.append({"n": 2}) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - both = await take(consumer.read(type=dict), 2) - assert [(r.topic, r.value) for r in both] == [("a", {"n": 1}), ("b", {"n": 2})] + only_a = await take(stream.read(topic="a", result_type=dict), 1) + assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] + only_b = await take(stream.read(topic="b", result_type=dict), 1) + assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] -async def test_cursor_resumes_where_it_points(provider: ProviderCase): - workflow_id = provider.workflow_id - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) +async def test_cursor_resumes_where_it_points(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic="out", producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out"), 3) + records = await take(stream.read(topic="out", result_type=dict), 3) checkpoint = records[0].cursor # Resuming after a record hands back everything past it and nothing # twice, without the reader ever advancing a cursor itself. - resumed = await streams.consumer(provider.client, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, topic="out", after=checkpoint), 2) + again = await take(stream.read(topic="out", result_type=dict, after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] -async def test_append_cursor_names_the_last_record_of_the_batch( - provider: ProviderCase, -): - workflow_id = provider.workflow_id - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) +@pytest.mark.reports_positions +async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic="out", producer_id="model", attempt=1) appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - if appended is None: - pytest.skip(f"the {provider.name} provider learns positions at read time") - await producer.append({"n": 4}) + assert appended is not None + then = await producer.append({"n": 4}) # A producer that resumes a reader after its own append must see only # what came later, not the tail of the batch it just wrote. - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic="out", after=appended), 1) + records = await take(stream.read(topic="out", result_type=dict, after=appended), 1) assert [r.value for r in records] == [{"n": 4}] - assert await producer.append() is None + assert records[0].cursor == then + assert await producer.append() == then -async def test_latest_positions_a_reader_at_the_end(provider: ProviderCase): - workflow_id = provider.workflow_id - producer = await streams.producer( - provider.client, - workflow_id=workflow_id, - topic="out", - producer_id="model", - attempt=1, - ) - consumer = await streams.consumer(provider.client, workflow_id=workflow_id) - assert await consumer.latest(topic="out") == streams.BEGINNING +async def test_latest_positions_a_reader_at_the_end(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic="out", producer_id="model", attempt=1) + assert await stream.latest(topic="out") == BEGINNING await producer.append({"n": 1}, {"n": 2}) - since = await consumer.latest(topic="out") + since = await stream.latest(topic="out") await producer.append({"n": 3}) # A reader that positioned itself before the last append sees only what # came after, which is how a client follows a turn it is about to start. - records = await take(consumer.read(type=dict, topic="out", after=since), 1) + records = await take(stream.read(topic="out", result_type=dict, after=since), 1) assert [r.value for r in records] == [{"n": 3}] -@pytest.mark.inbound_stream -async def test_stream_addresses_with_colons_do_not_share_a_store( - provider: ProviderCase, -): +async def test_topic_addresses_with_colons_do_not_share_a_store(case: ProviderCase): # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. - base = provider.workflow_id - left = await streams.producer( - provider.client, workflow_id=f"{base}:x", stream="y", producer_id="l", attempt=1 + base = new_workflow_id() + left = await case.open(f"{base}:x") + right = await case.open(base) + await left.producer(topic="y", producer_id="l", attempt=1).append({"side": "left"}) + await right.producer(topic="x:y", producer_id="r", attempt=1).append( + {"side": "right"} ) - right = await streams.producer( - provider.client, workflow_id=base, stream="x:y", producer_id="r", attempt=1 - ) - await left.append({"side": "left"}) - await right.append({"side": "right"}) - seen_left = await streams.consumer( - provider.client, workflow_id=f"{base}:x", stream="y" - ) - only_left = await take(seen_left.read(type=dict), 1) + only_left = await take(left.read(topic="y", result_type=dict), 1) assert [r.value for r in only_left] == [{"side": "left"}] - assert await seen_left.latest() == only_left[0].cursor - seen_right = await streams.consumer(provider.client, workflow_id=base, stream="x:y") - only_right = await take(seen_right.read(type=dict), 1) + assert await left.latest(topic="y") == only_left[0].cursor + only_right = await take(right.read(topic="x:y", result_type=dict), 1) assert [r.value for r in only_right] == [{"side": "right"}] - assert await seen_right.latest() == only_right[0].cursor + assert await right.latest(topic="x:y") == only_right[0].cursor -async def test_producer_needs_exactly_one_address_and_an_identity( - provider: ProviderCase, -): - workflow_id = provider.workflow_id +async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): + stream = await case.open(new_workflow_id()) + # Refused by read() itself, not by the first iteration of its generator, + # so the caller's except clause is where the mistake surfaces. + with pytest.raises(StreamCursorError): + stream.read(topic="out", after=Cursor("elsewhere:42")) + + +async def test_argument_mistakes_are_value_errors(case: ProviderCase): + stream = await case.open(new_workflow_id()) with pytest.raises(ValueError): - await streams.producer( - provider.client, workflow_id=workflow_id, producer_id="model", attempt=1 - ) + stream.read(topic="") with pytest.raises(ValueError): - await streams.producer( - provider.client, - workflow_id=workflow_id, - stream="inputs", - topic="out", - producer_id="model", - attempt=1, - ) + stream.producer(topic="", producer_id="model", attempt=1) # Outside an activity there is no identity to fall back on. with pytest.raises(ValueError, match="producer_id is required"): - await streams.producer(provider.client, workflow_id=workflow_id, topic="out") - - -def test_unknown_provider_is_a_clear_error(): - with pytest.raises(RuntimeError, match="no stream provider 'nope'"): - streams.configure(provider="nope") - - -async def test_opening_a_stream_needs_a_configured_provider(): - # Building a provider is process setup, so the first workflow's thread - # is not allowed to do it as a side effect of opening a stream. - _provider._active = None - with pytest.raises(RuntimeError, match="streams.configure"): - await streams.consumer(None, workflow_id="wf") - # Closing with nothing configured is allowed, so a shutdown path can - # call it unconditionally. - await streams.close() - streams.configure(provider="memory") - assert await streams.consumer(None, workflow_id="wf") is not None - await streams.close() + stream.producer(topic="out") diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index 40487686d..58fb274ef 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -1,25 +1,37 @@ """Workflow-side conformance for the stream contract. -Runs the reader and writer handles inside a real workflow on the memory -provider with a warm cache, and states the two rules about workflow tasks as -tests: a publish commits with its task (rule 1), and reads are recorded -observations that replay re-supplies (rule 2). The memory provider keeps -neither and says so in its docstring, so those two are strict expected -failures here. A storage provider that runs this module turns them into -passes; that is the measurement they exist for. +Runs the reader and writer inside a real workflow on the memory provider +with a warm cache, and states the two rules about Workflow Tasks as tests: a +publish commits with its task (rule 1), and reads are recorded observations +that replay re-supplies (rule 2). The memory provider keeps neither and says +so in its docstring, so those two are strict expected failures here. A +storage provider that runs this module turns them into passes; that is the +measurement they exist for. + +The rest is what the portable surface promises on every provider: the +lifecycle hooks the worker calls, one subscription per topic per run, a read +that ends when the chain closes, a handle that follows continue-as-new, and +a topic shared by the workflow and an outside producer. """ from __future__ import annotations +import asyncio import uuid from typing import Any import pytest -from temporalio import streams, workflow +from temporalio import workflow from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams.providers import memory +from temporalio.streams import ( + Cursor, + ReadSource, + RecordKind, + StreamCursorError, + WriteSink, +) +from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import WorkflowEnvironment from temporalio.worker import Replayer from tests.helpers import new_worker @@ -29,49 +41,46 @@ DECISIONS = "decisions" -@pytest.fixture(autouse=True) -def _fresh_memory_provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] +@pytest.fixture +def provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] if env.supports_time_skipping: pytest.skip( "the memory provider polls on a timer, which time skipping turns into a spin" ) - memory.reset() - streams.configure(provider="memory") - yield - memory.reset() + streams = MemoryStreams() + yield streams + streams.reset() @workflow.defn class ContractLoop: """Reads ``inputs``, publishes a decision per value, reports control records.""" - def __init__(self) -> None: - streams.prepare() - @workflow.run async def run(self) -> list[dict[str, Any]]: - inputs = streams.reader(INPUTS, type=dict) - decisions = streams.writer(DECISIONS) + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) trace: list[dict[str, Any]] = [] try: async for record in inputs: - if isinstance(record.value, streams.Supersession): + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None trace.append( { "kind": "superseded", - "replaced": record.value.previous_attempt, - "attempt": record.value.attempt, + "replaced": record.supersession.previous_attempt, + "attempt": record.supersession.attempt, } ) - await decisions.publish( - {"retracting_attempt": record.value.previous_attempt} + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} ) continue if record.kind is RecordKind.FINISH: - trace.append({"kind": "finish", "producer": record.producer}) + trace.append({"kind": "finish", "producer": record.producer_id}) break - assert isinstance(record.value, dict) - await decisions.publish({"decided": record.value["n"]}) + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) trace.append( { "kind": "decision", @@ -81,42 +90,34 @@ async def run(self) -> list[dict[str, Any]]: ) finally: inputs.close() - await decisions.finish() + decisions.finish() # Twice on purpose: a finished topic stays finished, with one marker. - await decisions.finish() - streams.drain() + decisions.finish() return trace -async def _run_the_loop(client: Client) -> tuple[Any, list[dict[str, Any]]]: +async def _run_the_loop( + client: Client, provider: MemoryStreams +) -> tuple[Any, list[dict[str, Any]]]: workflow_id = f"streams-wf-{uuid.uuid4().hex}" - async with new_worker(client, ContractLoop, **streams.worker_options()) as worker: + async with new_worker(client, ContractLoop, plugins=[provider]) as worker: handle = await client.start_workflow( ContractLoop.run, id=workflow_id, task_queue=worker.task_queue ) - first = await streams.producer( - client, - workflow_id=workflow_id, - stream=INPUTS, - producer_id="model", - attempt=1, - ) + stream = provider.get_stream_handle(client, workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await first.append({"n": 1}, {"n": 2}) - second = await streams.producer( - client, - workflow_id=workflow_id, - stream=INPUTS, - producer_id="model", - attempt=2, - ) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"n": 3}) await second.finish() trace = await handle.result() return handle, trace -async def test_workflow_reads_decides_and_publishes(client: Client): - handle, trace = await _run_the_loop(client) +async def test_workflow_reads_decides_and_publishes( + client: Client, provider: MemoryStreams +): + handle, trace = await _run_the_loop(client, provider) assert trace == [ {"kind": "decision", "n": 1, "attempt": 1}, {"kind": "decision", "n": 2, "attempt": 1}, @@ -126,8 +127,8 @@ async def test_workflow_reads_decides_and_publishes(client: Client): ] # The outside view of what the workflow published, on its own topic. - consumer = await streams.consumer(client, workflow_id=handle.id) - records = await take(consumer.read(type=dict, topic=DECISIONS), 5) + stream = provider.get_stream_handle(client, handle.id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 5) assert [(r.kind, r.value) for r in records] == [ (RecordKind.DATA, {"decided": 1}), (RecordKind.DATA, {"decided": 2}), @@ -135,9 +136,30 @@ async def test_workflow_reads_decides_and_publishes(client: Client): (RecordKind.DATA, {"decided": 3}), (RecordKind.FINISH, None), ] - assert all(r.producer == "" and r.topic == DECISIONS for r in records) + assert all(r.producer_id == "" and r.topic == DECISIONS for r in records) # The second finish() wrote nothing: the marker is the newest record. - assert await consumer.latest() == records[-1].cursor + assert await stream.latest(topic=DECISIONS) == records[-1].cursor + + +async def test_read_ends_when_the_workflow_closes_and_the_tail_is_delivered( + client: Client, provider: MemoryStreams +): + handle, _ = await _run_the_loop(client, provider) + stream = provider.get_stream_handle(client, handle.id) + + async def read_everything() -> list[Any]: + return [r.value async for r in stream.read(topic=DECISIONS, result_type=dict)] + + # No count and no early break: the read ends by itself once the workflow + # is closed and everything it retained has been handed over. + values = await asyncio.wait_for(read_everything(), 30) + assert values == [ + {"decided": 1}, + {"decided": 2}, + {"retracting_attempt": 1}, + {"decided": 3}, + None, + ] @pytest.mark.xfail( @@ -148,12 +170,14 @@ async def test_workflow_reads_decides_and_publishes(client: Client): "provider reads live process memory instead" ), ) -async def test_replay_without_the_store_resupplies_the_records(client: Client): - handle, _ = await _run_the_loop(client) +async def test_replay_without_the_store_resupplies_the_records( + client: Client, provider: MemoryStreams +): + handle, _ = await _run_the_loop(client, provider) history = await handle.fetch_history() - memory.reset() - replayer = Replayer(workflows=[ContractLoop], **streams.worker_options()) + provider.reset() + replayer = Replayer(workflows=[ContractLoop], plugins=[provider]) await replayer.replay_workflow(history) @@ -167,20 +191,16 @@ async def test_replay_without_the_store_resupplies_the_records(client: Client): class PublishThenFail: """Publishes, then fails its first workflow task; the retry publishes again.""" - def __init__(self) -> None: - streams.prepare() - @workflow.run async def run(self) -> None: - decisions = streams.writer(DECISIONS) + decisions = workflow.stream_writer(DECISIONS) run_id = workflow.info().run_id committed = run_id in _failed_once - await decisions.publish({"committed": committed}) + decisions.publish({"committed": committed}) if not committed: _failed_once.add(run_id) raise RuntimeError("the first task fails after publishing") - await decisions.finish() - streams.drain() + decisions.finish() @pytest.mark.xfail( @@ -191,18 +211,237 @@ async def run(self) -> None: "visible at publish time" ), ) -async def test_a_failed_task_publishes_nothing(client: Client): +async def test_a_failed_task_publishes_nothing(client: Client, provider: MemoryStreams): workflow_id = f"streams-wf-{uuid.uuid4().hex}" - async with new_worker( - client, PublishThenFail, **streams.worker_options() - ) as worker: + async with new_worker(client, PublishThenFail, plugins=[provider]) as worker: handle = await client.start_workflow( PublishThenFail.run, id=workflow_id, task_queue=worker.task_queue ) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic=DECISIONS), 2, timeout=30) + stream = provider.get_stream_handle(client, workflow_id) + records = await take( + stream.read(topic=DECISIONS, result_type=dict), 2, timeout=30 + ) await handle.result() assert [(r.kind, r.value) for r in records] == [ (RecordKind.DATA, {"committed": True}), (RecordKind.FINISH, None), ] + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +class _RecordingHalf: + """A workflow half that logs the hooks the worker calls, then delegates.""" + + def __init__(self, inner: Any, calls: list[tuple[str, str]]) -> None: + self._inner = inner + self._calls = calls + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + return self._inner.open_reader(topic, after=after) + + def open_writer(self, topic: str) -> WriteSink: + return self._inner.open_writer(topic) + + def on_workflow_start(self) -> None: + self._calls.append(("start", workflow.info().run_id)) + + async def on_workflow_finish(self) -> None: + self._calls.append(("finish", workflow.info().run_id)) + + +class HookedMemory(MemoryStreams): + """The memory provider with its lifecycle hooks made visible.""" + + def __init__(self) -> None: + super().__init__() + self.calls: list[tuple[str, str]] = [] + + def workflow_provider(self) -> Any: + return _RecordingHalf(super().workflow_provider(), self.calls) + + +@pytest.mark.usefixtures("provider") +async def test_the_worker_calls_the_lifecycle_hooks_around_every_run(client: Client): + hooked = HookedMemory() + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[hooked]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + # Start before the function, finish after it, on both runs: the finish + # hook runs on the continue-as-new exit too, so a provider that parked + # something against the first run can let go before the successor starts. + kinds = [kind for kind, _ in hooked.calls] + assert kinds == ["start", "finish", "start", "finish"] + runs = [run_id for _, run_id in hooked.calls] + assert runs[0] == runs[1] and runs[2] == runs[3] and runs[0] != runs[2] + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[provider]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 30) + await handle.result() + # The chain is followed: the successor's records arrive on the same read, + # and the read ends only when the last run of the chain is closed. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + + +@workflow.defn +class SharedReaders: + """Opens the same topic twice and pulls from both readers in turn.""" + + @workflow.run + async def run(self) -> list[Any]: + first = workflow.stream_reader(INPUTS, result_type=dict) + second = workflow.stream_reader(INPUTS, result_type=dict) + trace: list[Any] = ["shared" if first is second else "separate"] + try: + workflow.stream_reader(INPUTS, result_type=dict, after=Cursor("memory:0")) + except ValueError: + trace.append("after-rejected") + try: + workflow.stream_reader(INPUTS, result_type=list) + except ValueError: + trace.append("type-rejected") + trace.append((await first.__anext__()).value) + trace.append((await second.__anext__()).value) + first.close() + return trace + + +async def test_a_second_reader_on_a_topic_shares_the_subscription( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, SharedReaders, plugins=[provider]) as worker: + handle = await client.start_workflow( + SharedReaders.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=INPUTS, producer_id="model", attempt=1).append( + {"n": 1}, {"n": 2} + ) + assert await handle.result() == [ + "shared", + "after-rejected", + "type-rejected", + {"n": 1}, + {"n": 2}, + ] + + +@workflow.defn +class ForeignCursor: + """Resumes from a cursor another provider minted.""" + + @workflow.run + async def run(self) -> str: + try: + workflow.stream_reader(INPUTS, after=Cursor("elsewhere:1")) + except StreamCursorError: + return "refused" + return "accepted" + + +async def test_the_workflow_reader_refuses_a_foreign_cursor( + client: Client, provider: MemoryStreams +): + async with new_worker(client, ForeignCursor, plugins=[provider]) as worker: + result = await client.execute_workflow( + ForeignCursor.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert result == "refused" + + +@workflow.defn +class NoProvider: + """Opens a stream on a worker that has no provider.""" + + @workflow.run + async def run(self) -> str: + try: + workflow.stream_reader(INPUTS) + except RuntimeError as error: + return str(error) + return "opened" + + +async def test_a_worker_without_a_provider_says_so(client: Client): + async with new_worker(client, NoProvider) as worker: + result = await client.execute_workflow( + NoProvider.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert "no stream provider is configured" in result + + +@workflow.defn +class OneLine: + """Publishes one record and finishes the topic.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"from": "workflow"}) + decisions.finish() + + +async def test_an_outside_producer_and_the_workflow_share_a_topic( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, OneLine, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=DECISIONS, producer_id="tool", attempt=1).append( + {"from": "producer"} + ) + handle = await client.start_workflow( + OneLine.run, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + + records = await asyncio.wait_for(read_everything(), 30) + # Both writers land on one topic in one order, each under its own + # identity: the producer's records carry its id, the workflow's carry none. + assert [(r.producer_id, r.kind, r.value) for r in records] == [ + ("tool", RecordKind.DATA, {"from": "producer"}), + ("", RecordKind.DATA, {"from": "workflow"}), + ("", RecordKind.FINISH, None), + ] From 1ea907cb038c4bf7961bec175836ddca04c9af89 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 01:54:17 -0700 Subject: [PATCH 297/831] Moved the stream demo and changelog entry onto the new surface. --- CHANGELOG.md | 7 ++++++ streams_demo/agent_loop.py | 42 +++++++++++++--------------------- streams_demo/provider_setup.py | 26 +++++++++++++-------- streams_demo/run_demo.py | 29 ++++++++++------------- 4 files changed, 51 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 796548c8c..6865fa6c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,13 @@ to include examples, links to docs, or any other relevant information. Workflow Streams. - `ExternalStreamSubscription.records()` yields each value with the provider offset it was read from, for a reader that has to name where it got to. + can read, decide on, and write. `workflow.stream_reader()` and + `workflow.stream_writer()` are the workflow-side entry points, a provider is a + worker plugin passed as `Worker(plugins=[provider])`, and + `provider.get_stream_handle()` reads and appends from outside. The record on + the wire is `temporal.api.stream.v1.StreamRecord` on every provider. + `temporalio.streams.providers.memory.MemoryStreams` is the in-memory + reference provider the conformance tests run against. - Added experimental External Workflow Streams in `temporalio.contrib.external_workflow_streams`. Workflow stream payloads are diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index f6f14b873..330cb54c2 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -14,7 +14,8 @@ from datetime import timedelta from typing import Any -from temporalio import activity, streams, workflow +from temporalio import activity, workflow +from temporalio.streams import RecordKind DECISIONS = "decisions" INPUTS = "inputs" @@ -41,50 +42,42 @@ def decide(token: dict[str, Any]) -> dict[str, Any]: class AgentLoop: """Read, decide, write, until the producer says it has finished.""" - def __init__(self) -> None: - """Let the provider install what it needs before the first task. - - A no-op except on a transport that serves outside readers through - handlers on this workflow, which has to register them before the - first task completes or an early reader finds nothing to talk to. - """ - streams.prepare() - @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: """Decide on at most ``limit`` inputs, then return the trace.""" - inputs = streams.reader(INPUTS, type=dict, idle_timeout=timedelta(seconds=1)) - decisions = streams.writer(DECISIONS) + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) trace: list[dict[str, Any]] = [] accepted = 0 try: async for record in inputs: - if isinstance(record.value, streams.Supersession): + if record.kind is RecordKind.SUPERSEDED: # A newer attempt of the same producer started writing. The # decisions already published stand, so the workflow says so # rather than pretending they can be withdrawn. + assert record.supersession is not None trace.append( { "kind": "superseded", - "producer": record.producer, - "replaced": record.value.previous_attempt, - "attempt": record.value.attempt, + "producer": record.producer_id, + "replaced": record.supersession.previous_attempt, + "attempt": record.supersession.attempt, } ) - await decisions.publish( - {"retracting_attempt": record.value.previous_attempt} + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} ) continue - if record.kind is streams.RecordKind.FINISH: + if record.kind is RecordKind.FINISH: # The producer says it is done, which is what ends the loop. # Counting decisions instead would leave the terminal record # unread and let the workflow finish while its producer is # still writing. - trace.append({"kind": "finish", "producer": record.producer}) + trace.append({"kind": "finish", "producer": record.producer_id}) break - assert isinstance(record.value, dict) + assert record.value is not None decision = decide(record.value) - await decisions.publish(decision) + decisions.publish(decision) receipt = await workflow.execute_activity( record_decision, decision, @@ -101,8 +94,5 @@ async def run(self, limit: int) -> list[dict[str, Any]]: break finally: inputs.close() - await decisions.finish() - # Lets go of anything the provider parked against this run, so a - # transport that holds a long poll open can let the workflow return. - streams.drain() + decisions.finish() return trace diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index aab3b6cfc..2e4bcc350 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -1,14 +1,17 @@ """Pick the provider for a demo run from the environment. -``STREAMS_PROVIDER`` names any registered provider; this tree carries -``memory`` and ``redis``. The demo needs a Temporal server to run the -workflow either way; ``TEMPORAL_ADDRESS`` points at it. +``STREAMS_PROVIDER`` names a provider; this base tree carries only ``memory``, +and each provider branch adds its own name here. The demo needs a Temporal +server to run the workflow either way; ``TEMPORAL_ADDRESS`` points at it. """ from __future__ import annotations import os +from temporalio.streams.providers import ProviderPlugin +from temporalio.streams.providers.memory import MemoryStreams + NAME = os.environ.get("STREAMS_PROVIDER", "memory") # The memory provider is not replay-safe, so its demo keeps the cache warm. @@ -16,15 +19,18 @@ WORKFLOW_CACHE = int(os.environ.get("STREAMS_WORKFLOW_CACHE", "512")) -async def open() -> tuple[str, dict]: - """The server to connect to and the options :func:`configure` takes.""" - return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), {"provider": NAME} +async def open() -> tuple[str, ProviderPlugin]: + """The server to connect to and the provider the worker and the client share.""" + if NAME != "memory": + raise SystemExit(f"this tree carries no stream provider named {NAME!r}") + return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), MemoryStreams() -async def close() -> None: +async def close(provider: ProviderPlugin) -> None: """Let go of whatever :func:`open` acquired. - Nothing here: the memory provider holds no connection. A provider branch - that opens one closes it here, so the demo's teardown reads the same on - every provider. + The memory provider holds no connection, so this is its ``close()`` and + nothing more. A provider branch that opens one closes it the same way, so + the demo's teardown reads the same on every provider. """ + await provider.close() diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index c4fc8e042..1238fad11 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -7,7 +7,7 @@ the run as it allows is rebuilt rather than remembered; - a producer whose second attempt supersedes its first, which the reader has to report and the workflow has to act on; -- an outside consumer reading what the workflow published. +- an outside reader following what the workflow published. Byte-identical in every tree. ``provider_setup`` is what differs, and it is the only import here that names a provider. @@ -23,24 +23,23 @@ from pathlib import Path from typing import Any -from temporalio import streams from temporalio.api.enums.v1 import EventType from temporalio.client import Client +from temporalio.streams import StreamHandle from temporalio.worker import Worker sys.path.insert(0, str(Path(__file__).resolve().parent)) import provider_setup # noqa: E402 -from agent_loop import INPUTS, AgentLoop, record_decision # noqa: E402 +from agent_loop import DECISIONS, INPUTS, AgentLoop, record_decision # noqa: E402 DECISION_LIMIT = 8 EXPECTED_OUTPUT = 6 -async def collect_output(client: Client, workflow_id: str, want: int) -> list[dict]: +async def collect_output(stream: StreamHandle, want: int) -> list[dict]: """Read ``want`` decisions off the workflow's stream from outside it.""" - reader = await streams.consumer(client, workflow_id=workflow_id) seen: list[dict] = [] - async for record in reader.read(type=dict, topic="decisions"): + async for record in stream.read(topic=DECISIONS, result_type=dict): seen.append({"kind": record.kind.name, "value": record.value}) if len(seen) >= want: break @@ -51,9 +50,8 @@ async def main() -> int: """Run the demo once and write what happened next to this file.""" out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" out.mkdir(exist_ok=True) - target, options = await provider_setup.open() + target, provider = await provider_setup.open() client = await Client.connect(target, namespace="default") - streams.configure(**options) uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex record: dict[str, Any] = { @@ -69,24 +67,21 @@ async def main() -> int: workflows=[AgentLoop], activities=[record_decision], max_cached_workflows=provider_setup.WORKFLOW_CACHE, - **streams.worker_options(), + plugins=[provider], ): handle = await client.start_workflow( AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid ) - output = asyncio.create_task(collect_output(client, uid, EXPECTED_OUTPUT)) + stream = provider.get_stream_handle(client, uid) + output = asyncio.create_task(collect_output(stream, EXPECTED_OUTPUT)) # The first attempt writes two records and then stops, as a failed # activity would. The second writes different inputs under the same # logical producer, which is what the reader has to report. - first = await streams.producer( - client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=1 - ) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await first.append({"id": "r1", "value": 1}, {"id": "r2", "value": 2}) await asyncio.sleep(0.5) - second = await streams.producer( - client, workflow_id=uid, stream=INPUTS, producer_id="model", attempt=2 - ) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"id": "r3", "value": 3}, {"id": "r4", "value": 4}) await second.finish() @@ -146,7 +141,7 @@ async def main() -> int: history = await handle.fetch_history() record["history_events"] = len(history.events) (out / "history.json").write_text(history.to_json()) - await provider_setup.close() + await provider_setup.close(provider) (out / "results.json").write_text(json.dumps(record, indent=2) + "\n") print(json.dumps(record, indent=2)) return 0 if record["outcome"] == "completed" else 1 From 2659a1784994f4e727c55c5e3a42ff7cfbc10034 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:00:38 -0700 Subject: [PATCH 298/831] Rewrote the Redis provider with an input and an output stream per topic. The transport keys every stream by direction, so an outside producer appends each record to the input stream that wakes a subscribed workflow and to the output stream where the workflow's promoted batches land. A workflow's publish is synchronous and stages with the task; an outside read ends with the workflow. --- CHANGELOG.md | 13 +- streams_demo/provider_setup.py | 26 +- temporalio/streams/providers/redis.py | 819 ++++++++++++++-------- tests/streams/test_redis_provider.py | 45 ++ tests/streams/test_redis_replay.py | 134 +++- tests/streams/test_streams_conformance.py | 53 +- 6 files changed, 742 insertions(+), 348 deletions(-) create mode 100644 tests/streams/test_redis_provider.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6865fa6c2..a084569bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,20 +36,17 @@ to include examples, links to docs, or any other relevant information. ### Added - **Experimental**: `temporalio.streams` defines one stream interface a workflow - can read, decide on, and write, with a registry that picks the provider when - the worker is built. `temporalio.streams.providers.memory` is the in-memory - reference provider the conformance tests run against, and - `temporalio.streams.providers.redis` serves the same interface over External - Workflow Streams. -- `ExternalStreamSubscription.records()` yields each value with the provider - offset it was read from, for a reader that has to name where it got to. can read, decide on, and write. `workflow.stream_reader()` and `workflow.stream_writer()` are the workflow-side entry points, a provider is a worker plugin passed as `Worker(plugins=[provider])`, and `provider.get_stream_handle()` reads and appends from outside. The record on the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory - reference provider the conformance tests run against. + reference provider the conformance tests run against, and + `temporalio.streams.providers.redis.RedisStreams` serves the same interface + over External Workflow Streams, one topic as an input and an output stream. +- `ExternalStreamSubscription.records()` yields each value with the provider + offset it was read from, for a reader that has to name where it got to. - Added experimental External Workflow Streams in `temporalio.contrib.external_workflow_streams`. Workflow stream payloads are diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index 2e4bcc350..7fbf9316c 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -1,8 +1,9 @@ """Pick the provider for a demo run from the environment. -``STREAMS_PROVIDER`` names a provider; this base tree carries only ``memory``, -and each provider branch adds its own name here. The demo needs a Temporal -server to run the workflow either way; ``TEMPORAL_ADDRESS`` points at it. +``STREAMS_PROVIDER`` names a provider; this tree carries ``memory`` and +``redis``. The demo needs a Temporal server to run the workflow either way; +``TEMPORAL_ADDRESS`` points at it, and the Redis demo reads its store from +``AI198_REDIS_URL`` and ``AI198_REDIS_PREFIX``. """ from __future__ import annotations @@ -21,16 +22,23 @@ async def open() -> tuple[str, ProviderPlugin]: """The server to connect to and the provider the worker and the client share.""" - if NAME != "memory": - raise SystemExit(f"this tree carries no stream provider named {NAME!r}") - return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), MemoryStreams() + address = os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + if NAME == "memory": + return address, MemoryStreams() + if NAME == "redis": + from temporalio.streams.providers.redis import RedisStreams + + return address, RedisStreams( + url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6379"), + key_prefix=os.environ.get("AI198_REDIS_PREFIX", "ai198-contract"), + ) + raise SystemExit(f"this tree carries no stream provider named {NAME!r}") async def close(provider: ProviderPlugin) -> None: """Let go of whatever :func:`open` acquired. - The memory provider holds no connection, so this is its ``close()`` and - nothing more. A provider branch that opens one closes it the same way, so - the demo's teardown reads the same on every provider. + The memory provider holds no connection and the Redis provider closes + the client it opened, so the demo's teardown reads the same on both. """ await provider.close() diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 3cc24e538..552e3d904 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -1,81 +1,238 @@ """The client-side (Redis) provider. -Streams live in a store the customer runs, Redis here. A workflow's publish is -buffered by the worker, staged invisibly under a token, and promoted only once -a marker in History proves the workflow task that produced it was accepted. -Consumption is recorded the same way, as ranges and boundaries in History. - -``configure`` takes ``url`` and ``key_prefix`` (defaulting to -``TEMPORAL_TEST_REDIS_URL``, then ``AI198_REDIS_URL``, and -``AI198_REDIS_PREFIX``), or a constructed ``backend`` when the caller wants to -own its lifecycle. The Redis client is opened on first use, so it belongs to -the loop that uses it, and released by ``close``. +Streams live in a store the customer runs, Redis here, behind the external +workflow streams transport. A workflow's publish is buffered by the worker, +staged invisibly under a token when the Workflow Task completes, and promoted +only once a marker in History proves the task was accepted. Consumption is +recorded the same way, as ranges and boundaries in History. + +The mapping, in one place: + +- The transport keeps two Redis streams per topic, one the workflow reads and + one outside readers read, because the direction is part of every key it + derives. An outside producer therefore appends each record to both: the + input stream, which wakes a workflow subscribed to the topic, and the + output stream, where the workflow's own promoted batches land, so an + outside reader sees the producer's records and the workflow's in one order + and a workflow reading the topic misses nothing however early the producer + started. The cost is one more append per record and one wake per batch. +- A record rides as the transport's payload: the serialized ``StreamRecord`` + proto as a ``binary/plain`` value, which the worker's codec encodes and + decodes like any other payload. +- Producer identity dedupes through the transport's idempotency: the session + is ``producer#attempt`` and every record carries a sequence, so a retried + batch is dropped with the original position and a new attempt passes. +- Cursors are ``redis:-`` on the outside surface and name a position + in the output stream. A workflow-side record carries ``redis:in:-`` + for information only: the transport starts a run's subscription where the + chain left off, so a workflow reader cannot resume from a cursor. +- Streams are keyed by the chain's first run, so a handle follows continue-as- + new by construction and ``run_id`` only decides whose close ends a read. +- A task's publishes are staged as one batch. The transport's own per-task + batch limits are lifted for this provider, because a synchronous publish + cannot wait for the worker to stage a full batch; a batch it cannot stage + fails the task. """ from __future__ import annotations import asyncio import logging -import os +import re import time -from collections.abc import AsyncGenerator +from collections.abc import AsyncGenerator, Coroutine from datetime import timedelta from typing import Any -from temporalio.api.common.v1 import Payload +from google.protobuf.message import DecodeError + +from temporalio import workflow from temporalio.client import Client, WorkflowExecutionStatus from temporalio.contrib.external_workflow_streams import ( AFTER, - ExternalOutputStreamClient, + AppendConflictError, + AppendNotAcknowledgedError, + ChainKeyMismatchError, ExternalOutputStreamProducer, ExternalStreamProducer, Offset, - OutputStreamRecord, + OutputAppendNotAcknowledgedError, + StreamDirection, WakeNotAcknowledgedError, WorkflowChainKey, external_output_stream, external_stream, ) from temporalio.contrib.external_workflow_streams import ( - BEGINNING as PROVIDER_BEGINNING, + BEGINNING as TRANSPORT_BEGINNING, +) +from temporalio.contrib.external_workflow_streams import ( + RecordKind as TransportRecordKind, +) +from temporalio.contrib.external_workflow_streams import ( + StreamError as TransportStreamError, ) from temporalio.contrib.external_workflow_streams._backend import DEFAULT_WATCH_BLOCK -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.contrib.external_workflow_streams._codec import StreamPayloadCodec +from temporalio.contrib.external_workflow_streams._output_client import ( + _reconcile_output_stage, +) +from temporalio.converter import WorkflowSerializationContext +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin +from temporalio.worker import ReplayerConfig, WorkerConfig + +__all__ = ["RedisProducer", "RedisStreamHandle", "RedisStreams"] + +_PROVIDER = "redis" +_INPUT_PREFIX = "in:" +_REDIS_ID = re.compile(r"\d+-\d+") +_READ_BATCH = 256 + +# The transport's per-task batch limits are a backpressure point that awaits +# inside the workflow, and a synchronous publish has nowhere to await. Lifted +# to where they cannot fire, so a task's publishes stage as one batch. +_UNBOUNDED_OUTPUT = external_output_stream.with_options( + max_records=1 << 30, max_logical_bytes=1 << 40 +) logger = logging.getLogger(__name__) -class _ExternalReadSource: +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _outside_position(after: Cursor) -> Offset | None: + """The output-stream offset an outside cursor names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + if token.startswith(_INPUT_PREFIX): + raise StreamCursorError( + f"cursor {after.token!r} names a position in the workflow's input log, " + "which only the workflow reads" + ) + if not _REDIS_ID.fullmatch(token): + raise StreamCursorError( + f"cursor {after.token!r} does not name a Redis stream position" + ) + return Offset(token) + + +def _drive(coroutine: Coroutine[Any, Any, None]) -> None: + """Run a transport publish to completion without yielding to the loop. + + The transport's publish only awaits when the task's batch is full. A + synchronous publish has nowhere to wait, so a publish that would have + waited fails the task instead, loudly. + """ + try: + coroutine.send(None) + except StopIteration: + return + coroutine.close() + raise StreamError( + "this Workflow Task's output batch is full, and a synchronous publish " + "cannot wait for the worker to stage it" + ) + + +def _parse(cursor: Cursor, raw: bytes, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(raw) + except DecodeError as error: + # Same answer as an undecodable body: skip and say so, so one bad + # record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None + + +class _RedisReadSource: + """One subscription of the running workflow, over the transport's input stream.""" + def __init__(self, subscription: Any) -> None: self._subscription = subscription self._records = subscription.records() - async def next_batch(self) -> list[tuple[Cursor, bytes]]: - # One record per batch. The provider reports readiness per record, so a - # batch here would be this binding inventing a boundary the provider - # never observed, and replay records boundaries. - offset, body = await self._records.__anext__() - return [(Cursor(str(offset)), body)] + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + while True: + # One record per batch: the transport reports readiness per record, + # and a batch here would invent a boundary replay never observed. + offset, body = await self._records.__anext__() + cursor = mint_cursor(_PROVIDER, f"{_INPUT_PREFIX}{offset.token}") + wire = _parse(cursor, body, workflow.logger.warning) + if wire is not None: + return [(cursor, wire)] def close(self) -> None: self._subscription.close() -class _ExternalWriteSink: - def __init__(self, topic: Any) -> None: - self._topic = topic +class _RedisWriteSink: + def __init__(self, topic: str) -> None: + self._topic = _UNBOUNDED_OUTPUT.topic(topic, type=bytes) - async def publish(self, frame: bytes) -> None: - # Awaited for real here. The worker holds a bounded output batch, and a - # publisher that has filled it waits for room rather than growing it. - await self._topic.publish(frame) + def publish(self, record: WireRecord) -> None: + # Buffered in the transport's per-task batch, staged by the worker when + # the task completes and promoted once History proves the task was + # accepted: rule 1 through the transport's own commit. + _drive(self._topic.publish(record.SerializeToString())) -async def _chain_key(client: Client, workflow_id: str) -> WorkflowChainKey: - description = await client.get_workflow_handle(workflow_id).describe() +class _RedisWorkflowProvider: + """The workflow half: the transport's subscriptions and staged output.""" + + def __init__(self, idle_timeout: timedelta) -> None: + self._input = external_stream.with_options(idle_timeout=idle_timeout) + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + if cursor_position(after, provider=_PROVIDER) is not None: + raise StreamUnsupportedError( + "the redis provider starts a run's subscription where the chain " + "left off; it cannot resume a workflow reader from a cursor" + ) + return _RedisReadSource(self._input.topic(topic, type=bytes).subscribe()) + + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _RedisWriteSink(topic) + + def on_workflow_start(self) -> None: + pass + + async def on_workflow_finish(self) -> None: + pass + + +async def _chain(client: Client, workflow_id: str) -> WorkflowChainKey: + try: + description = await client.get_workflow_handle(workflow_id).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {workflow_id!r} was not found" + ) from error + raise return WorkflowChainKey( client.namespace, workflow_id, @@ -83,230 +240,371 @@ async def _chain_key(client: Client, workflow_id: str) -> WorkflowChainKey: ) -def _placed(result: Any) -> Offset: - # An inbound topic answers a publish with the offset. The owner's output - # stream answers with the whole record, whose text form is not a position. - return result.offset if isinstance(result, OutputStreamRecord) else result +def _storage_error(error: Exception, what: str) -> StreamError: + return StreamError(f"{what}: {error}") class RedisProducer: - """Appends to a stream from outside workflow code. + """Appends to a topic from outside workflow code. - Every append is visible as soon as it is written. That is the point for an - activity streaming model output, and it is why an activity carries its own - identity: the retry of a failed attempt has no commit boundary to sort it - out afterwards. + Every append is visible as soon as the store accepts it. Each record goes + to the topic's input stream, waking a workflow subscribed to it, and to + its output stream, where outside readers and the workflow's own records + meet; the cursor returned names the output position. """ def __init__( self, - topic: Any, - converter: Any, - frame_topic: str, + streams: RedisStreams, + client: Client, + workflow_id: str, + topic: str, producer_id: str, attempt: int, - client: Client | None = None, - workflow_id: str = "", ) -> None: - """Bind this producer to ``topic`` on the external store. - - ``frame_topic`` is what each record carries: the topic name on the - owner's stream, empty on an inbound stream. - """ + """Bind this producer to ``topic`` of ``workflow_id``'s stream.""" + self._streams = streams + self._client = client + self._workflow_id = workflow_id self._topic = topic - self._converter = converter - self._frame_topic = frame_topic self._producer_id = producer_id self._attempt = attempt - self._client = client - self._workflow_id = workflow_id + self._converter = client.data_converter.payload_converter self._sequence = 0 + self._last = BEGINNING + self._input: Any = None + self._output: Any = None + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` and return the last one's cursor, or ``None`` for none. + @property + def _session(self) -> str: + # The transport dedupes on this and the sequence. The attempt is part + # of it so a retried append is dropped while a new generation writing + # different words at the same sequence is not. + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. - A repeat of an earlier append comes back with the original position. - The store drops the duplicate, but this seam does not say so, and a - reader resuming after that position still sees only what came later. + A repeat returns where the original landed, because the transport + answers a byte-identical repeat with the original offset; an empty + call returns the position of this producer's last record. """ - last: Offset | None = None - for value in values: - frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.DATA, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), - ) - self._sequence += 1 - last = _placed(await self._topic.publish(frame)) - return None if last is None else Cursor(last.token) + if not values: + return self._last + return await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.DATA, + value=value, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence + index, + ) + for index, value in enumerate(values) + ] + ) async def finish(self) -> None: - """Declare this stream complete.""" - frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", + """Write ``FINISH`` for this producer on this topic. + + Written as an ordinary record rather than the transport's own + terminal, which would end every outside read of the topic; a + ``FINISH`` here only says this producer is done. + """ + await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] ) - self._sequence += 1 + + async def _connect(self) -> None: + if self._output is not None: + return + backend = self._streams._require_backend() + chain = await _chain(self._client, self._workflow_id) + try: + output = await ExternalOutputStreamProducer.connect( + backend=backend, + workflow=chain, + client=self._client, + session_id=self._session, + ) + input_ = await ExternalStreamProducer.connect( + backend=backend, + workflow=chain, + client=self._client, + session_id=self._session, + ) + except ChainKeyMismatchError as error: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} is not the chain this producer " + f"was opened on: {error}" + ) from error + self._output = output.topic(self._topic, type=bytes) + self._input = input_.topic(self._topic, type=bytes) + + async def _write(self, records: list[WireRecord]) -> Cursor: + await self._connect() + last: Offset | None = None + try: + for record in records: + frame = record.SerializeToString() + await self._input.publish(frame, wake=False) + placed = await self._output.publish(frame) + last = placed.offset + await self._wake() + except AppendConflictError as error: + raise StreamProducerError( + f"producer {self._session!r} already wrote a different record at " + f"sequence {error.key.sequence}" + ) from error + except (AppendNotAcknowledgedError, OutputAppendNotAcknowledgedError) as error: + raise _storage_error(error, "an append was not acknowledged") from error + except TransportStreamError as error: + raise _storage_error(error, "the store refused an append") from error + self._sequence += len(records) + assert last is not None + self._last = mint_cursor(_PROVIDER, last.token) + return self._last + + async def _wake(self) -> None: try: - await self._topic.publish(frame) + await self._input.wake() except WakeNotAcknowledgedError: - # The record is appended; what failed is telling a consumer that is - # no longer there to be told. A terminal record most often races the - # consumer acting on it, so treating an absent consumer as a failed - # publish would make the ordinary ending look like an error. + # The records are appended; what failed is telling a consumer that + # is no longer there to be told. A terminal record most often races + # the consumer acting on it, so an absent consumer is the ordinary + # ending rather than an error. if not await self._consumer_has_gone(): raise + except TransportStreamError as error: + raise _storage_error(error, "the wake could not be sent") from error async def _consumer_has_gone(self) -> bool: """Whether the consuming execution is closing or closed. - Asked rather than assumed, and asked for a few seconds rather than - once: the server refuses the wake while the execution is closing, and - at that moment its status is still the running one. A single look would - read "running" and turn the ordinary ending into an error. + Asked for a few seconds rather than once: the server refuses the wake + while the execution is closing, and at that moment its status is + still the running one. """ - if self._client is None or not self._workflow_id: - return False handle = self._client.get_workflow_handle(self._workflow_id) deadline = time.monotonic() + 5 while True: - description = await handle.describe() - status = description.status + try: + status = (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + return True + raise if status is not None and status != WorkflowExecutionStatus.RUNNING: return True if time.monotonic() >= deadline: return False await asyncio.sleep(0.1) - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - return payload.SerializeToString() - -class RedisConsumer: - """Reads a stream from outside workflow code, resumably.""" +class RedisStreamHandle: + """One workflow's topics from outside, over the transport's output streams.""" - def __init__(self, client: Any, converter: Any, workflow_id: str) -> None: - """Read what ``client`` reaches in the external store.""" + def __init__( + self, + streams: RedisStreams, + client: Client, + workflow_id: str, + run_id: str | None, + ) -> None: + """Address ``workflow_id``'s topics; ``run_id`` decides whose close ends a read.""" + self._streams = streams self._client = client - self._converter = converter self._workflow_id = workflow_id + self._run_id = run_id + self._converter = client.data_converter.payload_converter + self._codec: StreamPayloadCodec[bytes] = StreamPayloadCodec( + client.data_converter.with_context( + WorkflowSerializationContext( + namespace=client.namespace, workflow_id=workflow_id + ) + ), + bytes, + ) - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield the records after ``after`` as they arrive. - - Applies the same supersession rule as a workflow reader, so a browser - and a workflow watching one activity agree on which attempt is current. - """ - # Only the owner's stream is readable from here, so the inbound check - # can never fire; it runs so every provider answers a topic the same way. - _provider.check_topic("", topic) - name = self._require_topic(topic) - attempts = AttemptTracker() - boundary = AFTER(Offset(after.token)) if after.token else PROVIDER_BEGINNING - handle = self._client.topic(name, type=bytes) - async for item in handle.subscribe(after=boundary): - cursor = Cursor(str(item.offset)) + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + position = _outside_position(after) + return self._read(topic, position, after, result_type) + + async def _read( + self, + topic: str, + position: Offset | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + backend = self._streams._require_backend() + chain = await _chain(self._client, self._workflow_id) + key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) + cursor = TRANSPORT_BEGINNING if position is None else AFTER(position) + closed = False + while True: try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data - ) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning( - "skipping record %s of %s topic %s: %s", + result = await backend.read_output_after( + key, cursor, - self._workflow_id, - name, - error, + max_records=_READ_BATCH, + block=self._streams._poll, + ) + except TransportStreamError as error: + raise _storage_error(error, "the store could not be read") from error + for placed in result.records: + cursor = AFTER(placed.offset) + if placed.kind is not TransportRecordKind.DATA: + continue + minted = mint_cursor(_PROVIDER, placed.offset.token) + wire = _parse( + minted, await self._codec.decode(placed.payload), logger.warning + ) + if wire is None: + continue + for record in decoder.decode(minted, wire): + yield record + if result.pending is not None: + # A staged batch whose task History has not settled yet is a + # barrier: nothing past it is read until History says whether + # the task was accepted. + resolved = await _reconcile_output_stage( + backend=backend, + client=self._client, + workflow_id=self._workflow_id, + manifest=result.pending.manifest, ) + if not resolved: + await asyncio.sleep(self._streams._poll.total_seconds()) continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + if result.records: + continue + if closed: + return + # One more pass after learning the workflow closed, so a batch + # promoted between the read and the describe is not lost. + closed = await self._closed() + + async def _closed(self) -> bool: + handle = self._client.get_workflow_handle( + self._workflow_id, run_id=self._run_id + ) + try: + status = (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + # The run's History is gone; nothing more can be promoted. + return True + raise + if status is None or status == WorkflowExecutionStatus.RUNNING: + return False + # The streams are keyed by the chain, so a run that continued as new + # is not the end unless the handle was pinned to it. + return not ( + self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW + ) - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - tail = await self._client.topic(self._require_topic(topic), type=bytes).tail() + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest committed record on ``topic``, for following from now.""" + _require_topic(topic) + backend = self._streams._require_backend() + chain = await _chain(self._client, self._workflow_id) + try: + tail = await backend.output_tail( + chain.stream_key(topic, direction=StreamDirection.OUTPUT) + ) + except TransportStreamError as error: + raise _storage_error(error, "the store's tail could not be read") from error if tail.is_beginning: return BEGINNING - return Cursor(tail.offset.token) - - @staticmethod - def _require_topic(topic: str | None) -> str: - if topic is None: - raise ValueError( - "this provider stores each topic separately, so an outside " - "reader has to name one" - ) - return topic + assert tail.offset is not None + return mint_cursor(_PROVIDER, tail.offset.token) - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> RedisProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return RedisProducer( + self._streams, self._client, self._workflow_id, topic, producer_id, attempt + ) -class _RedisProvider: - name = "redis" +class RedisStreams(ProviderPlugin): + """The client-side provider over Redis streams. - def __init__(self) -> None: - self._backend: Any = None - self._owned_client: Any = None - self._url = "" - self._key_prefix = "" - - def configure(self, **options: Any) -> None: - backend = options.pop("backend", None) - url = options.pop("url", None) - key_prefix = options.pop("key_prefix", None) - if options: - raise TypeError( - "the redis provider takes backend, url and key_prefix, got " - f"{sorted(options)}" - ) + Construct one, pass it to the worker as a plugin and open handles from + it anywhere else. The Redis client is opened on first use, so it belongs + to the loop that uses it, and released by :meth:`close`; a ``backend`` + the caller hands in stays the caller's to close. + """ + + def __init__( + self, + *, + url: str = "redis://127.0.0.1:6379", + key_prefix: str = "temporal-streams", + idle_timeout: timedelta = timedelta(seconds=1), + backend: Any | None = None, + poll_interval: timedelta = timedelta(milliseconds=500), + ) -> None: + """Create the provider. + + Args: + url: The Redis to connect to when no ``backend`` is given. + key_prefix: Prepended to every key, so one Redis serves several + deployments. + idle_timeout: How long a workflow reader with nothing to read + holds its Workflow Task open before the worker parks it. + backend: A transport backend the caller constructed and owns. + poll_interval: How long an outside reader that is caught up waits + for a record before asking whether the workflow closed. + """ + self._url = url + self._key_prefix = key_prefix + self._idle_timeout = idle_timeout self._backend = backend - self._url = ( - url - or os.environ.get("TEMPORAL_TEST_REDIS_URL") - or os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6379") - ) - self._key_prefix = key_prefix or os.environ.get( - "AI198_REDIS_PREFIX", "ai198-contract" - ) + self._owned_client: Any = None + self._poll = poll_interval def _require_backend(self) -> Any: if self._backend is None: @@ -318,7 +616,7 @@ def _require_backend(self) -> Any: # A dead peer would otherwise hold a blocking read open forever. # Several block periods, so a healthy socket that is merely idle - # inside one XREAD window is never abandoned. + # inside one read window is never abandoned. self._owned_client = redis.asyncio.from_url( self._url, decode_responses=False, @@ -329,116 +627,31 @@ def _require_backend(self) -> Any: ) return self._backend - async def close(self) -> None: - """Release the Redis connections this provider opened. + def configure_worker(self, config: WorkerConfig) -> WorkerConfig: + """Set this provider and its transport backend on the worker.""" + config = super().configure_worker(config) + config["external_stream_backend"] = self._require_backend() + return config - A backend the caller handed in stays the caller's to close. - """ + def configure_replayer(self, config: ReplayerConfig) -> ReplayerConfig: + """Set this provider and its transport backend on the replayer.""" + config = super().configure_replayer(config) + config["external_stream_backend"] = self._require_backend() + return config + + def workflow_provider(self) -> _RedisWorkflowProvider: + """The workflow half, over the transport's subscriptions and staged output.""" + return _RedisWorkflowProvider(self._idle_timeout) + + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> RedisStreamHandle: + """A handle on ``workflow_id``'s topics; it follows the chain by construction.""" + return RedisStreamHandle(self, client, workflow_id, run_id) + + async def close(self) -> None: + """Release the Redis connections this provider opened.""" client, self._owned_client = self._owned_client, None if client is not None: self._backend = None await client.aclose() - - def worker_options(self) -> dict[str, Any]: - return {"external_stream_backend": self._require_backend()} - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # The provider resolves the name under this run's chain key, so a start - # position is only meaningful to a reader that already has one, and this - # provider's first subscription always starts at the beginning of the - # stream it minted. - if after.token: - raise ValueError( - "the client-side provider starts a new subscription at the " - "beginning of the stream it owns; resuming elsewhere is not " - "supported yet" - ) - options = external_stream - if idle_timeout is not None: - options = options.with_options(idle_timeout=idle_timeout) - return _ExternalReadSource(options.topic(stream, type=bytes).subscribe()) - - def open_write(self, topic: str) -> WriteSink: - return _ExternalWriteSink(external_output_stream.topic(topic, type=bytes)) - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> RedisProducer: - """Open a producer on ``workflow_id``'s account. - - ``stream`` names an inbound stream; with none, ``topic`` names a topic - on the workflow's output stream, appended directly rather than through - the workflow's staged commit. An inbound record carries no topic: the - stream's name is its whole address. - """ - # The attempt is part of it. Deduplication answers "is this the - # same append again", and a second attempt writing different words - # at the same sequence is not: this provider rejects that outright. - # Folding the attempt in keeps a retried append idempotent without - # letting a new generation be refused as a conflicting duplicate. - session_id = f"{producer_id}#{attempt}" - chain = await _chain_key(client, workflow_id) - if stream: - session: Any = await ExternalStreamProducer.connect( - backend=self._require_backend(), - workflow=chain, - client=client, - session_id=session_id, - ) - else: - session = await ExternalOutputStreamProducer.connect( - backend=self._require_backend(), - workflow=chain, - client=client, - session_id=session_id, - ) - return RedisProducer( - session.topic(stream or topic, type=bytes), - client.data_converter.payload_converter, - topic, - producer_id, - attempt, - client, - workflow_id, - ) - - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> RedisConsumer: - """Open a reader for what ``workflow_id`` publishes. - - An empty ``stream`` reads what the workflow wrote through - :func:`temporalio.streams.writer`. This provider keeps inbound and - outbound records in separate stores, so naming an inbound stream is - not supported from here yet. - """ - if stream: - raise ValueError( - "this provider separates inbound and outbound storage, so an " - "outside reader cannot follow an inbound stream yet" - ) - return RedisConsumer( - await ExternalOutputStreamClient.connect( - backend=self._require_backend(), - workflow=await _chain_key(client, workflow_id), - client=client, - ), - client.data_converter.payload_converter, - workflow_id, - ) - - -_provider.register("redis", _RedisProvider) diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py new file mode 100644 index 000000000..994ef5309 --- /dev/null +++ b/tests/streams/test_redis_provider.py @@ -0,0 +1,45 @@ +"""What the Redis provider decides without a store: cursors and the sync publish.""" + +from __future__ import annotations + +import asyncio + +import pytest + +from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError +from temporalio.streams.providers.redis import _drive, _outside_position + + +def test_outside_cursors_name_output_positions(): + assert _outside_position(BEGINNING) is None + position = _outside_position(Cursor("redis:1700000000000-3")) + assert position is not None and position.token == "1700000000000-3" + # A workflow-side cursor names the input log, which outside code cannot + # read from, and a token another provider minted is refused the same way. + with pytest.raises(StreamCursorError): + _outside_position(Cursor("redis:in:1700000000000-3")) + with pytest.raises(StreamCursorError): + _outside_position(Cursor("memory:3")) + with pytest.raises(StreamCursorError): + _outside_position(Cursor("redis:not-an-id")) + + +def test_a_publish_that_completes_at_once_is_driven_to_the_end(): + done = [] + + async def publish() -> None: + done.append(True) + + _drive(publish()) + assert done == [True] + + +def test_a_publish_that_would_wait_fails_loudly(): + async def publish() -> None: + await asyncio.get_running_loop().create_future() + + async def run() -> None: + with pytest.raises(StreamError, match="batch is full"): + _drive(publish()) + + asyncio.run(run()) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 63fbe5796..b3c4e3ee3 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -2,26 +2,35 @@ The conformance suite covers the outside surface when ``STREAMS_LIVE=redis``. This module runs the interface loop inside a workflow over the staged commit, -then queries a completed run, which replays it. Both need a dev server -(``TEMPORAL_ADDRESS``) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or -``AI198_REDIS_URL``). The worker keeps a warm cache because the provider holds -the task open between records. +lets a read end with the workflow, shares a topic between an outside producer +and the workflow, and queries a completed run, which replays it. All need a +dev server (``TEMPORAL_ADDRESS``) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or +``AI198_REDIS_URL``). The worker keeps a warm cache because the transport +holds the task open between records. """ from __future__ import annotations +import asyncio import os import uuid from collections.abc import AsyncIterator +from typing import Any import pytest -from temporalio import streams, workflow +from temporalio import workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.redis import RedisStreams from temporalio.worker import Worker from tests.streams.test_streams_conformance import take -from tests.streams.test_streams_workflow import DECISIONS, INPUTS, ContractLoop +from tests.streams.test_streams_workflow import ( + DECISIONS, + INPUTS, + ContractLoop, + OneLine, +) pytestmark = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "redis", @@ -29,41 +38,50 @@ ) +def redis_url() -> str: + return os.environ.get("TEMPORAL_TEST_REDIS_URL") or os.environ.get( + "AI198_REDIS_URL", "redis://127.0.0.1:6379" + ) + + @pytest.fixture -async def live_client() -> AsyncIterator[Client]: +async def provider() -> AsyncIterator[RedisStreams]: # A prefix per case, because the store keeps what earlier cases wrote. - streams.configure(provider="redis", key_prefix=f"streams-redis-{uuid.uuid4().hex}") + streams = RedisStreams( + url=redis_url(), key_prefix=f"streams-redis-{uuid.uuid4().hex}" + ) try: - yield await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) + yield streams finally: await streams.close() -async def test_interface_loop_over_redis(live_client: Client): +@pytest.fixture +async def live_client(client: Client) -> Client: + # The test environment's own server, unless TEMPORAL_ADDRESS names another. + address = os.environ.get("TEMPORAL_ADDRESS") + return await Client.connect(address) if address else client + + +async def test_interface_loop_over_redis(live_client: Client, provider: RedisStreams): workflow_id = f"streams-redis-live-{uuid.uuid4().hex}" async with Worker( live_client, task_queue=f"tq-{workflow_id}", workflows=[ContractLoop], + plugins=[provider], max_cached_workflows=100, - **streams.worker_options(), ): handle = await live_client.start_workflow( ContractLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" ) - producer = await streams.producer( - live_client, - workflow_id=workflow_id, - stream=INPUTS, - producer_id="model", - attempt=1, - ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() - consumer = await streams.consumer(live_client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict, topic=DECISIONS), 4, timeout=60) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4, 60) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -71,6 +89,7 @@ async def test_interface_loop_over_redis(live_client: Client): RecordKind.FINISH, ] assert [r.value["decided"] for r in records[:3]] == [1, 2, 3] + assert all(r.producer_id == "" and r.topic == DECISIONS for r in records) assert await handle.result() == [ {"kind": "decision", "n": 1, "attempt": 1}, {"kind": "decision", "n": 2, "attempt": 1}, @@ -78,6 +97,63 @@ async def test_interface_loop_over_redis(live_client: Client): {"kind": "finish", "producer": "model"}, ] + # The read ends by itself once the workflow is closed and every + # promoted record has been handed over. + async def read_everything() -> list[Any]: + return [ + r.value async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + assert await asyncio.wait_for(read_everything(), 60) == [ + {"decided": 1}, + {"decided": 2}, + {"decided": 3}, + None, + ] + # The producer's own records are readable from outside as well, on + # the topic it wrote. + inputs = await take(stream.read(topic=INPUTS, result_type=dict), 4, 60) + assert [r.value for r in inputs[:3]] == [{"n": 1}, {"n": 2}, {"n": 3}] + assert inputs[3].kind is RecordKind.FINISH + assert all(r.producer_id == "model" and r.attempt == 1 for r in inputs) + + +async def test_an_outside_producer_and_the_workflow_share_a_topic( + live_client: Client, provider: RedisStreams +): + workflow_id = f"streams-redis-shared-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[OneLine], + plugins=[provider], + ): + handle = await live_client.start_workflow( + OneLine.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + await stream.producer(topic=DECISIONS, producer_id="tool", attempt=1).append( + {"from": "producer"} + ) + await handle.result() + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + + records = await asyncio.wait_for(read_everything(), 60) + # Both writers land on one topic, each under its own identity. The order + # between them is whatever the store took first. + assert sorted( + ((r.producer_id, r.kind, r.value) for r in records), key=str + ) == sorted( + [ + ("tool", RecordKind.DATA, {"from": "producer"}), + ("", RecordKind.DATA, {"from": "workflow"}), + ("", RecordKind.FINISH, None), + ], + key=str, + ) + @workflow.defn class SignalWokenPublish: @@ -92,11 +168,11 @@ def close(self) -> None: @workflow.run async def run(self) -> int: - out = streams.writer("out") - await out.publish({"n": 0}) + out = workflow.stream_writer("out") + out.publish({"n": 0}) await workflow.wait_condition(lambda: self._closed) for n in range(1, 4): - await out.publish({"n": n}) + out.publish({"n": n}) return 4 @workflow.query @@ -104,7 +180,9 @@ def probe(self) -> int: return 1 -async def test_query_after_completion_replays_the_final_task(live_client: Client): +async def test_query_after_completion_replays_the_final_task( + live_client: Client, provider: RedisStreams +): # A query against a completed run replays it. The final task's publishes # were woken by a signal, which the activation applies before the replay # marker, so the marker's expectations have to be installed before that @@ -115,13 +193,15 @@ async def test_query_after_completion_replays_the_final_task(live_client: Client live_client, task_queue=f"tq-{workflow_id}", workflows=[SignalWokenPublish], - **streams.worker_options(), + plugins=[provider], ): handle = await live_client.start_workflow( SignalWokenPublish.run, id=workflow_id, task_queue=f"tq-{workflow_id}" ) - consumer = await streams.consumer(live_client, workflow_id=workflow_id) - await take(consumer.read(type=dict, topic="out"), 1, timeout=60) + stream = provider.get_stream_handle(live_client, workflow_id) + await take(stream.read(topic="out", result_type=dict), 1, timeout=60) await handle.signal(SignalWokenPublish.close) assert await handle.result() == 4 assert await handle.query(SignalWokenPublish.probe) == 1 + values = [r.value async for r in stream.read(topic="out", result_type=dict)] + assert values == [{"n": 0}, {"n": 1}, {"n": 2}, {"n": 3}] diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 451fe4391..addfe5689 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,6 +21,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass @@ -28,8 +29,9 @@ import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -45,6 +47,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.redis import RedisStreams +from tests.helpers import new_worker @dataclass @@ -78,9 +82,56 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _redis_case(client: Client) -> AsyncIterator[ProviderCase]: + # The store is a Redis the test environment does not start; the server + # is the environment's own unless TEMPORAL_ADDRESS names another. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = RedisStreams( + url=os.environ.get("TEMPORAL_TEST_REDIS_URL") + or os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6379"), + # A prefix per setup, because the store keeps what earlier runs wrote. + key_prefix=f"streams-conformance-{uuid.uuid4().hex}", + ) + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase("redis", provider, client, host=host) + for handle in hosts.values(): + await handle.terminate() + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { "memory": _memory_case } +if os.environ.get("STREAMS_LIVE") == "redis": + SETUPS["redis"] = _redis_case _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, From 41bb1e0a4c75f70b853c04fcc8d73cb948c2c73e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:06:58 -0700 Subject: [PATCH 299/831] Corrected the workflow service stub the merge had duplicated a field in. --- .../workflowservice/v1/request_response_pb2.pyi | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index 6c0223ce7..e66c90384 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -1277,7 +1277,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): MESSAGES_FIELD_NUMBER: builtins.int POLLER_SCALING_DECISION_FIELD_NUMBER: builtins.int POLLER_GROUP_ID_FIELD_NUMBER: builtins.int - STREAM_SLICES_FIELD_NUMBER: builtins.int POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int STREAM_SLICES_FIELD_NUMBER: builtins.int @@ -1369,17 +1368,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): Corresponding RespondQueryTaskCompleted should pass this value for proper routing. """ @property - def stream_slices( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamSlice - ]: - """Slices of the streams this Workflow consumes. A slice with no - workflow_task_completed_event_id is for the task about to run; one with - it set is re-supplying a range an earlier task consumed, so a worker - replaying from History gets the same bytes that task was given. - """ - @property def poller_group_infos( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ @@ -1444,10 +1432,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): poller_scaling_decision: temporalio.api.taskqueue.v1.message_pb2.PollerScalingDecision | None = ..., poller_group_id: builtins.str = ..., - stream_slices: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamSlice - ] - | None = ..., poller_group_infos: collections.abc.Iterable[ temporalio.api.taskqueue.v1.message_pb2.PollerGroupInfo ] From 7662cb42b9e14bf72bb492099e8ac53bae4b9f61 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:06:58 -0700 Subject: [PATCH 300/831] Regenerated the bridge protos from the repinned Core. The combined Core carries the external stream jobs and commands next to the native ones, with the native job and commands at the record names. --- .../proto/workflow_activation/__init__.py | 8 + .../workflow_activation_pb2.py | 176 +++++--- .../workflow_activation_pb2.pyi | 264 +++++++++++- .../proto/workflow_commands/__init__.py | 18 + .../workflow_commands_pb2.py | 275 +++++++++---- .../workflow_commands_pb2.pyi | 376 +++++++++++++++++- 6 files changed, 983 insertions(+), 134 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index f17880890..0247d8dfc 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -2,17 +2,21 @@ CancelWorkflow, DeliverStreamRecords, DoUpdate, + FinalizeExternalStreams, FireTimer, InitializeWorkflow, NotifyHasPatch, + PrepareExternalStreamPark, QueryWorkflow, RemoveFromCache, + ReplayExternalStreams, ResolveActivity, ResolveChildWorkflowExecution, ResolveChildWorkflowExecutionStart, ResolveChildWorkflowExecutionStartCancelled, ResolveChildWorkflowExecutionStartFailure, ResolveChildWorkflowExecutionStartSuccess, + ResolveExternalStreamWaits, ResolveNexusOperation, ResolveNexusOperationStart, ResolveRequestCancelExternalWorkflow, @@ -27,17 +31,21 @@ "CancelWorkflow", "DeliverStreamRecords", "DoUpdate", + "FinalizeExternalStreams", "FireTimer", "InitializeWorkflow", "NotifyHasPatch", + "PrepareExternalStreamPark", "QueryWorkflow", "RemoveFromCache", + "ReplayExternalStreams", "ResolveActivity", "ResolveChildWorkflowExecution", "ResolveChildWorkflowExecutionStart", "ResolveChildWorkflowExecutionStartCancelled", "ResolveChildWorkflowExecutionStartFailure", "ResolveChildWorkflowExecutionStartSuccess", + "ResolveExternalStreamWaits", "ResolveNexusOperation", "ResolveNexusOperationStart", "ResolveRequestCancelExternalWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 7f6d3e782..f0a8a0ac8 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -42,17 +42,31 @@ from temporalio.bridge.proto.common import ( common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, ) +from temporalio.bridge.proto.external_data import ( + external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2, +) from temporalio.bridge.proto.nexus import ( nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, ) +from temporalio.bridge.proto.workflow_commands import ( + workflow_commands_pb2 as temporal_dot_sdk_dot_core_dot_workflow__commands_dot_workflow__commands__pb2, +) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto\x1a;temporal/sdk/core/workflow_commands/workflow_commands.proto"\xc2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\x12\x1e\n\x16history_floor_event_id\x18\r \x01(\x03"\xa9\x0e\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12`\n\x1dresolve_external_stream_waits\x18\x11 \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveExternalStreamWaitsH\x00\x12^\n\x1cprepare_external_stream_park\x18\x12 \x01(\x0b\x32\x36.coresdk.workflow_activation.PrepareExternalStreamParkH\x00\x12U\n\x17replay_external_streams\x18\x13 \x01(\x0b\x32\x32.coresdk.workflow_activation.ReplayExternalStreamsH\x00\x12Y\n\x19\x66inalize_external_streams\x18\x14 \x01(\x0b\x32\x34.coresdk.workflow_activation.FinalizeExternalStreamsH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x7f\n\x1aResolveExternalStreamWaits\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x42\n\x0bready_hints\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait"\xab\x01\n\x19PrepareExternalStreamPark\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x92\x02\n\x15ReplayExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x19\n\x11replay_annotation\x18\x03 \x01(\x0c\x12<\n\x11terminal_boundary\x18\x04 \x01(\x0e\x32!.coresdk.external_data.ParkReason\x12\x43\n\x06output\x18\x05 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest"\xa9\x01\n\x17\x46inalizeExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_RESOLVEEXTERNALSTREAMWAITS = DESCRIPTOR.message_types_by_name[ + "ResolveExternalStreamWaits" +] +_PREPAREEXTERNALSTREAMPARK = DESCRIPTOR.message_types_by_name[ + "PrepareExternalStreamPark" +] +_REPLAYEXTERNALSTREAMS = DESCRIPTOR.message_types_by_name["ReplayExternalStreams"] +_FINALIZEEXTERNALSTREAMS = DESCRIPTOR.message_types_by_name["FinalizeExternalStreams"] _DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ @@ -118,6 +132,50 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) +ResolveExternalStreamWaits = _reflection.GeneratedProtocolMessageType( + "ResolveExternalStreamWaits", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEEXTERNALSTREAMWAITS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveExternalStreamWaits) + }, +) +_sym_db.RegisterMessage(ResolveExternalStreamWaits) + +PrepareExternalStreamPark = _reflection.GeneratedProtocolMessageType( + "PrepareExternalStreamPark", + (_message.Message,), + { + "DESCRIPTOR": _PREPAREEXTERNALSTREAMPARK, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.PrepareExternalStreamPark) + }, +) +_sym_db.RegisterMessage(PrepareExternalStreamPark) + +ReplayExternalStreams = _reflection.GeneratedProtocolMessageType( + "ReplayExternalStreams", + (_message.Message,), + { + "DESCRIPTOR": _REPLAYEXTERNALSTREAMS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ReplayExternalStreams) + }, +) +_sym_db.RegisterMessage(ReplayExternalStreams) + +FinalizeExternalStreams = _reflection.GeneratedProtocolMessageType( + "FinalizeExternalStreams", + (_message.Message,), + { + "DESCRIPTOR": _FINALIZEEXTERNALSTREAMS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FinalizeExternalStreams) + }, +) +_sym_db.RegisterMessage(FinalizeExternalStreams) + DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( "DeliverStreamRecords", (_message.Message,), @@ -391,58 +449,66 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 570 - _WORKFLOWACTIVATION._serialized_end = 1116 - _WORKFLOWACTIVATIONJOB._serialized_start = 1119 - _WORKFLOWACTIVATIONJOB._serialized_end = 2580 - _DELIVERSTREAMRECORDS._serialized_start = 2583 - _DELIVERSTREAMRECORDS._serialized_end = 2719 - _INITIALIZEWORKFLOW._serialized_start = 2722 - _INITIALIZEWORKFLOW._serialized_end = 4126 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _FIRETIMER._serialized_start = 4128 - _FIRETIMER._serialized_end = 4152 - _RESOLVEACTIVITY._serialized_start = 4154 - _RESOLVEACTIVITY._serialized_end = 4263 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4266 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4603 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4605 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4664 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4667 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4833 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4835 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4931 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4933 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5038 - _UPDATERANDOMSEED._serialized_start = 5040 - _UPDATERANDOMSEED._serialized_end = 5083 - _QUERYWORKFLOW._serialized_start = 5086 - _QUERYWORKFLOW._serialized_end = 5346 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _CANCELWORKFLOW._serialized_start = 5348 - _CANCELWORKFLOW._serialized_end = 5380 - _SIGNALWORKFLOW._serialized_start = 5383 - _SIGNALWORKFLOW._serialized_end = 5672 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _NOTIFYHASPATCH._serialized_start = 5674 - _NOTIFYHASPATCH._serialized_end = 5708 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5710 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5805 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5807 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5909 - _DOUPDATE._serialized_start = 5912 - _DOUPDATE._serialized_end = 6243 - _DOUPDATE_HEADERSENTRY._serialized_start = 4047 - _DOUPDATE_HEADERSENTRY._serialized_end = 4126 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6246 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6400 - _RESOLVENEXUSOPERATION._serialized_start = 6402 - _RESOLVENEXUSOPERATION._serialized_end = 6491 - _REMOVEFROMCACHE._serialized_start = 6494 - _REMOVEFROMCACHE._serialized_end = 6846 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6608 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6846 + _WORKFLOWACTIVATION._serialized_start = 684 + _WORKFLOWACTIVATION._serialized_end = 1262 + _WORKFLOWACTIVATIONJOB._serialized_start = 1265 + _WORKFLOWACTIVATIONJOB._serialized_end = 3098 + _RESOLVEEXTERNALSTREAMWAITS._serialized_start = 3100 + _RESOLVEEXTERNALSTREAMWAITS._serialized_end = 3227 + _PREPAREEXTERNALSTREAMPARK._serialized_start = 3230 + _PREPAREEXTERNALSTREAMPARK._serialized_end = 3401 + _REPLAYEXTERNALSTREAMS._serialized_start = 3404 + _REPLAYEXTERNALSTREAMS._serialized_end = 3678 + _FINALIZEEXTERNALSTREAMS._serialized_start = 3681 + _FINALIZEEXTERNALSTREAMS._serialized_end = 3850 + _DELIVERSTREAMRECORDS._serialized_start = 3853 + _DELIVERSTREAMRECORDS._serialized_end = 3989 + _INITIALIZEWORKFLOW._serialized_start = 3992 + _INITIALIZEWORKFLOW._serialized_end = 5396 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 5317 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 5396 + _FIRETIMER._serialized_start = 5398 + _FIRETIMER._serialized_end = 5422 + _RESOLVEACTIVITY._serialized_start = 5424 + _RESOLVEACTIVITY._serialized_end = 5533 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 5536 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 5873 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 5875 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 5934 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 5937 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 6103 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 6105 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 6201 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 6203 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 6308 + _UPDATERANDOMSEED._serialized_start = 6310 + _UPDATERANDOMSEED._serialized_end = 6353 + _QUERYWORKFLOW._serialized_start = 6356 + _QUERYWORKFLOW._serialized_end = 6616 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 5317 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 5396 + _CANCELWORKFLOW._serialized_start = 6618 + _CANCELWORKFLOW._serialized_end = 6650 + _SIGNALWORKFLOW._serialized_start = 6653 + _SIGNALWORKFLOW._serialized_end = 6942 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 5317 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 5396 + _NOTIFYHASPATCH._serialized_start = 6944 + _NOTIFYHASPATCH._serialized_end = 6978 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 6980 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 7075 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 7077 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 7179 + _DOUPDATE._serialized_start = 7182 + _DOUPDATE._serialized_end = 7513 + _DOUPDATE_HEADERSENTRY._serialized_start = 5317 + _DOUPDATE_HEADERSENTRY._serialized_end = 5396 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 7516 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 7670 + _RESOLVENEXUSOPERATION._serialized_start = 7672 + _RESOLVENEXUSOPERATION._serialized_end = 7761 + _REMOVEFROMCACHE._serialized_start = 7764 + _REMOVEFROMCACHE._serialized_end = 8116 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 7878 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 8116 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index ac9ac13f7..225f1ea9d 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -26,7 +26,9 @@ import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 +import temporalio.bridge.proto.external_data.external_data_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 +import temporalio.bridge.proto.workflow_commands.workflow_commands_pb2 if sys.version_info >= (3, 10): import typing as typing_extensions @@ -96,6 +98,7 @@ class WorkflowActivation(google.protobuf.message.Message): LAST_SDK_VERSION_FIELD_NUMBER: builtins.int SUGGEST_CONTINUE_AS_NEW_REASONS_FIELD_NUMBER: builtins.int TARGET_WORKER_DEPLOYMENT_VERSION_CHANGED_FIELD_NUMBER: builtins.int + HISTORY_FLOOR_EVENT_ID_FIELD_NUMBER: builtins.int run_id: builtins.str """The id of the currently active run of the workflow. Also used as a cache key. There may only ever be one active workflow task (and hence activation) of a run at one time. @@ -157,6 +160,11 @@ class WorkflowActivation(google.protobuf.message.Message): the workflow is Pinned. Experimental. """ + history_floor_event_id: builtins.int + """The event immediately preceding this Workflow Task's WorkflowTaskScheduled event in the + ordered History view Core used to build the activation. Zero means Core could not identify + that exact predecessor, in which case output must not be staged for this task. + """ def __init__( self, *, @@ -176,6 +184,7 @@ class WorkflowActivation(google.protobuf.message.Message): ] | None = ..., target_worker_deployment_version_changed: builtins.bool = ..., + history_floor_event_id: builtins.int = ..., ) -> None: ... def HasField( self, @@ -195,6 +204,8 @@ class WorkflowActivation(google.protobuf.message.Message): b"continue_as_new_suggested", "deployment_version_for_current_task", b"deployment_version_for_current_task", + "history_floor_event_id", + b"history_floor_event_id", "history_length", b"history_length", "history_size_bytes", @@ -236,6 +247,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + RESOLVE_EXTERNAL_STREAM_WAITS_FIELD_NUMBER: builtins.int + PREPARE_EXTERNAL_STREAM_PARK_FIELD_NUMBER: builtins.int + REPLAY_EXTERNAL_STREAMS_FIELD_NUMBER: builtins.int + FINALIZE_EXTERNAL_STREAMS_FIELD_NUMBER: builtins.int DELIVER_STREAM_RECORDS_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property @@ -297,10 +312,23 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def resolve_external_stream_waits(self) -> global___ResolveExternalStreamWaits: + """One or more external stream waits may have data buffered. Runs user workflow code.""" + @property + def prepare_external_stream_park(self) -> global___PrepareExternalStreamPark: + """Runtime-internal: install park intents and recheck every stream. Runs no user code.""" + @property + def replay_external_streams(self) -> global___ReplayExternalStreams: + """Replay: deliver the recorded external stream observations from a marker.""" + @property + def finalize_external_streams(self) -> global___FinalizeExternalStreams: + """Runtime-internal: encode the terminal boundary for a marker Core is about to write. + Runs no user code. + """ + @property def deliver_stream_records(self) -> global___DeliverStreamRecords: - """17 to 20 are taken by the external stream jobs, which are developed - alongside this one and share this message. The number below is fixed - with that family and must not be reused. + """The number below is shared with the native stream tree, which leaves 17 + to 20 to the jobs above, and must not be reused. A range of a stream the workflow subscribed to. """ @@ -332,6 +360,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + resolve_external_stream_waits: global___ResolveExternalStreamWaits | None = ..., + prepare_external_stream_park: global___PrepareExternalStreamPark | None = ..., + replay_external_streams: global___ReplayExternalStreams | None = ..., + finalize_external_streams: global___FinalizeExternalStreams | None = ..., deliver_stream_records: global___DeliverStreamRecords | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... @@ -344,22 +376,30 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"deliver_stream_records", "do_update", b"do_update", + "finalize_external_streams", + b"finalize_external_streams", "fire_timer", b"fire_timer", "initialize_workflow", b"initialize_workflow", "notify_has_patch", b"notify_has_patch", + "prepare_external_stream_park", + b"prepare_external_stream_park", "query_workflow", b"query_workflow", "remove_from_cache", b"remove_from_cache", + "replay_external_streams", + b"replay_external_streams", "resolve_activity", b"resolve_activity", "resolve_child_workflow_execution", b"resolve_child_workflow_execution", "resolve_child_workflow_execution_start", b"resolve_child_workflow_execution_start", + "resolve_external_stream_waits", + b"resolve_external_stream_waits", "resolve_nexus_operation", b"resolve_nexus_operation", "resolve_nexus_operation_start", @@ -385,22 +425,30 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"deliver_stream_records", "do_update", b"do_update", + "finalize_external_streams", + b"finalize_external_streams", "fire_timer", b"fire_timer", "initialize_workflow", b"initialize_workflow", "notify_has_patch", b"notify_has_patch", + "prepare_external_stream_park", + b"prepare_external_stream_park", "query_workflow", b"query_workflow", "remove_from_cache", b"remove_from_cache", + "replay_external_streams", + b"replay_external_streams", "resolve_activity", b"resolve_activity", "resolve_child_workflow_execution", b"resolve_child_workflow_execution", "resolve_child_workflow_execution_start", b"resolve_child_workflow_execution_start", + "resolve_external_stream_waits", + b"resolve_external_stream_waits", "resolve_nexus_operation", b"resolve_nexus_operation", "resolve_nexus_operation_start", @@ -436,6 +484,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "resolve_external_stream_waits", + "prepare_external_stream_park", + "replay_external_streams", + "finalize_external_streams", "deliver_stream_records", "remove_from_cache", ] @@ -444,6 +496,212 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class ResolveExternalStreamWaits(google.protobuf.message.Message): + """Tells lang that one or more external stream waits may now have data. + + This job contains no records. The listed waits are readiness *hints*, not an exhaustive + availability claim: on receipt lang probes every active wait, drains all currently available + inputs, and only then resumes Workflow futures. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + READY_HINTS_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def ready_hints( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + ready_hints: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "ready_hints", + b"ready_hints", + ], + ) -> None: ... + +global___ResolveExternalStreamWaits = ResolveExternalStreamWaits + +class PrepareExternalStreamPark(google.protobuf.message.Message): + """Asks lang to park the complete active wait set through the backend handshake. + + Runtime-internal: no user Workflow code runs. Lang installs a park intent per subscription, + rechecks every stream, and answers with ExternalStreamParkResult. A recheck that finds records + answers `became_ready` instead, and Core issues a normal resolve activation next. + + Requires backend I/O, so lang must not handle this on the synchronous Workflow thread. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: + """Always the complete active wait set.""" + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + """One of PARK_REASON_IDLE, PARK_REASON_ALL_WRITE_FENCED, or PARK_REASON_SHUTDOWN.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "reason", + b"reason", + "waits", + b"waits", + ], + ) -> None: ... + +global___PrepareExternalStreamPark = PrepareExternalStreamPark + +class ReplayExternalStreams(google.protobuf.message.Message): + """Carries a recorded marker's annotation back to lang during replay. + + Core issues exactly one of these per marker. Lang's replay driver walks the annotation's + segments in order, performing one event-loop drain per segment, so the live run's k + activations become k drains inside this one activation and condition evaluation matches. + + Requires backend I/O (the recorded range reads and their integrity validation), so lang must + prepare it off the Workflow thread and deliver from memory once it is on it. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REPLAY_ANNOTATION_FIELD_NUMBER: builtins.int + TERMINAL_BOUNDARY_FIELD_NUMBER: builtins.int + OUTPUT_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + replay_annotation: builtins.bytes + """Opaque to Core.""" + terminal_boundary: ( + temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + ) + @property + def output( + self, + ) -> temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest: + """The output manifest recorded in the same marker, if this Workflow Task published output.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + replay_annotation: builtins.bytes = ..., + terminal_boundary: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + output: temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["output", b"output"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "output", + b"output", + "quiescence_generation", + b"quiescence_generation", + "replay_annotation", + b"replay_annotation", + "terminal_boundary", + b"terminal_boundary", + "waits", + b"waits", + ], + ) -> None: ... + +global___ReplayExternalStreams = ReplayExternalStreams + +class FinalizeExternalStreams(google.protobuf.message.Message): + """Issued before Core writes a marker for a boundary Core itself decided and no park handshake + will run: rollover-deadline expiry, and shutdown or eviction with a Workflow Task open. + + Runs no user Workflow code, cannot resolve futures, and its only legal responses are + ExternalStreamFinalized or an activation failure. It requires *no* backend I/O: lang reads the + blocked cursor snapshot from its own in-memory manager state. If lang cannot answer, Core + writes no marker and the Workflow Task fails for retry -- there is no best-effort path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + """One of PARK_REASON_ROLLOVER or PARK_REASON_SHUTDOWN.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "reason", + b"reason", + "waits", + b"waits", + ], + ) -> None: ... + +global___FinalizeExternalStreams = FinalizeExternalStreams + class DeliverStreamRecords(google.protobuf.message.Message): """Hand a workflow the next range of a stream it subscribed to. diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 9fb1c8f08..5f187d310 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -7,8 +7,12 @@ CancelWorkflowExecution, CompleteWorkflowExecution, ContinueAsNewWorkflowExecution, + ExternalStreamFinalized, + ExternalStreamParkResult, + ExternalStreamWait, FailWorkflowExecution, ModifyWorkflowProperties, + ParkSetConfirmed, QueryResult, QuerySuccess, RequestCancelActivity, @@ -22,10 +26,15 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + StreamSetBecameReady, SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, + WorkflowOutputStreamBuffered, + WorkflowOutputStreamCommit, + WorkflowStreamProgress, + WorkflowStreamQuiescent, ) __all__ = [ @@ -37,8 +46,12 @@ "CancelWorkflowExecution", "CompleteWorkflowExecution", "ContinueAsNewWorkflowExecution", + "ExternalStreamFinalized", + "ExternalStreamParkResult", + "ExternalStreamWait", "FailWorkflowExecution", "ModifyWorkflowProperties", + "ParkSetConfirmed", "QueryResult", "QuerySuccess", "RequestCancelActivity", @@ -52,8 +65,13 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "StreamSetBecameReady", "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", + "WorkflowOutputStreamBuffered", + "WorkflowOutputStreamCommit", + "WorkflowStreamProgress", + "WorkflowStreamQuiescent", ] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 5af8f0744..e03636d49 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -43,12 +43,15 @@ from temporalio.bridge.proto.common import ( common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, ) +from temporalio.bridge.proto.external_data import ( + external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2, +) from temporalio.bridge.proto.nexus import ( nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xeb\x15\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,6 +62,19 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_WORKFLOWSTREAMPROGRESS = DESCRIPTOR.message_types_by_name["WorkflowStreamProgress"] +_WORKFLOWSTREAMQUIESCENT = DESCRIPTOR.message_types_by_name["WorkflowStreamQuiescent"] +_EXTERNALSTREAMWAIT = DESCRIPTOR.message_types_by_name["ExternalStreamWait"] +_EXTERNALSTREAMPARKRESULT = DESCRIPTOR.message_types_by_name["ExternalStreamParkResult"] +_PARKSETCONFIRMED = DESCRIPTOR.message_types_by_name["ParkSetConfirmed"] +_STREAMSETBECAMEREADY = DESCRIPTOR.message_types_by_name["StreamSetBecameReady"] +_EXTERNALSTREAMFINALIZED = DESCRIPTOR.message_types_by_name["ExternalStreamFinalized"] +_WORKFLOWOUTPUTSTREAMCOMMIT = DESCRIPTOR.message_types_by_name[ + "WorkflowOutputStreamCommit" +] +_WORKFLOWOUTPUTSTREAMBUFFERED = DESCRIPTOR.message_types_by_name[ + "WorkflowOutputStreamBuffered" +] _APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] _SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] @@ -135,6 +151,105 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +WorkflowStreamProgress = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamProgress", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMPROGRESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamProgress) + }, +) +_sym_db.RegisterMessage(WorkflowStreamProgress) + +WorkflowStreamQuiescent = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamQuiescent", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMQUIESCENT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamQuiescent) + }, +) +_sym_db.RegisterMessage(WorkflowStreamQuiescent) + +ExternalStreamWait = _reflection.GeneratedProtocolMessageType( + "ExternalStreamWait", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMWAIT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamWait) + }, +) +_sym_db.RegisterMessage(ExternalStreamWait) + +ExternalStreamParkResult = _reflection.GeneratedProtocolMessageType( + "ExternalStreamParkResult", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMPARKRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamParkResult) + }, +) +_sym_db.RegisterMessage(ExternalStreamParkResult) + +ParkSetConfirmed = _reflection.GeneratedProtocolMessageType( + "ParkSetConfirmed", + (_message.Message,), + { + "DESCRIPTOR": _PARKSETCONFIRMED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ParkSetConfirmed) + }, +) +_sym_db.RegisterMessage(ParkSetConfirmed) + +StreamSetBecameReady = _reflection.GeneratedProtocolMessageType( + "StreamSetBecameReady", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSETBECAMEREADY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StreamSetBecameReady) + }, +) +_sym_db.RegisterMessage(StreamSetBecameReady) + +ExternalStreamFinalized = _reflection.GeneratedProtocolMessageType( + "ExternalStreamFinalized", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMFINALIZED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamFinalized) + }, +) +_sym_db.RegisterMessage(ExternalStreamFinalized) + +WorkflowOutputStreamCommit = _reflection.GeneratedProtocolMessageType( + "WorkflowOutputStreamCommit", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWOUTPUTSTREAMCOMMIT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowOutputStreamCommit) + }, +) +_sym_db.RegisterMessage(WorkflowOutputStreamCommit) + +WorkflowOutputStreamBuffered = _reflection.GeneratedProtocolMessageType( + "WorkflowOutputStreamBuffered", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWOUTPUTSTREAMBUFFERED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowOutputStreamBuffered) + }, +) +_sym_db.RegisterMessage(WorkflowOutputStreamBuffered) + AppendStreamRecords = _reflection.GeneratedProtocolMessageType( "AppendStreamRecords", (_message.Message,), @@ -511,74 +626,92 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9020 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9108 - _WORKFLOWCOMMAND._serialized_start = 556 - _WORKFLOWCOMMAND._serialized_end = 2798 - _APPENDSTREAMRECORDS._serialized_start = 2800 - _APPENDSTREAMRECORDS._serialized_end = 2895 - _SUBSCRIBESTREAM._serialized_start = 2897 - _SUBSCRIBESTREAM._serialized_end = 2955 - _STARTTIMER._serialized_start = 2957 - _STARTTIMER._serialized_end = 3040 - _CANCELTIMER._serialized_start = 3042 - _CANCELTIMER._serialized_end = 3068 - _SCHEDULEACTIVITY._serialized_start = 3071 - _SCHEDULEACTIVITY._serialized_end = 3895 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3816 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3895 - _SCHEDULELOCALACTIVITY._serialized_start = 3898 - _SCHEDULELOCALACTIVITY._serialized_end = 4687 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3816 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3895 - _REQUESTCANCELACTIVITY._serialized_start = 4689 - _REQUESTCANCELACTIVITY._serialized_end = 4725 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4727 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4768 - _QUERYRESULT._serialized_start = 4771 - _QUERYRESULT._serialized_end = 4927 - _QUERYSUCCESS._serialized_start = 4929 - _QUERYSUCCESS._serialized_end = 4994 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4996 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5072 - _FAILWORKFLOWEXECUTION._serialized_start = 5074 - _FAILWORKFLOWEXECUTION._serialized_end = 5148 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5151 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6065 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _CANCELWORKFLOWEXECUTION._serialized_start = 6067 - _CANCELWORKFLOWEXECUTION._serialized_end = 6143 - _SETPATCHMARKER._serialized_start = 6145 - _SETPATCHMARKER._serialized_end = 6199 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6202 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7376 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7378 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7452 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7455 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7597 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7600 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7999 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _CANCELSIGNALWORKFLOW._serialized_start = 8001 - _CANCELSIGNALWORKFLOW._serialized_end = 8036 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8038 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8139 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8141 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8220 - _UPDATERESPONSE._serialized_start = 8223 - _UPDATERESPONSE._serialized_end = 8433 - _SCHEDULENEXUSOPERATION._serialized_start = 8436 - _SCHEDULENEXUSOPERATION._serialized_end = 8974 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8924 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8974 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8976 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9018 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 10557 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 10645 + _WORKFLOWCOMMAND._serialized_start = 609 + _WORKFLOWCOMMAND._serialized_end = 3404 + _WORKFLOWSTREAMPROGRESS._serialized_start = 3406 + _WORKFLOWSTREAMPROGRESS._serialized_end = 3483 + _WORKFLOWSTREAMQUIESCENT._serialized_start = 3486 + _WORKFLOWSTREAMQUIESCENT._serialized_end = 3653 + _EXTERNALSTREAMWAIT._serialized_start = 3655 + _EXTERNALSTREAMWAIT._serialized_end = 3742 + _EXTERNALSTREAMPARKRESULT._serialized_start = 3745 + _EXTERNALSTREAMPARKRESULT._serialized_end = 3985 + _PARKSETCONFIRMED._serialized_start = 3987 + _PARKSETCONFIRMED._serialized_end = 4005 + _STREAMSETBECAMEREADY._serialized_start = 4007 + _STREAMSETBECAMEREADY._serialized_end = 4029 + _EXTERNALSTREAMFINALIZED._serialized_start = 4031 + _EXTERNALSTREAMFINALIZED._serialized_end = 4120 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 4122 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4247 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4249 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4335 + _APPENDSTREAMRECORDS._serialized_start = 4337 + _APPENDSTREAMRECORDS._serialized_end = 4432 + _SUBSCRIBESTREAM._serialized_start = 4434 + _SUBSCRIBESTREAM._serialized_end = 4492 + _STARTTIMER._serialized_start = 4494 + _STARTTIMER._serialized_end = 4577 + _CANCELTIMER._serialized_start = 4579 + _CANCELTIMER._serialized_end = 4605 + _SCHEDULEACTIVITY._serialized_start = 4608 + _SCHEDULEACTIVITY._serialized_end = 5432 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5353 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5432 + _SCHEDULELOCALACTIVITY._serialized_start = 5435 + _SCHEDULELOCALACTIVITY._serialized_end = 6224 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5353 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5432 + _REQUESTCANCELACTIVITY._serialized_start = 6226 + _REQUESTCANCELACTIVITY._serialized_end = 6262 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 6264 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 6305 + _QUERYRESULT._serialized_start = 6308 + _QUERYRESULT._serialized_end = 6464 + _QUERYSUCCESS._serialized_start = 6466 + _QUERYSUCCESS._serialized_end = 6531 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 6533 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 6609 + _FAILWORKFLOWEXECUTION._serialized_start = 6611 + _FAILWORKFLOWEXECUTION._serialized_end = 6685 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6688 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7602 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7445 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7521 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5353 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5432 + _CANCELWORKFLOWEXECUTION._serialized_start = 7604 + _CANCELWORKFLOWEXECUTION._serialized_end = 7680 + _SETPATCHMARKER._serialized_start = 7682 + _SETPATCHMARKER._serialized_end = 7736 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7739 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8913 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5353 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5432 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7445 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7521 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8915 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8989 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8992 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9134 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9137 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9536 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5353 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5432 + _CANCELSIGNALWORKFLOW._serialized_start = 9538 + _CANCELSIGNALWORKFLOW._serialized_end = 9573 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9575 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9676 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 9678 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 9757 + _UPDATERESPONSE._serialized_start = 9760 + _UPDATERESPONSE._serialized_end = 9970 + _SCHEDULENEXUSOPERATION._serialized_start = 9973 + _SCHEDULENEXUSOPERATION._serialized_end = 10511 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10461 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10511 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 10513 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 10555 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index b4848ddb1..4988498a8 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -28,6 +28,7 @@ import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 +import temporalio.bridge.proto.external_data.external_data_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 if sys.version_info >= (3, 10): @@ -104,6 +105,12 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_PROGRESS_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_QUIESCENT_FIELD_NUMBER: builtins.int + EXTERNAL_STREAM_PARK_RESULT_FIELD_NUMBER: builtins.int + EXTERNAL_STREAM_FINALIZED_FIELD_NUMBER: builtins.int + WORKFLOW_OUTPUT_STREAM_COMMIT_FIELD_NUMBER: builtins.int + WORKFLOW_OUTPUT_STREAM_BUFFERED_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int @property @@ -181,10 +188,23 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property + def workflow_stream_progress(self) -> global___WorkflowStreamProgress: ... + @property + def workflow_stream_quiescent(self) -> global___WorkflowStreamQuiescent: ... + @property + def external_stream_park_result(self) -> global___ExternalStreamParkResult: ... + @property + def external_stream_finalized(self) -> global___ExternalStreamFinalized: ... + @property + def workflow_output_stream_commit(self) -> global___WorkflowOutputStreamCommit: ... + @property + def workflow_output_stream_buffered( + self, + ) -> global___WorkflowOutputStreamBuffered: ... + @property def subscribe_stream(self) -> global___SubscribeStream: - """23 to 28 are taken by the external stream commands, which are developed - alongside these and share this message. The two numbers below are fixed - with that family and must not be reused. + """The two numbers below are shared with the native stream tree, which + leaves 23 to 28 to the commands above, and must not be reused. """ @property def append_stream_records(self) -> global___AppendStreamRecords: ... @@ -226,6 +246,13 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + workflow_stream_progress: global___WorkflowStreamProgress | None = ..., + workflow_stream_quiescent: global___WorkflowStreamQuiescent | None = ..., + external_stream_park_result: global___ExternalStreamParkResult | None = ..., + external_stream_finalized: global___ExternalStreamFinalized | None = ..., + workflow_output_stream_commit: global___WorkflowOutputStreamCommit | None = ..., + workflow_output_stream_buffered: global___WorkflowOutputStreamBuffered + | None = ..., subscribe_stream: global___SubscribeStream | None = ..., append_stream_records: global___AppendStreamRecords | None = ..., ) -> None: ... @@ -246,6 +273,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"complete_workflow_execution", "continue_as_new_workflow_execution", b"continue_as_new_workflow_execution", + "external_stream_finalized", + b"external_stream_finalized", + "external_stream_park_result", + b"external_stream_park_result", "fail_workflow_execution", b"fail_workflow_execution", "modify_workflow_properties", @@ -284,6 +315,14 @@ class WorkflowCommand(google.protobuf.message.Message): b"user_metadata", "variant", b"variant", + "workflow_output_stream_buffered", + b"workflow_output_stream_buffered", + "workflow_output_stream_commit", + b"workflow_output_stream_commit", + "workflow_stream_progress", + b"workflow_stream_progress", + "workflow_stream_quiescent", + b"workflow_stream_quiescent", ], ) -> builtins.bool: ... def ClearField( @@ -305,6 +344,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"continue_as_new_workflow_execution", "event_group_markers", b"event_group_markers", + "external_stream_finalized", + b"external_stream_finalized", + "external_stream_park_result", + b"external_stream_park_result", "fail_workflow_execution", b"fail_workflow_execution", "modify_workflow_properties", @@ -343,6 +386,14 @@ class WorkflowCommand(google.protobuf.message.Message): b"user_metadata", "variant", b"variant", + "workflow_output_stream_buffered", + b"workflow_output_stream_buffered", + "workflow_output_stream_commit", + b"workflow_output_stream_commit", + "workflow_stream_progress", + b"workflow_stream_progress", + "workflow_stream_quiescent", + b"workflow_stream_quiescent", ], ) -> None: ... def WhichOneof( @@ -371,6 +422,12 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "workflow_stream_progress", + "workflow_stream_quiescent", + "external_stream_park_result", + "external_stream_finalized", + "workflow_output_stream_commit", + "workflow_output_stream_buffered", "subscribe_stream", "append_stream_records", ] @@ -379,9 +436,318 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class AppendStreamRecords(google.protobuf.message.Message): - """Append a batch of records to a stream this workflow owns. +class WorkflowStreamProgress(google.protobuf.message.Message): + """Commits an observation delta for external streams. + + Emitted on *every* completion path where replay-visible stream state changed -- which includes + an activation that observed no records at all -- and independent of whether the Workflow Task + is retained. Consuming a record and committing that consumption are separate steps, and the + second is not conditional on why the Workflow Task ended. + + Ordering is normative: this command precedes every command whose value could depend on the + consumed data. On replay that guarantees integrity validation for a record runs before the + command derived from it is matched. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + REQUEST_ROLLOVER_FIELD_NUMBER: builtins.int + observation_delta: builtins.bytes + """The segments produced since the previous progress report for this Workflow Task. Opaque to + Core, which appends it to the accumulated annotation and never parses it. + """ + request_rollover: builtins.bool + """Set when the encoder is approaching the annotation byte budget and the runtime wants the + Workflow Task rolled over rather than the marker grown further. Core takes the rollover + path minus the finalization round trip, because this command already carries the terminal. + """ + def __init__( + self, + *, + observation_delta: builtins.bytes = ..., + request_rollover: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "observation_delta", + b"observation_delta", + "request_rollover", + b"request_rollover", + ], + ) -> None: ... + +global___WorkflowStreamProgress = WorkflowStreamProgress +class WorkflowStreamQuiescent(google.protobuf.message.Message): + """Asks Core to retain the open Workflow Task. Carries no annotation data -- retention and + progress are separate questions, and a completion may carry either command, both, or neither. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + IDLE_TIMEOUT_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + """Identifies this complete blocked snapshot.""" + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___ExternalStreamWait + ]: + """The *complete* set of waits the Workflow is blocked on. A partial set would let one idle + stream park a Workflow Task another stream is still driving. + """ + @property + def idle_timeout(self) -> google.protobuf.duration_pb2.Duration: + """Already reduced by `min` over the quiescent set in wait_id order. Core rejects a + non-positive value as a malformed completion rather than coercing it. + """ + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[global___ExternalStreamWait] | None = ..., + idle_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["idle_timeout", b"idle_timeout"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "idle_timeout", + b"idle_timeout", + "quiescence_generation", + b"quiescence_generation", + "waits", + b"waits", + ], + ) -> None: ... + +global___WorkflowStreamQuiescent = WorkflowStreamQuiescent + +class ExternalStreamWait(google.protobuf.message.Message): + """One external stream wait. Shared by the commands above and by the activation jobs, so it takes + no command tag of its own. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WAIT_ID_FIELD_NUMBER: builtins.int + GENERATION_FIELD_NUMBER: builtins.int + IMMEDIATELY_PARKABLE_FIELD_NUMBER: builtins.int + wait_id: builtins.int + generation: builtins.int + """Increments each time this subscription re-enters the blocked state. Never leaves the + Core/lang boundary. + """ + immediately_parkable: builtins.bool + """Normally set after a write fence. A single fenced stream does not park the Workflow Task; + Core bypasses the idle delay only when *every* active wait in the snapshot is set. + """ + def __init__( + self, + *, + wait_id: builtins.int = ..., + generation: builtins.int = ..., + immediately_parkable: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "generation", + b"generation", + "immediately_parkable", + b"immediately_parkable", + "wait_id", + b"wait_id", + ], + ) -> None: ... + +global___ExternalStreamWait = ExternalStreamWait + +class ExternalStreamParkResult(google.protobuf.message.Message): + """Lang's answer to PrepareExternalStreamPark.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + CONFIRMED_FIELD_NUMBER: builtins.int + BECAME_READY_FIELD_NUMBER: builtins.int + FINAL_OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def confirmed(self) -> global___ParkSetConfirmed: ... + @property + def became_ready(self) -> global___StreamSetBecameReady: ... + final_observation_delta: builtins.bytes + """Terminal observation delta for the marker Core is about to write. Present on `confirmed`: + only lang can encode the boundary, and Core must not write a marker whose annotation has + no terminal. + """ + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + confirmed: global___ParkSetConfirmed | None = ..., + became_ready: global___StreamSetBecameReady | None = ..., + final_observation_delta: builtins.bytes = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "became_ready", + b"became_ready", + "confirmed", + b"confirmed", + "outcome", + b"outcome", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "became_ready", + b"became_ready", + "confirmed", + b"confirmed", + "final_observation_delta", + b"final_observation_delta", + "outcome", + b"outcome", + "quiescence_generation", + b"quiescence_generation", + ], + ) -> None: ... + def WhichOneof( + self, oneof_group: typing_extensions.Literal["outcome", b"outcome"] + ) -> typing_extensions.Literal["confirmed", "became_ready"] | None: ... + +global___ExternalStreamParkResult = ExternalStreamParkResult + +class ParkSetConfirmed(google.protobuf.message.Message): + """Every stream was still empty after intents were installed and every stream was rechecked.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___ParkSetConfirmed = ParkSetConfirmed + +class StreamSetBecameReady(google.protobuf.message.Message): + """A recheck found records, so this parking generation is aborted and Core issues a normal + resolve activation rather than running user code from inside the park path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___StreamSetBecameReady = StreamSetBecameReady + +class ExternalStreamFinalized(google.protobuf.message.Message): + """Lang's answer to FinalizeExternalStreams, for the paths where Core decides the boundary and no + park handshake runs. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + FINAL_OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + final_observation_delta: builtins.bytes + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + final_observation_delta: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "final_observation_delta", + b"final_observation_delta", + "quiescence_generation", + b"quiescence_generation", + ], + ) -> None: ... + +global___ExternalStreamFinalized = ExternalStreamFinalized + +class WorkflowOutputStreamCommit(google.protobuf.message.Message): + """Reports that the output batch for this Workflow Task has been durably staged outside History. + Core records only this compact manifest in the shared external-stream marker. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MANIFEST_FIELD_NUMBER: builtins.int + REQUEST_ROLLOVER_FIELD_NUMBER: builtins.int + @property + def manifest( + self, + ) -> temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest: ... + request_rollover: builtins.bool + """The deterministic output capacity was reached and this task must request a replacement.""" + def __init__( + self, + *, + manifest: temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest + | None = ..., + request_rollover: builtins.bool = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["manifest", b"manifest"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "manifest", b"manifest", "request_rollover", b"request_rollover" + ], + ) -> None: ... + +global___WorkflowOutputStreamCommit = WorkflowOutputStreamCommit + +class WorkflowOutputStreamBuffered(google.protobuf.message.Message): + """Reports that external output is buffered in lang but has not yet been staged. Core retains the + open Workflow Task until the earliest reported deadline and then asks lang to finalize it. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAX_PUBLISH_LATENCY_FIELD_NUMBER: builtins.int + @property + def max_publish_latency(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + max_publish_latency: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "max_publish_latency", b"max_publish_latency" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_publish_latency", b"max_publish_latency" + ], + ) -> None: ... + +global___WorkflowOutputStreamBuffered = WorkflowOutputStreamBuffered + +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns.// The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch size free: a thousand records cost the same in History as one. The server From b530ad80ccd6db0db354252f746dea17369a989f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:10:12 -0700 Subject: [PATCH 301/831] Removed the old native live module and moved the demo notes to the v2 front. The interface loop on the native provider now runs from the worker e2e module that the native branch carries. --- streams_demo/README.md | 10 ++-- tests/streams/test_native_provider.py | 66 --------------------------- 2 files changed, 5 insertions(+), 71 deletions(-) delete mode 100644 tests/streams/test_native_provider.py diff --git a/streams_demo/README.md b/streams_demo/README.md index 94aacc466..a52e56ae8 100644 --- a/streams_demo/README.md +++ b/streams_demo/README.md @@ -51,14 +51,14 @@ provider it is configured with. Workers still configure a storage provider, because workflow reads and writes ride the Workflow Task. ```python -front = streams._provider.instance("nexus", endpoint=endpoint_id) -producer = await front.producer(None, workflow_id=wid, stream="inputs", - producer_id="model", attempt=1) +front = NexusStreams(endpoint=endpoint_id) +stream = front.get_stream_handle(client, workflow_id) +producer = stream.producer(topic="inputs", producer_id="model", attempt=1) ``` See `tests/streams/test_nexus_provider.py` for the endpoint setup and the handler worker. The conformance suite runs the same expectations on every provider: -`pytest tests/streams/` (in-memory, no server), plus -`STREAMS_LIVE=workflow_streams|nexus` for the live suites. +`pytest tests/streams/` (memory and Workflow Streams on the test server), plus +`STREAMS_LIVE=native|redis|nexus` for the suites that need a store. diff --git a/tests/streams/test_native_provider.py b/tests/streams/test_native_provider.py deleted file mode 100644 index 0a46f89d3..000000000 --- a/tests/streams/test_native_provider.py +++ /dev/null @@ -1,66 +0,0 @@ -"""Live interface loop over the server-side (native) provider. - -Runs the interface loop the other providers run, inside a workflow, against -a Temporal server that carries the stream service; the conformance suite -covers the outside surface under the same gate. Gated behind ``STREAMS_LIVE=native``; -``TEMPORAL_ADDRESS`` must point at a server built from ``moedash/temporal`` -``moe/AI-198-server-side-streams``. -""" - -from __future__ import annotations - -import os -import uuid - -import pytest - -from temporalio import streams -from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.worker import Worker -from tests.streams.test_workflow_streams_provider import EchoLoop, take - -pytestmark = pytest.mark.skipif( - os.environ.get("STREAMS_LIVE") != "native", - reason="needs a stream-carrying server; run with STREAMS_LIVE=native", -) - - -async def test_interface_loop_over_native_streams(): - streams.configure(provider="native") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-native-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - handle = await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" - ) - - producer = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - await producer.append({"n": 1}, {"n": 2}) - await producer.append({"n": 3}) - await producer.finish() - - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4, timeout=60) - assert [r.kind for r in records] == [ - RecordKind.DATA, - RecordKind.DATA, - RecordKind.DATA, - RecordKind.FINISH, - ] - assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - - await handle.signal(EchoLoop.release) - assert await handle.result() == 3 From 2799b580273589b0d8ed4ddcefcb8c99a55e5bfd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:45:36 -0700 Subject: [PATCH 302/831] Kept the stream finish hook off evicted runs and collected coroutines. Neither is the workflow ending. An evicted run's state is not to be touched, and at collection time the runtime on the thread belongs to whichever workflow is running, so the hook acted on that one. --- temporalio/worker/_workflow.py | 29 +++++-- tests/streams/test_stream_hooks.py | 133 +++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 tests/streams/test_stream_hooks.py diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index b5e4cb411..9b94de95a 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -63,17 +63,36 @@ class _StreamHooksInterceptor(WorkflowInboundInterceptor): Installed by the worker when it has a stream provider, so no workflow code has to call anything before it runs or before it returns. The finish - hook runs however the function ends, continue-as-new included, because + hook runs when the function returns, raises or continues as new, because a provider that parked a reader against the run has to let go either way. + It does not run when the run is being evicted from the cache or when the + abandoned coroutine is collected: neither is the workflow ending, the + instance's state is not to be touched during eviction, and at collection + time the runtime on the thread belongs to whichever workflow happens to + be running, so the hook would act on that one. """ async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: - provider = temporalio.workflow._Runtime.current().workflow_streams().provider + runtime = temporalio.workflow._Runtime.current() + provider = runtime.workflow_streams().provider provider.on_workflow_start() try: - return await self.next.execute_workflow(input) - finally: - await provider.on_workflow_finish() + result = await self.next.execute_workflow(input) + except GeneratorExit: + raise + except BaseException: + if not _evicting(runtime): + await provider.on_workflow_finish() + raise + await provider.on_workflow_finish() + return result + + +def _evicting(runtime: temporalio.workflow._Runtime) -> bool: + # Eviction cancels the primary task the same way a workflow cancellation + # does; the flag the instance sets before cancelling is what tells them + # apart, and only the cancellation is a run ending. + return bool(getattr(runtime, "_deleting", False)) # Value was chosen abitrarily as a small number that allows some concurrency and prevents diff --git a/tests/streams/test_stream_hooks.py b/tests/streams/test_stream_hooks.py new file mode 100644 index 000000000..be7b6e9d4 --- /dev/null +++ b/tests/streams/test_stream_hooks.py @@ -0,0 +1,133 @@ +"""The lifecycle interceptor's rules about when the finish hook runs. + +Driven directly, with a stand-in runtime on the loop, because the two cases +that matter here are the ones a workflow test cannot stage on purpose: a +coroutine collected after its worker went away, and a run evicted from the +cache. Both used to reach the finish hook, and at collection time the hook +acted on whichever workflow was running on the thread. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.worker._interceptor import ( + ExecuteWorkflowInput, + WorkflowInboundInterceptor, +) +from temporalio.worker._workflow import _StreamHooksInterceptor + + +class _Provider: + def __init__(self) -> None: + self.calls: list[str] = [] + + def on_workflow_start(self) -> None: + self.calls.append("start") + + async def on_workflow_finish(self) -> None: + self.calls.append("finish") + + +class _Streams: + def __init__(self, provider: _Provider) -> None: + self.provider = provider + + +class _FakeRuntime: + """Only what the interceptor reads: the stream state and the eviction flag.""" + + def __init__(self, provider: _Provider, *, deleting: bool = False) -> None: + self._streams = _Streams(provider) + self._deleting = deleting + + def workflow_streams(self) -> _Streams: + return self._streams + + +class _Body(WorkflowInboundInterceptor): + """The workflow function's stand-in: returns, raises or parks forever.""" + + def __init__(self, outcome: Any) -> None: # type: ignore[reportMissingSuperCall] + self._outcome = outcome + + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: + del input + if self._outcome is _PARK: + await asyncio.Event().wait() + if isinstance(self._outcome, BaseException): + raise self._outcome + return self._outcome + + +_PARK = object() +_INPUT = ExecuteWorkflowInput(type=object, run_fn=lambda: None, args=(), headers={}) + + +@pytest.fixture +async def provider() -> Any: + fake = _Provider() + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake)) # type: ignore[arg-type] + yield fake + workflow._Runtime.set_on_loop(loop, None) + + +def _evicting(fake: _Provider) -> None: + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake, deleting=True)) # type: ignore[arg-type] + + +async def test_the_finish_hook_runs_on_return(provider: _Provider): + assert ( + await _StreamHooksInterceptor(_Body("done")).execute_workflow(_INPUT) == "done" + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_when_the_function_raises(provider: _Provider): + with pytest.raises(RuntimeError, match="boom"): + await _StreamHooksInterceptor(_Body(RuntimeError("boom"))).execute_workflow( + _INPUT + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_on_continue_as_new(provider: _Provider): + error = workflow.ContinueAsNewError.__new__(workflow.ContinueAsNewError) + with pytest.raises(workflow.ContinueAsNewError): + await _StreamHooksInterceptor(_Body(error)).execute_workflow(_INPUT) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_on_a_workflow_cancellation(provider: _Provider): + # A cancelled primary task is the run ending, so the provider lets go. + with pytest.raises(asyncio.CancelledError): + await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( + _INPUT + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_does_not_run_when_the_coroutine_is_collected( + provider: _Provider, +): + coroutine = _StreamHooksInterceptor(_Body(_PARK)).execute_workflow(_INPUT) + # Run up to the park, the way a worker that shut down without evicting + # leaves the primary task, then close it as garbage collection would. + coroutine.send(None) + coroutine.close() + assert provider.calls == ["start"] + + +async def test_the_finish_hook_does_not_run_during_eviction(provider: _Provider): + _evicting(provider) + with pytest.raises(asyncio.CancelledError): + await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( + _INPUT + ) + assert provider.calls == ["start"] From 297d3c59532178c4952638030acc24c2e294e4dc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:46:44 -0700 Subject: [PATCH 303/831] Typed the hook test's workflow input as awaitable. --- tests/streams/test_stream_hooks.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_stream_hooks.py b/tests/streams/test_stream_hooks.py index be7b6e9d4..9f98f75f6 100644 --- a/tests/streams/test_stream_hooks.py +++ b/tests/streams/test_stream_hooks.py @@ -65,7 +65,13 @@ async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: _PARK = object() -_INPUT = ExecuteWorkflowInput(type=object, run_fn=lambda: None, args=(), headers={}) + + +async def _unused_run_fn() -> None: + pass + + +_INPUT = ExecuteWorkflowInput(type=object, run_fn=_unused_run_fn, args=(), headers={}) @pytest.fixture From dd9c3e13cd3318c9dc35b9d3cc7b506da1461e9b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 304/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From d9276484bf46616414bf31d4c254204d9d6b7bf7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 305/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From 112cfad479ea9b59526d1d1036d615ca8ca4a576 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 306/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- .../streams/providers/workflow_streams.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From 508c746fd90b4e5ccb8275dc481bac91ede01f1c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 307/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- .../streams/providers/workflow_streams.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) From 04d5fa25d4b06ec464c1bd355382c7c9bd652d9a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 308/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From 7c3fede5fb32f708c2a56f8f32ae18b77e681b83 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 309/831] Made the Workflow Streams provider pass the linters. The transport already resolves its payload converter and falls back to the default when it holds no client, so the provider asks it rather than reaching through a client that may not be there. --- .../streams/providers/workflow_streams.py | 13 ++++++-- .../streams/test_workflow_streams_provider.py | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d849f1244..656056381 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -186,6 +186,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to one stream or topic on ``handle``.""" self._handle = handle self._converter = converter self._stream = stream @@ -205,15 +206,19 @@ def _shipped_topic(self) -> str: @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the shipped publish Signal.""" entries = [] for value in values: frame = _frame.encode( @@ -230,6 +235,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor("") async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._frame_topic, kind=RecordKind.FINISH, @@ -274,6 +280,7 @@ def __init__( shipped_topic: str | None, poll_cooldown: timedelta, ) -> None: + """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client self._shipped_topic = shipped_topic self._poll_cooldown = poll_cooldown @@ -285,6 +292,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -362,6 +370,7 @@ def _record( return out async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one log per workflow, whatever the topic head = await self._client.get_offset() return Cursor(str(head - 1)) if head > 0 else BEGINNING @@ -369,7 +378,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._client.data_converter.payload_converter + converter = self._client._payload_converter() if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2b491cbf1..612aaa33d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -12,6 +12,7 @@ import asyncio import os import uuid +from typing import Any import pytest @@ -62,7 +63,7 @@ async def run(self) -> int: return seen -async def take(records, count: int, timeout: float = 30.0) -> list: +async def take(records: Any, count: int, timeout: float = 30.0) -> list: out: list = [] async def _collect() -> None: @@ -77,9 +78,7 @@ async def _collect() -> None: async def test_interface_loop_over_workflow_streams(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -119,9 +118,7 @@ async def test_interface_loop_over_workflow_streams(): async def test_retried_producer_dedupes_and_new_attempt_supersedes(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -135,19 +132,28 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): ) first = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await first.append({"n": 1}) # The retry of the same attempt re-sends its first batch. retry = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await retry.append({"n": 1}) second = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=2, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=2, ) await second.append({"n": 2}) From 470f985eded3b4598134f61aa7cc3f730fdfd77a Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 310/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06eb5da58..ee4f256cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,10 @@ to include examples, links to docs, or any other relevant information. the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 15550521718f9b83f27d0119653c6faeb0d67704 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:44:59 -0700 Subject: [PATCH 311/831] Added public accessors to Workflow Streams for code that rides its wire. A provider that reuses the shipped transport needs the publish signal's name, the log past an offset, and the client's handle and converter. Reading them off private attributes breaks silently on the next contrib change. --- .../contrib/workflow_streams/__init__.py | 6 +++- .../contrib/workflow_streams/_client.py | 14 ++++++++++ .../contrib/workflow_streams/_stream.py | 28 ++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/temporalio/contrib/workflow_streams/__init__.py b/temporalio/contrib/workflow_streams/__init__.py index 41f670f0c..3f225bb2f 100644 --- a/temporalio/contrib/workflow_streams/__init__.py +++ b/temporalio/contrib/workflow_streams/__init__.py @@ -13,7 +13,10 @@ """ from temporalio.contrib.workflow_streams._client import WorkflowStreamClient -from temporalio.contrib.workflow_streams._stream import WorkflowStream +from temporalio.contrib.workflow_streams._stream import ( + PUBLISH_SIGNAL_NAME, + WorkflowStream, +) from temporalio.contrib.workflow_streams._topic_handle import ( TopicHandle, WorkflowTopicHandle, @@ -29,6 +32,7 @@ ) __all__ = [ + "PUBLISH_SIGNAL_NAME", "PollInput", "PollResult", "PublishEntry", diff --git a/temporalio/contrib/workflow_streams/_client.py b/temporalio/contrib/workflow_streams/_client.py index 605bf3f03..5c458bdab 100644 --- a/temporalio/contrib/workflow_streams/_client.py +++ b/temporalio/contrib/workflow_streams/_client.py @@ -325,6 +325,20 @@ def topic( self._topic_types[name] = bound return TopicHandle(self, name, bound) + @property + def handle(self) -> WorkflowHandle[Any, Any]: + """The workflow handle this client publishes to and polls. + + Re-targeted when :py:meth:`subscribe` follows a continue-as-new, so + read it when needed rather than caching it. + """ + return self._handle + + @property + def payload_converter(self) -> PayloadConverter: + """The sync payload converter used for per-item encode and decode.""" + return self._payload_converter() + async def flush(self) -> None: """Flush buffered (and pending) items and wait for server confirmation. diff --git a/temporalio/contrib/workflow_streams/_stream.py b/temporalio/contrib/workflow_streams/_stream.py index ae8608c3b..ff0865c29 100644 --- a/temporalio/contrib/workflow_streams/_stream.py +++ b/temporalio/contrib/workflow_streams/_stream.py @@ -50,7 +50,14 @@ _WorkflowStreamWireItem, ) -_PUBLISH_SIGNAL = "__temporal_workflow_stream_publish" +PUBLISH_SIGNAL_NAME = "__temporal_workflow_stream_publish" +"""The signal :class:`WorkflowStream` registers for external publishes. + +Public so code that sends the signal itself, with its own publisher identity, +does not have to copy the name. +""" + +_PUBLISH_SIGNAL = PUBLISH_SIGNAL_NAME _POLL_UPDATE = "__temporal_workflow_stream_poll" _OFFSET_QUERY = "__temporal_workflow_stream_offset" @@ -234,6 +241,25 @@ def topic( self._topic_types[name] = bound return WorkflowTopicHandle(self, name, bound) + @property + def next_offset(self) -> int: + """The global offset the next published item will receive.""" + return self._base_offset + len(self._log) + + def items_from(self, offset: int) -> list[tuple[int, str, Payload]]: + """Return ``(offset, topic, payload)`` for every item at or past ``offset``. + + Reads the log in place, so it is safe to call from a + :func:`temporalio.workflow.wait_condition` predicate. An ``offset`` + below the truncation base starts at the base instead; the offsets in + the result say where the items actually sit. + """ + start = max(offset, self._base_offset) - self._base_offset + return [ + (self._base_offset + index, item.topic, item.data) + for index, item in enumerate(self._log[start:], start) + ] + def get_state( self, *, publisher_ttl: timedelta = timedelta(seconds=900) ) -> WorkflowStreamState: From 189f304d51bbf58ebbdca4a6d5f2e914fd2e92e4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 312/831] Keyed the Workflow Streams runtime by workflow instance, not run id. The SDK rebuilds an evicted workflow from history as a new object. A process map keyed by run id handed that object the previous instance's log, with no handlers registered on the new one and the records of a failed task still inside. The stream is now found through the handler the shipped class registers on the instance, and the provider reads the contrib module only through its public surface. --- .../streams/providers/workflow_streams.py | 121 ++++++++---------- 1 file changed, 54 insertions(+), 67 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 656056381..8155f7e9d 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -36,6 +36,7 @@ from temporalio.client import Client from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( + PUBLISH_SIGNAL_NAME, PublishEntry, PublishInput, WorkflowStream, @@ -48,77 +49,63 @@ from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord -_RUN_ATTR = "__temporal_streams_ws_runtime" _TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" class _Runtime: - """Per-run holder for the shipped stream object. + """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed - from a method named ``__init__``, and the provider builds it lazily on - the first read or write of a run. + from a method named ``__init__``. """ - def __init__(self) -> None: - self.stream = WorkflowStream() - # The poll Update stops answering once the workflow is closing, and a - # reader between polls at that moment would lose what the final task - # published. The log is workflow state, so a Query still serves it - # after completion. - workflow.set_query_handler(_TAIL_QUERY, self._tail) + def __init__(self, stream: WorkflowStream | None = None) -> None: + self.stream = WorkflowStream() if stream is None else stream + if workflow.get_query_handler(_TAIL_QUERY) is None: + # The poll Update stops answering once the workflow is closing, + # and a reader between polls at that moment would lose what the + # final task published. The log is workflow state, so a Query + # still serves it after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) def _tail(self, from_offset: int) -> list[dict[str, Any]]: - base = self.stream._base_offset return [ { - "offset": base + index, - "topic": item.topic, - "data": base64.b64encode(item.data.data).decode("ascii"), + "offset": offset, + "topic": topic, + "data": base64.b64encode(payload.data).decode("ascii"), } - for index, item in enumerate(self.stream._log) - if base + index >= from_offset + for offset, topic, payload in self.stream.items_from(from_offset) ] -# Held per run rather than on the workflow instance, because the provider is -# asked to install its handlers from the workflow's constructor, and the -# instance is not registered with the runtime yet at that point. -_runtimes: dict[str, _Runtime] = {} +def _registered_stream() -> WorkflowStream | None: + handler = workflow.get_signal_handler(PUBLISH_SIGNAL_NAME) + if handler is None: + return None + stream = getattr(handler, "__self__", None) + if not isinstance(stream, WorkflowStream): + raise RuntimeError( + f"the {PUBLISH_SIGNAL_NAME!r} signal on this workflow is handled by " + "something other than a WorkflowStream, so the workflow_streams " + "provider cannot share its log" + ) + return stream def _runtime() -> _Runtime: - key = workflow.info().run_id - runtime = _runtimes.get(key) - if runtime is None: - runtime = _Runtime() - _runtimes[key] = runtime - return runtime - - -def drain() -> None: - """Release parked pollers so the workflow can return. - - An Option 0 stream dies with its workflow, and a parked long-poll Update - would otherwise hold completion open. Call it right before the workflow - returns, the same obligation the shipped feature's ``detach_pollers`` - documents. A storage provider has no such step, which is one of the - differences the comparison table charges this transport with. - """ - runtime = _runtimes.pop(workflow.info().run_id, None) - if runtime is not None: - runtime.stream.detach_pollers() + # Found on the instance rather than in a process-level map keyed by run + # id: the SDK rebuilds an evicted workflow from history as a new object, + # and a map would hand that object the stale log with its unregistered + # handlers and the records of a task that failed. + stream = _registered_stream() + return _Runtime() if stream is None else _Runtime(stream) class _WSReadSource: - """Reads the signal-fed log the shipped feature keeps in workflow state. - - Reaches into the stream's private log rather than ``get_state()``, - because the snapshot copies the whole log per call and drops offsets, - and this runs inside ``workflow.wait_condition``. - """ + """Reads the signal-fed log the shipped feature keeps in workflow state.""" def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: self._stream = stream @@ -126,29 +113,21 @@ def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> No self._cursor = start self._closed = False - def _end(self) -> int: - return self._stream._base_offset + len(self._stream._log) - async def next_batch(self) -> list[tuple[Cursor, bytes]]: while True: if self._closed: raise StopAsyncIteration - base = self._stream._base_offset - if self._cursor < base: - # Truncated below the cursor; resume at what remains. - self._cursor = base await workflow.wait_condition( - lambda: self._closed or self._end() > self._cursor + lambda: self._closed or self._stream.next_offset > self._cursor ) if self._closed: raise StopAsyncIteration - batch: list[tuple[Cursor, bytes]] = [] - end = self._end() - for offset in range(self._cursor, end): - item = self._stream._log[offset - self._stream._base_offset] - if item.topic == self._shipped_topic: - batch.append((Cursor(str(offset)), item.data.data)) - self._cursor = end + batch = [ + (Cursor(str(offset)), payload.data) + for offset, topic, payload in self._stream.items_from(self._cursor) + if topic == self._shipped_topic + ] + self._cursor = self._stream.next_offset if batch: return batch @@ -254,7 +233,7 @@ def _entry(self, frame: bytes) -> PublishEntry: async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 await self._handle.signal( - _PUBLISH_SIGNAL, + PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, @@ -324,7 +303,7 @@ async def read( async def _tail(self, from_offset: int) -> list[dict[str, Any]]: try: - return await self._client._handle.query( + wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) except Exception: @@ -378,7 +357,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._payload_converter() + converter = self._client.payload_converter if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] @@ -413,8 +392,16 @@ def prepare(self) -> None: _runtime() def drain(self) -> None: - """Release parked pollers so the workflow can return.""" - drain() + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll + Update would otherwise hold completion open. Call it right before + the workflow returns, the same obligation the shipped feature's + ``detach_pollers`` documents. + """ + stream = _registered_stream() + if stream is not None: + stream.detach_pollers() def open_read( self, From 781dc0737c884b66d8a17dbbda44455fc9071233 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 313/831] Committed producer sequences only after the publish signal was accepted. A retry after an ambiguous failure used to carry fresh sequences, so the shipped dedupe let the same batch land twice. The batch now stays pending under its signal sequence until the server accepts it, and goes out first if the caller moves on. append returns None because this transport learns positions at read time. --- .../streams/providers/workflow_streams.py | 100 +++++++++++------- 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 8155f7e9d..fb685fc2c 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -42,8 +42,7 @@ WorkflowStream, WorkflowStreamClient, ) -from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL -from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -147,6 +146,11 @@ async def publish(self, frame: bytes) -> None: self._handle.publish(payload) +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + class WorkflowStreamsProducer: """Appends by sending the shipped publish Signal directly. @@ -154,6 +158,12 @@ class WorkflowStreamsProducer: owns the publisher identity: it must be ``producer#attempt`` for the shipped dedupe to drop a retry and pass a new generation, and the client would use its own random id. + + Sequences are committed only after the server accepted the Signal. A + batch whose Signal raised stays pending and goes out again under the + same signal sequence, either when the caller retries the same values or + ahead of whatever the caller sends next, so an ambiguous failure writes + the batch once and loses nothing. """ def __init__( @@ -174,10 +184,7 @@ def __init__( self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 - - @property - def _frame_topic(self) -> str: - return self._stream or self._topic + self._pending: tuple[list[PublishEntry], int] | None = None @property def _shipped_topic(self) -> str: @@ -196,50 +203,67 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append ``values`` through the shipped publish Signal.""" + async def append(self, *values: Any) -> None: + """Append ``values`` through the shipped publish Signal. + + Always ``None``: this transport learns positions at read time. + """ + if not values: + return None + await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + return None + + async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" + await self._send([(RecordKind.FINISH, b"")]) + + def _frames( + self, bodies: list[tuple[RecordKind, bytes]] + ) -> tuple[list[PublishEntry], int]: + sequence = self._sequence entries = [] - for value in values: + for kind, body in bodies: frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.DATA, + topic=self._topic, + kind=kind, producer=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=sequence, + body=body, ) - self._sequence += 1 - entries.append(self._entry(frame)) - await self._send(entries) - return Cursor("") - - async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._send([self._entry(frame)]) - - def _entry(self, frame: bytes) -> PublishEntry: - payload = Payload(data=frame) - return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) - - async def _send(self, entries: list[PublishEntry]) -> None: - self._signal_sequence += 1 + sequence += 1 + entries.append( + PublishEntry( + topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) + ) + ) + return entries, sequence + + async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: + entries, next_sequence = self._frames(bodies) + if self._pending is not None and self._pending[0] != entries: + # The caller moved on from a batch whose Signal raised. It goes + # first, under the signal sequence it already had, so a copy the + # server did accept is dropped and one it never saw lands. The + # new batch is then renumbered behind it. + await self._signal(*self._pending) + entries, next_sequence = self._frames(bodies) + await self._signal(entries, next_sequence) + + async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: + signal_sequence = self._signal_sequence + 1 + self._pending = (entries, next_sequence) await self._handle.signal( PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, - sequence=self._signal_sequence, + sequence=signal_sequence, ), ) + self._signal_sequence = signal_sequence + self._sequence = next_sequence + self._pending = None def _encode(self, value: Any) -> bytes: payload = ( From f6da0a7ef1daeb8dc5855135cf03d07bada94b62 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 314/831] Adapted the Workflow Streams provider to the interface changes. Inbound frames carry no topic and a topic filter on an inbound stream is rejected through the shared check; producer identity comes resolved from the package; an unreadable frame is skipped with a warning; read is declared as the generator it is. --- .../streams/providers/workflow_streams.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index fb685fc2c..ef2a88312 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -27,7 +27,8 @@ from __future__ import annotations import base64 -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any @@ -52,6 +53,8 @@ _IN = "in:" _OUT = "out:" +logger = logging.getLogger(__name__) + class _Runtime: """A view over the shipped stream object of the running workflow instance. @@ -280,12 +283,13 @@ class WorkflowStreamsConsumer: def __init__( self, stream_client: WorkflowStreamClient, - shipped_topic: str | None, + stream: str, poll_cooldown: timedelta, ) -> None: """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client - self._shipped_topic = shipped_topic + self._stream = stream + self._shipped_topic = f"{_IN}{stream}" if stream else None self._poll_cooldown = poll_cooldown async def read( @@ -294,8 +298,9 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -351,7 +356,9 @@ def _record( cursor = Cursor(str(offset)) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) return [] if topic is not None and frame_topic != topic: return [] @@ -456,11 +463,6 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return WorkflowStreamsProducer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, @@ -475,7 +477,7 @@ async def consumer( ) -> WorkflowStreamsConsumer: return WorkflowStreamsConsumer( WorkflowStreamClient.create(client, workflow_id), - f"{_IN}{stream}" if stream else None, + stream, self._poll_cooldown, ) From 0a4c5beaa66252f67cc1e49d1f67dd30745be5bb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 315/831] Narrowed the tail query's error handling and filtered owner reads by topic. Only a missing handler or a vanished history means there is no tail to serve; anything else, such as a query timeout with no worker polling, is now an error rather than a silent empty stream. An owner-stream read with a topic subscribes to that shipped topic alone instead of dropping inbound items client-side. --- .../streams/providers/workflow_streams.py | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index ef2a88312..049fd60e9 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -20,8 +20,16 @@ - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns an empty cursor. The Signal transport learns positions - at read time; that is this provider's stated deviation. +- ``append`` returns ``None``. The Signal transport learns positions at read + time, so a caller that wants to follow from now asks ``Consumer.latest``. +- The workflow-side stream object belongs to the workflow instance, found + through the handler the shipped class registers on it. An evicted and + rebuilt workflow gets its own, so a task that failed leaks nothing into + the next attempt's log and a replayed run does not see records twice. +- An owner-stream read with a topic subscribes to that shipped topic alone. + Without one it has to take every shipped topic and drop the inbound + items client-side, which spends the poll response cap on records the + reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -34,7 +42,7 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowQueryFailedError from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -303,42 +311,63 @@ async def read( _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 + if self._shipped_topic is not None: + shipped = [self._shipped_topic] + elif topic is not None: + shipped = [f"{_OUT}{topic}"] + else: + shipped = None subscription = self._client.subscribe( - self._shipped_topic, + shipped, from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) - async for item in subscription: - next_offset = item.offset + 1 - record = self._record( - attempts, item.offset, item.topic, item.data.payload.data, topic, type - ) - for out in record: - yield out + try: + async for item in subscription: + next_offset = item.offset + 1 + for out in self._record( + attempts, + item.offset, + item.topic, + item.data.payload.data, + topic, + type, + ): + yield out + finally: + # Lets go of the parked poll when the caller stops early. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() # The subscription ends when the workflow is closing or closed. What # landed after the last poll is still in workflow state, so the tail # comes back by Query rather than being lost with the run. - for wire in await self._tail(next_offset): + for offset, shipped_topic, frame in await self._tail(next_offset): for out in self._record( - attempts, - wire["offset"], - wire["topic"], - base64.b64decode(wire["data"]), - topic, - type, + attempts, offset, shipped_topic, frame, topic, type ): yield out - async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: try: wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) - except Exception: - # A workflow that never opened a stream has no handler to ask, and - # one whose History is gone has nothing left to serve. + except WorkflowQueryFailedError as error: + if "expected but not found" not in str(error): + raise + # The workflow never opened a stream through this provider, so + # there is no tail to serve. return [] + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The History is gone; nothing is left to serve. + return [] + return [ + (item["offset"], item["topic"], base64.b64decode(item["data"])) + for item in wire + ] def _record( self, From 5df65accbc375dee3713d8b93846fe1eb585f995 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 316/831] Ran the Workflow Streams provider tests on the test environment's server. The tests take the shared client fixture instead of an opt-in live gate, the loop workflow calls the portable lifecycle hooks, and new cases cover a cold workflow cache, the tail of a closed run, and the resend of a batch whose signal failed. --- .../streams/test_workflow_streams_provider.py | 227 +++++++++++++----- 1 file changed, 166 insertions(+), 61 deletions(-) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612aaa33d..612e99e02 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -1,44 +1,46 @@ -"""Live conformance for the workflow_streams provider. +"""Conformance for the workflow_streams provider on the test environment's server. -Runs the interface loop over the shipped Option 0 transport against a real -server: an outside producer appends through the publish Signal, the workflow -reads and republishes through its own state, and an outside consumer follows -the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it -needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +Runs the interface loop over the shipped Option 0 transport: an outside +producer appends through the publish Signal, the workflow reads and +republishes through its own state, and an outside consumer follows the poll +Update while the run is open and the tail Query once it has closed. """ from __future__ import annotations import asyncio -import os +import base64 import uuid from typing import Any import pytest from temporalio import streams, workflow +from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams.providers.workflow_streams import drain -from temporalio.worker import Worker +from temporalio.contrib.workflow_streams import PublishInput +from temporalio.converter import DataConverter +from temporalio.streams import RecordKind, _frame +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from tests.helpers import new_worker -pytestmark = pytest.mark.skipif( - os.environ.get("STREAMS_LIVE") != "workflow_streams", - reason="needs a live server; run with STREAMS_LIVE=workflow_streams", -) + +@pytest.fixture(autouse=True) +def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] + streams.configure(provider="workflow_streams") @workflow.defn class EchoLoop: """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. - Lingers until released, because an Option 0 stream dies with its - workflow: a reader that arrives after close finds nothing, which is the - transport limit the doc states rather than a defect to fix here. + Lingers until released so a reader can follow it while it runs; whoever + arrives after it closed is served by the tail Query instead. """ def __init__(self) -> None: self._released = False + streams.prepare() @workflow.signal def release(self) -> None: @@ -54,11 +56,12 @@ async def run(self) -> int: break if record.kind is not RecordKind.DATA: continue + assert isinstance(record.value, dict) seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() await workflow.wait_condition(lambda: self._released) - drain() + streams.drain() await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -76,59 +79,40 @@ async def _collect() -> None: return out -async def test_interface_loop_over_workflow_streams(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - handle = await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" - ) +async def _feed(client: Client, workflow_id: str) -> None: + producer = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() - producer = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, + +ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] + + +async def test_interface_loop_over_workflow_streams(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await producer.append({"n": 1}, {"n": 2}) - await producer.append({"n": 3}) - await producer.finish() + await _feed(client, workflow_id) consumer = await streams.consumer(client, workflow_id=workflow_id) records = await take(consumer.read(type=dict), 4) - assert [r.kind for r in records] == [ - RecordKind.DATA, - RecordKind.DATA, - RecordKind.DATA, - RecordKind.FINISH, - ] + assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" +async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) first = await streams.producer( @@ -147,7 +131,7 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): producer_id="model", attempt=1, ) - await retry.append({"n": 1}) + assert await retry.append({"n": 1}) is None second = await streams.producer( client, workflow_id=workflow_id, @@ -163,5 +147,126 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): records = await take(consumer.read(type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED + assert isinstance(records[1].value, streams.Supersession) assert records[1].value.previous_attempt == 1 assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + # Inbound records carry no topic; the stream's name is the address. + assert all(r.topic == "" for r in records) + + await second.finish() + await handle.signal(EchoLoop.release) + await handle.result() + + +async def test_cold_cache_serves_each_record_once(client: Client): + # Every task rebuilds the workflow from history, so the stream object + # has to belong to the instance that is running: a stale one would carry + # the previous instance's log and hand out every record twice. + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + inbound = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + arrived = await take(inbound.read(type=dict), 4) + assert [r.kind for r in arrived] == ECHOED + assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + +async def test_a_closed_run_serves_its_tail_by_query(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + # Nothing polled while the run was open. The poll Update is gone with + # the run, so everything below arrives through the tail Query. + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + checkpoint = records[1].cursor + resumed = await streams.consumer(client, workflow_id=workflow_id) + again = await take(resumed.read(type=dict, after=checkpoint), 2) + assert [r.value["echo"] for r in again[:1]] == [3] + assert again[1].kind is RecordKind.FINISH + + +class _FlakyHandle: + """A workflow handle whose first Signal is accepted and then reported failed.""" + + def __init__(self) -> None: + self.sent: list[PublishInput] = [] + self._fail_next = True + + async def signal(self, name: str, arg: PublishInput) -> None: + del name + self.sent.append(arg) + if self._fail_next: + self._fail_next = False + raise ConnectionResetError( + "the server accepted the signal, the reply was lost" + ) + + +def _frames( + publish: PublishInput, +) -> list[tuple[RecordKind, str, str, int, int, bytes]]: + out = [] + for entry in publish.items: + payload = Payload() + payload.ParseFromString(base64.b64decode(entry.data)) + out.append(_frame.decode(payload.data)) + return out + + +def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: + return [ + (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + ] + + +def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: + return WorkflowStreamsProducer( + handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + ) + + +async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + # The retry carries the same signal sequence and the same frame sequence + # as the failed send, so the shipped dedupe drops the copy; the batch + # after it continues the numbering. + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + + +async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 2}, {"n": 3}) + await producer.finish() + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] + assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH From 16616a1b542b058167f2d05fcf3e4de1229d8237 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:06:16 -0700 Subject: [PATCH 317/831] Rewrote the Workflow Streams provider on the plugin surface. Topics are the shipped topics of the same name, the record is the StreamRecord proto inside the item payload, and cursors name the run because a log is not carried across continue-as-new. --- .../streams/providers/workflow_streams.py | 684 +++++++++++------- 1 file changed, 409 insertions(+), 275 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 049fd60e9..6f18dce46 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -1,35 +1,33 @@ -"""The provider over today's Workflow Streams (Option 0). +"""The provider over the shipped Workflow Streams transport (Option 0). Speaks the shipped contrib feature's wire format, the ``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code -and existing Workflow Streams code interoperate on one stream, and old -histories replay. Records live in the owning workflow's History, which is -also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers) are transport properties and remain. Reads after -the workflow closes go through one Query this provider adds, which serves -the log from workflow state for as long as the History is retained, so a -reader between polls when the workflow completed still gets the tail. +and existing Workflow Streams code share one log, and old histories replay. +Records live in the owning workflow's History, which is also this provider's +limit: the shipped caps (payloads in History, the Signal cap, bounded +subscribers) are transport properties and remain. The mapping, in one place: -- An interface record's frame rides as the item's ``Payload`` data. -- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. A producer - appending onto the workflow's own topic ``t`` writes ``out:t`` as well, - which is what today's activities already do through the publish Signal. +- A topic is the shipped topic of the same name in the workflow's one log. + A record rides as the item's ``Payload``: its data is the serialized + ``StreamRecord`` proto and its encoding is ``binary/plain``. The shipped + code stores and returns that ``Payload`` untouched, so the body's own + encoding never meets the transport. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns ``None``. The Signal transport learns positions at read - time, so a caller that wants to follow from now asks ``Consumer.latest``. +- ``append()`` returns ``None``. The Signal transport learns positions at + read time, so a caller that wants to follow from now asks ``latest()``. +- A log belongs to one run and is not carried across continue-as-new, so a + cursor names the run as well as the offset. A handle without a run id + reads run after run: each log through the poll Update while its run is + open and through the tail Query once it has closed, then the successor's + from its first record. - The workflow-side stream object belongs to the workflow instance, found through the handler the shipped class registers on it. An evicted and rebuilt workflow gets its own, so a task that failed leaks nothing into the next attempt's log and a replayed run does not see records twice. -- An owner-stream read with a topic subscribes to that shipped topic alone. - Without one it has to take every shipped topic and drop the inbound - items client-side, which spends the poll response cap on records the - reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -40,9 +38,17 @@ from datetime import timedelta from typing import Any +from google.protobuf.message import DecodeError + from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client, WorkflowQueryFailedError +from temporalio.client import ( + Client, + WorkflowExecutionStatus, + WorkflowHandle, + WorkflowHistoryEventFilterType, + WorkflowQueryFailedError, +) from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -51,20 +57,80 @@ WorkflowStream, WorkflowStreamClient, ) +from temporalio.converter import PayloadConverter from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = [ + "WorkflowStreamsHandle", + "WorkflowStreamsProducer", + "WorkflowStreamsProvider", +] +_PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" -_IN = "in:" -_OUT = "out:" +_ENCODING = b"binary/plain" logger = logging.getLogger(__name__) -class _Runtime: +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") + + +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "workflow_streams provider" + ) from None + + +def _wrap(record: WireRecord) -> Payload: + return Payload(metadata={"encoding": _ENCODING}, data=record.SerializeToString()) + + +def _unwrap(cursor: Cursor, payload: Payload, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(payload.data) + except DecodeError as error: + # An item another publisher put on this topic, or a corrupt one: + # skip and say so, so one bad record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None + + +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + +class _InstanceStream: """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed @@ -85,7 +151,7 @@ def _tail(self, from_offset: int) -> list[dict[str, Any]]: { "offset": offset, "topic": topic, - "data": base64.b64encode(payload.data).decode("ascii"), + "data": base64.b64encode(payload.SerializeToString()).decode("ascii"), } for offset, topic, payload in self.stream.items_from(from_offset) ] @@ -105,39 +171,45 @@ def _registered_stream() -> WorkflowStream | None: return stream -def _runtime() -> _Runtime: +def _instance() -> _InstanceStream: # Found on the instance rather than in a process-level map keyed by run # id: the SDK rebuilds an evicted workflow from history as a new object, # and a map would hand that object the stale log with its unregistered # handlers and the records of a task that failed. stream = _registered_stream() - return _Runtime() if stream is None else _Runtime(stream) + return _InstanceStream() if stream is None else _InstanceStream(stream) class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state.""" - def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + def __init__( + self, stream: WorkflowStream, topic: str, start: int, run_id: str + ) -> None: self._stream = stream - self._shipped_topic = shipped_topic - self._cursor = start + self._topic = topic + self._offset = start + self._run_id = run_id self._closed = False - async def next_batch(self) -> list[tuple[Cursor, bytes]]: + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: while True: if self._closed: raise StopAsyncIteration await workflow.wait_condition( - lambda: self._closed or self._stream.next_offset > self._cursor + lambda: self._closed or self._stream.next_offset > self._offset ) if self._closed: raise StopAsyncIteration - batch = [ - (Cursor(str(offset)), payload.data) - for offset, topic, payload in self._stream.items_from(self._cursor) - if topic == self._shipped_topic - ] - self._cursor = self._stream.next_offset + batch: list[tuple[Cursor, WireRecord]] = [] + for offset, topic, payload in self._stream.items_from(self._offset): + if topic != self._topic: + continue + cursor = _cursor(self._run_id, offset) + wire = _unwrap(cursor, payload, workflow.logger.warning) + if wire is not None: + batch.append((cursor, wire)) + self._offset = self._stream.next_offset if batch: return batch @@ -146,20 +218,51 @@ def close(self) -> None: class _WSWriteSink: - def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: - self._handle = stream.topic(shipped_topic) + def __init__(self, stream: WorkflowStream, topic: str) -> None: + self._handle = stream.topic(topic) - async def publish(self, frame: bytes) -> None: + def publish(self, record: WireRecord) -> None: # Appending to workflow state commits with the task, and a poll # Update's result rides the same task completion, so a failed task # leaks nothing: rule 1 through the shipped mechanics. - payload = workflow.payload_converter().to_payloads([frame])[0] - self._handle.publish(payload) + self._handle.publish(_wrap(record)) -def _entry_data(payload: Payload) -> str: - # The documented wire form of PublishEntry.data. - return base64.b64encode(payload.SerializeToString()).decode("ascii") +class _WSWorkflowProvider: + """The workflow half: the shipped stream object of the running instance.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's log is its own" + ) + start = named[1] + 1 + return _WSReadSource(_instance().stream, topic, start, run_id) + + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _WSWriteSink(_instance().stream, topic) + + def on_workflow_start(self) -> None: + # Registered before the first task completes, because an outside + # reader can poll before workflow code has opened anything, and an + # Update with no handler yet is rejected rather than held. + _instance() + + async def on_workflow_finish(self) -> None: + # An Option 0 stream dies with its run, and a parked long-poll Update + # would otherwise hold completion open. Same recipe the shipped + # feature documents before a return or a continue-as-new. + stream = _registered_stream() + if stream is None: + return + stream.detach_pollers() + await workflow.wait_condition(workflow.all_handlers_finished) class WorkflowStreamsProducer: @@ -180,16 +283,14 @@ class WorkflowStreamsProducer: def __init__( self, handle: Any, - converter: Any, - stream: str, + converter: PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on ``handle``.""" + """Bind this producer to ``topic`` on the workflow behind ``handle``.""" self._handle = handle self._converter = converter - self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt @@ -198,8 +299,9 @@ def __init__( self._pending: tuple[list[PublishEntry], int] | None = None @property - def _shipped_topic(self) -> str: - return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -207,152 +309,258 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: + def _publisher_id(self) -> str: return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> None: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the shipped publish Signal. - Always ``None``: this transport learns positions at read time. + Always ``None``: this transport learns positions at read time, so a + caller that wants to follow from now asks + :meth:`WorkflowStreamsHandle.latest`. """ if not values: return None - await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + await self._send([(RecordKind.DATA, value) for value in values]) return None async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - await self._send([(RecordKind.FINISH, b"")]) + """Write ``FINISH`` for this producer on this topic.""" + await self._send([(RecordKind.FINISH, None)]) - def _frames( - self, bodies: list[tuple[RecordKind, bytes]] + def _entries( + self, batch: list[tuple[RecordKind, Any]] ) -> tuple[list[PublishEntry], int]: sequence = self._sequence entries = [] - for kind, body in bodies: - frame = _frame.encode( + for kind, value in batch: + wire = to_wire( + self._converter, topic=self._topic, kind=kind, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, sequence=sequence, - body=body, ) sequence += 1 entries.append( - PublishEntry( - topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) - ) + PublishEntry(topic=self._topic, data=_entry_data(_wrap(wire))) ) return entries, sequence - async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: - entries, next_sequence = self._frames(bodies) + async def _send(self, batch: list[tuple[RecordKind, Any]]) -> None: + entries, next_sequence = self._entries(batch) if self._pending is not None and self._pending[0] != entries: # The caller moved on from a batch whose Signal raised. It goes # first, under the signal sequence it already had, so a copy the # server did accept is dropped and one it never saw lands. The # new batch is then renumbered behind it. await self._signal(*self._pending) - entries, next_sequence = self._frames(bodies) + entries, next_sequence = self._entries(batch) await self._signal(entries, next_sequence) async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: signal_sequence = self._signal_sequence + 1 self._pending = (entries, next_sequence) - await self._handle.signal( - PUBLISH_SIGNAL_NAME, - PublishInput( - items=entries, - publisher_id=self._provider_id, - sequence=signal_sequence, - ), - ) + try: + await self._handle.signal( + PUBLISH_SIGNAL_NAME, + PublishInput( + items=entries, + publisher_id=self._publisher_id, + sequence=signal_sequence, + ), + ) + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._handle.id!r} was not found, so its stream " + "cannot be appended to" + ) from error + raise self._signal_sequence = signal_sequence self._sequence = next_sequence self._pending = None - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - return payload.SerializeToString() - -class WorkflowStreamsConsumer: - """Reads through the shipped long-poll Update, with shared supersession.""" +class WorkflowStreamsHandle: + """One workflow's log from outside, through the shipped poll Update and a tail Query.""" def __init__( self, - stream_client: WorkflowStreamClient, - stream: str, + client: Client, + workflow_id: str, + run_id: str | None, poll_cooldown: timedelta, ) -> None: - """Read what ``stream_client`` reaches, one long poll at a time.""" - self._client = stream_client - self._stream = stream - self._shipped_topic = f"{_IN}{stream}" if stream else None + """Address ``workflow_id``'s log, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id self._poll_cooldown = poll_cooldown + self._converter = client.data_converter.payload_converter - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, waiting for ones not written yet.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - next_offset = int(after.token) + 1 if after.token else 0 - if self._shipped_topic is not None: - shipped = [self._shipped_topic] - elif topic is not None: - shipped = [f"{_OUT}{topic}"] - else: - shipped = None - subscription = self._client.subscribe( - shipped, - from_offset=next_offset, - result_type=RawValue, - poll_cooldown=self._poll_cooldown, + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) + + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning ) - try: - async for item in subscription: - next_offset = item.offset + 1 - for out in self._record( - attempts, - item.offset, - item.topic, - item.data.payload.data, - topic, - type, - ): - yield out - finally: - # Lets go of the parked poll when the caller stops early. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - # The subscription ends when the workflow is closing or closed. What - # landed after the last poll is still in workflow state, so the tail - # comes back by Query rather than being lost with the run. - for offset, shipped_topic, frame in await self._tail(next_offset): - for out in self._record( - attempts, offset, shipped_topic, frame, topic, type + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + handle = self._handle(run_id) + next_offset = offset + # Pinned to one run, with no client for the shipped chain + # following: a log is not carried across continue-as-new, so + # the successor's offsets start over and this loop is what + # moves from one run to the next. + subscription = WorkflowStreamClient(handle).subscribe( + topic, + from_offset=offset, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + try: + async for item in subscription: + next_offset = item.offset + 1 + if item.topic != topic: + continue + for record in self._records( + decoder, run_id, item.offset, item.data.payload + ): + yield record + except RPCError as error: + # The run closed and its poll Update went with it, or the + # workflow does not exist; the describe below tells which. + if error.status != RPCStatusCode.NOT_FOUND: + raise + finally: + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() + status = await self._status(handle) + if status is None: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} run {run_id!r} was not found" + ) + if status == WorkflowExecutionStatus.RUNNING: + # The subscription ended early, on an RPC timeout for + # instance; the run is still open, so pick up where it left. + offset = next_offset + continue + # What landed after the last poll is still in workflow state, so + # the tail comes back by Query rather than being lost with the run. + for offset_, shipped_topic, payload in await self._tail( + handle, next_offset + ): + if shipped_topic != topic: + continue + for record in self._records(decoder, run_id, offset_, payload): + yield record + if ( + self._run_id is not None + or status != WorkflowExecutionStatus.CONTINUED_AS_NEW ): - yield out + return + successor = await self._successor(handle) + if successor is None: + return + run_id, offset = successor, 0 + + def _records( + self, decoder: RecordDecoder, run_id: str, offset: int, payload: Payload + ) -> list[StreamRecord[Any]]: + cursor = _cursor(run_id, offset) + wire = _unwrap(cursor, payload, logger.warning) + if wire is None: + return [] + return decoder.decode(cursor, wire) + + def _handle(self, run_id: str | None) -> WorkflowHandle[Any, Any]: + return self._client.get_workflow_handle(self._workflow_id, run_id=run_id) - async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: + async def _status( + self, handle: WorkflowHandle[Any, Any] + ) -> WorkflowExecutionStatus | None: try: - wire = await self._client.handle.query( - _TAIL_QUERY, from_offset, result_type=list - ) + return (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + return None + raise + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + try: + run_id = (await self._handle(None).describe()).run_id + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert run_id is not None + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + try: + async for event in self._handle(run_id).fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The run's History is gone: the chain's retained part starts here. + return None + + async def _successor(self, handle: WorkflowHandle[Any, Any]) -> str | None: + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + async for event in events: + if event.HasField("workflow_execution_continued_as_new_event_attributes"): + attributes = event.workflow_execution_continued_as_new_event_attributes + return attributes.new_execution_run_id or None + return None + + async def _tail( + self, handle: WorkflowHandle[Any, Any], from_offset: int + ) -> list[tuple[int, str, Payload]]: + try: + wire = await handle.query(_TAIL_QUERY, from_offset, result_type=list) except WorkflowQueryFailedError as error: if "expected but not found" not in str(error): raise @@ -365,150 +573,76 @@ async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: # The History is gone; nothing is left to serve. return [] return [ - (item["offset"], item["topic"], base64.b64decode(item["data"])) + ( + item["offset"], + item["topic"], + Payload.FromString(base64.b64decode(item["data"])), + ) for item in wire ] - def _record( - self, - attempts: AttemptTracker, - offset: int, - shipped_topic: str, - frame: bytes, - topic: str | None, - type: type | None, - ) -> list[StreamRecord[Any]]: - if self._shipped_topic is None and not shipped_topic.startswith(_OUT): - return [] - if self._shipped_topic is not None and shipped_topic != self._shipped_topic: - return [] - cursor = Cursor(str(offset)) + async def latest(self, *, topic: str) -> Cursor: + """The newest position in the log, which orders every topic of this workflow. + + The log is one per run, so the cursor names the run it was read from: + the pinned run, or the latest run of the chain. + """ + _require_topic(topic) + handle = self._handle(self._run_id) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning("skipping stream record at %s: %s", cursor, error) - return [] - if topic is not None and frame_topic != topic: - return [] - out: list[StreamRecord[Any]] = [] - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - out.append(superseded) - out.append( - StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + description = await handle.describe() + head = await WorkflowStreamClient(handle).get_offset() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + run_id = description.run_id + assert run_id is not None + if head > 0: + return _cursor(run_id, head - 1) + # An empty log on the chain's first run is the beginning of the + # stream; on a successor it is a position of its own, because + # BEGINNING would send a chain-following read back to the first run. + if await self._predecessor(run_id) is None: + return BEGINNING + return _cursor(run_id, -1) + + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> WorkflowStreamsProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return WorkflowStreamsProducer( + self._handle(self._run_id), self._converter, topic, producer_id, attempt ) - return out - - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one log per workflow, whatever the topic - head = await self._client.get_offset() - return Cursor(str(head - 1)) if head > 0 else BEGINNING - - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - converter = self._client.payload_converter - if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] - - -class _WorkflowStreamsProvider: - name = "workflow_streams" - - def __init__(self) -> None: - self._poll_cooldown = timedelta(milliseconds=100) - - def configure(self, **options: Any) -> None: - cooldown = options.pop("poll_cooldown", None) - if cooldown is not None: - self._poll_cooldown = cooldown - if options: - raise TypeError( - "the workflow_streams provider takes only poll_cooldown, " - f"got {sorted(options)}" - ) - - def worker_options(self) -> dict[str, Any]: - return {} - def prepare(self) -> None: - """Register the shipped publish signal and poll update handlers. - Done here rather than on the first read, because an outside reader - can poll before workflow code has opened anything, and an update with - no handler yet is rejected rather than held. - """ - _runtime() +class WorkflowStreamsProvider(ProviderPlugin): + """The provider over the shipped Workflow Streams transport.""" - def drain(self) -> None: - """Release parked pollers so the workflow can return. + def __init__( + self, *, poll_cooldown: timedelta = timedelta(milliseconds=100) + ) -> None: + """Create the provider. - An Option 0 stream dies with its workflow, and a parked long-poll - Update would otherwise hold completion open. Call it right before - the workflow returns, the same obligation the shipped feature's - ``detach_pollers`` documents. + Args: + poll_cooldown: How long an outside reader that is caught up waits + between polls. Backlogs drain at full speed regardless. """ - stream = _registered_stream() - if stream is not None: - stream.detach_pollers() - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Ignored: a publish Signal is a workflow event, so the wait below - # wakes on delivery and nothing is held between records. - del idle_timeout - return _WSReadSource( - _runtime().stream, - f"{_IN}{stream}", - int(after.token) + 1 if after.token else 0, - ) - - def open_write(self, topic: str) -> WriteSink: - return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> WorkflowStreamsProducer: - return WorkflowStreamsProducer( - client.get_workflow_handle(workflow_id), - client.data_converter.payload_converter, - stream, - topic, - producer_id, - attempt, - ) + self._poll_cooldown = poll_cooldown - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> WorkflowStreamsConsumer: - return WorkflowStreamsConsumer( - WorkflowStreamClient.create(client, workflow_id), - stream, - self._poll_cooldown, - ) + def workflow_provider(self) -> _WSWorkflowProvider: + """The workflow half, over the running instance's shipped stream object.""" + return _WSWorkflowProvider() + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> WorkflowStreamsHandle: + """A handle on ``workflow_id``'s log; without ``run_id`` it follows the chain.""" + return WorkflowStreamsHandle(client, workflow_id, run_id, self._poll_cooldown) -_provider.register("workflow_streams", _WorkflowStreamsProvider) + async def close(self) -> None: + """Nothing to release: the provider holds no connection of its own.""" From 172f698a0904105f4a9859b5cdc98ee76a40135f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:06:16 -0700 Subject: [PATCH 318/831] Ran the conformance suite over Workflow Streams and covered chain reads. The provider registers in SETUPS with a host workflow that owns the stream, and its own tests cover the tail Query, a read that ends, and a handle that follows continue-as-new run by run. --- CHANGELOG.md | 10 +- tests/streams/test_streams_conformance.py | 49 +++- .../streams/test_workflow_streams_provider.py | 239 +++++++++++------- 3 files changed, 205 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee4f256cd..5a2eca55e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,10 +29,12 @@ to include examples, links to docs, or any other relevant information. the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. -- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the - stream interface over the shipped Workflow Streams transport, so a workflow - reads and publishes through `temporalio.contrib.workflow_streams` without - naming it. +- **Experimental**: `temporalio.streams.providers.workflow_streams.WorkflowStreamsProvider` + serves the stream interface over the shipped Workflow Streams transport as a + worker plugin, so a workflow reads and publishes through + `temporalio.contrib.workflow_streams` without naming it. Records are the + `StreamRecord` proto inside the shipped item payload, and a handle without a + run id follows continue-as-new run by run. ### Changed diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 451fe4391..4f1673a3f 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -24,12 +24,14 @@ import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass +from datetime import timedelta from typing import Any, cast import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -45,6 +47,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider +from tests.helpers import new_worker @dataclass @@ -78,8 +82,49 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: + # No STREAMS_LIVE gate: the store is the workflow's own History, which the + # test environment's server provides. + provider = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase( + "workflow_streams", + provider, + client, + reports_positions=False, + host=host, + ) + for handle in hosts.values(): + await handle.terminate() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { - "memory": _memory_case + "memory": _memory_case, + "workflow_streams": _workflow_streams_case, } _CAPABILITIES = { diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612e99e02..28f2f631d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -2,8 +2,10 @@ Runs the interface loop over the shipped Option 0 transport: an outside producer appends through the publish Signal, the workflow reads and -republishes through its own state, and an outside consumer follows the poll -Update while the run is open and the tail Query once it has closed. +republishes through its own state, and an outside reader follows the poll +Update while the run is open and the tail Query once it has closed. The +outside-surface cases shared by every provider run from +``test_streams_conformance``; this file covers what the transport adds. """ from __future__ import annotations @@ -11,23 +13,31 @@ import asyncio import base64 import uuid +from datetime import timedelta from typing import Any import pytest -from temporalio import streams, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.contrib.workflow_streams import PublishInput from temporalio.converter import DataConverter -from temporalio.streams import RecordKind, _frame -from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from temporalio.streams import RecordKind, Supersession +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers.workflow_streams import ( + WorkflowStreamsProducer, + WorkflowStreamsProvider, +) from tests.helpers import new_worker +INPUTS = "inputs" +DECISIONS = "decisions" -@pytest.fixture(autouse=True) -def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] - streams.configure(provider="workflow_streams") + +@pytest.fixture +def provider() -> WorkflowStreamsProvider: + return WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) @workflow.defn @@ -40,7 +50,6 @@ class EchoLoop: def __init__(self) -> None: self._released = False - streams.prepare() @workflow.signal def release(self) -> None: @@ -48,21 +57,19 @@ def release(self) -> None: @workflow.run async def run(self) -> int: - inputs = streams.reader("inputs", type=dict) - decisions = streams.writer("decisions") + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) seen = 0 async for record in inputs: if record.kind is RecordKind.FINISH: break if record.kind is not RecordKind.DATA: continue - assert isinstance(record.value, dict) + assert record.value is not None seen += 1 - await decisions.publish({"echo": record.value["n"]}) - await decisions.finish() + decisions.publish({"echo": record.value["n"]}) + decisions.finish() await workflow.wait_condition(lambda: self._released) - streams.drain() - await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -79,10 +86,11 @@ async def _collect() -> None: return out -async def _feed(client: Client, workflow_id: str) -> None: - producer = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 - ) +async def _feed( + provider: WorkflowStreamsProvider, client: Client, workflow_id: str +) -> None: + stream = provider.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() @@ -91,92 +99,77 @@ async def _feed(client: Client, workflow_id: str) -> None: ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] -async def test_interface_loop_over_workflow_streams(client: Client): +async def test_interface_loop_over_workflow_streams( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + assert all(r.topic == DECISIONS and r.producer_id == "" for r in records) await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): +async def test_retried_producer_dedupes_and_new_attempt_supersedes( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) + stream = provider.get_stream_handle(client, workflow_id) - first = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - await first.append({"n": 1}) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # Positions are learnt at read time on this transport. + assert await first.append({"n": 1}) is None # The retry of the same attempt re-sends its first batch. - retry = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - assert await retry.append({"n": 1}) is None - second = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=2, - ) + retry = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await retry.append({"n": 1}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"n": 2}) - consumer = await streams.consumer( - client, workflow_id=workflow_id, stream="inputs" - ) - records = await take(consumer.read(type=dict), 3) + records = await take(stream.read(topic=INPUTS, result_type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED - assert isinstance(records[1].value, streams.Supersession) - assert records[1].value.previous_attempt == 1 + assert records[1].supersession == Supersession("model", 1, 2) assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 - # Inbound records carry no topic; the stream's name is the address. - assert all(r.topic == "" for r in records) + assert all(r.topic == INPUTS for r in records) await second.finish() await handle.signal(EchoLoop.release) await handle.result() -async def test_cold_cache_serves_each_record_once(client: Client): +async def test_cold_cache_serves_each_record_once( + client: Client, provider: WorkflowStreamsProvider +): # Every task rebuilds the workflow from history, so the stream object # has to belong to the instance that is running: a stale one would carry # the previous instance's log and hand out every record twice. workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + async with new_worker( + client, EchoLoop, plugins=[provider], max_cached_workflows=0 + ) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - inbound = await streams.consumer( - client, workflow_id=workflow_id, stream="inputs" - ) - arrived = await take(inbound.read(type=dict), 4) + arrived = await take(stream.read(topic=INPUTS, result_type=dict), 4) assert [r.kind for r in arrived] == ECHOED assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] @@ -184,33 +177,106 @@ async def test_cold_cache_serves_each_record_once(client: Client): assert await handle.result() == 3 -async def test_a_closed_run_serves_its_tail_by_query(client: Client): +async def test_a_closed_run_serves_its_tail_by_query_and_the_read_ends( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) await handle.signal(EchoLoop.release) assert await handle.result() == 3 # Nothing polled while the run was open. The poll Update is gone with - # the run, so everything below arrives through the tail Query. - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + # the run, so everything below arrives through the tail Query, and + # the read ends by itself once the tail is delivered. + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + + records = await asyncio.wait_for(read_everything(), 30) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] checkpoint = records[1].cursor - resumed = await streams.consumer(client, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2 + ) assert [r.value["echo"] for r in again[:1]] == [3] assert again[1].kind is RecordKind.FINISH +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[provider]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + first_run = handle.first_execution_run_id + assert first_run is not None + + chain = provider.get_stream_handle(client, workflow_id) + + async def read_everything(stream: Any) -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + # Each run keeps its own log, so following the chain means reading + # the first run to its close and then the successor from its start. + assert await asyncio.wait_for(read_everything(chain), 30) == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + pinned = provider.get_stream_handle(client, workflow_id, run_id=first_run) + assert await asyncio.wait_for(read_everything(pinned), 30) == [ + (RecordKind.DATA, {"run": 0}), + ] + # A cursor from the first run resumes into the successor. + records = await take(chain.read(topic=DECISIONS, result_type=dict), 1) + resumed = await asyncio.wait_for( + asyncio.ensure_future( + _values( + chain.read( + topic=DECISIONS, result_type=dict, after=records[0].cursor + ) + ) + ), + 30, + ) + assert resumed == [{"run": 1}, None] + + +async def _values(records: Any) -> list[Any]: + return [r.value async for r in records] + + class _FlakyHandle: """A workflow handle whose first Signal is accepted and then reported failed.""" + id = "flaky" + def __init__(self) -> None: self.sent: list[PublishInput] = [] self._fail_next = True @@ -225,26 +291,24 @@ async def signal(self, name: str, arg: PublishInput) -> None: ) -def _frames( - publish: PublishInput, -) -> list[tuple[RecordKind, str, str, int, int, bytes]]: +def _wires(publish: PublishInput) -> list[WireRecord]: out = [] for entry in publish.items: - payload = Payload() - payload.ParseFromString(base64.b64decode(entry.data)) - out.append(_frame.decode(payload.data)) + payload = Payload.FromString(base64.b64decode(entry.data)) + out.append(WireRecord.FromString(payload.data)) return out def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: return [ - (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + (publish.sequence, [wire.sequence for wire in _wires(publish)]) + for publish in sent ] def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: return WorkflowStreamsProducer( - handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + handle, DataConverter.default.payload_converter, INPUTS, "model", 1 ) @@ -255,10 +319,11 @@ async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): await producer.append({"n": 1}) await producer.append({"n": 1}) await producer.append({"n": 2}) - # The retry carries the same signal sequence and the same frame sequence - # as the failed send, so the shipped dedupe drops the copy; the batch - # after it continues the numbering. + # The retry carries the same signal sequence and the same record + # sequence as the failed send, so the shipped dedupe drops the copy; the + # batch after it continues the numbering. assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + assert all(publish.publisher_id == "model#1" for publish in handle.sent) async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): @@ -269,4 +334,4 @@ async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): await producer.append({"n": 2}, {"n": 3}) await producer.finish() assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] - assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH + assert _wires(handle.sent[-1])[0].kind == int(RecordKind.FINISH) From 4a0f7f847e8a390160b8ccddcea5f8cf18846557 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:46:46 -0700 Subject: [PATCH 319/831] Detached the stream this instance captured, not the thread's current one. The workflow half now keeps the WorkflowStream it found at start, so the finish hook lets go of this run's pollers rather than of whatever the signal handler lookup answers on the thread at the time. --- .../streams/providers/workflow_streams.py | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6f18dce46..cef1cbe3e 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -229,7 +229,20 @@ def publish(self, record: WireRecord) -> None: class _WSWorkflowProvider: - """The workflow half: the shipped stream object of the running instance.""" + """The workflow half: the shipped stream object of one workflow instance. + + Made per instance by the worker, so the stream object it captures on + first use is this instance's, and the finish hook lets go of that one + rather than of whatever the thread's handler lookup answers at the time. + """ + + def __init__(self) -> None: + self._stream: WorkflowStream | None = None + + def _own_stream(self) -> WorkflowStream: + if self._stream is None: + self._stream = _instance().stream + return self._stream def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: _require_topic(topic) @@ -242,26 +255,25 @@ def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: f"cursor {after.token!r} names another run; a run's log is its own" ) start = named[1] + 1 - return _WSReadSource(_instance().stream, topic, start, run_id) + return _WSReadSource(self._own_stream(), topic, start, run_id) def open_writer(self, topic: str) -> WriteSink: _require_topic(topic) - return _WSWriteSink(_instance().stream, topic) + return _WSWriteSink(self._own_stream(), topic) def on_workflow_start(self) -> None: # Registered before the first task completes, because an outside # reader can poll before workflow code has opened anything, and an # Update with no handler yet is rejected rather than held. - _instance() + self._own_stream() async def on_workflow_finish(self) -> None: # An Option 0 stream dies with its run, and a parked long-poll Update # would otherwise hold completion open. Same recipe the shipped # feature documents before a return or a continue-as-new. - stream = _registered_stream() - if stream is None: + if self._stream is None: return - stream.detach_pollers() + self._stream.detach_pollers() await workflow.wait_condition(workflow.all_handlers_finished) From 33a1968943481dee6c11a574c590ca88481b75b3 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 320/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a2eca55e..ad45c0bbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,10 @@ to include examples, links to docs, or any other relevant information. `temporalio.contrib.workflow_streams` without naming it. Records are the `StreamRecord` proto inside the shipped item payload, and a handle without a run id follows continue-as-new run by run. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 7caf4380749ea4b57c725fef2b40fb8ed250ea88 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 321/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 4743115766236679f2f0d63dc22f04761cb648a7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 322/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From 3949a0c760aea7344f4cd524c0323bfa5654ee9c Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 323/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From 100eab8a842f37c16ac96877fc4f074ff3e5526f Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 324/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad45c0bbd..d9709fa3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From 165e09cae08fa2c7a376a59ad48a232e4e2af6c6 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 325/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From b8bb7a17cfb1f89783c2a9211333b4256f430e90 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:26:33 -0700 Subject: [PATCH 326/831] Added the IDL contract and generation for the stream endpoint. The stream endpoint's shape lived only in hand-written Python, so no other language could be given the contract. This defines it once in a nexusrpc yaml contract and generates the Python bindings from it. The generated _definitions helper is hidden from the API docs and skipped by pydocstyle, the same way the other generated trees are. --- pyproject.toml | 6 +- scripts/gen_streams_nexus_api.py | 80 +++ .../providers/_nexus_generated/__init__.py | 23 + .../_nexus_generated/_definitions.py | 542 ++++++++++++++ .../providers/_nexus_generated/models.py | 670 ++++++++++++++++++ .../providers/_nexus_generated/services.py | 39 + .../providers/temporal_streams.nexusrpc.yaml | 123 ++++ 7 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 scripts/gen_streams_nexus_api.py create mode 100644 temporalio/streams/providers/_nexus_generated/__init__.py create mode 100644 temporalio/streams/providers/_nexus_generated/_definitions.py create mode 100644 temporalio/streams/providers/_nexus_generated/models.py create mode 100644 temporalio/streams/providers/_nexus_generated/services.py create mode 100644 temporalio/streams/providers/temporal_streams.nexusrpc.yaml diff --git a/pyproject.toml b/pyproject.toml index b7077785f..e55c39219 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,9 +125,11 @@ format = [ ] gen-docs = "uv run scripts/gen_docs.py" gen-nexus-system-api = "uv run scripts/gen_nexus_system_api.py" +gen-streams-nexus-api = "uv run scripts/gen_streams_nexus_api.py" gen-protos = [ { cmd = "uv run scripts/gen_protos.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -135,6 +137,7 @@ gen-protos = [ gen-protos-docker = [ { cmd = "uv run scripts/gen_protos_docker.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -207,7 +210,7 @@ ignore_errors = true [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 -match_dir = "^(?!(docs|scripts|tests|api|proto|system|\\.)).*" +match_dir = "^(?!(docs|scripts|tests|api|proto|system|_nexus_generated|\\.)).*" add_ignore = [ # We like to wrap at a certain number of chars, even long summary sentences. # https://github.com/PyCQA/pydocstyle/issues/184 @@ -241,6 +244,7 @@ privacy = [ "HIDDEN:temporalio.worker.workflow_sandbox.importer", "HIDDEN:temporalio.worker.workflow_sandbox.in_sandbox", "HIDDEN:**.*_pb2*", + "HIDDEN:temporalio.streams.providers._nexus_generated._definitions", ] project-name = "Temporal Python" sidebar-expand-depth = 2 diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py new file mode 100644 index 000000000..800aba944 --- /dev/null +++ b/scripts/gen_streams_nexus_api.py @@ -0,0 +1,80 @@ +import os +import shutil +import subprocess +import sys +from pathlib import Path + +base_dir = Path(__file__).parent.parent +providers_dir = base_dir / "temporalio" / "streams" / "providers" +contract_path = providers_dir / "temporal_streams.nexusrpc.yaml" +output_dir = providers_dir / "_nexus_generated" +# Pinned to the version CI installs, because nexgen's output changes between +# releases and check-protos compares against what is committed here. +NEX_GEN_VERSION = "0.2.4" + + +def nex_gen_command() -> list[str]: + if bin_path := os.environ.get("NEX_GEN_BIN"): + return [bin_path] + + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + # Same build as the system API script installs, so one binary + # serves both and neither can overwrite the other's output. + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] + + +def generate_streams_nexus_api() -> None: + if not contract_path.exists(): + raise RuntimeError(f"missing stream contract: {contract_path}") + + command = nex_gen_command() + shutil.rmtree(output_dir, ignore_errors=True) + subprocess.check_call( + [ + *command, + "python", + str(contract_path), + "--output", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + "I", + "--fix", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "format", + str(output_dir), + ] + ) + + +if __name__ == "__main__": + print("Generating stream endpoint Nexus API...", file=sys.stderr) + generate_streams_nexus_api() + print("Done", file=sys.stderr) diff --git a/temporalio/streams/providers/_nexus_generated/__init__.py b/temporalio/streams/providers/_nexus_generated/__init__.py new file mode 100644 index 000000000..c62eaa6dd --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/__init__.py @@ -0,0 +1,23 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from ._definitions import Violation +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, +) +from .services import TemporalStreams + +__all__ = [ + "Violation", + "AppendInput", + "AppendOutput", + "ReadInput", + "ReadOutput", + "RecordWire", + "TemporalStreams", +] diff --git a/temporalio/streams/providers/_nexus_generated/_definitions.py b/temporalio/streams/providers/_nexus_generated/_definitions.py new file mode 100644 index 000000000..dc8de5bb5 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/_definitions.py @@ -0,0 +1,542 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import base64 +import collections.abc +import dataclasses +import datetime +import json +import re +import typing + +import temporalio.converter +import temporalio.exceptions + +__all__ = [ + "Violation", + "_binary64", + "_check_contains", + "_check_date_time", + "_check_duration", + "_check_time", + "_check_unique_items", + "_collect", + "_json_values_equal", + "_format_base64", + "_format_base64url", + "_format_date", + "_format_date_time", + "_format_duration", + "_format_time", + "_parse_base64", + "_parse_base64url", + "_parse_date", + "_parse_date_time", + "_parse_duration", + "_parse_spec_integer", + "_parse_time", + "_quote", + "_transfer_type_convertible", +] + + +@dataclasses.dataclass(frozen=True, slots=True) +class Violation: + """A single constraint failure, located by JSON path.""" + + path: str + reason: str + + +def _quote(value: object) -> str: + """Renders a value in the JSON form every target quotes offending values in.""" + + try: + return json.dumps(value, ensure_ascii=False) + except (TypeError, ValueError): + return repr(value) + + +def _collect( + violations: list[Violation], + path: str, + error: temporalio.exceptions.ApplicationError, +) -> None: + """Re-paths a nested model's violations under `path` and appends them.""" + + if error.type != "PayloadValidationError" or not error.details: + raise error + # Generated failures retain the original list as their first detail. The + # cast is type-checker-only and performs no serialization. + nested_violations = typing.cast(list[Violation], error.details[0]) + for inner in nested_violations: + # A nested violation about the value *itself* carries no path of its own + # (a union branch's own constraint, an element-level check), so the + # prefix is the whole path -- never a dangling separator (P11). + nested = f"{path}.{inner.path}" if inner.path else path + violations.append(Violation(path=nested, reason=inner.reason)) + + +_ModelT = typing.TypeVar("_ModelT") + + +def _transfer_type_convertible( + converter: type[temporalio.converter.TransferTypeConverter[typing.Any, typing.Any]], +) -> collections.abc.Callable[[type[_ModelT]], type[_ModelT]]: + """Registers a transfer type converter on a model class. + + Wraps `temporalio.converter.transfer_type_convertible` to erase the + converter's value-type parameter. Binding it directly on the decorated class + is circular for a static type checker -- the class's type depends on the + decorator, whose value type depends on the class -- which degrades the model + to `Unknown`. Erasing it here keeps the decorator idiomatic at each model and + resolves the cycle. + """ + + return temporalio.converter.transfer_type_convertible(converter) + + +_INTEGER_CAP = (1 << 53) - 1 + + +def _parse_spec_integer( + value: object, path: str, violations: list[Violation] +) -> int | None: + """Parses a JSON number as a spec integer (`1.0` accepted, `1.5` rejected).""" + + # `bool` is a subclass of `int`, so it must be excluded before the int check. + if isinstance(value, bool) or not isinstance(value, (int, float)): + violations.append(Violation(path=path, reason="expected integer")) + return None + if isinstance(value, float): + if not value.is_integer(): + violations.append(Violation(path=path, reason="expected integer")) + return None + out = int(value) + else: + out = value + if abs(out) > _INTEGER_CAP: + violations.append(Violation(path=path, reason="expected integer")) + return None + return out + + +def _binary64(value: float) -> float: + """Narrows a `number` value to the binary64 domain shared by every target.""" + + try: + return float(value) + except OverflowError: + # Past the binary64 range there is nothing to narrow to. The caller's + # finiteness check has already recorded that violation and will raise, so + # hand the value back rather than throwing out of turn and losing the + # other violations collected alongside it. + return value + + +def _json_values_equal(left: typing.Any, right: typing.Any) -> bool: + """Compares JSON values without Python's bool-as-int equality leak.""" + + left_is_number = isinstance(left, (int, float)) and not isinstance(left, bool) + right_is_number = isinstance(right, (int, float)) and not isinstance(right, bool) + if left_is_number or right_is_number: + return left_is_number and right_is_number and left == right + if type(left) is not type(right): + return False + if isinstance(left, list): + left_list = typing.cast("list[typing.Any]", left) + right_list = typing.cast("list[typing.Any]", right) + return len(left_list) == len(right_list) and all( + _json_values_equal(a, b) for a, b in zip(left_list, right_list) + ) + if isinstance(left, dict): + left_dict = typing.cast("dict[typing.Any, typing.Any]", left) + right_dict = typing.cast("dict[typing.Any, typing.Any]", right) + return left_dict.keys() == right_dict.keys() and all( + _json_values_equal(left_dict[key], right_dict[key]) for key in left_dict + ) + return left == right + + +def _check_unique_items( + value: list[typing.Any], path: str, violations: list[Violation] +) -> None: + """Asserts an array's elements are pairwise distinct.""" + + seen: list[typing.Any] = [] + for index, element in enumerate(value): + for earlier, previous in enumerate(seen): + if _json_values_equal(previous, element): + violations.append( + Violation( + path=path, + reason=( + f"duplicate items: element at index {index} " + f"equals index {earlier}" + ), + ) + ) + break + seen.append(element) + + +def _check_contains( + value: list[typing.Any], + matches: typing.Callable[[typing.Any], bool], + min_contains: int, + max_contains: int | None, + bounded_min: bool, + path: str, + violations: list[Violation], +) -> None: + """Asserts how many of an array's elements match the `contains` schema.""" + + match_count = sum(1 for element in value if matches(element)) + if match_count < min_contains: + if bounded_min: + violations.append( + Violation( + path=path, + reason=( + f"too few matching items: at least {min_contains}, " + f"got {match_count}" + ), + ) + ) + else: + violations.append( + Violation(path=path, reason="no element matches the required schema") + ) + if max_contains is not None and match_count > max_contains: + violations.append( + Violation( + path=path, + reason=( + f"too many matching items: at most {max_contains}, " + f"got {match_count}" + ), + ) + ) + + +_TEMPORAL_DATE_TIME_RE = re.compile( + r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])\Z" +) +_TEMPORAL_DATE_RE = re.compile(r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\Z") +_TEMPORAL_TIME_RE = re.compile( + r"^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])?\Z" +) +_TEMPORAL_DURATION_RE = re.compile( + r"^PT(?:[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?|[0-9]+M(?:[0-9]+S)?|[0-9]+S)\Z" +) +_TEMPORAL_MAX_DURATION_SECONDS = ((1 << 63) - 1) // 1_000_000_000 +# A duration component with more digits than the cap itself is over the cap +# whatever those digits are, which is how the magnitude is bounded before `int()` +# sees it: CPython refuses to convert a string of more than 4300 digits. +_TEMPORAL_MAX_DURATION_DIGITS = len(str(_TEMPORAL_MAX_DURATION_SECONDS)) +# `datetime` resolves to microseconds, and `fromisoformat` before Python 3.11 +# parses only the fraction widths `isoformat` writes. +_TEMPORAL_FRACTION_DIGITS = 6 + + +def _days_in_month(year: int, month: int) -> int: + if month in (1, 3, 5, 7, 8, 10, 12): + return 31 + if month in (4, 6, 9, 11): + return 30 + if month == 2: + return 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28 + return 0 + + +def _valid_temporal_calendar(value: str) -> bool: + if len(value) < 10: + return False + try: + year, month, day = int(value[0:4]), int(value[5:7]), int(value[8:10]) + except ValueError: + return False + # `datetime.MINYEAR` is 1, which is also the shared cross-language floor. + # Year 0000 is rejected rather than shifted into range, and + # `_temporal_reason` says so. + if year < datetime.MINYEAR: + return False + maximum = _days_in_month(year, month) + return maximum > 0 and 1 <= day <= maximum + + +def _temporal_reason(name: str, value: str) -> str: + """The reason a rejected temporal string is reported under. + + Year 0000 earns its own clause so the caller sees the shared calendar floor + rather than only a generic malformed-timestamp reason. + """ + + if value[0:4] == "0000": + return ( + f"must be a valid {name}, got {_quote(value)}: year 0000 is not" + f" representable (datetime.MINYEAR is {datetime.MINYEAR})" + ) + return f"must be a valid {name}, got {_quote(value)}" + + +def _temporal_isoformat(value: str) -> str: + """Rewrites a wire temporal into the spelling `fromisoformat` accepts. + + `Z` becomes `+00:00`, and the fractional second is padded or truncated to + exactly `_TEMPORAL_FRACTION_DIGITS`: before Python 3.11 `fromisoformat` + parses only what `isoformat` writes, so an RFC 3339 `.1` or `.1234567` -- + which every other target accepts -- would otherwise raise. Digits past the + sixth are dropped, the loss at `datetime`'s own resolution that P1 allows; + the canonical output re-trims the padding, so `.1` still writes as `.1`. + """ + + normalized = value.upper() + if normalized.endswith("Z"): + normalized = normalized[:-1] + "+00:00" + dot = normalized.find(".") + if dot < 0: + return normalized + end = dot + 1 + while end < len(normalized) and normalized[end].isdigit(): + end += 1 + fraction = normalized[dot + 1 : end].ljust(_TEMPORAL_FRACTION_DIGITS, "0") + return ( + normalized[: dot + 1] + fraction[:_TEMPORAL_FRACTION_DIGITS] + normalized[end:] + ) + + +def _parse_date_time( + value: str, path: str, violations: list[Violation] +) -> datetime.datetime | None: + if _TEMPORAL_DATE_TIME_RE.match(value) is None or not _valid_temporal_calendar( + value + ): + violations.append( + Violation(path=path, reason=_temporal_reason("date-time", value)) + ) + return None + return datetime.datetime.fromisoformat(_temporal_isoformat(value)) + + +def _parse_date( + value: str, path: str, violations: list[Violation] +) -> datetime.date | None: + if _TEMPORAL_DATE_RE.match(value) is None or not _valid_temporal_calendar(value): + violations.append(Violation(path=path, reason=_temporal_reason("date", value))) + return None + return datetime.date.fromisoformat(value) + + +def _parse_time( + value: str, path: str, violations: list[Violation] +) -> datetime.time | None: + if _TEMPORAL_TIME_RE.match(value) is None: + violations.append(Violation(path=path, reason=_temporal_reason("time", value))) + return None + return datetime.time.fromisoformat(_temporal_isoformat(value)) + + +def _parse_duration( + value: str, path: str, violations: list[Violation] +) -> datetime.timedelta | None: + if _TEMPORAL_DURATION_RE.match(value) is None: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + total = 0 + number = "" + for char in value[2:]: + if char.isdigit(): + number += char + continue + digits = number.lstrip("0") + number = "" + if len(digits) > _TEMPORAL_MAX_DURATION_DIGITS: + # Over the cap by digit count alone (see the constant), so the + # conversion `int()` would refuse is never attempted. + total = _TEMPORAL_MAX_DURATION_SECONDS + 1 + break + total += int(digits or "0") * {"H": 3600, "M": 60, "S": 1}[char] + if total > _TEMPORAL_MAX_DURATION_SECONDS: + break + if total > _TEMPORAL_MAX_DURATION_SECONDS: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + return datetime.timedelta(seconds=total) + + +def _check_temporal_offset( + name: str, + value: datetime.datetime | datetime.time, + offset: datetime.timedelta, + path: str, + violations: list[Violation], +) -> None: + """Asserts a UTC offset is a whole number of minutes, the finest the wire + form spells (`tzinfo` allows seconds, which the offset would silently lose). + """ + + if offset % datetime.timedelta(minutes=1): + violations.append( + Violation( + path=path, + reason=( + f"must be a valid {name}, got {_quote(str(value))}: " + f"the UTC offset {offset} is not a whole number of minutes" + ), + ) + ) + + +def _check_date_time( + value: datetime.datetime, path: str, violations: list[Violation] +) -> None: + """Asserts a datetime is writable as a wire date-time (P12). + + A dataclass is constructed unchecked, so a naive datetime -- with no offset + the required wire form could carry -- reaches serialize; without this it + would emit a value this module's own parser rejects. + """ + + offset = value.utcoffset() + if offset is None: + violations.append( + Violation( + path=path, + reason=( + f"must be a valid date-time, got {_quote(str(value))}: " + "a naive datetime carries no UTC offset" + ), + ) + ) + return + _check_temporal_offset("date-time", value, offset, path, violations) + + +def _check_time(value: datetime.time, path: str, violations: list[Violation]) -> None: + """Asserts a time is writable as a wire time (P12). The offset is optional in + the grammar, so only its precision is held to anything.""" + + offset = value.utcoffset() + if offset is not None: + _check_temporal_offset("time", value, offset, path, violations) + + +def _check_duration( + value: datetime.timedelta, path: str, violations: list[Violation] +) -> None: + """Asserts a timedelta is writable as a wire duration (P12): the grammar is + unsigned, whole-second and capped, and a `timedelta` is none of those.""" + + if value < datetime.timedelta(0): + reason = "a duration cannot be negative" + elif value % datetime.timedelta(seconds=1): + reason = "a duration cannot carry a fraction of a second" + elif value.total_seconds() > _TEMPORAL_MAX_DURATION_SECONDS: + reason = f"a duration cannot exceed {_TEMPORAL_MAX_DURATION_SECONDS} seconds" + else: + return + violations.append( + Violation( + path=path, + reason=f"must be a valid duration, got {_quote(str(value))}: {reason}", + ) + ) + + +def _temporal_frac(microsecond: int) -> str: + if microsecond == 0: + return "" + return "." + f"{microsecond:06d}".rstrip("0") + + +def _temporal_offset(value: datetime.datetime | datetime.time) -> str: + offset = value.utcoffset() + if offset is None: + return "" + total = int(offset.total_seconds()) + if total == 0: + return "Z" + sign = "+" if total > 0 else "-" + total = abs(total) + return f"{sign}{total // 3600:02d}:{(total % 3600) // 60:02d}" + + +def _format_date_time(value: datetime.datetime) -> str: + return ( + f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + f"T{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_date(value: datetime.date) -> str: + return f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + + +def _format_time(value: datetime.time) -> str: + return ( + f"{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_duration(value: datetime.timedelta) -> str: + total = int(value.total_seconds()) + if total == 0: + return "PT0S" + hours, remainder = divmod(total, 3600) + minutes, seconds = divmod(remainder, 60) + out = "PT" + if hours: + out += f"{hours}H" + if minutes: + out += f"{minutes}M" + if seconds: + out += f"{seconds}S" + return out + + +_BASE64_RE = re.compile( + "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?\\Z", + re.ASCII, +) +_BASE64URL_RE = re.compile( + "^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048])?\\Z", + re.ASCII, +) + + +def _parse_base64(value: str, path: str, violations: list[Violation]) -> bytes | None: + if _BASE64_RE.match(value) is None: + violations.append( + Violation(path=path, reason=f"must be base64-encoded, got {_quote(value)}") + ) + return None + return base64.b64decode(value, validate=True) + + +def _format_base64(value: bytes) -> str: + return base64.b64encode(value).decode("ascii") + + +def _parse_base64url( + value: str, path: str, violations: list[Violation] +) -> bytes | None: + if _BASE64URL_RE.match(value) is None: + violations.append( + Violation( + path=path, reason=f"must be base64url-encoded, got {_quote(value)}" + ) + ) + return None + return base64.urlsafe_b64decode(value + "=" * (-len(value) % 4)) + + +def _format_base64url(value: bytes) -> str: + return base64.urlsafe_b64encode(value).rstrip(b"=").decode("ascii") diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py new file mode 100644 index 000000000..f22711a4f --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -0,0 +1,670 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import dataclasses +import typing + +import typing_extensions + +import temporalio.converter +import temporalio.exceptions + +from ._definitions import ( + Violation, + _collect, + _parse_spec_integer, + _transfer_type_convertible, +) + + +class _AppendInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendInput"] + ) -> "AppendInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) + else: + stream_value_raw = raw["stream"] + if not isinstance(stream_value_raw, str): + violations.append(Violation(path="stream", reason="expected string")) + else: + stream_value = stream_value_raw + + producer_id_value: str = typing.cast("typing.Any", None) + if "producer_id" not in raw or raw["producer_id"] is None: + violations.append(Violation(path="producer_id", reason="required")) + else: + producer_id_value_raw = raw["producer_id"] + if not isinstance(producer_id_value_raw, str): + violations.append( + Violation(path="producer_id", reason="expected string") + ) + else: + producer_id_value = producer_id_value_raw + + attempt_value: int = typing.cast("typing.Any", None) + if "attempt" not in raw or raw["attempt"] is None: + violations.append(Violation(path="attempt", reason="required")) + else: + attempt_value_raw = raw["attempt"] + attempt_value_parsed = _parse_spec_integer( + attempt_value_raw, "attempt", violations + ) + if attempt_value_parsed is not None: + attempt_value = attempt_value_parsed + + batch_index_value: int = typing.cast("typing.Any", None) + if "batch_index" not in raw or raw["batch_index"] is None: + violations.append(Violation(path="batch_index", reason="required")) + else: + batch_index_value_raw = raw["batch_index"] + batch_index_value_parsed = _parse_spec_integer( + batch_index_value_raw, "batch_index", violations + ) + if batch_index_value_parsed is not None: + batch_index_value = batch_index_value_parsed + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + payloads_value: list[str] | None = None + if "payloads" in raw: + payloads_value_raw = raw["payloads"] + if payloads_value_raw is None: + violations.append( + Violation(path="payloads", reason="explicit null not allowed") + ) + else: + if not isinstance(payloads_value_raw, list): + violations.append( + Violation(path="payloads", reason="expected array") + ) + else: + payloads_value_list: list[str] = [] + for payloads_value_index, payloads_value_element in enumerate( + typing.cast("list[typing.Any]", payloads_value_raw) + ): + payloads_value_item_path = f"payloads[{payloads_value_index}]" + payloads_value_item_violation_count = len(violations) + payloads_value_item: str = typing.cast("typing.Any", None) + if not isinstance(payloads_value_element, str): + violations.append( + Violation( + path=payloads_value_item_path, + reason="expected string", + ) + ) + else: + payloads_value_item = payloads_value_element + if len(violations) == payloads_value_item_violation_count: + payloads_value_list.append(payloads_value_item) + payloads_value = payloads_value_list + + finish_value: bool | None = None + if "finish" in raw: + finish_value_raw = raw["finish"] + if finish_value_raw is None: + violations.append( + Violation(path="finish", reason="explicit null not allowed") + ) + else: + if not isinstance(finish_value_raw, bool): + violations.append( + Violation(path="finish", reason="expected boolean") + ) + else: + finish_value = finish_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "producer_id" + and key != "attempt" + and key != "batch_index" + and key != "topic" + and key != "payloads" + and key != "finish" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendInput( + workflow_id=workflow_id_value, + stream=stream_value, + producer_id=producer_id_value, + attempt=attempt_value, + batch_index=batch_index_value, + topic=topic_value, + payloads=payloads_value, + finish=finish_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + out["stream"] = value.stream + out["producer_id"] = value.producer_id + if abs(value.attempt) > 9007199254740991: + violations.append( + Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") + ) + out["attempt"] = value.attempt + if abs(value.batch_index) > 9007199254740991: + violations.append( + Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") + ) + out["batch_index"] = value.batch_index + if value.topic is not None: + out["topic"] = value.topic + if value.payloads is not None: + out["payloads"] = value.payloads + if value.finish is not None: + out["finish"] = value.finish + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_AppendInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendInput: + """One append call: who is writing, where, and what.""" + + workflow_id: str + """The workflow whose stream is being written.""" + + stream: str + """The named stream to append to. Empty when the producer writes to a topic instead.""" + + producer_id: str + """Identifies the writer across its retries, so its attempts can be ordered.""" + + attempt: int + """The generation this producer is writing. A later attempt supersedes an earlier one.""" + + batch_index: int + """Counts this producer's batches from 1. The handler drops an index it has already + written for this producer attempt. + """ + + topic: str | None = None + """The topic to append to, when stream is empty.""" + + payloads: list[str] | None = None + """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a + call that only finishes. + """ + + finish: bool | None = None + """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + + +class _AppendOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendOutput"] + ) -> "AppendOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + cursor_value: str | None = None + if "cursor" in raw: + cursor_value_raw = raw["cursor"] + if cursor_value_raw is None: + violations.append( + Violation(path="cursor", reason="explicit null not allowed") + ) + else: + if not isinstance(cursor_value_raw, str): + violations.append( + Violation(path="cursor", reason="expected string") + ) + else: + cursor_value = cursor_value_raw + + for key in raw: + if key != "cursor": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendOutput( + cursor=cursor_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + out: dict[str, typing.Any] = {} + if value.cursor is not None: + out["cursor"] = value.cursor + return out + + +@_transfer_type_convertible(_AppendOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + + cursor: str | None = None + """Opaque token naming the last record written by this call. Empty when the call + carried no payloads. + """ + + +class _ReadInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadInput"] + ) -> "ReadInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str | None = None + if "stream" in raw: + stream_value_raw = raw["stream"] + if stream_value_raw is None: + violations.append( + Violation(path="stream", reason="explicit null not allowed") + ) + else: + if not isinstance(stream_value_raw, str): + violations.append( + Violation(path="stream", reason="expected string") + ) + else: + stream_value = stream_value_raw + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + after_token_value: str | None = None + if "after_token" in raw: + after_token_value_raw = raw["after_token"] + if after_token_value_raw is None: + violations.append( + Violation(path="after_token", reason="explicit null not allowed") + ) + else: + if not isinstance(after_token_value_raw, str): + violations.append( + Violation(path="after_token", reason="expected string") + ) + else: + after_token_value = after_token_value_raw + + max_records_value: int | None = None + if "max_records" in raw: + max_records_value_raw = raw["max_records"] + if max_records_value_raw is None: + violations.append( + Violation(path="max_records", reason="explicit null not allowed") + ) + else: + max_records_value_parsed = _parse_spec_integer( + max_records_value_raw, "max_records", violations + ) + if max_records_value_parsed is not None: + max_records_value = max_records_value_parsed + + wait_ms_value: int | None = None + if "wait_ms" in raw: + wait_ms_value_raw = raw["wait_ms"] + if wait_ms_value_raw is None: + violations.append( + Violation(path="wait_ms", reason="explicit null not allowed") + ) + else: + wait_ms_value_parsed = _parse_spec_integer( + wait_ms_value_raw, "wait_ms", violations + ) + if wait_ms_value_parsed is not None: + wait_ms_value = wait_ms_value_parsed + + latest_only_value: bool | None = None + if "latest_only" in raw: + latest_only_value_raw = raw["latest_only"] + if latest_only_value_raw is None: + violations.append( + Violation(path="latest_only", reason="explicit null not allowed") + ) + else: + if not isinstance(latest_only_value_raw, bool): + violations.append( + Violation(path="latest_only", reason="expected boolean") + ) + else: + latest_only_value = latest_only_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "topic" + and key != "after_token" + and key != "max_records" + and key != "wait_ms" + and key != "latest_only" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadInput( + workflow_id=workflow_id_value, + stream=stream_value, + topic=topic_value, + after_token=after_token_value, + max_records=max_records_value, + wait_ms=wait_ms_value, + latest_only=latest_only_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + if value.stream is not None: + out["stream"] = value.stream + if value.topic is not None: + out["topic"] = value.topic + if value.after_token is not None: + out["after_token"] = value.after_token + if value.max_records is not None: + if abs(value.max_records) > 9007199254740991: + violations.append( + Violation( + path="max_records", reason="exceeds ±(2^53-1) integer cap" + ) + ) + out["max_records"] = value.max_records + if value.wait_ms is not None: + if abs(value.wait_ms) > 9007199254740991: + violations.append( + Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") + ) + out["wait_ms"] = value.wait_ms + if value.latest_only is not None: + out["latest_only"] = value.latest_only + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadInput: + """One read call: where to resume from and how long to wait.""" + + workflow_id: str + """The workflow whose stream is being read.""" + + stream: str | None = None + """The named stream to read. Empty reads every stream the workflow publishes.""" + + topic: str | None = None + """Yield only records on this topic. Empty yields every topic.""" + + after_token: str | None = None + """Opaque cursor from an earlier record or append. The read resumes strictly after the + record it names, so a caller never sees that record twice. Empty starts at the + beginning. The token is produced by whichever store sits behind the endpoint, so a + caller cannot tell which one that is. + """ + + max_records: int | None = None + """Return at most this many records. Defaults to 100 when omitted.""" + + wait_ms: int | None = None + """Wait at most this long for records to arrive before answering. Defaults to 5000 when + omitted. A call that collects nothing answers with no records and the caller's own + token. + """ + + latest_only: bool | None = None + """Answer with the newest position and no records, for a reader that wants to follow + from now. + """ + + +class _ReadOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadOutput"] + ) -> "ReadOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + records_value: list[RecordWire] | None = None + if "records" in raw: + records_value_raw = raw["records"] + if records_value_raw is None: + violations.append( + Violation(path="records", reason="explicit null not allowed") + ) + else: + if not isinstance(records_value_raw, list): + violations.append( + Violation(path="records", reason="expected array") + ) + else: + records_value_list: list[RecordWire] = [] + for records_value_index, records_value_element in enumerate( + typing.cast("list[typing.Any]", records_value_raw) + ): + records_value_item_path = f"records[{records_value_index}]" + records_value_item_violation_count = len(violations) + records_value_item: RecordWire = typing.cast("typing.Any", None) + try: + records_value_item = ( + _RecordWireTransferTypeConverter().from_transfer_type( + records_value_element, RecordWire + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, records_value_item_path, error) + if len(violations) == records_value_item_violation_count: + records_value_list.append(records_value_item) + records_value = records_value_list + + next_token_value: str | None = None + if "next_token" in raw: + next_token_value_raw = raw["next_token"] + if next_token_value_raw is None: + violations.append( + Violation(path="next_token", reason="explicit null not allowed") + ) + else: + if not isinstance(next_token_value_raw, str): + violations.append( + Violation(path="next_token", reason="expected string") + ) + else: + next_token_value = next_token_value_raw + + for key in raw: + if key != "records" and key != "next_token": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadOutput( + records=records_value, + next_token=next_token_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadOutput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + if value.records is not None: + records_out: list[typing.Any] = [] + for records_index, records_element in enumerate(value.records): + try: + records_out.append( + _RecordWireTransferTypeConverter().to_transfer_type( + records_element + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, f"records[{records_index}]", error) + out["records"] = records_out + if value.next_token is not None: + out["next_token"] = value.next_token + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadOutput: + """What one read call answered, and where to resume.""" + + records: list[RecordWire] | None = None + """The records after the caller's token, in stream order.""" + + next_token: str | None = None + """Opaque cursor to pass as after_token on the following call. Echoes the caller's own + token when the call collected nothing. + """ + + +class _RecordWireTransferTypeConverter( + temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["RecordWire"] + ) -> "RecordWire": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + token_value: str = typing.cast("typing.Any", None) + if "token" not in raw or raw["token"] is None: + violations.append(Violation(path="token", reason="required")) + else: + token_value_raw = raw["token"] + if not isinstance(token_value_raw, str): + violations.append(Violation(path="token", reason="expected string")) + else: + token_value = token_value_raw + + frame_value: str = typing.cast("typing.Any", None) + if "frame" not in raw or raw["frame"] is None: + violations.append(Violation(path="frame", reason="required")) + else: + frame_value_raw = raw["frame"] + if not isinstance(frame_value_raw, str): + violations.append(Violation(path="frame", reason="expected string")) + else: + frame_value = frame_value_raw + + for key in raw: + if key != "token" and key != "frame": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return RecordWire( + token=token_value, + frame=frame_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "RecordWire") -> typing.Any: + out: dict[str, typing.Any] = {} + out["token"] = value.token + out["frame"] = value.frame + return out + + +@_transfer_type_convertible(_RecordWireTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + + token: str + """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" + + frame: str + """The base64-encoded record frame, carrying the topic, kind, producer, attempt, + sequence and body. + """ diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py new file mode 100644 index 000000000..ce5604d81 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -0,0 +1,39 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from nexusrpc import Operation, service + +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, +) + + +@service +class TemporalStreams: + """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the + store behind it, so an operator switches storage without touching callers. Reads + hand out batches and an append carries one batch per call, because a Nexus operation + per record costs too much for token streams. + """ + + append: Operation[ + AppendInput, + AppendOutput, + ] = Operation(name="append") + """Append one batch on the caller's account. A repeated batch_index for the same + producer attempt is dropped, so a retried call writes once. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. + """ + + read: Operation[ + ReadInput, + ReadOutput, + ] = Operation(name="read") + """Answer with the records after the caller's token, or time out. The call parks until + it has max_records records or wait_ms elapses, whichever comes first, and returns + whatever it collected. + """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml new file mode 100644 index 000000000..ffa849509 --- /dev/null +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -0,0 +1,123 @@ +nexusrpc: "1.0.0" + +services: + TemporalStreams: + fqn: TemporalStreams + description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + operations: + append: + fqn: append + description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + input: { $ref: "#/$defs/AppendInput" } + output: { $ref: "#/$defs/AppendOutput" } + read: + fqn: read + description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + input: { $ref: "#/$defs/ReadInput" } + output: { $ref: "#/$defs/ReadOutput" } + +$defs: + AppendInput: + type: object + description: "One append call: who is writing, where, and what." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being written." + stream: + type: string + description: "The named stream to append to. Empty when the producer writes to a topic instead." + producer_id: + type: string + description: "Identifies the writer across its retries, so its attempts can be ordered." + attempt: + type: integer + description: "The generation this producer is writing. A later attempt supersedes an earlier one." + batch_index: + type: integer + description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + topic: + type: string + description: "The topic to append to, when stream is empty." + payloads: + type: array + items: + type: string + description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + finish: + type: boolean + description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + required: + - workflow_id + - stream + - producer_id + - attempt + - batch_index + additionalProperties: false + + AppendOutput: + type: object + description: "Where the append landed, empty when it wrote nothing." + properties: + cursor: + type: string + description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." + additionalProperties: false + + ReadInput: + type: object + description: "One read call: where to resume from and how long to wait." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being read." + stream: + type: string + description: "The named stream to read. Empty reads every stream the workflow publishes." + topic: + type: string + description: "Yield only records on this topic. Empty yields every topic." + after_token: + type: string + description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + max_records: + type: integer + description: "Return at most this many records. Defaults to 100 when omitted." + wait_ms: + type: integer + description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + latest_only: + type: boolean + description: "Answer with the newest position and no records, for a reader that wants to follow from now." + required: + - workflow_id + additionalProperties: false + + RecordWire: + type: object + description: "One record on the wire: its cursor and its base64 frame." + properties: + token: + type: string + description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + frame: + type: string + description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + required: + - token + - frame + additionalProperties: false + + ReadOutput: + type: object + description: "What one read call answered, and where to resume." + properties: + records: + type: array + items: + $ref: "#/$defs/RecordWire" + description: "The records after the caller's token, in stream order." + next_token: + type: string + description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." + additionalProperties: false From 643c400f7f3d8a94f048bed5a6520fe34aec6ff9 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:30:01 -0700 Subject: [PATCH 327/831] Moved the nexus provider onto the generated contract. The five wire dataclasses and the service class now come from the generated module, so the contract has one source. Both halves read the operation and service names off the generated definition instead of hard-coding paths. Field names and operation names on the wire are unchanged. The one wire difference is that a read no longer sends max_records, wait_ms and latest_only when the caller leaves them at their defaults, because the contract marks them optional and the handler applies the documented defaults. Nothing outside this module and its tests speaks this wire. --- temporalio/streams/providers/nexus.py | 205 ++++++++++++-------------- 1 file changed, 93 insertions(+), 112 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 3701a70cb..8e19c2d4d 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -8,6 +8,12 @@ store behind the endpoint is invisible to callers and an operator switches it without touching them. +The wire types and the service definition come from +``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be +handed the same contract. What stays hand-written here is what the +generator cannot express yet: the handler's dedupe and long-poll collect +loop, and the caller's batching, cursor handling and codec. + Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Supersession records are not transported: the caller's reader re-synthesizes them from @@ -25,13 +31,11 @@ import asyncio import base64 -import dataclasses -import json import urllib.error import urllib.request from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta -from typing import Any +from typing import Any, TypeVar import nexusrpc import nexusrpc.handler @@ -42,71 +46,40 @@ from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams.providers._nexus_generated import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, + TemporalStreams, +) _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so configure one of those on the worker" ) +# The contract leaves these unset, so the handler is the one place that says +# what an omitted read bound means. +_DEFAULT_MAX_RECORDS = 100 +_DEFAULT_WAIT_MS = 5000 -@dataclasses.dataclass -class AppendInput: - """One append call: who is writing, where, and what.""" - - workflow_id: str - stream: str - producer_id: str - attempt: int - batch_index: int - topic: str = "" - payloads: list[str] = dataclasses.field(default_factory=list) - finish: bool = False - - -@dataclasses.dataclass -class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" - - cursor: str = "" - - -@dataclasses.dataclass -class ReadInput: - """One read call: where to resume from and how long to wait.""" - - workflow_id: str - stream: str = "" - topic: str = "" - after_token: str = "" - max_records: int = 100 - wait_ms: int = 5000 - # Answer with the newest position and no records, for a reader that - # wants to follow from now. - latest_only: bool = False - - -@dataclasses.dataclass -class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" - - token: str - frame: str - - -@dataclasses.dataclass -class ReadOutput: - """What one read call answered, and where to resume.""" - - records: list[RecordWire] = dataclasses.field(default_factory=list) - next_token: str = "" - - -@nexusrpc.service -class TemporalStreams: - """The stream endpoint's two operations.""" +_definition = nexusrpc.get_service_definition(TemporalStreams) +if _definition is None: # pragma: no cover + raise RuntimeError("the generated stream service carries no nexus definition") +# Both halves read the wire names off the generated definition, so a rename in +# the contract cannot leave the caller posting to a path the handler no longer +# serves. +_SERVICE_NAME = _definition.name +_OPERATION_NAMES = { + operation.method_name: operation.name + for operation in _definition.operation_definitions.values() +} +_APPEND_OPERATION = _OPERATION_NAMES["append"] +_READ_OPERATION = _OPERATION_NAMES["read"] - append: nexusrpc.Operation[AppendInput, AppendOutput] - read: nexusrpc.Operation[ReadInput, ReadOutput] +_OutputT = TypeVar("_OutputT") @nexusrpc.handler.service_handler(service=TemporalStreams) @@ -129,9 +102,10 @@ async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: """Append on the caller's account, dropping a repeated batch.""" + topic = input.topic or "" key = ( input.workflow_id, - input.stream or f"@{input.topic}", + input.stream or f"@{topic}", input.producer_id, input.attempt, ) @@ -143,7 +117,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, - topic=input.topic, + topic=topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -168,14 +142,18 @@ async def read( ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream + self._client, workflow_id=input.workflow_id, stream=input.stream or "" ) topic = input.topic or None if input.latest_only: return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + max_records = ( + _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records + ) + wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.after_token + next_token = input.after_token or "" subscription = delegate.read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, @@ -204,13 +182,13 @@ async def collect() -> None: ) ) next_token = record.cursor.token - if len(records) >= input.max_records: + if len(records) >= max_records: return try: # `wait_for` rather than `asyncio.timeout`, which 3.10 does not # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), input.wait_ms / 1000) + await asyncio.wait_for(collect(), wait_ms / 1000) except asyncio.TimeoutError: pass finally: @@ -222,20 +200,29 @@ async def collect() -> None: return ReadOutput(records=records, next_token=next_token) -def _post(url: str, body: dict) -> dict: +def _post(url: str, body: bytes) -> bytes: request = urllib.request.Request( url, - data=json.dumps(body).encode(), + data=body, headers={"Content-Type": "application/json"}, method="POST", ) try: with urllib.request.urlopen(request, timeout=30) as response: - raw = response.read() + return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") - return json.loads(raw) if raw else {} + + +async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller and + # the worker serving the operation agree on the body without either of + # them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: @@ -276,7 +263,7 @@ async def append(self, *values: Any) -> Cursor: else self._converter.to_payloads([value])[0] ) payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + return Cursor((await self._call(payloads=payloads)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -284,23 +271,21 @@ async def finish(self) -> None: async def _call( self, payloads: list[str] | None = None, finish: bool = False - ) -> dict: + ) -> AppendOutput: self._batch_index += 1 - return await asyncio.to_thread( - _post, - f"{self._base_url}/append", - dataclasses.asdict( - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ) + return await _invoke( + f"{self._base_url}/{_APPEND_OPERATION}", + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + topic=self._topic, + payloads=payloads or [], + finish=finish, ), + AppendOutput, ) @@ -327,28 +312,26 @@ async def read( attempts = AttemptTracker() token = after.token while True: - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - after_token=token, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + after_token=token, ), + ReadOutput, ) - for wire in raw.get("records", []): + for wire in answer.records or []: try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire["frame"]) + base64.b64decode(wire.frame) ) except ValueError: continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire["token"]) + cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -361,23 +344,21 @@ async def read( attempt=attempt, sequence=sequence, ) - token = raw.get("next_token", token) or token + token = answer.next_token or token async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - latest_only=True, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, ), + ReadOutput, ) - token = raw.get("next_token", "") + token = answer.next_token or "" return Cursor(token) if token else BEGINNING def _decode(self, body: bytes, as_type: type | None) -> Any: @@ -397,7 +378,7 @@ def __init__(self) -> None: def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", "TemporalStreams") + service = options.pop("service", _SERVICE_NAME) if options: raise TypeError( "the nexus provider takes endpoint, http_address and service, " From 4496842df6f5779832f6e908984e6f8440806b40 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:37:16 -0700 Subject: [PATCH 328/831] Applied the payload codec on the nexus provider's caller side. The caller ran the payload converter but never the codec, so records left the process in the clear even when one was configured. The producer now encodes before posting and the consumer decodes after reading, while the handler stays codec-blind, which is what keeps plaintext out of whoever hosts the endpoint. A data_converter option on the provider says which one to use when there is no client to take it from. --- CHANGELOG.md | 5 +- temporalio/streams/providers/nexus.py | 72 ++++++---- tests/streams/test_nexus_provider.py | 182 ++++++++++++++++++++++++-- 3 files changed, 223 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9709fa3f..7d6d93c86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,10 @@ to include examples, links to docs, or any other relevant information. naming it. - **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. + through the endpoint and never names the store. Its contract is defined in + `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. + Configure it with `data_converter=` to run a payload codec on the caller + side, so records are encoded before they leave the process. ### Changed diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8e19c2d4d..a73c830ef 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -231,7 +231,7 @@ class NexusProducer: def __init__( self, base_url: str, - converter: Any, + data_converter: temporalio.converter.DataConverter, workflow_id: str, stream: str, topic: str, @@ -240,7 +240,8 @@ def __init__( ) -> None: """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream self._topic = topic @@ -255,15 +256,22 @@ def attempt(self) -> int: async def append(self, *values: Any) -> Cursor: """Append ``values`` through the endpoint.""" - payloads = [] - for value in values: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).cursor or "") + payloads = [ + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + for value in values + ] + if self._codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._codec.encode(payloads) + encoded = [ + base64.b64encode(payload.SerializeToString()).decode() + for payload in payloads + ] + return Cursor((await self._call(payloads=encoded)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -293,11 +301,16 @@ class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + workflow_id: str, + stream: str, ) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream @@ -335,8 +348,11 @@ async def read( superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded + value = ( + await self._decode(body, type) if kind is RecordKind.DATA else None + ) yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, + value=value, cursor=cursor, kind=kind, topic=frame_topic, @@ -361,9 +377,11 @@ async def latest(self, *, topic: str | None = None) -> Cursor: token = answer.next_token or "" return Cursor(token) if token else BEGINNING - def _decode(self, body: bytes, as_type: type | None) -> Any: + async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) + if self._codec is not None: + payload = (await self._codec.decode([payload]))[0] if as_type is None: return self._converter.from_payloads([payload])[0] return self._converter.from_payloads([payload], [as_type])[0] @@ -374,19 +392,22 @@ class _NexusProvider: def __init__(self) -> None: self._base_url: str | None = None + self._data_converter: temporalio.converter.DataConverter | None = None def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") service = options.pop("service", _SERVICE_NAME) + data_converter = options.pop("data_converter", None) if options: raise TypeError( - "the nexus provider takes endpoint, http_address and service, " - f"got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service and " + f"data_converter, got {sorted(options)}" ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + self._data_converter = data_converter def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -427,7 +448,7 @@ async def producer( attempt = attempt or activity.info().attempt return NexusProducer( self._url(), - _converter(client), + self._converter(client), workflow_id, stream, topic, @@ -438,13 +459,14 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), _converter(client), workflow_id, stream) - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + + def _converter(self, client: Any) -> temporalio.converter.DataConverter: + if self._data_converter is not None: + return self._data_converter + if client is None: + return temporalio.converter.DataConverter.default + return client.data_converter _provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index f07e4956c..18679ad5f 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,40 +1,55 @@ -"""Live conformance for the Nexus front. +"""Conformance for the Nexus front. -The caller talks only to the stream endpoint over the server's Nexus HTTP -ingress; the handler worker delegates to the workflow_streams provider, so -this test is the provider-hiding demonstration: nothing on the caller side -names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it -needs a dev server with an HTTP port and a registered Nexus endpoint. +The caller talks only to the stream endpoint; the handler delegates to a +storage provider, so these tests are the provider-hiding demonstration: +nothing on the caller side names or could name the store. -Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), -``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named -``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +The loop test runs over the server's Nexus HTTP ingress and is gated behind +``STREAMS_LIVE=nexus`` because it needs a dev server with an HTTP port and a +registered Nexus endpoint. Environment: ``TEMPORAL_ADDRESS`` (default +``localhost:7233``), ``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), +and an endpoint named ``streams-e2e`` targeting task queue +``streams-handlers-e2e``. + +The codec test stands the endpoint up in this process instead, because what +it checks is the bytes the caller puts on the wire. """ from __future__ import annotations +import asyncio +import base64 +import dataclasses import json import os import subprocess import uuid +from collections.abc import Sequence +from typing import Any, cast import pytest +import temporalio.converter from temporalio import streams +from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams import _frame as frame from temporalio.streams._provider import instance +from temporalio.streams.providers import memory, nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take -pytestmark = pytest.mark.skipif( +live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", ) ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" +APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] def _endpoint_id() -> str: @@ -60,6 +75,7 @@ def _endpoint_id() -> str: return json.loads(out.stdout)["id"] +@live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. @@ -119,3 +135,149 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + + +class ScrambleCodec(temporalio.converter.PayloadCodec): + """Flips every byte of a payload, so the middle holds nothing readable.""" + + KEY = 0x5A + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Wrap each payload as opaque bytes nothing downstream can read.""" + return [ + Payload( + metadata={"encoding": b"binary/plain"}, + data=self._flip(payload.SerializeToString()), + ) + for payload in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Recover the payloads :meth:`encode` wrapped.""" + out: list[Payload] = [] + for payload in payloads: + inner = Payload() + inner.ParseFromString(self._flip(payload.data)) + out.append(inner) + return out + + @classmethod + def _flip(cls, data: bytes) -> bytes: + return bytes(byte ^ cls.KEY for byte in data) + + +async def _dispatch( + handler: TemporalStreamsHandler, operation: str, request: Any +) -> Any: + context = cast("Any", None) # neither operation looks at it + if operation == APPEND_OPERATION: + return await handler.append(context, request) + return await handler.read(context, request) + + +def _in_process_endpoint( + handler: TemporalStreamsHandler, + posted: list[bytes], + answered: list[bytes], +) -> Any: + """Serve the caller's posts from ``handler``, recording both directions.""" + contract = temporalio.converter.DataConverter.default.payload_converter + loop = asyncio.get_running_loop() + + def post(url: str, body: bytes) -> bytes: + posted.append(body) + operation = url.rsplit("/", 1)[1] + request_type = AppendInput if operation == APPEND_OPERATION else ReadInput + request: Any = contract.from_payloads( + [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] + )[0] + if request_type is ReadInput: + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + request.wait_ms = 200 + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + raw = contract.to_payloads([answer])[0].data + answered.append(raw) + return raw + + return post + + +async def _loop_through_an_endpoint( + monkeypatch: pytest.MonkeyPatch, + codec: temporalio.converter.PayloadCodec | None, +) -> tuple[list[Any], list[bytes], list[bytes]]: + memory.reset() + streams.configure(provider="memory") + posted: list[bytes] = [] + answered: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) + front = instance( + "nexus", + endpoint="in-process", + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + workflow_id = "wf-codec" + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"secret": "tuna"}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") + records = await take(consumer.read(type=dict), 2, timeout=30) + memory.reset() + return records, posted, answered + + +def _appended_bytes(posted: list[bytes]) -> bytes: + out = b"" + for body in posted: + for encoded in json.loads(body).get("payloads", []): + out += base64.b64decode(encoded) + return out + + +def _answered_bodies(answered: list[bytes]) -> bytes: + out = b"" + for body in answered: + for record in json.loads(body).get("records", []): + out += frame.decode(base64.b64decode(record["frame"]))[5] + return out + + +async def test_the_caller_encodes_records_with_the_configured_codec( + monkeypatch: pytest.MonkeyPatch, +): + records, posted, answered = await _loop_through_an_endpoint( + monkeypatch, ScrambleCodec() + ) + + # The value survives the hop, so the codec is applied on both sides. + assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"secret": "tuna"} + # Neither direction carried the plaintext. + assert b"tuna" not in _appended_bytes(posted) + assert b"tuna" not in _answered_bodies(answered) + + +async def test_without_a_codec_the_same_records_go_out_in_the_clear( + monkeypatch: pytest.MonkeyPatch, +): + # The contrast is the point: the bytes above differ because of the codec, + # not because the transport obscures them anyway. + records, posted, answered = await _loop_through_an_endpoint(monkeypatch, None) + + assert records[0].value == {"secret": "tuna"} + assert b"tuna" in _appended_bytes(posted) + assert b"tuna" in _answered_bodies(answered) From 5566c9f4f64498b893a27b909a8bafaa8a773488 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 329/831] Made the stream contract generator refuse a nexgen other than the pinned one. The output differs between releases, so a developer with another version on PATH would regenerate different code and only see the drift in CI. --- scripts/gen_streams_nexus_api.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py index 800aba944..2d4f16c6d 100644 --- a/scripts/gen_streams_nexus_api.py +++ b/scripts/gen_streams_nexus_api.py @@ -36,11 +36,26 @@ def nex_gen_command() -> list[str]: return ["nexgen"] +def check_version(command: list[str]) -> None: + # A different release on PATH would regenerate different code locally + # and the drift would only show in CI, so refuse before writing anything. + reported = subprocess.check_output([*command, "--version"], text=True).strip() + found = reported.split()[-1] if reported else "" + if found != NEX_GEN_VERSION: + raise SystemExit( + f"found nexgen {found or '?'} at {command[0]}, but the stream contract is " + f"generated with {NEX_GEN_VERSION}. Install it with `cargo install --locked " + f"nexgen --version {NEX_GEN_VERSION} --features advanced` or point " + "NEX_GEN_BIN at that binary." + ) + + def generate_streams_nexus_api() -> None: if not contract_path.exists(): raise RuntimeError(f"missing stream contract: {contract_path}") command = nex_gen_command() + check_version(command) shutil.rmtree(output_dir, ignore_errors=True) subprocess.check_call( [ From 98efd413730b9469d7824d942ae680484a1c2ba0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 330/831] Regenerated the stream contract with byte payloads, read bounds and tolerant outputs. Payload fields carry contentEncoding base64 so both halves pass bytes and the generated code does the encoding. max_records and wait_ms carry the bounds the validator enforces, outputs accept unknown fields so a handler can add one before every caller is rebuilt, and descriptions are folded at 100 columns. --- .../providers/_nexus_generated/models.py | 201 +++++++++++++++--- .../providers/_nexus_generated/services.py | 8 +- .../providers/temporal_streams.nexusrpc.yaml | 108 ++++++++-- 3 files changed, 261 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index f22711a4f..d00cbcc63 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -13,10 +13,20 @@ from ._definitions import ( Violation, _collect, + _format_base64, + _parse_base64, _parse_spec_integer, _transfer_type_convertible, ) +_APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) + + +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) + + +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) + class _AppendInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] @@ -87,6 +97,13 @@ def from_transfer_type( ) if batch_index_value_parsed is not None: batch_index_value = batch_index_value_parsed + if batch_index_value < 1: + violations.append( + Violation( + path="batch_index", + reason=f"must be >= 1, got {batch_index_value}", + ) + ) topic_value: str | None = None if "topic" in raw: @@ -101,7 +118,7 @@ def from_transfer_type( else: topic_value = topic_value_raw - payloads_value: list[str] | None = None + payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] if payloads_value_raw is None: @@ -114,13 +131,13 @@ def from_transfer_type( Violation(path="payloads", reason="expected array") ) else: - payloads_value_list: list[str] = [] + payloads_value_list: list[bytes] = [] for payloads_value_index, payloads_value_element in enumerate( typing.cast("list[typing.Any]", payloads_value_raw) ): payloads_value_item_path = f"payloads[{payloads_value_index}]" payloads_value_item_violation_count = len(violations) - payloads_value_item: str = typing.cast("typing.Any", None) + payloads_value_item: bytes = typing.cast("typing.Any", None) if not isinstance(payloads_value_element, str): violations.append( Violation( @@ -129,7 +146,13 @@ def from_transfer_type( ) ) else: - payloads_value_item = payloads_value_element + payloads_value_item_parsed = _parse_base64( + payloads_value_element, + payloads_value_item_path, + violations, + ) + if payloads_value_item_parsed is not None: + payloads_value_item = payloads_value_item_parsed if len(violations) == payloads_value_item_violation_count: payloads_value_list.append(payloads_value_item) payloads_value = payloads_value_list @@ -190,11 +213,17 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") ) + if value.batch_index < 1: + violations.append( + Violation( + path="batch_index", reason=f"must be >= 1, got {value.batch_index}" + ) + ) out["batch_index"] = value.batch_index if value.topic is not None: out["topic"] = value.topic if value.payloads is not None: - out["payloads"] = value.payloads + out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: out["finish"] = value.finish if violations: @@ -221,15 +250,16 @@ class AppendInput: batch_index: int """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt. + written for this producer attempt, and rejects one that skips ahead or that resumes + an attempt it never saw start. """ topic: str | None = None """The topic to append to, when stream is empty.""" - payloads: list[str] | None = None - """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a - call that only finishes. + payloads: list[bytes] | None = None + """The records to write, each a serialized Temporal Payload. Empty on a call that only + finishes. """ finish: bool | None = None @@ -265,33 +295,53 @@ def from_transfer_type( else: cursor_value = cursor_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "cursor": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _APPEND_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return AppendOutput( cursor=cursor_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} if value.cursor is not None: out["cursor"] = value.cursor + for key, entry in value.additional_properties.items(): + if key in _APPEND_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_AppendOutputTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" + """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Empty when the call - carried no payloads. + """Opaque token naming the last record written by this call. Absent when the call + carried no payloads, when the batch was a repeat the handler dropped, or when the + store learns positions only at read time. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _ReadInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] @@ -375,6 +425,20 @@ def from_transfer_type( ) if max_records_value_parsed is not None: max_records_value = max_records_value_parsed + if max_records_value < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {max_records_value}", + ) + ) + if max_records_value > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {max_records_value}", + ) + ) wait_ms_value: int | None = None if "wait_ms" in raw: @@ -389,6 +453,20 @@ def from_transfer_type( ) if wait_ms_value_parsed is not None: wait_ms_value = wait_ms_value_parsed + if wait_ms_value < 0: + violations.append( + Violation( + path="wait_ms", + reason=f"must be >= 0, got {wait_ms_value}", + ) + ) + if wait_ms_value > 60000: + violations.append( + Violation( + path="wait_ms", + reason=f"must be <= 60000, got {wait_ms_value}", + ) + ) latest_only_value: bool | None = None if "latest_only" in raw: @@ -446,12 +524,38 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: path="max_records", reason="exceeds ±(2^53-1) integer cap" ) ) + if value.max_records < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {value.max_records}", + ) + ) + if value.max_records > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {value.max_records}", + ) + ) out["max_records"] = value.max_records if value.wait_ms is not None: if abs(value.wait_ms) > 9007199254740991: violations.append( Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") ) + if value.wait_ms < 0: + violations.append( + Violation( + path="wait_ms", reason=f"must be >= 0, got {value.wait_ms}" + ) + ) + if value.wait_ms > 60000: + violations.append( + Violation( + path="wait_ms", reason=f"must be <= 60000, got {value.wait_ms}" + ) + ) out["wait_ms"] = value.wait_ms if value.latest_only is not None: out["latest_only"] = value.latest_only @@ -472,7 +576,9 @@ class ReadInput: """The named stream to read. Empty reads every stream the workflow publishes.""" topic: str | None = None - """Yield only records on this topic. Empty yields every topic.""" + """Yield only records on this topic. Empty yields every topic. Only meaningful when + stream is empty, because an inbound stream has no topics. + """ after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the @@ -485,9 +591,9 @@ class ReadInput: """Return at most this many records. Defaults to 100 when omitted.""" wait_ms: int | None = None - """Wait at most this long for records to arrive before answering. Defaults to 5000 when - omitted. A call that collects nothing answers with no records and the caller's own - token. + """Wait at most this long for records to arrive before answering. The handler shortens + it to fit the request deadline. A call that collects nothing answers with no records + and the caller's own token. """ latest_only: bool | None = None @@ -557,14 +663,16 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "records" and key != "next_token": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _READ_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return ReadOutput( records=records_value, next_token=next_token_value, + additional_properties=additional_properties, ) @typing_extensions.override @@ -585,6 +693,16 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + for key, entry in value.additional_properties.items(): + if key in _READ_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry if violations: raise temporalio.converter.create_payload_validation_error(violations) return out @@ -603,6 +721,10 @@ class ReadOutput: token when the call collected nothing. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _RecordWireTransferTypeConverter( temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] @@ -628,7 +750,7 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: str = typing.cast("typing.Any", None) + frame_value: bytes = typing.cast("typing.Any", None) if "frame" not in raw or raw["frame"] is None: violations.append(Violation(path="frame", reason="required")) else: @@ -636,35 +758,54 @@ def from_transfer_type( if not isinstance(frame_value_raw, str): violations.append(Violation(path="frame", reason="expected string")) else: - frame_value = frame_value_raw + frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) + if frame_value_parsed is not None: + frame_value = frame_value_parsed + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "token" and key != "frame": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _RECORD_WIRE_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, frame=frame_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "RecordWire") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = value.frame + out["frame"] = _format_base64(value.frame) + for key, entry in value.additional_properties.items(): + if key in _RECORD_WIRE_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" + """One record on the wire: its cursor and its frame.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: str - """The base64-encoded record frame, carrying the topic, kind, producer, attempt, - sequence and body. - """ + frame: bytes + """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index ce5604d81..e0673aeab 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -24,9 +24,11 @@ class TemporalStreams: AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. A repeated batch_index for the same - producer attempt is dropped, so a retried call writes once. Supersession records are - not transported: a reader re-synthesizes them from the attempts it observes. + """Append one batch on the caller's account. The handler drops a batch_index it has + already written for this producer attempt, so a retried call writes once, and + rejects an index that skips ahead or a producer attempt it has no state for. + Supersession records are not transported: a reader re-synthesizes them from the + attempts it observes. """ read: Operation[ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index ffa849509..a1cc34631 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -1,18 +1,35 @@ +# The stream endpoint's wire contract. Inputs reject unknown fields so a typo +# fails loudly at the handler; outputs accept them so a handler can add a +# field before every caller has been rebuilt from the newer contract. nexusrpc: "1.0.0" services: TemporalStreams: fqn: TemporalStreams - description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + description: >- + The stream endpoint's two operations. One Temporal-authenticated endpoint + hides the store behind it, so an operator switches storage without + touching callers. Reads hand out batches and an append carries one batch + per call, because a Nexus operation per record costs too much for token + streams. operations: append: fqn: append - description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + description: >- + Append one batch on the caller's account. The handler drops a + batch_index it has already written for this producer attempt, so a + retried call writes once, and rejects an index that skips ahead or a + producer attempt it has no state for. Supersession records are not + transported: a reader re-synthesizes them from the attempts it + observes. input: { $ref: "#/$defs/AppendInput" } output: { $ref: "#/$defs/AppendOutput" } read: fqn: read - description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + description: >- + Answer with the records after the caller's token, or time out. The + call parks until it has max_records records or wait_ms elapses, + whichever comes first, and returns whatever it collected. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -26,16 +43,26 @@ $defs: description: "The workflow whose stream is being written." stream: type: string - description: "The named stream to append to. Empty when the producer writes to a topic instead." + description: >- + The named stream to append to. Empty when the producer writes to a + topic instead. producer_id: type: string - description: "Identifies the writer across its retries, so its attempts can be ordered." + description: >- + Identifies the writer across its retries, so its attempts can be + ordered. attempt: type: integer - description: "The generation this producer is writing. A later attempt supersedes an earlier one." + description: >- + The generation this producer is writing. A later attempt supersedes + an earlier one. batch_index: type: integer - description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + minimum: 1 + description: >- + Counts this producer's batches from 1. The handler drops an index it + has already written for this producer attempt, and rejects one that + skips ahead or that resumes an attempt it never saw start. topic: type: string description: "The topic to append to, when stream is empty." @@ -43,10 +70,15 @@ $defs: type: array items: type: string - description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + contentEncoding: base64 + description: >- + The records to write, each a serialized Temporal Payload. Empty on a + call that only finishes. finish: type: boolean - description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + description: >- + Mark this producer done after writing the batch, so a reader stops + waiting on it. required: - workflow_id - stream @@ -57,12 +89,16 @@ $defs: AppendOutput: type: object - description: "Where the append landed, empty when it wrote nothing." + description: "Where the append landed, when the store can say." properties: cursor: type: string - description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." - additionalProperties: false + description: >- + Opaque token naming the last record written by this call. Absent + when the call carried no payloads, when the batch was a repeat the + handler dropped, or when the store learns positions only at read + time. + additionalProperties: true ReadInput: type: object @@ -73,40 +109,64 @@ $defs: description: "The workflow whose stream is being read." stream: type: string - description: "The named stream to read. Empty reads every stream the workflow publishes." + description: >- + The named stream to read. Empty reads every stream the workflow + publishes. topic: type: string - description: "Yield only records on this topic. Empty yields every topic." + description: >- + Yield only records on this topic. Empty yields every topic. Only + meaningful when stream is empty, because an inbound stream has no + topics. after_token: type: string - description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + description: >- + Opaque cursor from an earlier record or append. The read resumes + strictly after the record it names, so a caller never sees that + record twice. Empty starts at the beginning. The token is produced by + whichever store sits behind the endpoint, so a caller cannot tell + which one that is. max_records: type: integer + minimum: 1 + maximum: 1000 description: "Return at most this many records. Defaults to 100 when omitted." wait_ms: type: integer - description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + minimum: 0 + maximum: 60000 + description: >- + Wait at most this long for records to arrive before answering. The + handler shortens it to fit the request deadline. A call that collects + nothing answers with no records and the caller's own token. latest_only: type: boolean - description: "Answer with the newest position and no records, for a reader that wants to follow from now." + description: >- + Answer with the newest position and no records, for a reader that + wants to follow from now. required: - workflow_id additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its base64 frame." + description: "One record on the wire: its cursor and its frame." properties: token: type: string - description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + description: >- + Opaque cursor naming this record. Pass it as after_token to resume + just past it. frame: type: string - description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + contentEncoding: base64 + description: >- + The record frame, carrying the topic, kind, producer, attempt, + sequence and body. required: - token - frame - additionalProperties: false + additionalProperties: true ReadOutput: type: object @@ -119,5 +179,7 @@ $defs: description: "The records after the caller's token, in stream order." next_token: type: string - description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." - additionalProperties: false + description: >- + Opaque cursor to pass as after_token on the following call. Echoes + the caller's own token when the call collected nothing. + additionalProperties: true From 85a1254ec21e79a80663427f03e1516aa65cce2e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 331/831] Reworked the Nexus front's dedupe, reads, error mapping and endpoint lookup. The handler refuses to continue a producer attempt it has no state for and rejects an index that skips ahead, so a restarted or load-balanced handler cannot lose records behind a success answer. Reads come from one parked subscription per stream, pass bodies through as raw payloads so a codec survives the hop, and stop at the request deadline. The caller commits its batch index only after the endpoint answered, resends a failed batch under the same index, maps transport failures to one error type, and resolves an endpoint name through the operator service. --- temporalio/streams/providers/nexus.py | 685 +++++++++++++++++++------- 1 file changed, 508 insertions(+), 177 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index a73c830ef..8c311d1d9 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -15,33 +15,51 @@ loop, and the caller's batching, cursor handling and codec. Reads hand out batches and an append carries one batch per call, because a -Nexus operation per record costs too much for token streams. Supersession -records are not transported: the caller's reader re-synthesizes them from -the attempts it observes, which is the policy module's job on every -provider. Cursors pass through opaque, so the caller cannot tell which store -produced them. - -One stated prototype limit: append deduplication holds at the handler by -batch index per producer, so a handler restart during a producer's life can -double-append. The store-level fix, a sequence-explicit append in the IDL -contract, is listed in the design doc's work table. +Nexus operation per record costs too much for token streams. Record bodies +cross the handler untouched: it reads the store as raw payloads and frames +them as they are, so a codec that changes the payload encoding survives the +hop and the handler's worker never needs the key. Supersession records are +not transported: the caller's reader re-synthesizes them from the attempts +it observes, which is the policy module's job on every provider. Cursors +pass through opaque, so the caller cannot tell which store produced them. + +The handler keeps one parked read per ``(workflow, stream, topic)`` and +serves consecutive calls from it, so an idle caller does not leave one +abandoned long poll on the store per call. A call whose token does not +match the parked position replaces the subscription, and an idle one is +released after a minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, +by batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh +delegate whose numbering the store would drop as a repeat; the caller opens +a new attempt, which readers report as a supersession. The store-level fix, +a sequence-explicit append in the contract, is listed in the design doc's +work table. And any caller the endpoint admits may touch any workflow's +streams in the namespace; the endpoint's own authorization is the boundary. """ from __future__ import annotations import asyncio -import base64 +import logging +import time import urllib.error import urllib.request -from collections.abc import AsyncGenerator, AsyncIterator -from datetime import timedelta +from collections import OrderedDict +from collections.abc import AsyncGenerator, Mapping +from dataclasses import dataclass +from datetime import datetime, timedelta, timezone from typing import Any, TypeVar import nexusrpc import nexusrpc.handler +from google.protobuf.message import DecodeError import temporalio.converter from temporalio.api.common.v1 import Payload +from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.common import RawValue from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -61,9 +79,16 @@ ) # The contract leaves these unset, so the handler is the one place that says -# what an omitted read bound means. +# what an omitted read bound means. The wait is long because the handler +# shortens it to the request deadline anyway, and a shorter default only +# means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 5000 +_DEFAULT_WAIT_MS = 30_000 +_DEADLINE_MARGIN = timedelta(milliseconds=500) +_DEFAULT_MAX_PRODUCERS = 10_000 +_DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) +_QUEUE_DEPTH = 1000 +_APPEND_TIMEOUT_MS = 30_000 _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -81,6 +106,34 @@ _OutputT = TypeVar("_OutputT") +logger = logging.getLogger(__name__) + + +def _bad_request(message: str) -> nexusrpc.HandlerError: + return nexusrpc.HandlerError( + message, + type=nexusrpc.HandlerErrorType.BAD_REQUEST, + retryable_override=False, + ) + + +@dataclass +class _Subscription: + """One parked read on the store, shared by consecutive calls.""" + + records: asyncio.Queue[StreamRecord[Any]] + position: str + last_used: float + pump: asyncio.Task[None] | None = None + failure: BaseException | None = None + done: bool = False + + +@dataclass +class _ProducerState: + delegate: Any + batch_index: int + @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: @@ -91,17 +144,45 @@ class TemporalStreamsHandler: run handlers for a new store next to handlers for the old one. """ - def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: - """Serve the endpoint out of the provider named by ``provider``.""" + def __init__( + self, + client: Any, + provider: str, + *, + max_producers: int = _DEFAULT_MAX_PRODUCERS, + subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, + **provider_options: Any, + ) -> None: + """Serve the endpoint out of the provider named by ``provider``. + + ``max_producers`` bounds the dedupe state kept per producer attempt; + the oldest is evicted, and a producer evicted mid-life gets a clear + refusal on its next batch rather than a silent drop. + ``subscription_idle`` is how long a parked read outlives its last + caller. + """ self._client = client self._delegate = _provider.instance(provider, **provider_options) - self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + OrderedDict() + ) + self._max_producers = max_producers + self._subscriptions: dict[tuple[str, str, str], _Subscription] = {} + self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} + self._subscription_idle = subscription_idle.total_seconds() @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch.""" + """Append on the caller's account, dropping a repeated batch. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips + ahead, when it continues a producer attempt this handler has + no state for, or when a payload is not a serialized + ``Payload``. + """ topic = input.topic or "" key = ( input.workflow_id, @@ -109,10 +190,18 @@ async def append( input.producer_id, input.attempt, ) - cached = self._producers.get(key) - if cached is not None and input.batch_index <= cached[1]: - return AppendOutput() - if cached is None: + state = self._producers.get(key) + if state is None: + if input.batch_index != 1: + # A fresh delegate would restart its numbering at zero, and + # the store would drop that as a repeat of the first batch. + # Refusing here turns a silent loss into a failure the caller + # can act on by opening a new attempt. + raise _bad_request( + f"producer {input.producer_id!r} attempt {input.attempt} resumed " + f"at batch {input.batch_index} on a handler that has no state for " + "it; open a new attempt" + ) delegate = await self._delegate.producer( self._client, workflow_id=input.workflow_id, @@ -121,117 +210,304 @@ async def append( producer_id=input.producer_id, attempt=input.attempt, ) - else: - delegate = cached[0] - self._producers[key] = (delegate, input.batch_index) - cursor = "" - if input.payloads: - payloads = [] - for encoded in input.payloads: - payload = Payload() - payload.ParseFromString(base64.b64decode(encoded)) - payloads.append(payload) - cursor = (await delegate.append(*payloads)).token + state = _ProducerState(delegate, 0) + elif input.batch_index <= state.batch_index: + # A repeat, or a producer that restarted its numbering: either + # way the store already holds the batch. + self._producers.move_to_end(key) + return AppendOutput() + elif input.batch_index != state.batch_index + 1: + raise _bad_request( + f"batch {input.batch_index} skips ahead of {state.batch_index} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) + payloads = self._payloads(input.payloads) + cursor: str | None = None + if payloads: + appended = await state.delegate.append(*payloads) + cursor = appended.token if appended is not None else None if input.finish: - await delegate.finish() + await state.delegate.finish() + self._producers.pop(key, None) + return AppendOutput(cursor=cursor) + # Recorded only once the store accepted the batch, so a failed append + # is not mistaken for a repeat when the caller retries it. + state.batch_index = input.batch_index + self._producers[key] = state + self._producers.move_to_end(key) + while len(self._producers) > self._max_producers: + self._producers.popitem(last=False) return AppendOutput(cursor=cursor) + @staticmethod + def _payloads(encoded: list[bytes] | None) -> list[Payload]: + payloads = [] + for index, raw in enumerate(encoded or []): + payload = Payload() + try: + payload.ParseFromString(raw) + except DecodeError as error: + raise _bad_request( + f"payloads[{index}] is not a serialized Temporal Payload: {error}" + ) from error + payloads.append(payload) + return payloads + @nexusrpc.handler.sync_operation async def read( - self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream or "" - ) + stream = input.stream or "" topic = input.topic or None if input.latest_only: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=stream + ) return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms - converter = temporalio.converter.DataConverter.default.payload_converter - records: list[RecordWire] = [] - next_token = input.after_token or "" - subscription = delegate.read( - after=Cursor(input.after_token) if input.after_token else BEGINNING, - topic=topic, - ) - - async def collect() -> None: - nonlocal next_token - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + if ctx.request_deadline is not None: + # The server answers the caller with a timeout at the deadline + # whatever this call does, so collecting past it only holds the + # slot for an answer nobody receives. + deadline = ctx.request_deadline + if deadline.tzinfo is None: + deadline = deadline.replace(tzinfo=timezone.utc) + left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN + wait = max(0.0, min(wait, left.total_seconds())) + after = input.after_token or "" + key = (input.workflow_id, stream, topic or "") + await self._expire_subscriptions() + lock = self._read_locks.setdefault(key, asyncio.Lock()) + async with lock: + subscription = self._subscriptions.get(key) + if subscription is None or subscription.position != after: + if subscription is not None: + await self._drop(key) + subscription = await self._subscribe( + key, input.workflow_id, stream, topic, after ) - next_token = record.cursor.token - if len(records) >= max_records: - return + records, next_token = await self._drain(subscription, max_records, wait) + subscription.position = next_token + subscription.last_used = time.monotonic() + if subscription.done and subscription.records.empty(): + # The store ended the read, as the Workflow Streams delegate + # does when the run closes. Nothing more will arrive on it. + await self._drop(key) + return ReadOutput(records=records, next_token=next_token) + + async def _subscribe( + self, + key: tuple[str, str, str], + workflow_id: str, + stream: str, + topic: str | None, + after: str, + ) -> _Subscription: + delegate = await self._delegate.consumer( + self._client, workflow_id=workflow_id, stream=stream + ) + # Raw payloads: the handler frames what the store holds without + # decoding it, so an encoding only the caller's codec understands + # passes through untouched. + source = delegate.read( + after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + ) + subscription = _Subscription( + records=asyncio.Queue(maxsize=_QUEUE_DEPTH), + position=after, + last_used=time.monotonic(), + ) + async def pump() -> None: + try: + async for record in source: + if record.kind is RecordKind.SUPERSEDED: + continue + await subscription.records.put(record) + except asyncio.CancelledError: + raise + except Exception as error: + subscription.failure = error + finally: + subscription.done = True + if isinstance(source, AsyncGenerator): + await source.aclose() + + subscription.pump = asyncio.create_task(pump()) + self._subscriptions[key] = subscription + return subscription + + async def _drain( + self, subscription: _Subscription, max_records: int, wait: float + ) -> tuple[list[RecordWire], str]: + records: list[RecordWire] = [] + next_token = subscription.position + queue = subscription.records + deadline = time.monotonic() + wait + while len(records) < max_records: + if queue.empty(): + remaining = deadline - time.monotonic() + if records or remaining <= 0: + break + if subscription.done: + # Honour the wait even though nothing can arrive, so a + # caller polling a closed stream does not spin on the + # endpoint. + await asyncio.sleep(remaining) + break + try: + record = await asyncio.wait_for(queue.get(), remaining) + except asyncio.TimeoutError: + break + else: + record = queue.get_nowait() + records.append(self._wire(record)) + next_token = record.cursor.token + if not records and subscription.failure is not None: + failure, subscription.failure = subscription.failure, None + raise failure + return records, next_token + + @staticmethod + def _wire(record: StreamRecord[Any]) -> RecordWire: + body = ( + record.value.payload.SerializeToString() + if isinstance(record.value, RawValue) + else b"" + ) + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + return RecordWire(token=record.cursor.token, frame=frame) + + async def close(self) -> None: + """Release every parked read. + + Call it when the worker hosting this handler stops, so subscriptions + waiting on the store do not outlive it. + """ + for key in list(self._subscriptions): + await self._drop(key) + self._read_locks.clear() + + async def _drop(self, key: tuple[str, str, str]) -> None: + subscription = self._subscriptions.pop(key, None) + if subscription is None or subscription.pump is None: + return + subscription.pump.cancel() try: - # `wait_for` rather than `asyncio.timeout`, which 3.10 does not - # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), wait_ms / 1000) - except asyncio.TimeoutError: + await subscription.pump + except (asyncio.CancelledError, Exception): pass - finally: - # The delegate's read parks against its store, and this call - # answers before the caller asks again, so let it go now rather - # than when the collector is next swept. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - return ReadOutput(records=records, next_token=next_token) + async def _expire_subscriptions(self) -> None: + cutoff = time.monotonic() - self._subscription_idle + for key in [k for k, s in self._subscriptions.items() if s.last_used < cutoff]: + lock = self._read_locks.get(key) + if lock is not None and lock.locked(): + continue + await self._drop(key) + self._read_locks.pop(key, None) + + +class StreamEndpointError(RuntimeError): + """The stream endpoint refused a call or could not be reached. -def _post(url: str, body: bytes) -> bytes: + ``status`` is the HTTP status when the endpoint answered, and ``None`` + when the connection itself failed. + """ + + def __init__(self, message: str, *, status: int | None = None) -> None: + """Carry the endpoint's answer, or the reason it gave none.""" + super().__init__(message) + self.status = status + + +def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: request = urllib.request.Request( url, data=body, - headers={"Content-Type": "application/json"}, + headers={ + "Content-Type": "application/json", + # Tells the server how long the handler may park, so it does not + # time the call out ahead of a wait the caller asked for. + "Request-Timeout": f"{timeout_ms}ms", + **headers, + }, method="POST", ) try: - with urllib.request.urlopen(request, timeout=30) as response: + with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") - raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + raise StreamEndpointError( + f"stream endpoint call failed ({error.code}): {detail}", status=error.code + ) from error + except urllib.error.URLError as error: + raise StreamEndpointError( + f"stream endpoint unreachable at {url}: {error.reason}" + ) from error + +class _Front: + """Everything the caller half needs to reach one endpoint.""" -async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: - # The contract types carry their own JSON encoding, so the raw caller and - # the worker serving the operation agree on the body without either of - # them spelling the fields out. - contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) - payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") - return contract.from_payloads([payload], [output])[0] + def __init__( + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + headers: Mapping[str, str], + wait_ms: int, + max_records: int, + ) -> None: + self.base_url = base_url + self.converter = data_converter.payload_converter + self.codec = data_converter.payload_codec + self.headers = dict(headers) + self.wait_ms = wait_ms + self.max_records = max_records + + async def invoke( + self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + ) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller + # and the worker serving the operation agree on the body without + # either of them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread( + _post, + f"{self.base_url}/{operation}", + contract.to_payloads([request])[0].data, + self.headers, + timeout_ms, + ) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it.""" + """Appends through the stream endpoint; framing happens behind it. + + Calls are serialized and the batch index is committed only once the + endpoint answered. A batch whose call raised stays pending and is sent + again under the same index, either when the caller retries the same + values or ahead of whatever the caller sends next, so an ambiguous + failure writes the batch once and loses nothing. + """ def __init__( self, - base_url: str, - data_converter: temporalio.converter.DataConverter, + front: _Front, workflow_id: str, stream: str, topic: str, @@ -239,78 +515,92 @@ def __init__( attempt: int, ) -> None: """Bind this producer to one stream or topic on the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None + self._lock = asyncio.Lock() @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the endpoint.""" + if not values: + return None payloads = [ value if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + else self._front.converter.to_payloads([value])[0] for value in values ] - if self._codec is not None: - # The endpoint is the edge of this process, so a configured codec - # runs here rather than at the handler: whoever hosts the endpoint - # never holds the plaintext. - payloads = await self._codec.encode(payloads) - encoded = [ - base64.b64encode(payload.SerializeToString()).decode() - for payload in payloads - ] - return Cursor((await self._call(payloads=encoded)).cursor or "") + answer = await self._call(payloads, finish=False) + return Cursor(answer.cursor) if answer.cursor else None async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" - await self._call(finish=True) + await self._call([], finish=True) + + async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: + # Identity is taken before the codec runs: a codec may encrypt with a + # fresh nonce each time, and the retry has to be recognised anyway. + identity = tuple(payload.SerializeToString() for payload in payloads) + if self._front.codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._front.codec.encode(payloads) + encoded = [payload.SerializeToString() for payload in payloads] + async with self._lock: + if self._pending is not None and self._pending[1:] != (identity, finish): + # The caller moved on from a batch the endpoint may or may + # not have applied. It goes first under its own index, so the + # handler drops it if it landed and writes it if not, and the + # new batch takes the index after it. + await self._send(*self._pending) + elif self._pending is not None: + return await self._send(*self._pending) + request = self._request(self._batch_index + 1, encoded, finish) + return await self._send(request, identity, finish) + + def _request( + self, batch_index: int, payloads: list[bytes], finish: bool + ) -> AppendInput: + return AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=batch_index, + topic=self._topic, + payloads=payloads, + finish=finish, + ) - async def _call( - self, payloads: list[str] | None = None, finish: bool = False + async def _send( + self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: - self._batch_index += 1 - return await _invoke( - f"{self._base_url}/{_APPEND_OPERATION}", - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ), - AppendOutput, + self._pending = (request, identity, finish) + answer = await self._front.invoke( + _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS ) + self._batch_index = request.batch_index + self._pending = None + return answer class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - workflow_id: str, - stream: str, - ) -> None: + def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream @@ -320,31 +610,37 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, one endpoint batch at a time.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() token = after.token while True: - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, topic=topic or "", after_token=token, + max_records=self._front.max_records, + wait_ms=self._front.wait_ms, ), ReadOutput, + timeout_ms=self._front.wait_ms + 5000, ) for wire in answer.records or []: + cursor = Cursor(wire.token) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire.frame) + wire.frame ) - except ValueError: + except ValueError as error: + # Same answer as every other reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -364,8 +660,8 @@ async def read( async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, @@ -373,6 +669,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: latest_only=True, ), ReadOutput, + timeout_ms=_APPEND_TIMEOUT_MS, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING @@ -380,34 +677,58 @@ async def latest(self, *, topic: str | None = None) -> Cursor: async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - if self._codec is not None: - payload = (await self._codec.decode([payload]))[0] + if self._front.codec is not None: + payload = (await self._front.codec.decode([payload]))[0] if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + return self._front.converter.from_payloads([payload])[0] + return self._front.converter.from_payloads([payload], [as_type])[0] class _NexusProvider: name = "nexus" def __init__(self) -> None: - self._base_url: str | None = None + self._endpoint: str | None = None + self._endpoint_id: str | None = None + self._http_address = "http://127.0.0.1:7243" + self._service = _SERVICE_NAME self._data_converter: temporalio.converter.DataConverter | None = None + self._client: Any = None + self._headers: dict[str, str] = {} + self._wait_ms = _DEFAULT_WAIT_MS + self._max_records = _DEFAULT_MAX_RECORDS def configure(self, **options: Any) -> None: + """Point the caller half at one endpoint. + + ``endpoint`` is the endpoint's name when ``client`` is given, and is + resolved to its id through the operator service on first use; without + a client it has to be the id, because the HTTP ingress dispatches by + id. ``headers`` go on every request, which is where an authorization + header belongs. ``wait_ms`` and ``max_records`` are the read bounds + the caller asks the handler for. + """ endpoint = options.pop("endpoint", None) - http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", _SERVICE_NAME) - data_converter = options.pop("data_converter", None) + self._http_address = options.pop("http_address", self._http_address) + self._service = options.pop("service", _SERVICE_NAME) + self._data_converter = options.pop("data_converter", None) + self._client = options.pop("client", None) + self._headers = dict(options.pop("headers", None) or {}) + self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) + self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) if options: raise TypeError( - "the nexus provider takes endpoint, http_address, service and " - f"data_converter, got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service, " + f"data_converter, client, headers, wait_ms and max_records, got " + f"{sorted(options)}" ) if not endpoint: - raise TypeError("the nexus provider needs endpoint=") - self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - self._data_converter = data_converter + raise TypeError( + "the nexus provider needs endpoint= together with " + "client=, or endpoint= on its own" + ) + self._endpoint = endpoint + self._endpoint_id = None def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -426,10 +747,31 @@ def open_write(self, topic: str) -> WriteSink: del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) - def _url(self) -> str: - if self._base_url is None: + async def _front(self, client: Any) -> _Front: + if self._endpoint is None: raise RuntimeError("configure the nexus provider before opening handles") - return self._base_url + if self._endpoint_id is None: + resolver = self._client if self._client is not None else client + if resolver is None: + self._endpoint_id = self._endpoint + else: + found = await resolver.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") + self._endpoint_id = found.endpoints[0].id + base_url = ( + f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" + f"/services/{self._service}" + ) + return _Front( + base_url, + self._converter(client), + self._headers, + self._wait_ms, + self._max_records, + ) async def producer( self, @@ -441,25 +783,14 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> NexusProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return NexusProducer( - self._url(), - self._converter(client), - workflow_id, - stream, - topic, - producer_id, - attempt, + await self._front(client), workflow_id, stream, topic, producer_id, attempt ) async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + return NexusConsumer(await self._front(client), workflow_id, stream) def _converter(self, client: Any) -> temporalio.converter.DataConverter: if self._data_converter is not None: From 28ad855332ed977a54dc2ea452cef7a5c097f071 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 332/831] Covered the Nexus front's refusals, retries, subscription reuse and deadline clamp. --- tests/streams/test_nexus_provider.py | 334 ++++++++++++++++++++++----- 1 file changed, 274 insertions(+), 60 deletions(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 18679ad5f..77cec6f4e 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -11,8 +11,8 @@ and an endpoint named ``streams-e2e`` targeting task queue ``streams-handlers-e2e``. -The codec test stands the endpoint up in this process instead, because what -it checks is the bytes the caller puts on the wire. +Everything else stands the endpoint up in this process, because what it +checks is the bytes the caller puts on the wire and the handler's own rules. """ from __future__ import annotations @@ -22,11 +22,13 @@ import dataclasses import json import os -import subprocess import uuid -from collections.abc import Sequence -from typing import Any, cast +from collections.abc import Mapping, Sequence +from datetime import datetime, timedelta, timezone +from typing import Any +import nexusrpc +import nexusrpc.handler import pytest import temporalio.converter @@ -38,7 +40,10 @@ from temporalio.streams._provider import instance from temporalio.streams.providers import memory, nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.streams.providers.nexus import ( + StreamEndpointError, + TemporalStreamsHandler, +) from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take @@ -50,51 +55,27 @@ ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] - - -def _endpoint_id() -> str: - # The HTTP ingress dispatches by endpoint id, not name. - out = subprocess.run( - [ - "temporal", - "operator", - "nexus", - "endpoint", - "get", - "--name", - ENDPOINT, - "-o", - "json", - "--address", - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), - ], - capture_output=True, - text=True, - check=True, - ) - return json.loads(out.stdout)["id"] +READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] @live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage - # provider; only the caller goes through the front. + # provider; only the caller goes through the front, and it names the + # endpoint the way an operator does, by name. streams.configure(provider="workflow_streams") client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", - endpoint=_endpoint_id(), + endpoint=ENDPOINT, + client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + wait_ms=5000, ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + handler = TemporalStreamsHandler(client, provider="workflow_streams") - async with Worker( - client, - task_queue=HANDLER_TQ, - nexus_service_handlers=[ - TemporalStreamsHandler(client, provider="workflow_streams") - ], - ): + async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", @@ -135,10 +116,11 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + await handler.close() class ScrambleCodec(temporalio.converter.PayloadCodec): - """Flips every byte of a payload, so the middle holds nothing readable.""" + """Flips every byte and labels the result with an encoding only it can read.""" KEY = 0x5A @@ -146,7 +128,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: """Wrap each payload as opaque bytes nothing downstream can read.""" return [ Payload( - metadata={"encoding": b"binary/plain"}, + metadata={"encoding": b"binary/scrambled"}, data=self._flip(payload.SerializeToString()), ) for payload in payloads @@ -166,45 +148,98 @@ def _flip(cls, data: bytes) -> bytes: return bytes(byte ^ cls.KEY for byte in data) +class _NeverCancelled(nexusrpc.handler.OperationTaskCancellation): + def is_cancelled(self) -> bool: + return False + + def cancellation_reason(self) -> str | None: + return None + + def wait_until_cancelled_sync(self, timeout: float | None = None) -> bool: + del timeout + return False + + async def wait_until_cancelled(self) -> None: + await asyncio.Event().wait() + + +def _context( + operation: str, deadline: datetime | None = None +) -> nexusrpc.handler.StartOperationContext: + return nexusrpc.handler.StartOperationContext( + service=nexus._SERVICE_NAME, # pyright: ignore[reportPrivateUsage] + operation=operation, + headers={}, + task_cancellation=_NeverCancelled(), + request_deadline=deadline, + request_id=uuid.uuid4().hex, + ) + + async def _dispatch( handler: TemporalStreamsHandler, operation: str, request: Any ) -> Any: - context = cast("Any", None) # neither operation looks at it if operation == APPEND_OPERATION: - return await handler.append(context, request) - return await handler.read(context, request) + return await handler.append(_context(operation), request) + return await handler.read(_context(operation), request) def _in_process_endpoint( handler: TemporalStreamsHandler, posted: list[bytes], answered: list[bytes], + *, + fail_after_applying: list[str] | None = None, ) -> Any: - """Serve the caller's posts from ``handler``, recording both directions.""" + """Serve the caller's posts from ``handler``, recording both directions. + + ``fail_after_applying`` names operations whose first call is applied and + then reported as a transport failure, the ambiguous case a retry has to + survive. + """ contract = temporalio.converter.DataConverter.default.payload_converter loop = asyncio.get_running_loop() + failing = set(fail_after_applying or []) - def post(url: str, body: bytes) -> bytes: + def post( + url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + ) -> bytes: + del headers, timeout_ms posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput request: Any = contract.from_payloads( [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] )[0] - if request_type is ReadInput: - # This endpoint has no other traffic to wait for, so park briefly - # rather than for the contract's default. - request.wait_ms = 200 - answer = asyncio.run_coroutine_threadsafe( - _dispatch(handler, operation, request), loop - ).result() + try: + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + except nexusrpc.HandlerError as error: + raise StreamEndpointError(str(error), status=400) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) + if operation in failing: + failing.discard(operation) + raise StreamEndpointError("connection reset after the handler answered") return raw return post +def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: + return instance( + "nexus", + endpoint="in-process", + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + wait_ms=200, + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + + async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, @@ -215,13 +250,7 @@ async def _loop_through_an_endpoint( answered: list[bytes] = [] handler = TemporalStreamsHandler(None, provider="memory") monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = instance( - "nexus", - endpoint="in-process", - data_converter=dataclasses.replace( - temporalio.converter.DataConverter.default, payload_codec=codec - ), - ) + front = _front(codec) workflow_id = "wf-codec" producer = await front.producer( @@ -263,7 +292,9 @@ async def test_the_caller_encodes_records_with_the_configured_codec( monkeypatch, ScrambleCodec() ) - # The value survives the hop, so the codec is applied on both sides. + # The value survives the hop although the handler cannot read the + # encoding, so the body passed through it untouched and the codec ran on + # the caller alone. assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] assert records[0].value == {"secret": "tuna"} # Neither direction carried the plaintext. @@ -281,3 +312,186 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( assert records[0].value == {"secret": "tuna"} assert b"tuna" in _appended_bytes(posted) assert b"tuna" in _answered_bodies(answered) + + +def _append( + workflow_id: str, batch_index: int, *values: Any, finish: bool = False +) -> AppendInput: + converter = temporalio.converter.DataConverter.default.payload_converter + return AppendInput( + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + batch_index=batch_index, + payloads=[ + converter.to_payloads([value])[0].SerializeToString() for value in values + ], + finish=finish, + ) + + +async def _stored(workflow_id: str) -> list[Any]: + consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") + out: list[Any] = [] + async for record in consumer.read(type=dict): + if record.kind is RecordKind.DATA: + out.append(record.value) + if await consumer.latest() == record.cursor: + break + return out + + +@pytest.fixture +def _memory_store(): # pyright: ignore[reportUnusedFunction] + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): + # A second handler instance stands in for a restarted or load-balanced + # handler worker: it shares the store but not the dedupe state. + first = TemporalStreamsHandler(None, provider="memory") + second = TemporalStreamsHandler(None, provider="memory") + await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert failed.value.retryable_override is False + # The store holds the first batch and nothing was silently lost or doubled. + assert await _stored("wf") == [{"n": 1}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_handler_drops_repeats_and_rejects_gaps(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # An exact repeat is dropped with a success answer and no position. + repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert repeat.cursor is None + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_malformed_payload_is_the_callers_fault(): + handler = TemporalStreamsHandler(None, provider="memory") + request = _append("wf", 1) + request.payloads = [b"\xff\xfe not a payload"] + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, request) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + await producer.finish() + indexes = [json.loads(body)["batch_index"] for body in posted] + # The retry re-sent index 1, which the handler dropped as a repeat, so + # the store holds each record once. + assert indexes == [1, 1, 2, 3] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_failed_append_goes_out_before_the_next_one( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + # The caller moves on without retrying; the pending batch is replayed + # first under its own index and the new one takes the next. + await producer.append({"n": 2}) + indexes = [json.loads(body)["batch_index"] for body in posted] + assert indexes == [1, 1, 2] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_consecutive_reads_share_one_parked_subscription(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) + first = await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ) + assert len(first.records) == 1 + parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] + pump = next(iter(parked.values())).pump + # A call that resumes where the last one stopped drains the same + # subscription instead of parking a second read on the store. + second = await _dispatch( + handler, + READ_OPERATION, + ReadInput( + workflow_id="wf", + stream="inputs", + after_token=first.next_token, + max_records=1, + wait_ms=200, + ), + ) + assert len(second.records) == 1 + assert second.next_token != first.next_token + assert len(parked) == 1 and next(iter(parked.values())).pump is pump + # A call from somewhere else replaces it. + await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ) + assert len(parked) == 1 and next(iter(parked.values())).pump is not pump + await handler.close() + assert not parked + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_read_wait_is_cut_to_the_request_deadline(): + handler = TemporalStreamsHandler(None, provider="memory") + started = asyncio.get_running_loop().time() + answer = await handler.read( + _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), + ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ) + assert answer.records == [] and answer.next_token == "" + assert asyncio.get_running_loop().time() - started < 5 + await handler.close() From aec785b9d1ea38f778d4cd75ab1b389ee4a473e5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 333/831] Carried the StreamRecord proto and producer identity on the stream contract. A record crosses the endpoint as the serialized proto every store keeps, an append names its topic, run and sequence, and a read says when the store ended it. --- .../providers/_nexus_generated/models.py | 245 +++++++++++------- .../providers/_nexus_generated/services.py | 17 +- .../providers/temporal_streams.nexusrpc.yaml | 96 ++++--- 3 files changed, 224 insertions(+), 134 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index d00cbcc63..2677843ef 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -22,10 +22,10 @@ _APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) -_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token", "done"}) -_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "record"}) class _AppendInputTransferTypeConverter( @@ -54,15 +54,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str = typing.cast("typing.Any", None) - if "stream" not in raw or raw["stream"] is None: - violations.append(Violation(path="stream", reason="required")) + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: + violations.append( + Violation(path="run_id", reason="explicit null not allowed") + ) + else: + if not isinstance(run_id_value_raw, str): + violations.append( + Violation(path="run_id", reason="expected string") + ) + else: + run_id_value = run_id_value_raw + + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) else: - stream_value_raw = raw["stream"] - if not isinstance(stream_value_raw, str): - violations.append(Violation(path="stream", reason="expected string")) + topic_value_raw = raw["topic"] + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - stream_value = stream_value_raw + topic_value = topic_value_raw producer_id_value: str = typing.cast("typing.Any", None) if "producer_id" not in raw or raw["producer_id"] is None: @@ -87,6 +102,24 @@ def from_transfer_type( if attempt_value_parsed is not None: attempt_value = attempt_value_parsed + sequence_value: int = typing.cast("typing.Any", None) + if "sequence" not in raw or raw["sequence"] is None: + violations.append(Violation(path="sequence", reason="required")) + else: + sequence_value_raw = raw["sequence"] + sequence_value_parsed = _parse_spec_integer( + sequence_value_raw, "sequence", violations + ) + if sequence_value_parsed is not None: + sequence_value = sequence_value_parsed + if sequence_value < 0: + violations.append( + Violation( + path="sequence", + reason=f"must be >= 0, got {sequence_value}", + ) + ) + batch_index_value: int = typing.cast("typing.Any", None) if "batch_index" not in raw or raw["batch_index"] is None: violations.append(Violation(path="batch_index", reason="required")) @@ -105,19 +138,6 @@ def from_transfer_type( ) ) - topic_value: str | None = None - if "topic" in raw: - topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) - else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw - payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] @@ -175,11 +195,12 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" + and key != "topic" and key != "producer_id" and key != "attempt" + and key != "sequence" and key != "batch_index" - and key != "topic" and key != "payloads" and key != "finish" ): @@ -188,11 +209,12 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return AppendInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, + topic=topic_value, producer_id=producer_id_value, attempt=attempt_value, + sequence=sequence_value, batch_index=batch_index_value, - topic=topic_value, payloads=payloads_value, finish=finish_value, ) @@ -202,13 +224,24 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - out["stream"] = value.stream + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic out["producer_id"] = value.producer_id if abs(value.attempt) > 9007199254740991: violations.append( Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") ) out["attempt"] = value.attempt + if abs(value.sequence) > 9007199254740991: + violations.append( + Violation(path="sequence", reason="exceeds ±(2^53-1) integer cap") + ) + if value.sequence < 0: + violations.append( + Violation(path="sequence", reason=f"must be >= 0, got {value.sequence}") + ) + out["sequence"] = value.sequence if abs(value.batch_index) > 9007199254740991: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") @@ -220,8 +253,6 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: ) ) out["batch_index"] = value.batch_index - if value.topic is not None: - out["topic"] = value.topic if value.payloads is not None: out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: @@ -239,31 +270,45 @@ class AppendInput: workflow_id: str """The workflow whose stream is being written.""" - stream: str - """The named stream to append to. Empty when the producer writes to a topic instead.""" + run_id: str | None = None + """The run to address. Empty addresses the workflow's execution chain, which is what a + producer normally wants. + """ + + topic: str + """The topic of the workflow's stream to append to.""" producer_id: str - """Identifies the writer across its retries, so its attempts can be ordered.""" + """Identifies the writer across its retries, so its attempts can be ordered. Never + empty here: the caller resolved it, from the activity context when it was not given. + """ attempt: int """The generation this producer is writing. A later attempt supersedes an earlier one.""" - batch_index: int - """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt, and rejects one that skips ahead or that resumes - an attempt it never saw start. + sequence: int + """The producer's sequence of the first record in this batch; the batch is numbered + from it and a finish takes the next number. It has to continue where the previous + batch ended, so the handler and the store agree on every record's position within + the attempt. """ - topic: str | None = None - """The topic to append to, when stream is empty.""" + batch_index: int + """Counts this producer's batches from 1. The handler answers a repeat of the last + index with the original's position, and refuses one that skips ahead, one already + behind the last, or one that resumes an attempt it never saw start. + """ payloads: list[bytes] | None = None - """The records to write, each a serialized Temporal Payload. Empty on a call that only - finishes. + """The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the caller has already + run on them. Empty on a call that only finishes. """ finish: bool | None = None - """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + """Write FINISH for this producer after the batch: it will write nothing more on the + topic. Says nothing about the producer's outcome. + """ class _AppendOutputTransferTypeConverter( @@ -333,9 +378,9 @@ class AppendOutput: """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Absent when the call - carried no payloads, when the batch was a repeat the handler dropped, or when the - store learns positions only at read time. + """Opaque token naming the last record written by this call, or by the original when + the call repeated the last batch. Absent when the store learns positions only at + read time; such a caller positions itself with a latest_only read. """ additional_properties: dict[str, typing.Any] = dataclasses.field( @@ -369,33 +414,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str | None = None - if "stream" in raw: - stream_value_raw = raw["stream"] - if stream_value_raw is None: + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: violations.append( - Violation(path="stream", reason="explicit null not allowed") + Violation(path="run_id", reason="explicit null not allowed") ) else: - if not isinstance(stream_value_raw, str): + if not isinstance(run_id_value_raw, str): violations.append( - Violation(path="stream", reason="expected string") + Violation(path="run_id", reason="expected string") ) else: - stream_value = stream_value_raw + run_id_value = run_id_value_raw - topic_value: str | None = None - if "topic" in raw: + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) + else: topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw + topic_value = topic_value_raw after_token_value: str | None = None if "after_token" in raw: @@ -486,7 +528,7 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" and key != "topic" and key != "after_token" and key != "max_records" @@ -498,7 +540,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return ReadInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, topic=topic_value, after_token=after_token_value, max_records=max_records_value, @@ -511,10 +553,9 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - if value.stream is not None: - out["stream"] = value.stream - if value.topic is not None: - out["topic"] = value.topic + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic if value.after_token is not None: out["after_token"] = value.after_token if value.max_records is not None: @@ -572,19 +613,19 @@ class ReadInput: workflow_id: str """The workflow whose stream is being read.""" - stream: str | None = None - """The named stream to read. Empty reads every stream the workflow publishes.""" - - topic: str | None = None - """Yield only records on this topic. Empty yields every topic. Only meaningful when - stream is empty, because an inbound stream has no topics. + run_id: str | None = None + """Pin the read to this run. Empty follows the workflow's execution chain across + continue-as-new. """ + topic: str + """The topic of the workflow's stream to read.""" + after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a - caller cannot tell which one that is. + caller cannot tell which one that is, and a token from another store is refused. """ max_records: int | None = None @@ -663,6 +704,19 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + done_value: bool | None = None + if "done" in raw: + done_value_raw = raw["done"] + if done_value_raw is None: + violations.append( + Violation(path="done", reason="explicit null not allowed") + ) + else: + if not isinstance(done_value_raw, bool): + violations.append(Violation(path="done", reason="expected boolean")) + else: + done_value = done_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: if key not in _READ_OUTPUT_DECLARED: @@ -672,6 +726,7 @@ def from_transfer_type( return ReadOutput( records=records_value, next_token=next_token_value, + done=done_value, additional_properties=additional_properties, ) @@ -693,6 +748,8 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + if value.done is not None: + out["done"] = value.done for key, entry in value.additional_properties.items(): if key in _READ_OUTPUT_DECLARED: violations.append( @@ -721,6 +778,12 @@ class ReadOutput: token when the call collected nothing. """ + done: bool | None = None + """The store ended the read: the owning execution, or its chain, is closed and every + retained record after the caller's token has been delivered. Nothing more will + arrive, so the caller stops. + """ + additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict ) @@ -750,17 +813,19 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: bytes = typing.cast("typing.Any", None) - if "frame" not in raw or raw["frame"] is None: - violations.append(Violation(path="frame", reason="required")) + record_value: bytes = typing.cast("typing.Any", None) + if "record" not in raw or raw["record"] is None: + violations.append(Violation(path="record", reason="required")) else: - frame_value_raw = raw["frame"] - if not isinstance(frame_value_raw, str): - violations.append(Violation(path="frame", reason="expected string")) + record_value_raw = raw["record"] + if not isinstance(record_value_raw, str): + violations.append(Violation(path="record", reason="expected string")) else: - frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) - if frame_value_parsed is not None: - frame_value = frame_value_parsed + record_value_parsed = _parse_base64( + record_value_raw, "record", violations + ) + if record_value_parsed is not None: + record_value = record_value_parsed additional_properties: dict[str, typing.Any] = {} for key in raw: @@ -770,7 +835,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, - frame=frame_value, + record=record_value, additional_properties=additional_properties, ) @@ -779,7 +844,7 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = _format_base64(value.frame) + out["record"] = _format_base64(value.record) for key, entry in value.additional_properties.items(): if key in _RECORD_WIRE_DECLARED: violations.append( @@ -798,13 +863,15 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its frame.""" + """One record on the wire: its cursor and the record itself.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: bytes - """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + record: bytes + """The serialized temporal.api.stream.v1.StreamRecord: topic, kind, producer_id, + attempt, sequence and body, as the store holds it. + """ additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index e0673aeab..591e31046 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -17,18 +17,20 @@ class TemporalStreams: """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation - per record costs too much for token streams. + per record costs too much for token streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so a caller + in any language decodes it with the api protos alone. """ append: Operation[ AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. The handler drops a batch_index it has - already written for this producer attempt, so a retried call writes once, and - rejects an index that skips ahead or a producer attempt it has no state for. - Supersession records are not transported: a reader re-synthesizes them from the - attempts it observes. + """Append one batch on the caller's account. The handler writes a batch once: a repeat + of the last batch_index answers with where the original landed, and an index that + skips ahead, one already behind the last, a sequence that does not continue, or a + producer attempt the handler has no state for is refused. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. """ read: Operation[ @@ -37,5 +39,6 @@ class TemporalStreams: ] = Operation(name="read") """Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns - whatever it collected. + whatever it collected. It says when the store has ended the read, so the caller can + stop. """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index a1cc34631..bf97209b3 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -11,15 +11,18 @@ services: hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token - streams. + streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so + a caller in any language decodes it with the api protos alone. operations: append: fqn: append description: >- - Append one batch on the caller's account. The handler drops a - batch_index it has already written for this producer attempt, so a - retried call writes once, and rejects an index that skips ahead or a - producer attempt it has no state for. Supersession records are not + Append one batch on the caller's account. The handler writes a batch + once: a repeat of the last batch_index answers with where the + original landed, and an index that skips ahead, one already behind + the last, a sequence that does not continue, or a producer attempt + the handler has no state for is refused. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes. input: { $ref: "#/$defs/AppendInput" } @@ -29,7 +32,8 @@ services: description: >- Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, - whichever comes first, and returns whatever it collected. + whichever comes first, and returns whatever it collected. It says + when the store has ended the read, so the caller can stop. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -41,49 +45,61 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being written." - stream: + run_id: type: string description: >- - The named stream to append to. Empty when the producer writes to a - topic instead. + The run to address. Empty addresses the workflow's execution chain, + which is what a producer normally wants. + topic: + type: string + description: "The topic of the workflow's stream to append to." producer_id: type: string description: >- Identifies the writer across its retries, so its attempts can be - ordered. + ordered. Never empty here: the caller resolved it, from the activity + context when it was not given. attempt: type: integer description: >- The generation this producer is writing. A later attempt supersedes an earlier one. + sequence: + type: integer + minimum: 0 + description: >- + The producer's sequence of the first record in this batch; the batch + is numbered from it and a finish takes the next number. It has to + continue where the previous batch ended, so the handler and the + store agree on every record's position within the attempt. batch_index: type: integer minimum: 1 description: >- - Counts this producer's batches from 1. The handler drops an index it - has already written for this producer attempt, and rejects one that - skips ahead or that resumes an attempt it never saw start. - topic: - type: string - description: "The topic to append to, when stream is empty." + Counts this producer's batches from 1. The handler answers a repeat + of the last index with the original's position, and refuses one that + skips ahead, one already behind the last, or one that resumes an + attempt it never saw start. payloads: type: array items: type: string contentEncoding: base64 description: >- - The records to write, each a serialized Temporal Payload. Empty on a - call that only finishes. + The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the + caller has already run on them. Empty on a call that only finishes. finish: type: boolean description: >- - Mark this producer done after writing the batch, so a reader stops - waiting on it. + Write FINISH for this producer after the batch: it will write nothing + more on the topic. Says nothing about the producer's outcome. required: - workflow_id - - stream + - topic - producer_id - attempt + - sequence - batch_index additionalProperties: false @@ -94,10 +110,10 @@ $defs: cursor: type: string description: >- - Opaque token naming the last record written by this call. Absent - when the call carried no payloads, when the batch was a repeat the - handler dropped, or when the store learns positions only at read - time. + Opaque token naming the last record written by this call, or by the + original when the call repeated the last batch. Absent when the + store learns positions only at read time; such a caller positions + itself with a latest_only read. additionalProperties: true ReadInput: @@ -107,17 +123,14 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being read." - stream: + run_id: type: string description: >- - The named stream to read. Empty reads every stream the workflow - publishes. + Pin the read to this run. Empty follows the workflow's execution + chain across continue-as-new. topic: type: string - description: >- - Yield only records on this topic. Empty yields every topic. Only - meaningful when stream is empty, because an inbound stream has no - topics. + description: "The topic of the workflow's stream to read." after_token: type: string description: >- @@ -125,7 +138,7 @@ $defs: strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell - which one that is. + which one that is, and a token from another store is refused. max_records: type: integer minimum: 1 @@ -146,26 +159,27 @@ $defs: wants to follow from now. required: - workflow_id + - topic additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its frame." + description: "One record on the wire: its cursor and the record itself." properties: token: type: string description: >- Opaque cursor naming this record. Pass it as after_token to resume just past it. - frame: + record: type: string contentEncoding: base64 description: >- - The record frame, carrying the topic, kind, producer, attempt, - sequence and body. + The serialized temporal.api.stream.v1.StreamRecord: topic, kind, + producer_id, attempt, sequence and body, as the store holds it. required: - token - - frame + - record additionalProperties: true ReadOutput: @@ -182,4 +196,10 @@ $defs: description: >- Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing. + done: + type: boolean + description: >- + The store ended the read: the owning execution, or its chain, is + closed and every retained record after the caller's token has been + delivered. Nothing more will arrive, so the caller stops. additionalProperties: true From d482dbdb06b0b3ff988b279144a19abcb4424624 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 334/831] Rewrote the Nexus front on the plugin surface. NexusStreams is the outside half only and the handler fronts a storage provider's own handles. Endpoint failures reach the caller as the stream condition the store raised or as an RPCError, never as an HTTP error. --- temporalio/streams/providers/nexus.py | 813 +++++++++++++++----------- 1 file changed, 468 insertions(+), 345 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8c311d1d9..07da0318b 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -1,47 +1,58 @@ """The Nexus front: the outside surface behind one Temporal-authenticated endpoint. -Two halves in one module. The provider half implements only :func:`producer` -and :func:`consumer`; the workflow side raises, naming a storage provider, -because a workflow's publishes and reads ride the Workflow Task and cannot -cross an RPC. The handler half runs in a worker configured with any storage -provider and serves two sync operations, ``append`` and ``read``, so the -store behind the endpoint is invisible to callers and an operator switches -it without touching them. +Two halves in one module. :class:`NexusStreams` is a provider that implements +the outside half only: it hands out handles that append and read through the +endpoint, and it has no workflow half, because a workflow's publishes and +reads ride the Workflow Task and cannot cross an RPC. +:class:`TemporalStreamsHandler` runs in a worker next to any storage provider +and serves two sync operations, ``append`` and ``read``, by fronting that +provider's own handles, so the store behind the endpoint is invisible to +callers and an operator switches it without touching them. The wire types and the service definition come from ``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be -handed the same contract. What stays hand-written here is what the -generator cannot express yet: the handler's dedupe and long-poll collect -loop, and the caller's batching, cursor handling and codec. +handed the same contract. A record crosses as the serialized +``temporal.api.stream.v1.StreamRecord``, the same bytes every store keeps, so +a caller in another language decodes it with the api protos alone. What stays +hand-written here is what the generator cannot express yet: the handler's +dedupe and long-poll collect loop, and the caller's batching, cursor handling +and codec. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Record bodies -cross the handler untouched: it reads the store as raw payloads and frames +cross the handler untouched: it reads the store as raw payloads and forwards them as they are, so a codec that changes the payload encoding survives the hop and the handler's worker never needs the key. Supersession records are -not transported: the caller's reader re-synthesizes them from the attempts -it observes, which is the policy module's job on every provider. Cursors -pass through opaque, so the caller cannot tell which store produced them. - -The handler keeps one parked read per ``(workflow, stream, topic)`` and -serves consecutive calls from it, so an idle caller does not leave one -abandoned long poll on the store per call. A call whose token does not -match the parked position replaces the subscription, and an idle one is -released after a minute; that is the residual cost. - -Two stated prototype limits. Append deduplication lives in handler memory, -by batch index per producer attempt, so a handler that has no state for a -producer attempt refuses to continue it rather than starting a fresh -delegate whose numbering the store would drop as a repeat; the caller opens -a new attempt, which readers report as a supersession. The store-level fix, -a sequence-explicit append in the contract, is listed in the design doc's -work table. And any caller the endpoint admits may touch any workflow's -streams in the namespace; the endpoint's own authorization is the boundary. +not transported: the caller's reader re-synthesizes them from the attempts it +observes, which is the policy module's job on every provider. Cursors pass +through opaque, so the caller cannot tell which store produced them; a +foreign one is refused by the store behind the endpoint and reaches the +caller on the first read. + +The handler keeps one parked read per ``(workflow, run, topic)`` and serves +consecutive calls from it, so an idle caller does not leave one abandoned +long poll on the store per call. A call whose token does not match the parked +position replaces the subscription, and an idle one is released after a +minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, by +batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh delegate +whose numbering the store would drop as a repeat; the caller opens a new +attempt, which readers report as a supersession. And any caller the endpoint +admits may touch any workflow's streams in the namespace; the endpoint's own +authorization is the boundary. + +A failure from the endpoint reaches the caller as the +:class:`temporalio.streams.StreamError` the store raised, when the handler +named one, and as :class:`temporalio.service.RPCError` otherwise, never as an +HTTP or urllib exception. """ from __future__ import annotations import asyncio +import json import logging import time import urllib.error @@ -50,7 +61,7 @@ from collections.abc import AsyncGenerator, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, TypeVar +from typing import Any, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler @@ -59,11 +70,24 @@ import temporalio.converter from temporalio.api.common.v1 import Payload from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.client import Client from temporalio.common import RawValue -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import StreamHandle, StreamProducer, StreamProvider from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + producer_identity, + to_wire, +) from temporalio.streams.providers._nexus_generated import ( AppendInput, AppendOutput, @@ -73,9 +97,16 @@ TemporalStreams, ) +__all__ = [ + "NexusProducer", + "NexusStreamHandle", + "NexusStreams", + "TemporalStreamsHandler", +] + _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " - "through a storage provider, so configure one of those on the worker" + "through a storage provider, so give the worker one of those" ) # The contract leaves these unset, so the handler is the one place that says @@ -83,12 +114,13 @@ # shortens it to the request deadline anyway, and a shorter default only # means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 30_000 +_DEFAULT_READ_WAIT = timedelta(seconds=30) _DEADLINE_MARGIN = timedelta(milliseconds=500) _DEFAULT_MAX_PRODUCERS = 10_000 _DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) _QUEUE_DEPTH = 1000 -_APPEND_TIMEOUT_MS = 30_000 +_APPEND_TIMEOUT = timedelta(seconds=30) +_ROUND_TRIP_MARGIN = timedelta(seconds=5) _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -104,16 +136,58 @@ _APPEND_OPERATION = _OPERATION_NAMES["append"] _READ_OPERATION = _OPERATION_NAMES["read"] +# The stream conditions that cross the endpoint under their own name, so the +# caller raises the class the store raised. +_STREAM_ERRORS: dict[str, type[StreamError]] = { + cls.__name__: cls + for cls in ( + StreamError, + StreamNotFoundError, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, + ) +} +_HTTP_TO_RPC = { + 400: RPCStatusCode.INVALID_ARGUMENT, + 401: RPCStatusCode.UNAUTHENTICATED, + 403: RPCStatusCode.PERMISSION_DENIED, + 404: RPCStatusCode.NOT_FOUND, + 408: RPCStatusCode.DEADLINE_EXCEEDED, + 409: RPCStatusCode.ALREADY_EXISTS, + 412: RPCStatusCode.FAILED_PRECONDITION, + 429: RPCStatusCode.RESOURCE_EXHAUSTED, + 500: RPCStatusCode.INTERNAL, + 501: RPCStatusCode.UNIMPLEMENTED, + 503: RPCStatusCode.UNAVAILABLE, + 504: RPCStatusCode.DEADLINE_EXCEEDED, +} + _OutputT = TypeVar("_OutputT") logger = logging.getLogger(__name__) +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _handler_error(error: StreamError) -> nexusrpc.HandlerError: + """Carry a stream condition across the endpoint under its own class name.""" + kind = ( + nexusrpc.HandlerErrorType.NOT_FOUND + if isinstance(error, StreamNotFoundError) + else nexusrpc.HandlerErrorType.BAD_REQUEST + ) + return nexusrpc.HandlerError( + f"{type(error).__name__}: {error}", type=kind, retryable_override=False + ) + + def _bad_request(message: str) -> nexusrpc.HandlerError: return nexusrpc.HandlerError( - message, - type=nexusrpc.HandlerErrorType.BAD_REQUEST, - retryable_override=False, + message, type=nexusrpc.HandlerErrorType.BAD_REQUEST, retryable_override=False ) @@ -131,29 +205,30 @@ class _Subscription: @dataclass class _ProducerState: - delegate: Any + delegate: StreamProducer batch_index: int + sequence: int + last_cursor: str | None @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: - """Serves the stream endpoint, delegating to one storage provider. + """Serves the stream endpoint by fronting one storage provider's handles. - The delegate is an explicit instance rather than the process default, so - a caller and a handler can coexist in one process, and so an operator can + The provider is an explicit instance the application constructed, so a + caller and a handler can coexist in one process, and so an operator can run handlers for a new store next to handlers for the old one. """ def __init__( self, - client: Any, - provider: str, + provider: StreamProvider, + client: Client | None, *, max_producers: int = _DEFAULT_MAX_PRODUCERS, subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, - **provider_options: Any, ) -> None: - """Serve the endpoint out of the provider named by ``provider``. + """Serve the endpoint out of ``provider``'s handles, opened with ``client``. ``max_producers`` bounds the dedupe state kept per producer attempt; the oldest is evicted, and a producer evicted mid-life gets a clear @@ -161,9 +236,9 @@ def __init__( ``subscription_idle`` is how long a parked read outlives its last caller. """ + self._provider = provider self._client = client - self._delegate = _provider.instance(provider, **provider_options) - self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + self._producers: OrderedDict[tuple[str, str, str, str, int], _ProducerState] = ( OrderedDict() ) self._max_producers = max_producers @@ -171,60 +246,82 @@ def __init__( self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} self._subscription_idle = subscription_idle.total_seconds() + def _stream(self, workflow_id: str, run_id: str | None) -> StreamHandle: + # A storage provider wants a client; the memory provider, which the + # tests front, accepts none, so the cast only lies where it is unread. + return self._provider.get_stream_handle( + cast(Client, self._client), workflow_id, run_id=run_id or None + ) + @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch. + """Append on the caller's account, writing a repeated batch once. Raises: - nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips - ahead, when it continues a producer attempt this handler has - no state for, or when a payload is not a serialized - ``Payload``. + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index or + sequence does not continue the producer attempt, when the + attempt is one this handler has no state for, or when a + payload is not a serialized ``Payload``; ``NOT_FOUND`` when + the store has no such workflow. """ - topic = input.topic or "" + try: + return await self._append(input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _append(self, input: AppendInput) -> AppendOutput: + _require_topic(input.topic) key = ( input.workflow_id, - input.stream or f"@{topic}", + input.run_id or "", + input.topic, input.producer_id, input.attempt, ) state = self._producers.get(key) if state is None: - if input.batch_index != 1: + if input.batch_index != 1 or input.sequence != 0: # A fresh delegate would restart its numbering at zero, and # the store would drop that as a repeat of the first batch. # Refusing here turns a silent loss into a failure the caller # can act on by opening a new attempt. - raise _bad_request( + raise StreamProducerError( f"producer {input.producer_id!r} attempt {input.attempt} resumed " f"at batch {input.batch_index} on a handler that has no state for " "it; open a new attempt" ) - delegate = await self._delegate.producer( - self._client, - workflow_id=input.workflow_id, - stream=input.stream, - topic=topic, - producer_id=input.producer_id, - attempt=input.attempt, + delegate = self._stream(input.workflow_id, input.run_id).producer( + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt ) - state = _ProducerState(delegate, 0) - elif input.batch_index <= state.batch_index: - # A repeat, or a producer that restarted its numbering: either - # way the store already holds the batch. + state = _ProducerState(delegate, 0, 0, None) + elif input.batch_index == state.batch_index: + # The last batch again: the store already holds it, and where it + # landed is the answer the original got. self._producers.move_to_end(key) - return AppendOutput() + return AppendOutput(cursor=state.last_cursor) + elif input.batch_index < state.batch_index: + raise StreamProducerError( + f"batch {input.batch_index} was written and is no longer the last " + f"for producer {input.producer_id!r} attempt {input.attempt}" + ) elif input.batch_index != state.batch_index + 1: - raise _bad_request( + raise StreamProducerError( f"batch {input.batch_index} skips ahead of {state.batch_index} for " f"producer {input.producer_id!r} attempt {input.attempt}" ) + if input.sequence != state.sequence: + raise StreamProducerError( + f"sequence {input.sequence} does not continue at {state.sequence} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) payloads = self._payloads(input.payloads) cursor: str | None = None if payloads: - appended = await state.delegate.append(*payloads) + appended = await state.delegate.append(*(RawValue(p) for p in payloads)) cursor = appended.token if appended is not None else None if input.finish: await state.delegate.finish() @@ -233,6 +330,8 @@ async def append( # Recorded only once the store accepted the batch, so a failed append # is not mistaken for a repeat when the caller retries it. state.batch_index = input.batch_index + state.sequence += len(payloads) + state.last_cursor = cursor self._producers[key] = state self._producers.move_to_end(key) while len(self._producers) > self._max_producers: @@ -243,32 +342,46 @@ async def append( def _payloads(encoded: list[bytes] | None) -> list[Payload]: payloads = [] for index, raw in enumerate(encoded or []): - payload = Payload() try: - payload.ParseFromString(raw) + payloads.append(Payload.FromString(raw)) except DecodeError as error: raise _bad_request( f"payloads[{index}] is not a serialized Temporal Payload: {error}" ) from error - payloads.append(payload) return payloads @nexusrpc.handler.sync_operation async def read( self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: - """Answer with the records after the caller's token, or time out.""" - stream = input.stream or "" - topic = input.topic or None + """Answer with the records after the caller's token, or time out. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the store refuses the + token, ``NOT_FOUND`` when it has no such workflow. + """ + try: + return await self._read(ctx, input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _read( + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + _require_topic(input.topic) + stream = self._stream(input.workflow_id, input.run_id) if input.latest_only: - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=stream - ) - return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + return ReadOutput(next_token=(await stream.latest(topic=input.topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + wait = ( + _DEFAULT_READ_WAIT.total_seconds() + if input.wait_ms is None + else input.wait_ms / 1000 + ) if ctx.request_deadline is not None: # The server answers the caller with a timeout at the deadline # whatever this call does, so collecting past it only holds the @@ -279,7 +392,7 @@ async def read( left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN wait = max(0.0, min(wait, left.total_seconds())) after = input.after_token or "" - key = (input.workflow_id, stream, topic or "") + key = (input.workflow_id, input.run_id or "", input.topic) await self._expire_subscriptions() lock = self._read_locks.setdefault(key, asyncio.Lock()) async with lock: @@ -287,34 +400,31 @@ async def read( if subscription is None or subscription.position != after: if subscription is not None: await self._drop(key) - subscription = await self._subscribe( - key, input.workflow_id, stream, topic, after - ) + subscription = self._subscribe(key, stream, input.topic, after) records, next_token = await self._drain(subscription, max_records, wait) subscription.position = next_token subscription.last_used = time.monotonic() - if subscription.done and subscription.records.empty(): - # The store ended the read, as the Workflow Streams delegate - # does when the run closes. Nothing more will arrive on it. + done = ( + subscription.done + and subscription.records.empty() + and subscription.failure is None + ) + if done: + # The store ended the read: the run or chain is closed and the + # tail has been handed over. Nothing more will arrive on it. await self._drop(key) - return ReadOutput(records=records, next_token=next_token) + return ReadOutput(records=records, next_token=next_token, done=done) - async def _subscribe( - self, - key: tuple[str, str, str], - workflow_id: str, - stream: str, - topic: str | None, - after: str, + def _subscribe( + self, key: tuple[str, str, str], stream: StreamHandle, topic: str, after: str ) -> _Subscription: - delegate = await self._delegate.consumer( - self._client, workflow_id=workflow_id, stream=stream - ) - # Raw payloads: the handler frames what the store holds without + # Raw payloads: the handler forwards what the store holds without # decoding it, so an encoding only the caller's codec understands - # passes through untouched. - source = delegate.read( - after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + # passes through untouched. A foreign token is refused right here. + source = stream.read( + topic=topic, + after=Cursor(after) if after else BEGINNING, + result_type=RawValue, ) subscription = _Subscription( records=asyncio.Queue(maxsize=_QUEUE_DEPTH), @@ -334,8 +444,7 @@ async def pump() -> None: subscription.failure = error finally: subscription.done = True - if isinstance(source, AsyncGenerator): - await source.aclose() + await source.aclose() subscription.pump = asyncio.create_task(pump()) self._subscriptions[key] = subscription @@ -354,8 +463,10 @@ async def _drain( if records or remaining <= 0: break if subscription.done: + if subscription.failure is None: + break # Honour the wait even though nothing can arrive, so a - # caller polling a closed stream does not spin on the + # caller polling a failed stream does not spin on the # endpoint. await asyncio.sleep(remaining) break @@ -374,20 +485,19 @@ async def _drain( @staticmethod def _wire(record: StreamRecord[Any]) -> RecordWire: - body = ( - record.value.payload.SerializeToString() - if isinstance(record.value, RawValue) - else b"" - ) - frame = _frame.encode( + # The record read as RawValue carries the stored body untouched; the + # default converter passes a RawValue through, so no encoding happens + # here. + wire = to_wire( + temporalio.converter.DataConverter.default.payload_converter, topic=record.topic, kind=record.kind, - producer=record.producer, + value=record.value, + producer_id=record.producer_id, attempt=record.attempt, sequence=record.sequence, - body=body, ) - return RecordWire(token=record.cursor.token, frame=frame) + return RecordWire(token=record.cursor.token, record=wire.SerializeToString()) async def close(self) -> None: """Release every parked read. @@ -419,20 +529,44 @@ async def _expire_subscriptions(self) -> None: self._read_locks.pop(key, None) -class StreamEndpointError(RuntimeError): - """The stream endpoint refused a call or could not be reached. +class _EndpointFailure(Exception): + """What the transport saw: the endpoint's answer, or the reason it gave none.""" - ``status`` is the HTTP status when the endpoint answered, and ``None`` - when the connection itself failed. - """ - - def __init__(self, message: str, *, status: int | None = None) -> None: - """Carry the endpoint's answer, or the reason it gave none.""" - super().__init__(message) + def __init__(self, detail: str, status: int | None) -> None: + super().__init__(detail) + self.detail = detail self.status = status -def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: +def _translate(failure: _EndpointFailure) -> Exception: + """The exception a caller raises for an endpoint failure. + + The handler names a stream condition by its class in the failure message, + so the same class is raised here; anything else is an ``RPCError`` with + the status the HTTP answer maps to, or ``UNAVAILABLE`` when there was none. + """ + message = failure.detail + try: + parsed = json.loads(message) + if isinstance(parsed, dict) and isinstance(parsed.get("message"), str): + message = parsed["message"] + except ValueError: + pass + if failure.status is not None: + for name, cls in _STREAM_ERRORS.items(): + prefix = f"{name}: " + if message.startswith(prefix): + return cls(message[len(prefix) :]) + status = _HTTP_TO_RPC.get(failure.status, RPCStatusCode.UNKNOWN) + else: + status = RPCStatusCode.UNAVAILABLE + return RPCError(message, status, b"") + + +def _post( + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta +) -> bytes: + timeout_ms = int(timeout.total_seconds() * 1000) request = urllib.request.Request( url, data=body, @@ -446,57 +580,74 @@ def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> method="POST", ) try: - with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: + with urllib.request.urlopen( + request, timeout=(timeout + _ROUND_TRIP_MARGIN).total_seconds() + ) as response: return response.read() except urllib.error.HTTPError as error: - detail = error.read().decode(errors="replace") - raise StreamEndpointError( - f"stream endpoint call failed ({error.code}): {detail}", status=error.code + raise _EndpointFailure( + error.read().decode(errors="replace"), error.code ) from error except urllib.error.URLError as error: - raise StreamEndpointError( - f"stream endpoint unreachable at {url}: {error.reason}" + raise _EndpointFailure( + f"stream endpoint unreachable at {url}: {error.reason}", None ) from error class _Front: - """Everything the caller half needs to reach one endpoint.""" + """Everything a handle needs to reach one endpoint.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - headers: Mapping[str, str], - wait_ms: int, - max_records: int, - ) -> None: - self.base_url = base_url + def __init__(self, streams: NexusStreams, client: Client | None) -> None: + self._streams = streams + self._client = client + data_converter = streams._data_converter + if data_converter is None: + data_converter = ( + client.data_converter + if client is not None + else temporalio.converter.DataConverter.default + ) self.converter = data_converter.payload_converter self.codec = data_converter.payload_codec - self.headers = dict(headers) - self.wait_ms = wait_ms - self.max_records = max_records + self.read_wait = streams._read_wait + self.max_records = streams._max_records + + async def _base_url(self) -> str: + endpoint_id = await self._streams._endpoint_id(self._client) + return ( + f"{self._streams._http_address}/nexus/endpoints/{endpoint_id}" + f"/services/{_SERVICE_NAME}" + ) async def invoke( - self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + self, + operation: str, + request: Any, + output: type[_OutputT], + *, + timeout: timedelta, ) -> _OutputT: # The contract types carry their own JSON encoding, so the raw caller # and the worker serving the operation agree on the body without # either of them spelling the fields out. contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread( - _post, - f"{self.base_url}/{operation}", - contract.to_payloads([request])[0].data, - self.headers, - timeout_ms, - ) + url = f"{await self._base_url()}/{operation}" + try: + raw = await asyncio.to_thread( + _post, + url, + contract.to_payloads([request])[0].data, + self._streams._headers, + timeout, + ) + except _EndpointFailure as failure: + raise _translate(failure) from failure payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it. + """Appends through the stream endpoint; the store behind it does the rest. Calls are serialized and the batch index is committed only once the endpoint answered. A batch whose call raised stays pending and is sent @@ -509,42 +660,50 @@ def __init__( self, front: _Front, workflow_id: str, - stream: str, + run_id: str | None, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on the endpoint.""" + """Bind this producer to ``topic`` on the workflow behind the endpoint.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._sequence = 0 + self._last: Cursor | None = BEGINNING self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None self._lock = asyncio.Lock() + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` through the endpoint.""" + """Append ``values`` through the endpoint and return where the last one landed. + + A repeat answers with the original's position and an empty call with + the last one; ``None`` when the store behind the endpoint learns + positions only at read time. + """ if not values: - return None - payloads = [ - value - if isinstance(value, Payload) - else self._front.converter.to_payloads([value])[0] - for value in values - ] + return self._last + payloads = self._front.converter.to_payloads(list(values)) answer = await self._call(payloads, finish=False) - return Cursor(answer.cursor) if answer.cursor else None + self._last = Cursor(answer.cursor) if answer.cursor else None + return self._last async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" + """Write ``FINISH`` for this producer on this topic.""" await self._call([], finish=True) async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: @@ -566,238 +725,202 @@ async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: await self._send(*self._pending) elif self._pending is not None: return await self._send(*self._pending) - request = self._request(self._batch_index + 1, encoded, finish) + request = AppendInput( + workflow_id=self._workflow_id, + run_id=self._run_id, + topic=self._topic, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + batch_index=self._batch_index + 1, + payloads=encoded, + finish=finish, + ) return await self._send(request, identity, finish) - def _request( - self, batch_index: int, payloads: list[bytes], finish: bool - ) -> AppendInput: - return AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=batch_index, - topic=self._topic, - payloads=payloads, - finish=finish, - ) - async def _send( self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: self._pending = (request, identity, finish) answer = await self._front.invoke( - _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS + _APPEND_OPERATION, request, AppendOutput, timeout=_APPEND_TIMEOUT ) self._batch_index = request.batch_index + self._sequence = request.sequence + len(request.payloads or []) + int(finish) self._pending = None return answer -class NexusConsumer: - """Reads batches from the stream endpoint, re-synthesizing supersession.""" +class NexusStreamHandle: + """One workflow's stream through the endpoint, re-synthesizing supersession.""" - def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: - """Read what ``workflow_id`` publishes, through the endpoint.""" + def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s stream, pinned to ``run_id`` when one is given.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after``, one endpoint batch at a time. + + The token is opaque here, so a cursor from another store is refused by + the store behind the endpoint and raises + :class:`temporalio.streams.StreamCursorError` on the first iteration. + """ + _require_topic(topic) + return self._read(topic, after, result_type) + + async def _read( + self, topic: str, after: Cursor, result_type: type | None ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, one endpoint batch at a time.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() + decoder = RecordDecoder( + self._front.converter, result_type, after=after, warn=logger.warning + ) token = after.token while True: answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, after_token=token, max_records=self._front.max_records, - wait_ms=self._front.wait_ms, + wait_ms=int(self._front.read_wait.total_seconds() * 1000), ), ReadOutput, - timeout_ms=self._front.wait_ms + 5000, + timeout=self._front.read_wait + _ROUND_TRIP_MARGIN, ) for wire in answer.records or []: cursor = Cursor(wire.token) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - wire.frame - ) - except ValueError as error: + record = WireRecord.FromString(wire.record) + except DecodeError as error: # Same answer as every other reader: skip and say so. logger.warning("skipping stream record at %s: %s", cursor, error) continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - value = ( - await self._decode(body, type) if kind is RecordKind.DATA else None - ) - yield StreamRecord( - value=value, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + if self._front.codec is not None and record.HasField("body"): + record.body.CopyFrom( + (await self._front.codec.decode([record.body]))[0] + ) + for out in decoder.decode(cursor, record): + yield out token = answer.next_token or token + if answer.done: + return - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" + async def latest(self, *, topic: str) -> Cursor: + """The newest position on ``topic`` behind the endpoint, for following from now.""" + _require_topic(topic) answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, latest_only=True, ), ReadOutput, - timeout_ms=_APPEND_TIMEOUT_MS, + timeout=_APPEND_TIMEOUT, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING - async def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if self._front.codec is not None: - payload = (await self._front.codec.decode([payload]))[0] - if as_type is None: - return self._front.converter.from_payloads([payload])[0] - return self._front.converter.from_payloads([payload], [as_type])[0] - - -class _NexusProvider: - name = "nexus" - - def __init__(self) -> None: - self._endpoint: str | None = None - self._endpoint_id: str | None = None - self._http_address = "http://127.0.0.1:7243" - self._service = _SERVICE_NAME - self._data_converter: temporalio.converter.DataConverter | None = None - self._client: Any = None - self._headers: dict[str, str] = {} - self._wait_ms = _DEFAULT_WAIT_MS - self._max_records = _DEFAULT_MAX_RECORDS - - def configure(self, **options: Any) -> None: - """Point the caller half at one endpoint. - - ``endpoint`` is the endpoint's name when ``client`` is given, and is - resolved to its id through the operator service on first use; without - a client it has to be the id, because the HTTP ingress dispatches by - id. ``headers`` go on every request, which is where an authorization - header belongs. ``wait_ms`` and ``max_records`` are the read bounds - the caller asks the handler for. - """ - endpoint = options.pop("endpoint", None) - self._http_address = options.pop("http_address", self._http_address) - self._service = options.pop("service", _SERVICE_NAME) - self._data_converter = options.pop("data_converter", None) - self._client = options.pop("client", None) - self._headers = dict(options.pop("headers", None) or {}) - self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) - self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) - if options: - raise TypeError( - "the nexus provider takes endpoint, http_address, service, " - f"data_converter, client, headers, wait_ms and max_records, got " - f"{sorted(options)}" - ) - if not endpoint: - raise TypeError( - "the nexus provider needs endpoint= together with " - "client=, or endpoint= on its own" - ) - self._endpoint = endpoint - self._endpoint_id = None - - def worker_options(self) -> dict[str, Any]: - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - del stream, after, idle_timeout - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_write(self, topic: str) -> WriteSink: - del topic - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - async def _front(self, client: Any) -> _Front: - if self._endpoint is None: - raise RuntimeError("configure the nexus provider before opening handles") - if self._endpoint_id is None: - resolver = self._client if self._client is not None else client - if resolver is None: - self._endpoint_id = self._endpoint - else: - found = await resolver.operator_service.list_nexus_endpoints( - ListNexusEndpointsRequest(name=self._endpoint) - ) - if not found.endpoints: - raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") - self._endpoint_id = found.endpoints[0].id - base_url = ( - f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" - f"/services/{self._service}" - ) - return _Front( - base_url, - self._converter(client), - self._headers, - self._wait_ms, - self._max_records, - ) - - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 ) -> NexusProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) return NexusProducer( - await self._front(client), workflow_id, stream, topic, producer_id, attempt + self._front, self._workflow_id, self._run_id, topic, producer_id, attempt ) - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> NexusConsumer: - return NexusConsumer(await self._front(client), workflow_id, stream) - def _converter(self, client: Any) -> temporalio.converter.DataConverter: - if self._data_converter is not None: - return self._data_converter - if client is None: - return temporalio.converter.DataConverter.default - return client.data_converter +class NexusStreams(StreamProvider): + """The outside half of a provider, over one Nexus endpoint. + Not a worker plugin: a workflow publishes and reads through the storage + provider its worker was given, and this front only serves code outside a + workflow. The endpoint hides which store that is. + """ -_provider.register("nexus", _NexusProvider) + def __init__( + self, + *, + endpoint: str, + http_address: str = "http://127.0.0.1:7243", + headers: Mapping[str, str] | None = None, + read_wait: timedelta = _DEFAULT_READ_WAIT, + max_records: int = _DEFAULT_MAX_RECORDS, + data_converter: temporalio.converter.DataConverter | None = None, + ) -> None: + """Point the front at one endpoint. + + Args: + endpoint: The Nexus endpoint's name, resolved to its id through + the operator service of the client a handle is opened with. + When a handle is opened without a client it has to be the id, + because the HTTP ingress dispatches by id. + http_address: The server's Nexus HTTP ingress. + headers: Sent on every request; where an authorization header + belongs. + read_wait: How long the handler may park a read before answering + with what it has. + max_records: The most records one read answer carries. + data_converter: Overrides the client's converter for record + bodies. A payload codec configured here runs on this side of + the endpoint, so records are encoded before they leave the + process and the handler's worker never holds the key. + """ + if not endpoint: + raise ValueError("endpoint must not be empty") + self._endpoint = endpoint + self._http_address = http_address.rstrip("/") + self._headers = dict(headers or {}) + self._read_wait = read_wait + self._max_records = max_records + self._data_converter = data_converter + self._resolved: str | None = None + self._resolving = asyncio.Lock() + + def workflow_provider(self) -> NoReturn: + """Raise: this front has no workflow half.""" + raise StreamUnsupportedError(_WORKFLOW_SIDE_ERROR) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> NexusStreamHandle: + """A handle on ``workflow_id``'s stream through the endpoint. + + ``client`` is not used for transport: it resolves the endpoint's name + and supplies the data converter when none was configured. + """ + return NexusStreamHandle(_Front(self, client), workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: each call opens and closes its own connection.""" + + async def _endpoint_id(self, client: Client | None) -> str: + if self._resolved is not None: + return self._resolved + async with self._resolving: + if self._resolved is None: + if client is None: + self._resolved = self._endpoint + else: + found = await client.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise ValueError( + f"no nexus endpoint is named {self._endpoint!r}" + ) + self._resolved = found.endpoints[0].id + return self._resolved From 16d69367974ddcefd3d0d7cd012fcac5520ddadf Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 335/831] Covered the Nexus front on the new surface. --- CHANGELOG.md | 15 +- tests/streams/test_nexus_provider.py | 311 +++++++++++++++++---------- 2 files changed, 204 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d6d93c86..3ba06e4c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,12 +39,15 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. -- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus - endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. Its contract is defined in - `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. - Configure it with `data_converter=` to run a payload codec on the caller - side, so records are encoded before they leave the process. +- **Experimental**: `temporalio.streams.providers.nexus.NexusStreams` puts one + Nexus endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store, and + `TemporalStreamsHandler` serves that endpoint by fronting the provider's own + handles. Its contract is defined in `temporal_streams.nexusrpc.yaml` and the + bindings are generated from it; a record crosses as the serialized + `StreamRecord` proto. Configure the front with `data_converter=` to run a + payload codec on the caller side, so records are encoded before they leave + the process. ### Changed diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 77cec6f4e..ecb0e7cf3 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,7 +1,7 @@ """Conformance for the Nexus front. -The caller talks only to the stream endpoint; the handler delegates to a -storage provider, so these tests are the provider-hiding demonstration: +The caller talks only to the stream endpoint; the handler fronts a storage +provider's own handles, so these tests are the provider-hiding demonstration: nothing on the caller side names or could name the store. The loop test runs over the server's Nexus HTTP ingress and is gated behind @@ -32,20 +32,27 @@ import pytest import temporalio.converter -from temporalio import streams from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams import _frame as frame -from temporalio.streams._provider import instance -from temporalio.streams.providers import memory, nexus -from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import ( - StreamEndpointError, - TemporalStreamsHandler, +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, ) +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers import nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.worker import Worker +from tests.helpers import new_worker from tests.streams.test_workflow_streams_provider import EchoLoop, take +from tests.streams.test_workflow_streams_provider import _feed as feed_echo_loop live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", @@ -56,6 +63,8 @@ HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] +INPUTS = "inputs" +DECISIONS = "decisions" @live_only @@ -63,42 +72,34 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front, and it names the # endpoint the way an operator does, by name. - streams.configure(provider="workflow_streams") + store = WorkflowStreamsProvider() client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - front = instance( - "nexus", + front = NexusStreams( endpoint=ENDPOINT, - client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), - wait_ms=5000, + read_wait=timedelta(seconds=5), ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" - handler = TemporalStreamsHandler(client, provider="workflow_streams") + handler = TemporalStreamsHandler(store, client) async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", workflows=[EchoLoop], - **streams.worker_options(), + plugins=[store], ): handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" ) - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + stream = front.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4, timeout=60) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4, 60) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -110,8 +111,9 @@ async def test_interface_loop_through_the_nexus_front(): # An opaque cursor from behind the front resumes a fresh reader # just past the record it names. checkpoint = records[0].cursor - resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2, 60 + ) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) @@ -136,12 +138,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: """Recover the payloads :meth:`encode` wrapped.""" - out: list[Payload] = [] - for payload in payloads: - inner = Payload() - inner.ParseFromString(self._flip(payload.data)) - out.append(inner) - return out + return [Payload.FromString(self._flip(payload.data)) for payload in payloads] @classmethod def _flip(cls, data: bytes) -> bytes: @@ -202,9 +199,9 @@ def _in_process_endpoint( failing = set(fail_after_applying or []) def post( - url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta ) -> bytes: - del headers, timeout_ms + del headers, timeout posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput @@ -216,24 +213,30 @@ def post( _dispatch(handler, operation, request), loop ).result() except nexusrpc.HandlerError as error: - raise StreamEndpointError(str(error), status=400) from error + # The ingress answers a handler error with a failure body and the + # status its type maps to. + status = 404 if error.type is nexusrpc.HandlerErrorType.NOT_FOUND else 400 + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + json.dumps({"message": str(error)}), status + ) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) if operation in failing: failing.discard(operation) - raise StreamEndpointError("connection reset after the handler answered") + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + "connection reset after the handler answered", None + ) return raw return post -def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: - return instance( - "nexus", +def _front(codec: temporalio.converter.PayloadCodec | None) -> NexusStreams: + return NexusStreams( endpoint="in-process", # This endpoint has no other traffic to wait for, so park briefly # rather than for the contract's default. - wait_ms=200, + read_wait=timedelta(milliseconds=200), data_converter=dataclasses.replace( temporalio.converter.DataConverter.default, payload_codec=codec ), @@ -244,28 +247,19 @@ async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, ) -> tuple[list[Any], list[bytes], list[bytes]]: - memory.reset() - streams.configure(provider="memory") + store = MemoryStreams() posted: list[bytes] = [] answered: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = _front(codec) - workflow_id = "wf-codec" + stream = _front(codec).get_stream_handle(None, "wf-codec") - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"secret": "tuna"}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") - records = await take(consumer.read(type=dict), 2, timeout=30) - memory.reset() + records = await take(stream.read(topic=INPUTS, result_type=dict), 2, timeout=30) + await handler.close() return records, posted, answered @@ -281,7 +275,8 @@ def _answered_bodies(answered: list[bytes]) -> bytes: out = b"" for body in answered: for record in json.loads(body).get("records", []): - out += frame.decode(base64.b64decode(record["frame"]))[5] + wire = WireRecord.FromString(base64.b64decode(record["record"])) + out += wire.body.SerializeToString() return out @@ -315,14 +310,21 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( def _append( - workflow_id: str, batch_index: int, *values: Any, finish: bool = False + workflow_id: str, + batch_index: int, + *values: Any, + sequence: int | None = None, + finish: bool = False, ) -> AppendInput: converter = temporalio.converter.DataConverter.default.payload_converter return AppendInput( workflow_id=workflow_id, - stream="inputs", + topic=INPUTS, producer_id="model", attempt=1, + # Batches of one, numbered in step with the batch index unless a + # case wants them out of step. + sequence=batch_index - 1 if sequence is None else sequence, batch_index=batch_index, payloads=[ converter.to_payloads([value])[0].SerializeToString() for value in values @@ -331,57 +333,62 @@ def _append( ) -async def _stored(workflow_id: str) -> list[Any]: - consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") +async def _stored(store: MemoryStreams, workflow_id: str) -> list[Any]: + stream = store.get_stream_handle(None, workflow_id) + end = await stream.latest(topic=INPUTS) + if end == BEGINNING: + return [] out: list[Any] = [] - async for record in consumer.read(type=dict): + async for record in stream.read(topic=INPUTS, result_type=dict): if record.kind is RecordKind.DATA: out.append(record.value) - if await consumer.latest() == record.cursor: + if record.cursor == end: break return out -@pytest.fixture -def _memory_store(): # pyright: ignore[reportUnusedFunction] - memory.reset() - streams.configure(provider="memory") - yield - memory.reset() - - -@pytest.mark.usefixtures("_memory_store") async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): # A second handler instance stands in for a restarted or load-balanced # handler worker: it shares the store but not the dedupe state. - first = TemporalStreamsHandler(None, provider="memory") - second = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + first = TemporalStreamsHandler(store, None) + second = TemporalStreamsHandler(store, None) await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) with pytest.raises(nexusrpc.HandlerError) as failed: await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST assert failed.value.retryable_override is False + # Named so the caller can raise the same class. + assert str(failed.value).startswith("StreamProducerError: ") # The store holds the first batch and nothing was silently lost or doubled. - assert await _stored("wf") == [{"n": 1}] + assert await _stored(store, "wf") == [{"n": 1}] -@pytest.mark.usefixtures("_memory_store") -async def test_the_handler_drops_repeats_and_rejects_gaps(): - handler = TemporalStreamsHandler(None, provider="memory") +async def test_the_handler_answers_repeats_and_rejects_gaps(): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) - await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - # An exact repeat is dropped with a success answer and no position. + second = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # A repeat of the last batch is written once and answers with where the + # original landed, so a retrying caller checkpoints the same position. repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - assert repeat.cursor is None - with pytest.raises(nexusrpc.HandlerError) as failed: + assert repeat.cursor == second.cursor + with pytest.raises(nexusrpc.HandlerError) as skipped: await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) - assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert skipped.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + with pytest.raises(nexusrpc.HandlerError) as behind: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + assert str(behind.value).startswith("StreamProducerError: ") + with pytest.raises(nexusrpc.HandlerError) as renumbered: + await _dispatch( + handler, APPEND_OPERATION, _append("wf", 3, {"n": 3}, sequence=7) + ) + assert "sequence 7 does not continue at 2" in str(renumbered.value) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] -@pytest.mark.usefixtures("_memory_store") async def test_a_malformed_payload_is_the_callers_fault(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) request = _append("wf", 1) request.payloads = [b"\xff\xfe not a payload"] with pytest.raises(nexusrpc.HandlerError) as failed: @@ -389,12 +396,12 @@ async def test_a_malformed_payload_is_the_callers_fault(): assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST -@pytest.mark.usefixtures("_memory_store") async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -402,28 +409,41 @@ async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # A transport failure is an RPCError, never the transport's own type. + with pytest.raises(RPCError) as failed: await producer.append({"n": 1}) - await producer.append({"n": 1}) + assert failed.value.status == RPCStatusCode.UNAVAILABLE + landed = await producer.append({"n": 1}) await producer.append({"n": 2}) await producer.finish() indexes = [json.loads(body)["batch_index"] for body in posted] - # The retry re-sent index 1, which the handler dropped as a repeat, so - # the store holds each record once. + sequences = [json.loads(body)["sequence"] for body in posted] + # The retry re-sent index 1, which the handler answered as a repeat with + # the original's position, so the store holds each record once. assert indexes == [1, 1, 2, 3] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert sequences == [0, 0, 1, 2] + assert landed == await _memory_position(store, "wf", 0) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def _memory_position( + store: MemoryStreams, workflow_id: str, index: int +) -> Cursor: + records = await take( + store.get_stream_handle(None, workflow_id).read(topic=INPUTS, result_type=dict), + index + 1, + ) + return records[index].cursor -@pytest.mark.usefixtures("_memory_store") async def test_a_failed_append_goes_out_before_the_next_one( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -431,28 +451,52 @@ async def test_a_failed_append_goes_out_before_the_next_one( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + with pytest.raises(RPCError): await producer.append({"n": 1}) # The caller moves on without retrying; the pending batch is replayed # first under its own index and the new one takes the next. await producer.append({"n": 2}) indexes = [json.loads(body)["batch_index"] for body in posted] assert indexes == [1, 1, 2] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def test_a_stream_condition_crosses_the_endpoint_under_its_own_class( + monkeypatch: pytest.MonkeyPatch, +): + handler = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + stream = _front(None).get_stream_handle(None, "wf") + # The token is opaque on this side, so the store behind the endpoint is + # what refuses it, and the refusal arrives on the first read as the class + # the store raised. + with pytest.raises(StreamCursorError): + await take(stream.read(topic=INPUTS, after=Cursor("elsewhere:1")), 1) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + # A second handler has no state for the attempt; the caller learns that + # as a producer conflict. + fresh = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(fresh, [], [])) + with pytest.raises(StreamProducerError): + await producer.append({"n": 2}) + await handler.close() + + +def test_the_front_has_no_workflow_half(): + with pytest.raises(StreamUnsupportedError): + _front(None).workflow_provider() -@pytest.mark.usefixtures("_memory_store") async def test_consecutive_reads_share_one_parked_subscription(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) first = await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, max_records=1, wait_ms=200), ) assert len(first.records) == 1 parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] @@ -464,7 +508,7 @@ async def test_consecutive_reads_share_one_parked_subscription(): READ_OPERATION, ReadInput( workflow_id="wf", - stream="inputs", + topic=INPUTS, after_token=first.next_token, max_records=1, wait_ms=200, @@ -477,21 +521,56 @@ async def test_consecutive_reads_share_one_parked_subscription(): await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=200), ) assert len(parked) == 1 and next(iter(parked.values())).pump is not pump await handler.close() assert not parked -@pytest.mark.usefixtures("_memory_store") async def test_the_read_wait_is_cut_to_the_request_deadline(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) started = asyncio.get_running_loop().time() answer = await handler.read( _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), - ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=60000), ) - assert answer.records == [] and answer.next_token == "" + assert answer.records == [] and answer.next_token == "" and not answer.done assert asyncio.get_running_loop().time() - started < 5 await handler.close() + + +async def test_the_read_ends_when_the_store_ends_it( + client: Client, monkeypatch: pytest.MonkeyPatch +): + # Behind the endpoint sits the Workflow Streams store, whose read ends + # once the run has closed and its tail is served. The front carries that + # end to the caller, whose loop leaves by itself. + store = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + handler = TemporalStreamsHandler(store, client) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + workflow_id = f"streams-nexus-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, plugins=[store]) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await feed_echo_loop(store, client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + stream = _front(None).get_stream_handle(None, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 30) + await handler.close() + assert records == [ + (RecordKind.DATA, {"echo": 1}), + (RecordKind.DATA, {"echo": 2}), + (RecordKind.DATA, {"echo": 3}), + (RecordKind.FINISH, None), + ] From e79e8fadf087196d3f951c05929f5ebbfe0b08f0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 336/831] Pinned Core to the stream revision and regenerated bridge protos. --- .gitmodules | 2 +- .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 613 ++++++-------- .../workflow_activation_pb2.pyi | 68 ++ .../workflow_commands_pb2.py | 800 +++++++----------- .../workflow_commands_pb2.pyi | 90 ++ temporalio/bridge/sdk-core | 2 +- 7 files changed, 737 insertions(+), 840 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..ae7639820 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamMessages, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamMessages", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..0e1b3a1e6 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,430 +2,311 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.update.v1 import ( - message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, -) -from temporalio.bridge.proto.activity_result import ( - activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' -) - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ - "HeadersEntry" -] -_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStart" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartSuccess" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartFailure" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartCancelled" -] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecution" -] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveSignalExternalWorkflow" -] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveRequestCancelExternalWorkflow" -] -_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveNexusOperationStart" -] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] -WorkflowActivation = _reflection.GeneratedProtocolMessageType( - "WorkflowActivation", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }, -) + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] +_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] +_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] +WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( - "WorkflowActivationJob", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }, -) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }) _sym_db.RegisterMessage(WorkflowActivationJob) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType( - "InitializeWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _INITIALIZEWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }, -) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }) +_sym_db.RegisterMessage(DeliverStreamMessages) + +InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _INITIALIZEWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType( - "FireTimer", - (_message.Message,), - { - "DESCRIPTOR": _FIRETIMER, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }, -) +FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { + 'DESCRIPTOR' : _FIRETIMER, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType( - "ResolveActivity", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEACTIVITY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }, -) +ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }, -) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartSuccess", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }, -) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartFailure", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }, -) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartCancelled", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }, -) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }, -) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( - "UpdateRandomSeed", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERANDOMSEED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }, -) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERANDOMSEED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType( - "QueryWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _QUERYWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }, -) +QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _QUERYWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }, -) +CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType( - "SignalWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }, -) +SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType( - "NotifyHasPatch", - (_message.Message,), - { - "DESCRIPTOR": _NOTIFYHASPATCH, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }, -) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { + 'DESCRIPTOR' : _NOTIFYHASPATCH, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveSignalExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }, -) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveRequestCancelExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }, -) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType( - "DoUpdate", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }, - ), - "DESCRIPTOR": _DOUPDATE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }, -) +DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }) + , + 'DESCRIPTOR' : _DOUPDATE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperationStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }, -) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }, -) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType( - "RemoveFromCache", - (_message.Message,), - { - "DESCRIPTOR": _REMOVEFROMCACHE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }, -) +RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { + 'DESCRIPTOR' : _REMOVEFROMCACHE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" - ) - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' + _WORKFLOWACTIVATION._serialized_start=570 + _WORKFLOWACTIVATION._serialized_end=1116 + _WORKFLOWACTIVATIONJOB._serialized_start=1119 + _WORKFLOWACTIVATIONJOB._serialized_end=2582 + _DELIVERSTREAMMESSAGES._serialized_start=2585 + _DELIVERSTREAMMESSAGES._serialized_end=2724 + _INITIALIZEWORKFLOW._serialized_start=2727 + _INITIALIZEWORKFLOW._serialized_end=4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 + _FIRETIMER._serialized_start=4133 + _FIRETIMER._serialized_end=4157 + _RESOLVEACTIVITY._serialized_start=4159 + _RESOLVEACTIVITY._serialized_end=4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 + _UPDATERANDOMSEED._serialized_start=5045 + _UPDATERANDOMSEED._serialized_end=5088 + _QUERYWORKFLOW._serialized_start=5091 + _QUERYWORKFLOW._serialized_end=5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 + _CANCELWORKFLOW._serialized_start=5353 + _CANCELWORKFLOW._serialized_end=5385 + _SIGNALWORKFLOW._serialized_start=5388 + _SIGNALWORKFLOW._serialized_end=5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 + _NOTIFYHASPATCH._serialized_start=5679 + _NOTIFYHASPATCH._serialized_end=5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 + _DOUPDATE._serialized_start=5917 + _DOUPDATE._serialized_end=6248 + _DOUPDATE_HEADERSENTRY._serialized_start=4052 + _DOUPDATE_HEADERSENTRY._serialized_end=4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 + _RESOLVENEXUSOPERATION._serialized_start=6407 + _RESOLVENEXUSOPERATION._serialized_end=6496 + _REMOVEFROMCACHE._serialized_start=6499 + _REMOVEFROMCACHE._serialized_end=6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..eab815fc9 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.update.v1.message_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_messages(self) -> global___DeliverStreamMessages: + """A range of a stream the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +327,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +335,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -368,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -421,6 +431,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_messages", "remove_from_cache", ] | None @@ -1440,6 +1451,63 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0cdc02c6b..ccfa1a016 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,552 +2,408 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" - +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.sdk.v1 import ( - event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, -) -from temporalio.api.sdk.v1 import ( - user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' -) - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] -_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ - "HeadersEntry" -] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ - "RequestCancelLocalActivity" -] -_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CompleteWorkflowExecution" -] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ContinueAsNewWorkflowExecution" -] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "StartChildWorkflowExecution" -] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CancelChildWorkflowExecution" -] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "RequestCancelExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "SignalExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( - _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ - "UpsertWorkflowSearchAttributes" -] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ - "NexusHeaderEntry" -] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ - "RequestCancelNexusOperation" -] -WorkflowCommand = _reflection.GeneratedProtocolMessageType( - "WorkflowCommand", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWCOMMAND, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }, -) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] +_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] +_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] +_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] +WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWCOMMAND, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }) _sym_db.RegisterMessage(WorkflowCommand) -StartTimer = _reflection.GeneratedProtocolMessageType( - "StartTimer", - (_message.Message,), - { - "DESCRIPTOR": _STARTTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }, -) +AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _ADDSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }) +_sym_db.RegisterMessage(AddStreamMessages) + +SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTREAM, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }) +_sym_db.RegisterMessage(SubscribeStream) + +StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { + 'DESCRIPTOR' : _STARTTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType( - "CancelTimer", - (_message.Message,), - { - "DESCRIPTOR": _CANCELTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }, -) +CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { + 'DESCRIPTOR' : _CANCELTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULEACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }, -) +ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleLocalActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULELOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }, -) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }, -) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelLocalActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }, -) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType( - "QueryResult", - (_message.Message,), - { - "DESCRIPTOR": _QUERYRESULT, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }, -) +QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { + 'DESCRIPTOR' : _QUERYRESULT, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType( - "QuerySuccess", - (_message.Message,), - { - "DESCRIPTOR": _QUERYSUCCESS, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }, -) +QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { + 'DESCRIPTOR' : _QUERYSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CompleteWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }, -) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "FailWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _FAILWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }, -) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ContinueAsNewWorkflowExecution", - (_message.Message,), - { - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }, - ), - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }, -) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }) + , + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }, -) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType( - "SetPatchMarker", - (_message.Message,), - { - "DESCRIPTOR": _SETPATCHMARKER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }, -) +SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { + 'DESCRIPTOR' : _SETPATCHMARKER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "StartChildWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }, - ), - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }, - ), - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }, -) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }) + , + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }) + , + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }, -) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "RequestCancelExternalWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }, -) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "SignalExternalWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }, -) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelSignalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELSIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }, -) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( - "UpsertWorkflowSearchAttributes", - (_message.Message,), - { - "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }, -) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { + 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( - "ModifyWorkflowProperties", - (_message.Message,), - { - "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }, -) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { + 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType( - "UpdateResponse", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERESPONSE, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }, -) +UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERESPONSE, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( - "ScheduleNexusOperation", - (_message.Message,), - { - "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( - "NexusHeaderEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }, - ), - "DESCRIPTOR": _SCHEDULENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }, -) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { + + 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( - "RequestCancelNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }, -) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" - ) - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8672 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8760 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4339 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4341 - _REQUESTCANCELACTIVITY._serialized_end = 4377 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4379 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4420 - _QUERYRESULT._serialized_start = 4423 - _QUERYRESULT._serialized_end = 4579 - _QUERYSUCCESS._serialized_start = 4581 - _QUERYSUCCESS._serialized_end = 4646 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4648 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4724 - _FAILWORKFLOWEXECUTION._serialized_start = 4726 - _FAILWORKFLOWEXECUTION._serialized_end = 4800 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4803 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5717 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5719 - _CANCELWORKFLOWEXECUTION._serialized_end = 5795 - _SETPATCHMARKER._serialized_start = 5797 - _SETPATCHMARKER._serialized_end = 5851 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5854 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7028 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7030 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7104 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7107 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7249 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7252 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7651 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7653 - _CANCELSIGNALWORKFLOW._serialized_end = 7688 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7690 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7791 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7793 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7872 - _UPDATERESPONSE._serialized_start = 7875 - _UPDATERESPONSE._serialized_end = 8085 - _SCHEDULENEXUSOPERATION._serialized_start = 8088 - _SCHEDULENEXUSOPERATION._serialized_end = 8626 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8576 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8626 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8628 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8670 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' + _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 + _WORKFLOWCOMMAND._serialized_start=556 + _WORKFLOWCOMMAND._serialized_end=2794 + _ADDSTREAMMESSAGES._serialized_start=2796 + _ADDSTREAMMESSAGES._serialized_end=2891 + _SUBSCRIBESTREAM._serialized_start=2893 + _SUBSCRIBESTREAM._serialized_end=2951 + _STARTTIMER._serialized_start=2953 + _STARTTIMER._serialized_end=3036 + _CANCELTIMER._serialized_start=3038 + _CANCELTIMER._serialized_end=3064 + _SCHEDULEACTIVITY._serialized_start=3067 + _SCHEDULEACTIVITY._serialized_end=3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 + _SCHEDULELOCALACTIVITY._serialized_start=3894 + _SCHEDULELOCALACTIVITY._serialized_end=4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 + _REQUESTCANCELACTIVITY._serialized_start=4646 + _REQUESTCANCELACTIVITY._serialized_end=4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 + _QUERYRESULT._serialized_start=4728 + _QUERYRESULT._serialized_end=4884 + _QUERYSUCCESS._serialized_start=4886 + _QUERYSUCCESS._serialized_end=4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 + _FAILWORKFLOWEXECUTION._serialized_start=5031 + _FAILWORKFLOWEXECUTION._serialized_end=5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELWORKFLOWEXECUTION._serialized_start=6024 + _CANCELWORKFLOWEXECUTION._serialized_end=6100 + _SETPATCHMARKER._serialized_start=6102 + _SETPATCHMARKER._serialized_end=6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELSIGNALWORKFLOW._serialized_start=7958 + _CANCELSIGNALWORKFLOW._serialized_end=7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 + _UPDATERESPONSE._serialized_start=8180 + _UPDATERESPONSE._serialized_end=8390 + _SCHEDULENEXUSOPERATION._serialized_start=8393 + _SCHEDULENEXUSOPERATION._serialized_end=8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index ad4a5f487..040a2267c 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,6 +23,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,10 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: ... + @property + def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( self, *, @@ -215,6 +222,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... def HasField( self, @@ -243,6 +252,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -298,6 +311,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -350,6 +367,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "add_stream_messages", ] | None ): ... @@ -386,6 +405,77 @@ class StartTimer(google.protobuf.message.Message): global___StartTimer = StartTimer +class AddStreamMessages(google.protobuf.message.Message): + """Publish a batch of messages to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand messages cost the same in History as one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessages = AddStreamMessages + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 85b71d7ec..3d1f82e66 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 85b71d7ecd4f2bf677fa1cee17f3fbc1ab10f1b9 +Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 From a3d376fbac2e6217bfdbab7d078c0c2384bee514 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 337/831] Added the vendored stream API protos. --- scripts/gen_stream_protos.py | 161 +++++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 138 ++++ .../api/streamservice/v1/message_pb2.py | 46 ++ .../api/streamservice/v1/message_pb2.pyi | 47 ++ .../api/streamservice/v1/message_pb2_grpc.py | 24 + .../streamservice/v1/request_response_pb2.py | 138 ++++ .../streamservice/v1/request_response_pb2.pyi | 434 ++++++++++++ .../v1/request_response_pb2_grpc.py | 24 + .../api/streamservice/v1/service_pb2.py | 38 ++ .../api/streamservice/v1/service_pb2.pyi | 5 + .../api/streamservice/v1/service_pb2_grpc.py | 616 ++++++++++++++++++ .../api/streamservice/v1/stream_state_pb2.py | 56 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 114 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 24 + 15 files changed, 1865 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..e66f8abb4 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,161 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, "-m", "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--pyi_out={out}", + f"--grpc_python_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..31f99bded --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,138 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + STREAM_MESSAGE_KIND_DATA, + STREAM_MESSAGE_KIND_FLUSH, + STREAM_MESSAGE_KIND_UNSPECIFIED, + StreamMessage, + StreamMessageBatch, + StreamMessageKind, +) + +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "STREAM_MESSAGE_KIND_DATA", + "STREAM_MESSAGE_KIND_FLUSH", + "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamLifecycle", + "StreamListEntry", + "StreamMessage", + "StreamMessageBatch", + "StreamMessageKind", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..b4fe8e68a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/message.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/message.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z None: ... + BODY_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + body: _message_pb2.Payload + metadata: _containers.MessageMap[str, _message_pb2.Payload] + topic: str + topic_sequence: int + kind: StreamMessageKind + offset: int + def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + +class StreamMessageBatch(_message.Message): + __slots__ = ("messages",) + MESSAGES_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] + def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..b1383816d --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..60dafee45 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/request_response.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/request_response.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + +class CreateStreamOutput(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class AddMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + expected_offset: int + use_expected_offset: bool + owner_epoch: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + +class AddMessagesOutput(_message.Message): + __slots__ = ("first_offset", "next_offset", "count", "deduplicated") + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] + first_offset: int + next_offset: int + count: int + deduplicated: bool + def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + +class FinishWritingInput(_message.Message): + __slots__ = ("namespace", "stream_id", "producer_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + producer_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + +class FinishWritingOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SubscribeWorkflowInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + stream_id: str + start_offset: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class SubscribeWorkflowOutput(_message.Message): + __slots__ = ("start_offset",) + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + start_offset: int + def __init__(self, start_offset: _Optional[int] = ...) -> None: ... + +class PollMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class PollMessagesOutput(_message.Message): + __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") + MESSAGES_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + next_offset: int + head_offset: int + closed: bool + close_reason: _message_pb2_1.Payload + def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class DescribeStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class PollWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class DescribeWorkflowStreamInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + +class AddWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + +class DescribeStreamOutput(_message.Message): + __slots__ = ("state",) + STATE_FIELD_NUMBER: _ClassVar[int] + state: _stream_state_pb2.StreamState + def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + +class CloseStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "reason") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + reason: _message_pb2_1.Payload + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class CloseStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TruncateStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "new_base_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + new_base_offset: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + +class TruncateStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class DeleteStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class CreateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CreateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + +class CreateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CreateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + +class AddMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + +class AddMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class FinishWritingRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: FinishWritingInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + +class FinishWritingResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: FinishWritingOutput + def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: SubscribeWorkflowInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: SubscribeWorkflowOutput + def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + +class PollMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + +class PollMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeWorkflowStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class CloseStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CloseStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + +class CloseStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CloseStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + +class TruncateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: TruncateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + +class TruncateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: TruncateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + +class ListStreamsInput(_message.Message): + __slots__ = ("namespace", "page_size", "next_page_token", "query") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + namespace: str + page_size: int + next_page_token: bytes + query: str + def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + +class StreamListEntry(_message.Message): + __slots__ = ("stream_id", "run_id") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + stream_id: str + run_id: str + def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + +class ListStreamsOutput(_message.Message): + __slots__ = ("streams", "next_page_token") + STREAMS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] + next_page_token: bytes + def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + +class ListStreamsRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: ListStreamsInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + +class ListStreamsResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: ListStreamsOutput + def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + +class DeleteStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DeleteStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + +class DeleteStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DeleteStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..87cc91022 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..7f376c28e --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class StreamServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True) + self.AddMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True) + self.FinishWriting = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True) + self.SubscribeWorkflow = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True) + self.PollMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True) + self.DescribeStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True) + self.PollWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True) + self.DescribeWorkflowStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True) + self.AddWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True) + self.CloseStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True) + self.TruncateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True) + self.ListStreams = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True) + self.DeleteStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True) + + +class StreamServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def CreateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinishWriting(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeWorkflow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollWorkflowMessages(self, request, context): + """Routed on the owner, because the stream it reads has no id of its own. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeWorkflowStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkflowMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TruncateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListStreams(self, request, context): + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_StreamServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateStream': grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + 'AddMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + 'FinishWriting': grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + 'PollMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + 'DescribeStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + 'CloseStream': grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + 'TruncateStream': grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + 'ListStreams': grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + 'DeleteStream': grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class StreamService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinishWriting(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeWorkflow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeWorkflowStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CloseStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def TruncateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListStreams(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..234fa94d0 --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/stream_state.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/stream_state.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z None: ... + class ConsumersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ConsumerCursor + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCERS_FIELD_NUMBER: _ClassVar[int] + CONSUMERS_FIELD_NUMBER: _ClassVar[int] + LIFECYCLE_FIELD_NUMBER: _ClassVar[int] + REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] + head_offset: int + base_offset: int + last_txn_id: int + closed: bool + close_reason: _message_pb2.Payload + owner_epoch: int + bucket_size: int + collection_id: str + producers: _containers.MessageMap[str, ProducerCursor] + consumers: _containers.MessageMap[str, ConsumerCursor] + lifecycle: StreamLifecycle + redirect_run_id: str + close_time: _timestamp_pb2.Timestamp + def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProducerCursor(_message.Message): + __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") + SEQ_FIELD_NUMBER: _ClassVar[int] + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] + FENCED_FIELD_NUMBER: _ClassVar[int] + seq: int + first_offset: int + count: int + content_hash: bytes + fenced: bool + def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + +class ConsumerCursor(_message.Message): + __slots__ = ("workflow_id", "run_id", "offset", "active", "external") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + run_id: str + offset: int + active: bool + external: bool + def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + +class WorkflowStreamCursor(_message.Message): + __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + PENDING_FROM_FIELD_NUMBER: _ClassVar[int] + PENDING_TO_FIELD_NUMBER: _ClassVar[int] + HAS_PENDING_FIELD_NUMBER: _ClassVar[int] + stream_id: str + collection_id: str + bucket_size: int + offset: int + known_head: int + external: bool + pending_from: int + pending_to: int + has_pending: bool + def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + +class StreamLifecycle(_message.Message): + __slots__ = ("retention", "max_items") + RETENTION_FIELD_NUMBER: _ClassVar[int] + MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] + retention: _duration_pb2.Duration + max_items: int + def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..4e128a2aa --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) From e75b2516452e7550e80f00125effd799ff9221ef Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 338/831] Added the stream client and the workflow stream surface. --- temporalio/client_stream.py | 476 +++++++++++++++++++++++ temporalio/worker/_workflow_instance.py | 142 +++++++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 119 ++++++ tests/test_client_stream.py | 128 ++++++ tests/worker/test_workflow_stream.py | 113 ++++++ tests/worker/test_workflow_stream_e2e.py | 244 ++++++++++++ 7 files changed, 1232 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py create mode 100644 tests/worker/test_workflow_stream.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..75388c9c9 --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,476 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` + instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, AsyncIterator, Optional, Sequence + +import google.protobuf.duration_pb2 + +import temporalio.api.common.v1 +import temporalio.api.streamservice.v1 as stream +from temporalio.api.streamservice.v1 import service_pb2_grpc + +__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] + + +@dataclass(frozen=True) +class Message: + """One item read from a stream. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back messages whose offsets are not contiguous. To resume at the + boundary of a whole read, checkpoint the ``next_offset`` that + :meth:`StreamHandle.read` returns instead. + """ + + data: bytes + topic: str = "" + offset: int = 0 + """Where this message sits in the whole stream. + + A topic filter leaves gaps, so a reader that resumes between messages has + to take this rather than count what it received. + """ + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. + """ + + messages: list[Message] + next_offset: int + head_offset: int + closed: bool + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + self._stub = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> "StreamClient": + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + try: + import grpc + except ImportError as err: + raise RuntimeError( + "temporalio.client_stream requires the grpc extra: " + "pip install 'temporalio[grpc]'" + ) from err + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: Optional[float] = None, + max_items: Optional[int] = None, + ) -> "StreamHandle": + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many messages remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await self._stub.CreateStream( + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ) + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> "StreamHandle": + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "" + ) -> "WorkflowStreamHandle": + """Open a stream a workflow publishes to. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.add_stream_messages`` writes to when it is given none. + + The stream is created by the workflow's first publish. Reading one that + does not exist yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when the + workflow publishes. + """ + return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + + +class StreamHandle: + """A handle to one stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append messages and return the offset the first one landed at. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice. Without them the append is at-least-once, which is + only the right trade when duplicates are harmless. + """ + response = await self._stub.AddMessages( + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, returning the messages and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=offset, + topics=list(topics), + wait_new_messages=True, + ) + ) + ) + out = response.frontend_response + for msg in out.messages: + yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) + offset = out.next_offset + if out.closed and offset >= out.head_offset: + return + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await self._stub.FinishWriting( + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ) + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await self._stub.CloseStream( + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await self._stub.DescribeStream( + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow publishes to. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, stub: Any, namespace: str, workflow_id: str, name: str = "" + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await self._stub.AddWorkflowMessages( + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for msg in page.messages: + yield msg + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_messages: int = 0, + wait: bool = True, + ) -> "Page": + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + """ + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return Page( + messages=[ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await self._stub.DescribeWorkflowStream( + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + ) + ) + ) + return response.frontend_response.state diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 26f796e57..66833dd8c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -272,6 +273,71 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# which would replay and re-issue the same rejected command forever, into an +# error the workflow author can see. +_MAX_STREAM_MESSAGES_PER_BATCH = 1000 + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self) -> None: + self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._waiters: list[asyncio.Future] = [] + + def extend( + self, + messages: Sequence[temporalio.api.stream.v1.StreamMessage], + from_offset: int = 0, + ) -> None: + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not messages: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-message field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + self._messages.extend( + temporalio.workflow.DeliveredStreamMessage( + body=message.body.data, + topic=message.topic, + offset=from_offset + index, + ) + for index, message in enumerate(messages) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: + taken, self._messages = self._messages, [] + return taken + + def put_back( + self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._messages[:0] = messages + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._messages) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -401,6 +467,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -616,6 +687,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_messages"): + self._apply_deliver_stream_messages(job.deliver_stream_messages) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1141,6 +1214,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_messages( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer() + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.messages, job.from_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1305,6 +1391,62 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. The + # server treats a repeat subscription to the same stream as a no-op. + self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: + if not messages: + raise ValueError("add_stream_messages needs at least one message") + if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " + f"got {len(messages)}" + ) + command = self._add_command() + command.add_stream_messages.stream_id = stream_id + for body in messages: + # The bodies ride the command and never enter History, so the event + # this produces stays the same size whatever is published here. + message = command.add_stream_messages.messages.add() + message.body.data = body + # Every other Temporal payload names its encoding, and the UI, the + # CLI and any codec server rely on that to decode what they read. + message.body.metadata["encoding"] = b"binary/plain" + message.topic = topic + + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: + return [ + m.body + for m in await self.workflow_read_stream_messages(stream_id, max_messages) + ] + + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[temporalio.workflow.DeliveredStreamMessage]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_messages and len(taken) > max_messages: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_messages:]) + taken = taken[:max_messages] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index f63135bf4..28e711d9b 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -95,6 +95,11 @@ upsert_search_attributes, uuid4, uuid7, + DeliveredStreamMessage, + read_stream, + read_stream_messages, + add_stream_messages, + subscribe_stream, wait_condition, ) from ._definition import ( @@ -233,6 +238,11 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamMessage", + "read_stream", + "read_stream_messages", + "add_stream_messages", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 25523836a..450051456 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -313,6 +313,24 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: ... + + @abstractmethod + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: ... + + @abstractmethod + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[DeliveredStreamMessage]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -949,6 +967,107 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream` returns them. Safe to call again: the server treats + a second subscription to the same stream as a no-op, which is what makes + calling it on every replay harmless. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. + + Args: + stream_id: Stream to consume. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def add_stream_messages( + messages: Sequence[bytes], + *, + stream_id: str = "", + topic: str = "", +) -> None: + """Publish a batch of messages to a stream this workflow owns. + + Returns as soon as the command is issued. The bodies go to the stream's own + log rather than into History, which gets one fixed-size event naming the + offset range, so a batch of a thousand costs History the same as a batch of + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Batch where you can. The event is per call, and a workflow is bounded by the + history event count, so one call with a hundred messages leaves far more + room than a hundred calls with one. + + Args: + messages: Bodies to append, in order. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + topic: Optional topic, which readers can filter on. Offsets are still + assigned over the unfiltered stream. + """ + _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + + +@dataclass(frozen=True) +class DeliveredStreamMessage: + """One message a consuming workflow was given, with where it sat.""" + + body: bytes + topic: str + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_messages( + stream_id: str, *, max_messages: int = 0 +) -> list[DeliveredStreamMessage]: + """Read the next messages, keeping their topic and position. + + Same delivery as :func:`read_stream`. A reader that has to name where it + got to, filter a topic, or hand a position to something outside the + workflow needs more than the bodies. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_messages( + stream_id, max_messages + ) + + +async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: + """Read the next messages of a stream this workflow consumes. + + Waits until at least one message is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. + + Subscribe out of band with the stream client. This only reads what has + already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + + Returns: + The message bodies, in stream order. + """ + return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..f7df3c7a7 --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,128 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import AsyncIterator + +import pytest + +from temporalio.client_stream import StreamClient, StreamHandle + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +@pytest.fixture +async def stream() -> AsyncIterator[StreamHandle]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + finally: + await client.close() + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + assert await stream.append(b"alpha", b"beta") == 0 + assert await stream.append(b"gamma") == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(b"alpha", b"beta", b"gamma") + + messages, next_offset = await stream.read() + assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + assert next_offset == 3 + + messages, next_offset = await stream.read(from_offset=1) + assert [m.data for m in messages] == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(b"alpha") + + messages, next_offset = await stream.read(from_offset=1) + assert messages == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same message twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(b"once", producer_id="p1", sequence=1) + retry = await stream.append(b"once", producer_id="p1", sequence=1) + assert first == retry == 0 + + messages, _ = await stream.read() + assert [m.data for m in messages] == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(b"tok", topic="tokens") + await stream.append(b"prog", topic="progress") + await stream.append(b"tok2", topic="tokens") + + messages, next_offset = await stream.read(topics=["tokens"]) + assert [m.data for m in messages] == [b"tok", b"tok2"] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for message in stream.follow(): + received.append(message.data) + + task = asyncio.create_task(follower()) + await stream.append(b"one") + await asyncio.sleep(0.2) + await stream.append(b"two") + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(b"one", b"two") + await stream.close() + + received = [m.data async for m in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(b"one", b"two") + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..944761cfa --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,113 @@ +"""In-workflow consumption of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering and the workflow-facing read directly, which is the part +this SDK owns; the delivery decision itself lives in the server and sdk-core. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.worker._workflow_instance import ( + _StreamBuffer, + _WorkflowInstanceImpl, +) + + +def message(body: bytes) -> api_stream.StreamMessage: + return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"one"), message(b"two")]) + + assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([message(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert [m.body.data for m in buffer.take()] == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert [m.body.data for m in buffer.take()] == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream``, so a test that reimplements + it proves nothing about the code that ships. + """ + + def __init__(self) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self.read_only_calls: list[str] = [] + + def _assert_not_read_only(self, action: str) -> None: + self.read_only_calls.append(action) + + +@pytest.mark.parametrize("max_messages", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: + stub = _ReadOnlyStub() + bodies = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b) for b in bodies]) + + got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + + assert got == bodies[:max_messages] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + + if len(stub._stream_buffers["s"]): + rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert got + rest == bodies + else: + assert got == bodies + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub() + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b"a")]) + + await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..579327217 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,244 @@ +"""A workflow publishing to a stream it owns and reading its own messages back. + +Path A and Path C together, both from workflow code. Needs a Temporal server +built from the AI-198 branch, because neither the stream service nor the +commands exist on a released one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest +from temporalio.api.enums.v1 import EventType + +from temporalio import workflow +from temporalio.client import Client +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +STREAM = "output" + +# Event type numbers rather than names: this SDK's api protos predate both +# events, so the attributes arrive as unknown fields and only the type is +# readable here. The server's own tests are where the offsets are asserted. +EVENT_STREAM_SUBSCRIBED = 61 +EVENT_STREAM_MESSAGES_ADDED = 62 + + +@workflow.defn +class PublishAndRead: + @workflow.run + async def run(self) -> list[str]: + # Published before subscribing, because a subscription resolves against + # the streams the workflow already owns and this is what creates one. + workflow.add_stream_messages( + [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + ) + workflow.add_stream_messages([b"delta"], stream_id=STREAM) + + workflow.subscribe_stream(STREAM, start_offset=0) + + received: list[str] = [] + while len(received) < 4: + for body in await workflow.read_stream(STREAM): + received.append(body.decode()) + return received + + +async def test_workflow_reads_back_what_it_published() -> None: + client = await Client.connect(TARGET or "") + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=wf_id, task_queue=task_queue + ), + timeout=60, + ) + + assert result == ["alpha", "beta", "gamma", "delta"] + + counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + + # Two calls carrying four messages, so two events: the event is per batch, + # which is what makes batching free. + assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class PublishOnSignal: + """Publishes a token per signal, which is the shape an agent turn has.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + self._done = False + + @workflow.run + async def run(self) -> int: + published = 0 + while True: + await workflow.wait_condition(lambda: self._pending or self._done) + while self._pending: + workflow.add_stream_messages([self._pending.pop(0).encode()]) + published += 1 + if self._done: + return published + + @workflow.signal + async def emit(self, token: str) -> None: + self._pending.append(token) + + @workflow.signal + async def finish(self) -> None: + self._done = True + + +async def test_a_client_follows_what_a_workflow_publishes() -> None: + """The harness shape: the workflow writes, something outside it reads live. + + A stream a workflow owns has no id, so the reader addresses it by the + owner. It also attaches before the first publish, which is what a UI opening + on a session does. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "follow-tq-" + uuid.uuid4().hex[:8] + wf_id = "follow-wf-" + uuid.uuid4().hex[:8] + + tokens = [f"token-{i}" for i in range(5)] + received: list[str] = [] + + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishOnSignal], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + PublishOnSignal.run, id=wf_id, task_queue=task_queue + ) + + # Attached before anything is published, so the stream does not + # exist yet and the first poll has to park rather than fail. + reader = streams.workflow_stream(wf_id) + assert (await reader.describe()).head_offset == 0 + + async def follow() -> None: + async for message in reader.follow(): + received.append(message.data.decode()) + if len(received) == len(tokens): + return + + following = asyncio.ensure_future(follow()) + for token in tokens: + await handle.signal(PublishOnSignal.emit, token) + await asyncio.wait_for(following, timeout=60) + + await handle.signal(PublishOnSignal.finish) + assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) + finally: + await streams.close() + + assert received == tokens + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each `read_stream` that finds nothing + blocks, which ends a Workflow Task, so the run spans several. With the + cache on, every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for body in await workflow.read_stream(stream_id): + seen.append(body.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + Every other end-to-end test here disables it, so the sticky path was never + exercised. The server sends no replay slice for a sticky task, while the + sticky history still carries the previous task's consumed range, and the + two together used to fail every task after the first consumed range. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, + task_queue=task_queue, + workflows=[ConsumeAcrossTasks], + # Left at the default deliberately. This is what the test is for. + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=wf_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append(*[t.encode() for t in batch]) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + # More than one Workflow Task ran, otherwise the test proves nothing. + completed = 0 + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: + completed += 1 + assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + finally: + await streams.close() From 484242c23832ae62c321499d366afa6db28f3dc1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 339/831] Added the Workflow Streams surface over a server-side stream. --- temporalio/contrib/server_streams/__init__.py | 397 ++++++++++++++++++ tests/contrib/test_server_streams.py | 154 +++++++ 2 files changed, 551 insertions(+) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..e831d763c --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,397 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per batch rather than a +Signal per batch. A consumer reads the log directly rather than long-polling an +Update, so there is no per-Workflow limit on how many can read at once, and a +closed Workflow stays readable until its stream's retention expires. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, Optional, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.converter import DataConverter, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still encoded. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + """ + + items: list["WorkflowStreamItem[bytes]"] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _encode(converter: PayloadConverter, value: Any) -> bytes: + """Serialize one value to a stream message body. + + The payload rather than the bare bytes, so the encoding metadata the + consumer needs to decode into a type travels with it. + + The codec chain is not applied. It cannot be applied here: a codec is async + and a Workflow publishing to a stream is not, so running one inside Workflow + code would be I/O on the Workflow thread. Regular payloads solve this in the + Worker, encoding on the way out and decoding on the way in, and a stream + needs the same plumbing before a codec can be honoured. + + It is not applied on the client path either, deliberately. Encoding one side + and not the other is worse than encoding neither: an Activity's messages + would reach a consuming Workflow as ciphertext it has no way to decode. + :func:`_reject_configured_codec` is what keeps that from happening quietly. + """ + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies bypass the codec chain, so proceeding would write payloads + this namespace expects to be encrypted in the clear, and would do it + silently. Raising is the only honest answer until the Worker-side plumbing + exists. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it. Publishing would store them " + "unencoded. Use a client without a codec, or wait for codec support " + "on streams." + ) + + +def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns as soon as the Command is issued. There is nothing to await: + the append is applied in the Workflow Task's own commit, so it costs + this Workflow no round trip and no extra transition. + """ + workflow.add_stream_messages( + [_encode(workflow.payload_converter(), value)], topic=self._name + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic( + self, name: str, *, type: type = object + ) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`.""" + self._handle = handle + self._converter = converter + self._batch_interval = batch_interval + self._buffered: list[tuple[str, Any]] = [] + self._flusher: Optional[asyncio.Task[None]] = None + self._wake = asyncio.Event() + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> "WorkflowStreamClient": + """Open the stream owned by ``workflow_id``.""" + _reject_configured_codec(client) + return cls( + _stream_client(client).workflow_stream(workflow_id), + client.data_converter.payload_converter, + batch_interval, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> "WorkflowStreamClient": + """Open the stream owned by the Workflow that scheduled this Activity.""" + client = activity.client() + return cls.create( + client, activity.info().workflow_id, batch_interval=batch_interval + ) + + async def __aenter__(self) -> "WorkflowStreamClient": + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. + """ + if self._flusher is not None: + self._flusher.cancel() + try: + await self._flusher + except asyncio.CancelledError: + pass + self._flusher = None + await self.flush() + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + async for message in self._handle.follow(from_offset=from_offset, topics=topics): + yield WorkflowStreamItem( + topic=message.topic, + data=_decode(self._converter, message.data, result_type), + offset=message.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> "RawPage": + """One read, with the bodies left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) + for m in page.messages + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + # One append per topic, because a batch carries a single topic. The + # harness case is one topic, so this is one append. + by_topic: dict[str, list[bytes]] = {} + for topic, value in pending: + by_topic.setdefault(topic, []).append(_encode(self._converter, value)) + for topic, bodies in by_topic.items(): + await self._handle.append(*bodies, topic=topic) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while True: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + +# One channel per target, shared by every handle in the process. The channel is +# multiplexed and long-lived, and callers here open a client per subscription, +# which would otherwise be a connection per subscription. +_clients: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop too: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _clients.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _clients[key] = existing + return existing diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..33d86d827 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,154 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow( + Emitting.run, 3, id=wf_id, task_queue=task_queue + ) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] From 17d0d594f8bf675c6a374405badd9f4a27d1ba21 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:57:03 -0700 Subject: [PATCH 340/831] Added the native provider module. --- temporalio/streams/providers/native.py | 398 +++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 temporalio/streams/providers/native.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..f5570b05a --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,398 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server. A workflow publishes with a command that +the server applies in the same transaction that accepts the workflow task, and +consumes ranges the server attaches to the workflow task it dispatches. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_STATE = "__temporal_streams_state" + + +class _Fanout: + """One server subscription, shared by every reader of that stream. + + The server sends a range once. Whoever reads it first would otherwise take + it from the others, so the pull happens here and the result goes to all + live readers. + """ + + def __init__(self, stream: str) -> None: + self._stream = stream + self._subscribers: list[list[tuple[Cursor, bytes]]] = [] + self._pull: asyncio.Future[None] | None = None + + def attach(self) -> list[tuple[Cursor, bytes]]: + queue: list[tuple[Cursor, bytes]] = [] + self._subscribers.append(queue) + return queue + + def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: + if queue in self._subscribers: + self._subscribers.remove(queue) + + async def next_batch( + self, queue: list[tuple[Cursor, bytes]] + ) -> list[tuple[Cursor, bytes]]: + while not queue: + pending = self._pull + if pending is None: + pending = self._pull = asyncio.ensure_future(self._run_pull()) + # Shielded because one reader going away must not cancel a range + # the server will not send again. + await asyncio.shield(pending) + batch, queue[:] = list(queue), [] + return batch + + async def _run_pull(self) -> None: + try: + delivered = await workflow.read_stream_messages(self._stream) + arrived = [ + (Cursor(str(message.offset)), message.body) for message in delivered + ] + for queue in self._subscribers: + queue.extend(arrived) + finally: + self._pull = None + + +def _fanouts() -> dict[str, _Fanout]: + instance = workflow.instance() + state = getattr(instance, _RUN_STATE, None) + if state is None: + state = {} + setattr(instance, _RUN_STATE, state) + return state + + +class _NativeReadSource: + def __init__(self, fanout: _Fanout) -> None: + self._fanout = fanout + self._queue = fanout.attach() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + return await self._fanout.next_batch(self._queue) + + def close(self) -> None: + self._fanout.detach(self._queue) + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Nothing is awaited. The server applies the payload when it accepts + # the task, so there is no back pressure to wait on and no round trip + # to pay for. The signature is awaitable because the contract allows a + # provider that does hold a publisher back. + workflow.add_stream_messages([frame], stream_id="", topic=self._topic) + + +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The server-side id of a workflow's inbound stream. + + A workflow names its streams relative to itself, so every provider can + address the same thing without workflow code knowing how it is stored. + Here that is a namespace-level stream id built from the pair, and the + workflow id rather than the run id because the stream has to survive + continue-as-new and reset. + """ + return f"{workflow_id}:{stream}" + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies do not pass through the codec chain on this provider, so + proceeding would store in the clear what the namespace expects encrypted, + and would do it without saying so. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it" + ) + + +# Streams this process has already opened, so a second producer for the same +# stream reuses the handle rather than asking the server to create it again. +# The second create is answered correctly, and it is still a failed call the +# server logs, which is noise an operator has to learn to ignore. +_handles: dict[str, Any] = {} + + +# One channel per target and namespace, shared by every handle in the process. +# A channel is multiplexed and long lived, and callers open a handle per +# subscription, which would otherwise be a connection per subscription. +_channels: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _channels.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _channels[key] = existing + return existing + + +class NativeProducer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + handle: Any, + converter: Any, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + self._handle = handle + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _provider_id(self) -> str: + """The identity the provider dedupes on. + + The attempt is part of it. Deduplication answers "is this the same + append again", and a second attempt writing different words at the same + sequence is not. Folding the attempt in keeps a retried append idempotent + without letting a new generation be swallowed as a duplicate of the old + one. + """ + return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = await self._handle.append( + *frames, + topic=self._topic, + producer_id=self._provider_id, + # The provider dedupes a retried append on this pair, which is a + # different job from telling readers that a new generation started. + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._handle.append( + frame, + topic=self._topic, + producer_id=self._provider_id, + sequence=self._sequence - 1, + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class NativeConsumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, handle: Any, converter: Any) -> None: + self._handle = handle + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + attempts = AttemptTracker() + async for message in self._handle.follow( + from_offset=int(start.token) if start.token else 0 + ): + cursor = Cursor(str(message.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + message.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NativeProvider: + name = "native" + + def configure(self, **options: Any) -> None: + """Nothing to name: the streams are on the server the client is + already connected to. It exists so a process that switches providers + changes one call rather than its structure.""" + if options: + raise TypeError( + f"the native provider takes no options, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Accepted and ignored. Delivery arrives on workflow tasks the server + # dispatches, so no worker is held between records and there is nothing + # for an idle timeout to release. + del idle_timeout + stream_id = inbound_stream_id(workflow.info().workflow_id, stream) + fanouts = _fanouts() + fanout = fanouts.get(stream_id) + if fanout is None: + workflow.subscribe_stream( + stream_id, start_offset=int(start.token) if start.token else 0 + ) + fanout = fanouts[stream_id] = _Fanout(stream_id) + return _NativeReadSource(fanout) + + def open_write(self, topic: str) -> WriteSink: + return _NativeWriteSink(topic) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + _reject_configured_codec(client) + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + streams = _stream_client(client) + stream_id = inbound_stream_id(workflow_id, stream) + handle = _handles.get(stream_id) + if handle is None: + try: + handle = await streams.create(stream_id) + except Exception: + # Created by whoever set the stream up. A producer opening a + # stream it does not own is the ordinary case, not the + # exception. + handle = streams.get(stream_id) + _handles[stream_id] = handle + return NativeProducer( + handle, + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> NativeConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. Naming one reads that inbound + stream instead, which is how a second consumer follows the same input. + """ + _reject_configured_codec(client) + streams = _stream_client(client) + if stream: + handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + else: + handle = streams.workflow_stream(workflow_id) + return NativeConsumer(handle, client.data_converter.payload_converter) + + +_provider.register("native", _NativeProvider) From 8fe5d8bfc02faed416a818cb1a602e26eef898b1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 341/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/native.py | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f5570b05a..c0044b9cf 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -255,18 +255,18 @@ def __init__(self, handle: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() async for message in self._handle.follow( - from_offset=int(start.token) if start.token else 0 + from_offset=int(after.token) + 1 if after.token else 0 ): cursor = Cursor(str(message.offset)) try: @@ -290,6 +290,16 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one server-side log per stream, whatever the topic + try: + state = await self._handle.describe() + except Exception: + # A stream nobody has published to does not exist yet, and that + # is the same answer as an empty one. + return BEGINNING + return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -317,7 +327,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Accepted and ignored. Delivery arrives on workflow tasks the server @@ -329,7 +339,7 @@ def open_read( fanout = fanouts.get(stream_id) if fanout is None: workflow.subscribe_stream( - stream_id, start_offset=int(start.token) if start.token else 0 + stream_id, start_offset=int(after.token) + 1 if after.token else 0 ) fanout = fanouts[stream_id] = _Fanout(stream_id) return _NativeReadSource(fanout) @@ -342,15 +352,18 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NativeProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the stream the workflow publishes, which the server lets any + producer append to. Inside an activity, leave ``producer_id`` and + ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ _reject_configured_codec(client) if not producer_id: @@ -358,6 +371,14 @@ async def producer( if not attempt: attempt = activity.info().attempt streams = _stream_client(client) + if not stream: + return NativeProducer( + streams.workflow_stream(workflow_id), + client.data_converter.payload_converter, + topic, + producer_id, + attempt, + ) stream_id = inbound_stream_id(workflow_id, stream) handle = _handles.get(stream_id) if handle is None: From 194d258c891bf96cf6608b6c820fbe71336ba251 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:49:04 -0700 Subject: [PATCH 342/831] Read the delivered message shape the buffer now hands back. The buffer holds a body, topic and offset rather than the wire message, and the cap moved to `workflow_read_stream_messages`. --- tests/worker/test_workflow_stream.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 944761cfa..bb0dcf9ba 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -28,7 +28,7 @@ async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() buffer.extend([message(b"one"), message(b"two")]) - assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert [m.body for m in buffer.take()] == [b"one", b"two"] assert len(buffer) == 0 @@ -41,7 +41,7 @@ async def test_buffer_wakes_a_waiting_reader() -> None: buffer.extend([message(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body.data for m in buffer.take()] == [b"late"] + assert [m.body for m in buffer.take()] == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -64,16 +64,21 @@ async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body.data for m in buffer.take()] == [b"early"] + assert [m.body for m in buffer.take()] == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream``, so a test that reimplements - it proves nothing about the code that ships. + The cap lives inside ``workflow_read_stream_messages``, so a test that + reimplements it proves nothing about the code that ships. Borrowing the + method off the real class is what keeps the test on the shipped path. """ + workflow_read_stream_messages = ( + _WorkflowInstanceImpl.workflow_read_stream_messages + ) + def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} self.read_only_calls: list[str] = [] From 561a506e51d5b2926c83007b63f91d0bdd37ed08 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 343/831] Regenerated the protos from the pinned Core. The pinned Core carries the stream additions to the public API, so the command, enum, history and workflow service messages were stale. Only the vendored stream service protos still come from the server checkout. --- temporalio/bridge/_visitor.py | 28 + .../workflow_activation_pb2.py | 626 +++++++------ .../workflow_activation_pb2.pyi | 116 +-- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 823 +++++++++++------- .../workflow_commands_pb2.pyi | 94 +- 6 files changed, 1016 insertions(+), 675 deletions(-) diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..77d1b6c7a 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamMessage( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +367,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_messages"): + await self._visit_coresdk_workflow_activation_DeliverStreamMessages( + fs, o.deliver_stream_messages + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any @@ -492,6 +510,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AddStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -551,6 +575,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("add_stream_messages"): + await self._visit_coresdk_workflow_commands_AddStreamMessages( + fs, o.add_stream_messages + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0e1b3a1e6..cd09b8b97 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,311 +2,447 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') - - +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] -_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] -_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] -WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }) +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.update.v1 import ( + message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.activity_result import ( + activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' +) + + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ + "HeadersEntry" +] +_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStart" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartSuccess" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartFailure" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartCancelled" +] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecution" +] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveSignalExternalWorkflow" +] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveRequestCancelExternalWorkflow" +] +_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveNexusOperationStart" +] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] +WorkflowActivation = _reflection.GeneratedProtocolMessageType( + "WorkflowActivation", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }, +) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( + "WorkflowActivationJob", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }, +) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) - }) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( + "DeliverStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }, +) _sym_db.RegisterMessage(DeliverStreamMessages) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _INITIALIZEWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }) +InitializeWorkflow = _reflection.GeneratedProtocolMessageType( + "InitializeWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _INITIALIZEWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }, +) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { - 'DESCRIPTOR' : _FIRETIMER, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }) +FireTimer = _reflection.GeneratedProtocolMessageType( + "FireTimer", + (_message.Message,), + { + "DESCRIPTOR": _FIRETIMER, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }, +) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }) +ResolveActivity = _reflection.GeneratedProtocolMessageType( + "ResolveActivity", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEACTIVITY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }, +) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartSuccess", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartFailure", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartCancelled", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERANDOMSEED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( + "UpdateRandomSeed", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERANDOMSEED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }, +) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _QUERYWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }) +QueryWorkflow = _reflection.GeneratedProtocolMessageType( + "QueryWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _QUERYWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }, +) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }) +CancelWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }, +) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }) +SignalWorkflow = _reflection.GeneratedProtocolMessageType( + "SignalWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }, +) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { - 'DESCRIPTOR' : _NOTIFYHASPATCH, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType( + "NotifyHasPatch", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYHASPATCH, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }, +) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveSignalExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveRequestCancelExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }) - , - 'DESCRIPTOR' : _DOUPDATE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }) +DoUpdate = _reflection.GeneratedProtocolMessageType( + "DoUpdate", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }, + ), + "DESCRIPTOR": _DOUPDATE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }, +) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperationStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }, +) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }, +) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEFROMCACHE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }) +RemoveFromCache = _reflection.GeneratedProtocolMessageType( + "RemoveFromCache", + (_message.Message,), + { + "DESCRIPTOR": _REMOVEFROMCACHE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }, +) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' - _WORKFLOWACTIVATION._serialized_start=570 - _WORKFLOWACTIVATION._serialized_end=1116 - _WORKFLOWACTIVATIONJOB._serialized_start=1119 - _WORKFLOWACTIVATIONJOB._serialized_end=2582 - _DELIVERSTREAMMESSAGES._serialized_start=2585 - _DELIVERSTREAMMESSAGES._serialized_end=2724 - _INITIALIZEWORKFLOW._serialized_start=2727 - _INITIALIZEWORKFLOW._serialized_end=4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 - _FIRETIMER._serialized_start=4133 - _FIRETIMER._serialized_end=4157 - _RESOLVEACTIVITY._serialized_start=4159 - _RESOLVEACTIVITY._serialized_end=4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 - _UPDATERANDOMSEED._serialized_start=5045 - _UPDATERANDOMSEED._serialized_end=5088 - _QUERYWORKFLOW._serialized_start=5091 - _QUERYWORKFLOW._serialized_end=5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 - _CANCELWORKFLOW._serialized_start=5353 - _CANCELWORKFLOW._serialized_end=5385 - _SIGNALWORKFLOW._serialized_start=5388 - _SIGNALWORKFLOW._serialized_end=5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 - _NOTIFYHASPATCH._serialized_start=5679 - _NOTIFYHASPATCH._serialized_end=5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 - _DOUPDATE._serialized_start=5917 - _DOUPDATE._serialized_end=6248 - _DOUPDATE_HEADERSENTRY._serialized_start=4052 - _DOUPDATE_HEADERSENTRY._serialized_end=4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 - _RESOLVENEXUSOPERATION._serialized_start=6407 - _RESOLVENEXUSOPERATION._serialized_end=6496 - _REMOVEFROMCACHE._serialized_start=6499 - _REMOVEFROMCACHE._serialized_end=6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" + ) + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" + _WORKFLOWACTIVATION._serialized_start = 570 + _WORKFLOWACTIVATION._serialized_end = 1116 + _WORKFLOWACTIVATIONJOB._serialized_start = 1119 + _WORKFLOWACTIVATIONJOB._serialized_end = 2582 + _DELIVERSTREAMMESSAGES._serialized_start = 2585 + _DELIVERSTREAMMESSAGES._serialized_end = 2724 + _INITIALIZEWORKFLOW._serialized_start = 2727 + _INITIALIZEWORKFLOW._serialized_end = 4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _FIRETIMER._serialized_start = 4133 + _FIRETIMER._serialized_end = 4157 + _RESOLVEACTIVITY._serialized_start = 4159 + _RESOLVEACTIVITY._serialized_end = 4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 + _UPDATERANDOMSEED._serialized_start = 5045 + _UPDATERANDOMSEED._serialized_end = 5088 + _QUERYWORKFLOW._serialized_start = 5091 + _QUERYWORKFLOW._serialized_end = 5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _CANCELWORKFLOW._serialized_start = 5353 + _CANCELWORKFLOW._serialized_end = 5385 + _SIGNALWORKFLOW._serialized_start = 5388 + _SIGNALWORKFLOW._serialized_end = 5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _NOTIFYHASPATCH._serialized_start = 5679 + _NOTIFYHASPATCH._serialized_end = 5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 + _DOUPDATE._serialized_start = 5917 + _DOUPDATE._serialized_end = 6248 + _DOUPDATE_HEADERSENTRY._serialized_start = 4052 + _DOUPDATE_HEADERSENTRY._serialized_end = 4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 + _RESOLVENEXUSOPERATION._serialized_start = 6407 + _RESOLVENEXUSOPERATION._serialized_end = 6496 + _REMOVEFROMCACHE._serialized_start = 6499 + _REMOVEFROMCACHE._serialized_end = 6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index eab815fc9..5245cd6fc 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,9 +19,9 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -439,6 +439,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" @@ -1451,63 +1508,6 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation -class DeliverStreamMessages(google.protobuf.message.Message): - """Hand a workflow the next range of a stream it subscribed to. - - The range is delivered once, on the task the server decided it belongs to, - and the offsets it covered are recorded in History rather than the payloads. - On replay the server re-supplies the same range by reading the stream again, - so this job appears at the same point with the same contents both times. - - An empty range is still delivered: a task where the subscription saw nothing - is a fact replay has to reproduce, not an absence of one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - FROM_OFFSET_FIELD_NUMBER: builtins.int - TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Id of the stream this range came from.""" - from_offset: builtins.int - """Inclusive.""" - to_offset: builtins.int - """Exclusive. Equal to from_offset when the subscription saw nothing.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - from_offset: builtins.int = ..., - to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "from_offset", - b"from_offset", - "messages", - b"messages", - "stream_id", - b"stream_id", - "to_offset", - b"to_offset", - ], - ) -> None: ... - -global___DeliverStreamMessages = DeliverStreamMessages - class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..44826f2da 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AddStreamMessages, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -21,6 +22,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -28,6 +30,7 @@ __all__ = [ "ActivityCancellationType", + "AddStreamMessages", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -49,6 +52,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index ccfa1a016..3374f951a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,408 +2,583 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.sdk.v1 import ( + event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, +) +from temporalio.api.sdk.v1 import ( + user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' +) + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] -_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] -_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] -_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] -WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWCOMMAND, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] +_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] +_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ + "HeadersEntry" +] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ + "RequestCancelLocalActivity" +] +_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CompleteWorkflowExecution" +] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ContinueAsNewWorkflowExecution" +] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "StartChildWorkflowExecution" +] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CancelChildWorkflowExecution" +] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "RequestCancelExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "SignalExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( + _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UpsertWorkflowSearchAttributes" +] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ + "NexusHeaderEntry" +] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ + "RequestCancelNexusOperation" +] +WorkflowCommand = _reflection.GeneratedProtocolMessageType( + "WorkflowCommand", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWCOMMAND, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }, +) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _ADDSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) - }) +AddStreamMessages = _reflection.GeneratedProtocolMessageType( + "AddStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }, +) _sym_db.RegisterMessage(AddStreamMessages) -SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { - 'DESCRIPTOR' : _SUBSCRIBESTREAM, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) - }) +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) _sym_db.RegisterMessage(SubscribeStream) -StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { - 'DESCRIPTOR' : _STARTTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }) +StartTimer = _reflection.GeneratedProtocolMessageType( + "StartTimer", + (_message.Message,), + { + "DESCRIPTOR": _STARTTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }, +) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { - 'DESCRIPTOR' : _CANCELTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }) +CancelTimer = _reflection.GeneratedProtocolMessageType( + "CancelTimer", + (_message.Message,), + { + "DESCRIPTOR": _CANCELTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }, +) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }) +ScheduleActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULEACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }, +) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleLocalActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULELOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }, +) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }, +) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelLocalActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }, +) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }) +QueryResult = _reflection.GeneratedProtocolMessageType( + "QueryResult", + (_message.Message,), + { + "DESCRIPTOR": _QUERYRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }, +) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { - 'DESCRIPTOR' : _QUERYSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }) +QuerySuccess = _reflection.GeneratedProtocolMessageType( + "QuerySuccess", + (_message.Message,), + { + "DESCRIPTOR": _QUERYSUCCESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }, +) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CompleteWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }, +) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "FailWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _FAILWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }, +) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }) - , - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ContinueAsNewWorkflowExecution", + (_message.Message,), + { + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }, + ), + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }, +) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { - 'DESCRIPTOR' : _SETPATCHMARKER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }) +SetPatchMarker = _reflection.GeneratedProtocolMessageType( + "SetPatchMarker", + (_message.Message,), + { + "DESCRIPTOR": _SETPATCHMARKER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }, +) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }) - , - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }) - , - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "StartChildWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }, + ), + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }, + ), + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "RequestCancelExternalWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "SignalExternalWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelSignalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELSIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }, +) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { - 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( + "UpsertWorkflowSearchAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }, +) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { - 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( + "ModifyWorkflowProperties", + (_message.Message,), + { + "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }, +) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERESPONSE, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }) +UpdateResponse = _reflection.GeneratedProtocolMessageType( + "UpdateResponse", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERESPONSE, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }, +) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { - - 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( + "ScheduleNexusOperation", + (_message.Message,), + { + "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( + "NexusHeaderEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }, + ), + "DESCRIPTOR": _SCHEDULENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }, +) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( + "RequestCancelNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }, +) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' - _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 - _WORKFLOWCOMMAND._serialized_start=556 - _WORKFLOWCOMMAND._serialized_end=2794 - _ADDSTREAMMESSAGES._serialized_start=2796 - _ADDSTREAMMESSAGES._serialized_end=2891 - _SUBSCRIBESTREAM._serialized_start=2893 - _SUBSCRIBESTREAM._serialized_end=2951 - _STARTTIMER._serialized_start=2953 - _STARTTIMER._serialized_end=3036 - _CANCELTIMER._serialized_start=3038 - _CANCELTIMER._serialized_end=3064 - _SCHEDULEACTIVITY._serialized_start=3067 - _SCHEDULEACTIVITY._serialized_end=3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 - _SCHEDULELOCALACTIVITY._serialized_start=3894 - _SCHEDULELOCALACTIVITY._serialized_end=4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 - _REQUESTCANCELACTIVITY._serialized_start=4646 - _REQUESTCANCELACTIVITY._serialized_end=4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 - _QUERYRESULT._serialized_start=4728 - _QUERYRESULT._serialized_end=4884 - _QUERYSUCCESS._serialized_start=4886 - _QUERYSUCCESS._serialized_end=4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 - _FAILWORKFLOWEXECUTION._serialized_start=5031 - _FAILWORKFLOWEXECUTION._serialized_end=5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELWORKFLOWEXECUTION._serialized_start=6024 - _CANCELWORKFLOWEXECUTION._serialized_end=6100 - _SETPATCHMARKER._serialized_start=6102 - _SETPATCHMARKER._serialized_end=6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELSIGNALWORKFLOW._serialized_start=7958 - _CANCELSIGNALWORKFLOW._serialized_end=7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 - _UPDATERESPONSE._serialized_start=8180 - _UPDATERESPONSE._serialized_end=8390 - _SCHEDULENEXUSOPERATION._serialized_start=8393 - _SCHEDULENEXUSOPERATION._serialized_end=8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" + ) + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2794 + _ADDSTREAMMESSAGES._serialized_start = 2796 + _ADDSTREAMMESSAGES._serialized_end = 2891 + _SUBSCRIBESTREAM._serialized_start = 2893 + _SUBSCRIBESTREAM._serialized_end = 2951 + _STARTTIMER._serialized_start = 2953 + _STARTTIMER._serialized_end = 3036 + _CANCELTIMER._serialized_start = 3038 + _CANCELTIMER._serialized_end = 3064 + _SCHEDULEACTIVITY._serialized_start = 3067 + _SCHEDULEACTIVITY._serialized_end = 3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 + _SCHEDULELOCALACTIVITY._serialized_start = 3894 + _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 + _REQUESTCANCELACTIVITY._serialized_start = 4646 + _REQUESTCANCELACTIVITY._serialized_end = 4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 + _QUERYRESULT._serialized_start = 4728 + _QUERYRESULT._serialized_end = 4884 + _QUERYSUCCESS._serialized_start = 4886 + _QUERYSUCCESS._serialized_end = 4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 + _FAILWORKFLOWEXECUTION._serialized_start = 5031 + _FAILWORKFLOWEXECUTION._serialized_end = 5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELWORKFLOWEXECUTION._serialized_start = 6024 + _CANCELWORKFLOWEXECUTION._serialized_end = 6100 + _SETPATCHMARKER._serialized_start = 6102 + _SETPATCHMARKER._serialized_end = 6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELSIGNALWORKFLOW._serialized_start = 7958 + _CANCELSIGNALWORKFLOW._serialized_end = 7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 + _UPDATERESPONSE._serialized_start = 8180 + _UPDATERESPONSE._serialized_end = 8390 + _SCHEDULENEXUSOPERATION._serialized_start = 8393 + _SCHEDULENEXUSOPERATION._serialized_end = 8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 040a2267c..bcf1bf7eb 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,9 +23,9 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -228,6 +228,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -252,10 +254,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -272,6 +270,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -285,6 +285,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -311,10 +313,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -331,6 +329,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -375,38 +375,14 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class StartTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... - def __init__( - self, - *, - seq: builtins.int = ..., - start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> None: ... - -global___StartTimer = StartTimer - class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -444,14 +420,6 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int @@ -476,6 +444,36 @@ class SubscribeStream(google.protobuf.message.Message): global___SubscribeStream = SubscribeStream +class StartTimer(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int + seq: builtins.int + """Lang's incremental sequence number, used as the operation identifier""" + @property + def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + seq: builtins.int = ..., + start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> None: ... + +global___StartTimer = StartTimer + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor From 44c4a50c378789952e6a556dfae6a6288e7b86c1 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 344/831] Sorted and formatted the server-side stream modules. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and `check-protos` reformats what it regenerates. --- scripts/gen_stream_protos.py | 29 +++++++++++++++---- temporalio/client_stream.py | 14 +++++---- temporalio/contrib/server_streams/__init__.py | 12 ++++---- temporalio/streams/providers/native.py | 14 +++++++-- temporalio/workflow/__init__.py | 10 +++---- tests/contrib/test_server_streams.py | 16 ++++++---- tests/worker/test_workflow_stream.py | 4 +-- tests/worker/test_workflow_stream_e2e.py | 6 ++-- 8 files changed, 70 insertions(+), 35 deletions(-) diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index e66f8abb4..f57ff6177 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -34,7 +34,13 @@ # the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` # checkout instead when the submodule is not initialized. UPSTREAM_API = ( - BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + BASE + / "temporalio" + / "bridge" + / "sdk-core" + / "crates" + / "protos" + / "protos" / "api_upstream" ) @@ -43,16 +49,24 @@ def api_proto_path() -> Path: override = os.environ.get("TEMPORAL_API_PROTOS") if override: return Path(override).resolve() - if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + if ( + UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto" + ).is_file(): return UPSTREAM_API raise SystemExit( "no api protos found: initialize the sdk-core submodule or set " "TEMPORAL_API_PROTOS to a temporalio/api checkout" ) + SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") -FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] +FILES = [ + "message.proto", + "stream_state.proto", + "request_response.proto", + "service.proto", +] # Server-only options. They carry shard routing and rate-limit category, which # a client neither reads nor can resolve, since the files defining them are not @@ -63,7 +77,10 @@ def api_proto_path() -> Path: # protoc names a python module after the proto path. These put the generated # modules where this package publishes them. FIX_PY = [ - (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + ( + re.compile(r"from temporalio\.api\.stream\.v1 import"), + "from temporalio.api.streamservice.v1 import", + ), (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), (re.compile(r"from temporal\.api\."), "from temporalio.api."), (re.compile(r"import temporal\.api\."), "import temporalio.api."), @@ -96,7 +113,9 @@ def main() -> None: out.mkdir() subprocess.run( [ - sys.executable, "-m", "grpc_tools.protoc", + sys.executable, + "-m", + "grpc_tools.protoc", f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 75388c9c9..1b5d953bd 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -242,9 +242,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, @@ -401,9 +402,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index e831d763c..b6db1fd7a 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -169,9 +169,7 @@ def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... @overload def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... - def topic( - self, name: str, *, type: type = object - ) -> WorkflowTopicHandle[Any]: + def topic(self, name: str, *, type: type = object) -> WorkflowTopicHandle[Any]: """Bind a topic on this Workflow's stream.""" return WorkflowTopicHandle(name, type) @@ -179,7 +177,9 @@ def topic( class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" - def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + def __init__( + self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client self._name = topic @@ -316,7 +316,9 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown - async for message in self._handle.follow(from_offset=from_offset, topics=topics): + async for message in self._handle.follow( + from_offset=from_offset, topics=topics + ): yield WorkflowStreamItem( topic=message.topic, data=_decode(self._converter, message.data, result_type), diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index c0044b9cf..1243d3784 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -193,7 +193,11 @@ def _provider_id(self) -> str: without letting a new generation be swallowed as a duplicate of the old one. """ - return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) async def append(self, *values: Any) -> Cursor: """Append values and return where the first one landed.""" @@ -240,7 +244,9 @@ async def finish(self) -> None: def _encode(self, value: Any) -> bytes: payload = ( - value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] ) return payload.SerializeToString() @@ -298,7 +304,9 @@ async def latest(self, *, topic: str | None = None) -> Cursor: # A stream nobody has published to does not exist yet, and that # is the same answer as an empty one. return BEGINNING - return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + return ( + Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + ) def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 28e711d9b..8d57b75e7 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,6 +58,7 @@ wait, ) from ._context import ( + DeliveredStreamMessage, Info, ParentInfo, RootInfo, @@ -65,6 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, + add_stream_messages, cancellation_reason, current_update_info, deprecate_patch, @@ -86,20 +88,18 @@ payload_converter, random, random_seed, + read_stream, + read_stream_messages, register_random_seed_callback, set_current_details, sleep, + subscribe_stream, time, time_ns, upsert_memo, upsert_search_attributes, uuid4, uuid7, - DeliveredStreamMessage, - read_stream, - read_stream_messages, - add_stream_messages, - subscribe_stream, wait_condition, ) from ._definition import ( diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 33d86d827..e1fe84c77 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -103,7 +103,9 @@ async def read() -> None: # The Workflow's own publishes bracket the Activity's, and both are on one # log in the order the server took them. - assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + [ + "workflow" + ] assert seen[0].text == "turn started" assert seen[-1].text == "turn ended" assert offsets == list(range(tokens + 2)) @@ -115,7 +117,9 @@ async def read() -> None: assert await late.get_offset() == tokens + 2 replayed = [ item.data.text - async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in late.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert replayed == [e.text for e in seen] @@ -132,14 +136,14 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: activities=[emit_from_activity], max_cached_workflows=0, ): - await client.execute_workflow( - Emitting.run, 3, id=wf_id, task_queue=task_queue - ) + await client.execute_workflow(Emitting.run, 3, id=wf_id, task_queue=task_queue) stream = WorkflowStreamClient.create(client, wf_id) first = [ item - async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert len(first) == 5 diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index bb0dcf9ba..40d6fdf45 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -75,9 +75,7 @@ class _ReadOnlyStub: method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = ( - _WorkflowInstanceImpl.workflow_read_stream_messages - ) + workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 579327217..00d0dfa85 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,9 +17,9 @@ import uuid import pytest -from temporalio.api.enums.v1 import EventType from temporalio import workflow +from temporalio.api.enums.v1 import EventType from temporalio.client import Client from temporalio.worker import Worker @@ -239,6 +239,8 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: async for event in client.get_workflow_handle(wf_id).fetch_history_events(): if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: completed += 1 - assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + assert completed >= 3, ( + f"only {completed} workflow tasks, sticky path not exercised" + ) finally: await streams.close() From 3df4f3952558caa7f3989b6d71fb860a6af3ee43 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:30 -0700 Subject: [PATCH 345/831] Made the server-side stream modules pass the type and doc linters. A Standalone Activity has no `workflow_id`, so opening its Workflow's stream now says that rather than sending `None` on the wire. `Optional` and `typing.Sequence` are deprecated spellings the linter rejects. --- temporalio/client_stream.py | 7 +++-- temporalio/contrib/server_streams/__init__.py | 29 +++++++++++-------- temporalio/streams/providers/native.py | 12 ++++++-- tests/test_client_stream.py | 2 +- tests/worker/test_workflow_stream.py | 13 +++++++-- tests/worker/test_workflow_stream_e2e.py | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1b5d953bd..8280b56d4 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,8 +23,9 @@ from __future__ import annotations +from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass -from typing import Any, AsyncIterator, Optional, Sequence +from typing import Any import google.protobuf.duration_pb2 @@ -102,8 +103,8 @@ async def create( self, stream_id: str, *, - retention: Optional[float] = None, - max_items: Optional[int] = None, + retention: float | None = None, + max_items: int | None = None, ) -> "StreamHandle": """Create a stream and return a handle to it. diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index b6db1fd7a..c15184bf4 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -20,16 +20,17 @@ from __future__ import annotations import asyncio +import builtins from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from datetime import timedelta -from typing import Any, Generic, Optional, TypeVar, overload +from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient, WorkflowStreamHandle -from temporalio.converter import DataConverter, PayloadConverter +from temporalio.converter import PayloadConverter __all__ = [ "RawPage", @@ -109,7 +110,7 @@ def _reject_configured_codec(client: Client) -> None: ) -def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: +def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) if as_type is None: @@ -210,8 +211,9 @@ def subscribe( self, *, from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + # Spelled out because `type` in this class body is the property below. + result_type: builtins.type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[T]]: """Read this topic from ``from_offset`` onwards.""" return self._client.subscribe( @@ -236,7 +238,7 @@ def __init__( self._converter = converter self._batch_interval = batch_interval self._buffered: list[tuple[str, Any]] = [] - self._flusher: Optional[asyncio.Task[None]] = None + self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() @classmethod @@ -260,10 +262,13 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - client = activity.client() - return cls.create( - client, activity.info().workflow_id, batch_interval=batch_interval - ) + workflow_id = activity.info().workflow_id + if workflow_id is None: + raise RuntimeError( + "no Workflow stream to open: this Activity was not started by a " + "Workflow" + ) + return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -307,8 +312,8 @@ async def subscribe( *, topics: Sequence[str] = (), from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + result_type: type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[Any]]: """Yield items from ``from_offset`` as they arrive. diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 1243d3784..53d231174 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -171,6 +171,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle self._converter = converter self._topic = topic @@ -255,6 +256,7 @@ class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, handle: Any, converter: Any) -> None: + """Read the stream ``handle`` names, from anywhere.""" self._handle = handle self._converter = converter @@ -297,6 +299,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() @@ -320,9 +323,12 @@ class _NativeProvider: name = "native" def configure(self, **options: Any) -> None: - """Nothing to name: the streams are on the server the client is - already connected to. It exists so a process that switches providers - changes one call rather than its structure.""" + """Take no options. + + The streams are on the server the client is already connected to. + This exists so a process that switches providers changes one call + rather than its structure. + """ if options: raise TypeError( f"the native provider takes no options, got {sorted(options)}" diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index f7df3c7a7..8d1a42f30 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -14,7 +14,7 @@ import asyncio import os import uuid -from typing import AsyncIterator +from collections.abc import AsyncIterator import pytest diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 40d6fdf45..1d154b37c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -9,6 +9,7 @@ from __future__ import annotations import asyncio +from typing import Any import pytest @@ -84,6 +85,12 @@ def __init__(self) -> None: def _assert_not_read_only(self, action: str) -> None: self.read_only_calls.append(action) + async def read(self, stream: str, max_messages: int) -> list[bytes]: + instance: Any = self + return await _WorkflowInstanceImpl.workflow_read_stream( + instance, stream, max_messages + ) + @pytest.mark.parametrize("max_messages", [1, 2, 5]) async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: @@ -92,14 +99,14 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b) for b in bodies]) - got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + got = await stub.read("s", max_messages) assert got == bodies[:max_messages] # Whatever the cap left behind has to still be there: nothing resends it. assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) if len(stub._stream_buffers["s"]): - rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + rest = await stub.read("s", 0) assert got + rest == bodies else: assert got == bodies @@ -112,5 +119,5 @@ async def test_read_is_refused_in_a_read_only_context() -> None: stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + await stub.read("s", 0) assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 00d0dfa85..3ee38fef3 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -104,7 +104,7 @@ def __init__(self) -> None: async def run(self) -> int: published = 0 while True: - await workflow.wait_condition(lambda: self._pending or self._done) + await workflow.wait_condition(lambda: bool(self._pending) or self._done) while self._pending: workflow.add_stream_messages([self._pending.pop(0).encode()]) published += 1 From a52f0db90b1d9b984b14234725cbaf184ce17c1a Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:38 -0700 Subject: [PATCH 346/831] Added the changelog entry for server-side streams. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06eb5da58..115b0d3dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,13 @@ to include examples, links to docs, or any other relevant information. the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: server-side streams. A workflow reads a stream the server + delivers on its Workflow Tasks and publishes with a command, through + `temporalio.workflow.read_stream`, `subscribe_stream` and + `add_stream_messages`. `temporalio.client_stream` and + `temporalio.contrib.server_streams` reach the same stream from outside a + workflow, and `temporalio.streams.providers.native` puts it behind the shared + stream interface. Requires a server that serves the stream service. ### Changed From 9ed7d6e06b7c5e81286cff2874b53fd890b29903 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:45:15 -0700 Subject: [PATCH 347/831] Regenerated the vendored stream protos for protobuf 3. This package has to load on a protobuf 3 runtime, and generated code refuses to load on a runtime older than the one it was built against. The protoc of that generation has no `--pyi_out`, so the stubs come from `mypy-protobuf`, which is what the other generated protos already use. --- scripts/gen_stream_protos.py | 7 +- temporalio/api/streamservice/v1/__init__.py | 16 + .../api/streamservice/v1/message_pb2.py | 97 +- .../api/streamservice/v1/message_pb2.pyi | 215 +- .../api/streamservice/v1/message_pb2_grpc.py | 22 +- .../api/streamservice/v1/message_pb2_grpc.pyi | 4 + .../streamservice/v1/request_response_pb2.py | 993 +++++++- .../streamservice/v1/request_response_pb2.pyi | 2201 +++++++++++++---- .../v1/request_response_pb2_grpc.py | 22 +- .../v1/request_response_pb2_grpc.pyi | 4 + .../api/streamservice/v1/service_pb2.py | 40 +- .../api/streamservice/v1/service_pb2.pyi | 11 +- .../api/streamservice/v1/service_pb2_grpc.py | 751 +++--- .../api/streamservice/v1/service_pb2_grpc.pyi | 195 ++ .../api/streamservice/v1/stream_state_pb2.py | 160 +- .../api/streamservice/v1/stream_state_pb2.pyi | 525 +++- .../streamservice/v1/stream_state_pb2_grpc.py | 22 +- .../v1/stream_state_pb2_grpc.pyi | 4 + temporalio/client_stream.py | 4 +- 19 files changed, 4085 insertions(+), 1208 deletions(-) create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index f57ff6177..6b6487294 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -9,7 +9,9 @@ Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf runtime this package has to load on. Generated code refuses to load on a runtime older than the one it was built against, and these modules end up in -applications that pin protobuf themselves. +applications that pin protobuf themselves. The stubs come from +``mypy-protobuf`` rather than protoc's own ``--pyi_out``, which that +generation of protoc does not have. Two rewrites make the copies compile against this SDK. The server's own routing and API-category options are dropped, because they mean nothing to a @@ -119,8 +121,9 @@ def main() -> None: f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", - f"--pyi_out={out}", f"--grpc_python_out={out}", + f"--mypy_out={out}", + f"--mypy_grpc_out={out}", *targets, ], check=True, diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 31f99bded..7e2ebef29 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -28,6 +28,10 @@ AddWorkflowMessagesInput, AddWorkflowMessagesRequest, AddWorkflowMessagesResponse, + AdvanceConsumerHeadInput, + AdvanceConsumerHeadOutput, + AdvanceConsumerHeadRequest, + AdvanceConsumerHeadResponse, CloseStreamInput, CloseStreamOutput, CloseStreamRequest, @@ -62,6 +66,10 @@ PollWorkflowMessagesInput, PollWorkflowMessagesRequest, PollWorkflowMessagesResponse, + RegisterStreamConsumerInput, + RegisterStreamConsumerOutput, + RegisterStreamConsumerRequest, + RegisterStreamConsumerResponse, StreamListEntry, SubscribeWorkflowInput, SubscribeWorkflowOutput, @@ -81,6 +89,10 @@ "AddWorkflowMessagesInput", "AddWorkflowMessagesRequest", "AddWorkflowMessagesResponse", + "AdvanceConsumerHeadInput", + "AdvanceConsumerHeadOutput", + "AdvanceConsumerHeadRequest", + "AdvanceConsumerHeadResponse", "CloseStreamInput", "CloseStreamOutput", "CloseStreamRequest", @@ -117,6 +129,10 @@ "PollWorkflowMessagesRequest", "PollWorkflowMessagesResponse", "ProducerCursor", + "RegisterStreamConsumerInput", + "RegisterStreamConsumerOutput", + "RegisterStreamConsumerRequest", + "RegisterStreamConsumerResponse", "STREAM_MESSAGE_KIND_DATA", "STREAM_MESSAGE_KIND_FLUSH", "STREAM_MESSAGE_KIND_UNSPECIFIED", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index b4fe8e68a..3bbd8718e 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -1,46 +1,83 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/message.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/message.proto' -) +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ None: ... - BODY_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - TOPIC_FIELD_NUMBER: _ClassVar[int] - TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - KIND_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - body: _message_pb2.Payload - metadata: _containers.MessageMap[str, _message_pb2.Payload] - topic: str - topic_sequence: int - kind: StreamMessageKind - offset: int - def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... - -class StreamMessageBatch(_message.Message): - __slots__ = ("messages",) - MESSAGES_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] - def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys +import typing + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamMessageKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamMessageKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamMessageKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 + STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 + STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 + """Producer signalling a delivery boundary. Carries no body and consumes an + offset like any other message. A consumer uses it to end a turn without + waiting out an idle timeout. + """ + +class StreamMessageKind( + _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper +): ... + +STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 +STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 +STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 +"""Producer signalling a delivery boundary. Carries no body and consumes an +offset like any other message. A consumer uses it to end a turn without +waiting out an idle timeout. +""" +global___StreamMessageKind = StreamMessageKind + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance. The server does not populate this today.""" + topic: builtins.str + topic_sequence: builtins.int + """Position within this topic. The global offset orders the whole stream; + this lets a consumer reason about one topic without decoding the rest. + """ + kind: global___StreamMessageKind.ValueType + offset: builtins.int + """Position in the whole stream, set on read and never stored. A consumer + that resumes at message granularity needs it, and a topic-filtered read + leaves gaps that make it underivable from the response alone. + """ + def __init__( + self, + *, + body: temporal.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + kind: global___StreamMessageKind.ValueType = ..., + offset: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "offset", + b"offset", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... + +global___StreamMessage = StreamMessage + +class StreamMessageBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one log node. The server stores + this serialized and opaque; it decodes only to trim a partial first page or + to apply a topic filter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... + def __init__( + self, + *, + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["messages", b"messages"] + ) -> None: ... + +global___StreamMessageBatch = StreamMessageBatch diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index b1383816d..bf947056a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.pyi b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 60dafee45..b813e2dfc 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -1,138 +1,881 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/request_response.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/request_response.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... - -class CreateStreamOutput(_message.Message): - __slots__ = ("run_id",) - RUN_ID_FIELD_NUMBER: _ClassVar[int] - run_id: str - def __init__(self, run_id: _Optional[str] = ...) -> None: ... - -class AddMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - expected_offset: int - use_expected_offset: bool - owner_epoch: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... - -class AddMessagesOutput(_message.Message): - __slots__ = ("first_offset", "next_offset", "count", "deduplicated") - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] - first_offset: int - next_offset: int - count: int - deduplicated: bool - def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... - -class FinishWritingInput(_message.Message): - __slots__ = ("namespace", "stream_id", "producer_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - producer_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... - -class FinishWritingOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class SubscribeWorkflowInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - stream_id: str - start_offset: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... - -class SubscribeWorkflowOutput(_message.Message): - __slots__ = ("start_offset",) - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - start_offset: int - def __init__(self, start_offset: _Optional[int] = ...) -> None: ... - -class PollMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... - -class PollMessagesOutput(_message.Message): - __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") - MESSAGES_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - next_offset: int - head_offset: int - closed: bool - close_reason: _message_pb2_1.Payload - def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... - -class DescribeStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... - -class PollWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... - -class DescribeWorkflowStreamInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... - -class AddWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... - -class DescribeStreamOutput(_message.Message): - __slots__ = ("state",) - STATE_FIELD_NUMBER: _ClassVar[int] - state: _stream_state_pb2.StreamState - def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... - -class CloseStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "reason") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - REASON_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - reason: _message_pb2_1.Payload - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... - -class CloseStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class TruncateStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "new_base_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - new_base_offset: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... - -class TruncateStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class DeleteStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... - -class DeleteStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class CreateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CreateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... - -class CreateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CreateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... - -class AddMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... - -class AddMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... - -class FinishWritingRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: FinishWritingInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... - -class FinishWritingResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: FinishWritingOutput - def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... - -class SubscribeWorkflowRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: SubscribeWorkflowInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... - -class SubscribeWorkflowResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: SubscribeWorkflowOutput - def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... - -class PollMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... - -class PollMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... - -class DescribeStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... - -class DescribeStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... - -class PollWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... - -class PollWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... - -class DescribeWorkflowStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeWorkflowStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... - -class DescribeWorkflowStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... - -class AddWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... - -class AddWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... - -class CloseStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CloseStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... - -class CloseStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CloseStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... - -class TruncateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: TruncateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... - -class TruncateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: TruncateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... - -class ListStreamsInput(_message.Message): - __slots__ = ("namespace", "page_size", "next_page_token", "query") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - QUERY_FIELD_NUMBER: _ClassVar[int] - namespace: str - page_size: int - next_page_token: bytes - query: str - def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... - -class StreamListEntry(_message.Message): - __slots__ = ("stream_id", "run_id") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - stream_id: str - run_id: str - def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... - -class ListStreamsOutput(_message.Message): - __slots__ = ("streams", "next_page_token") - STREAMS_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] - next_page_token: bytes - def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... - -class ListStreamsRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: ListStreamsInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... - -class ListStreamsResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: ListStreamsOutput - def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... - -class DeleteStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DeleteStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... - -class DeleteStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DeleteStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 +import temporalio.api.streamservice.v1.message_pb2 +import temporalio.api.streamservice.v1.stream_state_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CreateStreamInput(google.protobuf.message.Message): + """The frontend-facing shapes are defined here rather than in the public API + because streams have no public API yet. Keeping them in a nested + frontend_request mirrors the other CHASM libraries, so promoting them later + is a package move rather than a redesign. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def lifecycle( + self, + ) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + lifecycle: temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["lifecycle", b"lifecycle"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "lifecycle", + b"lifecycle", + "namespace", + b"namespace", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___CreateStreamInput = CreateStreamInput + +class CreateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + run_id: builtins.str + def __init__( + self, + *, + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["run_id", b"run_id"] + ) -> None: ... + +global___CreateStreamOutput = CreateStreamOutput + +class AddMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + USE_EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional. Supplying it skips resolving the stream's current run, which is + a persistence lookup on every call. CreateStream returns it. + """ + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Idempotency, all optional. Supply a producer identity and sequence, or an + expected offset, or neither and accept at-least-once. + """ + sequence: builtins.int + expected_offset: builtins.int + """Guarded by use_expected_offset because proto3 optional is not supported + by this repo's helper generator. + """ + use_expected_offset: builtins.bool + owner_epoch: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + expected_offset: builtins.int = ..., + use_expected_offset: builtins.bool = ..., + owner_epoch: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "expected_offset", + b"expected_offset", + "messages", + b"messages", + "namespace", + b"namespace", + "owner_epoch", + b"owner_epoch", + "producer_id", + b"producer_id", + "run_id", + b"run_id", + "sequence", + b"sequence", + "stream_id", + b"stream_id", + "use_expected_offset", + b"use_expected_offset", + ], + ) -> None: ... + +global___AddMessagesInput = AddMessagesInput + +class AddMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FIRST_OFFSET_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + DEDUPLICATED_FIELD_NUMBER: builtins.int + first_offset: builtins.int + next_offset: builtins.int + count: builtins.int + deduplicated: builtins.bool + """True when a retry matched a recorded sequence and nothing was appended.""" + def __init__( + self, + *, + first_offset: builtins.int = ..., + next_offset: builtins.int = ..., + count: builtins.int = ..., + deduplicated: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "count", + b"count", + "deduplicated", + b"deduplicated", + "first_offset", + b"first_offset", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___AddMessagesOutput = AddMessagesOutput + +class FinishWritingInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + producer_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + producer_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___FinishWritingInput = FinishWritingInput + +class FinishWritingOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___FinishWritingOutput = FinishWritingOutput + +class SubscribeWorkflowInput(google.protobuf.message.Message): + """Registers a Workflow as a consumer of a stream it owns. The cursor lands in + the Workflow's own state, so from then on each of its Workflow Tasks carries + the next range and records what it consumed. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Name of the stream within the Workflow, for a stream it owns.""" + stream_id: builtins.str + """Id of a standalone stream in another execution. Exactly one of this and + stream_name is set. + """ + start_offset: builtins.int + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___SubscribeWorkflowInput = SubscribeWorkflowInput + +class SubscribeWorkflowOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + start_offset: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["start_offset", b"start_offset"] + ) -> None: ... + +global___SubscribeWorkflowOutput = SubscribeWorkflowOutput + +class PollMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional, as on AddMessagesInput.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters by exact topic. Offsets are assigned over the unfiltered stream, so + next_offset advances past filtered-out messages too. + """ + wait_new_messages: builtins.bool + """When set and the reader is caught up, block until something arrives, the + stream closes, or the server's long-poll timeout elapses. A timeout returns + an empty response rather than an error, so the caller simply polls again. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + ], + ) -> None: ... + +global___PollMessagesInput = PollMessagesInput + +class PollMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + next_offset: builtins.int + head_offset: builtins.int + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + next_offset: builtins.int = ..., + head_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "closed", + b"closed", + "head_offset", + b"head_offset", + "messages", + b"messages", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___PollMessagesOutput = PollMessagesOutput + +class DescribeStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DescribeStreamInput = DescribeStreamInput + +class PollWorkflowMessagesInput(google.protobuf.message.Message): + """A stream a workflow owns lives inside that workflow's execution, so it has + no standalone id to address it by. It is named by its owner and its name + instead, and routed on the owner. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters as on PollMessagesInput.""" + wait_new_messages: builtins.bool + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___PollWorkflowMessagesInput = PollWorkflowMessagesInput + +class DescribeWorkflowStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput + +class AddWorkflowMessagesInput(google.protobuf.message.Message): + """Appending to a stream a workflow owns, from outside that workflow. The + workflow's own publishes ride its Workflow Task instead. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Optional idempotency, as on AddMessagesInput.""" + sequence: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", + b"messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AddWorkflowMessagesInput = AddWorkflowMessagesInput + +class DescribeStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATE_FIELD_NUMBER: builtins.int + @property + def state(self) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamState: ... + def __init__( + self, + *, + state: temporalio.api.streamservice.v1.stream_state_pb2.StreamState + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> None: ... + +global___DescribeStreamOutput = DescribeStreamOutput + +class CloseStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["reason", b"reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "reason", b"reason", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___CloseStreamInput = CloseStreamInput + +class CloseStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___CloseStreamOutput = CloseStreamOutput + +class TruncateStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + NEW_BASE_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + new_base_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + new_base_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "new_base_offset", + b"new_base_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___TruncateStreamInput = TruncateStreamInput + +class TruncateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___TruncateStreamOutput = TruncateStreamOutput + +class DeleteStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DeleteStreamInput = DeleteStreamInput + +class DeleteStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___DeleteStreamOutput = DeleteStreamOutput + +class CreateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CreateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CreateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CreateStreamRequest = CreateStreamRequest + +class CreateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CreateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CreateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CreateStreamResponse = CreateStreamResponse + +class AddMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddMessagesRequest = AddMessagesRequest + +class AddMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddMessagesResponse = AddMessagesResponse + +class FinishWritingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___FinishWritingInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___FinishWritingInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___FinishWritingRequest = FinishWritingRequest + +class FinishWritingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___FinishWritingOutput: ... + def __init__( + self, + *, + frontend_response: global___FinishWritingOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___FinishWritingResponse = FinishWritingResponse + +class SubscribeWorkflowRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___SubscribeWorkflowInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___SubscribeWorkflowInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___SubscribeWorkflowRequest = SubscribeWorkflowRequest + +class SubscribeWorkflowResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___SubscribeWorkflowOutput: ... + def __init__( + self, + *, + frontend_response: global___SubscribeWorkflowOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___SubscribeWorkflowResponse = SubscribeWorkflowResponse + +class PollMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollMessagesRequest = PollMessagesRequest + +class PollMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollMessagesResponse = PollMessagesResponse + +class DescribeStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeStreamRequest = DescribeStreamRequest + +class DescribeStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeStreamResponse = DescribeStreamResponse + +class PollWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollWorkflowMessagesRequest = PollWorkflowMessagesRequest + +class PollWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollWorkflowMessagesResponse = PollWorkflowMessagesResponse + +class DescribeWorkflowStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeWorkflowStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeWorkflowStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeWorkflowStreamRequest = DescribeWorkflowStreamRequest + +class DescribeWorkflowStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeWorkflowStreamResponse = DescribeWorkflowStreamResponse + +class RegisterStreamConsumerInput(google.protobuf.message.Message): + """Registering a consumer on a stream in another execution. Split out from + SubscribeWorkflow because the two halves live on different shards: the pin + goes on the stream, the cursor goes on the consuming workflow, and a handler + can only reach the shard it was routed to. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + consumer_workflow_id: builtins.str + """The workflow that will consume, which names the pin.""" + start_offset: builtins.int + """Negative means from wherever the stream is when the pin is taken. Resolved + here, where the frontier is, and returned so the cursor records a fact. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + consumer_workflow_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_workflow_id", + b"consumer_workflow_id", + "namespace", + b"namespace", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___RegisterStreamConsumerInput = RegisterStreamConsumerInput + +class RegisterStreamConsumerOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + start_offset: builtins.int + collection_id: builtins.str + """What the consumer needs to address the log, all decided by the stream.""" + bucket_size: builtins.int + known_head: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + known_head: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "known_head", + b"known_head", + "start_offset", + b"start_offset", + ], + ) -> None: ... + +global___RegisterStreamConsumerOutput = RegisterStreamConsumerOutput + +class AdvanceConsumerHeadInput(google.protobuf.message.Message): + """Telling one consumer that the frontier moved. Routed to the consumer, which + is not where the stream lives. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """The run that subscribed. A successor from continue-as-new holds no cursor + for this stream, so pushing the frontier at it would land nowhere. + """ + stream_id: builtins.str + head_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_id: builtins.str = ..., + head_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "head_offset", + b"head_offset", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_id", + b"stream_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput + +class AdvanceConsumerHeadOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput + +class AddWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddWorkflowMessagesRequest = AddWorkflowMessagesRequest + +class AddWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddWorkflowMessagesResponse = AddWorkflowMessagesResponse + +class RegisterStreamConsumerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___RegisterStreamConsumerInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___RegisterStreamConsumerInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___RegisterStreamConsumerRequest = RegisterStreamConsumerRequest + +class RegisterStreamConsumerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___RegisterStreamConsumerOutput: ... + def __init__( + self, + *, + frontend_response: global___RegisterStreamConsumerOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___RegisterStreamConsumerResponse = RegisterStreamConsumerResponse + +class AdvanceConsumerHeadRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AdvanceConsumerHeadInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AdvanceConsumerHeadInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AdvanceConsumerHeadRequest = AdvanceConsumerHeadRequest + +class AdvanceConsumerHeadResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AdvanceConsumerHeadOutput: ... + def __init__( + self, + *, + frontend_response: global___AdvanceConsumerHeadOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AdvanceConsumerHeadResponse = AdvanceConsumerHeadResponse + +class CloseStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CloseStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CloseStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CloseStreamRequest = CloseStreamRequest + +class CloseStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CloseStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CloseStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CloseStreamResponse = CloseStreamResponse + +class TruncateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___TruncateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___TruncateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___TruncateStreamRequest = TruncateStreamRequest + +class TruncateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___TruncateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___TruncateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___TruncateStreamResponse = TruncateStreamResponse + +class ListStreamsInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + QUERY_FIELD_NUMBER: builtins.int + namespace: builtins.str + page_size: builtins.int + next_page_token: builtins.bytes + query: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + page_size: builtins.int = ..., + next_page_token: builtins.bytes = ..., + query: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "next_page_token", + b"next_page_token", + "page_size", + b"page_size", + "query", + b"query", + ], + ) -> None: ... + +global___ListStreamsInput = ListStreamsInput + +class StreamListEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___StreamListEntry = StreamListEntry + +class ListStreamsOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAMS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + @property + def streams( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamListEntry + ]: ... + next_page_token: builtins.bytes + def __init__( + self, + *, + streams: collections.abc.Iterable[global___StreamListEntry] | None = ..., + next_page_token: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "next_page_token", b"next_page_token", "streams", b"streams" + ], + ) -> None: ... + +global___ListStreamsOutput = ListStreamsOutput + +class ListStreamsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___ListStreamsInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___ListStreamsInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___ListStreamsRequest = ListStreamsRequest + +class ListStreamsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___ListStreamsOutput: ... + def __init__( + self, + *, + frontend_response: global___ListStreamsOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___ListStreamsResponse = ListStreamsResponse + +class DeleteStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DeleteStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DeleteStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DeleteStreamRequest = DeleteStreamRequest + +class DeleteStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DeleteStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DeleteStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DeleteStreamResponse = DeleteStreamResponse diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index 87cc91022..bf947056a 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index 7f376c28e..432abfc5c 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -1,38 +1,34 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/service.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/service.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xce\x12\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16RegisterStreamConsumer\x12H.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerResponse"\x00\x12\xa6\x01\n\x13\x41\x64vanceConsumerHead\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) + +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) class StreamServiceStub(object): @@ -35,70 +18,80 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.CreateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + ) self.AddMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + ) self.FinishWriting = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + ) self.SubscribeWorkflow = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + ) self.PollMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + ) self.DescribeStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + ) self.PollWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + ) self.DescribeWorkflowStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + ) self.AddWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + ) + self.RegisterStreamConsumer = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + ) + self.AdvanceConsumerHead = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + ) self.CloseStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + ) self.TruncateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + ) self.ListStreams = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + ) self.DeleteStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + ) class StreamServiceServicer(object): @@ -107,178 +100,204 @@ class StreamServiceServicer(object): def CreateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def FinishWriting(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def SubscribeWorkflow(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollWorkflowMessages(self, request, context): - """Routed on the owner, because the stream it reads has no id of its own. - """ + """Routed on the owner, because the stream it reads has no id of its own.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeWorkflowStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddWorkflowMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def RegisterStreamConsumer(self, request, context): + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def AdvanceConsumerHead(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def TruncateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def ListStreams(self, request, context): """Served on the frontend only: it queries visibility rather than a stream, so there is no business ID to route on and nothing for a shard to answer. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DeleteStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def add_StreamServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'CreateStream': grpc.unary_unary_rpc_method_handler( - servicer.CreateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, - ), - 'AddMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, - ), - 'FinishWriting': grpc.unary_unary_rpc_method_handler( - servicer.FinishWriting, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, - ), - 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( - servicer.SubscribeWorkflow, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, - ), - 'PollMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, - ), - 'DescribeStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, - ), - 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, - ), - 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeWorkflowStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, - ), - 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, - ), - 'CloseStream': grpc.unary_unary_rpc_method_handler( - servicer.CloseStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, - ), - 'TruncateStream': grpc.unary_unary_rpc_method_handler( - servicer.TruncateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, - ), - 'ListStreams': grpc.unary_unary_rpc_method_handler( - servicer.ListStreams, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, - ), - 'DeleteStream': grpc.unary_unary_rpc_method_handler( - servicer.DeleteStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, - ), + "CreateStream": grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + "AddMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + "FinishWriting": grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + "SubscribeWorkflow": grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + "PollMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + "DescribeStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + "PollWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + "DescribeWorkflowStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + "AddWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + "RegisterStreamConsumer": grpc.unary_unary_rpc_method_handler( + servicer.RegisterStreamConsumer, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.SerializeToString, + ), + "AdvanceConsumerHead": grpc.unary_unary_rpc_method_handler( + servicer.AdvanceConsumerHead, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.SerializeToString, + ), + "CloseStream": grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + "TruncateStream": grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + "ListStreams": grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + "DeleteStream": grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) - # This class is part of an EXPERIMENTAL API. +# This class is part of an EXPERIMENTAL API. class StreamService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def CreateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CreateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, options, @@ -289,23 +308,25 @@ def CreateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def AddMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, options, @@ -316,23 +337,25 @@ def AddMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def FinishWriting(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def FinishWriting( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, options, @@ -343,23 +366,25 @@ def FinishWriting(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def SubscribeWorkflow(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def SubscribeWorkflow( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, options, @@ -370,23 +395,25 @@ def SubscribeWorkflow(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def PollMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, options, @@ -397,23 +424,25 @@ def PollMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DescribeStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, options, @@ -424,23 +453,25 @@ def DescribeStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def PollWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, options, @@ -451,23 +482,25 @@ def PollWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DescribeWorkflowStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeWorkflowStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, options, @@ -478,23 +511,25 @@ def DescribeWorkflowStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def AddWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, options, @@ -505,23 +540,83 @@ def AddWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) + + @staticmethod + def RegisterStreamConsumer( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) @staticmethod - def CloseStream(request, + def AdvanceConsumerHead( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def CloseStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, options, @@ -532,23 +627,25 @@ def CloseStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def TruncateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def TruncateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, options, @@ -559,23 +656,25 @@ def TruncateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def ListStreams(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def ListStreams( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, options, @@ -586,23 +685,25 @@ def ListStreams(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DeleteStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DeleteStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, options, @@ -613,4 +714,4 @@ def DeleteStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi new file mode 100644 index 000000000..1530074ec --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi @@ -0,0 +1,195 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import abc + +import grpc + +import temporalio.api.streamservice.v1.request_response_pb2 + +class StreamServiceStub: + def __init__(self, channel: grpc.Channel) -> None: ... + CreateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse, + ] + AddMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse, + ] + FinishWriting: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse, + ] + SubscribeWorkflow: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse, + ] + PollMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse, + ] + DescribeStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse, + ] + PollWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, + ] + """Routed on the owner, because the stream it reads has no id of its own.""" + DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, + ] + AddWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse, + ] + RegisterStreamConsumer: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse, + ] + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + AdvanceConsumerHead: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse, + ] + CloseStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse, + ] + TruncateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse, + ] + ListStreams: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse, + ] + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + DeleteStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse, + ] + +class StreamServiceServicer(metaclass=abc.ABCMeta): + @abc.abstractmethod + def CreateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse: ... + @abc.abstractmethod + def AddMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse: ... + @abc.abstractmethod + def FinishWriting( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse: ... + @abc.abstractmethod + def SubscribeWorkflow( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse + ): ... + @abc.abstractmethod + def PollMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse: ... + @abc.abstractmethod + def DescribeStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse + ): ... + @abc.abstractmethod + def PollWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: + """Routed on the owner, because the stream it reads has no id of its own.""" + @abc.abstractmethod + def DescribeWorkflowStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse: ... + @abc.abstractmethod + def AddWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse + ): ... + @abc.abstractmethod + def RegisterStreamConsumer( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse: + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + @abc.abstractmethod + def AdvanceConsumerHead( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse + ): ... + @abc.abstractmethod + def CloseStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse: ... + @abc.abstractmethod + def TruncateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse + ): ... + @abc.abstractmethod + def ListStreams( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse: + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + @abc.abstractmethod + def DeleteStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse: ... + +def add_StreamServiceServicer_to_server( + servicer: StreamServiceServicer, server: grpc.Server +) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 234fa94d0..2ce5a0451 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -1,22 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/stream_state.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/stream_state.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -24,33 +16,119 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ None: ... - class ConsumersEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: ConsumerCursor - def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCERS_FIELD_NUMBER: _ClassVar[int] - CONSUMERS_FIELD_NUMBER: _ClassVar[int] - LIFECYCLE_FIELD_NUMBER: _ClassVar[int] - REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] - head_offset: int - base_offset: int - last_txn_id: int - closed: bool - close_reason: _message_pb2.Payload - owner_epoch: int - bucket_size: int - collection_id: str - producers: _containers.MessageMap[str, ProducerCursor] - consumers: _containers.MessageMap[str, ConsumerCursor] - lifecycle: StreamLifecycle - redirect_run_id: str - close_time: _timestamp_pb2.Timestamp - def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... - -class ProducerCursor(_message.Message): - __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") - SEQ_FIELD_NUMBER: _ClassVar[int] - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] - FENCED_FIELD_NUMBER: _ClassVar[int] - seq: int - first_offset: int - count: int - content_hash: bytes - fenced: bool - def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... - -class ConsumerCursor(_message.Message): - __slots__ = ("workflow_id", "run_id", "offset", "active", "external") - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - ACTIVE_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - workflow_id: str - run_id: str - offset: int - active: bool - external: bool - def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... - -class WorkflowStreamCursor(_message.Message): - __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - PENDING_FROM_FIELD_NUMBER: _ClassVar[int] - PENDING_TO_FIELD_NUMBER: _ClassVar[int] - HAS_PENDING_FIELD_NUMBER: _ClassVar[int] - stream_id: str - collection_id: str - bucket_size: int - offset: int - known_head: int - external: bool - pending_from: int - pending_to: int - has_pending: bool - def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... - -class StreamLifecycle(_message.Message): - __slots__ = ("retention", "max_items") - RETENTION_FIELD_NUMBER: _ClassVar[int] - MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] - retention: _duration_pb2.Duration - max_items: int - def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.duration_pb2 +import google.protobuf.internal.containers +import google.protobuf.message +import google.protobuf.timestamp_pb2 + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamState(google.protobuf.message.Message): + """Size is O(producers + consumers), never O(messages). Payload bytes live in + the log, not here, which is what keeps this off the CHASM partial-read path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class ProducersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ProducerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ProducerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + class ConsumersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ConsumerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ConsumerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + HEAD_OFFSET_FIELD_NUMBER: builtins.int + BASE_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + PRODUCERS_FIELD_NUMBER: builtins.int + CONSUMERS_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + REDIRECT_RUN_ID_FIELD_NUMBER: builtins.int + CLOSE_TIME_FIELD_NUMBER: builtins.int + head_offset: builtins.int + """Visibility frontier. Readers never observe an offset at or past this.""" + base_offset: builtins.int + """Truncation floor. Offsets below this are gone.""" + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + owner_epoch: builtins.int + """Bumped on ownership change so a stale producer's write fails.""" + bucket_size: builtins.int + """Immutable once set. Offsets roll to a new log tree every bucket_size so no + single storage partition grows with the stream. + """ + collection_id: builtins.str + """Identity of the log this stream writes to. Bucket trees are derived from + it, so there is no per-bucket index to store. + """ + @property + def producers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ProducerCursor + ]: ... + @property + def consumers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ConsumerCursor + ]: ... + @property + def lifecycle(self) -> global___StreamLifecycle: ... + redirect_run_id: builtins.str + """Set when a successor run takes ownership, so an in-flight poll can follow + the chain instead of stalling on a superseded run. + """ + @property + def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: + """Wall-clock close time, used to schedule retention deletion.""" + def __init__( + self, + *, + head_offset: builtins.int = ..., + base_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + owner_epoch: builtins.int = ..., + bucket_size: builtins.int = ..., + collection_id: builtins.str = ..., + producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] + | None = ..., + consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] + | None = ..., + lifecycle: global___StreamLifecycle | None = ..., + redirect_run_id: builtins.str = ..., + close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "lifecycle", + b"lifecycle", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "base_offset", + b"base_offset", + "bucket_size", + b"bucket_size", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "closed", + b"closed", + "collection_id", + b"collection_id", + "consumers", + b"consumers", + "head_offset", + b"head_offset", + "lifecycle", + b"lifecycle", + "owner_epoch", + b"owner_epoch", + "producers", + b"producers", + "redirect_run_id", + b"redirect_run_id", + ], + ) -> None: ... + +global___StreamState = StreamState + +class ProducerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + CONTENT_HASH_FIELD_NUMBER: builtins.int + FENCED_FIELD_NUMBER: builtins.int + seq: builtins.int + first_offset: builtins.int + count: builtins.int + content_hash: builtins.bytes + """Distinguishes a genuine retry from a client reusing a sequence with + different content, which must be rejected rather than deduplicated. + """ + fenced: builtins.bool + """Set by FinishWriting. Ends this producer's writes without closing the + stream for anyone else. + """ + def __init__( + self, + *, + seq: builtins.int = ..., + first_offset: builtins.int = ..., + count: builtins.int = ..., + content_hash: builtins.bytes = ..., + fenced: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "content_hash", + b"content_hash", + "count", + b"count", + "fenced", + b"fenced", + "first_offset", + b"first_offset", + "seq", + b"seq", + ], + ) -> None: ... + +global___ProducerCursor = ProducerCursor + +class ConsumerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + ACTIVE_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + REPLAY_FLOOR_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + offset: builtins.int + """How far this consumer has read. Used to decide whether it needs waking, + not to decide what the stream may drop. + """ + active: builtins.bool + external: builtins.bool + """Set when the consumer is a workflow in another execution, which is the + only case that has to be told the frontier moved. A workflow consuming a + stream it owns sees that while closing its own transaction. + """ + replay_floor: builtins.int + """The oldest offset this consumer's History still depends on. + + It is where the subscription started, not where it has read to. A range + this consumer already consumed is recorded in its History and has to be + re-readable for the workflow to replay, so bytes below the read position + are exactly the ones a replay needs most. It stays put while the consumer + is active and is released when it deregisters. + """ + def __init__( + self, + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + offset: builtins.int = ..., + active: builtins.bool = ..., + external: builtins.bool = ..., + replay_floor: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "active", + b"active", + "external", + b"external", + "offset", + b"offset", + "replay_floor", + b"replay_floor", + "run_id", + b"run_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___ConsumerCursor = ConsumerCursor + +class WorkflowStreamCursor(google.protobuf.message.Message): + """A consuming Workflow's position in a stream. This lives in the consuming + Workflow's own state rather than on the stream, so advancing it commits in + the same transaction as the WorkflowTaskCompleted event that records the + range. Keeping it on the stream would make the advance a cross-execution + write, and a crash between the two would either redeliver or skip. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + PENDING_FROM_FIELD_NUMBER: builtins.int + PENDING_TO_FIELD_NUMBER: builtins.int + HAS_PENDING_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + collection_id: builtins.str + """Enough to address the log without reading the stream component first.""" + bucket_size: builtins.int + offset: builtins.int + """Next offset to deliver.""" + known_head: builtins.int + """The stream's frontier as of the last delivery. A workflow consuming a + stream in another execution cannot read the real frontier while closing its + own transaction, so this is what tells it a capped slice left more behind. + """ + external: builtins.bool + """Set when the stream lives in another execution, which decides whether the + frontier is read locally or taken from known_head. + """ + pending_from: builtins.int + """The range attached to the Workflow Task currently in flight. Recorded on + the event that closes that task, then folded into offset. An empty range + is still recorded: a task where the subscription saw nothing is a fact + replay has to reproduce. + """ + pending_to: builtins.int + has_pending: builtins.bool + start_offset: builtins.int + """Where this subscription began reading. Retained separately from offset, + which advances, because replay has to tell "committed nothing yet" apart + from "the events recording what was committed are not in this page". + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + offset: builtins.int = ..., + known_head: builtins.int = ..., + external: builtins.bool = ..., + pending_from: builtins.int = ..., + pending_to: builtins.int = ..., + has_pending: builtins.bool = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "external", + b"external", + "has_pending", + b"has_pending", + "known_head", + b"known_head", + "offset", + b"offset", + "pending_from", + b"pending_from", + "pending_to", + b"pending_to", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___WorkflowStreamCursor = WorkflowStreamCursor + +class StreamLifecycle(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RETENTION_FIELD_NUMBER: builtins.int + MAX_ITEMS_FIELD_NUMBER: builtins.int + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a closed stream stays readable before it is deleted.""" + max_items: builtins.int + """Cap on readable messages. Older whole buckets are reclaimed once the floor + passes them, so a capped stream has bounded storage. + """ + def __init__( + self, + *, + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_items: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["retention", b"retention"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_items", b"max_items", "retention", b"retention" + ], + ) -> None: ... + +global___StreamLifecycle = StreamLifecycle diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index 4e128a2aa..bf947056a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 8280b56d4..2de4cb4e0 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -77,7 +77,9 @@ def __init__(self, channel: Any, namespace: str) -> None: """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" self._channel = channel self._namespace = namespace - self._stub = service_pb2_grpc.StreamServiceStub(channel) + # The generated stub is typed for a synchronous channel. This client + # drives it over ``grpc.aio``, where every call is awaited. + self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod def connect(target_host: str, namespace: str = "default") -> "StreamClient": From 43bcd4c76188f613e9ed8056c061ac7345b5ae7d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:44:45 -0700 Subject: [PATCH 348/831] Repinned Core to the finalized replay-slice branch. The stream client needs the replay slice lookahead fix that branch finished. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 3d1f82e66..f88f78c3f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 +Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c From 7b80c5b671c5cb166114835a2c23acbd89c6c51f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:47:50 -0700 Subject: [PATCH 349/831] Qualified the LangGraph docstring's stream references. The new server_streams module gives WorkflowStream and WorkflowStreamClient a second definition, so pydoctor can no longer resolve the short names. --- temporalio/contrib/langgraph/_plugin.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/temporalio/contrib/langgraph/_plugin.py b/temporalio/contrib/langgraph/_plugin.py index 03881ca2a..1819c646d 100644 --- a/temporalio/contrib/langgraph/_plugin.py +++ b/temporalio/contrib/langgraph/_plugin.py @@ -104,11 +104,13 @@ class LangGraphPlugin(SimplePlugin): inherited default of either form. streaming_topic: When set, ``langgraph.config.get_stream_writer()`` inside a node publishes to this topic on the workflow's - :class:`WorkflowStream`. The workflow must construct - ``WorkflowStream()`` in its ``@workflow.init`` (the plugin's + :class:`temporalio.contrib.workflow_streams.WorkflowStream`. The + workflow must construct ``WorkflowStream()`` in its + ``@workflow.init`` (the plugin's interceptor verifies this on workflow start). Nodes with ``execute_in='activity'`` publish through - :class:`WorkflowStreamClient` (signal); nodes with + :class:`temporalio.contrib.workflow_streams.WorkflowStreamClient` + (signal); nodes with ``execute_in='workflow'`` publish synchronously to the in-workflow stream (no signal). streaming_batch_interval: How often the activity-side stream From dad8ed6d3843a46889f2f2694137b202270e280c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:28:27 -0700 Subject: [PATCH 350/831] Repinned Core to the WIT-aligned replay-slice head. That head matches upstream's nexus model WIT for the workflow-id policies, which the current generator requires. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index f88f78c3f..4076ef24f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c +Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 From 319386804e902d6306fcecc88c4e07938f1630a3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:30:52 -0700 Subject: [PATCH 351/831] Regenerated the bridge protos from the repinned Core. The generated module was missing the local-activity marker argument flag its own stub already declared, so the two disagreed about the message. --- .../workflow_commands_pb2.py | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 3374f951a..0d81e37f5 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -511,8 +511,8 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 _WORKFLOWCOMMAND._serialized_start = 556 _WORKFLOWCOMMAND._serialized_end = 2794 _ADDSTREAMMESSAGES._serialized_start = 2796 @@ -528,57 +528,57 @@ _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY._serialized_end = 4683 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4646 - _REQUESTCANCELACTIVITY._serialized_end = 4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 - _QUERYRESULT._serialized_start = 4728 - _QUERYRESULT._serialized_end = 4884 - _QUERYSUCCESS._serialized_start = 4886 - _QUERYSUCCESS._serialized_end = 4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 - _FAILWORKFLOWEXECUTION._serialized_start = 5031 - _FAILWORKFLOWEXECUTION._serialized_end = 5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _REQUESTCANCELACTIVITY._serialized_start = 4685 + _REQUESTCANCELACTIVITY._serialized_end = 4721 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 + _QUERYRESULT._serialized_start = 4767 + _QUERYRESULT._serialized_end = 4923 + _QUERYSUCCESS._serialized_start = 4925 + _QUERYSUCCESS._serialized_end = 4990 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 + _FAILWORKFLOWEXECUTION._serialized_start = 5070 + _FAILWORKFLOWEXECUTION._serialized_end = 5144 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6024 - _CANCELWORKFLOWEXECUTION._serialized_end = 6100 - _SETPATCHMARKER._serialized_start = 6102 - _SETPATCHMARKER._serialized_end = 6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _CANCELWORKFLOWEXECUTION._serialized_start = 6063 + _CANCELWORKFLOWEXECUTION._serialized_end = 6139 + _SETPATCHMARKER._serialized_start = 6141 + _SETPATCHMARKER._serialized_end = 6195 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7958 - _CANCELSIGNALWORKFLOW._serialized_end = 7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 - _UPDATERESPONSE._serialized_start = 8180 - _UPDATERESPONSE._serialized_end = 8390 - _SCHEDULENEXUSOPERATION._serialized_start = 8393 - _SCHEDULENEXUSOPERATION._serialized_end = 8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 + _CANCELSIGNALWORKFLOW._serialized_start = 7997 + _CANCELSIGNALWORKFLOW._serialized_end = 8032 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 + _UPDATERESPONSE._serialized_start = 8219 + _UPDATERESPONSE._serialized_end = 8429 + _SCHEDULENEXUSOPERATION._serialized_start = 8432 + _SCHEDULENEXUSOPERATION._serialized_end = 8970 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 # @@protoc_insertion_point(module_scope) From b156e73f515aa49aa00ee3f5a52a2df95e7d9896 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:21:21 -0700 Subject: [PATCH 352/831] Adapted the native provider to the interface changes. The append cursor names the last record and is None for a batch the server deduplicated, so the stream client reports what the server said about the append. Producer identity is resolved by the package, inbound frames carry no topic, and the inbound id comes from the shared helper. --- temporalio/client_stream.py | 47 ++++++++++++--- temporalio/streams/providers/native.py | 83 +++++++++++++------------- tests/test_client_stream.py | 11 +++- 3 files changed, 89 insertions(+), 52 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 2de4cb4e0..1cd775043 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -33,7 +33,28 @@ import temporalio.api.streamservice.v1 as stream from temporalio.api.streamservice.v1 import service_pb2_grpc -__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] +__all__ = [ + "Appended", + "Message", + "Page", + "StreamClient", + "StreamHandle", + "WorkflowStreamHandle", +] + + +@dataclass(frozen=True) +class Appended: + """Where one append landed. + + ``deduplicated`` says the server already held this producer's batch at + this sequence and wrote nothing; the offsets are then the original ones. + """ + + first_offset: int + next_offset: int + count: int + deduplicated: bool = False @dataclass(frozen=True) @@ -185,13 +206,14 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: - """Append messages and return the offset the first one landed at. + ) -> Appended: + """Append messages and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than - appending twice. Without them the append is at-least-once, which is - only the right trade when duplicates are harmless. + appending twice, and says so. Without them the append is + at-least-once, which is only the right trade when duplicates are + harmless. """ response = await self._stub.AddMessages( stream.AddMessagesRequest( @@ -214,7 +236,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -352,7 +374,7 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: + ) -> Appended: """Append from outside the workflow, as :meth:`StreamHandle.append`. Batch where you can. The append costs one transition on the owning @@ -380,7 +402,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -479,3 +501,12 @@ async def describe(self) -> stream.StreamState: ) ) return response.frontend_response.state + + +def _appended(out: stream.AddMessagesOutput) -> Appended: + return Appended( + first_offset=out.first_offset, + next_offset=out.next_offset, + count=out.count, + deduplicated=out.deduplicated, + ) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 53d231174..f886d467b 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -8,21 +8,25 @@ from __future__ import annotations import asyncio -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any -from temporalio import activity, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._ids import inbound_stream_id from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_STATE = "__temporal_streams_state" +logger = logging.getLogger(__name__) + class _Fanout: """One server subscription, shared by every reader of that stream. @@ -104,18 +108,6 @@ async def publish(self, frame: bytes) -> None: workflow.add_stream_messages([frame], stream_id="", topic=self._topic) -def inbound_stream_id(workflow_id: str, stream: str) -> str: - """The server-side id of a workflow's inbound stream. - - A workflow names its streams relative to itself, so every provider can - address the same thing without workflow code knowing how it is stored. - Here that is a namespace-level stream id built from the pair, and the - workflow id rather than the run id because the stream has to survive - continue-as-new and reset. - """ - return f"{workflow_id}:{stream}" - - def _reject_configured_codec(client: Client) -> None: """Refuse a namespace whose payloads are meant to be encoded. @@ -200,8 +192,10 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append values and return where the first one landed.""" + async def append(self, *values: Any) -> Cursor | None: + """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + if not values: + return None frames = [] for value in values: frames.append( @@ -215,7 +209,7 @@ async def append(self, *values: Any) -> Cursor: ) ) self._sequence += 1 - offset = await self._handle.append( + appended = await self._handle.append( *frames, topic=self._topic, producer_id=self._provider_id, @@ -223,7 +217,9 @@ async def append(self, *values: Any) -> Cursor: # different job from telling readers that a new generation started. sequence=self._sequence - len(frames), ) - return Cursor(str(offset)) + if appended.deduplicated: + return None + return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: """Declare this stream complete.""" @@ -255,10 +251,16 @@ def _encode(self, value: Any) -> bytes: class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" - def __init__(self, handle: Any, converter: Any) -> None: - """Read the stream ``handle`` names, from anywhere.""" + def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: + """Read the stream ``handle`` names, from anywhere. + + ``stream`` is the inbound name the caller used, empty for the owner's + stream; ``address`` is what the server calls it, for log lines. + """ self._handle = handle self._converter = converter + self._stream = stream + self._address = address async def read( self, @@ -266,12 +268,13 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() async for message in self._handle.follow( from_offset=int(after.token) + 1 if after.token else 0 @@ -281,7 +284,11 @@ async def read( kind, frame_topic, source, attempt, sequence, body = _frame.decode( message.data ) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning( + "skipping record %s of stream %s: %s", cursor, self._address, error + ) continue if topic is not None and frame_topic != topic: continue @@ -373,22 +380,19 @@ async def producer( ) -> NativeProducer: """Open a producer on ``workflow_id``'s account. - ``stream`` names an inbound stream; with none, ``topic`` names a topic - on the stream the workflow publishes, which the server lets any - producer append to. Inside an activity, leave ``producer_id`` and - ``attempt`` unset: the activity's own id and attempt are the right - answer and are what let a reader tell a retry from a new generation. + ``stream`` names an inbound stream, a namespace-level stream the + server keys by the pair. With none, ``topic`` names a topic on the + stream the workflow publishes, which the server lets any producer + append to. An inbound record carries no topic: the stream's name is + its whole address. """ _reject_configured_codec(client) - if not producer_id: - producer_id = activity.info().activity_id - if not attempt: - attempt = activity.info().attempt streams = _stream_client(client) + converter = client.data_converter.payload_converter if not stream: return NativeProducer( streams.workflow_stream(workflow_id), - client.data_converter.payload_converter, + converter, topic, producer_id, attempt, @@ -404,13 +408,7 @@ async def producer( # exception. handle = streams.get(stream_id) _handles[stream_id] = handle - return NativeProducer( - handle, - client.data_converter.payload_converter, - stream, - producer_id, - attempt, - ) + return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( self, client: Client, *, workflow_id: str, stream: str = "" @@ -423,11 +421,14 @@ async def consumer( """ _reject_configured_codec(client) streams = _stream_client(client) + address = inbound_stream_id(workflow_id, stream) if stream: - handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + handle: Any = streams.get(address) else: handle = streams.workflow_stream(workflow_id) - return NativeConsumer(handle, client.data_converter.payload_converter) + return NativeConsumer( + handle, client.data_converter.payload_converter, stream, address + ) _provider.register("native", _NativeProvider) diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index 8d1a42f30..fde925cca 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -40,8 +40,10 @@ async def stream() -> AsyncIterator[StreamHandle]: async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - assert await stream.append(b"alpha", b"beta") == 0 - assert await stream.append(b"gamma") == 2 + first = await stream.append(b"alpha", b"beta") + assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) + assert not first.deduplicated + assert (await stream.append(b"gamma")).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: @@ -69,7 +71,10 @@ async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: first = await stream.append(b"once", producer_id="p1", sequence=1) retry = await stream.append(b"once", producer_id="p1", sequence=1) - assert first == retry == 0 + assert first.first_offset == retry.first_offset == 0 + assert not first.deduplicated + # The retry is told it wrote nothing, so a producer can report no position. + assert retry.deduplicated messages, _ = await stream.read() assert [m.data for m in messages] == [b"once"] From f54f6c2ab17b68696961e595bd6821759689d523 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:26:36 -0700 Subject: [PATCH 353/831] Pinned native stream handles to a run and closed their channels. A handle on a workflow's stream resolves the run once when it opens, so a follower is not redirected to a successor's empty stream after continue-as-new. The channel cache is keyed by the loop object and closed through the provider's close hook, and latest() reads a missing stream as empty but lets every other failure through. --- temporalio/client_stream.py | 77 +++++++++++++++++++++++++- temporalio/streams/providers/native.py | 60 +++++++++++--------- 2 files changed, 108 insertions(+), 29 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1cd775043..15760a980 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,6 +23,8 @@ from __future__ import annotations +import asyncio +import weakref from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from typing import Any @@ -40,6 +42,8 @@ "StreamClient", "StreamHandle", "WorkflowStreamHandle", + "close_shared_clients", + "shared_client", ] @@ -164,7 +168,7 @@ def get(self, stream_id: str) -> "StreamHandle": return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( - self, workflow_id: str, name: str = "" + self, workflow_id: str, name: str = "", *, owner_run_id: str = "" ) -> "WorkflowStreamHandle": """Open a stream a workflow publishes to. @@ -177,8 +181,13 @@ def workflow_stream( does not exist yet is not an error: it reads as empty and a :meth:`WorkflowStreamHandle.follow` parked on it wakes when the workflow publishes. + + ``owner_run_id`` pins the handle to one run of the workflow; see + :meth:`WorkflowStreamHandle.pin` for why a follower wants that. """ - return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + return WorkflowStreamHandle( + self._stub, self._namespace, workflow_id, name, owner_run_id + ) class StreamHandle: @@ -350,13 +359,19 @@ class WorkflowStreamHandle: """ def __init__( - self, stub: Any, namespace: str, workflow_id: str, name: str = "" + self, + stub: Any, + namespace: str, + workflow_id: str, + name: str = "", + owner_run_id: str = "", ) -> None: """Prefer :meth:`StreamClient.workflow_stream`.""" self._stub = stub self._namespace = namespace self._workflow_id = workflow_id self._name = name + self._owner_run_id = owner_run_id @property def workflow_id(self) -> str: @@ -368,6 +383,25 @@ def name(self) -> str: """Name the owner publishes under, empty for its default stream.""" return self._name + @property + def owner_run_id(self) -> str: + """The run this handle is pinned to, empty while it follows the current run.""" + return self._owner_run_id + + def pin(self, run_id: str) -> None: + """Address one run of the workflow from now on. + + Unpinned, every call resolves to whichever run is current. A follower + holding an offset from one run would then be redirected when the + workflow continues as new: the successor's stream starts empty at + offset zero, so the server reads the follower's offset as "caught up", + parks it until the successor has published that many records, and + then skips exactly that many. Pinned, the run's end shows up as + ``closed`` on the page, and the caller decides whether to follow the + successor from the beginning. + """ + self._owner_run_id = run_id + async def append( self, *messages: bytes, @@ -386,6 +420,7 @@ async def append( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, messages=[ stream.StreamMessage( @@ -418,6 +453,7 @@ async def read( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -460,12 +496,14 @@ async def poll( :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. + On a pinned handle ``closed`` also says the run has ended. """ response = await self._stub.PollWorkflowMessages( stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -496,6 +534,7 @@ async def describe(self) -> stream.StreamState: frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, ) ) @@ -510,3 +549,35 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: count=out.count, deduplicated=out.deduplicated, ) + + +# One channel per loop, target and namespace, shared by every handle in the +# process. A channel is multiplexed and long lived, and callers open a handle +# per subscription, which would otherwise be a connection per subscription. The +# loop is the key because a grpc.aio channel belongs to the loop that made it, +# and it is held weakly so a loop that is gone cannot lend its channel to a +# successor that happens to reuse its id. +_shared: weakref.WeakKeyDictionary[ + asyncio.AbstractEventLoop, dict[tuple[str, str], StreamClient] +] = weakref.WeakKeyDictionary() + + +def shared_client(target_host: str, namespace: str) -> StreamClient: + """The process-wide client for ``target_host`` and ``namespace`` on this loop.""" + per_loop = _shared.setdefault(asyncio.get_running_loop(), {}) + key = (target_host, namespace) + existing = per_loop.get(key) + if existing is None: + existing = per_loop[key] = StreamClient.connect(target_host, namespace) + return existing + + +async def close_shared_clients() -> None: + """Close every shared client this loop opened. + + For a process that is done with streams, and for tests, which open a + loop per case and would otherwise leave a channel behind on each. + """ + per_loop = _shared.pop(asyncio.get_running_loop(), {}) + for client in per_loop.values(): + await client.close() diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f886d467b..6dfdd4c25 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -13,10 +13,12 @@ from datetime import timedelta from typing import Any +import grpc + from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.client_stream import StreamClient +from temporalio.client_stream import StreamClient, close_shared_clients, shared_client from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._ids import inbound_stream_id @@ -126,24 +128,23 @@ def _reject_configured_codec(client: Client) -> None: # stream reuses the handle rather than asking the server to create it again. # The second create is answered correctly, and it is still a failed call the # server logs, which is noise an operator has to learn to ignore. -_handles: dict[str, Any] = {} +_handles: dict[tuple[str, str, str], Any] = {} -# One channel per target and namespace, shared by every handle in the process. -# A channel is multiplexed and long lived, and callers open a handle per -# subscription, which would otherwise be a connection per subscription. -_channels: dict[tuple[int, str, str], StreamClient] = {} +def _stream_client(client: Client) -> StreamClient: + return shared_client(client.service_client.config.target_host, client.namespace) -def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _channels.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _channels[key] = existing - return existing +async def _owner_run(client: Client, workflow_id: str) -> str: + """The run whose stream a handle on ``workflow_id`` should address. + + Resolved once, when the handle opens. Left to the server, a follower whose + workflow continued as new would be redirected to the successor, whose + stream starts empty, and its offset read as "caught up" rather than as a + position on the run it was watching. A producer is pinned for the same + reason: an activity's output belongs to the run that scheduled it. + """ + return (await client.get_workflow_handle(workflow_id).describe()).run_id class NativeProducer: @@ -310,9 +311,12 @@ async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() - except Exception: + except grpc.aio.AioRpcError as error: # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. + # is the same answer as an empty one. Any other failure is not: + # a reader that took it for "empty" would replay the whole stream. + if error.code() is not grpc.StatusCode.NOT_FOUND: + raise return BEGINNING return ( Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING @@ -344,6 +348,10 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + async def close(self) -> None: + """Close the channels this process opened to the stream service.""" + await close_shared_clients() + def open_read( self, stream: str, @@ -390,15 +398,13 @@ async def producer( streams = _stream_client(client) converter = client.data_converter.payload_converter if not stream: - return NativeProducer( - streams.workflow_stream(workflow_id), - converter, - topic, - producer_id, - attempt, + handle: Any = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) ) + return NativeProducer(handle, converter, topic, producer_id, attempt) stream_id = inbound_stream_id(workflow_id, stream) - handle = _handles.get(stream_id) + key = (client.service_client.config.target_host, client.namespace, stream_id) + handle = _handles.get(key) if handle is None: try: handle = await streams.create(stream_id) @@ -407,7 +413,7 @@ async def producer( # stream it does not own is the ordinary case, not the # exception. handle = streams.get(stream_id) - _handles[stream_id] = handle + _handles[key] = handle return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( @@ -425,7 +431,9 @@ async def consumer( if stream: handle: Any = streams.get(address) else: - handle = streams.workflow_stream(workflow_id) + handle = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) + ) return NativeConsumer( handle, client.data_converter.payload_converter, stream, address ) From 3fd8f699bce2d7bbb1f8fff5006afe672859c7c8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:28:14 -0700 Subject: [PATCH 354/831] Stopped the flusher without cancelling it and pinned the contrib client. A cancel landing inside the flusher's append unwound with the batch it had taken off the buffer. The client now asks it to stop and waits. The handle is pinned to the run it opened on, from the activity's own run id or one describe, and the channel cache is the shared one. --- temporalio/contrib/server_streams/__init__.py | 100 +++++++++++------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index c15184bf4..690402974 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -21,15 +21,15 @@ import asyncio import builtins -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass from datetime import timedelta from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.client import Client, WorkflowExecutionDescription +from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client from temporalio.converter import PayloadConverter __all__ = [ @@ -78,16 +78,15 @@ def _encode(converter: PayloadConverter, value: Any) -> bytes: The payload rather than the bare bytes, so the encoding metadata the consumer needs to decode into a type travels with it. - The codec chain is not applied. It cannot be applied here: a codec is async - and a Workflow publishing to a stream is not, so running one inside Workflow - code would be I/O on the Workflow thread. Regular payloads solve this in the - Worker, encoding on the way out and decoding on the way in, and a stream - needs the same plumbing before a codec can be honoured. - - It is not applied on the client path either, deliberately. Encoding one side - and not the other is worse than encoding neither: an Activity's messages - would reach a consuming Workflow as ciphertext it has no way to decode. - :func:`_reject_configured_codec` is what keeps that from happening quietly. + The codec chain is not applied here. Inside a Workflow it does not have to + be: the Worker runs the payload visitor with its codec over the commands + and activations, so a body that rides ``add_stream_messages`` is encoded + on the way out and one that arrives on ``deliver_stream_messages`` is + decoded on the way in, as every other payload is. The client path has no + such pass, and encoding one side but not the other is worse than encoding + neither: an Activity's messages would reach a consuming Workflow as + ciphertext it has no way to decode. :func:`_reject_configured_codec` + refuses a client with a codec until the client path applies one too. """ payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] return payload.SerializeToString() @@ -232,14 +231,22 @@ def __init__( handle: WorkflowStreamHandle, converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + *, + describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: - """Prefer :meth:`create` or :meth:`from_within_activity`.""" + """Prefer :meth:`create` or :meth:`from_within_activity`. + + ``describe`` is how an unpinned handle learns which run it follows; + see :meth:`WorkflowStreamHandle.pin`. + """ self._handle = handle self._converter = converter self._batch_interval = batch_interval + self._describe = describe self._buffered: list[tuple[str, Any]] = [] self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() + self._closed = False @classmethod def create( @@ -247,14 +254,24 @@ def create( client: Client, workflow_id: str, *, + owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, ) -> "WorkflowStreamClient": - """Open the stream owned by ``workflow_id``.""" + """Open the stream owned by ``workflow_id``. + + Without ``owner_run_id`` the current run is looked up on the first + call and the handle pinned to it, so a reader following across a + continue-as-new sees the run end rather than being moved to the + successor's stream at a stale offset. + """ _reject_configured_codec(client) return cls( - _stream_client(client).workflow_stream(workflow_id), + _stream_client(client).workflow_stream( + workflow_id, owner_run_id=owner_run_id + ), client.data_converter.payload_converter, batch_interval, + describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod @@ -262,13 +279,20 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - workflow_id = activity.info().workflow_id - if workflow_id is None: + info = activity.info() + if info.workflow_id is None: raise RuntimeError( "no Workflow stream to open: this Activity was not started by a " "Workflow" ) - return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) + # The Activity's output belongs to the run that scheduled it, and the + # Activity already knows which run that is. + return cls.create( + activity.client(), + info.workflow_id, + owner_run_id=info.workflow_run_id or "", + batch_interval=batch_interval, + ) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -279,17 +303,22 @@ async def __aexit__(self, *_exc: object) -> None: """Drain what is buffered before letting the caller go. An Activity that returned with a batch still buffered would have - reported work its readers never saw. + reported work its readers never saw. The flusher is asked to stop + rather than cancelled: a cancel landing inside its append would + unwind with the batch it had already taken off the buffer. """ + self._closed = True + self._wake.set() if self._flusher is not None: - self._flusher.cancel() - try: - await self._flusher - except asyncio.CancelledError: - pass + await self._flusher self._flusher = None await self.flush() + async def _pin(self) -> None: + if self._handle.owner_run_id or self._describe is None: + return + self._handle.pin((await self._describe()).run_id) + @overload def topic(self, name: str) -> TopicHandle[Any]: ... @@ -305,6 +334,7 @@ async def get_offset(self) -> int: A reader that wants only what comes next starts here. """ + await self._pin() return (await self._handle.describe()).head_offset async def subscribe( @@ -321,6 +351,7 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown + await self._pin() async for message in self._handle.follow( from_offset=from_offset, topics=topics ): @@ -342,6 +373,7 @@ async def poll_raw( For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. """ + await self._pin() page = await self._handle.poll( from_offset=from_offset, topics=topics, wait=wait ) @@ -360,6 +392,7 @@ async def flush(self) -> None: pending, self._buffered = self._buffered, [] if not pending: return + await self._pin() # One append per topic, because a batch carries a single topic. The # harness case is one topic, so this is one append. by_topic: dict[str, list[bytes]] = {} @@ -376,7 +409,7 @@ def _flush_soon(self) -> None: async def _run_flusher(self) -> None: """Append on a fixed cadence, so a slow producer still gets delivered.""" - while True: + while not self._closed: try: await asyncio.wait_for( self._wake.wait(), self._batch_interval.total_seconds() @@ -387,18 +420,5 @@ async def _run_flusher(self) -> None: await self.flush() -# One channel per target, shared by every handle in the process. The channel is -# multiplexed and long-lived, and callers here open a client per subscription, -# which would otherwise be a connection per subscription. -_clients: dict[tuple[int, str, str], StreamClient] = {} - - def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop too: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _clients.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _clients[key] = existing - return existing + return shared_client(client.service_client.config.target_host, client.namespace) From 51dcff539b95f390bc75639dbf3fe9c734b26024 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:23 -0700 Subject: [PATCH 355/831] Checked stream ranges for continuity and mirrored the byte limits. A range is recorded as consumed once and never resent, so a repeated, skipped or mis-sized delivery would hand the workflow duplicate or shifted bodies with nothing to say so. The worker also refuses a publish over the server's per-message and per-batch byte limits before the command exists, for the reason the count limit already gave. --- temporalio/worker/_workflow_instance.py | 53 +++++++++++++--- tests/worker/test_workflow_stream.py | 84 +++++++++++++++++++++++-- 2 files changed, 123 insertions(+), 14 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 66833dd8c..0a17d2b22 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -273,10 +273,12 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# Match the server's per-batch limits. Rejecting here turns a wedged workflow, # which would replay and re-issue the same rejected command forever, into an # error the workflow author can see. _MAX_STREAM_MESSAGES_PER_BATCH = 1000 +_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +_MAX_STREAM_BATCH_BYTES = 2 << 20 class _StreamBuffer: @@ -288,15 +290,38 @@ class _StreamBuffer: dropped. """ - def __init__(self) -> None: + def __init__(self, stream_id: str = "") -> None: + self._stream_id = stream_id self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] self._waiters: list[asyncio.Future] = [] + # Where the next range has to start. Unknown until the first one + # arrives, because a subscription may start wherever the stream is and + # the server is the one that resolves that. + self._next_offset: int | None = None def extend( self, messages: Sequence[temporalio.api.stream.v1.StreamMessage], from_offset: int = 0, + to_offset: int | None = None, ) -> None: + if to_offset is None: + to_offset = from_offset + len(messages) + # A range is recorded as consumed once and never resent, so one that + # repeats, skips or mis-sizes would hand the workflow duplicate or + # shifted bodies with nothing to say so. Failing the task is what makes + # the fault visible. + if to_offset - from_offset != len(messages): + raise RuntimeError( + f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"for offsets [{from_offset}, {to_offset})" + ) + if self._next_offset is not None and from_offset != self._next_offset: + raise RuntimeError( + f"stream {self._stream_id!r} delivered offsets [{from_offset}, " + f"{to_offset}) but the last range ended at {self._next_offset}" + ) + self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. if not messages: @@ -1223,9 +1248,9 @@ def _apply_deliver_stream_messages( # Nothing subscribed. The range is already recorded as consumed and # will not be sent again, so buffering it is the only way a # subscription made later in the same task still sees it. - buffer = _StreamBuffer() + buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset) + buffer.extend(job.messages, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1393,9 +1418,9 @@ def get_info(self) -> temporalio.workflow.Info: def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: # Reissued on every replay, so the buffer has to exist before the first - # range arrives and the command has to be harmless the second time. The - # server treats a repeat subscription to the same stream as a no-op. - self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + # range arrives and the command has to be harmless the second time. A + # repeat subscription leaves the server-side cursor where it is. + self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) command = self._add_command() command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset @@ -1410,6 +1435,18 @@ def workflow_add_stream_messages( f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " f"got {len(messages)}" ) + total = 0 + for body in messages: + if len(body) > _MAX_STREAM_MESSAGE_BYTES: + raise ValueError( + f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " + f"bytes, got {len(body)}" + ) + total += len(body) + if total > _MAX_STREAM_BATCH_BYTES: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" + ) command = self._add_command() command.add_stream_messages.stream_id = stream_id for body in messages: @@ -1437,7 +1474,7 @@ async def workflow_read_stream_messages( # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. self._assert_not_read_only("read stream") - buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) while not len(buffer): await buffer.wait_future() taken = buffer.take() diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 1d154b37c..93b596b8c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -15,10 +15,14 @@ import temporalio.api.common.v1 import temporalio.api.stream.v1 as api_stream +from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( + _MAX_STREAM_BATCH_BYTES, + _MAX_STREAM_MESSAGE_BYTES, _StreamBuffer, _WorkflowInstanceImpl, ) +from temporalio.workflow import ReadOnlyContextError def message(body: bytes) -> api_stream.StreamMessage: @@ -78,12 +82,13 @@ class _ReadOnlyStub: workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages - def __init__(self) -> None: + def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} - self.read_only_calls: list[str] = [] + self._read_only = read_only def _assert_not_read_only(self, action: str) -> None: - self.read_only_calls.append(action) + if self._read_only: + raise ReadOnlyContextError(f"cannot {action} in a read-only context") async def read(self, stream: str, max_messages: int) -> list[bytes]: instance: Any = self @@ -115,9 +120,76 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> # A query activation carries no ranges, so a read there would wait on a future # nothing can resolve and the query would time out saying nothing. async def test_read_is_refused_in_a_read_only_context() -> None: - stub = _ReadOnlyStub() + stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await stub.read("s", 0) - assert stub.read_only_calls == ["read stream"] + with pytest.raises(ReadOnlyContextError, match="read stream"): + await stub.read("s", 0) + # Refused before the buffer was touched, so the range is still there for + # the task that is allowed to read it. + assert len(stub._stream_buffers["s"]) == 1 + + +# A range is recorded as consumed once and never resent, so the buffer is the +# only place a repeated, skipped or mis-sized delivery can still be noticed. +async def test_ranges_have_to_abut_the_last_one() -> None: + buffer = _StreamBuffer("s") + buffer.extend([message(b"a"), message(b"b")], 0, 2) + # An empty range moves the expectation too: the server recorded it. + buffer.extend([], 2, 2) + buffer.extend([message(b"c")], 2, 3) + assert [m.offset for m in buffer.take()] == [0, 1, 2] + + with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): + buffer.extend([message(b"c")], 2, 3) + with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): + buffer.extend([message(b"f")], 5, 6) + + +async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: + buffer = _StreamBuffer("s") + with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): + buffer.extend([message(b"a"), message(b"b")], 0, 1) + assert len(buffer) == 0 + + +class _CommandStub: + """Drives the real publish path and keeps the commands it issued.""" + + workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + def _add_command(self) -> WorkflowCommand: + command = WorkflowCommand() + self.commands.append(command) + return command + + def publish(self, *bodies: bytes) -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + + +# The server refuses an oversized publish, and a refused command is reissued +# on every replay, so the limits have to be applied before the command exists. +def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): + stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) + assert len(stub.commands) == 1 + + +def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) + stub.publish(half, half) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): + stub.publish(half, half, b"x") + assert len(stub.commands) == 1 From 9fae6ebd1658c4ab70a2edda3f7ac921919c2f76 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:24 -0700 Subject: [PATCH 356/831] Corrected the subscribe docstring and two stale test comments. --- temporalio/workflow/_context.py | 7 ++++--- tests/contrib/test_server_streams.py | 2 -- tests/worker/test_workflow_stream_e2e.py | 7 ++----- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 450051456..57183aafb 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -971,9 +971,10 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: """Subscribe this workflow to a stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: the server treats - a second subscription to the same stream as a no-op, which is what makes - calling it on every replay harmless. + and :func:`read_stream` returns them. Safe to call again: a second + subscription to a stream this run already consumes does not move its + cursor, though it does write one event. Calling it on every replay is + harmless because replay matches the command to the event already recorded. Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index e1fe84c77..9b339dfe4 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -82,8 +82,6 @@ async def test_both_producers_reach_one_subscriber() -> None: Emitting.run, tokens, id=wf_id, task_queue=task_queue ) - # Subscribed before the Workflow has published anything, which is what - # a consumer attaching to a session does. # Subscribed before the Workflow has published anything, which is what # a consumer attaching to a session does. stream = WorkflowStreamClient.create(client, wf_id) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 3ee38fef3..31296b2c8 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -32,11 +32,8 @@ STREAM = "output" -# Event type numbers rather than names: this SDK's api protos predate both -# events, so the attributes arrive as unknown fields and only the type is -# readable here. The server's own tests are where the offsets are asserted. -EVENT_STREAM_SUBSCRIBED = 61 -EVENT_STREAM_MESSAGES_ADDED = 62 +EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED +EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED @workflow.defn From 64292ad32060f9095775605f8f51898ea9a624dd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:44:38 -0700 Subject: [PATCH 357/831] Repinned Core to the reviewed moe/AI-198-fix-replay-slice-lookahead head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 4076ef24f..a67781227 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 +Subproject commit a67781227a88df50a0617247d20d4908f96d4593 From 672df70fe1f7bfc7ac31e9bf7b8759684ce724de Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:47:29 -0700 Subject: [PATCH 358/831] Regenerated the bridge protos from the repinned Core. The native activation job and the two native commands moved to the field numbers the combined Core tree uses, so both trees agree. --- .../workflow_activation_pb2.py | 2 +- .../workflow_activation_pb2.pyi | 7 +++++- .../workflow_commands_pb2.py | 2 +- .../workflow_commands_pb2.pyi | 22 ++++++++++++------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index cd09b8b97..5df8ff627 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,7 +47,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 5245cd6fc..a6787024a 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -298,7 +298,12 @@ class WorkflowActivationJob(google.protobuf.message.Message): """A nexus operation resolved.""" @property def deliver_stream_messages(self) -> global___DeliverStreamMessages: - """A range of a stream the workflow subscribed to.""" + """17 to 20 are taken by the external stream jobs, which are developed + alongside this one and share this message. The number below is fixed + with that family and must not be reused. + + A range of a stream the workflow subscribed to. + """ @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0d81e37f5..44f658d1e 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index bcf1bf7eb..18b6e2ff9 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -181,7 +181,11 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property - def subscribe_stream(self) -> global___SubscribeStream: ... + def subscribe_stream(self) -> global___SubscribeStream: + """23 to 28 are taken by the external stream commands, which are developed + alongside these and share this message. The two numbers below are fixed + with that family and must not be reused. + """ @property def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( @@ -376,13 +380,7 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand class AddStreamMessages(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - Publish a batch of messages to a stream this workflow owns. + """Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -420,6 +418,14 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int From 77e0ab834e767e1c7ef548cc3a79cde7e0280819 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:24:50 -0700 Subject: [PATCH 359/831] Repinned Core to the reviewed replay-slice head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index a67781227..97cd17296 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit a67781227a88df50a0617247d20d4908f96d4593 +Subproject commit 97cd17296fcc6178407c770f96f354bcc4e9f540 From dfed61e9d4f0764495ca98efb2dc58f784710a03 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:31:31 -0700 Subject: [PATCH 360/831] Regenerated the bridge protos from the repinned Core. The activation job is now deliver_stream_records and the command append_stream_records, both carrying StreamRecord, so the payload visitor reaches each record's body and metadata. --- temporalio/bridge/_visitor.py | 26 +-- .../proto/workflow_activation/__init__.py | 4 +- .../workflow_activation_pb2.py | 116 ++++++------- .../workflow_activation_pb2.pyi | 34 ++-- .../proto/workflow_commands/__init__.py | 4 +- .../workflow_commands_pb2.py | 152 +++++++++--------- .../workflow_commands_pb2.pyi | 38 ++--- 7 files changed, 188 insertions(+), 186 deletions(-) diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index 77d1b6c7a..c04d1c60f 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,7 +308,7 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) - async def _visit_temporal_api_stream_v1_StreamMessage( + async def _visit_temporal_api_stream_v1_StreamRecord( self, fs: VisitorFunctions, o: Any ): if o.HasField("body"): @@ -316,11 +316,11 @@ async def _visit_temporal_api_stream_v1_StreamMessage( for v in o.metadata.values(): await self._visit_temporal_api_common_v1_Payload(fs, v) - async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + async def _visit_coresdk_workflow_activation_DeliverStreamRecords( self, fs: VisitorFunctions, o: Any ): - for v in o.messages: - await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any @@ -367,9 +367,9 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) - elif o.HasField("deliver_stream_messages"): - await self._visit_coresdk_workflow_activation_DeliverStreamMessages( - fs, o.deliver_stream_messages + elif o.HasField("deliver_stream_records"): + await self._visit_coresdk_workflow_activation_DeliverStreamRecords( + fs, o.deliver_stream_records ) async def _visit_coresdk_workflow_activation_WorkflowActivation( @@ -510,11 +510,11 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) - async def _visit_coresdk_workflow_commands_AddStreamMessages( + async def _visit_coresdk_workflow_commands_AppendStreamRecords( self, fs: VisitorFunctions, o: Any ): - for v in o.messages: - await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any @@ -575,9 +575,9 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) - elif o.HasField("add_stream_messages"): - await self._visit_coresdk_workflow_commands_AddStreamMessages( - fs, o.add_stream_messages + elif o.HasField("append_stream_records"): + await self._visit_coresdk_workflow_commands_AppendStreamRecords( + fs, o.append_stream_records ) async def _visit_coresdk_workflow_completion_Success( diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index ae7639820..f17880890 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,6 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, - DeliverStreamMessages, + DeliverStreamRecords, DoUpdate, FireTimer, InitializeWorkflow, @@ -25,7 +25,7 @@ __all__ = [ "CancelWorkflow", - "DeliverStreamMessages", + "DeliverStreamRecords", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 5df8ff627..7f6d3e782 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,13 +47,13 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ "HeadersEntry" @@ -118,16 +118,16 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( - "DeliverStreamMessages", +DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( + "DeliverStreamRecords", (_message.Message,), { - "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "DESCRIPTOR": _DELIVERSTREAMRECORDS, "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamRecords) }, ) -_sym_db.RegisterMessage(DeliverStreamMessages) +_sym_db.RegisterMessage(DeliverStreamRecords) InitializeWorkflow = _reflection.GeneratedProtocolMessageType( "InitializeWorkflow", @@ -394,55 +394,55 @@ _WORKFLOWACTIVATION._serialized_start = 570 _WORKFLOWACTIVATION._serialized_end = 1116 _WORKFLOWACTIVATIONJOB._serialized_start = 1119 - _WORKFLOWACTIVATIONJOB._serialized_end = 2582 - _DELIVERSTREAMMESSAGES._serialized_start = 2585 - _DELIVERSTREAMMESSAGES._serialized_end = 2724 - _INITIALIZEWORKFLOW._serialized_start = 2727 - _INITIALIZEWORKFLOW._serialized_end = 4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _FIRETIMER._serialized_start = 4133 - _FIRETIMER._serialized_end = 4157 - _RESOLVEACTIVITY._serialized_start = 4159 - _RESOLVEACTIVITY._serialized_end = 4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 - _UPDATERANDOMSEED._serialized_start = 5045 - _UPDATERANDOMSEED._serialized_end = 5088 - _QUERYWORKFLOW._serialized_start = 5091 - _QUERYWORKFLOW._serialized_end = 5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _CANCELWORKFLOW._serialized_start = 5353 - _CANCELWORKFLOW._serialized_end = 5385 - _SIGNALWORKFLOW._serialized_start = 5388 - _SIGNALWORKFLOW._serialized_end = 5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _NOTIFYHASPATCH._serialized_start = 5679 - _NOTIFYHASPATCH._serialized_end = 5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 - _DOUPDATE._serialized_start = 5917 - _DOUPDATE._serialized_end = 6248 - _DOUPDATE_HEADERSENTRY._serialized_start = 4052 - _DOUPDATE_HEADERSENTRY._serialized_end = 4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 - _RESOLVENEXUSOPERATION._serialized_start = 6407 - _RESOLVENEXUSOPERATION._serialized_end = 6496 - _REMOVEFROMCACHE._serialized_start = 6499 - _REMOVEFROMCACHE._serialized_end = 6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 + _WORKFLOWACTIVATIONJOB._serialized_end = 2580 + _DELIVERSTREAMRECORDS._serialized_start = 2583 + _DELIVERSTREAMRECORDS._serialized_end = 2719 + _INITIALIZEWORKFLOW._serialized_start = 2722 + _INITIALIZEWORKFLOW._serialized_end = 4126 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _FIRETIMER._serialized_start = 4128 + _FIRETIMER._serialized_end = 4152 + _RESOLVEACTIVITY._serialized_start = 4154 + _RESOLVEACTIVITY._serialized_end = 4263 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4266 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4603 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4605 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4664 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4667 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4833 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4835 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4931 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4933 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5038 + _UPDATERANDOMSEED._serialized_start = 5040 + _UPDATERANDOMSEED._serialized_end = 5083 + _QUERYWORKFLOW._serialized_start = 5086 + _QUERYWORKFLOW._serialized_end = 5346 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _CANCELWORKFLOW._serialized_start = 5348 + _CANCELWORKFLOW._serialized_end = 5380 + _SIGNALWORKFLOW._serialized_start = 5383 + _SIGNALWORKFLOW._serialized_end = 5672 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _NOTIFYHASPATCH._serialized_start = 5674 + _NOTIFYHASPATCH._serialized_end = 5708 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5710 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5805 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5807 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5909 + _DOUPDATE._serialized_start = 5912 + _DOUPDATE._serialized_end = 6243 + _DOUPDATE_HEADERSENTRY._serialized_start = 4047 + _DOUPDATE_HEADERSENTRY._serialized_end = 4126 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6246 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6400 + _RESOLVENEXUSOPERATION._serialized_start = 6402 + _RESOLVENEXUSOPERATION._serialized_end = 6491 + _REMOVEFROMCACHE._serialized_start = 6494 + _REMOVEFROMCACHE._serialized_end = 6846 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6608 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6846 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index a6787024a..ac9ac13f7 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -236,7 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int - DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int + DELIVER_STREAM_RECORDS_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -297,7 +297,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property - def deliver_stream_messages(self) -> global___DeliverStreamMessages: + def deliver_stream_records(self) -> global___DeliverStreamRecords: """17 to 20 are taken by the external stream jobs, which are developed alongside this one and share this message. The number below is fixed with that family and must not be reused. @@ -332,7 +332,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., - deliver_stream_messages: global___DeliverStreamMessages | None = ..., + deliver_stream_records: global___DeliverStreamRecords | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -340,8 +340,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -381,8 +381,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -436,7 +436,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", - "deliver_stream_messages", + "deliver_stream_records", "remove_from_cache", ] | None @@ -444,7 +444,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob -class DeliverStreamMessages(google.protobuf.message.Message): +class DeliverStreamRecords(google.protobuf.message.Message): """Hand a workflow the next range of a stream it subscribed to. The range is delivered once, on the task the server decided it belongs to, @@ -461,7 +461,7 @@ class DeliverStreamMessages(google.protobuf.message.Message): STREAM_ID_FIELD_NUMBER: builtins.int FROM_OFFSET_FIELD_NUMBER: builtins.int TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int stream_id: builtins.str """Id of the stream this range came from.""" from_offset: builtins.int @@ -469,10 +469,10 @@ class DeliverStreamMessages(google.protobuf.message.Message): to_offset: builtins.int """Exclusive. Equal to from_offset when the subscription saw nothing.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage + temporalio.api.stream.v1.message_pb2.StreamRecord ]: ... def __init__( self, @@ -480,8 +480,8 @@ class DeliverStreamMessages(google.protobuf.message.Message): stream_id: builtins.str = ..., from_offset: builtins.int = ..., to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord ] | None = ..., ) -> None: ... @@ -490,8 +490,8 @@ class DeliverStreamMessages(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "from_offset", b"from_offset", - "messages", - b"messages", + "records", + b"records", "stream_id", b"stream_id", "to_offset", @@ -499,7 +499,7 @@ class DeliverStreamMessages(google.protobuf.message.Message): ], ) -> None: ... -global___DeliverStreamMessages = DeliverStreamMessages +global___DeliverStreamRecords = DeliverStreamRecords class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 44826f2da..9fb1c8f08 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,6 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, - AddStreamMessages, + AppendStreamRecords, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -30,7 +30,7 @@ __all__ = [ "ActivityCancellationType", - "AddStreamMessages", + "AppendStreamRecords", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 44f658d1e..5af8f0744 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,7 +59,7 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] _SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] @@ -135,16 +135,16 @@ ) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType( - "AddStreamMessages", +AppendStreamRecords = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecords", (_message.Message,), { - "DESCRIPTOR": _ADDSTREAMMESSAGES, + "DESCRIPTOR": _APPENDSTREAMRECORDS, "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AppendStreamRecords) }, ) -_sym_db.RegisterMessage(AddStreamMessages) +_sym_db.RegisterMessage(AppendStreamRecords) SubscribeStream = _reflection.GeneratedProtocolMessageType( "SubscribeStream", @@ -511,74 +511,74 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9020 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9108 _WORKFLOWCOMMAND._serialized_start = 556 - _WORKFLOWCOMMAND._serialized_end = 2794 - _ADDSTREAMMESSAGES._serialized_start = 2796 - _ADDSTREAMMESSAGES._serialized_end = 2891 - _SUBSCRIBESTREAM._serialized_start = 2893 - _SUBSCRIBESTREAM._serialized_end = 2951 - _STARTTIMER._serialized_start = 2953 - _STARTTIMER._serialized_end = 3036 - _CANCELTIMER._serialized_start = 3038 - _CANCELTIMER._serialized_end = 3064 - _SCHEDULEACTIVITY._serialized_start = 3067 - _SCHEDULEACTIVITY._serialized_end = 3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 - _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4683 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4685 - _REQUESTCANCELACTIVITY._serialized_end = 4721 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 - _QUERYRESULT._serialized_start = 4767 - _QUERYRESULT._serialized_end = 4923 - _QUERYSUCCESS._serialized_start = 4925 - _QUERYSUCCESS._serialized_end = 4990 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 - _FAILWORKFLOWEXECUTION._serialized_start = 5070 - _FAILWORKFLOWEXECUTION._serialized_end = 5144 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6063 - _CANCELWORKFLOWEXECUTION._serialized_end = 6139 - _SETPATCHMARKER._serialized_start = 6141 - _SETPATCHMARKER._serialized_end = 6195 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7997 - _CANCELSIGNALWORKFLOW._serialized_end = 8032 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 - _UPDATERESPONSE._serialized_start = 8219 - _UPDATERESPONSE._serialized_end = 8429 - _SCHEDULENEXUSOPERATION._serialized_start = 8432 - _SCHEDULENEXUSOPERATION._serialized_end = 8970 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 + _WORKFLOWCOMMAND._serialized_end = 2798 + _APPENDSTREAMRECORDS._serialized_start = 2800 + _APPENDSTREAMRECORDS._serialized_end = 2895 + _SUBSCRIBESTREAM._serialized_start = 2897 + _SUBSCRIBESTREAM._serialized_end = 2955 + _STARTTIMER._serialized_start = 2957 + _STARTTIMER._serialized_end = 3040 + _CANCELTIMER._serialized_start = 3042 + _CANCELTIMER._serialized_end = 3068 + _SCHEDULEACTIVITY._serialized_start = 3071 + _SCHEDULEACTIVITY._serialized_end = 3895 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3895 + _SCHEDULELOCALACTIVITY._serialized_start = 3898 + _SCHEDULELOCALACTIVITY._serialized_end = 4687 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3895 + _REQUESTCANCELACTIVITY._serialized_start = 4689 + _REQUESTCANCELACTIVITY._serialized_end = 4725 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4727 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4768 + _QUERYRESULT._serialized_start = 4771 + _QUERYRESULT._serialized_end = 4927 + _QUERYSUCCESS._serialized_start = 4929 + _QUERYSUCCESS._serialized_end = 4994 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4996 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5072 + _FAILWORKFLOWEXECUTION._serialized_start = 5074 + _FAILWORKFLOWEXECUTION._serialized_end = 5148 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5151 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6065 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELWORKFLOWEXECUTION._serialized_start = 6067 + _CANCELWORKFLOWEXECUTION._serialized_end = 6143 + _SETPATCHMARKER._serialized_start = 6145 + _SETPATCHMARKER._serialized_end = 6199 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6202 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7376 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7378 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7452 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7455 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7597 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7600 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7999 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELSIGNALWORKFLOW._serialized_start = 8001 + _CANCELSIGNALWORKFLOW._serialized_end = 8036 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8038 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8139 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8141 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8220 + _UPDATERESPONSE._serialized_start = 8223 + _UPDATERESPONSE._serialized_end = 8433 + _SCHEDULENEXUSOPERATION._serialized_start = 8436 + _SCHEDULENEXUSOPERATION._serialized_end = 8974 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8924 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8974 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8976 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9018 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 18b6e2ff9..b4848ddb1 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -105,7 +105,7 @@ class WorkflowCommand(google.protobuf.message.Message): SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int - ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -187,7 +187,7 @@ class WorkflowCommand(google.protobuf.message.Message): with that family and must not be reused. """ @property - def add_stream_messages(self) -> global___AddStreamMessages: ... + def append_stream_records(self) -> global___AppendStreamRecords: ... def __init__( self, *, @@ -227,13 +227,13 @@ class WorkflowCommand(google.protobuf.message.Message): request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., subscribe_stream: global___SubscribeStream | None = ..., - add_stream_messages: global___AddStreamMessages | None = ..., + append_stream_records: global___AppendStreamRecords | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "add_stream_messages", - b"add_stream_messages", + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -289,8 +289,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "add_stream_messages", - b"add_stream_messages", + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -372,50 +372,52 @@ class WorkflowCommand(google.protobuf.message.Message): "schedule_nexus_operation", "request_cancel_nexus_operation", "subscribe_stream", - "add_stream_messages", + "append_stream_records", ] | None ): ... global___WorkflowCommand = WorkflowCommand -class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch - size free: a thousand messages cost the same in History as one. + size free: a thousand records cost the same in History as one. The server + stores each record with an empty producer id, because the workflow is the + producer here. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int stream_id: builtins.str """Empty means the workflow's default output stream.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage + temporalio.api.stream.v1.message_pb2.StreamRecord ]: ... def __init__( self, *, stream_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord ] | None = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "messages", b"messages", "stream_id", b"stream_id" + "records", b"records", "stream_id", b"stream_id" ], ) -> None: ... -global___AddStreamMessages = AddStreamMessages +global___AppendStreamRecords = AppendStreamRecords class SubscribeStream(google.protobuf.message.Message): """Subscribe this workflow to a stream, so later Workflow Tasks carry the From 33771eec098c3583e65f79062df53ccc1a23e49f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:33:01 -0700 Subject: [PATCH 361/831] Regenerated the vendored stream service protos from the record server. --- temporalio/api/streamservice/v1/__init__.py | 34 +-- .../api/streamservice/v1/message_pb2.py | 62 +++-- .../api/streamservice/v1/message_pb2.pyi | 99 ++++---- .../streamservice/v1/request_response_pb2.py | 224 +++++++++--------- .../streamservice/v1/request_response_pb2.pyi | 123 ++++++---- .../api/streamservice/v1/stream_state_pb2.py | 42 ++-- .../api/streamservice/v1/stream_state_pb2.pyi | 93 +++++--- 7 files changed, 363 insertions(+), 314 deletions(-) diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 7e2ebef29..1e909c223 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -4,22 +4,9 @@ # is still defined in the server. See temporalio/client_stream.py. from .message_pb2 import ( - STREAM_MESSAGE_KIND_DATA, - STREAM_MESSAGE_KIND_FLUSH, - STREAM_MESSAGE_KIND_UNSPECIFIED, - StreamMessage, - StreamMessageBatch, - StreamMessageKind, + StreamRecord, + StreamRecordBatch, ) - -from .stream_state_pb2 import ( - ConsumerCursor, - ProducerCursor, - StreamLifecycle, - StreamState, - WorkflowStreamCursor, -) - from .request_response_pb2 import ( AddMessagesInput, AddMessagesOutput, @@ -80,6 +67,14 @@ TruncateStreamRequest, TruncateStreamResponse, ) +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamBudget, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) __all__ = [ "AddMessagesInput", @@ -133,14 +128,11 @@ "RegisterStreamConsumerOutput", "RegisterStreamConsumerRequest", "RegisterStreamConsumerResponse", - "STREAM_MESSAGE_KIND_DATA", - "STREAM_MESSAGE_KIND_FLUSH", - "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamBudget", "StreamLifecycle", "StreamListEntry", - "StreamMessage", - "StreamMessageBatch", - "StreamMessageKind", + "StreamRecord", + "StreamRecordBatch", "StreamState", "SubscribeWorkflowInput", "SubscribeWorkflowOutput", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index 3bbd8718e..8876ac29b 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -8,7 +8,6 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper # @@protoc_insertion_point(imports) @@ -18,66 +17,61 @@ from temporalio.api.common.v1 import ( message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ= (3, 10): +if sys.version_info >= (3, 8): import typing as typing_extensions else: import typing_extensions DESCRIPTOR: google.protobuf.descriptor.FileDescriptor -class _StreamMessageKind: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _StreamMessageKindEnumTypeWrapper( - google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ - _StreamMessageKind.ValueType - ], - builtins.type, -): # noqa: F821 - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 - STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 - STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 - """Producer signalling a delivery boundary. Carries no body and consumes an - offset like any other message. A consumer uses it to end a turn without - waiting out an idle timeout. +class StreamRecord(google.protobuf.message.Message): + """The stored shape of temporal.api.stream.v1.StreamRecord plus the offset a + read assigns. Field for field the public record, so one crosses the frontend + in either direction without translation. """ -class StreamMessageKind( - _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper -): ... - -STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 -STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 -STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 -"""Producer signalling a delivery boundary. Carries no body and consumes an -offset like any other message. A consumer uses it to end a turn without -waiting out an idle timeout. -""" -global___StreamMessageKind = StreamMessageKind - -class StreamMessage(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor class MetadataEntry(google.protobuf.message.Message): @@ -82,9 +54,11 @@ class StreamMessage(google.protobuf.message.Message): BODY_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int TOPIC_FIELD_NUMBER: builtins.int - TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int KIND_FIELD_NUMBER: builtins.int OFFSET_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int @property def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... @property @@ -93,18 +67,29 @@ class StreamMessage(google.protobuf.message.Message): ) -> google.protobuf.internal.containers.MessageMap[ builtins.str, temporal.api.common.v1.message_pb2.Payload ]: - """Producer-supplied provenance. The server does not populate this today.""" + """Producer-supplied provenance, stored as sent.""" topic: builtins.str - topic_sequence: builtins.int - """Position within this topic. The global offset orders the whole stream; - this lets a consumer reason about one topic without decoding the rest. + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. Stored + as sent; the global offset is what orders the stream. + """ + kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType + """Settled to DATA on append when left unspecified, so a retry hashes the + same bytes and a reader never sees the zero value. """ - kind: global___StreamMessageKind.ValueType offset: builtins.int """Position in the whole stream, set on read and never stored. A consumer - that resumes at message granularity needs it, and a topic-filtered read + that resumes at record granularity needs it, and a topic-filtered read leaves gaps that make it underivable from the response alone. """ + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did: its publish + command clears the field, whatever the worker sent. + """ + attempt: builtins.int + """The producer's attempt, stored as sent. Readers treat a later attempt by + the same producer as superseding what the earlier one wrote. + """ def __init__( self, *, @@ -114,9 +99,11 @@ class StreamMessage(google.protobuf.message.Message): ] | None = ..., topic: builtins.str = ..., - topic_sequence: builtins.int = ..., - kind: global___StreamMessageKind.ValueType = ..., + sequence: builtins.int = ..., + kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType = ..., offset: builtins.int = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["body", b"body"] @@ -124,6 +111,8 @@ class StreamMessage(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "attempt", + b"attempt", "body", b"body", "kind", @@ -132,37 +121,39 @@ class StreamMessage(google.protobuf.message.Message): b"metadata", "offset", b"offset", + "producer_id", + b"producer_id", + "sequence", + b"sequence", "topic", b"topic", - "topic_sequence", - b"topic_sequence", ], ) -> None: ... -global___StreamMessage = StreamMessage +global___StreamRecord = StreamRecord -class StreamMessageBatch(google.protobuf.message.Message): - """One append is one batch, and one batch is one log node. The server stores +class StreamRecordBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one data node. The server stores this serialized and opaque; it decodes only to trim a partial first page or to apply a topic filter. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - global___StreamMessage + global___StreamRecord ]: ... def __init__( self, *, - messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + records: collections.abc.Iterable[global___StreamRecord] | None = ..., ) -> None: ... def ClearField( - self, field_name: typing_extensions.Literal["messages", b"messages"] + self, field_name: typing_extensions.Literal["records", b"records"] ) -> None: ... -global___StreamMessageBatch = StreamMessageBatch +global___StreamRecordBatch = StreamRecordBatch diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index b813e2dfc..3df3e3c35 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -25,7 +25,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"\x94\x01\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x06 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xc4\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x08 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"p\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x04 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xe0\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x07 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x90\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"T\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... producer_id: builtins.str """Idempotency, all optional. Supply a producer identity and sequence, or an @@ -115,36 +114,32 @@ class AddMessagesInput(google.protobuf.message.Message): by this repo's helper generator. """ use_expected_offset: builtins.bool - owner_epoch: builtins.int def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., run_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., producer_id: builtins.str = ..., sequence: builtins.int = ..., expected_offset: builtins.int = ..., use_expected_offset: builtins.bool = ..., - owner_epoch: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ "expected_offset", b"expected_offset", - "messages", - b"messages", "namespace", b"namespace", - "owner_epoch", - b"owner_epoch", "producer_id", b"producer_id", + "records", + b"records", "run_id", b"run_id", "sequence", @@ -331,7 +326,7 @@ class PollMessagesInput(google.protobuf.message.Message): self, ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: """Filters by exact topic. Offsets are assigned over the unfiltered stream, so - next_offset advances past filtered-out messages too. + next_offset advances past filtered-out records too. """ wait_new_messages: builtins.bool """When set and the reader is caught up, block until something arrives, the @@ -374,33 +369,39 @@ global___PollMessagesInput = PollMessagesInput class PollMessagesOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int NEXT_OFFSET_FIELD_NUMBER: builtins.int HEAD_OFFSET_FIELD_NUMBER: builtins.int CLOSED_FIELD_NUMBER: builtins.int CLOSE_REASON_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... next_offset: builtins.int head_offset: builtins.int closed: builtins.bool @property def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + run_id: builtins.str + """The execution holding the stream. A workflow task slice built from this + read names the run it came from. + """ def __init__( self, *, - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., next_offset: builtins.int = ..., head_offset: builtins.int = ..., closed: builtins.bool = ..., close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + run_id: builtins.str = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] @@ -414,10 +415,12 @@ class PollMessagesOutput(google.protobuf.message.Message): b"closed", "head_offset", b"head_offset", - "messages", - b"messages", "next_offset", b"next_offset", + "records", + b"records", + "run_id", + b"run_id", ], ) -> None: ... @@ -564,7 +567,7 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): WORKFLOW_ID_FIELD_NUMBER: builtins.int OWNER_RUN_ID_FIELD_NUMBER: builtins.int STREAM_NAME_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int PRODUCER_ID_FIELD_NUMBER: builtins.int SEQUENCE_FIELD_NUMBER: builtins.int namespace: builtins.str @@ -577,10 +580,10 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): stream_name: builtins.str """Empty means the workflow's default output stream.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... producer_id: builtins.str """Optional idempotency, as on AddMessagesInput.""" @@ -592,8 +595,8 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): workflow_id: builtins.str = ..., owner_run_id: builtins.str = ..., stream_name: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., producer_id: builtins.str = ..., @@ -602,14 +605,14 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "messages", - b"messages", "namespace", b"namespace", "owner_run_id", b"owner_run_id", "producer_id", b"producer_id", + "records", + b"records", "sequence", b"sequence", "stream_name", @@ -724,18 +727,25 @@ class DeleteStreamInput(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int + FORCE_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str + force: builtins.bool + """Delete even while a workflow consumer is active. Without it the call is + refused, because the consumer's History depends on ranges the deletion + takes with it. + """ def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., + force: builtins.bool = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "namespace", b"namespace", "stream_id", b"stream_id" + "force", b"force", "namespace", b"namespace", "stream_id", b"stream_id" ], ) -> None: ... @@ -1186,11 +1196,16 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + CONSUMER_RUN_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str consumer_workflow_id: builtins.str - """The workflow that will consume, which names the pin.""" + """The workflow that will consume. Together with the run it names the pin, + so a later run of the same workflow id registers fresh rather than + inheriting a closed run's floor. + """ + consumer_run_id: builtins.str start_offset: builtins.int """Negative means from wherever the stream is when the pin is taken. Resolved here, where the frontier is, and returned so the cursor records a fact. @@ -1201,11 +1216,14 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): namespace: builtins.str = ..., stream_id: builtins.str = ..., consumer_workflow_id: builtins.str = ..., + consumer_run_id: builtins.str = ..., start_offset: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ + "consumer_run_id", + b"consumer_run_id", "consumer_workflow_id", b"consumer_workflow_id", "namespace", @@ -1223,33 +1241,22 @@ class RegisterStreamConsumerOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor START_OFFSET_FIELD_NUMBER: builtins.int - COLLECTION_ID_FIELD_NUMBER: builtins.int - BUCKET_SIZE_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int start_offset: builtins.int - collection_id: builtins.str - """What the consumer needs to address the log, all decided by the stream.""" - bucket_size: builtins.int known_head: builtins.int + """The frontier at registration, so the cursor starts with a known head + instead of waiting for the first push. + """ def __init__( self, *, start_offset: builtins.int = ..., - collection_id: builtins.str = ..., - bucket_size: builtins.int = ..., known_head: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "bucket_size", - b"bucket_size", - "collection_id", - b"collection_id", - "known_head", - b"known_head", - "start_offset", - b"start_offset", + "known_head", b"known_head", "start_offset", b"start_offset" ], ) -> None: ... @@ -1305,8 +1312,36 @@ global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput class AdvanceConsumerHeadOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor + CONSUMER_CLOSED_FIELD_NUMBER: builtins.int + SUCCESSOR_RUN_ID_FIELD_NUMBER: builtins.int + SUCCESSOR_START_OFFSET_FIELD_NUMBER: builtins.int + consumer_closed: builtins.bool + """The run that held the pin is closed and no current run of the workflow + consumes the stream, so the stream can release the pin. + """ + successor_run_id: builtins.str + """The run that held the pin is closed but a successor carries the + subscription, so the stream re-keys the pin to it, with the floor the + successor's cursor started from. + """ + successor_start_offset: builtins.int def __init__( self, + *, + consumer_closed: builtins.bool = ..., + successor_run_id: builtins.str = ..., + successor_start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_closed", + b"consumer_closed", + "successor_run_id", + b"successor_run_id", + "successor_start_offset", + b"successor_start_offset", + ], ) -> None: ... global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 2ce5a0451..9f334a50f 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -22,13 +22,14 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xe5\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"}\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\x12\x14\n\x0creplay_floor\x18\x06 \x01(\x03"\xe0\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\x12\x14\n\x0cstart_offset\x18\n \x01(\x03"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ temporal.api.common.v1.message_pb2.Payload: ... - owner_epoch: builtins.int - """Bumped on ownership change so a stale producer's write fails.""" - bucket_size: builtins.int - """Immutable once set. Offsets roll to a new log tree every bucket_size so no - single storage partition grows with the stream. - """ - collection_id: builtins.str - """Identity of the log this stream writes to. Bucket trees are derived from - it, so there is no per-bucket index to store. - """ @property def producers( self, @@ -123,6 +114,21 @@ class StreamState(google.protobuf.message.Message): @property def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: """Wall-clock close time, used to schedule retention deletion.""" + @property + def budget(self) -> global___StreamBudget: + """Set on a stream a workflow owns. Its batches are the owning execution's + mutable state, so appends past the budget are refused rather than left to + the execution size limit, which terminates the workflow. + """ + appended_bytes: builtins.int + """Bytes appended over the stream's life, kept for the budget check. A stream + with a budget never reclaims, so this is also what it holds. + """ + notify_pending: builtins.bool + """A notify task is scheduled and has not run yet. Appends while it is set + schedule none of their own; the task reads the head when it runs, so it + carries every append that landed before it. + """ def __init__( self, *, @@ -130,9 +136,6 @@ class StreamState(google.protobuf.message.Message): base_offset: builtins.int = ..., closed: builtins.bool = ..., close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., - owner_epoch: builtins.int = ..., - bucket_size: builtins.int = ..., - collection_id: builtins.str = ..., producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] | None = ..., consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] @@ -140,10 +143,15 @@ class StreamState(google.protobuf.message.Message): lifecycle: global___StreamLifecycle | None = ..., redirect_run_id: builtins.str = ..., close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + budget: global___StreamBudget | None = ..., + appended_bytes: builtins.int = ..., + notify_pending: builtins.bool = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "budget", + b"budget", "close_reason", b"close_reason", "close_time", @@ -155,26 +163,26 @@ class StreamState(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "appended_bytes", + b"appended_bytes", "base_offset", b"base_offset", - "bucket_size", - b"bucket_size", + "budget", + b"budget", "close_reason", b"close_reason", "close_time", b"close_time", "closed", b"closed", - "collection_id", - b"collection_id", "consumers", b"consumers", "head_offset", b"head_offset", "lifecycle", b"lifecycle", - "owner_epoch", - b"owner_epoch", + "notify_pending", + b"notify_pending", "producers", b"producers", "redirect_run_id", @@ -184,6 +192,32 @@ class StreamState(google.protobuf.message.Message): global___StreamState = StreamState +class StreamBudget(google.protobuf.message.Message): + """Hard bounds on what a stream may hold. Distinct from StreamLifecycle.max_items, + which reclaims the oldest messages: a budget refuses the newest. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAX_ITEMS_FIELD_NUMBER: builtins.int + MAX_BYTES_FIELD_NUMBER: builtins.int + max_items: builtins.int + max_bytes: builtins.int + def __init__( + self, + *, + max_items: builtins.int = ..., + max_bytes: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_bytes", b"max_bytes", "max_items", b"max_items" + ], + ) -> None: ... + +global___StreamBudget = StreamBudget + class ProducerCursor(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -301,8 +335,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int - COLLECTION_ID_FIELD_NUMBER: builtins.int - BUCKET_SIZE_FIELD_NUMBER: builtins.int OFFSET_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int EXTERNAL_FIELD_NUMBER: builtins.int @@ -311,9 +343,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): HAS_PENDING_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int stream_id: builtins.str - collection_id: builtins.str - """Enough to address the log without reading the stream component first.""" - bucket_size: builtins.int offset: builtins.int """Next offset to deliver.""" known_head: builtins.int @@ -342,8 +371,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): self, *, stream_id: builtins.str = ..., - collection_id: builtins.str = ..., - bucket_size: builtins.int = ..., offset: builtins.int = ..., known_head: builtins.int = ..., external: builtins.bool = ..., @@ -355,10 +382,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "bucket_size", - b"bucket_size", - "collection_id", - b"collection_id", "external", b"external", "has_pending", @@ -389,7 +412,7 @@ class StreamLifecycle(google.protobuf.message.Message): def retention(self) -> google.protobuf.duration_pb2.Duration: """How long a closed stream stays readable before it is deleted.""" max_items: builtins.int - """Cap on readable messages. Older whole buckets are reclaimed once the floor + """Cap on readable messages. Whole batches are reclaimed once the floor passes them, so a capped stream has bounded storage. """ def __init__( From 9c7962005ecec897e2ebf81e3e6f668edc47dda0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 362/831] Moved the workflow stream runtime to records and batched a task's publishes. The delivered job and the publish command carry StreamRecord protos, and a task's publishes on one stream are held until the task completes so they become one command and one History event. --- temporalio/worker/_workflow_instance.py | 197 +++++++++++++--------- temporalio/workflow/__init__.py | 14 +- temporalio/workflow/_context.py | 105 +++++------- tests/worker/test_workflow_stream.py | 209 +++++++++++++++++------- 4 files changed, 319 insertions(+), 206 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 0a17d2b22..9b1e1ea0b 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -273,14 +273,45 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Match the server's per-batch limits. Rejecting here turns a wedged workflow, -# which would replay and re-issue the same rejected command forever, into an -# error the workflow author can see. -_MAX_STREAM_MESSAGES_PER_BATCH = 1000 -_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +# Match the server's per-batch limits. A record over its limit is refused where +# it is published, because a rejected command would be reissued on every +# replay; a task's records are split into commands that fit the batch limits. +_MAX_STREAM_RECORDS_PER_BATCH = 1000 +_MAX_STREAM_RECORD_BYTES = 1 << 20 _MAX_STREAM_BATCH_BYTES = 2 << 20 +def _stream_batches( + records: Sequence[temporalio.api.stream.v1.StreamRecord], +) -> Iterator[list[temporalio.api.stream.v1.StreamRecord]]: + """Split one task's records for a stream into batches the server accepts.""" + batch: list[temporalio.api.stream.v1.StreamRecord] = [] + size = 0 + for record in records: + record_size = record.ByteSize() + if batch and ( + len(batch) >= _MAX_STREAM_RECORDS_PER_BATCH + or size + record_size > _MAX_STREAM_BATCH_BYTES + ): + yield batch + batch, size = [], 0 + batch.append(record) + size += record_size + if batch: + yield batch + + +def _is_completion_command( + command: temporalio.bridge.proto.workflow_commands.WorkflowCommand, +) -> bool: + return ( + command.HasField("complete_workflow_execution") + or command.HasField("continue_as_new_workflow_execution") + or command.HasField("fail_workflow_execution") + or command.HasField("cancel_workflow_execution") + ) + + class _StreamBuffer: """Holds the stream ranges delivered to a workflow so far. @@ -292,7 +323,7 @@ class _StreamBuffer: def __init__(self, stream_id: str = "") -> None: self._stream_id = stream_id - self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._records: list[temporalio.workflow.DeliveredStreamRecord] = [] self._waiters: list[asyncio.Future] = [] # Where the next range has to start. Unknown until the first one # arrives, because a subscription may start wherever the stream is and @@ -301,19 +332,19 @@ def __init__(self, stream_id: str = "") -> None: def extend( self, - messages: Sequence[temporalio.api.stream.v1.StreamMessage], + records: Sequence[temporalio.api.stream.v1.StreamRecord], from_offset: int = 0, to_offset: int | None = None, ) -> None: if to_offset is None: - to_offset = from_offset + len(messages) + to_offset = from_offset + len(records) # A range is recorded as consumed once and never resent, so one that # repeats, skips or mis-sizes would hand the workflow duplicate or - # shifted bodies with nothing to say so. Failing the task is what makes - # the fault visible. - if to_offset - from_offset != len(messages): + # shifted records with nothing to say so. Failing the task is what + # makes the fault visible. + if to_offset - from_offset != len(records): raise RuntimeError( - f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"stream {self._stream_id!r} delivered {len(records)} records " f"for offsets [{from_offset}, {to_offset})" ) if self._next_offset is not None and from_offset != self._next_offset: @@ -324,34 +355,35 @@ def extend( self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. - if not messages: + if not records: return # Offsets are dense inside a delivered range and the range arrives in # order, so counting from its start is the position rather than an - # estimate of it. The per-message field is not on the activation, and a + # estimate of it. The per-record field is not on the activation, and a # reader that has to resume elsewhere needs a position it can name. - self._messages.extend( - temporalio.workflow.DeliveredStreamMessage( - body=message.body.data, - topic=message.topic, - offset=from_offset + index, + for index, record in enumerate(records): + # Copied so the buffer outlives the activation that carried it. + kept = temporalio.api.stream.v1.StreamRecord() + kept.CopyFrom(record) + self._records.append( + temporalio.workflow.DeliveredStreamRecord( + record=kept, offset=from_offset + index + ) ) - for index, message in enumerate(messages) - ) waiters, self._waiters = self._waiters, [] for waiter in waiters: if not waiter.done(): waiter.set_result(None) - def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: - taken, self._messages = self._messages, [] + def take(self) -> list[temporalio.workflow.DeliveredStreamRecord]: + taken, self._records = self._records, [] return taken def put_back( - self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + self, records: Sequence[temporalio.workflow.DeliveredStreamRecord] ) -> None: """Return an unread tail to the front of the buffer.""" - self._messages[:0] = messages + self._records[:0] = records def wait_future(self) -> asyncio.Future: loop = asyncio.get_event_loop() @@ -360,7 +392,7 @@ def wait_future(self) -> asyncio.Future: return fut def __len__(self) -> int: - return len(self._messages) + return len(self._records) class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] @@ -496,6 +528,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: # arrive whether or not anything is reading yet, because the server has # already recorded them as consumed and will not send them again. self._stream_buffers: dict[str, _StreamBuffer] = {} + # Records this task's publishes append, by stream, until the task + # completes and they become commands. + self._stream_appends: dict[ + str, list[temporalio.api.stream.v1.StreamRecord] + ] = {} # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down @@ -557,6 +594,9 @@ def activate( temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion() ) self._current_completion.successful.SetInParent() + # A failed task's publishes never became commands, so nothing carries + # over into this one. + self._stream_appends = {} self._current_activation_error: Exception | None = None self._deployment_version_for_current_task = ( @@ -648,6 +688,9 @@ def activate( ) activation_err = None + if activation_err is None and not self._deleting: + self._flush_stream_appends() + # Apply versioning behavior if one was established if self._versioning_behavior: self._current_completion.successful.versioning_behavior = ( @@ -712,8 +755,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) - elif job.HasField("deliver_stream_messages"): - self._apply_deliver_stream_messages(job.deliver_stream_messages) + elif job.HasField("deliver_stream_records"): + self._apply_deliver_stream_records(job.deliver_stream_records) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1239,9 +1282,9 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) - def _apply_deliver_stream_messages( + def _apply_deliver_stream_records( self, - job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamRecords, ) -> None: buffer = self._stream_buffers.get(job.stream_id) if buffer is None: @@ -1250,7 +1293,7 @@ def _apply_deliver_stream_messages( # subscription made later in the same task still sees it. buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset, job.to_offset) + buffer.extend(job.records, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1425,51 +1468,53 @@ def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset - def workflow_add_stream_messages( - self, stream_id: str, messages: Sequence[bytes], topic: str + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: - if not messages: - raise ValueError("add_stream_messages needs at least one message") - if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: - raise ValueError( - f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " - f"got {len(messages)}" - ) - total = 0 - for body in messages: - if len(body) > _MAX_STREAM_MESSAGE_BYTES: + self._assert_not_read_only("append stream records") + if not records: + raise ValueError("append_stream_records needs at least one record") + kept: list[temporalio.api.stream.v1.StreamRecord] = [] + for record in records: + if record.ByteSize() > _MAX_STREAM_RECORD_BYTES: raise ValueError( - f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " - f"bytes, got {len(body)}" + f"a stream record is limited to {_MAX_STREAM_RECORD_BYTES} " + f"bytes, got {record.ByteSize()}" ) - total += len(body) - if total > _MAX_STREAM_BATCH_BYTES: - raise ValueError( - f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" - ) - command = self._add_command() - command.add_stream_messages.stream_id = stream_id - for body in messages: - # The bodies ride the command and never enter History, so the event - # this produces stays the same size whatever is published here. - message = command.add_stream_messages.messages.add() - message.body.data = body - # Every other Temporal payload names its encoding, and the UI, the - # CLI and any codec server rely on that to decode what they read. - message.body.metadata["encoding"] = b"binary/plain" - message.topic = topic - - async def workflow_read_stream( - self, stream_id: str, max_messages: int - ) -> list[bytes]: - return [ - m.body - for m in await self.workflow_read_stream_messages(stream_id, max_messages) - ] - - async def workflow_read_stream_messages( - self, stream_id: str, max_messages: int - ) -> list[temporalio.workflow.DeliveredStreamMessage]: + copy = temporalio.api.stream.v1.StreamRecord() + copy.CopyFrom(record) + # The workflow is the producer here, whatever the caller set. + copy.producer_id = "" + kept.append(copy) + # Held until the task completes, so a task's publishes on one stream + # become one command and one History event however many there were. + self._stream_appends.setdefault(stream_id, []).extend(kept) + + def _flush_stream_appends(self) -> None: + appends, self._stream_appends = self._stream_appends, {} + if not appends: + return + commands = self._current_completion.successful.commands + # Ahead of any command that ends the run, because the server accepts + # nothing after one of those. + insert_at = len(commands) + for index, command in enumerate(commands): + if _is_completion_command(command): + insert_at = index + break + for stream_id, records in appends.items(): + for batch in _stream_batches(records): + command = temporalio.bridge.proto.workflow_commands.WorkflowCommand() + command.append_stream_records.stream_id = stream_id + command.append_stream_records.records.extend(batch) + commands.insert(insert_at, command) + insert_at += 1 + + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[temporalio.workflow.DeliveredStreamRecord]: # Ranges arrive on Workflow Tasks, and a query activation carries none, # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. @@ -1478,10 +1523,10 @@ async def workflow_read_stream_messages( while not len(buffer): await buffer.wait_future() taken = buffer.take() - if max_messages and len(taken) > max_messages: + if max_records and len(taken) > max_records: # Put the tail back rather than dropping it: nothing will resend it. - buffer.put_back(taken[max_messages:]) - taken = taken[:max_messages] + buffer.put_back(taken[max_records:]) + taken = taken[:max_records] return taken def workflow_get_current_history_length(self) -> int: diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 8d57b75e7..18d04cb0c 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,7 +58,7 @@ wait, ) from ._context import ( - DeliveredStreamMessage, + DeliveredStreamRecord, Info, ParentInfo, RootInfo, @@ -66,7 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, - add_stream_messages, + append_stream_records, cancellation_reason, current_update_info, deprecate_patch, @@ -88,8 +88,7 @@ payload_converter, random, random_seed, - read_stream, - read_stream_messages, + read_stream_records, register_random_seed_callback, set_current_details, sleep, @@ -238,10 +237,9 @@ "upsert_search_attributes", "uuid4", "uuid7", - "DeliveredStreamMessage", - "read_stream", - "read_stream_messages", - "add_stream_messages", + "DeliveredStreamRecord", + "read_stream_records", + "append_stream_records", "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 57183aafb..8b6c07782 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -14,6 +14,7 @@ from nexusrpc import InputT, OutputT import temporalio.api.common.v1 +import temporalio.api.stream.v1 import temporalio.common import temporalio.converter @@ -317,19 +318,16 @@ def workflow_get_current_deployment_version( def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... @abstractmethod - def workflow_add_stream_messages( - self, stream_id: str, messages: Sequence[bytes], topic: str + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: ... @abstractmethod - async def workflow_read_stream( - self, stream_id: str, max_messages: int - ) -> list[bytes]: ... - - @abstractmethod - async def workflow_read_stream_messages( - self, stream_id: str, max_messages: int - ) -> list[DeliveredStreamMessage]: ... + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[DeliveredStreamRecord]: ... @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -968,10 +966,10 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: - """Subscribe this workflow to a stream. + """Subscribe this workflow to a server-side stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: a second + and :func:`read_stream_records` returns them. Safe to call again: a second subscription to a stream this run already consumes does not move its cursor, though it does write one event. Calling it on every replay is harmless because replay matches the command to the event already recorded. @@ -979,10 +977,12 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up without doing I/O and a value it carried would be a reading rather than a - fact. + fact. A name this workflow has not written yet names a stream it owns, and + subscribing creates it. Args: - stream_id: Stream to consume. + stream_id: Stream to consume: the name of one this workflow owns, or + the id of a standalone stream. start_offset: Where to start. Negative means from wherever the stream is when the subscription is registered; the server resolves that once and records it, so replay does not resolve it again. @@ -990,83 +990,60 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) -def add_stream_messages( - messages: Sequence[bytes], +def append_stream_records( + records: Sequence[temporalio.api.stream.v1.StreamRecord], *, stream_id: str = "", - topic: str = "", ) -> None: - """Publish a batch of messages to a stream this workflow owns. + """Publish records to a server-side stream this workflow owns. - Returns as soon as the command is issued. The bodies go to the stream's own - log rather than into History, which gets one fixed-size event naming the - offset range, so a batch of a thousand costs History the same as a batch of + Returns at once. The records become one command when this Workflow Task + completes, so they are visible when the task is accepted and never if it + fails. Their bodies go to the stream's own log rather than into History, + which gets one fixed-size event naming the offset range, so a task that + publishes a thousand records costs History the same as one that publishes one. Readers do not have to exist yet, and adding one costs the writer nothing. - Batch where you can. The event is per call, and a workflow is bounded by the - history event count, so one call with a hundred messages leaves far more - room than a hundred calls with one. - Args: - messages: Bodies to append, in order. + records: Records to append, in order. The server stores each with an + empty ``producer_id``, because the workflow is the producer. stream_id: Stream to publish to. Empty means the workflow's default output stream. - topic: Optional topic, which readers can filter on. Offsets are still - assigned over the unfiltered stream. + + Raises: + ValueError: ``records`` is empty or one of them is over the server's + per-record size limit. """ - _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + _Runtime.current().workflow_append_stream_records(stream_id, records) @dataclass(frozen=True) -class DeliveredStreamMessage: - """One message a consuming workflow was given, with where it sat.""" +class DeliveredStreamRecord: + """One record a consuming workflow was given, with where it sat.""" - body: bytes - topic: str + record: temporalio.api.stream.v1.StreamRecord offset: int """Its position in the whole stream, which is what a reader resumes from.""" -async def read_stream_messages( - stream_id: str, *, max_messages: int = 0 -) -> list[DeliveredStreamMessage]: - """Read the next messages, keeping their topic and position. - - Same delivery as :func:`read_stream`. A reader that has to name where it - got to, filter a topic, or hand a position to something outside the - workflow needs more than the bodies. - - Args: - stream_id: Stream to read from. - max_messages: Most messages to return at once, or 0 for everything - available. - """ - return await _Runtime.current().workflow_read_stream_messages( - stream_id, max_messages - ) - +async def read_stream_records( + stream_id: str, *, max_records: int = 0 +) -> list[DeliveredStreamRecord]: + """Read the next records of a server-side stream this workflow consumes. -async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: - """Read the next messages of a stream this workflow consumes. - - Waits until at least one message is available. Ranges arrive on Workflow + Waits until at least one record is available. Ranges arrive on Workflow Tasks, and only the offsets they covered are written to History, so this is deterministic on replay: the server re-supplies the same ranges by reading - the stream again. - - Subscribe out of band with the stream client. This only reads what has - already been delivered to this workflow. + the stream again. Subscribe first with :func:`subscribe_stream`; this only + reads what has already been delivered to this workflow. Args: stream_id: Stream to read from. - max_messages: Most messages to return at once, or 0 for everything + max_records: Most records to return at once, or 0 for everything available. - - Returns: - The message bodies, in stream order. """ - return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + return await _Runtime.current().workflow_read_stream_records(stream_id, max_records) async def wait_condition( diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 93b596b8c..9083e74a9 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -1,9 +1,10 @@ -"""In-workflow consumption of a server-side stream. +"""In-workflow consumption and publication of a server-side stream. Ranges arrive on Workflow Tasks and only the offsets they covered are written to History, so replay is served by the server reading the stream again. These tests -drive the buffering and the workflow-facing read directly, which is the part -this SDK owns; the delivery decision itself lives in the server and sdk-core. +drive the buffering, the workflow-facing read and the per-task publish directly, +which is the part this SDK owns; the delivery decision itself lives in the +server and sdk-core. """ from __future__ import annotations @@ -18,22 +19,29 @@ from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( _MAX_STREAM_BATCH_BYTES, - _MAX_STREAM_MESSAGE_BYTES, + _MAX_STREAM_RECORD_BYTES, + _MAX_STREAM_RECORDS_PER_BATCH, _StreamBuffer, _WorkflowInstanceImpl, ) from temporalio.workflow import ReadOnlyContextError -def message(body: bytes) -> api_stream.StreamMessage: - return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) +def record(body: bytes, topic: str = "") -> api_stream.StreamRecord: + return api_stream.StreamRecord( + body=temporalio.api.common.v1.Payload(data=body), topic=topic + ) + + +def bodies(delivered: list[Any]) -> list[bytes]: + return [item.record.body.data for item in delivered] async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() - buffer.extend([message(b"one"), message(b"two")]) + buffer.extend([record(b"one"), record(b"two")]) - assert [m.body for m in buffer.take()] == [b"one", b"two"] + assert bodies(buffer.take()) == [b"one", b"two"] assert len(buffer) == 0 @@ -44,9 +52,9 @@ async def test_buffer_wakes_a_waiting_reader() -> None: waiter = buffer.wait_future() assert not waiter.done() - buffer.extend([message(b"late")]) + buffer.extend([record(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body for m in buffer.take()] == [b"late"] + assert bodies(buffer.take()) == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -63,24 +71,24 @@ async def test_empty_range_does_not_wake_a_reader() -> None: async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: buffer = _StreamBuffer() - buffer.extend([message(b"early")]) + buffer.extend([record(b"early")]) # No waiting: the data is already there. assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body for m in buffer.take()] == [b"early"] + assert bodies(buffer.take()) == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream_messages``, so a test that + The cap lives inside ``workflow_read_stream_records``, so a test that reimplements it proves nothing about the code that ships. Borrowing the method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages + workflow_read_stream_records = _WorkflowInstanceImpl.workflow_read_stream_records def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} @@ -90,31 +98,33 @@ def _assert_not_read_only(self, action: str) -> None: if self._read_only: raise ReadOnlyContextError(f"cannot {action} in a read-only context") - async def read(self, stream: str, max_messages: int) -> list[bytes]: + async def read(self, stream: str, max_records: int) -> list[bytes]: instance: Any = self - return await _WorkflowInstanceImpl.workflow_read_stream( - instance, stream, max_messages + return bodies( + await _WorkflowInstanceImpl.workflow_read_stream_records( + instance, stream, max_records + ) ) -@pytest.mark.parametrize("max_messages", [1, 2, 5]) -async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: +@pytest.mark.parametrize("max_records", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_records: int) -> None: stub = _ReadOnlyStub() - bodies = [b"a", b"b", b"c"] + expected = [b"a", b"b", b"c"] stub._stream_buffers["s"] = _StreamBuffer() - stub._stream_buffers["s"].extend([message(b) for b in bodies]) + stub._stream_buffers["s"].extend([record(b) for b in expected]) - got = await stub.read("s", max_messages) + got = await stub.read("s", max_records) - assert got == bodies[:max_messages] + assert got == expected[:max_records] # Whatever the cap left behind has to still be there: nothing resends it. - assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + assert len(stub._stream_buffers["s"]) == max(0, len(expected) - max_records) if len(stub._stream_buffers["s"]): rest = await stub.read("s", 0) - assert got + rest == bodies + assert got + rest == expected else: - assert got == bodies + assert got == expected # A query activation carries no ranges, so a read there would wait on a future @@ -122,7 +132,7 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> async def test_read_is_refused_in_a_read_only_context() -> None: stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() - stub._stream_buffers["s"].extend([message(b"a")]) + stub._stream_buffers["s"].extend([record(b"a")]) with pytest.raises(ReadOnlyContextError, match="read stream"): await stub.read("s", 0) @@ -135,61 +145,144 @@ async def test_read_is_refused_in_a_read_only_context() -> None: # only place a repeated, skipped or mis-sized delivery can still be noticed. async def test_ranges_have_to_abut_the_last_one() -> None: buffer = _StreamBuffer("s") - buffer.extend([message(b"a"), message(b"b")], 0, 2) + buffer.extend([record(b"a"), record(b"b")], 0, 2) # An empty range moves the expectation too: the server recorded it. buffer.extend([], 2, 2) - buffer.extend([message(b"c")], 2, 3) - assert [m.offset for m in buffer.take()] == [0, 1, 2] + buffer.extend([record(b"c")], 2, 3) + assert [item.offset for item in buffer.take()] == [0, 1, 2] with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): - buffer.extend([message(b"c")], 2, 3) + buffer.extend([record(b"c")], 2, 3) with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): - buffer.extend([message(b"f")], 5, 6) + buffer.extend([record(b"f")], 5, 6) -async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: +async def test_a_range_has_to_carry_as_many_records_as_it_spans() -> None: buffer = _StreamBuffer("s") - with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): - buffer.extend([message(b"a"), message(b"b")], 0, 1) + with pytest.raises(RuntimeError, match=r"2 records for offsets \[0, 1\)"): + buffer.extend([record(b"a"), record(b"b")], 0, 1) assert len(buffer) == 0 +class _Completion: + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + +class _Successful: + def __init__(self) -> None: + self.successful = _Completion() + + class _CommandStub: - """Drives the real publish path and keeps the commands it issued.""" + """Drives the real publish path and keeps the commands it issued. + + The completion's command list is a plain list here, which supports the + same ``insert`` the protobuf container does. + """ - workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + workflow_append_stream_records = ( + _WorkflowInstanceImpl.workflow_append_stream_records + ) + _flush_stream_appends = _WorkflowInstanceImpl._flush_stream_appends def __init__(self) -> None: - self.commands: list[WorkflowCommand] = [] + self._stream_appends: dict[str, list[api_stream.StreamRecord]] = {} + self._current_completion = _Successful() + + def _assert_not_read_only(self, _action: str) -> None: + pass + + @property + def commands(self) -> list[WorkflowCommand]: + return self._current_completion.successful.commands - def _add_command(self) -> WorkflowCommand: - command = WorkflowCommand() - self.commands.append(command) - return command + def publish(self, *records: api_stream.StreamRecord, stream_id: str = "") -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_append_stream_records( + instance, stream_id, list(records) + ) - def publish(self, *bodies: bytes) -> None: + def flush(self) -> None: instance: Any = self - _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + _WorkflowInstanceImpl._flush_stream_appends(instance) -# The server refuses an oversized publish, and a refused command is reissued -# on every replay, so the limits have to be applied before the command exists. -def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: +# A task's publishes on one stream become one command, whatever their number, +# because the event the command produces is what bounds a workflow's History. +def test_a_tasks_publishes_on_one_stream_become_one_command() -> None: stub = _CommandStub() - stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) - assert len(stub.commands) == 1 + stub.publish(record(b"a"), record(b"b")) + stub.publish(record(b"c")) + stub.publish(record(b"d"), stream_id="other") + assert stub.commands == [] + + stub.flush() + + by_stream = { + command.append_stream_records.stream_id: [ + r.body.data for r in command.append_stream_records.records + ] + for command in stub.commands + } + assert by_stream == {"": [b"a", b"b", b"c"], "other": [b"d"]} + # Flushed once: a second flush has nothing left to say. + stub.flush() + assert len(stub.commands) == 2 + + +# The workflow is the producer of what it publishes, whatever the caller set. +def test_the_workflows_records_carry_no_producer() -> None: + stub = _CommandStub() + stub.publish(api_stream.StreamRecord(producer_id="someone", attempt=3)) + stub.flush() + assert stub.commands[0].append_stream_records.records[0].producer_id == "" - with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): - stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) - assert len(stub.commands) == 1 +# The server accepts nothing after a command that ends the run, so the +# publishes have to go ahead of it. +def test_publishes_are_flushed_ahead_of_the_completion_command() -> None: + stub = _CommandStub() + stub.publish(record(b"a")) + done = WorkflowCommand() + done.complete_workflow_execution.SetInParent() + stub.commands.append(done) + + stub.flush() -def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + assert [c.WhichOneof("variant") for c in stub.commands] == [ + "append_stream_records", + "complete_workflow_execution", + ] + + +# The server refuses an oversized record, and a refused command is reissued on +# every replay, so the limit has to be applied before the record is buffered. +def test_a_record_over_the_server_limit_is_refused_before_the_command() -> None: stub = _CommandStub() - half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) - stub.publish(half, half) + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16))) + with pytest.raises(ValueError, match=f"{_MAX_STREAM_RECORD_BYTES} bytes"): + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES + 1))) + stub.flush() assert len(stub.commands) == 1 - with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): - stub.publish(half, half, b"x") - assert len(stub.commands) == 1 + +# A task that publishes more than one batch holds is split into commands the +# server accepts, by count and by bytes, rather than refused. +def test_a_task_over_the_batch_limits_is_split_into_commands() -> None: + stub = _CommandStub() + stub.publish(*(record(b"x") for _ in range(_MAX_STREAM_RECORDS_PER_BATCH + 1))) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [ + _MAX_STREAM_RECORDS_PER_BATCH, + 1, + ] + + stub = _CommandStub() + # Two records that fit one batch together, then one whose framing alone + # overflows the room they leave. + big = record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16)) + room = _MAX_STREAM_BATCH_BYTES - 2 * big.ByteSize() + stub.publish(big, big, record(b"y" * room)) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [2, 1] From 784158dab767cd941554729cf3f0a88a4010cc8e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 363/831] Moved the stream client and the contrib surface to records and SDK errors. Every stub call translates the transport's failure into StreamNotFoundError or RPCError, and the client's payload codec is applied to bodies so the two sides of a namespace with a codec agree. --- temporalio/client_stream.py | 347 ++++++++++-------- temporalio/contrib/server_streams/__init__.py | 150 ++++---- tests/contrib/test_server_streams.py | 7 +- tests/test_client_stream.py | 121 ++++-- 4 files changed, 360 insertions(+), 265 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 15760a980..b482941af 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -3,7 +3,8 @@ A stream is a durable, offset-addressed append-only sequence that lives beside Workflow History rather than inside it. Appending schedules no Workflow Task, and each reader holds its own cursor, so adding a reader costs nothing on the -write side. +write side. The record is ``temporal.api.stream.v1.StreamRecord`` on the wire +and in the store, so a reader in any language decodes the same bytes. Prototype support for AI-198. Four things about it are temporary and will change before this is a real feature: @@ -15,37 +16,47 @@ coming from the api submodule, because the service is still defined in the server. That is why the wire names read as server-internal. - **This client is for use outside a Workflow.** Workflow code publishes and - consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` - instead. + consumes with ``workflow.append_stream_records`` and + ``workflow.read_stream_records`` instead. - **No TLS or API-key support**, for the same reason: the channel is built here rather than by the machinery that normally handles that. + +A failed call raises :class:`temporalio.streams.StreamNotFoundError` when the +server answers ``NOT_FOUND`` and :class:`temporalio.service.RPCError` +otherwise, never the transport's own exception type. """ from __future__ import annotations import asyncio import weakref -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass -from typing import Any +from typing import Any, TypeVar import google.protobuf.duration_pb2 +import grpc +import grpc.aio -import temporalio.api.common.v1 import temporalio.api.streamservice.v1 as stream +from temporalio.api.stream.v1 import StreamRecord from temporalio.api.streamservice.v1 import service_pb2_grpc +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import StreamNotFoundError __all__ = [ "Appended", - "Message", "Page", "StreamClient", + "StreamEntry", "StreamHandle", "WorkflowStreamHandle", "close_shared_clients", "shared_client", ] +_T = TypeVar("_T") + @dataclass(frozen=True) class Appended: @@ -62,23 +73,16 @@ class Appended: @dataclass(frozen=True) -class Message: - """One item read from a stream. +class StreamEntry: + """One record read from a stream, with where it sits. Offsets are assigned over the unfiltered stream, so a topic-filtered read - hands back messages whose offsets are not contiguous. To resume at the - boundary of a whole read, checkpoint the ``next_offset`` that - :meth:`StreamHandle.read` returns instead. + hands back entries whose offsets are not contiguous. A reader that resumes + between records takes ``offset`` rather than counting what it received. """ - data: bytes - topic: str = "" + record: StreamRecord offset: int = 0 - """Where this message sits in the whole stream. - - A topic filter leaves gaps, so a reader that resumes between messages has - to take this rather than count what it received. - """ @dataclass(frozen=True) @@ -86,13 +90,73 @@ class Page: """One read of a stream. ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can - be added and this reader has everything. + be added and this reader has everything. ``run_id`` names the execution + holding the stream, which is how a reader of a workflow's stream learns + which run it is on when it did not pin one. """ - messages: list[Message] + entries: list[StreamEntry] next_offset: int head_offset: int closed: bool + run_id: str = "" + + +def _to_service(record: StreamRecord) -> stream.StreamRecord: + # Field for field the public record; the stored shape only adds the offset + # a read assigns. An unset body stays unset so a FINISH record reads back + # as one. + out = stream.StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return out + + +def _to_public(record: stream.StreamRecord) -> StreamEntry: + out = StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return StreamEntry(record=out, offset=record.offset) + + +def _translate(error: grpc.aio.AioRpcError) -> Exception: + code = error.code() + details = error.details() or code.name + if code is grpc.StatusCode.NOT_FOUND: + return StreamNotFoundError(details) + raw = b"" + # The aio metadata iterates as (key, value) pairs at runtime, whatever + # shape the stubs give its items. + trailing: Any = error.trailing_metadata() + for item in trailing or (): + key, value = item[0], item[1] + if key == "grpc-status-details-bin" and isinstance(value, bytes): + raw = value + return RPCError(details, RPCStatusCode(code.value[0]), raw) + + +async def _call(method: Callable[[Any], Awaitable[_T]], request: Any) -> _T: + """Make one stub call, translating the transport's failure to the SDK's.""" + try: + return await method(request) + except grpc.aio.AioRpcError as error: + raise _translate(error) from error class StreamClient: @@ -107,19 +171,12 @@ def __init__(self, channel: Any, namespace: str) -> None: self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod - def connect(target_host: str, namespace: str = "default") -> "StreamClient": + def connect(target_host: str, namespace: str = "default") -> StreamClient: """Open a channel to a frontend. Separate from ``Client.connect`` because this does not share the connection the rest of the SDK uses. """ - try: - import grpc - except ImportError as err: - raise RuntimeError( - "temporalio.client_stream requires the grpc extra: " - "pip install 'temporalio[grpc]'" - ) from err return StreamClient(grpc.aio.insecure_channel(target_host), namespace) async def close(self) -> None: @@ -132,11 +189,11 @@ async def create( *, retention: float | None = None, max_items: int | None = None, - ) -> "StreamHandle": + ) -> StreamHandle: """Create a stream and return a handle to it. ``retention`` is how long a closed stream stays readable, in seconds. - ``max_items`` caps how many messages remain readable, dropping the + ``max_items`` caps how many records remain readable, dropping the oldest, which bounds storage for a stream nobody truncates. """ lifecycle = stream.StreamLifecycle() @@ -147,14 +204,15 @@ async def create( if max_items is not None: lifecycle.max_items = max_items - response = await self._stub.CreateStream( + response = await _call( + self._stub.CreateStream, stream.CreateStreamRequest( frontend_request=stream.CreateStreamInput( namespace=self._namespace, stream_id=stream_id, lifecycle=lifecycle, ) - ) + ), ) return StreamHandle( self._stub, @@ -163,24 +221,25 @@ async def create( run_id=response.frontend_response.run_id, ) - def get(self, stream_id: str) -> "StreamHandle": + def get(self, stream_id: str) -> StreamHandle: """Open an existing stream without a round trip.""" return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( self, workflow_id: str, name: str = "", *, owner_run_id: str = "" - ) -> "WorkflowStreamHandle": - """Open a stream a workflow publishes to. + ) -> WorkflowStreamHandle: + """Open a stream a workflow owns. A stream a workflow owns lives inside that workflow's execution and has no id of its own, so it is named by its owner and its name. An empty name is the workflow's default output stream, which is what - ``workflow.add_stream_messages`` writes to when it is given none. + ``workflow.append_stream_records`` writes to when it is given none. - The stream is created by the workflow's first publish. Reading one that - does not exist yet is not an error: it reads as empty and a - :meth:`WorkflowStreamHandle.follow` parked on it wakes when the - workflow publishes. + The stream is created by the workflow's first publish or subscription, + or by the first append from outside. Reading one that does not exist + yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when something + is written. ``owner_run_id`` pins the handle to one run of the workflow; see :meth:`WorkflowStreamHandle.pin` for why a follower wants that. @@ -191,7 +250,7 @@ def workflow_stream( class StreamHandle: - """A handle to one stream.""" + """A handle to one standalone stream.""" def __init__( self, stub: Any, namespace: str, stream_id: str, run_id: str = "" @@ -211,12 +270,11 @@ def id(self) -> str: async def append( self, - *messages: bytes, - topic: str = "", + *records: StreamRecord, producer_id: str = "", sequence: int = 0, ) -> Appended: - """Append messages and return where they landed. + """Append records and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than @@ -224,26 +282,18 @@ async def append( at-least-once, which is only the right trade when duplicates are harmless. """ - response = await self._stub.AddMessages( + response = await _call( + self._stub.AddMessages, stream.AddMessagesRequest( frontend_request=stream.AddMessagesInput( namespace=self._namespace, stream_id=self._id, run_id=self._run_id, - messages=[ - stream.StreamMessage( - body=temporalio.api.common.v1.Payload( - data=m, metadata={"encoding": b"binary/plain"} - ), - topic=topic, - kind=stream.STREAM_MESSAGE_KIND_DATA, - ) - for m in messages - ], + records=[_to_service(record) for record in records], producer_id=producer_id, sequence=sequence, ) - ) + ), ) return _appended(response.frontend_response) @@ -251,43 +301,29 @@ async def read( self, *, from_offset: int = 0, - max_messages: int = 0, + max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, - ) -> tuple[list[Message], int]: - """Read once from ``from_offset``, returning the messages and the + ) -> tuple[list[StreamEntry], int]: + """Read once from ``from_offset``, returning the entries and the offset to read from next. With ``wait`` set, blocks until something arrives, the stream closes, or the server's long-poll window elapses. A window that elapses returns an empty list rather than raising, so the caller just reads again. """ - response = await self._stub.PollMessages( - stream.PollMessagesRequest( - frontend_request=stream.PollMessagesInput( - namespace=self._namespace, - stream_id=self._id, - run_id=self._run_id, - from_offset=from_offset, - max_messages=max_messages, - topics=list(topics), - wait_new_messages=wait, - ) - ) + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait ) - out = response.frontend_response - return [ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], (out.next_offset) + return page.entries, page.next_offset async def follow( self, *, from_offset: int = 0, topics: Sequence[str] = (), - ) -> AsyncIterator[Message]: - """Yield messages as they arrive, starting at ``from_offset``. + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, starting at ``from_offset``. Ends once the stream is closed and this reader has drained it. A closed stream stays readable until its retention expires, so a reader that @@ -296,61 +332,77 @@ async def follow( """ offset = from_offset while True: - response = await self._stub.PollMessages( - stream.PollMessagesRequest( - frontend_request=stream.PollMessagesInput( - namespace=self._namespace, - stream_id=self._id, - run_id=self._run_id, - from_offset=offset, - topics=list(topics), - wait_new_messages=True, - ) - ) - ) - out = response.frontend_response - for msg in out.messages: - yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) - offset = out.next_offset - if out.closed and offset >= out.head_offset: + page = await self.poll(from_offset=offset, topics=topics) + for entry in page.entries: + yield entry + offset = page.next_offset + if page.closed and offset >= page.head_offset: return + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_records: int = 0, + wait: bool = True, + ) -> Page: + """One read, with everything the caller needs to decide what to do next.""" + response = await _call( + self._stub.PollMessages, + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_records, + topics=list(topics), + wait_new_messages=wait, + ) + ), + ) + return _page(response.frontend_response) + async def finish_writing(self, producer_id: str) -> None: """Declare one producer done without ending the stream for others.""" - await self._stub.FinishWriting( + await _call( + self._stub.FinishWriting, stream.FinishWritingRequest( frontend_request=stream.FinishWritingInput( namespace=self._namespace, stream_id=self._id, producer_id=producer_id, ) - ) + ), ) async def close(self) -> None: """Seal the stream. Readers can still drain what is already there.""" - await self._stub.CloseStream( + await _call( + self._stub.CloseStream, stream.CloseStreamRequest( frontend_request=stream.CloseStreamInput( namespace=self._namespace, stream_id=self._id ) - ) + ), ) async def describe(self) -> stream.StreamState: """Read the stream's current frontier, floor and closed state.""" - response = await self._stub.DescribeStream( + response = await _call( + self._stub.DescribeStream, stream.DescribeStreamRequest( frontend_request=stream.DescribeStreamInput( namespace=self._namespace, stream_id=self._id ) - ) + ), ) return response.frontend_response.state class WorkflowStreamHandle: - """A handle to a stream a workflow publishes to. + """A handle to a stream a workflow owns. The workflow writes to it from inside its Workflow Task, which costs it no transition of its own. Anything else writes through :meth:`append`, which @@ -404,8 +456,7 @@ def pin(self, run_id: str) -> None: async def append( self, - *messages: bytes, - topic: str = "", + *records: StreamRecord, producer_id: str = "", sequence: int = 0, ) -> Appended: @@ -415,27 +466,19 @@ async def append( execution whatever its size, so a batch of a hundred costs what a batch of one does. """ - response = await self._stub.AddWorkflowMessages( + response = await _call( + self._stub.AddWorkflowMessages, stream.AddWorkflowMessagesRequest( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, owner_run_id=self._owner_run_id, stream_name=self._name, - messages=[ - stream.StreamMessage( - body=temporalio.api.common.v1.Payload( - data=m, metadata={"encoding": b"binary/plain"} - ), - topic=topic, - kind=stream.STREAM_MESSAGE_KIND_DATA, - ) - for m in messages - ], + records=[_to_service(record) for record in records], producer_id=producer_id, sequence=sequence, ) - ) + ), ) return _appended(response.frontend_response) @@ -443,43 +486,28 @@ async def read( self, *, from_offset: int = 0, - max_messages: int = 0, + max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, - ) -> tuple[list[Message], int]: + ) -> tuple[list[StreamEntry], int]: """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" - response = await self._stub.PollWorkflowMessages( - stream.PollWorkflowMessagesRequest( - frontend_request=stream.PollWorkflowMessagesInput( - namespace=self._namespace, - workflow_id=self._workflow_id, - owner_run_id=self._owner_run_id, - stream_name=self._name, - from_offset=from_offset, - max_messages=max_messages, - topics=list(topics), - wait_new_messages=wait, - ) - ) + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait ) - out = response.frontend_response - return [ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], (out.next_offset) + return page.entries, page.next_offset async def follow( self, *, from_offset: int = 0, topics: Sequence[str] = (), - ) -> AsyncIterator[Message]: - """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, as :meth:`StreamHandle.follow`.""" offset = from_offset while True: page = await self.poll(from_offset=offset, topics=topics) - for msg in page.messages: - yield msg + for entry in page.entries: + yield entry offset = page.next_offset if page.closed and offset >= page.head_offset: return @@ -489,16 +517,17 @@ async def poll( *, from_offset: int = 0, topics: Sequence[str] = (), - max_messages: int = 0, + max_records: int = 0, wait: bool = True, - ) -> "Page": + ) -> Page: """One read, with everything the caller needs to decide what to do next. :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. On a pinned handle ``closed`` also says the run has ended. """ - response = await self._stub.PollWorkflowMessages( + response = await _call( + self._stub.PollWorkflowMessages, stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, @@ -506,22 +535,13 @@ async def poll( owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, - max_messages=max_messages, + max_messages=max_records, topics=list(topics), wait_new_messages=wait, ) - ) - ) - out = response.frontend_response - return Page( - messages=[ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], - next_offset=out.next_offset, - head_offset=out.head_offset, - closed=out.closed, + ), ) + return _page(response.frontend_response) async def describe(self) -> stream.StreamState: """Read the stream's current frontier, floor and closed state. @@ -529,7 +549,8 @@ async def describe(self) -> stream.StreamState: A reader that wants only what comes next starts from the head this reports rather than from zero. """ - response = await self._stub.DescribeWorkflowStream( + response = await _call( + self._stub.DescribeWorkflowStream, stream.DescribeWorkflowStreamRequest( frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, @@ -537,7 +558,7 @@ async def describe(self) -> stream.StreamState: owner_run_id=self._owner_run_id, stream_name=self._name, ) - ) + ), ) return response.frontend_response.state @@ -551,6 +572,16 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: ) +def _page(out: stream.PollMessagesOutput) -> Page: + return Page( + entries=[_to_public(record) for record in out.records], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + run_id=out.run_id, + ) + + # One channel per loop, target and namespace, shared by every handle in the # process. A channel is multiplexed and long lived, and callers open a handle # per subscription, which would otherwise be a connection per subscription. The diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index 690402974..95eb48d7e 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -7,10 +7,16 @@ still subscribes by topic from an offset. What changes is underneath. A publish is a Workflow Command whose payload never -enters History, so History gets one fixed-size event per batch rather than a -Signal per batch. A consumer reads the log directly rather than long-polling an -Update, so there is no per-Workflow limit on how many can read at once, and a -closed Workflow stays readable until its stream's retention expires. +enters History, so History gets one fixed-size event per Workflow Task rather +than a Signal per batch. A consumer reads the log directly rather than +long-polling an Update, so there is no per-Workflow limit on how many can read +at once, and a closed Workflow stays readable until its stream's retention +expires. + +As in the shipped feature, a topic here is a label on a record in the +Workflow's one default stream, which a consumer filters on. The provider in +:mod:`temporalio.streams.providers.native` keeps one stream per topic instead; +the two do not share a log. Prototype support for AI-198. It needs a server built from that branch, and it opens its own gRPC channel because sdk-core does not know the stream service @@ -27,10 +33,11 @@ from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow -from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client import Client, WorkflowExecutionDescription from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client -from temporalio.converter import PayloadConverter +from temporalio.common import RawValue +from temporalio.converter import PayloadCodec, PayloadConverter __all__ = [ "RawPage", @@ -48,12 +55,14 @@ @dataclass class RawPage: - """One read whose items are still encoded. + """One read whose items are still the stored records. ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + The bodies are as the server holds them, codec included, for a caller + that forwards records rather than using them. """ - items: list["WorkflowStreamItem[bytes]"] + items: list[WorkflowStreamItem[StreamRecord]] next_offset: int head_offset: int closed: bool @@ -72,49 +81,24 @@ class WorkflowStreamItem(Generic[T]): offset: int = 0 -def _encode(converter: PayloadConverter, value: Any) -> bytes: - """Serialize one value to a stream message body. - - The payload rather than the bare bytes, so the encoding metadata the - consumer needs to decode into a type travels with it. - - The codec chain is not applied here. Inside a Workflow it does not have to - be: the Worker runs the payload visitor with its codec over the commands - and activations, so a body that rides ``add_stream_messages`` is encoded - on the way out and one that arrives on ``deliver_stream_messages`` is - decoded on the way in, as every other payload is. The client path has no - such pass, and encoding one side but not the other is worse than encoding - neither: an Activity's messages would reach a consuming Workflow as - ciphertext it has no way to decode. :func:`_reject_configured_codec` - refuses a client with a codec until the client path applies one too. - """ - payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] - return payload.SerializeToString() - - -def _reject_configured_codec(client: Client) -> None: - """Refuse a namespace whose payloads are meant to be encoded. +def _record(converter: PayloadConverter, topic: str, value: Any) -> StreamRecord: + """The record one published value becomes. - Stream bodies bypass the codec chain, so proceeding would write payloads - this namespace expects to be encrypted in the clear, and would do it - silently. Raising is the only honest answer until the Worker-side plumbing - exists. + The body is the value's payload, so the encoding metadata the consumer + needs to decode into a type travels with it and a + :class:`temporalio.common.RawValue` passes through pre-encoded. """ - if client.data_converter.payload_codec is not None: - raise RuntimeError( - "this client has a payload codec configured, and server-side stream " - "bodies do not pass through it. Publishing would store them " - "unencoded. Use a client without a codec, or wait for codec support " - "on streams." - ) + record = StreamRecord(topic=topic, kind=StreamRecordKind.STREAM_RECORD_KIND_DATA) + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record -def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) +def _decode( + converter: PayloadConverter, record: StreamRecord, as_type: type | None +) -> Any: if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] + return converter.from_payloads([record.body])[0] + return converter.from_payloads([record.body], [as_type])[0] class WorkflowTopicHandle(Generic[T]): @@ -135,15 +119,17 @@ def type(self) -> type[T]: """The value type this handle is bound to.""" return self._type - def publish(self, value: T | Payload) -> None: + def publish(self, value: T | RawValue) -> None: """Append ``value`` to the Workflow's stream on this topic. - Returns as soon as the Command is issued. There is nothing to await: - the append is applied in the Workflow Task's own commit, so it costs - this Workflow no round trip and no extra transition. + Returns at once. There is nothing to await: the Workflow Task's + publishes become one command the server applies in the task's own + commit, so it costs this Workflow no round trip and no extra + transition. The Worker's payload codec applies to the body as it does + to any other payload the Workflow sends. """ - workflow.add_stream_messages( - [_encode(workflow.payload_converter(), value)], topic=self._name + workflow.append_stream_records( + [_record(workflow.payload_converter(), self._name, value)] ) @@ -178,7 +164,7 @@ class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" def __init__( - self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + self, client: WorkflowStreamClient, topic: str, value_type: type[T] ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client @@ -195,7 +181,7 @@ def type(self) -> type[T]: """The value type this handle is bound to.""" return self._type - def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + def publish(self, value: T | RawValue, *, force_flush: bool = False) -> None: """Buffer ``value`` for the next flush. Buffered rather than sent, because an append costs one transition on @@ -232,15 +218,20 @@ def __init__( converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, *, + codec: PayloadCodec | None = None, describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: """Prefer :meth:`create` or :meth:`from_within_activity`. + ``codec`` is applied to every body this client sends and receives, so + a namespace whose payloads are encoded agrees with the Worker, whose + payload visitor applies the same codec to the Workflow's publishes. ``describe`` is how an unpinned handle learns which run it follows; see :meth:`WorkflowStreamHandle.pin`. """ self._handle = handle self._converter = converter + self._codec = codec self._batch_interval = batch_interval self._describe = describe self._buffered: list[tuple[str, Any]] = [] @@ -256,7 +247,7 @@ def create( *, owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, - ) -> "WorkflowStreamClient": + ) -> WorkflowStreamClient: """Open the stream owned by ``workflow_id``. Without ``owner_run_id`` the current run is looked up on the first @@ -264,20 +255,20 @@ def create( continue-as-new sees the run end rather than being moved to the successor's stream at a stale offset. """ - _reject_configured_codec(client) return cls( _stream_client(client).workflow_stream( workflow_id, owner_run_id=owner_run_id ), client.data_converter.payload_converter, batch_interval, + codec=client.data_converter.payload_codec, describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL - ) -> "WorkflowStreamClient": + ) -> WorkflowStreamClient: """Open the stream owned by the Workflow that scheduled this Activity.""" info = activity.info() if info.workflow_id is None: @@ -294,7 +285,7 @@ def from_within_activity( batch_interval=batch_interval, ) - async def __aenter__(self) -> "WorkflowStreamClient": + async def __aenter__(self) -> WorkflowStreamClient: """Start the background flusher.""" self._flusher = asyncio.create_task(self._run_flusher()) return self @@ -352,13 +343,12 @@ async def subscribe( """ del poll_cooldown await self._pin() - async for message in self._handle.follow( - from_offset=from_offset, topics=topics - ): + async for entry in self._handle.follow(from_offset=from_offset, topics=topics): + record = await self._decoded(entry.record) yield WorkflowStreamItem( - topic=message.topic, - data=_decode(self._converter, message.data, result_type), - offset=message.offset, + topic=record.topic, + data=_decode(self._converter, record, result_type), + offset=entry.offset, ) async def poll_raw( @@ -367,8 +357,8 @@ async def poll_raw( topics: Sequence[str] = (), from_offset: int = 0, wait: bool = True, - ) -> "RawPage": - """One read, with the bodies left as they were stored. + ) -> RawPage: + """One read, with the records left as they were stored. For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. @@ -379,8 +369,10 @@ async def poll_raw( ) return RawPage( items=[ - WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) - for m in page.messages + WorkflowStreamItem( + topic=entry.record.topic, data=entry.record, offset=entry.offset + ) + for entry in page.entries ], next_offset=page.next_offset, head_offset=page.head_offset, @@ -393,13 +385,11 @@ async def flush(self) -> None: if not pending: return await self._pin() - # One append per topic, because a batch carries a single topic. The - # harness case is one topic, so this is one append. - by_topic: dict[str, list[bytes]] = {} - for topic, value in pending: - by_topic.setdefault(topic, []).append(_encode(self._converter, value)) - for topic, bodies in by_topic.items(): - await self._handle.append(*bodies, topic=topic) + records = [ + await self._encoded(_record(self._converter, topic, value)) + for topic, value in pending + ] + await self._handle.append(*records) def _buffer(self, topic: str, value: Any) -> None: self._buffered.append((topic, value)) @@ -419,6 +409,16 @@ async def _run_flusher(self) -> None: self._wake.clear() await self.flush() + async def _encoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.encode([record.body]))[0]) + return record + + async def _decoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.decode([record.body]))[0]) + return record + def _stream_client(client: Client) -> StreamClient: return shared_client(client.service_client.config.target_host, client.namespace) diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 9b339dfe4..540f7f7d7 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -4,7 +4,7 @@ application does not have to know which of them wrote a given item. Needs a Temporal server built from the AI-198 branch: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/contrib/test_server_streams.py """ from __future__ import annotations @@ -154,3 +154,8 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: ) ] assert resumed == [item.data.text for item in first[2:]] + + # The raw page carries the stored records themselves. + raw = await stream.poll_raw(topics=[TOPIC], from_offset=0, wait=False) + assert [item.data.topic for item in raw.items] == [TOPIC] * 5 + assert raw.closed and raw.next_offset == raw.head_offset == 5 diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index fde925cca..e3f16f38e 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -3,7 +3,7 @@ These need a Temporal server built from the AI-198 branch, because the stream service does not exist on a released server. Point them at one: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/test_client_stream.py Skipped otherwise, rather than silently passing against a server that has no idea what a stream is. @@ -18,7 +18,11 @@ import pytest +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client_stream import StreamClient, StreamHandle +from temporalio.service import RPCError +from temporalio.streams import StreamNotFoundError TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -28,68 +32,113 @@ ) +def rec(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +def data(entries: list) -> list[bytes]: + return [entry.record.body.data for entry in entries] + + @pytest.fixture -async def stream() -> AsyncIterator[StreamHandle]: +async def streams() -> AsyncIterator[StreamClient]: client = StreamClient.connect( TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") ) try: - yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + yield client finally: await client.close() +@pytest.fixture +async def stream(streams: StreamClient) -> StreamHandle: + return await streams.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + + async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - first = await stream.append(b"alpha", b"beta") + first = await stream.append(rec(b"alpha"), rec(b"beta")) assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) assert not first.deduplicated - assert (await stream.append(b"gamma")).first_offset == 2 + assert (await stream.append(rec(b"gamma"))).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: - await stream.append(b"alpha", b"beta", b"gamma") + await stream.append(rec(b"alpha"), rec(b"beta"), rec(b"gamma")) - messages, next_offset = await stream.read() - assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + entries, next_offset = await stream.read() + assert data(entries) == [b"alpha", b"beta", b"gamma"] + assert [entry.offset for entry in entries] == [0, 1, 2] assert next_offset == 3 - messages, next_offset = await stream.read(from_offset=1) - assert [m.data for m in messages] == [b"beta", b"gamma"] + entries, next_offset = await stream.read(from_offset=1) + assert data(entries) == [b"beta", b"gamma"] assert next_offset == 3 async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: - await stream.append(b"alpha") + await stream.append(rec(b"alpha")) - messages, next_offset = await stream.read(from_offset=1) - assert messages == [] + entries, next_offset = await stream.read(from_offset=1) + assert entries == [] assert next_offset == 1, "a caught-up reader keeps its cursor" # Without an identity the append is at-least-once, so this is the only way a -# producer that retries can avoid writing the same message twice. +# producer that retries can avoid writing the same record twice. async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: - first = await stream.append(b"once", producer_id="p1", sequence=1) - retry = await stream.append(b"once", producer_id="p1", sequence=1) + first = await stream.append(rec(b"once"), producer_id="p1", sequence=1) + retry = await stream.append(rec(b"once"), producer_id="p1", sequence=1) assert first.first_offset == retry.first_offset == 0 assert not first.deduplicated - # The retry is told it wrote nothing, so a producer can report no position. + # The retry is told it wrote nothing and where the original landed. assert retry.deduplicated + assert retry.next_offset == first.next_offset - messages, _ = await stream.read() - assert [m.data for m in messages] == [b"once"] + entries, _ = await stream.read() + assert data(entries) == [b"once"] async def test_topics_filter_a_read(stream: StreamHandle) -> None: - await stream.append(b"tok", topic="tokens") - await stream.append(b"prog", topic="progress") - await stream.append(b"tok2", topic="tokens") + await stream.append(rec(b"tok", topic="tokens")) + await stream.append(rec(b"prog", topic="progress")) + await stream.append(rec(b"tok2", topic="tokens")) - messages, next_offset = await stream.read(topics=["tokens"]) - assert [m.data for m in messages] == [b"tok", b"tok2"] + entries, next_offset = await stream.read(topics=["tokens"]) + assert data(entries) == [b"tok", b"tok2"] + assert [entry.offset for entry in entries] == [0, 2] assert next_offset == 3, "the cursor advances past filtered-out offsets too" +# The record comes back as it went in: kind, producer identity and sequence +# are the server's to store, not to interpret. +async def test_the_record_roundtrips_field_for_field(stream: StreamHandle) -> None: + sent = rec(b"x", topic="t") + sent.producer_id = "model" + sent.attempt = 2 + sent.sequence = 7 + sent.metadata["trace"].CopyFrom(Payload(data=b"abc")) + finish = StreamRecord( + topic="t", kind=StreamRecordKind.STREAM_RECORD_KIND_FINISH, producer_id="model" + ) + await stream.append(sent, finish) + + entries, _ = await stream.read() + got = entries[0].record + assert (got.topic, got.producer_id, got.attempt, got.sequence) == ( + "t", + "model", + 2, + 7, + ) + assert got.kind == StreamRecordKind.STREAM_RECORD_KIND_DATA + assert got.metadata["trace"].data == b"abc" + assert entries[1].record.kind == StreamRecordKind.STREAM_RECORD_KIND_FINISH + assert not entries[1].record.HasField("body") + + # A closed stream stays readable, which is what removes the shutdown handshake # between producer and consumer. async def test_follow_drains_then_ends_when_the_stream_closes( @@ -98,13 +147,13 @@ async def test_follow_drains_then_ends_when_the_stream_closes( received: list[bytes] = [] async def follower() -> None: - async for message in stream.follow(): - received.append(message.data) + async for entry in stream.follow(): + received.append(entry.record.body.data) task = asyncio.create_task(follower()) - await stream.append(b"one") + await stream.append(rec(b"one")) await asyncio.sleep(0.2) - await stream.append(b"two") + await stream.append(rec(b"two")) await asyncio.sleep(0.2) await stream.close() @@ -115,15 +164,15 @@ async def follower() -> None: async def test_follow_started_late_still_sees_everything( stream: StreamHandle, ) -> None: - await stream.append(b"one", b"two") + await stream.append(rec(b"one"), rec(b"two")) await stream.close() - received = [m.data async for m in stream.follow()] + received = [entry.record.body.data async for entry in stream.follow()] assert received == [b"one", b"two"] async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: - await stream.append(b"one", b"two") + await stream.append(rec(b"one"), rec(b"two")) state = await stream.describe() assert state.head_offset == 2 @@ -131,3 +180,13 @@ async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: await stream.close() assert (await stream.describe()).closed + + +# The transport's own exception never escapes: a missing stream is the SDK's +# not-found error and anything else is its RPC error. +async def test_failures_surface_as_sdk_errors(streams: StreamClient) -> None: + missing = streams.get("py-test-missing-" + uuid.uuid4().hex[:8]) + with pytest.raises(StreamNotFoundError): + await missing.describe() + with pytest.raises((StreamNotFoundError, RPCError)): + await missing.append(rec(b"x")) From 9f5a1cfcf631d05344ba9ec299524d638696a151 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 364/831] Rewrote the native provider with one owned stream per topic. The workflow subscribes to the topic by name and publishes with the batched command; outside code appends and long-polls the same stream, following the run chain by cursor unless pinned. --- CHANGELOG.md | 14 +- temporalio/streams/providers/native.py | 698 +++++++++++----------- tests/streams/test_streams_conformance.py | 48 +- tests/worker/test_workflow_stream_e2e.py | 420 ++++++++----- 4 files changed, 693 insertions(+), 487 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 115b0d3dc..77a201faf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,13 +29,15 @@ to include examples, links to docs, or any other relevant information. the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. -- **Experimental**: server-side streams. A workflow reads a stream the server - delivers on its Workflow Tasks and publishes with a command, through - `temporalio.workflow.read_stream`, `subscribe_stream` and - `add_stream_messages`. `temporalio.client_stream` and +- **Experimental**: server-side streams. A workflow publishes to a stream it + owns with a command the server applies in its Workflow Task's commit, and + reads the ranges the server delivers on its Workflow Tasks, through + `temporalio.workflow.append_stream_records`, `subscribe_stream` and + `read_stream_records`. `temporalio.client_stream` and `temporalio.contrib.server_streams` reach the same stream from outside a - workflow, and `temporalio.streams.providers.native` puts it behind the shared - stream interface. Requires a server that serves the stream service. + workflow, and `temporalio.streams.providers.native.NativeStreams` puts it + behind the shared stream interface with one owned stream per topic. Requires + a server that serves the stream service. ### Changed diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 6dfdd4c25..ff0621031 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -1,176 +1,195 @@ """The server-side (native) provider. -Streams live on the Temporal server. A workflow publishes with a command that -the server applies in the same transaction that accepts the workflow task, and -consumes ranges the server attaches to the workflow task it dispatches. +Streams live on the Temporal server, beside the workflow that owns them. A +topic is one owned stream named after the topic, created by whoever touches it +first: the workflow publishes to it with a command the server applies in the +transaction that accepts the Workflow Task, subscribes to it by name and reads +the ranges the server delivers on its Workflow Tasks; outside code appends and +reads through the stream service, and the workflow's records and an outside +producer's land in one log in the order the server accepted them. + +A cursor names the run as well as the offset, because an owned stream belongs +to one run and a successor's starts over at zero. A handle without a run id +reads run after run, learning from the poll that a run's stream is closed and +from the run's close event who came next; with a run id it is pinned. + +Prototype support for AI-198. It needs a server built from that branch and +opens its own gRPC channel to it, because sdk-core does not know the stream +service yet, which is also why it does not support TLS or API keys. """ from __future__ import annotations -import asyncio import logging from collections.abc import AsyncGenerator -from datetime import timedelta from typing import Any -import grpc - from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, close_shared_clients, shared_client -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._ids import inbound_stream_id -from temporalio.streams._policy import AttemptTracker +from temporalio.client import Client, WorkflowHistoryEventFilterType +from temporalio.client_stream import ( + StreamClient, + WorkflowStreamHandle, + close_shared_clients, + shared_client, +) +from temporalio.converter import PayloadCodec, PayloadConverter +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["NativeProducer", "NativeStreamHandle", "NativeStreams"] -_RUN_STATE = "__temporal_streams_state" +_PROVIDER = "native" logger = logging.getLogger(__name__) -class _Fanout: - """One server subscription, shared by every reader of that stream. +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") - The server sends a range once. Whoever reads it first would otherwise take - it from the others, so the pull happens here and the result goes to all - live readers. - """ - def __init__(self, stream: str) -> None: - self._stream = stream - self._subscribers: list[list[tuple[Cursor, bytes]]] = [] - self._pull: asyncio.Future[None] | None = None - - def attach(self) -> list[tuple[Cursor, bytes]]: - queue: list[tuple[Cursor, bytes]] = [] - self._subscribers.append(queue) - return queue - - def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: - if queue in self._subscribers: - self._subscribers.remove(queue) - - async def next_batch( - self, queue: list[tuple[Cursor, bytes]] - ) -> list[tuple[Cursor, bytes]]: - while not queue: - pending = self._pull - if pending is None: - pending = self._pull = asyncio.ensure_future(self._run_pull()) - # Shielded because one reader going away must not cancel a range - # the server will not send again. - await asyncio.shield(pending) - batch, queue[:] = list(queue), [] - return batch - - async def _run_pull(self) -> None: - try: - delivered = await workflow.read_stream_messages(self._stream) - arrived = [ - (Cursor(str(message.offset)), message.body) for message in delivered - ] - for queue in self._subscribers: - queue.extend(arrived) - finally: - self._pull = None +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") -def _fanouts() -> dict[str, _Fanout]: - instance = workflow.instance() - state = getattr(instance, _RUN_STATE, None) - if state is None: - state = {} - setattr(instance, _RUN_STATE, state) - return state +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "native provider" + ) from None -class _NativeReadSource: - def __init__(self, fanout: _Fanout) -> None: - self._fanout = fanout - self._queue = fanout.attach() +async def _encode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + # The worker's payload visitor runs a codec over the bodies a workflow + # publishes and receives; the outside half has no such pass, so it applies + # the client's codec here or the two sides would not agree. + if codec is None or not record.HasField("body"): + return record + encoded = await codec.encode([record.body]) + record.body.CopyFrom(encoded[0]) + return record - async def next_batch(self) -> list[tuple[Cursor, bytes]]: - return await self._fanout.next_batch(self._queue) - def close(self) -> None: - self._fanout.detach(self._queue) - - -class _NativeWriteSink: - def __init__(self, topic: str) -> None: - self._topic = topic +async def _decode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + if codec is None or not record.HasField("body"): + return record + decoded = await codec.decode([record.body]) + record.body.CopyFrom(decoded[0]) + return record - async def publish(self, frame: bytes) -> None: - # Nothing is awaited. The server applies the payload when it accepts - # the task, so there is no back pressure to wait on and no round trip - # to pay for. The signature is awaitable because the contract allows a - # provider that does hold a publisher back. - workflow.add_stream_messages([frame], stream_id="", topic=self._topic) +class _NativeReadSource: + """One subscription of the running workflow, fed by delivered ranges.""" -def _reject_configured_codec(client: Client) -> None: - """Refuse a namespace whose payloads are meant to be encoded. + def __init__(self, stream_id: str, run_id: str) -> None: + self._stream_id = stream_id + self._run_id = run_id + self._closed = False - Stream bodies do not pass through the codec chain on this provider, so - proceeding would store in the clear what the namespace expects encrypted, - and would do it without saying so. - """ - if client.data_converter.payload_codec is not None: - raise RuntimeError( - "this client has a payload codec configured, and server-side stream " - "bodies do not pass through it" - ) + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + if self._closed: + raise StopAsyncIteration + delivered = await workflow.read_stream_records(self._stream_id) + return [(_cursor(self._run_id, item.offset), item.record) for item in delivered] + def close(self) -> None: + self._closed = True -# Streams this process has already opened, so a second producer for the same -# stream reuses the handle rather than asking the server to create it again. -# The second create is answered correctly, and it is still a failed call the -# server logs, which is noise an operator has to learn to ignore. -_handles: dict[tuple[str, str, str], Any] = {} +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic -def _stream_client(client: Client) -> StreamClient: - return shared_client(client.service_client.config.target_host, client.namespace) + def publish(self, record: WireRecord) -> None: + # Held by the runtime until the task completes, when the task's + # records on this topic become one command the server applies with + # the task: rule 1 through the server's own commit. + workflow.append_stream_records([record], stream_id=self._topic) + + +class _NativeWorkflowProvider: + """The workflow half: the server's commands and delivered ranges.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's stream is its own" + ) + start = named[1] + 1 + workflow.subscribe_stream(topic, start_offset=start) + return _NativeReadSource(topic, run_id) + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _NativeWriteSink(topic) -async def _owner_run(client: Client, workflow_id: str) -> str: - """The run whose stream a handle on ``workflow_id`` should address. + def on_workflow_start(self) -> None: + pass - Resolved once, when the handle opens. Left to the server, a follower whose - workflow continued as new would be redirected to the successor, whose - stream starts empty, and its offset read as "caught up" rather than as a - position on the run it was watching. A producer is pinned for the same - reason: an activity's output belongs to the run that scheduled it. - """ - return (await client.get_workflow_handle(workflow_id).describe()).run_id + async def on_workflow_finish(self) -> None: + pass class NativeProducer: - """Appends to a stream from outside workflow code. + """Appends to a topic from outside workflow code. - Every append is visible as soon as it is written. That is the point for an - activity streaming model output, and it is why an activity carries its own - identity: the retry of a failed attempt has no commit boundary to sort it - out afterwards. + Every append is visible as soon as the server accepts it. That is the + point for an activity streaming model output, and it is why an activity + carries its own identity: the retry of a failed attempt has no commit + boundary to sort it out afterwards. """ def __init__( self, - handle: Any, - converter: Any, + handle: WorkflowStreamHandle, + pin: Any, + codec: PayloadCodec | None, + converter: PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle + self._pin = pin + self._codec = codec self._converter = converter self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -178,265 +197,260 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: - """The identity the provider dedupes on. - - The attempt is part of it. Deduplication answers "is this the same - append again", and a second attempt writing different words at the same - sequence is not. Folding the attempt in keeps a retried append idempotent - without letting a new generation be swallowed as a duplicate of the old - one. - """ + def _writer(self) -> str: + # The server dedupes on this and the sequence. The attempt is part of + # it so a retried append is dropped while a new generation writing + # different words at the same sequence is not. return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed, because the server + answers a deduplicated batch with the original offsets; an empty call + returns the position of this producer's last record. + """ if not values: - return None - frames = [] - for value in values: - frames.append( - _frame.encode( + return self._last + return await self._write( + [ + to_wire( + self._converter, topic=self._topic, kind=RecordKind.DATA, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=self._sequence + index, ) - ) - self._sequence += 1 - appended = await self._handle.append( - *frames, - topic=self._topic, - producer_id=self._provider_id, - # The provider dedupes a retried append on this pair, which is a - # different job from telling readers that a new generation started. - sequence=self._sequence - len(frames), + for index, value in enumerate(values) + ] ) - if appended.deduplicated: - return None - return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: - """Declare this stream complete.""" - frame = _frame.encode( - topic=self._topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._handle.append( - frame, - topic=self._topic, - producer_id=self._provider_id, - sequence=self._sequence - 1, + """Write ``FINISH`` for this producer on this topic.""" + await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] ) - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + async def _write(self, records: list[WireRecord]) -> Cursor: + # Pinned before the first write, so every cursor this producer hands + # out names the run its records landed in. + if not self._handle.owner_run_id: + self._handle.pin(await self._pin()) + for record in records: + await _encode_body(self._codec, record) + appended = await self._handle.append( + *records, producer_id=self._writer, sequence=self._sequence ) - return payload.SerializeToString() - - -class NativeConsumer: - """Reads a stream from outside workflow code, resumably.""" - - def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: - """Read the stream ``handle`` names, from anywhere. + self._sequence += len(records) + self._last = _cursor(self._handle.owner_run_id, appended.next_offset - 1) + return self._last + + +class NativeStreamHandle: + """One workflow's topics from outside, over the stream service.""" + + def __init__(self, client: Client, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s topics, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = client.data_converter.payload_converter + self._codec = client.data_converter.payload_codec + self._streams: StreamClient | None = None + + def _service(self) -> StreamClient: + # Resolved on first use, because the shared channel belongs to the + # running loop and a handle may be made before there is one. + if self._streams is None: + self._streams = shared_client( + self._client.service_client.config.target_host, + self._client.namespace, + ) + return self._streams - ``stream`` is the inbound name the caller used, empty for the owner's - stream; ``address`` is what the server calls it, for log lines. - """ - self._handle = handle - self._converter = converter - self._stream = stream - self._address = address + def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: + return self._service().workflow_stream( + self._workflow_id, topic, owner_run_id=run_id + ) - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield the records after ``after`` as they arrive. + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) - Applies the same supersession rule as a workflow reader, so a browser - and a workflow watching one activity agree on which attempt is current. + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + stream = self._stream(topic, run_id) + while True: + page = await stream.poll(from_offset=offset) + for entry in page.entries: + record = await _decode_body(self._codec, entry.record) + for out in decoder.decode(_cursor(run_id, entry.offset), record): + yield out + offset = page.next_offset + # On a pinned stream the server reports the run's end as closed, + # and a closed stream is finished once its head is delivered. + if page.closed and offset >= page.head_offset: + break + if self._run_id is not None: + return + successor = await self._successor(run_id) + if successor is None: + return + run_id, offset = successor, 0 + + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest record on ``topic``, naming the run it was read from. + + An empty topic on the chain's first run is the beginning of the + stream; on a successor it is a position of its own, because + ``BEGINNING`` would send a chain-following read back to the first run. """ - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - async for message in self._handle.follow( - from_offset=int(after.token) + 1 if after.token else 0 - ): - cursor = Cursor(str(message.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - message.data - ) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning( - "skipping record %s of stream %s: %s", cursor, self._address, error - ) - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + _require_topic(topic) + run_id = self._run_id or await self._current_run() + try: + head = (await self._stream(topic, run_id).describe()).head_offset + except StreamNotFoundError: + # A topic nobody has written yet does not exist on the server, + # which is the same answer as an empty one. + head = 0 + if head > 0: + return _cursor(run_id, head - 1) + if self._run_id is None and await self._predecessor(run_id) is not None: + return _cursor(run_id, -1) + return BEGINNING + + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> NativeProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return NativeProducer( + self._stream(topic, self._run_id or ""), + self._current_run, + self._codec, + self._converter, + topic, + producer_id, + attempt, + ) - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one server-side log per stream, whatever the topic + async def _current_run(self) -> str: + try: + description = await self._client.get_workflow_handle( + self._workflow_id + ).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert description.run_id is not None + return description.run_id + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + run_id = await self._current_run() + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) try: - state = await self._handle.describe() - except grpc.aio.AioRpcError as error: - # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. Any other failure is not: - # a reader that took it for "empty" would replay the whole stream. - if error.code() is not grpc.StatusCode.NOT_FOUND: + async for event in handle.fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: raise - return BEGINNING - return ( - Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING - ) + # The run's History is gone: the chain's retained part starts here. + return None - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + async def _successor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + try: + async for event in events: + if event.HasField( + "workflow_execution_continued_as_new_event_attributes" + ): + attributes = ( + event.workflow_execution_continued_as_new_event_attributes + ) + return attributes.new_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + return None -class _NativeProvider: - name = "native" +class NativeStreams(ProviderPlugin): + """The server-side provider. - def configure(self, **options: Any) -> None: - """Take no options. + Takes no options: the streams are on the server the client is already + connected to. Construct one, pass it to the worker as a plugin and open + handles from it anywhere else; :meth:`close` releases the channels this + process opened to the stream service. + """ - The streams are on the server the client is already connected to. - This exists so a process that switches providers changes one call - rather than its structure. - """ - if options: - raise TypeError( - f"the native provider takes no options, got {sorted(options)}" - ) + def workflow_provider(self) -> _NativeWorkflowProvider: + """The workflow half, over the server's commands and delivered ranges.""" + return _NativeWorkflowProvider() - def worker_options(self) -> dict[str, Any]: - return {} + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> NativeStreamHandle: + """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain.""" + return NativeStreamHandle(client, workflow_id, run_id) async def close(self) -> None: """Close the channels this process opened to the stream service.""" await close_shared_clients() - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Accepted and ignored. Delivery arrives on workflow tasks the server - # dispatches, so no worker is held between records and there is nothing - # for an idle timeout to release. - del idle_timeout - stream_id = inbound_stream_id(workflow.info().workflow_id, stream) - fanouts = _fanouts() - fanout = fanouts.get(stream_id) - if fanout is None: - workflow.subscribe_stream( - stream_id, start_offset=int(after.token) + 1 if after.token else 0 - ) - fanout = fanouts[stream_id] = _Fanout(stream_id) - return _NativeReadSource(fanout) - - def open_write(self, topic: str) -> WriteSink: - return _NativeWriteSink(topic) - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> NativeProducer: - """Open a producer on ``workflow_id``'s account. - - ``stream`` names an inbound stream, a namespace-level stream the - server keys by the pair. With none, ``topic`` names a topic on the - stream the workflow publishes, which the server lets any producer - append to. An inbound record carries no topic: the stream's name is - its whole address. - """ - _reject_configured_codec(client) - streams = _stream_client(client) - converter = client.data_converter.payload_converter - if not stream: - handle: Any = streams.workflow_stream( - workflow_id, owner_run_id=await _owner_run(client, workflow_id) - ) - return NativeProducer(handle, converter, topic, producer_id, attempt) - stream_id = inbound_stream_id(workflow_id, stream) - key = (client.service_client.config.target_host, client.namespace, stream_id) - handle = _handles.get(key) - if handle is None: - try: - handle = await streams.create(stream_id) - except Exception: - # Created by whoever set the stream up. A producer opening a - # stream it does not own is the ordinary case, not the - # exception. - handle = streams.get(stream_id) - _handles[key] = handle - return NativeProducer(handle, converter, topic, producer_id, attempt) - - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> NativeConsumer: - """Open a reader for what ``workflow_id`` publishes. - - An empty ``stream`` reads what the workflow wrote through - :func:`temporalio.streams.writer`. Naming one reads that inbound - stream instead, which is how a second consumer follows the same input. - """ - _reject_configured_codec(client) - streams = _stream_client(client) - address = inbound_stream_id(workflow_id, stream) - if stream: - handle: Any = streams.get(address) - else: - handle = streams.workflow_stream( - workflow_id, owner_run_id=await _owner_run(client, workflow_id) - ) - return NativeConsumer( - handle, client.data_converter.payload_converter, stream, address - ) - - -_provider.register("native", _NativeProvider) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 451fe4391..e9f016cb7 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,6 +21,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass @@ -28,8 +29,9 @@ import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -45,6 +47,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.native import NativeStreams +from tests.helpers import new_worker @dataclass @@ -78,9 +82,51 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: + # The store is a server built from the stream-carrying branch, which the + # test environment's own server is not; TEMPORAL_ADDRESS names it. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = NativeStreams() + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase("native", provider, client, host=host) + for handle in hosts.values(): + await handle.terminate() + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { "memory": _memory_case } +if os.environ.get("STREAMS_LIVE") == "native": + SETUPS["native"] = _native_case _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 31296b2c8..a41b2a495 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -1,10 +1,12 @@ -"""A workflow publishing to a stream it owns and reading its own messages back. +"""The native provider inside a real workflow, against a server that has streams. -Path A and Path C together, both from workflow code. Needs a Temporal server -built from the AI-198 branch, because neither the stream service nor the -commands exist on a released one: +The two rules the memory provider cannot keep are the measurement here: a +publish commits with its Workflow Task and never lands if the task fails, and +a read is a recorded observation the server re-supplies on replay. Needs a +Temporal server built from the AI-198 branch, because neither the stream +service nor the commands exist on a released one: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/worker/test_workflow_stream_e2e.py Skipped otherwise, rather than passing against a server that has no idea what a stream is. @@ -15,13 +17,20 @@ import asyncio import os import uuid +from typing import Any import pytest from temporalio import workflow +from temporalio.api.common.v1 import Payload from temporalio.api.enums.v1 import EventType +from temporalio.api.stream.v1 import StreamRecord from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import RecordKind +from temporalio.streams.providers.native import NativeStreams from temporalio.worker import Worker +from tests.streams.test_streams_conformance import take TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -30,36 +39,264 @@ reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", ) -STREAM = "output" +INPUTS = "inputs" +DECISIONS = "decisions" EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED -EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED +EVENT_STREAM_RECORDS_APPENDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED + + +async def _connect() -> Client: + return await Client.connect(TARGET or "") + + +async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: + counts = { + EVENT_STREAM_RECORDS_APPENDED: 0, + EVENT_STREAM_SUBSCRIBED: 0, + EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: 0, + } + async for event in client.get_workflow_handle(workflow_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + return counts + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "replaced": record.supersession.previous_attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) + trace.append({"kind": "decision", "n": record.value["n"]}) + decisions.finish() + return trace + + +async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None: + """Rule 2 on the native provider: every task replays from the server. + + With the cache off, each Workflow Task rebuilds the workflow from History + and the server re-supplies the ranges earlier tasks consumed, so the loop + completing at all means the same records came back in the same order. + """ + client = await _connect() + provider = NativeStreams() + task_queue = "loop-tq-" + uuid.uuid4().hex[:8] + workflow_id = "loop-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + plugins=[provider], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"n": 1}, {"n": 2}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"n": 3}) + await second.finish() + trace = await asyncio.wait_for(handle.result(), 60) + + assert trace == [ + {"kind": "decision", "n": 1}, + {"kind": "decision", "n": 2}, + {"kind": "superseded", "replaced": 1}, + {"kind": "decision", "n": 3}, + {"kind": "finish", "producer": "model"}, + ] + + # The read ends by itself: the workflow is closed and the tail + # delivered, with the workflow's own records carrying no producer. + async def read_everything() -> list[Any]: + return [ + (r.producer_id, r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + assert await asyncio.wait_for(read_everything(), 60) == [ + ("", RecordKind.DATA, {"decided": 1}), + ("", RecordKind.DATA, {"decided": 2}), + ("", RecordKind.DATA, {"retracting_attempt": 1}), + ("", RecordKind.DATA, {"decided": 3}), + ("", RecordKind.FINISH, None), + ] + counts = await _event_counts(client, workflow_id) + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + # Several tasks published, one event each; the loop spanned more than + # one task or the cold cache proved nothing. + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 2 + assert ( + 1 + <= counts[EVENT_STREAM_RECORDS_APPENDED] + <= counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] + ) + finally: + await provider.close() + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + decisions.finish() + + +async def test_a_failed_task_publishes_nothing() -> None: + """Rule 1 on the native provider: the server applies the command with the task.""" + client = await _connect() + provider = NativeStreams() + task_queue = "fail-tq-" + uuid.uuid4().hex[:8] + workflow_id = "fail-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishThenFail], + plugins=[provider], + ): + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + records = await take( + stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60 + ) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] + finally: + await provider.close() + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new() -> None: + client = await _connect() + provider = NativeStreams() + task_queue = "relay-tq-" + uuid.uuid4().hex[:8] + workflow_id = "relay-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, task_queue=task_queue, workflows=[Relay], plugins=[provider] + ): + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 60) + await handle.result() + # The chain is followed: the successor's record arrives on the same + # read, each cursor names its run, and the read ends with the chain. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + # Pinned to the last run, a handle sees that run's stream alone. + last_run = (await client.get_workflow_handle(workflow_id).describe()).run_id + pinned = provider.get_stream_handle(client, workflow_id, run_id=last_run) + only_last = [ + r.value async for r in pinned.read(topic=DECISIONS, result_type=dict) + ] + assert only_last == [{"run": 1}, None] + finally: + await provider.close() @workflow.defn class PublishAndRead: + """Publishes through the low-level surface and reads its own records back.""" + @workflow.run async def run(self) -> list[str]: - # Published before subscribing, because a subscription resolves against - # the streams the workflow already owns and this is what creates one. - workflow.add_stream_messages( - [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + workflow.append_stream_records( + [_record(b"alpha", "progress"), _record(b"beta", "progress")], + stream_id="output", ) - workflow.add_stream_messages([b"delta"], stream_id=STREAM) - - workflow.subscribe_stream(STREAM, start_offset=0) + workflow.append_stream_records([_record(b"gamma")], stream_id="output") + # A name this workflow has not written yet still names a stream it + # owns, so subscribing creates the one the later publish lands in. + workflow.subscribe_stream("output", start_offset=0) received: list[str] = [] - while len(received) < 4: - for body in await workflow.read_stream(STREAM): - received.append(body.decode()) + while len(received) < 3: + for item in await workflow.read_stream_records("output"): + received.append(item.record.body.data.decode()) return received -async def test_workflow_reads_back_what_it_published() -> None: - client = await Client.connect(TARGET or "") +def _record(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +async def test_a_tasks_publishes_become_one_event() -> None: + client = await _connect() task_queue = "publish-tq-" + uuid.uuid4().hex[:8] - wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + workflow_id = "publish-wf-" + uuid.uuid4().hex[:8] async with Worker( client, @@ -71,111 +308,26 @@ async def test_workflow_reads_back_what_it_published() -> None: ): result = await asyncio.wait_for( client.execute_workflow( - PublishAndRead.run, id=wf_id, task_queue=task_queue + PublishAndRead.run, id=workflow_id, task_queue=task_queue ), timeout=60, ) + assert result == ["alpha", "beta", "gamma"] - assert result == ["alpha", "beta", "gamma", "delta"] - - counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} - async for event in client.get_workflow_handle(wf_id).fetch_history_events(): - if event.event_type in counts: - counts[event.event_type] += 1 - - # Two calls carrying four messages, so two events: the event is per batch, - # which is what makes batching free. - assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + counts = await _event_counts(client, workflow_id) + # Two calls in one task carrying three records, so one event: the event is + # per task and stream, which is what makes publishing often free. + assert counts[EVENT_STREAM_RECORDS_APPENDED] == 1 assert counts[EVENT_STREAM_SUBSCRIBED] == 1 -@workflow.defn -class PublishOnSignal: - """Publishes a token per signal, which is the shape an agent turn has.""" - - def __init__(self) -> None: - self._pending: list[str] = [] - self._done = False - - @workflow.run - async def run(self) -> int: - published = 0 - while True: - await workflow.wait_condition(lambda: bool(self._pending) or self._done) - while self._pending: - workflow.add_stream_messages([self._pending.pop(0).encode()]) - published += 1 - if self._done: - return published - - @workflow.signal - async def emit(self, token: str) -> None: - self._pending.append(token) - - @workflow.signal - async def finish(self) -> None: - self._done = True - - -async def test_a_client_follows_what_a_workflow_publishes() -> None: - """The harness shape: the workflow writes, something outside it reads live. - - A stream a workflow owns has no id, so the reader addresses it by the - owner. It also attaches before the first publish, which is what a UI opening - on a session does. - """ - from temporalio.client_stream import StreamClient - - client = await Client.connect(TARGET or "") - streams = StreamClient.connect(TARGET or "") - task_queue = "follow-tq-" + uuid.uuid4().hex[:8] - wf_id = "follow-wf-" + uuid.uuid4().hex[:8] - - tokens = [f"token-{i}" for i in range(5)] - received: list[str] = [] - - try: - async with Worker( - client, - task_queue=task_queue, - workflows=[PublishOnSignal], - max_cached_workflows=0, - ): - handle = await client.start_workflow( - PublishOnSignal.run, id=wf_id, task_queue=task_queue - ) - - # Attached before anything is published, so the stream does not - # exist yet and the first poll has to park rather than fail. - reader = streams.workflow_stream(wf_id) - assert (await reader.describe()).head_offset == 0 - - async def follow() -> None: - async for message in reader.follow(): - received.append(message.data.decode()) - if len(received) == len(tokens): - return - - following = asyncio.ensure_future(follow()) - for token in tokens: - await handle.signal(PublishOnSignal.emit, token) - await asyncio.wait_for(following, timeout=60) - - await handle.signal(PublishOnSignal.finish) - assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) - finally: - await streams.close() - - assert received == tokens - - @workflow.defn class ConsumeAcrossTasks: - """Reads a stream over several Workflow Tasks, then reports what it saw. + """Reads a standalone stream over several Workflow Tasks, then reports what it saw. - The turn structure is the point: each `read_stream` that finds nothing - blocks, which ends a Workflow Task, so the run spans several. With the - cache on, every task after the first is sticky. + The turn structure is the point: each read that finds nothing blocks, + which ends a Workflow Task, so the run spans several. With the cache on, + every task after the first is sticky. """ @workflow.run @@ -183,25 +335,22 @@ async def run(self, stream_id: str, expected: int) -> list[str]: workflow.subscribe_stream(stream_id, start_offset=0) seen: list[str] = [] while len(seen) < expected: - for body in await workflow.read_stream(stream_id): - seen.append(body.decode()) + for item in await workflow.read_stream_records(stream_id): + seen.append(item.record.body.data.decode()) return seen async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: """The workflow cache stays on, which is what a real worker does. - Every other end-to-end test here disables it, so the sticky path was never - exercised. The server sends no replay slice for a sticky task, while the - sticky history still carries the previous task's consumed range, and the - two together used to fail every task after the first consumed range. + The server sends no replay slice for a sticky task, while the sticky + history still carries the previous task's consumed range, and the two + together have to agree on every task after the first consumed range. """ - from temporalio.client_stream import StreamClient - - client = await Client.connect(TARGET or "") + client = await _connect() streams = StreamClient.connect(TARGET or "") task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] - wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + workflow_id = "sticky-wf-" + uuid.uuid4().hex[:8] stream_id = "sticky-src-" + uuid.uuid4().hex[:8] batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] @@ -210,15 +359,12 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: try: await streams.create(stream_id) async with Worker( - client, - task_queue=task_queue, - workflows=[ConsumeAcrossTasks], - # Left at the default deliberately. This is what the test is for. + client, task_queue=task_queue, workflows=[ConsumeAcrossTasks] ): handle = await client.start_workflow( ConsumeAcrossTasks.run, args=[stream_id, len(expected)], - id=wf_id, + id=workflow_id, task_queue=task_queue, ) @@ -226,18 +372,16 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: # them. Without the gap the appends coalesce into one task and the # sticky path is never taken. for batch in batches: - await streams.get(stream_id).append(*[t.encode() for t in batch]) + await streams.get(stream_id).append( + *[_record(t.encode()) for t in batch] + ) await asyncio.sleep(0.4) assert await asyncio.wait_for(handle.result(), timeout=60) == expected - # More than one Workflow Task ran, otherwise the test proves nothing. - completed = 0 - async for event in client.get_workflow_handle(wf_id).fetch_history_events(): - if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: - completed += 1 - assert completed >= 3, ( - f"only {completed} workflow tasks, sticky path not exercised" + counts = await _event_counts(client, workflow_id) + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 3, ( + "sticky path not exercised" ) finally: await streams.close() From 88a62988062c5d8790194c5b5ded7e71efde6321 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:45:36 -0700 Subject: [PATCH 365/831] Kept the stream finish hook off evicted runs and collected coroutines. Neither is the workflow ending. An evicted run's state is not to be touched, and at collection time the runtime on the thread belongs to whichever workflow is running, so the hook acted on that one. --- temporalio/worker/_workflow.py | 29 +++++-- tests/streams/test_stream_hooks.py | 133 +++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 tests/streams/test_stream_hooks.py diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 481a0a86d..d646ebdac 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -66,17 +66,36 @@ class _StreamHooksInterceptor(WorkflowInboundInterceptor): Installed by the worker when it has a stream provider, so no workflow code has to call anything before it runs or before it returns. The finish - hook runs however the function ends, continue-as-new included, because + hook runs when the function returns, raises or continues as new, because a provider that parked a reader against the run has to let go either way. + It does not run when the run is being evicted from the cache or when the + abandoned coroutine is collected: neither is the workflow ending, the + instance's state is not to be touched during eviction, and at collection + time the runtime on the thread belongs to whichever workflow happens to + be running, so the hook would act on that one. """ async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: - provider = temporalio.workflow._Runtime.current().workflow_streams().provider + runtime = temporalio.workflow._Runtime.current() + provider = runtime.workflow_streams().provider provider.on_workflow_start() try: - return await self.next.execute_workflow(input) - finally: - await provider.on_workflow_finish() + result = await self.next.execute_workflow(input) + except GeneratorExit: + raise + except BaseException: + if not _evicting(runtime): + await provider.on_workflow_finish() + raise + await provider.on_workflow_finish() + return result + + +def _evicting(runtime: temporalio.workflow._Runtime) -> bool: + # Eviction cancels the primary task the same way a workflow cancellation + # does; the flag the instance sets before cancelling is what tells them + # apart, and only the cancellation is a run ending. + return bool(getattr(runtime, "_deleting", False)) # Value was chosen abitrarily as a small number that allows some concurrency and prevents diff --git a/tests/streams/test_stream_hooks.py b/tests/streams/test_stream_hooks.py new file mode 100644 index 000000000..be7b6e9d4 --- /dev/null +++ b/tests/streams/test_stream_hooks.py @@ -0,0 +1,133 @@ +"""The lifecycle interceptor's rules about when the finish hook runs. + +Driven directly, with a stand-in runtime on the loop, because the two cases +that matter here are the ones a workflow test cannot stage on purpose: a +coroutine collected after its worker went away, and a run evicted from the +cache. Both used to reach the finish hook, and at collection time the hook +acted on whichever workflow was running on the thread. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.worker._interceptor import ( + ExecuteWorkflowInput, + WorkflowInboundInterceptor, +) +from temporalio.worker._workflow import _StreamHooksInterceptor + + +class _Provider: + def __init__(self) -> None: + self.calls: list[str] = [] + + def on_workflow_start(self) -> None: + self.calls.append("start") + + async def on_workflow_finish(self) -> None: + self.calls.append("finish") + + +class _Streams: + def __init__(self, provider: _Provider) -> None: + self.provider = provider + + +class _FakeRuntime: + """Only what the interceptor reads: the stream state and the eviction flag.""" + + def __init__(self, provider: _Provider, *, deleting: bool = False) -> None: + self._streams = _Streams(provider) + self._deleting = deleting + + def workflow_streams(self) -> _Streams: + return self._streams + + +class _Body(WorkflowInboundInterceptor): + """The workflow function's stand-in: returns, raises or parks forever.""" + + def __init__(self, outcome: Any) -> None: # type: ignore[reportMissingSuperCall] + self._outcome = outcome + + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: + del input + if self._outcome is _PARK: + await asyncio.Event().wait() + if isinstance(self._outcome, BaseException): + raise self._outcome + return self._outcome + + +_PARK = object() +_INPUT = ExecuteWorkflowInput(type=object, run_fn=lambda: None, args=(), headers={}) + + +@pytest.fixture +async def provider() -> Any: + fake = _Provider() + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake)) # type: ignore[arg-type] + yield fake + workflow._Runtime.set_on_loop(loop, None) + + +def _evicting(fake: _Provider) -> None: + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake, deleting=True)) # type: ignore[arg-type] + + +async def test_the_finish_hook_runs_on_return(provider: _Provider): + assert ( + await _StreamHooksInterceptor(_Body("done")).execute_workflow(_INPUT) == "done" + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_when_the_function_raises(provider: _Provider): + with pytest.raises(RuntimeError, match="boom"): + await _StreamHooksInterceptor(_Body(RuntimeError("boom"))).execute_workflow( + _INPUT + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_on_continue_as_new(provider: _Provider): + error = workflow.ContinueAsNewError.__new__(workflow.ContinueAsNewError) + with pytest.raises(workflow.ContinueAsNewError): + await _StreamHooksInterceptor(_Body(error)).execute_workflow(_INPUT) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_on_a_workflow_cancellation(provider: _Provider): + # A cancelled primary task is the run ending, so the provider lets go. + with pytest.raises(asyncio.CancelledError): + await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( + _INPUT + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_does_not_run_when_the_coroutine_is_collected( + provider: _Provider, +): + coroutine = _StreamHooksInterceptor(_Body(_PARK)).execute_workflow(_INPUT) + # Run up to the park, the way a worker that shut down without evicting + # leaves the primary task, then close it as garbage collection would. + coroutine.send(None) + coroutine.close() + assert provider.calls == ["start"] + + +async def test_the_finish_hook_does_not_run_during_eviction(provider: _Provider): + _evicting(provider) + with pytest.raises(asyncio.CancelledError): + await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( + _INPUT + ) + assert provider.calls == ["start"] From d11aa015e8d94e887be68254d59e94109fd38e0a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:46:44 -0700 Subject: [PATCH 366/831] Typed the hook test's workflow input as awaitable. --- tests/streams/test_stream_hooks.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_stream_hooks.py b/tests/streams/test_stream_hooks.py index be7b6e9d4..9f98f75f6 100644 --- a/tests/streams/test_stream_hooks.py +++ b/tests/streams/test_stream_hooks.py @@ -65,7 +65,13 @@ async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: _PARK = object() -_INPUT = ExecuteWorkflowInput(type=object, run_fn=lambda: None, args=(), headers={}) + + +async def _unused_run_fn() -> None: + pass + + +_INPUT = ExecuteWorkflowInput(type=object, run_fn=_unused_run_fn, args=(), headers={}) @pytest.fixture From 61a91a20e4e5314ae002f9705ee7c5fb72d7a18d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 04:26:40 -0700 Subject: [PATCH 367/831] Drove the poll Update directly so a cancelled read stays cancelled. The shipped subscribe loop swallows a cancellation of the caller's task, so a bounded read resubscribed forever instead of timing out. The poll name and its failure types are public on the contrib package for this. --- .../contrib/workflow_streams/__init__.py | 6 ++ .../contrib/workflow_streams/_stream.py | 9 +- .../streams/providers/workflow_streams.py | 100 +++++++++++++----- .../streams/test_workflow_streams_provider.py | 33 ++++++ 4 files changed, 122 insertions(+), 26 deletions(-) diff --git a/temporalio/contrib/workflow_streams/__init__.py b/temporalio/contrib/workflow_streams/__init__.py index 3f225bb2f..c44bd25ea 100644 --- a/temporalio/contrib/workflow_streams/__init__.py +++ b/temporalio/contrib/workflow_streams/__init__.py @@ -14,6 +14,7 @@ from temporalio.contrib.workflow_streams._client import WorkflowStreamClient from temporalio.contrib.workflow_streams._stream import ( + POLL_UPDATE_NAME, PUBLISH_SIGNAL_NAME, WorkflowStream, ) @@ -22,6 +23,8 @@ WorkflowTopicHandle, ) from temporalio.contrib.workflow_streams._types import ( + STREAM_DRAINING_ERROR_TYPE, + TRUNCATED_OFFSET_ERROR_TYPE, PollInput, PollResult, PublishEntry, @@ -32,7 +35,10 @@ ) __all__ = [ + "POLL_UPDATE_NAME", "PUBLISH_SIGNAL_NAME", + "STREAM_DRAINING_ERROR_TYPE", + "TRUNCATED_OFFSET_ERROR_TYPE", "PollInput", "PollResult", "PublishEntry", diff --git a/temporalio/contrib/workflow_streams/_stream.py b/temporalio/contrib/workflow_streams/_stream.py index ff0865c29..e1ebda15b 100644 --- a/temporalio/contrib/workflow_streams/_stream.py +++ b/temporalio/contrib/workflow_streams/_stream.py @@ -57,8 +57,15 @@ does not have to copy the name. """ +POLL_UPDATE_NAME = "__temporal_workflow_stream_poll" +"""The update :class:`WorkflowStream` registers for long polls. + +Public so code that drives the poll itself, with its own retry and +cancellation rules, does not have to copy the name. +""" + _PUBLISH_SIGNAL = PUBLISH_SIGNAL_NAME -_POLL_UPDATE = "__temporal_workflow_stream_poll" +_POLL_UPDATE = POLL_UPDATE_NAME _OFFSET_QUERY = "__temporal_workflow_stream_offset" _MAX_POLL_RESPONSE_BYTES = 1_000_000 diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index cef1cbe3e..af297899b 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -32,6 +32,7 @@ from __future__ import annotations +import asyncio import base64 import logging from collections.abc import AsyncGenerator @@ -48,10 +49,17 @@ WorkflowHandle, WorkflowHistoryEventFilterType, WorkflowQueryFailedError, + WorkflowUpdateFailedError, + WorkflowUpdateRPCTimeoutOrCancelledError, + WorkflowUpdateStage, ) -from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( + POLL_UPDATE_NAME, PUBLISH_SIGNAL_NAME, + STREAM_DRAINING_ERROR_TYPE, + TRUNCATED_OFFSET_ERROR_TYPE, + PollInput, + PollResult, PublishEntry, PublishInput, WorkflowStream, @@ -81,6 +89,9 @@ _PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" _ENCODING = b"binary/plain" +# The server's failure type for an accepted Update whose run closed before +# answering it: the poll's way of saying the run is over. +_UPDATE_OUTLIVED_RUN = "AcceptedUpdateCompletedWorkflow" logger = logging.getLogger(__name__) @@ -452,33 +463,14 @@ async def _read( while True: handle = self._handle(run_id) next_offset = offset - # Pinned to one run, with no client for the shipped chain - # following: a log is not carried across continue-as-new, so - # the successor's offsets start over and this loop is what - # moves from one run to the next. - subscription = WorkflowStreamClient(handle).subscribe( - topic, - from_offset=offset, - result_type=RawValue, - poll_cooldown=self._poll_cooldown, - ) + polls = self._poll(handle, topic, offset) try: - async for item in subscription: - next_offset = item.offset + 1 - if item.topic != topic: - continue - for record in self._records( - decoder, run_id, item.offset, item.data.payload - ): + async for item_offset, payload in polls: + next_offset = item_offset + 1 + for record in self._records(decoder, run_id, item_offset, payload): yield record - except RPCError as error: - # The run closed and its poll Update went with it, or the - # workflow does not exist; the describe below tells which. - if error.status != RPCStatusCode.NOT_FOUND: - raise finally: - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() + await polls.aclose() status = await self._status(handle) if status is None: raise StreamNotFoundError( @@ -508,6 +500,64 @@ async def _read( return run_id, offset = successor, 0 + async def _poll( + self, handle: WorkflowHandle[Any, Any], topic: str, offset: int + ) -> AsyncGenerator[tuple[int, Payload], None]: + """Drive the shipped poll Update on one run until that run closes. + + Written here rather than through ``WorkflowStreamClient.subscribe`` + for two reasons. That loop swallows a cancellation of the caller's + task, so a consumer's ``asyncio.timeout`` or task cancel around a read + would end the subscription and let the read resubscribe forever; here + the cancellation leaves ``read()`` as what it was. And it follows + continue-as-new with offsets this provider does not carry across + runs, which is the outer loop's job. + """ + cooldown = self._poll_cooldown.total_seconds() + while True: + try: + update = await handle.start_update( + POLL_UPDATE_NAME, + PollInput(topics=[topic], from_offset=offset), + wait_for_stage=WorkflowUpdateStage.ACCEPTED, + result_type=PollResult, + ) + result = await update.result() + except WorkflowUpdateRPCTimeoutOrCancelledError as error: + if isinstance(error.__cause__, asyncio.CancelledError): + # The SDK wraps a cancelled await in this error; the + # consumer cancelled us, so that is what comes out. + raise asyncio.CancelledError() from error + # The RPC itself timed out while the run is still open. + continue + except WorkflowUpdateFailedError as error: + cause = getattr(error.cause, "type", None) + if cause == TRUNCATED_OFFSET_ERROR_TYPE: + # The log was truncated past this position; zero means + # from whatever the run still retains. + offset = 0 + continue + if cause == STREAM_DRAINING_ERROR_TYPE: + # Pollers are detached because the run is closing; the + # next attempt learns how it closed. + await asyncio.sleep(cooldown) + continue + if cause == _UPDATE_OUTLIVED_RUN: + return + raise + except RPCError as error: + # The run closed and its poll Update went with it, or the + # workflow does not exist; the caller describes to tell which. + if error.status != RPCStatusCode.NOT_FOUND: + raise + return + for item in result.items: + if item.topic == topic: + yield item.offset, Payload.FromString(base64.b64decode(item.data)) + offset = result.next_offset + if not result.more_ready and cooldown > 0: + await asyncio.sleep(cooldown) + def _records( self, decoder: RecordDecoder, run_id: str, offset: int, payload: Payload ) -> list[StreamRecord[Any]]: diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 28f2f631d..186de9094 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -209,6 +209,39 @@ async def read_everything() -> list[Any]: assert again[1].kind is RecordKind.FINISH +async def test_a_bounded_read_is_cancelled_within_its_timeout( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_forever() -> None: + async for _ in stream.read(topic=DECISIONS, result_type=dict): + pass + + # The run is open and nothing is published, so the read parks on the + # poll Update. The bound has to come out as a timeout rather than + # vanish into a resubscribe. + started = asyncio.get_running_loop().time() + with pytest.raises(asyncio.TimeoutError): + await asyncio.wait_for(read_forever(), timeout=1) + assert asyncio.get_running_loop().time() - started < 10 + # A reader task cancelled outright ends the same way. + task = asyncio.create_task(read_forever()) + await asyncio.sleep(0.2) + task.cancel() + with pytest.raises(asyncio.CancelledError): + await task + + await stream.producer(topic=INPUTS, producer_id="model", attempt=1).finish() + await handle.signal(EchoLoop.release) + assert await handle.result() == 0 + + @workflow.defn class Relay: """Publishes one record per run and continues as new once.""" From a5be0146e04a2fecfa01720e6555958a8488327a Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 368/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a2eca55e..ad45c0bbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,10 @@ to include examples, links to docs, or any other relevant information. `temporalio.contrib.workflow_streams` without naming it. Records are the `StreamRecord` proto inside the shipped item payload, and a handle without a run id follows continue-as-new run by run. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From d495abc0e0090804cb096c5d98ea1c8cadcaf5d0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 369/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 22e30de7b47a52ca751cb3df0f17ebf01f13b6f4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 370/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From 25243e66d03af3e0308564997602de99a0433445 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 371/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From 8268564d7980d35edf953271ab5d99ba7996f0c0 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 372/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad45c0bbd..d9709fa3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From e3eedb66b5979f3614584eda590077ab871b773d Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 373/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From 2a9730a80eade46b2d4b6a3371570f29276e4a86 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:26:33 -0700 Subject: [PATCH 374/831] Added the IDL contract and generation for the stream endpoint. The stream endpoint's shape lived only in hand-written Python, so no other language could be given the contract. This defines it once in a nexusrpc yaml contract and generates the Python bindings from it. The generated _definitions helper is hidden from the API docs and skipped by pydocstyle, the same way the other generated trees are. --- pyproject.toml | 6 +- scripts/gen_streams_nexus_api.py | 80 +++ .../providers/_nexus_generated/__init__.py | 23 + .../_nexus_generated/_definitions.py | 542 ++++++++++++++ .../providers/_nexus_generated/models.py | 670 ++++++++++++++++++ .../providers/_nexus_generated/services.py | 39 + .../providers/temporal_streams.nexusrpc.yaml | 123 ++++ 7 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 scripts/gen_streams_nexus_api.py create mode 100644 temporalio/streams/providers/_nexus_generated/__init__.py create mode 100644 temporalio/streams/providers/_nexus_generated/_definitions.py create mode 100644 temporalio/streams/providers/_nexus_generated/models.py create mode 100644 temporalio/streams/providers/_nexus_generated/services.py create mode 100644 temporalio/streams/providers/temporal_streams.nexusrpc.yaml diff --git a/pyproject.toml b/pyproject.toml index b7077785f..e55c39219 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,9 +125,11 @@ format = [ ] gen-docs = "uv run scripts/gen_docs.py" gen-nexus-system-api = "uv run scripts/gen_nexus_system_api.py" +gen-streams-nexus-api = "uv run scripts/gen_streams_nexus_api.py" gen-protos = [ { cmd = "uv run scripts/gen_protos.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -135,6 +137,7 @@ gen-protos = [ gen-protos-docker = [ { cmd = "uv run scripts/gen_protos_docker.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -207,7 +210,7 @@ ignore_errors = true [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 -match_dir = "^(?!(docs|scripts|tests|api|proto|system|\\.)).*" +match_dir = "^(?!(docs|scripts|tests|api|proto|system|_nexus_generated|\\.)).*" add_ignore = [ # We like to wrap at a certain number of chars, even long summary sentences. # https://github.com/PyCQA/pydocstyle/issues/184 @@ -241,6 +244,7 @@ privacy = [ "HIDDEN:temporalio.worker.workflow_sandbox.importer", "HIDDEN:temporalio.worker.workflow_sandbox.in_sandbox", "HIDDEN:**.*_pb2*", + "HIDDEN:temporalio.streams.providers._nexus_generated._definitions", ] project-name = "Temporal Python" sidebar-expand-depth = 2 diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py new file mode 100644 index 000000000..800aba944 --- /dev/null +++ b/scripts/gen_streams_nexus_api.py @@ -0,0 +1,80 @@ +import os +import shutil +import subprocess +import sys +from pathlib import Path + +base_dir = Path(__file__).parent.parent +providers_dir = base_dir / "temporalio" / "streams" / "providers" +contract_path = providers_dir / "temporal_streams.nexusrpc.yaml" +output_dir = providers_dir / "_nexus_generated" +# Pinned to the version CI installs, because nexgen's output changes between +# releases and check-protos compares against what is committed here. +NEX_GEN_VERSION = "0.2.4" + + +def nex_gen_command() -> list[str]: + if bin_path := os.environ.get("NEX_GEN_BIN"): + return [bin_path] + + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + # Same build as the system API script installs, so one binary + # serves both and neither can overwrite the other's output. + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] + + +def generate_streams_nexus_api() -> None: + if not contract_path.exists(): + raise RuntimeError(f"missing stream contract: {contract_path}") + + command = nex_gen_command() + shutil.rmtree(output_dir, ignore_errors=True) + subprocess.check_call( + [ + *command, + "python", + str(contract_path), + "--output", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + "I", + "--fix", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "format", + str(output_dir), + ] + ) + + +if __name__ == "__main__": + print("Generating stream endpoint Nexus API...", file=sys.stderr) + generate_streams_nexus_api() + print("Done", file=sys.stderr) diff --git a/temporalio/streams/providers/_nexus_generated/__init__.py b/temporalio/streams/providers/_nexus_generated/__init__.py new file mode 100644 index 000000000..c62eaa6dd --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/__init__.py @@ -0,0 +1,23 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from ._definitions import Violation +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, +) +from .services import TemporalStreams + +__all__ = [ + "Violation", + "AppendInput", + "AppendOutput", + "ReadInput", + "ReadOutput", + "RecordWire", + "TemporalStreams", +] diff --git a/temporalio/streams/providers/_nexus_generated/_definitions.py b/temporalio/streams/providers/_nexus_generated/_definitions.py new file mode 100644 index 000000000..dc8de5bb5 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/_definitions.py @@ -0,0 +1,542 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import base64 +import collections.abc +import dataclasses +import datetime +import json +import re +import typing + +import temporalio.converter +import temporalio.exceptions + +__all__ = [ + "Violation", + "_binary64", + "_check_contains", + "_check_date_time", + "_check_duration", + "_check_time", + "_check_unique_items", + "_collect", + "_json_values_equal", + "_format_base64", + "_format_base64url", + "_format_date", + "_format_date_time", + "_format_duration", + "_format_time", + "_parse_base64", + "_parse_base64url", + "_parse_date", + "_parse_date_time", + "_parse_duration", + "_parse_spec_integer", + "_parse_time", + "_quote", + "_transfer_type_convertible", +] + + +@dataclasses.dataclass(frozen=True, slots=True) +class Violation: + """A single constraint failure, located by JSON path.""" + + path: str + reason: str + + +def _quote(value: object) -> str: + """Renders a value in the JSON form every target quotes offending values in.""" + + try: + return json.dumps(value, ensure_ascii=False) + except (TypeError, ValueError): + return repr(value) + + +def _collect( + violations: list[Violation], + path: str, + error: temporalio.exceptions.ApplicationError, +) -> None: + """Re-paths a nested model's violations under `path` and appends them.""" + + if error.type != "PayloadValidationError" or not error.details: + raise error + # Generated failures retain the original list as their first detail. The + # cast is type-checker-only and performs no serialization. + nested_violations = typing.cast(list[Violation], error.details[0]) + for inner in nested_violations: + # A nested violation about the value *itself* carries no path of its own + # (a union branch's own constraint, an element-level check), so the + # prefix is the whole path -- never a dangling separator (P11). + nested = f"{path}.{inner.path}" if inner.path else path + violations.append(Violation(path=nested, reason=inner.reason)) + + +_ModelT = typing.TypeVar("_ModelT") + + +def _transfer_type_convertible( + converter: type[temporalio.converter.TransferTypeConverter[typing.Any, typing.Any]], +) -> collections.abc.Callable[[type[_ModelT]], type[_ModelT]]: + """Registers a transfer type converter on a model class. + + Wraps `temporalio.converter.transfer_type_convertible` to erase the + converter's value-type parameter. Binding it directly on the decorated class + is circular for a static type checker -- the class's type depends on the + decorator, whose value type depends on the class -- which degrades the model + to `Unknown`. Erasing it here keeps the decorator idiomatic at each model and + resolves the cycle. + """ + + return temporalio.converter.transfer_type_convertible(converter) + + +_INTEGER_CAP = (1 << 53) - 1 + + +def _parse_spec_integer( + value: object, path: str, violations: list[Violation] +) -> int | None: + """Parses a JSON number as a spec integer (`1.0` accepted, `1.5` rejected).""" + + # `bool` is a subclass of `int`, so it must be excluded before the int check. + if isinstance(value, bool) or not isinstance(value, (int, float)): + violations.append(Violation(path=path, reason="expected integer")) + return None + if isinstance(value, float): + if not value.is_integer(): + violations.append(Violation(path=path, reason="expected integer")) + return None + out = int(value) + else: + out = value + if abs(out) > _INTEGER_CAP: + violations.append(Violation(path=path, reason="expected integer")) + return None + return out + + +def _binary64(value: float) -> float: + """Narrows a `number` value to the binary64 domain shared by every target.""" + + try: + return float(value) + except OverflowError: + # Past the binary64 range there is nothing to narrow to. The caller's + # finiteness check has already recorded that violation and will raise, so + # hand the value back rather than throwing out of turn and losing the + # other violations collected alongside it. + return value + + +def _json_values_equal(left: typing.Any, right: typing.Any) -> bool: + """Compares JSON values without Python's bool-as-int equality leak.""" + + left_is_number = isinstance(left, (int, float)) and not isinstance(left, bool) + right_is_number = isinstance(right, (int, float)) and not isinstance(right, bool) + if left_is_number or right_is_number: + return left_is_number and right_is_number and left == right + if type(left) is not type(right): + return False + if isinstance(left, list): + left_list = typing.cast("list[typing.Any]", left) + right_list = typing.cast("list[typing.Any]", right) + return len(left_list) == len(right_list) and all( + _json_values_equal(a, b) for a, b in zip(left_list, right_list) + ) + if isinstance(left, dict): + left_dict = typing.cast("dict[typing.Any, typing.Any]", left) + right_dict = typing.cast("dict[typing.Any, typing.Any]", right) + return left_dict.keys() == right_dict.keys() and all( + _json_values_equal(left_dict[key], right_dict[key]) for key in left_dict + ) + return left == right + + +def _check_unique_items( + value: list[typing.Any], path: str, violations: list[Violation] +) -> None: + """Asserts an array's elements are pairwise distinct.""" + + seen: list[typing.Any] = [] + for index, element in enumerate(value): + for earlier, previous in enumerate(seen): + if _json_values_equal(previous, element): + violations.append( + Violation( + path=path, + reason=( + f"duplicate items: element at index {index} " + f"equals index {earlier}" + ), + ) + ) + break + seen.append(element) + + +def _check_contains( + value: list[typing.Any], + matches: typing.Callable[[typing.Any], bool], + min_contains: int, + max_contains: int | None, + bounded_min: bool, + path: str, + violations: list[Violation], +) -> None: + """Asserts how many of an array's elements match the `contains` schema.""" + + match_count = sum(1 for element in value if matches(element)) + if match_count < min_contains: + if bounded_min: + violations.append( + Violation( + path=path, + reason=( + f"too few matching items: at least {min_contains}, " + f"got {match_count}" + ), + ) + ) + else: + violations.append( + Violation(path=path, reason="no element matches the required schema") + ) + if max_contains is not None and match_count > max_contains: + violations.append( + Violation( + path=path, + reason=( + f"too many matching items: at most {max_contains}, " + f"got {match_count}" + ), + ) + ) + + +_TEMPORAL_DATE_TIME_RE = re.compile( + r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])\Z" +) +_TEMPORAL_DATE_RE = re.compile(r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\Z") +_TEMPORAL_TIME_RE = re.compile( + r"^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])?\Z" +) +_TEMPORAL_DURATION_RE = re.compile( + r"^PT(?:[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?|[0-9]+M(?:[0-9]+S)?|[0-9]+S)\Z" +) +_TEMPORAL_MAX_DURATION_SECONDS = ((1 << 63) - 1) // 1_000_000_000 +# A duration component with more digits than the cap itself is over the cap +# whatever those digits are, which is how the magnitude is bounded before `int()` +# sees it: CPython refuses to convert a string of more than 4300 digits. +_TEMPORAL_MAX_DURATION_DIGITS = len(str(_TEMPORAL_MAX_DURATION_SECONDS)) +# `datetime` resolves to microseconds, and `fromisoformat` before Python 3.11 +# parses only the fraction widths `isoformat` writes. +_TEMPORAL_FRACTION_DIGITS = 6 + + +def _days_in_month(year: int, month: int) -> int: + if month in (1, 3, 5, 7, 8, 10, 12): + return 31 + if month in (4, 6, 9, 11): + return 30 + if month == 2: + return 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28 + return 0 + + +def _valid_temporal_calendar(value: str) -> bool: + if len(value) < 10: + return False + try: + year, month, day = int(value[0:4]), int(value[5:7]), int(value[8:10]) + except ValueError: + return False + # `datetime.MINYEAR` is 1, which is also the shared cross-language floor. + # Year 0000 is rejected rather than shifted into range, and + # `_temporal_reason` says so. + if year < datetime.MINYEAR: + return False + maximum = _days_in_month(year, month) + return maximum > 0 and 1 <= day <= maximum + + +def _temporal_reason(name: str, value: str) -> str: + """The reason a rejected temporal string is reported under. + + Year 0000 earns its own clause so the caller sees the shared calendar floor + rather than only a generic malformed-timestamp reason. + """ + + if value[0:4] == "0000": + return ( + f"must be a valid {name}, got {_quote(value)}: year 0000 is not" + f" representable (datetime.MINYEAR is {datetime.MINYEAR})" + ) + return f"must be a valid {name}, got {_quote(value)}" + + +def _temporal_isoformat(value: str) -> str: + """Rewrites a wire temporal into the spelling `fromisoformat` accepts. + + `Z` becomes `+00:00`, and the fractional second is padded or truncated to + exactly `_TEMPORAL_FRACTION_DIGITS`: before Python 3.11 `fromisoformat` + parses only what `isoformat` writes, so an RFC 3339 `.1` or `.1234567` -- + which every other target accepts -- would otherwise raise. Digits past the + sixth are dropped, the loss at `datetime`'s own resolution that P1 allows; + the canonical output re-trims the padding, so `.1` still writes as `.1`. + """ + + normalized = value.upper() + if normalized.endswith("Z"): + normalized = normalized[:-1] + "+00:00" + dot = normalized.find(".") + if dot < 0: + return normalized + end = dot + 1 + while end < len(normalized) and normalized[end].isdigit(): + end += 1 + fraction = normalized[dot + 1 : end].ljust(_TEMPORAL_FRACTION_DIGITS, "0") + return ( + normalized[: dot + 1] + fraction[:_TEMPORAL_FRACTION_DIGITS] + normalized[end:] + ) + + +def _parse_date_time( + value: str, path: str, violations: list[Violation] +) -> datetime.datetime | None: + if _TEMPORAL_DATE_TIME_RE.match(value) is None or not _valid_temporal_calendar( + value + ): + violations.append( + Violation(path=path, reason=_temporal_reason("date-time", value)) + ) + return None + return datetime.datetime.fromisoformat(_temporal_isoformat(value)) + + +def _parse_date( + value: str, path: str, violations: list[Violation] +) -> datetime.date | None: + if _TEMPORAL_DATE_RE.match(value) is None or not _valid_temporal_calendar(value): + violations.append(Violation(path=path, reason=_temporal_reason("date", value))) + return None + return datetime.date.fromisoformat(value) + + +def _parse_time( + value: str, path: str, violations: list[Violation] +) -> datetime.time | None: + if _TEMPORAL_TIME_RE.match(value) is None: + violations.append(Violation(path=path, reason=_temporal_reason("time", value))) + return None + return datetime.time.fromisoformat(_temporal_isoformat(value)) + + +def _parse_duration( + value: str, path: str, violations: list[Violation] +) -> datetime.timedelta | None: + if _TEMPORAL_DURATION_RE.match(value) is None: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + total = 0 + number = "" + for char in value[2:]: + if char.isdigit(): + number += char + continue + digits = number.lstrip("0") + number = "" + if len(digits) > _TEMPORAL_MAX_DURATION_DIGITS: + # Over the cap by digit count alone (see the constant), so the + # conversion `int()` would refuse is never attempted. + total = _TEMPORAL_MAX_DURATION_SECONDS + 1 + break + total += int(digits or "0") * {"H": 3600, "M": 60, "S": 1}[char] + if total > _TEMPORAL_MAX_DURATION_SECONDS: + break + if total > _TEMPORAL_MAX_DURATION_SECONDS: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + return datetime.timedelta(seconds=total) + + +def _check_temporal_offset( + name: str, + value: datetime.datetime | datetime.time, + offset: datetime.timedelta, + path: str, + violations: list[Violation], +) -> None: + """Asserts a UTC offset is a whole number of minutes, the finest the wire + form spells (`tzinfo` allows seconds, which the offset would silently lose). + """ + + if offset % datetime.timedelta(minutes=1): + violations.append( + Violation( + path=path, + reason=( + f"must be a valid {name}, got {_quote(str(value))}: " + f"the UTC offset {offset} is not a whole number of minutes" + ), + ) + ) + + +def _check_date_time( + value: datetime.datetime, path: str, violations: list[Violation] +) -> None: + """Asserts a datetime is writable as a wire date-time (P12). + + A dataclass is constructed unchecked, so a naive datetime -- with no offset + the required wire form could carry -- reaches serialize; without this it + would emit a value this module's own parser rejects. + """ + + offset = value.utcoffset() + if offset is None: + violations.append( + Violation( + path=path, + reason=( + f"must be a valid date-time, got {_quote(str(value))}: " + "a naive datetime carries no UTC offset" + ), + ) + ) + return + _check_temporal_offset("date-time", value, offset, path, violations) + + +def _check_time(value: datetime.time, path: str, violations: list[Violation]) -> None: + """Asserts a time is writable as a wire time (P12). The offset is optional in + the grammar, so only its precision is held to anything.""" + + offset = value.utcoffset() + if offset is not None: + _check_temporal_offset("time", value, offset, path, violations) + + +def _check_duration( + value: datetime.timedelta, path: str, violations: list[Violation] +) -> None: + """Asserts a timedelta is writable as a wire duration (P12): the grammar is + unsigned, whole-second and capped, and a `timedelta` is none of those.""" + + if value < datetime.timedelta(0): + reason = "a duration cannot be negative" + elif value % datetime.timedelta(seconds=1): + reason = "a duration cannot carry a fraction of a second" + elif value.total_seconds() > _TEMPORAL_MAX_DURATION_SECONDS: + reason = f"a duration cannot exceed {_TEMPORAL_MAX_DURATION_SECONDS} seconds" + else: + return + violations.append( + Violation( + path=path, + reason=f"must be a valid duration, got {_quote(str(value))}: {reason}", + ) + ) + + +def _temporal_frac(microsecond: int) -> str: + if microsecond == 0: + return "" + return "." + f"{microsecond:06d}".rstrip("0") + + +def _temporal_offset(value: datetime.datetime | datetime.time) -> str: + offset = value.utcoffset() + if offset is None: + return "" + total = int(offset.total_seconds()) + if total == 0: + return "Z" + sign = "+" if total > 0 else "-" + total = abs(total) + return f"{sign}{total // 3600:02d}:{(total % 3600) // 60:02d}" + + +def _format_date_time(value: datetime.datetime) -> str: + return ( + f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + f"T{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_date(value: datetime.date) -> str: + return f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + + +def _format_time(value: datetime.time) -> str: + return ( + f"{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_duration(value: datetime.timedelta) -> str: + total = int(value.total_seconds()) + if total == 0: + return "PT0S" + hours, remainder = divmod(total, 3600) + minutes, seconds = divmod(remainder, 60) + out = "PT" + if hours: + out += f"{hours}H" + if minutes: + out += f"{minutes}M" + if seconds: + out += f"{seconds}S" + return out + + +_BASE64_RE = re.compile( + "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?\\Z", + re.ASCII, +) +_BASE64URL_RE = re.compile( + "^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048])?\\Z", + re.ASCII, +) + + +def _parse_base64(value: str, path: str, violations: list[Violation]) -> bytes | None: + if _BASE64_RE.match(value) is None: + violations.append( + Violation(path=path, reason=f"must be base64-encoded, got {_quote(value)}") + ) + return None + return base64.b64decode(value, validate=True) + + +def _format_base64(value: bytes) -> str: + return base64.b64encode(value).decode("ascii") + + +def _parse_base64url( + value: str, path: str, violations: list[Violation] +) -> bytes | None: + if _BASE64URL_RE.match(value) is None: + violations.append( + Violation( + path=path, reason=f"must be base64url-encoded, got {_quote(value)}" + ) + ) + return None + return base64.urlsafe_b64decode(value + "=" * (-len(value) % 4)) + + +def _format_base64url(value: bytes) -> str: + return base64.urlsafe_b64encode(value).rstrip(b"=").decode("ascii") diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py new file mode 100644 index 000000000..f22711a4f --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -0,0 +1,670 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import dataclasses +import typing + +import typing_extensions + +import temporalio.converter +import temporalio.exceptions + +from ._definitions import ( + Violation, + _collect, + _parse_spec_integer, + _transfer_type_convertible, +) + + +class _AppendInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendInput"] + ) -> "AppendInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) + else: + stream_value_raw = raw["stream"] + if not isinstance(stream_value_raw, str): + violations.append(Violation(path="stream", reason="expected string")) + else: + stream_value = stream_value_raw + + producer_id_value: str = typing.cast("typing.Any", None) + if "producer_id" not in raw or raw["producer_id"] is None: + violations.append(Violation(path="producer_id", reason="required")) + else: + producer_id_value_raw = raw["producer_id"] + if not isinstance(producer_id_value_raw, str): + violations.append( + Violation(path="producer_id", reason="expected string") + ) + else: + producer_id_value = producer_id_value_raw + + attempt_value: int = typing.cast("typing.Any", None) + if "attempt" not in raw or raw["attempt"] is None: + violations.append(Violation(path="attempt", reason="required")) + else: + attempt_value_raw = raw["attempt"] + attempt_value_parsed = _parse_spec_integer( + attempt_value_raw, "attempt", violations + ) + if attempt_value_parsed is not None: + attempt_value = attempt_value_parsed + + batch_index_value: int = typing.cast("typing.Any", None) + if "batch_index" not in raw or raw["batch_index"] is None: + violations.append(Violation(path="batch_index", reason="required")) + else: + batch_index_value_raw = raw["batch_index"] + batch_index_value_parsed = _parse_spec_integer( + batch_index_value_raw, "batch_index", violations + ) + if batch_index_value_parsed is not None: + batch_index_value = batch_index_value_parsed + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + payloads_value: list[str] | None = None + if "payloads" in raw: + payloads_value_raw = raw["payloads"] + if payloads_value_raw is None: + violations.append( + Violation(path="payloads", reason="explicit null not allowed") + ) + else: + if not isinstance(payloads_value_raw, list): + violations.append( + Violation(path="payloads", reason="expected array") + ) + else: + payloads_value_list: list[str] = [] + for payloads_value_index, payloads_value_element in enumerate( + typing.cast("list[typing.Any]", payloads_value_raw) + ): + payloads_value_item_path = f"payloads[{payloads_value_index}]" + payloads_value_item_violation_count = len(violations) + payloads_value_item: str = typing.cast("typing.Any", None) + if not isinstance(payloads_value_element, str): + violations.append( + Violation( + path=payloads_value_item_path, + reason="expected string", + ) + ) + else: + payloads_value_item = payloads_value_element + if len(violations) == payloads_value_item_violation_count: + payloads_value_list.append(payloads_value_item) + payloads_value = payloads_value_list + + finish_value: bool | None = None + if "finish" in raw: + finish_value_raw = raw["finish"] + if finish_value_raw is None: + violations.append( + Violation(path="finish", reason="explicit null not allowed") + ) + else: + if not isinstance(finish_value_raw, bool): + violations.append( + Violation(path="finish", reason="expected boolean") + ) + else: + finish_value = finish_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "producer_id" + and key != "attempt" + and key != "batch_index" + and key != "topic" + and key != "payloads" + and key != "finish" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendInput( + workflow_id=workflow_id_value, + stream=stream_value, + producer_id=producer_id_value, + attempt=attempt_value, + batch_index=batch_index_value, + topic=topic_value, + payloads=payloads_value, + finish=finish_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + out["stream"] = value.stream + out["producer_id"] = value.producer_id + if abs(value.attempt) > 9007199254740991: + violations.append( + Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") + ) + out["attempt"] = value.attempt + if abs(value.batch_index) > 9007199254740991: + violations.append( + Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") + ) + out["batch_index"] = value.batch_index + if value.topic is not None: + out["topic"] = value.topic + if value.payloads is not None: + out["payloads"] = value.payloads + if value.finish is not None: + out["finish"] = value.finish + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_AppendInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendInput: + """One append call: who is writing, where, and what.""" + + workflow_id: str + """The workflow whose stream is being written.""" + + stream: str + """The named stream to append to. Empty when the producer writes to a topic instead.""" + + producer_id: str + """Identifies the writer across its retries, so its attempts can be ordered.""" + + attempt: int + """The generation this producer is writing. A later attempt supersedes an earlier one.""" + + batch_index: int + """Counts this producer's batches from 1. The handler drops an index it has already + written for this producer attempt. + """ + + topic: str | None = None + """The topic to append to, when stream is empty.""" + + payloads: list[str] | None = None + """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a + call that only finishes. + """ + + finish: bool | None = None + """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + + +class _AppendOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendOutput"] + ) -> "AppendOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + cursor_value: str | None = None + if "cursor" in raw: + cursor_value_raw = raw["cursor"] + if cursor_value_raw is None: + violations.append( + Violation(path="cursor", reason="explicit null not allowed") + ) + else: + if not isinstance(cursor_value_raw, str): + violations.append( + Violation(path="cursor", reason="expected string") + ) + else: + cursor_value = cursor_value_raw + + for key in raw: + if key != "cursor": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendOutput( + cursor=cursor_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + out: dict[str, typing.Any] = {} + if value.cursor is not None: + out["cursor"] = value.cursor + return out + + +@_transfer_type_convertible(_AppendOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + + cursor: str | None = None + """Opaque token naming the last record written by this call. Empty when the call + carried no payloads. + """ + + +class _ReadInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadInput"] + ) -> "ReadInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str | None = None + if "stream" in raw: + stream_value_raw = raw["stream"] + if stream_value_raw is None: + violations.append( + Violation(path="stream", reason="explicit null not allowed") + ) + else: + if not isinstance(stream_value_raw, str): + violations.append( + Violation(path="stream", reason="expected string") + ) + else: + stream_value = stream_value_raw + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + after_token_value: str | None = None + if "after_token" in raw: + after_token_value_raw = raw["after_token"] + if after_token_value_raw is None: + violations.append( + Violation(path="after_token", reason="explicit null not allowed") + ) + else: + if not isinstance(after_token_value_raw, str): + violations.append( + Violation(path="after_token", reason="expected string") + ) + else: + after_token_value = after_token_value_raw + + max_records_value: int | None = None + if "max_records" in raw: + max_records_value_raw = raw["max_records"] + if max_records_value_raw is None: + violations.append( + Violation(path="max_records", reason="explicit null not allowed") + ) + else: + max_records_value_parsed = _parse_spec_integer( + max_records_value_raw, "max_records", violations + ) + if max_records_value_parsed is not None: + max_records_value = max_records_value_parsed + + wait_ms_value: int | None = None + if "wait_ms" in raw: + wait_ms_value_raw = raw["wait_ms"] + if wait_ms_value_raw is None: + violations.append( + Violation(path="wait_ms", reason="explicit null not allowed") + ) + else: + wait_ms_value_parsed = _parse_spec_integer( + wait_ms_value_raw, "wait_ms", violations + ) + if wait_ms_value_parsed is not None: + wait_ms_value = wait_ms_value_parsed + + latest_only_value: bool | None = None + if "latest_only" in raw: + latest_only_value_raw = raw["latest_only"] + if latest_only_value_raw is None: + violations.append( + Violation(path="latest_only", reason="explicit null not allowed") + ) + else: + if not isinstance(latest_only_value_raw, bool): + violations.append( + Violation(path="latest_only", reason="expected boolean") + ) + else: + latest_only_value = latest_only_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "topic" + and key != "after_token" + and key != "max_records" + and key != "wait_ms" + and key != "latest_only" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadInput( + workflow_id=workflow_id_value, + stream=stream_value, + topic=topic_value, + after_token=after_token_value, + max_records=max_records_value, + wait_ms=wait_ms_value, + latest_only=latest_only_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + if value.stream is not None: + out["stream"] = value.stream + if value.topic is not None: + out["topic"] = value.topic + if value.after_token is not None: + out["after_token"] = value.after_token + if value.max_records is not None: + if abs(value.max_records) > 9007199254740991: + violations.append( + Violation( + path="max_records", reason="exceeds ±(2^53-1) integer cap" + ) + ) + out["max_records"] = value.max_records + if value.wait_ms is not None: + if abs(value.wait_ms) > 9007199254740991: + violations.append( + Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") + ) + out["wait_ms"] = value.wait_ms + if value.latest_only is not None: + out["latest_only"] = value.latest_only + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadInput: + """One read call: where to resume from and how long to wait.""" + + workflow_id: str + """The workflow whose stream is being read.""" + + stream: str | None = None + """The named stream to read. Empty reads every stream the workflow publishes.""" + + topic: str | None = None + """Yield only records on this topic. Empty yields every topic.""" + + after_token: str | None = None + """Opaque cursor from an earlier record or append. The read resumes strictly after the + record it names, so a caller never sees that record twice. Empty starts at the + beginning. The token is produced by whichever store sits behind the endpoint, so a + caller cannot tell which one that is. + """ + + max_records: int | None = None + """Return at most this many records. Defaults to 100 when omitted.""" + + wait_ms: int | None = None + """Wait at most this long for records to arrive before answering. Defaults to 5000 when + omitted. A call that collects nothing answers with no records and the caller's own + token. + """ + + latest_only: bool | None = None + """Answer with the newest position and no records, for a reader that wants to follow + from now. + """ + + +class _ReadOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadOutput"] + ) -> "ReadOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + records_value: list[RecordWire] | None = None + if "records" in raw: + records_value_raw = raw["records"] + if records_value_raw is None: + violations.append( + Violation(path="records", reason="explicit null not allowed") + ) + else: + if not isinstance(records_value_raw, list): + violations.append( + Violation(path="records", reason="expected array") + ) + else: + records_value_list: list[RecordWire] = [] + for records_value_index, records_value_element in enumerate( + typing.cast("list[typing.Any]", records_value_raw) + ): + records_value_item_path = f"records[{records_value_index}]" + records_value_item_violation_count = len(violations) + records_value_item: RecordWire = typing.cast("typing.Any", None) + try: + records_value_item = ( + _RecordWireTransferTypeConverter().from_transfer_type( + records_value_element, RecordWire + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, records_value_item_path, error) + if len(violations) == records_value_item_violation_count: + records_value_list.append(records_value_item) + records_value = records_value_list + + next_token_value: str | None = None + if "next_token" in raw: + next_token_value_raw = raw["next_token"] + if next_token_value_raw is None: + violations.append( + Violation(path="next_token", reason="explicit null not allowed") + ) + else: + if not isinstance(next_token_value_raw, str): + violations.append( + Violation(path="next_token", reason="expected string") + ) + else: + next_token_value = next_token_value_raw + + for key in raw: + if key != "records" and key != "next_token": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadOutput( + records=records_value, + next_token=next_token_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadOutput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + if value.records is not None: + records_out: list[typing.Any] = [] + for records_index, records_element in enumerate(value.records): + try: + records_out.append( + _RecordWireTransferTypeConverter().to_transfer_type( + records_element + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, f"records[{records_index}]", error) + out["records"] = records_out + if value.next_token is not None: + out["next_token"] = value.next_token + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadOutput: + """What one read call answered, and where to resume.""" + + records: list[RecordWire] | None = None + """The records after the caller's token, in stream order.""" + + next_token: str | None = None + """Opaque cursor to pass as after_token on the following call. Echoes the caller's own + token when the call collected nothing. + """ + + +class _RecordWireTransferTypeConverter( + temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["RecordWire"] + ) -> "RecordWire": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + token_value: str = typing.cast("typing.Any", None) + if "token" not in raw or raw["token"] is None: + violations.append(Violation(path="token", reason="required")) + else: + token_value_raw = raw["token"] + if not isinstance(token_value_raw, str): + violations.append(Violation(path="token", reason="expected string")) + else: + token_value = token_value_raw + + frame_value: str = typing.cast("typing.Any", None) + if "frame" not in raw or raw["frame"] is None: + violations.append(Violation(path="frame", reason="required")) + else: + frame_value_raw = raw["frame"] + if not isinstance(frame_value_raw, str): + violations.append(Violation(path="frame", reason="expected string")) + else: + frame_value = frame_value_raw + + for key in raw: + if key != "token" and key != "frame": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return RecordWire( + token=token_value, + frame=frame_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "RecordWire") -> typing.Any: + out: dict[str, typing.Any] = {} + out["token"] = value.token + out["frame"] = value.frame + return out + + +@_transfer_type_convertible(_RecordWireTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + + token: str + """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" + + frame: str + """The base64-encoded record frame, carrying the topic, kind, producer, attempt, + sequence and body. + """ diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py new file mode 100644 index 000000000..ce5604d81 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -0,0 +1,39 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from nexusrpc import Operation, service + +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, +) + + +@service +class TemporalStreams: + """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the + store behind it, so an operator switches storage without touching callers. Reads + hand out batches and an append carries one batch per call, because a Nexus operation + per record costs too much for token streams. + """ + + append: Operation[ + AppendInput, + AppendOutput, + ] = Operation(name="append") + """Append one batch on the caller's account. A repeated batch_index for the same + producer attempt is dropped, so a retried call writes once. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. + """ + + read: Operation[ + ReadInput, + ReadOutput, + ] = Operation(name="read") + """Answer with the records after the caller's token, or time out. The call parks until + it has max_records records or wait_ms elapses, whichever comes first, and returns + whatever it collected. + """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml new file mode 100644 index 000000000..ffa849509 --- /dev/null +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -0,0 +1,123 @@ +nexusrpc: "1.0.0" + +services: + TemporalStreams: + fqn: TemporalStreams + description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + operations: + append: + fqn: append + description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + input: { $ref: "#/$defs/AppendInput" } + output: { $ref: "#/$defs/AppendOutput" } + read: + fqn: read + description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + input: { $ref: "#/$defs/ReadInput" } + output: { $ref: "#/$defs/ReadOutput" } + +$defs: + AppendInput: + type: object + description: "One append call: who is writing, where, and what." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being written." + stream: + type: string + description: "The named stream to append to. Empty when the producer writes to a topic instead." + producer_id: + type: string + description: "Identifies the writer across its retries, so its attempts can be ordered." + attempt: + type: integer + description: "The generation this producer is writing. A later attempt supersedes an earlier one." + batch_index: + type: integer + description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + topic: + type: string + description: "The topic to append to, when stream is empty." + payloads: + type: array + items: + type: string + description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + finish: + type: boolean + description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + required: + - workflow_id + - stream + - producer_id + - attempt + - batch_index + additionalProperties: false + + AppendOutput: + type: object + description: "Where the append landed, empty when it wrote nothing." + properties: + cursor: + type: string + description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." + additionalProperties: false + + ReadInput: + type: object + description: "One read call: where to resume from and how long to wait." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being read." + stream: + type: string + description: "The named stream to read. Empty reads every stream the workflow publishes." + topic: + type: string + description: "Yield only records on this topic. Empty yields every topic." + after_token: + type: string + description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + max_records: + type: integer + description: "Return at most this many records. Defaults to 100 when omitted." + wait_ms: + type: integer + description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + latest_only: + type: boolean + description: "Answer with the newest position and no records, for a reader that wants to follow from now." + required: + - workflow_id + additionalProperties: false + + RecordWire: + type: object + description: "One record on the wire: its cursor and its base64 frame." + properties: + token: + type: string + description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + frame: + type: string + description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + required: + - token + - frame + additionalProperties: false + + ReadOutput: + type: object + description: "What one read call answered, and where to resume." + properties: + records: + type: array + items: + $ref: "#/$defs/RecordWire" + description: "The records after the caller's token, in stream order." + next_token: + type: string + description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." + additionalProperties: false From 0cc10824e4c668a2d2ff6639db5cd1ef7fa697ae Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:30:01 -0700 Subject: [PATCH 375/831] Moved the nexus provider onto the generated contract. The five wire dataclasses and the service class now come from the generated module, so the contract has one source. Both halves read the operation and service names off the generated definition instead of hard-coding paths. Field names and operation names on the wire are unchanged. The one wire difference is that a read no longer sends max_records, wait_ms and latest_only when the caller leaves them at their defaults, because the contract marks them optional and the handler applies the documented defaults. Nothing outside this module and its tests speaks this wire. --- temporalio/streams/providers/nexus.py | 205 ++++++++++++-------------- 1 file changed, 93 insertions(+), 112 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 3701a70cb..8e19c2d4d 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -8,6 +8,12 @@ store behind the endpoint is invisible to callers and an operator switches it without touching them. +The wire types and the service definition come from +``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be +handed the same contract. What stays hand-written here is what the +generator cannot express yet: the handler's dedupe and long-poll collect +loop, and the caller's batching, cursor handling and codec. + Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Supersession records are not transported: the caller's reader re-synthesizes them from @@ -25,13 +31,11 @@ import asyncio import base64 -import dataclasses -import json import urllib.error import urllib.request from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta -from typing import Any +from typing import Any, TypeVar import nexusrpc import nexusrpc.handler @@ -42,71 +46,40 @@ from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams.providers._nexus_generated import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, + TemporalStreams, +) _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so configure one of those on the worker" ) +# The contract leaves these unset, so the handler is the one place that says +# what an omitted read bound means. +_DEFAULT_MAX_RECORDS = 100 +_DEFAULT_WAIT_MS = 5000 -@dataclasses.dataclass -class AppendInput: - """One append call: who is writing, where, and what.""" - - workflow_id: str - stream: str - producer_id: str - attempt: int - batch_index: int - topic: str = "" - payloads: list[str] = dataclasses.field(default_factory=list) - finish: bool = False - - -@dataclasses.dataclass -class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" - - cursor: str = "" - - -@dataclasses.dataclass -class ReadInput: - """One read call: where to resume from and how long to wait.""" - - workflow_id: str - stream: str = "" - topic: str = "" - after_token: str = "" - max_records: int = 100 - wait_ms: int = 5000 - # Answer with the newest position and no records, for a reader that - # wants to follow from now. - latest_only: bool = False - - -@dataclasses.dataclass -class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" - - token: str - frame: str - - -@dataclasses.dataclass -class ReadOutput: - """What one read call answered, and where to resume.""" - - records: list[RecordWire] = dataclasses.field(default_factory=list) - next_token: str = "" - - -@nexusrpc.service -class TemporalStreams: - """The stream endpoint's two operations.""" +_definition = nexusrpc.get_service_definition(TemporalStreams) +if _definition is None: # pragma: no cover + raise RuntimeError("the generated stream service carries no nexus definition") +# Both halves read the wire names off the generated definition, so a rename in +# the contract cannot leave the caller posting to a path the handler no longer +# serves. +_SERVICE_NAME = _definition.name +_OPERATION_NAMES = { + operation.method_name: operation.name + for operation in _definition.operation_definitions.values() +} +_APPEND_OPERATION = _OPERATION_NAMES["append"] +_READ_OPERATION = _OPERATION_NAMES["read"] - append: nexusrpc.Operation[AppendInput, AppendOutput] - read: nexusrpc.Operation[ReadInput, ReadOutput] +_OutputT = TypeVar("_OutputT") @nexusrpc.handler.service_handler(service=TemporalStreams) @@ -129,9 +102,10 @@ async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: """Append on the caller's account, dropping a repeated batch.""" + topic = input.topic or "" key = ( input.workflow_id, - input.stream or f"@{input.topic}", + input.stream or f"@{topic}", input.producer_id, input.attempt, ) @@ -143,7 +117,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, - topic=input.topic, + topic=topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -168,14 +142,18 @@ async def read( ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream + self._client, workflow_id=input.workflow_id, stream=input.stream or "" ) topic = input.topic or None if input.latest_only: return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + max_records = ( + _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records + ) + wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.after_token + next_token = input.after_token or "" subscription = delegate.read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, @@ -204,13 +182,13 @@ async def collect() -> None: ) ) next_token = record.cursor.token - if len(records) >= input.max_records: + if len(records) >= max_records: return try: # `wait_for` rather than `asyncio.timeout`, which 3.10 does not # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), input.wait_ms / 1000) + await asyncio.wait_for(collect(), wait_ms / 1000) except asyncio.TimeoutError: pass finally: @@ -222,20 +200,29 @@ async def collect() -> None: return ReadOutput(records=records, next_token=next_token) -def _post(url: str, body: dict) -> dict: +def _post(url: str, body: bytes) -> bytes: request = urllib.request.Request( url, - data=json.dumps(body).encode(), + data=body, headers={"Content-Type": "application/json"}, method="POST", ) try: with urllib.request.urlopen(request, timeout=30) as response: - raw = response.read() + return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") - return json.loads(raw) if raw else {} + + +async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller and + # the worker serving the operation agree on the body without either of + # them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: @@ -276,7 +263,7 @@ async def append(self, *values: Any) -> Cursor: else self._converter.to_payloads([value])[0] ) payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + return Cursor((await self._call(payloads=payloads)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -284,23 +271,21 @@ async def finish(self) -> None: async def _call( self, payloads: list[str] | None = None, finish: bool = False - ) -> dict: + ) -> AppendOutput: self._batch_index += 1 - return await asyncio.to_thread( - _post, - f"{self._base_url}/append", - dataclasses.asdict( - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ) + return await _invoke( + f"{self._base_url}/{_APPEND_OPERATION}", + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + topic=self._topic, + payloads=payloads or [], + finish=finish, ), + AppendOutput, ) @@ -327,28 +312,26 @@ async def read( attempts = AttemptTracker() token = after.token while True: - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - after_token=token, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + after_token=token, ), + ReadOutput, ) - for wire in raw.get("records", []): + for wire in answer.records or []: try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire["frame"]) + base64.b64decode(wire.frame) ) except ValueError: continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire["token"]) + cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -361,23 +344,21 @@ async def read( attempt=attempt, sequence=sequence, ) - token = raw.get("next_token", token) or token + token = answer.next_token or token async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - latest_only=True, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, ), + ReadOutput, ) - token = raw.get("next_token", "") + token = answer.next_token or "" return Cursor(token) if token else BEGINNING def _decode(self, body: bytes, as_type: type | None) -> Any: @@ -397,7 +378,7 @@ def __init__(self) -> None: def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", "TemporalStreams") + service = options.pop("service", _SERVICE_NAME) if options: raise TypeError( "the nexus provider takes endpoint, http_address and service, " From fc4084604750c0ec0f9c155d5b72fb3e68ceae68 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:37:16 -0700 Subject: [PATCH 376/831] Applied the payload codec on the nexus provider's caller side. The caller ran the payload converter but never the codec, so records left the process in the clear even when one was configured. The producer now encodes before posting and the consumer decodes after reading, while the handler stays codec-blind, which is what keeps plaintext out of whoever hosts the endpoint. A data_converter option on the provider says which one to use when there is no client to take it from. --- CHANGELOG.md | 5 +- temporalio/streams/providers/nexus.py | 72 ++++++---- tests/streams/test_nexus_provider.py | 182 ++++++++++++++++++++++++-- 3 files changed, 223 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9709fa3f..7d6d93c86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,10 @@ to include examples, links to docs, or any other relevant information. naming it. - **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. + through the endpoint and never names the store. Its contract is defined in + `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. + Configure it with `data_converter=` to run a payload codec on the caller + side, so records are encoded before they leave the process. ### Changed diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8e19c2d4d..a73c830ef 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -231,7 +231,7 @@ class NexusProducer: def __init__( self, base_url: str, - converter: Any, + data_converter: temporalio.converter.DataConverter, workflow_id: str, stream: str, topic: str, @@ -240,7 +240,8 @@ def __init__( ) -> None: """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream self._topic = topic @@ -255,15 +256,22 @@ def attempt(self) -> int: async def append(self, *values: Any) -> Cursor: """Append ``values`` through the endpoint.""" - payloads = [] - for value in values: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).cursor or "") + payloads = [ + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + for value in values + ] + if self._codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._codec.encode(payloads) + encoded = [ + base64.b64encode(payload.SerializeToString()).decode() + for payload in payloads + ] + return Cursor((await self._call(payloads=encoded)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -293,11 +301,16 @@ class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + workflow_id: str, + stream: str, ) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream @@ -335,8 +348,11 @@ async def read( superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded + value = ( + await self._decode(body, type) if kind is RecordKind.DATA else None + ) yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, + value=value, cursor=cursor, kind=kind, topic=frame_topic, @@ -361,9 +377,11 @@ async def latest(self, *, topic: str | None = None) -> Cursor: token = answer.next_token or "" return Cursor(token) if token else BEGINNING - def _decode(self, body: bytes, as_type: type | None) -> Any: + async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) + if self._codec is not None: + payload = (await self._codec.decode([payload]))[0] if as_type is None: return self._converter.from_payloads([payload])[0] return self._converter.from_payloads([payload], [as_type])[0] @@ -374,19 +392,22 @@ class _NexusProvider: def __init__(self) -> None: self._base_url: str | None = None + self._data_converter: temporalio.converter.DataConverter | None = None def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") service = options.pop("service", _SERVICE_NAME) + data_converter = options.pop("data_converter", None) if options: raise TypeError( - "the nexus provider takes endpoint, http_address and service, " - f"got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service and " + f"data_converter, got {sorted(options)}" ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + self._data_converter = data_converter def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -427,7 +448,7 @@ async def producer( attempt = attempt or activity.info().attempt return NexusProducer( self._url(), - _converter(client), + self._converter(client), workflow_id, stream, topic, @@ -438,13 +459,14 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), _converter(client), workflow_id, stream) - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + + def _converter(self, client: Any) -> temporalio.converter.DataConverter: + if self._data_converter is not None: + return self._data_converter + if client is None: + return temporalio.converter.DataConverter.default + return client.data_converter _provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index f07e4956c..18679ad5f 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,40 +1,55 @@ -"""Live conformance for the Nexus front. +"""Conformance for the Nexus front. -The caller talks only to the stream endpoint over the server's Nexus HTTP -ingress; the handler worker delegates to the workflow_streams provider, so -this test is the provider-hiding demonstration: nothing on the caller side -names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it -needs a dev server with an HTTP port and a registered Nexus endpoint. +The caller talks only to the stream endpoint; the handler delegates to a +storage provider, so these tests are the provider-hiding demonstration: +nothing on the caller side names or could name the store. -Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), -``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named -``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +The loop test runs over the server's Nexus HTTP ingress and is gated behind +``STREAMS_LIVE=nexus`` because it needs a dev server with an HTTP port and a +registered Nexus endpoint. Environment: ``TEMPORAL_ADDRESS`` (default +``localhost:7233``), ``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), +and an endpoint named ``streams-e2e`` targeting task queue +``streams-handlers-e2e``. + +The codec test stands the endpoint up in this process instead, because what +it checks is the bytes the caller puts on the wire. """ from __future__ import annotations +import asyncio +import base64 +import dataclasses import json import os import subprocess import uuid +from collections.abc import Sequence +from typing import Any, cast import pytest +import temporalio.converter from temporalio import streams +from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams import _frame as frame from temporalio.streams._provider import instance +from temporalio.streams.providers import memory, nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take -pytestmark = pytest.mark.skipif( +live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", ) ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" +APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] def _endpoint_id() -> str: @@ -60,6 +75,7 @@ def _endpoint_id() -> str: return json.loads(out.stdout)["id"] +@live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. @@ -119,3 +135,149 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + + +class ScrambleCodec(temporalio.converter.PayloadCodec): + """Flips every byte of a payload, so the middle holds nothing readable.""" + + KEY = 0x5A + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Wrap each payload as opaque bytes nothing downstream can read.""" + return [ + Payload( + metadata={"encoding": b"binary/plain"}, + data=self._flip(payload.SerializeToString()), + ) + for payload in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Recover the payloads :meth:`encode` wrapped.""" + out: list[Payload] = [] + for payload in payloads: + inner = Payload() + inner.ParseFromString(self._flip(payload.data)) + out.append(inner) + return out + + @classmethod + def _flip(cls, data: bytes) -> bytes: + return bytes(byte ^ cls.KEY for byte in data) + + +async def _dispatch( + handler: TemporalStreamsHandler, operation: str, request: Any +) -> Any: + context = cast("Any", None) # neither operation looks at it + if operation == APPEND_OPERATION: + return await handler.append(context, request) + return await handler.read(context, request) + + +def _in_process_endpoint( + handler: TemporalStreamsHandler, + posted: list[bytes], + answered: list[bytes], +) -> Any: + """Serve the caller's posts from ``handler``, recording both directions.""" + contract = temporalio.converter.DataConverter.default.payload_converter + loop = asyncio.get_running_loop() + + def post(url: str, body: bytes) -> bytes: + posted.append(body) + operation = url.rsplit("/", 1)[1] + request_type = AppendInput if operation == APPEND_OPERATION else ReadInput + request: Any = contract.from_payloads( + [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] + )[0] + if request_type is ReadInput: + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + request.wait_ms = 200 + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + raw = contract.to_payloads([answer])[0].data + answered.append(raw) + return raw + + return post + + +async def _loop_through_an_endpoint( + monkeypatch: pytest.MonkeyPatch, + codec: temporalio.converter.PayloadCodec | None, +) -> tuple[list[Any], list[bytes], list[bytes]]: + memory.reset() + streams.configure(provider="memory") + posted: list[bytes] = [] + answered: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) + front = instance( + "nexus", + endpoint="in-process", + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + workflow_id = "wf-codec" + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"secret": "tuna"}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") + records = await take(consumer.read(type=dict), 2, timeout=30) + memory.reset() + return records, posted, answered + + +def _appended_bytes(posted: list[bytes]) -> bytes: + out = b"" + for body in posted: + for encoded in json.loads(body).get("payloads", []): + out += base64.b64decode(encoded) + return out + + +def _answered_bodies(answered: list[bytes]) -> bytes: + out = b"" + for body in answered: + for record in json.loads(body).get("records", []): + out += frame.decode(base64.b64decode(record["frame"]))[5] + return out + + +async def test_the_caller_encodes_records_with_the_configured_codec( + monkeypatch: pytest.MonkeyPatch, +): + records, posted, answered = await _loop_through_an_endpoint( + monkeypatch, ScrambleCodec() + ) + + # The value survives the hop, so the codec is applied on both sides. + assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"secret": "tuna"} + # Neither direction carried the plaintext. + assert b"tuna" not in _appended_bytes(posted) + assert b"tuna" not in _answered_bodies(answered) + + +async def test_without_a_codec_the_same_records_go_out_in_the_clear( + monkeypatch: pytest.MonkeyPatch, +): + # The contrast is the point: the bytes above differ because of the codec, + # not because the transport obscures them anyway. + records, posted, answered = await _loop_through_an_endpoint(monkeypatch, None) + + assert records[0].value == {"secret": "tuna"} + assert b"tuna" in _appended_bytes(posted) + assert b"tuna" in _answered_bodies(answered) From 63580bb7361bf55d4eaa5931b45921ea9775ace2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 377/831] Made the stream contract generator refuse a nexgen other than the pinned one. The output differs between releases, so a developer with another version on PATH would regenerate different code and only see the drift in CI. --- scripts/gen_streams_nexus_api.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py index 800aba944..2d4f16c6d 100644 --- a/scripts/gen_streams_nexus_api.py +++ b/scripts/gen_streams_nexus_api.py @@ -36,11 +36,26 @@ def nex_gen_command() -> list[str]: return ["nexgen"] +def check_version(command: list[str]) -> None: + # A different release on PATH would regenerate different code locally + # and the drift would only show in CI, so refuse before writing anything. + reported = subprocess.check_output([*command, "--version"], text=True).strip() + found = reported.split()[-1] if reported else "" + if found != NEX_GEN_VERSION: + raise SystemExit( + f"found nexgen {found or '?'} at {command[0]}, but the stream contract is " + f"generated with {NEX_GEN_VERSION}. Install it with `cargo install --locked " + f"nexgen --version {NEX_GEN_VERSION} --features advanced` or point " + "NEX_GEN_BIN at that binary." + ) + + def generate_streams_nexus_api() -> None: if not contract_path.exists(): raise RuntimeError(f"missing stream contract: {contract_path}") command = nex_gen_command() + check_version(command) shutil.rmtree(output_dir, ignore_errors=True) subprocess.check_call( [ From a671f8c707b67e2eb07eda21066a48336f4a2450 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 378/831] Regenerated the stream contract with byte payloads, read bounds and tolerant outputs. Payload fields carry contentEncoding base64 so both halves pass bytes and the generated code does the encoding. max_records and wait_ms carry the bounds the validator enforces, outputs accept unknown fields so a handler can add one before every caller is rebuilt, and descriptions are folded at 100 columns. --- .../providers/_nexus_generated/models.py | 201 +++++++++++++++--- .../providers/_nexus_generated/services.py | 8 +- .../providers/temporal_streams.nexusrpc.yaml | 108 ++++++++-- 3 files changed, 261 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index f22711a4f..d00cbcc63 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -13,10 +13,20 @@ from ._definitions import ( Violation, _collect, + _format_base64, + _parse_base64, _parse_spec_integer, _transfer_type_convertible, ) +_APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) + + +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) + + +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) + class _AppendInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] @@ -87,6 +97,13 @@ def from_transfer_type( ) if batch_index_value_parsed is not None: batch_index_value = batch_index_value_parsed + if batch_index_value < 1: + violations.append( + Violation( + path="batch_index", + reason=f"must be >= 1, got {batch_index_value}", + ) + ) topic_value: str | None = None if "topic" in raw: @@ -101,7 +118,7 @@ def from_transfer_type( else: topic_value = topic_value_raw - payloads_value: list[str] | None = None + payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] if payloads_value_raw is None: @@ -114,13 +131,13 @@ def from_transfer_type( Violation(path="payloads", reason="expected array") ) else: - payloads_value_list: list[str] = [] + payloads_value_list: list[bytes] = [] for payloads_value_index, payloads_value_element in enumerate( typing.cast("list[typing.Any]", payloads_value_raw) ): payloads_value_item_path = f"payloads[{payloads_value_index}]" payloads_value_item_violation_count = len(violations) - payloads_value_item: str = typing.cast("typing.Any", None) + payloads_value_item: bytes = typing.cast("typing.Any", None) if not isinstance(payloads_value_element, str): violations.append( Violation( @@ -129,7 +146,13 @@ def from_transfer_type( ) ) else: - payloads_value_item = payloads_value_element + payloads_value_item_parsed = _parse_base64( + payloads_value_element, + payloads_value_item_path, + violations, + ) + if payloads_value_item_parsed is not None: + payloads_value_item = payloads_value_item_parsed if len(violations) == payloads_value_item_violation_count: payloads_value_list.append(payloads_value_item) payloads_value = payloads_value_list @@ -190,11 +213,17 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") ) + if value.batch_index < 1: + violations.append( + Violation( + path="batch_index", reason=f"must be >= 1, got {value.batch_index}" + ) + ) out["batch_index"] = value.batch_index if value.topic is not None: out["topic"] = value.topic if value.payloads is not None: - out["payloads"] = value.payloads + out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: out["finish"] = value.finish if violations: @@ -221,15 +250,16 @@ class AppendInput: batch_index: int """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt. + written for this producer attempt, and rejects one that skips ahead or that resumes + an attempt it never saw start. """ topic: str | None = None """The topic to append to, when stream is empty.""" - payloads: list[str] | None = None - """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a - call that only finishes. + payloads: list[bytes] | None = None + """The records to write, each a serialized Temporal Payload. Empty on a call that only + finishes. """ finish: bool | None = None @@ -265,33 +295,53 @@ def from_transfer_type( else: cursor_value = cursor_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "cursor": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _APPEND_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return AppendOutput( cursor=cursor_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} if value.cursor is not None: out["cursor"] = value.cursor + for key, entry in value.additional_properties.items(): + if key in _APPEND_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_AppendOutputTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" + """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Empty when the call - carried no payloads. + """Opaque token naming the last record written by this call. Absent when the call + carried no payloads, when the batch was a repeat the handler dropped, or when the + store learns positions only at read time. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _ReadInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] @@ -375,6 +425,20 @@ def from_transfer_type( ) if max_records_value_parsed is not None: max_records_value = max_records_value_parsed + if max_records_value < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {max_records_value}", + ) + ) + if max_records_value > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {max_records_value}", + ) + ) wait_ms_value: int | None = None if "wait_ms" in raw: @@ -389,6 +453,20 @@ def from_transfer_type( ) if wait_ms_value_parsed is not None: wait_ms_value = wait_ms_value_parsed + if wait_ms_value < 0: + violations.append( + Violation( + path="wait_ms", + reason=f"must be >= 0, got {wait_ms_value}", + ) + ) + if wait_ms_value > 60000: + violations.append( + Violation( + path="wait_ms", + reason=f"must be <= 60000, got {wait_ms_value}", + ) + ) latest_only_value: bool | None = None if "latest_only" in raw: @@ -446,12 +524,38 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: path="max_records", reason="exceeds ±(2^53-1) integer cap" ) ) + if value.max_records < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {value.max_records}", + ) + ) + if value.max_records > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {value.max_records}", + ) + ) out["max_records"] = value.max_records if value.wait_ms is not None: if abs(value.wait_ms) > 9007199254740991: violations.append( Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") ) + if value.wait_ms < 0: + violations.append( + Violation( + path="wait_ms", reason=f"must be >= 0, got {value.wait_ms}" + ) + ) + if value.wait_ms > 60000: + violations.append( + Violation( + path="wait_ms", reason=f"must be <= 60000, got {value.wait_ms}" + ) + ) out["wait_ms"] = value.wait_ms if value.latest_only is not None: out["latest_only"] = value.latest_only @@ -472,7 +576,9 @@ class ReadInput: """The named stream to read. Empty reads every stream the workflow publishes.""" topic: str | None = None - """Yield only records on this topic. Empty yields every topic.""" + """Yield only records on this topic. Empty yields every topic. Only meaningful when + stream is empty, because an inbound stream has no topics. + """ after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the @@ -485,9 +591,9 @@ class ReadInput: """Return at most this many records. Defaults to 100 when omitted.""" wait_ms: int | None = None - """Wait at most this long for records to arrive before answering. Defaults to 5000 when - omitted. A call that collects nothing answers with no records and the caller's own - token. + """Wait at most this long for records to arrive before answering. The handler shortens + it to fit the request deadline. A call that collects nothing answers with no records + and the caller's own token. """ latest_only: bool | None = None @@ -557,14 +663,16 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "records" and key != "next_token": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _READ_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return ReadOutput( records=records_value, next_token=next_token_value, + additional_properties=additional_properties, ) @typing_extensions.override @@ -585,6 +693,16 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + for key, entry in value.additional_properties.items(): + if key in _READ_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry if violations: raise temporalio.converter.create_payload_validation_error(violations) return out @@ -603,6 +721,10 @@ class ReadOutput: token when the call collected nothing. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _RecordWireTransferTypeConverter( temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] @@ -628,7 +750,7 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: str = typing.cast("typing.Any", None) + frame_value: bytes = typing.cast("typing.Any", None) if "frame" not in raw or raw["frame"] is None: violations.append(Violation(path="frame", reason="required")) else: @@ -636,35 +758,54 @@ def from_transfer_type( if not isinstance(frame_value_raw, str): violations.append(Violation(path="frame", reason="expected string")) else: - frame_value = frame_value_raw + frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) + if frame_value_parsed is not None: + frame_value = frame_value_parsed + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "token" and key != "frame": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _RECORD_WIRE_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, frame=frame_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "RecordWire") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = value.frame + out["frame"] = _format_base64(value.frame) + for key, entry in value.additional_properties.items(): + if key in _RECORD_WIRE_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" + """One record on the wire: its cursor and its frame.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: str - """The base64-encoded record frame, carrying the topic, kind, producer, attempt, - sequence and body. - """ + frame: bytes + """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index ce5604d81..e0673aeab 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -24,9 +24,11 @@ class TemporalStreams: AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. A repeated batch_index for the same - producer attempt is dropped, so a retried call writes once. Supersession records are - not transported: a reader re-synthesizes them from the attempts it observes. + """Append one batch on the caller's account. The handler drops a batch_index it has + already written for this producer attempt, so a retried call writes once, and + rejects an index that skips ahead or a producer attempt it has no state for. + Supersession records are not transported: a reader re-synthesizes them from the + attempts it observes. """ read: Operation[ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index ffa849509..a1cc34631 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -1,18 +1,35 @@ +# The stream endpoint's wire contract. Inputs reject unknown fields so a typo +# fails loudly at the handler; outputs accept them so a handler can add a +# field before every caller has been rebuilt from the newer contract. nexusrpc: "1.0.0" services: TemporalStreams: fqn: TemporalStreams - description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + description: >- + The stream endpoint's two operations. One Temporal-authenticated endpoint + hides the store behind it, so an operator switches storage without + touching callers. Reads hand out batches and an append carries one batch + per call, because a Nexus operation per record costs too much for token + streams. operations: append: fqn: append - description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + description: >- + Append one batch on the caller's account. The handler drops a + batch_index it has already written for this producer attempt, so a + retried call writes once, and rejects an index that skips ahead or a + producer attempt it has no state for. Supersession records are not + transported: a reader re-synthesizes them from the attempts it + observes. input: { $ref: "#/$defs/AppendInput" } output: { $ref: "#/$defs/AppendOutput" } read: fqn: read - description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + description: >- + Answer with the records after the caller's token, or time out. The + call parks until it has max_records records or wait_ms elapses, + whichever comes first, and returns whatever it collected. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -26,16 +43,26 @@ $defs: description: "The workflow whose stream is being written." stream: type: string - description: "The named stream to append to. Empty when the producer writes to a topic instead." + description: >- + The named stream to append to. Empty when the producer writes to a + topic instead. producer_id: type: string - description: "Identifies the writer across its retries, so its attempts can be ordered." + description: >- + Identifies the writer across its retries, so its attempts can be + ordered. attempt: type: integer - description: "The generation this producer is writing. A later attempt supersedes an earlier one." + description: >- + The generation this producer is writing. A later attempt supersedes + an earlier one. batch_index: type: integer - description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + minimum: 1 + description: >- + Counts this producer's batches from 1. The handler drops an index it + has already written for this producer attempt, and rejects one that + skips ahead or that resumes an attempt it never saw start. topic: type: string description: "The topic to append to, when stream is empty." @@ -43,10 +70,15 @@ $defs: type: array items: type: string - description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + contentEncoding: base64 + description: >- + The records to write, each a serialized Temporal Payload. Empty on a + call that only finishes. finish: type: boolean - description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + description: >- + Mark this producer done after writing the batch, so a reader stops + waiting on it. required: - workflow_id - stream @@ -57,12 +89,16 @@ $defs: AppendOutput: type: object - description: "Where the append landed, empty when it wrote nothing." + description: "Where the append landed, when the store can say." properties: cursor: type: string - description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." - additionalProperties: false + description: >- + Opaque token naming the last record written by this call. Absent + when the call carried no payloads, when the batch was a repeat the + handler dropped, or when the store learns positions only at read + time. + additionalProperties: true ReadInput: type: object @@ -73,40 +109,64 @@ $defs: description: "The workflow whose stream is being read." stream: type: string - description: "The named stream to read. Empty reads every stream the workflow publishes." + description: >- + The named stream to read. Empty reads every stream the workflow + publishes. topic: type: string - description: "Yield only records on this topic. Empty yields every topic." + description: >- + Yield only records on this topic. Empty yields every topic. Only + meaningful when stream is empty, because an inbound stream has no + topics. after_token: type: string - description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + description: >- + Opaque cursor from an earlier record or append. The read resumes + strictly after the record it names, so a caller never sees that + record twice. Empty starts at the beginning. The token is produced by + whichever store sits behind the endpoint, so a caller cannot tell + which one that is. max_records: type: integer + minimum: 1 + maximum: 1000 description: "Return at most this many records. Defaults to 100 when omitted." wait_ms: type: integer - description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + minimum: 0 + maximum: 60000 + description: >- + Wait at most this long for records to arrive before answering. The + handler shortens it to fit the request deadline. A call that collects + nothing answers with no records and the caller's own token. latest_only: type: boolean - description: "Answer with the newest position and no records, for a reader that wants to follow from now." + description: >- + Answer with the newest position and no records, for a reader that + wants to follow from now. required: - workflow_id additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its base64 frame." + description: "One record on the wire: its cursor and its frame." properties: token: type: string - description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + description: >- + Opaque cursor naming this record. Pass it as after_token to resume + just past it. frame: type: string - description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + contentEncoding: base64 + description: >- + The record frame, carrying the topic, kind, producer, attempt, + sequence and body. required: - token - frame - additionalProperties: false + additionalProperties: true ReadOutput: type: object @@ -119,5 +179,7 @@ $defs: description: "The records after the caller's token, in stream order." next_token: type: string - description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." - additionalProperties: false + description: >- + Opaque cursor to pass as after_token on the following call. Echoes + the caller's own token when the call collected nothing. + additionalProperties: true From b569f339486eff7c36aae4f5943a76e624c0979d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 379/831] Reworked the Nexus front's dedupe, reads, error mapping and endpoint lookup. The handler refuses to continue a producer attempt it has no state for and rejects an index that skips ahead, so a restarted or load-balanced handler cannot lose records behind a success answer. Reads come from one parked subscription per stream, pass bodies through as raw payloads so a codec survives the hop, and stop at the request deadline. The caller commits its batch index only after the endpoint answered, resends a failed batch under the same index, maps transport failures to one error type, and resolves an endpoint name through the operator service. --- temporalio/streams/providers/nexus.py | 685 +++++++++++++++++++------- 1 file changed, 508 insertions(+), 177 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index a73c830ef..8c311d1d9 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -15,33 +15,51 @@ loop, and the caller's batching, cursor handling and codec. Reads hand out batches and an append carries one batch per call, because a -Nexus operation per record costs too much for token streams. Supersession -records are not transported: the caller's reader re-synthesizes them from -the attempts it observes, which is the policy module's job on every -provider. Cursors pass through opaque, so the caller cannot tell which store -produced them. - -One stated prototype limit: append deduplication holds at the handler by -batch index per producer, so a handler restart during a producer's life can -double-append. The store-level fix, a sequence-explicit append in the IDL -contract, is listed in the design doc's work table. +Nexus operation per record costs too much for token streams. Record bodies +cross the handler untouched: it reads the store as raw payloads and frames +them as they are, so a codec that changes the payload encoding survives the +hop and the handler's worker never needs the key. Supersession records are +not transported: the caller's reader re-synthesizes them from the attempts +it observes, which is the policy module's job on every provider. Cursors +pass through opaque, so the caller cannot tell which store produced them. + +The handler keeps one parked read per ``(workflow, stream, topic)`` and +serves consecutive calls from it, so an idle caller does not leave one +abandoned long poll on the store per call. A call whose token does not +match the parked position replaces the subscription, and an idle one is +released after a minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, +by batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh +delegate whose numbering the store would drop as a repeat; the caller opens +a new attempt, which readers report as a supersession. The store-level fix, +a sequence-explicit append in the contract, is listed in the design doc's +work table. And any caller the endpoint admits may touch any workflow's +streams in the namespace; the endpoint's own authorization is the boundary. """ from __future__ import annotations import asyncio -import base64 +import logging +import time import urllib.error import urllib.request -from collections.abc import AsyncGenerator, AsyncIterator -from datetime import timedelta +from collections import OrderedDict +from collections.abc import AsyncGenerator, Mapping +from dataclasses import dataclass +from datetime import datetime, timedelta, timezone from typing import Any, TypeVar import nexusrpc import nexusrpc.handler +from google.protobuf.message import DecodeError import temporalio.converter from temporalio.api.common.v1 import Payload +from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.common import RawValue from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -61,9 +79,16 @@ ) # The contract leaves these unset, so the handler is the one place that says -# what an omitted read bound means. +# what an omitted read bound means. The wait is long because the handler +# shortens it to the request deadline anyway, and a shorter default only +# means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 5000 +_DEFAULT_WAIT_MS = 30_000 +_DEADLINE_MARGIN = timedelta(milliseconds=500) +_DEFAULT_MAX_PRODUCERS = 10_000 +_DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) +_QUEUE_DEPTH = 1000 +_APPEND_TIMEOUT_MS = 30_000 _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -81,6 +106,34 @@ _OutputT = TypeVar("_OutputT") +logger = logging.getLogger(__name__) + + +def _bad_request(message: str) -> nexusrpc.HandlerError: + return nexusrpc.HandlerError( + message, + type=nexusrpc.HandlerErrorType.BAD_REQUEST, + retryable_override=False, + ) + + +@dataclass +class _Subscription: + """One parked read on the store, shared by consecutive calls.""" + + records: asyncio.Queue[StreamRecord[Any]] + position: str + last_used: float + pump: asyncio.Task[None] | None = None + failure: BaseException | None = None + done: bool = False + + +@dataclass +class _ProducerState: + delegate: Any + batch_index: int + @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: @@ -91,17 +144,45 @@ class TemporalStreamsHandler: run handlers for a new store next to handlers for the old one. """ - def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: - """Serve the endpoint out of the provider named by ``provider``.""" + def __init__( + self, + client: Any, + provider: str, + *, + max_producers: int = _DEFAULT_MAX_PRODUCERS, + subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, + **provider_options: Any, + ) -> None: + """Serve the endpoint out of the provider named by ``provider``. + + ``max_producers`` bounds the dedupe state kept per producer attempt; + the oldest is evicted, and a producer evicted mid-life gets a clear + refusal on its next batch rather than a silent drop. + ``subscription_idle`` is how long a parked read outlives its last + caller. + """ self._client = client self._delegate = _provider.instance(provider, **provider_options) - self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + OrderedDict() + ) + self._max_producers = max_producers + self._subscriptions: dict[tuple[str, str, str], _Subscription] = {} + self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} + self._subscription_idle = subscription_idle.total_seconds() @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch.""" + """Append on the caller's account, dropping a repeated batch. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips + ahead, when it continues a producer attempt this handler has + no state for, or when a payload is not a serialized + ``Payload``. + """ topic = input.topic or "" key = ( input.workflow_id, @@ -109,10 +190,18 @@ async def append( input.producer_id, input.attempt, ) - cached = self._producers.get(key) - if cached is not None and input.batch_index <= cached[1]: - return AppendOutput() - if cached is None: + state = self._producers.get(key) + if state is None: + if input.batch_index != 1: + # A fresh delegate would restart its numbering at zero, and + # the store would drop that as a repeat of the first batch. + # Refusing here turns a silent loss into a failure the caller + # can act on by opening a new attempt. + raise _bad_request( + f"producer {input.producer_id!r} attempt {input.attempt} resumed " + f"at batch {input.batch_index} on a handler that has no state for " + "it; open a new attempt" + ) delegate = await self._delegate.producer( self._client, workflow_id=input.workflow_id, @@ -121,117 +210,304 @@ async def append( producer_id=input.producer_id, attempt=input.attempt, ) - else: - delegate = cached[0] - self._producers[key] = (delegate, input.batch_index) - cursor = "" - if input.payloads: - payloads = [] - for encoded in input.payloads: - payload = Payload() - payload.ParseFromString(base64.b64decode(encoded)) - payloads.append(payload) - cursor = (await delegate.append(*payloads)).token + state = _ProducerState(delegate, 0) + elif input.batch_index <= state.batch_index: + # A repeat, or a producer that restarted its numbering: either + # way the store already holds the batch. + self._producers.move_to_end(key) + return AppendOutput() + elif input.batch_index != state.batch_index + 1: + raise _bad_request( + f"batch {input.batch_index} skips ahead of {state.batch_index} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) + payloads = self._payloads(input.payloads) + cursor: str | None = None + if payloads: + appended = await state.delegate.append(*payloads) + cursor = appended.token if appended is not None else None if input.finish: - await delegate.finish() + await state.delegate.finish() + self._producers.pop(key, None) + return AppendOutput(cursor=cursor) + # Recorded only once the store accepted the batch, so a failed append + # is not mistaken for a repeat when the caller retries it. + state.batch_index = input.batch_index + self._producers[key] = state + self._producers.move_to_end(key) + while len(self._producers) > self._max_producers: + self._producers.popitem(last=False) return AppendOutput(cursor=cursor) + @staticmethod + def _payloads(encoded: list[bytes] | None) -> list[Payload]: + payloads = [] + for index, raw in enumerate(encoded or []): + payload = Payload() + try: + payload.ParseFromString(raw) + except DecodeError as error: + raise _bad_request( + f"payloads[{index}] is not a serialized Temporal Payload: {error}" + ) from error + payloads.append(payload) + return payloads + @nexusrpc.handler.sync_operation async def read( - self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream or "" - ) + stream = input.stream or "" topic = input.topic or None if input.latest_only: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=stream + ) return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms - converter = temporalio.converter.DataConverter.default.payload_converter - records: list[RecordWire] = [] - next_token = input.after_token or "" - subscription = delegate.read( - after=Cursor(input.after_token) if input.after_token else BEGINNING, - topic=topic, - ) - - async def collect() -> None: - nonlocal next_token - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + if ctx.request_deadline is not None: + # The server answers the caller with a timeout at the deadline + # whatever this call does, so collecting past it only holds the + # slot for an answer nobody receives. + deadline = ctx.request_deadline + if deadline.tzinfo is None: + deadline = deadline.replace(tzinfo=timezone.utc) + left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN + wait = max(0.0, min(wait, left.total_seconds())) + after = input.after_token or "" + key = (input.workflow_id, stream, topic or "") + await self._expire_subscriptions() + lock = self._read_locks.setdefault(key, asyncio.Lock()) + async with lock: + subscription = self._subscriptions.get(key) + if subscription is None or subscription.position != after: + if subscription is not None: + await self._drop(key) + subscription = await self._subscribe( + key, input.workflow_id, stream, topic, after ) - next_token = record.cursor.token - if len(records) >= max_records: - return + records, next_token = await self._drain(subscription, max_records, wait) + subscription.position = next_token + subscription.last_used = time.monotonic() + if subscription.done and subscription.records.empty(): + # The store ended the read, as the Workflow Streams delegate + # does when the run closes. Nothing more will arrive on it. + await self._drop(key) + return ReadOutput(records=records, next_token=next_token) + + async def _subscribe( + self, + key: tuple[str, str, str], + workflow_id: str, + stream: str, + topic: str | None, + after: str, + ) -> _Subscription: + delegate = await self._delegate.consumer( + self._client, workflow_id=workflow_id, stream=stream + ) + # Raw payloads: the handler frames what the store holds without + # decoding it, so an encoding only the caller's codec understands + # passes through untouched. + source = delegate.read( + after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + ) + subscription = _Subscription( + records=asyncio.Queue(maxsize=_QUEUE_DEPTH), + position=after, + last_used=time.monotonic(), + ) + async def pump() -> None: + try: + async for record in source: + if record.kind is RecordKind.SUPERSEDED: + continue + await subscription.records.put(record) + except asyncio.CancelledError: + raise + except Exception as error: + subscription.failure = error + finally: + subscription.done = True + if isinstance(source, AsyncGenerator): + await source.aclose() + + subscription.pump = asyncio.create_task(pump()) + self._subscriptions[key] = subscription + return subscription + + async def _drain( + self, subscription: _Subscription, max_records: int, wait: float + ) -> tuple[list[RecordWire], str]: + records: list[RecordWire] = [] + next_token = subscription.position + queue = subscription.records + deadline = time.monotonic() + wait + while len(records) < max_records: + if queue.empty(): + remaining = deadline - time.monotonic() + if records or remaining <= 0: + break + if subscription.done: + # Honour the wait even though nothing can arrive, so a + # caller polling a closed stream does not spin on the + # endpoint. + await asyncio.sleep(remaining) + break + try: + record = await asyncio.wait_for(queue.get(), remaining) + except asyncio.TimeoutError: + break + else: + record = queue.get_nowait() + records.append(self._wire(record)) + next_token = record.cursor.token + if not records and subscription.failure is not None: + failure, subscription.failure = subscription.failure, None + raise failure + return records, next_token + + @staticmethod + def _wire(record: StreamRecord[Any]) -> RecordWire: + body = ( + record.value.payload.SerializeToString() + if isinstance(record.value, RawValue) + else b"" + ) + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + return RecordWire(token=record.cursor.token, frame=frame) + + async def close(self) -> None: + """Release every parked read. + + Call it when the worker hosting this handler stops, so subscriptions + waiting on the store do not outlive it. + """ + for key in list(self._subscriptions): + await self._drop(key) + self._read_locks.clear() + + async def _drop(self, key: tuple[str, str, str]) -> None: + subscription = self._subscriptions.pop(key, None) + if subscription is None or subscription.pump is None: + return + subscription.pump.cancel() try: - # `wait_for` rather than `asyncio.timeout`, which 3.10 does not - # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), wait_ms / 1000) - except asyncio.TimeoutError: + await subscription.pump + except (asyncio.CancelledError, Exception): pass - finally: - # The delegate's read parks against its store, and this call - # answers before the caller asks again, so let it go now rather - # than when the collector is next swept. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - return ReadOutput(records=records, next_token=next_token) + async def _expire_subscriptions(self) -> None: + cutoff = time.monotonic() - self._subscription_idle + for key in [k for k, s in self._subscriptions.items() if s.last_used < cutoff]: + lock = self._read_locks.get(key) + if lock is not None and lock.locked(): + continue + await self._drop(key) + self._read_locks.pop(key, None) + + +class StreamEndpointError(RuntimeError): + """The stream endpoint refused a call or could not be reached. -def _post(url: str, body: bytes) -> bytes: + ``status`` is the HTTP status when the endpoint answered, and ``None`` + when the connection itself failed. + """ + + def __init__(self, message: str, *, status: int | None = None) -> None: + """Carry the endpoint's answer, or the reason it gave none.""" + super().__init__(message) + self.status = status + + +def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: request = urllib.request.Request( url, data=body, - headers={"Content-Type": "application/json"}, + headers={ + "Content-Type": "application/json", + # Tells the server how long the handler may park, so it does not + # time the call out ahead of a wait the caller asked for. + "Request-Timeout": f"{timeout_ms}ms", + **headers, + }, method="POST", ) try: - with urllib.request.urlopen(request, timeout=30) as response: + with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") - raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + raise StreamEndpointError( + f"stream endpoint call failed ({error.code}): {detail}", status=error.code + ) from error + except urllib.error.URLError as error: + raise StreamEndpointError( + f"stream endpoint unreachable at {url}: {error.reason}" + ) from error + +class _Front: + """Everything the caller half needs to reach one endpoint.""" -async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: - # The contract types carry their own JSON encoding, so the raw caller and - # the worker serving the operation agree on the body without either of - # them spelling the fields out. - contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) - payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") - return contract.from_payloads([payload], [output])[0] + def __init__( + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + headers: Mapping[str, str], + wait_ms: int, + max_records: int, + ) -> None: + self.base_url = base_url + self.converter = data_converter.payload_converter + self.codec = data_converter.payload_codec + self.headers = dict(headers) + self.wait_ms = wait_ms + self.max_records = max_records + + async def invoke( + self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + ) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller + # and the worker serving the operation agree on the body without + # either of them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread( + _post, + f"{self.base_url}/{operation}", + contract.to_payloads([request])[0].data, + self.headers, + timeout_ms, + ) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it.""" + """Appends through the stream endpoint; framing happens behind it. + + Calls are serialized and the batch index is committed only once the + endpoint answered. A batch whose call raised stays pending and is sent + again under the same index, either when the caller retries the same + values or ahead of whatever the caller sends next, so an ambiguous + failure writes the batch once and loses nothing. + """ def __init__( self, - base_url: str, - data_converter: temporalio.converter.DataConverter, + front: _Front, workflow_id: str, stream: str, topic: str, @@ -239,78 +515,92 @@ def __init__( attempt: int, ) -> None: """Bind this producer to one stream or topic on the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None + self._lock = asyncio.Lock() @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the endpoint.""" + if not values: + return None payloads = [ value if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + else self._front.converter.to_payloads([value])[0] for value in values ] - if self._codec is not None: - # The endpoint is the edge of this process, so a configured codec - # runs here rather than at the handler: whoever hosts the endpoint - # never holds the plaintext. - payloads = await self._codec.encode(payloads) - encoded = [ - base64.b64encode(payload.SerializeToString()).decode() - for payload in payloads - ] - return Cursor((await self._call(payloads=encoded)).cursor or "") + answer = await self._call(payloads, finish=False) + return Cursor(answer.cursor) if answer.cursor else None async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" - await self._call(finish=True) + await self._call([], finish=True) + + async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: + # Identity is taken before the codec runs: a codec may encrypt with a + # fresh nonce each time, and the retry has to be recognised anyway. + identity = tuple(payload.SerializeToString() for payload in payloads) + if self._front.codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._front.codec.encode(payloads) + encoded = [payload.SerializeToString() for payload in payloads] + async with self._lock: + if self._pending is not None and self._pending[1:] != (identity, finish): + # The caller moved on from a batch the endpoint may or may + # not have applied. It goes first under its own index, so the + # handler drops it if it landed and writes it if not, and the + # new batch takes the index after it. + await self._send(*self._pending) + elif self._pending is not None: + return await self._send(*self._pending) + request = self._request(self._batch_index + 1, encoded, finish) + return await self._send(request, identity, finish) + + def _request( + self, batch_index: int, payloads: list[bytes], finish: bool + ) -> AppendInput: + return AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=batch_index, + topic=self._topic, + payloads=payloads, + finish=finish, + ) - async def _call( - self, payloads: list[str] | None = None, finish: bool = False + async def _send( + self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: - self._batch_index += 1 - return await _invoke( - f"{self._base_url}/{_APPEND_OPERATION}", - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ), - AppendOutput, + self._pending = (request, identity, finish) + answer = await self._front.invoke( + _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS ) + self._batch_index = request.batch_index + self._pending = None + return answer class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - workflow_id: str, - stream: str, - ) -> None: + def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream @@ -320,31 +610,37 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, one endpoint batch at a time.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() token = after.token while True: - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, topic=topic or "", after_token=token, + max_records=self._front.max_records, + wait_ms=self._front.wait_ms, ), ReadOutput, + timeout_ms=self._front.wait_ms + 5000, ) for wire in answer.records or []: + cursor = Cursor(wire.token) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire.frame) + wire.frame ) - except ValueError: + except ValueError as error: + # Same answer as every other reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -364,8 +660,8 @@ async def read( async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, @@ -373,6 +669,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: latest_only=True, ), ReadOutput, + timeout_ms=_APPEND_TIMEOUT_MS, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING @@ -380,34 +677,58 @@ async def latest(self, *, topic: str | None = None) -> Cursor: async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - if self._codec is not None: - payload = (await self._codec.decode([payload]))[0] + if self._front.codec is not None: + payload = (await self._front.codec.decode([payload]))[0] if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + return self._front.converter.from_payloads([payload])[0] + return self._front.converter.from_payloads([payload], [as_type])[0] class _NexusProvider: name = "nexus" def __init__(self) -> None: - self._base_url: str | None = None + self._endpoint: str | None = None + self._endpoint_id: str | None = None + self._http_address = "http://127.0.0.1:7243" + self._service = _SERVICE_NAME self._data_converter: temporalio.converter.DataConverter | None = None + self._client: Any = None + self._headers: dict[str, str] = {} + self._wait_ms = _DEFAULT_WAIT_MS + self._max_records = _DEFAULT_MAX_RECORDS def configure(self, **options: Any) -> None: + """Point the caller half at one endpoint. + + ``endpoint`` is the endpoint's name when ``client`` is given, and is + resolved to its id through the operator service on first use; without + a client it has to be the id, because the HTTP ingress dispatches by + id. ``headers`` go on every request, which is where an authorization + header belongs. ``wait_ms`` and ``max_records`` are the read bounds + the caller asks the handler for. + """ endpoint = options.pop("endpoint", None) - http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", _SERVICE_NAME) - data_converter = options.pop("data_converter", None) + self._http_address = options.pop("http_address", self._http_address) + self._service = options.pop("service", _SERVICE_NAME) + self._data_converter = options.pop("data_converter", None) + self._client = options.pop("client", None) + self._headers = dict(options.pop("headers", None) or {}) + self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) + self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) if options: raise TypeError( - "the nexus provider takes endpoint, http_address, service and " - f"data_converter, got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service, " + f"data_converter, client, headers, wait_ms and max_records, got " + f"{sorted(options)}" ) if not endpoint: - raise TypeError("the nexus provider needs endpoint=") - self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - self._data_converter = data_converter + raise TypeError( + "the nexus provider needs endpoint= together with " + "client=, or endpoint= on its own" + ) + self._endpoint = endpoint + self._endpoint_id = None def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -426,10 +747,31 @@ def open_write(self, topic: str) -> WriteSink: del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) - def _url(self) -> str: - if self._base_url is None: + async def _front(self, client: Any) -> _Front: + if self._endpoint is None: raise RuntimeError("configure the nexus provider before opening handles") - return self._base_url + if self._endpoint_id is None: + resolver = self._client if self._client is not None else client + if resolver is None: + self._endpoint_id = self._endpoint + else: + found = await resolver.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") + self._endpoint_id = found.endpoints[0].id + base_url = ( + f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" + f"/services/{self._service}" + ) + return _Front( + base_url, + self._converter(client), + self._headers, + self._wait_ms, + self._max_records, + ) async def producer( self, @@ -441,25 +783,14 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> NexusProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return NexusProducer( - self._url(), - self._converter(client), - workflow_id, - stream, - topic, - producer_id, - attempt, + await self._front(client), workflow_id, stream, topic, producer_id, attempt ) async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + return NexusConsumer(await self._front(client), workflow_id, stream) def _converter(self, client: Any) -> temporalio.converter.DataConverter: if self._data_converter is not None: From 8a07c38e17bcc1b1af7f24077520bdcd2944d2f6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 380/831] Covered the Nexus front's refusals, retries, subscription reuse and deadline clamp. --- tests/streams/test_nexus_provider.py | 334 ++++++++++++++++++++++----- 1 file changed, 274 insertions(+), 60 deletions(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 18679ad5f..77cec6f4e 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -11,8 +11,8 @@ and an endpoint named ``streams-e2e`` targeting task queue ``streams-handlers-e2e``. -The codec test stands the endpoint up in this process instead, because what -it checks is the bytes the caller puts on the wire. +Everything else stands the endpoint up in this process, because what it +checks is the bytes the caller puts on the wire and the handler's own rules. """ from __future__ import annotations @@ -22,11 +22,13 @@ import dataclasses import json import os -import subprocess import uuid -from collections.abc import Sequence -from typing import Any, cast +from collections.abc import Mapping, Sequence +from datetime import datetime, timedelta, timezone +from typing import Any +import nexusrpc +import nexusrpc.handler import pytest import temporalio.converter @@ -38,7 +40,10 @@ from temporalio.streams._provider import instance from temporalio.streams.providers import memory, nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.streams.providers.nexus import ( + StreamEndpointError, + TemporalStreamsHandler, +) from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take @@ -50,51 +55,27 @@ ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] - - -def _endpoint_id() -> str: - # The HTTP ingress dispatches by endpoint id, not name. - out = subprocess.run( - [ - "temporal", - "operator", - "nexus", - "endpoint", - "get", - "--name", - ENDPOINT, - "-o", - "json", - "--address", - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), - ], - capture_output=True, - text=True, - check=True, - ) - return json.loads(out.stdout)["id"] +READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] @live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage - # provider; only the caller goes through the front. + # provider; only the caller goes through the front, and it names the + # endpoint the way an operator does, by name. streams.configure(provider="workflow_streams") client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", - endpoint=_endpoint_id(), + endpoint=ENDPOINT, + client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + wait_ms=5000, ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + handler = TemporalStreamsHandler(client, provider="workflow_streams") - async with Worker( - client, - task_queue=HANDLER_TQ, - nexus_service_handlers=[ - TemporalStreamsHandler(client, provider="workflow_streams") - ], - ): + async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", @@ -135,10 +116,11 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + await handler.close() class ScrambleCodec(temporalio.converter.PayloadCodec): - """Flips every byte of a payload, so the middle holds nothing readable.""" + """Flips every byte and labels the result with an encoding only it can read.""" KEY = 0x5A @@ -146,7 +128,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: """Wrap each payload as opaque bytes nothing downstream can read.""" return [ Payload( - metadata={"encoding": b"binary/plain"}, + metadata={"encoding": b"binary/scrambled"}, data=self._flip(payload.SerializeToString()), ) for payload in payloads @@ -166,45 +148,98 @@ def _flip(cls, data: bytes) -> bytes: return bytes(byte ^ cls.KEY for byte in data) +class _NeverCancelled(nexusrpc.handler.OperationTaskCancellation): + def is_cancelled(self) -> bool: + return False + + def cancellation_reason(self) -> str | None: + return None + + def wait_until_cancelled_sync(self, timeout: float | None = None) -> bool: + del timeout + return False + + async def wait_until_cancelled(self) -> None: + await asyncio.Event().wait() + + +def _context( + operation: str, deadline: datetime | None = None +) -> nexusrpc.handler.StartOperationContext: + return nexusrpc.handler.StartOperationContext( + service=nexus._SERVICE_NAME, # pyright: ignore[reportPrivateUsage] + operation=operation, + headers={}, + task_cancellation=_NeverCancelled(), + request_deadline=deadline, + request_id=uuid.uuid4().hex, + ) + + async def _dispatch( handler: TemporalStreamsHandler, operation: str, request: Any ) -> Any: - context = cast("Any", None) # neither operation looks at it if operation == APPEND_OPERATION: - return await handler.append(context, request) - return await handler.read(context, request) + return await handler.append(_context(operation), request) + return await handler.read(_context(operation), request) def _in_process_endpoint( handler: TemporalStreamsHandler, posted: list[bytes], answered: list[bytes], + *, + fail_after_applying: list[str] | None = None, ) -> Any: - """Serve the caller's posts from ``handler``, recording both directions.""" + """Serve the caller's posts from ``handler``, recording both directions. + + ``fail_after_applying`` names operations whose first call is applied and + then reported as a transport failure, the ambiguous case a retry has to + survive. + """ contract = temporalio.converter.DataConverter.default.payload_converter loop = asyncio.get_running_loop() + failing = set(fail_after_applying or []) - def post(url: str, body: bytes) -> bytes: + def post( + url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + ) -> bytes: + del headers, timeout_ms posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput request: Any = contract.from_payloads( [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] )[0] - if request_type is ReadInput: - # This endpoint has no other traffic to wait for, so park briefly - # rather than for the contract's default. - request.wait_ms = 200 - answer = asyncio.run_coroutine_threadsafe( - _dispatch(handler, operation, request), loop - ).result() + try: + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + except nexusrpc.HandlerError as error: + raise StreamEndpointError(str(error), status=400) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) + if operation in failing: + failing.discard(operation) + raise StreamEndpointError("connection reset after the handler answered") return raw return post +def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: + return instance( + "nexus", + endpoint="in-process", + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + wait_ms=200, + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + + async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, @@ -215,13 +250,7 @@ async def _loop_through_an_endpoint( answered: list[bytes] = [] handler = TemporalStreamsHandler(None, provider="memory") monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = instance( - "nexus", - endpoint="in-process", - data_converter=dataclasses.replace( - temporalio.converter.DataConverter.default, payload_codec=codec - ), - ) + front = _front(codec) workflow_id = "wf-codec" producer = await front.producer( @@ -263,7 +292,9 @@ async def test_the_caller_encodes_records_with_the_configured_codec( monkeypatch, ScrambleCodec() ) - # The value survives the hop, so the codec is applied on both sides. + # The value survives the hop although the handler cannot read the + # encoding, so the body passed through it untouched and the codec ran on + # the caller alone. assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] assert records[0].value == {"secret": "tuna"} # Neither direction carried the plaintext. @@ -281,3 +312,186 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( assert records[0].value == {"secret": "tuna"} assert b"tuna" in _appended_bytes(posted) assert b"tuna" in _answered_bodies(answered) + + +def _append( + workflow_id: str, batch_index: int, *values: Any, finish: bool = False +) -> AppendInput: + converter = temporalio.converter.DataConverter.default.payload_converter + return AppendInput( + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + batch_index=batch_index, + payloads=[ + converter.to_payloads([value])[0].SerializeToString() for value in values + ], + finish=finish, + ) + + +async def _stored(workflow_id: str) -> list[Any]: + consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") + out: list[Any] = [] + async for record in consumer.read(type=dict): + if record.kind is RecordKind.DATA: + out.append(record.value) + if await consumer.latest() == record.cursor: + break + return out + + +@pytest.fixture +def _memory_store(): # pyright: ignore[reportUnusedFunction] + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): + # A second handler instance stands in for a restarted or load-balanced + # handler worker: it shares the store but not the dedupe state. + first = TemporalStreamsHandler(None, provider="memory") + second = TemporalStreamsHandler(None, provider="memory") + await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert failed.value.retryable_override is False + # The store holds the first batch and nothing was silently lost or doubled. + assert await _stored("wf") == [{"n": 1}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_handler_drops_repeats_and_rejects_gaps(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # An exact repeat is dropped with a success answer and no position. + repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert repeat.cursor is None + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_malformed_payload_is_the_callers_fault(): + handler = TemporalStreamsHandler(None, provider="memory") + request = _append("wf", 1) + request.payloads = [b"\xff\xfe not a payload"] + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, request) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + await producer.finish() + indexes = [json.loads(body)["batch_index"] for body in posted] + # The retry re-sent index 1, which the handler dropped as a repeat, so + # the store holds each record once. + assert indexes == [1, 1, 2, 3] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_failed_append_goes_out_before_the_next_one( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + # The caller moves on without retrying; the pending batch is replayed + # first under its own index and the new one takes the next. + await producer.append({"n": 2}) + indexes = [json.loads(body)["batch_index"] for body in posted] + assert indexes == [1, 1, 2] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_consecutive_reads_share_one_parked_subscription(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) + first = await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ) + assert len(first.records) == 1 + parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] + pump = next(iter(parked.values())).pump + # A call that resumes where the last one stopped drains the same + # subscription instead of parking a second read on the store. + second = await _dispatch( + handler, + READ_OPERATION, + ReadInput( + workflow_id="wf", + stream="inputs", + after_token=first.next_token, + max_records=1, + wait_ms=200, + ), + ) + assert len(second.records) == 1 + assert second.next_token != first.next_token + assert len(parked) == 1 and next(iter(parked.values())).pump is pump + # A call from somewhere else replaces it. + await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ) + assert len(parked) == 1 and next(iter(parked.values())).pump is not pump + await handler.close() + assert not parked + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_read_wait_is_cut_to_the_request_deadline(): + handler = TemporalStreamsHandler(None, provider="memory") + started = asyncio.get_running_loop().time() + answer = await handler.read( + _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), + ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ) + assert answer.records == [] and answer.next_token == "" + assert asyncio.get_running_loop().time() - started < 5 + await handler.close() From e23d1795d06ee84d297120892719309c5fd74f5a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 381/831] Carried the StreamRecord proto and producer identity on the stream contract. A record crosses the endpoint as the serialized proto every store keeps, an append names its topic, run and sequence, and a read says when the store ended it. --- .../providers/_nexus_generated/models.py | 245 +++++++++++------- .../providers/_nexus_generated/services.py | 17 +- .../providers/temporal_streams.nexusrpc.yaml | 96 ++++--- 3 files changed, 224 insertions(+), 134 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index d00cbcc63..2677843ef 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -22,10 +22,10 @@ _APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) -_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token", "done"}) -_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "record"}) class _AppendInputTransferTypeConverter( @@ -54,15 +54,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str = typing.cast("typing.Any", None) - if "stream" not in raw or raw["stream"] is None: - violations.append(Violation(path="stream", reason="required")) + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: + violations.append( + Violation(path="run_id", reason="explicit null not allowed") + ) + else: + if not isinstance(run_id_value_raw, str): + violations.append( + Violation(path="run_id", reason="expected string") + ) + else: + run_id_value = run_id_value_raw + + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) else: - stream_value_raw = raw["stream"] - if not isinstance(stream_value_raw, str): - violations.append(Violation(path="stream", reason="expected string")) + topic_value_raw = raw["topic"] + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - stream_value = stream_value_raw + topic_value = topic_value_raw producer_id_value: str = typing.cast("typing.Any", None) if "producer_id" not in raw or raw["producer_id"] is None: @@ -87,6 +102,24 @@ def from_transfer_type( if attempt_value_parsed is not None: attempt_value = attempt_value_parsed + sequence_value: int = typing.cast("typing.Any", None) + if "sequence" not in raw or raw["sequence"] is None: + violations.append(Violation(path="sequence", reason="required")) + else: + sequence_value_raw = raw["sequence"] + sequence_value_parsed = _parse_spec_integer( + sequence_value_raw, "sequence", violations + ) + if sequence_value_parsed is not None: + sequence_value = sequence_value_parsed + if sequence_value < 0: + violations.append( + Violation( + path="sequence", + reason=f"must be >= 0, got {sequence_value}", + ) + ) + batch_index_value: int = typing.cast("typing.Any", None) if "batch_index" not in raw or raw["batch_index"] is None: violations.append(Violation(path="batch_index", reason="required")) @@ -105,19 +138,6 @@ def from_transfer_type( ) ) - topic_value: str | None = None - if "topic" in raw: - topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) - else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw - payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] @@ -175,11 +195,12 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" + and key != "topic" and key != "producer_id" and key != "attempt" + and key != "sequence" and key != "batch_index" - and key != "topic" and key != "payloads" and key != "finish" ): @@ -188,11 +209,12 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return AppendInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, + topic=topic_value, producer_id=producer_id_value, attempt=attempt_value, + sequence=sequence_value, batch_index=batch_index_value, - topic=topic_value, payloads=payloads_value, finish=finish_value, ) @@ -202,13 +224,24 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - out["stream"] = value.stream + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic out["producer_id"] = value.producer_id if abs(value.attempt) > 9007199254740991: violations.append( Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") ) out["attempt"] = value.attempt + if abs(value.sequence) > 9007199254740991: + violations.append( + Violation(path="sequence", reason="exceeds ±(2^53-1) integer cap") + ) + if value.sequence < 0: + violations.append( + Violation(path="sequence", reason=f"must be >= 0, got {value.sequence}") + ) + out["sequence"] = value.sequence if abs(value.batch_index) > 9007199254740991: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") @@ -220,8 +253,6 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: ) ) out["batch_index"] = value.batch_index - if value.topic is not None: - out["topic"] = value.topic if value.payloads is not None: out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: @@ -239,31 +270,45 @@ class AppendInput: workflow_id: str """The workflow whose stream is being written.""" - stream: str - """The named stream to append to. Empty when the producer writes to a topic instead.""" + run_id: str | None = None + """The run to address. Empty addresses the workflow's execution chain, which is what a + producer normally wants. + """ + + topic: str + """The topic of the workflow's stream to append to.""" producer_id: str - """Identifies the writer across its retries, so its attempts can be ordered.""" + """Identifies the writer across its retries, so its attempts can be ordered. Never + empty here: the caller resolved it, from the activity context when it was not given. + """ attempt: int """The generation this producer is writing. A later attempt supersedes an earlier one.""" - batch_index: int - """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt, and rejects one that skips ahead or that resumes - an attempt it never saw start. + sequence: int + """The producer's sequence of the first record in this batch; the batch is numbered + from it and a finish takes the next number. It has to continue where the previous + batch ended, so the handler and the store agree on every record's position within + the attempt. """ - topic: str | None = None - """The topic to append to, when stream is empty.""" + batch_index: int + """Counts this producer's batches from 1. The handler answers a repeat of the last + index with the original's position, and refuses one that skips ahead, one already + behind the last, or one that resumes an attempt it never saw start. + """ payloads: list[bytes] | None = None - """The records to write, each a serialized Temporal Payload. Empty on a call that only - finishes. + """The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the caller has already + run on them. Empty on a call that only finishes. """ finish: bool | None = None - """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + """Write FINISH for this producer after the batch: it will write nothing more on the + topic. Says nothing about the producer's outcome. + """ class _AppendOutputTransferTypeConverter( @@ -333,9 +378,9 @@ class AppendOutput: """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Absent when the call - carried no payloads, when the batch was a repeat the handler dropped, or when the - store learns positions only at read time. + """Opaque token naming the last record written by this call, or by the original when + the call repeated the last batch. Absent when the store learns positions only at + read time; such a caller positions itself with a latest_only read. """ additional_properties: dict[str, typing.Any] = dataclasses.field( @@ -369,33 +414,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str | None = None - if "stream" in raw: - stream_value_raw = raw["stream"] - if stream_value_raw is None: + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: violations.append( - Violation(path="stream", reason="explicit null not allowed") + Violation(path="run_id", reason="explicit null not allowed") ) else: - if not isinstance(stream_value_raw, str): + if not isinstance(run_id_value_raw, str): violations.append( - Violation(path="stream", reason="expected string") + Violation(path="run_id", reason="expected string") ) else: - stream_value = stream_value_raw + run_id_value = run_id_value_raw - topic_value: str | None = None - if "topic" in raw: + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) + else: topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw + topic_value = topic_value_raw after_token_value: str | None = None if "after_token" in raw: @@ -486,7 +528,7 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" and key != "topic" and key != "after_token" and key != "max_records" @@ -498,7 +540,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return ReadInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, topic=topic_value, after_token=after_token_value, max_records=max_records_value, @@ -511,10 +553,9 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - if value.stream is not None: - out["stream"] = value.stream - if value.topic is not None: - out["topic"] = value.topic + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic if value.after_token is not None: out["after_token"] = value.after_token if value.max_records is not None: @@ -572,19 +613,19 @@ class ReadInput: workflow_id: str """The workflow whose stream is being read.""" - stream: str | None = None - """The named stream to read. Empty reads every stream the workflow publishes.""" - - topic: str | None = None - """Yield only records on this topic. Empty yields every topic. Only meaningful when - stream is empty, because an inbound stream has no topics. + run_id: str | None = None + """Pin the read to this run. Empty follows the workflow's execution chain across + continue-as-new. """ + topic: str + """The topic of the workflow's stream to read.""" + after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a - caller cannot tell which one that is. + caller cannot tell which one that is, and a token from another store is refused. """ max_records: int | None = None @@ -663,6 +704,19 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + done_value: bool | None = None + if "done" in raw: + done_value_raw = raw["done"] + if done_value_raw is None: + violations.append( + Violation(path="done", reason="explicit null not allowed") + ) + else: + if not isinstance(done_value_raw, bool): + violations.append(Violation(path="done", reason="expected boolean")) + else: + done_value = done_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: if key not in _READ_OUTPUT_DECLARED: @@ -672,6 +726,7 @@ def from_transfer_type( return ReadOutput( records=records_value, next_token=next_token_value, + done=done_value, additional_properties=additional_properties, ) @@ -693,6 +748,8 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + if value.done is not None: + out["done"] = value.done for key, entry in value.additional_properties.items(): if key in _READ_OUTPUT_DECLARED: violations.append( @@ -721,6 +778,12 @@ class ReadOutput: token when the call collected nothing. """ + done: bool | None = None + """The store ended the read: the owning execution, or its chain, is closed and every + retained record after the caller's token has been delivered. Nothing more will + arrive, so the caller stops. + """ + additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict ) @@ -750,17 +813,19 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: bytes = typing.cast("typing.Any", None) - if "frame" not in raw or raw["frame"] is None: - violations.append(Violation(path="frame", reason="required")) + record_value: bytes = typing.cast("typing.Any", None) + if "record" not in raw or raw["record"] is None: + violations.append(Violation(path="record", reason="required")) else: - frame_value_raw = raw["frame"] - if not isinstance(frame_value_raw, str): - violations.append(Violation(path="frame", reason="expected string")) + record_value_raw = raw["record"] + if not isinstance(record_value_raw, str): + violations.append(Violation(path="record", reason="expected string")) else: - frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) - if frame_value_parsed is not None: - frame_value = frame_value_parsed + record_value_parsed = _parse_base64( + record_value_raw, "record", violations + ) + if record_value_parsed is not None: + record_value = record_value_parsed additional_properties: dict[str, typing.Any] = {} for key in raw: @@ -770,7 +835,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, - frame=frame_value, + record=record_value, additional_properties=additional_properties, ) @@ -779,7 +844,7 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = _format_base64(value.frame) + out["record"] = _format_base64(value.record) for key, entry in value.additional_properties.items(): if key in _RECORD_WIRE_DECLARED: violations.append( @@ -798,13 +863,15 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its frame.""" + """One record on the wire: its cursor and the record itself.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: bytes - """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + record: bytes + """The serialized temporal.api.stream.v1.StreamRecord: topic, kind, producer_id, + attempt, sequence and body, as the store holds it. + """ additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index e0673aeab..591e31046 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -17,18 +17,20 @@ class TemporalStreams: """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation - per record costs too much for token streams. + per record costs too much for token streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so a caller + in any language decodes it with the api protos alone. """ append: Operation[ AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. The handler drops a batch_index it has - already written for this producer attempt, so a retried call writes once, and - rejects an index that skips ahead or a producer attempt it has no state for. - Supersession records are not transported: a reader re-synthesizes them from the - attempts it observes. + """Append one batch on the caller's account. The handler writes a batch once: a repeat + of the last batch_index answers with where the original landed, and an index that + skips ahead, one already behind the last, a sequence that does not continue, or a + producer attempt the handler has no state for is refused. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. """ read: Operation[ @@ -37,5 +39,6 @@ class TemporalStreams: ] = Operation(name="read") """Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns - whatever it collected. + whatever it collected. It says when the store has ended the read, so the caller can + stop. """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index a1cc34631..bf97209b3 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -11,15 +11,18 @@ services: hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token - streams. + streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so + a caller in any language decodes it with the api protos alone. operations: append: fqn: append description: >- - Append one batch on the caller's account. The handler drops a - batch_index it has already written for this producer attempt, so a - retried call writes once, and rejects an index that skips ahead or a - producer attempt it has no state for. Supersession records are not + Append one batch on the caller's account. The handler writes a batch + once: a repeat of the last batch_index answers with where the + original landed, and an index that skips ahead, one already behind + the last, a sequence that does not continue, or a producer attempt + the handler has no state for is refused. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes. input: { $ref: "#/$defs/AppendInput" } @@ -29,7 +32,8 @@ services: description: >- Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, - whichever comes first, and returns whatever it collected. + whichever comes first, and returns whatever it collected. It says + when the store has ended the read, so the caller can stop. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -41,49 +45,61 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being written." - stream: + run_id: type: string description: >- - The named stream to append to. Empty when the producer writes to a - topic instead. + The run to address. Empty addresses the workflow's execution chain, + which is what a producer normally wants. + topic: + type: string + description: "The topic of the workflow's stream to append to." producer_id: type: string description: >- Identifies the writer across its retries, so its attempts can be - ordered. + ordered. Never empty here: the caller resolved it, from the activity + context when it was not given. attempt: type: integer description: >- The generation this producer is writing. A later attempt supersedes an earlier one. + sequence: + type: integer + minimum: 0 + description: >- + The producer's sequence of the first record in this batch; the batch + is numbered from it and a finish takes the next number. It has to + continue where the previous batch ended, so the handler and the + store agree on every record's position within the attempt. batch_index: type: integer minimum: 1 description: >- - Counts this producer's batches from 1. The handler drops an index it - has already written for this producer attempt, and rejects one that - skips ahead or that resumes an attempt it never saw start. - topic: - type: string - description: "The topic to append to, when stream is empty." + Counts this producer's batches from 1. The handler answers a repeat + of the last index with the original's position, and refuses one that + skips ahead, one already behind the last, or one that resumes an + attempt it never saw start. payloads: type: array items: type: string contentEncoding: base64 description: >- - The records to write, each a serialized Temporal Payload. Empty on a - call that only finishes. + The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the + caller has already run on them. Empty on a call that only finishes. finish: type: boolean description: >- - Mark this producer done after writing the batch, so a reader stops - waiting on it. + Write FINISH for this producer after the batch: it will write nothing + more on the topic. Says nothing about the producer's outcome. required: - workflow_id - - stream + - topic - producer_id - attempt + - sequence - batch_index additionalProperties: false @@ -94,10 +110,10 @@ $defs: cursor: type: string description: >- - Opaque token naming the last record written by this call. Absent - when the call carried no payloads, when the batch was a repeat the - handler dropped, or when the store learns positions only at read - time. + Opaque token naming the last record written by this call, or by the + original when the call repeated the last batch. Absent when the + store learns positions only at read time; such a caller positions + itself with a latest_only read. additionalProperties: true ReadInput: @@ -107,17 +123,14 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being read." - stream: + run_id: type: string description: >- - The named stream to read. Empty reads every stream the workflow - publishes. + Pin the read to this run. Empty follows the workflow's execution + chain across continue-as-new. topic: type: string - description: >- - Yield only records on this topic. Empty yields every topic. Only - meaningful when stream is empty, because an inbound stream has no - topics. + description: "The topic of the workflow's stream to read." after_token: type: string description: >- @@ -125,7 +138,7 @@ $defs: strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell - which one that is. + which one that is, and a token from another store is refused. max_records: type: integer minimum: 1 @@ -146,26 +159,27 @@ $defs: wants to follow from now. required: - workflow_id + - topic additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its frame." + description: "One record on the wire: its cursor and the record itself." properties: token: type: string description: >- Opaque cursor naming this record. Pass it as after_token to resume just past it. - frame: + record: type: string contentEncoding: base64 description: >- - The record frame, carrying the topic, kind, producer, attempt, - sequence and body. + The serialized temporal.api.stream.v1.StreamRecord: topic, kind, + producer_id, attempt, sequence and body, as the store holds it. required: - token - - frame + - record additionalProperties: true ReadOutput: @@ -182,4 +196,10 @@ $defs: description: >- Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing. + done: + type: boolean + description: >- + The store ended the read: the owning execution, or its chain, is + closed and every retained record after the caller's token has been + delivered. Nothing more will arrive, so the caller stops. additionalProperties: true From 6873b3d5a923d071c7a02ea6b14a8fadb81b4338 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 382/831] Rewrote the Nexus front on the plugin surface. NexusStreams is the outside half only and the handler fronts a storage provider's own handles. Endpoint failures reach the caller as the stream condition the store raised or as an RPCError, never as an HTTP error. --- temporalio/streams/providers/nexus.py | 813 +++++++++++++++----------- 1 file changed, 468 insertions(+), 345 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8c311d1d9..07da0318b 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -1,47 +1,58 @@ """The Nexus front: the outside surface behind one Temporal-authenticated endpoint. -Two halves in one module. The provider half implements only :func:`producer` -and :func:`consumer`; the workflow side raises, naming a storage provider, -because a workflow's publishes and reads ride the Workflow Task and cannot -cross an RPC. The handler half runs in a worker configured with any storage -provider and serves two sync operations, ``append`` and ``read``, so the -store behind the endpoint is invisible to callers and an operator switches -it without touching them. +Two halves in one module. :class:`NexusStreams` is a provider that implements +the outside half only: it hands out handles that append and read through the +endpoint, and it has no workflow half, because a workflow's publishes and +reads ride the Workflow Task and cannot cross an RPC. +:class:`TemporalStreamsHandler` runs in a worker next to any storage provider +and serves two sync operations, ``append`` and ``read``, by fronting that +provider's own handles, so the store behind the endpoint is invisible to +callers and an operator switches it without touching them. The wire types and the service definition come from ``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be -handed the same contract. What stays hand-written here is what the -generator cannot express yet: the handler's dedupe and long-poll collect -loop, and the caller's batching, cursor handling and codec. +handed the same contract. A record crosses as the serialized +``temporal.api.stream.v1.StreamRecord``, the same bytes every store keeps, so +a caller in another language decodes it with the api protos alone. What stays +hand-written here is what the generator cannot express yet: the handler's +dedupe and long-poll collect loop, and the caller's batching, cursor handling +and codec. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Record bodies -cross the handler untouched: it reads the store as raw payloads and frames +cross the handler untouched: it reads the store as raw payloads and forwards them as they are, so a codec that changes the payload encoding survives the hop and the handler's worker never needs the key. Supersession records are -not transported: the caller's reader re-synthesizes them from the attempts -it observes, which is the policy module's job on every provider. Cursors -pass through opaque, so the caller cannot tell which store produced them. - -The handler keeps one parked read per ``(workflow, stream, topic)`` and -serves consecutive calls from it, so an idle caller does not leave one -abandoned long poll on the store per call. A call whose token does not -match the parked position replaces the subscription, and an idle one is -released after a minute; that is the residual cost. - -Two stated prototype limits. Append deduplication lives in handler memory, -by batch index per producer attempt, so a handler that has no state for a -producer attempt refuses to continue it rather than starting a fresh -delegate whose numbering the store would drop as a repeat; the caller opens -a new attempt, which readers report as a supersession. The store-level fix, -a sequence-explicit append in the contract, is listed in the design doc's -work table. And any caller the endpoint admits may touch any workflow's -streams in the namespace; the endpoint's own authorization is the boundary. +not transported: the caller's reader re-synthesizes them from the attempts it +observes, which is the policy module's job on every provider. Cursors pass +through opaque, so the caller cannot tell which store produced them; a +foreign one is refused by the store behind the endpoint and reaches the +caller on the first read. + +The handler keeps one parked read per ``(workflow, run, topic)`` and serves +consecutive calls from it, so an idle caller does not leave one abandoned +long poll on the store per call. A call whose token does not match the parked +position replaces the subscription, and an idle one is released after a +minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, by +batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh delegate +whose numbering the store would drop as a repeat; the caller opens a new +attempt, which readers report as a supersession. And any caller the endpoint +admits may touch any workflow's streams in the namespace; the endpoint's own +authorization is the boundary. + +A failure from the endpoint reaches the caller as the +:class:`temporalio.streams.StreamError` the store raised, when the handler +named one, and as :class:`temporalio.service.RPCError` otherwise, never as an +HTTP or urllib exception. """ from __future__ import annotations import asyncio +import json import logging import time import urllib.error @@ -50,7 +61,7 @@ from collections.abc import AsyncGenerator, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, TypeVar +from typing import Any, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler @@ -59,11 +70,24 @@ import temporalio.converter from temporalio.api.common.v1 import Payload from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.client import Client from temporalio.common import RawValue -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import StreamHandle, StreamProducer, StreamProvider from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + producer_identity, + to_wire, +) from temporalio.streams.providers._nexus_generated import ( AppendInput, AppendOutput, @@ -73,9 +97,16 @@ TemporalStreams, ) +__all__ = [ + "NexusProducer", + "NexusStreamHandle", + "NexusStreams", + "TemporalStreamsHandler", +] + _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " - "through a storage provider, so configure one of those on the worker" + "through a storage provider, so give the worker one of those" ) # The contract leaves these unset, so the handler is the one place that says @@ -83,12 +114,13 @@ # shortens it to the request deadline anyway, and a shorter default only # means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 30_000 +_DEFAULT_READ_WAIT = timedelta(seconds=30) _DEADLINE_MARGIN = timedelta(milliseconds=500) _DEFAULT_MAX_PRODUCERS = 10_000 _DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) _QUEUE_DEPTH = 1000 -_APPEND_TIMEOUT_MS = 30_000 +_APPEND_TIMEOUT = timedelta(seconds=30) +_ROUND_TRIP_MARGIN = timedelta(seconds=5) _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -104,16 +136,58 @@ _APPEND_OPERATION = _OPERATION_NAMES["append"] _READ_OPERATION = _OPERATION_NAMES["read"] +# The stream conditions that cross the endpoint under their own name, so the +# caller raises the class the store raised. +_STREAM_ERRORS: dict[str, type[StreamError]] = { + cls.__name__: cls + for cls in ( + StreamError, + StreamNotFoundError, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, + ) +} +_HTTP_TO_RPC = { + 400: RPCStatusCode.INVALID_ARGUMENT, + 401: RPCStatusCode.UNAUTHENTICATED, + 403: RPCStatusCode.PERMISSION_DENIED, + 404: RPCStatusCode.NOT_FOUND, + 408: RPCStatusCode.DEADLINE_EXCEEDED, + 409: RPCStatusCode.ALREADY_EXISTS, + 412: RPCStatusCode.FAILED_PRECONDITION, + 429: RPCStatusCode.RESOURCE_EXHAUSTED, + 500: RPCStatusCode.INTERNAL, + 501: RPCStatusCode.UNIMPLEMENTED, + 503: RPCStatusCode.UNAVAILABLE, + 504: RPCStatusCode.DEADLINE_EXCEEDED, +} + _OutputT = TypeVar("_OutputT") logger = logging.getLogger(__name__) +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _handler_error(error: StreamError) -> nexusrpc.HandlerError: + """Carry a stream condition across the endpoint under its own class name.""" + kind = ( + nexusrpc.HandlerErrorType.NOT_FOUND + if isinstance(error, StreamNotFoundError) + else nexusrpc.HandlerErrorType.BAD_REQUEST + ) + return nexusrpc.HandlerError( + f"{type(error).__name__}: {error}", type=kind, retryable_override=False + ) + + def _bad_request(message: str) -> nexusrpc.HandlerError: return nexusrpc.HandlerError( - message, - type=nexusrpc.HandlerErrorType.BAD_REQUEST, - retryable_override=False, + message, type=nexusrpc.HandlerErrorType.BAD_REQUEST, retryable_override=False ) @@ -131,29 +205,30 @@ class _Subscription: @dataclass class _ProducerState: - delegate: Any + delegate: StreamProducer batch_index: int + sequence: int + last_cursor: str | None @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: - """Serves the stream endpoint, delegating to one storage provider. + """Serves the stream endpoint by fronting one storage provider's handles. - The delegate is an explicit instance rather than the process default, so - a caller and a handler can coexist in one process, and so an operator can + The provider is an explicit instance the application constructed, so a + caller and a handler can coexist in one process, and so an operator can run handlers for a new store next to handlers for the old one. """ def __init__( self, - client: Any, - provider: str, + provider: StreamProvider, + client: Client | None, *, max_producers: int = _DEFAULT_MAX_PRODUCERS, subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, - **provider_options: Any, ) -> None: - """Serve the endpoint out of the provider named by ``provider``. + """Serve the endpoint out of ``provider``'s handles, opened with ``client``. ``max_producers`` bounds the dedupe state kept per producer attempt; the oldest is evicted, and a producer evicted mid-life gets a clear @@ -161,9 +236,9 @@ def __init__( ``subscription_idle`` is how long a parked read outlives its last caller. """ + self._provider = provider self._client = client - self._delegate = _provider.instance(provider, **provider_options) - self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + self._producers: OrderedDict[tuple[str, str, str, str, int], _ProducerState] = ( OrderedDict() ) self._max_producers = max_producers @@ -171,60 +246,82 @@ def __init__( self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} self._subscription_idle = subscription_idle.total_seconds() + def _stream(self, workflow_id: str, run_id: str | None) -> StreamHandle: + # A storage provider wants a client; the memory provider, which the + # tests front, accepts none, so the cast only lies where it is unread. + return self._provider.get_stream_handle( + cast(Client, self._client), workflow_id, run_id=run_id or None + ) + @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch. + """Append on the caller's account, writing a repeated batch once. Raises: - nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips - ahead, when it continues a producer attempt this handler has - no state for, or when a payload is not a serialized - ``Payload``. + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index or + sequence does not continue the producer attempt, when the + attempt is one this handler has no state for, or when a + payload is not a serialized ``Payload``; ``NOT_FOUND`` when + the store has no such workflow. """ - topic = input.topic or "" + try: + return await self._append(input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _append(self, input: AppendInput) -> AppendOutput: + _require_topic(input.topic) key = ( input.workflow_id, - input.stream or f"@{topic}", + input.run_id or "", + input.topic, input.producer_id, input.attempt, ) state = self._producers.get(key) if state is None: - if input.batch_index != 1: + if input.batch_index != 1 or input.sequence != 0: # A fresh delegate would restart its numbering at zero, and # the store would drop that as a repeat of the first batch. # Refusing here turns a silent loss into a failure the caller # can act on by opening a new attempt. - raise _bad_request( + raise StreamProducerError( f"producer {input.producer_id!r} attempt {input.attempt} resumed " f"at batch {input.batch_index} on a handler that has no state for " "it; open a new attempt" ) - delegate = await self._delegate.producer( - self._client, - workflow_id=input.workflow_id, - stream=input.stream, - topic=topic, - producer_id=input.producer_id, - attempt=input.attempt, + delegate = self._stream(input.workflow_id, input.run_id).producer( + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt ) - state = _ProducerState(delegate, 0) - elif input.batch_index <= state.batch_index: - # A repeat, or a producer that restarted its numbering: either - # way the store already holds the batch. + state = _ProducerState(delegate, 0, 0, None) + elif input.batch_index == state.batch_index: + # The last batch again: the store already holds it, and where it + # landed is the answer the original got. self._producers.move_to_end(key) - return AppendOutput() + return AppendOutput(cursor=state.last_cursor) + elif input.batch_index < state.batch_index: + raise StreamProducerError( + f"batch {input.batch_index} was written and is no longer the last " + f"for producer {input.producer_id!r} attempt {input.attempt}" + ) elif input.batch_index != state.batch_index + 1: - raise _bad_request( + raise StreamProducerError( f"batch {input.batch_index} skips ahead of {state.batch_index} for " f"producer {input.producer_id!r} attempt {input.attempt}" ) + if input.sequence != state.sequence: + raise StreamProducerError( + f"sequence {input.sequence} does not continue at {state.sequence} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) payloads = self._payloads(input.payloads) cursor: str | None = None if payloads: - appended = await state.delegate.append(*payloads) + appended = await state.delegate.append(*(RawValue(p) for p in payloads)) cursor = appended.token if appended is not None else None if input.finish: await state.delegate.finish() @@ -233,6 +330,8 @@ async def append( # Recorded only once the store accepted the batch, so a failed append # is not mistaken for a repeat when the caller retries it. state.batch_index = input.batch_index + state.sequence += len(payloads) + state.last_cursor = cursor self._producers[key] = state self._producers.move_to_end(key) while len(self._producers) > self._max_producers: @@ -243,32 +342,46 @@ async def append( def _payloads(encoded: list[bytes] | None) -> list[Payload]: payloads = [] for index, raw in enumerate(encoded or []): - payload = Payload() try: - payload.ParseFromString(raw) + payloads.append(Payload.FromString(raw)) except DecodeError as error: raise _bad_request( f"payloads[{index}] is not a serialized Temporal Payload: {error}" ) from error - payloads.append(payload) return payloads @nexusrpc.handler.sync_operation async def read( self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: - """Answer with the records after the caller's token, or time out.""" - stream = input.stream or "" - topic = input.topic or None + """Answer with the records after the caller's token, or time out. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the store refuses the + token, ``NOT_FOUND`` when it has no such workflow. + """ + try: + return await self._read(ctx, input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _read( + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + _require_topic(input.topic) + stream = self._stream(input.workflow_id, input.run_id) if input.latest_only: - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=stream - ) - return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + return ReadOutput(next_token=(await stream.latest(topic=input.topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + wait = ( + _DEFAULT_READ_WAIT.total_seconds() + if input.wait_ms is None + else input.wait_ms / 1000 + ) if ctx.request_deadline is not None: # The server answers the caller with a timeout at the deadline # whatever this call does, so collecting past it only holds the @@ -279,7 +392,7 @@ async def read( left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN wait = max(0.0, min(wait, left.total_seconds())) after = input.after_token or "" - key = (input.workflow_id, stream, topic or "") + key = (input.workflow_id, input.run_id or "", input.topic) await self._expire_subscriptions() lock = self._read_locks.setdefault(key, asyncio.Lock()) async with lock: @@ -287,34 +400,31 @@ async def read( if subscription is None or subscription.position != after: if subscription is not None: await self._drop(key) - subscription = await self._subscribe( - key, input.workflow_id, stream, topic, after - ) + subscription = self._subscribe(key, stream, input.topic, after) records, next_token = await self._drain(subscription, max_records, wait) subscription.position = next_token subscription.last_used = time.monotonic() - if subscription.done and subscription.records.empty(): - # The store ended the read, as the Workflow Streams delegate - # does when the run closes. Nothing more will arrive on it. + done = ( + subscription.done + and subscription.records.empty() + and subscription.failure is None + ) + if done: + # The store ended the read: the run or chain is closed and the + # tail has been handed over. Nothing more will arrive on it. await self._drop(key) - return ReadOutput(records=records, next_token=next_token) + return ReadOutput(records=records, next_token=next_token, done=done) - async def _subscribe( - self, - key: tuple[str, str, str], - workflow_id: str, - stream: str, - topic: str | None, - after: str, + def _subscribe( + self, key: tuple[str, str, str], stream: StreamHandle, topic: str, after: str ) -> _Subscription: - delegate = await self._delegate.consumer( - self._client, workflow_id=workflow_id, stream=stream - ) - # Raw payloads: the handler frames what the store holds without + # Raw payloads: the handler forwards what the store holds without # decoding it, so an encoding only the caller's codec understands - # passes through untouched. - source = delegate.read( - after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + # passes through untouched. A foreign token is refused right here. + source = stream.read( + topic=topic, + after=Cursor(after) if after else BEGINNING, + result_type=RawValue, ) subscription = _Subscription( records=asyncio.Queue(maxsize=_QUEUE_DEPTH), @@ -334,8 +444,7 @@ async def pump() -> None: subscription.failure = error finally: subscription.done = True - if isinstance(source, AsyncGenerator): - await source.aclose() + await source.aclose() subscription.pump = asyncio.create_task(pump()) self._subscriptions[key] = subscription @@ -354,8 +463,10 @@ async def _drain( if records or remaining <= 0: break if subscription.done: + if subscription.failure is None: + break # Honour the wait even though nothing can arrive, so a - # caller polling a closed stream does not spin on the + # caller polling a failed stream does not spin on the # endpoint. await asyncio.sleep(remaining) break @@ -374,20 +485,19 @@ async def _drain( @staticmethod def _wire(record: StreamRecord[Any]) -> RecordWire: - body = ( - record.value.payload.SerializeToString() - if isinstance(record.value, RawValue) - else b"" - ) - frame = _frame.encode( + # The record read as RawValue carries the stored body untouched; the + # default converter passes a RawValue through, so no encoding happens + # here. + wire = to_wire( + temporalio.converter.DataConverter.default.payload_converter, topic=record.topic, kind=record.kind, - producer=record.producer, + value=record.value, + producer_id=record.producer_id, attempt=record.attempt, sequence=record.sequence, - body=body, ) - return RecordWire(token=record.cursor.token, frame=frame) + return RecordWire(token=record.cursor.token, record=wire.SerializeToString()) async def close(self) -> None: """Release every parked read. @@ -419,20 +529,44 @@ async def _expire_subscriptions(self) -> None: self._read_locks.pop(key, None) -class StreamEndpointError(RuntimeError): - """The stream endpoint refused a call or could not be reached. +class _EndpointFailure(Exception): + """What the transport saw: the endpoint's answer, or the reason it gave none.""" - ``status`` is the HTTP status when the endpoint answered, and ``None`` - when the connection itself failed. - """ - - def __init__(self, message: str, *, status: int | None = None) -> None: - """Carry the endpoint's answer, or the reason it gave none.""" - super().__init__(message) + def __init__(self, detail: str, status: int | None) -> None: + super().__init__(detail) + self.detail = detail self.status = status -def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: +def _translate(failure: _EndpointFailure) -> Exception: + """The exception a caller raises for an endpoint failure. + + The handler names a stream condition by its class in the failure message, + so the same class is raised here; anything else is an ``RPCError`` with + the status the HTTP answer maps to, or ``UNAVAILABLE`` when there was none. + """ + message = failure.detail + try: + parsed = json.loads(message) + if isinstance(parsed, dict) and isinstance(parsed.get("message"), str): + message = parsed["message"] + except ValueError: + pass + if failure.status is not None: + for name, cls in _STREAM_ERRORS.items(): + prefix = f"{name}: " + if message.startswith(prefix): + return cls(message[len(prefix) :]) + status = _HTTP_TO_RPC.get(failure.status, RPCStatusCode.UNKNOWN) + else: + status = RPCStatusCode.UNAVAILABLE + return RPCError(message, status, b"") + + +def _post( + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta +) -> bytes: + timeout_ms = int(timeout.total_seconds() * 1000) request = urllib.request.Request( url, data=body, @@ -446,57 +580,74 @@ def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> method="POST", ) try: - with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: + with urllib.request.urlopen( + request, timeout=(timeout + _ROUND_TRIP_MARGIN).total_seconds() + ) as response: return response.read() except urllib.error.HTTPError as error: - detail = error.read().decode(errors="replace") - raise StreamEndpointError( - f"stream endpoint call failed ({error.code}): {detail}", status=error.code + raise _EndpointFailure( + error.read().decode(errors="replace"), error.code ) from error except urllib.error.URLError as error: - raise StreamEndpointError( - f"stream endpoint unreachable at {url}: {error.reason}" + raise _EndpointFailure( + f"stream endpoint unreachable at {url}: {error.reason}", None ) from error class _Front: - """Everything the caller half needs to reach one endpoint.""" + """Everything a handle needs to reach one endpoint.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - headers: Mapping[str, str], - wait_ms: int, - max_records: int, - ) -> None: - self.base_url = base_url + def __init__(self, streams: NexusStreams, client: Client | None) -> None: + self._streams = streams + self._client = client + data_converter = streams._data_converter + if data_converter is None: + data_converter = ( + client.data_converter + if client is not None + else temporalio.converter.DataConverter.default + ) self.converter = data_converter.payload_converter self.codec = data_converter.payload_codec - self.headers = dict(headers) - self.wait_ms = wait_ms - self.max_records = max_records + self.read_wait = streams._read_wait + self.max_records = streams._max_records + + async def _base_url(self) -> str: + endpoint_id = await self._streams._endpoint_id(self._client) + return ( + f"{self._streams._http_address}/nexus/endpoints/{endpoint_id}" + f"/services/{_SERVICE_NAME}" + ) async def invoke( - self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + self, + operation: str, + request: Any, + output: type[_OutputT], + *, + timeout: timedelta, ) -> _OutputT: # The contract types carry their own JSON encoding, so the raw caller # and the worker serving the operation agree on the body without # either of them spelling the fields out. contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread( - _post, - f"{self.base_url}/{operation}", - contract.to_payloads([request])[0].data, - self.headers, - timeout_ms, - ) + url = f"{await self._base_url()}/{operation}" + try: + raw = await asyncio.to_thread( + _post, + url, + contract.to_payloads([request])[0].data, + self._streams._headers, + timeout, + ) + except _EndpointFailure as failure: + raise _translate(failure) from failure payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it. + """Appends through the stream endpoint; the store behind it does the rest. Calls are serialized and the batch index is committed only once the endpoint answered. A batch whose call raised stays pending and is sent @@ -509,42 +660,50 @@ def __init__( self, front: _Front, workflow_id: str, - stream: str, + run_id: str | None, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on the endpoint.""" + """Bind this producer to ``topic`` on the workflow behind the endpoint.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._sequence = 0 + self._last: Cursor | None = BEGINNING self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None self._lock = asyncio.Lock() + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` through the endpoint.""" + """Append ``values`` through the endpoint and return where the last one landed. + + A repeat answers with the original's position and an empty call with + the last one; ``None`` when the store behind the endpoint learns + positions only at read time. + """ if not values: - return None - payloads = [ - value - if isinstance(value, Payload) - else self._front.converter.to_payloads([value])[0] - for value in values - ] + return self._last + payloads = self._front.converter.to_payloads(list(values)) answer = await self._call(payloads, finish=False) - return Cursor(answer.cursor) if answer.cursor else None + self._last = Cursor(answer.cursor) if answer.cursor else None + return self._last async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" + """Write ``FINISH`` for this producer on this topic.""" await self._call([], finish=True) async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: @@ -566,238 +725,202 @@ async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: await self._send(*self._pending) elif self._pending is not None: return await self._send(*self._pending) - request = self._request(self._batch_index + 1, encoded, finish) + request = AppendInput( + workflow_id=self._workflow_id, + run_id=self._run_id, + topic=self._topic, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + batch_index=self._batch_index + 1, + payloads=encoded, + finish=finish, + ) return await self._send(request, identity, finish) - def _request( - self, batch_index: int, payloads: list[bytes], finish: bool - ) -> AppendInput: - return AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=batch_index, - topic=self._topic, - payloads=payloads, - finish=finish, - ) - async def _send( self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: self._pending = (request, identity, finish) answer = await self._front.invoke( - _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS + _APPEND_OPERATION, request, AppendOutput, timeout=_APPEND_TIMEOUT ) self._batch_index = request.batch_index + self._sequence = request.sequence + len(request.payloads or []) + int(finish) self._pending = None return answer -class NexusConsumer: - """Reads batches from the stream endpoint, re-synthesizing supersession.""" +class NexusStreamHandle: + """One workflow's stream through the endpoint, re-synthesizing supersession.""" - def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: - """Read what ``workflow_id`` publishes, through the endpoint.""" + def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s stream, pinned to ``run_id`` when one is given.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after``, one endpoint batch at a time. + + The token is opaque here, so a cursor from another store is refused by + the store behind the endpoint and raises + :class:`temporalio.streams.StreamCursorError` on the first iteration. + """ + _require_topic(topic) + return self._read(topic, after, result_type) + + async def _read( + self, topic: str, after: Cursor, result_type: type | None ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, one endpoint batch at a time.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() + decoder = RecordDecoder( + self._front.converter, result_type, after=after, warn=logger.warning + ) token = after.token while True: answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, after_token=token, max_records=self._front.max_records, - wait_ms=self._front.wait_ms, + wait_ms=int(self._front.read_wait.total_seconds() * 1000), ), ReadOutput, - timeout_ms=self._front.wait_ms + 5000, + timeout=self._front.read_wait + _ROUND_TRIP_MARGIN, ) for wire in answer.records or []: cursor = Cursor(wire.token) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - wire.frame - ) - except ValueError as error: + record = WireRecord.FromString(wire.record) + except DecodeError as error: # Same answer as every other reader: skip and say so. logger.warning("skipping stream record at %s: %s", cursor, error) continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - value = ( - await self._decode(body, type) if kind is RecordKind.DATA else None - ) - yield StreamRecord( - value=value, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + if self._front.codec is not None and record.HasField("body"): + record.body.CopyFrom( + (await self._front.codec.decode([record.body]))[0] + ) + for out in decoder.decode(cursor, record): + yield out token = answer.next_token or token + if answer.done: + return - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" + async def latest(self, *, topic: str) -> Cursor: + """The newest position on ``topic`` behind the endpoint, for following from now.""" + _require_topic(topic) answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, latest_only=True, ), ReadOutput, - timeout_ms=_APPEND_TIMEOUT_MS, + timeout=_APPEND_TIMEOUT, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING - async def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if self._front.codec is not None: - payload = (await self._front.codec.decode([payload]))[0] - if as_type is None: - return self._front.converter.from_payloads([payload])[0] - return self._front.converter.from_payloads([payload], [as_type])[0] - - -class _NexusProvider: - name = "nexus" - - def __init__(self) -> None: - self._endpoint: str | None = None - self._endpoint_id: str | None = None - self._http_address = "http://127.0.0.1:7243" - self._service = _SERVICE_NAME - self._data_converter: temporalio.converter.DataConverter | None = None - self._client: Any = None - self._headers: dict[str, str] = {} - self._wait_ms = _DEFAULT_WAIT_MS - self._max_records = _DEFAULT_MAX_RECORDS - - def configure(self, **options: Any) -> None: - """Point the caller half at one endpoint. - - ``endpoint`` is the endpoint's name when ``client`` is given, and is - resolved to its id through the operator service on first use; without - a client it has to be the id, because the HTTP ingress dispatches by - id. ``headers`` go on every request, which is where an authorization - header belongs. ``wait_ms`` and ``max_records`` are the read bounds - the caller asks the handler for. - """ - endpoint = options.pop("endpoint", None) - self._http_address = options.pop("http_address", self._http_address) - self._service = options.pop("service", _SERVICE_NAME) - self._data_converter = options.pop("data_converter", None) - self._client = options.pop("client", None) - self._headers = dict(options.pop("headers", None) or {}) - self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) - self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) - if options: - raise TypeError( - "the nexus provider takes endpoint, http_address, service, " - f"data_converter, client, headers, wait_ms and max_records, got " - f"{sorted(options)}" - ) - if not endpoint: - raise TypeError( - "the nexus provider needs endpoint= together with " - "client=, or endpoint= on its own" - ) - self._endpoint = endpoint - self._endpoint_id = None - - def worker_options(self) -> dict[str, Any]: - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - del stream, after, idle_timeout - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_write(self, topic: str) -> WriteSink: - del topic - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - async def _front(self, client: Any) -> _Front: - if self._endpoint is None: - raise RuntimeError("configure the nexus provider before opening handles") - if self._endpoint_id is None: - resolver = self._client if self._client is not None else client - if resolver is None: - self._endpoint_id = self._endpoint - else: - found = await resolver.operator_service.list_nexus_endpoints( - ListNexusEndpointsRequest(name=self._endpoint) - ) - if not found.endpoints: - raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") - self._endpoint_id = found.endpoints[0].id - base_url = ( - f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" - f"/services/{self._service}" - ) - return _Front( - base_url, - self._converter(client), - self._headers, - self._wait_ms, - self._max_records, - ) - - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 ) -> NexusProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) return NexusProducer( - await self._front(client), workflow_id, stream, topic, producer_id, attempt + self._front, self._workflow_id, self._run_id, topic, producer_id, attempt ) - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> NexusConsumer: - return NexusConsumer(await self._front(client), workflow_id, stream) - def _converter(self, client: Any) -> temporalio.converter.DataConverter: - if self._data_converter is not None: - return self._data_converter - if client is None: - return temporalio.converter.DataConverter.default - return client.data_converter +class NexusStreams(StreamProvider): + """The outside half of a provider, over one Nexus endpoint. + Not a worker plugin: a workflow publishes and reads through the storage + provider its worker was given, and this front only serves code outside a + workflow. The endpoint hides which store that is. + """ -_provider.register("nexus", _NexusProvider) + def __init__( + self, + *, + endpoint: str, + http_address: str = "http://127.0.0.1:7243", + headers: Mapping[str, str] | None = None, + read_wait: timedelta = _DEFAULT_READ_WAIT, + max_records: int = _DEFAULT_MAX_RECORDS, + data_converter: temporalio.converter.DataConverter | None = None, + ) -> None: + """Point the front at one endpoint. + + Args: + endpoint: The Nexus endpoint's name, resolved to its id through + the operator service of the client a handle is opened with. + When a handle is opened without a client it has to be the id, + because the HTTP ingress dispatches by id. + http_address: The server's Nexus HTTP ingress. + headers: Sent on every request; where an authorization header + belongs. + read_wait: How long the handler may park a read before answering + with what it has. + max_records: The most records one read answer carries. + data_converter: Overrides the client's converter for record + bodies. A payload codec configured here runs on this side of + the endpoint, so records are encoded before they leave the + process and the handler's worker never holds the key. + """ + if not endpoint: + raise ValueError("endpoint must not be empty") + self._endpoint = endpoint + self._http_address = http_address.rstrip("/") + self._headers = dict(headers or {}) + self._read_wait = read_wait + self._max_records = max_records + self._data_converter = data_converter + self._resolved: str | None = None + self._resolving = asyncio.Lock() + + def workflow_provider(self) -> NoReturn: + """Raise: this front has no workflow half.""" + raise StreamUnsupportedError(_WORKFLOW_SIDE_ERROR) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> NexusStreamHandle: + """A handle on ``workflow_id``'s stream through the endpoint. + + ``client`` is not used for transport: it resolves the endpoint's name + and supplies the data converter when none was configured. + """ + return NexusStreamHandle(_Front(self, client), workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: each call opens and closes its own connection.""" + + async def _endpoint_id(self, client: Client | None) -> str: + if self._resolved is not None: + return self._resolved + async with self._resolving: + if self._resolved is None: + if client is None: + self._resolved = self._endpoint + else: + found = await client.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise ValueError( + f"no nexus endpoint is named {self._endpoint!r}" + ) + self._resolved = found.endpoints[0].id + return self._resolved From c055e2717110178450eb7293a21b6ccec5ac7795 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 383/831] Covered the Nexus front on the new surface. --- CHANGELOG.md | 15 +- tests/streams/test_nexus_provider.py | 311 +++++++++++++++++---------- 2 files changed, 204 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d6d93c86..3ba06e4c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,12 +39,15 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. -- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus - endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. Its contract is defined in - `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. - Configure it with `data_converter=` to run a payload codec on the caller - side, so records are encoded before they leave the process. +- **Experimental**: `temporalio.streams.providers.nexus.NexusStreams` puts one + Nexus endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store, and + `TemporalStreamsHandler` serves that endpoint by fronting the provider's own + handles. Its contract is defined in `temporal_streams.nexusrpc.yaml` and the + bindings are generated from it; a record crosses as the serialized + `StreamRecord` proto. Configure the front with `data_converter=` to run a + payload codec on the caller side, so records are encoded before they leave + the process. ### Changed diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 77cec6f4e..ecb0e7cf3 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,7 +1,7 @@ """Conformance for the Nexus front. -The caller talks only to the stream endpoint; the handler delegates to a -storage provider, so these tests are the provider-hiding demonstration: +The caller talks only to the stream endpoint; the handler fronts a storage +provider's own handles, so these tests are the provider-hiding demonstration: nothing on the caller side names or could name the store. The loop test runs over the server's Nexus HTTP ingress and is gated behind @@ -32,20 +32,27 @@ import pytest import temporalio.converter -from temporalio import streams from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams import _frame as frame -from temporalio.streams._provider import instance -from temporalio.streams.providers import memory, nexus -from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import ( - StreamEndpointError, - TemporalStreamsHandler, +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, ) +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers import nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.worker import Worker +from tests.helpers import new_worker from tests.streams.test_workflow_streams_provider import EchoLoop, take +from tests.streams.test_workflow_streams_provider import _feed as feed_echo_loop live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", @@ -56,6 +63,8 @@ HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] +INPUTS = "inputs" +DECISIONS = "decisions" @live_only @@ -63,42 +72,34 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front, and it names the # endpoint the way an operator does, by name. - streams.configure(provider="workflow_streams") + store = WorkflowStreamsProvider() client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - front = instance( - "nexus", + front = NexusStreams( endpoint=ENDPOINT, - client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), - wait_ms=5000, + read_wait=timedelta(seconds=5), ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" - handler = TemporalStreamsHandler(client, provider="workflow_streams") + handler = TemporalStreamsHandler(store, client) async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", workflows=[EchoLoop], - **streams.worker_options(), + plugins=[store], ): handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" ) - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + stream = front.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4, timeout=60) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4, 60) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -110,8 +111,9 @@ async def test_interface_loop_through_the_nexus_front(): # An opaque cursor from behind the front resumes a fresh reader # just past the record it names. checkpoint = records[0].cursor - resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2, 60 + ) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) @@ -136,12 +138,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: """Recover the payloads :meth:`encode` wrapped.""" - out: list[Payload] = [] - for payload in payloads: - inner = Payload() - inner.ParseFromString(self._flip(payload.data)) - out.append(inner) - return out + return [Payload.FromString(self._flip(payload.data)) for payload in payloads] @classmethod def _flip(cls, data: bytes) -> bytes: @@ -202,9 +199,9 @@ def _in_process_endpoint( failing = set(fail_after_applying or []) def post( - url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta ) -> bytes: - del headers, timeout_ms + del headers, timeout posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput @@ -216,24 +213,30 @@ def post( _dispatch(handler, operation, request), loop ).result() except nexusrpc.HandlerError as error: - raise StreamEndpointError(str(error), status=400) from error + # The ingress answers a handler error with a failure body and the + # status its type maps to. + status = 404 if error.type is nexusrpc.HandlerErrorType.NOT_FOUND else 400 + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + json.dumps({"message": str(error)}), status + ) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) if operation in failing: failing.discard(operation) - raise StreamEndpointError("connection reset after the handler answered") + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + "connection reset after the handler answered", None + ) return raw return post -def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: - return instance( - "nexus", +def _front(codec: temporalio.converter.PayloadCodec | None) -> NexusStreams: + return NexusStreams( endpoint="in-process", # This endpoint has no other traffic to wait for, so park briefly # rather than for the contract's default. - wait_ms=200, + read_wait=timedelta(milliseconds=200), data_converter=dataclasses.replace( temporalio.converter.DataConverter.default, payload_codec=codec ), @@ -244,28 +247,19 @@ async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, ) -> tuple[list[Any], list[bytes], list[bytes]]: - memory.reset() - streams.configure(provider="memory") + store = MemoryStreams() posted: list[bytes] = [] answered: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = _front(codec) - workflow_id = "wf-codec" + stream = _front(codec).get_stream_handle(None, "wf-codec") - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"secret": "tuna"}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") - records = await take(consumer.read(type=dict), 2, timeout=30) - memory.reset() + records = await take(stream.read(topic=INPUTS, result_type=dict), 2, timeout=30) + await handler.close() return records, posted, answered @@ -281,7 +275,8 @@ def _answered_bodies(answered: list[bytes]) -> bytes: out = b"" for body in answered: for record in json.loads(body).get("records", []): - out += frame.decode(base64.b64decode(record["frame"]))[5] + wire = WireRecord.FromString(base64.b64decode(record["record"])) + out += wire.body.SerializeToString() return out @@ -315,14 +310,21 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( def _append( - workflow_id: str, batch_index: int, *values: Any, finish: bool = False + workflow_id: str, + batch_index: int, + *values: Any, + sequence: int | None = None, + finish: bool = False, ) -> AppendInput: converter = temporalio.converter.DataConverter.default.payload_converter return AppendInput( workflow_id=workflow_id, - stream="inputs", + topic=INPUTS, producer_id="model", attempt=1, + # Batches of one, numbered in step with the batch index unless a + # case wants them out of step. + sequence=batch_index - 1 if sequence is None else sequence, batch_index=batch_index, payloads=[ converter.to_payloads([value])[0].SerializeToString() for value in values @@ -331,57 +333,62 @@ def _append( ) -async def _stored(workflow_id: str) -> list[Any]: - consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") +async def _stored(store: MemoryStreams, workflow_id: str) -> list[Any]: + stream = store.get_stream_handle(None, workflow_id) + end = await stream.latest(topic=INPUTS) + if end == BEGINNING: + return [] out: list[Any] = [] - async for record in consumer.read(type=dict): + async for record in stream.read(topic=INPUTS, result_type=dict): if record.kind is RecordKind.DATA: out.append(record.value) - if await consumer.latest() == record.cursor: + if record.cursor == end: break return out -@pytest.fixture -def _memory_store(): # pyright: ignore[reportUnusedFunction] - memory.reset() - streams.configure(provider="memory") - yield - memory.reset() - - -@pytest.mark.usefixtures("_memory_store") async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): # A second handler instance stands in for a restarted or load-balanced # handler worker: it shares the store but not the dedupe state. - first = TemporalStreamsHandler(None, provider="memory") - second = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + first = TemporalStreamsHandler(store, None) + second = TemporalStreamsHandler(store, None) await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) with pytest.raises(nexusrpc.HandlerError) as failed: await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST assert failed.value.retryable_override is False + # Named so the caller can raise the same class. + assert str(failed.value).startswith("StreamProducerError: ") # The store holds the first batch and nothing was silently lost or doubled. - assert await _stored("wf") == [{"n": 1}] + assert await _stored(store, "wf") == [{"n": 1}] -@pytest.mark.usefixtures("_memory_store") -async def test_the_handler_drops_repeats_and_rejects_gaps(): - handler = TemporalStreamsHandler(None, provider="memory") +async def test_the_handler_answers_repeats_and_rejects_gaps(): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) - await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - # An exact repeat is dropped with a success answer and no position. + second = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # A repeat of the last batch is written once and answers with where the + # original landed, so a retrying caller checkpoints the same position. repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - assert repeat.cursor is None - with pytest.raises(nexusrpc.HandlerError) as failed: + assert repeat.cursor == second.cursor + with pytest.raises(nexusrpc.HandlerError) as skipped: await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) - assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert skipped.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + with pytest.raises(nexusrpc.HandlerError) as behind: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + assert str(behind.value).startswith("StreamProducerError: ") + with pytest.raises(nexusrpc.HandlerError) as renumbered: + await _dispatch( + handler, APPEND_OPERATION, _append("wf", 3, {"n": 3}, sequence=7) + ) + assert "sequence 7 does not continue at 2" in str(renumbered.value) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] -@pytest.mark.usefixtures("_memory_store") async def test_a_malformed_payload_is_the_callers_fault(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) request = _append("wf", 1) request.payloads = [b"\xff\xfe not a payload"] with pytest.raises(nexusrpc.HandlerError) as failed: @@ -389,12 +396,12 @@ async def test_a_malformed_payload_is_the_callers_fault(): assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST -@pytest.mark.usefixtures("_memory_store") async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -402,28 +409,41 @@ async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # A transport failure is an RPCError, never the transport's own type. + with pytest.raises(RPCError) as failed: await producer.append({"n": 1}) - await producer.append({"n": 1}) + assert failed.value.status == RPCStatusCode.UNAVAILABLE + landed = await producer.append({"n": 1}) await producer.append({"n": 2}) await producer.finish() indexes = [json.loads(body)["batch_index"] for body in posted] - # The retry re-sent index 1, which the handler dropped as a repeat, so - # the store holds each record once. + sequences = [json.loads(body)["sequence"] for body in posted] + # The retry re-sent index 1, which the handler answered as a repeat with + # the original's position, so the store holds each record once. assert indexes == [1, 1, 2, 3] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert sequences == [0, 0, 1, 2] + assert landed == await _memory_position(store, "wf", 0) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def _memory_position( + store: MemoryStreams, workflow_id: str, index: int +) -> Cursor: + records = await take( + store.get_stream_handle(None, workflow_id).read(topic=INPUTS, result_type=dict), + index + 1, + ) + return records[index].cursor -@pytest.mark.usefixtures("_memory_store") async def test_a_failed_append_goes_out_before_the_next_one( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -431,28 +451,52 @@ async def test_a_failed_append_goes_out_before_the_next_one( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + with pytest.raises(RPCError): await producer.append({"n": 1}) # The caller moves on without retrying; the pending batch is replayed # first under its own index and the new one takes the next. await producer.append({"n": 2}) indexes = [json.loads(body)["batch_index"] for body in posted] assert indexes == [1, 1, 2] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def test_a_stream_condition_crosses_the_endpoint_under_its_own_class( + monkeypatch: pytest.MonkeyPatch, +): + handler = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + stream = _front(None).get_stream_handle(None, "wf") + # The token is opaque on this side, so the store behind the endpoint is + # what refuses it, and the refusal arrives on the first read as the class + # the store raised. + with pytest.raises(StreamCursorError): + await take(stream.read(topic=INPUTS, after=Cursor("elsewhere:1")), 1) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + # A second handler has no state for the attempt; the caller learns that + # as a producer conflict. + fresh = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(fresh, [], [])) + with pytest.raises(StreamProducerError): + await producer.append({"n": 2}) + await handler.close() + + +def test_the_front_has_no_workflow_half(): + with pytest.raises(StreamUnsupportedError): + _front(None).workflow_provider() -@pytest.mark.usefixtures("_memory_store") async def test_consecutive_reads_share_one_parked_subscription(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) first = await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, max_records=1, wait_ms=200), ) assert len(first.records) == 1 parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] @@ -464,7 +508,7 @@ async def test_consecutive_reads_share_one_parked_subscription(): READ_OPERATION, ReadInput( workflow_id="wf", - stream="inputs", + topic=INPUTS, after_token=first.next_token, max_records=1, wait_ms=200, @@ -477,21 +521,56 @@ async def test_consecutive_reads_share_one_parked_subscription(): await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=200), ) assert len(parked) == 1 and next(iter(parked.values())).pump is not pump await handler.close() assert not parked -@pytest.mark.usefixtures("_memory_store") async def test_the_read_wait_is_cut_to_the_request_deadline(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) started = asyncio.get_running_loop().time() answer = await handler.read( _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), - ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=60000), ) - assert answer.records == [] and answer.next_token == "" + assert answer.records == [] and answer.next_token == "" and not answer.done assert asyncio.get_running_loop().time() - started < 5 await handler.close() + + +async def test_the_read_ends_when_the_store_ends_it( + client: Client, monkeypatch: pytest.MonkeyPatch +): + # Behind the endpoint sits the Workflow Streams store, whose read ends + # once the run has closed and its tail is served. The front carries that + # end to the caller, whose loop leaves by itself. + store = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + handler = TemporalStreamsHandler(store, client) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + workflow_id = f"streams-nexus-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, plugins=[store]) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await feed_echo_loop(store, client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + stream = _front(None).get_stream_handle(None, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 30) + await handler.close() + assert records == [ + (RecordKind.DATA, {"echo": 1}), + (RecordKind.DATA, {"echo": 2}), + (RecordKind.DATA, {"echo": 3}), + (RecordKind.FINISH, None), + ] From 099c52c2834605bf7dbbb83d92b4c1a3c560f3a5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:24:46 -0700 Subject: [PATCH 384/831] Added activity.stream_handle and Client.get_stream_handle. A provider is registered once, as a plugin on the client, and every context asks for its stream the same way: the worker inherits the client's provider, an activity's handle is its own workflow pinned to its run, and a client's handle mirrors get_workflow_handle. --- temporalio/activity.py | 48 +++++++++ temporalio/client/_client.py | 41 +++++++ temporalio/streams/__init__.py | 23 ++-- temporalio/streams/providers/__init__.py | 45 +++++--- temporalio/worker/_activity.py | 6 ++ temporalio/worker/_worker.py | 8 +- tests/streams/test_stream_accessors.py | 125 ++++++++++++++++++++++ tests/streams/test_streams_conformance.py | 14 ++- 8 files changed, 283 insertions(+), 27 deletions(-) create mode 100644 tests/streams/test_stream_accessors.py diff --git a/temporalio/activity.py b/temporalio/activity.py index 82678d8a1..33f3a90eb 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -29,6 +29,7 @@ import temporalio.bridge.proto.activity_task import temporalio.common import temporalio.converter +import temporalio.streams from temporalio.converter._payload_converter import ( _TemporalTransferTypePayloadConverter, ) @@ -209,6 +210,7 @@ class _Context: runtime_metric_meter: temporalio.common.MetricMeter | None client: Client | None cancellation_details: _ActivityCancellationDetailsHolder + stream_provider: temporalio.streams.StreamProvider | None = None _logger_details: Mapping[str, Any] | None = None _payload_converter: temporalio.converter.PayloadConverter | None = None _metric_meter: temporalio.common.MetricMeter | None = None @@ -298,6 +300,52 @@ def client() -> Client: return client +def stream_handle( + workflow_id: str | None = None, *, run_id: str | None = None +) -> temporalio.streams.StreamHandle: + """Return a stream handle from the provider the worker was given. + + With no arguments the handle is on this activity's own workflow, pinned to + the run the activity belongs to, so a producer opened from it writes onto + that run's stream and a read follows that run. Name a ``workflow_id`` to + address another workflow; ``run_id`` then pins the handle to one run and + its absence follows the execution chain. See :py:mod:`temporalio.streams`. + + Like :py:func:`client`, this is only available in ``async def`` + activities. + + Returns: + :py:class:`temporalio.streams.StreamHandle` for use in the current + activity. + + Raises: + temporalio.streams.StreamUnsupportedError: The worker has no stream + provider. Register one with ``Client.connect(plugins=[provider])`` + or ``Worker(plugins=[provider])``. + RuntimeError: When the client is not available, or when the activity + has no workflow and no ``workflow_id`` was given. + ValueError: ``run_id`` was given without ``workflow_id``. + """ + context = _Context.current() + provider = context.stream_provider + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is configured on this worker; register one with " + "Client.connect(plugins=[provider]) or Worker(plugins=[provider])" + ) + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id needs a workflow_id") + info = context.info() + if info.workflow_id is None: + raise RuntimeError( + "this activity belongs to no workflow, so name the workflow_id to " + "address" + ) + workflow_id, run_id = info.workflow_id, info.workflow_run_id + return provider.get_stream_handle(client(), workflow_id, run_id=run_id) + + def in_activity() -> bool: """Whether the current code is inside an activity. diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index b5db0c4b7..dc4ef68c4 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -27,6 +27,7 @@ import temporalio.converter import temporalio.runtime import temporalio.service +import temporalio.streams import temporalio.workflow from temporalio.service import ( ConnectConfig, @@ -155,6 +156,7 @@ async def connect( grpc_compression: GrpcCompression = GrpcCompression.GZIP, payload_limits: PayloadLimitsConfig = PayloadLimitsConfig(), header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> Self: """Connect to a Temporal server. @@ -220,6 +222,11 @@ async def connect( payload_limits: Warning thresholds for outbound payload/memo sizes. Over-threshold fields are logged but still sent. Set a threshold to 0 to disable it. header_codec_behavior: Encoding behavior for headers sent by the client. + stream_provider: Experimental. The stream provider + :py:meth:`get_stream_handle` opens handles from, see + :py:mod:`temporalio.streams`. A provider that is also a + :py:class:`Plugin` sets this itself when passed in ``plugins``, + and workers built from this client inherit it. """ connect_config = temporalio.service.ConnectConfig( target_host=target_host, @@ -256,6 +263,7 @@ def make_lambda( default_workflow_query_reject_condition=default_workflow_query_reject_condition, header_codec_behavior=header_codec_behavior, plugins=plugins, + stream_provider=stream_provider, ) def __init__( @@ -269,6 +277,7 @@ def __init__( default_workflow_query_reject_condition: None | (temporalio.common.QueryRejectCondition) = None, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ): """Create a Temporal client from a service client. @@ -283,6 +292,7 @@ def __init__( interceptors=interceptors, default_workflow_query_reject_condition=default_workflow_query_reject_condition, header_codec_behavior=header_codec_behavior, + stream_provider=stream_provider, ) self._initial_config = config.copy() @@ -886,6 +896,36 @@ def get_workflow_handle( result_type=result_type, ) + def get_stream_handle( + self, workflow_id: str, *, run_id: str | None = None + ) -> temporalio.streams.StreamHandle: + """Get a handle on a workflow's stream from the provider registered on this client. + + Mirrors :py:meth:`get_workflow_handle`: without ``run_id`` the handle + follows the workflow's execution chain across continue-as-new, with + one it is pinned to that run. The provider is the one registered with + ``plugins=[provider]`` at :py:meth:`connect`, or passed as + ``stream_provider``. See :py:mod:`temporalio.streams`. + + Args: + workflow_id: Workflow ID whose stream to get a handle to. + run_id: Run ID to pin the handle to. + + Returns: + The stream handle. + + Raises: + temporalio.streams.StreamUnsupportedError: No stream provider is + registered on this client. + """ + provider = self._config.get("stream_provider") + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is registered on this client; connect with " + "plugins=[provider]" + ) + return provider.get_stream_handle(self, workflow_id, run_id=run_id) + def get_workflow_handle_for( self, workflow: ( @@ -3032,3 +3072,4 @@ class ClientConfig(TypedDict, total=False): temporalio.common.QueryRejectCondition | None ] header_codec_behavior: Required[HeaderCodecBehavior] + stream_provider: temporalio.streams.StreamProvider | None diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 30d1f9a98..c185c35ce 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -30,15 +30,20 @@ workflow and by outside consumers; which of those happen is the application's business. -Workflow-side entry points live in :mod:`temporalio.workflow`: -:func:`temporalio.workflow.stream_reader` and -:func:`temporalio.workflow.stream_writer`. Outside a workflow, a handle comes -from a provider instance: ``provider.get_stream_handle(client, workflow_id)``. -A provider is an object; when it serves workers it is also a -:class:`temporalio.worker.Plugin`, passed as ``Worker(plugins=[provider])`` -and ``Replayer(plugins=[provider])``. This module keeps the shared types, the -errors and the protocols a provider implements; nothing here that workflow -code imports does I/O. +A provider is an object, registered once as a plugin: +``Client.connect(plugins=[provider])``; workers built from that client inherit +it, and ``Worker(plugins=[provider])`` or ``Replayer(plugins=[provider])`` +registers it on a worker alone. Each context then asks for its stream the +same way. Workflow code uses :func:`temporalio.workflow.stream_reader` and +:func:`temporalio.workflow.stream_writer`. An activity uses +:func:`temporalio.activity.stream_handle`, which is its own workflow pinned +to its run unless told otherwise. Any process holding a client uses +:meth:`temporalio.client.Client.get_stream_handle`, which mirrors +``get_workflow_handle``. The explicit form, +``provider.get_stream_handle(client, workflow_id)``, stays for a process that +talks to two stores. This module keeps the shared types, the errors and the +protocols a provider implements; nothing here that workflow code imports does +I/O. What the contract does not promise: that a :attr:`RecordKind.FINISH` record means the writing activity succeeded, that a superseded attempt's records can diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py index 911620e6c..7aaa5a9b1 100644 --- a/temporalio/streams/providers/__init__.py +++ b/temporalio/streams/providers/__init__.py @@ -1,11 +1,14 @@ """Stream providers, one module each. -A provider that serves workers is a :class:`temporalio.worker.Plugin`. +A provider that serves workers is a :class:`temporalio.worker.Plugin`, and +one registered on a client is a :class:`temporalio.client.Plugin` too. :class:`ProviderPlugin` is the plugin half the providers in this tree share: -it hands the provider to the worker and the replayer as their -``stream_provider`` and leaves their execution alone. A provider that holds -connections closes them through its own ``close()``, not with the worker, -because the same provider serves handles outside any worker. +it hands the provider to the client, the worker and the replayer as their +``stream_provider`` and leaves their execution alone, so +``Client.connect(plugins=[provider])`` registers it once and every worker +built from that client inherits it. A provider that holds connections closes +them through its own ``close()``, not with the worker, because the same +provider serves handles outside any worker. """ from __future__ import annotations @@ -13,8 +16,10 @@ from collections.abc import AsyncIterator, Awaitable, Callable from contextlib import AbstractAsyncContextManager +import temporalio.client import temporalio.worker -from temporalio.client import WorkflowHistory +from temporalio.client import ClientConfig, WorkflowHistory +from temporalio.service import ConnectConfig, ServiceClient from temporalio.streams._provider import StreamProvider from temporalio.worker import ( Replayer, @@ -27,16 +32,32 @@ __all__ = ["ProviderPlugin"] -class ProviderPlugin(StreamProvider, temporalio.worker.Plugin): - """The worker plugin every provider in this tree is built on. +class ProviderPlugin( + StreamProvider, temporalio.client.Plugin, temporalio.worker.Plugin +): + """The plugin every provider in this tree is built on. Subclasses implement :class:`temporalio.streams.StreamProvider`; this - class supplies the four plugin hooks, so ``Worker(plugins=[provider])`` - and ``Replayer(plugins=[provider])`` reach the provider through their - ``stream_provider`` option and the worker installs the interceptor that - calls the workflow half's lifecycle hooks. + class supplies the plugin hooks, so ``Client.connect(plugins=[provider])``, + ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` reach + the provider through their ``stream_provider`` option. A worker built from + a client that carries the plugin inherits it, and the worker installs the + interceptor that calls the workflow half's lifecycle hooks. """ + def configure_client(self, config: ClientConfig) -> ClientConfig: + """Set this provider as the client's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def connect_service_client( + self, + config: ConnectConfig, + next: Callable[[ConnectConfig], Awaitable[ServiceClient]], + ) -> ServiceClient: + """Connect unchanged.""" + return await next(config) + def configure_worker(self, config: WorkerConfig) -> WorkerConfig: """Set this provider as the worker's ``stream_provider``.""" config["stream_provider"] = self diff --git a/temporalio/worker/_activity.py b/temporalio/worker/_activity.py index ded3047fc..10bf45bd2 100644 --- a/temporalio/worker/_activity.py +++ b/temporalio/worker/_activity.py @@ -33,6 +33,7 @@ import temporalio.common import temporalio.converter import temporalio.exceptions +import temporalio.streams from temporalio.converter import ( StorageDriverActivityInfo, StorageDriverStoreContext, @@ -63,9 +64,11 @@ def __init__( metric_meter: temporalio.common.MetricMeter, client: temporalio.client.Client, encode_headers: bool, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: self._bridge_worker = bridge_worker self._task_queue = task_queue + self._stream_provider = stream_provider self._activity_executor = activity_executor self._shared_state_manager = shared_state_manager self._running_activities: dict[bytes, _RunningActivity] = {} @@ -666,6 +669,9 @@ async def _execute_activity( runtime_metric_meter=None if sync_non_threaded else self._metric_meter, client=self._client if not running_activity.sync else None, cancellation_details=running_activity.cancellation_details, + stream_provider=( + self._stream_provider if not running_activity.sync else None + ), ) ) temporalio.activity.logger.debug("Starting activity") diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index 3adbd7231..fade69c4d 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -468,6 +468,11 @@ def _init_from_config(self, client: temporalio.client.Client, config: WorkerConf # Prepend applicable client interceptors to the given ones client_config = config["client"].config(active_config=True) # type: ignore[reportTypedDictNotRequiredAccess] + # A provider registered on the client serves its workers too, so one + # registration covers every context that asks for a stream. + stream_provider = config.get("stream_provider") or client_config.get( + "stream_provider" + ) interceptors_from_client = cast( list[Interceptor], [i for i in client_config["interceptors"] if isinstance(i, Interceptor)], @@ -505,6 +510,7 @@ def _init_from_config(self, client: temporalio.client.Client, config: WorkerConf interceptors=interceptors, metric_meter=self._runtime.metric_meter, client=client, + stream_provider=stream_provider, encode_headers=( client_config["header_codec_behavior"] == HeaderCodecBehavior.CODEC ), @@ -572,7 +578,7 @@ def check_activity(activity: str): encode_headers=client_config["header_codec_behavior"] != HeaderCodecBehavior.NO_CODEC, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, - stream_provider=config.get("stream_provider"), + stream_provider=stream_provider, ) tuner = config.get("tuner") diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py new file mode 100644 index 000000000..73436dea2 --- /dev/null +++ b/tests/streams/test_stream_accessors.py @@ -0,0 +1,125 @@ +"""The accessors each context asks for its stream, with one registration. + +The provider is registered on the client alone. A worker built from that +client inherits it, an activity on that worker reaches its own workflow's +stream through ``activity.stream_handle()``, and any code holding the client +reaches a stream through ``client.get_stream_handle()``. Without a +registration, both say so with the same error. +""" + +from __future__ import annotations + +import asyncio +import uuid +from datetime import timedelta +from typing import Any + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind, StreamUnsupportedError +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import ActivityEnvironment, WorkflowEnvironment +from tests.helpers import new_worker + +INPUTS = "inputs" +DECISIONS = "decisions" + + +@pytest.fixture +def provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] + if env.supports_time_skipping: + pytest.skip( + "the memory provider polls on a timer, which time skipping turns into a spin" + ) + streams = MemoryStreams() + yield streams + streams.reset() + + +def _with_provider(client: Client, provider: MemoryStreams) -> Client: + # The same connection, with the provider registered the way an + # application registers it: once, on the client. + config = client.config() + config["plugins"] = [provider] + return Client(**config) + + +@activity.defn +async def emit(count: int) -> str: + # No workflow id and no run id: the handle is this activity's own + # workflow, pinned to its run, and the producer's identity is the + # activity's. + model = activity.stream_handle().producer(topic=INPUTS) + for n in range(count): + await model.append({"n": n}) + await model.finish() + return activity.info().activity_id + + +@workflow.defn +class Echo: + """Runs the emitting activity and echoes what arrives on ``inputs``.""" + + @workflow.run + async def run(self, count: int) -> list[Any]: + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) + emitting = workflow.start_activity( + emit, count, start_to_close_timeout=timedelta(seconds=30) + ) + seen: list[Any] = [] + async for record in inputs: + if record.kind is RecordKind.FINISH: + seen.append(("finish", record.producer_id)) + break + assert record.value is not None + seen.append(record.value["n"]) + decisions.publish({"echo": record.value["n"]}) + decisions.finish() + producer_id = await emitting + return [*seen, ("activity", producer_id)] + + +async def test_one_registration_on_the_client_serves_every_context( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + # No plugins on the worker: it inherits the client's provider. + async with new_worker(registered, Echo, activities=[emit]) as worker: + handle = await registered.start_workflow( + Echo.run, 2, id=workflow_id, task_queue=worker.task_queue + ) + result = await handle.result() + # The activity wrote as itself onto its own workflow's topic. + assert result[:2] == [0, 1] + assert result[2] == ["finish", result[3][1]] + + stream = registered.get_stream_handle(workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + assert await asyncio.wait_for(read_everything(), 30) == [ + (RecordKind.DATA, {"echo": 0}), + (RecordKind.DATA, {"echo": 1}), + (RecordKind.FINISH, None), + ] + + +async def test_get_stream_handle_needs_a_registered_provider(client: Client): + with pytest.raises(StreamUnsupportedError, match="plugins="): + client.get_stream_handle("wf") + + +async def test_stream_handle_needs_a_provider_on_the_worker(): + async def ask() -> None: + activity.stream_handle() + + with pytest.raises(StreamUnsupportedError, match="plugins="): + await ActivityEnvironment().run(ask) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 451fe4391..020250973 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -24,7 +24,7 @@ import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass -from typing import Any, cast +from typing import Any import pytest @@ -64,11 +64,15 @@ async def open( ) -> StreamHandle: if self.host is not None: await self.host(workflow_id) - # The memory provider takes no client; every storage provider's setup - # supplies one, so the cast only ever lies for the provider that - # does not read it. + if self.client is not None: + # A storage provider's setup registers the provider on the client, + # so the cases go through the accessor an application uses. + return self.client.get_stream_handle(workflow_id, run_id=run_id) + # Only the memory provider gets here, and it takes no client. return self.provider.get_stream_handle( - cast(Client, self.client), workflow_id, run_id=run_id + None, # type: ignore[arg-type] + workflow_id, + run_id=run_id, ) From 22e38645fda99b06f752f9a1c42b3cc8288b7547 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:24:46 -0700 Subject: [PATCH 385/831] Registered the demo's provider on the client and reported from the activity. --- CHANGELOG.md | 12 +++++++----- streams_demo/agent_loop.py | 22 ++++++++++++++++------ streams_demo/run_demo.py | 37 +++++++++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06eb5da58..a90a9114f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,11 +22,13 @@ to include examples, links to docs, or any other relevant information. - Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. - **Experimental**: `temporalio.streams` defines one stream interface a workflow - can read, decide on, and write. `workflow.stream_reader()` and - `workflow.stream_writer()` are the workflow-side entry points, a provider is a - worker plugin passed as `Worker(plugins=[provider])`, and - `provider.get_stream_handle()` reads and appends from outside. The record on - the wire is `temporal.api.stream.v1.StreamRecord` on every provider. + can read, decide on, and write. A provider is registered once as a plugin, + `Client.connect(plugins=[provider])`, and workers built from that client + inherit it; each context then asks for its stream the same way: + `workflow.stream_reader()` and `workflow.stream_writer()` in workflow code, + `activity.stream_handle()` in an activity, and `client.get_stream_handle()` + anywhere a client is held. The record on the wire is + `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index 330cb54c2..a76b35ced 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -1,12 +1,14 @@ """One agent loop, written once, run on every stream provider. Reads input, decides on it, publishes the decision, and runs an ordinary -Activity in the same workflow task. Also handles the two control records the -contract defines, so a retried producer and a finished topic are exercised -rather than described. +Activity in the same workflow task; the Activity reports on its own +workflow's stream in turn. Also handles the two control records the contract +defines, so a retried producer and a finished topic are exercised rather than +described. This file is byte-identical in the server-side tree and the client-side tree. -Only the worker that runs it differs, and only in which provider it is given. +Nothing in it names a provider: the workflow asks its runtime, the Activity +asks its context, and the process that runs them registered the provider once. """ from __future__ import annotations @@ -19,12 +21,20 @@ DECISIONS = "decisions" INPUTS = "inputs" +RECEIPTS = "receipts" @activity.defn(name="RecordDecision") async def record_decision(decision: dict[str, Any]) -> str: - """An ordinary command in the same task as the publish.""" - return f"recorded:{decision['source']}:{decision['branch']}" + """An ordinary command in the same task as the publish. + + Appends its receipt onto its own workflow's stream too, under the + Activity's own identity, so a reader outside sees the decision and the + record of it side by side. + """ + receipt = f"recorded:{decision['source']}:{decision['branch']}" + await activity.stream_handle().producer(topic=RECEIPTS).append({"receipt": receipt}) + return receipt def decide(token: dict[str, Any]) -> dict[str, Any]: diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 1238fad11..0b06e9395 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -7,10 +7,13 @@ the run as it allows is rebuilt rather than remembered; - a producer whose second attempt supersedes its first, which the reader has to report and the workflow has to act on; -- an outside reader following what the workflow published. +- an outside reader following what the workflow published, and the receipts + the Activity appended on the workflow's stream from inside its own context. -Byte-identical in every tree. ``provider_setup`` is what differs, and it is -the only import here that names a provider. +The provider is registered once, on the client; the worker inherits it and +every context asks for its stream without naming it. Byte-identical in every +tree. ``provider_setup`` is what differs, and it is the only import here that +names a provider. """ from __future__ import annotations @@ -25,12 +28,18 @@ from temporalio.api.enums.v1 import EventType from temporalio.client import Client -from temporalio.streams import StreamHandle +from temporalio.streams import RecordKind, StreamHandle from temporalio.worker import Worker sys.path.insert(0, str(Path(__file__).resolve().parent)) import provider_setup # noqa: E402 -from agent_loop import DECISIONS, INPUTS, AgentLoop, record_decision # noqa: E402 +from agent_loop import ( # noqa: E402 + DECISIONS, + INPUTS, + RECEIPTS, + AgentLoop, + record_decision, +) DECISION_LIMIT = 8 EXPECTED_OUTPUT = 6 @@ -51,7 +60,7 @@ async def main() -> int: out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" out.mkdir(exist_ok=True) target, provider = await provider_setup.open() - client = await Client.connect(target, namespace="default") + client = await Client.connect(target, namespace="default", plugins=[provider]) uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex record: dict[str, Any] = { @@ -67,12 +76,11 @@ async def main() -> int: workflows=[AgentLoop], activities=[record_decision], max_cached_workflows=provider_setup.WORKFLOW_CACHE, - plugins=[provider], ): handle = await client.start_workflow( AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid ) - stream = provider.get_stream_handle(client, uid) + stream = client.get_stream_handle(uid) output = asyncio.create_task(collect_output(stream, EXPECTED_OUTPUT)) # The first attempt writes two records and then stops, as a failed @@ -138,6 +146,19 @@ async def main() -> int: output.cancel() record["observed_output"] = "timed_out" + async def receipts() -> list[Any]: + # Ends by itself once the workflow is closed and the tail served. + return [ + r.value + async for r in stream.read(topic=RECEIPTS, result_type=dict) + if r.kind is RecordKind.DATA + ] + + try: + record["receipts"] = await asyncio.wait_for(receipts(), timeout=20) + except asyncio.TimeoutError: + record["receipts"] = "timed_out" + history = await handle.fetch_history() record["history_events"] = len(history.events) (out / "history.json").write_text(history.to_json()) From 50f254fbec591a7c3e13aa949598653f17ac71e7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 386/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From 18a5d0df1b2498952be34629f93f6d38cfafafe0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 387/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From c6756092e208ae5aa57d4956c8e708bc47fc0573 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 388/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- .../streams/providers/workflow_streams.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From 79b09e50b6b37e6ac86846ce151e8b23378923b1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 389/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- .../streams/providers/workflow_streams.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) From efbfa5dc399ade2a5f8f3358b1854b7a9dc70f0d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 390/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From 18756e22c74ca2eab292f2417612651e89b27069 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 391/831] Made the Workflow Streams provider pass the linters. The transport already resolves its payload converter and falls back to the default when it holds no client, so the provider asks it rather than reaching through a client that may not be there. --- .../streams/providers/workflow_streams.py | 13 ++++++-- .../streams/test_workflow_streams_provider.py | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d849f1244..656056381 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -186,6 +186,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to one stream or topic on ``handle``.""" self._handle = handle self._converter = converter self._stream = stream @@ -205,15 +206,19 @@ def _shipped_topic(self) -> str: @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the shipped publish Signal.""" entries = [] for value in values: frame = _frame.encode( @@ -230,6 +235,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor("") async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._frame_topic, kind=RecordKind.FINISH, @@ -274,6 +280,7 @@ def __init__( shipped_topic: str | None, poll_cooldown: timedelta, ) -> None: + """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client self._shipped_topic = shipped_topic self._poll_cooldown = poll_cooldown @@ -285,6 +292,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -362,6 +370,7 @@ def _record( return out async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one log per workflow, whatever the topic head = await self._client.get_offset() return Cursor(str(head - 1)) if head > 0 else BEGINNING @@ -369,7 +378,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._client.data_converter.payload_converter + converter = self._client._payload_converter() if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2b491cbf1..612aaa33d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -12,6 +12,7 @@ import asyncio import os import uuid +from typing import Any import pytest @@ -62,7 +63,7 @@ async def run(self) -> int: return seen -async def take(records, count: int, timeout: float = 30.0) -> list: +async def take(records: Any, count: int, timeout: float = 30.0) -> list: out: list = [] async def _collect() -> None: @@ -77,9 +78,7 @@ async def _collect() -> None: async def test_interface_loop_over_workflow_streams(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -119,9 +118,7 @@ async def test_interface_loop_over_workflow_streams(): async def test_retried_producer_dedupes_and_new_attempt_supersedes(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -135,19 +132,28 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): ) first = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await first.append({"n": 1}) # The retry of the same attempt re-sends its first batch. retry = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await retry.append({"n": 1}) second = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=2, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=2, ) await second.append({"n": 2}) From dee1e72ddcd13f9b7d506760af041f01dfc1a9dc Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 392/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a90a9114f..5c5839a4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,10 @@ to include examples, links to docs, or any other relevant information. `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From b58e8214b70b48b57d2d1284c0fea9343cf0a619 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:44:59 -0700 Subject: [PATCH 393/831] Added public accessors to Workflow Streams for code that rides its wire. A provider that reuses the shipped transport needs the publish signal's name, the log past an offset, and the client's handle and converter. Reading them off private attributes breaks silently on the next contrib change. --- .../contrib/workflow_streams/__init__.py | 6 +++- .../contrib/workflow_streams/_client.py | 14 ++++++++++ .../contrib/workflow_streams/_stream.py | 28 ++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/temporalio/contrib/workflow_streams/__init__.py b/temporalio/contrib/workflow_streams/__init__.py index 41f670f0c..3f225bb2f 100644 --- a/temporalio/contrib/workflow_streams/__init__.py +++ b/temporalio/contrib/workflow_streams/__init__.py @@ -13,7 +13,10 @@ """ from temporalio.contrib.workflow_streams._client import WorkflowStreamClient -from temporalio.contrib.workflow_streams._stream import WorkflowStream +from temporalio.contrib.workflow_streams._stream import ( + PUBLISH_SIGNAL_NAME, + WorkflowStream, +) from temporalio.contrib.workflow_streams._topic_handle import ( TopicHandle, WorkflowTopicHandle, @@ -29,6 +32,7 @@ ) __all__ = [ + "PUBLISH_SIGNAL_NAME", "PollInput", "PollResult", "PublishEntry", diff --git a/temporalio/contrib/workflow_streams/_client.py b/temporalio/contrib/workflow_streams/_client.py index 605bf3f03..5c458bdab 100644 --- a/temporalio/contrib/workflow_streams/_client.py +++ b/temporalio/contrib/workflow_streams/_client.py @@ -325,6 +325,20 @@ def topic( self._topic_types[name] = bound return TopicHandle(self, name, bound) + @property + def handle(self) -> WorkflowHandle[Any, Any]: + """The workflow handle this client publishes to and polls. + + Re-targeted when :py:meth:`subscribe` follows a continue-as-new, so + read it when needed rather than caching it. + """ + return self._handle + + @property + def payload_converter(self) -> PayloadConverter: + """The sync payload converter used for per-item encode and decode.""" + return self._payload_converter() + async def flush(self) -> None: """Flush buffered (and pending) items and wait for server confirmation. diff --git a/temporalio/contrib/workflow_streams/_stream.py b/temporalio/contrib/workflow_streams/_stream.py index ae8608c3b..ff0865c29 100644 --- a/temporalio/contrib/workflow_streams/_stream.py +++ b/temporalio/contrib/workflow_streams/_stream.py @@ -50,7 +50,14 @@ _WorkflowStreamWireItem, ) -_PUBLISH_SIGNAL = "__temporal_workflow_stream_publish" +PUBLISH_SIGNAL_NAME = "__temporal_workflow_stream_publish" +"""The signal :class:`WorkflowStream` registers for external publishes. + +Public so code that sends the signal itself, with its own publisher identity, +does not have to copy the name. +""" + +_PUBLISH_SIGNAL = PUBLISH_SIGNAL_NAME _POLL_UPDATE = "__temporal_workflow_stream_poll" _OFFSET_QUERY = "__temporal_workflow_stream_offset" @@ -234,6 +241,25 @@ def topic( self._topic_types[name] = bound return WorkflowTopicHandle(self, name, bound) + @property + def next_offset(self) -> int: + """The global offset the next published item will receive.""" + return self._base_offset + len(self._log) + + def items_from(self, offset: int) -> list[tuple[int, str, Payload]]: + """Return ``(offset, topic, payload)`` for every item at or past ``offset``. + + Reads the log in place, so it is safe to call from a + :func:`temporalio.workflow.wait_condition` predicate. An ``offset`` + below the truncation base starts at the base instead; the offsets in + the result say where the items actually sit. + """ + start = max(offset, self._base_offset) - self._base_offset + return [ + (self._base_offset + index, item.topic, item.data) + for index, item in enumerate(self._log[start:], start) + ] + def get_state( self, *, publisher_ttl: timedelta = timedelta(seconds=900) ) -> WorkflowStreamState: From 846a5ca6c424dabf4cf620f50ac3766863ad3818 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 394/831] Keyed the Workflow Streams runtime by workflow instance, not run id. The SDK rebuilds an evicted workflow from history as a new object. A process map keyed by run id handed that object the previous instance's log, with no handlers registered on the new one and the records of a failed task still inside. The stream is now found through the handler the shipped class registers on the instance, and the provider reads the contrib module only through its public surface. --- .../streams/providers/workflow_streams.py | 121 ++++++++---------- 1 file changed, 54 insertions(+), 67 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 656056381..8155f7e9d 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -36,6 +36,7 @@ from temporalio.client import Client from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( + PUBLISH_SIGNAL_NAME, PublishEntry, PublishInput, WorkflowStream, @@ -48,77 +49,63 @@ from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord -_RUN_ATTR = "__temporal_streams_ws_runtime" _TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" class _Runtime: - """Per-run holder for the shipped stream object. + """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed - from a method named ``__init__``, and the provider builds it lazily on - the first read or write of a run. + from a method named ``__init__``. """ - def __init__(self) -> None: - self.stream = WorkflowStream() - # The poll Update stops answering once the workflow is closing, and a - # reader between polls at that moment would lose what the final task - # published. The log is workflow state, so a Query still serves it - # after completion. - workflow.set_query_handler(_TAIL_QUERY, self._tail) + def __init__(self, stream: WorkflowStream | None = None) -> None: + self.stream = WorkflowStream() if stream is None else stream + if workflow.get_query_handler(_TAIL_QUERY) is None: + # The poll Update stops answering once the workflow is closing, + # and a reader between polls at that moment would lose what the + # final task published. The log is workflow state, so a Query + # still serves it after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) def _tail(self, from_offset: int) -> list[dict[str, Any]]: - base = self.stream._base_offset return [ { - "offset": base + index, - "topic": item.topic, - "data": base64.b64encode(item.data.data).decode("ascii"), + "offset": offset, + "topic": topic, + "data": base64.b64encode(payload.data).decode("ascii"), } - for index, item in enumerate(self.stream._log) - if base + index >= from_offset + for offset, topic, payload in self.stream.items_from(from_offset) ] -# Held per run rather than on the workflow instance, because the provider is -# asked to install its handlers from the workflow's constructor, and the -# instance is not registered with the runtime yet at that point. -_runtimes: dict[str, _Runtime] = {} +def _registered_stream() -> WorkflowStream | None: + handler = workflow.get_signal_handler(PUBLISH_SIGNAL_NAME) + if handler is None: + return None + stream = getattr(handler, "__self__", None) + if not isinstance(stream, WorkflowStream): + raise RuntimeError( + f"the {PUBLISH_SIGNAL_NAME!r} signal on this workflow is handled by " + "something other than a WorkflowStream, so the workflow_streams " + "provider cannot share its log" + ) + return stream def _runtime() -> _Runtime: - key = workflow.info().run_id - runtime = _runtimes.get(key) - if runtime is None: - runtime = _Runtime() - _runtimes[key] = runtime - return runtime - - -def drain() -> None: - """Release parked pollers so the workflow can return. - - An Option 0 stream dies with its workflow, and a parked long-poll Update - would otherwise hold completion open. Call it right before the workflow - returns, the same obligation the shipped feature's ``detach_pollers`` - documents. A storage provider has no such step, which is one of the - differences the comparison table charges this transport with. - """ - runtime = _runtimes.pop(workflow.info().run_id, None) - if runtime is not None: - runtime.stream.detach_pollers() + # Found on the instance rather than in a process-level map keyed by run + # id: the SDK rebuilds an evicted workflow from history as a new object, + # and a map would hand that object the stale log with its unregistered + # handlers and the records of a task that failed. + stream = _registered_stream() + return _Runtime() if stream is None else _Runtime(stream) class _WSReadSource: - """Reads the signal-fed log the shipped feature keeps in workflow state. - - Reaches into the stream's private log rather than ``get_state()``, - because the snapshot copies the whole log per call and drops offsets, - and this runs inside ``workflow.wait_condition``. - """ + """Reads the signal-fed log the shipped feature keeps in workflow state.""" def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: self._stream = stream @@ -126,29 +113,21 @@ def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> No self._cursor = start self._closed = False - def _end(self) -> int: - return self._stream._base_offset + len(self._stream._log) - async def next_batch(self) -> list[tuple[Cursor, bytes]]: while True: if self._closed: raise StopAsyncIteration - base = self._stream._base_offset - if self._cursor < base: - # Truncated below the cursor; resume at what remains. - self._cursor = base await workflow.wait_condition( - lambda: self._closed or self._end() > self._cursor + lambda: self._closed or self._stream.next_offset > self._cursor ) if self._closed: raise StopAsyncIteration - batch: list[tuple[Cursor, bytes]] = [] - end = self._end() - for offset in range(self._cursor, end): - item = self._stream._log[offset - self._stream._base_offset] - if item.topic == self._shipped_topic: - batch.append((Cursor(str(offset)), item.data.data)) - self._cursor = end + batch = [ + (Cursor(str(offset)), payload.data) + for offset, topic, payload in self._stream.items_from(self._cursor) + if topic == self._shipped_topic + ] + self._cursor = self._stream.next_offset if batch: return batch @@ -254,7 +233,7 @@ def _entry(self, frame: bytes) -> PublishEntry: async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 await self._handle.signal( - _PUBLISH_SIGNAL, + PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, @@ -324,7 +303,7 @@ async def read( async def _tail(self, from_offset: int) -> list[dict[str, Any]]: try: - return await self._client._handle.query( + wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) except Exception: @@ -378,7 +357,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._payload_converter() + converter = self._client.payload_converter if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] @@ -413,8 +392,16 @@ def prepare(self) -> None: _runtime() def drain(self) -> None: - """Release parked pollers so the workflow can return.""" - drain() + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll + Update would otherwise hold completion open. Call it right before + the workflow returns, the same obligation the shipped feature's + ``detach_pollers`` documents. + """ + stream = _registered_stream() + if stream is not None: + stream.detach_pollers() def open_read( self, From 01ff78e29fbe38d4f412ebb93c457c1d412cae27 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 395/831] Committed producer sequences only after the publish signal was accepted. A retry after an ambiguous failure used to carry fresh sequences, so the shipped dedupe let the same batch land twice. The batch now stays pending under its signal sequence until the server accepts it, and goes out first if the caller moves on. append returns None because this transport learns positions at read time. --- .../streams/providers/workflow_streams.py | 100 +++++++++++------- 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 8155f7e9d..fb685fc2c 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -42,8 +42,7 @@ WorkflowStream, WorkflowStreamClient, ) -from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL -from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -147,6 +146,11 @@ async def publish(self, frame: bytes) -> None: self._handle.publish(payload) +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + class WorkflowStreamsProducer: """Appends by sending the shipped publish Signal directly. @@ -154,6 +158,12 @@ class WorkflowStreamsProducer: owns the publisher identity: it must be ``producer#attempt`` for the shipped dedupe to drop a retry and pass a new generation, and the client would use its own random id. + + Sequences are committed only after the server accepted the Signal. A + batch whose Signal raised stays pending and goes out again under the + same signal sequence, either when the caller retries the same values or + ahead of whatever the caller sends next, so an ambiguous failure writes + the batch once and loses nothing. """ def __init__( @@ -174,10 +184,7 @@ def __init__( self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 - - @property - def _frame_topic(self) -> str: - return self._stream or self._topic + self._pending: tuple[list[PublishEntry], int] | None = None @property def _shipped_topic(self) -> str: @@ -196,50 +203,67 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append ``values`` through the shipped publish Signal.""" + async def append(self, *values: Any) -> None: + """Append ``values`` through the shipped publish Signal. + + Always ``None``: this transport learns positions at read time. + """ + if not values: + return None + await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + return None + + async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" + await self._send([(RecordKind.FINISH, b"")]) + + def _frames( + self, bodies: list[tuple[RecordKind, bytes]] + ) -> tuple[list[PublishEntry], int]: + sequence = self._sequence entries = [] - for value in values: + for kind, body in bodies: frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.DATA, + topic=self._topic, + kind=kind, producer=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=sequence, + body=body, ) - self._sequence += 1 - entries.append(self._entry(frame)) - await self._send(entries) - return Cursor("") - - async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._send([self._entry(frame)]) - - def _entry(self, frame: bytes) -> PublishEntry: - payload = Payload(data=frame) - return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) - - async def _send(self, entries: list[PublishEntry]) -> None: - self._signal_sequence += 1 + sequence += 1 + entries.append( + PublishEntry( + topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) + ) + ) + return entries, sequence + + async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: + entries, next_sequence = self._frames(bodies) + if self._pending is not None and self._pending[0] != entries: + # The caller moved on from a batch whose Signal raised. It goes + # first, under the signal sequence it already had, so a copy the + # server did accept is dropped and one it never saw lands. The + # new batch is then renumbered behind it. + await self._signal(*self._pending) + entries, next_sequence = self._frames(bodies) + await self._signal(entries, next_sequence) + + async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: + signal_sequence = self._signal_sequence + 1 + self._pending = (entries, next_sequence) await self._handle.signal( PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, - sequence=self._signal_sequence, + sequence=signal_sequence, ), ) + self._signal_sequence = signal_sequence + self._sequence = next_sequence + self._pending = None def _encode(self, value: Any) -> bytes: payload = ( From 66321b1566f4ec05fc8319100dec1103793cb09b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 396/831] Adapted the Workflow Streams provider to the interface changes. Inbound frames carry no topic and a topic filter on an inbound stream is rejected through the shared check; producer identity comes resolved from the package; an unreadable frame is skipped with a warning; read is declared as the generator it is. --- .../streams/providers/workflow_streams.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index fb685fc2c..ef2a88312 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -27,7 +27,8 @@ from __future__ import annotations import base64 -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any @@ -52,6 +53,8 @@ _IN = "in:" _OUT = "out:" +logger = logging.getLogger(__name__) + class _Runtime: """A view over the shipped stream object of the running workflow instance. @@ -280,12 +283,13 @@ class WorkflowStreamsConsumer: def __init__( self, stream_client: WorkflowStreamClient, - shipped_topic: str | None, + stream: str, poll_cooldown: timedelta, ) -> None: """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client - self._shipped_topic = shipped_topic + self._stream = stream + self._shipped_topic = f"{_IN}{stream}" if stream else None self._poll_cooldown = poll_cooldown async def read( @@ -294,8 +298,9 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -351,7 +356,9 @@ def _record( cursor = Cursor(str(offset)) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) return [] if topic is not None and frame_topic != topic: return [] @@ -456,11 +463,6 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return WorkflowStreamsProducer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, @@ -475,7 +477,7 @@ async def consumer( ) -> WorkflowStreamsConsumer: return WorkflowStreamsConsumer( WorkflowStreamClient.create(client, workflow_id), - f"{_IN}{stream}" if stream else None, + stream, self._poll_cooldown, ) From 428ad3329c792edb6c183b4aafd4800e57737740 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 397/831] Narrowed the tail query's error handling and filtered owner reads by topic. Only a missing handler or a vanished history means there is no tail to serve; anything else, such as a query timeout with no worker polling, is now an error rather than a silent empty stream. An owner-stream read with a topic subscribes to that shipped topic alone instead of dropping inbound items client-side. --- .../streams/providers/workflow_streams.py | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index ef2a88312..049fd60e9 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -20,8 +20,16 @@ - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns an empty cursor. The Signal transport learns positions - at read time; that is this provider's stated deviation. +- ``append`` returns ``None``. The Signal transport learns positions at read + time, so a caller that wants to follow from now asks ``Consumer.latest``. +- The workflow-side stream object belongs to the workflow instance, found + through the handler the shipped class registers on it. An evicted and + rebuilt workflow gets its own, so a task that failed leaks nothing into + the next attempt's log and a replayed run does not see records twice. +- An owner-stream read with a topic subscribes to that shipped topic alone. + Without one it has to take every shipped topic and drop the inbound + items client-side, which spends the poll response cap on records the + reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -34,7 +42,7 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowQueryFailedError from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -303,42 +311,63 @@ async def read( _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 + if self._shipped_topic is not None: + shipped = [self._shipped_topic] + elif topic is not None: + shipped = [f"{_OUT}{topic}"] + else: + shipped = None subscription = self._client.subscribe( - self._shipped_topic, + shipped, from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) - async for item in subscription: - next_offset = item.offset + 1 - record = self._record( - attempts, item.offset, item.topic, item.data.payload.data, topic, type - ) - for out in record: - yield out + try: + async for item in subscription: + next_offset = item.offset + 1 + for out in self._record( + attempts, + item.offset, + item.topic, + item.data.payload.data, + topic, + type, + ): + yield out + finally: + # Lets go of the parked poll when the caller stops early. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() # The subscription ends when the workflow is closing or closed. What # landed after the last poll is still in workflow state, so the tail # comes back by Query rather than being lost with the run. - for wire in await self._tail(next_offset): + for offset, shipped_topic, frame in await self._tail(next_offset): for out in self._record( - attempts, - wire["offset"], - wire["topic"], - base64.b64decode(wire["data"]), - topic, - type, + attempts, offset, shipped_topic, frame, topic, type ): yield out - async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: try: wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) - except Exception: - # A workflow that never opened a stream has no handler to ask, and - # one whose History is gone has nothing left to serve. + except WorkflowQueryFailedError as error: + if "expected but not found" not in str(error): + raise + # The workflow never opened a stream through this provider, so + # there is no tail to serve. return [] + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The History is gone; nothing is left to serve. + return [] + return [ + (item["offset"], item["topic"], base64.b64decode(item["data"])) + for item in wire + ] def _record( self, From 76ef9c7da8891b9e50aaac19a3b3d2ca3a39fc4f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 398/831] Ran the Workflow Streams provider tests on the test environment's server. The tests take the shared client fixture instead of an opt-in live gate, the loop workflow calls the portable lifecycle hooks, and new cases cover a cold workflow cache, the tail of a closed run, and the resend of a batch whose signal failed. --- .../streams/test_workflow_streams_provider.py | 227 +++++++++++++----- 1 file changed, 166 insertions(+), 61 deletions(-) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612aaa33d..612e99e02 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -1,44 +1,46 @@ -"""Live conformance for the workflow_streams provider. +"""Conformance for the workflow_streams provider on the test environment's server. -Runs the interface loop over the shipped Option 0 transport against a real -server: an outside producer appends through the publish Signal, the workflow -reads and republishes through its own state, and an outside consumer follows -the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it -needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +Runs the interface loop over the shipped Option 0 transport: an outside +producer appends through the publish Signal, the workflow reads and +republishes through its own state, and an outside consumer follows the poll +Update while the run is open and the tail Query once it has closed. """ from __future__ import annotations import asyncio -import os +import base64 import uuid from typing import Any import pytest from temporalio import streams, workflow +from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams.providers.workflow_streams import drain -from temporalio.worker import Worker +from temporalio.contrib.workflow_streams import PublishInput +from temporalio.converter import DataConverter +from temporalio.streams import RecordKind, _frame +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from tests.helpers import new_worker -pytestmark = pytest.mark.skipif( - os.environ.get("STREAMS_LIVE") != "workflow_streams", - reason="needs a live server; run with STREAMS_LIVE=workflow_streams", -) + +@pytest.fixture(autouse=True) +def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] + streams.configure(provider="workflow_streams") @workflow.defn class EchoLoop: """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. - Lingers until released, because an Option 0 stream dies with its - workflow: a reader that arrives after close finds nothing, which is the - transport limit the doc states rather than a defect to fix here. + Lingers until released so a reader can follow it while it runs; whoever + arrives after it closed is served by the tail Query instead. """ def __init__(self) -> None: self._released = False + streams.prepare() @workflow.signal def release(self) -> None: @@ -54,11 +56,12 @@ async def run(self) -> int: break if record.kind is not RecordKind.DATA: continue + assert isinstance(record.value, dict) seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() await workflow.wait_condition(lambda: self._released) - drain() + streams.drain() await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -76,59 +79,40 @@ async def _collect() -> None: return out -async def test_interface_loop_over_workflow_streams(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - handle = await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" - ) +async def _feed(client: Client, workflow_id: str) -> None: + producer = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() - producer = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, + +ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] + + +async def test_interface_loop_over_workflow_streams(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await producer.append({"n": 1}, {"n": 2}) - await producer.append({"n": 3}) - await producer.finish() + await _feed(client, workflow_id) consumer = await streams.consumer(client, workflow_id=workflow_id) records = await take(consumer.read(type=dict), 4) - assert [r.kind for r in records] == [ - RecordKind.DATA, - RecordKind.DATA, - RecordKind.DATA, - RecordKind.FINISH, - ] + assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" +async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) first = await streams.producer( @@ -147,7 +131,7 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): producer_id="model", attempt=1, ) - await retry.append({"n": 1}) + assert await retry.append({"n": 1}) is None second = await streams.producer( client, workflow_id=workflow_id, @@ -163,5 +147,126 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): records = await take(consumer.read(type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED + assert isinstance(records[1].value, streams.Supersession) assert records[1].value.previous_attempt == 1 assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + # Inbound records carry no topic; the stream's name is the address. + assert all(r.topic == "" for r in records) + + await second.finish() + await handle.signal(EchoLoop.release) + await handle.result() + + +async def test_cold_cache_serves_each_record_once(client: Client): + # Every task rebuilds the workflow from history, so the stream object + # has to belong to the instance that is running: a stale one would carry + # the previous instance's log and hand out every record twice. + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + inbound = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + arrived = await take(inbound.read(type=dict), 4) + assert [r.kind for r in arrived] == ECHOED + assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + +async def test_a_closed_run_serves_its_tail_by_query(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + # Nothing polled while the run was open. The poll Update is gone with + # the run, so everything below arrives through the tail Query. + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + checkpoint = records[1].cursor + resumed = await streams.consumer(client, workflow_id=workflow_id) + again = await take(resumed.read(type=dict, after=checkpoint), 2) + assert [r.value["echo"] for r in again[:1]] == [3] + assert again[1].kind is RecordKind.FINISH + + +class _FlakyHandle: + """A workflow handle whose first Signal is accepted and then reported failed.""" + + def __init__(self) -> None: + self.sent: list[PublishInput] = [] + self._fail_next = True + + async def signal(self, name: str, arg: PublishInput) -> None: + del name + self.sent.append(arg) + if self._fail_next: + self._fail_next = False + raise ConnectionResetError( + "the server accepted the signal, the reply was lost" + ) + + +def _frames( + publish: PublishInput, +) -> list[tuple[RecordKind, str, str, int, int, bytes]]: + out = [] + for entry in publish.items: + payload = Payload() + payload.ParseFromString(base64.b64decode(entry.data)) + out.append(_frame.decode(payload.data)) + return out + + +def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: + return [ + (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + ] + + +def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: + return WorkflowStreamsProducer( + handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + ) + + +async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + # The retry carries the same signal sequence and the same frame sequence + # as the failed send, so the shipped dedupe drops the copy; the batch + # after it continues the numbering. + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + + +async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 2}, {"n": 3}) + await producer.finish() + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] + assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH From 95c09a57f1c60d778ff0127c51a3987610d8802f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:06:16 -0700 Subject: [PATCH 399/831] Rewrote the Workflow Streams provider on the plugin surface. Topics are the shipped topics of the same name, the record is the StreamRecord proto inside the item payload, and cursors name the run because a log is not carried across continue-as-new. --- .../streams/providers/workflow_streams.py | 684 +++++++++++------- 1 file changed, 409 insertions(+), 275 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 049fd60e9..6f18dce46 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -1,35 +1,33 @@ -"""The provider over today's Workflow Streams (Option 0). +"""The provider over the shipped Workflow Streams transport (Option 0). Speaks the shipped contrib feature's wire format, the ``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code -and existing Workflow Streams code interoperate on one stream, and old -histories replay. Records live in the owning workflow's History, which is -also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers) are transport properties and remain. Reads after -the workflow closes go through one Query this provider adds, which serves -the log from workflow state for as long as the History is retained, so a -reader between polls when the workflow completed still gets the tail. +and existing Workflow Streams code share one log, and old histories replay. +Records live in the owning workflow's History, which is also this provider's +limit: the shipped caps (payloads in History, the Signal cap, bounded +subscribers) are transport properties and remain. The mapping, in one place: -- An interface record's frame rides as the item's ``Payload`` data. -- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. A producer - appending onto the workflow's own topic ``t`` writes ``out:t`` as well, - which is what today's activities already do through the publish Signal. +- A topic is the shipped topic of the same name in the workflow's one log. + A record rides as the item's ``Payload``: its data is the serialized + ``StreamRecord`` proto and its encoding is ``binary/plain``. The shipped + code stores and returns that ``Payload`` untouched, so the body's own + encoding never meets the transport. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns ``None``. The Signal transport learns positions at read - time, so a caller that wants to follow from now asks ``Consumer.latest``. +- ``append()`` returns ``None``. The Signal transport learns positions at + read time, so a caller that wants to follow from now asks ``latest()``. +- A log belongs to one run and is not carried across continue-as-new, so a + cursor names the run as well as the offset. A handle without a run id + reads run after run: each log through the poll Update while its run is + open and through the tail Query once it has closed, then the successor's + from its first record. - The workflow-side stream object belongs to the workflow instance, found through the handler the shipped class registers on it. An evicted and rebuilt workflow gets its own, so a task that failed leaks nothing into the next attempt's log and a replayed run does not see records twice. -- An owner-stream read with a topic subscribes to that shipped topic alone. - Without one it has to take every shipped topic and drop the inbound - items client-side, which spends the poll response cap on records the - reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -40,9 +38,17 @@ from datetime import timedelta from typing import Any +from google.protobuf.message import DecodeError + from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client, WorkflowQueryFailedError +from temporalio.client import ( + Client, + WorkflowExecutionStatus, + WorkflowHandle, + WorkflowHistoryEventFilterType, + WorkflowQueryFailedError, +) from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -51,20 +57,80 @@ WorkflowStream, WorkflowStreamClient, ) +from temporalio.converter import PayloadConverter from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = [ + "WorkflowStreamsHandle", + "WorkflowStreamsProducer", + "WorkflowStreamsProvider", +] +_PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" -_IN = "in:" -_OUT = "out:" +_ENCODING = b"binary/plain" logger = logging.getLogger(__name__) -class _Runtime: +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") + + +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "workflow_streams provider" + ) from None + + +def _wrap(record: WireRecord) -> Payload: + return Payload(metadata={"encoding": _ENCODING}, data=record.SerializeToString()) + + +def _unwrap(cursor: Cursor, payload: Payload, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(payload.data) + except DecodeError as error: + # An item another publisher put on this topic, or a corrupt one: + # skip and say so, so one bad record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None + + +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + +class _InstanceStream: """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed @@ -85,7 +151,7 @@ def _tail(self, from_offset: int) -> list[dict[str, Any]]: { "offset": offset, "topic": topic, - "data": base64.b64encode(payload.data).decode("ascii"), + "data": base64.b64encode(payload.SerializeToString()).decode("ascii"), } for offset, topic, payload in self.stream.items_from(from_offset) ] @@ -105,39 +171,45 @@ def _registered_stream() -> WorkflowStream | None: return stream -def _runtime() -> _Runtime: +def _instance() -> _InstanceStream: # Found on the instance rather than in a process-level map keyed by run # id: the SDK rebuilds an evicted workflow from history as a new object, # and a map would hand that object the stale log with its unregistered # handlers and the records of a task that failed. stream = _registered_stream() - return _Runtime() if stream is None else _Runtime(stream) + return _InstanceStream() if stream is None else _InstanceStream(stream) class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state.""" - def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + def __init__( + self, stream: WorkflowStream, topic: str, start: int, run_id: str + ) -> None: self._stream = stream - self._shipped_topic = shipped_topic - self._cursor = start + self._topic = topic + self._offset = start + self._run_id = run_id self._closed = False - async def next_batch(self) -> list[tuple[Cursor, bytes]]: + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: while True: if self._closed: raise StopAsyncIteration await workflow.wait_condition( - lambda: self._closed or self._stream.next_offset > self._cursor + lambda: self._closed or self._stream.next_offset > self._offset ) if self._closed: raise StopAsyncIteration - batch = [ - (Cursor(str(offset)), payload.data) - for offset, topic, payload in self._stream.items_from(self._cursor) - if topic == self._shipped_topic - ] - self._cursor = self._stream.next_offset + batch: list[tuple[Cursor, WireRecord]] = [] + for offset, topic, payload in self._stream.items_from(self._offset): + if topic != self._topic: + continue + cursor = _cursor(self._run_id, offset) + wire = _unwrap(cursor, payload, workflow.logger.warning) + if wire is not None: + batch.append((cursor, wire)) + self._offset = self._stream.next_offset if batch: return batch @@ -146,20 +218,51 @@ def close(self) -> None: class _WSWriteSink: - def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: - self._handle = stream.topic(shipped_topic) + def __init__(self, stream: WorkflowStream, topic: str) -> None: + self._handle = stream.topic(topic) - async def publish(self, frame: bytes) -> None: + def publish(self, record: WireRecord) -> None: # Appending to workflow state commits with the task, and a poll # Update's result rides the same task completion, so a failed task # leaks nothing: rule 1 through the shipped mechanics. - payload = workflow.payload_converter().to_payloads([frame])[0] - self._handle.publish(payload) + self._handle.publish(_wrap(record)) -def _entry_data(payload: Payload) -> str: - # The documented wire form of PublishEntry.data. - return base64.b64encode(payload.SerializeToString()).decode("ascii") +class _WSWorkflowProvider: + """The workflow half: the shipped stream object of the running instance.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's log is its own" + ) + start = named[1] + 1 + return _WSReadSource(_instance().stream, topic, start, run_id) + + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _WSWriteSink(_instance().stream, topic) + + def on_workflow_start(self) -> None: + # Registered before the first task completes, because an outside + # reader can poll before workflow code has opened anything, and an + # Update with no handler yet is rejected rather than held. + _instance() + + async def on_workflow_finish(self) -> None: + # An Option 0 stream dies with its run, and a parked long-poll Update + # would otherwise hold completion open. Same recipe the shipped + # feature documents before a return or a continue-as-new. + stream = _registered_stream() + if stream is None: + return + stream.detach_pollers() + await workflow.wait_condition(workflow.all_handlers_finished) class WorkflowStreamsProducer: @@ -180,16 +283,14 @@ class WorkflowStreamsProducer: def __init__( self, handle: Any, - converter: Any, - stream: str, + converter: PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on ``handle``.""" + """Bind this producer to ``topic`` on the workflow behind ``handle``.""" self._handle = handle self._converter = converter - self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt @@ -198,8 +299,9 @@ def __init__( self._pending: tuple[list[PublishEntry], int] | None = None @property - def _shipped_topic(self) -> str: - return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -207,152 +309,258 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: + def _publisher_id(self) -> str: return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> None: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the shipped publish Signal. - Always ``None``: this transport learns positions at read time. + Always ``None``: this transport learns positions at read time, so a + caller that wants to follow from now asks + :meth:`WorkflowStreamsHandle.latest`. """ if not values: return None - await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + await self._send([(RecordKind.DATA, value) for value in values]) return None async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - await self._send([(RecordKind.FINISH, b"")]) + """Write ``FINISH`` for this producer on this topic.""" + await self._send([(RecordKind.FINISH, None)]) - def _frames( - self, bodies: list[tuple[RecordKind, bytes]] + def _entries( + self, batch: list[tuple[RecordKind, Any]] ) -> tuple[list[PublishEntry], int]: sequence = self._sequence entries = [] - for kind, body in bodies: - frame = _frame.encode( + for kind, value in batch: + wire = to_wire( + self._converter, topic=self._topic, kind=kind, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, sequence=sequence, - body=body, ) sequence += 1 entries.append( - PublishEntry( - topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) - ) + PublishEntry(topic=self._topic, data=_entry_data(_wrap(wire))) ) return entries, sequence - async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: - entries, next_sequence = self._frames(bodies) + async def _send(self, batch: list[tuple[RecordKind, Any]]) -> None: + entries, next_sequence = self._entries(batch) if self._pending is not None and self._pending[0] != entries: # The caller moved on from a batch whose Signal raised. It goes # first, under the signal sequence it already had, so a copy the # server did accept is dropped and one it never saw lands. The # new batch is then renumbered behind it. await self._signal(*self._pending) - entries, next_sequence = self._frames(bodies) + entries, next_sequence = self._entries(batch) await self._signal(entries, next_sequence) async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: signal_sequence = self._signal_sequence + 1 self._pending = (entries, next_sequence) - await self._handle.signal( - PUBLISH_SIGNAL_NAME, - PublishInput( - items=entries, - publisher_id=self._provider_id, - sequence=signal_sequence, - ), - ) + try: + await self._handle.signal( + PUBLISH_SIGNAL_NAME, + PublishInput( + items=entries, + publisher_id=self._publisher_id, + sequence=signal_sequence, + ), + ) + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._handle.id!r} was not found, so its stream " + "cannot be appended to" + ) from error + raise self._signal_sequence = signal_sequence self._sequence = next_sequence self._pending = None - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - return payload.SerializeToString() - -class WorkflowStreamsConsumer: - """Reads through the shipped long-poll Update, with shared supersession.""" +class WorkflowStreamsHandle: + """One workflow's log from outside, through the shipped poll Update and a tail Query.""" def __init__( self, - stream_client: WorkflowStreamClient, - stream: str, + client: Client, + workflow_id: str, + run_id: str | None, poll_cooldown: timedelta, ) -> None: - """Read what ``stream_client`` reaches, one long poll at a time.""" - self._client = stream_client - self._stream = stream - self._shipped_topic = f"{_IN}{stream}" if stream else None + """Address ``workflow_id``'s log, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id self._poll_cooldown = poll_cooldown + self._converter = client.data_converter.payload_converter - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, waiting for ones not written yet.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - next_offset = int(after.token) + 1 if after.token else 0 - if self._shipped_topic is not None: - shipped = [self._shipped_topic] - elif topic is not None: - shipped = [f"{_OUT}{topic}"] - else: - shipped = None - subscription = self._client.subscribe( - shipped, - from_offset=next_offset, - result_type=RawValue, - poll_cooldown=self._poll_cooldown, + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) + + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning ) - try: - async for item in subscription: - next_offset = item.offset + 1 - for out in self._record( - attempts, - item.offset, - item.topic, - item.data.payload.data, - topic, - type, - ): - yield out - finally: - # Lets go of the parked poll when the caller stops early. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - # The subscription ends when the workflow is closing or closed. What - # landed after the last poll is still in workflow state, so the tail - # comes back by Query rather than being lost with the run. - for offset, shipped_topic, frame in await self._tail(next_offset): - for out in self._record( - attempts, offset, shipped_topic, frame, topic, type + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + handle = self._handle(run_id) + next_offset = offset + # Pinned to one run, with no client for the shipped chain + # following: a log is not carried across continue-as-new, so + # the successor's offsets start over and this loop is what + # moves from one run to the next. + subscription = WorkflowStreamClient(handle).subscribe( + topic, + from_offset=offset, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + try: + async for item in subscription: + next_offset = item.offset + 1 + if item.topic != topic: + continue + for record in self._records( + decoder, run_id, item.offset, item.data.payload + ): + yield record + except RPCError as error: + # The run closed and its poll Update went with it, or the + # workflow does not exist; the describe below tells which. + if error.status != RPCStatusCode.NOT_FOUND: + raise + finally: + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() + status = await self._status(handle) + if status is None: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} run {run_id!r} was not found" + ) + if status == WorkflowExecutionStatus.RUNNING: + # The subscription ended early, on an RPC timeout for + # instance; the run is still open, so pick up where it left. + offset = next_offset + continue + # What landed after the last poll is still in workflow state, so + # the tail comes back by Query rather than being lost with the run. + for offset_, shipped_topic, payload in await self._tail( + handle, next_offset + ): + if shipped_topic != topic: + continue + for record in self._records(decoder, run_id, offset_, payload): + yield record + if ( + self._run_id is not None + or status != WorkflowExecutionStatus.CONTINUED_AS_NEW ): - yield out + return + successor = await self._successor(handle) + if successor is None: + return + run_id, offset = successor, 0 + + def _records( + self, decoder: RecordDecoder, run_id: str, offset: int, payload: Payload + ) -> list[StreamRecord[Any]]: + cursor = _cursor(run_id, offset) + wire = _unwrap(cursor, payload, logger.warning) + if wire is None: + return [] + return decoder.decode(cursor, wire) + + def _handle(self, run_id: str | None) -> WorkflowHandle[Any, Any]: + return self._client.get_workflow_handle(self._workflow_id, run_id=run_id) - async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: + async def _status( + self, handle: WorkflowHandle[Any, Any] + ) -> WorkflowExecutionStatus | None: try: - wire = await self._client.handle.query( - _TAIL_QUERY, from_offset, result_type=list - ) + return (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + return None + raise + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + try: + run_id = (await self._handle(None).describe()).run_id + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert run_id is not None + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + try: + async for event in self._handle(run_id).fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The run's History is gone: the chain's retained part starts here. + return None + + async def _successor(self, handle: WorkflowHandle[Any, Any]) -> str | None: + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + async for event in events: + if event.HasField("workflow_execution_continued_as_new_event_attributes"): + attributes = event.workflow_execution_continued_as_new_event_attributes + return attributes.new_execution_run_id or None + return None + + async def _tail( + self, handle: WorkflowHandle[Any, Any], from_offset: int + ) -> list[tuple[int, str, Payload]]: + try: + wire = await handle.query(_TAIL_QUERY, from_offset, result_type=list) except WorkflowQueryFailedError as error: if "expected but not found" not in str(error): raise @@ -365,150 +573,76 @@ async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: # The History is gone; nothing is left to serve. return [] return [ - (item["offset"], item["topic"], base64.b64decode(item["data"])) + ( + item["offset"], + item["topic"], + Payload.FromString(base64.b64decode(item["data"])), + ) for item in wire ] - def _record( - self, - attempts: AttemptTracker, - offset: int, - shipped_topic: str, - frame: bytes, - topic: str | None, - type: type | None, - ) -> list[StreamRecord[Any]]: - if self._shipped_topic is None and not shipped_topic.startswith(_OUT): - return [] - if self._shipped_topic is not None and shipped_topic != self._shipped_topic: - return [] - cursor = Cursor(str(offset)) + async def latest(self, *, topic: str) -> Cursor: + """The newest position in the log, which orders every topic of this workflow. + + The log is one per run, so the cursor names the run it was read from: + the pinned run, or the latest run of the chain. + """ + _require_topic(topic) + handle = self._handle(self._run_id) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning("skipping stream record at %s: %s", cursor, error) - return [] - if topic is not None and frame_topic != topic: - return [] - out: list[StreamRecord[Any]] = [] - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - out.append(superseded) - out.append( - StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + description = await handle.describe() + head = await WorkflowStreamClient(handle).get_offset() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + run_id = description.run_id + assert run_id is not None + if head > 0: + return _cursor(run_id, head - 1) + # An empty log on the chain's first run is the beginning of the + # stream; on a successor it is a position of its own, because + # BEGINNING would send a chain-following read back to the first run. + if await self._predecessor(run_id) is None: + return BEGINNING + return _cursor(run_id, -1) + + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> WorkflowStreamsProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return WorkflowStreamsProducer( + self._handle(self._run_id), self._converter, topic, producer_id, attempt ) - return out - - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one log per workflow, whatever the topic - head = await self._client.get_offset() - return Cursor(str(head - 1)) if head > 0 else BEGINNING - - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - converter = self._client.payload_converter - if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] - - -class _WorkflowStreamsProvider: - name = "workflow_streams" - - def __init__(self) -> None: - self._poll_cooldown = timedelta(milliseconds=100) - - def configure(self, **options: Any) -> None: - cooldown = options.pop("poll_cooldown", None) - if cooldown is not None: - self._poll_cooldown = cooldown - if options: - raise TypeError( - "the workflow_streams provider takes only poll_cooldown, " - f"got {sorted(options)}" - ) - - def worker_options(self) -> dict[str, Any]: - return {} - def prepare(self) -> None: - """Register the shipped publish signal and poll update handlers. - Done here rather than on the first read, because an outside reader - can poll before workflow code has opened anything, and an update with - no handler yet is rejected rather than held. - """ - _runtime() +class WorkflowStreamsProvider(ProviderPlugin): + """The provider over the shipped Workflow Streams transport.""" - def drain(self) -> None: - """Release parked pollers so the workflow can return. + def __init__( + self, *, poll_cooldown: timedelta = timedelta(milliseconds=100) + ) -> None: + """Create the provider. - An Option 0 stream dies with its workflow, and a parked long-poll - Update would otherwise hold completion open. Call it right before - the workflow returns, the same obligation the shipped feature's - ``detach_pollers`` documents. + Args: + poll_cooldown: How long an outside reader that is caught up waits + between polls. Backlogs drain at full speed regardless. """ - stream = _registered_stream() - if stream is not None: - stream.detach_pollers() - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Ignored: a publish Signal is a workflow event, so the wait below - # wakes on delivery and nothing is held between records. - del idle_timeout - return _WSReadSource( - _runtime().stream, - f"{_IN}{stream}", - int(after.token) + 1 if after.token else 0, - ) - - def open_write(self, topic: str) -> WriteSink: - return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> WorkflowStreamsProducer: - return WorkflowStreamsProducer( - client.get_workflow_handle(workflow_id), - client.data_converter.payload_converter, - stream, - topic, - producer_id, - attempt, - ) + self._poll_cooldown = poll_cooldown - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> WorkflowStreamsConsumer: - return WorkflowStreamsConsumer( - WorkflowStreamClient.create(client, workflow_id), - stream, - self._poll_cooldown, - ) + def workflow_provider(self) -> _WSWorkflowProvider: + """The workflow half, over the running instance's shipped stream object.""" + return _WSWorkflowProvider() + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> WorkflowStreamsHandle: + """A handle on ``workflow_id``'s log; without ``run_id`` it follows the chain.""" + return WorkflowStreamsHandle(client, workflow_id, run_id, self._poll_cooldown) -_provider.register("workflow_streams", _WorkflowStreamsProvider) + async def close(self) -> None: + """Nothing to release: the provider holds no connection of its own.""" From d9548756d81b78fe877ea0def920c3c049b74cc7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 400/831] Pinned Core to the stream revision and regenerated bridge protos. --- .gitmodules | 2 +- .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 613 ++++++-------- .../workflow_activation_pb2.pyi | 68 ++ .../workflow_commands_pb2.py | 800 +++++++----------- .../workflow_commands_pb2.pyi | 90 ++ temporalio/bridge/sdk-core | 2 +- 7 files changed, 737 insertions(+), 840 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..ae7639820 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamMessages, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamMessages", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..0e1b3a1e6 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,430 +2,311 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.update.v1 import ( - message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, -) -from temporalio.bridge.proto.activity_result import ( - activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' -) - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ - "HeadersEntry" -] -_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStart" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartSuccess" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartFailure" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartCancelled" -] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecution" -] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveSignalExternalWorkflow" -] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveRequestCancelExternalWorkflow" -] -_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveNexusOperationStart" -] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] -WorkflowActivation = _reflection.GeneratedProtocolMessageType( - "WorkflowActivation", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }, -) + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] +_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] +_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] +WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( - "WorkflowActivationJob", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }, -) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }) _sym_db.RegisterMessage(WorkflowActivationJob) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType( - "InitializeWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _INITIALIZEWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }, -) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }) +_sym_db.RegisterMessage(DeliverStreamMessages) + +InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _INITIALIZEWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType( - "FireTimer", - (_message.Message,), - { - "DESCRIPTOR": _FIRETIMER, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }, -) +FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { + 'DESCRIPTOR' : _FIRETIMER, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType( - "ResolveActivity", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEACTIVITY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }, -) +ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }, -) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartSuccess", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }, -) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartFailure", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }, -) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartCancelled", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }, -) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }, -) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( - "UpdateRandomSeed", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERANDOMSEED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }, -) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERANDOMSEED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType( - "QueryWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _QUERYWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }, -) +QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _QUERYWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }, -) +CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType( - "SignalWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }, -) +SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType( - "NotifyHasPatch", - (_message.Message,), - { - "DESCRIPTOR": _NOTIFYHASPATCH, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }, -) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { + 'DESCRIPTOR' : _NOTIFYHASPATCH, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveSignalExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }, -) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveRequestCancelExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }, -) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType( - "DoUpdate", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }, - ), - "DESCRIPTOR": _DOUPDATE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }, -) +DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }) + , + 'DESCRIPTOR' : _DOUPDATE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperationStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }, -) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }, -) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType( - "RemoveFromCache", - (_message.Message,), - { - "DESCRIPTOR": _REMOVEFROMCACHE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }, -) +RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { + 'DESCRIPTOR' : _REMOVEFROMCACHE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" - ) - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' + _WORKFLOWACTIVATION._serialized_start=570 + _WORKFLOWACTIVATION._serialized_end=1116 + _WORKFLOWACTIVATIONJOB._serialized_start=1119 + _WORKFLOWACTIVATIONJOB._serialized_end=2582 + _DELIVERSTREAMMESSAGES._serialized_start=2585 + _DELIVERSTREAMMESSAGES._serialized_end=2724 + _INITIALIZEWORKFLOW._serialized_start=2727 + _INITIALIZEWORKFLOW._serialized_end=4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 + _FIRETIMER._serialized_start=4133 + _FIRETIMER._serialized_end=4157 + _RESOLVEACTIVITY._serialized_start=4159 + _RESOLVEACTIVITY._serialized_end=4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 + _UPDATERANDOMSEED._serialized_start=5045 + _UPDATERANDOMSEED._serialized_end=5088 + _QUERYWORKFLOW._serialized_start=5091 + _QUERYWORKFLOW._serialized_end=5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 + _CANCELWORKFLOW._serialized_start=5353 + _CANCELWORKFLOW._serialized_end=5385 + _SIGNALWORKFLOW._serialized_start=5388 + _SIGNALWORKFLOW._serialized_end=5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 + _NOTIFYHASPATCH._serialized_start=5679 + _NOTIFYHASPATCH._serialized_end=5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 + _DOUPDATE._serialized_start=5917 + _DOUPDATE._serialized_end=6248 + _DOUPDATE_HEADERSENTRY._serialized_start=4052 + _DOUPDATE_HEADERSENTRY._serialized_end=4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 + _RESOLVENEXUSOPERATION._serialized_start=6407 + _RESOLVENEXUSOPERATION._serialized_end=6496 + _REMOVEFROMCACHE._serialized_start=6499 + _REMOVEFROMCACHE._serialized_end=6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..eab815fc9 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.update.v1.message_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_messages(self) -> global___DeliverStreamMessages: + """A range of a stream the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +327,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +335,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -368,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -421,6 +431,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_messages", "remove_from_cache", ] | None @@ -1440,6 +1451,63 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0cdc02c6b..ccfa1a016 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,552 +2,408 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" - +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.sdk.v1 import ( - event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, -) -from temporalio.api.sdk.v1 import ( - user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' -) - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] -_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ - "HeadersEntry" -] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ - "RequestCancelLocalActivity" -] -_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CompleteWorkflowExecution" -] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ContinueAsNewWorkflowExecution" -] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "StartChildWorkflowExecution" -] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CancelChildWorkflowExecution" -] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "RequestCancelExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "SignalExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( - _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ - "UpsertWorkflowSearchAttributes" -] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ - "NexusHeaderEntry" -] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ - "RequestCancelNexusOperation" -] -WorkflowCommand = _reflection.GeneratedProtocolMessageType( - "WorkflowCommand", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWCOMMAND, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }, -) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] +_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] +_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] +_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] +WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWCOMMAND, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }) _sym_db.RegisterMessage(WorkflowCommand) -StartTimer = _reflection.GeneratedProtocolMessageType( - "StartTimer", - (_message.Message,), - { - "DESCRIPTOR": _STARTTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }, -) +AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _ADDSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }) +_sym_db.RegisterMessage(AddStreamMessages) + +SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTREAM, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }) +_sym_db.RegisterMessage(SubscribeStream) + +StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { + 'DESCRIPTOR' : _STARTTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType( - "CancelTimer", - (_message.Message,), - { - "DESCRIPTOR": _CANCELTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }, -) +CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { + 'DESCRIPTOR' : _CANCELTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULEACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }, -) +ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleLocalActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULELOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }, -) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }, -) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelLocalActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }, -) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType( - "QueryResult", - (_message.Message,), - { - "DESCRIPTOR": _QUERYRESULT, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }, -) +QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { + 'DESCRIPTOR' : _QUERYRESULT, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType( - "QuerySuccess", - (_message.Message,), - { - "DESCRIPTOR": _QUERYSUCCESS, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }, -) +QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { + 'DESCRIPTOR' : _QUERYSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CompleteWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }, -) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "FailWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _FAILWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }, -) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ContinueAsNewWorkflowExecution", - (_message.Message,), - { - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }, - ), - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }, -) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }) + , + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }, -) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType( - "SetPatchMarker", - (_message.Message,), - { - "DESCRIPTOR": _SETPATCHMARKER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }, -) +SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { + 'DESCRIPTOR' : _SETPATCHMARKER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "StartChildWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }, - ), - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }, - ), - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }, -) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }) + , + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }) + , + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }, -) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "RequestCancelExternalWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }, -) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "SignalExternalWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }, -) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelSignalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELSIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }, -) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( - "UpsertWorkflowSearchAttributes", - (_message.Message,), - { - "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }, -) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { + 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( - "ModifyWorkflowProperties", - (_message.Message,), - { - "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }, -) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { + 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType( - "UpdateResponse", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERESPONSE, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }, -) +UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERESPONSE, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( - "ScheduleNexusOperation", - (_message.Message,), - { - "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( - "NexusHeaderEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }, - ), - "DESCRIPTOR": _SCHEDULENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }, -) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { + + 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( - "RequestCancelNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }, -) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" - ) - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8672 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8760 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4339 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4341 - _REQUESTCANCELACTIVITY._serialized_end = 4377 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4379 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4420 - _QUERYRESULT._serialized_start = 4423 - _QUERYRESULT._serialized_end = 4579 - _QUERYSUCCESS._serialized_start = 4581 - _QUERYSUCCESS._serialized_end = 4646 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4648 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4724 - _FAILWORKFLOWEXECUTION._serialized_start = 4726 - _FAILWORKFLOWEXECUTION._serialized_end = 4800 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4803 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5717 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5719 - _CANCELWORKFLOWEXECUTION._serialized_end = 5795 - _SETPATCHMARKER._serialized_start = 5797 - _SETPATCHMARKER._serialized_end = 5851 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5854 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7028 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7030 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7104 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7107 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7249 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7252 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7651 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7653 - _CANCELSIGNALWORKFLOW._serialized_end = 7688 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7690 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7791 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7793 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7872 - _UPDATERESPONSE._serialized_start = 7875 - _UPDATERESPONSE._serialized_end = 8085 - _SCHEDULENEXUSOPERATION._serialized_start = 8088 - _SCHEDULENEXUSOPERATION._serialized_end = 8626 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8576 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8626 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8628 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8670 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' + _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 + _WORKFLOWCOMMAND._serialized_start=556 + _WORKFLOWCOMMAND._serialized_end=2794 + _ADDSTREAMMESSAGES._serialized_start=2796 + _ADDSTREAMMESSAGES._serialized_end=2891 + _SUBSCRIBESTREAM._serialized_start=2893 + _SUBSCRIBESTREAM._serialized_end=2951 + _STARTTIMER._serialized_start=2953 + _STARTTIMER._serialized_end=3036 + _CANCELTIMER._serialized_start=3038 + _CANCELTIMER._serialized_end=3064 + _SCHEDULEACTIVITY._serialized_start=3067 + _SCHEDULEACTIVITY._serialized_end=3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 + _SCHEDULELOCALACTIVITY._serialized_start=3894 + _SCHEDULELOCALACTIVITY._serialized_end=4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 + _REQUESTCANCELACTIVITY._serialized_start=4646 + _REQUESTCANCELACTIVITY._serialized_end=4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 + _QUERYRESULT._serialized_start=4728 + _QUERYRESULT._serialized_end=4884 + _QUERYSUCCESS._serialized_start=4886 + _QUERYSUCCESS._serialized_end=4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 + _FAILWORKFLOWEXECUTION._serialized_start=5031 + _FAILWORKFLOWEXECUTION._serialized_end=5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELWORKFLOWEXECUTION._serialized_start=6024 + _CANCELWORKFLOWEXECUTION._serialized_end=6100 + _SETPATCHMARKER._serialized_start=6102 + _SETPATCHMARKER._serialized_end=6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELSIGNALWORKFLOW._serialized_start=7958 + _CANCELSIGNALWORKFLOW._serialized_end=7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 + _UPDATERESPONSE._serialized_start=8180 + _UPDATERESPONSE._serialized_end=8390 + _SCHEDULENEXUSOPERATION._serialized_start=8393 + _SCHEDULENEXUSOPERATION._serialized_end=8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index ad4a5f487..040a2267c 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,6 +23,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,10 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: ... + @property + def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( self, *, @@ -215,6 +222,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... def HasField( self, @@ -243,6 +252,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -298,6 +311,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -350,6 +367,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "add_stream_messages", ] | None ): ... @@ -386,6 +405,77 @@ class StartTimer(google.protobuf.message.Message): global___StartTimer = StartTimer +class AddStreamMessages(google.protobuf.message.Message): + """Publish a batch of messages to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand messages cost the same in History as one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessages = AddStreamMessages + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 85b71d7ec..3d1f82e66 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 85b71d7ecd4f2bf677fa1cee17f3fbc1ab10f1b9 +Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 From 4611efad5de8654883a71e77b1d2cbd75061cf3f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 401/831] Added the vendored stream API protos. --- scripts/gen_stream_protos.py | 161 +++++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 138 ++++ .../api/streamservice/v1/message_pb2.py | 46 ++ .../api/streamservice/v1/message_pb2.pyi | 47 ++ .../api/streamservice/v1/message_pb2_grpc.py | 24 + .../streamservice/v1/request_response_pb2.py | 138 ++++ .../streamservice/v1/request_response_pb2.pyi | 434 ++++++++++++ .../v1/request_response_pb2_grpc.py | 24 + .../api/streamservice/v1/service_pb2.py | 38 ++ .../api/streamservice/v1/service_pb2.pyi | 5 + .../api/streamservice/v1/service_pb2_grpc.py | 616 ++++++++++++++++++ .../api/streamservice/v1/stream_state_pb2.py | 56 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 114 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 24 + 15 files changed, 1865 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..e66f8abb4 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,161 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, "-m", "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--pyi_out={out}", + f"--grpc_python_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..31f99bded --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,138 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + STREAM_MESSAGE_KIND_DATA, + STREAM_MESSAGE_KIND_FLUSH, + STREAM_MESSAGE_KIND_UNSPECIFIED, + StreamMessage, + StreamMessageBatch, + StreamMessageKind, +) + +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "STREAM_MESSAGE_KIND_DATA", + "STREAM_MESSAGE_KIND_FLUSH", + "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamLifecycle", + "StreamListEntry", + "StreamMessage", + "StreamMessageBatch", + "StreamMessageKind", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..b4fe8e68a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/message.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/message.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z None: ... + BODY_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + body: _message_pb2.Payload + metadata: _containers.MessageMap[str, _message_pb2.Payload] + topic: str + topic_sequence: int + kind: StreamMessageKind + offset: int + def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + +class StreamMessageBatch(_message.Message): + __slots__ = ("messages",) + MESSAGES_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] + def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..b1383816d --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..60dafee45 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/request_response.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/request_response.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + +class CreateStreamOutput(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class AddMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + expected_offset: int + use_expected_offset: bool + owner_epoch: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + +class AddMessagesOutput(_message.Message): + __slots__ = ("first_offset", "next_offset", "count", "deduplicated") + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] + first_offset: int + next_offset: int + count: int + deduplicated: bool + def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + +class FinishWritingInput(_message.Message): + __slots__ = ("namespace", "stream_id", "producer_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + producer_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + +class FinishWritingOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SubscribeWorkflowInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + stream_id: str + start_offset: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class SubscribeWorkflowOutput(_message.Message): + __slots__ = ("start_offset",) + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + start_offset: int + def __init__(self, start_offset: _Optional[int] = ...) -> None: ... + +class PollMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class PollMessagesOutput(_message.Message): + __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") + MESSAGES_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + next_offset: int + head_offset: int + closed: bool + close_reason: _message_pb2_1.Payload + def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class DescribeStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class PollWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class DescribeWorkflowStreamInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + +class AddWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + +class DescribeStreamOutput(_message.Message): + __slots__ = ("state",) + STATE_FIELD_NUMBER: _ClassVar[int] + state: _stream_state_pb2.StreamState + def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + +class CloseStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "reason") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + reason: _message_pb2_1.Payload + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class CloseStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TruncateStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "new_base_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + new_base_offset: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + +class TruncateStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class DeleteStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class CreateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CreateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + +class CreateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CreateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + +class AddMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + +class AddMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class FinishWritingRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: FinishWritingInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + +class FinishWritingResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: FinishWritingOutput + def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: SubscribeWorkflowInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: SubscribeWorkflowOutput + def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + +class PollMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + +class PollMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeWorkflowStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class CloseStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CloseStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + +class CloseStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CloseStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + +class TruncateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: TruncateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + +class TruncateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: TruncateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + +class ListStreamsInput(_message.Message): + __slots__ = ("namespace", "page_size", "next_page_token", "query") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + namespace: str + page_size: int + next_page_token: bytes + query: str + def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + +class StreamListEntry(_message.Message): + __slots__ = ("stream_id", "run_id") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + stream_id: str + run_id: str + def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + +class ListStreamsOutput(_message.Message): + __slots__ = ("streams", "next_page_token") + STREAMS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] + next_page_token: bytes + def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + +class ListStreamsRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: ListStreamsInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + +class ListStreamsResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: ListStreamsOutput + def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + +class DeleteStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DeleteStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + +class DeleteStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DeleteStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..87cc91022 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..7f376c28e --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class StreamServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True) + self.AddMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True) + self.FinishWriting = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True) + self.SubscribeWorkflow = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True) + self.PollMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True) + self.DescribeStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True) + self.PollWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True) + self.DescribeWorkflowStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True) + self.AddWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True) + self.CloseStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True) + self.TruncateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True) + self.ListStreams = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True) + self.DeleteStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True) + + +class StreamServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def CreateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinishWriting(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeWorkflow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollWorkflowMessages(self, request, context): + """Routed on the owner, because the stream it reads has no id of its own. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeWorkflowStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkflowMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TruncateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListStreams(self, request, context): + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_StreamServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateStream': grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + 'AddMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + 'FinishWriting': grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + 'PollMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + 'DescribeStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + 'CloseStream': grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + 'TruncateStream': grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + 'ListStreams': grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + 'DeleteStream': grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class StreamService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinishWriting(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeWorkflow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeWorkflowStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CloseStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def TruncateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListStreams(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..234fa94d0 --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/stream_state.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/stream_state.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z None: ... + class ConsumersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ConsumerCursor + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCERS_FIELD_NUMBER: _ClassVar[int] + CONSUMERS_FIELD_NUMBER: _ClassVar[int] + LIFECYCLE_FIELD_NUMBER: _ClassVar[int] + REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] + head_offset: int + base_offset: int + last_txn_id: int + closed: bool + close_reason: _message_pb2.Payload + owner_epoch: int + bucket_size: int + collection_id: str + producers: _containers.MessageMap[str, ProducerCursor] + consumers: _containers.MessageMap[str, ConsumerCursor] + lifecycle: StreamLifecycle + redirect_run_id: str + close_time: _timestamp_pb2.Timestamp + def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProducerCursor(_message.Message): + __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") + SEQ_FIELD_NUMBER: _ClassVar[int] + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] + FENCED_FIELD_NUMBER: _ClassVar[int] + seq: int + first_offset: int + count: int + content_hash: bytes + fenced: bool + def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + +class ConsumerCursor(_message.Message): + __slots__ = ("workflow_id", "run_id", "offset", "active", "external") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + run_id: str + offset: int + active: bool + external: bool + def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + +class WorkflowStreamCursor(_message.Message): + __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + PENDING_FROM_FIELD_NUMBER: _ClassVar[int] + PENDING_TO_FIELD_NUMBER: _ClassVar[int] + HAS_PENDING_FIELD_NUMBER: _ClassVar[int] + stream_id: str + collection_id: str + bucket_size: int + offset: int + known_head: int + external: bool + pending_from: int + pending_to: int + has_pending: bool + def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + +class StreamLifecycle(_message.Message): + __slots__ = ("retention", "max_items") + RETENTION_FIELD_NUMBER: _ClassVar[int] + MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] + retention: _duration_pb2.Duration + max_items: int + def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..4e128a2aa --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) From c62e02bba2d33e91239e7e85757bb877f6926830 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 402/831] Added the stream client and the workflow stream surface. --- temporalio/client_stream.py | 476 +++++++++++++++++++++++ temporalio/worker/_workflow_instance.py | 142 +++++++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 119 ++++++ tests/test_client_stream.py | 128 ++++++ tests/worker/test_workflow_stream.py | 113 ++++++ tests/worker/test_workflow_stream_e2e.py | 244 ++++++++++++ 7 files changed, 1232 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py create mode 100644 tests/worker/test_workflow_stream.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..75388c9c9 --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,476 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` + instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, AsyncIterator, Optional, Sequence + +import google.protobuf.duration_pb2 + +import temporalio.api.common.v1 +import temporalio.api.streamservice.v1 as stream +from temporalio.api.streamservice.v1 import service_pb2_grpc + +__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] + + +@dataclass(frozen=True) +class Message: + """One item read from a stream. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back messages whose offsets are not contiguous. To resume at the + boundary of a whole read, checkpoint the ``next_offset`` that + :meth:`StreamHandle.read` returns instead. + """ + + data: bytes + topic: str = "" + offset: int = 0 + """Where this message sits in the whole stream. + + A topic filter leaves gaps, so a reader that resumes between messages has + to take this rather than count what it received. + """ + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. + """ + + messages: list[Message] + next_offset: int + head_offset: int + closed: bool + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + self._stub = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> "StreamClient": + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + try: + import grpc + except ImportError as err: + raise RuntimeError( + "temporalio.client_stream requires the grpc extra: " + "pip install 'temporalio[grpc]'" + ) from err + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: Optional[float] = None, + max_items: Optional[int] = None, + ) -> "StreamHandle": + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many messages remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await self._stub.CreateStream( + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ) + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> "StreamHandle": + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "" + ) -> "WorkflowStreamHandle": + """Open a stream a workflow publishes to. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.add_stream_messages`` writes to when it is given none. + + The stream is created by the workflow's first publish. Reading one that + does not exist yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when the + workflow publishes. + """ + return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + + +class StreamHandle: + """A handle to one stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append messages and return the offset the first one landed at. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice. Without them the append is at-least-once, which is + only the right trade when duplicates are harmless. + """ + response = await self._stub.AddMessages( + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, returning the messages and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=offset, + topics=list(topics), + wait_new_messages=True, + ) + ) + ) + out = response.frontend_response + for msg in out.messages: + yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) + offset = out.next_offset + if out.closed and offset >= out.head_offset: + return + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await self._stub.FinishWriting( + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ) + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await self._stub.CloseStream( + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await self._stub.DescribeStream( + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow publishes to. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, stub: Any, namespace: str, workflow_id: str, name: str = "" + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await self._stub.AddWorkflowMessages( + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for msg in page.messages: + yield msg + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_messages: int = 0, + wait: bool = True, + ) -> "Page": + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + """ + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return Page( + messages=[ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await self._stub.DescribeWorkflowStream( + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + ) + ) + ) + return response.frontend_response.state diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 26f796e57..66833dd8c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -272,6 +273,71 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# which would replay and re-issue the same rejected command forever, into an +# error the workflow author can see. +_MAX_STREAM_MESSAGES_PER_BATCH = 1000 + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self) -> None: + self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._waiters: list[asyncio.Future] = [] + + def extend( + self, + messages: Sequence[temporalio.api.stream.v1.StreamMessage], + from_offset: int = 0, + ) -> None: + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not messages: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-message field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + self._messages.extend( + temporalio.workflow.DeliveredStreamMessage( + body=message.body.data, + topic=message.topic, + offset=from_offset + index, + ) + for index, message in enumerate(messages) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: + taken, self._messages = self._messages, [] + return taken + + def put_back( + self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._messages[:0] = messages + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._messages) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -401,6 +467,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -616,6 +687,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_messages"): + self._apply_deliver_stream_messages(job.deliver_stream_messages) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1141,6 +1214,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_messages( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer() + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.messages, job.from_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1305,6 +1391,62 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. The + # server treats a repeat subscription to the same stream as a no-op. + self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: + if not messages: + raise ValueError("add_stream_messages needs at least one message") + if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " + f"got {len(messages)}" + ) + command = self._add_command() + command.add_stream_messages.stream_id = stream_id + for body in messages: + # The bodies ride the command and never enter History, so the event + # this produces stays the same size whatever is published here. + message = command.add_stream_messages.messages.add() + message.body.data = body + # Every other Temporal payload names its encoding, and the UI, the + # CLI and any codec server rely on that to decode what they read. + message.body.metadata["encoding"] = b"binary/plain" + message.topic = topic + + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: + return [ + m.body + for m in await self.workflow_read_stream_messages(stream_id, max_messages) + ] + + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[temporalio.workflow.DeliveredStreamMessage]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_messages and len(taken) > max_messages: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_messages:]) + taken = taken[:max_messages] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index f63135bf4..28e711d9b 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -95,6 +95,11 @@ upsert_search_attributes, uuid4, uuid7, + DeliveredStreamMessage, + read_stream, + read_stream_messages, + add_stream_messages, + subscribe_stream, wait_condition, ) from ._definition import ( @@ -233,6 +238,11 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamMessage", + "read_stream", + "read_stream_messages", + "add_stream_messages", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 25523836a..450051456 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -313,6 +313,24 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: ... + + @abstractmethod + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: ... + + @abstractmethod + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[DeliveredStreamMessage]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -949,6 +967,107 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream` returns them. Safe to call again: the server treats + a second subscription to the same stream as a no-op, which is what makes + calling it on every replay harmless. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. + + Args: + stream_id: Stream to consume. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def add_stream_messages( + messages: Sequence[bytes], + *, + stream_id: str = "", + topic: str = "", +) -> None: + """Publish a batch of messages to a stream this workflow owns. + + Returns as soon as the command is issued. The bodies go to the stream's own + log rather than into History, which gets one fixed-size event naming the + offset range, so a batch of a thousand costs History the same as a batch of + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Batch where you can. The event is per call, and a workflow is bounded by the + history event count, so one call with a hundred messages leaves far more + room than a hundred calls with one. + + Args: + messages: Bodies to append, in order. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + topic: Optional topic, which readers can filter on. Offsets are still + assigned over the unfiltered stream. + """ + _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + + +@dataclass(frozen=True) +class DeliveredStreamMessage: + """One message a consuming workflow was given, with where it sat.""" + + body: bytes + topic: str + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_messages( + stream_id: str, *, max_messages: int = 0 +) -> list[DeliveredStreamMessage]: + """Read the next messages, keeping their topic and position. + + Same delivery as :func:`read_stream`. A reader that has to name where it + got to, filter a topic, or hand a position to something outside the + workflow needs more than the bodies. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_messages( + stream_id, max_messages + ) + + +async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: + """Read the next messages of a stream this workflow consumes. + + Waits until at least one message is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. + + Subscribe out of band with the stream client. This only reads what has + already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + + Returns: + The message bodies, in stream order. + """ + return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..f7df3c7a7 --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,128 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import AsyncIterator + +import pytest + +from temporalio.client_stream import StreamClient, StreamHandle + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +@pytest.fixture +async def stream() -> AsyncIterator[StreamHandle]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + finally: + await client.close() + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + assert await stream.append(b"alpha", b"beta") == 0 + assert await stream.append(b"gamma") == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(b"alpha", b"beta", b"gamma") + + messages, next_offset = await stream.read() + assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + assert next_offset == 3 + + messages, next_offset = await stream.read(from_offset=1) + assert [m.data for m in messages] == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(b"alpha") + + messages, next_offset = await stream.read(from_offset=1) + assert messages == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same message twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(b"once", producer_id="p1", sequence=1) + retry = await stream.append(b"once", producer_id="p1", sequence=1) + assert first == retry == 0 + + messages, _ = await stream.read() + assert [m.data for m in messages] == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(b"tok", topic="tokens") + await stream.append(b"prog", topic="progress") + await stream.append(b"tok2", topic="tokens") + + messages, next_offset = await stream.read(topics=["tokens"]) + assert [m.data for m in messages] == [b"tok", b"tok2"] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for message in stream.follow(): + received.append(message.data) + + task = asyncio.create_task(follower()) + await stream.append(b"one") + await asyncio.sleep(0.2) + await stream.append(b"two") + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(b"one", b"two") + await stream.close() + + received = [m.data async for m in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(b"one", b"two") + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..944761cfa --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,113 @@ +"""In-workflow consumption of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering and the workflow-facing read directly, which is the part +this SDK owns; the delivery decision itself lives in the server and sdk-core. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.worker._workflow_instance import ( + _StreamBuffer, + _WorkflowInstanceImpl, +) + + +def message(body: bytes) -> api_stream.StreamMessage: + return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"one"), message(b"two")]) + + assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([message(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert [m.body.data for m in buffer.take()] == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert [m.body.data for m in buffer.take()] == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream``, so a test that reimplements + it proves nothing about the code that ships. + """ + + def __init__(self) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self.read_only_calls: list[str] = [] + + def _assert_not_read_only(self, action: str) -> None: + self.read_only_calls.append(action) + + +@pytest.mark.parametrize("max_messages", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: + stub = _ReadOnlyStub() + bodies = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b) for b in bodies]) + + got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + + assert got == bodies[:max_messages] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + + if len(stub._stream_buffers["s"]): + rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert got + rest == bodies + else: + assert got == bodies + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub() + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b"a")]) + + await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..579327217 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,244 @@ +"""A workflow publishing to a stream it owns and reading its own messages back. + +Path A and Path C together, both from workflow code. Needs a Temporal server +built from the AI-198 branch, because neither the stream service nor the +commands exist on a released one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest +from temporalio.api.enums.v1 import EventType + +from temporalio import workflow +from temporalio.client import Client +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +STREAM = "output" + +# Event type numbers rather than names: this SDK's api protos predate both +# events, so the attributes arrive as unknown fields and only the type is +# readable here. The server's own tests are where the offsets are asserted. +EVENT_STREAM_SUBSCRIBED = 61 +EVENT_STREAM_MESSAGES_ADDED = 62 + + +@workflow.defn +class PublishAndRead: + @workflow.run + async def run(self) -> list[str]: + # Published before subscribing, because a subscription resolves against + # the streams the workflow already owns and this is what creates one. + workflow.add_stream_messages( + [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + ) + workflow.add_stream_messages([b"delta"], stream_id=STREAM) + + workflow.subscribe_stream(STREAM, start_offset=0) + + received: list[str] = [] + while len(received) < 4: + for body in await workflow.read_stream(STREAM): + received.append(body.decode()) + return received + + +async def test_workflow_reads_back_what_it_published() -> None: + client = await Client.connect(TARGET or "") + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=wf_id, task_queue=task_queue + ), + timeout=60, + ) + + assert result == ["alpha", "beta", "gamma", "delta"] + + counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + + # Two calls carrying four messages, so two events: the event is per batch, + # which is what makes batching free. + assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class PublishOnSignal: + """Publishes a token per signal, which is the shape an agent turn has.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + self._done = False + + @workflow.run + async def run(self) -> int: + published = 0 + while True: + await workflow.wait_condition(lambda: self._pending or self._done) + while self._pending: + workflow.add_stream_messages([self._pending.pop(0).encode()]) + published += 1 + if self._done: + return published + + @workflow.signal + async def emit(self, token: str) -> None: + self._pending.append(token) + + @workflow.signal + async def finish(self) -> None: + self._done = True + + +async def test_a_client_follows_what_a_workflow_publishes() -> None: + """The harness shape: the workflow writes, something outside it reads live. + + A stream a workflow owns has no id, so the reader addresses it by the + owner. It also attaches before the first publish, which is what a UI opening + on a session does. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "follow-tq-" + uuid.uuid4().hex[:8] + wf_id = "follow-wf-" + uuid.uuid4().hex[:8] + + tokens = [f"token-{i}" for i in range(5)] + received: list[str] = [] + + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishOnSignal], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + PublishOnSignal.run, id=wf_id, task_queue=task_queue + ) + + # Attached before anything is published, so the stream does not + # exist yet and the first poll has to park rather than fail. + reader = streams.workflow_stream(wf_id) + assert (await reader.describe()).head_offset == 0 + + async def follow() -> None: + async for message in reader.follow(): + received.append(message.data.decode()) + if len(received) == len(tokens): + return + + following = asyncio.ensure_future(follow()) + for token in tokens: + await handle.signal(PublishOnSignal.emit, token) + await asyncio.wait_for(following, timeout=60) + + await handle.signal(PublishOnSignal.finish) + assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) + finally: + await streams.close() + + assert received == tokens + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each `read_stream` that finds nothing + blocks, which ends a Workflow Task, so the run spans several. With the + cache on, every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for body in await workflow.read_stream(stream_id): + seen.append(body.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + Every other end-to-end test here disables it, so the sticky path was never + exercised. The server sends no replay slice for a sticky task, while the + sticky history still carries the previous task's consumed range, and the + two together used to fail every task after the first consumed range. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, + task_queue=task_queue, + workflows=[ConsumeAcrossTasks], + # Left at the default deliberately. This is what the test is for. + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=wf_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append(*[t.encode() for t in batch]) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + # More than one Workflow Task ran, otherwise the test proves nothing. + completed = 0 + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: + completed += 1 + assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + finally: + await streams.close() From 72a5c0aaf5ff735b500d6c882fcfbebe6e84dae7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 403/831] Added the Workflow Streams surface over a server-side stream. --- temporalio/contrib/server_streams/__init__.py | 397 ++++++++++++++++++ tests/contrib/test_server_streams.py | 154 +++++++ 2 files changed, 551 insertions(+) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..e831d763c --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,397 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per batch rather than a +Signal per batch. A consumer reads the log directly rather than long-polling an +Update, so there is no per-Workflow limit on how many can read at once, and a +closed Workflow stays readable until its stream's retention expires. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, Optional, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.converter import DataConverter, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still encoded. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + """ + + items: list["WorkflowStreamItem[bytes]"] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _encode(converter: PayloadConverter, value: Any) -> bytes: + """Serialize one value to a stream message body. + + The payload rather than the bare bytes, so the encoding metadata the + consumer needs to decode into a type travels with it. + + The codec chain is not applied. It cannot be applied here: a codec is async + and a Workflow publishing to a stream is not, so running one inside Workflow + code would be I/O on the Workflow thread. Regular payloads solve this in the + Worker, encoding on the way out and decoding on the way in, and a stream + needs the same plumbing before a codec can be honoured. + + It is not applied on the client path either, deliberately. Encoding one side + and not the other is worse than encoding neither: an Activity's messages + would reach a consuming Workflow as ciphertext it has no way to decode. + :func:`_reject_configured_codec` is what keeps that from happening quietly. + """ + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies bypass the codec chain, so proceeding would write payloads + this namespace expects to be encrypted in the clear, and would do it + silently. Raising is the only honest answer until the Worker-side plumbing + exists. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it. Publishing would store them " + "unencoded. Use a client without a codec, or wait for codec support " + "on streams." + ) + + +def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns as soon as the Command is issued. There is nothing to await: + the append is applied in the Workflow Task's own commit, so it costs + this Workflow no round trip and no extra transition. + """ + workflow.add_stream_messages( + [_encode(workflow.payload_converter(), value)], topic=self._name + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic( + self, name: str, *, type: type = object + ) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`.""" + self._handle = handle + self._converter = converter + self._batch_interval = batch_interval + self._buffered: list[tuple[str, Any]] = [] + self._flusher: Optional[asyncio.Task[None]] = None + self._wake = asyncio.Event() + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> "WorkflowStreamClient": + """Open the stream owned by ``workflow_id``.""" + _reject_configured_codec(client) + return cls( + _stream_client(client).workflow_stream(workflow_id), + client.data_converter.payload_converter, + batch_interval, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> "WorkflowStreamClient": + """Open the stream owned by the Workflow that scheduled this Activity.""" + client = activity.client() + return cls.create( + client, activity.info().workflow_id, batch_interval=batch_interval + ) + + async def __aenter__(self) -> "WorkflowStreamClient": + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. + """ + if self._flusher is not None: + self._flusher.cancel() + try: + await self._flusher + except asyncio.CancelledError: + pass + self._flusher = None + await self.flush() + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + async for message in self._handle.follow(from_offset=from_offset, topics=topics): + yield WorkflowStreamItem( + topic=message.topic, + data=_decode(self._converter, message.data, result_type), + offset=message.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> "RawPage": + """One read, with the bodies left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) + for m in page.messages + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + # One append per topic, because a batch carries a single topic. The + # harness case is one topic, so this is one append. + by_topic: dict[str, list[bytes]] = {} + for topic, value in pending: + by_topic.setdefault(topic, []).append(_encode(self._converter, value)) + for topic, bodies in by_topic.items(): + await self._handle.append(*bodies, topic=topic) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while True: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + +# One channel per target, shared by every handle in the process. The channel is +# multiplexed and long-lived, and callers here open a client per subscription, +# which would otherwise be a connection per subscription. +_clients: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop too: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _clients.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _clients[key] = existing + return existing diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..33d86d827 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,154 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow( + Emitting.run, 3, id=wf_id, task_queue=task_queue + ) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] From 16dc087ba95ef4b5d17de2cbf3fe0c8ea8cad9fa Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:57:03 -0700 Subject: [PATCH 404/831] Added the native provider module. --- temporalio/streams/providers/native.py | 398 +++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 temporalio/streams/providers/native.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..f5570b05a --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,398 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server. A workflow publishes with a command that +the server applies in the same transaction that accepts the workflow task, and +consumes ranges the server attaches to the workflow task it dispatches. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_STATE = "__temporal_streams_state" + + +class _Fanout: + """One server subscription, shared by every reader of that stream. + + The server sends a range once. Whoever reads it first would otherwise take + it from the others, so the pull happens here and the result goes to all + live readers. + """ + + def __init__(self, stream: str) -> None: + self._stream = stream + self._subscribers: list[list[tuple[Cursor, bytes]]] = [] + self._pull: asyncio.Future[None] | None = None + + def attach(self) -> list[tuple[Cursor, bytes]]: + queue: list[tuple[Cursor, bytes]] = [] + self._subscribers.append(queue) + return queue + + def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: + if queue in self._subscribers: + self._subscribers.remove(queue) + + async def next_batch( + self, queue: list[tuple[Cursor, bytes]] + ) -> list[tuple[Cursor, bytes]]: + while not queue: + pending = self._pull + if pending is None: + pending = self._pull = asyncio.ensure_future(self._run_pull()) + # Shielded because one reader going away must not cancel a range + # the server will not send again. + await asyncio.shield(pending) + batch, queue[:] = list(queue), [] + return batch + + async def _run_pull(self) -> None: + try: + delivered = await workflow.read_stream_messages(self._stream) + arrived = [ + (Cursor(str(message.offset)), message.body) for message in delivered + ] + for queue in self._subscribers: + queue.extend(arrived) + finally: + self._pull = None + + +def _fanouts() -> dict[str, _Fanout]: + instance = workflow.instance() + state = getattr(instance, _RUN_STATE, None) + if state is None: + state = {} + setattr(instance, _RUN_STATE, state) + return state + + +class _NativeReadSource: + def __init__(self, fanout: _Fanout) -> None: + self._fanout = fanout + self._queue = fanout.attach() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + return await self._fanout.next_batch(self._queue) + + def close(self) -> None: + self._fanout.detach(self._queue) + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Nothing is awaited. The server applies the payload when it accepts + # the task, so there is no back pressure to wait on and no round trip + # to pay for. The signature is awaitable because the contract allows a + # provider that does hold a publisher back. + workflow.add_stream_messages([frame], stream_id="", topic=self._topic) + + +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The server-side id of a workflow's inbound stream. + + A workflow names its streams relative to itself, so every provider can + address the same thing without workflow code knowing how it is stored. + Here that is a namespace-level stream id built from the pair, and the + workflow id rather than the run id because the stream has to survive + continue-as-new and reset. + """ + return f"{workflow_id}:{stream}" + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies do not pass through the codec chain on this provider, so + proceeding would store in the clear what the namespace expects encrypted, + and would do it without saying so. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it" + ) + + +# Streams this process has already opened, so a second producer for the same +# stream reuses the handle rather than asking the server to create it again. +# The second create is answered correctly, and it is still a failed call the +# server logs, which is noise an operator has to learn to ignore. +_handles: dict[str, Any] = {} + + +# One channel per target and namespace, shared by every handle in the process. +# A channel is multiplexed and long lived, and callers open a handle per +# subscription, which would otherwise be a connection per subscription. +_channels: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _channels.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _channels[key] = existing + return existing + + +class NativeProducer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + handle: Any, + converter: Any, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + self._handle = handle + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _provider_id(self) -> str: + """The identity the provider dedupes on. + + The attempt is part of it. Deduplication answers "is this the same + append again", and a second attempt writing different words at the same + sequence is not. Folding the attempt in keeps a retried append idempotent + without letting a new generation be swallowed as a duplicate of the old + one. + """ + return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = await self._handle.append( + *frames, + topic=self._topic, + producer_id=self._provider_id, + # The provider dedupes a retried append on this pair, which is a + # different job from telling readers that a new generation started. + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._handle.append( + frame, + topic=self._topic, + producer_id=self._provider_id, + sequence=self._sequence - 1, + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class NativeConsumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, handle: Any, converter: Any) -> None: + self._handle = handle + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + attempts = AttemptTracker() + async for message in self._handle.follow( + from_offset=int(start.token) if start.token else 0 + ): + cursor = Cursor(str(message.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + message.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NativeProvider: + name = "native" + + def configure(self, **options: Any) -> None: + """Nothing to name: the streams are on the server the client is + already connected to. It exists so a process that switches providers + changes one call rather than its structure.""" + if options: + raise TypeError( + f"the native provider takes no options, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Accepted and ignored. Delivery arrives on workflow tasks the server + # dispatches, so no worker is held between records and there is nothing + # for an idle timeout to release. + del idle_timeout + stream_id = inbound_stream_id(workflow.info().workflow_id, stream) + fanouts = _fanouts() + fanout = fanouts.get(stream_id) + if fanout is None: + workflow.subscribe_stream( + stream_id, start_offset=int(start.token) if start.token else 0 + ) + fanout = fanouts[stream_id] = _Fanout(stream_id) + return _NativeReadSource(fanout) + + def open_write(self, topic: str) -> WriteSink: + return _NativeWriteSink(topic) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + _reject_configured_codec(client) + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + streams = _stream_client(client) + stream_id = inbound_stream_id(workflow_id, stream) + handle = _handles.get(stream_id) + if handle is None: + try: + handle = await streams.create(stream_id) + except Exception: + # Created by whoever set the stream up. A producer opening a + # stream it does not own is the ordinary case, not the + # exception. + handle = streams.get(stream_id) + _handles[stream_id] = handle + return NativeProducer( + handle, + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> NativeConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. Naming one reads that inbound + stream instead, which is how a second consumer follows the same input. + """ + _reject_configured_codec(client) + streams = _stream_client(client) + if stream: + handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + else: + handle = streams.workflow_stream(workflow_id) + return NativeConsumer(handle, client.data_converter.payload_converter) + + +_provider.register("native", _NativeProvider) From b1a78e58ebda55293efb92c6ab1fdb62db918809 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 405/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/native.py | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f5570b05a..c0044b9cf 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -255,18 +255,18 @@ def __init__(self, handle: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() async for message in self._handle.follow( - from_offset=int(start.token) if start.token else 0 + from_offset=int(after.token) + 1 if after.token else 0 ): cursor = Cursor(str(message.offset)) try: @@ -290,6 +290,16 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one server-side log per stream, whatever the topic + try: + state = await self._handle.describe() + except Exception: + # A stream nobody has published to does not exist yet, and that + # is the same answer as an empty one. + return BEGINNING + return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -317,7 +327,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Accepted and ignored. Delivery arrives on workflow tasks the server @@ -329,7 +339,7 @@ def open_read( fanout = fanouts.get(stream_id) if fanout is None: workflow.subscribe_stream( - stream_id, start_offset=int(start.token) if start.token else 0 + stream_id, start_offset=int(after.token) + 1 if after.token else 0 ) fanout = fanouts[stream_id] = _Fanout(stream_id) return _NativeReadSource(fanout) @@ -342,15 +352,18 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NativeProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the stream the workflow publishes, which the server lets any + producer append to. Inside an activity, leave ``producer_id`` and + ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ _reject_configured_codec(client) if not producer_id: @@ -358,6 +371,14 @@ async def producer( if not attempt: attempt = activity.info().attempt streams = _stream_client(client) + if not stream: + return NativeProducer( + streams.workflow_stream(workflow_id), + client.data_converter.payload_converter, + topic, + producer_id, + attempt, + ) stream_id = inbound_stream_id(workflow_id, stream) handle = _handles.get(stream_id) if handle is None: From 85be59eef005f70af66196ce45ab9d9a17e985ca Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:49:04 -0700 Subject: [PATCH 406/831] Read the delivered message shape the buffer now hands back. The buffer holds a body, topic and offset rather than the wire message, and the cap moved to `workflow_read_stream_messages`. --- tests/worker/test_workflow_stream.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 944761cfa..bb0dcf9ba 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -28,7 +28,7 @@ async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() buffer.extend([message(b"one"), message(b"two")]) - assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert [m.body for m in buffer.take()] == [b"one", b"two"] assert len(buffer) == 0 @@ -41,7 +41,7 @@ async def test_buffer_wakes_a_waiting_reader() -> None: buffer.extend([message(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body.data for m in buffer.take()] == [b"late"] + assert [m.body for m in buffer.take()] == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -64,16 +64,21 @@ async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body.data for m in buffer.take()] == [b"early"] + assert [m.body for m in buffer.take()] == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream``, so a test that reimplements - it proves nothing about the code that ships. + The cap lives inside ``workflow_read_stream_messages``, so a test that + reimplements it proves nothing about the code that ships. Borrowing the + method off the real class is what keeps the test on the shipped path. """ + workflow_read_stream_messages = ( + _WorkflowInstanceImpl.workflow_read_stream_messages + ) + def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} self.read_only_calls: list[str] = [] From 5dc2093576752485ca9efb88a0571a32daa00834 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 407/831] Regenerated the protos from the pinned Core. The pinned Core carries the stream additions to the public API, so the command, enum, history and workflow service messages were stale. Only the vendored stream service protos still come from the server checkout. --- temporalio/bridge/_visitor.py | 28 + .../workflow_activation_pb2.py | 626 +++++++------ .../workflow_activation_pb2.pyi | 116 +-- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 823 +++++++++++------- .../workflow_commands_pb2.pyi | 94 +- 6 files changed, 1016 insertions(+), 675 deletions(-) diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..77d1b6c7a 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamMessage( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +367,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_messages"): + await self._visit_coresdk_workflow_activation_DeliverStreamMessages( + fs, o.deliver_stream_messages + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any @@ -492,6 +510,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AddStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -551,6 +575,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("add_stream_messages"): + await self._visit_coresdk_workflow_commands_AddStreamMessages( + fs, o.add_stream_messages + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0e1b3a1e6..cd09b8b97 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,311 +2,447 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') - - +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] -_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] -_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] -WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }) +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.update.v1 import ( + message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.activity_result import ( + activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' +) + + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ + "HeadersEntry" +] +_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStart" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartSuccess" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartFailure" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartCancelled" +] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecution" +] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveSignalExternalWorkflow" +] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveRequestCancelExternalWorkflow" +] +_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveNexusOperationStart" +] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] +WorkflowActivation = _reflection.GeneratedProtocolMessageType( + "WorkflowActivation", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }, +) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( + "WorkflowActivationJob", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }, +) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) - }) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( + "DeliverStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }, +) _sym_db.RegisterMessage(DeliverStreamMessages) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _INITIALIZEWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }) +InitializeWorkflow = _reflection.GeneratedProtocolMessageType( + "InitializeWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _INITIALIZEWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }, +) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { - 'DESCRIPTOR' : _FIRETIMER, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }) +FireTimer = _reflection.GeneratedProtocolMessageType( + "FireTimer", + (_message.Message,), + { + "DESCRIPTOR": _FIRETIMER, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }, +) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }) +ResolveActivity = _reflection.GeneratedProtocolMessageType( + "ResolveActivity", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEACTIVITY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }, +) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartSuccess", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartFailure", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartCancelled", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERANDOMSEED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( + "UpdateRandomSeed", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERANDOMSEED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }, +) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _QUERYWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }) +QueryWorkflow = _reflection.GeneratedProtocolMessageType( + "QueryWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _QUERYWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }, +) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }) +CancelWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }, +) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }) +SignalWorkflow = _reflection.GeneratedProtocolMessageType( + "SignalWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }, +) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { - 'DESCRIPTOR' : _NOTIFYHASPATCH, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType( + "NotifyHasPatch", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYHASPATCH, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }, +) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveSignalExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveRequestCancelExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }) - , - 'DESCRIPTOR' : _DOUPDATE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }) +DoUpdate = _reflection.GeneratedProtocolMessageType( + "DoUpdate", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }, + ), + "DESCRIPTOR": _DOUPDATE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }, +) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperationStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }, +) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }, +) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEFROMCACHE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }) +RemoveFromCache = _reflection.GeneratedProtocolMessageType( + "RemoveFromCache", + (_message.Message,), + { + "DESCRIPTOR": _REMOVEFROMCACHE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }, +) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' - _WORKFLOWACTIVATION._serialized_start=570 - _WORKFLOWACTIVATION._serialized_end=1116 - _WORKFLOWACTIVATIONJOB._serialized_start=1119 - _WORKFLOWACTIVATIONJOB._serialized_end=2582 - _DELIVERSTREAMMESSAGES._serialized_start=2585 - _DELIVERSTREAMMESSAGES._serialized_end=2724 - _INITIALIZEWORKFLOW._serialized_start=2727 - _INITIALIZEWORKFLOW._serialized_end=4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 - _FIRETIMER._serialized_start=4133 - _FIRETIMER._serialized_end=4157 - _RESOLVEACTIVITY._serialized_start=4159 - _RESOLVEACTIVITY._serialized_end=4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 - _UPDATERANDOMSEED._serialized_start=5045 - _UPDATERANDOMSEED._serialized_end=5088 - _QUERYWORKFLOW._serialized_start=5091 - _QUERYWORKFLOW._serialized_end=5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 - _CANCELWORKFLOW._serialized_start=5353 - _CANCELWORKFLOW._serialized_end=5385 - _SIGNALWORKFLOW._serialized_start=5388 - _SIGNALWORKFLOW._serialized_end=5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 - _NOTIFYHASPATCH._serialized_start=5679 - _NOTIFYHASPATCH._serialized_end=5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 - _DOUPDATE._serialized_start=5917 - _DOUPDATE._serialized_end=6248 - _DOUPDATE_HEADERSENTRY._serialized_start=4052 - _DOUPDATE_HEADERSENTRY._serialized_end=4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 - _RESOLVENEXUSOPERATION._serialized_start=6407 - _RESOLVENEXUSOPERATION._serialized_end=6496 - _REMOVEFROMCACHE._serialized_start=6499 - _REMOVEFROMCACHE._serialized_end=6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" + ) + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" + _WORKFLOWACTIVATION._serialized_start = 570 + _WORKFLOWACTIVATION._serialized_end = 1116 + _WORKFLOWACTIVATIONJOB._serialized_start = 1119 + _WORKFLOWACTIVATIONJOB._serialized_end = 2582 + _DELIVERSTREAMMESSAGES._serialized_start = 2585 + _DELIVERSTREAMMESSAGES._serialized_end = 2724 + _INITIALIZEWORKFLOW._serialized_start = 2727 + _INITIALIZEWORKFLOW._serialized_end = 4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _FIRETIMER._serialized_start = 4133 + _FIRETIMER._serialized_end = 4157 + _RESOLVEACTIVITY._serialized_start = 4159 + _RESOLVEACTIVITY._serialized_end = 4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 + _UPDATERANDOMSEED._serialized_start = 5045 + _UPDATERANDOMSEED._serialized_end = 5088 + _QUERYWORKFLOW._serialized_start = 5091 + _QUERYWORKFLOW._serialized_end = 5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _CANCELWORKFLOW._serialized_start = 5353 + _CANCELWORKFLOW._serialized_end = 5385 + _SIGNALWORKFLOW._serialized_start = 5388 + _SIGNALWORKFLOW._serialized_end = 5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _NOTIFYHASPATCH._serialized_start = 5679 + _NOTIFYHASPATCH._serialized_end = 5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 + _DOUPDATE._serialized_start = 5917 + _DOUPDATE._serialized_end = 6248 + _DOUPDATE_HEADERSENTRY._serialized_start = 4052 + _DOUPDATE_HEADERSENTRY._serialized_end = 4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 + _RESOLVENEXUSOPERATION._serialized_start = 6407 + _RESOLVENEXUSOPERATION._serialized_end = 6496 + _REMOVEFROMCACHE._serialized_start = 6499 + _REMOVEFROMCACHE._serialized_end = 6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index eab815fc9..5245cd6fc 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,9 +19,9 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -439,6 +439,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" @@ -1451,63 +1508,6 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation -class DeliverStreamMessages(google.protobuf.message.Message): - """Hand a workflow the next range of a stream it subscribed to. - - The range is delivered once, on the task the server decided it belongs to, - and the offsets it covered are recorded in History rather than the payloads. - On replay the server re-supplies the same range by reading the stream again, - so this job appears at the same point with the same contents both times. - - An empty range is still delivered: a task where the subscription saw nothing - is a fact replay has to reproduce, not an absence of one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - FROM_OFFSET_FIELD_NUMBER: builtins.int - TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Id of the stream this range came from.""" - from_offset: builtins.int - """Inclusive.""" - to_offset: builtins.int - """Exclusive. Equal to from_offset when the subscription saw nothing.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - from_offset: builtins.int = ..., - to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "from_offset", - b"from_offset", - "messages", - b"messages", - "stream_id", - b"stream_id", - "to_offset", - b"to_offset", - ], - ) -> None: ... - -global___DeliverStreamMessages = DeliverStreamMessages - class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..44826f2da 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AddStreamMessages, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -21,6 +22,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -28,6 +30,7 @@ __all__ = [ "ActivityCancellationType", + "AddStreamMessages", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -49,6 +52,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index ccfa1a016..3374f951a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,408 +2,583 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.sdk.v1 import ( + event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, +) +from temporalio.api.sdk.v1 import ( + user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' +) + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] -_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] -_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] -_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] -WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWCOMMAND, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] +_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] +_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ + "HeadersEntry" +] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ + "RequestCancelLocalActivity" +] +_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CompleteWorkflowExecution" +] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ContinueAsNewWorkflowExecution" +] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "StartChildWorkflowExecution" +] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CancelChildWorkflowExecution" +] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "RequestCancelExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "SignalExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( + _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UpsertWorkflowSearchAttributes" +] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ + "NexusHeaderEntry" +] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ + "RequestCancelNexusOperation" +] +WorkflowCommand = _reflection.GeneratedProtocolMessageType( + "WorkflowCommand", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWCOMMAND, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }, +) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _ADDSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) - }) +AddStreamMessages = _reflection.GeneratedProtocolMessageType( + "AddStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }, +) _sym_db.RegisterMessage(AddStreamMessages) -SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { - 'DESCRIPTOR' : _SUBSCRIBESTREAM, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) - }) +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) _sym_db.RegisterMessage(SubscribeStream) -StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { - 'DESCRIPTOR' : _STARTTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }) +StartTimer = _reflection.GeneratedProtocolMessageType( + "StartTimer", + (_message.Message,), + { + "DESCRIPTOR": _STARTTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }, +) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { - 'DESCRIPTOR' : _CANCELTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }) +CancelTimer = _reflection.GeneratedProtocolMessageType( + "CancelTimer", + (_message.Message,), + { + "DESCRIPTOR": _CANCELTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }, +) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }) +ScheduleActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULEACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }, +) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleLocalActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULELOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }, +) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }, +) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelLocalActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }, +) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }) +QueryResult = _reflection.GeneratedProtocolMessageType( + "QueryResult", + (_message.Message,), + { + "DESCRIPTOR": _QUERYRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }, +) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { - 'DESCRIPTOR' : _QUERYSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }) +QuerySuccess = _reflection.GeneratedProtocolMessageType( + "QuerySuccess", + (_message.Message,), + { + "DESCRIPTOR": _QUERYSUCCESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }, +) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CompleteWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }, +) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "FailWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _FAILWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }, +) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }) - , - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ContinueAsNewWorkflowExecution", + (_message.Message,), + { + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }, + ), + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }, +) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { - 'DESCRIPTOR' : _SETPATCHMARKER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }) +SetPatchMarker = _reflection.GeneratedProtocolMessageType( + "SetPatchMarker", + (_message.Message,), + { + "DESCRIPTOR": _SETPATCHMARKER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }, +) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }) - , - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }) - , - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "StartChildWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }, + ), + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }, + ), + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "RequestCancelExternalWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "SignalExternalWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelSignalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELSIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }, +) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { - 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( + "UpsertWorkflowSearchAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }, +) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { - 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( + "ModifyWorkflowProperties", + (_message.Message,), + { + "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }, +) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERESPONSE, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }) +UpdateResponse = _reflection.GeneratedProtocolMessageType( + "UpdateResponse", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERESPONSE, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }, +) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { - - 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( + "ScheduleNexusOperation", + (_message.Message,), + { + "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( + "NexusHeaderEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }, + ), + "DESCRIPTOR": _SCHEDULENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }, +) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( + "RequestCancelNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }, +) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' - _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 - _WORKFLOWCOMMAND._serialized_start=556 - _WORKFLOWCOMMAND._serialized_end=2794 - _ADDSTREAMMESSAGES._serialized_start=2796 - _ADDSTREAMMESSAGES._serialized_end=2891 - _SUBSCRIBESTREAM._serialized_start=2893 - _SUBSCRIBESTREAM._serialized_end=2951 - _STARTTIMER._serialized_start=2953 - _STARTTIMER._serialized_end=3036 - _CANCELTIMER._serialized_start=3038 - _CANCELTIMER._serialized_end=3064 - _SCHEDULEACTIVITY._serialized_start=3067 - _SCHEDULEACTIVITY._serialized_end=3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 - _SCHEDULELOCALACTIVITY._serialized_start=3894 - _SCHEDULELOCALACTIVITY._serialized_end=4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 - _REQUESTCANCELACTIVITY._serialized_start=4646 - _REQUESTCANCELACTIVITY._serialized_end=4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 - _QUERYRESULT._serialized_start=4728 - _QUERYRESULT._serialized_end=4884 - _QUERYSUCCESS._serialized_start=4886 - _QUERYSUCCESS._serialized_end=4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 - _FAILWORKFLOWEXECUTION._serialized_start=5031 - _FAILWORKFLOWEXECUTION._serialized_end=5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELWORKFLOWEXECUTION._serialized_start=6024 - _CANCELWORKFLOWEXECUTION._serialized_end=6100 - _SETPATCHMARKER._serialized_start=6102 - _SETPATCHMARKER._serialized_end=6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELSIGNALWORKFLOW._serialized_start=7958 - _CANCELSIGNALWORKFLOW._serialized_end=7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 - _UPDATERESPONSE._serialized_start=8180 - _UPDATERESPONSE._serialized_end=8390 - _SCHEDULENEXUSOPERATION._serialized_start=8393 - _SCHEDULENEXUSOPERATION._serialized_end=8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" + ) + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2794 + _ADDSTREAMMESSAGES._serialized_start = 2796 + _ADDSTREAMMESSAGES._serialized_end = 2891 + _SUBSCRIBESTREAM._serialized_start = 2893 + _SUBSCRIBESTREAM._serialized_end = 2951 + _STARTTIMER._serialized_start = 2953 + _STARTTIMER._serialized_end = 3036 + _CANCELTIMER._serialized_start = 3038 + _CANCELTIMER._serialized_end = 3064 + _SCHEDULEACTIVITY._serialized_start = 3067 + _SCHEDULEACTIVITY._serialized_end = 3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 + _SCHEDULELOCALACTIVITY._serialized_start = 3894 + _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 + _REQUESTCANCELACTIVITY._serialized_start = 4646 + _REQUESTCANCELACTIVITY._serialized_end = 4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 + _QUERYRESULT._serialized_start = 4728 + _QUERYRESULT._serialized_end = 4884 + _QUERYSUCCESS._serialized_start = 4886 + _QUERYSUCCESS._serialized_end = 4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 + _FAILWORKFLOWEXECUTION._serialized_start = 5031 + _FAILWORKFLOWEXECUTION._serialized_end = 5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELWORKFLOWEXECUTION._serialized_start = 6024 + _CANCELWORKFLOWEXECUTION._serialized_end = 6100 + _SETPATCHMARKER._serialized_start = 6102 + _SETPATCHMARKER._serialized_end = 6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELSIGNALWORKFLOW._serialized_start = 7958 + _CANCELSIGNALWORKFLOW._serialized_end = 7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 + _UPDATERESPONSE._serialized_start = 8180 + _UPDATERESPONSE._serialized_end = 8390 + _SCHEDULENEXUSOPERATION._serialized_start = 8393 + _SCHEDULENEXUSOPERATION._serialized_end = 8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 040a2267c..bcf1bf7eb 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,9 +23,9 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -228,6 +228,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -252,10 +254,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -272,6 +270,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -285,6 +285,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -311,10 +313,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -331,6 +329,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -375,38 +375,14 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class StartTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... - def __init__( - self, - *, - seq: builtins.int = ..., - start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> None: ... - -global___StartTimer = StartTimer - class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -444,14 +420,6 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int @@ -476,6 +444,36 @@ class SubscribeStream(google.protobuf.message.Message): global___SubscribeStream = SubscribeStream +class StartTimer(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int + seq: builtins.int + """Lang's incremental sequence number, used as the operation identifier""" + @property + def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + seq: builtins.int = ..., + start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> None: ... + +global___StartTimer = StartTimer + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor From 8643d898f0d43e21ae2f4f0730c54da4e4bb4877 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 408/831] Sorted and formatted the server-side stream modules. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and `check-protos` reformats what it regenerates. --- scripts/gen_stream_protos.py | 29 +++++++++++++++---- temporalio/client_stream.py | 14 +++++---- temporalio/contrib/server_streams/__init__.py | 12 ++++---- temporalio/streams/providers/native.py | 14 +++++++-- temporalio/workflow/__init__.py | 10 +++---- tests/contrib/test_server_streams.py | 16 ++++++---- tests/worker/test_workflow_stream.py | 4 +-- tests/worker/test_workflow_stream_e2e.py | 6 ++-- 8 files changed, 70 insertions(+), 35 deletions(-) diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index e66f8abb4..f57ff6177 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -34,7 +34,13 @@ # the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` # checkout instead when the submodule is not initialized. UPSTREAM_API = ( - BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + BASE + / "temporalio" + / "bridge" + / "sdk-core" + / "crates" + / "protos" + / "protos" / "api_upstream" ) @@ -43,16 +49,24 @@ def api_proto_path() -> Path: override = os.environ.get("TEMPORAL_API_PROTOS") if override: return Path(override).resolve() - if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + if ( + UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto" + ).is_file(): return UPSTREAM_API raise SystemExit( "no api protos found: initialize the sdk-core submodule or set " "TEMPORAL_API_PROTOS to a temporalio/api checkout" ) + SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") -FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] +FILES = [ + "message.proto", + "stream_state.proto", + "request_response.proto", + "service.proto", +] # Server-only options. They carry shard routing and rate-limit category, which # a client neither reads nor can resolve, since the files defining them are not @@ -63,7 +77,10 @@ def api_proto_path() -> Path: # protoc names a python module after the proto path. These put the generated # modules where this package publishes them. FIX_PY = [ - (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + ( + re.compile(r"from temporalio\.api\.stream\.v1 import"), + "from temporalio.api.streamservice.v1 import", + ), (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), (re.compile(r"from temporal\.api\."), "from temporalio.api."), (re.compile(r"import temporal\.api\."), "import temporalio.api."), @@ -96,7 +113,9 @@ def main() -> None: out.mkdir() subprocess.run( [ - sys.executable, "-m", "grpc_tools.protoc", + sys.executable, + "-m", + "grpc_tools.protoc", f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 75388c9c9..1b5d953bd 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -242,9 +242,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, @@ -401,9 +402,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index e831d763c..b6db1fd7a 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -169,9 +169,7 @@ def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... @overload def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... - def topic( - self, name: str, *, type: type = object - ) -> WorkflowTopicHandle[Any]: + def topic(self, name: str, *, type: type = object) -> WorkflowTopicHandle[Any]: """Bind a topic on this Workflow's stream.""" return WorkflowTopicHandle(name, type) @@ -179,7 +177,9 @@ def topic( class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" - def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + def __init__( + self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client self._name = topic @@ -316,7 +316,9 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown - async for message in self._handle.follow(from_offset=from_offset, topics=topics): + async for message in self._handle.follow( + from_offset=from_offset, topics=topics + ): yield WorkflowStreamItem( topic=message.topic, data=_decode(self._converter, message.data, result_type), diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index c0044b9cf..1243d3784 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -193,7 +193,11 @@ def _provider_id(self) -> str: without letting a new generation be swallowed as a duplicate of the old one. """ - return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) async def append(self, *values: Any) -> Cursor: """Append values and return where the first one landed.""" @@ -240,7 +244,9 @@ async def finish(self) -> None: def _encode(self, value: Any) -> bytes: payload = ( - value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] ) return payload.SerializeToString() @@ -298,7 +304,9 @@ async def latest(self, *, topic: str | None = None) -> Cursor: # A stream nobody has published to does not exist yet, and that # is the same answer as an empty one. return BEGINNING - return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + return ( + Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + ) def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 28e711d9b..8d57b75e7 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,6 +58,7 @@ wait, ) from ._context import ( + DeliveredStreamMessage, Info, ParentInfo, RootInfo, @@ -65,6 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, + add_stream_messages, cancellation_reason, current_update_info, deprecate_patch, @@ -86,20 +88,18 @@ payload_converter, random, random_seed, + read_stream, + read_stream_messages, register_random_seed_callback, set_current_details, sleep, + subscribe_stream, time, time_ns, upsert_memo, upsert_search_attributes, uuid4, uuid7, - DeliveredStreamMessage, - read_stream, - read_stream_messages, - add_stream_messages, - subscribe_stream, wait_condition, ) from ._definition import ( diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 33d86d827..e1fe84c77 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -103,7 +103,9 @@ async def read() -> None: # The Workflow's own publishes bracket the Activity's, and both are on one # log in the order the server took them. - assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + [ + "workflow" + ] assert seen[0].text == "turn started" assert seen[-1].text == "turn ended" assert offsets == list(range(tokens + 2)) @@ -115,7 +117,9 @@ async def read() -> None: assert await late.get_offset() == tokens + 2 replayed = [ item.data.text - async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in late.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert replayed == [e.text for e in seen] @@ -132,14 +136,14 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: activities=[emit_from_activity], max_cached_workflows=0, ): - await client.execute_workflow( - Emitting.run, 3, id=wf_id, task_queue=task_queue - ) + await client.execute_workflow(Emitting.run, 3, id=wf_id, task_queue=task_queue) stream = WorkflowStreamClient.create(client, wf_id) first = [ item - async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert len(first) == 5 diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index bb0dcf9ba..40d6fdf45 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -75,9 +75,7 @@ class _ReadOnlyStub: method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = ( - _WorkflowInstanceImpl.workflow_read_stream_messages - ) + workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 579327217..00d0dfa85 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,9 +17,9 @@ import uuid import pytest -from temporalio.api.enums.v1 import EventType from temporalio import workflow +from temporalio.api.enums.v1 import EventType from temporalio.client import Client from temporalio.worker import Worker @@ -239,6 +239,8 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: async for event in client.get_workflow_handle(wf_id).fetch_history_events(): if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: completed += 1 - assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + assert completed >= 3, ( + f"only {completed} workflow tasks, sticky path not exercised" + ) finally: await streams.close() From ba95d01a912c2a880e74e0b40b1c3f8f49466dab Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:30 -0700 Subject: [PATCH 409/831] Made the server-side stream modules pass the type and doc linters. A Standalone Activity has no `workflow_id`, so opening its Workflow's stream now says that rather than sending `None` on the wire. `Optional` and `typing.Sequence` are deprecated spellings the linter rejects. --- temporalio/client_stream.py | 7 +++-- temporalio/contrib/server_streams/__init__.py | 29 +++++++++++-------- temporalio/streams/providers/native.py | 12 ++++++-- tests/test_client_stream.py | 2 +- tests/worker/test_workflow_stream.py | 13 +++++++-- tests/worker/test_workflow_stream_e2e.py | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1b5d953bd..8280b56d4 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,8 +23,9 @@ from __future__ import annotations +from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass -from typing import Any, AsyncIterator, Optional, Sequence +from typing import Any import google.protobuf.duration_pb2 @@ -102,8 +103,8 @@ async def create( self, stream_id: str, *, - retention: Optional[float] = None, - max_items: Optional[int] = None, + retention: float | None = None, + max_items: int | None = None, ) -> "StreamHandle": """Create a stream and return a handle to it. diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index b6db1fd7a..c15184bf4 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -20,16 +20,17 @@ from __future__ import annotations import asyncio +import builtins from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from datetime import timedelta -from typing import Any, Generic, Optional, TypeVar, overload +from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient, WorkflowStreamHandle -from temporalio.converter import DataConverter, PayloadConverter +from temporalio.converter import PayloadConverter __all__ = [ "RawPage", @@ -109,7 +110,7 @@ def _reject_configured_codec(client: Client) -> None: ) -def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: +def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) if as_type is None: @@ -210,8 +211,9 @@ def subscribe( self, *, from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + # Spelled out because `type` in this class body is the property below. + result_type: builtins.type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[T]]: """Read this topic from ``from_offset`` onwards.""" return self._client.subscribe( @@ -236,7 +238,7 @@ def __init__( self._converter = converter self._batch_interval = batch_interval self._buffered: list[tuple[str, Any]] = [] - self._flusher: Optional[asyncio.Task[None]] = None + self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() @classmethod @@ -260,10 +262,13 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - client = activity.client() - return cls.create( - client, activity.info().workflow_id, batch_interval=batch_interval - ) + workflow_id = activity.info().workflow_id + if workflow_id is None: + raise RuntimeError( + "no Workflow stream to open: this Activity was not started by a " + "Workflow" + ) + return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -307,8 +312,8 @@ async def subscribe( *, topics: Sequence[str] = (), from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + result_type: type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[Any]]: """Yield items from ``from_offset`` as they arrive. diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 1243d3784..53d231174 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -171,6 +171,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle self._converter = converter self._topic = topic @@ -255,6 +256,7 @@ class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, handle: Any, converter: Any) -> None: + """Read the stream ``handle`` names, from anywhere.""" self._handle = handle self._converter = converter @@ -297,6 +299,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() @@ -320,9 +323,12 @@ class _NativeProvider: name = "native" def configure(self, **options: Any) -> None: - """Nothing to name: the streams are on the server the client is - already connected to. It exists so a process that switches providers - changes one call rather than its structure.""" + """Take no options. + + The streams are on the server the client is already connected to. + This exists so a process that switches providers changes one call + rather than its structure. + """ if options: raise TypeError( f"the native provider takes no options, got {sorted(options)}" diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index f7df3c7a7..8d1a42f30 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -14,7 +14,7 @@ import asyncio import os import uuid -from typing import AsyncIterator +from collections.abc import AsyncIterator import pytest diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 40d6fdf45..1d154b37c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -9,6 +9,7 @@ from __future__ import annotations import asyncio +from typing import Any import pytest @@ -84,6 +85,12 @@ def __init__(self) -> None: def _assert_not_read_only(self, action: str) -> None: self.read_only_calls.append(action) + async def read(self, stream: str, max_messages: int) -> list[bytes]: + instance: Any = self + return await _WorkflowInstanceImpl.workflow_read_stream( + instance, stream, max_messages + ) + @pytest.mark.parametrize("max_messages", [1, 2, 5]) async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: @@ -92,14 +99,14 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b) for b in bodies]) - got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + got = await stub.read("s", max_messages) assert got == bodies[:max_messages] # Whatever the cap left behind has to still be there: nothing resends it. assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) if len(stub._stream_buffers["s"]): - rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + rest = await stub.read("s", 0) assert got + rest == bodies else: assert got == bodies @@ -112,5 +119,5 @@ async def test_read_is_refused_in_a_read_only_context() -> None: stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + await stub.read("s", 0) assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 00d0dfa85..3ee38fef3 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -104,7 +104,7 @@ def __init__(self) -> None: async def run(self) -> int: published = 0 while True: - await workflow.wait_condition(lambda: self._pending or self._done) + await workflow.wait_condition(lambda: bool(self._pending) or self._done) while self._pending: workflow.add_stream_messages([self._pending.pop(0).encode()]) published += 1 From c587706ce2178e96f969d14b18e90bf2f85cca96 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:38 -0700 Subject: [PATCH 410/831] Added the changelog entry for server-side streams. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a90a9114f..7a20af4f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,13 @@ to include examples, links to docs, or any other relevant information. `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: server-side streams. A workflow reads a stream the server + delivers on its Workflow Tasks and publishes with a command, through + `temporalio.workflow.read_stream`, `subscribe_stream` and + `add_stream_messages`. `temporalio.client_stream` and + `temporalio.contrib.server_streams` reach the same stream from outside a + workflow, and `temporalio.streams.providers.native` puts it behind the shared + stream interface. Requires a server that serves the stream service. ### Changed From f74e146f3aff11399ee54a661e1779d61559fe29 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:45:15 -0700 Subject: [PATCH 411/831] Regenerated the vendored stream protos for protobuf 3. This package has to load on a protobuf 3 runtime, and generated code refuses to load on a runtime older than the one it was built against. The protoc of that generation has no `--pyi_out`, so the stubs come from `mypy-protobuf`, which is what the other generated protos already use. --- scripts/gen_stream_protos.py | 7 +- temporalio/api/streamservice/v1/__init__.py | 16 + .../api/streamservice/v1/message_pb2.py | 97 +- .../api/streamservice/v1/message_pb2.pyi | 215 +- .../api/streamservice/v1/message_pb2_grpc.py | 22 +- .../api/streamservice/v1/message_pb2_grpc.pyi | 4 + .../streamservice/v1/request_response_pb2.py | 993 +++++++- .../streamservice/v1/request_response_pb2.pyi | 2201 +++++++++++++---- .../v1/request_response_pb2_grpc.py | 22 +- .../v1/request_response_pb2_grpc.pyi | 4 + .../api/streamservice/v1/service_pb2.py | 40 +- .../api/streamservice/v1/service_pb2.pyi | 11 +- .../api/streamservice/v1/service_pb2_grpc.py | 751 +++--- .../api/streamservice/v1/service_pb2_grpc.pyi | 195 ++ .../api/streamservice/v1/stream_state_pb2.py | 160 +- .../api/streamservice/v1/stream_state_pb2.pyi | 525 +++- .../streamservice/v1/stream_state_pb2_grpc.py | 22 +- .../v1/stream_state_pb2_grpc.pyi | 4 + temporalio/client_stream.py | 4 +- 19 files changed, 4085 insertions(+), 1208 deletions(-) create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index f57ff6177..6b6487294 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -9,7 +9,9 @@ Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf runtime this package has to load on. Generated code refuses to load on a runtime older than the one it was built against, and these modules end up in -applications that pin protobuf themselves. +applications that pin protobuf themselves. The stubs come from +``mypy-protobuf`` rather than protoc's own ``--pyi_out``, which that +generation of protoc does not have. Two rewrites make the copies compile against this SDK. The server's own routing and API-category options are dropped, because they mean nothing to a @@ -119,8 +121,9 @@ def main() -> None: f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", - f"--pyi_out={out}", f"--grpc_python_out={out}", + f"--mypy_out={out}", + f"--mypy_grpc_out={out}", *targets, ], check=True, diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 31f99bded..7e2ebef29 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -28,6 +28,10 @@ AddWorkflowMessagesInput, AddWorkflowMessagesRequest, AddWorkflowMessagesResponse, + AdvanceConsumerHeadInput, + AdvanceConsumerHeadOutput, + AdvanceConsumerHeadRequest, + AdvanceConsumerHeadResponse, CloseStreamInput, CloseStreamOutput, CloseStreamRequest, @@ -62,6 +66,10 @@ PollWorkflowMessagesInput, PollWorkflowMessagesRequest, PollWorkflowMessagesResponse, + RegisterStreamConsumerInput, + RegisterStreamConsumerOutput, + RegisterStreamConsumerRequest, + RegisterStreamConsumerResponse, StreamListEntry, SubscribeWorkflowInput, SubscribeWorkflowOutput, @@ -81,6 +89,10 @@ "AddWorkflowMessagesInput", "AddWorkflowMessagesRequest", "AddWorkflowMessagesResponse", + "AdvanceConsumerHeadInput", + "AdvanceConsumerHeadOutput", + "AdvanceConsumerHeadRequest", + "AdvanceConsumerHeadResponse", "CloseStreamInput", "CloseStreamOutput", "CloseStreamRequest", @@ -117,6 +129,10 @@ "PollWorkflowMessagesRequest", "PollWorkflowMessagesResponse", "ProducerCursor", + "RegisterStreamConsumerInput", + "RegisterStreamConsumerOutput", + "RegisterStreamConsumerRequest", + "RegisterStreamConsumerResponse", "STREAM_MESSAGE_KIND_DATA", "STREAM_MESSAGE_KIND_FLUSH", "STREAM_MESSAGE_KIND_UNSPECIFIED", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index b4fe8e68a..3bbd8718e 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -1,46 +1,83 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/message.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/message.proto' -) +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ None: ... - BODY_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - TOPIC_FIELD_NUMBER: _ClassVar[int] - TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - KIND_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - body: _message_pb2.Payload - metadata: _containers.MessageMap[str, _message_pb2.Payload] - topic: str - topic_sequence: int - kind: StreamMessageKind - offset: int - def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... - -class StreamMessageBatch(_message.Message): - __slots__ = ("messages",) - MESSAGES_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] - def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys +import typing + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamMessageKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamMessageKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamMessageKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 + STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 + STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 + """Producer signalling a delivery boundary. Carries no body and consumes an + offset like any other message. A consumer uses it to end a turn without + waiting out an idle timeout. + """ + +class StreamMessageKind( + _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper +): ... + +STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 +STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 +STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 +"""Producer signalling a delivery boundary. Carries no body and consumes an +offset like any other message. A consumer uses it to end a turn without +waiting out an idle timeout. +""" +global___StreamMessageKind = StreamMessageKind + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance. The server does not populate this today.""" + topic: builtins.str + topic_sequence: builtins.int + """Position within this topic. The global offset orders the whole stream; + this lets a consumer reason about one topic without decoding the rest. + """ + kind: global___StreamMessageKind.ValueType + offset: builtins.int + """Position in the whole stream, set on read and never stored. A consumer + that resumes at message granularity needs it, and a topic-filtered read + leaves gaps that make it underivable from the response alone. + """ + def __init__( + self, + *, + body: temporal.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + kind: global___StreamMessageKind.ValueType = ..., + offset: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "offset", + b"offset", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... + +global___StreamMessage = StreamMessage + +class StreamMessageBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one log node. The server stores + this serialized and opaque; it decodes only to trim a partial first page or + to apply a topic filter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... + def __init__( + self, + *, + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["messages", b"messages"] + ) -> None: ... + +global___StreamMessageBatch = StreamMessageBatch diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index b1383816d..bf947056a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.pyi b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 60dafee45..b813e2dfc 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -1,138 +1,881 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/request_response.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/request_response.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... - -class CreateStreamOutput(_message.Message): - __slots__ = ("run_id",) - RUN_ID_FIELD_NUMBER: _ClassVar[int] - run_id: str - def __init__(self, run_id: _Optional[str] = ...) -> None: ... - -class AddMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - expected_offset: int - use_expected_offset: bool - owner_epoch: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... - -class AddMessagesOutput(_message.Message): - __slots__ = ("first_offset", "next_offset", "count", "deduplicated") - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] - first_offset: int - next_offset: int - count: int - deduplicated: bool - def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... - -class FinishWritingInput(_message.Message): - __slots__ = ("namespace", "stream_id", "producer_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - producer_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... - -class FinishWritingOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class SubscribeWorkflowInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - stream_id: str - start_offset: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... - -class SubscribeWorkflowOutput(_message.Message): - __slots__ = ("start_offset",) - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - start_offset: int - def __init__(self, start_offset: _Optional[int] = ...) -> None: ... - -class PollMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... - -class PollMessagesOutput(_message.Message): - __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") - MESSAGES_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - next_offset: int - head_offset: int - closed: bool - close_reason: _message_pb2_1.Payload - def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... - -class DescribeStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... - -class PollWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... - -class DescribeWorkflowStreamInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... - -class AddWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... - -class DescribeStreamOutput(_message.Message): - __slots__ = ("state",) - STATE_FIELD_NUMBER: _ClassVar[int] - state: _stream_state_pb2.StreamState - def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... - -class CloseStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "reason") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - REASON_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - reason: _message_pb2_1.Payload - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... - -class CloseStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class TruncateStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "new_base_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - new_base_offset: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... - -class TruncateStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class DeleteStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... - -class DeleteStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class CreateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CreateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... - -class CreateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CreateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... - -class AddMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... - -class AddMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... - -class FinishWritingRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: FinishWritingInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... - -class FinishWritingResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: FinishWritingOutput - def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... - -class SubscribeWorkflowRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: SubscribeWorkflowInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... - -class SubscribeWorkflowResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: SubscribeWorkflowOutput - def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... - -class PollMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... - -class PollMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... - -class DescribeStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... - -class DescribeStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... - -class PollWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... - -class PollWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... - -class DescribeWorkflowStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeWorkflowStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... - -class DescribeWorkflowStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... - -class AddWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... - -class AddWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... - -class CloseStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CloseStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... - -class CloseStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CloseStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... - -class TruncateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: TruncateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... - -class TruncateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: TruncateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... - -class ListStreamsInput(_message.Message): - __slots__ = ("namespace", "page_size", "next_page_token", "query") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - QUERY_FIELD_NUMBER: _ClassVar[int] - namespace: str - page_size: int - next_page_token: bytes - query: str - def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... - -class StreamListEntry(_message.Message): - __slots__ = ("stream_id", "run_id") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - stream_id: str - run_id: str - def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... - -class ListStreamsOutput(_message.Message): - __slots__ = ("streams", "next_page_token") - STREAMS_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] - next_page_token: bytes - def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... - -class ListStreamsRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: ListStreamsInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... - -class ListStreamsResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: ListStreamsOutput - def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... - -class DeleteStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DeleteStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... - -class DeleteStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DeleteStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 +import temporalio.api.streamservice.v1.message_pb2 +import temporalio.api.streamservice.v1.stream_state_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CreateStreamInput(google.protobuf.message.Message): + """The frontend-facing shapes are defined here rather than in the public API + because streams have no public API yet. Keeping them in a nested + frontend_request mirrors the other CHASM libraries, so promoting them later + is a package move rather than a redesign. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def lifecycle( + self, + ) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + lifecycle: temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["lifecycle", b"lifecycle"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "lifecycle", + b"lifecycle", + "namespace", + b"namespace", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___CreateStreamInput = CreateStreamInput + +class CreateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + run_id: builtins.str + def __init__( + self, + *, + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["run_id", b"run_id"] + ) -> None: ... + +global___CreateStreamOutput = CreateStreamOutput + +class AddMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + USE_EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional. Supplying it skips resolving the stream's current run, which is + a persistence lookup on every call. CreateStream returns it. + """ + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Idempotency, all optional. Supply a producer identity and sequence, or an + expected offset, or neither and accept at-least-once. + """ + sequence: builtins.int + expected_offset: builtins.int + """Guarded by use_expected_offset because proto3 optional is not supported + by this repo's helper generator. + """ + use_expected_offset: builtins.bool + owner_epoch: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + expected_offset: builtins.int = ..., + use_expected_offset: builtins.bool = ..., + owner_epoch: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "expected_offset", + b"expected_offset", + "messages", + b"messages", + "namespace", + b"namespace", + "owner_epoch", + b"owner_epoch", + "producer_id", + b"producer_id", + "run_id", + b"run_id", + "sequence", + b"sequence", + "stream_id", + b"stream_id", + "use_expected_offset", + b"use_expected_offset", + ], + ) -> None: ... + +global___AddMessagesInput = AddMessagesInput + +class AddMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FIRST_OFFSET_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + DEDUPLICATED_FIELD_NUMBER: builtins.int + first_offset: builtins.int + next_offset: builtins.int + count: builtins.int + deduplicated: builtins.bool + """True when a retry matched a recorded sequence and nothing was appended.""" + def __init__( + self, + *, + first_offset: builtins.int = ..., + next_offset: builtins.int = ..., + count: builtins.int = ..., + deduplicated: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "count", + b"count", + "deduplicated", + b"deduplicated", + "first_offset", + b"first_offset", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___AddMessagesOutput = AddMessagesOutput + +class FinishWritingInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + producer_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + producer_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___FinishWritingInput = FinishWritingInput + +class FinishWritingOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___FinishWritingOutput = FinishWritingOutput + +class SubscribeWorkflowInput(google.protobuf.message.Message): + """Registers a Workflow as a consumer of a stream it owns. The cursor lands in + the Workflow's own state, so from then on each of its Workflow Tasks carries + the next range and records what it consumed. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Name of the stream within the Workflow, for a stream it owns.""" + stream_id: builtins.str + """Id of a standalone stream in another execution. Exactly one of this and + stream_name is set. + """ + start_offset: builtins.int + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___SubscribeWorkflowInput = SubscribeWorkflowInput + +class SubscribeWorkflowOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + start_offset: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["start_offset", b"start_offset"] + ) -> None: ... + +global___SubscribeWorkflowOutput = SubscribeWorkflowOutput + +class PollMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional, as on AddMessagesInput.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters by exact topic. Offsets are assigned over the unfiltered stream, so + next_offset advances past filtered-out messages too. + """ + wait_new_messages: builtins.bool + """When set and the reader is caught up, block until something arrives, the + stream closes, or the server's long-poll timeout elapses. A timeout returns + an empty response rather than an error, so the caller simply polls again. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + ], + ) -> None: ... + +global___PollMessagesInput = PollMessagesInput + +class PollMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + next_offset: builtins.int + head_offset: builtins.int + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + next_offset: builtins.int = ..., + head_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "closed", + b"closed", + "head_offset", + b"head_offset", + "messages", + b"messages", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___PollMessagesOutput = PollMessagesOutput + +class DescribeStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DescribeStreamInput = DescribeStreamInput + +class PollWorkflowMessagesInput(google.protobuf.message.Message): + """A stream a workflow owns lives inside that workflow's execution, so it has + no standalone id to address it by. It is named by its owner and its name + instead, and routed on the owner. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters as on PollMessagesInput.""" + wait_new_messages: builtins.bool + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___PollWorkflowMessagesInput = PollWorkflowMessagesInput + +class DescribeWorkflowStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput + +class AddWorkflowMessagesInput(google.protobuf.message.Message): + """Appending to a stream a workflow owns, from outside that workflow. The + workflow's own publishes ride its Workflow Task instead. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Optional idempotency, as on AddMessagesInput.""" + sequence: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", + b"messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AddWorkflowMessagesInput = AddWorkflowMessagesInput + +class DescribeStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATE_FIELD_NUMBER: builtins.int + @property + def state(self) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamState: ... + def __init__( + self, + *, + state: temporalio.api.streamservice.v1.stream_state_pb2.StreamState + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> None: ... + +global___DescribeStreamOutput = DescribeStreamOutput + +class CloseStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["reason", b"reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "reason", b"reason", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___CloseStreamInput = CloseStreamInput + +class CloseStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___CloseStreamOutput = CloseStreamOutput + +class TruncateStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + NEW_BASE_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + new_base_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + new_base_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "new_base_offset", + b"new_base_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___TruncateStreamInput = TruncateStreamInput + +class TruncateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___TruncateStreamOutput = TruncateStreamOutput + +class DeleteStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DeleteStreamInput = DeleteStreamInput + +class DeleteStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___DeleteStreamOutput = DeleteStreamOutput + +class CreateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CreateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CreateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CreateStreamRequest = CreateStreamRequest + +class CreateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CreateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CreateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CreateStreamResponse = CreateStreamResponse + +class AddMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddMessagesRequest = AddMessagesRequest + +class AddMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddMessagesResponse = AddMessagesResponse + +class FinishWritingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___FinishWritingInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___FinishWritingInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___FinishWritingRequest = FinishWritingRequest + +class FinishWritingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___FinishWritingOutput: ... + def __init__( + self, + *, + frontend_response: global___FinishWritingOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___FinishWritingResponse = FinishWritingResponse + +class SubscribeWorkflowRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___SubscribeWorkflowInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___SubscribeWorkflowInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___SubscribeWorkflowRequest = SubscribeWorkflowRequest + +class SubscribeWorkflowResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___SubscribeWorkflowOutput: ... + def __init__( + self, + *, + frontend_response: global___SubscribeWorkflowOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___SubscribeWorkflowResponse = SubscribeWorkflowResponse + +class PollMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollMessagesRequest = PollMessagesRequest + +class PollMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollMessagesResponse = PollMessagesResponse + +class DescribeStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeStreamRequest = DescribeStreamRequest + +class DescribeStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeStreamResponse = DescribeStreamResponse + +class PollWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollWorkflowMessagesRequest = PollWorkflowMessagesRequest + +class PollWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollWorkflowMessagesResponse = PollWorkflowMessagesResponse + +class DescribeWorkflowStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeWorkflowStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeWorkflowStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeWorkflowStreamRequest = DescribeWorkflowStreamRequest + +class DescribeWorkflowStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeWorkflowStreamResponse = DescribeWorkflowStreamResponse + +class RegisterStreamConsumerInput(google.protobuf.message.Message): + """Registering a consumer on a stream in another execution. Split out from + SubscribeWorkflow because the two halves live on different shards: the pin + goes on the stream, the cursor goes on the consuming workflow, and a handler + can only reach the shard it was routed to. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + consumer_workflow_id: builtins.str + """The workflow that will consume, which names the pin.""" + start_offset: builtins.int + """Negative means from wherever the stream is when the pin is taken. Resolved + here, where the frontier is, and returned so the cursor records a fact. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + consumer_workflow_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_workflow_id", + b"consumer_workflow_id", + "namespace", + b"namespace", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___RegisterStreamConsumerInput = RegisterStreamConsumerInput + +class RegisterStreamConsumerOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + start_offset: builtins.int + collection_id: builtins.str + """What the consumer needs to address the log, all decided by the stream.""" + bucket_size: builtins.int + known_head: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + known_head: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "known_head", + b"known_head", + "start_offset", + b"start_offset", + ], + ) -> None: ... + +global___RegisterStreamConsumerOutput = RegisterStreamConsumerOutput + +class AdvanceConsumerHeadInput(google.protobuf.message.Message): + """Telling one consumer that the frontier moved. Routed to the consumer, which + is not where the stream lives. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """The run that subscribed. A successor from continue-as-new holds no cursor + for this stream, so pushing the frontier at it would land nowhere. + """ + stream_id: builtins.str + head_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_id: builtins.str = ..., + head_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "head_offset", + b"head_offset", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_id", + b"stream_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput + +class AdvanceConsumerHeadOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput + +class AddWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddWorkflowMessagesRequest = AddWorkflowMessagesRequest + +class AddWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddWorkflowMessagesResponse = AddWorkflowMessagesResponse + +class RegisterStreamConsumerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___RegisterStreamConsumerInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___RegisterStreamConsumerInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___RegisterStreamConsumerRequest = RegisterStreamConsumerRequest + +class RegisterStreamConsumerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___RegisterStreamConsumerOutput: ... + def __init__( + self, + *, + frontend_response: global___RegisterStreamConsumerOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___RegisterStreamConsumerResponse = RegisterStreamConsumerResponse + +class AdvanceConsumerHeadRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AdvanceConsumerHeadInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AdvanceConsumerHeadInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AdvanceConsumerHeadRequest = AdvanceConsumerHeadRequest + +class AdvanceConsumerHeadResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AdvanceConsumerHeadOutput: ... + def __init__( + self, + *, + frontend_response: global___AdvanceConsumerHeadOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AdvanceConsumerHeadResponse = AdvanceConsumerHeadResponse + +class CloseStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CloseStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CloseStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CloseStreamRequest = CloseStreamRequest + +class CloseStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CloseStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CloseStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CloseStreamResponse = CloseStreamResponse + +class TruncateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___TruncateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___TruncateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___TruncateStreamRequest = TruncateStreamRequest + +class TruncateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___TruncateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___TruncateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___TruncateStreamResponse = TruncateStreamResponse + +class ListStreamsInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + QUERY_FIELD_NUMBER: builtins.int + namespace: builtins.str + page_size: builtins.int + next_page_token: builtins.bytes + query: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + page_size: builtins.int = ..., + next_page_token: builtins.bytes = ..., + query: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "next_page_token", + b"next_page_token", + "page_size", + b"page_size", + "query", + b"query", + ], + ) -> None: ... + +global___ListStreamsInput = ListStreamsInput + +class StreamListEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___StreamListEntry = StreamListEntry + +class ListStreamsOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAMS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + @property + def streams( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamListEntry + ]: ... + next_page_token: builtins.bytes + def __init__( + self, + *, + streams: collections.abc.Iterable[global___StreamListEntry] | None = ..., + next_page_token: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "next_page_token", b"next_page_token", "streams", b"streams" + ], + ) -> None: ... + +global___ListStreamsOutput = ListStreamsOutput + +class ListStreamsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___ListStreamsInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___ListStreamsInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___ListStreamsRequest = ListStreamsRequest + +class ListStreamsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___ListStreamsOutput: ... + def __init__( + self, + *, + frontend_response: global___ListStreamsOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___ListStreamsResponse = ListStreamsResponse + +class DeleteStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DeleteStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DeleteStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DeleteStreamRequest = DeleteStreamRequest + +class DeleteStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DeleteStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DeleteStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DeleteStreamResponse = DeleteStreamResponse diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index 87cc91022..bf947056a 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index 7f376c28e..432abfc5c 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -1,38 +1,34 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/service.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/service.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xce\x12\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16RegisterStreamConsumer\x12H.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerResponse"\x00\x12\xa6\x01\n\x13\x41\x64vanceConsumerHead\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) + +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) class StreamServiceStub(object): @@ -35,70 +18,80 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.CreateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + ) self.AddMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + ) self.FinishWriting = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + ) self.SubscribeWorkflow = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + ) self.PollMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + ) self.DescribeStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + ) self.PollWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + ) self.DescribeWorkflowStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + ) self.AddWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + ) + self.RegisterStreamConsumer = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + ) + self.AdvanceConsumerHead = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + ) self.CloseStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + ) self.TruncateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + ) self.ListStreams = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + ) self.DeleteStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + ) class StreamServiceServicer(object): @@ -107,178 +100,204 @@ class StreamServiceServicer(object): def CreateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def FinishWriting(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def SubscribeWorkflow(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollWorkflowMessages(self, request, context): - """Routed on the owner, because the stream it reads has no id of its own. - """ + """Routed on the owner, because the stream it reads has no id of its own.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeWorkflowStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddWorkflowMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def RegisterStreamConsumer(self, request, context): + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def AdvanceConsumerHead(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def TruncateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def ListStreams(self, request, context): """Served on the frontend only: it queries visibility rather than a stream, so there is no business ID to route on and nothing for a shard to answer. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DeleteStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def add_StreamServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'CreateStream': grpc.unary_unary_rpc_method_handler( - servicer.CreateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, - ), - 'AddMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, - ), - 'FinishWriting': grpc.unary_unary_rpc_method_handler( - servicer.FinishWriting, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, - ), - 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( - servicer.SubscribeWorkflow, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, - ), - 'PollMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, - ), - 'DescribeStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, - ), - 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, - ), - 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeWorkflowStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, - ), - 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, - ), - 'CloseStream': grpc.unary_unary_rpc_method_handler( - servicer.CloseStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, - ), - 'TruncateStream': grpc.unary_unary_rpc_method_handler( - servicer.TruncateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, - ), - 'ListStreams': grpc.unary_unary_rpc_method_handler( - servicer.ListStreams, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, - ), - 'DeleteStream': grpc.unary_unary_rpc_method_handler( - servicer.DeleteStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, - ), + "CreateStream": grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + "AddMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + "FinishWriting": grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + "SubscribeWorkflow": grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + "PollMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + "DescribeStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + "PollWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + "DescribeWorkflowStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + "AddWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + "RegisterStreamConsumer": grpc.unary_unary_rpc_method_handler( + servicer.RegisterStreamConsumer, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.SerializeToString, + ), + "AdvanceConsumerHead": grpc.unary_unary_rpc_method_handler( + servicer.AdvanceConsumerHead, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.SerializeToString, + ), + "CloseStream": grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + "TruncateStream": grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + "ListStreams": grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + "DeleteStream": grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) - # This class is part of an EXPERIMENTAL API. +# This class is part of an EXPERIMENTAL API. class StreamService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def CreateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CreateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, options, @@ -289,23 +308,25 @@ def CreateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def AddMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, options, @@ -316,23 +337,25 @@ def AddMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def FinishWriting(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def FinishWriting( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, options, @@ -343,23 +366,25 @@ def FinishWriting(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def SubscribeWorkflow(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def SubscribeWorkflow( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, options, @@ -370,23 +395,25 @@ def SubscribeWorkflow(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def PollMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, options, @@ -397,23 +424,25 @@ def PollMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DescribeStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, options, @@ -424,23 +453,25 @@ def DescribeStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def PollWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, options, @@ -451,23 +482,25 @@ def PollWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DescribeWorkflowStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeWorkflowStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, options, @@ -478,23 +511,25 @@ def DescribeWorkflowStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def AddWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, options, @@ -505,23 +540,83 @@ def AddWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) + + @staticmethod + def RegisterStreamConsumer( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) @staticmethod - def CloseStream(request, + def AdvanceConsumerHead( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def CloseStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, options, @@ -532,23 +627,25 @@ def CloseStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def TruncateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def TruncateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, options, @@ -559,23 +656,25 @@ def TruncateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def ListStreams(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def ListStreams( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, options, @@ -586,23 +685,25 @@ def ListStreams(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DeleteStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DeleteStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, options, @@ -613,4 +714,4 @@ def DeleteStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi new file mode 100644 index 000000000..1530074ec --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi @@ -0,0 +1,195 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import abc + +import grpc + +import temporalio.api.streamservice.v1.request_response_pb2 + +class StreamServiceStub: + def __init__(self, channel: grpc.Channel) -> None: ... + CreateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse, + ] + AddMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse, + ] + FinishWriting: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse, + ] + SubscribeWorkflow: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse, + ] + PollMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse, + ] + DescribeStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse, + ] + PollWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, + ] + """Routed on the owner, because the stream it reads has no id of its own.""" + DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, + ] + AddWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse, + ] + RegisterStreamConsumer: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse, + ] + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + AdvanceConsumerHead: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse, + ] + CloseStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse, + ] + TruncateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse, + ] + ListStreams: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse, + ] + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + DeleteStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse, + ] + +class StreamServiceServicer(metaclass=abc.ABCMeta): + @abc.abstractmethod + def CreateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse: ... + @abc.abstractmethod + def AddMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse: ... + @abc.abstractmethod + def FinishWriting( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse: ... + @abc.abstractmethod + def SubscribeWorkflow( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse + ): ... + @abc.abstractmethod + def PollMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse: ... + @abc.abstractmethod + def DescribeStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse + ): ... + @abc.abstractmethod + def PollWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: + """Routed on the owner, because the stream it reads has no id of its own.""" + @abc.abstractmethod + def DescribeWorkflowStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse: ... + @abc.abstractmethod + def AddWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse + ): ... + @abc.abstractmethod + def RegisterStreamConsumer( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse: + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + @abc.abstractmethod + def AdvanceConsumerHead( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse + ): ... + @abc.abstractmethod + def CloseStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse: ... + @abc.abstractmethod + def TruncateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse + ): ... + @abc.abstractmethod + def ListStreams( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse: + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + @abc.abstractmethod + def DeleteStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse: ... + +def add_StreamServiceServicer_to_server( + servicer: StreamServiceServicer, server: grpc.Server +) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 234fa94d0..2ce5a0451 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -1,22 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/stream_state.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/stream_state.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -24,33 +16,119 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ None: ... - class ConsumersEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: ConsumerCursor - def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCERS_FIELD_NUMBER: _ClassVar[int] - CONSUMERS_FIELD_NUMBER: _ClassVar[int] - LIFECYCLE_FIELD_NUMBER: _ClassVar[int] - REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] - head_offset: int - base_offset: int - last_txn_id: int - closed: bool - close_reason: _message_pb2.Payload - owner_epoch: int - bucket_size: int - collection_id: str - producers: _containers.MessageMap[str, ProducerCursor] - consumers: _containers.MessageMap[str, ConsumerCursor] - lifecycle: StreamLifecycle - redirect_run_id: str - close_time: _timestamp_pb2.Timestamp - def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... - -class ProducerCursor(_message.Message): - __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") - SEQ_FIELD_NUMBER: _ClassVar[int] - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] - FENCED_FIELD_NUMBER: _ClassVar[int] - seq: int - first_offset: int - count: int - content_hash: bytes - fenced: bool - def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... - -class ConsumerCursor(_message.Message): - __slots__ = ("workflow_id", "run_id", "offset", "active", "external") - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - ACTIVE_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - workflow_id: str - run_id: str - offset: int - active: bool - external: bool - def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... - -class WorkflowStreamCursor(_message.Message): - __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - PENDING_FROM_FIELD_NUMBER: _ClassVar[int] - PENDING_TO_FIELD_NUMBER: _ClassVar[int] - HAS_PENDING_FIELD_NUMBER: _ClassVar[int] - stream_id: str - collection_id: str - bucket_size: int - offset: int - known_head: int - external: bool - pending_from: int - pending_to: int - has_pending: bool - def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... - -class StreamLifecycle(_message.Message): - __slots__ = ("retention", "max_items") - RETENTION_FIELD_NUMBER: _ClassVar[int] - MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] - retention: _duration_pb2.Duration - max_items: int - def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.duration_pb2 +import google.protobuf.internal.containers +import google.protobuf.message +import google.protobuf.timestamp_pb2 + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamState(google.protobuf.message.Message): + """Size is O(producers + consumers), never O(messages). Payload bytes live in + the log, not here, which is what keeps this off the CHASM partial-read path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class ProducersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ProducerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ProducerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + class ConsumersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ConsumerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ConsumerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + HEAD_OFFSET_FIELD_NUMBER: builtins.int + BASE_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + PRODUCERS_FIELD_NUMBER: builtins.int + CONSUMERS_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + REDIRECT_RUN_ID_FIELD_NUMBER: builtins.int + CLOSE_TIME_FIELD_NUMBER: builtins.int + head_offset: builtins.int + """Visibility frontier. Readers never observe an offset at or past this.""" + base_offset: builtins.int + """Truncation floor. Offsets below this are gone.""" + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + owner_epoch: builtins.int + """Bumped on ownership change so a stale producer's write fails.""" + bucket_size: builtins.int + """Immutable once set. Offsets roll to a new log tree every bucket_size so no + single storage partition grows with the stream. + """ + collection_id: builtins.str + """Identity of the log this stream writes to. Bucket trees are derived from + it, so there is no per-bucket index to store. + """ + @property + def producers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ProducerCursor + ]: ... + @property + def consumers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ConsumerCursor + ]: ... + @property + def lifecycle(self) -> global___StreamLifecycle: ... + redirect_run_id: builtins.str + """Set when a successor run takes ownership, so an in-flight poll can follow + the chain instead of stalling on a superseded run. + """ + @property + def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: + """Wall-clock close time, used to schedule retention deletion.""" + def __init__( + self, + *, + head_offset: builtins.int = ..., + base_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + owner_epoch: builtins.int = ..., + bucket_size: builtins.int = ..., + collection_id: builtins.str = ..., + producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] + | None = ..., + consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] + | None = ..., + lifecycle: global___StreamLifecycle | None = ..., + redirect_run_id: builtins.str = ..., + close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "lifecycle", + b"lifecycle", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "base_offset", + b"base_offset", + "bucket_size", + b"bucket_size", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "closed", + b"closed", + "collection_id", + b"collection_id", + "consumers", + b"consumers", + "head_offset", + b"head_offset", + "lifecycle", + b"lifecycle", + "owner_epoch", + b"owner_epoch", + "producers", + b"producers", + "redirect_run_id", + b"redirect_run_id", + ], + ) -> None: ... + +global___StreamState = StreamState + +class ProducerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + CONTENT_HASH_FIELD_NUMBER: builtins.int + FENCED_FIELD_NUMBER: builtins.int + seq: builtins.int + first_offset: builtins.int + count: builtins.int + content_hash: builtins.bytes + """Distinguishes a genuine retry from a client reusing a sequence with + different content, which must be rejected rather than deduplicated. + """ + fenced: builtins.bool + """Set by FinishWriting. Ends this producer's writes without closing the + stream for anyone else. + """ + def __init__( + self, + *, + seq: builtins.int = ..., + first_offset: builtins.int = ..., + count: builtins.int = ..., + content_hash: builtins.bytes = ..., + fenced: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "content_hash", + b"content_hash", + "count", + b"count", + "fenced", + b"fenced", + "first_offset", + b"first_offset", + "seq", + b"seq", + ], + ) -> None: ... + +global___ProducerCursor = ProducerCursor + +class ConsumerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + ACTIVE_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + REPLAY_FLOOR_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + offset: builtins.int + """How far this consumer has read. Used to decide whether it needs waking, + not to decide what the stream may drop. + """ + active: builtins.bool + external: builtins.bool + """Set when the consumer is a workflow in another execution, which is the + only case that has to be told the frontier moved. A workflow consuming a + stream it owns sees that while closing its own transaction. + """ + replay_floor: builtins.int + """The oldest offset this consumer's History still depends on. + + It is where the subscription started, not where it has read to. A range + this consumer already consumed is recorded in its History and has to be + re-readable for the workflow to replay, so bytes below the read position + are exactly the ones a replay needs most. It stays put while the consumer + is active and is released when it deregisters. + """ + def __init__( + self, + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + offset: builtins.int = ..., + active: builtins.bool = ..., + external: builtins.bool = ..., + replay_floor: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "active", + b"active", + "external", + b"external", + "offset", + b"offset", + "replay_floor", + b"replay_floor", + "run_id", + b"run_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___ConsumerCursor = ConsumerCursor + +class WorkflowStreamCursor(google.protobuf.message.Message): + """A consuming Workflow's position in a stream. This lives in the consuming + Workflow's own state rather than on the stream, so advancing it commits in + the same transaction as the WorkflowTaskCompleted event that records the + range. Keeping it on the stream would make the advance a cross-execution + write, and a crash between the two would either redeliver or skip. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + PENDING_FROM_FIELD_NUMBER: builtins.int + PENDING_TO_FIELD_NUMBER: builtins.int + HAS_PENDING_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + collection_id: builtins.str + """Enough to address the log without reading the stream component first.""" + bucket_size: builtins.int + offset: builtins.int + """Next offset to deliver.""" + known_head: builtins.int + """The stream's frontier as of the last delivery. A workflow consuming a + stream in another execution cannot read the real frontier while closing its + own transaction, so this is what tells it a capped slice left more behind. + """ + external: builtins.bool + """Set when the stream lives in another execution, which decides whether the + frontier is read locally or taken from known_head. + """ + pending_from: builtins.int + """The range attached to the Workflow Task currently in flight. Recorded on + the event that closes that task, then folded into offset. An empty range + is still recorded: a task where the subscription saw nothing is a fact + replay has to reproduce. + """ + pending_to: builtins.int + has_pending: builtins.bool + start_offset: builtins.int + """Where this subscription began reading. Retained separately from offset, + which advances, because replay has to tell "committed nothing yet" apart + from "the events recording what was committed are not in this page". + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + offset: builtins.int = ..., + known_head: builtins.int = ..., + external: builtins.bool = ..., + pending_from: builtins.int = ..., + pending_to: builtins.int = ..., + has_pending: builtins.bool = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "external", + b"external", + "has_pending", + b"has_pending", + "known_head", + b"known_head", + "offset", + b"offset", + "pending_from", + b"pending_from", + "pending_to", + b"pending_to", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___WorkflowStreamCursor = WorkflowStreamCursor + +class StreamLifecycle(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RETENTION_FIELD_NUMBER: builtins.int + MAX_ITEMS_FIELD_NUMBER: builtins.int + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a closed stream stays readable before it is deleted.""" + max_items: builtins.int + """Cap on readable messages. Older whole buckets are reclaimed once the floor + passes them, so a capped stream has bounded storage. + """ + def __init__( + self, + *, + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_items: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["retention", b"retention"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_items", b"max_items", "retention", b"retention" + ], + ) -> None: ... + +global___StreamLifecycle = StreamLifecycle diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index 4e128a2aa..bf947056a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 8280b56d4..2de4cb4e0 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -77,7 +77,9 @@ def __init__(self, channel: Any, namespace: str) -> None: """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" self._channel = channel self._namespace = namespace - self._stub = service_pb2_grpc.StreamServiceStub(channel) + # The generated stub is typed for a synchronous channel. This client + # drives it over ``grpc.aio``, where every call is awaited. + self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod def connect(target_host: str, namespace: str = "default") -> "StreamClient": From ef73656ea13ef0214f7eccc5ab7d2fa3f1db4c9a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:44:45 -0700 Subject: [PATCH 412/831] Repinned Core to the finalized replay-slice branch. The stream client needs the replay slice lookahead fix that branch finished. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 3d1f82e66..f88f78c3f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 +Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c From db6311a720ed09c4d6334648a2e989f19c2a2f10 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:47:50 -0700 Subject: [PATCH 413/831] Qualified the LangGraph docstring's stream references. The new server_streams module gives WorkflowStream and WorkflowStreamClient a second definition, so pydoctor can no longer resolve the short names. --- temporalio/contrib/langgraph/_plugin.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/temporalio/contrib/langgraph/_plugin.py b/temporalio/contrib/langgraph/_plugin.py index 03881ca2a..1819c646d 100644 --- a/temporalio/contrib/langgraph/_plugin.py +++ b/temporalio/contrib/langgraph/_plugin.py @@ -104,11 +104,13 @@ class LangGraphPlugin(SimplePlugin): inherited default of either form. streaming_topic: When set, ``langgraph.config.get_stream_writer()`` inside a node publishes to this topic on the workflow's - :class:`WorkflowStream`. The workflow must construct - ``WorkflowStream()`` in its ``@workflow.init`` (the plugin's + :class:`temporalio.contrib.workflow_streams.WorkflowStream`. The + workflow must construct ``WorkflowStream()`` in its + ``@workflow.init`` (the plugin's interceptor verifies this on workflow start). Nodes with ``execute_in='activity'`` publish through - :class:`WorkflowStreamClient` (signal); nodes with + :class:`temporalio.contrib.workflow_streams.WorkflowStreamClient` + (signal); nodes with ``execute_in='workflow'`` publish synchronously to the in-workflow stream (no signal). streaming_batch_interval: How often the activity-side stream From 57fc9f78c1ee74c47a0f764305098ae5b80c18f0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:28:27 -0700 Subject: [PATCH 414/831] Repinned Core to the WIT-aligned replay-slice head. That head matches upstream's nexus model WIT for the workflow-id policies, which the current generator requires. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index f88f78c3f..4076ef24f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c +Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 From 47847ce311ed71d2832eac690cc1194a8fad347b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:30:52 -0700 Subject: [PATCH 415/831] Regenerated the bridge protos from the repinned Core. The generated module was missing the local-activity marker argument flag its own stub already declared, so the two disagreed about the message. --- .../workflow_commands_pb2.py | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 3374f951a..0d81e37f5 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -511,8 +511,8 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 _WORKFLOWCOMMAND._serialized_start = 556 _WORKFLOWCOMMAND._serialized_end = 2794 _ADDSTREAMMESSAGES._serialized_start = 2796 @@ -528,57 +528,57 @@ _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY._serialized_end = 4683 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4646 - _REQUESTCANCELACTIVITY._serialized_end = 4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 - _QUERYRESULT._serialized_start = 4728 - _QUERYRESULT._serialized_end = 4884 - _QUERYSUCCESS._serialized_start = 4886 - _QUERYSUCCESS._serialized_end = 4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 - _FAILWORKFLOWEXECUTION._serialized_start = 5031 - _FAILWORKFLOWEXECUTION._serialized_end = 5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _REQUESTCANCELACTIVITY._serialized_start = 4685 + _REQUESTCANCELACTIVITY._serialized_end = 4721 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 + _QUERYRESULT._serialized_start = 4767 + _QUERYRESULT._serialized_end = 4923 + _QUERYSUCCESS._serialized_start = 4925 + _QUERYSUCCESS._serialized_end = 4990 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 + _FAILWORKFLOWEXECUTION._serialized_start = 5070 + _FAILWORKFLOWEXECUTION._serialized_end = 5144 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6024 - _CANCELWORKFLOWEXECUTION._serialized_end = 6100 - _SETPATCHMARKER._serialized_start = 6102 - _SETPATCHMARKER._serialized_end = 6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _CANCELWORKFLOWEXECUTION._serialized_start = 6063 + _CANCELWORKFLOWEXECUTION._serialized_end = 6139 + _SETPATCHMARKER._serialized_start = 6141 + _SETPATCHMARKER._serialized_end = 6195 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7958 - _CANCELSIGNALWORKFLOW._serialized_end = 7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 - _UPDATERESPONSE._serialized_start = 8180 - _UPDATERESPONSE._serialized_end = 8390 - _SCHEDULENEXUSOPERATION._serialized_start = 8393 - _SCHEDULENEXUSOPERATION._serialized_end = 8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 + _CANCELSIGNALWORKFLOW._serialized_start = 7997 + _CANCELSIGNALWORKFLOW._serialized_end = 8032 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 + _UPDATERESPONSE._serialized_start = 8219 + _UPDATERESPONSE._serialized_end = 8429 + _SCHEDULENEXUSOPERATION._serialized_start = 8432 + _SCHEDULENEXUSOPERATION._serialized_end = 8970 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 # @@protoc_insertion_point(module_scope) From aa488348efb572be069d05ed60142a3ff13ce95b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:21:21 -0700 Subject: [PATCH 416/831] Adapted the native provider to the interface changes. The append cursor names the last record and is None for a batch the server deduplicated, so the stream client reports what the server said about the append. Producer identity is resolved by the package, inbound frames carry no topic, and the inbound id comes from the shared helper. --- temporalio/client_stream.py | 47 ++++++++++++--- temporalio/streams/providers/native.py | 83 +++++++++++++------------- tests/test_client_stream.py | 11 +++- 3 files changed, 89 insertions(+), 52 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 2de4cb4e0..1cd775043 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -33,7 +33,28 @@ import temporalio.api.streamservice.v1 as stream from temporalio.api.streamservice.v1 import service_pb2_grpc -__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] +__all__ = [ + "Appended", + "Message", + "Page", + "StreamClient", + "StreamHandle", + "WorkflowStreamHandle", +] + + +@dataclass(frozen=True) +class Appended: + """Where one append landed. + + ``deduplicated`` says the server already held this producer's batch at + this sequence and wrote nothing; the offsets are then the original ones. + """ + + first_offset: int + next_offset: int + count: int + deduplicated: bool = False @dataclass(frozen=True) @@ -185,13 +206,14 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: - """Append messages and return the offset the first one landed at. + ) -> Appended: + """Append messages and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than - appending twice. Without them the append is at-least-once, which is - only the right trade when duplicates are harmless. + appending twice, and says so. Without them the append is + at-least-once, which is only the right trade when duplicates are + harmless. """ response = await self._stub.AddMessages( stream.AddMessagesRequest( @@ -214,7 +236,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -352,7 +374,7 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: + ) -> Appended: """Append from outside the workflow, as :meth:`StreamHandle.append`. Batch where you can. The append costs one transition on the owning @@ -380,7 +402,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -479,3 +501,12 @@ async def describe(self) -> stream.StreamState: ) ) return response.frontend_response.state + + +def _appended(out: stream.AddMessagesOutput) -> Appended: + return Appended( + first_offset=out.first_offset, + next_offset=out.next_offset, + count=out.count, + deduplicated=out.deduplicated, + ) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 53d231174..f886d467b 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -8,21 +8,25 @@ from __future__ import annotations import asyncio -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any -from temporalio import activity, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._ids import inbound_stream_id from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_STATE = "__temporal_streams_state" +logger = logging.getLogger(__name__) + class _Fanout: """One server subscription, shared by every reader of that stream. @@ -104,18 +108,6 @@ async def publish(self, frame: bytes) -> None: workflow.add_stream_messages([frame], stream_id="", topic=self._topic) -def inbound_stream_id(workflow_id: str, stream: str) -> str: - """The server-side id of a workflow's inbound stream. - - A workflow names its streams relative to itself, so every provider can - address the same thing without workflow code knowing how it is stored. - Here that is a namespace-level stream id built from the pair, and the - workflow id rather than the run id because the stream has to survive - continue-as-new and reset. - """ - return f"{workflow_id}:{stream}" - - def _reject_configured_codec(client: Client) -> None: """Refuse a namespace whose payloads are meant to be encoded. @@ -200,8 +192,10 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append values and return where the first one landed.""" + async def append(self, *values: Any) -> Cursor | None: + """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + if not values: + return None frames = [] for value in values: frames.append( @@ -215,7 +209,7 @@ async def append(self, *values: Any) -> Cursor: ) ) self._sequence += 1 - offset = await self._handle.append( + appended = await self._handle.append( *frames, topic=self._topic, producer_id=self._provider_id, @@ -223,7 +217,9 @@ async def append(self, *values: Any) -> Cursor: # different job from telling readers that a new generation started. sequence=self._sequence - len(frames), ) - return Cursor(str(offset)) + if appended.deduplicated: + return None + return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: """Declare this stream complete.""" @@ -255,10 +251,16 @@ def _encode(self, value: Any) -> bytes: class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" - def __init__(self, handle: Any, converter: Any) -> None: - """Read the stream ``handle`` names, from anywhere.""" + def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: + """Read the stream ``handle`` names, from anywhere. + + ``stream`` is the inbound name the caller used, empty for the owner's + stream; ``address`` is what the server calls it, for log lines. + """ self._handle = handle self._converter = converter + self._stream = stream + self._address = address async def read( self, @@ -266,12 +268,13 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() async for message in self._handle.follow( from_offset=int(after.token) + 1 if after.token else 0 @@ -281,7 +284,11 @@ async def read( kind, frame_topic, source, attempt, sequence, body = _frame.decode( message.data ) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning( + "skipping record %s of stream %s: %s", cursor, self._address, error + ) continue if topic is not None and frame_topic != topic: continue @@ -373,22 +380,19 @@ async def producer( ) -> NativeProducer: """Open a producer on ``workflow_id``'s account. - ``stream`` names an inbound stream; with none, ``topic`` names a topic - on the stream the workflow publishes, which the server lets any - producer append to. Inside an activity, leave ``producer_id`` and - ``attempt`` unset: the activity's own id and attempt are the right - answer and are what let a reader tell a retry from a new generation. + ``stream`` names an inbound stream, a namespace-level stream the + server keys by the pair. With none, ``topic`` names a topic on the + stream the workflow publishes, which the server lets any producer + append to. An inbound record carries no topic: the stream's name is + its whole address. """ _reject_configured_codec(client) - if not producer_id: - producer_id = activity.info().activity_id - if not attempt: - attempt = activity.info().attempt streams = _stream_client(client) + converter = client.data_converter.payload_converter if not stream: return NativeProducer( streams.workflow_stream(workflow_id), - client.data_converter.payload_converter, + converter, topic, producer_id, attempt, @@ -404,13 +408,7 @@ async def producer( # exception. handle = streams.get(stream_id) _handles[stream_id] = handle - return NativeProducer( - handle, - client.data_converter.payload_converter, - stream, - producer_id, - attempt, - ) + return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( self, client: Client, *, workflow_id: str, stream: str = "" @@ -423,11 +421,14 @@ async def consumer( """ _reject_configured_codec(client) streams = _stream_client(client) + address = inbound_stream_id(workflow_id, stream) if stream: - handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + handle: Any = streams.get(address) else: handle = streams.workflow_stream(workflow_id) - return NativeConsumer(handle, client.data_converter.payload_converter) + return NativeConsumer( + handle, client.data_converter.payload_converter, stream, address + ) _provider.register("native", _NativeProvider) diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index 8d1a42f30..fde925cca 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -40,8 +40,10 @@ async def stream() -> AsyncIterator[StreamHandle]: async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - assert await stream.append(b"alpha", b"beta") == 0 - assert await stream.append(b"gamma") == 2 + first = await stream.append(b"alpha", b"beta") + assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) + assert not first.deduplicated + assert (await stream.append(b"gamma")).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: @@ -69,7 +71,10 @@ async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: first = await stream.append(b"once", producer_id="p1", sequence=1) retry = await stream.append(b"once", producer_id="p1", sequence=1) - assert first == retry == 0 + assert first.first_offset == retry.first_offset == 0 + assert not first.deduplicated + # The retry is told it wrote nothing, so a producer can report no position. + assert retry.deduplicated messages, _ = await stream.read() assert [m.data for m in messages] == [b"once"] From 1b898416dcccb94237c2e41f61c355881f541870 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:26:36 -0700 Subject: [PATCH 417/831] Pinned native stream handles to a run and closed their channels. A handle on a workflow's stream resolves the run once when it opens, so a follower is not redirected to a successor's empty stream after continue-as-new. The channel cache is keyed by the loop object and closed through the provider's close hook, and latest() reads a missing stream as empty but lets every other failure through. --- temporalio/client_stream.py | 77 +++++++++++++++++++++++++- temporalio/streams/providers/native.py | 60 +++++++++++--------- 2 files changed, 108 insertions(+), 29 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1cd775043..15760a980 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,6 +23,8 @@ from __future__ import annotations +import asyncio +import weakref from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from typing import Any @@ -40,6 +42,8 @@ "StreamClient", "StreamHandle", "WorkflowStreamHandle", + "close_shared_clients", + "shared_client", ] @@ -164,7 +168,7 @@ def get(self, stream_id: str) -> "StreamHandle": return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( - self, workflow_id: str, name: str = "" + self, workflow_id: str, name: str = "", *, owner_run_id: str = "" ) -> "WorkflowStreamHandle": """Open a stream a workflow publishes to. @@ -177,8 +181,13 @@ def workflow_stream( does not exist yet is not an error: it reads as empty and a :meth:`WorkflowStreamHandle.follow` parked on it wakes when the workflow publishes. + + ``owner_run_id`` pins the handle to one run of the workflow; see + :meth:`WorkflowStreamHandle.pin` for why a follower wants that. """ - return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + return WorkflowStreamHandle( + self._stub, self._namespace, workflow_id, name, owner_run_id + ) class StreamHandle: @@ -350,13 +359,19 @@ class WorkflowStreamHandle: """ def __init__( - self, stub: Any, namespace: str, workflow_id: str, name: str = "" + self, + stub: Any, + namespace: str, + workflow_id: str, + name: str = "", + owner_run_id: str = "", ) -> None: """Prefer :meth:`StreamClient.workflow_stream`.""" self._stub = stub self._namespace = namespace self._workflow_id = workflow_id self._name = name + self._owner_run_id = owner_run_id @property def workflow_id(self) -> str: @@ -368,6 +383,25 @@ def name(self) -> str: """Name the owner publishes under, empty for its default stream.""" return self._name + @property + def owner_run_id(self) -> str: + """The run this handle is pinned to, empty while it follows the current run.""" + return self._owner_run_id + + def pin(self, run_id: str) -> None: + """Address one run of the workflow from now on. + + Unpinned, every call resolves to whichever run is current. A follower + holding an offset from one run would then be redirected when the + workflow continues as new: the successor's stream starts empty at + offset zero, so the server reads the follower's offset as "caught up", + parks it until the successor has published that many records, and + then skips exactly that many. Pinned, the run's end shows up as + ``closed`` on the page, and the caller decides whether to follow the + successor from the beginning. + """ + self._owner_run_id = run_id + async def append( self, *messages: bytes, @@ -386,6 +420,7 @@ async def append( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, messages=[ stream.StreamMessage( @@ -418,6 +453,7 @@ async def read( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -460,12 +496,14 @@ async def poll( :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. + On a pinned handle ``closed`` also says the run has ended. """ response = await self._stub.PollWorkflowMessages( stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -496,6 +534,7 @@ async def describe(self) -> stream.StreamState: frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, ) ) @@ -510,3 +549,35 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: count=out.count, deduplicated=out.deduplicated, ) + + +# One channel per loop, target and namespace, shared by every handle in the +# process. A channel is multiplexed and long lived, and callers open a handle +# per subscription, which would otherwise be a connection per subscription. The +# loop is the key because a grpc.aio channel belongs to the loop that made it, +# and it is held weakly so a loop that is gone cannot lend its channel to a +# successor that happens to reuse its id. +_shared: weakref.WeakKeyDictionary[ + asyncio.AbstractEventLoop, dict[tuple[str, str], StreamClient] +] = weakref.WeakKeyDictionary() + + +def shared_client(target_host: str, namespace: str) -> StreamClient: + """The process-wide client for ``target_host`` and ``namespace`` on this loop.""" + per_loop = _shared.setdefault(asyncio.get_running_loop(), {}) + key = (target_host, namespace) + existing = per_loop.get(key) + if existing is None: + existing = per_loop[key] = StreamClient.connect(target_host, namespace) + return existing + + +async def close_shared_clients() -> None: + """Close every shared client this loop opened. + + For a process that is done with streams, and for tests, which open a + loop per case and would otherwise leave a channel behind on each. + """ + per_loop = _shared.pop(asyncio.get_running_loop(), {}) + for client in per_loop.values(): + await client.close() diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f886d467b..6dfdd4c25 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -13,10 +13,12 @@ from datetime import timedelta from typing import Any +import grpc + from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.client_stream import StreamClient +from temporalio.client_stream import StreamClient, close_shared_clients, shared_client from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._ids import inbound_stream_id @@ -126,24 +128,23 @@ def _reject_configured_codec(client: Client) -> None: # stream reuses the handle rather than asking the server to create it again. # The second create is answered correctly, and it is still a failed call the # server logs, which is noise an operator has to learn to ignore. -_handles: dict[str, Any] = {} +_handles: dict[tuple[str, str, str], Any] = {} -# One channel per target and namespace, shared by every handle in the process. -# A channel is multiplexed and long lived, and callers open a handle per -# subscription, which would otherwise be a connection per subscription. -_channels: dict[tuple[int, str, str], StreamClient] = {} +def _stream_client(client: Client) -> StreamClient: + return shared_client(client.service_client.config.target_host, client.namespace) -def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _channels.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _channels[key] = existing - return existing +async def _owner_run(client: Client, workflow_id: str) -> str: + """The run whose stream a handle on ``workflow_id`` should address. + + Resolved once, when the handle opens. Left to the server, a follower whose + workflow continued as new would be redirected to the successor, whose + stream starts empty, and its offset read as "caught up" rather than as a + position on the run it was watching. A producer is pinned for the same + reason: an activity's output belongs to the run that scheduled it. + """ + return (await client.get_workflow_handle(workflow_id).describe()).run_id class NativeProducer: @@ -310,9 +311,12 @@ async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() - except Exception: + except grpc.aio.AioRpcError as error: # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. + # is the same answer as an empty one. Any other failure is not: + # a reader that took it for "empty" would replay the whole stream. + if error.code() is not grpc.StatusCode.NOT_FOUND: + raise return BEGINNING return ( Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING @@ -344,6 +348,10 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + async def close(self) -> None: + """Close the channels this process opened to the stream service.""" + await close_shared_clients() + def open_read( self, stream: str, @@ -390,15 +398,13 @@ async def producer( streams = _stream_client(client) converter = client.data_converter.payload_converter if not stream: - return NativeProducer( - streams.workflow_stream(workflow_id), - converter, - topic, - producer_id, - attempt, + handle: Any = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) ) + return NativeProducer(handle, converter, topic, producer_id, attempt) stream_id = inbound_stream_id(workflow_id, stream) - handle = _handles.get(stream_id) + key = (client.service_client.config.target_host, client.namespace, stream_id) + handle = _handles.get(key) if handle is None: try: handle = await streams.create(stream_id) @@ -407,7 +413,7 @@ async def producer( # stream it does not own is the ordinary case, not the # exception. handle = streams.get(stream_id) - _handles[stream_id] = handle + _handles[key] = handle return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( @@ -425,7 +431,9 @@ async def consumer( if stream: handle: Any = streams.get(address) else: - handle = streams.workflow_stream(workflow_id) + handle = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) + ) return NativeConsumer( handle, client.data_converter.payload_converter, stream, address ) From 61f7a4904b1b58154dcb3da8d93d911242bcdcda Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:28:14 -0700 Subject: [PATCH 418/831] Stopped the flusher without cancelling it and pinned the contrib client. A cancel landing inside the flusher's append unwound with the batch it had taken off the buffer. The client now asks it to stop and waits. The handle is pinned to the run it opened on, from the activity's own run id or one describe, and the channel cache is the shared one. --- temporalio/contrib/server_streams/__init__.py | 100 +++++++++++------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index c15184bf4..690402974 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -21,15 +21,15 @@ import asyncio import builtins -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass from datetime import timedelta from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.client import Client, WorkflowExecutionDescription +from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client from temporalio.converter import PayloadConverter __all__ = [ @@ -78,16 +78,15 @@ def _encode(converter: PayloadConverter, value: Any) -> bytes: The payload rather than the bare bytes, so the encoding metadata the consumer needs to decode into a type travels with it. - The codec chain is not applied. It cannot be applied here: a codec is async - and a Workflow publishing to a stream is not, so running one inside Workflow - code would be I/O on the Workflow thread. Regular payloads solve this in the - Worker, encoding on the way out and decoding on the way in, and a stream - needs the same plumbing before a codec can be honoured. - - It is not applied on the client path either, deliberately. Encoding one side - and not the other is worse than encoding neither: an Activity's messages - would reach a consuming Workflow as ciphertext it has no way to decode. - :func:`_reject_configured_codec` is what keeps that from happening quietly. + The codec chain is not applied here. Inside a Workflow it does not have to + be: the Worker runs the payload visitor with its codec over the commands + and activations, so a body that rides ``add_stream_messages`` is encoded + on the way out and one that arrives on ``deliver_stream_messages`` is + decoded on the way in, as every other payload is. The client path has no + such pass, and encoding one side but not the other is worse than encoding + neither: an Activity's messages would reach a consuming Workflow as + ciphertext it has no way to decode. :func:`_reject_configured_codec` + refuses a client with a codec until the client path applies one too. """ payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] return payload.SerializeToString() @@ -232,14 +231,22 @@ def __init__( handle: WorkflowStreamHandle, converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + *, + describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: - """Prefer :meth:`create` or :meth:`from_within_activity`.""" + """Prefer :meth:`create` or :meth:`from_within_activity`. + + ``describe`` is how an unpinned handle learns which run it follows; + see :meth:`WorkflowStreamHandle.pin`. + """ self._handle = handle self._converter = converter self._batch_interval = batch_interval + self._describe = describe self._buffered: list[tuple[str, Any]] = [] self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() + self._closed = False @classmethod def create( @@ -247,14 +254,24 @@ def create( client: Client, workflow_id: str, *, + owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, ) -> "WorkflowStreamClient": - """Open the stream owned by ``workflow_id``.""" + """Open the stream owned by ``workflow_id``. + + Without ``owner_run_id`` the current run is looked up on the first + call and the handle pinned to it, so a reader following across a + continue-as-new sees the run end rather than being moved to the + successor's stream at a stale offset. + """ _reject_configured_codec(client) return cls( - _stream_client(client).workflow_stream(workflow_id), + _stream_client(client).workflow_stream( + workflow_id, owner_run_id=owner_run_id + ), client.data_converter.payload_converter, batch_interval, + describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod @@ -262,13 +279,20 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - workflow_id = activity.info().workflow_id - if workflow_id is None: + info = activity.info() + if info.workflow_id is None: raise RuntimeError( "no Workflow stream to open: this Activity was not started by a " "Workflow" ) - return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) + # The Activity's output belongs to the run that scheduled it, and the + # Activity already knows which run that is. + return cls.create( + activity.client(), + info.workflow_id, + owner_run_id=info.workflow_run_id or "", + batch_interval=batch_interval, + ) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -279,17 +303,22 @@ async def __aexit__(self, *_exc: object) -> None: """Drain what is buffered before letting the caller go. An Activity that returned with a batch still buffered would have - reported work its readers never saw. + reported work its readers never saw. The flusher is asked to stop + rather than cancelled: a cancel landing inside its append would + unwind with the batch it had already taken off the buffer. """ + self._closed = True + self._wake.set() if self._flusher is not None: - self._flusher.cancel() - try: - await self._flusher - except asyncio.CancelledError: - pass + await self._flusher self._flusher = None await self.flush() + async def _pin(self) -> None: + if self._handle.owner_run_id or self._describe is None: + return + self._handle.pin((await self._describe()).run_id) + @overload def topic(self, name: str) -> TopicHandle[Any]: ... @@ -305,6 +334,7 @@ async def get_offset(self) -> int: A reader that wants only what comes next starts here. """ + await self._pin() return (await self._handle.describe()).head_offset async def subscribe( @@ -321,6 +351,7 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown + await self._pin() async for message in self._handle.follow( from_offset=from_offset, topics=topics ): @@ -342,6 +373,7 @@ async def poll_raw( For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. """ + await self._pin() page = await self._handle.poll( from_offset=from_offset, topics=topics, wait=wait ) @@ -360,6 +392,7 @@ async def flush(self) -> None: pending, self._buffered = self._buffered, [] if not pending: return + await self._pin() # One append per topic, because a batch carries a single topic. The # harness case is one topic, so this is one append. by_topic: dict[str, list[bytes]] = {} @@ -376,7 +409,7 @@ def _flush_soon(self) -> None: async def _run_flusher(self) -> None: """Append on a fixed cadence, so a slow producer still gets delivered.""" - while True: + while not self._closed: try: await asyncio.wait_for( self._wake.wait(), self._batch_interval.total_seconds() @@ -387,18 +420,5 @@ async def _run_flusher(self) -> None: await self.flush() -# One channel per target, shared by every handle in the process. The channel is -# multiplexed and long-lived, and callers here open a client per subscription, -# which would otherwise be a connection per subscription. -_clients: dict[tuple[int, str, str], StreamClient] = {} - - def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop too: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _clients.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _clients[key] = existing - return existing + return shared_client(client.service_client.config.target_host, client.namespace) From cc6b3385d7cadf56fa7eb564b0dda9d69536b803 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:23 -0700 Subject: [PATCH 419/831] Checked stream ranges for continuity and mirrored the byte limits. A range is recorded as consumed once and never resent, so a repeated, skipped or mis-sized delivery would hand the workflow duplicate or shifted bodies with nothing to say so. The worker also refuses a publish over the server's per-message and per-batch byte limits before the command exists, for the reason the count limit already gave. --- temporalio/worker/_workflow_instance.py | 53 +++++++++++++--- tests/worker/test_workflow_stream.py | 84 +++++++++++++++++++++++-- 2 files changed, 123 insertions(+), 14 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 66833dd8c..0a17d2b22 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -273,10 +273,12 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# Match the server's per-batch limits. Rejecting here turns a wedged workflow, # which would replay and re-issue the same rejected command forever, into an # error the workflow author can see. _MAX_STREAM_MESSAGES_PER_BATCH = 1000 +_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +_MAX_STREAM_BATCH_BYTES = 2 << 20 class _StreamBuffer: @@ -288,15 +290,38 @@ class _StreamBuffer: dropped. """ - def __init__(self) -> None: + def __init__(self, stream_id: str = "") -> None: + self._stream_id = stream_id self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] self._waiters: list[asyncio.Future] = [] + # Where the next range has to start. Unknown until the first one + # arrives, because a subscription may start wherever the stream is and + # the server is the one that resolves that. + self._next_offset: int | None = None def extend( self, messages: Sequence[temporalio.api.stream.v1.StreamMessage], from_offset: int = 0, + to_offset: int | None = None, ) -> None: + if to_offset is None: + to_offset = from_offset + len(messages) + # A range is recorded as consumed once and never resent, so one that + # repeats, skips or mis-sizes would hand the workflow duplicate or + # shifted bodies with nothing to say so. Failing the task is what makes + # the fault visible. + if to_offset - from_offset != len(messages): + raise RuntimeError( + f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"for offsets [{from_offset}, {to_offset})" + ) + if self._next_offset is not None and from_offset != self._next_offset: + raise RuntimeError( + f"stream {self._stream_id!r} delivered offsets [{from_offset}, " + f"{to_offset}) but the last range ended at {self._next_offset}" + ) + self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. if not messages: @@ -1223,9 +1248,9 @@ def _apply_deliver_stream_messages( # Nothing subscribed. The range is already recorded as consumed and # will not be sent again, so buffering it is the only way a # subscription made later in the same task still sees it. - buffer = _StreamBuffer() + buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset) + buffer.extend(job.messages, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1393,9 +1418,9 @@ def get_info(self) -> temporalio.workflow.Info: def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: # Reissued on every replay, so the buffer has to exist before the first - # range arrives and the command has to be harmless the second time. The - # server treats a repeat subscription to the same stream as a no-op. - self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + # range arrives and the command has to be harmless the second time. A + # repeat subscription leaves the server-side cursor where it is. + self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) command = self._add_command() command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset @@ -1410,6 +1435,18 @@ def workflow_add_stream_messages( f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " f"got {len(messages)}" ) + total = 0 + for body in messages: + if len(body) > _MAX_STREAM_MESSAGE_BYTES: + raise ValueError( + f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " + f"bytes, got {len(body)}" + ) + total += len(body) + if total > _MAX_STREAM_BATCH_BYTES: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" + ) command = self._add_command() command.add_stream_messages.stream_id = stream_id for body in messages: @@ -1437,7 +1474,7 @@ async def workflow_read_stream_messages( # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. self._assert_not_read_only("read stream") - buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) while not len(buffer): await buffer.wait_future() taken = buffer.take() diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 1d154b37c..93b596b8c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -15,10 +15,14 @@ import temporalio.api.common.v1 import temporalio.api.stream.v1 as api_stream +from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( + _MAX_STREAM_BATCH_BYTES, + _MAX_STREAM_MESSAGE_BYTES, _StreamBuffer, _WorkflowInstanceImpl, ) +from temporalio.workflow import ReadOnlyContextError def message(body: bytes) -> api_stream.StreamMessage: @@ -78,12 +82,13 @@ class _ReadOnlyStub: workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages - def __init__(self) -> None: + def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} - self.read_only_calls: list[str] = [] + self._read_only = read_only def _assert_not_read_only(self, action: str) -> None: - self.read_only_calls.append(action) + if self._read_only: + raise ReadOnlyContextError(f"cannot {action} in a read-only context") async def read(self, stream: str, max_messages: int) -> list[bytes]: instance: Any = self @@ -115,9 +120,76 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> # A query activation carries no ranges, so a read there would wait on a future # nothing can resolve and the query would time out saying nothing. async def test_read_is_refused_in_a_read_only_context() -> None: - stub = _ReadOnlyStub() + stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await stub.read("s", 0) - assert stub.read_only_calls == ["read stream"] + with pytest.raises(ReadOnlyContextError, match="read stream"): + await stub.read("s", 0) + # Refused before the buffer was touched, so the range is still there for + # the task that is allowed to read it. + assert len(stub._stream_buffers["s"]) == 1 + + +# A range is recorded as consumed once and never resent, so the buffer is the +# only place a repeated, skipped or mis-sized delivery can still be noticed. +async def test_ranges_have_to_abut_the_last_one() -> None: + buffer = _StreamBuffer("s") + buffer.extend([message(b"a"), message(b"b")], 0, 2) + # An empty range moves the expectation too: the server recorded it. + buffer.extend([], 2, 2) + buffer.extend([message(b"c")], 2, 3) + assert [m.offset for m in buffer.take()] == [0, 1, 2] + + with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): + buffer.extend([message(b"c")], 2, 3) + with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): + buffer.extend([message(b"f")], 5, 6) + + +async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: + buffer = _StreamBuffer("s") + with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): + buffer.extend([message(b"a"), message(b"b")], 0, 1) + assert len(buffer) == 0 + + +class _CommandStub: + """Drives the real publish path and keeps the commands it issued.""" + + workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + def _add_command(self) -> WorkflowCommand: + command = WorkflowCommand() + self.commands.append(command) + return command + + def publish(self, *bodies: bytes) -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + + +# The server refuses an oversized publish, and a refused command is reissued +# on every replay, so the limits have to be applied before the command exists. +def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): + stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) + assert len(stub.commands) == 1 + + +def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) + stub.publish(half, half) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): + stub.publish(half, half, b"x") + assert len(stub.commands) == 1 From 195447752f9d049c517faea9f7299633da1ed6dd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:24 -0700 Subject: [PATCH 420/831] Corrected the subscribe docstring and two stale test comments. --- temporalio/workflow/_context.py | 7 ++++--- tests/contrib/test_server_streams.py | 2 -- tests/worker/test_workflow_stream_e2e.py | 7 ++----- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 450051456..57183aafb 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -971,9 +971,10 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: """Subscribe this workflow to a stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: the server treats - a second subscription to the same stream as a no-op, which is what makes - calling it on every replay harmless. + and :func:`read_stream` returns them. Safe to call again: a second + subscription to a stream this run already consumes does not move its + cursor, though it does write one event. Calling it on every replay is + harmless because replay matches the command to the event already recorded. Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index e1fe84c77..9b339dfe4 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -82,8 +82,6 @@ async def test_both_producers_reach_one_subscriber() -> None: Emitting.run, tokens, id=wf_id, task_queue=task_queue ) - # Subscribed before the Workflow has published anything, which is what - # a consumer attaching to a session does. # Subscribed before the Workflow has published anything, which is what # a consumer attaching to a session does. stream = WorkflowStreamClient.create(client, wf_id) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 3ee38fef3..31296b2c8 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -32,11 +32,8 @@ STREAM = "output" -# Event type numbers rather than names: this SDK's api protos predate both -# events, so the attributes arrive as unknown fields and only the type is -# readable here. The server's own tests are where the offsets are asserted. -EVENT_STREAM_SUBSCRIBED = 61 -EVENT_STREAM_MESSAGES_ADDED = 62 +EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED +EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED @workflow.defn From 392b9ae71a2a4cfc89fa324b65d6ee646181f133 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:44:38 -0700 Subject: [PATCH 421/831] Repinned Core to the reviewed moe/AI-198-fix-replay-slice-lookahead head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 4076ef24f..a67781227 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 +Subproject commit a67781227a88df50a0617247d20d4908f96d4593 From ef4efe8b17c0a5fe7209fa9163098b07ce632355 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:47:29 -0700 Subject: [PATCH 422/831] Regenerated the bridge protos from the repinned Core. The native activation job and the two native commands moved to the field numbers the combined Core tree uses, so both trees agree. --- .../workflow_activation_pb2.py | 2 +- .../workflow_activation_pb2.pyi | 7 +++++- .../workflow_commands_pb2.py | 2 +- .../workflow_commands_pb2.pyi | 22 ++++++++++++------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index cd09b8b97..5df8ff627 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,7 +47,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 5245cd6fc..a6787024a 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -298,7 +298,12 @@ class WorkflowActivationJob(google.protobuf.message.Message): """A nexus operation resolved.""" @property def deliver_stream_messages(self) -> global___DeliverStreamMessages: - """A range of a stream the workflow subscribed to.""" + """17 to 20 are taken by the external stream jobs, which are developed + alongside this one and share this message. The number below is fixed + with that family and must not be reused. + + A range of a stream the workflow subscribed to. + """ @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0d81e37f5..44f658d1e 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index bcf1bf7eb..18b6e2ff9 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -181,7 +181,11 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property - def subscribe_stream(self) -> global___SubscribeStream: ... + def subscribe_stream(self) -> global___SubscribeStream: + """23 to 28 are taken by the external stream commands, which are developed + alongside these and share this message. The two numbers below are fixed + with that family and must not be reused. + """ @property def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( @@ -376,13 +380,7 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand class AddStreamMessages(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - Publish a batch of messages to a stream this workflow owns. + """Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -420,6 +418,14 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int From 8cd1adfe4f9fb95eb98b1df307a7157341cf3684 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:24:50 -0700 Subject: [PATCH 423/831] Repinned Core to the reviewed replay-slice head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index a67781227..97cd17296 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit a67781227a88df50a0617247d20d4908f96d4593 +Subproject commit 97cd17296fcc6178407c770f96f354bcc4e9f540 From d21b960114ab5ceaf07d5218b866be3ef7c6108c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:31:31 -0700 Subject: [PATCH 424/831] Regenerated the bridge protos from the repinned Core. The activation job is now deliver_stream_records and the command append_stream_records, both carrying StreamRecord, so the payload visitor reaches each record's body and metadata. --- temporalio/bridge/_visitor.py | 26 +-- .../proto/workflow_activation/__init__.py | 4 +- .../workflow_activation_pb2.py | 116 ++++++------- .../workflow_activation_pb2.pyi | 34 ++-- .../proto/workflow_commands/__init__.py | 4 +- .../workflow_commands_pb2.py | 152 +++++++++--------- .../workflow_commands_pb2.pyi | 38 ++--- 7 files changed, 188 insertions(+), 186 deletions(-) diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index 77d1b6c7a..c04d1c60f 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,7 +308,7 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) - async def _visit_temporal_api_stream_v1_StreamMessage( + async def _visit_temporal_api_stream_v1_StreamRecord( self, fs: VisitorFunctions, o: Any ): if o.HasField("body"): @@ -316,11 +316,11 @@ async def _visit_temporal_api_stream_v1_StreamMessage( for v in o.metadata.values(): await self._visit_temporal_api_common_v1_Payload(fs, v) - async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + async def _visit_coresdk_workflow_activation_DeliverStreamRecords( self, fs: VisitorFunctions, o: Any ): - for v in o.messages: - await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any @@ -367,9 +367,9 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) - elif o.HasField("deliver_stream_messages"): - await self._visit_coresdk_workflow_activation_DeliverStreamMessages( - fs, o.deliver_stream_messages + elif o.HasField("deliver_stream_records"): + await self._visit_coresdk_workflow_activation_DeliverStreamRecords( + fs, o.deliver_stream_records ) async def _visit_coresdk_workflow_activation_WorkflowActivation( @@ -510,11 +510,11 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) - async def _visit_coresdk_workflow_commands_AddStreamMessages( + async def _visit_coresdk_workflow_commands_AppendStreamRecords( self, fs: VisitorFunctions, o: Any ): - for v in o.messages: - await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any @@ -575,9 +575,9 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) - elif o.HasField("add_stream_messages"): - await self._visit_coresdk_workflow_commands_AddStreamMessages( - fs, o.add_stream_messages + elif o.HasField("append_stream_records"): + await self._visit_coresdk_workflow_commands_AppendStreamRecords( + fs, o.append_stream_records ) async def _visit_coresdk_workflow_completion_Success( diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index ae7639820..f17880890 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,6 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, - DeliverStreamMessages, + DeliverStreamRecords, DoUpdate, FireTimer, InitializeWorkflow, @@ -25,7 +25,7 @@ __all__ = [ "CancelWorkflow", - "DeliverStreamMessages", + "DeliverStreamRecords", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 5df8ff627..7f6d3e782 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,13 +47,13 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ "HeadersEntry" @@ -118,16 +118,16 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( - "DeliverStreamMessages", +DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( + "DeliverStreamRecords", (_message.Message,), { - "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "DESCRIPTOR": _DELIVERSTREAMRECORDS, "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamRecords) }, ) -_sym_db.RegisterMessage(DeliverStreamMessages) +_sym_db.RegisterMessage(DeliverStreamRecords) InitializeWorkflow = _reflection.GeneratedProtocolMessageType( "InitializeWorkflow", @@ -394,55 +394,55 @@ _WORKFLOWACTIVATION._serialized_start = 570 _WORKFLOWACTIVATION._serialized_end = 1116 _WORKFLOWACTIVATIONJOB._serialized_start = 1119 - _WORKFLOWACTIVATIONJOB._serialized_end = 2582 - _DELIVERSTREAMMESSAGES._serialized_start = 2585 - _DELIVERSTREAMMESSAGES._serialized_end = 2724 - _INITIALIZEWORKFLOW._serialized_start = 2727 - _INITIALIZEWORKFLOW._serialized_end = 4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _FIRETIMER._serialized_start = 4133 - _FIRETIMER._serialized_end = 4157 - _RESOLVEACTIVITY._serialized_start = 4159 - _RESOLVEACTIVITY._serialized_end = 4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 - _UPDATERANDOMSEED._serialized_start = 5045 - _UPDATERANDOMSEED._serialized_end = 5088 - _QUERYWORKFLOW._serialized_start = 5091 - _QUERYWORKFLOW._serialized_end = 5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _CANCELWORKFLOW._serialized_start = 5353 - _CANCELWORKFLOW._serialized_end = 5385 - _SIGNALWORKFLOW._serialized_start = 5388 - _SIGNALWORKFLOW._serialized_end = 5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _NOTIFYHASPATCH._serialized_start = 5679 - _NOTIFYHASPATCH._serialized_end = 5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 - _DOUPDATE._serialized_start = 5917 - _DOUPDATE._serialized_end = 6248 - _DOUPDATE_HEADERSENTRY._serialized_start = 4052 - _DOUPDATE_HEADERSENTRY._serialized_end = 4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 - _RESOLVENEXUSOPERATION._serialized_start = 6407 - _RESOLVENEXUSOPERATION._serialized_end = 6496 - _REMOVEFROMCACHE._serialized_start = 6499 - _REMOVEFROMCACHE._serialized_end = 6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 + _WORKFLOWACTIVATIONJOB._serialized_end = 2580 + _DELIVERSTREAMRECORDS._serialized_start = 2583 + _DELIVERSTREAMRECORDS._serialized_end = 2719 + _INITIALIZEWORKFLOW._serialized_start = 2722 + _INITIALIZEWORKFLOW._serialized_end = 4126 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _FIRETIMER._serialized_start = 4128 + _FIRETIMER._serialized_end = 4152 + _RESOLVEACTIVITY._serialized_start = 4154 + _RESOLVEACTIVITY._serialized_end = 4263 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4266 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4603 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4605 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4664 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4667 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4833 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4835 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4931 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4933 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5038 + _UPDATERANDOMSEED._serialized_start = 5040 + _UPDATERANDOMSEED._serialized_end = 5083 + _QUERYWORKFLOW._serialized_start = 5086 + _QUERYWORKFLOW._serialized_end = 5346 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _CANCELWORKFLOW._serialized_start = 5348 + _CANCELWORKFLOW._serialized_end = 5380 + _SIGNALWORKFLOW._serialized_start = 5383 + _SIGNALWORKFLOW._serialized_end = 5672 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _NOTIFYHASPATCH._serialized_start = 5674 + _NOTIFYHASPATCH._serialized_end = 5708 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5710 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5805 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5807 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5909 + _DOUPDATE._serialized_start = 5912 + _DOUPDATE._serialized_end = 6243 + _DOUPDATE_HEADERSENTRY._serialized_start = 4047 + _DOUPDATE_HEADERSENTRY._serialized_end = 4126 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6246 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6400 + _RESOLVENEXUSOPERATION._serialized_start = 6402 + _RESOLVENEXUSOPERATION._serialized_end = 6491 + _REMOVEFROMCACHE._serialized_start = 6494 + _REMOVEFROMCACHE._serialized_end = 6846 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6608 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6846 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index a6787024a..ac9ac13f7 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -236,7 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int - DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int + DELIVER_STREAM_RECORDS_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -297,7 +297,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property - def deliver_stream_messages(self) -> global___DeliverStreamMessages: + def deliver_stream_records(self) -> global___DeliverStreamRecords: """17 to 20 are taken by the external stream jobs, which are developed alongside this one and share this message. The number below is fixed with that family and must not be reused. @@ -332,7 +332,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., - deliver_stream_messages: global___DeliverStreamMessages | None = ..., + deliver_stream_records: global___DeliverStreamRecords | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -340,8 +340,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -381,8 +381,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -436,7 +436,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", - "deliver_stream_messages", + "deliver_stream_records", "remove_from_cache", ] | None @@ -444,7 +444,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob -class DeliverStreamMessages(google.protobuf.message.Message): +class DeliverStreamRecords(google.protobuf.message.Message): """Hand a workflow the next range of a stream it subscribed to. The range is delivered once, on the task the server decided it belongs to, @@ -461,7 +461,7 @@ class DeliverStreamMessages(google.protobuf.message.Message): STREAM_ID_FIELD_NUMBER: builtins.int FROM_OFFSET_FIELD_NUMBER: builtins.int TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int stream_id: builtins.str """Id of the stream this range came from.""" from_offset: builtins.int @@ -469,10 +469,10 @@ class DeliverStreamMessages(google.protobuf.message.Message): to_offset: builtins.int """Exclusive. Equal to from_offset when the subscription saw nothing.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage + temporalio.api.stream.v1.message_pb2.StreamRecord ]: ... def __init__( self, @@ -480,8 +480,8 @@ class DeliverStreamMessages(google.protobuf.message.Message): stream_id: builtins.str = ..., from_offset: builtins.int = ..., to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord ] | None = ..., ) -> None: ... @@ -490,8 +490,8 @@ class DeliverStreamMessages(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "from_offset", b"from_offset", - "messages", - b"messages", + "records", + b"records", "stream_id", b"stream_id", "to_offset", @@ -499,7 +499,7 @@ class DeliverStreamMessages(google.protobuf.message.Message): ], ) -> None: ... -global___DeliverStreamMessages = DeliverStreamMessages +global___DeliverStreamRecords = DeliverStreamRecords class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 44826f2da..9fb1c8f08 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,6 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, - AddStreamMessages, + AppendStreamRecords, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -30,7 +30,7 @@ __all__ = [ "ActivityCancellationType", - "AddStreamMessages", + "AppendStreamRecords", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 44f658d1e..5af8f0744 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,7 +59,7 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] _SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] @@ -135,16 +135,16 @@ ) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType( - "AddStreamMessages", +AppendStreamRecords = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecords", (_message.Message,), { - "DESCRIPTOR": _ADDSTREAMMESSAGES, + "DESCRIPTOR": _APPENDSTREAMRECORDS, "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AppendStreamRecords) }, ) -_sym_db.RegisterMessage(AddStreamMessages) +_sym_db.RegisterMessage(AppendStreamRecords) SubscribeStream = _reflection.GeneratedProtocolMessageType( "SubscribeStream", @@ -511,74 +511,74 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9020 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9108 _WORKFLOWCOMMAND._serialized_start = 556 - _WORKFLOWCOMMAND._serialized_end = 2794 - _ADDSTREAMMESSAGES._serialized_start = 2796 - _ADDSTREAMMESSAGES._serialized_end = 2891 - _SUBSCRIBESTREAM._serialized_start = 2893 - _SUBSCRIBESTREAM._serialized_end = 2951 - _STARTTIMER._serialized_start = 2953 - _STARTTIMER._serialized_end = 3036 - _CANCELTIMER._serialized_start = 3038 - _CANCELTIMER._serialized_end = 3064 - _SCHEDULEACTIVITY._serialized_start = 3067 - _SCHEDULEACTIVITY._serialized_end = 3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 - _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4683 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4685 - _REQUESTCANCELACTIVITY._serialized_end = 4721 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 - _QUERYRESULT._serialized_start = 4767 - _QUERYRESULT._serialized_end = 4923 - _QUERYSUCCESS._serialized_start = 4925 - _QUERYSUCCESS._serialized_end = 4990 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 - _FAILWORKFLOWEXECUTION._serialized_start = 5070 - _FAILWORKFLOWEXECUTION._serialized_end = 5144 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6063 - _CANCELWORKFLOWEXECUTION._serialized_end = 6139 - _SETPATCHMARKER._serialized_start = 6141 - _SETPATCHMARKER._serialized_end = 6195 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7997 - _CANCELSIGNALWORKFLOW._serialized_end = 8032 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 - _UPDATERESPONSE._serialized_start = 8219 - _UPDATERESPONSE._serialized_end = 8429 - _SCHEDULENEXUSOPERATION._serialized_start = 8432 - _SCHEDULENEXUSOPERATION._serialized_end = 8970 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 + _WORKFLOWCOMMAND._serialized_end = 2798 + _APPENDSTREAMRECORDS._serialized_start = 2800 + _APPENDSTREAMRECORDS._serialized_end = 2895 + _SUBSCRIBESTREAM._serialized_start = 2897 + _SUBSCRIBESTREAM._serialized_end = 2955 + _STARTTIMER._serialized_start = 2957 + _STARTTIMER._serialized_end = 3040 + _CANCELTIMER._serialized_start = 3042 + _CANCELTIMER._serialized_end = 3068 + _SCHEDULEACTIVITY._serialized_start = 3071 + _SCHEDULEACTIVITY._serialized_end = 3895 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3895 + _SCHEDULELOCALACTIVITY._serialized_start = 3898 + _SCHEDULELOCALACTIVITY._serialized_end = 4687 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3895 + _REQUESTCANCELACTIVITY._serialized_start = 4689 + _REQUESTCANCELACTIVITY._serialized_end = 4725 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4727 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4768 + _QUERYRESULT._serialized_start = 4771 + _QUERYRESULT._serialized_end = 4927 + _QUERYSUCCESS._serialized_start = 4929 + _QUERYSUCCESS._serialized_end = 4994 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4996 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5072 + _FAILWORKFLOWEXECUTION._serialized_start = 5074 + _FAILWORKFLOWEXECUTION._serialized_end = 5148 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5151 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6065 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELWORKFLOWEXECUTION._serialized_start = 6067 + _CANCELWORKFLOWEXECUTION._serialized_end = 6143 + _SETPATCHMARKER._serialized_start = 6145 + _SETPATCHMARKER._serialized_end = 6199 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6202 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7376 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7378 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7452 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7455 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7597 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7600 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7999 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELSIGNALWORKFLOW._serialized_start = 8001 + _CANCELSIGNALWORKFLOW._serialized_end = 8036 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8038 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8139 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8141 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8220 + _UPDATERESPONSE._serialized_start = 8223 + _UPDATERESPONSE._serialized_end = 8433 + _SCHEDULENEXUSOPERATION._serialized_start = 8436 + _SCHEDULENEXUSOPERATION._serialized_end = 8974 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8924 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8974 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8976 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9018 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 18b6e2ff9..b4848ddb1 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -105,7 +105,7 @@ class WorkflowCommand(google.protobuf.message.Message): SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int - ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -187,7 +187,7 @@ class WorkflowCommand(google.protobuf.message.Message): with that family and must not be reused. """ @property - def add_stream_messages(self) -> global___AddStreamMessages: ... + def append_stream_records(self) -> global___AppendStreamRecords: ... def __init__( self, *, @@ -227,13 +227,13 @@ class WorkflowCommand(google.protobuf.message.Message): request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., subscribe_stream: global___SubscribeStream | None = ..., - add_stream_messages: global___AddStreamMessages | None = ..., + append_stream_records: global___AppendStreamRecords | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "add_stream_messages", - b"add_stream_messages", + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -289,8 +289,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "add_stream_messages", - b"add_stream_messages", + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -372,50 +372,52 @@ class WorkflowCommand(google.protobuf.message.Message): "schedule_nexus_operation", "request_cancel_nexus_operation", "subscribe_stream", - "add_stream_messages", + "append_stream_records", ] | None ): ... global___WorkflowCommand = WorkflowCommand -class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch - size free: a thousand messages cost the same in History as one. + size free: a thousand records cost the same in History as one. The server + stores each record with an empty producer id, because the workflow is the + producer here. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int stream_id: builtins.str """Empty means the workflow's default output stream.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage + temporalio.api.stream.v1.message_pb2.StreamRecord ]: ... def __init__( self, *, stream_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord ] | None = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "messages", b"messages", "stream_id", b"stream_id" + "records", b"records", "stream_id", b"stream_id" ], ) -> None: ... -global___AddStreamMessages = AddStreamMessages +global___AppendStreamRecords = AppendStreamRecords class SubscribeStream(google.protobuf.message.Message): """Subscribe this workflow to a stream, so later Workflow Tasks carry the From 7aa30768eaea43b724b813adc030566528db44ce Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:33:01 -0700 Subject: [PATCH 425/831] Regenerated the vendored stream service protos from the record server. --- temporalio/api/streamservice/v1/__init__.py | 34 +-- .../api/streamservice/v1/message_pb2.py | 62 +++-- .../api/streamservice/v1/message_pb2.pyi | 99 ++++---- .../streamservice/v1/request_response_pb2.py | 224 +++++++++--------- .../streamservice/v1/request_response_pb2.pyi | 123 ++++++---- .../api/streamservice/v1/stream_state_pb2.py | 42 ++-- .../api/streamservice/v1/stream_state_pb2.pyi | 93 +++++--- 7 files changed, 363 insertions(+), 314 deletions(-) diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 7e2ebef29..1e909c223 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -4,22 +4,9 @@ # is still defined in the server. See temporalio/client_stream.py. from .message_pb2 import ( - STREAM_MESSAGE_KIND_DATA, - STREAM_MESSAGE_KIND_FLUSH, - STREAM_MESSAGE_KIND_UNSPECIFIED, - StreamMessage, - StreamMessageBatch, - StreamMessageKind, + StreamRecord, + StreamRecordBatch, ) - -from .stream_state_pb2 import ( - ConsumerCursor, - ProducerCursor, - StreamLifecycle, - StreamState, - WorkflowStreamCursor, -) - from .request_response_pb2 import ( AddMessagesInput, AddMessagesOutput, @@ -80,6 +67,14 @@ TruncateStreamRequest, TruncateStreamResponse, ) +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamBudget, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) __all__ = [ "AddMessagesInput", @@ -133,14 +128,11 @@ "RegisterStreamConsumerOutput", "RegisterStreamConsumerRequest", "RegisterStreamConsumerResponse", - "STREAM_MESSAGE_KIND_DATA", - "STREAM_MESSAGE_KIND_FLUSH", - "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamBudget", "StreamLifecycle", "StreamListEntry", - "StreamMessage", - "StreamMessageBatch", - "StreamMessageKind", + "StreamRecord", + "StreamRecordBatch", "StreamState", "SubscribeWorkflowInput", "SubscribeWorkflowOutput", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index 3bbd8718e..8876ac29b 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -8,7 +8,6 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper # @@protoc_insertion_point(imports) @@ -18,66 +17,61 @@ from temporalio.api.common.v1 import ( message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ= (3, 10): +if sys.version_info >= (3, 8): import typing as typing_extensions else: import typing_extensions DESCRIPTOR: google.protobuf.descriptor.FileDescriptor -class _StreamMessageKind: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _StreamMessageKindEnumTypeWrapper( - google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ - _StreamMessageKind.ValueType - ], - builtins.type, -): # noqa: F821 - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 - STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 - STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 - """Producer signalling a delivery boundary. Carries no body and consumes an - offset like any other message. A consumer uses it to end a turn without - waiting out an idle timeout. +class StreamRecord(google.protobuf.message.Message): + """The stored shape of temporal.api.stream.v1.StreamRecord plus the offset a + read assigns. Field for field the public record, so one crosses the frontend + in either direction without translation. """ -class StreamMessageKind( - _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper -): ... - -STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 -STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 -STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 -"""Producer signalling a delivery boundary. Carries no body and consumes an -offset like any other message. A consumer uses it to end a turn without -waiting out an idle timeout. -""" -global___StreamMessageKind = StreamMessageKind - -class StreamMessage(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor class MetadataEntry(google.protobuf.message.Message): @@ -82,9 +54,11 @@ class StreamMessage(google.protobuf.message.Message): BODY_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int TOPIC_FIELD_NUMBER: builtins.int - TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int KIND_FIELD_NUMBER: builtins.int OFFSET_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int @property def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... @property @@ -93,18 +67,29 @@ class StreamMessage(google.protobuf.message.Message): ) -> google.protobuf.internal.containers.MessageMap[ builtins.str, temporal.api.common.v1.message_pb2.Payload ]: - """Producer-supplied provenance. The server does not populate this today.""" + """Producer-supplied provenance, stored as sent.""" topic: builtins.str - topic_sequence: builtins.int - """Position within this topic. The global offset orders the whole stream; - this lets a consumer reason about one topic without decoding the rest. + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. Stored + as sent; the global offset is what orders the stream. + """ + kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType + """Settled to DATA on append when left unspecified, so a retry hashes the + same bytes and a reader never sees the zero value. """ - kind: global___StreamMessageKind.ValueType offset: builtins.int """Position in the whole stream, set on read and never stored. A consumer - that resumes at message granularity needs it, and a topic-filtered read + that resumes at record granularity needs it, and a topic-filtered read leaves gaps that make it underivable from the response alone. """ + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did: its publish + command clears the field, whatever the worker sent. + """ + attempt: builtins.int + """The producer's attempt, stored as sent. Readers treat a later attempt by + the same producer as superseding what the earlier one wrote. + """ def __init__( self, *, @@ -114,9 +99,11 @@ class StreamMessage(google.protobuf.message.Message): ] | None = ..., topic: builtins.str = ..., - topic_sequence: builtins.int = ..., - kind: global___StreamMessageKind.ValueType = ..., + sequence: builtins.int = ..., + kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType = ..., offset: builtins.int = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["body", b"body"] @@ -124,6 +111,8 @@ class StreamMessage(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "attempt", + b"attempt", "body", b"body", "kind", @@ -132,37 +121,39 @@ class StreamMessage(google.protobuf.message.Message): b"metadata", "offset", b"offset", + "producer_id", + b"producer_id", + "sequence", + b"sequence", "topic", b"topic", - "topic_sequence", - b"topic_sequence", ], ) -> None: ... -global___StreamMessage = StreamMessage +global___StreamRecord = StreamRecord -class StreamMessageBatch(google.protobuf.message.Message): - """One append is one batch, and one batch is one log node. The server stores +class StreamRecordBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one data node. The server stores this serialized and opaque; it decodes only to trim a partial first page or to apply a topic filter. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - global___StreamMessage + global___StreamRecord ]: ... def __init__( self, *, - messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + records: collections.abc.Iterable[global___StreamRecord] | None = ..., ) -> None: ... def ClearField( - self, field_name: typing_extensions.Literal["messages", b"messages"] + self, field_name: typing_extensions.Literal["records", b"records"] ) -> None: ... -global___StreamMessageBatch = StreamMessageBatch +global___StreamRecordBatch = StreamRecordBatch diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index b813e2dfc..3df3e3c35 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -25,7 +25,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"\x94\x01\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x06 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xc4\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x08 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"p\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x04 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xe0\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x07 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x90\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"T\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... producer_id: builtins.str """Idempotency, all optional. Supply a producer identity and sequence, or an @@ -115,36 +114,32 @@ class AddMessagesInput(google.protobuf.message.Message): by this repo's helper generator. """ use_expected_offset: builtins.bool - owner_epoch: builtins.int def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., run_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., producer_id: builtins.str = ..., sequence: builtins.int = ..., expected_offset: builtins.int = ..., use_expected_offset: builtins.bool = ..., - owner_epoch: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ "expected_offset", b"expected_offset", - "messages", - b"messages", "namespace", b"namespace", - "owner_epoch", - b"owner_epoch", "producer_id", b"producer_id", + "records", + b"records", "run_id", b"run_id", "sequence", @@ -331,7 +326,7 @@ class PollMessagesInput(google.protobuf.message.Message): self, ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: """Filters by exact topic. Offsets are assigned over the unfiltered stream, so - next_offset advances past filtered-out messages too. + next_offset advances past filtered-out records too. """ wait_new_messages: builtins.bool """When set and the reader is caught up, block until something arrives, the @@ -374,33 +369,39 @@ global___PollMessagesInput = PollMessagesInput class PollMessagesOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int NEXT_OFFSET_FIELD_NUMBER: builtins.int HEAD_OFFSET_FIELD_NUMBER: builtins.int CLOSED_FIELD_NUMBER: builtins.int CLOSE_REASON_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... next_offset: builtins.int head_offset: builtins.int closed: builtins.bool @property def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + run_id: builtins.str + """The execution holding the stream. A workflow task slice built from this + read names the run it came from. + """ def __init__( self, *, - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., next_offset: builtins.int = ..., head_offset: builtins.int = ..., closed: builtins.bool = ..., close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + run_id: builtins.str = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] @@ -414,10 +415,12 @@ class PollMessagesOutput(google.protobuf.message.Message): b"closed", "head_offset", b"head_offset", - "messages", - b"messages", "next_offset", b"next_offset", + "records", + b"records", + "run_id", + b"run_id", ], ) -> None: ... @@ -564,7 +567,7 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): WORKFLOW_ID_FIELD_NUMBER: builtins.int OWNER_RUN_ID_FIELD_NUMBER: builtins.int STREAM_NAME_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int PRODUCER_ID_FIELD_NUMBER: builtins.int SEQUENCE_FIELD_NUMBER: builtins.int namespace: builtins.str @@ -577,10 +580,10 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): stream_name: builtins.str """Empty means the workflow's default output stream.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... producer_id: builtins.str """Optional idempotency, as on AddMessagesInput.""" @@ -592,8 +595,8 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): workflow_id: builtins.str = ..., owner_run_id: builtins.str = ..., stream_name: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., producer_id: builtins.str = ..., @@ -602,14 +605,14 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "messages", - b"messages", "namespace", b"namespace", "owner_run_id", b"owner_run_id", "producer_id", b"producer_id", + "records", + b"records", "sequence", b"sequence", "stream_name", @@ -724,18 +727,25 @@ class DeleteStreamInput(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int + FORCE_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str + force: builtins.bool + """Delete even while a workflow consumer is active. Without it the call is + refused, because the consumer's History depends on ranges the deletion + takes with it. + """ def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., + force: builtins.bool = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "namespace", b"namespace", "stream_id", b"stream_id" + "force", b"force", "namespace", b"namespace", "stream_id", b"stream_id" ], ) -> None: ... @@ -1186,11 +1196,16 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + CONSUMER_RUN_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str consumer_workflow_id: builtins.str - """The workflow that will consume, which names the pin.""" + """The workflow that will consume. Together with the run it names the pin, + so a later run of the same workflow id registers fresh rather than + inheriting a closed run's floor. + """ + consumer_run_id: builtins.str start_offset: builtins.int """Negative means from wherever the stream is when the pin is taken. Resolved here, where the frontier is, and returned so the cursor records a fact. @@ -1201,11 +1216,14 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): namespace: builtins.str = ..., stream_id: builtins.str = ..., consumer_workflow_id: builtins.str = ..., + consumer_run_id: builtins.str = ..., start_offset: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ + "consumer_run_id", + b"consumer_run_id", "consumer_workflow_id", b"consumer_workflow_id", "namespace", @@ -1223,33 +1241,22 @@ class RegisterStreamConsumerOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor START_OFFSET_FIELD_NUMBER: builtins.int - COLLECTION_ID_FIELD_NUMBER: builtins.int - BUCKET_SIZE_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int start_offset: builtins.int - collection_id: builtins.str - """What the consumer needs to address the log, all decided by the stream.""" - bucket_size: builtins.int known_head: builtins.int + """The frontier at registration, so the cursor starts with a known head + instead of waiting for the first push. + """ def __init__( self, *, start_offset: builtins.int = ..., - collection_id: builtins.str = ..., - bucket_size: builtins.int = ..., known_head: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "bucket_size", - b"bucket_size", - "collection_id", - b"collection_id", - "known_head", - b"known_head", - "start_offset", - b"start_offset", + "known_head", b"known_head", "start_offset", b"start_offset" ], ) -> None: ... @@ -1305,8 +1312,36 @@ global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput class AdvanceConsumerHeadOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor + CONSUMER_CLOSED_FIELD_NUMBER: builtins.int + SUCCESSOR_RUN_ID_FIELD_NUMBER: builtins.int + SUCCESSOR_START_OFFSET_FIELD_NUMBER: builtins.int + consumer_closed: builtins.bool + """The run that held the pin is closed and no current run of the workflow + consumes the stream, so the stream can release the pin. + """ + successor_run_id: builtins.str + """The run that held the pin is closed but a successor carries the + subscription, so the stream re-keys the pin to it, with the floor the + successor's cursor started from. + """ + successor_start_offset: builtins.int def __init__( self, + *, + consumer_closed: builtins.bool = ..., + successor_run_id: builtins.str = ..., + successor_start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_closed", + b"consumer_closed", + "successor_run_id", + b"successor_run_id", + "successor_start_offset", + b"successor_start_offset", + ], ) -> None: ... global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 2ce5a0451..9f334a50f 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -22,13 +22,14 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xe5\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"}\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\x12\x14\n\x0creplay_floor\x18\x06 \x01(\x03"\xe0\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\x12\x14\n\x0cstart_offset\x18\n \x01(\x03"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ temporal.api.common.v1.message_pb2.Payload: ... - owner_epoch: builtins.int - """Bumped on ownership change so a stale producer's write fails.""" - bucket_size: builtins.int - """Immutable once set. Offsets roll to a new log tree every bucket_size so no - single storage partition grows with the stream. - """ - collection_id: builtins.str - """Identity of the log this stream writes to. Bucket trees are derived from - it, so there is no per-bucket index to store. - """ @property def producers( self, @@ -123,6 +114,21 @@ class StreamState(google.protobuf.message.Message): @property def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: """Wall-clock close time, used to schedule retention deletion.""" + @property + def budget(self) -> global___StreamBudget: + """Set on a stream a workflow owns. Its batches are the owning execution's + mutable state, so appends past the budget are refused rather than left to + the execution size limit, which terminates the workflow. + """ + appended_bytes: builtins.int + """Bytes appended over the stream's life, kept for the budget check. A stream + with a budget never reclaims, so this is also what it holds. + """ + notify_pending: builtins.bool + """A notify task is scheduled and has not run yet. Appends while it is set + schedule none of their own; the task reads the head when it runs, so it + carries every append that landed before it. + """ def __init__( self, *, @@ -130,9 +136,6 @@ class StreamState(google.protobuf.message.Message): base_offset: builtins.int = ..., closed: builtins.bool = ..., close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., - owner_epoch: builtins.int = ..., - bucket_size: builtins.int = ..., - collection_id: builtins.str = ..., producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] | None = ..., consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] @@ -140,10 +143,15 @@ class StreamState(google.protobuf.message.Message): lifecycle: global___StreamLifecycle | None = ..., redirect_run_id: builtins.str = ..., close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + budget: global___StreamBudget | None = ..., + appended_bytes: builtins.int = ..., + notify_pending: builtins.bool = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "budget", + b"budget", "close_reason", b"close_reason", "close_time", @@ -155,26 +163,26 @@ class StreamState(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "appended_bytes", + b"appended_bytes", "base_offset", b"base_offset", - "bucket_size", - b"bucket_size", + "budget", + b"budget", "close_reason", b"close_reason", "close_time", b"close_time", "closed", b"closed", - "collection_id", - b"collection_id", "consumers", b"consumers", "head_offset", b"head_offset", "lifecycle", b"lifecycle", - "owner_epoch", - b"owner_epoch", + "notify_pending", + b"notify_pending", "producers", b"producers", "redirect_run_id", @@ -184,6 +192,32 @@ class StreamState(google.protobuf.message.Message): global___StreamState = StreamState +class StreamBudget(google.protobuf.message.Message): + """Hard bounds on what a stream may hold. Distinct from StreamLifecycle.max_items, + which reclaims the oldest messages: a budget refuses the newest. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAX_ITEMS_FIELD_NUMBER: builtins.int + MAX_BYTES_FIELD_NUMBER: builtins.int + max_items: builtins.int + max_bytes: builtins.int + def __init__( + self, + *, + max_items: builtins.int = ..., + max_bytes: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_bytes", b"max_bytes", "max_items", b"max_items" + ], + ) -> None: ... + +global___StreamBudget = StreamBudget + class ProducerCursor(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -301,8 +335,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int - COLLECTION_ID_FIELD_NUMBER: builtins.int - BUCKET_SIZE_FIELD_NUMBER: builtins.int OFFSET_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int EXTERNAL_FIELD_NUMBER: builtins.int @@ -311,9 +343,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): HAS_PENDING_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int stream_id: builtins.str - collection_id: builtins.str - """Enough to address the log without reading the stream component first.""" - bucket_size: builtins.int offset: builtins.int """Next offset to deliver.""" known_head: builtins.int @@ -342,8 +371,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): self, *, stream_id: builtins.str = ..., - collection_id: builtins.str = ..., - bucket_size: builtins.int = ..., offset: builtins.int = ..., known_head: builtins.int = ..., external: builtins.bool = ..., @@ -355,10 +382,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "bucket_size", - b"bucket_size", - "collection_id", - b"collection_id", "external", b"external", "has_pending", @@ -389,7 +412,7 @@ class StreamLifecycle(google.protobuf.message.Message): def retention(self) -> google.protobuf.duration_pb2.Duration: """How long a closed stream stays readable before it is deleted.""" max_items: builtins.int - """Cap on readable messages. Older whole buckets are reclaimed once the floor + """Cap on readable messages. Whole batches are reclaimed once the floor passes them, so a capped stream has bounded storage. """ def __init__( From 17abd54b2edc904291e97b0e64c61eadb10e26ec Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 426/831] Moved the workflow stream runtime to records and batched a task's publishes. The delivered job and the publish command carry StreamRecord protos, and a task's publishes on one stream are held until the task completes so they become one command and one History event. --- temporalio/worker/_workflow_instance.py | 197 +++++++++++++--------- temporalio/workflow/__init__.py | 14 +- temporalio/workflow/_context.py | 105 +++++------- tests/worker/test_workflow_stream.py | 209 +++++++++++++++++------- 4 files changed, 319 insertions(+), 206 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 0a17d2b22..9b1e1ea0b 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -273,14 +273,45 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Match the server's per-batch limits. Rejecting here turns a wedged workflow, -# which would replay and re-issue the same rejected command forever, into an -# error the workflow author can see. -_MAX_STREAM_MESSAGES_PER_BATCH = 1000 -_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +# Match the server's per-batch limits. A record over its limit is refused where +# it is published, because a rejected command would be reissued on every +# replay; a task's records are split into commands that fit the batch limits. +_MAX_STREAM_RECORDS_PER_BATCH = 1000 +_MAX_STREAM_RECORD_BYTES = 1 << 20 _MAX_STREAM_BATCH_BYTES = 2 << 20 +def _stream_batches( + records: Sequence[temporalio.api.stream.v1.StreamRecord], +) -> Iterator[list[temporalio.api.stream.v1.StreamRecord]]: + """Split one task's records for a stream into batches the server accepts.""" + batch: list[temporalio.api.stream.v1.StreamRecord] = [] + size = 0 + for record in records: + record_size = record.ByteSize() + if batch and ( + len(batch) >= _MAX_STREAM_RECORDS_PER_BATCH + or size + record_size > _MAX_STREAM_BATCH_BYTES + ): + yield batch + batch, size = [], 0 + batch.append(record) + size += record_size + if batch: + yield batch + + +def _is_completion_command( + command: temporalio.bridge.proto.workflow_commands.WorkflowCommand, +) -> bool: + return ( + command.HasField("complete_workflow_execution") + or command.HasField("continue_as_new_workflow_execution") + or command.HasField("fail_workflow_execution") + or command.HasField("cancel_workflow_execution") + ) + + class _StreamBuffer: """Holds the stream ranges delivered to a workflow so far. @@ -292,7 +323,7 @@ class _StreamBuffer: def __init__(self, stream_id: str = "") -> None: self._stream_id = stream_id - self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._records: list[temporalio.workflow.DeliveredStreamRecord] = [] self._waiters: list[asyncio.Future] = [] # Where the next range has to start. Unknown until the first one # arrives, because a subscription may start wherever the stream is and @@ -301,19 +332,19 @@ def __init__(self, stream_id: str = "") -> None: def extend( self, - messages: Sequence[temporalio.api.stream.v1.StreamMessage], + records: Sequence[temporalio.api.stream.v1.StreamRecord], from_offset: int = 0, to_offset: int | None = None, ) -> None: if to_offset is None: - to_offset = from_offset + len(messages) + to_offset = from_offset + len(records) # A range is recorded as consumed once and never resent, so one that # repeats, skips or mis-sizes would hand the workflow duplicate or - # shifted bodies with nothing to say so. Failing the task is what makes - # the fault visible. - if to_offset - from_offset != len(messages): + # shifted records with nothing to say so. Failing the task is what + # makes the fault visible. + if to_offset - from_offset != len(records): raise RuntimeError( - f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"stream {self._stream_id!r} delivered {len(records)} records " f"for offsets [{from_offset}, {to_offset})" ) if self._next_offset is not None and from_offset != self._next_offset: @@ -324,34 +355,35 @@ def extend( self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. - if not messages: + if not records: return # Offsets are dense inside a delivered range and the range arrives in # order, so counting from its start is the position rather than an - # estimate of it. The per-message field is not on the activation, and a + # estimate of it. The per-record field is not on the activation, and a # reader that has to resume elsewhere needs a position it can name. - self._messages.extend( - temporalio.workflow.DeliveredStreamMessage( - body=message.body.data, - topic=message.topic, - offset=from_offset + index, + for index, record in enumerate(records): + # Copied so the buffer outlives the activation that carried it. + kept = temporalio.api.stream.v1.StreamRecord() + kept.CopyFrom(record) + self._records.append( + temporalio.workflow.DeliveredStreamRecord( + record=kept, offset=from_offset + index + ) ) - for index, message in enumerate(messages) - ) waiters, self._waiters = self._waiters, [] for waiter in waiters: if not waiter.done(): waiter.set_result(None) - def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: - taken, self._messages = self._messages, [] + def take(self) -> list[temporalio.workflow.DeliveredStreamRecord]: + taken, self._records = self._records, [] return taken def put_back( - self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + self, records: Sequence[temporalio.workflow.DeliveredStreamRecord] ) -> None: """Return an unread tail to the front of the buffer.""" - self._messages[:0] = messages + self._records[:0] = records def wait_future(self) -> asyncio.Future: loop = asyncio.get_event_loop() @@ -360,7 +392,7 @@ def wait_future(self) -> asyncio.Future: return fut def __len__(self) -> int: - return len(self._messages) + return len(self._records) class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] @@ -496,6 +528,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: # arrive whether or not anything is reading yet, because the server has # already recorded them as consumed and will not send them again. self._stream_buffers: dict[str, _StreamBuffer] = {} + # Records this task's publishes append, by stream, until the task + # completes and they become commands. + self._stream_appends: dict[ + str, list[temporalio.api.stream.v1.StreamRecord] + ] = {} # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down @@ -557,6 +594,9 @@ def activate( temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion() ) self._current_completion.successful.SetInParent() + # A failed task's publishes never became commands, so nothing carries + # over into this one. + self._stream_appends = {} self._current_activation_error: Exception | None = None self._deployment_version_for_current_task = ( @@ -648,6 +688,9 @@ def activate( ) activation_err = None + if activation_err is None and not self._deleting: + self._flush_stream_appends() + # Apply versioning behavior if one was established if self._versioning_behavior: self._current_completion.successful.versioning_behavior = ( @@ -712,8 +755,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) - elif job.HasField("deliver_stream_messages"): - self._apply_deliver_stream_messages(job.deliver_stream_messages) + elif job.HasField("deliver_stream_records"): + self._apply_deliver_stream_records(job.deliver_stream_records) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1239,9 +1282,9 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) - def _apply_deliver_stream_messages( + def _apply_deliver_stream_records( self, - job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamRecords, ) -> None: buffer = self._stream_buffers.get(job.stream_id) if buffer is None: @@ -1250,7 +1293,7 @@ def _apply_deliver_stream_messages( # subscription made later in the same task still sees it. buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset, job.to_offset) + buffer.extend(job.records, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1425,51 +1468,53 @@ def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset - def workflow_add_stream_messages( - self, stream_id: str, messages: Sequence[bytes], topic: str + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: - if not messages: - raise ValueError("add_stream_messages needs at least one message") - if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: - raise ValueError( - f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " - f"got {len(messages)}" - ) - total = 0 - for body in messages: - if len(body) > _MAX_STREAM_MESSAGE_BYTES: + self._assert_not_read_only("append stream records") + if not records: + raise ValueError("append_stream_records needs at least one record") + kept: list[temporalio.api.stream.v1.StreamRecord] = [] + for record in records: + if record.ByteSize() > _MAX_STREAM_RECORD_BYTES: raise ValueError( - f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " - f"bytes, got {len(body)}" + f"a stream record is limited to {_MAX_STREAM_RECORD_BYTES} " + f"bytes, got {record.ByteSize()}" ) - total += len(body) - if total > _MAX_STREAM_BATCH_BYTES: - raise ValueError( - f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" - ) - command = self._add_command() - command.add_stream_messages.stream_id = stream_id - for body in messages: - # The bodies ride the command and never enter History, so the event - # this produces stays the same size whatever is published here. - message = command.add_stream_messages.messages.add() - message.body.data = body - # Every other Temporal payload names its encoding, and the UI, the - # CLI and any codec server rely on that to decode what they read. - message.body.metadata["encoding"] = b"binary/plain" - message.topic = topic - - async def workflow_read_stream( - self, stream_id: str, max_messages: int - ) -> list[bytes]: - return [ - m.body - for m in await self.workflow_read_stream_messages(stream_id, max_messages) - ] - - async def workflow_read_stream_messages( - self, stream_id: str, max_messages: int - ) -> list[temporalio.workflow.DeliveredStreamMessage]: + copy = temporalio.api.stream.v1.StreamRecord() + copy.CopyFrom(record) + # The workflow is the producer here, whatever the caller set. + copy.producer_id = "" + kept.append(copy) + # Held until the task completes, so a task's publishes on one stream + # become one command and one History event however many there were. + self._stream_appends.setdefault(stream_id, []).extend(kept) + + def _flush_stream_appends(self) -> None: + appends, self._stream_appends = self._stream_appends, {} + if not appends: + return + commands = self._current_completion.successful.commands + # Ahead of any command that ends the run, because the server accepts + # nothing after one of those. + insert_at = len(commands) + for index, command in enumerate(commands): + if _is_completion_command(command): + insert_at = index + break + for stream_id, records in appends.items(): + for batch in _stream_batches(records): + command = temporalio.bridge.proto.workflow_commands.WorkflowCommand() + command.append_stream_records.stream_id = stream_id + command.append_stream_records.records.extend(batch) + commands.insert(insert_at, command) + insert_at += 1 + + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[temporalio.workflow.DeliveredStreamRecord]: # Ranges arrive on Workflow Tasks, and a query activation carries none, # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. @@ -1478,10 +1523,10 @@ async def workflow_read_stream_messages( while not len(buffer): await buffer.wait_future() taken = buffer.take() - if max_messages and len(taken) > max_messages: + if max_records and len(taken) > max_records: # Put the tail back rather than dropping it: nothing will resend it. - buffer.put_back(taken[max_messages:]) - taken = taken[:max_messages] + buffer.put_back(taken[max_records:]) + taken = taken[:max_records] return taken def workflow_get_current_history_length(self) -> int: diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 8d57b75e7..18d04cb0c 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,7 +58,7 @@ wait, ) from ._context import ( - DeliveredStreamMessage, + DeliveredStreamRecord, Info, ParentInfo, RootInfo, @@ -66,7 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, - add_stream_messages, + append_stream_records, cancellation_reason, current_update_info, deprecate_patch, @@ -88,8 +88,7 @@ payload_converter, random, random_seed, - read_stream, - read_stream_messages, + read_stream_records, register_random_seed_callback, set_current_details, sleep, @@ -238,10 +237,9 @@ "upsert_search_attributes", "uuid4", "uuid7", - "DeliveredStreamMessage", - "read_stream", - "read_stream_messages", - "add_stream_messages", + "DeliveredStreamRecord", + "read_stream_records", + "append_stream_records", "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 57183aafb..8b6c07782 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -14,6 +14,7 @@ from nexusrpc import InputT, OutputT import temporalio.api.common.v1 +import temporalio.api.stream.v1 import temporalio.common import temporalio.converter @@ -317,19 +318,16 @@ def workflow_get_current_deployment_version( def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... @abstractmethod - def workflow_add_stream_messages( - self, stream_id: str, messages: Sequence[bytes], topic: str + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: ... @abstractmethod - async def workflow_read_stream( - self, stream_id: str, max_messages: int - ) -> list[bytes]: ... - - @abstractmethod - async def workflow_read_stream_messages( - self, stream_id: str, max_messages: int - ) -> list[DeliveredStreamMessage]: ... + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[DeliveredStreamRecord]: ... @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -968,10 +966,10 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: - """Subscribe this workflow to a stream. + """Subscribe this workflow to a server-side stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: a second + and :func:`read_stream_records` returns them. Safe to call again: a second subscription to a stream this run already consumes does not move its cursor, though it does write one event. Calling it on every replay is harmless because replay matches the command to the event already recorded. @@ -979,10 +977,12 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up without doing I/O and a value it carried would be a reading rather than a - fact. + fact. A name this workflow has not written yet names a stream it owns, and + subscribing creates it. Args: - stream_id: Stream to consume. + stream_id: Stream to consume: the name of one this workflow owns, or + the id of a standalone stream. start_offset: Where to start. Negative means from wherever the stream is when the subscription is registered; the server resolves that once and records it, so replay does not resolve it again. @@ -990,83 +990,60 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) -def add_stream_messages( - messages: Sequence[bytes], +def append_stream_records( + records: Sequence[temporalio.api.stream.v1.StreamRecord], *, stream_id: str = "", - topic: str = "", ) -> None: - """Publish a batch of messages to a stream this workflow owns. + """Publish records to a server-side stream this workflow owns. - Returns as soon as the command is issued. The bodies go to the stream's own - log rather than into History, which gets one fixed-size event naming the - offset range, so a batch of a thousand costs History the same as a batch of + Returns at once. The records become one command when this Workflow Task + completes, so they are visible when the task is accepted and never if it + fails. Their bodies go to the stream's own log rather than into History, + which gets one fixed-size event naming the offset range, so a task that + publishes a thousand records costs History the same as one that publishes one. Readers do not have to exist yet, and adding one costs the writer nothing. - Batch where you can. The event is per call, and a workflow is bounded by the - history event count, so one call with a hundred messages leaves far more - room than a hundred calls with one. - Args: - messages: Bodies to append, in order. + records: Records to append, in order. The server stores each with an + empty ``producer_id``, because the workflow is the producer. stream_id: Stream to publish to. Empty means the workflow's default output stream. - topic: Optional topic, which readers can filter on. Offsets are still - assigned over the unfiltered stream. + + Raises: + ValueError: ``records`` is empty or one of them is over the server's + per-record size limit. """ - _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + _Runtime.current().workflow_append_stream_records(stream_id, records) @dataclass(frozen=True) -class DeliveredStreamMessage: - """One message a consuming workflow was given, with where it sat.""" +class DeliveredStreamRecord: + """One record a consuming workflow was given, with where it sat.""" - body: bytes - topic: str + record: temporalio.api.stream.v1.StreamRecord offset: int """Its position in the whole stream, which is what a reader resumes from.""" -async def read_stream_messages( - stream_id: str, *, max_messages: int = 0 -) -> list[DeliveredStreamMessage]: - """Read the next messages, keeping their topic and position. - - Same delivery as :func:`read_stream`. A reader that has to name where it - got to, filter a topic, or hand a position to something outside the - workflow needs more than the bodies. - - Args: - stream_id: Stream to read from. - max_messages: Most messages to return at once, or 0 for everything - available. - """ - return await _Runtime.current().workflow_read_stream_messages( - stream_id, max_messages - ) - +async def read_stream_records( + stream_id: str, *, max_records: int = 0 +) -> list[DeliveredStreamRecord]: + """Read the next records of a server-side stream this workflow consumes. -async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: - """Read the next messages of a stream this workflow consumes. - - Waits until at least one message is available. Ranges arrive on Workflow + Waits until at least one record is available. Ranges arrive on Workflow Tasks, and only the offsets they covered are written to History, so this is deterministic on replay: the server re-supplies the same ranges by reading - the stream again. - - Subscribe out of band with the stream client. This only reads what has - already been delivered to this workflow. + the stream again. Subscribe first with :func:`subscribe_stream`; this only + reads what has already been delivered to this workflow. Args: stream_id: Stream to read from. - max_messages: Most messages to return at once, or 0 for everything + max_records: Most records to return at once, or 0 for everything available. - - Returns: - The message bodies, in stream order. """ - return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + return await _Runtime.current().workflow_read_stream_records(stream_id, max_records) async def wait_condition( diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 93b596b8c..9083e74a9 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -1,9 +1,10 @@ -"""In-workflow consumption of a server-side stream. +"""In-workflow consumption and publication of a server-side stream. Ranges arrive on Workflow Tasks and only the offsets they covered are written to History, so replay is served by the server reading the stream again. These tests -drive the buffering and the workflow-facing read directly, which is the part -this SDK owns; the delivery decision itself lives in the server and sdk-core. +drive the buffering, the workflow-facing read and the per-task publish directly, +which is the part this SDK owns; the delivery decision itself lives in the +server and sdk-core. """ from __future__ import annotations @@ -18,22 +19,29 @@ from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( _MAX_STREAM_BATCH_BYTES, - _MAX_STREAM_MESSAGE_BYTES, + _MAX_STREAM_RECORD_BYTES, + _MAX_STREAM_RECORDS_PER_BATCH, _StreamBuffer, _WorkflowInstanceImpl, ) from temporalio.workflow import ReadOnlyContextError -def message(body: bytes) -> api_stream.StreamMessage: - return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) +def record(body: bytes, topic: str = "") -> api_stream.StreamRecord: + return api_stream.StreamRecord( + body=temporalio.api.common.v1.Payload(data=body), topic=topic + ) + + +def bodies(delivered: list[Any]) -> list[bytes]: + return [item.record.body.data for item in delivered] async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() - buffer.extend([message(b"one"), message(b"two")]) + buffer.extend([record(b"one"), record(b"two")]) - assert [m.body for m in buffer.take()] == [b"one", b"two"] + assert bodies(buffer.take()) == [b"one", b"two"] assert len(buffer) == 0 @@ -44,9 +52,9 @@ async def test_buffer_wakes_a_waiting_reader() -> None: waiter = buffer.wait_future() assert not waiter.done() - buffer.extend([message(b"late")]) + buffer.extend([record(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body for m in buffer.take()] == [b"late"] + assert bodies(buffer.take()) == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -63,24 +71,24 @@ async def test_empty_range_does_not_wake_a_reader() -> None: async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: buffer = _StreamBuffer() - buffer.extend([message(b"early")]) + buffer.extend([record(b"early")]) # No waiting: the data is already there. assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body for m in buffer.take()] == [b"early"] + assert bodies(buffer.take()) == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream_messages``, so a test that + The cap lives inside ``workflow_read_stream_records``, so a test that reimplements it proves nothing about the code that ships. Borrowing the method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages + workflow_read_stream_records = _WorkflowInstanceImpl.workflow_read_stream_records def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} @@ -90,31 +98,33 @@ def _assert_not_read_only(self, action: str) -> None: if self._read_only: raise ReadOnlyContextError(f"cannot {action} in a read-only context") - async def read(self, stream: str, max_messages: int) -> list[bytes]: + async def read(self, stream: str, max_records: int) -> list[bytes]: instance: Any = self - return await _WorkflowInstanceImpl.workflow_read_stream( - instance, stream, max_messages + return bodies( + await _WorkflowInstanceImpl.workflow_read_stream_records( + instance, stream, max_records + ) ) -@pytest.mark.parametrize("max_messages", [1, 2, 5]) -async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: +@pytest.mark.parametrize("max_records", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_records: int) -> None: stub = _ReadOnlyStub() - bodies = [b"a", b"b", b"c"] + expected = [b"a", b"b", b"c"] stub._stream_buffers["s"] = _StreamBuffer() - stub._stream_buffers["s"].extend([message(b) for b in bodies]) + stub._stream_buffers["s"].extend([record(b) for b in expected]) - got = await stub.read("s", max_messages) + got = await stub.read("s", max_records) - assert got == bodies[:max_messages] + assert got == expected[:max_records] # Whatever the cap left behind has to still be there: nothing resends it. - assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + assert len(stub._stream_buffers["s"]) == max(0, len(expected) - max_records) if len(stub._stream_buffers["s"]): rest = await stub.read("s", 0) - assert got + rest == bodies + assert got + rest == expected else: - assert got == bodies + assert got == expected # A query activation carries no ranges, so a read there would wait on a future @@ -122,7 +132,7 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> async def test_read_is_refused_in_a_read_only_context() -> None: stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() - stub._stream_buffers["s"].extend([message(b"a")]) + stub._stream_buffers["s"].extend([record(b"a")]) with pytest.raises(ReadOnlyContextError, match="read stream"): await stub.read("s", 0) @@ -135,61 +145,144 @@ async def test_read_is_refused_in_a_read_only_context() -> None: # only place a repeated, skipped or mis-sized delivery can still be noticed. async def test_ranges_have_to_abut_the_last_one() -> None: buffer = _StreamBuffer("s") - buffer.extend([message(b"a"), message(b"b")], 0, 2) + buffer.extend([record(b"a"), record(b"b")], 0, 2) # An empty range moves the expectation too: the server recorded it. buffer.extend([], 2, 2) - buffer.extend([message(b"c")], 2, 3) - assert [m.offset for m in buffer.take()] == [0, 1, 2] + buffer.extend([record(b"c")], 2, 3) + assert [item.offset for item in buffer.take()] == [0, 1, 2] with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): - buffer.extend([message(b"c")], 2, 3) + buffer.extend([record(b"c")], 2, 3) with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): - buffer.extend([message(b"f")], 5, 6) + buffer.extend([record(b"f")], 5, 6) -async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: +async def test_a_range_has_to_carry_as_many_records_as_it_spans() -> None: buffer = _StreamBuffer("s") - with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): - buffer.extend([message(b"a"), message(b"b")], 0, 1) + with pytest.raises(RuntimeError, match=r"2 records for offsets \[0, 1\)"): + buffer.extend([record(b"a"), record(b"b")], 0, 1) assert len(buffer) == 0 +class _Completion: + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + +class _Successful: + def __init__(self) -> None: + self.successful = _Completion() + + class _CommandStub: - """Drives the real publish path and keeps the commands it issued.""" + """Drives the real publish path and keeps the commands it issued. + + The completion's command list is a plain list here, which supports the + same ``insert`` the protobuf container does. + """ - workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + workflow_append_stream_records = ( + _WorkflowInstanceImpl.workflow_append_stream_records + ) + _flush_stream_appends = _WorkflowInstanceImpl._flush_stream_appends def __init__(self) -> None: - self.commands: list[WorkflowCommand] = [] + self._stream_appends: dict[str, list[api_stream.StreamRecord]] = {} + self._current_completion = _Successful() + + def _assert_not_read_only(self, _action: str) -> None: + pass + + @property + def commands(self) -> list[WorkflowCommand]: + return self._current_completion.successful.commands - def _add_command(self) -> WorkflowCommand: - command = WorkflowCommand() - self.commands.append(command) - return command + def publish(self, *records: api_stream.StreamRecord, stream_id: str = "") -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_append_stream_records( + instance, stream_id, list(records) + ) - def publish(self, *bodies: bytes) -> None: + def flush(self) -> None: instance: Any = self - _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + _WorkflowInstanceImpl._flush_stream_appends(instance) -# The server refuses an oversized publish, and a refused command is reissued -# on every replay, so the limits have to be applied before the command exists. -def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: +# A task's publishes on one stream become one command, whatever their number, +# because the event the command produces is what bounds a workflow's History. +def test_a_tasks_publishes_on_one_stream_become_one_command() -> None: stub = _CommandStub() - stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) - assert len(stub.commands) == 1 + stub.publish(record(b"a"), record(b"b")) + stub.publish(record(b"c")) + stub.publish(record(b"d"), stream_id="other") + assert stub.commands == [] + + stub.flush() + + by_stream = { + command.append_stream_records.stream_id: [ + r.body.data for r in command.append_stream_records.records + ] + for command in stub.commands + } + assert by_stream == {"": [b"a", b"b", b"c"], "other": [b"d"]} + # Flushed once: a second flush has nothing left to say. + stub.flush() + assert len(stub.commands) == 2 + + +# The workflow is the producer of what it publishes, whatever the caller set. +def test_the_workflows_records_carry_no_producer() -> None: + stub = _CommandStub() + stub.publish(api_stream.StreamRecord(producer_id="someone", attempt=3)) + stub.flush() + assert stub.commands[0].append_stream_records.records[0].producer_id == "" - with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): - stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) - assert len(stub.commands) == 1 +# The server accepts nothing after a command that ends the run, so the +# publishes have to go ahead of it. +def test_publishes_are_flushed_ahead_of_the_completion_command() -> None: + stub = _CommandStub() + stub.publish(record(b"a")) + done = WorkflowCommand() + done.complete_workflow_execution.SetInParent() + stub.commands.append(done) + + stub.flush() -def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + assert [c.WhichOneof("variant") for c in stub.commands] == [ + "append_stream_records", + "complete_workflow_execution", + ] + + +# The server refuses an oversized record, and a refused command is reissued on +# every replay, so the limit has to be applied before the record is buffered. +def test_a_record_over_the_server_limit_is_refused_before_the_command() -> None: stub = _CommandStub() - half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) - stub.publish(half, half) + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16))) + with pytest.raises(ValueError, match=f"{_MAX_STREAM_RECORD_BYTES} bytes"): + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES + 1))) + stub.flush() assert len(stub.commands) == 1 - with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): - stub.publish(half, half, b"x") - assert len(stub.commands) == 1 + +# A task that publishes more than one batch holds is split into commands the +# server accepts, by count and by bytes, rather than refused. +def test_a_task_over_the_batch_limits_is_split_into_commands() -> None: + stub = _CommandStub() + stub.publish(*(record(b"x") for _ in range(_MAX_STREAM_RECORDS_PER_BATCH + 1))) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [ + _MAX_STREAM_RECORDS_PER_BATCH, + 1, + ] + + stub = _CommandStub() + # Two records that fit one batch together, then one whose framing alone + # overflows the room they leave. + big = record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16)) + room = _MAX_STREAM_BATCH_BYTES - 2 * big.ByteSize() + stub.publish(big, big, record(b"y" * room)) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [2, 1] From a09ba082970e0699bd1160c05b5ea61d009a9ee5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 427/831] Moved the stream client and the contrib surface to records and SDK errors. Every stub call translates the transport's failure into StreamNotFoundError or RPCError, and the client's payload codec is applied to bodies so the two sides of a namespace with a codec agree. --- temporalio/client_stream.py | 347 ++++++++++-------- temporalio/contrib/server_streams/__init__.py | 150 ++++---- tests/contrib/test_server_streams.py | 7 +- tests/test_client_stream.py | 121 ++++-- 4 files changed, 360 insertions(+), 265 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 15760a980..b482941af 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -3,7 +3,8 @@ A stream is a durable, offset-addressed append-only sequence that lives beside Workflow History rather than inside it. Appending schedules no Workflow Task, and each reader holds its own cursor, so adding a reader costs nothing on the -write side. +write side. The record is ``temporal.api.stream.v1.StreamRecord`` on the wire +and in the store, so a reader in any language decodes the same bytes. Prototype support for AI-198. Four things about it are temporary and will change before this is a real feature: @@ -15,37 +16,47 @@ coming from the api submodule, because the service is still defined in the server. That is why the wire names read as server-internal. - **This client is for use outside a Workflow.** Workflow code publishes and - consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` - instead. + consumes with ``workflow.append_stream_records`` and + ``workflow.read_stream_records`` instead. - **No TLS or API-key support**, for the same reason: the channel is built here rather than by the machinery that normally handles that. + +A failed call raises :class:`temporalio.streams.StreamNotFoundError` when the +server answers ``NOT_FOUND`` and :class:`temporalio.service.RPCError` +otherwise, never the transport's own exception type. """ from __future__ import annotations import asyncio import weakref -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass -from typing import Any +from typing import Any, TypeVar import google.protobuf.duration_pb2 +import grpc +import grpc.aio -import temporalio.api.common.v1 import temporalio.api.streamservice.v1 as stream +from temporalio.api.stream.v1 import StreamRecord from temporalio.api.streamservice.v1 import service_pb2_grpc +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import StreamNotFoundError __all__ = [ "Appended", - "Message", "Page", "StreamClient", + "StreamEntry", "StreamHandle", "WorkflowStreamHandle", "close_shared_clients", "shared_client", ] +_T = TypeVar("_T") + @dataclass(frozen=True) class Appended: @@ -62,23 +73,16 @@ class Appended: @dataclass(frozen=True) -class Message: - """One item read from a stream. +class StreamEntry: + """One record read from a stream, with where it sits. Offsets are assigned over the unfiltered stream, so a topic-filtered read - hands back messages whose offsets are not contiguous. To resume at the - boundary of a whole read, checkpoint the ``next_offset`` that - :meth:`StreamHandle.read` returns instead. + hands back entries whose offsets are not contiguous. A reader that resumes + between records takes ``offset`` rather than counting what it received. """ - data: bytes - topic: str = "" + record: StreamRecord offset: int = 0 - """Where this message sits in the whole stream. - - A topic filter leaves gaps, so a reader that resumes between messages has - to take this rather than count what it received. - """ @dataclass(frozen=True) @@ -86,13 +90,73 @@ class Page: """One read of a stream. ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can - be added and this reader has everything. + be added and this reader has everything. ``run_id`` names the execution + holding the stream, which is how a reader of a workflow's stream learns + which run it is on when it did not pin one. """ - messages: list[Message] + entries: list[StreamEntry] next_offset: int head_offset: int closed: bool + run_id: str = "" + + +def _to_service(record: StreamRecord) -> stream.StreamRecord: + # Field for field the public record; the stored shape only adds the offset + # a read assigns. An unset body stays unset so a FINISH record reads back + # as one. + out = stream.StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return out + + +def _to_public(record: stream.StreamRecord) -> StreamEntry: + out = StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return StreamEntry(record=out, offset=record.offset) + + +def _translate(error: grpc.aio.AioRpcError) -> Exception: + code = error.code() + details = error.details() or code.name + if code is grpc.StatusCode.NOT_FOUND: + return StreamNotFoundError(details) + raw = b"" + # The aio metadata iterates as (key, value) pairs at runtime, whatever + # shape the stubs give its items. + trailing: Any = error.trailing_metadata() + for item in trailing or (): + key, value = item[0], item[1] + if key == "grpc-status-details-bin" and isinstance(value, bytes): + raw = value + return RPCError(details, RPCStatusCode(code.value[0]), raw) + + +async def _call(method: Callable[[Any], Awaitable[_T]], request: Any) -> _T: + """Make one stub call, translating the transport's failure to the SDK's.""" + try: + return await method(request) + except grpc.aio.AioRpcError as error: + raise _translate(error) from error class StreamClient: @@ -107,19 +171,12 @@ def __init__(self, channel: Any, namespace: str) -> None: self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod - def connect(target_host: str, namespace: str = "default") -> "StreamClient": + def connect(target_host: str, namespace: str = "default") -> StreamClient: """Open a channel to a frontend. Separate from ``Client.connect`` because this does not share the connection the rest of the SDK uses. """ - try: - import grpc - except ImportError as err: - raise RuntimeError( - "temporalio.client_stream requires the grpc extra: " - "pip install 'temporalio[grpc]'" - ) from err return StreamClient(grpc.aio.insecure_channel(target_host), namespace) async def close(self) -> None: @@ -132,11 +189,11 @@ async def create( *, retention: float | None = None, max_items: int | None = None, - ) -> "StreamHandle": + ) -> StreamHandle: """Create a stream and return a handle to it. ``retention`` is how long a closed stream stays readable, in seconds. - ``max_items`` caps how many messages remain readable, dropping the + ``max_items`` caps how many records remain readable, dropping the oldest, which bounds storage for a stream nobody truncates. """ lifecycle = stream.StreamLifecycle() @@ -147,14 +204,15 @@ async def create( if max_items is not None: lifecycle.max_items = max_items - response = await self._stub.CreateStream( + response = await _call( + self._stub.CreateStream, stream.CreateStreamRequest( frontend_request=stream.CreateStreamInput( namespace=self._namespace, stream_id=stream_id, lifecycle=lifecycle, ) - ) + ), ) return StreamHandle( self._stub, @@ -163,24 +221,25 @@ async def create( run_id=response.frontend_response.run_id, ) - def get(self, stream_id: str) -> "StreamHandle": + def get(self, stream_id: str) -> StreamHandle: """Open an existing stream without a round trip.""" return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( self, workflow_id: str, name: str = "", *, owner_run_id: str = "" - ) -> "WorkflowStreamHandle": - """Open a stream a workflow publishes to. + ) -> WorkflowStreamHandle: + """Open a stream a workflow owns. A stream a workflow owns lives inside that workflow's execution and has no id of its own, so it is named by its owner and its name. An empty name is the workflow's default output stream, which is what - ``workflow.add_stream_messages`` writes to when it is given none. + ``workflow.append_stream_records`` writes to when it is given none. - The stream is created by the workflow's first publish. Reading one that - does not exist yet is not an error: it reads as empty and a - :meth:`WorkflowStreamHandle.follow` parked on it wakes when the - workflow publishes. + The stream is created by the workflow's first publish or subscription, + or by the first append from outside. Reading one that does not exist + yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when something + is written. ``owner_run_id`` pins the handle to one run of the workflow; see :meth:`WorkflowStreamHandle.pin` for why a follower wants that. @@ -191,7 +250,7 @@ def workflow_stream( class StreamHandle: - """A handle to one stream.""" + """A handle to one standalone stream.""" def __init__( self, stub: Any, namespace: str, stream_id: str, run_id: str = "" @@ -211,12 +270,11 @@ def id(self) -> str: async def append( self, - *messages: bytes, - topic: str = "", + *records: StreamRecord, producer_id: str = "", sequence: int = 0, ) -> Appended: - """Append messages and return where they landed. + """Append records and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than @@ -224,26 +282,18 @@ async def append( at-least-once, which is only the right trade when duplicates are harmless. """ - response = await self._stub.AddMessages( + response = await _call( + self._stub.AddMessages, stream.AddMessagesRequest( frontend_request=stream.AddMessagesInput( namespace=self._namespace, stream_id=self._id, run_id=self._run_id, - messages=[ - stream.StreamMessage( - body=temporalio.api.common.v1.Payload( - data=m, metadata={"encoding": b"binary/plain"} - ), - topic=topic, - kind=stream.STREAM_MESSAGE_KIND_DATA, - ) - for m in messages - ], + records=[_to_service(record) for record in records], producer_id=producer_id, sequence=sequence, ) - ) + ), ) return _appended(response.frontend_response) @@ -251,43 +301,29 @@ async def read( self, *, from_offset: int = 0, - max_messages: int = 0, + max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, - ) -> tuple[list[Message], int]: - """Read once from ``from_offset``, returning the messages and the + ) -> tuple[list[StreamEntry], int]: + """Read once from ``from_offset``, returning the entries and the offset to read from next. With ``wait`` set, blocks until something arrives, the stream closes, or the server's long-poll window elapses. A window that elapses returns an empty list rather than raising, so the caller just reads again. """ - response = await self._stub.PollMessages( - stream.PollMessagesRequest( - frontend_request=stream.PollMessagesInput( - namespace=self._namespace, - stream_id=self._id, - run_id=self._run_id, - from_offset=from_offset, - max_messages=max_messages, - topics=list(topics), - wait_new_messages=wait, - ) - ) + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait ) - out = response.frontend_response - return [ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], (out.next_offset) + return page.entries, page.next_offset async def follow( self, *, from_offset: int = 0, topics: Sequence[str] = (), - ) -> AsyncIterator[Message]: - """Yield messages as they arrive, starting at ``from_offset``. + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, starting at ``from_offset``. Ends once the stream is closed and this reader has drained it. A closed stream stays readable until its retention expires, so a reader that @@ -296,61 +332,77 @@ async def follow( """ offset = from_offset while True: - response = await self._stub.PollMessages( - stream.PollMessagesRequest( - frontend_request=stream.PollMessagesInput( - namespace=self._namespace, - stream_id=self._id, - run_id=self._run_id, - from_offset=offset, - topics=list(topics), - wait_new_messages=True, - ) - ) - ) - out = response.frontend_response - for msg in out.messages: - yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) - offset = out.next_offset - if out.closed and offset >= out.head_offset: + page = await self.poll(from_offset=offset, topics=topics) + for entry in page.entries: + yield entry + offset = page.next_offset + if page.closed and offset >= page.head_offset: return + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_records: int = 0, + wait: bool = True, + ) -> Page: + """One read, with everything the caller needs to decide what to do next.""" + response = await _call( + self._stub.PollMessages, + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_records, + topics=list(topics), + wait_new_messages=wait, + ) + ), + ) + return _page(response.frontend_response) + async def finish_writing(self, producer_id: str) -> None: """Declare one producer done without ending the stream for others.""" - await self._stub.FinishWriting( + await _call( + self._stub.FinishWriting, stream.FinishWritingRequest( frontend_request=stream.FinishWritingInput( namespace=self._namespace, stream_id=self._id, producer_id=producer_id, ) - ) + ), ) async def close(self) -> None: """Seal the stream. Readers can still drain what is already there.""" - await self._stub.CloseStream( + await _call( + self._stub.CloseStream, stream.CloseStreamRequest( frontend_request=stream.CloseStreamInput( namespace=self._namespace, stream_id=self._id ) - ) + ), ) async def describe(self) -> stream.StreamState: """Read the stream's current frontier, floor and closed state.""" - response = await self._stub.DescribeStream( + response = await _call( + self._stub.DescribeStream, stream.DescribeStreamRequest( frontend_request=stream.DescribeStreamInput( namespace=self._namespace, stream_id=self._id ) - ) + ), ) return response.frontend_response.state class WorkflowStreamHandle: - """A handle to a stream a workflow publishes to. + """A handle to a stream a workflow owns. The workflow writes to it from inside its Workflow Task, which costs it no transition of its own. Anything else writes through :meth:`append`, which @@ -404,8 +456,7 @@ def pin(self, run_id: str) -> None: async def append( self, - *messages: bytes, - topic: str = "", + *records: StreamRecord, producer_id: str = "", sequence: int = 0, ) -> Appended: @@ -415,27 +466,19 @@ async def append( execution whatever its size, so a batch of a hundred costs what a batch of one does. """ - response = await self._stub.AddWorkflowMessages( + response = await _call( + self._stub.AddWorkflowMessages, stream.AddWorkflowMessagesRequest( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, owner_run_id=self._owner_run_id, stream_name=self._name, - messages=[ - stream.StreamMessage( - body=temporalio.api.common.v1.Payload( - data=m, metadata={"encoding": b"binary/plain"} - ), - topic=topic, - kind=stream.STREAM_MESSAGE_KIND_DATA, - ) - for m in messages - ], + records=[_to_service(record) for record in records], producer_id=producer_id, sequence=sequence, ) - ) + ), ) return _appended(response.frontend_response) @@ -443,43 +486,28 @@ async def read( self, *, from_offset: int = 0, - max_messages: int = 0, + max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, - ) -> tuple[list[Message], int]: + ) -> tuple[list[StreamEntry], int]: """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" - response = await self._stub.PollWorkflowMessages( - stream.PollWorkflowMessagesRequest( - frontend_request=stream.PollWorkflowMessagesInput( - namespace=self._namespace, - workflow_id=self._workflow_id, - owner_run_id=self._owner_run_id, - stream_name=self._name, - from_offset=from_offset, - max_messages=max_messages, - topics=list(topics), - wait_new_messages=wait, - ) - ) + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait ) - out = response.frontend_response - return [ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], (out.next_offset) + return page.entries, page.next_offset async def follow( self, *, from_offset: int = 0, topics: Sequence[str] = (), - ) -> AsyncIterator[Message]: - """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, as :meth:`StreamHandle.follow`.""" offset = from_offset while True: page = await self.poll(from_offset=offset, topics=topics) - for msg in page.messages: - yield msg + for entry in page.entries: + yield entry offset = page.next_offset if page.closed and offset >= page.head_offset: return @@ -489,16 +517,17 @@ async def poll( *, from_offset: int = 0, topics: Sequence[str] = (), - max_messages: int = 0, + max_records: int = 0, wait: bool = True, - ) -> "Page": + ) -> Page: """One read, with everything the caller needs to decide what to do next. :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. On a pinned handle ``closed`` also says the run has ended. """ - response = await self._stub.PollWorkflowMessages( + response = await _call( + self._stub.PollWorkflowMessages, stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, @@ -506,22 +535,13 @@ async def poll( owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, - max_messages=max_messages, + max_messages=max_records, topics=list(topics), wait_new_messages=wait, ) - ) - ) - out = response.frontend_response - return Page( - messages=[ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], - next_offset=out.next_offset, - head_offset=out.head_offset, - closed=out.closed, + ), ) + return _page(response.frontend_response) async def describe(self) -> stream.StreamState: """Read the stream's current frontier, floor and closed state. @@ -529,7 +549,8 @@ async def describe(self) -> stream.StreamState: A reader that wants only what comes next starts from the head this reports rather than from zero. """ - response = await self._stub.DescribeWorkflowStream( + response = await _call( + self._stub.DescribeWorkflowStream, stream.DescribeWorkflowStreamRequest( frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, @@ -537,7 +558,7 @@ async def describe(self) -> stream.StreamState: owner_run_id=self._owner_run_id, stream_name=self._name, ) - ) + ), ) return response.frontend_response.state @@ -551,6 +572,16 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: ) +def _page(out: stream.PollMessagesOutput) -> Page: + return Page( + entries=[_to_public(record) for record in out.records], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + run_id=out.run_id, + ) + + # One channel per loop, target and namespace, shared by every handle in the # process. A channel is multiplexed and long lived, and callers open a handle # per subscription, which would otherwise be a connection per subscription. The diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index 690402974..95eb48d7e 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -7,10 +7,16 @@ still subscribes by topic from an offset. What changes is underneath. A publish is a Workflow Command whose payload never -enters History, so History gets one fixed-size event per batch rather than a -Signal per batch. A consumer reads the log directly rather than long-polling an -Update, so there is no per-Workflow limit on how many can read at once, and a -closed Workflow stays readable until its stream's retention expires. +enters History, so History gets one fixed-size event per Workflow Task rather +than a Signal per batch. A consumer reads the log directly rather than +long-polling an Update, so there is no per-Workflow limit on how many can read +at once, and a closed Workflow stays readable until its stream's retention +expires. + +As in the shipped feature, a topic here is a label on a record in the +Workflow's one default stream, which a consumer filters on. The provider in +:mod:`temporalio.streams.providers.native` keeps one stream per topic instead; +the two do not share a log. Prototype support for AI-198. It needs a server built from that branch, and it opens its own gRPC channel because sdk-core does not know the stream service @@ -27,10 +33,11 @@ from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow -from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client import Client, WorkflowExecutionDescription from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client -from temporalio.converter import PayloadConverter +from temporalio.common import RawValue +from temporalio.converter import PayloadCodec, PayloadConverter __all__ = [ "RawPage", @@ -48,12 +55,14 @@ @dataclass class RawPage: - """One read whose items are still encoded. + """One read whose items are still the stored records. ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + The bodies are as the server holds them, codec included, for a caller + that forwards records rather than using them. """ - items: list["WorkflowStreamItem[bytes]"] + items: list[WorkflowStreamItem[StreamRecord]] next_offset: int head_offset: int closed: bool @@ -72,49 +81,24 @@ class WorkflowStreamItem(Generic[T]): offset: int = 0 -def _encode(converter: PayloadConverter, value: Any) -> bytes: - """Serialize one value to a stream message body. - - The payload rather than the bare bytes, so the encoding metadata the - consumer needs to decode into a type travels with it. - - The codec chain is not applied here. Inside a Workflow it does not have to - be: the Worker runs the payload visitor with its codec over the commands - and activations, so a body that rides ``add_stream_messages`` is encoded - on the way out and one that arrives on ``deliver_stream_messages`` is - decoded on the way in, as every other payload is. The client path has no - such pass, and encoding one side but not the other is worse than encoding - neither: an Activity's messages would reach a consuming Workflow as - ciphertext it has no way to decode. :func:`_reject_configured_codec` - refuses a client with a codec until the client path applies one too. - """ - payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] - return payload.SerializeToString() - - -def _reject_configured_codec(client: Client) -> None: - """Refuse a namespace whose payloads are meant to be encoded. +def _record(converter: PayloadConverter, topic: str, value: Any) -> StreamRecord: + """The record one published value becomes. - Stream bodies bypass the codec chain, so proceeding would write payloads - this namespace expects to be encrypted in the clear, and would do it - silently. Raising is the only honest answer until the Worker-side plumbing - exists. + The body is the value's payload, so the encoding metadata the consumer + needs to decode into a type travels with it and a + :class:`temporalio.common.RawValue` passes through pre-encoded. """ - if client.data_converter.payload_codec is not None: - raise RuntimeError( - "this client has a payload codec configured, and server-side stream " - "bodies do not pass through it. Publishing would store them " - "unencoded. Use a client without a codec, or wait for codec support " - "on streams." - ) + record = StreamRecord(topic=topic, kind=StreamRecordKind.STREAM_RECORD_KIND_DATA) + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record -def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) +def _decode( + converter: PayloadConverter, record: StreamRecord, as_type: type | None +) -> Any: if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] + return converter.from_payloads([record.body])[0] + return converter.from_payloads([record.body], [as_type])[0] class WorkflowTopicHandle(Generic[T]): @@ -135,15 +119,17 @@ def type(self) -> type[T]: """The value type this handle is bound to.""" return self._type - def publish(self, value: T | Payload) -> None: + def publish(self, value: T | RawValue) -> None: """Append ``value`` to the Workflow's stream on this topic. - Returns as soon as the Command is issued. There is nothing to await: - the append is applied in the Workflow Task's own commit, so it costs - this Workflow no round trip and no extra transition. + Returns at once. There is nothing to await: the Workflow Task's + publishes become one command the server applies in the task's own + commit, so it costs this Workflow no round trip and no extra + transition. The Worker's payload codec applies to the body as it does + to any other payload the Workflow sends. """ - workflow.add_stream_messages( - [_encode(workflow.payload_converter(), value)], topic=self._name + workflow.append_stream_records( + [_record(workflow.payload_converter(), self._name, value)] ) @@ -178,7 +164,7 @@ class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" def __init__( - self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + self, client: WorkflowStreamClient, topic: str, value_type: type[T] ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client @@ -195,7 +181,7 @@ def type(self) -> type[T]: """The value type this handle is bound to.""" return self._type - def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + def publish(self, value: T | RawValue, *, force_flush: bool = False) -> None: """Buffer ``value`` for the next flush. Buffered rather than sent, because an append costs one transition on @@ -232,15 +218,20 @@ def __init__( converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, *, + codec: PayloadCodec | None = None, describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: """Prefer :meth:`create` or :meth:`from_within_activity`. + ``codec`` is applied to every body this client sends and receives, so + a namespace whose payloads are encoded agrees with the Worker, whose + payload visitor applies the same codec to the Workflow's publishes. ``describe`` is how an unpinned handle learns which run it follows; see :meth:`WorkflowStreamHandle.pin`. """ self._handle = handle self._converter = converter + self._codec = codec self._batch_interval = batch_interval self._describe = describe self._buffered: list[tuple[str, Any]] = [] @@ -256,7 +247,7 @@ def create( *, owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, - ) -> "WorkflowStreamClient": + ) -> WorkflowStreamClient: """Open the stream owned by ``workflow_id``. Without ``owner_run_id`` the current run is looked up on the first @@ -264,20 +255,20 @@ def create( continue-as-new sees the run end rather than being moved to the successor's stream at a stale offset. """ - _reject_configured_codec(client) return cls( _stream_client(client).workflow_stream( workflow_id, owner_run_id=owner_run_id ), client.data_converter.payload_converter, batch_interval, + codec=client.data_converter.payload_codec, describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL - ) -> "WorkflowStreamClient": + ) -> WorkflowStreamClient: """Open the stream owned by the Workflow that scheduled this Activity.""" info = activity.info() if info.workflow_id is None: @@ -294,7 +285,7 @@ def from_within_activity( batch_interval=batch_interval, ) - async def __aenter__(self) -> "WorkflowStreamClient": + async def __aenter__(self) -> WorkflowStreamClient: """Start the background flusher.""" self._flusher = asyncio.create_task(self._run_flusher()) return self @@ -352,13 +343,12 @@ async def subscribe( """ del poll_cooldown await self._pin() - async for message in self._handle.follow( - from_offset=from_offset, topics=topics - ): + async for entry in self._handle.follow(from_offset=from_offset, topics=topics): + record = await self._decoded(entry.record) yield WorkflowStreamItem( - topic=message.topic, - data=_decode(self._converter, message.data, result_type), - offset=message.offset, + topic=record.topic, + data=_decode(self._converter, record, result_type), + offset=entry.offset, ) async def poll_raw( @@ -367,8 +357,8 @@ async def poll_raw( topics: Sequence[str] = (), from_offset: int = 0, wait: bool = True, - ) -> "RawPage": - """One read, with the bodies left as they were stored. + ) -> RawPage: + """One read, with the records left as they were stored. For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. @@ -379,8 +369,10 @@ async def poll_raw( ) return RawPage( items=[ - WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) - for m in page.messages + WorkflowStreamItem( + topic=entry.record.topic, data=entry.record, offset=entry.offset + ) + for entry in page.entries ], next_offset=page.next_offset, head_offset=page.head_offset, @@ -393,13 +385,11 @@ async def flush(self) -> None: if not pending: return await self._pin() - # One append per topic, because a batch carries a single topic. The - # harness case is one topic, so this is one append. - by_topic: dict[str, list[bytes]] = {} - for topic, value in pending: - by_topic.setdefault(topic, []).append(_encode(self._converter, value)) - for topic, bodies in by_topic.items(): - await self._handle.append(*bodies, topic=topic) + records = [ + await self._encoded(_record(self._converter, topic, value)) + for topic, value in pending + ] + await self._handle.append(*records) def _buffer(self, topic: str, value: Any) -> None: self._buffered.append((topic, value)) @@ -419,6 +409,16 @@ async def _run_flusher(self) -> None: self._wake.clear() await self.flush() + async def _encoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.encode([record.body]))[0]) + return record + + async def _decoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.decode([record.body]))[0]) + return record + def _stream_client(client: Client) -> StreamClient: return shared_client(client.service_client.config.target_host, client.namespace) diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 9b339dfe4..540f7f7d7 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -4,7 +4,7 @@ application does not have to know which of them wrote a given item. Needs a Temporal server built from the AI-198 branch: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/contrib/test_server_streams.py """ from __future__ import annotations @@ -154,3 +154,8 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: ) ] assert resumed == [item.data.text for item in first[2:]] + + # The raw page carries the stored records themselves. + raw = await stream.poll_raw(topics=[TOPIC], from_offset=0, wait=False) + assert [item.data.topic for item in raw.items] == [TOPIC] * 5 + assert raw.closed and raw.next_offset == raw.head_offset == 5 diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index fde925cca..e3f16f38e 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -3,7 +3,7 @@ These need a Temporal server built from the AI-198 branch, because the stream service does not exist on a released server. Point them at one: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/test_client_stream.py Skipped otherwise, rather than silently passing against a server that has no idea what a stream is. @@ -18,7 +18,11 @@ import pytest +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client_stream import StreamClient, StreamHandle +from temporalio.service import RPCError +from temporalio.streams import StreamNotFoundError TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -28,68 +32,113 @@ ) +def rec(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +def data(entries: list) -> list[bytes]: + return [entry.record.body.data for entry in entries] + + @pytest.fixture -async def stream() -> AsyncIterator[StreamHandle]: +async def streams() -> AsyncIterator[StreamClient]: client = StreamClient.connect( TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") ) try: - yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + yield client finally: await client.close() +@pytest.fixture +async def stream(streams: StreamClient) -> StreamHandle: + return await streams.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + + async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - first = await stream.append(b"alpha", b"beta") + first = await stream.append(rec(b"alpha"), rec(b"beta")) assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) assert not first.deduplicated - assert (await stream.append(b"gamma")).first_offset == 2 + assert (await stream.append(rec(b"gamma"))).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: - await stream.append(b"alpha", b"beta", b"gamma") + await stream.append(rec(b"alpha"), rec(b"beta"), rec(b"gamma")) - messages, next_offset = await stream.read() - assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + entries, next_offset = await stream.read() + assert data(entries) == [b"alpha", b"beta", b"gamma"] + assert [entry.offset for entry in entries] == [0, 1, 2] assert next_offset == 3 - messages, next_offset = await stream.read(from_offset=1) - assert [m.data for m in messages] == [b"beta", b"gamma"] + entries, next_offset = await stream.read(from_offset=1) + assert data(entries) == [b"beta", b"gamma"] assert next_offset == 3 async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: - await stream.append(b"alpha") + await stream.append(rec(b"alpha")) - messages, next_offset = await stream.read(from_offset=1) - assert messages == [] + entries, next_offset = await stream.read(from_offset=1) + assert entries == [] assert next_offset == 1, "a caught-up reader keeps its cursor" # Without an identity the append is at-least-once, so this is the only way a -# producer that retries can avoid writing the same message twice. +# producer that retries can avoid writing the same record twice. async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: - first = await stream.append(b"once", producer_id="p1", sequence=1) - retry = await stream.append(b"once", producer_id="p1", sequence=1) + first = await stream.append(rec(b"once"), producer_id="p1", sequence=1) + retry = await stream.append(rec(b"once"), producer_id="p1", sequence=1) assert first.first_offset == retry.first_offset == 0 assert not first.deduplicated - # The retry is told it wrote nothing, so a producer can report no position. + # The retry is told it wrote nothing and where the original landed. assert retry.deduplicated + assert retry.next_offset == first.next_offset - messages, _ = await stream.read() - assert [m.data for m in messages] == [b"once"] + entries, _ = await stream.read() + assert data(entries) == [b"once"] async def test_topics_filter_a_read(stream: StreamHandle) -> None: - await stream.append(b"tok", topic="tokens") - await stream.append(b"prog", topic="progress") - await stream.append(b"tok2", topic="tokens") + await stream.append(rec(b"tok", topic="tokens")) + await stream.append(rec(b"prog", topic="progress")) + await stream.append(rec(b"tok2", topic="tokens")) - messages, next_offset = await stream.read(topics=["tokens"]) - assert [m.data for m in messages] == [b"tok", b"tok2"] + entries, next_offset = await stream.read(topics=["tokens"]) + assert data(entries) == [b"tok", b"tok2"] + assert [entry.offset for entry in entries] == [0, 2] assert next_offset == 3, "the cursor advances past filtered-out offsets too" +# The record comes back as it went in: kind, producer identity and sequence +# are the server's to store, not to interpret. +async def test_the_record_roundtrips_field_for_field(stream: StreamHandle) -> None: + sent = rec(b"x", topic="t") + sent.producer_id = "model" + sent.attempt = 2 + sent.sequence = 7 + sent.metadata["trace"].CopyFrom(Payload(data=b"abc")) + finish = StreamRecord( + topic="t", kind=StreamRecordKind.STREAM_RECORD_KIND_FINISH, producer_id="model" + ) + await stream.append(sent, finish) + + entries, _ = await stream.read() + got = entries[0].record + assert (got.topic, got.producer_id, got.attempt, got.sequence) == ( + "t", + "model", + 2, + 7, + ) + assert got.kind == StreamRecordKind.STREAM_RECORD_KIND_DATA + assert got.metadata["trace"].data == b"abc" + assert entries[1].record.kind == StreamRecordKind.STREAM_RECORD_KIND_FINISH + assert not entries[1].record.HasField("body") + + # A closed stream stays readable, which is what removes the shutdown handshake # between producer and consumer. async def test_follow_drains_then_ends_when_the_stream_closes( @@ -98,13 +147,13 @@ async def test_follow_drains_then_ends_when_the_stream_closes( received: list[bytes] = [] async def follower() -> None: - async for message in stream.follow(): - received.append(message.data) + async for entry in stream.follow(): + received.append(entry.record.body.data) task = asyncio.create_task(follower()) - await stream.append(b"one") + await stream.append(rec(b"one")) await asyncio.sleep(0.2) - await stream.append(b"two") + await stream.append(rec(b"two")) await asyncio.sleep(0.2) await stream.close() @@ -115,15 +164,15 @@ async def follower() -> None: async def test_follow_started_late_still_sees_everything( stream: StreamHandle, ) -> None: - await stream.append(b"one", b"two") + await stream.append(rec(b"one"), rec(b"two")) await stream.close() - received = [m.data async for m in stream.follow()] + received = [entry.record.body.data async for entry in stream.follow()] assert received == [b"one", b"two"] async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: - await stream.append(b"one", b"two") + await stream.append(rec(b"one"), rec(b"two")) state = await stream.describe() assert state.head_offset == 2 @@ -131,3 +180,13 @@ async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: await stream.close() assert (await stream.describe()).closed + + +# The transport's own exception never escapes: a missing stream is the SDK's +# not-found error and anything else is its RPC error. +async def test_failures_surface_as_sdk_errors(streams: StreamClient) -> None: + missing = streams.get("py-test-missing-" + uuid.uuid4().hex[:8]) + with pytest.raises(StreamNotFoundError): + await missing.describe() + with pytest.raises((StreamNotFoundError, RPCError)): + await missing.append(rec(b"x")) From 94349b69f61d9e9c3a2d467738f5bf60829c9a84 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 428/831] Rewrote the native provider with one owned stream per topic. The workflow subscribes to the topic by name and publishes with the batched command; outside code appends and long-polls the same stream, following the run chain by cursor unless pinned. --- CHANGELOG.md | 14 +- temporalio/streams/providers/native.py | 698 +++++++++++----------- tests/streams/test_streams_conformance.py | 48 +- tests/worker/test_workflow_stream_e2e.py | 420 ++++++++----- 4 files changed, 693 insertions(+), 487 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a20af4f5..702bed038 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,13 +31,15 @@ to include examples, links to docs, or any other relevant information. `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. -- **Experimental**: server-side streams. A workflow reads a stream the server - delivers on its Workflow Tasks and publishes with a command, through - `temporalio.workflow.read_stream`, `subscribe_stream` and - `add_stream_messages`. `temporalio.client_stream` and +- **Experimental**: server-side streams. A workflow publishes to a stream it + owns with a command the server applies in its Workflow Task's commit, and + reads the ranges the server delivers on its Workflow Tasks, through + `temporalio.workflow.append_stream_records`, `subscribe_stream` and + `read_stream_records`. `temporalio.client_stream` and `temporalio.contrib.server_streams` reach the same stream from outside a - workflow, and `temporalio.streams.providers.native` puts it behind the shared - stream interface. Requires a server that serves the stream service. + workflow, and `temporalio.streams.providers.native.NativeStreams` puts it + behind the shared stream interface with one owned stream per topic. Requires + a server that serves the stream service. ### Changed diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 6dfdd4c25..ff0621031 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -1,176 +1,195 @@ """The server-side (native) provider. -Streams live on the Temporal server. A workflow publishes with a command that -the server applies in the same transaction that accepts the workflow task, and -consumes ranges the server attaches to the workflow task it dispatches. +Streams live on the Temporal server, beside the workflow that owns them. A +topic is one owned stream named after the topic, created by whoever touches it +first: the workflow publishes to it with a command the server applies in the +transaction that accepts the Workflow Task, subscribes to it by name and reads +the ranges the server delivers on its Workflow Tasks; outside code appends and +reads through the stream service, and the workflow's records and an outside +producer's land in one log in the order the server accepted them. + +A cursor names the run as well as the offset, because an owned stream belongs +to one run and a successor's starts over at zero. A handle without a run id +reads run after run, learning from the poll that a run's stream is closed and +from the run's close event who came next; with a run id it is pinned. + +Prototype support for AI-198. It needs a server built from that branch and +opens its own gRPC channel to it, because sdk-core does not know the stream +service yet, which is also why it does not support TLS or API keys. """ from __future__ import annotations -import asyncio import logging from collections.abc import AsyncGenerator -from datetime import timedelta from typing import Any -import grpc - from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, close_shared_clients, shared_client -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._ids import inbound_stream_id -from temporalio.streams._policy import AttemptTracker +from temporalio.client import Client, WorkflowHistoryEventFilterType +from temporalio.client_stream import ( + StreamClient, + WorkflowStreamHandle, + close_shared_clients, + shared_client, +) +from temporalio.converter import PayloadCodec, PayloadConverter +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["NativeProducer", "NativeStreamHandle", "NativeStreams"] -_RUN_STATE = "__temporal_streams_state" +_PROVIDER = "native" logger = logging.getLogger(__name__) -class _Fanout: - """One server subscription, shared by every reader of that stream. +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") - The server sends a range once. Whoever reads it first would otherwise take - it from the others, so the pull happens here and the result goes to all - live readers. - """ - def __init__(self, stream: str) -> None: - self._stream = stream - self._subscribers: list[list[tuple[Cursor, bytes]]] = [] - self._pull: asyncio.Future[None] | None = None - - def attach(self) -> list[tuple[Cursor, bytes]]: - queue: list[tuple[Cursor, bytes]] = [] - self._subscribers.append(queue) - return queue - - def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: - if queue in self._subscribers: - self._subscribers.remove(queue) - - async def next_batch( - self, queue: list[tuple[Cursor, bytes]] - ) -> list[tuple[Cursor, bytes]]: - while not queue: - pending = self._pull - if pending is None: - pending = self._pull = asyncio.ensure_future(self._run_pull()) - # Shielded because one reader going away must not cancel a range - # the server will not send again. - await asyncio.shield(pending) - batch, queue[:] = list(queue), [] - return batch - - async def _run_pull(self) -> None: - try: - delivered = await workflow.read_stream_messages(self._stream) - arrived = [ - (Cursor(str(message.offset)), message.body) for message in delivered - ] - for queue in self._subscribers: - queue.extend(arrived) - finally: - self._pull = None +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") -def _fanouts() -> dict[str, _Fanout]: - instance = workflow.instance() - state = getattr(instance, _RUN_STATE, None) - if state is None: - state = {} - setattr(instance, _RUN_STATE, state) - return state +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "native provider" + ) from None -class _NativeReadSource: - def __init__(self, fanout: _Fanout) -> None: - self._fanout = fanout - self._queue = fanout.attach() +async def _encode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + # The worker's payload visitor runs a codec over the bodies a workflow + # publishes and receives; the outside half has no such pass, so it applies + # the client's codec here or the two sides would not agree. + if codec is None or not record.HasField("body"): + return record + encoded = await codec.encode([record.body]) + record.body.CopyFrom(encoded[0]) + return record - async def next_batch(self) -> list[tuple[Cursor, bytes]]: - return await self._fanout.next_batch(self._queue) - def close(self) -> None: - self._fanout.detach(self._queue) - - -class _NativeWriteSink: - def __init__(self, topic: str) -> None: - self._topic = topic +async def _decode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + if codec is None or not record.HasField("body"): + return record + decoded = await codec.decode([record.body]) + record.body.CopyFrom(decoded[0]) + return record - async def publish(self, frame: bytes) -> None: - # Nothing is awaited. The server applies the payload when it accepts - # the task, so there is no back pressure to wait on and no round trip - # to pay for. The signature is awaitable because the contract allows a - # provider that does hold a publisher back. - workflow.add_stream_messages([frame], stream_id="", topic=self._topic) +class _NativeReadSource: + """One subscription of the running workflow, fed by delivered ranges.""" -def _reject_configured_codec(client: Client) -> None: - """Refuse a namespace whose payloads are meant to be encoded. + def __init__(self, stream_id: str, run_id: str) -> None: + self._stream_id = stream_id + self._run_id = run_id + self._closed = False - Stream bodies do not pass through the codec chain on this provider, so - proceeding would store in the clear what the namespace expects encrypted, - and would do it without saying so. - """ - if client.data_converter.payload_codec is not None: - raise RuntimeError( - "this client has a payload codec configured, and server-side stream " - "bodies do not pass through it" - ) + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + if self._closed: + raise StopAsyncIteration + delivered = await workflow.read_stream_records(self._stream_id) + return [(_cursor(self._run_id, item.offset), item.record) for item in delivered] + def close(self) -> None: + self._closed = True -# Streams this process has already opened, so a second producer for the same -# stream reuses the handle rather than asking the server to create it again. -# The second create is answered correctly, and it is still a failed call the -# server logs, which is noise an operator has to learn to ignore. -_handles: dict[tuple[str, str, str], Any] = {} +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic -def _stream_client(client: Client) -> StreamClient: - return shared_client(client.service_client.config.target_host, client.namespace) + def publish(self, record: WireRecord) -> None: + # Held by the runtime until the task completes, when the task's + # records on this topic become one command the server applies with + # the task: rule 1 through the server's own commit. + workflow.append_stream_records([record], stream_id=self._topic) + + +class _NativeWorkflowProvider: + """The workflow half: the server's commands and delivered ranges.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's stream is its own" + ) + start = named[1] + 1 + workflow.subscribe_stream(topic, start_offset=start) + return _NativeReadSource(topic, run_id) + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _NativeWriteSink(topic) -async def _owner_run(client: Client, workflow_id: str) -> str: - """The run whose stream a handle on ``workflow_id`` should address. + def on_workflow_start(self) -> None: + pass - Resolved once, when the handle opens. Left to the server, a follower whose - workflow continued as new would be redirected to the successor, whose - stream starts empty, and its offset read as "caught up" rather than as a - position on the run it was watching. A producer is pinned for the same - reason: an activity's output belongs to the run that scheduled it. - """ - return (await client.get_workflow_handle(workflow_id).describe()).run_id + async def on_workflow_finish(self) -> None: + pass class NativeProducer: - """Appends to a stream from outside workflow code. + """Appends to a topic from outside workflow code. - Every append is visible as soon as it is written. That is the point for an - activity streaming model output, and it is why an activity carries its own - identity: the retry of a failed attempt has no commit boundary to sort it - out afterwards. + Every append is visible as soon as the server accepts it. That is the + point for an activity streaming model output, and it is why an activity + carries its own identity: the retry of a failed attempt has no commit + boundary to sort it out afterwards. """ def __init__( self, - handle: Any, - converter: Any, + handle: WorkflowStreamHandle, + pin: Any, + codec: PayloadCodec | None, + converter: PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle + self._pin = pin + self._codec = codec self._converter = converter self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -178,265 +197,260 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: - """The identity the provider dedupes on. - - The attempt is part of it. Deduplication answers "is this the same - append again", and a second attempt writing different words at the same - sequence is not. Folding the attempt in keeps a retried append idempotent - without letting a new generation be swallowed as a duplicate of the old - one. - """ + def _writer(self) -> str: + # The server dedupes on this and the sequence. The attempt is part of + # it so a retried append is dropped while a new generation writing + # different words at the same sequence is not. return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed, because the server + answers a deduplicated batch with the original offsets; an empty call + returns the position of this producer's last record. + """ if not values: - return None - frames = [] - for value in values: - frames.append( - _frame.encode( + return self._last + return await self._write( + [ + to_wire( + self._converter, topic=self._topic, kind=RecordKind.DATA, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=self._sequence + index, ) - ) - self._sequence += 1 - appended = await self._handle.append( - *frames, - topic=self._topic, - producer_id=self._provider_id, - # The provider dedupes a retried append on this pair, which is a - # different job from telling readers that a new generation started. - sequence=self._sequence - len(frames), + for index, value in enumerate(values) + ] ) - if appended.deduplicated: - return None - return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: - """Declare this stream complete.""" - frame = _frame.encode( - topic=self._topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._handle.append( - frame, - topic=self._topic, - producer_id=self._provider_id, - sequence=self._sequence - 1, + """Write ``FINISH`` for this producer on this topic.""" + await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] ) - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + async def _write(self, records: list[WireRecord]) -> Cursor: + # Pinned before the first write, so every cursor this producer hands + # out names the run its records landed in. + if not self._handle.owner_run_id: + self._handle.pin(await self._pin()) + for record in records: + await _encode_body(self._codec, record) + appended = await self._handle.append( + *records, producer_id=self._writer, sequence=self._sequence ) - return payload.SerializeToString() - - -class NativeConsumer: - """Reads a stream from outside workflow code, resumably.""" - - def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: - """Read the stream ``handle`` names, from anywhere. + self._sequence += len(records) + self._last = _cursor(self._handle.owner_run_id, appended.next_offset - 1) + return self._last + + +class NativeStreamHandle: + """One workflow's topics from outside, over the stream service.""" + + def __init__(self, client: Client, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s topics, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = client.data_converter.payload_converter + self._codec = client.data_converter.payload_codec + self._streams: StreamClient | None = None + + def _service(self) -> StreamClient: + # Resolved on first use, because the shared channel belongs to the + # running loop and a handle may be made before there is one. + if self._streams is None: + self._streams = shared_client( + self._client.service_client.config.target_host, + self._client.namespace, + ) + return self._streams - ``stream`` is the inbound name the caller used, empty for the owner's - stream; ``address`` is what the server calls it, for log lines. - """ - self._handle = handle - self._converter = converter - self._stream = stream - self._address = address + def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: + return self._service().workflow_stream( + self._workflow_id, topic, owner_run_id=run_id + ) - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield the records after ``after`` as they arrive. + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) - Applies the same supersession rule as a workflow reader, so a browser - and a workflow watching one activity agree on which attempt is current. + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + stream = self._stream(topic, run_id) + while True: + page = await stream.poll(from_offset=offset) + for entry in page.entries: + record = await _decode_body(self._codec, entry.record) + for out in decoder.decode(_cursor(run_id, entry.offset), record): + yield out + offset = page.next_offset + # On a pinned stream the server reports the run's end as closed, + # and a closed stream is finished once its head is delivered. + if page.closed and offset >= page.head_offset: + break + if self._run_id is not None: + return + successor = await self._successor(run_id) + if successor is None: + return + run_id, offset = successor, 0 + + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest record on ``topic``, naming the run it was read from. + + An empty topic on the chain's first run is the beginning of the + stream; on a successor it is a position of its own, because + ``BEGINNING`` would send a chain-following read back to the first run. """ - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - async for message in self._handle.follow( - from_offset=int(after.token) + 1 if after.token else 0 - ): - cursor = Cursor(str(message.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - message.data - ) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning( - "skipping record %s of stream %s: %s", cursor, self._address, error - ) - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + _require_topic(topic) + run_id = self._run_id or await self._current_run() + try: + head = (await self._stream(topic, run_id).describe()).head_offset + except StreamNotFoundError: + # A topic nobody has written yet does not exist on the server, + # which is the same answer as an empty one. + head = 0 + if head > 0: + return _cursor(run_id, head - 1) + if self._run_id is None and await self._predecessor(run_id) is not None: + return _cursor(run_id, -1) + return BEGINNING + + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> NativeProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return NativeProducer( + self._stream(topic, self._run_id or ""), + self._current_run, + self._codec, + self._converter, + topic, + producer_id, + attempt, + ) - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one server-side log per stream, whatever the topic + async def _current_run(self) -> str: + try: + description = await self._client.get_workflow_handle( + self._workflow_id + ).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert description.run_id is not None + return description.run_id + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + run_id = await self._current_run() + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) try: - state = await self._handle.describe() - except grpc.aio.AioRpcError as error: - # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. Any other failure is not: - # a reader that took it for "empty" would replay the whole stream. - if error.code() is not grpc.StatusCode.NOT_FOUND: + async for event in handle.fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: raise - return BEGINNING - return ( - Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING - ) + # The run's History is gone: the chain's retained part starts here. + return None - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + async def _successor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + try: + async for event in events: + if event.HasField( + "workflow_execution_continued_as_new_event_attributes" + ): + attributes = ( + event.workflow_execution_continued_as_new_event_attributes + ) + return attributes.new_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + return None -class _NativeProvider: - name = "native" +class NativeStreams(ProviderPlugin): + """The server-side provider. - def configure(self, **options: Any) -> None: - """Take no options. + Takes no options: the streams are on the server the client is already + connected to. Construct one, pass it to the worker as a plugin and open + handles from it anywhere else; :meth:`close` releases the channels this + process opened to the stream service. + """ - The streams are on the server the client is already connected to. - This exists so a process that switches providers changes one call - rather than its structure. - """ - if options: - raise TypeError( - f"the native provider takes no options, got {sorted(options)}" - ) + def workflow_provider(self) -> _NativeWorkflowProvider: + """The workflow half, over the server's commands and delivered ranges.""" + return _NativeWorkflowProvider() - def worker_options(self) -> dict[str, Any]: - return {} + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> NativeStreamHandle: + """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain.""" + return NativeStreamHandle(client, workflow_id, run_id) async def close(self) -> None: """Close the channels this process opened to the stream service.""" await close_shared_clients() - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Accepted and ignored. Delivery arrives on workflow tasks the server - # dispatches, so no worker is held between records and there is nothing - # for an idle timeout to release. - del idle_timeout - stream_id = inbound_stream_id(workflow.info().workflow_id, stream) - fanouts = _fanouts() - fanout = fanouts.get(stream_id) - if fanout is None: - workflow.subscribe_stream( - stream_id, start_offset=int(after.token) + 1 if after.token else 0 - ) - fanout = fanouts[stream_id] = _Fanout(stream_id) - return _NativeReadSource(fanout) - - def open_write(self, topic: str) -> WriteSink: - return _NativeWriteSink(topic) - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> NativeProducer: - """Open a producer on ``workflow_id``'s account. - - ``stream`` names an inbound stream, a namespace-level stream the - server keys by the pair. With none, ``topic`` names a topic on the - stream the workflow publishes, which the server lets any producer - append to. An inbound record carries no topic: the stream's name is - its whole address. - """ - _reject_configured_codec(client) - streams = _stream_client(client) - converter = client.data_converter.payload_converter - if not stream: - handle: Any = streams.workflow_stream( - workflow_id, owner_run_id=await _owner_run(client, workflow_id) - ) - return NativeProducer(handle, converter, topic, producer_id, attempt) - stream_id = inbound_stream_id(workflow_id, stream) - key = (client.service_client.config.target_host, client.namespace, stream_id) - handle = _handles.get(key) - if handle is None: - try: - handle = await streams.create(stream_id) - except Exception: - # Created by whoever set the stream up. A producer opening a - # stream it does not own is the ordinary case, not the - # exception. - handle = streams.get(stream_id) - _handles[key] = handle - return NativeProducer(handle, converter, topic, producer_id, attempt) - - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> NativeConsumer: - """Open a reader for what ``workflow_id`` publishes. - - An empty ``stream`` reads what the workflow wrote through - :func:`temporalio.streams.writer`. Naming one reads that inbound - stream instead, which is how a second consumer follows the same input. - """ - _reject_configured_codec(client) - streams = _stream_client(client) - address = inbound_stream_id(workflow_id, stream) - if stream: - handle: Any = streams.get(address) - else: - handle = streams.workflow_stream( - workflow_id, owner_run_id=await _owner_run(client, workflow_id) - ) - return NativeConsumer( - handle, client.data_converter.payload_converter, stream, address - ) - - -_provider.register("native", _NativeProvider) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 020250973..3dff5b31e 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,6 +21,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass @@ -28,8 +29,9 @@ import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -45,6 +47,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.native import NativeStreams +from tests.helpers import new_worker @dataclass @@ -82,9 +86,51 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: + # The store is a server built from the stream-carrying branch, which the + # test environment's own server is not; TEMPORAL_ADDRESS names it. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = NativeStreams() + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase("native", provider, client, host=host) + for handle in hosts.values(): + await handle.terminate() + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { "memory": _memory_case } +if os.environ.get("STREAMS_LIVE") == "native": + SETUPS["native"] = _native_case _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 31296b2c8..a41b2a495 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -1,10 +1,12 @@ -"""A workflow publishing to a stream it owns and reading its own messages back. +"""The native provider inside a real workflow, against a server that has streams. -Path A and Path C together, both from workflow code. Needs a Temporal server -built from the AI-198 branch, because neither the stream service nor the -commands exist on a released one: +The two rules the memory provider cannot keep are the measurement here: a +publish commits with its Workflow Task and never lands if the task fails, and +a read is a recorded observation the server re-supplies on replay. Needs a +Temporal server built from the AI-198 branch, because neither the stream +service nor the commands exist on a released one: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/worker/test_workflow_stream_e2e.py Skipped otherwise, rather than passing against a server that has no idea what a stream is. @@ -15,13 +17,20 @@ import asyncio import os import uuid +from typing import Any import pytest from temporalio import workflow +from temporalio.api.common.v1 import Payload from temporalio.api.enums.v1 import EventType +from temporalio.api.stream.v1 import StreamRecord from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import RecordKind +from temporalio.streams.providers.native import NativeStreams from temporalio.worker import Worker +from tests.streams.test_streams_conformance import take TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -30,36 +39,264 @@ reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", ) -STREAM = "output" +INPUTS = "inputs" +DECISIONS = "decisions" EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED -EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED +EVENT_STREAM_RECORDS_APPENDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED + + +async def _connect() -> Client: + return await Client.connect(TARGET or "") + + +async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: + counts = { + EVENT_STREAM_RECORDS_APPENDED: 0, + EVENT_STREAM_SUBSCRIBED: 0, + EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: 0, + } + async for event in client.get_workflow_handle(workflow_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + return counts + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "replaced": record.supersession.previous_attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) + trace.append({"kind": "decision", "n": record.value["n"]}) + decisions.finish() + return trace + + +async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None: + """Rule 2 on the native provider: every task replays from the server. + + With the cache off, each Workflow Task rebuilds the workflow from History + and the server re-supplies the ranges earlier tasks consumed, so the loop + completing at all means the same records came back in the same order. + """ + client = await _connect() + provider = NativeStreams() + task_queue = "loop-tq-" + uuid.uuid4().hex[:8] + workflow_id = "loop-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + plugins=[provider], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"n": 1}, {"n": 2}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"n": 3}) + await second.finish() + trace = await asyncio.wait_for(handle.result(), 60) + + assert trace == [ + {"kind": "decision", "n": 1}, + {"kind": "decision", "n": 2}, + {"kind": "superseded", "replaced": 1}, + {"kind": "decision", "n": 3}, + {"kind": "finish", "producer": "model"}, + ] + + # The read ends by itself: the workflow is closed and the tail + # delivered, with the workflow's own records carrying no producer. + async def read_everything() -> list[Any]: + return [ + (r.producer_id, r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + assert await asyncio.wait_for(read_everything(), 60) == [ + ("", RecordKind.DATA, {"decided": 1}), + ("", RecordKind.DATA, {"decided": 2}), + ("", RecordKind.DATA, {"retracting_attempt": 1}), + ("", RecordKind.DATA, {"decided": 3}), + ("", RecordKind.FINISH, None), + ] + counts = await _event_counts(client, workflow_id) + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + # Several tasks published, one event each; the loop spanned more than + # one task or the cold cache proved nothing. + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 2 + assert ( + 1 + <= counts[EVENT_STREAM_RECORDS_APPENDED] + <= counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] + ) + finally: + await provider.close() + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + decisions.finish() + + +async def test_a_failed_task_publishes_nothing() -> None: + """Rule 1 on the native provider: the server applies the command with the task.""" + client = await _connect() + provider = NativeStreams() + task_queue = "fail-tq-" + uuid.uuid4().hex[:8] + workflow_id = "fail-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishThenFail], + plugins=[provider], + ): + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + records = await take( + stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60 + ) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] + finally: + await provider.close() + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new() -> None: + client = await _connect() + provider = NativeStreams() + task_queue = "relay-tq-" + uuid.uuid4().hex[:8] + workflow_id = "relay-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, task_queue=task_queue, workflows=[Relay], plugins=[provider] + ): + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 60) + await handle.result() + # The chain is followed: the successor's record arrives on the same + # read, each cursor names its run, and the read ends with the chain. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + # Pinned to the last run, a handle sees that run's stream alone. + last_run = (await client.get_workflow_handle(workflow_id).describe()).run_id + pinned = provider.get_stream_handle(client, workflow_id, run_id=last_run) + only_last = [ + r.value async for r in pinned.read(topic=DECISIONS, result_type=dict) + ] + assert only_last == [{"run": 1}, None] + finally: + await provider.close() @workflow.defn class PublishAndRead: + """Publishes through the low-level surface and reads its own records back.""" + @workflow.run async def run(self) -> list[str]: - # Published before subscribing, because a subscription resolves against - # the streams the workflow already owns and this is what creates one. - workflow.add_stream_messages( - [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + workflow.append_stream_records( + [_record(b"alpha", "progress"), _record(b"beta", "progress")], + stream_id="output", ) - workflow.add_stream_messages([b"delta"], stream_id=STREAM) - - workflow.subscribe_stream(STREAM, start_offset=0) + workflow.append_stream_records([_record(b"gamma")], stream_id="output") + # A name this workflow has not written yet still names a stream it + # owns, so subscribing creates the one the later publish lands in. + workflow.subscribe_stream("output", start_offset=0) received: list[str] = [] - while len(received) < 4: - for body in await workflow.read_stream(STREAM): - received.append(body.decode()) + while len(received) < 3: + for item in await workflow.read_stream_records("output"): + received.append(item.record.body.data.decode()) return received -async def test_workflow_reads_back_what_it_published() -> None: - client = await Client.connect(TARGET or "") +def _record(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +async def test_a_tasks_publishes_become_one_event() -> None: + client = await _connect() task_queue = "publish-tq-" + uuid.uuid4().hex[:8] - wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + workflow_id = "publish-wf-" + uuid.uuid4().hex[:8] async with Worker( client, @@ -71,111 +308,26 @@ async def test_workflow_reads_back_what_it_published() -> None: ): result = await asyncio.wait_for( client.execute_workflow( - PublishAndRead.run, id=wf_id, task_queue=task_queue + PublishAndRead.run, id=workflow_id, task_queue=task_queue ), timeout=60, ) + assert result == ["alpha", "beta", "gamma"] - assert result == ["alpha", "beta", "gamma", "delta"] - - counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} - async for event in client.get_workflow_handle(wf_id).fetch_history_events(): - if event.event_type in counts: - counts[event.event_type] += 1 - - # Two calls carrying four messages, so two events: the event is per batch, - # which is what makes batching free. - assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + counts = await _event_counts(client, workflow_id) + # Two calls in one task carrying three records, so one event: the event is + # per task and stream, which is what makes publishing often free. + assert counts[EVENT_STREAM_RECORDS_APPENDED] == 1 assert counts[EVENT_STREAM_SUBSCRIBED] == 1 -@workflow.defn -class PublishOnSignal: - """Publishes a token per signal, which is the shape an agent turn has.""" - - def __init__(self) -> None: - self._pending: list[str] = [] - self._done = False - - @workflow.run - async def run(self) -> int: - published = 0 - while True: - await workflow.wait_condition(lambda: bool(self._pending) or self._done) - while self._pending: - workflow.add_stream_messages([self._pending.pop(0).encode()]) - published += 1 - if self._done: - return published - - @workflow.signal - async def emit(self, token: str) -> None: - self._pending.append(token) - - @workflow.signal - async def finish(self) -> None: - self._done = True - - -async def test_a_client_follows_what_a_workflow_publishes() -> None: - """The harness shape: the workflow writes, something outside it reads live. - - A stream a workflow owns has no id, so the reader addresses it by the - owner. It also attaches before the first publish, which is what a UI opening - on a session does. - """ - from temporalio.client_stream import StreamClient - - client = await Client.connect(TARGET or "") - streams = StreamClient.connect(TARGET or "") - task_queue = "follow-tq-" + uuid.uuid4().hex[:8] - wf_id = "follow-wf-" + uuid.uuid4().hex[:8] - - tokens = [f"token-{i}" for i in range(5)] - received: list[str] = [] - - try: - async with Worker( - client, - task_queue=task_queue, - workflows=[PublishOnSignal], - max_cached_workflows=0, - ): - handle = await client.start_workflow( - PublishOnSignal.run, id=wf_id, task_queue=task_queue - ) - - # Attached before anything is published, so the stream does not - # exist yet and the first poll has to park rather than fail. - reader = streams.workflow_stream(wf_id) - assert (await reader.describe()).head_offset == 0 - - async def follow() -> None: - async for message in reader.follow(): - received.append(message.data.decode()) - if len(received) == len(tokens): - return - - following = asyncio.ensure_future(follow()) - for token in tokens: - await handle.signal(PublishOnSignal.emit, token) - await asyncio.wait_for(following, timeout=60) - - await handle.signal(PublishOnSignal.finish) - assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) - finally: - await streams.close() - - assert received == tokens - - @workflow.defn class ConsumeAcrossTasks: - """Reads a stream over several Workflow Tasks, then reports what it saw. + """Reads a standalone stream over several Workflow Tasks, then reports what it saw. - The turn structure is the point: each `read_stream` that finds nothing - blocks, which ends a Workflow Task, so the run spans several. With the - cache on, every task after the first is sticky. + The turn structure is the point: each read that finds nothing blocks, + which ends a Workflow Task, so the run spans several. With the cache on, + every task after the first is sticky. """ @workflow.run @@ -183,25 +335,22 @@ async def run(self, stream_id: str, expected: int) -> list[str]: workflow.subscribe_stream(stream_id, start_offset=0) seen: list[str] = [] while len(seen) < expected: - for body in await workflow.read_stream(stream_id): - seen.append(body.decode()) + for item in await workflow.read_stream_records(stream_id): + seen.append(item.record.body.data.decode()) return seen async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: """The workflow cache stays on, which is what a real worker does. - Every other end-to-end test here disables it, so the sticky path was never - exercised. The server sends no replay slice for a sticky task, while the - sticky history still carries the previous task's consumed range, and the - two together used to fail every task after the first consumed range. + The server sends no replay slice for a sticky task, while the sticky + history still carries the previous task's consumed range, and the two + together have to agree on every task after the first consumed range. """ - from temporalio.client_stream import StreamClient - - client = await Client.connect(TARGET or "") + client = await _connect() streams = StreamClient.connect(TARGET or "") task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] - wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + workflow_id = "sticky-wf-" + uuid.uuid4().hex[:8] stream_id = "sticky-src-" + uuid.uuid4().hex[:8] batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] @@ -210,15 +359,12 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: try: await streams.create(stream_id) async with Worker( - client, - task_queue=task_queue, - workflows=[ConsumeAcrossTasks], - # Left at the default deliberately. This is what the test is for. + client, task_queue=task_queue, workflows=[ConsumeAcrossTasks] ): handle = await client.start_workflow( ConsumeAcrossTasks.run, args=[stream_id, len(expected)], - id=wf_id, + id=workflow_id, task_queue=task_queue, ) @@ -226,18 +372,16 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: # them. Without the gap the appends coalesce into one task and the # sticky path is never taken. for batch in batches: - await streams.get(stream_id).append(*[t.encode() for t in batch]) + await streams.get(stream_id).append( + *[_record(t.encode()) for t in batch] + ) await asyncio.sleep(0.4) assert await asyncio.wait_for(handle.result(), timeout=60) == expected - # More than one Workflow Task ran, otherwise the test proves nothing. - completed = 0 - async for event in client.get_workflow_handle(wf_id).fetch_history_events(): - if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: - completed += 1 - assert completed >= 3, ( - f"only {completed} workflow tasks, sticky path not exercised" + counts = await _event_counts(client, workflow_id) + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 3, ( + "sticky path not exercised" ) finally: await streams.close() From e76a94df2edd613b82acdc3cd1e76b82656a2f99 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:06:16 -0700 Subject: [PATCH 429/831] Ran the conformance suite over Workflow Streams and covered chain reads. The provider registers in SETUPS with a host workflow that owns the stream, and its own tests cover the tail Query, a read that ends, and a handle that follows continue-as-new run by run. --- CHANGELOG.md | 10 +- tests/streams/test_streams_conformance.py | 49 +++- .../streams/test_workflow_streams_provider.py | 239 +++++++++++------- 3 files changed, 205 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c5839a4a..9e0960c5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,10 +31,12 @@ to include examples, links to docs, or any other relevant information. `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. -- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the - stream interface over the shipped Workflow Streams transport, so a workflow - reads and publishes through `temporalio.contrib.workflow_streams` without - naming it. +- **Experimental**: `temporalio.streams.providers.workflow_streams.WorkflowStreamsProvider` + serves the stream interface over the shipped Workflow Streams transport as a + worker plugin, so a workflow reads and publishes through + `temporalio.contrib.workflow_streams` without naming it. Records are the + `StreamRecord` proto inside the shipped item payload, and a handle without a + run id follows continue-as-new run by run. ### Changed diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 020250973..ed3880f01 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -24,12 +24,14 @@ import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass +from datetime import timedelta from typing import Any import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -45,6 +47,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider +from tests.helpers import new_worker @dataclass @@ -82,8 +86,49 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: + # No STREAMS_LIVE gate: the store is the workflow's own History, which the + # test environment's server provides. + provider = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase( + "workflow_streams", + provider, + client, + reports_positions=False, + host=host, + ) + for handle in hosts.values(): + await handle.terminate() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { - "memory": _memory_case + "memory": _memory_case, + "workflow_streams": _workflow_streams_case, } _CAPABILITIES = { diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612e99e02..28f2f631d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -2,8 +2,10 @@ Runs the interface loop over the shipped Option 0 transport: an outside producer appends through the publish Signal, the workflow reads and -republishes through its own state, and an outside consumer follows the poll -Update while the run is open and the tail Query once it has closed. +republishes through its own state, and an outside reader follows the poll +Update while the run is open and the tail Query once it has closed. The +outside-surface cases shared by every provider run from +``test_streams_conformance``; this file covers what the transport adds. """ from __future__ import annotations @@ -11,23 +13,31 @@ import asyncio import base64 import uuid +from datetime import timedelta from typing import Any import pytest -from temporalio import streams, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.contrib.workflow_streams import PublishInput from temporalio.converter import DataConverter -from temporalio.streams import RecordKind, _frame -from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from temporalio.streams import RecordKind, Supersession +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers.workflow_streams import ( + WorkflowStreamsProducer, + WorkflowStreamsProvider, +) from tests.helpers import new_worker +INPUTS = "inputs" +DECISIONS = "decisions" -@pytest.fixture(autouse=True) -def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] - streams.configure(provider="workflow_streams") + +@pytest.fixture +def provider() -> WorkflowStreamsProvider: + return WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) @workflow.defn @@ -40,7 +50,6 @@ class EchoLoop: def __init__(self) -> None: self._released = False - streams.prepare() @workflow.signal def release(self) -> None: @@ -48,21 +57,19 @@ def release(self) -> None: @workflow.run async def run(self) -> int: - inputs = streams.reader("inputs", type=dict) - decisions = streams.writer("decisions") + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) seen = 0 async for record in inputs: if record.kind is RecordKind.FINISH: break if record.kind is not RecordKind.DATA: continue - assert isinstance(record.value, dict) + assert record.value is not None seen += 1 - await decisions.publish({"echo": record.value["n"]}) - await decisions.finish() + decisions.publish({"echo": record.value["n"]}) + decisions.finish() await workflow.wait_condition(lambda: self._released) - streams.drain() - await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -79,10 +86,11 @@ async def _collect() -> None: return out -async def _feed(client: Client, workflow_id: str) -> None: - producer = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 - ) +async def _feed( + provider: WorkflowStreamsProvider, client: Client, workflow_id: str +) -> None: + stream = provider.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() @@ -91,92 +99,77 @@ async def _feed(client: Client, workflow_id: str) -> None: ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] -async def test_interface_loop_over_workflow_streams(client: Client): +async def test_interface_loop_over_workflow_streams( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + assert all(r.topic == DECISIONS and r.producer_id == "" for r in records) await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): +async def test_retried_producer_dedupes_and_new_attempt_supersedes( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) + stream = provider.get_stream_handle(client, workflow_id) - first = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - await first.append({"n": 1}) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # Positions are learnt at read time on this transport. + assert await first.append({"n": 1}) is None # The retry of the same attempt re-sends its first batch. - retry = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - assert await retry.append({"n": 1}) is None - second = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=2, - ) + retry = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await retry.append({"n": 1}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"n": 2}) - consumer = await streams.consumer( - client, workflow_id=workflow_id, stream="inputs" - ) - records = await take(consumer.read(type=dict), 3) + records = await take(stream.read(topic=INPUTS, result_type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED - assert isinstance(records[1].value, streams.Supersession) - assert records[1].value.previous_attempt == 1 + assert records[1].supersession == Supersession("model", 1, 2) assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 - # Inbound records carry no topic; the stream's name is the address. - assert all(r.topic == "" for r in records) + assert all(r.topic == INPUTS for r in records) await second.finish() await handle.signal(EchoLoop.release) await handle.result() -async def test_cold_cache_serves_each_record_once(client: Client): +async def test_cold_cache_serves_each_record_once( + client: Client, provider: WorkflowStreamsProvider +): # Every task rebuilds the workflow from history, so the stream object # has to belong to the instance that is running: a stale one would carry # the previous instance's log and hand out every record twice. workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + async with new_worker( + client, EchoLoop, plugins=[provider], max_cached_workflows=0 + ) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - inbound = await streams.consumer( - client, workflow_id=workflow_id, stream="inputs" - ) - arrived = await take(inbound.read(type=dict), 4) + arrived = await take(stream.read(topic=INPUTS, result_type=dict), 4) assert [r.kind for r in arrived] == ECHOED assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] @@ -184,33 +177,106 @@ async def test_cold_cache_serves_each_record_once(client: Client): assert await handle.result() == 3 -async def test_a_closed_run_serves_its_tail_by_query(client: Client): +async def test_a_closed_run_serves_its_tail_by_query_and_the_read_ends( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) await handle.signal(EchoLoop.release) assert await handle.result() == 3 # Nothing polled while the run was open. The poll Update is gone with - # the run, so everything below arrives through the tail Query. - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + # the run, so everything below arrives through the tail Query, and + # the read ends by itself once the tail is delivered. + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + + records = await asyncio.wait_for(read_everything(), 30) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] checkpoint = records[1].cursor - resumed = await streams.consumer(client, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2 + ) assert [r.value["echo"] for r in again[:1]] == [3] assert again[1].kind is RecordKind.FINISH +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[provider]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + first_run = handle.first_execution_run_id + assert first_run is not None + + chain = provider.get_stream_handle(client, workflow_id) + + async def read_everything(stream: Any) -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + # Each run keeps its own log, so following the chain means reading + # the first run to its close and then the successor from its start. + assert await asyncio.wait_for(read_everything(chain), 30) == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + pinned = provider.get_stream_handle(client, workflow_id, run_id=first_run) + assert await asyncio.wait_for(read_everything(pinned), 30) == [ + (RecordKind.DATA, {"run": 0}), + ] + # A cursor from the first run resumes into the successor. + records = await take(chain.read(topic=DECISIONS, result_type=dict), 1) + resumed = await asyncio.wait_for( + asyncio.ensure_future( + _values( + chain.read( + topic=DECISIONS, result_type=dict, after=records[0].cursor + ) + ) + ), + 30, + ) + assert resumed == [{"run": 1}, None] + + +async def _values(records: Any) -> list[Any]: + return [r.value async for r in records] + + class _FlakyHandle: """A workflow handle whose first Signal is accepted and then reported failed.""" + id = "flaky" + def __init__(self) -> None: self.sent: list[PublishInput] = [] self._fail_next = True @@ -225,26 +291,24 @@ async def signal(self, name: str, arg: PublishInput) -> None: ) -def _frames( - publish: PublishInput, -) -> list[tuple[RecordKind, str, str, int, int, bytes]]: +def _wires(publish: PublishInput) -> list[WireRecord]: out = [] for entry in publish.items: - payload = Payload() - payload.ParseFromString(base64.b64decode(entry.data)) - out.append(_frame.decode(payload.data)) + payload = Payload.FromString(base64.b64decode(entry.data)) + out.append(WireRecord.FromString(payload.data)) return out def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: return [ - (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + (publish.sequence, [wire.sequence for wire in _wires(publish)]) + for publish in sent ] def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: return WorkflowStreamsProducer( - handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + handle, DataConverter.default.payload_converter, INPUTS, "model", 1 ) @@ -255,10 +319,11 @@ async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): await producer.append({"n": 1}) await producer.append({"n": 1}) await producer.append({"n": 2}) - # The retry carries the same signal sequence and the same frame sequence - # as the failed send, so the shipped dedupe drops the copy; the batch - # after it continues the numbering. + # The retry carries the same signal sequence and the same record + # sequence as the failed send, so the shipped dedupe drops the copy; the + # batch after it continues the numbering. assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + assert all(publish.publisher_id == "model#1" for publish in handle.sent) async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): @@ -269,4 +334,4 @@ async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): await producer.append({"n": 2}, {"n": 3}) await producer.finish() assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] - assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH + assert _wires(handle.sent[-1])[0].kind == int(RecordKind.FINISH) From bdc46d4199ccc3847855101a98de2a90a6581c18 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:46:46 -0700 Subject: [PATCH 430/831] Detached the stream this instance captured, not the thread's current one. The workflow half now keeps the WorkflowStream it found at start, so the finish hook lets go of this run's pollers rather than of whatever the signal handler lookup answers on the thread at the time. --- .../streams/providers/workflow_streams.py | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6f18dce46..cef1cbe3e 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -229,7 +229,20 @@ def publish(self, record: WireRecord) -> None: class _WSWorkflowProvider: - """The workflow half: the shipped stream object of the running instance.""" + """The workflow half: the shipped stream object of one workflow instance. + + Made per instance by the worker, so the stream object it captures on + first use is this instance's, and the finish hook lets go of that one + rather than of whatever the thread's handler lookup answers at the time. + """ + + def __init__(self) -> None: + self._stream: WorkflowStream | None = None + + def _own_stream(self) -> WorkflowStream: + if self._stream is None: + self._stream = _instance().stream + return self._stream def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: _require_topic(topic) @@ -242,26 +255,25 @@ def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: f"cursor {after.token!r} names another run; a run's log is its own" ) start = named[1] + 1 - return _WSReadSource(_instance().stream, topic, start, run_id) + return _WSReadSource(self._own_stream(), topic, start, run_id) def open_writer(self, topic: str) -> WriteSink: _require_topic(topic) - return _WSWriteSink(_instance().stream, topic) + return _WSWriteSink(self._own_stream(), topic) def on_workflow_start(self) -> None: # Registered before the first task completes, because an outside # reader can poll before workflow code has opened anything, and an # Update with no handler yet is rejected rather than held. - _instance() + self._own_stream() async def on_workflow_finish(self) -> None: # An Option 0 stream dies with its run, and a parked long-poll Update # would otherwise hold completion open. Same recipe the shipped # feature documents before a return or a continue-as-new. - stream = _registered_stream() - if stream is None: + if self._stream is None: return - stream.detach_pollers() + self._stream.detach_pollers() await workflow.wait_condition(workflow.all_handlers_finished) From c164570730234673ad21ffae09ef40de0a4a09f3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 04:26:40 -0700 Subject: [PATCH 431/831] Drove the poll Update directly so a cancelled read stays cancelled. The shipped subscribe loop swallows a cancellation of the caller's task, so a bounded read resubscribed forever instead of timing out. The poll name and its failure types are public on the contrib package for this. --- .../contrib/workflow_streams/__init__.py | 6 ++ .../contrib/workflow_streams/_stream.py | 9 +- .../streams/providers/workflow_streams.py | 100 +++++++++++++----- .../streams/test_workflow_streams_provider.py | 33 ++++++ 4 files changed, 122 insertions(+), 26 deletions(-) diff --git a/temporalio/contrib/workflow_streams/__init__.py b/temporalio/contrib/workflow_streams/__init__.py index 3f225bb2f..c44bd25ea 100644 --- a/temporalio/contrib/workflow_streams/__init__.py +++ b/temporalio/contrib/workflow_streams/__init__.py @@ -14,6 +14,7 @@ from temporalio.contrib.workflow_streams._client import WorkflowStreamClient from temporalio.contrib.workflow_streams._stream import ( + POLL_UPDATE_NAME, PUBLISH_SIGNAL_NAME, WorkflowStream, ) @@ -22,6 +23,8 @@ WorkflowTopicHandle, ) from temporalio.contrib.workflow_streams._types import ( + STREAM_DRAINING_ERROR_TYPE, + TRUNCATED_OFFSET_ERROR_TYPE, PollInput, PollResult, PublishEntry, @@ -32,7 +35,10 @@ ) __all__ = [ + "POLL_UPDATE_NAME", "PUBLISH_SIGNAL_NAME", + "STREAM_DRAINING_ERROR_TYPE", + "TRUNCATED_OFFSET_ERROR_TYPE", "PollInput", "PollResult", "PublishEntry", diff --git a/temporalio/contrib/workflow_streams/_stream.py b/temporalio/contrib/workflow_streams/_stream.py index ff0865c29..e1ebda15b 100644 --- a/temporalio/contrib/workflow_streams/_stream.py +++ b/temporalio/contrib/workflow_streams/_stream.py @@ -57,8 +57,15 @@ does not have to copy the name. """ +POLL_UPDATE_NAME = "__temporal_workflow_stream_poll" +"""The update :class:`WorkflowStream` registers for long polls. + +Public so code that drives the poll itself, with its own retry and +cancellation rules, does not have to copy the name. +""" + _PUBLISH_SIGNAL = PUBLISH_SIGNAL_NAME -_POLL_UPDATE = "__temporal_workflow_stream_poll" +_POLL_UPDATE = POLL_UPDATE_NAME _OFFSET_QUERY = "__temporal_workflow_stream_offset" _MAX_POLL_RESPONSE_BYTES = 1_000_000 diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index cef1cbe3e..af297899b 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -32,6 +32,7 @@ from __future__ import annotations +import asyncio import base64 import logging from collections.abc import AsyncGenerator @@ -48,10 +49,17 @@ WorkflowHandle, WorkflowHistoryEventFilterType, WorkflowQueryFailedError, + WorkflowUpdateFailedError, + WorkflowUpdateRPCTimeoutOrCancelledError, + WorkflowUpdateStage, ) -from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( + POLL_UPDATE_NAME, PUBLISH_SIGNAL_NAME, + STREAM_DRAINING_ERROR_TYPE, + TRUNCATED_OFFSET_ERROR_TYPE, + PollInput, + PollResult, PublishEntry, PublishInput, WorkflowStream, @@ -81,6 +89,9 @@ _PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" _ENCODING = b"binary/plain" +# The server's failure type for an accepted Update whose run closed before +# answering it: the poll's way of saying the run is over. +_UPDATE_OUTLIVED_RUN = "AcceptedUpdateCompletedWorkflow" logger = logging.getLogger(__name__) @@ -452,33 +463,14 @@ async def _read( while True: handle = self._handle(run_id) next_offset = offset - # Pinned to one run, with no client for the shipped chain - # following: a log is not carried across continue-as-new, so - # the successor's offsets start over and this loop is what - # moves from one run to the next. - subscription = WorkflowStreamClient(handle).subscribe( - topic, - from_offset=offset, - result_type=RawValue, - poll_cooldown=self._poll_cooldown, - ) + polls = self._poll(handle, topic, offset) try: - async for item in subscription: - next_offset = item.offset + 1 - if item.topic != topic: - continue - for record in self._records( - decoder, run_id, item.offset, item.data.payload - ): + async for item_offset, payload in polls: + next_offset = item_offset + 1 + for record in self._records(decoder, run_id, item_offset, payload): yield record - except RPCError as error: - # The run closed and its poll Update went with it, or the - # workflow does not exist; the describe below tells which. - if error.status != RPCStatusCode.NOT_FOUND: - raise finally: - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() + await polls.aclose() status = await self._status(handle) if status is None: raise StreamNotFoundError( @@ -508,6 +500,64 @@ async def _read( return run_id, offset = successor, 0 + async def _poll( + self, handle: WorkflowHandle[Any, Any], topic: str, offset: int + ) -> AsyncGenerator[tuple[int, Payload], None]: + """Drive the shipped poll Update on one run until that run closes. + + Written here rather than through ``WorkflowStreamClient.subscribe`` + for two reasons. That loop swallows a cancellation of the caller's + task, so a consumer's ``asyncio.timeout`` or task cancel around a read + would end the subscription and let the read resubscribe forever; here + the cancellation leaves ``read()`` as what it was. And it follows + continue-as-new with offsets this provider does not carry across + runs, which is the outer loop's job. + """ + cooldown = self._poll_cooldown.total_seconds() + while True: + try: + update = await handle.start_update( + POLL_UPDATE_NAME, + PollInput(topics=[topic], from_offset=offset), + wait_for_stage=WorkflowUpdateStage.ACCEPTED, + result_type=PollResult, + ) + result = await update.result() + except WorkflowUpdateRPCTimeoutOrCancelledError as error: + if isinstance(error.__cause__, asyncio.CancelledError): + # The SDK wraps a cancelled await in this error; the + # consumer cancelled us, so that is what comes out. + raise asyncio.CancelledError() from error + # The RPC itself timed out while the run is still open. + continue + except WorkflowUpdateFailedError as error: + cause = getattr(error.cause, "type", None) + if cause == TRUNCATED_OFFSET_ERROR_TYPE: + # The log was truncated past this position; zero means + # from whatever the run still retains. + offset = 0 + continue + if cause == STREAM_DRAINING_ERROR_TYPE: + # Pollers are detached because the run is closing; the + # next attempt learns how it closed. + await asyncio.sleep(cooldown) + continue + if cause == _UPDATE_OUTLIVED_RUN: + return + raise + except RPCError as error: + # The run closed and its poll Update went with it, or the + # workflow does not exist; the caller describes to tell which. + if error.status != RPCStatusCode.NOT_FOUND: + raise + return + for item in result.items: + if item.topic == topic: + yield item.offset, Payload.FromString(base64.b64decode(item.data)) + offset = result.next_offset + if not result.more_ready and cooldown > 0: + await asyncio.sleep(cooldown) + def _records( self, decoder: RecordDecoder, run_id: str, offset: int, payload: Payload ) -> list[StreamRecord[Any]]: diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 28f2f631d..186de9094 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -209,6 +209,39 @@ async def read_everything() -> list[Any]: assert again[1].kind is RecordKind.FINISH +async def test_a_bounded_read_is_cancelled_within_its_timeout( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_forever() -> None: + async for _ in stream.read(topic=DECISIONS, result_type=dict): + pass + + # The run is open and nothing is published, so the read parks on the + # poll Update. The bound has to come out as a timeout rather than + # vanish into a resubscribe. + started = asyncio.get_running_loop().time() + with pytest.raises(asyncio.TimeoutError): + await asyncio.wait_for(read_forever(), timeout=1) + assert asyncio.get_running_loop().time() - started < 10 + # A reader task cancelled outright ends the same way. + task = asyncio.create_task(read_forever()) + await asyncio.sleep(0.2) + task.cancel() + with pytest.raises(asyncio.CancelledError): + await task + + await stream.producer(topic=INPUTS, producer_id="model", attempt=1).finish() + await handle.signal(EchoLoop.release) + assert await handle.result() == 0 + + @workflow.defn class Relay: """Publishes one record per run and continues as new once.""" From 4995cf1a6e2c909609f98045beb35d1ae97a5c94 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:24:46 -0700 Subject: [PATCH 432/831] Added activity.stream_handle and Client.get_stream_handle. A provider is registered once, as a plugin on the client, and every context asks for its stream the same way: the worker inherits the client's provider, an activity's handle is its own workflow pinned to its run, and a client's handle mirrors get_workflow_handle. --- temporalio/activity.py | 48 +++++++++ temporalio/client/_client.py | 41 +++++++ temporalio/streams/__init__.py | 23 ++-- temporalio/streams/providers/__init__.py | 45 +++++--- temporalio/worker/_activity.py | 6 ++ temporalio/worker/_worker.py | 8 +- tests/streams/test_stream_accessors.py | 125 ++++++++++++++++++++++ tests/streams/test_streams_conformance.py | 14 ++- 8 files changed, 283 insertions(+), 27 deletions(-) create mode 100644 tests/streams/test_stream_accessors.py diff --git a/temporalio/activity.py b/temporalio/activity.py index 3f69bc17f..271f3e9e7 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -29,6 +29,7 @@ import temporalio.bridge.proto.activity_task import temporalio.common import temporalio.converter +import temporalio.streams from temporalio.converter._payload_converter import ( _TemporalTransferTypePayloadConverter, ) @@ -209,6 +210,7 @@ class _Context: runtime_metric_meter: temporalio.common.MetricMeter | None client: Client | None cancellation_details: _ActivityCancellationDetailsHolder + stream_provider: temporalio.streams.StreamProvider | None = None _logger_details: Mapping[str, Any] | None = None _payload_converter: temporalio.converter.PayloadConverter | None = None _metric_meter: temporalio.common.MetricMeter | None = None @@ -298,6 +300,52 @@ def client() -> Client: return client +def stream_handle( + workflow_id: str | None = None, *, run_id: str | None = None +) -> temporalio.streams.StreamHandle: + """Return a stream handle from the provider the worker was given. + + With no arguments the handle is on this activity's own workflow, pinned to + the run the activity belongs to, so a producer opened from it writes onto + that run's stream and a read follows that run. Name a ``workflow_id`` to + address another workflow; ``run_id`` then pins the handle to one run and + its absence follows the execution chain. See :py:mod:`temporalio.streams`. + + Like :py:func:`client`, this is only available in ``async def`` + activities. + + Returns: + :py:class:`temporalio.streams.StreamHandle` for use in the current + activity. + + Raises: + temporalio.streams.StreamUnsupportedError: The worker has no stream + provider. Register one with ``Client.connect(plugins=[provider])`` + or ``Worker(plugins=[provider])``. + RuntimeError: When the client is not available, or when the activity + has no workflow and no ``workflow_id`` was given. + ValueError: ``run_id`` was given without ``workflow_id``. + """ + context = _Context.current() + provider = context.stream_provider + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is configured on this worker; register one with " + "Client.connect(plugins=[provider]) or Worker(plugins=[provider])" + ) + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id needs a workflow_id") + info = context.info() + if info.workflow_id is None: + raise RuntimeError( + "this activity belongs to no workflow, so name the workflow_id to " + "address" + ) + workflow_id, run_id = info.workflow_id, info.workflow_run_id + return provider.get_stream_handle(client(), workflow_id, run_id=run_id) + + def in_activity() -> bool: """Whether the current code is inside an activity. diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 5acdfe476..75e768167 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -28,6 +28,7 @@ import temporalio.converter import temporalio.runtime import temporalio.service +import temporalio.streams import temporalio.workflow from temporalio.service import ( ConnectConfig, @@ -157,6 +158,7 @@ async def connect( grpc_compression: GrpcCompression = GrpcCompression.GZIP, payload_limits: PayloadLimitsConfig = PayloadLimitsConfig(), header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> Self: """Connect to a Temporal server. @@ -222,6 +224,11 @@ async def connect( payload_limits: Warning thresholds for outbound payload/memo sizes. Over-threshold fields are logged but still sent. Set a threshold to 0 to disable it. header_codec_behavior: Encoding behavior for headers sent by the client. + stream_provider: Experimental. The stream provider + :py:meth:`get_stream_handle` opens handles from, see + :py:mod:`temporalio.streams`. A provider that is also a + :py:class:`Plugin` sets this itself when passed in ``plugins``, + and workers built from this client inherit it. """ connect_config = temporalio.service.ConnectConfig( target_host=target_host, @@ -258,6 +265,7 @@ def make_lambda( default_workflow_query_reject_condition=default_workflow_query_reject_condition, header_codec_behavior=header_codec_behavior, plugins=plugins, + stream_provider=stream_provider, ) def __init__( @@ -271,6 +279,7 @@ def __init__( default_workflow_query_reject_condition: None | (temporalio.common.QueryRejectCondition) = None, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ): """Create a Temporal client from a service client. @@ -285,6 +294,7 @@ def __init__( interceptors=interceptors, default_workflow_query_reject_condition=default_workflow_query_reject_condition, header_codec_behavior=header_codec_behavior, + stream_provider=stream_provider, ) self._initial_config = config.copy() @@ -897,6 +907,36 @@ def get_workflow_handle( result_type=result_type, ) + def get_stream_handle( + self, workflow_id: str, *, run_id: str | None = None + ) -> temporalio.streams.StreamHandle: + """Get a handle on a workflow's stream from the provider registered on this client. + + Mirrors :py:meth:`get_workflow_handle`: without ``run_id`` the handle + follows the workflow's execution chain across continue-as-new, with + one it is pinned to that run. The provider is the one registered with + ``plugins=[provider]`` at :py:meth:`connect`, or passed as + ``stream_provider``. See :py:mod:`temporalio.streams`. + + Args: + workflow_id: Workflow ID whose stream to get a handle to. + run_id: Run ID to pin the handle to. + + Returns: + The stream handle. + + Raises: + temporalio.streams.StreamUnsupportedError: No stream provider is + registered on this client. + """ + provider = self._config.get("stream_provider") + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is registered on this client; connect with " + "plugins=[provider]" + ) + return provider.get_stream_handle(self, workflow_id, run_id=run_id) + def get_workflow_handle_for( self, workflow: ( @@ -3070,3 +3110,4 @@ class ClientConfig(TypedDict, total=False): temporalio.common.QueryRejectCondition | None ] header_codec_behavior: Required[HeaderCodecBehavior] + stream_provider: temporalio.streams.StreamProvider | None diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 30d1f9a98..c185c35ce 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -30,15 +30,20 @@ workflow and by outside consumers; which of those happen is the application's business. -Workflow-side entry points live in :mod:`temporalio.workflow`: -:func:`temporalio.workflow.stream_reader` and -:func:`temporalio.workflow.stream_writer`. Outside a workflow, a handle comes -from a provider instance: ``provider.get_stream_handle(client, workflow_id)``. -A provider is an object; when it serves workers it is also a -:class:`temporalio.worker.Plugin`, passed as ``Worker(plugins=[provider])`` -and ``Replayer(plugins=[provider])``. This module keeps the shared types, the -errors and the protocols a provider implements; nothing here that workflow -code imports does I/O. +A provider is an object, registered once as a plugin: +``Client.connect(plugins=[provider])``; workers built from that client inherit +it, and ``Worker(plugins=[provider])`` or ``Replayer(plugins=[provider])`` +registers it on a worker alone. Each context then asks for its stream the +same way. Workflow code uses :func:`temporalio.workflow.stream_reader` and +:func:`temporalio.workflow.stream_writer`. An activity uses +:func:`temporalio.activity.stream_handle`, which is its own workflow pinned +to its run unless told otherwise. Any process holding a client uses +:meth:`temporalio.client.Client.get_stream_handle`, which mirrors +``get_workflow_handle``. The explicit form, +``provider.get_stream_handle(client, workflow_id)``, stays for a process that +talks to two stores. This module keeps the shared types, the errors and the +protocols a provider implements; nothing here that workflow code imports does +I/O. What the contract does not promise: that a :attr:`RecordKind.FINISH` record means the writing activity succeeded, that a superseded attempt's records can diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py index 911620e6c..7aaa5a9b1 100644 --- a/temporalio/streams/providers/__init__.py +++ b/temporalio/streams/providers/__init__.py @@ -1,11 +1,14 @@ """Stream providers, one module each. -A provider that serves workers is a :class:`temporalio.worker.Plugin`. +A provider that serves workers is a :class:`temporalio.worker.Plugin`, and +one registered on a client is a :class:`temporalio.client.Plugin` too. :class:`ProviderPlugin` is the plugin half the providers in this tree share: -it hands the provider to the worker and the replayer as their -``stream_provider`` and leaves their execution alone. A provider that holds -connections closes them through its own ``close()``, not with the worker, -because the same provider serves handles outside any worker. +it hands the provider to the client, the worker and the replayer as their +``stream_provider`` and leaves their execution alone, so +``Client.connect(plugins=[provider])`` registers it once and every worker +built from that client inherits it. A provider that holds connections closes +them through its own ``close()``, not with the worker, because the same +provider serves handles outside any worker. """ from __future__ import annotations @@ -13,8 +16,10 @@ from collections.abc import AsyncIterator, Awaitable, Callable from contextlib import AbstractAsyncContextManager +import temporalio.client import temporalio.worker -from temporalio.client import WorkflowHistory +from temporalio.client import ClientConfig, WorkflowHistory +from temporalio.service import ConnectConfig, ServiceClient from temporalio.streams._provider import StreamProvider from temporalio.worker import ( Replayer, @@ -27,16 +32,32 @@ __all__ = ["ProviderPlugin"] -class ProviderPlugin(StreamProvider, temporalio.worker.Plugin): - """The worker plugin every provider in this tree is built on. +class ProviderPlugin( + StreamProvider, temporalio.client.Plugin, temporalio.worker.Plugin +): + """The plugin every provider in this tree is built on. Subclasses implement :class:`temporalio.streams.StreamProvider`; this - class supplies the four plugin hooks, so ``Worker(plugins=[provider])`` - and ``Replayer(plugins=[provider])`` reach the provider through their - ``stream_provider`` option and the worker installs the interceptor that - calls the workflow half's lifecycle hooks. + class supplies the plugin hooks, so ``Client.connect(plugins=[provider])``, + ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` reach + the provider through their ``stream_provider`` option. A worker built from + a client that carries the plugin inherits it, and the worker installs the + interceptor that calls the workflow half's lifecycle hooks. """ + def configure_client(self, config: ClientConfig) -> ClientConfig: + """Set this provider as the client's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def connect_service_client( + self, + config: ConnectConfig, + next: Callable[[ConnectConfig], Awaitable[ServiceClient]], + ) -> ServiceClient: + """Connect unchanged.""" + return await next(config) + def configure_worker(self, config: WorkerConfig) -> WorkerConfig: """Set this provider as the worker's ``stream_provider``.""" config["stream_provider"] = self diff --git a/temporalio/worker/_activity.py b/temporalio/worker/_activity.py index ded3047fc..10bf45bd2 100644 --- a/temporalio/worker/_activity.py +++ b/temporalio/worker/_activity.py @@ -33,6 +33,7 @@ import temporalio.common import temporalio.converter import temporalio.exceptions +import temporalio.streams from temporalio.converter import ( StorageDriverActivityInfo, StorageDriverStoreContext, @@ -63,9 +64,11 @@ def __init__( metric_meter: temporalio.common.MetricMeter, client: temporalio.client.Client, encode_headers: bool, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: self._bridge_worker = bridge_worker self._task_queue = task_queue + self._stream_provider = stream_provider self._activity_executor = activity_executor self._shared_state_manager = shared_state_manager self._running_activities: dict[bytes, _RunningActivity] = {} @@ -666,6 +669,9 @@ async def _execute_activity( runtime_metric_meter=None if sync_non_threaded else self._metric_meter, client=self._client if not running_activity.sync else None, cancellation_details=running_activity.cancellation_details, + stream_provider=( + self._stream_provider if not running_activity.sync else None + ), ) ) temporalio.activity.logger.debug("Starting activity") diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index 889c063e2..04dfdd562 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -494,6 +494,11 @@ def _init_from_config(self, client: temporalio.client.Client, config: WorkerConf # Prepend applicable client interceptors to the given ones client_config = config["client"].config(active_config=True) # type: ignore[reportTypedDictNotRequiredAccess] + # A provider registered on the client serves its workers too, so one + # registration covers every context that asks for a stream. + stream_provider = config.get("stream_provider") or client_config.get( + "stream_provider" + ) interceptors_from_client = cast( list[Interceptor], [i for i in client_config["interceptors"] if isinstance(i, Interceptor)], @@ -531,6 +536,7 @@ def _init_from_config(self, client: temporalio.client.Client, config: WorkerConf interceptors=interceptors, metric_meter=self._runtime.metric_meter, client=client, + stream_provider=stream_provider, encode_headers=( client_config["header_codec_behavior"] == HeaderCodecBehavior.CODEC ), @@ -600,7 +606,7 @@ def check_activity(activity: str): != HeaderCodecBehavior.NO_CODEC, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, external_stream_backend=self._external_stream_backend, - stream_provider=config.get("stream_provider"), + stream_provider=stream_provider, ) tuner = config.get("tuner") diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py new file mode 100644 index 000000000..73436dea2 --- /dev/null +++ b/tests/streams/test_stream_accessors.py @@ -0,0 +1,125 @@ +"""The accessors each context asks for its stream, with one registration. + +The provider is registered on the client alone. A worker built from that +client inherits it, an activity on that worker reaches its own workflow's +stream through ``activity.stream_handle()``, and any code holding the client +reaches a stream through ``client.get_stream_handle()``. Without a +registration, both say so with the same error. +""" + +from __future__ import annotations + +import asyncio +import uuid +from datetime import timedelta +from typing import Any + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind, StreamUnsupportedError +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import ActivityEnvironment, WorkflowEnvironment +from tests.helpers import new_worker + +INPUTS = "inputs" +DECISIONS = "decisions" + + +@pytest.fixture +def provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] + if env.supports_time_skipping: + pytest.skip( + "the memory provider polls on a timer, which time skipping turns into a spin" + ) + streams = MemoryStreams() + yield streams + streams.reset() + + +def _with_provider(client: Client, provider: MemoryStreams) -> Client: + # The same connection, with the provider registered the way an + # application registers it: once, on the client. + config = client.config() + config["plugins"] = [provider] + return Client(**config) + + +@activity.defn +async def emit(count: int) -> str: + # No workflow id and no run id: the handle is this activity's own + # workflow, pinned to its run, and the producer's identity is the + # activity's. + model = activity.stream_handle().producer(topic=INPUTS) + for n in range(count): + await model.append({"n": n}) + await model.finish() + return activity.info().activity_id + + +@workflow.defn +class Echo: + """Runs the emitting activity and echoes what arrives on ``inputs``.""" + + @workflow.run + async def run(self, count: int) -> list[Any]: + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) + emitting = workflow.start_activity( + emit, count, start_to_close_timeout=timedelta(seconds=30) + ) + seen: list[Any] = [] + async for record in inputs: + if record.kind is RecordKind.FINISH: + seen.append(("finish", record.producer_id)) + break + assert record.value is not None + seen.append(record.value["n"]) + decisions.publish({"echo": record.value["n"]}) + decisions.finish() + producer_id = await emitting + return [*seen, ("activity", producer_id)] + + +async def test_one_registration_on_the_client_serves_every_context( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + # No plugins on the worker: it inherits the client's provider. + async with new_worker(registered, Echo, activities=[emit]) as worker: + handle = await registered.start_workflow( + Echo.run, 2, id=workflow_id, task_queue=worker.task_queue + ) + result = await handle.result() + # The activity wrote as itself onto its own workflow's topic. + assert result[:2] == [0, 1] + assert result[2] == ["finish", result[3][1]] + + stream = registered.get_stream_handle(workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + assert await asyncio.wait_for(read_everything(), 30) == [ + (RecordKind.DATA, {"echo": 0}), + (RecordKind.DATA, {"echo": 1}), + (RecordKind.FINISH, None), + ] + + +async def test_get_stream_handle_needs_a_registered_provider(client: Client): + with pytest.raises(StreamUnsupportedError, match="plugins="): + client.get_stream_handle("wf") + + +async def test_stream_handle_needs_a_provider_on_the_worker(): + async def ask() -> None: + activity.stream_handle() + + with pytest.raises(StreamUnsupportedError, match="plugins="): + await ActivityEnvironment().run(ask) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index addfe5689..9a0de2f0d 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -25,7 +25,7 @@ import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass -from typing import Any, cast +from typing import Any import pytest @@ -68,11 +68,15 @@ async def open( ) -> StreamHandle: if self.host is not None: await self.host(workflow_id) - # The memory provider takes no client; every storage provider's setup - # supplies one, so the cast only ever lies for the provider that - # does not read it. + if self.client is not None: + # A storage provider's setup registers the provider on the client, + # so the cases go through the accessor an application uses. + return self.client.get_stream_handle(workflow_id, run_id=run_id) + # Only the memory provider gets here, and it takes no client. return self.provider.get_stream_handle( - cast(Client, self.client), workflow_id, run_id=run_id + None, # type: ignore[arg-type] + workflow_id, + run_id=run_id, ) From dc32947c2b8f77a5dbef9bebe68bae5ec8e8fffe Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:24:46 -0700 Subject: [PATCH 433/831] Registered the demo's provider on the client and reported from the activity. --- CHANGELOG.md | 12 +++++++----- streams_demo/agent_loop.py | 22 ++++++++++++++++------ streams_demo/run_demo.py | 37 +++++++++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a084569bc..357a7ba66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,11 +36,13 @@ to include examples, links to docs, or any other relevant information. ### Added - **Experimental**: `temporalio.streams` defines one stream interface a workflow - can read, decide on, and write. `workflow.stream_reader()` and - `workflow.stream_writer()` are the workflow-side entry points, a provider is a - worker plugin passed as `Worker(plugins=[provider])`, and - `provider.get_stream_handle()` reads and appends from outside. The record on - the wire is `temporal.api.stream.v1.StreamRecord` on every provider. + can read, decide on, and write. A provider is registered once as a plugin, + `Client.connect(plugins=[provider])`, and workers built from that client + inherit it; each context then asks for its stream the same way: + `workflow.stream_reader()` and `workflow.stream_writer()` in workflow code, + `activity.stream_handle()` in an activity, and `client.get_stream_handle()` + anywhere a client is held. The record on the wire is + `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against, and `temporalio.streams.providers.redis.RedisStreams` serves the same interface diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index 330cb54c2..a76b35ced 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -1,12 +1,14 @@ """One agent loop, written once, run on every stream provider. Reads input, decides on it, publishes the decision, and runs an ordinary -Activity in the same workflow task. Also handles the two control records the -contract defines, so a retried producer and a finished topic are exercised -rather than described. +Activity in the same workflow task; the Activity reports on its own +workflow's stream in turn. Also handles the two control records the contract +defines, so a retried producer and a finished topic are exercised rather than +described. This file is byte-identical in the server-side tree and the client-side tree. -Only the worker that runs it differs, and only in which provider it is given. +Nothing in it names a provider: the workflow asks its runtime, the Activity +asks its context, and the process that runs them registered the provider once. """ from __future__ import annotations @@ -19,12 +21,20 @@ DECISIONS = "decisions" INPUTS = "inputs" +RECEIPTS = "receipts" @activity.defn(name="RecordDecision") async def record_decision(decision: dict[str, Any]) -> str: - """An ordinary command in the same task as the publish.""" - return f"recorded:{decision['source']}:{decision['branch']}" + """An ordinary command in the same task as the publish. + + Appends its receipt onto its own workflow's stream too, under the + Activity's own identity, so a reader outside sees the decision and the + record of it side by side. + """ + receipt = f"recorded:{decision['source']}:{decision['branch']}" + await activity.stream_handle().producer(topic=RECEIPTS).append({"receipt": receipt}) + return receipt def decide(token: dict[str, Any]) -> dict[str, Any]: diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 1238fad11..0b06e9395 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -7,10 +7,13 @@ the run as it allows is rebuilt rather than remembered; - a producer whose second attempt supersedes its first, which the reader has to report and the workflow has to act on; -- an outside reader following what the workflow published. +- an outside reader following what the workflow published, and the receipts + the Activity appended on the workflow's stream from inside its own context. -Byte-identical in every tree. ``provider_setup`` is what differs, and it is -the only import here that names a provider. +The provider is registered once, on the client; the worker inherits it and +every context asks for its stream without naming it. Byte-identical in every +tree. ``provider_setup`` is what differs, and it is the only import here that +names a provider. """ from __future__ import annotations @@ -25,12 +28,18 @@ from temporalio.api.enums.v1 import EventType from temporalio.client import Client -from temporalio.streams import StreamHandle +from temporalio.streams import RecordKind, StreamHandle from temporalio.worker import Worker sys.path.insert(0, str(Path(__file__).resolve().parent)) import provider_setup # noqa: E402 -from agent_loop import DECISIONS, INPUTS, AgentLoop, record_decision # noqa: E402 +from agent_loop import ( # noqa: E402 + DECISIONS, + INPUTS, + RECEIPTS, + AgentLoop, + record_decision, +) DECISION_LIMIT = 8 EXPECTED_OUTPUT = 6 @@ -51,7 +60,7 @@ async def main() -> int: out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" out.mkdir(exist_ok=True) target, provider = await provider_setup.open() - client = await Client.connect(target, namespace="default") + client = await Client.connect(target, namespace="default", plugins=[provider]) uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex record: dict[str, Any] = { @@ -67,12 +76,11 @@ async def main() -> int: workflows=[AgentLoop], activities=[record_decision], max_cached_workflows=provider_setup.WORKFLOW_CACHE, - plugins=[provider], ): handle = await client.start_workflow( AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid ) - stream = provider.get_stream_handle(client, uid) + stream = client.get_stream_handle(uid) output = asyncio.create_task(collect_output(stream, EXPECTED_OUTPUT)) # The first attempt writes two records and then stops, as a failed @@ -138,6 +146,19 @@ async def main() -> int: output.cancel() record["observed_output"] = "timed_out" + async def receipts() -> list[Any]: + # Ends by itself once the workflow is closed and the tail served. + return [ + r.value + async for r in stream.read(topic=RECEIPTS, result_type=dict) + if r.kind is RecordKind.DATA + ] + + try: + record["receipts"] = await asyncio.wait_for(receipts(), timeout=20) + except asyncio.TimeoutError: + record["receipts"] = "timed_out" + history = await handle.fetch_history() record["history_events"] = len(history.events) (out / "history.json").write_text(history.to_json()) From f4e1c4082aded01d4f77b87008868d233c9a2163 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:27:51 -0700 Subject: [PATCH 434/831] Registered the Workflow Streams conformance provider on the client. --- tests/streams/test_streams_conformance.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index ed3880f01..7f783170b 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -106,8 +106,13 @@ async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: # No STREAMS_LIVE gate: the store is the workflow's own History, which the # test environment's server provides. provider = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + # Registered once, on the client: the host's worker inherits it and the + # cases open handles through client.get_stream_handle. + config = client.config() + config["plugins"] = [provider] + client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost, plugins=[provider]) as worker: + async with new_worker(client, StreamHost) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: From a6676402f8d33f061372152d3f8f488e0e41da67 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:29:01 -0700 Subject: [PATCH 435/831] Registered the Redis conformance provider on the client. --- tests/streams/test_streams_conformance.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9a0de2f0d..19759aec1 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -116,8 +116,13 @@ async def _redis_case(client: Client) -> AsyncIterator[ProviderCase]: # A prefix per setup, because the store keeps what earlier runs wrote. key_prefix=f"streams-conformance-{uuid.uuid4().hex}", ) + # Registered once, on the client: the host's worker inherits it and the + # cases open handles through client.get_stream_handle. + config = client.config() + config["plugins"] = [provider] + client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost, plugins=[provider]) as worker: + async with new_worker(client, StreamHost) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: From 3f6cf753c73ae020674d4b44a6ab564cbda05227 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 436/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e0960c5d..2365cd4fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,10 @@ to include examples, links to docs, or any other relevant information. `temporalio.contrib.workflow_streams` without naming it. Records are the `StreamRecord` proto inside the shipped item payload, and a handle without a run id follows continue-as-new run by run. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From 10bba7a7b04cf2b18e706ad6e3ff796c656932ce Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 437/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 66a941fbd8503a43bed3be2913f5d5e778dbca50 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 438/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From 00e7885db7d8043d39aa4c5bacd6f15858ada17c Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 439/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From 04a75e9350aa2de904c17fa8673f822863631bf5 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 440/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2365cd4fe..dcc5e6866 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From 38124e036e859e8be6721712c565a9b7827d01fd Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 441/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From e69f35225adc4ea7ba954eee4d181e6f71d1a144 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:26:33 -0700 Subject: [PATCH 442/831] Added the IDL contract and generation for the stream endpoint. The stream endpoint's shape lived only in hand-written Python, so no other language could be given the contract. This defines it once in a nexusrpc yaml contract and generates the Python bindings from it. The generated _definitions helper is hidden from the API docs and skipped by pydocstyle, the same way the other generated trees are. --- pyproject.toml | 6 +- scripts/gen_streams_nexus_api.py | 80 +++ .../providers/_nexus_generated/__init__.py | 23 + .../_nexus_generated/_definitions.py | 542 ++++++++++++++ .../providers/_nexus_generated/models.py | 670 ++++++++++++++++++ .../providers/_nexus_generated/services.py | 39 + .../providers/temporal_streams.nexusrpc.yaml | 123 ++++ 7 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 scripts/gen_streams_nexus_api.py create mode 100644 temporalio/streams/providers/_nexus_generated/__init__.py create mode 100644 temporalio/streams/providers/_nexus_generated/_definitions.py create mode 100644 temporalio/streams/providers/_nexus_generated/models.py create mode 100644 temporalio/streams/providers/_nexus_generated/services.py create mode 100644 temporalio/streams/providers/temporal_streams.nexusrpc.yaml diff --git a/pyproject.toml b/pyproject.toml index b7077785f..e55c39219 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,9 +125,11 @@ format = [ ] gen-docs = "uv run scripts/gen_docs.py" gen-nexus-system-api = "uv run scripts/gen_nexus_system_api.py" +gen-streams-nexus-api = "uv run scripts/gen_streams_nexus_api.py" gen-protos = [ { cmd = "uv run scripts/gen_protos.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -135,6 +137,7 @@ gen-protos = [ gen-protos-docker = [ { cmd = "uv run scripts/gen_protos_docker.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -207,7 +210,7 @@ ignore_errors = true [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 -match_dir = "^(?!(docs|scripts|tests|api|proto|system|\\.)).*" +match_dir = "^(?!(docs|scripts|tests|api|proto|system|_nexus_generated|\\.)).*" add_ignore = [ # We like to wrap at a certain number of chars, even long summary sentences. # https://github.com/PyCQA/pydocstyle/issues/184 @@ -241,6 +244,7 @@ privacy = [ "HIDDEN:temporalio.worker.workflow_sandbox.importer", "HIDDEN:temporalio.worker.workflow_sandbox.in_sandbox", "HIDDEN:**.*_pb2*", + "HIDDEN:temporalio.streams.providers._nexus_generated._definitions", ] project-name = "Temporal Python" sidebar-expand-depth = 2 diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py new file mode 100644 index 000000000..800aba944 --- /dev/null +++ b/scripts/gen_streams_nexus_api.py @@ -0,0 +1,80 @@ +import os +import shutil +import subprocess +import sys +from pathlib import Path + +base_dir = Path(__file__).parent.parent +providers_dir = base_dir / "temporalio" / "streams" / "providers" +contract_path = providers_dir / "temporal_streams.nexusrpc.yaml" +output_dir = providers_dir / "_nexus_generated" +# Pinned to the version CI installs, because nexgen's output changes between +# releases and check-protos compares against what is committed here. +NEX_GEN_VERSION = "0.2.4" + + +def nex_gen_command() -> list[str]: + if bin_path := os.environ.get("NEX_GEN_BIN"): + return [bin_path] + + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + # Same build as the system API script installs, so one binary + # serves both and neither can overwrite the other's output. + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] + + +def generate_streams_nexus_api() -> None: + if not contract_path.exists(): + raise RuntimeError(f"missing stream contract: {contract_path}") + + command = nex_gen_command() + shutil.rmtree(output_dir, ignore_errors=True) + subprocess.check_call( + [ + *command, + "python", + str(contract_path), + "--output", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + "I", + "--fix", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "format", + str(output_dir), + ] + ) + + +if __name__ == "__main__": + print("Generating stream endpoint Nexus API...", file=sys.stderr) + generate_streams_nexus_api() + print("Done", file=sys.stderr) diff --git a/temporalio/streams/providers/_nexus_generated/__init__.py b/temporalio/streams/providers/_nexus_generated/__init__.py new file mode 100644 index 000000000..c62eaa6dd --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/__init__.py @@ -0,0 +1,23 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from ._definitions import Violation +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, +) +from .services import TemporalStreams + +__all__ = [ + "Violation", + "AppendInput", + "AppendOutput", + "ReadInput", + "ReadOutput", + "RecordWire", + "TemporalStreams", +] diff --git a/temporalio/streams/providers/_nexus_generated/_definitions.py b/temporalio/streams/providers/_nexus_generated/_definitions.py new file mode 100644 index 000000000..dc8de5bb5 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/_definitions.py @@ -0,0 +1,542 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import base64 +import collections.abc +import dataclasses +import datetime +import json +import re +import typing + +import temporalio.converter +import temporalio.exceptions + +__all__ = [ + "Violation", + "_binary64", + "_check_contains", + "_check_date_time", + "_check_duration", + "_check_time", + "_check_unique_items", + "_collect", + "_json_values_equal", + "_format_base64", + "_format_base64url", + "_format_date", + "_format_date_time", + "_format_duration", + "_format_time", + "_parse_base64", + "_parse_base64url", + "_parse_date", + "_parse_date_time", + "_parse_duration", + "_parse_spec_integer", + "_parse_time", + "_quote", + "_transfer_type_convertible", +] + + +@dataclasses.dataclass(frozen=True, slots=True) +class Violation: + """A single constraint failure, located by JSON path.""" + + path: str + reason: str + + +def _quote(value: object) -> str: + """Renders a value in the JSON form every target quotes offending values in.""" + + try: + return json.dumps(value, ensure_ascii=False) + except (TypeError, ValueError): + return repr(value) + + +def _collect( + violations: list[Violation], + path: str, + error: temporalio.exceptions.ApplicationError, +) -> None: + """Re-paths a nested model's violations under `path` and appends them.""" + + if error.type != "PayloadValidationError" or not error.details: + raise error + # Generated failures retain the original list as their first detail. The + # cast is type-checker-only and performs no serialization. + nested_violations = typing.cast(list[Violation], error.details[0]) + for inner in nested_violations: + # A nested violation about the value *itself* carries no path of its own + # (a union branch's own constraint, an element-level check), so the + # prefix is the whole path -- never a dangling separator (P11). + nested = f"{path}.{inner.path}" if inner.path else path + violations.append(Violation(path=nested, reason=inner.reason)) + + +_ModelT = typing.TypeVar("_ModelT") + + +def _transfer_type_convertible( + converter: type[temporalio.converter.TransferTypeConverter[typing.Any, typing.Any]], +) -> collections.abc.Callable[[type[_ModelT]], type[_ModelT]]: + """Registers a transfer type converter on a model class. + + Wraps `temporalio.converter.transfer_type_convertible` to erase the + converter's value-type parameter. Binding it directly on the decorated class + is circular for a static type checker -- the class's type depends on the + decorator, whose value type depends on the class -- which degrades the model + to `Unknown`. Erasing it here keeps the decorator idiomatic at each model and + resolves the cycle. + """ + + return temporalio.converter.transfer_type_convertible(converter) + + +_INTEGER_CAP = (1 << 53) - 1 + + +def _parse_spec_integer( + value: object, path: str, violations: list[Violation] +) -> int | None: + """Parses a JSON number as a spec integer (`1.0` accepted, `1.5` rejected).""" + + # `bool` is a subclass of `int`, so it must be excluded before the int check. + if isinstance(value, bool) or not isinstance(value, (int, float)): + violations.append(Violation(path=path, reason="expected integer")) + return None + if isinstance(value, float): + if not value.is_integer(): + violations.append(Violation(path=path, reason="expected integer")) + return None + out = int(value) + else: + out = value + if abs(out) > _INTEGER_CAP: + violations.append(Violation(path=path, reason="expected integer")) + return None + return out + + +def _binary64(value: float) -> float: + """Narrows a `number` value to the binary64 domain shared by every target.""" + + try: + return float(value) + except OverflowError: + # Past the binary64 range there is nothing to narrow to. The caller's + # finiteness check has already recorded that violation and will raise, so + # hand the value back rather than throwing out of turn and losing the + # other violations collected alongside it. + return value + + +def _json_values_equal(left: typing.Any, right: typing.Any) -> bool: + """Compares JSON values without Python's bool-as-int equality leak.""" + + left_is_number = isinstance(left, (int, float)) and not isinstance(left, bool) + right_is_number = isinstance(right, (int, float)) and not isinstance(right, bool) + if left_is_number or right_is_number: + return left_is_number and right_is_number and left == right + if type(left) is not type(right): + return False + if isinstance(left, list): + left_list = typing.cast("list[typing.Any]", left) + right_list = typing.cast("list[typing.Any]", right) + return len(left_list) == len(right_list) and all( + _json_values_equal(a, b) for a, b in zip(left_list, right_list) + ) + if isinstance(left, dict): + left_dict = typing.cast("dict[typing.Any, typing.Any]", left) + right_dict = typing.cast("dict[typing.Any, typing.Any]", right) + return left_dict.keys() == right_dict.keys() and all( + _json_values_equal(left_dict[key], right_dict[key]) for key in left_dict + ) + return left == right + + +def _check_unique_items( + value: list[typing.Any], path: str, violations: list[Violation] +) -> None: + """Asserts an array's elements are pairwise distinct.""" + + seen: list[typing.Any] = [] + for index, element in enumerate(value): + for earlier, previous in enumerate(seen): + if _json_values_equal(previous, element): + violations.append( + Violation( + path=path, + reason=( + f"duplicate items: element at index {index} " + f"equals index {earlier}" + ), + ) + ) + break + seen.append(element) + + +def _check_contains( + value: list[typing.Any], + matches: typing.Callable[[typing.Any], bool], + min_contains: int, + max_contains: int | None, + bounded_min: bool, + path: str, + violations: list[Violation], +) -> None: + """Asserts how many of an array's elements match the `contains` schema.""" + + match_count = sum(1 for element in value if matches(element)) + if match_count < min_contains: + if bounded_min: + violations.append( + Violation( + path=path, + reason=( + f"too few matching items: at least {min_contains}, " + f"got {match_count}" + ), + ) + ) + else: + violations.append( + Violation(path=path, reason="no element matches the required schema") + ) + if max_contains is not None and match_count > max_contains: + violations.append( + Violation( + path=path, + reason=( + f"too many matching items: at most {max_contains}, " + f"got {match_count}" + ), + ) + ) + + +_TEMPORAL_DATE_TIME_RE = re.compile( + r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])\Z" +) +_TEMPORAL_DATE_RE = re.compile(r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\Z") +_TEMPORAL_TIME_RE = re.compile( + r"^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])?\Z" +) +_TEMPORAL_DURATION_RE = re.compile( + r"^PT(?:[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?|[0-9]+M(?:[0-9]+S)?|[0-9]+S)\Z" +) +_TEMPORAL_MAX_DURATION_SECONDS = ((1 << 63) - 1) // 1_000_000_000 +# A duration component with more digits than the cap itself is over the cap +# whatever those digits are, which is how the magnitude is bounded before `int()` +# sees it: CPython refuses to convert a string of more than 4300 digits. +_TEMPORAL_MAX_DURATION_DIGITS = len(str(_TEMPORAL_MAX_DURATION_SECONDS)) +# `datetime` resolves to microseconds, and `fromisoformat` before Python 3.11 +# parses only the fraction widths `isoformat` writes. +_TEMPORAL_FRACTION_DIGITS = 6 + + +def _days_in_month(year: int, month: int) -> int: + if month in (1, 3, 5, 7, 8, 10, 12): + return 31 + if month in (4, 6, 9, 11): + return 30 + if month == 2: + return 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28 + return 0 + + +def _valid_temporal_calendar(value: str) -> bool: + if len(value) < 10: + return False + try: + year, month, day = int(value[0:4]), int(value[5:7]), int(value[8:10]) + except ValueError: + return False + # `datetime.MINYEAR` is 1, which is also the shared cross-language floor. + # Year 0000 is rejected rather than shifted into range, and + # `_temporal_reason` says so. + if year < datetime.MINYEAR: + return False + maximum = _days_in_month(year, month) + return maximum > 0 and 1 <= day <= maximum + + +def _temporal_reason(name: str, value: str) -> str: + """The reason a rejected temporal string is reported under. + + Year 0000 earns its own clause so the caller sees the shared calendar floor + rather than only a generic malformed-timestamp reason. + """ + + if value[0:4] == "0000": + return ( + f"must be a valid {name}, got {_quote(value)}: year 0000 is not" + f" representable (datetime.MINYEAR is {datetime.MINYEAR})" + ) + return f"must be a valid {name}, got {_quote(value)}" + + +def _temporal_isoformat(value: str) -> str: + """Rewrites a wire temporal into the spelling `fromisoformat` accepts. + + `Z` becomes `+00:00`, and the fractional second is padded or truncated to + exactly `_TEMPORAL_FRACTION_DIGITS`: before Python 3.11 `fromisoformat` + parses only what `isoformat` writes, so an RFC 3339 `.1` or `.1234567` -- + which every other target accepts -- would otherwise raise. Digits past the + sixth are dropped, the loss at `datetime`'s own resolution that P1 allows; + the canonical output re-trims the padding, so `.1` still writes as `.1`. + """ + + normalized = value.upper() + if normalized.endswith("Z"): + normalized = normalized[:-1] + "+00:00" + dot = normalized.find(".") + if dot < 0: + return normalized + end = dot + 1 + while end < len(normalized) and normalized[end].isdigit(): + end += 1 + fraction = normalized[dot + 1 : end].ljust(_TEMPORAL_FRACTION_DIGITS, "0") + return ( + normalized[: dot + 1] + fraction[:_TEMPORAL_FRACTION_DIGITS] + normalized[end:] + ) + + +def _parse_date_time( + value: str, path: str, violations: list[Violation] +) -> datetime.datetime | None: + if _TEMPORAL_DATE_TIME_RE.match(value) is None or not _valid_temporal_calendar( + value + ): + violations.append( + Violation(path=path, reason=_temporal_reason("date-time", value)) + ) + return None + return datetime.datetime.fromisoformat(_temporal_isoformat(value)) + + +def _parse_date( + value: str, path: str, violations: list[Violation] +) -> datetime.date | None: + if _TEMPORAL_DATE_RE.match(value) is None or not _valid_temporal_calendar(value): + violations.append(Violation(path=path, reason=_temporal_reason("date", value))) + return None + return datetime.date.fromisoformat(value) + + +def _parse_time( + value: str, path: str, violations: list[Violation] +) -> datetime.time | None: + if _TEMPORAL_TIME_RE.match(value) is None: + violations.append(Violation(path=path, reason=_temporal_reason("time", value))) + return None + return datetime.time.fromisoformat(_temporal_isoformat(value)) + + +def _parse_duration( + value: str, path: str, violations: list[Violation] +) -> datetime.timedelta | None: + if _TEMPORAL_DURATION_RE.match(value) is None: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + total = 0 + number = "" + for char in value[2:]: + if char.isdigit(): + number += char + continue + digits = number.lstrip("0") + number = "" + if len(digits) > _TEMPORAL_MAX_DURATION_DIGITS: + # Over the cap by digit count alone (see the constant), so the + # conversion `int()` would refuse is never attempted. + total = _TEMPORAL_MAX_DURATION_SECONDS + 1 + break + total += int(digits or "0") * {"H": 3600, "M": 60, "S": 1}[char] + if total > _TEMPORAL_MAX_DURATION_SECONDS: + break + if total > _TEMPORAL_MAX_DURATION_SECONDS: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + return datetime.timedelta(seconds=total) + + +def _check_temporal_offset( + name: str, + value: datetime.datetime | datetime.time, + offset: datetime.timedelta, + path: str, + violations: list[Violation], +) -> None: + """Asserts a UTC offset is a whole number of minutes, the finest the wire + form spells (`tzinfo` allows seconds, which the offset would silently lose). + """ + + if offset % datetime.timedelta(minutes=1): + violations.append( + Violation( + path=path, + reason=( + f"must be a valid {name}, got {_quote(str(value))}: " + f"the UTC offset {offset} is not a whole number of minutes" + ), + ) + ) + + +def _check_date_time( + value: datetime.datetime, path: str, violations: list[Violation] +) -> None: + """Asserts a datetime is writable as a wire date-time (P12). + + A dataclass is constructed unchecked, so a naive datetime -- with no offset + the required wire form could carry -- reaches serialize; without this it + would emit a value this module's own parser rejects. + """ + + offset = value.utcoffset() + if offset is None: + violations.append( + Violation( + path=path, + reason=( + f"must be a valid date-time, got {_quote(str(value))}: " + "a naive datetime carries no UTC offset" + ), + ) + ) + return + _check_temporal_offset("date-time", value, offset, path, violations) + + +def _check_time(value: datetime.time, path: str, violations: list[Violation]) -> None: + """Asserts a time is writable as a wire time (P12). The offset is optional in + the grammar, so only its precision is held to anything.""" + + offset = value.utcoffset() + if offset is not None: + _check_temporal_offset("time", value, offset, path, violations) + + +def _check_duration( + value: datetime.timedelta, path: str, violations: list[Violation] +) -> None: + """Asserts a timedelta is writable as a wire duration (P12): the grammar is + unsigned, whole-second and capped, and a `timedelta` is none of those.""" + + if value < datetime.timedelta(0): + reason = "a duration cannot be negative" + elif value % datetime.timedelta(seconds=1): + reason = "a duration cannot carry a fraction of a second" + elif value.total_seconds() > _TEMPORAL_MAX_DURATION_SECONDS: + reason = f"a duration cannot exceed {_TEMPORAL_MAX_DURATION_SECONDS} seconds" + else: + return + violations.append( + Violation( + path=path, + reason=f"must be a valid duration, got {_quote(str(value))}: {reason}", + ) + ) + + +def _temporal_frac(microsecond: int) -> str: + if microsecond == 0: + return "" + return "." + f"{microsecond:06d}".rstrip("0") + + +def _temporal_offset(value: datetime.datetime | datetime.time) -> str: + offset = value.utcoffset() + if offset is None: + return "" + total = int(offset.total_seconds()) + if total == 0: + return "Z" + sign = "+" if total > 0 else "-" + total = abs(total) + return f"{sign}{total // 3600:02d}:{(total % 3600) // 60:02d}" + + +def _format_date_time(value: datetime.datetime) -> str: + return ( + f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + f"T{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_date(value: datetime.date) -> str: + return f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + + +def _format_time(value: datetime.time) -> str: + return ( + f"{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_duration(value: datetime.timedelta) -> str: + total = int(value.total_seconds()) + if total == 0: + return "PT0S" + hours, remainder = divmod(total, 3600) + minutes, seconds = divmod(remainder, 60) + out = "PT" + if hours: + out += f"{hours}H" + if minutes: + out += f"{minutes}M" + if seconds: + out += f"{seconds}S" + return out + + +_BASE64_RE = re.compile( + "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?\\Z", + re.ASCII, +) +_BASE64URL_RE = re.compile( + "^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048])?\\Z", + re.ASCII, +) + + +def _parse_base64(value: str, path: str, violations: list[Violation]) -> bytes | None: + if _BASE64_RE.match(value) is None: + violations.append( + Violation(path=path, reason=f"must be base64-encoded, got {_quote(value)}") + ) + return None + return base64.b64decode(value, validate=True) + + +def _format_base64(value: bytes) -> str: + return base64.b64encode(value).decode("ascii") + + +def _parse_base64url( + value: str, path: str, violations: list[Violation] +) -> bytes | None: + if _BASE64URL_RE.match(value) is None: + violations.append( + Violation( + path=path, reason=f"must be base64url-encoded, got {_quote(value)}" + ) + ) + return None + return base64.urlsafe_b64decode(value + "=" * (-len(value) % 4)) + + +def _format_base64url(value: bytes) -> str: + return base64.urlsafe_b64encode(value).rstrip(b"=").decode("ascii") diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py new file mode 100644 index 000000000..f22711a4f --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -0,0 +1,670 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import dataclasses +import typing + +import typing_extensions + +import temporalio.converter +import temporalio.exceptions + +from ._definitions import ( + Violation, + _collect, + _parse_spec_integer, + _transfer_type_convertible, +) + + +class _AppendInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendInput"] + ) -> "AppendInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) + else: + stream_value_raw = raw["stream"] + if not isinstance(stream_value_raw, str): + violations.append(Violation(path="stream", reason="expected string")) + else: + stream_value = stream_value_raw + + producer_id_value: str = typing.cast("typing.Any", None) + if "producer_id" not in raw or raw["producer_id"] is None: + violations.append(Violation(path="producer_id", reason="required")) + else: + producer_id_value_raw = raw["producer_id"] + if not isinstance(producer_id_value_raw, str): + violations.append( + Violation(path="producer_id", reason="expected string") + ) + else: + producer_id_value = producer_id_value_raw + + attempt_value: int = typing.cast("typing.Any", None) + if "attempt" not in raw or raw["attempt"] is None: + violations.append(Violation(path="attempt", reason="required")) + else: + attempt_value_raw = raw["attempt"] + attempt_value_parsed = _parse_spec_integer( + attempt_value_raw, "attempt", violations + ) + if attempt_value_parsed is not None: + attempt_value = attempt_value_parsed + + batch_index_value: int = typing.cast("typing.Any", None) + if "batch_index" not in raw or raw["batch_index"] is None: + violations.append(Violation(path="batch_index", reason="required")) + else: + batch_index_value_raw = raw["batch_index"] + batch_index_value_parsed = _parse_spec_integer( + batch_index_value_raw, "batch_index", violations + ) + if batch_index_value_parsed is not None: + batch_index_value = batch_index_value_parsed + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + payloads_value: list[str] | None = None + if "payloads" in raw: + payloads_value_raw = raw["payloads"] + if payloads_value_raw is None: + violations.append( + Violation(path="payloads", reason="explicit null not allowed") + ) + else: + if not isinstance(payloads_value_raw, list): + violations.append( + Violation(path="payloads", reason="expected array") + ) + else: + payloads_value_list: list[str] = [] + for payloads_value_index, payloads_value_element in enumerate( + typing.cast("list[typing.Any]", payloads_value_raw) + ): + payloads_value_item_path = f"payloads[{payloads_value_index}]" + payloads_value_item_violation_count = len(violations) + payloads_value_item: str = typing.cast("typing.Any", None) + if not isinstance(payloads_value_element, str): + violations.append( + Violation( + path=payloads_value_item_path, + reason="expected string", + ) + ) + else: + payloads_value_item = payloads_value_element + if len(violations) == payloads_value_item_violation_count: + payloads_value_list.append(payloads_value_item) + payloads_value = payloads_value_list + + finish_value: bool | None = None + if "finish" in raw: + finish_value_raw = raw["finish"] + if finish_value_raw is None: + violations.append( + Violation(path="finish", reason="explicit null not allowed") + ) + else: + if not isinstance(finish_value_raw, bool): + violations.append( + Violation(path="finish", reason="expected boolean") + ) + else: + finish_value = finish_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "producer_id" + and key != "attempt" + and key != "batch_index" + and key != "topic" + and key != "payloads" + and key != "finish" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendInput( + workflow_id=workflow_id_value, + stream=stream_value, + producer_id=producer_id_value, + attempt=attempt_value, + batch_index=batch_index_value, + topic=topic_value, + payloads=payloads_value, + finish=finish_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + out["stream"] = value.stream + out["producer_id"] = value.producer_id + if abs(value.attempt) > 9007199254740991: + violations.append( + Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") + ) + out["attempt"] = value.attempt + if abs(value.batch_index) > 9007199254740991: + violations.append( + Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") + ) + out["batch_index"] = value.batch_index + if value.topic is not None: + out["topic"] = value.topic + if value.payloads is not None: + out["payloads"] = value.payloads + if value.finish is not None: + out["finish"] = value.finish + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_AppendInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendInput: + """One append call: who is writing, where, and what.""" + + workflow_id: str + """The workflow whose stream is being written.""" + + stream: str + """The named stream to append to. Empty when the producer writes to a topic instead.""" + + producer_id: str + """Identifies the writer across its retries, so its attempts can be ordered.""" + + attempt: int + """The generation this producer is writing. A later attempt supersedes an earlier one.""" + + batch_index: int + """Counts this producer's batches from 1. The handler drops an index it has already + written for this producer attempt. + """ + + topic: str | None = None + """The topic to append to, when stream is empty.""" + + payloads: list[str] | None = None + """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a + call that only finishes. + """ + + finish: bool | None = None + """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + + +class _AppendOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendOutput"] + ) -> "AppendOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + cursor_value: str | None = None + if "cursor" in raw: + cursor_value_raw = raw["cursor"] + if cursor_value_raw is None: + violations.append( + Violation(path="cursor", reason="explicit null not allowed") + ) + else: + if not isinstance(cursor_value_raw, str): + violations.append( + Violation(path="cursor", reason="expected string") + ) + else: + cursor_value = cursor_value_raw + + for key in raw: + if key != "cursor": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendOutput( + cursor=cursor_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + out: dict[str, typing.Any] = {} + if value.cursor is not None: + out["cursor"] = value.cursor + return out + + +@_transfer_type_convertible(_AppendOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + + cursor: str | None = None + """Opaque token naming the last record written by this call. Empty when the call + carried no payloads. + """ + + +class _ReadInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadInput"] + ) -> "ReadInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str | None = None + if "stream" in raw: + stream_value_raw = raw["stream"] + if stream_value_raw is None: + violations.append( + Violation(path="stream", reason="explicit null not allowed") + ) + else: + if not isinstance(stream_value_raw, str): + violations.append( + Violation(path="stream", reason="expected string") + ) + else: + stream_value = stream_value_raw + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + after_token_value: str | None = None + if "after_token" in raw: + after_token_value_raw = raw["after_token"] + if after_token_value_raw is None: + violations.append( + Violation(path="after_token", reason="explicit null not allowed") + ) + else: + if not isinstance(after_token_value_raw, str): + violations.append( + Violation(path="after_token", reason="expected string") + ) + else: + after_token_value = after_token_value_raw + + max_records_value: int | None = None + if "max_records" in raw: + max_records_value_raw = raw["max_records"] + if max_records_value_raw is None: + violations.append( + Violation(path="max_records", reason="explicit null not allowed") + ) + else: + max_records_value_parsed = _parse_spec_integer( + max_records_value_raw, "max_records", violations + ) + if max_records_value_parsed is not None: + max_records_value = max_records_value_parsed + + wait_ms_value: int | None = None + if "wait_ms" in raw: + wait_ms_value_raw = raw["wait_ms"] + if wait_ms_value_raw is None: + violations.append( + Violation(path="wait_ms", reason="explicit null not allowed") + ) + else: + wait_ms_value_parsed = _parse_spec_integer( + wait_ms_value_raw, "wait_ms", violations + ) + if wait_ms_value_parsed is not None: + wait_ms_value = wait_ms_value_parsed + + latest_only_value: bool | None = None + if "latest_only" in raw: + latest_only_value_raw = raw["latest_only"] + if latest_only_value_raw is None: + violations.append( + Violation(path="latest_only", reason="explicit null not allowed") + ) + else: + if not isinstance(latest_only_value_raw, bool): + violations.append( + Violation(path="latest_only", reason="expected boolean") + ) + else: + latest_only_value = latest_only_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "topic" + and key != "after_token" + and key != "max_records" + and key != "wait_ms" + and key != "latest_only" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadInput( + workflow_id=workflow_id_value, + stream=stream_value, + topic=topic_value, + after_token=after_token_value, + max_records=max_records_value, + wait_ms=wait_ms_value, + latest_only=latest_only_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + if value.stream is not None: + out["stream"] = value.stream + if value.topic is not None: + out["topic"] = value.topic + if value.after_token is not None: + out["after_token"] = value.after_token + if value.max_records is not None: + if abs(value.max_records) > 9007199254740991: + violations.append( + Violation( + path="max_records", reason="exceeds ±(2^53-1) integer cap" + ) + ) + out["max_records"] = value.max_records + if value.wait_ms is not None: + if abs(value.wait_ms) > 9007199254740991: + violations.append( + Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") + ) + out["wait_ms"] = value.wait_ms + if value.latest_only is not None: + out["latest_only"] = value.latest_only + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadInput: + """One read call: where to resume from and how long to wait.""" + + workflow_id: str + """The workflow whose stream is being read.""" + + stream: str | None = None + """The named stream to read. Empty reads every stream the workflow publishes.""" + + topic: str | None = None + """Yield only records on this topic. Empty yields every topic.""" + + after_token: str | None = None + """Opaque cursor from an earlier record or append. The read resumes strictly after the + record it names, so a caller never sees that record twice. Empty starts at the + beginning. The token is produced by whichever store sits behind the endpoint, so a + caller cannot tell which one that is. + """ + + max_records: int | None = None + """Return at most this many records. Defaults to 100 when omitted.""" + + wait_ms: int | None = None + """Wait at most this long for records to arrive before answering. Defaults to 5000 when + omitted. A call that collects nothing answers with no records and the caller's own + token. + """ + + latest_only: bool | None = None + """Answer with the newest position and no records, for a reader that wants to follow + from now. + """ + + +class _ReadOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadOutput"] + ) -> "ReadOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + records_value: list[RecordWire] | None = None + if "records" in raw: + records_value_raw = raw["records"] + if records_value_raw is None: + violations.append( + Violation(path="records", reason="explicit null not allowed") + ) + else: + if not isinstance(records_value_raw, list): + violations.append( + Violation(path="records", reason="expected array") + ) + else: + records_value_list: list[RecordWire] = [] + for records_value_index, records_value_element in enumerate( + typing.cast("list[typing.Any]", records_value_raw) + ): + records_value_item_path = f"records[{records_value_index}]" + records_value_item_violation_count = len(violations) + records_value_item: RecordWire = typing.cast("typing.Any", None) + try: + records_value_item = ( + _RecordWireTransferTypeConverter().from_transfer_type( + records_value_element, RecordWire + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, records_value_item_path, error) + if len(violations) == records_value_item_violation_count: + records_value_list.append(records_value_item) + records_value = records_value_list + + next_token_value: str | None = None + if "next_token" in raw: + next_token_value_raw = raw["next_token"] + if next_token_value_raw is None: + violations.append( + Violation(path="next_token", reason="explicit null not allowed") + ) + else: + if not isinstance(next_token_value_raw, str): + violations.append( + Violation(path="next_token", reason="expected string") + ) + else: + next_token_value = next_token_value_raw + + for key in raw: + if key != "records" and key != "next_token": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadOutput( + records=records_value, + next_token=next_token_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadOutput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + if value.records is not None: + records_out: list[typing.Any] = [] + for records_index, records_element in enumerate(value.records): + try: + records_out.append( + _RecordWireTransferTypeConverter().to_transfer_type( + records_element + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, f"records[{records_index}]", error) + out["records"] = records_out + if value.next_token is not None: + out["next_token"] = value.next_token + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadOutput: + """What one read call answered, and where to resume.""" + + records: list[RecordWire] | None = None + """The records after the caller's token, in stream order.""" + + next_token: str | None = None + """Opaque cursor to pass as after_token on the following call. Echoes the caller's own + token when the call collected nothing. + """ + + +class _RecordWireTransferTypeConverter( + temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["RecordWire"] + ) -> "RecordWire": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + token_value: str = typing.cast("typing.Any", None) + if "token" not in raw or raw["token"] is None: + violations.append(Violation(path="token", reason="required")) + else: + token_value_raw = raw["token"] + if not isinstance(token_value_raw, str): + violations.append(Violation(path="token", reason="expected string")) + else: + token_value = token_value_raw + + frame_value: str = typing.cast("typing.Any", None) + if "frame" not in raw or raw["frame"] is None: + violations.append(Violation(path="frame", reason="required")) + else: + frame_value_raw = raw["frame"] + if not isinstance(frame_value_raw, str): + violations.append(Violation(path="frame", reason="expected string")) + else: + frame_value = frame_value_raw + + for key in raw: + if key != "token" and key != "frame": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return RecordWire( + token=token_value, + frame=frame_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "RecordWire") -> typing.Any: + out: dict[str, typing.Any] = {} + out["token"] = value.token + out["frame"] = value.frame + return out + + +@_transfer_type_convertible(_RecordWireTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + + token: str + """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" + + frame: str + """The base64-encoded record frame, carrying the topic, kind, producer, attempt, + sequence and body. + """ diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py new file mode 100644 index 000000000..ce5604d81 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -0,0 +1,39 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from nexusrpc import Operation, service + +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, +) + + +@service +class TemporalStreams: + """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the + store behind it, so an operator switches storage without touching callers. Reads + hand out batches and an append carries one batch per call, because a Nexus operation + per record costs too much for token streams. + """ + + append: Operation[ + AppendInput, + AppendOutput, + ] = Operation(name="append") + """Append one batch on the caller's account. A repeated batch_index for the same + producer attempt is dropped, so a retried call writes once. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. + """ + + read: Operation[ + ReadInput, + ReadOutput, + ] = Operation(name="read") + """Answer with the records after the caller's token, or time out. The call parks until + it has max_records records or wait_ms elapses, whichever comes first, and returns + whatever it collected. + """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml new file mode 100644 index 000000000..ffa849509 --- /dev/null +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -0,0 +1,123 @@ +nexusrpc: "1.0.0" + +services: + TemporalStreams: + fqn: TemporalStreams + description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + operations: + append: + fqn: append + description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + input: { $ref: "#/$defs/AppendInput" } + output: { $ref: "#/$defs/AppendOutput" } + read: + fqn: read + description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + input: { $ref: "#/$defs/ReadInput" } + output: { $ref: "#/$defs/ReadOutput" } + +$defs: + AppendInput: + type: object + description: "One append call: who is writing, where, and what." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being written." + stream: + type: string + description: "The named stream to append to. Empty when the producer writes to a topic instead." + producer_id: + type: string + description: "Identifies the writer across its retries, so its attempts can be ordered." + attempt: + type: integer + description: "The generation this producer is writing. A later attempt supersedes an earlier one." + batch_index: + type: integer + description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + topic: + type: string + description: "The topic to append to, when stream is empty." + payloads: + type: array + items: + type: string + description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + finish: + type: boolean + description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + required: + - workflow_id + - stream + - producer_id + - attempt + - batch_index + additionalProperties: false + + AppendOutput: + type: object + description: "Where the append landed, empty when it wrote nothing." + properties: + cursor: + type: string + description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." + additionalProperties: false + + ReadInput: + type: object + description: "One read call: where to resume from and how long to wait." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being read." + stream: + type: string + description: "The named stream to read. Empty reads every stream the workflow publishes." + topic: + type: string + description: "Yield only records on this topic. Empty yields every topic." + after_token: + type: string + description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + max_records: + type: integer + description: "Return at most this many records. Defaults to 100 when omitted." + wait_ms: + type: integer + description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + latest_only: + type: boolean + description: "Answer with the newest position and no records, for a reader that wants to follow from now." + required: + - workflow_id + additionalProperties: false + + RecordWire: + type: object + description: "One record on the wire: its cursor and its base64 frame." + properties: + token: + type: string + description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + frame: + type: string + description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + required: + - token + - frame + additionalProperties: false + + ReadOutput: + type: object + description: "What one read call answered, and where to resume." + properties: + records: + type: array + items: + $ref: "#/$defs/RecordWire" + description: "The records after the caller's token, in stream order." + next_token: + type: string + description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." + additionalProperties: false From 9551e4e3f97e3e00cc1ed011ac60e2195c2eae05 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:30:01 -0700 Subject: [PATCH 443/831] Moved the nexus provider onto the generated contract. The five wire dataclasses and the service class now come from the generated module, so the contract has one source. Both halves read the operation and service names off the generated definition instead of hard-coding paths. Field names and operation names on the wire are unchanged. The one wire difference is that a read no longer sends max_records, wait_ms and latest_only when the caller leaves them at their defaults, because the contract marks them optional and the handler applies the documented defaults. Nothing outside this module and its tests speaks this wire. --- temporalio/streams/providers/nexus.py | 205 ++++++++++++-------------- 1 file changed, 93 insertions(+), 112 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 3701a70cb..8e19c2d4d 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -8,6 +8,12 @@ store behind the endpoint is invisible to callers and an operator switches it without touching them. +The wire types and the service definition come from +``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be +handed the same contract. What stays hand-written here is what the +generator cannot express yet: the handler's dedupe and long-poll collect +loop, and the caller's batching, cursor handling and codec. + Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Supersession records are not transported: the caller's reader re-synthesizes them from @@ -25,13 +31,11 @@ import asyncio import base64 -import dataclasses -import json import urllib.error import urllib.request from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta -from typing import Any +from typing import Any, TypeVar import nexusrpc import nexusrpc.handler @@ -42,71 +46,40 @@ from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams.providers._nexus_generated import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, + TemporalStreams, +) _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so configure one of those on the worker" ) +# The contract leaves these unset, so the handler is the one place that says +# what an omitted read bound means. +_DEFAULT_MAX_RECORDS = 100 +_DEFAULT_WAIT_MS = 5000 -@dataclasses.dataclass -class AppendInput: - """One append call: who is writing, where, and what.""" - - workflow_id: str - stream: str - producer_id: str - attempt: int - batch_index: int - topic: str = "" - payloads: list[str] = dataclasses.field(default_factory=list) - finish: bool = False - - -@dataclasses.dataclass -class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" - - cursor: str = "" - - -@dataclasses.dataclass -class ReadInput: - """One read call: where to resume from and how long to wait.""" - - workflow_id: str - stream: str = "" - topic: str = "" - after_token: str = "" - max_records: int = 100 - wait_ms: int = 5000 - # Answer with the newest position and no records, for a reader that - # wants to follow from now. - latest_only: bool = False - - -@dataclasses.dataclass -class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" - - token: str - frame: str - - -@dataclasses.dataclass -class ReadOutput: - """What one read call answered, and where to resume.""" - - records: list[RecordWire] = dataclasses.field(default_factory=list) - next_token: str = "" - - -@nexusrpc.service -class TemporalStreams: - """The stream endpoint's two operations.""" +_definition = nexusrpc.get_service_definition(TemporalStreams) +if _definition is None: # pragma: no cover + raise RuntimeError("the generated stream service carries no nexus definition") +# Both halves read the wire names off the generated definition, so a rename in +# the contract cannot leave the caller posting to a path the handler no longer +# serves. +_SERVICE_NAME = _definition.name +_OPERATION_NAMES = { + operation.method_name: operation.name + for operation in _definition.operation_definitions.values() +} +_APPEND_OPERATION = _OPERATION_NAMES["append"] +_READ_OPERATION = _OPERATION_NAMES["read"] - append: nexusrpc.Operation[AppendInput, AppendOutput] - read: nexusrpc.Operation[ReadInput, ReadOutput] +_OutputT = TypeVar("_OutputT") @nexusrpc.handler.service_handler(service=TemporalStreams) @@ -129,9 +102,10 @@ async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: """Append on the caller's account, dropping a repeated batch.""" + topic = input.topic or "" key = ( input.workflow_id, - input.stream or f"@{input.topic}", + input.stream or f"@{topic}", input.producer_id, input.attempt, ) @@ -143,7 +117,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, - topic=input.topic, + topic=topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -168,14 +142,18 @@ async def read( ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream + self._client, workflow_id=input.workflow_id, stream=input.stream or "" ) topic = input.topic or None if input.latest_only: return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + max_records = ( + _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records + ) + wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.after_token + next_token = input.after_token or "" subscription = delegate.read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, @@ -204,13 +182,13 @@ async def collect() -> None: ) ) next_token = record.cursor.token - if len(records) >= input.max_records: + if len(records) >= max_records: return try: # `wait_for` rather than `asyncio.timeout`, which 3.10 does not # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), input.wait_ms / 1000) + await asyncio.wait_for(collect(), wait_ms / 1000) except asyncio.TimeoutError: pass finally: @@ -222,20 +200,29 @@ async def collect() -> None: return ReadOutput(records=records, next_token=next_token) -def _post(url: str, body: dict) -> dict: +def _post(url: str, body: bytes) -> bytes: request = urllib.request.Request( url, - data=json.dumps(body).encode(), + data=body, headers={"Content-Type": "application/json"}, method="POST", ) try: with urllib.request.urlopen(request, timeout=30) as response: - raw = response.read() + return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") - return json.loads(raw) if raw else {} + + +async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller and + # the worker serving the operation agree on the body without either of + # them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: @@ -276,7 +263,7 @@ async def append(self, *values: Any) -> Cursor: else self._converter.to_payloads([value])[0] ) payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + return Cursor((await self._call(payloads=payloads)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -284,23 +271,21 @@ async def finish(self) -> None: async def _call( self, payloads: list[str] | None = None, finish: bool = False - ) -> dict: + ) -> AppendOutput: self._batch_index += 1 - return await asyncio.to_thread( - _post, - f"{self._base_url}/append", - dataclasses.asdict( - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ) + return await _invoke( + f"{self._base_url}/{_APPEND_OPERATION}", + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + topic=self._topic, + payloads=payloads or [], + finish=finish, ), + AppendOutput, ) @@ -327,28 +312,26 @@ async def read( attempts = AttemptTracker() token = after.token while True: - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - after_token=token, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + after_token=token, ), + ReadOutput, ) - for wire in raw.get("records", []): + for wire in answer.records or []: try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire["frame"]) + base64.b64decode(wire.frame) ) except ValueError: continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire["token"]) + cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -361,23 +344,21 @@ async def read( attempt=attempt, sequence=sequence, ) - token = raw.get("next_token", token) or token + token = answer.next_token or token async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - latest_only=True, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, ), + ReadOutput, ) - token = raw.get("next_token", "") + token = answer.next_token or "" return Cursor(token) if token else BEGINNING def _decode(self, body: bytes, as_type: type | None) -> Any: @@ -397,7 +378,7 @@ def __init__(self) -> None: def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", "TemporalStreams") + service = options.pop("service", _SERVICE_NAME) if options: raise TypeError( "the nexus provider takes endpoint, http_address and service, " From e570e000f87e764bd5778b3505311b7cba5ce6d3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:37:16 -0700 Subject: [PATCH 444/831] Applied the payload codec on the nexus provider's caller side. The caller ran the payload converter but never the codec, so records left the process in the clear even when one was configured. The producer now encodes before posting and the consumer decodes after reading, while the handler stays codec-blind, which is what keeps plaintext out of whoever hosts the endpoint. A data_converter option on the provider says which one to use when there is no client to take it from. --- CHANGELOG.md | 5 +- temporalio/streams/providers/nexus.py | 72 ++++++---- tests/streams/test_nexus_provider.py | 182 ++++++++++++++++++++++++-- 3 files changed, 223 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcc5e6866..9f662c135 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,7 +43,10 @@ to include examples, links to docs, or any other relevant information. naming it. - **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. + through the endpoint and never names the store. Its contract is defined in + `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. + Configure it with `data_converter=` to run a payload codec on the caller + side, so records are encoded before they leave the process. ### Changed diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8e19c2d4d..a73c830ef 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -231,7 +231,7 @@ class NexusProducer: def __init__( self, base_url: str, - converter: Any, + data_converter: temporalio.converter.DataConverter, workflow_id: str, stream: str, topic: str, @@ -240,7 +240,8 @@ def __init__( ) -> None: """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream self._topic = topic @@ -255,15 +256,22 @@ def attempt(self) -> int: async def append(self, *values: Any) -> Cursor: """Append ``values`` through the endpoint.""" - payloads = [] - for value in values: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).cursor or "") + payloads = [ + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + for value in values + ] + if self._codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._codec.encode(payloads) + encoded = [ + base64.b64encode(payload.SerializeToString()).decode() + for payload in payloads + ] + return Cursor((await self._call(payloads=encoded)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -293,11 +301,16 @@ class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + workflow_id: str, + stream: str, ) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream @@ -335,8 +348,11 @@ async def read( superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded + value = ( + await self._decode(body, type) if kind is RecordKind.DATA else None + ) yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, + value=value, cursor=cursor, kind=kind, topic=frame_topic, @@ -361,9 +377,11 @@ async def latest(self, *, topic: str | None = None) -> Cursor: token = answer.next_token or "" return Cursor(token) if token else BEGINNING - def _decode(self, body: bytes, as_type: type | None) -> Any: + async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) + if self._codec is not None: + payload = (await self._codec.decode([payload]))[0] if as_type is None: return self._converter.from_payloads([payload])[0] return self._converter.from_payloads([payload], [as_type])[0] @@ -374,19 +392,22 @@ class _NexusProvider: def __init__(self) -> None: self._base_url: str | None = None + self._data_converter: temporalio.converter.DataConverter | None = None def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") service = options.pop("service", _SERVICE_NAME) + data_converter = options.pop("data_converter", None) if options: raise TypeError( - "the nexus provider takes endpoint, http_address and service, " - f"got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service and " + f"data_converter, got {sorted(options)}" ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + self._data_converter = data_converter def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -427,7 +448,7 @@ async def producer( attempt = attempt or activity.info().attempt return NexusProducer( self._url(), - _converter(client), + self._converter(client), workflow_id, stream, topic, @@ -438,13 +459,14 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), _converter(client), workflow_id, stream) - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + + def _converter(self, client: Any) -> temporalio.converter.DataConverter: + if self._data_converter is not None: + return self._data_converter + if client is None: + return temporalio.converter.DataConverter.default + return client.data_converter _provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index f07e4956c..18679ad5f 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,40 +1,55 @@ -"""Live conformance for the Nexus front. +"""Conformance for the Nexus front. -The caller talks only to the stream endpoint over the server's Nexus HTTP -ingress; the handler worker delegates to the workflow_streams provider, so -this test is the provider-hiding demonstration: nothing on the caller side -names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it -needs a dev server with an HTTP port and a registered Nexus endpoint. +The caller talks only to the stream endpoint; the handler delegates to a +storage provider, so these tests are the provider-hiding demonstration: +nothing on the caller side names or could name the store. -Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), -``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named -``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +The loop test runs over the server's Nexus HTTP ingress and is gated behind +``STREAMS_LIVE=nexus`` because it needs a dev server with an HTTP port and a +registered Nexus endpoint. Environment: ``TEMPORAL_ADDRESS`` (default +``localhost:7233``), ``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), +and an endpoint named ``streams-e2e`` targeting task queue +``streams-handlers-e2e``. + +The codec test stands the endpoint up in this process instead, because what +it checks is the bytes the caller puts on the wire. """ from __future__ import annotations +import asyncio +import base64 +import dataclasses import json import os import subprocess import uuid +from collections.abc import Sequence +from typing import Any, cast import pytest +import temporalio.converter from temporalio import streams +from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams import _frame as frame from temporalio.streams._provider import instance +from temporalio.streams.providers import memory, nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take -pytestmark = pytest.mark.skipif( +live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", ) ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" +APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] def _endpoint_id() -> str: @@ -60,6 +75,7 @@ def _endpoint_id() -> str: return json.loads(out.stdout)["id"] +@live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. @@ -119,3 +135,149 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + + +class ScrambleCodec(temporalio.converter.PayloadCodec): + """Flips every byte of a payload, so the middle holds nothing readable.""" + + KEY = 0x5A + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Wrap each payload as opaque bytes nothing downstream can read.""" + return [ + Payload( + metadata={"encoding": b"binary/plain"}, + data=self._flip(payload.SerializeToString()), + ) + for payload in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Recover the payloads :meth:`encode` wrapped.""" + out: list[Payload] = [] + for payload in payloads: + inner = Payload() + inner.ParseFromString(self._flip(payload.data)) + out.append(inner) + return out + + @classmethod + def _flip(cls, data: bytes) -> bytes: + return bytes(byte ^ cls.KEY for byte in data) + + +async def _dispatch( + handler: TemporalStreamsHandler, operation: str, request: Any +) -> Any: + context = cast("Any", None) # neither operation looks at it + if operation == APPEND_OPERATION: + return await handler.append(context, request) + return await handler.read(context, request) + + +def _in_process_endpoint( + handler: TemporalStreamsHandler, + posted: list[bytes], + answered: list[bytes], +) -> Any: + """Serve the caller's posts from ``handler``, recording both directions.""" + contract = temporalio.converter.DataConverter.default.payload_converter + loop = asyncio.get_running_loop() + + def post(url: str, body: bytes) -> bytes: + posted.append(body) + operation = url.rsplit("/", 1)[1] + request_type = AppendInput if operation == APPEND_OPERATION else ReadInput + request: Any = contract.from_payloads( + [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] + )[0] + if request_type is ReadInput: + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + request.wait_ms = 200 + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + raw = contract.to_payloads([answer])[0].data + answered.append(raw) + return raw + + return post + + +async def _loop_through_an_endpoint( + monkeypatch: pytest.MonkeyPatch, + codec: temporalio.converter.PayloadCodec | None, +) -> tuple[list[Any], list[bytes], list[bytes]]: + memory.reset() + streams.configure(provider="memory") + posted: list[bytes] = [] + answered: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) + front = instance( + "nexus", + endpoint="in-process", + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + workflow_id = "wf-codec" + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"secret": "tuna"}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") + records = await take(consumer.read(type=dict), 2, timeout=30) + memory.reset() + return records, posted, answered + + +def _appended_bytes(posted: list[bytes]) -> bytes: + out = b"" + for body in posted: + for encoded in json.loads(body).get("payloads", []): + out += base64.b64decode(encoded) + return out + + +def _answered_bodies(answered: list[bytes]) -> bytes: + out = b"" + for body in answered: + for record in json.loads(body).get("records", []): + out += frame.decode(base64.b64decode(record["frame"]))[5] + return out + + +async def test_the_caller_encodes_records_with_the_configured_codec( + monkeypatch: pytest.MonkeyPatch, +): + records, posted, answered = await _loop_through_an_endpoint( + monkeypatch, ScrambleCodec() + ) + + # The value survives the hop, so the codec is applied on both sides. + assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"secret": "tuna"} + # Neither direction carried the plaintext. + assert b"tuna" not in _appended_bytes(posted) + assert b"tuna" not in _answered_bodies(answered) + + +async def test_without_a_codec_the_same_records_go_out_in_the_clear( + monkeypatch: pytest.MonkeyPatch, +): + # The contrast is the point: the bytes above differ because of the codec, + # not because the transport obscures them anyway. + records, posted, answered = await _loop_through_an_endpoint(monkeypatch, None) + + assert records[0].value == {"secret": "tuna"} + assert b"tuna" in _appended_bytes(posted) + assert b"tuna" in _answered_bodies(answered) From dac0b31ee9a750104acf6b8e062febe6a3d16aaf Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 445/831] Made the stream contract generator refuse a nexgen other than the pinned one. The output differs between releases, so a developer with another version on PATH would regenerate different code and only see the drift in CI. --- scripts/gen_streams_nexus_api.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py index 800aba944..2d4f16c6d 100644 --- a/scripts/gen_streams_nexus_api.py +++ b/scripts/gen_streams_nexus_api.py @@ -36,11 +36,26 @@ def nex_gen_command() -> list[str]: return ["nexgen"] +def check_version(command: list[str]) -> None: + # A different release on PATH would regenerate different code locally + # and the drift would only show in CI, so refuse before writing anything. + reported = subprocess.check_output([*command, "--version"], text=True).strip() + found = reported.split()[-1] if reported else "" + if found != NEX_GEN_VERSION: + raise SystemExit( + f"found nexgen {found or '?'} at {command[0]}, but the stream contract is " + f"generated with {NEX_GEN_VERSION}. Install it with `cargo install --locked " + f"nexgen --version {NEX_GEN_VERSION} --features advanced` or point " + "NEX_GEN_BIN at that binary." + ) + + def generate_streams_nexus_api() -> None: if not contract_path.exists(): raise RuntimeError(f"missing stream contract: {contract_path}") command = nex_gen_command() + check_version(command) shutil.rmtree(output_dir, ignore_errors=True) subprocess.check_call( [ From 3af55aad588c52230f16b866acaac8de62f62ceb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 446/831] Regenerated the stream contract with byte payloads, read bounds and tolerant outputs. Payload fields carry contentEncoding base64 so both halves pass bytes and the generated code does the encoding. max_records and wait_ms carry the bounds the validator enforces, outputs accept unknown fields so a handler can add one before every caller is rebuilt, and descriptions are folded at 100 columns. --- .../providers/_nexus_generated/models.py | 201 +++++++++++++++--- .../providers/_nexus_generated/services.py | 8 +- .../providers/temporal_streams.nexusrpc.yaml | 108 ++++++++-- 3 files changed, 261 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index f22711a4f..d00cbcc63 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -13,10 +13,20 @@ from ._definitions import ( Violation, _collect, + _format_base64, + _parse_base64, _parse_spec_integer, _transfer_type_convertible, ) +_APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) + + +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) + + +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) + class _AppendInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] @@ -87,6 +97,13 @@ def from_transfer_type( ) if batch_index_value_parsed is not None: batch_index_value = batch_index_value_parsed + if batch_index_value < 1: + violations.append( + Violation( + path="batch_index", + reason=f"must be >= 1, got {batch_index_value}", + ) + ) topic_value: str | None = None if "topic" in raw: @@ -101,7 +118,7 @@ def from_transfer_type( else: topic_value = topic_value_raw - payloads_value: list[str] | None = None + payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] if payloads_value_raw is None: @@ -114,13 +131,13 @@ def from_transfer_type( Violation(path="payloads", reason="expected array") ) else: - payloads_value_list: list[str] = [] + payloads_value_list: list[bytes] = [] for payloads_value_index, payloads_value_element in enumerate( typing.cast("list[typing.Any]", payloads_value_raw) ): payloads_value_item_path = f"payloads[{payloads_value_index}]" payloads_value_item_violation_count = len(violations) - payloads_value_item: str = typing.cast("typing.Any", None) + payloads_value_item: bytes = typing.cast("typing.Any", None) if not isinstance(payloads_value_element, str): violations.append( Violation( @@ -129,7 +146,13 @@ def from_transfer_type( ) ) else: - payloads_value_item = payloads_value_element + payloads_value_item_parsed = _parse_base64( + payloads_value_element, + payloads_value_item_path, + violations, + ) + if payloads_value_item_parsed is not None: + payloads_value_item = payloads_value_item_parsed if len(violations) == payloads_value_item_violation_count: payloads_value_list.append(payloads_value_item) payloads_value = payloads_value_list @@ -190,11 +213,17 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") ) + if value.batch_index < 1: + violations.append( + Violation( + path="batch_index", reason=f"must be >= 1, got {value.batch_index}" + ) + ) out["batch_index"] = value.batch_index if value.topic is not None: out["topic"] = value.topic if value.payloads is not None: - out["payloads"] = value.payloads + out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: out["finish"] = value.finish if violations: @@ -221,15 +250,16 @@ class AppendInput: batch_index: int """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt. + written for this producer attempt, and rejects one that skips ahead or that resumes + an attempt it never saw start. """ topic: str | None = None """The topic to append to, when stream is empty.""" - payloads: list[str] | None = None - """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a - call that only finishes. + payloads: list[bytes] | None = None + """The records to write, each a serialized Temporal Payload. Empty on a call that only + finishes. """ finish: bool | None = None @@ -265,33 +295,53 @@ def from_transfer_type( else: cursor_value = cursor_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "cursor": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _APPEND_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return AppendOutput( cursor=cursor_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} if value.cursor is not None: out["cursor"] = value.cursor + for key, entry in value.additional_properties.items(): + if key in _APPEND_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_AppendOutputTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" + """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Empty when the call - carried no payloads. + """Opaque token naming the last record written by this call. Absent when the call + carried no payloads, when the batch was a repeat the handler dropped, or when the + store learns positions only at read time. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _ReadInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] @@ -375,6 +425,20 @@ def from_transfer_type( ) if max_records_value_parsed is not None: max_records_value = max_records_value_parsed + if max_records_value < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {max_records_value}", + ) + ) + if max_records_value > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {max_records_value}", + ) + ) wait_ms_value: int | None = None if "wait_ms" in raw: @@ -389,6 +453,20 @@ def from_transfer_type( ) if wait_ms_value_parsed is not None: wait_ms_value = wait_ms_value_parsed + if wait_ms_value < 0: + violations.append( + Violation( + path="wait_ms", + reason=f"must be >= 0, got {wait_ms_value}", + ) + ) + if wait_ms_value > 60000: + violations.append( + Violation( + path="wait_ms", + reason=f"must be <= 60000, got {wait_ms_value}", + ) + ) latest_only_value: bool | None = None if "latest_only" in raw: @@ -446,12 +524,38 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: path="max_records", reason="exceeds ±(2^53-1) integer cap" ) ) + if value.max_records < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {value.max_records}", + ) + ) + if value.max_records > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {value.max_records}", + ) + ) out["max_records"] = value.max_records if value.wait_ms is not None: if abs(value.wait_ms) > 9007199254740991: violations.append( Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") ) + if value.wait_ms < 0: + violations.append( + Violation( + path="wait_ms", reason=f"must be >= 0, got {value.wait_ms}" + ) + ) + if value.wait_ms > 60000: + violations.append( + Violation( + path="wait_ms", reason=f"must be <= 60000, got {value.wait_ms}" + ) + ) out["wait_ms"] = value.wait_ms if value.latest_only is not None: out["latest_only"] = value.latest_only @@ -472,7 +576,9 @@ class ReadInput: """The named stream to read. Empty reads every stream the workflow publishes.""" topic: str | None = None - """Yield only records on this topic. Empty yields every topic.""" + """Yield only records on this topic. Empty yields every topic. Only meaningful when + stream is empty, because an inbound stream has no topics. + """ after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the @@ -485,9 +591,9 @@ class ReadInput: """Return at most this many records. Defaults to 100 when omitted.""" wait_ms: int | None = None - """Wait at most this long for records to arrive before answering. Defaults to 5000 when - omitted. A call that collects nothing answers with no records and the caller's own - token. + """Wait at most this long for records to arrive before answering. The handler shortens + it to fit the request deadline. A call that collects nothing answers with no records + and the caller's own token. """ latest_only: bool | None = None @@ -557,14 +663,16 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "records" and key != "next_token": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _READ_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return ReadOutput( records=records_value, next_token=next_token_value, + additional_properties=additional_properties, ) @typing_extensions.override @@ -585,6 +693,16 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + for key, entry in value.additional_properties.items(): + if key in _READ_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry if violations: raise temporalio.converter.create_payload_validation_error(violations) return out @@ -603,6 +721,10 @@ class ReadOutput: token when the call collected nothing. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _RecordWireTransferTypeConverter( temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] @@ -628,7 +750,7 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: str = typing.cast("typing.Any", None) + frame_value: bytes = typing.cast("typing.Any", None) if "frame" not in raw or raw["frame"] is None: violations.append(Violation(path="frame", reason="required")) else: @@ -636,35 +758,54 @@ def from_transfer_type( if not isinstance(frame_value_raw, str): violations.append(Violation(path="frame", reason="expected string")) else: - frame_value = frame_value_raw + frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) + if frame_value_parsed is not None: + frame_value = frame_value_parsed + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "token" and key != "frame": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _RECORD_WIRE_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, frame=frame_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "RecordWire") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = value.frame + out["frame"] = _format_base64(value.frame) + for key, entry in value.additional_properties.items(): + if key in _RECORD_WIRE_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" + """One record on the wire: its cursor and its frame.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: str - """The base64-encoded record frame, carrying the topic, kind, producer, attempt, - sequence and body. - """ + frame: bytes + """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index ce5604d81..e0673aeab 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -24,9 +24,11 @@ class TemporalStreams: AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. A repeated batch_index for the same - producer attempt is dropped, so a retried call writes once. Supersession records are - not transported: a reader re-synthesizes them from the attempts it observes. + """Append one batch on the caller's account. The handler drops a batch_index it has + already written for this producer attempt, so a retried call writes once, and + rejects an index that skips ahead or a producer attempt it has no state for. + Supersession records are not transported: a reader re-synthesizes them from the + attempts it observes. """ read: Operation[ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index ffa849509..a1cc34631 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -1,18 +1,35 @@ +# The stream endpoint's wire contract. Inputs reject unknown fields so a typo +# fails loudly at the handler; outputs accept them so a handler can add a +# field before every caller has been rebuilt from the newer contract. nexusrpc: "1.0.0" services: TemporalStreams: fqn: TemporalStreams - description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + description: >- + The stream endpoint's two operations. One Temporal-authenticated endpoint + hides the store behind it, so an operator switches storage without + touching callers. Reads hand out batches and an append carries one batch + per call, because a Nexus operation per record costs too much for token + streams. operations: append: fqn: append - description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + description: >- + Append one batch on the caller's account. The handler drops a + batch_index it has already written for this producer attempt, so a + retried call writes once, and rejects an index that skips ahead or a + producer attempt it has no state for. Supersession records are not + transported: a reader re-synthesizes them from the attempts it + observes. input: { $ref: "#/$defs/AppendInput" } output: { $ref: "#/$defs/AppendOutput" } read: fqn: read - description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + description: >- + Answer with the records after the caller's token, or time out. The + call parks until it has max_records records or wait_ms elapses, + whichever comes first, and returns whatever it collected. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -26,16 +43,26 @@ $defs: description: "The workflow whose stream is being written." stream: type: string - description: "The named stream to append to. Empty when the producer writes to a topic instead." + description: >- + The named stream to append to. Empty when the producer writes to a + topic instead. producer_id: type: string - description: "Identifies the writer across its retries, so its attempts can be ordered." + description: >- + Identifies the writer across its retries, so its attempts can be + ordered. attempt: type: integer - description: "The generation this producer is writing. A later attempt supersedes an earlier one." + description: >- + The generation this producer is writing. A later attempt supersedes + an earlier one. batch_index: type: integer - description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + minimum: 1 + description: >- + Counts this producer's batches from 1. The handler drops an index it + has already written for this producer attempt, and rejects one that + skips ahead or that resumes an attempt it never saw start. topic: type: string description: "The topic to append to, when stream is empty." @@ -43,10 +70,15 @@ $defs: type: array items: type: string - description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + contentEncoding: base64 + description: >- + The records to write, each a serialized Temporal Payload. Empty on a + call that only finishes. finish: type: boolean - description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + description: >- + Mark this producer done after writing the batch, so a reader stops + waiting on it. required: - workflow_id - stream @@ -57,12 +89,16 @@ $defs: AppendOutput: type: object - description: "Where the append landed, empty when it wrote nothing." + description: "Where the append landed, when the store can say." properties: cursor: type: string - description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." - additionalProperties: false + description: >- + Opaque token naming the last record written by this call. Absent + when the call carried no payloads, when the batch was a repeat the + handler dropped, or when the store learns positions only at read + time. + additionalProperties: true ReadInput: type: object @@ -73,40 +109,64 @@ $defs: description: "The workflow whose stream is being read." stream: type: string - description: "The named stream to read. Empty reads every stream the workflow publishes." + description: >- + The named stream to read. Empty reads every stream the workflow + publishes. topic: type: string - description: "Yield only records on this topic. Empty yields every topic." + description: >- + Yield only records on this topic. Empty yields every topic. Only + meaningful when stream is empty, because an inbound stream has no + topics. after_token: type: string - description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + description: >- + Opaque cursor from an earlier record or append. The read resumes + strictly after the record it names, so a caller never sees that + record twice. Empty starts at the beginning. The token is produced by + whichever store sits behind the endpoint, so a caller cannot tell + which one that is. max_records: type: integer + minimum: 1 + maximum: 1000 description: "Return at most this many records. Defaults to 100 when omitted." wait_ms: type: integer - description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + minimum: 0 + maximum: 60000 + description: >- + Wait at most this long for records to arrive before answering. The + handler shortens it to fit the request deadline. A call that collects + nothing answers with no records and the caller's own token. latest_only: type: boolean - description: "Answer with the newest position and no records, for a reader that wants to follow from now." + description: >- + Answer with the newest position and no records, for a reader that + wants to follow from now. required: - workflow_id additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its base64 frame." + description: "One record on the wire: its cursor and its frame." properties: token: type: string - description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + description: >- + Opaque cursor naming this record. Pass it as after_token to resume + just past it. frame: type: string - description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + contentEncoding: base64 + description: >- + The record frame, carrying the topic, kind, producer, attempt, + sequence and body. required: - token - frame - additionalProperties: false + additionalProperties: true ReadOutput: type: object @@ -119,5 +179,7 @@ $defs: description: "The records after the caller's token, in stream order." next_token: type: string - description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." - additionalProperties: false + description: >- + Opaque cursor to pass as after_token on the following call. Echoes + the caller's own token when the call collected nothing. + additionalProperties: true From 16db22fa79daa39aa567908733d52dd85c4d54b3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 447/831] Reworked the Nexus front's dedupe, reads, error mapping and endpoint lookup. The handler refuses to continue a producer attempt it has no state for and rejects an index that skips ahead, so a restarted or load-balanced handler cannot lose records behind a success answer. Reads come from one parked subscription per stream, pass bodies through as raw payloads so a codec survives the hop, and stop at the request deadline. The caller commits its batch index only after the endpoint answered, resends a failed batch under the same index, maps transport failures to one error type, and resolves an endpoint name through the operator service. --- temporalio/streams/providers/nexus.py | 685 +++++++++++++++++++------- 1 file changed, 508 insertions(+), 177 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index a73c830ef..8c311d1d9 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -15,33 +15,51 @@ loop, and the caller's batching, cursor handling and codec. Reads hand out batches and an append carries one batch per call, because a -Nexus operation per record costs too much for token streams. Supersession -records are not transported: the caller's reader re-synthesizes them from -the attempts it observes, which is the policy module's job on every -provider. Cursors pass through opaque, so the caller cannot tell which store -produced them. - -One stated prototype limit: append deduplication holds at the handler by -batch index per producer, so a handler restart during a producer's life can -double-append. The store-level fix, a sequence-explicit append in the IDL -contract, is listed in the design doc's work table. +Nexus operation per record costs too much for token streams. Record bodies +cross the handler untouched: it reads the store as raw payloads and frames +them as they are, so a codec that changes the payload encoding survives the +hop and the handler's worker never needs the key. Supersession records are +not transported: the caller's reader re-synthesizes them from the attempts +it observes, which is the policy module's job on every provider. Cursors +pass through opaque, so the caller cannot tell which store produced them. + +The handler keeps one parked read per ``(workflow, stream, topic)`` and +serves consecutive calls from it, so an idle caller does not leave one +abandoned long poll on the store per call. A call whose token does not +match the parked position replaces the subscription, and an idle one is +released after a minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, +by batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh +delegate whose numbering the store would drop as a repeat; the caller opens +a new attempt, which readers report as a supersession. The store-level fix, +a sequence-explicit append in the contract, is listed in the design doc's +work table. And any caller the endpoint admits may touch any workflow's +streams in the namespace; the endpoint's own authorization is the boundary. """ from __future__ import annotations import asyncio -import base64 +import logging +import time import urllib.error import urllib.request -from collections.abc import AsyncGenerator, AsyncIterator -from datetime import timedelta +from collections import OrderedDict +from collections.abc import AsyncGenerator, Mapping +from dataclasses import dataclass +from datetime import datetime, timedelta, timezone from typing import Any, TypeVar import nexusrpc import nexusrpc.handler +from google.protobuf.message import DecodeError import temporalio.converter from temporalio.api.common.v1 import Payload +from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.common import RawValue from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -61,9 +79,16 @@ ) # The contract leaves these unset, so the handler is the one place that says -# what an omitted read bound means. +# what an omitted read bound means. The wait is long because the handler +# shortens it to the request deadline anyway, and a shorter default only +# means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 5000 +_DEFAULT_WAIT_MS = 30_000 +_DEADLINE_MARGIN = timedelta(milliseconds=500) +_DEFAULT_MAX_PRODUCERS = 10_000 +_DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) +_QUEUE_DEPTH = 1000 +_APPEND_TIMEOUT_MS = 30_000 _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -81,6 +106,34 @@ _OutputT = TypeVar("_OutputT") +logger = logging.getLogger(__name__) + + +def _bad_request(message: str) -> nexusrpc.HandlerError: + return nexusrpc.HandlerError( + message, + type=nexusrpc.HandlerErrorType.BAD_REQUEST, + retryable_override=False, + ) + + +@dataclass +class _Subscription: + """One parked read on the store, shared by consecutive calls.""" + + records: asyncio.Queue[StreamRecord[Any]] + position: str + last_used: float + pump: asyncio.Task[None] | None = None + failure: BaseException | None = None + done: bool = False + + +@dataclass +class _ProducerState: + delegate: Any + batch_index: int + @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: @@ -91,17 +144,45 @@ class TemporalStreamsHandler: run handlers for a new store next to handlers for the old one. """ - def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: - """Serve the endpoint out of the provider named by ``provider``.""" + def __init__( + self, + client: Any, + provider: str, + *, + max_producers: int = _DEFAULT_MAX_PRODUCERS, + subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, + **provider_options: Any, + ) -> None: + """Serve the endpoint out of the provider named by ``provider``. + + ``max_producers`` bounds the dedupe state kept per producer attempt; + the oldest is evicted, and a producer evicted mid-life gets a clear + refusal on its next batch rather than a silent drop. + ``subscription_idle`` is how long a parked read outlives its last + caller. + """ self._client = client self._delegate = _provider.instance(provider, **provider_options) - self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + OrderedDict() + ) + self._max_producers = max_producers + self._subscriptions: dict[tuple[str, str, str], _Subscription] = {} + self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} + self._subscription_idle = subscription_idle.total_seconds() @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch.""" + """Append on the caller's account, dropping a repeated batch. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips + ahead, when it continues a producer attempt this handler has + no state for, or when a payload is not a serialized + ``Payload``. + """ topic = input.topic or "" key = ( input.workflow_id, @@ -109,10 +190,18 @@ async def append( input.producer_id, input.attempt, ) - cached = self._producers.get(key) - if cached is not None and input.batch_index <= cached[1]: - return AppendOutput() - if cached is None: + state = self._producers.get(key) + if state is None: + if input.batch_index != 1: + # A fresh delegate would restart its numbering at zero, and + # the store would drop that as a repeat of the first batch. + # Refusing here turns a silent loss into a failure the caller + # can act on by opening a new attempt. + raise _bad_request( + f"producer {input.producer_id!r} attempt {input.attempt} resumed " + f"at batch {input.batch_index} on a handler that has no state for " + "it; open a new attempt" + ) delegate = await self._delegate.producer( self._client, workflow_id=input.workflow_id, @@ -121,117 +210,304 @@ async def append( producer_id=input.producer_id, attempt=input.attempt, ) - else: - delegate = cached[0] - self._producers[key] = (delegate, input.batch_index) - cursor = "" - if input.payloads: - payloads = [] - for encoded in input.payloads: - payload = Payload() - payload.ParseFromString(base64.b64decode(encoded)) - payloads.append(payload) - cursor = (await delegate.append(*payloads)).token + state = _ProducerState(delegate, 0) + elif input.batch_index <= state.batch_index: + # A repeat, or a producer that restarted its numbering: either + # way the store already holds the batch. + self._producers.move_to_end(key) + return AppendOutput() + elif input.batch_index != state.batch_index + 1: + raise _bad_request( + f"batch {input.batch_index} skips ahead of {state.batch_index} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) + payloads = self._payloads(input.payloads) + cursor: str | None = None + if payloads: + appended = await state.delegate.append(*payloads) + cursor = appended.token if appended is not None else None if input.finish: - await delegate.finish() + await state.delegate.finish() + self._producers.pop(key, None) + return AppendOutput(cursor=cursor) + # Recorded only once the store accepted the batch, so a failed append + # is not mistaken for a repeat when the caller retries it. + state.batch_index = input.batch_index + self._producers[key] = state + self._producers.move_to_end(key) + while len(self._producers) > self._max_producers: + self._producers.popitem(last=False) return AppendOutput(cursor=cursor) + @staticmethod + def _payloads(encoded: list[bytes] | None) -> list[Payload]: + payloads = [] + for index, raw in enumerate(encoded or []): + payload = Payload() + try: + payload.ParseFromString(raw) + except DecodeError as error: + raise _bad_request( + f"payloads[{index}] is not a serialized Temporal Payload: {error}" + ) from error + payloads.append(payload) + return payloads + @nexusrpc.handler.sync_operation async def read( - self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream or "" - ) + stream = input.stream or "" topic = input.topic or None if input.latest_only: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=stream + ) return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms - converter = temporalio.converter.DataConverter.default.payload_converter - records: list[RecordWire] = [] - next_token = input.after_token or "" - subscription = delegate.read( - after=Cursor(input.after_token) if input.after_token else BEGINNING, - topic=topic, - ) - - async def collect() -> None: - nonlocal next_token - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + if ctx.request_deadline is not None: + # The server answers the caller with a timeout at the deadline + # whatever this call does, so collecting past it only holds the + # slot for an answer nobody receives. + deadline = ctx.request_deadline + if deadline.tzinfo is None: + deadline = deadline.replace(tzinfo=timezone.utc) + left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN + wait = max(0.0, min(wait, left.total_seconds())) + after = input.after_token or "" + key = (input.workflow_id, stream, topic or "") + await self._expire_subscriptions() + lock = self._read_locks.setdefault(key, asyncio.Lock()) + async with lock: + subscription = self._subscriptions.get(key) + if subscription is None or subscription.position != after: + if subscription is not None: + await self._drop(key) + subscription = await self._subscribe( + key, input.workflow_id, stream, topic, after ) - next_token = record.cursor.token - if len(records) >= max_records: - return + records, next_token = await self._drain(subscription, max_records, wait) + subscription.position = next_token + subscription.last_used = time.monotonic() + if subscription.done and subscription.records.empty(): + # The store ended the read, as the Workflow Streams delegate + # does when the run closes. Nothing more will arrive on it. + await self._drop(key) + return ReadOutput(records=records, next_token=next_token) + + async def _subscribe( + self, + key: tuple[str, str, str], + workflow_id: str, + stream: str, + topic: str | None, + after: str, + ) -> _Subscription: + delegate = await self._delegate.consumer( + self._client, workflow_id=workflow_id, stream=stream + ) + # Raw payloads: the handler frames what the store holds without + # decoding it, so an encoding only the caller's codec understands + # passes through untouched. + source = delegate.read( + after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + ) + subscription = _Subscription( + records=asyncio.Queue(maxsize=_QUEUE_DEPTH), + position=after, + last_used=time.monotonic(), + ) + async def pump() -> None: + try: + async for record in source: + if record.kind is RecordKind.SUPERSEDED: + continue + await subscription.records.put(record) + except asyncio.CancelledError: + raise + except Exception as error: + subscription.failure = error + finally: + subscription.done = True + if isinstance(source, AsyncGenerator): + await source.aclose() + + subscription.pump = asyncio.create_task(pump()) + self._subscriptions[key] = subscription + return subscription + + async def _drain( + self, subscription: _Subscription, max_records: int, wait: float + ) -> tuple[list[RecordWire], str]: + records: list[RecordWire] = [] + next_token = subscription.position + queue = subscription.records + deadline = time.monotonic() + wait + while len(records) < max_records: + if queue.empty(): + remaining = deadline - time.monotonic() + if records or remaining <= 0: + break + if subscription.done: + # Honour the wait even though nothing can arrive, so a + # caller polling a closed stream does not spin on the + # endpoint. + await asyncio.sleep(remaining) + break + try: + record = await asyncio.wait_for(queue.get(), remaining) + except asyncio.TimeoutError: + break + else: + record = queue.get_nowait() + records.append(self._wire(record)) + next_token = record.cursor.token + if not records and subscription.failure is not None: + failure, subscription.failure = subscription.failure, None + raise failure + return records, next_token + + @staticmethod + def _wire(record: StreamRecord[Any]) -> RecordWire: + body = ( + record.value.payload.SerializeToString() + if isinstance(record.value, RawValue) + else b"" + ) + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + return RecordWire(token=record.cursor.token, frame=frame) + + async def close(self) -> None: + """Release every parked read. + + Call it when the worker hosting this handler stops, so subscriptions + waiting on the store do not outlive it. + """ + for key in list(self._subscriptions): + await self._drop(key) + self._read_locks.clear() + + async def _drop(self, key: tuple[str, str, str]) -> None: + subscription = self._subscriptions.pop(key, None) + if subscription is None or subscription.pump is None: + return + subscription.pump.cancel() try: - # `wait_for` rather than `asyncio.timeout`, which 3.10 does not - # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), wait_ms / 1000) - except asyncio.TimeoutError: + await subscription.pump + except (asyncio.CancelledError, Exception): pass - finally: - # The delegate's read parks against its store, and this call - # answers before the caller asks again, so let it go now rather - # than when the collector is next swept. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - return ReadOutput(records=records, next_token=next_token) + async def _expire_subscriptions(self) -> None: + cutoff = time.monotonic() - self._subscription_idle + for key in [k for k, s in self._subscriptions.items() if s.last_used < cutoff]: + lock = self._read_locks.get(key) + if lock is not None and lock.locked(): + continue + await self._drop(key) + self._read_locks.pop(key, None) + + +class StreamEndpointError(RuntimeError): + """The stream endpoint refused a call or could not be reached. -def _post(url: str, body: bytes) -> bytes: + ``status`` is the HTTP status when the endpoint answered, and ``None`` + when the connection itself failed. + """ + + def __init__(self, message: str, *, status: int | None = None) -> None: + """Carry the endpoint's answer, or the reason it gave none.""" + super().__init__(message) + self.status = status + + +def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: request = urllib.request.Request( url, data=body, - headers={"Content-Type": "application/json"}, + headers={ + "Content-Type": "application/json", + # Tells the server how long the handler may park, so it does not + # time the call out ahead of a wait the caller asked for. + "Request-Timeout": f"{timeout_ms}ms", + **headers, + }, method="POST", ) try: - with urllib.request.urlopen(request, timeout=30) as response: + with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") - raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + raise StreamEndpointError( + f"stream endpoint call failed ({error.code}): {detail}", status=error.code + ) from error + except urllib.error.URLError as error: + raise StreamEndpointError( + f"stream endpoint unreachable at {url}: {error.reason}" + ) from error + +class _Front: + """Everything the caller half needs to reach one endpoint.""" -async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: - # The contract types carry their own JSON encoding, so the raw caller and - # the worker serving the operation agree on the body without either of - # them spelling the fields out. - contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) - payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") - return contract.from_payloads([payload], [output])[0] + def __init__( + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + headers: Mapping[str, str], + wait_ms: int, + max_records: int, + ) -> None: + self.base_url = base_url + self.converter = data_converter.payload_converter + self.codec = data_converter.payload_codec + self.headers = dict(headers) + self.wait_ms = wait_ms + self.max_records = max_records + + async def invoke( + self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + ) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller + # and the worker serving the operation agree on the body without + # either of them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread( + _post, + f"{self.base_url}/{operation}", + contract.to_payloads([request])[0].data, + self.headers, + timeout_ms, + ) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it.""" + """Appends through the stream endpoint; framing happens behind it. + + Calls are serialized and the batch index is committed only once the + endpoint answered. A batch whose call raised stays pending and is sent + again under the same index, either when the caller retries the same + values or ahead of whatever the caller sends next, so an ambiguous + failure writes the batch once and loses nothing. + """ def __init__( self, - base_url: str, - data_converter: temporalio.converter.DataConverter, + front: _Front, workflow_id: str, stream: str, topic: str, @@ -239,78 +515,92 @@ def __init__( attempt: int, ) -> None: """Bind this producer to one stream or topic on the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None + self._lock = asyncio.Lock() @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the endpoint.""" + if not values: + return None payloads = [ value if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + else self._front.converter.to_payloads([value])[0] for value in values ] - if self._codec is not None: - # The endpoint is the edge of this process, so a configured codec - # runs here rather than at the handler: whoever hosts the endpoint - # never holds the plaintext. - payloads = await self._codec.encode(payloads) - encoded = [ - base64.b64encode(payload.SerializeToString()).decode() - for payload in payloads - ] - return Cursor((await self._call(payloads=encoded)).cursor or "") + answer = await self._call(payloads, finish=False) + return Cursor(answer.cursor) if answer.cursor else None async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" - await self._call(finish=True) + await self._call([], finish=True) + + async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: + # Identity is taken before the codec runs: a codec may encrypt with a + # fresh nonce each time, and the retry has to be recognised anyway. + identity = tuple(payload.SerializeToString() for payload in payloads) + if self._front.codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._front.codec.encode(payloads) + encoded = [payload.SerializeToString() for payload in payloads] + async with self._lock: + if self._pending is not None and self._pending[1:] != (identity, finish): + # The caller moved on from a batch the endpoint may or may + # not have applied. It goes first under its own index, so the + # handler drops it if it landed and writes it if not, and the + # new batch takes the index after it. + await self._send(*self._pending) + elif self._pending is not None: + return await self._send(*self._pending) + request = self._request(self._batch_index + 1, encoded, finish) + return await self._send(request, identity, finish) + + def _request( + self, batch_index: int, payloads: list[bytes], finish: bool + ) -> AppendInput: + return AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=batch_index, + topic=self._topic, + payloads=payloads, + finish=finish, + ) - async def _call( - self, payloads: list[str] | None = None, finish: bool = False + async def _send( + self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: - self._batch_index += 1 - return await _invoke( - f"{self._base_url}/{_APPEND_OPERATION}", - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ), - AppendOutput, + self._pending = (request, identity, finish) + answer = await self._front.invoke( + _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS ) + self._batch_index = request.batch_index + self._pending = None + return answer class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - workflow_id: str, - stream: str, - ) -> None: + def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream @@ -320,31 +610,37 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, one endpoint batch at a time.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() token = after.token while True: - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, topic=topic or "", after_token=token, + max_records=self._front.max_records, + wait_ms=self._front.wait_ms, ), ReadOutput, + timeout_ms=self._front.wait_ms + 5000, ) for wire in answer.records or []: + cursor = Cursor(wire.token) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire.frame) + wire.frame ) - except ValueError: + except ValueError as error: + # Same answer as every other reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -364,8 +660,8 @@ async def read( async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, @@ -373,6 +669,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: latest_only=True, ), ReadOutput, + timeout_ms=_APPEND_TIMEOUT_MS, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING @@ -380,34 +677,58 @@ async def latest(self, *, topic: str | None = None) -> Cursor: async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - if self._codec is not None: - payload = (await self._codec.decode([payload]))[0] + if self._front.codec is not None: + payload = (await self._front.codec.decode([payload]))[0] if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + return self._front.converter.from_payloads([payload])[0] + return self._front.converter.from_payloads([payload], [as_type])[0] class _NexusProvider: name = "nexus" def __init__(self) -> None: - self._base_url: str | None = None + self._endpoint: str | None = None + self._endpoint_id: str | None = None + self._http_address = "http://127.0.0.1:7243" + self._service = _SERVICE_NAME self._data_converter: temporalio.converter.DataConverter | None = None + self._client: Any = None + self._headers: dict[str, str] = {} + self._wait_ms = _DEFAULT_WAIT_MS + self._max_records = _DEFAULT_MAX_RECORDS def configure(self, **options: Any) -> None: + """Point the caller half at one endpoint. + + ``endpoint`` is the endpoint's name when ``client`` is given, and is + resolved to its id through the operator service on first use; without + a client it has to be the id, because the HTTP ingress dispatches by + id. ``headers`` go on every request, which is where an authorization + header belongs. ``wait_ms`` and ``max_records`` are the read bounds + the caller asks the handler for. + """ endpoint = options.pop("endpoint", None) - http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", _SERVICE_NAME) - data_converter = options.pop("data_converter", None) + self._http_address = options.pop("http_address", self._http_address) + self._service = options.pop("service", _SERVICE_NAME) + self._data_converter = options.pop("data_converter", None) + self._client = options.pop("client", None) + self._headers = dict(options.pop("headers", None) or {}) + self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) + self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) if options: raise TypeError( - "the nexus provider takes endpoint, http_address, service and " - f"data_converter, got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service, " + f"data_converter, client, headers, wait_ms and max_records, got " + f"{sorted(options)}" ) if not endpoint: - raise TypeError("the nexus provider needs endpoint=") - self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - self._data_converter = data_converter + raise TypeError( + "the nexus provider needs endpoint= together with " + "client=, or endpoint= on its own" + ) + self._endpoint = endpoint + self._endpoint_id = None def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -426,10 +747,31 @@ def open_write(self, topic: str) -> WriteSink: del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) - def _url(self) -> str: - if self._base_url is None: + async def _front(self, client: Any) -> _Front: + if self._endpoint is None: raise RuntimeError("configure the nexus provider before opening handles") - return self._base_url + if self._endpoint_id is None: + resolver = self._client if self._client is not None else client + if resolver is None: + self._endpoint_id = self._endpoint + else: + found = await resolver.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") + self._endpoint_id = found.endpoints[0].id + base_url = ( + f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" + f"/services/{self._service}" + ) + return _Front( + base_url, + self._converter(client), + self._headers, + self._wait_ms, + self._max_records, + ) async def producer( self, @@ -441,25 +783,14 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> NexusProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return NexusProducer( - self._url(), - self._converter(client), - workflow_id, - stream, - topic, - producer_id, - attempt, + await self._front(client), workflow_id, stream, topic, producer_id, attempt ) async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + return NexusConsumer(await self._front(client), workflow_id, stream) def _converter(self, client: Any) -> temporalio.converter.DataConverter: if self._data_converter is not None: From 25d463a8c85ecc21c39834df17bd6b28669d90e5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 448/831] Covered the Nexus front's refusals, retries, subscription reuse and deadline clamp. --- tests/streams/test_nexus_provider.py | 334 ++++++++++++++++++++++----- 1 file changed, 274 insertions(+), 60 deletions(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 18679ad5f..77cec6f4e 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -11,8 +11,8 @@ and an endpoint named ``streams-e2e`` targeting task queue ``streams-handlers-e2e``. -The codec test stands the endpoint up in this process instead, because what -it checks is the bytes the caller puts on the wire. +Everything else stands the endpoint up in this process, because what it +checks is the bytes the caller puts on the wire and the handler's own rules. """ from __future__ import annotations @@ -22,11 +22,13 @@ import dataclasses import json import os -import subprocess import uuid -from collections.abc import Sequence -from typing import Any, cast +from collections.abc import Mapping, Sequence +from datetime import datetime, timedelta, timezone +from typing import Any +import nexusrpc +import nexusrpc.handler import pytest import temporalio.converter @@ -38,7 +40,10 @@ from temporalio.streams._provider import instance from temporalio.streams.providers import memory, nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.streams.providers.nexus import ( + StreamEndpointError, + TemporalStreamsHandler, +) from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take @@ -50,51 +55,27 @@ ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] - - -def _endpoint_id() -> str: - # The HTTP ingress dispatches by endpoint id, not name. - out = subprocess.run( - [ - "temporal", - "operator", - "nexus", - "endpoint", - "get", - "--name", - ENDPOINT, - "-o", - "json", - "--address", - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), - ], - capture_output=True, - text=True, - check=True, - ) - return json.loads(out.stdout)["id"] +READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] @live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage - # provider; only the caller goes through the front. + # provider; only the caller goes through the front, and it names the + # endpoint the way an operator does, by name. streams.configure(provider="workflow_streams") client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", - endpoint=_endpoint_id(), + endpoint=ENDPOINT, + client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + wait_ms=5000, ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + handler = TemporalStreamsHandler(client, provider="workflow_streams") - async with Worker( - client, - task_queue=HANDLER_TQ, - nexus_service_handlers=[ - TemporalStreamsHandler(client, provider="workflow_streams") - ], - ): + async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", @@ -135,10 +116,11 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + await handler.close() class ScrambleCodec(temporalio.converter.PayloadCodec): - """Flips every byte of a payload, so the middle holds nothing readable.""" + """Flips every byte and labels the result with an encoding only it can read.""" KEY = 0x5A @@ -146,7 +128,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: """Wrap each payload as opaque bytes nothing downstream can read.""" return [ Payload( - metadata={"encoding": b"binary/plain"}, + metadata={"encoding": b"binary/scrambled"}, data=self._flip(payload.SerializeToString()), ) for payload in payloads @@ -166,45 +148,98 @@ def _flip(cls, data: bytes) -> bytes: return bytes(byte ^ cls.KEY for byte in data) +class _NeverCancelled(nexusrpc.handler.OperationTaskCancellation): + def is_cancelled(self) -> bool: + return False + + def cancellation_reason(self) -> str | None: + return None + + def wait_until_cancelled_sync(self, timeout: float | None = None) -> bool: + del timeout + return False + + async def wait_until_cancelled(self) -> None: + await asyncio.Event().wait() + + +def _context( + operation: str, deadline: datetime | None = None +) -> nexusrpc.handler.StartOperationContext: + return nexusrpc.handler.StartOperationContext( + service=nexus._SERVICE_NAME, # pyright: ignore[reportPrivateUsage] + operation=operation, + headers={}, + task_cancellation=_NeverCancelled(), + request_deadline=deadline, + request_id=uuid.uuid4().hex, + ) + + async def _dispatch( handler: TemporalStreamsHandler, operation: str, request: Any ) -> Any: - context = cast("Any", None) # neither operation looks at it if operation == APPEND_OPERATION: - return await handler.append(context, request) - return await handler.read(context, request) + return await handler.append(_context(operation), request) + return await handler.read(_context(operation), request) def _in_process_endpoint( handler: TemporalStreamsHandler, posted: list[bytes], answered: list[bytes], + *, + fail_after_applying: list[str] | None = None, ) -> Any: - """Serve the caller's posts from ``handler``, recording both directions.""" + """Serve the caller's posts from ``handler``, recording both directions. + + ``fail_after_applying`` names operations whose first call is applied and + then reported as a transport failure, the ambiguous case a retry has to + survive. + """ contract = temporalio.converter.DataConverter.default.payload_converter loop = asyncio.get_running_loop() + failing = set(fail_after_applying or []) - def post(url: str, body: bytes) -> bytes: + def post( + url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + ) -> bytes: + del headers, timeout_ms posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput request: Any = contract.from_payloads( [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] )[0] - if request_type is ReadInput: - # This endpoint has no other traffic to wait for, so park briefly - # rather than for the contract's default. - request.wait_ms = 200 - answer = asyncio.run_coroutine_threadsafe( - _dispatch(handler, operation, request), loop - ).result() + try: + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + except nexusrpc.HandlerError as error: + raise StreamEndpointError(str(error), status=400) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) + if operation in failing: + failing.discard(operation) + raise StreamEndpointError("connection reset after the handler answered") return raw return post +def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: + return instance( + "nexus", + endpoint="in-process", + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + wait_ms=200, + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + + async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, @@ -215,13 +250,7 @@ async def _loop_through_an_endpoint( answered: list[bytes] = [] handler = TemporalStreamsHandler(None, provider="memory") monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = instance( - "nexus", - endpoint="in-process", - data_converter=dataclasses.replace( - temporalio.converter.DataConverter.default, payload_codec=codec - ), - ) + front = _front(codec) workflow_id = "wf-codec" producer = await front.producer( @@ -263,7 +292,9 @@ async def test_the_caller_encodes_records_with_the_configured_codec( monkeypatch, ScrambleCodec() ) - # The value survives the hop, so the codec is applied on both sides. + # The value survives the hop although the handler cannot read the + # encoding, so the body passed through it untouched and the codec ran on + # the caller alone. assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] assert records[0].value == {"secret": "tuna"} # Neither direction carried the plaintext. @@ -281,3 +312,186 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( assert records[0].value == {"secret": "tuna"} assert b"tuna" in _appended_bytes(posted) assert b"tuna" in _answered_bodies(answered) + + +def _append( + workflow_id: str, batch_index: int, *values: Any, finish: bool = False +) -> AppendInput: + converter = temporalio.converter.DataConverter.default.payload_converter + return AppendInput( + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + batch_index=batch_index, + payloads=[ + converter.to_payloads([value])[0].SerializeToString() for value in values + ], + finish=finish, + ) + + +async def _stored(workflow_id: str) -> list[Any]: + consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") + out: list[Any] = [] + async for record in consumer.read(type=dict): + if record.kind is RecordKind.DATA: + out.append(record.value) + if await consumer.latest() == record.cursor: + break + return out + + +@pytest.fixture +def _memory_store(): # pyright: ignore[reportUnusedFunction] + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): + # A second handler instance stands in for a restarted or load-balanced + # handler worker: it shares the store but not the dedupe state. + first = TemporalStreamsHandler(None, provider="memory") + second = TemporalStreamsHandler(None, provider="memory") + await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert failed.value.retryable_override is False + # The store holds the first batch and nothing was silently lost or doubled. + assert await _stored("wf") == [{"n": 1}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_handler_drops_repeats_and_rejects_gaps(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # An exact repeat is dropped with a success answer and no position. + repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert repeat.cursor is None + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_malformed_payload_is_the_callers_fault(): + handler = TemporalStreamsHandler(None, provider="memory") + request = _append("wf", 1) + request.payloads = [b"\xff\xfe not a payload"] + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, request) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + await producer.finish() + indexes = [json.loads(body)["batch_index"] for body in posted] + # The retry re-sent index 1, which the handler dropped as a repeat, so + # the store holds each record once. + assert indexes == [1, 1, 2, 3] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_failed_append_goes_out_before_the_next_one( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + # The caller moves on without retrying; the pending batch is replayed + # first under its own index and the new one takes the next. + await producer.append({"n": 2}) + indexes = [json.loads(body)["batch_index"] for body in posted] + assert indexes == [1, 1, 2] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_consecutive_reads_share_one_parked_subscription(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) + first = await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ) + assert len(first.records) == 1 + parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] + pump = next(iter(parked.values())).pump + # A call that resumes where the last one stopped drains the same + # subscription instead of parking a second read on the store. + second = await _dispatch( + handler, + READ_OPERATION, + ReadInput( + workflow_id="wf", + stream="inputs", + after_token=first.next_token, + max_records=1, + wait_ms=200, + ), + ) + assert len(second.records) == 1 + assert second.next_token != first.next_token + assert len(parked) == 1 and next(iter(parked.values())).pump is pump + # A call from somewhere else replaces it. + await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ) + assert len(parked) == 1 and next(iter(parked.values())).pump is not pump + await handler.close() + assert not parked + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_read_wait_is_cut_to_the_request_deadline(): + handler = TemporalStreamsHandler(None, provider="memory") + started = asyncio.get_running_loop().time() + answer = await handler.read( + _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), + ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ) + assert answer.records == [] and answer.next_token == "" + assert asyncio.get_running_loop().time() - started < 5 + await handler.close() From 55948a6f7152145031a253efa34bba31c0640173 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 449/831] Carried the StreamRecord proto and producer identity on the stream contract. A record crosses the endpoint as the serialized proto every store keeps, an append names its topic, run and sequence, and a read says when the store ended it. --- .../providers/_nexus_generated/models.py | 245 +++++++++++------- .../providers/_nexus_generated/services.py | 17 +- .../providers/temporal_streams.nexusrpc.yaml | 96 ++++--- 3 files changed, 224 insertions(+), 134 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index d00cbcc63..2677843ef 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -22,10 +22,10 @@ _APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) -_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token", "done"}) -_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "record"}) class _AppendInputTransferTypeConverter( @@ -54,15 +54,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str = typing.cast("typing.Any", None) - if "stream" not in raw or raw["stream"] is None: - violations.append(Violation(path="stream", reason="required")) + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: + violations.append( + Violation(path="run_id", reason="explicit null not allowed") + ) + else: + if not isinstance(run_id_value_raw, str): + violations.append( + Violation(path="run_id", reason="expected string") + ) + else: + run_id_value = run_id_value_raw + + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) else: - stream_value_raw = raw["stream"] - if not isinstance(stream_value_raw, str): - violations.append(Violation(path="stream", reason="expected string")) + topic_value_raw = raw["topic"] + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - stream_value = stream_value_raw + topic_value = topic_value_raw producer_id_value: str = typing.cast("typing.Any", None) if "producer_id" not in raw or raw["producer_id"] is None: @@ -87,6 +102,24 @@ def from_transfer_type( if attempt_value_parsed is not None: attempt_value = attempt_value_parsed + sequence_value: int = typing.cast("typing.Any", None) + if "sequence" not in raw or raw["sequence"] is None: + violations.append(Violation(path="sequence", reason="required")) + else: + sequence_value_raw = raw["sequence"] + sequence_value_parsed = _parse_spec_integer( + sequence_value_raw, "sequence", violations + ) + if sequence_value_parsed is not None: + sequence_value = sequence_value_parsed + if sequence_value < 0: + violations.append( + Violation( + path="sequence", + reason=f"must be >= 0, got {sequence_value}", + ) + ) + batch_index_value: int = typing.cast("typing.Any", None) if "batch_index" not in raw or raw["batch_index"] is None: violations.append(Violation(path="batch_index", reason="required")) @@ -105,19 +138,6 @@ def from_transfer_type( ) ) - topic_value: str | None = None - if "topic" in raw: - topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) - else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw - payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] @@ -175,11 +195,12 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" + and key != "topic" and key != "producer_id" and key != "attempt" + and key != "sequence" and key != "batch_index" - and key != "topic" and key != "payloads" and key != "finish" ): @@ -188,11 +209,12 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return AppendInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, + topic=topic_value, producer_id=producer_id_value, attempt=attempt_value, + sequence=sequence_value, batch_index=batch_index_value, - topic=topic_value, payloads=payloads_value, finish=finish_value, ) @@ -202,13 +224,24 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - out["stream"] = value.stream + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic out["producer_id"] = value.producer_id if abs(value.attempt) > 9007199254740991: violations.append( Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") ) out["attempt"] = value.attempt + if abs(value.sequence) > 9007199254740991: + violations.append( + Violation(path="sequence", reason="exceeds ±(2^53-1) integer cap") + ) + if value.sequence < 0: + violations.append( + Violation(path="sequence", reason=f"must be >= 0, got {value.sequence}") + ) + out["sequence"] = value.sequence if abs(value.batch_index) > 9007199254740991: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") @@ -220,8 +253,6 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: ) ) out["batch_index"] = value.batch_index - if value.topic is not None: - out["topic"] = value.topic if value.payloads is not None: out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: @@ -239,31 +270,45 @@ class AppendInput: workflow_id: str """The workflow whose stream is being written.""" - stream: str - """The named stream to append to. Empty when the producer writes to a topic instead.""" + run_id: str | None = None + """The run to address. Empty addresses the workflow's execution chain, which is what a + producer normally wants. + """ + + topic: str + """The topic of the workflow's stream to append to.""" producer_id: str - """Identifies the writer across its retries, so its attempts can be ordered.""" + """Identifies the writer across its retries, so its attempts can be ordered. Never + empty here: the caller resolved it, from the activity context when it was not given. + """ attempt: int """The generation this producer is writing. A later attempt supersedes an earlier one.""" - batch_index: int - """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt, and rejects one that skips ahead or that resumes - an attempt it never saw start. + sequence: int + """The producer's sequence of the first record in this batch; the batch is numbered + from it and a finish takes the next number. It has to continue where the previous + batch ended, so the handler and the store agree on every record's position within + the attempt. """ - topic: str | None = None - """The topic to append to, when stream is empty.""" + batch_index: int + """Counts this producer's batches from 1. The handler answers a repeat of the last + index with the original's position, and refuses one that skips ahead, one already + behind the last, or one that resumes an attempt it never saw start. + """ payloads: list[bytes] | None = None - """The records to write, each a serialized Temporal Payload. Empty on a call that only - finishes. + """The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the caller has already + run on them. Empty on a call that only finishes. """ finish: bool | None = None - """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + """Write FINISH for this producer after the batch: it will write nothing more on the + topic. Says nothing about the producer's outcome. + """ class _AppendOutputTransferTypeConverter( @@ -333,9 +378,9 @@ class AppendOutput: """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Absent when the call - carried no payloads, when the batch was a repeat the handler dropped, or when the - store learns positions only at read time. + """Opaque token naming the last record written by this call, or by the original when + the call repeated the last batch. Absent when the store learns positions only at + read time; such a caller positions itself with a latest_only read. """ additional_properties: dict[str, typing.Any] = dataclasses.field( @@ -369,33 +414,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str | None = None - if "stream" in raw: - stream_value_raw = raw["stream"] - if stream_value_raw is None: + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: violations.append( - Violation(path="stream", reason="explicit null not allowed") + Violation(path="run_id", reason="explicit null not allowed") ) else: - if not isinstance(stream_value_raw, str): + if not isinstance(run_id_value_raw, str): violations.append( - Violation(path="stream", reason="expected string") + Violation(path="run_id", reason="expected string") ) else: - stream_value = stream_value_raw + run_id_value = run_id_value_raw - topic_value: str | None = None - if "topic" in raw: + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) + else: topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw + topic_value = topic_value_raw after_token_value: str | None = None if "after_token" in raw: @@ -486,7 +528,7 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" and key != "topic" and key != "after_token" and key != "max_records" @@ -498,7 +540,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return ReadInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, topic=topic_value, after_token=after_token_value, max_records=max_records_value, @@ -511,10 +553,9 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - if value.stream is not None: - out["stream"] = value.stream - if value.topic is not None: - out["topic"] = value.topic + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic if value.after_token is not None: out["after_token"] = value.after_token if value.max_records is not None: @@ -572,19 +613,19 @@ class ReadInput: workflow_id: str """The workflow whose stream is being read.""" - stream: str | None = None - """The named stream to read. Empty reads every stream the workflow publishes.""" - - topic: str | None = None - """Yield only records on this topic. Empty yields every topic. Only meaningful when - stream is empty, because an inbound stream has no topics. + run_id: str | None = None + """Pin the read to this run. Empty follows the workflow's execution chain across + continue-as-new. """ + topic: str + """The topic of the workflow's stream to read.""" + after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a - caller cannot tell which one that is. + caller cannot tell which one that is, and a token from another store is refused. """ max_records: int | None = None @@ -663,6 +704,19 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + done_value: bool | None = None + if "done" in raw: + done_value_raw = raw["done"] + if done_value_raw is None: + violations.append( + Violation(path="done", reason="explicit null not allowed") + ) + else: + if not isinstance(done_value_raw, bool): + violations.append(Violation(path="done", reason="expected boolean")) + else: + done_value = done_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: if key not in _READ_OUTPUT_DECLARED: @@ -672,6 +726,7 @@ def from_transfer_type( return ReadOutput( records=records_value, next_token=next_token_value, + done=done_value, additional_properties=additional_properties, ) @@ -693,6 +748,8 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + if value.done is not None: + out["done"] = value.done for key, entry in value.additional_properties.items(): if key in _READ_OUTPUT_DECLARED: violations.append( @@ -721,6 +778,12 @@ class ReadOutput: token when the call collected nothing. """ + done: bool | None = None + """The store ended the read: the owning execution, or its chain, is closed and every + retained record after the caller's token has been delivered. Nothing more will + arrive, so the caller stops. + """ + additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict ) @@ -750,17 +813,19 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: bytes = typing.cast("typing.Any", None) - if "frame" not in raw or raw["frame"] is None: - violations.append(Violation(path="frame", reason="required")) + record_value: bytes = typing.cast("typing.Any", None) + if "record" not in raw or raw["record"] is None: + violations.append(Violation(path="record", reason="required")) else: - frame_value_raw = raw["frame"] - if not isinstance(frame_value_raw, str): - violations.append(Violation(path="frame", reason="expected string")) + record_value_raw = raw["record"] + if not isinstance(record_value_raw, str): + violations.append(Violation(path="record", reason="expected string")) else: - frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) - if frame_value_parsed is not None: - frame_value = frame_value_parsed + record_value_parsed = _parse_base64( + record_value_raw, "record", violations + ) + if record_value_parsed is not None: + record_value = record_value_parsed additional_properties: dict[str, typing.Any] = {} for key in raw: @@ -770,7 +835,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, - frame=frame_value, + record=record_value, additional_properties=additional_properties, ) @@ -779,7 +844,7 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = _format_base64(value.frame) + out["record"] = _format_base64(value.record) for key, entry in value.additional_properties.items(): if key in _RECORD_WIRE_DECLARED: violations.append( @@ -798,13 +863,15 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its frame.""" + """One record on the wire: its cursor and the record itself.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: bytes - """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + record: bytes + """The serialized temporal.api.stream.v1.StreamRecord: topic, kind, producer_id, + attempt, sequence and body, as the store holds it. + """ additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index e0673aeab..591e31046 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -17,18 +17,20 @@ class TemporalStreams: """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation - per record costs too much for token streams. + per record costs too much for token streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so a caller + in any language decodes it with the api protos alone. """ append: Operation[ AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. The handler drops a batch_index it has - already written for this producer attempt, so a retried call writes once, and - rejects an index that skips ahead or a producer attempt it has no state for. - Supersession records are not transported: a reader re-synthesizes them from the - attempts it observes. + """Append one batch on the caller's account. The handler writes a batch once: a repeat + of the last batch_index answers with where the original landed, and an index that + skips ahead, one already behind the last, a sequence that does not continue, or a + producer attempt the handler has no state for is refused. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. """ read: Operation[ @@ -37,5 +39,6 @@ class TemporalStreams: ] = Operation(name="read") """Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns - whatever it collected. + whatever it collected. It says when the store has ended the read, so the caller can + stop. """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index a1cc34631..bf97209b3 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -11,15 +11,18 @@ services: hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token - streams. + streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so + a caller in any language decodes it with the api protos alone. operations: append: fqn: append description: >- - Append one batch on the caller's account. The handler drops a - batch_index it has already written for this producer attempt, so a - retried call writes once, and rejects an index that skips ahead or a - producer attempt it has no state for. Supersession records are not + Append one batch on the caller's account. The handler writes a batch + once: a repeat of the last batch_index answers with where the + original landed, and an index that skips ahead, one already behind + the last, a sequence that does not continue, or a producer attempt + the handler has no state for is refused. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes. input: { $ref: "#/$defs/AppendInput" } @@ -29,7 +32,8 @@ services: description: >- Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, - whichever comes first, and returns whatever it collected. + whichever comes first, and returns whatever it collected. It says + when the store has ended the read, so the caller can stop. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -41,49 +45,61 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being written." - stream: + run_id: type: string description: >- - The named stream to append to. Empty when the producer writes to a - topic instead. + The run to address. Empty addresses the workflow's execution chain, + which is what a producer normally wants. + topic: + type: string + description: "The topic of the workflow's stream to append to." producer_id: type: string description: >- Identifies the writer across its retries, so its attempts can be - ordered. + ordered. Never empty here: the caller resolved it, from the activity + context when it was not given. attempt: type: integer description: >- The generation this producer is writing. A later attempt supersedes an earlier one. + sequence: + type: integer + minimum: 0 + description: >- + The producer's sequence of the first record in this batch; the batch + is numbered from it and a finish takes the next number. It has to + continue where the previous batch ended, so the handler and the + store agree on every record's position within the attempt. batch_index: type: integer minimum: 1 description: >- - Counts this producer's batches from 1. The handler drops an index it - has already written for this producer attempt, and rejects one that - skips ahead or that resumes an attempt it never saw start. - topic: - type: string - description: "The topic to append to, when stream is empty." + Counts this producer's batches from 1. The handler answers a repeat + of the last index with the original's position, and refuses one that + skips ahead, one already behind the last, or one that resumes an + attempt it never saw start. payloads: type: array items: type: string contentEncoding: base64 description: >- - The records to write, each a serialized Temporal Payload. Empty on a - call that only finishes. + The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the + caller has already run on them. Empty on a call that only finishes. finish: type: boolean description: >- - Mark this producer done after writing the batch, so a reader stops - waiting on it. + Write FINISH for this producer after the batch: it will write nothing + more on the topic. Says nothing about the producer's outcome. required: - workflow_id - - stream + - topic - producer_id - attempt + - sequence - batch_index additionalProperties: false @@ -94,10 +110,10 @@ $defs: cursor: type: string description: >- - Opaque token naming the last record written by this call. Absent - when the call carried no payloads, when the batch was a repeat the - handler dropped, or when the store learns positions only at read - time. + Opaque token naming the last record written by this call, or by the + original when the call repeated the last batch. Absent when the + store learns positions only at read time; such a caller positions + itself with a latest_only read. additionalProperties: true ReadInput: @@ -107,17 +123,14 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being read." - stream: + run_id: type: string description: >- - The named stream to read. Empty reads every stream the workflow - publishes. + Pin the read to this run. Empty follows the workflow's execution + chain across continue-as-new. topic: type: string - description: >- - Yield only records on this topic. Empty yields every topic. Only - meaningful when stream is empty, because an inbound stream has no - topics. + description: "The topic of the workflow's stream to read." after_token: type: string description: >- @@ -125,7 +138,7 @@ $defs: strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell - which one that is. + which one that is, and a token from another store is refused. max_records: type: integer minimum: 1 @@ -146,26 +159,27 @@ $defs: wants to follow from now. required: - workflow_id + - topic additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its frame." + description: "One record on the wire: its cursor and the record itself." properties: token: type: string description: >- Opaque cursor naming this record. Pass it as after_token to resume just past it. - frame: + record: type: string contentEncoding: base64 description: >- - The record frame, carrying the topic, kind, producer, attempt, - sequence and body. + The serialized temporal.api.stream.v1.StreamRecord: topic, kind, + producer_id, attempt, sequence and body, as the store holds it. required: - token - - frame + - record additionalProperties: true ReadOutput: @@ -182,4 +196,10 @@ $defs: description: >- Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing. + done: + type: boolean + description: >- + The store ended the read: the owning execution, or its chain, is + closed and every retained record after the caller's token has been + delivered. Nothing more will arrive, so the caller stops. additionalProperties: true From 9360b38153dc22c6f4527b3c051ee932315c1647 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 450/831] Rewrote the Nexus front on the plugin surface. NexusStreams is the outside half only and the handler fronts a storage provider's own handles. Endpoint failures reach the caller as the stream condition the store raised or as an RPCError, never as an HTTP error. --- temporalio/streams/providers/nexus.py | 813 +++++++++++++++----------- 1 file changed, 468 insertions(+), 345 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8c311d1d9..07da0318b 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -1,47 +1,58 @@ """The Nexus front: the outside surface behind one Temporal-authenticated endpoint. -Two halves in one module. The provider half implements only :func:`producer` -and :func:`consumer`; the workflow side raises, naming a storage provider, -because a workflow's publishes and reads ride the Workflow Task and cannot -cross an RPC. The handler half runs in a worker configured with any storage -provider and serves two sync operations, ``append`` and ``read``, so the -store behind the endpoint is invisible to callers and an operator switches -it without touching them. +Two halves in one module. :class:`NexusStreams` is a provider that implements +the outside half only: it hands out handles that append and read through the +endpoint, and it has no workflow half, because a workflow's publishes and +reads ride the Workflow Task and cannot cross an RPC. +:class:`TemporalStreamsHandler` runs in a worker next to any storage provider +and serves two sync operations, ``append`` and ``read``, by fronting that +provider's own handles, so the store behind the endpoint is invisible to +callers and an operator switches it without touching them. The wire types and the service definition come from ``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be -handed the same contract. What stays hand-written here is what the -generator cannot express yet: the handler's dedupe and long-poll collect -loop, and the caller's batching, cursor handling and codec. +handed the same contract. A record crosses as the serialized +``temporal.api.stream.v1.StreamRecord``, the same bytes every store keeps, so +a caller in another language decodes it with the api protos alone. What stays +hand-written here is what the generator cannot express yet: the handler's +dedupe and long-poll collect loop, and the caller's batching, cursor handling +and codec. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Record bodies -cross the handler untouched: it reads the store as raw payloads and frames +cross the handler untouched: it reads the store as raw payloads and forwards them as they are, so a codec that changes the payload encoding survives the hop and the handler's worker never needs the key. Supersession records are -not transported: the caller's reader re-synthesizes them from the attempts -it observes, which is the policy module's job on every provider. Cursors -pass through opaque, so the caller cannot tell which store produced them. - -The handler keeps one parked read per ``(workflow, stream, topic)`` and -serves consecutive calls from it, so an idle caller does not leave one -abandoned long poll on the store per call. A call whose token does not -match the parked position replaces the subscription, and an idle one is -released after a minute; that is the residual cost. - -Two stated prototype limits. Append deduplication lives in handler memory, -by batch index per producer attempt, so a handler that has no state for a -producer attempt refuses to continue it rather than starting a fresh -delegate whose numbering the store would drop as a repeat; the caller opens -a new attempt, which readers report as a supersession. The store-level fix, -a sequence-explicit append in the contract, is listed in the design doc's -work table. And any caller the endpoint admits may touch any workflow's -streams in the namespace; the endpoint's own authorization is the boundary. +not transported: the caller's reader re-synthesizes them from the attempts it +observes, which is the policy module's job on every provider. Cursors pass +through opaque, so the caller cannot tell which store produced them; a +foreign one is refused by the store behind the endpoint and reaches the +caller on the first read. + +The handler keeps one parked read per ``(workflow, run, topic)`` and serves +consecutive calls from it, so an idle caller does not leave one abandoned +long poll on the store per call. A call whose token does not match the parked +position replaces the subscription, and an idle one is released after a +minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, by +batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh delegate +whose numbering the store would drop as a repeat; the caller opens a new +attempt, which readers report as a supersession. And any caller the endpoint +admits may touch any workflow's streams in the namespace; the endpoint's own +authorization is the boundary. + +A failure from the endpoint reaches the caller as the +:class:`temporalio.streams.StreamError` the store raised, when the handler +named one, and as :class:`temporalio.service.RPCError` otherwise, never as an +HTTP or urllib exception. """ from __future__ import annotations import asyncio +import json import logging import time import urllib.error @@ -50,7 +61,7 @@ from collections.abc import AsyncGenerator, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, TypeVar +from typing import Any, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler @@ -59,11 +70,24 @@ import temporalio.converter from temporalio.api.common.v1 import Payload from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.client import Client from temporalio.common import RawValue -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import StreamHandle, StreamProducer, StreamProvider from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + producer_identity, + to_wire, +) from temporalio.streams.providers._nexus_generated import ( AppendInput, AppendOutput, @@ -73,9 +97,16 @@ TemporalStreams, ) +__all__ = [ + "NexusProducer", + "NexusStreamHandle", + "NexusStreams", + "TemporalStreamsHandler", +] + _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " - "through a storage provider, so configure one of those on the worker" + "through a storage provider, so give the worker one of those" ) # The contract leaves these unset, so the handler is the one place that says @@ -83,12 +114,13 @@ # shortens it to the request deadline anyway, and a shorter default only # means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 30_000 +_DEFAULT_READ_WAIT = timedelta(seconds=30) _DEADLINE_MARGIN = timedelta(milliseconds=500) _DEFAULT_MAX_PRODUCERS = 10_000 _DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) _QUEUE_DEPTH = 1000 -_APPEND_TIMEOUT_MS = 30_000 +_APPEND_TIMEOUT = timedelta(seconds=30) +_ROUND_TRIP_MARGIN = timedelta(seconds=5) _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -104,16 +136,58 @@ _APPEND_OPERATION = _OPERATION_NAMES["append"] _READ_OPERATION = _OPERATION_NAMES["read"] +# The stream conditions that cross the endpoint under their own name, so the +# caller raises the class the store raised. +_STREAM_ERRORS: dict[str, type[StreamError]] = { + cls.__name__: cls + for cls in ( + StreamError, + StreamNotFoundError, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, + ) +} +_HTTP_TO_RPC = { + 400: RPCStatusCode.INVALID_ARGUMENT, + 401: RPCStatusCode.UNAUTHENTICATED, + 403: RPCStatusCode.PERMISSION_DENIED, + 404: RPCStatusCode.NOT_FOUND, + 408: RPCStatusCode.DEADLINE_EXCEEDED, + 409: RPCStatusCode.ALREADY_EXISTS, + 412: RPCStatusCode.FAILED_PRECONDITION, + 429: RPCStatusCode.RESOURCE_EXHAUSTED, + 500: RPCStatusCode.INTERNAL, + 501: RPCStatusCode.UNIMPLEMENTED, + 503: RPCStatusCode.UNAVAILABLE, + 504: RPCStatusCode.DEADLINE_EXCEEDED, +} + _OutputT = TypeVar("_OutputT") logger = logging.getLogger(__name__) +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _handler_error(error: StreamError) -> nexusrpc.HandlerError: + """Carry a stream condition across the endpoint under its own class name.""" + kind = ( + nexusrpc.HandlerErrorType.NOT_FOUND + if isinstance(error, StreamNotFoundError) + else nexusrpc.HandlerErrorType.BAD_REQUEST + ) + return nexusrpc.HandlerError( + f"{type(error).__name__}: {error}", type=kind, retryable_override=False + ) + + def _bad_request(message: str) -> nexusrpc.HandlerError: return nexusrpc.HandlerError( - message, - type=nexusrpc.HandlerErrorType.BAD_REQUEST, - retryable_override=False, + message, type=nexusrpc.HandlerErrorType.BAD_REQUEST, retryable_override=False ) @@ -131,29 +205,30 @@ class _Subscription: @dataclass class _ProducerState: - delegate: Any + delegate: StreamProducer batch_index: int + sequence: int + last_cursor: str | None @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: - """Serves the stream endpoint, delegating to one storage provider. + """Serves the stream endpoint by fronting one storage provider's handles. - The delegate is an explicit instance rather than the process default, so - a caller and a handler can coexist in one process, and so an operator can + The provider is an explicit instance the application constructed, so a + caller and a handler can coexist in one process, and so an operator can run handlers for a new store next to handlers for the old one. """ def __init__( self, - client: Any, - provider: str, + provider: StreamProvider, + client: Client | None, *, max_producers: int = _DEFAULT_MAX_PRODUCERS, subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, - **provider_options: Any, ) -> None: - """Serve the endpoint out of the provider named by ``provider``. + """Serve the endpoint out of ``provider``'s handles, opened with ``client``. ``max_producers`` bounds the dedupe state kept per producer attempt; the oldest is evicted, and a producer evicted mid-life gets a clear @@ -161,9 +236,9 @@ def __init__( ``subscription_idle`` is how long a parked read outlives its last caller. """ + self._provider = provider self._client = client - self._delegate = _provider.instance(provider, **provider_options) - self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + self._producers: OrderedDict[tuple[str, str, str, str, int], _ProducerState] = ( OrderedDict() ) self._max_producers = max_producers @@ -171,60 +246,82 @@ def __init__( self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} self._subscription_idle = subscription_idle.total_seconds() + def _stream(self, workflow_id: str, run_id: str | None) -> StreamHandle: + # A storage provider wants a client; the memory provider, which the + # tests front, accepts none, so the cast only lies where it is unread. + return self._provider.get_stream_handle( + cast(Client, self._client), workflow_id, run_id=run_id or None + ) + @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch. + """Append on the caller's account, writing a repeated batch once. Raises: - nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips - ahead, when it continues a producer attempt this handler has - no state for, or when a payload is not a serialized - ``Payload``. + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index or + sequence does not continue the producer attempt, when the + attempt is one this handler has no state for, or when a + payload is not a serialized ``Payload``; ``NOT_FOUND`` when + the store has no such workflow. """ - topic = input.topic or "" + try: + return await self._append(input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _append(self, input: AppendInput) -> AppendOutput: + _require_topic(input.topic) key = ( input.workflow_id, - input.stream or f"@{topic}", + input.run_id or "", + input.topic, input.producer_id, input.attempt, ) state = self._producers.get(key) if state is None: - if input.batch_index != 1: + if input.batch_index != 1 or input.sequence != 0: # A fresh delegate would restart its numbering at zero, and # the store would drop that as a repeat of the first batch. # Refusing here turns a silent loss into a failure the caller # can act on by opening a new attempt. - raise _bad_request( + raise StreamProducerError( f"producer {input.producer_id!r} attempt {input.attempt} resumed " f"at batch {input.batch_index} on a handler that has no state for " "it; open a new attempt" ) - delegate = await self._delegate.producer( - self._client, - workflow_id=input.workflow_id, - stream=input.stream, - topic=topic, - producer_id=input.producer_id, - attempt=input.attempt, + delegate = self._stream(input.workflow_id, input.run_id).producer( + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt ) - state = _ProducerState(delegate, 0) - elif input.batch_index <= state.batch_index: - # A repeat, or a producer that restarted its numbering: either - # way the store already holds the batch. + state = _ProducerState(delegate, 0, 0, None) + elif input.batch_index == state.batch_index: + # The last batch again: the store already holds it, and where it + # landed is the answer the original got. self._producers.move_to_end(key) - return AppendOutput() + return AppendOutput(cursor=state.last_cursor) + elif input.batch_index < state.batch_index: + raise StreamProducerError( + f"batch {input.batch_index} was written and is no longer the last " + f"for producer {input.producer_id!r} attempt {input.attempt}" + ) elif input.batch_index != state.batch_index + 1: - raise _bad_request( + raise StreamProducerError( f"batch {input.batch_index} skips ahead of {state.batch_index} for " f"producer {input.producer_id!r} attempt {input.attempt}" ) + if input.sequence != state.sequence: + raise StreamProducerError( + f"sequence {input.sequence} does not continue at {state.sequence} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) payloads = self._payloads(input.payloads) cursor: str | None = None if payloads: - appended = await state.delegate.append(*payloads) + appended = await state.delegate.append(*(RawValue(p) for p in payloads)) cursor = appended.token if appended is not None else None if input.finish: await state.delegate.finish() @@ -233,6 +330,8 @@ async def append( # Recorded only once the store accepted the batch, so a failed append # is not mistaken for a repeat when the caller retries it. state.batch_index = input.batch_index + state.sequence += len(payloads) + state.last_cursor = cursor self._producers[key] = state self._producers.move_to_end(key) while len(self._producers) > self._max_producers: @@ -243,32 +342,46 @@ async def append( def _payloads(encoded: list[bytes] | None) -> list[Payload]: payloads = [] for index, raw in enumerate(encoded or []): - payload = Payload() try: - payload.ParseFromString(raw) + payloads.append(Payload.FromString(raw)) except DecodeError as error: raise _bad_request( f"payloads[{index}] is not a serialized Temporal Payload: {error}" ) from error - payloads.append(payload) return payloads @nexusrpc.handler.sync_operation async def read( self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: - """Answer with the records after the caller's token, or time out.""" - stream = input.stream or "" - topic = input.topic or None + """Answer with the records after the caller's token, or time out. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the store refuses the + token, ``NOT_FOUND`` when it has no such workflow. + """ + try: + return await self._read(ctx, input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _read( + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + _require_topic(input.topic) + stream = self._stream(input.workflow_id, input.run_id) if input.latest_only: - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=stream - ) - return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + return ReadOutput(next_token=(await stream.latest(topic=input.topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + wait = ( + _DEFAULT_READ_WAIT.total_seconds() + if input.wait_ms is None + else input.wait_ms / 1000 + ) if ctx.request_deadline is not None: # The server answers the caller with a timeout at the deadline # whatever this call does, so collecting past it only holds the @@ -279,7 +392,7 @@ async def read( left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN wait = max(0.0, min(wait, left.total_seconds())) after = input.after_token or "" - key = (input.workflow_id, stream, topic or "") + key = (input.workflow_id, input.run_id or "", input.topic) await self._expire_subscriptions() lock = self._read_locks.setdefault(key, asyncio.Lock()) async with lock: @@ -287,34 +400,31 @@ async def read( if subscription is None or subscription.position != after: if subscription is not None: await self._drop(key) - subscription = await self._subscribe( - key, input.workflow_id, stream, topic, after - ) + subscription = self._subscribe(key, stream, input.topic, after) records, next_token = await self._drain(subscription, max_records, wait) subscription.position = next_token subscription.last_used = time.monotonic() - if subscription.done and subscription.records.empty(): - # The store ended the read, as the Workflow Streams delegate - # does when the run closes. Nothing more will arrive on it. + done = ( + subscription.done + and subscription.records.empty() + and subscription.failure is None + ) + if done: + # The store ended the read: the run or chain is closed and the + # tail has been handed over. Nothing more will arrive on it. await self._drop(key) - return ReadOutput(records=records, next_token=next_token) + return ReadOutput(records=records, next_token=next_token, done=done) - async def _subscribe( - self, - key: tuple[str, str, str], - workflow_id: str, - stream: str, - topic: str | None, - after: str, + def _subscribe( + self, key: tuple[str, str, str], stream: StreamHandle, topic: str, after: str ) -> _Subscription: - delegate = await self._delegate.consumer( - self._client, workflow_id=workflow_id, stream=stream - ) - # Raw payloads: the handler frames what the store holds without + # Raw payloads: the handler forwards what the store holds without # decoding it, so an encoding only the caller's codec understands - # passes through untouched. - source = delegate.read( - after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + # passes through untouched. A foreign token is refused right here. + source = stream.read( + topic=topic, + after=Cursor(after) if after else BEGINNING, + result_type=RawValue, ) subscription = _Subscription( records=asyncio.Queue(maxsize=_QUEUE_DEPTH), @@ -334,8 +444,7 @@ async def pump() -> None: subscription.failure = error finally: subscription.done = True - if isinstance(source, AsyncGenerator): - await source.aclose() + await source.aclose() subscription.pump = asyncio.create_task(pump()) self._subscriptions[key] = subscription @@ -354,8 +463,10 @@ async def _drain( if records or remaining <= 0: break if subscription.done: + if subscription.failure is None: + break # Honour the wait even though nothing can arrive, so a - # caller polling a closed stream does not spin on the + # caller polling a failed stream does not spin on the # endpoint. await asyncio.sleep(remaining) break @@ -374,20 +485,19 @@ async def _drain( @staticmethod def _wire(record: StreamRecord[Any]) -> RecordWire: - body = ( - record.value.payload.SerializeToString() - if isinstance(record.value, RawValue) - else b"" - ) - frame = _frame.encode( + # The record read as RawValue carries the stored body untouched; the + # default converter passes a RawValue through, so no encoding happens + # here. + wire = to_wire( + temporalio.converter.DataConverter.default.payload_converter, topic=record.topic, kind=record.kind, - producer=record.producer, + value=record.value, + producer_id=record.producer_id, attempt=record.attempt, sequence=record.sequence, - body=body, ) - return RecordWire(token=record.cursor.token, frame=frame) + return RecordWire(token=record.cursor.token, record=wire.SerializeToString()) async def close(self) -> None: """Release every parked read. @@ -419,20 +529,44 @@ async def _expire_subscriptions(self) -> None: self._read_locks.pop(key, None) -class StreamEndpointError(RuntimeError): - """The stream endpoint refused a call or could not be reached. +class _EndpointFailure(Exception): + """What the transport saw: the endpoint's answer, or the reason it gave none.""" - ``status`` is the HTTP status when the endpoint answered, and ``None`` - when the connection itself failed. - """ - - def __init__(self, message: str, *, status: int | None = None) -> None: - """Carry the endpoint's answer, or the reason it gave none.""" - super().__init__(message) + def __init__(self, detail: str, status: int | None) -> None: + super().__init__(detail) + self.detail = detail self.status = status -def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: +def _translate(failure: _EndpointFailure) -> Exception: + """The exception a caller raises for an endpoint failure. + + The handler names a stream condition by its class in the failure message, + so the same class is raised here; anything else is an ``RPCError`` with + the status the HTTP answer maps to, or ``UNAVAILABLE`` when there was none. + """ + message = failure.detail + try: + parsed = json.loads(message) + if isinstance(parsed, dict) and isinstance(parsed.get("message"), str): + message = parsed["message"] + except ValueError: + pass + if failure.status is not None: + for name, cls in _STREAM_ERRORS.items(): + prefix = f"{name}: " + if message.startswith(prefix): + return cls(message[len(prefix) :]) + status = _HTTP_TO_RPC.get(failure.status, RPCStatusCode.UNKNOWN) + else: + status = RPCStatusCode.UNAVAILABLE + return RPCError(message, status, b"") + + +def _post( + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta +) -> bytes: + timeout_ms = int(timeout.total_seconds() * 1000) request = urllib.request.Request( url, data=body, @@ -446,57 +580,74 @@ def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> method="POST", ) try: - with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: + with urllib.request.urlopen( + request, timeout=(timeout + _ROUND_TRIP_MARGIN).total_seconds() + ) as response: return response.read() except urllib.error.HTTPError as error: - detail = error.read().decode(errors="replace") - raise StreamEndpointError( - f"stream endpoint call failed ({error.code}): {detail}", status=error.code + raise _EndpointFailure( + error.read().decode(errors="replace"), error.code ) from error except urllib.error.URLError as error: - raise StreamEndpointError( - f"stream endpoint unreachable at {url}: {error.reason}" + raise _EndpointFailure( + f"stream endpoint unreachable at {url}: {error.reason}", None ) from error class _Front: - """Everything the caller half needs to reach one endpoint.""" + """Everything a handle needs to reach one endpoint.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - headers: Mapping[str, str], - wait_ms: int, - max_records: int, - ) -> None: - self.base_url = base_url + def __init__(self, streams: NexusStreams, client: Client | None) -> None: + self._streams = streams + self._client = client + data_converter = streams._data_converter + if data_converter is None: + data_converter = ( + client.data_converter + if client is not None + else temporalio.converter.DataConverter.default + ) self.converter = data_converter.payload_converter self.codec = data_converter.payload_codec - self.headers = dict(headers) - self.wait_ms = wait_ms - self.max_records = max_records + self.read_wait = streams._read_wait + self.max_records = streams._max_records + + async def _base_url(self) -> str: + endpoint_id = await self._streams._endpoint_id(self._client) + return ( + f"{self._streams._http_address}/nexus/endpoints/{endpoint_id}" + f"/services/{_SERVICE_NAME}" + ) async def invoke( - self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + self, + operation: str, + request: Any, + output: type[_OutputT], + *, + timeout: timedelta, ) -> _OutputT: # The contract types carry their own JSON encoding, so the raw caller # and the worker serving the operation agree on the body without # either of them spelling the fields out. contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread( - _post, - f"{self.base_url}/{operation}", - contract.to_payloads([request])[0].data, - self.headers, - timeout_ms, - ) + url = f"{await self._base_url()}/{operation}" + try: + raw = await asyncio.to_thread( + _post, + url, + contract.to_payloads([request])[0].data, + self._streams._headers, + timeout, + ) + except _EndpointFailure as failure: + raise _translate(failure) from failure payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it. + """Appends through the stream endpoint; the store behind it does the rest. Calls are serialized and the batch index is committed only once the endpoint answered. A batch whose call raised stays pending and is sent @@ -509,42 +660,50 @@ def __init__( self, front: _Front, workflow_id: str, - stream: str, + run_id: str | None, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on the endpoint.""" + """Bind this producer to ``topic`` on the workflow behind the endpoint.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._sequence = 0 + self._last: Cursor | None = BEGINNING self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None self._lock = asyncio.Lock() + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` through the endpoint.""" + """Append ``values`` through the endpoint and return where the last one landed. + + A repeat answers with the original's position and an empty call with + the last one; ``None`` when the store behind the endpoint learns + positions only at read time. + """ if not values: - return None - payloads = [ - value - if isinstance(value, Payload) - else self._front.converter.to_payloads([value])[0] - for value in values - ] + return self._last + payloads = self._front.converter.to_payloads(list(values)) answer = await self._call(payloads, finish=False) - return Cursor(answer.cursor) if answer.cursor else None + self._last = Cursor(answer.cursor) if answer.cursor else None + return self._last async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" + """Write ``FINISH`` for this producer on this topic.""" await self._call([], finish=True) async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: @@ -566,238 +725,202 @@ async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: await self._send(*self._pending) elif self._pending is not None: return await self._send(*self._pending) - request = self._request(self._batch_index + 1, encoded, finish) + request = AppendInput( + workflow_id=self._workflow_id, + run_id=self._run_id, + topic=self._topic, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + batch_index=self._batch_index + 1, + payloads=encoded, + finish=finish, + ) return await self._send(request, identity, finish) - def _request( - self, batch_index: int, payloads: list[bytes], finish: bool - ) -> AppendInput: - return AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=batch_index, - topic=self._topic, - payloads=payloads, - finish=finish, - ) - async def _send( self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: self._pending = (request, identity, finish) answer = await self._front.invoke( - _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS + _APPEND_OPERATION, request, AppendOutput, timeout=_APPEND_TIMEOUT ) self._batch_index = request.batch_index + self._sequence = request.sequence + len(request.payloads or []) + int(finish) self._pending = None return answer -class NexusConsumer: - """Reads batches from the stream endpoint, re-synthesizing supersession.""" +class NexusStreamHandle: + """One workflow's stream through the endpoint, re-synthesizing supersession.""" - def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: - """Read what ``workflow_id`` publishes, through the endpoint.""" + def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s stream, pinned to ``run_id`` when one is given.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after``, one endpoint batch at a time. + + The token is opaque here, so a cursor from another store is refused by + the store behind the endpoint and raises + :class:`temporalio.streams.StreamCursorError` on the first iteration. + """ + _require_topic(topic) + return self._read(topic, after, result_type) + + async def _read( + self, topic: str, after: Cursor, result_type: type | None ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, one endpoint batch at a time.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() + decoder = RecordDecoder( + self._front.converter, result_type, after=after, warn=logger.warning + ) token = after.token while True: answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, after_token=token, max_records=self._front.max_records, - wait_ms=self._front.wait_ms, + wait_ms=int(self._front.read_wait.total_seconds() * 1000), ), ReadOutput, - timeout_ms=self._front.wait_ms + 5000, + timeout=self._front.read_wait + _ROUND_TRIP_MARGIN, ) for wire in answer.records or []: cursor = Cursor(wire.token) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - wire.frame - ) - except ValueError as error: + record = WireRecord.FromString(wire.record) + except DecodeError as error: # Same answer as every other reader: skip and say so. logger.warning("skipping stream record at %s: %s", cursor, error) continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - value = ( - await self._decode(body, type) if kind is RecordKind.DATA else None - ) - yield StreamRecord( - value=value, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + if self._front.codec is not None and record.HasField("body"): + record.body.CopyFrom( + (await self._front.codec.decode([record.body]))[0] + ) + for out in decoder.decode(cursor, record): + yield out token = answer.next_token or token + if answer.done: + return - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" + async def latest(self, *, topic: str) -> Cursor: + """The newest position on ``topic`` behind the endpoint, for following from now.""" + _require_topic(topic) answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, latest_only=True, ), ReadOutput, - timeout_ms=_APPEND_TIMEOUT_MS, + timeout=_APPEND_TIMEOUT, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING - async def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if self._front.codec is not None: - payload = (await self._front.codec.decode([payload]))[0] - if as_type is None: - return self._front.converter.from_payloads([payload])[0] - return self._front.converter.from_payloads([payload], [as_type])[0] - - -class _NexusProvider: - name = "nexus" - - def __init__(self) -> None: - self._endpoint: str | None = None - self._endpoint_id: str | None = None - self._http_address = "http://127.0.0.1:7243" - self._service = _SERVICE_NAME - self._data_converter: temporalio.converter.DataConverter | None = None - self._client: Any = None - self._headers: dict[str, str] = {} - self._wait_ms = _DEFAULT_WAIT_MS - self._max_records = _DEFAULT_MAX_RECORDS - - def configure(self, **options: Any) -> None: - """Point the caller half at one endpoint. - - ``endpoint`` is the endpoint's name when ``client`` is given, and is - resolved to its id through the operator service on first use; without - a client it has to be the id, because the HTTP ingress dispatches by - id. ``headers`` go on every request, which is where an authorization - header belongs. ``wait_ms`` and ``max_records`` are the read bounds - the caller asks the handler for. - """ - endpoint = options.pop("endpoint", None) - self._http_address = options.pop("http_address", self._http_address) - self._service = options.pop("service", _SERVICE_NAME) - self._data_converter = options.pop("data_converter", None) - self._client = options.pop("client", None) - self._headers = dict(options.pop("headers", None) or {}) - self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) - self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) - if options: - raise TypeError( - "the nexus provider takes endpoint, http_address, service, " - f"data_converter, client, headers, wait_ms and max_records, got " - f"{sorted(options)}" - ) - if not endpoint: - raise TypeError( - "the nexus provider needs endpoint= together with " - "client=, or endpoint= on its own" - ) - self._endpoint = endpoint - self._endpoint_id = None - - def worker_options(self) -> dict[str, Any]: - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - del stream, after, idle_timeout - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_write(self, topic: str) -> WriteSink: - del topic - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - async def _front(self, client: Any) -> _Front: - if self._endpoint is None: - raise RuntimeError("configure the nexus provider before opening handles") - if self._endpoint_id is None: - resolver = self._client if self._client is not None else client - if resolver is None: - self._endpoint_id = self._endpoint - else: - found = await resolver.operator_service.list_nexus_endpoints( - ListNexusEndpointsRequest(name=self._endpoint) - ) - if not found.endpoints: - raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") - self._endpoint_id = found.endpoints[0].id - base_url = ( - f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" - f"/services/{self._service}" - ) - return _Front( - base_url, - self._converter(client), - self._headers, - self._wait_ms, - self._max_records, - ) - - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 ) -> NexusProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) return NexusProducer( - await self._front(client), workflow_id, stream, topic, producer_id, attempt + self._front, self._workflow_id, self._run_id, topic, producer_id, attempt ) - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> NexusConsumer: - return NexusConsumer(await self._front(client), workflow_id, stream) - def _converter(self, client: Any) -> temporalio.converter.DataConverter: - if self._data_converter is not None: - return self._data_converter - if client is None: - return temporalio.converter.DataConverter.default - return client.data_converter +class NexusStreams(StreamProvider): + """The outside half of a provider, over one Nexus endpoint. + Not a worker plugin: a workflow publishes and reads through the storage + provider its worker was given, and this front only serves code outside a + workflow. The endpoint hides which store that is. + """ -_provider.register("nexus", _NexusProvider) + def __init__( + self, + *, + endpoint: str, + http_address: str = "http://127.0.0.1:7243", + headers: Mapping[str, str] | None = None, + read_wait: timedelta = _DEFAULT_READ_WAIT, + max_records: int = _DEFAULT_MAX_RECORDS, + data_converter: temporalio.converter.DataConverter | None = None, + ) -> None: + """Point the front at one endpoint. + + Args: + endpoint: The Nexus endpoint's name, resolved to its id through + the operator service of the client a handle is opened with. + When a handle is opened without a client it has to be the id, + because the HTTP ingress dispatches by id. + http_address: The server's Nexus HTTP ingress. + headers: Sent on every request; where an authorization header + belongs. + read_wait: How long the handler may park a read before answering + with what it has. + max_records: The most records one read answer carries. + data_converter: Overrides the client's converter for record + bodies. A payload codec configured here runs on this side of + the endpoint, so records are encoded before they leave the + process and the handler's worker never holds the key. + """ + if not endpoint: + raise ValueError("endpoint must not be empty") + self._endpoint = endpoint + self._http_address = http_address.rstrip("/") + self._headers = dict(headers or {}) + self._read_wait = read_wait + self._max_records = max_records + self._data_converter = data_converter + self._resolved: str | None = None + self._resolving = asyncio.Lock() + + def workflow_provider(self) -> NoReturn: + """Raise: this front has no workflow half.""" + raise StreamUnsupportedError(_WORKFLOW_SIDE_ERROR) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> NexusStreamHandle: + """A handle on ``workflow_id``'s stream through the endpoint. + + ``client`` is not used for transport: it resolves the endpoint's name + and supplies the data converter when none was configured. + """ + return NexusStreamHandle(_Front(self, client), workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: each call opens and closes its own connection.""" + + async def _endpoint_id(self, client: Client | None) -> str: + if self._resolved is not None: + return self._resolved + async with self._resolving: + if self._resolved is None: + if client is None: + self._resolved = self._endpoint + else: + found = await client.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise ValueError( + f"no nexus endpoint is named {self._endpoint!r}" + ) + self._resolved = found.endpoints[0].id + return self._resolved From 22f2468ecc90b2d9bf887e1a4e18c9e15a14f527 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 451/831] Covered the Nexus front on the new surface. --- CHANGELOG.md | 15 +- tests/streams/test_nexus_provider.py | 311 +++++++++++++++++---------- 2 files changed, 204 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f662c135..1d7907278 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,12 +41,15 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. -- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus - endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. Its contract is defined in - `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. - Configure it with `data_converter=` to run a payload codec on the caller - side, so records are encoded before they leave the process. +- **Experimental**: `temporalio.streams.providers.nexus.NexusStreams` puts one + Nexus endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store, and + `TemporalStreamsHandler` serves that endpoint by fronting the provider's own + handles. Its contract is defined in `temporal_streams.nexusrpc.yaml` and the + bindings are generated from it; a record crosses as the serialized + `StreamRecord` proto. Configure the front with `data_converter=` to run a + payload codec on the caller side, so records are encoded before they leave + the process. ### Changed diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 77cec6f4e..ecb0e7cf3 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,7 +1,7 @@ """Conformance for the Nexus front. -The caller talks only to the stream endpoint; the handler delegates to a -storage provider, so these tests are the provider-hiding demonstration: +The caller talks only to the stream endpoint; the handler fronts a storage +provider's own handles, so these tests are the provider-hiding demonstration: nothing on the caller side names or could name the store. The loop test runs over the server's Nexus HTTP ingress and is gated behind @@ -32,20 +32,27 @@ import pytest import temporalio.converter -from temporalio import streams from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams import _frame as frame -from temporalio.streams._provider import instance -from temporalio.streams.providers import memory, nexus -from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import ( - StreamEndpointError, - TemporalStreamsHandler, +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, ) +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers import nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.worker import Worker +from tests.helpers import new_worker from tests.streams.test_workflow_streams_provider import EchoLoop, take +from tests.streams.test_workflow_streams_provider import _feed as feed_echo_loop live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", @@ -56,6 +63,8 @@ HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] +INPUTS = "inputs" +DECISIONS = "decisions" @live_only @@ -63,42 +72,34 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front, and it names the # endpoint the way an operator does, by name. - streams.configure(provider="workflow_streams") + store = WorkflowStreamsProvider() client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - front = instance( - "nexus", + front = NexusStreams( endpoint=ENDPOINT, - client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), - wait_ms=5000, + read_wait=timedelta(seconds=5), ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" - handler = TemporalStreamsHandler(client, provider="workflow_streams") + handler = TemporalStreamsHandler(store, client) async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", workflows=[EchoLoop], - **streams.worker_options(), + plugins=[store], ): handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" ) - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + stream = front.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4, timeout=60) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4, 60) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -110,8 +111,9 @@ async def test_interface_loop_through_the_nexus_front(): # An opaque cursor from behind the front resumes a fresh reader # just past the record it names. checkpoint = records[0].cursor - resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2, 60 + ) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) @@ -136,12 +138,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: """Recover the payloads :meth:`encode` wrapped.""" - out: list[Payload] = [] - for payload in payloads: - inner = Payload() - inner.ParseFromString(self._flip(payload.data)) - out.append(inner) - return out + return [Payload.FromString(self._flip(payload.data)) for payload in payloads] @classmethod def _flip(cls, data: bytes) -> bytes: @@ -202,9 +199,9 @@ def _in_process_endpoint( failing = set(fail_after_applying or []) def post( - url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta ) -> bytes: - del headers, timeout_ms + del headers, timeout posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput @@ -216,24 +213,30 @@ def post( _dispatch(handler, operation, request), loop ).result() except nexusrpc.HandlerError as error: - raise StreamEndpointError(str(error), status=400) from error + # The ingress answers a handler error with a failure body and the + # status its type maps to. + status = 404 if error.type is nexusrpc.HandlerErrorType.NOT_FOUND else 400 + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + json.dumps({"message": str(error)}), status + ) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) if operation in failing: failing.discard(operation) - raise StreamEndpointError("connection reset after the handler answered") + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + "connection reset after the handler answered", None + ) return raw return post -def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: - return instance( - "nexus", +def _front(codec: temporalio.converter.PayloadCodec | None) -> NexusStreams: + return NexusStreams( endpoint="in-process", # This endpoint has no other traffic to wait for, so park briefly # rather than for the contract's default. - wait_ms=200, + read_wait=timedelta(milliseconds=200), data_converter=dataclasses.replace( temporalio.converter.DataConverter.default, payload_codec=codec ), @@ -244,28 +247,19 @@ async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, ) -> tuple[list[Any], list[bytes], list[bytes]]: - memory.reset() - streams.configure(provider="memory") + store = MemoryStreams() posted: list[bytes] = [] answered: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = _front(codec) - workflow_id = "wf-codec" + stream = _front(codec).get_stream_handle(None, "wf-codec") - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"secret": "tuna"}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") - records = await take(consumer.read(type=dict), 2, timeout=30) - memory.reset() + records = await take(stream.read(topic=INPUTS, result_type=dict), 2, timeout=30) + await handler.close() return records, posted, answered @@ -281,7 +275,8 @@ def _answered_bodies(answered: list[bytes]) -> bytes: out = b"" for body in answered: for record in json.loads(body).get("records", []): - out += frame.decode(base64.b64decode(record["frame"]))[5] + wire = WireRecord.FromString(base64.b64decode(record["record"])) + out += wire.body.SerializeToString() return out @@ -315,14 +310,21 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( def _append( - workflow_id: str, batch_index: int, *values: Any, finish: bool = False + workflow_id: str, + batch_index: int, + *values: Any, + sequence: int | None = None, + finish: bool = False, ) -> AppendInput: converter = temporalio.converter.DataConverter.default.payload_converter return AppendInput( workflow_id=workflow_id, - stream="inputs", + topic=INPUTS, producer_id="model", attempt=1, + # Batches of one, numbered in step with the batch index unless a + # case wants them out of step. + sequence=batch_index - 1 if sequence is None else sequence, batch_index=batch_index, payloads=[ converter.to_payloads([value])[0].SerializeToString() for value in values @@ -331,57 +333,62 @@ def _append( ) -async def _stored(workflow_id: str) -> list[Any]: - consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") +async def _stored(store: MemoryStreams, workflow_id: str) -> list[Any]: + stream = store.get_stream_handle(None, workflow_id) + end = await stream.latest(topic=INPUTS) + if end == BEGINNING: + return [] out: list[Any] = [] - async for record in consumer.read(type=dict): + async for record in stream.read(topic=INPUTS, result_type=dict): if record.kind is RecordKind.DATA: out.append(record.value) - if await consumer.latest() == record.cursor: + if record.cursor == end: break return out -@pytest.fixture -def _memory_store(): # pyright: ignore[reportUnusedFunction] - memory.reset() - streams.configure(provider="memory") - yield - memory.reset() - - -@pytest.mark.usefixtures("_memory_store") async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): # A second handler instance stands in for a restarted or load-balanced # handler worker: it shares the store but not the dedupe state. - first = TemporalStreamsHandler(None, provider="memory") - second = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + first = TemporalStreamsHandler(store, None) + second = TemporalStreamsHandler(store, None) await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) with pytest.raises(nexusrpc.HandlerError) as failed: await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST assert failed.value.retryable_override is False + # Named so the caller can raise the same class. + assert str(failed.value).startswith("StreamProducerError: ") # The store holds the first batch and nothing was silently lost or doubled. - assert await _stored("wf") == [{"n": 1}] + assert await _stored(store, "wf") == [{"n": 1}] -@pytest.mark.usefixtures("_memory_store") -async def test_the_handler_drops_repeats_and_rejects_gaps(): - handler = TemporalStreamsHandler(None, provider="memory") +async def test_the_handler_answers_repeats_and_rejects_gaps(): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) - await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - # An exact repeat is dropped with a success answer and no position. + second = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # A repeat of the last batch is written once and answers with where the + # original landed, so a retrying caller checkpoints the same position. repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - assert repeat.cursor is None - with pytest.raises(nexusrpc.HandlerError) as failed: + assert repeat.cursor == second.cursor + with pytest.raises(nexusrpc.HandlerError) as skipped: await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) - assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert skipped.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + with pytest.raises(nexusrpc.HandlerError) as behind: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + assert str(behind.value).startswith("StreamProducerError: ") + with pytest.raises(nexusrpc.HandlerError) as renumbered: + await _dispatch( + handler, APPEND_OPERATION, _append("wf", 3, {"n": 3}, sequence=7) + ) + assert "sequence 7 does not continue at 2" in str(renumbered.value) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] -@pytest.mark.usefixtures("_memory_store") async def test_a_malformed_payload_is_the_callers_fault(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) request = _append("wf", 1) request.payloads = [b"\xff\xfe not a payload"] with pytest.raises(nexusrpc.HandlerError) as failed: @@ -389,12 +396,12 @@ async def test_a_malformed_payload_is_the_callers_fault(): assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST -@pytest.mark.usefixtures("_memory_store") async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -402,28 +409,41 @@ async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # A transport failure is an RPCError, never the transport's own type. + with pytest.raises(RPCError) as failed: await producer.append({"n": 1}) - await producer.append({"n": 1}) + assert failed.value.status == RPCStatusCode.UNAVAILABLE + landed = await producer.append({"n": 1}) await producer.append({"n": 2}) await producer.finish() indexes = [json.loads(body)["batch_index"] for body in posted] - # The retry re-sent index 1, which the handler dropped as a repeat, so - # the store holds each record once. + sequences = [json.loads(body)["sequence"] for body in posted] + # The retry re-sent index 1, which the handler answered as a repeat with + # the original's position, so the store holds each record once. assert indexes == [1, 1, 2, 3] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert sequences == [0, 0, 1, 2] + assert landed == await _memory_position(store, "wf", 0) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def _memory_position( + store: MemoryStreams, workflow_id: str, index: int +) -> Cursor: + records = await take( + store.get_stream_handle(None, workflow_id).read(topic=INPUTS, result_type=dict), + index + 1, + ) + return records[index].cursor -@pytest.mark.usefixtures("_memory_store") async def test_a_failed_append_goes_out_before_the_next_one( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -431,28 +451,52 @@ async def test_a_failed_append_goes_out_before_the_next_one( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + with pytest.raises(RPCError): await producer.append({"n": 1}) # The caller moves on without retrying; the pending batch is replayed # first under its own index and the new one takes the next. await producer.append({"n": 2}) indexes = [json.loads(body)["batch_index"] for body in posted] assert indexes == [1, 1, 2] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def test_a_stream_condition_crosses_the_endpoint_under_its_own_class( + monkeypatch: pytest.MonkeyPatch, +): + handler = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + stream = _front(None).get_stream_handle(None, "wf") + # The token is opaque on this side, so the store behind the endpoint is + # what refuses it, and the refusal arrives on the first read as the class + # the store raised. + with pytest.raises(StreamCursorError): + await take(stream.read(topic=INPUTS, after=Cursor("elsewhere:1")), 1) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + # A second handler has no state for the attempt; the caller learns that + # as a producer conflict. + fresh = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(fresh, [], [])) + with pytest.raises(StreamProducerError): + await producer.append({"n": 2}) + await handler.close() + + +def test_the_front_has_no_workflow_half(): + with pytest.raises(StreamUnsupportedError): + _front(None).workflow_provider() -@pytest.mark.usefixtures("_memory_store") async def test_consecutive_reads_share_one_parked_subscription(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) first = await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, max_records=1, wait_ms=200), ) assert len(first.records) == 1 parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] @@ -464,7 +508,7 @@ async def test_consecutive_reads_share_one_parked_subscription(): READ_OPERATION, ReadInput( workflow_id="wf", - stream="inputs", + topic=INPUTS, after_token=first.next_token, max_records=1, wait_ms=200, @@ -477,21 +521,56 @@ async def test_consecutive_reads_share_one_parked_subscription(): await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=200), ) assert len(parked) == 1 and next(iter(parked.values())).pump is not pump await handler.close() assert not parked -@pytest.mark.usefixtures("_memory_store") async def test_the_read_wait_is_cut_to_the_request_deadline(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) started = asyncio.get_running_loop().time() answer = await handler.read( _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), - ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=60000), ) - assert answer.records == [] and answer.next_token == "" + assert answer.records == [] and answer.next_token == "" and not answer.done assert asyncio.get_running_loop().time() - started < 5 await handler.close() + + +async def test_the_read_ends_when_the_store_ends_it( + client: Client, monkeypatch: pytest.MonkeyPatch +): + # Behind the endpoint sits the Workflow Streams store, whose read ends + # once the run has closed and its tail is served. The front carries that + # end to the caller, whose loop leaves by itself. + store = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + handler = TemporalStreamsHandler(store, client) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + workflow_id = f"streams-nexus-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, plugins=[store]) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await feed_echo_loop(store, client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + stream = _front(None).get_stream_handle(None, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 30) + await handler.close() + assert records == [ + (RecordKind.DATA, {"echo": 1}), + (RecordKind.DATA, {"echo": 2}), + (RecordKind.DATA, {"echo": 3}), + (RecordKind.FINISH, None), + ] From 8109d2678d33d962d22f09c606704a8d44bc97be Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:30:39 -0700 Subject: [PATCH 452/831] Opened the native tests' handles through client.get_stream_handle. --- tests/streams/test_streams_conformance.py | 7 +++++- tests/worker/test_workflow_stream_e2e.py | 27 +++++++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 3dff5b31e..2fa05efff 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -111,8 +111,13 @@ async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") ) provider = NativeStreams() + # Registered once, on the client: the host's worker inherits it and the + # cases open handles through client.get_stream_handle. + config = client.config() + config["plugins"] = [provider] + client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost, plugins=[provider]) as worker: + async with new_worker(client, StreamHost) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index a41b2a495..1d974b401 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -46,8 +46,11 @@ EVENT_STREAM_RECORDS_APPENDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED -async def _connect() -> Client: - return await Client.connect(TARGET or "") +async def _connect(provider: NativeStreams | None = None) -> Client: + # Registered once, on the client: the worker inherits it and the tests + # open handles through client.get_stream_handle. The contrib tests below + # need no provider. + return await Client.connect(TARGET or "", plugins=[provider] if provider else []) async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: @@ -101,8 +104,8 @@ async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None and the server re-supplies the ranges earlier tasks consumed, so the loop completing at all means the same records came back in the same order. """ - client = await _connect() provider = NativeStreams() + client = await _connect(provider) task_queue = "loop-tq-" + uuid.uuid4().hex[:8] workflow_id = "loop-wf-" + uuid.uuid4().hex[:8] try: @@ -110,13 +113,12 @@ async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None client, task_queue=task_queue, workflows=[ContractLoop], - plugins=[provider], max_cached_workflows=0, ): handle = await client.start_workflow( ContractLoop.run, id=workflow_id, task_queue=task_queue ) - stream = provider.get_stream_handle(client, workflow_id) + stream = client.get_stream_handle(workflow_id) first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await first.append({"n": 1}, {"n": 2}) second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) @@ -185,8 +187,8 @@ async def run(self) -> None: async def test_a_failed_task_publishes_nothing() -> None: """Rule 1 on the native provider: the server applies the command with the task.""" - client = await _connect() provider = NativeStreams() + client = await _connect(provider) task_queue = "fail-tq-" + uuid.uuid4().hex[:8] workflow_id = "fail-wf-" + uuid.uuid4().hex[:8] try: @@ -194,12 +196,11 @@ async def test_a_failed_task_publishes_nothing() -> None: client, task_queue=task_queue, workflows=[PublishThenFail], - plugins=[provider], ): handle = await client.start_workflow( PublishThenFail.run, id=workflow_id, task_queue=task_queue ) - stream = provider.get_stream_handle(client, workflow_id) + stream = client.get_stream_handle(workflow_id) records = await take( stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60 ) @@ -226,18 +227,16 @@ async def run(self, run: int) -> None: async def test_a_handle_without_a_run_id_reads_across_continue_as_new() -> None: - client = await _connect() provider = NativeStreams() + client = await _connect(provider) task_queue = "relay-tq-" + uuid.uuid4().hex[:8] workflow_id = "relay-wf-" + uuid.uuid4().hex[:8] try: - async with Worker( - client, task_queue=task_queue, workflows=[Relay], plugins=[provider] - ): + async with Worker(client, task_queue=task_queue, workflows=[Relay]): handle = await client.start_workflow( Relay.run, 0, id=workflow_id, task_queue=task_queue ) - stream = provider.get_stream_handle(client, workflow_id) + stream = client.get_stream_handle(workflow_id) async def read_everything() -> list[Any]: return [ @@ -256,7 +255,7 @@ async def read_everything() -> list[Any]: ] # Pinned to the last run, a handle sees that run's stream alone. last_run = (await client.get_workflow_handle(workflow_id).describe()).run_id - pinned = provider.get_stream_handle(client, workflow_id, run_id=last_run) + pinned = client.get_stream_handle(workflow_id, run_id=last_run) only_last = [ r.value async for r in pinned.read(topic=DECISIONS, result_type=dict) ] From 8e46845008c9fe87c287b11906ecf917e7814f8f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:32:58 -0700 Subject: [PATCH 453/831] Let the Nexus front register on a client like any provider. --- temporalio/streams/providers/nexus.py | 31 +++++++++++++++++++++------ tests/streams/test_nexus_provider.py | 15 ++++++++++++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 07da0318b..372f50785 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -58,7 +58,7 @@ import urllib.error import urllib.request from collections import OrderedDict -from collections.abc import AsyncGenerator, Mapping +from collections.abc import AsyncGenerator, Awaitable, Callable, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone from typing import Any, NoReturn, TypeVar, cast @@ -67,12 +67,13 @@ import nexusrpc.handler from google.protobuf.message import DecodeError +import temporalio.client import temporalio.converter from temporalio.api.common.v1 import Payload from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest -from temporalio.client import Client +from temporalio.client import Client, ClientConfig from temporalio.common import RawValue -from temporalio.service import RPCError, RPCStatusCode +from temporalio.service import ConnectConfig, RPCError, RPCStatusCode, ServiceClient from temporalio.streams._errors import ( StreamCursorError, StreamError, @@ -843,12 +844,15 @@ def producer( ) -class NexusStreams(StreamProvider): +class NexusStreams(StreamProvider, temporalio.client.Plugin): """The outside half of a provider, over one Nexus endpoint. - Not a worker plugin: a workflow publishes and reads through the storage - provider its worker was given, and this front only serves code outside a - workflow. The endpoint hides which store that is. + A client plugin but not a worker plugin: a workflow publishes and reads + through the storage provider its worker was given, and this front only + serves code outside a workflow, so ``Client.connect(plugins=[front])`` + makes ``client.get_stream_handle()`` go through the endpoint while a + worker built from that client is left without a provider. The endpoint + hides which store sits behind it. """ def __init__( @@ -907,6 +911,19 @@ def get_stream_handle( async def close(self) -> None: """Nothing to release: each call opens and closes its own connection.""" + def configure_client(self, config: ClientConfig) -> ClientConfig: + """Set this front as the client's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def connect_service_client( + self, + config: ConnectConfig, + next: Callable[[ConnectConfig], Awaitable[ServiceClient]], + ) -> ServiceClient: + """Connect unchanged.""" + return await next(config) + async def _endpoint_id(self, client: Client | None) -> str: if self._resolved is not None: return self._resolved diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index ecb0e7cf3..b09b8d2e2 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -47,7 +47,11 @@ from temporalio.streams.providers import nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.memory import MemoryStreams -from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler +from temporalio.streams.providers.nexus import ( + NexusStreamHandle, + NexusStreams, + TemporalStreamsHandler, +) from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.worker import Worker from tests.helpers import new_worker @@ -490,6 +494,15 @@ def test_the_front_has_no_workflow_half(): _front(None).workflow_provider() +async def test_the_front_registers_on_a_client(client: Client): + # The same accessor as any provider, so code outside a workflow does not + # change when the store moves behind an endpoint. + config = client.config() + config["plugins"] = [_front(None)] + registered = Client(**config) + assert isinstance(registered.get_stream_handle("wf"), NexusStreamHandle) + + async def test_consecutive_reads_share_one_parked_subscription(): handler = TemporalStreamsHandler(MemoryStreams(), None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) From d536ce946f425988039fd2caf6e455c07252d40e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:39:28 -0700 Subject: [PATCH 454/831] Restored the bridge protos and the conformance suite after the merges. --- .../workflow_activation_pb2.py | 176 +++++--- .../workflow_activation_pb2.pyi | 264 +++++++++++- .../proto/workflow_commands/__init__.py | 18 + .../workflow_commands_pb2.py | 275 +++++++++---- .../workflow_commands_pb2.pyi | 376 +++++++++++++++++- tests/streams/test_streams_conformance.py | 12 - 6 files changed, 975 insertions(+), 146 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 7f6d3e782..f0a8a0ac8 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -42,17 +42,31 @@ from temporalio.bridge.proto.common import ( common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, ) +from temporalio.bridge.proto.external_data import ( + external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2, +) from temporalio.bridge.proto.nexus import ( nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, ) +from temporalio.bridge.proto.workflow_commands import ( + workflow_commands_pb2 as temporal_dot_sdk_dot_core_dot_workflow__commands_dot_workflow__commands__pb2, +) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto\x1a;temporal/sdk/core/workflow_commands/workflow_commands.proto"\xc2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\x12\x1e\n\x16history_floor_event_id\x18\r \x01(\x03"\xa9\x0e\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12`\n\x1dresolve_external_stream_waits\x18\x11 \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveExternalStreamWaitsH\x00\x12^\n\x1cprepare_external_stream_park\x18\x12 \x01(\x0b\x32\x36.coresdk.workflow_activation.PrepareExternalStreamParkH\x00\x12U\n\x17replay_external_streams\x18\x13 \x01(\x0b\x32\x32.coresdk.workflow_activation.ReplayExternalStreamsH\x00\x12Y\n\x19\x66inalize_external_streams\x18\x14 \x01(\x0b\x32\x34.coresdk.workflow_activation.FinalizeExternalStreamsH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x7f\n\x1aResolveExternalStreamWaits\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x42\n\x0bready_hints\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait"\xab\x01\n\x19PrepareExternalStreamPark\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x92\x02\n\x15ReplayExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x19\n\x11replay_annotation\x18\x03 \x01(\x0c\x12<\n\x11terminal_boundary\x18\x04 \x01(\x0e\x32!.coresdk.external_data.ParkReason\x12\x43\n\x06output\x18\x05 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest"\xa9\x01\n\x17\x46inalizeExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_RESOLVEEXTERNALSTREAMWAITS = DESCRIPTOR.message_types_by_name[ + "ResolveExternalStreamWaits" +] +_PREPAREEXTERNALSTREAMPARK = DESCRIPTOR.message_types_by_name[ + "PrepareExternalStreamPark" +] +_REPLAYEXTERNALSTREAMS = DESCRIPTOR.message_types_by_name["ReplayExternalStreams"] +_FINALIZEEXTERNALSTREAMS = DESCRIPTOR.message_types_by_name["FinalizeExternalStreams"] _DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ @@ -118,6 +132,50 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) +ResolveExternalStreamWaits = _reflection.GeneratedProtocolMessageType( + "ResolveExternalStreamWaits", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEEXTERNALSTREAMWAITS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveExternalStreamWaits) + }, +) +_sym_db.RegisterMessage(ResolveExternalStreamWaits) + +PrepareExternalStreamPark = _reflection.GeneratedProtocolMessageType( + "PrepareExternalStreamPark", + (_message.Message,), + { + "DESCRIPTOR": _PREPAREEXTERNALSTREAMPARK, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.PrepareExternalStreamPark) + }, +) +_sym_db.RegisterMessage(PrepareExternalStreamPark) + +ReplayExternalStreams = _reflection.GeneratedProtocolMessageType( + "ReplayExternalStreams", + (_message.Message,), + { + "DESCRIPTOR": _REPLAYEXTERNALSTREAMS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ReplayExternalStreams) + }, +) +_sym_db.RegisterMessage(ReplayExternalStreams) + +FinalizeExternalStreams = _reflection.GeneratedProtocolMessageType( + "FinalizeExternalStreams", + (_message.Message,), + { + "DESCRIPTOR": _FINALIZEEXTERNALSTREAMS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FinalizeExternalStreams) + }, +) +_sym_db.RegisterMessage(FinalizeExternalStreams) + DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( "DeliverStreamRecords", (_message.Message,), @@ -391,58 +449,66 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 570 - _WORKFLOWACTIVATION._serialized_end = 1116 - _WORKFLOWACTIVATIONJOB._serialized_start = 1119 - _WORKFLOWACTIVATIONJOB._serialized_end = 2580 - _DELIVERSTREAMRECORDS._serialized_start = 2583 - _DELIVERSTREAMRECORDS._serialized_end = 2719 - _INITIALIZEWORKFLOW._serialized_start = 2722 - _INITIALIZEWORKFLOW._serialized_end = 4126 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _FIRETIMER._serialized_start = 4128 - _FIRETIMER._serialized_end = 4152 - _RESOLVEACTIVITY._serialized_start = 4154 - _RESOLVEACTIVITY._serialized_end = 4263 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4266 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4603 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4605 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4664 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4667 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4833 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4835 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4931 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4933 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5038 - _UPDATERANDOMSEED._serialized_start = 5040 - _UPDATERANDOMSEED._serialized_end = 5083 - _QUERYWORKFLOW._serialized_start = 5086 - _QUERYWORKFLOW._serialized_end = 5346 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _CANCELWORKFLOW._serialized_start = 5348 - _CANCELWORKFLOW._serialized_end = 5380 - _SIGNALWORKFLOW._serialized_start = 5383 - _SIGNALWORKFLOW._serialized_end = 5672 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _NOTIFYHASPATCH._serialized_start = 5674 - _NOTIFYHASPATCH._serialized_end = 5708 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5710 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5805 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5807 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5909 - _DOUPDATE._serialized_start = 5912 - _DOUPDATE._serialized_end = 6243 - _DOUPDATE_HEADERSENTRY._serialized_start = 4047 - _DOUPDATE_HEADERSENTRY._serialized_end = 4126 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6246 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6400 - _RESOLVENEXUSOPERATION._serialized_start = 6402 - _RESOLVENEXUSOPERATION._serialized_end = 6491 - _REMOVEFROMCACHE._serialized_start = 6494 - _REMOVEFROMCACHE._serialized_end = 6846 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6608 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6846 + _WORKFLOWACTIVATION._serialized_start = 684 + _WORKFLOWACTIVATION._serialized_end = 1262 + _WORKFLOWACTIVATIONJOB._serialized_start = 1265 + _WORKFLOWACTIVATIONJOB._serialized_end = 3098 + _RESOLVEEXTERNALSTREAMWAITS._serialized_start = 3100 + _RESOLVEEXTERNALSTREAMWAITS._serialized_end = 3227 + _PREPAREEXTERNALSTREAMPARK._serialized_start = 3230 + _PREPAREEXTERNALSTREAMPARK._serialized_end = 3401 + _REPLAYEXTERNALSTREAMS._serialized_start = 3404 + _REPLAYEXTERNALSTREAMS._serialized_end = 3678 + _FINALIZEEXTERNALSTREAMS._serialized_start = 3681 + _FINALIZEEXTERNALSTREAMS._serialized_end = 3850 + _DELIVERSTREAMRECORDS._serialized_start = 3853 + _DELIVERSTREAMRECORDS._serialized_end = 3989 + _INITIALIZEWORKFLOW._serialized_start = 3992 + _INITIALIZEWORKFLOW._serialized_end = 5396 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 5317 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 5396 + _FIRETIMER._serialized_start = 5398 + _FIRETIMER._serialized_end = 5422 + _RESOLVEACTIVITY._serialized_start = 5424 + _RESOLVEACTIVITY._serialized_end = 5533 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 5536 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 5873 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 5875 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 5934 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 5937 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 6103 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 6105 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 6201 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 6203 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 6308 + _UPDATERANDOMSEED._serialized_start = 6310 + _UPDATERANDOMSEED._serialized_end = 6353 + _QUERYWORKFLOW._serialized_start = 6356 + _QUERYWORKFLOW._serialized_end = 6616 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 5317 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 5396 + _CANCELWORKFLOW._serialized_start = 6618 + _CANCELWORKFLOW._serialized_end = 6650 + _SIGNALWORKFLOW._serialized_start = 6653 + _SIGNALWORKFLOW._serialized_end = 6942 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 5317 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 5396 + _NOTIFYHASPATCH._serialized_start = 6944 + _NOTIFYHASPATCH._serialized_end = 6978 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 6980 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 7075 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 7077 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 7179 + _DOUPDATE._serialized_start = 7182 + _DOUPDATE._serialized_end = 7513 + _DOUPDATE_HEADERSENTRY._serialized_start = 5317 + _DOUPDATE_HEADERSENTRY._serialized_end = 5396 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 7516 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 7670 + _RESOLVENEXUSOPERATION._serialized_start = 7672 + _RESOLVENEXUSOPERATION._serialized_end = 7761 + _REMOVEFROMCACHE._serialized_start = 7764 + _REMOVEFROMCACHE._serialized_end = 8116 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 7878 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 8116 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index ac9ac13f7..225f1ea9d 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -26,7 +26,9 @@ import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 +import temporalio.bridge.proto.external_data.external_data_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 +import temporalio.bridge.proto.workflow_commands.workflow_commands_pb2 if sys.version_info >= (3, 10): import typing as typing_extensions @@ -96,6 +98,7 @@ class WorkflowActivation(google.protobuf.message.Message): LAST_SDK_VERSION_FIELD_NUMBER: builtins.int SUGGEST_CONTINUE_AS_NEW_REASONS_FIELD_NUMBER: builtins.int TARGET_WORKER_DEPLOYMENT_VERSION_CHANGED_FIELD_NUMBER: builtins.int + HISTORY_FLOOR_EVENT_ID_FIELD_NUMBER: builtins.int run_id: builtins.str """The id of the currently active run of the workflow. Also used as a cache key. There may only ever be one active workflow task (and hence activation) of a run at one time. @@ -157,6 +160,11 @@ class WorkflowActivation(google.protobuf.message.Message): the workflow is Pinned. Experimental. """ + history_floor_event_id: builtins.int + """The event immediately preceding this Workflow Task's WorkflowTaskScheduled event in the + ordered History view Core used to build the activation. Zero means Core could not identify + that exact predecessor, in which case output must not be staged for this task. + """ def __init__( self, *, @@ -176,6 +184,7 @@ class WorkflowActivation(google.protobuf.message.Message): ] | None = ..., target_worker_deployment_version_changed: builtins.bool = ..., + history_floor_event_id: builtins.int = ..., ) -> None: ... def HasField( self, @@ -195,6 +204,8 @@ class WorkflowActivation(google.protobuf.message.Message): b"continue_as_new_suggested", "deployment_version_for_current_task", b"deployment_version_for_current_task", + "history_floor_event_id", + b"history_floor_event_id", "history_length", b"history_length", "history_size_bytes", @@ -236,6 +247,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + RESOLVE_EXTERNAL_STREAM_WAITS_FIELD_NUMBER: builtins.int + PREPARE_EXTERNAL_STREAM_PARK_FIELD_NUMBER: builtins.int + REPLAY_EXTERNAL_STREAMS_FIELD_NUMBER: builtins.int + FINALIZE_EXTERNAL_STREAMS_FIELD_NUMBER: builtins.int DELIVER_STREAM_RECORDS_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property @@ -297,10 +312,23 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def resolve_external_stream_waits(self) -> global___ResolveExternalStreamWaits: + """One or more external stream waits may have data buffered. Runs user workflow code.""" + @property + def prepare_external_stream_park(self) -> global___PrepareExternalStreamPark: + """Runtime-internal: install park intents and recheck every stream. Runs no user code.""" + @property + def replay_external_streams(self) -> global___ReplayExternalStreams: + """Replay: deliver the recorded external stream observations from a marker.""" + @property + def finalize_external_streams(self) -> global___FinalizeExternalStreams: + """Runtime-internal: encode the terminal boundary for a marker Core is about to write. + Runs no user code. + """ + @property def deliver_stream_records(self) -> global___DeliverStreamRecords: - """17 to 20 are taken by the external stream jobs, which are developed - alongside this one and share this message. The number below is fixed - with that family and must not be reused. + """The number below is shared with the native stream tree, which leaves 17 + to 20 to the jobs above, and must not be reused. A range of a stream the workflow subscribed to. """ @@ -332,6 +360,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + resolve_external_stream_waits: global___ResolveExternalStreamWaits | None = ..., + prepare_external_stream_park: global___PrepareExternalStreamPark | None = ..., + replay_external_streams: global___ReplayExternalStreams | None = ..., + finalize_external_streams: global___FinalizeExternalStreams | None = ..., deliver_stream_records: global___DeliverStreamRecords | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... @@ -344,22 +376,30 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"deliver_stream_records", "do_update", b"do_update", + "finalize_external_streams", + b"finalize_external_streams", "fire_timer", b"fire_timer", "initialize_workflow", b"initialize_workflow", "notify_has_patch", b"notify_has_patch", + "prepare_external_stream_park", + b"prepare_external_stream_park", "query_workflow", b"query_workflow", "remove_from_cache", b"remove_from_cache", + "replay_external_streams", + b"replay_external_streams", "resolve_activity", b"resolve_activity", "resolve_child_workflow_execution", b"resolve_child_workflow_execution", "resolve_child_workflow_execution_start", b"resolve_child_workflow_execution_start", + "resolve_external_stream_waits", + b"resolve_external_stream_waits", "resolve_nexus_operation", b"resolve_nexus_operation", "resolve_nexus_operation_start", @@ -385,22 +425,30 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"deliver_stream_records", "do_update", b"do_update", + "finalize_external_streams", + b"finalize_external_streams", "fire_timer", b"fire_timer", "initialize_workflow", b"initialize_workflow", "notify_has_patch", b"notify_has_patch", + "prepare_external_stream_park", + b"prepare_external_stream_park", "query_workflow", b"query_workflow", "remove_from_cache", b"remove_from_cache", + "replay_external_streams", + b"replay_external_streams", "resolve_activity", b"resolve_activity", "resolve_child_workflow_execution", b"resolve_child_workflow_execution", "resolve_child_workflow_execution_start", b"resolve_child_workflow_execution_start", + "resolve_external_stream_waits", + b"resolve_external_stream_waits", "resolve_nexus_operation", b"resolve_nexus_operation", "resolve_nexus_operation_start", @@ -436,6 +484,10 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "resolve_external_stream_waits", + "prepare_external_stream_park", + "replay_external_streams", + "finalize_external_streams", "deliver_stream_records", "remove_from_cache", ] @@ -444,6 +496,212 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class ResolveExternalStreamWaits(google.protobuf.message.Message): + """Tells lang that one or more external stream waits may now have data. + + This job contains no records. The listed waits are readiness *hints*, not an exhaustive + availability claim: on receipt lang probes every active wait, drains all currently available + inputs, and only then resumes Workflow futures. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + READY_HINTS_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def ready_hints( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + ready_hints: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "ready_hints", + b"ready_hints", + ], + ) -> None: ... + +global___ResolveExternalStreamWaits = ResolveExternalStreamWaits + +class PrepareExternalStreamPark(google.protobuf.message.Message): + """Asks lang to park the complete active wait set through the backend handshake. + + Runtime-internal: no user Workflow code runs. Lang installs a park intent per subscription, + rechecks every stream, and answers with ExternalStreamParkResult. A recheck that finds records + answers `became_ready` instead, and Core issues a normal resolve activation next. + + Requires backend I/O, so lang must not handle this on the synchronous Workflow thread. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: + """Always the complete active wait set.""" + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + """One of PARK_REASON_IDLE, PARK_REASON_ALL_WRITE_FENCED, or PARK_REASON_SHUTDOWN.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "reason", + b"reason", + "waits", + b"waits", + ], + ) -> None: ... + +global___PrepareExternalStreamPark = PrepareExternalStreamPark + +class ReplayExternalStreams(google.protobuf.message.Message): + """Carries a recorded marker's annotation back to lang during replay. + + Core issues exactly one of these per marker. Lang's replay driver walks the annotation's + segments in order, performing one event-loop drain per segment, so the live run's k + activations become k drains inside this one activation and condition evaluation matches. + + Requires backend I/O (the recorded range reads and their integrity validation), so lang must + prepare it off the Workflow thread and deliver from memory once it is on it. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REPLAY_ANNOTATION_FIELD_NUMBER: builtins.int + TERMINAL_BOUNDARY_FIELD_NUMBER: builtins.int + OUTPUT_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + replay_annotation: builtins.bytes + """Opaque to Core.""" + terminal_boundary: ( + temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + ) + @property + def output( + self, + ) -> temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest: + """The output manifest recorded in the same marker, if this Workflow Task published output.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + replay_annotation: builtins.bytes = ..., + terminal_boundary: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + output: temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["output", b"output"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "output", + b"output", + "quiescence_generation", + b"quiescence_generation", + "replay_annotation", + b"replay_annotation", + "terminal_boundary", + b"terminal_boundary", + "waits", + b"waits", + ], + ) -> None: ... + +global___ReplayExternalStreams = ReplayExternalStreams + +class FinalizeExternalStreams(google.protobuf.message.Message): + """Issued before Core writes a marker for a boundary Core itself decided and no park handshake + will run: rollover-deadline expiry, and shutdown or eviction with a Workflow Task open. + + Runs no user Workflow code, cannot resolve futures, and its only legal responses are + ExternalStreamFinalized or an activation failure. It requires *no* backend I/O: lang reads the + blocked cursor snapshot from its own in-memory manager state. If lang cannot answer, Core + writes no marker and the Workflow Task fails for retry -- there is no best-effort path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ]: ... + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType + """One of PARK_REASON_ROLLOVER or PARK_REASON_SHUTDOWN.""" + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[ + temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.ExternalStreamWait + ] + | None = ..., + reason: temporalio.bridge.proto.external_data.external_data_pb2.ParkReason.ValueType = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "quiescence_generation", + b"quiescence_generation", + "reason", + b"reason", + "waits", + b"waits", + ], + ) -> None: ... + +global___FinalizeExternalStreams = FinalizeExternalStreams + class DeliverStreamRecords(google.protobuf.message.Message): """Hand a workflow the next range of a stream it subscribed to. diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 9fb1c8f08..5f187d310 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -7,8 +7,12 @@ CancelWorkflowExecution, CompleteWorkflowExecution, ContinueAsNewWorkflowExecution, + ExternalStreamFinalized, + ExternalStreamParkResult, + ExternalStreamWait, FailWorkflowExecution, ModifyWorkflowProperties, + ParkSetConfirmed, QueryResult, QuerySuccess, RequestCancelActivity, @@ -22,10 +26,15 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + StreamSetBecameReady, SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, + WorkflowOutputStreamBuffered, + WorkflowOutputStreamCommit, + WorkflowStreamProgress, + WorkflowStreamQuiescent, ) __all__ = [ @@ -37,8 +46,12 @@ "CancelWorkflowExecution", "CompleteWorkflowExecution", "ContinueAsNewWorkflowExecution", + "ExternalStreamFinalized", + "ExternalStreamParkResult", + "ExternalStreamWait", "FailWorkflowExecution", "ModifyWorkflowProperties", + "ParkSetConfirmed", "QueryResult", "QuerySuccess", "RequestCancelActivity", @@ -52,8 +65,13 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "StreamSetBecameReady", "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", + "WorkflowOutputStreamBuffered", + "WorkflowOutputStreamCommit", + "WorkflowStreamProgress", + "WorkflowStreamQuiescent", ] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 5af8f0744..e03636d49 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -43,12 +43,15 @@ from temporalio.bridge.proto.common import ( common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, ) +from temporalio.bridge.proto.external_data import ( + external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2, +) from temporalio.bridge.proto.nexus import ( nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xeb\x15\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,6 +62,19 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_WORKFLOWSTREAMPROGRESS = DESCRIPTOR.message_types_by_name["WorkflowStreamProgress"] +_WORKFLOWSTREAMQUIESCENT = DESCRIPTOR.message_types_by_name["WorkflowStreamQuiescent"] +_EXTERNALSTREAMWAIT = DESCRIPTOR.message_types_by_name["ExternalStreamWait"] +_EXTERNALSTREAMPARKRESULT = DESCRIPTOR.message_types_by_name["ExternalStreamParkResult"] +_PARKSETCONFIRMED = DESCRIPTOR.message_types_by_name["ParkSetConfirmed"] +_STREAMSETBECAMEREADY = DESCRIPTOR.message_types_by_name["StreamSetBecameReady"] +_EXTERNALSTREAMFINALIZED = DESCRIPTOR.message_types_by_name["ExternalStreamFinalized"] +_WORKFLOWOUTPUTSTREAMCOMMIT = DESCRIPTOR.message_types_by_name[ + "WorkflowOutputStreamCommit" +] +_WORKFLOWOUTPUTSTREAMBUFFERED = DESCRIPTOR.message_types_by_name[ + "WorkflowOutputStreamBuffered" +] _APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] _SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] @@ -135,6 +151,105 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +WorkflowStreamProgress = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamProgress", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMPROGRESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamProgress) + }, +) +_sym_db.RegisterMessage(WorkflowStreamProgress) + +WorkflowStreamQuiescent = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamQuiescent", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMQUIESCENT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamQuiescent) + }, +) +_sym_db.RegisterMessage(WorkflowStreamQuiescent) + +ExternalStreamWait = _reflection.GeneratedProtocolMessageType( + "ExternalStreamWait", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMWAIT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamWait) + }, +) +_sym_db.RegisterMessage(ExternalStreamWait) + +ExternalStreamParkResult = _reflection.GeneratedProtocolMessageType( + "ExternalStreamParkResult", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMPARKRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamParkResult) + }, +) +_sym_db.RegisterMessage(ExternalStreamParkResult) + +ParkSetConfirmed = _reflection.GeneratedProtocolMessageType( + "ParkSetConfirmed", + (_message.Message,), + { + "DESCRIPTOR": _PARKSETCONFIRMED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ParkSetConfirmed) + }, +) +_sym_db.RegisterMessage(ParkSetConfirmed) + +StreamSetBecameReady = _reflection.GeneratedProtocolMessageType( + "StreamSetBecameReady", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSETBECAMEREADY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StreamSetBecameReady) + }, +) +_sym_db.RegisterMessage(StreamSetBecameReady) + +ExternalStreamFinalized = _reflection.GeneratedProtocolMessageType( + "ExternalStreamFinalized", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMFINALIZED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamFinalized) + }, +) +_sym_db.RegisterMessage(ExternalStreamFinalized) + +WorkflowOutputStreamCommit = _reflection.GeneratedProtocolMessageType( + "WorkflowOutputStreamCommit", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWOUTPUTSTREAMCOMMIT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowOutputStreamCommit) + }, +) +_sym_db.RegisterMessage(WorkflowOutputStreamCommit) + +WorkflowOutputStreamBuffered = _reflection.GeneratedProtocolMessageType( + "WorkflowOutputStreamBuffered", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWOUTPUTSTREAMBUFFERED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowOutputStreamBuffered) + }, +) +_sym_db.RegisterMessage(WorkflowOutputStreamBuffered) + AppendStreamRecords = _reflection.GeneratedProtocolMessageType( "AppendStreamRecords", (_message.Message,), @@ -511,74 +626,92 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9020 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9108 - _WORKFLOWCOMMAND._serialized_start = 556 - _WORKFLOWCOMMAND._serialized_end = 2798 - _APPENDSTREAMRECORDS._serialized_start = 2800 - _APPENDSTREAMRECORDS._serialized_end = 2895 - _SUBSCRIBESTREAM._serialized_start = 2897 - _SUBSCRIBESTREAM._serialized_end = 2955 - _STARTTIMER._serialized_start = 2957 - _STARTTIMER._serialized_end = 3040 - _CANCELTIMER._serialized_start = 3042 - _CANCELTIMER._serialized_end = 3068 - _SCHEDULEACTIVITY._serialized_start = 3071 - _SCHEDULEACTIVITY._serialized_end = 3895 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3816 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3895 - _SCHEDULELOCALACTIVITY._serialized_start = 3898 - _SCHEDULELOCALACTIVITY._serialized_end = 4687 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3816 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3895 - _REQUESTCANCELACTIVITY._serialized_start = 4689 - _REQUESTCANCELACTIVITY._serialized_end = 4725 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4727 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4768 - _QUERYRESULT._serialized_start = 4771 - _QUERYRESULT._serialized_end = 4927 - _QUERYSUCCESS._serialized_start = 4929 - _QUERYSUCCESS._serialized_end = 4994 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4996 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5072 - _FAILWORKFLOWEXECUTION._serialized_start = 5074 - _FAILWORKFLOWEXECUTION._serialized_end = 5148 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5151 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6065 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _CANCELWORKFLOWEXECUTION._serialized_start = 6067 - _CANCELWORKFLOWEXECUTION._serialized_end = 6143 - _SETPATCHMARKER._serialized_start = 6145 - _SETPATCHMARKER._serialized_end = 6199 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6202 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7376 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7378 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7452 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7455 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7597 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7600 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7999 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _CANCELSIGNALWORKFLOW._serialized_start = 8001 - _CANCELSIGNALWORKFLOW._serialized_end = 8036 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8038 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8139 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8141 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8220 - _UPDATERESPONSE._serialized_start = 8223 - _UPDATERESPONSE._serialized_end = 8433 - _SCHEDULENEXUSOPERATION._serialized_start = 8436 - _SCHEDULENEXUSOPERATION._serialized_end = 8974 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8924 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8974 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8976 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9018 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 10557 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 10645 + _WORKFLOWCOMMAND._serialized_start = 609 + _WORKFLOWCOMMAND._serialized_end = 3404 + _WORKFLOWSTREAMPROGRESS._serialized_start = 3406 + _WORKFLOWSTREAMPROGRESS._serialized_end = 3483 + _WORKFLOWSTREAMQUIESCENT._serialized_start = 3486 + _WORKFLOWSTREAMQUIESCENT._serialized_end = 3653 + _EXTERNALSTREAMWAIT._serialized_start = 3655 + _EXTERNALSTREAMWAIT._serialized_end = 3742 + _EXTERNALSTREAMPARKRESULT._serialized_start = 3745 + _EXTERNALSTREAMPARKRESULT._serialized_end = 3985 + _PARKSETCONFIRMED._serialized_start = 3987 + _PARKSETCONFIRMED._serialized_end = 4005 + _STREAMSETBECAMEREADY._serialized_start = 4007 + _STREAMSETBECAMEREADY._serialized_end = 4029 + _EXTERNALSTREAMFINALIZED._serialized_start = 4031 + _EXTERNALSTREAMFINALIZED._serialized_end = 4120 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 4122 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4247 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4249 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4335 + _APPENDSTREAMRECORDS._serialized_start = 4337 + _APPENDSTREAMRECORDS._serialized_end = 4432 + _SUBSCRIBESTREAM._serialized_start = 4434 + _SUBSCRIBESTREAM._serialized_end = 4492 + _STARTTIMER._serialized_start = 4494 + _STARTTIMER._serialized_end = 4577 + _CANCELTIMER._serialized_start = 4579 + _CANCELTIMER._serialized_end = 4605 + _SCHEDULEACTIVITY._serialized_start = 4608 + _SCHEDULEACTIVITY._serialized_end = 5432 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5353 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5432 + _SCHEDULELOCALACTIVITY._serialized_start = 5435 + _SCHEDULELOCALACTIVITY._serialized_end = 6224 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5353 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5432 + _REQUESTCANCELACTIVITY._serialized_start = 6226 + _REQUESTCANCELACTIVITY._serialized_end = 6262 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 6264 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 6305 + _QUERYRESULT._serialized_start = 6308 + _QUERYRESULT._serialized_end = 6464 + _QUERYSUCCESS._serialized_start = 6466 + _QUERYSUCCESS._serialized_end = 6531 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 6533 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 6609 + _FAILWORKFLOWEXECUTION._serialized_start = 6611 + _FAILWORKFLOWEXECUTION._serialized_end = 6685 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6688 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7602 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7445 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7521 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5353 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5432 + _CANCELWORKFLOWEXECUTION._serialized_start = 7604 + _CANCELWORKFLOWEXECUTION._serialized_end = 7680 + _SETPATCHMARKER._serialized_start = 7682 + _SETPATCHMARKER._serialized_end = 7736 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7739 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8913 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5353 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5432 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7445 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7521 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8915 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8989 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8992 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9134 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9137 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9536 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5353 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5432 + _CANCELSIGNALWORKFLOW._serialized_start = 9538 + _CANCELSIGNALWORKFLOW._serialized_end = 9573 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9575 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9676 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 9678 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 9757 + _UPDATERESPONSE._serialized_start = 9760 + _UPDATERESPONSE._serialized_end = 9970 + _SCHEDULENEXUSOPERATION._serialized_start = 9973 + _SCHEDULENEXUSOPERATION._serialized_end = 10511 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10461 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10511 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 10513 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 10555 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index b4848ddb1..4988498a8 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -28,6 +28,7 @@ import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 +import temporalio.bridge.proto.external_data.external_data_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 if sys.version_info >= (3, 10): @@ -104,6 +105,12 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_PROGRESS_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_QUIESCENT_FIELD_NUMBER: builtins.int + EXTERNAL_STREAM_PARK_RESULT_FIELD_NUMBER: builtins.int + EXTERNAL_STREAM_FINALIZED_FIELD_NUMBER: builtins.int + WORKFLOW_OUTPUT_STREAM_COMMIT_FIELD_NUMBER: builtins.int + WORKFLOW_OUTPUT_STREAM_BUFFERED_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int @property @@ -181,10 +188,23 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property + def workflow_stream_progress(self) -> global___WorkflowStreamProgress: ... + @property + def workflow_stream_quiescent(self) -> global___WorkflowStreamQuiescent: ... + @property + def external_stream_park_result(self) -> global___ExternalStreamParkResult: ... + @property + def external_stream_finalized(self) -> global___ExternalStreamFinalized: ... + @property + def workflow_output_stream_commit(self) -> global___WorkflowOutputStreamCommit: ... + @property + def workflow_output_stream_buffered( + self, + ) -> global___WorkflowOutputStreamBuffered: ... + @property def subscribe_stream(self) -> global___SubscribeStream: - """23 to 28 are taken by the external stream commands, which are developed - alongside these and share this message. The two numbers below are fixed - with that family and must not be reused. + """The two numbers below are shared with the native stream tree, which + leaves 23 to 28 to the commands above, and must not be reused. """ @property def append_stream_records(self) -> global___AppendStreamRecords: ... @@ -226,6 +246,13 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + workflow_stream_progress: global___WorkflowStreamProgress | None = ..., + workflow_stream_quiescent: global___WorkflowStreamQuiescent | None = ..., + external_stream_park_result: global___ExternalStreamParkResult | None = ..., + external_stream_finalized: global___ExternalStreamFinalized | None = ..., + workflow_output_stream_commit: global___WorkflowOutputStreamCommit | None = ..., + workflow_output_stream_buffered: global___WorkflowOutputStreamBuffered + | None = ..., subscribe_stream: global___SubscribeStream | None = ..., append_stream_records: global___AppendStreamRecords | None = ..., ) -> None: ... @@ -246,6 +273,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"complete_workflow_execution", "continue_as_new_workflow_execution", b"continue_as_new_workflow_execution", + "external_stream_finalized", + b"external_stream_finalized", + "external_stream_park_result", + b"external_stream_park_result", "fail_workflow_execution", b"fail_workflow_execution", "modify_workflow_properties", @@ -284,6 +315,14 @@ class WorkflowCommand(google.protobuf.message.Message): b"user_metadata", "variant", b"variant", + "workflow_output_stream_buffered", + b"workflow_output_stream_buffered", + "workflow_output_stream_commit", + b"workflow_output_stream_commit", + "workflow_stream_progress", + b"workflow_stream_progress", + "workflow_stream_quiescent", + b"workflow_stream_quiescent", ], ) -> builtins.bool: ... def ClearField( @@ -305,6 +344,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"continue_as_new_workflow_execution", "event_group_markers", b"event_group_markers", + "external_stream_finalized", + b"external_stream_finalized", + "external_stream_park_result", + b"external_stream_park_result", "fail_workflow_execution", b"fail_workflow_execution", "modify_workflow_properties", @@ -343,6 +386,14 @@ class WorkflowCommand(google.protobuf.message.Message): b"user_metadata", "variant", b"variant", + "workflow_output_stream_buffered", + b"workflow_output_stream_buffered", + "workflow_output_stream_commit", + b"workflow_output_stream_commit", + "workflow_stream_progress", + b"workflow_stream_progress", + "workflow_stream_quiescent", + b"workflow_stream_quiescent", ], ) -> None: ... def WhichOneof( @@ -371,6 +422,12 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "workflow_stream_progress", + "workflow_stream_quiescent", + "external_stream_park_result", + "external_stream_finalized", + "workflow_output_stream_commit", + "workflow_output_stream_buffered", "subscribe_stream", "append_stream_records", ] @@ -379,9 +436,318 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class AppendStreamRecords(google.protobuf.message.Message): - """Append a batch of records to a stream this workflow owns. +class WorkflowStreamProgress(google.protobuf.message.Message): + """Commits an observation delta for external streams. + + Emitted on *every* completion path where replay-visible stream state changed -- which includes + an activation that observed no records at all -- and independent of whether the Workflow Task + is retained. Consuming a record and committing that consumption are separate steps, and the + second is not conditional on why the Workflow Task ended. + + Ordering is normative: this command precedes every command whose value could depend on the + consumed data. On replay that guarantees integrity validation for a record runs before the + command derived from it is matched. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + REQUEST_ROLLOVER_FIELD_NUMBER: builtins.int + observation_delta: builtins.bytes + """The segments produced since the previous progress report for this Workflow Task. Opaque to + Core, which appends it to the accumulated annotation and never parses it. + """ + request_rollover: builtins.bool + """Set when the encoder is approaching the annotation byte budget and the runtime wants the + Workflow Task rolled over rather than the marker grown further. Core takes the rollover + path minus the finalization round trip, because this command already carries the terminal. + """ + def __init__( + self, + *, + observation_delta: builtins.bytes = ..., + request_rollover: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "observation_delta", + b"observation_delta", + "request_rollover", + b"request_rollover", + ], + ) -> None: ... + +global___WorkflowStreamProgress = WorkflowStreamProgress +class WorkflowStreamQuiescent(google.protobuf.message.Message): + """Asks Core to retain the open Workflow Task. Carries no annotation data -- retention and + progress are separate questions, and a completion may carry either command, both, or neither. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + WAITS_FIELD_NUMBER: builtins.int + IDLE_TIMEOUT_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + """Identifies this complete blocked snapshot.""" + @property + def waits( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___ExternalStreamWait + ]: + """The *complete* set of waits the Workflow is blocked on. A partial set would let one idle + stream park a Workflow Task another stream is still driving. + """ + @property + def idle_timeout(self) -> google.protobuf.duration_pb2.Duration: + """Already reduced by `min` over the quiescent set in wait_id order. Core rejects a + non-positive value as a malformed completion rather than coercing it. + """ + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + waits: collections.abc.Iterable[global___ExternalStreamWait] | None = ..., + idle_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["idle_timeout", b"idle_timeout"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "idle_timeout", + b"idle_timeout", + "quiescence_generation", + b"quiescence_generation", + "waits", + b"waits", + ], + ) -> None: ... + +global___WorkflowStreamQuiescent = WorkflowStreamQuiescent + +class ExternalStreamWait(google.protobuf.message.Message): + """One external stream wait. Shared by the commands above and by the activation jobs, so it takes + no command tag of its own. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WAIT_ID_FIELD_NUMBER: builtins.int + GENERATION_FIELD_NUMBER: builtins.int + IMMEDIATELY_PARKABLE_FIELD_NUMBER: builtins.int + wait_id: builtins.int + generation: builtins.int + """Increments each time this subscription re-enters the blocked state. Never leaves the + Core/lang boundary. + """ + immediately_parkable: builtins.bool + """Normally set after a write fence. A single fenced stream does not park the Workflow Task; + Core bypasses the idle delay only when *every* active wait in the snapshot is set. + """ + def __init__( + self, + *, + wait_id: builtins.int = ..., + generation: builtins.int = ..., + immediately_parkable: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "generation", + b"generation", + "immediately_parkable", + b"immediately_parkable", + "wait_id", + b"wait_id", + ], + ) -> None: ... + +global___ExternalStreamWait = ExternalStreamWait + +class ExternalStreamParkResult(google.protobuf.message.Message): + """Lang's answer to PrepareExternalStreamPark.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + CONFIRMED_FIELD_NUMBER: builtins.int + BECAME_READY_FIELD_NUMBER: builtins.int + FINAL_OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + @property + def confirmed(self) -> global___ParkSetConfirmed: ... + @property + def became_ready(self) -> global___StreamSetBecameReady: ... + final_observation_delta: builtins.bytes + """Terminal observation delta for the marker Core is about to write. Present on `confirmed`: + only lang can encode the boundary, and Core must not write a marker whose annotation has + no terminal. + """ + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + confirmed: global___ParkSetConfirmed | None = ..., + became_ready: global___StreamSetBecameReady | None = ..., + final_observation_delta: builtins.bytes = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "became_ready", + b"became_ready", + "confirmed", + b"confirmed", + "outcome", + b"outcome", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "became_ready", + b"became_ready", + "confirmed", + b"confirmed", + "final_observation_delta", + b"final_observation_delta", + "outcome", + b"outcome", + "quiescence_generation", + b"quiescence_generation", + ], + ) -> None: ... + def WhichOneof( + self, oneof_group: typing_extensions.Literal["outcome", b"outcome"] + ) -> typing_extensions.Literal["confirmed", "became_ready"] | None: ... + +global___ExternalStreamParkResult = ExternalStreamParkResult + +class ParkSetConfirmed(google.protobuf.message.Message): + """Every stream was still empty after intents were installed and every stream was rechecked.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___ParkSetConfirmed = ParkSetConfirmed + +class StreamSetBecameReady(google.protobuf.message.Message): + """A recheck found records, so this parking generation is aborted and Core issues a normal + resolve activation rather than running user code from inside the park path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___StreamSetBecameReady = StreamSetBecameReady + +class ExternalStreamFinalized(google.protobuf.message.Message): + """Lang's answer to FinalizeExternalStreams, for the paths where Core decides the boundary and no + park handshake runs. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + QUIESCENCE_GENERATION_FIELD_NUMBER: builtins.int + FINAL_OBSERVATION_DELTA_FIELD_NUMBER: builtins.int + quiescence_generation: builtins.int + final_observation_delta: builtins.bytes + def __init__( + self, + *, + quiescence_generation: builtins.int = ..., + final_observation_delta: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "final_observation_delta", + b"final_observation_delta", + "quiescence_generation", + b"quiescence_generation", + ], + ) -> None: ... + +global___ExternalStreamFinalized = ExternalStreamFinalized + +class WorkflowOutputStreamCommit(google.protobuf.message.Message): + """Reports that the output batch for this Workflow Task has been durably staged outside History. + Core records only this compact manifest in the shared external-stream marker. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MANIFEST_FIELD_NUMBER: builtins.int + REQUEST_ROLLOVER_FIELD_NUMBER: builtins.int + @property + def manifest( + self, + ) -> temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest: ... + request_rollover: builtins.bool + """The deterministic output capacity was reached and this task must request a replacement.""" + def __init__( + self, + *, + manifest: temporalio.bridge.proto.external_data.external_data_pb2.ExternalOutputStreamManifest + | None = ..., + request_rollover: builtins.bool = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["manifest", b"manifest"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "manifest", b"manifest", "request_rollover", b"request_rollover" + ], + ) -> None: ... + +global___WorkflowOutputStreamCommit = WorkflowOutputStreamCommit + +class WorkflowOutputStreamBuffered(google.protobuf.message.Message): + """Reports that external output is buffered in lang but has not yet been staged. Core retains the + open Workflow Task until the earliest reported deadline and then asks lang to finalize it. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAX_PUBLISH_LATENCY_FIELD_NUMBER: builtins.int + @property + def max_publish_latency(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + max_publish_latency: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "max_publish_latency", b"max_publish_latency" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_publish_latency", b"max_publish_latency" + ], + ) -> None: ... + +global___WorkflowOutputStreamBuffered = WorkflowOutputStreamBuffered + +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns.// The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch size free: a thousand records cost the same in History as one. The server diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 0ebc3d840..316d183d2 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -49,11 +49,8 @@ from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams from temporalio.streams.providers.native import NativeStreams -<<<<<<< HEAD from temporalio.streams.providers.redis import RedisStreams from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider -======= ->>>>>>> origin/moe/AI-198-stream-client from tests.helpers import new_worker @@ -108,7 +105,6 @@ async def run(self) -> None: await workflow.wait_condition(lambda: self._released) -<<<<<<< HEAD async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: # No STREAMS_LIVE gate: the store is the workflow's own History, which the # test environment's server provides. @@ -138,8 +134,6 @@ async def host(workflow_id: str) -> None: await handle.terminate() -======= ->>>>>>> origin/moe/AI-198-stream-client async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: # The store is a server built from the stream-carrying branch, which the # test environment's own server is not; TEMPORAL_ADDRESS names it. @@ -169,7 +163,6 @@ async def host(workflow_id: str) -> None: await provider.close() -<<<<<<< HEAD async def _redis_case(client: Client) -> AsyncIterator[ProviderCase]: # The store is a Redis the test environment does not start; the server # is the environment's own unless TEMPORAL_ADDRESS names another. @@ -204,19 +197,14 @@ async def host(workflow_id: str) -> None: await provider.close() -======= ->>>>>>> origin/moe/AI-198-stream-client SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { "memory": _memory_case, "workflow_streams": _workflow_streams_case, } if os.environ.get("STREAMS_LIVE") == "native": SETUPS["native"] = _native_case -<<<<<<< HEAD if os.environ.get("STREAMS_LIVE") == "redis": SETUPS["redis"] = _redis_case -======= ->>>>>>> origin/moe/AI-198-stream-client _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, From 40bc91e4e89df8b88a99f1d95d228a2a9b103ea4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:51:07 -0700 Subject: [PATCH 455/831] Added typed topic definitions. A topic is defined once with streams.topic(name, type) and shared by the workflow, its activities and the backend, so the record and value types follow from the definition; a plain string still names a topic decided at runtime. The wire and every provider see only the name. --- CHANGELOG.md | 6 +- streams_demo/agent_loop.py | 12 +-- streams_demo/run_demo.py | 4 +- temporalio/streams/__init__.py | 9 +- temporalio/streams/_provider.py | 62 +++++++++---- temporalio/streams/_topic.py | 92 ++++++++++++++++++++ temporalio/streams/providers/memory.py | 32 ++++--- temporalio/workflow/_streams.py | 80 ++++++++++------- tests/streams/test_stream_accessors.py | 13 ++- tests/streams/test_streams_conformance.py | 101 +++++++++++++--------- tests/streams/test_streams_workflow.py | 32 +++---- 11 files changed, 309 insertions(+), 134 deletions(-) create mode 100644 temporalio/streams/_topic.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a90a9114f..c74bdf72a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,8 +27,10 @@ to include examples, links to docs, or any other relevant information. inherit it; each context then asks for its stream the same way: `workflow.stream_reader()` and `workflow.stream_writer()` in workflow code, `activity.stream_handle()` in an activity, and `client.get_stream_handle()` - anywhere a client is held. The record on the wire is - `temporal.api.stream.v1.StreamRecord` on every provider. + anywhere a client is held. A topic is a typed definition, + `streams.topic("inputs", Token)`, shared by workflow, activity and client + code; a plain string names a topic decided at runtime. The record on the wire + is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index a76b35ced..df5eac4d6 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -16,12 +16,14 @@ from datetime import timedelta from typing import Any -from temporalio import activity, workflow +from temporalio import activity, streams, workflow from temporalio.streams import RecordKind -DECISIONS = "decisions" -INPUTS = "inputs" -RECEIPTS = "receipts" +# Defined once and shared by the workflow, the Activity and the demo's +# reader, so the type each topic carries is stated in one place. +DECISIONS = streams.topic("decisions", dict[str, Any]) +INPUTS = streams.topic("inputs", dict[str, Any]) +RECEIPTS = streams.topic("receipts", dict[str, Any]) @activity.defn(name="RecordDecision") @@ -55,7 +57,7 @@ class AgentLoop: @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: """Decide on at most ``limit`` inputs, then return the trace.""" - inputs = workflow.stream_reader(INPUTS, result_type=dict) + inputs = workflow.stream_reader(INPUTS) decisions = workflow.stream_writer(DECISIONS) trace: list[dict[str, Any]] = [] accepted = 0 diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 0b06e9395..e91bf2e31 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -48,7 +48,7 @@ async def collect_output(stream: StreamHandle, want: int) -> list[dict]: """Read ``want`` decisions off the workflow's stream from outside it.""" seen: list[dict] = [] - async for record in stream.read(topic=DECISIONS, result_type=dict): + async for record in stream.read(topic=DECISIONS): seen.append({"kind": record.kind.name, "value": record.value}) if len(seen) >= want: break @@ -150,7 +150,7 @@ async def receipts() -> list[Any]: # Ends by itself once the workflow is closed and the tail served. return [ r.value - async for r in stream.read(topic=RECEIPTS, result_type=dict) + async for r in stream.read(topic=RECEIPTS) if r.kind is RecordKind.DATA ] diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index c185c35ce..b23c95be4 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -28,7 +28,10 @@ 5. **A workflow addresses its streams relative to itself, by topic.** A topic can be written by the workflow and by outside producers, and read by the workflow and by outside consumers; which of those happen is the - application's business. + application's business. A topic is defined once with :func:`topic`, with + the type its records decode to, and that definition is shared by the + workflow, its activities and the backend; a plain string names a topic + decided at runtime. A provider is an object, registered once as a plugin: ``Client.connect(plugins=[provider])``; workers built from that client inherit @@ -80,6 +83,7 @@ StreamRecord, Supersession, ) +from temporalio.streams._topic import StreamTopic, resolve_topic, topic __all__ = [ "BEGINNING", @@ -94,8 +98,11 @@ "StreamProducerError", "StreamProvider", "StreamRecord", + "StreamTopic", "StreamUnsupportedError", "Supersession", "WorkflowStreamProvider", "WriteSink", + "resolve_topic", + "topic", ] diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 6992f0a14..8c142080d 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -9,7 +9,9 @@ workflow code is bundled separately name the two halves in two packages. A provider only moves ``temporal.api.stream.v1.StreamRecord`` protos. The -handles around it convert values, synthesize supersession and mint cursors. +handles around it convert values, synthesize supersession and mint cursors, +and turn a :class:`temporalio.streams.StreamTopic` into the plain name the +provider sees, through :func:`temporalio.streams.resolve_topic`. """ from __future__ import annotations @@ -19,6 +21,7 @@ from temporalio.api.stream.v1 import StreamRecord as WireRecord from temporalio.streams._record import BEGINNING, Cursor, StreamRecord +from temporalio.streams._topic import StreamTopic if TYPE_CHECKING: from temporalio.client import Client @@ -33,14 +36,16 @@ ] T = TypeVar("T") +T_contra = TypeVar("T_contra", contravariant=True) -class StreamProducer(Protocol): +class StreamProducer(Protocol[T_contra]): """Appends to one topic from outside workflow code. Every append is visible as soon as the store accepts it, and carries the producer id, attempt and sequence that let a reader tell a retried append - from a new generation. + from a new generation. The type parameter is the topic definition's + value type; a producer on a string-named topic takes any value. """ @property @@ -53,7 +58,7 @@ def attempt(self) -> int: """The generation this producer is writing, or 0 when undeclared.""" ... - async def append(self, *values: Any) -> Cursor | None: + async def append(self, *values: T_contra) -> Cursor | None: """Append ``values`` and return the cursor of the last record as the store holds it. A repeat of an earlier append (same producer, attempt and sequence) is @@ -83,11 +88,19 @@ class StreamHandle(Protocol): """One workflow's stream, addressed by topic, from outside workflow code. A handle follows the workflow's execution chain unless it was opened with - a ``run_id``, in which case it is pinned to that run. A transport failure - surfaces as :class:`temporalio.service.RPCError`, never as the transport's - own exception type. + a ``run_id``, in which case it is pinned to that run. A topic is a + :class:`temporalio.streams.StreamTopic` definition, which carries the + record type, or a plain string with ``result_type=`` for a name decided + at runtime. A transport failure surfaces as + :class:`temporalio.service.RPCError`, never as the transport's own + exception type. """ + @overload + def read( + self, *, topic: StreamTopic[T], after: Cursor = ... + ) -> AsyncGenerator[StreamRecord[T], None]: ... + @overload def read( self, *, topic: str, after: Cursor = ..., result_type: type[T] @@ -101,7 +114,7 @@ def read( def read( self, *, - topic: str, + topic: str | StreamTopic[Any], after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: @@ -117,6 +130,8 @@ def read( release whatever the provider parked against the store. Raises: + ValueError: ``result_type`` was passed with a topic definition, + or the topic is empty. StreamCursorError: ``after`` came from another provider or names a record no longer retained. Raised by this call, not by the first iteration. @@ -125,7 +140,7 @@ def read( """ ... - async def latest(self, *, topic: str) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, or ``BEGINNING`` when empty. For a reader that wants to follow from now: ``read(after=latest())`` @@ -135,9 +150,23 @@ async def latest(self, *, topic: str) -> Cursor: """ ... + @overload + def producer( + self, *, topic: StreamTopic[T], producer_id: str = ..., attempt: int = ... + ) -> StreamProducer[T]: ... + + @overload + def producer( + self, *, topic: str, producer_id: str = ..., attempt: int = ... + ) -> StreamProducer[Any]: ... + def producer( - self, *, topic: str, producer_id: str = "", attempt: int = 0 - ) -> StreamProducer: + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> StreamProducer[Any]: """A producer on ``topic``. Inside an activity, leave ``producer_id`` and ``attempt`` unset: the @@ -189,7 +218,8 @@ class WorkflowStreamProvider(Protocol): Imports nothing that does I/O. The worker creates one per workflow instance through :meth:`StreamProvider.workflow_provider`, so state kept - here dies with the instance the way handlers do. + here dies with the instance the way handlers do. It sees topics by name; + the definitions are resolved before it is called. """ def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: @@ -224,9 +254,11 @@ async def on_workflow_finish(self) -> None: class StreamProvider(Protocol): """What a store ships. Also a :class:`temporalio.worker.Plugin` when it serves workers. - Construct one, pass it to ``Worker(plugins=[provider])`` and - ``Replayer(plugins=[provider])``, and open handles from it anywhere else. - Nothing is global: two workers in one process may hold two providers. + Construct one, pass it to ``Client.connect(plugins=[provider])`` so the + client and the workers built from it carry it, or to + ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` for a + worker alone, and open handles from it anywhere else. Nothing is global: + two workers in one process may hold two providers. """ def workflow_provider(self) -> WorkflowStreamProvider: diff --git a/temporalio/streams/_topic.py b/temporalio/streams/_topic.py new file mode 100644 index 000000000..173291fad --- /dev/null +++ b/temporalio/streams/_topic.py @@ -0,0 +1,92 @@ +"""Typed topic definitions. + +Temporal's idiom is to define once and refer by reference: signals, queries +and updates are decorated methods, activities and workflows are functions, +Nexus operations are typed definitions. A topic follows the same rule. It is +defined once, at module level, with the type its records decode to, and the +workflow, its activities and the backend all refer to that one definition. A +plain string names a topic too, the way a string names a signal chosen at +runtime; then the decode hint travels as ``result_type=`` on each call. + +The wire does not change: a topic is a string on the proto and in every +store, and :attr:`temporalio.streams.StreamRecord.topic` is that string. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Generic, TypeVar, overload + +__all__ = ["StreamTopic", "resolve_topic", "topic"] + +T = TypeVar("T") + + +@dataclass(frozen=True) +class StreamTopic(Generic[T]): + """A topic of a workflow's stream, with the type its records decode to. + + Made with :func:`topic`. Hand it to :func:`temporalio.workflow.stream_reader`, + :func:`temporalio.workflow.stream_writer`, and to a handle's ``read``, + ``latest`` and ``producer``, and the record and value types follow from + it; ``result_type=`` is not passed alongside a definition. + """ + + name: str + result_type: type[T] | None = None + """The type records decode to, or ``None`` for the converter's default.""" + + +@overload +def topic(name: str, result_type: type[T]) -> StreamTopic[T]: ... + + +@overload +def topic(name: str, result_type: None = None) -> StreamTopic[Any]: ... + + +def topic(name: str, result_type: type | None = None) -> StreamTopic[Any]: + """Define a topic of a workflow's stream. + + Define it once, at module level, and share it: the workflow reads or + publishes it, an activity or a backend produces onto it or reads it, and + the type it carries is inferred wherever it is used. Use a plain string + instead only when the name is decided at runtime. + + Args: + name: The topic's name, as it appears on every record. + result_type: The type records on this topic decode to. Without one, + the payload converter's default applies. + + Raises: + ValueError: ``name`` is empty. + """ + if not name: + raise ValueError("topic name must not be empty") + return StreamTopic(name, result_type) + + +def resolve_topic( + topic: str | StreamTopic[Any], result_type: type | None = None +) -> tuple[str, type | None]: + """The name and decode hint a call means, from either form of topic. + + Providers call this once at the top of ``read``, ``latest`` and + ``producer``, so a definition and a string are the same to the store. + + Raises: + ValueError: A definition was given together with ``result_type``, + which would name two types for one topic, or the name is empty. + """ + if isinstance(topic, StreamTopic): + if result_type is not None: + raise ValueError( + f"topic {topic.name!r} already carries its type; do not pass " + "result_type= with a definition" + ) + name, result_type = topic.name, topic.result_type + else: + name = topic + if not name: + raise ValueError("topic must not be empty") + return name, result_type diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 2a6087b2d..f175570a8 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -28,7 +28,7 @@ import logging from collections.abc import AsyncGenerator from datetime import timedelta -from typing import Any +from typing import Any, Generic, TypeVar from google.protobuf.message import DecodeError @@ -40,6 +40,7 @@ from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, WireRecord, @@ -54,6 +55,8 @@ _PROVIDER = "memory" +T = TypeVar("T") + logger = logging.getLogger(__name__) @@ -189,7 +192,7 @@ async def on_workflow_finish(self) -> None: pass -class MemoryProducer: +class MemoryProducer(Generic[T]): """The outside producer, faithful to the contract.""" def __init__( @@ -227,7 +230,7 @@ def _writer(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: T) -> Cursor: """Append ``values`` and return the cursor of the last record as stored. A repeat returns where the original landed; an empty call returns @@ -298,12 +301,13 @@ def __init__( def read( self, *, - topic: str, + topic: str | StreamTopic[Any], after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records on ``topic`` after ``after`` until the workflow closes.""" - store = self._streams._topic(self._workflow_id, topic) + name, result_type = resolve_topic(topic, result_type) + store = self._streams._topic(self._workflow_id, name) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. start = self._streams._offset_after(after) @@ -366,18 +370,24 @@ async def _closed(self) -> bool: self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW ) - async def latest(self, *, topic: str) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, for following from now.""" - count = len(self._streams._topic(self._workflow_id, topic).records) + name, _ = resolve_topic(topic) + count = len(self._streams._topic(self._workflow_id, name).records) return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING def producer( - self, *, topic: str, producer_id: str = "", attempt: int = 0 - ) -> MemoryProducer: + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> MemoryProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" - store = self._streams._topic(self._workflow_id, topic) + name, _ = resolve_topic(topic) + store = self._streams._topic(self._workflow_id, name) producer_id, attempt = producer_identity(producer_id, attempt) - return MemoryProducer(store, self._converter, topic, producer_id, attempt) + return MemoryProducer(store, self._converter, name, producer_id, attempt) class MemoryStreams(ProviderPlugin): diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py index 029da59a1..5d319d50a 100644 --- a/temporalio/workflow/_streams.py +++ b/temporalio/workflow/_streams.py @@ -19,6 +19,7 @@ from temporalio.streams._provider import ReadSource, WorkflowStreamProvider, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import RecordDecoder, to_wire from temporalio.workflow._context import _Runtime, payload_converter from temporalio.workflow._sandbox import logger @@ -71,7 +72,7 @@ def __init__( @property def topic(self) -> str: - """The topic this reader is subscribed to.""" + """The name of the topic this reader is subscribed to.""" return self._topic def __aiter__(self) -> StreamReader[T]: @@ -124,12 +125,14 @@ def close(self) -> None: self._on_close() -class StreamWriter: +class StreamWriter(Generic[T]): """Publishes to one topic of this workflow's stream. A workflow can only publish transactionally to its own stream, on every provider. Writing to somebody else's stream is an activity's job, and it - gets the weaker guarantee that goes with doing I/O. + gets the weaker guarantee that goes with doing I/O. The type parameter is + the topic definition's value type; a writer on a string-named topic takes + any value. """ def __init__(self, sink: WriteSink, topic: str) -> None: @@ -140,10 +143,10 @@ def __init__(self, sink: WriteSink, topic: str) -> None: @property def topic(self) -> str: - """The topic this writer is bound to.""" + """The name of the topic this writer is bound to.""" return self._topic - def publish(self, value: Any) -> None: + def publish(self, value: T) -> None: """Append ``value`` to this topic. Synchronous, because there is nothing to wait for inside a task: the @@ -180,6 +183,10 @@ def finish(self) -> None: ) +@overload +def stream_reader(topic: StreamTopic[T], *, after: Cursor = ...) -> StreamReader[T]: ... + + @overload def stream_reader( topic: str, *, result_type: type[T], after: Cursor = ... @@ -193,65 +200,80 @@ def stream_reader( def stream_reader( - topic: str, *, result_type: type | None = None, after: Cursor = BEGINNING + topic: str | StreamTopic[Any], + *, + result_type: type | None = None, + after: Cursor = BEGINNING, ) -> StreamReader[Any]: """Subscribe this workflow to ``topic`` of its own stream. - One subscription per topic per run. A second call for the same topic - returns the reader already open on it, so records go to whichever loop - pulls first; such a call may pass neither ``after`` nor a different - ``result_type``. Adding a reader on a new topic is a new command, so gate - it with :func:`temporalio.workflow.patched` as you would a timer. A + ``topic`` is a :func:`temporalio.streams.topic` definition, which carries + the record type, or a plain string with ``result_type=`` for a name + decided at runtime. One subscription per topic per run. A second call + for the same topic returns the reader already open on it, so records go + to whichever loop pulls first; such a call may pass neither ``after`` nor + a different type. Adding a reader on a new topic is a new command, so + gate it with :func:`temporalio.workflow.patched` as you would a timer. A reader in a successor run starts a new subscription: nothing crosses continue-as-new implicitly. Args: topic: The topic, relative to this workflow's stream. - result_type: The value type, used as the decode hint. - :class:`temporalio.common.RawValue` returns the payload untouched. + result_type: The value type for a string-named topic, used as the + decode hint. :class:`temporalio.common.RawValue` returns the + payload untouched. after: Resume strictly after this record. Honoured on the first subscription of a run, because after that the recorded observations decide. Raises: - ValueError: ``topic`` is empty, or a reader on it is already open and - this call asked for a different position or type. + ValueError: ``topic`` is empty, ``result_type`` was passed with a + definition, or a reader on the topic is already open and this + call asked for a different position or type. temporalio.streams.StreamCursorError: ``after`` was minted by another provider. """ - if not topic: - raise ValueError("topic must not be empty") + name, result_type = resolve_topic(topic, result_type) state: _WorkflowStreams = _Runtime.current().workflow_streams() - existing = state.readers.get(topic) + existing = state.readers.get(name) if existing is not None: if after != BEGINNING or result_type is not existing._result_type: raise ValueError( - f"topic {topic!r} already has a reader in this run; a second " - "stream_reader shares it and takes no after= or other result_type=" + f"topic {name!r} already has a reader in this run; a second " + "stream_reader shares it and takes no after= or other type" ) return existing - source = state.provider.open_reader(topic, after=after) + source = state.provider.open_reader(name, after=after) def forget() -> None: - state.readers.pop(topic, None) + state.readers.pop(name, None) reader: StreamReader[Any] = StreamReader( - source, topic=topic, result_type=result_type, after=after, on_close=forget + source, topic=name, result_type=result_type, after=after, on_close=forget ) - state.readers[topic] = reader + state.readers[name] = reader return reader -def stream_writer(topic: str) -> StreamWriter: +@overload +def stream_writer(topic: StreamTopic[T]) -> StreamWriter[T]: ... + + +@overload +def stream_writer(topic: str) -> StreamWriter[Any]: ... + + +def stream_writer(topic: str | StreamTopic[Any]) -> StreamWriter[Any]: """Publish to ``topic`` of this workflow's stream. Args: - topic: The topic name. Encoding follows each published value. + topic: A :func:`temporalio.streams.topic` definition, whose value type + the writer's ``publish`` takes, or a plain string for a name + decided at runtime. Encoding follows each published value. Raises: ValueError: ``topic`` is empty. """ - if not topic: - raise ValueError("topic must not be empty") + name, _ = resolve_topic(topic) provider = _Runtime.current().workflow_streams().provider - return StreamWriter(provider.open_writer(topic), topic) + return StreamWriter(provider.open_writer(name), name) diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py index 73436dea2..eb733ba5b 100644 --- a/tests/streams/test_stream_accessors.py +++ b/tests/streams/test_stream_accessors.py @@ -18,13 +18,13 @@ from temporalio import activity, workflow from temporalio.client import Client -from temporalio.streams import RecordKind, StreamUnsupportedError +from temporalio.streams import RecordKind, StreamUnsupportedError, topic from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import ActivityEnvironment, WorkflowEnvironment from tests.helpers import new_worker -INPUTS = "inputs" -DECISIONS = "decisions" +INPUTS = topic("inputs", dict) +DECISIONS = topic("decisions", dict) @pytest.fixture @@ -64,7 +64,7 @@ class Echo: @workflow.run async def run(self, count: int) -> list[Any]: - inputs = workflow.stream_reader(INPUTS, result_type=dict) + inputs = workflow.stream_reader(INPUTS) decisions = workflow.stream_writer(DECISIONS) emitting = workflow.start_activity( emit, count, start_to_close_timeout=timedelta(seconds=30) @@ -100,10 +100,7 @@ async def test_one_registration_on_the_client_serves_every_context( stream = registered.get_stream_handle(workflow_id) async def read_everything() -> list[Any]: - return [ - (r.kind, r.value) - async for r in stream.read(topic=DECISIONS, result_type=dict) - ] + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] assert await asyncio.wait_for(read_everything(), 30) == [ (RecordKind.DATA, {"echo": 0}), diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 020250973..9002ea16a 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -42,10 +42,19 @@ Supersession, _ids, _wire, + topic, ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +# Defined once and shared by every case, the way an application shares them +# between its workflow, its activities and its backend. +OUT = topic("out", dict) +A = topic("a", dict) +B = topic("b", dict) +Y = topic("y", dict) +XY = topic("x:y", dict) + @dataclass class ProviderCase: @@ -195,12 +204,12 @@ def test_cursors_name_their_provider(): async def test_append_read_roundtrip(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - producer = stream.producer(topic="out", producer_id="model", attempt=1) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) assert (producer.producer_id, producer.attempt) == ("model", 1) await producer.append({"id": "r1"}, {"id": "r2"}) await producer.finish() - records = await take(stream.read(topic="out", result_type=dict), 3) + records = await take(stream.read(topic=OUT), 3) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -210,14 +219,14 @@ async def test_append_read_roundtrip(case: ProviderCase): assert records[2].value is None assert all(r.producer_id == "model" and r.attempt == 1 for r in records) assert [r.sequence for r in records] == [0, 1, 2] - assert all(r.topic == "out" for r in records) + assert all(r.topic == OUT.name for r in records) async def test_raw_values_pass_through_untouched(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) payload = Payload(metadata={"encoding": b"binary/plain"}, data=b"\x00\x01raw") - producer = stream.producer(topic="out", producer_id="model", attempt=1) + producer = stream.producer(topic=OUT.name, producer_id="model", attempt=1) await producer.append(RawValue(payload)) records = await take(stream.read(topic="out", result_type=RawValue), 1) @@ -229,46 +238,46 @@ async def test_raw_values_pass_through_untouched(case: ProviderCase): async def test_retried_append_returns_the_original_position(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - first = stream.producer(topic="out", producer_id="model", attempt=1) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) landed = await first.append({"id": "r1"}) assert landed is not None # The retry of the same attempt starts its sequence over and appends the # same record. The provider stores it once and answers with where the # original landed, so the retry can checkpoint the same position. - retry = stream.producer(topic="out", producer_id="model", attempt=1) + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) assert await retry.append({"id": "r1"}) == landed # An empty call writes nothing and answers the same way. assert await retry.append() == landed - records = await take(stream.read(topic="out", result_type=dict), 1) + records = await take(stream.read(topic=OUT), 1) assert records[0].value == {"id": "r1"} assert records[0].cursor == landed # The store holds exactly the one record: the newest position is its cursor. - assert await stream.latest(topic="out") == landed + assert await stream.latest(topic=OUT) == landed async def test_retried_append_is_stored_once(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - first = stream.producer(topic="out", producer_id="model", attempt=1) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) await first.append({"id": "r1"}) - retry = stream.producer(topic="out", producer_id="model", attempt=1) + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) await retry.append({"id": "r1"}) await retry.append({"id": "r2"}) - records = await take(stream.read(topic="out", result_type=dict), 2) + records = await take(stream.read(topic=OUT), 2) assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - first = stream.producer(topic="out", producer_id="model", attempt=1) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) await first.append({"text": "The capital of"}) - second = stream.producer(topic="out", producer_id="model", attempt=2) + second = stream.producer(topic=OUT, producer_id="model", attempt=2) await second.append({"text": "Paris is the capital"}) - records = await take(stream.read(topic="out", result_type=dict), 3) + records = await take(stream.read(topic=OUT), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED assert records[1].supersession == Supersession("model", 1, 2) @@ -281,21 +290,19 @@ async def test_a_superseded_record_resumes_to_the_triggering_record( ): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - first = stream.producer(topic="out", producer_id="model", attempt=1) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) await first.append({"n": 1}) - second = stream.producer(topic="out", producer_id="model", attempt=2) + second = stream.producer(topic=OUT, producer_id="model", attempt=2) await second.append({"n": 2}) - records = await take(stream.read(topic="out", result_type=dict), 3) + records = await take(stream.read(topic=OUT), 3) superseded = records[1] assert superseded.kind is RecordKind.SUPERSEDED # The synthesized record sits at the position before the new attempt's # first record, so a consumer that checkpoints it and restarts is handed # that record rather than skipping it. assert superseded.cursor == records[0].cursor - resumed = await take( - stream.read(topic="out", result_type=dict, after=superseded.cursor), 1 - ) + resumed = await take(stream.read(topic=OUT, after=superseded.cursor), 1) assert resumed[0].kind is RecordKind.DATA assert resumed[0].value == {"n": 2} @@ -305,29 +312,29 @@ async def test_topics_are_addressed_by_name(case: ProviderCase): # names its topic and sees only that topic's records. workflow_id = new_workflow_id() stream = await case.open(workflow_id) - on_a = stream.producer(topic="a", producer_id="tool-a", attempt=1) + on_a = stream.producer(topic=A, producer_id="tool-a", attempt=1) await on_a.append({"n": 1}) - on_b = stream.producer(topic="b", producer_id="tool-b", attempt=1) + on_b = stream.producer(topic=B, producer_id="tool-b", attempt=1) await on_b.append({"n": 2}) - only_a = await take(stream.read(topic="a", result_type=dict), 1) + only_a = await take(stream.read(topic=A), 1) assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] - only_b = await take(stream.read(topic="b", result_type=dict), 1) + only_b = await take(stream.read(topic=B), 1) assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] async def test_cursor_resumes_where_it_points(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - producer = stream.producer(topic="out", producer_id="model", attempt=1) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - records = await take(stream.read(topic="out", result_type=dict), 3) + records = await take(stream.read(topic=OUT), 3) checkpoint = records[0].cursor # Resuming after a record hands back everything past it and nothing # twice, without the reader ever advancing a cursor itself. - again = await take(stream.read(topic="out", result_type=dict, after=checkpoint), 2) + again = await take(stream.read(topic=OUT, after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] @@ -335,14 +342,14 @@ async def test_cursor_resumes_where_it_points(case: ProviderCase): async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - producer = stream.producer(topic="out", producer_id="model", attempt=1) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) assert appended is not None then = await producer.append({"n": 4}) # A producer that resumes a reader after its own append must see only # what came later, not the tail of the batch it just wrote. - records = await take(stream.read(topic="out", result_type=dict, after=appended), 1) + records = await take(stream.read(topic=OUT, after=appended), 1) assert [r.value for r in records] == [{"n": 4}] assert records[0].cursor == then assert await producer.append() == then @@ -351,16 +358,16 @@ async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCa async def test_latest_positions_a_reader_at_the_end(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - producer = stream.producer(topic="out", producer_id="model", attempt=1) - assert await stream.latest(topic="out") == BEGINNING + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + assert await stream.latest(topic=OUT) == BEGINNING await producer.append({"n": 1}, {"n": 2}) - since = await stream.latest(topic="out") + since = await stream.latest(topic=OUT) await producer.append({"n": 3}) # A reader that positioned itself before the last append sees only what # came after, which is how a client follows a turn it is about to start. - records = await take(stream.read(topic="out", result_type=dict, after=since), 1) + records = await take(stream.read(topic=OUT, after=since), 1) assert [r.value for r in records] == [{"n": 3}] @@ -369,17 +376,15 @@ async def test_topic_addresses_with_colons_do_not_share_a_store(case: ProviderCa base = new_workflow_id() left = await case.open(f"{base}:x") right = await case.open(base) - await left.producer(topic="y", producer_id="l", attempt=1).append({"side": "left"}) - await right.producer(topic="x:y", producer_id="r", attempt=1).append( - {"side": "right"} - ) + await left.producer(topic=Y, producer_id="l", attempt=1).append({"side": "left"}) + await right.producer(topic=XY, producer_id="r", attempt=1).append({"side": "right"}) - only_left = await take(left.read(topic="y", result_type=dict), 1) + only_left = await take(left.read(topic=Y), 1) assert [r.value for r in only_left] == [{"side": "left"}] - assert await left.latest(topic="y") == only_left[0].cursor - only_right = await take(right.read(topic="x:y", result_type=dict), 1) + assert await left.latest(topic=Y) == only_left[0].cursor + only_right = await take(right.read(topic=XY), 1) assert [r.value for r in only_right] == [{"side": "right"}] - assert await right.latest(topic="x:y") == only_right[0].cursor + assert await right.latest(topic=XY) == only_right[0].cursor async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): @@ -387,7 +392,7 @@ async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): # Refused by read() itself, not by the first iteration of its generator, # so the caller's except clause is where the mistake surfaces. with pytest.raises(StreamCursorError): - stream.read(topic="out", after=Cursor("elsewhere:42")) + stream.read(topic=OUT, after=Cursor("elsewhere:42")) async def test_argument_mistakes_are_value_errors(case: ProviderCase): @@ -398,4 +403,14 @@ async def test_argument_mistakes_are_value_errors(case: ProviderCase): stream.producer(topic="", producer_id="model", attempt=1) # Outside an activity there is no identity to fall back on. with pytest.raises(ValueError, match="producer_id is required"): - stream.producer(topic="out") + stream.producer(topic=OUT) + + +async def test_a_definition_carries_its_type_once(case: ProviderCase): + stream = await case.open(new_workflow_id()) + with pytest.raises(ValueError, match="already carries its type"): + stream.read(topic=OUT, result_type=dict) # type: ignore[call-overload] + with pytest.raises(ValueError): + topic("", dict) + # A string names a topic decided at runtime, and the hint rides the call. + assert await stream.latest(topic=OUT.name) == BEGINNING diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index 58fb274ef..71f2bb8bf 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -30,6 +30,7 @@ RecordKind, StreamCursorError, WriteSink, + topic, ) from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import WorkflowEnvironment @@ -37,8 +38,8 @@ from tests.helpers import new_worker from tests.streams.test_streams_conformance import take -INPUTS = "inputs" -DECISIONS = "decisions" +INPUTS = topic("inputs", dict) +DECISIONS = topic("decisions", dict) @pytest.fixture @@ -58,7 +59,7 @@ class ContractLoop: @workflow.run async def run(self) -> list[dict[str, Any]]: - inputs = workflow.stream_reader(INPUTS, result_type=dict) + inputs = workflow.stream_reader(INPUTS) decisions = workflow.stream_writer(DECISIONS) trace: list[dict[str, Any]] = [] try: @@ -128,7 +129,7 @@ async def test_workflow_reads_decides_and_publishes( # The outside view of what the workflow published, on its own topic. stream = provider.get_stream_handle(client, handle.id) - records = await take(stream.read(topic=DECISIONS, result_type=dict), 5) + records = await take(stream.read(topic=DECISIONS), 5) assert [(r.kind, r.value) for r in records] == [ (RecordKind.DATA, {"decided": 1}), (RecordKind.DATA, {"decided": 2}), @@ -136,7 +137,7 @@ async def test_workflow_reads_decides_and_publishes( (RecordKind.DATA, {"decided": 3}), (RecordKind.FINISH, None), ] - assert all(r.producer_id == "" and r.topic == DECISIONS for r in records) + assert all(r.producer_id == "" and r.topic == DECISIONS.name for r in records) # The second finish() wrote nothing: the marker is the newest record. assert await stream.latest(topic=DECISIONS) == records[-1].cursor @@ -148,7 +149,7 @@ async def test_read_ends_when_the_workflow_closes_and_the_tail_is_delivered( stream = provider.get_stream_handle(client, handle.id) async def read_everything() -> list[Any]: - return [r.value async for r in stream.read(topic=DECISIONS, result_type=dict)] + return [r.value async for r in stream.read(topic=DECISIONS)] # No count and no early break: the read ends by itself once the workflow # is closed and everything it retained has been handed over. @@ -218,9 +219,7 @@ async def test_a_failed_task_publishes_nothing(client: Client, provider: MemoryS PublishThenFail.run, id=workflow_id, task_queue=worker.task_queue ) stream = provider.get_stream_handle(client, workflow_id) - records = await take( - stream.read(topic=DECISIONS, result_type=dict), 2, timeout=30 - ) + records = await take(stream.read(topic=DECISIONS), 2, timeout=30) await handle.result() assert [(r.kind, r.value) for r in records] == [ (RecordKind.DATA, {"committed": True}), @@ -301,10 +300,7 @@ async def test_a_handle_without_a_run_id_reads_across_continue_as_new( stream = provider.get_stream_handle(client, workflow_id) async def read_everything() -> list[Any]: - return [ - (r.kind, r.value) - async for r in stream.read(topic=DECISIONS, result_type=dict) - ] + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] records = await asyncio.wait_for(read_everything(), 30) await handle.result() @@ -323,15 +319,15 @@ class SharedReaders: @workflow.run async def run(self) -> list[Any]: - first = workflow.stream_reader(INPUTS, result_type=dict) - second = workflow.stream_reader(INPUTS, result_type=dict) + first = workflow.stream_reader(INPUTS) + second = workflow.stream_reader(INPUTS) trace: list[Any] = ["shared" if first is second else "separate"] try: - workflow.stream_reader(INPUTS, result_type=dict, after=Cursor("memory:0")) + workflow.stream_reader(INPUTS, after=Cursor("memory:0")) except ValueError: trace.append("after-rejected") try: - workflow.stream_reader(INPUTS, result_type=list) + workflow.stream_reader(INPUTS.name, result_type=list) except ValueError: trace.append("type-rejected") trace.append((await first.__anext__()).value) @@ -435,7 +431,7 @@ async def test_an_outside_producer_and_the_workflow_share_a_topic( await handle.result() async def read_everything() -> list[Any]: - return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + return [r async for r in stream.read(topic=DECISIONS)] records = await asyncio.wait_for(read_everything(), 30) # Both writers land on one topic in one order, each under its own From 09dccf42da8b7758d4583a793f30a777abfb754f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:40:22 -0700 Subject: [PATCH 456/831] Added the Workflow Streams provider over the shipped wire format. --- .../streams/providers/workflow_streams.py | 341 ++++++++++++++++++ .../streams/test_workflow_streams_provider.py | 144 ++++++++ 2 files changed, 485 insertions(+) create mode 100644 temporalio/streams/providers/workflow_streams.py create mode 100644 tests/streams/test_workflow_streams_provider.py diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py new file mode 100644 index 000000000..6cc1faa4b --- /dev/null +++ b/temporalio/streams/providers/workflow_streams.py @@ -0,0 +1,341 @@ +"""The provider over today's Workflow Streams (Option 0). + +Speaks the shipped contrib feature's wire format, the +``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code +and existing Workflow Streams code interoperate on one stream, and old +histories replay. Records live in the owning workflow's History, which is +also this provider's limit: Option 0's caps (payloads in History, the Signal +cap, bounded subscribers, no reads after the workflow closes) are transport +properties and remain. + +The mapping, in one place: + +- An interface record's frame rides as the item's ``Payload`` data. +- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is + shipped topic ``out:t``, so the two namespaces cannot collide. +- Producer identity dedupes through the shipped publisher state: the + publisher id is ``producer#attempt`` and every publish Signal carries a + monotonic sequence, so a retried batch drops and a new attempt passes. +- ``append`` returns an empty cursor. The Signal transport learns positions + at read time; that is this provider's stated deviation. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.contrib.workflow_streams import ( + PublishEntry, + PublishInput, + WorkflowStream, + WorkflowStreamClient, +) +from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL +from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_ATTR = "__temporal_streams_ws_runtime" +_IN = "in:" +_OUT = "out:" + + +class _Runtime: + """Per-run holder for the shipped stream object. + + A separate class because ``WorkflowStream`` insists on being constructed + from a method named ``__init__``, and the provider builds it lazily on + the first read or write of a run. + """ + + def __init__(self) -> None: + self.stream = WorkflowStream() + + +def _runtime() -> _Runtime: + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is None: + runtime = _Runtime() + setattr(instance, _RUN_ATTR, runtime) + return runtime + + +class _WSReadSource: + """Reads the signal-fed log the shipped feature keeps in workflow state. + + Reaches into the stream's private log rather than ``get_state()``, + because the snapshot copies the whole log per call and drops offsets, + and this runs inside ``workflow.wait_condition``. + """ + + def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + self._stream = stream + self._shipped_topic = shipped_topic + self._cursor = start + self._closed = False + + def _end(self) -> int: + return self._stream._base_offset + len(self._stream._log) + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + while True: + if self._closed: + raise StopAsyncIteration + base = self._stream._base_offset + if self._cursor < base: + # Truncated below the cursor; resume at what remains. + self._cursor = base + await workflow.wait_condition( + lambda: self._closed or self._end() > self._cursor + ) + if self._closed: + raise StopAsyncIteration + batch: list[tuple[Cursor, bytes]] = [] + end = self._end() + for offset in range(self._cursor, end): + item = self._stream._log[offset - self._stream._base_offset] + if item.topic == self._shipped_topic: + batch.append((Cursor(str(offset)), item.data.data)) + self._cursor = end + if batch: + return batch + + def close(self) -> None: + self._closed = True + + +class _WSWriteSink: + def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: + self._handle = stream.topic(shipped_topic) + + async def publish(self, frame: bytes) -> None: + # Appending to workflow state commits with the task, and a poll + # Update's result rides the same task completion, so a failed task + # leaks nothing: rule 1 through the shipped mechanics. + payload = workflow.payload_converter().to_payloads([frame])[0] + self._handle.publish(payload) + + +class WorkflowStreamsProducer: + """Appends by sending the shipped publish Signal directly. + + Direct rather than through ``WorkflowStreamClient`` because the interface + owns the publisher identity: it must be ``producer#attempt`` for the + shipped dedupe to drop a retry and pass a new generation, and the client + would use its own random id. + """ + + def __init__( + self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + ) -> None: + self._handle = handle + self._converter = converter + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._signal_sequence = 0 + + @property + def attempt(self) -> int: + return self._attempt + + @property + def _provider_id(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + ) + + async def append(self, *values: Any) -> Cursor: + entries = [] + for value in values: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + self._sequence += 1 + entries.append(self._entry(frame)) + await self._send(entries) + return Cursor("") + + async def finish(self) -> None: + frame = _frame.encode( + topic=self._stream, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._send([self._entry(frame)]) + + def _entry(self, frame: bytes) -> PublishEntry: + payload = Payload(data=frame) + return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + + async def _send(self, entries: list[PublishEntry]) -> None: + self._signal_sequence += 1 + await self._handle.signal( + _PUBLISH_SIGNAL, + PublishInput( + items=entries, + publisher_id=self._provider_id, + sequence=self._signal_sequence, + ), + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class WorkflowStreamsConsumer: + """Reads through the shipped long-poll Update, with shared supersession.""" + + def __init__( + self, + stream_client: WorkflowStreamClient, + shipped_topic: str | None, + poll_cooldown: timedelta, + ) -> None: + self._client = stream_client + self._shipped_topic = shipped_topic + self._poll_cooldown = poll_cooldown + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + subscription = self._client.subscribe( + self._shipped_topic, + from_offset=int(start.token) if start.token else 0, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + async for item in subscription: + if self._shipped_topic is None and not item.topic.startswith(_OUT): + continue + cursor = Cursor(str(item.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + item.data.payload.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + converter = self._client._client.data_converter.payload_converter + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class _WorkflowStreamsProvider: + name = "workflow_streams" + + def __init__(self) -> None: + self._poll_cooldown = timedelta(milliseconds=100) + + def configure(self, **options: Any) -> None: + cooldown = options.pop("poll_cooldown", None) + if cooldown is not None: + self._poll_cooldown = cooldown + if options: + raise TypeError( + "the workflow_streams provider takes only poll_cooldown, " + f"got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Ignored: a publish Signal is a workflow event, so the wait below + # wakes on delivery and nothing is held between records. + del idle_timeout + return _WSReadSource( + _runtime().stream, + f"{_IN}{stream}", + int(start.token) if start.token else 0, + ) + + def open_write(self, topic: str) -> WriteSink: + return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return WorkflowStreamsProducer( + client.get_workflow_handle(workflow_id), + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> WorkflowStreamsConsumer: + return WorkflowStreamsConsumer( + WorkflowStreamClient.create(client, workflow_id), + f"{_IN}{stream}" if stream else None, + self._poll_cooldown, + ) + + +_provider.register("workflow_streams", _WorkflowStreamsProvider) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py new file mode 100644 index 000000000..2268234ee --- /dev/null +++ b/tests/streams/test_workflow_streams_provider.py @@ -0,0 +1,144 @@ +"""Live conformance for the workflow_streams provider. + +Runs the interface loop over the shipped Option 0 transport against a real +server: an outside producer appends through the publish Signal, the workflow +reads and republishes through its own state, and an outside consumer follows +the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it +needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "workflow_streams", + reason="needs a live server; run with STREAMS_LIVE=workflow_streams", +) + + +@workflow.defn +class EchoLoop: + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + + @workflow.run + async def run(self) -> int: + inputs = streams.reader("inputs", type=dict) + decisions = streams.writer("decisions") + seen = 0 + async for record in inputs: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen += 1 + await decisions.publish({"echo": record.value["n"]}) + await decisions.finish() + return seen + + +async def take(records, count: int, timeout: float = 30.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +async def test_interface_loop_over_workflow_streams(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await streams.producer( + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + assert await handle.result() == 3 + + +async def test_retried_producer_dedupes_and_new_attempt_supersedes(): + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + first = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await first.append({"n": 1}) + # The retry of the same attempt re-sends its first batch. + retry = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=1, + ) + await retry.append({"n": 1}) + second = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", + producer_id="model", attempt=2, + ) + await second.append({"n": 2}) + + consumer = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + records = await take(consumer.read(type=dict), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].value.previous_attempt == 1 + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 From f088496082159fbe95e368b532115ff27a6fbe0f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:22 -0700 Subject: [PATCH 457/831] Let a workflow drain parked pollers before returning. --- .../streams/providers/workflow_streams.py | 15 +++++++++++++++ .../streams/test_workflow_streams_provider.py | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6cc1faa4b..a12608692 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -69,6 +69,21 @@ def _runtime() -> _Runtime: return runtime +def drain() -> None: + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll Update + would otherwise hold completion open. Call it right before the workflow + returns, the same obligation the shipped feature's ``detach_pollers`` + documents. A storage provider has no such step, which is one of the + differences the comparison table charges this transport with. + """ + instance = workflow.instance() + runtime = getattr(instance, _RUN_ATTR, None) + if runtime is not None: + runtime.stream.detach_pollers() + + class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state. diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2268234ee..2b491cbf1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -18,6 +18,7 @@ from temporalio import streams, workflow from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams.providers.workflow_streams import drain from temporalio.worker import Worker pytestmark = pytest.mark.skipif( @@ -28,7 +29,19 @@ @workflow.defn class EchoLoop: - """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH.""" + """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. + + Lingers until released, because an Option 0 stream dies with its + workflow: a reader that arrives after close finds nothing, which is the + transport limit the doc states rather than a defect to fix here. + """ + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True @workflow.run async def run(self) -> int: @@ -43,6 +56,9 @@ async def run(self) -> int: seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() + await workflow.wait_condition(lambda: self._released) + drain() + await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -97,6 +113,7 @@ async def test_interface_loop_over_workflow_streams(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + await handle.signal(EchoLoop.release) assert await handle.result() == 3 From 3393901ea9d802577bcfdd55d77f205d3b1d59c8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 17:58:03 -0700 Subject: [PATCH 458/831] Added the prepare and drain hooks the Workflow Streams transport needs. A provider that answers outside readers through handlers on the workflow has to register them before the first task completes, and one that parks a long-poll update against the run has to let go before the workflow returns. Both are no-ops on the storage providers, so workflow code calls them unconditionally and stays portable. --- .../streams/providers/workflow_streams.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index a12608692..70ec01293 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -60,12 +60,18 @@ def __init__(self) -> None: self.stream = WorkflowStream() +# Held per run rather than on the workflow instance, because the provider is +# asked to install its handlers from the workflow's constructor, and the +# instance is not registered with the runtime yet at that point. +_runtimes: dict[str, _Runtime] = {} + + def _runtime() -> _Runtime: - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + key = workflow.info().run_id + runtime = _runtimes.get(key) if runtime is None: runtime = _Runtime() - setattr(instance, _RUN_ATTR, runtime) + _runtimes[key] = runtime return runtime @@ -78,8 +84,7 @@ def drain() -> None: documents. A storage provider has no such step, which is one of the differences the comparison table charges this transport with. """ - instance = workflow.instance() - runtime = getattr(instance, _RUN_ATTR, None) + runtime = _runtimes.pop(workflow.info().run_id, None) if runtime is not None: runtime.stream.detach_pollers() @@ -302,6 +307,19 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + def prepare(self) -> None: + """Register the shipped publish signal and poll update handlers. + + Done here rather than on the first read, because an outside reader + can poll before workflow code has opened anything, and an update with + no handler yet is rejected rather than held. + """ + _runtime() + + def drain(self) -> None: + """Release parked pollers so the workflow can return.""" + drain() + def open_read( self, stream: str, From ee1f64d7d1ae77bbaca149dec857b47e5ca971a0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 459/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- .../streams/providers/workflow_streams.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 70ec01293..d5bc5bc70 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -12,7 +12,9 @@ - An interface record's frame rides as the item's ``Payload`` data. - Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. + shipped topic ``out:t``, so the two namespaces cannot collide. A producer + appending onto the workflow's own topic ``t`` writes ``out:t`` as well, + which is what today's activities already do through the publish Signal. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. @@ -155,16 +157,31 @@ class WorkflowStreamsProducer: """ def __init__( - self, handle: Any, converter: Any, stream: str, producer_id: str, attempt: int + self, + handle: Any, + converter: Any, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: self._handle = handle self._converter = converter self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 + @property + def _frame_topic(self) -> str: + return self._stream or self._topic + + @property + def _shipped_topic(self) -> str: + return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + @property def attempt(self) -> int: return self._attempt @@ -179,7 +196,7 @@ async def append(self, *values: Any) -> Cursor: entries = [] for value in values: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.DATA, producer=self._producer_id, attempt=self._attempt, @@ -193,7 +210,7 @@ async def append(self, *values: Any) -> Cursor: async def finish(self) -> None: frame = _frame.encode( - topic=self._stream, + topic=self._frame_topic, kind=RecordKind.FINISH, producer=self._producer_id, attempt=self._attempt, @@ -205,7 +222,7 @@ async def finish(self) -> None: def _entry(self, frame: bytes) -> PublishEntry: payload = Payload(data=frame) - return PublishEntry(topic=f"{_IN}{self._stream}", data=_encode_payload(payload)) + return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 @@ -243,14 +260,14 @@ def __init__( async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(start.token) if start.token else 0, + from_offset=int(after.token) + 1 if after.token else 0, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) @@ -279,6 +296,11 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one log per workflow, whatever the topic + head = await self._client.get_offset() + return Cursor(str(head - 1)) if head > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -324,7 +346,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Ignored: a publish Signal is a workflow event, so the wait below @@ -333,7 +355,7 @@ def open_read( return _WSReadSource( _runtime().stream, f"{_IN}{stream}", - int(start.token) if start.token else 0, + int(after.token) + 1 if after.token else 0, ) def open_write(self, topic: str) -> WriteSink: @@ -344,7 +366,8 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: @@ -357,6 +380,7 @@ async def producer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, stream, + topic, producer_id, attempt, ) From 91d11f6559ae1391d3b4324fe5161eecaf9f84a2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:28:01 -0700 Subject: [PATCH 460/831] Served a closed workflow's stream tail by Query on the shipped transport. The poll Update stops answering once the workflow is closing, so a reader between polls at that moment lost whatever the final task published, and nothing could read the stream after completion at all. The log is workflow state, so one Query serves it for as long as the History is retained; the consumer asks for the tail when its subscription ends. --- .../streams/providers/workflow_streams.py | 101 ++++++++++++++---- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d5bc5bc70..d849f1244 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -5,8 +5,10 @@ and existing Workflow Streams code interoperate on one stream, and old histories replay. Records live in the owning workflow's History, which is also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers, no reads after the workflow closes) are transport -properties and remain. +cap, bounded subscribers) are transport properties and remain. Reads after +the workflow closes go through one Query this provider adds, which serves +the log from workflow state for as long as the History is retained, so a +reader between polls when the workflow completed still gets the tail. The mapping, in one place: @@ -24,6 +26,7 @@ from __future__ import annotations +import base64 from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -46,6 +49,7 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_ATTR = "__temporal_streams_ws_runtime" +_TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" @@ -60,6 +64,23 @@ class _Runtime: def __init__(self) -> None: self.stream = WorkflowStream() + # The poll Update stops answering once the workflow is closing, and a + # reader between polls at that moment would lose what the final task + # published. The log is workflow state, so a Query still serves it + # after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) + + def _tail(self, from_offset: int) -> list[dict[str, Any]]: + base = self.stream._base_offset + return [ + { + "offset": base + index, + "topic": item.topic, + "data": base64.b64encode(item.data.data).decode("ascii"), + } + for index, item in enumerate(self.stream._log) + if base + index >= from_offset + ] # Held per run rather than on the workflow instance, because the provider is @@ -265,28 +286,70 @@ async def read( type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() + next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( self._shipped_topic, - from_offset=int(after.token) + 1 if after.token else 0, + from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) async for item in subscription: - if self._shipped_topic is None and not item.topic.startswith(_OUT): - continue - cursor = Cursor(str(item.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - item.data.payload.data - ) - except ValueError: - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( + next_offset = item.offset + 1 + record = self._record( + attempts, item.offset, item.topic, item.data.payload.data, topic, type + ) + for out in record: + yield out + # The subscription ends when the workflow is closing or closed. What + # landed after the last poll is still in workflow state, so the tail + # comes back by Query rather than being lost with the run. + for wire in await self._tail(next_offset): + for out in self._record( + attempts, + wire["offset"], + wire["topic"], + base64.b64decode(wire["data"]), + topic, + type, + ): + yield out + + async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + try: + return await self._client._handle.query( + _TAIL_QUERY, from_offset, result_type=list + ) + except Exception: + # A workflow that never opened a stream has no handler to ask, and + # one whose History is gone has nothing left to serve. + return [] + + def _record( + self, + attempts: AttemptTracker, + offset: int, + shipped_topic: str, + frame: bytes, + topic: str | None, + type: type | None, + ) -> list[StreamRecord[Any]]: + if self._shipped_topic is None and not shipped_topic.startswith(_OUT): + return [] + if self._shipped_topic is not None and shipped_topic != self._shipped_topic: + return [] + cursor = Cursor(str(offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) + except ValueError: + return [] + if topic is not None and frame_topic != topic: + return [] + out: list[StreamRecord[Any]] = [] + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + out.append(superseded) + out.append( + StreamRecord( value=self._decode(body, type) if kind is RecordKind.DATA else None, cursor=cursor, kind=kind, @@ -295,6 +358,8 @@ async def read( attempt=attempt, sequence=sequence, ) + ) + return out async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one log per workflow, whatever the topic From 87ae2c87ebc852b4b3227a92b1a4ce18b5bc08bd Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 461/831] Made the Workflow Streams provider pass the linters. The transport already resolves its payload converter and falls back to the default when it holds no client, so the provider asks it rather than reaching through a client that may not be there. --- .../streams/providers/workflow_streams.py | 13 ++++++-- .../streams/test_workflow_streams_provider.py | 32 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index d849f1244..656056381 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -186,6 +186,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to one stream or topic on ``handle``.""" self._handle = handle self._converter = converter self._stream = stream @@ -205,15 +206,19 @@ def _shipped_topic(self) -> str: @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt @property def _provider_id(self) -> str: return ( - f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id ) async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the shipped publish Signal.""" entries = [] for value in values: frame = _frame.encode( @@ -230,6 +235,7 @@ async def append(self, *values: Any) -> Cursor: return Cursor("") async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" frame = _frame.encode( topic=self._frame_topic, kind=RecordKind.FINISH, @@ -274,6 +280,7 @@ def __init__( shipped_topic: str | None, poll_cooldown: timedelta, ) -> None: + """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client self._shipped_topic = shipped_topic self._poll_cooldown = poll_cooldown @@ -285,6 +292,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, waiting for ones not written yet.""" attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -362,6 +370,7 @@ def _record( return out async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one log per workflow, whatever the topic head = await self._client.get_offset() return Cursor(str(head - 1)) if head > 0 else BEGINNING @@ -369,7 +378,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._client.data_converter.payload_converter + converter = self._client._payload_converter() if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 2b491cbf1..612aaa33d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -12,6 +12,7 @@ import asyncio import os import uuid +from typing import Any import pytest @@ -62,7 +63,7 @@ async def run(self) -> int: return seen -async def take(records, count: int, timeout: float = 30.0) -> list: +async def take(records: Any, count: int, timeout: float = 30.0) -> list: out: list = [] async def _collect() -> None: @@ -77,9 +78,7 @@ async def _collect() -> None: async def test_interface_loop_over_workflow_streams(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -119,9 +118,7 @@ async def test_interface_loop_over_workflow_streams(): async def test_retried_producer_dedupes_and_new_attempt_supersedes(): streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" async with Worker( @@ -135,19 +132,28 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): ) first = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await first.append({"n": 1}) # The retry of the same attempt re-sends its first batch. retry = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=1, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, ) await retry.append({"n": 1}) second = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", - producer_id="model", attempt=2, + client, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=2, ) await second.append({"n": 2}) From 305a0d216fad65315c78e3f96f72ffacb693768b Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 462/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c74bdf72a..811ebef5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,10 @@ to include examples, links to docs, or any other relevant information. is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From f33de01d914be2a63733ea8cf662647a5614ab76 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:44:59 -0700 Subject: [PATCH 463/831] Added public accessors to Workflow Streams for code that rides its wire. A provider that reuses the shipped transport needs the publish signal's name, the log past an offset, and the client's handle and converter. Reading them off private attributes breaks silently on the next contrib change. --- .../contrib/workflow_streams/__init__.py | 6 +++- .../contrib/workflow_streams/_client.py | 14 ++++++++++ .../contrib/workflow_streams/_stream.py | 28 ++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/temporalio/contrib/workflow_streams/__init__.py b/temporalio/contrib/workflow_streams/__init__.py index 41f670f0c..3f225bb2f 100644 --- a/temporalio/contrib/workflow_streams/__init__.py +++ b/temporalio/contrib/workflow_streams/__init__.py @@ -13,7 +13,10 @@ """ from temporalio.contrib.workflow_streams._client import WorkflowStreamClient -from temporalio.contrib.workflow_streams._stream import WorkflowStream +from temporalio.contrib.workflow_streams._stream import ( + PUBLISH_SIGNAL_NAME, + WorkflowStream, +) from temporalio.contrib.workflow_streams._topic_handle import ( TopicHandle, WorkflowTopicHandle, @@ -29,6 +32,7 @@ ) __all__ = [ + "PUBLISH_SIGNAL_NAME", "PollInput", "PollResult", "PublishEntry", diff --git a/temporalio/contrib/workflow_streams/_client.py b/temporalio/contrib/workflow_streams/_client.py index 605bf3f03..5c458bdab 100644 --- a/temporalio/contrib/workflow_streams/_client.py +++ b/temporalio/contrib/workflow_streams/_client.py @@ -325,6 +325,20 @@ def topic( self._topic_types[name] = bound return TopicHandle(self, name, bound) + @property + def handle(self) -> WorkflowHandle[Any, Any]: + """The workflow handle this client publishes to and polls. + + Re-targeted when :py:meth:`subscribe` follows a continue-as-new, so + read it when needed rather than caching it. + """ + return self._handle + + @property + def payload_converter(self) -> PayloadConverter: + """The sync payload converter used for per-item encode and decode.""" + return self._payload_converter() + async def flush(self) -> None: """Flush buffered (and pending) items and wait for server confirmation. diff --git a/temporalio/contrib/workflow_streams/_stream.py b/temporalio/contrib/workflow_streams/_stream.py index ae8608c3b..ff0865c29 100644 --- a/temporalio/contrib/workflow_streams/_stream.py +++ b/temporalio/contrib/workflow_streams/_stream.py @@ -50,7 +50,14 @@ _WorkflowStreamWireItem, ) -_PUBLISH_SIGNAL = "__temporal_workflow_stream_publish" +PUBLISH_SIGNAL_NAME = "__temporal_workflow_stream_publish" +"""The signal :class:`WorkflowStream` registers for external publishes. + +Public so code that sends the signal itself, with its own publisher identity, +does not have to copy the name. +""" + +_PUBLISH_SIGNAL = PUBLISH_SIGNAL_NAME _POLL_UPDATE = "__temporal_workflow_stream_poll" _OFFSET_QUERY = "__temporal_workflow_stream_offset" @@ -234,6 +241,25 @@ def topic( self._topic_types[name] = bound return WorkflowTopicHandle(self, name, bound) + @property + def next_offset(self) -> int: + """The global offset the next published item will receive.""" + return self._base_offset + len(self._log) + + def items_from(self, offset: int) -> list[tuple[int, str, Payload]]: + """Return ``(offset, topic, payload)`` for every item at or past ``offset``. + + Reads the log in place, so it is safe to call from a + :func:`temporalio.workflow.wait_condition` predicate. An ``offset`` + below the truncation base starts at the base instead; the offsets in + the result say where the items actually sit. + """ + start = max(offset, self._base_offset) - self._base_offset + return [ + (self._base_offset + index, item.topic, item.data) + for index, item in enumerate(self._log[start:], start) + ] + def get_state( self, *, publisher_ttl: timedelta = timedelta(seconds=900) ) -> WorkflowStreamState: From 643bcdd78f6f80908487448619f8a31ebd4a9973 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 464/831] Keyed the Workflow Streams runtime by workflow instance, not run id. The SDK rebuilds an evicted workflow from history as a new object. A process map keyed by run id handed that object the previous instance's log, with no handlers registered on the new one and the records of a failed task still inside. The stream is now found through the handler the shipped class registers on the instance, and the provider reads the contrib module only through its public surface. --- .../streams/providers/workflow_streams.py | 121 ++++++++---------- 1 file changed, 54 insertions(+), 67 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 656056381..8155f7e9d 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -36,6 +36,7 @@ from temporalio.client import Client from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( + PUBLISH_SIGNAL_NAME, PublishEntry, PublishInput, WorkflowStream, @@ -48,77 +49,63 @@ from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord -_RUN_ATTR = "__temporal_streams_ws_runtime" _TAIL_QUERY = "__temporal_streams_tail" _IN = "in:" _OUT = "out:" class _Runtime: - """Per-run holder for the shipped stream object. + """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed - from a method named ``__init__``, and the provider builds it lazily on - the first read or write of a run. + from a method named ``__init__``. """ - def __init__(self) -> None: - self.stream = WorkflowStream() - # The poll Update stops answering once the workflow is closing, and a - # reader between polls at that moment would lose what the final task - # published. The log is workflow state, so a Query still serves it - # after completion. - workflow.set_query_handler(_TAIL_QUERY, self._tail) + def __init__(self, stream: WorkflowStream | None = None) -> None: + self.stream = WorkflowStream() if stream is None else stream + if workflow.get_query_handler(_TAIL_QUERY) is None: + # The poll Update stops answering once the workflow is closing, + # and a reader between polls at that moment would lose what the + # final task published. The log is workflow state, so a Query + # still serves it after completion. + workflow.set_query_handler(_TAIL_QUERY, self._tail) def _tail(self, from_offset: int) -> list[dict[str, Any]]: - base = self.stream._base_offset return [ { - "offset": base + index, - "topic": item.topic, - "data": base64.b64encode(item.data.data).decode("ascii"), + "offset": offset, + "topic": topic, + "data": base64.b64encode(payload.data).decode("ascii"), } - for index, item in enumerate(self.stream._log) - if base + index >= from_offset + for offset, topic, payload in self.stream.items_from(from_offset) ] -# Held per run rather than on the workflow instance, because the provider is -# asked to install its handlers from the workflow's constructor, and the -# instance is not registered with the runtime yet at that point. -_runtimes: dict[str, _Runtime] = {} +def _registered_stream() -> WorkflowStream | None: + handler = workflow.get_signal_handler(PUBLISH_SIGNAL_NAME) + if handler is None: + return None + stream = getattr(handler, "__self__", None) + if not isinstance(stream, WorkflowStream): + raise RuntimeError( + f"the {PUBLISH_SIGNAL_NAME!r} signal on this workflow is handled by " + "something other than a WorkflowStream, so the workflow_streams " + "provider cannot share its log" + ) + return stream def _runtime() -> _Runtime: - key = workflow.info().run_id - runtime = _runtimes.get(key) - if runtime is None: - runtime = _Runtime() - _runtimes[key] = runtime - return runtime - - -def drain() -> None: - """Release parked pollers so the workflow can return. - - An Option 0 stream dies with its workflow, and a parked long-poll Update - would otherwise hold completion open. Call it right before the workflow - returns, the same obligation the shipped feature's ``detach_pollers`` - documents. A storage provider has no such step, which is one of the - differences the comparison table charges this transport with. - """ - runtime = _runtimes.pop(workflow.info().run_id, None) - if runtime is not None: - runtime.stream.detach_pollers() + # Found on the instance rather than in a process-level map keyed by run + # id: the SDK rebuilds an evicted workflow from history as a new object, + # and a map would hand that object the stale log with its unregistered + # handlers and the records of a task that failed. + stream = _registered_stream() + return _Runtime() if stream is None else _Runtime(stream) class _WSReadSource: - """Reads the signal-fed log the shipped feature keeps in workflow state. - - Reaches into the stream's private log rather than ``get_state()``, - because the snapshot copies the whole log per call and drops offsets, - and this runs inside ``workflow.wait_condition``. - """ + """Reads the signal-fed log the shipped feature keeps in workflow state.""" def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: self._stream = stream @@ -126,29 +113,21 @@ def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> No self._cursor = start self._closed = False - def _end(self) -> int: - return self._stream._base_offset + len(self._stream._log) - async def next_batch(self) -> list[tuple[Cursor, bytes]]: while True: if self._closed: raise StopAsyncIteration - base = self._stream._base_offset - if self._cursor < base: - # Truncated below the cursor; resume at what remains. - self._cursor = base await workflow.wait_condition( - lambda: self._closed or self._end() > self._cursor + lambda: self._closed or self._stream.next_offset > self._cursor ) if self._closed: raise StopAsyncIteration - batch: list[tuple[Cursor, bytes]] = [] - end = self._end() - for offset in range(self._cursor, end): - item = self._stream._log[offset - self._stream._base_offset] - if item.topic == self._shipped_topic: - batch.append((Cursor(str(offset)), item.data.data)) - self._cursor = end + batch = [ + (Cursor(str(offset)), payload.data) + for offset, topic, payload in self._stream.items_from(self._cursor) + if topic == self._shipped_topic + ] + self._cursor = self._stream.next_offset if batch: return batch @@ -254,7 +233,7 @@ def _entry(self, frame: bytes) -> PublishEntry: async def _send(self, entries: list[PublishEntry]) -> None: self._signal_sequence += 1 await self._handle.signal( - _PUBLISH_SIGNAL, + PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, @@ -324,7 +303,7 @@ async def read( async def _tail(self, from_offset: int) -> list[dict[str, Any]]: try: - return await self._client._handle.query( + wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) except Exception: @@ -378,7 +357,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - converter = self._client._payload_converter() + converter = self._client.payload_converter if as_type is None: return converter.from_payloads([payload])[0] return converter.from_payloads([payload], [as_type])[0] @@ -413,8 +392,16 @@ def prepare(self) -> None: _runtime() def drain(self) -> None: - """Release parked pollers so the workflow can return.""" - drain() + """Release parked pollers so the workflow can return. + + An Option 0 stream dies with its workflow, and a parked long-poll + Update would otherwise hold completion open. Call it right before + the workflow returns, the same obligation the shipped feature's + ``detach_pollers`` documents. + """ + stream = _registered_stream() + if stream is not None: + stream.detach_pollers() def open_read( self, From d015a6ff68484eca813d59b9a048b2cf3f0e4796 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 465/831] Committed producer sequences only after the publish signal was accepted. A retry after an ambiguous failure used to carry fresh sequences, so the shipped dedupe let the same batch land twice. The batch now stays pending under its signal sequence until the server accepts it, and goes out first if the caller moves on. append returns None because this transport learns positions at read time. --- .../streams/providers/workflow_streams.py | 100 +++++++++++------- 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 8155f7e9d..fb685fc2c 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -42,8 +42,7 @@ WorkflowStream, WorkflowStreamClient, ) -from temporalio.contrib.workflow_streams._stream import _PUBLISH_SIGNAL -from temporalio.contrib.workflow_streams._types import _encode_payload +from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -147,6 +146,11 @@ async def publish(self, frame: bytes) -> None: self._handle.publish(payload) +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + class WorkflowStreamsProducer: """Appends by sending the shipped publish Signal directly. @@ -154,6 +158,12 @@ class WorkflowStreamsProducer: owns the publisher identity: it must be ``producer#attempt`` for the shipped dedupe to drop a retry and pass a new generation, and the client would use its own random id. + + Sequences are committed only after the server accepted the Signal. A + batch whose Signal raised stays pending and goes out again under the + same signal sequence, either when the caller retries the same values or + ahead of whatever the caller sends next, so an ambiguous failure writes + the batch once and loses nothing. """ def __init__( @@ -174,10 +184,7 @@ def __init__( self._attempt = attempt self._sequence = 0 self._signal_sequence = 0 - - @property - def _frame_topic(self) -> str: - return self._stream or self._topic + self._pending: tuple[list[PublishEntry], int] | None = None @property def _shipped_topic(self) -> str: @@ -196,50 +203,67 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append ``values`` through the shipped publish Signal.""" + async def append(self, *values: Any) -> None: + """Append ``values`` through the shipped publish Signal. + + Always ``None``: this transport learns positions at read time. + """ + if not values: + return None + await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + return None + + async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" + await self._send([(RecordKind.FINISH, b"")]) + + def _frames( + self, bodies: list[tuple[RecordKind, bytes]] + ) -> tuple[list[PublishEntry], int]: + sequence = self._sequence entries = [] - for value in values: + for kind, body in bodies: frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.DATA, + topic=self._topic, + kind=kind, producer=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=sequence, + body=body, ) - self._sequence += 1 - entries.append(self._entry(frame)) - await self._send(entries) - return Cursor("") - - async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - frame = _frame.encode( - topic=self._frame_topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._send([self._entry(frame)]) - - def _entry(self, frame: bytes) -> PublishEntry: - payload = Payload(data=frame) - return PublishEntry(topic=self._shipped_topic, data=_encode_payload(payload)) - - async def _send(self, entries: list[PublishEntry]) -> None: - self._signal_sequence += 1 + sequence += 1 + entries.append( + PublishEntry( + topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) + ) + ) + return entries, sequence + + async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: + entries, next_sequence = self._frames(bodies) + if self._pending is not None and self._pending[0] != entries: + # The caller moved on from a batch whose Signal raised. It goes + # first, under the signal sequence it already had, so a copy the + # server did accept is dropped and one it never saw lands. The + # new batch is then renumbered behind it. + await self._signal(*self._pending) + entries, next_sequence = self._frames(bodies) + await self._signal(entries, next_sequence) + + async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: + signal_sequence = self._signal_sequence + 1 + self._pending = (entries, next_sequence) await self._handle.signal( PUBLISH_SIGNAL_NAME, PublishInput( items=entries, publisher_id=self._provider_id, - sequence=self._signal_sequence, + sequence=signal_sequence, ), ) + self._signal_sequence = signal_sequence + self._sequence = next_sequence + self._pending = None def _encode(self, value: Any) -> bytes: payload = ( From 0e8236ef00d658edf83e0fd684c0b50c666038fd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 466/831] Adapted the Workflow Streams provider to the interface changes. Inbound frames carry no topic and a topic filter on an inbound stream is rejected through the shared check; producer identity comes resolved from the package; an unreadable frame is skipped with a warning; read is declared as the generator it is. --- .../streams/providers/workflow_streams.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index fb685fc2c..ef2a88312 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -27,7 +27,8 @@ from __future__ import annotations import base64 -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any @@ -52,6 +53,8 @@ _IN = "in:" _OUT = "out:" +logger = logging.getLogger(__name__) + class _Runtime: """A view over the shipped stream object of the running workflow instance. @@ -280,12 +283,13 @@ class WorkflowStreamsConsumer: def __init__( self, stream_client: WorkflowStreamClient, - shipped_topic: str | None, + stream: str, poll_cooldown: timedelta, ) -> None: """Read what ``stream_client`` reaches, one long poll at a time.""" self._client = stream_client - self._shipped_topic = shipped_topic + self._stream = stream + self._shipped_topic = f"{_IN}{stream}" if stream else None self._poll_cooldown = poll_cooldown async def read( @@ -294,8 +298,9 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, waiting for ones not written yet.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 subscription = self._client.subscribe( @@ -351,7 +356,9 @@ def _record( cursor = Cursor(str(offset)) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) return [] if topic is not None and frame_topic != topic: return [] @@ -456,11 +463,6 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return WorkflowStreamsProducer( client.get_workflow_handle(workflow_id), client.data_converter.payload_converter, @@ -475,7 +477,7 @@ async def consumer( ) -> WorkflowStreamsConsumer: return WorkflowStreamsConsumer( WorkflowStreamClient.create(client, workflow_id), - f"{_IN}{stream}" if stream else None, + stream, self._poll_cooldown, ) From dff43413786aa20c3ac55650bba92aee74736258 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 467/831] Narrowed the tail query's error handling and filtered owner reads by topic. Only a missing handler or a vanished history means there is no tail to serve; anything else, such as a query timeout with no worker polling, is now an error rather than a silent empty stream. An owner-stream read with a topic subscribes to that shipped topic alone instead of dropping inbound items client-side. --- .../streams/providers/workflow_streams.py | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index ef2a88312..049fd60e9 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -20,8 +20,16 @@ - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns an empty cursor. The Signal transport learns positions - at read time; that is this provider's stated deviation. +- ``append`` returns ``None``. The Signal transport learns positions at read + time, so a caller that wants to follow from now asks ``Consumer.latest``. +- The workflow-side stream object belongs to the workflow instance, found + through the handler the shipped class registers on it. An evicted and + rebuilt workflow gets its own, so a task that failed leaks nothing into + the next attempt's log and a replayed run does not see records twice. +- An owner-stream read with a topic subscribes to that shipped topic alone. + Without one it has to take every shipped topic and drop the inbound + items client-side, which spends the poll response cap on records the + reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -34,7 +42,7 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowQueryFailedError from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -303,42 +311,63 @@ async def read( _provider.check_topic(self._stream, topic) attempts = AttemptTracker() next_offset = int(after.token) + 1 if after.token else 0 + if self._shipped_topic is not None: + shipped = [self._shipped_topic] + elif topic is not None: + shipped = [f"{_OUT}{topic}"] + else: + shipped = None subscription = self._client.subscribe( - self._shipped_topic, + shipped, from_offset=next_offset, result_type=RawValue, poll_cooldown=self._poll_cooldown, ) - async for item in subscription: - next_offset = item.offset + 1 - record = self._record( - attempts, item.offset, item.topic, item.data.payload.data, topic, type - ) - for out in record: - yield out + try: + async for item in subscription: + next_offset = item.offset + 1 + for out in self._record( + attempts, + item.offset, + item.topic, + item.data.payload.data, + topic, + type, + ): + yield out + finally: + # Lets go of the parked poll when the caller stops early. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() # The subscription ends when the workflow is closing or closed. What # landed after the last poll is still in workflow state, so the tail # comes back by Query rather than being lost with the run. - for wire in await self._tail(next_offset): + for offset, shipped_topic, frame in await self._tail(next_offset): for out in self._record( - attempts, - wire["offset"], - wire["topic"], - base64.b64decode(wire["data"]), - topic, - type, + attempts, offset, shipped_topic, frame, topic, type ): yield out - async def _tail(self, from_offset: int) -> list[dict[str, Any]]: + async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: try: wire = await self._client.handle.query( _TAIL_QUERY, from_offset, result_type=list ) - except Exception: - # A workflow that never opened a stream has no handler to ask, and - # one whose History is gone has nothing left to serve. + except WorkflowQueryFailedError as error: + if "expected but not found" not in str(error): + raise + # The workflow never opened a stream through this provider, so + # there is no tail to serve. return [] + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The History is gone; nothing is left to serve. + return [] + return [ + (item["offset"], item["topic"], base64.b64decode(item["data"])) + for item in wire + ] def _record( self, From 50b69e42797946cd31c99aa7bf28257ff0562f19 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 16:51:11 -0700 Subject: [PATCH 468/831] Ran the Workflow Streams provider tests on the test environment's server. The tests take the shared client fixture instead of an opt-in live gate, the loop workflow calls the portable lifecycle hooks, and new cases cover a cold workflow cache, the tail of a closed run, and the resend of a batch whose signal failed. --- .../streams/test_workflow_streams_provider.py | 227 +++++++++++++----- 1 file changed, 166 insertions(+), 61 deletions(-) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612aaa33d..612e99e02 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -1,44 +1,46 @@ -"""Live conformance for the workflow_streams provider. +"""Conformance for the workflow_streams provider on the test environment's server. -Runs the interface loop over the shipped Option 0 transport against a real -server: an outside producer appends through the publish Signal, the workflow -reads and republishes through its own state, and an outside consumer follows -the poll Update. Gated behind ``STREAMS_LIVE=workflow_streams`` because it -needs a running server (``TEMPORAL_ADDRESS``, default ``localhost:7233``). +Runs the interface loop over the shipped Option 0 transport: an outside +producer appends through the publish Signal, the workflow reads and +republishes through its own state, and an outside consumer follows the poll +Update while the run is open and the tail Query once it has closed. """ from __future__ import annotations import asyncio -import os +import base64 import uuid from typing import Any import pytest from temporalio import streams, workflow +from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams.providers.workflow_streams import drain -from temporalio.worker import Worker +from temporalio.contrib.workflow_streams import PublishInput +from temporalio.converter import DataConverter +from temporalio.streams import RecordKind, _frame +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from tests.helpers import new_worker -pytestmark = pytest.mark.skipif( - os.environ.get("STREAMS_LIVE") != "workflow_streams", - reason="needs a live server; run with STREAMS_LIVE=workflow_streams", -) + +@pytest.fixture(autouse=True) +def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] + streams.configure(provider="workflow_streams") @workflow.defn class EchoLoop: """Reads ``inputs``, echoes each value onto ``decisions``, ends on FINISH. - Lingers until released, because an Option 0 stream dies with its - workflow: a reader that arrives after close finds nothing, which is the - transport limit the doc states rather than a defect to fix here. + Lingers until released so a reader can follow it while it runs; whoever + arrives after it closed is served by the tail Query instead. """ def __init__(self) -> None: self._released = False + streams.prepare() @workflow.signal def release(self) -> None: @@ -54,11 +56,12 @@ async def run(self) -> int: break if record.kind is not RecordKind.DATA: continue + assert isinstance(record.value, dict) seen += 1 await decisions.publish({"echo": record.value["n"]}) await decisions.finish() await workflow.wait_condition(lambda: self._released) - drain() + streams.drain() await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -76,59 +79,40 @@ async def _collect() -> None: return out -async def test_interface_loop_over_workflow_streams(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - handle = await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" - ) +async def _feed(client: Client, workflow_id: str) -> None: + producer = await streams.producer( + client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() - producer = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, + +ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] + + +async def test_interface_loop_over_workflow_streams(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await producer.append({"n": 1}, {"n": 2}) - await producer.append({"n": 3}) - await producer.finish() + await _feed(client, workflow_id) consumer = await streams.consumer(client, workflow_id=workflow_id) records = await take(consumer.read(type=dict), 4) - assert [r.kind for r in records] == [ - RecordKind.DATA, - RecordKind.DATA, - RecordKind.DATA, - RecordKind.FINISH, - ] + assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(): - streams.configure(provider="workflow_streams") - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - workflow_id = f"streams-ws-live-{uuid.uuid4().hex}" - - async with Worker( - client, - task_queue=f"tq-{workflow_id}", - workflows=[EchoLoop], - **streams.worker_options(), - ): - await client.start_workflow( - EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" +async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) first = await streams.producer( @@ -147,7 +131,7 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): producer_id="model", attempt=1, ) - await retry.append({"n": 1}) + assert await retry.append({"n": 1}) is None second = await streams.producer( client, workflow_id=workflow_id, @@ -163,5 +147,126 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes(): records = await take(consumer.read(type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED + assert isinstance(records[1].value, streams.Supersession) assert records[1].value.previous_attempt == 1 assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + # Inbound records carry no topic; the stream's name is the address. + assert all(r.topic == "" for r in records) + + await second.finish() + await handle.signal(EchoLoop.release) + await handle.result() + + +async def test_cold_cache_serves_each_record_once(client: Client): + # Every task rebuilds the workflow from history, so the stream object + # has to belong to the instance that is running: a stale one would carry + # the previous instance's log and hand out every record twice. + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + inbound = await streams.consumer( + client, workflow_id=workflow_id, stream="inputs" + ) + arrived = await take(inbound.read(type=dict), 4) + assert [r.kind for r in arrived] == ECHOED + assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + +async def test_a_closed_run_serves_its_tail_by_query(client: Client): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await _feed(client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + # Nothing polled while the run was open. The poll Update is gone with + # the run, so everything below arrives through the tail Query. + consumer = await streams.consumer(client, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4) + assert [r.kind for r in records] == ECHOED + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + checkpoint = records[1].cursor + resumed = await streams.consumer(client, workflow_id=workflow_id) + again = await take(resumed.read(type=dict, after=checkpoint), 2) + assert [r.value["echo"] for r in again[:1]] == [3] + assert again[1].kind is RecordKind.FINISH + + +class _FlakyHandle: + """A workflow handle whose first Signal is accepted and then reported failed.""" + + def __init__(self) -> None: + self.sent: list[PublishInput] = [] + self._fail_next = True + + async def signal(self, name: str, arg: PublishInput) -> None: + del name + self.sent.append(arg) + if self._fail_next: + self._fail_next = False + raise ConnectionResetError( + "the server accepted the signal, the reply was lost" + ) + + +def _frames( + publish: PublishInput, +) -> list[tuple[RecordKind, str, str, int, int, bytes]]: + out = [] + for entry in publish.items: + payload = Payload() + payload.ParseFromString(base64.b64decode(entry.data)) + out.append(_frame.decode(payload.data)) + return out + + +def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: + return [ + (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + ] + + +def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: + return WorkflowStreamsProducer( + handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + ) + + +async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + # The retry carries the same signal sequence and the same frame sequence + # as the failed send, so the shipped dedupe drops the copy; the batch + # after it continues the numbering. + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + + +async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): + handle = _FlakyHandle() + producer = _producer(handle) + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + await producer.append({"n": 2}, {"n": 3}) + await producer.finish() + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] + assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH From 06cbd7885272982637b9fab918c88db9738e8d12 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:06:16 -0700 Subject: [PATCH 469/831] Rewrote the Workflow Streams provider on the plugin surface. Topics are the shipped topics of the same name, the record is the StreamRecord proto inside the item payload, and cursors name the run because a log is not carried across continue-as-new. --- .../streams/providers/workflow_streams.py | 684 +++++++++++------- 1 file changed, 409 insertions(+), 275 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 049fd60e9..6f18dce46 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -1,35 +1,33 @@ -"""The provider over today's Workflow Streams (Option 0). +"""The provider over the shipped Workflow Streams transport (Option 0). Speaks the shipped contrib feature's wire format, the ``__temporal_workflow_stream_*`` Signal, Update and Query, so interface code -and existing Workflow Streams code interoperate on one stream, and old -histories replay. Records live in the owning workflow's History, which is -also this provider's limit: Option 0's caps (payloads in History, the Signal -cap, bounded subscribers) are transport properties and remain. Reads after -the workflow closes go through one Query this provider adds, which serves -the log from workflow state for as long as the History is retained, so a -reader between polls when the workflow completed still gets the tail. +and existing Workflow Streams code share one log, and old histories replay. +Records live in the owning workflow's History, which is also this provider's +limit: the shipped caps (payloads in History, the Signal cap, bounded +subscribers) are transport properties and remain. The mapping, in one place: -- An interface record's frame rides as the item's ``Payload`` data. -- Inbound stream ``s`` is shipped topic ``in:s``; a writer topic ``t`` is - shipped topic ``out:t``, so the two namespaces cannot collide. A producer - appending onto the workflow's own topic ``t`` writes ``out:t`` as well, - which is what today's activities already do through the publish Signal. +- A topic is the shipped topic of the same name in the workflow's one log. + A record rides as the item's ``Payload``: its data is the serialized + ``StreamRecord`` proto and its encoding is ``binary/plain``. The shipped + code stores and returns that ``Payload`` untouched, so the body's own + encoding never meets the transport. - Producer identity dedupes through the shipped publisher state: the publisher id is ``producer#attempt`` and every publish Signal carries a monotonic sequence, so a retried batch drops and a new attempt passes. -- ``append`` returns ``None``. The Signal transport learns positions at read - time, so a caller that wants to follow from now asks ``Consumer.latest``. +- ``append()`` returns ``None``. The Signal transport learns positions at + read time, so a caller that wants to follow from now asks ``latest()``. +- A log belongs to one run and is not carried across continue-as-new, so a + cursor names the run as well as the offset. A handle without a run id + reads run after run: each log through the poll Update while its run is + open and through the tail Query once it has closed, then the successor's + from its first record. - The workflow-side stream object belongs to the workflow instance, found through the handler the shipped class registers on it. An evicted and rebuilt workflow gets its own, so a task that failed leaks nothing into the next attempt's log and a replayed run does not see records twice. -- An owner-stream read with a topic subscribes to that shipped topic alone. - Without one it has to take every shipped topic and drop the inbound - items client-side, which spends the poll response cap on records the - reader never sees; name a topic on a busy workflow. """ from __future__ import annotations @@ -40,9 +38,17 @@ from datetime import timedelta from typing import Any +from google.protobuf.message import DecodeError + from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client, WorkflowQueryFailedError +from temporalio.client import ( + Client, + WorkflowExecutionStatus, + WorkflowHandle, + WorkflowHistoryEventFilterType, + WorkflowQueryFailedError, +) from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( PUBLISH_SIGNAL_NAME, @@ -51,20 +57,80 @@ WorkflowStream, WorkflowStreamClient, ) +from temporalio.converter import PayloadConverter from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = [ + "WorkflowStreamsHandle", + "WorkflowStreamsProducer", + "WorkflowStreamsProvider", +] +_PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" -_IN = "in:" -_OUT = "out:" +_ENCODING = b"binary/plain" logger = logging.getLogger(__name__) -class _Runtime: +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") + + +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "workflow_streams provider" + ) from None + + +def _wrap(record: WireRecord) -> Payload: + return Payload(metadata={"encoding": _ENCODING}, data=record.SerializeToString()) + + +def _unwrap(cursor: Cursor, payload: Payload, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(payload.data) + except DecodeError as error: + # An item another publisher put on this topic, or a corrupt one: + # skip and say so, so one bad record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None + + +def _entry_data(payload: Payload) -> str: + # The documented wire form of PublishEntry.data. + return base64.b64encode(payload.SerializeToString()).decode("ascii") + + +class _InstanceStream: """A view over the shipped stream object of the running workflow instance. A separate class because ``WorkflowStream`` insists on being constructed @@ -85,7 +151,7 @@ def _tail(self, from_offset: int) -> list[dict[str, Any]]: { "offset": offset, "topic": topic, - "data": base64.b64encode(payload.data).decode("ascii"), + "data": base64.b64encode(payload.SerializeToString()).decode("ascii"), } for offset, topic, payload in self.stream.items_from(from_offset) ] @@ -105,39 +171,45 @@ def _registered_stream() -> WorkflowStream | None: return stream -def _runtime() -> _Runtime: +def _instance() -> _InstanceStream: # Found on the instance rather than in a process-level map keyed by run # id: the SDK rebuilds an evicted workflow from history as a new object, # and a map would hand that object the stale log with its unregistered # handlers and the records of a task that failed. stream = _registered_stream() - return _Runtime() if stream is None else _Runtime(stream) + return _InstanceStream() if stream is None else _InstanceStream(stream) class _WSReadSource: """Reads the signal-fed log the shipped feature keeps in workflow state.""" - def __init__(self, stream: WorkflowStream, shipped_topic: str, start: int) -> None: + def __init__( + self, stream: WorkflowStream, topic: str, start: int, run_id: str + ) -> None: self._stream = stream - self._shipped_topic = shipped_topic - self._cursor = start + self._topic = topic + self._offset = start + self._run_id = run_id self._closed = False - async def next_batch(self) -> list[tuple[Cursor, bytes]]: + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: while True: if self._closed: raise StopAsyncIteration await workflow.wait_condition( - lambda: self._closed or self._stream.next_offset > self._cursor + lambda: self._closed or self._stream.next_offset > self._offset ) if self._closed: raise StopAsyncIteration - batch = [ - (Cursor(str(offset)), payload.data) - for offset, topic, payload in self._stream.items_from(self._cursor) - if topic == self._shipped_topic - ] - self._cursor = self._stream.next_offset + batch: list[tuple[Cursor, WireRecord]] = [] + for offset, topic, payload in self._stream.items_from(self._offset): + if topic != self._topic: + continue + cursor = _cursor(self._run_id, offset) + wire = _unwrap(cursor, payload, workflow.logger.warning) + if wire is not None: + batch.append((cursor, wire)) + self._offset = self._stream.next_offset if batch: return batch @@ -146,20 +218,51 @@ def close(self) -> None: class _WSWriteSink: - def __init__(self, stream: WorkflowStream, shipped_topic: str) -> None: - self._handle = stream.topic(shipped_topic) + def __init__(self, stream: WorkflowStream, topic: str) -> None: + self._handle = stream.topic(topic) - async def publish(self, frame: bytes) -> None: + def publish(self, record: WireRecord) -> None: # Appending to workflow state commits with the task, and a poll # Update's result rides the same task completion, so a failed task # leaks nothing: rule 1 through the shipped mechanics. - payload = workflow.payload_converter().to_payloads([frame])[0] - self._handle.publish(payload) + self._handle.publish(_wrap(record)) -def _entry_data(payload: Payload) -> str: - # The documented wire form of PublishEntry.data. - return base64.b64encode(payload.SerializeToString()).decode("ascii") +class _WSWorkflowProvider: + """The workflow half: the shipped stream object of the running instance.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's log is its own" + ) + start = named[1] + 1 + return _WSReadSource(_instance().stream, topic, start, run_id) + + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _WSWriteSink(_instance().stream, topic) + + def on_workflow_start(self) -> None: + # Registered before the first task completes, because an outside + # reader can poll before workflow code has opened anything, and an + # Update with no handler yet is rejected rather than held. + _instance() + + async def on_workflow_finish(self) -> None: + # An Option 0 stream dies with its run, and a parked long-poll Update + # would otherwise hold completion open. Same recipe the shipped + # feature documents before a return or a continue-as-new. + stream = _registered_stream() + if stream is None: + return + stream.detach_pollers() + await workflow.wait_condition(workflow.all_handlers_finished) class WorkflowStreamsProducer: @@ -180,16 +283,14 @@ class WorkflowStreamsProducer: def __init__( self, handle: Any, - converter: Any, - stream: str, + converter: PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on ``handle``.""" + """Bind this producer to ``topic`` on the workflow behind ``handle``.""" self._handle = handle self._converter = converter - self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt @@ -198,8 +299,9 @@ def __init__( self._pending: tuple[list[PublishEntry], int] | None = None @property - def _shipped_topic(self) -> str: - return f"{_IN}{self._stream}" if self._stream else f"{_OUT}{self._topic}" + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -207,152 +309,258 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: + def _publisher_id(self) -> str: return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> None: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the shipped publish Signal. - Always ``None``: this transport learns positions at read time. + Always ``None``: this transport learns positions at read time, so a + caller that wants to follow from now asks + :meth:`WorkflowStreamsHandle.latest`. """ if not values: return None - await self._send([(RecordKind.DATA, self._encode(value)) for value in values]) + await self._send([(RecordKind.DATA, value) for value in values]) return None async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" - await self._send([(RecordKind.FINISH, b"")]) + """Write ``FINISH`` for this producer on this topic.""" + await self._send([(RecordKind.FINISH, None)]) - def _frames( - self, bodies: list[tuple[RecordKind, bytes]] + def _entries( + self, batch: list[tuple[RecordKind, Any]] ) -> tuple[list[PublishEntry], int]: sequence = self._sequence entries = [] - for kind, body in bodies: - frame = _frame.encode( + for kind, value in batch: + wire = to_wire( + self._converter, topic=self._topic, kind=kind, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, sequence=sequence, - body=body, ) sequence += 1 entries.append( - PublishEntry( - topic=self._shipped_topic, data=_entry_data(Payload(data=frame)) - ) + PublishEntry(topic=self._topic, data=_entry_data(_wrap(wire))) ) return entries, sequence - async def _send(self, bodies: list[tuple[RecordKind, bytes]]) -> None: - entries, next_sequence = self._frames(bodies) + async def _send(self, batch: list[tuple[RecordKind, Any]]) -> None: + entries, next_sequence = self._entries(batch) if self._pending is not None and self._pending[0] != entries: # The caller moved on from a batch whose Signal raised. It goes # first, under the signal sequence it already had, so a copy the # server did accept is dropped and one it never saw lands. The # new batch is then renumbered behind it. await self._signal(*self._pending) - entries, next_sequence = self._frames(bodies) + entries, next_sequence = self._entries(batch) await self._signal(entries, next_sequence) async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: signal_sequence = self._signal_sequence + 1 self._pending = (entries, next_sequence) - await self._handle.signal( - PUBLISH_SIGNAL_NAME, - PublishInput( - items=entries, - publisher_id=self._provider_id, - sequence=signal_sequence, - ), - ) + try: + await self._handle.signal( + PUBLISH_SIGNAL_NAME, + PublishInput( + items=entries, + publisher_id=self._publisher_id, + sequence=signal_sequence, + ), + ) + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._handle.id!r} was not found, so its stream " + "cannot be appended to" + ) from error + raise self._signal_sequence = signal_sequence self._sequence = next_sequence self._pending = None - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - return payload.SerializeToString() - -class WorkflowStreamsConsumer: - """Reads through the shipped long-poll Update, with shared supersession.""" +class WorkflowStreamsHandle: + """One workflow's log from outside, through the shipped poll Update and a tail Query.""" def __init__( self, - stream_client: WorkflowStreamClient, - stream: str, + client: Client, + workflow_id: str, + run_id: str | None, poll_cooldown: timedelta, ) -> None: - """Read what ``stream_client`` reaches, one long poll at a time.""" - self._client = stream_client - self._stream = stream - self._shipped_topic = f"{_IN}{stream}" if stream else None + """Address ``workflow_id``'s log, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id self._poll_cooldown = poll_cooldown + self._converter = client.data_converter.payload_converter - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, waiting for ones not written yet.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - next_offset = int(after.token) + 1 if after.token else 0 - if self._shipped_topic is not None: - shipped = [self._shipped_topic] - elif topic is not None: - shipped = [f"{_OUT}{topic}"] - else: - shipped = None - subscription = self._client.subscribe( - shipped, - from_offset=next_offset, - result_type=RawValue, - poll_cooldown=self._poll_cooldown, + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) + + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning ) - try: - async for item in subscription: - next_offset = item.offset + 1 - for out in self._record( - attempts, - item.offset, - item.topic, - item.data.payload.data, - topic, - type, - ): - yield out - finally: - # Lets go of the parked poll when the caller stops early. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - # The subscription ends when the workflow is closing or closed. What - # landed after the last poll is still in workflow state, so the tail - # comes back by Query rather than being lost with the run. - for offset, shipped_topic, frame in await self._tail(next_offset): - for out in self._record( - attempts, offset, shipped_topic, frame, topic, type + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + handle = self._handle(run_id) + next_offset = offset + # Pinned to one run, with no client for the shipped chain + # following: a log is not carried across continue-as-new, so + # the successor's offsets start over and this loop is what + # moves from one run to the next. + subscription = WorkflowStreamClient(handle).subscribe( + topic, + from_offset=offset, + result_type=RawValue, + poll_cooldown=self._poll_cooldown, + ) + try: + async for item in subscription: + next_offset = item.offset + 1 + if item.topic != topic: + continue + for record in self._records( + decoder, run_id, item.offset, item.data.payload + ): + yield record + except RPCError as error: + # The run closed and its poll Update went with it, or the + # workflow does not exist; the describe below tells which. + if error.status != RPCStatusCode.NOT_FOUND: + raise + finally: + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() + status = await self._status(handle) + if status is None: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} run {run_id!r} was not found" + ) + if status == WorkflowExecutionStatus.RUNNING: + # The subscription ended early, on an RPC timeout for + # instance; the run is still open, so pick up where it left. + offset = next_offset + continue + # What landed after the last poll is still in workflow state, so + # the tail comes back by Query rather than being lost with the run. + for offset_, shipped_topic, payload in await self._tail( + handle, next_offset + ): + if shipped_topic != topic: + continue + for record in self._records(decoder, run_id, offset_, payload): + yield record + if ( + self._run_id is not None + or status != WorkflowExecutionStatus.CONTINUED_AS_NEW ): - yield out + return + successor = await self._successor(handle) + if successor is None: + return + run_id, offset = successor, 0 + + def _records( + self, decoder: RecordDecoder, run_id: str, offset: int, payload: Payload + ) -> list[StreamRecord[Any]]: + cursor = _cursor(run_id, offset) + wire = _unwrap(cursor, payload, logger.warning) + if wire is None: + return [] + return decoder.decode(cursor, wire) + + def _handle(self, run_id: str | None) -> WorkflowHandle[Any, Any]: + return self._client.get_workflow_handle(self._workflow_id, run_id=run_id) - async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: + async def _status( + self, handle: WorkflowHandle[Any, Any] + ) -> WorkflowExecutionStatus | None: try: - wire = await self._client.handle.query( - _TAIL_QUERY, from_offset, result_type=list - ) + return (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + return None + raise + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + try: + run_id = (await self._handle(None).describe()).run_id + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert run_id is not None + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + try: + async for event in self._handle(run_id).fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The run's History is gone: the chain's retained part starts here. + return None + + async def _successor(self, handle: WorkflowHandle[Any, Any]) -> str | None: + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + async for event in events: + if event.HasField("workflow_execution_continued_as_new_event_attributes"): + attributes = event.workflow_execution_continued_as_new_event_attributes + return attributes.new_execution_run_id or None + return None + + async def _tail( + self, handle: WorkflowHandle[Any, Any], from_offset: int + ) -> list[tuple[int, str, Payload]]: + try: + wire = await handle.query(_TAIL_QUERY, from_offset, result_type=list) except WorkflowQueryFailedError as error: if "expected but not found" not in str(error): raise @@ -365,150 +573,76 @@ async def _tail(self, from_offset: int) -> list[tuple[int, str, bytes]]: # The History is gone; nothing is left to serve. return [] return [ - (item["offset"], item["topic"], base64.b64decode(item["data"])) + ( + item["offset"], + item["topic"], + Payload.FromString(base64.b64decode(item["data"])), + ) for item in wire ] - def _record( - self, - attempts: AttemptTracker, - offset: int, - shipped_topic: str, - frame: bytes, - topic: str | None, - type: type | None, - ) -> list[StreamRecord[Any]]: - if self._shipped_topic is None and not shipped_topic.startswith(_OUT): - return [] - if self._shipped_topic is not None and shipped_topic != self._shipped_topic: - return [] - cursor = Cursor(str(offset)) + async def latest(self, *, topic: str) -> Cursor: + """The newest position in the log, which orders every topic of this workflow. + + The log is one per run, so the cursor names the run it was read from: + the pinned run, or the latest run of the chain. + """ + _require_topic(topic) + handle = self._handle(self._run_id) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode(frame) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning("skipping stream record at %s: %s", cursor, error) - return [] - if topic is not None and frame_topic != topic: - return [] - out: list[StreamRecord[Any]] = [] - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - out.append(superseded) - out.append( - StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + description = await handle.describe() + head = await WorkflowStreamClient(handle).get_offset() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + run_id = description.run_id + assert run_id is not None + if head > 0: + return _cursor(run_id, head - 1) + # An empty log on the chain's first run is the beginning of the + # stream; on a successor it is a position of its own, because + # BEGINNING would send a chain-following read back to the first run. + if await self._predecessor(run_id) is None: + return BEGINNING + return _cursor(run_id, -1) + + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> WorkflowStreamsProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return WorkflowStreamsProducer( + self._handle(self._run_id), self._converter, topic, producer_id, attempt ) - return out - - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one log per workflow, whatever the topic - head = await self._client.get_offset() - return Cursor(str(head - 1)) if head > 0 else BEGINNING - - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - converter = self._client.payload_converter - if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] - - -class _WorkflowStreamsProvider: - name = "workflow_streams" - - def __init__(self) -> None: - self._poll_cooldown = timedelta(milliseconds=100) - - def configure(self, **options: Any) -> None: - cooldown = options.pop("poll_cooldown", None) - if cooldown is not None: - self._poll_cooldown = cooldown - if options: - raise TypeError( - "the workflow_streams provider takes only poll_cooldown, " - f"got {sorted(options)}" - ) - - def worker_options(self) -> dict[str, Any]: - return {} - def prepare(self) -> None: - """Register the shipped publish signal and poll update handlers. - Done here rather than on the first read, because an outside reader - can poll before workflow code has opened anything, and an update with - no handler yet is rejected rather than held. - """ - _runtime() +class WorkflowStreamsProvider(ProviderPlugin): + """The provider over the shipped Workflow Streams transport.""" - def drain(self) -> None: - """Release parked pollers so the workflow can return. + def __init__( + self, *, poll_cooldown: timedelta = timedelta(milliseconds=100) + ) -> None: + """Create the provider. - An Option 0 stream dies with its workflow, and a parked long-poll - Update would otherwise hold completion open. Call it right before - the workflow returns, the same obligation the shipped feature's - ``detach_pollers`` documents. + Args: + poll_cooldown: How long an outside reader that is caught up waits + between polls. Backlogs drain at full speed regardless. """ - stream = _registered_stream() - if stream is not None: - stream.detach_pollers() - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Ignored: a publish Signal is a workflow event, so the wait below - # wakes on delivery and nothing is held between records. - del idle_timeout - return _WSReadSource( - _runtime().stream, - f"{_IN}{stream}", - int(after.token) + 1 if after.token else 0, - ) - - def open_write(self, topic: str) -> WriteSink: - return _WSWriteSink(_runtime().stream, f"{_OUT}{topic}") - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> WorkflowStreamsProducer: - return WorkflowStreamsProducer( - client.get_workflow_handle(workflow_id), - client.data_converter.payload_converter, - stream, - topic, - producer_id, - attempt, - ) + self._poll_cooldown = poll_cooldown - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> WorkflowStreamsConsumer: - return WorkflowStreamsConsumer( - WorkflowStreamClient.create(client, workflow_id), - stream, - self._poll_cooldown, - ) + def workflow_provider(self) -> _WSWorkflowProvider: + """The workflow half, over the running instance's shipped stream object.""" + return _WSWorkflowProvider() + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> WorkflowStreamsHandle: + """A handle on ``workflow_id``'s log; without ``run_id`` it follows the chain.""" + return WorkflowStreamsHandle(client, workflow_id, run_id, self._poll_cooldown) -_provider.register("workflow_streams", _WorkflowStreamsProvider) + async def close(self) -> None: + """Nothing to release: the provider holds no connection of its own.""" From 0de91c292cc4a4b0ec1748b46c9ff1a9f15e0e14 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:06:16 -0700 Subject: [PATCH 470/831] Ran the conformance suite over Workflow Streams and covered chain reads. The provider registers in SETUPS with a host workflow that owns the stream, and its own tests cover the tail Query, a read that ends, and a handle that follows continue-as-new run by run. --- CHANGELOG.md | 10 +- tests/streams/test_streams_conformance.py | 49 +++- .../streams/test_workflow_streams_provider.py | 239 +++++++++++------- 3 files changed, 205 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 811ebef5d..8f9e500d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,10 +33,12 @@ to include examples, links to docs, or any other relevant information. is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. -- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the - stream interface over the shipped Workflow Streams transport, so a workflow - reads and publishes through `temporalio.contrib.workflow_streams` without - naming it. +- **Experimental**: `temporalio.streams.providers.workflow_streams.WorkflowStreamsProvider` + serves the stream interface over the shipped Workflow Streams transport as a + worker plugin, so a workflow reads and publishes through + `temporalio.contrib.workflow_streams` without naming it. Records are the + `StreamRecord` proto inside the shipped item payload, and a handle without a + run id follows continue-as-new run by run. ### Changed diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9002ea16a..630814c7f 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -24,12 +24,14 @@ import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass +from datetime import timedelta from typing import Any import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -46,6 +48,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider +from tests.helpers import new_worker # Defined once and shared by every case, the way an application shares them # between its workflow, its activities and its backend. @@ -91,8 +95,49 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: + # No STREAMS_LIVE gate: the store is the workflow's own History, which the + # test environment's server provides. + provider = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase( + "workflow_streams", + provider, + client, + reports_positions=False, + host=host, + ) + for handle in hosts.values(): + await handle.terminate() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { - "memory": _memory_case + "memory": _memory_case, + "workflow_streams": _workflow_streams_case, } _CAPABILITIES = { diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 612e99e02..28f2f631d 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -2,8 +2,10 @@ Runs the interface loop over the shipped Option 0 transport: an outside producer appends through the publish Signal, the workflow reads and -republishes through its own state, and an outside consumer follows the poll -Update while the run is open and the tail Query once it has closed. +republishes through its own state, and an outside reader follows the poll +Update while the run is open and the tail Query once it has closed. The +outside-surface cases shared by every provider run from +``test_streams_conformance``; this file covers what the transport adds. """ from __future__ import annotations @@ -11,23 +13,31 @@ import asyncio import base64 import uuid +from datetime import timedelta from typing import Any import pytest -from temporalio import streams, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.contrib.workflow_streams import PublishInput from temporalio.converter import DataConverter -from temporalio.streams import RecordKind, _frame -from temporalio.streams.providers.workflow_streams import WorkflowStreamsProducer +from temporalio.streams import RecordKind, Supersession +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers.workflow_streams import ( + WorkflowStreamsProducer, + WorkflowStreamsProvider, +) from tests.helpers import new_worker +INPUTS = "inputs" +DECISIONS = "decisions" -@pytest.fixture(autouse=True) -def _workflow_streams_provider(): # pyright: ignore[reportUnusedFunction] - streams.configure(provider="workflow_streams") + +@pytest.fixture +def provider() -> WorkflowStreamsProvider: + return WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) @workflow.defn @@ -40,7 +50,6 @@ class EchoLoop: def __init__(self) -> None: self._released = False - streams.prepare() @workflow.signal def release(self) -> None: @@ -48,21 +57,19 @@ def release(self) -> None: @workflow.run async def run(self) -> int: - inputs = streams.reader("inputs", type=dict) - decisions = streams.writer("decisions") + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) seen = 0 async for record in inputs: if record.kind is RecordKind.FINISH: break if record.kind is not RecordKind.DATA: continue - assert isinstance(record.value, dict) + assert record.value is not None seen += 1 - await decisions.publish({"echo": record.value["n"]}) - await decisions.finish() + decisions.publish({"echo": record.value["n"]}) + decisions.finish() await workflow.wait_condition(lambda: self._released) - streams.drain() - await workflow.wait_condition(workflow.all_handlers_finished) return seen @@ -79,10 +86,11 @@ async def _collect() -> None: return out -async def _feed(client: Client, workflow_id: str) -> None: - producer = await streams.producer( - client, workflow_id=workflow_id, stream="inputs", producer_id="model", attempt=1 - ) +async def _feed( + provider: WorkflowStreamsProvider, client: Client, workflow_id: str +) -> None: + stream = provider.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() @@ -91,92 +99,77 @@ async def _feed(client: Client, workflow_id: str) -> None: ECHOED = [RecordKind.DATA, RecordKind.DATA, RecordKind.DATA, RecordKind.FINISH] -async def test_interface_loop_over_workflow_streams(client: Client): +async def test_interface_loop_over_workflow_streams( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + assert all(r.topic == DECISIONS and r.producer_id == "" for r in records) await handle.signal(EchoLoop.release) assert await handle.result() == 3 -async def test_retried_producer_dedupes_and_new_attempt_supersedes(client: Client): +async def test_retried_producer_dedupes_and_new_attempt_supersedes( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) + stream = provider.get_stream_handle(client, workflow_id) - first = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - await first.append({"n": 1}) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # Positions are learnt at read time on this transport. + assert await first.append({"n": 1}) is None # The retry of the same attempt re-sends its first batch. - retry = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) - assert await retry.append({"n": 1}) is None - second = await streams.producer( - client, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=2, - ) + retry = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await retry.append({"n": 1}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"n": 2}) - consumer = await streams.consumer( - client, workflow_id=workflow_id, stream="inputs" - ) - records = await take(consumer.read(type=dict), 3) + records = await take(stream.read(topic=INPUTS, result_type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED - assert isinstance(records[1].value, streams.Supersession) - assert records[1].value.previous_attempt == 1 + assert records[1].supersession == Supersession("model", 1, 2) assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 - # Inbound records carry no topic; the stream's name is the address. - assert all(r.topic == "" for r in records) + assert all(r.topic == INPUTS for r in records) await second.finish() await handle.signal(EchoLoop.release) await handle.result() -async def test_cold_cache_serves_each_record_once(client: Client): +async def test_cold_cache_serves_each_record_once( + client: Client, provider: WorkflowStreamsProvider +): # Every task rebuilds the workflow from history, so the stream object # has to belong to the instance that is running: a stale one would carry # the previous instance's log and hand out every record twice. workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop, max_cached_workflows=0) as worker: + async with new_worker( + client, EchoLoop, plugins=[provider], max_cached_workflows=0 + ) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - inbound = await streams.consumer( - client, workflow_id=workflow_id, stream="inputs" - ) - arrived = await take(inbound.read(type=dict), 4) + arrived = await take(stream.read(topic=INPUTS, result_type=dict), 4) assert [r.kind for r in arrived] == ECHOED assert [r.value["n"] for r in arrived[:3]] == [1, 2, 3] @@ -184,33 +177,106 @@ async def test_cold_cache_serves_each_record_once(client: Client): assert await handle.result() == 3 -async def test_a_closed_run_serves_its_tail_by_query(client: Client): +async def test_a_closed_run_serves_its_tail_by_query_and_the_read_ends( + client: Client, provider: WorkflowStreamsProvider +): workflow_id = f"streams-ws-{uuid.uuid4().hex}" - async with new_worker(client, EchoLoop) as worker: + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=worker.task_queue ) - await _feed(client, workflow_id) + await _feed(provider, client, workflow_id) await handle.signal(EchoLoop.release) assert await handle.result() == 3 # Nothing polled while the run was open. The poll Update is gone with - # the run, so everything below arrives through the tail Query. - consumer = await streams.consumer(client, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4) + # the run, so everything below arrives through the tail Query, and + # the read ends by itself once the tail is delivered. + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + + records = await asyncio.wait_for(read_everything(), 30) assert [r.kind for r in records] == ECHOED assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] checkpoint = records[1].cursor - resumed = await streams.consumer(client, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2 + ) assert [r.value["echo"] for r in again[:1]] == [3] assert again[1].kind is RecordKind.FINISH +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[provider]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + first_run = handle.first_execution_run_id + assert first_run is not None + + chain = provider.get_stream_handle(client, workflow_id) + + async def read_everything(stream: Any) -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + # Each run keeps its own log, so following the chain means reading + # the first run to its close and then the successor from its start. + assert await asyncio.wait_for(read_everything(chain), 30) == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + pinned = provider.get_stream_handle(client, workflow_id, run_id=first_run) + assert await asyncio.wait_for(read_everything(pinned), 30) == [ + (RecordKind.DATA, {"run": 0}), + ] + # A cursor from the first run resumes into the successor. + records = await take(chain.read(topic=DECISIONS, result_type=dict), 1) + resumed = await asyncio.wait_for( + asyncio.ensure_future( + _values( + chain.read( + topic=DECISIONS, result_type=dict, after=records[0].cursor + ) + ) + ), + 30, + ) + assert resumed == [{"run": 1}, None] + + +async def _values(records: Any) -> list[Any]: + return [r.value async for r in records] + + class _FlakyHandle: """A workflow handle whose first Signal is accepted and then reported failed.""" + id = "flaky" + def __init__(self) -> None: self.sent: list[PublishInput] = [] self._fail_next = True @@ -225,26 +291,24 @@ async def signal(self, name: str, arg: PublishInput) -> None: ) -def _frames( - publish: PublishInput, -) -> list[tuple[RecordKind, str, str, int, int, bytes]]: +def _wires(publish: PublishInput) -> list[WireRecord]: out = [] for entry in publish.items: - payload = Payload() - payload.ParseFromString(base64.b64decode(entry.data)) - out.append(_frame.decode(payload.data)) + payload = Payload.FromString(base64.b64decode(entry.data)) + out.append(WireRecord.FromString(payload.data)) return out def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: return [ - (publish.sequence, [frame[4] for frame in _frames(publish)]) for publish in sent + (publish.sequence, [wire.sequence for wire in _wires(publish)]) + for publish in sent ] def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: return WorkflowStreamsProducer( - handle, DataConverter.default.payload_converter, "inputs", "", "model", 1 + handle, DataConverter.default.payload_converter, INPUTS, "model", 1 ) @@ -255,10 +319,11 @@ async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): await producer.append({"n": 1}) await producer.append({"n": 1}) await producer.append({"n": 2}) - # The retry carries the same signal sequence and the same frame sequence - # as the failed send, so the shipped dedupe drops the copy; the batch - # after it continues the numbering. + # The retry carries the same signal sequence and the same record + # sequence as the failed send, so the shipped dedupe drops the copy; the + # batch after it continues the numbering. assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + assert all(publish.publisher_id == "model#1" for publish in handle.sent) async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): @@ -269,4 +334,4 @@ async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): await producer.append({"n": 2}, {"n": 3}) await producer.finish() assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] - assert _frames(handle.sent[-1])[0][0] is RecordKind.FINISH + assert _wires(handle.sent[-1])[0].kind == int(RecordKind.FINISH) From c44ba22617f43c762955d8b6e414344b9cbda9fa Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:46:46 -0700 Subject: [PATCH 471/831] Detached the stream this instance captured, not the thread's current one. The workflow half now keeps the WorkflowStream it found at start, so the finish hook lets go of this run's pollers rather than of whatever the signal handler lookup answers on the thread at the time. --- .../streams/providers/workflow_streams.py | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 6f18dce46..cef1cbe3e 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -229,7 +229,20 @@ def publish(self, record: WireRecord) -> None: class _WSWorkflowProvider: - """The workflow half: the shipped stream object of the running instance.""" + """The workflow half: the shipped stream object of one workflow instance. + + Made per instance by the worker, so the stream object it captures on + first use is this instance's, and the finish hook lets go of that one + rather than of whatever the thread's handler lookup answers at the time. + """ + + def __init__(self) -> None: + self._stream: WorkflowStream | None = None + + def _own_stream(self) -> WorkflowStream: + if self._stream is None: + self._stream = _instance().stream + return self._stream def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: _require_topic(topic) @@ -242,26 +255,25 @@ def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: f"cursor {after.token!r} names another run; a run's log is its own" ) start = named[1] + 1 - return _WSReadSource(_instance().stream, topic, start, run_id) + return _WSReadSource(self._own_stream(), topic, start, run_id) def open_writer(self, topic: str) -> WriteSink: _require_topic(topic) - return _WSWriteSink(_instance().stream, topic) + return _WSWriteSink(self._own_stream(), topic) def on_workflow_start(self) -> None: # Registered before the first task completes, because an outside # reader can poll before workflow code has opened anything, and an # Update with no handler yet is rejected rather than held. - _instance() + self._own_stream() async def on_workflow_finish(self) -> None: # An Option 0 stream dies with its run, and a parked long-poll Update # would otherwise hold completion open. Same recipe the shipped # feature documents before a return or a continue-as-new. - stream = _registered_stream() - if stream is None: + if self._stream is None: return - stream.detach_pollers() + self._stream.detach_pollers() await workflow.wait_condition(workflow.all_handlers_finished) From 309dcecf974d948436d6815e736269fdeaadd757 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 04:26:40 -0700 Subject: [PATCH 472/831] Drove the poll Update directly so a cancelled read stays cancelled. The shipped subscribe loop swallows a cancellation of the caller's task, so a bounded read resubscribed forever instead of timing out. The poll name and its failure types are public on the contrib package for this. --- .../contrib/workflow_streams/__init__.py | 6 ++ .../contrib/workflow_streams/_stream.py | 9 +- .../streams/providers/workflow_streams.py | 100 +++++++++++++----- .../streams/test_workflow_streams_provider.py | 33 ++++++ 4 files changed, 122 insertions(+), 26 deletions(-) diff --git a/temporalio/contrib/workflow_streams/__init__.py b/temporalio/contrib/workflow_streams/__init__.py index 3f225bb2f..c44bd25ea 100644 --- a/temporalio/contrib/workflow_streams/__init__.py +++ b/temporalio/contrib/workflow_streams/__init__.py @@ -14,6 +14,7 @@ from temporalio.contrib.workflow_streams._client import WorkflowStreamClient from temporalio.contrib.workflow_streams._stream import ( + POLL_UPDATE_NAME, PUBLISH_SIGNAL_NAME, WorkflowStream, ) @@ -22,6 +23,8 @@ WorkflowTopicHandle, ) from temporalio.contrib.workflow_streams._types import ( + STREAM_DRAINING_ERROR_TYPE, + TRUNCATED_OFFSET_ERROR_TYPE, PollInput, PollResult, PublishEntry, @@ -32,7 +35,10 @@ ) __all__ = [ + "POLL_UPDATE_NAME", "PUBLISH_SIGNAL_NAME", + "STREAM_DRAINING_ERROR_TYPE", + "TRUNCATED_OFFSET_ERROR_TYPE", "PollInput", "PollResult", "PublishEntry", diff --git a/temporalio/contrib/workflow_streams/_stream.py b/temporalio/contrib/workflow_streams/_stream.py index ff0865c29..e1ebda15b 100644 --- a/temporalio/contrib/workflow_streams/_stream.py +++ b/temporalio/contrib/workflow_streams/_stream.py @@ -57,8 +57,15 @@ does not have to copy the name. """ +POLL_UPDATE_NAME = "__temporal_workflow_stream_poll" +"""The update :class:`WorkflowStream` registers for long polls. + +Public so code that drives the poll itself, with its own retry and +cancellation rules, does not have to copy the name. +""" + _PUBLISH_SIGNAL = PUBLISH_SIGNAL_NAME -_POLL_UPDATE = "__temporal_workflow_stream_poll" +_POLL_UPDATE = POLL_UPDATE_NAME _OFFSET_QUERY = "__temporal_workflow_stream_offset" _MAX_POLL_RESPONSE_BYTES = 1_000_000 diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index cef1cbe3e..af297899b 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -32,6 +32,7 @@ from __future__ import annotations +import asyncio import base64 import logging from collections.abc import AsyncGenerator @@ -48,10 +49,17 @@ WorkflowHandle, WorkflowHistoryEventFilterType, WorkflowQueryFailedError, + WorkflowUpdateFailedError, + WorkflowUpdateRPCTimeoutOrCancelledError, + WorkflowUpdateStage, ) -from temporalio.common import RawValue from temporalio.contrib.workflow_streams import ( + POLL_UPDATE_NAME, PUBLISH_SIGNAL_NAME, + STREAM_DRAINING_ERROR_TYPE, + TRUNCATED_OFFSET_ERROR_TYPE, + PollInput, + PollResult, PublishEntry, PublishInput, WorkflowStream, @@ -81,6 +89,9 @@ _PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" _ENCODING = b"binary/plain" +# The server's failure type for an accepted Update whose run closed before +# answering it: the poll's way of saying the run is over. +_UPDATE_OUTLIVED_RUN = "AcceptedUpdateCompletedWorkflow" logger = logging.getLogger(__name__) @@ -452,33 +463,14 @@ async def _read( while True: handle = self._handle(run_id) next_offset = offset - # Pinned to one run, with no client for the shipped chain - # following: a log is not carried across continue-as-new, so - # the successor's offsets start over and this loop is what - # moves from one run to the next. - subscription = WorkflowStreamClient(handle).subscribe( - topic, - from_offset=offset, - result_type=RawValue, - poll_cooldown=self._poll_cooldown, - ) + polls = self._poll(handle, topic, offset) try: - async for item in subscription: - next_offset = item.offset + 1 - if item.topic != topic: - continue - for record in self._records( - decoder, run_id, item.offset, item.data.payload - ): + async for item_offset, payload in polls: + next_offset = item_offset + 1 + for record in self._records(decoder, run_id, item_offset, payload): yield record - except RPCError as error: - # The run closed and its poll Update went with it, or the - # workflow does not exist; the describe below tells which. - if error.status != RPCStatusCode.NOT_FOUND: - raise finally: - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() + await polls.aclose() status = await self._status(handle) if status is None: raise StreamNotFoundError( @@ -508,6 +500,64 @@ async def _read( return run_id, offset = successor, 0 + async def _poll( + self, handle: WorkflowHandle[Any, Any], topic: str, offset: int + ) -> AsyncGenerator[tuple[int, Payload], None]: + """Drive the shipped poll Update on one run until that run closes. + + Written here rather than through ``WorkflowStreamClient.subscribe`` + for two reasons. That loop swallows a cancellation of the caller's + task, so a consumer's ``asyncio.timeout`` or task cancel around a read + would end the subscription and let the read resubscribe forever; here + the cancellation leaves ``read()`` as what it was. And it follows + continue-as-new with offsets this provider does not carry across + runs, which is the outer loop's job. + """ + cooldown = self._poll_cooldown.total_seconds() + while True: + try: + update = await handle.start_update( + POLL_UPDATE_NAME, + PollInput(topics=[topic], from_offset=offset), + wait_for_stage=WorkflowUpdateStage.ACCEPTED, + result_type=PollResult, + ) + result = await update.result() + except WorkflowUpdateRPCTimeoutOrCancelledError as error: + if isinstance(error.__cause__, asyncio.CancelledError): + # The SDK wraps a cancelled await in this error; the + # consumer cancelled us, so that is what comes out. + raise asyncio.CancelledError() from error + # The RPC itself timed out while the run is still open. + continue + except WorkflowUpdateFailedError as error: + cause = getattr(error.cause, "type", None) + if cause == TRUNCATED_OFFSET_ERROR_TYPE: + # The log was truncated past this position; zero means + # from whatever the run still retains. + offset = 0 + continue + if cause == STREAM_DRAINING_ERROR_TYPE: + # Pollers are detached because the run is closing; the + # next attempt learns how it closed. + await asyncio.sleep(cooldown) + continue + if cause == _UPDATE_OUTLIVED_RUN: + return + raise + except RPCError as error: + # The run closed and its poll Update went with it, or the + # workflow does not exist; the caller describes to tell which. + if error.status != RPCStatusCode.NOT_FOUND: + raise + return + for item in result.items: + if item.topic == topic: + yield item.offset, Payload.FromString(base64.b64decode(item.data)) + offset = result.next_offset + if not result.more_ready and cooldown > 0: + await asyncio.sleep(cooldown) + def _records( self, decoder: RecordDecoder, run_id: str, offset: int, payload: Payload ) -> list[StreamRecord[Any]]: diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 28f2f631d..186de9094 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -209,6 +209,39 @@ async def read_everything() -> list[Any]: assert again[1].kind is RecordKind.FINISH +async def test_a_bounded_read_is_cancelled_within_its_timeout( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, plugins=[provider]) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_forever() -> None: + async for _ in stream.read(topic=DECISIONS, result_type=dict): + pass + + # The run is open and nothing is published, so the read parks on the + # poll Update. The bound has to come out as a timeout rather than + # vanish into a resubscribe. + started = asyncio.get_running_loop().time() + with pytest.raises(asyncio.TimeoutError): + await asyncio.wait_for(read_forever(), timeout=1) + assert asyncio.get_running_loop().time() - started < 10 + # A reader task cancelled outright ends the same way. + task = asyncio.create_task(read_forever()) + await asyncio.sleep(0.2) + task.cancel() + with pytest.raises(asyncio.CancelledError): + await task + + await stream.producer(topic=INPUTS, producer_id="model", attempt=1).finish() + await handle.signal(EchoLoop.release) + assert await handle.result() == 0 + + @workflow.defn class Relay: """Publishes one record per run and continues as new once.""" From 1842f6ea0d7a278fce706df5133532492276af14 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:27:51 -0700 Subject: [PATCH 473/831] Registered the Workflow Streams conformance provider on the client. --- tests/streams/test_streams_conformance.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 630814c7f..86d14373d 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -115,8 +115,13 @@ async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: # No STREAMS_LIVE gate: the store is the workflow's own History, which the # test environment's server provides. provider = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + # Registered once, on the client: the host's worker inherits it and the + # cases open handles through client.get_stream_handle. + config = client.config() + config["plugins"] = [provider] + client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost, plugins=[provider]) as worker: + async with new_worker(client, StreamHost) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: From 93431633ed4b1ece4e20d0bebe124afa47dfac98 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 474/831] Pinned Core to the stream revision and regenerated bridge protos. --- .gitmodules | 2 +- .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 613 ++++++-------- .../workflow_activation_pb2.pyi | 68 ++ .../workflow_commands_pb2.py | 800 +++++++----------- .../workflow_commands_pb2.pyi | 90 ++ temporalio/bridge/sdk-core | 2 +- 7 files changed, 737 insertions(+), 840 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..ae7639820 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamMessages, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamMessages", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..0e1b3a1e6 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,430 +2,311 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" - from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.update.v1 import ( - message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, -) -from temporalio.bridge.proto.activity_result import ( - activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' -) - - -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ - "HeadersEntry" -] -_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStart" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartSuccess" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartFailure" -] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecutionStartCancelled" -] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ResolveChildWorkflowExecution" -] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveSignalExternalWorkflow" -] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ - "ResolveRequestCancelExternalWorkflow" -] -_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ - "ResolveNexusOperationStart" -] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] -WorkflowActivation = _reflection.GeneratedProtocolMessageType( - "WorkflowActivation", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }, -) + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] +_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] +_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] +WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( - "WorkflowActivationJob", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }, -) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }) _sym_db.RegisterMessage(WorkflowActivationJob) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType( - "InitializeWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _INITIALIZEWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }, -) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }) +_sym_db.RegisterMessage(DeliverStreamMessages) + +InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _INITIALIZEWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType( - "FireTimer", - (_message.Message,), - { - "DESCRIPTOR": _FIRETIMER, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }, -) +FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { + 'DESCRIPTOR' : _FIRETIMER, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType( - "ResolveActivity", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEACTIVITY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }, -) +ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }, -) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartSuccess", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }, -) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartFailure", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }, -) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecutionStartCancelled", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }, -) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ResolveChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }, -) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( - "UpdateRandomSeed", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERANDOMSEED, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }, -) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERANDOMSEED, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType( - "QueryWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _QUERYWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }, -) +QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _QUERYWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }, -) +CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType( - "SignalWorkflow", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }, -) +SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType( - "NotifyHasPatch", - (_message.Message,), - { - "DESCRIPTOR": _NOTIFYHASPATCH, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }, -) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { + 'DESCRIPTOR' : _NOTIFYHASPATCH, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveSignalExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }, -) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( - "ResolveRequestCancelExternalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }, -) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType( - "DoUpdate", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }, - ), - "DESCRIPTOR": _DOUPDATE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }, -) +DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }) + , + 'DESCRIPTOR' : _DOUPDATE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperationStart", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }, -) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( - "ResolveNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _RESOLVENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }, -) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType( - "RemoveFromCache", - (_message.Message,), - { - "DESCRIPTOR": _REMOVEFROMCACHE, - "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }, -) +RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { + 'DESCRIPTOR' : _REMOVEFROMCACHE, + '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" - ) - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' + _WORKFLOWACTIVATION._serialized_start=570 + _WORKFLOWACTIVATION._serialized_end=1116 + _WORKFLOWACTIVATIONJOB._serialized_start=1119 + _WORKFLOWACTIVATIONJOB._serialized_end=2582 + _DELIVERSTREAMMESSAGES._serialized_start=2585 + _DELIVERSTREAMMESSAGES._serialized_end=2724 + _INITIALIZEWORKFLOW._serialized_start=2727 + _INITIALIZEWORKFLOW._serialized_end=4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 + _FIRETIMER._serialized_start=4133 + _FIRETIMER._serialized_end=4157 + _RESOLVEACTIVITY._serialized_start=4159 + _RESOLVEACTIVITY._serialized_end=4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 + _UPDATERANDOMSEED._serialized_start=5045 + _UPDATERANDOMSEED._serialized_end=5088 + _QUERYWORKFLOW._serialized_start=5091 + _QUERYWORKFLOW._serialized_end=5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 + _CANCELWORKFLOW._serialized_start=5353 + _CANCELWORKFLOW._serialized_end=5385 + _SIGNALWORKFLOW._serialized_start=5388 + _SIGNALWORKFLOW._serialized_end=5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 + _NOTIFYHASPATCH._serialized_start=5679 + _NOTIFYHASPATCH._serialized_end=5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 + _DOUPDATE._serialized_start=5917 + _DOUPDATE._serialized_end=6248 + _DOUPDATE_HEADERSENTRY._serialized_start=4052 + _DOUPDATE_HEADERSENTRY._serialized_end=4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 + _RESOLVENEXUSOPERATION._serialized_start=6407 + _RESOLVENEXUSOPERATION._serialized_end=6496 + _REMOVEFROMCACHE._serialized_start=6499 + _REMOVEFROMCACHE._serialized_end=6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..eab815fc9 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.update.v1.message_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_messages(self) -> global___DeliverStreamMessages: + """A range of a stream the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +327,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_messages: global___DeliverStreamMessages | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +335,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -368,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_messages", + b"deliver_stream_messages", "do_update", b"do_update", "fire_timer", @@ -421,6 +431,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_messages", "remove_from_cache", ] | None @@ -1440,6 +1451,63 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0cdc02c6b..ccfa1a016 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,552 +2,408 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" - +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper - # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 +from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 +from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 +from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 +from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 +from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 + -from temporalio.api.common.v1 import ( - message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, -) -from temporalio.api.enums.v1 import ( - workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, -) -from temporalio.api.failure.v1 import ( - message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, -) -from temporalio.api.sdk.v1 import ( - event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, -) -from temporalio.api.sdk.v1 import ( - user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, -) -from temporalio.bridge.proto.child_workflow import ( - child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, -) -from temporalio.bridge.proto.common import ( - common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, -) -from temporalio.bridge.proto.nexus import ( - nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, -) - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' -) - -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] -_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ - "HeadersEntry" -] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ - "RequestCancelLocalActivity" -] -_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CompleteWorkflowExecution" -] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "ContinueAsNewWorkflowExecution" -] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( - _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "StartChildWorkflowExecution" -] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( - _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] -) -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "CancelChildWorkflowExecution" -] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "RequestCancelExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ - "SignalExternalWorkflowExecution" -] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( - _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] -) -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ - "UpsertWorkflowSearchAttributes" -] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ - "NexusHeaderEntry" -] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ - "RequestCancelNexusOperation" -] -WorkflowCommand = _reflection.GeneratedProtocolMessageType( - "WorkflowCommand", - (_message.Message,), - { - "DESCRIPTOR": _WORKFLOWCOMMAND, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }, -) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] +_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] +_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] +_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] +WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { + 'DESCRIPTOR' : _WORKFLOWCOMMAND, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }) _sym_db.RegisterMessage(WorkflowCommand) -StartTimer = _reflection.GeneratedProtocolMessageType( - "StartTimer", - (_message.Message,), - { - "DESCRIPTOR": _STARTTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }, -) +AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { + 'DESCRIPTOR' : _ADDSTREAMMESSAGES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }) +_sym_db.RegisterMessage(AddStreamMessages) + +SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTREAM, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }) +_sym_db.RegisterMessage(SubscribeStream) + +StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { + 'DESCRIPTOR' : _STARTTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType( - "CancelTimer", - (_message.Message,), - { - "DESCRIPTOR": _CANCELTIMER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }, -) +CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { + 'DESCRIPTOR' : _CANCELTIMER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULEACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }, -) +ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULEACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( - "ScheduleLocalActivity", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }, - ), - "DESCRIPTOR": _SCHEDULELOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }, -) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }, -) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( - "RequestCancelLocalActivity", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }, -) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType( - "QueryResult", - (_message.Message,), - { - "DESCRIPTOR": _QUERYRESULT, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }, -) +QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { + 'DESCRIPTOR' : _QUERYRESULT, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType( - "QuerySuccess", - (_message.Message,), - { - "DESCRIPTOR": _QUERYSUCCESS, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }, -) +QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { + 'DESCRIPTOR' : _QUERYSUCCESS, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CompleteWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }, -) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "FailWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _FAILWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }, -) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "ContinueAsNewWorkflowExecution", - (_message.Message,), - { - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }, - ), - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }, -) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }) + , + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }, -) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType( - "SetPatchMarker", - (_message.Message,), - { - "DESCRIPTOR": _SETPATCHMARKER, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }, -) +SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { + 'DESCRIPTOR' : _SETPATCHMARKER, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "StartChildWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }, - ), - "MemoEntry": _reflection.GeneratedProtocolMessageType( - "MemoEntry", - (_message.Message,), - { - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }, - ), - "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }, -) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }) + , + + 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }) + , + 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "CancelChildWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }, -) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "RequestCancelExternalWorkflowExecution", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }, -) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( - "SignalExternalWorkflowExecution", - (_message.Message,), - { - "HeadersEntry": _reflection.GeneratedProtocolMessageType( - "HeadersEntry", - (_message.Message,), - { - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }, - ), - "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }, -) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { + + 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }) + , + 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( - "CancelSignalWorkflow", - (_message.Message,), - { - "DESCRIPTOR": _CANCELSIGNALWORKFLOW, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }, -) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { + 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( - "UpsertWorkflowSearchAttributes", - (_message.Message,), - { - "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }, -) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { + 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( - "ModifyWorkflowProperties", - (_message.Message,), - { - "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }, -) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { + 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType( - "UpdateResponse", - (_message.Message,), - { - "DESCRIPTOR": _UPDATERESPONSE, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }, -) +UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPDATERESPONSE, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( - "ScheduleNexusOperation", - (_message.Message,), - { - "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( - "NexusHeaderEntry", - (_message.Message,), - { - "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }, - ), - "DESCRIPTOR": _SCHEDULENEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }, -) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { + + 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }) + , + 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( - "RequestCancelNexusOperation", - (_message.Message,), - { - "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }, -) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, + '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = ( - b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" - ) - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8672 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8760 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4339 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4341 - _REQUESTCANCELACTIVITY._serialized_end = 4377 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4379 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4420 - _QUERYRESULT._serialized_start = 4423 - _QUERYRESULT._serialized_end = 4579 - _QUERYSUCCESS._serialized_start = 4581 - _QUERYSUCCESS._serialized_end = 4646 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4648 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4724 - _FAILWORKFLOWEXECUTION._serialized_start = 4726 - _FAILWORKFLOWEXECUTION._serialized_end = 4800 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4803 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5717 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5719 - _CANCELWORKFLOWEXECUTION._serialized_end = 5795 - _SETPATCHMARKER._serialized_start = 5797 - _SETPATCHMARKER._serialized_end = 5851 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5854 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7028 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7030 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7104 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7107 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7249 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7252 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7651 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7653 - _CANCELSIGNALWORKFLOW._serialized_end = 7688 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7690 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7791 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7793 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7872 - _UPDATERESPONSE._serialized_start = 7875 - _UPDATERESPONSE._serialized_end = 8085 - _SCHEDULENEXUSOPERATION._serialized_start = 8088 - _SCHEDULENEXUSOPERATION._serialized_end = 8626 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8576 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8626 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8628 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8670 + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' + _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 + _WORKFLOWCOMMAND._serialized_start=556 + _WORKFLOWCOMMAND._serialized_end=2794 + _ADDSTREAMMESSAGES._serialized_start=2796 + _ADDSTREAMMESSAGES._serialized_end=2891 + _SUBSCRIBESTREAM._serialized_start=2893 + _SUBSCRIBESTREAM._serialized_end=2951 + _STARTTIMER._serialized_start=2953 + _STARTTIMER._serialized_end=3036 + _CANCELTIMER._serialized_start=3038 + _CANCELTIMER._serialized_end=3064 + _SCHEDULEACTIVITY._serialized_start=3067 + _SCHEDULEACTIVITY._serialized_end=3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 + _SCHEDULELOCALACTIVITY._serialized_start=3894 + _SCHEDULELOCALACTIVITY._serialized_end=4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 + _REQUESTCANCELACTIVITY._serialized_start=4646 + _REQUESTCANCELACTIVITY._serialized_end=4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 + _QUERYRESULT._serialized_start=4728 + _QUERYRESULT._serialized_end=4884 + _QUERYSUCCESS._serialized_start=4886 + _QUERYSUCCESS._serialized_end=4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 + _FAILWORKFLOWEXECUTION._serialized_start=5031 + _FAILWORKFLOWEXECUTION._serialized_end=5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELWORKFLOWEXECUTION._serialized_start=6024 + _CANCELWORKFLOWEXECUTION._serialized_end=6100 + _SETPATCHMARKER._serialized_start=6102 + _SETPATCHMARKER._serialized_end=6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 + _CANCELSIGNALWORKFLOW._serialized_start=7958 + _CANCELSIGNALWORKFLOW._serialized_end=7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 + _UPDATERESPONSE._serialized_start=8180 + _UPDATERESPONSE._serialized_end=8390 + _SCHEDULENEXUSOPERATION._serialized_start=8393 + _SCHEDULENEXUSOPERATION._serialized_end=8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index ad4a5f487..040a2267c 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,6 +23,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,10 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: ... + @property + def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( self, *, @@ -215,6 +222,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + add_stream_messages: global___AddStreamMessages | None = ..., ) -> None: ... def HasField( self, @@ -243,6 +252,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -298,6 +311,10 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", + "subscribe_stream", + b"subscribe_stream", + "add_stream_messages", + b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -350,6 +367,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "add_stream_messages", ] | None ): ... @@ -386,6 +405,77 @@ class StartTimer(google.protobuf.message.Message): global___StartTimer = StartTimer +class AddStreamMessages(google.protobuf.message.Message): + """Publish a batch of messages to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand messages cost the same in History as one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", b"messages", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AddStreamMessages = AddStreamMessages + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 85b71d7ec..3d1f82e66 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 85b71d7ecd4f2bf677fa1cee17f3fbc1ab10f1b9 +Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 From b4a5c9a07ab0de031f13d6d8ebc69ceca244f27d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 475/831] Added the vendored stream API protos. --- scripts/gen_stream_protos.py | 161 +++++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 138 ++++ .../api/streamservice/v1/message_pb2.py | 46 ++ .../api/streamservice/v1/message_pb2.pyi | 47 ++ .../api/streamservice/v1/message_pb2_grpc.py | 24 + .../streamservice/v1/request_response_pb2.py | 138 ++++ .../streamservice/v1/request_response_pb2.pyi | 434 ++++++++++++ .../v1/request_response_pb2_grpc.py | 24 + .../api/streamservice/v1/service_pb2.py | 38 ++ .../api/streamservice/v1/service_pb2.pyi | 5 + .../api/streamservice/v1/service_pb2_grpc.py | 616 ++++++++++++++++++ .../api/streamservice/v1/stream_state_pb2.py | 56 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 114 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 24 + 15 files changed, 1865 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..e66f8abb4 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,161 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, "-m", "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--pyi_out={out}", + f"--grpc_python_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..31f99bded --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,138 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + STREAM_MESSAGE_KIND_DATA, + STREAM_MESSAGE_KIND_FLUSH, + STREAM_MESSAGE_KIND_UNSPECIFIED, + StreamMessage, + StreamMessageBatch, + StreamMessageKind, +) + +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "STREAM_MESSAGE_KIND_DATA", + "STREAM_MESSAGE_KIND_FLUSH", + "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamLifecycle", + "StreamListEntry", + "StreamMessage", + "StreamMessageBatch", + "StreamMessageKind", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..b4fe8e68a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/message.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/message.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>Z None: ... + BODY_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + body: _message_pb2.Payload + metadata: _containers.MessageMap[str, _message_pb2.Payload] + topic: str + topic_sequence: int + kind: StreamMessageKind + offset: int + def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... + +class StreamMessageBatch(_message.Message): + __slots__ = ("messages",) + MESSAGES_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] + def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..b1383816d --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..60dafee45 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/request_response.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/request_response.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 +from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... + +class CreateStreamOutput(_message.Message): + __slots__ = ("run_id",) + RUN_ID_FIELD_NUMBER: _ClassVar[int] + run_id: str + def __init__(self, run_id: _Optional[str] = ...) -> None: ... + +class AddMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + expected_offset: int + use_expected_offset: bool + owner_epoch: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... + +class AddMessagesOutput(_message.Message): + __slots__ = ("first_offset", "next_offset", "count", "deduplicated") + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] + first_offset: int + next_offset: int + count: int + deduplicated: bool + def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... + +class FinishWritingInput(_message.Message): + __slots__ = ("namespace", "stream_id", "producer_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + producer_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... + +class FinishWritingOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SubscribeWorkflowInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + stream_id: str + start_offset: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... + +class SubscribeWorkflowOutput(_message.Message): + __slots__ = ("start_offset",) + START_OFFSET_FIELD_NUMBER: _ClassVar[int] + start_offset: int + def __init__(self, start_offset: _Optional[int] = ...) -> None: ... + +class PollMessagesInput(_message.Message): + __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + run_id: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class PollMessagesOutput(_message.Message): + __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") + MESSAGES_FIELD_NUMBER: _ClassVar[int] + NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + next_offset: int + head_offset: int + closed: bool + close_reason: _message_pb2_1.Payload + def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class DescribeStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class PollWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] + MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] + TOPICS_FIELD_NUMBER: _ClassVar[int] + WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + from_offset: int + max_messages: int + topics: _containers.RepeatedScalarFieldContainer[str] + wait_new_messages: bool + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... + +class DescribeWorkflowStreamInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... + +class AddWorkflowMessagesInput(_message.Message): + __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + STREAM_NAME_FIELD_NUMBER: _ClassVar[int] + MESSAGES_FIELD_NUMBER: _ClassVar[int] + PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + namespace: str + workflow_id: str + stream_name: str + messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] + producer_id: str + sequence: int + def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... + +class DescribeStreamOutput(_message.Message): + __slots__ = ("state",) + STATE_FIELD_NUMBER: _ClassVar[int] + state: _stream_state_pb2.StreamState + def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... + +class CloseStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "reason") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + reason: _message_pb2_1.Payload + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... + +class CloseStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TruncateStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id", "new_base_offset") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + new_base_offset: int + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... + +class TruncateStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteStreamInput(_message.Message): + __slots__ = ("namespace", "stream_id") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + namespace: str + stream_id: str + def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... + +class DeleteStreamOutput(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class CreateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CreateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... + +class CreateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CreateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... + +class AddMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... + +class AddMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class FinishWritingRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: FinishWritingInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... + +class FinishWritingResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: FinishWritingOutput + def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: SubscribeWorkflowInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... + +class SubscribeWorkflowResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: SubscribeWorkflowOutput + def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... + +class PollMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... + +class PollMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: PollWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class PollWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: PollMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DescribeWorkflowStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... + +class DescribeWorkflowStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DescribeStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: AddWorkflowMessagesInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... + +class AddWorkflowMessagesResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: AddMessagesOutput + def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... + +class CloseStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: CloseStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... + +class CloseStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: CloseStreamOutput + def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... + +class TruncateStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: TruncateStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... + +class TruncateStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: TruncateStreamOutput + def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... + +class ListStreamsInput(_message.Message): + __slots__ = ("namespace", "page_size", "next_page_token", "query") + NAMESPACE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + namespace: str + page_size: int + next_page_token: bytes + query: str + def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... + +class StreamListEntry(_message.Message): + __slots__ = ("stream_id", "run_id") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + stream_id: str + run_id: str + def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... + +class ListStreamsOutput(_message.Message): + __slots__ = ("streams", "next_page_token") + STREAMS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] + next_page_token: bytes + def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... + +class ListStreamsRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: ListStreamsInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... + +class ListStreamsResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: ListStreamsOutput + def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... + +class DeleteStreamRequest(_message.Message): + __slots__ = ("namespace_id", "frontend_request") + NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] + FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] + namespace_id: str + frontend_request: DeleteStreamInput + def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... + +class DeleteStreamResponse(_message.Message): + __slots__ = ("frontend_response",) + FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] + frontend_response: DeleteStreamOutput + def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..87cc91022 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..7f376c28e --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/service.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/service.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xf3\x0f\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class StreamServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + _registered_method=True) + self.AddMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + _registered_method=True) + self.FinishWriting = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + _registered_method=True) + self.SubscribeWorkflow = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + _registered_method=True) + self.PollMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + _registered_method=True) + self.DescribeStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + _registered_method=True) + self.PollWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + _registered_method=True) + self.DescribeWorkflowStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + _registered_method=True) + self.AddWorkflowMessages = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + _registered_method=True) + self.CloseStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + _registered_method=True) + self.TruncateStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + _registered_method=True) + self.ListStreams = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + _registered_method=True) + self.DeleteStream = channel.unary_unary( + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + _registered_method=True) + + +class StreamServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def CreateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinishWriting(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubscribeWorkflow(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PollWorkflowMessages(self, request, context): + """Routed on the owner, because the stream it reads has no id of its own. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DescribeWorkflowStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkflowMessages(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CloseStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def TruncateStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListStreams(self, request, context): + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteStream(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_StreamServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'CreateStream': grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + 'AddMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + 'FinishWriting': grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + 'PollMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + 'DescribeStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + 'CloseStream': grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + 'TruncateStream': grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + 'ListStreams': grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + 'DeleteStream': grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class StreamService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinishWriting(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubscribeWorkflow(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PollWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DescribeWorkflowStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkflowMessages(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CloseStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def TruncateStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListStreams(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteStream(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..234fa94d0 --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: temporalio/api/stream/v1/stream_state.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'temporalio/api/stream/v1/stream_state.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z None: ... + class ConsumersEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ConsumerCursor + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... + HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] + BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] + LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSED_FIELD_NUMBER: _ClassVar[int] + CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] + OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + PRODUCERS_FIELD_NUMBER: _ClassVar[int] + CONSUMERS_FIELD_NUMBER: _ClassVar[int] + LIFECYCLE_FIELD_NUMBER: _ClassVar[int] + REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] + CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] + head_offset: int + base_offset: int + last_txn_id: int + closed: bool + close_reason: _message_pb2.Payload + owner_epoch: int + bucket_size: int + collection_id: str + producers: _containers.MessageMap[str, ProducerCursor] + consumers: _containers.MessageMap[str, ConsumerCursor] + lifecycle: StreamLifecycle + redirect_run_id: str + close_time: _timestamp_pb2.Timestamp + def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProducerCursor(_message.Message): + __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") + SEQ_FIELD_NUMBER: _ClassVar[int] + FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] + FENCED_FIELD_NUMBER: _ClassVar[int] + seq: int + first_offset: int + count: int + content_hash: bytes + fenced: bool + def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... + +class ConsumerCursor(_message.Message): + __slots__ = ("workflow_id", "run_id", "offset", "active", "external") + WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] + RUN_ID_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + ACTIVE_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + workflow_id: str + run_id: str + offset: int + active: bool + external: bool + def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... + +class WorkflowStreamCursor(_message.Message): + __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") + STREAM_ID_FIELD_NUMBER: _ClassVar[int] + COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] + BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] + OFFSET_FIELD_NUMBER: _ClassVar[int] + KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] + EXTERNAL_FIELD_NUMBER: _ClassVar[int] + PENDING_FROM_FIELD_NUMBER: _ClassVar[int] + PENDING_TO_FIELD_NUMBER: _ClassVar[int] + HAS_PENDING_FIELD_NUMBER: _ClassVar[int] + stream_id: str + collection_id: str + bucket_size: int + offset: int + known_head: int + external: bool + pending_from: int + pending_to: int + has_pending: bool + def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... + +class StreamLifecycle(_message.Message): + __slots__ = ("retention", "max_items") + RETENTION_FIELD_NUMBER: _ClassVar[int] + MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] + retention: _duration_pb2.Duration + max_items: int + def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..4e128a2aa --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) From ac3ff229f0b14a68e88e776898b5ffa3dff39355 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 476/831] Added the stream client and the workflow stream surface. --- temporalio/client_stream.py | 476 +++++++++++++++++++++++ temporalio/worker/_workflow_instance.py | 142 +++++++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 119 ++++++ tests/test_client_stream.py | 128 ++++++ tests/worker/test_workflow_stream.py | 113 ++++++ tests/worker/test_workflow_stream_e2e.py | 244 ++++++++++++ 7 files changed, 1232 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py create mode 100644 tests/worker/test_workflow_stream.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..75388c9c9 --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,476 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` + instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, AsyncIterator, Optional, Sequence + +import google.protobuf.duration_pb2 + +import temporalio.api.common.v1 +import temporalio.api.streamservice.v1 as stream +from temporalio.api.streamservice.v1 import service_pb2_grpc + +__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] + + +@dataclass(frozen=True) +class Message: + """One item read from a stream. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back messages whose offsets are not contiguous. To resume at the + boundary of a whole read, checkpoint the ``next_offset`` that + :meth:`StreamHandle.read` returns instead. + """ + + data: bytes + topic: str = "" + offset: int = 0 + """Where this message sits in the whole stream. + + A topic filter leaves gaps, so a reader that resumes between messages has + to take this rather than count what it received. + """ + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. + """ + + messages: list[Message] + next_offset: int + head_offset: int + closed: bool + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + self._stub = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> "StreamClient": + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + try: + import grpc + except ImportError as err: + raise RuntimeError( + "temporalio.client_stream requires the grpc extra: " + "pip install 'temporalio[grpc]'" + ) from err + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: Optional[float] = None, + max_items: Optional[int] = None, + ) -> "StreamHandle": + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many messages remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await self._stub.CreateStream( + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ) + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> "StreamHandle": + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "" + ) -> "WorkflowStreamHandle": + """Open a stream a workflow publishes to. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.add_stream_messages`` writes to when it is given none. + + The stream is created by the workflow's first publish. Reading one that + does not exist yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when the + workflow publishes. + """ + return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + + +class StreamHandle: + """A handle to one stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append messages and return the offset the first one landed at. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice. Without them the append is at-least-once, which is + only the right trade when duplicates are harmless. + """ + response = await self._stub.AddMessages( + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, returning the messages and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + response = await self._stub.PollMessages( + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=offset, + topics=list(topics), + wait_new_messages=True, + ) + ) + ) + out = response.frontend_response + for msg in out.messages: + yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) + offset = out.next_offset + if out.closed and offset >= out.head_offset: + return + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await self._stub.FinishWriting( + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ) + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await self._stub.CloseStream( + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await self._stub.DescribeStream( + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ) + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow publishes to. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, stub: Any, namespace: str, workflow_id: str, name: str = "" + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + async def append( + self, + *messages: bytes, + topic: str = "", + producer_id: str = "", + sequence: int = 0, + ) -> int: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await self._stub.AddWorkflowMessages( + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + messages=[ + stream.StreamMessage( + body=temporalio.api.common.v1.Payload( + data=m, metadata={"encoding": b"binary/plain"} + ), + topic=topic, + kind=stream.STREAM_MESSAGE_KIND_DATA, + ) + for m in messages + ], + producer_id=producer_id, + sequence=sequence, + ) + ) + ) + return response.frontend_response.first_offset + + async def read( + self, + *, + from_offset: int = 0, + max_messages: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[Message], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( + out.next_offset + ) + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[Message]: + """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for msg in page.messages: + yield msg + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_messages: int = 0, + wait: bool = True, + ) -> "Page": + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + """ + response = await self._stub.PollWorkflowMessages( + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_messages, + topics=list(topics), + wait_new_messages=wait, + ) + ) + ) + out = response.frontend_response + return Page( + messages=[ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await self._stub.DescribeWorkflowStream( + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + stream_name=self._name, + ) + ) + ) + return response.frontend_response.state diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 26f796e57..66833dd8c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -272,6 +273,71 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# which would replay and re-issue the same rejected command forever, into an +# error the workflow author can see. +_MAX_STREAM_MESSAGES_PER_BATCH = 1000 + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self) -> None: + self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._waiters: list[asyncio.Future] = [] + + def extend( + self, + messages: Sequence[temporalio.api.stream.v1.StreamMessage], + from_offset: int = 0, + ) -> None: + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not messages: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-message field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + self._messages.extend( + temporalio.workflow.DeliveredStreamMessage( + body=message.body.data, + topic=message.topic, + offset=from_offset + index, + ) + for index, message in enumerate(messages) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: + taken, self._messages = self._messages, [] + return taken + + def put_back( + self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._messages[:0] = messages + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._messages) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -401,6 +467,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -616,6 +687,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_messages"): + self._apply_deliver_stream_messages(job.deliver_stream_messages) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1141,6 +1214,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_messages( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer() + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.messages, job.from_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1305,6 +1391,62 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. The + # server treats a repeat subscription to the same stream as a no-op. + self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: + if not messages: + raise ValueError("add_stream_messages needs at least one message") + if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " + f"got {len(messages)}" + ) + command = self._add_command() + command.add_stream_messages.stream_id = stream_id + for body in messages: + # The bodies ride the command and never enter History, so the event + # this produces stays the same size whatever is published here. + message = command.add_stream_messages.messages.add() + message.body.data = body + # Every other Temporal payload names its encoding, and the UI, the + # CLI and any codec server rely on that to decode what they read. + message.body.metadata["encoding"] = b"binary/plain" + message.topic = topic + + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: + return [ + m.body + for m in await self.workflow_read_stream_messages(stream_id, max_messages) + ] + + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[temporalio.workflow.DeliveredStreamMessage]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_messages and len(taken) > max_messages: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_messages:]) + taken = taken[:max_messages] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index f63135bf4..28e711d9b 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -95,6 +95,11 @@ upsert_search_attributes, uuid4, uuid7, + DeliveredStreamMessage, + read_stream, + read_stream_messages, + add_stream_messages, + subscribe_stream, wait_condition, ) from ._definition import ( @@ -233,6 +238,11 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamMessage", + "read_stream", + "read_stream_messages", + "add_stream_messages", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 25523836a..450051456 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -313,6 +313,24 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_add_stream_messages( + self, stream_id: str, messages: Sequence[bytes], topic: str + ) -> None: ... + + @abstractmethod + async def workflow_read_stream( + self, stream_id: str, max_messages: int + ) -> list[bytes]: ... + + @abstractmethod + async def workflow_read_stream_messages( + self, stream_id: str, max_messages: int + ) -> list[DeliveredStreamMessage]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -949,6 +967,107 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream` returns them. Safe to call again: the server treats + a second subscription to the same stream as a no-op, which is what makes + calling it on every replay harmless. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. + + Args: + stream_id: Stream to consume. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def add_stream_messages( + messages: Sequence[bytes], + *, + stream_id: str = "", + topic: str = "", +) -> None: + """Publish a batch of messages to a stream this workflow owns. + + Returns as soon as the command is issued. The bodies go to the stream's own + log rather than into History, which gets one fixed-size event naming the + offset range, so a batch of a thousand costs History the same as a batch of + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Batch where you can. The event is per call, and a workflow is bounded by the + history event count, so one call with a hundred messages leaves far more + room than a hundred calls with one. + + Args: + messages: Bodies to append, in order. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + topic: Optional topic, which readers can filter on. Offsets are still + assigned over the unfiltered stream. + """ + _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + + +@dataclass(frozen=True) +class DeliveredStreamMessage: + """One message a consuming workflow was given, with where it sat.""" + + body: bytes + topic: str + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_messages( + stream_id: str, *, max_messages: int = 0 +) -> list[DeliveredStreamMessage]: + """Read the next messages, keeping their topic and position. + + Same delivery as :func:`read_stream`. A reader that has to name where it + got to, filter a topic, or hand a position to something outside the + workflow needs more than the bodies. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_messages( + stream_id, max_messages + ) + + +async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: + """Read the next messages of a stream this workflow consumes. + + Waits until at least one message is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. + + Subscribe out of band with the stream client. This only reads what has + already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_messages: Most messages to return at once, or 0 for everything + available. + + Returns: + The message bodies, in stream order. + """ + return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..f7df3c7a7 --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,128 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import AsyncIterator + +import pytest + +from temporalio.client_stream import StreamClient, StreamHandle + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +@pytest.fixture +async def stream() -> AsyncIterator[StreamHandle]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + finally: + await client.close() + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + assert await stream.append(b"alpha", b"beta") == 0 + assert await stream.append(b"gamma") == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(b"alpha", b"beta", b"gamma") + + messages, next_offset = await stream.read() + assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + assert next_offset == 3 + + messages, next_offset = await stream.read(from_offset=1) + assert [m.data for m in messages] == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(b"alpha") + + messages, next_offset = await stream.read(from_offset=1) + assert messages == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same message twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(b"once", producer_id="p1", sequence=1) + retry = await stream.append(b"once", producer_id="p1", sequence=1) + assert first == retry == 0 + + messages, _ = await stream.read() + assert [m.data for m in messages] == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(b"tok", topic="tokens") + await stream.append(b"prog", topic="progress") + await stream.append(b"tok2", topic="tokens") + + messages, next_offset = await stream.read(topics=["tokens"]) + assert [m.data for m in messages] == [b"tok", b"tok2"] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for message in stream.follow(): + received.append(message.data) + + task = asyncio.create_task(follower()) + await stream.append(b"one") + await asyncio.sleep(0.2) + await stream.append(b"two") + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(b"one", b"two") + await stream.close() + + received = [m.data async for m in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(b"one", b"two") + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..944761cfa --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,113 @@ +"""In-workflow consumption of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering and the workflow-facing read directly, which is the part +this SDK owns; the delivery decision itself lives in the server and sdk-core. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.worker._workflow_instance import ( + _StreamBuffer, + _WorkflowInstanceImpl, +) + + +def message(body: bytes) -> api_stream.StreamMessage: + return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"one"), message(b"two")]) + + assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([message(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert [m.body.data for m in buffer.take()] == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([message(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert [m.body.data for m in buffer.take()] == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream``, so a test that reimplements + it proves nothing about the code that ships. + """ + + def __init__(self) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self.read_only_calls: list[str] = [] + + def _assert_not_read_only(self, action: str) -> None: + self.read_only_calls.append(action) + + +@pytest.mark.parametrize("max_messages", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: + stub = _ReadOnlyStub() + bodies = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b) for b in bodies]) + + got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + + assert got == bodies[:max_messages] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + + if len(stub._stream_buffers["s"]): + rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert got + rest == bodies + else: + assert got == bodies + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub() + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([message(b"a")]) + + await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..579327217 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,244 @@ +"""A workflow publishing to a stream it owns and reading its own messages back. + +Path A and Path C together, both from workflow code. Needs a Temporal server +built from the AI-198 branch, because neither the stream service nor the +commands exist on a released one: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest +from temporalio.api.enums.v1 import EventType + +from temporalio import workflow +from temporalio.client import Client +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +STREAM = "output" + +# Event type numbers rather than names: this SDK's api protos predate both +# events, so the attributes arrive as unknown fields and only the type is +# readable here. The server's own tests are where the offsets are asserted. +EVENT_STREAM_SUBSCRIBED = 61 +EVENT_STREAM_MESSAGES_ADDED = 62 + + +@workflow.defn +class PublishAndRead: + @workflow.run + async def run(self) -> list[str]: + # Published before subscribing, because a subscription resolves against + # the streams the workflow already owns and this is what creates one. + workflow.add_stream_messages( + [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + ) + workflow.add_stream_messages([b"delta"], stream_id=STREAM) + + workflow.subscribe_stream(STREAM, start_offset=0) + + received: list[str] = [] + while len(received) < 4: + for body in await workflow.read_stream(STREAM): + received.append(body.decode()) + return received + + +async def test_workflow_reads_back_what_it_published() -> None: + client = await Client.connect(TARGET or "") + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=wf_id, task_queue=task_queue + ), + timeout=60, + ) + + assert result == ["alpha", "beta", "gamma", "delta"] + + counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + + # Two calls carrying four messages, so two events: the event is per batch, + # which is what makes batching free. + assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class PublishOnSignal: + """Publishes a token per signal, which is the shape an agent turn has.""" + + def __init__(self) -> None: + self._pending: list[str] = [] + self._done = False + + @workflow.run + async def run(self) -> int: + published = 0 + while True: + await workflow.wait_condition(lambda: self._pending or self._done) + while self._pending: + workflow.add_stream_messages([self._pending.pop(0).encode()]) + published += 1 + if self._done: + return published + + @workflow.signal + async def emit(self, token: str) -> None: + self._pending.append(token) + + @workflow.signal + async def finish(self) -> None: + self._done = True + + +async def test_a_client_follows_what_a_workflow_publishes() -> None: + """The harness shape: the workflow writes, something outside it reads live. + + A stream a workflow owns has no id, so the reader addresses it by the + owner. It also attaches before the first publish, which is what a UI opening + on a session does. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "follow-tq-" + uuid.uuid4().hex[:8] + wf_id = "follow-wf-" + uuid.uuid4().hex[:8] + + tokens = [f"token-{i}" for i in range(5)] + received: list[str] = [] + + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishOnSignal], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + PublishOnSignal.run, id=wf_id, task_queue=task_queue + ) + + # Attached before anything is published, so the stream does not + # exist yet and the first poll has to park rather than fail. + reader = streams.workflow_stream(wf_id) + assert (await reader.describe()).head_offset == 0 + + async def follow() -> None: + async for message in reader.follow(): + received.append(message.data.decode()) + if len(received) == len(tokens): + return + + following = asyncio.ensure_future(follow()) + for token in tokens: + await handle.signal(PublishOnSignal.emit, token) + await asyncio.wait_for(following, timeout=60) + + await handle.signal(PublishOnSignal.finish) + assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) + finally: + await streams.close() + + assert received == tokens + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each `read_stream` that finds nothing + blocks, which ends a Workflow Task, so the run spans several. With the + cache on, every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for body in await workflow.read_stream(stream_id): + seen.append(body.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + Every other end-to-end test here disables it, so the sticky path was never + exercised. The server sends no replay slice for a sticky task, while the + sticky history still carries the previous task's consumed range, and the + two together used to fail every task after the first consumed range. + """ + from temporalio.client_stream import StreamClient + + client = await Client.connect(TARGET or "") + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, + task_queue=task_queue, + workflows=[ConsumeAcrossTasks], + # Left at the default deliberately. This is what the test is for. + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=wf_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append(*[t.encode() for t in batch]) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + # More than one Workflow Task ran, otherwise the test proves nothing. + completed = 0 + async for event in client.get_workflow_handle(wf_id).fetch_history_events(): + if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: + completed += 1 + assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + finally: + await streams.close() From 42589d80253b90a892e282faf7ea43855c59f436 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 14 Sep 2026 15:50:32 -0700 Subject: [PATCH 477/831] Added the Workflow Streams surface over a server-side stream. --- temporalio/contrib/server_streams/__init__.py | 397 ++++++++++++++++++ tests/contrib/test_server_streams.py | 154 +++++++ 2 files changed, 551 insertions(+) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..e831d763c --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,397 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per batch rather than a +Signal per batch. A consumer reads the log directly rather than long-polling an +Update, so there is no per-Workflow limit on how many can read at once, and a +closed Workflow stays readable until its stream's retention expires. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, Optional, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.converter import DataConverter, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still encoded. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + """ + + items: list["WorkflowStreamItem[bytes]"] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _encode(converter: PayloadConverter, value: Any) -> bytes: + """Serialize one value to a stream message body. + + The payload rather than the bare bytes, so the encoding metadata the + consumer needs to decode into a type travels with it. + + The codec chain is not applied. It cannot be applied here: a codec is async + and a Workflow publishing to a stream is not, so running one inside Workflow + code would be I/O on the Workflow thread. Regular payloads solve this in the + Worker, encoding on the way out and decoding on the way in, and a stream + needs the same plumbing before a codec can be honoured. + + It is not applied on the client path either, deliberately. Encoding one side + and not the other is worse than encoding neither: an Activity's messages + would reach a consuming Workflow as ciphertext it has no way to decode. + :func:`_reject_configured_codec` is what keeps that from happening quietly. + """ + payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] + return payload.SerializeToString() + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies bypass the codec chain, so proceeding would write payloads + this namespace expects to be encrypted in the clear, and would do it + silently. Raising is the only honest answer until the Worker-side plumbing + exists. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it. Publishing would store them " + "unencoded. Use a client without a codec, or wait for codec support " + "on streams." + ) + + +def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return converter.from_payloads([payload])[0] + return converter.from_payloads([payload], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns as soon as the Command is issued. There is nothing to await: + the append is applied in the Workflow Task's own commit, so it costs + this Workflow no round trip and no extra transition. + """ + workflow.add_stream_messages( + [_encode(workflow.payload_converter(), value)], topic=self._name + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic( + self, name: str, *, type: type = object + ) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`.""" + self._handle = handle + self._converter = converter + self._batch_interval = batch_interval + self._buffered: list[tuple[str, Any]] = [] + self._flusher: Optional[asyncio.Task[None]] = None + self._wake = asyncio.Event() + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> "WorkflowStreamClient": + """Open the stream owned by ``workflow_id``.""" + _reject_configured_codec(client) + return cls( + _stream_client(client).workflow_stream(workflow_id), + client.data_converter.payload_converter, + batch_interval, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> "WorkflowStreamClient": + """Open the stream owned by the Workflow that scheduled this Activity.""" + client = activity.client() + return cls.create( + client, activity.info().workflow_id, batch_interval=batch_interval + ) + + async def __aenter__(self) -> "WorkflowStreamClient": + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. + """ + if self._flusher is not None: + self._flusher.cancel() + try: + await self._flusher + except asyncio.CancelledError: + pass + self._flusher = None + await self.flush() + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: Optional[type] = None, + poll_cooldown: Optional[timedelta] = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + async for message in self._handle.follow(from_offset=from_offset, topics=topics): + yield WorkflowStreamItem( + topic=message.topic, + data=_decode(self._converter, message.data, result_type), + offset=message.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> "RawPage": + """One read, with the bodies left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) + for m in page.messages + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + # One append per topic, because a batch carries a single topic. The + # harness case is one topic, so this is one append. + by_topic: dict[str, list[bytes]] = {} + for topic, value in pending: + by_topic.setdefault(topic, []).append(_encode(self._converter, value)) + for topic, bodies in by_topic.items(): + await self._handle.append(*bodies, topic=topic) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while True: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + +# One channel per target, shared by every handle in the process. The channel is +# multiplexed and long-lived, and callers here open a client per subscription, +# which would otherwise be a connection per subscription. +_clients: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop too: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _clients.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _clients[key] = existing + return existing diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..33d86d827 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,154 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow( + Emitting.run, 3, id=wf_id, task_queue=task_queue + ) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] From 303461b1cb9cea3b722689ce192d11cfaac456a8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:57:03 -0700 Subject: [PATCH 478/831] Added the native provider module. --- temporalio/streams/providers/native.py | 398 +++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 temporalio/streams/providers/native.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..f5570b05a --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,398 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server. A workflow publishes with a command that +the server applies in the same transaction that accepts the workflow task, and +consumes ranges the server attaches to the workflow task it dispatches. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +from temporalio import activity, workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_RUN_STATE = "__temporal_streams_state" + + +class _Fanout: + """One server subscription, shared by every reader of that stream. + + The server sends a range once. Whoever reads it first would otherwise take + it from the others, so the pull happens here and the result goes to all + live readers. + """ + + def __init__(self, stream: str) -> None: + self._stream = stream + self._subscribers: list[list[tuple[Cursor, bytes]]] = [] + self._pull: asyncio.Future[None] | None = None + + def attach(self) -> list[tuple[Cursor, bytes]]: + queue: list[tuple[Cursor, bytes]] = [] + self._subscribers.append(queue) + return queue + + def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: + if queue in self._subscribers: + self._subscribers.remove(queue) + + async def next_batch( + self, queue: list[tuple[Cursor, bytes]] + ) -> list[tuple[Cursor, bytes]]: + while not queue: + pending = self._pull + if pending is None: + pending = self._pull = asyncio.ensure_future(self._run_pull()) + # Shielded because one reader going away must not cancel a range + # the server will not send again. + await asyncio.shield(pending) + batch, queue[:] = list(queue), [] + return batch + + async def _run_pull(self) -> None: + try: + delivered = await workflow.read_stream_messages(self._stream) + arrived = [ + (Cursor(str(message.offset)), message.body) for message in delivered + ] + for queue in self._subscribers: + queue.extend(arrived) + finally: + self._pull = None + + +def _fanouts() -> dict[str, _Fanout]: + instance = workflow.instance() + state = getattr(instance, _RUN_STATE, None) + if state is None: + state = {} + setattr(instance, _RUN_STATE, state) + return state + + +class _NativeReadSource: + def __init__(self, fanout: _Fanout) -> None: + self._fanout = fanout + self._queue = fanout.attach() + + async def next_batch(self) -> list[tuple[Cursor, bytes]]: + return await self._fanout.next_batch(self._queue) + + def close(self) -> None: + self._fanout.detach(self._queue) + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + async def publish(self, frame: bytes) -> None: + # Nothing is awaited. The server applies the payload when it accepts + # the task, so there is no back pressure to wait on and no round trip + # to pay for. The signature is awaitable because the contract allows a + # provider that does hold a publisher back. + workflow.add_stream_messages([frame], stream_id="", topic=self._topic) + + +def inbound_stream_id(workflow_id: str, stream: str) -> str: + """The server-side id of a workflow's inbound stream. + + A workflow names its streams relative to itself, so every provider can + address the same thing without workflow code knowing how it is stored. + Here that is a namespace-level stream id built from the pair, and the + workflow id rather than the run id because the stream has to survive + continue-as-new and reset. + """ + return f"{workflow_id}:{stream}" + + +def _reject_configured_codec(client: Client) -> None: + """Refuse a namespace whose payloads are meant to be encoded. + + Stream bodies do not pass through the codec chain on this provider, so + proceeding would store in the clear what the namespace expects encrypted, + and would do it without saying so. + """ + if client.data_converter.payload_codec is not None: + raise RuntimeError( + "this client has a payload codec configured, and server-side stream " + "bodies do not pass through it" + ) + + +# Streams this process has already opened, so a second producer for the same +# stream reuses the handle rather than asking the server to create it again. +# The second create is answered correctly, and it is still a failed call the +# server logs, which is noise an operator has to learn to ignore. +_handles: dict[str, Any] = {} + + +# One channel per target and namespace, shared by every handle in the process. +# A channel is multiplexed and long lived, and callers open a handle per +# subscription, which would otherwise be a connection per subscription. +_channels: dict[tuple[int, str, str], StreamClient] = {} + + +def _stream_client(client: Client) -> StreamClient: + target = client.service_client.config.target_host + # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. + key = (id(asyncio.get_event_loop()), target, client.namespace) + existing = _channels.get(key) + if existing is None: + existing = StreamClient.connect(target, client.namespace) + _channels[key] = existing + return existing + + +class NativeProducer: + """Appends to a stream from outside workflow code. + + Every append is visible as soon as it is written. That is the point for an + activity streaming model output, and it is why an activity carries its own + identity: the retry of a failed attempt has no commit boundary to sort it + out afterwards. + """ + + def __init__( + self, + handle: Any, + converter: Any, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + self._handle = handle + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _provider_id(self) -> str: + """The identity the provider dedupes on. + + The attempt is part of it. Deduplication answers "is this the same + append again", and a second attempt writing different words at the same + sequence is not. Folding the attempt in keeps a retried append idempotent + without letting a new generation be swallowed as a duplicate of the old + one. + """ + return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + + async def append(self, *values: Any) -> Cursor: + """Append values and return where the first one landed.""" + frames = [] + for value in values: + frames.append( + _frame.encode( + topic=self._topic, + kind=RecordKind.DATA, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=self._encode(value), + ) + ) + self._sequence += 1 + offset = await self._handle.append( + *frames, + topic=self._topic, + producer_id=self._provider_id, + # The provider dedupes a retried append on this pair, which is a + # different job from telling readers that a new generation started. + sequence=self._sequence - len(frames), + ) + return Cursor(str(offset)) + + async def finish(self) -> None: + """Declare this stream complete.""" + frame = _frame.encode( + topic=self._topic, + kind=RecordKind.FINISH, + producer=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + body=b"", + ) + self._sequence += 1 + await self._handle.append( + frame, + topic=self._topic, + producer_id=self._provider_id, + sequence=self._sequence - 1, + ) + + def _encode(self, value: Any) -> bytes: + payload = ( + value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + ) + return payload.SerializeToString() + + +class NativeConsumer: + """Reads a stream from outside workflow code, resumably.""" + + def __init__(self, handle: Any, converter: Any) -> None: + self._handle = handle + self._converter = converter + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records from ``start`` as they arrive. + + Applies the same supersession rule as a workflow reader, so a browser + and a workflow watching one activity agree on which attempt is current. + """ + attempts = AttemptTracker() + async for message in self._handle.follow( + from_offset=int(start.token) if start.token else 0 + ): + cursor = Cursor(str(message.offset)) + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + message.data + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + continue + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NativeProvider: + name = "native" + + def configure(self, **options: Any) -> None: + """Nothing to name: the streams are on the server the client is + already connected to. It exists so a process that switches providers + changes one call rather than its structure.""" + if options: + raise TypeError( + f"the native provider takes no options, got {sorted(options)}" + ) + + def worker_options(self) -> dict[str, Any]: + return {} + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + # Accepted and ignored. Delivery arrives on workflow tasks the server + # dispatches, so no worker is held between records and there is nothing + # for an idle timeout to release. + del idle_timeout + stream_id = inbound_stream_id(workflow.info().workflow_id, stream) + fanouts = _fanouts() + fanout = fanouts.get(stream_id) + if fanout is None: + workflow.subscribe_stream( + stream_id, start_offset=int(start.token) if start.token else 0 + ) + fanout = fanouts[stream_id] = _Fanout(stream_id) + return _NativeReadSource(fanout) + + def open_write(self, topic: str) -> WriteSink: + return _NativeWriteSink(topic) + + async def producer( + self, + client: Client, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer: + """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer and are what let a + reader tell a retry from a new generation. + """ + _reject_configured_codec(client) + if not producer_id: + producer_id = activity.info().activity_id + if not attempt: + attempt = activity.info().attempt + streams = _stream_client(client) + stream_id = inbound_stream_id(workflow_id, stream) + handle = _handles.get(stream_id) + if handle is None: + try: + handle = await streams.create(stream_id) + except Exception: + # Created by whoever set the stream up. A producer opening a + # stream it does not own is the ordinary case, not the + # exception. + handle = streams.get(stream_id) + _handles[stream_id] = handle + return NativeProducer( + handle, + client.data_converter.payload_converter, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Client, *, workflow_id: str, stream: str = "" + ) -> NativeConsumer: + """Open a reader for what ``workflow_id`` publishes. + + An empty ``stream`` reads what the workflow wrote through + :func:`temporalio.streams.writer`. Naming one reads that inbound + stream instead, which is how a second consumer follows the same input. + """ + _reject_configured_codec(client) + streams = _stream_client(client) + if stream: + handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + else: + handle = streams.workflow_stream(workflow_id) + return NativeConsumer(handle, client.data_converter.payload_converter) + + +_provider.register("native", _NativeProvider) From 372974dfca00f08d1e35313bfa1ee605e1f99328 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 479/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/native.py | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f5570b05a..c0044b9cf 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -255,18 +255,18 @@ def __init__(self, handle: Any, converter: Any) -> None: async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: - """Yield records from ``start`` as they arrive. + """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ attempts = AttemptTracker() async for message in self._handle.follow( - from_offset=int(start.token) if start.token else 0 + from_offset=int(after.token) + 1 if after.token else 0 ): cursor = Cursor(str(message.offset)) try: @@ -290,6 +290,16 @@ async def read( sequence=sequence, ) + async def latest(self, *, topic: str | None = None) -> Cursor: + del topic # one server-side log per stream, whatever the topic + try: + state = await self._handle.describe() + except Exception: + # A stream nobody has published to does not exist yet, and that + # is the same answer as an empty one. + return BEGINNING + return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -317,7 +327,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: # Accepted and ignored. Delivery arrives on workflow tasks the server @@ -329,7 +339,7 @@ def open_read( fanout = fanouts.get(stream_id) if fanout is None: workflow.subscribe_stream( - stream_id, start_offset=int(start.token) if start.token else 0 + stream_id, start_offset=int(after.token) + 1 if after.token else 0 ) fanout = fanouts[stream_id] = _Fanout(stream_id) return _NativeReadSource(fanout) @@ -342,15 +352,18 @@ async def producer( client: Client, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NativeProducer: - """Open a producer for the inbound stream ``stream`` of ``workflow_id``. + """Open a producer on ``workflow_id``'s account. - Inside an activity, leave ``producer_id`` and ``attempt`` unset: the - activity's own id and attempt are the right answer and are what let a - reader tell a retry from a new generation. + ``stream`` names an inbound stream; with none, ``topic`` names a topic + on the stream the workflow publishes, which the server lets any + producer append to. Inside an activity, leave ``producer_id`` and + ``attempt`` unset: the activity's own id and attempt are the right + answer and are what let a reader tell a retry from a new generation. """ _reject_configured_codec(client) if not producer_id: @@ -358,6 +371,14 @@ async def producer( if not attempt: attempt = activity.info().attempt streams = _stream_client(client) + if not stream: + return NativeProducer( + streams.workflow_stream(workflow_id), + client.data_converter.payload_converter, + topic, + producer_id, + attempt, + ) stream_id = inbound_stream_id(workflow_id, stream) handle = _handles.get(stream_id) if handle is None: From bb2154853f8ffa97cb8912a265bc050b124b7a4f Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:49:04 -0700 Subject: [PATCH 480/831] Read the delivered message shape the buffer now hands back. The buffer holds a body, topic and offset rather than the wire message, and the cap moved to `workflow_read_stream_messages`. --- tests/worker/test_workflow_stream.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 944761cfa..bb0dcf9ba 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -28,7 +28,7 @@ async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() buffer.extend([message(b"one"), message(b"two")]) - assert [m.body.data for m in buffer.take()] == [b"one", b"two"] + assert [m.body for m in buffer.take()] == [b"one", b"two"] assert len(buffer) == 0 @@ -41,7 +41,7 @@ async def test_buffer_wakes_a_waiting_reader() -> None: buffer.extend([message(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body.data for m in buffer.take()] == [b"late"] + assert [m.body for m in buffer.take()] == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -64,16 +64,21 @@ async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body.data for m in buffer.take()] == [b"early"] + assert [m.body for m in buffer.take()] == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream``, so a test that reimplements - it proves nothing about the code that ships. + The cap lives inside ``workflow_read_stream_messages``, so a test that + reimplements it proves nothing about the code that ships. Borrowing the + method off the real class is what keeps the test on the shipped path. """ + workflow_read_stream_messages = ( + _WorkflowInstanceImpl.workflow_read_stream_messages + ) + def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} self.read_only_calls: list[str] = [] From 87f6006381213c2c651419c5a0e6266f0e11a93e Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 481/831] Regenerated the protos from the pinned Core. The pinned Core carries the stream additions to the public API, so the command, enum, history and workflow service messages were stale. Only the vendored stream service protos still come from the server checkout. --- temporalio/bridge/_visitor.py | 28 + .../workflow_activation_pb2.py | 626 +++++++------ .../workflow_activation_pb2.pyi | 116 +-- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 823 +++++++++++------- .../workflow_commands_pb2.pyi | 94 +- 6 files changed, 1016 insertions(+), 675 deletions(-) diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..77d1b6c7a 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamMessage( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +367,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_messages"): + await self._visit_coresdk_workflow_activation_DeliverStreamMessages( + fs, o.deliver_stream_messages + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any @@ -492,6 +510,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AddStreamMessages( + self, fs: VisitorFunctions, o: Any + ): + for v in o.messages: + await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -551,6 +575,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("add_stream_messages"): + await self._visit_coresdk_workflow_commands_AddStreamMessages( + fs, o.add_stream_messages + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0e1b3a1e6..cd09b8b97 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -2,311 +2,447 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_activation/workflow_activation.proto """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.update.v1 import message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.bridge.proto.activity_result import activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant\"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n\"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08\"\xd1\x02\n\"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status\";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause\"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult\"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04\"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t\"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\"\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t\"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status\"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult\"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason\"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3') - - +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name['WorkflowActivation'] -_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name['WorkflowActivationJob'] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['DeliverStreamMessages'] -_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name['InitializeWorkflow'] -_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name['HeadersEntry'] -_FIRETIMER = DESCRIPTOR.message_types_by_name['FireTimer'] -_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name['ResolveActivity'] -_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStart'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartSuccess'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartFailure'] -_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecutionStartCancelled'] -_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ResolveChildWorkflowExecution'] -_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name['UpdateRandomSeed'] -_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name['QueryWorkflow'] -_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name['CancelWorkflow'] -_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['SignalWorkflow'] -_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name['HeadersEntry'] -_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name['NotifyHasPatch'] -_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveSignalExternalWorkflow'] -_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name['ResolveRequestCancelExternalWorkflow'] -_DOUPDATE = DESCRIPTOR.message_types_by_name['DoUpdate'] -_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name['HeadersEntry'] -_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name['ResolveNexusOperationStart'] -_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ResolveNexusOperation'] -_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name['RemoveFromCache'] -_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name['EvictionReason'] -WorkflowActivation = _reflection.GeneratedProtocolMessageType('WorkflowActivation', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) - }) +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.update.v1 import ( + message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.activity_result import ( + activity_result_pb2 as temporal_dot_sdk_dot_core_dot_activity__result_dot_activity__result__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' +) + + +_WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] +_WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] +_INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ + "HeadersEntry" +] +_FIRETIMER = DESCRIPTOR.message_types_by_name["FireTimer"] +_RESOLVEACTIVITY = DESCRIPTOR.message_types_by_name["ResolveActivity"] +_RESOLVECHILDWORKFLOWEXECUTIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStart" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartSuccess" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartFailure" +] +_RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecutionStartCancelled" +] +_RESOLVECHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ResolveChildWorkflowExecution" +] +_UPDATERANDOMSEED = DESCRIPTOR.message_types_by_name["UpdateRandomSeed"] +_QUERYWORKFLOW = DESCRIPTOR.message_types_by_name["QueryWorkflow"] +_QUERYWORKFLOW_HEADERSENTRY = _QUERYWORKFLOW.nested_types_by_name["HeadersEntry"] +_CANCELWORKFLOW = DESCRIPTOR.message_types_by_name["CancelWorkflow"] +_SIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["SignalWorkflow"] +_SIGNALWORKFLOW_HEADERSENTRY = _SIGNALWORKFLOW.nested_types_by_name["HeadersEntry"] +_NOTIFYHASPATCH = DESCRIPTOR.message_types_by_name["NotifyHasPatch"] +_RESOLVESIGNALEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveSignalExternalWorkflow" +] +_RESOLVEREQUESTCANCELEXTERNALWORKFLOW = DESCRIPTOR.message_types_by_name[ + "ResolveRequestCancelExternalWorkflow" +] +_DOUPDATE = DESCRIPTOR.message_types_by_name["DoUpdate"] +_DOUPDATE_HEADERSENTRY = _DOUPDATE.nested_types_by_name["HeadersEntry"] +_RESOLVENEXUSOPERATIONSTART = DESCRIPTOR.message_types_by_name[ + "ResolveNexusOperationStart" +] +_RESOLVENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ResolveNexusOperation"] +_REMOVEFROMCACHE = DESCRIPTOR.message_types_by_name["RemoveFromCache"] +_REMOVEFROMCACHE_EVICTIONREASON = _REMOVEFROMCACHE.enum_types_by_name["EvictionReason"] +WorkflowActivation = _reflection.GeneratedProtocolMessageType( + "WorkflowActivation", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivation) + }, +) _sym_db.RegisterMessage(WorkflowActivation) -WorkflowActivationJob = _reflection.GeneratedProtocolMessageType('WorkflowActivationJob', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWACTIVATIONJOB, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) - }) +WorkflowActivationJob = _reflection.GeneratedProtocolMessageType( + "WorkflowActivationJob", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWACTIVATIONJOB, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.WorkflowActivationJob) + }, +) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType('DeliverStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _DELIVERSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) - }) +DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( + "DeliverStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + }, +) _sym_db.RegisterMessage(DeliverStreamMessages) -InitializeWorkflow = _reflection.GeneratedProtocolMessageType('InitializeWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _INITIALIZEWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _INITIALIZEWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) - }) +InitializeWorkflow = _reflection.GeneratedProtocolMessageType( + "InitializeWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _INITIALIZEWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _INITIALIZEWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.InitializeWorkflow) + }, +) _sym_db.RegisterMessage(InitializeWorkflow) _sym_db.RegisterMessage(InitializeWorkflow.HeadersEntry) -FireTimer = _reflection.GeneratedProtocolMessageType('FireTimer', (_message.Message,), { - 'DESCRIPTOR' : _FIRETIMER, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) - }) +FireTimer = _reflection.GeneratedProtocolMessageType( + "FireTimer", + (_message.Message,), + { + "DESCRIPTOR": _FIRETIMER, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FireTimer) + }, +) _sym_db.RegisterMessage(FireTimer) -ResolveActivity = _reflection.GeneratedProtocolMessageType('ResolveActivity', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) - }) +ResolveActivity = _reflection.GeneratedProtocolMessageType( + "ResolveActivity", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEACTIVITY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveActivity) + }, +) _sym_db.RegisterMessage(ResolveActivity) -ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) - }) +ResolveChildWorkflowExecutionStart = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStart) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStart) -ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartSuccess', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) - }) +ResolveChildWorkflowExecutionStartSuccess = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartSuccess", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccess) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartSuccess) -ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartFailure', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) - }) +ResolveChildWorkflowExecutionStartFailure = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartFailure", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailure) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartFailure) -ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecutionStartCancelled', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) - }) +ResolveChildWorkflowExecutionStartCancelled = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecutionStartCancelled", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelled) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecutionStartCancelled) -ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('ResolveChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVECHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) - }) +ResolveChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ResolveChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVECHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(ResolveChildWorkflowExecution) -UpdateRandomSeed = _reflection.GeneratedProtocolMessageType('UpdateRandomSeed', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERANDOMSEED, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) - }) +UpdateRandomSeed = _reflection.GeneratedProtocolMessageType( + "UpdateRandomSeed", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERANDOMSEED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.UpdateRandomSeed) + }, +) _sym_db.RegisterMessage(UpdateRandomSeed) -QueryWorkflow = _reflection.GeneratedProtocolMessageType('QueryWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _QUERYWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _QUERYWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) - }) +QueryWorkflow = _reflection.GeneratedProtocolMessageType( + "QueryWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _QUERYWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _QUERYWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.QueryWorkflow) + }, +) _sym_db.RegisterMessage(QueryWorkflow) _sym_db.RegisterMessage(QueryWorkflow.HeadersEntry) -CancelWorkflow = _reflection.GeneratedProtocolMessageType('CancelWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) - }) +CancelWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.CancelWorkflow) + }, +) _sym_db.RegisterMessage(CancelWorkflow) -SignalWorkflow = _reflection.GeneratedProtocolMessageType('SignalWorkflow', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALWORKFLOW_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) - }) +SignalWorkflow = _reflection.GeneratedProtocolMessageType( + "SignalWorkflow", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALWORKFLOW_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.SignalWorkflow) + }, +) _sym_db.RegisterMessage(SignalWorkflow) _sym_db.RegisterMessage(SignalWorkflow.HeadersEntry) -NotifyHasPatch = _reflection.GeneratedProtocolMessageType('NotifyHasPatch', (_message.Message,), { - 'DESCRIPTOR' : _NOTIFYHASPATCH, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) - }) +NotifyHasPatch = _reflection.GeneratedProtocolMessageType( + "NotifyHasPatch", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYHASPATCH, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotifyHasPatch) + }, +) _sym_db.RegisterMessage(NotifyHasPatch) -ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveSignalExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVESIGNALEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) - }) +ResolveSignalExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveSignalExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVESIGNALEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveSignalExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveSignalExternalWorkflow) -ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType('ResolveRequestCancelExternalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) - }) +ResolveRequestCancelExternalWorkflow = _reflection.GeneratedProtocolMessageType( + "ResolveRequestCancelExternalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVEREQUESTCANCELEXTERNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveRequestCancelExternalWorkflow) + }, +) _sym_db.RegisterMessage(ResolveRequestCancelExternalWorkflow) -DoUpdate = _reflection.GeneratedProtocolMessageType('DoUpdate', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _DOUPDATE_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) - }) - , - 'DESCRIPTOR' : _DOUPDATE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) - }) +DoUpdate = _reflection.GeneratedProtocolMessageType( + "DoUpdate", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _DOUPDATE_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate.HeadersEntry) + }, + ), + "DESCRIPTOR": _DOUPDATE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DoUpdate) + }, +) _sym_db.RegisterMessage(DoUpdate) _sym_db.RegisterMessage(DoUpdate.HeadersEntry) -ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType('ResolveNexusOperationStart', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATIONSTART, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) - }) +ResolveNexusOperationStart = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperationStart", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATIONSTART, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperationStart) + }, +) _sym_db.RegisterMessage(ResolveNexusOperationStart) -ResolveNexusOperation = _reflection.GeneratedProtocolMessageType('ResolveNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _RESOLVENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) - }) +ResolveNexusOperation = _reflection.GeneratedProtocolMessageType( + "ResolveNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _RESOLVENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveNexusOperation) + }, +) _sym_db.RegisterMessage(ResolveNexusOperation) -RemoveFromCache = _reflection.GeneratedProtocolMessageType('RemoveFromCache', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEFROMCACHE, - '__module__' : 'temporal.sdk.core.workflow_activation.workflow_activation_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) - }) +RemoveFromCache = _reflection.GeneratedProtocolMessageType( + "RemoveFromCache", + (_message.Message,), + { + "DESCRIPTOR": _REMOVEFROMCACHE, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.RemoveFromCache) + }, +) _sym_db.RegisterMessage(RemoveFromCache) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation' - _INITIALIZEWORKFLOW_HEADERSENTRY._options = None - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _QUERYWORKFLOW_HEADERSENTRY._options = None - _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _SIGNALWORKFLOW_HEADERSENTRY._options = None - _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b'8\001' - _DOUPDATE_HEADERSENTRY._options = None - _DOUPDATE_HEADERSENTRY._serialized_options = b'8\001' - _WORKFLOWACTIVATION._serialized_start=570 - _WORKFLOWACTIVATION._serialized_end=1116 - _WORKFLOWACTIVATIONJOB._serialized_start=1119 - _WORKFLOWACTIVATIONJOB._serialized_end=2582 - _DELIVERSTREAMMESSAGES._serialized_start=2585 - _DELIVERSTREAMMESSAGES._serialized_end=2724 - _INITIALIZEWORKFLOW._serialized_start=2727 - _INITIALIZEWORKFLOW._serialized_end=4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start=4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end=4131 - _FIRETIMER._serialized_start=4133 - _FIRETIMER._serialized_end=4157 - _RESOLVEACTIVITY._serialized_start=4159 - _RESOLVEACTIVITY._serialized_end=4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start=4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end=4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start=4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end=4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start=4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end=4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start=4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end=4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start=4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end=5043 - _UPDATERANDOMSEED._serialized_start=5045 - _UPDATERANDOMSEED._serialized_end=5088 - _QUERYWORKFLOW._serialized_start=5091 - _QUERYWORKFLOW._serialized_end=5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start=4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end=4131 - _CANCELWORKFLOW._serialized_start=5353 - _CANCELWORKFLOW._serialized_end=5385 - _SIGNALWORKFLOW._serialized_start=5388 - _SIGNALWORKFLOW._serialized_end=5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start=4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end=4131 - _NOTIFYHASPATCH._serialized_start=5679 - _NOTIFYHASPATCH._serialized_end=5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start=5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end=5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start=5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end=5914 - _DOUPDATE._serialized_start=5917 - _DOUPDATE._serialized_end=6248 - _DOUPDATE_HEADERSENTRY._serialized_start=4052 - _DOUPDATE_HEADERSENTRY._serialized_end=4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start=6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end=6405 - _RESOLVENEXUSOPERATION._serialized_start=6407 - _RESOLVENEXUSOPERATION._serialized_end=6496 - _REMOVEFROMCACHE._serialized_start=6499 - _REMOVEFROMCACHE._serialized_end=6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start=6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end=6851 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0025Temporalio::Internal::Bridge::Api::WorkflowActivation" + ) + _INITIALIZEWORKFLOW_HEADERSENTRY._options = None + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _QUERYWORKFLOW_HEADERSENTRY._options = None + _QUERYWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _SIGNALWORKFLOW_HEADERSENTRY._options = None + _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" + _DOUPDATE_HEADERSENTRY._options = None + _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" + _WORKFLOWACTIVATION._serialized_start = 570 + _WORKFLOWACTIVATION._serialized_end = 1116 + _WORKFLOWACTIVATIONJOB._serialized_start = 1119 + _WORKFLOWACTIVATIONJOB._serialized_end = 2582 + _DELIVERSTREAMMESSAGES._serialized_start = 2585 + _DELIVERSTREAMMESSAGES._serialized_end = 2724 + _INITIALIZEWORKFLOW._serialized_start = 2727 + _INITIALIZEWORKFLOW._serialized_end = 4131 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _FIRETIMER._serialized_start = 4133 + _FIRETIMER._serialized_end = 4157 + _RESOLVEACTIVITY._serialized_start = 4159 + _RESOLVEACTIVITY._serialized_end = 4268 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 + _UPDATERANDOMSEED._serialized_start = 5045 + _UPDATERANDOMSEED._serialized_end = 5088 + _QUERYWORKFLOW._serialized_start = 5091 + _QUERYWORKFLOW._serialized_end = 5351 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _CANCELWORKFLOW._serialized_start = 5353 + _CANCELWORKFLOW._serialized_end = 5385 + _SIGNALWORKFLOW._serialized_start = 5388 + _SIGNALWORKFLOW._serialized_end = 5677 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 + _NOTIFYHASPATCH._serialized_start = 5679 + _NOTIFYHASPATCH._serialized_end = 5713 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 + _DOUPDATE._serialized_start = 5917 + _DOUPDATE._serialized_end = 6248 + _DOUPDATE_HEADERSENTRY._serialized_start = 4052 + _DOUPDATE_HEADERSENTRY._serialized_end = 4131 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 + _RESOLVENEXUSOPERATION._serialized_start = 6407 + _RESOLVENEXUSOPERATION._serialized_end = 6496 + _REMOVEFROMCACHE._serialized_start = 6499 + _REMOVEFROMCACHE._serialized_end = 6851 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index eab815fc9..5245cd6fc 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,9 +19,9 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -439,6 +439,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamMessages(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + messages: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamMessage + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "messages", + b"messages", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamMessages = DeliverStreamMessages + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" @@ -1451,63 +1508,6 @@ class ResolveNexusOperation(google.protobuf.message.Message): global___ResolveNexusOperation = ResolveNexusOperation -class DeliverStreamMessages(google.protobuf.message.Message): - """Hand a workflow the next range of a stream it subscribed to. - - The range is delivered once, on the task the server decided it belongs to, - and the offsets it covered are recorded in History rather than the payloads. - On replay the server re-supplies the same range by reading the stream again, - so this job appears at the same point with the same contents both times. - - An empty range is still delivered: a task where the subscription saw nothing - is a fact replay has to reproduce, not an absence of one. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - STREAM_ID_FIELD_NUMBER: builtins.int - FROM_OFFSET_FIELD_NUMBER: builtins.int - TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Id of the stream this range came from.""" - from_offset: builtins.int - """Inclusive.""" - to_offset: builtins.int - """Exclusive. Equal to from_offset when the subscription saw nothing.""" - @property - def messages( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ]: ... - def __init__( - self, - *, - stream_id: builtins.str = ..., - from_offset: builtins.int = ..., - to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage - ] - | None = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "from_offset", - b"from_offset", - "messages", - b"messages", - "stream_id", - b"stream_id", - "to_offset", - b"to_offset", - ], - ) -> None: ... - -global___DeliverStreamMessages = DeliverStreamMessages - class RemoveFromCache(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..44826f2da 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AddStreamMessages, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -21,6 +22,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -28,6 +30,7 @@ __all__ = [ "ActivityCancellationType", + "AddStreamMessages", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -49,6 +52,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index ccfa1a016..3374f951a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -2,408 +2,583 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: temporal/sdk/core/workflow_commands/workflow_commands.proto """Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 -from temporalio.api.enums.v1 import workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2 -from temporalio.api.failure.v1 import message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2 -from temporalio.api.stream.v1 import message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.sdk.v1 import event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2 -from temporalio.bridge.proto.child_workflow import child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2 -from temporalio.bridge.proto.nexus import nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2 -from temporalio.bridge.proto.common import common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n\"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n\"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant\"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage\":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant\"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08\"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target\"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response\"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3') +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name['ActivityCancellationType'] +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.enums.v1 import ( + workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) +from temporalio.api.sdk.v1 import ( + event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, +) +from temporalio.api.sdk.v1 import ( + user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.bridge.proto.child_workflow import ( + child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, +) +from temporalio.bridge.proto.common import ( + common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, +) +from temporalio.bridge.proto.nexus import ( + nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' +) + +_ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] ActivityCancellationType = enum_type_wrapper.EnumTypeWrapper(_ACTIVITYCANCELLATIONTYPE) TRY_CANCEL = 0 WAIT_CANCELLATION_COMPLETED = 1 ABANDON = 2 -_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name['WorkflowCommand'] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name['AddStreamMessages'] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name['SubscribeStream'] -_STARTTIMER = DESCRIPTOR.message_types_by_name['StartTimer'] -_CANCELTIMER = DESCRIPTOR.message_types_by_name['CancelTimer'] -_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleActivity'] -_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name['HeadersEntry'] -_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name['ScheduleLocalActivity'] -_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name['HeadersEntry'] -_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelActivity'] -_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name['RequestCancelLocalActivity'] -_QUERYRESULT = DESCRIPTOR.message_types_by_name['QueryResult'] -_QUERYSUCCESS = DESCRIPTOR.message_types_by_name['QuerySuccess'] -_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CompleteWorkflowExecution'] -_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['FailWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['ContinueAsNewWorkflowExecution'] -_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelWorkflowExecution'] -_SETPATCHMARKER = DESCRIPTOR.message_types_by_name['SetPatchMarker'] -_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['StartChildWorkflowExecution'] -_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name['MemoEntry'] -_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['CancelChildWorkflowExecution'] -_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['RequestCancelExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name['SignalExternalWorkflowExecution'] -_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name['HeadersEntry'] -_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name['CancelSignalWorkflow'] -_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name['UpsertWorkflowSearchAttributes'] -_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name['ModifyWorkflowProperties'] -_UPDATERESPONSE = DESCRIPTOR.message_types_by_name['UpdateResponse'] -_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name['ScheduleNexusOperation'] -_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name['NexusHeaderEntry'] -_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name['RequestCancelNexusOperation'] -WorkflowCommand = _reflection.GeneratedProtocolMessageType('WorkflowCommand', (_message.Message,), { - 'DESCRIPTOR' : _WORKFLOWCOMMAND, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) - }) +_WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] +_STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] +_CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] +_SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] +_SCHEDULEACTIVITY_HEADERSENTRY = _SCHEDULEACTIVITY.nested_types_by_name["HeadersEntry"] +_SCHEDULELOCALACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleLocalActivity"] +_SCHEDULELOCALACTIVITY_HEADERSENTRY = _SCHEDULELOCALACTIVITY.nested_types_by_name[ + "HeadersEntry" +] +_REQUESTCANCELACTIVITY = DESCRIPTOR.message_types_by_name["RequestCancelActivity"] +_REQUESTCANCELLOCALACTIVITY = DESCRIPTOR.message_types_by_name[ + "RequestCancelLocalActivity" +] +_QUERYRESULT = DESCRIPTOR.message_types_by_name["QueryResult"] +_QUERYSUCCESS = DESCRIPTOR.message_types_by_name["QuerySuccess"] +_COMPLETEWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CompleteWorkflowExecution" +] +_FAILWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["FailWorkflowExecution"] +_CONTINUEASNEWWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "ContinueAsNewWorkflowExecution" +] +_CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY = ( + _CONTINUEASNEWWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name["CancelWorkflowExecution"] +_SETPATCHMARKER = DESCRIPTOR.message_types_by_name["SetPatchMarker"] +_STARTCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "StartChildWorkflowExecution" +] +_STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_STARTCHILDWORKFLOWEXECUTION_MEMOENTRY = ( + _STARTCHILDWORKFLOWEXECUTION.nested_types_by_name["MemoEntry"] +) +_CANCELCHILDWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "CancelChildWorkflowExecution" +] +_REQUESTCANCELEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "RequestCancelExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION = DESCRIPTOR.message_types_by_name[ + "SignalExternalWorkflowExecution" +] +_SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY = ( + _SIGNALEXTERNALWORKFLOWEXECUTION.nested_types_by_name["HeadersEntry"] +) +_CANCELSIGNALWORKFLOW = DESCRIPTOR.message_types_by_name["CancelSignalWorkflow"] +_UPSERTWORKFLOWSEARCHATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UpsertWorkflowSearchAttributes" +] +_MODIFYWORKFLOWPROPERTIES = DESCRIPTOR.message_types_by_name["ModifyWorkflowProperties"] +_UPDATERESPONSE = DESCRIPTOR.message_types_by_name["UpdateResponse"] +_SCHEDULENEXUSOPERATION = DESCRIPTOR.message_types_by_name["ScheduleNexusOperation"] +_SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY = _SCHEDULENEXUSOPERATION.nested_types_by_name[ + "NexusHeaderEntry" +] +_REQUESTCANCELNEXUSOPERATION = DESCRIPTOR.message_types_by_name[ + "RequestCancelNexusOperation" +] +WorkflowCommand = _reflection.GeneratedProtocolMessageType( + "WorkflowCommand", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWCOMMAND, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowCommand) + }, +) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType('AddStreamMessages', (_message.Message,), { - 'DESCRIPTOR' : _ADDSTREAMMESSAGES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) - }) +AddStreamMessages = _reflection.GeneratedProtocolMessageType( + "AddStreamMessages", + (_message.Message,), + { + "DESCRIPTOR": _ADDSTREAMMESSAGES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + }, +) _sym_db.RegisterMessage(AddStreamMessages) -SubscribeStream = _reflection.GeneratedProtocolMessageType('SubscribeStream', (_message.Message,), { - 'DESCRIPTOR' : _SUBSCRIBESTREAM, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) - }) +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) _sym_db.RegisterMessage(SubscribeStream) -StartTimer = _reflection.GeneratedProtocolMessageType('StartTimer', (_message.Message,), { - 'DESCRIPTOR' : _STARTTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) - }) +StartTimer = _reflection.GeneratedProtocolMessageType( + "StartTimer", + (_message.Message,), + { + "DESCRIPTOR": _STARTTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartTimer) + }, +) _sym_db.RegisterMessage(StartTimer) -CancelTimer = _reflection.GeneratedProtocolMessageType('CancelTimer', (_message.Message,), { - 'DESCRIPTOR' : _CANCELTIMER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) - }) +CancelTimer = _reflection.GeneratedProtocolMessageType( + "CancelTimer", + (_message.Message,), + { + "DESCRIPTOR": _CANCELTIMER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelTimer) + }, +) _sym_db.RegisterMessage(CancelTimer) -ScheduleActivity = _reflection.GeneratedProtocolMessageType('ScheduleActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULEACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULEACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) - }) +ScheduleActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULEACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULEACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleActivity) + }, +) _sym_db.RegisterMessage(ScheduleActivity) _sym_db.RegisterMessage(ScheduleActivity.HeadersEntry) -ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType('ScheduleLocalActivity', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULELOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) - }) +ScheduleLocalActivity = _reflection.GeneratedProtocolMessageType( + "ScheduleLocalActivity", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULELOCALACTIVITY_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry) + }, + ), + "DESCRIPTOR": _SCHEDULELOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleLocalActivity) + }, +) _sym_db.RegisterMessage(ScheduleLocalActivity) _sym_db.RegisterMessage(ScheduleLocalActivity.HeadersEntry) -RequestCancelActivity = _reflection.GeneratedProtocolMessageType('RequestCancelActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) - }) +RequestCancelActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelActivity) + }, +) _sym_db.RegisterMessage(RequestCancelActivity) -RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType('RequestCancelLocalActivity', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELLOCALACTIVITY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) - }) +RequestCancelLocalActivity = _reflection.GeneratedProtocolMessageType( + "RequestCancelLocalActivity", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELLOCALACTIVITY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelLocalActivity) + }, +) _sym_db.RegisterMessage(RequestCancelLocalActivity) -QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), { - 'DESCRIPTOR' : _QUERYRESULT, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) - }) +QueryResult = _reflection.GeneratedProtocolMessageType( + "QueryResult", + (_message.Message,), + { + "DESCRIPTOR": _QUERYRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QueryResult) + }, +) _sym_db.RegisterMessage(QueryResult) -QuerySuccess = _reflection.GeneratedProtocolMessageType('QuerySuccess', (_message.Message,), { - 'DESCRIPTOR' : _QUERYSUCCESS, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) - }) +QuerySuccess = _reflection.GeneratedProtocolMessageType( + "QuerySuccess", + (_message.Message,), + { + "DESCRIPTOR": _QUERYSUCCESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.QuerySuccess) + }, +) _sym_db.RegisterMessage(QuerySuccess) -CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType('CompleteWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _COMPLETEWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) - }) +CompleteWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CompleteWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _COMPLETEWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CompleteWorkflowExecution) + }, +) _sym_db.RegisterMessage(CompleteWorkflowExecution) -FailWorkflowExecution = _reflection.GeneratedProtocolMessageType('FailWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _FAILWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) - }) +FailWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "FailWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _FAILWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.FailWorkflowExecution) + }, +) _sym_db.RegisterMessage(FailWorkflowExecution) -ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType('ContinueAsNewWorkflowExecution', (_message.Message,), { - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) - }) - , - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _CONTINUEASNEWWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) - }) +ContinueAsNewWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "ContinueAsNewWorkflowExecution", + (_message.Message,), + { + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry) + }, + ), + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _CONTINUEASNEWWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ContinueAsNewWorkflowExecution) + }, +) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.MemoEntry) _sym_db.RegisterMessage(ContinueAsNewWorkflowExecution.HeadersEntry) -CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) - }) +CancelWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelWorkflowExecution) -SetPatchMarker = _reflection.GeneratedProtocolMessageType('SetPatchMarker', (_message.Message,), { - 'DESCRIPTOR' : _SETPATCHMARKER, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) - }) +SetPatchMarker = _reflection.GeneratedProtocolMessageType( + "SetPatchMarker", + (_message.Message,), + { + "DESCRIPTOR": _SETPATCHMARKER, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SetPatchMarker) + }, +) _sym_db.RegisterMessage(SetPatchMarker) -StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('StartChildWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) - }) - , - - 'MemoEntry' : _reflection.GeneratedProtocolMessageType('MemoEntry', (_message.Message,), { - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) - }) - , - 'DESCRIPTOR' : _STARTCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) - }) +StartChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "StartChildWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry) + }, + ), + "MemoEntry": _reflection.GeneratedProtocolMessageType( + "MemoEntry", + (_message.Message,), + { + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry) + }, + ), + "DESCRIPTOR": _STARTCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StartChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(StartChildWorkflowExecution) _sym_db.RegisterMessage(StartChildWorkflowExecution.HeadersEntry) _sym_db.RegisterMessage(StartChildWorkflowExecution.MemoEntry) -CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType('CancelChildWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _CANCELCHILDWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) - }) +CancelChildWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "CancelChildWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _CANCELCHILDWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelChildWorkflowExecution) + }, +) _sym_db.RegisterMessage(CancelChildWorkflowExecution) -RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('RequestCancelExternalWorkflowExecution', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) - }) +RequestCancelExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "RequestCancelExternalWorkflowExecution", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(RequestCancelExternalWorkflowExecution) -SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType('SignalExternalWorkflowExecution', (_message.Message,), { - - 'HeadersEntry' : _reflection.GeneratedProtocolMessageType('HeadersEntry', (_message.Message,), { - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) - }) - , - 'DESCRIPTOR' : _SIGNALEXTERNALWORKFLOWEXECUTION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) - }) +SignalExternalWorkflowExecution = _reflection.GeneratedProtocolMessageType( + "SignalExternalWorkflowExecution", + (_message.Message,), + { + "HeadersEntry": _reflection.GeneratedProtocolMessageType( + "HeadersEntry", + (_message.Message,), + { + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry) + }, + ), + "DESCRIPTOR": _SIGNALEXTERNALWORKFLOWEXECUTION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SignalExternalWorkflowExecution) + }, +) _sym_db.RegisterMessage(SignalExternalWorkflowExecution) _sym_db.RegisterMessage(SignalExternalWorkflowExecution.HeadersEntry) -CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType('CancelSignalWorkflow', (_message.Message,), { - 'DESCRIPTOR' : _CANCELSIGNALWORKFLOW, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) - }) +CancelSignalWorkflow = _reflection.GeneratedProtocolMessageType( + "CancelSignalWorkflow", + (_message.Message,), + { + "DESCRIPTOR": _CANCELSIGNALWORKFLOW, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.CancelSignalWorkflow) + }, +) _sym_db.RegisterMessage(CancelSignalWorkflow) -UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType('UpsertWorkflowSearchAttributes', (_message.Message,), { - 'DESCRIPTOR' : _UPSERTWORKFLOWSEARCHATTRIBUTES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) - }) +UpsertWorkflowSearchAttributes = _reflection.GeneratedProtocolMessageType( + "UpsertWorkflowSearchAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UPSERTWORKFLOWSEARCHATTRIBUTES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpsertWorkflowSearchAttributes) + }, +) _sym_db.RegisterMessage(UpsertWorkflowSearchAttributes) -ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType('ModifyWorkflowProperties', (_message.Message,), { - 'DESCRIPTOR' : _MODIFYWORKFLOWPROPERTIES, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) - }) +ModifyWorkflowProperties = _reflection.GeneratedProtocolMessageType( + "ModifyWorkflowProperties", + (_message.Message,), + { + "DESCRIPTOR": _MODIFYWORKFLOWPROPERTIES, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ModifyWorkflowProperties) + }, +) _sym_db.RegisterMessage(ModifyWorkflowProperties) -UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), { - 'DESCRIPTOR' : _UPDATERESPONSE, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) - }) +UpdateResponse = _reflection.GeneratedProtocolMessageType( + "UpdateResponse", + (_message.Message,), + { + "DESCRIPTOR": _UPDATERESPONSE, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UpdateResponse) + }, +) _sym_db.RegisterMessage(UpdateResponse) -ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType('ScheduleNexusOperation', (_message.Message,), { - - 'NexusHeaderEntry' : _reflection.GeneratedProtocolMessageType('NexusHeaderEntry', (_message.Message,), { - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) - }) - , - 'DESCRIPTOR' : _SCHEDULENEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) - }) +ScheduleNexusOperation = _reflection.GeneratedProtocolMessageType( + "ScheduleNexusOperation", + (_message.Message,), + { + "NexusHeaderEntry": _reflection.GeneratedProtocolMessageType( + "NexusHeaderEntry", + (_message.Message,), + { + "DESCRIPTOR": _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry) + }, + ), + "DESCRIPTOR": _SCHEDULENEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ScheduleNexusOperation) + }, +) _sym_db.RegisterMessage(ScheduleNexusOperation) _sym_db.RegisterMessage(ScheduleNexusOperation.NexusHeaderEntry) -RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType('RequestCancelNexusOperation', (_message.Message,), { - 'DESCRIPTOR' : _REQUESTCANCELNEXUSOPERATION, - '__module__' : 'temporal.sdk.core.workflow_commands.workflow_commands_pb2' - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) - }) +RequestCancelNexusOperation = _reflection.GeneratedProtocolMessageType( + "RequestCancelNexusOperation", + (_message.Message,), + { + "DESCRIPTOR": _REQUESTCANCELNEXUSOPERATION, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.RequestCancelNexusOperation) + }, +) _sym_db.RegisterMessage(RequestCancelNexusOperation) if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands' - _SCHEDULEACTIVITY_HEADERSENTRY._options = None - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b'8\001' - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b'8\001' - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b'8\001' - _ACTIVITYCANCELLATIONTYPE._serialized_start=8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end=9065 - _WORKFLOWCOMMAND._serialized_start=556 - _WORKFLOWCOMMAND._serialized_end=2794 - _ADDSTREAMMESSAGES._serialized_start=2796 - _ADDSTREAMMESSAGES._serialized_end=2891 - _SUBSCRIBESTREAM._serialized_start=2893 - _SUBSCRIBESTREAM._serialized_end=2951 - _STARTTIMER._serialized_start=2953 - _STARTTIMER._serialized_end=3036 - _CANCELTIMER._serialized_start=3038 - _CANCELTIMER._serialized_end=3064 - _SCHEDULEACTIVITY._serialized_start=3067 - _SCHEDULEACTIVITY._serialized_end=3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end=3891 - _SCHEDULELOCALACTIVITY._serialized_start=3894 - _SCHEDULELOCALACTIVITY._serialized_end=4644 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start=3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end=3891 - _REQUESTCANCELACTIVITY._serialized_start=4646 - _REQUESTCANCELACTIVITY._serialized_end=4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start=4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end=4725 - _QUERYRESULT._serialized_start=4728 - _QUERYRESULT._serialized_end=4884 - _QUERYSUCCESS._serialized_start=4886 - _QUERYSUCCESS._serialized_end=4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start=4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end=5029 - _FAILWORKFLOWEXECUTION._serialized_start=5031 - _FAILWORKFLOWEXECUTION._serialized_end=5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start=5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end=6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELWORKFLOWEXECUTION._serialized_start=6024 - _CANCELWORKFLOWEXECUTION._serialized_end=6100 - _SETPATCHMARKER._serialized_start=6102 - _SETPATCHMARKER._serialized_end=6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start=6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end=7333 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start=5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end=5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start=7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end=7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start=7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end=7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start=7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end=7956 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start=3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end=3891 - _CANCELSIGNALWORKFLOW._serialized_start=7958 - _CANCELSIGNALWORKFLOW._serialized_end=7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start=7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end=8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start=8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end=8177 - _UPDATERESPONSE._serialized_start=8180 - _UPDATERESPONSE._serialized_end=8390 - _SCHEDULENEXUSOPERATION._serialized_start=8393 - _SCHEDULENEXUSOPERATION._serialized_end=8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start=8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end=8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start=8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end=8975 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = ( + b"\352\0023Temporalio::Internal::Bridge::Api::WorkflowCommands" + ) + _SCHEDULEACTIVITY_HEADERSENTRY._options = None + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULELOCALACTIVITY_HEADERSENTRY._options = None + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._options = None + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._options = None + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_options = b"8\001" + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._options = None + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2794 + _ADDSTREAMMESSAGES._serialized_start = 2796 + _ADDSTREAMMESSAGES._serialized_end = 2891 + _SUBSCRIBESTREAM._serialized_start = 2893 + _SUBSCRIBESTREAM._serialized_end = 2951 + _STARTTIMER._serialized_start = 2953 + _STARTTIMER._serialized_end = 3036 + _CANCELTIMER._serialized_start = 3038 + _CANCELTIMER._serialized_end = 3064 + _SCHEDULEACTIVITY._serialized_start = 3067 + _SCHEDULEACTIVITY._serialized_end = 3891 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 + _SCHEDULELOCALACTIVITY._serialized_start = 3894 + _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 + _REQUESTCANCELACTIVITY._serialized_start = 4646 + _REQUESTCANCELACTIVITY._serialized_end = 4682 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 + _QUERYRESULT._serialized_start = 4728 + _QUERYRESULT._serialized_end = 4884 + _QUERYSUCCESS._serialized_start = 4886 + _QUERYSUCCESS._serialized_end = 4951 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 + _FAILWORKFLOWEXECUTION._serialized_start = 5031 + _FAILWORKFLOWEXECUTION._serialized_end = 5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELWORKFLOWEXECUTION._serialized_start = 6024 + _CANCELWORKFLOWEXECUTION._serialized_end = 6100 + _SETPATCHMARKER._serialized_start = 6102 + _SETPATCHMARKER._serialized_end = 6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 + _CANCELSIGNALWORKFLOW._serialized_start = 7958 + _CANCELSIGNALWORKFLOW._serialized_end = 7993 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 + _UPDATERESPONSE._serialized_start = 8180 + _UPDATERESPONSE._serialized_end = 8390 + _SCHEDULENEXUSOPERATION._serialized_start = 8393 + _SCHEDULENEXUSOPERATION._serialized_end = 8931 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 040a2267c..bcf1bf7eb 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,9 +23,9 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 -import temporalio.api.stream.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -228,6 +228,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -252,10 +254,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -272,6 +270,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -285,6 +285,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "add_stream_messages", + b"add_stream_messages", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -311,10 +313,6 @@ class WorkflowCommand(google.protobuf.message.Message): b"request_cancel_local_activity", "request_cancel_nexus_operation", b"request_cancel_nexus_operation", - "subscribe_stream", - b"subscribe_stream", - "add_stream_messages", - b"add_stream_messages", "respond_to_query", b"respond_to_query", "schedule_activity", @@ -331,6 +329,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -375,38 +375,14 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand -class StartTimer(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SEQ_FIELD_NUMBER: builtins.int - START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int - seq: builtins.int - """Lang's incremental sequence number, used as the operation identifier""" - @property - def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... - def __init__( - self, - *, - seq: builtins.int = ..., - start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" - ], - ) -> None: ... - -global___StartTimer = StartTimer - class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -444,14 +420,6 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - """ - DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int @@ -476,6 +444,36 @@ class SubscribeStream(google.protobuf.message.Message): global___SubscribeStream = SubscribeStream +class StartTimer(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + START_TO_FIRE_TIMEOUT_FIELD_NUMBER: builtins.int + seq: builtins.int + """Lang's incremental sequence number, used as the operation identifier""" + @property + def start_to_fire_timeout(self) -> google.protobuf.duration_pb2.Duration: ... + def __init__( + self, + *, + seq: builtins.int = ..., + start_to_fire_timeout: google.protobuf.duration_pb2.Duration | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "seq", b"seq", "start_to_fire_timeout", b"start_to_fire_timeout" + ], + ) -> None: ... + +global___StartTimer = StartTimer + class CancelTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor From d4fe1c8851ed13f8cc796ebd20ea89875186d334 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 14:56:08 -0700 Subject: [PATCH 482/831] Sorted and formatted the server-side stream modules. CI runs `ruff check --select I` and `ruff format --check` over the whole tree, and `check-protos` reformats what it regenerates. --- scripts/gen_stream_protos.py | 29 +++++++++++++++---- temporalio/client_stream.py | 14 +++++---- temporalio/contrib/server_streams/__init__.py | 12 ++++---- temporalio/streams/providers/native.py | 14 +++++++-- temporalio/workflow/__init__.py | 10 +++---- tests/contrib/test_server_streams.py | 16 ++++++---- tests/worker/test_workflow_stream.py | 4 +-- tests/worker/test_workflow_stream_e2e.py | 6 ++-- 8 files changed, 70 insertions(+), 35 deletions(-) diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index e66f8abb4..f57ff6177 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -34,7 +34,13 @@ # the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` # checkout instead when the submodule is not initialized. UPSTREAM_API = ( - BASE / "temporalio" / "bridge" / "sdk-core" / "crates" / "protos" / "protos" + BASE + / "temporalio" + / "bridge" + / "sdk-core" + / "crates" + / "protos" + / "protos" / "api_upstream" ) @@ -43,16 +49,24 @@ def api_proto_path() -> Path: override = os.environ.get("TEMPORAL_API_PROTOS") if override: return Path(override).resolve() - if (UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto").is_file(): + if ( + UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto" + ).is_file(): return UPSTREAM_API raise SystemExit( "no api protos found: initialize the sdk-core submodule or set " "TEMPORAL_API_PROTOS to a temporalio/api checkout" ) + SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") -FILES = ["message.proto", "stream_state.proto", "request_response.proto", "service.proto"] +FILES = [ + "message.proto", + "stream_state.proto", + "request_response.proto", + "service.proto", +] # Server-only options. They carry shard routing and rate-limit category, which # a client neither reads nor can resolve, since the files defining them are not @@ -63,7 +77,10 @@ def api_proto_path() -> Path: # protoc names a python module after the proto path. These put the generated # modules where this package publishes them. FIX_PY = [ - (re.compile(r"from temporalio\.api\.stream\.v1 import"), "from temporalio.api.streamservice.v1 import"), + ( + re.compile(r"from temporalio\.api\.stream\.v1 import"), + "from temporalio.api.streamservice.v1 import", + ), (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), (re.compile(r"from temporal\.api\."), "from temporalio.api."), (re.compile(r"import temporal\.api\."), "import temporalio.api."), @@ -96,7 +113,9 @@ def main() -> None: out.mkdir() subprocess.run( [ - sys.executable, "-m", "grpc_tools.protoc", + sys.executable, + "-m", + "grpc_tools.protoc", f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 75388c9c9..1b5d953bd 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -242,9 +242,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, @@ -401,9 +402,10 @@ async def read( ) ) out = response.frontend_response - return [Message(data=m.body.data, topic=m.topic, offset=m.offset) for m in out.messages], ( - out.next_offset - ) + return [ + Message(data=m.body.data, topic=m.topic, offset=m.offset) + for m in out.messages + ], (out.next_offset) async def follow( self, diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index e831d763c..b6db1fd7a 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -169,9 +169,7 @@ def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... @overload def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... - def topic( - self, name: str, *, type: type = object - ) -> WorkflowTopicHandle[Any]: + def topic(self, name: str, *, type: type = object) -> WorkflowTopicHandle[Any]: """Bind a topic on this Workflow's stream.""" return WorkflowTopicHandle(name, type) @@ -179,7 +177,9 @@ def topic( class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" - def __init__(self, client: "WorkflowStreamClient", topic: str, value_type: type[T]) -> None: + def __init__( + self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client self._name = topic @@ -316,7 +316,9 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown - async for message in self._handle.follow(from_offset=from_offset, topics=topics): + async for message in self._handle.follow( + from_offset=from_offset, topics=topics + ): yield WorkflowStreamItem( topic=message.topic, data=_decode(self._converter, message.data, result_type), diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index c0044b9cf..1243d3784 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -193,7 +193,11 @@ def _provider_id(self) -> str: without letting a new generation be swallowed as a duplicate of the old one. """ - return f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) async def append(self, *values: Any) -> Cursor: """Append values and return where the first one landed.""" @@ -240,7 +244,9 @@ async def finish(self) -> None: def _encode(self, value: Any) -> bytes: payload = ( - value if isinstance(value, Payload) else self._converter.to_payloads([value])[0] + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] ) return payload.SerializeToString() @@ -298,7 +304,9 @@ async def latest(self, *, topic: str | None = None) -> Cursor: # A stream nobody has published to does not exist yet, and that # is the same answer as an empty one. return BEGINNING - return Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + return ( + Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING + ) def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 28e711d9b..8d57b75e7 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,6 +58,7 @@ wait, ) from ._context import ( + DeliveredStreamMessage, Info, ParentInfo, RootInfo, @@ -65,6 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, + add_stream_messages, cancellation_reason, current_update_info, deprecate_patch, @@ -86,20 +88,18 @@ payload_converter, random, random_seed, + read_stream, + read_stream_messages, register_random_seed_callback, set_current_details, sleep, + subscribe_stream, time, time_ns, upsert_memo, upsert_search_attributes, uuid4, uuid7, - DeliveredStreamMessage, - read_stream, - read_stream_messages, - add_stream_messages, - subscribe_stream, wait_condition, ) from ._definition import ( diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 33d86d827..e1fe84c77 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -103,7 +103,9 @@ async def read() -> None: # The Workflow's own publishes bracket the Activity's, and both are on one # log in the order the server took them. - assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + ["workflow"] + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + [ + "workflow" + ] assert seen[0].text == "turn started" assert seen[-1].text == "turn ended" assert offsets == list(range(tokens + 2)) @@ -115,7 +117,9 @@ async def read() -> None: assert await late.get_offset() == tokens + 2 replayed = [ item.data.text - async for item in late.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in late.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert replayed == [e.text for e in seen] @@ -132,14 +136,14 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: activities=[emit_from_activity], max_cached_workflows=0, ): - await client.execute_workflow( - Emitting.run, 3, id=wf_id, task_queue=task_queue - ) + await client.execute_workflow(Emitting.run, 3, id=wf_id, task_queue=task_queue) stream = WorkflowStreamClient.create(client, wf_id) first = [ item - async for item in stream.subscribe(topics=[TOPIC], from_offset=0, result_type=Event) + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) ] assert len(first) == 5 diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index bb0dcf9ba..40d6fdf45 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -75,9 +75,7 @@ class _ReadOnlyStub: method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = ( - _WorkflowInstanceImpl.workflow_read_stream_messages - ) + workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages def __init__(self) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 579327217..00d0dfa85 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,9 +17,9 @@ import uuid import pytest -from temporalio.api.enums.v1 import EventType from temporalio import workflow +from temporalio.api.enums.v1 import EventType from temporalio.client import Client from temporalio.worker import Worker @@ -239,6 +239,8 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: async for event in client.get_workflow_handle(wf_id).fetch_history_events(): if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: completed += 1 - assert completed >= 3, f"only {completed} workflow tasks, sticky path not exercised" + assert completed >= 3, ( + f"only {completed} workflow tasks, sticky path not exercised" + ) finally: await streams.close() From 7a0eda384e5ba3731f306018e38b093da3256aff Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:30 -0700 Subject: [PATCH 483/831] Made the server-side stream modules pass the type and doc linters. A Standalone Activity has no `workflow_id`, so opening its Workflow's stream now says that rather than sending `None` on the wire. `Optional` and `typing.Sequence` are deprecated spellings the linter rejects. --- temporalio/client_stream.py | 7 +++-- temporalio/contrib/server_streams/__init__.py | 29 +++++++++++-------- temporalio/streams/providers/native.py | 12 ++++++-- tests/test_client_stream.py | 2 +- tests/worker/test_workflow_stream.py | 13 +++++++-- tests/worker/test_workflow_stream_e2e.py | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1b5d953bd..8280b56d4 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,8 +23,9 @@ from __future__ import annotations +from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass -from typing import Any, AsyncIterator, Optional, Sequence +from typing import Any import google.protobuf.duration_pb2 @@ -102,8 +103,8 @@ async def create( self, stream_id: str, *, - retention: Optional[float] = None, - max_items: Optional[int] = None, + retention: float | None = None, + max_items: int | None = None, ) -> "StreamHandle": """Create a stream and return a handle to it. diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index b6db1fd7a..c15184bf4 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -20,16 +20,17 @@ from __future__ import annotations import asyncio +import builtins from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from datetime import timedelta -from typing import Any, Generic, Optional, TypeVar, overload +from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient, WorkflowStreamHandle -from temporalio.converter import DataConverter, PayloadConverter +from temporalio.converter import PayloadConverter __all__ = [ "RawPage", @@ -109,7 +110,7 @@ def _reject_configured_codec(client: Client) -> None: ) -def _decode(converter: PayloadConverter, body: bytes, as_type: Optional[type]) -> Any: +def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) if as_type is None: @@ -210,8 +211,9 @@ def subscribe( self, *, from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + # Spelled out because `type` in this class body is the property below. + result_type: builtins.type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[T]]: """Read this topic from ``from_offset`` onwards.""" return self._client.subscribe( @@ -236,7 +238,7 @@ def __init__( self._converter = converter self._batch_interval = batch_interval self._buffered: list[tuple[str, Any]] = [] - self._flusher: Optional[asyncio.Task[None]] = None + self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() @classmethod @@ -260,10 +262,13 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - client = activity.client() - return cls.create( - client, activity.info().workflow_id, batch_interval=batch_interval - ) + workflow_id = activity.info().workflow_id + if workflow_id is None: + raise RuntimeError( + "no Workflow stream to open: this Activity was not started by a " + "Workflow" + ) + return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -307,8 +312,8 @@ async def subscribe( *, topics: Sequence[str] = (), from_offset: int = 0, - result_type: Optional[type] = None, - poll_cooldown: Optional[timedelta] = None, + result_type: type | None = None, + poll_cooldown: timedelta | None = None, ) -> AsyncIterator[WorkflowStreamItem[Any]]: """Yield items from ``from_offset`` as they arrive. diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 1243d3784..53d231174 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -171,6 +171,7 @@ def __init__( producer_id: str, attempt: int, ) -> None: + """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle self._converter = converter self._topic = topic @@ -255,6 +256,7 @@ class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" def __init__(self, handle: Any, converter: Any) -> None: + """Read the stream ``handle`` names, from anywhere.""" self._handle = handle self._converter = converter @@ -297,6 +299,7 @@ async def read( ) async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() @@ -320,9 +323,12 @@ class _NativeProvider: name = "native" def configure(self, **options: Any) -> None: - """Nothing to name: the streams are on the server the client is - already connected to. It exists so a process that switches providers - changes one call rather than its structure.""" + """Take no options. + + The streams are on the server the client is already connected to. + This exists so a process that switches providers changes one call + rather than its structure. + """ if options: raise TypeError( f"the native provider takes no options, got {sorted(options)}" diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index f7df3c7a7..8d1a42f30 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -14,7 +14,7 @@ import asyncio import os import uuid -from typing import AsyncIterator +from collections.abc import AsyncIterator import pytest diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 40d6fdf45..1d154b37c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -9,6 +9,7 @@ from __future__ import annotations import asyncio +from typing import Any import pytest @@ -84,6 +85,12 @@ def __init__(self) -> None: def _assert_not_read_only(self, action: str) -> None: self.read_only_calls.append(action) + async def read(self, stream: str, max_messages: int) -> list[bytes]: + instance: Any = self + return await _WorkflowInstanceImpl.workflow_read_stream( + instance, stream, max_messages + ) + @pytest.mark.parametrize("max_messages", [1, 2, 5]) async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: @@ -92,14 +99,14 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b) for b in bodies]) - got = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", max_messages) + got = await stub.read("s", max_messages) assert got == bodies[:max_messages] # Whatever the cap left behind has to still be there: nothing resends it. assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) if len(stub._stream_buffers["s"]): - rest = await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + rest = await stub.read("s", 0) assert got + rest == bodies else: assert got == bodies @@ -112,5 +119,5 @@ async def test_read_is_refused_in_a_read_only_context() -> None: stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await _WorkflowInstanceImpl.workflow_read_stream(stub, "s", 0) + await stub.read("s", 0) assert stub.read_only_calls == ["read stream"] diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 00d0dfa85..3ee38fef3 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -104,7 +104,7 @@ def __init__(self) -> None: async def run(self) -> int: published = 0 while True: - await workflow.wait_condition(lambda: self._pending or self._done) + await workflow.wait_condition(lambda: bool(self._pending) or self._done) while self._pending: workflow.add_stream_messages([self._pending.pop(0).encode()]) published += 1 From facbf7118c5e27f09ddd4f1d189346601ae5a380 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:02:38 -0700 Subject: [PATCH 484/831] Added the changelog entry for server-side streams. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c74bdf72a..06323a5cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,13 @@ to include examples, links to docs, or any other relevant information. is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: server-side streams. A workflow reads a stream the server + delivers on its Workflow Tasks and publishes with a command, through + `temporalio.workflow.read_stream`, `subscribe_stream` and + `add_stream_messages`. `temporalio.client_stream` and + `temporalio.contrib.server_streams` reach the same stream from outside a + workflow, and `temporalio.streams.providers.native` puts it behind the shared + stream interface. Requires a server that serves the stream service. ### Changed From 014c37cc8437d9e7b00a53c00cfb8ba279af84d3 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:45:15 -0700 Subject: [PATCH 485/831] Regenerated the vendored stream protos for protobuf 3. This package has to load on a protobuf 3 runtime, and generated code refuses to load on a runtime older than the one it was built against. The protoc of that generation has no `--pyi_out`, so the stubs come from `mypy-protobuf`, which is what the other generated protos already use. --- scripts/gen_stream_protos.py | 7 +- temporalio/api/streamservice/v1/__init__.py | 16 + .../api/streamservice/v1/message_pb2.py | 97 +- .../api/streamservice/v1/message_pb2.pyi | 215 +- .../api/streamservice/v1/message_pb2_grpc.py | 22 +- .../api/streamservice/v1/message_pb2_grpc.pyi | 4 + .../streamservice/v1/request_response_pb2.py | 993 +++++++- .../streamservice/v1/request_response_pb2.pyi | 2201 +++++++++++++---- .../v1/request_response_pb2_grpc.py | 22 +- .../v1/request_response_pb2_grpc.pyi | 4 + .../api/streamservice/v1/service_pb2.py | 40 +- .../api/streamservice/v1/service_pb2.pyi | 11 +- .../api/streamservice/v1/service_pb2_grpc.py | 751 +++--- .../api/streamservice/v1/service_pb2_grpc.pyi | 195 ++ .../api/streamservice/v1/stream_state_pb2.py | 160 +- .../api/streamservice/v1/stream_state_pb2.pyi | 525 +++- .../streamservice/v1/stream_state_pb2_grpc.py | 22 +- .../v1/stream_state_pb2_grpc.pyi | 4 + temporalio/client_stream.py | 4 +- 19 files changed, 4085 insertions(+), 1208 deletions(-) create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index f57ff6177..6b6487294 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -9,7 +9,9 @@ Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf runtime this package has to load on. Generated code refuses to load on a runtime older than the one it was built against, and these modules end up in -applications that pin protobuf themselves. +applications that pin protobuf themselves. The stubs come from +``mypy-protobuf`` rather than protoc's own ``--pyi_out``, which that +generation of protoc does not have. Two rewrites make the copies compile against this SDK. The server's own routing and API-category options are dropped, because they mean nothing to a @@ -119,8 +121,9 @@ def main() -> None: f"--proto_path={work}", f"--proto_path={api_proto_path()}", f"--python_out={out}", - f"--pyi_out={out}", f"--grpc_python_out={out}", + f"--mypy_out={out}", + f"--mypy_grpc_out={out}", *targets, ], check=True, diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 31f99bded..7e2ebef29 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -28,6 +28,10 @@ AddWorkflowMessagesInput, AddWorkflowMessagesRequest, AddWorkflowMessagesResponse, + AdvanceConsumerHeadInput, + AdvanceConsumerHeadOutput, + AdvanceConsumerHeadRequest, + AdvanceConsumerHeadResponse, CloseStreamInput, CloseStreamOutput, CloseStreamRequest, @@ -62,6 +66,10 @@ PollWorkflowMessagesInput, PollWorkflowMessagesRequest, PollWorkflowMessagesResponse, + RegisterStreamConsumerInput, + RegisterStreamConsumerOutput, + RegisterStreamConsumerRequest, + RegisterStreamConsumerResponse, StreamListEntry, SubscribeWorkflowInput, SubscribeWorkflowOutput, @@ -81,6 +89,10 @@ "AddWorkflowMessagesInput", "AddWorkflowMessagesRequest", "AddWorkflowMessagesResponse", + "AdvanceConsumerHeadInput", + "AdvanceConsumerHeadOutput", + "AdvanceConsumerHeadRequest", + "AdvanceConsumerHeadResponse", "CloseStreamInput", "CloseStreamOutput", "CloseStreamRequest", @@ -117,6 +129,10 @@ "PollWorkflowMessagesRequest", "PollWorkflowMessagesResponse", "ProducerCursor", + "RegisterStreamConsumerInput", + "RegisterStreamConsumerOutput", + "RegisterStreamConsumerRequest", + "RegisterStreamConsumerResponse", "STREAM_MESSAGE_KIND_DATA", "STREAM_MESSAGE_KIND_FLUSH", "STREAM_MESSAGE_KIND_UNSPECIFIED", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index b4fe8e68a..3bbd8718e 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -1,46 +1,83 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/message.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/message.proto' -) +from google.protobuf.internal import enum_type_wrapper + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ None: ... - BODY_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - TOPIC_FIELD_NUMBER: _ClassVar[int] - TOPIC_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - KIND_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - body: _message_pb2.Payload - metadata: _containers.MessageMap[str, _message_pb2.Payload] - topic: str - topic_sequence: int - kind: StreamMessageKind - offset: int - def __init__(self, body: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., metadata: _Optional[_Mapping[str, _message_pb2.Payload]] = ..., topic: _Optional[str] = ..., topic_sequence: _Optional[int] = ..., kind: _Optional[_Union[StreamMessageKind, str]] = ..., offset: _Optional[int] = ...) -> None: ... - -class StreamMessageBatch(_message.Message): - __slots__ = ("messages",) - MESSAGES_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[StreamMessage] - def __init__(self, messages: _Optional[_Iterable[_Union[StreamMessage, _Mapping]]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys +import typing + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamMessageKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamMessageKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamMessageKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 + STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 + STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 + """Producer signalling a delivery boundary. Carries no body and consumes an + offset like any other message. A consumer uses it to end a turn without + waiting out an idle timeout. + """ + +class StreamMessageKind( + _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper +): ... + +STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 +STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 +STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 +"""Producer signalling a delivery boundary. Carries no body and consumes an +offset like any other message. A consumer uses it to end a turn without +waiting out an idle timeout. +""" +global___StreamMessageKind = StreamMessageKind + +class StreamMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance. The server does not populate this today.""" + topic: builtins.str + topic_sequence: builtins.int + """Position within this topic. The global offset orders the whole stream; + this lets a consumer reason about one topic without decoding the rest. + """ + kind: global___StreamMessageKind.ValueType + offset: builtins.int + """Position in the whole stream, set on read and never stored. A consumer + that resumes at message granularity needs it, and a topic-filtered read + leaves gaps that make it underivable from the response alone. + """ + def __init__( + self, + *, + body: temporal.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporal.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + topic_sequence: builtins.int = ..., + kind: global___StreamMessageKind.ValueType = ..., + offset: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "offset", + b"offset", + "topic", + b"topic", + "topic_sequence", + b"topic_sequence", + ], + ) -> None: ... + +global___StreamMessage = StreamMessage + +class StreamMessageBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one log node. The server stores + this serialized and opaque; it decodes only to trim a partial first page or + to apply a topic filter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamMessage + ]: ... + def __init__( + self, + *, + messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["messages", b"messages"] + ) -> None: ... + +global___StreamMessageBatch = StreamMessageBatch diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py index b1383816d..bf947056a 100644 --- a/temporalio/api/streamservice/v1/message_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/message_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.pyi b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 60dafee45..b813e2dfc 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -1,138 +1,881 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/request_response.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/request_response.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2 -from temporalio.api.streamservice.v1 import stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto\"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t\"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03\"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08\"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t\"\x15\n\x13\x46inishWritingOutput\"~\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08\"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\xae\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08\"Z\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\"\xca\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03\"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState\"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\"\x13\n\x11\x43loseStreamOutput\"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03\"\x16\n\x14TruncateStreamOutput\"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteStreamOutput\"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput\"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput\"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput\"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput\"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput\"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput\"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput\"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput\"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput\"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput\"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput\"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput\"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput\"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput\"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput\"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput\"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput\"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput\"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput\"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput\"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput\"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput\"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z None: ... - -class CreateStreamOutput(_message.Message): - __slots__ = ("run_id",) - RUN_ID_FIELD_NUMBER: _ClassVar[int] - run_id: str - def __init__(self, run_id: _Optional[str] = ...) -> None: ... - -class AddMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "messages", "producer_id", "sequence", "expected_offset", "use_expected_offset", "owner_epoch") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - USE_EXPECTED_OFFSET_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - expected_offset: int - use_expected_offset: bool - owner_epoch: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ..., expected_offset: _Optional[int] = ..., use_expected_offset: bool = ..., owner_epoch: _Optional[int] = ...) -> None: ... - -class AddMessagesOutput(_message.Message): - __slots__ = ("first_offset", "next_offset", "count", "deduplicated") - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - DEDUPLICATED_FIELD_NUMBER: _ClassVar[int] - first_offset: int - next_offset: int - count: int - deduplicated: bool - def __init__(self, first_offset: _Optional[int] = ..., next_offset: _Optional[int] = ..., count: _Optional[int] = ..., deduplicated: bool = ...) -> None: ... - -class FinishWritingInput(_message.Message): - __slots__ = ("namespace", "stream_id", "producer_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - producer_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., producer_id: _Optional[str] = ...) -> None: ... - -class FinishWritingOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class SubscribeWorkflowInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "stream_id", "start_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - stream_id: str - start_offset: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., stream_id: _Optional[str] = ..., start_offset: _Optional[int] = ...) -> None: ... - -class SubscribeWorkflowOutput(_message.Message): - __slots__ = ("start_offset",) - START_OFFSET_FIELD_NUMBER: _ClassVar[int] - start_offset: int - def __init__(self, start_offset: _Optional[int] = ...) -> None: ... - -class PollMessagesInput(_message.Message): - __slots__ = ("namespace", "stream_id", "run_id", "from_offset", "max_messages", "topics", "wait_new_messages") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - run_id: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., run_id: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... - -class PollMessagesOutput(_message.Message): - __slots__ = ("messages", "next_offset", "head_offset", "closed", "close_reason") - MESSAGES_FIELD_NUMBER: _ClassVar[int] - NEXT_OFFSET_FIELD_NUMBER: _ClassVar[int] - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - next_offset: int - head_offset: int - closed: bool - close_reason: _message_pb2_1.Payload - def __init__(self, messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., next_offset: _Optional[int] = ..., head_offset: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... - -class DescribeStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... - -class PollWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "from_offset", "max_messages", "topics", "wait_new_messages") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - FROM_OFFSET_FIELD_NUMBER: _ClassVar[int] - MAX_MESSAGES_FIELD_NUMBER: _ClassVar[int] - TOPICS_FIELD_NUMBER: _ClassVar[int] - WAIT_NEW_MESSAGES_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - from_offset: int - max_messages: int - topics: _containers.RepeatedScalarFieldContainer[str] - wait_new_messages: bool - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., from_offset: _Optional[int] = ..., max_messages: _Optional[int] = ..., topics: _Optional[_Iterable[str]] = ..., wait_new_messages: bool = ...) -> None: ... - -class DescribeWorkflowStreamInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ...) -> None: ... - -class AddWorkflowMessagesInput(_message.Message): - __slots__ = ("namespace", "workflow_id", "stream_name", "messages", "producer_id", "sequence") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - STREAM_NAME_FIELD_NUMBER: _ClassVar[int] - MESSAGES_FIELD_NUMBER: _ClassVar[int] - PRODUCER_ID_FIELD_NUMBER: _ClassVar[int] - SEQUENCE_FIELD_NUMBER: _ClassVar[int] - namespace: str - workflow_id: str - stream_name: str - messages: _containers.RepeatedCompositeFieldContainer[_message_pb2.StreamMessage] - producer_id: str - sequence: int - def __init__(self, namespace: _Optional[str] = ..., workflow_id: _Optional[str] = ..., stream_name: _Optional[str] = ..., messages: _Optional[_Iterable[_Union[_message_pb2.StreamMessage, _Mapping]]] = ..., producer_id: _Optional[str] = ..., sequence: _Optional[int] = ...) -> None: ... - -class DescribeStreamOutput(_message.Message): - __slots__ = ("state",) - STATE_FIELD_NUMBER: _ClassVar[int] - state: _stream_state_pb2.StreamState - def __init__(self, state: _Optional[_Union[_stream_state_pb2.StreamState, _Mapping]] = ...) -> None: ... - -class CloseStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "reason") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - REASON_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - reason: _message_pb2_1.Payload - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., reason: _Optional[_Union[_message_pb2_1.Payload, _Mapping]] = ...) -> None: ... - -class CloseStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class TruncateStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id", "new_base_offset") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - NEW_BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - new_base_offset: int - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ..., new_base_offset: _Optional[int] = ...) -> None: ... - -class TruncateStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class DeleteStreamInput(_message.Message): - __slots__ = ("namespace", "stream_id") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - namespace: str - stream_id: str - def __init__(self, namespace: _Optional[str] = ..., stream_id: _Optional[str] = ...) -> None: ... - -class DeleteStreamOutput(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class CreateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CreateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CreateStreamInput, _Mapping]] = ...) -> None: ... - -class CreateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CreateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CreateStreamOutput, _Mapping]] = ...) -> None: ... - -class AddMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddMessagesInput, _Mapping]] = ...) -> None: ... - -class AddMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... - -class FinishWritingRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: FinishWritingInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[FinishWritingInput, _Mapping]] = ...) -> None: ... - -class FinishWritingResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: FinishWritingOutput - def __init__(self, frontend_response: _Optional[_Union[FinishWritingOutput, _Mapping]] = ...) -> None: ... - -class SubscribeWorkflowRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: SubscribeWorkflowInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[SubscribeWorkflowInput, _Mapping]] = ...) -> None: ... - -class SubscribeWorkflowResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: SubscribeWorkflowOutput - def __init__(self, frontend_response: _Optional[_Union[SubscribeWorkflowOutput, _Mapping]] = ...) -> None: ... - -class PollMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollMessagesInput, _Mapping]] = ...) -> None: ... - -class PollMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... - -class DescribeStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeStreamInput, _Mapping]] = ...) -> None: ... - -class DescribeStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... - -class PollWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: PollWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[PollWorkflowMessagesInput, _Mapping]] = ...) -> None: ... - -class PollWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: PollMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[PollMessagesOutput, _Mapping]] = ...) -> None: ... - -class DescribeWorkflowStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DescribeWorkflowStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DescribeWorkflowStreamInput, _Mapping]] = ...) -> None: ... - -class DescribeWorkflowStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DescribeStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DescribeStreamOutput, _Mapping]] = ...) -> None: ... - -class AddWorkflowMessagesRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: AddWorkflowMessagesInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[AddWorkflowMessagesInput, _Mapping]] = ...) -> None: ... - -class AddWorkflowMessagesResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: AddMessagesOutput - def __init__(self, frontend_response: _Optional[_Union[AddMessagesOutput, _Mapping]] = ...) -> None: ... - -class CloseStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: CloseStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[CloseStreamInput, _Mapping]] = ...) -> None: ... - -class CloseStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: CloseStreamOutput - def __init__(self, frontend_response: _Optional[_Union[CloseStreamOutput, _Mapping]] = ...) -> None: ... - -class TruncateStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: TruncateStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[TruncateStreamInput, _Mapping]] = ...) -> None: ... - -class TruncateStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: TruncateStreamOutput - def __init__(self, frontend_response: _Optional[_Union[TruncateStreamOutput, _Mapping]] = ...) -> None: ... - -class ListStreamsInput(_message.Message): - __slots__ = ("namespace", "page_size", "next_page_token", "query") - NAMESPACE_FIELD_NUMBER: _ClassVar[int] - PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - QUERY_FIELD_NUMBER: _ClassVar[int] - namespace: str - page_size: int - next_page_token: bytes - query: str - def __init__(self, namespace: _Optional[str] = ..., page_size: _Optional[int] = ..., next_page_token: _Optional[bytes] = ..., query: _Optional[str] = ...) -> None: ... - -class StreamListEntry(_message.Message): - __slots__ = ("stream_id", "run_id") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - stream_id: str - run_id: str - def __init__(self, stream_id: _Optional[str] = ..., run_id: _Optional[str] = ...) -> None: ... - -class ListStreamsOutput(_message.Message): - __slots__ = ("streams", "next_page_token") - STREAMS_FIELD_NUMBER: _ClassVar[int] - NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] - streams: _containers.RepeatedCompositeFieldContainer[StreamListEntry] - next_page_token: bytes - def __init__(self, streams: _Optional[_Iterable[_Union[StreamListEntry, _Mapping]]] = ..., next_page_token: _Optional[bytes] = ...) -> None: ... - -class ListStreamsRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: ListStreamsInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[ListStreamsInput, _Mapping]] = ...) -> None: ... - -class ListStreamsResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: ListStreamsOutput - def __init__(self, frontend_response: _Optional[_Union[ListStreamsOutput, _Mapping]] = ...) -> None: ... - -class DeleteStreamRequest(_message.Message): - __slots__ = ("namespace_id", "frontend_request") - NAMESPACE_ID_FIELD_NUMBER: _ClassVar[int] - FRONTEND_REQUEST_FIELD_NUMBER: _ClassVar[int] - namespace_id: str - frontend_request: DeleteStreamInput - def __init__(self, namespace_id: _Optional[str] = ..., frontend_request: _Optional[_Union[DeleteStreamInput, _Mapping]] = ...) -> None: ... - -class DeleteStreamResponse(_message.Message): - __slots__ = ("frontend_response",) - FRONTEND_RESPONSE_FIELD_NUMBER: _ClassVar[int] - frontend_response: DeleteStreamOutput - def __init__(self, frontend_response: _Optional[_Union[DeleteStreamOutput, _Mapping]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 +import temporalio.api.streamservice.v1.message_pb2 +import temporalio.api.streamservice.v1.stream_state_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CreateStreamInput(google.protobuf.message.Message): + """The frontend-facing shapes are defined here rather than in the public API + because streams have no public API yet. Keeping them in a nested + frontend_request mirrors the other CHASM libraries, so promoting them later + is a package move rather than a redesign. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def lifecycle( + self, + ) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + lifecycle: temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["lifecycle", b"lifecycle"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "lifecycle", + b"lifecycle", + "namespace", + b"namespace", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___CreateStreamInput = CreateStreamInput + +class CreateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + run_id: builtins.str + def __init__( + self, + *, + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["run_id", b"run_id"] + ) -> None: ... + +global___CreateStreamOutput = CreateStreamOutput + +class AddMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + USE_EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional. Supplying it skips resolving the stream's current run, which is + a persistence lookup on every call. CreateStream returns it. + """ + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Idempotency, all optional. Supply a producer identity and sequence, or an + expected offset, or neither and accept at-least-once. + """ + sequence: builtins.int + expected_offset: builtins.int + """Guarded by use_expected_offset because proto3 optional is not supported + by this repo's helper generator. + """ + use_expected_offset: builtins.bool + owner_epoch: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + expected_offset: builtins.int = ..., + use_expected_offset: builtins.bool = ..., + owner_epoch: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "expected_offset", + b"expected_offset", + "messages", + b"messages", + "namespace", + b"namespace", + "owner_epoch", + b"owner_epoch", + "producer_id", + b"producer_id", + "run_id", + b"run_id", + "sequence", + b"sequence", + "stream_id", + b"stream_id", + "use_expected_offset", + b"use_expected_offset", + ], + ) -> None: ... + +global___AddMessagesInput = AddMessagesInput + +class AddMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FIRST_OFFSET_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + DEDUPLICATED_FIELD_NUMBER: builtins.int + first_offset: builtins.int + next_offset: builtins.int + count: builtins.int + deduplicated: builtins.bool + """True when a retry matched a recorded sequence and nothing was appended.""" + def __init__( + self, + *, + first_offset: builtins.int = ..., + next_offset: builtins.int = ..., + count: builtins.int = ..., + deduplicated: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "count", + b"count", + "deduplicated", + b"deduplicated", + "first_offset", + b"first_offset", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___AddMessagesOutput = AddMessagesOutput + +class FinishWritingInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + producer_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + producer_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___FinishWritingInput = FinishWritingInput + +class FinishWritingOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___FinishWritingOutput = FinishWritingOutput + +class SubscribeWorkflowInput(google.protobuf.message.Message): + """Registers a Workflow as a consumer of a stream it owns. The cursor lands in + the Workflow's own state, so from then on each of its Workflow Tasks carries + the next range and records what it consumed. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Name of the stream within the Workflow, for a stream it owns.""" + stream_id: builtins.str + """Id of a standalone stream in another execution. Exactly one of this and + stream_name is set. + """ + start_offset: builtins.int + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___SubscribeWorkflowInput = SubscribeWorkflowInput + +class SubscribeWorkflowOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + start_offset: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["start_offset", b"start_offset"] + ) -> None: ... + +global___SubscribeWorkflowOutput = SubscribeWorkflowOutput + +class PollMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional, as on AddMessagesInput.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters by exact topic. Offsets are assigned over the unfiltered stream, so + next_offset advances past filtered-out messages too. + """ + wait_new_messages: builtins.bool + """When set and the reader is caught up, block until something arrives, the + stream closes, or the server's long-poll timeout elapses. A timeout returns + an empty response rather than an error, so the caller simply polls again. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + ], + ) -> None: ... + +global___PollMessagesInput = PollMessagesInput + +class PollMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGES_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + next_offset: builtins.int + head_offset: builtins.int + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + next_offset: builtins.int = ..., + head_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "closed", + b"closed", + "head_offset", + b"head_offset", + "messages", + b"messages", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___PollMessagesOutput = PollMessagesOutput + +class DescribeStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DescribeStreamInput = DescribeStreamInput + +class PollWorkflowMessagesInput(google.protobuf.message.Message): + """A stream a workflow owns lives inside that workflow's execution, so it has + no standalone id to address it by. It is named by its owner and its name + instead, and routed on the owner. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters as on PollMessagesInput.""" + wait_new_messages: builtins.bool + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___PollWorkflowMessagesInput = PollWorkflowMessagesInput + +class DescribeWorkflowStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput + +class AddWorkflowMessagesInput(google.protobuf.message.Message): + """Appending to a stream a workflow owns, from outside that workflow. The + workflow's own publishes ride its Workflow Task instead. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + MESSAGES_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + @property + def messages( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ]: ... + producer_id: builtins.str + """Optional idempotency, as on AddMessagesInput.""" + sequence: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + messages: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamMessage + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "messages", + b"messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AddWorkflowMessagesInput = AddWorkflowMessagesInput + +class DescribeStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATE_FIELD_NUMBER: builtins.int + @property + def state(self) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamState: ... + def __init__( + self, + *, + state: temporalio.api.streamservice.v1.stream_state_pb2.StreamState + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> None: ... + +global___DescribeStreamOutput = DescribeStreamOutput + +class CloseStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["reason", b"reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "reason", b"reason", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___CloseStreamInput = CloseStreamInput + +class CloseStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___CloseStreamOutput = CloseStreamOutput + +class TruncateStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + NEW_BASE_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + new_base_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + new_base_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "new_base_offset", + b"new_base_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___TruncateStreamInput = TruncateStreamInput + +class TruncateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___TruncateStreamOutput = TruncateStreamOutput + +class DeleteStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DeleteStreamInput = DeleteStreamInput + +class DeleteStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___DeleteStreamOutput = DeleteStreamOutput + +class CreateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CreateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CreateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CreateStreamRequest = CreateStreamRequest + +class CreateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CreateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CreateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CreateStreamResponse = CreateStreamResponse + +class AddMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddMessagesRequest = AddMessagesRequest + +class AddMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddMessagesResponse = AddMessagesResponse + +class FinishWritingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___FinishWritingInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___FinishWritingInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___FinishWritingRequest = FinishWritingRequest + +class FinishWritingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___FinishWritingOutput: ... + def __init__( + self, + *, + frontend_response: global___FinishWritingOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___FinishWritingResponse = FinishWritingResponse + +class SubscribeWorkflowRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___SubscribeWorkflowInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___SubscribeWorkflowInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___SubscribeWorkflowRequest = SubscribeWorkflowRequest + +class SubscribeWorkflowResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___SubscribeWorkflowOutput: ... + def __init__( + self, + *, + frontend_response: global___SubscribeWorkflowOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___SubscribeWorkflowResponse = SubscribeWorkflowResponse + +class PollMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollMessagesRequest = PollMessagesRequest + +class PollMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollMessagesResponse = PollMessagesResponse + +class DescribeStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeStreamRequest = DescribeStreamRequest + +class DescribeStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeStreamResponse = DescribeStreamResponse + +class PollWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollWorkflowMessagesRequest = PollWorkflowMessagesRequest + +class PollWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollWorkflowMessagesResponse = PollWorkflowMessagesResponse + +class DescribeWorkflowStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeWorkflowStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeWorkflowStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeWorkflowStreamRequest = DescribeWorkflowStreamRequest + +class DescribeWorkflowStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeWorkflowStreamResponse = DescribeWorkflowStreamResponse + +class RegisterStreamConsumerInput(google.protobuf.message.Message): + """Registering a consumer on a stream in another execution. Split out from + SubscribeWorkflow because the two halves live on different shards: the pin + goes on the stream, the cursor goes on the consuming workflow, and a handler + can only reach the shard it was routed to. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + consumer_workflow_id: builtins.str + """The workflow that will consume, which names the pin.""" + start_offset: builtins.int + """Negative means from wherever the stream is when the pin is taken. Resolved + here, where the frontier is, and returned so the cursor records a fact. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + consumer_workflow_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_workflow_id", + b"consumer_workflow_id", + "namespace", + b"namespace", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___RegisterStreamConsumerInput = RegisterStreamConsumerInput + +class RegisterStreamConsumerOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + start_offset: builtins.int + collection_id: builtins.str + """What the consumer needs to address the log, all decided by the stream.""" + bucket_size: builtins.int + known_head: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + known_head: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "known_head", + b"known_head", + "start_offset", + b"start_offset", + ], + ) -> None: ... + +global___RegisterStreamConsumerOutput = RegisterStreamConsumerOutput + +class AdvanceConsumerHeadInput(google.protobuf.message.Message): + """Telling one consumer that the frontier moved. Routed to the consumer, which + is not where the stream lives. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """The run that subscribed. A successor from continue-as-new holds no cursor + for this stream, so pushing the frontier at it would land nowhere. + """ + stream_id: builtins.str + head_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_id: builtins.str = ..., + head_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "head_offset", + b"head_offset", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_id", + b"stream_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput + +class AdvanceConsumerHeadOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput + +class AddWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddWorkflowMessagesRequest = AddWorkflowMessagesRequest + +class AddWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddWorkflowMessagesResponse = AddWorkflowMessagesResponse + +class RegisterStreamConsumerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___RegisterStreamConsumerInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___RegisterStreamConsumerInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___RegisterStreamConsumerRequest = RegisterStreamConsumerRequest + +class RegisterStreamConsumerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___RegisterStreamConsumerOutput: ... + def __init__( + self, + *, + frontend_response: global___RegisterStreamConsumerOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___RegisterStreamConsumerResponse = RegisterStreamConsumerResponse + +class AdvanceConsumerHeadRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AdvanceConsumerHeadInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AdvanceConsumerHeadInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AdvanceConsumerHeadRequest = AdvanceConsumerHeadRequest + +class AdvanceConsumerHeadResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AdvanceConsumerHeadOutput: ... + def __init__( + self, + *, + frontend_response: global___AdvanceConsumerHeadOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AdvanceConsumerHeadResponse = AdvanceConsumerHeadResponse + +class CloseStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CloseStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CloseStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CloseStreamRequest = CloseStreamRequest + +class CloseStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CloseStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CloseStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CloseStreamResponse = CloseStreamResponse + +class TruncateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___TruncateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___TruncateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___TruncateStreamRequest = TruncateStreamRequest + +class TruncateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___TruncateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___TruncateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___TruncateStreamResponse = TruncateStreamResponse + +class ListStreamsInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + QUERY_FIELD_NUMBER: builtins.int + namespace: builtins.str + page_size: builtins.int + next_page_token: builtins.bytes + query: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + page_size: builtins.int = ..., + next_page_token: builtins.bytes = ..., + query: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "next_page_token", + b"next_page_token", + "page_size", + b"page_size", + "query", + b"query", + ], + ) -> None: ... + +global___ListStreamsInput = ListStreamsInput + +class StreamListEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___StreamListEntry = StreamListEntry + +class ListStreamsOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAMS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + @property + def streams( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamListEntry + ]: ... + next_page_token: builtins.bytes + def __init__( + self, + *, + streams: collections.abc.Iterable[global___StreamListEntry] | None = ..., + next_page_token: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "next_page_token", b"next_page_token", "streams", b"streams" + ], + ) -> None: ... + +global___ListStreamsOutput = ListStreamsOutput + +class ListStreamsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___ListStreamsInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___ListStreamsInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___ListStreamsRequest = ListStreamsRequest + +class ListStreamsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___ListStreamsOutput: ... + def __init__( + self, + *, + frontend_response: global___ListStreamsOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___ListStreamsResponse = ListStreamsResponse + +class DeleteStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DeleteStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DeleteStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DeleteStreamRequest = DeleteStreamRequest + +class DeleteStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DeleteStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DeleteStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DeleteStreamResponse = DeleteStreamResponse diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py index 87cc91022..bf947056a 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/request_response_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py index 7f376c28e..432abfc5c 100644 --- a/temporalio/api/streamservice/v1/service_pb2.py +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -1,38 +1,34 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/service.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/service.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() -from temporalio.api.streamservice.v1 import request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2 +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xce\x12\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16RegisterStreamConsumer\x12H.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerResponse"\x00\x12\xa6\x01\n\x13\x41\x64vanceConsumerHead\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse\"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse\"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse\"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse\"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse\"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse\"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse\"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse\"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse\"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse\"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse\"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse\"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse\"\x00\x42>Z={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) + +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) class StreamServiceStub(object): @@ -35,70 +18,80 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.CreateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, + ) self.AddMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, + ) self.FinishWriting = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, + ) self.SubscribeWorkflow = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, + ) self.PollMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, + ) self.DescribeStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, + ) self.PollWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, + ) self.DescribeWorkflowStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, + ) self.AddWorkflowMessages = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, + ) + self.RegisterStreamConsumer = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + ) + self.AdvanceConsumerHead = channel.unary_unary( + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + ) self.CloseStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, + ) self.TruncateStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, + ) self.ListStreams = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, + ) self.DeleteStream = channel.unary_unary( - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', - request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, - response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, - _registered_method=True) + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", + request_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, + response_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, + ) class StreamServiceServicer(object): @@ -107,178 +100,204 @@ class StreamServiceServicer(object): def CreateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def FinishWriting(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def SubscribeWorkflow(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def PollWorkflowMessages(self, request, context): - """Routed on the owner, because the stream it reads has no id of its own. - """ + """Routed on the owner, because the stream it reads has no id of its own.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DescribeWorkflowStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def AddWorkflowMessages(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def RegisterStreamConsumer(self, request, context): + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def AdvanceConsumerHead(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def CloseStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def TruncateStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def ListStreams(self, request, context): """Served on the frontend only: it queries visibility rather than a stream, so there is no business ID to route on and nothing for a shard to answer. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def DeleteStream(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def add_StreamServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'CreateStream': grpc.unary_unary_rpc_method_handler( - servicer.CreateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, - ), - 'AddMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, - ), - 'FinishWriting': grpc.unary_unary_rpc_method_handler( - servicer.FinishWriting, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, - ), - 'SubscribeWorkflow': grpc.unary_unary_rpc_method_handler( - servicer.SubscribeWorkflow, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, - ), - 'PollMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, - ), - 'DescribeStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, - ), - 'PollWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.PollWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, - ), - 'DescribeWorkflowStream': grpc.unary_unary_rpc_method_handler( - servicer.DescribeWorkflowStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, - ), - 'AddWorkflowMessages': grpc.unary_unary_rpc_method_handler( - servicer.AddWorkflowMessages, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, - ), - 'CloseStream': grpc.unary_unary_rpc_method_handler( - servicer.CloseStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, - ), - 'TruncateStream': grpc.unary_unary_rpc_method_handler( - servicer.TruncateStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, - ), - 'ListStreams': grpc.unary_unary_rpc_method_handler( - servicer.ListStreams, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, - ), - 'DeleteStream': grpc.unary_unary_rpc_method_handler( - servicer.DeleteStream, - request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, - response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, - ), + "CreateStream": grpc.unary_unary_rpc_method_handler( + servicer.CreateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.SerializeToString, + ), + "AddMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.SerializeToString, + ), + "FinishWriting": grpc.unary_unary_rpc_method_handler( + servicer.FinishWriting, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.SerializeToString, + ), + "SubscribeWorkflow": grpc.unary_unary_rpc_method_handler( + servicer.SubscribeWorkflow, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.SerializeToString, + ), + "PollMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.SerializeToString, + ), + "DescribeStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.SerializeToString, + ), + "PollWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.PollWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.SerializeToString, + ), + "DescribeWorkflowStream": grpc.unary_unary_rpc_method_handler( + servicer.DescribeWorkflowStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.SerializeToString, + ), + "AddWorkflowMessages": grpc.unary_unary_rpc_method_handler( + servicer.AddWorkflowMessages, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.SerializeToString, + ), + "RegisterStreamConsumer": grpc.unary_unary_rpc_method_handler( + servicer.RegisterStreamConsumer, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.SerializeToString, + ), + "AdvanceConsumerHead": grpc.unary_unary_rpc_method_handler( + servicer.AdvanceConsumerHead, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.SerializeToString, + ), + "CloseStream": grpc.unary_unary_rpc_method_handler( + servicer.CloseStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.SerializeToString, + ), + "TruncateStream": grpc.unary_unary_rpc_method_handler( + servicer.TruncateStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.SerializeToString, + ), + "ListStreams": grpc.unary_unary_rpc_method_handler( + servicer.ListStreams, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.SerializeToString, + ), + "DeleteStream": grpc.unary_unary_rpc_method_handler( + servicer.DeleteStream, + request_deserializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.FromString, + response_serializer=temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - 'temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) + "temporal.server.chasm.lib.stream.proto.v1.StreamService", rpc_method_handlers + ) server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers('temporal.server.chasm.lib.stream.proto.v1.StreamService', rpc_method_handlers) - # This class is part of an EXPERIMENTAL API. +# This class is part of an EXPERIMENTAL API. class StreamService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def CreateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def CreateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CreateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CreateStreamResponse.FromString, options, @@ -289,23 +308,25 @@ def CreateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def AddMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddMessagesResponse.FromString, options, @@ -316,23 +337,25 @@ def AddMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def FinishWriting(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def FinishWriting( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/FinishWriting", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.FinishWritingResponse.FromString, options, @@ -343,23 +366,25 @@ def FinishWriting(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def SubscribeWorkflow(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def SubscribeWorkflow( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/SubscribeWorkflow", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.SubscribeWorkflowResponse.FromString, options, @@ -370,23 +395,25 @@ def SubscribeWorkflow(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def PollMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollMessagesResponse.FromString, options, @@ -397,23 +424,25 @@ def PollMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DescribeStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeStreamResponse.FromString, options, @@ -424,23 +453,25 @@ def DescribeStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def PollWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def PollWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/PollWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.PollWorkflowMessagesResponse.FromString, options, @@ -451,23 +482,25 @@ def PollWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DescribeWorkflowStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DescribeWorkflowStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DescribeWorkflowStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DescribeWorkflowStreamResponse.FromString, options, @@ -478,23 +511,25 @@ def DescribeWorkflowStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def AddWorkflowMessages(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def AddWorkflowMessages( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AddWorkflowMessages", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AddWorkflowMessagesResponse.FromString, options, @@ -505,23 +540,83 @@ def AddWorkflowMessages(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) + + @staticmethod + def RegisterStreamConsumer( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/RegisterStreamConsumer", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.RegisterStreamConsumerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) @staticmethod - def CloseStream(request, + def AdvanceConsumerHead( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/AdvanceConsumerHead", + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadRequest.SerializeToString, + temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.AdvanceConsumerHeadResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def CloseStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/CloseStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.CloseStreamResponse.FromString, options, @@ -532,23 +627,25 @@ def CloseStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def TruncateStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def TruncateStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/TruncateStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.TruncateStreamResponse.FromString, options, @@ -559,23 +656,25 @@ def TruncateStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def ListStreams(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def ListStreams( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/ListStreams", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.ListStreamsResponse.FromString, options, @@ -586,23 +685,25 @@ def ListStreams(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) @staticmethod - def DeleteStream(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): + def DeleteStream( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): return grpc.experimental.unary_unary( request, target, - '/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream', + "/temporal.server.chasm.lib.stream.proto.v1.StreamService/DeleteStream", temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamRequest.SerializeToString, temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2.DeleteStreamResponse.FromString, options, @@ -613,4 +714,4 @@ def DeleteStream(request, wait_for_ready, timeout, metadata, - _registered_method=True) + ) diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi new file mode 100644 index 000000000..1530074ec --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi @@ -0,0 +1,195 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import abc + +import grpc + +import temporalio.api.streamservice.v1.request_response_pb2 + +class StreamServiceStub: + def __init__(self, channel: grpc.Channel) -> None: ... + CreateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse, + ] + AddMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse, + ] + FinishWriting: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse, + ] + SubscribeWorkflow: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse, + ] + PollMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse, + ] + DescribeStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse, + ] + PollWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, + ] + """Routed on the owner, because the stream it reads has no id of its own.""" + DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, + ] + AddWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse, + ] + RegisterStreamConsumer: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse, + ] + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + AdvanceConsumerHead: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse, + ] + CloseStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse, + ] + TruncateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse, + ] + ListStreams: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse, + ] + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + DeleteStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse, + ] + +class StreamServiceServicer(metaclass=abc.ABCMeta): + @abc.abstractmethod + def CreateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse: ... + @abc.abstractmethod + def AddMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse: ... + @abc.abstractmethod + def FinishWriting( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse: ... + @abc.abstractmethod + def SubscribeWorkflow( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse + ): ... + @abc.abstractmethod + def PollMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse: ... + @abc.abstractmethod + def DescribeStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse + ): ... + @abc.abstractmethod + def PollWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: + """Routed on the owner, because the stream it reads has no id of its own.""" + @abc.abstractmethod + def DescribeWorkflowStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse: ... + @abc.abstractmethod + def AddWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse + ): ... + @abc.abstractmethod + def RegisterStreamConsumer( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse: + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + @abc.abstractmethod + def AdvanceConsumerHead( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse + ): ... + @abc.abstractmethod + def CloseStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse: ... + @abc.abstractmethod + def TruncateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse + ): ... + @abc.abstractmethod + def ListStreams( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse: + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + @abc.abstractmethod + def DeleteStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse: ... + +def add_StreamServiceServicer_to_server( + servicer: StreamServiceServicer, server: grpc.Server +) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 234fa94d0..2ce5a0451 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -1,22 +1,14 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# NO CHECKED-IN PROTOBUF GENCODE # source: temporalio/api/stream/v1/stream_state.proto -# Protobuf Python Version: 6.31.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import runtime_version as _runtime_version +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -_runtime_version.ValidateProtobufRuntimeVersion( - _runtime_version.Domain.PUBLIC, - 6, - 31, - 1, - '', - 'temporalio/api/stream/v1/stream_state.proto' -) + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -24,33 +16,119 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -from temporalio.api.common.v1 import message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\"\xfa\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x13\n\x0blast_txn_id\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01\"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08\"g\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\"\xca\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ None: ... - class ConsumersEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: ConsumerCursor - def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ConsumerCursor, _Mapping]] = ...) -> None: ... - HEAD_OFFSET_FIELD_NUMBER: _ClassVar[int] - BASE_OFFSET_FIELD_NUMBER: _ClassVar[int] - LAST_TXN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSED_FIELD_NUMBER: _ClassVar[int] - CLOSE_REASON_FIELD_NUMBER: _ClassVar[int] - OWNER_EPOCH_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - PRODUCERS_FIELD_NUMBER: _ClassVar[int] - CONSUMERS_FIELD_NUMBER: _ClassVar[int] - LIFECYCLE_FIELD_NUMBER: _ClassVar[int] - REDIRECT_RUN_ID_FIELD_NUMBER: _ClassVar[int] - CLOSE_TIME_FIELD_NUMBER: _ClassVar[int] - head_offset: int - base_offset: int - last_txn_id: int - closed: bool - close_reason: _message_pb2.Payload - owner_epoch: int - bucket_size: int - collection_id: str - producers: _containers.MessageMap[str, ProducerCursor] - consumers: _containers.MessageMap[str, ConsumerCursor] - lifecycle: StreamLifecycle - redirect_run_id: str - close_time: _timestamp_pb2.Timestamp - def __init__(self, head_offset: _Optional[int] = ..., base_offset: _Optional[int] = ..., last_txn_id: _Optional[int] = ..., closed: bool = ..., close_reason: _Optional[_Union[_message_pb2.Payload, _Mapping]] = ..., owner_epoch: _Optional[int] = ..., bucket_size: _Optional[int] = ..., collection_id: _Optional[str] = ..., producers: _Optional[_Mapping[str, ProducerCursor]] = ..., consumers: _Optional[_Mapping[str, ConsumerCursor]] = ..., lifecycle: _Optional[_Union[StreamLifecycle, _Mapping]] = ..., redirect_run_id: _Optional[str] = ..., close_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... - -class ProducerCursor(_message.Message): - __slots__ = ("seq", "first_offset", "count", "content_hash", "fenced") - SEQ_FIELD_NUMBER: _ClassVar[int] - FIRST_OFFSET_FIELD_NUMBER: _ClassVar[int] - COUNT_FIELD_NUMBER: _ClassVar[int] - CONTENT_HASH_FIELD_NUMBER: _ClassVar[int] - FENCED_FIELD_NUMBER: _ClassVar[int] - seq: int - first_offset: int - count: int - content_hash: bytes - fenced: bool - def __init__(self, seq: _Optional[int] = ..., first_offset: _Optional[int] = ..., count: _Optional[int] = ..., content_hash: _Optional[bytes] = ..., fenced: bool = ...) -> None: ... - -class ConsumerCursor(_message.Message): - __slots__ = ("workflow_id", "run_id", "offset", "active", "external") - WORKFLOW_ID_FIELD_NUMBER: _ClassVar[int] - RUN_ID_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - ACTIVE_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - workflow_id: str - run_id: str - offset: int - active: bool - external: bool - def __init__(self, workflow_id: _Optional[str] = ..., run_id: _Optional[str] = ..., offset: _Optional[int] = ..., active: bool = ..., external: bool = ...) -> None: ... - -class WorkflowStreamCursor(_message.Message): - __slots__ = ("stream_id", "collection_id", "bucket_size", "offset", "known_head", "external", "pending_from", "pending_to", "has_pending") - STREAM_ID_FIELD_NUMBER: _ClassVar[int] - COLLECTION_ID_FIELD_NUMBER: _ClassVar[int] - BUCKET_SIZE_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - KNOWN_HEAD_FIELD_NUMBER: _ClassVar[int] - EXTERNAL_FIELD_NUMBER: _ClassVar[int] - PENDING_FROM_FIELD_NUMBER: _ClassVar[int] - PENDING_TO_FIELD_NUMBER: _ClassVar[int] - HAS_PENDING_FIELD_NUMBER: _ClassVar[int] - stream_id: str - collection_id: str - bucket_size: int - offset: int - known_head: int - external: bool - pending_from: int - pending_to: int - has_pending: bool - def __init__(self, stream_id: _Optional[str] = ..., collection_id: _Optional[str] = ..., bucket_size: _Optional[int] = ..., offset: _Optional[int] = ..., known_head: _Optional[int] = ..., external: bool = ..., pending_from: _Optional[int] = ..., pending_to: _Optional[int] = ..., has_pending: bool = ...) -> None: ... - -class StreamLifecycle(_message.Message): - __slots__ = ("retention", "max_items") - RETENTION_FIELD_NUMBER: _ClassVar[int] - MAX_ITEMS_FIELD_NUMBER: _ClassVar[int] - retention: _duration_pb2.Duration - max_items: int - def __init__(self, retention: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_items: _Optional[int] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.duration_pb2 +import google.protobuf.internal.containers +import google.protobuf.message +import google.protobuf.timestamp_pb2 + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamState(google.protobuf.message.Message): + """Size is O(producers + consumers), never O(messages). Payload bytes live in + the log, not here, which is what keeps this off the CHASM partial-read path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class ProducersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ProducerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ProducerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + class ConsumersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ConsumerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ConsumerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + HEAD_OFFSET_FIELD_NUMBER: builtins.int + BASE_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + OWNER_EPOCH_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + PRODUCERS_FIELD_NUMBER: builtins.int + CONSUMERS_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + REDIRECT_RUN_ID_FIELD_NUMBER: builtins.int + CLOSE_TIME_FIELD_NUMBER: builtins.int + head_offset: builtins.int + """Visibility frontier. Readers never observe an offset at or past this.""" + base_offset: builtins.int + """Truncation floor. Offsets below this are gone.""" + closed: builtins.bool + @property + def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + owner_epoch: builtins.int + """Bumped on ownership change so a stale producer's write fails.""" + bucket_size: builtins.int + """Immutable once set. Offsets roll to a new log tree every bucket_size so no + single storage partition grows with the stream. + """ + collection_id: builtins.str + """Identity of the log this stream writes to. Bucket trees are derived from + it, so there is no per-bucket index to store. + """ + @property + def producers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ProducerCursor + ]: ... + @property + def consumers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ConsumerCursor + ]: ... + @property + def lifecycle(self) -> global___StreamLifecycle: ... + redirect_run_id: builtins.str + """Set when a successor run takes ownership, so an in-flight poll can follow + the chain instead of stalling on a superseded run. + """ + @property + def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: + """Wall-clock close time, used to schedule retention deletion.""" + def __init__( + self, + *, + head_offset: builtins.int = ..., + base_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + owner_epoch: builtins.int = ..., + bucket_size: builtins.int = ..., + collection_id: builtins.str = ..., + producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] + | None = ..., + consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] + | None = ..., + lifecycle: global___StreamLifecycle | None = ..., + redirect_run_id: builtins.str = ..., + close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "lifecycle", + b"lifecycle", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "base_offset", + b"base_offset", + "bucket_size", + b"bucket_size", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "closed", + b"closed", + "collection_id", + b"collection_id", + "consumers", + b"consumers", + "head_offset", + b"head_offset", + "lifecycle", + b"lifecycle", + "owner_epoch", + b"owner_epoch", + "producers", + b"producers", + "redirect_run_id", + b"redirect_run_id", + ], + ) -> None: ... + +global___StreamState = StreamState + +class ProducerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + CONTENT_HASH_FIELD_NUMBER: builtins.int + FENCED_FIELD_NUMBER: builtins.int + seq: builtins.int + first_offset: builtins.int + count: builtins.int + content_hash: builtins.bytes + """Distinguishes a genuine retry from a client reusing a sequence with + different content, which must be rejected rather than deduplicated. + """ + fenced: builtins.bool + """Set by FinishWriting. Ends this producer's writes without closing the + stream for anyone else. + """ + def __init__( + self, + *, + seq: builtins.int = ..., + first_offset: builtins.int = ..., + count: builtins.int = ..., + content_hash: builtins.bytes = ..., + fenced: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "content_hash", + b"content_hash", + "count", + b"count", + "fenced", + b"fenced", + "first_offset", + b"first_offset", + "seq", + b"seq", + ], + ) -> None: ... + +global___ProducerCursor = ProducerCursor + +class ConsumerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + ACTIVE_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + REPLAY_FLOOR_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + offset: builtins.int + """How far this consumer has read. Used to decide whether it needs waking, + not to decide what the stream may drop. + """ + active: builtins.bool + external: builtins.bool + """Set when the consumer is a workflow in another execution, which is the + only case that has to be told the frontier moved. A workflow consuming a + stream it owns sees that while closing its own transaction. + """ + replay_floor: builtins.int + """The oldest offset this consumer's History still depends on. + + It is where the subscription started, not where it has read to. A range + this consumer already consumed is recorded in its History and has to be + re-readable for the workflow to replay, so bytes below the read position + are exactly the ones a replay needs most. It stays put while the consumer + is active and is released when it deregisters. + """ + def __init__( + self, + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + offset: builtins.int = ..., + active: builtins.bool = ..., + external: builtins.bool = ..., + replay_floor: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "active", + b"active", + "external", + b"external", + "offset", + b"offset", + "replay_floor", + b"replay_floor", + "run_id", + b"run_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___ConsumerCursor = ConsumerCursor + +class WorkflowStreamCursor(google.protobuf.message.Message): + """A consuming Workflow's position in a stream. This lives in the consuming + Workflow's own state rather than on the stream, so advancing it commits in + the same transaction as the WorkflowTaskCompleted event that records the + range. Keeping it on the stream would make the advance a cross-execution + write, and a crash between the two would either redeliver or skip. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + COLLECTION_ID_FIELD_NUMBER: builtins.int + BUCKET_SIZE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + PENDING_FROM_FIELD_NUMBER: builtins.int + PENDING_TO_FIELD_NUMBER: builtins.int + HAS_PENDING_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + collection_id: builtins.str + """Enough to address the log without reading the stream component first.""" + bucket_size: builtins.int + offset: builtins.int + """Next offset to deliver.""" + known_head: builtins.int + """The stream's frontier as of the last delivery. A workflow consuming a + stream in another execution cannot read the real frontier while closing its + own transaction, so this is what tells it a capped slice left more behind. + """ + external: builtins.bool + """Set when the stream lives in another execution, which decides whether the + frontier is read locally or taken from known_head. + """ + pending_from: builtins.int + """The range attached to the Workflow Task currently in flight. Recorded on + the event that closes that task, then folded into offset. An empty range + is still recorded: a task where the subscription saw nothing is a fact + replay has to reproduce. + """ + pending_to: builtins.int + has_pending: builtins.bool + start_offset: builtins.int + """Where this subscription began reading. Retained separately from offset, + which advances, because replay has to tell "committed nothing yet" apart + from "the events recording what was committed are not in this page". + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + collection_id: builtins.str = ..., + bucket_size: builtins.int = ..., + offset: builtins.int = ..., + known_head: builtins.int = ..., + external: builtins.bool = ..., + pending_from: builtins.int = ..., + pending_to: builtins.int = ..., + has_pending: builtins.bool = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "bucket_size", + b"bucket_size", + "collection_id", + b"collection_id", + "external", + b"external", + "has_pending", + b"has_pending", + "known_head", + b"known_head", + "offset", + b"offset", + "pending_from", + b"pending_from", + "pending_to", + b"pending_to", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___WorkflowStreamCursor = WorkflowStreamCursor + +class StreamLifecycle(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RETENTION_FIELD_NUMBER: builtins.int + MAX_ITEMS_FIELD_NUMBER: builtins.int + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a closed stream stays readable before it is deleted.""" + max_items: builtins.int + """Cap on readable messages. Older whole buckets are reclaimed once the floor + passes them, so a capped stream has bounded storage. + """ + def __init__( + self, + *, + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_items: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["retention", b"retention"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_items", b"max_items", "retention", b"retention" + ], + ) -> None: ... + +global___StreamLifecycle = StreamLifecycle diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py index 4e128a2aa..bf947056a 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -1,24 +1,4 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" -import grpc -import warnings - - -GRPC_GENERATED_VERSION = '1.78.0' -GRPC_VERSION = grpc.__version__ -_version_not_supported = False -try: - from grpc._utilities import first_version_is_lower - _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) -except ImportError: - _version_not_supported = True - -if _version_not_supported: - raise RuntimeError( - f'The grpc package installed is at version {GRPC_VERSION},' - + ' but the generated code in temporalio/api/stream/v1/stream_state_pb2_grpc.py depends on' - + f' grpcio>={GRPC_GENERATED_VERSION}.' - + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' - + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' - ) +import grpc diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 8280b56d4..2de4cb4e0 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -77,7 +77,9 @@ def __init__(self, channel: Any, namespace: str) -> None: """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" self._channel = channel self._namespace = namespace - self._stub = service_pb2_grpc.StreamServiceStub(channel) + # The generated stub is typed for a synchronous channel. This client + # drives it over ``grpc.aio``, where every call is awaited. + self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod def connect(target_host: str, namespace: str = "default") -> "StreamClient": From 96f8b6cf4fa8d01ba545301323f956b6aa802093 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:44:45 -0700 Subject: [PATCH 486/831] Repinned Core to the finalized replay-slice branch. The stream client needs the replay slice lookahead fix that branch finished. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 3d1f82e66..f88f78c3f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 3d1f82e66d13d32ddc9edf461e28cdb8428cd409 +Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c From aee2eb313a0f8d7c376eca69b080b6f4578675c9 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 19:47:50 -0700 Subject: [PATCH 487/831] Qualified the LangGraph docstring's stream references. The new server_streams module gives WorkflowStream and WorkflowStreamClient a second definition, so pydoctor can no longer resolve the short names. --- temporalio/contrib/langgraph/_plugin.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/temporalio/contrib/langgraph/_plugin.py b/temporalio/contrib/langgraph/_plugin.py index 03881ca2a..1819c646d 100644 --- a/temporalio/contrib/langgraph/_plugin.py +++ b/temporalio/contrib/langgraph/_plugin.py @@ -104,11 +104,13 @@ class LangGraphPlugin(SimplePlugin): inherited default of either form. streaming_topic: When set, ``langgraph.config.get_stream_writer()`` inside a node publishes to this topic on the workflow's - :class:`WorkflowStream`. The workflow must construct - ``WorkflowStream()`` in its ``@workflow.init`` (the plugin's + :class:`temporalio.contrib.workflow_streams.WorkflowStream`. The + workflow must construct ``WorkflowStream()`` in its + ``@workflow.init`` (the plugin's interceptor verifies this on workflow start). Nodes with ``execute_in='activity'`` publish through - :class:`WorkflowStreamClient` (signal); nodes with + :class:`temporalio.contrib.workflow_streams.WorkflowStreamClient` + (signal); nodes with ``execute_in='workflow'`` publish synchronously to the in-workflow stream (no signal). streaming_batch_interval: How often the activity-side stream From eb3f3f8f07d1f46dbb1c54acd8603f9c322e333d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:28:27 -0700 Subject: [PATCH 488/831] Repinned Core to the WIT-aligned replay-slice head. That head matches upstream's nexus model WIT for the workflow-id policies, which the current generator requires. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index f88f78c3f..4076ef24f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit f88f78c3fb8acf81126ed23b0f843e29fabb1e9c +Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 From 23138d93c6fde0d0d98ca93799ca036b76f1cec8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 16 Sep 2026 23:30:52 -0700 Subject: [PATCH 489/831] Regenerated the bridge protos from the repinned Core. The generated module was missing the local-activity marker argument flag its own stub already declared, so the two disagreed about the message. --- .../workflow_commands_pb2.py | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 3374f951a..0d81e37f5 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -511,8 +511,8 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8977 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9065 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 _WORKFLOWCOMMAND._serialized_start = 556 _WORKFLOWCOMMAND._serialized_end = 2794 _ADDSTREAMMESSAGES._serialized_start = 2796 @@ -528,57 +528,57 @@ _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4644 + _SCHEDULELOCALACTIVITY._serialized_end = 4683 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4646 - _REQUESTCANCELACTIVITY._serialized_end = 4682 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4684 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4725 - _QUERYRESULT._serialized_start = 4728 - _QUERYRESULT._serialized_end = 4884 - _QUERYSUCCESS._serialized_start = 4886 - _QUERYSUCCESS._serialized_end = 4951 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4953 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5029 - _FAILWORKFLOWEXECUTION._serialized_start = 5031 - _FAILWORKFLOWEXECUTION._serialized_end = 5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5108 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6022 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 + _REQUESTCANCELACTIVITY._serialized_start = 4685 + _REQUESTCANCELACTIVITY._serialized_end = 4721 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 + _QUERYRESULT._serialized_start = 4767 + _QUERYRESULT._serialized_end = 4923 + _QUERYSUCCESS._serialized_start = 4925 + _QUERYSUCCESS._serialized_end = 4990 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 + _FAILWORKFLOWEXECUTION._serialized_start = 5070 + _FAILWORKFLOWEXECUTION._serialized_end = 5144 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6024 - _CANCELWORKFLOWEXECUTION._serialized_end = 6100 - _SETPATCHMARKER._serialized_start = 6102 - _SETPATCHMARKER._serialized_end = 6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6159 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7333 + _CANCELWORKFLOWEXECUTION._serialized_start = 6063 + _CANCELWORKFLOWEXECUTION._serialized_end = 6139 + _SETPATCHMARKER._serialized_start = 6141 + _SETPATCHMARKER._serialized_end = 6195 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5865 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5941 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7335 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7412 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7557 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7956 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7958 - _CANCELSIGNALWORKFLOW._serialized_end = 7993 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7995 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8096 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8098 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8177 - _UPDATERESPONSE._serialized_start = 8180 - _UPDATERESPONSE._serialized_end = 8390 - _SCHEDULENEXUSOPERATION._serialized_start = 8393 - _SCHEDULENEXUSOPERATION._serialized_end = 8931 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8881 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8931 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8933 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8975 + _CANCELSIGNALWORKFLOW._serialized_start = 7997 + _CANCELSIGNALWORKFLOW._serialized_end = 8032 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 + _UPDATERESPONSE._serialized_start = 8219 + _UPDATERESPONSE._serialized_end = 8429 + _SCHEDULENEXUSOPERATION._serialized_start = 8432 + _SCHEDULENEXUSOPERATION._serialized_end = 8970 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 # @@protoc_insertion_point(module_scope) From bf7039e3ab78aee6924c508cac75ad701c0acb83 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:21:21 -0700 Subject: [PATCH 490/831] Adapted the native provider to the interface changes. The append cursor names the last record and is None for a batch the server deduplicated, so the stream client reports what the server said about the append. Producer identity is resolved by the package, inbound frames carry no topic, and the inbound id comes from the shared helper. --- temporalio/client_stream.py | 47 ++++++++++++--- temporalio/streams/providers/native.py | 83 +++++++++++++------------- tests/test_client_stream.py | 11 +++- 3 files changed, 89 insertions(+), 52 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 2de4cb4e0..1cd775043 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -33,7 +33,28 @@ import temporalio.api.streamservice.v1 as stream from temporalio.api.streamservice.v1 import service_pb2_grpc -__all__ = ["Message", "Page", "StreamClient", "StreamHandle", "WorkflowStreamHandle"] +__all__ = [ + "Appended", + "Message", + "Page", + "StreamClient", + "StreamHandle", + "WorkflowStreamHandle", +] + + +@dataclass(frozen=True) +class Appended: + """Where one append landed. + + ``deduplicated`` says the server already held this producer's batch at + this sequence and wrote nothing; the offsets are then the original ones. + """ + + first_offset: int + next_offset: int + count: int + deduplicated: bool = False @dataclass(frozen=True) @@ -185,13 +206,14 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: - """Append messages and return the offset the first one landed at. + ) -> Appended: + """Append messages and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than - appending twice. Without them the append is at-least-once, which is - only the right trade when duplicates are harmless. + appending twice, and says so. Without them the append is + at-least-once, which is only the right trade when duplicates are + harmless. """ response = await self._stub.AddMessages( stream.AddMessagesRequest( @@ -214,7 +236,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -352,7 +374,7 @@ async def append( topic: str = "", producer_id: str = "", sequence: int = 0, - ) -> int: + ) -> Appended: """Append from outside the workflow, as :meth:`StreamHandle.append`. Batch where you can. The append costs one transition on the owning @@ -380,7 +402,7 @@ async def append( ) ) ) - return response.frontend_response.first_offset + return _appended(response.frontend_response) async def read( self, @@ -479,3 +501,12 @@ async def describe(self) -> stream.StreamState: ) ) return response.frontend_response.state + + +def _appended(out: stream.AddMessagesOutput) -> Appended: + return Appended( + first_offset=out.first_offset, + next_offset=out.next_offset, + count=out.count, + deduplicated=out.deduplicated, + ) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 53d231174..f886d467b 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -8,21 +8,25 @@ from __future__ import annotations import asyncio -from collections.abc import AsyncIterator +import logging +from collections.abc import AsyncGenerator from datetime import timedelta from typing import Any -from temporalio import activity, workflow +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.client_stream import StreamClient from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._ids import inbound_stream_id from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord _RUN_STATE = "__temporal_streams_state" +logger = logging.getLogger(__name__) + class _Fanout: """One server subscription, shared by every reader of that stream. @@ -104,18 +108,6 @@ async def publish(self, frame: bytes) -> None: workflow.add_stream_messages([frame], stream_id="", topic=self._topic) -def inbound_stream_id(workflow_id: str, stream: str) -> str: - """The server-side id of a workflow's inbound stream. - - A workflow names its streams relative to itself, so every provider can - address the same thing without workflow code knowing how it is stored. - Here that is a namespace-level stream id built from the pair, and the - workflow id rather than the run id because the stream has to survive - continue-as-new and reset. - """ - return f"{workflow_id}:{stream}" - - def _reject_configured_codec(client: Client) -> None: """Refuse a namespace whose payloads are meant to be encoded. @@ -200,8 +192,10 @@ def _provider_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: - """Append values and return where the first one landed.""" + async def append(self, *values: Any) -> Cursor | None: + """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + if not values: + return None frames = [] for value in values: frames.append( @@ -215,7 +209,7 @@ async def append(self, *values: Any) -> Cursor: ) ) self._sequence += 1 - offset = await self._handle.append( + appended = await self._handle.append( *frames, topic=self._topic, producer_id=self._provider_id, @@ -223,7 +217,9 @@ async def append(self, *values: Any) -> Cursor: # different job from telling readers that a new generation started. sequence=self._sequence - len(frames), ) - return Cursor(str(offset)) + if appended.deduplicated: + return None + return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: """Declare this stream complete.""" @@ -255,10 +251,16 @@ def _encode(self, value: Any) -> bytes: class NativeConsumer: """Reads a stream from outside workflow code, resumably.""" - def __init__(self, handle: Any, converter: Any) -> None: - """Read the stream ``handle`` names, from anywhere.""" + def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: + """Read the stream ``handle`` names, from anywhere. + + ``stream`` is the inbound name the caller used, empty for the owner's + stream; ``address`` is what the server calls it, for log lines. + """ self._handle = handle self._converter = converter + self._stream = stream + self._address = address async def read( self, @@ -266,12 +268,13 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records after ``after`` as they arrive. Applies the same supersession rule as a workflow reader, so a browser and a workflow watching one activity agree on which attempt is current. """ + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() async for message in self._handle.follow( from_offset=int(after.token) + 1 if after.token else 0 @@ -281,7 +284,11 @@ async def read( kind, frame_topic, source, attempt, sequence, body = _frame.decode( message.data ) - except ValueError: + except ValueError as error: + # Same answer as the workflow-side reader: skip and say so. + logger.warning( + "skipping record %s of stream %s: %s", cursor, self._address, error + ) continue if topic is not None and frame_topic != topic: continue @@ -373,22 +380,19 @@ async def producer( ) -> NativeProducer: """Open a producer on ``workflow_id``'s account. - ``stream`` names an inbound stream; with none, ``topic`` names a topic - on the stream the workflow publishes, which the server lets any - producer append to. Inside an activity, leave ``producer_id`` and - ``attempt`` unset: the activity's own id and attempt are the right - answer and are what let a reader tell a retry from a new generation. + ``stream`` names an inbound stream, a namespace-level stream the + server keys by the pair. With none, ``topic`` names a topic on the + stream the workflow publishes, which the server lets any producer + append to. An inbound record carries no topic: the stream's name is + its whole address. """ _reject_configured_codec(client) - if not producer_id: - producer_id = activity.info().activity_id - if not attempt: - attempt = activity.info().attempt streams = _stream_client(client) + converter = client.data_converter.payload_converter if not stream: return NativeProducer( streams.workflow_stream(workflow_id), - client.data_converter.payload_converter, + converter, topic, producer_id, attempt, @@ -404,13 +408,7 @@ async def producer( # exception. handle = streams.get(stream_id) _handles[stream_id] = handle - return NativeProducer( - handle, - client.data_converter.payload_converter, - stream, - producer_id, - attempt, - ) + return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( self, client: Client, *, workflow_id: str, stream: str = "" @@ -423,11 +421,14 @@ async def consumer( """ _reject_configured_codec(client) streams = _stream_client(client) + address = inbound_stream_id(workflow_id, stream) if stream: - handle: Any = streams.get(inbound_stream_id(workflow_id, stream)) + handle: Any = streams.get(address) else: handle = streams.workflow_stream(workflow_id) - return NativeConsumer(handle, client.data_converter.payload_converter) + return NativeConsumer( + handle, client.data_converter.payload_converter, stream, address + ) _provider.register("native", _NativeProvider) diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index 8d1a42f30..fde925cca 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -40,8 +40,10 @@ async def stream() -> AsyncIterator[StreamHandle]: async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - assert await stream.append(b"alpha", b"beta") == 0 - assert await stream.append(b"gamma") == 2 + first = await stream.append(b"alpha", b"beta") + assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) + assert not first.deduplicated + assert (await stream.append(b"gamma")).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: @@ -69,7 +71,10 @@ async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: first = await stream.append(b"once", producer_id="p1", sequence=1) retry = await stream.append(b"once", producer_id="p1", sequence=1) - assert first == retry == 0 + assert first.first_offset == retry.first_offset == 0 + assert not first.deduplicated + # The retry is told it wrote nothing, so a producer can report no position. + assert retry.deduplicated messages, _ = await stream.read() assert [m.data for m in messages] == [b"once"] From 07755d9ac298fa2f415642470fe22f300dc1a1cb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:26:36 -0700 Subject: [PATCH 491/831] Pinned native stream handles to a run and closed their channels. A handle on a workflow's stream resolves the run once when it opens, so a follower is not redirected to a successor's empty stream after continue-as-new. The channel cache is keyed by the loop object and closed through the provider's close hook, and latest() reads a missing stream as empty but lets every other failure through. --- temporalio/client_stream.py | 77 +++++++++++++++++++++++++- temporalio/streams/providers/native.py | 60 +++++++++++--------- 2 files changed, 108 insertions(+), 29 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 1cd775043..15760a980 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -23,6 +23,8 @@ from __future__ import annotations +import asyncio +import weakref from collections.abc import AsyncIterator, Sequence from dataclasses import dataclass from typing import Any @@ -40,6 +42,8 @@ "StreamClient", "StreamHandle", "WorkflowStreamHandle", + "close_shared_clients", + "shared_client", ] @@ -164,7 +168,7 @@ def get(self, stream_id: str) -> "StreamHandle": return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( - self, workflow_id: str, name: str = "" + self, workflow_id: str, name: str = "", *, owner_run_id: str = "" ) -> "WorkflowStreamHandle": """Open a stream a workflow publishes to. @@ -177,8 +181,13 @@ def workflow_stream( does not exist yet is not an error: it reads as empty and a :meth:`WorkflowStreamHandle.follow` parked on it wakes when the workflow publishes. + + ``owner_run_id`` pins the handle to one run of the workflow; see + :meth:`WorkflowStreamHandle.pin` for why a follower wants that. """ - return WorkflowStreamHandle(self._stub, self._namespace, workflow_id, name) + return WorkflowStreamHandle( + self._stub, self._namespace, workflow_id, name, owner_run_id + ) class StreamHandle: @@ -350,13 +359,19 @@ class WorkflowStreamHandle: """ def __init__( - self, stub: Any, namespace: str, workflow_id: str, name: str = "" + self, + stub: Any, + namespace: str, + workflow_id: str, + name: str = "", + owner_run_id: str = "", ) -> None: """Prefer :meth:`StreamClient.workflow_stream`.""" self._stub = stub self._namespace = namespace self._workflow_id = workflow_id self._name = name + self._owner_run_id = owner_run_id @property def workflow_id(self) -> str: @@ -368,6 +383,25 @@ def name(self) -> str: """Name the owner publishes under, empty for its default stream.""" return self._name + @property + def owner_run_id(self) -> str: + """The run this handle is pinned to, empty while it follows the current run.""" + return self._owner_run_id + + def pin(self, run_id: str) -> None: + """Address one run of the workflow from now on. + + Unpinned, every call resolves to whichever run is current. A follower + holding an offset from one run would then be redirected when the + workflow continues as new: the successor's stream starts empty at + offset zero, so the server reads the follower's offset as "caught up", + parks it until the successor has published that many records, and + then skips exactly that many. Pinned, the run's end shows up as + ``closed`` on the page, and the caller decides whether to follow the + successor from the beginning. + """ + self._owner_run_id = run_id + async def append( self, *messages: bytes, @@ -386,6 +420,7 @@ async def append( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, messages=[ stream.StreamMessage( @@ -418,6 +453,7 @@ async def read( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -460,12 +496,14 @@ async def poll( :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. + On a pinned handle ``closed`` also says the run has ended. """ response = await self._stub.PollWorkflowMessages( stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, max_messages=max_messages, @@ -496,6 +534,7 @@ async def describe(self) -> stream.StreamState: frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, stream_name=self._name, ) ) @@ -510,3 +549,35 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: count=out.count, deduplicated=out.deduplicated, ) + + +# One channel per loop, target and namespace, shared by every handle in the +# process. A channel is multiplexed and long lived, and callers open a handle +# per subscription, which would otherwise be a connection per subscription. The +# loop is the key because a grpc.aio channel belongs to the loop that made it, +# and it is held weakly so a loop that is gone cannot lend its channel to a +# successor that happens to reuse its id. +_shared: weakref.WeakKeyDictionary[ + asyncio.AbstractEventLoop, dict[tuple[str, str], StreamClient] +] = weakref.WeakKeyDictionary() + + +def shared_client(target_host: str, namespace: str) -> StreamClient: + """The process-wide client for ``target_host`` and ``namespace`` on this loop.""" + per_loop = _shared.setdefault(asyncio.get_running_loop(), {}) + key = (target_host, namespace) + existing = per_loop.get(key) + if existing is None: + existing = per_loop[key] = StreamClient.connect(target_host, namespace) + return existing + + +async def close_shared_clients() -> None: + """Close every shared client this loop opened. + + For a process that is done with streams, and for tests, which open a + loop per case and would otherwise leave a channel behind on each. + """ + per_loop = _shared.pop(asyncio.get_running_loop(), {}) + for client in per_loop.values(): + await client.close() diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index f886d467b..6dfdd4c25 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -13,10 +13,12 @@ from datetime import timedelta from typing import Any +import grpc + from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.client_stream import StreamClient +from temporalio.client_stream import StreamClient, close_shared_clients, shared_client from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._ids import inbound_stream_id @@ -126,24 +128,23 @@ def _reject_configured_codec(client: Client) -> None: # stream reuses the handle rather than asking the server to create it again. # The second create is answered correctly, and it is still a failed call the # server logs, which is noise an operator has to learn to ignore. -_handles: dict[str, Any] = {} +_handles: dict[tuple[str, str, str], Any] = {} -# One channel per target and namespace, shared by every handle in the process. -# A channel is multiplexed and long lived, and callers open a handle per -# subscription, which would otherwise be a connection per subscription. -_channels: dict[tuple[int, str, str], StreamClient] = {} +def _stream_client(client: Client) -> StreamClient: + return shared_client(client.service_client.config.target_host, client.namespace) -def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop as well: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _channels.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _channels[key] = existing - return existing +async def _owner_run(client: Client, workflow_id: str) -> str: + """The run whose stream a handle on ``workflow_id`` should address. + + Resolved once, when the handle opens. Left to the server, a follower whose + workflow continued as new would be redirected to the successor, whose + stream starts empty, and its offset read as "caught up" rather than as a + position on the run it was watching. A producer is pinned for the same + reason: an activity's output belongs to the run that scheduled it. + """ + return (await client.get_workflow_handle(workflow_id).describe()).run_id class NativeProducer: @@ -310,9 +311,12 @@ async def latest(self, *, topic: str | None = None) -> Cursor: del topic # one server-side log per stream, whatever the topic try: state = await self._handle.describe() - except Exception: + except grpc.aio.AioRpcError as error: # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. + # is the same answer as an empty one. Any other failure is not: + # a reader that took it for "empty" would replay the whole stream. + if error.code() is not grpc.StatusCode.NOT_FOUND: + raise return BEGINNING return ( Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING @@ -344,6 +348,10 @@ def configure(self, **options: Any) -> None: def worker_options(self) -> dict[str, Any]: return {} + async def close(self) -> None: + """Close the channels this process opened to the stream service.""" + await close_shared_clients() + def open_read( self, stream: str, @@ -390,15 +398,13 @@ async def producer( streams = _stream_client(client) converter = client.data_converter.payload_converter if not stream: - return NativeProducer( - streams.workflow_stream(workflow_id), - converter, - topic, - producer_id, - attempt, + handle: Any = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) ) + return NativeProducer(handle, converter, topic, producer_id, attempt) stream_id = inbound_stream_id(workflow_id, stream) - handle = _handles.get(stream_id) + key = (client.service_client.config.target_host, client.namespace, stream_id) + handle = _handles.get(key) if handle is None: try: handle = await streams.create(stream_id) @@ -407,7 +413,7 @@ async def producer( # stream it does not own is the ordinary case, not the # exception. handle = streams.get(stream_id) - _handles[stream_id] = handle + _handles[key] = handle return NativeProducer(handle, converter, topic, producer_id, attempt) async def consumer( @@ -425,7 +431,9 @@ async def consumer( if stream: handle: Any = streams.get(address) else: - handle = streams.workflow_stream(workflow_id) + handle = streams.workflow_stream( + workflow_id, owner_run_id=await _owner_run(client, workflow_id) + ) return NativeConsumer( handle, client.data_converter.payload_converter, stream, address ) From d8c2efd23e57e2af65c6454c9d4b4dde2042b39d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:28:14 -0700 Subject: [PATCH 492/831] Stopped the flusher without cancelling it and pinned the contrib client. A cancel landing inside the flusher's append unwound with the batch it had taken off the buffer. The client now asks it to stop and waits. The handle is pinned to the run it opened on, from the activity's own run id or one describe, and the channel cache is the shared one. --- temporalio/contrib/server_streams/__init__.py | 100 +++++++++++------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index c15184bf4..690402974 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -21,15 +21,15 @@ import asyncio import builtins -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass from datetime import timedelta from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, WorkflowStreamHandle +from temporalio.client import Client, WorkflowExecutionDescription +from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client from temporalio.converter import PayloadConverter __all__ = [ @@ -78,16 +78,15 @@ def _encode(converter: PayloadConverter, value: Any) -> bytes: The payload rather than the bare bytes, so the encoding metadata the consumer needs to decode into a type travels with it. - The codec chain is not applied. It cannot be applied here: a codec is async - and a Workflow publishing to a stream is not, so running one inside Workflow - code would be I/O on the Workflow thread. Regular payloads solve this in the - Worker, encoding on the way out and decoding on the way in, and a stream - needs the same plumbing before a codec can be honoured. - - It is not applied on the client path either, deliberately. Encoding one side - and not the other is worse than encoding neither: an Activity's messages - would reach a consuming Workflow as ciphertext it has no way to decode. - :func:`_reject_configured_codec` is what keeps that from happening quietly. + The codec chain is not applied here. Inside a Workflow it does not have to + be: the Worker runs the payload visitor with its codec over the commands + and activations, so a body that rides ``add_stream_messages`` is encoded + on the way out and one that arrives on ``deliver_stream_messages`` is + decoded on the way in, as every other payload is. The client path has no + such pass, and encoding one side but not the other is worse than encoding + neither: an Activity's messages would reach a consuming Workflow as + ciphertext it has no way to decode. :func:`_reject_configured_codec` + refuses a client with a codec until the client path applies one too. """ payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] return payload.SerializeToString() @@ -232,14 +231,22 @@ def __init__( handle: WorkflowStreamHandle, converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + *, + describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: - """Prefer :meth:`create` or :meth:`from_within_activity`.""" + """Prefer :meth:`create` or :meth:`from_within_activity`. + + ``describe`` is how an unpinned handle learns which run it follows; + see :meth:`WorkflowStreamHandle.pin`. + """ self._handle = handle self._converter = converter self._batch_interval = batch_interval + self._describe = describe self._buffered: list[tuple[str, Any]] = [] self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() + self._closed = False @classmethod def create( @@ -247,14 +254,24 @@ def create( client: Client, workflow_id: str, *, + owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, ) -> "WorkflowStreamClient": - """Open the stream owned by ``workflow_id``.""" + """Open the stream owned by ``workflow_id``. + + Without ``owner_run_id`` the current run is looked up on the first + call and the handle pinned to it, so a reader following across a + continue-as-new sees the run end rather than being moved to the + successor's stream at a stale offset. + """ _reject_configured_codec(client) return cls( - _stream_client(client).workflow_stream(workflow_id), + _stream_client(client).workflow_stream( + workflow_id, owner_run_id=owner_run_id + ), client.data_converter.payload_converter, batch_interval, + describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod @@ -262,13 +279,20 @@ def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL ) -> "WorkflowStreamClient": """Open the stream owned by the Workflow that scheduled this Activity.""" - workflow_id = activity.info().workflow_id - if workflow_id is None: + info = activity.info() + if info.workflow_id is None: raise RuntimeError( "no Workflow stream to open: this Activity was not started by a " "Workflow" ) - return cls.create(activity.client(), workflow_id, batch_interval=batch_interval) + # The Activity's output belongs to the run that scheduled it, and the + # Activity already knows which run that is. + return cls.create( + activity.client(), + info.workflow_id, + owner_run_id=info.workflow_run_id or "", + batch_interval=batch_interval, + ) async def __aenter__(self) -> "WorkflowStreamClient": """Start the background flusher.""" @@ -279,17 +303,22 @@ async def __aexit__(self, *_exc: object) -> None: """Drain what is buffered before letting the caller go. An Activity that returned with a batch still buffered would have - reported work its readers never saw. + reported work its readers never saw. The flusher is asked to stop + rather than cancelled: a cancel landing inside its append would + unwind with the batch it had already taken off the buffer. """ + self._closed = True + self._wake.set() if self._flusher is not None: - self._flusher.cancel() - try: - await self._flusher - except asyncio.CancelledError: - pass + await self._flusher self._flusher = None await self.flush() + async def _pin(self) -> None: + if self._handle.owner_run_id or self._describe is None: + return + self._handle.pin((await self._describe()).run_id) + @overload def topic(self, name: str) -> TopicHandle[Any]: ... @@ -305,6 +334,7 @@ async def get_offset(self) -> int: A reader that wants only what comes next starts here. """ + await self._pin() return (await self._handle.describe()).head_offset async def subscribe( @@ -321,6 +351,7 @@ async def subscribe( to re-ask; the server parks this read until something arrives. """ del poll_cooldown + await self._pin() async for message in self._handle.follow( from_offset=from_offset, topics=topics ): @@ -342,6 +373,7 @@ async def poll_raw( For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. """ + await self._pin() page = await self._handle.poll( from_offset=from_offset, topics=topics, wait=wait ) @@ -360,6 +392,7 @@ async def flush(self) -> None: pending, self._buffered = self._buffered, [] if not pending: return + await self._pin() # One append per topic, because a batch carries a single topic. The # harness case is one topic, so this is one append. by_topic: dict[str, list[bytes]] = {} @@ -376,7 +409,7 @@ def _flush_soon(self) -> None: async def _run_flusher(self) -> None: """Append on a fixed cadence, so a slow producer still gets delivered.""" - while True: + while not self._closed: try: await asyncio.wait_for( self._wake.wait(), self._batch_interval.total_seconds() @@ -387,18 +420,5 @@ async def _run_flusher(self) -> None: await self.flush() -# One channel per target, shared by every handle in the process. The channel is -# multiplexed and long-lived, and callers here open a client per subscription, -# which would otherwise be a connection per subscription. -_clients: dict[tuple[int, str, str], StreamClient] = {} - - def _stream_client(client: Client) -> StreamClient: - target = client.service_client.config.target_host - # Keyed on the loop too: a gRPC channel belongs to the loop that made it. - key = (id(asyncio.get_event_loop()), target, client.namespace) - existing = _clients.get(key) - if existing is None: - existing = StreamClient.connect(target, client.namespace) - _clients[key] = existing - return existing + return shared_client(client.service_client.config.target_host, client.namespace) From aa803f21dd046febcea7c84de90a57f33665a855 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:23 -0700 Subject: [PATCH 493/831] Checked stream ranges for continuity and mirrored the byte limits. A range is recorded as consumed once and never resent, so a repeated, skipped or mis-sized delivery would hand the workflow duplicate or shifted bodies with nothing to say so. The worker also refuses a publish over the server's per-message and per-batch byte limits before the command exists, for the reason the count limit already gave. --- temporalio/worker/_workflow_instance.py | 53 +++++++++++++--- tests/worker/test_workflow_stream.py | 84 +++++++++++++++++++++++-- 2 files changed, 123 insertions(+), 14 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 66833dd8c..0a17d2b22 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -273,10 +273,12 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Matches the server's per-batch limit. Rejecting here turns a wedged workflow, +# Match the server's per-batch limits. Rejecting here turns a wedged workflow, # which would replay and re-issue the same rejected command forever, into an # error the workflow author can see. _MAX_STREAM_MESSAGES_PER_BATCH = 1000 +_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +_MAX_STREAM_BATCH_BYTES = 2 << 20 class _StreamBuffer: @@ -288,15 +290,38 @@ class _StreamBuffer: dropped. """ - def __init__(self) -> None: + def __init__(self, stream_id: str = "") -> None: + self._stream_id = stream_id self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] self._waiters: list[asyncio.Future] = [] + # Where the next range has to start. Unknown until the first one + # arrives, because a subscription may start wherever the stream is and + # the server is the one that resolves that. + self._next_offset: int | None = None def extend( self, messages: Sequence[temporalio.api.stream.v1.StreamMessage], from_offset: int = 0, + to_offset: int | None = None, ) -> None: + if to_offset is None: + to_offset = from_offset + len(messages) + # A range is recorded as consumed once and never resent, so one that + # repeats, skips or mis-sizes would hand the workflow duplicate or + # shifted bodies with nothing to say so. Failing the task is what makes + # the fault visible. + if to_offset - from_offset != len(messages): + raise RuntimeError( + f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"for offsets [{from_offset}, {to_offset})" + ) + if self._next_offset is not None and from_offset != self._next_offset: + raise RuntimeError( + f"stream {self._stream_id!r} delivered offsets [{from_offset}, " + f"{to_offset}) but the last range ended at {self._next_offset}" + ) + self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. if not messages: @@ -1223,9 +1248,9 @@ def _apply_deliver_stream_messages( # Nothing subscribed. The range is already recorded as consumed and # will not be sent again, so buffering it is the only way a # subscription made later in the same task still sees it. - buffer = _StreamBuffer() + buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset) + buffer.extend(job.messages, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1393,9 +1418,9 @@ def get_info(self) -> temporalio.workflow.Info: def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: # Reissued on every replay, so the buffer has to exist before the first - # range arrives and the command has to be harmless the second time. The - # server treats a repeat subscription to the same stream as a no-op. - self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + # range arrives and the command has to be harmless the second time. A + # repeat subscription leaves the server-side cursor where it is. + self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) command = self._add_command() command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset @@ -1410,6 +1435,18 @@ def workflow_add_stream_messages( f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " f"got {len(messages)}" ) + total = 0 + for body in messages: + if len(body) > _MAX_STREAM_MESSAGE_BYTES: + raise ValueError( + f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " + f"bytes, got {len(body)}" + ) + total += len(body) + if total > _MAX_STREAM_BATCH_BYTES: + raise ValueError( + f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" + ) command = self._add_command() command.add_stream_messages.stream_id = stream_id for body in messages: @@ -1437,7 +1474,7 @@ async def workflow_read_stream_messages( # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. self._assert_not_read_only("read stream") - buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer()) + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) while not len(buffer): await buffer.wait_future() taken = buffer.take() diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 1d154b37c..93b596b8c 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -15,10 +15,14 @@ import temporalio.api.common.v1 import temporalio.api.stream.v1 as api_stream +from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( + _MAX_STREAM_BATCH_BYTES, + _MAX_STREAM_MESSAGE_BYTES, _StreamBuffer, _WorkflowInstanceImpl, ) +from temporalio.workflow import ReadOnlyContextError def message(body: bytes) -> api_stream.StreamMessage: @@ -78,12 +82,13 @@ class _ReadOnlyStub: workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages - def __init__(self) -> None: + def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} - self.read_only_calls: list[str] = [] + self._read_only = read_only def _assert_not_read_only(self, action: str) -> None: - self.read_only_calls.append(action) + if self._read_only: + raise ReadOnlyContextError(f"cannot {action} in a read-only context") async def read(self, stream: str, max_messages: int) -> list[bytes]: instance: Any = self @@ -115,9 +120,76 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> # A query activation carries no ranges, so a read there would wait on a future # nothing can resolve and the query would time out saying nothing. async def test_read_is_refused_in_a_read_only_context() -> None: - stub = _ReadOnlyStub() + stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() stub._stream_buffers["s"].extend([message(b"a")]) - await stub.read("s", 0) - assert stub.read_only_calls == ["read stream"] + with pytest.raises(ReadOnlyContextError, match="read stream"): + await stub.read("s", 0) + # Refused before the buffer was touched, so the range is still there for + # the task that is allowed to read it. + assert len(stub._stream_buffers["s"]) == 1 + + +# A range is recorded as consumed once and never resent, so the buffer is the +# only place a repeated, skipped or mis-sized delivery can still be noticed. +async def test_ranges_have_to_abut_the_last_one() -> None: + buffer = _StreamBuffer("s") + buffer.extend([message(b"a"), message(b"b")], 0, 2) + # An empty range moves the expectation too: the server recorded it. + buffer.extend([], 2, 2) + buffer.extend([message(b"c")], 2, 3) + assert [m.offset for m in buffer.take()] == [0, 1, 2] + + with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): + buffer.extend([message(b"c")], 2, 3) + with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): + buffer.extend([message(b"f")], 5, 6) + + +async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: + buffer = _StreamBuffer("s") + with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): + buffer.extend([message(b"a"), message(b"b")], 0, 1) + assert len(buffer) == 0 + + +class _CommandStub: + """Drives the real publish path and keeps the commands it issued.""" + + workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + def _add_command(self) -> WorkflowCommand: + command = WorkflowCommand() + self.commands.append(command) + return command + + def publish(self, *bodies: bytes) -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + + +# The server refuses an oversized publish, and a refused command is reissued +# on every replay, so the limits have to be applied before the command exists. +def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): + stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) + assert len(stub.commands) == 1 + + +def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) + stub.publish(half, half) + assert len(stub.commands) == 1 + + with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): + stub.publish(half, half, b"x") + assert len(stub.commands) == 1 From a6eedbcf23c97fbefeb2c2062ee1e32aa3a80f91 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:30:24 -0700 Subject: [PATCH 494/831] Corrected the subscribe docstring and two stale test comments. --- temporalio/workflow/_context.py | 7 ++++--- tests/contrib/test_server_streams.py | 2 -- tests/worker/test_workflow_stream_e2e.py | 7 ++----- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 450051456..57183aafb 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -971,9 +971,10 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: """Subscribe this workflow to a stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: the server treats - a second subscription to the same stream as a no-op, which is what makes - calling it on every replay harmless. + and :func:`read_stream` returns them. Safe to call again: a second + subscription to a stream this run already consumes does not move its + cursor, though it does write one event. Calling it on every replay is + harmless because replay matches the command to the event already recorded. Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index e1fe84c77..9b339dfe4 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -82,8 +82,6 @@ async def test_both_producers_reach_one_subscriber() -> None: Emitting.run, tokens, id=wf_id, task_queue=task_queue ) - # Subscribed before the Workflow has published anything, which is what - # a consumer attaching to a session does. # Subscribed before the Workflow has published anything, which is what # a consumer attaching to a session does. stream = WorkflowStreamClient.create(client, wf_id) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 3ee38fef3..31296b2c8 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -32,11 +32,8 @@ STREAM = "output" -# Event type numbers rather than names: this SDK's api protos predate both -# events, so the attributes arrive as unknown fields and only the type is -# readable here. The server's own tests are where the offsets are asserted. -EVENT_STREAM_SUBSCRIBED = 61 -EVENT_STREAM_MESSAGES_ADDED = 62 +EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED +EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED @workflow.defn From aa5f2c08c3218d4370f0cca4b751e5e191b9ccdc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:44:38 -0700 Subject: [PATCH 495/831] Repinned Core to the reviewed moe/AI-198-fix-replay-slice-lookahead head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 4076ef24f..a67781227 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 4076ef24fc9e731e01692d93162aa6c7241f1851 +Subproject commit a67781227a88df50a0617247d20d4908f96d4593 From 200a5c6cd64a676bbf777e6281e35d813ab3f6c9 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:47:29 -0700 Subject: [PATCH 496/831] Regenerated the bridge protos from the repinned Core. The native activation job and the two native commands moved to the field numbers the combined Core tree uses, so both trees agree. --- .../workflow_activation_pb2.py | 2 +- .../workflow_activation_pb2.pyi | 7 +++++- .../workflow_commands_pb2.py | 2 +- .../workflow_commands_pb2.pyi | 22 ++++++++++++------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index cd09b8b97..5df8ff627 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,7 +47,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x11 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 5245cd6fc..a6787024a 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -298,7 +298,12 @@ class WorkflowActivationJob(google.protobuf.message.Message): """A nexus operation resolved.""" @property def deliver_stream_messages(self) -> global___DeliverStreamMessages: - """A range of a stream the workflow subscribed to.""" + """17 to 20 are taken by the external stream jobs, which are developed + alongside this one and share this message. The number below is fixed + with that family and must not be reused. + + A range of a stream the workflow subscribed to. + """ @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0d81e37f5..44f658d1e 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x17 \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x18 \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index bcf1bf7eb..18b6e2ff9 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -181,7 +181,11 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property - def subscribe_stream(self) -> global___SubscribeStream: ... + def subscribe_stream(self) -> global___SubscribeStream: + """23 to 28 are taken by the external stream commands, which are developed + alongside these and share this message. The two numbers below are fixed + with that family and must not be reused. + """ @property def add_stream_messages(self) -> global___AddStreamMessages: ... def __init__( @@ -376,13 +380,7 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand class AddStreamMessages(google.protobuf.message.Message): - """Subscribe this workflow to a stream, so later Workflow Tasks carry the - ranges it has not consumed yet. - - The stream's addressing is resolved by the server. A workflow cannot look it - up without doing I/O, and a value it carried would be a reading rather than a - fact, so it could differ on replay. - Publish a batch of messages to a stream this workflow owns. + """Publish a batch of messages to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch @@ -420,6 +418,14 @@ class AddStreamMessages(google.protobuf.message.Message): global___AddStreamMessages = AddStreamMessages class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int From 837404cd2bc22888fb553e72451cf81a87426240 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:24:50 -0700 Subject: [PATCH 497/831] Repinned Core to the reviewed replay-slice head. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index a67781227..97cd17296 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit a67781227a88df50a0617247d20d4908f96d4593 +Subproject commit 97cd17296fcc6178407c770f96f354bcc4e9f540 From 6deaad66a57183d693d9df20bb4bee0b65939f11 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:31:31 -0700 Subject: [PATCH 498/831] Regenerated the bridge protos from the repinned Core. The activation job is now deliver_stream_records and the command append_stream_records, both carrying StreamRecord, so the payload visitor reaches each record's body and metadata. --- temporalio/bridge/_visitor.py | 26 +-- .../proto/workflow_activation/__init__.py | 4 +- .../workflow_activation_pb2.py | 116 ++++++------- .../workflow_activation_pb2.pyi | 34 ++-- .../proto/workflow_commands/__init__.py | 4 +- .../workflow_commands_pb2.py | 152 +++++++++--------- .../workflow_commands_pb2.pyi | 38 ++--- 7 files changed, 188 insertions(+), 186 deletions(-) diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index 77d1b6c7a..c04d1c60f 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,7 +308,7 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) - async def _visit_temporal_api_stream_v1_StreamMessage( + async def _visit_temporal_api_stream_v1_StreamRecord( self, fs: VisitorFunctions, o: Any ): if o.HasField("body"): @@ -316,11 +316,11 @@ async def _visit_temporal_api_stream_v1_StreamMessage( for v in o.metadata.values(): await self._visit_temporal_api_common_v1_Payload(fs, v) - async def _visit_coresdk_workflow_activation_DeliverStreamMessages( + async def _visit_coresdk_workflow_activation_DeliverStreamRecords( self, fs: VisitorFunctions, o: Any ): - for v in o.messages: - await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any @@ -367,9 +367,9 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) - elif o.HasField("deliver_stream_messages"): - await self._visit_coresdk_workflow_activation_DeliverStreamMessages( - fs, o.deliver_stream_messages + elif o.HasField("deliver_stream_records"): + await self._visit_coresdk_workflow_activation_DeliverStreamRecords( + fs, o.deliver_stream_records ) async def _visit_coresdk_workflow_activation_WorkflowActivation( @@ -510,11 +510,11 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) - async def _visit_coresdk_workflow_commands_AddStreamMessages( + async def _visit_coresdk_workflow_commands_AppendStreamRecords( self, fs: VisitorFunctions, o: Any ): - for v in o.messages: - await self._visit_temporal_api_stream_v1_StreamMessage(fs, v) + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any @@ -575,9 +575,9 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) - elif o.HasField("add_stream_messages"): - await self._visit_coresdk_workflow_commands_AddStreamMessages( - fs, o.add_stream_messages + elif o.HasField("append_stream_records"): + await self._visit_coresdk_workflow_commands_AppendStreamRecords( + fs, o.append_stream_records ) async def _visit_coresdk_workflow_completion_Success( diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index ae7639820..f17880890 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,6 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, - DeliverStreamMessages, + DeliverStreamRecords, DoUpdate, FireTimer, InitializeWorkflow, @@ -25,7 +25,7 @@ __all__ = [ "CancelWorkflow", - "DeliverStreamMessages", + "DeliverStreamRecords", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 5df8ff627..7f6d3e782 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -47,13 +47,13 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb7\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12U\n\x17\x64\x65liver_stream_messages\x18\x15 \x01(\x0b\x32\x32.coresdk.workflow_activation.DeliverStreamMessagesH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x8b\x01\n\x15\x44\x65liverStreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x37\n\x08messages\x18\x04 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_DELIVERSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["DeliverStreamMessages"] +_DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ "HeadersEntry" @@ -118,16 +118,16 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamMessages = _reflection.GeneratedProtocolMessageType( - "DeliverStreamMessages", +DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( + "DeliverStreamRecords", (_message.Message,), { - "DESCRIPTOR": _DELIVERSTREAMMESSAGES, + "DESCRIPTOR": _DELIVERSTREAMRECORDS, "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamMessages) + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamRecords) }, ) -_sym_db.RegisterMessage(DeliverStreamMessages) +_sym_db.RegisterMessage(DeliverStreamRecords) InitializeWorkflow = _reflection.GeneratedProtocolMessageType( "InitializeWorkflow", @@ -394,55 +394,55 @@ _WORKFLOWACTIVATION._serialized_start = 570 _WORKFLOWACTIVATION._serialized_end = 1116 _WORKFLOWACTIVATIONJOB._serialized_start = 1119 - _WORKFLOWACTIVATIONJOB._serialized_end = 2582 - _DELIVERSTREAMMESSAGES._serialized_start = 2585 - _DELIVERSTREAMMESSAGES._serialized_end = 2724 - _INITIALIZEWORKFLOW._serialized_start = 2727 - _INITIALIZEWORKFLOW._serialized_end = 4131 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _FIRETIMER._serialized_start = 4133 - _FIRETIMER._serialized_end = 4157 - _RESOLVEACTIVITY._serialized_start = 4159 - _RESOLVEACTIVITY._serialized_end = 4268 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4271 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4608 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4610 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4672 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4838 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4840 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4936 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4938 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5043 - _UPDATERANDOMSEED._serialized_start = 5045 - _UPDATERANDOMSEED._serialized_end = 5088 - _QUERYWORKFLOW._serialized_start = 5091 - _QUERYWORKFLOW._serialized_end = 5351 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _CANCELWORKFLOW._serialized_start = 5353 - _CANCELWORKFLOW._serialized_end = 5385 - _SIGNALWORKFLOW._serialized_start = 5388 - _SIGNALWORKFLOW._serialized_end = 5677 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4052 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4131 - _NOTIFYHASPATCH._serialized_start = 5679 - _NOTIFYHASPATCH._serialized_end = 5713 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5715 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5810 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5812 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5914 - _DOUPDATE._serialized_start = 5917 - _DOUPDATE._serialized_end = 6248 - _DOUPDATE_HEADERSENTRY._serialized_start = 4052 - _DOUPDATE_HEADERSENTRY._serialized_end = 4131 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6251 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6405 - _RESOLVENEXUSOPERATION._serialized_start = 6407 - _RESOLVENEXUSOPERATION._serialized_end = 6496 - _REMOVEFROMCACHE._serialized_start = 6499 - _REMOVEFROMCACHE._serialized_end = 6851 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6613 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6851 + _WORKFLOWACTIVATIONJOB._serialized_end = 2580 + _DELIVERSTREAMRECORDS._serialized_start = 2583 + _DELIVERSTREAMRECORDS._serialized_end = 2719 + _INITIALIZEWORKFLOW._serialized_start = 2722 + _INITIALIZEWORKFLOW._serialized_end = 4126 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _FIRETIMER._serialized_start = 4128 + _FIRETIMER._serialized_end = 4152 + _RESOLVEACTIVITY._serialized_start = 4154 + _RESOLVEACTIVITY._serialized_end = 4263 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4266 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4603 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4605 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4664 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4667 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4833 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4835 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4931 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4933 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5038 + _UPDATERANDOMSEED._serialized_start = 5040 + _UPDATERANDOMSEED._serialized_end = 5083 + _QUERYWORKFLOW._serialized_start = 5086 + _QUERYWORKFLOW._serialized_end = 5346 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _CANCELWORKFLOW._serialized_start = 5348 + _CANCELWORKFLOW._serialized_end = 5380 + _SIGNALWORKFLOW._serialized_start = 5383 + _SIGNALWORKFLOW._serialized_end = 5672 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _NOTIFYHASPATCH._serialized_start = 5674 + _NOTIFYHASPATCH._serialized_end = 5708 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5710 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5805 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5807 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5909 + _DOUPDATE._serialized_start = 5912 + _DOUPDATE._serialized_end = 6243 + _DOUPDATE_HEADERSENTRY._serialized_start = 4047 + _DOUPDATE_HEADERSENTRY._serialized_end = 4126 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6246 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6400 + _RESOLVENEXUSOPERATION._serialized_start = 6402 + _RESOLVENEXUSOPERATION._serialized_end = 6491 + _REMOVEFROMCACHE._serialized_start = 6494 + _REMOVEFROMCACHE._serialized_end = 6846 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6608 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6846 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index a6787024a..ac9ac13f7 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -236,7 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int - DELIVER_STREAM_MESSAGES_FIELD_NUMBER: builtins.int + DELIVER_STREAM_RECORDS_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -297,7 +297,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property - def deliver_stream_messages(self) -> global___DeliverStreamMessages: + def deliver_stream_records(self) -> global___DeliverStreamRecords: """17 to 20 are taken by the external stream jobs, which are developed alongside this one and share this message. The number below is fixed with that family and must not be reused. @@ -332,7 +332,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., - deliver_stream_messages: global___DeliverStreamMessages | None = ..., + deliver_stream_records: global___DeliverStreamRecords | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -340,8 +340,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -381,8 +381,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", - "deliver_stream_messages", - b"deliver_stream_messages", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -436,7 +436,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", - "deliver_stream_messages", + "deliver_stream_records", "remove_from_cache", ] | None @@ -444,7 +444,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob -class DeliverStreamMessages(google.protobuf.message.Message): +class DeliverStreamRecords(google.protobuf.message.Message): """Hand a workflow the next range of a stream it subscribed to. The range is delivered once, on the task the server decided it belongs to, @@ -461,7 +461,7 @@ class DeliverStreamMessages(google.protobuf.message.Message): STREAM_ID_FIELD_NUMBER: builtins.int FROM_OFFSET_FIELD_NUMBER: builtins.int TO_OFFSET_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int stream_id: builtins.str """Id of the stream this range came from.""" from_offset: builtins.int @@ -469,10 +469,10 @@ class DeliverStreamMessages(google.protobuf.message.Message): to_offset: builtins.int """Exclusive. Equal to from_offset when the subscription saw nothing.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage + temporalio.api.stream.v1.message_pb2.StreamRecord ]: ... def __init__( self, @@ -480,8 +480,8 @@ class DeliverStreamMessages(google.protobuf.message.Message): stream_id: builtins.str = ..., from_offset: builtins.int = ..., to_offset: builtins.int = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord ] | None = ..., ) -> None: ... @@ -490,8 +490,8 @@ class DeliverStreamMessages(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "from_offset", b"from_offset", - "messages", - b"messages", + "records", + b"records", "stream_id", b"stream_id", "to_offset", @@ -499,7 +499,7 @@ class DeliverStreamMessages(google.protobuf.message.Message): ], ) -> None: ... -global___DeliverStreamMessages = DeliverStreamMessages +global___DeliverStreamRecords = DeliverStreamRecords class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 44826f2da..9fb1c8f08 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,6 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, - AddStreamMessages, + AppendStreamRecords, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -30,7 +30,7 @@ __all__ = [ "ActivityCancellationType", - "AddStreamMessages", + "AppendStreamRecords", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 44f658d1e..5af8f0744 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xbe\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12K\n\x13\x61\x64\x64_stream_messages\x18\x1e \x01(\x0b\x32,.coresdk.workflow_commands.AddStreamMessagesH\x00\x42\t\n\x07variant"_\n\x11\x41\x64\x64StreamMessages\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x37\n\x08messages\x18\x02 \x03(\x0b\x32%.temporal.api.stream.v1.StreamMessage":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,7 +59,7 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_ADDSTREAMMESSAGES = DESCRIPTOR.message_types_by_name["AddStreamMessages"] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] _SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] @@ -135,16 +135,16 @@ ) _sym_db.RegisterMessage(WorkflowCommand) -AddStreamMessages = _reflection.GeneratedProtocolMessageType( - "AddStreamMessages", +AppendStreamRecords = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecords", (_message.Message,), { - "DESCRIPTOR": _ADDSTREAMMESSAGES, + "DESCRIPTOR": _APPENDSTREAMRECORDS, "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AddStreamMessages) + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AppendStreamRecords) }, ) -_sym_db.RegisterMessage(AddStreamMessages) +_sym_db.RegisterMessage(AppendStreamRecords) SubscribeStream = _reflection.GeneratedProtocolMessageType( "SubscribeStream", @@ -511,74 +511,74 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9016 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9104 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9020 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9108 _WORKFLOWCOMMAND._serialized_start = 556 - _WORKFLOWCOMMAND._serialized_end = 2794 - _ADDSTREAMMESSAGES._serialized_start = 2796 - _ADDSTREAMMESSAGES._serialized_end = 2891 - _SUBSCRIBESTREAM._serialized_start = 2893 - _SUBSCRIBESTREAM._serialized_end = 2951 - _STARTTIMER._serialized_start = 2953 - _STARTTIMER._serialized_end = 3036 - _CANCELTIMER._serialized_start = 3038 - _CANCELTIMER._serialized_end = 3064 - _SCHEDULEACTIVITY._serialized_start = 3067 - _SCHEDULEACTIVITY._serialized_end = 3891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3891 - _SCHEDULELOCALACTIVITY._serialized_start = 3894 - _SCHEDULELOCALACTIVITY._serialized_end = 4683 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3812 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3891 - _REQUESTCANCELACTIVITY._serialized_start = 4685 - _REQUESTCANCELACTIVITY._serialized_end = 4721 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4723 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4764 - _QUERYRESULT._serialized_start = 4767 - _QUERYRESULT._serialized_end = 4923 - _QUERYSUCCESS._serialized_start = 4925 - _QUERYSUCCESS._serialized_end = 4990 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4992 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5068 - _FAILWORKFLOWEXECUTION._serialized_start = 5070 - _FAILWORKFLOWEXECUTION._serialized_end = 5144 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5147 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6061 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELWORKFLOWEXECUTION._serialized_start = 6063 - _CANCELWORKFLOWEXECUTION._serialized_end = 6139 - _SETPATCHMARKER._serialized_start = 6141 - _SETPATCHMARKER._serialized_end = 6195 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6198 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7372 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5904 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5980 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7374 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7448 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7451 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7593 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7596 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7995 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3812 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3891 - _CANCELSIGNALWORKFLOW._serialized_start = 7997 - _CANCELSIGNALWORKFLOW._serialized_end = 8032 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8034 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8135 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8137 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8216 - _UPDATERESPONSE._serialized_start = 8219 - _UPDATERESPONSE._serialized_end = 8429 - _SCHEDULENEXUSOPERATION._serialized_start = 8432 - _SCHEDULENEXUSOPERATION._serialized_end = 8970 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8920 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8970 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8972 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9014 + _WORKFLOWCOMMAND._serialized_end = 2798 + _APPENDSTREAMRECORDS._serialized_start = 2800 + _APPENDSTREAMRECORDS._serialized_end = 2895 + _SUBSCRIBESTREAM._serialized_start = 2897 + _SUBSCRIBESTREAM._serialized_end = 2955 + _STARTTIMER._serialized_start = 2957 + _STARTTIMER._serialized_end = 3040 + _CANCELTIMER._serialized_start = 3042 + _CANCELTIMER._serialized_end = 3068 + _SCHEDULEACTIVITY._serialized_start = 3071 + _SCHEDULEACTIVITY._serialized_end = 3895 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3895 + _SCHEDULELOCALACTIVITY._serialized_start = 3898 + _SCHEDULELOCALACTIVITY._serialized_end = 4687 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3895 + _REQUESTCANCELACTIVITY._serialized_start = 4689 + _REQUESTCANCELACTIVITY._serialized_end = 4725 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4727 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4768 + _QUERYRESULT._serialized_start = 4771 + _QUERYRESULT._serialized_end = 4927 + _QUERYSUCCESS._serialized_start = 4929 + _QUERYSUCCESS._serialized_end = 4994 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4996 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5072 + _FAILWORKFLOWEXECUTION._serialized_start = 5074 + _FAILWORKFLOWEXECUTION._serialized_end = 5148 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5151 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6065 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELWORKFLOWEXECUTION._serialized_start = 6067 + _CANCELWORKFLOWEXECUTION._serialized_end = 6143 + _SETPATCHMARKER._serialized_start = 6145 + _SETPATCHMARKER._serialized_end = 6199 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6202 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7376 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7378 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7452 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7455 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7597 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7600 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7999 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELSIGNALWORKFLOW._serialized_start = 8001 + _CANCELSIGNALWORKFLOW._serialized_end = 8036 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8038 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8139 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8141 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8220 + _UPDATERESPONSE._serialized_start = 8223 + _UPDATERESPONSE._serialized_end = 8433 + _SCHEDULENEXUSOPERATION._serialized_start = 8436 + _SCHEDULENEXUSOPERATION._serialized_end = 8974 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8924 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8974 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8976 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9018 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 18b6e2ff9..b4848ddb1 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -105,7 +105,7 @@ class WorkflowCommand(google.protobuf.message.Message): SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int - ADD_STREAM_MESSAGES_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -187,7 +187,7 @@ class WorkflowCommand(google.protobuf.message.Message): with that family and must not be reused. """ @property - def add_stream_messages(self) -> global___AddStreamMessages: ... + def append_stream_records(self) -> global___AppendStreamRecords: ... def __init__( self, *, @@ -227,13 +227,13 @@ class WorkflowCommand(google.protobuf.message.Message): request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., subscribe_stream: global___SubscribeStream | None = ..., - add_stream_messages: global___AddStreamMessages | None = ..., + append_stream_records: global___AppendStreamRecords | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "add_stream_messages", - b"add_stream_messages", + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -289,8 +289,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "add_stream_messages", - b"add_stream_messages", + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -372,50 +372,52 @@ class WorkflowCommand(google.protobuf.message.Message): "schedule_nexus_operation", "request_cancel_nexus_operation", "subscribe_stream", - "add_stream_messages", + "append_stream_records", ] | None ): ... global___WorkflowCommand = WorkflowCommand -class AddStreamMessages(google.protobuf.message.Message): - """Publish a batch of messages to a stream this workflow owns. +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns. The bodies go to the stream's own log rather than into History, which gets one fixed-size event naming the offset range. That is what makes the batch - size free: a thousand messages cost the same in History as one. + size free: a thousand records cost the same in History as one. The server + stores each record with an empty producer id, because the workflow is the + producer here. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int stream_id: builtins.str """Empty means the workflow's default output stream.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.stream.v1.message_pb2.StreamMessage + temporalio.api.stream.v1.message_pb2.StreamRecord ]: ... def __init__( self, *, stream_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.stream.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord ] | None = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "messages", b"messages", "stream_id", b"stream_id" + "records", b"records", "stream_id", b"stream_id" ], ) -> None: ... -global___AddStreamMessages = AddStreamMessages +global___AppendStreamRecords = AppendStreamRecords class SubscribeStream(google.protobuf.message.Message): """Subscribe this workflow to a stream, so later Workflow Tasks carry the From f73490856ac2cfa0e59af95bd353c88d5cdb008b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:33:01 -0700 Subject: [PATCH 499/831] Regenerated the vendored stream service protos from the record server. --- temporalio/api/streamservice/v1/__init__.py | 34 +-- .../api/streamservice/v1/message_pb2.py | 62 +++-- .../api/streamservice/v1/message_pb2.pyi | 99 ++++---- .../streamservice/v1/request_response_pb2.py | 224 +++++++++--------- .../streamservice/v1/request_response_pb2.pyi | 123 ++++++---- .../api/streamservice/v1/stream_state_pb2.py | 42 ++-- .../api/streamservice/v1/stream_state_pb2.pyi | 93 +++++--- 7 files changed, 363 insertions(+), 314 deletions(-) diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 7e2ebef29..1e909c223 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -4,22 +4,9 @@ # is still defined in the server. See temporalio/client_stream.py. from .message_pb2 import ( - STREAM_MESSAGE_KIND_DATA, - STREAM_MESSAGE_KIND_FLUSH, - STREAM_MESSAGE_KIND_UNSPECIFIED, - StreamMessage, - StreamMessageBatch, - StreamMessageKind, + StreamRecord, + StreamRecordBatch, ) - -from .stream_state_pb2 import ( - ConsumerCursor, - ProducerCursor, - StreamLifecycle, - StreamState, - WorkflowStreamCursor, -) - from .request_response_pb2 import ( AddMessagesInput, AddMessagesOutput, @@ -80,6 +67,14 @@ TruncateStreamRequest, TruncateStreamResponse, ) +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamBudget, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) __all__ = [ "AddMessagesInput", @@ -133,14 +128,11 @@ "RegisterStreamConsumerOutput", "RegisterStreamConsumerRequest", "RegisterStreamConsumerResponse", - "STREAM_MESSAGE_KIND_DATA", - "STREAM_MESSAGE_KIND_FLUSH", - "STREAM_MESSAGE_KIND_UNSPECIFIED", + "StreamBudget", "StreamLifecycle", "StreamListEntry", - "StreamMessage", - "StreamMessageBatch", - "StreamMessageKind", + "StreamRecord", + "StreamRecordBatch", "StreamState", "SubscribeWorkflowInput", "SubscribeWorkflowOutput", diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index 3bbd8718e..8876ac29b 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -8,7 +8,6 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import enum_type_wrapper # @@protoc_insertion_point(imports) @@ -18,66 +17,61 @@ from temporalio.api.common.v1 import ( message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto"\xed\x02\n\rStreamMessage\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x08metadata\x18\x02 \x03(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.StreamMessage.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x16\n\x0etopic_sequence\x18\x04 \x01(\x03\x12J\n\x04kind\x18\x05 \x01(\x0e\x32<.temporal.server.chasm.lib.stream.proto.v1.StreamMessageKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"`\n\x12StreamMessageBatch\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage*u\n\x11StreamMessageKind\x12#\n\x1fSTREAM_MESSAGE_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18STREAM_MESSAGE_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_MESSAGE_KIND_FLUSH\x10\x02\x42>ZZ= (3, 10): +if sys.version_info >= (3, 8): import typing as typing_extensions else: import typing_extensions DESCRIPTOR: google.protobuf.descriptor.FileDescriptor -class _StreamMessageKind: - ValueType = typing.NewType("ValueType", builtins.int) - V: typing_extensions.TypeAlias = ValueType - -class _StreamMessageKindEnumTypeWrapper( - google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ - _StreamMessageKind.ValueType - ], - builtins.type, -): # noqa: F821 - DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor - STREAM_MESSAGE_KIND_UNSPECIFIED: _StreamMessageKind.ValueType # 0 - STREAM_MESSAGE_KIND_DATA: _StreamMessageKind.ValueType # 1 - STREAM_MESSAGE_KIND_FLUSH: _StreamMessageKind.ValueType # 2 - """Producer signalling a delivery boundary. Carries no body and consumes an - offset like any other message. A consumer uses it to end a turn without - waiting out an idle timeout. +class StreamRecord(google.protobuf.message.Message): + """The stored shape of temporal.api.stream.v1.StreamRecord plus the offset a + read assigns. Field for field the public record, so one crosses the frontend + in either direction without translation. """ -class StreamMessageKind( - _StreamMessageKind, metaclass=_StreamMessageKindEnumTypeWrapper -): ... - -STREAM_MESSAGE_KIND_UNSPECIFIED: StreamMessageKind.ValueType # 0 -STREAM_MESSAGE_KIND_DATA: StreamMessageKind.ValueType # 1 -STREAM_MESSAGE_KIND_FLUSH: StreamMessageKind.ValueType # 2 -"""Producer signalling a delivery boundary. Carries no body and consumes an -offset like any other message. A consumer uses it to end a turn without -waiting out an idle timeout. -""" -global___StreamMessageKind = StreamMessageKind - -class StreamMessage(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor class MetadataEntry(google.protobuf.message.Message): @@ -82,9 +54,11 @@ class StreamMessage(google.protobuf.message.Message): BODY_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int TOPIC_FIELD_NUMBER: builtins.int - TOPIC_SEQUENCE_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int KIND_FIELD_NUMBER: builtins.int OFFSET_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int @property def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... @property @@ -93,18 +67,29 @@ class StreamMessage(google.protobuf.message.Message): ) -> google.protobuf.internal.containers.MessageMap[ builtins.str, temporal.api.common.v1.message_pb2.Payload ]: - """Producer-supplied provenance. The server does not populate this today.""" + """Producer-supplied provenance, stored as sent.""" topic: builtins.str - topic_sequence: builtins.int - """Position within this topic. The global offset orders the whole stream; - this lets a consumer reason about one topic without decoding the rest. + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. Stored + as sent; the global offset is what orders the stream. + """ + kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType + """Settled to DATA on append when left unspecified, so a retry hashes the + same bytes and a reader never sees the zero value. """ - kind: global___StreamMessageKind.ValueType offset: builtins.int """Position in the whole stream, set on read and never stored. A consumer - that resumes at message granularity needs it, and a topic-filtered read + that resumes at record granularity needs it, and a topic-filtered read leaves gaps that make it underivable from the response alone. """ + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did: its publish + command clears the field, whatever the worker sent. + """ + attempt: builtins.int + """The producer's attempt, stored as sent. Readers treat a later attempt by + the same producer as superseding what the earlier one wrote. + """ def __init__( self, *, @@ -114,9 +99,11 @@ class StreamMessage(google.protobuf.message.Message): ] | None = ..., topic: builtins.str = ..., - topic_sequence: builtins.int = ..., - kind: global___StreamMessageKind.ValueType = ..., + sequence: builtins.int = ..., + kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType = ..., offset: builtins.int = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["body", b"body"] @@ -124,6 +111,8 @@ class StreamMessage(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "attempt", + b"attempt", "body", b"body", "kind", @@ -132,37 +121,39 @@ class StreamMessage(google.protobuf.message.Message): b"metadata", "offset", b"offset", + "producer_id", + b"producer_id", + "sequence", + b"sequence", "topic", b"topic", - "topic_sequence", - b"topic_sequence", ], ) -> None: ... -global___StreamMessage = StreamMessage +global___StreamRecord = StreamRecord -class StreamMessageBatch(google.protobuf.message.Message): - """One append is one batch, and one batch is one log node. The server stores +class StreamRecordBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one data node. The server stores this serialized and opaque; it decodes only to trim a partial first page or to apply a topic filter. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - global___StreamMessage + global___StreamRecord ]: ... def __init__( self, *, - messages: collections.abc.Iterable[global___StreamMessage] | None = ..., + records: collections.abc.Iterable[global___StreamRecord] | None = ..., ) -> None: ... def ClearField( - self, field_name: typing_extensions.Literal["messages", b"messages"] + self, field_name: typing_extensions.Literal["records", b"records"] ) -> None: ... -global___StreamMessageBatch = StreamMessageBatch +global___StreamRecordBatch = StreamRecordBatch diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index b813e2dfc..3df3e3c35 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -25,7 +25,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x86\x02\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12J\n\x08messages\x18\x03 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08\x12\x13\n\x0bowner_epoch\x18\x07 \x01(\x03"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"\x94\x01\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x06 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xd1\x01\n\x12PollMessagesOutput\x12J\n\x08messages\x18\x01 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xc4\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x08 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"p\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x04 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xe0\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x07 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12J\n\x08messages\x18\x04 \x03(\x0b\x32\x38.temporal.server.chasm.lib.stream.proto.v1.StreamMessage\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"9\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"w\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"t\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"\x1b\n\x19\x41\x64vanceConsumerHeadOutput"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x90\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"T\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... producer_id: builtins.str """Idempotency, all optional. Supply a producer identity and sequence, or an @@ -115,36 +114,32 @@ class AddMessagesInput(google.protobuf.message.Message): by this repo's helper generator. """ use_expected_offset: builtins.bool - owner_epoch: builtins.int def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., run_id: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., producer_id: builtins.str = ..., sequence: builtins.int = ..., expected_offset: builtins.int = ..., use_expected_offset: builtins.bool = ..., - owner_epoch: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ "expected_offset", b"expected_offset", - "messages", - b"messages", "namespace", b"namespace", - "owner_epoch", - b"owner_epoch", "producer_id", b"producer_id", + "records", + b"records", "run_id", b"run_id", "sequence", @@ -331,7 +326,7 @@ class PollMessagesInput(google.protobuf.message.Message): self, ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: """Filters by exact topic. Offsets are assigned over the unfiltered stream, so - next_offset advances past filtered-out messages too. + next_offset advances past filtered-out records too. """ wait_new_messages: builtins.bool """When set and the reader is caught up, block until something arrives, the @@ -374,33 +369,39 @@ global___PollMessagesInput = PollMessagesInput class PollMessagesOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int NEXT_OFFSET_FIELD_NUMBER: builtins.int HEAD_OFFSET_FIELD_NUMBER: builtins.int CLOSED_FIELD_NUMBER: builtins.int CLOSE_REASON_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... next_offset: builtins.int head_offset: builtins.int closed: builtins.bool @property def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + run_id: builtins.str + """The execution holding the stream. A workflow task slice built from this + read names the run it came from. + """ def __init__( self, *, - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., next_offset: builtins.int = ..., head_offset: builtins.int = ..., closed: builtins.bool = ..., close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + run_id: builtins.str = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] @@ -414,10 +415,12 @@ class PollMessagesOutput(google.protobuf.message.Message): b"closed", "head_offset", b"head_offset", - "messages", - b"messages", "next_offset", b"next_offset", + "records", + b"records", + "run_id", + b"run_id", ], ) -> None: ... @@ -564,7 +567,7 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): WORKFLOW_ID_FIELD_NUMBER: builtins.int OWNER_RUN_ID_FIELD_NUMBER: builtins.int STREAM_NAME_FIELD_NUMBER: builtins.int - MESSAGES_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int PRODUCER_ID_FIELD_NUMBER: builtins.int SEQUENCE_FIELD_NUMBER: builtins.int namespace: builtins.str @@ -577,10 +580,10 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): stream_name: builtins.str """Empty means the workflow's default output stream.""" @property - def messages( + def records( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + temporalio.api.streamservice.v1.message_pb2.StreamRecord ]: ... producer_id: builtins.str """Optional idempotency, as on AddMessagesInput.""" @@ -592,8 +595,8 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): workflow_id: builtins.str = ..., owner_run_id: builtins.str = ..., stream_name: builtins.str = ..., - messages: collections.abc.Iterable[ - temporalio.api.streamservice.v1.message_pb2.StreamMessage + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord ] | None = ..., producer_id: builtins.str = ..., @@ -602,14 +605,14 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "messages", - b"messages", "namespace", b"namespace", "owner_run_id", b"owner_run_id", "producer_id", b"producer_id", + "records", + b"records", "sequence", b"sequence", "stream_name", @@ -724,18 +727,25 @@ class DeleteStreamInput(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int + FORCE_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str + force: builtins.bool + """Delete even while a workflow consumer is active. Without it the call is + refused, because the consumer's History depends on ranges the deletion + takes with it. + """ def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., + force: builtins.bool = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "namespace", b"namespace", "stream_id", b"stream_id" + "force", b"force", "namespace", b"namespace", "stream_id", b"stream_id" ], ) -> None: ... @@ -1186,11 +1196,16 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + CONSUMER_RUN_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str consumer_workflow_id: builtins.str - """The workflow that will consume, which names the pin.""" + """The workflow that will consume. Together with the run it names the pin, + so a later run of the same workflow id registers fresh rather than + inheriting a closed run's floor. + """ + consumer_run_id: builtins.str start_offset: builtins.int """Negative means from wherever the stream is when the pin is taken. Resolved here, where the frontier is, and returned so the cursor records a fact. @@ -1201,11 +1216,14 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): namespace: builtins.str = ..., stream_id: builtins.str = ..., consumer_workflow_id: builtins.str = ..., + consumer_run_id: builtins.str = ..., start_offset: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ + "consumer_run_id", + b"consumer_run_id", "consumer_workflow_id", b"consumer_workflow_id", "namespace", @@ -1223,33 +1241,22 @@ class RegisterStreamConsumerOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor START_OFFSET_FIELD_NUMBER: builtins.int - COLLECTION_ID_FIELD_NUMBER: builtins.int - BUCKET_SIZE_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int start_offset: builtins.int - collection_id: builtins.str - """What the consumer needs to address the log, all decided by the stream.""" - bucket_size: builtins.int known_head: builtins.int + """The frontier at registration, so the cursor starts with a known head + instead of waiting for the first push. + """ def __init__( self, *, start_offset: builtins.int = ..., - collection_id: builtins.str = ..., - bucket_size: builtins.int = ..., known_head: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "bucket_size", - b"bucket_size", - "collection_id", - b"collection_id", - "known_head", - b"known_head", - "start_offset", - b"start_offset", + "known_head", b"known_head", "start_offset", b"start_offset" ], ) -> None: ... @@ -1305,8 +1312,36 @@ global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput class AdvanceConsumerHeadOutput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor + CONSUMER_CLOSED_FIELD_NUMBER: builtins.int + SUCCESSOR_RUN_ID_FIELD_NUMBER: builtins.int + SUCCESSOR_START_OFFSET_FIELD_NUMBER: builtins.int + consumer_closed: builtins.bool + """The run that held the pin is closed and no current run of the workflow + consumes the stream, so the stream can release the pin. + """ + successor_run_id: builtins.str + """The run that held the pin is closed but a successor carries the + subscription, so the stream re-keys the pin to it, with the floor the + successor's cursor started from. + """ + successor_start_offset: builtins.int def __init__( self, + *, + consumer_closed: builtins.bool = ..., + successor_run_id: builtins.str = ..., + successor_start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_closed", + b"consumer_closed", + "successor_run_id", + b"successor_run_id", + "successor_start_offset", + b"successor_start_offset", + ], ) -> None: ... global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 2ce5a0451..9f334a50f 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -22,13 +22,14 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xe5\x05\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x13\n\x0bowner_epoch\x18\x06 \x01(\x03\x12\x13\n\x0b\x62ucket_size\x18\x07 \x01(\x03\x12\x15\n\rcollection_id\x18\x08 \x01(\t\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"}\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\x12\x14\n\x0creplay_floor\x18\x06 \x01(\x03"\xe0\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x13\n\x0b\x62ucket_size\x18\x03 \x01(\x03\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\x12\x14\n\x0cstart_offset\x18\n \x01(\x03"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ temporal.api.common.v1.message_pb2.Payload: ... - owner_epoch: builtins.int - """Bumped on ownership change so a stale producer's write fails.""" - bucket_size: builtins.int - """Immutable once set. Offsets roll to a new log tree every bucket_size so no - single storage partition grows with the stream. - """ - collection_id: builtins.str - """Identity of the log this stream writes to. Bucket trees are derived from - it, so there is no per-bucket index to store. - """ @property def producers( self, @@ -123,6 +114,21 @@ class StreamState(google.protobuf.message.Message): @property def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: """Wall-clock close time, used to schedule retention deletion.""" + @property + def budget(self) -> global___StreamBudget: + """Set on a stream a workflow owns. Its batches are the owning execution's + mutable state, so appends past the budget are refused rather than left to + the execution size limit, which terminates the workflow. + """ + appended_bytes: builtins.int + """Bytes appended over the stream's life, kept for the budget check. A stream + with a budget never reclaims, so this is also what it holds. + """ + notify_pending: builtins.bool + """A notify task is scheduled and has not run yet. Appends while it is set + schedule none of their own; the task reads the head when it runs, so it + carries every append that landed before it. + """ def __init__( self, *, @@ -130,9 +136,6 @@ class StreamState(google.protobuf.message.Message): base_offset: builtins.int = ..., closed: builtins.bool = ..., close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., - owner_epoch: builtins.int = ..., - bucket_size: builtins.int = ..., - collection_id: builtins.str = ..., producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] | None = ..., consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] @@ -140,10 +143,15 @@ class StreamState(google.protobuf.message.Message): lifecycle: global___StreamLifecycle | None = ..., redirect_run_id: builtins.str = ..., close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + budget: global___StreamBudget | None = ..., + appended_bytes: builtins.int = ..., + notify_pending: builtins.bool = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "budget", + b"budget", "close_reason", b"close_reason", "close_time", @@ -155,26 +163,26 @@ class StreamState(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "appended_bytes", + b"appended_bytes", "base_offset", b"base_offset", - "bucket_size", - b"bucket_size", + "budget", + b"budget", "close_reason", b"close_reason", "close_time", b"close_time", "closed", b"closed", - "collection_id", - b"collection_id", "consumers", b"consumers", "head_offset", b"head_offset", "lifecycle", b"lifecycle", - "owner_epoch", - b"owner_epoch", + "notify_pending", + b"notify_pending", "producers", b"producers", "redirect_run_id", @@ -184,6 +192,32 @@ class StreamState(google.protobuf.message.Message): global___StreamState = StreamState +class StreamBudget(google.protobuf.message.Message): + """Hard bounds on what a stream may hold. Distinct from StreamLifecycle.max_items, + which reclaims the oldest messages: a budget refuses the newest. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAX_ITEMS_FIELD_NUMBER: builtins.int + MAX_BYTES_FIELD_NUMBER: builtins.int + max_items: builtins.int + max_bytes: builtins.int + def __init__( + self, + *, + max_items: builtins.int = ..., + max_bytes: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_bytes", b"max_bytes", "max_items", b"max_items" + ], + ) -> None: ... + +global___StreamBudget = StreamBudget + class ProducerCursor(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -301,8 +335,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor STREAM_ID_FIELD_NUMBER: builtins.int - COLLECTION_ID_FIELD_NUMBER: builtins.int - BUCKET_SIZE_FIELD_NUMBER: builtins.int OFFSET_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int EXTERNAL_FIELD_NUMBER: builtins.int @@ -311,9 +343,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): HAS_PENDING_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int stream_id: builtins.str - collection_id: builtins.str - """Enough to address the log without reading the stream component first.""" - bucket_size: builtins.int offset: builtins.int """Next offset to deliver.""" known_head: builtins.int @@ -342,8 +371,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): self, *, stream_id: builtins.str = ..., - collection_id: builtins.str = ..., - bucket_size: builtins.int = ..., offset: builtins.int = ..., known_head: builtins.int = ..., external: builtins.bool = ..., @@ -355,10 +382,6 @@ class WorkflowStreamCursor(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "bucket_size", - b"bucket_size", - "collection_id", - b"collection_id", "external", b"external", "has_pending", @@ -389,7 +412,7 @@ class StreamLifecycle(google.protobuf.message.Message): def retention(self) -> google.protobuf.duration_pb2.Duration: """How long a closed stream stays readable before it is deleted.""" max_items: builtins.int - """Cap on readable messages. Older whole buckets are reclaimed once the floor + """Cap on readable messages. Whole batches are reclaimed once the floor passes them, so a capped stream has bounded storage. """ def __init__( From 0bbf54bb0332bf30b959d5cef88c8ee4d90034eb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 500/831] Moved the workflow stream runtime to records and batched a task's publishes. The delivered job and the publish command carry StreamRecord protos, and a task's publishes on one stream are held until the task completes so they become one command and one History event. --- temporalio/worker/_workflow_instance.py | 197 +++++++++++++--------- temporalio/workflow/__init__.py | 14 +- temporalio/workflow/_context.py | 105 +++++------- tests/worker/test_workflow_stream.py | 209 +++++++++++++++++------- 4 files changed, 319 insertions(+), 206 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 0a17d2b22..9b1e1ea0b 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -273,14 +273,45 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] -# Match the server's per-batch limits. Rejecting here turns a wedged workflow, -# which would replay and re-issue the same rejected command forever, into an -# error the workflow author can see. -_MAX_STREAM_MESSAGES_PER_BATCH = 1000 -_MAX_STREAM_MESSAGE_BYTES = 1 << 20 +# Match the server's per-batch limits. A record over its limit is refused where +# it is published, because a rejected command would be reissued on every +# replay; a task's records are split into commands that fit the batch limits. +_MAX_STREAM_RECORDS_PER_BATCH = 1000 +_MAX_STREAM_RECORD_BYTES = 1 << 20 _MAX_STREAM_BATCH_BYTES = 2 << 20 +def _stream_batches( + records: Sequence[temporalio.api.stream.v1.StreamRecord], +) -> Iterator[list[temporalio.api.stream.v1.StreamRecord]]: + """Split one task's records for a stream into batches the server accepts.""" + batch: list[temporalio.api.stream.v1.StreamRecord] = [] + size = 0 + for record in records: + record_size = record.ByteSize() + if batch and ( + len(batch) >= _MAX_STREAM_RECORDS_PER_BATCH + or size + record_size > _MAX_STREAM_BATCH_BYTES + ): + yield batch + batch, size = [], 0 + batch.append(record) + size += record_size + if batch: + yield batch + + +def _is_completion_command( + command: temporalio.bridge.proto.workflow_commands.WorkflowCommand, +) -> bool: + return ( + command.HasField("complete_workflow_execution") + or command.HasField("continue_as_new_workflow_execution") + or command.HasField("fail_workflow_execution") + or command.HasField("cancel_workflow_execution") + ) + + class _StreamBuffer: """Holds the stream ranges delivered to a workflow so far. @@ -292,7 +323,7 @@ class _StreamBuffer: def __init__(self, stream_id: str = "") -> None: self._stream_id = stream_id - self._messages: list[temporalio.workflow.DeliveredStreamMessage] = [] + self._records: list[temporalio.workflow.DeliveredStreamRecord] = [] self._waiters: list[asyncio.Future] = [] # Where the next range has to start. Unknown until the first one # arrives, because a subscription may start wherever the stream is and @@ -301,19 +332,19 @@ def __init__(self, stream_id: str = "") -> None: def extend( self, - messages: Sequence[temporalio.api.stream.v1.StreamMessage], + records: Sequence[temporalio.api.stream.v1.StreamRecord], from_offset: int = 0, to_offset: int | None = None, ) -> None: if to_offset is None: - to_offset = from_offset + len(messages) + to_offset = from_offset + len(records) # A range is recorded as consumed once and never resent, so one that # repeats, skips or mis-sizes would hand the workflow duplicate or - # shifted bodies with nothing to say so. Failing the task is what makes - # the fault visible. - if to_offset - from_offset != len(messages): + # shifted records with nothing to say so. Failing the task is what + # makes the fault visible. + if to_offset - from_offset != len(records): raise RuntimeError( - f"stream {self._stream_id!r} delivered {len(messages)} messages " + f"stream {self._stream_id!r} delivered {len(records)} records " f"for offsets [{from_offset}, {to_offset})" ) if self._next_offset is not None and from_offset != self._next_offset: @@ -324,34 +355,35 @@ def extend( self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to # hand a reader, so only a non-empty one wakes anyone. - if not messages: + if not records: return # Offsets are dense inside a delivered range and the range arrives in # order, so counting from its start is the position rather than an - # estimate of it. The per-message field is not on the activation, and a + # estimate of it. The per-record field is not on the activation, and a # reader that has to resume elsewhere needs a position it can name. - self._messages.extend( - temporalio.workflow.DeliveredStreamMessage( - body=message.body.data, - topic=message.topic, - offset=from_offset + index, + for index, record in enumerate(records): + # Copied so the buffer outlives the activation that carried it. + kept = temporalio.api.stream.v1.StreamRecord() + kept.CopyFrom(record) + self._records.append( + temporalio.workflow.DeliveredStreamRecord( + record=kept, offset=from_offset + index + ) ) - for index, message in enumerate(messages) - ) waiters, self._waiters = self._waiters, [] for waiter in waiters: if not waiter.done(): waiter.set_result(None) - def take(self) -> list[temporalio.workflow.DeliveredStreamMessage]: - taken, self._messages = self._messages, [] + def take(self) -> list[temporalio.workflow.DeliveredStreamRecord]: + taken, self._records = self._records, [] return taken def put_back( - self, messages: Sequence[temporalio.workflow.DeliveredStreamMessage] + self, records: Sequence[temporalio.workflow.DeliveredStreamRecord] ) -> None: """Return an unread tail to the front of the buffer.""" - self._messages[:0] = messages + self._records[:0] = records def wait_future(self) -> asyncio.Future: loop = asyncio.get_event_loop() @@ -360,7 +392,7 @@ def wait_future(self) -> asyncio.Future: return fut def __len__(self) -> int: - return len(self._messages) + return len(self._records) class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] @@ -496,6 +528,11 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: # arrive whether or not anything is reading yet, because the server has # already recorded them as consumed and will not send them again. self._stream_buffers: dict[str, _StreamBuffer] = {} + # Records this task's publishes append, by stream, until the task + # completes and they become commands. + self._stream_appends: dict[ + str, list[temporalio.api.stream.v1.StreamRecord] + ] = {} # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down @@ -557,6 +594,9 @@ def activate( temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion() ) self._current_completion.successful.SetInParent() + # A failed task's publishes never became commands, so nothing carries + # over into this one. + self._stream_appends = {} self._current_activation_error: Exception | None = None self._deployment_version_for_current_task = ( @@ -648,6 +688,9 @@ def activate( ) activation_err = None + if activation_err is None and not self._deleting: + self._flush_stream_appends() + # Apply versioning behavior if one was established if self._versioning_behavior: self._current_completion.successful.versioning_behavior = ( @@ -712,8 +755,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) - elif job.HasField("deliver_stream_messages"): - self._apply_deliver_stream_messages(job.deliver_stream_messages) + elif job.HasField("deliver_stream_records"): + self._apply_deliver_stream_records(job.deliver_stream_records) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1239,9 +1282,9 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) - def _apply_deliver_stream_messages( + def _apply_deliver_stream_records( self, - job: temporalio.bridge.proto.workflow_activation.DeliverStreamMessages, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamRecords, ) -> None: buffer = self._stream_buffers.get(job.stream_id) if buffer is None: @@ -1250,7 +1293,7 @@ def _apply_deliver_stream_messages( # subscription made later in the same task still sees it. buffer = _StreamBuffer(job.stream_id) self._stream_buffers[job.stream_id] = buffer - buffer.extend(job.messages, job.from_offset, job.to_offset) + buffer.extend(job.records, job.from_offset, job.to_offset) def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow @@ -1425,51 +1468,53 @@ def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: command.subscribe_stream.stream_id = stream_id command.subscribe_stream.start_offset = start_offset - def workflow_add_stream_messages( - self, stream_id: str, messages: Sequence[bytes], topic: str + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: - if not messages: - raise ValueError("add_stream_messages needs at least one message") - if len(messages) > _MAX_STREAM_MESSAGES_PER_BATCH: - raise ValueError( - f"a batch is limited to {_MAX_STREAM_MESSAGES_PER_BATCH} messages, " - f"got {len(messages)}" - ) - total = 0 - for body in messages: - if len(body) > _MAX_STREAM_MESSAGE_BYTES: + self._assert_not_read_only("append stream records") + if not records: + raise ValueError("append_stream_records needs at least one record") + kept: list[temporalio.api.stream.v1.StreamRecord] = [] + for record in records: + if record.ByteSize() > _MAX_STREAM_RECORD_BYTES: raise ValueError( - f"a stream message is limited to {_MAX_STREAM_MESSAGE_BYTES} " - f"bytes, got {len(body)}" + f"a stream record is limited to {_MAX_STREAM_RECORD_BYTES} " + f"bytes, got {record.ByteSize()}" ) - total += len(body) - if total > _MAX_STREAM_BATCH_BYTES: - raise ValueError( - f"a batch is limited to {_MAX_STREAM_BATCH_BYTES} bytes, got {total}" - ) - command = self._add_command() - command.add_stream_messages.stream_id = stream_id - for body in messages: - # The bodies ride the command and never enter History, so the event - # this produces stays the same size whatever is published here. - message = command.add_stream_messages.messages.add() - message.body.data = body - # Every other Temporal payload names its encoding, and the UI, the - # CLI and any codec server rely on that to decode what they read. - message.body.metadata["encoding"] = b"binary/plain" - message.topic = topic - - async def workflow_read_stream( - self, stream_id: str, max_messages: int - ) -> list[bytes]: - return [ - m.body - for m in await self.workflow_read_stream_messages(stream_id, max_messages) - ] - - async def workflow_read_stream_messages( - self, stream_id: str, max_messages: int - ) -> list[temporalio.workflow.DeliveredStreamMessage]: + copy = temporalio.api.stream.v1.StreamRecord() + copy.CopyFrom(record) + # The workflow is the producer here, whatever the caller set. + copy.producer_id = "" + kept.append(copy) + # Held until the task completes, so a task's publishes on one stream + # become one command and one History event however many there were. + self._stream_appends.setdefault(stream_id, []).extend(kept) + + def _flush_stream_appends(self) -> None: + appends, self._stream_appends = self._stream_appends, {} + if not appends: + return + commands = self._current_completion.successful.commands + # Ahead of any command that ends the run, because the server accepts + # nothing after one of those. + insert_at = len(commands) + for index, command in enumerate(commands): + if _is_completion_command(command): + insert_at = index + break + for stream_id, records in appends.items(): + for batch in _stream_batches(records): + command = temporalio.bridge.proto.workflow_commands.WorkflowCommand() + command.append_stream_records.stream_id = stream_id + command.append_stream_records.records.extend(batch) + commands.insert(insert_at, command) + insert_at += 1 + + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[temporalio.workflow.DeliveredStreamRecord]: # Ranges arrive on Workflow Tasks, and a query activation carries none, # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. @@ -1478,10 +1523,10 @@ async def workflow_read_stream_messages( while not len(buffer): await buffer.wait_future() taken = buffer.take() - if max_messages and len(taken) > max_messages: + if max_records and len(taken) > max_records: # Put the tail back rather than dropping it: nothing will resend it. - buffer.put_back(taken[max_messages:]) - taken = taken[:max_messages] + buffer.put_back(taken[max_records:]) + taken = taken[:max_records] return taken def workflow_get_current_history_length(self) -> int: diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 8d57b75e7..18d04cb0c 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,7 +58,7 @@ wait, ) from ._context import ( - DeliveredStreamMessage, + DeliveredStreamRecord, Info, ParentInfo, RootInfo, @@ -66,7 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, - add_stream_messages, + append_stream_records, cancellation_reason, current_update_info, deprecate_patch, @@ -88,8 +88,7 @@ payload_converter, random, random_seed, - read_stream, - read_stream_messages, + read_stream_records, register_random_seed_callback, set_current_details, sleep, @@ -238,10 +237,9 @@ "upsert_search_attributes", "uuid4", "uuid7", - "DeliveredStreamMessage", - "read_stream", - "read_stream_messages", - "add_stream_messages", + "DeliveredStreamRecord", + "read_stream_records", + "append_stream_records", "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 57183aafb..8b6c07782 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -14,6 +14,7 @@ from nexusrpc import InputT, OutputT import temporalio.api.common.v1 +import temporalio.api.stream.v1 import temporalio.common import temporalio.converter @@ -317,19 +318,16 @@ def workflow_get_current_deployment_version( def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... @abstractmethod - def workflow_add_stream_messages( - self, stream_id: str, messages: Sequence[bytes], topic: str + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: ... @abstractmethod - async def workflow_read_stream( - self, stream_id: str, max_messages: int - ) -> list[bytes]: ... - - @abstractmethod - async def workflow_read_stream_messages( - self, stream_id: str, max_messages: int - ) -> list[DeliveredStreamMessage]: ... + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[DeliveredStreamRecord]: ... @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -968,10 +966,10 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: - """Subscribe this workflow to a stream. + """Subscribe this workflow to a server-side stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream` returns them. Safe to call again: a second + and :func:`read_stream_records` returns them. Safe to call again: a second subscription to a stream this run already consumes does not move its cursor, though it does write one event. Calling it on every replay is harmless because replay matches the command to the event already recorded. @@ -979,10 +977,12 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: Only the stream id and start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up without doing I/O and a value it carried would be a reading rather than a - fact. + fact. A name this workflow has not written yet names a stream it owns, and + subscribing creates it. Args: - stream_id: Stream to consume. + stream_id: Stream to consume: the name of one this workflow owns, or + the id of a standalone stream. start_offset: Where to start. Negative means from wherever the stream is when the subscription is registered; the server resolves that once and records it, so replay does not resolve it again. @@ -990,83 +990,60 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) -def add_stream_messages( - messages: Sequence[bytes], +def append_stream_records( + records: Sequence[temporalio.api.stream.v1.StreamRecord], *, stream_id: str = "", - topic: str = "", ) -> None: - """Publish a batch of messages to a stream this workflow owns. + """Publish records to a server-side stream this workflow owns. - Returns as soon as the command is issued. The bodies go to the stream's own - log rather than into History, which gets one fixed-size event naming the - offset range, so a batch of a thousand costs History the same as a batch of + Returns at once. The records become one command when this Workflow Task + completes, so they are visible when the task is accepted and never if it + fails. Their bodies go to the stream's own log rather than into History, + which gets one fixed-size event naming the offset range, so a task that + publishes a thousand records costs History the same as one that publishes one. Readers do not have to exist yet, and adding one costs the writer nothing. - Batch where you can. The event is per call, and a workflow is bounded by the - history event count, so one call with a hundred messages leaves far more - room than a hundred calls with one. - Args: - messages: Bodies to append, in order. + records: Records to append, in order. The server stores each with an + empty ``producer_id``, because the workflow is the producer. stream_id: Stream to publish to. Empty means the workflow's default output stream. - topic: Optional topic, which readers can filter on. Offsets are still - assigned over the unfiltered stream. + + Raises: + ValueError: ``records`` is empty or one of them is over the server's + per-record size limit. """ - _Runtime.current().workflow_add_stream_messages(stream_id, messages, topic) + _Runtime.current().workflow_append_stream_records(stream_id, records) @dataclass(frozen=True) -class DeliveredStreamMessage: - """One message a consuming workflow was given, with where it sat.""" +class DeliveredStreamRecord: + """One record a consuming workflow was given, with where it sat.""" - body: bytes - topic: str + record: temporalio.api.stream.v1.StreamRecord offset: int """Its position in the whole stream, which is what a reader resumes from.""" -async def read_stream_messages( - stream_id: str, *, max_messages: int = 0 -) -> list[DeliveredStreamMessage]: - """Read the next messages, keeping their topic and position. - - Same delivery as :func:`read_stream`. A reader that has to name where it - got to, filter a topic, or hand a position to something outside the - workflow needs more than the bodies. - - Args: - stream_id: Stream to read from. - max_messages: Most messages to return at once, or 0 for everything - available. - """ - return await _Runtime.current().workflow_read_stream_messages( - stream_id, max_messages - ) - +async def read_stream_records( + stream_id: str, *, max_records: int = 0 +) -> list[DeliveredStreamRecord]: + """Read the next records of a server-side stream this workflow consumes. -async def read_stream(stream_id: str, *, max_messages: int = 0) -> list[bytes]: - """Read the next messages of a stream this workflow consumes. - - Waits until at least one message is available. Ranges arrive on Workflow + Waits until at least one record is available. Ranges arrive on Workflow Tasks, and only the offsets they covered are written to History, so this is deterministic on replay: the server re-supplies the same ranges by reading - the stream again. - - Subscribe out of band with the stream client. This only reads what has - already been delivered to this workflow. + the stream again. Subscribe first with :func:`subscribe_stream`; this only + reads what has already been delivered to this workflow. Args: stream_id: Stream to read from. - max_messages: Most messages to return at once, or 0 for everything + max_records: Most records to return at once, or 0 for everything available. - - Returns: - The message bodies, in stream order. """ - return await _Runtime.current().workflow_read_stream(stream_id, max_messages) + return await _Runtime.current().workflow_read_stream_records(stream_id, max_records) async def wait_condition( diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 93b596b8c..9083e74a9 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -1,9 +1,10 @@ -"""In-workflow consumption of a server-side stream. +"""In-workflow consumption and publication of a server-side stream. Ranges arrive on Workflow Tasks and only the offsets they covered are written to History, so replay is served by the server reading the stream again. These tests -drive the buffering and the workflow-facing read directly, which is the part -this SDK owns; the delivery decision itself lives in the server and sdk-core. +drive the buffering, the workflow-facing read and the per-task publish directly, +which is the part this SDK owns; the delivery decision itself lives in the +server and sdk-core. """ from __future__ import annotations @@ -18,22 +19,29 @@ from temporalio.bridge.proto.workflow_commands import WorkflowCommand from temporalio.worker._workflow_instance import ( _MAX_STREAM_BATCH_BYTES, - _MAX_STREAM_MESSAGE_BYTES, + _MAX_STREAM_RECORD_BYTES, + _MAX_STREAM_RECORDS_PER_BATCH, _StreamBuffer, _WorkflowInstanceImpl, ) from temporalio.workflow import ReadOnlyContextError -def message(body: bytes) -> api_stream.StreamMessage: - return api_stream.StreamMessage(body=temporalio.api.common.v1.Payload(data=body)) +def record(body: bytes, topic: str = "") -> api_stream.StreamRecord: + return api_stream.StreamRecord( + body=temporalio.api.common.v1.Payload(data=body), topic=topic + ) + + +def bodies(delivered: list[Any]) -> list[bytes]: + return [item.record.body.data for item in delivered] async def test_buffer_hands_over_in_order() -> None: buffer = _StreamBuffer() - buffer.extend([message(b"one"), message(b"two")]) + buffer.extend([record(b"one"), record(b"two")]) - assert [m.body for m in buffer.take()] == [b"one", b"two"] + assert bodies(buffer.take()) == [b"one", b"two"] assert len(buffer) == 0 @@ -44,9 +52,9 @@ async def test_buffer_wakes_a_waiting_reader() -> None: waiter = buffer.wait_future() assert not waiter.done() - buffer.extend([message(b"late")]) + buffer.extend([record(b"late")]) await asyncio.wait_for(waiter, timeout=1) - assert [m.body for m in buffer.take()] == [b"late"] + assert bodies(buffer.take()) == [b"late"] # An empty range is still a delivery the server recorded, but there is nothing @@ -63,24 +71,24 @@ async def test_empty_range_does_not_wake_a_reader() -> None: async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: buffer = _StreamBuffer() - buffer.extend([message(b"early")]) + buffer.extend([record(b"early")]) # No waiting: the data is already there. assert len(buffer) == 1 waiter = buffer.wait_future() assert not waiter.done(), "a fresh waiter is only resolved by new data" - assert [m.body for m in buffer.take()] == [b"early"] + assert bodies(buffer.take()) == [b"early"] class _ReadOnlyStub: """Enough of the workflow instance to drive the real read. - The cap lives inside ``workflow_read_stream_messages``, so a test that + The cap lives inside ``workflow_read_stream_records``, so a test that reimplements it proves nothing about the code that ships. Borrowing the method off the real class is what keeps the test on the shipped path. """ - workflow_read_stream_messages = _WorkflowInstanceImpl.workflow_read_stream_messages + workflow_read_stream_records = _WorkflowInstanceImpl.workflow_read_stream_records def __init__(self, read_only: bool = False) -> None: self._stream_buffers: dict[str, _StreamBuffer] = {} @@ -90,31 +98,33 @@ def _assert_not_read_only(self, action: str) -> None: if self._read_only: raise ReadOnlyContextError(f"cannot {action} in a read-only context") - async def read(self, stream: str, max_messages: int) -> list[bytes]: + async def read(self, stream: str, max_records: int) -> list[bytes]: instance: Any = self - return await _WorkflowInstanceImpl.workflow_read_stream( - instance, stream, max_messages + return bodies( + await _WorkflowInstanceImpl.workflow_read_stream_records( + instance, stream, max_records + ) ) -@pytest.mark.parametrize("max_messages", [1, 2, 5]) -async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> None: +@pytest.mark.parametrize("max_records", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_records: int) -> None: stub = _ReadOnlyStub() - bodies = [b"a", b"b", b"c"] + expected = [b"a", b"b", b"c"] stub._stream_buffers["s"] = _StreamBuffer() - stub._stream_buffers["s"].extend([message(b) for b in bodies]) + stub._stream_buffers["s"].extend([record(b) for b in expected]) - got = await stub.read("s", max_messages) + got = await stub.read("s", max_records) - assert got == bodies[:max_messages] + assert got == expected[:max_records] # Whatever the cap left behind has to still be there: nothing resends it. - assert len(stub._stream_buffers["s"]) == max(0, len(bodies) - max_messages) + assert len(stub._stream_buffers["s"]) == max(0, len(expected) - max_records) if len(stub._stream_buffers["s"]): rest = await stub.read("s", 0) - assert got + rest == bodies + assert got + rest == expected else: - assert got == bodies + assert got == expected # A query activation carries no ranges, so a read there would wait on a future @@ -122,7 +132,7 @@ async def test_read_respects_a_cap_without_losing_the_tail(max_messages: int) -> async def test_read_is_refused_in_a_read_only_context() -> None: stub = _ReadOnlyStub(read_only=True) stub._stream_buffers["s"] = _StreamBuffer() - stub._stream_buffers["s"].extend([message(b"a")]) + stub._stream_buffers["s"].extend([record(b"a")]) with pytest.raises(ReadOnlyContextError, match="read stream"): await stub.read("s", 0) @@ -135,61 +145,144 @@ async def test_read_is_refused_in_a_read_only_context() -> None: # only place a repeated, skipped or mis-sized delivery can still be noticed. async def test_ranges_have_to_abut_the_last_one() -> None: buffer = _StreamBuffer("s") - buffer.extend([message(b"a"), message(b"b")], 0, 2) + buffer.extend([record(b"a"), record(b"b")], 0, 2) # An empty range moves the expectation too: the server recorded it. buffer.extend([], 2, 2) - buffer.extend([message(b"c")], 2, 3) - assert [m.offset for m in buffer.take()] == [0, 1, 2] + buffer.extend([record(b"c")], 2, 3) + assert [item.offset for item in buffer.take()] == [0, 1, 2] with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): - buffer.extend([message(b"c")], 2, 3) + buffer.extend([record(b"c")], 2, 3) with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): - buffer.extend([message(b"f")], 5, 6) + buffer.extend([record(b"f")], 5, 6) -async def test_a_range_has_to_carry_as_many_messages_as_it_spans() -> None: +async def test_a_range_has_to_carry_as_many_records_as_it_spans() -> None: buffer = _StreamBuffer("s") - with pytest.raises(RuntimeError, match=r"2 messages for offsets \[0, 1\)"): - buffer.extend([message(b"a"), message(b"b")], 0, 1) + with pytest.raises(RuntimeError, match=r"2 records for offsets \[0, 1\)"): + buffer.extend([record(b"a"), record(b"b")], 0, 1) assert len(buffer) == 0 +class _Completion: + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + +class _Successful: + def __init__(self) -> None: + self.successful = _Completion() + + class _CommandStub: - """Drives the real publish path and keeps the commands it issued.""" + """Drives the real publish path and keeps the commands it issued. + + The completion's command list is a plain list here, which supports the + same ``insert`` the protobuf container does. + """ - workflow_add_stream_messages = _WorkflowInstanceImpl.workflow_add_stream_messages + workflow_append_stream_records = ( + _WorkflowInstanceImpl.workflow_append_stream_records + ) + _flush_stream_appends = _WorkflowInstanceImpl._flush_stream_appends def __init__(self) -> None: - self.commands: list[WorkflowCommand] = [] + self._stream_appends: dict[str, list[api_stream.StreamRecord]] = {} + self._current_completion = _Successful() + + def _assert_not_read_only(self, _action: str) -> None: + pass + + @property + def commands(self) -> list[WorkflowCommand]: + return self._current_completion.successful.commands - def _add_command(self) -> WorkflowCommand: - command = WorkflowCommand() - self.commands.append(command) - return command + def publish(self, *records: api_stream.StreamRecord, stream_id: str = "") -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_append_stream_records( + instance, stream_id, list(records) + ) - def publish(self, *bodies: bytes) -> None: + def flush(self) -> None: instance: Any = self - _WorkflowInstanceImpl.workflow_add_stream_messages(instance, "", bodies, "") + _WorkflowInstanceImpl._flush_stream_appends(instance) -# The server refuses an oversized publish, and a refused command is reissued -# on every replay, so the limits have to be applied before the command exists. -def test_a_message_over_the_server_limit_is_refused_before_the_command() -> None: +# A task's publishes on one stream become one command, whatever their number, +# because the event the command produces is what bounds a workflow's History. +def test_a_tasks_publishes_on_one_stream_become_one_command() -> None: stub = _CommandStub() - stub.publish(b"x" * _MAX_STREAM_MESSAGE_BYTES) - assert len(stub.commands) == 1 + stub.publish(record(b"a"), record(b"b")) + stub.publish(record(b"c")) + stub.publish(record(b"d"), stream_id="other") + assert stub.commands == [] + + stub.flush() + + by_stream = { + command.append_stream_records.stream_id: [ + r.body.data for r in command.append_stream_records.records + ] + for command in stub.commands + } + assert by_stream == {"": [b"a", b"b", b"c"], "other": [b"d"]} + # Flushed once: a second flush has nothing left to say. + stub.flush() + assert len(stub.commands) == 2 + + +# The workflow is the producer of what it publishes, whatever the caller set. +def test_the_workflows_records_carry_no_producer() -> None: + stub = _CommandStub() + stub.publish(api_stream.StreamRecord(producer_id="someone", attempt=3)) + stub.flush() + assert stub.commands[0].append_stream_records.records[0].producer_id == "" - with pytest.raises(ValueError, match=f"{_MAX_STREAM_MESSAGE_BYTES} bytes"): - stub.publish(b"x" * (_MAX_STREAM_MESSAGE_BYTES + 1)) - assert len(stub.commands) == 1 +# The server accepts nothing after a command that ends the run, so the +# publishes have to go ahead of it. +def test_publishes_are_flushed_ahead_of_the_completion_command() -> None: + stub = _CommandStub() + stub.publish(record(b"a")) + done = WorkflowCommand() + done.complete_workflow_execution.SetInParent() + stub.commands.append(done) + + stub.flush() -def test_a_batch_over_the_server_limit_is_refused_before_the_command() -> None: + assert [c.WhichOneof("variant") for c in stub.commands] == [ + "append_stream_records", + "complete_workflow_execution", + ] + + +# The server refuses an oversized record, and a refused command is reissued on +# every replay, so the limit has to be applied before the record is buffered. +def test_a_record_over_the_server_limit_is_refused_before_the_command() -> None: stub = _CommandStub() - half = b"x" * (_MAX_STREAM_BATCH_BYTES // 2) - stub.publish(half, half) + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16))) + with pytest.raises(ValueError, match=f"{_MAX_STREAM_RECORD_BYTES} bytes"): + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES + 1))) + stub.flush() assert len(stub.commands) == 1 - with pytest.raises(ValueError, match=f"{_MAX_STREAM_BATCH_BYTES} bytes"): - stub.publish(half, half, b"x") - assert len(stub.commands) == 1 + +# A task that publishes more than one batch holds is split into commands the +# server accepts, by count and by bytes, rather than refused. +def test_a_task_over_the_batch_limits_is_split_into_commands() -> None: + stub = _CommandStub() + stub.publish(*(record(b"x") for _ in range(_MAX_STREAM_RECORDS_PER_BATCH + 1))) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [ + _MAX_STREAM_RECORDS_PER_BATCH, + 1, + ] + + stub = _CommandStub() + # Two records that fit one batch together, then one whose framing alone + # overflows the room they leave. + big = record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16)) + room = _MAX_STREAM_BATCH_BYTES - 2 * big.ByteSize() + stub.publish(big, big, record(b"y" * room)) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [2, 1] From 3d22dc58a4b68e93caaa3c7c06e55efd2656a4ef Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 501/831] Moved the stream client and the contrib surface to records and SDK errors. Every stub call translates the transport's failure into StreamNotFoundError or RPCError, and the client's payload codec is applied to bodies so the two sides of a namespace with a codec agree. --- temporalio/client_stream.py | 347 ++++++++++-------- temporalio/contrib/server_streams/__init__.py | 150 ++++---- tests/contrib/test_server_streams.py | 7 +- tests/test_client_stream.py | 121 ++++-- 4 files changed, 360 insertions(+), 265 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 15760a980..b482941af 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -3,7 +3,8 @@ A stream is a durable, offset-addressed append-only sequence that lives beside Workflow History rather than inside it. Appending schedules no Workflow Task, and each reader holds its own cursor, so adding a reader costs nothing on the -write side. +write side. The record is ``temporal.api.stream.v1.StreamRecord`` on the wire +and in the store, so a reader in any language decodes the same bytes. Prototype support for AI-198. Four things about it are temporary and will change before this is a real feature: @@ -15,37 +16,47 @@ coming from the api submodule, because the service is still defined in the server. That is why the wire names read as server-internal. - **This client is for use outside a Workflow.** Workflow code publishes and - consumes with ``workflow.add_stream_messages`` and ``workflow.read_stream`` - instead. + consumes with ``workflow.append_stream_records`` and + ``workflow.read_stream_records`` instead. - **No TLS or API-key support**, for the same reason: the channel is built here rather than by the machinery that normally handles that. + +A failed call raises :class:`temporalio.streams.StreamNotFoundError` when the +server answers ``NOT_FOUND`` and :class:`temporalio.service.RPCError` +otherwise, never the transport's own exception type. """ from __future__ import annotations import asyncio import weakref -from collections.abc import AsyncIterator, Sequence +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass -from typing import Any +from typing import Any, TypeVar import google.protobuf.duration_pb2 +import grpc +import grpc.aio -import temporalio.api.common.v1 import temporalio.api.streamservice.v1 as stream +from temporalio.api.stream.v1 import StreamRecord from temporalio.api.streamservice.v1 import service_pb2_grpc +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import StreamNotFoundError __all__ = [ "Appended", - "Message", "Page", "StreamClient", + "StreamEntry", "StreamHandle", "WorkflowStreamHandle", "close_shared_clients", "shared_client", ] +_T = TypeVar("_T") + @dataclass(frozen=True) class Appended: @@ -62,23 +73,16 @@ class Appended: @dataclass(frozen=True) -class Message: - """One item read from a stream. +class StreamEntry: + """One record read from a stream, with where it sits. Offsets are assigned over the unfiltered stream, so a topic-filtered read - hands back messages whose offsets are not contiguous. To resume at the - boundary of a whole read, checkpoint the ``next_offset`` that - :meth:`StreamHandle.read` returns instead. + hands back entries whose offsets are not contiguous. A reader that resumes + between records takes ``offset`` rather than counting what it received. """ - data: bytes - topic: str = "" + record: StreamRecord offset: int = 0 - """Where this message sits in the whole stream. - - A topic filter leaves gaps, so a reader that resumes between messages has - to take this rather than count what it received. - """ @dataclass(frozen=True) @@ -86,13 +90,73 @@ class Page: """One read of a stream. ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can - be added and this reader has everything. + be added and this reader has everything. ``run_id`` names the execution + holding the stream, which is how a reader of a workflow's stream learns + which run it is on when it did not pin one. """ - messages: list[Message] + entries: list[StreamEntry] next_offset: int head_offset: int closed: bool + run_id: str = "" + + +def _to_service(record: StreamRecord) -> stream.StreamRecord: + # Field for field the public record; the stored shape only adds the offset + # a read assigns. An unset body stays unset so a FINISH record reads back + # as one. + out = stream.StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return out + + +def _to_public(record: stream.StreamRecord) -> StreamEntry: + out = StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return StreamEntry(record=out, offset=record.offset) + + +def _translate(error: grpc.aio.AioRpcError) -> Exception: + code = error.code() + details = error.details() or code.name + if code is grpc.StatusCode.NOT_FOUND: + return StreamNotFoundError(details) + raw = b"" + # The aio metadata iterates as (key, value) pairs at runtime, whatever + # shape the stubs give its items. + trailing: Any = error.trailing_metadata() + for item in trailing or (): + key, value = item[0], item[1] + if key == "grpc-status-details-bin" and isinstance(value, bytes): + raw = value + return RPCError(details, RPCStatusCode(code.value[0]), raw) + + +async def _call(method: Callable[[Any], Awaitable[_T]], request: Any) -> _T: + """Make one stub call, translating the transport's failure to the SDK's.""" + try: + return await method(request) + except grpc.aio.AioRpcError as error: + raise _translate(error) from error class StreamClient: @@ -107,19 +171,12 @@ def __init__(self, channel: Any, namespace: str) -> None: self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod - def connect(target_host: str, namespace: str = "default") -> "StreamClient": + def connect(target_host: str, namespace: str = "default") -> StreamClient: """Open a channel to a frontend. Separate from ``Client.connect`` because this does not share the connection the rest of the SDK uses. """ - try: - import grpc - except ImportError as err: - raise RuntimeError( - "temporalio.client_stream requires the grpc extra: " - "pip install 'temporalio[grpc]'" - ) from err return StreamClient(grpc.aio.insecure_channel(target_host), namespace) async def close(self) -> None: @@ -132,11 +189,11 @@ async def create( *, retention: float | None = None, max_items: int | None = None, - ) -> "StreamHandle": + ) -> StreamHandle: """Create a stream and return a handle to it. ``retention`` is how long a closed stream stays readable, in seconds. - ``max_items`` caps how many messages remain readable, dropping the + ``max_items`` caps how many records remain readable, dropping the oldest, which bounds storage for a stream nobody truncates. """ lifecycle = stream.StreamLifecycle() @@ -147,14 +204,15 @@ async def create( if max_items is not None: lifecycle.max_items = max_items - response = await self._stub.CreateStream( + response = await _call( + self._stub.CreateStream, stream.CreateStreamRequest( frontend_request=stream.CreateStreamInput( namespace=self._namespace, stream_id=stream_id, lifecycle=lifecycle, ) - ) + ), ) return StreamHandle( self._stub, @@ -163,24 +221,25 @@ async def create( run_id=response.frontend_response.run_id, ) - def get(self, stream_id: str) -> "StreamHandle": + def get(self, stream_id: str) -> StreamHandle: """Open an existing stream without a round trip.""" return StreamHandle(self._stub, self._namespace, stream_id) def workflow_stream( self, workflow_id: str, name: str = "", *, owner_run_id: str = "" - ) -> "WorkflowStreamHandle": - """Open a stream a workflow publishes to. + ) -> WorkflowStreamHandle: + """Open a stream a workflow owns. A stream a workflow owns lives inside that workflow's execution and has no id of its own, so it is named by its owner and its name. An empty name is the workflow's default output stream, which is what - ``workflow.add_stream_messages`` writes to when it is given none. + ``workflow.append_stream_records`` writes to when it is given none. - The stream is created by the workflow's first publish. Reading one that - does not exist yet is not an error: it reads as empty and a - :meth:`WorkflowStreamHandle.follow` parked on it wakes when the - workflow publishes. + The stream is created by the workflow's first publish or subscription, + or by the first append from outside. Reading one that does not exist + yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when something + is written. ``owner_run_id`` pins the handle to one run of the workflow; see :meth:`WorkflowStreamHandle.pin` for why a follower wants that. @@ -191,7 +250,7 @@ def workflow_stream( class StreamHandle: - """A handle to one stream.""" + """A handle to one standalone stream.""" def __init__( self, stub: Any, namespace: str, stream_id: str, run_id: str = "" @@ -211,12 +270,11 @@ def id(self) -> str: async def append( self, - *messages: bytes, - topic: str = "", + *records: StreamRecord, producer_id: str = "", sequence: int = 0, ) -> Appended: - """Append messages and return where they landed. + """Append records and return where they landed. Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than @@ -224,26 +282,18 @@ async def append( at-least-once, which is only the right trade when duplicates are harmless. """ - response = await self._stub.AddMessages( + response = await _call( + self._stub.AddMessages, stream.AddMessagesRequest( frontend_request=stream.AddMessagesInput( namespace=self._namespace, stream_id=self._id, run_id=self._run_id, - messages=[ - stream.StreamMessage( - body=temporalio.api.common.v1.Payload( - data=m, metadata={"encoding": b"binary/plain"} - ), - topic=topic, - kind=stream.STREAM_MESSAGE_KIND_DATA, - ) - for m in messages - ], + records=[_to_service(record) for record in records], producer_id=producer_id, sequence=sequence, ) - ) + ), ) return _appended(response.frontend_response) @@ -251,43 +301,29 @@ async def read( self, *, from_offset: int = 0, - max_messages: int = 0, + max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, - ) -> tuple[list[Message], int]: - """Read once from ``from_offset``, returning the messages and the + ) -> tuple[list[StreamEntry], int]: + """Read once from ``from_offset``, returning the entries and the offset to read from next. With ``wait`` set, blocks until something arrives, the stream closes, or the server's long-poll window elapses. A window that elapses returns an empty list rather than raising, so the caller just reads again. """ - response = await self._stub.PollMessages( - stream.PollMessagesRequest( - frontend_request=stream.PollMessagesInput( - namespace=self._namespace, - stream_id=self._id, - run_id=self._run_id, - from_offset=from_offset, - max_messages=max_messages, - topics=list(topics), - wait_new_messages=wait, - ) - ) + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait ) - out = response.frontend_response - return [ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], (out.next_offset) + return page.entries, page.next_offset async def follow( self, *, from_offset: int = 0, topics: Sequence[str] = (), - ) -> AsyncIterator[Message]: - """Yield messages as they arrive, starting at ``from_offset``. + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, starting at ``from_offset``. Ends once the stream is closed and this reader has drained it. A closed stream stays readable until its retention expires, so a reader that @@ -296,61 +332,77 @@ async def follow( """ offset = from_offset while True: - response = await self._stub.PollMessages( - stream.PollMessagesRequest( - frontend_request=stream.PollMessagesInput( - namespace=self._namespace, - stream_id=self._id, - run_id=self._run_id, - from_offset=offset, - topics=list(topics), - wait_new_messages=True, - ) - ) - ) - out = response.frontend_response - for msg in out.messages: - yield Message(data=msg.body.data, topic=msg.topic, offset=msg.offset) - offset = out.next_offset - if out.closed and offset >= out.head_offset: + page = await self.poll(from_offset=offset, topics=topics) + for entry in page.entries: + yield entry + offset = page.next_offset + if page.closed and offset >= page.head_offset: return + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_records: int = 0, + wait: bool = True, + ) -> Page: + """One read, with everything the caller needs to decide what to do next.""" + response = await _call( + self._stub.PollMessages, + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_records, + topics=list(topics), + wait_new_messages=wait, + ) + ), + ) + return _page(response.frontend_response) + async def finish_writing(self, producer_id: str) -> None: """Declare one producer done without ending the stream for others.""" - await self._stub.FinishWriting( + await _call( + self._stub.FinishWriting, stream.FinishWritingRequest( frontend_request=stream.FinishWritingInput( namespace=self._namespace, stream_id=self._id, producer_id=producer_id, ) - ) + ), ) async def close(self) -> None: """Seal the stream. Readers can still drain what is already there.""" - await self._stub.CloseStream( + await _call( + self._stub.CloseStream, stream.CloseStreamRequest( frontend_request=stream.CloseStreamInput( namespace=self._namespace, stream_id=self._id ) - ) + ), ) async def describe(self) -> stream.StreamState: """Read the stream's current frontier, floor and closed state.""" - response = await self._stub.DescribeStream( + response = await _call( + self._stub.DescribeStream, stream.DescribeStreamRequest( frontend_request=stream.DescribeStreamInput( namespace=self._namespace, stream_id=self._id ) - ) + ), ) return response.frontend_response.state class WorkflowStreamHandle: - """A handle to a stream a workflow publishes to. + """A handle to a stream a workflow owns. The workflow writes to it from inside its Workflow Task, which costs it no transition of its own. Anything else writes through :meth:`append`, which @@ -404,8 +456,7 @@ def pin(self, run_id: str) -> None: async def append( self, - *messages: bytes, - topic: str = "", + *records: StreamRecord, producer_id: str = "", sequence: int = 0, ) -> Appended: @@ -415,27 +466,19 @@ async def append( execution whatever its size, so a batch of a hundred costs what a batch of one does. """ - response = await self._stub.AddWorkflowMessages( + response = await _call( + self._stub.AddWorkflowMessages, stream.AddWorkflowMessagesRequest( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, workflow_id=self._workflow_id, owner_run_id=self._owner_run_id, stream_name=self._name, - messages=[ - stream.StreamMessage( - body=temporalio.api.common.v1.Payload( - data=m, metadata={"encoding": b"binary/plain"} - ), - topic=topic, - kind=stream.STREAM_MESSAGE_KIND_DATA, - ) - for m in messages - ], + records=[_to_service(record) for record in records], producer_id=producer_id, sequence=sequence, ) - ) + ), ) return _appended(response.frontend_response) @@ -443,43 +486,28 @@ async def read( self, *, from_offset: int = 0, - max_messages: int = 0, + max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, - ) -> tuple[list[Message], int]: + ) -> tuple[list[StreamEntry], int]: """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" - response = await self._stub.PollWorkflowMessages( - stream.PollWorkflowMessagesRequest( - frontend_request=stream.PollWorkflowMessagesInput( - namespace=self._namespace, - workflow_id=self._workflow_id, - owner_run_id=self._owner_run_id, - stream_name=self._name, - from_offset=from_offset, - max_messages=max_messages, - topics=list(topics), - wait_new_messages=wait, - ) - ) + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait ) - out = response.frontend_response - return [ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], (out.next_offset) + return page.entries, page.next_offset async def follow( self, *, from_offset: int = 0, topics: Sequence[str] = (), - ) -> AsyncIterator[Message]: - """Yield messages as they arrive, as :meth:`StreamHandle.follow`.""" + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, as :meth:`StreamHandle.follow`.""" offset = from_offset while True: page = await self.poll(from_offset=offset, topics=topics) - for msg in page.messages: - yield msg + for entry in page.entries: + yield entry offset = page.next_offset if page.closed and offset >= page.head_offset: return @@ -489,16 +517,17 @@ async def poll( *, from_offset: int = 0, topics: Sequence[str] = (), - max_messages: int = 0, + max_records: int = 0, wait: bool = True, - ) -> "Page": + ) -> Page: """One read, with everything the caller needs to decide what to do next. :meth:`read` is the same call without the frontier and the closed flag. A caller that has to tell "nothing yet" from "nothing ever" needs both. On a pinned handle ``closed`` also says the run has ended. """ - response = await self._stub.PollWorkflowMessages( + response = await _call( + self._stub.PollWorkflowMessages, stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, @@ -506,22 +535,13 @@ async def poll( owner_run_id=self._owner_run_id, stream_name=self._name, from_offset=from_offset, - max_messages=max_messages, + max_messages=max_records, topics=list(topics), wait_new_messages=wait, ) - ) - ) - out = response.frontend_response - return Page( - messages=[ - Message(data=m.body.data, topic=m.topic, offset=m.offset) - for m in out.messages - ], - next_offset=out.next_offset, - head_offset=out.head_offset, - closed=out.closed, + ), ) + return _page(response.frontend_response) async def describe(self) -> stream.StreamState: """Read the stream's current frontier, floor and closed state. @@ -529,7 +549,8 @@ async def describe(self) -> stream.StreamState: A reader that wants only what comes next starts from the head this reports rather than from zero. """ - response = await self._stub.DescribeWorkflowStream( + response = await _call( + self._stub.DescribeWorkflowStream, stream.DescribeWorkflowStreamRequest( frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, @@ -537,7 +558,7 @@ async def describe(self) -> stream.StreamState: owner_run_id=self._owner_run_id, stream_name=self._name, ) - ) + ), ) return response.frontend_response.state @@ -551,6 +572,16 @@ def _appended(out: stream.AddMessagesOutput) -> Appended: ) +def _page(out: stream.PollMessagesOutput) -> Page: + return Page( + entries=[_to_public(record) for record in out.records], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + run_id=out.run_id, + ) + + # One channel per loop, target and namespace, shared by every handle in the # process. A channel is multiplexed and long lived, and callers open a handle # per subscription, which would otherwise be a connection per subscription. The diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index 690402974..95eb48d7e 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -7,10 +7,16 @@ still subscribes by topic from an offset. What changes is underneath. A publish is a Workflow Command whose payload never -enters History, so History gets one fixed-size event per batch rather than a -Signal per batch. A consumer reads the log directly rather than long-polling an -Update, so there is no per-Workflow limit on how many can read at once, and a -closed Workflow stays readable until its stream's retention expires. +enters History, so History gets one fixed-size event per Workflow Task rather +than a Signal per batch. A consumer reads the log directly rather than +long-polling an Update, so there is no per-Workflow limit on how many can read +at once, and a closed Workflow stays readable until its stream's retention +expires. + +As in the shipped feature, a topic here is a label on a record in the +Workflow's one default stream, which a consumer filters on. The provider in +:mod:`temporalio.streams.providers.native` keeps one stream per topic instead; +the two do not share a log. Prototype support for AI-198. It needs a server built from that branch, and it opens its own gRPC channel because sdk-core does not know the stream service @@ -27,10 +33,11 @@ from typing import Any, Generic, TypeVar, overload from temporalio import activity, workflow -from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client import Client, WorkflowExecutionDescription from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client -from temporalio.converter import PayloadConverter +from temporalio.common import RawValue +from temporalio.converter import PayloadCodec, PayloadConverter __all__ = [ "RawPage", @@ -48,12 +55,14 @@ @dataclass class RawPage: - """One read whose items are still encoded. + """One read whose items are still the stored records. ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + The bodies are as the server holds them, codec included, for a caller + that forwards records rather than using them. """ - items: list["WorkflowStreamItem[bytes]"] + items: list[WorkflowStreamItem[StreamRecord]] next_offset: int head_offset: int closed: bool @@ -72,49 +81,24 @@ class WorkflowStreamItem(Generic[T]): offset: int = 0 -def _encode(converter: PayloadConverter, value: Any) -> bytes: - """Serialize one value to a stream message body. - - The payload rather than the bare bytes, so the encoding metadata the - consumer needs to decode into a type travels with it. - - The codec chain is not applied here. Inside a Workflow it does not have to - be: the Worker runs the payload visitor with its codec over the commands - and activations, so a body that rides ``add_stream_messages`` is encoded - on the way out and one that arrives on ``deliver_stream_messages`` is - decoded on the way in, as every other payload is. The client path has no - such pass, and encoding one side but not the other is worse than encoding - neither: an Activity's messages would reach a consuming Workflow as - ciphertext it has no way to decode. :func:`_reject_configured_codec` - refuses a client with a codec until the client path applies one too. - """ - payload = value if isinstance(value, Payload) else converter.to_payloads([value])[0] - return payload.SerializeToString() - - -def _reject_configured_codec(client: Client) -> None: - """Refuse a namespace whose payloads are meant to be encoded. +def _record(converter: PayloadConverter, topic: str, value: Any) -> StreamRecord: + """The record one published value becomes. - Stream bodies bypass the codec chain, so proceeding would write payloads - this namespace expects to be encrypted in the clear, and would do it - silently. Raising is the only honest answer until the Worker-side plumbing - exists. + The body is the value's payload, so the encoding metadata the consumer + needs to decode into a type travels with it and a + :class:`temporalio.common.RawValue` passes through pre-encoded. """ - if client.data_converter.payload_codec is not None: - raise RuntimeError( - "this client has a payload codec configured, and server-side stream " - "bodies do not pass through it. Publishing would store them " - "unencoded. Use a client without a codec, or wait for codec support " - "on streams." - ) + record = StreamRecord(topic=topic, kind=StreamRecordKind.STREAM_RECORD_KIND_DATA) + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record -def _decode(converter: PayloadConverter, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) +def _decode( + converter: PayloadConverter, record: StreamRecord, as_type: type | None +) -> Any: if as_type is None: - return converter.from_payloads([payload])[0] - return converter.from_payloads([payload], [as_type])[0] + return converter.from_payloads([record.body])[0] + return converter.from_payloads([record.body], [as_type])[0] class WorkflowTopicHandle(Generic[T]): @@ -135,15 +119,17 @@ def type(self) -> type[T]: """The value type this handle is bound to.""" return self._type - def publish(self, value: T | Payload) -> None: + def publish(self, value: T | RawValue) -> None: """Append ``value`` to the Workflow's stream on this topic. - Returns as soon as the Command is issued. There is nothing to await: - the append is applied in the Workflow Task's own commit, so it costs - this Workflow no round trip and no extra transition. + Returns at once. There is nothing to await: the Workflow Task's + publishes become one command the server applies in the task's own + commit, so it costs this Workflow no round trip and no extra + transition. The Worker's payload codec applies to the body as it does + to any other payload the Workflow sends. """ - workflow.add_stream_messages( - [_encode(workflow.payload_converter(), value)], topic=self._name + workflow.append_stream_records( + [_record(workflow.payload_converter(), self._name, value)] ) @@ -178,7 +164,7 @@ class TopicHandle(Generic[T]): """A topic on a Workflow's stream, from outside that Workflow.""" def __init__( - self, client: "WorkflowStreamClient", topic: str, value_type: type[T] + self, client: WorkflowStreamClient, topic: str, value_type: type[T] ) -> None: """Prefer :meth:`WorkflowStreamClient.topic`.""" self._client = client @@ -195,7 +181,7 @@ def type(self) -> type[T]: """The value type this handle is bound to.""" return self._type - def publish(self, value: T | Payload, *, force_flush: bool = False) -> None: + def publish(self, value: T | RawValue, *, force_flush: bool = False) -> None: """Buffer ``value`` for the next flush. Buffered rather than sent, because an append costs one transition on @@ -232,15 +218,20 @@ def __init__( converter: PayloadConverter, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, *, + codec: PayloadCodec | None = None, describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, ) -> None: """Prefer :meth:`create` or :meth:`from_within_activity`. + ``codec`` is applied to every body this client sends and receives, so + a namespace whose payloads are encoded agrees with the Worker, whose + payload visitor applies the same codec to the Workflow's publishes. ``describe`` is how an unpinned handle learns which run it follows; see :meth:`WorkflowStreamHandle.pin`. """ self._handle = handle self._converter = converter + self._codec = codec self._batch_interval = batch_interval self._describe = describe self._buffered: list[tuple[str, Any]] = [] @@ -256,7 +247,7 @@ def create( *, owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, - ) -> "WorkflowStreamClient": + ) -> WorkflowStreamClient: """Open the stream owned by ``workflow_id``. Without ``owner_run_id`` the current run is looked up on the first @@ -264,20 +255,20 @@ def create( continue-as-new sees the run end rather than being moved to the successor's stream at a stale offset. """ - _reject_configured_codec(client) return cls( _stream_client(client).workflow_stream( workflow_id, owner_run_id=owner_run_id ), client.data_converter.payload_converter, batch_interval, + codec=client.data_converter.payload_codec, describe=client.get_workflow_handle(workflow_id).describe, ) @classmethod def from_within_activity( cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL - ) -> "WorkflowStreamClient": + ) -> WorkflowStreamClient: """Open the stream owned by the Workflow that scheduled this Activity.""" info = activity.info() if info.workflow_id is None: @@ -294,7 +285,7 @@ def from_within_activity( batch_interval=batch_interval, ) - async def __aenter__(self) -> "WorkflowStreamClient": + async def __aenter__(self) -> WorkflowStreamClient: """Start the background flusher.""" self._flusher = asyncio.create_task(self._run_flusher()) return self @@ -352,13 +343,12 @@ async def subscribe( """ del poll_cooldown await self._pin() - async for message in self._handle.follow( - from_offset=from_offset, topics=topics - ): + async for entry in self._handle.follow(from_offset=from_offset, topics=topics): + record = await self._decoded(entry.record) yield WorkflowStreamItem( - topic=message.topic, - data=_decode(self._converter, message.data, result_type), - offset=message.offset, + topic=record.topic, + data=_decode(self._converter, record, result_type), + offset=entry.offset, ) async def poll_raw( @@ -367,8 +357,8 @@ async def poll_raw( topics: Sequence[str] = (), from_offset: int = 0, wait: bool = True, - ) -> "RawPage": - """One read, with the bodies left as they were stored. + ) -> RawPage: + """One read, with the records left as they were stored. For a caller that forwards items on rather than using them. A gateway would only have to encode again what this decoded. @@ -379,8 +369,10 @@ async def poll_raw( ) return RawPage( items=[ - WorkflowStreamItem(topic=m.topic, data=m.data, offset=m.offset) - for m in page.messages + WorkflowStreamItem( + topic=entry.record.topic, data=entry.record, offset=entry.offset + ) + for entry in page.entries ], next_offset=page.next_offset, head_offset=page.head_offset, @@ -393,13 +385,11 @@ async def flush(self) -> None: if not pending: return await self._pin() - # One append per topic, because a batch carries a single topic. The - # harness case is one topic, so this is one append. - by_topic: dict[str, list[bytes]] = {} - for topic, value in pending: - by_topic.setdefault(topic, []).append(_encode(self._converter, value)) - for topic, bodies in by_topic.items(): - await self._handle.append(*bodies, topic=topic) + records = [ + await self._encoded(_record(self._converter, topic, value)) + for topic, value in pending + ] + await self._handle.append(*records) def _buffer(self, topic: str, value: Any) -> None: self._buffered.append((topic, value)) @@ -419,6 +409,16 @@ async def _run_flusher(self) -> None: self._wake.clear() await self.flush() + async def _encoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.encode([record.body]))[0]) + return record + + async def _decoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.decode([record.body]))[0]) + return record + def _stream_client(client: Client) -> StreamClient: return shared_client(client.service_client.config.target_host, client.namespace) diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py index 9b339dfe4..540f7f7d7 100644 --- a/tests/contrib/test_server_streams.py +++ b/tests/contrib/test_server_streams.py @@ -4,7 +4,7 @@ application does not have to know which of them wrote a given item. Needs a Temporal server built from the AI-198 branch: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/contrib/test_server_streams.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/contrib/test_server_streams.py """ from __future__ import annotations @@ -154,3 +154,8 @@ async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: ) ] assert resumed == [item.data.text for item in first[2:]] + + # The raw page carries the stored records themselves. + raw = await stream.poll_raw(topics=[TOPIC], from_offset=0, wait=False) + assert [item.data.topic for item in raw.items] == [TOPIC] * 5 + assert raw.closed and raw.next_offset == raw.head_offset == 5 diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index fde925cca..e3f16f38e 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -3,7 +3,7 @@ These need a Temporal server built from the AI-198 branch, because the stream service does not exist on a released server. Point them at one: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/test_client_stream.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/test_client_stream.py Skipped otherwise, rather than silently passing against a server that has no idea what a stream is. @@ -18,7 +18,11 @@ import pytest +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client_stream import StreamClient, StreamHandle +from temporalio.service import RPCError +from temporalio.streams import StreamNotFoundError TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -28,68 +32,113 @@ ) +def rec(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +def data(entries: list) -> list[bytes]: + return [entry.record.body.data for entry in entries] + + @pytest.fixture -async def stream() -> AsyncIterator[StreamHandle]: +async def streams() -> AsyncIterator[StreamClient]: client = StreamClient.connect( TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") ) try: - yield await client.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + yield client finally: await client.close() +@pytest.fixture +async def stream(streams: StreamClient) -> StreamHandle: + return await streams.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + + async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: - first = await stream.append(b"alpha", b"beta") + first = await stream.append(rec(b"alpha"), rec(b"beta")) assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) assert not first.deduplicated - assert (await stream.append(b"gamma")).first_offset == 2 + assert (await stream.append(rec(b"gamma"))).first_offset == 2 async def test_read_from_an_offset(stream: StreamHandle) -> None: - await stream.append(b"alpha", b"beta", b"gamma") + await stream.append(rec(b"alpha"), rec(b"beta"), rec(b"gamma")) - messages, next_offset = await stream.read() - assert [m.data for m in messages] == [b"alpha", b"beta", b"gamma"] + entries, next_offset = await stream.read() + assert data(entries) == [b"alpha", b"beta", b"gamma"] + assert [entry.offset for entry in entries] == [0, 1, 2] assert next_offset == 3 - messages, next_offset = await stream.read(from_offset=1) - assert [m.data for m in messages] == [b"beta", b"gamma"] + entries, next_offset = await stream.read(from_offset=1) + assert data(entries) == [b"beta", b"gamma"] assert next_offset == 3 async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: - await stream.append(b"alpha") + await stream.append(rec(b"alpha")) - messages, next_offset = await stream.read(from_offset=1) - assert messages == [] + entries, next_offset = await stream.read(from_offset=1) + assert entries == [] assert next_offset == 1, "a caught-up reader keeps its cursor" # Without an identity the append is at-least-once, so this is the only way a -# producer that retries can avoid writing the same message twice. +# producer that retries can avoid writing the same record twice. async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: - first = await stream.append(b"once", producer_id="p1", sequence=1) - retry = await stream.append(b"once", producer_id="p1", sequence=1) + first = await stream.append(rec(b"once"), producer_id="p1", sequence=1) + retry = await stream.append(rec(b"once"), producer_id="p1", sequence=1) assert first.first_offset == retry.first_offset == 0 assert not first.deduplicated - # The retry is told it wrote nothing, so a producer can report no position. + # The retry is told it wrote nothing and where the original landed. assert retry.deduplicated + assert retry.next_offset == first.next_offset - messages, _ = await stream.read() - assert [m.data for m in messages] == [b"once"] + entries, _ = await stream.read() + assert data(entries) == [b"once"] async def test_topics_filter_a_read(stream: StreamHandle) -> None: - await stream.append(b"tok", topic="tokens") - await stream.append(b"prog", topic="progress") - await stream.append(b"tok2", topic="tokens") + await stream.append(rec(b"tok", topic="tokens")) + await stream.append(rec(b"prog", topic="progress")) + await stream.append(rec(b"tok2", topic="tokens")) - messages, next_offset = await stream.read(topics=["tokens"]) - assert [m.data for m in messages] == [b"tok", b"tok2"] + entries, next_offset = await stream.read(topics=["tokens"]) + assert data(entries) == [b"tok", b"tok2"] + assert [entry.offset for entry in entries] == [0, 2] assert next_offset == 3, "the cursor advances past filtered-out offsets too" +# The record comes back as it went in: kind, producer identity and sequence +# are the server's to store, not to interpret. +async def test_the_record_roundtrips_field_for_field(stream: StreamHandle) -> None: + sent = rec(b"x", topic="t") + sent.producer_id = "model" + sent.attempt = 2 + sent.sequence = 7 + sent.metadata["trace"].CopyFrom(Payload(data=b"abc")) + finish = StreamRecord( + topic="t", kind=StreamRecordKind.STREAM_RECORD_KIND_FINISH, producer_id="model" + ) + await stream.append(sent, finish) + + entries, _ = await stream.read() + got = entries[0].record + assert (got.topic, got.producer_id, got.attempt, got.sequence) == ( + "t", + "model", + 2, + 7, + ) + assert got.kind == StreamRecordKind.STREAM_RECORD_KIND_DATA + assert got.metadata["trace"].data == b"abc" + assert entries[1].record.kind == StreamRecordKind.STREAM_RECORD_KIND_FINISH + assert not entries[1].record.HasField("body") + + # A closed stream stays readable, which is what removes the shutdown handshake # between producer and consumer. async def test_follow_drains_then_ends_when_the_stream_closes( @@ -98,13 +147,13 @@ async def test_follow_drains_then_ends_when_the_stream_closes( received: list[bytes] = [] async def follower() -> None: - async for message in stream.follow(): - received.append(message.data) + async for entry in stream.follow(): + received.append(entry.record.body.data) task = asyncio.create_task(follower()) - await stream.append(b"one") + await stream.append(rec(b"one")) await asyncio.sleep(0.2) - await stream.append(b"two") + await stream.append(rec(b"two")) await asyncio.sleep(0.2) await stream.close() @@ -115,15 +164,15 @@ async def follower() -> None: async def test_follow_started_late_still_sees_everything( stream: StreamHandle, ) -> None: - await stream.append(b"one", b"two") + await stream.append(rec(b"one"), rec(b"two")) await stream.close() - received = [m.data async for m in stream.follow()] + received = [entry.record.body.data async for entry in stream.follow()] assert received == [b"one", b"two"] async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: - await stream.append(b"one", b"two") + await stream.append(rec(b"one"), rec(b"two")) state = await stream.describe() assert state.head_offset == 2 @@ -131,3 +180,13 @@ async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: await stream.close() assert (await stream.describe()).closed + + +# The transport's own exception never escapes: a missing stream is the SDK's +# not-found error and anything else is its RPC error. +async def test_failures_surface_as_sdk_errors(streams: StreamClient) -> None: + missing = streams.get("py-test-missing-" + uuid.uuid4().hex[:8]) + with pytest.raises(StreamNotFoundError): + await missing.describe() + with pytest.raises((StreamNotFoundError, RPCError)): + await missing.append(rec(b"x")) From d3243e916dfa9b41255208426d0242a5f508ed7e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:47:37 -0700 Subject: [PATCH 502/831] Rewrote the native provider with one owned stream per topic. The workflow subscribes to the topic by name and publishes with the batched command; outside code appends and long-polls the same stream, following the run chain by cursor unless pinned. --- CHANGELOG.md | 14 +- temporalio/streams/providers/native.py | 698 +++++++++++----------- tests/streams/test_streams_conformance.py | 48 +- tests/worker/test_workflow_stream_e2e.py | 420 ++++++++----- 4 files changed, 693 insertions(+), 487 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06323a5cc..2f59cc1e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,13 +33,15 @@ to include examples, links to docs, or any other relevant information. is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. -- **Experimental**: server-side streams. A workflow reads a stream the server - delivers on its Workflow Tasks and publishes with a command, through - `temporalio.workflow.read_stream`, `subscribe_stream` and - `add_stream_messages`. `temporalio.client_stream` and +- **Experimental**: server-side streams. A workflow publishes to a stream it + owns with a command the server applies in its Workflow Task's commit, and + reads the ranges the server delivers on its Workflow Tasks, through + `temporalio.workflow.append_stream_records`, `subscribe_stream` and + `read_stream_records`. `temporalio.client_stream` and `temporalio.contrib.server_streams` reach the same stream from outside a - workflow, and `temporalio.streams.providers.native` puts it behind the shared - stream interface. Requires a server that serves the stream service. + workflow, and `temporalio.streams.providers.native.NativeStreams` puts it + behind the shared stream interface with one owned stream per topic. Requires + a server that serves the stream service. ### Changed diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 6dfdd4c25..ff0621031 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -1,176 +1,195 @@ """The server-side (native) provider. -Streams live on the Temporal server. A workflow publishes with a command that -the server applies in the same transaction that accepts the workflow task, and -consumes ranges the server attaches to the workflow task it dispatches. +Streams live on the Temporal server, beside the workflow that owns them. A +topic is one owned stream named after the topic, created by whoever touches it +first: the workflow publishes to it with a command the server applies in the +transaction that accepts the Workflow Task, subscribes to it by name and reads +the ranges the server delivers on its Workflow Tasks; outside code appends and +reads through the stream service, and the workflow's records and an outside +producer's land in one log in the order the server accepted them. + +A cursor names the run as well as the offset, because an owned stream belongs +to one run and a successor's starts over at zero. A handle without a run id +reads run after run, learning from the poll that a run's stream is closed and +from the run's close event who came next; with a run id it is pinned. + +Prototype support for AI-198. It needs a server built from that branch and +opens its own gRPC channel to it, because sdk-core does not know the stream +service yet, which is also why it does not support TLS or API keys. """ from __future__ import annotations -import asyncio import logging from collections.abc import AsyncGenerator -from datetime import timedelta from typing import Any -import grpc - from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.client_stream import StreamClient, close_shared_clients, shared_client -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._ids import inbound_stream_id -from temporalio.streams._policy import AttemptTracker +from temporalio.client import Client, WorkflowHistoryEventFilterType +from temporalio.client_stream import ( + StreamClient, + WorkflowStreamHandle, + close_shared_clients, + shared_client, +) +from temporalio.converter import PayloadCodec, PayloadConverter +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["NativeProducer", "NativeStreamHandle", "NativeStreams"] -_RUN_STATE = "__temporal_streams_state" +_PROVIDER = "native" logger = logging.getLogger(__name__) -class _Fanout: - """One server subscription, shared by every reader of that stream. +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") - The server sends a range once. Whoever reads it first would otherwise take - it from the others, so the pull happens here and the result goes to all - live readers. - """ - def __init__(self, stream: str) -> None: - self._stream = stream - self._subscribers: list[list[tuple[Cursor, bytes]]] = [] - self._pull: asyncio.Future[None] | None = None - - def attach(self) -> list[tuple[Cursor, bytes]]: - queue: list[tuple[Cursor, bytes]] = [] - self._subscribers.append(queue) - return queue - - def detach(self, queue: list[tuple[Cursor, bytes]]) -> None: - if queue in self._subscribers: - self._subscribers.remove(queue) - - async def next_batch( - self, queue: list[tuple[Cursor, bytes]] - ) -> list[tuple[Cursor, bytes]]: - while not queue: - pending = self._pull - if pending is None: - pending = self._pull = asyncio.ensure_future(self._run_pull()) - # Shielded because one reader going away must not cancel a range - # the server will not send again. - await asyncio.shield(pending) - batch, queue[:] = list(queue), [] - return batch - - async def _run_pull(self) -> None: - try: - delivered = await workflow.read_stream_messages(self._stream) - arrived = [ - (Cursor(str(message.offset)), message.body) for message in delivered - ] - for queue in self._subscribers: - queue.extend(arrived) - finally: - self._pull = None +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") -def _fanouts() -> dict[str, _Fanout]: - instance = workflow.instance() - state = getattr(instance, _RUN_STATE, None) - if state is None: - state = {} - setattr(instance, _RUN_STATE, state) - return state +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "native provider" + ) from None -class _NativeReadSource: - def __init__(self, fanout: _Fanout) -> None: - self._fanout = fanout - self._queue = fanout.attach() +async def _encode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + # The worker's payload visitor runs a codec over the bodies a workflow + # publishes and receives; the outside half has no such pass, so it applies + # the client's codec here or the two sides would not agree. + if codec is None or not record.HasField("body"): + return record + encoded = await codec.encode([record.body]) + record.body.CopyFrom(encoded[0]) + return record - async def next_batch(self) -> list[tuple[Cursor, bytes]]: - return await self._fanout.next_batch(self._queue) - def close(self) -> None: - self._fanout.detach(self._queue) - - -class _NativeWriteSink: - def __init__(self, topic: str) -> None: - self._topic = topic +async def _decode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + if codec is None or not record.HasField("body"): + return record + decoded = await codec.decode([record.body]) + record.body.CopyFrom(decoded[0]) + return record - async def publish(self, frame: bytes) -> None: - # Nothing is awaited. The server applies the payload when it accepts - # the task, so there is no back pressure to wait on and no round trip - # to pay for. The signature is awaitable because the contract allows a - # provider that does hold a publisher back. - workflow.add_stream_messages([frame], stream_id="", topic=self._topic) +class _NativeReadSource: + """One subscription of the running workflow, fed by delivered ranges.""" -def _reject_configured_codec(client: Client) -> None: - """Refuse a namespace whose payloads are meant to be encoded. + def __init__(self, stream_id: str, run_id: str) -> None: + self._stream_id = stream_id + self._run_id = run_id + self._closed = False - Stream bodies do not pass through the codec chain on this provider, so - proceeding would store in the clear what the namespace expects encrypted, - and would do it without saying so. - """ - if client.data_converter.payload_codec is not None: - raise RuntimeError( - "this client has a payload codec configured, and server-side stream " - "bodies do not pass through it" - ) + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + if self._closed: + raise StopAsyncIteration + delivered = await workflow.read_stream_records(self._stream_id) + return [(_cursor(self._run_id, item.offset), item.record) for item in delivered] + def close(self) -> None: + self._closed = True -# Streams this process has already opened, so a second producer for the same -# stream reuses the handle rather than asking the server to create it again. -# The second create is answered correctly, and it is still a failed call the -# server logs, which is noise an operator has to learn to ignore. -_handles: dict[tuple[str, str, str], Any] = {} +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic -def _stream_client(client: Client) -> StreamClient: - return shared_client(client.service_client.config.target_host, client.namespace) + def publish(self, record: WireRecord) -> None: + # Held by the runtime until the task completes, when the task's + # records on this topic become one command the server applies with + # the task: rule 1 through the server's own commit. + workflow.append_stream_records([record], stream_id=self._topic) + + +class _NativeWorkflowProvider: + """The workflow half: the server's commands and delivered ranges.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's stream is its own" + ) + start = named[1] + 1 + workflow.subscribe_stream(topic, start_offset=start) + return _NativeReadSource(topic, run_id) + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _NativeWriteSink(topic) -async def _owner_run(client: Client, workflow_id: str) -> str: - """The run whose stream a handle on ``workflow_id`` should address. + def on_workflow_start(self) -> None: + pass - Resolved once, when the handle opens. Left to the server, a follower whose - workflow continued as new would be redirected to the successor, whose - stream starts empty, and its offset read as "caught up" rather than as a - position on the run it was watching. A producer is pinned for the same - reason: an activity's output belongs to the run that scheduled it. - """ - return (await client.get_workflow_handle(workflow_id).describe()).run_id + async def on_workflow_finish(self) -> None: + pass class NativeProducer: - """Appends to a stream from outside workflow code. + """Appends to a topic from outside workflow code. - Every append is visible as soon as it is written. That is the point for an - activity streaming model output, and it is why an activity carries its own - identity: the retry of a failed attempt has no commit boundary to sort it - out afterwards. + Every append is visible as soon as the server accepts it. That is the + point for an activity streaming model output, and it is why an activity + carries its own identity: the retry of a failed attempt has no commit + boundary to sort it out afterwards. """ def __init__( self, - handle: Any, - converter: Any, + handle: WorkflowStreamHandle, + pin: Any, + codec: PayloadCodec | None, + converter: PayloadConverter, topic: str, producer_id: str, attempt: int, ) -> None: """Bind this producer to ``topic`` on the stream ``handle`` names.""" self._handle = handle + self._pin = pin + self._codec = codec self._converter = converter self._topic = topic self._producer_id = producer_id self._attempt = attempt self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id @property def attempt(self) -> int: @@ -178,265 +197,260 @@ def attempt(self) -> int: return self._attempt @property - def _provider_id(self) -> str: - """The identity the provider dedupes on. - - The attempt is part of it. Deduplication answers "is this the same - append again", and a second attempt writing different words at the same - sequence is not. Folding the attempt in keeps a retried append idempotent - without letting a new generation be swallowed as a duplicate of the old - one. - """ + def _writer(self) -> str: + # The server dedupes on this and the sequence. The attempt is part of + # it so a retried append is dropped while a new generation writing + # different words at the same sequence is not. return ( f"{self._producer_id}#{self._attempt}" if self._attempt else self._producer_id ) - async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` and return the last one's cursor, or ``None`` if nothing landed.""" + async def append(self, *values: Any) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed, because the server + answers a deduplicated batch with the original offsets; an empty call + returns the position of this producer's last record. + """ if not values: - return None - frames = [] - for value in values: - frames.append( - _frame.encode( + return self._last + return await self._write( + [ + to_wire( + self._converter, topic=self._topic, kind=RecordKind.DATA, - producer=self._producer_id, + value=value, + producer_id=self._producer_id, attempt=self._attempt, - sequence=self._sequence, - body=self._encode(value), + sequence=self._sequence + index, ) - ) - self._sequence += 1 - appended = await self._handle.append( - *frames, - topic=self._topic, - producer_id=self._provider_id, - # The provider dedupes a retried append on this pair, which is a - # different job from telling readers that a new generation started. - sequence=self._sequence - len(frames), + for index, value in enumerate(values) + ] ) - if appended.deduplicated: - return None - return Cursor(str(appended.next_offset - 1)) async def finish(self) -> None: - """Declare this stream complete.""" - frame = _frame.encode( - topic=self._topic, - kind=RecordKind.FINISH, - producer=self._producer_id, - attempt=self._attempt, - sequence=self._sequence, - body=b"", - ) - self._sequence += 1 - await self._handle.append( - frame, - topic=self._topic, - producer_id=self._provider_id, - sequence=self._sequence - 1, + """Write ``FINISH`` for this producer on this topic.""" + await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] ) - def _encode(self, value: Any) -> bytes: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + async def _write(self, records: list[WireRecord]) -> Cursor: + # Pinned before the first write, so every cursor this producer hands + # out names the run its records landed in. + if not self._handle.owner_run_id: + self._handle.pin(await self._pin()) + for record in records: + await _encode_body(self._codec, record) + appended = await self._handle.append( + *records, producer_id=self._writer, sequence=self._sequence ) - return payload.SerializeToString() - - -class NativeConsumer: - """Reads a stream from outside workflow code, resumably.""" - - def __init__(self, handle: Any, converter: Any, stream: str, address: str) -> None: - """Read the stream ``handle`` names, from anywhere. + self._sequence += len(records) + self._last = _cursor(self._handle.owner_run_id, appended.next_offset - 1) + return self._last + + +class NativeStreamHandle: + """One workflow's topics from outside, over the stream service.""" + + def __init__(self, client: Client, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s topics, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = client.data_converter.payload_converter + self._codec = client.data_converter.payload_codec + self._streams: StreamClient | None = None + + def _service(self) -> StreamClient: + # Resolved on first use, because the shared channel belongs to the + # running loop and a handle may be made before there is one. + if self._streams is None: + self._streams = shared_client( + self._client.service_client.config.target_host, + self._client.namespace, + ) + return self._streams - ``stream`` is the inbound name the caller used, empty for the owner's - stream; ``address`` is what the server calls it, for log lines. - """ - self._handle = handle - self._converter = converter - self._stream = stream - self._address = address + def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: + return self._service().workflow_stream( + self._workflow_id, topic, owner_run_id=run_id + ) - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield the records after ``after`` as they arrive. + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + _require_topic(topic) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) - Applies the same supersession rule as a workflow reader, so a browser - and a workflow watching one activity agree on which attempt is current. + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + stream = self._stream(topic, run_id) + while True: + page = await stream.poll(from_offset=offset) + for entry in page.entries: + record = await _decode_body(self._codec, entry.record) + for out in decoder.decode(_cursor(run_id, entry.offset), record): + yield out + offset = page.next_offset + # On a pinned stream the server reports the run's end as closed, + # and a closed stream is finished once its head is delivered. + if page.closed and offset >= page.head_offset: + break + if self._run_id is not None: + return + successor = await self._successor(run_id) + if successor is None: + return + run_id, offset = successor, 0 + + async def latest(self, *, topic: str) -> Cursor: + """The cursor of the newest record on ``topic``, naming the run it was read from. + + An empty topic on the chain's first run is the beginning of the + stream; on a successor it is a position of its own, because + ``BEGINNING`` would send a chain-following read back to the first run. """ - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() - async for message in self._handle.follow( - from_offset=int(after.token) + 1 if after.token else 0 - ): - cursor = Cursor(str(message.offset)) - try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - message.data - ) - except ValueError as error: - # Same answer as the workflow-side reader: skip and say so. - logger.warning( - "skipping record %s of stream %s: %s", cursor, self._address, error - ) - continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + _require_topic(topic) + run_id = self._run_id or await self._current_run() + try: + head = (await self._stream(topic, run_id).describe()).head_offset + except StreamNotFoundError: + # A topic nobody has written yet does not exist on the server, + # which is the same answer as an empty one. + head = 0 + if head > 0: + return _cursor(run_id, head - 1) + if self._run_id is None and await self._predecessor(run_id) is not None: + return _cursor(run_id, -1) + return BEGINNING + + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 + ) -> NativeProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return NativeProducer( + self._stream(topic, self._run_id or ""), + self._current_run, + self._codec, + self._converter, + topic, + producer_id, + attempt, + ) - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" - del topic # one server-side log per stream, whatever the topic + async def _current_run(self) -> str: + try: + description = await self._client.get_workflow_handle( + self._workflow_id + ).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert description.run_id is not None + return description.run_id + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + run_id = await self._current_run() + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) try: - state = await self._handle.describe() - except grpc.aio.AioRpcError as error: - # A stream nobody has published to does not exist yet, and that - # is the same answer as an empty one. Any other failure is not: - # a reader that took it for "empty" would replay the whole stream. - if error.code() is not grpc.StatusCode.NOT_FOUND: + async for event in handle.fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: raise - return BEGINNING - return ( - Cursor(str(state.head_offset - 1)) if state.head_offset > 0 else BEGINNING - ) + # The run's History is gone: the chain's retained part starts here. + return None - def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + async def _successor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + try: + async for event in events: + if event.HasField( + "workflow_execution_continued_as_new_event_attributes" + ): + attributes = ( + event.workflow_execution_continued_as_new_event_attributes + ) + return attributes.new_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + return None -class _NativeProvider: - name = "native" +class NativeStreams(ProviderPlugin): + """The server-side provider. - def configure(self, **options: Any) -> None: - """Take no options. + Takes no options: the streams are on the server the client is already + connected to. Construct one, pass it to the worker as a plugin and open + handles from it anywhere else; :meth:`close` releases the channels this + process opened to the stream service. + """ - The streams are on the server the client is already connected to. - This exists so a process that switches providers changes one call - rather than its structure. - """ - if options: - raise TypeError( - f"the native provider takes no options, got {sorted(options)}" - ) + def workflow_provider(self) -> _NativeWorkflowProvider: + """The workflow half, over the server's commands and delivered ranges.""" + return _NativeWorkflowProvider() - def worker_options(self) -> dict[str, Any]: - return {} + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> NativeStreamHandle: + """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain.""" + return NativeStreamHandle(client, workflow_id, run_id) async def close(self) -> None: """Close the channels this process opened to the stream service.""" await close_shared_clients() - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - # Accepted and ignored. Delivery arrives on workflow tasks the server - # dispatches, so no worker is held between records and there is nothing - # for an idle timeout to release. - del idle_timeout - stream_id = inbound_stream_id(workflow.info().workflow_id, stream) - fanouts = _fanouts() - fanout = fanouts.get(stream_id) - if fanout is None: - workflow.subscribe_stream( - stream_id, start_offset=int(after.token) + 1 if after.token else 0 - ) - fanout = fanouts[stream_id] = _Fanout(stream_id) - return _NativeReadSource(fanout) - - def open_write(self, topic: str) -> WriteSink: - return _NativeWriteSink(topic) - - async def producer( - self, - client: Client, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, - ) -> NativeProducer: - """Open a producer on ``workflow_id``'s account. - - ``stream`` names an inbound stream, a namespace-level stream the - server keys by the pair. With none, ``topic`` names a topic on the - stream the workflow publishes, which the server lets any producer - append to. An inbound record carries no topic: the stream's name is - its whole address. - """ - _reject_configured_codec(client) - streams = _stream_client(client) - converter = client.data_converter.payload_converter - if not stream: - handle: Any = streams.workflow_stream( - workflow_id, owner_run_id=await _owner_run(client, workflow_id) - ) - return NativeProducer(handle, converter, topic, producer_id, attempt) - stream_id = inbound_stream_id(workflow_id, stream) - key = (client.service_client.config.target_host, client.namespace, stream_id) - handle = _handles.get(key) - if handle is None: - try: - handle = await streams.create(stream_id) - except Exception: - # Created by whoever set the stream up. A producer opening a - # stream it does not own is the ordinary case, not the - # exception. - handle = streams.get(stream_id) - _handles[key] = handle - return NativeProducer(handle, converter, topic, producer_id, attempt) - - async def consumer( - self, client: Client, *, workflow_id: str, stream: str = "" - ) -> NativeConsumer: - """Open a reader for what ``workflow_id`` publishes. - - An empty ``stream`` reads what the workflow wrote through - :func:`temporalio.streams.writer`. Naming one reads that inbound - stream instead, which is how a second consumer follows the same input. - """ - _reject_configured_codec(client) - streams = _stream_client(client) - address = inbound_stream_id(workflow_id, stream) - if stream: - handle: Any = streams.get(address) - else: - handle = streams.workflow_stream( - workflow_id, owner_run_id=await _owner_run(client, workflow_id) - ) - return NativeConsumer( - handle, client.data_converter.payload_converter, stream, address - ) - - -_provider.register("native", _NativeProvider) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9002ea16a..c873f986d 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,6 +21,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass @@ -28,8 +29,9 @@ import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -46,6 +48,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.native import NativeStreams +from tests.helpers import new_worker # Defined once and shared by every case, the way an application shares them # between its workflow, its activities and its backend. @@ -91,9 +95,51 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: + # The store is a server built from the stream-carrying branch, which the + # test environment's own server is not; TEMPORAL_ADDRESS names it. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = NativeStreams() + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost, plugins=[provider]) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase("native", provider, client, host=host) + for handle in hosts.values(): + await handle.terminate() + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { "memory": _memory_case } +if os.environ.get("STREAMS_LIVE") == "native": + SETUPS["native"] = _native_case _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 31296b2c8..a41b2a495 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -1,10 +1,12 @@ -"""A workflow publishing to a stream it owns and reading its own messages back. +"""The native provider inside a real workflow, against a server that has streams. -Path A and Path C together, both from workflow code. Needs a Temporal server -built from the AI-198 branch, because neither the stream service nor the -commands exist on a released one: +The two rules the memory provider cannot keep are the measurement here: a +publish commits with its Workflow Task and never lands if the task fails, and +a read is a recorded observation the server re-supplies on replay. Needs a +Temporal server built from the AI-198 branch, because neither the stream +service nor the commands exist on a released one: - TEMPORAL_STREAM_TARGET=localhost:7233 uv run pytest tests/worker/test_workflow_stream_e2e.py + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/worker/test_workflow_stream_e2e.py Skipped otherwise, rather than passing against a server that has no idea what a stream is. @@ -15,13 +17,20 @@ import asyncio import os import uuid +from typing import Any import pytest from temporalio import workflow +from temporalio.api.common.v1 import Payload from temporalio.api.enums.v1 import EventType +from temporalio.api.stream.v1 import StreamRecord from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import RecordKind +from temporalio.streams.providers.native import NativeStreams from temporalio.worker import Worker +from tests.streams.test_streams_conformance import take TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -30,36 +39,264 @@ reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", ) -STREAM = "output" +INPUTS = "inputs" +DECISIONS = "decisions" EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED -EVENT_STREAM_MESSAGES_ADDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_MESSAGES_ADDED +EVENT_STREAM_RECORDS_APPENDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED + + +async def _connect() -> Client: + return await Client.connect(TARGET or "") + + +async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: + counts = { + EVENT_STREAM_RECORDS_APPENDED: 0, + EVENT_STREAM_SUBSCRIBED: 0, + EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: 0, + } + async for event in client.get_workflow_handle(workflow_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + return counts + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "replaced": record.supersession.previous_attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) + trace.append({"kind": "decision", "n": record.value["n"]}) + decisions.finish() + return trace + + +async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None: + """Rule 2 on the native provider: every task replays from the server. + + With the cache off, each Workflow Task rebuilds the workflow from History + and the server re-supplies the ranges earlier tasks consumed, so the loop + completing at all means the same records came back in the same order. + """ + client = await _connect() + provider = NativeStreams() + task_queue = "loop-tq-" + uuid.uuid4().hex[:8] + workflow_id = "loop-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + plugins=[provider], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"n": 1}, {"n": 2}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"n": 3}) + await second.finish() + trace = await asyncio.wait_for(handle.result(), 60) + + assert trace == [ + {"kind": "decision", "n": 1}, + {"kind": "decision", "n": 2}, + {"kind": "superseded", "replaced": 1}, + {"kind": "decision", "n": 3}, + {"kind": "finish", "producer": "model"}, + ] + + # The read ends by itself: the workflow is closed and the tail + # delivered, with the workflow's own records carrying no producer. + async def read_everything() -> list[Any]: + return [ + (r.producer_id, r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + assert await asyncio.wait_for(read_everything(), 60) == [ + ("", RecordKind.DATA, {"decided": 1}), + ("", RecordKind.DATA, {"decided": 2}), + ("", RecordKind.DATA, {"retracting_attempt": 1}), + ("", RecordKind.DATA, {"decided": 3}), + ("", RecordKind.FINISH, None), + ] + counts = await _event_counts(client, workflow_id) + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + # Several tasks published, one event each; the loop spanned more than + # one task or the cold cache proved nothing. + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 2 + assert ( + 1 + <= counts[EVENT_STREAM_RECORDS_APPENDED] + <= counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] + ) + finally: + await provider.close() + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + decisions.finish() + + +async def test_a_failed_task_publishes_nothing() -> None: + """Rule 1 on the native provider: the server applies the command with the task.""" + client = await _connect() + provider = NativeStreams() + task_queue = "fail-tq-" + uuid.uuid4().hex[:8] + workflow_id = "fail-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishThenFail], + plugins=[provider], + ): + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + records = await take( + stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60 + ) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] + finally: + await provider.close() + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new() -> None: + client = await _connect() + provider = NativeStreams() + task_queue = "relay-tq-" + uuid.uuid4().hex[:8] + workflow_id = "relay-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, task_queue=task_queue, workflows=[Relay], plugins=[provider] + ): + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 60) + await handle.result() + # The chain is followed: the successor's record arrives on the same + # read, each cursor names its run, and the read ends with the chain. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + # Pinned to the last run, a handle sees that run's stream alone. + last_run = (await client.get_workflow_handle(workflow_id).describe()).run_id + pinned = provider.get_stream_handle(client, workflow_id, run_id=last_run) + only_last = [ + r.value async for r in pinned.read(topic=DECISIONS, result_type=dict) + ] + assert only_last == [{"run": 1}, None] + finally: + await provider.close() @workflow.defn class PublishAndRead: + """Publishes through the low-level surface and reads its own records back.""" + @workflow.run async def run(self) -> list[str]: - # Published before subscribing, because a subscription resolves against - # the streams the workflow already owns and this is what creates one. - workflow.add_stream_messages( - [b"alpha", b"beta", b"gamma"], stream_id=STREAM, topic="progress" + workflow.append_stream_records( + [_record(b"alpha", "progress"), _record(b"beta", "progress")], + stream_id="output", ) - workflow.add_stream_messages([b"delta"], stream_id=STREAM) - - workflow.subscribe_stream(STREAM, start_offset=0) + workflow.append_stream_records([_record(b"gamma")], stream_id="output") + # A name this workflow has not written yet still names a stream it + # owns, so subscribing creates the one the later publish lands in. + workflow.subscribe_stream("output", start_offset=0) received: list[str] = [] - while len(received) < 4: - for body in await workflow.read_stream(STREAM): - received.append(body.decode()) + while len(received) < 3: + for item in await workflow.read_stream_records("output"): + received.append(item.record.body.data.decode()) return received -async def test_workflow_reads_back_what_it_published() -> None: - client = await Client.connect(TARGET or "") +def _record(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +async def test_a_tasks_publishes_become_one_event() -> None: + client = await _connect() task_queue = "publish-tq-" + uuid.uuid4().hex[:8] - wf_id = "publish-wf-" + uuid.uuid4().hex[:8] + workflow_id = "publish-wf-" + uuid.uuid4().hex[:8] async with Worker( client, @@ -71,111 +308,26 @@ async def test_workflow_reads_back_what_it_published() -> None: ): result = await asyncio.wait_for( client.execute_workflow( - PublishAndRead.run, id=wf_id, task_queue=task_queue + PublishAndRead.run, id=workflow_id, task_queue=task_queue ), timeout=60, ) + assert result == ["alpha", "beta", "gamma"] - assert result == ["alpha", "beta", "gamma", "delta"] - - counts = {EVENT_STREAM_MESSAGES_ADDED: 0, EVENT_STREAM_SUBSCRIBED: 0} - async for event in client.get_workflow_handle(wf_id).fetch_history_events(): - if event.event_type in counts: - counts[event.event_type] += 1 - - # Two calls carrying four messages, so two events: the event is per batch, - # which is what makes batching free. - assert counts[EVENT_STREAM_MESSAGES_ADDED] == 2 + counts = await _event_counts(client, workflow_id) + # Two calls in one task carrying three records, so one event: the event is + # per task and stream, which is what makes publishing often free. + assert counts[EVENT_STREAM_RECORDS_APPENDED] == 1 assert counts[EVENT_STREAM_SUBSCRIBED] == 1 -@workflow.defn -class PublishOnSignal: - """Publishes a token per signal, which is the shape an agent turn has.""" - - def __init__(self) -> None: - self._pending: list[str] = [] - self._done = False - - @workflow.run - async def run(self) -> int: - published = 0 - while True: - await workflow.wait_condition(lambda: bool(self._pending) or self._done) - while self._pending: - workflow.add_stream_messages([self._pending.pop(0).encode()]) - published += 1 - if self._done: - return published - - @workflow.signal - async def emit(self, token: str) -> None: - self._pending.append(token) - - @workflow.signal - async def finish(self) -> None: - self._done = True - - -async def test_a_client_follows_what_a_workflow_publishes() -> None: - """The harness shape: the workflow writes, something outside it reads live. - - A stream a workflow owns has no id, so the reader addresses it by the - owner. It also attaches before the first publish, which is what a UI opening - on a session does. - """ - from temporalio.client_stream import StreamClient - - client = await Client.connect(TARGET or "") - streams = StreamClient.connect(TARGET or "") - task_queue = "follow-tq-" + uuid.uuid4().hex[:8] - wf_id = "follow-wf-" + uuid.uuid4().hex[:8] - - tokens = [f"token-{i}" for i in range(5)] - received: list[str] = [] - - try: - async with Worker( - client, - task_queue=task_queue, - workflows=[PublishOnSignal], - max_cached_workflows=0, - ): - handle = await client.start_workflow( - PublishOnSignal.run, id=wf_id, task_queue=task_queue - ) - - # Attached before anything is published, so the stream does not - # exist yet and the first poll has to park rather than fail. - reader = streams.workflow_stream(wf_id) - assert (await reader.describe()).head_offset == 0 - - async def follow() -> None: - async for message in reader.follow(): - received.append(message.data.decode()) - if len(received) == len(tokens): - return - - following = asyncio.ensure_future(follow()) - for token in tokens: - await handle.signal(PublishOnSignal.emit, token) - await asyncio.wait_for(following, timeout=60) - - await handle.signal(PublishOnSignal.finish) - assert await asyncio.wait_for(handle.result(), timeout=60) == len(tokens) - finally: - await streams.close() - - assert received == tokens - - @workflow.defn class ConsumeAcrossTasks: - """Reads a stream over several Workflow Tasks, then reports what it saw. + """Reads a standalone stream over several Workflow Tasks, then reports what it saw. - The turn structure is the point: each `read_stream` that finds nothing - blocks, which ends a Workflow Task, so the run spans several. With the - cache on, every task after the first is sticky. + The turn structure is the point: each read that finds nothing blocks, + which ends a Workflow Task, so the run spans several. With the cache on, + every task after the first is sticky. """ @workflow.run @@ -183,25 +335,22 @@ async def run(self, stream_id: str, expected: int) -> list[str]: workflow.subscribe_stream(stream_id, start_offset=0) seen: list[str] = [] while len(seen) < expected: - for body in await workflow.read_stream(stream_id): - seen.append(body.decode()) + for item in await workflow.read_stream_records(stream_id): + seen.append(item.record.body.data.decode()) return seen async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: """The workflow cache stays on, which is what a real worker does. - Every other end-to-end test here disables it, so the sticky path was never - exercised. The server sends no replay slice for a sticky task, while the - sticky history still carries the previous task's consumed range, and the - two together used to fail every task after the first consumed range. + The server sends no replay slice for a sticky task, while the sticky + history still carries the previous task's consumed range, and the two + together have to agree on every task after the first consumed range. """ - from temporalio.client_stream import StreamClient - - client = await Client.connect(TARGET or "") + client = await _connect() streams = StreamClient.connect(TARGET or "") task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] - wf_id = "sticky-wf-" + uuid.uuid4().hex[:8] + workflow_id = "sticky-wf-" + uuid.uuid4().hex[:8] stream_id = "sticky-src-" + uuid.uuid4().hex[:8] batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] @@ -210,15 +359,12 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: try: await streams.create(stream_id) async with Worker( - client, - task_queue=task_queue, - workflows=[ConsumeAcrossTasks], - # Left at the default deliberately. This is what the test is for. + client, task_queue=task_queue, workflows=[ConsumeAcrossTasks] ): handle = await client.start_workflow( ConsumeAcrossTasks.run, args=[stream_id, len(expected)], - id=wf_id, + id=workflow_id, task_queue=task_queue, ) @@ -226,18 +372,16 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: # them. Without the gap the appends coalesce into one task and the # sticky path is never taken. for batch in batches: - await streams.get(stream_id).append(*[t.encode() for t in batch]) + await streams.get(stream_id).append( + *[_record(t.encode()) for t in batch] + ) await asyncio.sleep(0.4) assert await asyncio.wait_for(handle.result(), timeout=60) == expected - # More than one Workflow Task ran, otherwise the test proves nothing. - completed = 0 - async for event in client.get_workflow_handle(wf_id).fetch_history_events(): - if event.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: - completed += 1 - assert completed >= 3, ( - f"only {completed} workflow tasks, sticky path not exercised" + counts = await _event_counts(client, workflow_id) + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 3, ( + "sticky path not exercised" ) finally: await streams.close() From 45bd0abcd508fe4229563a74a48c840f3f9d1c6c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:30:39 -0700 Subject: [PATCH 503/831] Opened the native tests' handles through client.get_stream_handle. --- tests/streams/test_streams_conformance.py | 7 +++++- tests/worker/test_workflow_stream_e2e.py | 27 +++++++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index c873f986d..3bdc93e1a 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -120,8 +120,13 @@ async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") ) provider = NativeStreams() + # Registered once, on the client: the host's worker inherits it and the + # cases open handles through client.get_stream_handle. + config = client.config() + config["plugins"] = [provider] + client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost, plugins=[provider]) as worker: + async with new_worker(client, StreamHost) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index a41b2a495..1d974b401 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -46,8 +46,11 @@ EVENT_STREAM_RECORDS_APPENDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED -async def _connect() -> Client: - return await Client.connect(TARGET or "") +async def _connect(provider: NativeStreams | None = None) -> Client: + # Registered once, on the client: the worker inherits it and the tests + # open handles through client.get_stream_handle. The contrib tests below + # need no provider. + return await Client.connect(TARGET or "", plugins=[provider] if provider else []) async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: @@ -101,8 +104,8 @@ async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None and the server re-supplies the ranges earlier tasks consumed, so the loop completing at all means the same records came back in the same order. """ - client = await _connect() provider = NativeStreams() + client = await _connect(provider) task_queue = "loop-tq-" + uuid.uuid4().hex[:8] workflow_id = "loop-wf-" + uuid.uuid4().hex[:8] try: @@ -110,13 +113,12 @@ async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None client, task_queue=task_queue, workflows=[ContractLoop], - plugins=[provider], max_cached_workflows=0, ): handle = await client.start_workflow( ContractLoop.run, id=workflow_id, task_queue=task_queue ) - stream = provider.get_stream_handle(client, workflow_id) + stream = client.get_stream_handle(workflow_id) first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await first.append({"n": 1}, {"n": 2}) second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) @@ -185,8 +187,8 @@ async def run(self) -> None: async def test_a_failed_task_publishes_nothing() -> None: """Rule 1 on the native provider: the server applies the command with the task.""" - client = await _connect() provider = NativeStreams() + client = await _connect(provider) task_queue = "fail-tq-" + uuid.uuid4().hex[:8] workflow_id = "fail-wf-" + uuid.uuid4().hex[:8] try: @@ -194,12 +196,11 @@ async def test_a_failed_task_publishes_nothing() -> None: client, task_queue=task_queue, workflows=[PublishThenFail], - plugins=[provider], ): handle = await client.start_workflow( PublishThenFail.run, id=workflow_id, task_queue=task_queue ) - stream = provider.get_stream_handle(client, workflow_id) + stream = client.get_stream_handle(workflow_id) records = await take( stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60 ) @@ -226,18 +227,16 @@ async def run(self, run: int) -> None: async def test_a_handle_without_a_run_id_reads_across_continue_as_new() -> None: - client = await _connect() provider = NativeStreams() + client = await _connect(provider) task_queue = "relay-tq-" + uuid.uuid4().hex[:8] workflow_id = "relay-wf-" + uuid.uuid4().hex[:8] try: - async with Worker( - client, task_queue=task_queue, workflows=[Relay], plugins=[provider] - ): + async with Worker(client, task_queue=task_queue, workflows=[Relay]): handle = await client.start_workflow( Relay.run, 0, id=workflow_id, task_queue=task_queue ) - stream = provider.get_stream_handle(client, workflow_id) + stream = client.get_stream_handle(workflow_id) async def read_everything() -> list[Any]: return [ @@ -256,7 +255,7 @@ async def read_everything() -> list[Any]: ] # Pinned to the last run, a handle sees that run's stream alone. last_run = (await client.get_workflow_handle(workflow_id).describe()).run_id - pinned = provider.get_stream_handle(client, workflow_id, run_id=last_run) + pinned = client.get_stream_handle(workflow_id, run_id=last_run) only_last = [ r.value async for r in pinned.read(topic=DECISIONS, result_type=dict) ] From be743fd0de3327e5bffd65278986a47437f78340 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:51:07 -0700 Subject: [PATCH 504/831] Added typed topic definitions. A topic is defined once with streams.topic(name, type) and shared by the workflow, its activities and the backend, so the record and value types follow from the definition; a plain string still names a topic decided at runtime. The wire and every provider see only the name. --- CHANGELOG.md | 6 +- streams_demo/agent_loop.py | 12 +-- streams_demo/run_demo.py | 4 +- temporalio/streams/__init__.py | 9 +- temporalio/streams/_provider.py | 62 +++++++++---- temporalio/streams/_topic.py | 92 ++++++++++++++++++++ temporalio/streams/providers/memory.py | 32 ++++--- temporalio/workflow/_streams.py | 80 ++++++++++------- tests/streams/test_stream_accessors.py | 13 ++- tests/streams/test_streams_conformance.py | 101 +++++++++++++--------- tests/streams/test_streams_workflow.py | 32 +++---- 11 files changed, 309 insertions(+), 134 deletions(-) create mode 100644 temporalio/streams/_topic.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 357a7ba66..6da9470b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,8 +41,10 @@ to include examples, links to docs, or any other relevant information. inherit it; each context then asks for its stream the same way: `workflow.stream_reader()` and `workflow.stream_writer()` in workflow code, `activity.stream_handle()` in an activity, and `client.get_stream_handle()` - anywhere a client is held. The record on the wire is - `temporal.api.stream.v1.StreamRecord` on every provider. + anywhere a client is held. A topic is a typed definition, + `streams.topic("inputs", Token)`, shared by workflow, activity and client + code; a plain string names a topic decided at runtime. The record on the wire + is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against, and `temporalio.streams.providers.redis.RedisStreams` serves the same interface diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py index a76b35ced..df5eac4d6 100644 --- a/streams_demo/agent_loop.py +++ b/streams_demo/agent_loop.py @@ -16,12 +16,14 @@ from datetime import timedelta from typing import Any -from temporalio import activity, workflow +from temporalio import activity, streams, workflow from temporalio.streams import RecordKind -DECISIONS = "decisions" -INPUTS = "inputs" -RECEIPTS = "receipts" +# Defined once and shared by the workflow, the Activity and the demo's +# reader, so the type each topic carries is stated in one place. +DECISIONS = streams.topic("decisions", dict[str, Any]) +INPUTS = streams.topic("inputs", dict[str, Any]) +RECEIPTS = streams.topic("receipts", dict[str, Any]) @activity.defn(name="RecordDecision") @@ -55,7 +57,7 @@ class AgentLoop: @workflow.run async def run(self, limit: int) -> list[dict[str, Any]]: """Decide on at most ``limit`` inputs, then return the trace.""" - inputs = workflow.stream_reader(INPUTS, result_type=dict) + inputs = workflow.stream_reader(INPUTS) decisions = workflow.stream_writer(DECISIONS) trace: list[dict[str, Any]] = [] accepted = 0 diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index 0b06e9395..e91bf2e31 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -48,7 +48,7 @@ async def collect_output(stream: StreamHandle, want: int) -> list[dict]: """Read ``want`` decisions off the workflow's stream from outside it.""" seen: list[dict] = [] - async for record in stream.read(topic=DECISIONS, result_type=dict): + async for record in stream.read(topic=DECISIONS): seen.append({"kind": record.kind.name, "value": record.value}) if len(seen) >= want: break @@ -150,7 +150,7 @@ async def receipts() -> list[Any]: # Ends by itself once the workflow is closed and the tail served. return [ r.value - async for r in stream.read(topic=RECEIPTS, result_type=dict) + async for r in stream.read(topic=RECEIPTS) if r.kind is RecordKind.DATA ] diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index c185c35ce..b23c95be4 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -28,7 +28,10 @@ 5. **A workflow addresses its streams relative to itself, by topic.** A topic can be written by the workflow and by outside producers, and read by the workflow and by outside consumers; which of those happen is the - application's business. + application's business. A topic is defined once with :func:`topic`, with + the type its records decode to, and that definition is shared by the + workflow, its activities and the backend; a plain string names a topic + decided at runtime. A provider is an object, registered once as a plugin: ``Client.connect(plugins=[provider])``; workers built from that client inherit @@ -80,6 +83,7 @@ StreamRecord, Supersession, ) +from temporalio.streams._topic import StreamTopic, resolve_topic, topic __all__ = [ "BEGINNING", @@ -94,8 +98,11 @@ "StreamProducerError", "StreamProvider", "StreamRecord", + "StreamTopic", "StreamUnsupportedError", "Supersession", "WorkflowStreamProvider", "WriteSink", + "resolve_topic", + "topic", ] diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 6992f0a14..8c142080d 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -9,7 +9,9 @@ workflow code is bundled separately name the two halves in two packages. A provider only moves ``temporal.api.stream.v1.StreamRecord`` protos. The -handles around it convert values, synthesize supersession and mint cursors. +handles around it convert values, synthesize supersession and mint cursors, +and turn a :class:`temporalio.streams.StreamTopic` into the plain name the +provider sees, through :func:`temporalio.streams.resolve_topic`. """ from __future__ import annotations @@ -19,6 +21,7 @@ from temporalio.api.stream.v1 import StreamRecord as WireRecord from temporalio.streams._record import BEGINNING, Cursor, StreamRecord +from temporalio.streams._topic import StreamTopic if TYPE_CHECKING: from temporalio.client import Client @@ -33,14 +36,16 @@ ] T = TypeVar("T") +T_contra = TypeVar("T_contra", contravariant=True) -class StreamProducer(Protocol): +class StreamProducer(Protocol[T_contra]): """Appends to one topic from outside workflow code. Every append is visible as soon as the store accepts it, and carries the producer id, attempt and sequence that let a reader tell a retried append - from a new generation. + from a new generation. The type parameter is the topic definition's + value type; a producer on a string-named topic takes any value. """ @property @@ -53,7 +58,7 @@ def attempt(self) -> int: """The generation this producer is writing, or 0 when undeclared.""" ... - async def append(self, *values: Any) -> Cursor | None: + async def append(self, *values: T_contra) -> Cursor | None: """Append ``values`` and return the cursor of the last record as the store holds it. A repeat of an earlier append (same producer, attempt and sequence) is @@ -83,11 +88,19 @@ class StreamHandle(Protocol): """One workflow's stream, addressed by topic, from outside workflow code. A handle follows the workflow's execution chain unless it was opened with - a ``run_id``, in which case it is pinned to that run. A transport failure - surfaces as :class:`temporalio.service.RPCError`, never as the transport's - own exception type. + a ``run_id``, in which case it is pinned to that run. A topic is a + :class:`temporalio.streams.StreamTopic` definition, which carries the + record type, or a plain string with ``result_type=`` for a name decided + at runtime. A transport failure surfaces as + :class:`temporalio.service.RPCError`, never as the transport's own + exception type. """ + @overload + def read( + self, *, topic: StreamTopic[T], after: Cursor = ... + ) -> AsyncGenerator[StreamRecord[T], None]: ... + @overload def read( self, *, topic: str, after: Cursor = ..., result_type: type[T] @@ -101,7 +114,7 @@ def read( def read( self, *, - topic: str, + topic: str | StreamTopic[Any], after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: @@ -117,6 +130,8 @@ def read( release whatever the provider parked against the store. Raises: + ValueError: ``result_type`` was passed with a topic definition, + or the topic is empty. StreamCursorError: ``after`` came from another provider or names a record no longer retained. Raised by this call, not by the first iteration. @@ -125,7 +140,7 @@ def read( """ ... - async def latest(self, *, topic: str) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, or ``BEGINNING`` when empty. For a reader that wants to follow from now: ``read(after=latest())`` @@ -135,9 +150,23 @@ async def latest(self, *, topic: str) -> Cursor: """ ... + @overload + def producer( + self, *, topic: StreamTopic[T], producer_id: str = ..., attempt: int = ... + ) -> StreamProducer[T]: ... + + @overload + def producer( + self, *, topic: str, producer_id: str = ..., attempt: int = ... + ) -> StreamProducer[Any]: ... + def producer( - self, *, topic: str, producer_id: str = "", attempt: int = 0 - ) -> StreamProducer: + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> StreamProducer[Any]: """A producer on ``topic``. Inside an activity, leave ``producer_id`` and ``attempt`` unset: the @@ -189,7 +218,8 @@ class WorkflowStreamProvider(Protocol): Imports nothing that does I/O. The worker creates one per workflow instance through :meth:`StreamProvider.workflow_provider`, so state kept - here dies with the instance the way handlers do. + here dies with the instance the way handlers do. It sees topics by name; + the definitions are resolved before it is called. """ def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: @@ -224,9 +254,11 @@ async def on_workflow_finish(self) -> None: class StreamProvider(Protocol): """What a store ships. Also a :class:`temporalio.worker.Plugin` when it serves workers. - Construct one, pass it to ``Worker(plugins=[provider])`` and - ``Replayer(plugins=[provider])``, and open handles from it anywhere else. - Nothing is global: two workers in one process may hold two providers. + Construct one, pass it to ``Client.connect(plugins=[provider])`` so the + client and the workers built from it carry it, or to + ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` for a + worker alone, and open handles from it anywhere else. Nothing is global: + two workers in one process may hold two providers. """ def workflow_provider(self) -> WorkflowStreamProvider: diff --git a/temporalio/streams/_topic.py b/temporalio/streams/_topic.py new file mode 100644 index 000000000..173291fad --- /dev/null +++ b/temporalio/streams/_topic.py @@ -0,0 +1,92 @@ +"""Typed topic definitions. + +Temporal's idiom is to define once and refer by reference: signals, queries +and updates are decorated methods, activities and workflows are functions, +Nexus operations are typed definitions. A topic follows the same rule. It is +defined once, at module level, with the type its records decode to, and the +workflow, its activities and the backend all refer to that one definition. A +plain string names a topic too, the way a string names a signal chosen at +runtime; then the decode hint travels as ``result_type=`` on each call. + +The wire does not change: a topic is a string on the proto and in every +store, and :attr:`temporalio.streams.StreamRecord.topic` is that string. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Generic, TypeVar, overload + +__all__ = ["StreamTopic", "resolve_topic", "topic"] + +T = TypeVar("T") + + +@dataclass(frozen=True) +class StreamTopic(Generic[T]): + """A topic of a workflow's stream, with the type its records decode to. + + Made with :func:`topic`. Hand it to :func:`temporalio.workflow.stream_reader`, + :func:`temporalio.workflow.stream_writer`, and to a handle's ``read``, + ``latest`` and ``producer``, and the record and value types follow from + it; ``result_type=`` is not passed alongside a definition. + """ + + name: str + result_type: type[T] | None = None + """The type records decode to, or ``None`` for the converter's default.""" + + +@overload +def topic(name: str, result_type: type[T]) -> StreamTopic[T]: ... + + +@overload +def topic(name: str, result_type: None = None) -> StreamTopic[Any]: ... + + +def topic(name: str, result_type: type | None = None) -> StreamTopic[Any]: + """Define a topic of a workflow's stream. + + Define it once, at module level, and share it: the workflow reads or + publishes it, an activity or a backend produces onto it or reads it, and + the type it carries is inferred wherever it is used. Use a plain string + instead only when the name is decided at runtime. + + Args: + name: The topic's name, as it appears on every record. + result_type: The type records on this topic decode to. Without one, + the payload converter's default applies. + + Raises: + ValueError: ``name`` is empty. + """ + if not name: + raise ValueError("topic name must not be empty") + return StreamTopic(name, result_type) + + +def resolve_topic( + topic: str | StreamTopic[Any], result_type: type | None = None +) -> tuple[str, type | None]: + """The name and decode hint a call means, from either form of topic. + + Providers call this once at the top of ``read``, ``latest`` and + ``producer``, so a definition and a string are the same to the store. + + Raises: + ValueError: A definition was given together with ``result_type``, + which would name two types for one topic, or the name is empty. + """ + if isinstance(topic, StreamTopic): + if result_type is not None: + raise ValueError( + f"topic {topic.name!r} already carries its type; do not pass " + "result_type= with a definition" + ) + name, result_type = topic.name, topic.result_type + else: + name = topic + if not name: + raise ValueError("topic must not be empty") + return name, result_type diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 2a6087b2d..f175570a8 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -28,7 +28,7 @@ import logging from collections.abc import AsyncGenerator from datetime import timedelta -from typing import Any +from typing import Any, Generic, TypeVar from google.protobuf.message import DecodeError @@ -40,6 +40,7 @@ from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, WireRecord, @@ -54,6 +55,8 @@ _PROVIDER = "memory" +T = TypeVar("T") + logger = logging.getLogger(__name__) @@ -189,7 +192,7 @@ async def on_workflow_finish(self) -> None: pass -class MemoryProducer: +class MemoryProducer(Generic[T]): """The outside producer, faithful to the contract.""" def __init__( @@ -227,7 +230,7 @@ def _writer(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: T) -> Cursor: """Append ``values`` and return the cursor of the last record as stored. A repeat returns where the original landed; an empty call returns @@ -298,12 +301,13 @@ def __init__( def read( self, *, - topic: str, + topic: str | StreamTopic[Any], after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records on ``topic`` after ``after`` until the workflow closes.""" - store = self._streams._topic(self._workflow_id, topic) + name, result_type = resolve_topic(topic, result_type) + store = self._streams._topic(self._workflow_id, name) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. start = self._streams._offset_after(after) @@ -366,18 +370,24 @@ async def _closed(self) -> bool: self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW ) - async def latest(self, *, topic: str) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, for following from now.""" - count = len(self._streams._topic(self._workflow_id, topic).records) + name, _ = resolve_topic(topic) + count = len(self._streams._topic(self._workflow_id, name).records) return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING def producer( - self, *, topic: str, producer_id: str = "", attempt: int = 0 - ) -> MemoryProducer: + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> MemoryProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" - store = self._streams._topic(self._workflow_id, topic) + name, _ = resolve_topic(topic) + store = self._streams._topic(self._workflow_id, name) producer_id, attempt = producer_identity(producer_id, attempt) - return MemoryProducer(store, self._converter, topic, producer_id, attempt) + return MemoryProducer(store, self._converter, name, producer_id, attempt) class MemoryStreams(ProviderPlugin): diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py index 029da59a1..5d319d50a 100644 --- a/temporalio/workflow/_streams.py +++ b/temporalio/workflow/_streams.py @@ -19,6 +19,7 @@ from temporalio.streams._provider import ReadSource, WorkflowStreamProvider, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import RecordDecoder, to_wire from temporalio.workflow._context import _Runtime, payload_converter from temporalio.workflow._sandbox import logger @@ -71,7 +72,7 @@ def __init__( @property def topic(self) -> str: - """The topic this reader is subscribed to.""" + """The name of the topic this reader is subscribed to.""" return self._topic def __aiter__(self) -> StreamReader[T]: @@ -124,12 +125,14 @@ def close(self) -> None: self._on_close() -class StreamWriter: +class StreamWriter(Generic[T]): """Publishes to one topic of this workflow's stream. A workflow can only publish transactionally to its own stream, on every provider. Writing to somebody else's stream is an activity's job, and it - gets the weaker guarantee that goes with doing I/O. + gets the weaker guarantee that goes with doing I/O. The type parameter is + the topic definition's value type; a writer on a string-named topic takes + any value. """ def __init__(self, sink: WriteSink, topic: str) -> None: @@ -140,10 +143,10 @@ def __init__(self, sink: WriteSink, topic: str) -> None: @property def topic(self) -> str: - """The topic this writer is bound to.""" + """The name of the topic this writer is bound to.""" return self._topic - def publish(self, value: Any) -> None: + def publish(self, value: T) -> None: """Append ``value`` to this topic. Synchronous, because there is nothing to wait for inside a task: the @@ -180,6 +183,10 @@ def finish(self) -> None: ) +@overload +def stream_reader(topic: StreamTopic[T], *, after: Cursor = ...) -> StreamReader[T]: ... + + @overload def stream_reader( topic: str, *, result_type: type[T], after: Cursor = ... @@ -193,65 +200,80 @@ def stream_reader( def stream_reader( - topic: str, *, result_type: type | None = None, after: Cursor = BEGINNING + topic: str | StreamTopic[Any], + *, + result_type: type | None = None, + after: Cursor = BEGINNING, ) -> StreamReader[Any]: """Subscribe this workflow to ``topic`` of its own stream. - One subscription per topic per run. A second call for the same topic - returns the reader already open on it, so records go to whichever loop - pulls first; such a call may pass neither ``after`` nor a different - ``result_type``. Adding a reader on a new topic is a new command, so gate - it with :func:`temporalio.workflow.patched` as you would a timer. A + ``topic`` is a :func:`temporalio.streams.topic` definition, which carries + the record type, or a plain string with ``result_type=`` for a name + decided at runtime. One subscription per topic per run. A second call + for the same topic returns the reader already open on it, so records go + to whichever loop pulls first; such a call may pass neither ``after`` nor + a different type. Adding a reader on a new topic is a new command, so + gate it with :func:`temporalio.workflow.patched` as you would a timer. A reader in a successor run starts a new subscription: nothing crosses continue-as-new implicitly. Args: topic: The topic, relative to this workflow's stream. - result_type: The value type, used as the decode hint. - :class:`temporalio.common.RawValue` returns the payload untouched. + result_type: The value type for a string-named topic, used as the + decode hint. :class:`temporalio.common.RawValue` returns the + payload untouched. after: Resume strictly after this record. Honoured on the first subscription of a run, because after that the recorded observations decide. Raises: - ValueError: ``topic`` is empty, or a reader on it is already open and - this call asked for a different position or type. + ValueError: ``topic`` is empty, ``result_type`` was passed with a + definition, or a reader on the topic is already open and this + call asked for a different position or type. temporalio.streams.StreamCursorError: ``after`` was minted by another provider. """ - if not topic: - raise ValueError("topic must not be empty") + name, result_type = resolve_topic(topic, result_type) state: _WorkflowStreams = _Runtime.current().workflow_streams() - existing = state.readers.get(topic) + existing = state.readers.get(name) if existing is not None: if after != BEGINNING or result_type is not existing._result_type: raise ValueError( - f"topic {topic!r} already has a reader in this run; a second " - "stream_reader shares it and takes no after= or other result_type=" + f"topic {name!r} already has a reader in this run; a second " + "stream_reader shares it and takes no after= or other type" ) return existing - source = state.provider.open_reader(topic, after=after) + source = state.provider.open_reader(name, after=after) def forget() -> None: - state.readers.pop(topic, None) + state.readers.pop(name, None) reader: StreamReader[Any] = StreamReader( - source, topic=topic, result_type=result_type, after=after, on_close=forget + source, topic=name, result_type=result_type, after=after, on_close=forget ) - state.readers[topic] = reader + state.readers[name] = reader return reader -def stream_writer(topic: str) -> StreamWriter: +@overload +def stream_writer(topic: StreamTopic[T]) -> StreamWriter[T]: ... + + +@overload +def stream_writer(topic: str) -> StreamWriter[Any]: ... + + +def stream_writer(topic: str | StreamTopic[Any]) -> StreamWriter[Any]: """Publish to ``topic`` of this workflow's stream. Args: - topic: The topic name. Encoding follows each published value. + topic: A :func:`temporalio.streams.topic` definition, whose value type + the writer's ``publish`` takes, or a plain string for a name + decided at runtime. Encoding follows each published value. Raises: ValueError: ``topic`` is empty. """ - if not topic: - raise ValueError("topic must not be empty") + name, _ = resolve_topic(topic) provider = _Runtime.current().workflow_streams().provider - return StreamWriter(provider.open_writer(topic), topic) + return StreamWriter(provider.open_writer(name), name) diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py index 73436dea2..eb733ba5b 100644 --- a/tests/streams/test_stream_accessors.py +++ b/tests/streams/test_stream_accessors.py @@ -18,13 +18,13 @@ from temporalio import activity, workflow from temporalio.client import Client -from temporalio.streams import RecordKind, StreamUnsupportedError +from temporalio.streams import RecordKind, StreamUnsupportedError, topic from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import ActivityEnvironment, WorkflowEnvironment from tests.helpers import new_worker -INPUTS = "inputs" -DECISIONS = "decisions" +INPUTS = topic("inputs", dict) +DECISIONS = topic("decisions", dict) @pytest.fixture @@ -64,7 +64,7 @@ class Echo: @workflow.run async def run(self, count: int) -> list[Any]: - inputs = workflow.stream_reader(INPUTS, result_type=dict) + inputs = workflow.stream_reader(INPUTS) decisions = workflow.stream_writer(DECISIONS) emitting = workflow.start_activity( emit, count, start_to_close_timeout=timedelta(seconds=30) @@ -100,10 +100,7 @@ async def test_one_registration_on_the_client_serves_every_context( stream = registered.get_stream_handle(workflow_id) async def read_everything() -> list[Any]: - return [ - (r.kind, r.value) - async for r in stream.read(topic=DECISIONS, result_type=dict) - ] + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] assert await asyncio.wait_for(read_everything(), 30) == [ (RecordKind.DATA, {"echo": 0}), diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 19759aec1..e4da91255 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -44,12 +44,21 @@ Supersession, _ids, _wire, + topic, ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams from temporalio.streams.providers.redis import RedisStreams from tests.helpers import new_worker +# Defined once and shared by every case, the way an application shares them +# between its workflow, its activities and its backend. +OUT = topic("out", dict) +A = topic("a", dict) +B = topic("b", dict) +Y = topic("y", dict) +XY = topic("x:y", dict) + @dataclass class ProviderCase: @@ -251,12 +260,12 @@ def test_cursors_name_their_provider(): async def test_append_read_roundtrip(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - producer = stream.producer(topic="out", producer_id="model", attempt=1) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) assert (producer.producer_id, producer.attempt) == ("model", 1) await producer.append({"id": "r1"}, {"id": "r2"}) await producer.finish() - records = await take(stream.read(topic="out", result_type=dict), 3) + records = await take(stream.read(topic=OUT), 3) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -266,14 +275,14 @@ async def test_append_read_roundtrip(case: ProviderCase): assert records[2].value is None assert all(r.producer_id == "model" and r.attempt == 1 for r in records) assert [r.sequence for r in records] == [0, 1, 2] - assert all(r.topic == "out" for r in records) + assert all(r.topic == OUT.name for r in records) async def test_raw_values_pass_through_untouched(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) payload = Payload(metadata={"encoding": b"binary/plain"}, data=b"\x00\x01raw") - producer = stream.producer(topic="out", producer_id="model", attempt=1) + producer = stream.producer(topic=OUT.name, producer_id="model", attempt=1) await producer.append(RawValue(payload)) records = await take(stream.read(topic="out", result_type=RawValue), 1) @@ -285,46 +294,46 @@ async def test_raw_values_pass_through_untouched(case: ProviderCase): async def test_retried_append_returns_the_original_position(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - first = stream.producer(topic="out", producer_id="model", attempt=1) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) landed = await first.append({"id": "r1"}) assert landed is not None # The retry of the same attempt starts its sequence over and appends the # same record. The provider stores it once and answers with where the # original landed, so the retry can checkpoint the same position. - retry = stream.producer(topic="out", producer_id="model", attempt=1) + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) assert await retry.append({"id": "r1"}) == landed # An empty call writes nothing and answers the same way. assert await retry.append() == landed - records = await take(stream.read(topic="out", result_type=dict), 1) + records = await take(stream.read(topic=OUT), 1) assert records[0].value == {"id": "r1"} assert records[0].cursor == landed # The store holds exactly the one record: the newest position is its cursor. - assert await stream.latest(topic="out") == landed + assert await stream.latest(topic=OUT) == landed async def test_retried_append_is_stored_once(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - first = stream.producer(topic="out", producer_id="model", attempt=1) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) await first.append({"id": "r1"}) - retry = stream.producer(topic="out", producer_id="model", attempt=1) + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) await retry.append({"id": "r1"}) await retry.append({"id": "r2"}) - records = await take(stream.read(topic="out", result_type=dict), 2) + records = await take(stream.read(topic=OUT), 2) assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - first = stream.producer(topic="out", producer_id="model", attempt=1) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) await first.append({"text": "The capital of"}) - second = stream.producer(topic="out", producer_id="model", attempt=2) + second = stream.producer(topic=OUT, producer_id="model", attempt=2) await second.append({"text": "Paris is the capital"}) - records = await take(stream.read(topic="out", result_type=dict), 3) + records = await take(stream.read(topic=OUT), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 assert records[1].kind is RecordKind.SUPERSEDED assert records[1].supersession == Supersession("model", 1, 2) @@ -337,21 +346,19 @@ async def test_a_superseded_record_resumes_to_the_triggering_record( ): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - first = stream.producer(topic="out", producer_id="model", attempt=1) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) await first.append({"n": 1}) - second = stream.producer(topic="out", producer_id="model", attempt=2) + second = stream.producer(topic=OUT, producer_id="model", attempt=2) await second.append({"n": 2}) - records = await take(stream.read(topic="out", result_type=dict), 3) + records = await take(stream.read(topic=OUT), 3) superseded = records[1] assert superseded.kind is RecordKind.SUPERSEDED # The synthesized record sits at the position before the new attempt's # first record, so a consumer that checkpoints it and restarts is handed # that record rather than skipping it. assert superseded.cursor == records[0].cursor - resumed = await take( - stream.read(topic="out", result_type=dict, after=superseded.cursor), 1 - ) + resumed = await take(stream.read(topic=OUT, after=superseded.cursor), 1) assert resumed[0].kind is RecordKind.DATA assert resumed[0].value == {"n": 2} @@ -361,29 +368,29 @@ async def test_topics_are_addressed_by_name(case: ProviderCase): # names its topic and sees only that topic's records. workflow_id = new_workflow_id() stream = await case.open(workflow_id) - on_a = stream.producer(topic="a", producer_id="tool-a", attempt=1) + on_a = stream.producer(topic=A, producer_id="tool-a", attempt=1) await on_a.append({"n": 1}) - on_b = stream.producer(topic="b", producer_id="tool-b", attempt=1) + on_b = stream.producer(topic=B, producer_id="tool-b", attempt=1) await on_b.append({"n": 2}) - only_a = await take(stream.read(topic="a", result_type=dict), 1) + only_a = await take(stream.read(topic=A), 1) assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] - only_b = await take(stream.read(topic="b", result_type=dict), 1) + only_b = await take(stream.read(topic=B), 1) assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] async def test_cursor_resumes_where_it_points(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - producer = stream.producer(topic="out", producer_id="model", attempt=1) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - records = await take(stream.read(topic="out", result_type=dict), 3) + records = await take(stream.read(topic=OUT), 3) checkpoint = records[0].cursor # Resuming after a record hands back everything past it and nothing # twice, without the reader ever advancing a cursor itself. - again = await take(stream.read(topic="out", result_type=dict, after=checkpoint), 2) + again = await take(stream.read(topic=OUT, after=checkpoint), 2) assert [r.value for r in again] == [{"n": 2}, {"n": 3}] @@ -391,14 +398,14 @@ async def test_cursor_resumes_where_it_points(case: ProviderCase): async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - producer = stream.producer(topic="out", producer_id="model", attempt=1) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) assert appended is not None then = await producer.append({"n": 4}) # A producer that resumes a reader after its own append must see only # what came later, not the tail of the batch it just wrote. - records = await take(stream.read(topic="out", result_type=dict, after=appended), 1) + records = await take(stream.read(topic=OUT, after=appended), 1) assert [r.value for r in records] == [{"n": 4}] assert records[0].cursor == then assert await producer.append() == then @@ -407,16 +414,16 @@ async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCa async def test_latest_positions_a_reader_at_the_end(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) - producer = stream.producer(topic="out", producer_id="model", attempt=1) - assert await stream.latest(topic="out") == BEGINNING + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + assert await stream.latest(topic=OUT) == BEGINNING await producer.append({"n": 1}, {"n": 2}) - since = await stream.latest(topic="out") + since = await stream.latest(topic=OUT) await producer.append({"n": 3}) # A reader that positioned itself before the last append sees only what # came after, which is how a client follows a turn it is about to start. - records = await take(stream.read(topic="out", result_type=dict, after=since), 1) + records = await take(stream.read(topic=OUT, after=since), 1) assert [r.value for r in records] == [{"n": 3}] @@ -425,17 +432,15 @@ async def test_topic_addresses_with_colons_do_not_share_a_store(case: ProviderCa base = new_workflow_id() left = await case.open(f"{base}:x") right = await case.open(base) - await left.producer(topic="y", producer_id="l", attempt=1).append({"side": "left"}) - await right.producer(topic="x:y", producer_id="r", attempt=1).append( - {"side": "right"} - ) + await left.producer(topic=Y, producer_id="l", attempt=1).append({"side": "left"}) + await right.producer(topic=XY, producer_id="r", attempt=1).append({"side": "right"}) - only_left = await take(left.read(topic="y", result_type=dict), 1) + only_left = await take(left.read(topic=Y), 1) assert [r.value for r in only_left] == [{"side": "left"}] - assert await left.latest(topic="y") == only_left[0].cursor - only_right = await take(right.read(topic="x:y", result_type=dict), 1) + assert await left.latest(topic=Y) == only_left[0].cursor + only_right = await take(right.read(topic=XY), 1) assert [r.value for r in only_right] == [{"side": "right"}] - assert await right.latest(topic="x:y") == only_right[0].cursor + assert await right.latest(topic=XY) == only_right[0].cursor async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): @@ -443,7 +448,7 @@ async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): # Refused by read() itself, not by the first iteration of its generator, # so the caller's except clause is where the mistake surfaces. with pytest.raises(StreamCursorError): - stream.read(topic="out", after=Cursor("elsewhere:42")) + stream.read(topic=OUT, after=Cursor("elsewhere:42")) async def test_argument_mistakes_are_value_errors(case: ProviderCase): @@ -454,4 +459,14 @@ async def test_argument_mistakes_are_value_errors(case: ProviderCase): stream.producer(topic="", producer_id="model", attempt=1) # Outside an activity there is no identity to fall back on. with pytest.raises(ValueError, match="producer_id is required"): - stream.producer(topic="out") + stream.producer(topic=OUT) + + +async def test_a_definition_carries_its_type_once(case: ProviderCase): + stream = await case.open(new_workflow_id()) + with pytest.raises(ValueError, match="already carries its type"): + stream.read(topic=OUT, result_type=dict) # type: ignore[call-overload] + with pytest.raises(ValueError): + topic("", dict) + # A string names a topic decided at runtime, and the hint rides the call. + assert await stream.latest(topic=OUT.name) == BEGINNING diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index 58fb274ef..71f2bb8bf 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -30,6 +30,7 @@ RecordKind, StreamCursorError, WriteSink, + topic, ) from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import WorkflowEnvironment @@ -37,8 +38,8 @@ from tests.helpers import new_worker from tests.streams.test_streams_conformance import take -INPUTS = "inputs" -DECISIONS = "decisions" +INPUTS = topic("inputs", dict) +DECISIONS = topic("decisions", dict) @pytest.fixture @@ -58,7 +59,7 @@ class ContractLoop: @workflow.run async def run(self) -> list[dict[str, Any]]: - inputs = workflow.stream_reader(INPUTS, result_type=dict) + inputs = workflow.stream_reader(INPUTS) decisions = workflow.stream_writer(DECISIONS) trace: list[dict[str, Any]] = [] try: @@ -128,7 +129,7 @@ async def test_workflow_reads_decides_and_publishes( # The outside view of what the workflow published, on its own topic. stream = provider.get_stream_handle(client, handle.id) - records = await take(stream.read(topic=DECISIONS, result_type=dict), 5) + records = await take(stream.read(topic=DECISIONS), 5) assert [(r.kind, r.value) for r in records] == [ (RecordKind.DATA, {"decided": 1}), (RecordKind.DATA, {"decided": 2}), @@ -136,7 +137,7 @@ async def test_workflow_reads_decides_and_publishes( (RecordKind.DATA, {"decided": 3}), (RecordKind.FINISH, None), ] - assert all(r.producer_id == "" and r.topic == DECISIONS for r in records) + assert all(r.producer_id == "" and r.topic == DECISIONS.name for r in records) # The second finish() wrote nothing: the marker is the newest record. assert await stream.latest(topic=DECISIONS) == records[-1].cursor @@ -148,7 +149,7 @@ async def test_read_ends_when_the_workflow_closes_and_the_tail_is_delivered( stream = provider.get_stream_handle(client, handle.id) async def read_everything() -> list[Any]: - return [r.value async for r in stream.read(topic=DECISIONS, result_type=dict)] + return [r.value async for r in stream.read(topic=DECISIONS)] # No count and no early break: the read ends by itself once the workflow # is closed and everything it retained has been handed over. @@ -218,9 +219,7 @@ async def test_a_failed_task_publishes_nothing(client: Client, provider: MemoryS PublishThenFail.run, id=workflow_id, task_queue=worker.task_queue ) stream = provider.get_stream_handle(client, workflow_id) - records = await take( - stream.read(topic=DECISIONS, result_type=dict), 2, timeout=30 - ) + records = await take(stream.read(topic=DECISIONS), 2, timeout=30) await handle.result() assert [(r.kind, r.value) for r in records] == [ (RecordKind.DATA, {"committed": True}), @@ -301,10 +300,7 @@ async def test_a_handle_without_a_run_id_reads_across_continue_as_new( stream = provider.get_stream_handle(client, workflow_id) async def read_everything() -> list[Any]: - return [ - (r.kind, r.value) - async for r in stream.read(topic=DECISIONS, result_type=dict) - ] + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] records = await asyncio.wait_for(read_everything(), 30) await handle.result() @@ -323,15 +319,15 @@ class SharedReaders: @workflow.run async def run(self) -> list[Any]: - first = workflow.stream_reader(INPUTS, result_type=dict) - second = workflow.stream_reader(INPUTS, result_type=dict) + first = workflow.stream_reader(INPUTS) + second = workflow.stream_reader(INPUTS) trace: list[Any] = ["shared" if first is second else "separate"] try: - workflow.stream_reader(INPUTS, result_type=dict, after=Cursor("memory:0")) + workflow.stream_reader(INPUTS, after=Cursor("memory:0")) except ValueError: trace.append("after-rejected") try: - workflow.stream_reader(INPUTS, result_type=list) + workflow.stream_reader(INPUTS.name, result_type=list) except ValueError: trace.append("type-rejected") trace.append((await first.__anext__()).value) @@ -435,7 +431,7 @@ async def test_an_outside_producer_and_the_workflow_share_a_topic( await handle.result() async def read_everything() -> list[Any]: - return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + return [r async for r in stream.read(topic=DECISIONS)] records = await asyncio.wait_for(read_everything(), 30) # Both writers land on one topic in one order, each under its own From 1802e8cec49c11735761e7e72a91a46525e0332f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:53:33 -0700 Subject: [PATCH 505/831] Took topic definitions on the Workflow Streams handle. --- .../streams/providers/workflow_streams.py | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index af297899b..88de82e29 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -37,7 +37,7 @@ import logging from collections.abc import AsyncGenerator from datetime import timedelta -from typing import Any +from typing import Any, Generic, TypeVar from google.protobuf.message import DecodeError @@ -70,6 +70,7 @@ from temporalio.streams._errors import StreamCursorError, StreamNotFoundError from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, WireRecord, @@ -86,6 +87,8 @@ "WorkflowStreamsProvider", ] +T = TypeVar("T") + _PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" _ENCODING = b"binary/plain" @@ -288,7 +291,7 @@ async def on_workflow_finish(self) -> None: await workflow.wait_condition(workflow.all_handlers_finished) -class WorkflowStreamsProducer: +class WorkflowStreamsProducer(Generic[T]): """Appends by sending the shipped publish Signal directly. Direct rather than through ``WorkflowStreamClient`` because the interface @@ -339,7 +342,7 @@ def _publisher_id(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor | None: + async def append(self, *values: T) -> Cursor | None: """Append ``values`` through the shipped publish Signal. Always ``None``: this transport learns positions at read time, so a @@ -431,12 +434,12 @@ def __init__( def read( self, *, - topic: str, + topic: str | StreamTopic[Any], after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" - _require_topic(topic) + topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. named = _position(after) @@ -643,13 +646,13 @@ async def _tail( for item in wire ] - async def latest(self, *, topic: str) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The newest position in the log, which orders every topic of this workflow. The log is one per run, so the cursor names the run it was read from: the pinned run, or the latest run of the chain. """ - _require_topic(topic) + topic, _ = resolve_topic(topic) handle = self._handle(self._run_id) try: description = await handle.describe() @@ -672,10 +675,14 @@ async def latest(self, *, topic: str) -> Cursor: return _cursor(run_id, -1) def producer( - self, *, topic: str, producer_id: str = "", attempt: int = 0 - ) -> WorkflowStreamsProducer: + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> WorkflowStreamsProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" - _require_topic(topic) + topic, _ = resolve_topic(topic) producer_id, attempt = producer_identity(producer_id, attempt) return WorkflowStreamsProducer( self._handle(self._run_id), self._converter, topic, producer_id, attempt From d5e8f4b3f674b2e898e5b4a766b81b034f368701 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:54:11 -0700 Subject: [PATCH 506/831] Took topic definitions on the native handle. --- temporalio/streams/providers/native.py | 27 ++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index ff0621031..9c0cb3dbd 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -22,7 +22,7 @@ import logging from collections.abc import AsyncGenerator -from typing import Any +from typing import Any, Generic, TypeVar from temporalio import workflow from temporalio.client import Client, WorkflowHistoryEventFilterType @@ -37,6 +37,7 @@ from temporalio.streams._errors import StreamCursorError, StreamNotFoundError from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, WireRecord, @@ -49,6 +50,8 @@ __all__ = ["NativeProducer", "NativeStreamHandle", "NativeStreams"] +T = TypeVar("T") + _PROVIDER = "native" logger = logging.getLogger(__name__) @@ -156,7 +159,7 @@ async def on_workflow_finish(self) -> None: pass -class NativeProducer: +class NativeProducer(Generic[T]): """Appends to a topic from outside workflow code. Every append is visible as soon as the server accepts it. That is the @@ -207,7 +210,7 @@ def _writer(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: T) -> Cursor: """Append ``values`` and return the cursor of the last record as stored. A repeat returns where the original landed, because the server @@ -291,12 +294,12 @@ def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: def read( self, *, - topic: str, + topic: str | StreamTopic[Any], after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" - _require_topic(topic) + topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. named = _position(after) @@ -340,14 +343,14 @@ async def _read( return run_id, offset = successor, 0 - async def latest(self, *, topic: str) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, naming the run it was read from. An empty topic on the chain's first run is the beginning of the stream; on a successor it is a position of its own, because ``BEGINNING`` would send a chain-following read back to the first run. """ - _require_topic(topic) + topic, _ = resolve_topic(topic) run_id = self._run_id or await self._current_run() try: head = (await self._stream(topic, run_id).describe()).head_offset @@ -362,10 +365,14 @@ async def latest(self, *, topic: str) -> Cursor: return BEGINNING def producer( - self, *, topic: str, producer_id: str = "", attempt: int = 0 - ) -> NativeProducer: + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" - _require_topic(topic) + topic, _ = resolve_topic(topic) producer_id, attempt = producer_identity(producer_id, attempt) return NativeProducer( self._stream(topic, self._run_id or ""), From c37b3515f6628cf388179f278190954d63a99753 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:54:51 -0700 Subject: [PATCH 507/831] Took topic definitions on the Redis handle. --- temporalio/streams/providers/redis.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 552e3d904..0a345ae98 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -42,7 +42,7 @@ import time from collections.abc import AsyncGenerator, Coroutine from datetime import timedelta -from typing import Any +from typing import Any, Generic, TypeVar from google.protobuf.message import DecodeError @@ -88,6 +88,7 @@ ) from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, WireRecord, @@ -101,6 +102,8 @@ __all__ = ["RedisProducer", "RedisStreamHandle", "RedisStreams"] +T = TypeVar("T") + _PROVIDER = "redis" _INPUT_PREFIX = "in:" _REDIS_ID = re.compile(r"\d+-\d+") @@ -244,7 +247,7 @@ def _storage_error(error: Exception, what: str) -> StreamError: return StreamError(f"{what}: {error}") -class RedisProducer: +class RedisProducer(Generic[T]): """Appends to a topic from outside workflow code. Every append is visible as soon as the store accepts it. Each record goes @@ -296,7 +299,7 @@ def _session(self) -> str: else self._producer_id ) - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: T) -> Cursor: """Append ``values`` and return the cursor of the last record as stored. A repeat returns where the original landed, because the transport @@ -454,12 +457,12 @@ def __init__( def read( self, *, - topic: str, + topic: str | StreamTopic[Any], after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" - _require_topic(topic) + topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. position = _outside_position(after) @@ -542,9 +545,9 @@ async def _closed(self) -> bool: self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW ) - async def latest(self, *, topic: str) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest committed record on ``topic``, for following from now.""" - _require_topic(topic) + topic, _ = resolve_topic(topic) backend = self._streams._require_backend() chain = await _chain(self._client, self._workflow_id) try: @@ -559,10 +562,14 @@ async def latest(self, *, topic: str) -> Cursor: return mint_cursor(_PROVIDER, tail.offset.token) def producer( - self, *, topic: str, producer_id: str = "", attempt: int = 0 - ) -> RedisProducer: + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> RedisProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" - _require_topic(topic) + topic, _ = resolve_topic(topic) producer_id, attempt = producer_identity(producer_id, attempt) return RedisProducer( self._streams, self._client, self._workflow_id, topic, producer_id, attempt From f641ea80d8f961a2927ed3c572281083b75f2662 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:06:58 -0700 Subject: [PATCH 508/831] Added the changelog entry for the Workflow Streams provider. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f9e500d6..551a3002a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,10 @@ to include examples, links to docs, or any other relevant information. `temporalio.contrib.workflow_streams` without naming it. Records are the `StreamRecord` proto inside the shipped item payload, and a handle without a run id follows continue-as-new run by run. +- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the + stream interface over the shipped Workflow Streams transport, so a workflow + reads and publishes through `temporalio.contrib.workflow_streams` without + naming it. ### Changed From f35717e157284c444055cb873628fcef38db8db5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 15:55:24 -0700 Subject: [PATCH 509/831] Added the Nexus front that hides the store behind one endpoint. --- temporalio/streams/providers/nexus.py | 398 ++++++++++++++++++++++++++ tests/streams/test_nexus_provider.py | 118 ++++++++ 2 files changed, 516 insertions(+) create mode 100644 temporalio/streams/providers/nexus.py create mode 100644 tests/streams/test_nexus_provider.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py new file mode 100644 index 000000000..b718e9d14 --- /dev/null +++ b/temporalio/streams/providers/nexus.py @@ -0,0 +1,398 @@ +"""The Nexus front: the outside surface behind one Temporal-authenticated endpoint. + +Two halves in one module. The provider half implements only :func:`producer` +and :func:`consumer`; the workflow side raises, naming a storage provider, +because a workflow's publishes and reads ride the Workflow Task and cannot +cross an RPC. The handler half runs in a worker configured with any storage +provider and serves two sync operations, ``append`` and ``read``, so the +store behind the endpoint is invisible to callers and an operator switches +it without touching them. + +Reads hand out batches and an append carries one batch per call, because a +Nexus operation per record costs too much for token streams. Supersession +records are not transported: the caller's reader re-synthesizes them from +the attempts it observes, which is the policy module's job on every +provider. Cursors pass through opaque, so the caller cannot tell which store +produced them. + +One stated prototype limit: append deduplication holds at the handler by +batch index per producer, so a handler restart during a producer's life can +double-append. The store-level fix, a sequence-explicit append in the IDL +contract, is listed in the design doc's work table. +""" + +from __future__ import annotations + +import asyncio +import base64 +import dataclasses +import json +import urllib.error +import urllib.request +from collections.abc import AsyncIterator +from datetime import timedelta +from typing import Any + +import nexusrpc +import nexusrpc.handler + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.streams import _frame, _provider +from temporalio.streams._handles import ReadSource, WriteSink +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +_WORKFLOW_SIDE_ERROR = ( + "the nexus provider is an outside transport; a worker publishes and reads " + "through a storage provider, so configure one of those on the worker" +) + + +@dataclasses.dataclass +class AppendInput: + workflow_id: str + stream: str + producer_id: str + attempt: int + batch_index: int + payloads: list[str] = dataclasses.field(default_factory=list) + finish: bool = False + + +@dataclasses.dataclass +class AppendOutput: + cursor: str = "" + + +@dataclasses.dataclass +class ReadInput: + workflow_id: str + stream: str = "" + from_token: str = "" + max_records: int = 100 + wait_ms: int = 5000 + + +@dataclasses.dataclass +class RecordWire: + token: str + frame: str + + +@dataclasses.dataclass +class ReadOutput: + records: list[RecordWire] = dataclasses.field(default_factory=list) + next_token: str = "" + + +@nexusrpc.service +class TemporalStreams: + append: nexusrpc.Operation[AppendInput, AppendOutput] + read: nexusrpc.Operation[ReadInput, ReadOutput] + + +@nexusrpc.handler.service_handler(service=TemporalStreams) +class TemporalStreamsHandler: + """Serves the stream endpoint, delegating to one storage provider. + + The delegate is an explicit instance rather than the process default, so + a caller and a handler can coexist in one process, and so an operator can + run handlers for a new store next to handlers for the old one. + """ + + def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + self._client = client + self._delegate = _provider.instance(provider, **provider_options) + self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + + @nexusrpc.handler.sync_operation + async def append( + self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput + ) -> AppendOutput: + key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + cached = self._producers.get(key) + if cached is not None and input.batch_index <= cached[1]: + return AppendOutput() + if cached is None: + delegate = await self._delegate.producer( + self._client, + workflow_id=input.workflow_id, + stream=input.stream, + producer_id=input.producer_id, + attempt=input.attempt, + ) + else: + delegate = cached[0] + self._producers[key] = (delegate, input.batch_index) + cursor = "" + if input.payloads: + payloads = [] + for encoded in input.payloads: + payload = Payload() + payload.ParseFromString(base64.b64decode(encoded)) + payloads.append(payload) + cursor = (await delegate.append(*payloads)).token + if input.finish: + await delegate.finish() + return AppendOutput(cursor=cursor) + + @nexusrpc.handler.sync_operation + async def read( + self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=input.stream + ) + converter = temporalio.converter.DataConverter.default.payload_converter + records: list[RecordWire] = [] + next_token = input.from_token + subscription = delegate.read( + start=Cursor(input.from_token) if input.from_token else BEGINNING + ) + try: + async with asyncio.timeout(input.wait_ms / 1000): + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), + ) + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + break + except TimeoutError: + pass + finally: + await subscription.aclose() + return ReadOutput(records=records, next_token=next_token) + + +def _post(url: str, body: dict) -> dict: + request = urllib.request.Request( + url, + data=json.dumps(body).encode(), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + raw = response.read() + except urllib.error.HTTPError as error: + detail = error.read().decode(errors="replace") + raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + return json.loads(raw) if raw else {} + + +class NexusProducer: + """Appends through the stream endpoint; framing happens behind it.""" + + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str, + producer_id: str, attempt: int, + ) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + self._producer_id = producer_id + self._attempt = attempt + self._batch_index = 0 + + @property + def attempt(self) -> int: + return self._attempt + + async def append(self, *values: Any) -> Cursor: + payloads = [] + for value in values: + payload = ( + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + ) + payloads.append(base64.b64encode(payload.SerializeToString()).decode()) + return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + + async def finish(self) -> None: + await self._call(finish=True) + + async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + self._batch_index += 1 + return await asyncio.to_thread( + _post, + f"{self._base_url}/append", + dataclasses.asdict( + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + payloads=payloads or [], + finish=finish, + ) + ), + ) + + +class NexusConsumer: + """Reads batches from the stream endpoint, re-synthesizing supersession.""" + + def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + self._base_url = base_url + self._converter = converter + self._workflow_id = workflow_id + self._stream = stream + + async def read( + self, + *, + start: Cursor = BEGINNING, + topic: str | None = None, + type: type | None = None, + ) -> AsyncIterator[StreamRecord[Any]]: + attempts = AttemptTracker() + token = start.token + last_yielded: str | None = None + while True: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + from_token=token, + ) + ), + ) + for wire in raw.get("records", []): + if wire["token"] == last_yielded: + # An opaque token cannot be advanced past itself, so a + # resumed batch starts with the record already yielded. + continue + try: + kind, frame_topic, source, attempt, sequence, body = _frame.decode( + base64.b64decode(wire["frame"]) + ) + except ValueError: + continue + if topic is not None and frame_topic != topic: + last_yielded = wire["token"] + continue + cursor = Cursor(wire["token"]) + superseded = attempts.note(source, attempt, cursor) + if superseded is not None: + yield superseded + yield StreamRecord( + value=self._decode(body, type) if kind is RecordKind.DATA else None, + cursor=cursor, + kind=kind, + topic=frame_topic, + producer=source, + attempt=attempt, + sequence=sequence, + ) + last_yielded = wire["token"] + token = raw.get("next_token", token) or token + + def _decode(self, body: bytes, as_type: type | None) -> Any: + payload = Payload() + payload.ParseFromString(body) + if as_type is None: + return self._converter.from_payloads([payload])[0] + return self._converter.from_payloads([payload], [as_type])[0] + + +class _NexusProvider: + name = "nexus" + + def __init__(self) -> None: + self._base_url: str | None = None + + def configure(self, **options: Any) -> None: + endpoint = options.pop("endpoint", None) + http_address = options.pop("http_address", "http://127.0.0.1:7243") + service = options.pop("service", "TemporalStreams") + if options: + raise TypeError( + "the nexus provider takes endpoint, http_address and service, " + f"got {sorted(options)}" + ) + if not endpoint: + raise TypeError("the nexus provider needs endpoint=") + self._base_url = ( + f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + ) + + def worker_options(self) -> dict[str, Any]: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_read( + self, + stream: str, + *, + start: Cursor = BEGINNING, + idle_timeout: timedelta | None = None, + ) -> ReadSource: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def open_write(self, topic: str) -> WriteSink: + raise RuntimeError(_WORKFLOW_SIDE_ERROR) + + def _url(self) -> str: + if self._base_url is None: + raise RuntimeError("configure the nexus provider before opening handles") + return self._base_url + + async def producer( + self, + client: Any, + *, + workflow_id: str, + stream: str, + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer: + if not producer_id: + from temporalio import activity + + producer_id = activity.info().activity_id + attempt = attempt or activity.info().attempt + return NexusProducer( + self._url(), + _converter(client), + workflow_id, + stream, + producer_id, + attempt, + ) + + async def consumer( + self, client: Any, *, workflow_id: str, stream: str = "" + ) -> NexusConsumer: + return NexusConsumer(self._url(), _converter(client), workflow_id, stream) + + +def _converter(client: Any) -> Any: + if client is None: + return temporalio.converter.DataConverter.default.payload_converter + return client.data_converter.payload_converter + + +_provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py new file mode 100644 index 000000000..7e2c1074e --- /dev/null +++ b/tests/streams/test_nexus_provider.py @@ -0,0 +1,118 @@ +"""Live conformance for the Nexus front. + +The caller talks only to the stream endpoint over the server's Nexus HTTP +ingress; the handler worker delegates to the workflow_streams provider, so +this test is the provider-hiding demonstration: nothing on the caller side +names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it +needs a dev server with an HTTP port and a registered Nexus endpoint. + +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named +``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import subprocess +import uuid + +import pytest + +from temporalio import streams +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams._provider import instance +from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.worker import Worker + +from tests.streams.test_workflow_streams_provider import EchoLoop, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "nexus", + reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", +) + +ENDPOINT = "streams-e2e" +HANDLER_TQ = "streams-handlers-e2e" + + +def _endpoint_id() -> str: + # The HTTP ingress dispatches by endpoint id, not name. + out = subprocess.run( + [ + "temporal", "operator", "nexus", "endpoint", "get", + "--name", ENDPOINT, "-o", "json", + "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + ], + capture_output=True, + text=True, + check=True, + ) + return json.loads(out.stdout)["id"] + + +async def test_interface_loop_through_the_nexus_front(): + # The workflow worker and the handler worker both use the storage + # provider; only the caller goes through the front. + streams.configure(provider="workflow_streams") + client = await Client.connect( + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + ) + front = instance( + "nexus", + endpoint=_endpoint_id(), + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + ) + workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + + async with Worker( + client, + task_queue=HANDLER_TQ, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider="workflow_streams") + ], + ): + async with Worker( + client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoLoop], + **streams.worker_options(), + ): + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id) + records = await take(consumer.read(type=dict), 4, timeout=60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] + + # An opaque cursor from behind the front resumes a fresh reader. + checkpoint = records[1].cursor + resumed = await front.consumer(None, workflow_id=workflow_id) + again = await take( + resumed.read(type=dict, start=checkpoint), 2, timeout=60 + ) + assert [r.value["echo"] for r in again[:2]] == [2, 3] + + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 From 832b8c3918d897dc842c53a1092865908684f98d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 18:01:04 -0700 Subject: [PATCH 510/831] Made cursors exclusive, added latest(), and allowed topic appends. Porting the agent harness onto the interface surfaced three things the small example never needed. A reader resumes after the record a cursor names, so it can store the last cursor it handled without advancing an opaque token. A consumer reports its latest position, so a client can follow a turn it is about to start without the workflow reporting a position. And a producer can append onto a topic of the stream the workflow publishes, so an activity's live output lands next to the workflow's own records for one outside reader. --- temporalio/streams/providers/nexus.py | 63 +++++++++++++++++++-------- tests/streams/test_nexus_provider.py | 7 +-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index b718e9d14..37a2f1675 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -56,6 +56,7 @@ class AppendInput: producer_id: str attempt: int batch_index: int + topic: str = "" payloads: list[str] = dataclasses.field(default_factory=list) finish: bool = False @@ -69,9 +70,13 @@ class AppendOutput: class ReadInput: workflow_id: str stream: str = "" - from_token: str = "" + topic: str = "" + after_token: str = "" max_records: int = 100 wait_ms: int = 5000 + # Answer with the newest position and no records, for a reader that + # wants to follow from now. + latest_only: bool = False @dataclasses.dataclass @@ -110,7 +115,12 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - key = (input.workflow_id, input.stream, input.producer_id, input.attempt) + key = ( + input.workflow_id, + input.stream or f"@{input.topic}", + input.producer_id, + input.attempt, + ) cached = self._producers.get(key) if cached is not None and input.batch_index <= cached[1]: return AppendOutput() @@ -119,6 +129,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -144,11 +155,15 @@ async def read( delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) + topic = input.topic or None + if input.latest_only: + return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.from_token + next_token = input.after_token subscription = delegate.read( - start=Cursor(input.from_token) if input.from_token else BEGINNING + after=Cursor(input.after_token) if input.after_token else BEGINNING, + topic=topic, ) try: async with asyncio.timeout(input.wait_ms / 1000): @@ -203,12 +218,13 @@ class NexusProducer: def __init__( self, base_url: str, converter: Any, workflow_id: str, stream: str, - producer_id: str, attempt: int, + topic: str, producer_id: str, attempt: int, ) -> None: self._base_url = base_url self._converter = converter self._workflow_id = workflow_id self._stream = stream + self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -243,6 +259,7 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - producer_id=self._producer_id, attempt=self._attempt, batch_index=self._batch_index, + topic=self._topic, payloads=payloads or [], finish=finish, ) @@ -262,13 +279,12 @@ def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) async def read( self, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: attempts = AttemptTracker() - token = start.token - last_yielded: str | None = None + token = after.token while True: raw = await asyncio.to_thread( _post, @@ -277,15 +293,12 @@ async def read( ReadInput( workflow_id=self._workflow_id, stream=self._stream, - from_token=token, + topic=topic or "", + after_token=token, ) ), ) for wire in raw.get("records", []): - if wire["token"] == last_yielded: - # An opaque token cannot be advanced past itself, so a - # resumed batch starts with the record already yielded. - continue try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( base64.b64decode(wire["frame"]) @@ -293,7 +306,6 @@ async def read( except ValueError: continue if topic is not None and frame_topic != topic: - last_yielded = wire["token"] continue cursor = Cursor(wire["token"]) superseded = attempts.note(source, attempt, cursor) @@ -308,9 +320,24 @@ async def read( attempt=attempt, sequence=sequence, ) - last_yielded = wire["token"] token = raw.get("next_token", token) or token + async def latest(self, *, topic: str | None = None) -> Cursor: + raw = await asyncio.to_thread( + _post, + f"{self._base_url}/read", + dataclasses.asdict( + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, + ) + ), + ) + token = raw.get("next_token", "") + return Cursor(token) if token else BEGINNING + def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) @@ -347,7 +374,7 @@ def open_read( self, stream: str, *, - start: Cursor = BEGINNING, + after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -365,7 +392,8 @@ async def producer( client: Any, *, workflow_id: str, - stream: str, + stream: str = "", + topic: str = "", producer_id: str = "", attempt: int = 0, ) -> NexusProducer: @@ -379,6 +407,7 @@ async def producer( _converter(client), workflow_id, stream, + topic, producer_id, attempt, ) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 7e2c1074e..29bd8ca4d 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -106,11 +106,12 @@ async def test_interface_loop_through_the_nexus_front(): ] assert [r.value["echo"] for r in records[:3]] == [1, 2, 3] - # An opaque cursor from behind the front resumes a fresh reader. - checkpoint = records[1].cursor + # An opaque cursor from behind the front resumes a fresh reader + # just past the record it names. + checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) again = await take( - resumed.read(type=dict, start=checkpoint), 2, timeout=60 + resumed.read(type=dict, after=checkpoint), 2, timeout=60 ) assert [r.value["echo"] for r in again[:2]] == [2, 3] From 50b1dab01b8a340acac6a043d9467f3a2b939f14 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 511/831] Made the Nexus stream front pass the linters. The handler closes the delegate's subscription as soon as it answers, and the interface only promises an iterator, so the close is guarded by what the delegate actually returned. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 24 ++++++----- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 37a2f1675..aad67538e 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,7 @@ import json import urllib.error import urllib.request -from collections.abc import AsyncIterator +from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta from typing import Any @@ -51,6 +51,8 @@ @dataclasses.dataclass class AppendInput: + """One append call: who is writing, where, and what.""" + workflow_id: str stream: str producer_id: str @@ -63,11 +65,15 @@ class AppendInput: @dataclasses.dataclass class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + cursor: str = "" @dataclasses.dataclass class ReadInput: + """One read call: where to resume from and how long to wait.""" + workflow_id: str stream: str = "" topic: str = "" @@ -81,18 +87,24 @@ class ReadInput: @dataclasses.dataclass class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + token: str frame: str @dataclasses.dataclass class ReadOutput: + """What one read call answered, and where to resume.""" + records: list[RecordWire] = dataclasses.field(default_factory=list) next_token: str = "" @nexusrpc.service class TemporalStreams: + """The stream endpoint's two operations.""" + append: nexusrpc.Operation[AppendInput, AppendOutput] read: nexusrpc.Operation[ReadInput, ReadOutput] @@ -107,6 +119,7 @@ class TemporalStreamsHandler: """ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: + """Serve the endpoint out of the provider named by ``provider``.""" self._client = client self._delegate = _provider.instance(provider, **provider_options) self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} @@ -115,6 +128,7 @@ def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: + """Append on the caller's account, dropping a repeated batch.""" key = ( input.workflow_id, input.stream or f"@{input.topic}", @@ -152,6 +166,7 @@ async def append( async def read( self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: + """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( self._client, workflow_id=input.workflow_id, stream=input.stream ) @@ -172,7 +187,9 @@ async def read( continue body = b"" if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() + body = converter.to_payloads([record.value])[ + 0 + ].SerializeToString() frame = _frame.encode( topic=record.topic, kind=record.kind, @@ -193,7 +210,11 @@ async def read( except TimeoutError: pass finally: - await subscription.aclose() + # The delegate's read parks against its store, and this call + # answers before the caller asks again, so let it go now rather + # than when the collector is next swept. + if isinstance(subscription, AsyncGenerator): + await subscription.aclose() return ReadOutput(records=records, next_token=next_token) @@ -217,9 +238,16 @@ class NexusProducer: """Appends through the stream endpoint; framing happens behind it.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str, - topic: str, producer_id: str, attempt: int, + self, + base_url: str, + converter: Any, + workflow_id: str, + stream: str, + topic: str, + producer_id: str, + attempt: int, ) -> None: + """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -231,9 +259,11 @@ def __init__( @property def attempt(self) -> int: + """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor: + """Append ``values`` through the endpoint.""" payloads = [] for value in values: payload = ( @@ -245,9 +275,12 @@ async def append(self, *values: Any) -> Cursor: return Cursor((await self._call(payloads=payloads)).get("cursor", "")) async def finish(self) -> None: + """Mark this producer done, so a reader stops waiting on it.""" await self._call(finish=True) - async def _call(self, payloads: list[str] | None = None, finish: bool = False) -> dict: + async def _call( + self, payloads: list[str] | None = None, finish: bool = False + ) -> dict: self._batch_index += 1 return await asyncio.to_thread( _post, @@ -270,7 +303,10 @@ async def _call(self, payloads: list[str] | None = None, finish: bool = False) - class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__(self, base_url: str, converter: Any, workflow_id: str, stream: str) -> None: + def __init__( + self, base_url: str, converter: Any, workflow_id: str, stream: str + ) -> None: + """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url self._converter = converter self._workflow_id = workflow_id @@ -283,6 +319,7 @@ async def read( topic: str | None = None, type: type | None = None, ) -> AsyncIterator[StreamRecord[Any]]: + """Yield records after ``after``, one endpoint batch at a time.""" attempts = AttemptTracker() token = after.token while True: @@ -323,6 +360,7 @@ async def read( token = raw.get("next_token", token) or token async def latest(self, *, topic: str | None = None) -> Cursor: + """The cursor of the last record written, for following from now.""" raw = await asyncio.to_thread( _post, f"{self._base_url}/read", @@ -363,9 +401,7 @@ def configure(self, **options: Any) -> None: ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") - self._base_url = ( - f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - ) + self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -377,9 +413,11 @@ def open_read( after: Cursor = BEGINNING, idle_timeout: timedelta | None = None, ) -> ReadSource: + del stream, after, idle_timeout raise RuntimeError(_WORKFLOW_SIDE_ERROR) def open_write(self, topic: str) -> WriteSink: + del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) def _url(self) -> str: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 29bd8ca4d..f07e4956c 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -13,7 +13,6 @@ from __future__ import annotations -import asyncio import json import os import subprocess @@ -27,7 +26,6 @@ from temporalio.streams._provider import instance from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker - from tests.streams.test_workflow_streams_provider import EchoLoop, take pytestmark = pytest.mark.skipif( @@ -43,9 +41,17 @@ def _endpoint_id() -> str: # The HTTP ingress dispatches by endpoint id, not name. out = subprocess.run( [ - "temporal", "operator", "nexus", "endpoint", "get", - "--name", ENDPOINT, "-o", "json", - "--address", os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), + "temporal", + "operator", + "nexus", + "endpoint", + "get", + "--name", + ENDPOINT, + "-o", + "json", + "--address", + os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), ], capture_output=True, text=True, @@ -58,9 +64,7 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. streams.configure(provider="workflow_streams") - client = await Client.connect( - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") - ) + client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", endpoint=_endpoint_id(), @@ -110,9 +114,7 @@ async def test_interface_loop_through_the_nexus_front(): # just past the record it names. checkpoint = records[0].cursor resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take( - resumed.read(type=dict, after=checkpoint), 2, timeout=60 - ) + again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) From 1ee4c7a20774f5a456a6192415506ed30839b39e Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 15:13:57 -0700 Subject: [PATCH 512/831] Added the changelog entry for the Nexus stream front. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 551a3002a..923da8ccc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,9 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. +- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus + endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store. ### Changed From 93f87cfec11d7ae820063d393645f0c91af82780 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:09:41 -0700 Subject: [PATCH 513/831] Bounded the Nexus read with a timeout 3.10 has. `asyncio.timeout` arrived in 3.11 and this package supports 3.10, so the collecting loop moves into a coroutine and `wait_for` bounds it. --- temporalio/streams/providers/nexus.py | 58 ++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index aad67538e..3701a70cb 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -180,34 +180,38 @@ async def read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, ) - try: - async with asyncio.timeout(input.wait_ms / 1000): - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[ - 0 - ].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + + async def collect() -> None: + nonlocal next_token + async for record in subscription: + if record.kind is RecordKind.SUPERSEDED: + continue + body = b"" + if record.kind is RecordKind.DATA: + body = converter.to_payloads([record.value])[0].SerializeToString() + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + records.append( + RecordWire( + token=record.cursor.token, + frame=base64.b64encode(frame).decode("ascii"), ) - next_token = record.cursor.token - if len(records) >= input.max_records: - break - except TimeoutError: + ) + next_token = record.cursor.token + if len(records) >= input.max_records: + return + + try: + # `wait_for` rather than `asyncio.timeout`, which 3.10 does not + # have. Whatever was collected before the deadline is the answer. + await asyncio.wait_for(collect(), input.wait_ms / 1000) + except asyncio.TimeoutError: pass finally: # The delegate's read parks against its store, and this call From b6637c9ae22f48e3dd4d248d1c3fb0f6c644f875 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:26:33 -0700 Subject: [PATCH 514/831] Added the IDL contract and generation for the stream endpoint. The stream endpoint's shape lived only in hand-written Python, so no other language could be given the contract. This defines it once in a nexusrpc yaml contract and generates the Python bindings from it. The generated _definitions helper is hidden from the API docs and skipped by pydocstyle, the same way the other generated trees are. --- pyproject.toml | 6 +- scripts/gen_streams_nexus_api.py | 80 +++ .../providers/_nexus_generated/__init__.py | 23 + .../_nexus_generated/_definitions.py | 542 ++++++++++++++ .../providers/_nexus_generated/models.py | 670 ++++++++++++++++++ .../providers/_nexus_generated/services.py | 39 + .../providers/temporal_streams.nexusrpc.yaml | 123 ++++ 7 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 scripts/gen_streams_nexus_api.py create mode 100644 temporalio/streams/providers/_nexus_generated/__init__.py create mode 100644 temporalio/streams/providers/_nexus_generated/_definitions.py create mode 100644 temporalio/streams/providers/_nexus_generated/models.py create mode 100644 temporalio/streams/providers/_nexus_generated/services.py create mode 100644 temporalio/streams/providers/temporal_streams.nexusrpc.yaml diff --git a/pyproject.toml b/pyproject.toml index b7077785f..e55c39219 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,9 +125,11 @@ format = [ ] gen-docs = "uv run scripts/gen_docs.py" gen-nexus-system-api = "uv run scripts/gen_nexus_system_api.py" +gen-streams-nexus-api = "uv run scripts/gen_streams_nexus_api.py" gen-protos = [ { cmd = "uv run scripts/gen_protos.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -135,6 +137,7 @@ gen-protos = [ gen-protos-docker = [ { cmd = "uv run scripts/gen_protos_docker.py" }, { ref = "gen-nexus-system-api" }, + { ref = "gen-streams-nexus-api" }, { cmd = "uv run scripts/gen_payload_visitor.py" }, { cmd = "uv run scripts/gen_bridge_client.py" }, { ref = "format" }, @@ -207,7 +210,7 @@ ignore_errors = true [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 -match_dir = "^(?!(docs|scripts|tests|api|proto|system|\\.)).*" +match_dir = "^(?!(docs|scripts|tests|api|proto|system|_nexus_generated|\\.)).*" add_ignore = [ # We like to wrap at a certain number of chars, even long summary sentences. # https://github.com/PyCQA/pydocstyle/issues/184 @@ -241,6 +244,7 @@ privacy = [ "HIDDEN:temporalio.worker.workflow_sandbox.importer", "HIDDEN:temporalio.worker.workflow_sandbox.in_sandbox", "HIDDEN:**.*_pb2*", + "HIDDEN:temporalio.streams.providers._nexus_generated._definitions", ] project-name = "Temporal Python" sidebar-expand-depth = 2 diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py new file mode 100644 index 000000000..800aba944 --- /dev/null +++ b/scripts/gen_streams_nexus_api.py @@ -0,0 +1,80 @@ +import os +import shutil +import subprocess +import sys +from pathlib import Path + +base_dir = Path(__file__).parent.parent +providers_dir = base_dir / "temporalio" / "streams" / "providers" +contract_path = providers_dir / "temporal_streams.nexusrpc.yaml" +output_dir = providers_dir / "_nexus_generated" +# Pinned to the version CI installs, because nexgen's output changes between +# releases and check-protos compares against what is committed here. +NEX_GEN_VERSION = "0.2.4" + + +def nex_gen_command() -> list[str]: + if bin_path := os.environ.get("NEX_GEN_BIN"): + return [bin_path] + + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + # Same build as the system API script installs, so one binary + # serves both and neither can overwrite the other's output. + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] + + +def generate_streams_nexus_api() -> None: + if not contract_path.exists(): + raise RuntimeError(f"missing stream contract: {contract_path}") + + command = nex_gen_command() + shutil.rmtree(output_dir, ignore_errors=True) + subprocess.check_call( + [ + *command, + "python", + str(contract_path), + "--output", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "check", + "--select", + "I", + "--fix", + str(output_dir), + ] + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "ruff", + "format", + str(output_dir), + ] + ) + + +if __name__ == "__main__": + print("Generating stream endpoint Nexus API...", file=sys.stderr) + generate_streams_nexus_api() + print("Done", file=sys.stderr) diff --git a/temporalio/streams/providers/_nexus_generated/__init__.py b/temporalio/streams/providers/_nexus_generated/__init__.py new file mode 100644 index 000000000..c62eaa6dd --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/__init__.py @@ -0,0 +1,23 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from ._definitions import Violation +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, +) +from .services import TemporalStreams + +__all__ = [ + "Violation", + "AppendInput", + "AppendOutput", + "ReadInput", + "ReadOutput", + "RecordWire", + "TemporalStreams", +] diff --git a/temporalio/streams/providers/_nexus_generated/_definitions.py b/temporalio/streams/providers/_nexus_generated/_definitions.py new file mode 100644 index 000000000..dc8de5bb5 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/_definitions.py @@ -0,0 +1,542 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import base64 +import collections.abc +import dataclasses +import datetime +import json +import re +import typing + +import temporalio.converter +import temporalio.exceptions + +__all__ = [ + "Violation", + "_binary64", + "_check_contains", + "_check_date_time", + "_check_duration", + "_check_time", + "_check_unique_items", + "_collect", + "_json_values_equal", + "_format_base64", + "_format_base64url", + "_format_date", + "_format_date_time", + "_format_duration", + "_format_time", + "_parse_base64", + "_parse_base64url", + "_parse_date", + "_parse_date_time", + "_parse_duration", + "_parse_spec_integer", + "_parse_time", + "_quote", + "_transfer_type_convertible", +] + + +@dataclasses.dataclass(frozen=True, slots=True) +class Violation: + """A single constraint failure, located by JSON path.""" + + path: str + reason: str + + +def _quote(value: object) -> str: + """Renders a value in the JSON form every target quotes offending values in.""" + + try: + return json.dumps(value, ensure_ascii=False) + except (TypeError, ValueError): + return repr(value) + + +def _collect( + violations: list[Violation], + path: str, + error: temporalio.exceptions.ApplicationError, +) -> None: + """Re-paths a nested model's violations under `path` and appends them.""" + + if error.type != "PayloadValidationError" or not error.details: + raise error + # Generated failures retain the original list as their first detail. The + # cast is type-checker-only and performs no serialization. + nested_violations = typing.cast(list[Violation], error.details[0]) + for inner in nested_violations: + # A nested violation about the value *itself* carries no path of its own + # (a union branch's own constraint, an element-level check), so the + # prefix is the whole path -- never a dangling separator (P11). + nested = f"{path}.{inner.path}" if inner.path else path + violations.append(Violation(path=nested, reason=inner.reason)) + + +_ModelT = typing.TypeVar("_ModelT") + + +def _transfer_type_convertible( + converter: type[temporalio.converter.TransferTypeConverter[typing.Any, typing.Any]], +) -> collections.abc.Callable[[type[_ModelT]], type[_ModelT]]: + """Registers a transfer type converter on a model class. + + Wraps `temporalio.converter.transfer_type_convertible` to erase the + converter's value-type parameter. Binding it directly on the decorated class + is circular for a static type checker -- the class's type depends on the + decorator, whose value type depends on the class -- which degrades the model + to `Unknown`. Erasing it here keeps the decorator idiomatic at each model and + resolves the cycle. + """ + + return temporalio.converter.transfer_type_convertible(converter) + + +_INTEGER_CAP = (1 << 53) - 1 + + +def _parse_spec_integer( + value: object, path: str, violations: list[Violation] +) -> int | None: + """Parses a JSON number as a spec integer (`1.0` accepted, `1.5` rejected).""" + + # `bool` is a subclass of `int`, so it must be excluded before the int check. + if isinstance(value, bool) or not isinstance(value, (int, float)): + violations.append(Violation(path=path, reason="expected integer")) + return None + if isinstance(value, float): + if not value.is_integer(): + violations.append(Violation(path=path, reason="expected integer")) + return None + out = int(value) + else: + out = value + if abs(out) > _INTEGER_CAP: + violations.append(Violation(path=path, reason="expected integer")) + return None + return out + + +def _binary64(value: float) -> float: + """Narrows a `number` value to the binary64 domain shared by every target.""" + + try: + return float(value) + except OverflowError: + # Past the binary64 range there is nothing to narrow to. The caller's + # finiteness check has already recorded that violation and will raise, so + # hand the value back rather than throwing out of turn and losing the + # other violations collected alongside it. + return value + + +def _json_values_equal(left: typing.Any, right: typing.Any) -> bool: + """Compares JSON values without Python's bool-as-int equality leak.""" + + left_is_number = isinstance(left, (int, float)) and not isinstance(left, bool) + right_is_number = isinstance(right, (int, float)) and not isinstance(right, bool) + if left_is_number or right_is_number: + return left_is_number and right_is_number and left == right + if type(left) is not type(right): + return False + if isinstance(left, list): + left_list = typing.cast("list[typing.Any]", left) + right_list = typing.cast("list[typing.Any]", right) + return len(left_list) == len(right_list) and all( + _json_values_equal(a, b) for a, b in zip(left_list, right_list) + ) + if isinstance(left, dict): + left_dict = typing.cast("dict[typing.Any, typing.Any]", left) + right_dict = typing.cast("dict[typing.Any, typing.Any]", right) + return left_dict.keys() == right_dict.keys() and all( + _json_values_equal(left_dict[key], right_dict[key]) for key in left_dict + ) + return left == right + + +def _check_unique_items( + value: list[typing.Any], path: str, violations: list[Violation] +) -> None: + """Asserts an array's elements are pairwise distinct.""" + + seen: list[typing.Any] = [] + for index, element in enumerate(value): + for earlier, previous in enumerate(seen): + if _json_values_equal(previous, element): + violations.append( + Violation( + path=path, + reason=( + f"duplicate items: element at index {index} " + f"equals index {earlier}" + ), + ) + ) + break + seen.append(element) + + +def _check_contains( + value: list[typing.Any], + matches: typing.Callable[[typing.Any], bool], + min_contains: int, + max_contains: int | None, + bounded_min: bool, + path: str, + violations: list[Violation], +) -> None: + """Asserts how many of an array's elements match the `contains` schema.""" + + match_count = sum(1 for element in value if matches(element)) + if match_count < min_contains: + if bounded_min: + violations.append( + Violation( + path=path, + reason=( + f"too few matching items: at least {min_contains}, " + f"got {match_count}" + ), + ) + ) + else: + violations.append( + Violation(path=path, reason="no element matches the required schema") + ) + if max_contains is not None and match_count > max_contains: + violations.append( + Violation( + path=path, + reason=( + f"too many matching items: at most {max_contains}, " + f"got {match_count}" + ), + ) + ) + + +_TEMPORAL_DATE_TIME_RE = re.compile( + r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])\Z" +) +_TEMPORAL_DATE_RE = re.compile(r"^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\Z") +_TEMPORAL_TIME_RE = re.compile( + r"^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?([Zz]|[+-]([01][0-9]|2[0-3]):[0-5][0-9])?\Z" +) +_TEMPORAL_DURATION_RE = re.compile( + r"^PT(?:[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?|[0-9]+M(?:[0-9]+S)?|[0-9]+S)\Z" +) +_TEMPORAL_MAX_DURATION_SECONDS = ((1 << 63) - 1) // 1_000_000_000 +# A duration component with more digits than the cap itself is over the cap +# whatever those digits are, which is how the magnitude is bounded before `int()` +# sees it: CPython refuses to convert a string of more than 4300 digits. +_TEMPORAL_MAX_DURATION_DIGITS = len(str(_TEMPORAL_MAX_DURATION_SECONDS)) +# `datetime` resolves to microseconds, and `fromisoformat` before Python 3.11 +# parses only the fraction widths `isoformat` writes. +_TEMPORAL_FRACTION_DIGITS = 6 + + +def _days_in_month(year: int, month: int) -> int: + if month in (1, 3, 5, 7, 8, 10, 12): + return 31 + if month in (4, 6, 9, 11): + return 30 + if month == 2: + return 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28 + return 0 + + +def _valid_temporal_calendar(value: str) -> bool: + if len(value) < 10: + return False + try: + year, month, day = int(value[0:4]), int(value[5:7]), int(value[8:10]) + except ValueError: + return False + # `datetime.MINYEAR` is 1, which is also the shared cross-language floor. + # Year 0000 is rejected rather than shifted into range, and + # `_temporal_reason` says so. + if year < datetime.MINYEAR: + return False + maximum = _days_in_month(year, month) + return maximum > 0 and 1 <= day <= maximum + + +def _temporal_reason(name: str, value: str) -> str: + """The reason a rejected temporal string is reported under. + + Year 0000 earns its own clause so the caller sees the shared calendar floor + rather than only a generic malformed-timestamp reason. + """ + + if value[0:4] == "0000": + return ( + f"must be a valid {name}, got {_quote(value)}: year 0000 is not" + f" representable (datetime.MINYEAR is {datetime.MINYEAR})" + ) + return f"must be a valid {name}, got {_quote(value)}" + + +def _temporal_isoformat(value: str) -> str: + """Rewrites a wire temporal into the spelling `fromisoformat` accepts. + + `Z` becomes `+00:00`, and the fractional second is padded or truncated to + exactly `_TEMPORAL_FRACTION_DIGITS`: before Python 3.11 `fromisoformat` + parses only what `isoformat` writes, so an RFC 3339 `.1` or `.1234567` -- + which every other target accepts -- would otherwise raise. Digits past the + sixth are dropped, the loss at `datetime`'s own resolution that P1 allows; + the canonical output re-trims the padding, so `.1` still writes as `.1`. + """ + + normalized = value.upper() + if normalized.endswith("Z"): + normalized = normalized[:-1] + "+00:00" + dot = normalized.find(".") + if dot < 0: + return normalized + end = dot + 1 + while end < len(normalized) and normalized[end].isdigit(): + end += 1 + fraction = normalized[dot + 1 : end].ljust(_TEMPORAL_FRACTION_DIGITS, "0") + return ( + normalized[: dot + 1] + fraction[:_TEMPORAL_FRACTION_DIGITS] + normalized[end:] + ) + + +def _parse_date_time( + value: str, path: str, violations: list[Violation] +) -> datetime.datetime | None: + if _TEMPORAL_DATE_TIME_RE.match(value) is None or not _valid_temporal_calendar( + value + ): + violations.append( + Violation(path=path, reason=_temporal_reason("date-time", value)) + ) + return None + return datetime.datetime.fromisoformat(_temporal_isoformat(value)) + + +def _parse_date( + value: str, path: str, violations: list[Violation] +) -> datetime.date | None: + if _TEMPORAL_DATE_RE.match(value) is None or not _valid_temporal_calendar(value): + violations.append(Violation(path=path, reason=_temporal_reason("date", value))) + return None + return datetime.date.fromisoformat(value) + + +def _parse_time( + value: str, path: str, violations: list[Violation] +) -> datetime.time | None: + if _TEMPORAL_TIME_RE.match(value) is None: + violations.append(Violation(path=path, reason=_temporal_reason("time", value))) + return None + return datetime.time.fromisoformat(_temporal_isoformat(value)) + + +def _parse_duration( + value: str, path: str, violations: list[Violation] +) -> datetime.timedelta | None: + if _TEMPORAL_DURATION_RE.match(value) is None: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + total = 0 + number = "" + for char in value[2:]: + if char.isdigit(): + number += char + continue + digits = number.lstrip("0") + number = "" + if len(digits) > _TEMPORAL_MAX_DURATION_DIGITS: + # Over the cap by digit count alone (see the constant), so the + # conversion `int()` would refuse is never attempted. + total = _TEMPORAL_MAX_DURATION_SECONDS + 1 + break + total += int(digits or "0") * {"H": 3600, "M": 60, "S": 1}[char] + if total > _TEMPORAL_MAX_DURATION_SECONDS: + break + if total > _TEMPORAL_MAX_DURATION_SECONDS: + violations.append( + Violation(path=path, reason=_temporal_reason("duration", value)) + ) + return None + return datetime.timedelta(seconds=total) + + +def _check_temporal_offset( + name: str, + value: datetime.datetime | datetime.time, + offset: datetime.timedelta, + path: str, + violations: list[Violation], +) -> None: + """Asserts a UTC offset is a whole number of minutes, the finest the wire + form spells (`tzinfo` allows seconds, which the offset would silently lose). + """ + + if offset % datetime.timedelta(minutes=1): + violations.append( + Violation( + path=path, + reason=( + f"must be a valid {name}, got {_quote(str(value))}: " + f"the UTC offset {offset} is not a whole number of minutes" + ), + ) + ) + + +def _check_date_time( + value: datetime.datetime, path: str, violations: list[Violation] +) -> None: + """Asserts a datetime is writable as a wire date-time (P12). + + A dataclass is constructed unchecked, so a naive datetime -- with no offset + the required wire form could carry -- reaches serialize; without this it + would emit a value this module's own parser rejects. + """ + + offset = value.utcoffset() + if offset is None: + violations.append( + Violation( + path=path, + reason=( + f"must be a valid date-time, got {_quote(str(value))}: " + "a naive datetime carries no UTC offset" + ), + ) + ) + return + _check_temporal_offset("date-time", value, offset, path, violations) + + +def _check_time(value: datetime.time, path: str, violations: list[Violation]) -> None: + """Asserts a time is writable as a wire time (P12). The offset is optional in + the grammar, so only its precision is held to anything.""" + + offset = value.utcoffset() + if offset is not None: + _check_temporal_offset("time", value, offset, path, violations) + + +def _check_duration( + value: datetime.timedelta, path: str, violations: list[Violation] +) -> None: + """Asserts a timedelta is writable as a wire duration (P12): the grammar is + unsigned, whole-second and capped, and a `timedelta` is none of those.""" + + if value < datetime.timedelta(0): + reason = "a duration cannot be negative" + elif value % datetime.timedelta(seconds=1): + reason = "a duration cannot carry a fraction of a second" + elif value.total_seconds() > _TEMPORAL_MAX_DURATION_SECONDS: + reason = f"a duration cannot exceed {_TEMPORAL_MAX_DURATION_SECONDS} seconds" + else: + return + violations.append( + Violation( + path=path, + reason=f"must be a valid duration, got {_quote(str(value))}: {reason}", + ) + ) + + +def _temporal_frac(microsecond: int) -> str: + if microsecond == 0: + return "" + return "." + f"{microsecond:06d}".rstrip("0") + + +def _temporal_offset(value: datetime.datetime | datetime.time) -> str: + offset = value.utcoffset() + if offset is None: + return "" + total = int(offset.total_seconds()) + if total == 0: + return "Z" + sign = "+" if total > 0 else "-" + total = abs(total) + return f"{sign}{total // 3600:02d}:{(total % 3600) // 60:02d}" + + +def _format_date_time(value: datetime.datetime) -> str: + return ( + f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + f"T{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_date(value: datetime.date) -> str: + return f"{value.year:04d}-{value.month:02d}-{value.day:02d}" + + +def _format_time(value: datetime.time) -> str: + return ( + f"{value.hour:02d}:{value.minute:02d}:{value.second:02d}" + f"{_temporal_frac(value.microsecond)}{_temporal_offset(value)}" + ) + + +def _format_duration(value: datetime.timedelta) -> str: + total = int(value.total_seconds()) + if total == 0: + return "PT0S" + hours, remainder = divmod(total, 3600) + minutes, seconds = divmod(remainder, 60) + out = "PT" + if hours: + out += f"{hours}H" + if minutes: + out += f"{minutes}M" + if seconds: + out += f"{seconds}S" + return out + + +_BASE64_RE = re.compile( + "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?\\Z", + re.ASCII, +) +_BASE64URL_RE = re.compile( + "^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048])?\\Z", + re.ASCII, +) + + +def _parse_base64(value: str, path: str, violations: list[Violation]) -> bytes | None: + if _BASE64_RE.match(value) is None: + violations.append( + Violation(path=path, reason=f"must be base64-encoded, got {_quote(value)}") + ) + return None + return base64.b64decode(value, validate=True) + + +def _format_base64(value: bytes) -> str: + return base64.b64encode(value).decode("ascii") + + +def _parse_base64url( + value: str, path: str, violations: list[Violation] +) -> bytes | None: + if _BASE64URL_RE.match(value) is None: + violations.append( + Violation( + path=path, reason=f"must be base64url-encoded, got {_quote(value)}" + ) + ) + return None + return base64.urlsafe_b64decode(value + "=" * (-len(value) % 4)) + + +def _format_base64url(value: bytes) -> str: + return base64.urlsafe_b64encode(value).rstrip(b"=").decode("ascii") diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py new file mode 100644 index 000000000..f22711a4f --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -0,0 +1,670 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import dataclasses +import typing + +import typing_extensions + +import temporalio.converter +import temporalio.exceptions + +from ._definitions import ( + Violation, + _collect, + _parse_spec_integer, + _transfer_type_convertible, +) + + +class _AppendInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendInput"] + ) -> "AppendInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) + else: + stream_value_raw = raw["stream"] + if not isinstance(stream_value_raw, str): + violations.append(Violation(path="stream", reason="expected string")) + else: + stream_value = stream_value_raw + + producer_id_value: str = typing.cast("typing.Any", None) + if "producer_id" not in raw or raw["producer_id"] is None: + violations.append(Violation(path="producer_id", reason="required")) + else: + producer_id_value_raw = raw["producer_id"] + if not isinstance(producer_id_value_raw, str): + violations.append( + Violation(path="producer_id", reason="expected string") + ) + else: + producer_id_value = producer_id_value_raw + + attempt_value: int = typing.cast("typing.Any", None) + if "attempt" not in raw or raw["attempt"] is None: + violations.append(Violation(path="attempt", reason="required")) + else: + attempt_value_raw = raw["attempt"] + attempt_value_parsed = _parse_spec_integer( + attempt_value_raw, "attempt", violations + ) + if attempt_value_parsed is not None: + attempt_value = attempt_value_parsed + + batch_index_value: int = typing.cast("typing.Any", None) + if "batch_index" not in raw or raw["batch_index"] is None: + violations.append(Violation(path="batch_index", reason="required")) + else: + batch_index_value_raw = raw["batch_index"] + batch_index_value_parsed = _parse_spec_integer( + batch_index_value_raw, "batch_index", violations + ) + if batch_index_value_parsed is not None: + batch_index_value = batch_index_value_parsed + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + payloads_value: list[str] | None = None + if "payloads" in raw: + payloads_value_raw = raw["payloads"] + if payloads_value_raw is None: + violations.append( + Violation(path="payloads", reason="explicit null not allowed") + ) + else: + if not isinstance(payloads_value_raw, list): + violations.append( + Violation(path="payloads", reason="expected array") + ) + else: + payloads_value_list: list[str] = [] + for payloads_value_index, payloads_value_element in enumerate( + typing.cast("list[typing.Any]", payloads_value_raw) + ): + payloads_value_item_path = f"payloads[{payloads_value_index}]" + payloads_value_item_violation_count = len(violations) + payloads_value_item: str = typing.cast("typing.Any", None) + if not isinstance(payloads_value_element, str): + violations.append( + Violation( + path=payloads_value_item_path, + reason="expected string", + ) + ) + else: + payloads_value_item = payloads_value_element + if len(violations) == payloads_value_item_violation_count: + payloads_value_list.append(payloads_value_item) + payloads_value = payloads_value_list + + finish_value: bool | None = None + if "finish" in raw: + finish_value_raw = raw["finish"] + if finish_value_raw is None: + violations.append( + Violation(path="finish", reason="explicit null not allowed") + ) + else: + if not isinstance(finish_value_raw, bool): + violations.append( + Violation(path="finish", reason="expected boolean") + ) + else: + finish_value = finish_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "producer_id" + and key != "attempt" + and key != "batch_index" + and key != "topic" + and key != "payloads" + and key != "finish" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendInput( + workflow_id=workflow_id_value, + stream=stream_value, + producer_id=producer_id_value, + attempt=attempt_value, + batch_index=batch_index_value, + topic=topic_value, + payloads=payloads_value, + finish=finish_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + out["stream"] = value.stream + out["producer_id"] = value.producer_id + if abs(value.attempt) > 9007199254740991: + violations.append( + Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") + ) + out["attempt"] = value.attempt + if abs(value.batch_index) > 9007199254740991: + violations.append( + Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") + ) + out["batch_index"] = value.batch_index + if value.topic is not None: + out["topic"] = value.topic + if value.payloads is not None: + out["payloads"] = value.payloads + if value.finish is not None: + out["finish"] = value.finish + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_AppendInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendInput: + """One append call: who is writing, where, and what.""" + + workflow_id: str + """The workflow whose stream is being written.""" + + stream: str + """The named stream to append to. Empty when the producer writes to a topic instead.""" + + producer_id: str + """Identifies the writer across its retries, so its attempts can be ordered.""" + + attempt: int + """The generation this producer is writing. A later attempt supersedes an earlier one.""" + + batch_index: int + """Counts this producer's batches from 1. The handler drops an index it has already + written for this producer attempt. + """ + + topic: str | None = None + """The topic to append to, when stream is empty.""" + + payloads: list[str] | None = None + """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a + call that only finishes. + """ + + finish: bool | None = None + """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + + +class _AppendOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["AppendOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["AppendOutput"] + ) -> "AppendOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + cursor_value: str | None = None + if "cursor" in raw: + cursor_value_raw = raw["cursor"] + if cursor_value_raw is None: + violations.append( + Violation(path="cursor", reason="explicit null not allowed") + ) + else: + if not isinstance(cursor_value_raw, str): + violations.append( + Violation(path="cursor", reason="expected string") + ) + else: + cursor_value = cursor_value_raw + + for key in raw: + if key != "cursor": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return AppendOutput( + cursor=cursor_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + out: dict[str, typing.Any] = {} + if value.cursor is not None: + out["cursor"] = value.cursor + return out + + +@_transfer_type_convertible(_AppendOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class AppendOutput: + """Where the append landed, empty when it wrote nothing.""" + + cursor: str | None = None + """Opaque token naming the last record written by this call. Empty when the call + carried no payloads. + """ + + +class _ReadInputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadInput"] + ) -> "ReadInput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + workflow_id_value: str = typing.cast("typing.Any", None) + if "workflow_id" not in raw or raw["workflow_id"] is None: + violations.append(Violation(path="workflow_id", reason="required")) + else: + workflow_id_value_raw = raw["workflow_id"] + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + stream_value: str | None = None + if "stream" in raw: + stream_value_raw = raw["stream"] + if stream_value_raw is None: + violations.append( + Violation(path="stream", reason="explicit null not allowed") + ) + else: + if not isinstance(stream_value_raw, str): + violations.append( + Violation(path="stream", reason="expected string") + ) + else: + stream_value = stream_value_raw + + topic_value: str | None = None + if "topic" in raw: + topic_value_raw = raw["topic"] + if topic_value_raw is None: + violations.append( + Violation(path="topic", reason="explicit null not allowed") + ) + else: + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + after_token_value: str | None = None + if "after_token" in raw: + after_token_value_raw = raw["after_token"] + if after_token_value_raw is None: + violations.append( + Violation(path="after_token", reason="explicit null not allowed") + ) + else: + if not isinstance(after_token_value_raw, str): + violations.append( + Violation(path="after_token", reason="expected string") + ) + else: + after_token_value = after_token_value_raw + + max_records_value: int | None = None + if "max_records" in raw: + max_records_value_raw = raw["max_records"] + if max_records_value_raw is None: + violations.append( + Violation(path="max_records", reason="explicit null not allowed") + ) + else: + max_records_value_parsed = _parse_spec_integer( + max_records_value_raw, "max_records", violations + ) + if max_records_value_parsed is not None: + max_records_value = max_records_value_parsed + + wait_ms_value: int | None = None + if "wait_ms" in raw: + wait_ms_value_raw = raw["wait_ms"] + if wait_ms_value_raw is None: + violations.append( + Violation(path="wait_ms", reason="explicit null not allowed") + ) + else: + wait_ms_value_parsed = _parse_spec_integer( + wait_ms_value_raw, "wait_ms", violations + ) + if wait_ms_value_parsed is not None: + wait_ms_value = wait_ms_value_parsed + + latest_only_value: bool | None = None + if "latest_only" in raw: + latest_only_value_raw = raw["latest_only"] + if latest_only_value_raw is None: + violations.append( + Violation(path="latest_only", reason="explicit null not allowed") + ) + else: + if not isinstance(latest_only_value_raw, bool): + violations.append( + Violation(path="latest_only", reason="expected boolean") + ) + else: + latest_only_value = latest_only_value_raw + + for key in raw: + if ( + key != "workflow_id" + and key != "stream" + and key != "topic" + and key != "after_token" + and key != "max_records" + and key != "wait_ms" + and key != "latest_only" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadInput( + workflow_id=workflow_id_value, + stream=stream_value, + topic=topic_value, + after_token=after_token_value, + max_records=max_records_value, + wait_ms=wait_ms_value, + latest_only=latest_only_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadInput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + out["workflow_id"] = value.workflow_id + if value.stream is not None: + out["stream"] = value.stream + if value.topic is not None: + out["topic"] = value.topic + if value.after_token is not None: + out["after_token"] = value.after_token + if value.max_records is not None: + if abs(value.max_records) > 9007199254740991: + violations.append( + Violation( + path="max_records", reason="exceeds ±(2^53-1) integer cap" + ) + ) + out["max_records"] = value.max_records + if value.wait_ms is not None: + if abs(value.wait_ms) > 9007199254740991: + violations.append( + Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") + ) + out["wait_ms"] = value.wait_ms + if value.latest_only is not None: + out["latest_only"] = value.latest_only + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadInputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadInput: + """One read call: where to resume from and how long to wait.""" + + workflow_id: str + """The workflow whose stream is being read.""" + + stream: str | None = None + """The named stream to read. Empty reads every stream the workflow publishes.""" + + topic: str | None = None + """Yield only records on this topic. Empty yields every topic.""" + + after_token: str | None = None + """Opaque cursor from an earlier record or append. The read resumes strictly after the + record it names, so a caller never sees that record twice. Empty starts at the + beginning. The token is produced by whichever store sits behind the endpoint, so a + caller cannot tell which one that is. + """ + + max_records: int | None = None + """Return at most this many records. Defaults to 100 when omitted.""" + + wait_ms: int | None = None + """Wait at most this long for records to arrive before answering. Defaults to 5000 when + omitted. A call that collects nothing answers with no records and the caller's own + token. + """ + + latest_only: bool | None = None + """Answer with the newest position and no records, for a reader that wants to follow + from now. + """ + + +class _ReadOutputTransferTypeConverter( + temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["ReadOutput"] + ) -> "ReadOutput": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + records_value: list[RecordWire] | None = None + if "records" in raw: + records_value_raw = raw["records"] + if records_value_raw is None: + violations.append( + Violation(path="records", reason="explicit null not allowed") + ) + else: + if not isinstance(records_value_raw, list): + violations.append( + Violation(path="records", reason="expected array") + ) + else: + records_value_list: list[RecordWire] = [] + for records_value_index, records_value_element in enumerate( + typing.cast("list[typing.Any]", records_value_raw) + ): + records_value_item_path = f"records[{records_value_index}]" + records_value_item_violation_count = len(violations) + records_value_item: RecordWire = typing.cast("typing.Any", None) + try: + records_value_item = ( + _RecordWireTransferTypeConverter().from_transfer_type( + records_value_element, RecordWire + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, records_value_item_path, error) + if len(violations) == records_value_item_violation_count: + records_value_list.append(records_value_item) + records_value = records_value_list + + next_token_value: str | None = None + if "next_token" in raw: + next_token_value_raw = raw["next_token"] + if next_token_value_raw is None: + violations.append( + Violation(path="next_token", reason="explicit null not allowed") + ) + else: + if not isinstance(next_token_value_raw, str): + violations.append( + Violation(path="next_token", reason="expected string") + ) + else: + next_token_value = next_token_value_raw + + for key in raw: + if key != "records" and key != "next_token": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return ReadOutput( + records=records_value, + next_token=next_token_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "ReadOutput") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + if value.records is not None: + records_out: list[typing.Any] = [] + for records_index, records_element in enumerate(value.records): + try: + records_out.append( + _RecordWireTransferTypeConverter().to_transfer_type( + records_element + ) + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, f"records[{records_index}]", error) + out["records"] = records_out + if value.next_token is not None: + out["next_token"] = value.next_token + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_ReadOutputTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class ReadOutput: + """What one read call answered, and where to resume.""" + + records: list[RecordWire] | None = None + """The records after the caller's token, in stream order.""" + + next_token: str | None = None + """Opaque cursor to pass as after_token on the following call. Echoes the caller's own + token when the call collected nothing. + """ + + +class _RecordWireTransferTypeConverter( + temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["RecordWire"] + ) -> "RecordWire": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + token_value: str = typing.cast("typing.Any", None) + if "token" not in raw or raw["token"] is None: + violations.append(Violation(path="token", reason="required")) + else: + token_value_raw = raw["token"] + if not isinstance(token_value_raw, str): + violations.append(Violation(path="token", reason="expected string")) + else: + token_value = token_value_raw + + frame_value: str = typing.cast("typing.Any", None) + if "frame" not in raw or raw["frame"] is None: + violations.append(Violation(path="frame", reason="required")) + else: + frame_value_raw = raw["frame"] + if not isinstance(frame_value_raw, str): + violations.append(Violation(path="frame", reason="expected string")) + else: + frame_value = frame_value_raw + + for key in raw: + if key != "token" and key != "frame": + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return RecordWire( + token=token_value, + frame=frame_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "RecordWire") -> typing.Any: + out: dict[str, typing.Any] = {} + out["token"] = value.token + out["frame"] = value.frame + return out + + +@_transfer_type_convertible(_RecordWireTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class RecordWire: + """One record on the wire: its cursor and its base64 frame.""" + + token: str + """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" + + frame: str + """The base64-encoded record frame, carrying the topic, kind, producer, attempt, + sequence and body. + """ diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py new file mode 100644 index 000000000..ce5604d81 --- /dev/null +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -0,0 +1,39 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +from nexusrpc import Operation, service + +from .models import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, +) + + +@service +class TemporalStreams: + """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the + store behind it, so an operator switches storage without touching callers. Reads + hand out batches and an append carries one batch per call, because a Nexus operation + per record costs too much for token streams. + """ + + append: Operation[ + AppendInput, + AppendOutput, + ] = Operation(name="append") + """Append one batch on the caller's account. A repeated batch_index for the same + producer attempt is dropped, so a retried call writes once. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. + """ + + read: Operation[ + ReadInput, + ReadOutput, + ] = Operation(name="read") + """Answer with the records after the caller's token, or time out. The call parks until + it has max_records records or wait_ms elapses, whichever comes first, and returns + whatever it collected. + """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml new file mode 100644 index 000000000..ffa849509 --- /dev/null +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -0,0 +1,123 @@ +nexusrpc: "1.0.0" + +services: + TemporalStreams: + fqn: TemporalStreams + description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + operations: + append: + fqn: append + description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + input: { $ref: "#/$defs/AppendInput" } + output: { $ref: "#/$defs/AppendOutput" } + read: + fqn: read + description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + input: { $ref: "#/$defs/ReadInput" } + output: { $ref: "#/$defs/ReadOutput" } + +$defs: + AppendInput: + type: object + description: "One append call: who is writing, where, and what." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being written." + stream: + type: string + description: "The named stream to append to. Empty when the producer writes to a topic instead." + producer_id: + type: string + description: "Identifies the writer across its retries, so its attempts can be ordered." + attempt: + type: integer + description: "The generation this producer is writing. A later attempt supersedes an earlier one." + batch_index: + type: integer + description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + topic: + type: string + description: "The topic to append to, when stream is empty." + payloads: + type: array + items: + type: string + description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + finish: + type: boolean + description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + required: + - workflow_id + - stream + - producer_id + - attempt + - batch_index + additionalProperties: false + + AppendOutput: + type: object + description: "Where the append landed, empty when it wrote nothing." + properties: + cursor: + type: string + description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." + additionalProperties: false + + ReadInput: + type: object + description: "One read call: where to resume from and how long to wait." + properties: + workflow_id: + type: string + description: "The workflow whose stream is being read." + stream: + type: string + description: "The named stream to read. Empty reads every stream the workflow publishes." + topic: + type: string + description: "Yield only records on this topic. Empty yields every topic." + after_token: + type: string + description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + max_records: + type: integer + description: "Return at most this many records. Defaults to 100 when omitted." + wait_ms: + type: integer + description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + latest_only: + type: boolean + description: "Answer with the newest position and no records, for a reader that wants to follow from now." + required: + - workflow_id + additionalProperties: false + + RecordWire: + type: object + description: "One record on the wire: its cursor and its base64 frame." + properties: + token: + type: string + description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + frame: + type: string + description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + required: + - token + - frame + additionalProperties: false + + ReadOutput: + type: object + description: "What one read call answered, and where to resume." + properties: + records: + type: array + items: + $ref: "#/$defs/RecordWire" + description: "The records after the caller's token, in stream order." + next_token: + type: string + description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." + additionalProperties: false From b90346aebb31a1da7449bfc5bd29ce8b620d67f6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:30:01 -0700 Subject: [PATCH 515/831] Moved the nexus provider onto the generated contract. The five wire dataclasses and the service class now come from the generated module, so the contract has one source. Both halves read the operation and service names off the generated definition instead of hard-coding paths. Field names and operation names on the wire are unchanged. The one wire difference is that a read no longer sends max_records, wait_ms and latest_only when the caller leaves them at their defaults, because the contract marks them optional and the handler applies the documented defaults. Nothing outside this module and its tests speaks this wire. --- temporalio/streams/providers/nexus.py | 205 ++++++++++++-------------- 1 file changed, 93 insertions(+), 112 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 3701a70cb..8e19c2d4d 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -8,6 +8,12 @@ store behind the endpoint is invisible to callers and an operator switches it without touching them. +The wire types and the service definition come from +``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be +handed the same contract. What stays hand-written here is what the +generator cannot express yet: the handler's dedupe and long-poll collect +loop, and the caller's batching, cursor handling and codec. + Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Supersession records are not transported: the caller's reader re-synthesizes them from @@ -25,13 +31,11 @@ import asyncio import base64 -import dataclasses -import json import urllib.error import urllib.request from collections.abc import AsyncGenerator, AsyncIterator from datetime import timedelta -from typing import Any +from typing import Any, TypeVar import nexusrpc import nexusrpc.handler @@ -42,71 +46,40 @@ from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams.providers._nexus_generated import ( + AppendInput, + AppendOutput, + ReadInput, + ReadOutput, + RecordWire, + TemporalStreams, +) _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so configure one of those on the worker" ) +# The contract leaves these unset, so the handler is the one place that says +# what an omitted read bound means. +_DEFAULT_MAX_RECORDS = 100 +_DEFAULT_WAIT_MS = 5000 -@dataclasses.dataclass -class AppendInput: - """One append call: who is writing, where, and what.""" - - workflow_id: str - stream: str - producer_id: str - attempt: int - batch_index: int - topic: str = "" - payloads: list[str] = dataclasses.field(default_factory=list) - finish: bool = False - - -@dataclasses.dataclass -class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" - - cursor: str = "" - - -@dataclasses.dataclass -class ReadInput: - """One read call: where to resume from and how long to wait.""" - - workflow_id: str - stream: str = "" - topic: str = "" - after_token: str = "" - max_records: int = 100 - wait_ms: int = 5000 - # Answer with the newest position and no records, for a reader that - # wants to follow from now. - latest_only: bool = False - - -@dataclasses.dataclass -class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" - - token: str - frame: str - - -@dataclasses.dataclass -class ReadOutput: - """What one read call answered, and where to resume.""" - - records: list[RecordWire] = dataclasses.field(default_factory=list) - next_token: str = "" - - -@nexusrpc.service -class TemporalStreams: - """The stream endpoint's two operations.""" +_definition = nexusrpc.get_service_definition(TemporalStreams) +if _definition is None: # pragma: no cover + raise RuntimeError("the generated stream service carries no nexus definition") +# Both halves read the wire names off the generated definition, so a rename in +# the contract cannot leave the caller posting to a path the handler no longer +# serves. +_SERVICE_NAME = _definition.name +_OPERATION_NAMES = { + operation.method_name: operation.name + for operation in _definition.operation_definitions.values() +} +_APPEND_OPERATION = _OPERATION_NAMES["append"] +_READ_OPERATION = _OPERATION_NAMES["read"] - append: nexusrpc.Operation[AppendInput, AppendOutput] - read: nexusrpc.Operation[ReadInput, ReadOutput] +_OutputT = TypeVar("_OutputT") @nexusrpc.handler.service_handler(service=TemporalStreams) @@ -129,9 +102,10 @@ async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: """Append on the caller's account, dropping a repeated batch.""" + topic = input.topic or "" key = ( input.workflow_id, - input.stream or f"@{input.topic}", + input.stream or f"@{topic}", input.producer_id, input.attempt, ) @@ -143,7 +117,7 @@ async def append( self._client, workflow_id=input.workflow_id, stream=input.stream, - topic=input.topic, + topic=topic, producer_id=input.producer_id, attempt=input.attempt, ) @@ -168,14 +142,18 @@ async def read( ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream + self._client, workflow_id=input.workflow_id, stream=input.stream or "" ) topic = input.topic or None if input.latest_only: return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + max_records = ( + _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records + ) + wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms converter = temporalio.converter.DataConverter.default.payload_converter records: list[RecordWire] = [] - next_token = input.after_token + next_token = input.after_token or "" subscription = delegate.read( after=Cursor(input.after_token) if input.after_token else BEGINNING, topic=topic, @@ -204,13 +182,13 @@ async def collect() -> None: ) ) next_token = record.cursor.token - if len(records) >= input.max_records: + if len(records) >= max_records: return try: # `wait_for` rather than `asyncio.timeout`, which 3.10 does not # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), input.wait_ms / 1000) + await asyncio.wait_for(collect(), wait_ms / 1000) except asyncio.TimeoutError: pass finally: @@ -222,20 +200,29 @@ async def collect() -> None: return ReadOutput(records=records, next_token=next_token) -def _post(url: str, body: dict) -> dict: +def _post(url: str, body: bytes) -> bytes: request = urllib.request.Request( url, - data=json.dumps(body).encode(), + data=body, headers={"Content-Type": "application/json"}, method="POST", ) try: with urllib.request.urlopen(request, timeout=30) as response: - raw = response.read() + return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") - return json.loads(raw) if raw else {} + + +async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller and + # the worker serving the operation agree on the body without either of + # them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: @@ -276,7 +263,7 @@ async def append(self, *values: Any) -> Cursor: else self._converter.to_payloads([value])[0] ) payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).get("cursor", "")) + return Cursor((await self._call(payloads=payloads)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -284,23 +271,21 @@ async def finish(self) -> None: async def _call( self, payloads: list[str] | None = None, finish: bool = False - ) -> dict: + ) -> AppendOutput: self._batch_index += 1 - return await asyncio.to_thread( - _post, - f"{self._base_url}/append", - dataclasses.asdict( - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ) + return await _invoke( + f"{self._base_url}/{_APPEND_OPERATION}", + AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=self._batch_index, + topic=self._topic, + payloads=payloads or [], + finish=finish, ), + AppendOutput, ) @@ -327,28 +312,26 @@ async def read( attempts = AttemptTracker() token = after.token while True: - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - after_token=token, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + after_token=token, ), + ReadOutput, ) - for wire in raw.get("records", []): + for wire in answer.records or []: try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire["frame"]) + base64.b64decode(wire.frame) ) except ValueError: continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire["token"]) + cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -361,23 +344,21 @@ async def read( attempt=attempt, sequence=sequence, ) - token = raw.get("next_token", token) or token + token = answer.next_token or token async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - raw = await asyncio.to_thread( - _post, - f"{self._base_url}/read", - dataclasses.asdict( - ReadInput( - workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", - latest_only=True, - ) + answer = await _invoke( + f"{self._base_url}/{_READ_OPERATION}", + ReadInput( + workflow_id=self._workflow_id, + stream=self._stream, + topic=topic or "", + latest_only=True, ), + ReadOutput, ) - token = raw.get("next_token", "") + token = answer.next_token or "" return Cursor(token) if token else BEGINNING def _decode(self, body: bytes, as_type: type | None) -> Any: @@ -397,7 +378,7 @@ def __init__(self) -> None: def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", "TemporalStreams") + service = options.pop("service", _SERVICE_NAME) if options: raise TypeError( "the nexus provider takes endpoint, http_address and service, " From 299a90bb86719715f6b26a9a67fc58d112e2450d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 09:37:16 -0700 Subject: [PATCH 516/831] Applied the payload codec on the nexus provider's caller side. The caller ran the payload converter but never the codec, so records left the process in the clear even when one was configured. The producer now encodes before posting and the consumer decodes after reading, while the handler stays codec-blind, which is what keeps plaintext out of whoever hosts the endpoint. A data_converter option on the provider says which one to use when there is no client to take it from. --- CHANGELOG.md | 5 +- temporalio/streams/providers/nexus.py | 72 ++++++---- tests/streams/test_nexus_provider.py | 182 ++++++++++++++++++++++++-- 3 files changed, 223 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 923da8ccc..2ad3811eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,10 @@ to include examples, links to docs, or any other relevant information. naming it. - **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. + through the endpoint and never names the store. Its contract is defined in + `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. + Configure it with `data_converter=` to run a payload codec on the caller + side, so records are encoded before they leave the process. ### Changed diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8e19c2d4d..a73c830ef 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -231,7 +231,7 @@ class NexusProducer: def __init__( self, base_url: str, - converter: Any, + data_converter: temporalio.converter.DataConverter, workflow_id: str, stream: str, topic: str, @@ -240,7 +240,8 @@ def __init__( ) -> None: """Bind this producer to one stream or topic on the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream self._topic = topic @@ -255,15 +256,22 @@ def attempt(self) -> int: async def append(self, *values: Any) -> Cursor: """Append ``values`` through the endpoint.""" - payloads = [] - for value in values: - payload = ( - value - if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] - ) - payloads.append(base64.b64encode(payload.SerializeToString()).decode()) - return Cursor((await self._call(payloads=payloads)).cursor or "") + payloads = [ + value + if isinstance(value, Payload) + else self._converter.to_payloads([value])[0] + for value in values + ] + if self._codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._codec.encode(payloads) + encoded = [ + base64.b64encode(payload.SerializeToString()).decode() + for payload in payloads + ] + return Cursor((await self._call(payloads=encoded)).cursor or "") async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" @@ -293,11 +301,16 @@ class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" def __init__( - self, base_url: str, converter: Any, workflow_id: str, stream: str + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + workflow_id: str, + stream: str, ) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" self._base_url = base_url - self._converter = converter + self._converter = data_converter.payload_converter + self._codec = data_converter.payload_codec self._workflow_id = workflow_id self._stream = stream @@ -335,8 +348,11 @@ async def read( superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded + value = ( + await self._decode(body, type) if kind is RecordKind.DATA else None + ) yield StreamRecord( - value=self._decode(body, type) if kind is RecordKind.DATA else None, + value=value, cursor=cursor, kind=kind, topic=frame_topic, @@ -361,9 +377,11 @@ async def latest(self, *, topic: str | None = None) -> Cursor: token = answer.next_token or "" return Cursor(token) if token else BEGINNING - def _decode(self, body: bytes, as_type: type | None) -> Any: + async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) + if self._codec is not None: + payload = (await self._codec.decode([payload]))[0] if as_type is None: return self._converter.from_payloads([payload])[0] return self._converter.from_payloads([payload], [as_type])[0] @@ -374,19 +392,22 @@ class _NexusProvider: def __init__(self) -> None: self._base_url: str | None = None + self._data_converter: temporalio.converter.DataConverter | None = None def configure(self, **options: Any) -> None: endpoint = options.pop("endpoint", None) http_address = options.pop("http_address", "http://127.0.0.1:7243") service = options.pop("service", _SERVICE_NAME) + data_converter = options.pop("data_converter", None) if options: raise TypeError( - "the nexus provider takes endpoint, http_address and service, " - f"got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service and " + f"data_converter, got {sorted(options)}" ) if not endpoint: raise TypeError("the nexus provider needs endpoint=") self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" + self._data_converter = data_converter def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -427,7 +448,7 @@ async def producer( attempt = attempt or activity.info().attempt return NexusProducer( self._url(), - _converter(client), + self._converter(client), workflow_id, stream, topic, @@ -438,13 +459,14 @@ async def producer( async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), _converter(client), workflow_id, stream) - - -def _converter(client: Any) -> Any: - if client is None: - return temporalio.converter.DataConverter.default.payload_converter - return client.data_converter.payload_converter + return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + + def _converter(self, client: Any) -> temporalio.converter.DataConverter: + if self._data_converter is not None: + return self._data_converter + if client is None: + return temporalio.converter.DataConverter.default + return client.data_converter _provider.register("nexus", _NexusProvider) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index f07e4956c..18679ad5f 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,40 +1,55 @@ -"""Live conformance for the Nexus front. +"""Conformance for the Nexus front. -The caller talks only to the stream endpoint over the server's Nexus HTTP -ingress; the handler worker delegates to the workflow_streams provider, so -this test is the provider-hiding demonstration: nothing on the caller side -names or could name the store. Gated behind ``STREAMS_LIVE=nexus`` because it -needs a dev server with an HTTP port and a registered Nexus endpoint. +The caller talks only to the stream endpoint; the handler delegates to a +storage provider, so these tests are the provider-hiding demonstration: +nothing on the caller side names or could name the store. -Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``), -``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), and an endpoint named -``streams-e2e`` targeting task queue ``streams-handlers-e2e``. +The loop test runs over the server's Nexus HTTP ingress and is gated behind +``STREAMS_LIVE=nexus`` because it needs a dev server with an HTTP port and a +registered Nexus endpoint. Environment: ``TEMPORAL_ADDRESS`` (default +``localhost:7233``), ``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), +and an endpoint named ``streams-e2e`` targeting task queue +``streams-handlers-e2e``. + +The codec test stands the endpoint up in this process instead, because what +it checks is the bytes the caller puts on the wire. """ from __future__ import annotations +import asyncio +import base64 +import dataclasses import json import os import subprocess import uuid +from collections.abc import Sequence +from typing import Any, cast import pytest +import temporalio.converter from temporalio import streams +from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.streams import RecordKind +from temporalio.streams import _frame as frame from temporalio.streams._provider import instance +from temporalio.streams.providers import memory, nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.nexus import TemporalStreamsHandler from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take -pytestmark = pytest.mark.skipif( +live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", ) ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" +APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] def _endpoint_id() -> str: @@ -60,6 +75,7 @@ def _endpoint_id() -> str: return json.loads(out.stdout)["id"] +@live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front. @@ -119,3 +135,149 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + + +class ScrambleCodec(temporalio.converter.PayloadCodec): + """Flips every byte of a payload, so the middle holds nothing readable.""" + + KEY = 0x5A + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Wrap each payload as opaque bytes nothing downstream can read.""" + return [ + Payload( + metadata={"encoding": b"binary/plain"}, + data=self._flip(payload.SerializeToString()), + ) + for payload in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + """Recover the payloads :meth:`encode` wrapped.""" + out: list[Payload] = [] + for payload in payloads: + inner = Payload() + inner.ParseFromString(self._flip(payload.data)) + out.append(inner) + return out + + @classmethod + def _flip(cls, data: bytes) -> bytes: + return bytes(byte ^ cls.KEY for byte in data) + + +async def _dispatch( + handler: TemporalStreamsHandler, operation: str, request: Any +) -> Any: + context = cast("Any", None) # neither operation looks at it + if operation == APPEND_OPERATION: + return await handler.append(context, request) + return await handler.read(context, request) + + +def _in_process_endpoint( + handler: TemporalStreamsHandler, + posted: list[bytes], + answered: list[bytes], +) -> Any: + """Serve the caller's posts from ``handler``, recording both directions.""" + contract = temporalio.converter.DataConverter.default.payload_converter + loop = asyncio.get_running_loop() + + def post(url: str, body: bytes) -> bytes: + posted.append(body) + operation = url.rsplit("/", 1)[1] + request_type = AppendInput if operation == APPEND_OPERATION else ReadInput + request: Any = contract.from_payloads( + [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] + )[0] + if request_type is ReadInput: + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + request.wait_ms = 200 + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + raw = contract.to_payloads([answer])[0].data + answered.append(raw) + return raw + + return post + + +async def _loop_through_an_endpoint( + monkeypatch: pytest.MonkeyPatch, + codec: temporalio.converter.PayloadCodec | None, +) -> tuple[list[Any], list[bytes], list[bytes]]: + memory.reset() + streams.configure(provider="memory") + posted: list[bytes] = [] + answered: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) + front = instance( + "nexus", + endpoint="in-process", + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + workflow_id = "wf-codec" + + producer = await front.producer( + None, + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + ) + await producer.append({"secret": "tuna"}) + await producer.finish() + + consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") + records = await take(consumer.read(type=dict), 2, timeout=30) + memory.reset() + return records, posted, answered + + +def _appended_bytes(posted: list[bytes]) -> bytes: + out = b"" + for body in posted: + for encoded in json.loads(body).get("payloads", []): + out += base64.b64decode(encoded) + return out + + +def _answered_bodies(answered: list[bytes]) -> bytes: + out = b"" + for body in answered: + for record in json.loads(body).get("records", []): + out += frame.decode(base64.b64decode(record["frame"]))[5] + return out + + +async def test_the_caller_encodes_records_with_the_configured_codec( + monkeypatch: pytest.MonkeyPatch, +): + records, posted, answered = await _loop_through_an_endpoint( + monkeypatch, ScrambleCodec() + ) + + # The value survives the hop, so the codec is applied on both sides. + assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] + assert records[0].value == {"secret": "tuna"} + # Neither direction carried the plaintext. + assert b"tuna" not in _appended_bytes(posted) + assert b"tuna" not in _answered_bodies(answered) + + +async def test_without_a_codec_the_same_records_go_out_in_the_clear( + monkeypatch: pytest.MonkeyPatch, +): + # The contrast is the point: the bytes above differ because of the codec, + # not because the transport obscures them anyway. + records, posted, answered = await _loop_through_an_endpoint(monkeypatch, None) + + assert records[0].value == {"secret": "tuna"} + assert b"tuna" in _appended_bytes(posted) + assert b"tuna" in _answered_bodies(answered) From 534bd596daf0b5deabacfe5c8c2de71c8a2feba6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 517/831] Made the stream contract generator refuse a nexgen other than the pinned one. The output differs between releases, so a developer with another version on PATH would regenerate different code and only see the drift in CI. --- scripts/gen_streams_nexus_api.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/gen_streams_nexus_api.py b/scripts/gen_streams_nexus_api.py index 800aba944..2d4f16c6d 100644 --- a/scripts/gen_streams_nexus_api.py +++ b/scripts/gen_streams_nexus_api.py @@ -36,11 +36,26 @@ def nex_gen_command() -> list[str]: return ["nexgen"] +def check_version(command: list[str]) -> None: + # A different release on PATH would regenerate different code locally + # and the drift would only show in CI, so refuse before writing anything. + reported = subprocess.check_output([*command, "--version"], text=True).strip() + found = reported.split()[-1] if reported else "" + if found != NEX_GEN_VERSION: + raise SystemExit( + f"found nexgen {found or '?'} at {command[0]}, but the stream contract is " + f"generated with {NEX_GEN_VERSION}. Install it with `cargo install --locked " + f"nexgen --version {NEX_GEN_VERSION} --features advanced` or point " + "NEX_GEN_BIN at that binary." + ) + + def generate_streams_nexus_api() -> None: if not contract_path.exists(): raise RuntimeError(f"missing stream contract: {contract_path}") command = nex_gen_command() + check_version(command) shutil.rmtree(output_dir, ignore_errors=True) subprocess.check_call( [ From 3cb7d1a93bf64ce4d07a49632819f7d0e80a4b20 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 518/831] Regenerated the stream contract with byte payloads, read bounds and tolerant outputs. Payload fields carry contentEncoding base64 so both halves pass bytes and the generated code does the encoding. max_records and wait_ms carry the bounds the validator enforces, outputs accept unknown fields so a handler can add one before every caller is rebuilt, and descriptions are folded at 100 columns. --- .../providers/_nexus_generated/models.py | 201 +++++++++++++++--- .../providers/_nexus_generated/services.py | 8 +- .../providers/temporal_streams.nexusrpc.yaml | 108 ++++++++-- 3 files changed, 261 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index f22711a4f..d00cbcc63 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -13,10 +13,20 @@ from ._definitions import ( Violation, _collect, + _format_base64, + _parse_base64, _parse_spec_integer, _transfer_type_convertible, ) +_APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) + + +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) + + +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) + class _AppendInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["AppendInput", typing.Any] @@ -87,6 +97,13 @@ def from_transfer_type( ) if batch_index_value_parsed is not None: batch_index_value = batch_index_value_parsed + if batch_index_value < 1: + violations.append( + Violation( + path="batch_index", + reason=f"must be >= 1, got {batch_index_value}", + ) + ) topic_value: str | None = None if "topic" in raw: @@ -101,7 +118,7 @@ def from_transfer_type( else: topic_value = topic_value_raw - payloads_value: list[str] | None = None + payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] if payloads_value_raw is None: @@ -114,13 +131,13 @@ def from_transfer_type( Violation(path="payloads", reason="expected array") ) else: - payloads_value_list: list[str] = [] + payloads_value_list: list[bytes] = [] for payloads_value_index, payloads_value_element in enumerate( typing.cast("list[typing.Any]", payloads_value_raw) ): payloads_value_item_path = f"payloads[{payloads_value_index}]" payloads_value_item_violation_count = len(violations) - payloads_value_item: str = typing.cast("typing.Any", None) + payloads_value_item: bytes = typing.cast("typing.Any", None) if not isinstance(payloads_value_element, str): violations.append( Violation( @@ -129,7 +146,13 @@ def from_transfer_type( ) ) else: - payloads_value_item = payloads_value_element + payloads_value_item_parsed = _parse_base64( + payloads_value_element, + payloads_value_item_path, + violations, + ) + if payloads_value_item_parsed is not None: + payloads_value_item = payloads_value_item_parsed if len(violations) == payloads_value_item_violation_count: payloads_value_list.append(payloads_value_item) payloads_value = payloads_value_list @@ -190,11 +213,17 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") ) + if value.batch_index < 1: + violations.append( + Violation( + path="batch_index", reason=f"must be >= 1, got {value.batch_index}" + ) + ) out["batch_index"] = value.batch_index if value.topic is not None: out["topic"] = value.topic if value.payloads is not None: - out["payloads"] = value.payloads + out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: out["finish"] = value.finish if violations: @@ -221,15 +250,16 @@ class AppendInput: batch_index: int """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt. + written for this producer attempt, and rejects one that skips ahead or that resumes + an attempt it never saw start. """ topic: str | None = None """The topic to append to, when stream is empty.""" - payloads: list[str] | None = None - """The records to write, each a base64-encoded serialized Temporal Payload. Empty on a - call that only finishes. + payloads: list[bytes] | None = None + """The records to write, each a serialized Temporal Payload. Empty on a call that only + finishes. """ finish: bool | None = None @@ -265,33 +295,53 @@ def from_transfer_type( else: cursor_value = cursor_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "cursor": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _APPEND_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return AppendOutput( cursor=cursor_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "AppendOutput") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} if value.cursor is not None: out["cursor"] = value.cursor + for key, entry in value.additional_properties.items(): + if key in _APPEND_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_AppendOutputTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class AppendOutput: - """Where the append landed, empty when it wrote nothing.""" + """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Empty when the call - carried no payloads. + """Opaque token naming the last record written by this call. Absent when the call + carried no payloads, when the batch was a repeat the handler dropped, or when the + store learns positions only at read time. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _ReadInputTransferTypeConverter( temporalio.converter.TransferTypeConverter["ReadInput", typing.Any] @@ -375,6 +425,20 @@ def from_transfer_type( ) if max_records_value_parsed is not None: max_records_value = max_records_value_parsed + if max_records_value < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {max_records_value}", + ) + ) + if max_records_value > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {max_records_value}", + ) + ) wait_ms_value: int | None = None if "wait_ms" in raw: @@ -389,6 +453,20 @@ def from_transfer_type( ) if wait_ms_value_parsed is not None: wait_ms_value = wait_ms_value_parsed + if wait_ms_value < 0: + violations.append( + Violation( + path="wait_ms", + reason=f"must be >= 0, got {wait_ms_value}", + ) + ) + if wait_ms_value > 60000: + violations.append( + Violation( + path="wait_ms", + reason=f"must be <= 60000, got {wait_ms_value}", + ) + ) latest_only_value: bool | None = None if "latest_only" in raw: @@ -446,12 +524,38 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: path="max_records", reason="exceeds ±(2^53-1) integer cap" ) ) + if value.max_records < 1: + violations.append( + Violation( + path="max_records", + reason=f"must be >= 1, got {value.max_records}", + ) + ) + if value.max_records > 1000: + violations.append( + Violation( + path="max_records", + reason=f"must be <= 1000, got {value.max_records}", + ) + ) out["max_records"] = value.max_records if value.wait_ms is not None: if abs(value.wait_ms) > 9007199254740991: violations.append( Violation(path="wait_ms", reason="exceeds ±(2^53-1) integer cap") ) + if value.wait_ms < 0: + violations.append( + Violation( + path="wait_ms", reason=f"must be >= 0, got {value.wait_ms}" + ) + ) + if value.wait_ms > 60000: + violations.append( + Violation( + path="wait_ms", reason=f"must be <= 60000, got {value.wait_ms}" + ) + ) out["wait_ms"] = value.wait_ms if value.latest_only is not None: out["latest_only"] = value.latest_only @@ -472,7 +576,9 @@ class ReadInput: """The named stream to read. Empty reads every stream the workflow publishes.""" topic: str | None = None - """Yield only records on this topic. Empty yields every topic.""" + """Yield only records on this topic. Empty yields every topic. Only meaningful when + stream is empty, because an inbound stream has no topics. + """ after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the @@ -485,9 +591,9 @@ class ReadInput: """Return at most this many records. Defaults to 100 when omitted.""" wait_ms: int | None = None - """Wait at most this long for records to arrive before answering. Defaults to 5000 when - omitted. A call that collects nothing answers with no records and the caller's own - token. + """Wait at most this long for records to arrive before answering. The handler shortens + it to fit the request deadline. A call that collects nothing answers with no records + and the caller's own token. """ latest_only: bool | None = None @@ -557,14 +663,16 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "records" and key != "next_token": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _READ_OUTPUT_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return ReadOutput( records=records_value, next_token=next_token_value, + additional_properties=additional_properties, ) @typing_extensions.override @@ -585,6 +693,16 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + for key, entry in value.additional_properties.items(): + if key in _READ_OUTPUT_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry if violations: raise temporalio.converter.create_payload_validation_error(violations) return out @@ -603,6 +721,10 @@ class ReadOutput: token when the call collected nothing. """ + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) + class _RecordWireTransferTypeConverter( temporalio.converter.TransferTypeConverter["RecordWire", typing.Any] @@ -628,7 +750,7 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: str = typing.cast("typing.Any", None) + frame_value: bytes = typing.cast("typing.Any", None) if "frame" not in raw or raw["frame"] is None: violations.append(Violation(path="frame", reason="required")) else: @@ -636,35 +758,54 @@ def from_transfer_type( if not isinstance(frame_value_raw, str): violations.append(Violation(path="frame", reason="expected string")) else: - frame_value = frame_value_raw + frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) + if frame_value_parsed is not None: + frame_value = frame_value_parsed + additional_properties: dict[str, typing.Any] = {} for key in raw: - if key != "token" and key != "frame": - violations.append(Violation(path=key, reason="unknown field")) + if key not in _RECORD_WIRE_DECLARED: + additional_properties[key] = raw[key] if violations: raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, frame=frame_value, + additional_properties=additional_properties, ) @typing_extensions.override def to_transfer_type(self, value: "RecordWire") -> typing.Any: + violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = value.frame + out["frame"] = _format_base64(value.frame) + for key, entry in value.additional_properties.items(): + if key in _RECORD_WIRE_DECLARED: + violations.append( + Violation( + path=key, + reason="additional property collides with declared property", + ) + ) + else: + out[key] = entry + if violations: + raise temporalio.converter.create_payload_validation_error(violations) return out @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its base64 frame.""" + """One record on the wire: its cursor and its frame.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: str - """The base64-encoded record frame, carrying the topic, kind, producer, attempt, - sequence and body. - """ + frame: bytes + """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + + additional_properties: dict[str, typing.Any] = dataclasses.field( + default_factory=dict + ) diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index ce5604d81..e0673aeab 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -24,9 +24,11 @@ class TemporalStreams: AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. A repeated batch_index for the same - producer attempt is dropped, so a retried call writes once. Supersession records are - not transported: a reader re-synthesizes them from the attempts it observes. + """Append one batch on the caller's account. The handler drops a batch_index it has + already written for this producer attempt, so a retried call writes once, and + rejects an index that skips ahead or a producer attempt it has no state for. + Supersession records are not transported: a reader re-synthesizes them from the + attempts it observes. """ read: Operation[ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index ffa849509..a1cc34631 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -1,18 +1,35 @@ +# The stream endpoint's wire contract. Inputs reject unknown fields so a typo +# fails loudly at the handler; outputs accept them so a handler can add a +# field before every caller has been rebuilt from the newer contract. nexusrpc: "1.0.0" services: TemporalStreams: fqn: TemporalStreams - description: "The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams." + description: >- + The stream endpoint's two operations. One Temporal-authenticated endpoint + hides the store behind it, so an operator switches storage without + touching callers. Reads hand out batches and an append carries one batch + per call, because a Nexus operation per record costs too much for token + streams. operations: append: fqn: append - description: "Append one batch on the caller's account. A repeated batch_index for the same producer attempt is dropped, so a retried call writes once. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes." + description: >- + Append one batch on the caller's account. The handler drops a + batch_index it has already written for this producer attempt, so a + retried call writes once, and rejects an index that skips ahead or a + producer attempt it has no state for. Supersession records are not + transported: a reader re-synthesizes them from the attempts it + observes. input: { $ref: "#/$defs/AppendInput" } output: { $ref: "#/$defs/AppendOutput" } read: fqn: read - description: "Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns whatever it collected." + description: >- + Answer with the records after the caller's token, or time out. The + call parks until it has max_records records or wait_ms elapses, + whichever comes first, and returns whatever it collected. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -26,16 +43,26 @@ $defs: description: "The workflow whose stream is being written." stream: type: string - description: "The named stream to append to. Empty when the producer writes to a topic instead." + description: >- + The named stream to append to. Empty when the producer writes to a + topic instead. producer_id: type: string - description: "Identifies the writer across its retries, so its attempts can be ordered." + description: >- + Identifies the writer across its retries, so its attempts can be + ordered. attempt: type: integer - description: "The generation this producer is writing. A later attempt supersedes an earlier one." + description: >- + The generation this producer is writing. A later attempt supersedes + an earlier one. batch_index: type: integer - description: "Counts this producer's batches from 1. The handler drops an index it has already written for this producer attempt." + minimum: 1 + description: >- + Counts this producer's batches from 1. The handler drops an index it + has already written for this producer attempt, and rejects one that + skips ahead or that resumes an attempt it never saw start. topic: type: string description: "The topic to append to, when stream is empty." @@ -43,10 +70,15 @@ $defs: type: array items: type: string - description: "The records to write, each a base64-encoded serialized Temporal Payload. Empty on a call that only finishes." + contentEncoding: base64 + description: >- + The records to write, each a serialized Temporal Payload. Empty on a + call that only finishes. finish: type: boolean - description: "Mark this producer done after writing the batch, so a reader stops waiting on it." + description: >- + Mark this producer done after writing the batch, so a reader stops + waiting on it. required: - workflow_id - stream @@ -57,12 +89,16 @@ $defs: AppendOutput: type: object - description: "Where the append landed, empty when it wrote nothing." + description: "Where the append landed, when the store can say." properties: cursor: type: string - description: "Opaque token naming the last record written by this call. Empty when the call carried no payloads." - additionalProperties: false + description: >- + Opaque token naming the last record written by this call. Absent + when the call carried no payloads, when the batch was a repeat the + handler dropped, or when the store learns positions only at read + time. + additionalProperties: true ReadInput: type: object @@ -73,40 +109,64 @@ $defs: description: "The workflow whose stream is being read." stream: type: string - description: "The named stream to read. Empty reads every stream the workflow publishes." + description: >- + The named stream to read. Empty reads every stream the workflow + publishes. topic: type: string - description: "Yield only records on this topic. Empty yields every topic." + description: >- + Yield only records on this topic. Empty yields every topic. Only + meaningful when stream is empty, because an inbound stream has no + topics. after_token: type: string - description: "Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell which one that is." + description: >- + Opaque cursor from an earlier record or append. The read resumes + strictly after the record it names, so a caller never sees that + record twice. Empty starts at the beginning. The token is produced by + whichever store sits behind the endpoint, so a caller cannot tell + which one that is. max_records: type: integer + minimum: 1 + maximum: 1000 description: "Return at most this many records. Defaults to 100 when omitted." wait_ms: type: integer - description: "Wait at most this long for records to arrive before answering. Defaults to 5000 when omitted. A call that collects nothing answers with no records and the caller's own token." + minimum: 0 + maximum: 60000 + description: >- + Wait at most this long for records to arrive before answering. The + handler shortens it to fit the request deadline. A call that collects + nothing answers with no records and the caller's own token. latest_only: type: boolean - description: "Answer with the newest position and no records, for a reader that wants to follow from now." + description: >- + Answer with the newest position and no records, for a reader that + wants to follow from now. required: - workflow_id additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its base64 frame." + description: "One record on the wire: its cursor and its frame." properties: token: type: string - description: "Opaque cursor naming this record. Pass it as after_token to resume just past it." + description: >- + Opaque cursor naming this record. Pass it as after_token to resume + just past it. frame: type: string - description: "The base64-encoded record frame, carrying the topic, kind, producer, attempt, sequence and body." + contentEncoding: base64 + description: >- + The record frame, carrying the topic, kind, producer, attempt, + sequence and body. required: - token - frame - additionalProperties: false + additionalProperties: true ReadOutput: type: object @@ -119,5 +179,7 @@ $defs: description: "The records after the caller's token, in stream order." next_token: type: string - description: "Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing." - additionalProperties: false + description: >- + Opaque cursor to pass as after_token on the following call. Echoes + the caller's own token when the call collected nothing. + additionalProperties: true From c54d7506e58c1a24d624832a7f6b1e43d82c87c2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 519/831] Reworked the Nexus front's dedupe, reads, error mapping and endpoint lookup. The handler refuses to continue a producer attempt it has no state for and rejects an index that skips ahead, so a restarted or load-balanced handler cannot lose records behind a success answer. Reads come from one parked subscription per stream, pass bodies through as raw payloads so a codec survives the hop, and stop at the request deadline. The caller commits its batch index only after the endpoint answered, resends a failed batch under the same index, maps transport failures to one error type, and resolves an endpoint name through the operator service. --- temporalio/streams/providers/nexus.py | 685 +++++++++++++++++++------- 1 file changed, 508 insertions(+), 177 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index a73c830ef..8c311d1d9 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -15,33 +15,51 @@ loop, and the caller's batching, cursor handling and codec. Reads hand out batches and an append carries one batch per call, because a -Nexus operation per record costs too much for token streams. Supersession -records are not transported: the caller's reader re-synthesizes them from -the attempts it observes, which is the policy module's job on every -provider. Cursors pass through opaque, so the caller cannot tell which store -produced them. - -One stated prototype limit: append deduplication holds at the handler by -batch index per producer, so a handler restart during a producer's life can -double-append. The store-level fix, a sequence-explicit append in the IDL -contract, is listed in the design doc's work table. +Nexus operation per record costs too much for token streams. Record bodies +cross the handler untouched: it reads the store as raw payloads and frames +them as they are, so a codec that changes the payload encoding survives the +hop and the handler's worker never needs the key. Supersession records are +not transported: the caller's reader re-synthesizes them from the attempts +it observes, which is the policy module's job on every provider. Cursors +pass through opaque, so the caller cannot tell which store produced them. + +The handler keeps one parked read per ``(workflow, stream, topic)`` and +serves consecutive calls from it, so an idle caller does not leave one +abandoned long poll on the store per call. A call whose token does not +match the parked position replaces the subscription, and an idle one is +released after a minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, +by batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh +delegate whose numbering the store would drop as a repeat; the caller opens +a new attempt, which readers report as a supersession. The store-level fix, +a sequence-explicit append in the contract, is listed in the design doc's +work table. And any caller the endpoint admits may touch any workflow's +streams in the namespace; the endpoint's own authorization is the boundary. """ from __future__ import annotations import asyncio -import base64 +import logging +import time import urllib.error import urllib.request -from collections.abc import AsyncGenerator, AsyncIterator -from datetime import timedelta +from collections import OrderedDict +from collections.abc import AsyncGenerator, Mapping +from dataclasses import dataclass +from datetime import datetime, timedelta, timezone from typing import Any, TypeVar import nexusrpc import nexusrpc.handler +from google.protobuf.message import DecodeError import temporalio.converter from temporalio.api.common.v1 import Payload +from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.common import RawValue from temporalio.streams import _frame, _provider from temporalio.streams._handles import ReadSource, WriteSink from temporalio.streams._policy import AttemptTracker @@ -61,9 +79,16 @@ ) # The contract leaves these unset, so the handler is the one place that says -# what an omitted read bound means. +# what an omitted read bound means. The wait is long because the handler +# shortens it to the request deadline anyway, and a shorter default only +# means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 5000 +_DEFAULT_WAIT_MS = 30_000 +_DEADLINE_MARGIN = timedelta(milliseconds=500) +_DEFAULT_MAX_PRODUCERS = 10_000 +_DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) +_QUEUE_DEPTH = 1000 +_APPEND_TIMEOUT_MS = 30_000 _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -81,6 +106,34 @@ _OutputT = TypeVar("_OutputT") +logger = logging.getLogger(__name__) + + +def _bad_request(message: str) -> nexusrpc.HandlerError: + return nexusrpc.HandlerError( + message, + type=nexusrpc.HandlerErrorType.BAD_REQUEST, + retryable_override=False, + ) + + +@dataclass +class _Subscription: + """One parked read on the store, shared by consecutive calls.""" + + records: asyncio.Queue[StreamRecord[Any]] + position: str + last_used: float + pump: asyncio.Task[None] | None = None + failure: BaseException | None = None + done: bool = False + + +@dataclass +class _ProducerState: + delegate: Any + batch_index: int + @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: @@ -91,17 +144,45 @@ class TemporalStreamsHandler: run handlers for a new store next to handlers for the old one. """ - def __init__(self, client: Any, provider: str, **provider_options: Any) -> None: - """Serve the endpoint out of the provider named by ``provider``.""" + def __init__( + self, + client: Any, + provider: str, + *, + max_producers: int = _DEFAULT_MAX_PRODUCERS, + subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, + **provider_options: Any, + ) -> None: + """Serve the endpoint out of the provider named by ``provider``. + + ``max_producers`` bounds the dedupe state kept per producer attempt; + the oldest is evicted, and a producer evicted mid-life gets a clear + refusal on its next batch rather than a silent drop. + ``subscription_idle`` is how long a parked read outlives its last + caller. + """ self._client = client self._delegate = _provider.instance(provider, **provider_options) - self._producers: dict[tuple[str, str, str, int], tuple[Any, int]] = {} + self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + OrderedDict() + ) + self._max_producers = max_producers + self._subscriptions: dict[tuple[str, str, str], _Subscription] = {} + self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} + self._subscription_idle = subscription_idle.total_seconds() @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch.""" + """Append on the caller's account, dropping a repeated batch. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips + ahead, when it continues a producer attempt this handler has + no state for, or when a payload is not a serialized + ``Payload``. + """ topic = input.topic or "" key = ( input.workflow_id, @@ -109,10 +190,18 @@ async def append( input.producer_id, input.attempt, ) - cached = self._producers.get(key) - if cached is not None and input.batch_index <= cached[1]: - return AppendOutput() - if cached is None: + state = self._producers.get(key) + if state is None: + if input.batch_index != 1: + # A fresh delegate would restart its numbering at zero, and + # the store would drop that as a repeat of the first batch. + # Refusing here turns a silent loss into a failure the caller + # can act on by opening a new attempt. + raise _bad_request( + f"producer {input.producer_id!r} attempt {input.attempt} resumed " + f"at batch {input.batch_index} on a handler that has no state for " + "it; open a new attempt" + ) delegate = await self._delegate.producer( self._client, workflow_id=input.workflow_id, @@ -121,117 +210,304 @@ async def append( producer_id=input.producer_id, attempt=input.attempt, ) - else: - delegate = cached[0] - self._producers[key] = (delegate, input.batch_index) - cursor = "" - if input.payloads: - payloads = [] - for encoded in input.payloads: - payload = Payload() - payload.ParseFromString(base64.b64decode(encoded)) - payloads.append(payload) - cursor = (await delegate.append(*payloads)).token + state = _ProducerState(delegate, 0) + elif input.batch_index <= state.batch_index: + # A repeat, or a producer that restarted its numbering: either + # way the store already holds the batch. + self._producers.move_to_end(key) + return AppendOutput() + elif input.batch_index != state.batch_index + 1: + raise _bad_request( + f"batch {input.batch_index} skips ahead of {state.batch_index} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) + payloads = self._payloads(input.payloads) + cursor: str | None = None + if payloads: + appended = await state.delegate.append(*payloads) + cursor = appended.token if appended is not None else None if input.finish: - await delegate.finish() + await state.delegate.finish() + self._producers.pop(key, None) + return AppendOutput(cursor=cursor) + # Recorded only once the store accepted the batch, so a failed append + # is not mistaken for a repeat when the caller retries it. + state.batch_index = input.batch_index + self._producers[key] = state + self._producers.move_to_end(key) + while len(self._producers) > self._max_producers: + self._producers.popitem(last=False) return AppendOutput(cursor=cursor) + @staticmethod + def _payloads(encoded: list[bytes] | None) -> list[Payload]: + payloads = [] + for index, raw in enumerate(encoded or []): + payload = Payload() + try: + payload.ParseFromString(raw) + except DecodeError as error: + raise _bad_request( + f"payloads[{index}] is not a serialized Temporal Payload: {error}" + ) from error + payloads.append(payload) + return payloads + @nexusrpc.handler.sync_operation async def read( - self, _ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: """Answer with the records after the caller's token, or time out.""" - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=input.stream or "" - ) + stream = input.stream or "" topic = input.topic or None if input.latest_only: + delegate = await self._delegate.consumer( + self._client, workflow_id=input.workflow_id, stream=stream + ) return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait_ms = _DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms - converter = temporalio.converter.DataConverter.default.payload_converter - records: list[RecordWire] = [] - next_token = input.after_token or "" - subscription = delegate.read( - after=Cursor(input.after_token) if input.after_token else BEGINNING, - topic=topic, - ) - - async def collect() -> None: - nonlocal next_token - async for record in subscription: - if record.kind is RecordKind.SUPERSEDED: - continue - body = b"" - if record.kind is RecordKind.DATA: - body = converter.to_payloads([record.value])[0].SerializeToString() - frame = _frame.encode( - topic=record.topic, - kind=record.kind, - producer=record.producer, - attempt=record.attempt, - sequence=record.sequence, - body=body, - ) - records.append( - RecordWire( - token=record.cursor.token, - frame=base64.b64encode(frame).decode("ascii"), - ) + wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + if ctx.request_deadline is not None: + # The server answers the caller with a timeout at the deadline + # whatever this call does, so collecting past it only holds the + # slot for an answer nobody receives. + deadline = ctx.request_deadline + if deadline.tzinfo is None: + deadline = deadline.replace(tzinfo=timezone.utc) + left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN + wait = max(0.0, min(wait, left.total_seconds())) + after = input.after_token or "" + key = (input.workflow_id, stream, topic or "") + await self._expire_subscriptions() + lock = self._read_locks.setdefault(key, asyncio.Lock()) + async with lock: + subscription = self._subscriptions.get(key) + if subscription is None or subscription.position != after: + if subscription is not None: + await self._drop(key) + subscription = await self._subscribe( + key, input.workflow_id, stream, topic, after ) - next_token = record.cursor.token - if len(records) >= max_records: - return + records, next_token = await self._drain(subscription, max_records, wait) + subscription.position = next_token + subscription.last_used = time.monotonic() + if subscription.done and subscription.records.empty(): + # The store ended the read, as the Workflow Streams delegate + # does when the run closes. Nothing more will arrive on it. + await self._drop(key) + return ReadOutput(records=records, next_token=next_token) + + async def _subscribe( + self, + key: tuple[str, str, str], + workflow_id: str, + stream: str, + topic: str | None, + after: str, + ) -> _Subscription: + delegate = await self._delegate.consumer( + self._client, workflow_id=workflow_id, stream=stream + ) + # Raw payloads: the handler frames what the store holds without + # decoding it, so an encoding only the caller's codec understands + # passes through untouched. + source = delegate.read( + after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + ) + subscription = _Subscription( + records=asyncio.Queue(maxsize=_QUEUE_DEPTH), + position=after, + last_used=time.monotonic(), + ) + async def pump() -> None: + try: + async for record in source: + if record.kind is RecordKind.SUPERSEDED: + continue + await subscription.records.put(record) + except asyncio.CancelledError: + raise + except Exception as error: + subscription.failure = error + finally: + subscription.done = True + if isinstance(source, AsyncGenerator): + await source.aclose() + + subscription.pump = asyncio.create_task(pump()) + self._subscriptions[key] = subscription + return subscription + + async def _drain( + self, subscription: _Subscription, max_records: int, wait: float + ) -> tuple[list[RecordWire], str]: + records: list[RecordWire] = [] + next_token = subscription.position + queue = subscription.records + deadline = time.monotonic() + wait + while len(records) < max_records: + if queue.empty(): + remaining = deadline - time.monotonic() + if records or remaining <= 0: + break + if subscription.done: + # Honour the wait even though nothing can arrive, so a + # caller polling a closed stream does not spin on the + # endpoint. + await asyncio.sleep(remaining) + break + try: + record = await asyncio.wait_for(queue.get(), remaining) + except asyncio.TimeoutError: + break + else: + record = queue.get_nowait() + records.append(self._wire(record)) + next_token = record.cursor.token + if not records and subscription.failure is not None: + failure, subscription.failure = subscription.failure, None + raise failure + return records, next_token + + @staticmethod + def _wire(record: StreamRecord[Any]) -> RecordWire: + body = ( + record.value.payload.SerializeToString() + if isinstance(record.value, RawValue) + else b"" + ) + frame = _frame.encode( + topic=record.topic, + kind=record.kind, + producer=record.producer, + attempt=record.attempt, + sequence=record.sequence, + body=body, + ) + return RecordWire(token=record.cursor.token, frame=frame) + + async def close(self) -> None: + """Release every parked read. + + Call it when the worker hosting this handler stops, so subscriptions + waiting on the store do not outlive it. + """ + for key in list(self._subscriptions): + await self._drop(key) + self._read_locks.clear() + + async def _drop(self, key: tuple[str, str, str]) -> None: + subscription = self._subscriptions.pop(key, None) + if subscription is None or subscription.pump is None: + return + subscription.pump.cancel() try: - # `wait_for` rather than `asyncio.timeout`, which 3.10 does not - # have. Whatever was collected before the deadline is the answer. - await asyncio.wait_for(collect(), wait_ms / 1000) - except asyncio.TimeoutError: + await subscription.pump + except (asyncio.CancelledError, Exception): pass - finally: - # The delegate's read parks against its store, and this call - # answers before the caller asks again, so let it go now rather - # than when the collector is next swept. - if isinstance(subscription, AsyncGenerator): - await subscription.aclose() - return ReadOutput(records=records, next_token=next_token) + async def _expire_subscriptions(self) -> None: + cutoff = time.monotonic() - self._subscription_idle + for key in [k for k, s in self._subscriptions.items() if s.last_used < cutoff]: + lock = self._read_locks.get(key) + if lock is not None and lock.locked(): + continue + await self._drop(key) + self._read_locks.pop(key, None) + + +class StreamEndpointError(RuntimeError): + """The stream endpoint refused a call or could not be reached. -def _post(url: str, body: bytes) -> bytes: + ``status`` is the HTTP status when the endpoint answered, and ``None`` + when the connection itself failed. + """ + + def __init__(self, message: str, *, status: int | None = None) -> None: + """Carry the endpoint's answer, or the reason it gave none.""" + super().__init__(message) + self.status = status + + +def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: request = urllib.request.Request( url, data=body, - headers={"Content-Type": "application/json"}, + headers={ + "Content-Type": "application/json", + # Tells the server how long the handler may park, so it does not + # time the call out ahead of a wait the caller asked for. + "Request-Timeout": f"{timeout_ms}ms", + **headers, + }, method="POST", ) try: - with urllib.request.urlopen(request, timeout=30) as response: + with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: return response.read() except urllib.error.HTTPError as error: detail = error.read().decode(errors="replace") - raise RuntimeError(f"stream endpoint call failed ({error.code}): {detail}") + raise StreamEndpointError( + f"stream endpoint call failed ({error.code}): {detail}", status=error.code + ) from error + except urllib.error.URLError as error: + raise StreamEndpointError( + f"stream endpoint unreachable at {url}: {error.reason}" + ) from error + +class _Front: + """Everything the caller half needs to reach one endpoint.""" -async def _invoke(url: str, request: Any, output: type[_OutputT]) -> _OutputT: - # The contract types carry their own JSON encoding, so the raw caller and - # the worker serving the operation agree on the body without either of - # them spelling the fields out. - contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread(_post, url, contract.to_payloads([request])[0].data) - payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") - return contract.from_payloads([payload], [output])[0] + def __init__( + self, + base_url: str, + data_converter: temporalio.converter.DataConverter, + headers: Mapping[str, str], + wait_ms: int, + max_records: int, + ) -> None: + self.base_url = base_url + self.converter = data_converter.payload_converter + self.codec = data_converter.payload_codec + self.headers = dict(headers) + self.wait_ms = wait_ms + self.max_records = max_records + + async def invoke( + self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + ) -> _OutputT: + # The contract types carry their own JSON encoding, so the raw caller + # and the worker serving the operation agree on the body without + # either of them spelling the fields out. + contract = temporalio.converter.DataConverter.default.payload_converter + raw = await asyncio.to_thread( + _post, + f"{self.base_url}/{operation}", + contract.to_payloads([request])[0].data, + self.headers, + timeout_ms, + ) + payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") + return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it.""" + """Appends through the stream endpoint; framing happens behind it. + + Calls are serialized and the batch index is committed only once the + endpoint answered. A batch whose call raised stays pending and is sent + again under the same index, either when the caller retries the same + values or ahead of whatever the caller sends next, so an ambiguous + failure writes the batch once and loses nothing. + """ def __init__( self, - base_url: str, - data_converter: temporalio.converter.DataConverter, + front: _Front, workflow_id: str, stream: str, topic: str, @@ -239,78 +515,92 @@ def __init__( attempt: int, ) -> None: """Bind this producer to one stream or topic on the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None + self._lock = asyncio.Lock() @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor: + async def append(self, *values: Any) -> Cursor | None: """Append ``values`` through the endpoint.""" + if not values: + return None payloads = [ value if isinstance(value, Payload) - else self._converter.to_payloads([value])[0] + else self._front.converter.to_payloads([value])[0] for value in values ] - if self._codec is not None: - # The endpoint is the edge of this process, so a configured codec - # runs here rather than at the handler: whoever hosts the endpoint - # never holds the plaintext. - payloads = await self._codec.encode(payloads) - encoded = [ - base64.b64encode(payload.SerializeToString()).decode() - for payload in payloads - ] - return Cursor((await self._call(payloads=encoded)).cursor or "") + answer = await self._call(payloads, finish=False) + return Cursor(answer.cursor) if answer.cursor else None async def finish(self) -> None: """Mark this producer done, so a reader stops waiting on it.""" - await self._call(finish=True) + await self._call([], finish=True) + + async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: + # Identity is taken before the codec runs: a codec may encrypt with a + # fresh nonce each time, and the retry has to be recognised anyway. + identity = tuple(payload.SerializeToString() for payload in payloads) + if self._front.codec is not None: + # The endpoint is the edge of this process, so a configured codec + # runs here rather than at the handler: whoever hosts the endpoint + # never holds the plaintext. + payloads = await self._front.codec.encode(payloads) + encoded = [payload.SerializeToString() for payload in payloads] + async with self._lock: + if self._pending is not None and self._pending[1:] != (identity, finish): + # The caller moved on from a batch the endpoint may or may + # not have applied. It goes first under its own index, so the + # handler drops it if it landed and writes it if not, and the + # new batch takes the index after it. + await self._send(*self._pending) + elif self._pending is not None: + return await self._send(*self._pending) + request = self._request(self._batch_index + 1, encoded, finish) + return await self._send(request, identity, finish) + + def _request( + self, batch_index: int, payloads: list[bytes], finish: bool + ) -> AppendInput: + return AppendInput( + workflow_id=self._workflow_id, + stream=self._stream, + producer_id=self._producer_id, + attempt=self._attempt, + batch_index=batch_index, + topic=self._topic, + payloads=payloads, + finish=finish, + ) - async def _call( - self, payloads: list[str] | None = None, finish: bool = False + async def _send( + self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: - self._batch_index += 1 - return await _invoke( - f"{self._base_url}/{_APPEND_OPERATION}", - AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=self._batch_index, - topic=self._topic, - payloads=payloads or [], - finish=finish, - ), - AppendOutput, + self._pending = (request, identity, finish) + answer = await self._front.invoke( + _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS ) + self._batch_index = request.batch_index + self._pending = None + return answer class NexusConsumer: """Reads batches from the stream endpoint, re-synthesizing supersession.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - workflow_id: str, - stream: str, - ) -> None: + def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: """Read what ``workflow_id`` publishes, through the endpoint.""" - self._base_url = base_url - self._converter = data_converter.payload_converter - self._codec = data_converter.payload_codec + self._front = front self._workflow_id = workflow_id self._stream = stream @@ -320,31 +610,37 @@ async def read( after: Cursor = BEGINNING, topic: str | None = None, type: type | None = None, - ) -> AsyncIterator[StreamRecord[Any]]: + ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records after ``after``, one endpoint batch at a time.""" + _provider.check_topic(self._stream, topic) attempts = AttemptTracker() token = after.token while True: - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, topic=topic or "", after_token=token, + max_records=self._front.max_records, + wait_ms=self._front.wait_ms, ), ReadOutput, + timeout_ms=self._front.wait_ms + 5000, ) for wire in answer.records or []: + cursor = Cursor(wire.token) try: kind, frame_topic, source, attempt, sequence, body = _frame.decode( - base64.b64decode(wire.frame) + wire.frame ) - except ValueError: + except ValueError as error: + # Same answer as every other reader: skip and say so. + logger.warning("skipping stream record at %s: %s", cursor, error) continue if topic is not None and frame_topic != topic: continue - cursor = Cursor(wire.token) superseded = attempts.note(source, attempt, cursor) if superseded is not None: yield superseded @@ -364,8 +660,8 @@ async def read( async def latest(self, *, topic: str | None = None) -> Cursor: """The cursor of the last record written, for following from now.""" - answer = await _invoke( - f"{self._base_url}/{_READ_OPERATION}", + answer = await self._front.invoke( + _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, stream=self._stream, @@ -373,6 +669,7 @@ async def latest(self, *, topic: str | None = None) -> Cursor: latest_only=True, ), ReadOutput, + timeout_ms=_APPEND_TIMEOUT_MS, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING @@ -380,34 +677,58 @@ async def latest(self, *, topic: str | None = None) -> Cursor: async def _decode(self, body: bytes, as_type: type | None) -> Any: payload = Payload() payload.ParseFromString(body) - if self._codec is not None: - payload = (await self._codec.decode([payload]))[0] + if self._front.codec is not None: + payload = (await self._front.codec.decode([payload]))[0] if as_type is None: - return self._converter.from_payloads([payload])[0] - return self._converter.from_payloads([payload], [as_type])[0] + return self._front.converter.from_payloads([payload])[0] + return self._front.converter.from_payloads([payload], [as_type])[0] class _NexusProvider: name = "nexus" def __init__(self) -> None: - self._base_url: str | None = None + self._endpoint: str | None = None + self._endpoint_id: str | None = None + self._http_address = "http://127.0.0.1:7243" + self._service = _SERVICE_NAME self._data_converter: temporalio.converter.DataConverter | None = None + self._client: Any = None + self._headers: dict[str, str] = {} + self._wait_ms = _DEFAULT_WAIT_MS + self._max_records = _DEFAULT_MAX_RECORDS def configure(self, **options: Any) -> None: + """Point the caller half at one endpoint. + + ``endpoint`` is the endpoint's name when ``client`` is given, and is + resolved to its id through the operator service on first use; without + a client it has to be the id, because the HTTP ingress dispatches by + id. ``headers`` go on every request, which is where an authorization + header belongs. ``wait_ms`` and ``max_records`` are the read bounds + the caller asks the handler for. + """ endpoint = options.pop("endpoint", None) - http_address = options.pop("http_address", "http://127.0.0.1:7243") - service = options.pop("service", _SERVICE_NAME) - data_converter = options.pop("data_converter", None) + self._http_address = options.pop("http_address", self._http_address) + self._service = options.pop("service", _SERVICE_NAME) + self._data_converter = options.pop("data_converter", None) + self._client = options.pop("client", None) + self._headers = dict(options.pop("headers", None) or {}) + self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) + self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) if options: raise TypeError( - "the nexus provider takes endpoint, http_address, service and " - f"data_converter, got {sorted(options)}" + "the nexus provider takes endpoint, http_address, service, " + f"data_converter, client, headers, wait_ms and max_records, got " + f"{sorted(options)}" ) if not endpoint: - raise TypeError("the nexus provider needs endpoint=") - self._base_url = f"{http_address}/nexus/endpoints/{endpoint}/services/{service}" - self._data_converter = data_converter + raise TypeError( + "the nexus provider needs endpoint= together with " + "client=, or endpoint= on its own" + ) + self._endpoint = endpoint + self._endpoint_id = None def worker_options(self) -> dict[str, Any]: raise RuntimeError(_WORKFLOW_SIDE_ERROR) @@ -426,10 +747,31 @@ def open_write(self, topic: str) -> WriteSink: del topic raise RuntimeError(_WORKFLOW_SIDE_ERROR) - def _url(self) -> str: - if self._base_url is None: + async def _front(self, client: Any) -> _Front: + if self._endpoint is None: raise RuntimeError("configure the nexus provider before opening handles") - return self._base_url + if self._endpoint_id is None: + resolver = self._client if self._client is not None else client + if resolver is None: + self._endpoint_id = self._endpoint + else: + found = await resolver.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") + self._endpoint_id = found.endpoints[0].id + base_url = ( + f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" + f"/services/{self._service}" + ) + return _Front( + base_url, + self._converter(client), + self._headers, + self._wait_ms, + self._max_records, + ) async def producer( self, @@ -441,25 +783,14 @@ async def producer( producer_id: str = "", attempt: int = 0, ) -> NexusProducer: - if not producer_id: - from temporalio import activity - - producer_id = activity.info().activity_id - attempt = attempt or activity.info().attempt return NexusProducer( - self._url(), - self._converter(client), - workflow_id, - stream, - topic, - producer_id, - attempt, + await self._front(client), workflow_id, stream, topic, producer_id, attempt ) async def consumer( self, client: Any, *, workflow_id: str, stream: str = "" ) -> NexusConsumer: - return NexusConsumer(self._url(), self._converter(client), workflow_id, stream) + return NexusConsumer(await self._front(client), workflow_id, stream) def _converter(self, client: Any) -> temporalio.converter.DataConverter: if self._data_converter is not None: From 769cfd058966f212962c9704ccfbac200ed49d7c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 17:02:21 -0700 Subject: [PATCH 520/831] Covered the Nexus front's refusals, retries, subscription reuse and deadline clamp. --- tests/streams/test_nexus_provider.py | 334 ++++++++++++++++++++++----- 1 file changed, 274 insertions(+), 60 deletions(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 18679ad5f..77cec6f4e 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -11,8 +11,8 @@ and an endpoint named ``streams-e2e`` targeting task queue ``streams-handlers-e2e``. -The codec test stands the endpoint up in this process instead, because what -it checks is the bytes the caller puts on the wire. +Everything else stands the endpoint up in this process, because what it +checks is the bytes the caller puts on the wire and the handler's own rules. """ from __future__ import annotations @@ -22,11 +22,13 @@ import dataclasses import json import os -import subprocess import uuid -from collections.abc import Sequence -from typing import Any, cast +from collections.abc import Mapping, Sequence +from datetime import datetime, timedelta, timezone +from typing import Any +import nexusrpc +import nexusrpc.handler import pytest import temporalio.converter @@ -38,7 +40,10 @@ from temporalio.streams._provider import instance from temporalio.streams.providers import memory, nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import TemporalStreamsHandler +from temporalio.streams.providers.nexus import ( + StreamEndpointError, + TemporalStreamsHandler, +) from temporalio.worker import Worker from tests.streams.test_workflow_streams_provider import EchoLoop, take @@ -50,51 +55,27 @@ ENDPOINT = "streams-e2e" HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] - - -def _endpoint_id() -> str: - # The HTTP ingress dispatches by endpoint id, not name. - out = subprocess.run( - [ - "temporal", - "operator", - "nexus", - "endpoint", - "get", - "--name", - ENDPOINT, - "-o", - "json", - "--address", - os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), - ], - capture_output=True, - text=True, - check=True, - ) - return json.loads(out.stdout)["id"] +READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] @live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage - # provider; only the caller goes through the front. + # provider; only the caller goes through the front, and it names the + # endpoint the way an operator does, by name. streams.configure(provider="workflow_streams") client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) front = instance( "nexus", - endpoint=_endpoint_id(), + endpoint=ENDPOINT, + client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + wait_ms=5000, ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" + handler = TemporalStreamsHandler(client, provider="workflow_streams") - async with Worker( - client, - task_queue=HANDLER_TQ, - nexus_service_handlers=[ - TemporalStreamsHandler(client, provider="workflow_streams") - ], - ): + async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", @@ -135,10 +116,11 @@ async def test_interface_loop_through_the_nexus_front(): await handle.signal(EchoLoop.release) assert await handle.result() == 3 + await handler.close() class ScrambleCodec(temporalio.converter.PayloadCodec): - """Flips every byte of a payload, so the middle holds nothing readable.""" + """Flips every byte and labels the result with an encoding only it can read.""" KEY = 0x5A @@ -146,7 +128,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: """Wrap each payload as opaque bytes nothing downstream can read.""" return [ Payload( - metadata={"encoding": b"binary/plain"}, + metadata={"encoding": b"binary/scrambled"}, data=self._flip(payload.SerializeToString()), ) for payload in payloads @@ -166,45 +148,98 @@ def _flip(cls, data: bytes) -> bytes: return bytes(byte ^ cls.KEY for byte in data) +class _NeverCancelled(nexusrpc.handler.OperationTaskCancellation): + def is_cancelled(self) -> bool: + return False + + def cancellation_reason(self) -> str | None: + return None + + def wait_until_cancelled_sync(self, timeout: float | None = None) -> bool: + del timeout + return False + + async def wait_until_cancelled(self) -> None: + await asyncio.Event().wait() + + +def _context( + operation: str, deadline: datetime | None = None +) -> nexusrpc.handler.StartOperationContext: + return nexusrpc.handler.StartOperationContext( + service=nexus._SERVICE_NAME, # pyright: ignore[reportPrivateUsage] + operation=operation, + headers={}, + task_cancellation=_NeverCancelled(), + request_deadline=deadline, + request_id=uuid.uuid4().hex, + ) + + async def _dispatch( handler: TemporalStreamsHandler, operation: str, request: Any ) -> Any: - context = cast("Any", None) # neither operation looks at it if operation == APPEND_OPERATION: - return await handler.append(context, request) - return await handler.read(context, request) + return await handler.append(_context(operation), request) + return await handler.read(_context(operation), request) def _in_process_endpoint( handler: TemporalStreamsHandler, posted: list[bytes], answered: list[bytes], + *, + fail_after_applying: list[str] | None = None, ) -> Any: - """Serve the caller's posts from ``handler``, recording both directions.""" + """Serve the caller's posts from ``handler``, recording both directions. + + ``fail_after_applying`` names operations whose first call is applied and + then reported as a transport failure, the ambiguous case a retry has to + survive. + """ contract = temporalio.converter.DataConverter.default.payload_converter loop = asyncio.get_running_loop() + failing = set(fail_after_applying or []) - def post(url: str, body: bytes) -> bytes: + def post( + url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + ) -> bytes: + del headers, timeout_ms posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput request: Any = contract.from_payloads( [Payload(metadata={"encoding": b"json/plain"}, data=body)], [request_type] )[0] - if request_type is ReadInput: - # This endpoint has no other traffic to wait for, so park briefly - # rather than for the contract's default. - request.wait_ms = 200 - answer = asyncio.run_coroutine_threadsafe( - _dispatch(handler, operation, request), loop - ).result() + try: + answer = asyncio.run_coroutine_threadsafe( + _dispatch(handler, operation, request), loop + ).result() + except nexusrpc.HandlerError as error: + raise StreamEndpointError(str(error), status=400) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) + if operation in failing: + failing.discard(operation) + raise StreamEndpointError("connection reset after the handler answered") return raw return post +def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: + return instance( + "nexus", + endpoint="in-process", + # This endpoint has no other traffic to wait for, so park briefly + # rather than for the contract's default. + wait_ms=200, + data_converter=dataclasses.replace( + temporalio.converter.DataConverter.default, payload_codec=codec + ), + ) + + async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, @@ -215,13 +250,7 @@ async def _loop_through_an_endpoint( answered: list[bytes] = [] handler = TemporalStreamsHandler(None, provider="memory") monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = instance( - "nexus", - endpoint="in-process", - data_converter=dataclasses.replace( - temporalio.converter.DataConverter.default, payload_codec=codec - ), - ) + front = _front(codec) workflow_id = "wf-codec" producer = await front.producer( @@ -263,7 +292,9 @@ async def test_the_caller_encodes_records_with_the_configured_codec( monkeypatch, ScrambleCodec() ) - # The value survives the hop, so the codec is applied on both sides. + # The value survives the hop although the handler cannot read the + # encoding, so the body passed through it untouched and the codec ran on + # the caller alone. assert [record.kind for record in records] == [RecordKind.DATA, RecordKind.FINISH] assert records[0].value == {"secret": "tuna"} # Neither direction carried the plaintext. @@ -281,3 +312,186 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( assert records[0].value == {"secret": "tuna"} assert b"tuna" in _appended_bytes(posted) assert b"tuna" in _answered_bodies(answered) + + +def _append( + workflow_id: str, batch_index: int, *values: Any, finish: bool = False +) -> AppendInput: + converter = temporalio.converter.DataConverter.default.payload_converter + return AppendInput( + workflow_id=workflow_id, + stream="inputs", + producer_id="model", + attempt=1, + batch_index=batch_index, + payloads=[ + converter.to_payloads([value])[0].SerializeToString() for value in values + ], + finish=finish, + ) + + +async def _stored(workflow_id: str) -> list[Any]: + consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") + out: list[Any] = [] + async for record in consumer.read(type=dict): + if record.kind is RecordKind.DATA: + out.append(record.value) + if await consumer.latest() == record.cursor: + break + return out + + +@pytest.fixture +def _memory_store(): # pyright: ignore[reportUnusedFunction] + memory.reset() + streams.configure(provider="memory") + yield + memory.reset() + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): + # A second handler instance stands in for a restarted or load-balanced + # handler worker: it shares the store but not the dedupe state. + first = TemporalStreamsHandler(None, provider="memory") + second = TemporalStreamsHandler(None, provider="memory") + await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert failed.value.retryable_override is False + # The store holds the first batch and nothing was silently lost or doubled. + assert await _stored("wf") == [{"n": 1}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_handler_drops_repeats_and_rejects_gaps(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # An exact repeat is dropped with a success answer and no position. + repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + assert repeat.cursor is None + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_malformed_payload_is_the_callers_fault(): + handler = TemporalStreamsHandler(None, provider="memory") + request = _append("wf", 1) + request.payloads = [b"\xff\xfe not a payload"] + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, APPEND_OPERATION, request) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + await producer.finish() + indexes = [json.loads(body)["batch_index"] for body in posted] + # The retry re-sent index 1, which the handler dropped as a repeat, so + # the store holds each record once. + assert indexes == [1, 1, 2, 3] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_a_failed_append_goes_out_before_the_next_one( + monkeypatch: pytest.MonkeyPatch, +): + posted: list[bytes] = [] + handler = TemporalStreamsHandler(None, provider="memory") + monkeypatch.setattr( + nexus, + "_post", + _in_process_endpoint( + handler, posted, [], fail_after_applying=[APPEND_OPERATION] + ), + ) + front = _front(None) + producer = await front.producer( + None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 + ) + with pytest.raises(StreamEndpointError): + await producer.append({"n": 1}) + # The caller moves on without retrying; the pending batch is replayed + # first under its own index and the new one takes the next. + await producer.append({"n": 2}) + indexes = [json.loads(body)["batch_index"] for body in posted] + assert indexes == [1, 1, 2] + assert await _stored("wf") == [{"n": 1}, {"n": 2}] + + +@pytest.mark.usefixtures("_memory_store") +async def test_consecutive_reads_share_one_parked_subscription(): + handler = TemporalStreamsHandler(None, provider="memory") + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) + first = await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ) + assert len(first.records) == 1 + parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] + pump = next(iter(parked.values())).pump + # A call that resumes where the last one stopped drains the same + # subscription instead of parking a second read on the store. + second = await _dispatch( + handler, + READ_OPERATION, + ReadInput( + workflow_id="wf", + stream="inputs", + after_token=first.next_token, + max_records=1, + wait_ms=200, + ), + ) + assert len(second.records) == 1 + assert second.next_token != first.next_token + assert len(parked) == 1 and next(iter(parked.values())).pump is pump + # A call from somewhere else replaces it. + await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ) + assert len(parked) == 1 and next(iter(parked.values())).pump is not pump + await handler.close() + assert not parked + + +@pytest.mark.usefixtures("_memory_store") +async def test_the_read_wait_is_cut_to_the_request_deadline(): + handler = TemporalStreamsHandler(None, provider="memory") + started = asyncio.get_running_loop().time() + answer = await handler.read( + _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), + ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ) + assert answer.records == [] and answer.next_token == "" + assert asyncio.get_running_loop().time() - started < 5 + await handler.close() From ff52038e56b8741a7e4cdd39cab44f9d9ed9400f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 521/831] Carried the StreamRecord proto and producer identity on the stream contract. A record crosses the endpoint as the serialized proto every store keeps, an append names its topic, run and sequence, and a read says when the store ended it. --- .../providers/_nexus_generated/models.py | 245 +++++++++++------- .../providers/_nexus_generated/services.py | 17 +- .../providers/temporal_streams.nexusrpc.yaml | 96 ++++--- 3 files changed, 224 insertions(+), 134 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index d00cbcc63..2677843ef 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -22,10 +22,10 @@ _APPEND_OUTPUT_DECLARED: frozenset[str] = frozenset({"cursor"}) -_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token"}) +_READ_OUTPUT_DECLARED: frozenset[str] = frozenset({"records", "next_token", "done"}) -_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "frame"}) +_RECORD_WIRE_DECLARED: frozenset[str] = frozenset({"token", "record"}) class _AppendInputTransferTypeConverter( @@ -54,15 +54,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str = typing.cast("typing.Any", None) - if "stream" not in raw or raw["stream"] is None: - violations.append(Violation(path="stream", reason="required")) + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: + violations.append( + Violation(path="run_id", reason="explicit null not allowed") + ) + else: + if not isinstance(run_id_value_raw, str): + violations.append( + Violation(path="run_id", reason="expected string") + ) + else: + run_id_value = run_id_value_raw + + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) else: - stream_value_raw = raw["stream"] - if not isinstance(stream_value_raw, str): - violations.append(Violation(path="stream", reason="expected string")) + topic_value_raw = raw["topic"] + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - stream_value = stream_value_raw + topic_value = topic_value_raw producer_id_value: str = typing.cast("typing.Any", None) if "producer_id" not in raw or raw["producer_id"] is None: @@ -87,6 +102,24 @@ def from_transfer_type( if attempt_value_parsed is not None: attempt_value = attempt_value_parsed + sequence_value: int = typing.cast("typing.Any", None) + if "sequence" not in raw or raw["sequence"] is None: + violations.append(Violation(path="sequence", reason="required")) + else: + sequence_value_raw = raw["sequence"] + sequence_value_parsed = _parse_spec_integer( + sequence_value_raw, "sequence", violations + ) + if sequence_value_parsed is not None: + sequence_value = sequence_value_parsed + if sequence_value < 0: + violations.append( + Violation( + path="sequence", + reason=f"must be >= 0, got {sequence_value}", + ) + ) + batch_index_value: int = typing.cast("typing.Any", None) if "batch_index" not in raw or raw["batch_index"] is None: violations.append(Violation(path="batch_index", reason="required")) @@ -105,19 +138,6 @@ def from_transfer_type( ) ) - topic_value: str | None = None - if "topic" in raw: - topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) - else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw - payloads_value: list[bytes] | None = None if "payloads" in raw: payloads_value_raw = raw["payloads"] @@ -175,11 +195,12 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" + and key != "topic" and key != "producer_id" and key != "attempt" + and key != "sequence" and key != "batch_index" - and key != "topic" and key != "payloads" and key != "finish" ): @@ -188,11 +209,12 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return AppendInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, + topic=topic_value, producer_id=producer_id_value, attempt=attempt_value, + sequence=sequence_value, batch_index=batch_index_value, - topic=topic_value, payloads=payloads_value, finish=finish_value, ) @@ -202,13 +224,24 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - out["stream"] = value.stream + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic out["producer_id"] = value.producer_id if abs(value.attempt) > 9007199254740991: violations.append( Violation(path="attempt", reason="exceeds ±(2^53-1) integer cap") ) out["attempt"] = value.attempt + if abs(value.sequence) > 9007199254740991: + violations.append( + Violation(path="sequence", reason="exceeds ±(2^53-1) integer cap") + ) + if value.sequence < 0: + violations.append( + Violation(path="sequence", reason=f"must be >= 0, got {value.sequence}") + ) + out["sequence"] = value.sequence if abs(value.batch_index) > 9007199254740991: violations.append( Violation(path="batch_index", reason="exceeds ±(2^53-1) integer cap") @@ -220,8 +253,6 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: ) ) out["batch_index"] = value.batch_index - if value.topic is not None: - out["topic"] = value.topic if value.payloads is not None: out["payloads"] = [_format_base64(element) for element in value.payloads] if value.finish is not None: @@ -239,31 +270,45 @@ class AppendInput: workflow_id: str """The workflow whose stream is being written.""" - stream: str - """The named stream to append to. Empty when the producer writes to a topic instead.""" + run_id: str | None = None + """The run to address. Empty addresses the workflow's execution chain, which is what a + producer normally wants. + """ + + topic: str + """The topic of the workflow's stream to append to.""" producer_id: str - """Identifies the writer across its retries, so its attempts can be ordered.""" + """Identifies the writer across its retries, so its attempts can be ordered. Never + empty here: the caller resolved it, from the activity context when it was not given. + """ attempt: int """The generation this producer is writing. A later attempt supersedes an earlier one.""" - batch_index: int - """Counts this producer's batches from 1. The handler drops an index it has already - written for this producer attempt, and rejects one that skips ahead or that resumes - an attempt it never saw start. + sequence: int + """The producer's sequence of the first record in this batch; the batch is numbered + from it and a finish takes the next number. It has to continue where the previous + batch ended, so the handler and the store agree on every record's position within + the attempt. """ - topic: str | None = None - """The topic to append to, when stream is empty.""" + batch_index: int + """Counts this producer's batches from 1. The handler answers a repeat of the last + index with the original's position, and refuses one that skips ahead, one already + behind the last, or one that resumes an attempt it never saw start. + """ payloads: list[bytes] | None = None - """The records to write, each a serialized Temporal Payload. Empty on a call that only - finishes. + """The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the caller has already + run on them. Empty on a call that only finishes. """ finish: bool | None = None - """Mark this producer done after writing the batch, so a reader stops waiting on it.""" + """Write FINISH for this producer after the batch: it will write nothing more on the + topic. Says nothing about the producer's outcome. + """ class _AppendOutputTransferTypeConverter( @@ -333,9 +378,9 @@ class AppendOutput: """Where the append landed, when the store can say.""" cursor: str | None = None - """Opaque token naming the last record written by this call. Absent when the call - carried no payloads, when the batch was a repeat the handler dropped, or when the - store learns positions only at read time. + """Opaque token naming the last record written by this call, or by the original when + the call repeated the last batch. Absent when the store learns positions only at + read time; such a caller positions itself with a latest_only read. """ additional_properties: dict[str, typing.Any] = dataclasses.field( @@ -369,33 +414,30 @@ def from_transfer_type( else: workflow_id_value = workflow_id_value_raw - stream_value: str | None = None - if "stream" in raw: - stream_value_raw = raw["stream"] - if stream_value_raw is None: + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: violations.append( - Violation(path="stream", reason="explicit null not allowed") + Violation(path="run_id", reason="explicit null not allowed") ) else: - if not isinstance(stream_value_raw, str): + if not isinstance(run_id_value_raw, str): violations.append( - Violation(path="stream", reason="expected string") + Violation(path="run_id", reason="expected string") ) else: - stream_value = stream_value_raw + run_id_value = run_id_value_raw - topic_value: str | None = None - if "topic" in raw: + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) + else: topic_value_raw = raw["topic"] - if topic_value_raw is None: - violations.append( - Violation(path="topic", reason="explicit null not allowed") - ) + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) else: - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw + topic_value = topic_value_raw after_token_value: str | None = None if "after_token" in raw: @@ -486,7 +528,7 @@ def from_transfer_type( for key in raw: if ( key != "workflow_id" - and key != "stream" + and key != "run_id" and key != "topic" and key != "after_token" and key != "max_records" @@ -498,7 +540,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return ReadInput( workflow_id=workflow_id_value, - stream=stream_value, + run_id=run_id_value, topic=topic_value, after_token=after_token_value, max_records=max_records_value, @@ -511,10 +553,9 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["workflow_id"] = value.workflow_id - if value.stream is not None: - out["stream"] = value.stream - if value.topic is not None: - out["topic"] = value.topic + if value.run_id is not None: + out["run_id"] = value.run_id + out["topic"] = value.topic if value.after_token is not None: out["after_token"] = value.after_token if value.max_records is not None: @@ -572,19 +613,19 @@ class ReadInput: workflow_id: str """The workflow whose stream is being read.""" - stream: str | None = None - """The named stream to read. Empty reads every stream the workflow publishes.""" - - topic: str | None = None - """Yield only records on this topic. Empty yields every topic. Only meaningful when - stream is empty, because an inbound stream has no topics. + run_id: str | None = None + """Pin the read to this run. Empty follows the workflow's execution chain across + continue-as-new. """ + topic: str + """The topic of the workflow's stream to read.""" + after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a - caller cannot tell which one that is. + caller cannot tell which one that is, and a token from another store is refused. """ max_records: int | None = None @@ -663,6 +704,19 @@ def from_transfer_type( else: next_token_value = next_token_value_raw + done_value: bool | None = None + if "done" in raw: + done_value_raw = raw["done"] + if done_value_raw is None: + violations.append( + Violation(path="done", reason="explicit null not allowed") + ) + else: + if not isinstance(done_value_raw, bool): + violations.append(Violation(path="done", reason="expected boolean")) + else: + done_value = done_value_raw + additional_properties: dict[str, typing.Any] = {} for key in raw: if key not in _READ_OUTPUT_DECLARED: @@ -672,6 +726,7 @@ def from_transfer_type( return ReadOutput( records=records_value, next_token=next_token_value, + done=done_value, additional_properties=additional_properties, ) @@ -693,6 +748,8 @@ def to_transfer_type(self, value: "ReadOutput") -> typing.Any: out["records"] = records_out if value.next_token is not None: out["next_token"] = value.next_token + if value.done is not None: + out["done"] = value.done for key, entry in value.additional_properties.items(): if key in _READ_OUTPUT_DECLARED: violations.append( @@ -721,6 +778,12 @@ class ReadOutput: token when the call collected nothing. """ + done: bool | None = None + """The store ended the read: the owning execution, or its chain, is closed and every + retained record after the caller's token has been delivered. Nothing more will + arrive, so the caller stops. + """ + additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict ) @@ -750,17 +813,19 @@ def from_transfer_type( else: token_value = token_value_raw - frame_value: bytes = typing.cast("typing.Any", None) - if "frame" not in raw or raw["frame"] is None: - violations.append(Violation(path="frame", reason="required")) + record_value: bytes = typing.cast("typing.Any", None) + if "record" not in raw or raw["record"] is None: + violations.append(Violation(path="record", reason="required")) else: - frame_value_raw = raw["frame"] - if not isinstance(frame_value_raw, str): - violations.append(Violation(path="frame", reason="expected string")) + record_value_raw = raw["record"] + if not isinstance(record_value_raw, str): + violations.append(Violation(path="record", reason="expected string")) else: - frame_value_parsed = _parse_base64(frame_value_raw, "frame", violations) - if frame_value_parsed is not None: - frame_value = frame_value_parsed + record_value_parsed = _parse_base64( + record_value_raw, "record", violations + ) + if record_value_parsed is not None: + record_value = record_value_parsed additional_properties: dict[str, typing.Any] = {} for key in raw: @@ -770,7 +835,7 @@ def from_transfer_type( raise temporalio.converter.create_payload_validation_error(violations) return RecordWire( token=token_value, - frame=frame_value, + record=record_value, additional_properties=additional_properties, ) @@ -779,7 +844,7 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} out["token"] = value.token - out["frame"] = _format_base64(value.frame) + out["record"] = _format_base64(value.record) for key, entry in value.additional_properties.items(): if key in _RECORD_WIRE_DECLARED: violations.append( @@ -798,13 +863,15 @@ def to_transfer_type(self, value: "RecordWire") -> typing.Any: @_transfer_type_convertible(_RecordWireTransferTypeConverter) @dataclasses.dataclass(slots=True, kw_only=True) class RecordWire: - """One record on the wire: its cursor and its frame.""" + """One record on the wire: its cursor and the record itself.""" token: str """Opaque cursor naming this record. Pass it as after_token to resume just past it.""" - frame: bytes - """The record frame, carrying the topic, kind, producer, attempt, sequence and body.""" + record: bytes + """The serialized temporal.api.stream.v1.StreamRecord: topic, kind, producer_id, + attempt, sequence and body, as the store holds it. + """ additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict diff --git a/temporalio/streams/providers/_nexus_generated/services.py b/temporalio/streams/providers/_nexus_generated/services.py index e0673aeab..591e31046 100644 --- a/temporalio/streams/providers/_nexus_generated/services.py +++ b/temporalio/streams/providers/_nexus_generated/services.py @@ -17,18 +17,20 @@ class TemporalStreams: """The stream endpoint's two operations. One Temporal-authenticated endpoint hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation - per record costs too much for token streams. + per record costs too much for token streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so a caller + in any language decodes it with the api protos alone. """ append: Operation[ AppendInput, AppendOutput, ] = Operation(name="append") - """Append one batch on the caller's account. The handler drops a batch_index it has - already written for this producer attempt, so a retried call writes once, and - rejects an index that skips ahead or a producer attempt it has no state for. - Supersession records are not transported: a reader re-synthesizes them from the - attempts it observes. + """Append one batch on the caller's account. The handler writes a batch once: a repeat + of the last batch_index answers with where the original landed, and an index that + skips ahead, one already behind the last, a sequence that does not continue, or a + producer attempt the handler has no state for is refused. Supersession records are + not transported: a reader re-synthesizes them from the attempts it observes. """ read: Operation[ @@ -37,5 +39,6 @@ class TemporalStreams: ] = Operation(name="read") """Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, whichever comes first, and returns - whatever it collected. + whatever it collected. It says when the store has ended the read, so the caller can + stop. """ diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index a1cc34631..bf97209b3 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -11,15 +11,18 @@ services: hides the store behind it, so an operator switches storage without touching callers. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token - streams. + streams. A record crosses as the serialized + temporal.api.stream.v1.StreamRecord, the same bytes every store keeps, so + a caller in any language decodes it with the api protos alone. operations: append: fqn: append description: >- - Append one batch on the caller's account. The handler drops a - batch_index it has already written for this producer attempt, so a - retried call writes once, and rejects an index that skips ahead or a - producer attempt it has no state for. Supersession records are not + Append one batch on the caller's account. The handler writes a batch + once: a repeat of the last batch_index answers with where the + original landed, and an index that skips ahead, one already behind + the last, a sequence that does not continue, or a producer attempt + the handler has no state for is refused. Supersession records are not transported: a reader re-synthesizes them from the attempts it observes. input: { $ref: "#/$defs/AppendInput" } @@ -29,7 +32,8 @@ services: description: >- Answer with the records after the caller's token, or time out. The call parks until it has max_records records or wait_ms elapses, - whichever comes first, and returns whatever it collected. + whichever comes first, and returns whatever it collected. It says + when the store has ended the read, so the caller can stop. input: { $ref: "#/$defs/ReadInput" } output: { $ref: "#/$defs/ReadOutput" } @@ -41,49 +45,61 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being written." - stream: + run_id: type: string description: >- - The named stream to append to. Empty when the producer writes to a - topic instead. + The run to address. Empty addresses the workflow's execution chain, + which is what a producer normally wants. + topic: + type: string + description: "The topic of the workflow's stream to append to." producer_id: type: string description: >- Identifies the writer across its retries, so its attempts can be - ordered. + ordered. Never empty here: the caller resolved it, from the activity + context when it was not given. attempt: type: integer description: >- The generation this producer is writing. A later attempt supersedes an earlier one. + sequence: + type: integer + minimum: 0 + description: >- + The producer's sequence of the first record in this batch; the batch + is numbered from it and a finish takes the next number. It has to + continue where the previous batch ended, so the handler and the + store agree on every record's position within the attempt. batch_index: type: integer minimum: 1 description: >- - Counts this producer's batches from 1. The handler drops an index it - has already written for this producer attempt, and rejects one that - skips ahead or that resumes an attempt it never saw start. - topic: - type: string - description: "The topic to append to, when stream is empty." + Counts this producer's batches from 1. The handler answers a repeat + of the last index with the original's position, and refuses one that + skips ahead, one already behind the last, or one that resumes an + attempt it never saw start. payloads: type: array items: type: string contentEncoding: base64 description: >- - The records to write, each a serialized Temporal Payload. Empty on a - call that only finishes. + The record bodies to write, in order, each a serialized + temporal.api.common.v1.Payload. A payload codec configured on the + caller has already run on them. Empty on a call that only finishes. finish: type: boolean description: >- - Mark this producer done after writing the batch, so a reader stops - waiting on it. + Write FINISH for this producer after the batch: it will write nothing + more on the topic. Says nothing about the producer's outcome. required: - workflow_id - - stream + - topic - producer_id - attempt + - sequence - batch_index additionalProperties: false @@ -94,10 +110,10 @@ $defs: cursor: type: string description: >- - Opaque token naming the last record written by this call. Absent - when the call carried no payloads, when the batch was a repeat the - handler dropped, or when the store learns positions only at read - time. + Opaque token naming the last record written by this call, or by the + original when the call repeated the last batch. Absent when the + store learns positions only at read time; such a caller positions + itself with a latest_only read. additionalProperties: true ReadInput: @@ -107,17 +123,14 @@ $defs: workflow_id: type: string description: "The workflow whose stream is being read." - stream: + run_id: type: string description: >- - The named stream to read. Empty reads every stream the workflow - publishes. + Pin the read to this run. Empty follows the workflow's execution + chain across continue-as-new. topic: type: string - description: >- - Yield only records on this topic. Empty yields every topic. Only - meaningful when stream is empty, because an inbound stream has no - topics. + description: "The topic of the workflow's stream to read." after_token: type: string description: >- @@ -125,7 +138,7 @@ $defs: strictly after the record it names, so a caller never sees that record twice. Empty starts at the beginning. The token is produced by whichever store sits behind the endpoint, so a caller cannot tell - which one that is. + which one that is, and a token from another store is refused. max_records: type: integer minimum: 1 @@ -146,26 +159,27 @@ $defs: wants to follow from now. required: - workflow_id + - topic additionalProperties: false RecordWire: type: object - description: "One record on the wire: its cursor and its frame." + description: "One record on the wire: its cursor and the record itself." properties: token: type: string description: >- Opaque cursor naming this record. Pass it as after_token to resume just past it. - frame: + record: type: string contentEncoding: base64 description: >- - The record frame, carrying the topic, kind, producer, attempt, - sequence and body. + The serialized temporal.api.stream.v1.StreamRecord: topic, kind, + producer_id, attempt, sequence and body, as the store holds it. required: - token - - frame + - record additionalProperties: true ReadOutput: @@ -182,4 +196,10 @@ $defs: description: >- Opaque cursor to pass as after_token on the following call. Echoes the caller's own token when the call collected nothing. + done: + type: boolean + description: >- + The store ended the read: the owning execution, or its chain, is + closed and every retained record after the caller's token has been + delivered. Nothing more will arrive, so the caller stops. additionalProperties: true From 46ae99be4596532e159e29b5ced0ebf652154963 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 522/831] Rewrote the Nexus front on the plugin surface. NexusStreams is the outside half only and the handler fronts a storage provider's own handles. Endpoint failures reach the caller as the stream condition the store raised or as an RPCError, never as an HTTP error. --- temporalio/streams/providers/nexus.py | 813 +++++++++++++++----------- 1 file changed, 468 insertions(+), 345 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 8c311d1d9..07da0318b 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -1,47 +1,58 @@ """The Nexus front: the outside surface behind one Temporal-authenticated endpoint. -Two halves in one module. The provider half implements only :func:`producer` -and :func:`consumer`; the workflow side raises, naming a storage provider, -because a workflow's publishes and reads ride the Workflow Task and cannot -cross an RPC. The handler half runs in a worker configured with any storage -provider and serves two sync operations, ``append`` and ``read``, so the -store behind the endpoint is invisible to callers and an operator switches -it without touching them. +Two halves in one module. :class:`NexusStreams` is a provider that implements +the outside half only: it hands out handles that append and read through the +endpoint, and it has no workflow half, because a workflow's publishes and +reads ride the Workflow Task and cannot cross an RPC. +:class:`TemporalStreamsHandler` runs in a worker next to any storage provider +and serves two sync operations, ``append`` and ``read``, by fronting that +provider's own handles, so the store behind the endpoint is invisible to +callers and an operator switches it without touching them. The wire types and the service definition come from ``temporal_streams.nexusrpc.yaml``, so any language nexgen targets can be -handed the same contract. What stays hand-written here is what the -generator cannot express yet: the handler's dedupe and long-poll collect -loop, and the caller's batching, cursor handling and codec. +handed the same contract. A record crosses as the serialized +``temporal.api.stream.v1.StreamRecord``, the same bytes every store keeps, so +a caller in another language decodes it with the api protos alone. What stays +hand-written here is what the generator cannot express yet: the handler's +dedupe and long-poll collect loop, and the caller's batching, cursor handling +and codec. Reads hand out batches and an append carries one batch per call, because a Nexus operation per record costs too much for token streams. Record bodies -cross the handler untouched: it reads the store as raw payloads and frames +cross the handler untouched: it reads the store as raw payloads and forwards them as they are, so a codec that changes the payload encoding survives the hop and the handler's worker never needs the key. Supersession records are -not transported: the caller's reader re-synthesizes them from the attempts -it observes, which is the policy module's job on every provider. Cursors -pass through opaque, so the caller cannot tell which store produced them. - -The handler keeps one parked read per ``(workflow, stream, topic)`` and -serves consecutive calls from it, so an idle caller does not leave one -abandoned long poll on the store per call. A call whose token does not -match the parked position replaces the subscription, and an idle one is -released after a minute; that is the residual cost. - -Two stated prototype limits. Append deduplication lives in handler memory, -by batch index per producer attempt, so a handler that has no state for a -producer attempt refuses to continue it rather than starting a fresh -delegate whose numbering the store would drop as a repeat; the caller opens -a new attempt, which readers report as a supersession. The store-level fix, -a sequence-explicit append in the contract, is listed in the design doc's -work table. And any caller the endpoint admits may touch any workflow's -streams in the namespace; the endpoint's own authorization is the boundary. +not transported: the caller's reader re-synthesizes them from the attempts it +observes, which is the policy module's job on every provider. Cursors pass +through opaque, so the caller cannot tell which store produced them; a +foreign one is refused by the store behind the endpoint and reaches the +caller on the first read. + +The handler keeps one parked read per ``(workflow, run, topic)`` and serves +consecutive calls from it, so an idle caller does not leave one abandoned +long poll on the store per call. A call whose token does not match the parked +position replaces the subscription, and an idle one is released after a +minute; that is the residual cost. + +Two stated prototype limits. Append deduplication lives in handler memory, by +batch index per producer attempt, so a handler that has no state for a +producer attempt refuses to continue it rather than starting a fresh delegate +whose numbering the store would drop as a repeat; the caller opens a new +attempt, which readers report as a supersession. And any caller the endpoint +admits may touch any workflow's streams in the namespace; the endpoint's own +authorization is the boundary. + +A failure from the endpoint reaches the caller as the +:class:`temporalio.streams.StreamError` the store raised, when the handler +named one, and as :class:`temporalio.service.RPCError` otherwise, never as an +HTTP or urllib exception. """ from __future__ import annotations import asyncio +import json import logging import time import urllib.error @@ -50,7 +61,7 @@ from collections.abc import AsyncGenerator, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, TypeVar +from typing import Any, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler @@ -59,11 +70,24 @@ import temporalio.converter from temporalio.api.common.v1 import Payload from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest +from temporalio.client import Client from temporalio.common import RawValue -from temporalio.streams import _frame, _provider -from temporalio.streams._handles import ReadSource, WriteSink -from temporalio.streams._policy import AttemptTracker +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import StreamHandle, StreamProducer, StreamProvider from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + producer_identity, + to_wire, +) from temporalio.streams.providers._nexus_generated import ( AppendInput, AppendOutput, @@ -73,9 +97,16 @@ TemporalStreams, ) +__all__ = [ + "NexusProducer", + "NexusStreamHandle", + "NexusStreams", + "TemporalStreamsHandler", +] + _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " - "through a storage provider, so configure one of those on the worker" + "through a storage provider, so give the worker one of those" ) # The contract leaves these unset, so the handler is the one place that says @@ -83,12 +114,13 @@ # shortens it to the request deadline anyway, and a shorter default only # means more round trips on an idle stream. _DEFAULT_MAX_RECORDS = 100 -_DEFAULT_WAIT_MS = 30_000 +_DEFAULT_READ_WAIT = timedelta(seconds=30) _DEADLINE_MARGIN = timedelta(milliseconds=500) _DEFAULT_MAX_PRODUCERS = 10_000 _DEFAULT_SUBSCRIPTION_IDLE = timedelta(seconds=60) _QUEUE_DEPTH = 1000 -_APPEND_TIMEOUT_MS = 30_000 +_APPEND_TIMEOUT = timedelta(seconds=30) +_ROUND_TRIP_MARGIN = timedelta(seconds=5) _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover @@ -104,16 +136,58 @@ _APPEND_OPERATION = _OPERATION_NAMES["append"] _READ_OPERATION = _OPERATION_NAMES["read"] +# The stream conditions that cross the endpoint under their own name, so the +# caller raises the class the store raised. +_STREAM_ERRORS: dict[str, type[StreamError]] = { + cls.__name__: cls + for cls in ( + StreamError, + StreamNotFoundError, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, + ) +} +_HTTP_TO_RPC = { + 400: RPCStatusCode.INVALID_ARGUMENT, + 401: RPCStatusCode.UNAUTHENTICATED, + 403: RPCStatusCode.PERMISSION_DENIED, + 404: RPCStatusCode.NOT_FOUND, + 408: RPCStatusCode.DEADLINE_EXCEEDED, + 409: RPCStatusCode.ALREADY_EXISTS, + 412: RPCStatusCode.FAILED_PRECONDITION, + 429: RPCStatusCode.RESOURCE_EXHAUSTED, + 500: RPCStatusCode.INTERNAL, + 501: RPCStatusCode.UNIMPLEMENTED, + 503: RPCStatusCode.UNAVAILABLE, + 504: RPCStatusCode.DEADLINE_EXCEEDED, +} + _OutputT = TypeVar("_OutputT") logger = logging.getLogger(__name__) +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _handler_error(error: StreamError) -> nexusrpc.HandlerError: + """Carry a stream condition across the endpoint under its own class name.""" + kind = ( + nexusrpc.HandlerErrorType.NOT_FOUND + if isinstance(error, StreamNotFoundError) + else nexusrpc.HandlerErrorType.BAD_REQUEST + ) + return nexusrpc.HandlerError( + f"{type(error).__name__}: {error}", type=kind, retryable_override=False + ) + + def _bad_request(message: str) -> nexusrpc.HandlerError: return nexusrpc.HandlerError( - message, - type=nexusrpc.HandlerErrorType.BAD_REQUEST, - retryable_override=False, + message, type=nexusrpc.HandlerErrorType.BAD_REQUEST, retryable_override=False ) @@ -131,29 +205,30 @@ class _Subscription: @dataclass class _ProducerState: - delegate: Any + delegate: StreamProducer batch_index: int + sequence: int + last_cursor: str | None @nexusrpc.handler.service_handler(service=TemporalStreams) class TemporalStreamsHandler: - """Serves the stream endpoint, delegating to one storage provider. + """Serves the stream endpoint by fronting one storage provider's handles. - The delegate is an explicit instance rather than the process default, so - a caller and a handler can coexist in one process, and so an operator can + The provider is an explicit instance the application constructed, so a + caller and a handler can coexist in one process, and so an operator can run handlers for a new store next to handlers for the old one. """ def __init__( self, - client: Any, - provider: str, + provider: StreamProvider, + client: Client | None, *, max_producers: int = _DEFAULT_MAX_PRODUCERS, subscription_idle: timedelta = _DEFAULT_SUBSCRIPTION_IDLE, - **provider_options: Any, ) -> None: - """Serve the endpoint out of the provider named by ``provider``. + """Serve the endpoint out of ``provider``'s handles, opened with ``client``. ``max_producers`` bounds the dedupe state kept per producer attempt; the oldest is evicted, and a producer evicted mid-life gets a clear @@ -161,9 +236,9 @@ def __init__( ``subscription_idle`` is how long a parked read outlives its last caller. """ + self._provider = provider self._client = client - self._delegate = _provider.instance(provider, **provider_options) - self._producers: OrderedDict[tuple[str, str, str, int], _ProducerState] = ( + self._producers: OrderedDict[tuple[str, str, str, str, int], _ProducerState] = ( OrderedDict() ) self._max_producers = max_producers @@ -171,60 +246,82 @@ def __init__( self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} self._subscription_idle = subscription_idle.total_seconds() + def _stream(self, workflow_id: str, run_id: str | None) -> StreamHandle: + # A storage provider wants a client; the memory provider, which the + # tests front, accepts none, so the cast only lies where it is unread. + return self._provider.get_stream_handle( + cast(Client, self._client), workflow_id, run_id=run_id or None + ) + @nexusrpc.handler.sync_operation async def append( self, _ctx: nexusrpc.handler.StartOperationContext, input: AppendInput ) -> AppendOutput: - """Append on the caller's account, dropping a repeated batch. + """Append on the caller's account, writing a repeated batch once. Raises: - nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index skips - ahead, when it continues a producer attempt this handler has - no state for, or when a payload is not a serialized - ``Payload``. + nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index or + sequence does not continue the producer attempt, when the + attempt is one this handler has no state for, or when a + payload is not a serialized ``Payload``; ``NOT_FOUND`` when + the store has no such workflow. """ - topic = input.topic or "" + try: + return await self._append(input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _append(self, input: AppendInput) -> AppendOutput: + _require_topic(input.topic) key = ( input.workflow_id, - input.stream or f"@{topic}", + input.run_id or "", + input.topic, input.producer_id, input.attempt, ) state = self._producers.get(key) if state is None: - if input.batch_index != 1: + if input.batch_index != 1 or input.sequence != 0: # A fresh delegate would restart its numbering at zero, and # the store would drop that as a repeat of the first batch. # Refusing here turns a silent loss into a failure the caller # can act on by opening a new attempt. - raise _bad_request( + raise StreamProducerError( f"producer {input.producer_id!r} attempt {input.attempt} resumed " f"at batch {input.batch_index} on a handler that has no state for " "it; open a new attempt" ) - delegate = await self._delegate.producer( - self._client, - workflow_id=input.workflow_id, - stream=input.stream, - topic=topic, - producer_id=input.producer_id, - attempt=input.attempt, + delegate = self._stream(input.workflow_id, input.run_id).producer( + topic=input.topic, producer_id=input.producer_id, attempt=input.attempt ) - state = _ProducerState(delegate, 0) - elif input.batch_index <= state.batch_index: - # A repeat, or a producer that restarted its numbering: either - # way the store already holds the batch. + state = _ProducerState(delegate, 0, 0, None) + elif input.batch_index == state.batch_index: + # The last batch again: the store already holds it, and where it + # landed is the answer the original got. self._producers.move_to_end(key) - return AppendOutput() + return AppendOutput(cursor=state.last_cursor) + elif input.batch_index < state.batch_index: + raise StreamProducerError( + f"batch {input.batch_index} was written and is no longer the last " + f"for producer {input.producer_id!r} attempt {input.attempt}" + ) elif input.batch_index != state.batch_index + 1: - raise _bad_request( + raise StreamProducerError( f"batch {input.batch_index} skips ahead of {state.batch_index} for " f"producer {input.producer_id!r} attempt {input.attempt}" ) + if input.sequence != state.sequence: + raise StreamProducerError( + f"sequence {input.sequence} does not continue at {state.sequence} for " + f"producer {input.producer_id!r} attempt {input.attempt}" + ) payloads = self._payloads(input.payloads) cursor: str | None = None if payloads: - appended = await state.delegate.append(*payloads) + appended = await state.delegate.append(*(RawValue(p) for p in payloads)) cursor = appended.token if appended is not None else None if input.finish: await state.delegate.finish() @@ -233,6 +330,8 @@ async def append( # Recorded only once the store accepted the batch, so a failed append # is not mistaken for a repeat when the caller retries it. state.batch_index = input.batch_index + state.sequence += len(payloads) + state.last_cursor = cursor self._producers[key] = state self._producers.move_to_end(key) while len(self._producers) > self._max_producers: @@ -243,32 +342,46 @@ async def append( def _payloads(encoded: list[bytes] | None) -> list[Payload]: payloads = [] for index, raw in enumerate(encoded or []): - payload = Payload() try: - payload.ParseFromString(raw) + payloads.append(Payload.FromString(raw)) except DecodeError as error: raise _bad_request( f"payloads[{index}] is not a serialized Temporal Payload: {error}" ) from error - payloads.append(payload) return payloads @nexusrpc.handler.sync_operation async def read( self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: - """Answer with the records after the caller's token, or time out.""" - stream = input.stream or "" - topic = input.topic or None + """Answer with the records after the caller's token, or time out. + + Raises: + nexusrpc.HandlerError: ``BAD_REQUEST`` when the store refuses the + token, ``NOT_FOUND`` when it has no such workflow. + """ + try: + return await self._read(ctx, input) + except StreamError as error: + raise _handler_error(error) from error + except ValueError as error: + raise _bad_request(str(error)) from error + + async def _read( + self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput + ) -> ReadOutput: + _require_topic(input.topic) + stream = self._stream(input.workflow_id, input.run_id) if input.latest_only: - delegate = await self._delegate.consumer( - self._client, workflow_id=input.workflow_id, stream=stream - ) - return ReadOutput(next_token=(await delegate.latest(topic=topic)).token) + return ReadOutput(next_token=(await stream.latest(topic=input.topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) - wait = (_DEFAULT_WAIT_MS if input.wait_ms is None else input.wait_ms) / 1000 + wait = ( + _DEFAULT_READ_WAIT.total_seconds() + if input.wait_ms is None + else input.wait_ms / 1000 + ) if ctx.request_deadline is not None: # The server answers the caller with a timeout at the deadline # whatever this call does, so collecting past it only holds the @@ -279,7 +392,7 @@ async def read( left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN wait = max(0.0, min(wait, left.total_seconds())) after = input.after_token or "" - key = (input.workflow_id, stream, topic or "") + key = (input.workflow_id, input.run_id or "", input.topic) await self._expire_subscriptions() lock = self._read_locks.setdefault(key, asyncio.Lock()) async with lock: @@ -287,34 +400,31 @@ async def read( if subscription is None or subscription.position != after: if subscription is not None: await self._drop(key) - subscription = await self._subscribe( - key, input.workflow_id, stream, topic, after - ) + subscription = self._subscribe(key, stream, input.topic, after) records, next_token = await self._drain(subscription, max_records, wait) subscription.position = next_token subscription.last_used = time.monotonic() - if subscription.done and subscription.records.empty(): - # The store ended the read, as the Workflow Streams delegate - # does when the run closes. Nothing more will arrive on it. + done = ( + subscription.done + and subscription.records.empty() + and subscription.failure is None + ) + if done: + # The store ended the read: the run or chain is closed and the + # tail has been handed over. Nothing more will arrive on it. await self._drop(key) - return ReadOutput(records=records, next_token=next_token) + return ReadOutput(records=records, next_token=next_token, done=done) - async def _subscribe( - self, - key: tuple[str, str, str], - workflow_id: str, - stream: str, - topic: str | None, - after: str, + def _subscribe( + self, key: tuple[str, str, str], stream: StreamHandle, topic: str, after: str ) -> _Subscription: - delegate = await self._delegate.consumer( - self._client, workflow_id=workflow_id, stream=stream - ) - # Raw payloads: the handler frames what the store holds without + # Raw payloads: the handler forwards what the store holds without # decoding it, so an encoding only the caller's codec understands - # passes through untouched. - source = delegate.read( - after=Cursor(after) if after else BEGINNING, topic=topic, type=RawValue + # passes through untouched. A foreign token is refused right here. + source = stream.read( + topic=topic, + after=Cursor(after) if after else BEGINNING, + result_type=RawValue, ) subscription = _Subscription( records=asyncio.Queue(maxsize=_QUEUE_DEPTH), @@ -334,8 +444,7 @@ async def pump() -> None: subscription.failure = error finally: subscription.done = True - if isinstance(source, AsyncGenerator): - await source.aclose() + await source.aclose() subscription.pump = asyncio.create_task(pump()) self._subscriptions[key] = subscription @@ -354,8 +463,10 @@ async def _drain( if records or remaining <= 0: break if subscription.done: + if subscription.failure is None: + break # Honour the wait even though nothing can arrive, so a - # caller polling a closed stream does not spin on the + # caller polling a failed stream does not spin on the # endpoint. await asyncio.sleep(remaining) break @@ -374,20 +485,19 @@ async def _drain( @staticmethod def _wire(record: StreamRecord[Any]) -> RecordWire: - body = ( - record.value.payload.SerializeToString() - if isinstance(record.value, RawValue) - else b"" - ) - frame = _frame.encode( + # The record read as RawValue carries the stored body untouched; the + # default converter passes a RawValue through, so no encoding happens + # here. + wire = to_wire( + temporalio.converter.DataConverter.default.payload_converter, topic=record.topic, kind=record.kind, - producer=record.producer, + value=record.value, + producer_id=record.producer_id, attempt=record.attempt, sequence=record.sequence, - body=body, ) - return RecordWire(token=record.cursor.token, frame=frame) + return RecordWire(token=record.cursor.token, record=wire.SerializeToString()) async def close(self) -> None: """Release every parked read. @@ -419,20 +529,44 @@ async def _expire_subscriptions(self) -> None: self._read_locks.pop(key, None) -class StreamEndpointError(RuntimeError): - """The stream endpoint refused a call or could not be reached. +class _EndpointFailure(Exception): + """What the transport saw: the endpoint's answer, or the reason it gave none.""" - ``status`` is the HTTP status when the endpoint answered, and ``None`` - when the connection itself failed. - """ - - def __init__(self, message: str, *, status: int | None = None) -> None: - """Carry the endpoint's answer, or the reason it gave none.""" - super().__init__(message) + def __init__(self, detail: str, status: int | None) -> None: + super().__init__(detail) + self.detail = detail self.status = status -def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> bytes: +def _translate(failure: _EndpointFailure) -> Exception: + """The exception a caller raises for an endpoint failure. + + The handler names a stream condition by its class in the failure message, + so the same class is raised here; anything else is an ``RPCError`` with + the status the HTTP answer maps to, or ``UNAVAILABLE`` when there was none. + """ + message = failure.detail + try: + parsed = json.loads(message) + if isinstance(parsed, dict) and isinstance(parsed.get("message"), str): + message = parsed["message"] + except ValueError: + pass + if failure.status is not None: + for name, cls in _STREAM_ERRORS.items(): + prefix = f"{name}: " + if message.startswith(prefix): + return cls(message[len(prefix) :]) + status = _HTTP_TO_RPC.get(failure.status, RPCStatusCode.UNKNOWN) + else: + status = RPCStatusCode.UNAVAILABLE + return RPCError(message, status, b"") + + +def _post( + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta +) -> bytes: + timeout_ms = int(timeout.total_seconds() * 1000) request = urllib.request.Request( url, data=body, @@ -446,57 +580,74 @@ def _post(url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int) -> method="POST", ) try: - with urllib.request.urlopen(request, timeout=timeout_ms / 1000 + 5) as response: + with urllib.request.urlopen( + request, timeout=(timeout + _ROUND_TRIP_MARGIN).total_seconds() + ) as response: return response.read() except urllib.error.HTTPError as error: - detail = error.read().decode(errors="replace") - raise StreamEndpointError( - f"stream endpoint call failed ({error.code}): {detail}", status=error.code + raise _EndpointFailure( + error.read().decode(errors="replace"), error.code ) from error except urllib.error.URLError as error: - raise StreamEndpointError( - f"stream endpoint unreachable at {url}: {error.reason}" + raise _EndpointFailure( + f"stream endpoint unreachable at {url}: {error.reason}", None ) from error class _Front: - """Everything the caller half needs to reach one endpoint.""" + """Everything a handle needs to reach one endpoint.""" - def __init__( - self, - base_url: str, - data_converter: temporalio.converter.DataConverter, - headers: Mapping[str, str], - wait_ms: int, - max_records: int, - ) -> None: - self.base_url = base_url + def __init__(self, streams: NexusStreams, client: Client | None) -> None: + self._streams = streams + self._client = client + data_converter = streams._data_converter + if data_converter is None: + data_converter = ( + client.data_converter + if client is not None + else temporalio.converter.DataConverter.default + ) self.converter = data_converter.payload_converter self.codec = data_converter.payload_codec - self.headers = dict(headers) - self.wait_ms = wait_ms - self.max_records = max_records + self.read_wait = streams._read_wait + self.max_records = streams._max_records + + async def _base_url(self) -> str: + endpoint_id = await self._streams._endpoint_id(self._client) + return ( + f"{self._streams._http_address}/nexus/endpoints/{endpoint_id}" + f"/services/{_SERVICE_NAME}" + ) async def invoke( - self, operation: str, request: Any, output: type[_OutputT], *, timeout_ms: int + self, + operation: str, + request: Any, + output: type[_OutputT], + *, + timeout: timedelta, ) -> _OutputT: # The contract types carry their own JSON encoding, so the raw caller # and the worker serving the operation agree on the body without # either of them spelling the fields out. contract = temporalio.converter.DataConverter.default.payload_converter - raw = await asyncio.to_thread( - _post, - f"{self.base_url}/{operation}", - contract.to_payloads([request])[0].data, - self.headers, - timeout_ms, - ) + url = f"{await self._base_url()}/{operation}" + try: + raw = await asyncio.to_thread( + _post, + url, + contract.to_payloads([request])[0].data, + self._streams._headers, + timeout, + ) + except _EndpointFailure as failure: + raise _translate(failure) from failure payload = Payload(metadata={"encoding": b"json/plain"}, data=raw or b"{}") return contract.from_payloads([payload], [output])[0] class NexusProducer: - """Appends through the stream endpoint; framing happens behind it. + """Appends through the stream endpoint; the store behind it does the rest. Calls are serialized and the batch index is committed only once the endpoint answered. A batch whose call raised stays pending and is sent @@ -509,42 +660,50 @@ def __init__( self, front: _Front, workflow_id: str, - stream: str, + run_id: str | None, topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to one stream or topic on the endpoint.""" + """Bind this producer to ``topic`` on the workflow behind the endpoint.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id self._topic = topic self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 + self._sequence = 0 + self._last: Cursor | None = BEGINNING self._pending: tuple[AppendInput, tuple[bytes, ...], bool] | None = None self._lock = asyncio.Lock() + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + @property def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt async def append(self, *values: Any) -> Cursor | None: - """Append ``values`` through the endpoint.""" + """Append ``values`` through the endpoint and return where the last one landed. + + A repeat answers with the original's position and an empty call with + the last one; ``None`` when the store behind the endpoint learns + positions only at read time. + """ if not values: - return None - payloads = [ - value - if isinstance(value, Payload) - else self._front.converter.to_payloads([value])[0] - for value in values - ] + return self._last + payloads = self._front.converter.to_payloads(list(values)) answer = await self._call(payloads, finish=False) - return Cursor(answer.cursor) if answer.cursor else None + self._last = Cursor(answer.cursor) if answer.cursor else None + return self._last async def finish(self) -> None: - """Mark this producer done, so a reader stops waiting on it.""" + """Write ``FINISH`` for this producer on this topic.""" await self._call([], finish=True) async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: @@ -566,238 +725,202 @@ async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: await self._send(*self._pending) elif self._pending is not None: return await self._send(*self._pending) - request = self._request(self._batch_index + 1, encoded, finish) + request = AppendInput( + workflow_id=self._workflow_id, + run_id=self._run_id, + topic=self._topic, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + batch_index=self._batch_index + 1, + payloads=encoded, + finish=finish, + ) return await self._send(request, identity, finish) - def _request( - self, batch_index: int, payloads: list[bytes], finish: bool - ) -> AppendInput: - return AppendInput( - workflow_id=self._workflow_id, - stream=self._stream, - producer_id=self._producer_id, - attempt=self._attempt, - batch_index=batch_index, - topic=self._topic, - payloads=payloads, - finish=finish, - ) - async def _send( self, request: AppendInput, identity: tuple[bytes, ...], finish: bool ) -> AppendOutput: self._pending = (request, identity, finish) answer = await self._front.invoke( - _APPEND_OPERATION, request, AppendOutput, timeout_ms=_APPEND_TIMEOUT_MS + _APPEND_OPERATION, request, AppendOutput, timeout=_APPEND_TIMEOUT ) self._batch_index = request.batch_index + self._sequence = request.sequence + len(request.payloads or []) + int(finish) self._pending = None return answer -class NexusConsumer: - """Reads batches from the stream endpoint, re-synthesizing supersession.""" +class NexusStreamHandle: + """One workflow's stream through the endpoint, re-synthesizing supersession.""" - def __init__(self, front: _Front, workflow_id: str, stream: str) -> None: - """Read what ``workflow_id`` publishes, through the endpoint.""" + def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s stream, pinned to ``run_id`` when one is given.""" self._front = front self._workflow_id = workflow_id - self._stream = stream + self._run_id = run_id - async def read( + def read( self, *, + topic: str, after: Cursor = BEGINNING, - topic: str | None = None, - type: type | None = None, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after``, one endpoint batch at a time. + + The token is opaque here, so a cursor from another store is refused by + the store behind the endpoint and raises + :class:`temporalio.streams.StreamCursorError` on the first iteration. + """ + _require_topic(topic) + return self._read(topic, after, result_type) + + async def _read( + self, topic: str, after: Cursor, result_type: type | None ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records after ``after``, one endpoint batch at a time.""" - _provider.check_topic(self._stream, topic) - attempts = AttemptTracker() + decoder = RecordDecoder( + self._front.converter, result_type, after=after, warn=logger.warning + ) token = after.token while True: answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, after_token=token, max_records=self._front.max_records, - wait_ms=self._front.wait_ms, + wait_ms=int(self._front.read_wait.total_seconds() * 1000), ), ReadOutput, - timeout_ms=self._front.wait_ms + 5000, + timeout=self._front.read_wait + _ROUND_TRIP_MARGIN, ) for wire in answer.records or []: cursor = Cursor(wire.token) try: - kind, frame_topic, source, attempt, sequence, body = _frame.decode( - wire.frame - ) - except ValueError as error: + record = WireRecord.FromString(wire.record) + except DecodeError as error: # Same answer as every other reader: skip and say so. logger.warning("skipping stream record at %s: %s", cursor, error) continue - if topic is not None and frame_topic != topic: - continue - superseded = attempts.note(source, attempt, cursor) - if superseded is not None: - yield superseded - value = ( - await self._decode(body, type) if kind is RecordKind.DATA else None - ) - yield StreamRecord( - value=value, - cursor=cursor, - kind=kind, - topic=frame_topic, - producer=source, - attempt=attempt, - sequence=sequence, - ) + if self._front.codec is not None and record.HasField("body"): + record.body.CopyFrom( + (await self._front.codec.decode([record.body]))[0] + ) + for out in decoder.decode(cursor, record): + yield out token = answer.next_token or token + if answer.done: + return - async def latest(self, *, topic: str | None = None) -> Cursor: - """The cursor of the last record written, for following from now.""" + async def latest(self, *, topic: str) -> Cursor: + """The newest position on ``topic`` behind the endpoint, for following from now.""" + _require_topic(topic) answer = await self._front.invoke( _READ_OPERATION, ReadInput( workflow_id=self._workflow_id, - stream=self._stream, - topic=topic or "", + run_id=self._run_id, + topic=topic, latest_only=True, ), ReadOutput, - timeout_ms=_APPEND_TIMEOUT_MS, + timeout=_APPEND_TIMEOUT, ) token = answer.next_token or "" return Cursor(token) if token else BEGINNING - async def _decode(self, body: bytes, as_type: type | None) -> Any: - payload = Payload() - payload.ParseFromString(body) - if self._front.codec is not None: - payload = (await self._front.codec.decode([payload]))[0] - if as_type is None: - return self._front.converter.from_payloads([payload])[0] - return self._front.converter.from_payloads([payload], [as_type])[0] - - -class _NexusProvider: - name = "nexus" - - def __init__(self) -> None: - self._endpoint: str | None = None - self._endpoint_id: str | None = None - self._http_address = "http://127.0.0.1:7243" - self._service = _SERVICE_NAME - self._data_converter: temporalio.converter.DataConverter | None = None - self._client: Any = None - self._headers: dict[str, str] = {} - self._wait_ms = _DEFAULT_WAIT_MS - self._max_records = _DEFAULT_MAX_RECORDS - - def configure(self, **options: Any) -> None: - """Point the caller half at one endpoint. - - ``endpoint`` is the endpoint's name when ``client`` is given, and is - resolved to its id through the operator service on first use; without - a client it has to be the id, because the HTTP ingress dispatches by - id. ``headers`` go on every request, which is where an authorization - header belongs. ``wait_ms`` and ``max_records`` are the read bounds - the caller asks the handler for. - """ - endpoint = options.pop("endpoint", None) - self._http_address = options.pop("http_address", self._http_address) - self._service = options.pop("service", _SERVICE_NAME) - self._data_converter = options.pop("data_converter", None) - self._client = options.pop("client", None) - self._headers = dict(options.pop("headers", None) or {}) - self._wait_ms = int(options.pop("wait_ms", _DEFAULT_WAIT_MS)) - self._max_records = int(options.pop("max_records", _DEFAULT_MAX_RECORDS)) - if options: - raise TypeError( - "the nexus provider takes endpoint, http_address, service, " - f"data_converter, client, headers, wait_ms and max_records, got " - f"{sorted(options)}" - ) - if not endpoint: - raise TypeError( - "the nexus provider needs endpoint= together with " - "client=, or endpoint= on its own" - ) - self._endpoint = endpoint - self._endpoint_id = None - - def worker_options(self) -> dict[str, Any]: - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_read( - self, - stream: str, - *, - after: Cursor = BEGINNING, - idle_timeout: timedelta | None = None, - ) -> ReadSource: - del stream, after, idle_timeout - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - def open_write(self, topic: str) -> WriteSink: - del topic - raise RuntimeError(_WORKFLOW_SIDE_ERROR) - - async def _front(self, client: Any) -> _Front: - if self._endpoint is None: - raise RuntimeError("configure the nexus provider before opening handles") - if self._endpoint_id is None: - resolver = self._client if self._client is not None else client - if resolver is None: - self._endpoint_id = self._endpoint - else: - found = await resolver.operator_service.list_nexus_endpoints( - ListNexusEndpointsRequest(name=self._endpoint) - ) - if not found.endpoints: - raise RuntimeError(f"no nexus endpoint is named {self._endpoint!r}") - self._endpoint_id = found.endpoints[0].id - base_url = ( - f"{self._http_address}/nexus/endpoints/{self._endpoint_id}" - f"/services/{self._service}" - ) - return _Front( - base_url, - self._converter(client), - self._headers, - self._wait_ms, - self._max_records, - ) - - async def producer( - self, - client: Any, - *, - workflow_id: str, - stream: str = "", - topic: str = "", - producer_id: str = "", - attempt: int = 0, + def producer( + self, *, topic: str, producer_id: str = "", attempt: int = 0 ) -> NexusProducer: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + _require_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) return NexusProducer( - await self._front(client), workflow_id, stream, topic, producer_id, attempt + self._front, self._workflow_id, self._run_id, topic, producer_id, attempt ) - async def consumer( - self, client: Any, *, workflow_id: str, stream: str = "" - ) -> NexusConsumer: - return NexusConsumer(await self._front(client), workflow_id, stream) - def _converter(self, client: Any) -> temporalio.converter.DataConverter: - if self._data_converter is not None: - return self._data_converter - if client is None: - return temporalio.converter.DataConverter.default - return client.data_converter +class NexusStreams(StreamProvider): + """The outside half of a provider, over one Nexus endpoint. + Not a worker plugin: a workflow publishes and reads through the storage + provider its worker was given, and this front only serves code outside a + workflow. The endpoint hides which store that is. + """ -_provider.register("nexus", _NexusProvider) + def __init__( + self, + *, + endpoint: str, + http_address: str = "http://127.0.0.1:7243", + headers: Mapping[str, str] | None = None, + read_wait: timedelta = _DEFAULT_READ_WAIT, + max_records: int = _DEFAULT_MAX_RECORDS, + data_converter: temporalio.converter.DataConverter | None = None, + ) -> None: + """Point the front at one endpoint. + + Args: + endpoint: The Nexus endpoint's name, resolved to its id through + the operator service of the client a handle is opened with. + When a handle is opened without a client it has to be the id, + because the HTTP ingress dispatches by id. + http_address: The server's Nexus HTTP ingress. + headers: Sent on every request; where an authorization header + belongs. + read_wait: How long the handler may park a read before answering + with what it has. + max_records: The most records one read answer carries. + data_converter: Overrides the client's converter for record + bodies. A payload codec configured here runs on this side of + the endpoint, so records are encoded before they leave the + process and the handler's worker never holds the key. + """ + if not endpoint: + raise ValueError("endpoint must not be empty") + self._endpoint = endpoint + self._http_address = http_address.rstrip("/") + self._headers = dict(headers or {}) + self._read_wait = read_wait + self._max_records = max_records + self._data_converter = data_converter + self._resolved: str | None = None + self._resolving = asyncio.Lock() + + def workflow_provider(self) -> NoReturn: + """Raise: this front has no workflow half.""" + raise StreamUnsupportedError(_WORKFLOW_SIDE_ERROR) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> NexusStreamHandle: + """A handle on ``workflow_id``'s stream through the endpoint. + + ``client`` is not used for transport: it resolves the endpoint's name + and supplies the data converter when none was configured. + """ + return NexusStreamHandle(_Front(self, client), workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: each call opens and closes its own connection.""" + + async def _endpoint_id(self, client: Client | None) -> str: + if self._resolved is not None: + return self._resolved + async with self._resolving: + if self._resolved is None: + if client is None: + self._resolved = self._endpoint + else: + found = await client.operator_service.list_nexus_endpoints( + ListNexusEndpointsRequest(name=self._endpoint) + ) + if not found.endpoints: + raise ValueError( + f"no nexus endpoint is named {self._endpoint!r}" + ) + self._resolved = found.endpoints[0].id + return self._resolved From 95be1ae140f34d7d062ba0ae3d9ddbdcc194aba0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 02:15:21 -0700 Subject: [PATCH 523/831] Covered the Nexus front on the new surface. --- CHANGELOG.md | 15 +- tests/streams/test_nexus_provider.py | 311 +++++++++++++++++---------- 2 files changed, 204 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ad3811eb..605626802 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,12 +43,15 @@ to include examples, links to docs, or any other relevant information. stream interface over the shipped Workflow Streams transport, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. -- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus - endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. Its contract is defined in - `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. - Configure it with `data_converter=` to run a payload codec on the caller - side, so records are encoded before they leave the process. +- **Experimental**: `temporalio.streams.providers.nexus.NexusStreams` puts one + Nexus endpoint in front of a storage provider, so a caller reaches a stream + through the endpoint and never names the store, and + `TemporalStreamsHandler` serves that endpoint by fronting the provider's own + handles. Its contract is defined in `temporal_streams.nexusrpc.yaml` and the + bindings are generated from it; a record crosses as the serialized + `StreamRecord` proto. Configure the front with `data_converter=` to run a + payload codec on the caller side, so records are encoded before they leave + the process. ### Changed diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 77cec6f4e..ecb0e7cf3 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -1,7 +1,7 @@ """Conformance for the Nexus front. -The caller talks only to the stream endpoint; the handler delegates to a -storage provider, so these tests are the provider-hiding demonstration: +The caller talks only to the stream endpoint; the handler fronts a storage +provider's own handles, so these tests are the provider-hiding demonstration: nothing on the caller side names or could name the store. The loop test runs over the server's Nexus HTTP ingress and is gated behind @@ -32,20 +32,27 @@ import pytest import temporalio.converter -from temporalio import streams from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.streams import RecordKind -from temporalio.streams import _frame as frame -from temporalio.streams._provider import instance -from temporalio.streams.providers import memory, nexus -from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput -from temporalio.streams.providers.nexus import ( - StreamEndpointError, - TemporalStreamsHandler, +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, ) +from temporalio.streams._wire import WireRecord +from temporalio.streams.providers import nexus +from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.worker import Worker +from tests.helpers import new_worker from tests.streams.test_workflow_streams_provider import EchoLoop, take +from tests.streams.test_workflow_streams_provider import _feed as feed_echo_loop live_only = pytest.mark.skipif( os.environ.get("STREAMS_LIVE") != "nexus", @@ -56,6 +63,8 @@ HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] +INPUTS = "inputs" +DECISIONS = "decisions" @live_only @@ -63,42 +72,34 @@ async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front, and it names the # endpoint the way an operator does, by name. - streams.configure(provider="workflow_streams") + store = WorkflowStreamsProvider() client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - front = instance( - "nexus", + front = NexusStreams( endpoint=ENDPOINT, - client=client, http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), - wait_ms=5000, + read_wait=timedelta(seconds=5), ) workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" - handler = TemporalStreamsHandler(client, provider="workflow_streams") + handler = TemporalStreamsHandler(store, client) async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): async with Worker( client, task_queue=f"tq-{workflow_id}", workflows=[EchoLoop], - **streams.worker_options(), + plugins=[store], ): handle = await client.start_workflow( EchoLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" ) - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + stream = front.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"n": 1}, {"n": 2}) await producer.append({"n": 3}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id) - records = await take(consumer.read(type=dict), 4, timeout=60) + records = await take(stream.read(topic=DECISIONS, result_type=dict), 4, 60) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -110,8 +111,9 @@ async def test_interface_loop_through_the_nexus_front(): # An opaque cursor from behind the front resumes a fresh reader # just past the record it names. checkpoint = records[0].cursor - resumed = await front.consumer(None, workflow_id=workflow_id) - again = await take(resumed.read(type=dict, after=checkpoint), 2, timeout=60) + again = await take( + stream.read(topic=DECISIONS, result_type=dict, after=checkpoint), 2, 60 + ) assert [r.value["echo"] for r in again[:2]] == [2, 3] await handle.signal(EchoLoop.release) @@ -136,12 +138,7 @@ async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: """Recover the payloads :meth:`encode` wrapped.""" - out: list[Payload] = [] - for payload in payloads: - inner = Payload() - inner.ParseFromString(self._flip(payload.data)) - out.append(inner) - return out + return [Payload.FromString(self._flip(payload.data)) for payload in payloads] @classmethod def _flip(cls, data: bytes) -> bytes: @@ -202,9 +199,9 @@ def _in_process_endpoint( failing = set(fail_after_applying or []) def post( - url: str, body: bytes, headers: Mapping[str, str], timeout_ms: int + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta ) -> bytes: - del headers, timeout_ms + del headers, timeout posted.append(body) operation = url.rsplit("/", 1)[1] request_type = AppendInput if operation == APPEND_OPERATION else ReadInput @@ -216,24 +213,30 @@ def post( _dispatch(handler, operation, request), loop ).result() except nexusrpc.HandlerError as error: - raise StreamEndpointError(str(error), status=400) from error + # The ingress answers a handler error with a failure body and the + # status its type maps to. + status = 404 if error.type is nexusrpc.HandlerErrorType.NOT_FOUND else 400 + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + json.dumps({"message": str(error)}), status + ) from error raw = contract.to_payloads([answer])[0].data answered.append(raw) if operation in failing: failing.discard(operation) - raise StreamEndpointError("connection reset after the handler answered") + raise nexus._EndpointFailure( # pyright: ignore[reportPrivateUsage] + "connection reset after the handler answered", None + ) return raw return post -def _front(codec: temporalio.converter.PayloadCodec | None) -> Any: - return instance( - "nexus", +def _front(codec: temporalio.converter.PayloadCodec | None) -> NexusStreams: + return NexusStreams( endpoint="in-process", # This endpoint has no other traffic to wait for, so park briefly # rather than for the contract's default. - wait_ms=200, + read_wait=timedelta(milliseconds=200), data_converter=dataclasses.replace( temporalio.converter.DataConverter.default, payload_codec=codec ), @@ -244,28 +247,19 @@ async def _loop_through_an_endpoint( monkeypatch: pytest.MonkeyPatch, codec: temporalio.converter.PayloadCodec | None, ) -> tuple[list[Any], list[bytes], list[bytes]]: - memory.reset() - streams.configure(provider="memory") + store = MemoryStreams() posted: list[bytes] = [] answered: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, posted, answered)) - front = _front(codec) - workflow_id = "wf-codec" + stream = _front(codec).get_stream_handle(None, "wf-codec") - producer = await front.producer( - None, - workflow_id=workflow_id, - stream="inputs", - producer_id="model", - attempt=1, - ) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) await producer.append({"secret": "tuna"}) await producer.finish() - consumer = await front.consumer(None, workflow_id=workflow_id, stream="inputs") - records = await take(consumer.read(type=dict), 2, timeout=30) - memory.reset() + records = await take(stream.read(topic=INPUTS, result_type=dict), 2, timeout=30) + await handler.close() return records, posted, answered @@ -281,7 +275,8 @@ def _answered_bodies(answered: list[bytes]) -> bytes: out = b"" for body in answered: for record in json.loads(body).get("records", []): - out += frame.decode(base64.b64decode(record["frame"]))[5] + wire = WireRecord.FromString(base64.b64decode(record["record"])) + out += wire.body.SerializeToString() return out @@ -315,14 +310,21 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( def _append( - workflow_id: str, batch_index: int, *values: Any, finish: bool = False + workflow_id: str, + batch_index: int, + *values: Any, + sequence: int | None = None, + finish: bool = False, ) -> AppendInput: converter = temporalio.converter.DataConverter.default.payload_converter return AppendInput( workflow_id=workflow_id, - stream="inputs", + topic=INPUTS, producer_id="model", attempt=1, + # Batches of one, numbered in step with the batch index unless a + # case wants them out of step. + sequence=batch_index - 1 if sequence is None else sequence, batch_index=batch_index, payloads=[ converter.to_payloads([value])[0].SerializeToString() for value in values @@ -331,57 +333,62 @@ def _append( ) -async def _stored(workflow_id: str) -> list[Any]: - consumer = await streams.consumer(None, workflow_id=workflow_id, stream="inputs") +async def _stored(store: MemoryStreams, workflow_id: str) -> list[Any]: + stream = store.get_stream_handle(None, workflow_id) + end = await stream.latest(topic=INPUTS) + if end == BEGINNING: + return [] out: list[Any] = [] - async for record in consumer.read(type=dict): + async for record in stream.read(topic=INPUTS, result_type=dict): if record.kind is RecordKind.DATA: out.append(record.value) - if await consumer.latest() == record.cursor: + if record.cursor == end: break return out -@pytest.fixture -def _memory_store(): # pyright: ignore[reportUnusedFunction] - memory.reset() - streams.configure(provider="memory") - yield - memory.reset() - - -@pytest.mark.usefixtures("_memory_store") async def test_a_handler_without_state_for_a_producer_refuses_to_continue_it(): # A second handler instance stands in for a restarted or load-balanced # handler worker: it shares the store but not the dedupe state. - first = TemporalStreamsHandler(None, provider="memory") - second = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + first = TemporalStreamsHandler(store, None) + second = TemporalStreamsHandler(store, None) await _dispatch(first, APPEND_OPERATION, _append("wf", 1, {"n": 1})) with pytest.raises(nexusrpc.HandlerError) as failed: await _dispatch(second, APPEND_OPERATION, _append("wf", 2, {"n": 2})) assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST assert failed.value.retryable_override is False + # Named so the caller can raise the same class. + assert str(failed.value).startswith("StreamProducerError: ") # The store holds the first batch and nothing was silently lost or doubled. - assert await _stored("wf") == [{"n": 1}] + assert await _stored(store, "wf") == [{"n": 1}] -@pytest.mark.usefixtures("_memory_store") -async def test_the_handler_drops_repeats_and_rejects_gaps(): - handler = TemporalStreamsHandler(None, provider="memory") +async def test_the_handler_answers_repeats_and_rejects_gaps(): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) - await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - # An exact repeat is dropped with a success answer and no position. + second = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) + # A repeat of the last batch is written once and answers with where the + # original landed, so a retrying caller checkpoints the same position. repeat = await _dispatch(handler, APPEND_OPERATION, _append("wf", 2, {"n": 2})) - assert repeat.cursor is None - with pytest.raises(nexusrpc.HandlerError) as failed: + assert repeat.cursor == second.cursor + with pytest.raises(nexusrpc.HandlerError) as skipped: await _dispatch(handler, APPEND_OPERATION, _append("wf", 4, {"n": 4})) - assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert skipped.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + with pytest.raises(nexusrpc.HandlerError) as behind: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + assert str(behind.value).startswith("StreamProducerError: ") + with pytest.raises(nexusrpc.HandlerError) as renumbered: + await _dispatch( + handler, APPEND_OPERATION, _append("wf", 3, {"n": 3}, sequence=7) + ) + assert "sequence 7 does not continue at 2" in str(renumbered.value) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] -@pytest.mark.usefixtures("_memory_store") async def test_a_malformed_payload_is_the_callers_fault(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) request = _append("wf", 1) request.payloads = [b"\xff\xfe not a payload"] with pytest.raises(nexusrpc.HandlerError) as failed: @@ -389,12 +396,12 @@ async def test_a_malformed_payload_is_the_callers_fault(): assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST -@pytest.mark.usefixtures("_memory_store") async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -402,28 +409,41 @@ async def test_the_caller_retries_an_ambiguous_append_under_the_same_index( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # A transport failure is an RPCError, never the transport's own type. + with pytest.raises(RPCError) as failed: await producer.append({"n": 1}) - await producer.append({"n": 1}) + assert failed.value.status == RPCStatusCode.UNAVAILABLE + landed = await producer.append({"n": 1}) await producer.append({"n": 2}) await producer.finish() indexes = [json.loads(body)["batch_index"] for body in posted] - # The retry re-sent index 1, which the handler dropped as a repeat, so - # the store holds each record once. + sequences = [json.loads(body)["sequence"] for body in posted] + # The retry re-sent index 1, which the handler answered as a repeat with + # the original's position, so the store holds each record once. assert indexes == [1, 1, 2, 3] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert sequences == [0, 0, 1, 2] + assert landed == await _memory_position(store, "wf", 0) + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def _memory_position( + store: MemoryStreams, workflow_id: str, index: int +) -> Cursor: + records = await take( + store.get_stream_handle(None, workflow_id).read(topic=INPUTS, result_type=dict), + index + 1, + ) + return records[index].cursor -@pytest.mark.usefixtures("_memory_store") async def test_a_failed_append_goes_out_before_the_next_one( monkeypatch: pytest.MonkeyPatch, ): posted: list[bytes] = [] - handler = TemporalStreamsHandler(None, provider="memory") + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) monkeypatch.setattr( nexus, "_post", @@ -431,28 +451,52 @@ async def test_a_failed_append_goes_out_before_the_next_one( handler, posted, [], fail_after_applying=[APPEND_OPERATION] ), ) - front = _front(None) - producer = await front.producer( - None, workflow_id="wf", stream="inputs", producer_id="model", attempt=1 - ) - with pytest.raises(StreamEndpointError): + stream = _front(None).get_stream_handle(None, "wf") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + with pytest.raises(RPCError): await producer.append({"n": 1}) # The caller moves on without retrying; the pending batch is replayed # first under its own index and the new one takes the next. await producer.append({"n": 2}) indexes = [json.loads(body)["batch_index"] for body in posted] assert indexes == [1, 1, 2] - assert await _stored("wf") == [{"n": 1}, {"n": 2}] + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + + +async def test_a_stream_condition_crosses_the_endpoint_under_its_own_class( + monkeypatch: pytest.MonkeyPatch, +): + handler = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + stream = _front(None).get_stream_handle(None, "wf") + # The token is opaque on this side, so the store behind the endpoint is + # what refuses it, and the refusal arrives on the first read as the class + # the store raised. + with pytest.raises(StreamCursorError): + await take(stream.read(topic=INPUTS, after=Cursor("elsewhere:1")), 1) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + # A second handler has no state for the attempt; the caller learns that + # as a producer conflict. + fresh = TemporalStreamsHandler(MemoryStreams(), None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(fresh, [], [])) + with pytest.raises(StreamProducerError): + await producer.append({"n": 2}) + await handler.close() + + +def test_the_front_has_no_workflow_half(): + with pytest.raises(StreamUnsupportedError): + _front(None).workflow_provider() -@pytest.mark.usefixtures("_memory_store") async def test_consecutive_reads_share_one_parked_subscription(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) first = await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", max_records=1, wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, max_records=1, wait_ms=200), ) assert len(first.records) == 1 parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] @@ -464,7 +508,7 @@ async def test_consecutive_reads_share_one_parked_subscription(): READ_OPERATION, ReadInput( workflow_id="wf", - stream="inputs", + topic=INPUTS, after_token=first.next_token, max_records=1, wait_ms=200, @@ -477,21 +521,56 @@ async def test_consecutive_reads_share_one_parked_subscription(): await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", stream="inputs", wait_ms=200), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=200), ) assert len(parked) == 1 and next(iter(parked.values())).pump is not pump await handler.close() assert not parked -@pytest.mark.usefixtures("_memory_store") async def test_the_read_wait_is_cut_to_the_request_deadline(): - handler = TemporalStreamsHandler(None, provider="memory") + handler = TemporalStreamsHandler(MemoryStreams(), None) started = asyncio.get_running_loop().time() answer = await handler.read( _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), - ReadInput(workflow_id="wf", stream="inputs", wait_ms=60000), + ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=60000), ) - assert answer.records == [] and answer.next_token == "" + assert answer.records == [] and answer.next_token == "" and not answer.done assert asyncio.get_running_loop().time() - started < 5 await handler.close() + + +async def test_the_read_ends_when_the_store_ends_it( + client: Client, monkeypatch: pytest.MonkeyPatch +): + # Behind the endpoint sits the Workflow Streams store, whose read ends + # once the run has closed and its tail is served. The front carries that + # end to the caller, whose loop leaves by itself. + store = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + handler = TemporalStreamsHandler(store, client) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + workflow_id = f"streams-nexus-{uuid.uuid4().hex}" + async with new_worker(client, EchoLoop, plugins=[store]) as worker: + handle = await client.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + await feed_echo_loop(store, client, workflow_id) + await handle.signal(EchoLoop.release) + assert await handle.result() == 3 + + stream = _front(None).get_stream_handle(None, workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 30) + await handler.close() + assert records == [ + (RecordKind.DATA, {"echo": 1}), + (RecordKind.DATA, {"echo": 2}), + (RecordKind.DATA, {"echo": 3}), + (RecordKind.FINISH, None), + ] From 8996d414062540519d52614633e3f4aaa5f7d6fd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:32:58 -0700 Subject: [PATCH 524/831] Let the Nexus front register on a client like any provider. --- temporalio/streams/providers/nexus.py | 31 +++++++++++++++++++++------ tests/streams/test_nexus_provider.py | 15 ++++++++++++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 07da0318b..372f50785 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -58,7 +58,7 @@ import urllib.error import urllib.request from collections import OrderedDict -from collections.abc import AsyncGenerator, Mapping +from collections.abc import AsyncGenerator, Awaitable, Callable, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone from typing import Any, NoReturn, TypeVar, cast @@ -67,12 +67,13 @@ import nexusrpc.handler from google.protobuf.message import DecodeError +import temporalio.client import temporalio.converter from temporalio.api.common.v1 import Payload from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest -from temporalio.client import Client +from temporalio.client import Client, ClientConfig from temporalio.common import RawValue -from temporalio.service import RPCError, RPCStatusCode +from temporalio.service import ConnectConfig, RPCError, RPCStatusCode, ServiceClient from temporalio.streams._errors import ( StreamCursorError, StreamError, @@ -843,12 +844,15 @@ def producer( ) -class NexusStreams(StreamProvider): +class NexusStreams(StreamProvider, temporalio.client.Plugin): """The outside half of a provider, over one Nexus endpoint. - Not a worker plugin: a workflow publishes and reads through the storage - provider its worker was given, and this front only serves code outside a - workflow. The endpoint hides which store that is. + A client plugin but not a worker plugin: a workflow publishes and reads + through the storage provider its worker was given, and this front only + serves code outside a workflow, so ``Client.connect(plugins=[front])`` + makes ``client.get_stream_handle()`` go through the endpoint while a + worker built from that client is left without a provider. The endpoint + hides which store sits behind it. """ def __init__( @@ -907,6 +911,19 @@ def get_stream_handle( async def close(self) -> None: """Nothing to release: each call opens and closes its own connection.""" + def configure_client(self, config: ClientConfig) -> ClientConfig: + """Set this front as the client's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def connect_service_client( + self, + config: ConnectConfig, + next: Callable[[ConnectConfig], Awaitable[ServiceClient]], + ) -> ServiceClient: + """Connect unchanged.""" + return await next(config) + async def _endpoint_id(self, client: Client | None) -> str: if self._resolved is not None: return self._resolved diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index ecb0e7cf3..b09b8d2e2 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -47,7 +47,11 @@ from temporalio.streams.providers import nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput from temporalio.streams.providers.memory import MemoryStreams -from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler +from temporalio.streams.providers.nexus import ( + NexusStreamHandle, + NexusStreams, + TemporalStreamsHandler, +) from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.worker import Worker from tests.helpers import new_worker @@ -490,6 +494,15 @@ def test_the_front_has_no_workflow_half(): _front(None).workflow_provider() +async def test_the_front_registers_on_a_client(client: Client): + # The same accessor as any provider, so code outside a workflow does not + # change when the store moves behind an endpoint. + config = client.config() + config["plugins"] = [_front(None)] + registered = Client(**config) + assert isinstance(registered.get_stream_handle("wf"), NexusStreamHandle) + + async def test_consecutive_reads_share_one_parked_subscription(): handler = TemporalStreamsHandler(MemoryStreams(), None) await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1}, {"n": 2})) From 40348b9a9107b086e8c27ed3bfaff3bb3bc5e0ab Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:55:54 -0700 Subject: [PATCH 525/831] Took topic definitions on the Nexus front's handle. --- temporalio/streams/providers/nexus.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 372f50785..09e00cf43 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -61,7 +61,7 @@ from collections.abc import AsyncGenerator, Awaitable, Callable, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, NoReturn, TypeVar, cast +from typing import Any, Generic, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler @@ -83,6 +83,7 @@ ) from temporalio.streams._provider import StreamHandle, StreamProducer, StreamProvider from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, WireRecord, @@ -105,6 +106,8 @@ "TemporalStreamsHandler", ] +T = TypeVar("T") + _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so give the worker one of those" @@ -647,7 +650,7 @@ async def invoke( return contract.from_payloads([payload], [output])[0] -class NexusProducer: +class NexusProducer(Generic[T]): """Appends through the stream endpoint; the store behind it does the rest. Calls are serialized and the batch index is committed only once the @@ -689,7 +692,7 @@ def attempt(self) -> int: """The generation this producer is writing.""" return self._attempt - async def append(self, *values: Any) -> Cursor | None: + async def append(self, *values: T) -> Cursor | None: """Append ``values`` through the endpoint and return where the last one landed. A repeat answers with the original's position and an empty call with @@ -764,7 +767,7 @@ def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: def read( self, *, - topic: str, + topic: str | StreamTopic[Any], after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: @@ -774,7 +777,7 @@ def read( the store behind the endpoint and raises :class:`temporalio.streams.StreamCursorError` on the first iteration. """ - _require_topic(topic) + topic, result_type = resolve_topic(topic, result_type) return self._read(topic, after, result_type) async def _read( @@ -816,9 +819,9 @@ async def _read( if answer.done: return - async def latest(self, *, topic: str) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The newest position on ``topic`` behind the endpoint, for following from now.""" - _require_topic(topic) + topic, _ = resolve_topic(topic) answer = await self._front.invoke( _READ_OPERATION, ReadInput( @@ -834,10 +837,14 @@ async def latest(self, *, topic: str) -> Cursor: return Cursor(token) if token else BEGINNING def producer( - self, *, topic: str, producer_id: str = "", attempt: int = 0 - ) -> NexusProducer: + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> NexusProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" - _require_topic(topic) + topic, _ = resolve_topic(topic) producer_id, attempt = producer_identity(producer_id, attempt) return NexusProducer( self._front, self._workflow_id, self._run_id, topic, producer_id, attempt From 1992bf84ed066e86f1a38e89ecf08a840d3bf1fa Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 15 Sep 2026 16:50:48 -0700 Subject: [PATCH 526/831] Added the worked example that runs one agent on every provider. --- examples/__init__.py | 0 examples/streams/__init__.py | 0 examples/streams/agent.py | 90 ++++++++++++++++++ examples/streams/run.py | 172 +++++++++++++++++++++++++++++++++++ streams_demo/README.md | 7 ++ 5 files changed, 269 insertions(+) create mode 100644 examples/__init__.py create mode 100644 examples/streams/__init__.py create mode 100644 examples/streams/agent.py create mode 100644 examples/streams/run.py diff --git a/examples/__init__.py b/examples/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/streams/__init__.py b/examples/streams/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/streams/agent.py b/examples/streams/agent.py new file mode 100644 index 000000000..0f5446a10 --- /dev/null +++ b/examples/streams/agent.py @@ -0,0 +1,90 @@ +"""The workflow and activities. Identical on every provider. + +Nothing here names a store, a transport, or an option. The loop reads its +inbound stream, decides, publishes the decision, and runs an ordinary +activity in the same workflow task, which is the shape the design doc calls +Paths A, B and C together. +""" + +from __future__ import annotations + +from datetime import timedelta + +from temporalio import activity, streams, workflow + + +@activity.defn +async def generate(workflow_id: str, count: int) -> None: + """Stream model output into the workflow's inbound stream. + + The producer carries this activity's own id and attempt, so a retry + deduplicates and a new attempt is reported to readers as a supersession. + """ + producer = await streams.producer( + activity.client(), workflow_id=workflow_id, stream="inputs" + ) + for n in range(count): + await producer.append({"n": n}) + await producer.finish() + + +@activity.defn +async def record_decision(decision: dict) -> str: + """An ordinary activity, run from the same task that read and published.""" + return f"recorded {decision['echo']}" + + +@workflow.defn +class Agent: + def __init__(self) -> None: + # Lets the provider install what it needs before the first task + # completes. A no-op except on the transport that serves outside + # readers through handlers on this workflow. + streams.prepare() + self._done = False + + @workflow.signal + def release(self) -> None: + """Lets the run end once a reader has finished following it. + + Only needed because an Option 0 stream dies with its workflow, so a + demo that ends immediately would leave nothing to read. + """ + self._done = True + + @workflow.run + async def run(self, count: int) -> int: + inputs = streams.reader("inputs", type=dict, idle_timeout=timedelta(seconds=1)) + decisions = streams.writer("decisions") + + await workflow.start_activity( + generate, + args=[workflow.info().workflow_id, count], + start_to_close_timeout=timedelta(minutes=1), + ) + + seen = 0 + async for record in inputs: + if record.kind is streams.RecordKind.FINISH: + break + if record.kind is streams.RecordKind.SUPERSEDED: + await decisions.publish( + {"retracting_attempt": record.value.previous_attempt} + ) + continue + seen += 1 + decision = {"echo": record.value["n"]} + await decisions.publish(decision) + await workflow.execute_activity( + record_decision, + decision, + start_to_close_timeout=timedelta(minutes=1), + ) + + await decisions.finish() + await workflow.wait_condition(lambda: self._done) + # Lets go of anything the provider parked against this run. A no-op + # except on the transport that parks an outside reader here. + streams.drain() + await workflow.wait_condition(workflow.all_handlers_finished) + return seen diff --git a/examples/streams/run.py b/examples/streams/run.py new file mode 100644 index 000000000..ea8a85d37 --- /dev/null +++ b/examples/streams/run.py @@ -0,0 +1,172 @@ +"""Run the same agent on whichever provider is configured. + + python -m examples.streams.run workflow_streams + python -m examples.streams.run redis --redis redis://127.0.0.1:6399 + python -m examples.streams.run native --address 127.0.0.1:7233 + python -m examples.streams.run nexus --endpoint + +The only provider-specific code in this file is :func:`configure_provider`, +which turns a name into one ``streams.configure`` call. Everything below it, +and all of ``agent.py``, is the same on every option. +""" + +from __future__ import annotations + +import argparse +import asyncio +import uuid + +from temporalio import streams +from temporalio.client import Client +from temporalio.worker import Worker + +from examples.streams.agent import Agent, generate, record_decision + + +def configure_provider(args: argparse.Namespace) -> None: + """The whole difference between the options.""" + if args.provider == "workflow_streams": + streams.configure(provider="workflow_streams") + elif args.provider == "redis": + streams.configure(provider="redis", url=args.redis) + elif args.provider == "native": + streams.configure(provider="native") + elif args.provider == "nexus": + # The worker still needs a store; the endpoint is how everything + # outside the worker reaches it without naming one. + streams.configure(provider=args.behind) + else: + raise SystemExit(f"unknown provider {args.provider}") + + +async def ensure_stream(args: argparse.Namespace, client: Client, workflow_id: str) -> None: + """Create the inbound stream when the provider needs it to pre-exist. + + The two storage providers want opposite orders, which is worth knowing + before writing an application against either. The native provider + resolves a subscription against a stream the server already has, and a + workflow cannot create one from workflow code because that would be I/O, + so whoever starts the workflow creates it first. The client-side provider + is the mirror image: it names streams under the run's chain key, so its + producer needs the workflow to exist already. Option 0 mints on first + publish and does not care. + """ + if args.provider != "native": + return + from temporalio.client_stream import StreamClient + from temporalio.streams.providers.native import inbound_stream_id + + streams_client = StreamClient.connect(args.address, client.namespace) + await streams_client.create(inbound_stream_id(workflow_id, "inputs")) + + +def outside_surface(args: argparse.Namespace): + """Where an outside producer or consumer connects. + + The same handles either way: through the Nexus endpoint when there is + one, otherwise straight at the configured provider. + """ + if args.provider == "nexus": + from temporalio.streams._provider import instance + + return instance("nexus", endpoint=args.endpoint, http_address=args.http) + return streams + + +async def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument( + "provider", choices=["workflow_streams", "redis", "native", "nexus"] + ) + parser.add_argument("--address", default="localhost:7233") + parser.add_argument("--redis", default="redis://127.0.0.1:6399") + parser.add_argument("--endpoint", default="", help="nexus endpoint id") + parser.add_argument("--http", default="http://127.0.0.1:7243") + parser.add_argument( + "--behind", + default="workflow_streams", + help="the store a nexus handler serves", + ) + parser.add_argument("--records", type=int, default=3) + parser.add_argument("--cache", type=int, default=100) + parser.add_argument( + "--handler-queue", + default="streams-handlers-e2e", + help="task queue the nexus endpoint routes to", + ) + args = parser.parse_args() + + configure_provider(args) + client = await Client.connect(args.address) + workflow_id = f"streams-example-{uuid.uuid4().hex[:8]}" + task_queue = f"tq-{workflow_id}" + + workers = [ + Worker( + client, + task_queue=task_queue, + workflows=[Agent], + activities=[generate, record_decision], + # Warm, because two of these transports park work against the + # running workflow. The native provider also runs at zero, which + # is its own result rather than something this example shows. + max_cached_workflows=args.cache, + **streams.worker_options(), + ) + ] + if args.provider == "nexus": + from temporalio.streams.providers.nexus import TemporalStreamsHandler + + workers.append( + Worker( + client, + task_queue=args.handler_queue, + nexus_service_handlers=[ + TemporalStreamsHandler(client, provider=args.behind) + ], + ) + ) + + async with workers[0]: + async with workers[-1] if len(workers) > 1 else _null(): + await ensure_stream(args, client, workflow_id) + handle = await client.start_workflow( + Agent.run, args.records, id=workflow_id, task_queue=task_queue + ) + print(f"provider={args.provider} workflow={workflow_id}") + + reader = await outside_surface(args).consumer( + client if args.provider != "nexus" else None, + workflow_id=workflow_id, + ) + seen = 0 + records = reader.read(type=dict, topic="decisions") + try: + async for record in records: + print( + f" {record.kind.name:11} {record.value} at {record.cursor.token}" + ) + if record.kind is streams.RecordKind.FINISH: + break + seen += 1 + finally: + # Closed before the workflow is released, because a reader + # still polling this run would have its in-flight poll + # cancelled when the workflow lets its readers go. + await records.aclose() + + await handle.signal(Agent.release) + decided = await handle.result() + print(f"workflow decided {decided}, reader saw {seen}") + + +class _null: + async def __aenter__(self): + return self + + async def __aexit__(self, *exc): + return False + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/streams_demo/README.md b/streams_demo/README.md index a52e56ae8..876600dd5 100644 --- a/streams_demo/README.md +++ b/streams_demo/README.md @@ -62,3 +62,10 @@ handler worker. The conformance suite runs the same expectations on every provider: `pytest tests/streams/` (memory and Workflow Streams on the test server), plus `STREAMS_LIVE=native|redis|nexus` for the suites that need a store. + +## The examples + +`examples/streams/` is the same thing written as a worked example rather than +a measurement run: `agent.py` holds the workflow and activities, identical on +every provider, and `run.py` picks one. See its `configure_provider`, which +is the whole difference between the options. From 38d65600df31d5f9ca5df3b43e59ad9f238b41fd Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:15:03 -0700 Subject: [PATCH 527/831] Made the worked example pass the linters. `examples/` is not excluded from the doc linter, so every public name in it needs a docstring. --- examples/__init__.py | 1 + examples/streams/__init__.py | 1 + examples/streams/agent.py | 12 +++++++++--- examples/streams/run.py | 8 +++++--- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/__init__.py b/examples/__init__.py index e69de29bb..e282df462 100644 --- a/examples/__init__.py +++ b/examples/__init__.py @@ -0,0 +1 @@ +"""Worked examples that run against a Temporal server.""" diff --git a/examples/streams/__init__.py b/examples/streams/__init__.py index e69de29bb..f4ee8e3c9 100644 --- a/examples/streams/__init__.py +++ b/examples/streams/__init__.py @@ -0,0 +1 @@ +"""One agent loop run on every stream provider.""" diff --git a/examples/streams/agent.py b/examples/streams/agent.py index 0f5446a10..0c5d68edc 100644 --- a/examples/streams/agent.py +++ b/examples/streams/agent.py @@ -36,10 +36,15 @@ async def record_decision(decision: dict) -> str: @workflow.defn class Agent: + """Reads ``inputs``, publishes a decision each time, ends on FINISH.""" + def __init__(self) -> None: - # Lets the provider install what it needs before the first task - # completes. A no-op except on the transport that serves outside - # readers through handlers on this workflow. + """Let the provider install what it needs before the first task. + + A no-op except on the transport that serves outside readers through + handlers on this workflow, which has to register them before the + first task completes. + """ streams.prepare() self._done = False @@ -54,6 +59,7 @@ def release(self) -> None: @workflow.run async def run(self, count: int) -> int: + """Decide on at most ``count`` inputs, then return how many landed.""" inputs = streams.reader("inputs", type=dict, idle_timeout=timedelta(seconds=1)) decisions = streams.writer("decisions") diff --git a/examples/streams/run.py b/examples/streams/run.py index ea8a85d37..2973ff998 100644 --- a/examples/streams/run.py +++ b/examples/streams/run.py @@ -16,12 +16,11 @@ import asyncio import uuid +from examples.streams.agent import Agent, generate, record_decision from temporalio import streams from temporalio.client import Client from temporalio.worker import Worker -from examples.streams.agent import Agent, generate, record_decision - def configure_provider(args: argparse.Namespace) -> None: """The whole difference between the options.""" @@ -39,7 +38,9 @@ def configure_provider(args: argparse.Namespace) -> None: raise SystemExit(f"unknown provider {args.provider}") -async def ensure_stream(args: argparse.Namespace, client: Client, workflow_id: str) -> None: +async def ensure_stream( + args: argparse.Namespace, client: Client, workflow_id: str +) -> None: """Create the inbound stream when the provider needs it to pre-exist. The two storage providers want opposite orders, which is worth knowing @@ -74,6 +75,7 @@ def outside_surface(args: argparse.Namespace): async def main() -> None: + """Run the loop once on the provider named on the command line.""" parser = argparse.ArgumentParser() parser.add_argument( "provider", choices=["workflow_streams", "redis", "native", "nexus"] From 2715a79a224e7348dce2c1a1094f06b0160beb77 Mon Sep 17 00:00:00 2001 From: Moe Dashti Date: Wed, 16 Sep 2026 16:15:03 -0700 Subject: [PATCH 528/831] Added the changelog entry for the worked example. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff2c0a7cd..4448604b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,10 @@ to include examples, links to docs, or any other relevant information. `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. Configure it with `data_converter=` to run a payload codec on the caller side, so records are encoded before they leave the process. + through the endpoint and never names the store. +- Added `examples/streams`, one agent loop that runs unchanged on every + stream provider and on the Nexus front. + - Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. - **Experimental**: server-side streams. A workflow reads a stream the server delivers on its Workflow Tasks and publishes with a command, through From bd272d01c013d3dd3d498ae0ffdc3272eb5563fc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 18 Sep 2026 18:07:47 -0700 Subject: [PATCH 529/831] Bounded the example's generator and documented the Nexus endpoint. The generate activity's handle is kept and awaited with a retry limit, so a generator that gives up fails the run with its cause. The runner imports the public instance(), opens its workers through an exit stack, counts echoes apart from retractions, and the examples package is type-checked with the rest of the tree. --- CHANGELOG.md | 2 - examples/streams/agent.py | 15 +++++- examples/streams/run.py | 105 ++++++++++++++++++++++---------------- pyproject.toml | 2 +- streams_demo/README.md | 13 ++++- 5 files changed, 85 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4448604b9..26751db0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,10 +81,8 @@ to include examples, links to docs, or any other relevant information. `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. Configure it with `data_converter=` to run a payload codec on the caller side, so records are encoded before they leave the process. - through the endpoint and never names the store. - Added `examples/streams`, one agent loop that runs unchanged on every stream provider and on the Nexus front. - - Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. - **Experimental**: server-side streams. A workflow reads a stream the server delivers on its Workflow Tasks and publishes with a command, through diff --git a/examples/streams/agent.py b/examples/streams/agent.py index 0c5d68edc..d707e21c3 100644 --- a/examples/streams/agent.py +++ b/examples/streams/agent.py @@ -11,6 +11,7 @@ from datetime import timedelta from temporalio import activity, streams, workflow +from temporalio.common import RetryPolicy @activity.defn @@ -63,21 +64,26 @@ async def run(self, count: int) -> int: inputs = streams.reader("inputs", type=dict, idle_timeout=timedelta(seconds=1)) decisions = streams.writer("decisions") - await workflow.start_activity( + generating = workflow.start_activity( generate, args=[workflow.info().workflow_id, count], start_to_close_timeout=timedelta(minutes=1), + # Bounded, so a generator that cannot finish gives up instead of + # retrying forever while every attempt streams from the start. + retry_policy=RetryPolicy(maximum_attempts=3), ) seen = 0 async for record in inputs: if record.kind is streams.RecordKind.FINISH: break - if record.kind is streams.RecordKind.SUPERSEDED: + if isinstance(record.value, streams.Supersession): await decisions.publish( {"retracting_attempt": record.value.previous_attempt} ) continue + if not isinstance(record.value, dict): + continue seen += 1 decision = {"echo": record.value["n"]} await decisions.publish(decision) @@ -86,6 +92,11 @@ async def run(self, count: int) -> int: decision, start_to_close_timeout=timedelta(minutes=1), ) + if seen >= count: + break + # A generator that exhausted its attempts fails the run with its cause + # here, rather than being forgotten once the loop has what it wanted. + await generating await decisions.finish() await workflow.wait_condition(lambda: self._done) diff --git a/examples/streams/run.py b/examples/streams/run.py index 2973ff998..bd1c10f33 100644 --- a/examples/streams/run.py +++ b/examples/streams/run.py @@ -1,10 +1,17 @@ -"""Run the same agent on whichever provider is configured. +r"""Run the same agent on whichever provider is configured. python -m examples.streams.run workflow_streams - python -m examples.streams.run redis --redis redis://127.0.0.1:6399 + python -m examples.streams.run redis --redis redis://127.0.0.1:6379 python -m examples.streams.run native --address 127.0.0.1:7233 python -m examples.streams.run nexus --endpoint +The Nexus mode needs an endpoint that routes to the handler worker's task +queue, and the flag takes the endpoint's id, not its name:: + + temporal operator nexus endpoint create --name streams-e2e \ + --target-task-queue streams-handlers-e2e + temporal operator nexus endpoint get --name streams-e2e -o json | jq -r .id + The only provider-specific code in this file is :func:`configure_provider`, which turns a name into one ``streams.configure`` call. Everything below it, and all of ``agent.py``, is the same on every option. @@ -14,11 +21,13 @@ import argparse import asyncio +import contextlib import uuid from examples.streams.agent import Agent, generate, record_decision from temporalio import streams from temporalio.client import Client +from temporalio.streams import instance from temporalio.worker import Worker @@ -55,7 +64,7 @@ async def ensure_stream( if args.provider != "native": return from temporalio.client_stream import StreamClient - from temporalio.streams.providers.native import inbound_stream_id + from temporalio.streams._ids import inbound_stream_id streams_client = StreamClient.connect(args.address, client.namespace) await streams_client.create(inbound_stream_id(workflow_id, "inputs")) @@ -68,8 +77,6 @@ def outside_surface(args: argparse.Namespace): one, otherwise straight at the configured provider. """ if args.provider == "nexus": - from temporalio.streams._provider import instance - return instance("nexus", endpoint=args.endpoint, http_address=args.http) return streams @@ -81,8 +88,12 @@ async def main() -> None: "provider", choices=["workflow_streams", "redis", "native", "nexus"] ) parser.add_argument("--address", default="localhost:7233") - parser.add_argument("--redis", default="redis://127.0.0.1:6399") - parser.add_argument("--endpoint", default="", help="nexus endpoint id") + parser.add_argument("--redis", default="redis://127.0.0.1:6379") + parser.add_argument( + "--endpoint", + default="", + help="nexus endpoint id, not its name; see streams_demo/README.md", + ) parser.add_argument("--http", default="http://127.0.0.1:7243") parser.add_argument( "--behind", @@ -129,45 +140,49 @@ async def main() -> None: ) ) - async with workers[0]: - async with workers[-1] if len(workers) > 1 else _null(): - await ensure_stream(args, client, workflow_id) - handle = await client.start_workflow( - Agent.run, args.records, id=workflow_id, task_queue=task_queue - ) - print(f"provider={args.provider} workflow={workflow_id}") + async with contextlib.AsyncExitStack() as running: + for worker in workers: + await running.enter_async_context(worker) + await ensure_stream(args, client, workflow_id) + handle = await client.start_workflow( + Agent.run, args.records, id=workflow_id, task_queue=task_queue + ) + print(f"provider={args.provider} workflow={workflow_id}") - reader = await outside_surface(args).consumer( - client if args.provider != "nexus" else None, - workflow_id=workflow_id, - ) - seen = 0 - records = reader.read(type=dict, topic="decisions") - try: - async for record in records: - print( - f" {record.kind.name:11} {record.value} at {record.cursor.token}" - ) - if record.kind is streams.RecordKind.FINISH: - break - seen += 1 - finally: - # Closed before the workflow is released, because a reader - # still polling this run would have its in-flight poll - # cancelled when the workflow lets its readers go. - await records.aclose() - - await handle.signal(Agent.release) - decided = await handle.result() - print(f"workflow decided {decided}, reader saw {seen}") - - -class _null: - async def __aenter__(self): - return self - - async def __aexit__(self, *exc): - return False + reader = await outside_surface(args).consumer( + client if args.provider != "nexus" else None, + workflow_id=workflow_id, + ) + # Counted apart: a retried generator makes the workflow retract the + # earlier attempt, and those records are correct output rather than + # echoes that the workflow's own count would have to agree with. + echoes = retractions = 0 + records = reader.read(type=dict, topic="decisions") + try: + async for record in records: + print( + f" {record.kind.name:11} {record.value} at {record.cursor.token}" + ) + if record.kind is streams.RecordKind.FINISH: + break + if record.kind is not streams.RecordKind.DATA: + continue + if isinstance(record.value, dict) and "echo" in record.value: + echoes += 1 + else: + retractions += 1 + finally: + # Closed before the workflow is released, because a reader + # still polling this run would have its in-flight poll + # cancelled when the workflow lets its readers go. + await records.aclose() + + await handle.signal(Agent.release) + decided = await handle.result() + print( + f"workflow decided {decided}; reader saw {echoes} echoes and " + f"{retractions} retractions" + ) if __name__ == "__main__": diff --git a/pyproject.toml b/pyproject.toml index 95d1436e8..29389fc39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -272,7 +272,7 @@ reportUnnecessaryIsInstance = "none" reportUnnecessaryTypeIgnoreComment = "none" reportUnusedCallResult = "none" reportUnknownLambdaType = "none" -include = ["temporalio", "tests"] +include = ["temporalio", "tests", "examples"] exclude = [ # Exclude auto generated files "temporalio/api", diff --git a/streams_demo/README.md b/streams_demo/README.md index 876600dd5..ca35d71fa 100644 --- a/streams_demo/README.md +++ b/streams_demo/README.md @@ -56,8 +56,17 @@ stream = front.get_stream_handle(client, workflow_id) producer = stream.producer(topic="inputs", producer_id="model", attempt=1) ``` -See `tests/streams/test_nexus_provider.py` for the endpoint setup and the -handler worker. +The endpoint has to exist and route to the handler worker's task queue, and +the provider takes its id rather than its name: + +```sh +temporal operator nexus endpoint create --name streams-e2e \ + --target-task-queue streams-handlers-e2e +temporal operator nexus endpoint get --name streams-e2e -o json | jq -r .id +``` + +See `tests/streams/test_nexus_provider.py` for the handler worker, and +`examples/streams/run.py nexus --endpoint ` for the whole loop behind it. The conformance suite runs the same expectations on every provider: `pytest tests/streams/` (memory and Workflow Streams on the test server), plus From eb7c43d42e0f180564da08f7c174b5eef02e89ee Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 03:14:05 -0700 Subject: [PATCH 530/831] Moved the worked example onto the v2 interface. The worker takes the provider as a plugin, the model activity publishes through the same instance, and the outside read ends with the workflow, so the release signal and the lifecycle calls are gone from the agent. --- examples/streams/agent.py | 89 +++++++++------------ examples/streams/run.py | 161 +++++++++++++++++--------------------- streams_demo/README.md | 4 +- 3 files changed, 111 insertions(+), 143 deletions(-) diff --git a/examples/streams/agent.py b/examples/streams/agent.py index d707e21c3..609df9614 100644 --- a/examples/streams/agent.py +++ b/examples/streams/agent.py @@ -1,32 +1,45 @@ """The workflow and activities. Identical on every provider. Nothing here names a store, a transport, or an option. The loop reads its -inbound stream, decides, publishes the decision, and runs an ordinary +``inputs`` topic, decides, publishes the decision, and runs an ordinary activity in the same workflow task, which is the shape the design doc calls -Paths A, B and C together. +Paths A, B and C together. The activity that streams model output takes the +provider from whoever built the worker, because an activity has no runtime +to ask for it the way workflow code does. """ from __future__ import annotations from datetime import timedelta -from temporalio import activity, streams, workflow +from temporalio import activity, workflow from temporalio.common import RetryPolicy +from temporalio.streams import RecordKind, StreamProvider +INPUTS = "inputs" +DECISIONS = "decisions" -@activity.defn -async def generate(workflow_id: str, count: int) -> None: - """Stream model output into the workflow's inbound stream. - The producer carries this activity's own id and attempt, so a retry - deduplicates and a new attempt is reported to readers as a supersession. - """ - producer = await streams.producer( - activity.client(), workflow_id=workflow_id, stream="inputs" - ) - for n in range(count): - await producer.append({"n": n}) - await producer.finish() +class Generator: + """The model activity, bound to the provider the process constructed.""" + + def __init__(self, provider: StreamProvider) -> None: + """Publish through ``provider``, the same instance the worker runs on.""" + self._provider = provider + + @activity.defn + async def generate(self, workflow_id: str, count: int) -> None: + """Stream model output onto the workflow's ``inputs`` topic. + + The producer carries this activity's own id and attempt, so a retry + deduplicates and a new attempt is reported to readers as a + supersession. + """ + stream = self._provider.get_stream_handle(activity.client(), workflow_id) + model = stream.producer(topic=INPUTS) + for n in range(count): + await model.append({"n": n}) + await model.finish() @activity.defn @@ -39,33 +52,14 @@ async def record_decision(decision: dict) -> str: class Agent: """Reads ``inputs``, publishes a decision each time, ends on FINISH.""" - def __init__(self) -> None: - """Let the provider install what it needs before the first task. - - A no-op except on the transport that serves outside readers through - handlers on this workflow, which has to register them before the - first task completes. - """ - streams.prepare() - self._done = False - - @workflow.signal - def release(self) -> None: - """Lets the run end once a reader has finished following it. - - Only needed because an Option 0 stream dies with its workflow, so a - demo that ends immediately would leave nothing to read. - """ - self._done = True - @workflow.run async def run(self, count: int) -> int: """Decide on at most ``count`` inputs, then return how many landed.""" - inputs = streams.reader("inputs", type=dict, idle_timeout=timedelta(seconds=1)) - decisions = streams.writer("decisions") + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) generating = workflow.start_activity( - generate, + Generator.generate, args=[workflow.info().workflow_id, count], start_to_close_timeout=timedelta(minutes=1), # Bounded, so a generator that cannot finish gives up instead of @@ -75,18 +69,18 @@ async def run(self, count: int) -> int: seen = 0 async for record in inputs: - if record.kind is streams.RecordKind.FINISH: + if record.kind is RecordKind.FINISH: break - if isinstance(record.value, streams.Supersession): - await decisions.publish( - {"retracting_attempt": record.value.previous_attempt} + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} ) continue - if not isinstance(record.value, dict): - continue + assert record.value is not None seen += 1 decision = {"echo": record.value["n"]} - await decisions.publish(decision) + decisions.publish(decision) await workflow.execute_activity( record_decision, decision, @@ -98,10 +92,5 @@ async def run(self, count: int) -> int: # here, rather than being forgotten once the loop has what it wanted. await generating - await decisions.finish() - await workflow.wait_condition(lambda: self._done) - # Lets go of anything the provider parked against this run. A no-op - # except on the transport that parks an outside reader here. - streams.drain() - await workflow.wait_condition(workflow.all_handlers_finished) + decisions.finish() return seen diff --git a/examples/streams/run.py b/examples/streams/run.py index bd1c10f33..a9d60d5d6 100644 --- a/examples/streams/run.py +++ b/examples/streams/run.py @@ -2,7 +2,7 @@ python -m examples.streams.run workflow_streams python -m examples.streams.run redis --redis redis://127.0.0.1:6379 - python -m examples.streams.run native --address 127.0.0.1:7233 + python -m examples.streams.run native --address 127.0.0.1:7333 python -m examples.streams.run nexus --endpoint The Nexus mode needs an endpoint that routes to the handler worker's task @@ -12,9 +12,11 @@ --target-task-queue streams-handlers-e2e temporal operator nexus endpoint get --name streams-e2e -o json | jq -r .id -The only provider-specific code in this file is :func:`configure_provider`, -which turns a name into one ``streams.configure`` call. Everything below it, -and all of ``agent.py``, is the same on every option. +The only provider-specific code in this file is :func:`make_provider`, which +turns a name into one constructor call. Everything below it, and all of +``agent.py``, is the same on every option: the worker takes the provider as a +plugin, the activity publishes through it, and outside code opens a handle +from it, or from the Nexus front standing in for it. """ from __future__ import annotations @@ -24,61 +26,46 @@ import contextlib import uuid -from examples.streams.agent import Agent, generate, record_decision -from temporalio import streams +from examples.streams.agent import DECISIONS, Agent, Generator, record_decision from temporalio.client import Client -from temporalio.streams import instance +from temporalio.streams import RecordKind, StreamProvider +from temporalio.streams.providers import ProviderPlugin from temporalio.worker import Worker -def configure_provider(args: argparse.Namespace) -> None: - """The whole difference between the options.""" - if args.provider == "workflow_streams": - streams.configure(provider="workflow_streams") - elif args.provider == "redis": - streams.configure(provider="redis", url=args.redis) - elif args.provider == "native": - streams.configure(provider="native") - elif args.provider == "nexus": - # The worker still needs a store; the endpoint is how everything - # outside the worker reaches it without naming one. - streams.configure(provider=args.behind) - else: - raise SystemExit(f"unknown provider {args.provider}") - - -async def ensure_stream( - args: argparse.Namespace, client: Client, workflow_id: str -) -> None: - """Create the inbound stream when the provider needs it to pre-exist. - - The two storage providers want opposite orders, which is worth knowing - before writing an application against either. The native provider - resolves a subscription against a stream the server already has, and a - workflow cannot create one from workflow code because that would be I/O, - so whoever starts the workflow creates it first. The client-side provider - is the mirror image: it names streams under the run's chain key, so its - producer needs the workflow to exist already. Option 0 mints on first - publish and does not care. - """ - if args.provider != "native": - return - from temporalio.client_stream import StreamClient - from temporalio.streams._ids import inbound_stream_id +def make_provider(args: argparse.Namespace) -> ProviderPlugin: + """The whole difference between the options: one constructor call.""" + name = args.behind if args.provider == "nexus" else args.provider + if name == "workflow_streams": + from temporalio.streams.providers.workflow_streams import ( + WorkflowStreamsProvider, + ) + + return WorkflowStreamsProvider() + if name == "redis": + from temporalio.streams.providers.redis import RedisStreams + + return RedisStreams(url=args.redis) + if name == "native": + from temporalio.streams.providers.native import NativeStreams - streams_client = StreamClient.connect(args.address, client.namespace) - await streams_client.create(inbound_stream_id(workflow_id, "inputs")) + return NativeStreams() + raise SystemExit(f"unknown provider {name}") -def outside_surface(args: argparse.Namespace): - """Where an outside producer or consumer connects. +def outside_surface( + args: argparse.Namespace, provider: StreamProvider +) -> StreamProvider: + """Where an outside producer or consumer opens its handle. - The same handles either way: through the Nexus endpoint when there is - one, otherwise straight at the configured provider. + The same handle either way: from the Nexus front when there is one, + otherwise straight from the provider the worker runs on. """ - if args.provider == "nexus": - return instance("nexus", endpoint=args.endpoint, http_address=args.http) - return streams + if args.provider != "nexus": + return provider + from temporalio.streams.providers.nexus import NexusStreams + + return NexusStreams(endpoint=args.endpoint, http_address=args.http) async def main() -> None: @@ -109,7 +96,7 @@ async def main() -> None: ) args = parser.parse_args() - configure_provider(args) + provider = make_provider(args) client = await Client.connect(args.address) workflow_id = f"streams-example-{uuid.uuid4().hex[:8]}" task_queue = f"tq-{workflow_id}" @@ -119,12 +106,12 @@ async def main() -> None: client, task_queue=task_queue, workflows=[Agent], - activities=[generate, record_decision], + activities=[Generator(provider).generate, record_decision], # Warm, because two of these transports park work against the # running workflow. The native provider also runs at zero, which # is its own result rather than something this example shows. max_cached_workflows=args.cache, - **streams.worker_options(), + plugins=[provider], ) ] if args.provider == "nexus": @@ -134,55 +121,47 @@ async def main() -> None: Worker( client, task_queue=args.handler_queue, - nexus_service_handlers=[ - TemporalStreamsHandler(client, provider=args.behind) - ], + nexus_service_handlers=[TemporalStreamsHandler(provider, client)], ) ) - async with contextlib.AsyncExitStack() as running: - for worker in workers: - await running.enter_async_context(worker) - await ensure_stream(args, client, workflow_id) - handle = await client.start_workflow( - Agent.run, args.records, id=workflow_id, task_queue=task_queue - ) - print(f"provider={args.provider} workflow={workflow_id}") - - reader = await outside_surface(args).consumer( - client if args.provider != "nexus" else None, - workflow_id=workflow_id, - ) - # Counted apart: a retried generator makes the workflow retract the - # earlier attempt, and those records are correct output rather than - # echoes that the workflow's own count would have to agree with. - echoes = retractions = 0 - records = reader.read(type=dict, topic="decisions") - try: - async for record in records: + front = outside_surface(args, provider) + try: + async with contextlib.AsyncExitStack() as running: + for worker in workers: + await running.enter_async_context(worker) + handle = await client.start_workflow( + Agent.run, args.records, id=workflow_id, task_queue=task_queue + ) + print(f"provider={args.provider} workflow={workflow_id}") + + # Counted apart: a retried generator makes the workflow retract the + # earlier attempt, and those records are correct output rather than + # echoes that the workflow's own count would have to agree with. + echoes = retractions = 0 + stream = front.get_stream_handle(client, workflow_id) + # The read ends by itself once the workflow is closed and the tail + # has been delivered, on every provider. + async for record in stream.read(topic=DECISIONS, result_type=dict): print( f" {record.kind.name:11} {record.value} at {record.cursor.token}" ) - if record.kind is streams.RecordKind.FINISH: - break - if record.kind is not streams.RecordKind.DATA: + if record.kind is not RecordKind.DATA: continue if isinstance(record.value, dict) and "echo" in record.value: echoes += 1 else: retractions += 1 - finally: - # Closed before the workflow is released, because a reader - # still polling this run would have its in-flight poll - # cancelled when the workflow lets its readers go. - await records.aclose() - - await handle.signal(Agent.release) - decided = await handle.result() - print( - f"workflow decided {decided}; reader saw {echoes} echoes and " - f"{retractions} retractions" - ) + + decided = await handle.result() + print( + f"workflow decided {decided}; reader saw {echoes} echoes and " + f"{retractions} retractions" + ) + finally: + if front is not provider: + await front.close() + await provider.close() if __name__ == "__main__": diff --git a/streams_demo/README.md b/streams_demo/README.md index ca35d71fa..b21e98212 100644 --- a/streams_demo/README.md +++ b/streams_demo/README.md @@ -76,5 +76,5 @@ The conformance suite runs the same expectations on every provider: `examples/streams/` is the same thing written as a worked example rather than a measurement run: `agent.py` holds the workflow and activities, identical on -every provider, and `run.py` picks one. See its `configure_provider`, which -is the whole difference between the options. +every provider, and `run.py` picks one. See its `make_provider`, which +is the whole difference between the options: one constructor call. From 480cbf82e1debfb0d15fc7272f7e2d0dba53bc79 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:44:16 -0700 Subject: [PATCH 531/831] Moved the composed example onto the per-context accessors. The model Activity asks its context for its own workflow's stream and the backend asks its client, so no file but the setup names a provider. --- examples/streams/agent.py | 43 +++++++++------------ examples/streams/run.py | 81 +++++++++++++-------------------------- 2 files changed, 45 insertions(+), 79 deletions(-) diff --git a/examples/streams/agent.py b/examples/streams/agent.py index 609df9614..67a643232 100644 --- a/examples/streams/agent.py +++ b/examples/streams/agent.py @@ -3,9 +3,9 @@ Nothing here names a store, a transport, or an option. The loop reads its ``inputs`` topic, decides, publishes the decision, and runs an ordinary activity in the same workflow task, which is the shape the design doc calls -Paths A, B and C together. The activity that streams model output takes the -provider from whoever built the worker, because an activity has no runtime -to ask for it the way workflow code does. +Paths A, B and C together. The Activity that streams model output asks its +context for its own workflow's stream, the way workflow code asks its +runtime, so the file is the same whichever provider the process registered. """ from __future__ import annotations @@ -14,32 +14,25 @@ from temporalio import activity, workflow from temporalio.common import RetryPolicy -from temporalio.streams import RecordKind, StreamProvider +from temporalio.streams import RecordKind INPUTS = "inputs" DECISIONS = "decisions" -class Generator: - """The model activity, bound to the provider the process constructed.""" - - def __init__(self, provider: StreamProvider) -> None: - """Publish through ``provider``, the same instance the worker runs on.""" - self._provider = provider - - @activity.defn - async def generate(self, workflow_id: str, count: int) -> None: - """Stream model output onto the workflow's ``inputs`` topic. +@activity.defn +async def generate(count: int) -> None: + """Stream model output onto this workflow's ``inputs`` topic. - The producer carries this activity's own id and attempt, so a retry - deduplicates and a new attempt is reported to readers as a - supersession. - """ - stream = self._provider.get_stream_handle(activity.client(), workflow_id) - model = stream.producer(topic=INPUTS) - for n in range(count): - await model.append({"n": n}) - await model.finish() + No workflow id and no run id: the handle is this Activity's own + workflow, pinned to its run. The producer carries the Activity's own id + and attempt, so a retry deduplicates and a new attempt is reported to + readers as a supersession. + """ + model = activity.stream_handle().producer(topic=INPUTS) + for n in range(count): + await model.append({"n": n}) + await model.finish() @activity.defn @@ -59,8 +52,8 @@ async def run(self, count: int) -> int: decisions = workflow.stream_writer(DECISIONS) generating = workflow.start_activity( - Generator.generate, - args=[workflow.info().workflow_id, count], + generate, + count, start_to_close_timeout=timedelta(minutes=1), # Bounded, so a generator that cannot finish gives up instead of # retrying forever while every attempt streams from the start. diff --git a/examples/streams/run.py b/examples/streams/run.py index a9d60d5d6..2317d62e9 100644 --- a/examples/streams/run.py +++ b/examples/streams/run.py @@ -12,11 +12,11 @@ --target-task-queue streams-handlers-e2e temporal operator nexus endpoint get --name streams-e2e -o json | jq -r .id -The only provider-specific code in this file is :func:`make_provider`, which -turns a name into one constructor call. Everything below it, and all of -``agent.py``, is the same on every option: the worker takes the provider as a -plugin, the activity publishes through it, and outside code opens a handle -from it, or from the Nexus front standing in for it. +The provider is registered once, on the client, and that is the only +provider-specific line here. The workers inherit it, the Activity reaches its +workflow's stream through ``activity.stream_handle()``, and the backend below +reads through ``client.get_stream_handle()``, or through the Nexus front +standing in for the store when there is one. """ from __future__ import annotations @@ -26,54 +26,17 @@ import contextlib import uuid -from examples.streams.agent import DECISIONS, Agent, Generator, record_decision +from examples.streams import _setup +from examples.streams.agent import DECISIONS, Agent, generate, record_decision from temporalio.client import Client -from temporalio.streams import RecordKind, StreamProvider -from temporalio.streams.providers import ProviderPlugin +from temporalio.streams import RecordKind, StreamHandle from temporalio.worker import Worker -def make_provider(args: argparse.Namespace) -> ProviderPlugin: - """The whole difference between the options: one constructor call.""" - name = args.behind if args.provider == "nexus" else args.provider - if name == "workflow_streams": - from temporalio.streams.providers.workflow_streams import ( - WorkflowStreamsProvider, - ) - - return WorkflowStreamsProvider() - if name == "redis": - from temporalio.streams.providers.redis import RedisStreams - - return RedisStreams(url=args.redis) - if name == "native": - from temporalio.streams.providers.native import NativeStreams - - return NativeStreams() - raise SystemExit(f"unknown provider {name}") - - -def outside_surface( - args: argparse.Namespace, provider: StreamProvider -) -> StreamProvider: - """Where an outside producer or consumer opens its handle. - - The same handle either way: from the Nexus front when there is one, - otherwise straight from the provider the worker runs on. - """ - if args.provider != "nexus": - return provider - from temporalio.streams.providers.nexus import NexusStreams - - return NexusStreams(endpoint=args.endpoint, http_address=args.http) - - async def main() -> None: """Run the loop once on the provider named on the command line.""" parser = argparse.ArgumentParser() - parser.add_argument( - "provider", choices=["workflow_streams", "redis", "native", "nexus"] - ) + parser.add_argument("provider", choices=[*_setup.PROVIDERS, "nexus"]) parser.add_argument("--address", default="localhost:7233") parser.add_argument("--redis", default="redis://127.0.0.1:6379") parser.add_argument( @@ -96,8 +59,9 @@ async def main() -> None: ) args = parser.parse_args() - provider = make_provider(args) - client = await Client.connect(args.address) + store = args.behind if args.provider == "nexus" else args.provider + provider = _setup.make_provider(store, args) + client = await Client.connect(args.address, plugins=[provider]) workflow_id = f"streams-example-{uuid.uuid4().hex[:8]}" task_queue = f"tq-{workflow_id}" @@ -106,16 +70,19 @@ async def main() -> None: client, task_queue=task_queue, workflows=[Agent], - activities=[Generator(provider).generate, record_decision], + activities=[generate, record_decision], # Warm, because two of these transports park work against the # running workflow. The native provider also runs at zero, which # is its own result rather than something this example shows. max_cached_workflows=args.cache, - plugins=[provider], ) ] + front = None if args.provider == "nexus": - from temporalio.streams.providers.nexus import TemporalStreamsHandler + from temporalio.streams.providers.nexus import ( + NexusStreams, + TemporalStreamsHandler, + ) workers.append( Worker( @@ -124,8 +91,8 @@ async def main() -> None: nexus_service_handlers=[TemporalStreamsHandler(provider, client)], ) ) + front = NexusStreams(endpoint=args.endpoint, http_address=args.http) - front = outside_surface(args, provider) try: async with contextlib.AsyncExitStack() as running: for worker in workers: @@ -135,11 +102,17 @@ async def main() -> None: ) print(f"provider={args.provider} workflow={workflow_id}") + # The same handle either way: from the Nexus front when there is + # one, otherwise from the provider registered on the client. + stream: StreamHandle = ( + front.get_stream_handle(client, workflow_id) + if front is not None + else client.get_stream_handle(workflow_id) + ) # Counted apart: a retried generator makes the workflow retract the # earlier attempt, and those records are correct output rather than # echoes that the workflow's own count would have to agree with. echoes = retractions = 0 - stream = front.get_stream_handle(client, workflow_id) # The read ends by itself once the workflow is closed and the tail # has been delivered, on every provider. async for record in stream.read(topic=DECISIONS, result_type=dict): @@ -159,7 +132,7 @@ async def main() -> None: f"{retractions} retractions" ) finally: - if front is not provider: + if front is not None: await front.close() await provider.close() From 065fddb61ebb2e064ed5581aed39842c5863001b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 10:44:16 -0700 Subject: [PATCH 532/831] Added one example per path and the README that maps each to its call. Path A publishes from a workflow and follows from a backend, Path B produces from an Activity and a backend and consumes with supersession handling, Path C consumes in a workflow with the cache off. --- examples/streams/README.md | 47 ++++++++++ examples/streams/_setup.py | 52 ++++++++++++ examples/streams/path_a_publish.py | 70 +++++++++++++++ examples/streams/path_b_produce.py | 132 +++++++++++++++++++++++++++++ examples/streams/path_c_consume.py | 92 ++++++++++++++++++++ 5 files changed, 393 insertions(+) create mode 100644 examples/streams/README.md create mode 100644 examples/streams/_setup.py create mode 100644 examples/streams/path_a_publish.py create mode 100644 examples/streams/path_b_produce.py create mode 100644 examples/streams/path_c_consume.py diff --git a/examples/streams/README.md b/examples/streams/README.md new file mode 100644 index 000000000..ca912114e --- /dev/null +++ b/examples/streams/README.md @@ -0,0 +1,47 @@ +# Streams, by path + +One provider, registered once on the client. Workers built from that client +inherit it, and every context asks for its stream the same way. + +```python +client = await Client.connect("localhost:7233", plugins=[provider]) +``` + +| Path | Who | Call | Example file | +|---|---|---|---| +| A: the workflow publishes | workflow code | `workflow.stream_writer(topic).publish(value)`, then `.finish()` | `path_a_publish.py` | +| A: a backend follows | any process with a client | `client.get_stream_handle(workflow_id).read(topic=..., after=await stream.latest(topic=...))` | `path_a_publish.py` | +| B: an Activity produces | activity code | `activity.stream_handle().producer(topic=...).append(...)` | `path_b_produce.py` | +| B: a backend produces | any process with a client | `client.get_stream_handle(workflow_id).producer(topic=..., producer_id=..., attempt=...)` | `path_b_produce.py` | +| B: a backend consumes | any process with a client | `client.get_stream_handle(workflow_id).read(topic=..., result_type=...)` | `path_b_produce.py` | +| C: the workflow consumes | workflow code | `async for record in workflow.stream_reader(topic, result_type=...)` | `path_c_consume.py` | + +`agent.py` and `run.py` compose all three paths in one agent, on every provider +and behind the Nexus front. `_setup.py` is the one place a store is named. + +## Running + +Each example takes the provider's name and runs against a dev server: + +```sh +python -m examples.streams.path_a_publish workflow_streams +python -m examples.streams.path_a_publish native --address 127.0.0.1:7333 +python -m examples.streams.path_a_publish redis --redis redis://127.0.0.1:6379 +``` + +Swap `path_a_publish` for `path_b_produce`, `path_c_consume` or `run`. The +`native` provider needs a server built from the stream-carrying branch; the +`redis` provider needs a Redis to point at. `run.py` also takes `nexus`, with +an endpoint routed to the handler worker's task queue. + +## Why the workflow's verbs differ + +An Activity and a backend hold the same `StreamHandle`, with the same verbs, +because both act on the store at once: a producer's records are visible as +soon as the store accepts them, and a read follows the store live. Workflow +code gets two verbs of its own because its semantics differ. `publish` is +buffered and commits with the Workflow Task, so no reader can see a record +from a task that failed, and a `stream_reader` is an observation the SDK +records, so replay re-supplies the same records in the same order. That is +why `publish` is a plain call and the reader is an async iterator, and why +neither takes a client. diff --git a/examples/streams/_setup.py b/examples/streams/_setup.py new file mode 100644 index 000000000..7ded3f1f8 --- /dev/null +++ b/examples/streams/_setup.py @@ -0,0 +1,52 @@ +"""Provider selection for the examples: the one place a store is named. + +Every example takes the provider's name on the command line, builds it here, +and registers it once on the client. Nothing else in the examples names a +store: workers built from the client inherit the provider, and each context +asks for its stream through ``workflow.stream_reader`` or +``workflow.stream_writer``, ``activity.stream_handle()`` and +``client.get_stream_handle()``. +""" + +from __future__ import annotations + +import argparse + +from temporalio.client import Client +from temporalio.streams.providers import ProviderPlugin + +PROVIDERS = ("workflow_streams", "native", "redis") + + +def parser(description: str) -> argparse.ArgumentParser: + """The flags every example shares.""" + parser = argparse.ArgumentParser(description=description) + parser.add_argument("provider", choices=PROVIDERS) + parser.add_argument("--address", default="localhost:7233") + parser.add_argument("--redis", default="redis://127.0.0.1:6379") + return parser + + +def make_provider(name: str, args: argparse.Namespace) -> ProviderPlugin: + """The whole difference between the stores: one constructor call.""" + if name == "workflow_streams": + from temporalio.streams.providers.workflow_streams import ( + WorkflowStreamsProvider, + ) + + return WorkflowStreamsProvider() + if name == "redis": + from temporalio.streams.providers.redis import RedisStreams + + return RedisStreams(url=args.redis) + if name == "native": + from temporalio.streams.providers.native import NativeStreams + + return NativeStreams() + raise SystemExit(f"unknown provider {name}") + + +async def connect(args: argparse.Namespace) -> tuple[Client, ProviderPlugin]: + """A client with the provider registered on it, and the provider to close later.""" + provider = make_provider(args.provider, args) + return await Client.connect(args.address, plugins=[provider]), provider diff --git a/examples/streams/path_a_publish.py b/examples/streams/path_a_publish.py new file mode 100644 index 000000000..8eac7f68a --- /dev/null +++ b/examples/streams/path_a_publish.py @@ -0,0 +1,70 @@ +"""Path A: the workflow publishes, and a backend follows from now. + + python -m examples.streams.path_a_publish workflow_streams + python -m examples.streams.path_a_publish native --address 127.0.0.1:7333 + python -m examples.streams.path_a_publish redis --redis redis://127.0.0.1:6379 + +The workflow reports its progress on a topic with ``workflow.stream_writer``. +``publish`` is a plain call: the record is buffered and commits with the +Workflow Task, so a reader never sees a step the workflow did not commit. The +backend positions itself with ``latest()`` and reads what comes after, the +way a UI attaches to a job that is already running; the read ends by itself +once the workflow is closed and the tail has been delivered. +""" + +from __future__ import annotations + +import asyncio +import uuid +from datetime import timedelta + +from examples.streams import _setup +from temporalio import workflow +from temporalio.worker import Worker + +PROGRESS = "progress" + + +@workflow.defn +class Job: + """Works through ``steps`` and publishes each one on ``progress``.""" + + @workflow.run + async def run(self, steps: int) -> int: + """Publish one record per step, then finish the topic.""" + progress = workflow.stream_writer(PROGRESS) + for step in range(steps): + progress.publish({"step": step, "of": steps}) + # A timer between steps, so each record commits with its own + # Workflow Task and a follower sees them arrive one at a time. + await workflow.sleep(timedelta(milliseconds=200)) + progress.finish() + return steps + + +async def main() -> None: + """Run the job and follow its progress from outside.""" + args = _setup.parser(__doc__ or "").parse_args() + client, provider = await _setup.connect(args) + workflow_id = f"path-a-{uuid.uuid4().hex[:8]}" + task_queue = f"tq-{workflow_id}" + try: + async with Worker(client, task_queue=task_queue, workflows=[Job]): + handle = await client.start_workflow( + Job.run, 5, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + # Follow from now: whatever landed before this point is not + # re-read, which is how a client attaches to a running job. + since = await stream.latest(topic=PROGRESS) + async for record in stream.read( + topic=PROGRESS, after=since, result_type=dict + ): + print(f" {record.kind.name:7} {record.value} at {record.cursor.token}") + print(f"workflow {workflow_id} took {await handle.result()} steps") + finally: + await provider.close() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/path_b_produce.py b/examples/streams/path_b_produce.py new file mode 100644 index 000000000..c6dc9729d --- /dev/null +++ b/examples/streams/path_b_produce.py @@ -0,0 +1,132 @@ +"""Path B: an Activity and a backend produce, and a backend consumes. + + python -m examples.streams.path_b_produce workflow_streams + python -m examples.streams.path_b_produce native --address 127.0.0.1:7333 + python -m examples.streams.path_b_produce redis --redis redis://127.0.0.1:6379 + +Outside workflow code a stream is reached through a handle: an Activity asks +its context with ``activity.stream_handle()``, which is its own workflow +pinned to its run, and a backend asks its client with +``client.get_stream_handle(workflow_id)``. Both hand out the same handle, +with the same verbs. A producer writes on its own account, visible as soon +as the store accepts the record, under an identity that lets readers tell a +retry from a new attempt: the Activity's producer takes the Activity's own id +and attempt, a backend names its own. + +The model Activity here fails halfway through its first attempt. Its retry +starts over, and the consumer sees that as a ``SUPERSEDED`` record before the +new attempt's first token, so it can drop what the earlier attempt produced. +""" + +from __future__ import annotations + +import asyncio +import uuid +from datetime import timedelta +from typing import Any + +from examples.streams import _setup +from temporalio import activity, workflow +from temporalio.common import RetryPolicy +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +INPUTS = "inputs" +NOTES = "notes" + + +@activity.defn +async def generate(count: int) -> None: + """Stream ``count`` tokens onto this workflow's ``inputs`` topic. + + No workflow id and no run id: the handle is this Activity's own + workflow, pinned to its run, and the producer's identity is the + Activity's, so a retry deduplicates and a new attempt is reported. + """ + model = activity.stream_handle().producer(topic=INPUTS) + for n in range(count): + await model.append({"token": n}) + if n == 1 and activity.info().attempt == 1: + raise RuntimeError("the model connection dropped") + await model.finish() + + +@workflow.defn +class Session: + """Runs the model, then stays open until the backend has said its piece.""" + + def __init__(self) -> None: + """Start open.""" + self._closed = False + + @workflow.signal + def close(self) -> None: + """Let the run end; a backend producer needs the run open to append.""" + self._closed = True + + @workflow.run + async def run(self, count: int) -> None: + """Generate ``count`` tokens, then wait to be closed.""" + await workflow.execute_activity( + generate, + count, + start_to_close_timeout=timedelta(minutes=1), + retry_policy=RetryPolicy( + initial_interval=timedelta(milliseconds=100), maximum_attempts=3 + ), + ) + await workflow.wait_condition(lambda: self._closed) + + +async def main() -> None: + """Run the session; produce from the backend; consume both topics.""" + args = _setup.parser(__doc__ or "").parse_args() + client, provider = await _setup.connect(args) + workflow_id = f"path-b-{uuid.uuid4().hex[:8]}" + task_queue = f"tq-{workflow_id}" + try: + async with Worker( + client, task_queue=task_queue, workflows=[Session], activities=[generate] + ): + handle = await client.start_workflow( + Session.run, 3, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + + # A backend producer names its own identity. + notes = stream.producer(topic=NOTES, producer_id="operator", attempt=1) + await notes.append({"note": "reviewing this session"}) + await notes.finish() + + # A backend consumer keeps the tokens per attempt and drops an + # attempt the moment a newer one starts writing. + tokens: dict[int, list[Any]] = {} + async for record in stream.read(topic=INPUTS, result_type=dict): + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + dropped = tokens.pop(record.supersession.previous_attempt, []) + print( + f" attempt {record.supersession.previous_attempt} superseded" + ) + print(f" dropped {dropped}") + continue + if record.kind is RecordKind.FINISH: + print(f" {record.producer_id} attempt {record.attempt} finished") + break + assert record.value is not None + tokens.setdefault(record.attempt, []).append(record.value["token"]) + print(f"kept {tokens}") + + async for record in stream.read(topic=NOTES, result_type=dict): + if record.kind is RecordKind.FINISH: + break + print(f" note from {record.producer_id}: {record.value}") + + await handle.signal(Session.close) + await handle.result() + finally: + await provider.close() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/path_c_consume.py b/examples/streams/path_c_consume.py new file mode 100644 index 000000000..5d77771f9 --- /dev/null +++ b/examples/streams/path_c_consume.py @@ -0,0 +1,92 @@ +"""Path C: the workflow consumes a topic fed from outside, with a cold cache. + + python -m examples.streams.path_c_consume workflow_streams + python -m examples.streams.path_c_consume native --address 127.0.0.1:7333 + python -m examples.streams.path_c_consume redis --redis redis://127.0.0.1:6379 + +The workflow reads its ``commands`` topic with ``workflow.stream_reader`` and +runs an Activity for each record. A read is an observation the SDK records: +what the reader handed to workflow code commits with the Workflow Task, so +replay re-supplies the same records in the same order and each Activity +result is matched to the command that caused it. The worker runs with the +workflow cache off, so every Workflow Task rebuilds the workflow from History +and the loop completing at all is the proof. +""" + +from __future__ import annotations + +import asyncio +import uuid +from datetime import timedelta +from typing import Any + +from examples.streams import _setup +from temporalio import activity, workflow +from temporalio.streams import RecordKind +from temporalio.worker import Worker + +COMMANDS = "commands" + + +@activity.defn +async def apply(command: dict[str, Any]) -> str: + """Carry out one command.""" + return f"applied {command['op']}" + + +@workflow.defn +class Controller: + """Acts on each command as it arrives, until the sender finishes.""" + + @workflow.run + async def run(self) -> list[str]: + """Return what was applied, in the order the commands arrived.""" + commands = workflow.stream_reader(COMMANDS, result_type=dict) + applied: list[str] = [] + async for record in commands: + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + assert record.value is not None + applied.append( + await workflow.execute_activity( + apply, record.value, start_to_close_timeout=timedelta(minutes=1) + ) + ) + return applied + + +async def main() -> None: + """Feed commands from the backend, one at a time, and print what was applied.""" + args = _setup.parser(__doc__ or "").parse_args() + client, provider = await _setup.connect(args) + workflow_id = f"path-c-{uuid.uuid4().hex[:8]}" + task_queue = f"tq-{workflow_id}" + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[Controller], + activities=[apply], + # Off, so every task replays the recorded reads from History. + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Controller.run, id=workflow_id, task_queue=task_queue + ) + console = client.get_stream_handle(workflow_id).producer( + topic=COMMANDS, producer_id="console", attempt=1 + ) + for op in ("open", "resize", "close"): + await console.append({"op": op}) + # Spaced out, so the commands arrive across several tasks. + await asyncio.sleep(0.3) + await console.finish() + print(f"workflow {workflow_id} applied {await handle.result()}") + finally: + await provider.close() + + +if __name__ == "__main__": + asyncio.run(main()) From 535b5610ea4fc1eeb5552d21e9e00c6aec82c00d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 11:03:57 -0700 Subject: [PATCH 533/831] Moved the examples onto typed topic definitions. Each example defines its topics once, with the dataclass its records carry, and the workflow, the Activity and the backend refer to that one definition, so no call passes result_type. --- examples/streams/README.md | 22 ++++++++----- examples/streams/agent.py | 39 +++++++++++++++++------ examples/streams/path_a_publish.py | 34 +++++++++++++------- examples/streams/path_b_produce.py | 50 ++++++++++++++++++++---------- examples/streams/path_c_consume.py | 35 +++++++++++++-------- examples/streams/run.py | 5 +-- 6 files changed, 125 insertions(+), 60 deletions(-) diff --git a/examples/streams/README.md b/examples/streams/README.md index ca912114e..adb2ae0d7 100644 --- a/examples/streams/README.md +++ b/examples/streams/README.md @@ -1,20 +1,28 @@ # Streams, by path One provider, registered once on the client. Workers built from that client -inherit it, and every context asks for its stream the same way. +inherit it, and every context asks for its stream the same way. A topic is +defined once, with the type its records carry, and every context refers to +that definition, so no call names a type again. ```python client = await Client.connect("localhost:7233", plugins=[provider]) + +INPUTS = streams.topic("inputs", Token) +DECISIONS = streams.topic("decisions", Decision) ``` | Path | Who | Call | Example file | |---|---|---|---| -| A: the workflow publishes | workflow code | `workflow.stream_writer(topic).publish(value)`, then `.finish()` | `path_a_publish.py` | -| A: a backend follows | any process with a client | `client.get_stream_handle(workflow_id).read(topic=..., after=await stream.latest(topic=...))` | `path_a_publish.py` | -| B: an Activity produces | activity code | `activity.stream_handle().producer(topic=...).append(...)` | `path_b_produce.py` | -| B: a backend produces | any process with a client | `client.get_stream_handle(workflow_id).producer(topic=..., producer_id=..., attempt=...)` | `path_b_produce.py` | -| B: a backend consumes | any process with a client | `client.get_stream_handle(workflow_id).read(topic=..., result_type=...)` | `path_b_produce.py` | -| C: the workflow consumes | workflow code | `async for record in workflow.stream_reader(topic, result_type=...)` | `path_c_consume.py` | +| A: the workflow publishes | workflow code | `workflow.stream_writer(DECISIONS).publish(Decision(...))`, then `.finish()` | `path_a_publish.py` | +| A: a backend follows | any process with a client | `stream = client.get_stream_handle(workflow_id)`, then `stream.read(topic=DECISIONS, after=await stream.latest(topic=DECISIONS))` | `path_a_publish.py` | +| B: an Activity produces | activity code | `activity.stream_handle().producer(topic=INPUTS).append(Token(...))` | `path_b_produce.py` | +| B: a backend produces | any process with a client | `client.get_stream_handle(workflow_id).producer(topic=INPUTS, producer_id=..., attempt=...)` | `path_b_produce.py` | +| B: a backend consumes | any process with a client | `client.get_stream_handle(workflow_id).read(topic=INPUTS)` | `path_b_produce.py` | +| C: the workflow consumes | workflow code | `async for record in workflow.stream_reader(INPUTS)` | `path_c_consume.py` | + +A plain string names a topic decided at runtime, with `result_type=` on the +call; the examples never need one. `agent.py` and `run.py` compose all three paths in one agent, on every provider and behind the Nexus front. `_setup.py` is the one place a store is named. diff --git a/examples/streams/agent.py b/examples/streams/agent.py index 67a643232..e6d838bb1 100644 --- a/examples/streams/agent.py +++ b/examples/streams/agent.py @@ -1,6 +1,8 @@ """The workflow and activities. Identical on every provider. -Nothing here names a store, a transport, or an option. The loop reads its +Nothing here names a store, a transport, or an option. The two topics are +defined once, with the types their records carry, and the workflow, the +Activity and the backend in ``run.py`` all refer to them. The loop reads its ``inputs`` topic, decides, publishes the decision, and runs an ordinary activity in the same workflow task, which is the shape the design doc calls Paths A, B and C together. The Activity that streams model output asks its @@ -10,14 +12,31 @@ from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta -from temporalio import activity, workflow +from temporalio import activity, streams, workflow from temporalio.common import RetryPolicy from temporalio.streams import RecordKind -INPUTS = "inputs" -DECISIONS = "decisions" + +@dataclass +class Token: + """One piece of model output.""" + + n: int + + +@dataclass +class Decision: + """What the workflow decided about a token, or which attempt it retracted.""" + + echo: int | None = None + retracting_attempt: int | None = None + + +INPUTS = streams.topic("inputs", Token) +DECISIONS = streams.topic("decisions", Decision) @activity.defn @@ -31,14 +50,14 @@ async def generate(count: int) -> None: """ model = activity.stream_handle().producer(topic=INPUTS) for n in range(count): - await model.append({"n": n}) + await model.append(Token(n)) await model.finish() @activity.defn -async def record_decision(decision: dict) -> str: +async def record_decision(decision: Decision) -> str: """An ordinary activity, run from the same task that read and published.""" - return f"recorded {decision['echo']}" + return f"recorded {decision.echo}" @workflow.defn @@ -48,7 +67,7 @@ class Agent: @workflow.run async def run(self, count: int) -> int: """Decide on at most ``count`` inputs, then return how many landed.""" - inputs = workflow.stream_reader(INPUTS, result_type=dict) + inputs = workflow.stream_reader(INPUTS) decisions = workflow.stream_writer(DECISIONS) generating = workflow.start_activity( @@ -67,12 +86,12 @@ async def run(self, count: int) -> int: if record.kind is RecordKind.SUPERSEDED: assert record.supersession is not None decisions.publish( - {"retracting_attempt": record.supersession.previous_attempt} + Decision(retracting_attempt=record.supersession.previous_attempt) ) continue assert record.value is not None seen += 1 - decision = {"echo": record.value["n"]} + decision = Decision(echo=record.value.n) decisions.publish(decision) await workflow.execute_activity( record_decision, diff --git a/examples/streams/path_a_publish.py b/examples/streams/path_a_publish.py index 8eac7f68a..1e1eaf77d 100644 --- a/examples/streams/path_a_publish.py +++ b/examples/streams/path_a_publish.py @@ -4,25 +4,37 @@ python -m examples.streams.path_a_publish native --address 127.0.0.1:7333 python -m examples.streams.path_a_publish redis --redis redis://127.0.0.1:6379 -The workflow reports its progress on a topic with ``workflow.stream_writer``. -``publish`` is a plain call: the record is buffered and commits with the -Workflow Task, so a reader never sees a step the workflow did not commit. The -backend positions itself with ``latest()`` and reads what comes after, the -way a UI attaches to a job that is already running; the read ends by itself -once the workflow is closed and the tail has been delivered. +The topic is defined once, with the type its records carry, and both sides +refer to that definition. The workflow reports its progress on it with +``workflow.stream_writer``; ``publish`` is a plain call, the record is +buffered and commits with the Workflow Task, so a reader never sees a step +the workflow did not commit. The backend positions itself with ``latest()`` +and reads what comes after, the way a UI attaches to a job that is already +running; the read ends by itself once the workflow is closed and the tail +has been delivered. """ from __future__ import annotations import asyncio import uuid +from dataclasses import dataclass from datetime import timedelta from examples.streams import _setup -from temporalio import workflow +from temporalio import streams, workflow from temporalio.worker import Worker -PROGRESS = "progress" + +@dataclass +class Progress: + """One step of the job, as published.""" + + step: int + of: int + + +PROGRESS = streams.topic("progress", Progress) @workflow.defn @@ -34,7 +46,7 @@ async def run(self, steps: int) -> int: """Publish one record per step, then finish the topic.""" progress = workflow.stream_writer(PROGRESS) for step in range(steps): - progress.publish({"step": step, "of": steps}) + progress.publish(Progress(step=step, of=steps)) # A timer between steps, so each record commits with its own # Workflow Task and a follower sees them arrive one at a time. await workflow.sleep(timedelta(milliseconds=200)) @@ -57,9 +69,7 @@ async def main() -> None: # Follow from now: whatever landed before this point is not # re-read, which is how a client attaches to a running job. since = await stream.latest(topic=PROGRESS) - async for record in stream.read( - topic=PROGRESS, after=since, result_type=dict - ): + async for record in stream.read(topic=PROGRESS, after=since): print(f" {record.kind.name:7} {record.value} at {record.cursor.token}") print(f"workflow {workflow_id} took {await handle.result()} steps") finally: diff --git a/examples/streams/path_b_produce.py b/examples/streams/path_b_produce.py index c6dc9729d..782a5ffa0 100644 --- a/examples/streams/path_b_produce.py +++ b/examples/streams/path_b_produce.py @@ -8,10 +8,12 @@ its context with ``activity.stream_handle()``, which is its own workflow pinned to its run, and a backend asks its client with ``client.get_stream_handle(workflow_id)``. Both hand out the same handle, -with the same verbs. A producer writes on its own account, visible as soon -as the store accepts the record, under an identity that lets readers tell a -retry from a new attempt: the Activity's producer takes the Activity's own id -and attempt, a backend names its own. +with the same verbs, and both refer to the topics defined once below, so the +producer's ``append`` and the consumer's records are typed the same way. A +producer writes on its own account, visible as soon as the store accepts the +record, under an identity that lets readers tell a retry from a new attempt: +the Activity's producer takes the Activity's own id and attempt, a backend +names its own. The model Activity here fails halfway through its first attempt. Its retry starts over, and the consumer sees that as a ``SUPERSEDED`` record before the @@ -22,17 +24,32 @@ import asyncio import uuid +from dataclasses import dataclass from datetime import timedelta -from typing import Any from examples.streams import _setup -from temporalio import activity, workflow +from temporalio import activity, streams, workflow from temporalio.common import RetryPolicy from temporalio.streams import RecordKind from temporalio.worker import Worker -INPUTS = "inputs" -NOTES = "notes" + +@dataclass +class Token: + """One piece of model output.""" + + n: int + + +@dataclass +class Note: + """A remark a backend attaches to the session.""" + + text: str + + +INPUTS = streams.topic("inputs", Token) +NOTES = streams.topic("notes", Note) @activity.defn @@ -45,7 +62,7 @@ async def generate(count: int) -> None: """ model = activity.stream_handle().producer(topic=INPUTS) for n in range(count): - await model.append({"token": n}) + await model.append(Token(n)) if n == 1 and activity.info().attempt == 1: raise RuntimeError("the model connection dropped") await model.finish() @@ -95,13 +112,13 @@ async def main() -> None: # A backend producer names its own identity. notes = stream.producer(topic=NOTES, producer_id="operator", attempt=1) - await notes.append({"note": "reviewing this session"}) + await notes.append(Note("reviewing this session")) await notes.finish() # A backend consumer keeps the tokens per attempt and drops an # attempt the moment a newer one starts writing. - tokens: dict[int, list[Any]] = {} - async for record in stream.read(topic=INPUTS, result_type=dict): + tokens: dict[int, list[int]] = {} + async for record in stream.read(topic=INPUTS): if record.kind is RecordKind.SUPERSEDED: assert record.supersession is not None dropped = tokens.pop(record.supersession.previous_attempt, []) @@ -114,13 +131,14 @@ async def main() -> None: print(f" {record.producer_id} attempt {record.attempt} finished") break assert record.value is not None - tokens.setdefault(record.attempt, []).append(record.value["token"]) + tokens.setdefault(record.attempt, []).append(record.value.n) print(f"kept {tokens}") - async for record in stream.read(topic=NOTES, result_type=dict): - if record.kind is RecordKind.FINISH: + async for note in stream.read(topic=NOTES): + if note.kind is RecordKind.FINISH: break - print(f" note from {record.producer_id}: {record.value}") + assert note.value is not None + print(f" note from {note.producer_id}: {note.value.text}") await handle.signal(Session.close) await handle.result() diff --git a/examples/streams/path_c_consume.py b/examples/streams/path_c_consume.py index 5d77771f9..4537e2318 100644 --- a/examples/streams/path_c_consume.py +++ b/examples/streams/path_c_consume.py @@ -5,33 +5,42 @@ python -m examples.streams.path_c_consume redis --redis redis://127.0.0.1:6379 The workflow reads its ``commands`` topic with ``workflow.stream_reader`` and -runs an Activity for each record. A read is an observation the SDK records: -what the reader handed to workflow code commits with the Workflow Task, so -replay re-supplies the same records in the same order and each Activity -result is matched to the command that caused it. The worker runs with the -workflow cache off, so every Workflow Task rebuilds the workflow from History -and the loop completing at all is the proof. +runs an Activity for each record; the topic is defined once, so the reader's +records and the Activity's argument share one type. A read is an observation +the SDK records: what the reader handed to workflow code commits with the +Workflow Task, so replay re-supplies the same records in the same order and +each Activity result is matched to the command that caused it. The worker +runs with the workflow cache off, so every Workflow Task rebuilds the +workflow from History and the loop completing at all is the proof. """ from __future__ import annotations import asyncio import uuid +from dataclasses import dataclass from datetime import timedelta -from typing import Any from examples.streams import _setup -from temporalio import activity, workflow +from temporalio import activity, streams, workflow from temporalio.streams import RecordKind from temporalio.worker import Worker -COMMANDS = "commands" + +@dataclass +class Command: + """One instruction from the console.""" + + op: str + + +COMMANDS = streams.topic("commands", Command) @activity.defn -async def apply(command: dict[str, Any]) -> str: +async def apply(command: Command) -> str: """Carry out one command.""" - return f"applied {command['op']}" + return f"applied {command.op}" @workflow.defn @@ -41,7 +50,7 @@ class Controller: @workflow.run async def run(self) -> list[str]: """Return what was applied, in the order the commands arrived.""" - commands = workflow.stream_reader(COMMANDS, result_type=dict) + commands = workflow.stream_reader(COMMANDS) applied: list[str] = [] async for record in commands: if record.kind is RecordKind.FINISH: @@ -79,7 +88,7 @@ async def main() -> None: topic=COMMANDS, producer_id="console", attempt=1 ) for op in ("open", "resize", "close"): - await console.append({"op": op}) + await console.append(Command(op)) # Spaced out, so the commands arrive across several tasks. await asyncio.sleep(0.3) await console.finish() diff --git a/examples/streams/run.py b/examples/streams/run.py index 2317d62e9..824975c34 100644 --- a/examples/streams/run.py +++ b/examples/streams/run.py @@ -115,13 +115,14 @@ async def main() -> None: echoes = retractions = 0 # The read ends by itself once the workflow is closed and the tail # has been delivered, on every provider. - async for record in stream.read(topic=DECISIONS, result_type=dict): + async for record in stream.read(topic=DECISIONS): print( f" {record.kind.name:11} {record.value} at {record.cursor.token}" ) if record.kind is not RecordKind.DATA: continue - if isinstance(record.value, dict) and "echo" in record.value: + assert record.value is not None + if record.value.echo is not None: echoes += 1 else: retractions += 1 From a9bda0f4ccd1bf19c2f3770d061f2aec2f07dacb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 14:03:15 -0700 Subject: [PATCH 534/831] Matched the Redis live module to typed topic definitions. A read that passes a definition may not also pass result_type, and a record's topic is the definition's name. --- tests/streams/test_redis_replay.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index b3c4e3ee3..4ee50e68b 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -81,7 +81,7 @@ async def test_interface_loop_over_redis(live_client: Client, provider: RedisStr await producer.append({"n": 3}) await producer.finish() - records = await take(stream.read(topic=DECISIONS, result_type=dict), 4, 60) + records = await take(stream.read(topic=DECISIONS), 4, 60) assert [r.kind for r in records] == [ RecordKind.DATA, RecordKind.DATA, @@ -89,7 +89,7 @@ async def test_interface_loop_over_redis(live_client: Client, provider: RedisStr RecordKind.FINISH, ] assert [r.value["decided"] for r in records[:3]] == [1, 2, 3] - assert all(r.producer_id == "" and r.topic == DECISIONS for r in records) + assert all(r.producer_id == "" and r.topic == DECISIONS.name for r in records) assert await handle.result() == [ {"kind": "decision", "n": 1, "attempt": 1}, {"kind": "decision", "n": 2, "attempt": 1}, @@ -101,7 +101,7 @@ async def test_interface_loop_over_redis(live_client: Client, provider: RedisStr # promoted record has been handed over. async def read_everything() -> list[Any]: return [ - r.value async for r in stream.read(topic=DECISIONS, result_type=dict) + r.value async for r in stream.read(topic=DECISIONS) ] assert await asyncio.wait_for(read_everything(), 60) == [ @@ -112,7 +112,7 @@ async def read_everything() -> list[Any]: ] # The producer's own records are readable from outside as well, on # the topic it wrote. - inputs = await take(stream.read(topic=INPUTS, result_type=dict), 4, 60) + inputs = await take(stream.read(topic=INPUTS), 4, 60) assert [r.value for r in inputs[:3]] == [{"n": 1}, {"n": 2}, {"n": 3}] assert inputs[3].kind is RecordKind.FINISH assert all(r.producer_id == "model" and r.attempt == 1 for r in inputs) @@ -138,7 +138,7 @@ async def test_an_outside_producer_and_the_workflow_share_a_topic( await handle.result() async def read_everything() -> list[Any]: - return [r async for r in stream.read(topic=DECISIONS, result_type=dict)] + return [r async for r in stream.read(topic=DECISIONS)] records = await asyncio.wait_for(read_everything(), 60) # Both writers land on one topic, each under its own identity. The order From 62b57e33e03b59e571537183331551154ff6ae61 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 14:17:38 -0700 Subject: [PATCH 535/831] Seeded a Redis workflow reader from a cursor. The runtime and the manager already take a start cursor and the marker header records it; only `subscribe()` had no way to pass one. The provider now seeds the subscription from a `redis:in:` cursor instead of refusing it, and refuses an outside cursor because the two streams number entries apart. --- .../contrib/external_workflow_streams/_api.py | 19 ++++- temporalio/streams/providers/redis.py | 43 +++++++--- .../external_workflow_streams/test_api.py | 18 +++++ tests/streams/test_redis_provider.py | 20 ++++- tests/streams/test_redis_replay.py | 81 ++++++++++++++++--- 5 files changed, 160 insertions(+), 21 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index 0a373b10b..1da059d80 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -35,6 +35,7 @@ classify_read_failure, ) from temporalio.contrib.external_workflow_streams._record import ( + Cursor, Offset, StreamRecord, ) @@ -95,6 +96,7 @@ def register( wait_id: int, stream_key: StreamKey, idle_timeout: timedelta, + start_cursor: Cursor | None = None, ) -> None: """Registers a wait with the Worker's subscription manager. @@ -267,7 +269,9 @@ class ExternalStreamTopic(Generic[AnyType]): value_type: type[AnyType] | None options: ExternalStreamOptions - def subscribe(self) -> ExternalStreamSubscription[AnyType]: + def subscribe( + self, *, start_cursor: Cursor | None = None + ) -> ExternalStreamSubscription[AnyType]: """Starts a new subscription and returns its async iterator. Each call is an **independent** subscription with its own ``wait_id``, @@ -278,6 +282,13 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: the same hazard class as timers and activities: inserting, removing, or reordering a ``subscribe()`` call renumbers every later wait in the Run and must be gated behind ``workflow.patched()``. + + Args: + start_cursor: The boundary the subscription begins after. ``None`` + resumes where the predecessor Run committed this wait, or at + ``BEGINNING`` on a first execution. A boundary the Workflow + names is recorded in the marker's header like the restored one, + so it must be derived deterministically: replay names it again. """ state = _run_state() if state.runtime is None: @@ -289,6 +300,11 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: state.next_wait_id += 1 stream_key = state.runtime.stream_key(self.name) + # Only a named boundary travels; the runtime derives the default itself + # from the predecessor Run's continuation. + start: dict[str, Any] = ( + {} if start_cursor is None else {"start_cursor": start_cursor} + ) state.runtime.register( wait_id=wait_id, stream_key=stream_key, @@ -299,6 +315,7 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: # `with_options` was given, so no configured value can ever reach # the reduction and every set parks after one second. idle_timeout=self.options.idle_timeout, + **start, ) # Registering a wait is not blocking on one. The quiescent snapshot is a # request to Core to retain the Workflow Task and, once the idle timer diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 0a345ae98..c6972cc84 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -23,9 +23,11 @@ is ``producer#attempt`` and every record carries a sequence, so a retried batch is dropped with the original position and a new attempt passes. - Cursors are ``redis:-`` on the outside surface and name a position - in the output stream. A workflow-side record carries ``redis:in:-`` - for information only: the transport starts a run's subscription where the - chain left off, so a workflow reader cannot resume from a cursor. + in the output stream. A workflow-side record carries ``redis:in:-``, + a position in the input stream, and only that form seeds a workflow reader: + the two streams number their entries independently, so an outside cursor + cannot stand in for one. A reader opened without a cursor starts where the + chain's predecessor run committed, which is the transport's own rule. - Streams are keyed by the chain's first run, so a handle follows continue-as- new by construction and ``run_id`` only decides whose close ends a read. - A task's publishes are staged as one batch. The transport's own per-task @@ -84,7 +86,6 @@ StreamError, StreamNotFoundError, StreamProducerError, - StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -141,6 +142,26 @@ def _outside_position(after: Cursor) -> Offset | None: return Offset(token) +def _workflow_position(after: Cursor) -> Offset | None: + """The input-stream offset a workflow reader's cursor names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + if token.startswith(_INPUT_PREFIX): + entry = token[len(_INPUT_PREFIX) :] + if _REDIS_ID.fullmatch(entry): + return Offset(entry) + elif _REDIS_ID.fullmatch(token): + raise StreamCursorError( + f"cursor {after.token!r} names a position in the topic's output stream; " + "a workflow reader follows the input stream, whose entry ids differ, so " + "pass a cursor a workflow reader returned" + ) + raise StreamCursorError( + f"cursor {after.token!r} does not name a Redis stream position" + ) + + def _drive(coroutine: Coroutine[Any, Any, None]) -> None: """Run a transport publish to completion without yielding to the loop. @@ -209,12 +230,14 @@ def __init__(self, idle_timeout: timedelta) -> None: def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: _require_topic(topic) - if cursor_position(after, provider=_PROVIDER) is not None: - raise StreamUnsupportedError( - "the redis provider starts a run's subscription where the chain " - "left off; it cannot resume a workflow reader from a cursor" - ) - return _RedisReadSource(self._input.topic(topic, type=bytes).subscribe()) + position = _workflow_position(after) + # Without a position the transport resumes where the chain's + # predecessor run committed; with one, that is where the wait starts + # and what the marker's header records. + start = None if position is None else AFTER(position) + return _RedisReadSource( + self._input.topic(topic, type=bytes).subscribe(start_cursor=start) + ) def open_writer(self, topic: str) -> WriteSink: _require_topic(topic) diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 236d0b614..18095c310 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -30,6 +30,8 @@ ) from temporalio.contrib.external_workflow_streams._manager import PreparedRecord from temporalio.contrib.external_workflow_streams._record import ( + AFTER, + Cursor, Offset, RecordKind, StreamRecord, @@ -48,6 +50,7 @@ def __init__(self) -> None: #: `wait_id -> configured idle timeout`, so a test can see that the #: value `with_options` was given actually reached the Worker. self.idle_timeouts: dict[int, timedelta] = {} + self.start_cursors: dict[int, Cursor | None] = {} self.buffers: dict[int, list[StreamRecord]] = {} self.deliveries: list[tuple[int, StreamRecord]] = [] self.consumed: list[tuple[int, StreamRecord]] = [] @@ -72,9 +75,11 @@ def register( wait_id: int, stream_key: StreamKey, idle_timeout: timedelta, + start_cursor: Cursor | None = None, ) -> None: self.registrations.append((wait_id, stream_key)) self.idle_timeouts[wait_id] = idle_timeout + self.start_cursors[wait_id] = start_cursor def drain(self, wait_id: int, max_records: int | None = None) -> list[StreamRecord]: buffered = self.buffers.get(wait_id, []) @@ -192,6 +197,19 @@ def test_topics_inherit_their_options( assert subscription.idle_timeout == timedelta(seconds=3) +def test_a_subscription_may_name_the_boundary_it_starts_after( + runtime: FakeRuntime, +) -> None: + """A named boundary reaches the runtime; an unnamed one leaves the default to it.""" + boundary = AFTER(Offset("1700000000000-3")) + + seeded = external_stream.topic("tokens").subscribe(start_cursor=boundary) + default = external_stream.topic("tokens").subscribe() + + assert runtime.start_cursors[seeded.wait_id] == boundary + assert runtime.start_cursors[default.wait_id] is None + + # --- topics ------------------------------------------------------------------- diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 994ef5309..d4e215882 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -7,7 +7,11 @@ import pytest from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError -from temporalio.streams.providers.redis import _drive, _outside_position +from temporalio.streams.providers.redis import ( + _drive, + _outside_position, + _workflow_position, +) def test_outside_cursors_name_output_positions(): @@ -43,3 +47,17 @@ async def run() -> None: _drive(publish()) asyncio.run(run()) + + +def test_workflow_cursors_name_input_positions(): + assert _workflow_position(BEGINNING) is None + position = _workflow_position(Cursor("redis:in:1700000000000-3")) + assert position is not None and position.token == "1700000000000-3" + # An outside cursor names the output stream, whose entry ids are not the + # input stream's, so it cannot seed a workflow reader. + with pytest.raises(StreamCursorError, match="output stream"): + _workflow_position(Cursor("redis:1700000000000-3")) + with pytest.raises(StreamCursorError): + _workflow_position(Cursor("memory:3")) + with pytest.raises(StreamCursorError): + _workflow_position(Cursor("redis:in:not-an-id")) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 4ee50e68b..4871e1cfa 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -3,10 +3,10 @@ The conformance suite covers the outside surface when ``STREAMS_LIVE=redis``. This module runs the interface loop inside a workflow over the staged commit, lets a read end with the workflow, shares a topic between an outside producer -and the workflow, and queries a completed run, which replays it. All need a -dev server (``TEMPORAL_ADDRESS``) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or -``AI198_REDIS_URL``). The worker keeps a warm cache because the transport -holds the task open between records. +and the workflow, queries a completed run, which replays it, and seeds a +workflow reader from a cursor. All need a dev server (``TEMPORAL_ADDRESS``) +and a Redis (``TEMPORAL_TEST_REDIS_URL`` or ``AI198_REDIS_URL``). The worker +keeps a warm cache because the transport holds the task open between records. """ from __future__ import annotations @@ -21,9 +21,9 @@ from temporalio import workflow from temporalio.client import Client -from temporalio.streams import RecordKind +from temporalio.streams import BEGINNING, Cursor, RecordKind from temporalio.streams.providers.redis import RedisStreams -from temporalio.worker import Worker +from temporalio.worker import Replayer, Worker from tests.streams.test_streams_conformance import take from tests.streams.test_streams_workflow import ( DECISIONS, @@ -100,9 +100,7 @@ async def test_interface_loop_over_redis(live_client: Client, provider: RedisStr # The read ends by itself once the workflow is closed and every # promoted record has been handed over. async def read_everything() -> list[Any]: - return [ - r.value async for r in stream.read(topic=DECISIONS) - ] + return [r.value async for r in stream.read(topic=DECISIONS)] assert await asyncio.wait_for(read_everything(), 60) == [ {"decided": 1}, @@ -205,3 +203,68 @@ async def test_query_after_completion_replays_the_final_task( assert await handle.query(SignalWokenPublish.probe) == 1 values = [r.value async for r in stream.read(topic="out", result_type=dict)] assert values == [{"n": 0}, {"n": 1}, {"n": 2}, {"n": 3}] + + +@workflow.defn +class ResumeAfter: + """Reads ``inputs``; the first run hands its first record's cursor to the next.""" + + def __init__(self) -> None: + self._seen: list[int] = [] + + @workflow.query + def seen(self) -> list[int]: + return self._seen + + @workflow.run + async def run(self, after: str | None) -> list[int]: + reader = workflow.stream_reader( + INPUTS, after=Cursor(after) if after else BEGINNING + ) + first: str | None = None + async for record in reader: + if record.kind is RecordKind.FINISH: + break + assert record.value is not None + self._seen.append(record.value["n"]) + first = first or record.cursor.token + if after is None and len(self._seen) == 2: + workflow.continue_as_new(first) + return self._seen + + +async def test_a_workflow_reader_started_from_a_cursor_skips_the_earlier_records( + live_client: Client, provider: RedisStreams +): + # The first run reads two records and continues as new with the cursor of + # the first. Without the cursor the successor would resume after the + # second, which is where the chain left off; with it, it reads the second + # again and then the rest. + workflow_id = f"streams-redis-resume-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[ResumeAfter], + plugins=[provider], + max_cached_workflows=100, + ): + handle = await live_client.start_workflow( + ResumeAfter.run, None, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + await producer.finish() + assert await handle.result() == [2, 3] + # The completed run is evicted, so the query replays it cold with the + # seeded position and the recorded ranges. + assert await handle.query(ResumeAfter.seen) == [2, 3] + + # Both runs replay offline against the store, the seeded one included. + replayer = Replayer(workflows=[ResumeAfter], plugins=[provider]) + await replayer.replay_workflow( + await live_client.get_workflow_handle( + workflow_id, run_id=handle.first_execution_run_id + ).fetch_history() + ) + await replayer.replay_workflow(await handle.fetch_history()) From c7e30af23aa29ab043c4fb84f4b739746371257f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 14:17:39 -0700 Subject: [PATCH 536/831] Passed a backend's integrity loss through the replay read. A backend that can tell a recorded range is gone reports the loss itself. The wrapper filed it under a transient storage failure, which is retried and clears on its own; a trimmed range does neither. --- temporalio/contrib/external_workflow_streams/_replay.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/temporalio/contrib/external_workflow_streams/_replay.py b/temporalio/contrib/external_workflow_streams/_replay.py index f136c9cbb..ac293c172 100644 --- a/temporalio/contrib/external_workflow_streams/_replay.py +++ b/temporalio/contrib/external_workflow_streams/_replay.py @@ -252,7 +252,9 @@ async def _read_range( """ try: return await backend.read_range(key, run.first_offset, run.last_offset) - except StreamStorageError: + except (StreamStorageError, StreamIntegrityError): + # A backend that can tell the range is gone reports the loss itself; + # wrapping it would file a permanent loss under a transient failure. raise except Exception as err: # Not integrity loss: nothing has been shown to be missing, only From d87787d265d41af20414a1ba9ff55ce2170ca7a1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 14:17:39 -0700 Subject: [PATCH 537/831] Trimmed the Redis streams by retention on every append. `RedisStreams(retention=, max_len=)` trims a topic's input and output keys behind every append the provider makes, exactly, because the approximate trim never fires on a stream shorter than a macro node. A replay past the window fails its task with the transport's integrity error, an outside cursor below it is refused, and a fully trimmed topic reads as empty. --- temporalio/streams/providers/redis.py | 167 +++++++++++++++++++++++-- tests/streams/test_redis_provider.py | 13 ++ tests/streams/test_redis_replay.py | 169 +++++++++++++++++++++++++- 3 files changed, 336 insertions(+), 13 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index c6972cc84..f67c11b6e 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -34,6 +34,11 @@ batch limits are lifted for this provider, because a synchronous publish cannot wait for the worker to stage a full batch; a batch it cannot stage fails the task. +- Retention is trimming, with no consumer floor. When ``retention`` or + ``max_len`` is set, every append the provider makes trims the key it wrote, + whatever any reader has reached. A replay that reaches a recorded range the + trim removed fails its Workflow Task, an outside cursor below the trim is + refused, and a fully trimmed topic reads as empty. """ from __future__ import annotations @@ -42,7 +47,7 @@ import logging import re import time -from collections.abc import AsyncGenerator, Coroutine +from collections.abc import AsyncGenerator, Coroutine, Sequence from datetime import timedelta from typing import Any, Generic, TypeVar @@ -74,11 +79,21 @@ from temporalio.contrib.external_workflow_streams import ( StreamError as TransportStreamError, ) -from temporalio.contrib.external_workflow_streams._backend import DEFAULT_WATCH_BLOCK +from temporalio.contrib.external_workflow_streams._backend import ( + DEFAULT_WATCH_BLOCK, + StreamKey, +) from temporalio.contrib.external_workflow_streams._codec import StreamPayloadCodec +from temporalio.contrib.external_workflow_streams._errors import StreamIntegrityError +from temporalio.contrib.external_workflow_streams._output_backend import ( + OutputStage, + OutputStageManifest, + StagedOutputRecord, +) from temporalio.contrib.external_workflow_streams._output_client import ( _reconcile_output_stage, ) +from temporalio.contrib.external_workflow_streams._redis import RedisStreamBackend from temporalio.converter import WorkflowSerializationContext from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import ( @@ -162,6 +177,101 @@ def _workflow_position(after: Cursor) -> Offset | None: ) +def _entry_id(token: str | bytes) -> tuple[int, int]: + """A Redis entry id as the ``(ms, seq)`` pair it orders by.""" + text = token.decode() if isinstance(token, bytes) else token + ms, _, seq = text.partition("-") + return int(ms), int(seq or 0) + + +class _RetainingBackend(RedisStreamBackend): + """The transport's Redis backend, trimming the key behind every append it makes. + + Trims are exact rather than approximate: Redis's approximate trim drops + whole macro nodes only, so a stream shorter than one node, a hundred + entries by default, would never trim and the window would not mean what + it says. Only the streams are trimmed; the idempotency and stage hashes + beside them keep one entry per record and stage. + """ + + def __init__( + self, + *, + client: Any, + key_prefix: str, + retention: timedelta | None, + max_len: int | None, + ) -> None: + super().__init__(client=client, key_prefix=key_prefix) + self._retention = retention + self._max_len = max_len + + def describe_window(self) -> str: + """The configured window, for messages.""" + parts = [] + if self._retention is not None: + parts.append(f"retention={self._retention}") + if self._max_len is not None: + parts.append(f"max_len={self._max_len}") + return ", ".join(parts) or "no retention" + + async def append(self, key: StreamKey, record: Any) -> Any: + placed = await super().append(key, record) + await self._trim(key) + return placed + + async def stage_output( + self, manifest: OutputStageManifest, records: Sequence[StagedOutputRecord] + ) -> OutputStage: + stage = await super().stage_output(manifest, records) + await self._trim(manifest.stream_key) + return stage + + async def read_range(self, key: StreamKey, first: Offset, last: Offset) -> Any: + # The replay read. Said here, where the trim is known, rather than left + # to the range checks, which can only report the record as missing. + if not await self.retains(key, first): + raise StreamIntegrityError( + f"the recorded range [{first}, {last}] on topic " + f"{key.stream_name!r} is past the redis provider's retention " + f"({self.describe_window()}): the records were trimmed, so this " + "run cannot be replayed" + ) + return await super().read_range(key, first, last) + + async def retains(self, key: StreamKey, offset: Offset) -> bool: + """Whether the record at ``offset`` survived trimming. + + A record at or after the first retained entry is there. On an emptied + stream the last id Redis generated says whether the record ever was. + """ + from redis.exceptions import ResponseError + + try: + info = await self._client.xinfo_stream(self.stream_key(key)) + except ResponseError as error: + if "no such key" in str(error).lower(): + return True + raise + wanted = _entry_id(offset.token) + first = info.get("first-entry") + if first: + return _entry_id(first[0]) <= wanted + return wanted > _entry_id(info["last-generated-id"]) + + async def _trim(self, key: StreamKey) -> None: + name = self.stream_key(key) + if self._retention is not None: + # The worker's clock names the floor, so a skewed worker shifts + # the window by its skew. + floor = int((time.time() - self._retention.total_seconds()) * 1000) + await self._client.xtrim( + name, minid=f"{max(floor, 0)}-0", approximate=False + ) + if self._max_len is not None: + await self._client.xtrim(name, maxlen=self._max_len, approximate=False) + + def _drive(coroutine: Coroutine[Any, Any, None]) -> None: """Run a transport publish to completion without yielding to the loop. @@ -504,6 +614,17 @@ async def _read( backend = self._streams._require_backend() chain = await _chain(self._client, self._workflow_id) key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) + if ( + position is not None + and isinstance(backend, _RetainingBackend) + and not await backend.retains(key, position) + ): + # Refused rather than resumed from the first retained record, + # which would skip whatever the trim took in between. + raise StreamCursorError( + f"cursor {after.token!r} names a record on {topic!r} that the " + f"provider's retention has trimmed ({backend.describe_window()})" + ) cursor = TRANSPORT_BEGINNING if position is None else AFTER(position) closed = False while True: @@ -616,6 +737,8 @@ def __init__( idle_timeout: timedelta = timedelta(seconds=1), backend: Any | None = None, poll_interval: timedelta = timedelta(milliseconds=500), + retention: timedelta | None = None, + max_len: int | None = None, ) -> None: """Create the provider. @@ -625,25 +748,48 @@ def __init__( deployments. idle_timeout: How long a workflow reader with nothing to read holds its Workflow Task open before the worker parks it. - backend: A transport backend the caller constructed and owns. + backend: A transport backend the caller constructed and owns. It + is trimmed by its owner, so it takes neither ``retention`` nor + ``max_len``. poll_interval: How long an outside reader that is caught up waits for a record before asking whether the workflow closed. + retention: Trim records older than this from a topic's input and + output keys on every append the provider makes to them. This + is retention without a consumer floor: nothing holds a record + for a reader that has not reached it. A workflow whose replay + reaches a recorded range past the window fails its Workflow + Task with the transport's ``StreamIntegrityError`` until the + window is raised, an outside ``read(after=)`` below the window + raises ``StreamCursorError``, and a live reader that falls + behind the window misses records. The floor the server-side + provider keeps would need a consumer registry in Redis. + max_len: Keep at most this many entries per key, trimmed on the + same appends and with the same consequences. It must exceed + the largest batch a task publishes, or a stage is trimmed + before its commit. """ + if retention is not None and retention <= timedelta(0): + raise ValueError("retention must be positive") + if max_len is not None and max_len < 1: + raise ValueError("max_len must be positive") + if backend is not None and (retention is not None or max_len is not None): + raise ValueError( + "retention and max_len trim the backend this provider opens; a " + "backend handed in is trimmed by its owner" + ) self._url = url self._key_prefix = key_prefix self._idle_timeout = idle_timeout self._backend = backend self._owned_client: Any = None self._poll = poll_interval + self._retention = retention + self._max_len = max_len def _require_backend(self) -> Any: if self._backend is None: import redis.asyncio - from temporalio.contrib.external_workflow_streams._redis import ( - RedisStreamBackend, - ) - # A dead peer would otherwise hold a blocking read open forever. # Several block periods, so a healthy socket that is merely idle # inside one read window is never abandoned. @@ -652,8 +798,11 @@ def _require_backend(self) -> Any: decode_responses=False, socket_timeout=DEFAULT_WATCH_BLOCK.total_seconds() * 6, ) - self._backend = RedisStreamBackend( - client=self._owned_client, key_prefix=self._key_prefix + self._backend = _RetainingBackend( + client=self._owned_client, + key_prefix=self._key_prefix, + retention=self._retention, + max_len=self._max_len, ) return self._backend diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index d4e215882..ac4919c81 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -3,11 +3,13 @@ from __future__ import annotations import asyncio +from datetime import timedelta import pytest from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError from temporalio.streams.providers.redis import ( + RedisStreams, _drive, _outside_position, _workflow_position, @@ -61,3 +63,14 @@ def test_workflow_cursors_name_input_positions(): _workflow_position(Cursor("memory:3")) with pytest.raises(StreamCursorError): _workflow_position(Cursor("redis:in:not-an-id")) + + +def test_retention_options_are_checked_at_construction(): + with pytest.raises(ValueError, match="retention"): + RedisStreams(retention=timedelta(0)) + with pytest.raises(ValueError, match="max_len"): + RedisStreams(max_len=0) + # A backend the caller owns is the caller's to trim. + with pytest.raises(ValueError, match="trimmed by its owner"): + RedisStreams(backend=object(), max_len=10) + RedisStreams(retention=timedelta(hours=1), max_len=10) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 4871e1cfa..167b0e310 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -3,7 +3,8 @@ The conformance suite covers the outside surface when ``STREAMS_LIVE=redis``. This module runs the interface loop inside a workflow over the staged commit, lets a read end with the workflow, shares a topic between an outside producer -and the workflow, queries a completed run, which replays it, and seeds a +and the workflow, queries a completed run, which replays it, trims by +retention and shows what a replay and a read past the trim do, and seeds a workflow reader from a cursor. All need a dev server (``TEMPORAL_ADDRESS``) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or ``AI198_REDIS_URL``). The worker keeps a warm cache because the transport holds the task open between records. @@ -15,16 +16,18 @@ import os import uuid from collections.abc import AsyncIterator +from datetime import timedelta from typing import Any import pytest from temporalio import workflow from temporalio.client import Client -from temporalio.streams import BEGINNING, Cursor, RecordKind -from temporalio.streams.providers.redis import RedisStreams +from temporalio.contrib.external_workflow_streams import StreamDirection +from temporalio.streams import BEGINNING, Cursor, RecordKind, StreamCursorError +from temporalio.streams.providers.redis import RedisStreams, _chain from temporalio.worker import Replayer, Worker -from tests.streams.test_streams_conformance import take +from tests.streams.test_streams_conformance import StreamHost, take from tests.streams.test_streams_workflow import ( DECISIONS, INPUTS, @@ -205,6 +208,164 @@ async def test_query_after_completion_replays_the_final_task( assert values == [{"n": 0}, {"n": 1}, {"n": 2}, {"n": 3}] +async def _key_lengths( + streams: RedisStreams, client: Client, workflow_id: str, topic: str +) -> tuple[int, int]: + """How many entries the topic's input and output keys hold.""" + import redis.asyncio + + backend = streams._require_backend() + chain = await _chain(client, workflow_id) + store = redis.asyncio.from_url(redis_url()) + try: + return ( + await store.xlen( + backend.stream_key( + chain.stream_key(topic, direction=StreamDirection.INPUT) + ) + ), + await store.xlen( + backend.stream_key( + chain.stream_key(topic, direction=StreamDirection.OUTPUT) + ) + ), + ) + finally: + await store.aclose() + + +async def _trim_everything( + streams: RedisStreams, client: Client, workflow_id: str, topic: str +) -> None: + """What retention elsewhere, or an operator, does to a topic's output key.""" + import redis.asyncio + + backend = streams._require_backend() + chain = await _chain(client, workflow_id) + store = redis.asyncio.from_url(redis_url()) + try: + await store.xtrim( + backend.stream_key( + chain.stream_key(topic, direction=StreamDirection.OUTPUT) + ), + maxlen=0, + approximate=False, + ) + finally: + await store.aclose() + + +async def test_a_replay_past_the_retention_window_fails_loudly(live_client: Client): + # Six entries per key: the loop's four input records stay while it runs, + # and six more appends afterwards push them out. + streams = RedisStreams( + url=redis_url(), key_prefix=f"streams-redis-{uuid.uuid4().hex}", max_len=6 + ) + workflow_id = f"streams-redis-retention-{uuid.uuid4().hex}" + try: + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[ContractLoop], + plugins=[streams], + max_cached_workflows=100, + ): + handle = await live_client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = streams.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + await producer.finish() + assert len(await handle.result()) == 4 + before = await take(stream.read(topic=INPUTS), 4, 60) + history = await handle.fetch_history() + assert await _key_lengths(streams, live_client, workflow_id, INPUTS.name) == ( + 4, + 4, + ) + + # Inside the window the recorded ranges read back and the replay passes. + await Replayer(workflows=[ContractLoop], plugins=[streams]).replay_workflow( + history + ) + + late = stream.producer(topic=INPUTS, producer_id="late", attempt=1) + cursors = [await late.append({"n": n}) for n in range(10, 16)] + assert await _key_lengths(streams, live_client, workflow_id, INPUTS.name) == ( + 6, + 6, + ) + + # The recorded input ranges are gone, and the replay says so rather + # than delivering fewer records. + with pytest.raises(Exception) as failure: + await Replayer(workflows=[ContractLoop], plugins=[streams]).replay_workflow( + history + ) + # The task fails under the transport's integrity row: its type, the + # external storage cause, and a message that names the window. + message = str(failure.value) + assert "StreamIntegrityError" in message and "ExternalStorageFailure" in message + assert "past the redis provider's retention (max_len=6)" in message + + # An outside cursor below the trim is refused, not resumed from the + # first retained record. + with pytest.raises(StreamCursorError, match="retention has trimmed"): + await take(stream.read(topic=INPUTS, after=before[0].cursor), 1, 10) + + # Inside the window a read still works and lands where append said. + records = [r async for r in stream.read(topic=INPUTS, after=cursors[1])] + assert [r.value for r in records] == [{"n": n} for n in range(12, 16)] + assert [r.cursor for r in records] == cursors[2:] + finally: + await streams.close() + + +async def test_retention_by_age_trims_older_entries(live_client: Client): + streams = RedisStreams( + url=redis_url(), + key_prefix=f"streams-redis-{uuid.uuid4().hex}", + retention=timedelta(milliseconds=300), + ) + workflow_id = f"streams-redis-age-{uuid.uuid4().hex}" + try: + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[streams], + ): + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = streams.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + first = await producer.append({"n": 1}) + await producer.append({"n": 2}) + await asyncio.sleep(0.6) + # The append that crosses the window is what trims the two before it. + third = await producer.append({"n": 3}) + assert await _key_lengths( + streams, live_client, workflow_id, INPUTS.name + ) == ( + 1, + 1, + ) + assert await stream.latest(topic=INPUTS) == third + with pytest.raises(StreamCursorError, match="retention has trimmed"): + await take(stream.read(topic=INPUTS, after=first), 1, 10) + + # A fully trimmed topic answers the way an empty one does. + await _trim_everything(streams, live_client, workflow_id, INPUTS.name) + assert await stream.latest(topic=INPUTS) == BEGINNING + await handle.signal(StreamHost.release) + await handle.result() + assert [r async for r in stream.read(topic=INPUTS)] == [] + finally: + await streams.close() + + @workflow.defn class ResumeAfter: """Reads ``inputs``; the first run hands its first record's cursor to the next.""" From ebba7675f0d3a7fdb7ce24458669090c292901df Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 14:25:53 -0700 Subject: [PATCH 538/831] Let a pushed history carry stream slices and repinned Core. The Core pin moves to the head that puts a history's stream slices on the replay worker's poll response. `push_history` takes them as serialized `StreamSlice` messages, so a replayer can hand Core the records History does not hold. --- temporalio/bridge/sdk-core | 2 +- temporalio/bridge/src/worker.rs | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 97cd17296..f8c5fa89e 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 97cd17296fcc6178407c770f96f354bcc4e9f540 +Subproject commit f8c5fa89e7bb02fd3f439cde37abcff85d10018f diff --git a/temporalio/bridge/src/worker.rs b/temporalio/bridge/src/worker.rs index e74698e94..44e5a2005 100644 --- a/temporalio/bridge/src/worker.rs +++ b/temporalio/bridge/src/worker.rs @@ -14,6 +14,7 @@ use temporalio_common::protos::coresdk::{ nexus::NexusTaskCompletion, ActivityHeartbeat, ActivityTaskCompletion, }; use temporalio_common::protos::temporal::api::history::v1::History; +use temporalio_common::protos::temporal::api::stream::v1::StreamSlice; use temporalio_common::protos::temporal::api::worker::v1::{PluginInfo, StorageDriverInfo}; use temporalio_sdk_core::replay::{HistoryForReplay, ReplayWorkerInput}; use temporalio_sdk_core::{ @@ -950,14 +951,24 @@ impl HistoryPusher { #[pymethods] impl HistoryPusher { + /// Feed one history to the replay worker. `stream_slices` are serialized + /// `temporal.api.stream.v1.StreamSlice` messages carrying the records the + /// history's completed tasks consumed, which History itself never holds. + #[pyo3(signature = (workflow_id, history_proto, stream_slices = Vec::new()))] fn push_history<'p>( &self, py: Python<'p>, workflow_id: &str, history_proto: &Bound<'_, PyBytes>, + stream_slices: Vec>, ) -> PyResult> { let history = History::decode(history_proto.as_bytes()) .map_err(|err| PyValueError::new_err(format!("Invalid proto: {err}")))?; + let slices = stream_slices + .iter() + .map(|slice| StreamSlice::decode(slice.as_bytes())) + .collect::, _>>() + .map_err(|err| PyValueError::new_err(format!("Invalid stream slice proto: {err}")))?; let wfid = workflow_id.to_string(); let tx = if let Some(tx) = self.tx.as_ref() { tx.clone() @@ -968,7 +979,7 @@ impl HistoryPusher { }; // We accept this doesn't have logging/tracing self.runtime.future_into_py(py, async move { - tx.send(HistoryForReplay::new(history, wfid)) + tx.send(HistoryForReplay::new(history, wfid).with_stream_slices(slices)) .await .map_err(|_| { PyRuntimeError::new_err( From 4f9fa21d197cc625babcdb8e0ede1291fb001214 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 14:26:45 -0700 Subject: [PATCH 539/831] Tested a payload codec on both halves of the native provider. An encrypting codec on the client has to cover the records a workflow publishes and receives through the worker's payload visitor, and the records the outside half sends and reads. The stored bodies are read raw through the stream service to show they are not plaintext. --- tests/worker/test_workflow_stream_e2e.py | 117 ++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 1d974b401..51fb488d3 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,6 +17,7 @@ import asyncio import os import uuid +from collections.abc import Sequence from typing import Any import pytest @@ -25,8 +26,9 @@ from temporalio.api.common.v1 import Payload from temporalio.api.enums.v1 import EventType from temporalio.api.stream.v1 import StreamRecord -from temporalio.client import Client +from temporalio.client import Client, WorkflowHistory from temporalio.client_stream import StreamClient +from temporalio.converter import DataConverter, PayloadCodec from temporalio.streams import RecordKind from temporalio.streams.providers.native import NativeStreams from temporalio.worker import Worker @@ -384,3 +386,116 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: ) finally: await streams.close() + + +class _EncryptingCodec(PayloadCodec): + """A codec whose output never contains its input. + + The SDK's own test codec marks payloads as encrypted but leaves the bytes + as they are, so it cannot show that a stored body is not plaintext. This + one keeps its metadata convention and runs a repeating-key XOR over the + serialized payload, which is enough for the plaintext markers the tests + look for to be absent from what the server stores. + """ + + _KEY = b"ai198" + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [ + Payload( + metadata={"encoding": b"binary/encrypted"}, + data=self._xor(p.SerializeToString()), + ) + for p in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + out: list[Payload] = [] + for p in payloads: + if p.metadata.get("encoding", b"") != b"binary/encrypted": + out.append(p) + continue + out.append(Payload.FromString(self._xor(p.data))) + return out + + def _xor(self, data: bytes) -> bytes: + key = self._KEY + return bytes(b ^ key[i % len(key)] for i, b in enumerate(data)) + + +async def _drive_contract_loop(client: Client) -> WorkflowHistory: + """Run ``ContractLoop`` to completion on ``client`` and return its history.""" + task_queue = "codec-tq-" + uuid.uuid4().hex[:8] + workflow_id = "codec-wf-" + uuid.uuid4().hex[:8] + async with Worker(client, task_queue=task_queue, workflows=[ContractLoop]): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + await producer.finish() + trace = await asyncio.wait_for(handle.result(), 60) + # The workflow decoded what the outside producer appended. + assert trace == [ + {"kind": "decision", "n": 1}, + {"kind": "decision", "n": 2}, + {"kind": "finish", "producer": "model"}, + ] + # The outside read decodes what the workflow published. + decisions = [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + assert decisions == [ + (RecordKind.DATA, {"decided": 1}), + (RecordKind.DATA, {"decided": 2}), + (RecordKind.FINISH, None), + ] + return await handle.fetch_history() + + +async def test_a_codec_encodes_records_on_both_halves() -> None: + """A payload codec on the client covers the workflow's records and an outside producer's. + + The worker's payload visitor runs the codec over the bodies a workflow + publishes and receives; the outside half applies the client's codec to each + body it sends and reads. Read raw, without the codec, every stored body is + ciphertext, and each side still reads the other's records in the clear. + """ + plain = await _connect() + config = plain.config() + config["data_converter"] = DataConverter(payload_codec=_EncryptingCodec()) + provider = NativeStreams() + config["plugins"] = [provider] + client = Client(**config) + raw = StreamClient.connect(TARGET or "") + try: + history = await _drive_contract_loop(client) + run_id = history.run_id + + # What the server holds, read through the stream service with no codec. + inputs = await raw.workflow_stream( + history.workflow_id, INPUTS, owner_run_id=run_id + ).poll(from_offset=0, wait=False) + decisions = await raw.workflow_stream( + history.workflow_id, DECISIONS, owner_run_id=run_id + ).poll(from_offset=0, wait=False) + + # The outside producer's two records, stored encoded. + stored_inputs = [e.record for e in inputs.entries if e.record.HasField("body")] + assert len(stored_inputs) == 2 + for record in stored_inputs: + assert record.body.metadata["encoding"] == b"binary/encrypted" + assert b'"n"' not in record.body.data + # The workflow's two decisions, stored encoded by the worker's visitor. + stored_decisions = [ + e.record for e in decisions.entries if e.record.HasField("body") + ] + assert len(stored_decisions) == 2 + for record in stored_decisions: + assert record.body.metadata["encoding"] == b"binary/encrypted" + assert b"decided" not in record.body.data + finally: + await raw.close() + await provider.close() From e5d1e203c1e5b73a6fbc6368432d6c49ab60d04a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 14:27:05 -0700 Subject: [PATCH 540/831] Fetched a consuming workflow's stream records for the Replayer. History records the offsets each task consumed and never the records, so a workflow that read a server-side stream could not be replayed at all. Given a `stream_client`, the replayer fetches every recorded range from the stream service, resolving a subscribed name as the server does, and hands the records to Core with the history. Without one, such a history is refused with the remedy in the message. --- CHANGELOG.md | 7 +- temporalio/worker/_replayer.py | 215 +++++++++++++++++++++++ tests/worker/test_workflow_stream_e2e.py | 156 +++++++++++++++- 3 files changed, 374 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f59cc1e2..2ce49c6fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,12 @@ to include examples, links to docs, or any other relevant information. `temporalio.contrib.server_streams` reach the same stream from outside a workflow, and `temporalio.streams.providers.native.NativeStreams` puts it behind the shared stream interface with one owned stream per topic. Requires - a server that serves the stream service. + a server that serves the stream service. `Replayer(stream_client=)` replays a + workflow that read such a stream while the server still holds it: History + records only the offsets each task consumed, so the replayer fetches the + records from the stream service and hands them to the replay with the + history. A range the stream no longer holds fails the replay with + `StreamNotFoundError`. ### Changed diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index c7ae8d59d..d020e2256 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -8,15 +8,18 @@ from collections.abc import AsyncIterator, Mapping, Sequence from contextlib import AbstractAsyncContextManager, asynccontextmanager from dataclasses import dataclass +from typing import Any from typing_extensions import TypedDict import temporalio.api.history.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.workflow_activation import temporalio.bridge.worker import temporalio.client import temporalio.converter import temporalio.runtime +import temporalio.service import temporalio.streams import temporalio.worker import temporalio.workflow @@ -58,6 +61,7 @@ def __init__( disable_safe_workflow_eviction: bool = False, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, stream_provider: temporalio.streams.StreamProvider | None = None, + stream_client: temporalio.client.Client | None = None, ) -> None: """Create a replayer to replay workflows from history. @@ -66,6 +70,17 @@ def __init__( the replayer that were passed to the worker when the workflow originally ran, ``stream_provider`` included when the workflow used streams. + A workflow that read a server-side stream cannot be replayed from its + history alone. History records the offsets each Workflow Task consumed + and never the records; on a live task the server re-supplies them from + the stream. ``stream_client`` is a client connected to the server that + still holds those streams. Given one, the replayer fetches every range + a history's completed tasks recorded from the stream service and hands + the records to the replay alongside the history, so the workflow sees + what it saw the first time. A range the stream no longer holds fails + that replay with :py:class:`temporalio.streams.StreamNotFoundError`. + Without a client, replaying such a history fails and says so. + Note, unlike the worker, for the replayer the workflow_task_executor will default to a new thread pool executor with no max_workers set that will be shared across all replay calls and never explicitly shut down. @@ -89,6 +104,7 @@ def __init__( disable_safe_workflow_eviction=disable_safe_workflow_eviction, header_codec_behavior=header_codec_behavior, stream_provider=stream_provider, + stream_client=stream_client, ) self._initial_config = self._config.copy() self._default_workflow_logic_flags = set(_DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS) @@ -365,9 +381,32 @@ def on_eviction_hook( # Start worker workflow_worker_task = asyncio.create_task(workflow_worker.run()) + stream_client = self._config.get("stream_client") + # Yield iterator async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: async for history in histories: + # The records a consuming workflow read are not in its + # history. Either fetch them from the stream service or + # report here what is missing, rather than let Core fail + # the first task on input it was never given. + stream_slices: list[bytes] = [] + if stream_client is not None: + try: + stream_slices = await _stream_slices(stream_client, history) + except temporalio.streams.StreamNotFoundError as err: + yield WorkflowReplayResult( + history=history, replay_failure=err + ) + continue + else: + missing = _stream_records_missing(history) + if missing is not None: + yield WorkflowReplayResult( + history=history, replay_failure=RuntimeError(missing) + ) + continue + # Clear last complete and push history last_replay_complete.clear() await pusher.push_history( @@ -375,6 +414,7 @@ async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: temporalio.api.history.v1.History( events=history.events ).SerializeToString(), + stream_slices, ) # Wait for worker error or last replay to complete. This @@ -420,6 +460,174 @@ async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: logger.warning("Failed to finalize shutdown", exc_info=True) +def _consumed_ranges( + history: temporalio.client.WorkflowHistory, +) -> list[tuple[int, temporalio.api.stream.v1.StreamRange]]: + """Every range a completed task recorded, with the id of the event that recorded it.""" + out: list[tuple[int, temporalio.api.stream.v1.StreamRange]] = [] + for event in history.events: + if not event.HasField("workflow_task_completed_event_attributes"): + continue + attributes = event.workflow_task_completed_event_attributes + for consumed in attributes.consumed_stream_ranges: + out.append((event.event_id, consumed)) + return out + + +def _stream_records_missing(history: temporalio.client.WorkflowHistory) -> str | None: + """Why this history cannot be replayed without a stream client, or ``None``.""" + ranges = [r for _, r in _consumed_ranges(history) if r.to_offset > r.from_offset] + if not ranges: + return None + streams = sorted({r.stream_id for r in ranges}) + return ( + f"workflow {history.workflow_id!r} consumed records from stream(s) " + f"{', '.join(repr(s) for s in streams)} in {len(ranges)} task(s), and History " + "records only the offsets. Create the Replayer with stream_client= (a Client " + "connected to the server that still holds the streams) so the records can be " + "fetched from the stream service." + ) + + +async def _stream_slices( + client: temporalio.client.Client, history: temporalio.client.WorkflowHistory +) -> list[bytes]: + """Fetch the records the history's tasks consumed, as serialized ``StreamSlice`` messages. + + The shape is the one the server puts on a poll response when it re-supplies + a cache miss: one slice per recorded range, tagged with the completion that + recorded it, an empty range included. Raises + :py:class:`temporalio.streams.StreamNotFoundError` for a range the stream no + longer holds. + """ + ranges = _consumed_ranges(history) + if not ranges: + return [] + # Imported here: the stream client needs the grpc extra, which a replayer + # without a stream client never touches. + from temporalio.client_stream import shared_client + + streams = shared_client(client.service_client.config.target_host, client.namespace) + run_id = history.run_id + # The handle that served each stream id, so later ranges of the same + # stream go straight to it. + served_by: dict[str, Any] = {} + slices: list[bytes] = [] + for event_id, consumed in ranges: + stream_slice = temporalio.api.stream.v1.StreamSlice( + stream_id=consumed.stream_id, + run_id=run_id, + from_offset=consumed.from_offset, + to_offset=consumed.to_offset, + workflow_task_completed_event_id=event_id, + ) + if consumed.to_offset > consumed.from_offset: + handle, records, owner_run_id = await _fetch_range( + streams, + history.workflow_id, + run_id, + consumed, + served_by.get(consumed.stream_id), + ) + served_by[consumed.stream_id] = handle + stream_slice.run_id = owner_run_id or run_id + stream_slice.records.extend(records) + slices.append(stream_slice.SerializeToString()) + return slices + + +async def _fetch_range( + streams: Any, + workflow_id: str, + run_id: str, + consumed: temporalio.api.stream.v1.StreamRange, + known: Any, +) -> tuple[Any, list[temporalio.api.stream.v1.StreamRecord], str]: + """The records at exactly the recorded range, with the handle that served them. + + A subscribed name is resolved as the server resolves it: a stream the + workflow owns by that name first, else a standalone stream by that id. The + owned stream cannot be asked whether it exists, since a name nobody wrote + reads as empty, so the owned stream is probed for the range's first record + and the standalone one is tried when it has nothing there. + """ + gone = ( + f"stream {consumed.stream_id!r} no longer holds offsets " + f"[{consumed.from_offset}, {consumed.to_offset}) that a completed task of " + f"workflow {workflow_id!r} run {run_id!r} consumed; its records cannot be " + "replayed" + ) + candidates = ( + [known] + if known is not None + else [ + streams.workflow_stream( + workflow_id, consumed.stream_id, owner_run_id=run_id + ), + streams.get(consumed.stream_id), + ] + ) + last: Exception | None = None + for handle in candidates: + try: + records, owner_run_id = await _read_range(handle, consumed, gone) + except temporalio.streams.StreamNotFoundError as error: + last = error + continue + if records is not None: + return handle, records, owner_run_id + raise temporalio.streams.StreamNotFoundError(gone) from last + + +async def _read_range( + handle: Any, consumed: temporalio.api.stream.v1.StreamRange, gone: str +) -> tuple[list[temporalio.api.stream.v1.StreamRecord] | None, str]: + """Read ``[from_offset, to_offset)`` from one stream. + + ``None`` when the stream has nothing at the range's first offset, which is + how a name that is not this stream's reads; a stream that has the start but + not the rest, or refuses the offset as truncated or past its head, raises. + """ + records: list[temporalio.api.stream.v1.StreamRecord] = [] + owner_run_id = "" + offset = consumed.from_offset + while offset < consumed.to_offset: + try: + page = await handle.poll( + from_offset=offset, + max_records=consumed.to_offset - offset, + wait=False, + ) + except temporalio.streams.StreamNotFoundError: + if not records: + return None, "" + raise + except temporalio.service.RPCError as error: + # Below the truncation floor or past the head: the server refuses + # the offset rather than answering short. + if error.status in ( + temporalio.service.RPCStatusCode.FAILED_PRECONDITION, + temporalio.service.RPCStatusCode.INVALID_ARGUMENT, + temporalio.service.RPCStatusCode.OUT_OF_RANGE, + ): + raise temporalio.streams.StreamNotFoundError(gone) from error + raise + owner_run_id = page.run_id or owner_run_id + if not page.entries: + if not records: + return None, "" + raise temporalio.streams.StreamNotFoundError(gone) + for entry in page.entries: + if entry.offset != offset or offset >= consumed.to_offset: + raise temporalio.streams.StreamNotFoundError( + f"{gone}: the stream answered offset {entry.offset} where " + f"{offset} was due" + ) + records.append(entry.record) + offset += 1 + return records, owner_run_id + + class ReplayerConfig(TypedDict, total=False): """TypedDict of config originally passed to :py:class:`Replayer`.""" @@ -438,6 +646,7 @@ class ReplayerConfig(TypedDict, total=False): disable_safe_workflow_eviction: bool header_codec_behavior: HeaderCodecBehavior stream_provider: temporalio.streams.StreamProvider | None + stream_client: temporalio.client.Client | None @dataclass(frozen=True) @@ -455,6 +664,12 @@ class WorkflowReplayResult: :py:class:`temporalio.workflow.NondeterminismError` was encountered during replay - likely indicating your workflow code is incompatible with the history. + + A workflow that read a server-side stream reports here, before any task + runs, when its records could not be fetched: a + :py:class:`temporalio.streams.StreamNotFoundError` when the stream no + longer holds a range a task consumed, or a ``RuntimeError`` when the + replayer was given no ``stream_client`` to fetch them with. """ diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 51fb488d3..2a1fec829 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -25,13 +25,15 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.api.enums.v1 import EventType -from temporalio.api.stream.v1 import StreamRecord +from temporalio.api.history.v1 import HistoryEvent +from temporalio.api.stream.v1 import StreamRange, StreamRecord from temporalio.client import Client, WorkflowHistory from temporalio.client_stream import StreamClient from temporalio.converter import DataConverter, PayloadCodec -from temporalio.streams import RecordKind +from temporalio.streams import RecordKind, StreamNotFoundError from temporalio.streams.providers.native import NativeStreams -from temporalio.worker import Worker +from temporalio.worker import Replayer, Worker +from temporalio.workflow import NondeterminismError from tests.streams.test_streams_conformance import take TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -499,3 +501,151 @@ async def test_a_codec_encodes_records_on_both_halves() -> None: finally: await raw.close() await provider.close() + + +def _consumed_ranges(history: WorkflowHistory) -> list[StreamRange]: + return [ + consumed + for event in history.events + if event.HasField("workflow_task_completed_event_attributes") + for consumed in event.workflow_task_completed_event_attributes.consumed_stream_ranges + ] + + +def _copy_of( + history: WorkflowHistory, workflow_id: str | None = None +) -> WorkflowHistory: + events: list[HistoryEvent] = [] + for event in history.events: + copied = HistoryEvent() + copied.CopyFrom(event) + events.append(copied) + return WorkflowHistory(workflow_id or history.workflow_id, events) + + +async def test_a_replayer_with_a_client_replays_a_consuming_workflow() -> None: + """Rule 2 through the ``Replayer``: the records come back from the stream service. + + History holds the offsets each task consumed and never the records, so the + replayer is given a client to the server that still holds the streams and + fetches every recorded range before pushing the history. The same delivery + path as a live cache miss then hands each range to the task that consumed + it, and the reissued publishes match their events. + """ + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + # Something was consumed, or the replay would prove nothing. + assert any(r.to_offset > r.from_offset for r in _consumed_ranges(history)) + + replayer = Replayer( + workflows=[ContractLoop], plugins=[provider], stream_client=client + ) + result = await replayer.replay_workflow(history) + assert result.replay_failure is None + finally: + await provider.close() + + +async def test_a_replayer_fails_a_tampered_range_as_nondeterministic() -> None: + """A history whose recorded ranges were changed replays on other input and fails. + + Every recorded range is emptied. The task that read two records and + published two decisions is replayed with nothing to read, so it issues no + publish, and Core finds the recorded publish event with no command for it. + """ + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + tampered = _copy_of(history) + for consumed in _consumed_ranges(tampered): + consumed.to_offset = consumed.from_offset + + replayer = Replayer( + workflows=[ContractLoop], plugins=[provider], stream_client=client + ) + with pytest.raises(NondeterminismError): + await replayer.replay_workflow(tampered) + finally: + await provider.close() + + +async def test_a_replayer_fails_loudly_when_the_stream_is_gone() -> None: + """A range the stream service no longer serves is a ``StreamNotFoundError``, not a replay.""" + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + # The same history under a workflow id that owns no stream: the + # records it consumed are nowhere to be fetched from. + gone = _copy_of(history, workflow_id="gone-wf-" + uuid.uuid4().hex[:8]) + + replayer = Replayer( + workflows=[ContractLoop], plugins=[provider], stream_client=client + ) + with pytest.raises(StreamNotFoundError, match="cannot be replayed"): + await replayer.replay_workflow(gone) + finally: + await provider.close() + + +async def test_a_replayer_without_a_client_says_what_it_needs() -> None: + """Without a stream client a consuming workflow's history is refused, with the remedy.""" + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + replayer = Replayer(workflows=[ContractLoop], plugins=[provider]) + + with pytest.raises(RuntimeError, match="stream_client=") as raised: + await replayer.replay_workflow(history) + assert f"'{INPUTS}'" in str(raised.value) + + # The aggregating call reports it per run rather than aborting. + async def histories(): + yield history + + results = await replayer.replay_workflows( + histories(), raise_on_replay_failure=False + ) + assert isinstance(results.replay_failures[history.run_id], RuntimeError) + finally: + await provider.close() + + +async def test_a_replayer_fetches_a_standalone_stream_by_its_id() -> None: + """A subscribed name that is no stream of the workflow's is a standalone stream's id. + + The server resolves a subscription the same way, an owned stream by that + name first, so the replayer has to look in both places to hand the replay + the records the workflow actually read. + """ + client = await _connect() + streams = StreamClient.connect(TARGET or "") + task_queue = "replay-src-tq-" + uuid.uuid4().hex[:8] + workflow_id = "replay-src-wf-" + uuid.uuid4().hex[:8] + stream_id = "replay-src-" + uuid.uuid4().hex[:8] + tokens = ["a1", "a2", "b1"] + try: + await streams.create(stream_id) + async with Worker( + client, task_queue=task_queue, workflows=[ConsumeAcrossTasks] + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(tokens)], + id=workflow_id, + task_queue=task_queue, + ) + await streams.get(stream_id).append(*[_record(t.encode()) for t in tokens]) + assert await asyncio.wait_for(handle.result(), timeout=60) == tokens + history = await handle.fetch_history() + + result = await Replayer( + workflows=[ConsumeAcrossTasks], stream_client=client + ).replay_workflow(history) + assert result.replay_failure is None + finally: + await streams.close() From dcab1422cdb511f543023e9639497131d5da48be Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 15:20:31 -0700 Subject: [PATCH 541/831] Repinned Core so a task owed records it was not sent fails first. A sticky task or a sticky legacy query handed to a worker that evicted the run arrives with partial history and no records, and the history the worker fetches itself carries none either. Core now fails such a task before the workflow runs on less input than it had. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index f8c5fa89e..61b0cae8f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit f8c5fa89e7bb02fd3f439cde37abcff85d10018f +Subproject commit 61b0cae8f983d4d3099e7a9154685108ecee67cb From 5c46cec179c5986671128a8e252598c68a5613af Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 15:20:31 -0700 Subject: [PATCH 542/831] Followed a workflow reset on the native handle. A run's close event names a continue-as-new successor but not the run it was reset into; describe does. The reset run's inherited streams continue the base run's offset space and refuse anything below their floor, so a chain-following read starts them at the floor the stream reports. A reset run's start event is the base run's, copied, so its original run id leads a handle opened afterwards back to the base run. --- CHANGELOG.md | 5 +- temporalio/streams/providers/native.py | 80 +++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ce49c6fd..4c3b51a49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,10 @@ to include examples, links to docs, or any other relevant information. records only the offsets each task consumed, so the replayer fetches the records from the stream service and hands them to the replay with the history. A range the stream no longer holds fails the replay with - `StreamNotFoundError`. + `StreamNotFoundError`. A handle without a run id follows a workflow reset as + it follows a continue-as-new, reading the reset run from the floor its stream + reports, and the replayer fetches the ranges recorded before a reset point + from the run the workflow was reset from. ### Changed diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 9c0cb3dbd..c224afb2a 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -11,7 +11,11 @@ A cursor names the run as well as the offset, because an owned stream belongs to one run and a successor's starts over at zero. A handle without a run id reads run after run, learning from the poll that a run's stream is closed and -from the run's close event who came next; with a run id it is pinned. +from the run's close event who came next; with a run id it is pinned. A run +that was reset is followed too: its close event does not name the run reset +from it, describe does, and that run's streams continue the base run's offset +space where it inherited a subscription, so the read resumes at the floor the +stream reports rather than at zero. Prototype support for AI-198. It needs a server built from that branch and opens its own gRPC channel to it, because sdk-core does not know the stream @@ -298,7 +302,12 @@ def read( after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes. + + The chain is followed across continue-as-new and across a reset: a + run reset from a closed one is read next, from the floor its stream + reports. A handle pinned to a run that was reset ends with that run. + """ topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. @@ -338,10 +347,10 @@ async def _read( break if self._run_id is not None: return - successor = await self._successor(run_id) - if successor is None: + following = await self._successor(topic, run_id) + if following is None: return - run_id, offset = successor, 0 + run_id, offset = following async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, naming the run it was read from. @@ -412,31 +421,84 @@ async def _predecessor(self, run_id: str) -> str | None: try: async for event in handle.fetch_history_events(page_size=1): attributes = event.workflow_execution_started_event_attributes - return attributes.continued_execution_run_id or None + if attributes.continued_execution_run_id: + return attributes.continued_execution_run_id + # A reset run's start event is the base run's, copied, and the + # original run id it carries is kept across resets, so it names + # the run the chain of resets began from. + original = attributes.original_execution_run_id + if original and original != run_id: + return original + return None except RPCError as error: if error.status != RPCStatusCode.NOT_FOUND: raise # The run's History is gone: the chain's retained part starts here. return None - async def _successor(self, run_id: str) -> str | None: + async def _successor(self, topic: str, run_id: str) -> tuple[str, int] | None: + """The run that carries on after ``run_id``, and where its stream starts. + + A continue-as-new names its successor in the close event, and the + successor's streams start at zero. A reset does not: the base run is + closed with no word of the reset in its own History, and only describe + names the run reset from it. That run reads on streams of its own that + continue the base run's offset space where it inherited a subscription, + and such a stream refuses any offset below its floor, so the read + resumes at the floor the stream reports. + """ handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) events = handle.fetch_history_events( event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT ) + closed = False try: async for event in events: + closed = True if event.HasField( "workflow_execution_continued_as_new_event_attributes" ): attributes = ( event.workflow_execution_continued_as_new_event_attributes ) - return attributes.new_execution_run_id or None + if not attributes.new_execution_run_id: + return None + return attributes.new_execution_run_id, 0 except RPCError as error: if error.status != RPCStatusCode.NOT_FOUND: raise - return None + return None + if not closed: + return None + reset_run = await self._reset_run(run_id) + if reset_run is None: + return None + return reset_run, await self._floor(topic, reset_run) + + async def _reset_run(self, run_id: str) -> str | None: + """The run ``run_id`` was reset into, which only describe reports.""" + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) + try: + description = await handle.describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + return None + raise + extended = description.raw_description.workflow_extended_info + return extended.reset_run_id or None + + async def _floor(self, topic: str, run_id: str) -> int: + """The first offset a run's stream holds. + + A stream the run inherited a subscription to exists from the reset on + and starts at the inherited offset. One the base run only published to + is created on the run's first publish, at zero, and does not exist + before that. + """ + try: + return (await self._stream(topic, run_id).describe()).base_offset + except StreamNotFoundError: + return 0 class NativeStreams(ProviderPlugin): From fe803301c5d0dc24144367a3c5bcde7970614e41 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 15:20:31 -0700 Subject: [PATCH 543/831] Fetched each era of a reset run's history from the run that holds it. The ranges recorded before a reset point were consumed from the base run's streams, and only the reset marker after them names that run. The replayer splits the history at each marker the way the server does when it re-supplies a cache miss. --- temporalio/worker/_replayer.py | 89 +++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 27 deletions(-) diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index d020e2256..ee9fb6a0f 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -12,6 +12,7 @@ from typing_extensions import TypedDict +import temporalio.api.enums.v1 import temporalio.api.history.v1 import temporalio.api.stream.v1 import temporalio.bridge.proto.workflow_activation @@ -474,6 +475,40 @@ def _consumed_ranges( return out +def _eras( + history: temporalio.client.WorkflowHistory, +) -> list[tuple[str, list[tuple[int, temporalio.api.stream.v1.StreamRange]]]]: + """The recorded ranges grouped by the run whose streams hold them. + + A reset copies the base run's history into the new run, so the ranges + before the reset point were consumed from the base run's streams, and the + run they belong to is only named by the `WorkflowTaskFailed` event that + marks the reset point, after them in the history. Ranges after the last + reset point belong to the run itself, which that event names as well; a + history with no reset point belongs to the run its start event names. This + is the split the server makes when it re-supplies a cache miss. + """ + reset = temporalio.api.enums.v1.WorkflowTaskFailedCause.WORKFLOW_TASK_FAILED_CAUSE_RESET_WORKFLOW + eras: list[tuple[str, list[tuple[int, temporalio.api.stream.v1.StreamRange]]]] = [] + pending: list[tuple[int, temporalio.api.stream.v1.StreamRange]] = [] + own_run_id = history.run_id + for event in history.events: + if event.HasField("workflow_task_failed_event_attributes"): + failed = event.workflow_task_failed_event_attributes + if failed.cause == reset and failed.base_run_id: + eras.append((failed.base_run_id, pending)) + pending = [] + own_run_id = failed.new_run_id or own_run_id + continue + if not event.HasField("workflow_task_completed_event_attributes"): + continue + attributes = event.workflow_task_completed_event_attributes + for consumed in attributes.consumed_stream_ranges: + pending.append((event.event_id, consumed)) + eras.append((own_run_id, pending)) + return eras + + def _stream_records_missing(history: temporalio.client.WorkflowHistory) -> str | None: """Why this history cannot be replayed without a stream client, or ``None``.""" ranges = [r for _, r in _consumed_ranges(history) if r.to_offset > r.from_offset] @@ -496,43 +531,43 @@ async def _stream_slices( The shape is the one the server puts on a poll response when it re-supplies a cache miss: one slice per recorded range, tagged with the completion that - recorded it, an empty range included. Raises - :py:class:`temporalio.streams.StreamNotFoundError` for a range the stream no - longer holds. + recorded it, an empty range included, fetched from the run whose stream + holds it (the run reset from, for a range recorded before a reset point). + Raises :py:class:`temporalio.streams.StreamNotFoundError` for a range the + stream no longer holds. """ - ranges = _consumed_ranges(history) - if not ranges: + if not _consumed_ranges(history): return [] # Imported here: the stream client needs the grpc extra, which a replayer # without a stream client never touches. from temporalio.client_stream import shared_client streams = shared_client(client.service_client.config.target_host, client.namespace) - run_id = history.run_id - # The handle that served each stream id, so later ranges of the same + # The handle that served each run's stream, so later ranges of the same # stream go straight to it. - served_by: dict[str, Any] = {} + served_by: dict[tuple[str, str], Any] = {} slices: list[bytes] = [] - for event_id, consumed in ranges: - stream_slice = temporalio.api.stream.v1.StreamSlice( - stream_id=consumed.stream_id, - run_id=run_id, - from_offset=consumed.from_offset, - to_offset=consumed.to_offset, - workflow_task_completed_event_id=event_id, - ) - if consumed.to_offset > consumed.from_offset: - handle, records, owner_run_id = await _fetch_range( - streams, - history.workflow_id, - run_id, - consumed, - served_by.get(consumed.stream_id), + for run_id, ranges in _eras(history): + for event_id, consumed in ranges: + stream_slice = temporalio.api.stream.v1.StreamSlice( + stream_id=consumed.stream_id, + run_id=run_id, + from_offset=consumed.from_offset, + to_offset=consumed.to_offset, + workflow_task_completed_event_id=event_id, ) - served_by[consumed.stream_id] = handle - stream_slice.run_id = owner_run_id or run_id - stream_slice.records.extend(records) - slices.append(stream_slice.SerializeToString()) + if consumed.to_offset > consumed.from_offset: + handle, records, owner_run_id = await _fetch_range( + streams, + history.workflow_id, + run_id, + consumed, + served_by.get((run_id, consumed.stream_id)), + ) + served_by[(run_id, consumed.stream_id)] = handle + stream_slice.run_id = owner_run_id or run_id + stream_slice.records.extend(records) + slices.append(stream_slice.SerializeToString()) return slices From 437be0c5d253f2c995ca3988c6ff6d46ea48c77f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 15:30:43 -0700 Subject: [PATCH 544/831] Repinned Core so a sticky legacy query owed records goes unanswered. A recorded range with content that the response carried no records for is now the worker's failure to reconstruct the run rather than nondeterminism, so a legacy query on the sticky queue of an evicted run is left for the server to retry where the records travel, and a task fails without ever failing the workflow over it. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 61b0cae8f..6446174bd 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 61b0cae8f983d4d3099e7a9154685108ecee67cb +Subproject commit 6446174bd0cdd97a2dcc72cd16d84cfa55be4361 From 43504a8b36b86d2dabc3acc20c339ee35cb1477f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 15:30:43 -0700 Subject: [PATCH 545/831] Tested queries and a reset against the native provider. A cold worker answers a query from replayed state because the non-sticky query task carries the recorded ranges. A sticky query to a worker that evicted the run goes unanswered and is retried non-sticky. A reset run replays the base run's ranges, carries its subscription on at the inherited offset, and is followed by chain-following readers and the replayer. --- tests/worker/test_workflow_stream_e2e.py | 270 ++++++++++++++++++++++- 1 file changed, 266 insertions(+), 4 deletions(-) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 2a1fec829..b961fe0e5 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -18,16 +18,18 @@ import os import uuid from collections.abc import Sequence +from datetime import timedelta from typing import Any import pytest from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.api.enums.v1 import EventType +from temporalio.api.common.v1 import Payload, WorkflowExecution +from temporalio.api.enums.v1 import EventType, WorkflowTaskFailedCause from temporalio.api.history.v1 import HistoryEvent from temporalio.api.stream.v1 import StreamRange, StreamRecord -from temporalio.client import Client, WorkflowHistory +from temporalio.api.workflowservice.v1 import ResetWorkflowExecutionRequest +from temporalio.client import Client, WorkflowExecutionStatus, WorkflowHistory from temporalio.client_stream import StreamClient from temporalio.converter import DataConverter, PayloadCodec from temporalio.streams import RecordKind, StreamNotFoundError @@ -73,11 +75,19 @@ async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: class ContractLoop: """Reads ``inputs``, publishes a decision per value, reports control records.""" + def __init__(self) -> None: + self._trace: list[dict[str, Any]] = [] + + @workflow.query + def trace(self) -> list[dict[str, Any]]: + """What the loop has decided so far, for a query against replayed state.""" + return self._trace + @workflow.run async def run(self) -> list[dict[str, Any]]: inputs = workflow.stream_reader(INPUTS, result_type=dict) decisions = workflow.stream_writer(DECISIONS) - trace: list[dict[str, Any]] = [] + trace = self._trace async for record in inputs: if record.kind is RecordKind.SUPERSEDED: assert record.supersession is not None @@ -649,3 +659,255 @@ async def test_a_replayer_fetches_a_standalone_stream_by_its_id() -> None: assert result.replay_failure is None finally: await streams.close() + + +TWO_DECISIONS = [{"kind": "decision", "n": 1}, {"kind": "decision", "n": 2}] + + +async def _feed_two(client: Client, workflow_id: str) -> Any: + """Append two inputs and wait until both decisions are out, so their tasks have completed.""" + stream = client.get_stream_handle(workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + await take(stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60) + return producer + + +async def test_a_query_against_a_cold_worker_answers_from_replayed_state() -> None: + """A query task built through matching carries the recorded ranges. + + With the cache off every task is a full replay. A query dispatched to a + worker that holds nothing has to rebuild the run from History, and the + records the run read are not in it, so the server attaches them to the + query task the way it does to a task after a cache miss. Without them the + replay would have nothing to read and the query would fail. + """ + provider = NativeStreams() + client = await _connect(provider) + task_queue = "query-cold-tq-" + uuid.uuid4().hex[:8] + workflow_id = "query-cold-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + producer = await _feed_two(client, workflow_id) + assert await handle.query(ContractLoop.trace) == TWO_DECISIONS + await producer.finish() + await asyncio.wait_for(handle.result(), 60) + finally: + await provider.close() + + +async def test_a_sticky_query_after_an_eviction_still_answers() -> None: + """A query sent to the sticky queue of a run the worker evicted still answers. + + The sticky task carries the history since the last task and no records, + which a worker that lost the run cannot use. Core sees that the history it + fetched itself records a consumed range it was sent no records for, and + lets the query go unanswered rather than answer it from the wrong state. + The server's sticky attempt then times out, stickiness is reset, and the + query is dispatched again on the normal queue, which carries the records. + The sticky timeout is shortened so the test does not wait the default out. + """ + provider = NativeStreams() + client = await _connect(provider) + task_queue = "query-sticky-tq-" + uuid.uuid4().hex[:8] + first_id = "query-sticky-a-" + uuid.uuid4().hex[:8] + second_id = "query-sticky-b-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + max_cached_workflows=1, + sticky_queue_schedule_to_start_timeout=timedelta(seconds=2), + ): + first = await client.start_workflow( + ContractLoop.run, id=first_id, task_queue=task_queue + ) + first_producer = await _feed_two(client, first_id) + # A second run on a one-slot cache pushes the first out of it. + second = await client.start_workflow( + ContractLoop.run, id=second_id, task_queue=task_queue + ) + second_producer = await _feed_two(client, second_id) + + answer = await first.query( + ContractLoop.trace, rpc_timeout=timedelta(seconds=60) + ) + assert answer == TWO_DECISIONS + + await first_producer.finish() + await second_producer.finish() + await asyncio.wait_for(first.result(), 60) + await asyncio.wait_for(second.result(), 60) + finally: + await provider.close() + + +async def _collect( + client: Client, workflow_id: str, topic: str, run_id: str | None +) -> list[tuple[Any, str, int]]: + """Every record on ``topic`` as ``(value, run, offset)``, the run and offset from the cursor.""" + handle = client.get_stream_handle(workflow_id, run_id=run_id) + out: list[tuple[Any, str, int]] = [] + async for record in handle.read(topic=topic, result_type=dict): + # native:: + _, run, offset = record.cursor.token.split(":") + out.append((record.value, run, int(offset))) + return out + + +async def test_a_reset_run_is_followed_and_replayed() -> None: + """A run reset from a consuming one carries its subscriptions on, and readers follow. + + The reset re-runs the task named by the reset point, so the base run's + history is copied up to that task and the ranges recorded in the copy are + what the reset run replays, from the base run's streams. The inherited + ``inputs`` stream is the reset run's own from the inherited cursor on: it + starts empty at that offset, and the input the re-run task had consumed is + not delivered again, so the next input takes that offset. The + ``decisions`` stream, which the base run only published to, starts at zero. + A handle without a run id follows the base run into the reset run and starts + each stream at the floor it reports; a handle pinned to the base run ends + with it; the ``Replayer`` fetches each era of the reset run's history from + the run whose stream holds it. + """ + provider = NativeStreams() + client = await _connect(provider) + task_queue = "reset-tq-" + uuid.uuid4().hex[:8] + workflow_id = "reset-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker(client, task_queue=task_queue, workflows=[ContractLoop]): + base = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + base_run = base.result_run_id + assert base_run + producer = await _feed_two(client, workflow_id) + # A third input in a task of its own, which is the task the reset + # re-runs: its consumption is dropped with it. + await producer.append({"n": 3}) + base_stream = client.get_stream_handle(workflow_id, run_id=base_run) + await take( + base_stream.read(topic=DECISIONS, result_type=dict), 3, timeout=60 + ) + + # Reset to the completion of the last consuming task, while the base + # run waits for more input. + completion_id = 0 + async for event in client.get_workflow_handle( + workflow_id, run_id=base_run + ).fetch_history_events(): + if event.HasField("workflow_task_completed_event_attributes"): + completed = event.workflow_task_completed_event_attributes + if any( + r.to_offset > r.from_offset + for r in completed.consumed_stream_ranges + ): + completion_id = event.event_id + assert completion_id + reset = await client.workflow_service.reset_workflow_execution( + ResetWorkflowExecutionRequest( + namespace=client.namespace, + workflow_execution=WorkflowExecution( + workflow_id=workflow_id, run_id=base_run + ), + reason="re-run the last consuming task", + workflow_task_finish_event_id=completion_id, + request_id=uuid.uuid4().hex, + ) + ) + reset_run = reset.run_id + assert reset_run and reset_run != base_run + + # A fresh producer pins to the current run, the reset run, whose + # inherited inputs stream continues at the inherited offset. + continued = client.get_stream_handle(workflow_id).producer( + topic=INPUTS, producer_id="model2", attempt=1 + ) + await continued.append({"n": 4}) + await continued.finish() + trace = await asyncio.wait_for( + client.get_workflow_handle(workflow_id, run_id=reset_run).result(), + 60, + ) + # The first two decisions were replayed from the base run's stream; + # the third input went with the task the reset re-ran. + assert trace == TWO_DECISIONS + [ + {"kind": "decision", "n": 4}, + {"kind": "finish", "producer": "model2"}, + ] + + # The base run was terminated by the reset, and describe is the one + # place that names the run it was reset into. + described = await client.get_workflow_handle( + workflow_id, run_id=base_run + ).describe() + assert described.status == WorkflowExecutionStatus.TERMINATED + extended = described.raw_description.workflow_extended_info + assert extended.reset_run_id == reset_run + + # A reader pinned to the base run ends with the base run. + pinned = await asyncio.wait_for( + _collect(client, workflow_id, DECISIONS, base_run), 30 + ) + assert pinned == [ + ({"decided": 1}, base_run, 0), + ({"decided": 2}, base_run, 1), + ({"decided": 3}, base_run, 2), + ] + + # A chain-following reader crosses from the base run into the reset + # run on both topics, with no gap and no refusal: the published one + # restarts at zero, the inherited one continues at the floor. + decisions = await asyncio.wait_for( + _collect(client, workflow_id, DECISIONS, None), 30 + ) + assert decisions == [ + ({"decided": 1}, base_run, 0), + ({"decided": 2}, base_run, 1), + ({"decided": 3}, base_run, 2), + ({"decided": 4}, reset_run, 0), + (None, reset_run, 1), + ] + inputs = await asyncio.wait_for( + _collect(client, workflow_id, INPUTS, None), 30 + ) + assert inputs == [ + ({"n": 1}, base_run, 0), + ({"n": 2}, base_run, 1), + ({"n": 3}, base_run, 2), + ({"n": 4}, reset_run, 2), + (None, reset_run, 3), + ] + latest = await client.get_stream_handle(workflow_id).latest(topic=INPUTS) + assert latest.token == f"native:{reset_run}:3" + + # The reset run's history: the base run's events, the reset marker + # naming both runs, then its own. The replayer fetches the first era + # from the base run's stream and the rest from the reset run's. + history = await client.get_workflow_handle( + workflow_id, run_id=reset_run + ).fetch_history() + reset_cause = WorkflowTaskFailedCause.WORKFLOW_TASK_FAILED_CAUSE_RESET_WORKFLOW + markers = [ + (failed.base_run_id, failed.new_run_id) + for event in history.events + if event.HasField("workflow_task_failed_event_attributes") + for failed in [event.workflow_task_failed_event_attributes] + if failed.cause == reset_cause + ] + assert markers == [(base_run, reset_run)] + result = await Replayer( + workflows=[ContractLoop], plugins=[provider], stream_client=client + ).replay_workflow(history) + assert result.replay_failure is None + finally: + await provider.close() From f44aa3d9d2f684fe053a53edd316b245e3279d6d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 17:18:00 -0700 Subject: [PATCH 546/831] Carried a workflow's stream records with its exported history. History records only the offsets a task consumed, so an export alone could not be replayed once the stream was gone. `WorkflowHistory.stream_slices` holds the records, `to_json` and `from_json` carry them beside the events with the plain shape unchanged, and `Replayer.fetch_stream_slices` fills them while the stream is retained, so the exported file is the whole replay input. --- CHANGELOG.md | 6 +- temporalio/client/_workflow.py | 57 ++++++++++++++--- temporalio/worker/_replayer.py | 79 ++++++++++++++++++------ tests/worker/test_replayer.py | 46 ++++++++++++++ tests/worker/test_workflow_stream_e2e.py | 49 +++++++++++++++ 5 files changed, 209 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c3b51a49..8c07338e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,7 +49,11 @@ to include examples, links to docs, or any other relevant information. `StreamNotFoundError`. A handle without a run id follows a workflow reset as it follows a continue-as-new, reading the reset run from the floor its stream reports, and the replayer fetches the ranges recorded before a reset point - from the run the workflow was reset from. + from the run the workflow was reset from. For offline replay, + `Replayer.fetch_stream_slices(client, history)` attaches the records to a + `WorkflowHistory` while the stream is retained, `to_json()` and `from_json()` + carry them as `streamSlices` beside the events, and a history that carries + them replays with no server. ### Changed diff --git a/temporalio/client/_workflow.py b/temporalio/client/_workflow.py index 0607ade0a..10a4853fd 100644 --- a/temporalio/client/_workflow.py +++ b/temporalio/client/_workflow.py @@ -4,6 +4,7 @@ import asyncio import functools +import json import warnings from asyncio import Future from collections.abc import ( @@ -31,6 +32,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.history.v1 +import temporalio.api.stream.v1 import temporalio.api.update.v1 import temporalio.api.workflow.v1 import temporalio.api.workflowservice.v1 @@ -1681,6 +1683,20 @@ class WorkflowHistory: events: Sequence[temporalio.api.history.v1.HistoryEvent] """History events for the workflow.""" + stream_slices: Sequence[temporalio.api.stream.v1.StreamSlice] = () + """The stream records the workflow's completed tasks consumed, if captured. + + History records only the offsets each Workflow Task consumed from a + server-side stream; the records live in the stream. A history whose tasks + consumed records and that carries none here cannot be replayed without the + server that still holds the stream. One slice per recorded range, tagged + with the ``WorkflowTaskCompleted`` event that recorded it, in the shape the + server puts on a poll response. + :py:meth:`temporalio.worker.Replayer.fetch_stream_slices` fills it while + the stream is retained, and :py:meth:`to_json` and :py:meth:`from_json` + carry it, so an exported history file is the whole replay input. + """ + @property def run_id(self) -> str: """Run ID extracted from the first event.""" @@ -1702,31 +1718,56 @@ def from_json(workflow_id: str, history: str | dict[str, Any]) -> WorkflowHistor Args: workflow_id: The workflow's ID history: A string or parsed-to-dict representation of workflow - history + history. A ``streamSlices`` list beside ``events``, as + :py:meth:`to_json` writes one, is read into + :py:attr:`stream_slices`. Returns: Workflow history """ + if isinstance(history, str): + history = json.loads(history) parsed = _history_from_json(history) - return WorkflowHistory(workflow_id, parsed.events) + slices: list[temporalio.api.stream.v1.StreamSlice] = [] + if isinstance(history, dict): + raw = history.get("streamSlices") or history.get("stream_slices") or [] + for entry in raw: + slices.append( + google.protobuf.json_format.ParseDict( + entry, + temporalio.api.stream.v1.StreamSlice(), + ignore_unknown_fields=True, + ) + ) + return WorkflowHistory(workflow_id, parsed.events, slices) def to_json(self) -> str: """Convert this history to JSON. - Note, this does not include the workflow ID. + Note, this does not include the workflow ID. The stream slices, when + there are any, are written as a ``streamSlices`` list beside the + events; without them the output is the history proto's JSON alone. """ - return google.protobuf.json_format.MessageToJson( - temporalio.api.history.v1.History(events=self.events) - ) + if not self.stream_slices: + return google.protobuf.json_format.MessageToJson( + temporalio.api.history.v1.History(events=self.events) + ) + return json.dumps(self.to_json_dict(), indent=2) def to_json_dict(self) -> dict[str, Any]: """Convert this history to JSON-compatible dict. - Note, this does not include the workflow ID. + Note, this does not include the workflow ID. See :py:meth:`to_json` + for how the stream slices are carried. """ - return google.protobuf.json_format.MessageToDict( + out = google.protobuf.json_format.MessageToDict( temporalio.api.history.v1.History(events=self.events) ) + if self.stream_slices: + out["streamSlices"] = [ + google.protobuf.json_format.MessageToDict(s) for s in self.stream_slices + ] + return out @dataclass diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index ee9fb6a0f..e84efa8cb 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -74,13 +74,21 @@ def __init__( A workflow that read a server-side stream cannot be replayed from its history alone. History records the offsets each Workflow Task consumed and never the records; on a live task the server re-supplies them from - the stream. ``stream_client`` is a client connected to the server that - still holds those streams. Given one, the replayer fetches every range - a history's completed tasks recorded from the stream service and hands - the records to the replay alongside the history, so the workflow sees - what it saw the first time. A range the stream no longer holds fails - that replay with :py:class:`temporalio.streams.StreamNotFoundError`. - Without a client, replaying such a history fails and says so. + the stream. Three cases: + + * The history carries the records in + :py:attr:`temporalio.client.WorkflowHistory.stream_slices`, put + there by :py:meth:`fetch_stream_slices` while the stream was + retained and carried by ``to_json()`` and ``from_json()``. They are + handed to the replay and no server is contacted. + * The history carries none and ``stream_client`` is given: a client + connected to the server that still holds the streams. The replayer + fetches every range the completed tasks recorded from the stream + service and hands the records to the replay, so the workflow sees + what it saw the first time. A range the stream no longer holds fails + that replay with :py:class:`temporalio.streams.StreamNotFoundError`. + * The history carries none and there is no client: replaying it fails + and the message names both remedies. Note, unlike the worker, for the replayer the workflow_task_executor will default to a new thread pool executor with no max_workers set that @@ -127,6 +135,31 @@ def _set_default_workflow_logic_flag( else: self._default_workflow_logic_flags.discard(flag) + @staticmethod + async def fetch_stream_slices( + client: temporalio.client.Client, history: temporalio.client.WorkflowHistory + ) -> temporalio.client.WorkflowHistory: + """Return ``history`` with the stream records its tasks consumed attached. + + History records only the offsets each Workflow Task consumed from a + server-side stream, so an export cannot be replayed without the + server that still holds the stream. This fetches every recorded range + from the stream service through ``client`` while the stream is + retained and returns a copy of ``history`` with the records in + :py:attr:`temporalio.client.WorkflowHistory.stream_slices`. Its + ``to_json()`` then carries them, and a replayer given the result, or a + ``from_json()`` of it, needs no server. Ranges recorded before a reset + point are fetched from the run the workflow was reset from. + + Raises :py:class:`temporalio.streams.StreamNotFoundError` for a range + the stream no longer holds. + """ + return temporalio.client.WorkflowHistory( + history.workflow_id, + history.events, + await _stream_slices(client, history), + ) + def config(self, *, active_config: bool = False) -> ReplayerConfig: """Config, as a dictionary, used to create this replayer. @@ -388,18 +421,24 @@ def on_eviction_hook( async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: async for history in histories: # The records a consuming workflow read are not in its - # history. Either fetch them from the stream service or - # report here what is missing, rather than let Core fail - # the first task on input it was never given. + # history unless they were captured into it. Otherwise + # fetch them from the stream service, or report here what + # is missing, rather than let Core fail the first task on + # input it was never given. stream_slices: list[bytes] = [] - if stream_client is not None: + if history.stream_slices: + stream_slices = [ + s.SerializeToString() for s in history.stream_slices + ] + elif stream_client is not None: try: - stream_slices = await _stream_slices(stream_client, history) + fetched = await _stream_slices(stream_client, history) except temporalio.streams.StreamNotFoundError as err: yield WorkflowReplayResult( history=history, replay_failure=err ) continue + stream_slices = [s.SerializeToString() for s in fetched] else: missing = _stream_records_missing(history) if missing is not None: @@ -518,16 +557,18 @@ def _stream_records_missing(history: temporalio.client.WorkflowHistory) -> str | return ( f"workflow {history.workflow_id!r} consumed records from stream(s) " f"{', '.join(repr(s) for s in streams)} in {len(ranges)} task(s), and History " - "records only the offsets. Create the Replayer with stream_client= (a Client " - "connected to the server that still holds the streams) so the records can be " - "fetched from the stream service." + "records only the offsets. Either create the Replayer with stream_client= (a " + "Client connected to the server that still holds the streams) so the records " + "can be fetched from the stream service, or replay a history exported with " + "them: Replayer.fetch_stream_slices(client, history) attaches the records " + "while the stream is retained and WorkflowHistory.to_json() carries them." ) async def _stream_slices( client: temporalio.client.Client, history: temporalio.client.WorkflowHistory -) -> list[bytes]: - """Fetch the records the history's tasks consumed, as serialized ``StreamSlice`` messages. +) -> list[temporalio.api.stream.v1.StreamSlice]: + """Fetch the records the history's tasks consumed, as ``StreamSlice`` messages. The shape is the one the server puts on a poll response when it re-supplies a cache miss: one slice per recorded range, tagged with the completion that @@ -546,7 +587,7 @@ async def _stream_slices( # The handle that served each run's stream, so later ranges of the same # stream go straight to it. served_by: dict[tuple[str, str], Any] = {} - slices: list[bytes] = [] + slices: list[temporalio.api.stream.v1.StreamSlice] = [] for run_id, ranges in _eras(history): for event_id, consumed in ranges: stream_slice = temporalio.api.stream.v1.StreamSlice( @@ -567,7 +608,7 @@ async def _stream_slices( served_by[(run_id, consumed.stream_id)] = handle stream_slice.run_id = owner_run_id or run_id stream_slice.records.extend(records) - slices.append(stream_slice.SerializeToString()) + slices.append(stream_slice) return slices diff --git a/tests/worker/test_replayer.py b/tests/worker/test_replayer.py index 52fed7416..ddce04826 100644 --- a/tests/worker/test_replayer.py +++ b/tests/worker/test_replayer.py @@ -8,8 +8,12 @@ from pathlib import Path from typing import Any +import google.protobuf.json_format import pytest +import temporalio.api.common.v1 +import temporalio.api.history.v1 +import temporalio.api.stream.v1 import temporalio.worker._workflow_instance from temporalio import activity, workflow from temporalio.client import Client, WorkflowFailureError, WorkflowHistory @@ -121,6 +125,48 @@ async def test_replayer_workflow_complete(client: Client) -> None: ) +def test_workflow_history_json_carries_stream_slices_only_when_present() -> None: + """The JSON shape is unchanged without slices, and round-trips them when present.""" + with Path(__file__).with_name("test_replayer_complete_history.json").open("r") as f: + history = WorkflowHistory.from_json("fake", f.read()) + assert list(history.stream_slices) == [] + # Byte for byte what the history proto's JSON was before slices existed. + assert history.to_json() == google.protobuf.json_format.MessageToJson( + temporalio.api.history.v1.History(events=history.events) + ) + assert "streamSlices" not in history.to_json_dict() + + record = temporalio.api.stream.v1.StreamRecord( + body=temporalio.api.common.v1.Payload( + data=b'{"n": 1}', metadata={"encoding": b"json/plain"} + ), + topic="inputs", + kind=temporalio.api.stream.v1.StreamRecordKind.STREAM_RECORD_KIND_DATA, + producer_id="model", + attempt=1, + sequence=0, + ) + stream_slice = temporalio.api.stream.v1.StreamSlice( + stream_id="inputs", + run_id="run-1", + from_offset=0, + to_offset=1, + records=[record], + workflow_task_completed_event_id=4, + ) + bundle = WorkflowHistory("fake", history.events, [stream_slice]) + + text = bundle.to_json() + assert "streamSlices" in text + restored = WorkflowHistory.from_json("fake", text) + assert list(restored.stream_slices) == [stream_slice] + assert list(restored.events) == list(history.events) + # The dict form reads back the same, and a plain export stays plain. + from_dict = WorkflowHistory.from_json("fake", bundle.to_json_dict()) + assert list(from_dict.stream_slices) == [stream_slice] + assert WorkflowHistory("fake", restored.events).to_json() == history.to_json() + + @pytest.mark.skipif(sys.version_info < (3, 12), reason="Skipping for < 3.12") async def test_replayer_workflow_complete_json() -> None: # See `test_replayer_workflow_complete` for full skip description. diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index b961fe0e5..652aae699 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -909,5 +909,54 @@ async def test_a_reset_run_is_followed_and_replayed() -> None: workflows=[ContractLoop], plugins=[provider], stream_client=client ).replay_workflow(history) assert result.replay_failure is None + + # Exported with its records, the reset run's history replays with no + # server: the slices come from both runs' streams. + bundle = await Replayer.fetch_stream_slices(client, history) + assert {s.run_id for s in bundle.stream_slices if s.records} == { + base_run, + reset_run, + } + restored = WorkflowHistory.from_json(workflow_id, bundle.to_json()) + offline = await Replayer( + workflows=[ContractLoop], plugins=[provider] + ).replay_workflow(restored) + assert offline.replay_failure is None + finally: + await provider.close() + + +async def test_an_exported_history_replays_offline_with_its_records() -> None: + """A history exported with its stream records is the whole replay input. + + ``fetch_stream_slices`` captures the records while the stream is retained, + ``to_json`` writes them beside the events, ``from_json`` reads them back, + and a replayer with no client replays the result. A plain export carries + none and is refused with both remedies named. + """ + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + assert "streamSlices" not in history.to_json() + + bundle = await Replayer.fetch_stream_slices(client, history) + assert list(bundle.events) == list(history.events) + assert any(s.records for s in bundle.stream_slices) + text = bundle.to_json() + assert "streamSlices" in text + restored = WorkflowHistory.from_json(history.workflow_id, text) + assert list(restored.stream_slices) == list(bundle.stream_slices) + assert list(restored.events) == list(history.events) + + offline = Replayer(workflows=[ContractLoop], plugins=[provider]) + result = await offline.replay_workflow(restored) + assert result.replay_failure is None + + # With the records stripped it is a plain export again. + stripped = WorkflowHistory(restored.workflow_id, restored.events) + with pytest.raises(RuntimeError, match="stream_client=") as raised: + await offline.replay_workflow(stripped) + assert "fetch_stream_slices" in str(raised.value) finally: await provider.close() From 9038d8a0d6811e41adfd54329375c96bd29eec86 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 17:31:12 -0700 Subject: [PATCH 547/831] Rewrote the vendored stream stubs' type references onto temporalio. mypy-protobuf writes the public API types fully qualified into the stubs, `temporal.api.common.v1.message_pb2.Payload`, which the generator's import rewrites did not reach, so a cold mypy run found `temporal` undefined in three stubs. The rule matches the module form only, so the proto package names inside the serialized descriptors stay as they are. --- scripts/gen_stream_protos.py | 10 ++++++++++ temporalio/api/streamservice/v1/message_pb2.pyi | 16 ++++++++-------- .../streamservice/v1/request_response_pb2.pyi | 8 ++++---- .../api/streamservice/v1/stream_state_pb2.pyi | 4 ++-- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py index 6b6487294..faf5453d5 100644 --- a/scripts/gen_stream_protos.py +++ b/scripts/gen_stream_protos.py @@ -86,6 +86,16 @@ def api_proto_path() -> Path: (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), (re.compile(r"from temporal\.api\."), "from temporalio.api."), (re.compile(r"import temporal\.api\."), "import temporalio.api."), + # mypy-protobuf also writes the public API types fully qualified in the + # stubs, `temporal.api.common.v1.message_pb2.Payload`, which the import + # rewrites above do not reach. The `_pb2` suffix keeps this off the proto + # package names inside the serialized descriptors, which stay `temporal.api`. + # After the streamservice rewrite on purpose, so the public + # `temporal.api.stream.v1` package is not sent to the vendored one. + ( + re.compile(r"\btemporal\.api\.(\w+)\.v1\.(\w+_pb2)\b"), + r"temporalio.api.\1.v1.\2", + ), ] diff --git a/temporalio/api/streamservice/v1/message_pb2.pyi b/temporalio/api/streamservice/v1/message_pb2.pyi index 8ead3cae8..548460a97 100644 --- a/temporalio/api/streamservice/v1/message_pb2.pyi +++ b/temporalio/api/streamservice/v1/message_pb2.pyi @@ -36,12 +36,12 @@ class StreamRecord(google.protobuf.message.Message): VALUE_FIELD_NUMBER: builtins.int key: builtins.str @property - def value(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... def __init__( self, *, key: builtins.str = ..., - value: temporal.api.common.v1.message_pb2.Payload | None = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["value", b"value"] @@ -60,12 +60,12 @@ class StreamRecord(google.protobuf.message.Message): PRODUCER_ID_FIELD_NUMBER: builtins.int ATTEMPT_FIELD_NUMBER: builtins.int @property - def body(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... @property def metadata( self, ) -> google.protobuf.internal.containers.MessageMap[ - builtins.str, temporal.api.common.v1.message_pb2.Payload + builtins.str, temporalio.api.common.v1.message_pb2.Payload ]: """Producer-supplied provenance, stored as sent.""" topic: builtins.str @@ -73,7 +73,7 @@ class StreamRecord(google.protobuf.message.Message): """The producer's position within its attempt, or -1 when unnumbered. Stored as sent; the global offset is what orders the stream. """ - kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType + kind: temporalio.api.stream.v1.message_pb2.StreamRecordKind.ValueType """Settled to DATA on append when left unspecified, so a retry hashes the same bytes and a reader never sees the zero value. """ @@ -93,14 +93,14 @@ class StreamRecord(google.protobuf.message.Message): def __init__( self, *, - body: temporal.api.common.v1.message_pb2.Payload | None = ..., + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., metadata: collections.abc.Mapping[ - builtins.str, temporal.api.common.v1.message_pb2.Payload + builtins.str, temporalio.api.common.v1.message_pb2.Payload ] | None = ..., topic: builtins.str = ..., sequence: builtins.int = ..., - kind: temporal.api.stream.v1.message_pb2.StreamRecordKind.ValueType = ..., + kind: temporalio.api.stream.v1.message_pb2.StreamRecordKind.ValueType = ..., offset: builtins.int = ..., producer_id: builtins.str = ..., attempt: builtins.int = ..., diff --git a/temporalio/api/streamservice/v1/request_response_pb2.pyi b/temporalio/api/streamservice/v1/request_response_pb2.pyi index 7b24fb936..f0412c3ed 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.pyi +++ b/temporalio/api/streamservice/v1/request_response_pb2.pyi @@ -385,7 +385,7 @@ class PollMessagesOutput(google.protobuf.message.Message): head_offset: builtins.int closed: builtins.bool @property - def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def close_reason(self) -> temporalio.api.common.v1.message_pb2.Payload: ... run_id: builtins.str """The execution holding the stream. A workflow task slice built from this read names the run it came from. @@ -400,7 +400,7 @@ class PollMessagesOutput(google.protobuf.message.Message): next_offset: builtins.int = ..., head_offset: builtins.int = ..., closed: builtins.bool = ..., - close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + close_reason: temporalio.api.common.v1.message_pb2.Payload | None = ..., run_id: builtins.str = ..., ) -> None: ... def HasField( @@ -654,13 +654,13 @@ class CloseStreamInput(google.protobuf.message.Message): namespace: builtins.str stream_id: builtins.str @property - def reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def reason(self) -> temporalio.api.common.v1.message_pb2.Payload: ... def __init__( self, *, namespace: builtins.str = ..., stream_id: builtins.str = ..., - reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + reason: temporalio.api.common.v1.message_pb2.Payload | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["reason", b"reason"] diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.pyi b/temporalio/api/streamservice/v1/stream_state_pb2.pyi index 7b554c5e0..f44a56c07 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.pyi +++ b/temporalio/api/streamservice/v1/stream_state_pb2.pyi @@ -92,7 +92,7 @@ class StreamState(google.protobuf.message.Message): """Truncation floor. Offsets below this are gone.""" closed: builtins.bool @property - def close_reason(self) -> temporal.api.common.v1.message_pb2.Payload: ... + def close_reason(self) -> temporalio.api.common.v1.message_pb2.Payload: ... @property def producers( self, @@ -135,7 +135,7 @@ class StreamState(google.protobuf.message.Message): head_offset: builtins.int = ..., base_offset: builtins.int = ..., closed: builtins.bool = ..., - close_reason: temporal.api.common.v1.message_pb2.Payload | None = ..., + close_reason: temporalio.api.common.v1.message_pb2.Payload | None = ..., producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] | None = ..., consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] From b06871231fdd4d75c39e9ac62393217faad4768a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 17:46:53 -0700 Subject: [PATCH 548/831] Listed stream_provider in ClientConnectConfig. `Client.connect` takes `stream_provider`, and the TypedDict that mirrors its keyword arguments has to name the same keys. The client test that compares the two failed on every branch since the keyword was added. --- temporalio/client/_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index dc4ef68c4..7cf624242 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -3058,6 +3058,7 @@ class ClientConnectConfig(TypedDict, total=False): grpc_compression: GrpcCompression payload_limits: PayloadLimitsConfig header_codec_behavior: HeaderCodecBehavior + stream_provider: temporalio.streams.StreamProvider | None class ClientConfig(TypedDict, total=False): From 4b6d572cc101131072cf0af8546eeac69f86c62d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 17:46:53 -0700 Subject: [PATCH 549/831] Listed stream_provider in ClientConnectConfig. `Client.connect` takes `stream_provider`, and the TypedDict that mirrors its keyword arguments has to name the same keys. The client test that compares the two failed on every branch since the keyword was added. (cherry picked from commit b06871231fdd4d75c39e9ac62393217faad4768a) --- temporalio/client/_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 75e768167..79617dff4 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -3096,6 +3096,7 @@ class ClientConnectConfig(TypedDict, total=False): grpc_compression: GrpcCompression payload_limits: PayloadLimitsConfig header_codec_behavior: HeaderCodecBehavior + stream_provider: temporalio.streams.StreamProvider | None class ClientConfig(TypedDict, total=False): From 6ec392fca6a9a48d5bff868db807d695ee30c6f1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 17:54:57 -0700 Subject: [PATCH 550/831] Answered a legacy query without the stream snapshot beside it. A parked Run has no open Workflow Task, so the server dispatches a query on a task of its own and Core allows nothing beside the answer there. The instance still reported the registered wait set, Core refused the completion, and the query timed out. The test parks a Run and queries it. --- temporalio/worker/_workflow_instance.py | 14 ++++ .../test_worker_integration.py | 66 +++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 992bf7ed9..64cca2ea4 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -87,6 +87,9 @@ # Set to true to log all cases where we're ignoring things during delete LOG_IGNORE_DURING_DELETE = False +# Core answers a query carrying this id on the query's own task, alone. +_LEGACY_QUERY_ID = "legacy_query" + def _is_workflow_terminal_command( command: temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.WorkflowCommand, @@ -2643,6 +2646,17 @@ def _emit_external_stream_commands(self) -> None: if runtime is None or self._deleting: return + # A legacy query is answered on a task of its own, and Core refuses any + # other command beside that answer. The activation ran no Workflow code, + # so the wait set it would report is the one the retained task already + # holds, and there is no observation delta to commit. + if any( + command.HasField("respond_to_query") + and command.respond_to_query.query_id == _LEGACY_QUERY_ID + for command in self._current_completion.successful.commands + ): + return + # First, because the boundary a Continue-As-New header has to carry is # the one this activation is about to commit, and it only stops moving # here. diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index cf797719f..f9ad6d5d7 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -301,6 +301,72 @@ async def test_a_blocked_workflow_retains_its_task_rather_than_completing_it( await handle.terminate() +@workflow.defn +class ParkedQueryWorkflow: + """Blocks on an empty stream with a short idle timeout, so the task parks.""" + + def __init__(self) -> None: + self._seen: list[str] = [] + + @workflow.run + async def run(self) -> list[str]: + tokens = external_stream.with_options(idle_timeout=timedelta(seconds=1)).topic( + "tokens", type=str + ) + async for token in tokens.subscribe(): + self._seen.append(token) + break + return self._seen + + @workflow.query + def seen(self) -> list[str]: + return self._seen + + +async def test_a_query_against_a_parked_workflow_is_answered( + client: Client, backend: MemoryStreamBackend +) -> None: + """A parked Run has no open Workflow Task, so its query travels alone. + + The server dispatches it on a task of its own, and Core allows nothing + beside the answer on that task. The wait set is still registered from the + parked task, so reporting it again with the answer made Core refuse the + completion, and the query never returned. + """ + task_queue = f"tq-{uuid.uuid4()}" + async with Worker( + client, + task_queue=task_queue, + workflows=[ParkedQueryWorkflow], + external_stream_backend=backend, + ): + handle = await client.start_workflow( + ParkedQueryWorkflow.run, + id=f"wf-{uuid.uuid4()}", + task_queue=task_queue, + ) + # Past the idle timeout the retained task is reported and the Run + # waits for a wake with no task open. + await asyncio.sleep(3) + + assert await asyncio.wait_for(handle.query(ParkedQueryWorkflow.seen), 10) == [] + + description = await handle.describe() + key = StreamKey( + client.namespace, + handle.id, + description.raw_description.workflow_execution_info.first_run_id, + "tokens", + ) + await publish(backend, key, ["first"]) + assert await asyncio.wait_for(handle.result(), 60) == ["first"] + + events = [e async for e in handle.fetch_history_events()] + assert not any( + e.HasField("workflow_task_failed_event_attributes") for e in events + ), "a Workflow Task failed while the query was outstanding" + + async def test_a_workflow_without_a_configured_backend_says_so( client: Client, ) -> None: From d3aeb56914279bbb876fe3ffa9fa9796ba7e2272 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 18:02:43 -0700 Subject: [PATCH 551/831] Repinned Core to the repairs head that carries the stream protos. The vendored `temporalio/api` now regenerates byte-for-byte from the pin, which is what the `check-protos` job asserts. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 7df8a5b7a..c713b5e49 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 7df8a5b7a47b8112eb611c9777e04e44bf2d6fc6 +Subproject commit c713b5e49977b9f00485f7c94f2f944f6a295aee From 1a8d19feac2d5a416678003bfe87ff3fb7dc9b2b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 21 Sep 2026 18:03:43 -0700 Subject: [PATCH 552/831] Repinned Core to a protos-only branch on the commit main pins. `moe/AI-198-api-protos-on-85b71d7` is upstream's `85b71d7` plus the api branch's stream diff on its `api_upstream`, so the vendored `temporalio/api` regenerates byte-for-byte from the pin, which is what the `check-protos` job asserts. The bridge protos are unchanged. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 85b71d7ec..5209468cb 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 85b71d7ecd4f2bf677fa1cee17f3fbc1ab10f1b9 +Subproject commit 5209468cb61533f95b78c9f9d5561d55400e2d25 From 5590dbc67130f0568048f383b1ddb02c989526e7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 22 Sep 2026 00:04:13 -0700 Subject: [PATCH 553/831] Marked the reset event name as a literal in the eras docstring. pydoctor reads a single-backtick span as a link target and fails the docs build on a proto event name no Python object carries. --- temporalio/worker/_replayer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index e84efa8cb..47a54c218 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -521,7 +521,7 @@ def _eras( A reset copies the base run's history into the new run, so the ranges before the reset point were consumed from the base run's streams, and the - run they belong to is only named by the `WorkflowTaskFailed` event that + run they belong to is only named by the ``WorkflowTaskFailed`` event that marks the reset point, after them in the history. Ranges after the last reset point belong to the run itself, which that event names as well; a history with no reset point belongs to the run its start event names. This From 37d0be4b450394304fc9f7634f47d3d273e0de48 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:55:37 -0700 Subject: [PATCH 554/831] Vendored the stream additions to the public API protos. The generator stages the pinned API tree, applies the stream branch's diff and regenerates only the files it touches. Core moves to `moe/AI-198-api-protos-on-85b71d7`, which is the commit main pins plus that same diff on its `api_upstream`, so the vendored tree regenerates byte-for-byte from the pin and `check-protos` agrees. --- scripts/gen_stream_api_protos.py | 101 ++ temporalio/api/command/v1/__init__.py | 4 + temporalio/api/command/v1/message_pb2.py | 117 +- temporalio/api/command/v1/message_pb2.pyi | 105 ++ temporalio/api/enums/v1/command_type_pb2.py | 6 +- temporalio/api/enums/v1/command_type_pb2.pyi | 4 + temporalio/api/enums/v1/event_type_pb2.py | 6 +- temporalio/api/enums/v1/event_type_pb2.pyi | 20 + temporalio/api/enums/v1/failed_cause_pb2.py | 27 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 30 + temporalio/api/history/v1/__init__.py | 4 + temporalio/api/history/v1/message_pb2.py | 301 +++-- temporalio/api/history/v1/message_pb2.pyi | 131 ++ temporalio/api/stream/__init__.py | 0 temporalio/api/stream/v1/__init__.py | 8 + temporalio/api/stream/v1/message_pb2.py | 95 ++ temporalio/api/stream/v1/message_pb2.pyi | 267 ++++ .../v1/request_response_pb2.py | 1125 +++++++++-------- .../v1/request_response_pb2.pyi | 17 + temporalio/bridge/sdk-core | 2 +- 20 files changed, 1618 insertions(+), 752 deletions(-) create mode 100644 scripts/gen_stream_api_protos.py create mode 100644 temporalio/api/stream/__init__.py create mode 100644 temporalio/api/stream/v1/__init__.py create mode 100644 temporalio/api/stream/v1/message_pb2.py create mode 100644 temporalio/api/stream/v1/message_pb2.pyi diff --git a/scripts/gen_stream_api_protos.py b/scripts/gen_stream_api_protos.py new file mode 100644 index 000000000..eeb7bb350 --- /dev/null +++ b/scripts/gen_stream_api_protos.py @@ -0,0 +1,101 @@ +"""Regenerate the stream additions to the vendored public API protos. + +The stream protos live on a branch of the api repo that the Core submodule +does not pin yet. Regenerating everything from that branch would also pull in +whatever else moved on the api main line since the pin, so this stages the +API protos the submodule pins, applies the branch's own diff on top, and +regenerates only the files that diff touches. Every other module under +``temporalio/api`` stays byte-identical. + + uv run --python 3.10 --no-project --with "grpcio-tools==1.48.2" \\ + --with "mypy-protobuf==3.3.0" --with "protobuf<4" \\ + scripts/gen_stream_api_protos.py /path/to/api origin/main..origin/ + +The toolchain pins match ``scripts/_proto/Dockerfile``. Generated code refuses +to load on a protobuf runtime older than the one it was built against, and +these modules end up in applications that pin protobuf themselves. Run +``uv run poe format`` afterwards, as the ``gen-protos`` task does. +""" + +from __future__ import annotations + +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +sys.path.insert(0, str(BASE / "scripts")) + +import gen_protos # noqa: E402 + +API_OUT = BASE / "temporalio" / "api" + + +def main() -> None: + if len(sys.argv) != 3: + sys.exit("usage: gen_stream_api_protos.py /path/to/api-checkout ..") + api = Path(sys.argv[1]).resolve() + revisions = sys.argv[2] + diff = subprocess.run( + ["git", "-C", str(api), "diff", revisions, "--", "temporal/"], + check=True, + capture_output=True, + text=True, + ).stdout + touched = subprocess.run( + ["git", "-C", str(api), "diff", "--name-only", revisions, "--", "temporal/"], + check=True, + capture_output=True, + text=True, + ).stdout.split() + if not touched: + sys.exit(f"{revisions} touches no proto under temporal/") + + with tempfile.TemporaryDirectory() as tmp: + stage = Path(tmp) / "stage" + shutil.copytree(gen_protos.api_proto_dir / "temporal", stage / "temporal") + subprocess.run( + ["patch", "-p1", "--silent"], + check=True, + cwd=stage, + input=diff, + text=True, + ) + out = Path(tmp) / "out" + out.mkdir() + subprocess.check_call( + [ + sys.executable, + "-mgrpc_tools.protoc", + f"--proto_path={stage}", + f"--python_out={out}", + f"--mypy_out={out}", + *touched, + ] + ) + packages: set[Path] = set() + for proto in touched: + relative = Path(proto).relative_to("temporal/api").with_suffix("") + for suffix in ("_pb2.py", "_pb2.pyi"): + generated = ( + out + / "temporal" + / "api" + / relative.with_name(relative.name + suffix) + ) + target = API_OUT / relative.with_name(relative.name + suffix) + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(generated, target) + print(f"wrote {target.relative_to(BASE)}") + packages.add(target.parent) + + for package in sorted(packages): + (package.parent / "__init__.py").touch() + gen_protos.fix_generated_output(package) + print(f"rewrote {(package / '__init__.py').relative_to(BASE)}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index e0ce8f712..d1b241274 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -1,4 +1,5 @@ from .message_pb2 import ( + AppendStreamRecordsCommandAttributes, CancelTimerCommandAttributes, CancelWorkflowExecutionCommandAttributes, Command, @@ -16,10 +17,12 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) __all__ = [ + "AppendStreamRecordsCommandAttributes", "CancelTimerCommandAttributes", "CancelWorkflowExecutionCommandAttributes", "Command", @@ -37,5 +40,6 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index ad004ae03..8c36c1f7b 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -42,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\x87\x12\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x42\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -106,6 +109,12 @@ "RequestCancelNexusOperationCommandAttributes" ] _COMMAND = DESCRIPTOR.message_types_by_name["Command"] +_APPENDSTREAMRECORDSCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "AppendStreamRecordsCommandAttributes" +] +_SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeStreamCommandAttributes" +] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", (_message.Message,), @@ -332,6 +341,28 @@ ) _sym_db.RegisterMessage(Command) +AppendStreamRecordsCommandAttributes = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecordsCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _APPENDSTREAMRECORDSCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.AppendStreamRecordsCommandAttributes) + }, +) +_sym_db.RegisterMessage(AppendStreamRecordsCommandAttributes) + +SubscribeStreamCommandAttributes = _reflection.GeneratedProtocolMessageType( + "SubscribeStreamCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAMCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeStreamCommandAttributes) + }, +) +_sym_db.RegisterMessage(SubscribeStreamCommandAttributes) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\032io.temporal.api.command.v1B\014MessageProtoP\001Z%go.temporal.io/api/command/v1;command\252\002\031Temporalio.Api.Command.V1\352\002\034Temporalio::Api::Command::V1" @@ -383,44 +414,48 @@ _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_options = ( b"8\001" ) - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 424 - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1118 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1120 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1192 - _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1194 - _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1299 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1301 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1395 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1397 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1488 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1490 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1538 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1540 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1633 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1636 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1819 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1822 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2125 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2127 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2245 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2247 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2343 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2346 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2665 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2585 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2665 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2668 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3608 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3611 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4615 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4617 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4671 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4674 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5157 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5107 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5157 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5159 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5233 - _COMMAND._serialized_start = 5236 - _COMMAND._serialized_end = 7547 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 462 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1156 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1158 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1230 + _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1232 + _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1337 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1339 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1433 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1435 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1526 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1528 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1576 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1578 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1671 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1674 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1857 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1860 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2163 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2165 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2283 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2285 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2381 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2384 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2703 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2623 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2703 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2706 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3646 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3649 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4653 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4655 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4709 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4712 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5195 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5145 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5195 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 + _COMMAND._serialized_start = 5274 + _COMMAND._serialized_end = 7806 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7808 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7920 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7922 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 7997 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 18d0abc8b..f623eecfd 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -18,6 +18,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1119,6 +1120,8 @@ class Command(google.protobuf.message.Message): MODIFY_WORKFLOW_PROPERTIES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1209,6 +1212,14 @@ class Command(google.protobuf.message.Message): def request_cancel_nexus_operation_command_attributes( self, ) -> global___RequestCancelNexusOperationCommandAttributes: ... + @property + def append_stream_records_command_attributes( + self, + ) -> global___AppendStreamRecordsCommandAttributes: ... + @property + def subscribe_stream_command_attributes( + self, + ) -> global___SubscribeStreamCommandAttributes: ... def __init__( self, *, @@ -1253,10 +1264,16 @@ class Command(google.protobuf.message.Message): | None = ..., request_cancel_nexus_operation_command_attributes: global___RequestCancelNexusOperationCommandAttributes | None = ..., + append_stream_records_command_attributes: global___AppendStreamRecordsCommandAttributes + | None = ..., + subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "append_stream_records_command_attributes", + b"append_stream_records_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1291,6 +1308,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1300,6 +1319,8 @@ class Command(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "append_stream_records_command_attributes", + b"append_stream_records_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1338,6 +1359,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1365,8 +1388,90 @@ class Command(google.protobuf.message.Message): "modify_workflow_properties_command_attributes", "schedule_nexus_operation_command_attributes", "request_cancel_nexus_operation_command_attributes", + "append_stream_records_command_attributes", + "subscribe_stream_command_attributes", ] | None ): ... global___Command = Command + +class AppendStreamRecordsCommandAttributes(google.protobuf.message.Message): + """Appends records to a stream the Workflow owns. Applied inside the Workflow + Task's own commit. Produces one `WorkflowStreamRecordsAppended` event + carrying the offset range and none of the payload; it schedules no further + work. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the Workflow's default output stream.""" + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: + """Stored in order. The server sets `producer_id` to empty on each record, + because the owning Workflow is the producer here. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "records", b"records", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AppendStreamRecordsCommandAttributes = AppendStreamRecordsCommandAttributes + +class SubscribeStreamCommandAttributes(google.protobuf.message.Message): + """Subscribe this Workflow to a stream, so later Workflow Tasks carry the ranges + it has not consumed yet. + + The stream's addressing is resolved by the server rather than supplied here. + A Workflow cannot look it up without doing I/O, and a value it carried would + be a reading rather than a fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Stream to consume. A stream in another execution is addressed by its id; + one this Workflow owns is addressed by the name it was published under. + The server resolves an owned name first and falls back to a standalone + id, so a Workflow that owns a stream under this name cannot reach a + standalone stream with the same id. + """ + start_offset: builtins.int + """Where to start. Negative means from wherever the stream is when the + subscription is registered, which the server resolves and records so + replay does not resolve it again. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 6d1c3b6e5..17f70d8a6 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x9c\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe7\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -39,11 +39,13 @@ COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES = 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION = 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 +COMMAND_TYPE_APPEND_STREAM_RECORDS = 19 +COMMAND_TYPE_SUBSCRIBE_STREAM = 20 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 864 + _COMMANDTYPE._serialized_end = 939 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 9f1bfd240..c6f21ab4b 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -44,6 +44,8 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: _CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: _CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 + COMMAND_TYPE_APPEND_STREAM_RECORDS: _CommandType.ValueType # 19 + COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -66,4 +68,6 @@ COMMAND_TYPE_PROTOCOL_MESSAGE: CommandType.ValueType # 14 COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 +COMMAND_TYPE_APPEND_STREAM_RECORDS: CommandType.ValueType # 19 +COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 14ff7984d..a41b486ee 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\x9e\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -82,11 +82,13 @@ EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58 EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59 EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 +EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED = 62 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 2912 + _EVENTTYPE._serialized_end = 3004 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 16a23b137..84db38b61 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -216,6 +216,16 @@ class _EventTypeEnumTypeWrapper( """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: _EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" + EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: _EventType.ValueType # 61 + """A Workflow subscribed to a stream. Recorded once per subscription, not + per record: the offsets a task consumed ride WorkflowTaskCompleted and + the payloads never enter History at all. + """ + EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: _EventType.ValueType # 62 + """A Workflow appended a batch of records to a stream. Recorded per + batch, and carrying only the offset range it landed at: the bodies go to + the stream's own log, never into History. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -408,4 +418,14 @@ EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: EventType.ValueType # 59 """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: EventType.ValueType # 61 +"""A Workflow subscribed to a stream. Recorded once per subscription, not +per record: the offsets a task consumed ride WorkflowTaskCompleted and +the payloads never enter History at all. +""" +EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: EventType.ValueType # 62 +"""A Workflow appended a batch of records to a stream. Recorded per +batch, and carrying only the offset range it landed at: the bodies go to +the stream's own log, never into History. +""" global___EventType = EventType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 03eb094f9..70229ee81 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x90\x14\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _WORKFLOWTASKFAILEDCAUSE = DESCRIPTOR.enum_types_by_name["WorkflowTaskFailedCause"] @@ -86,6 +86,9 @@ WORKFLOW_TASK_FAILED_CAUSE_EXTERNAL_STORAGE_FAILURE = 38 WORKFLOW_TASK_FAILED_CAUSE_WORKFLOW_PAUSE_REQUESTED_BEFORE_TASK_STARTED = 39 WORKFLOW_TASK_FAILED_CAUSE_REQUEST_TOO_LARGE = 40 +WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES = 41 +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES = 42 +WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE = 43 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS = 1 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND = 2 @@ -117,15 +120,15 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020FailedCauseProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _WORKFLOWTASKFAILEDCAUSE._serialized_start = 68 - _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2644 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2647 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 2967 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2970 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3243 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3246 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3600 - _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3603 - _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4138 - _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4141 - _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4284 + _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2834 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2837 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3157 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3160 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3433 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3436 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3790 + _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3793 + _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4328 + _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4331 + _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4474 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.pyi b/temporalio/api/enums/v1/failed_cause_pb2.pyi index 7e034978f..50124d1a9 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.pyi +++ b/temporalio/api/enums/v1/failed_cause_pb2.pyi @@ -188,6 +188,21 @@ class _WorkflowTaskFailedCauseEnumTypeWrapper( _WorkflowTaskFailedCause.ValueType ) # 40 """A workflow task failed because the request exceeded a size limit.""" + WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 41 + """A workflow task completed with an invalid AppendStreamRecords command.""" + WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 42 + """A workflow task completed with an invalid SubscribeStream command.""" + WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( + _WorkflowTaskFailedCause.ValueType + ) # 43 + """A workflow task could not be started because a stream range it consumed and recorded in + History can no longer be served, for example after truncation or because it exceeds the + replay bound. Check the workflow task failure message for more information. + """ class WorkflowTaskFailedCause( _WorkflowTaskFailedCause, metaclass=_WorkflowTaskFailedCauseEnumTypeWrapper @@ -346,6 +361,21 @@ WORKFLOW_TASK_FAILED_CAUSE_WORKFLOW_PAUSE_REQUESTED_BEFORE_TASK_STARTED: ( """A workflow task is failed because the workflow is paused before the task is started.""" WORKFLOW_TASK_FAILED_CAUSE_REQUEST_TOO_LARGE: WorkflowTaskFailedCause.ValueType # 40 """A workflow task failed because the request exceeded a size limit.""" +WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 41 +"""A workflow task completed with an invalid AppendStreamRecords command.""" +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 42 +"""A workflow task completed with an invalid SubscribeStream command.""" +WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( + WorkflowTaskFailedCause.ValueType +) # 43 +"""A workflow task could not be started because a stream range it consumed and recorded in +History can no longer be served, for example after truncation or because it exceeds the +replay bound. Check the workflow task failure message for more information. +""" global___WorkflowTaskFailedCause = WorkflowTaskFailedCause class _StartChildWorkflowExecutionFailedCause: diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index ec7f65962..13d56f93a 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -57,6 +57,8 @@ WorkflowExecutionUpdateRejectedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, + WorkflowStreamRecordsAppendedEventAttributes, + WorkflowStreamSubscribedEventAttributes, WorkflowTaskCompletedEventAttributes, WorkflowTaskFailedEventAttributes, WorkflowTaskScheduledEventAttributes, @@ -123,6 +125,8 @@ "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", + "WorkflowStreamRecordsAppendedEventAttributes", + "WorkflowStreamSubscribedEventAttributes", "WorkflowTaskCompletedEventAttributes", "WorkflowTaskFailedEventAttributes", "WorkflowTaskScheduledEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index ac337b708..14b3cbfb9 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -47,6 +47,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -58,7 +61,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\x82\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xca?\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -215,6 +218,12 @@ _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "ActivityPropertiesModifiedExternallyEventAttributes" ] +_WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamSubscribedEventAttributes" +] +_WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamRecordsAppendedEventAttributes" +] _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionUpdateAcceptedEventAttributes" ] @@ -819,6 +828,28 @@ ) _sym_db.RegisterMessage(ActivityPropertiesModifiedExternallyEventAttributes) +WorkflowStreamSubscribedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamSubscribedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) + +WorkflowStreamRecordsAppendedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamRecordsAppendedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamRecordsAppendedEventAttributes) + WorkflowExecutionUpdateAcceptedEventAttributes = ( _reflection.GeneratedProtocolMessageType( "WorkflowExecutionUpdateAcceptedEventAttributes", @@ -1210,140 +1241,144 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 663 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3057 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3060 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3196 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3199 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3364 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3367 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3586 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3589 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3717 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3720 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4653 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4656 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4828 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4831 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5247 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5250 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5892 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5895 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6044 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6047 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6438 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6441 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7147 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7150 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7436 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7439 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7671 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7674 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 7960 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 7963 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8161 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8163 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8277 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8280 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8554 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8557 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8704 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8706 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8777 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8780 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 8914 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8917 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9116 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9119 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9254 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9257 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9618 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9538 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9618 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9621 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 9940 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 9943 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10072 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10075 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5999 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6002 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6151 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6154 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6545 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6548 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7254 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7257 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7543 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7546 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7778 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7781 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8067 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8070 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8268 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8270 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8384 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8387 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8661 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8664 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8811 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8813 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8884 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8887 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9021 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9024 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9223 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9226 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9361 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9364 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9725 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9645 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9725 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9728 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10047 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10050 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10179 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10182 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10359 + 10466 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10362 + 10469 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10708 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10711 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 10908 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10911 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11290 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11293 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11632 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11635 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11846 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11849 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12007 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12010 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12148 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12151 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13427 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13430 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13772 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13775 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14070 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14073 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14398 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14401 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14780 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14783 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15108 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15111 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15441 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15444 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15720 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15723 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16453 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16303 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16453 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16456 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16776 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16779 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16923 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 16926 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17146 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17319 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17322 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17593 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17596 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 17760 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 17762 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 17856 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 17858 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 17954 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 17957 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18154 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18157 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 18721 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 18671 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 18721 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 18724 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 18861 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 18864 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19001 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19004 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19140 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19143 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19281 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19284 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19422 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19424 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19540 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19543 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 19694 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 19697 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 19896 - _HISTORYEVENT._serialized_start = 19899 - _HISTORYEVENT._serialized_end = 28037 - _HISTORY._serialized_start = 28039 - _HISTORY._serialized_end = 28103 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10815 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10818 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11015 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11018 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11397 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11400 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11739 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11742 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11953 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11956 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12114 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12117 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12255 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12258 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13534 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13537 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13879 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13882 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14177 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14180 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14505 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14508 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14887 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14890 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15215 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15218 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15548 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15551 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15827 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15830 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16560 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16410 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16560 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16563 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16883 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16886 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17030 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17032 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17156 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17159 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17310 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17313 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17533 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17536 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17706 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17709 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17980 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17983 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18147 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18149 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18243 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18245 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18341 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18344 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18541 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18544 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19108 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19058 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19108 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19111 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19248 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19251 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19388 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19391 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19527 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19530 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19668 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19671 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19809 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19811 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19927 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19930 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20081 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20084 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20283 + _HISTORYEVENT._serialized_start = 20286 + _HISTORYEVENT._serialized_end = 28678 + _HISTORY._serialized_start = 28680 + _HISTORY._serialized_end = 28744 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 783e9d3b6..bc708a6cb 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -23,6 +23,7 @@ import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1010,6 +1011,7 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): WORKER_DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int WORKER_DEPLOYMENT_NAME_FIELD_NUMBER: builtins.int DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int + CONSUMED_STREAM_RANGES_FIELD_NUMBER: builtins.int scheduled_event_id: builtins.int """The id of the `WORKFLOW_TASK_SCHEDULED` event this task corresponds to""" started_event_id: builtins.int @@ -1069,6 +1071,18 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): """The Worker Deployment Version that completed this task. Must be set if `versioning_behavior` is set. This value updates workflow execution's `versioning_info.deployment_version`. """ + @property + def consumed_stream_ranges( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRange + ]: + """Offset ranges this Workflow Task consumed from streams it subscribes to. + Recorded on every task where a subscription is active, including when it + observed nothing: an empty range is a fact replay must reproduce, and + omitting it would let replay deliver records the Workflow did not have. + Numbered 20 to leave 14 through 19 free for fields added on the main line. + """ def __init__( self, *, @@ -1088,6 +1102,10 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): worker_deployment_name: builtins.str = ..., deployment_version: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentVersion | None = ..., + consumed_stream_ranges: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRange + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1109,6 +1127,8 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "binary_checksum", b"binary_checksum", + "consumed_stream_ranges", + b"consumed_stream_ranges", "deployment", b"deployment", "deployment_version", @@ -3603,6 +3623,93 @@ global___ActivityPropertiesModifiedExternallyEventAttributes = ( ActivityPropertiesModifiedExternallyEventAttributes ) +class WorkflowStreamSubscribedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command created this + subscription. + """ + stream_id: builtins.str + """Stream the Workflow subscribed to.""" + start_offset: builtins.int + """The offset the subscription actually starts from. Resolved by the server + when the subscription is registered and recorded here, so replay reads + the resolved value rather than resolving it again against a stream that + has since moved. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamSubscribedEventAttributes = ( + WorkflowStreamSubscribedEventAttributes +) + +class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + RECORD_COUNT_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command appended this + batch. + """ + stream_id: builtins.str + """Stream the Workflow appended to.""" + first_offset: builtins.int + """Offset the first record of the batch landed at.""" + record_count: builtins.int + """How many records the batch held. With first_offset this names the range + without carrying any of it, which is what keeps this event a fixed size + no matter how large the batch or its payloads are. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + first_offset: builtins.int = ..., + record_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "first_offset", + b"first_offset", + "record_count", + b"record_count", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamRecordsAppendedEventAttributes = ( + WorkflowStreamRecordsAppendedEventAttributes +) + class WorkflowExecutionUpdateAcceptedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4460,6 +4567,8 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( builtins.int ) + WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_RECORDS_APPENDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4745,6 +4854,14 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_execution_time_skipping_transitioned_event_attributes( self, ) -> global___WorkflowExecutionTimeSkippingTransitionedEventAttributes: ... + @property + def workflow_stream_subscribed_event_attributes( + self, + ) -> global___WorkflowStreamSubscribedEventAttributes: ... + @property + def workflow_stream_records_appended_event_attributes( + self, + ) -> global___WorkflowStreamRecordsAppendedEventAttributes: ... def __init__( self, *, @@ -4882,6 +4999,10 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_execution_time_skipping_transitioned_event_attributes: global___WorkflowExecutionTimeSkippingTransitionedEventAttributes | None = ..., + workflow_stream_subscribed_event_attributes: global___WorkflowStreamSubscribedEventAttributes + | None = ..., + workflow_stream_records_appended_event_attributes: global___WorkflowStreamRecordsAppendedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5004,6 +5125,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_records_appended_event_attributes", + b"workflow_stream_records_appended_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5151,6 +5276,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_records_appended_event_attributes", + b"workflow_stream_records_appended_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5227,6 +5356,8 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_paused_event_attributes", "workflow_execution_unpaused_event_attributes", "workflow_execution_time_skipping_transitioned_event_attributes", + "workflow_stream_subscribed_event_attributes", + "workflow_stream_records_appended_event_attributes", ] | None ): ... diff --git a/temporalio/api/stream/__init__.py b/temporalio/api/stream/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py new file mode 100644 index 000000000..9d54188ec --- /dev/null +++ b/temporalio/api/stream/v1/__init__.py @@ -0,0 +1,8 @@ +from .message_pb2 import StreamRange, StreamRecord, StreamRecordKind, StreamSlice + +__all__ = [ + "StreamRange", + "StreamRecord", + "StreamRecordKind", + "StreamSlice", +] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py new file mode 100644 index 000000000..c28393a50 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/stream/v1/message.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xd4\x02\n\x0cStreamRecord\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x44\n\x08metadata\x18\x02 \x03(\x0b\x32\x32.temporal.api.stream.v1.StreamRecord.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x36\n\x04kind\x18\x04 \x01(\x0e\x32(.temporal.api.stream.v1.StreamRecordKind\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x03\x12\x10\n\x08sequence\x18\x07 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xb9\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x35\n\x07records\x18\x05 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"H\n\x0bStreamRange\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03*r\n\x10StreamRecordKind\x12"\n\x1eSTREAM_RECORD_KIND_UNSPECIFIED\x10\x00\x12\x1b\n\x17STREAM_RECORD_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_RECORD_KIND_FINISH\x10\x02\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' +) + +_STREAMRECORDKIND = DESCRIPTOR.enum_types_by_name["StreamRecordKind"] +StreamRecordKind = enum_type_wrapper.EnumTypeWrapper(_STREAMRECORDKIND) +STREAM_RECORD_KIND_UNSPECIFIED = 0 +STREAM_RECORD_KIND_DATA = 1 +STREAM_RECORD_KIND_FINISH = 2 + + +_STREAMRECORD = DESCRIPTOR.message_types_by_name["StreamRecord"] +_STREAMRECORD_METADATAENTRY = _STREAMRECORD.nested_types_by_name["MetadataEntry"] +_STREAMSLICE = DESCRIPTOR.message_types_by_name["StreamSlice"] +_STREAMRANGE = DESCRIPTOR.message_types_by_name["StreamRange"] +StreamRecord = _reflection.GeneratedProtocolMessageType( + "StreamRecord", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _STREAMRECORD_METADATAENTRY, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRecord.MetadataEntry) + }, + ), + "DESCRIPTOR": _STREAMRECORD, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRecord) + }, +) +_sym_db.RegisterMessage(StreamRecord) +_sym_db.RegisterMessage(StreamRecord.MetadataEntry) + +StreamSlice = _reflection.GeneratedProtocolMessageType( + "StreamSlice", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSLICE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }, +) +_sym_db.RegisterMessage(StreamSlice) + +StreamRange = _reflection.GeneratedProtocolMessageType( + "StreamRange", + (_message.Message,), + { + "DESCRIPTOR": _STREAMRANGE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRange) + }, +) +_sym_db.RegisterMessage(StreamRange) + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1" + _STREAMRECORD_METADATAENTRY._options = None + _STREAMRECORD_METADATAENTRY._serialized_options = b"8\001" + _STREAMRECORDKIND._serialized_start = 707 + _STREAMRECORDKIND._serialized_end = 821 + _STREAMRECORD._serialized_start = 103 + _STREAMRECORD._serialized_end = 443 + _STREAMRECORD_METADATAENTRY._serialized_start = 363 + _STREAMRECORD_METADATAENTRY._serialized_end = 443 + _STREAMSLICE._serialized_start = 446 + _STREAMSLICE._serialized_end = 631 + _STREAMRANGE._serialized_start = 633 + _STREAMRANGE._serialized_end = 705 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi new file mode 100644 index 000000000..74a6d4a75 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -0,0 +1,267 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys +import typing + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamRecordKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamRecordKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamRecordKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_RECORD_KIND_UNSPECIFIED: _StreamRecordKind.ValueType # 0 + """Read as DATA.""" + STREAM_RECORD_KIND_DATA: _StreamRecordKind.ValueType # 1 + """A value the producer published; `body` carries it.""" + STREAM_RECORD_KIND_FINISH: _StreamRecordKind.ValueType # 2 + """The producer named by `producer_id` writes nothing more on `topic`. + Says nothing about that producer's outcome and does not end the stream. + """ + +class StreamRecordKind(_StreamRecordKind, metaclass=_StreamRecordKindEnumTypeWrapper): + """What a record means to a reader. Kept on the record itself so every store + and every language reads it the same way without a private envelope. + """ + +STREAM_RECORD_KIND_UNSPECIFIED: StreamRecordKind.ValueType # 0 +"""Read as DATA.""" +STREAM_RECORD_KIND_DATA: StreamRecordKind.ValueType # 1 +"""A value the producer published; `body` carries it.""" +STREAM_RECORD_KIND_FINISH: StreamRecordKind.ValueType # 2 +"""The producer named by `producer_id` writes nothing more on `topic`. +Says nothing about that producer's outcome and does not end the stream. +""" +global___StreamRecordKind = StreamRecordKind + +class StreamRecord(google.protobuf.message.Message): + """One entry in a stream. The record is the wire format: stores keep it + serialized as is and readers in every language decode the same bytes. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: + """The value the producer published, stored as sent. A payload codec + applies here as it does to any other payload. + """ + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance, stored as sent.""" + topic: builtins.str + """Producer-supplied grouping label, stored as sent.""" + kind: global___StreamRecordKind.ValueType + """How to read this record. Unspecified is read as DATA.""" + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did.""" + attempt: builtins.int + """The producer's attempt. Readers treat a later attempt by the same + producer as superseding what the earlier one wrote. + """ + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. + Stored as sent; the server does not assign, validate or order by it. + """ + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + kind: global___StreamRecordKind.ValueType = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., + sequence: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "attempt", + b"attempt", + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "topic", + b"topic", + ], + ) -> None: ... + +global___StreamRecord = StreamRecord + +class StreamSlice(google.protobuf.message.Message): + """A contiguous range of a stream delivered to a Workflow Task, along with the + offsets it covers. The offsets are what History records; the records + themselves are never written to History. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + """Run id of the execution that owns the stream. Set on both a slice for the + task being started and a re-supplied one. + """ + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription observed nothing, + which is a fact replay has to reproduce rather than an absence of one. + """ + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamRecord + ]: ... + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event whose consumed_stream_ranges recorded + this range. Set only when the server is re-supplying a range for a task + being replayed; a slice for the task now being started leaves it unset, + because the event closing that task does not exist yet. + + Replay needs this because a Workflow Task response carries one slice set + while a cache miss replays every prior task, so the ranges have to be + matched to the events that recorded them rather than to the response. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + records: collections.abc.Iterable[global___StreamRecord] | None = ..., + workflow_task_completed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "records", + b"records", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___StreamSlice = StreamSlice + +class StreamRange(google.protobuf.message.Message): + """The offsets a Workflow Task consumed, without the payloads. Recorded on + WorkflowTaskCompleted so History grows with Workflow Tasks rather than with + records. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive.""" + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___StreamRange = StreamRange diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index e1b2e01c4..cdf2becc2 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -114,6 +114,9 @@ from temporalio.api.sdk.v1 import ( worker_config_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_worker__config__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -131,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xbf\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4214,578 +4217,578 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1646 - _REGISTERNAMESPACEREQUEST._serialized_end = 2294 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2251 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2294 - _REGISTERNAMESPACERESPONSE._serialized_start = 2296 - _REGISTERNAMESPACERESPONSE._serialized_end = 2323 - _LISTNAMESPACESREQUEST._serialized_start = 2326 - _LISTNAMESPACESREQUEST._serialized_end = 2463 - _LISTNAMESPACESRESPONSE._serialized_start = 2466 - _LISTNAMESPACESRESPONSE._serialized_end = 2595 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2597 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2680 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2683 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3196 - _UPDATENAMESPACEREQUEST._serialized_start = 3199 - _UPDATENAMESPACEREQUEST._serialized_end = 3534 - _UPDATENAMESPACERESPONSE._serialized_start = 3537 - _UPDATENAMESPACERESPONSE._serialized_end = 3828 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3830 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3900 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3902 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3930 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3933 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5550 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5553 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5851 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5854 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6152 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6155 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6341 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6344 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6520 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6522 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6642 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6645 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7085 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7088 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8175 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8091 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8175 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8178 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9350 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9445 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9447 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9519 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9764 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9767 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10292 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10294 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10329 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10332 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10818 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10821 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12002 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12005 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12170 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12172 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12284 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12287 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12494 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12496 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12612 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12615 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 12997 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 12999 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13037 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13040 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13247 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13249 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13291 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13294 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13740 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13742 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13829 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13832 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14103 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14105 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14196 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14199 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14581 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14583 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14620 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14623 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 14911 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 14913 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 14954 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 14957 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15217 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15219 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15259 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15262 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15612 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15614 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15691 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15694 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17033 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17036 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17194 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17197 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17646 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17648 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17696 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17699 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 17986 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 17988 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18024 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18026 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18148 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18150 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18183 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18186 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18515 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18518 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18648 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18651 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19180 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19182 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19291 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19293 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19419 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19421 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19538 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19541 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19675 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19677 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19786 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19788 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19914 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19916 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19982 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19985 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20222 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20224 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20252 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20255 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20456 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20372 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20456 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20459 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20820 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20822 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20857 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20859 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 20969 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 20971 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21001 - _SHUTDOWNWORKERREQUEST._serialized_start = 21004 - _SHUTDOWNWORKERREQUEST._serialized_end = 21287 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21289 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21313 - _QUERYWORKFLOWREQUEST._serialized_start = 21316 - _QUERYWORKFLOWREQUEST._serialized_end = 21549 - _QUERYWORKFLOWRESPONSE._serialized_start = 21552 - _QUERYWORKFLOWRESPONSE._serialized_end = 21737 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21739 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21854 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21857 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22522 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22525 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23053 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23056 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24060 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23842 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 23958 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 23960 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24060 - _GETCLUSTERINFOREQUEST._serialized_start = 24062 - _GETCLUSTERINFOREQUEST._serialized_end = 24085 - _GETCLUSTERINFORESPONSE._serialized_start = 24088 - _GETCLUSTERINFORESPONSE._serialized_end = 24553 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24498 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24553 - _GETSYSTEMINFOREQUEST._serialized_start = 24555 - _GETSYSTEMINFOREQUEST._serialized_end = 24577 - _GETSYSTEMINFORESPONSE._serialized_start = 24580 - _GETSYSTEMINFORESPONSE._serialized_end = 25157 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24721 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25157 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25159 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25268 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25271 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25494 - _CREATESCHEDULEREQUEST._serialized_start = 25497 - _CREATESCHEDULEREQUEST._serialized_end = 25829 - _CREATESCHEDULERESPONSE._serialized_start = 25831 - _CREATESCHEDULERESPONSE._serialized_end = 25879 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25881 - _DESCRIBESCHEDULEREQUEST._serialized_end = 25946 - _DESCRIBESCHEDULERESPONSE._serialized_start = 25949 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26220 - _UPDATESCHEDULEREQUEST._serialized_start = 26223 - _UPDATESCHEDULEREQUEST._serialized_end = 26515 - _UPDATESCHEDULERESPONSE._serialized_start = 26517 - _UPDATESCHEDULERESPONSE._serialized_end = 26541 - _PATCHSCHEDULEREQUEST._serialized_start = 26544 - _PATCHSCHEDULEREQUEST._serialized_end = 26700 - _PATCHSCHEDULERESPONSE._serialized_start = 26702 - _PATCHSCHEDULERESPONSE._serialized_end = 26725 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26728 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26896 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26898 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 26981 - _DELETESCHEDULEREQUEST._serialized_start = 26983 - _DELETESCHEDULEREQUEST._serialized_end = 27064 - _DELETESCHEDULERESPONSE._serialized_start = 27066 - _DELETESCHEDULERESPONSE._serialized_end = 27090 - _LISTSCHEDULESREQUEST._serialized_start = 27092 - _LISTSCHEDULESREQUEST._serialized_end = 27200 - _LISTSCHEDULESRESPONSE._serialized_start = 27202 - _LISTSCHEDULESRESPONSE._serialized_end = 27314 - _COUNTSCHEDULESREQUEST._serialized_start = 27316 - _COUNTSCHEDULESREQUEST._serialized_end = 27373 - _COUNTSCHEDULESRESPONSE._serialized_start = 27376 - _COUNTSCHEDULESRESPONSE._serialized_end = 27595 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27598 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28244 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28045 + _REGISTERNAMESPACEREQUEST._serialized_start = 1684 + _REGISTERNAMESPACEREQUEST._serialized_end = 2332 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 + _REGISTERNAMESPACERESPONSE._serialized_start = 2334 + _REGISTERNAMESPACERESPONSE._serialized_end = 2361 + _LISTNAMESPACESREQUEST._serialized_start = 2364 + _LISTNAMESPACESREQUEST._serialized_end = 2501 + _LISTNAMESPACESRESPONSE._serialized_start = 2504 + _LISTNAMESPACESRESPONSE._serialized_end = 2633 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 + _UPDATENAMESPACEREQUEST._serialized_start = 3237 + _UPDATENAMESPACEREQUEST._serialized_end = 3572 + _UPDATENAMESPACERESPONSE._serialized_start = 3575 + _UPDATENAMESPACERESPONSE._serialized_end = 3866 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 + _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 + _SHUTDOWNWORKERREQUEST._serialized_start = 21102 + _SHUTDOWNWORKERREQUEST._serialized_end = 21385 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 + _QUERYWORKFLOWREQUEST._serialized_start = 21414 + _QUERYWORKFLOWREQUEST._serialized_end = 21647 + _QUERYWORKFLOWRESPONSE._serialized_start = 21650 + _QUERYWORKFLOWRESPONSE._serialized_end = 21835 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 + _GETCLUSTERINFOREQUEST._serialized_start = 24160 + _GETCLUSTERINFOREQUEST._serialized_end = 24183 + _GETCLUSTERINFORESPONSE._serialized_start = 24186 + _GETCLUSTERINFORESPONSE._serialized_end = 24651 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 + _GETSYSTEMINFOREQUEST._serialized_start = 24653 + _GETSYSTEMINFOREQUEST._serialized_end = 24675 + _GETSYSTEMINFORESPONSE._serialized_start = 24678 + _GETSYSTEMINFORESPONSE._serialized_end = 25255 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 + _CREATESCHEDULEREQUEST._serialized_start = 25595 + _CREATESCHEDULEREQUEST._serialized_end = 25927 + _CREATESCHEDULERESPONSE._serialized_start = 25929 + _CREATESCHEDULERESPONSE._serialized_end = 25977 + _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 + _UPDATESCHEDULEREQUEST._serialized_start = 26321 + _UPDATESCHEDULEREQUEST._serialized_end = 26613 + _UPDATESCHEDULERESPONSE._serialized_start = 26615 + _UPDATESCHEDULERESPONSE._serialized_end = 26639 + _PATCHSCHEDULEREQUEST._serialized_start = 26642 + _PATCHSCHEDULEREQUEST._serialized_end = 26798 + _PATCHSCHEDULERESPONSE._serialized_start = 26800 + _PATCHSCHEDULERESPONSE._serialized_end = 26823 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 + _DELETESCHEDULEREQUEST._serialized_start = 27081 + _DELETESCHEDULEREQUEST._serialized_end = 27162 + _DELETESCHEDULERESPONSE._serialized_start = 27164 + _DELETESCHEDULERESPONSE._serialized_end = 27188 + _LISTSCHEDULESREQUEST._serialized_start = 27190 + _LISTSCHEDULESREQUEST._serialized_end = 27298 + _LISTSCHEDULESRESPONSE._serialized_start = 27300 + _LISTSCHEDULESRESPONSE._serialized_end = 27412 + _COUNTSCHEDULESREQUEST._serialized_start = 27414 + _COUNTSCHEDULESREQUEST._serialized_end = 27471 + _COUNTSCHEDULESRESPONSE._serialized_start = 27474 + _COUNTSCHEDULESRESPONSE._serialized_end = 27693 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28156 + 28254 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28158 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28231 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28246 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28310 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28312 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28407 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28409 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28525 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28528 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30245 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29580 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29693 + 29791 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29696 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29825 + 29923 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29827 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29891 + 29989 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29893 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 29999 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30001 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30111 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30113 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30175 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30177 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30232 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30248 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30500 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30502 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30574 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30577 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30826 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30829 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 30985 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 30987 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31101 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31104 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31365 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31368 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31627 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31630 - _STARTBATCHOPERATIONREQUEST._serialized_end = 32996 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 32998 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33027 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33029 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33125 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33127 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33155 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33157 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33223 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33226 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33698 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33700 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33791 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33793 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 33914 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 33917 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34102 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34105 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34324 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34327 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34743 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34746 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35100 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35103 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35270 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35272 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35307 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35310 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35530 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35532 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35564 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35567 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 35939 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35733 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 35939 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 35942 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36274 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36068 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36274 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36277 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36613 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36616 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 36935 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 36937 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37037 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37039 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37148 - _PAUSEACTIVITYREQUEST._serialized_start = 37151 - _PAUSEACTIVITYREQUEST._serialized_end = 37350 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37353 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37536 - _PAUSEACTIVITYRESPONSE._serialized_start = 37538 - _PAUSEACTIVITYRESPONSE._serialized_end = 37561 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37563 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37595 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37598 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37878 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37881 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38154 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38156 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38181 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38183 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38217 - _RESETACTIVITYREQUEST._serialized_start = 38220 - _RESETACTIVITYREQUEST._serialized_end = 38527 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38530 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38820 - _RESETACTIVITYRESPONSE._serialized_start = 38822 - _RESETACTIVITYRESPONSE._serialized_end = 38845 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38847 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38879 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38882 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39166 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39169 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39346 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39348 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39454 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39456 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39553 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39556 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39750 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39753 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40014 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40407 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40484 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40487 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40627 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40629 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40737 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40739 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40858 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40861 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41066 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41069 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41254 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41257 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41486 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41489 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 41932 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 41935 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42159 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42161 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42274 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42276 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42332 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42334 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42427 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42430 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43101 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42605 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43101 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43104 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43344 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43346 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43385 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43388 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43588 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43590 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43629 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43631 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43724 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43726 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43758 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43761 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44279 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44331 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44334 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44834 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44836 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44890 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44893 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45311 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45226 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 + _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 + _PAUSEACTIVITYREQUEST._serialized_start = 37249 + _PAUSEACTIVITYREQUEST._serialized_end = 37448 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 + _PAUSEACTIVITYRESPONSE._serialized_start = 37636 + _PAUSEACTIVITYRESPONSE._serialized_end = 37659 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 + _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 + _RESETACTIVITYREQUEST._serialized_start = 38318 + _RESETACTIVITYREQUEST._serialized_end = 38625 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 + _RESETACTIVITYRESPONSE._serialized_start = 38920 + _RESETACTIVITYRESPONSE._serialized_end = 38943 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 + _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 + _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45311 + 45409 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45313 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45423 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45426 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45615 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45617 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45716 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45718 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45787 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45789 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45896 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45898 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46011 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46014 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46241 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46244 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46424 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46426 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46521 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46523 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46588 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46590 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46671 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46673 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46736 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46738 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46766 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46768 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46838 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46840 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 46944 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 46947 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47153 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47155 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47201 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47204 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47359 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47361 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47392 - _LISTWORKERSREQUEST._serialized_start = 47395 - _LISTWORKERSREQUEST._serialized_end = 47525 - _LISTWORKERSRESPONSE._serialized_start = 47528 - _LISTWORKERSRESPONSE._serialized_end = 47693 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47696 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48421 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48263 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48354 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 + _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 + _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 + _LISTWORKERSREQUEST._serialized_start = 47493 + _LISTWORKERSREQUEST._serialized_end = 47623 + _LISTWORKERSRESPONSE._serialized_start = 47626 + _LISTWORKERSRESPONSE._serialized_end = 47791 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48356 + 48454 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48421 + 48519 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48423 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48514 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48517 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48675 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48677 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48762 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48765 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49031 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49033 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49133 - _DESCRIBEWORKERREQUEST._serialized_start = 49135 - _DESCRIBEWORKERREQUEST._serialized_end = 49206 - _DESCRIBEWORKERRESPONSE._serialized_start = 49208 - _DESCRIBEWORKERRESPONSE._serialized_end = 49289 - _COUNTWORKERSREQUEST._serialized_start = 49291 - _COUNTWORKERSREQUEST._serialized_end = 49378 - _COUNTWORKERSRESPONSE._serialized_start = 49380 - _COUNTWORKERSRESPONSE._serialized_end = 49417 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49420 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49561 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49563 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49595 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49598 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49741 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49743 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49777 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49780 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 50957 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 50959 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51068 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51071 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51299 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51302 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51618 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51620 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51706 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51708 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51824 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51826 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 51935 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 51938 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52068 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52071 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52870 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 52922 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 52993 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52996 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53166 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53169 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53480 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53483 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53644 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53647 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53908 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 53910 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54025 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54028 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54167 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54169 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54235 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54238 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54475 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54477 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54552 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54801 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54804 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 54953 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 54955 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 54995 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 54998 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55143 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55145 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55181 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55183 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55271 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55273 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55306 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55309 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55465 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55467 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55513 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55516 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55668 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55670 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55712 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55714 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55809 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55811 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55850 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55853 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56010 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56013 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56245 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 + _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 + _DESCRIBEWORKERREQUEST._serialized_start = 49233 + _DESCRIBEWORKERREQUEST._serialized_end = 49304 + _DESCRIBEWORKERRESPONSE._serialized_start = 49306 + _DESCRIBEWORKERRESPONSE._serialized_end = 49387 + _COUNTWORKERSREQUEST._serialized_start = 49389 + _COUNTWORKERSREQUEST._serialized_end = 49476 + _COUNTWORKERSRESPONSE._serialized_start = 49478 + _COUNTWORKERSRESPONSE._serialized_end = 49515 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index eb9243716..e66c90384 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -46,6 +46,7 @@ import temporalio.api.schedule.v1.message_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.sdk.v1.worker_config_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.version.v1.message_pb2 @@ -1278,6 +1279,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_ID_FIELD_NUMBER: builtins.int POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int + STREAM_SLICES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1392,6 +1394,15 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): 3. If every group has some pending polls, assign the next poll to a group randomly according to the weights. """ + @property + def stream_slices( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ]: + """Stream data attached to this task. Delivered out of band so the payloads + never enter History; only the offset ranges are recorded there. + """ def __init__( self, *, @@ -1427,6 +1438,10 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): | None = ..., poller_groups_info: temporalio.api.taskqueue.v1.message_pb2.PollerGroupsInfo | None = ..., + stream_slices: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1484,6 +1499,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"started_event_id", "started_time", b"started_time", + "stream_slices", + b"stream_slices", "task_token", b"task_token", "workflow_execution", diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 85b71d7ec..5209468cb 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 85b71d7ecd4f2bf677fa1cee17f3fbc1ab10f1b9 +Subproject commit 5209468cb61533f95b78c9f9d5561d55400e2d25 From 95438f322ef63f407eb0ae14ae1ae3224bae8182 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:56:16 -0700 Subject: [PATCH 555/831] Pinned Core to the stream head and regenerated the bridge protos. The pinned Core carries the stream activation job and the two stream commands, so the generated bridge modules and the payload visitor have to match it. --- .gitmodules | 2 +- temporalio/bridge/_visitor.py | 28 +++ .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 123 +++++++------ .../workflow_activation_pb2.pyi | 73 ++++++++ .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 165 +++++++++++------- .../workflow_commands_pb2.pyi | 96 ++++++++++ temporalio/bridge/sdk-core | 2 +- 9 files changed, 373 insertions(+), 122 deletions(-) diff --git a/.gitmodules b/.gitmodules index a4c911631..1b51ec3d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/temporalio/sdk-rust.git + url = https://github.com/moedash/sdk-rust.git diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..c04d1c60f 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamRecord( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamRecords( + self, fs: VisitorFunctions, o: Any + ): + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +367,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_records"): + await self._visit_coresdk_workflow_activation_DeliverStreamRecords( + fs, o.deliver_stream_records + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any @@ -492,6 +510,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AppendStreamRecords( + self, fs: VisitorFunctions, o: Any + ): + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -551,6 +575,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("append_stream_records"): + await self._visit_coresdk_workflow_commands_AppendStreamRecords( + fs, o.append_stream_records + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..f17880890 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -1,5 +1,6 @@ from .workflow_activation_pb2 import ( CancelWorkflow, + DeliverStreamRecords, DoUpdate, FireTimer, InitializeWorkflow, @@ -24,6 +25,7 @@ __all__ = [ "CancelWorkflow", + "DeliverStreamRecords", "DoUpdate", "FireTimer", "InitializeWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..7f6d3e782 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -27,6 +27,9 @@ from temporalio.api.failure.v1 import ( message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.update.v1 import ( message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, ) @@ -44,12 +47,13 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ "HeadersEntry" @@ -114,6 +118,17 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) +DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( + "DeliverStreamRecords", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMRECORDS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamRecords) + }, +) +_sym_db.RegisterMessage(DeliverStreamRecords) + InitializeWorkflow = _reflection.GeneratedProtocolMessageType( "InitializeWorkflow", (_message.Message,), @@ -376,56 +391,58 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + _WORKFLOWACTIVATION._serialized_start = 570 + _WORKFLOWACTIVATION._serialized_end = 1116 + _WORKFLOWACTIVATIONJOB._serialized_start = 1119 + _WORKFLOWACTIVATIONJOB._serialized_end = 2580 + _DELIVERSTREAMRECORDS._serialized_start = 2583 + _DELIVERSTREAMRECORDS._serialized_end = 2719 + _INITIALIZEWORKFLOW._serialized_start = 2722 + _INITIALIZEWORKFLOW._serialized_end = 4126 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _FIRETIMER._serialized_start = 4128 + _FIRETIMER._serialized_end = 4152 + _RESOLVEACTIVITY._serialized_start = 4154 + _RESOLVEACTIVITY._serialized_end = 4263 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4266 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4603 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4605 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4664 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4667 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4833 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4835 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4931 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4933 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5038 + _UPDATERANDOMSEED._serialized_start = 5040 + _UPDATERANDOMSEED._serialized_end = 5083 + _QUERYWORKFLOW._serialized_start = 5086 + _QUERYWORKFLOW._serialized_end = 5346 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _CANCELWORKFLOW._serialized_start = 5348 + _CANCELWORKFLOW._serialized_end = 5380 + _SIGNALWORKFLOW._serialized_start = 5383 + _SIGNALWORKFLOW._serialized_end = 5672 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4047 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4126 + _NOTIFYHASPATCH._serialized_start = 5674 + _NOTIFYHASPATCH._serialized_end = 5708 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5710 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5805 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5807 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5909 + _DOUPDATE._serialized_start = 5912 + _DOUPDATE._serialized_end = 6243 + _DOUPDATE_HEADERSENTRY._serialized_start = 4047 + _DOUPDATE_HEADERSENTRY._serialized_end = 4126 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6246 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6400 + _RESOLVENEXUSOPERATION._serialized_start = 6402 + _RESOLVENEXUSOPERATION._serialized_end = 6491 + _REMOVEFROMCACHE._serialized_start = 6494 + _REMOVEFROMCACHE._serialized_end = 6846 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6608 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6846 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..ac9ac13f7 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -21,6 +21,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_RECORDS_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,14 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def deliver_stream_records(self) -> global___DeliverStreamRecords: + """17 to 20 are taken by the external stream jobs, which are developed + alongside this one and share this message. The number below is fixed + with that family and must not be reused. + + A range of a stream the workflow subscribed to. + """ + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +332,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_records: global___DeliverStreamRecords | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -329,6 +340,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -368,6 +381,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -421,6 +436,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_records", "remove_from_cache", ] | None @@ -428,6 +444,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamRecords(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "records", + b"records", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamRecords = DeliverStreamRecords + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..9fb1c8f08 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AppendStreamRecords, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -21,6 +22,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -28,6 +30,7 @@ __all__ = [ "ActivityCancellationType", + "AppendStreamRecords", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -49,6 +52,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0cdc02c6b..5af8f0744 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.bridge.proto.child_workflow import ( child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, ) @@ -45,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -56,6 +59,8 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] _SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] @@ -130,6 +135,28 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +AppendStreamRecords = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecords", + (_message.Message,), + { + "DESCRIPTOR": _APPENDSTREAMRECORDS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AppendStreamRecords) + }, +) +_sym_db.RegisterMessage(AppendStreamRecords) + +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) +_sym_db.RegisterMessage(SubscribeStream) + StartTimer = _reflection.GeneratedProtocolMessageType( "StartTimer", (_message.Message,), @@ -484,70 +511,74 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8672 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8760 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4339 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4341 - _REQUESTCANCELACTIVITY._serialized_end = 4377 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4379 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4420 - _QUERYRESULT._serialized_start = 4423 - _QUERYRESULT._serialized_end = 4579 - _QUERYSUCCESS._serialized_start = 4581 - _QUERYSUCCESS._serialized_end = 4646 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4648 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4724 - _FAILWORKFLOWEXECUTION._serialized_start = 4726 - _FAILWORKFLOWEXECUTION._serialized_end = 4800 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4803 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5717 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5719 - _CANCELWORKFLOWEXECUTION._serialized_end = 5795 - _SETPATCHMARKER._serialized_start = 5797 - _SETPATCHMARKER._serialized_end = 5851 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5854 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7028 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7030 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7104 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7107 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7249 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7252 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7651 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7653 - _CANCELSIGNALWORKFLOW._serialized_end = 7688 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7690 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7791 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7793 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7872 - _UPDATERESPONSE._serialized_start = 7875 - _UPDATERESPONSE._serialized_end = 8085 - _SCHEDULENEXUSOPERATION._serialized_start = 8088 - _SCHEDULENEXUSOPERATION._serialized_end = 8626 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8576 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8626 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8628 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8670 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9020 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9108 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2798 + _APPENDSTREAMRECORDS._serialized_start = 2800 + _APPENDSTREAMRECORDS._serialized_end = 2895 + _SUBSCRIBESTREAM._serialized_start = 2897 + _SUBSCRIBESTREAM._serialized_end = 2955 + _STARTTIMER._serialized_start = 2957 + _STARTTIMER._serialized_end = 3040 + _CANCELTIMER._serialized_start = 3042 + _CANCELTIMER._serialized_end = 3068 + _SCHEDULEACTIVITY._serialized_start = 3071 + _SCHEDULEACTIVITY._serialized_end = 3895 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3895 + _SCHEDULELOCALACTIVITY._serialized_start = 3898 + _SCHEDULELOCALACTIVITY._serialized_end = 4687 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3816 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3895 + _REQUESTCANCELACTIVITY._serialized_start = 4689 + _REQUESTCANCELACTIVITY._serialized_end = 4725 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4727 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4768 + _QUERYRESULT._serialized_start = 4771 + _QUERYRESULT._serialized_end = 4927 + _QUERYSUCCESS._serialized_start = 4929 + _QUERYSUCCESS._serialized_end = 4994 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4996 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5072 + _FAILWORKFLOWEXECUTION._serialized_start = 5074 + _FAILWORKFLOWEXECUTION._serialized_end = 5148 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5151 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6065 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELWORKFLOWEXECUTION._serialized_start = 6067 + _CANCELWORKFLOWEXECUTION._serialized_end = 6143 + _SETPATCHMARKER._serialized_start = 6145 + _SETPATCHMARKER._serialized_end = 6199 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6202 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7376 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7378 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7452 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7455 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7597 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7600 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7999 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 + _CANCELSIGNALWORKFLOW._serialized_start = 8001 + _CANCELSIGNALWORKFLOW._serialized_end = 8036 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8038 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8139 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8141 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8220 + _UPDATERESPONSE._serialized_start = 8223 + _UPDATERESPONSE._serialized_end = 8433 + _SCHEDULENEXUSOPERATION._serialized_start = 8436 + _SCHEDULENEXUSOPERATION._serialized_end = 8974 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8924 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8974 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8976 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9018 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index ad4a5f487..b4848ddb1 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -25,6 +25,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +180,14 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_stream(self) -> global___SubscribeStream: + """23 to 28 are taken by the external stream commands, which are developed + alongside these and share this message. The two numbers below are fixed + with that family and must not be reused. + """ + @property + def append_stream_records(self) -> global___AppendStreamRecords: ... def __init__( self, *, @@ -215,10 +226,14 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + append_stream_records: global___AppendStreamRecords | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -259,6 +274,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -272,6 +289,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -314,6 +333,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -350,12 +371,87 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "append_stream_records", ] | None ): ... global___WorkflowCommand = WorkflowCommand +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand records cost the same in History as one. The server + stores each record with an empty producer id, because the workflow is the + producer here. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the workflow's default output stream.""" + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "records", b"records", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AppendStreamRecords = AppendStreamRecords + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the subscription is + registered. The server resolves that once and records it. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class StartTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 5209468cb..32c66693f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 5209468cb61533f95b78c9f9d5561d55400e2d25 +Subproject commit 32c66693f07222832443a5acb1ddb92006c23ea7 From 1774972ed083d110857d1127b4d0af625e27b946 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:56:36 -0700 Subject: [PATCH 556/831] Added the vendored stream service protos and their generator. The stream service is still defined in the server rather than in the api submodule, so its generated code is vendored here; the generator rewrites imports and stubs onto temporalio so a cold mypy run resolves them. --- scripts/gen_stream_protos.py | 193 ++ temporalio/api/streamservice/__init__.py | 0 temporalio/api/streamservice/v1/__init__.py | 146 ++ .../api/streamservice/v1/message_pb2.py | 77 + .../api/streamservice/v1/message_pb2.pyi | 159 ++ .../api/streamservice/v1/message_pb2_grpc.py | 4 + .../api/streamservice/v1/message_pb2_grpc.pyi | 4 + .../streamservice/v1/request_response_pb2.py | 881 ++++++++ .../streamservice/v1/request_response_pb2.pyi | 1802 +++++++++++++++++ .../v1/request_response_pb2_grpc.py | 4 + .../v1/request_response_pb2_grpc.pyi | 4 + .../api/streamservice/v1/service_pb2.py | 34 + .../api/streamservice/v1/service_pb2.pyi | 8 + .../api/streamservice/v1/service_pb2_grpc.py | 717 +++++++ .../api/streamservice/v1/service_pb2_grpc.pyi | 195 ++ .../api/streamservice/v1/stream_state_pb2.py | 148 ++ .../api/streamservice/v1/stream_state_pb2.pyi | 434 ++++ .../streamservice/v1/stream_state_pb2_grpc.py | 4 + .../v1/stream_state_pb2_grpc.pyi | 4 + 19 files changed, 4818 insertions(+) create mode 100644 scripts/gen_stream_protos.py create mode 100644 temporalio/api/streamservice/__init__.py create mode 100644 temporalio/api/streamservice/v1/__init__.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.py create mode 100644 temporalio/api/streamservice/v1/message_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/message_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2.py create mode 100644 temporalio/api/streamservice/v1/service_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/service_pb2_grpc.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2.pyi create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.py create mode 100644 temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi diff --git a/scripts/gen_stream_protos.py b/scripts/gen_stream_protos.py new file mode 100644 index 000000000..faf5453d5 --- /dev/null +++ b/scripts/gen_stream_protos.py @@ -0,0 +1,193 @@ +"""Regenerate the vendored server-side stream protos. + +The stream service is still defined in the server rather than in the public +API repo, so its protos are copied in and compiled here. Run this whenever the +server-side definitions change: + + uv run python scripts/gen_stream_protos.py /path/to/temporal + +Run it with an interpreter whose ``grpcio-tools`` matches the oldest protobuf +runtime this package has to load on. Generated code refuses to load on a +runtime older than the one it was built against, and these modules end up in +applications that pin protobuf themselves. The stubs come from +``mypy-protobuf`` rather than protoc's own ``--pyi_out``, which that +generation of protoc does not have. + +Two rewrites make the copies compile against this SDK. The server's own +routing and API-category options are dropped, because they mean nothing to a +client and their proto files are not vendored. Paths move under +``temporalio/`` so the generated modules import each other and the public API +messages by the names this package actually publishes. +""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +OUT = BASE / "temporalio" / "api" / "streamservice" / "v1" +# The stream protos reference the public API messages. They normally come from +# the sdk-core submodule; TEMPORAL_API_PROTOS points at a `temporalio/api` +# checkout instead when the submodule is not initialized. +UPSTREAM_API = ( + BASE + / "temporalio" + / "bridge" + / "sdk-core" + / "crates" + / "protos" + / "protos" + / "api_upstream" +) + + +def api_proto_path() -> Path: + override = os.environ.get("TEMPORAL_API_PROTOS") + if override: + return Path(override).resolve() + if ( + UPSTREAM_API / "temporal" / "api" / "common" / "v1" / "message.proto" + ).is_file(): + return UPSTREAM_API + raise SystemExit( + "no api protos found: initialize the sdk-core submodule or set " + "TEMPORAL_API_PROTOS to a temporalio/api checkout" + ) + + +SERVER_PROTO_DIR = Path("chasm/lib/stream/proto/v1") +STAGE_PROTO_DIR = Path("temporalio/api/stream/v1") +FILES = [ + "message.proto", + "stream_state.proto", + "request_response.proto", + "service.proto", +] + +# Server-only options. They carry shard routing and rate-limit category, which +# a client neither reads nor can resolve, since the files defining them are not +# vendored. +DROP_IMPORT = re.compile(r'^import "temporal/server/.*?";\n', re.M) +DROP_OPTION = re.compile(r"^\s*option \(temporal\.server\.api\..*?\n", re.M) + +# protoc names a python module after the proto path. These put the generated +# modules where this package publishes them. +FIX_PY = [ + ( + re.compile(r"from temporalio\.api\.stream\.v1 import"), + "from temporalio.api.streamservice.v1 import", + ), + (re.compile(r"temporalio\.api\.stream\.v1\."), "temporalio.api.streamservice.v1."), + (re.compile(r"from temporal\.api\."), "from temporalio.api."), + (re.compile(r"import temporal\.api\."), "import temporalio.api."), + # mypy-protobuf also writes the public API types fully qualified in the + # stubs, `temporal.api.common.v1.message_pb2.Payload`, which the import + # rewrites above do not reach. The `_pb2` suffix keeps this off the proto + # package names inside the serialized descriptors, which stay `temporal.api`. + # After the streamservice rewrite on purpose, so the public + # `temporal.api.stream.v1` package is not sent to the vendored one. + ( + re.compile(r"\btemporal\.api\.(\w+)\.v1\.(\w+_pb2)\b"), + r"temporalio.api.\1.v1.\2", + ), +] + + +def stage(server: Path, into: Path) -> list[str]: + dest = into / STAGE_PROTO_DIR + dest.mkdir(parents=True) + for name in FILES: + text = (server / SERVER_PROTO_DIR / name).read_text() + text = text.replace(str(SERVER_PROTO_DIR) + "/", str(STAGE_PROTO_DIR) + "/") + text = DROP_IMPORT.sub("", text) + text = DROP_OPTION.sub("", text) + (dest / name).write_text(text) + return [str(STAGE_PROTO_DIR / name) for name in FILES] + + +def main() -> None: + if len(sys.argv) != 2: + sys.exit("usage: gen_stream_protos.py /path/to/temporal-server-checkout") + server = Path(sys.argv[1]).resolve() + if not (server / SERVER_PROTO_DIR).is_dir(): + sys.exit(f"no stream protos under {server / SERVER_PROTO_DIR}") + + with tempfile.TemporaryDirectory() as tmp: + work = Path(tmp) + targets = stage(server, work) + out = work / "out" + out.mkdir() + subprocess.run( + [ + sys.executable, + "-m", + "grpc_tools.protoc", + f"--proto_path={work}", + f"--proto_path={api_proto_path()}", + f"--python_out={out}", + f"--grpc_python_out={out}", + f"--mypy_out={out}", + f"--mypy_grpc_out={out}", + *targets, + ], + check=True, + cwd=work, + ) + + generated = out / STAGE_PROTO_DIR + for path in sorted(generated.iterdir()): + if path.name == "__init__.py": + continue + text = path.read_text() + for pattern, repl in FIX_PY: + text = pattern.sub(repl, text) + (OUT / path.name).write_text(text) + print(f"wrote {OUT / path.name}") + + shutil.rmtree(OUT / "__pycache__", ignore_errors=True) + write_init() + + +MODULES = ["message_pb2", "stream_state_pb2", "request_response_pb2"] + +INIT_HEADER = """\ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. +""" + + +def write_init() -> None: + """Re-export every generated message and enum, so the package surface + cannot drift from the protos it was built from.""" + import importlib + + sys.path.insert(0, str(BASE)) + blocks, exported = [], [] + for module in MODULES: + mod = importlib.import_module(f"temporalio.api.streamservice.v1.{module}") + names = list(mod.DESCRIPTOR.message_types_by_name) + for enum in mod.DESCRIPTOR.enum_types_by_name.values(): + names.append(enum.name) + names.extend(value.name for value in enum.values) + names.sort() + exported.extend(names) + joined = "".join(f" {name},\n" for name in names) + blocks.append(f"from .{module} import (\n{joined})\n") + + listed = "".join(f' "{name}",\n' for name in sorted(exported)) + (OUT / "__init__.py").write_text( + INIT_HEADER + "\n" + "\n".join(blocks) + f"\n__all__ = [\n{listed}]\n" + ) + print(f"wrote {OUT / '__init__.py'}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/streamservice/__init__.py b/temporalio/api/streamservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py new file mode 100644 index 000000000..1e909c223 --- /dev/null +++ b/temporalio/api/streamservice/v1/__init__.py @@ -0,0 +1,146 @@ +# Generated by scripts/gen_stream_protos.py. Do not edit. +# +# Vendored rather than taken from the api submodule, because the stream service +# is still defined in the server. See temporalio/client_stream.py. + +from .message_pb2 import ( + StreamRecord, + StreamRecordBatch, +) +from .request_response_pb2 import ( + AddMessagesInput, + AddMessagesOutput, + AddMessagesRequest, + AddMessagesResponse, + AddWorkflowMessagesInput, + AddWorkflowMessagesRequest, + AddWorkflowMessagesResponse, + AdvanceConsumerHeadInput, + AdvanceConsumerHeadOutput, + AdvanceConsumerHeadRequest, + AdvanceConsumerHeadResponse, + CloseStreamInput, + CloseStreamOutput, + CloseStreamRequest, + CloseStreamResponse, + CreateStreamInput, + CreateStreamOutput, + CreateStreamRequest, + CreateStreamResponse, + DeleteStreamInput, + DeleteStreamOutput, + DeleteStreamRequest, + DeleteStreamResponse, + DescribeStreamInput, + DescribeStreamOutput, + DescribeStreamRequest, + DescribeStreamResponse, + DescribeWorkflowStreamInput, + DescribeWorkflowStreamRequest, + DescribeWorkflowStreamResponse, + FinishWritingInput, + FinishWritingOutput, + FinishWritingRequest, + FinishWritingResponse, + ListStreamsInput, + ListStreamsOutput, + ListStreamsRequest, + ListStreamsResponse, + PollMessagesInput, + PollMessagesOutput, + PollMessagesRequest, + PollMessagesResponse, + PollWorkflowMessagesInput, + PollWorkflowMessagesRequest, + PollWorkflowMessagesResponse, + RegisterStreamConsumerInput, + RegisterStreamConsumerOutput, + RegisterStreamConsumerRequest, + RegisterStreamConsumerResponse, + StreamListEntry, + SubscribeWorkflowInput, + SubscribeWorkflowOutput, + SubscribeWorkflowRequest, + SubscribeWorkflowResponse, + TruncateStreamInput, + TruncateStreamOutput, + TruncateStreamRequest, + TruncateStreamResponse, +) +from .stream_state_pb2 import ( + ConsumerCursor, + ProducerCursor, + StreamBudget, + StreamLifecycle, + StreamState, + WorkflowStreamCursor, +) + +__all__ = [ + "AddMessagesInput", + "AddMessagesOutput", + "AddMessagesRequest", + "AddMessagesResponse", + "AddWorkflowMessagesInput", + "AddWorkflowMessagesRequest", + "AddWorkflowMessagesResponse", + "AdvanceConsumerHeadInput", + "AdvanceConsumerHeadOutput", + "AdvanceConsumerHeadRequest", + "AdvanceConsumerHeadResponse", + "CloseStreamInput", + "CloseStreamOutput", + "CloseStreamRequest", + "CloseStreamResponse", + "ConsumerCursor", + "CreateStreamInput", + "CreateStreamOutput", + "CreateStreamRequest", + "CreateStreamResponse", + "DeleteStreamInput", + "DeleteStreamOutput", + "DeleteStreamRequest", + "DeleteStreamResponse", + "DescribeStreamInput", + "DescribeStreamOutput", + "DescribeStreamRequest", + "DescribeStreamResponse", + "DescribeWorkflowStreamInput", + "DescribeWorkflowStreamRequest", + "DescribeWorkflowStreamResponse", + "FinishWritingInput", + "FinishWritingOutput", + "FinishWritingRequest", + "FinishWritingResponse", + "ListStreamsInput", + "ListStreamsOutput", + "ListStreamsRequest", + "ListStreamsResponse", + "PollMessagesInput", + "PollMessagesOutput", + "PollMessagesRequest", + "PollMessagesResponse", + "PollWorkflowMessagesInput", + "PollWorkflowMessagesRequest", + "PollWorkflowMessagesResponse", + "ProducerCursor", + "RegisterStreamConsumerInput", + "RegisterStreamConsumerOutput", + "RegisterStreamConsumerRequest", + "RegisterStreamConsumerResponse", + "StreamBudget", + "StreamLifecycle", + "StreamListEntry", + "StreamRecord", + "StreamRecordBatch", + "StreamState", + "SubscribeWorkflowInput", + "SubscribeWorkflowOutput", + "SubscribeWorkflowRequest", + "SubscribeWorkflowResponse", + "TruncateStreamInput", + "TruncateStreamOutput", + "TruncateStreamRequest", + "TruncateStreamResponse", + "WorkflowStreamCursor", +] diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py new file mode 100644 index 000000000..8876ac29b --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporalio/api/stream/v1/message.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto"\xf7\x02\n\x0cStreamRecord\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12W\n\x08metadata\x18\x02 \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamRecord.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x10\n\x08sequence\x18\x04 \x01(\x03\x12\x36\n\x04kind\x18\x05 \x01(\x0e\x32(.temporal.api.stream.v1.StreamRecordKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x12\x13\n\x0bproducer_id\x18\x07 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"]\n\x11StreamRecordBatch\x12H\n\x07records\x18\x01 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecordB>Z= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamRecord(google.protobuf.message.Message): + """The stored shape of temporal.api.stream.v1.StreamRecord plus the offset a + read assigns. Field for field the public record, so one crosses the frontend + in either direction without translation. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance, stored as sent.""" + topic: builtins.str + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. Stored + as sent; the global offset is what orders the stream. + """ + kind: temporalio.api.stream.v1.message_pb2.StreamRecordKind.ValueType + """Settled to DATA on append when left unspecified, so a retry hashes the + same bytes and a reader never sees the zero value. + """ + offset: builtins.int + """Position in the whole stream, set on read and never stored. A consumer + that resumes at record granularity needs it, and a topic-filtered read + leaves gaps that make it underivable from the response alone. + """ + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did: its publish + command clears the field, whatever the worker sent. + """ + attempt: builtins.int + """The producer's attempt, stored as sent. Readers treat a later attempt by + the same producer as superseding what the earlier one wrote. + """ + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + sequence: builtins.int = ..., + kind: temporalio.api.stream.v1.message_pb2.StreamRecordKind.ValueType = ..., + offset: builtins.int = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "attempt", + b"attempt", + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "offset", + b"offset", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "topic", + b"topic", + ], + ) -> None: ... + +global___StreamRecord = StreamRecord + +class StreamRecordBatch(google.protobuf.message.Message): + """One append is one batch, and one batch is one data node. The server stores + this serialized and opaque; it decodes only to trim a partial first page or + to apply a topic filter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RECORDS_FIELD_NUMBER: builtins.int + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamRecord + ]: ... + def __init__( + self, + *, + records: collections.abc.Iterable[global___StreamRecord] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["records", b"records"] + ) -> None: ... + +global___StreamRecordBatch = StreamRecordBatch diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.py b/temporalio/api/streamservice/v1/message_pb2_grpc.py new file mode 100644 index 000000000..bf947056a --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.py @@ -0,0 +1,4 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" + +import grpc diff --git a/temporalio/api/streamservice/v1/message_pb2_grpc.pyi b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/message_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py new file mode 100644 index 000000000..3df3e3c35 --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -0,0 +1,881 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporalio/api/stream/v1/request_response.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.streamservice.v1 import ( + message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2, +) +from temporalio.api.streamservice.v1 import ( + stream_state_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_stream__state__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xf5\x01\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12H\n\x07records\x18\x03 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08J\x04\x08\x07\x10\x08"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"\x94\x01\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x06 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xdf\x01\n\x12PollMessagesOutput\x12H\n\x07records\x18\x01 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x0e\n\x06run_id\x18\x06 \x01(\t";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xc4\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x08 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"p\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x04 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xde\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x07 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12H\n\x07records\x18\x04 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"H\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\r\n\x05\x66orce\x18\x03 \x01(\x08"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x90\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"T\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CreateStreamInput(google.protobuf.message.Message): + """The frontend-facing shapes are defined here rather than in the public API + because streams have no public API yet. Keeping them in a nested + frontend_request mirrors the other CHASM libraries, so promoting them later + is a package move rather than a redesign. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def lifecycle( + self, + ) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + lifecycle: temporalio.api.streamservice.v1.stream_state_pb2.StreamLifecycle + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["lifecycle", b"lifecycle"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "lifecycle", + b"lifecycle", + "namespace", + b"namespace", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___CreateStreamInput = CreateStreamInput + +class CreateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + run_id: builtins.str + def __init__( + self, + *, + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["run_id", b"run_id"] + ) -> None: ... + +global___CreateStreamOutput = CreateStreamOutput + +class AddMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + USE_EXPECTED_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional. Supplying it skips resolving the stream's current run, which is + a persistence lookup on every call. CreateStream returns it. + """ + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord + ]: ... + producer_id: builtins.str + """Idempotency, all optional. Supply a producer identity and sequence, or an + expected offset, or neither and accept at-least-once. + """ + sequence: builtins.int + expected_offset: builtins.int + """Guarded by use_expected_offset because proto3 optional is not supported + by this repo's helper generator. + """ + use_expected_offset: builtins.bool + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + expected_offset: builtins.int = ..., + use_expected_offset: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "expected_offset", + b"expected_offset", + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "records", + b"records", + "run_id", + b"run_id", + "sequence", + b"sequence", + "stream_id", + b"stream_id", + "use_expected_offset", + b"use_expected_offset", + ], + ) -> None: ... + +global___AddMessagesInput = AddMessagesInput + +class AddMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FIRST_OFFSET_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + DEDUPLICATED_FIELD_NUMBER: builtins.int + first_offset: builtins.int + next_offset: builtins.int + count: builtins.int + deduplicated: builtins.bool + """True when a retry matched a recorded sequence and nothing was appended.""" + def __init__( + self, + *, + first_offset: builtins.int = ..., + next_offset: builtins.int = ..., + count: builtins.int = ..., + deduplicated: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "count", + b"count", + "deduplicated", + b"deduplicated", + "first_offset", + b"first_offset", + "next_offset", + b"next_offset", + ], + ) -> None: ... + +global___AddMessagesOutput = AddMessagesOutput + +class FinishWritingInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + producer_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + producer_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "producer_id", + b"producer_id", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___FinishWritingInput = FinishWritingInput + +class FinishWritingOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___FinishWritingOutput = FinishWritingOutput + +class SubscribeWorkflowInput(google.protobuf.message.Message): + """Registers a Workflow as a consumer of a stream it owns. The cursor lands in + the Workflow's own state, so from then on each of its Workflow Tasks carries + the next range and records what it consumed. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Name of the stream within the Workflow, for a stream it owns.""" + stream_id: builtins.str + """Id of a standalone stream in another execution. Exactly one of this and + stream_name is set. + """ + start_offset: builtins.int + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___SubscribeWorkflowInput = SubscribeWorkflowInput + +class SubscribeWorkflowOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + start_offset: builtins.int + def __init__( + self, + *, + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["start_offset", b"start_offset"] + ) -> None: ... + +global___SubscribeWorkflowOutput = SubscribeWorkflowOutput + +class PollMessagesInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + run_id: builtins.str + """Optional, as on AddMessagesInput.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters by exact topic. Offsets are assigned over the unfiltered stream, so + next_offset advances past filtered-out records too. + """ + wait_new_messages: builtins.bool + """When set and the reader is caught up, block until something arrives, the + stream closes, or the server's long-poll timeout elapses. A timeout returns + an empty response rather than an error, so the caller simply polls again. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + ], + ) -> None: ... + +global___PollMessagesInput = PollMessagesInput + +class PollMessagesOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RECORDS_FIELD_NUMBER: builtins.int + NEXT_OFFSET_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord + ]: ... + next_offset: builtins.int + head_offset: builtins.int + closed: builtins.bool + @property + def close_reason(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + run_id: builtins.str + """The execution holding the stream. A workflow task slice built from this + read names the run it came from. + """ + def __init__( + self, + *, + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord + ] + | None = ..., + next_offset: builtins.int = ..., + head_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporalio.api.common.v1.message_pb2.Payload | None = ..., + run_id: builtins.str = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["close_reason", b"close_reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "close_reason", + b"close_reason", + "closed", + b"closed", + "head_offset", + b"head_offset", + "next_offset", + b"next_offset", + "records", + b"records", + "run_id", + b"run_id", + ], + ) -> None: ... + +global___PollMessagesOutput = PollMessagesOutput + +class DescribeStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DescribeStreamInput = DescribeStreamInput + +class PollWorkflowMessagesInput(google.protobuf.message.Message): + """A stream a workflow owns lives inside that workflow's execution, so it has + no standalone id to address it by. It is named by its owner and its name + instead, and routed on the owner. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + MAX_MESSAGES_FIELD_NUMBER: builtins.int + TOPICS_FIELD_NUMBER: builtins.int + WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + from_offset: builtins.int + max_messages: builtins.int + @property + def topics( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Filters as on PollMessagesInput.""" + wait_new_messages: builtins.bool + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + from_offset: builtins.int = ..., + max_messages: builtins.int = ..., + topics: collections.abc.Iterable[builtins.str] | None = ..., + wait_new_messages: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "max_messages", + b"max_messages", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "topics", + b"topics", + "wait_new_messages", + b"wait_new_messages", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___PollWorkflowMessagesInput = PollWorkflowMessagesInput + +class DescribeWorkflowStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput + +class AddWorkflowMessagesInput(google.protobuf.message.Message): + """Appending to a stream a workflow owns, from outside that workflow. The + workflow's own publishes ride its Workflow Task instead. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """Optional. Pins to one run, so a caller that has continued as new is not + silently redirected to the successor's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + stream_name: builtins.str + """Empty means the workflow's default output stream.""" + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord + ]: ... + producer_id: builtins.str + """Optional idempotency, as on AddMessagesInput.""" + sequence: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_name: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.streamservice.v1.message_pb2.StreamRecord + ] + | None = ..., + producer_id: builtins.str = ..., + sequence: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "producer_id", + b"producer_id", + "records", + b"records", + "sequence", + b"sequence", + "stream_name", + b"stream_name", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AddWorkflowMessagesInput = AddWorkflowMessagesInput + +class DescribeStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATE_FIELD_NUMBER: builtins.int + @property + def state(self) -> temporalio.api.streamservice.v1.stream_state_pb2.StreamState: ... + def __init__( + self, + *, + state: temporalio.api.streamservice.v1.stream_state_pb2.StreamState + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["state", b"state"] + ) -> None: ... + +global___DescribeStreamOutput = DescribeStreamOutput + +class CloseStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + REASON_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + @property + def reason(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + reason: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["reason", b"reason"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", b"namespace", "reason", b"reason", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___CloseStreamInput = CloseStreamInput + +class CloseStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___CloseStreamOutput = CloseStreamOutput + +class TruncateStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + NEW_BASE_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + new_base_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + new_base_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "new_base_offset", + b"new_base_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___TruncateStreamInput = TruncateStreamInput + +class TruncateStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___TruncateStreamOutput = TruncateStreamOutput + +class DeleteStreamInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + FORCE_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + force: builtins.bool + """Delete even while a workflow consumer is active. Without it the call is + refused, because the consumer's History depends on ranges the deletion + takes with it. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + force: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "force", b"force", "namespace", b"namespace", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___DeleteStreamInput = DeleteStreamInput + +class DeleteStreamOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___DeleteStreamOutput = DeleteStreamOutput + +class CreateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CreateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CreateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CreateStreamRequest = CreateStreamRequest + +class CreateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CreateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CreateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CreateStreamResponse = CreateStreamResponse + +class AddMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddMessagesRequest = AddMessagesRequest + +class AddMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddMessagesResponse = AddMessagesResponse + +class FinishWritingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___FinishWritingInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___FinishWritingInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___FinishWritingRequest = FinishWritingRequest + +class FinishWritingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___FinishWritingOutput: ... + def __init__( + self, + *, + frontend_response: global___FinishWritingOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___FinishWritingResponse = FinishWritingResponse + +class SubscribeWorkflowRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___SubscribeWorkflowInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___SubscribeWorkflowInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___SubscribeWorkflowRequest = SubscribeWorkflowRequest + +class SubscribeWorkflowResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___SubscribeWorkflowOutput: ... + def __init__( + self, + *, + frontend_response: global___SubscribeWorkflowOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___SubscribeWorkflowResponse = SubscribeWorkflowResponse + +class PollMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollMessagesRequest = PollMessagesRequest + +class PollMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollMessagesResponse = PollMessagesResponse + +class DescribeStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeStreamRequest = DescribeStreamRequest + +class DescribeStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeStreamResponse = DescribeStreamResponse + +class PollWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___PollWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___PollWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___PollWorkflowMessagesRequest = PollWorkflowMessagesRequest + +class PollWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___PollMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___PollMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___PollWorkflowMessagesResponse = PollWorkflowMessagesResponse + +class DescribeWorkflowStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DescribeWorkflowStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DescribeWorkflowStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DescribeWorkflowStreamRequest = DescribeWorkflowStreamRequest + +class DescribeWorkflowStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DescribeStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DescribeStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DescribeWorkflowStreamResponse = DescribeWorkflowStreamResponse + +class RegisterStreamConsumerInput(google.protobuf.message.Message): + """Registering a consumer on a stream in another execution. Split out from + SubscribeWorkflow because the two halves live on different shards: the pin + goes on the stream, the cursor goes on the consuming workflow, and a handler + can only reach the shard it was routed to. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int + CONSUMER_RUN_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + stream_id: builtins.str + consumer_workflow_id: builtins.str + """The workflow that will consume. Together with the run it names the pin, + so a later run of the same workflow id registers fresh rather than + inheriting a closed run's floor. + """ + consumer_run_id: builtins.str + start_offset: builtins.int + """Negative means from wherever the stream is when the pin is taken. Resolved + here, where the frontier is, and returned so the cursor records a fact. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + stream_id: builtins.str = ..., + consumer_workflow_id: builtins.str = ..., + consumer_run_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_run_id", + b"consumer_run_id", + "consumer_workflow_id", + b"consumer_workflow_id", + "namespace", + b"namespace", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___RegisterStreamConsumerInput = RegisterStreamConsumerInput + +class RegisterStreamConsumerOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + START_OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + start_offset: builtins.int + known_head: builtins.int + """The frontier at registration, so the cursor starts with a known head + instead of waiting for the first push. + """ + def __init__( + self, + *, + start_offset: builtins.int = ..., + known_head: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "known_head", b"known_head", "start_offset", b"start_offset" + ], + ) -> None: ... + +global___RegisterStreamConsumerOutput = RegisterStreamConsumerOutput + +class AdvanceConsumerHeadInput(google.protobuf.message.Message): + """Telling one consumer that the frontier moved. Routed to the consumer, which + is not where the stream lives. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_ID_FIELD_NUMBER: builtins.int + OWNER_RUN_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + HEAD_OFFSET_FIELD_NUMBER: builtins.int + namespace: builtins.str + workflow_id: builtins.str + owner_run_id: builtins.str + """The run that subscribed. A successor from continue-as-new holds no cursor + for this stream, so pushing the frontier at it would land nowhere. + """ + stream_id: builtins.str + head_offset: builtins.int + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_id: builtins.str = ..., + owner_run_id: builtins.str = ..., + stream_id: builtins.str = ..., + head_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "head_offset", + b"head_offset", + "namespace", + b"namespace", + "owner_run_id", + b"owner_run_id", + "stream_id", + b"stream_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___AdvanceConsumerHeadInput = AdvanceConsumerHeadInput + +class AdvanceConsumerHeadOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CONSUMER_CLOSED_FIELD_NUMBER: builtins.int + SUCCESSOR_RUN_ID_FIELD_NUMBER: builtins.int + SUCCESSOR_START_OFFSET_FIELD_NUMBER: builtins.int + consumer_closed: builtins.bool + """The run that held the pin is closed and no current run of the workflow + consumes the stream, so the stream can release the pin. + """ + successor_run_id: builtins.str + """The run that held the pin is closed but a successor carries the + subscription, so the stream re-keys the pin to it, with the floor the + successor's cursor started from. + """ + successor_start_offset: builtins.int + def __init__( + self, + *, + consumer_closed: builtins.bool = ..., + successor_run_id: builtins.str = ..., + successor_start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "consumer_closed", + b"consumer_closed", + "successor_run_id", + b"successor_run_id", + "successor_start_offset", + b"successor_start_offset", + ], + ) -> None: ... + +global___AdvanceConsumerHeadOutput = AdvanceConsumerHeadOutput + +class AddWorkflowMessagesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AddWorkflowMessagesInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AddWorkflowMessagesInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AddWorkflowMessagesRequest = AddWorkflowMessagesRequest + +class AddWorkflowMessagesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AddMessagesOutput: ... + def __init__( + self, + *, + frontend_response: global___AddMessagesOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AddWorkflowMessagesResponse = AddWorkflowMessagesResponse + +class RegisterStreamConsumerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___RegisterStreamConsumerInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___RegisterStreamConsumerInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___RegisterStreamConsumerRequest = RegisterStreamConsumerRequest + +class RegisterStreamConsumerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___RegisterStreamConsumerOutput: ... + def __init__( + self, + *, + frontend_response: global___RegisterStreamConsumerOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___RegisterStreamConsumerResponse = RegisterStreamConsumerResponse + +class AdvanceConsumerHeadRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___AdvanceConsumerHeadInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___AdvanceConsumerHeadInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___AdvanceConsumerHeadRequest = AdvanceConsumerHeadRequest + +class AdvanceConsumerHeadResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___AdvanceConsumerHeadOutput: ... + def __init__( + self, + *, + frontend_response: global___AdvanceConsumerHeadOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___AdvanceConsumerHeadResponse = AdvanceConsumerHeadResponse + +class CloseStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___CloseStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___CloseStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___CloseStreamRequest = CloseStreamRequest + +class CloseStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___CloseStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___CloseStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___CloseStreamResponse = CloseStreamResponse + +class TruncateStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___TruncateStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___TruncateStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___TruncateStreamRequest = TruncateStreamRequest + +class TruncateStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___TruncateStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___TruncateStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___TruncateStreamResponse = TruncateStreamResponse + +class ListStreamsInput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + PAGE_SIZE_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + QUERY_FIELD_NUMBER: builtins.int + namespace: builtins.str + page_size: builtins.int + next_page_token: builtins.bytes + query: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + page_size: builtins.int = ..., + next_page_token: builtins.bytes = ..., + query: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "namespace", + b"namespace", + "next_page_token", + b"next_page_token", + "page_size", + b"page_size", + "query", + b"query", + ], + ) -> None: ... + +global___ListStreamsInput = ListStreamsInput + +class StreamListEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___StreamListEntry = StreamListEntry + +class ListStreamsOutput(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAMS_FIELD_NUMBER: builtins.int + NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int + @property + def streams( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamListEntry + ]: ... + next_page_token: builtins.bytes + def __init__( + self, + *, + streams: collections.abc.Iterable[global___StreamListEntry] | None = ..., + next_page_token: builtins.bytes = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "next_page_token", b"next_page_token", "streams", b"streams" + ], + ) -> None: ... + +global___ListStreamsOutput = ListStreamsOutput + +class ListStreamsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___ListStreamsInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___ListStreamsInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___ListStreamsRequest = ListStreamsRequest + +class ListStreamsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___ListStreamsOutput: ... + def __init__( + self, + *, + frontend_response: global___ListStreamsOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___ListStreamsResponse = ListStreamsResponse + +class DeleteStreamRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_ID_FIELD_NUMBER: builtins.int + FRONTEND_REQUEST_FIELD_NUMBER: builtins.int + namespace_id: builtins.str + @property + def frontend_request(self) -> global___DeleteStreamInput: ... + def __init__( + self, + *, + namespace_id: builtins.str = ..., + frontend_request: global___DeleteStreamInput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["frontend_request", b"frontend_request"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_request", b"frontend_request", "namespace_id", b"namespace_id" + ], + ) -> None: ... + +global___DeleteStreamRequest = DeleteStreamRequest + +class DeleteStreamResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FRONTEND_RESPONSE_FIELD_NUMBER: builtins.int + @property + def frontend_response(self) -> global___DeleteStreamOutput: ... + def __init__( + self, + *, + frontend_response: global___DeleteStreamOutput | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "frontend_response", b"frontend_response" + ], + ) -> None: ... + +global___DeleteStreamResponse = DeleteStreamResponse diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.py b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..bf947056a --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,4 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" + +import grpc diff --git a/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/streamservice/v1/service_pb2.py b/temporalio/api/streamservice/v1/service_pb2.py new file mode 100644 index 000000000..432abfc5c --- /dev/null +++ b/temporalio/api/streamservice/v1/service_pb2.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporalio/api/stream/v1/service.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.streamservice.v1 import ( + request_response_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_request__response__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n&temporalio/api/stream/v1/service.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a/temporalio/api/stream/v1/request_response.proto2\xce\x12\n\rStreamService\x12\x91\x01\n\x0c\x43reateStream\x12>.temporal.server.chasm.lib.stream.proto.v1.CreateStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.CreateStreamResponse"\x00\x12\x8e\x01\n\x0b\x41\x64\x64Messages\x12=.temporal.server.chasm.lib.stream.proto.v1.AddMessagesRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.AddMessagesResponse"\x00\x12\x94\x01\n\rFinishWriting\x12?.temporal.server.chasm.lib.stream.proto.v1.FinishWritingRequest\x1a@.temporal.server.chasm.lib.stream.proto.v1.FinishWritingResponse"\x00\x12\xa0\x01\n\x11SubscribeWorkflow\x12\x43.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowRequest\x1a\x44.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowResponse"\x00\x12\x91\x01\n\x0cPollMessages\x12>.temporal.server.chasm.lib.stream.proto.v1.PollMessagesRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.PollMessagesResponse"\x00\x12\x97\x01\n\x0e\x44\x65scribeStream\x12@.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamResponse"\x00\x12\xa9\x01\n\x14PollWorkflowMessages\x12\x46.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesRequest\x1aG.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16\x44\x65scribeWorkflowStream\x12H.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamResponse"\x00\x12\xa6\x01\n\x13\x41\x64\x64WorkflowMessages\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesResponse"\x00\x12\xaf\x01\n\x16RegisterStreamConsumer\x12H.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerRequest\x1aI.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerResponse"\x00\x12\xa6\x01\n\x13\x41\x64vanceConsumerHead\x12\x45.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadRequest\x1a\x46.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadResponse"\x00\x12\x8e\x01\n\x0b\x43loseStream\x12=.temporal.server.chasm.lib.stream.proto.v1.CloseStreamRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.CloseStreamResponse"\x00\x12\x97\x01\n\x0eTruncateStream\x12@.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamRequest\x1a\x41.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamResponse"\x00\x12\x8e\x01\n\x0bListStreams\x12=.temporal.server.chasm.lib.stream.proto.v1.ListStreamsRequest\x1a>.temporal.server.chasm.lib.stream.proto.v1.ListStreamsResponse"\x00\x12\x91\x01\n\x0c\x44\x65leteStream\x12>.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamRequest\x1a?.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamResponse"\x00\x42>Z None: ... + CreateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse, + ] + AddMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse, + ] + FinishWriting: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse, + ] + SubscribeWorkflow: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse, + ] + PollMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse, + ] + DescribeStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse, + ] + PollWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, + ] + """Routed on the owner, because the stream it reads has no id of its own.""" + DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, + ] + AddWorkflowMessages: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse, + ] + RegisterStreamConsumer: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse, + ] + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + AdvanceConsumerHead: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse, + ] + CloseStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse, + ] + TruncateStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse, + ] + ListStreams: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse, + ] + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + DeleteStream: grpc.UnaryUnaryMultiCallable[ + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse, + ] + +class StreamServiceServicer(metaclass=abc.ABCMeta): + @abc.abstractmethod + def CreateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CreateStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CreateStreamResponse: ... + @abc.abstractmethod + def AddMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.AddMessagesResponse: ... + @abc.abstractmethod + def FinishWriting( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.FinishWritingRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.FinishWritingResponse: ... + @abc.abstractmethod + def SubscribeWorkflow( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.SubscribeWorkflowResponse + ): ... + @abc.abstractmethod + def PollMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollMessagesResponse: ... + @abc.abstractmethod + def DescribeStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.DescribeStreamResponse + ): ... + @abc.abstractmethod + def PollWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: + """Routed on the owner, because the stream it reads has no id of its own.""" + @abc.abstractmethod + def DescribeWorkflowStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse: ... + @abc.abstractmethod + def AddWorkflowMessages( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AddWorkflowMessagesResponse + ): ... + @abc.abstractmethod + def RegisterStreamConsumer( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.RegisterStreamConsumerResponse: + """Internal. History calls these on itself to reach a shard it does not own, + which is the only way a step that spans two executions can work on a + cluster with more than one history host. + """ + @abc.abstractmethod + def AdvanceConsumerHead( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.AdvanceConsumerHeadResponse + ): ... + @abc.abstractmethod + def CloseStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.CloseStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.CloseStreamResponse: ... + @abc.abstractmethod + def TruncateStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamRequest, + context: grpc.ServicerContext, + ) -> ( + temporalio.api.streamservice.v1.request_response_pb2.TruncateStreamResponse + ): ... + @abc.abstractmethod + def ListStreams( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.ListStreamsRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.ListStreamsResponse: + """Served on the frontend only: it queries visibility rather than a stream, + so there is no business ID to route on and nothing for a shard to answer. + """ + @abc.abstractmethod + def DeleteStream( + self, + request: temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.streamservice.v1.request_response_pb2.DeleteStreamResponse: ... + +def add_StreamServiceServicer_to_server( + servicer: StreamServiceServicer, server: grpc.Server +) -> None: ... diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py new file mode 100644 index 000000000..9f334a50f --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporalio/api/stream/v1/stream_state.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xb5\x06\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12G\n\x06\x62udget\x18\x0e \x01(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamBudget\x12\x16\n\x0e\x61ppended_bytes\x18\x0f \x01(\x03\x12\x16\n\x0enotify_pending\x18\x10 \x01(\x08\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01J\x04\x08\x03\x10\x04J\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t"4\n\x0cStreamBudget\x12\x11\n\tmax_items\x18\x01 \x01(\x03\x12\x11\n\tmax_bytes\x18\x02 \x01(\x03"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"}\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\x12\x14\n\x0creplay_floor\x18\x06 \x01(\x03"\xc0\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\x12\x14\n\x0cstart_offset\x18\n \x01(\x03J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>Z= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class StreamState(google.protobuf.message.Message): + """Size is O(producers + consumers), never O(messages). Payload bytes live in + the component's data nodes, not here, which keeps this off the CHASM + partial-read path. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class ProducersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ProducerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ProducerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + class ConsumersEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___ConsumerCursor: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___ConsumerCursor | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + HEAD_OFFSET_FIELD_NUMBER: builtins.int + BASE_OFFSET_FIELD_NUMBER: builtins.int + CLOSED_FIELD_NUMBER: builtins.int + CLOSE_REASON_FIELD_NUMBER: builtins.int + PRODUCERS_FIELD_NUMBER: builtins.int + CONSUMERS_FIELD_NUMBER: builtins.int + LIFECYCLE_FIELD_NUMBER: builtins.int + REDIRECT_RUN_ID_FIELD_NUMBER: builtins.int + CLOSE_TIME_FIELD_NUMBER: builtins.int + BUDGET_FIELD_NUMBER: builtins.int + APPENDED_BYTES_FIELD_NUMBER: builtins.int + NOTIFY_PENDING_FIELD_NUMBER: builtins.int + head_offset: builtins.int + """Visibility frontier. Readers never observe an offset at or past this.""" + base_offset: builtins.int + """Truncation floor. Offsets below this are gone.""" + closed: builtins.bool + @property + def close_reason(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + @property + def producers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ProducerCursor + ]: ... + @property + def consumers( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, global___ConsumerCursor + ]: ... + @property + def lifecycle(self) -> global___StreamLifecycle: ... + redirect_run_id: builtins.str + """Set when a successor run takes ownership, so an in-flight poll can follow + the chain instead of stalling on a superseded run. + """ + @property + def close_time(self) -> google.protobuf.timestamp_pb2.Timestamp: + """Wall-clock close time, used to schedule retention deletion.""" + @property + def budget(self) -> global___StreamBudget: + """Set on a stream a workflow owns. Its batches are the owning execution's + mutable state, so appends past the budget are refused rather than left to + the execution size limit, which terminates the workflow. + """ + appended_bytes: builtins.int + """Bytes appended over the stream's life, kept for the budget check. A stream + with a budget never reclaims, so this is also what it holds. + """ + notify_pending: builtins.bool + """A notify task is scheduled and has not run yet. Appends while it is set + schedule none of their own; the task reads the head when it runs, so it + carries every append that landed before it. + """ + def __init__( + self, + *, + head_offset: builtins.int = ..., + base_offset: builtins.int = ..., + closed: builtins.bool = ..., + close_reason: temporalio.api.common.v1.message_pb2.Payload | None = ..., + producers: collections.abc.Mapping[builtins.str, global___ProducerCursor] + | None = ..., + consumers: collections.abc.Mapping[builtins.str, global___ConsumerCursor] + | None = ..., + lifecycle: global___StreamLifecycle | None = ..., + redirect_run_id: builtins.str = ..., + close_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + budget: global___StreamBudget | None = ..., + appended_bytes: builtins.int = ..., + notify_pending: builtins.bool = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "budget", + b"budget", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "lifecycle", + b"lifecycle", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "appended_bytes", + b"appended_bytes", + "base_offset", + b"base_offset", + "budget", + b"budget", + "close_reason", + b"close_reason", + "close_time", + b"close_time", + "closed", + b"closed", + "consumers", + b"consumers", + "head_offset", + b"head_offset", + "lifecycle", + b"lifecycle", + "notify_pending", + b"notify_pending", + "producers", + b"producers", + "redirect_run_id", + b"redirect_run_id", + ], + ) -> None: ... + +global___StreamState = StreamState + +class StreamBudget(google.protobuf.message.Message): + """Hard bounds on what a stream may hold. Distinct from StreamLifecycle.max_items, + which reclaims the oldest messages: a budget refuses the newest. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAX_ITEMS_FIELD_NUMBER: builtins.int + MAX_BYTES_FIELD_NUMBER: builtins.int + max_items: builtins.int + max_bytes: builtins.int + def __init__( + self, + *, + max_items: builtins.int = ..., + max_bytes: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_bytes", b"max_bytes", "max_items", b"max_items" + ], + ) -> None: ... + +global___StreamBudget = StreamBudget + +class ProducerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEQ_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + COUNT_FIELD_NUMBER: builtins.int + CONTENT_HASH_FIELD_NUMBER: builtins.int + FENCED_FIELD_NUMBER: builtins.int + seq: builtins.int + first_offset: builtins.int + count: builtins.int + content_hash: builtins.bytes + """Distinguishes a genuine retry from a client reusing a sequence with + different content, which must be rejected rather than deduplicated. + """ + fenced: builtins.bool + """Set by FinishWriting. Ends this producer's writes without closing the + stream for anyone else. + """ + def __init__( + self, + *, + seq: builtins.int = ..., + first_offset: builtins.int = ..., + count: builtins.int = ..., + content_hash: builtins.bytes = ..., + fenced: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "content_hash", + b"content_hash", + "count", + b"count", + "fenced", + b"fenced", + "first_offset", + b"first_offset", + "seq", + b"seq", + ], + ) -> None: ... + +global___ProducerCursor = ProducerCursor + +class ConsumerCursor(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + ACTIVE_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + REPLAY_FLOOR_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + offset: builtins.int + """How far this consumer has read. Used to decide whether it needs waking, + not to decide what the stream may drop. + """ + active: builtins.bool + external: builtins.bool + """Set when the consumer is a workflow in another execution, which is the + only case that has to be told the frontier moved. A workflow consuming a + stream it owns sees that while closing its own transaction. + """ + replay_floor: builtins.int + """The oldest offset this consumer's History still depends on. + + It is where the subscription started, not where it has read to. A range + this consumer already consumed is recorded in its History and has to be + re-readable for the workflow to replay, so bytes below the read position + are exactly the ones a replay needs most. It stays put while the consumer + is active and is released when it deregisters. + """ + def __init__( + self, + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + offset: builtins.int = ..., + active: builtins.bool = ..., + external: builtins.bool = ..., + replay_floor: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "active", + b"active", + "external", + b"external", + "offset", + b"offset", + "replay_floor", + b"replay_floor", + "run_id", + b"run_id", + "workflow_id", + b"workflow_id", + ], + ) -> None: ... + +global___ConsumerCursor = ConsumerCursor + +class WorkflowStreamCursor(google.protobuf.message.Message): + """A consuming Workflow's position in a stream. This lives in the consuming + Workflow's own state rather than on the stream, so advancing it commits in + the same transaction as the WorkflowTaskCompleted event that records the + range. Keeping it on the stream would make the advance a cross-execution + write, and a crash between the two would either redeliver or skip. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + KNOWN_HEAD_FIELD_NUMBER: builtins.int + EXTERNAL_FIELD_NUMBER: builtins.int + PENDING_FROM_FIELD_NUMBER: builtins.int + PENDING_TO_FIELD_NUMBER: builtins.int + HAS_PENDING_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + offset: builtins.int + """Next offset to deliver.""" + known_head: builtins.int + """The stream's frontier as of the last delivery. A workflow consuming a + stream in another execution cannot read the real frontier while closing its + own transaction, so this is what tells it a capped slice left more behind. + """ + external: builtins.bool + """Set when the stream lives in another execution, which decides whether the + frontier is read locally or taken from known_head. + """ + pending_from: builtins.int + """The range attached to the Workflow Task currently in flight. Recorded on + the event that closes that task, then folded into offset. An empty range + is still recorded: a task where the subscription saw nothing is a fact + replay has to reproduce. + """ + pending_to: builtins.int + has_pending: builtins.bool + start_offset: builtins.int + """Where this subscription began reading. Retained separately from offset, + which advances, because replay has to tell "committed nothing yet" apart + from "the events recording what was committed are not in this page". + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + offset: builtins.int = ..., + known_head: builtins.int = ..., + external: builtins.bool = ..., + pending_from: builtins.int = ..., + pending_to: builtins.int = ..., + has_pending: builtins.bool = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "external", + b"external", + "has_pending", + b"has_pending", + "known_head", + b"known_head", + "offset", + b"offset", + "pending_from", + b"pending_from", + "pending_to", + b"pending_to", + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + ], + ) -> None: ... + +global___WorkflowStreamCursor = WorkflowStreamCursor + +class StreamLifecycle(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RETENTION_FIELD_NUMBER: builtins.int + MAX_ITEMS_FIELD_NUMBER: builtins.int + @property + def retention(self) -> google.protobuf.duration_pb2.Duration: + """How long a closed stream stays readable before it is deleted.""" + max_items: builtins.int + """Cap on readable messages. Whole batches are reclaimed once the floor + passes them, so a capped stream has bounded storage. + """ + def __init__( + self, + *, + retention: google.protobuf.duration_pb2.Duration | None = ..., + max_items: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["retention", b"retention"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "max_items", b"max_items", "retention", b"retention" + ], + ) -> None: ... + +global___StreamLifecycle = StreamLifecycle diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py new file mode 100644 index 000000000..bf947056a --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.py @@ -0,0 +1,4 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" + +import grpc diff --git a/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/streamservice/v1/stream_state_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" From a34074fb466727c8ba3197619fc4cf73ddc62b16 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:56:41 -0700 Subject: [PATCH 557/831] Added the stream service client. Outside code needs a way to append to and read a server-side stream. The client translates every transport failure into StreamNotFoundError or RPCError and applies the client's payload codec to bodies, so both sides of a namespace with a codec agree. --- temporalio/client_stream.py | 614 ++++++++++++++++++++++++++++++++++++ tests/test_client_stream.py | 192 +++++++++++ 2 files changed, 806 insertions(+) create mode 100644 temporalio/client_stream.py create mode 100644 tests/test_client_stream.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py new file mode 100644 index 000000000..b482941af --- /dev/null +++ b/temporalio/client_stream.py @@ -0,0 +1,614 @@ +"""Client for Temporal server-side streams. + +A stream is a durable, offset-addressed append-only sequence that lives beside +Workflow History rather than inside it. Appending schedules no Workflow Task, +and each reader holds its own cursor, so adding a reader costs nothing on the +write side. The record is ``temporal.api.stream.v1.StreamRecord`` on the wire +and in the store, so a reader in any language decodes the same bytes. + +Prototype support for AI-198. Four things about it are temporary and will +change before this is a real feature: + +- **Requires the ``grpc`` extra.** The rest of this SDK reaches the server + through sdk-core, which does not know about this service yet, so the client + here opens its own channel with ``grpcio``. +- **The protos are vendored** under ``temporalio.api.streamservice.v1`` instead of + coming from the api submodule, because the service is still defined in the + server. That is why the wire names read as server-internal. +- **This client is for use outside a Workflow.** Workflow code publishes and + consumes with ``workflow.append_stream_records`` and + ``workflow.read_stream_records`` instead. +- **No TLS or API-key support**, for the same reason: the channel is built + here rather than by the machinery that normally handles that. + +A failed call raises :class:`temporalio.streams.StreamNotFoundError` when the +server answers ``NOT_FOUND`` and :class:`temporalio.service.RPCError` +otherwise, never the transport's own exception type. +""" + +from __future__ import annotations + +import asyncio +import weakref +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence +from dataclasses import dataclass +from typing import Any, TypeVar + +import google.protobuf.duration_pb2 +import grpc +import grpc.aio + +import temporalio.api.streamservice.v1 as stream +from temporalio.api.stream.v1 import StreamRecord +from temporalio.api.streamservice.v1 import service_pb2_grpc +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import StreamNotFoundError + +__all__ = [ + "Appended", + "Page", + "StreamClient", + "StreamEntry", + "StreamHandle", + "WorkflowStreamHandle", + "close_shared_clients", + "shared_client", +] + +_T = TypeVar("_T") + + +@dataclass(frozen=True) +class Appended: + """Where one append landed. + + ``deduplicated`` says the server already held this producer's batch at + this sequence and wrote nothing; the offsets are then the original ones. + """ + + first_offset: int + next_offset: int + count: int + deduplicated: bool = False + + +@dataclass(frozen=True) +class StreamEntry: + """One record read from a stream, with where it sits. + + Offsets are assigned over the unfiltered stream, so a topic-filtered read + hands back entries whose offsets are not contiguous. A reader that resumes + between records takes ``offset`` rather than counting what it received. + """ + + record: StreamRecord + offset: int = 0 + + +@dataclass(frozen=True) +class Page: + """One read of a stream. + + ``closed`` with ``next_offset >= head_offset`` is the end: nothing more can + be added and this reader has everything. ``run_id`` names the execution + holding the stream, which is how a reader of a workflow's stream learns + which run it is on when it did not pin one. + """ + + entries: list[StreamEntry] + next_offset: int + head_offset: int + closed: bool + run_id: str = "" + + +def _to_service(record: StreamRecord) -> stream.StreamRecord: + # Field for field the public record; the stored shape only adds the offset + # a read assigns. An unset body stays unset so a FINISH record reads back + # as one. + out = stream.StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return out + + +def _to_public(record: stream.StreamRecord) -> StreamEntry: + out = StreamRecord( + topic=record.topic, + kind=record.kind, + producer_id=record.producer_id, + attempt=record.attempt, + sequence=record.sequence, + ) + if record.HasField("body"): + out.body.CopyFrom(record.body) + for key, value in record.metadata.items(): + out.metadata[key].CopyFrom(value) + return StreamEntry(record=out, offset=record.offset) + + +def _translate(error: grpc.aio.AioRpcError) -> Exception: + code = error.code() + details = error.details() or code.name + if code is grpc.StatusCode.NOT_FOUND: + return StreamNotFoundError(details) + raw = b"" + # The aio metadata iterates as (key, value) pairs at runtime, whatever + # shape the stubs give its items. + trailing: Any = error.trailing_metadata() + for item in trailing or (): + key, value = item[0], item[1] + if key == "grpc-status-details-bin" and isinstance(value, bytes): + raw = value + return RPCError(details, RPCStatusCode(code.value[0]), raw) + + +async def _call(method: Callable[[Any], Awaitable[_T]], request: Any) -> _T: + """Make one stub call, translating the transport's failure to the SDK's.""" + try: + return await method(request) + except grpc.aio.AioRpcError as error: + raise _translate(error) from error + + +class StreamClient: + """Creates and opens streams on a namespace.""" + + def __init__(self, channel: Any, namespace: str) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + self._channel = channel + self._namespace = namespace + # The generated stub is typed for a synchronous channel. This client + # drives it over ``grpc.aio``, where every call is awaited. + self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) + + @staticmethod + def connect(target_host: str, namespace: str = "default") -> StreamClient: + """Open a channel to a frontend. + + Separate from ``Client.connect`` because this does not share the + connection the rest of the SDK uses. + """ + return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + + async def close(self) -> None: + """Close the underlying channel.""" + await self._channel.close() + + async def create( + self, + stream_id: str, + *, + retention: float | None = None, + max_items: int | None = None, + ) -> StreamHandle: + """Create a stream and return a handle to it. + + ``retention`` is how long a closed stream stays readable, in seconds. + ``max_items`` caps how many records remain readable, dropping the + oldest, which bounds storage for a stream nobody truncates. + """ + lifecycle = stream.StreamLifecycle() + if retention is not None: + lifecycle.retention.CopyFrom( + google.protobuf.duration_pb2.Duration(seconds=int(retention)) + ) + if max_items is not None: + lifecycle.max_items = max_items + + response = await _call( + self._stub.CreateStream, + stream.CreateStreamRequest( + frontend_request=stream.CreateStreamInput( + namespace=self._namespace, + stream_id=stream_id, + lifecycle=lifecycle, + ) + ), + ) + return StreamHandle( + self._stub, + self._namespace, + stream_id, + run_id=response.frontend_response.run_id, + ) + + def get(self, stream_id: str) -> StreamHandle: + """Open an existing stream without a round trip.""" + return StreamHandle(self._stub, self._namespace, stream_id) + + def workflow_stream( + self, workflow_id: str, name: str = "", *, owner_run_id: str = "" + ) -> WorkflowStreamHandle: + """Open a stream a workflow owns. + + A stream a workflow owns lives inside that workflow's execution and has + no id of its own, so it is named by its owner and its name. An empty + name is the workflow's default output stream, which is what + ``workflow.append_stream_records`` writes to when it is given none. + + The stream is created by the workflow's first publish or subscription, + or by the first append from outside. Reading one that does not exist + yet is not an error: it reads as empty and a + :meth:`WorkflowStreamHandle.follow` parked on it wakes when something + is written. + + ``owner_run_id`` pins the handle to one run of the workflow; see + :meth:`WorkflowStreamHandle.pin` for why a follower wants that. + """ + return WorkflowStreamHandle( + self._stub, self._namespace, workflow_id, name, owner_run_id + ) + + +class StreamHandle: + """A handle to one standalone stream.""" + + def __init__( + self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + ) -> None: + """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" + self._stub = stub + self._namespace = namespace + self._id = stream_id + # Passing this back saves the server resolving the current run on every + # call, which is otherwise a persistence lookup per request. + self._run_id = run_id + + @property + def id(self) -> str: + """Id of the stream this handle points at.""" + return self._id + + async def append( + self, + *records: StreamRecord, + producer_id: str = "", + sequence: int = 0, + ) -> Appended: + """Append records and return where they landed. + + Supplying ``producer_id`` and ``sequence`` makes the append idempotent: + a retry with the same pair returns the original offsets rather than + appending twice, and says so. Without them the append is + at-least-once, which is only the right trade when duplicates are + harmless. + """ + response = await _call( + self._stub.AddMessages, + stream.AddMessagesRequest( + frontend_request=stream.AddMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + records=[_to_service(record) for record in records], + producer_id=producer_id, + sequence=sequence, + ) + ), + ) + return _appended(response.frontend_response) + + async def read( + self, + *, + from_offset: int = 0, + max_records: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[StreamEntry], int]: + """Read once from ``from_offset``, returning the entries and the + offset to read from next. + + With ``wait`` set, blocks until something arrives, the stream closes, + or the server's long-poll window elapses. A window that elapses returns + an empty list rather than raising, so the caller just reads again. + """ + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait + ) + return page.entries, page.next_offset + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, starting at ``from_offset``. + + Ends once the stream is closed and this reader has drained it. A closed + stream stays readable until its retention expires, so a reader that + starts late still sees everything instead of having to coordinate a + shutdown with the producer. + """ + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for entry in page.entries: + yield entry + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_records: int = 0, + wait: bool = True, + ) -> Page: + """One read, with everything the caller needs to decide what to do next.""" + response = await _call( + self._stub.PollMessages, + stream.PollMessagesRequest( + frontend_request=stream.PollMessagesInput( + namespace=self._namespace, + stream_id=self._id, + run_id=self._run_id, + from_offset=from_offset, + max_messages=max_records, + topics=list(topics), + wait_new_messages=wait, + ) + ), + ) + return _page(response.frontend_response) + + async def finish_writing(self, producer_id: str) -> None: + """Declare one producer done without ending the stream for others.""" + await _call( + self._stub.FinishWriting, + stream.FinishWritingRequest( + frontend_request=stream.FinishWritingInput( + namespace=self._namespace, + stream_id=self._id, + producer_id=producer_id, + ) + ), + ) + + async def close(self) -> None: + """Seal the stream. Readers can still drain what is already there.""" + await _call( + self._stub.CloseStream, + stream.CloseStreamRequest( + frontend_request=stream.CloseStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ), + ) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state.""" + response = await _call( + self._stub.DescribeStream, + stream.DescribeStreamRequest( + frontend_request=stream.DescribeStreamInput( + namespace=self._namespace, stream_id=self._id + ) + ), + ) + return response.frontend_response.state + + +class WorkflowStreamHandle: + """A handle to a stream a workflow owns. + + The workflow writes to it from inside its Workflow Task, which costs it no + transition of its own. Anything else writes through :meth:`append`, which + costs one transition on the owning execution per batch. Both land in the + same log in the order the server accepted them. + """ + + def __init__( + self, + stub: Any, + namespace: str, + workflow_id: str, + name: str = "", + owner_run_id: str = "", + ) -> None: + """Prefer :meth:`StreamClient.workflow_stream`.""" + self._stub = stub + self._namespace = namespace + self._workflow_id = workflow_id + self._name = name + self._owner_run_id = owner_run_id + + @property + def workflow_id(self) -> str: + """Id of the workflow that owns this stream.""" + return self._workflow_id + + @property + def name(self) -> str: + """Name the owner publishes under, empty for its default stream.""" + return self._name + + @property + def owner_run_id(self) -> str: + """The run this handle is pinned to, empty while it follows the current run.""" + return self._owner_run_id + + def pin(self, run_id: str) -> None: + """Address one run of the workflow from now on. + + Unpinned, every call resolves to whichever run is current. A follower + holding an offset from one run would then be redirected when the + workflow continues as new: the successor's stream starts empty at + offset zero, so the server reads the follower's offset as "caught up", + parks it until the successor has published that many records, and + then skips exactly that many. Pinned, the run's end shows up as + ``closed`` on the page, and the caller decides whether to follow the + successor from the beginning. + """ + self._owner_run_id = run_id + + async def append( + self, + *records: StreamRecord, + producer_id: str = "", + sequence: int = 0, + ) -> Appended: + """Append from outside the workflow, as :meth:`StreamHandle.append`. + + Batch where you can. The append costs one transition on the owning + execution whatever its size, so a batch of a hundred costs what a batch + of one does. + """ + response = await _call( + self._stub.AddWorkflowMessages, + stream.AddWorkflowMessagesRequest( + frontend_request=stream.AddWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, + stream_name=self._name, + records=[_to_service(record) for record in records], + producer_id=producer_id, + sequence=sequence, + ) + ), + ) + return _appended(response.frontend_response) + + async def read( + self, + *, + from_offset: int = 0, + max_records: int = 0, + topics: Sequence[str] = (), + wait: bool = False, + ) -> tuple[list[StreamEntry], int]: + """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" + page = await self.poll( + from_offset=from_offset, max_records=max_records, topics=topics, wait=wait + ) + return page.entries, page.next_offset + + async def follow( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + ) -> AsyncIterator[StreamEntry]: + """Yield entries as they arrive, as :meth:`StreamHandle.follow`.""" + offset = from_offset + while True: + page = await self.poll(from_offset=offset, topics=topics) + for entry in page.entries: + yield entry + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def poll( + self, + *, + from_offset: int = 0, + topics: Sequence[str] = (), + max_records: int = 0, + wait: bool = True, + ) -> Page: + """One read, with everything the caller needs to decide what to do next. + + :meth:`read` is the same call without the frontier and the closed flag. + A caller that has to tell "nothing yet" from "nothing ever" needs both. + On a pinned handle ``closed`` also says the run has ended. + """ + response = await _call( + self._stub.PollWorkflowMessages, + stream.PollWorkflowMessagesRequest( + frontend_request=stream.PollWorkflowMessagesInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, + stream_name=self._name, + from_offset=from_offset, + max_messages=max_records, + topics=list(topics), + wait_new_messages=wait, + ) + ), + ) + return _page(response.frontend_response) + + async def describe(self) -> stream.StreamState: + """Read the stream's current frontier, floor and closed state. + + A reader that wants only what comes next starts from the head this + reports rather than from zero. + """ + response = await _call( + self._stub.DescribeWorkflowStream, + stream.DescribeWorkflowStreamRequest( + frontend_request=stream.DescribeWorkflowStreamInput( + namespace=self._namespace, + workflow_id=self._workflow_id, + owner_run_id=self._owner_run_id, + stream_name=self._name, + ) + ), + ) + return response.frontend_response.state + + +def _appended(out: stream.AddMessagesOutput) -> Appended: + return Appended( + first_offset=out.first_offset, + next_offset=out.next_offset, + count=out.count, + deduplicated=out.deduplicated, + ) + + +def _page(out: stream.PollMessagesOutput) -> Page: + return Page( + entries=[_to_public(record) for record in out.records], + next_offset=out.next_offset, + head_offset=out.head_offset, + closed=out.closed, + run_id=out.run_id, + ) + + +# One channel per loop, target and namespace, shared by every handle in the +# process. A channel is multiplexed and long lived, and callers open a handle +# per subscription, which would otherwise be a connection per subscription. The +# loop is the key because a grpc.aio channel belongs to the loop that made it, +# and it is held weakly so a loop that is gone cannot lend its channel to a +# successor that happens to reuse its id. +_shared: weakref.WeakKeyDictionary[ + asyncio.AbstractEventLoop, dict[tuple[str, str], StreamClient] +] = weakref.WeakKeyDictionary() + + +def shared_client(target_host: str, namespace: str) -> StreamClient: + """The process-wide client for ``target_host`` and ``namespace`` on this loop.""" + per_loop = _shared.setdefault(asyncio.get_running_loop(), {}) + key = (target_host, namespace) + existing = per_loop.get(key) + if existing is None: + existing = per_loop[key] = StreamClient.connect(target_host, namespace) + return existing + + +async def close_shared_clients() -> None: + """Close every shared client this loop opened. + + For a process that is done with streams, and for tests, which open a + loop per case and would otherwise leave a channel behind on each. + """ + per_loop = _shared.pop(asyncio.get_running_loop(), {}) + for client in per_loop.values(): + await client.close() diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py new file mode 100644 index 000000000..e3f16f38e --- /dev/null +++ b/tests/test_client_stream.py @@ -0,0 +1,192 @@ +"""End-to-end tests for the server-side stream client. + +These need a Temporal server built from the AI-198 branch, because the stream +service does not exist on a released server. Point them at one: + + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/test_client_stream.py + +Skipped otherwise, rather than silently passing against a server that has no +idea what a stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from collections.abc import AsyncIterator + +import pytest + +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind +from temporalio.client_stream import StreamClient, StreamHandle +from temporalio.service import RPCError +from temporalio.streams import StreamNotFoundError + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + + +def rec(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +def data(entries: list) -> list[bytes]: + return [entry.record.body.data for entry in entries] + + +@pytest.fixture +async def streams() -> AsyncIterator[StreamClient]: + client = StreamClient.connect( + TARGET or "", os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + try: + yield client + finally: + await client.close() + + +@pytest.fixture +async def stream(streams: StreamClient) -> StreamHandle: + return await streams.create("py-test-" + uuid.uuid4().hex[:8], max_items=1000) + + +async def test_append_returns_the_offset_it_landed_at(stream: StreamHandle) -> None: + first = await stream.append(rec(b"alpha"), rec(b"beta")) + assert (first.first_offset, first.next_offset, first.count) == (0, 2, 2) + assert not first.deduplicated + assert (await stream.append(rec(b"gamma"))).first_offset == 2 + + +async def test_read_from_an_offset(stream: StreamHandle) -> None: + await stream.append(rec(b"alpha"), rec(b"beta"), rec(b"gamma")) + + entries, next_offset = await stream.read() + assert data(entries) == [b"alpha", b"beta", b"gamma"] + assert [entry.offset for entry in entries] == [0, 1, 2] + assert next_offset == 3 + + entries, next_offset = await stream.read(from_offset=1) + assert data(entries) == [b"beta", b"gamma"] + assert next_offset == 3 + + +async def test_read_past_the_end_returns_nothing(stream: StreamHandle) -> None: + await stream.append(rec(b"alpha")) + + entries, next_offset = await stream.read(from_offset=1) + assert entries == [] + assert next_offset == 1, "a caught-up reader keeps its cursor" + + +# Without an identity the append is at-least-once, so this is the only way a +# producer that retries can avoid writing the same record twice. +async def test_append_is_idempotent_for_a_named_producer(stream: StreamHandle) -> None: + first = await stream.append(rec(b"once"), producer_id="p1", sequence=1) + retry = await stream.append(rec(b"once"), producer_id="p1", sequence=1) + assert first.first_offset == retry.first_offset == 0 + assert not first.deduplicated + # The retry is told it wrote nothing and where the original landed. + assert retry.deduplicated + assert retry.next_offset == first.next_offset + + entries, _ = await stream.read() + assert data(entries) == [b"once"] + + +async def test_topics_filter_a_read(stream: StreamHandle) -> None: + await stream.append(rec(b"tok", topic="tokens")) + await stream.append(rec(b"prog", topic="progress")) + await stream.append(rec(b"tok2", topic="tokens")) + + entries, next_offset = await stream.read(topics=["tokens"]) + assert data(entries) == [b"tok", b"tok2"] + assert [entry.offset for entry in entries] == [0, 2] + assert next_offset == 3, "the cursor advances past filtered-out offsets too" + + +# The record comes back as it went in: kind, producer identity and sequence +# are the server's to store, not to interpret. +async def test_the_record_roundtrips_field_for_field(stream: StreamHandle) -> None: + sent = rec(b"x", topic="t") + sent.producer_id = "model" + sent.attempt = 2 + sent.sequence = 7 + sent.metadata["trace"].CopyFrom(Payload(data=b"abc")) + finish = StreamRecord( + topic="t", kind=StreamRecordKind.STREAM_RECORD_KIND_FINISH, producer_id="model" + ) + await stream.append(sent, finish) + + entries, _ = await stream.read() + got = entries[0].record + assert (got.topic, got.producer_id, got.attempt, got.sequence) == ( + "t", + "model", + 2, + 7, + ) + assert got.kind == StreamRecordKind.STREAM_RECORD_KIND_DATA + assert got.metadata["trace"].data == b"abc" + assert entries[1].record.kind == StreamRecordKind.STREAM_RECORD_KIND_FINISH + assert not entries[1].record.HasField("body") + + +# A closed stream stays readable, which is what removes the shutdown handshake +# between producer and consumer. +async def test_follow_drains_then_ends_when_the_stream_closes( + stream: StreamHandle, +) -> None: + received: list[bytes] = [] + + async def follower() -> None: + async for entry in stream.follow(): + received.append(entry.record.body.data) + + task = asyncio.create_task(follower()) + await stream.append(rec(b"one")) + await asyncio.sleep(0.2) + await stream.append(rec(b"two")) + await asyncio.sleep(0.2) + await stream.close() + + await asyncio.wait_for(task, timeout=30) + assert received == [b"one", b"two"] + + +async def test_follow_started_late_still_sees_everything( + stream: StreamHandle, +) -> None: + await stream.append(rec(b"one"), rec(b"two")) + await stream.close() + + received = [entry.record.body.data async for entry in stream.follow()] + assert received == [b"one", b"two"] + + +async def test_describe_reports_the_frontier(stream: StreamHandle) -> None: + await stream.append(rec(b"one"), rec(b"two")) + + state = await stream.describe() + assert state.head_offset == 2 + assert not state.closed + + await stream.close() + assert (await stream.describe()).closed + + +# The transport's own exception never escapes: a missing stream is the SDK's +# not-found error and anything else is its RPC error. +async def test_failures_surface_as_sdk_errors(streams: StreamClient) -> None: + missing = streams.get("py-test-missing-" + uuid.uuid4().hex[:8]) + with pytest.raises(StreamNotFoundError): + await missing.describe() + with pytest.raises((StreamNotFoundError, RPCError)): + await missing.append(rec(b"x")) From 3f745505e9584cabcb9276d4b6c65b47544df835 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:57:28 -0700 Subject: [PATCH 558/831] Added the temporalio.streams interface. The record, cursors, typed topic definitions and the error family are the vocabulary; the two provider protocols say what a store implements and which half runs on the workflow thread. Nothing here does I/O, so workflow code can import all of it. --- temporalio/streams/__init__.py | 108 ++++++++++++ temporalio/streams/_errors.py | 40 +++++ temporalio/streams/_ids.py | 26 +++ temporalio/streams/_policy.py | 66 ++++++++ temporalio/streams/_provider.py | 285 ++++++++++++++++++++++++++++++++ temporalio/streams/_record.py | 115 +++++++++++++ temporalio/streams/_topic.py | 92 +++++++++++ temporalio/streams/_wire.py | 181 ++++++++++++++++++++ 8 files changed, 913 insertions(+) create mode 100644 temporalio/streams/__init__.py create mode 100644 temporalio/streams/_errors.py create mode 100644 temporalio/streams/_ids.py create mode 100644 temporalio/streams/_policy.py create mode 100644 temporalio/streams/_provider.py create mode 100644 temporalio/streams/_record.py create mode 100644 temporalio/streams/_topic.py create mode 100644 temporalio/streams/_wire.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py new file mode 100644 index 000000000..b23c95be4 --- /dev/null +++ b/temporalio/streams/__init__.py @@ -0,0 +1,108 @@ +"""Streams: a channel a workflow reads, decides on, and writes. + +.. warning:: + This module is experimental and may change in future versions. The + design is meant to be the shape that goes GA; the label is the SDK's + release convention, not a licence to break it. + +The contract, in five statements: + +1. **A workflow publishes only to topics of its own stream, and it publishes + transactionally.** :meth:`temporalio.workflow.StreamWriter.publish` + returns at once. The record is visible when the Workflow Task is accepted, + and never if the task fails, so no reader can see a decision the workflow + did not commit. +2. **Reading is an observation, and the SDK records it.** What + :class:`temporalio.workflow.StreamReader` handed to workflow code, + including the boundary where it found nothing, is committed with the + commands that reading produced. Recovery re-supplies the same records in + the same order. +3. **Anything that does I/O publishes on its own account.** An activity or an + outside process writes through a :class:`StreamProducer` with a producer + id, an attempt and a sequence, and its records are visible as soon as the + store accepts them. Those three let a reader tell a retry from a new + generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume + strictly after the record it names; :meth:`StreamHandle.latest` positions a + follower. Do not compare two cursors or do arithmetic on one. +5. **A workflow addresses its streams relative to itself, by topic.** A topic + can be written by the workflow and by outside producers, and read by the + workflow and by outside consumers; which of those happen is the + application's business. A topic is defined once with :func:`topic`, with + the type its records decode to, and that definition is shared by the + workflow, its activities and the backend; a plain string names a topic + decided at runtime. + +A provider is an object, registered once as a plugin: +``Client.connect(plugins=[provider])``; workers built from that client inherit +it, and ``Worker(plugins=[provider])`` or ``Replayer(plugins=[provider])`` +registers it on a worker alone. Each context then asks for its stream the +same way. Workflow code uses :func:`temporalio.workflow.stream_reader` and +:func:`temporalio.workflow.stream_writer`. An activity uses +:func:`temporalio.activity.stream_handle`, which is its own workflow pinned +to its run unless told otherwise. Any process holding a client uses +:meth:`temporalio.client.Client.get_stream_handle`, which mirrors +``get_workflow_handle``. The explicit form, +``provider.get_stream_handle(client, workflow_id)``, stays for a process that +talks to two stores. This module keeps the shared types, the errors and the +protocols a provider implements; nothing here that workflow code imports does +I/O. + +What the contract does not promise: that a :attr:`RecordKind.FINISH` record +means the writing activity succeeded, that a superseded attempt's records can +be withdrawn, or that a stream outlives the retention its provider is +configured for. Reading somebody else's stream is out of scope for this +release. + +The record on the wire is ``temporal.api.stream.v1.StreamRecord`` on every +provider, with the user's value in ``body`` as an ordinary payload, so a +reader in any language decodes the same bytes and a payload codec applies. +""" + +from __future__ import annotations + +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import ( + ReadSource, + StreamHandle, + StreamProducer, + StreamProvider, + WorkflowStreamProvider, + WriteSink, +) +from temporalio.streams._record import ( + BEGINNING, + Cursor, + RecordKind, + StreamRecord, + Supersession, +) +from temporalio.streams._topic import StreamTopic, resolve_topic, topic + +__all__ = [ + "BEGINNING", + "Cursor", + "ReadSource", + "RecordKind", + "StreamCursorError", + "StreamError", + "StreamHandle", + "StreamNotFoundError", + "StreamProducer", + "StreamProducerError", + "StreamProvider", + "StreamRecord", + "StreamTopic", + "StreamUnsupportedError", + "Supersession", + "WorkflowStreamProvider", + "WriteSink", + "resolve_topic", + "topic", +] diff --git a/temporalio/streams/_errors.py b/temporalio/streams/_errors.py new file mode 100644 index 000000000..f00bf1c3a --- /dev/null +++ b/temporalio/streams/_errors.py @@ -0,0 +1,40 @@ +"""The errors a stream call raises. + +Every stream condition is a :class:`StreamError`, so a caller can catch by +meaning the way it catches other :class:`temporalio.exceptions.TemporalError` +subclasses. Argument mistakes stay ``ValueError``. A provider's transport +failure surfaces as :class:`temporalio.service.RPCError`, never as the +transport's own exception type. +""" + +from __future__ import annotations + +import temporalio.exceptions + +__all__ = [ + "StreamCursorError", + "StreamError", + "StreamNotFoundError", + "StreamProducerError", + "StreamUnsupportedError", +] + + +class StreamError(temporalio.exceptions.TemporalError): + """Base for stream conditions.""" + + +class StreamNotFoundError(StreamError): + """The workflow, chain or topic does not exist or is past retention.""" + + +class StreamCursorError(StreamError): + """The cursor was minted by another provider or names a record no longer retained.""" + + +class StreamProducerError(StreamError): + """The producer attempt or sequence conflicts with what the store holds.""" + + +class StreamUnsupportedError(StreamError): + """This provider does not offer the requested capability.""" diff --git a/temporalio/streams/_ids.py b/temporalio/streams/_ids.py new file mode 100644 index 000000000..2a76dcf19 --- /dev/null +++ b/temporalio/streams/_ids.py @@ -0,0 +1,26 @@ +"""The store key a provider derives from a workflow id and a topic. + +A workflow id may contain any character, ``:`` included, so joining the pair +with a bare ``:`` is ambiguous: ``("a:b", "c")`` and ``("a", "b:c")`` would +land in one store. Every provider that keys a store by the pair goes through +:func:`topic_key`, so they all agree and none of them collides. +""" + +from __future__ import annotations + +__all__ = ["topic_key"] + + +def _escape(component: str) -> str: + # Percent first, so an escaped component cannot be mistaken for one that + # already contained the escape. + return component.replace("%", "%25").replace(":", "%3A") + + +def topic_key(workflow_id: str, topic: str) -> str: + """The store key for ``topic`` of ``workflow_id``'s stream. + + Both components are percent-encoded before joining, so the only bare ``:`` + in the result is the separator. + """ + return f"{_escape(workflow_id)}:{_escape(topic)}" diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py new file mode 100644 index 000000000..81949e4fc --- /dev/null +++ b/temporalio/streams/_policy.py @@ -0,0 +1,66 @@ +"""Turning a producer's newer attempt into something a reader can act on. + +An activity that streams half an answer and then fails leaves those records in +the stream. Its retry calls the model again and writes different words. No +provider can undo the first half, and a workflow that already acted on it has +committed that decision, so the honest thing is to tell the reader that a new +attempt began and let the application decide. + +This runs in the reader over records it already observed, so it costs no round +trip and replays without the provider being involved. +""" + +from __future__ import annotations + +from typing import Any + +from temporalio.streams._record import ( + Cursor, + RecordKind, + StreamRecord, + Supersession, +) + +__all__ = ["AttemptTracker"] + + +class AttemptTracker: + """Watches producer attempts on one subscription.""" + + def __init__(self) -> None: + """Start with no producer seen.""" + self._attempts: dict[str, int] = {} + + def note( + self, producer_id: str, attempt: int, *, topic: str, previous: Cursor + ) -> StreamRecord[Any] | None: + """A supersession record when this record starts a newer attempt. + + ``previous`` is the cursor of the last record delivered before the one + being noted, or the cursor the read started from. The synthesized + record carries it, so a consumer that checkpoints the supersession and + resumes after it is handed the new attempt's first record next rather + than skipping it. + + A producer that declares no attempt supersedes nothing, because there + is no generation to compare. That is the same answer as an unnumbered + record: the interface reports what it was told and invents nothing. + """ + if not producer_id or attempt <= 0: + return None + seen = self._attempts.get(producer_id, 0) + if attempt <= seen: + return None + self._attempts[producer_id] = attempt + if seen == 0: + return None + return StreamRecord( + kind=RecordKind.SUPERSEDED, + cursor=previous, + topic=topic, + producer_id=producer_id, + attempt=attempt, + supersession=Supersession( + producer_id=producer_id, previous_attempt=seen, attempt=attempt + ), + ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py new file mode 100644 index 000000000..8c142080d --- /dev/null +++ b/temporalio/streams/_provider.py @@ -0,0 +1,285 @@ +"""What a provider implements, in two halves. + +:class:`WorkflowStreamProvider` runs on the workflow thread and must keep the +contract's first two rules: publishes commit with the Workflow Task, and reads +are recorded observations. Nothing it needs may do I/O. :class:`StreamProvider` +is the half a process holds: it makes the workflow half for a worker and hands +out :class:`StreamHandle` objects to code outside a workflow. A Python provider +usually implements both on one class; the split is what lets a language whose +workflow code is bundled separately name the two halves in two packages. + +A provider only moves ``temporal.api.stream.v1.StreamRecord`` protos. The +handles around it convert values, synthesize supersession and mint cursors, +and turn a :class:`temporalio.streams.StreamTopic` into the plain name the +provider sees, through :func:`temporalio.streams.resolve_topic`. +""" + +from __future__ import annotations + +from collections.abc import AsyncGenerator +from typing import TYPE_CHECKING, Any, Protocol, TypeVar, overload + +from temporalio.api.stream.v1 import StreamRecord as WireRecord +from temporalio.streams._record import BEGINNING, Cursor, StreamRecord +from temporalio.streams._topic import StreamTopic + +if TYPE_CHECKING: + from temporalio.client import Client + +__all__ = [ + "ReadSource", + "StreamHandle", + "StreamProducer", + "StreamProvider", + "WorkflowStreamProvider", + "WriteSink", +] + +T = TypeVar("T") +T_contra = TypeVar("T_contra", contravariant=True) + + +class StreamProducer(Protocol[T_contra]): + """Appends to one topic from outside workflow code. + + Every append is visible as soon as the store accepts it, and carries the + producer id, attempt and sequence that let a reader tell a retried append + from a new generation. The type parameter is the topic definition's + value type; a producer on a string-named topic takes any value. + """ + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + ... + + @property + def attempt(self) -> int: + """The generation this producer is writing, or 0 when undeclared.""" + ... + + async def append(self, *values: T_contra) -> Cursor | None: + """Append ``values`` and return the cursor of the last record as the store holds it. + + A repeat of an earlier append (same producer, attempt and sequence) is + written once and returns the position the original landed at. An + empty call writes nothing and returns the same value a repeat would: + the position of this producer's last record, or ``BEGINNING`` when it + has written none. ``None`` means one thing only: this provider learns + positions at read time, and a caller that needs one positions itself + with :meth:`StreamHandle.latest`. + + Raises: + StreamProducerError: The attempt or sequence conflicts with what + the store holds. + """ + ... + + async def finish(self) -> None: + """Write ``FINISH`` for this producer on this topic. + + Says this producer has nothing more to send. It does not say the + activity behind it succeeded, and it does not end anyone's read. + """ + ... + + +class StreamHandle(Protocol): + """One workflow's stream, addressed by topic, from outside workflow code. + + A handle follows the workflow's execution chain unless it was opened with + a ``run_id``, in which case it is pinned to that run. A topic is a + :class:`temporalio.streams.StreamTopic` definition, which carries the + record type, or a plain string with ``result_type=`` for a name decided + at runtime. A transport failure surfaces as + :class:`temporalio.service.RPCError`, never as the transport's own + exception type. + """ + + @overload + def read( + self, *, topic: StreamTopic[T], after: Cursor = ... + ) -> AsyncGenerator[StreamRecord[T], None]: ... + + @overload + def read( + self, *, topic: str, after: Cursor = ..., result_type: type[T] + ) -> AsyncGenerator[StreamRecord[T], None]: ... + + @overload + def read( + self, *, topic: str, after: Cursor = ..., result_type: None = None + ) -> AsyncGenerator[StreamRecord[Any], None]: ... + + def read( + self, + *, + topic: str | StreamTopic[Any], + after: Cursor = BEGINNING, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield the records on ``topic`` after ``after`` as they arrive. + + ``BEGINNING`` yields everything the topic retains. Any other cursor + came from a record a reader saw, and reading resumes just past it, so + a reader that stores the last cursor it handled and hands it back + sees every record exactly once. The read ends when the owning + execution, or its chain, is closed and every retained record after + ``after`` has been delivered; until then it waits. The result is a + generator, so a caller that stops early can ``aclose()`` it and + release whatever the provider parked against the store. + + Raises: + ValueError: ``result_type`` was passed with a topic definition, + or the topic is empty. + StreamCursorError: ``after`` came from another provider or names + a record no longer retained. Raised by this call, not by the + first iteration. + StreamNotFoundError: The workflow or topic does not exist or is + past retention. + """ + ... + + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + """The cursor of the newest record on ``topic``, or ``BEGINNING`` when empty. + + For a reader that wants to follow from now: ``read(after=latest())`` + yields only what is published after this call returned, which is how + a client that is about to send a message positions itself before + sending, without the workflow having to report a position. + """ + ... + + @overload + def producer( + self, *, topic: StreamTopic[T], producer_id: str = ..., attempt: int = ... + ) -> StreamProducer[T]: ... + + @overload + def producer( + self, *, topic: str, producer_id: str = ..., attempt: int = ... + ) -> StreamProducer[Any]: ... + + def producer( + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> StreamProducer[Any]: + """A producer on ``topic``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer, and they are what + let a reader tell a retry from a new generation. Outside one, + ``producer_id`` is required and an empty one raises ``ValueError``. + """ + ... + + +class ReadSource(Protocol): + """One subscription, as a provider supplies it to the workflow thread.""" + + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + """The next records with their positions, waiting until there is at least one. + + A batch rather than a record because delivery boundaries are what a + provider actually records, and flattening them here keeps that out of + the contract. A record that cannot be parsed into a ``StreamRecord`` + proto is the provider's to skip. + + Raises: + StopAsyncIteration: This subscription has ended. + """ + ... + + def close(self) -> None: + """End the subscription. Idempotent.""" + ... + + +class WriteSink(Protocol): + """One topic of the running workflow's stream, as a provider binds it.""" + + def publish(self, record: WireRecord) -> None: + """Take one record into this Workflow Task's output. + + Synchronous: there is nothing to wait for inside a task, because the + task is the visibility boundary. The provider commits what it buffered + when the task completes and drops it when the task fails. A record + the provider cannot stage raises :class:`temporalio.streams.StreamError` + and fails the task, loudly. + """ + ... + + +class WorkflowStreamProvider(Protocol): + """The half of a provider that runs on the workflow thread. + + Imports nothing that does I/O. The worker creates one per workflow + instance through :meth:`StreamProvider.workflow_provider`, so state kept + here dies with the instance the way handlers do. It sees topics by name; + the definitions are resolved before it is called. + """ + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + """Subscribe the running workflow to ``topic`` of its own stream. + + Raises: + StreamCursorError: ``after`` was minted by another provider. + """ + ... + + def open_writer(self, topic: str) -> WriteSink: + """Bind ``topic`` of the running workflow's stream for publishing.""" + ... + + def on_workflow_start(self) -> None: + """Called before the workflow function runs. + + A provider that serves outside readers through handlers on the + workflow registers them here, before the first task completes. + """ + ... + + async def on_workflow_finish(self) -> None: + """Called after the workflow function returns, raises or continues as new. + + A provider that parked an outside reader against the run lets go + here, so the workflow can close. + """ + ... + + +class StreamProvider(Protocol): + """What a store ships. Also a :class:`temporalio.worker.Plugin` when it serves workers. + + Construct one, pass it to ``Client.connect(plugins=[provider])`` so the + client and the workers built from it carry it, or to + ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` for a + worker alone, and open handles from it anywhere else. Nothing is global: + two workers in one process may hold two providers. + """ + + def workflow_provider(self) -> WorkflowStreamProvider: + """The half that serves one workflow instance on its thread.""" + ... + + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> StreamHandle: + """A handle on ``workflow_id``'s stream. + + Without ``run_id`` it follows the execution chain, so a consumer keeps + reading across continue-as-new; with one it is pinned to that run. + """ + ... + + async def close(self) -> None: + """Release what this provider holds for the process. + + A provider that keeps a connection pool or an HTTP session open needs + a moment where the process says it is done; this is it. A provider + that holds nothing returns at once. + """ + ... diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py new file mode 100644 index 000000000..fef63e51c --- /dev/null +++ b/temporalio/streams/_record.py @@ -0,0 +1,115 @@ +"""The value types the stream contract is expressed in. + +Nothing here touches Temporal or a provider, so every provider shares it +unchanged. +""" + +from __future__ import annotations + +import enum +from dataclasses import dataclass +from typing import Generic, TypeVar + +__all__ = [ + "BEGINNING", + "Cursor", + "RecordKind", + "StreamRecord", + "Supersession", +] + +T = TypeVar("T") + + +@enum.unique +class RecordKind(enum.IntEnum): + """What a record is. + + Mirrors ``temporal.api.stream.v1.StreamRecordKind`` value for value, so a + record's kind crosses the wire as the integer the proto holds. + """ + + UNSPECIFIED = 0 + """The proto's zero value. + + A stored record whose writer set no kind is read as :attr:`DATA`, as the + proto defines it, so a reader never sees this kind on a record. + """ + + DATA = 1 + """Carries a value published by a workflow or a producer.""" + + FINISH = 2 + """The producer named in ``producer_id`` will write nothing more on this topic. + + An empty ``producer_id`` names the owning workflow. It does not end a + read, which ends when the owning execution or its chain is closed and the + retained tail has been delivered, and it says nothing about the producer's + outcome: an activity can still time out after writing it. + """ + + SUPERSEDED = 3 + """A later attempt of the same producer started writing. + + Synthesized by the reader from what it observed, never stored, so every + provider delivers it identically and replay reproduces it without the + provider's help. Its cursor is the position before the new attempt's + first record, so resuming after it delivers that record next. + """ + + +@dataclass(frozen=True) +class Cursor: + """A position in a stream, ordered by its provider rather than by value. + + Opaque on purpose. One provider numbers records with integers and another + with a millisecond-and-sequence pair, so comparing tokens here would be + right for one and wrong for the other. Hand a cursor back to resume after + the record it names; nothing here advances one. The token starts with the + name of the provider that minted it, and a provider refuses a token from + another with :class:`temporalio.streams.StreamCursorError`. + """ + + token: str + + def __str__(self) -> str: + """The provider's position token.""" + return self.token + + +BEGINNING = Cursor("") +"""Read from the oldest record the stream still retains.""" + + +@dataclass(frozen=True) +class Supersession: + """What a :attr:`RecordKind.SUPERSEDED` record reports.""" + + producer_id: str + previous_attempt: int + attempt: int + + +@dataclass(frozen=True) +class StreamRecord(Generic[T]): + """One record as a reader sees it. + + ``value`` is set on a :attr:`RecordKind.DATA` record and ``supersession`` + on a :attr:`RecordKind.SUPERSEDED` one; every other kind carries neither. + Each field means one thing, so a consumer narrows on ``kind`` and reads + the field that kind promises. + """ + + kind: RecordKind + cursor: Cursor + topic: str + producer_id: str = "" + """Who wrote it, or empty when the owning workflow wrote it itself.""" + attempt: int = 0 + """The producer's attempt, or 0 when it did not declare one.""" + sequence: int = -1 + """The producer's position within its attempt, or -1 when unnumbered.""" + value: T | None = None + """The published value. Set on ``DATA`` only.""" + supersession: Supersession | None = None + """The attempt change being reported. Set on ``SUPERSEDED`` only.""" diff --git a/temporalio/streams/_topic.py b/temporalio/streams/_topic.py new file mode 100644 index 000000000..173291fad --- /dev/null +++ b/temporalio/streams/_topic.py @@ -0,0 +1,92 @@ +"""Typed topic definitions. + +Temporal's idiom is to define once and refer by reference: signals, queries +and updates are decorated methods, activities and workflows are functions, +Nexus operations are typed definitions. A topic follows the same rule. It is +defined once, at module level, with the type its records decode to, and the +workflow, its activities and the backend all refer to that one definition. A +plain string names a topic too, the way a string names a signal chosen at +runtime; then the decode hint travels as ``result_type=`` on each call. + +The wire does not change: a topic is a string on the proto and in every +store, and :attr:`temporalio.streams.StreamRecord.topic` is that string. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Generic, TypeVar, overload + +__all__ = ["StreamTopic", "resolve_topic", "topic"] + +T = TypeVar("T") + + +@dataclass(frozen=True) +class StreamTopic(Generic[T]): + """A topic of a workflow's stream, with the type its records decode to. + + Made with :func:`topic`. Hand it to :func:`temporalio.workflow.stream_reader`, + :func:`temporalio.workflow.stream_writer`, and to a handle's ``read``, + ``latest`` and ``producer``, and the record and value types follow from + it; ``result_type=`` is not passed alongside a definition. + """ + + name: str + result_type: type[T] | None = None + """The type records decode to, or ``None`` for the converter's default.""" + + +@overload +def topic(name: str, result_type: type[T]) -> StreamTopic[T]: ... + + +@overload +def topic(name: str, result_type: None = None) -> StreamTopic[Any]: ... + + +def topic(name: str, result_type: type | None = None) -> StreamTopic[Any]: + """Define a topic of a workflow's stream. + + Define it once, at module level, and share it: the workflow reads or + publishes it, an activity or a backend produces onto it or reads it, and + the type it carries is inferred wherever it is used. Use a plain string + instead only when the name is decided at runtime. + + Args: + name: The topic's name, as it appears on every record. + result_type: The type records on this topic decode to. Without one, + the payload converter's default applies. + + Raises: + ValueError: ``name`` is empty. + """ + if not name: + raise ValueError("topic name must not be empty") + return StreamTopic(name, result_type) + + +def resolve_topic( + topic: str | StreamTopic[Any], result_type: type | None = None +) -> tuple[str, type | None]: + """The name and decode hint a call means, from either form of topic. + + Providers call this once at the top of ``read``, ``latest`` and + ``producer``, so a definition and a string are the same to the store. + + Raises: + ValueError: A definition was given together with ``result_type``, + which would name two types for one topic, or the name is empty. + """ + if isinstance(topic, StreamTopic): + if result_type is not None: + raise ValueError( + f"topic {topic.name!r} already carries its type; do not pass " + "result_type= with a definition" + ) + name, result_type = topic.name, topic.result_type + else: + name = topic + if not name: + raise ValueError("topic must not be empty") + return name, result_type diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py new file mode 100644 index 000000000..52299f44e --- /dev/null +++ b/temporalio/streams/_wire.py @@ -0,0 +1,181 @@ +"""How a record crosses a provider: the proto is the record. + +``temporal.api.stream.v1.StreamRecord`` is the wire format on every provider. +A store that keeps bytes keeps ``SerializeToString()`` of it, the native +server stores the proto it is handed, and a reader in any language parses the +same bytes. ``body`` is the user's payload, produced and consumed through the +payload converter, so a codec applies to it like any other payload and a +pre-encoded :class:`temporalio.common.RawValue` passes through untouched. + +Cursors are self-describing: a token starts with the name of the provider that +minted it, so a provider can refuse a foreign one at the call rather than +misreading it deep in a generator. +""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any + +import temporalio.converter +from temporalio.api.stream.v1 import StreamRecord as WireRecord +from temporalio.api.stream.v1 import StreamRecordKind +from temporalio.streams._errors import StreamCursorError +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +__all__ = [ + "RecordDecoder", + "WireRecord", + "cursor_position", + "from_wire", + "mint_cursor", + "producer_identity", + "to_wire", +] + + +def to_wire( + converter: temporalio.converter.PayloadConverter, + *, + topic: str, + kind: RecordKind, + value: Any = None, + producer_id: str = "", + attempt: int = 0, + sequence: int = -1, +) -> WireRecord: + """Build the record a provider stores or ships. + + Only a ``DATA`` record carries a body; the converter encodes ``value`` + into it, which is where a pre-encoded ``RawValue`` passes through. + """ + record = WireRecord( + topic=topic, + kind=StreamRecordKind.ValueType(int(kind)), + producer_id=producer_id, + attempt=attempt, + sequence=sequence, + ) + if kind is RecordKind.DATA: + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record + + +def from_wire( + converter: temporalio.converter.PayloadConverter, + cursor: Cursor, + wire: WireRecord, + result_type: type | None, +) -> StreamRecord[Any]: + """Turn a stored record into the record a reader yields. + + Raises: + ValueError: The kind is one no store may hold, such as a synthesized + ``SUPERSEDED`` or a value this SDK does not know. + """ + kind = RecordKind(wire.kind) + if kind is RecordKind.SUPERSEDED: + raise ValueError("a SUPERSEDED record is synthesized by readers, never stored") + if kind is RecordKind.UNSPECIFIED: + # The proto defines an unset kind as DATA, so every reader agrees. + kind = RecordKind.DATA + value: Any = None + if kind is RecordKind.DATA and wire.HasField("body"): + hints = [result_type] if result_type is not None else None + value = converter.from_payloads([wire.body], hints)[0] + return StreamRecord( + kind=kind, + cursor=cursor, + topic=wire.topic, + producer_id=wire.producer_id, + attempt=wire.attempt, + sequence=wire.sequence, + value=value, + ) + + +class RecordDecoder: + """Turns the records a provider hands over into the records a reader yields. + + One per read. It synthesizes supersession from the attempts it observes, + positions each synthesized record at the cursor before the record that + triggered it, and skips a record it cannot decode with a warning rather + than raising, so a poisoned record cannot pin a workflow on every retry + while an outside reader of the same stream moves past it. + """ + + def __init__( + self, + converter: temporalio.converter.PayloadConverter, + result_type: type | None, + *, + after: Cursor, + warn: Callable[[str], None], + ) -> None: + """Decode with ``converter`` into ``result_type``, resuming after ``after``.""" + self._converter = converter + self._result_type = result_type + self._previous = after + self._warn = warn + self._attempts = AttemptTracker() + + def decode(self, cursor: Cursor, wire: WireRecord) -> list[StreamRecord[Any]]: + """The records to yield for one stored record, in order.""" + try: + record = from_wire(self._converter, cursor, wire, self._result_type) + except Exception as error: + self._warn(f"skipping stream record at {cursor}: {error}") + # The skipped record still holds its position, so a resume after + # it moves on rather than tripping over it again. + self._previous = cursor + return [] + out: list[StreamRecord[Any]] = [] + superseded = self._attempts.note( + wire.producer_id, wire.attempt, topic=wire.topic, previous=self._previous + ) + if superseded is not None: + out.append(superseded) + out.append(record) + self._previous = cursor + return out + + +def mint_cursor(provider: str, position: str) -> Cursor: + """A cursor that names ``position`` and the provider that understands it.""" + return Cursor(f"{provider}:{position}") + + +def cursor_position(cursor: Cursor, *, provider: str) -> str | None: + """The position inside a cursor ``provider`` minted, or ``None`` for BEGINNING. + + Raises: + StreamCursorError: The cursor came from another provider. + """ + if cursor == BEGINNING: + return None + prefix = f"{provider}:" + if not cursor.token.startswith(prefix): + raise StreamCursorError( + f"cursor {cursor.token!r} was not minted by the {provider} stream provider" + ) + return cursor.token[len(prefix) :] + + +def producer_identity(producer_id: str, attempt: int) -> tuple[str, int]: + """Resolve who a producer is, defaulting to the running activity. + + Imported lazily so the module workflow code imports carries no activity + machinery; the default only means anything inside an activity anyway. + """ + if producer_id: + return producer_id, attempt + import temporalio.activity + + if not temporalio.activity.in_activity(): + raise ValueError( + "producer_id is required outside an activity; inside one it defaults " + "to the activity's id and attempt" + ) + info = temporalio.activity.info() + return info.activity_id, attempt or info.attempt From 71dd54714b4e4b273079a715b320337d9ae60862 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:58:58 -0700 Subject: [PATCH 559/831] Aligned the external stream input and output replay schedules. An empty activation still ran one drain, so the marker has to record it or replay fires wait_condition predicates a different number of times. The marker also goes in with the first set that drains, rather than after the signal and update jobs have already published. --- CHANGELOG.md | 15 +++++ .../external_workflow_streams/_runtime.py | 28 ++++++-- temporalio/worker/_workflow_instance.py | 33 +++++++++- .../test_output_runtime.py | 65 +++++++++++++++++++ 4 files changed, 133 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed9ded4a5..6f1441833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,21 @@ to include examples, links to docs, or any other relevant information. ## [Unreleased] +### Fixed + +- Preserve empty activations in the shared External Workflow Streams input and + output replay schedule. Workflows that read input, publish decisions, and + schedule Activities now reproduce that schedule during replay. Inconsistent + prerelease markers are rejected explicitly rather than guessing where omitted + activations belonged. +- Resume external input waits when cold replay encounters a wake in an already + loaded History page, including Workers with workflow caching disabled. +- Avoid an unnecessary output replacement Workflow Task after stream input has + resumed the Workflow and it is waiting on an Activity or timer. +- Keep an incomplete retained external stream task alive when workflow caching + is disabled; evict it after its normal task boundary instead of repeatedly + interrupting input readiness with shutdown markers. + ### Added - Added experimental External Workflow Streams in diff --git a/temporalio/contrib/external_workflow_streams/_runtime.py b/temporalio/contrib/external_workflow_streams/_runtime.py index d3e091445..09b38bab0 100644 --- a/temporalio/contrib/external_workflow_streams/_runtime.py +++ b/temporalio/contrib/external_workflow_streams/_runtime.py @@ -327,8 +327,10 @@ def __init__( #: refused for: a fresh annotation is the most room there will ever be, so #: refusing there rolls over to an annotation that refuses identically. self._segments_in_annotation = 0 - #: Set when a subscription is registered or a record delivered, so an - #: activation that changed nothing at all emits nothing. + #: A late first subscription must preserve the earlier empty drains in + #: the same task, without making unrelated workflows write markers. + self._unobserved_segments = 0 + self._segment_pending = True self._observed_this_activation = False #: `wait_id -> Future`, awaited by Workflow code and resolved by the #: readiness activation. It lives here rather than on either side alone @@ -428,12 +430,14 @@ def begin_activation(self, history_floor_event_id: int | None = None) -> None: ) if self._output_history_floor_event_id != history_floor_event_id: self._output_segments = [] + self._unobserved_segments = 0 self._output_history_floor_event_id = history_floor_event_id for waiter in self._output_capacity_waiters: if not waiter.done(): waiter.set_result(None) self._output_capacity_waiters = [] self._output_segments.append({}) + self._segment_pending = True def delivery_budget_remaining(self) -> int: """How many more records this activation may hand to Workflow code. @@ -1638,11 +1642,21 @@ def close_segment(self, reason: SegmentEndReason | None = None) -> None: nothing still ran one event-loop drain, and replay must reproduce that drain or ``wait_condition`` predicates fire a different number of times. """ - if not self._observed_this_activation: + if not self._observed_this_activation and not self._segment_pending: + return + self._segment_pending = False + if not self._observed_this_activation and not self._subscriptions: + self._unobserved_segments += 1 return if reason is None: reason = self._segment_end_reason() accumulator = self._ensure_accumulator() + for _ in range(self._unobserved_segments): + self._pending_deltas.append( + accumulator.add_segment(Segment((), SegmentEndReason.NO_DATA_AVAILABLE)) + ) + self._segments_in_annotation += 1 + self._unobserved_segments = 0 self._pending_deltas.append( accumulator.add_segment(Segment(tuple(self._runs), reason)) ) @@ -1686,10 +1700,9 @@ def _segment_end_reason(self) -> SegmentEndReason: def take_observation_delta(self) -> bytes | None: """The bytes to put on this completion's `WorkflowStreamProgress`. - ``None`` means nothing replay-visible changed, which is the only case - where a completion legitimately carries no progress command -- and a - replay delivery is exactly that case, since everything it delivered is - already recorded in the marker being replayed. + Once an input subscription exists, even an empty activation belongs to + the shared input/output replay schedule. Workflows that never subscribe + still emit nothing, and replay does not rewrite its existing marker. """ if self._replay_ready is not None: return None @@ -1786,6 +1799,7 @@ def start_new_annotation(self) -> None: self._run_sizes = [] self._max_run_bytes = 0 self._segments_in_annotation = 0 + self._unobserved_segments = 0 self._observed_this_activation = False self._annotation_start = { wait_id: state.delivery_cursor diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index c3db3f3ce..88e7a891b 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -528,11 +528,21 @@ def activate( job_sets: list[ list[temporalio.bridge.proto.workflow_activation.WorkflowActivationJob] ] = [[], [], [], []] + # An external stream replay marker is what this Workflow Task recorded, + # so it has to be installed before any of the task's code runs and + # publishes, or the install wipes those publishes and the manifest + # check fails them. It is applied right before the first drain of the + # activation, after every job that drain will act on. + replay_jobs: list[ + temporalio.bridge.proto.workflow_activation.WorkflowActivationJob + ] = [] for job in act.jobs: if job.HasField("notify_has_patch"): job_sets[0].append(job) elif job.HasField("signal_workflow") or job.HasField("do_update"): job_sets[1].append(job) + elif job.HasField("replay_external_streams"): + replay_jobs.append(job) elif not job.HasField("query_workflow"): if job.HasField("initialize_workflow"): start_job = job.initialize_workflow @@ -558,24 +568,35 @@ def activate( for job in job_set: # Let errors bubble out of these to the caller to fail the task self._apply(job) - if any(job_sets): + for job in replay_jobs: + self._apply(job) + if any(job_sets) or replay_jobs: self._run_once( check_conditions=bool(job_sets[1] or job_sets[2]) ) else: # Preserve the legacy scheduling order for histories which do # not contain the single-batch workflow logic flag. + replay_pending = bool(replay_jobs) for index, job_set in enumerate(job_sets): if not job_set: continue for job in job_set: # Let errors bubble out of these to the caller to fail the task self._apply(job) + if replay_pending and index >= 1: + for job in replay_jobs: + self._apply(job) + replay_pending = False # Run one iteration of the loop. We do not allow conditions to # be checked in patch jobs (first index) or query jobs (last # index). self._run_once(check_conditions=index == 1 or index == 2) + if replay_pending: + for job in replay_jobs: + self._apply(job) + self._run_once(check_conditions=True) except BaseException: # An error is already on its way out, so the replay is *abandoned* # rather than closed. Closing runs `verify_replay_consumed`, which @@ -936,6 +957,16 @@ def _apply_replay_external_streams( runtime.begin_output_replay(output) self._pending_output_replay_finish = True plan = runtime.take_replay_plan() + if ( + has_output + and plan is not None + and len(plan.segments) != len(output_segments) + ): + raise temporalio.workflow.NondeterminismError( + "External stream History has incompatible input and output " + "activation schedules. This prerelease marker omitted empty " + "input activations, whose positions cannot be recovered safely." + ) if plan is None: if has_output: # An output-only marker deliberately has no input ReplayPlan. diff --git a/tests/contrib/external_workflow_streams/test_output_runtime.py b/tests/contrib/external_workflow_streams/test_output_runtime.py index 1c58854a7..049f78a2a 100644 --- a/tests/contrib/external_workflow_streams/test_output_runtime.py +++ b/tests/contrib/external_workflow_streams/test_output_runtime.py @@ -16,6 +16,7 @@ import temporalio.bridge.proto.workflow_completion import temporalio.converter import temporalio.workflow +from temporalio.contrib.external_workflow_streams._annotation import decode_annotation from temporalio.contrib.external_workflow_streams._backend import StreamKey from temporalio.contrib.external_workflow_streams._errors import ( ExternalStreamCapacityError, @@ -1064,3 +1065,67 @@ def test_input_and_output_share_one_replay_segment_drain_schedule() -> None: "abandon-output", "end-input", ] + + +def test_ambiguous_legacy_combined_schedule_is_rejected_before_drain() -> None: + runtime = _CombinedReplayRuntime() + driver = _CombinedReplayDriver(runtime) + output = SimpleNamespace(segments=(object(), object(), object(), object())) + job = SimpleNamespace(output=output, HasField=lambda field: field == "output") + + apply_replay = cast(Any, _WorkflowInstanceImpl._apply_replay_external_streams) + with pytest.raises( + temporalio.workflow.NondeterminismError, match="incompatible input and output" + ): + apply_replay(driver, job) + + assert runtime.events == ["begin-output"] + + +@pytest.mark.parametrize("subscription_exists", [False, True]) +async def test_combined_marker_preserves_empty_input_activations( + runtime: WorkflowStreamRuntime, subscription_exists: bool +) -> None: + key = runtime.stream_key("inputs") + if subscription_exists: + runtime.begin_activation(1) + runtime.register(wait_id=1, stream_key=key) + runtime.take_observation_delta() + runtime.add_terminal() + + deltas = [] + try: + for index in range(4): + runtime.begin_activation(7) + if index == 1 and not subscription_exists: + runtime.register(wait_id=1, stream_key=key) + if index in (1, 3): + record = StreamRecord( + RecordKind.DATA, b"input", "producer", index + ).placed_at(Offset(f"{index}-0")) + runtime.record_delivery(1, record) + await runtime.publish_output( + topic="events", + value=str(index), + value_type=str, + kind=RecordKind.DATA, + max_publish_latency=timedelta(seconds=1), + max_records=10, + max_logical_bytes=10_000, + ) + delta = runtime.take_observation_delta() + if delta is not None: + deltas.append(delta) + deltas.append(runtime.add_terminal()) + staged = await runtime.stage_output(7) + annotation = decode_annotation(b"".join(deltas)) + + assert [bool(segment.runs) for segment in annotation.segments] == [ + False, + True, + False, + True, + ] + assert staged.segment_record_counts == ((0,), (1,), (0,), (1,)) + finally: + await runtime._manager.shutdown() From e7e593a6df018a3fa3b15cf24a249f8b73d415bd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:58:58 -0700 Subject: [PATCH 560/831] Gave the external stream tests the shapes the real path has. A record only reaches a reader after a provider placed it, and the subscription manager captures the loop it is built on, so the fakes have to do both. The suite also runs against a dev server rather than the time-skipping one, where which cases fail drifts between runs. --- .../external_workflow_streams/conftest.py | 19 +++++++++++++++++ .../external_workflow_streams/test_api.py | 21 ++++++++++++++++++- .../test_output_runtime.py | 4 +++- .../test_worker_handoff.py | 10 ++++++--- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/tests/contrib/external_workflow_streams/conftest.py b/tests/contrib/external_workflow_streams/conftest.py index d6e8483c0..dd1128b9f 100644 --- a/tests/contrib/external_workflow_streams/conftest.py +++ b/tests/contrib/external_workflow_streams/conftest.py @@ -16,6 +16,25 @@ import pytest import pytest_asyncio +from temporalio.testing import WorkflowEnvironment + + +@pytest.fixture(autouse=True) +def skip_under_time_skipping(env: WorkflowEnvironment) -> None: + """Hold this suite to a server whose clock the tests can reason about. + + These cases measure real-server timing: how long a Workflow Task was held + open, the interval a wake sweep runs on, the deadline a shutdown waits out. + The time-skipping server advances the clock whenever workers go idle, which + removes exactly the quantities being measured, so the failures it produces + say nothing about the feature. Which cases fail drifts run to run, between + fourteen and seventeen of them, which is why the whole suite is held rather + than a list of names. The ordinary dev-server step still runs all of it. + """ + if env.supports_time_skipping: + pytest.skip("this suite measures real-server timing; see conftest") + + DEFAULT_REDIS_URL = "redis://127.0.0.1:6379" #: Every key this suite creates starts with this, so a leaked key is diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 08d725761..236d0b614 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -30,6 +30,7 @@ ) from temporalio.contrib.external_workflow_streams._manager import PreparedRecord from temporalio.contrib.external_workflow_streams._record import ( + Offset, RecordKind, StreamRecord, ) @@ -58,6 +59,9 @@ def __init__(self) -> None: #: Overrides what `codec_for` hands back, so a test can control when -- #: and whether -- decoding a record succeeds. self.codec: Any = None + #: Offsets handed out by `drain`, so buffered records come back in the + #: read-path shape whatever a test put in. + self._placed = 0 def stream_key(self, stream_name: str) -> StreamKey: return StreamKey("ns", "wf", "first-run", stream_name) @@ -81,7 +85,22 @@ def drain(self, wait_id: int, max_records: int | None = None) -> list[StreamReco ) else: self.buffers[wait_id] = [] - return buffered + # A provider places a record when it appends it, so nothing without an + # offset ever reaches a reader. Place what a test left bare rather than + # let the fake deliver a shape the real path cannot produce. + placed = [] + for record in buffered: + if record.offset is not None: + placed.append(record) + continue + self._placed += 1 + at = record.placed_at(Offset(f"{self._placed:020d}")) + if isinstance(record, PreparedRecord): + at = PreparedRecord.of( + at, record.prepared_payload, record.prepare_error + ) + placed.append(at) + return placed def delivery_budget_remaining(self) -> int: return self.budget diff --git a/tests/contrib/external_workflow_streams/test_output_runtime.py b/tests/contrib/external_workflow_streams/test_output_runtime.py index 049f78a2a..56d0993d2 100644 --- a/tests/contrib/external_workflow_streams/test_output_runtime.py +++ b/tests/contrib/external_workflow_streams/test_output_runtime.py @@ -168,7 +168,9 @@ def backend() -> _OutputMemoryBackend: @pytest.fixture -def runtime(backend: _OutputMemoryBackend) -> WorkflowStreamRuntime: +async def runtime(backend: _OutputMemoryBackend) -> WorkflowStreamRuntime: + # The manager captures the loop it is built on, which in the Worker is the + # Worker's own. A sync fixture has none to capture. manager = StreamSubscriptionManager( backend=backend, notify_ready=_notify, diff --git a/tests/contrib/external_workflow_streams/test_worker_handoff.py b/tests/contrib/external_workflow_streams/test_worker_handoff.py index 3e52796c0..cf6b212a0 100644 --- a/tests/contrib/external_workflow_streams/test_worker_handoff.py +++ b/tests/contrib/external_workflow_streams/test_worker_handoff.py @@ -704,9 +704,6 @@ async def test_a_finalization_that_cannot_be_answered_writes_no_marker( "no marker committed the first record, so there is no previous " "marker for the retry to replay from", ) - before = markers(await history(handle)) - committed_before = committed_boundary(before[-1], wait_id=1) - marker_before = marker_bytes(before[-1]) # Fed from here, and each record is *followed* to the Workflow rather # than merely published on a schedule. The precondition this case needs @@ -761,6 +758,13 @@ async def test_a_finalization_that_cannot_be_answered_writes_no_marker( "since the last delivery is expected to fit inside" ) + # Read here rather than at the first marker: every Workflow Task that + # closes between the two commits its own marker, and the claim this + # case makes is about the one task that is open right now. + before = markers(await history(handle)) + committed_before = committed_boundary(before[-1], wait_id=1) + marker_before = marker_bytes(before[-1]) + # The Run's entry disappears underneath the finalization, exactly once. original = workflow_worker_impl._handle_external_stream_jobs sabotaged: list[str] = [] From 781f8b1c759579b10ffe957c6e172bf3fbbacfeb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:58:58 -0700 Subject: [PATCH 561/831] Made the external stream docstrings build under pydoctor. pydoctor resolves single-backtick prose as symbol references, so shell words, tuples and file names were read as missing targets. Two tables also lost their column alignment because pydoctor rewrites role references before parsing. --- .../external_workflow_streams/_annotation.py | 2 +- .../contrib/external_workflow_streams/_api.py | 6 +-- .../external_workflow_streams/_errors.py | 32 ++++++------ .../external_workflow_streams/_manager.py | 50 +++++++++---------- .../_output_backend.py | 2 +- .../external_workflow_streams/_producer.py | 12 ++--- .../external_workflow_streams/_redis.py | 26 +++++----- .../external_workflow_streams/_runtime.py | 10 ++-- temporalio/worker/_workflow.py | 4 +- 9 files changed, 73 insertions(+), 71 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_annotation.py b/temporalio/contrib/external_workflow_streams/_annotation.py index d5c55bb53..a55cfb0f8 100644 --- a/temporalio/contrib/external_workflow_streams/_annotation.py +++ b/temporalio/contrib/external_workflow_streams/_annotation.py @@ -154,7 +154,7 @@ class AnnotationBudgetExceeded(temporalio.exceptions.ApplicationError): terminal could not fit an empty annotation, at the point the Workflow makes it. - An :py:class:`~temporalio.exceptions.ApplicationError` marked + An :py:class:`temporalio.exceptions.ApplicationError` marked non-retryable, and that is the substance of this class rather than a detail. A plain exception here fails the *Workflow Task*, and the server retries Workflow Task failures forever: the encoding that overflowed overflows again diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index 2ae02d391..c89986954 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -72,7 +72,7 @@ """ #: Where per-Run subscription state hangs off the Workflow instance. Reserved, -#: and deliberately not in the `__temporal_workflow_stream*` namespace the +#: and deliberately not in the ``__temporal_workflow_stream*`` namespace the #: shipped contrib feature already owns. _RUN_STATE_ATTR = "__temporal_external_stream_state" @@ -182,7 +182,7 @@ class _RunState: runtime: ExternalStreamRuntime | None = None next_wait_id: int = 1 - #: `wait_id -> Future`, resolved by the readiness activation handler. + #: ``wait_id -> Future``, resolved by the readiness activation handler. pending: dict[int, Any] = field(default_factory=dict) @@ -538,7 +538,7 @@ class ExternalStreamSubscription(Generic[AnyType]): **One consumer.** The cursor, the readiness future, and the blocked flag are all the subscription's rather than an iterator's, so two coroutines waiting on it at once is refused with - :class:`~temporalio.contrib.external_workflow_streams._errors.ConcurrentStreamConsumerError` + :class:`temporalio.contrib.external_workflow_streams.ConcurrentStreamConsumerError` rather than served -- see :meth:`_refuse_a_second_waiter` for what sharing them would do. Two consumers of the same *stream* is a supported shape and the way to ask for it is a second ``subscribe()``: delivery is a broadcast diff --git a/temporalio/contrib/external_workflow_streams/_errors.py b/temporalio/contrib/external_workflow_streams/_errors.py index c9450d235..6025ca3f7 100644 --- a/temporalio/contrib/external_workflow_streams/_errors.py +++ b/temporalio/contrib/external_workflow_streams/_errors.py @@ -11,20 +11,22 @@ key on the metrics here rather than on Workflow Task failure counts, which a transient backend outage also increments. -============================ ========================== ==================== -Condition Error type Operator response -============================ ========================== ==================== -Backend unreachable/erroring :class:`StreamStorageError` None -- clears when - the backend recovers -Recorded offset missing, :class:`StreamIntegrityError` Repair or restore -expired, reordered, or the backend, or -miscounted terminate the Run -Bytes intact but undecodable :class:`StreamDecodeError` Align the consumer's - converter with the - producer's -Annotation does not match ordinary nondeterminism Fix or version the -the subscriptions made Workflow code -============================ ========================== ==================== +:: + + ============================ ========================== ==================== + Condition Error type Operator response + ============================ ========================== ==================== + Backend unreachable/erroring ``StreamStorageError`` None -- clears when + the backend recovers + Recorded offset missing, ``StreamIntegrityError`` Repair or restore + expired, reordered, or the backend, or + miscounted terminate the Run + Bytes intact but undecodable ``StreamDecodeError`` Align the consumer's + converter with the + producer's + Annotation does not match ordinary nondeterminism Fix or version the + the subscriptions made Workflow code + ============================ ========================== ==================== There is deliberately **no** ``workflow_failure_exception_types`` registration here: integrity loss *blocks* a Workflow rather than terminating it (ADR-014). @@ -83,7 +85,7 @@ class StreamIntegrityError(StreamError): class StreamDecodeError(StreamError): """A record was present and intact but could not be decoded. - Separated from :class:`StreamIntegrityError` because it is a configuration + Separated from ``StreamIntegrityError`` because it is a configuration error on the *consumer* -- a DataConverter or codec that does not match the producer's -- and reporting it as integrity loss sends an operator to restore a backend that was never damaged (ADR-015). diff --git a/temporalio/contrib/external_workflow_streams/_manager.py b/temporalio/contrib/external_workflow_streams/_manager.py index 86b521e8d..2323b42e1 100644 --- a/temporalio/contrib/external_workflow_streams/_manager.py +++ b/temporalio/contrib/external_workflow_streams/_manager.py @@ -28,13 +28,13 @@ Three cursors, and conflating them is how a speculative read becomes a durable claim: -=================== =================== =========== ================== -Cursor Advances on Owner Survives eviction -=================== =================== =========== ================== -``committed`` marker commit only the marker yes -``delivery`` hand-off to workflow the instance no -``prefetch`` buffering the manager no -=================== =================== =========== ================== +============= ==================== ============ ================= +Cursor Advances on Owner Survives eviction +============= ==================== ============ ================= +``committed`` marker commit only the marker yes +``delivery`` hand-off to workflow the instance no +``prefetch`` buffering the manager no +============= ==================== ============ ================= ``prefetch`` is speculative: reading a record is not consuming it, and consuming it is not committing it. The manager may only move it *backwards* to @@ -227,7 +227,7 @@ class RunStatus: out is only the first thing the activation then has to do. Holds an activation takes *itself* are deliberately not bounded. Those are the -same backend exposure the park handshake already has -- `install_park_intent` +same backend exposure the park handshake already has -- ``install_park_intent`` can hang exactly as a removal can -- so a bound there would move the wait rather than remove it. @@ -316,7 +316,7 @@ class Subscription: _has_room: asyncio.Event = field(default_factory=asyncio.Event, repr=False) _watcher: asyncio.Task[None] | None = field(default=None, repr=False) _cancelled: bool = field(default=False, repr=False) - #: Bumped whenever every speculative read is discarded. A `read_after` + #: Bumped whenever every speculative read is discarded. A ``read_after`` #: already in flight started from the cursor being discarded, so its records #: are speculative too; the watcher compares this across the await and drops #: them rather than appending them on top of the reset -- which would put the @@ -747,7 +747,7 @@ def __init__( self._pending_wake_runs: dict[str, _PendingWake] = {} self._activation_sequences: dict[str, int] = {} #: Wakes the shutdown sweep could not get acknowledged. Reported through - #: `external_stream_shutdown_wake_failed`; kept here so a test can tell + #: ``external_stream_shutdown_wake_failed``; kept here so a test can tell #: "no wake was needed" from "a wake was needed and lost". self.shutdown_wake_failures = 0 self._buffer_size = buffer_size @@ -780,7 +780,7 @@ def __init__( #: Strong references to the in-flight registration-time reconciliations. self._reconciliations: set[asyncio.Task[None]] = set() #: Removals this manager decided on and did not get confirmed, per Run - #: and then per `(stream key, wait_id)`. The durable half of the intent + #: and then per ``(stream key, wait_id)``. The durable half of the intent #: invariant: a removal that failed is a claim about the *backend*, and #: recording it anywhere that a close or an eviction takes away is the #: same as not recording it at all. Drained under `_park_lock`. @@ -858,7 +858,7 @@ def _cancel_watcher(self, subscription: Subscription) -> None: def _start_watcher(self, subscription: Subscription) -> None: """Starts a watcher, and reconciles the park state it inherited. - Both on the manager's own loop, because both are `create_task` calls and + Both on the manager's own loop, because both are ``create_task`` calls and `register` runs on the Workflow executor thread. """ if subscription._cancelled or subscription._watcher is not None: @@ -886,10 +886,10 @@ async def _reconcile_inherited_park(self, subscription: Subscription) -> None: Registration is where a Worker learns such an intent exists, and it is also the moment its status is unambiguous. A subscription is registered by user Workflow code running, and no user code runs inside a park - (`wft-lifecycle.md`), so an intent found here belongs to a park that is + (``wft-lifecycle.md``), so an intent found here belongs to a park that is over: the Core that confirmed it has either moved on or gone with the Worker that held it. What leaving it costs is the invariant's whole - point -- `current_park_generation` keeps answering a generation Core has + point -- ``current_park_generation`` keeps answering a generation Core has discarded, every producer wake names that generation and Core discards it as stale, and because a parked wake's request ID ignores sender identity the second such wake is byte-identical to the first and the @@ -1379,7 +1379,7 @@ def _reannounce_after_cleanup( A stale intent does not only leak. While it was installed every wake for this stream named the generation behind it -- the producer reads - `current_park_generation`, and so does the Worker's own sender -- and + ``current_park_generation``, and so does the Worker's own sender -- and Core discards a non-zero generation that is not the park it is holding. A record that arrived in that window was therefore announced to nobody, and *removing the intent does not announce it*: `_report_ready` counted @@ -1390,12 +1390,12 @@ def _reannounce_after_cleanup( create a Workflow Task. Both outcomes that clear the key announce, and that is why the provider - contract does not answer with a Boolean. `ABSENT` is not "someone else's + contract does not answer with a Boolean. ``ABSENT`` is not "someone else's intent is in the way", it is "the intent this entry named is gone" -- which is what a retry sees after the reply to a delete that in fact succeeded was lost, and what one cleanup owner sees after another finished the job. Reading that as a mismatch would leave the record the - intent silenced silent for good. `MISMATCH` announces nothing: an intent + intent silenced silent for good. ``MISMATCH`` announces nothing: an intent is still installed there, the suppression it causes has not ended, and it belongs to a park this entry knows nothing about. @@ -1428,7 +1428,7 @@ def _park_lock(self, run_id: str) -> asyncio.Lock: """Serializes one Run's park-intent work on the manager's loop. The install/recheck handshake, the resolve, and the reconciliation above - all read-then-write the same `(stream key, wait_id)` objects, and the + all read-then-write the same ``(stream key, wait_id)`` objects, and the reconciliation is scheduled from another thread, so their interleaving is not otherwise constrained. Without this, a reconciliation that overlapped a confirming park could remove the intent that park had just @@ -1493,7 +1493,7 @@ def rearm_ready(self, run_id: str) -> None: Workflow Task whose data had already arrived. Called from the Workflow thread at activation completion, so the work is - hopped onto the manager's loop: `create_task` is not thread-safe, and a + hopped onto the manager's loop: ``create_task`` is not thread-safe, and a task created from the Workflow executor thread is silently never scheduled -- indistinguishable from a stream that never delivers. """ @@ -1803,7 +1803,7 @@ async def _report_ready(self, subscription: Subscription) -> None: leave this method. The watcher calls it in its loop, so an exception escaping ends that watcher for good -- the subscription stays registered, its buffer keeps its records, and nothing ever announces them again. - `_rearm_ready` also launches it with `create_task`, where an exception + `_rearm_ready` also launches it with ``create_task``, where an exception becomes a task result nobody retrieves and the failure is not even logged. """ @@ -1917,7 +1917,7 @@ async def _retry_stale(self, subscription: Subscription) -> str: Returns the result the retries ended on, so the caller can act on it. A Boolean would answer only "was it announced", and the four non-``Accepted`` answers are not interchangeable: they differ in what - happens to the watcher, and `RunNotFound` in particular requires the + happens to the watcher, and ``RunNotFound`` in particular requires the watcher to be torn down. Discarding them left that teardown unreachable from here. @@ -1927,7 +1927,7 @@ async def _retry_stale(self, subscription: Subscription) -> str: Workflow consuming happily, and a wake owed at the end of that costs one empty Workflow Task rather than a silent stall. - `RunNotFound` ends the retries rather than using them up. It is the one + ``RunNotFound`` ends the retries rather than using them up. It is the one answer that cannot change back: the Run is gone from this Worker, so a further report can only be answered the same way, and each attempt costs a delay before the wake this record still needs. @@ -1967,7 +1967,7 @@ async def prepare_park( is waiting on and aborts a legitimate park, which then runs again on the next idle timeout and aborts again; and an intent installed for a wait outside the set is an intent with no park behind it, which is exactly - what `backend-contract.md` forbids leaving in a backend. + what ``backend-contract.md`` forbids leaving in a backend. The order is what closes the append/park race: a producer appends its record *before* it observes the park generation, so an append is either @@ -2328,7 +2328,7 @@ async def cancel(self, run_id: str, wait_id: int) -> None: behind for good. And it is not confined to the closed wait. A stale intent keeps - `parked_wait_ids` non-empty, which suppresses the unparked-wake fallback + ``parked_wait_ids`` non-empty, which suppresses the unparked-wake fallback for the **whole stream**: with no live wait parked, the producer sends only the dead generation, Core discards it as stale, and dedup silences every later publish -- so live waits across the Continue-As-New chain @@ -2684,7 +2684,7 @@ async def _sweep_wake(self, subscription: Subscription) -> None: Counting the failure is deliberately **not** done here for the cancellation case. The grace period expiring cancels this coroutine wherever it is, `_send_owed_wake` re-raises `CancelledError` by design, - and no `except` here could both record the failure and leave the + and no ``except`` here could both record the failure and leave the cancellation intact for the subscriptions after this one -- which are not reached either. The subscription stays in the unaccounted set instead and :meth:`_account_unswept` counts it, which covers being cancelled and diff --git a/temporalio/contrib/external_workflow_streams/_output_backend.py b/temporalio/contrib/external_workflow_streams/_output_backend.py index ec4b1f58e..bcdb154d3 100644 --- a/temporalio/contrib/external_workflow_streams/_output_backend.py +++ b/temporalio/contrib/external_workflow_streams/_output_backend.py @@ -286,7 +286,7 @@ async def append_output( input record's ``(session_id, sequence)`` and byte identity exactly as :meth:`StreamBackend.append`: an identical retry returns the original output record and offset; different bytes under the same key raise - :class:`~temporalio.contrib.external_workflow_streams._backend.AppendConflictError`. + :class:`temporalio.contrib.external_workflow_streams.AppendConflictError`. It may not pass an already-positioned pending stage in client reads. """ diff --git a/temporalio/contrib/external_workflow_streams/_producer.py b/temporalio/contrib/external_workflow_streams/_producer.py index 49ce2876f..18fb0c29b 100644 --- a/temporalio/contrib/external_workflow_streams/_producer.py +++ b/temporalio/contrib/external_workflow_streams/_producer.py @@ -118,17 +118,17 @@ def __init__( whatever ended the attempt (ADR-036). """ self.restart = restart - """Whether the caller must call :meth:`.wake` again instead of retrying. + """Whether the caller must call ``wake()`` again instead of retrying. The wake is three steps -- observe the parked set, claim the generation, Signal -- and only the third produces the requests - :meth:`ProducerTopicHandle.retry_wake` re-sends. A failure in the first + ``ProducerTopicHandle.retry_wake()`` re-sends. A failure in the first two leaves nothing to re-send, so ``pending`` is empty and retrying it would silently do nothing at all: the record would stay durable and unannounced while the caller believed it had recovered. ``True`` therefore says "no wake was composed; compose one". Calling - :meth:`ProducerTopicHandle.wake` again is safe and is the whole recovery + ``ProducerTopicHandle.wake()`` again is safe and is the whole recovery -- it re-observes the parked set, and a parked wake's request ID is derived from the generation rather than from the sender, so a wake some other producer already sent deduplicates against it. @@ -198,7 +198,7 @@ def __init__( """The stream the append was for. Where it must be settled. Carried because a record does not name its own stream and the backend's - idempotency scope does: `(session_id, sequence)` is unused on every + idempotency scope does: ``(session_id, sequence)`` is unused on every *other* stream, so the same record handed to another topic's ``resolve_append`` would append a second copy there rather than deduplicate. The recovery refuses that, and this is what a caller @@ -455,7 +455,7 @@ def __init__( #: Per stream, the appends that never reported an outcome. #: #: Kept because the operation *is* the recovery: only these exact bytes - #: under these exact `(session_id, sequence)` pairs re-append as a no-op + #: under these exact ``(session_id, sequence)`` pairs re-append as a no-op #: if the first attempt landed, and only what the interrupted call owed #: says whether settling it still has a wake to send. A list rather than #: a single slot because concurrent publishes to one stream are supported @@ -872,7 +872,7 @@ def _outstanding(self, record: StreamRecord) -> _UnresolvedAppend: The lookup **is** the safety check, and it is three checks at once. It binds the recovery to the stream, because a record does not name its own - stream and `(session_id, sequence)` is unused on every other one -- so a + stream and ``(session_id, sequence)`` is unused on every other one -- so a record settled against the wrong topic appends a second copy of the value rather than deduplicating, and leaves the real stream still blocked. It binds the recovery to the exact bytes, because idempotency is on identity diff --git a/temporalio/contrib/external_workflow_streams/_redis.py b/temporalio/contrib/external_workflow_streams/_redis.py index dd7cfceb1..c4d69b1cf 100644 --- a/temporalio/contrib/external_workflow_streams/_redis.py +++ b/temporalio/contrib/external_workflow_streams/_redis.py @@ -71,7 +71,7 @@ #: Redis' beginning-of-stream sentinel for `XREAD`. Not an offset: no record #: ever has this id, which is why `BEGINNING` is a distinct cursor form rather -#: than `AFTER(Offset("0-0"))`. +#: than ``AFTER(Offset("0-0"))``. _BEGINNING_SENTINEL: Final = "0-0" _OUTPUT_STAGE_FIELD: Final = "__tes_output_stage" @@ -99,7 +99,7 @@ def _content_hash(record: StreamRecord) -> str: #: Append-if-new-or-identical, atomically. #: -#: Split across two commands without a script, a crash between `XADD` and the +#: Split across two commands without a script, a crash between ``XADD`` and the #: idempotency write would leave a record no retry could recognise as its own, #: so the retry would append a duplicate. _APPEND_LUA: Final = """ @@ -201,7 +201,7 @@ class RedisStreamBackend(StreamBackend, OutputStreamBackend): """Redis Streams as an external workflow stream provider.""" guarantees_immutability: ClassVar[bool | None] = True - """`XADD` entries cannot be rewritten in place -- only deleted or trimmed.""" + """``XADD`` entries cannot be rewritten in place -- only deleted or trimmed.""" provider_id = "redis-streams" provider_format_version = 1 @@ -738,14 +738,14 @@ async def delete_for_test(self, key: StreamKey, offset: Offset) -> None: await self._client.xdel(self.stream_key(key), offset.serialize()) -#: What Redis' glob matcher treats as more than itself. `]` and `^` are special +#: What Redis' glob matcher treats as more than itself. ``]`` and ``^`` are special #: only inside a class, but escaping them too costs nothing and keeps the rule #: one line long. _GLOB_METACHARACTERS: Final = frozenset("*?[]\\") def _as_glob_literal(text: str) -> str: - """A literal string, made safe to embed in a `SCAN MATCH` pattern.""" + """A literal string, made safe to embed in a ``SCAN MATCH`` pattern.""" return "".join( f"\\{character}" if character in _GLOB_METACHARACTERS else character for character in text @@ -756,25 +756,25 @@ def _escaped(key: StreamKey) -> str: r"""One stream identity as a single, unambiguous key component. Percent-encoded per field, then joined -- **not** joined raw. A Workflow ID - and a stream name are user-chosen strings in which `:` is an ordinary + and a stream name are user-chosen strings in which ``:`` is an ordinary character, so joining the raw fields is not injective: ("ns", "wf", r1, f"{r2}:tokens") and ("ns", f"wf:{r1}", r2, "tokens") - both render as `ns:wf:r1:r2:tokens`. Two unrelated Workflows would then share + both render as ``ns:wf:r1:r2:tokens``. Two unrelated Workflows would then share one stream, one idempotency hash, one park intent and one claim -- delivering each other's records, and each concluding the other's claim had already taken - its wake. Same reasoning as `_wake.py`'s length-prefixed request-ID material, + its wake. Same reasoning as ``_wake.py``'s length-prefixed request-ID material, applied to a key rather than to a digest. Percent-encoding rather than length prefixes because a key is read by humans: - an ordinary identity still renders verbatim in `redis-cli`, and only a field + an ordinary identity still renders verbatim in ``redis-cli``, and only a field that actually contains a delimiter pays for it. It buys one property the - length prefix does not -- the encoded form contains no `:`, `*`, `?`, `[` or - `\`, so the derived `:idem`, `:park:` and `:claim:` suffixes stay - unambiguous and `parked_wait_ids`' pattern cannot be widened by a stream name. + length prefix does not -- the encoded form contains no ``:``, ``*``, ``?``, ``[`` or + ``\``, so the derived ``:idem``, ``:park:`` and ``:claim:`` suffixes stay + unambiguous and ``parked_wait_ids``' pattern cannot be widened by a stream name. - Not reversible in practice, and not meant to be: `key_prefix` is + Not reversible in practice, and not meant to be: ``key_prefix`` is operator-supplied and unescaped, so only the identity half round-trips. """ components: tuple[str, ...] = ( diff --git a/temporalio/contrib/external_workflow_streams/_runtime.py b/temporalio/contrib/external_workflow_streams/_runtime.py index 09b38bab0..e57b3aa91 100644 --- a/temporalio/contrib/external_workflow_streams/_runtime.py +++ b/temporalio/contrib/external_workflow_streams/_runtime.py @@ -276,7 +276,7 @@ def __init__( #: the Worker that built this runtime, so `codec_for` hands Workflow #: code a converter carrying the same context every other payload in the #: activation was converted with. Bound out there rather than in here - #: because `with_context` runs user code, and this object lives on the + #: because ``with_context`` runs user code, and this object lives on the #: far side of the sandbox boundary. self._data_converter = data_converter self._default_idle_timeout = default_idle_timeout @@ -332,7 +332,7 @@ def __init__( self._unobserved_segments = 0 self._segment_pending = True self._observed_this_activation = False - #: `wait_id -> Future`, awaited by Workflow code and resolved by the + #: ``wait_id -> Future``, awaited by Workflow code and resolved by the #: readiness activation. It lives here rather than on either side alone #: because the two halves are in different modules and a second map #: would mean the side that resolves is never the side that registered. @@ -343,7 +343,7 @@ def __init__( #: only for the length of one replay job, which is what makes a #: registration made during it checkable against what was recorded. self._replay_bindings: dict[int, StreamBinding] | None = None - #: `wait_id -> the converter a *recorded* wait's records convert with`. + #: ``wait_id -> the converter a *recorded* wait's records convert with``. #: Installed by the Worker before a replay job reaches this thread; see #: :meth:`install_replay_converters` for why it exists and why it is not #: torn down when the replay ends. @@ -411,7 +411,7 @@ def begin_activation(self, history_floor_event_id: int | None = None) -> None: drain a full batch, consume one record and block elsewhere on every activation in turn, so n subscriptions arrive at an activation holding roughly n times the cap between them and hand all of it over in one - `activate()` call. Starting the count at the carry-over makes what an + ``activate()`` call. Starting the count at the carry-over makes what an activation may hand over -- carried-over plus newly delivered -- exactly the cap, whatever the schedule. """ @@ -1312,7 +1312,7 @@ def _verify_binding( Only the **stream name** is compared, not the whole key. The other three components -- namespace, Workflow id, first execution Run id -- are the Run's identity rather than anything the code chose, and a replay harness - legitimately supplies its own: `Replayer` runs under `ReplayNamespace`, + legitimately supplies its own: `Replayer` runs under ``ReplayNamespace``, so comparing the full key would report every replayed history as nondeterministic. The key is still *recorded* whole, because replay has to read the ranges it names. diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index b22b779f3..42fb07ff8 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -249,7 +249,7 @@ def __init__( #: A sandboxed Workflow's `instance` is a proxy that exposes only the #: `WorkflowInstance` protocol, so reaching through it for the runtime #: silently found nothing -- and the jobs that must never reach - #: `activate()` quietly went to `_apply` instead. + #: `activate()` quietly went to ``_apply`` instead. self._external_stream_runtimes: dict[str, Any] = {} # Stages survive activations within the cached Run because Core may # defer the server completion behind a local activity. A marker can be @@ -1252,7 +1252,7 @@ def _replay_stream_converters( to have re-created the subscription that would otherwise carry it. Bound from the Worker's own converter rather than from the runtime's, - which is already bound to this Run: a second `with_context` over the + which is already bound to this Run: a second ``with_context`` over the first would ask a user's component converter to rebind itself, and nothing in the protocol promises that composes. From 186987b777e61086864ea65657f21f10e246076e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:59:08 -0700 Subject: [PATCH 562/831] Backported the upstream fixes for the latest dependency set. The branch predates google-genai 2.21 file downloads and the test fixes that came with the latest dependency set, and CI runs both. In addition, openai now carries its own httpx, and the Agents SDK rejects two invocations sharing one completed call id. --- CHANGELOG.md | 78 +++++++++++++++++++ pyproject.toml | 2 +- .../contrib/google_genai/_gemini_activity.py | 6 +- temporalio/contrib/google_genai/_models.py | 1 + .../google_genai/_temporal_async_client.py | 8 +- .../contrib/google_genai/_temporal_files.py | 64 +++++++++++++-- temporalio/contrib/openai_agents/testing.py | 5 +- .../google_adk_agents/test_adk_streaming.py | 7 +- tests/contrib/google_genai/test_gemini.py | 36 ++++++++- tests/contrib/openai_agents/test_openai.py | 12 ++- tests/nexus/test_temporal_system_nexus.py | 11 +-- uv.lock | 8 +- 12 files changed, 207 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f1441833..4b2f8f941 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,84 @@ to include examples, links to docs, or any other relevant information. through `ExternalOutputStreamClient`. Workflow output is staged outside History and becomes readable only after its compact Workflow Task marker is committed. +### Changed + +- Standalone Activities are now generally available (GA). (Standalone Activities as Nexus operations + and Standalone Activities operator commands remain experimental. Operator commands are `pause`, + `unpause`, `updateOptions`, `restoreOriginal`.) +- System Nexus Signal-with-Start Workflow operations now use the typed + `WorkflowOutboundInterceptor.start_signal_with_start_workflow` interception point instead of + the generic `WorkflowOutboundInterceptor.start_nexus_operation` method. +- System Nexus Signal-with-Start Workflow operations now invoke + `WorkflowOutboundInterceptor.start_system_nexus_operation` after their typed interception + point. They continue not to invoke `WorkflowOutboundInterceptor.start_nexus_operation`. +- The experimental `GetNexusOperationResultInput` now includes the Nexus endpoint, service, and + operation. + +### :boom: Breaking Changes + +- Experimental external storage: `ExternalStorage.driver_selector` is now called with a + `StorageDriverSelectContext` instead of a `StorageDriverStoreContext`. Update the annotation; + the new type carries the same `target` field. Since selectors are plain callables, a stale + annotation fails type checking rather than at runtime. +- `client.ActivityExecution` and `client.ActivityExecutionDescription` had some fields removed or renamed + to match RPC API. + - Dataclass parameters for these types were changed to `frozen=True, eq=False, kw_only=True`. + - `scheduled_time` was renamed `schedule_time`. + - `last_failure` was changed from field to method that runs data converter on demand. + - `state_transition_count`, `eager_execution_requested`, `paused` and `long_poll_token` were removed. +- ActivityHandle.describe() long-poll token was removed. The functionality can still be used manually + through raw gRPC API. + +### Fixed + +- `temporalio.contrib.google_genai` now requires `google-genai` 2.21.0 or later + and supports its file download API, including video inputs and download + destinations. +- `temporalio.contrib.deepagents` no longer dedups repeated identical tool, + model, and backend-op calls: each dispatch runs its own Activity, and the + continue-as-new result cache is retired for new executions (a continued run + resumes from the carried transcript and never re-executes prior dispatches, + so a carried cache entry could only serve stale results). Patch-gated + (`deepagents.retire-result-cache`), so histories recorded before this change + replay unchanged; note that deferring the patch keeps the full legacy dedup + cache — including the stale-result behavior this entry describes — and that + a chain upgraded mid-continue-as-new re-executes rather than reuses a + repeated identical call (the conservative direction). +- `contrib.deepagents`: summarization middleware configured with a model name string now routes its LLM calls through Activities instead of running them in the Workflow. + +- **Experimental**: External storage metrics now report the wall-clock time storage was in flight. + Previously each batch's duration was summed, over-reporting the time whenever storage operations + ran concurrently. +- System Nexus Signal-with-Start workflow operations now give custom payload + converters the target workflow's serialization context when encoding their + inner request payloads. +- Cancelling an activity from a signal while the workflow itself is cancelled + no longer causes a nondeterminism error from duplicate activity-cancellation + commands. +- `StrandsPlugin` now disables Botocore retries for its default Bedrock model so + model request retries are handled exclusively by Temporal. +- `temporalio.contrib.openai_agents` now honors the `retry-after-ms` and + `retry-after` headers when OpenAI returns `x-should-retry: true`. Previously + the delay the server asked for was discarded on that path and the activity + retried on its configured interval instead. +- Nexus-context workflow/activity starts no longer set `on_conflict_options` when there are no links + or callbacks to attach. +- The workflow sandbox now passes `pydantic_core` through by default, alongside `pydantic`. + +## [1.32.0] - 2026-08-24 + +### Added + +- Added `temporalio.converter.create_payload_validation_error` to create the + non-retryable application error used when a converted payload fails validation. +- Added experimental `temporalio.contrib.opentelemetry.ReplaySafeMeterProvider` and + `ReplaySafeLoggerProvider` (and exported `ReplaySafeTracerProvider`): wrap an + OpenTelemetry provider so metrics and log events recorded from workflow code (e.g. by + Google ADK) are not duplicated on replay. `GoogleAdkPlugin` warns when a global OTel + provider is not replay-safe. +- Added `LoggingConfig.format` to select compact, pretty, or newline-delimited JSON output for + Core logs written to the console. - Added the `Runtime(disable_environment_info=...)` option to control whether runtime, hosting, and platform information is included in worker heartbeats. diff --git a/pyproject.toml b/pyproject.toml index a6ef530b9..b3f69c9c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ lambda-worker-otel = [ "opentelemetry-sdk-extension-aws>=2.0.0,<3", ] aioboto3 = ["aioboto3>=10.4.0", "types-aioboto3[s3]>=10.4.0"] -google-genai = ["google-genai>=2.10.0,<3.0.0"] +google-genai = ["google-genai>=2.21.0,<3.0.0"] strands-agents = ["strands-agents>=1.39.0"] [project.urls] diff --git a/temporalio/contrib/google_genai/_gemini_activity.py b/temporalio/contrib/google_genai/_gemini_activity.py index 496bbf1ab..dde83bfff 100644 --- a/temporalio/contrib/google_genai/_gemini_activity.py +++ b/temporalio/contrib/google_genai/_gemini_activity.py @@ -198,10 +198,12 @@ async def gemini_files_upload( @activity.defn async def gemini_files_download( req: _GeminiDownloadFileRequest, - ) -> bytes: + ) -> bytes | None: """Download a file using the real genai.Client on the worker.""" return await self._client.aio.files.download( - file=req.file, config=req.config + file=req.file, + destination=req.destination, + config=req.config, ) @activity.defn diff --git a/temporalio/contrib/google_genai/_models.py b/temporalio/contrib/google_genai/_models.py index 2f70d9b4d..21caa8d39 100644 --- a/temporalio/contrib/google_genai/_models.py +++ b/temporalio/contrib/google_genai/_models.py @@ -100,6 +100,7 @@ class _GeminiDownloadFileRequest(BaseModel): """Serializable activity input for a file download.""" file: str + destination: str | None = None config: types.DownloadFileConfig | None = None diff --git a/temporalio/contrib/google_genai/_temporal_async_client.py b/temporalio/contrib/google_genai/_temporal_async_client.py index c77cd5cee..c9abfd988 100644 --- a/temporalio/contrib/google_genai/_temporal_async_client.py +++ b/temporalio/contrib/google_genai/_temporal_async_client.py @@ -255,13 +255,19 @@ def __init__( # Closure-wrap bound-method tools so google-genai's internal # config deep-copy (>= 2.8.0) can't clone the workflow instance. self._models = _TemporalAsyncModels(api_client) - self._files = TemporalAsyncFiles(api_client, activity_config) + self._temporal_files = TemporalAsyncFiles(api_client, activity_config) + self._files = self._temporal_files self._file_search_stores = TemporalAsyncFileSearchStores( api_client, activity_config ) self._temporal_interactions = TemporalAsyncInteractions(activity_config) self._temporal_agents = TemporalAsyncAgents(activity_config) + @property + def files(self) -> TemporalAsyncFiles: + """Temporal-aware files resource; operations run as activities.""" + return self._temporal_files + @property def interactions( # type: ignore[override] self, diff --git a/temporalio/contrib/google_genai/_temporal_files.py b/temporalio/contrib/google_genai/_temporal_files.py index f785c00cb..c2f3a3f53 100644 --- a/temporalio/contrib/google_genai/_temporal_files.py +++ b/temporalio/contrib/google_genai/_temporal_files.py @@ -11,7 +11,7 @@ import io import os from datetime import timedelta -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, overload if TYPE_CHECKING: import google.auth.credentials @@ -100,12 +100,31 @@ async def upload( **act_config, ) + @overload async def download( self, *, - file: str | types.File, + file: str | types.File | types.Video | types.GeneratedVideo, + destination: None = None, config: types.DownloadFileConfigOrDict | None = None, - ) -> bytes: + ) -> bytes: ... + + @overload + async def download( + self, + *, + file: str | types.File | types.Video | types.GeneratedVideo, + destination: str | os.PathLike[str] | io.IOBase, + config: types.DownloadFileConfigOrDict | None = None, + ) -> None: ... + + async def download( + self, + *, + file: str | types.File | types.Video | types.GeneratedVideo, + destination: str | os.PathLike[str] | io.IOBase | None = None, + config: types.DownloadFileConfigOrDict | None = None, + ) -> bytes | None: """Download a file via a Temporal activity.""" act_config: ActivityConfig = {**self._activity_config} if "summary" not in act_config: @@ -119,19 +138,48 @@ async def download( download_config = config _validate_http_options(download_config.http_options) - if isinstance(file, types.File): - if not file.name: - raise ValueError("File object must have a name to download.") + if isinstance(file, types.GeneratedVideo): + file_video = file.video + file_name = file_video.uri if file_video is not None else None + elif isinstance(file, types.Video): + file_name = file.uri + elif isinstance(file, types.File): file_name = file.name else: file_name = file + if not file_name: + raise ValueError("File name is required.") + + if isinstance(destination, io.IOBase): + destination_stream = destination + destination_path = None + elif destination is not None: + destination_stream = None + destination_path = os.fspath(destination) + else: + destination_stream = None + destination_path = None - return await temporal_workflow.execute_activity( + data = await temporal_workflow.execute_activity( "gemini_files_download", - _GeminiDownloadFileRequest(file=file_name, config=download_config), + _GeminiDownloadFileRequest( + file=file_name, + destination=destination_path, + config=download_config, + ), result_type=bytes, **act_config, ) + if destination_stream is not None: + destination_stream.write(data) + return None + if destination_path is not None: + return None + if isinstance(file, types.Video): + file.video_bytes = data + elif isinstance(file, types.GeneratedVideo) and file.video is not None: + file.video.video_bytes = data + return data async def register_files( self, diff --git a/temporalio/contrib/openai_agents/testing.py b/temporalio/contrib/openai_agents/testing.py index 110ca20b7..3fcd6a573 100644 --- a/temporalio/contrib/openai_agents/testing.py +++ b/temporalio/contrib/openai_agents/testing.py @@ -1,5 +1,6 @@ """Testing utilities for OpenAI agents.""" +import uuid from collections.abc import AsyncIterator, Callable, Sequence from typing import Any @@ -73,7 +74,9 @@ def tool_call(arguments: str, name: str) -> ModelResponse: return ResponseBuilders.model_response( ResponseFunctionToolCall( arguments=arguments, - call_id="call", + # The Agents SDK rejects two invocations sharing one completed + # call id, and a script that calls two tools would hand them one. + call_id=f"call-{uuid.uuid4()}", name=name, type="function_call", id="id", diff --git a/tests/contrib/google_adk_agents/test_adk_streaming.py b/tests/contrib/google_adk_agents/test_adk_streaming.py index 30aecd9f4..d426990bb 100644 --- a/tests/contrib/google_adk_agents/test_adk_streaming.py +++ b/tests/contrib/google_adk_agents/test_adk_streaming.py @@ -12,7 +12,12 @@ import pytest from google.adk import Agent -from google.adk.agents.run_config import RunConfig, StreamingMode + +# ADK 2.7 marks StreamingMode as a private re-export. +from google.adk.agents.run_config import ( + RunConfig, + StreamingMode, # pyright: ignore[reportPrivateImportUsage] +) from google.adk.models import BaseLlm, LLMRegistry from google.adk.models.llm_request import LlmRequest from google.adk.models.llm_response import LlmResponse diff --git a/tests/contrib/google_genai/test_gemini.py b/tests/contrib/google_genai/test_gemini.py index 0881f63b3..d87d37675 100644 --- a/tests/contrib/google_genai/test_gemini.py +++ b/tests/contrib/google_genai/test_gemini.py @@ -292,8 +292,8 @@ async def gemini_file_search_stores_upload( self, req: _GeminiUploadToFileSearchStoreRequest ) -> types.UploadToFileSearchStoreOperation: self.file_search_store_upload_requests.append(req) - return types.UploadToFileSearchStoreOperation.model_construct( - name="operations/test-op", + return types.UploadToFileSearchStoreOperation.model_validate( + {"name": "operations/test-op"} ) @activity.defn @@ -742,6 +742,16 @@ async def run(self, file_name: str) -> bytes: return await client.files.download(file=file_name) +@workflow.defn +class FileDownloadToPathWorkflow: + """Workflow that downloads a file to a path on the activity worker.""" + + @workflow.run + async def run(self, file_name: str, destination: str) -> None: + client = TemporalAsyncClient() + await client.files.download(file=file_name, destination=destination) + + @workflow.defn class FileSearchStoreUploadWorkflow: """Workflow that uploads to a file search store.""" @@ -1251,6 +1261,24 @@ async def test_file_download(client: Client): assert result == b"fake file content" +async def test_file_download_to_path(client: Client): + """Download destinations are passed to the activity worker.""" + new_client, api_tracker = apply_plugin(client, []) + + async with new_worker(new_client, FileDownloadToPathWorkflow) as worker: + await new_client.execute_workflow( + FileDownloadToPathWorkflow.run, + args=["files/some-file", "/tmp/downloaded-file"], + id=f"gemini-file-download-to-path-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + + assert len(api_tracker.file_download_requests) == 1 + request = api_tracker.file_download_requests[0] + assert request.file == "files/some-file" + assert request.destination == "/tmp/downloaded-file" + + # =========================================================================== # File search store upload tests # =========================================================================== @@ -1387,8 +1415,8 @@ async def _gen(): ) gemini.aio.files.download = AsyncMock(return_value=b"mock download content") # type: ignore[method-assign] gemini.aio.file_search_stores.upload_to_file_search_store = AsyncMock( # type: ignore[method-assign] - return_value=types.UploadToFileSearchStoreOperation.model_construct( - name="operations/mock-op" + return_value=types.UploadToFileSearchStoreOperation.model_validate( + {"name": "operations/mock-op"} ) ) diff --git a/tests/contrib/openai_agents/test_openai.py b/tests/contrib/openai_agents/test_openai.py index 25597ee55..0baae0e6f 100644 --- a/tests/contrib/openai_agents/test_openai.py +++ b/tests/contrib/openai_agents/test_openai.py @@ -1431,8 +1431,16 @@ def status_error(status: int): import httpx raise APIStatusError( message="Something went wrong.", - response=httpx.Response( - status_code=status, request=httpx.Request("GET", url="") + # Under the latest dependency set openai carries its own httpx + # as `httpx2`, so the parameter's `Response` is a different + # class from the one built here and the two are not assignable. + # Only the annotation differs; openai reads the object the same + # way either way. + response=cast( + Any, + httpx.Response( + status_code=status, request=httpx.Request("GET", url="") + ), ), body=None, ) diff --git a/tests/nexus/test_temporal_system_nexus.py b/tests/nexus/test_temporal_system_nexus.py index ff6b36e41..b6c711128 100644 --- a/tests/nexus/test_temporal_system_nexus.py +++ b/tests/nexus/test_temporal_system_nexus.py @@ -343,13 +343,10 @@ def _proto_scalar_sample(field: FieldDescriptor, *, path: str) -> Any: def _field_is_repeated(field: FieldDescriptor) -> bool: - return bool( - getattr( - field, - "is_repeated", - getattr(field, "label") == FieldDescriptor.LABEL_REPEATED, - ) - ) + is_repeated = getattr(field, "is_repeated", None) + if is_repeated is not None: + return bool(is_repeated) + return getattr(field, "label") == FieldDescriptor.LABEL_REPEATED @pytest.mark.parametrize( diff --git a/uv.lock b/uv.lock index 9c625ed14..df077d1e8 100644 --- a/uv.lock +++ b/uv.lock @@ -1354,7 +1354,7 @@ requests = [ [[package]] name = "google-genai" -version = "2.11.0" +version = "2.21.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1368,9 +1368,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/01/e7b5f3aac89200c78318ed7643401e7f5ed3131b0cd353c07483606b1e61/google_genai-2.11.0.tar.gz", hash = "sha256:4c5e524d24b145c96be327f9a7f8f04b0fe4efee0533877795e9848afed01749", size = 622366, upload-time = "2026-07-09T17:49:43.862Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/a7/a45f64f22ab9302b55fcbeb32acb6f313690a7748629b01e451aad1817a3/google_genai-2.21.0.tar.gz", hash = "sha256:0ecc11c6a5b9f5e3cc58e77ae5fead00c6719f8a1b2b654b803f514a9a6b64c0", size = 677301, upload-time = "2026-08-31T21:49:14.508Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/ef/d296c23390160a8b0b1dafb36dd3cb36a39ed40c81cd27e04e6233334186/google_genai-2.11.0-py3-none-any.whl", hash = "sha256:5bc8186100e1d34d691fbe0cba392b7e04e98d286ca952323a6672d054accf95", size = 984162, upload-time = "2026-07-09T17:49:42.15Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/c2419dd5fedd5803ce09810e4e39561a0a13a960b3f48d2581c12e42af3e/google_genai-2.21.0-py3-none-any.whl", hash = "sha256:36b575034be46a03acd603a852e22a6359f2cdd6b26bb1d65d9b7e0cc7ab3648", size = 1080223, upload-time = "2026-08-31T21:49:12.699Z" }, ] [[package]] @@ -4820,7 +4820,7 @@ requires-dist = [ { name = "aioboto3", marker = "extra == 'aioboto3'", specifier = ">=10.4.0" }, { name = "deepagents", marker = "python_full_version >= '3.11' and extra == 'deepagents'", specifier = ">=0.6.12,<0.7" }, { name = "google-adk", marker = "extra == 'google-adk'", specifier = ">=2.2.0,<3" }, - { name = "google-genai", marker = "extra == 'google-genai'", specifier = ">=2.10.0,<3.0.0" }, + { name = "google-genai", marker = "extra == 'google-genai'", specifier = ">=2.21.0,<3.0.0" }, { name = "grpcio", marker = "extra == 'grpc'", specifier = ">=1.48.2,<2" }, { name = "langchain", marker = "python_full_version >= '3.11' and extra == 'deepagents'", specifier = ">=1.3.11,<2" }, { name = "langchain-core", marker = "python_full_version >= '3.11' and extra == 'deepagents'", specifier = ">=1.4.8,<2" }, From b7cb0b1d8d77931985a11eeb470bd35aaa9f8b63 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:59:08 -0700 Subject: [PATCH 563/831] Adopted main's generator scripts and regenerated their output. The branch's own Nexus generator shells out to a binary name the nexgen crate does not install, and the payload visitor script still looked for the service module under its old filename, so generation died before it could diff anything. --- pyproject.toml | 5 + scripts/gen_nexus_system_api.py | 25 +- scripts/gen_payload_visitor.py | 37 ++- scripts/nex_gen_support.py | 93 +++++- temporalio/bridge/_visitor.py | 5 + .../nexus/system/workflow_service/__init__.py | 37 ++- .../workflow_service/_resources/__init__.py | 5 - .../workflow_service/_support/__init__.py | 2 +- .../_support/nex_gen_support.py | 93 +++++- .../_system_nexus_interceptor.py | 95 ++++++ .../nexus/system/workflow_service/models.py | 297 +++++++++++++++--- .../workflow_service/operations/__init__.py | 2 +- .../operations/signal_with_start_workflow.py | 209 ++++++------ .../{service.py => services.py} | 11 +- tests/nexus/test_temporal_system_nexus.py | 9 +- 15 files changed, 717 insertions(+), 208 deletions(-) delete mode 100644 temporalio/nexus/system/workflow_service/_resources/__init__.py create mode 100644 temporalio/nexus/system/workflow_service/_system_nexus_interceptor.py rename temporalio/nexus/system/workflow_service/{service.py => services.py} (58%) diff --git a/pyproject.toml b/pyproject.toml index b3f69c9c2..70f3d2c97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -188,8 +188,13 @@ exclude = [ # Ignore generated code 'temporalio/api', 'temporalio/bridge/proto', + 'temporalio/nexus/system/workflow_service', ] +[[tool.mypy.overrides]] +module = "temporalio.nexus.system.workflow_service.*" +ignore_errors = true + [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 diff --git a/scripts/gen_nexus_system_api.py b/scripts/gen_nexus_system_api.py index 7ac1bd2de..e57ca03b3 100644 --- a/scripts/gen_nexus_system_api.py +++ b/scripts/gen_nexus_system_api.py @@ -35,15 +35,28 @@ / "v1" / "request_response.proto" ) +NEX_GEN_VERSION = "0.2.4" def nex_gen_command() -> list[str]: if bin_path := os.environ.get("NEX_GEN_BIN"): return [bin_path] - if shutil.which("nex-gen") is None: - subprocess.check_call(["cargo", "install", "--locked", "nex-gen", "--force"]) - return ["nex-gen"] + if shutil.which("nexgen") is None: + subprocess.check_call( + [ + "cargo", + "install", + "--locked", + "nexgen", + "--version", + NEX_GEN_VERSION, + "--features", + "advanced", + "--force", + ] + ) + return ["nexgen"] def build_descriptor_set(descriptor_path: Path) -> None: @@ -114,13 +127,11 @@ def generate_nexus_system_api() -> None: subprocess.check_call( [ *command, - "generate", - "--lang", "python", - "--input", str(wit_path), - "--input", str(wit_deps_dir), + "--native-api", + "--system-nexus", "--support-file", str(python_support_path), "--descriptors", diff --git a/scripts/gen_payload_visitor.py b/scripts/gen_payload_visitor.py index 0001659f7..7fab85dcd 100644 --- a/scripts/gen_payload_visitor.py +++ b/scripts/gen_payload_visitor.py @@ -2,7 +2,7 @@ import sys from importlib.util import module_from_spec, spec_from_file_location from pathlib import Path -from typing import cast +from typing import cast, get_args, get_origin, get_type_hints import google.protobuf.message import nexusrpc @@ -19,14 +19,15 @@ from temporalio.bridge.proto.workflow_completion.workflow_completion_pb2 import ( WorkflowActivationCompletion, ) +from temporalio.converter._payload_converter import _get_transfer_type_converter def discover_system_nexus_roots() -> list[Descriptor]: - module_path = ( - base_dir / "temporalio" / "nexus" / "system" / "workflow_service" / "service.py" - ) + module_path = base_dir / "temporalio" / "nexus" / "system" / "workflow_service" spec = spec_from_file_location( - "temporalio_nexus_system_workflow_service", module_path + "temporalio_nexus_system_workflow_service", + module_path / "__init__.py", + submodule_search_locations=[str(module_path)], ) if spec is None or spec.loader is None: raise RuntimeError(f"Cannot load generated system service from {module_path}") @@ -35,10 +36,14 @@ def discover_system_nexus_roots() -> list[Descriptor]: spec.loader.exec_module(module) roots: list[Descriptor] = [] - for operation in vars(module.WorkflowService).values(): - if not isinstance(operation, nexusrpc.Operation): + for annotation in get_type_hints(module._services.WorkflowService).values(): + if get_origin(annotation) is not nexusrpc.Operation: continue - for proto_type in (operation.input_type, operation.output_type): + for operation_type in get_args(annotation): + converter = _get_transfer_type_converter(operation_type) + proto_type = ( + converter.transfer_type if converter is not None else operation_type + ) if isinstance(proto_type, type) and issubclass( proto_type, google.protobuf.message.Message ): @@ -119,12 +124,20 @@ def generate(self, roots: list[Descriptor]) -> str: The generated code defines async visitor functions for each reachable protobuf message type starting from WorkflowActivation, including support - for repeated fields and map entries, and a convenience entrypoint - function `visit`. + for repeated fields and map entries. Payload-free roots get no-op methods + so the `visit` entrypoint recognizes them as supported. """ - for r in roots: - self.walk(r) + for root in roots: + if not self.walk(root): + self.methods.append( + f"""\ + async def _visit_{name_for(root)}( + self, fs: VisitorFunctions, o: Any + ) -> None: + pass +""" + ) header = """ from __future__ import annotations diff --git a/scripts/nex_gen_support.py b/scripts/nex_gen_support.py index 58b51e263..fad21151e 100644 --- a/scripts/nex_gen_support.py +++ b/scripts/nex_gen_support.py @@ -10,6 +10,12 @@ import temporalio.api.workflow.v1 import temporalio.common import temporalio.converter +import temporalio.nexus.system + + +class SignalWithStartWorkflowModelRequest(typing.Protocol): + namespace: str + id: str def retry_policy_from_proto( @@ -52,6 +58,12 @@ def workflow_type_to_proto( return common_pb2.WorkflowType(name=workflow_function_name(workflow_type)) +def workflow_type_from_proto( + proto: common_pb2.WorkflowType, +) -> str: + return proto.name + + def task_queue_from_proto( proto: taskqueue_pb2.TaskQueue, ) -> str: @@ -70,12 +82,33 @@ def workflow_namespace() -> str: return info().namespace +def signal_with_start_workflow_serialization_context( + request: SignalWithStartWorkflowModelRequest, +) -> temporalio.converter.WorkflowSerializationContext: + return temporalio.converter.WorkflowSerializationContext( + namespace=request.namespace, + workflow_id=request.id, + ) + + def payloads_to_proto( values: collections.abc.Sequence[typing.Any], ) -> common_pb2.Payloads: - from temporalio.workflow import payload_converter + return ( + temporalio.nexus.system._current_user_payload_converter().to_payloads_wrapper( + values + ) + ) - return payload_converter().to_payloads_wrapper(values) + +def payloads_from_proto( + proto: common_pb2.Payloads, +) -> list[object]: + return list( + temporalio.nexus.system._current_user_payload_converter().from_payloads_wrapper( + proto + ) + ) def _clone_payload(payload: common_pb2.Payload) -> common_pb2.Payload: @@ -87,20 +120,23 @@ def _clone_payload(payload: common_pb2.Payload) -> common_pb2.Payload: def _value_to_payload(value: object | common_pb2.Payload) -> common_pb2.Payload: if isinstance(value, common_pb2.Payload): return _clone_payload(value) - from temporalio.workflow import payload_converter - - payloads = payload_converter().to_payloads_wrapper([value]) + payloads = ( + temporalio.nexus.system._current_user_payload_converter().to_payloads_wrapper( + [value] + ) + ) return _clone_payload(payloads.payloads[0]) def _payload_to_value(payload: common_pb2.Payload) -> object: wrapper = common_pb2.Payloads() wrapper.payloads.add().CopyFrom(payload) - from temporalio.workflow import payload_converter return typing.cast( object, - payload_converter().from_payloads_wrapper(wrapper)[0], + temporalio.nexus.system._current_user_payload_converter().from_payloads_wrapper( + wrapper + )[0], ) @@ -131,6 +167,21 @@ def memo_to_proto( return message +def header_from_proto( + proto: common_pb2.Header, +) -> collections.abc.Mapping[str, object]: + return {key: _payload_to_value(value) for key, value in proto.fields.items()} + + +def header_to_proto( + header: collections.abc.Mapping[str, object], +) -> common_pb2.Header: + message = common_pb2.Header() + for key, value in header.items(): + message.fields[key].CopyFrom(_value_to_payload(value)) + return message + + def duration_from_proto(proto: google.protobuf.duration_pb2.Duration) -> timedelta: return proto.ToTimedelta() @@ -177,6 +228,12 @@ def search_attributes_to_proto( return proto +def search_attributes_from_proto( + proto: common_pb2.SearchAttributes, +) -> temporalio.common.TypedSearchAttributes: + return temporalio.converter.decode_typed_search_attributes(proto) + + def priority_from_proto( proto: common_pb2.Priority, ) -> temporalio.common.Priority: @@ -193,3 +250,25 @@ def versioning_override_to_proto( versioning_override: temporalio.common.VersioningOverride, ) -> temporalio.api.workflow.v1.VersioningOverride: return versioning_override._to_proto() # pyright: ignore[reportPrivateUsage] + + +def versioning_override_from_proto( + proto: temporalio.api.workflow.v1.VersioningOverride, +) -> temporalio.common.VersioningOverride: + if proto.HasField("pinned") and proto.pinned.HasField("version"): + version = proto.pinned.version + return temporalio.common.PinnedVersioningOverride( + temporalio.common.WorkerDeploymentVersion( + deployment_name=version.deployment_name, + build_id=version.build_id, + ) + ) + if proto.pinned_version: + return temporalio.common.PinnedVersioningOverride( + temporalio.common.WorkerDeploymentVersion.from_canonical_string( + proto.pinned_version + ) + ) + if proto.auto_upgrade: + return temporalio.common.AutoUpgradeVersioningOverride() + raise ValueError("unknown versioning override proto shape") diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index ef1e21dbd..f26fc390f 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -621,3 +621,8 @@ async def _visit_temporal_api_workflowservice_v1_SignalWithStartWorkflowExecutio await self._visit_temporal_api_common_v1_Header(fs, o.header) if o.HasField("user_metadata"): await self._visit_temporal_api_sdk_v1_UserMetadata(fs, o.user_metadata) + + async def _visit_temporal_api_workflowservice_v1_SignalWithStartWorkflowExecutionResponse( + self, fs: VisitorFunctions, o: Any + ) -> None: + pass diff --git a/temporalio/nexus/system/workflow_service/__init__.py b/temporalio/nexus/system/workflow_service/__init__.py index 7c24fa125..8397ef186 100644 --- a/temporalio/nexus/system/workflow_service/__init__.py +++ b/temporalio/nexus/system/workflow_service/__init__.py @@ -1,8 +1,15 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations -from . import service as _service +import collections.abc +import typing + +import nexusrpc + +import temporalio.converter + +from . import services as _services from .operations.signal_with_start_workflow import signal_with_start_workflow __all__ = [ @@ -10,9 +17,33 @@ ] +_InputT = typing.TypeVar("_InputT") +_OutputT = typing.TypeVar("_OutputT") + + +_SerializationContextFactory = collections.abc.Callable[ + [_InputT], temporalio.converter.SerializationContext +] + + +class _NexusOperationInfo(typing.Generic[_InputT, _OutputT]): + def __init__( + self, + *, + operation: nexusrpc.Operation[_InputT, _OutputT], + serialization_context: _SerializationContextFactory[_InputT] | None = None, + ) -> None: + self.operation: nexusrpc.Operation[_InputT, _OutputT] = operation + self.serialization_context: _SerializationContextFactory[_InputT] | None = ( + serialization_context + ) + + __nexus_operation_registry__ = { ( "temporal.api.workflowservice.v1.WorkflowService", "SignalWithStartWorkflowExecution", - ): _service.WorkflowService.signal_with_start_workflow, + ): _NexusOperationInfo( + operation=_services.WorkflowService.signal_with_start_workflow, + ), } diff --git a/temporalio/nexus/system/workflow_service/_resources/__init__.py b/temporalio/nexus/system/workflow_service/_resources/__init__.py deleted file mode 100644 index 373efbd33..000000000 --- a/temporalio/nexus/system/workflow_service/_resources/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# Generated by nex-gen. DO NOT EDIT! - -from __future__ import annotations - -__all__ = [] diff --git a/temporalio/nexus/system/workflow_service/_support/__init__.py b/temporalio/nexus/system/workflow_service/_support/__init__.py index 530c33e80..6af0c0c56 100644 --- a/temporalio/nexus/system/workflow_service/_support/__init__.py +++ b/temporalio/nexus/system/workflow_service/_support/__init__.py @@ -1,4 +1,4 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations diff --git a/temporalio/nexus/system/workflow_service/_support/nex_gen_support.py b/temporalio/nexus/system/workflow_service/_support/nex_gen_support.py index 58b51e263..fad21151e 100644 --- a/temporalio/nexus/system/workflow_service/_support/nex_gen_support.py +++ b/temporalio/nexus/system/workflow_service/_support/nex_gen_support.py @@ -10,6 +10,12 @@ import temporalio.api.workflow.v1 import temporalio.common import temporalio.converter +import temporalio.nexus.system + + +class SignalWithStartWorkflowModelRequest(typing.Protocol): + namespace: str + id: str def retry_policy_from_proto( @@ -52,6 +58,12 @@ def workflow_type_to_proto( return common_pb2.WorkflowType(name=workflow_function_name(workflow_type)) +def workflow_type_from_proto( + proto: common_pb2.WorkflowType, +) -> str: + return proto.name + + def task_queue_from_proto( proto: taskqueue_pb2.TaskQueue, ) -> str: @@ -70,12 +82,33 @@ def workflow_namespace() -> str: return info().namespace +def signal_with_start_workflow_serialization_context( + request: SignalWithStartWorkflowModelRequest, +) -> temporalio.converter.WorkflowSerializationContext: + return temporalio.converter.WorkflowSerializationContext( + namespace=request.namespace, + workflow_id=request.id, + ) + + def payloads_to_proto( values: collections.abc.Sequence[typing.Any], ) -> common_pb2.Payloads: - from temporalio.workflow import payload_converter + return ( + temporalio.nexus.system._current_user_payload_converter().to_payloads_wrapper( + values + ) + ) - return payload_converter().to_payloads_wrapper(values) + +def payloads_from_proto( + proto: common_pb2.Payloads, +) -> list[object]: + return list( + temporalio.nexus.system._current_user_payload_converter().from_payloads_wrapper( + proto + ) + ) def _clone_payload(payload: common_pb2.Payload) -> common_pb2.Payload: @@ -87,20 +120,23 @@ def _clone_payload(payload: common_pb2.Payload) -> common_pb2.Payload: def _value_to_payload(value: object | common_pb2.Payload) -> common_pb2.Payload: if isinstance(value, common_pb2.Payload): return _clone_payload(value) - from temporalio.workflow import payload_converter - - payloads = payload_converter().to_payloads_wrapper([value]) + payloads = ( + temporalio.nexus.system._current_user_payload_converter().to_payloads_wrapper( + [value] + ) + ) return _clone_payload(payloads.payloads[0]) def _payload_to_value(payload: common_pb2.Payload) -> object: wrapper = common_pb2.Payloads() wrapper.payloads.add().CopyFrom(payload) - from temporalio.workflow import payload_converter return typing.cast( object, - payload_converter().from_payloads_wrapper(wrapper)[0], + temporalio.nexus.system._current_user_payload_converter().from_payloads_wrapper( + wrapper + )[0], ) @@ -131,6 +167,21 @@ def memo_to_proto( return message +def header_from_proto( + proto: common_pb2.Header, +) -> collections.abc.Mapping[str, object]: + return {key: _payload_to_value(value) for key, value in proto.fields.items()} + + +def header_to_proto( + header: collections.abc.Mapping[str, object], +) -> common_pb2.Header: + message = common_pb2.Header() + for key, value in header.items(): + message.fields[key].CopyFrom(_value_to_payload(value)) + return message + + def duration_from_proto(proto: google.protobuf.duration_pb2.Duration) -> timedelta: return proto.ToTimedelta() @@ -177,6 +228,12 @@ def search_attributes_to_proto( return proto +def search_attributes_from_proto( + proto: common_pb2.SearchAttributes, +) -> temporalio.common.TypedSearchAttributes: + return temporalio.converter.decode_typed_search_attributes(proto) + + def priority_from_proto( proto: common_pb2.Priority, ) -> temporalio.common.Priority: @@ -193,3 +250,25 @@ def versioning_override_to_proto( versioning_override: temporalio.common.VersioningOverride, ) -> temporalio.api.workflow.v1.VersioningOverride: return versioning_override._to_proto() # pyright: ignore[reportPrivateUsage] + + +def versioning_override_from_proto( + proto: temporalio.api.workflow.v1.VersioningOverride, +) -> temporalio.common.VersioningOverride: + if proto.HasField("pinned") and proto.pinned.HasField("version"): + version = proto.pinned.version + return temporalio.common.PinnedVersioningOverride( + temporalio.common.WorkerDeploymentVersion( + deployment_name=version.deployment_name, + build_id=version.build_id, + ) + ) + if proto.pinned_version: + return temporalio.common.PinnedVersioningOverride( + temporalio.common.WorkerDeploymentVersion.from_canonical_string( + proto.pinned_version + ) + ) + if proto.auto_upgrade: + return temporalio.common.AutoUpgradeVersioningOverride() + raise ValueError("unknown versioning override proto shape") diff --git a/temporalio/nexus/system/workflow_service/_system_nexus_interceptor.py b/temporalio/nexus/system/workflow_service/_system_nexus_interceptor.py new file mode 100644 index 000000000..c70b106db --- /dev/null +++ b/temporalio/nexus/system/workflow_service/_system_nexus_interceptor.py @@ -0,0 +1,95 @@ +# Generated by nexgen v0.2.4. DO NOT EDIT! + +from __future__ import annotations + +import abc +import typing + +from . import models + +if typing.TYPE_CHECKING: + import temporalio.workflow + from temporalio.worker._interceptor import StartNexusOperationInput + + +__all__ = [ + "_start_system_nexus_operation", + "_SystemNexusWorkflowOutboundInterceptorBase", + "_SystemNexusWorkflowOutboundInterceptorTerminal", +] + + +_InputT = typing.TypeVar("_InputT") +_OutputT = typing.TypeVar("_OutputT") + + +async def _start_system_nexus_operation( + interceptor: _SystemNexusWorkflowOutboundInterceptorBase, + input: StartNexusOperationInput[_InputT, _OutputT], +) -> temporalio.workflow.NexusOperationHandle[_OutputT]: + if ( + input.service == "temporal.api.workflowservice.v1.WorkflowService" + and input.operation_name == "SignalWithStartWorkflowExecution" + ): + typed_input = typing.cast( + "StartNexusOperationInput[models.SignalWithStartWorkflowRequest, models.SignalWithStartWorkflowResponse]", + input, + ) + # The dispatch check above establishes that this operation's response type is _OutputT. + return typing.cast( + "temporalio.workflow.NexusOperationHandle[_OutputT]", + await interceptor.start_signal_with_start_workflow(typed_input.input), + ) + raise ValueError( + f"unsupported System Nexus operation: {input.service}/{input.operation_name}" + ) + + +class _SystemNexusWorkflowOutboundInterceptorBase(abc.ABC): + @abc.abstractmethod + def _next_system_nexus_interceptor( + self, + ) -> _SystemNexusWorkflowOutboundInterceptorBase: ... + + async def start_signal_with_start_workflow( + self, request: models.SignalWithStartWorkflowRequest + ) -> temporalio.workflow.NexusOperationHandle[ + models.SignalWithStartWorkflowResponse + ]: + """Intercept the SignalWithStartWorkflow operation.""" + return await self._next_system_nexus_interceptor().start_signal_with_start_workflow( + request + ) + + +class _SystemNexusWorkflowOutboundInterceptorTerminal(abc.ABC): + @abc.abstractmethod + async def _intercept_system_nexus_operation( + self, + input: StartNexusOperationInput[_InputT, _OutputT], + ) -> temporalio.workflow.NexusOperationHandle[_OutputT]: ... + + async def start_signal_with_start_workflow( + self, request: models.SignalWithStartWorkflowRequest + ) -> temporalio.workflow.NexusOperationHandle[ + models.SignalWithStartWorkflowResponse + ]: + from temporalio.nexus.system import TEMPORAL_SYSTEM_ENDPOINT + from temporalio.worker._interceptor import StartNexusOperationInput + from temporalio.workflow import NexusOperationCancellationType + + return await self._intercept_system_nexus_operation( + StartNexusOperationInput( + endpoint=TEMPORAL_SYSTEM_ENDPOINT, + service="temporal.api.workflowservice.v1.WorkflowService", + operation="SignalWithStartWorkflowExecution", + input=request, + output_type=models.SignalWithStartWorkflowResponse, + schedule_to_close_timeout=None, + schedule_to_start_timeout=None, + start_to_close_timeout=None, + cancellation_type=NexusOperationCancellationType.WAIT_COMPLETED, + headers=None, + summary=None, + ) + ) diff --git a/temporalio/nexus/system/workflow_service/models.py b/temporalio/nexus/system/workflow_service/models.py index 05e1e3088..df3694863 100644 --- a/temporalio/nexus/system/workflow_service/models.py +++ b/temporalio/nexus/system/workflow_service/models.py @@ -1,4 +1,4 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations @@ -7,25 +7,39 @@ import datetime import typing +import typing_extensions + import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.workflowservice.v1.request_response_pb2 import temporalio.common +import temporalio.converter from ._support import ( + duration_from_proto, duration_to_proto, + memo_from_proto, memo_to_proto, payload_from_proto, payload_to_proto, + payloads_from_proto, payloads_to_proto, + priority_from_proto, priority_to_proto, + retry_policy_from_proto, retry_policy_to_proto, + search_attributes_from_proto, search_attributes_to_proto, signal_function_to_proto, + task_queue_from_proto, task_queue_to_proto, + versioning_override_from_proto, versioning_override_to_proto, + workflow_id_conflict_policy_from_proto, workflow_id_conflict_policy_to_proto, + workflow_id_reuse_policy_from_proto, workflow_id_reuse_policy_to_proto, workflow_namespace, + workflow_type_from_proto, workflow_type_to_proto, ) @@ -59,83 +73,262 @@ class SignalWithStartWorkflowRequest: versioning_override: temporalio.common.VersioningOverride | None = None start_delay: datetime.timedelta | None = None user_metadata: UserMetadata | None = None + namespace: str = dataclasses.field(default_factory=workflow_namespace) + - def to_proto( +class _SignalWithStartWorkflowRequestTransferTypeConverter( + temporalio.converter.TransferTypeConverter[ + SignalWithStartWorkflowRequest, + temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, + ] +): + transfer_type: ( + type[ + temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest + ] + | None + ) = temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest + + @typing_extensions.override + def from_transfer_type( self, + value: temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, + type_hint: type[SignalWithStartWorkflowRequest], + ) -> SignalWithStartWorkflowRequest: + if not value.HasField("workflow_type"): + raise ValueError( + "missing required field SignalWithStartWorkflowRequest.workflow" + ) + workflow = workflow_type_from_proto(value.workflow_type) + if not value.workflow_id: + raise ValueError("missing required field SignalWithStartWorkflowRequest.id") + id = value.workflow_id + if not value.HasField("task_queue"): + raise ValueError( + "missing required field SignalWithStartWorkflowRequest.task_queue" + ) + task_queue = task_queue_from_proto(value.task_queue) + if not value.signal_name: + raise ValueError( + "missing required field SignalWithStartWorkflowRequest.signal" + ) + signal = value.signal_name + return SignalWithStartWorkflowRequest( + workflow=workflow, + args=payloads_from_proto(value.input) if value.HasField("input") else None, + id=id, + task_queue=task_queue, + signal=signal, + signal_args=payloads_from_proto(value.signal_input) + if value.HasField("signal_input") + else None, + execution_timeout=duration_from_proto(value.workflow_execution_timeout) + if value.HasField("workflow_execution_timeout") + else None, + run_timeout=duration_from_proto(value.workflow_run_timeout) + if value.HasField("workflow_run_timeout") + else None, + task_timeout=duration_from_proto(value.workflow_task_timeout) + if value.HasField("workflow_task_timeout") + else None, + request_id=value.request_id if bool(value.request_id) else None, + id_reuse_policy=workflow_id_reuse_policy_from_proto( + value.workflow_id_reuse_policy + ), + id_conflict_policy=workflow_id_conflict_policy_from_proto( + value.workflow_id_conflict_policy + ) + if value.workflow_id_conflict_policy != 0 + else None, + retry_policy=retry_policy_from_proto(value.retry_policy) + if value.HasField("retry_policy") + else None, + cron_schedule=value.cron_schedule if bool(value.cron_schedule) else None, + memo=memo_from_proto(value.memo) if value.HasField("memo") else None, + search_attributes=search_attributes_from_proto(value.search_attributes) + if value.HasField("search_attributes") + else None, + priority=priority_from_proto(value.priority) + if value.HasField("priority") + else None, + versioning_override=versioning_override_from_proto( + value.versioning_override + ) + if value.HasField("versioning_override") + else None, + start_delay=duration_from_proto(value.workflow_start_delay) + if value.HasField("workflow_start_delay") + else None, + user_metadata=_UserMetadataTransferTypeConverter().from_transfer_type( + value.user_metadata, UserMetadata + ) + if value.HasField("user_metadata") + else None, + namespace=value.namespace, + ) + + @typing_extensions.override + def to_transfer_type( + self, + value: SignalWithStartWorkflowRequest, ) -> temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest: message = temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest() - message.workflow_type.CopyFrom(workflow_type_to_proto(self.workflow)) - if self.args is not None: - message.input.CopyFrom(payloads_to_proto(self.args)) - message.workflow_id = self.id - message.task_queue.CopyFrom(task_queue_to_proto(self.task_queue)) - message.signal_name = signal_function_to_proto(self.signal) - if self.signal_args is not None: - message.signal_input.CopyFrom(payloads_to_proto(self.signal_args)) - if self.execution_timeout is not None: + message.workflow_type.CopyFrom(workflow_type_to_proto(value.workflow)) + if value.args is not None: + message.input.CopyFrom(payloads_to_proto(value.args)) + message.workflow_id = value.id + message.task_queue.CopyFrom(task_queue_to_proto(value.task_queue)) + message.signal_name = signal_function_to_proto(value.signal) + if value.signal_args is not None: + message.signal_input.CopyFrom(payloads_to_proto(value.signal_args)) + if value.execution_timeout is not None: message.workflow_execution_timeout.CopyFrom( - duration_to_proto(self.execution_timeout) + duration_to_proto(value.execution_timeout) + ) + if value.run_timeout is not None: + message.workflow_run_timeout.CopyFrom(duration_to_proto(value.run_timeout)) + if value.task_timeout is not None: + message.workflow_task_timeout.CopyFrom( + duration_to_proto(value.task_timeout) ) - if self.run_timeout is not None: - message.workflow_run_timeout.CopyFrom(duration_to_proto(self.run_timeout)) - if self.task_timeout is not None: - message.workflow_task_timeout.CopyFrom(duration_to_proto(self.task_timeout)) - if self.request_id is not None: - message.request_id = self.request_id + if value.request_id is not None: + message.request_id = value.request_id message.workflow_id_reuse_policy = workflow_id_reuse_policy_to_proto( - self.id_reuse_policy + value.id_reuse_policy ) - if self.id_conflict_policy is not None: + if value.id_conflict_policy is not None: message.workflow_id_conflict_policy = workflow_id_conflict_policy_to_proto( - self.id_conflict_policy + value.id_conflict_policy ) - if self.retry_policy is not None: - message.retry_policy.CopyFrom(retry_policy_to_proto(self.retry_policy)) - if self.cron_schedule is not None: - message.cron_schedule = self.cron_schedule - if self.memo is not None: - message.memo.CopyFrom(memo_to_proto(self.memo)) - if self.search_attributes is not None: + if value.retry_policy is not None: + message.retry_policy.CopyFrom(retry_policy_to_proto(value.retry_policy)) + if value.cron_schedule is not None: + message.cron_schedule = value.cron_schedule + if value.memo is not None: + message.memo.CopyFrom(memo_to_proto(value.memo)) + if value.search_attributes is not None: message.search_attributes.CopyFrom( - search_attributes_to_proto(self.search_attributes) + search_attributes_to_proto(value.search_attributes) ) - if self.priority is not None: - message.priority.CopyFrom(priority_to_proto(self.priority)) - if self.versioning_override is not None: + if value.priority is not None: + message.priority.CopyFrom(priority_to_proto(value.priority)) + if value.versioning_override is not None: message.versioning_override.CopyFrom( - versioning_override_to_proto(self.versioning_override) + versioning_override_to_proto(value.versioning_override) ) - if self.start_delay is not None: - message.workflow_start_delay.CopyFrom(duration_to_proto(self.start_delay)) - if self.user_metadata is not None: - message.user_metadata.CopyFrom(self.user_metadata.to_proto()) - message.namespace = workflow_namespace() + if value.start_delay is not None: + message.workflow_start_delay.CopyFrom(duration_to_proto(value.start_delay)) + if value.user_metadata is not None: + message.user_metadata.CopyFrom( + _UserMetadataTransferTypeConverter().to_transfer_type( + value.user_metadata + ) + ) + message.namespace = value.namespace return message +_ = temporalio.converter.transfer_type_convertible( + _SignalWithStartWorkflowRequestTransferTypeConverter +)(SignalWithStartWorkflowRequest) + + @dataclasses.dataclass(slots=True) class UserMetadata: static_summary: typing.Any | None = None static_details: typing.Any | None = None - @classmethod - def from_proto( - cls, - proto: temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata, + +class _UserMetadataTransferTypeConverter( + temporalio.converter.TransferTypeConverter[ + UserMetadata, temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata + ] +): + transfer_type: type[temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata] | None = ( + temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata + ) + + @typing_extensions.override + def from_transfer_type( + self, + value: temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata, + type_hint: type[UserMetadata], ) -> UserMetadata: - return cls( - static_summary=payload_from_proto(proto.summary) - if proto.HasField("summary") + return UserMetadata( + static_summary=payload_from_proto(value.summary) + if value.HasField("summary") else None, - static_details=payload_from_proto(proto.details) - if proto.HasField("details") + static_details=payload_from_proto(value.details) + if value.HasField("details") else None, ) - def to_proto(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: + @typing_extensions.override + def to_transfer_type( + self, + value: UserMetadata, + ) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: message = temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata() - if self.static_summary is not None: - message.summary.CopyFrom(payload_to_proto(self.static_summary)) - if self.static_details is not None: - message.details.CopyFrom(payload_to_proto(self.static_details)) + if value.static_summary is not None: + message.summary.CopyFrom(payload_to_proto(value.static_summary)) + if value.static_details is not None: + message.details.CopyFrom(payload_to_proto(value.static_details)) + return message + + +_ = temporalio.converter.transfer_type_convertible(_UserMetadataTransferTypeConverter)( + UserMetadata +) + + +@dataclasses.dataclass(slots=True) +class SignalWithStartWorkflowResponse: + """ + .. warning:: + This API is experimental and subject to change. + """ + + run_id: str | None = None + started: bool | None = None + + +class _SignalWithStartWorkflowResponseTransferTypeConverter( + temporalio.converter.TransferTypeConverter[ + SignalWithStartWorkflowResponse, + temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, + ] +): + transfer_type: ( + type[ + temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse + ] + | None + ) = temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse + + @typing_extensions.override + def from_transfer_type( + self, + value: temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, + type_hint: type[SignalWithStartWorkflowResponse], + ) -> SignalWithStartWorkflowResponse: + return SignalWithStartWorkflowResponse( + run_id=value.run_id if bool(value.run_id) else None, + started=value.started if bool(value.started) else None, + ) + + @typing_extensions.override + def to_transfer_type( + self, + value: SignalWithStartWorkflowResponse, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse: + message = temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse() + if value.run_id is not None: + message.run_id = value.run_id + if value.started is not None: + message.started = value.started return message + + +_ = temporalio.converter.transfer_type_convertible( + _SignalWithStartWorkflowResponseTransferTypeConverter +)(SignalWithStartWorkflowResponse) diff --git a/temporalio/nexus/system/workflow_service/operations/__init__.py b/temporalio/nexus/system/workflow_service/operations/__init__.py index 67c9cc56b..28d71c338 100644 --- a/temporalio/nexus/system/workflow_service/operations/__init__.py +++ b/temporalio/nexus/system/workflow_service/operations/__init__.py @@ -1,3 +1,3 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations diff --git a/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py b/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py index 0865e5a88..9060fc11c 100644 --- a/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py +++ b/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py @@ -1,4 +1,4 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations @@ -8,7 +8,6 @@ import typing_extensions -import temporalio.api.workflowservice.v1.request_response_pb2 import temporalio.common if typing.TYPE_CHECKING: @@ -16,6 +15,7 @@ from ..models import ( SignalWithStartWorkflowRequest, + SignalWithStartWorkflowResponse, UserMetadata, ) @@ -33,15 +33,14 @@ async def _signal_with_start_workflow( get_external_workflow_handle, ) - request_proto = request.to_proto() nexus_client = create_nexus_client( service="temporal.api.workflowservice.v1.WorkflowService", endpoint="__temporal_system", ) handle = await nexus_client.start_operation( operation="SignalWithStartWorkflowExecution", - input=request_proto, - output_type=temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, + input=request, + output_type=SignalWithStartWorkflowResponse, ) result = await handle return get_external_workflow_handle(request.id, run_id=result.run_id) @@ -77,17 +76,17 @@ async def signal_with_start_workflow( # Overload case: -# - workflow name with optional list-form workflow arguments -# - signal name with optional list-form signal arguments +# - workflow name with positional workflow arguments +# - signal method callable with no signal arguments @typing.overload async def signal_with_start_workflow( workflow: str, - *, - args: list[typing.Any] | None = ..., + *args: object, id: str, task_queue: str, - signal: str, - signal_args: list[typing.Any] | None = ..., + signal: collections.abc.Callable[ + [SelfType], None | collections.abc.Awaitable[None] + ], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -103,23 +102,22 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[object]: ... +) -> ExternalWorkflowHandle[SelfType]: ... # Overload case: -# - workflow method callable with typed positional workflow arguments -# - signal name with optional list-form signal arguments +# - workflow name with positional workflow arguments +# - signal method callable with a typed single signal arguments @typing.overload async def signal_with_start_workflow( - workflow: collections.abc.Callable[ - [SelfType, typing_extensions.Unpack[WorkflowArgs]], - collections.abc.Awaitable[WorkflowResult], - ], - *args: typing_extensions.Unpack[WorkflowArgs], + workflow: str, + *args: object, id: str, task_queue: str, - signal: str, - signal_args: list[typing.Any] | None = ..., + signal: collections.abc.Callable[ + [SelfType, SignalArg], None | collections.abc.Awaitable[None] + ], + signal_args: SignalArg, execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -139,20 +137,16 @@ async def signal_with_start_workflow( # Overload case: -# - workflow method callable with list-form workflow arguments -# - signal name with optional list-form signal arguments +# - workflow name with positional workflow arguments +# - signal callable with list-form signal arguments @typing.overload async def signal_with_start_workflow( - workflow: collections.abc.Callable[ - [SelfType, typing_extensions.Unpack[WorkflowArgs]], - collections.abc.Awaitable[WorkflowResult], - ], - *, - args: list[typing.Any], + workflow: str, + *args: object, id: str, task_queue: str, - signal: str, - signal_args: list[typing.Any] | None = ..., + signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], + signal_args: list[typing.Any], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -168,21 +162,21 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[SelfType]: ... +) -> ExternalWorkflowHandle[object]: ... # Overload case: -# - workflow name with positional workflow arguments -# - signal method callable with no signal arguments +# - workflow name with optional list-form workflow arguments +# - signal name with optional list-form signal arguments @typing.overload async def signal_with_start_workflow( workflow: str, - *args: object, + *, + args: list[typing.Any] | None = ..., id: str, task_queue: str, - signal: collections.abc.Callable[ - [SelfType], None | collections.abc.Awaitable[None] - ], + signal: str, + signal_args: list[typing.Any] | None = ..., execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -198,7 +192,7 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[SelfType]: ... +) -> ExternalWorkflowHandle[object]: ... # Overload case: @@ -233,20 +227,19 @@ async def signal_with_start_workflow( # Overload case: -# - workflow method callable with typed positional workflow arguments -# - signal method callable with no signal arguments +# - workflow name with optional list-form workflow arguments +# - signal method callable with a typed single signal arguments @typing.overload async def signal_with_start_workflow( - workflow: collections.abc.Callable[ - [SelfType, typing_extensions.Unpack[WorkflowArgs]], - collections.abc.Awaitable[WorkflowResult], - ], - *args: typing_extensions.Unpack[WorkflowArgs], + workflow: str, + *, + args: list[typing.Any] | None = ..., id: str, task_queue: str, signal: collections.abc.Callable[ - [SelfType], None | collections.abc.Awaitable[None] + [SelfType, SignalArg], None | collections.abc.Awaitable[None] ], + signal_args: SignalArg, execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -266,21 +259,17 @@ async def signal_with_start_workflow( # Overload case: -# - workflow method callable with list-form workflow arguments -# - signal method callable with no signal arguments +# - workflow name with optional list-form workflow arguments +# - signal callable with list-form signal arguments @typing.overload async def signal_with_start_workflow( - workflow: collections.abc.Callable[ - [SelfType, typing_extensions.Unpack[WorkflowArgs]], - collections.abc.Awaitable[WorkflowResult], - ], + workflow: str, *, - args: list[typing.Any], + args: list[typing.Any] | None = ..., id: str, task_queue: str, - signal: collections.abc.Callable[ - [SelfType], None | collections.abc.Awaitable[None] - ], + signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], + signal_args: list[typing.Any], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -296,22 +285,23 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[SelfType]: ... +) -> ExternalWorkflowHandle[object]: ... # Overload case: -# - workflow name with positional workflow arguments -# - signal method callable with a typed single signal arguments +# - workflow method callable with typed positional workflow arguments +# - signal name with optional list-form signal arguments @typing.overload async def signal_with_start_workflow( - workflow: str, - *args: object, + workflow: collections.abc.Callable[ + [SelfType, typing_extensions.Unpack[WorkflowArgs]], + collections.abc.Awaitable[WorkflowResult], + ], + *args: typing_extensions.Unpack[WorkflowArgs], id: str, task_queue: str, - signal: collections.abc.Callable[ - [SelfType, SignalArg], None | collections.abc.Awaitable[None] - ], - signal_args: SignalArg, + signal: str, + signal_args: list[typing.Any] | None = ..., execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -331,19 +321,20 @@ async def signal_with_start_workflow( # Overload case: -# - workflow name with optional list-form workflow arguments -# - signal method callable with a typed single signal arguments +# - workflow method callable with typed positional workflow arguments +# - signal method callable with no signal arguments @typing.overload async def signal_with_start_workflow( - workflow: str, - *, - args: list[typing.Any] | None = ..., + workflow: collections.abc.Callable[ + [SelfType, typing_extensions.Unpack[WorkflowArgs]], + collections.abc.Awaitable[WorkflowResult], + ], + *args: typing_extensions.Unpack[WorkflowArgs], id: str, task_queue: str, signal: collections.abc.Callable[ - [SelfType, SignalArg], None | collections.abc.Awaitable[None] + [SelfType], None | collections.abc.Awaitable[None] ], - signal_args: SignalArg, execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -397,22 +388,19 @@ async def signal_with_start_workflow( # Overload case: -# - workflow method callable with list-form workflow arguments -# - signal method callable with a typed single signal arguments +# - workflow method callable with typed positional workflow arguments +# - signal callable with list-form signal arguments @typing.overload async def signal_with_start_workflow( workflow: collections.abc.Callable[ [SelfType, typing_extensions.Unpack[WorkflowArgs]], collections.abc.Awaitable[WorkflowResult], ], - *, - args: list[typing.Any], + *args: typing_extensions.Unpack[WorkflowArgs], id: str, task_queue: str, - signal: collections.abc.Callable[ - [SelfType, SignalArg], None | collections.abc.Awaitable[None] - ], - signal_args: SignalArg, + signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], + signal_args: list[typing.Any], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -432,16 +420,20 @@ async def signal_with_start_workflow( # Overload case: -# - workflow name with positional workflow arguments -# - signal callable with list-form signal arguments +# - workflow method callable with list-form workflow arguments +# - signal name with optional list-form signal arguments @typing.overload async def signal_with_start_workflow( - workflow: str, - *args: object, + workflow: collections.abc.Callable[ + [SelfType, typing_extensions.Unpack[WorkflowArgs]], + collections.abc.Awaitable[WorkflowResult], + ], + *, + args: list[typing.Any], id: str, task_queue: str, - signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], - signal_args: list[typing.Any], + signal: str, + signal_args: list[typing.Any] | None = ..., execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -457,21 +449,25 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[object]: ... +) -> ExternalWorkflowHandle[SelfType]: ... # Overload case: -# - workflow name with optional list-form workflow arguments -# - signal callable with list-form signal arguments +# - workflow method callable with list-form workflow arguments +# - signal method callable with no signal arguments @typing.overload async def signal_with_start_workflow( - workflow: str, + workflow: collections.abc.Callable[ + [SelfType, typing_extensions.Unpack[WorkflowArgs]], + collections.abc.Awaitable[WorkflowResult], + ], *, - args: list[typing.Any] | None = ..., + args: list[typing.Any], id: str, task_queue: str, - signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], - signal_args: list[typing.Any], + signal: collections.abc.Callable[ + [SelfType], None | collections.abc.Awaitable[None] + ], execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -487,23 +483,26 @@ async def signal_with_start_workflow( start_delay: datetime.timedelta | None = ..., static_summary: str | None = ..., static_details: str | None = ..., -) -> ExternalWorkflowHandle[object]: ... +) -> ExternalWorkflowHandle[SelfType]: ... # Overload case: -# - workflow method callable with typed positional workflow arguments -# - signal callable with list-form signal arguments +# - workflow method callable with list-form workflow arguments +# - signal method callable with a typed single signal arguments @typing.overload async def signal_with_start_workflow( workflow: collections.abc.Callable[ [SelfType, typing_extensions.Unpack[WorkflowArgs]], collections.abc.Awaitable[WorkflowResult], ], - *args: typing_extensions.Unpack[WorkflowArgs], + *, + args: list[typing.Any], id: str, task_queue: str, - signal: collections.abc.Callable[..., None | collections.abc.Awaitable[None]], - signal_args: list[typing.Any], + signal: collections.abc.Callable[ + [SelfType, SignalArg], None | collections.abc.Awaitable[None] + ], + signal_args: SignalArg, execution_timeout: datetime.timedelta | None = ..., run_timeout: datetime.timedelta | None = ..., task_timeout: datetime.timedelta | None = ..., @@ -629,6 +628,11 @@ async def signal_with_start_workflow( Returns: A workflow handle to the started workflow. """ + if positional_args and args is not None: + raise TypeError("cannot specify both positional arguments and args") + normalized_args: list[typing.Any] | None = ( + list(positional_args) if positional_args else args + ) normalized_signal_args: list[typing.Any] | None if signal_args is None: normalized_signal_args = None @@ -636,11 +640,6 @@ async def signal_with_start_workflow( normalized_signal_args = typing.cast(list[typing.Any], signal_args) else: normalized_signal_args = [signal_args] - if positional_args and args is not None: - raise TypeError("cannot specify both positional arguments and args") - normalized_args: list[typing.Any] | None = ( - list(positional_args) if positional_args else args - ) user_metadata = ( None if static_summary is None and static_details is None diff --git a/temporalio/nexus/system/workflow_service/service.py b/temporalio/nexus/system/workflow_service/services.py similarity index 58% rename from temporalio/nexus/system/workflow_service/service.py rename to temporalio/nexus/system/workflow_service/services.py index 7ce5849ca..c538493e1 100644 --- a/temporalio/nexus/system/workflow_service/service.py +++ b/temporalio/nexus/system/workflow_service/services.py @@ -1,10 +1,13 @@ -# Generated by nex-gen. DO NOT EDIT! +# Generated by nexgen v0.2.4. DO NOT EDIT! from __future__ import annotations from nexusrpc import Operation, service -import temporalio.api.workflowservice.v1.request_response_pb2 +from .models import ( + SignalWithStartWorkflowRequest, + SignalWithStartWorkflowResponse, +) @service(name="temporal.api.workflowservice.v1.WorkflowService") @@ -16,6 +19,6 @@ class WorkflowService: # .. warning:: This API is experimental and subject to change. signal_with_start_workflow: Operation[ - temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, - temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, + SignalWithStartWorkflowRequest, + SignalWithStartWorkflowResponse, ] = Operation(name="SignalWithStartWorkflowExecution") diff --git a/tests/nexus/test_temporal_system_nexus.py b/tests/nexus/test_temporal_system_nexus.py index b6c711128..dfa466500 100644 --- a/tests/nexus/test_temporal_system_nexus.py +++ b/tests/nexus/test_temporal_system_nexus.py @@ -14,6 +14,7 @@ import temporalio.api.workflowservice.v1.request_response_pb2 as workflowservice_pb2 import temporalio.converter import temporalio.nexus.system as nexus_system +import temporalio.nexus.system.workflow_service.models as workflow_service_models from temporalio import workflow from temporalio.bridge._visitor import PayloadVisitor from temporalio.bridge._visitor_functions import VisitorFunctions @@ -137,12 +138,12 @@ def _assert_start_nexus_operation_interceptor_trace() -> None: assert trace_name == "workflow.start_nexus_operation" trace_input = cast(StartNexusOperationInput[Any, Any], trace_value) request = cast( - workflowservice_pb2.SignalWithStartWorkflowExecutionRequest, + workflow_service_models.SignalWithStartWorkflowRequest, trace_input.input, ) - assert request.workflow_id == "system-nexus-workflow-id" - assert request.signal_name == "test-signal" - assert request.workflow_type.name == "test-workflow" + assert request.id == "system-nexus-workflow-id" + assert request.signal == "test-signal" + assert request.workflow == "test-workflow" class _MarkingPayloadVisitor(VisitorFunctions): From becb88119da41f1dd58f2795394420fb626079e3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:59:15 -0700 Subject: [PATCH 564/831] Repinned Core to the reviewed external repairs head. The pin moves off the mfateev branch onto moedash/sdk-rust, whose head carries the stream protos, so the vendored temporalio/api regenerates byte-for-byte from it and the check-protos job passes. The script that stages the api branch over the pin stays for the next time the two diverge. --- .gitmodules | 4 +- scripts/gen_stream_api_protos.py | 101 ++ temporalio/api/command/v1/__init__.py | 4 + temporalio/api/command/v1/message_pb2.py | 117 +- temporalio/api/command/v1/message_pb2.pyi | 105 ++ temporalio/api/enums/v1/command_type_pb2.py | 6 +- temporalio/api/enums/v1/command_type_pb2.pyi | 4 + temporalio/api/enums/v1/event_type_pb2.py | 6 +- temporalio/api/enums/v1/event_type_pb2.pyi | 20 + temporalio/api/enums/v1/failed_cause_pb2.py | 27 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 30 + temporalio/api/history/v1/__init__.py | 4 + temporalio/api/history/v1/message_pb2.py | 301 +++-- temporalio/api/history/v1/message_pb2.pyi | 131 ++ temporalio/api/stream/__init__.py | 0 temporalio/api/stream/v1/__init__.py | 8 + temporalio/api/stream/v1/message_pb2.py | 95 ++ temporalio/api/stream/v1/message_pb2.pyi | 267 ++++ .../v1/request_response_pb2.py | 1125 +++++++++-------- .../v1/request_response_pb2.pyi | 17 + temporalio/bridge/sdk-core | 2 +- 21 files changed, 1620 insertions(+), 754 deletions(-) create mode 100644 scripts/gen_stream_api_protos.py create mode 100644 temporalio/api/stream/__init__.py create mode 100644 temporalio/api/stream/v1/__init__.py create mode 100644 temporalio/api/stream/v1/message_pb2.py create mode 100644 temporalio/api/stream/v1/message_pb2.pyi diff --git a/.gitmodules b/.gitmodules index 0c2f5d5bf..ca2f7cff0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "sdk-core"] path = temporalio/bridge/sdk-core - url = https://github.com/mfateev/sdk-core.git - branch = task/python-sdk-streaming + url = https://github.com/moedash/sdk-rust.git + branch = moe/AI-198-external-core-repairs diff --git a/scripts/gen_stream_api_protos.py b/scripts/gen_stream_api_protos.py new file mode 100644 index 000000000..eeb7bb350 --- /dev/null +++ b/scripts/gen_stream_api_protos.py @@ -0,0 +1,101 @@ +"""Regenerate the stream additions to the vendored public API protos. + +The stream protos live on a branch of the api repo that the Core submodule +does not pin yet. Regenerating everything from that branch would also pull in +whatever else moved on the api main line since the pin, so this stages the +API protos the submodule pins, applies the branch's own diff on top, and +regenerates only the files that diff touches. Every other module under +``temporalio/api`` stays byte-identical. + + uv run --python 3.10 --no-project --with "grpcio-tools==1.48.2" \\ + --with "mypy-protobuf==3.3.0" --with "protobuf<4" \\ + scripts/gen_stream_api_protos.py /path/to/api origin/main..origin/ + +The toolchain pins match ``scripts/_proto/Dockerfile``. Generated code refuses +to load on a protobuf runtime older than the one it was built against, and +these modules end up in applications that pin protobuf themselves. Run +``uv run poe format`` afterwards, as the ``gen-protos`` task does. +""" + +from __future__ import annotations + +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +BASE = Path(__file__).parent.parent +sys.path.insert(0, str(BASE / "scripts")) + +import gen_protos # noqa: E402 + +API_OUT = BASE / "temporalio" / "api" + + +def main() -> None: + if len(sys.argv) != 3: + sys.exit("usage: gen_stream_api_protos.py /path/to/api-checkout ..") + api = Path(sys.argv[1]).resolve() + revisions = sys.argv[2] + diff = subprocess.run( + ["git", "-C", str(api), "diff", revisions, "--", "temporal/"], + check=True, + capture_output=True, + text=True, + ).stdout + touched = subprocess.run( + ["git", "-C", str(api), "diff", "--name-only", revisions, "--", "temporal/"], + check=True, + capture_output=True, + text=True, + ).stdout.split() + if not touched: + sys.exit(f"{revisions} touches no proto under temporal/") + + with tempfile.TemporaryDirectory() as tmp: + stage = Path(tmp) / "stage" + shutil.copytree(gen_protos.api_proto_dir / "temporal", stage / "temporal") + subprocess.run( + ["patch", "-p1", "--silent"], + check=True, + cwd=stage, + input=diff, + text=True, + ) + out = Path(tmp) / "out" + out.mkdir() + subprocess.check_call( + [ + sys.executable, + "-mgrpc_tools.protoc", + f"--proto_path={stage}", + f"--python_out={out}", + f"--mypy_out={out}", + *touched, + ] + ) + packages: set[Path] = set() + for proto in touched: + relative = Path(proto).relative_to("temporal/api").with_suffix("") + for suffix in ("_pb2.py", "_pb2.pyi"): + generated = ( + out + / "temporal" + / "api" + / relative.with_name(relative.name + suffix) + ) + target = API_OUT / relative.with_name(relative.name + suffix) + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(generated, target) + print(f"wrote {target.relative_to(BASE)}") + packages.add(target.parent) + + for package in sorted(packages): + (package.parent / "__init__.py").touch() + gen_protos.fix_generated_output(package) + print(f"rewrote {(package / '__init__.py').relative_to(BASE)}") + + +if __name__ == "__main__": + main() diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index e0ce8f712..d1b241274 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -1,4 +1,5 @@ from .message_pb2 import ( + AppendStreamRecordsCommandAttributes, CancelTimerCommandAttributes, CancelWorkflowExecutionCommandAttributes, Command, @@ -16,10 +17,12 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) __all__ = [ + "AppendStreamRecordsCommandAttributes", "CancelTimerCommandAttributes", "CancelWorkflowExecutionCommandAttributes", "Command", @@ -37,5 +40,6 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index ad004ae03..8c36c1f7b 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -42,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\x87\x12\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x42\x0c\n\nattributesB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x42\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -106,6 +109,12 @@ "RequestCancelNexusOperationCommandAttributes" ] _COMMAND = DESCRIPTOR.message_types_by_name["Command"] +_APPENDSTREAMRECORDSCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "AppendStreamRecordsCommandAttributes" +] +_SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeStreamCommandAttributes" +] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", (_message.Message,), @@ -332,6 +341,28 @@ ) _sym_db.RegisterMessage(Command) +AppendStreamRecordsCommandAttributes = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecordsCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _APPENDSTREAMRECORDSCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.AppendStreamRecordsCommandAttributes) + }, +) +_sym_db.RegisterMessage(AppendStreamRecordsCommandAttributes) + +SubscribeStreamCommandAttributes = _reflection.GeneratedProtocolMessageType( + "SubscribeStreamCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAMCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeStreamCommandAttributes) + }, +) +_sym_db.RegisterMessage(SubscribeStreamCommandAttributes) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\032io.temporal.api.command.v1B\014MessageProtoP\001Z%go.temporal.io/api/command/v1;command\252\002\031Temporalio.Api.Command.V1\352\002\034Temporalio::Api::Command::V1" @@ -383,44 +414,48 @@ _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_options = ( b"8\001" ) - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 424 - _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1118 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1120 - _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1192 - _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1194 - _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1299 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1301 - _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1395 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1397 - _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1488 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1490 - _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1538 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1540 - _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1633 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1636 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1819 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1822 - _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2125 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2127 - _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2245 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2247 - _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2343 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2346 - _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2665 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2585 - _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2665 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2668 - _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3608 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3611 - _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4615 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4617 - _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4671 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4674 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5157 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5107 - _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5157 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5159 - _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5233 - _COMMAND._serialized_start = 5236 - _COMMAND._serialized_end = 7547 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 462 + _SCHEDULEACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1156 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_start = 1158 + _REQUESTCANCELACTIVITYTASKCOMMANDATTRIBUTES._serialized_end = 1230 + _STARTTIMERCOMMANDATTRIBUTES._serialized_start = 1232 + _STARTTIMERCOMMANDATTRIBUTES._serialized_end = 1337 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1339 + _COMPLETEWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1433 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1435 + _FAILWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1526 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_start = 1528 + _CANCELTIMERCOMMANDATTRIBUTES._serialized_end = 1576 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1578 + _CANCELWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1671 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1674 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 1857 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 1860 + _SIGNALEXTERNALWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 2163 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_start = 2165 + _UPSERTWORKFLOWSEARCHATTRIBUTESCOMMANDATTRIBUTES._serialized_end = 2283 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_start = 2285 + _MODIFYWORKFLOWPROPERTIESCOMMANDATTRIBUTES._serialized_end = 2381 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_start = 2384 + _RECORDMARKERCOMMANDATTRIBUTES._serialized_end = 2703 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_start = 2623 + _RECORDMARKERCOMMANDATTRIBUTES_DETAILSENTRY._serialized_end = 2703 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 2706 + _CONTINUEASNEWWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 3646 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_start = 3649 + _STARTCHILDWORKFLOWEXECUTIONCOMMANDATTRIBUTES._serialized_end = 4653 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_start = 4655 + _PROTOCOLMESSAGECOMMANDATTRIBUTES._serialized_end = 4709 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 4712 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5195 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 5145 + _SCHEDULENEXUSOPERATIONCOMMANDATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 5195 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 + _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 + _COMMAND._serialized_start = 5274 + _COMMAND._serialized_end = 7806 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7808 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7920 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7922 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 7997 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 18d0abc8b..f623eecfd 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -18,6 +18,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1119,6 +1120,8 @@ class Command(google.protobuf.message.Message): MODIFY_WORKFLOW_PROPERTIES_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1209,6 +1212,14 @@ class Command(google.protobuf.message.Message): def request_cancel_nexus_operation_command_attributes( self, ) -> global___RequestCancelNexusOperationCommandAttributes: ... + @property + def append_stream_records_command_attributes( + self, + ) -> global___AppendStreamRecordsCommandAttributes: ... + @property + def subscribe_stream_command_attributes( + self, + ) -> global___SubscribeStreamCommandAttributes: ... def __init__( self, *, @@ -1253,10 +1264,16 @@ class Command(google.protobuf.message.Message): | None = ..., request_cancel_nexus_operation_command_attributes: global___RequestCancelNexusOperationCommandAttributes | None = ..., + append_stream_records_command_attributes: global___AppendStreamRecordsCommandAttributes + | None = ..., + subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "append_stream_records_command_attributes", + b"append_stream_records_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1291,6 +1308,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1300,6 +1319,8 @@ class Command(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "append_stream_records_command_attributes", + b"append_stream_records_command_attributes", "attributes", b"attributes", "cancel_timer_command_attributes", @@ -1338,6 +1359,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_stream_command_attributes", + b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1365,8 +1388,90 @@ class Command(google.protobuf.message.Message): "modify_workflow_properties_command_attributes", "schedule_nexus_operation_command_attributes", "request_cancel_nexus_operation_command_attributes", + "append_stream_records_command_attributes", + "subscribe_stream_command_attributes", ] | None ): ... global___Command = Command + +class AppendStreamRecordsCommandAttributes(google.protobuf.message.Message): + """Appends records to a stream the Workflow owns. Applied inside the Workflow + Task's own commit. Produces one `WorkflowStreamRecordsAppended` event + carrying the offset range and none of the payload; it schedules no further + work. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Empty means the Workflow's default output stream.""" + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: + """Stored in order. The server sets `producer_id` to empty on each record, + because the owning Workflow is the producer here. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "records", b"records", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___AppendStreamRecordsCommandAttributes = AppendStreamRecordsCommandAttributes + +class SubscribeStreamCommandAttributes(google.protobuf.message.Message): + """Subscribe this Workflow to a stream, so later Workflow Tasks carry the ranges + it has not consumed yet. + + The stream's addressing is resolved by the server rather than supplied here. + A Workflow cannot look it up without doing I/O, and a value it carried would + be a reading rather than a fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Stream to consume. A stream in another execution is addressed by its id; + one this Workflow owns is addressed by the name it was published under. + The server resolves an owned name first and falls back to a standalone + id, so a Workflow that owns a stream under this name cannot reach a + standalone stream with the same id. + """ + start_offset: builtins.int + """Where to start. Negative means from wherever the stream is when the + subscription is registered, which the server resolves and records so + replay does not resolve it again. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", b"start_offset", "stream_id", b"stream_id" + ], + ) -> None: ... + +global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 6d1c3b6e5..17f70d8a6 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x9c\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe7\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -39,11 +39,13 @@ COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES = 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION = 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 +COMMAND_TYPE_APPEND_STREAM_RECORDS = 19 +COMMAND_TYPE_SUBSCRIBE_STREAM = 20 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 864 + _COMMANDTYPE._serialized_end = 939 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 9f1bfd240..c6f21ab4b 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -44,6 +44,8 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: _CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: _CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 + COMMAND_TYPE_APPEND_STREAM_RECORDS: _CommandType.ValueType # 19 + COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -66,4 +68,6 @@ COMMAND_TYPE_PROTOCOL_MESSAGE: CommandType.ValueType # 14 COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES: CommandType.ValueType # 16 COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 +COMMAND_TYPE_APPEND_STREAM_RECORDS: CommandType.ValueType # 19 +COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 14ff7984d..a41b486ee 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\x9e\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -82,11 +82,13 @@ EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58 EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59 EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 +EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED = 62 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 2912 + _EVENTTYPE._serialized_end = 3004 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 16a23b137..84db38b61 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -216,6 +216,16 @@ class _EventTypeEnumTypeWrapper( """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: _EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" + EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: _EventType.ValueType # 61 + """A Workflow subscribed to a stream. Recorded once per subscription, not + per record: the offsets a task consumed ride WorkflowTaskCompleted and + the payloads never enter History at all. + """ + EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: _EventType.ValueType # 62 + """A Workflow appended a batch of records to a stream. Recorded per + batch, and carrying only the offset range it landed at: the bodies go to + the stream's own log, never into History. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -408,4 +418,14 @@ EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: EventType.ValueType # 59 """An event that indicates that the previously paused workflow execution has been unpaused.""" EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED: EventType.ValueType # 60 """An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.""" +EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED: EventType.ValueType # 61 +"""A Workflow subscribed to a stream. Recorded once per subscription, not +per record: the offsets a task consumed ride WorkflowTaskCompleted and +the payloads never enter History at all. +""" +EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: EventType.ValueType # 62 +"""A Workflow appended a batch of records to a stream. Recorded per +batch, and carrying only the offset range it landed at: the bodies go to +the stream's own log, never into History. +""" global___EventType = EventType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 03eb094f9..70229ee81 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x90\x14\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _WORKFLOWTASKFAILEDCAUSE = DESCRIPTOR.enum_types_by_name["WorkflowTaskFailedCause"] @@ -86,6 +86,9 @@ WORKFLOW_TASK_FAILED_CAUSE_EXTERNAL_STORAGE_FAILURE = 38 WORKFLOW_TASK_FAILED_CAUSE_WORKFLOW_PAUSE_REQUESTED_BEFORE_TASK_STARTED = 39 WORKFLOW_TASK_FAILED_CAUSE_REQUEST_TOO_LARGE = 40 +WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES = 41 +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES = 42 +WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE = 43 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS = 1 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND = 2 @@ -117,15 +120,15 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020FailedCauseProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _WORKFLOWTASKFAILEDCAUSE._serialized_start = 68 - _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2644 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2647 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 2967 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2970 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3243 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3246 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3600 - _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3603 - _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4138 - _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4141 - _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4284 + _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2834 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2837 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3157 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3160 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3433 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3436 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3790 + _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3793 + _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4328 + _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4331 + _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4474 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.pyi b/temporalio/api/enums/v1/failed_cause_pb2.pyi index be1c22442..c90da0713 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.pyi +++ b/temporalio/api/enums/v1/failed_cause_pb2.pyi @@ -188,6 +188,21 @@ class _WorkflowTaskFailedCauseEnumTypeWrapper( _WorkflowTaskFailedCause.ValueType ) # 40 """A workflow task failed because the request exceeded a size limit.""" + WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 41 + """A workflow task completed with an invalid AppendStreamRecords command.""" + WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 42 + """A workflow task completed with an invalid SubscribeStream command.""" + WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( + _WorkflowTaskFailedCause.ValueType + ) # 43 + """A workflow task could not be started because a stream range it consumed and recorded in + History can no longer be served, for example after truncation or because it exceeds the + replay bound. Check the workflow task failure message for more information. + """ class WorkflowTaskFailedCause( _WorkflowTaskFailedCause, metaclass=_WorkflowTaskFailedCauseEnumTypeWrapper @@ -346,6 +361,21 @@ WORKFLOW_TASK_FAILED_CAUSE_WORKFLOW_PAUSE_REQUESTED_BEFORE_TASK_STARTED: ( """A workflow task is failed because the workflow is paused before the task is started.""" WORKFLOW_TASK_FAILED_CAUSE_REQUEST_TOO_LARGE: WorkflowTaskFailedCause.ValueType # 40 """A workflow task failed because the request exceeded a size limit.""" +WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 41 +"""A workflow task completed with an invalid AppendStreamRecords command.""" +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 42 +"""A workflow task completed with an invalid SubscribeStream command.""" +WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( + WorkflowTaskFailedCause.ValueType +) # 43 +"""A workflow task could not be started because a stream range it consumed and recorded in +History can no longer be served, for example after truncation or because it exceeds the +replay bound. Check the workflow task failure message for more information. +""" global___WorkflowTaskFailedCause = WorkflowTaskFailedCause class _StartChildWorkflowExecutionFailedCause: diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index ec7f65962..13d56f93a 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -57,6 +57,8 @@ WorkflowExecutionUpdateRejectedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, + WorkflowStreamRecordsAppendedEventAttributes, + WorkflowStreamSubscribedEventAttributes, WorkflowTaskCompletedEventAttributes, WorkflowTaskFailedEventAttributes, WorkflowTaskScheduledEventAttributes, @@ -123,6 +125,8 @@ "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", + "WorkflowStreamRecordsAppendedEventAttributes", + "WorkflowStreamSubscribedEventAttributes", "WorkflowTaskCompletedEventAttributes", "WorkflowTaskFailedEventAttributes", "WorkflowTaskScheduledEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index ac337b708..14b3cbfb9 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -47,6 +47,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -58,7 +61,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\x82\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xca?\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -215,6 +218,12 @@ _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "ActivityPropertiesModifiedExternallyEventAttributes" ] +_WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamSubscribedEventAttributes" +] +_WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "WorkflowStreamRecordsAppendedEventAttributes" +] _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionUpdateAcceptedEventAttributes" ] @@ -819,6 +828,28 @@ ) _sym_db.RegisterMessage(ActivityPropertiesModifiedExternallyEventAttributes) +WorkflowStreamSubscribedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamSubscribedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) + +WorkflowStreamRecordsAppendedEventAttributes = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamRecordsAppendedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributes) + }, +) +_sym_db.RegisterMessage(WorkflowStreamRecordsAppendedEventAttributes) + WorkflowExecutionUpdateAcceptedEventAttributes = ( _reflection.GeneratedProtocolMessageType( "WorkflowExecutionUpdateAcceptedEventAttributes", @@ -1210,140 +1241,144 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 663 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3057 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3060 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3196 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3199 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3364 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3367 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3586 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3589 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3717 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3720 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4653 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4656 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4828 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4831 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5247 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5250 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5892 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 5895 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6044 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6047 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6438 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6441 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7147 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7150 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7436 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7439 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7671 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7674 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 7960 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 7963 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8161 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8163 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8277 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8280 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8554 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8557 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8704 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8706 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8777 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8780 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 8914 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8917 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9116 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9119 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9254 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9257 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9618 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9538 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9618 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9621 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 9940 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 9943 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10072 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10075 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5999 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6002 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6151 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6154 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6545 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6548 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7254 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7257 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7543 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7546 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7778 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7781 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8067 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8070 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8268 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8270 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8384 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8387 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8661 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8664 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8811 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8813 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8884 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8887 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9021 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9024 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9223 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9226 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9361 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9364 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9725 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9645 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9725 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9728 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10047 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10050 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10179 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10182 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10359 + 10466 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10362 + 10469 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10708 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10711 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 10908 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10911 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11290 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11293 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11632 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11635 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11846 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11849 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12007 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12010 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12148 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12151 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13427 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13430 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13772 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13775 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14070 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14073 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14398 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14401 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14780 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14783 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15108 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15111 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15441 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15444 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15720 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15723 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16453 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16303 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16453 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16456 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16776 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16779 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16923 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 16926 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17146 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17319 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17322 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17593 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17596 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 17760 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 17762 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 17856 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 17858 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 17954 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 17957 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18154 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18157 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 18721 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 18671 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 18721 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 18724 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 18861 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 18864 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19001 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19004 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19140 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19143 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19281 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19284 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19422 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19424 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19540 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19543 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 19694 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 19697 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 19896 - _HISTORYEVENT._serialized_start = 19899 - _HISTORYEVENT._serialized_end = 28037 - _HISTORY._serialized_start = 28039 - _HISTORY._serialized_end = 28103 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10815 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10818 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11015 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11018 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11397 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11400 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11739 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11742 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11953 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11956 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12114 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12117 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12255 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12258 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13534 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13537 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13879 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13882 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14177 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14180 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14505 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14508 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14887 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14890 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15215 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15218 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15548 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15551 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15827 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15830 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16560 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16410 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16560 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16563 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16883 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16886 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17030 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17032 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17156 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17159 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17310 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17313 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17533 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17536 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17706 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17709 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17980 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17983 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18147 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18149 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18243 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18245 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18341 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18344 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18541 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18544 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19108 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19058 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19108 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19111 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19248 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19251 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19388 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19391 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19527 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19530 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19668 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19671 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19809 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19811 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19927 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19930 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20081 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20084 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20283 + _HISTORYEVENT._serialized_start = 20286 + _HISTORYEVENT._serialized_end = 28678 + _HISTORY._serialized_start = 28680 + _HISTORY._serialized_end = 28744 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 783e9d3b6..bc708a6cb 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -23,6 +23,7 @@ import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.workflow.v1.message_pb2 @@ -1010,6 +1011,7 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): WORKER_DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int WORKER_DEPLOYMENT_NAME_FIELD_NUMBER: builtins.int DEPLOYMENT_VERSION_FIELD_NUMBER: builtins.int + CONSUMED_STREAM_RANGES_FIELD_NUMBER: builtins.int scheduled_event_id: builtins.int """The id of the `WORKFLOW_TASK_SCHEDULED` event this task corresponds to""" started_event_id: builtins.int @@ -1069,6 +1071,18 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): """The Worker Deployment Version that completed this task. Must be set if `versioning_behavior` is set. This value updates workflow execution's `versioning_info.deployment_version`. """ + @property + def consumed_stream_ranges( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRange + ]: + """Offset ranges this Workflow Task consumed from streams it subscribes to. + Recorded on every task where a subscription is active, including when it + observed nothing: an empty range is a fact replay must reproduce, and + omitting it would let replay deliver records the Workflow did not have. + Numbered 20 to leave 14 through 19 free for fields added on the main line. + """ def __init__( self, *, @@ -1088,6 +1102,10 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): worker_deployment_name: builtins.str = ..., deployment_version: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentVersion | None = ..., + consumed_stream_ranges: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRange + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1109,6 +1127,8 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "binary_checksum", b"binary_checksum", + "consumed_stream_ranges", + b"consumed_stream_ranges", "deployment", b"deployment", "deployment_version", @@ -3603,6 +3623,93 @@ global___ActivityPropertiesModifiedExternallyEventAttributes = ( ActivityPropertiesModifiedExternallyEventAttributes ) +class WorkflowStreamSubscribedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command created this + subscription. + """ + stream_id: builtins.str + """Stream the Workflow subscribed to.""" + start_offset: builtins.int + """The offset the subscription actually starts from. Resolved by the server + when the subscription is registered and recorded here, so replay reads + the resolved value rather than resolving it again against a stream that + has since moved. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + start_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamSubscribedEventAttributes = ( + WorkflowStreamSubscribedEventAttributes +) + +class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + STREAM_ID_FIELD_NUMBER: builtins.int + FIRST_OFFSET_FIELD_NUMBER: builtins.int + RECORD_COUNT_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command appended this + batch. + """ + stream_id: builtins.str + """Stream the Workflow appended to.""" + first_offset: builtins.int + """Offset the first record of the batch landed at.""" + record_count: builtins.int + """How many records the batch held. With first_offset this names the range + without carrying any of it, which is what keeps this event a fixed size + no matter how large the batch or its payloads are. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + stream_id: builtins.str = ..., + first_offset: builtins.int = ..., + record_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "first_offset", + b"first_offset", + "record_count", + b"record_count", + "stream_id", + b"stream_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowStreamRecordsAppendedEventAttributes = ( + WorkflowStreamRecordsAppendedEventAttributes +) + class WorkflowExecutionUpdateAcceptedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4460,6 +4567,8 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( builtins.int ) + WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_RECORDS_APPENDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4745,6 +4854,14 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_execution_time_skipping_transitioned_event_attributes( self, ) -> global___WorkflowExecutionTimeSkippingTransitionedEventAttributes: ... + @property + def workflow_stream_subscribed_event_attributes( + self, + ) -> global___WorkflowStreamSubscribedEventAttributes: ... + @property + def workflow_stream_records_appended_event_attributes( + self, + ) -> global___WorkflowStreamRecordsAppendedEventAttributes: ... def __init__( self, *, @@ -4882,6 +4999,10 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_execution_time_skipping_transitioned_event_attributes: global___WorkflowExecutionTimeSkippingTransitionedEventAttributes | None = ..., + workflow_stream_subscribed_event_attributes: global___WorkflowStreamSubscribedEventAttributes + | None = ..., + workflow_stream_records_appended_event_attributes: global___WorkflowStreamRecordsAppendedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5004,6 +5125,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_records_appended_event_attributes", + b"workflow_stream_records_appended_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5151,6 +5276,10 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", b"workflow_properties_modified_externally_event_attributes", + "workflow_stream_records_appended_event_attributes", + b"workflow_stream_records_appended_event_attributes", + "workflow_stream_subscribed_event_attributes", + b"workflow_stream_subscribed_event_attributes", "workflow_task_completed_event_attributes", b"workflow_task_completed_event_attributes", "workflow_task_failed_event_attributes", @@ -5227,6 +5356,8 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_paused_event_attributes", "workflow_execution_unpaused_event_attributes", "workflow_execution_time_skipping_transitioned_event_attributes", + "workflow_stream_subscribed_event_attributes", + "workflow_stream_records_appended_event_attributes", ] | None ): ... diff --git a/temporalio/api/stream/__init__.py b/temporalio/api/stream/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py new file mode 100644 index 000000000..9d54188ec --- /dev/null +++ b/temporalio/api/stream/v1/__init__.py @@ -0,0 +1,8 @@ +from .message_pb2 import StreamRange, StreamRecord, StreamRecordKind, StreamSlice + +__all__ = [ + "StreamRange", + "StreamRecord", + "StreamRecordKind", + "StreamSlice", +] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py new file mode 100644 index 000000000..c28393a50 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/stream/v1/message.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xd4\x02\n\x0cStreamRecord\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x44\n\x08metadata\x18\x02 \x03(\x0b\x32\x32.temporal.api.stream.v1.StreamRecord.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x36\n\x04kind\x18\x04 \x01(\x0e\x32(.temporal.api.stream.v1.StreamRecordKind\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x03\x12\x10\n\x08sequence\x18\x07 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xb9\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x35\n\x07records\x18\x05 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"H\n\x0bStreamRange\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03*r\n\x10StreamRecordKind\x12"\n\x1eSTREAM_RECORD_KIND_UNSPECIFIED\x10\x00\x12\x1b\n\x17STREAM_RECORD_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_RECORD_KIND_FINISH\x10\x02\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' +) + +_STREAMRECORDKIND = DESCRIPTOR.enum_types_by_name["StreamRecordKind"] +StreamRecordKind = enum_type_wrapper.EnumTypeWrapper(_STREAMRECORDKIND) +STREAM_RECORD_KIND_UNSPECIFIED = 0 +STREAM_RECORD_KIND_DATA = 1 +STREAM_RECORD_KIND_FINISH = 2 + + +_STREAMRECORD = DESCRIPTOR.message_types_by_name["StreamRecord"] +_STREAMRECORD_METADATAENTRY = _STREAMRECORD.nested_types_by_name["MetadataEntry"] +_STREAMSLICE = DESCRIPTOR.message_types_by_name["StreamSlice"] +_STREAMRANGE = DESCRIPTOR.message_types_by_name["StreamRange"] +StreamRecord = _reflection.GeneratedProtocolMessageType( + "StreamRecord", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _STREAMRECORD_METADATAENTRY, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRecord.MetadataEntry) + }, + ), + "DESCRIPTOR": _STREAMRECORD, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRecord) + }, +) +_sym_db.RegisterMessage(StreamRecord) +_sym_db.RegisterMessage(StreamRecord.MetadataEntry) + +StreamSlice = _reflection.GeneratedProtocolMessageType( + "StreamSlice", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSLICE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamSlice) + }, +) +_sym_db.RegisterMessage(StreamSlice) + +StreamRange = _reflection.GeneratedProtocolMessageType( + "StreamRange", + (_message.Message,), + { + "DESCRIPTOR": _STREAMRANGE, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamRange) + }, +) +_sym_db.RegisterMessage(StreamRange) + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1" + _STREAMRECORD_METADATAENTRY._options = None + _STREAMRECORD_METADATAENTRY._serialized_options = b"8\001" + _STREAMRECORDKIND._serialized_start = 707 + _STREAMRECORDKIND._serialized_end = 821 + _STREAMRECORD._serialized_start = 103 + _STREAMRECORD._serialized_end = 443 + _STREAMRECORD_METADATAENTRY._serialized_start = 363 + _STREAMRECORD_METADATAENTRY._serialized_end = 443 + _STREAMSLICE._serialized_start = 446 + _STREAMSLICE._serialized_end = 631 + _STREAMRANGE._serialized_start = 633 + _STREAMRANGE._serialized_end = 705 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi new file mode 100644 index 000000000..74a6d4a75 --- /dev/null +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -0,0 +1,267 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys +import typing + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _StreamRecordKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamRecordKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamRecordKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_RECORD_KIND_UNSPECIFIED: _StreamRecordKind.ValueType # 0 + """Read as DATA.""" + STREAM_RECORD_KIND_DATA: _StreamRecordKind.ValueType # 1 + """A value the producer published; `body` carries it.""" + STREAM_RECORD_KIND_FINISH: _StreamRecordKind.ValueType # 2 + """The producer named by `producer_id` writes nothing more on `topic`. + Says nothing about that producer's outcome and does not end the stream. + """ + +class StreamRecordKind(_StreamRecordKind, metaclass=_StreamRecordKindEnumTypeWrapper): + """What a record means to a reader. Kept on the record itself so every store + and every language reads it the same way without a private envelope. + """ + +STREAM_RECORD_KIND_UNSPECIFIED: StreamRecordKind.ValueType # 0 +"""Read as DATA.""" +STREAM_RECORD_KIND_DATA: StreamRecordKind.ValueType # 1 +"""A value the producer published; `body` carries it.""" +STREAM_RECORD_KIND_FINISH: StreamRecordKind.ValueType # 2 +"""The producer named by `producer_id` writes nothing more on `topic`. +Says nothing about that producer's outcome and does not end the stream. +""" +global___StreamRecordKind = StreamRecordKind + +class StreamRecord(google.protobuf.message.Message): + """One entry in a stream. The record is the wire format: stores keep it + serialized as is and readers in every language decode the same bytes. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + BODY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + TOPIC_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + PRODUCER_ID_FIELD_NUMBER: builtins.int + ATTEMPT_FIELD_NUMBER: builtins.int + SEQUENCE_FIELD_NUMBER: builtins.int + @property + def body(self) -> temporalio.api.common.v1.message_pb2.Payload: + """The value the producer published, stored as sent. A payload codec + applies here as it does to any other payload. + """ + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: + """Producer-supplied provenance, stored as sent.""" + topic: builtins.str + """Producer-supplied grouping label, stored as sent.""" + kind: global___StreamRecordKind.ValueType + """How to read this record. Unspecified is read as DATA.""" + producer_id: builtins.str + """Who wrote the record. Empty when the owning Workflow did.""" + attempt: builtins.int + """The producer's attempt. Readers treat a later attempt by the same + producer as superseding what the earlier one wrote. + """ + sequence: builtins.int + """The producer's position within its attempt, or -1 when unnumbered. + Stored as sent; the server does not assign, validate or order by it. + """ + def __init__( + self, + *, + body: temporalio.api.common.v1.message_pb2.Payload | None = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., + topic: builtins.str = ..., + kind: global___StreamRecordKind.ValueType = ..., + producer_id: builtins.str = ..., + attempt: builtins.int = ..., + sequence: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["body", b"body"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "attempt", + b"attempt", + "body", + b"body", + "kind", + b"kind", + "metadata", + b"metadata", + "producer_id", + b"producer_id", + "sequence", + b"sequence", + "topic", + b"topic", + ], + ) -> None: ... + +global___StreamRecord = StreamRecord + +class StreamSlice(google.protobuf.message.Message): + """A contiguous range of a stream delivered to a Workflow Task, along with the + offsets it covers. The offsets are what History records; the records + themselves are never written to History. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + stream_id: builtins.str + run_id: builtins.str + """Run id of the execution that owns the stream. Set on both a slice for the + task being started and a re-supplied one. + """ + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription observed nothing, + which is a fact replay has to reproduce rather than an absence of one. + """ + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + global___StreamRecord + ]: ... + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event whose consumed_stream_ranges recorded + this range. Set only when the server is re-supplying a range for a task + being replayed; a slice for the task now being started leaves it unset, + because the event closing that task does not exist yet. + + Replay needs this because a Workflow Task response carries one slice set + while a cache miss replays every prior task, so the ranges have to be + matched to the events that recorded them rather than to the response. + """ + def __init__( + self, + *, + stream_id: builtins.str = ..., + run_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + records: collections.abc.Iterable[global___StreamRecord] | None = ..., + workflow_task_completed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "records", + b"records", + "run_id", + b"run_id", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___StreamSlice = StreamSlice + +class StreamRange(google.protobuf.message.Message): + """The offsets a Workflow Task consumed, without the payloads. Recorded on + WorkflowTaskCompleted so History grows with Workflow Tasks rather than with + records. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + stream_id: builtins.str + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive.""" + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___StreamRange = StreamRange diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index e1b2e01c4..cdf2becc2 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -114,6 +114,9 @@ from temporalio.api.sdk.v1 import ( worker_config_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_worker__config__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.taskqueue.v1 import ( message_pb2 as temporal_dot_api_dot_taskqueue_dot_v1_dot_message__pb2, ) @@ -131,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xbf\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4214,578 +4217,578 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1646 - _REGISTERNAMESPACEREQUEST._serialized_end = 2294 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2251 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2294 - _REGISTERNAMESPACERESPONSE._serialized_start = 2296 - _REGISTERNAMESPACERESPONSE._serialized_end = 2323 - _LISTNAMESPACESREQUEST._serialized_start = 2326 - _LISTNAMESPACESREQUEST._serialized_end = 2463 - _LISTNAMESPACESRESPONSE._serialized_start = 2466 - _LISTNAMESPACESRESPONSE._serialized_end = 2595 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2597 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2680 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2683 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3196 - _UPDATENAMESPACEREQUEST._serialized_start = 3199 - _UPDATENAMESPACEREQUEST._serialized_end = 3534 - _UPDATENAMESPACERESPONSE._serialized_start = 3537 - _UPDATENAMESPACERESPONSE._serialized_end = 3828 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3830 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3900 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3902 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3930 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3933 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5550 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5553 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5851 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5854 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6152 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6155 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6341 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6344 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6520 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6522 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6642 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6645 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7085 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7088 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8175 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8091 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8175 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8178 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9350 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9445 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9447 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9516 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9519 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9764 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9767 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10292 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10294 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10329 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10332 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10818 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10821 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12002 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12005 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12170 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12172 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12284 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12287 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12494 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12496 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12612 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12615 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 12997 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 12999 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13037 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13040 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13247 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13249 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13291 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13294 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13740 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13742 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13829 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13832 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14103 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14105 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14196 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14199 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14581 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14583 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14620 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14623 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 14911 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 14913 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 14954 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 14957 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15217 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15219 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15259 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15262 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15612 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15614 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15691 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15694 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17033 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17036 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17194 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17197 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17646 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17648 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17696 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17699 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 17986 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 17988 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18024 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18026 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18148 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18150 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18183 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18186 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18515 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18518 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18648 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18651 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19180 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19182 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19291 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19293 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19419 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19421 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19538 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19541 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19675 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19677 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19786 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19788 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19914 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19916 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19982 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19985 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20222 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20224 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20252 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20255 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20456 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20372 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20456 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20459 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20820 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20822 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20857 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20859 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 20969 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 20971 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21001 - _SHUTDOWNWORKERREQUEST._serialized_start = 21004 - _SHUTDOWNWORKERREQUEST._serialized_end = 21287 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21289 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21313 - _QUERYWORKFLOWREQUEST._serialized_start = 21316 - _QUERYWORKFLOWREQUEST._serialized_end = 21549 - _QUERYWORKFLOWRESPONSE._serialized_start = 21552 - _QUERYWORKFLOWRESPONSE._serialized_end = 21737 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21739 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21854 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21857 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22522 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22525 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23053 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23056 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24060 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23842 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 23958 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 23960 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24060 - _GETCLUSTERINFOREQUEST._serialized_start = 24062 - _GETCLUSTERINFOREQUEST._serialized_end = 24085 - _GETCLUSTERINFORESPONSE._serialized_start = 24088 - _GETCLUSTERINFORESPONSE._serialized_end = 24553 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24498 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24553 - _GETSYSTEMINFOREQUEST._serialized_start = 24555 - _GETSYSTEMINFOREQUEST._serialized_end = 24577 - _GETSYSTEMINFORESPONSE._serialized_start = 24580 - _GETSYSTEMINFORESPONSE._serialized_end = 25157 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24721 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25157 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25159 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25268 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25271 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25494 - _CREATESCHEDULEREQUEST._serialized_start = 25497 - _CREATESCHEDULEREQUEST._serialized_end = 25829 - _CREATESCHEDULERESPONSE._serialized_start = 25831 - _CREATESCHEDULERESPONSE._serialized_end = 25879 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25881 - _DESCRIBESCHEDULEREQUEST._serialized_end = 25946 - _DESCRIBESCHEDULERESPONSE._serialized_start = 25949 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26220 - _UPDATESCHEDULEREQUEST._serialized_start = 26223 - _UPDATESCHEDULEREQUEST._serialized_end = 26515 - _UPDATESCHEDULERESPONSE._serialized_start = 26517 - _UPDATESCHEDULERESPONSE._serialized_end = 26541 - _PATCHSCHEDULEREQUEST._serialized_start = 26544 - _PATCHSCHEDULEREQUEST._serialized_end = 26700 - _PATCHSCHEDULERESPONSE._serialized_start = 26702 - _PATCHSCHEDULERESPONSE._serialized_end = 26725 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26728 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26896 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26898 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 26981 - _DELETESCHEDULEREQUEST._serialized_start = 26983 - _DELETESCHEDULEREQUEST._serialized_end = 27064 - _DELETESCHEDULERESPONSE._serialized_start = 27066 - _DELETESCHEDULERESPONSE._serialized_end = 27090 - _LISTSCHEDULESREQUEST._serialized_start = 27092 - _LISTSCHEDULESREQUEST._serialized_end = 27200 - _LISTSCHEDULESRESPONSE._serialized_start = 27202 - _LISTSCHEDULESRESPONSE._serialized_end = 27314 - _COUNTSCHEDULESREQUEST._serialized_start = 27316 - _COUNTSCHEDULESREQUEST._serialized_end = 27373 - _COUNTSCHEDULESRESPONSE._serialized_start = 27376 - _COUNTSCHEDULESRESPONSE._serialized_end = 27595 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27598 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28244 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28045 + _REGISTERNAMESPACEREQUEST._serialized_start = 1684 + _REGISTERNAMESPACEREQUEST._serialized_end = 2332 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 + _REGISTERNAMESPACERESPONSE._serialized_start = 2334 + _REGISTERNAMESPACERESPONSE._serialized_end = 2361 + _LISTNAMESPACESREQUEST._serialized_start = 2364 + _LISTNAMESPACESREQUEST._serialized_end = 2501 + _LISTNAMESPACESRESPONSE._serialized_start = 2504 + _LISTNAMESPACESRESPONSE._serialized_end = 2633 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 + _UPDATENAMESPACEREQUEST._serialized_start = 3237 + _UPDATENAMESPACEREQUEST._serialized_end = 3572 + _UPDATENAMESPACERESPONSE._serialized_start = 3575 + _UPDATENAMESPACERESPONSE._serialized_end = 3866 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 + _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 + _SHUTDOWNWORKERREQUEST._serialized_start = 21102 + _SHUTDOWNWORKERREQUEST._serialized_end = 21385 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 + _QUERYWORKFLOWREQUEST._serialized_start = 21414 + _QUERYWORKFLOWREQUEST._serialized_end = 21647 + _QUERYWORKFLOWRESPONSE._serialized_start = 21650 + _QUERYWORKFLOWRESPONSE._serialized_end = 21835 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 + _GETCLUSTERINFOREQUEST._serialized_start = 24160 + _GETCLUSTERINFOREQUEST._serialized_end = 24183 + _GETCLUSTERINFORESPONSE._serialized_start = 24186 + _GETCLUSTERINFORESPONSE._serialized_end = 24651 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 + _GETSYSTEMINFOREQUEST._serialized_start = 24653 + _GETSYSTEMINFOREQUEST._serialized_end = 24675 + _GETSYSTEMINFORESPONSE._serialized_start = 24678 + _GETSYSTEMINFORESPONSE._serialized_end = 25255 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 + _CREATESCHEDULEREQUEST._serialized_start = 25595 + _CREATESCHEDULEREQUEST._serialized_end = 25927 + _CREATESCHEDULERESPONSE._serialized_start = 25929 + _CREATESCHEDULERESPONSE._serialized_end = 25977 + _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 + _UPDATESCHEDULEREQUEST._serialized_start = 26321 + _UPDATESCHEDULEREQUEST._serialized_end = 26613 + _UPDATESCHEDULERESPONSE._serialized_start = 26615 + _UPDATESCHEDULERESPONSE._serialized_end = 26639 + _PATCHSCHEDULEREQUEST._serialized_start = 26642 + _PATCHSCHEDULEREQUEST._serialized_end = 26798 + _PATCHSCHEDULERESPONSE._serialized_start = 26800 + _PATCHSCHEDULERESPONSE._serialized_end = 26823 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 + _DELETESCHEDULEREQUEST._serialized_start = 27081 + _DELETESCHEDULEREQUEST._serialized_end = 27162 + _DELETESCHEDULERESPONSE._serialized_start = 27164 + _DELETESCHEDULERESPONSE._serialized_end = 27188 + _LISTSCHEDULESREQUEST._serialized_start = 27190 + _LISTSCHEDULESREQUEST._serialized_end = 27298 + _LISTSCHEDULESRESPONSE._serialized_start = 27300 + _LISTSCHEDULESRESPONSE._serialized_end = 27412 + _COUNTSCHEDULESREQUEST._serialized_start = 27414 + _COUNTSCHEDULESREQUEST._serialized_end = 27471 + _COUNTSCHEDULESRESPONSE._serialized_start = 27474 + _COUNTSCHEDULESRESPONSE._serialized_end = 27693 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28156 + 28254 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28158 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28231 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28246 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28310 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28312 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28407 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28409 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28525 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28528 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30245 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29580 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29693 + 29791 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29696 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29825 + 29923 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29827 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29891 + 29989 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29893 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 29999 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30001 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30111 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30113 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30175 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30177 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30232 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30248 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30500 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30502 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30574 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30577 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30826 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30829 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 30985 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 30987 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31101 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31104 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31365 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31368 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31627 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31630 - _STARTBATCHOPERATIONREQUEST._serialized_end = 32996 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 32998 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33027 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33029 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33125 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33127 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33155 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33157 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33223 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33226 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33698 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33700 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33791 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33793 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 33914 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 33917 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34102 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34105 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34324 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34327 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34743 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34746 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35100 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35103 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35270 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35272 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35307 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35310 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35530 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35532 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35564 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35567 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 35939 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35733 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 35939 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 35942 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36274 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36068 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36274 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36277 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36613 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36616 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 36935 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 36937 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37037 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37039 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37148 - _PAUSEACTIVITYREQUEST._serialized_start = 37151 - _PAUSEACTIVITYREQUEST._serialized_end = 37350 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37353 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37536 - _PAUSEACTIVITYRESPONSE._serialized_start = 37538 - _PAUSEACTIVITYRESPONSE._serialized_end = 37561 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37563 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37595 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37598 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37878 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37881 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38154 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38156 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38181 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38183 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38217 - _RESETACTIVITYREQUEST._serialized_start = 38220 - _RESETACTIVITYREQUEST._serialized_end = 38527 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38530 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38820 - _RESETACTIVITYRESPONSE._serialized_start = 38822 - _RESETACTIVITYRESPONSE._serialized_end = 38845 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38847 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38879 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38882 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39166 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39169 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39346 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39348 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39454 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39456 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39553 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39556 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39750 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39753 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40014 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40405 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23740 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23840 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40407 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40484 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40487 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40627 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40629 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40737 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40739 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40858 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40861 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41066 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41069 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41254 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41257 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41486 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41489 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 41932 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 41935 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42159 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42161 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42274 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42276 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42332 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42334 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42427 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42430 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43101 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42605 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43101 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43104 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43344 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43346 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43385 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43388 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43588 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43590 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43629 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43631 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43724 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43726 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43758 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43761 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44279 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44331 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44334 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44834 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44154 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44277 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44836 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44890 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44893 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45311 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45226 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 + _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 + _PAUSEACTIVITYREQUEST._serialized_start = 37249 + _PAUSEACTIVITYREQUEST._serialized_end = 37448 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 + _PAUSEACTIVITYRESPONSE._serialized_start = 37636 + _PAUSEACTIVITYRESPONSE._serialized_end = 37659 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 + _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 + _RESETACTIVITYREQUEST._serialized_start = 38318 + _RESETACTIVITYREQUEST._serialized_end = 38625 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 + _RESETACTIVITYRESPONSE._serialized_start = 38920 + _RESETACTIVITYRESPONSE._serialized_end = 38943 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 + _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 + _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45311 + 45409 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45313 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45423 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45426 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45615 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45617 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45716 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45718 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45787 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45789 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45896 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45898 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46011 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46014 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46241 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46244 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46424 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46426 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46521 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46523 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46588 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46590 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46671 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46673 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46736 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46738 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46766 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46768 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46838 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46840 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 46944 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 46947 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47153 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47155 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47201 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47204 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47359 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47361 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47392 - _LISTWORKERSREQUEST._serialized_start = 47395 - _LISTWORKERSREQUEST._serialized_end = 47525 - _LISTWORKERSRESPONSE._serialized_start = 47528 - _LISTWORKERSRESPONSE._serialized_end = 47693 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47696 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48421 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48263 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48354 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 + _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 + _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 + _LISTWORKERSREQUEST._serialized_start = 47493 + _LISTWORKERSREQUEST._serialized_end = 47623 + _LISTWORKERSRESPONSE._serialized_start = 47626 + _LISTWORKERSRESPONSE._serialized_end = 47791 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48356 + 48454 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48421 + 48519 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48423 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48514 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48517 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48675 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48677 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48762 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48765 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49031 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49033 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49133 - _DESCRIBEWORKERREQUEST._serialized_start = 49135 - _DESCRIBEWORKERREQUEST._serialized_end = 49206 - _DESCRIBEWORKERRESPONSE._serialized_start = 49208 - _DESCRIBEWORKERRESPONSE._serialized_end = 49289 - _COUNTWORKERSREQUEST._serialized_start = 49291 - _COUNTWORKERSREQUEST._serialized_end = 49378 - _COUNTWORKERSRESPONSE._serialized_start = 49380 - _COUNTWORKERSRESPONSE._serialized_end = 49417 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49420 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49561 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49563 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49595 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49598 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49741 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49743 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49777 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49780 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 50957 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 50959 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51068 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51071 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51299 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51302 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51618 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51620 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51706 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51708 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51824 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51826 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 51935 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 51938 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52068 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52071 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52870 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 52920 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 52922 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 52993 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52996 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53166 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53169 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53480 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53483 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53644 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53647 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53908 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 53910 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54025 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54028 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54167 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54169 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54235 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54238 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54475 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54477 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54552 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54801 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20134 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20222 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54804 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 54953 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 54955 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 54995 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 54998 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55143 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55145 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55181 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55183 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55271 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55273 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55306 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55309 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55465 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55467 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55513 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55516 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55668 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55670 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55712 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55714 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55809 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55811 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55850 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55853 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56010 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56013 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56245 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 + _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 + _DESCRIBEWORKERREQUEST._serialized_start = 49233 + _DESCRIBEWORKERREQUEST._serialized_end = 49304 + _DESCRIBEWORKERRESPONSE._serialized_start = 49306 + _DESCRIBEWORKERRESPONSE._serialized_end = 49387 + _COUNTWORKERSREQUEST._serialized_start = 49389 + _COUNTWORKERSREQUEST._serialized_end = 49476 + _COUNTWORKERSRESPONSE._serialized_start = 49478 + _COUNTWORKERSRESPONSE._serialized_end = 49515 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index eb9243716..e66c90384 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -46,6 +46,7 @@ import temporalio.api.schedule.v1.message_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.sdk.v1.worker_config_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.taskqueue.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.api.version.v1.message_pb2 @@ -1278,6 +1279,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_ID_FIELD_NUMBER: builtins.int POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int + STREAM_SLICES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1392,6 +1394,15 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): 3. If every group has some pending polls, assign the next poll to a group randomly according to the weights. """ + @property + def stream_slices( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ]: + """Stream data attached to this task. Delivered out of band so the payloads + never enter History; only the offset ranges are recorded there. + """ def __init__( self, *, @@ -1427,6 +1438,10 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): | None = ..., poller_groups_info: temporalio.api.taskqueue.v1.message_pb2.PollerGroupsInfo | None = ..., + stream_slices: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamSlice + ] + | None = ..., ) -> None: ... def HasField( self, @@ -1484,6 +1499,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"started_event_id", "started_time", b"started_time", + "stream_slices", + b"stream_slices", "task_token", b"task_token", "workflow_execution", diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 271c0474f..c713b5e49 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 271c0474fd8ab0459ed5a022923a0fc700525e12 +Subproject commit c713b5e49977b9f00485f7c94f2f944f6a295aee From be909ced5b571ca2ee80a71f9314f193a2fe55f6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 07:57:42 -0700 Subject: [PATCH 565/831] Added the in-memory provider and the registration option. `ProviderPlugin` is the plugin half every provider in this tree shares, so one registration reaches the client, the worker and the replayer through their `stream_provider` option. The memory provider exists so the conformance cases can exercise the whole outside surface without a store, and it documents in one file what a provider owes. --- temporalio/client/_client.py | 4 + temporalio/streams/providers/__init__.py | 87 +++++ temporalio/streams/providers/memory.py | 453 ++++++++++++++++++++++ temporalio/worker/_replayer.py | 6 +- temporalio/worker/_worker.py | 8 + tests/streams/__init__.py | 0 tests/streams/conftest.py | 8 + tests/streams/test_streams_conformance.py | 405 +++++++++++++++++++ 8 files changed, 970 insertions(+), 1 deletion(-) create mode 100644 temporalio/streams/providers/__init__.py create mode 100644 temporalio/streams/providers/memory.py create mode 100644 tests/streams/__init__.py create mode 100644 tests/streams/conftest.py create mode 100644 tests/streams/test_streams_conformance.py diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index b5db0c4b7..999ad8bba 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -27,6 +27,7 @@ import temporalio.converter import temporalio.runtime import temporalio.service +import temporalio.streams import temporalio.workflow from temporalio.service import ( ConnectConfig, @@ -269,6 +270,7 @@ def __init__( default_workflow_query_reject_condition: None | (temporalio.common.QueryRejectCondition) = None, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ): """Create a Temporal client from a service client. @@ -283,6 +285,7 @@ def __init__( interceptors=interceptors, default_workflow_query_reject_condition=default_workflow_query_reject_condition, header_codec_behavior=header_codec_behavior, + stream_provider=stream_provider, ) self._initial_config = config.copy() @@ -3032,3 +3035,4 @@ class ClientConfig(TypedDict, total=False): temporalio.common.QueryRejectCondition | None ] header_codec_behavior: Required[HeaderCodecBehavior] + stream_provider: temporalio.streams.StreamProvider | None diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py new file mode 100644 index 000000000..7aaa5a9b1 --- /dev/null +++ b/temporalio/streams/providers/__init__.py @@ -0,0 +1,87 @@ +"""Stream providers, one module each. + +A provider that serves workers is a :class:`temporalio.worker.Plugin`, and +one registered on a client is a :class:`temporalio.client.Plugin` too. +:class:`ProviderPlugin` is the plugin half the providers in this tree share: +it hands the provider to the client, the worker and the replayer as their +``stream_provider`` and leaves their execution alone, so +``Client.connect(plugins=[provider])`` registers it once and every worker +built from that client inherits it. A provider that holds connections closes +them through its own ``close()``, not with the worker, because the same +provider serves handles outside any worker. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator, Awaitable, Callable +from contextlib import AbstractAsyncContextManager + +import temporalio.client +import temporalio.worker +from temporalio.client import ClientConfig, WorkflowHistory +from temporalio.service import ConnectConfig, ServiceClient +from temporalio.streams._provider import StreamProvider +from temporalio.worker import ( + Replayer, + ReplayerConfig, + Worker, + WorkerConfig, + WorkflowReplayResult, +) + +__all__ = ["ProviderPlugin"] + + +class ProviderPlugin( + StreamProvider, temporalio.client.Plugin, temporalio.worker.Plugin +): + """The plugin every provider in this tree is built on. + + Subclasses implement :class:`temporalio.streams.StreamProvider`; this + class supplies the plugin hooks, so ``Client.connect(plugins=[provider])``, + ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` reach + the provider through their ``stream_provider`` option. A worker built from + a client that carries the plugin inherits it, and the worker installs the + interceptor that calls the workflow half's lifecycle hooks. + """ + + def configure_client(self, config: ClientConfig) -> ClientConfig: + """Set this provider as the client's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def connect_service_client( + self, + config: ConnectConfig, + next: Callable[[ConnectConfig], Awaitable[ServiceClient]], + ) -> ServiceClient: + """Connect unchanged.""" + return await next(config) + + def configure_worker(self, config: WorkerConfig) -> WorkerConfig: + """Set this provider as the worker's ``stream_provider``.""" + config["stream_provider"] = self + return config + + def configure_replayer(self, config: ReplayerConfig) -> ReplayerConfig: + """Set this provider as the replayer's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def run_worker( + self, worker: Worker, next: Callable[[Worker], Awaitable[None]] + ) -> None: + """Run the worker unchanged.""" + await next(worker) + + def run_replayer( + self, + replayer: Replayer, + histories: AsyncIterator[WorkflowHistory], + next: Callable[ + [Replayer, AsyncIterator[WorkflowHistory]], + AbstractAsyncContextManager[AsyncIterator[WorkflowReplayResult]], + ], + ) -> AbstractAsyncContextManager[AsyncIterator[WorkflowReplayResult]]: + """Run the replayer unchanged.""" + return next(replayer, histories) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py new file mode 100644 index 000000000..f175570a8 --- /dev/null +++ b/temporalio/streams/providers/memory.py @@ -0,0 +1,453 @@ +"""The in-process reference provider. + +Exists so the conformance suite can exercise the whole surface without a +store, and to document in one file what a provider owes. Its limits, stated +so nobody mistakes it for evidence: + +- It is not replay-safe. Workflow-side state lives in plain process memory, + so run it with a warm workflow cache and do not use it to demonstrate + recovery. +- A workflow's publish becomes visible at ``publish`` time rather than at + task acceptance, and a failed task's records stay, so it only approximates + rule 1 of the contract. +- Topics are keyed by workflow id rather than by run, so a successor run's + reader from ``BEGINNING`` sees the chain's records. A ``run_id`` on a + handle only decides which run's close ends a read. +- It learns that a workflow closed by describing it, so a handle opened + without a client reads until the caller closes it. + +The outside surface (producer identity, retry deduplication, positions, +supersession, cursors) is faithful, which is what the conformance tests lean +on. One list per topic; a topic is written by the workflow and by outside +producers alike and read from either side. +""" + +from __future__ import annotations + +import asyncio +import logging +from collections.abc import AsyncGenerator +from datetime import timedelta +from typing import Any, Generic, TypeVar + +from google.protobuf.message import DecodeError + +import temporalio.converter +from temporalio import workflow +from temporalio.client import Client, WorkflowExecutionStatus +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError +from temporalio.streams._ids import topic_key +from temporalio.streams._provider import ReadSource, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["MemoryProducer", "MemoryStreamHandle", "MemoryStreams"] + +_PROVIDER = "memory" + +T = TypeVar("T") + +logger = logging.getLogger(__name__) + + +def _wake(future: asyncio.Future[None]) -> None: + if not future.done(): + future.set_result(None) + + +class _Topic: + """One topic's records, and the waiters parked on its tail.""" + + def __init__(self) -> None: + self.records: list[bytes] = [] + # Dedupe identity is (producer#attempt, first sequence of the append), + # the same pair the storage providers use, mapped to where the batch + # landed so a repeat can answer with the original position. + self.seen: dict[tuple[str, int], tuple[int, int]] = {} + # Each waiter is parked with the loop it belongs to. A workflow's + # publish runs on the workflow thread, and waking a foreign loop's + # future from there needs call_soon_threadsafe or the loop stays + # blocked in select until unrelated I/O happens to wake it. + self._waiters: list[tuple[asyncio.AbstractEventLoop, asyncio.Future[None]]] = [] + + def append( + self, + wires: list[WireRecord], + *, + writer: str | None = None, + sequence: int = 0, + ) -> tuple[int, int]: + """Store ``wires`` and return where they landed as ``(first offset, count)``. + + With a ``writer``, a repeat of ``(writer, sequence)`` stores nothing + and returns where the original landed. + """ + key = (writer or "", sequence) + if writer is not None and key in self.seen: + return self.seen[key] + first = len(self.records) + self.records.extend(wire.SerializeToString() for wire in wires) + if writer is not None: + self.seen[key] = (first, len(wires)) + waiters, self._waiters = self._waiters, [] + for loop, future in waiters: + loop.call_soon_threadsafe(_wake, future) + return first, len(wires) + + async def wait_past(self, offset: int, timeout: float | None) -> None: + """Wait until a record exists at ``offset``, or ``timeout`` passes.""" + if len(self.records) > offset: + return + loop = asyncio.get_running_loop() + future: asyncio.Future[None] = loop.create_future() + self._waiters.append((loop, future)) + try: + await asyncio.wait_for(future, timeout) + except asyncio.TimeoutError: + self._waiters = [w for w in self._waiters if w[1] is not future] + + +def _parse(cursor: Cursor, raw: bytes, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(raw) + except DecodeError as error: + # Same answer as an undecodable body: skip and say so, so one bad + # record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None + + +class _MemReadSource: + """Workflow-side read that wakes by polling a timer. + + A real provider wakes the workflow by delivering; polling is the price of + having no delivery path, and it is why this provider is for tests. + """ + + def __init__(self, store: _Topic, start: int, poll: timedelta) -> None: + self._store = store + self._offset = start + self._poll = poll + self._closed = False + + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + while not self._closed: + records = self._store.records + if len(records) > self._offset: + batch: list[tuple[Cursor, WireRecord]] = [] + for offset in range(self._offset, len(records)): + cursor = mint_cursor(_PROVIDER, str(offset)) + wire = _parse(cursor, records[offset], workflow.logger.warning) + if wire is not None: + batch.append((cursor, wire)) + self._offset = len(records) + if batch: + return batch + continue + await workflow.sleep(self._poll) + raise StopAsyncIteration + + def close(self) -> None: + self._closed = True + + +class _MemWriteSink: + def __init__(self, store: _Topic) -> None: + self._store = store + + def publish(self, record: WireRecord) -> None: + # Visible at once rather than at task acceptance: the documented gap + # between this provider and rule 1. + self._store.append([record]) + + +class _MemoryWorkflowProvider: + """The workflow half. Nothing to install and nothing to release.""" + + def __init__(self, streams: MemoryStreams) -> None: + self._streams = streams + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + start = self._streams._offset_after(after) + store = self._streams._topic(workflow.info().workflow_id, topic) + return _MemReadSource(store, start, self._streams._poll) + + def open_writer(self, topic: str) -> WriteSink: + return _MemWriteSink(self._streams._topic(workflow.info().workflow_id, topic)) + + def on_workflow_start(self) -> None: + pass + + async def on_workflow_finish(self) -> None: + pass + + +class MemoryProducer(Generic[T]): + """The outside producer, faithful to the contract.""" + + def __init__( + self, + store: _Topic, + converter: temporalio.converter.PayloadConverter, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + """Bind this producer to ``topic``'s ``store``.""" + self._store = store + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _writer(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) + + async def append(self, *values: T) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed; an empty call returns + the position of this producer's last record. + """ + if not values: + return self._last + return self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.DATA, + value=value, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence + index, + ) + for index, value in enumerate(values) + ] + ) + + async def finish(self) -> None: + """Write ``FINISH`` for this producer on this topic.""" + self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] + ) + + def _write(self, wires: list[WireRecord]) -> Cursor: + first, count = self._store.append( + wires, writer=self._writer, sequence=self._sequence + ) + self._sequence += len(wires) + self._last = mint_cursor(_PROVIDER, str(first + count - 1)) + return self._last + + +class MemoryStreamHandle: + """One workflow's stream from outside, with the shared reader rules.""" + + def __init__( + self, + streams: MemoryStreams, + client: Client | None, + workflow_id: str, + run_id: str | None, + ) -> None: + """Address ``workflow_id``'s topics in ``streams``.""" + self._streams = streams + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = ( + client.data_converter.payload_converter + if client is not None + else temporalio.converter.DataConverter.default.payload_converter + ) + + def read( + self, + *, + topic: str | StreamTopic[Any], + after: Cursor = BEGINNING, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after`` until the workflow closes.""" + name, result_type = resolve_topic(topic, result_type) + store = self._streams._topic(self._workflow_id, name) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + start = self._streams._offset_after(after) + return self._read(store, start, after, result_type) + + async def _read( + self, + store: _Topic, + offset: int, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + closed = False + while True: + records = store.records + while offset < len(records): + cursor = mint_cursor(_PROVIDER, str(offset)) + wire = _parse(cursor, records[offset], logger.warning) + offset += 1 + if wire is None: + continue + for record in decoder.decode(cursor, wire): + yield record + if closed: + return + # One more pass after learning the workflow closed, so a record + # that landed between the scan and the describe is not lost. + closed = await self._closed() + if not closed: + await store.wait_past( + offset, + None + if self._client is None + else self._streams._poll.total_seconds(), + ) + + async def _closed(self) -> bool: + if self._client is None: + return False + handle = self._client.get_workflow_handle( + self._workflow_id, run_id=self._run_id + ) + try: + description = await handle.describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + # A producer may write before the workflow exists; there is + # nothing to follow yet, so keep waiting. + return False + raise + status = description.status + if status is None or status == WorkflowExecutionStatus.RUNNING: + return False + # Following the chain, a run that continued as new is not the end: + # the next describe without a run id finds its successor. + return not ( + self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW + ) + + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + """The cursor of the newest record on ``topic``, for following from now.""" + name, _ = resolve_topic(topic) + count = len(self._streams._topic(self._workflow_id, name).records) + return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING + + def producer( + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> MemoryProducer[Any]: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + name, _ = resolve_topic(topic) + store = self._streams._topic(self._workflow_id, name) + producer_id, attempt = producer_identity(producer_id, attempt) + return MemoryProducer(store, self._converter, name, producer_id, attempt) + + +class MemoryStreams(ProviderPlugin): + """The in-memory provider, one list per topic. + + Construct one and pass the same instance to the worker and to the code + that opens handles; two instances share nothing. + """ + + def __init__( + self, *, poll_interval: timedelta = timedelta(milliseconds=100) + ) -> None: + """Create an empty provider. + + Args: + poll_interval: How often a workflow-side reader with nothing to + read checks again, and how often an outside reader asks + whether the workflow closed. + """ + self._poll = poll_interval + self._topics: dict[str, _Topic] = {} + + def reset(self) -> None: + """Drop every topic. For tests.""" + self._topics.clear() + + def workflow_provider(self) -> _MemoryWorkflowProvider: + """The workflow half, over this provider's topics.""" + return _MemoryWorkflowProvider(self) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> MemoryStreamHandle: + """A handle on ``workflow_id``'s topics. + + ``client`` may be ``None`` here, unlike on a storage provider; then + the handle cannot see the workflow close and a read waits until the + caller closes it. + """ + return MemoryStreamHandle(self, client, workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: the provider holds no connection.""" + + def _topic(self, workflow_id: str, topic: str) -> _Topic: + if not topic: + raise ValueError("topic must not be empty") + key = topic_key(workflow_id, topic) + found = self._topics.get(key) + if found is None: + found = self._topics[key] = _Topic() + return found + + def _offset_after(self, after: Cursor) -> int: + position = cursor_position(after, provider=_PROVIDER) + if position is None: + return 0 + try: + return int(position) + 1 + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a position on the memory provider" + ) from None diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index b3eb1a4d1..1291f5066 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -17,6 +17,7 @@ import temporalio.client import temporalio.converter import temporalio.runtime +import temporalio.streams import temporalio.worker import temporalio.workflow @@ -56,13 +57,14 @@ def __init__( runtime: temporalio.runtime.Runtime | None = None, disable_safe_workflow_eviction: bool = False, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: """Create a replayer to replay workflows from history. See :py:meth:`temporalio.worker.Worker.__init__` for a description of most of the arguments. Most of the same arguments need to be passed to the replayer that were passed to the worker when the workflow originally - ran. + ran, ``stream_provider`` included when the workflow used streams. Note, unlike the worker, for the replayer the workflow_task_executor will default to a new thread pool executor with no max_workers set that @@ -86,6 +88,7 @@ def __init__( runtime=runtime, disable_safe_workflow_eviction=disable_safe_workflow_eviction, header_codec_behavior=header_codec_behavior, + stream_provider=stream_provider, ) self._initial_config = self._config.copy() self._default_workflow_logic_flags = set(_DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS) @@ -433,6 +436,7 @@ class ReplayerConfig(TypedDict, total=False): runtime: temporalio.runtime.Runtime | None disable_safe_workflow_eviction: bool header_codec_behavior: HeaderCodecBehavior + stream_provider: temporalio.streams.StreamProvider | None @dataclass(frozen=True) diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index 60f824c4d..25dcf697d 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -24,6 +24,7 @@ import temporalio.common import temporalio.runtime import temporalio.service +import temporalio.streams from temporalio.common import ( HeaderCodecBehavior, VersioningBehavior, @@ -152,6 +153,7 @@ def __init__( ), disable_payload_error_limit: bool = False, max_workflow_task_external_storage_concurrency: int = _DEFAULT_WORKFLOW_TASK_EXTERNAL_STORAGE_CONCURRENCY, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: """Create a worker to process workflows and/or activities. @@ -343,6 +345,10 @@ def __init__( Defaults to 3. Adjust this value based on your workload's needs. Please report any issues you encounter with this setting or if you feel the default should be changed. + stream_provider: Experimental. The stream provider that workflows + on this worker read and publish through, see + :py:mod:`temporalio.streams`. A provider that is also a + :py:class:`Plugin` sets this itself when passed in ``plugins``. WARNING: This setting is experimental. """ @@ -392,6 +398,7 @@ def __init__( nexus_task_poller_behavior=nexus_task_poller_behavior, disable_payload_error_limit=disable_payload_error_limit, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, + stream_provider=stream_provider, ) plugins_from_client = cast( @@ -1020,6 +1027,7 @@ class WorkerConfig(TypedDict, total=False): nexus_task_poller_behavior: PollerBehavior disable_payload_error_limit: bool max_workflow_task_external_storage_concurrency: int + stream_provider: temporalio.streams.StreamProvider | None def _warn_if_activity_executor_max_workers_is_inconsistent( diff --git a/tests/streams/__init__.py b/tests/streams/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py new file mode 100644 index 000000000..12663fa23 --- /dev/null +++ b/tests/streams/conftest.py @@ -0,0 +1,8 @@ +import pytest + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "reports_positions: the case needs append() to return where records landed", + ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py new file mode 100644 index 000000000..a9dcae815 --- /dev/null +++ b/tests/streams/test_streams_conformance.py @@ -0,0 +1,405 @@ +"""Conformance tests for the stream contract's outside surface. + +Written against the public surface, parametrised over the providers this +tree can stand up. The memory provider always runs, with no server and no +store. A storage provider adds itself to ``SETUPS``, behind its own +``STREAMS_LIVE`` gate when it needs a store the test environment does not +start: its setup receives the environment's client and hands back a provider +instance and which capabilities it lacks, so the cases marked +``reports_positions`` are skipped with a reason on a provider whose +``append()`` learns positions at read time. + +What this file pins down is the contract: the record on the wire, producer +identity, retry deduplication, positions, supersession, topic addressing, +cursor resumption, cursor ownership, and store keys that cannot collide. The +workflow-side handles and the two rules about Workflow Tasks live in +``test_streams_workflow``. +""" + +from __future__ import annotations + +import asyncio +import uuid +from collections.abc import AsyncIterator, Callable +from dataclasses import dataclass +from typing import Any + +import pytest + +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.converter import DataConverter +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamHandle, + StreamProvider, + Supersession, + _ids, + _wire, + topic, +) +from temporalio.streams._policy import AttemptTracker +from temporalio.streams.providers.memory import MemoryStreams + +# Defined once and shared by every case, the way an application shares them +# between its workflow, its activities and its backend. +OUT = topic("out", dict) +A = topic("a", dict) +B = topic("b", dict) +Y = topic("y", dict) +XY = topic("x:y", dict) + + +@dataclass +class ProviderCase: + """One provider under test, and what the cases may ask of it.""" + + name: str + provider: StreamProvider + reports_positions: bool = True + """``append()`` returns where the records landed.""" + + async def open( + self, workflow_id: str, *, run_id: str | None = None + ) -> StreamHandle: + # Only the memory provider gets here, and it takes no client. + return self.provider.get_stream_handle( + None, # type: ignore[arg-type] + workflow_id, + run_id=run_id, + ) + + +async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: + provider = MemoryStreams() + yield ProviderCase("memory", provider) + provider.reset() + + +SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { + "memory": _memory_case +} + +_CAPABILITIES = { + "reports_positions": lambda case: case.reports_positions, +} + + +@pytest.fixture(params=sorted(SETUPS)) +async def case( + request: pytest.FixtureRequest, client: Client +) -> AsyncIterator[ProviderCase]: + async for provider_case in SETUPS[request.param](client): + for marker, supported in _CAPABILITIES.items(): + if request.node.get_closest_marker(marker) and not supported(provider_case): + pytest.skip(f"the {provider_case.name} provider does not {marker}") + yield provider_case + + +def new_workflow_id() -> str: + # Unique per case, because a storage provider keeps what earlier cases + # wrote and the memory provider only happens to forget. + return f"wf-{uuid.uuid4().hex}" + + +async def take(records: Any, count: int, timeout: float = 5.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +def test_record_roundtrips_through_the_wire(): + converter = DataConverter.default.payload_converter + wire = _wire.to_wire( + converter, + topic="decisions", + kind=RecordKind.DATA, + value={"n": 1}, + producer_id="model", + attempt=3, + sequence=7, + ) + parsed = _wire.WireRecord.FromString(wire.SerializeToString()) + record = _wire.from_wire(converter, Cursor("memory:0"), parsed, dict) + assert ( + record.kind, + record.topic, + record.producer_id, + record.attempt, + record.sequence, + record.value, + ) == (RecordKind.DATA, "decisions", "model", 3, 7, {"n": 1}) + assert record.supersession is None + finish = _wire.to_wire(converter, topic="decisions", kind=RecordKind.FINISH) + assert not finish.HasField("body") + assert _wire.from_wire(converter, Cursor("memory:1"), finish, dict).value is None + + +def test_a_stored_supersession_is_not_a_record(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", kind=int(RecordKind.SUPERSEDED)) # type: ignore[arg-type] + with pytest.raises(ValueError, match="synthesized"): + _wire.from_wire(converter, Cursor("memory:0"), wire, None) + + +def test_an_unset_kind_is_read_as_data(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", body=converter.to_payloads([{"n": 1}])[0]) + record = _wire.from_wire(converter, Cursor("memory:0"), wire, dict) + assert record.kind is RecordKind.DATA + assert record.value == {"n": 1} + + +def test_supersession_is_synthesized_from_observations(): + attempts = AttemptTracker() + assert attempts.note("model", 1, topic="t", previous=BEGINNING) is None + superseded = attempts.note("model", 2, topic="t", previous=Cursor("memory:0")) + assert superseded is not None + assert superseded.kind is RecordKind.SUPERSEDED + assert superseded.supersession == Supersession("model", 1, 2) + assert superseded.value is None + # Positioned before the triggering record, so a resume after it delivers + # that record next. + assert superseded.cursor == Cursor("memory:0") + # The same attempt again is not a new generation. + assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None + + +def test_topic_keys_cannot_collide(): + # A colon in a workflow id must not make two addresses one key. + assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") + assert _ids.topic_key("a%3Ab", "c") != _ids.topic_key("a:b", "c") + assert _ids.topic_key("wf", "inputs") == "wf:inputs" + + +def test_cursors_name_their_provider(): + assert _wire.cursor_position(BEGINNING, provider="memory") is None + assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" + with pytest.raises(StreamCursorError): + _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") + + +async def test_append_read_roundtrip(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + assert (producer.producer_id, producer.attempt) == ("model", 1) + await producer.append({"id": "r1"}, {"id": "r2"}) + await producer.finish() + + records = await take(stream.read(topic=OUT), 3) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] + assert records[2].value is None + assert all(r.producer_id == "model" and r.attempt == 1 for r in records) + assert [r.sequence for r in records] == [0, 1, 2] + assert all(r.topic == OUT.name for r in records) + + +async def test_raw_values_pass_through_untouched(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + payload = Payload(metadata={"encoding": b"binary/plain"}, data=b"\x00\x01raw") + producer = stream.producer(topic=OUT.name, producer_id="model", attempt=1) + await producer.append(RawValue(payload)) + + records = await take(stream.read(topic="out", result_type=RawValue), 1) + assert isinstance(records[0].value, RawValue) + assert records[0].value.payload == payload + + +@pytest.mark.reports_positions +async def test_retried_append_returns_the_original_position(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + landed = await first.append({"id": "r1"}) + assert landed is not None + # The retry of the same attempt starts its sequence over and appends the + # same record. The provider stores it once and answers with where the + # original landed, so the retry can checkpoint the same position. + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + assert await retry.append({"id": "r1"}) == landed + # An empty call writes nothing and answers the same way. + assert await retry.append() == landed + + records = await take(stream.read(topic=OUT), 1) + assert records[0].value == {"id": "r1"} + assert records[0].cursor == landed + # The store holds exactly the one record: the newest position is its cursor. + assert await stream.latest(topic=OUT) == landed + + +async def test_retried_append_is_stored_once(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + await first.append({"id": "r1"}) + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + await retry.append({"id": "r1"}) + await retry.append({"id": "r2"}) + + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] + + +async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + await first.append({"text": "The capital of"}) + second = stream.producer(topic=OUT, producer_id="model", attempt=2) + await second.append({"text": "Paris is the capital"}) + + records = await take(stream.read(topic=OUT), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].supersession == Supersession("model", 1, 2) + assert records[1].value is None + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + + +async def test_a_superseded_record_resumes_to_the_triggering_record( + case: ProviderCase, +): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + await first.append({"n": 1}) + second = stream.producer(topic=OUT, producer_id="model", attempt=2) + await second.append({"n": 2}) + + records = await take(stream.read(topic=OUT), 3) + superseded = records[1] + assert superseded.kind is RecordKind.SUPERSEDED + # The synthesized record sits at the position before the new attempt's + # first record, so a consumer that checkpoints it and restarts is handed + # that record rather than skipping it. + assert superseded.cursor == records[0].cursor + resumed = await take(stream.read(topic=OUT, after=superseded.cursor), 1) + assert resumed[0].kind is RecordKind.DATA + assert resumed[0].value == {"n": 2} + + +async def test_topics_are_addressed_by_name(case: ProviderCase): + # Two producers on two topics of the same workflow's stream: each read + # names its topic and sees only that topic's records. + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + on_a = stream.producer(topic=A, producer_id="tool-a", attempt=1) + await on_a.append({"n": 1}) + on_b = stream.producer(topic=B, producer_id="tool-b", attempt=1) + await on_b.append({"n": 2}) + + only_a = await take(stream.read(topic=A), 1) + assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] + only_b = await take(stream.read(topic=B), 1) + assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] + + +async def test_cursor_resumes_where_it_points(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + records = await take(stream.read(topic=OUT), 3) + checkpoint = records[0].cursor + + # Resuming after a record hands back everything past it and nothing + # twice, without the reader ever advancing a cursor itself. + again = await take(stream.read(topic=OUT, after=checkpoint), 2) + assert [r.value for r in again] == [{"n": 2}, {"n": 3}] + + +@pytest.mark.reports_positions +async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + assert appended is not None + then = await producer.append({"n": 4}) + + # A producer that resumes a reader after its own append must see only + # what came later, not the tail of the batch it just wrote. + records = await take(stream.read(topic=OUT, after=appended), 1) + assert [r.value for r in records] == [{"n": 4}] + assert records[0].cursor == then + assert await producer.append() == then + + +async def test_latest_positions_a_reader_at_the_end(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + assert await stream.latest(topic=OUT) == BEGINNING + + await producer.append({"n": 1}, {"n": 2}) + since = await stream.latest(topic=OUT) + await producer.append({"n": 3}) + + # A reader that positioned itself before the last append sees only what + # came after, which is how a client follows a turn it is about to start. + records = await take(stream.read(topic=OUT, after=since), 1) + assert [r.value for r in records] == [{"n": 3}] + + +async def test_topic_addresses_with_colons_do_not_share_a_store(case: ProviderCase): + # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. + base = new_workflow_id() + left = await case.open(f"{base}:x") + right = await case.open(base) + await left.producer(topic=Y, producer_id="l", attempt=1).append({"side": "left"}) + await right.producer(topic=XY, producer_id="r", attempt=1).append({"side": "right"}) + + only_left = await take(left.read(topic=Y), 1) + assert [r.value for r in only_left] == [{"side": "left"}] + assert await left.latest(topic=Y) == only_left[0].cursor + only_right = await take(right.read(topic=XY), 1) + assert [r.value for r in only_right] == [{"side": "right"}] + assert await right.latest(topic=XY) == only_right[0].cursor + + +async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): + stream = await case.open(new_workflow_id()) + # Refused by read() itself, not by the first iteration of its generator, + # so the caller's except clause is where the mistake surfaces. + with pytest.raises(StreamCursorError): + stream.read(topic=OUT, after=Cursor("elsewhere:42")) + + +async def test_argument_mistakes_are_value_errors(case: ProviderCase): + stream = await case.open(new_workflow_id()) + with pytest.raises(ValueError): + stream.read(topic="") + with pytest.raises(ValueError): + stream.producer(topic="", producer_id="model", attempt=1) + # Outside an activity there is no identity to fall back on. + with pytest.raises(ValueError, match="producer_id is required"): + stream.producer(topic=OUT) + + +async def test_a_definition_carries_its_type_once(case: ProviderCase): + stream = await case.open(new_workflow_id()) + with pytest.raises(ValueError, match="already carries its type"): + stream.read(topic=OUT, result_type=dict) # type: ignore[call-overload] + with pytest.raises(ValueError): + topic("", dict) + # A string names a topic decided at runtime, and the hint rides the call. + assert await stream.latest(topic=OUT.name) == BEGINNING From 246f3c0d30ca13e37369bfdd24aa4cd7359b9ab8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:07:19 -0700 Subject: [PATCH 566/831] Added the workflow half of a server-side stream. A task's publishes on one stream are held until it completes, so they become one command and one History event however many there were, and a failed task publishes nothing. Delivered ranges are buffered because the server records a range as consumed and never sends it again. --- temporalio/worker/_workflow_instance.py | 224 ++++++++++++++++++ temporalio/workflow/__init__.py | 8 + temporalio/workflow/_context.py | 97 ++++++++ tests/worker/test_workflow_stream.py | 288 ++++++++++++++++++++++++ 4 files changed, 617 insertions(+) create mode 100644 tests/worker/test_workflow_stream.py diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 26f796e57..9b1e1ea0b 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -47,6 +47,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.sdk.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.activity_result import temporalio.bridge.proto.child_workflow import temporalio.bridge.proto.common @@ -272,6 +273,128 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: _ExceptionHandler: TypeAlias = Callable[[asyncio.AbstractEventLoop, _Context], Any] +# Match the server's per-batch limits. A record over its limit is refused where +# it is published, because a rejected command would be reissued on every +# replay; a task's records are split into commands that fit the batch limits. +_MAX_STREAM_RECORDS_PER_BATCH = 1000 +_MAX_STREAM_RECORD_BYTES = 1 << 20 +_MAX_STREAM_BATCH_BYTES = 2 << 20 + + +def _stream_batches( + records: Sequence[temporalio.api.stream.v1.StreamRecord], +) -> Iterator[list[temporalio.api.stream.v1.StreamRecord]]: + """Split one task's records for a stream into batches the server accepts.""" + batch: list[temporalio.api.stream.v1.StreamRecord] = [] + size = 0 + for record in records: + record_size = record.ByteSize() + if batch and ( + len(batch) >= _MAX_STREAM_RECORDS_PER_BATCH + or size + record_size > _MAX_STREAM_BATCH_BYTES + ): + yield batch + batch, size = [], 0 + batch.append(record) + size += record_size + if batch: + yield batch + + +def _is_completion_command( + command: temporalio.bridge.proto.workflow_commands.WorkflowCommand, +) -> bool: + return ( + command.HasField("complete_workflow_execution") + or command.HasField("continue_as_new_workflow_execution") + or command.HasField("fail_workflow_execution") + or command.HasField("cancel_workflow_execution") + ) + + +class _StreamBuffer: + """Holds the stream ranges delivered to a workflow so far. + + Delivery is driven by the server, not by whether workflow code happens to be + reading. A range arrives once, is recorded in History as consumed, and is + never sent again, so anything not yet read has to be kept here rather than + dropped. + """ + + def __init__(self, stream_id: str = "") -> None: + self._stream_id = stream_id + self._records: list[temporalio.workflow.DeliveredStreamRecord] = [] + self._waiters: list[asyncio.Future] = [] + # Where the next range has to start. Unknown until the first one + # arrives, because a subscription may start wherever the stream is and + # the server is the one that resolves that. + self._next_offset: int | None = None + + def extend( + self, + records: Sequence[temporalio.api.stream.v1.StreamRecord], + from_offset: int = 0, + to_offset: int | None = None, + ) -> None: + if to_offset is None: + to_offset = from_offset + len(records) + # A range is recorded as consumed once and never resent, so one that + # repeats, skips or mis-sizes would hand the workflow duplicate or + # shifted records with nothing to say so. Failing the task is what + # makes the fault visible. + if to_offset - from_offset != len(records): + raise RuntimeError( + f"stream {self._stream_id!r} delivered {len(records)} records " + f"for offsets [{from_offset}, {to_offset})" + ) + if self._next_offset is not None and from_offset != self._next_offset: + raise RuntimeError( + f"stream {self._stream_id!r} delivered offsets [{from_offset}, " + f"{to_offset}) but the last range ended at {self._next_offset}" + ) + self._next_offset = to_offset + # An empty range still counts as a delivery, but there is nothing to + # hand a reader, so only a non-empty one wakes anyone. + if not records: + return + # Offsets are dense inside a delivered range and the range arrives in + # order, so counting from its start is the position rather than an + # estimate of it. The per-record field is not on the activation, and a + # reader that has to resume elsewhere needs a position it can name. + for index, record in enumerate(records): + # Copied so the buffer outlives the activation that carried it. + kept = temporalio.api.stream.v1.StreamRecord() + kept.CopyFrom(record) + self._records.append( + temporalio.workflow.DeliveredStreamRecord( + record=kept, offset=from_offset + index + ) + ) + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) + + def take(self) -> list[temporalio.workflow.DeliveredStreamRecord]: + taken, self._records = self._records, [] + return taken + + def put_back( + self, records: Sequence[temporalio.workflow.DeliveredStreamRecord] + ) -> None: + """Return an unread tail to the front of the buffer.""" + self._records[:0] = records + + def wait_future(self) -> asyncio.Future: + loop = asyncio.get_event_loop() + fut = loop.create_future() + self._waiters.append(fut) + return fut + + def __len__(self) -> int: + return len(self._records) + + class _WorkflowInstanceImpl( # type: ignore[reportImplicitAbstractClass] WorkflowInstance, temporalio.workflow._Runtime, asyncio.AbstractEventLoop ): @@ -401,6 +524,16 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: str, list[temporalio.bridge.proto.workflow_activation.SignalWorkflow] ] = {} + # Stream ranges delivered to this workflow, keyed by stream id. Ranges + # arrive whether or not anything is reading yet, because the server has + # already recorded them as consumed and will not send them again. + self._stream_buffers: dict[str, _StreamBuffer] = {} + # Records this task's publishes append, by stream, until the task + # completes and they become commands. + self._stream_appends: dict[ + str, list[temporalio.api.stream.v1.StreamRecord] + ] = {} + # When we evict, we have to mark the workflow as deleting so we don't # add any commands and we swallow exceptions on tear down self._deleting = False @@ -461,6 +594,9 @@ def activate( temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion() ) self._current_completion.successful.SetInParent() + # A failed task's publishes never became commands, so nothing carries + # over into this one. + self._stream_appends = {} self._current_activation_error: Exception | None = None self._deployment_version_for_current_task = ( @@ -552,6 +688,9 @@ def activate( ) activation_err = None + if activation_err is None and not self._deleting: + self._flush_stream_appends() + # Apply versioning behavior if one was established if self._versioning_behavior: self._current_completion.successful.versioning_behavior = ( @@ -616,6 +755,8 @@ def _apply( ) -> None: if job.HasField("cancel_workflow"): self._apply_cancel_workflow(job.cancel_workflow) + elif job.HasField("deliver_stream_records"): + self._apply_deliver_stream_records(job.deliver_stream_records) elif job.HasField("do_update"): self._apply_do_update(job.do_update) elif job.HasField("fire_timer"): @@ -1141,6 +1282,19 @@ def _apply_resolve_signal_external_workflow( else: fut.set_result(None) + def _apply_deliver_stream_records( + self, + job: temporalio.bridge.proto.workflow_activation.DeliverStreamRecords, + ) -> None: + buffer = self._stream_buffers.get(job.stream_id) + if buffer is None: + # Nothing subscribed. The range is already recorded as consumed and + # will not be sent again, so buffering it is the only way a + # subscription made later in the same task still sees it. + buffer = _StreamBuffer(job.stream_id) + self._stream_buffers[job.stream_id] = buffer + buffer.extend(job.records, job.from_offset, job.to_offset) + def _apply_signal_workflow( self, job: temporalio.bridge.proto.workflow_activation.SignalWorkflow ) -> None: @@ -1305,6 +1459,76 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + # Reissued on every replay, so the buffer has to exist before the first + # range arrives and the command has to be harmless the second time. A + # repeat subscription leaves the server-side cursor where it is. + self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) + command = self._add_command() + command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.start_offset = start_offset + + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], + ) -> None: + self._assert_not_read_only("append stream records") + if not records: + raise ValueError("append_stream_records needs at least one record") + kept: list[temporalio.api.stream.v1.StreamRecord] = [] + for record in records: + if record.ByteSize() > _MAX_STREAM_RECORD_BYTES: + raise ValueError( + f"a stream record is limited to {_MAX_STREAM_RECORD_BYTES} " + f"bytes, got {record.ByteSize()}" + ) + copy = temporalio.api.stream.v1.StreamRecord() + copy.CopyFrom(record) + # The workflow is the producer here, whatever the caller set. + copy.producer_id = "" + kept.append(copy) + # Held until the task completes, so a task's publishes on one stream + # become one command and one History event however many there were. + self._stream_appends.setdefault(stream_id, []).extend(kept) + + def _flush_stream_appends(self) -> None: + appends, self._stream_appends = self._stream_appends, {} + if not appends: + return + commands = self._current_completion.successful.commands + # Ahead of any command that ends the run, because the server accepts + # nothing after one of those. + insert_at = len(commands) + for index, command in enumerate(commands): + if _is_completion_command(command): + insert_at = index + break + for stream_id, records in appends.items(): + for batch in _stream_batches(records): + command = temporalio.bridge.proto.workflow_commands.WorkflowCommand() + command.append_stream_records.stream_id = stream_id + command.append_stream_records.records.extend(batch) + commands.insert(insert_at, command) + insert_at += 1 + + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[temporalio.workflow.DeliveredStreamRecord]: + # Ranges arrive on Workflow Tasks, and a query activation carries none, + # so without this the read waits on a future nothing can resolve and the + # query times out with nothing to say why. + self._assert_not_read_only("read stream") + buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) + while not len(buffer): + await buffer.wait_future() + taken = buffer.take() + if max_records and len(taken) > max_records: + # Put the tail back rather than dropping it: nothing will resend it. + buffer.put_back(taken[max_records:]) + taken = taken[:max_records] + return taken + def workflow_get_current_history_length(self) -> int: return self._current_history_length diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index f63135bf4..18d04cb0c 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -58,6 +58,7 @@ wait, ) from ._context import ( + DeliveredStreamRecord, Info, ParentInfo, RootInfo, @@ -65,6 +66,7 @@ _current_update_info, _Runtime, _set_current_update_info, + append_stream_records, cancellation_reason, current_update_info, deprecate_patch, @@ -86,9 +88,11 @@ payload_converter, random, random_seed, + read_stream_records, register_random_seed_callback, set_current_details, sleep, + subscribe_stream, time, time_ns, upsert_memo, @@ -233,6 +237,10 @@ "upsert_search_attributes", "uuid4", "uuid7", + "DeliveredStreamRecord", + "read_stream_records", + "append_stream_records", + "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 25523836a..8b6c07782 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -14,6 +14,7 @@ from nexusrpc import InputT, OutputT import temporalio.api.common.v1 +import temporalio.api.stream.v1 import temporalio.common import temporalio.converter @@ -313,6 +314,21 @@ def workflow_get_current_deployment_version( self, ) -> temporalio.common.WorkerDeploymentVersion | None: ... + @abstractmethod + def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + + @abstractmethod + def workflow_append_stream_records( + self, + stream_id: str, + records: Sequence[temporalio.api.stream.v1.StreamRecord], + ) -> None: ... + + @abstractmethod + async def workflow_read_stream_records( + self, stream_id: str, max_records: int + ) -> list[DeliveredStreamRecord]: ... + @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -949,6 +965,87 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) +def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: + """Subscribe this workflow to a server-side stream. + + From here on its Workflow Tasks carry the ranges it has not consumed yet, + and :func:`read_stream_records` returns them. Safe to call again: a second + subscription to a stream this run already consumes does not move its + cursor, though it does write one event. Calling it on every replay is + harmless because replay matches the command to the event already recorded. + + Only the stream id and start offset go to the server. The rest of the + stream's addressing is resolved there, because a workflow cannot look it up + without doing I/O and a value it carried would be a reading rather than a + fact. A name this workflow has not written yet names a stream it owns, and + subscribing creates it. + + Args: + stream_id: Stream to consume: the name of one this workflow owns, or + the id of a standalone stream. + start_offset: Where to start. Negative means from wherever the stream is + when the subscription is registered; the server resolves that once + and records it, so replay does not resolve it again. + """ + _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + + +def append_stream_records( + records: Sequence[temporalio.api.stream.v1.StreamRecord], + *, + stream_id: str = "", +) -> None: + """Publish records to a server-side stream this workflow owns. + + Returns at once. The records become one command when this Workflow Task + completes, so they are visible when the task is accepted and never if it + fails. Their bodies go to the stream's own log rather than into History, + which gets one fixed-size event naming the offset range, so a task that + publishes a thousand records costs History the same as one that publishes + one. Readers do not have to exist yet, and adding one costs the writer + nothing. + + Args: + records: Records to append, in order. The server stores each with an + empty ``producer_id``, because the workflow is the producer. + stream_id: Stream to publish to. Empty means the workflow's default + output stream. + + Raises: + ValueError: ``records`` is empty or one of them is over the server's + per-record size limit. + """ + _Runtime.current().workflow_append_stream_records(stream_id, records) + + +@dataclass(frozen=True) +class DeliveredStreamRecord: + """One record a consuming workflow was given, with where it sat.""" + + record: temporalio.api.stream.v1.StreamRecord + offset: int + """Its position in the whole stream, which is what a reader resumes from.""" + + +async def read_stream_records( + stream_id: str, *, max_records: int = 0 +) -> list[DeliveredStreamRecord]: + """Read the next records of a server-side stream this workflow consumes. + + Waits until at least one record is available. Ranges arrive on Workflow + Tasks, and only the offsets they covered are written to History, so this is + deterministic on replay: the server re-supplies the same ranges by reading + the stream again. Subscribe first with :func:`subscribe_stream`; this only + reads what has already been delivered to this workflow. + + Args: + stream_id: Stream to read from. + max_records: Most records to return at once, or 0 for everything + available. + """ + return await _Runtime.current().workflow_read_stream_records(stream_id, max_records) + + async def wait_condition( fn: Callable[[], bool], *, diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py new file mode 100644 index 000000000..9083e74a9 --- /dev/null +++ b/tests/worker/test_workflow_stream.py @@ -0,0 +1,288 @@ +"""In-workflow consumption and publication of a server-side stream. + +Ranges arrive on Workflow Tasks and only the offsets they covered are written to +History, so replay is served by the server reading the stream again. These tests +drive the buffering, the workflow-facing read and the per-task publish directly, +which is the part this SDK owns; the delivery decision itself lives in the +server and sdk-core. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.stream.v1 as api_stream +from temporalio.bridge.proto.workflow_commands import WorkflowCommand +from temporalio.worker._workflow_instance import ( + _MAX_STREAM_BATCH_BYTES, + _MAX_STREAM_RECORD_BYTES, + _MAX_STREAM_RECORDS_PER_BATCH, + _StreamBuffer, + _WorkflowInstanceImpl, +) +from temporalio.workflow import ReadOnlyContextError + + +def record(body: bytes, topic: str = "") -> api_stream.StreamRecord: + return api_stream.StreamRecord( + body=temporalio.api.common.v1.Payload(data=body), topic=topic + ) + + +def bodies(delivered: list[Any]) -> list[bytes]: + return [item.record.body.data for item in delivered] + + +async def test_buffer_hands_over_in_order() -> None: + buffer = _StreamBuffer() + buffer.extend([record(b"one"), record(b"two")]) + + assert bodies(buffer.take()) == [b"one", b"two"] + assert len(buffer) == 0 + + +# A reader that arrives before the data must not miss it, and one that arrives +# after must not block: the range is delivered once and never resent. +async def test_buffer_wakes_a_waiting_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + assert not waiter.done() + + buffer.extend([record(b"late")]) + await asyncio.wait_for(waiter, timeout=1) + assert bodies(buffer.take()) == [b"late"] + + +# An empty range is still a delivery the server recorded, but there is nothing +# to hand a reader, so it must not wake one into returning nothing. +async def test_empty_range_does_not_wake_a_reader() -> None: + buffer = _StreamBuffer() + waiter = buffer.wait_future() + + buffer.extend([]) + + assert not waiter.done() + assert len(buffer) == 0 + + +async def test_buffer_keeps_data_delivered_before_anyone_reads() -> None: + buffer = _StreamBuffer() + buffer.extend([record(b"early")]) + + # No waiting: the data is already there. + assert len(buffer) == 1 + waiter = buffer.wait_future() + assert not waiter.done(), "a fresh waiter is only resolved by new data" + assert bodies(buffer.take()) == [b"early"] + + +class _ReadOnlyStub: + """Enough of the workflow instance to drive the real read. + + The cap lives inside ``workflow_read_stream_records``, so a test that + reimplements it proves nothing about the code that ships. Borrowing the + method off the real class is what keeps the test on the shipped path. + """ + + workflow_read_stream_records = _WorkflowInstanceImpl.workflow_read_stream_records + + def __init__(self, read_only: bool = False) -> None: + self._stream_buffers: dict[str, _StreamBuffer] = {} + self._read_only = read_only + + def _assert_not_read_only(self, action: str) -> None: + if self._read_only: + raise ReadOnlyContextError(f"cannot {action} in a read-only context") + + async def read(self, stream: str, max_records: int) -> list[bytes]: + instance: Any = self + return bodies( + await _WorkflowInstanceImpl.workflow_read_stream_records( + instance, stream, max_records + ) + ) + + +@pytest.mark.parametrize("max_records", [1, 2, 5]) +async def test_read_respects_a_cap_without_losing_the_tail(max_records: int) -> None: + stub = _ReadOnlyStub() + expected = [b"a", b"b", b"c"] + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([record(b) for b in expected]) + + got = await stub.read("s", max_records) + + assert got == expected[:max_records] + # Whatever the cap left behind has to still be there: nothing resends it. + assert len(stub._stream_buffers["s"]) == max(0, len(expected) - max_records) + + if len(stub._stream_buffers["s"]): + rest = await stub.read("s", 0) + assert got + rest == expected + else: + assert got == expected + + +# A query activation carries no ranges, so a read there would wait on a future +# nothing can resolve and the query would time out saying nothing. +async def test_read_is_refused_in_a_read_only_context() -> None: + stub = _ReadOnlyStub(read_only=True) + stub._stream_buffers["s"] = _StreamBuffer() + stub._stream_buffers["s"].extend([record(b"a")]) + + with pytest.raises(ReadOnlyContextError, match="read stream"): + await stub.read("s", 0) + # Refused before the buffer was touched, so the range is still there for + # the task that is allowed to read it. + assert len(stub._stream_buffers["s"]) == 1 + + +# A range is recorded as consumed once and never resent, so the buffer is the +# only place a repeated, skipped or mis-sized delivery can still be noticed. +async def test_ranges_have_to_abut_the_last_one() -> None: + buffer = _StreamBuffer("s") + buffer.extend([record(b"a"), record(b"b")], 0, 2) + # An empty range moves the expectation too: the server recorded it. + buffer.extend([], 2, 2) + buffer.extend([record(b"c")], 2, 3) + assert [item.offset for item in buffer.take()] == [0, 1, 2] + + with pytest.raises(RuntimeError, match=r"\[2, 3\).*ended at 3"): + buffer.extend([record(b"c")], 2, 3) + with pytest.raises(RuntimeError, match=r"\[5, 6\).*ended at 3"): + buffer.extend([record(b"f")], 5, 6) + + +async def test_a_range_has_to_carry_as_many_records_as_it_spans() -> None: + buffer = _StreamBuffer("s") + with pytest.raises(RuntimeError, match=r"2 records for offsets \[0, 1\)"): + buffer.extend([record(b"a"), record(b"b")], 0, 1) + assert len(buffer) == 0 + + +class _Completion: + def __init__(self) -> None: + self.commands: list[WorkflowCommand] = [] + + +class _Successful: + def __init__(self) -> None: + self.successful = _Completion() + + +class _CommandStub: + """Drives the real publish path and keeps the commands it issued. + + The completion's command list is a plain list here, which supports the + same ``insert`` the protobuf container does. + """ + + workflow_append_stream_records = ( + _WorkflowInstanceImpl.workflow_append_stream_records + ) + _flush_stream_appends = _WorkflowInstanceImpl._flush_stream_appends + + def __init__(self) -> None: + self._stream_appends: dict[str, list[api_stream.StreamRecord]] = {} + self._current_completion = _Successful() + + def _assert_not_read_only(self, _action: str) -> None: + pass + + @property + def commands(self) -> list[WorkflowCommand]: + return self._current_completion.successful.commands + + def publish(self, *records: api_stream.StreamRecord, stream_id: str = "") -> None: + instance: Any = self + _WorkflowInstanceImpl.workflow_append_stream_records( + instance, stream_id, list(records) + ) + + def flush(self) -> None: + instance: Any = self + _WorkflowInstanceImpl._flush_stream_appends(instance) + + +# A task's publishes on one stream become one command, whatever their number, +# because the event the command produces is what bounds a workflow's History. +def test_a_tasks_publishes_on_one_stream_become_one_command() -> None: + stub = _CommandStub() + stub.publish(record(b"a"), record(b"b")) + stub.publish(record(b"c")) + stub.publish(record(b"d"), stream_id="other") + assert stub.commands == [] + + stub.flush() + + by_stream = { + command.append_stream_records.stream_id: [ + r.body.data for r in command.append_stream_records.records + ] + for command in stub.commands + } + assert by_stream == {"": [b"a", b"b", b"c"], "other": [b"d"]} + # Flushed once: a second flush has nothing left to say. + stub.flush() + assert len(stub.commands) == 2 + + +# The workflow is the producer of what it publishes, whatever the caller set. +def test_the_workflows_records_carry_no_producer() -> None: + stub = _CommandStub() + stub.publish(api_stream.StreamRecord(producer_id="someone", attempt=3)) + stub.flush() + assert stub.commands[0].append_stream_records.records[0].producer_id == "" + + +# The server accepts nothing after a command that ends the run, so the +# publishes have to go ahead of it. +def test_publishes_are_flushed_ahead_of_the_completion_command() -> None: + stub = _CommandStub() + stub.publish(record(b"a")) + done = WorkflowCommand() + done.complete_workflow_execution.SetInParent() + stub.commands.append(done) + + stub.flush() + + assert [c.WhichOneof("variant") for c in stub.commands] == [ + "append_stream_records", + "complete_workflow_execution", + ] + + +# The server refuses an oversized record, and a refused command is reissued on +# every replay, so the limit has to be applied before the record is buffered. +def test_a_record_over_the_server_limit_is_refused_before_the_command() -> None: + stub = _CommandStub() + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16))) + with pytest.raises(ValueError, match=f"{_MAX_STREAM_RECORD_BYTES} bytes"): + stub.publish(record(b"x" * (_MAX_STREAM_RECORD_BYTES + 1))) + stub.flush() + assert len(stub.commands) == 1 + + +# A task that publishes more than one batch holds is split into commands the +# server accepts, by count and by bytes, rather than refused. +def test_a_task_over_the_batch_limits_is_split_into_commands() -> None: + stub = _CommandStub() + stub.publish(*(record(b"x") for _ in range(_MAX_STREAM_RECORDS_PER_BATCH + 1))) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [ + _MAX_STREAM_RECORDS_PER_BATCH, + 1, + ] + + stub = _CommandStub() + # Two records that fit one batch together, then one whose framing alone + # overflows the room they leave. + big = record(b"x" * (_MAX_STREAM_RECORD_BYTES - 16)) + room = _MAX_STREAM_BATCH_BYTES - 2 * big.ByteSize() + stub.publish(big, big, record(b"y" * room)) + stub.flush() + assert [len(c.append_stream_records.records) for c in stub.commands] == [2, 1] From c76d1763244a9e8fb45fa081d5696b6036650afc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:07:25 -0700 Subject: [PATCH 567/831] Added the native provider with one owned stream per topic. The workflow subscribes to the topic by name and publishes with the batched command; outside code appends and long-polls the same stream, following the run chain by cursor unless pinned. --- temporalio/streams/providers/native.py | 463 ++++++++++++++++++++++ tests/streams/test_streams_conformance.py | 53 ++- tests/worker/test_workflow_stream_e2e.py | 386 ++++++++++++++++++ 3 files changed, 901 insertions(+), 1 deletion(-) create mode 100644 temporalio/streams/providers/native.py create mode 100644 tests/worker/test_workflow_stream_e2e.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py new file mode 100644 index 000000000..9c0cb3dbd --- /dev/null +++ b/temporalio/streams/providers/native.py @@ -0,0 +1,463 @@ +"""The server-side (native) provider. + +Streams live on the Temporal server, beside the workflow that owns them. A +topic is one owned stream named after the topic, created by whoever touches it +first: the workflow publishes to it with a command the server applies in the +transaction that accepts the Workflow Task, subscribes to it by name and reads +the ranges the server delivers on its Workflow Tasks; outside code appends and +reads through the stream service, and the workflow's records and an outside +producer's land in one log in the order the server accepted them. + +A cursor names the run as well as the offset, because an owned stream belongs +to one run and a successor's starts over at zero. A handle without a run id +reads run after run, learning from the poll that a run's stream is closed and +from the run's close event who came next; with a run id it is pinned. + +Prototype support for AI-198. It needs a server built from that branch and +opens its own gRPC channel to it, because sdk-core does not know the stream +service yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import logging +from collections.abc import AsyncGenerator +from typing import Any, Generic, TypeVar + +from temporalio import workflow +from temporalio.client import Client, WorkflowHistoryEventFilterType +from temporalio.client_stream import ( + StreamClient, + WorkflowStreamHandle, + close_shared_clients, + shared_client, +) +from temporalio.converter import PayloadCodec, PayloadConverter +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._provider import ReadSource, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["NativeProducer", "NativeStreamHandle", "NativeStreams"] + +T = TypeVar("T") + +_PROVIDER = "native" + +logger = logging.getLogger(__name__) + + +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _cursor(run_id: str, offset: int) -> Cursor: + return mint_cursor(_PROVIDER, f"{run_id}:{offset}") + + +def _position(after: Cursor) -> tuple[str, int] | None: + """The ``(run id, offset)`` a cursor of this provider names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + run_id, _, offset = token.rpartition(":") + try: + if not run_id: + raise ValueError + return run_id, int(offset) + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a run and an offset on the " + "native provider" + ) from None + + +async def _encode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + # The worker's payload visitor runs a codec over the bodies a workflow + # publishes and receives; the outside half has no such pass, so it applies + # the client's codec here or the two sides would not agree. + if codec is None or not record.HasField("body"): + return record + encoded = await codec.encode([record.body]) + record.body.CopyFrom(encoded[0]) + return record + + +async def _decode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: + if codec is None or not record.HasField("body"): + return record + decoded = await codec.decode([record.body]) + record.body.CopyFrom(decoded[0]) + return record + + +class _NativeReadSource: + """One subscription of the running workflow, fed by delivered ranges.""" + + def __init__(self, stream_id: str, run_id: str) -> None: + self._stream_id = stream_id + self._run_id = run_id + self._closed = False + + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + if self._closed: + raise StopAsyncIteration + delivered = await workflow.read_stream_records(self._stream_id) + return [(_cursor(self._run_id, item.offset), item.record) for item in delivered] + + def close(self) -> None: + self._closed = True + + +class _NativeWriteSink: + def __init__(self, topic: str) -> None: + self._topic = topic + + def publish(self, record: WireRecord) -> None: + # Held by the runtime until the task completes, when the task's + # records on this topic become one command the server applies with + # the task: rule 1 through the server's own commit. + workflow.append_stream_records([record], stream_id=self._topic) + + +class _NativeWorkflowProvider: + """The workflow half: the server's commands and delivered ranges.""" + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + run_id = workflow.info().run_id + start = 0 + named = _position(after) + if named is not None: + if named[0] != run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run; a run's stream is its own" + ) + start = named[1] + 1 + workflow.subscribe_stream(topic, start_offset=start) + return _NativeReadSource(topic, run_id) + + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _NativeWriteSink(topic) + + def on_workflow_start(self) -> None: + pass + + async def on_workflow_finish(self) -> None: + pass + + +class NativeProducer(Generic[T]): + """Appends to a topic from outside workflow code. + + Every append is visible as soon as the server accepts it. That is the + point for an activity streaming model output, and it is why an activity + carries its own identity: the retry of a failed attempt has no commit + boundary to sort it out afterwards. + """ + + def __init__( + self, + handle: WorkflowStreamHandle, + pin: Any, + codec: PayloadCodec | None, + converter: PayloadConverter, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + """Bind this producer to ``topic`` on the stream ``handle`` names.""" + self._handle = handle + self._pin = pin + self._codec = codec + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _writer(self) -> str: + # The server dedupes on this and the sequence. The attempt is part of + # it so a retried append is dropped while a new generation writing + # different words at the same sequence is not. + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) + + async def append(self, *values: T) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed, because the server + answers a deduplicated batch with the original offsets; an empty call + returns the position of this producer's last record. + """ + if not values: + return self._last + return await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.DATA, + value=value, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence + index, + ) + for index, value in enumerate(values) + ] + ) + + async def finish(self) -> None: + """Write ``FINISH`` for this producer on this topic.""" + await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] + ) + + async def _write(self, records: list[WireRecord]) -> Cursor: + # Pinned before the first write, so every cursor this producer hands + # out names the run its records landed in. + if not self._handle.owner_run_id: + self._handle.pin(await self._pin()) + for record in records: + await _encode_body(self._codec, record) + appended = await self._handle.append( + *records, producer_id=self._writer, sequence=self._sequence + ) + self._sequence += len(records) + self._last = _cursor(self._handle.owner_run_id, appended.next_offset - 1) + return self._last + + +class NativeStreamHandle: + """One workflow's topics from outside, over the stream service.""" + + def __init__(self, client: Client, workflow_id: str, run_id: str | None) -> None: + """Address ``workflow_id``'s topics, pinned to ``run_id`` when one is given.""" + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = client.data_converter.payload_converter + self._codec = client.data_converter.payload_codec + self._streams: StreamClient | None = None + + def _service(self) -> StreamClient: + # Resolved on first use, because the shared channel belongs to the + # running loop and a handle may be made before there is one. + if self._streams is None: + self._streams = shared_client( + self._client.service_client.config.target_host, + self._client.namespace, + ) + return self._streams + + def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: + return self._service().workflow_stream( + self._workflow_id, topic, owner_run_id=run_id + ) + + def read( + self, + *, + topic: str | StreamTopic[Any], + after: Cursor = BEGINNING, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + topic, result_type = resolve_topic(topic, result_type) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + named = _position(after) + if named is not None and self._run_id is not None and named[0] != self._run_id: + raise StreamCursorError( + f"cursor {after.token!r} names another run than this handle is pinned to" + ) + return self._read(topic, named, after, result_type) + + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + if named is not None: + run_id, offset = named[0], named[1] + 1 + else: + run_id, offset = self._run_id or await self._first_run(), 0 + while True: + stream = self._stream(topic, run_id) + while True: + page = await stream.poll(from_offset=offset) + for entry in page.entries: + record = await _decode_body(self._codec, entry.record) + for out in decoder.decode(_cursor(run_id, entry.offset), record): + yield out + offset = page.next_offset + # On a pinned stream the server reports the run's end as closed, + # and a closed stream is finished once its head is delivered. + if page.closed and offset >= page.head_offset: + break + if self._run_id is not None: + return + successor = await self._successor(run_id) + if successor is None: + return + run_id, offset = successor, 0 + + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + """The cursor of the newest record on ``topic``, naming the run it was read from. + + An empty topic on the chain's first run is the beginning of the + stream; on a successor it is a position of its own, because + ``BEGINNING`` would send a chain-following read back to the first run. + """ + topic, _ = resolve_topic(topic) + run_id = self._run_id or await self._current_run() + try: + head = (await self._stream(topic, run_id).describe()).head_offset + except StreamNotFoundError: + # A topic nobody has written yet does not exist on the server, + # which is the same answer as an empty one. + head = 0 + if head > 0: + return _cursor(run_id, head - 1) + if self._run_id is None and await self._predecessor(run_id) is not None: + return _cursor(run_id, -1) + return BEGINNING + + def producer( + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer[Any]: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + topic, _ = resolve_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return NativeProducer( + self._stream(topic, self._run_id or ""), + self._current_run, + self._codec, + self._converter, + topic, + producer_id, + attempt, + ) + + async def _current_run(self) -> str: + try: + description = await self._client.get_workflow_handle( + self._workflow_id + ).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + assert description.run_id is not None + return description.run_id + + async def _first_run(self) -> str: + """The oldest retained run of the chain, walking back from the latest.""" + run_id = await self._current_run() + while True: + previous = await self._predecessor(run_id) + if previous is None: + return run_id + run_id = previous + + async def _predecessor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) + try: + async for event in handle.fetch_history_events(page_size=1): + attributes = event.workflow_execution_started_event_attributes + return attributes.continued_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + # The run's History is gone: the chain's retained part starts here. + return None + + async def _successor(self, run_id: str) -> str | None: + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) + events = handle.fetch_history_events( + event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT + ) + try: + async for event in events: + if event.HasField( + "workflow_execution_continued_as_new_event_attributes" + ): + attributes = ( + event.workflow_execution_continued_as_new_event_attributes + ) + return attributes.new_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + return None + + +class NativeStreams(ProviderPlugin): + """The server-side provider. + + Takes no options: the streams are on the server the client is already + connected to. Construct one, pass it to the worker as a plugin and open + handles from it anywhere else; :meth:`close` releases the channels this + process opened to the stream service. + """ + + def workflow_provider(self) -> _NativeWorkflowProvider: + """The workflow half, over the server's commands and delivered ranges.""" + return _NativeWorkflowProvider() + + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> NativeStreamHandle: + """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain.""" + return NativeStreamHandle(client, workflow_id, run_id) + + async def close(self) -> None: + """Close the channels this process opened to the stream service.""" + await close_shared_clients() diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9002ea16a..3bdc93e1a 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,6 +21,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass @@ -28,8 +29,9 @@ import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -46,6 +48,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.native import NativeStreams +from tests.helpers import new_worker # Defined once and shared by every case, the way an application shares them # between its workflow, its activities and its backend. @@ -91,9 +95,56 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: + # The store is a server built from the stream-carrying branch, which the + # test environment's own server is not; TEMPORAL_ADDRESS names it. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = NativeStreams() + # Registered once, on the client: the host's worker inherits it and the + # cases open handles through client.get_stream_handle. + config = client.config() + config["plugins"] = [provider] + client = Client(**config) + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase("native", provider, client, host=host) + for handle in hosts.values(): + await handle.terminate() + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { "memory": _memory_case } +if os.environ.get("STREAMS_LIVE") == "native": + SETUPS["native"] = _native_case _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py new file mode 100644 index 000000000..1d974b401 --- /dev/null +++ b/tests/worker/test_workflow_stream_e2e.py @@ -0,0 +1,386 @@ +"""The native provider inside a real workflow, against a server that has streams. + +The two rules the memory provider cannot keep are the measurement here: a +publish commits with its Workflow Task and never lands if the task fails, and +a read is a recorded observation the server re-supplies on replay. Needs a +Temporal server built from the AI-198 branch, because neither the stream +service nor the commands exist on a released one: + + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/worker/test_workflow_stream_e2e.py + +Skipped otherwise, rather than passing against a server that has no idea what a +stream is. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.api.enums.v1 import EventType +from temporalio.api.stream.v1 import StreamRecord +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.streams import RecordKind +from temporalio.streams.providers.native import NativeStreams +from temporalio.worker import Worker +from tests.streams.test_streams_conformance import take + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +INPUTS = "inputs" +DECISIONS = "decisions" + +EVENT_STREAM_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED +EVENT_STREAM_RECORDS_APPENDED = EventType.EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED + + +async def _connect(provider: NativeStreams | None = None) -> Client: + # Registered once, on the client: the worker inherits it and the tests + # open handles through client.get_stream_handle. The contrib tests below + # need no provider. + return await Client.connect(TARGET or "", plugins=[provider] if provider else []) + + +async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: + counts = { + EVENT_STREAM_RECORDS_APPENDED: 0, + EVENT_STREAM_SUBSCRIBED: 0, + EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED: 0, + } + async for event in client.get_workflow_handle(workflow_id).fetch_history_events(): + if event.event_type in counts: + counts[event.event_type] += 1 + return counts + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "replaced": record.supersession.previous_attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) + trace.append({"kind": "decision", "n": record.value["n"]}) + decisions.finish() + return trace + + +async def test_the_interface_loop_runs_on_the_server_with_a_cold_cache() -> None: + """Rule 2 on the native provider: every task replays from the server. + + With the cache off, each Workflow Task rebuilds the workflow from History + and the server re-supplies the ranges earlier tasks consumed, so the loop + completing at all means the same records came back in the same order. + """ + provider = NativeStreams() + client = await _connect(provider) + task_queue = "loop-tq-" + uuid.uuid4().hex[:8] + workflow_id = "loop-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"n": 1}, {"n": 2}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"n": 3}) + await second.finish() + trace = await asyncio.wait_for(handle.result(), 60) + + assert trace == [ + {"kind": "decision", "n": 1}, + {"kind": "decision", "n": 2}, + {"kind": "superseded", "replaced": 1}, + {"kind": "decision", "n": 3}, + {"kind": "finish", "producer": "model"}, + ] + + # The read ends by itself: the workflow is closed and the tail + # delivered, with the workflow's own records carrying no producer. + async def read_everything() -> list[Any]: + return [ + (r.producer_id, r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + assert await asyncio.wait_for(read_everything(), 60) == [ + ("", RecordKind.DATA, {"decided": 1}), + ("", RecordKind.DATA, {"decided": 2}), + ("", RecordKind.DATA, {"retracting_attempt": 1}), + ("", RecordKind.DATA, {"decided": 3}), + ("", RecordKind.FINISH, None), + ] + counts = await _event_counts(client, workflow_id) + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + # Several tasks published, one event each; the loop spanned more than + # one task or the cold cache proved nothing. + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 2 + assert ( + 1 + <= counts[EVENT_STREAM_RECORDS_APPENDED] + <= counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] + ) + finally: + await provider.close() + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + decisions.finish() + + +async def test_a_failed_task_publishes_nothing() -> None: + """Rule 1 on the native provider: the server applies the command with the task.""" + provider = NativeStreams() + client = await _connect(provider) + task_queue = "fail-tq-" + uuid.uuid4().hex[:8] + workflow_id = "fail-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishThenFail], + ): + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + records = await take( + stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60 + ) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] + finally: + await provider.close() + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new() -> None: + provider = NativeStreams() + client = await _connect(provider) + task_queue = "relay-tq-" + uuid.uuid4().hex[:8] + workflow_id = "relay-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker(client, task_queue=task_queue, workflows=[Relay]): + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + + async def read_everything() -> list[Any]: + return [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + + records = await asyncio.wait_for(read_everything(), 60) + await handle.result() + # The chain is followed: the successor's record arrives on the same + # read, each cursor names its run, and the read ends with the chain. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + # Pinned to the last run, a handle sees that run's stream alone. + last_run = (await client.get_workflow_handle(workflow_id).describe()).run_id + pinned = client.get_stream_handle(workflow_id, run_id=last_run) + only_last = [ + r.value async for r in pinned.read(topic=DECISIONS, result_type=dict) + ] + assert only_last == [{"run": 1}, None] + finally: + await provider.close() + + +@workflow.defn +class PublishAndRead: + """Publishes through the low-level surface and reads its own records back.""" + + @workflow.run + async def run(self) -> list[str]: + workflow.append_stream_records( + [_record(b"alpha", "progress"), _record(b"beta", "progress")], + stream_id="output", + ) + workflow.append_stream_records([_record(b"gamma")], stream_id="output") + # A name this workflow has not written yet still names a stream it + # owns, so subscribing creates the one the later publish lands in. + workflow.subscribe_stream("output", start_offset=0) + + received: list[str] = [] + while len(received) < 3: + for item in await workflow.read_stream_records("output"): + received.append(item.record.body.data.decode()) + return received + + +def _record(body: bytes, topic: str = "") -> StreamRecord: + return StreamRecord( + body=Payload(data=body, metadata={"encoding": b"binary/plain"}), topic=topic + ) + + +async def test_a_tasks_publishes_become_one_event() -> None: + client = await _connect() + task_queue = "publish-tq-" + uuid.uuid4().hex[:8] + workflow_id = "publish-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[PublishAndRead], + # Every task after the first is a replay, so completing at all means the + # reissued publish matched the event the first run wrote. + max_cached_workflows=0, + ): + result = await asyncio.wait_for( + client.execute_workflow( + PublishAndRead.run, id=workflow_id, task_queue=task_queue + ), + timeout=60, + ) + assert result == ["alpha", "beta", "gamma"] + + counts = await _event_counts(client, workflow_id) + # Two calls in one task carrying three records, so one event: the event is + # per task and stream, which is what makes publishing often free. + assert counts[EVENT_STREAM_RECORDS_APPENDED] == 1 + assert counts[EVENT_STREAM_SUBSCRIBED] == 1 + + +@workflow.defn +class ConsumeAcrossTasks: + """Reads a standalone stream over several Workflow Tasks, then reports what it saw. + + The turn structure is the point: each read that finds nothing blocks, + which ends a Workflow Task, so the run spans several. With the cache on, + every task after the first is sticky. + """ + + @workflow.run + async def run(self, stream_id: str, expected: int) -> list[str]: + workflow.subscribe_stream(stream_id, start_offset=0) + seen: list[str] = [] + while len(seen) < expected: + for item in await workflow.read_stream_records(stream_id): + seen.append(item.record.body.data.decode()) + return seen + + +async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: + """The workflow cache stays on, which is what a real worker does. + + The server sends no replay slice for a sticky task, while the sticky + history still carries the previous task's consumed range, and the two + together have to agree on every task after the first consumed range. + """ + client = await _connect() + streams = StreamClient.connect(TARGET or "") + task_queue = "sticky-tq-" + uuid.uuid4().hex[:8] + workflow_id = "sticky-wf-" + uuid.uuid4().hex[:8] + stream_id = "sticky-src-" + uuid.uuid4().hex[:8] + + batches = [["a1", "a2"], ["b1"], ["c1", "c2", "c3"]] + expected = [tok for batch in batches for tok in batch] + + try: + await streams.create(stream_id) + async with Worker( + client, task_queue=task_queue, workflows=[ConsumeAcrossTasks] + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(expected)], + id=workflow_id, + task_queue=task_queue, + ) + + # Spaced out so the workflow drains, blocks and ends a task between + # them. Without the gap the appends coalesce into one task and the + # sticky path is never taken. + for batch in batches: + await streams.get(stream_id).append( + *[_record(t.encode()) for t in batch] + ) + await asyncio.sleep(0.4) + + assert await asyncio.wait_for(handle.result(), timeout=60) == expected + + counts = await _event_counts(client, workflow_id) + assert counts[EventType.EVENT_TYPE_WORKFLOW_TASK_COMPLETED] >= 3, ( + "sticky path not exercised" + ) + finally: + await streams.close() From cf6a38c4fa61c8a673896354a0d7419d1b27159f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:07:25 -0700 Subject: [PATCH 568/831] Added the Workflow Streams surface over a server-side stream. The same API as temporalio.contrib.workflow_streams on a Temporal-owned log, so an application swaps the import and keeps its code. The LangGraph docstring qualifies its stream references, because this module gives both names a second definition pydoctor cannot resolve. --- temporalio/contrib/langgraph/_plugin.py | 8 +- temporalio/contrib/server_streams/__init__.py | 424 ++++++++++++++++++ tests/contrib/test_server_streams.py | 161 +++++++ 3 files changed, 590 insertions(+), 3 deletions(-) create mode 100644 temporalio/contrib/server_streams/__init__.py create mode 100644 tests/contrib/test_server_streams.py diff --git a/temporalio/contrib/langgraph/_plugin.py b/temporalio/contrib/langgraph/_plugin.py index 03881ca2a..1819c646d 100644 --- a/temporalio/contrib/langgraph/_plugin.py +++ b/temporalio/contrib/langgraph/_plugin.py @@ -104,11 +104,13 @@ class LangGraphPlugin(SimplePlugin): inherited default of either form. streaming_topic: When set, ``langgraph.config.get_stream_writer()`` inside a node publishes to this topic on the workflow's - :class:`WorkflowStream`. The workflow must construct - ``WorkflowStream()`` in its ``@workflow.init`` (the plugin's + :class:`temporalio.contrib.workflow_streams.WorkflowStream`. The + workflow must construct ``WorkflowStream()`` in its + ``@workflow.init`` (the plugin's interceptor verifies this on workflow start). Nodes with ``execute_in='activity'`` publish through - :class:`WorkflowStreamClient` (signal); nodes with + :class:`temporalio.contrib.workflow_streams.WorkflowStreamClient` + (signal); nodes with ``execute_in='workflow'`` publish synchronously to the in-workflow stream (no signal). streaming_batch_interval: How often the activity-side stream diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py new file mode 100644 index 000000000..95eb48d7e --- /dev/null +++ b/temporalio/contrib/server_streams/__init__.py @@ -0,0 +1,424 @@ +"""Server-side streams behind the Workflow Streams API. + +This is the same surface as :mod:`temporalio.contrib.workflow_streams`, backed +by a Temporal-owned log instead of by Signals and Updates. An application swaps +the import and keeps its code: publishing from a Workflow is still a plain +call, publishing from an Activity is still a buffered handle, and a consumer +still subscribes by topic from an offset. + +What changes is underneath. A publish is a Workflow Command whose payload never +enters History, so History gets one fixed-size event per Workflow Task rather +than a Signal per batch. A consumer reads the log directly rather than +long-polling an Update, so there is no per-Workflow limit on how many can read +at once, and a closed Workflow stays readable until its stream's retention +expires. + +As in the shipped feature, a topic here is a label on a record in the +Workflow's one default stream, which a consumer filters on. The provider in +:mod:`temporalio.streams.providers.native` keeps one stream per topic instead; +the two do not share a log. + +Prototype support for AI-198. It needs a server built from that branch, and it +opens its own gRPC channel because sdk-core does not know the stream service +yet, which is also why it does not support TLS or API keys. +""" + +from __future__ import annotations + +import asyncio +import builtins +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, Generic, TypeVar, overload + +from temporalio import activity, workflow +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind +from temporalio.client import Client, WorkflowExecutionDescription +from temporalio.client_stream import StreamClient, WorkflowStreamHandle, shared_client +from temporalio.common import RawValue +from temporalio.converter import PayloadCodec, PayloadConverter + +__all__ = [ + "RawPage", + "TopicHandle", + "WorkflowStream", + "WorkflowStreamClient", + "WorkflowStreamItem", + "WorkflowTopicHandle", +] + +T = TypeVar("T") + +DEFAULT_BATCH_INTERVAL = timedelta(milliseconds=50) + + +@dataclass +class RawPage: + """One read whose items are still the stored records. + + ``closed`` with ``next_offset >= head_offset`` is the end of the stream. + The bodies are as the server holds them, codec included, for a caller + that forwards records rather than using them. + """ + + items: list[WorkflowStreamItem[StreamRecord]] + next_offset: int + head_offset: int + closed: bool + + +@dataclass +class WorkflowStreamItem(Generic[T]): + """One item read from a workflow's stream. + + ``offset`` is where the item sits in the whole stream, so it is what a + consumer hands back to resume. A topic filter leaves gaps in it. + """ + + topic: str + data: T + offset: int = 0 + + +def _record(converter: PayloadConverter, topic: str, value: Any) -> StreamRecord: + """The record one published value becomes. + + The body is the value's payload, so the encoding metadata the consumer + needs to decode into a type travels with it and a + :class:`temporalio.common.RawValue` passes through pre-encoded. + """ + record = StreamRecord(topic=topic, kind=StreamRecordKind.STREAM_RECORD_KIND_DATA) + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record + + +def _decode( + converter: PayloadConverter, record: StreamRecord, as_type: type | None +) -> Any: + if as_type is None: + return converter.from_payloads([record.body])[0] + return converter.from_payloads([record.body], [as_type])[0] + + +class WorkflowTopicHandle(Generic[T]): + """A topic on the stream the running Workflow owns.""" + + def __init__(self, topic: str, value_type: type[T]) -> None: + """Prefer :meth:`WorkflowStream.topic`.""" + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | RawValue) -> None: + """Append ``value`` to the Workflow's stream on this topic. + + Returns at once. There is nothing to await: the Workflow Task's + publishes become one command the server applies in the task's own + commit, so it costs this Workflow no round trip and no extra + transition. The Worker's payload codec applies to the body as it does + to any other payload the Workflow sends. + """ + workflow.append_stream_records( + [_record(workflow.payload_converter(), self._name, value)] + ) + + +class WorkflowStream: + """The stream the running Workflow owns, from inside it. + + Construct in ``@workflow.init``. Unlike the Signals-and-Updates + implementation this holds no state of its own: the log lives on the server, + so there is nothing here for replay to reconstruct. + """ + + def __init__(self, prior_state: Any = None) -> None: + """Take the same argument as the Workflow Streams version and ignore it. + + That version carried the log across a continue-as-new, because the log + was Workflow state. Here it is not, so there is nothing to carry. + """ + self._prior_state = prior_state + + @overload + def topic(self, name: str) -> WorkflowTopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> WorkflowTopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> WorkflowTopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return WorkflowTopicHandle(name, type) + + +class TopicHandle(Generic[T]): + """A topic on a Workflow's stream, from outside that Workflow.""" + + def __init__( + self, client: WorkflowStreamClient, topic: str, value_type: type[T] + ) -> None: + """Prefer :meth:`WorkflowStreamClient.topic`.""" + self._client = client + self._name = topic + self._type = value_type + + @property + def name(self) -> str: + """The topic name this handle is bound to.""" + return self._name + + @property + def type(self) -> type[T]: + """The value type this handle is bound to.""" + return self._type + + def publish(self, value: T | RawValue, *, force_flush: bool = False) -> None: + """Buffer ``value`` for the next flush. + + Buffered rather than sent, because an append costs one transition on + the owning execution whatever its size. A token at a time would pay + that per token. + """ + self._client._buffer(self._name, value) + if force_flush: + self._client._flush_soon() + + def subscribe( + self, + *, + from_offset: int = 0, + # Spelled out because `type` in this class body is the property below. + result_type: builtins.type | None = None, + poll_cooldown: timedelta | None = None, + ) -> AsyncIterator[WorkflowStreamItem[T]]: + """Read this topic from ``from_offset`` onwards.""" + return self._client.subscribe( + topics=[self._name], + from_offset=from_offset, + result_type=result_type or self._type, + poll_cooldown=poll_cooldown, + ) + + +class WorkflowStreamClient: + """Publishes to and reads from a Workflow's stream, from outside it.""" + + def __init__( + self, + handle: WorkflowStreamHandle, + converter: PayloadConverter, + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + *, + codec: PayloadCodec | None = None, + describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, + ) -> None: + """Prefer :meth:`create` or :meth:`from_within_activity`. + + ``codec`` is applied to every body this client sends and receives, so + a namespace whose payloads are encoded agrees with the Worker, whose + payload visitor applies the same codec to the Workflow's publishes. + ``describe`` is how an unpinned handle learns which run it follows; + see :meth:`WorkflowStreamHandle.pin`. + """ + self._handle = handle + self._converter = converter + self._codec = codec + self._batch_interval = batch_interval + self._describe = describe + self._buffered: list[tuple[str, Any]] = [] + self._flusher: asyncio.Task[None] | None = None + self._wake = asyncio.Event() + self._closed = False + + @classmethod + def create( + cls, + client: Client, + workflow_id: str, + *, + owner_run_id: str = "", + batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + ) -> WorkflowStreamClient: + """Open the stream owned by ``workflow_id``. + + Without ``owner_run_id`` the current run is looked up on the first + call and the handle pinned to it, so a reader following across a + continue-as-new sees the run end rather than being moved to the + successor's stream at a stale offset. + """ + return cls( + _stream_client(client).workflow_stream( + workflow_id, owner_run_id=owner_run_id + ), + client.data_converter.payload_converter, + batch_interval, + codec=client.data_converter.payload_codec, + describe=client.get_workflow_handle(workflow_id).describe, + ) + + @classmethod + def from_within_activity( + cls, *, batch_interval: timedelta = DEFAULT_BATCH_INTERVAL + ) -> WorkflowStreamClient: + """Open the stream owned by the Workflow that scheduled this Activity.""" + info = activity.info() + if info.workflow_id is None: + raise RuntimeError( + "no Workflow stream to open: this Activity was not started by a " + "Workflow" + ) + # The Activity's output belongs to the run that scheduled it, and the + # Activity already knows which run that is. + return cls.create( + activity.client(), + info.workflow_id, + owner_run_id=info.workflow_run_id or "", + batch_interval=batch_interval, + ) + + async def __aenter__(self) -> WorkflowStreamClient: + """Start the background flusher.""" + self._flusher = asyncio.create_task(self._run_flusher()) + return self + + async def __aexit__(self, *_exc: object) -> None: + """Drain what is buffered before letting the caller go. + + An Activity that returned with a batch still buffered would have + reported work its readers never saw. The flusher is asked to stop + rather than cancelled: a cancel landing inside its append would + unwind with the batch it had already taken off the buffer. + """ + self._closed = True + self._wake.set() + if self._flusher is not None: + await self._flusher + self._flusher = None + await self.flush() + + async def _pin(self) -> None: + if self._handle.owner_run_id or self._describe is None: + return + self._handle.pin((await self._describe()).run_id) + + @overload + def topic(self, name: str) -> TopicHandle[Any]: ... + + @overload + def topic(self, name: str, *, type: type[T]) -> TopicHandle[T]: ... + + def topic(self, name: str, *, type: type = object) -> TopicHandle[Any]: + """Bind a topic on this Workflow's stream.""" + return TopicHandle(self, name, type) + + async def get_offset(self) -> int: + """Where the stream currently ends. + + A reader that wants only what comes next starts here. + """ + await self._pin() + return (await self._handle.describe()).head_offset + + async def subscribe( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + result_type: type | None = None, + poll_cooldown: timedelta | None = None, + ) -> AsyncIterator[WorkflowStreamItem[Any]]: + """Yield items from ``from_offset`` as they arrive. + + ``poll_cooldown`` is accepted and ignored. It paced a client that had + to re-ask; the server parks this read until something arrives. + """ + del poll_cooldown + await self._pin() + async for entry in self._handle.follow(from_offset=from_offset, topics=topics): + record = await self._decoded(entry.record) + yield WorkflowStreamItem( + topic=record.topic, + data=_decode(self._converter, record, result_type), + offset=entry.offset, + ) + + async def poll_raw( + self, + *, + topics: Sequence[str] = (), + from_offset: int = 0, + wait: bool = True, + ) -> RawPage: + """One read, with the records left as they were stored. + + For a caller that forwards items on rather than using them. A gateway + would only have to encode again what this decoded. + """ + await self._pin() + page = await self._handle.poll( + from_offset=from_offset, topics=topics, wait=wait + ) + return RawPage( + items=[ + WorkflowStreamItem( + topic=entry.record.topic, data=entry.record, offset=entry.offset + ) + for entry in page.entries + ], + next_offset=page.next_offset, + head_offset=page.head_offset, + closed=page.closed, + ) + + async def flush(self) -> None: + """Append everything buffered as one batch.""" + pending, self._buffered = self._buffered, [] + if not pending: + return + await self._pin() + records = [ + await self._encoded(_record(self._converter, topic, value)) + for topic, value in pending + ] + await self._handle.append(*records) + + def _buffer(self, topic: str, value: Any) -> None: + self._buffered.append((topic, value)) + + def _flush_soon(self) -> None: + self._wake.set() + + async def _run_flusher(self) -> None: + """Append on a fixed cadence, so a slow producer still gets delivered.""" + while not self._closed: + try: + await asyncio.wait_for( + self._wake.wait(), self._batch_interval.total_seconds() + ) + except asyncio.TimeoutError: + pass + self._wake.clear() + await self.flush() + + async def _encoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.encode([record.body]))[0]) + return record + + async def _decoded(self, record: StreamRecord) -> StreamRecord: + if self._codec is not None and record.HasField("body"): + record.body.CopyFrom((await self._codec.decode([record.body]))[0]) + return record + + +def _stream_client(client: Client) -> StreamClient: + return shared_client(client.service_client.config.target_host, client.namespace) diff --git a/tests/contrib/test_server_streams.py b/tests/contrib/test_server_streams.py new file mode 100644 index 000000000..540f7f7d7 --- /dev/null +++ b/tests/contrib/test_server_streams.py @@ -0,0 +1,161 @@ +"""The Workflow Streams surface over a server-side stream. + +Both producers and the consumer, since the point of the surface is that an +application does not have to know which of them wrote a given item. Needs a +Temporal server built from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/contrib/test_server_streams.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from dataclasses import dataclass +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.contrib.server_streams import WorkflowStream, WorkflowStreamClient +from temporalio.worker import Worker + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +TOPIC = "turn_events" + + +@dataclass +class Event: + source: str + text: str + + +@activity.defn +async def emit_from_activity(count: int) -> None: + async with WorkflowStreamClient.from_within_activity() as client: + events = client.topic(TOPIC, type=Event) + for i in range(count): + events.publish(Event(source="activity", text=f"token {i}")) + + +@workflow.defn +class Emitting: + def __init__(self) -> None: + self._events = WorkflowStream().topic(TOPIC, type=Event) + + @workflow.run + async def run(self, count: int) -> None: + self._events.publish(Event(source="workflow", text="turn started")) + await workflow.execute_activity( + emit_from_activity, + count, + start_to_close_timeout=timedelta(seconds=30), + ) + self._events.publish(Event(source="workflow", text="turn ended")) + + +async def test_both_producers_reach_one_subscriber() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-wf-" + uuid.uuid4().hex[:8] + tokens = 4 + + seen: list[Event] = [] + offsets: list[int] = [] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + Emitting.run, tokens, id=wf_id, task_queue=task_queue + ) + + # Subscribed before the Workflow has published anything, which is what + # a consumer attaching to a session does. + stream = WorkflowStreamClient.create(client, wf_id) + + async def read() -> None: + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ): + seen.append(item.data) + offsets.append(item.offset) + if len(seen) == tokens + 2: + return + + reading = asyncio.ensure_future(read()) + await asyncio.wait_for(handle.result(), timeout=60) + await asyncio.wait_for(reading, timeout=60) + + # The Workflow's own publishes bracket the Activity's, and both are on one + # log in the order the server took them. + assert [e.source for e in seen] == ["workflow"] + ["activity"] * tokens + [ + "workflow" + ] + assert seen[0].text == "turn started" + assert seen[-1].text == "turn ended" + assert offsets == list(range(tokens + 2)) + + # A consumer that arrives after the fact reads the same thing, and is not + # left tailing: the Workflow has ended, so its stream is finished and the + # subscription ends on its own. + late = WorkflowStreamClient.create(client, wf_id) + assert await late.get_offset() == tokens + 2 + replayed = [ + item.data.text + async for item in late.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) + ] + assert replayed == [e.text for e in seen] + + +async def test_a_reader_resumes_from_an_offset_it_was_given() -> None: + client = await Client.connect(TARGET or "") + task_queue = "ss-resume-tq-" + uuid.uuid4().hex[:8] + wf_id = "ss-resume-wf-" + uuid.uuid4().hex[:8] + + async with Worker( + client, + task_queue=task_queue, + workflows=[Emitting], + activities=[emit_from_activity], + max_cached_workflows=0, + ): + await client.execute_workflow(Emitting.run, 3, id=wf_id, task_queue=task_queue) + + stream = WorkflowStreamClient.create(client, wf_id) + first = [ + item + async for item in stream.subscribe( + topics=[TOPIC], from_offset=0, result_type=Event + ) + ] + assert len(first) == 5 + + # Resuming past the second item skips exactly the two before it, so the + # offset a reader was handed is the position it means. + resumed = [ + item.data.text + async for item in stream.subscribe( + topics=[TOPIC], from_offset=first[1].offset + 1, result_type=Event + ) + ] + assert resumed == [item.data.text for item in first[2:]] + + # The raw page carries the stored records themselves. + raw = await stream.poll_raw(topics=[TOPIC], from_offset=0, wait=False) + assert [item.data.topic for item in raw.items] == [TOPIC] * 5 + assert raw.closed and raw.next_offset == raw.head_offset == 5 From 565783fd25b58963522f6d0430b8a639f395953f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:08:32 -0700 Subject: [PATCH 569/831] Added workflow.stream_reader and workflow.stream_writer. Workflow code reaches its stream the way it reaches the payload converter, through the runtime on the thread. The workflow half of the provider is made per instance, so whatever it keeps dies with the instance the way handlers do. --- temporalio/worker/_workflow_instance.py | 19 ++ temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 4 + temporalio/workflow/_streams.py | 279 ++++++++++++++++++++++++ 4 files changed, 312 insertions(+) create mode 100644 temporalio/workflow/_streams.py diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 108431021..26f796e57 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -58,7 +58,9 @@ import temporalio.converter import temporalio.exceptions import temporalio.nexus.system +import temporalio.streams import temporalio.workflow +import temporalio.workflow._streams from temporalio.converter import StorageDriverStoreContext, StorageDriverWorkflowInfo from temporalio.converter._payload_converter import ( _TemporalTransferTypePayloadConverter, @@ -179,6 +181,7 @@ class WorkflowInstanceDetails: default_workflow_logic_flags: frozenset[_WorkflowLogicFlag] = field( default_factory=lambda: _DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS ) + stream_provider: temporalio.streams.StreamProvider | None = None class WorkflowInstance(ABC): @@ -298,6 +301,8 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: det.worker_level_failure_exception_types ) self._patch_activation_callback = det.patch_activation_callback + self._stream_provider = det.stream_provider + self._streams: temporalio.workflow._streams._WorkflowStreams | None = None self._default_workflow_logic_flags = det.default_workflow_logic_flags self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False @@ -1774,6 +1779,20 @@ async def workflow_start_nexus_operation( ) ) + def workflow_streams(self) -> temporalio.workflow._streams._WorkflowStreams: + if self._streams is None: + if self._stream_provider is None: + raise RuntimeError( + "no stream provider is configured on this worker; pass one with " + "Worker(plugins=[provider]) or stream_provider=" + ) + # The workflow half is made per instance, so whatever it keeps + # dies with the instance the way handlers do. + self._streams = temporalio.workflow._streams._WorkflowStreams( + self._stream_provider.workflow_provider() + ) + return self._streams + def workflow_time_ns(self) -> int: return self._time_ns diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..f63135bf4 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -147,6 +147,12 @@ logger, unsafe, ) +from ._streams import ( + StreamReader, + StreamWriter, + stream_reader, + stream_writer, +) from ._workflow_ops import ( ChildWorkflowCancellationType, ChildWorkflowConfig, @@ -252,6 +258,10 @@ "SandboxImportNotificationPolicy", "logger", "unsafe", + "StreamReader", + "StreamWriter", + "stream_reader", + "stream_writer", "ChildWorkflowCancellationType", "ChildWorkflowConfig", "ChildWorkflowHandle", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..25523836a 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -24,6 +24,7 @@ from ._activities import ActivityCancellationType, ActivityHandle from ._exceptions import ContinueAsNewVersioningBehavior, VersioningIntent from ._nexus import NexusOperationCancellationType, NexusOperationHandle + from ._streams import _WorkflowStreams from ._workflow_ops import ( ChildWorkflowCancellationType, ChildWorkflowHandle, @@ -475,6 +476,9 @@ async def workflow_start_nexus_operation( summary: str | None, ) -> NexusOperationHandle[OutputT]: ... + @abstractmethod + def workflow_streams(self) -> _WorkflowStreams: ... + @abstractmethod def workflow_time_ns(self) -> int: ... diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py new file mode 100644 index 000000000..5d319d50a --- /dev/null +++ b/temporalio/workflow/_streams.py @@ -0,0 +1,279 @@ +"""Streams from inside workflow code. + +.. warning:: + This module is experimental and may change in future versions. + +The reader and writer here are the same on every provider. They convert +values, synthesize supersession and buffer nothing the provider did not hand +them; everything provider-specific sits behind the ``ReadSource`` and +``WriteSink`` that the provider's workflow half opens. The provider itself +comes from the worker, the way the payload converter does. +""" + +from __future__ import annotations + +import asyncio +from collections import deque +from collections.abc import AsyncIterator, Callable +from typing import Any, Generic, TypeVar, cast, overload + +from temporalio.streams._provider import ReadSource, WorkflowStreamProvider, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic +from temporalio.streams._wire import RecordDecoder, to_wire +from temporalio.workflow._context import _Runtime, payload_converter +from temporalio.workflow._sandbox import logger + +__all__ = ["StreamReader", "StreamWriter", "stream_reader", "stream_writer"] + +T = TypeVar("T") + + +class _WorkflowStreams: + """The stream state a workflow instance carries: its provider half and open readers.""" + + def __init__(self, provider: WorkflowStreamProvider) -> None: + self.provider = provider + self.readers: dict[str, StreamReader[Any]] = {} + + +class StreamReader(Generic[T]): + """Reads one topic of this workflow's stream from inside workflow code. + + The reader is the async iterator: ``async for record in reader`` yields + every kind of record, including the supersession the reader synthesizes + when a producer's newer attempt appears. Check ``record.kind``, or + iterate :meth:`values` when the workflow only wants data. Iteration ends + when the reader is closed or the provider ends the subscription. One loop + per reader: two loops on one reader share its buffer and interleave. + """ + + def __init__( + self, + source: ReadSource, + *, + topic: str, + result_type: type | None, + after: Cursor, + on_close: Callable[[], None], + ) -> None: + """Prefer :func:`temporalio.workflow.stream_reader`.""" + self._source = source + self._topic = topic + self._result_type = result_type + self._decoder = RecordDecoder( + payload_converter(), result_type, after=after, warn=logger.warning + ) + self._pending: deque[StreamRecord[T]] = deque() + self._lock = asyncio.Lock() + self._closed = False + self._ended = False + self._on_close = on_close + + @property + def topic(self) -> str: + """The name of the topic this reader is subscribed to.""" + return self._topic + + def __aiter__(self) -> StreamReader[T]: + """The reader is its own iterator.""" + return self + + async def __anext__(self) -> StreamRecord[T]: + """The next record, waiting for one to arrive.""" + while True: + if self._pending: + return self._pending.popleft() + if self._closed or self._ended: + raise StopAsyncIteration + await self._fill() + + async def _fill(self) -> None: + # Two loops on one reader must not race the source, so one batch + # fetch is in flight at a time and the second loop takes what the + # first one buffered. + async with self._lock: + if self._pending or self._closed or self._ended: + return + try: + batch = await self._source.next_batch() + except StopAsyncIteration: + # The provider ended the subscription. Iteration stops rather + # than raising, so a workflow that reads to the end of a + # finished stream leaves the loop instead of failing its task. + self._ended = True + return + for cursor, wire in batch: + self._pending.extend(self._decoder.decode(cursor, wire)) + + async def values(self) -> AsyncIterator[T]: + """Iterate the data values, dropping control records.""" + async for record in self: + if record.kind is RecordKind.DATA: + yield cast("T", record.value) + + def close(self) -> None: + """End the subscription. Idempotent. + + A later :func:`temporalio.workflow.stream_reader` on the same topic + opens a new subscription, which is a new command. + """ + if self._closed: + return + self._closed = True + self._source.close() + self._on_close() + + +class StreamWriter(Generic[T]): + """Publishes to one topic of this workflow's stream. + + A workflow can only publish transactionally to its own stream, on every + provider. Writing to somebody else's stream is an activity's job, and it + gets the weaker guarantee that goes with doing I/O. The type parameter is + the topic definition's value type; a writer on a string-named topic takes + any value. + """ + + def __init__(self, sink: WriteSink, topic: str) -> None: + """Prefer :func:`temporalio.workflow.stream_writer`.""" + self._sink = sink + self._topic = topic + self._finished = False + + @property + def topic(self) -> str: + """The name of the topic this writer is bound to.""" + return self._topic + + def publish(self, value: T) -> None: + """Append ``value`` to this topic. + + Synchronous, because there is nothing to wait for inside a task: the + record becomes visible when this Workflow Task is accepted, and never + at all if the task fails, so a reader cannot see a decision the + workflow did not commit. A :class:`temporalio.common.RawValue` passes + through pre-encoded. + + Raises: + ValueError: :meth:`finish` was already called on this writer. + """ + if self._finished: + raise ValueError(f"topic {self._topic!r} was already finished") + self._sink.publish( + to_wire( + payload_converter(), + topic=self._topic, + kind=RecordKind.DATA, + value=value, + ) + ) + + def finish(self) -> None: + """Write ``FINISH`` for this workflow on this topic. Idempotent. + + Says this workflow has nothing more to send on the topic. It does not + say the workflow succeeded, and it does not end anyone's read. + """ + if self._finished: + return + self._finished = True + self._sink.publish( + to_wire(payload_converter(), topic=self._topic, kind=RecordKind.FINISH) + ) + + +@overload +def stream_reader(topic: StreamTopic[T], *, after: Cursor = ...) -> StreamReader[T]: ... + + +@overload +def stream_reader( + topic: str, *, result_type: type[T], after: Cursor = ... +) -> StreamReader[T]: ... + + +@overload +def stream_reader( + topic: str, *, result_type: None = None, after: Cursor = ... +) -> StreamReader[Any]: ... + + +def stream_reader( + topic: str | StreamTopic[Any], + *, + result_type: type | None = None, + after: Cursor = BEGINNING, +) -> StreamReader[Any]: + """Subscribe this workflow to ``topic`` of its own stream. + + ``topic`` is a :func:`temporalio.streams.topic` definition, which carries + the record type, or a plain string with ``result_type=`` for a name + decided at runtime. One subscription per topic per run. A second call + for the same topic returns the reader already open on it, so records go + to whichever loop pulls first; such a call may pass neither ``after`` nor + a different type. Adding a reader on a new topic is a new command, so + gate it with :func:`temporalio.workflow.patched` as you would a timer. A + reader in a successor run starts a new subscription: nothing crosses + continue-as-new implicitly. + + Args: + topic: The topic, relative to this workflow's stream. + result_type: The value type for a string-named topic, used as the + decode hint. :class:`temporalio.common.RawValue` returns the + payload untouched. + after: Resume strictly after this record. Honoured on the first + subscription of a run, because after that the recorded + observations decide. + + Raises: + ValueError: ``topic`` is empty, ``result_type`` was passed with a + definition, or a reader on the topic is already open and this + call asked for a different position or type. + temporalio.streams.StreamCursorError: ``after`` was minted by another + provider. + """ + name, result_type = resolve_topic(topic, result_type) + state: _WorkflowStreams = _Runtime.current().workflow_streams() + existing = state.readers.get(name) + if existing is not None: + if after != BEGINNING or result_type is not existing._result_type: + raise ValueError( + f"topic {name!r} already has a reader in this run; a second " + "stream_reader shares it and takes no after= or other type" + ) + return existing + source = state.provider.open_reader(name, after=after) + + def forget() -> None: + state.readers.pop(name, None) + + reader: StreamReader[Any] = StreamReader( + source, topic=name, result_type=result_type, after=after, on_close=forget + ) + state.readers[name] = reader + return reader + + +@overload +def stream_writer(topic: StreamTopic[T]) -> StreamWriter[T]: ... + + +@overload +def stream_writer(topic: str) -> StreamWriter[Any]: ... + + +def stream_writer(topic: str | StreamTopic[Any]) -> StreamWriter[Any]: + """Publish to ``topic`` of this workflow's stream. + + Args: + topic: A :func:`temporalio.streams.topic` definition, whose value type + the writer's ``publish`` takes, or a plain string for a name + decided at runtime. Encoding follows each published value. + + Raises: + ValueError: ``topic`` is empty. + """ + name, _ = resolve_topic(topic) + provider = _Runtime.current().workflow_streams().provider + return StreamWriter(provider.open_writer(name), name) From a2587273eb4557ef837a218650b6e8ab3b6e5e38 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:08:32 -0700 Subject: [PATCH 570/831] Carried the stream provider into the workflow runtime. The worker and the replayer hand the provider to each workflow instance, and the worker brackets the workflow function with the provider's lifecycle hooks so no workflow code has to call them. The finish hook stays off an evicted run and off a collected coroutine, because neither is the workflow ending. --- temporalio/worker/_replayer.py | 1 + temporalio/worker/_worker.py | 6 + temporalio/worker/_workflow.py | 47 +++ tests/streams/test_stream_hooks.py | 139 ++++++++ tests/streams/test_streams_workflow.py | 443 +++++++++++++++++++++++++ 5 files changed, 636 insertions(+) create mode 100644 tests/streams/test_stream_hooks.py create mode 100644 tests/streams/test_streams_workflow.py diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index 1291f5066..c7ae8d59d 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -290,6 +290,7 @@ def on_eviction_hook( default_workflow_logic_flags=frozenset( self._default_workflow_logic_flags ), + stream_provider=self._config.get("stream_provider"), ) external_storage = data_converter.external_storage storage_driver_types = ( diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index 25dcf697d..f4b7eddad 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -468,6 +468,11 @@ def _init_from_config(self, client: temporalio.client.Client, config: WorkerConf # Prepend applicable client interceptors to the given ones client_config = config["client"].config(active_config=True) # type: ignore[reportTypedDictNotRequiredAccess] + # A provider registered on the client serves its workers too, so one + # registration covers every context that asks for a stream. + stream_provider = config.get("stream_provider") or client_config.get( + "stream_provider" + ) interceptors_from_client = cast( list[Interceptor], [i for i in client_config["interceptors"] if isinstance(i, Interceptor)], @@ -572,6 +577,7 @@ def check_activity(activity: str): encode_headers=client_config["header_codec_behavior"] != HeaderCodecBehavior.NO_CODEC, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, + stream_provider=stream_provider, ) tuner = config.get("tuner") diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 1b217b4a5..9b94de95a 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -13,6 +13,7 @@ from dataclasses import dataclass from datetime import timezone from types import TracebackType +from typing import Any import temporalio.api.common.v1 import temporalio.bridge.proto.common @@ -24,6 +25,7 @@ import temporalio.converter import temporalio.converter._extstore import temporalio.exceptions +import temporalio.streams import temporalio.workflow from temporalio.bridge.worker import PollShutdownError from temporalio.converter import StorageDriverStoreContext, StorageDriverWorkflowInfo @@ -35,6 +37,7 @@ _relax_sandbox_for_debugger, ) from ._interceptor import ( + ExecuteWorkflowInput, Interceptor, WorkflowInboundInterceptor, WorkflowInterceptorClassInput, @@ -55,6 +58,43 @@ LOG_PROTOS = False +class _StreamHooksInterceptor(WorkflowInboundInterceptor): + """Brackets the workflow function with the stream provider's lifecycle hooks. + + Installed by the worker when it has a stream provider, so no workflow + code has to call anything before it runs or before it returns. The finish + hook runs when the function returns, raises or continues as new, because + a provider that parked a reader against the run has to let go either way. + It does not run when the run is being evicted from the cache or when the + abandoned coroutine is collected: neither is the workflow ending, the + instance's state is not to be touched during eviction, and at collection + time the runtime on the thread belongs to whichever workflow happens to + be running, so the hook would act on that one. + """ + + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: + runtime = temporalio.workflow._Runtime.current() + provider = runtime.workflow_streams().provider + provider.on_workflow_start() + try: + result = await self.next.execute_workflow(input) + except GeneratorExit: + raise + except BaseException: + if not _evicting(runtime): + await provider.on_workflow_finish() + raise + await provider.on_workflow_finish() + return result + + +def _evicting(runtime: temporalio.workflow._Runtime) -> bool: + # Eviction cancels the primary task the same way a workflow cancellation + # does; the flag the instance sets before cancelling is what tells them + # apart, and only the cancellation is a run ending. + return bool(getattr(runtime, "_deleting", False)) + + # Value was chosen abitrarily as a small number that allows some concurrency and prevents # large numbers of concurrent external storage operations causing resource contention. # This default limit is per workflow task activation and does not limit the total number @@ -104,6 +144,7 @@ def __init__( encode_headers: bool, max_workflow_task_external_storage_concurrency: int, default_workflow_logic_flags: frozenset[_WorkflowLogicFlag] | None = None, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: # Debug mode is enabled if specified or if the TEMPORAL_DEBUG env var is truthy debug_mode = debug_mode or bool(os.environ.get("TEMPORAL_DEBUG")) @@ -162,6 +203,11 @@ def __init__( __temporal_assert_local_activity_valid=assert_local_activity_valid, ) ) + self._stream_provider = stream_provider + if stream_provider is not None: + # Innermost, so the lifecycle hooks bracket the workflow function + # itself, after every user interceptor has done its own setup. + self._interceptor_classes.append(_StreamHooksInterceptor) self._workflow_failure_exception_types = workflow_failure_exception_types self._patch_activation_callback = patch_activation_callback @@ -740,6 +786,7 @@ def _create_workflow_instance( last_completion_result=init.last_completion_result, last_failure=last_failure, default_workflow_logic_flags=frozenset(self._default_workflow_logic_flags), + stream_provider=self._stream_provider, ) if defn.sandboxed: return self._workflow_runner.create_instance(det) diff --git a/tests/streams/test_stream_hooks.py b/tests/streams/test_stream_hooks.py new file mode 100644 index 000000000..9f98f75f6 --- /dev/null +++ b/tests/streams/test_stream_hooks.py @@ -0,0 +1,139 @@ +"""The lifecycle interceptor's rules about when the finish hook runs. + +Driven directly, with a stand-in runtime on the loop, because the two cases +that matter here are the ones a workflow test cannot stage on purpose: a +coroutine collected after its worker went away, and a run evicted from the +cache. Both used to reach the finish hook, and at collection time the hook +acted on whichever workflow was running on the thread. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.worker._interceptor import ( + ExecuteWorkflowInput, + WorkflowInboundInterceptor, +) +from temporalio.worker._workflow import _StreamHooksInterceptor + + +class _Provider: + def __init__(self) -> None: + self.calls: list[str] = [] + + def on_workflow_start(self) -> None: + self.calls.append("start") + + async def on_workflow_finish(self) -> None: + self.calls.append("finish") + + +class _Streams: + def __init__(self, provider: _Provider) -> None: + self.provider = provider + + +class _FakeRuntime: + """Only what the interceptor reads: the stream state and the eviction flag.""" + + def __init__(self, provider: _Provider, *, deleting: bool = False) -> None: + self._streams = _Streams(provider) + self._deleting = deleting + + def workflow_streams(self) -> _Streams: + return self._streams + + +class _Body(WorkflowInboundInterceptor): + """The workflow function's stand-in: returns, raises or parks forever.""" + + def __init__(self, outcome: Any) -> None: # type: ignore[reportMissingSuperCall] + self._outcome = outcome + + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: + del input + if self._outcome is _PARK: + await asyncio.Event().wait() + if isinstance(self._outcome, BaseException): + raise self._outcome + return self._outcome + + +_PARK = object() + + +async def _unused_run_fn() -> None: + pass + + +_INPUT = ExecuteWorkflowInput(type=object, run_fn=_unused_run_fn, args=(), headers={}) + + +@pytest.fixture +async def provider() -> Any: + fake = _Provider() + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake)) # type: ignore[arg-type] + yield fake + workflow._Runtime.set_on_loop(loop, None) + + +def _evicting(fake: _Provider) -> None: + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake, deleting=True)) # type: ignore[arg-type] + + +async def test_the_finish_hook_runs_on_return(provider: _Provider): + assert ( + await _StreamHooksInterceptor(_Body("done")).execute_workflow(_INPUT) == "done" + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_when_the_function_raises(provider: _Provider): + with pytest.raises(RuntimeError, match="boom"): + await _StreamHooksInterceptor(_Body(RuntimeError("boom"))).execute_workflow( + _INPUT + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_on_continue_as_new(provider: _Provider): + error = workflow.ContinueAsNewError.__new__(workflow.ContinueAsNewError) + with pytest.raises(workflow.ContinueAsNewError): + await _StreamHooksInterceptor(_Body(error)).execute_workflow(_INPUT) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_on_a_workflow_cancellation(provider: _Provider): + # A cancelled primary task is the run ending, so the provider lets go. + with pytest.raises(asyncio.CancelledError): + await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( + _INPUT + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_does_not_run_when_the_coroutine_is_collected( + provider: _Provider, +): + coroutine = _StreamHooksInterceptor(_Body(_PARK)).execute_workflow(_INPUT) + # Run up to the park, the way a worker that shut down without evicting + # leaves the primary task, then close it as garbage collection would. + coroutine.send(None) + coroutine.close() + assert provider.calls == ["start"] + + +async def test_the_finish_hook_does_not_run_during_eviction(provider: _Provider): + _evicting(provider) + with pytest.raises(asyncio.CancelledError): + await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( + _INPUT + ) + assert provider.calls == ["start"] diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py new file mode 100644 index 000000000..71f2bb8bf --- /dev/null +++ b/tests/streams/test_streams_workflow.py @@ -0,0 +1,443 @@ +"""Workflow-side conformance for the stream contract. + +Runs the reader and writer inside a real workflow on the memory provider +with a warm cache, and states the two rules about Workflow Tasks as tests: a +publish commits with its task (rule 1), and reads are recorded observations +that replay re-supplies (rule 2). The memory provider keeps neither and says +so in its docstring, so those two are strict expected failures here. A +storage provider that runs this module turns them into passes; that is the +measurement they exist for. + +The rest is what the portable surface promises on every provider: the +lifecycle hooks the worker calls, one subscription per topic per run, a read +that ends when the chain closes, a handle that follows continue-as-new, and +a topic shared by the workflow and an outside producer. +""" + +from __future__ import annotations + +import asyncio +import uuid +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.client import Client +from temporalio.streams import ( + Cursor, + ReadSource, + RecordKind, + StreamCursorError, + WriteSink, + topic, +) +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import WorkflowEnvironment +from temporalio.worker import Replayer +from tests.helpers import new_worker +from tests.streams.test_streams_conformance import take + +INPUTS = topic("inputs", dict) +DECISIONS = topic("decisions", dict) + + +@pytest.fixture +def provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] + if env.supports_time_skipping: + pytest.skip( + "the memory provider polls on a timer, which time skipping turns into a spin" + ) + streams = MemoryStreams() + yield streams + streams.reset() + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = workflow.stream_reader(INPUTS) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + try: + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "replaced": record.supersession.previous_attempt, + "attempt": record.supersession.attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) + trace.append( + { + "kind": "decision", + "n": record.value["n"], + "attempt": record.attempt, + } + ) + finally: + inputs.close() + decisions.finish() + # Twice on purpose: a finished topic stays finished, with one marker. + decisions.finish() + return trace + + +async def _run_the_loop( + client: Client, provider: MemoryStreams +) -> tuple[Any, list[dict[str, Any]]]: + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, ContractLoop, plugins=[provider]) as worker: + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"n": 1}, {"n": 2}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"n": 3}) + await second.finish() + trace = await handle.result() + return handle, trace + + +async def test_workflow_reads_decides_and_publishes( + client: Client, provider: MemoryStreams +): + handle, trace = await _run_the_loop(client, provider) + assert trace == [ + {"kind": "decision", "n": 1, "attempt": 1}, + {"kind": "decision", "n": 2, "attempt": 1}, + {"kind": "superseded", "replaced": 1, "attempt": 2}, + {"kind": "decision", "n": 3, "attempt": 2}, + {"kind": "finish", "producer": "model"}, + ] + + # The outside view of what the workflow published, on its own topic. + stream = provider.get_stream_handle(client, handle.id) + records = await take(stream.read(topic=DECISIONS), 5) + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"decided": 1}), + (RecordKind.DATA, {"decided": 2}), + (RecordKind.DATA, {"retracting_attempt": 1}), + (RecordKind.DATA, {"decided": 3}), + (RecordKind.FINISH, None), + ] + assert all(r.producer_id == "" and r.topic == DECISIONS.name for r in records) + # The second finish() wrote nothing: the marker is the newest record. + assert await stream.latest(topic=DECISIONS) == records[-1].cursor + + +async def test_read_ends_when_the_workflow_closes_and_the_tail_is_delivered( + client: Client, provider: MemoryStreams +): + handle, _ = await _run_the_loop(client, provider) + stream = provider.get_stream_handle(client, handle.id) + + async def read_everything() -> list[Any]: + return [r.value async for r in stream.read(topic=DECISIONS)] + + # No count and no early break: the read ends by itself once the workflow + # is closed and everything it retained has been handed over. + values = await asyncio.wait_for(read_everything(), 30) + assert values == [ + {"decided": 1}, + {"decided": 2}, + {"retracting_attempt": 1}, + {"decided": 3}, + None, + ] + + +@pytest.mark.xfail( + strict=True, + reason=( + "rule 2: reading is a recorded observation, so replaying the history " + "with the store gone must re-supply the same records; the memory " + "provider reads live process memory instead" + ), +) +async def test_replay_without_the_store_resupplies_the_records( + client: Client, provider: MemoryStreams +): + handle, _ = await _run_the_loop(client, provider) + history = await handle.fetch_history() + + provider.reset() + replayer = Replayer(workflows=[ContractLoop], plugins=[provider]) + await replayer.replay_workflow(history) + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + decisions.finish() + + +@pytest.mark.xfail( + strict=True, + reason=( + "rule 1: a publish commits with its workflow task, so no reader sees " + "a record from a task that failed; the memory provider makes it " + "visible at publish time" + ), +) +async def test_a_failed_task_publishes_nothing(client: Client, provider: MemoryStreams): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, PublishThenFail, plugins=[provider]) as worker: + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS), 2, timeout=30) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +class _RecordingHalf: + """A workflow half that logs the hooks the worker calls, then delegates.""" + + def __init__(self, inner: Any, calls: list[tuple[str, str]]) -> None: + self._inner = inner + self._calls = calls + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + return self._inner.open_reader(topic, after=after) + + def open_writer(self, topic: str) -> WriteSink: + return self._inner.open_writer(topic) + + def on_workflow_start(self) -> None: + self._calls.append(("start", workflow.info().run_id)) + + async def on_workflow_finish(self) -> None: + self._calls.append(("finish", workflow.info().run_id)) + + +class HookedMemory(MemoryStreams): + """The memory provider with its lifecycle hooks made visible.""" + + def __init__(self) -> None: + super().__init__() + self.calls: list[tuple[str, str]] = [] + + def workflow_provider(self) -> Any: + return _RecordingHalf(super().workflow_provider(), self.calls) + + +@pytest.mark.usefixtures("provider") +async def test_the_worker_calls_the_lifecycle_hooks_around_every_run(client: Client): + hooked = HookedMemory() + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[hooked]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + # Start before the function, finish after it, on both runs: the finish + # hook runs on the continue-as-new exit too, so a provider that parked + # something against the first run can let go before the successor starts. + kinds = [kind for kind, _ in hooked.calls] + assert kinds == ["start", "finish", "start", "finish"] + runs = [run_id for _, run_id in hooked.calls] + assert runs[0] == runs[1] and runs[2] == runs[3] and runs[0] != runs[2] + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[provider]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] + + records = await asyncio.wait_for(read_everything(), 30) + await handle.result() + # The chain is followed: the successor's records arrive on the same read, + # and the read ends only when the last run of the chain is closed. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + + +@workflow.defn +class SharedReaders: + """Opens the same topic twice and pulls from both readers in turn.""" + + @workflow.run + async def run(self) -> list[Any]: + first = workflow.stream_reader(INPUTS) + second = workflow.stream_reader(INPUTS) + trace: list[Any] = ["shared" if first is second else "separate"] + try: + workflow.stream_reader(INPUTS, after=Cursor("memory:0")) + except ValueError: + trace.append("after-rejected") + try: + workflow.stream_reader(INPUTS.name, result_type=list) + except ValueError: + trace.append("type-rejected") + trace.append((await first.__anext__()).value) + trace.append((await second.__anext__()).value) + first.close() + return trace + + +async def test_a_second_reader_on_a_topic_shares_the_subscription( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, SharedReaders, plugins=[provider]) as worker: + handle = await client.start_workflow( + SharedReaders.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=INPUTS, producer_id="model", attempt=1).append( + {"n": 1}, {"n": 2} + ) + assert await handle.result() == [ + "shared", + "after-rejected", + "type-rejected", + {"n": 1}, + {"n": 2}, + ] + + +@workflow.defn +class ForeignCursor: + """Resumes from a cursor another provider minted.""" + + @workflow.run + async def run(self) -> str: + try: + workflow.stream_reader(INPUTS, after=Cursor("elsewhere:1")) + except StreamCursorError: + return "refused" + return "accepted" + + +async def test_the_workflow_reader_refuses_a_foreign_cursor( + client: Client, provider: MemoryStreams +): + async with new_worker(client, ForeignCursor, plugins=[provider]) as worker: + result = await client.execute_workflow( + ForeignCursor.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert result == "refused" + + +@workflow.defn +class NoProvider: + """Opens a stream on a worker that has no provider.""" + + @workflow.run + async def run(self) -> str: + try: + workflow.stream_reader(INPUTS) + except RuntimeError as error: + return str(error) + return "opened" + + +async def test_a_worker_without_a_provider_says_so(client: Client): + async with new_worker(client, NoProvider) as worker: + result = await client.execute_workflow( + NoProvider.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert "no stream provider is configured" in result + + +@workflow.defn +class OneLine: + """Publishes one record and finishes the topic.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"from": "workflow"}) + decisions.finish() + + +async def test_an_outside_producer_and_the_workflow_share_a_topic( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, OneLine, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=DECISIONS, producer_id="tool", attempt=1).append( + {"from": "producer"} + ) + handle = await client.start_workflow( + OneLine.run, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS)] + + records = await asyncio.wait_for(read_everything(), 30) + # Both writers land on one topic in one order, each under its own + # identity: the producer's records carry its id, the workflow's carry none. + assert [(r.producer_id, r.kind, r.value) for r in records] == [ + ("tool", RecordKind.DATA, {"from": "producer"}), + ("", RecordKind.DATA, {"from": "workflow"}), + ("", RecordKind.FINISH, None), + ] From 55200ecf0395dc930640f98064f8d6868d4a85fe Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:08:47 -0700 Subject: [PATCH 571/831] Added activity.stream_handle. With no arguments the handle is the activity's own workflow, pinned to its run, so a producer opened from it writes onto that run's stream and its identity is the activity's. A sync activity gets no provider, the way it gets no client. --- temporalio/activity.py | 48 ++++++++++++++++++++++++++++++++++ temporalio/worker/_activity.py | 6 +++++ temporalio/worker/_worker.py | 1 + 3 files changed, 55 insertions(+) diff --git a/temporalio/activity.py b/temporalio/activity.py index 82678d8a1..33f3a90eb 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -29,6 +29,7 @@ import temporalio.bridge.proto.activity_task import temporalio.common import temporalio.converter +import temporalio.streams from temporalio.converter._payload_converter import ( _TemporalTransferTypePayloadConverter, ) @@ -209,6 +210,7 @@ class _Context: runtime_metric_meter: temporalio.common.MetricMeter | None client: Client | None cancellation_details: _ActivityCancellationDetailsHolder + stream_provider: temporalio.streams.StreamProvider | None = None _logger_details: Mapping[str, Any] | None = None _payload_converter: temporalio.converter.PayloadConverter | None = None _metric_meter: temporalio.common.MetricMeter | None = None @@ -298,6 +300,52 @@ def client() -> Client: return client +def stream_handle( + workflow_id: str | None = None, *, run_id: str | None = None +) -> temporalio.streams.StreamHandle: + """Return a stream handle from the provider the worker was given. + + With no arguments the handle is on this activity's own workflow, pinned to + the run the activity belongs to, so a producer opened from it writes onto + that run's stream and a read follows that run. Name a ``workflow_id`` to + address another workflow; ``run_id`` then pins the handle to one run and + its absence follows the execution chain. See :py:mod:`temporalio.streams`. + + Like :py:func:`client`, this is only available in ``async def`` + activities. + + Returns: + :py:class:`temporalio.streams.StreamHandle` for use in the current + activity. + + Raises: + temporalio.streams.StreamUnsupportedError: The worker has no stream + provider. Register one with ``Client.connect(plugins=[provider])`` + or ``Worker(plugins=[provider])``. + RuntimeError: When the client is not available, or when the activity + has no workflow and no ``workflow_id`` was given. + ValueError: ``run_id`` was given without ``workflow_id``. + """ + context = _Context.current() + provider = context.stream_provider + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is configured on this worker; register one with " + "Client.connect(plugins=[provider]) or Worker(plugins=[provider])" + ) + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id needs a workflow_id") + info = context.info() + if info.workflow_id is None: + raise RuntimeError( + "this activity belongs to no workflow, so name the workflow_id to " + "address" + ) + workflow_id, run_id = info.workflow_id, info.workflow_run_id + return provider.get_stream_handle(client(), workflow_id, run_id=run_id) + + def in_activity() -> bool: """Whether the current code is inside an activity. diff --git a/temporalio/worker/_activity.py b/temporalio/worker/_activity.py index ded3047fc..10bf45bd2 100644 --- a/temporalio/worker/_activity.py +++ b/temporalio/worker/_activity.py @@ -33,6 +33,7 @@ import temporalio.common import temporalio.converter import temporalio.exceptions +import temporalio.streams from temporalio.converter import ( StorageDriverActivityInfo, StorageDriverStoreContext, @@ -63,9 +64,11 @@ def __init__( metric_meter: temporalio.common.MetricMeter, client: temporalio.client.Client, encode_headers: bool, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: self._bridge_worker = bridge_worker self._task_queue = task_queue + self._stream_provider = stream_provider self._activity_executor = activity_executor self._shared_state_manager = shared_state_manager self._running_activities: dict[bytes, _RunningActivity] = {} @@ -666,6 +669,9 @@ async def _execute_activity( runtime_metric_meter=None if sync_non_threaded else self._metric_meter, client=self._client if not running_activity.sync else None, cancellation_details=running_activity.cancellation_details, + stream_provider=( + self._stream_provider if not running_activity.sync else None + ), ) ) temporalio.activity.logger.debug("Starting activity") diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index f4b7eddad..fade69c4d 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -510,6 +510,7 @@ def _init_from_config(self, client: temporalio.client.Client, config: WorkerConf interceptors=interceptors, metric_meter=self._runtime.metric_meter, client=client, + stream_provider=stream_provider, encode_headers=( client_config["header_codec_behavior"] == HeaderCodecBehavior.CODEC ), From e94d11d713c3592f39bba70aedad5805b2c148ff Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:08:47 -0700 Subject: [PATCH 572/831] Added Client.get_stream_handle and the connect keyword. It mirrors `get_workflow_handle`: without a `run_id` the handle follows the execution chain. `ClientConnectConfig` names the same keys `Client.connect` takes, so the keyword has to appear in both or the test comparing them fails. --- temporalio/client/_client.py | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 999ad8bba..7cf624242 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -156,6 +156,7 @@ async def connect( grpc_compression: GrpcCompression = GrpcCompression.GZIP, payload_limits: PayloadLimitsConfig = PayloadLimitsConfig(), header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> Self: """Connect to a Temporal server. @@ -221,6 +222,11 @@ async def connect( payload_limits: Warning thresholds for outbound payload/memo sizes. Over-threshold fields are logged but still sent. Set a threshold to 0 to disable it. header_codec_behavior: Encoding behavior for headers sent by the client. + stream_provider: Experimental. The stream provider + :py:meth:`get_stream_handle` opens handles from, see + :py:mod:`temporalio.streams`. A provider that is also a + :py:class:`Plugin` sets this itself when passed in ``plugins``, + and workers built from this client inherit it. """ connect_config = temporalio.service.ConnectConfig( target_host=target_host, @@ -257,6 +263,7 @@ def make_lambda( default_workflow_query_reject_condition=default_workflow_query_reject_condition, header_codec_behavior=header_codec_behavior, plugins=plugins, + stream_provider=stream_provider, ) def __init__( @@ -889,6 +896,36 @@ def get_workflow_handle( result_type=result_type, ) + def get_stream_handle( + self, workflow_id: str, *, run_id: str | None = None + ) -> temporalio.streams.StreamHandle: + """Get a handle on a workflow's stream from the provider registered on this client. + + Mirrors :py:meth:`get_workflow_handle`: without ``run_id`` the handle + follows the workflow's execution chain across continue-as-new, with + one it is pinned to that run. The provider is the one registered with + ``plugins=[provider]`` at :py:meth:`connect`, or passed as + ``stream_provider``. See :py:mod:`temporalio.streams`. + + Args: + workflow_id: Workflow ID whose stream to get a handle to. + run_id: Run ID to pin the handle to. + + Returns: + The stream handle. + + Raises: + temporalio.streams.StreamUnsupportedError: No stream provider is + registered on this client. + """ + provider = self._config.get("stream_provider") + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is registered on this client; connect with " + "plugins=[provider]" + ) + return provider.get_stream_handle(self, workflow_id, run_id=run_id) + def get_workflow_handle_for( self, workflow: ( @@ -3021,6 +3058,7 @@ class ClientConnectConfig(TypedDict, total=False): grpc_compression: GrpcCompression payload_limits: PayloadLimitsConfig header_codec_behavior: HeaderCodecBehavior + stream_provider: temporalio.streams.StreamProvider | None class ClientConfig(TypedDict, total=False): From fe446e646a306923467298d75bc149175845fcdd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:08:47 -0700 Subject: [PATCH 573/831] Moved the conformance cases onto the client accessor. A storage provider registers itself on the client, so its cases go through the accessor an application uses, and a store that lives inside a running workflow gets a host that starts the owning workflow first. --- tests/streams/test_stream_accessors.py | 122 ++++++++++++++++++++++ tests/streams/test_streams_conformance.py | 19 +++- 2 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 tests/streams/test_stream_accessors.py diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py new file mode 100644 index 000000000..eb733ba5b --- /dev/null +++ b/tests/streams/test_stream_accessors.py @@ -0,0 +1,122 @@ +"""The accessors each context asks for its stream, with one registration. + +The provider is registered on the client alone. A worker built from that +client inherits it, an activity on that worker reaches its own workflow's +stream through ``activity.stream_handle()``, and any code holding the client +reaches a stream through ``client.get_stream_handle()``. Without a +registration, both say so with the same error. +""" + +from __future__ import annotations + +import asyncio +import uuid +from datetime import timedelta +from typing import Any + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind, StreamUnsupportedError, topic +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import ActivityEnvironment, WorkflowEnvironment +from tests.helpers import new_worker + +INPUTS = topic("inputs", dict) +DECISIONS = topic("decisions", dict) + + +@pytest.fixture +def provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] + if env.supports_time_skipping: + pytest.skip( + "the memory provider polls on a timer, which time skipping turns into a spin" + ) + streams = MemoryStreams() + yield streams + streams.reset() + + +def _with_provider(client: Client, provider: MemoryStreams) -> Client: + # The same connection, with the provider registered the way an + # application registers it: once, on the client. + config = client.config() + config["plugins"] = [provider] + return Client(**config) + + +@activity.defn +async def emit(count: int) -> str: + # No workflow id and no run id: the handle is this activity's own + # workflow, pinned to its run, and the producer's identity is the + # activity's. + model = activity.stream_handle().producer(topic=INPUTS) + for n in range(count): + await model.append({"n": n}) + await model.finish() + return activity.info().activity_id + + +@workflow.defn +class Echo: + """Runs the emitting activity and echoes what arrives on ``inputs``.""" + + @workflow.run + async def run(self, count: int) -> list[Any]: + inputs = workflow.stream_reader(INPUTS) + decisions = workflow.stream_writer(DECISIONS) + emitting = workflow.start_activity( + emit, count, start_to_close_timeout=timedelta(seconds=30) + ) + seen: list[Any] = [] + async for record in inputs: + if record.kind is RecordKind.FINISH: + seen.append(("finish", record.producer_id)) + break + assert record.value is not None + seen.append(record.value["n"]) + decisions.publish({"echo": record.value["n"]}) + decisions.finish() + producer_id = await emitting + return [*seen, ("activity", producer_id)] + + +async def test_one_registration_on_the_client_serves_every_context( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + # No plugins on the worker: it inherits the client's provider. + async with new_worker(registered, Echo, activities=[emit]) as worker: + handle = await registered.start_workflow( + Echo.run, 2, id=workflow_id, task_queue=worker.task_queue + ) + result = await handle.result() + # The activity wrote as itself onto its own workflow's topic. + assert result[:2] == [0, 1] + assert result[2] == ["finish", result[3][1]] + + stream = registered.get_stream_handle(workflow_id) + + async def read_everything() -> list[Any]: + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] + + assert await asyncio.wait_for(read_everything(), 30) == [ + (RecordKind.DATA, {"echo": 0}), + (RecordKind.DATA, {"echo": 1}), + (RecordKind.FINISH, None), + ] + + +async def test_get_stream_handle_needs_a_registered_provider(client: Client): + with pytest.raises(StreamUnsupportedError, match="plugins="): + client.get_stream_handle("wf") + + +async def test_stream_handle_needs_a_provider_on_the_worker(): + async def ask() -> None: + activity.stream_handle() + + with pytest.raises(StreamUnsupportedError, match="plugins="): + await ActivityEnvironment().run(ask) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index a9dcae815..9002ea16a 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -5,9 +5,11 @@ store. A storage provider adds itself to ``SETUPS``, behind its own ``STREAMS_LIVE`` gate when it needs a store the test environment does not start: its setup receives the environment's client and hands back a provider -instance and which capabilities it lacks, so the cases marked -``reports_positions`` are skipped with a reason on a provider whose -``append()`` learns positions at read time. +instance, the client the cases should use, a ``host`` that starts the +workflow owning a stream when the store lives inside a running workflow, and +which capabilities it lacks, so the cases marked ``reports_positions`` are +skipped with a reason on a provider whose ``append()`` learns positions at +read time. What this file pins down is the contract: the record on the wire, producer identity, retry deduplication, positions, supersession, topic addressing, @@ -20,7 +22,7 @@ import asyncio import uuid -from collections.abc import AsyncIterator, Callable +from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass from typing import Any @@ -60,12 +62,21 @@ class ProviderCase: name: str provider: StreamProvider + client: Client | None = None reports_positions: bool = True """``append()`` returns where the records landed.""" + host: Callable[[str], Awaitable[None]] | None = None + """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" async def open( self, workflow_id: str, *, run_id: str | None = None ) -> StreamHandle: + if self.host is not None: + await self.host(workflow_id) + if self.client is not None: + # A storage provider's setup registers the provider on the client, + # so the cases go through the accessor an application uses. + return self.client.get_stream_handle(workflow_id, run_id=run_id) # Only the memory provider gets here, and it takes no client. return self.provider.get_stream_handle( None, # type: ignore[arg-type] From 717f58b42e6fe554f67833bc0f314977db39955f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:08:47 -0700 Subject: [PATCH 574/831] Added the streams demo and the changelog entry. The demo registers one provider on the client and shows each context asking for its stream: the workflow reads and publishes, the activity produces onto a topic, and the outside reader follows from the client. --- CHANGELOG.md | 13 +++ streams_demo/agent_loop.py | 110 +++++++++++++++++++++ streams_demo/provider_setup.py | 36 +++++++ streams_demo/run_demo.py | 172 +++++++++++++++++++++++++++++++++ 4 files changed, 331 insertions(+) create mode 100644 streams_demo/agent_loop.py create mode 100644 streams_demo/provider_setup.py create mode 100644 streams_demo/run_demo.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f016f34ff..c74bdf72a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,19 @@ to include examples, links to docs, or any other relevant information. ### Added - Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. +- **Experimental**: `temporalio.streams` defines one stream interface a workflow + can read, decide on, and write. A provider is registered once as a plugin, + `Client.connect(plugins=[provider])`, and workers built from that client + inherit it; each context then asks for its stream the same way: + `workflow.stream_reader()` and `workflow.stream_writer()` in workflow code, + `activity.stream_handle()` in an activity, and `client.get_stream_handle()` + anywhere a client is held. A topic is a typed definition, + `streams.topic("inputs", Token)`, shared by workflow, activity and client + code; a plain string names a topic decided at runtime. The record on the wire + is `temporal.api.stream.v1.StreamRecord` on every provider. + `temporalio.streams.providers.memory.MemoryStreams` is the in-memory + reference provider the conformance tests run against. + ### Changed ### Deprecated diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py new file mode 100644 index 000000000..df5eac4d6 --- /dev/null +++ b/streams_demo/agent_loop.py @@ -0,0 +1,110 @@ +"""One agent loop, written once, run on every stream provider. + +Reads input, decides on it, publishes the decision, and runs an ordinary +Activity in the same workflow task; the Activity reports on its own +workflow's stream in turn. Also handles the two control records the contract +defines, so a retried producer and a finished topic are exercised rather than +described. + +This file is byte-identical in the server-side tree and the client-side tree. +Nothing in it names a provider: the workflow asks its runtime, the Activity +asks its context, and the process that runs them registered the provider once. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any + +from temporalio import activity, streams, workflow +from temporalio.streams import RecordKind + +# Defined once and shared by the workflow, the Activity and the demo's +# reader, so the type each topic carries is stated in one place. +DECISIONS = streams.topic("decisions", dict[str, Any]) +INPUTS = streams.topic("inputs", dict[str, Any]) +RECEIPTS = streams.topic("receipts", dict[str, Any]) + + +@activity.defn(name="RecordDecision") +async def record_decision(decision: dict[str, Any]) -> str: + """An ordinary command in the same task as the publish. + + Appends its receipt onto its own workflow's stream too, under the + Activity's own identity, so a reader outside sees the decision and the + record of it side by side. + """ + receipt = f"recorded:{decision['source']}:{decision['branch']}" + await activity.stream_handle().producer(topic=RECEIPTS).append({"receipt": receipt}) + return receipt + + +def decide(token: dict[str, Any]) -> dict[str, Any]: + """The decision the workflow is here to make.""" + if token["value"] % 2 == 0: + return { + "source": token["id"], + "branch": "even", + "computed": token["value"] * 10, + } + return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} + + +@workflow.defn(name="StreamContractDemo", sandboxed=False) +class AgentLoop: + """Read, decide, write, until the producer says it has finished.""" + + @workflow.run + async def run(self, limit: int) -> list[dict[str, Any]]: + """Decide on at most ``limit`` inputs, then return the trace.""" + inputs = workflow.stream_reader(INPUTS) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + accepted = 0 + try: + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + # A newer attempt of the same producer started writing. The + # decisions already published stand, so the workflow says so + # rather than pretending they can be withdrawn. + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "producer": record.producer_id, + "replaced": record.supersession.previous_attempt, + "attempt": record.supersession.attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + # The producer says it is done, which is what ends the loop. + # Counting decisions instead would leave the terminal record + # unread and let the workflow finish while its producer is + # still writing. + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decision = decide(record.value) + decisions.publish(decision) + receipt = await workflow.execute_activity( + record_decision, + decision, + activity_id=f"decision-{decision['source']}", + start_to_close_timeout=timedelta(seconds=10), + ) + trace.append( + {"kind": "decision", "value": decision, "receipt": receipt} + ) + accepted += 1 + if accepted >= limit: + # A bound so a stuck producer cannot run this forever. The + # terminal record above is the ordinary way out. + break + finally: + inputs.close() + decisions.finish() + return trace diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py new file mode 100644 index 000000000..2e4bcc350 --- /dev/null +++ b/streams_demo/provider_setup.py @@ -0,0 +1,36 @@ +"""Pick the provider for a demo run from the environment. + +``STREAMS_PROVIDER`` names a provider; this base tree carries only ``memory``, +and each provider branch adds its own name here. The demo needs a Temporal +server to run the workflow either way; ``TEMPORAL_ADDRESS`` points at it. +""" + +from __future__ import annotations + +import os + +from temporalio.streams.providers import ProviderPlugin +from temporalio.streams.providers.memory import MemoryStreams + +NAME = os.environ.get("STREAMS_PROVIDER", "memory") + +# The memory provider is not replay-safe, so its demo keeps the cache warm. +# Storage providers run with the smallest cache they support instead. +WORKFLOW_CACHE = int(os.environ.get("STREAMS_WORKFLOW_CACHE", "512")) + + +async def open() -> tuple[str, ProviderPlugin]: + """The server to connect to and the provider the worker and the client share.""" + if NAME != "memory": + raise SystemExit(f"this tree carries no stream provider named {NAME!r}") + return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), MemoryStreams() + + +async def close(provider: ProviderPlugin) -> None: + """Let go of whatever :func:`open` acquired. + + The memory provider holds no connection, so this is its ``close()`` and + nothing more. A provider branch that opens one closes it the same way, so + the demo's teardown reads the same on every provider. + """ + await provider.close() diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py new file mode 100644 index 000000000..e91bf2e31 --- /dev/null +++ b/streams_demo/run_demo.py @@ -0,0 +1,172 @@ +"""Run the shared agent loop against whichever provider is configured. + +Three cases, the same on every provider: + +- read, decide, publish and an ordinary Activity in the same workflow task, + with the smallest workflow cache the provider supports, so that as much of + the run as it allows is rebuilt rather than remembered; +- a producer whose second attempt supersedes its first, which the reader has + to report and the workflow has to act on; +- an outside reader following what the workflow published, and the receipts + the Activity appended on the workflow's stream from inside its own context. + +The provider is registered once, on the client; the worker inherits it and +every context asks for its stream without naming it. Byte-identical in every +tree. ``provider_setup`` is what differs, and it is the only import here that +names a provider. +""" + +from __future__ import annotations + +import asyncio +import json +import sys +import time +import uuid +from pathlib import Path +from typing import Any + +from temporalio.api.enums.v1 import EventType +from temporalio.client import Client +from temporalio.streams import RecordKind, StreamHandle +from temporalio.worker import Worker + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import provider_setup # noqa: E402 +from agent_loop import ( # noqa: E402 + DECISIONS, + INPUTS, + RECEIPTS, + AgentLoop, + record_decision, +) + +DECISION_LIMIT = 8 +EXPECTED_OUTPUT = 6 + + +async def collect_output(stream: StreamHandle, want: int) -> list[dict]: + """Read ``want`` decisions off the workflow's stream from outside it.""" + seen: list[dict] = [] + async for record in stream.read(topic=DECISIONS): + seen.append({"kind": record.kind.name, "value": record.value}) + if len(seen) >= want: + break + return seen + + +async def main() -> int: + """Run the demo once and write what happened next to this file.""" + out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" + out.mkdir(exist_ok=True) + target, provider = await provider_setup.open() + client = await Client.connect(target, namespace="default", plugins=[provider]) + + uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex + record: dict[str, Any] = { + "provider": provider_setup.NAME, + "workflow_id": uid, + "target": target, + "max_cached_workflows": provider_setup.WORKFLOW_CACHE, + } + + async with Worker( + client, + task_queue=uid, + workflows=[AgentLoop], + activities=[record_decision], + max_cached_workflows=provider_setup.WORKFLOW_CACHE, + ): + handle = await client.start_workflow( + AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid + ) + stream = client.get_stream_handle(uid) + output = asyncio.create_task(collect_output(stream, EXPECTED_OUTPUT)) + + # The first attempt writes two records and then stops, as a failed + # activity would. The second writes different inputs under the same + # logical producer, which is what the reader has to report. + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"id": "r1", "value": 1}, {"id": "r2", "value": 2}) + await asyncio.sleep(0.5) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"id": "r3", "value": 3}, {"id": "r4", "value": 4}) + await second.finish() + + # A failed Workflow Task is not an outcome. The server rejects a + # completion that raced newly buffered events, and the retry usually + # gets through, so reading the first failure as the result reports a + # working run as a broken one. Wait for a terminal event, then report + # the retries separately so they are neither the headline nor hidden. + deadline = time.monotonic() + 120 + # Taken from the enum rather than written out, because guessing these + # numbers is how a run that completed gets reported as terminated. + terminal = { + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: "completed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: "workflow_failed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: "execution_timed_out", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: "canceled", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: "terminated", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: "continued_as_new", + } + while time.monotonic() < deadline: + history = await handle.fetch_history() + reached = [ + terminal[e.event_type] + for e in history.events + if e.event_type in terminal + ] + if reached: + record["outcome"] = reached[-1] + if record["outcome"] == "completed": + record["trace"] = await handle.result() + break + await asyncio.sleep(0.1) + else: + record["outcome"] = "timed_out_waiting" + history = await handle.fetch_history() + + retried = [ + e + for e in history.events + if e.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_FAILED + ] + record["task_failures"] = [ + { + "event_id": e.event_id, + "cause": int(e.workflow_task_failed_event_attributes.cause), + "message": e.workflow_task_failed_event_attributes.failure.message, + } + for e in retried + ] + + try: + record["observed_output"] = await asyncio.wait_for(output, timeout=20) + except asyncio.TimeoutError: + output.cancel() + record["observed_output"] = "timed_out" + + async def receipts() -> list[Any]: + # Ends by itself once the workflow is closed and the tail served. + return [ + r.value + async for r in stream.read(topic=RECEIPTS) + if r.kind is RecordKind.DATA + ] + + try: + record["receipts"] = await asyncio.wait_for(receipts(), timeout=20) + except asyncio.TimeoutError: + record["receipts"] = "timed_out" + + history = await handle.fetch_history() + record["history_events"] = len(history.events) + (out / "history.json").write_text(history.to_json()) + await provider_setup.close(provider) + (out / "results.json").write_text(json.dumps(record, indent=2) + "\n") + print(json.dumps(record, indent=2)) + return 0 if record["outcome"] == "completed" else 1 + + +if __name__ == "__main__": + sys.exit(asyncio.run(main())) From ca9c2e4a86b33f0666315e7b4dbe7dabd15c7e4f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:10:44 -0700 Subject: [PATCH 575/831] Let a pushed history carry stream slices. History holds the offsets a task consumed and never the records, so a replayer that fetched them needs a way to hand them to Core with the history. --- temporalio/bridge/src/worker.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/temporalio/bridge/src/worker.rs b/temporalio/bridge/src/worker.rs index e74698e94..44e5a2005 100644 --- a/temporalio/bridge/src/worker.rs +++ b/temporalio/bridge/src/worker.rs @@ -14,6 +14,7 @@ use temporalio_common::protos::coresdk::{ nexus::NexusTaskCompletion, ActivityHeartbeat, ActivityTaskCompletion, }; use temporalio_common::protos::temporal::api::history::v1::History; +use temporalio_common::protos::temporal::api::stream::v1::StreamSlice; use temporalio_common::protos::temporal::api::worker::v1::{PluginInfo, StorageDriverInfo}; use temporalio_sdk_core::replay::{HistoryForReplay, ReplayWorkerInput}; use temporalio_sdk_core::{ @@ -950,14 +951,24 @@ impl HistoryPusher { #[pymethods] impl HistoryPusher { + /// Feed one history to the replay worker. `stream_slices` are serialized + /// `temporal.api.stream.v1.StreamSlice` messages carrying the records the + /// history's completed tasks consumed, which History itself never holds. + #[pyo3(signature = (workflow_id, history_proto, stream_slices = Vec::new()))] fn push_history<'p>( &self, py: Python<'p>, workflow_id: &str, history_proto: &Bound<'_, PyBytes>, + stream_slices: Vec>, ) -> PyResult> { let history = History::decode(history_proto.as_bytes()) .map_err(|err| PyValueError::new_err(format!("Invalid proto: {err}")))?; + let slices = stream_slices + .iter() + .map(|slice| StreamSlice::decode(slice.as_bytes())) + .collect::, _>>() + .map_err(|err| PyValueError::new_err(format!("Invalid stream slice proto: {err}")))?; let wfid = workflow_id.to_string(); let tx = if let Some(tx) = self.tx.as_ref() { tx.clone() @@ -968,7 +979,7 @@ impl HistoryPusher { }; // We accept this doesn't have logging/tracing self.runtime.future_into_py(py, async move { - tx.send(HistoryForReplay::new(history, wfid)) + tx.send(HistoryForReplay::new(history, wfid).with_stream_slices(slices)) .await .map_err(|_| { PyRuntimeError::new_err( From 3ebd9f506b19651cb80a1e2629dc94b91429f3b2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:10:44 -0700 Subject: [PATCH 576/831] Fetched a consuming workflow's stream records for the Replayer. A workflow that read a server-side stream could not be replayed at all. Given a stream_client the replayer fetches every recorded range from the stream service, resolving a subscribed name as the server does; without one such a history is refused with the remedy in the message. --- temporalio/worker/_replayer.py | 215 +++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index c7ae8d59d..d020e2256 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -8,15 +8,18 @@ from collections.abc import AsyncIterator, Mapping, Sequence from contextlib import AbstractAsyncContextManager, asynccontextmanager from dataclasses import dataclass +from typing import Any from typing_extensions import TypedDict import temporalio.api.history.v1 +import temporalio.api.stream.v1 import temporalio.bridge.proto.workflow_activation import temporalio.bridge.worker import temporalio.client import temporalio.converter import temporalio.runtime +import temporalio.service import temporalio.streams import temporalio.worker import temporalio.workflow @@ -58,6 +61,7 @@ def __init__( disable_safe_workflow_eviction: bool = False, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, stream_provider: temporalio.streams.StreamProvider | None = None, + stream_client: temporalio.client.Client | None = None, ) -> None: """Create a replayer to replay workflows from history. @@ -66,6 +70,17 @@ def __init__( the replayer that were passed to the worker when the workflow originally ran, ``stream_provider`` included when the workflow used streams. + A workflow that read a server-side stream cannot be replayed from its + history alone. History records the offsets each Workflow Task consumed + and never the records; on a live task the server re-supplies them from + the stream. ``stream_client`` is a client connected to the server that + still holds those streams. Given one, the replayer fetches every range + a history's completed tasks recorded from the stream service and hands + the records to the replay alongside the history, so the workflow sees + what it saw the first time. A range the stream no longer holds fails + that replay with :py:class:`temporalio.streams.StreamNotFoundError`. + Without a client, replaying such a history fails and says so. + Note, unlike the worker, for the replayer the workflow_task_executor will default to a new thread pool executor with no max_workers set that will be shared across all replay calls and never explicitly shut down. @@ -89,6 +104,7 @@ def __init__( disable_safe_workflow_eviction=disable_safe_workflow_eviction, header_codec_behavior=header_codec_behavior, stream_provider=stream_provider, + stream_client=stream_client, ) self._initial_config = self._config.copy() self._default_workflow_logic_flags = set(_DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS) @@ -365,9 +381,32 @@ def on_eviction_hook( # Start worker workflow_worker_task = asyncio.create_task(workflow_worker.run()) + stream_client = self._config.get("stream_client") + # Yield iterator async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: async for history in histories: + # The records a consuming workflow read are not in its + # history. Either fetch them from the stream service or + # report here what is missing, rather than let Core fail + # the first task on input it was never given. + stream_slices: list[bytes] = [] + if stream_client is not None: + try: + stream_slices = await _stream_slices(stream_client, history) + except temporalio.streams.StreamNotFoundError as err: + yield WorkflowReplayResult( + history=history, replay_failure=err + ) + continue + else: + missing = _stream_records_missing(history) + if missing is not None: + yield WorkflowReplayResult( + history=history, replay_failure=RuntimeError(missing) + ) + continue + # Clear last complete and push history last_replay_complete.clear() await pusher.push_history( @@ -375,6 +414,7 @@ async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: temporalio.api.history.v1.History( events=history.events ).SerializeToString(), + stream_slices, ) # Wait for worker error or last replay to complete. This @@ -420,6 +460,174 @@ async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: logger.warning("Failed to finalize shutdown", exc_info=True) +def _consumed_ranges( + history: temporalio.client.WorkflowHistory, +) -> list[tuple[int, temporalio.api.stream.v1.StreamRange]]: + """Every range a completed task recorded, with the id of the event that recorded it.""" + out: list[tuple[int, temporalio.api.stream.v1.StreamRange]] = [] + for event in history.events: + if not event.HasField("workflow_task_completed_event_attributes"): + continue + attributes = event.workflow_task_completed_event_attributes + for consumed in attributes.consumed_stream_ranges: + out.append((event.event_id, consumed)) + return out + + +def _stream_records_missing(history: temporalio.client.WorkflowHistory) -> str | None: + """Why this history cannot be replayed without a stream client, or ``None``.""" + ranges = [r for _, r in _consumed_ranges(history) if r.to_offset > r.from_offset] + if not ranges: + return None + streams = sorted({r.stream_id for r in ranges}) + return ( + f"workflow {history.workflow_id!r} consumed records from stream(s) " + f"{', '.join(repr(s) for s in streams)} in {len(ranges)} task(s), and History " + "records only the offsets. Create the Replayer with stream_client= (a Client " + "connected to the server that still holds the streams) so the records can be " + "fetched from the stream service." + ) + + +async def _stream_slices( + client: temporalio.client.Client, history: temporalio.client.WorkflowHistory +) -> list[bytes]: + """Fetch the records the history's tasks consumed, as serialized ``StreamSlice`` messages. + + The shape is the one the server puts on a poll response when it re-supplies + a cache miss: one slice per recorded range, tagged with the completion that + recorded it, an empty range included. Raises + :py:class:`temporalio.streams.StreamNotFoundError` for a range the stream no + longer holds. + """ + ranges = _consumed_ranges(history) + if not ranges: + return [] + # Imported here: the stream client needs the grpc extra, which a replayer + # without a stream client never touches. + from temporalio.client_stream import shared_client + + streams = shared_client(client.service_client.config.target_host, client.namespace) + run_id = history.run_id + # The handle that served each stream id, so later ranges of the same + # stream go straight to it. + served_by: dict[str, Any] = {} + slices: list[bytes] = [] + for event_id, consumed in ranges: + stream_slice = temporalio.api.stream.v1.StreamSlice( + stream_id=consumed.stream_id, + run_id=run_id, + from_offset=consumed.from_offset, + to_offset=consumed.to_offset, + workflow_task_completed_event_id=event_id, + ) + if consumed.to_offset > consumed.from_offset: + handle, records, owner_run_id = await _fetch_range( + streams, + history.workflow_id, + run_id, + consumed, + served_by.get(consumed.stream_id), + ) + served_by[consumed.stream_id] = handle + stream_slice.run_id = owner_run_id or run_id + stream_slice.records.extend(records) + slices.append(stream_slice.SerializeToString()) + return slices + + +async def _fetch_range( + streams: Any, + workflow_id: str, + run_id: str, + consumed: temporalio.api.stream.v1.StreamRange, + known: Any, +) -> tuple[Any, list[temporalio.api.stream.v1.StreamRecord], str]: + """The records at exactly the recorded range, with the handle that served them. + + A subscribed name is resolved as the server resolves it: a stream the + workflow owns by that name first, else a standalone stream by that id. The + owned stream cannot be asked whether it exists, since a name nobody wrote + reads as empty, so the owned stream is probed for the range's first record + and the standalone one is tried when it has nothing there. + """ + gone = ( + f"stream {consumed.stream_id!r} no longer holds offsets " + f"[{consumed.from_offset}, {consumed.to_offset}) that a completed task of " + f"workflow {workflow_id!r} run {run_id!r} consumed; its records cannot be " + "replayed" + ) + candidates = ( + [known] + if known is not None + else [ + streams.workflow_stream( + workflow_id, consumed.stream_id, owner_run_id=run_id + ), + streams.get(consumed.stream_id), + ] + ) + last: Exception | None = None + for handle in candidates: + try: + records, owner_run_id = await _read_range(handle, consumed, gone) + except temporalio.streams.StreamNotFoundError as error: + last = error + continue + if records is not None: + return handle, records, owner_run_id + raise temporalio.streams.StreamNotFoundError(gone) from last + + +async def _read_range( + handle: Any, consumed: temporalio.api.stream.v1.StreamRange, gone: str +) -> tuple[list[temporalio.api.stream.v1.StreamRecord] | None, str]: + """Read ``[from_offset, to_offset)`` from one stream. + + ``None`` when the stream has nothing at the range's first offset, which is + how a name that is not this stream's reads; a stream that has the start but + not the rest, or refuses the offset as truncated or past its head, raises. + """ + records: list[temporalio.api.stream.v1.StreamRecord] = [] + owner_run_id = "" + offset = consumed.from_offset + while offset < consumed.to_offset: + try: + page = await handle.poll( + from_offset=offset, + max_records=consumed.to_offset - offset, + wait=False, + ) + except temporalio.streams.StreamNotFoundError: + if not records: + return None, "" + raise + except temporalio.service.RPCError as error: + # Below the truncation floor or past the head: the server refuses + # the offset rather than answering short. + if error.status in ( + temporalio.service.RPCStatusCode.FAILED_PRECONDITION, + temporalio.service.RPCStatusCode.INVALID_ARGUMENT, + temporalio.service.RPCStatusCode.OUT_OF_RANGE, + ): + raise temporalio.streams.StreamNotFoundError(gone) from error + raise + owner_run_id = page.run_id or owner_run_id + if not page.entries: + if not records: + return None, "" + raise temporalio.streams.StreamNotFoundError(gone) + for entry in page.entries: + if entry.offset != offset or offset >= consumed.to_offset: + raise temporalio.streams.StreamNotFoundError( + f"{gone}: the stream answered offset {entry.offset} where " + f"{offset} was due" + ) + records.append(entry.record) + offset += 1 + return records, owner_run_id + + class ReplayerConfig(TypedDict, total=False): """TypedDict of config originally passed to :py:class:`Replayer`.""" @@ -438,6 +646,7 @@ class ReplayerConfig(TypedDict, total=False): disable_safe_workflow_eviction: bool header_codec_behavior: HeaderCodecBehavior stream_provider: temporalio.streams.StreamProvider | None + stream_client: temporalio.client.Client | None @dataclass(frozen=True) @@ -455,6 +664,12 @@ class WorkflowReplayResult: :py:class:`temporalio.workflow.NondeterminismError` was encountered during replay - likely indicating your workflow code is incompatible with the history. + + A workflow that read a server-side stream reports here, before any task + runs, when its records could not be fetched: a + :py:class:`temporalio.streams.StreamNotFoundError` when the stream no + longer holds a range a task consumed, or a ``RuntimeError`` when the + replayer was given no ``stream_client`` to fetch them with. """ From a4be6acafb72d73cdc2fc890d754fe44cdf3be32 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:10:49 -0700 Subject: [PATCH 577/831] Followed a workflow reset on the handle and in the Replayer. A run's close event names a continue-as-new successor but not the run it was reset into; describe does, and the reset run's inherited streams continue the base run's offset space from their floor. The replayer splits the history at each reset marker and fetches each era from the run whose stream holds it. --- temporalio/streams/providers/native.py | 80 ++++++++++++++++++++--- temporalio/worker/_replayer.py | 89 ++++++++++++++++++-------- 2 files changed, 133 insertions(+), 36 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 9c0cb3dbd..c224afb2a 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -11,7 +11,11 @@ A cursor names the run as well as the offset, because an owned stream belongs to one run and a successor's starts over at zero. A handle without a run id reads run after run, learning from the poll that a run's stream is closed and -from the run's close event who came next; with a run id it is pinned. +from the run's close event who came next; with a run id it is pinned. A run +that was reset is followed too: its close event does not name the run reset +from it, describe does, and that run's streams continue the base run's offset +space where it inherited a subscription, so the read resumes at the floor the +stream reports rather than at zero. Prototype support for AI-198. It needs a server built from that branch and opens its own gRPC channel to it, because sdk-core does not know the stream @@ -298,7 +302,12 @@ def read( after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes. + + The chain is followed across continue-as-new and across a reset: a + run reset from a closed one is read next, from the floor its stream + reports. A handle pinned to a run that was reset ends with that run. + """ topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. @@ -338,10 +347,10 @@ async def _read( break if self._run_id is not None: return - successor = await self._successor(run_id) - if successor is None: + following = await self._successor(topic, run_id) + if following is None: return - run_id, offset = successor, 0 + run_id, offset = following async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, naming the run it was read from. @@ -412,31 +421,84 @@ async def _predecessor(self, run_id: str) -> str | None: try: async for event in handle.fetch_history_events(page_size=1): attributes = event.workflow_execution_started_event_attributes - return attributes.continued_execution_run_id or None + if attributes.continued_execution_run_id: + return attributes.continued_execution_run_id + # A reset run's start event is the base run's, copied, and the + # original run id it carries is kept across resets, so it names + # the run the chain of resets began from. + original = attributes.original_execution_run_id + if original and original != run_id: + return original + return None except RPCError as error: if error.status != RPCStatusCode.NOT_FOUND: raise # The run's History is gone: the chain's retained part starts here. return None - async def _successor(self, run_id: str) -> str | None: + async def _successor(self, topic: str, run_id: str) -> tuple[str, int] | None: + """The run that carries on after ``run_id``, and where its stream starts. + + A continue-as-new names its successor in the close event, and the + successor's streams start at zero. A reset does not: the base run is + closed with no word of the reset in its own History, and only describe + names the run reset from it. That run reads on streams of its own that + continue the base run's offset space where it inherited a subscription, + and such a stream refuses any offset below its floor, so the read + resumes at the floor the stream reports. + """ handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) events = handle.fetch_history_events( event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT ) + closed = False try: async for event in events: + closed = True if event.HasField( "workflow_execution_continued_as_new_event_attributes" ): attributes = ( event.workflow_execution_continued_as_new_event_attributes ) - return attributes.new_execution_run_id or None + if not attributes.new_execution_run_id: + return None + return attributes.new_execution_run_id, 0 except RPCError as error: if error.status != RPCStatusCode.NOT_FOUND: raise - return None + return None + if not closed: + return None + reset_run = await self._reset_run(run_id) + if reset_run is None: + return None + return reset_run, await self._floor(topic, reset_run) + + async def _reset_run(self, run_id: str) -> str | None: + """The run ``run_id`` was reset into, which only describe reports.""" + handle = self._client.get_workflow_handle(self._workflow_id, run_id=run_id) + try: + description = await handle.describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + return None + raise + extended = description.raw_description.workflow_extended_info + return extended.reset_run_id or None + + async def _floor(self, topic: str, run_id: str) -> int: + """The first offset a run's stream holds. + + A stream the run inherited a subscription to exists from the reset on + and starts at the inherited offset. One the base run only published to + is created on the run's first publish, at zero, and does not exist + before that. + """ + try: + return (await self._stream(topic, run_id).describe()).base_offset + except StreamNotFoundError: + return 0 class NativeStreams(ProviderPlugin): diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index d020e2256..ee9fb6a0f 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -12,6 +12,7 @@ from typing_extensions import TypedDict +import temporalio.api.enums.v1 import temporalio.api.history.v1 import temporalio.api.stream.v1 import temporalio.bridge.proto.workflow_activation @@ -474,6 +475,40 @@ def _consumed_ranges( return out +def _eras( + history: temporalio.client.WorkflowHistory, +) -> list[tuple[str, list[tuple[int, temporalio.api.stream.v1.StreamRange]]]]: + """The recorded ranges grouped by the run whose streams hold them. + + A reset copies the base run's history into the new run, so the ranges + before the reset point were consumed from the base run's streams, and the + run they belong to is only named by the `WorkflowTaskFailed` event that + marks the reset point, after them in the history. Ranges after the last + reset point belong to the run itself, which that event names as well; a + history with no reset point belongs to the run its start event names. This + is the split the server makes when it re-supplies a cache miss. + """ + reset = temporalio.api.enums.v1.WorkflowTaskFailedCause.WORKFLOW_TASK_FAILED_CAUSE_RESET_WORKFLOW + eras: list[tuple[str, list[tuple[int, temporalio.api.stream.v1.StreamRange]]]] = [] + pending: list[tuple[int, temporalio.api.stream.v1.StreamRange]] = [] + own_run_id = history.run_id + for event in history.events: + if event.HasField("workflow_task_failed_event_attributes"): + failed = event.workflow_task_failed_event_attributes + if failed.cause == reset and failed.base_run_id: + eras.append((failed.base_run_id, pending)) + pending = [] + own_run_id = failed.new_run_id or own_run_id + continue + if not event.HasField("workflow_task_completed_event_attributes"): + continue + attributes = event.workflow_task_completed_event_attributes + for consumed in attributes.consumed_stream_ranges: + pending.append((event.event_id, consumed)) + eras.append((own_run_id, pending)) + return eras + + def _stream_records_missing(history: temporalio.client.WorkflowHistory) -> str | None: """Why this history cannot be replayed without a stream client, or ``None``.""" ranges = [r for _, r in _consumed_ranges(history) if r.to_offset > r.from_offset] @@ -496,43 +531,43 @@ async def _stream_slices( The shape is the one the server puts on a poll response when it re-supplies a cache miss: one slice per recorded range, tagged with the completion that - recorded it, an empty range included. Raises - :py:class:`temporalio.streams.StreamNotFoundError` for a range the stream no - longer holds. + recorded it, an empty range included, fetched from the run whose stream + holds it (the run reset from, for a range recorded before a reset point). + Raises :py:class:`temporalio.streams.StreamNotFoundError` for a range the + stream no longer holds. """ - ranges = _consumed_ranges(history) - if not ranges: + if not _consumed_ranges(history): return [] # Imported here: the stream client needs the grpc extra, which a replayer # without a stream client never touches. from temporalio.client_stream import shared_client streams = shared_client(client.service_client.config.target_host, client.namespace) - run_id = history.run_id - # The handle that served each stream id, so later ranges of the same + # The handle that served each run's stream, so later ranges of the same # stream go straight to it. - served_by: dict[str, Any] = {} + served_by: dict[tuple[str, str], Any] = {} slices: list[bytes] = [] - for event_id, consumed in ranges: - stream_slice = temporalio.api.stream.v1.StreamSlice( - stream_id=consumed.stream_id, - run_id=run_id, - from_offset=consumed.from_offset, - to_offset=consumed.to_offset, - workflow_task_completed_event_id=event_id, - ) - if consumed.to_offset > consumed.from_offset: - handle, records, owner_run_id = await _fetch_range( - streams, - history.workflow_id, - run_id, - consumed, - served_by.get(consumed.stream_id), + for run_id, ranges in _eras(history): + for event_id, consumed in ranges: + stream_slice = temporalio.api.stream.v1.StreamSlice( + stream_id=consumed.stream_id, + run_id=run_id, + from_offset=consumed.from_offset, + to_offset=consumed.to_offset, + workflow_task_completed_event_id=event_id, ) - served_by[consumed.stream_id] = handle - stream_slice.run_id = owner_run_id or run_id - stream_slice.records.extend(records) - slices.append(stream_slice.SerializeToString()) + if consumed.to_offset > consumed.from_offset: + handle, records, owner_run_id = await _fetch_range( + streams, + history.workflow_id, + run_id, + consumed, + served_by.get((run_id, consumed.stream_id)), + ) + served_by[(run_id, consumed.stream_id)] = handle + stream_slice.run_id = owner_run_id or run_id + stream_slice.records.extend(records) + slices.append(stream_slice.SerializeToString()) return slices From 2c5ce1b902b22b85102d61b68a180f17da77724a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:10:56 -0700 Subject: [PATCH 578/831] Carried a workflow's stream records with its exported history. History records only the offsets a task consumed, so an export alone could not be replayed once the stream was gone. WorkflowHistory.stream_slices holds the records, to_json and from_json carry them beside the events with the plain shape unchanged, and Replayer.fetch_stream_slices fills them while the stream is retained. --- temporalio/client/_workflow.py | 57 ++++++++++++++++++++---- temporalio/worker/_replayer.py | 81 +++++++++++++++++++++++++--------- tests/worker/test_replayer.py | 46 +++++++++++++++++++ 3 files changed, 156 insertions(+), 28 deletions(-) diff --git a/temporalio/client/_workflow.py b/temporalio/client/_workflow.py index 0607ade0a..10a4853fd 100644 --- a/temporalio/client/_workflow.py +++ b/temporalio/client/_workflow.py @@ -4,6 +4,7 @@ import asyncio import functools +import json import warnings from asyncio import Future from collections.abc import ( @@ -31,6 +32,7 @@ import temporalio.api.common.v1 import temporalio.api.enums.v1 import temporalio.api.history.v1 +import temporalio.api.stream.v1 import temporalio.api.update.v1 import temporalio.api.workflow.v1 import temporalio.api.workflowservice.v1 @@ -1681,6 +1683,20 @@ class WorkflowHistory: events: Sequence[temporalio.api.history.v1.HistoryEvent] """History events for the workflow.""" + stream_slices: Sequence[temporalio.api.stream.v1.StreamSlice] = () + """The stream records the workflow's completed tasks consumed, if captured. + + History records only the offsets each Workflow Task consumed from a + server-side stream; the records live in the stream. A history whose tasks + consumed records and that carries none here cannot be replayed without the + server that still holds the stream. One slice per recorded range, tagged + with the ``WorkflowTaskCompleted`` event that recorded it, in the shape the + server puts on a poll response. + :py:meth:`temporalio.worker.Replayer.fetch_stream_slices` fills it while + the stream is retained, and :py:meth:`to_json` and :py:meth:`from_json` + carry it, so an exported history file is the whole replay input. + """ + @property def run_id(self) -> str: """Run ID extracted from the first event.""" @@ -1702,31 +1718,56 @@ def from_json(workflow_id: str, history: str | dict[str, Any]) -> WorkflowHistor Args: workflow_id: The workflow's ID history: A string or parsed-to-dict representation of workflow - history + history. A ``streamSlices`` list beside ``events``, as + :py:meth:`to_json` writes one, is read into + :py:attr:`stream_slices`. Returns: Workflow history """ + if isinstance(history, str): + history = json.loads(history) parsed = _history_from_json(history) - return WorkflowHistory(workflow_id, parsed.events) + slices: list[temporalio.api.stream.v1.StreamSlice] = [] + if isinstance(history, dict): + raw = history.get("streamSlices") or history.get("stream_slices") or [] + for entry in raw: + slices.append( + google.protobuf.json_format.ParseDict( + entry, + temporalio.api.stream.v1.StreamSlice(), + ignore_unknown_fields=True, + ) + ) + return WorkflowHistory(workflow_id, parsed.events, slices) def to_json(self) -> str: """Convert this history to JSON. - Note, this does not include the workflow ID. + Note, this does not include the workflow ID. The stream slices, when + there are any, are written as a ``streamSlices`` list beside the + events; without them the output is the history proto's JSON alone. """ - return google.protobuf.json_format.MessageToJson( - temporalio.api.history.v1.History(events=self.events) - ) + if not self.stream_slices: + return google.protobuf.json_format.MessageToJson( + temporalio.api.history.v1.History(events=self.events) + ) + return json.dumps(self.to_json_dict(), indent=2) def to_json_dict(self) -> dict[str, Any]: """Convert this history to JSON-compatible dict. - Note, this does not include the workflow ID. + Note, this does not include the workflow ID. See :py:meth:`to_json` + for how the stream slices are carried. """ - return google.protobuf.json_format.MessageToDict( + out = google.protobuf.json_format.MessageToDict( temporalio.api.history.v1.History(events=self.events) ) + if self.stream_slices: + out["streamSlices"] = [ + google.protobuf.json_format.MessageToDict(s) for s in self.stream_slices + ] + return out @dataclass diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index ee9fb6a0f..47a54c218 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -74,13 +74,21 @@ def __init__( A workflow that read a server-side stream cannot be replayed from its history alone. History records the offsets each Workflow Task consumed and never the records; on a live task the server re-supplies them from - the stream. ``stream_client`` is a client connected to the server that - still holds those streams. Given one, the replayer fetches every range - a history's completed tasks recorded from the stream service and hands - the records to the replay alongside the history, so the workflow sees - what it saw the first time. A range the stream no longer holds fails - that replay with :py:class:`temporalio.streams.StreamNotFoundError`. - Without a client, replaying such a history fails and says so. + the stream. Three cases: + + * The history carries the records in + :py:attr:`temporalio.client.WorkflowHistory.stream_slices`, put + there by :py:meth:`fetch_stream_slices` while the stream was + retained and carried by ``to_json()`` and ``from_json()``. They are + handed to the replay and no server is contacted. + * The history carries none and ``stream_client`` is given: a client + connected to the server that still holds the streams. The replayer + fetches every range the completed tasks recorded from the stream + service and hands the records to the replay, so the workflow sees + what it saw the first time. A range the stream no longer holds fails + that replay with :py:class:`temporalio.streams.StreamNotFoundError`. + * The history carries none and there is no client: replaying it fails + and the message names both remedies. Note, unlike the worker, for the replayer the workflow_task_executor will default to a new thread pool executor with no max_workers set that @@ -127,6 +135,31 @@ def _set_default_workflow_logic_flag( else: self._default_workflow_logic_flags.discard(flag) + @staticmethod + async def fetch_stream_slices( + client: temporalio.client.Client, history: temporalio.client.WorkflowHistory + ) -> temporalio.client.WorkflowHistory: + """Return ``history`` with the stream records its tasks consumed attached. + + History records only the offsets each Workflow Task consumed from a + server-side stream, so an export cannot be replayed without the + server that still holds the stream. This fetches every recorded range + from the stream service through ``client`` while the stream is + retained and returns a copy of ``history`` with the records in + :py:attr:`temporalio.client.WorkflowHistory.stream_slices`. Its + ``to_json()`` then carries them, and a replayer given the result, or a + ``from_json()`` of it, needs no server. Ranges recorded before a reset + point are fetched from the run the workflow was reset from. + + Raises :py:class:`temporalio.streams.StreamNotFoundError` for a range + the stream no longer holds. + """ + return temporalio.client.WorkflowHistory( + history.workflow_id, + history.events, + await _stream_slices(client, history), + ) + def config(self, *, active_config: bool = False) -> ReplayerConfig: """Config, as a dictionary, used to create this replayer. @@ -388,18 +421,24 @@ def on_eviction_hook( async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: async for history in histories: # The records a consuming workflow read are not in its - # history. Either fetch them from the stream service or - # report here what is missing, rather than let Core fail - # the first task on input it was never given. + # history unless they were captured into it. Otherwise + # fetch them from the stream service, or report here what + # is missing, rather than let Core fail the first task on + # input it was never given. stream_slices: list[bytes] = [] - if stream_client is not None: + if history.stream_slices: + stream_slices = [ + s.SerializeToString() for s in history.stream_slices + ] + elif stream_client is not None: try: - stream_slices = await _stream_slices(stream_client, history) + fetched = await _stream_slices(stream_client, history) except temporalio.streams.StreamNotFoundError as err: yield WorkflowReplayResult( history=history, replay_failure=err ) continue + stream_slices = [s.SerializeToString() for s in fetched] else: missing = _stream_records_missing(history) if missing is not None: @@ -482,7 +521,7 @@ def _eras( A reset copies the base run's history into the new run, so the ranges before the reset point were consumed from the base run's streams, and the - run they belong to is only named by the `WorkflowTaskFailed` event that + run they belong to is only named by the ``WorkflowTaskFailed`` event that marks the reset point, after them in the history. Ranges after the last reset point belong to the run itself, which that event names as well; a history with no reset point belongs to the run its start event names. This @@ -518,16 +557,18 @@ def _stream_records_missing(history: temporalio.client.WorkflowHistory) -> str | return ( f"workflow {history.workflow_id!r} consumed records from stream(s) " f"{', '.join(repr(s) for s in streams)} in {len(ranges)} task(s), and History " - "records only the offsets. Create the Replayer with stream_client= (a Client " - "connected to the server that still holds the streams) so the records can be " - "fetched from the stream service." + "records only the offsets. Either create the Replayer with stream_client= (a " + "Client connected to the server that still holds the streams) so the records " + "can be fetched from the stream service, or replay a history exported with " + "them: Replayer.fetch_stream_slices(client, history) attaches the records " + "while the stream is retained and WorkflowHistory.to_json() carries them." ) async def _stream_slices( client: temporalio.client.Client, history: temporalio.client.WorkflowHistory -) -> list[bytes]: - """Fetch the records the history's tasks consumed, as serialized ``StreamSlice`` messages. +) -> list[temporalio.api.stream.v1.StreamSlice]: + """Fetch the records the history's tasks consumed, as ``StreamSlice`` messages. The shape is the one the server puts on a poll response when it re-supplies a cache miss: one slice per recorded range, tagged with the completion that @@ -546,7 +587,7 @@ async def _stream_slices( # The handle that served each run's stream, so later ranges of the same # stream go straight to it. served_by: dict[tuple[str, str], Any] = {} - slices: list[bytes] = [] + slices: list[temporalio.api.stream.v1.StreamSlice] = [] for run_id, ranges in _eras(history): for event_id, consumed in ranges: stream_slice = temporalio.api.stream.v1.StreamSlice( @@ -567,7 +608,7 @@ async def _stream_slices( served_by[(run_id, consumed.stream_id)] = handle stream_slice.run_id = owner_run_id or run_id stream_slice.records.extend(records) - slices.append(stream_slice.SerializeToString()) + slices.append(stream_slice) return slices diff --git a/tests/worker/test_replayer.py b/tests/worker/test_replayer.py index 52fed7416..ddce04826 100644 --- a/tests/worker/test_replayer.py +++ b/tests/worker/test_replayer.py @@ -8,8 +8,12 @@ from pathlib import Path from typing import Any +import google.protobuf.json_format import pytest +import temporalio.api.common.v1 +import temporalio.api.history.v1 +import temporalio.api.stream.v1 import temporalio.worker._workflow_instance from temporalio import activity, workflow from temporalio.client import Client, WorkflowFailureError, WorkflowHistory @@ -121,6 +125,48 @@ async def test_replayer_workflow_complete(client: Client) -> None: ) +def test_workflow_history_json_carries_stream_slices_only_when_present() -> None: + """The JSON shape is unchanged without slices, and round-trips them when present.""" + with Path(__file__).with_name("test_replayer_complete_history.json").open("r") as f: + history = WorkflowHistory.from_json("fake", f.read()) + assert list(history.stream_slices) == [] + # Byte for byte what the history proto's JSON was before slices existed. + assert history.to_json() == google.protobuf.json_format.MessageToJson( + temporalio.api.history.v1.History(events=history.events) + ) + assert "streamSlices" not in history.to_json_dict() + + record = temporalio.api.stream.v1.StreamRecord( + body=temporalio.api.common.v1.Payload( + data=b'{"n": 1}', metadata={"encoding": b"json/plain"} + ), + topic="inputs", + kind=temporalio.api.stream.v1.StreamRecordKind.STREAM_RECORD_KIND_DATA, + producer_id="model", + attempt=1, + sequence=0, + ) + stream_slice = temporalio.api.stream.v1.StreamSlice( + stream_id="inputs", + run_id="run-1", + from_offset=0, + to_offset=1, + records=[record], + workflow_task_completed_event_id=4, + ) + bundle = WorkflowHistory("fake", history.events, [stream_slice]) + + text = bundle.to_json() + assert "streamSlices" in text + restored = WorkflowHistory.from_json("fake", text) + assert list(restored.stream_slices) == [stream_slice] + assert list(restored.events) == list(history.events) + # The dict form reads back the same, and a plain export stays plain. + from_dict = WorkflowHistory.from_json("fake", bundle.to_json_dict()) + assert list(from_dict.stream_slices) == [stream_slice] + assert WorkflowHistory("fake", restored.events).to_json() == history.to_json() + + @pytest.mark.skipif(sys.version_info < (3, 12), reason="Skipping for < 3.12") async def test_replayer_workflow_complete_json() -> None: # See `test_replayer_workflow_complete` for full skip description. From 207fbd39f44df3a38fa821a427a91c3646e9f95c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:10:56 -0700 Subject: [PATCH 579/831] Tested replay, queries, a reset and a codec on the native provider. These are the parts only a real server can show: what the replayer is given, what a cold or evicted worker does with a query, how a reset run's ranges are re-supplied, and that an encrypting codec covers both halves. --- tests/worker/test_workflow_stream_e2e.py | 590 ++++++++++++++++++++++- 1 file changed, 583 insertions(+), 7 deletions(-) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 1d974b401..652aae699 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -17,19 +17,25 @@ import asyncio import os import uuid +from collections.abc import Sequence +from datetime import timedelta from typing import Any import pytest from temporalio import workflow -from temporalio.api.common.v1 import Payload -from temporalio.api.enums.v1 import EventType -from temporalio.api.stream.v1 import StreamRecord -from temporalio.client import Client +from temporalio.api.common.v1 import Payload, WorkflowExecution +from temporalio.api.enums.v1 import EventType, WorkflowTaskFailedCause +from temporalio.api.history.v1 import HistoryEvent +from temporalio.api.stream.v1 import StreamRange, StreamRecord +from temporalio.api.workflowservice.v1 import ResetWorkflowExecutionRequest +from temporalio.client import Client, WorkflowExecutionStatus, WorkflowHistory from temporalio.client_stream import StreamClient -from temporalio.streams import RecordKind +from temporalio.converter import DataConverter, PayloadCodec +from temporalio.streams import RecordKind, StreamNotFoundError from temporalio.streams.providers.native import NativeStreams -from temporalio.worker import Worker +from temporalio.worker import Replayer, Worker +from temporalio.workflow import NondeterminismError from tests.streams.test_streams_conformance import take TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -69,11 +75,19 @@ async def _event_counts(client: Client, workflow_id: str) -> dict[Any, int]: class ContractLoop: """Reads ``inputs``, publishes a decision per value, reports control records.""" + def __init__(self) -> None: + self._trace: list[dict[str, Any]] = [] + + @workflow.query + def trace(self) -> list[dict[str, Any]]: + """What the loop has decided so far, for a query against replayed state.""" + return self._trace + @workflow.run async def run(self) -> list[dict[str, Any]]: inputs = workflow.stream_reader(INPUTS, result_type=dict) decisions = workflow.stream_writer(DECISIONS) - trace: list[dict[str, Any]] = [] + trace = self._trace async for record in inputs: if record.kind is RecordKind.SUPERSEDED: assert record.supersession is not None @@ -384,3 +398,565 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: ) finally: await streams.close() + + +class _EncryptingCodec(PayloadCodec): + """A codec whose output never contains its input. + + The SDK's own test codec marks payloads as encrypted but leaves the bytes + as they are, so it cannot show that a stored body is not plaintext. This + one keeps its metadata convention and runs a repeating-key XOR over the + serialized payload, which is enough for the plaintext markers the tests + look for to be absent from what the server stores. + """ + + _KEY = b"ai198" + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [ + Payload( + metadata={"encoding": b"binary/encrypted"}, + data=self._xor(p.SerializeToString()), + ) + for p in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + out: list[Payload] = [] + for p in payloads: + if p.metadata.get("encoding", b"") != b"binary/encrypted": + out.append(p) + continue + out.append(Payload.FromString(self._xor(p.data))) + return out + + def _xor(self, data: bytes) -> bytes: + key = self._KEY + return bytes(b ^ key[i % len(key)] for i, b in enumerate(data)) + + +async def _drive_contract_loop(client: Client) -> WorkflowHistory: + """Run ``ContractLoop`` to completion on ``client`` and return its history.""" + task_queue = "codec-tq-" + uuid.uuid4().hex[:8] + workflow_id = "codec-wf-" + uuid.uuid4().hex[:8] + async with Worker(client, task_queue=task_queue, workflows=[ContractLoop]): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + await producer.finish() + trace = await asyncio.wait_for(handle.result(), 60) + # The workflow decoded what the outside producer appended. + assert trace == [ + {"kind": "decision", "n": 1}, + {"kind": "decision", "n": 2}, + {"kind": "finish", "producer": "model"}, + ] + # The outside read decodes what the workflow published. + decisions = [ + (r.kind, r.value) + async for r in stream.read(topic=DECISIONS, result_type=dict) + ] + assert decisions == [ + (RecordKind.DATA, {"decided": 1}), + (RecordKind.DATA, {"decided": 2}), + (RecordKind.FINISH, None), + ] + return await handle.fetch_history() + + +async def test_a_codec_encodes_records_on_both_halves() -> None: + """A payload codec on the client covers the workflow's records and an outside producer's. + + The worker's payload visitor runs the codec over the bodies a workflow + publishes and receives; the outside half applies the client's codec to each + body it sends and reads. Read raw, without the codec, every stored body is + ciphertext, and each side still reads the other's records in the clear. + """ + plain = await _connect() + config = plain.config() + config["data_converter"] = DataConverter(payload_codec=_EncryptingCodec()) + provider = NativeStreams() + config["plugins"] = [provider] + client = Client(**config) + raw = StreamClient.connect(TARGET or "") + try: + history = await _drive_contract_loop(client) + run_id = history.run_id + + # What the server holds, read through the stream service with no codec. + inputs = await raw.workflow_stream( + history.workflow_id, INPUTS, owner_run_id=run_id + ).poll(from_offset=0, wait=False) + decisions = await raw.workflow_stream( + history.workflow_id, DECISIONS, owner_run_id=run_id + ).poll(from_offset=0, wait=False) + + # The outside producer's two records, stored encoded. + stored_inputs = [e.record for e in inputs.entries if e.record.HasField("body")] + assert len(stored_inputs) == 2 + for record in stored_inputs: + assert record.body.metadata["encoding"] == b"binary/encrypted" + assert b'"n"' not in record.body.data + # The workflow's two decisions, stored encoded by the worker's visitor. + stored_decisions = [ + e.record for e in decisions.entries if e.record.HasField("body") + ] + assert len(stored_decisions) == 2 + for record in stored_decisions: + assert record.body.metadata["encoding"] == b"binary/encrypted" + assert b"decided" not in record.body.data + finally: + await raw.close() + await provider.close() + + +def _consumed_ranges(history: WorkflowHistory) -> list[StreamRange]: + return [ + consumed + for event in history.events + if event.HasField("workflow_task_completed_event_attributes") + for consumed in event.workflow_task_completed_event_attributes.consumed_stream_ranges + ] + + +def _copy_of( + history: WorkflowHistory, workflow_id: str | None = None +) -> WorkflowHistory: + events: list[HistoryEvent] = [] + for event in history.events: + copied = HistoryEvent() + copied.CopyFrom(event) + events.append(copied) + return WorkflowHistory(workflow_id or history.workflow_id, events) + + +async def test_a_replayer_with_a_client_replays_a_consuming_workflow() -> None: + """Rule 2 through the ``Replayer``: the records come back from the stream service. + + History holds the offsets each task consumed and never the records, so the + replayer is given a client to the server that still holds the streams and + fetches every recorded range before pushing the history. The same delivery + path as a live cache miss then hands each range to the task that consumed + it, and the reissued publishes match their events. + """ + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + # Something was consumed, or the replay would prove nothing. + assert any(r.to_offset > r.from_offset for r in _consumed_ranges(history)) + + replayer = Replayer( + workflows=[ContractLoop], plugins=[provider], stream_client=client + ) + result = await replayer.replay_workflow(history) + assert result.replay_failure is None + finally: + await provider.close() + + +async def test_a_replayer_fails_a_tampered_range_as_nondeterministic() -> None: + """A history whose recorded ranges were changed replays on other input and fails. + + Every recorded range is emptied. The task that read two records and + published two decisions is replayed with nothing to read, so it issues no + publish, and Core finds the recorded publish event with no command for it. + """ + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + tampered = _copy_of(history) + for consumed in _consumed_ranges(tampered): + consumed.to_offset = consumed.from_offset + + replayer = Replayer( + workflows=[ContractLoop], plugins=[provider], stream_client=client + ) + with pytest.raises(NondeterminismError): + await replayer.replay_workflow(tampered) + finally: + await provider.close() + + +async def test_a_replayer_fails_loudly_when_the_stream_is_gone() -> None: + """A range the stream service no longer serves is a ``StreamNotFoundError``, not a replay.""" + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + # The same history under a workflow id that owns no stream: the + # records it consumed are nowhere to be fetched from. + gone = _copy_of(history, workflow_id="gone-wf-" + uuid.uuid4().hex[:8]) + + replayer = Replayer( + workflows=[ContractLoop], plugins=[provider], stream_client=client + ) + with pytest.raises(StreamNotFoundError, match="cannot be replayed"): + await replayer.replay_workflow(gone) + finally: + await provider.close() + + +async def test_a_replayer_without_a_client_says_what_it_needs() -> None: + """Without a stream client a consuming workflow's history is refused, with the remedy.""" + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + replayer = Replayer(workflows=[ContractLoop], plugins=[provider]) + + with pytest.raises(RuntimeError, match="stream_client=") as raised: + await replayer.replay_workflow(history) + assert f"'{INPUTS}'" in str(raised.value) + + # The aggregating call reports it per run rather than aborting. + async def histories(): + yield history + + results = await replayer.replay_workflows( + histories(), raise_on_replay_failure=False + ) + assert isinstance(results.replay_failures[history.run_id], RuntimeError) + finally: + await provider.close() + + +async def test_a_replayer_fetches_a_standalone_stream_by_its_id() -> None: + """A subscribed name that is no stream of the workflow's is a standalone stream's id. + + The server resolves a subscription the same way, an owned stream by that + name first, so the replayer has to look in both places to hand the replay + the records the workflow actually read. + """ + client = await _connect() + streams = StreamClient.connect(TARGET or "") + task_queue = "replay-src-tq-" + uuid.uuid4().hex[:8] + workflow_id = "replay-src-wf-" + uuid.uuid4().hex[:8] + stream_id = "replay-src-" + uuid.uuid4().hex[:8] + tokens = ["a1", "a2", "b1"] + try: + await streams.create(stream_id) + async with Worker( + client, task_queue=task_queue, workflows=[ConsumeAcrossTasks] + ): + handle = await client.start_workflow( + ConsumeAcrossTasks.run, + args=[stream_id, len(tokens)], + id=workflow_id, + task_queue=task_queue, + ) + await streams.get(stream_id).append(*[_record(t.encode()) for t in tokens]) + assert await asyncio.wait_for(handle.result(), timeout=60) == tokens + history = await handle.fetch_history() + + result = await Replayer( + workflows=[ConsumeAcrossTasks], stream_client=client + ).replay_workflow(history) + assert result.replay_failure is None + finally: + await streams.close() + + +TWO_DECISIONS = [{"kind": "decision", "n": 1}, {"kind": "decision", "n": 2}] + + +async def _feed_two(client: Client, workflow_id: str) -> Any: + """Append two inputs and wait until both decisions are out, so their tasks have completed.""" + stream = client.get_stream_handle(workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + await take(stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60) + return producer + + +async def test_a_query_against_a_cold_worker_answers_from_replayed_state() -> None: + """A query task built through matching carries the recorded ranges. + + With the cache off every task is a full replay. A query dispatched to a + worker that holds nothing has to rebuild the run from History, and the + records the run read are not in it, so the server attaches them to the + query task the way it does to a task after a cache miss. Without them the + replay would have nothing to read and the query would fail. + """ + provider = NativeStreams() + client = await _connect(provider) + task_queue = "query-cold-tq-" + uuid.uuid4().hex[:8] + workflow_id = "query-cold-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + producer = await _feed_two(client, workflow_id) + assert await handle.query(ContractLoop.trace) == TWO_DECISIONS + await producer.finish() + await asyncio.wait_for(handle.result(), 60) + finally: + await provider.close() + + +async def test_a_sticky_query_after_an_eviction_still_answers() -> None: + """A query sent to the sticky queue of a run the worker evicted still answers. + + The sticky task carries the history since the last task and no records, + which a worker that lost the run cannot use. Core sees that the history it + fetched itself records a consumed range it was sent no records for, and + lets the query go unanswered rather than answer it from the wrong state. + The server's sticky attempt then times out, stickiness is reset, and the + query is dispatched again on the normal queue, which carries the records. + The sticky timeout is shortened so the test does not wait the default out. + """ + provider = NativeStreams() + client = await _connect(provider) + task_queue = "query-sticky-tq-" + uuid.uuid4().hex[:8] + first_id = "query-sticky-a-" + uuid.uuid4().hex[:8] + second_id = "query-sticky-b-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ContractLoop], + max_cached_workflows=1, + sticky_queue_schedule_to_start_timeout=timedelta(seconds=2), + ): + first = await client.start_workflow( + ContractLoop.run, id=first_id, task_queue=task_queue + ) + first_producer = await _feed_two(client, first_id) + # A second run on a one-slot cache pushes the first out of it. + second = await client.start_workflow( + ContractLoop.run, id=second_id, task_queue=task_queue + ) + second_producer = await _feed_two(client, second_id) + + answer = await first.query( + ContractLoop.trace, rpc_timeout=timedelta(seconds=60) + ) + assert answer == TWO_DECISIONS + + await first_producer.finish() + await second_producer.finish() + await asyncio.wait_for(first.result(), 60) + await asyncio.wait_for(second.result(), 60) + finally: + await provider.close() + + +async def _collect( + client: Client, workflow_id: str, topic: str, run_id: str | None +) -> list[tuple[Any, str, int]]: + """Every record on ``topic`` as ``(value, run, offset)``, the run and offset from the cursor.""" + handle = client.get_stream_handle(workflow_id, run_id=run_id) + out: list[tuple[Any, str, int]] = [] + async for record in handle.read(topic=topic, result_type=dict): + # native:: + _, run, offset = record.cursor.token.split(":") + out.append((record.value, run, int(offset))) + return out + + +async def test_a_reset_run_is_followed_and_replayed() -> None: + """A run reset from a consuming one carries its subscriptions on, and readers follow. + + The reset re-runs the task named by the reset point, so the base run's + history is copied up to that task and the ranges recorded in the copy are + what the reset run replays, from the base run's streams. The inherited + ``inputs`` stream is the reset run's own from the inherited cursor on: it + starts empty at that offset, and the input the re-run task had consumed is + not delivered again, so the next input takes that offset. The + ``decisions`` stream, which the base run only published to, starts at zero. + A handle without a run id follows the base run into the reset run and starts + each stream at the floor it reports; a handle pinned to the base run ends + with it; the ``Replayer`` fetches each era of the reset run's history from + the run whose stream holds it. + """ + provider = NativeStreams() + client = await _connect(provider) + task_queue = "reset-tq-" + uuid.uuid4().hex[:8] + workflow_id = "reset-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker(client, task_queue=task_queue, workflows=[ContractLoop]): + base = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + base_run = base.result_run_id + assert base_run + producer = await _feed_two(client, workflow_id) + # A third input in a task of its own, which is the task the reset + # re-runs: its consumption is dropped with it. + await producer.append({"n": 3}) + base_stream = client.get_stream_handle(workflow_id, run_id=base_run) + await take( + base_stream.read(topic=DECISIONS, result_type=dict), 3, timeout=60 + ) + + # Reset to the completion of the last consuming task, while the base + # run waits for more input. + completion_id = 0 + async for event in client.get_workflow_handle( + workflow_id, run_id=base_run + ).fetch_history_events(): + if event.HasField("workflow_task_completed_event_attributes"): + completed = event.workflow_task_completed_event_attributes + if any( + r.to_offset > r.from_offset + for r in completed.consumed_stream_ranges + ): + completion_id = event.event_id + assert completion_id + reset = await client.workflow_service.reset_workflow_execution( + ResetWorkflowExecutionRequest( + namespace=client.namespace, + workflow_execution=WorkflowExecution( + workflow_id=workflow_id, run_id=base_run + ), + reason="re-run the last consuming task", + workflow_task_finish_event_id=completion_id, + request_id=uuid.uuid4().hex, + ) + ) + reset_run = reset.run_id + assert reset_run and reset_run != base_run + + # A fresh producer pins to the current run, the reset run, whose + # inherited inputs stream continues at the inherited offset. + continued = client.get_stream_handle(workflow_id).producer( + topic=INPUTS, producer_id="model2", attempt=1 + ) + await continued.append({"n": 4}) + await continued.finish() + trace = await asyncio.wait_for( + client.get_workflow_handle(workflow_id, run_id=reset_run).result(), + 60, + ) + # The first two decisions were replayed from the base run's stream; + # the third input went with the task the reset re-ran. + assert trace == TWO_DECISIONS + [ + {"kind": "decision", "n": 4}, + {"kind": "finish", "producer": "model2"}, + ] + + # The base run was terminated by the reset, and describe is the one + # place that names the run it was reset into. + described = await client.get_workflow_handle( + workflow_id, run_id=base_run + ).describe() + assert described.status == WorkflowExecutionStatus.TERMINATED + extended = described.raw_description.workflow_extended_info + assert extended.reset_run_id == reset_run + + # A reader pinned to the base run ends with the base run. + pinned = await asyncio.wait_for( + _collect(client, workflow_id, DECISIONS, base_run), 30 + ) + assert pinned == [ + ({"decided": 1}, base_run, 0), + ({"decided": 2}, base_run, 1), + ({"decided": 3}, base_run, 2), + ] + + # A chain-following reader crosses from the base run into the reset + # run on both topics, with no gap and no refusal: the published one + # restarts at zero, the inherited one continues at the floor. + decisions = await asyncio.wait_for( + _collect(client, workflow_id, DECISIONS, None), 30 + ) + assert decisions == [ + ({"decided": 1}, base_run, 0), + ({"decided": 2}, base_run, 1), + ({"decided": 3}, base_run, 2), + ({"decided": 4}, reset_run, 0), + (None, reset_run, 1), + ] + inputs = await asyncio.wait_for( + _collect(client, workflow_id, INPUTS, None), 30 + ) + assert inputs == [ + ({"n": 1}, base_run, 0), + ({"n": 2}, base_run, 1), + ({"n": 3}, base_run, 2), + ({"n": 4}, reset_run, 2), + (None, reset_run, 3), + ] + latest = await client.get_stream_handle(workflow_id).latest(topic=INPUTS) + assert latest.token == f"native:{reset_run}:3" + + # The reset run's history: the base run's events, the reset marker + # naming both runs, then its own. The replayer fetches the first era + # from the base run's stream and the rest from the reset run's. + history = await client.get_workflow_handle( + workflow_id, run_id=reset_run + ).fetch_history() + reset_cause = WorkflowTaskFailedCause.WORKFLOW_TASK_FAILED_CAUSE_RESET_WORKFLOW + markers = [ + (failed.base_run_id, failed.new_run_id) + for event in history.events + if event.HasField("workflow_task_failed_event_attributes") + for failed in [event.workflow_task_failed_event_attributes] + if failed.cause == reset_cause + ] + assert markers == [(base_run, reset_run)] + result = await Replayer( + workflows=[ContractLoop], plugins=[provider], stream_client=client + ).replay_workflow(history) + assert result.replay_failure is None + + # Exported with its records, the reset run's history replays with no + # server: the slices come from both runs' streams. + bundle = await Replayer.fetch_stream_slices(client, history) + assert {s.run_id for s in bundle.stream_slices if s.records} == { + base_run, + reset_run, + } + restored = WorkflowHistory.from_json(workflow_id, bundle.to_json()) + offline = await Replayer( + workflows=[ContractLoop], plugins=[provider] + ).replay_workflow(restored) + assert offline.replay_failure is None + finally: + await provider.close() + + +async def test_an_exported_history_replays_offline_with_its_records() -> None: + """A history exported with its stream records is the whole replay input. + + ``fetch_stream_slices`` captures the records while the stream is retained, + ``to_json`` writes them beside the events, ``from_json`` reads them back, + and a replayer with no client replays the result. A plain export carries + none and is refused with both remedies named. + """ + provider = NativeStreams() + client = await _connect(provider) + try: + history = await _drive_contract_loop(client) + assert "streamSlices" not in history.to_json() + + bundle = await Replayer.fetch_stream_slices(client, history) + assert list(bundle.events) == list(history.events) + assert any(s.records for s in bundle.stream_slices) + text = bundle.to_json() + assert "streamSlices" in text + restored = WorkflowHistory.from_json(history.workflow_id, text) + assert list(restored.stream_slices) == list(bundle.stream_slices) + assert list(restored.events) == list(history.events) + + offline = Replayer(workflows=[ContractLoop], plugins=[provider]) + result = await offline.replay_workflow(restored) + assert result.replay_failure is None + + # With the records stripped it is a plain export again. + stripped = WorkflowHistory(restored.workflow_id, restored.events) + with pytest.raises(RuntimeError, match="stream_client=") as raised: + await offline.replay_workflow(stripped) + assert "fetch_stream_slices" in str(raised.value) + finally: + await provider.close() From 7280f8dadcc202428e69fa6face88d3fdf48d0e3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:10:56 -0700 Subject: [PATCH 580/831] Added the changelog entry for server-side streams. The changelog checkpoint requires an entry for any user-facing change. --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c74bdf72a..8c07338e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,27 @@ to include examples, links to docs, or any other relevant information. is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: server-side streams. A workflow publishes to a stream it + owns with a command the server applies in its Workflow Task's commit, and + reads the ranges the server delivers on its Workflow Tasks, through + `temporalio.workflow.append_stream_records`, `subscribe_stream` and + `read_stream_records`. `temporalio.client_stream` and + `temporalio.contrib.server_streams` reach the same stream from outside a + workflow, and `temporalio.streams.providers.native.NativeStreams` puts it + behind the shared stream interface with one owned stream per topic. Requires + a server that serves the stream service. `Replayer(stream_client=)` replays a + workflow that read such a stream while the server still holds it: History + records only the offsets each task consumed, so the replayer fetches the + records from the stream service and hands them to the replay with the + history. A range the stream no longer holds fails the replay with + `StreamNotFoundError`. A handle without a run id follows a workflow reset as + it follows a continue-as-new, reading the reset run from the floor its stream + reports, and the replayer fetches the ranges recorded before a reset point + from the run the workflow was reset from. For offline replay, + `Replayer.fetch_stream_slices(client, history)` attaches the records to a + `WorkflowHistory` while the stream is retained, `to_json()` and `from_json()` + carry them as `streamSlices` beside the events, and a history that carries + them replays with no server. ### Changed From c27bfcf00e781b1ce5f79bdadf2200fdf22d5a3a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:11:59 -0700 Subject: [PATCH 581/831] Added the temporalio.streams interface on the external base. One stream interface a workflow reads, decides on and writes, with the provider registered once as a plugin on the client and every context asking for its stream the same way. This is the same surface as the interface chain, placed on Max's external base so the Redis provider above it has something to implement. --- .gitignore | 3 + CHANGELOG.md | 13 + streams_demo/agent_loop.py | 110 ++++++ streams_demo/provider_setup.py | 36 ++ streams_demo/run_demo.py | 172 ++++++++ temporalio/activity.py | 48 +++ temporalio/client/_client.py | 42 ++ temporalio/streams/__init__.py | 108 ++++++ temporalio/streams/_errors.py | 40 ++ temporalio/streams/_ids.py | 26 ++ temporalio/streams/_policy.py | 66 ++++ temporalio/streams/_provider.py | 285 ++++++++++++++ temporalio/streams/_record.py | 115 ++++++ temporalio/streams/_topic.py | 92 +++++ temporalio/streams/_wire.py | 181 +++++++++ temporalio/streams/providers/__init__.py | 87 +++++ temporalio/streams/providers/memory.py | 453 ++++++++++++++++++++++ temporalio/worker/_activity.py | 6 + temporalio/worker/_replayer.py | 7 +- temporalio/worker/_worker.py | 15 + temporalio/worker/_workflow.py | 46 +++ temporalio/worker/_workflow_instance.py | 19 + temporalio/workflow/__init__.py | 10 + temporalio/workflow/_context.py | 4 + temporalio/workflow/_streams.py | 279 +++++++++++++ tests/streams/__init__.py | 0 tests/streams/conftest.py | 8 + tests/streams/test_stream_accessors.py | 122 ++++++ tests/streams/test_stream_hooks.py | 139 +++++++ tests/streams/test_streams_conformance.py | 416 ++++++++++++++++++++ tests/streams/test_streams_workflow.py | 443 +++++++++++++++++++++ 31 files changed, 3390 insertions(+), 1 deletion(-) create mode 100644 streams_demo/agent_loop.py create mode 100644 streams_demo/provider_setup.py create mode 100644 streams_demo/run_demo.py create mode 100644 temporalio/streams/__init__.py create mode 100644 temporalio/streams/_errors.py create mode 100644 temporalio/streams/_ids.py create mode 100644 temporalio/streams/_policy.py create mode 100644 temporalio/streams/_provider.py create mode 100644 temporalio/streams/_record.py create mode 100644 temporalio/streams/_topic.py create mode 100644 temporalio/streams/_wire.py create mode 100644 temporalio/streams/providers/__init__.py create mode 100644 temporalio/streams/providers/memory.py create mode 100644 temporalio/workflow/_streams.py create mode 100644 tests/streams/__init__.py create mode 100644 tests/streams/conftest.py create mode 100644 tests/streams/test_stream_accessors.py create mode 100644 tests/streams/test_stream_hooks.py create mode 100644 tests/streams/test_streams_conformance.py create mode 100644 tests/streams/test_streams_workflow.py diff --git a/.gitignore b/.gitignore index 8cd439e05..42baf649d 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ temporalio/bridge/temporal_sdk_bridge* tags /.claude tmpclaude-* + +# Demo run output, written per provider; the numbers live in the doc. +streams_demo/results-*/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b2f8f941..6bbd734e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,19 @@ to include examples, links to docs, or any other relevant information. ### Added +- **Experimental**: `temporalio.streams` defines one stream interface a workflow + can read, decide on, and write. A provider is registered once as a plugin, + `Client.connect(plugins=[provider])`, and workers built from that client + inherit it; each context then asks for its stream the same way: + `workflow.stream_reader()` and `workflow.stream_writer()` in workflow code, + `activity.stream_handle()` in an activity, and `client.get_stream_handle()` + anywhere a client is held. A topic is a typed definition, + `streams.topic("inputs", Token)`, shared by workflow, activity and client + code; a plain string names a topic decided at runtime. The record on the wire + is `temporal.api.stream.v1.StreamRecord` on every provider. + `temporalio.streams.providers.memory.MemoryStreams` is the in-memory + reference provider the conformance tests run against. + - Added experimental External Workflow Streams in `temporalio.contrib.external_workflow_streams`. Workflow stream payloads are stored in a configured external backend instead of Temporal History, with a diff --git a/streams_demo/agent_loop.py b/streams_demo/agent_loop.py new file mode 100644 index 000000000..df5eac4d6 --- /dev/null +++ b/streams_demo/agent_loop.py @@ -0,0 +1,110 @@ +"""One agent loop, written once, run on every stream provider. + +Reads input, decides on it, publishes the decision, and runs an ordinary +Activity in the same workflow task; the Activity reports on its own +workflow's stream in turn. Also handles the two control records the contract +defines, so a retried producer and a finished topic are exercised rather than +described. + +This file is byte-identical in the server-side tree and the client-side tree. +Nothing in it names a provider: the workflow asks its runtime, the Activity +asks its context, and the process that runs them registered the provider once. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any + +from temporalio import activity, streams, workflow +from temporalio.streams import RecordKind + +# Defined once and shared by the workflow, the Activity and the demo's +# reader, so the type each topic carries is stated in one place. +DECISIONS = streams.topic("decisions", dict[str, Any]) +INPUTS = streams.topic("inputs", dict[str, Any]) +RECEIPTS = streams.topic("receipts", dict[str, Any]) + + +@activity.defn(name="RecordDecision") +async def record_decision(decision: dict[str, Any]) -> str: + """An ordinary command in the same task as the publish. + + Appends its receipt onto its own workflow's stream too, under the + Activity's own identity, so a reader outside sees the decision and the + record of it side by side. + """ + receipt = f"recorded:{decision['source']}:{decision['branch']}" + await activity.stream_handle().producer(topic=RECEIPTS).append({"receipt": receipt}) + return receipt + + +def decide(token: dict[str, Any]) -> dict[str, Any]: + """The decision the workflow is here to make.""" + if token["value"] % 2 == 0: + return { + "source": token["id"], + "branch": "even", + "computed": token["value"] * 10, + } + return {"source": token["id"], "branch": "odd", "computed": token["value"] + 100} + + +@workflow.defn(name="StreamContractDemo", sandboxed=False) +class AgentLoop: + """Read, decide, write, until the producer says it has finished.""" + + @workflow.run + async def run(self, limit: int) -> list[dict[str, Any]]: + """Decide on at most ``limit`` inputs, then return the trace.""" + inputs = workflow.stream_reader(INPUTS) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + accepted = 0 + try: + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + # A newer attempt of the same producer started writing. The + # decisions already published stand, so the workflow says so + # rather than pretending they can be withdrawn. + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "producer": record.producer_id, + "replaced": record.supersession.previous_attempt, + "attempt": record.supersession.attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + # The producer says it is done, which is what ends the loop. + # Counting decisions instead would leave the terminal record + # unread and let the workflow finish while its producer is + # still writing. + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decision = decide(record.value) + decisions.publish(decision) + receipt = await workflow.execute_activity( + record_decision, + decision, + activity_id=f"decision-{decision['source']}", + start_to_close_timeout=timedelta(seconds=10), + ) + trace.append( + {"kind": "decision", "value": decision, "receipt": receipt} + ) + accepted += 1 + if accepted >= limit: + # A bound so a stuck producer cannot run this forever. The + # terminal record above is the ordinary way out. + break + finally: + inputs.close() + decisions.finish() + return trace diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py new file mode 100644 index 000000000..2e4bcc350 --- /dev/null +++ b/streams_demo/provider_setup.py @@ -0,0 +1,36 @@ +"""Pick the provider for a demo run from the environment. + +``STREAMS_PROVIDER`` names a provider; this base tree carries only ``memory``, +and each provider branch adds its own name here. The demo needs a Temporal +server to run the workflow either way; ``TEMPORAL_ADDRESS`` points at it. +""" + +from __future__ import annotations + +import os + +from temporalio.streams.providers import ProviderPlugin +from temporalio.streams.providers.memory import MemoryStreams + +NAME = os.environ.get("STREAMS_PROVIDER", "memory") + +# The memory provider is not replay-safe, so its demo keeps the cache warm. +# Storage providers run with the smallest cache they support instead. +WORKFLOW_CACHE = int(os.environ.get("STREAMS_WORKFLOW_CACHE", "512")) + + +async def open() -> tuple[str, ProviderPlugin]: + """The server to connect to and the provider the worker and the client share.""" + if NAME != "memory": + raise SystemExit(f"this tree carries no stream provider named {NAME!r}") + return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), MemoryStreams() + + +async def close(provider: ProviderPlugin) -> None: + """Let go of whatever :func:`open` acquired. + + The memory provider holds no connection, so this is its ``close()`` and + nothing more. A provider branch that opens one closes it the same way, so + the demo's teardown reads the same on every provider. + """ + await provider.close() diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py new file mode 100644 index 000000000..e91bf2e31 --- /dev/null +++ b/streams_demo/run_demo.py @@ -0,0 +1,172 @@ +"""Run the shared agent loop against whichever provider is configured. + +Three cases, the same on every provider: + +- read, decide, publish and an ordinary Activity in the same workflow task, + with the smallest workflow cache the provider supports, so that as much of + the run as it allows is rebuilt rather than remembered; +- a producer whose second attempt supersedes its first, which the reader has + to report and the workflow has to act on; +- an outside reader following what the workflow published, and the receipts + the Activity appended on the workflow's stream from inside its own context. + +The provider is registered once, on the client; the worker inherits it and +every context asks for its stream without naming it. Byte-identical in every +tree. ``provider_setup`` is what differs, and it is the only import here that +names a provider. +""" + +from __future__ import annotations + +import asyncio +import json +import sys +import time +import uuid +from pathlib import Path +from typing import Any + +from temporalio.api.enums.v1 import EventType +from temporalio.client import Client +from temporalio.streams import RecordKind, StreamHandle +from temporalio.worker import Worker + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import provider_setup # noqa: E402 +from agent_loop import ( # noqa: E402 + DECISIONS, + INPUTS, + RECEIPTS, + AgentLoop, + record_decision, +) + +DECISION_LIMIT = 8 +EXPECTED_OUTPUT = 6 + + +async def collect_output(stream: StreamHandle, want: int) -> list[dict]: + """Read ``want`` decisions off the workflow's stream from outside it.""" + seen: list[dict] = [] + async for record in stream.read(topic=DECISIONS): + seen.append({"kind": record.kind.name, "value": record.value}) + if len(seen) >= want: + break + return seen + + +async def main() -> int: + """Run the demo once and write what happened next to this file.""" + out = Path(__file__).resolve().parent / f"results-{provider_setup.NAME}" + out.mkdir(exist_ok=True) + target, provider = await provider_setup.open() + client = await Client.connect(target, namespace="default", plugins=[provider]) + + uid = f"ai198-contract-{provider_setup.NAME}-" + uuid.uuid4().hex + record: dict[str, Any] = { + "provider": provider_setup.NAME, + "workflow_id": uid, + "target": target, + "max_cached_workflows": provider_setup.WORKFLOW_CACHE, + } + + async with Worker( + client, + task_queue=uid, + workflows=[AgentLoop], + activities=[record_decision], + max_cached_workflows=provider_setup.WORKFLOW_CACHE, + ): + handle = await client.start_workflow( + AgentLoop.run, DECISION_LIMIT, id=uid, task_queue=uid + ) + stream = client.get_stream_handle(uid) + output = asyncio.create_task(collect_output(stream, EXPECTED_OUTPUT)) + + # The first attempt writes two records and then stops, as a failed + # activity would. The second writes different inputs under the same + # logical producer, which is what the reader has to report. + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"id": "r1", "value": 1}, {"id": "r2", "value": 2}) + await asyncio.sleep(0.5) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"id": "r3", "value": 3}, {"id": "r4", "value": 4}) + await second.finish() + + # A failed Workflow Task is not an outcome. The server rejects a + # completion that raced newly buffered events, and the retry usually + # gets through, so reading the first failure as the result reports a + # working run as a broken one. Wait for a terminal event, then report + # the retries separately so they are neither the headline nor hidden. + deadline = time.monotonic() + 120 + # Taken from the enum rather than written out, because guessing these + # numbers is how a run that completed gets reported as terminated. + terminal = { + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: "completed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: "workflow_failed", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: "execution_timed_out", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: "canceled", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: "terminated", + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: "continued_as_new", + } + while time.monotonic() < deadline: + history = await handle.fetch_history() + reached = [ + terminal[e.event_type] + for e in history.events + if e.event_type in terminal + ] + if reached: + record["outcome"] = reached[-1] + if record["outcome"] == "completed": + record["trace"] = await handle.result() + break + await asyncio.sleep(0.1) + else: + record["outcome"] = "timed_out_waiting" + history = await handle.fetch_history() + + retried = [ + e + for e in history.events + if e.event_type == EventType.EVENT_TYPE_WORKFLOW_TASK_FAILED + ] + record["task_failures"] = [ + { + "event_id": e.event_id, + "cause": int(e.workflow_task_failed_event_attributes.cause), + "message": e.workflow_task_failed_event_attributes.failure.message, + } + for e in retried + ] + + try: + record["observed_output"] = await asyncio.wait_for(output, timeout=20) + except asyncio.TimeoutError: + output.cancel() + record["observed_output"] = "timed_out" + + async def receipts() -> list[Any]: + # Ends by itself once the workflow is closed and the tail served. + return [ + r.value + async for r in stream.read(topic=RECEIPTS) + if r.kind is RecordKind.DATA + ] + + try: + record["receipts"] = await asyncio.wait_for(receipts(), timeout=20) + except asyncio.TimeoutError: + record["receipts"] = "timed_out" + + history = await handle.fetch_history() + record["history_events"] = len(history.events) + (out / "history.json").write_text(history.to_json()) + await provider_setup.close(provider) + (out / "results.json").write_text(json.dumps(record, indent=2) + "\n") + print(json.dumps(record, indent=2)) + return 0 if record["outcome"] == "completed" else 1 + + +if __name__ == "__main__": + sys.exit(asyncio.run(main())) diff --git a/temporalio/activity.py b/temporalio/activity.py index 3f69bc17f..271f3e9e7 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -29,6 +29,7 @@ import temporalio.bridge.proto.activity_task import temporalio.common import temporalio.converter +import temporalio.streams from temporalio.converter._payload_converter import ( _TemporalTransferTypePayloadConverter, ) @@ -209,6 +210,7 @@ class _Context: runtime_metric_meter: temporalio.common.MetricMeter | None client: Client | None cancellation_details: _ActivityCancellationDetailsHolder + stream_provider: temporalio.streams.StreamProvider | None = None _logger_details: Mapping[str, Any] | None = None _payload_converter: temporalio.converter.PayloadConverter | None = None _metric_meter: temporalio.common.MetricMeter | None = None @@ -298,6 +300,52 @@ def client() -> Client: return client +def stream_handle( + workflow_id: str | None = None, *, run_id: str | None = None +) -> temporalio.streams.StreamHandle: + """Return a stream handle from the provider the worker was given. + + With no arguments the handle is on this activity's own workflow, pinned to + the run the activity belongs to, so a producer opened from it writes onto + that run's stream and a read follows that run. Name a ``workflow_id`` to + address another workflow; ``run_id`` then pins the handle to one run and + its absence follows the execution chain. See :py:mod:`temporalio.streams`. + + Like :py:func:`client`, this is only available in ``async def`` + activities. + + Returns: + :py:class:`temporalio.streams.StreamHandle` for use in the current + activity. + + Raises: + temporalio.streams.StreamUnsupportedError: The worker has no stream + provider. Register one with ``Client.connect(plugins=[provider])`` + or ``Worker(plugins=[provider])``. + RuntimeError: When the client is not available, or when the activity + has no workflow and no ``workflow_id`` was given. + ValueError: ``run_id`` was given without ``workflow_id``. + """ + context = _Context.current() + provider = context.stream_provider + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is configured on this worker; register one with " + "Client.connect(plugins=[provider]) or Worker(plugins=[provider])" + ) + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id needs a workflow_id") + info = context.info() + if info.workflow_id is None: + raise RuntimeError( + "this activity belongs to no workflow, so name the workflow_id to " + "address" + ) + workflow_id, run_id = info.workflow_id, info.workflow_run_id + return provider.get_stream_handle(client(), workflow_id, run_id=run_id) + + def in_activity() -> bool: """Whether the current code is inside an activity. diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 5acdfe476..79617dff4 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -28,6 +28,7 @@ import temporalio.converter import temporalio.runtime import temporalio.service +import temporalio.streams import temporalio.workflow from temporalio.service import ( ConnectConfig, @@ -157,6 +158,7 @@ async def connect( grpc_compression: GrpcCompression = GrpcCompression.GZIP, payload_limits: PayloadLimitsConfig = PayloadLimitsConfig(), header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> Self: """Connect to a Temporal server. @@ -222,6 +224,11 @@ async def connect( payload_limits: Warning thresholds for outbound payload/memo sizes. Over-threshold fields are logged but still sent. Set a threshold to 0 to disable it. header_codec_behavior: Encoding behavior for headers sent by the client. + stream_provider: Experimental. The stream provider + :py:meth:`get_stream_handle` opens handles from, see + :py:mod:`temporalio.streams`. A provider that is also a + :py:class:`Plugin` sets this itself when passed in ``plugins``, + and workers built from this client inherit it. """ connect_config = temporalio.service.ConnectConfig( target_host=target_host, @@ -258,6 +265,7 @@ def make_lambda( default_workflow_query_reject_condition=default_workflow_query_reject_condition, header_codec_behavior=header_codec_behavior, plugins=plugins, + stream_provider=stream_provider, ) def __init__( @@ -271,6 +279,7 @@ def __init__( default_workflow_query_reject_condition: None | (temporalio.common.QueryRejectCondition) = None, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, + stream_provider: temporalio.streams.StreamProvider | None = None, ): """Create a Temporal client from a service client. @@ -285,6 +294,7 @@ def __init__( interceptors=interceptors, default_workflow_query_reject_condition=default_workflow_query_reject_condition, header_codec_behavior=header_codec_behavior, + stream_provider=stream_provider, ) self._initial_config = config.copy() @@ -897,6 +907,36 @@ def get_workflow_handle( result_type=result_type, ) + def get_stream_handle( + self, workflow_id: str, *, run_id: str | None = None + ) -> temporalio.streams.StreamHandle: + """Get a handle on a workflow's stream from the provider registered on this client. + + Mirrors :py:meth:`get_workflow_handle`: without ``run_id`` the handle + follows the workflow's execution chain across continue-as-new, with + one it is pinned to that run. The provider is the one registered with + ``plugins=[provider]`` at :py:meth:`connect`, or passed as + ``stream_provider``. See :py:mod:`temporalio.streams`. + + Args: + workflow_id: Workflow ID whose stream to get a handle to. + run_id: Run ID to pin the handle to. + + Returns: + The stream handle. + + Raises: + temporalio.streams.StreamUnsupportedError: No stream provider is + registered on this client. + """ + provider = self._config.get("stream_provider") + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is registered on this client; connect with " + "plugins=[provider]" + ) + return provider.get_stream_handle(self, workflow_id, run_id=run_id) + def get_workflow_handle_for( self, workflow: ( @@ -3056,6 +3096,7 @@ class ClientConnectConfig(TypedDict, total=False): grpc_compression: GrpcCompression payload_limits: PayloadLimitsConfig header_codec_behavior: HeaderCodecBehavior + stream_provider: temporalio.streams.StreamProvider | None class ClientConfig(TypedDict, total=False): @@ -3070,3 +3111,4 @@ class ClientConfig(TypedDict, total=False): temporalio.common.QueryRejectCondition | None ] header_codec_behavior: Required[HeaderCodecBehavior] + stream_provider: temporalio.streams.StreamProvider | None diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py new file mode 100644 index 000000000..b23c95be4 --- /dev/null +++ b/temporalio/streams/__init__.py @@ -0,0 +1,108 @@ +"""Streams: a channel a workflow reads, decides on, and writes. + +.. warning:: + This module is experimental and may change in future versions. The + design is meant to be the shape that goes GA; the label is the SDK's + release convention, not a licence to break it. + +The contract, in five statements: + +1. **A workflow publishes only to topics of its own stream, and it publishes + transactionally.** :meth:`temporalio.workflow.StreamWriter.publish` + returns at once. The record is visible when the Workflow Task is accepted, + and never if the task fails, so no reader can see a decision the workflow + did not commit. +2. **Reading is an observation, and the SDK records it.** What + :class:`temporalio.workflow.StreamReader` handed to workflow code, + including the boundary where it found nothing, is committed with the + commands that reading produced. Recovery re-supplies the same records in + the same order. +3. **Anything that does I/O publishes on its own account.** An activity or an + outside process writes through a :class:`StreamProducer` with a producer + id, an attempt and a sequence, and its records are visible as soon as the + store accepts them. Those three let a reader tell a retry from a new + generation. +4. **A cursor is opaque and belongs to its provider.** Hand it back to resume + strictly after the record it names; :meth:`StreamHandle.latest` positions a + follower. Do not compare two cursors or do arithmetic on one. +5. **A workflow addresses its streams relative to itself, by topic.** A topic + can be written by the workflow and by outside producers, and read by the + workflow and by outside consumers; which of those happen is the + application's business. A topic is defined once with :func:`topic`, with + the type its records decode to, and that definition is shared by the + workflow, its activities and the backend; a plain string names a topic + decided at runtime. + +A provider is an object, registered once as a plugin: +``Client.connect(plugins=[provider])``; workers built from that client inherit +it, and ``Worker(plugins=[provider])`` or ``Replayer(plugins=[provider])`` +registers it on a worker alone. Each context then asks for its stream the +same way. Workflow code uses :func:`temporalio.workflow.stream_reader` and +:func:`temporalio.workflow.stream_writer`. An activity uses +:func:`temporalio.activity.stream_handle`, which is its own workflow pinned +to its run unless told otherwise. Any process holding a client uses +:meth:`temporalio.client.Client.get_stream_handle`, which mirrors +``get_workflow_handle``. The explicit form, +``provider.get_stream_handle(client, workflow_id)``, stays for a process that +talks to two stores. This module keeps the shared types, the errors and the +protocols a provider implements; nothing here that workflow code imports does +I/O. + +What the contract does not promise: that a :attr:`RecordKind.FINISH` record +means the writing activity succeeded, that a superseded attempt's records can +be withdrawn, or that a stream outlives the retention its provider is +configured for. Reading somebody else's stream is out of scope for this +release. + +The record on the wire is ``temporal.api.stream.v1.StreamRecord`` on every +provider, with the user's value in ``body`` as an ordinary payload, so a +reader in any language decodes the same bytes and a payload codec applies. +""" + +from __future__ import annotations + +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import ( + ReadSource, + StreamHandle, + StreamProducer, + StreamProvider, + WorkflowStreamProvider, + WriteSink, +) +from temporalio.streams._record import ( + BEGINNING, + Cursor, + RecordKind, + StreamRecord, + Supersession, +) +from temporalio.streams._topic import StreamTopic, resolve_topic, topic + +__all__ = [ + "BEGINNING", + "Cursor", + "ReadSource", + "RecordKind", + "StreamCursorError", + "StreamError", + "StreamHandle", + "StreamNotFoundError", + "StreamProducer", + "StreamProducerError", + "StreamProvider", + "StreamRecord", + "StreamTopic", + "StreamUnsupportedError", + "Supersession", + "WorkflowStreamProvider", + "WriteSink", + "resolve_topic", + "topic", +] diff --git a/temporalio/streams/_errors.py b/temporalio/streams/_errors.py new file mode 100644 index 000000000..f00bf1c3a --- /dev/null +++ b/temporalio/streams/_errors.py @@ -0,0 +1,40 @@ +"""The errors a stream call raises. + +Every stream condition is a :class:`StreamError`, so a caller can catch by +meaning the way it catches other :class:`temporalio.exceptions.TemporalError` +subclasses. Argument mistakes stay ``ValueError``. A provider's transport +failure surfaces as :class:`temporalio.service.RPCError`, never as the +transport's own exception type. +""" + +from __future__ import annotations + +import temporalio.exceptions + +__all__ = [ + "StreamCursorError", + "StreamError", + "StreamNotFoundError", + "StreamProducerError", + "StreamUnsupportedError", +] + + +class StreamError(temporalio.exceptions.TemporalError): + """Base for stream conditions.""" + + +class StreamNotFoundError(StreamError): + """The workflow, chain or topic does not exist or is past retention.""" + + +class StreamCursorError(StreamError): + """The cursor was minted by another provider or names a record no longer retained.""" + + +class StreamProducerError(StreamError): + """The producer attempt or sequence conflicts with what the store holds.""" + + +class StreamUnsupportedError(StreamError): + """This provider does not offer the requested capability.""" diff --git a/temporalio/streams/_ids.py b/temporalio/streams/_ids.py new file mode 100644 index 000000000..2a76dcf19 --- /dev/null +++ b/temporalio/streams/_ids.py @@ -0,0 +1,26 @@ +"""The store key a provider derives from a workflow id and a topic. + +A workflow id may contain any character, ``:`` included, so joining the pair +with a bare ``:`` is ambiguous: ``("a:b", "c")`` and ``("a", "b:c")`` would +land in one store. Every provider that keys a store by the pair goes through +:func:`topic_key`, so they all agree and none of them collides. +""" + +from __future__ import annotations + +__all__ = ["topic_key"] + + +def _escape(component: str) -> str: + # Percent first, so an escaped component cannot be mistaken for one that + # already contained the escape. + return component.replace("%", "%25").replace(":", "%3A") + + +def topic_key(workflow_id: str, topic: str) -> str: + """The store key for ``topic`` of ``workflow_id``'s stream. + + Both components are percent-encoded before joining, so the only bare ``:`` + in the result is the separator. + """ + return f"{_escape(workflow_id)}:{_escape(topic)}" diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py new file mode 100644 index 000000000..81949e4fc --- /dev/null +++ b/temporalio/streams/_policy.py @@ -0,0 +1,66 @@ +"""Turning a producer's newer attempt into something a reader can act on. + +An activity that streams half an answer and then fails leaves those records in +the stream. Its retry calls the model again and writes different words. No +provider can undo the first half, and a workflow that already acted on it has +committed that decision, so the honest thing is to tell the reader that a new +attempt began and let the application decide. + +This runs in the reader over records it already observed, so it costs no round +trip and replays without the provider being involved. +""" + +from __future__ import annotations + +from typing import Any + +from temporalio.streams._record import ( + Cursor, + RecordKind, + StreamRecord, + Supersession, +) + +__all__ = ["AttemptTracker"] + + +class AttemptTracker: + """Watches producer attempts on one subscription.""" + + def __init__(self) -> None: + """Start with no producer seen.""" + self._attempts: dict[str, int] = {} + + def note( + self, producer_id: str, attempt: int, *, topic: str, previous: Cursor + ) -> StreamRecord[Any] | None: + """A supersession record when this record starts a newer attempt. + + ``previous`` is the cursor of the last record delivered before the one + being noted, or the cursor the read started from. The synthesized + record carries it, so a consumer that checkpoints the supersession and + resumes after it is handed the new attempt's first record next rather + than skipping it. + + A producer that declares no attempt supersedes nothing, because there + is no generation to compare. That is the same answer as an unnumbered + record: the interface reports what it was told and invents nothing. + """ + if not producer_id or attempt <= 0: + return None + seen = self._attempts.get(producer_id, 0) + if attempt <= seen: + return None + self._attempts[producer_id] = attempt + if seen == 0: + return None + return StreamRecord( + kind=RecordKind.SUPERSEDED, + cursor=previous, + topic=topic, + producer_id=producer_id, + attempt=attempt, + supersession=Supersession( + producer_id=producer_id, previous_attempt=seen, attempt=attempt + ), + ) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py new file mode 100644 index 000000000..8c142080d --- /dev/null +++ b/temporalio/streams/_provider.py @@ -0,0 +1,285 @@ +"""What a provider implements, in two halves. + +:class:`WorkflowStreamProvider` runs on the workflow thread and must keep the +contract's first two rules: publishes commit with the Workflow Task, and reads +are recorded observations. Nothing it needs may do I/O. :class:`StreamProvider` +is the half a process holds: it makes the workflow half for a worker and hands +out :class:`StreamHandle` objects to code outside a workflow. A Python provider +usually implements both on one class; the split is what lets a language whose +workflow code is bundled separately name the two halves in two packages. + +A provider only moves ``temporal.api.stream.v1.StreamRecord`` protos. The +handles around it convert values, synthesize supersession and mint cursors, +and turn a :class:`temporalio.streams.StreamTopic` into the plain name the +provider sees, through :func:`temporalio.streams.resolve_topic`. +""" + +from __future__ import annotations + +from collections.abc import AsyncGenerator +from typing import TYPE_CHECKING, Any, Protocol, TypeVar, overload + +from temporalio.api.stream.v1 import StreamRecord as WireRecord +from temporalio.streams._record import BEGINNING, Cursor, StreamRecord +from temporalio.streams._topic import StreamTopic + +if TYPE_CHECKING: + from temporalio.client import Client + +__all__ = [ + "ReadSource", + "StreamHandle", + "StreamProducer", + "StreamProvider", + "WorkflowStreamProvider", + "WriteSink", +] + +T = TypeVar("T") +T_contra = TypeVar("T_contra", contravariant=True) + + +class StreamProducer(Protocol[T_contra]): + """Appends to one topic from outside workflow code. + + Every append is visible as soon as the store accepts it, and carries the + producer id, attempt and sequence that let a reader tell a retried append + from a new generation. The type parameter is the topic definition's + value type; a producer on a string-named topic takes any value. + """ + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + ... + + @property + def attempt(self) -> int: + """The generation this producer is writing, or 0 when undeclared.""" + ... + + async def append(self, *values: T_contra) -> Cursor | None: + """Append ``values`` and return the cursor of the last record as the store holds it. + + A repeat of an earlier append (same producer, attempt and sequence) is + written once and returns the position the original landed at. An + empty call writes nothing and returns the same value a repeat would: + the position of this producer's last record, or ``BEGINNING`` when it + has written none. ``None`` means one thing only: this provider learns + positions at read time, and a caller that needs one positions itself + with :meth:`StreamHandle.latest`. + + Raises: + StreamProducerError: The attempt or sequence conflicts with what + the store holds. + """ + ... + + async def finish(self) -> None: + """Write ``FINISH`` for this producer on this topic. + + Says this producer has nothing more to send. It does not say the + activity behind it succeeded, and it does not end anyone's read. + """ + ... + + +class StreamHandle(Protocol): + """One workflow's stream, addressed by topic, from outside workflow code. + + A handle follows the workflow's execution chain unless it was opened with + a ``run_id``, in which case it is pinned to that run. A topic is a + :class:`temporalio.streams.StreamTopic` definition, which carries the + record type, or a plain string with ``result_type=`` for a name decided + at runtime. A transport failure surfaces as + :class:`temporalio.service.RPCError`, never as the transport's own + exception type. + """ + + @overload + def read( + self, *, topic: StreamTopic[T], after: Cursor = ... + ) -> AsyncGenerator[StreamRecord[T], None]: ... + + @overload + def read( + self, *, topic: str, after: Cursor = ..., result_type: type[T] + ) -> AsyncGenerator[StreamRecord[T], None]: ... + + @overload + def read( + self, *, topic: str, after: Cursor = ..., result_type: None = None + ) -> AsyncGenerator[StreamRecord[Any], None]: ... + + def read( + self, + *, + topic: str | StreamTopic[Any], + after: Cursor = BEGINNING, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield the records on ``topic`` after ``after`` as they arrive. + + ``BEGINNING`` yields everything the topic retains. Any other cursor + came from a record a reader saw, and reading resumes just past it, so + a reader that stores the last cursor it handled and hands it back + sees every record exactly once. The read ends when the owning + execution, or its chain, is closed and every retained record after + ``after`` has been delivered; until then it waits. The result is a + generator, so a caller that stops early can ``aclose()`` it and + release whatever the provider parked against the store. + + Raises: + ValueError: ``result_type`` was passed with a topic definition, + or the topic is empty. + StreamCursorError: ``after`` came from another provider or names + a record no longer retained. Raised by this call, not by the + first iteration. + StreamNotFoundError: The workflow or topic does not exist or is + past retention. + """ + ... + + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + """The cursor of the newest record on ``topic``, or ``BEGINNING`` when empty. + + For a reader that wants to follow from now: ``read(after=latest())`` + yields only what is published after this call returned, which is how + a client that is about to send a message positions itself before + sending, without the workflow having to report a position. + """ + ... + + @overload + def producer( + self, *, topic: StreamTopic[T], producer_id: str = ..., attempt: int = ... + ) -> StreamProducer[T]: ... + + @overload + def producer( + self, *, topic: str, producer_id: str = ..., attempt: int = ... + ) -> StreamProducer[Any]: ... + + def producer( + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> StreamProducer[Any]: + """A producer on ``topic``. + + Inside an activity, leave ``producer_id`` and ``attempt`` unset: the + activity's own id and attempt are the right answer, and they are what + let a reader tell a retry from a new generation. Outside one, + ``producer_id`` is required and an empty one raises ``ValueError``. + """ + ... + + +class ReadSource(Protocol): + """One subscription, as a provider supplies it to the workflow thread.""" + + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + """The next records with their positions, waiting until there is at least one. + + A batch rather than a record because delivery boundaries are what a + provider actually records, and flattening them here keeps that out of + the contract. A record that cannot be parsed into a ``StreamRecord`` + proto is the provider's to skip. + + Raises: + StopAsyncIteration: This subscription has ended. + """ + ... + + def close(self) -> None: + """End the subscription. Idempotent.""" + ... + + +class WriteSink(Protocol): + """One topic of the running workflow's stream, as a provider binds it.""" + + def publish(self, record: WireRecord) -> None: + """Take one record into this Workflow Task's output. + + Synchronous: there is nothing to wait for inside a task, because the + task is the visibility boundary. The provider commits what it buffered + when the task completes and drops it when the task fails. A record + the provider cannot stage raises :class:`temporalio.streams.StreamError` + and fails the task, loudly. + """ + ... + + +class WorkflowStreamProvider(Protocol): + """The half of a provider that runs on the workflow thread. + + Imports nothing that does I/O. The worker creates one per workflow + instance through :meth:`StreamProvider.workflow_provider`, so state kept + here dies with the instance the way handlers do. It sees topics by name; + the definitions are resolved before it is called. + """ + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + """Subscribe the running workflow to ``topic`` of its own stream. + + Raises: + StreamCursorError: ``after`` was minted by another provider. + """ + ... + + def open_writer(self, topic: str) -> WriteSink: + """Bind ``topic`` of the running workflow's stream for publishing.""" + ... + + def on_workflow_start(self) -> None: + """Called before the workflow function runs. + + A provider that serves outside readers through handlers on the + workflow registers them here, before the first task completes. + """ + ... + + async def on_workflow_finish(self) -> None: + """Called after the workflow function returns, raises or continues as new. + + A provider that parked an outside reader against the run lets go + here, so the workflow can close. + """ + ... + + +class StreamProvider(Protocol): + """What a store ships. Also a :class:`temporalio.worker.Plugin` when it serves workers. + + Construct one, pass it to ``Client.connect(plugins=[provider])`` so the + client and the workers built from it carry it, or to + ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` for a + worker alone, and open handles from it anywhere else. Nothing is global: + two workers in one process may hold two providers. + """ + + def workflow_provider(self) -> WorkflowStreamProvider: + """The half that serves one workflow instance on its thread.""" + ... + + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> StreamHandle: + """A handle on ``workflow_id``'s stream. + + Without ``run_id`` it follows the execution chain, so a consumer keeps + reading across continue-as-new; with one it is pinned to that run. + """ + ... + + async def close(self) -> None: + """Release what this provider holds for the process. + + A provider that keeps a connection pool or an HTTP session open needs + a moment where the process says it is done; this is it. A provider + that holds nothing returns at once. + """ + ... diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py new file mode 100644 index 000000000..fef63e51c --- /dev/null +++ b/temporalio/streams/_record.py @@ -0,0 +1,115 @@ +"""The value types the stream contract is expressed in. + +Nothing here touches Temporal or a provider, so every provider shares it +unchanged. +""" + +from __future__ import annotations + +import enum +from dataclasses import dataclass +from typing import Generic, TypeVar + +__all__ = [ + "BEGINNING", + "Cursor", + "RecordKind", + "StreamRecord", + "Supersession", +] + +T = TypeVar("T") + + +@enum.unique +class RecordKind(enum.IntEnum): + """What a record is. + + Mirrors ``temporal.api.stream.v1.StreamRecordKind`` value for value, so a + record's kind crosses the wire as the integer the proto holds. + """ + + UNSPECIFIED = 0 + """The proto's zero value. + + A stored record whose writer set no kind is read as :attr:`DATA`, as the + proto defines it, so a reader never sees this kind on a record. + """ + + DATA = 1 + """Carries a value published by a workflow or a producer.""" + + FINISH = 2 + """The producer named in ``producer_id`` will write nothing more on this topic. + + An empty ``producer_id`` names the owning workflow. It does not end a + read, which ends when the owning execution or its chain is closed and the + retained tail has been delivered, and it says nothing about the producer's + outcome: an activity can still time out after writing it. + """ + + SUPERSEDED = 3 + """A later attempt of the same producer started writing. + + Synthesized by the reader from what it observed, never stored, so every + provider delivers it identically and replay reproduces it without the + provider's help. Its cursor is the position before the new attempt's + first record, so resuming after it delivers that record next. + """ + + +@dataclass(frozen=True) +class Cursor: + """A position in a stream, ordered by its provider rather than by value. + + Opaque on purpose. One provider numbers records with integers and another + with a millisecond-and-sequence pair, so comparing tokens here would be + right for one and wrong for the other. Hand a cursor back to resume after + the record it names; nothing here advances one. The token starts with the + name of the provider that minted it, and a provider refuses a token from + another with :class:`temporalio.streams.StreamCursorError`. + """ + + token: str + + def __str__(self) -> str: + """The provider's position token.""" + return self.token + + +BEGINNING = Cursor("") +"""Read from the oldest record the stream still retains.""" + + +@dataclass(frozen=True) +class Supersession: + """What a :attr:`RecordKind.SUPERSEDED` record reports.""" + + producer_id: str + previous_attempt: int + attempt: int + + +@dataclass(frozen=True) +class StreamRecord(Generic[T]): + """One record as a reader sees it. + + ``value`` is set on a :attr:`RecordKind.DATA` record and ``supersession`` + on a :attr:`RecordKind.SUPERSEDED` one; every other kind carries neither. + Each field means one thing, so a consumer narrows on ``kind`` and reads + the field that kind promises. + """ + + kind: RecordKind + cursor: Cursor + topic: str + producer_id: str = "" + """Who wrote it, or empty when the owning workflow wrote it itself.""" + attempt: int = 0 + """The producer's attempt, or 0 when it did not declare one.""" + sequence: int = -1 + """The producer's position within its attempt, or -1 when unnumbered.""" + value: T | None = None + """The published value. Set on ``DATA`` only.""" + supersession: Supersession | None = None + """The attempt change being reported. Set on ``SUPERSEDED`` only.""" diff --git a/temporalio/streams/_topic.py b/temporalio/streams/_topic.py new file mode 100644 index 000000000..173291fad --- /dev/null +++ b/temporalio/streams/_topic.py @@ -0,0 +1,92 @@ +"""Typed topic definitions. + +Temporal's idiom is to define once and refer by reference: signals, queries +and updates are decorated methods, activities and workflows are functions, +Nexus operations are typed definitions. A topic follows the same rule. It is +defined once, at module level, with the type its records decode to, and the +workflow, its activities and the backend all refer to that one definition. A +plain string names a topic too, the way a string names a signal chosen at +runtime; then the decode hint travels as ``result_type=`` on each call. + +The wire does not change: a topic is a string on the proto and in every +store, and :attr:`temporalio.streams.StreamRecord.topic` is that string. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Generic, TypeVar, overload + +__all__ = ["StreamTopic", "resolve_topic", "topic"] + +T = TypeVar("T") + + +@dataclass(frozen=True) +class StreamTopic(Generic[T]): + """A topic of a workflow's stream, with the type its records decode to. + + Made with :func:`topic`. Hand it to :func:`temporalio.workflow.stream_reader`, + :func:`temporalio.workflow.stream_writer`, and to a handle's ``read``, + ``latest`` and ``producer``, and the record and value types follow from + it; ``result_type=`` is not passed alongside a definition. + """ + + name: str + result_type: type[T] | None = None + """The type records decode to, or ``None`` for the converter's default.""" + + +@overload +def topic(name: str, result_type: type[T]) -> StreamTopic[T]: ... + + +@overload +def topic(name: str, result_type: None = None) -> StreamTopic[Any]: ... + + +def topic(name: str, result_type: type | None = None) -> StreamTopic[Any]: + """Define a topic of a workflow's stream. + + Define it once, at module level, and share it: the workflow reads or + publishes it, an activity or a backend produces onto it or reads it, and + the type it carries is inferred wherever it is used. Use a plain string + instead only when the name is decided at runtime. + + Args: + name: The topic's name, as it appears on every record. + result_type: The type records on this topic decode to. Without one, + the payload converter's default applies. + + Raises: + ValueError: ``name`` is empty. + """ + if not name: + raise ValueError("topic name must not be empty") + return StreamTopic(name, result_type) + + +def resolve_topic( + topic: str | StreamTopic[Any], result_type: type | None = None +) -> tuple[str, type | None]: + """The name and decode hint a call means, from either form of topic. + + Providers call this once at the top of ``read``, ``latest`` and + ``producer``, so a definition and a string are the same to the store. + + Raises: + ValueError: A definition was given together with ``result_type``, + which would name two types for one topic, or the name is empty. + """ + if isinstance(topic, StreamTopic): + if result_type is not None: + raise ValueError( + f"topic {topic.name!r} already carries its type; do not pass " + "result_type= with a definition" + ) + name, result_type = topic.name, topic.result_type + else: + name = topic + if not name: + raise ValueError("topic must not be empty") + return name, result_type diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py new file mode 100644 index 000000000..52299f44e --- /dev/null +++ b/temporalio/streams/_wire.py @@ -0,0 +1,181 @@ +"""How a record crosses a provider: the proto is the record. + +``temporal.api.stream.v1.StreamRecord`` is the wire format on every provider. +A store that keeps bytes keeps ``SerializeToString()`` of it, the native +server stores the proto it is handed, and a reader in any language parses the +same bytes. ``body`` is the user's payload, produced and consumed through the +payload converter, so a codec applies to it like any other payload and a +pre-encoded :class:`temporalio.common.RawValue` passes through untouched. + +Cursors are self-describing: a token starts with the name of the provider that +minted it, so a provider can refuse a foreign one at the call rather than +misreading it deep in a generator. +""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any + +import temporalio.converter +from temporalio.api.stream.v1 import StreamRecord as WireRecord +from temporalio.api.stream.v1 import StreamRecordKind +from temporalio.streams._errors import StreamCursorError +from temporalio.streams._policy import AttemptTracker +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord + +__all__ = [ + "RecordDecoder", + "WireRecord", + "cursor_position", + "from_wire", + "mint_cursor", + "producer_identity", + "to_wire", +] + + +def to_wire( + converter: temporalio.converter.PayloadConverter, + *, + topic: str, + kind: RecordKind, + value: Any = None, + producer_id: str = "", + attempt: int = 0, + sequence: int = -1, +) -> WireRecord: + """Build the record a provider stores or ships. + + Only a ``DATA`` record carries a body; the converter encodes ``value`` + into it, which is where a pre-encoded ``RawValue`` passes through. + """ + record = WireRecord( + topic=topic, + kind=StreamRecordKind.ValueType(int(kind)), + producer_id=producer_id, + attempt=attempt, + sequence=sequence, + ) + if kind is RecordKind.DATA: + record.body.CopyFrom(converter.to_payloads([value])[0]) + return record + + +def from_wire( + converter: temporalio.converter.PayloadConverter, + cursor: Cursor, + wire: WireRecord, + result_type: type | None, +) -> StreamRecord[Any]: + """Turn a stored record into the record a reader yields. + + Raises: + ValueError: The kind is one no store may hold, such as a synthesized + ``SUPERSEDED`` or a value this SDK does not know. + """ + kind = RecordKind(wire.kind) + if kind is RecordKind.SUPERSEDED: + raise ValueError("a SUPERSEDED record is synthesized by readers, never stored") + if kind is RecordKind.UNSPECIFIED: + # The proto defines an unset kind as DATA, so every reader agrees. + kind = RecordKind.DATA + value: Any = None + if kind is RecordKind.DATA and wire.HasField("body"): + hints = [result_type] if result_type is not None else None + value = converter.from_payloads([wire.body], hints)[0] + return StreamRecord( + kind=kind, + cursor=cursor, + topic=wire.topic, + producer_id=wire.producer_id, + attempt=wire.attempt, + sequence=wire.sequence, + value=value, + ) + + +class RecordDecoder: + """Turns the records a provider hands over into the records a reader yields. + + One per read. It synthesizes supersession from the attempts it observes, + positions each synthesized record at the cursor before the record that + triggered it, and skips a record it cannot decode with a warning rather + than raising, so a poisoned record cannot pin a workflow on every retry + while an outside reader of the same stream moves past it. + """ + + def __init__( + self, + converter: temporalio.converter.PayloadConverter, + result_type: type | None, + *, + after: Cursor, + warn: Callable[[str], None], + ) -> None: + """Decode with ``converter`` into ``result_type``, resuming after ``after``.""" + self._converter = converter + self._result_type = result_type + self._previous = after + self._warn = warn + self._attempts = AttemptTracker() + + def decode(self, cursor: Cursor, wire: WireRecord) -> list[StreamRecord[Any]]: + """The records to yield for one stored record, in order.""" + try: + record = from_wire(self._converter, cursor, wire, self._result_type) + except Exception as error: + self._warn(f"skipping stream record at {cursor}: {error}") + # The skipped record still holds its position, so a resume after + # it moves on rather than tripping over it again. + self._previous = cursor + return [] + out: list[StreamRecord[Any]] = [] + superseded = self._attempts.note( + wire.producer_id, wire.attempt, topic=wire.topic, previous=self._previous + ) + if superseded is not None: + out.append(superseded) + out.append(record) + self._previous = cursor + return out + + +def mint_cursor(provider: str, position: str) -> Cursor: + """A cursor that names ``position`` and the provider that understands it.""" + return Cursor(f"{provider}:{position}") + + +def cursor_position(cursor: Cursor, *, provider: str) -> str | None: + """The position inside a cursor ``provider`` minted, or ``None`` for BEGINNING. + + Raises: + StreamCursorError: The cursor came from another provider. + """ + if cursor == BEGINNING: + return None + prefix = f"{provider}:" + if not cursor.token.startswith(prefix): + raise StreamCursorError( + f"cursor {cursor.token!r} was not minted by the {provider} stream provider" + ) + return cursor.token[len(prefix) :] + + +def producer_identity(producer_id: str, attempt: int) -> tuple[str, int]: + """Resolve who a producer is, defaulting to the running activity. + + Imported lazily so the module workflow code imports carries no activity + machinery; the default only means anything inside an activity anyway. + """ + if producer_id: + return producer_id, attempt + import temporalio.activity + + if not temporalio.activity.in_activity(): + raise ValueError( + "producer_id is required outside an activity; inside one it defaults " + "to the activity's id and attempt" + ) + info = temporalio.activity.info() + return info.activity_id, attempt or info.attempt diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py new file mode 100644 index 000000000..7aaa5a9b1 --- /dev/null +++ b/temporalio/streams/providers/__init__.py @@ -0,0 +1,87 @@ +"""Stream providers, one module each. + +A provider that serves workers is a :class:`temporalio.worker.Plugin`, and +one registered on a client is a :class:`temporalio.client.Plugin` too. +:class:`ProviderPlugin` is the plugin half the providers in this tree share: +it hands the provider to the client, the worker and the replayer as their +``stream_provider`` and leaves their execution alone, so +``Client.connect(plugins=[provider])`` registers it once and every worker +built from that client inherits it. A provider that holds connections closes +them through its own ``close()``, not with the worker, because the same +provider serves handles outside any worker. +""" + +from __future__ import annotations + +from collections.abc import AsyncIterator, Awaitable, Callable +from contextlib import AbstractAsyncContextManager + +import temporalio.client +import temporalio.worker +from temporalio.client import ClientConfig, WorkflowHistory +from temporalio.service import ConnectConfig, ServiceClient +from temporalio.streams._provider import StreamProvider +from temporalio.worker import ( + Replayer, + ReplayerConfig, + Worker, + WorkerConfig, + WorkflowReplayResult, +) + +__all__ = ["ProviderPlugin"] + + +class ProviderPlugin( + StreamProvider, temporalio.client.Plugin, temporalio.worker.Plugin +): + """The plugin every provider in this tree is built on. + + Subclasses implement :class:`temporalio.streams.StreamProvider`; this + class supplies the plugin hooks, so ``Client.connect(plugins=[provider])``, + ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` reach + the provider through their ``stream_provider`` option. A worker built from + a client that carries the plugin inherits it, and the worker installs the + interceptor that calls the workflow half's lifecycle hooks. + """ + + def configure_client(self, config: ClientConfig) -> ClientConfig: + """Set this provider as the client's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def connect_service_client( + self, + config: ConnectConfig, + next: Callable[[ConnectConfig], Awaitable[ServiceClient]], + ) -> ServiceClient: + """Connect unchanged.""" + return await next(config) + + def configure_worker(self, config: WorkerConfig) -> WorkerConfig: + """Set this provider as the worker's ``stream_provider``.""" + config["stream_provider"] = self + return config + + def configure_replayer(self, config: ReplayerConfig) -> ReplayerConfig: + """Set this provider as the replayer's ``stream_provider``.""" + config["stream_provider"] = self + return config + + async def run_worker( + self, worker: Worker, next: Callable[[Worker], Awaitable[None]] + ) -> None: + """Run the worker unchanged.""" + await next(worker) + + def run_replayer( + self, + replayer: Replayer, + histories: AsyncIterator[WorkflowHistory], + next: Callable[ + [Replayer, AsyncIterator[WorkflowHistory]], + AbstractAsyncContextManager[AsyncIterator[WorkflowReplayResult]], + ], + ) -> AbstractAsyncContextManager[AsyncIterator[WorkflowReplayResult]]: + """Run the replayer unchanged.""" + return next(replayer, histories) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py new file mode 100644 index 000000000..f175570a8 --- /dev/null +++ b/temporalio/streams/providers/memory.py @@ -0,0 +1,453 @@ +"""The in-process reference provider. + +Exists so the conformance suite can exercise the whole surface without a +store, and to document in one file what a provider owes. Its limits, stated +so nobody mistakes it for evidence: + +- It is not replay-safe. Workflow-side state lives in plain process memory, + so run it with a warm workflow cache and do not use it to demonstrate + recovery. +- A workflow's publish becomes visible at ``publish`` time rather than at + task acceptance, and a failed task's records stay, so it only approximates + rule 1 of the contract. +- Topics are keyed by workflow id rather than by run, so a successor run's + reader from ``BEGINNING`` sees the chain's records. A ``run_id`` on a + handle only decides which run's close ends a read. +- It learns that a workflow closed by describing it, so a handle opened + without a client reads until the caller closes it. + +The outside surface (producer identity, retry deduplication, positions, +supersession, cursors) is faithful, which is what the conformance tests lean +on. One list per topic; a topic is written by the workflow and by outside +producers alike and read from either side. +""" + +from __future__ import annotations + +import asyncio +import logging +from collections.abc import AsyncGenerator +from datetime import timedelta +from typing import Any, Generic, TypeVar + +from google.protobuf.message import DecodeError + +import temporalio.converter +from temporalio import workflow +from temporalio.client import Client, WorkflowExecutionStatus +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import StreamCursorError +from temporalio.streams._ids import topic_key +from temporalio.streams._provider import ReadSource, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin + +__all__ = ["MemoryProducer", "MemoryStreamHandle", "MemoryStreams"] + +_PROVIDER = "memory" + +T = TypeVar("T") + +logger = logging.getLogger(__name__) + + +def _wake(future: asyncio.Future[None]) -> None: + if not future.done(): + future.set_result(None) + + +class _Topic: + """One topic's records, and the waiters parked on its tail.""" + + def __init__(self) -> None: + self.records: list[bytes] = [] + # Dedupe identity is (producer#attempt, first sequence of the append), + # the same pair the storage providers use, mapped to where the batch + # landed so a repeat can answer with the original position. + self.seen: dict[tuple[str, int], tuple[int, int]] = {} + # Each waiter is parked with the loop it belongs to. A workflow's + # publish runs on the workflow thread, and waking a foreign loop's + # future from there needs call_soon_threadsafe or the loop stays + # blocked in select until unrelated I/O happens to wake it. + self._waiters: list[tuple[asyncio.AbstractEventLoop, asyncio.Future[None]]] = [] + + def append( + self, + wires: list[WireRecord], + *, + writer: str | None = None, + sequence: int = 0, + ) -> tuple[int, int]: + """Store ``wires`` and return where they landed as ``(first offset, count)``. + + With a ``writer``, a repeat of ``(writer, sequence)`` stores nothing + and returns where the original landed. + """ + key = (writer or "", sequence) + if writer is not None and key in self.seen: + return self.seen[key] + first = len(self.records) + self.records.extend(wire.SerializeToString() for wire in wires) + if writer is not None: + self.seen[key] = (first, len(wires)) + waiters, self._waiters = self._waiters, [] + for loop, future in waiters: + loop.call_soon_threadsafe(_wake, future) + return first, len(wires) + + async def wait_past(self, offset: int, timeout: float | None) -> None: + """Wait until a record exists at ``offset``, or ``timeout`` passes.""" + if len(self.records) > offset: + return + loop = asyncio.get_running_loop() + future: asyncio.Future[None] = loop.create_future() + self._waiters.append((loop, future)) + try: + await asyncio.wait_for(future, timeout) + except asyncio.TimeoutError: + self._waiters = [w for w in self._waiters if w[1] is not future] + + +def _parse(cursor: Cursor, raw: bytes, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(raw) + except DecodeError as error: + # Same answer as an undecodable body: skip and say so, so one bad + # record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None + + +class _MemReadSource: + """Workflow-side read that wakes by polling a timer. + + A real provider wakes the workflow by delivering; polling is the price of + having no delivery path, and it is why this provider is for tests. + """ + + def __init__(self, store: _Topic, start: int, poll: timedelta) -> None: + self._store = store + self._offset = start + self._poll = poll + self._closed = False + + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + while not self._closed: + records = self._store.records + if len(records) > self._offset: + batch: list[tuple[Cursor, WireRecord]] = [] + for offset in range(self._offset, len(records)): + cursor = mint_cursor(_PROVIDER, str(offset)) + wire = _parse(cursor, records[offset], workflow.logger.warning) + if wire is not None: + batch.append((cursor, wire)) + self._offset = len(records) + if batch: + return batch + continue + await workflow.sleep(self._poll) + raise StopAsyncIteration + + def close(self) -> None: + self._closed = True + + +class _MemWriteSink: + def __init__(self, store: _Topic) -> None: + self._store = store + + def publish(self, record: WireRecord) -> None: + # Visible at once rather than at task acceptance: the documented gap + # between this provider and rule 1. + self._store.append([record]) + + +class _MemoryWorkflowProvider: + """The workflow half. Nothing to install and nothing to release.""" + + def __init__(self, streams: MemoryStreams) -> None: + self._streams = streams + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + start = self._streams._offset_after(after) + store = self._streams._topic(workflow.info().workflow_id, topic) + return _MemReadSource(store, start, self._streams._poll) + + def open_writer(self, topic: str) -> WriteSink: + return _MemWriteSink(self._streams._topic(workflow.info().workflow_id, topic)) + + def on_workflow_start(self) -> None: + pass + + async def on_workflow_finish(self) -> None: + pass + + +class MemoryProducer(Generic[T]): + """The outside producer, faithful to the contract.""" + + def __init__( + self, + store: _Topic, + converter: temporalio.converter.PayloadConverter, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + """Bind this producer to ``topic``'s ``store``.""" + self._store = store + self._converter = converter + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._sequence = 0 + self._last = BEGINNING + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _writer(self) -> str: + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) + + async def append(self, *values: T) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed; an empty call returns + the position of this producer's last record. + """ + if not values: + return self._last + return self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.DATA, + value=value, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence + index, + ) + for index, value in enumerate(values) + ] + ) + + async def finish(self) -> None: + """Write ``FINISH`` for this producer on this topic.""" + self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] + ) + + def _write(self, wires: list[WireRecord]) -> Cursor: + first, count = self._store.append( + wires, writer=self._writer, sequence=self._sequence + ) + self._sequence += len(wires) + self._last = mint_cursor(_PROVIDER, str(first + count - 1)) + return self._last + + +class MemoryStreamHandle: + """One workflow's stream from outside, with the shared reader rules.""" + + def __init__( + self, + streams: MemoryStreams, + client: Client | None, + workflow_id: str, + run_id: str | None, + ) -> None: + """Address ``workflow_id``'s topics in ``streams``.""" + self._streams = streams + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = ( + client.data_converter.payload_converter + if client is not None + else temporalio.converter.DataConverter.default.payload_converter + ) + + def read( + self, + *, + topic: str | StreamTopic[Any], + after: Cursor = BEGINNING, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after`` until the workflow closes.""" + name, result_type = resolve_topic(topic, result_type) + store = self._streams._topic(self._workflow_id, name) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + start = self._streams._offset_after(after) + return self._read(store, start, after, result_type) + + async def _read( + self, + store: _Topic, + offset: int, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + closed = False + while True: + records = store.records + while offset < len(records): + cursor = mint_cursor(_PROVIDER, str(offset)) + wire = _parse(cursor, records[offset], logger.warning) + offset += 1 + if wire is None: + continue + for record in decoder.decode(cursor, wire): + yield record + if closed: + return + # One more pass after learning the workflow closed, so a record + # that landed between the scan and the describe is not lost. + closed = await self._closed() + if not closed: + await store.wait_past( + offset, + None + if self._client is None + else self._streams._poll.total_seconds(), + ) + + async def _closed(self) -> bool: + if self._client is None: + return False + handle = self._client.get_workflow_handle( + self._workflow_id, run_id=self._run_id + ) + try: + description = await handle.describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + # A producer may write before the workflow exists; there is + # nothing to follow yet, so keep waiting. + return False + raise + status = description.status + if status is None or status == WorkflowExecutionStatus.RUNNING: + return False + # Following the chain, a run that continued as new is not the end: + # the next describe without a run id finds its successor. + return not ( + self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW + ) + + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + """The cursor of the newest record on ``topic``, for following from now.""" + name, _ = resolve_topic(topic) + count = len(self._streams._topic(self._workflow_id, name).records) + return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING + + def producer( + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> MemoryProducer[Any]: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + name, _ = resolve_topic(topic) + store = self._streams._topic(self._workflow_id, name) + producer_id, attempt = producer_identity(producer_id, attempt) + return MemoryProducer(store, self._converter, name, producer_id, attempt) + + +class MemoryStreams(ProviderPlugin): + """The in-memory provider, one list per topic. + + Construct one and pass the same instance to the worker and to the code + that opens handles; two instances share nothing. + """ + + def __init__( + self, *, poll_interval: timedelta = timedelta(milliseconds=100) + ) -> None: + """Create an empty provider. + + Args: + poll_interval: How often a workflow-side reader with nothing to + read checks again, and how often an outside reader asks + whether the workflow closed. + """ + self._poll = poll_interval + self._topics: dict[str, _Topic] = {} + + def reset(self) -> None: + """Drop every topic. For tests.""" + self._topics.clear() + + def workflow_provider(self) -> _MemoryWorkflowProvider: + """The workflow half, over this provider's topics.""" + return _MemoryWorkflowProvider(self) + + def get_stream_handle( + self, client: Client | None, workflow_id: str, *, run_id: str | None = None + ) -> MemoryStreamHandle: + """A handle on ``workflow_id``'s topics. + + ``client`` may be ``None`` here, unlike on a storage provider; then + the handle cannot see the workflow close and a read waits until the + caller closes it. + """ + return MemoryStreamHandle(self, client, workflow_id, run_id) + + async def close(self) -> None: + """Nothing to release: the provider holds no connection.""" + + def _topic(self, workflow_id: str, topic: str) -> _Topic: + if not topic: + raise ValueError("topic must not be empty") + key = topic_key(workflow_id, topic) + found = self._topics.get(key) + if found is None: + found = self._topics[key] = _Topic() + return found + + def _offset_after(self, after: Cursor) -> int: + position = cursor_position(after, provider=_PROVIDER) + if position is None: + return 0 + try: + return int(position) + 1 + except ValueError: + raise StreamCursorError( + f"cursor {after.token!r} does not name a position on the memory provider" + ) from None diff --git a/temporalio/worker/_activity.py b/temporalio/worker/_activity.py index ded3047fc..10bf45bd2 100644 --- a/temporalio/worker/_activity.py +++ b/temporalio/worker/_activity.py @@ -33,6 +33,7 @@ import temporalio.common import temporalio.converter import temporalio.exceptions +import temporalio.streams from temporalio.converter import ( StorageDriverActivityInfo, StorageDriverStoreContext, @@ -63,9 +64,11 @@ def __init__( metric_meter: temporalio.common.MetricMeter, client: temporalio.client.Client, encode_headers: bool, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: self._bridge_worker = bridge_worker self._task_queue = task_queue + self._stream_provider = stream_provider self._activity_executor = activity_executor self._shared_state_manager = shared_state_manager self._running_activities: dict[bytes, _RunningActivity] = {} @@ -666,6 +669,9 @@ async def _execute_activity( runtime_metric_meter=None if sync_non_threaded else self._metric_meter, client=self._client if not running_activity.sync else None, cancellation_details=running_activity.cancellation_details, + stream_provider=( + self._stream_provider if not running_activity.sync else None + ), ) ) temporalio.activity.logger.debug("Starting activity") diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index 55cec4ca7..1387face7 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -18,6 +18,7 @@ import temporalio.client import temporalio.converter import temporalio.runtime +import temporalio.streams import temporalio.worker import temporalio.workflow @@ -58,13 +59,14 @@ def __init__( disable_safe_workflow_eviction: bool = False, header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC, external_stream_backend: Any | None = None, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: """Create a replayer to replay workflows from history. See :py:meth:`temporalio.worker.Worker.__init__` for a description of most of the arguments. Most of the same arguments need to be passed to the replayer that were passed to the worker when the workflow originally - ran. + ran, ``stream_provider`` included when the workflow used streams. Note, unlike the worker, for the replayer the workflow_task_executor will default to a new thread pool executor with no max_workers set that @@ -96,6 +98,7 @@ def __init__( disable_safe_workflow_eviction=disable_safe_workflow_eviction, header_codec_behavior=header_codec_behavior, external_stream_backend=external_stream_backend, + stream_provider=stream_provider, ) self._initial_config = self._config.copy() self._default_workflow_logic_flags = set(_DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS) @@ -298,6 +301,7 @@ def on_eviction_hook( default_workflow_logic_flags=frozenset( self._default_workflow_logic_flags ), + stream_provider=self._config.get("stream_provider"), ) external_storage = data_converter.external_storage storage_driver_types = ( @@ -445,6 +449,7 @@ class ReplayerConfig(TypedDict, total=False): disable_safe_workflow_eviction: bool header_codec_behavior: HeaderCodecBehavior external_stream_backend: Any | None + stream_provider: temporalio.streams.StreamProvider | None @dataclass(frozen=True) diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index 4da7c13b3..04dfdd562 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -24,6 +24,7 @@ import temporalio.common import temporalio.runtime import temporalio.service +import temporalio.streams from temporalio.common import ( HeaderCodecBehavior, VersioningBehavior, @@ -153,6 +154,7 @@ def __init__( disable_payload_error_limit: bool = False, max_workflow_task_external_storage_concurrency: int = _DEFAULT_WORKFLOW_TASK_EXTERNAL_STORAGE_CONCURRENCY, external_stream_backend: Any | None = None, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: """Create a worker to process workflows and/or activities. @@ -354,6 +356,10 @@ def __init__( Defaults to 3. Adjust this value based on your workload's needs. Please report any issues you encounter with this setting or if you feel the default should be changed. + stream_provider: Experimental. The stream provider that workflows + on this worker read and publish through, see + :py:mod:`temporalio.streams`. A provider that is also a + :py:class:`Plugin` sets this itself when passed in ``plugins``. WARNING: This setting is experimental. """ @@ -404,6 +410,7 @@ def __init__( disable_payload_error_limit=disable_payload_error_limit, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, external_stream_backend=external_stream_backend, + stream_provider=stream_provider, ) plugins_from_client = cast( @@ -487,6 +494,11 @@ def _init_from_config(self, client: temporalio.client.Client, config: WorkerConf # Prepend applicable client interceptors to the given ones client_config = config["client"].config(active_config=True) # type: ignore[reportTypedDictNotRequiredAccess] + # A provider registered on the client serves its workers too, so one + # registration covers every context that asks for a stream. + stream_provider = config.get("stream_provider") or client_config.get( + "stream_provider" + ) interceptors_from_client = cast( list[Interceptor], [i for i in client_config["interceptors"] if isinstance(i, Interceptor)], @@ -524,6 +536,7 @@ def _init_from_config(self, client: temporalio.client.Client, config: WorkerConf interceptors=interceptors, metric_meter=self._runtime.metric_meter, client=client, + stream_provider=stream_provider, encode_headers=( client_config["header_codec_behavior"] == HeaderCodecBehavior.CODEC ), @@ -593,6 +606,7 @@ def check_activity(activity: str): != HeaderCodecBehavior.NO_CODEC, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, external_stream_backend=self._external_stream_backend, + stream_provider=stream_provider, ) tuner = config.get("tuner") @@ -1080,6 +1094,7 @@ class WorkerConfig(TypedDict, total=False): disable_payload_error_limit: bool max_workflow_task_external_storage_concurrency: int external_stream_backend: Any | None + stream_provider: temporalio.streams.StreamProvider | None def _warn_if_activity_executor_max_workers_is_inconsistent( diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 42fb07ff8..d646ebdac 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -27,6 +27,7 @@ import temporalio.converter import temporalio.converter._extstore import temporalio.exceptions +import temporalio.streams import temporalio.workflow from temporalio.bridge.worker import PollShutdownError from temporalio.converter import StorageDriverStoreContext, StorageDriverWorkflowInfo @@ -38,6 +39,7 @@ _relax_sandbox_for_debugger, ) from ._interceptor import ( + ExecuteWorkflowInput, Interceptor, WorkflowInboundInterceptor, WorkflowInterceptorClassInput, @@ -59,6 +61,43 @@ LOG_PROTOS = False +class _StreamHooksInterceptor(WorkflowInboundInterceptor): + """Brackets the workflow function with the stream provider's lifecycle hooks. + + Installed by the worker when it has a stream provider, so no workflow + code has to call anything before it runs or before it returns. The finish + hook runs when the function returns, raises or continues as new, because + a provider that parked a reader against the run has to let go either way. + It does not run when the run is being evicted from the cache or when the + abandoned coroutine is collected: neither is the workflow ending, the + instance's state is not to be touched during eviction, and at collection + time the runtime on the thread belongs to whichever workflow happens to + be running, so the hook would act on that one. + """ + + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: + runtime = temporalio.workflow._Runtime.current() + provider = runtime.workflow_streams().provider + provider.on_workflow_start() + try: + result = await self.next.execute_workflow(input) + except GeneratorExit: + raise + except BaseException: + if not _evicting(runtime): + await provider.on_workflow_finish() + raise + await provider.on_workflow_finish() + return result + + +def _evicting(runtime: temporalio.workflow._Runtime) -> bool: + # Eviction cancels the primary task the same way a workflow cancellation + # does; the flag the instance sets before cancelling is what tells them + # apart, and only the cancellation is a run ending. + return bool(getattr(runtime, "_deleting", False)) + + # Value was chosen abitrarily as a small number that allows some concurrency and prevents # large numbers of concurrent external storage operations causing resource contention. # This default limit is per workflow task activation and does not limit the total number @@ -158,6 +197,7 @@ def __init__( default_workflow_logic_flags: frozenset[_WorkflowLogicFlag] | None = None, external_stream_backend: Any | None = None, client: Any = None, + stream_provider: temporalio.streams.StreamProvider | None = None, ) -> None: # Debug mode is enabled if specified or if the TEMPORAL_DEBUG env var is truthy debug_mode = debug_mode or bool(os.environ.get("TEMPORAL_DEBUG")) @@ -216,6 +256,11 @@ def __init__( __temporal_assert_local_activity_valid=assert_local_activity_valid, ) ) + self._stream_provider = stream_provider + if stream_provider is not None: + # Innermost, so the lifecycle hooks bracket the workflow function + # itself, after every user interceptor has done its own setup. + self._interceptor_classes.append(_StreamHooksInterceptor) # External Workflow Streams. The manager is per-Worker and owns the # backend connection and watcher tasks; it is created lazily on the @@ -968,6 +1013,7 @@ def _create_workflow_instance( default_workflow_logic_flags=frozenset(self._default_workflow_logic_flags), external_stream_runtime=runtime, external_streams_configured=self._external_streams_configured, + stream_provider=self._stream_provider, ) if defn.sandboxed: return self._workflow_runner.create_instance(det) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 88e7a891b..992bf7ed9 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -58,7 +58,9 @@ import temporalio.converter import temporalio.exceptions import temporalio.nexus.system +import temporalio.streams import temporalio.workflow +import temporalio.workflow._streams from temporalio.converter import StorageDriverStoreContext, StorageDriverWorkflowInfo from temporalio.service import __version__ @@ -198,6 +200,7 @@ class WorkflowInstanceDetails: """ external_streams_configured: bool = False """Whether Workflow code may use the runtime for new subscriptions.""" + stream_provider: temporalio.streams.StreamProvider | None = None class WorkflowInstance(ABC): @@ -328,6 +331,8 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: det.worker_level_failure_exception_types ) self._patch_activation_callback = det.patch_activation_callback + self._stream_provider = det.stream_provider + self._streams: temporalio.workflow._streams._WorkflowStreams | None = None self._default_workflow_logic_flags = det.default_workflow_logic_flags self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False @@ -2079,6 +2084,20 @@ async def workflow_start_nexus_operation( ) ) + def workflow_streams(self) -> temporalio.workflow._streams._WorkflowStreams: + if self._streams is None: + if self._stream_provider is None: + raise RuntimeError( + "no stream provider is configured on this worker; pass one with " + "Worker(plugins=[provider]) or stream_provider=" + ) + # The workflow half is made per instance, so whatever it keeps + # dies with the instance the way handlers do. + self._streams = temporalio.workflow._streams._WorkflowStreams( + self._stream_provider.workflow_provider() + ) + return self._streams + def workflow_time_ns(self) -> int: return self._time_ns diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..f63135bf4 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -147,6 +147,12 @@ logger, unsafe, ) +from ._streams import ( + StreamReader, + StreamWriter, + stream_reader, + stream_writer, +) from ._workflow_ops import ( ChildWorkflowCancellationType, ChildWorkflowConfig, @@ -252,6 +258,10 @@ "SandboxImportNotificationPolicy", "logger", "unsafe", + "StreamReader", + "StreamWriter", + "stream_reader", + "stream_writer", "ChildWorkflowCancellationType", "ChildWorkflowConfig", "ChildWorkflowHandle", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..25523836a 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -24,6 +24,7 @@ from ._activities import ActivityCancellationType, ActivityHandle from ._exceptions import ContinueAsNewVersioningBehavior, VersioningIntent from ._nexus import NexusOperationCancellationType, NexusOperationHandle + from ._streams import _WorkflowStreams from ._workflow_ops import ( ChildWorkflowCancellationType, ChildWorkflowHandle, @@ -475,6 +476,9 @@ async def workflow_start_nexus_operation( summary: str | None, ) -> NexusOperationHandle[OutputT]: ... + @abstractmethod + def workflow_streams(self) -> _WorkflowStreams: ... + @abstractmethod def workflow_time_ns(self) -> int: ... diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py new file mode 100644 index 000000000..5d319d50a --- /dev/null +++ b/temporalio/workflow/_streams.py @@ -0,0 +1,279 @@ +"""Streams from inside workflow code. + +.. warning:: + This module is experimental and may change in future versions. + +The reader and writer here are the same on every provider. They convert +values, synthesize supersession and buffer nothing the provider did not hand +them; everything provider-specific sits behind the ``ReadSource`` and +``WriteSink`` that the provider's workflow half opens. The provider itself +comes from the worker, the way the payload converter does. +""" + +from __future__ import annotations + +import asyncio +from collections import deque +from collections.abc import AsyncIterator, Callable +from typing import Any, Generic, TypeVar, cast, overload + +from temporalio.streams._provider import ReadSource, WorkflowStreamProvider, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic +from temporalio.streams._wire import RecordDecoder, to_wire +from temporalio.workflow._context import _Runtime, payload_converter +from temporalio.workflow._sandbox import logger + +__all__ = ["StreamReader", "StreamWriter", "stream_reader", "stream_writer"] + +T = TypeVar("T") + + +class _WorkflowStreams: + """The stream state a workflow instance carries: its provider half and open readers.""" + + def __init__(self, provider: WorkflowStreamProvider) -> None: + self.provider = provider + self.readers: dict[str, StreamReader[Any]] = {} + + +class StreamReader(Generic[T]): + """Reads one topic of this workflow's stream from inside workflow code. + + The reader is the async iterator: ``async for record in reader`` yields + every kind of record, including the supersession the reader synthesizes + when a producer's newer attempt appears. Check ``record.kind``, or + iterate :meth:`values` when the workflow only wants data. Iteration ends + when the reader is closed or the provider ends the subscription. One loop + per reader: two loops on one reader share its buffer and interleave. + """ + + def __init__( + self, + source: ReadSource, + *, + topic: str, + result_type: type | None, + after: Cursor, + on_close: Callable[[], None], + ) -> None: + """Prefer :func:`temporalio.workflow.stream_reader`.""" + self._source = source + self._topic = topic + self._result_type = result_type + self._decoder = RecordDecoder( + payload_converter(), result_type, after=after, warn=logger.warning + ) + self._pending: deque[StreamRecord[T]] = deque() + self._lock = asyncio.Lock() + self._closed = False + self._ended = False + self._on_close = on_close + + @property + def topic(self) -> str: + """The name of the topic this reader is subscribed to.""" + return self._topic + + def __aiter__(self) -> StreamReader[T]: + """The reader is its own iterator.""" + return self + + async def __anext__(self) -> StreamRecord[T]: + """The next record, waiting for one to arrive.""" + while True: + if self._pending: + return self._pending.popleft() + if self._closed or self._ended: + raise StopAsyncIteration + await self._fill() + + async def _fill(self) -> None: + # Two loops on one reader must not race the source, so one batch + # fetch is in flight at a time and the second loop takes what the + # first one buffered. + async with self._lock: + if self._pending or self._closed or self._ended: + return + try: + batch = await self._source.next_batch() + except StopAsyncIteration: + # The provider ended the subscription. Iteration stops rather + # than raising, so a workflow that reads to the end of a + # finished stream leaves the loop instead of failing its task. + self._ended = True + return + for cursor, wire in batch: + self._pending.extend(self._decoder.decode(cursor, wire)) + + async def values(self) -> AsyncIterator[T]: + """Iterate the data values, dropping control records.""" + async for record in self: + if record.kind is RecordKind.DATA: + yield cast("T", record.value) + + def close(self) -> None: + """End the subscription. Idempotent. + + A later :func:`temporalio.workflow.stream_reader` on the same topic + opens a new subscription, which is a new command. + """ + if self._closed: + return + self._closed = True + self._source.close() + self._on_close() + + +class StreamWriter(Generic[T]): + """Publishes to one topic of this workflow's stream. + + A workflow can only publish transactionally to its own stream, on every + provider. Writing to somebody else's stream is an activity's job, and it + gets the weaker guarantee that goes with doing I/O. The type parameter is + the topic definition's value type; a writer on a string-named topic takes + any value. + """ + + def __init__(self, sink: WriteSink, topic: str) -> None: + """Prefer :func:`temporalio.workflow.stream_writer`.""" + self._sink = sink + self._topic = topic + self._finished = False + + @property + def topic(self) -> str: + """The name of the topic this writer is bound to.""" + return self._topic + + def publish(self, value: T) -> None: + """Append ``value`` to this topic. + + Synchronous, because there is nothing to wait for inside a task: the + record becomes visible when this Workflow Task is accepted, and never + at all if the task fails, so a reader cannot see a decision the + workflow did not commit. A :class:`temporalio.common.RawValue` passes + through pre-encoded. + + Raises: + ValueError: :meth:`finish` was already called on this writer. + """ + if self._finished: + raise ValueError(f"topic {self._topic!r} was already finished") + self._sink.publish( + to_wire( + payload_converter(), + topic=self._topic, + kind=RecordKind.DATA, + value=value, + ) + ) + + def finish(self) -> None: + """Write ``FINISH`` for this workflow on this topic. Idempotent. + + Says this workflow has nothing more to send on the topic. It does not + say the workflow succeeded, and it does not end anyone's read. + """ + if self._finished: + return + self._finished = True + self._sink.publish( + to_wire(payload_converter(), topic=self._topic, kind=RecordKind.FINISH) + ) + + +@overload +def stream_reader(topic: StreamTopic[T], *, after: Cursor = ...) -> StreamReader[T]: ... + + +@overload +def stream_reader( + topic: str, *, result_type: type[T], after: Cursor = ... +) -> StreamReader[T]: ... + + +@overload +def stream_reader( + topic: str, *, result_type: None = None, after: Cursor = ... +) -> StreamReader[Any]: ... + + +def stream_reader( + topic: str | StreamTopic[Any], + *, + result_type: type | None = None, + after: Cursor = BEGINNING, +) -> StreamReader[Any]: + """Subscribe this workflow to ``topic`` of its own stream. + + ``topic`` is a :func:`temporalio.streams.topic` definition, which carries + the record type, or a plain string with ``result_type=`` for a name + decided at runtime. One subscription per topic per run. A second call + for the same topic returns the reader already open on it, so records go + to whichever loop pulls first; such a call may pass neither ``after`` nor + a different type. Adding a reader on a new topic is a new command, so + gate it with :func:`temporalio.workflow.patched` as you would a timer. A + reader in a successor run starts a new subscription: nothing crosses + continue-as-new implicitly. + + Args: + topic: The topic, relative to this workflow's stream. + result_type: The value type for a string-named topic, used as the + decode hint. :class:`temporalio.common.RawValue` returns the + payload untouched. + after: Resume strictly after this record. Honoured on the first + subscription of a run, because after that the recorded + observations decide. + + Raises: + ValueError: ``topic`` is empty, ``result_type`` was passed with a + definition, or a reader on the topic is already open and this + call asked for a different position or type. + temporalio.streams.StreamCursorError: ``after`` was minted by another + provider. + """ + name, result_type = resolve_topic(topic, result_type) + state: _WorkflowStreams = _Runtime.current().workflow_streams() + existing = state.readers.get(name) + if existing is not None: + if after != BEGINNING or result_type is not existing._result_type: + raise ValueError( + f"topic {name!r} already has a reader in this run; a second " + "stream_reader shares it and takes no after= or other type" + ) + return existing + source = state.provider.open_reader(name, after=after) + + def forget() -> None: + state.readers.pop(name, None) + + reader: StreamReader[Any] = StreamReader( + source, topic=name, result_type=result_type, after=after, on_close=forget + ) + state.readers[name] = reader + return reader + + +@overload +def stream_writer(topic: StreamTopic[T]) -> StreamWriter[T]: ... + + +@overload +def stream_writer(topic: str) -> StreamWriter[Any]: ... + + +def stream_writer(topic: str | StreamTopic[Any]) -> StreamWriter[Any]: + """Publish to ``topic`` of this workflow's stream. + + Args: + topic: A :func:`temporalio.streams.topic` definition, whose value type + the writer's ``publish`` takes, or a plain string for a name + decided at runtime. Encoding follows each published value. + + Raises: + ValueError: ``topic`` is empty. + """ + name, _ = resolve_topic(topic) + provider = _Runtime.current().workflow_streams().provider + return StreamWriter(provider.open_writer(name), name) diff --git a/tests/streams/__init__.py b/tests/streams/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py new file mode 100644 index 000000000..12663fa23 --- /dev/null +++ b/tests/streams/conftest.py @@ -0,0 +1,8 @@ +import pytest + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "reports_positions: the case needs append() to return where records landed", + ) diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py new file mode 100644 index 000000000..eb733ba5b --- /dev/null +++ b/tests/streams/test_stream_accessors.py @@ -0,0 +1,122 @@ +"""The accessors each context asks for its stream, with one registration. + +The provider is registered on the client alone. A worker built from that +client inherits it, an activity on that worker reaches its own workflow's +stream through ``activity.stream_handle()``, and any code holding the client +reaches a stream through ``client.get_stream_handle()``. Without a +registration, both say so with the same error. +""" + +from __future__ import annotations + +import asyncio +import uuid +from datetime import timedelta +from typing import Any + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind, StreamUnsupportedError, topic +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import ActivityEnvironment, WorkflowEnvironment +from tests.helpers import new_worker + +INPUTS = topic("inputs", dict) +DECISIONS = topic("decisions", dict) + + +@pytest.fixture +def provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] + if env.supports_time_skipping: + pytest.skip( + "the memory provider polls on a timer, which time skipping turns into a spin" + ) + streams = MemoryStreams() + yield streams + streams.reset() + + +def _with_provider(client: Client, provider: MemoryStreams) -> Client: + # The same connection, with the provider registered the way an + # application registers it: once, on the client. + config = client.config() + config["plugins"] = [provider] + return Client(**config) + + +@activity.defn +async def emit(count: int) -> str: + # No workflow id and no run id: the handle is this activity's own + # workflow, pinned to its run, and the producer's identity is the + # activity's. + model = activity.stream_handle().producer(topic=INPUTS) + for n in range(count): + await model.append({"n": n}) + await model.finish() + return activity.info().activity_id + + +@workflow.defn +class Echo: + """Runs the emitting activity and echoes what arrives on ``inputs``.""" + + @workflow.run + async def run(self, count: int) -> list[Any]: + inputs = workflow.stream_reader(INPUTS) + decisions = workflow.stream_writer(DECISIONS) + emitting = workflow.start_activity( + emit, count, start_to_close_timeout=timedelta(seconds=30) + ) + seen: list[Any] = [] + async for record in inputs: + if record.kind is RecordKind.FINISH: + seen.append(("finish", record.producer_id)) + break + assert record.value is not None + seen.append(record.value["n"]) + decisions.publish({"echo": record.value["n"]}) + decisions.finish() + producer_id = await emitting + return [*seen, ("activity", producer_id)] + + +async def test_one_registration_on_the_client_serves_every_context( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + # No plugins on the worker: it inherits the client's provider. + async with new_worker(registered, Echo, activities=[emit]) as worker: + handle = await registered.start_workflow( + Echo.run, 2, id=workflow_id, task_queue=worker.task_queue + ) + result = await handle.result() + # The activity wrote as itself onto its own workflow's topic. + assert result[:2] == [0, 1] + assert result[2] == ["finish", result[3][1]] + + stream = registered.get_stream_handle(workflow_id) + + async def read_everything() -> list[Any]: + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] + + assert await asyncio.wait_for(read_everything(), 30) == [ + (RecordKind.DATA, {"echo": 0}), + (RecordKind.DATA, {"echo": 1}), + (RecordKind.FINISH, None), + ] + + +async def test_get_stream_handle_needs_a_registered_provider(client: Client): + with pytest.raises(StreamUnsupportedError, match="plugins="): + client.get_stream_handle("wf") + + +async def test_stream_handle_needs_a_provider_on_the_worker(): + async def ask() -> None: + activity.stream_handle() + + with pytest.raises(StreamUnsupportedError, match="plugins="): + await ActivityEnvironment().run(ask) diff --git a/tests/streams/test_stream_hooks.py b/tests/streams/test_stream_hooks.py new file mode 100644 index 000000000..9f98f75f6 --- /dev/null +++ b/tests/streams/test_stream_hooks.py @@ -0,0 +1,139 @@ +"""The lifecycle interceptor's rules about when the finish hook runs. + +Driven directly, with a stand-in runtime on the loop, because the two cases +that matter here are the ones a workflow test cannot stage on purpose: a +coroutine collected after its worker went away, and a run evicted from the +cache. Both used to reach the finish hook, and at collection time the hook +acted on whichever workflow was running on the thread. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.worker._interceptor import ( + ExecuteWorkflowInput, + WorkflowInboundInterceptor, +) +from temporalio.worker._workflow import _StreamHooksInterceptor + + +class _Provider: + def __init__(self) -> None: + self.calls: list[str] = [] + + def on_workflow_start(self) -> None: + self.calls.append("start") + + async def on_workflow_finish(self) -> None: + self.calls.append("finish") + + +class _Streams: + def __init__(self, provider: _Provider) -> None: + self.provider = provider + + +class _FakeRuntime: + """Only what the interceptor reads: the stream state and the eviction flag.""" + + def __init__(self, provider: _Provider, *, deleting: bool = False) -> None: + self._streams = _Streams(provider) + self._deleting = deleting + + def workflow_streams(self) -> _Streams: + return self._streams + + +class _Body(WorkflowInboundInterceptor): + """The workflow function's stand-in: returns, raises or parks forever.""" + + def __init__(self, outcome: Any) -> None: # type: ignore[reportMissingSuperCall] + self._outcome = outcome + + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: + del input + if self._outcome is _PARK: + await asyncio.Event().wait() + if isinstance(self._outcome, BaseException): + raise self._outcome + return self._outcome + + +_PARK = object() + + +async def _unused_run_fn() -> None: + pass + + +_INPUT = ExecuteWorkflowInput(type=object, run_fn=_unused_run_fn, args=(), headers={}) + + +@pytest.fixture +async def provider() -> Any: + fake = _Provider() + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake)) # type: ignore[arg-type] + yield fake + workflow._Runtime.set_on_loop(loop, None) + + +def _evicting(fake: _Provider) -> None: + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake, deleting=True)) # type: ignore[arg-type] + + +async def test_the_finish_hook_runs_on_return(provider: _Provider): + assert ( + await _StreamHooksInterceptor(_Body("done")).execute_workflow(_INPUT) == "done" + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_when_the_function_raises(provider: _Provider): + with pytest.raises(RuntimeError, match="boom"): + await _StreamHooksInterceptor(_Body(RuntimeError("boom"))).execute_workflow( + _INPUT + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_on_continue_as_new(provider: _Provider): + error = workflow.ContinueAsNewError.__new__(workflow.ContinueAsNewError) + with pytest.raises(workflow.ContinueAsNewError): + await _StreamHooksInterceptor(_Body(error)).execute_workflow(_INPUT) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_runs_on_a_workflow_cancellation(provider: _Provider): + # A cancelled primary task is the run ending, so the provider lets go. + with pytest.raises(asyncio.CancelledError): + await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( + _INPUT + ) + assert provider.calls == ["start", "finish"] + + +async def test_the_finish_hook_does_not_run_when_the_coroutine_is_collected( + provider: _Provider, +): + coroutine = _StreamHooksInterceptor(_Body(_PARK)).execute_workflow(_INPUT) + # Run up to the park, the way a worker that shut down without evicting + # leaves the primary task, then close it as garbage collection would. + coroutine.send(None) + coroutine.close() + assert provider.calls == ["start"] + + +async def test_the_finish_hook_does_not_run_during_eviction(provider: _Provider): + _evicting(provider) + with pytest.raises(asyncio.CancelledError): + await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( + _INPUT + ) + assert provider.calls == ["start"] diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py new file mode 100644 index 000000000..9002ea16a --- /dev/null +++ b/tests/streams/test_streams_conformance.py @@ -0,0 +1,416 @@ +"""Conformance tests for the stream contract's outside surface. + +Written against the public surface, parametrised over the providers this +tree can stand up. The memory provider always runs, with no server and no +store. A storage provider adds itself to ``SETUPS``, behind its own +``STREAMS_LIVE`` gate when it needs a store the test environment does not +start: its setup receives the environment's client and hands back a provider +instance, the client the cases should use, a ``host`` that starts the +workflow owning a stream when the store lives inside a running workflow, and +which capabilities it lacks, so the cases marked ``reports_positions`` are +skipped with a reason on a provider whose ``append()`` learns positions at +read time. + +What this file pins down is the contract: the record on the wire, producer +identity, retry deduplication, positions, supersession, topic addressing, +cursor resumption, cursor ownership, and store keys that cannot collide. The +workflow-side handles and the two rules about Workflow Tasks live in +``test_streams_workflow``. +""" + +from __future__ import annotations + +import asyncio +import uuid +from collections.abc import AsyncIterator, Awaitable, Callable +from dataclasses import dataclass +from typing import Any + +import pytest + +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.common import RawValue +from temporalio.converter import DataConverter +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamHandle, + StreamProvider, + Supersession, + _ids, + _wire, + topic, +) +from temporalio.streams._policy import AttemptTracker +from temporalio.streams.providers.memory import MemoryStreams + +# Defined once and shared by every case, the way an application shares them +# between its workflow, its activities and its backend. +OUT = topic("out", dict) +A = topic("a", dict) +B = topic("b", dict) +Y = topic("y", dict) +XY = topic("x:y", dict) + + +@dataclass +class ProviderCase: + """One provider under test, and what the cases may ask of it.""" + + name: str + provider: StreamProvider + client: Client | None = None + reports_positions: bool = True + """``append()`` returns where the records landed.""" + host: Callable[[str], Awaitable[None]] | None = None + """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" + + async def open( + self, workflow_id: str, *, run_id: str | None = None + ) -> StreamHandle: + if self.host is not None: + await self.host(workflow_id) + if self.client is not None: + # A storage provider's setup registers the provider on the client, + # so the cases go through the accessor an application uses. + return self.client.get_stream_handle(workflow_id, run_id=run_id) + # Only the memory provider gets here, and it takes no client. + return self.provider.get_stream_handle( + None, # type: ignore[arg-type] + workflow_id, + run_id=run_id, + ) + + +async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: + provider = MemoryStreams() + yield ProviderCase("memory", provider) + provider.reset() + + +SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { + "memory": _memory_case +} + +_CAPABILITIES = { + "reports_positions": lambda case: case.reports_positions, +} + + +@pytest.fixture(params=sorted(SETUPS)) +async def case( + request: pytest.FixtureRequest, client: Client +) -> AsyncIterator[ProviderCase]: + async for provider_case in SETUPS[request.param](client): + for marker, supported in _CAPABILITIES.items(): + if request.node.get_closest_marker(marker) and not supported(provider_case): + pytest.skip(f"the {provider_case.name} provider does not {marker}") + yield provider_case + + +def new_workflow_id() -> str: + # Unique per case, because a storage provider keeps what earlier cases + # wrote and the memory provider only happens to forget. + return f"wf-{uuid.uuid4().hex}" + + +async def take(records: Any, count: int, timeout: float = 5.0) -> list: + out: list = [] + + async def _collect() -> None: + async for record in records: + out.append(record) + if len(out) >= count: + return + + await asyncio.wait_for(_collect(), timeout) + return out + + +def test_record_roundtrips_through_the_wire(): + converter = DataConverter.default.payload_converter + wire = _wire.to_wire( + converter, + topic="decisions", + kind=RecordKind.DATA, + value={"n": 1}, + producer_id="model", + attempt=3, + sequence=7, + ) + parsed = _wire.WireRecord.FromString(wire.SerializeToString()) + record = _wire.from_wire(converter, Cursor("memory:0"), parsed, dict) + assert ( + record.kind, + record.topic, + record.producer_id, + record.attempt, + record.sequence, + record.value, + ) == (RecordKind.DATA, "decisions", "model", 3, 7, {"n": 1}) + assert record.supersession is None + finish = _wire.to_wire(converter, topic="decisions", kind=RecordKind.FINISH) + assert not finish.HasField("body") + assert _wire.from_wire(converter, Cursor("memory:1"), finish, dict).value is None + + +def test_a_stored_supersession_is_not_a_record(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", kind=int(RecordKind.SUPERSEDED)) # type: ignore[arg-type] + with pytest.raises(ValueError, match="synthesized"): + _wire.from_wire(converter, Cursor("memory:0"), wire, None) + + +def test_an_unset_kind_is_read_as_data(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", body=converter.to_payloads([{"n": 1}])[0]) + record = _wire.from_wire(converter, Cursor("memory:0"), wire, dict) + assert record.kind is RecordKind.DATA + assert record.value == {"n": 1} + + +def test_supersession_is_synthesized_from_observations(): + attempts = AttemptTracker() + assert attempts.note("model", 1, topic="t", previous=BEGINNING) is None + superseded = attempts.note("model", 2, topic="t", previous=Cursor("memory:0")) + assert superseded is not None + assert superseded.kind is RecordKind.SUPERSEDED + assert superseded.supersession == Supersession("model", 1, 2) + assert superseded.value is None + # Positioned before the triggering record, so a resume after it delivers + # that record next. + assert superseded.cursor == Cursor("memory:0") + # The same attempt again is not a new generation. + assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None + + +def test_topic_keys_cannot_collide(): + # A colon in a workflow id must not make two addresses one key. + assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") + assert _ids.topic_key("a%3Ab", "c") != _ids.topic_key("a:b", "c") + assert _ids.topic_key("wf", "inputs") == "wf:inputs" + + +def test_cursors_name_their_provider(): + assert _wire.cursor_position(BEGINNING, provider="memory") is None + assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" + with pytest.raises(StreamCursorError): + _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") + + +async def test_append_read_roundtrip(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + assert (producer.producer_id, producer.attempt) == ("model", 1) + await producer.append({"id": "r1"}, {"id": "r2"}) + await producer.finish() + + records = await take(stream.read(topic=OUT), 3) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] + assert records[2].value is None + assert all(r.producer_id == "model" and r.attempt == 1 for r in records) + assert [r.sequence for r in records] == [0, 1, 2] + assert all(r.topic == OUT.name for r in records) + + +async def test_raw_values_pass_through_untouched(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + payload = Payload(metadata={"encoding": b"binary/plain"}, data=b"\x00\x01raw") + producer = stream.producer(topic=OUT.name, producer_id="model", attempt=1) + await producer.append(RawValue(payload)) + + records = await take(stream.read(topic="out", result_type=RawValue), 1) + assert isinstance(records[0].value, RawValue) + assert records[0].value.payload == payload + + +@pytest.mark.reports_positions +async def test_retried_append_returns_the_original_position(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + landed = await first.append({"id": "r1"}) + assert landed is not None + # The retry of the same attempt starts its sequence over and appends the + # same record. The provider stores it once and answers with where the + # original landed, so the retry can checkpoint the same position. + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + assert await retry.append({"id": "r1"}) == landed + # An empty call writes nothing and answers the same way. + assert await retry.append() == landed + + records = await take(stream.read(topic=OUT), 1) + assert records[0].value == {"id": "r1"} + assert records[0].cursor == landed + # The store holds exactly the one record: the newest position is its cursor. + assert await stream.latest(topic=OUT) == landed + + +async def test_retried_append_is_stored_once(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + await first.append({"id": "r1"}) + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + await retry.append({"id": "r1"}) + await retry.append({"id": "r2"}) + + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] + + +async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + await first.append({"text": "The capital of"}) + second = stream.producer(topic=OUT, producer_id="model", attempt=2) + await second.append({"text": "Paris is the capital"}) + + records = await take(stream.read(topic=OUT), 3) + assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[1].kind is RecordKind.SUPERSEDED + assert records[1].supersession == Supersession("model", 1, 2) + assert records[1].value is None + assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 + + +async def test_a_superseded_record_resumes_to_the_triggering_record( + case: ProviderCase, +): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + await first.append({"n": 1}) + second = stream.producer(topic=OUT, producer_id="model", attempt=2) + await second.append({"n": 2}) + + records = await take(stream.read(topic=OUT), 3) + superseded = records[1] + assert superseded.kind is RecordKind.SUPERSEDED + # The synthesized record sits at the position before the new attempt's + # first record, so a consumer that checkpoints it and restarts is handed + # that record rather than skipping it. + assert superseded.cursor == records[0].cursor + resumed = await take(stream.read(topic=OUT, after=superseded.cursor), 1) + assert resumed[0].kind is RecordKind.DATA + assert resumed[0].value == {"n": 2} + + +async def test_topics_are_addressed_by_name(case: ProviderCase): + # Two producers on two topics of the same workflow's stream: each read + # names its topic and sees only that topic's records. + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + on_a = stream.producer(topic=A, producer_id="tool-a", attempt=1) + await on_a.append({"n": 1}) + on_b = stream.producer(topic=B, producer_id="tool-b", attempt=1) + await on_b.append({"n": 2}) + + only_a = await take(stream.read(topic=A), 1) + assert [(r.topic, r.value) for r in only_a] == [("a", {"n": 1})] + only_b = await take(stream.read(topic=B), 1) + assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] + + +async def test_cursor_resumes_where_it_points(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + records = await take(stream.read(topic=OUT), 3) + checkpoint = records[0].cursor + + # Resuming after a record hands back everything past it and nothing + # twice, without the reader ever advancing a cursor itself. + again = await take(stream.read(topic=OUT, after=checkpoint), 2) + assert [r.value for r in again] == [{"n": 2}, {"n": 3}] + + +@pytest.mark.reports_positions +async def test_append_cursor_names_the_last_record_of_the_batch(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + appended = await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + assert appended is not None + then = await producer.append({"n": 4}) + + # A producer that resumes a reader after its own append must see only + # what came later, not the tail of the batch it just wrote. + records = await take(stream.read(topic=OUT, after=appended), 1) + assert [r.value for r in records] == [{"n": 4}] + assert records[0].cursor == then + assert await producer.append() == then + + +async def test_latest_positions_a_reader_at_the_end(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + assert await stream.latest(topic=OUT) == BEGINNING + + await producer.append({"n": 1}, {"n": 2}) + since = await stream.latest(topic=OUT) + await producer.append({"n": 3}) + + # A reader that positioned itself before the last append sees only what + # came after, which is how a client follows a turn it is about to start. + records = await take(stream.read(topic=OUT, after=since), 1) + assert [r.value for r in records] == [{"n": 3}] + + +async def test_topic_addresses_with_colons_do_not_share_a_store(case: ProviderCase): + # ("wf:x", "y") and ("wf", "x:y") differ only in where the colon sits. + base = new_workflow_id() + left = await case.open(f"{base}:x") + right = await case.open(base) + await left.producer(topic=Y, producer_id="l", attempt=1).append({"side": "left"}) + await right.producer(topic=XY, producer_id="r", attempt=1).append({"side": "right"}) + + only_left = await take(left.read(topic=Y), 1) + assert [r.value for r in only_left] == [{"side": "left"}] + assert await left.latest(topic=Y) == only_left[0].cursor + only_right = await take(right.read(topic=XY), 1) + assert [r.value for r in only_right] == [{"side": "right"}] + assert await right.latest(topic=XY) == only_right[0].cursor + + +async def test_a_foreign_cursor_is_refused_at_the_call(case: ProviderCase): + stream = await case.open(new_workflow_id()) + # Refused by read() itself, not by the first iteration of its generator, + # so the caller's except clause is where the mistake surfaces. + with pytest.raises(StreamCursorError): + stream.read(topic=OUT, after=Cursor("elsewhere:42")) + + +async def test_argument_mistakes_are_value_errors(case: ProviderCase): + stream = await case.open(new_workflow_id()) + with pytest.raises(ValueError): + stream.read(topic="") + with pytest.raises(ValueError): + stream.producer(topic="", producer_id="model", attempt=1) + # Outside an activity there is no identity to fall back on. + with pytest.raises(ValueError, match="producer_id is required"): + stream.producer(topic=OUT) + + +async def test_a_definition_carries_its_type_once(case: ProviderCase): + stream = await case.open(new_workflow_id()) + with pytest.raises(ValueError, match="already carries its type"): + stream.read(topic=OUT, result_type=dict) # type: ignore[call-overload] + with pytest.raises(ValueError): + topic("", dict) + # A string names a topic decided at runtime, and the hint rides the call. + assert await stream.latest(topic=OUT.name) == BEGINNING diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py new file mode 100644 index 000000000..71f2bb8bf --- /dev/null +++ b/tests/streams/test_streams_workflow.py @@ -0,0 +1,443 @@ +"""Workflow-side conformance for the stream contract. + +Runs the reader and writer inside a real workflow on the memory provider +with a warm cache, and states the two rules about Workflow Tasks as tests: a +publish commits with its task (rule 1), and reads are recorded observations +that replay re-supplies (rule 2). The memory provider keeps neither and says +so in its docstring, so those two are strict expected failures here. A +storage provider that runs this module turns them into passes; that is the +measurement they exist for. + +The rest is what the portable surface promises on every provider: the +lifecycle hooks the worker calls, one subscription per topic per run, a read +that ends when the chain closes, a handle that follows continue-as-new, and +a topic shared by the workflow and an outside producer. +""" + +from __future__ import annotations + +import asyncio +import uuid +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.client import Client +from temporalio.streams import ( + Cursor, + ReadSource, + RecordKind, + StreamCursorError, + WriteSink, + topic, +) +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import WorkflowEnvironment +from temporalio.worker import Replayer +from tests.helpers import new_worker +from tests.streams.test_streams_conformance import take + +INPUTS = topic("inputs", dict) +DECISIONS = topic("decisions", dict) + + +@pytest.fixture +def provider(env: WorkflowEnvironment): # pyright: ignore[reportUnusedFunction] + if env.supports_time_skipping: + pytest.skip( + "the memory provider polls on a timer, which time skipping turns into a spin" + ) + streams = MemoryStreams() + yield streams + streams.reset() + + +@workflow.defn +class ContractLoop: + """Reads ``inputs``, publishes a decision per value, reports control records.""" + + @workflow.run + async def run(self) -> list[dict[str, Any]]: + inputs = workflow.stream_reader(INPUTS) + decisions = workflow.stream_writer(DECISIONS) + trace: list[dict[str, Any]] = [] + try: + async for record in inputs: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + trace.append( + { + "kind": "superseded", + "replaced": record.supersession.previous_attempt, + "attempt": record.supersession.attempt, + } + ) + decisions.publish( + {"retracting_attempt": record.supersession.previous_attempt} + ) + continue + if record.kind is RecordKind.FINISH: + trace.append({"kind": "finish", "producer": record.producer_id}) + break + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) + trace.append( + { + "kind": "decision", + "n": record.value["n"], + "attempt": record.attempt, + } + ) + finally: + inputs.close() + decisions.finish() + # Twice on purpose: a finished topic stays finished, with one marker. + decisions.finish() + return trace + + +async def _run_the_loop( + client: Client, provider: MemoryStreams +) -> tuple[Any, list[dict[str, Any]]]: + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, ContractLoop, plugins=[provider]) as worker: + handle = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await first.append({"n": 1}, {"n": 2}) + second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + await second.append({"n": 3}) + await second.finish() + trace = await handle.result() + return handle, trace + + +async def test_workflow_reads_decides_and_publishes( + client: Client, provider: MemoryStreams +): + handle, trace = await _run_the_loop(client, provider) + assert trace == [ + {"kind": "decision", "n": 1, "attempt": 1}, + {"kind": "decision", "n": 2, "attempt": 1}, + {"kind": "superseded", "replaced": 1, "attempt": 2}, + {"kind": "decision", "n": 3, "attempt": 2}, + {"kind": "finish", "producer": "model"}, + ] + + # The outside view of what the workflow published, on its own topic. + stream = provider.get_stream_handle(client, handle.id) + records = await take(stream.read(topic=DECISIONS), 5) + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"decided": 1}), + (RecordKind.DATA, {"decided": 2}), + (RecordKind.DATA, {"retracting_attempt": 1}), + (RecordKind.DATA, {"decided": 3}), + (RecordKind.FINISH, None), + ] + assert all(r.producer_id == "" and r.topic == DECISIONS.name for r in records) + # The second finish() wrote nothing: the marker is the newest record. + assert await stream.latest(topic=DECISIONS) == records[-1].cursor + + +async def test_read_ends_when_the_workflow_closes_and_the_tail_is_delivered( + client: Client, provider: MemoryStreams +): + handle, _ = await _run_the_loop(client, provider) + stream = provider.get_stream_handle(client, handle.id) + + async def read_everything() -> list[Any]: + return [r.value async for r in stream.read(topic=DECISIONS)] + + # No count and no early break: the read ends by itself once the workflow + # is closed and everything it retained has been handed over. + values = await asyncio.wait_for(read_everything(), 30) + assert values == [ + {"decided": 1}, + {"decided": 2}, + {"retracting_attempt": 1}, + {"decided": 3}, + None, + ] + + +@pytest.mark.xfail( + strict=True, + reason=( + "rule 2: reading is a recorded observation, so replaying the history " + "with the store gone must re-supply the same records; the memory " + "provider reads live process memory instead" + ), +) +async def test_replay_without_the_store_resupplies_the_records( + client: Client, provider: MemoryStreams +): + handle, _ = await _run_the_loop(client, provider) + history = await handle.fetch_history() + + provider.reset() + replayer = Replayer(workflows=[ContractLoop], plugins=[provider]) + await replayer.replay_workflow(history) + + +# Run ids whose first workflow task already failed, shared with the workflow +# thread so the retry can tell it is the retry. Outside the sandbox on +# purpose: the sandbox re-imports this module per run and would hide the set. +_failed_once: set[str] = set() + + +@workflow.defn(sandboxed=False) +class PublishThenFail: + """Publishes, then fails its first workflow task; the retry publishes again.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + run_id = workflow.info().run_id + committed = run_id in _failed_once + decisions.publish({"committed": committed}) + if not committed: + _failed_once.add(run_id) + raise RuntimeError("the first task fails after publishing") + decisions.finish() + + +@pytest.mark.xfail( + strict=True, + reason=( + "rule 1: a publish commits with its workflow task, so no reader sees " + "a record from a task that failed; the memory provider makes it " + "visible at publish time" + ), +) +async def test_a_failed_task_publishes_nothing(client: Client, provider: MemoryStreams): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, PublishThenFail, plugins=[provider]) as worker: + handle = await client.start_workflow( + PublishThenFail.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + records = await take(stream.read(topic=DECISIONS), 2, timeout=30) + await handle.result() + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"committed": True}), + (RecordKind.FINISH, None), + ] + + +@workflow.defn +class Relay: + """Publishes one record per run and continues as new once.""" + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"run": run}) + if run == 0: + workflow.continue_as_new(run + 1) + decisions.finish() + + +class _RecordingHalf: + """A workflow half that logs the hooks the worker calls, then delegates.""" + + def __init__(self, inner: Any, calls: list[tuple[str, str]]) -> None: + self._inner = inner + self._calls = calls + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + return self._inner.open_reader(topic, after=after) + + def open_writer(self, topic: str) -> WriteSink: + return self._inner.open_writer(topic) + + def on_workflow_start(self) -> None: + self._calls.append(("start", workflow.info().run_id)) + + async def on_workflow_finish(self) -> None: + self._calls.append(("finish", workflow.info().run_id)) + + +class HookedMemory(MemoryStreams): + """The memory provider with its lifecycle hooks made visible.""" + + def __init__(self) -> None: + super().__init__() + self.calls: list[tuple[str, str]] = [] + + def workflow_provider(self) -> Any: + return _RecordingHalf(super().workflow_provider(), self.calls) + + +@pytest.mark.usefixtures("provider") +async def test_the_worker_calls_the_lifecycle_hooks_around_every_run(client: Client): + hooked = HookedMemory() + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[hooked]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + # Start before the function, finish after it, on both runs: the finish + # hook runs on the continue-as-new exit too, so a provider that parked + # something against the first run can let go before the successor starts. + kinds = [kind for kind, _ in hooked.calls] + assert kinds == ["start", "finish", "start", "finish"] + runs = [run_id for _, run_id in hooked.calls] + assert runs[0] == runs[1] and runs[2] == runs[3] and runs[0] != runs[2] + + +async def test_a_handle_without_a_run_id_reads_across_continue_as_new( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, Relay, plugins=[provider]) as worker: + handle = await client.start_workflow( + Relay.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] + + records = await asyncio.wait_for(read_everything(), 30) + await handle.result() + # The chain is followed: the successor's records arrive on the same read, + # and the read ends only when the last run of the chain is closed. + assert records == [ + (RecordKind.DATA, {"run": 0}), + (RecordKind.DATA, {"run": 1}), + (RecordKind.FINISH, None), + ] + + +@workflow.defn +class SharedReaders: + """Opens the same topic twice and pulls from both readers in turn.""" + + @workflow.run + async def run(self) -> list[Any]: + first = workflow.stream_reader(INPUTS) + second = workflow.stream_reader(INPUTS) + trace: list[Any] = ["shared" if first is second else "separate"] + try: + workflow.stream_reader(INPUTS, after=Cursor("memory:0")) + except ValueError: + trace.append("after-rejected") + try: + workflow.stream_reader(INPUTS.name, result_type=list) + except ValueError: + trace.append("type-rejected") + trace.append((await first.__anext__()).value) + trace.append((await second.__anext__()).value) + first.close() + return trace + + +async def test_a_second_reader_on_a_topic_shares_the_subscription( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, SharedReaders, plugins=[provider]) as worker: + handle = await client.start_workflow( + SharedReaders.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=INPUTS, producer_id="model", attempt=1).append( + {"n": 1}, {"n": 2} + ) + assert await handle.result() == [ + "shared", + "after-rejected", + "type-rejected", + {"n": 1}, + {"n": 2}, + ] + + +@workflow.defn +class ForeignCursor: + """Resumes from a cursor another provider minted.""" + + @workflow.run + async def run(self) -> str: + try: + workflow.stream_reader(INPUTS, after=Cursor("elsewhere:1")) + except StreamCursorError: + return "refused" + return "accepted" + + +async def test_the_workflow_reader_refuses_a_foreign_cursor( + client: Client, provider: MemoryStreams +): + async with new_worker(client, ForeignCursor, plugins=[provider]) as worker: + result = await client.execute_workflow( + ForeignCursor.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert result == "refused" + + +@workflow.defn +class NoProvider: + """Opens a stream on a worker that has no provider.""" + + @workflow.run + async def run(self) -> str: + try: + workflow.stream_reader(INPUTS) + except RuntimeError as error: + return str(error) + return "opened" + + +async def test_a_worker_without_a_provider_says_so(client: Client): + async with new_worker(client, NoProvider) as worker: + result = await client.execute_workflow( + NoProvider.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert "no stream provider is configured" in result + + +@workflow.defn +class OneLine: + """Publishes one record and finishes the topic.""" + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + decisions.publish({"from": "workflow"}) + decisions.finish() + + +async def test_an_outside_producer_and_the_workflow_share_a_topic( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, OneLine, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=DECISIONS, producer_id="tool", attempt=1).append( + {"from": "producer"} + ) + handle = await client.start_workflow( + OneLine.run, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS)] + + records = await asyncio.wait_for(read_everything(), 30) + # Both writers land on one topic in one order, each under its own + # identity: the producer's records carry its id, the workflow's carry none. + assert [(r.producer_id, r.kind, r.value) for r in records] == [ + ("tool", RecordKind.DATA, {"from": "producer"}), + ("", RecordKind.DATA, {"from": "workflow"}), + ("", RecordKind.FINISH, None), + ] From dad0743ff7203c39bd2c2e8260ce6b1b9aedde6a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:12:04 -0700 Subject: [PATCH 582/831] Answered a legacy query without the stream snapshot beside it. A parked Run has no open Workflow Task, so the server dispatches a query on a task of its own and Core allows nothing beside the answer there. The instance still reported the registered wait set, Core refused the completion, and the query timed out. --- temporalio/worker/_workflow_instance.py | 14 ++++ .../test_worker_integration.py | 66 +++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 992bf7ed9..64cca2ea4 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -87,6 +87,9 @@ # Set to true to log all cases where we're ignoring things during delete LOG_IGNORE_DURING_DELETE = False +# Core answers a query carrying this id on the query's own task, alone. +_LEGACY_QUERY_ID = "legacy_query" + def _is_workflow_terminal_command( command: temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.WorkflowCommand, @@ -2643,6 +2646,17 @@ def _emit_external_stream_commands(self) -> None: if runtime is None or self._deleting: return + # A legacy query is answered on a task of its own, and Core refuses any + # other command beside that answer. The activation ran no Workflow code, + # so the wait set it would report is the one the retained task already + # holds, and there is no observation delta to commit. + if any( + command.HasField("respond_to_query") + and command.respond_to_query.query_id == _LEGACY_QUERY_ID + for command in self._current_completion.successful.commands + ): + return + # First, because the boundary a Continue-As-New header has to carry is # the one this activation is about to commit, and it only stops moving # here. diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index cf797719f..f9ad6d5d7 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -301,6 +301,72 @@ async def test_a_blocked_workflow_retains_its_task_rather_than_completing_it( await handle.terminate() +@workflow.defn +class ParkedQueryWorkflow: + """Blocks on an empty stream with a short idle timeout, so the task parks.""" + + def __init__(self) -> None: + self._seen: list[str] = [] + + @workflow.run + async def run(self) -> list[str]: + tokens = external_stream.with_options(idle_timeout=timedelta(seconds=1)).topic( + "tokens", type=str + ) + async for token in tokens.subscribe(): + self._seen.append(token) + break + return self._seen + + @workflow.query + def seen(self) -> list[str]: + return self._seen + + +async def test_a_query_against_a_parked_workflow_is_answered( + client: Client, backend: MemoryStreamBackend +) -> None: + """A parked Run has no open Workflow Task, so its query travels alone. + + The server dispatches it on a task of its own, and Core allows nothing + beside the answer on that task. The wait set is still registered from the + parked task, so reporting it again with the answer made Core refuse the + completion, and the query never returned. + """ + task_queue = f"tq-{uuid.uuid4()}" + async with Worker( + client, + task_queue=task_queue, + workflows=[ParkedQueryWorkflow], + external_stream_backend=backend, + ): + handle = await client.start_workflow( + ParkedQueryWorkflow.run, + id=f"wf-{uuid.uuid4()}", + task_queue=task_queue, + ) + # Past the idle timeout the retained task is reported and the Run + # waits for a wake with no task open. + await asyncio.sleep(3) + + assert await asyncio.wait_for(handle.query(ParkedQueryWorkflow.seen), 10) == [] + + description = await handle.describe() + key = StreamKey( + client.namespace, + handle.id, + description.raw_description.workflow_execution_info.first_run_id, + "tokens", + ) + await publish(backend, key, ["first"]) + assert await asyncio.wait_for(handle.result(), 60) == ["first"] + + events = [e async for e in handle.fetch_history_events()] + assert not any( + e.HasField("workflow_task_failed_event_attributes") for e in events + ), "a Workflow Task failed while the query was outstanding" + + async def test_a_workflow_without_a_configured_backend_says_so( client: Client, ) -> None: From b7be7b4aa309a4194054ba2743932e1b0660a069 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:15:43 -0700 Subject: [PATCH 583/831] Added the Redis provider with an input and an output stream per topic. The transport keys every stream by direction, so an outside producer appends each record to the input stream that wakes a subscribed workflow and to the output stream where the workflow's promoted batches land. A workflow's publish is synchronous and stages with the task; an outside read ends with the workflow. --- CHANGELOG.md | 6 +- streams_demo/provider_setup.py | 26 +- .../contrib/external_workflow_streams/_api.py | 15 +- temporalio/streams/providers/redis.py | 664 ++++++++++++++++++ tests/streams/test_redis_provider.py | 45 ++ tests/streams/test_redis_replay.py | 207 ++++++ tests/streams/test_streams_conformance.py | 58 +- 7 files changed, 1009 insertions(+), 12 deletions(-) create mode 100644 temporalio/streams/providers/redis.py create mode 100644 tests/streams/test_redis_provider.py create mode 100644 tests/streams/test_redis_replay.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bbd734e5..6da9470b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,11 @@ to include examples, links to docs, or any other relevant information. code; a plain string names a topic decided at runtime. The record on the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory - reference provider the conformance tests run against. + reference provider the conformance tests run against, and + `temporalio.streams.providers.redis.RedisStreams` serves the same interface + over External Workflow Streams, one topic as an input and an output stream. +- `ExternalStreamSubscription.records()` yields each value with the provider + offset it was read from, for a reader that has to name where it got to. - Added experimental External Workflow Streams in `temporalio.contrib.external_workflow_streams`. Workflow stream payloads are diff --git a/streams_demo/provider_setup.py b/streams_demo/provider_setup.py index 2e4bcc350..7fbf9316c 100644 --- a/streams_demo/provider_setup.py +++ b/streams_demo/provider_setup.py @@ -1,8 +1,9 @@ """Pick the provider for a demo run from the environment. -``STREAMS_PROVIDER`` names a provider; this base tree carries only ``memory``, -and each provider branch adds its own name here. The demo needs a Temporal -server to run the workflow either way; ``TEMPORAL_ADDRESS`` points at it. +``STREAMS_PROVIDER`` names a provider; this tree carries ``memory`` and +``redis``. The demo needs a Temporal server to run the workflow either way; +``TEMPORAL_ADDRESS`` points at it, and the Redis demo reads its store from +``AI198_REDIS_URL`` and ``AI198_REDIS_PREFIX``. """ from __future__ import annotations @@ -21,16 +22,23 @@ async def open() -> tuple[str, ProviderPlugin]: """The server to connect to and the provider the worker and the client share.""" - if NAME != "memory": - raise SystemExit(f"this tree carries no stream provider named {NAME!r}") - return os.environ.get("TEMPORAL_ADDRESS", "localhost:7233"), MemoryStreams() + address = os.environ.get("TEMPORAL_ADDRESS", "localhost:7233") + if NAME == "memory": + return address, MemoryStreams() + if NAME == "redis": + from temporalio.streams.providers.redis import RedisStreams + + return address, RedisStreams( + url=os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6379"), + key_prefix=os.environ.get("AI198_REDIS_PREFIX", "ai198-contract"), + ) + raise SystemExit(f"this tree carries no stream provider named {NAME!r}") async def close(provider: ProviderPlugin) -> None: """Let go of whatever :func:`open` acquired. - The memory provider holds no connection, so this is its ``close()`` and - nothing more. A provider branch that opens one closes it the same way, so - the demo's teardown reads the same on every provider. + The memory provider holds no connection and the Redis provider closes + the client it opened, so the demo's teardown reads the same on both. """ await provider.close() diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index c89986954..0a373b10b 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -35,6 +35,7 @@ classify_read_failure, ) from temporalio.contrib.external_workflow_streams._record import ( + Offset, StreamRecord, ) from temporalio.types import AnyType @@ -594,6 +595,16 @@ def __aiter__(self) -> AsyncIterator[AnyType]: return self._iterate() async def _iterate(self) -> AsyncIterator[AnyType]: + async for _offset, value in self.records(): + yield value + + async def records(self) -> AsyncIterator[tuple[Offset, AnyType]]: + """Each value with the provider offset it was read from. + + Same delivery, same consumption, same commit order as iterating values. + A reader that has to name where it got to, or hand a position to + something outside the Workflow, cannot do it from the values alone. + """ while not self._finished: # Re-filled before *every* record rather than once per batch. A # record buffered while Workflow code was doing something else -- a @@ -623,8 +634,10 @@ async def _iterate(self) -> AsyncIterator[AnyType]: # becomes a value or raises, and neither outcome can leave the # ready list half-consumed. value = self._decode(record) + offset = record.offset self._commit(record) - yield value + assert offset is not None + yield offset, value continue await self._await_readiness() diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py new file mode 100644 index 000000000..0a345ae98 --- /dev/null +++ b/temporalio/streams/providers/redis.py @@ -0,0 +1,664 @@ +"""The client-side (Redis) provider. + +Streams live in a store the customer runs, Redis here, behind the external +workflow streams transport. A workflow's publish is buffered by the worker, +staged invisibly under a token when the Workflow Task completes, and promoted +only once a marker in History proves the task was accepted. Consumption is +recorded the same way, as ranges and boundaries in History. + +The mapping, in one place: + +- The transport keeps two Redis streams per topic, one the workflow reads and + one outside readers read, because the direction is part of every key it + derives. An outside producer therefore appends each record to both: the + input stream, which wakes a workflow subscribed to the topic, and the + output stream, where the workflow's own promoted batches land, so an + outside reader sees the producer's records and the workflow's in one order + and a workflow reading the topic misses nothing however early the producer + started. The cost is one more append per record and one wake per batch. +- A record rides as the transport's payload: the serialized ``StreamRecord`` + proto as a ``binary/plain`` value, which the worker's codec encodes and + decodes like any other payload. +- Producer identity dedupes through the transport's idempotency: the session + is ``producer#attempt`` and every record carries a sequence, so a retried + batch is dropped with the original position and a new attempt passes. +- Cursors are ``redis:-`` on the outside surface and name a position + in the output stream. A workflow-side record carries ``redis:in:-`` + for information only: the transport starts a run's subscription where the + chain left off, so a workflow reader cannot resume from a cursor. +- Streams are keyed by the chain's first run, so a handle follows continue-as- + new by construction and ``run_id`` only decides whose close ends a read. +- A task's publishes are staged as one batch. The transport's own per-task + batch limits are lifted for this provider, because a synchronous publish + cannot wait for the worker to stage a full batch; a batch it cannot stage + fails the task. +""" + +from __future__ import annotations + +import asyncio +import logging +import re +import time +from collections.abc import AsyncGenerator, Coroutine +from datetime import timedelta +from typing import Any, Generic, TypeVar + +from google.protobuf.message import DecodeError + +from temporalio import workflow +from temporalio.client import Client, WorkflowExecutionStatus +from temporalio.contrib.external_workflow_streams import ( + AFTER, + AppendConflictError, + AppendNotAcknowledgedError, + ChainKeyMismatchError, + ExternalOutputStreamProducer, + ExternalStreamProducer, + Offset, + OutputAppendNotAcknowledgedError, + StreamDirection, + WakeNotAcknowledgedError, + WorkflowChainKey, + external_output_stream, + external_stream, +) +from temporalio.contrib.external_workflow_streams import ( + BEGINNING as TRANSPORT_BEGINNING, +) +from temporalio.contrib.external_workflow_streams import ( + RecordKind as TransportRecordKind, +) +from temporalio.contrib.external_workflow_streams import ( + StreamError as TransportStreamError, +) +from temporalio.contrib.external_workflow_streams._backend import DEFAULT_WATCH_BLOCK +from temporalio.contrib.external_workflow_streams._codec import StreamPayloadCodec +from temporalio.contrib.external_workflow_streams._output_client import ( + _reconcile_output_stage, +) +from temporalio.converter import WorkflowSerializationContext +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, + StreamProducerError, + StreamUnsupportedError, +) +from temporalio.streams._provider import ReadSource, WriteSink +from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._topic import StreamTopic, resolve_topic +from temporalio.streams._wire import ( + RecordDecoder, + WireRecord, + cursor_position, + mint_cursor, + producer_identity, + to_wire, +) +from temporalio.streams.providers import ProviderPlugin +from temporalio.worker import ReplayerConfig, WorkerConfig + +__all__ = ["RedisProducer", "RedisStreamHandle", "RedisStreams"] + +T = TypeVar("T") + +_PROVIDER = "redis" +_INPUT_PREFIX = "in:" +_REDIS_ID = re.compile(r"\d+-\d+") +_READ_BATCH = 256 + +# The transport's per-task batch limits are a backpressure point that awaits +# inside the workflow, and a synchronous publish has nowhere to await. Lifted +# to where they cannot fire, so a task's publishes stage as one batch. +_UNBOUNDED_OUTPUT = external_output_stream.with_options( + max_records=1 << 30, max_logical_bytes=1 << 40 +) + +logger = logging.getLogger(__name__) + + +def _require_topic(topic: str) -> None: + if not topic: + raise ValueError("topic must not be empty") + + +def _outside_position(after: Cursor) -> Offset | None: + """The output-stream offset an outside cursor names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + if token.startswith(_INPUT_PREFIX): + raise StreamCursorError( + f"cursor {after.token!r} names a position in the workflow's input log, " + "which only the workflow reads" + ) + if not _REDIS_ID.fullmatch(token): + raise StreamCursorError( + f"cursor {after.token!r} does not name a Redis stream position" + ) + return Offset(token) + + +def _drive(coroutine: Coroutine[Any, Any, None]) -> None: + """Run a transport publish to completion without yielding to the loop. + + The transport's publish only awaits when the task's batch is full. A + synchronous publish has nowhere to wait, so a publish that would have + waited fails the task instead, loudly. + """ + try: + coroutine.send(None) + except StopIteration: + return + coroutine.close() + raise StreamError( + "this Workflow Task's output batch is full, and a synchronous publish " + "cannot wait for the worker to stage it" + ) + + +def _parse(cursor: Cursor, raw: bytes, warn: Any) -> WireRecord | None: + try: + return WireRecord.FromString(raw) + except DecodeError as error: + # Same answer as an undecodable body: skip and say so, so one bad + # record cannot pin a reader. + warn("skipping stream record at %s: %s", cursor, error) + return None + + +class _RedisReadSource: + """One subscription of the running workflow, over the transport's input stream.""" + + def __init__(self, subscription: Any) -> None: + self._subscription = subscription + self._records = subscription.records() + + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + while True: + # One record per batch: the transport reports readiness per record, + # and a batch here would invent a boundary replay never observed. + offset, body = await self._records.__anext__() + cursor = mint_cursor(_PROVIDER, f"{_INPUT_PREFIX}{offset.token}") + wire = _parse(cursor, body, workflow.logger.warning) + if wire is not None: + return [(cursor, wire)] + + def close(self) -> None: + self._subscription.close() + + +class _RedisWriteSink: + def __init__(self, topic: str) -> None: + self._topic = _UNBOUNDED_OUTPUT.topic(topic, type=bytes) + + def publish(self, record: WireRecord) -> None: + # Buffered in the transport's per-task batch, staged by the worker when + # the task completes and promoted once History proves the task was + # accepted: rule 1 through the transport's own commit. + _drive(self._topic.publish(record.SerializeToString())) + + +class _RedisWorkflowProvider: + """The workflow half: the transport's subscriptions and staged output.""" + + def __init__(self, idle_timeout: timedelta) -> None: + self._input = external_stream.with_options(idle_timeout=idle_timeout) + + def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + _require_topic(topic) + if cursor_position(after, provider=_PROVIDER) is not None: + raise StreamUnsupportedError( + "the redis provider starts a run's subscription where the chain " + "left off; it cannot resume a workflow reader from a cursor" + ) + return _RedisReadSource(self._input.topic(topic, type=bytes).subscribe()) + + def open_writer(self, topic: str) -> WriteSink: + _require_topic(topic) + return _RedisWriteSink(topic) + + def on_workflow_start(self) -> None: + pass + + async def on_workflow_finish(self) -> None: + pass + + +async def _chain(client: Client, workflow_id: str) -> WorkflowChainKey: + try: + description = await client.get_workflow_handle(workflow_id).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {workflow_id!r} was not found" + ) from error + raise + return WorkflowChainKey( + client.namespace, + workflow_id, + description.raw_description.workflow_execution_info.first_run_id, + ) + + +def _storage_error(error: Exception, what: str) -> StreamError: + return StreamError(f"{what}: {error}") + + +class RedisProducer(Generic[T]): + """Appends to a topic from outside workflow code. + + Every append is visible as soon as the store accepts it. Each record goes + to the topic's input stream, waking a workflow subscribed to it, and to + its output stream, where outside readers and the workflow's own records + meet; the cursor returned names the output position. + """ + + def __init__( + self, + streams: RedisStreams, + client: Client, + workflow_id: str, + topic: str, + producer_id: str, + attempt: int, + ) -> None: + """Bind this producer to ``topic`` of ``workflow_id``'s stream.""" + self._streams = streams + self._client = client + self._workflow_id = workflow_id + self._topic = topic + self._producer_id = producer_id + self._attempt = attempt + self._converter = client.data_converter.payload_converter + self._sequence = 0 + self._last = BEGINNING + self._input: Any = None + self._output: Any = None + + @property + def producer_id(self) -> str: + """Who this producer writes as.""" + return self._producer_id + + @property + def attempt(self) -> int: + """The generation this producer is writing.""" + return self._attempt + + @property + def _session(self) -> str: + # The transport dedupes on this and the sequence. The attempt is part + # of it so a retried append is dropped while a new generation writing + # different words at the same sequence is not. + return ( + f"{self._producer_id}#{self._attempt}" + if self._attempt + else self._producer_id + ) + + async def append(self, *values: T) -> Cursor: + """Append ``values`` and return the cursor of the last record as stored. + + A repeat returns where the original landed, because the transport + answers a byte-identical repeat with the original offset; an empty + call returns the position of this producer's last record. + """ + if not values: + return self._last + return await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.DATA, + value=value, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence + index, + ) + for index, value in enumerate(values) + ] + ) + + async def finish(self) -> None: + """Write ``FINISH`` for this producer on this topic. + + Written as an ordinary record rather than the transport's own + terminal, which would end every outside read of the topic; a + ``FINISH`` here only says this producer is done. + """ + await self._write( + [ + to_wire( + self._converter, + topic=self._topic, + kind=RecordKind.FINISH, + producer_id=self._producer_id, + attempt=self._attempt, + sequence=self._sequence, + ) + ] + ) + + async def _connect(self) -> None: + if self._output is not None: + return + backend = self._streams._require_backend() + chain = await _chain(self._client, self._workflow_id) + try: + output = await ExternalOutputStreamProducer.connect( + backend=backend, + workflow=chain, + client=self._client, + session_id=self._session, + ) + input_ = await ExternalStreamProducer.connect( + backend=backend, + workflow=chain, + client=self._client, + session_id=self._session, + ) + except ChainKeyMismatchError as error: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} is not the chain this producer " + f"was opened on: {error}" + ) from error + self._output = output.topic(self._topic, type=bytes) + self._input = input_.topic(self._topic, type=bytes) + + async def _write(self, records: list[WireRecord]) -> Cursor: + await self._connect() + last: Offset | None = None + try: + for record in records: + frame = record.SerializeToString() + await self._input.publish(frame, wake=False) + placed = await self._output.publish(frame) + last = placed.offset + await self._wake() + except AppendConflictError as error: + raise StreamProducerError( + f"producer {self._session!r} already wrote a different record at " + f"sequence {error.key.sequence}" + ) from error + except (AppendNotAcknowledgedError, OutputAppendNotAcknowledgedError) as error: + raise _storage_error(error, "an append was not acknowledged") from error + except TransportStreamError as error: + raise _storage_error(error, "the store refused an append") from error + self._sequence += len(records) + assert last is not None + self._last = mint_cursor(_PROVIDER, last.token) + return self._last + + async def _wake(self) -> None: + try: + await self._input.wake() + except WakeNotAcknowledgedError: + # The records are appended; what failed is telling a consumer that + # is no longer there to be told. A terminal record most often races + # the consumer acting on it, so an absent consumer is the ordinary + # ending rather than an error. + if not await self._consumer_has_gone(): + raise + except TransportStreamError as error: + raise _storage_error(error, "the wake could not be sent") from error + + async def _consumer_has_gone(self) -> bool: + """Whether the consuming execution is closing or closed. + + Asked for a few seconds rather than once: the server refuses the wake + while the execution is closing, and at that moment its status is + still the running one. + """ + handle = self._client.get_workflow_handle(self._workflow_id) + deadline = time.monotonic() + 5 + while True: + try: + status = (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + return True + raise + if status is not None and status != WorkflowExecutionStatus.RUNNING: + return True + if time.monotonic() >= deadline: + return False + await asyncio.sleep(0.1) + + +class RedisStreamHandle: + """One workflow's topics from outside, over the transport's output streams.""" + + def __init__( + self, + streams: RedisStreams, + client: Client, + workflow_id: str, + run_id: str | None, + ) -> None: + """Address ``workflow_id``'s topics; ``run_id`` decides whose close ends a read.""" + self._streams = streams + self._client = client + self._workflow_id = workflow_id + self._run_id = run_id + self._converter = client.data_converter.payload_converter + self._codec: StreamPayloadCodec[bytes] = StreamPayloadCodec( + client.data_converter.with_context( + WorkflowSerializationContext( + namespace=client.namespace, workflow_id=workflow_id + ) + ), + bytes, + ) + + def read( + self, + *, + topic: str | StreamTopic[Any], + after: Cursor = BEGINNING, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + topic, result_type = resolve_topic(topic, result_type) + # Parsed here so a foreign cursor fails this call, not the first + # iteration of the generator. + position = _outside_position(after) + return self._read(topic, position, after, result_type) + + async def _read( + self, + topic: str, + position: Offset | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + backend = self._streams._require_backend() + chain = await _chain(self._client, self._workflow_id) + key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) + cursor = TRANSPORT_BEGINNING if position is None else AFTER(position) + closed = False + while True: + try: + result = await backend.read_output_after( + key, + cursor, + max_records=_READ_BATCH, + block=self._streams._poll, + ) + except TransportStreamError as error: + raise _storage_error(error, "the store could not be read") from error + for placed in result.records: + cursor = AFTER(placed.offset) + if placed.kind is not TransportRecordKind.DATA: + continue + minted = mint_cursor(_PROVIDER, placed.offset.token) + wire = _parse( + minted, await self._codec.decode(placed.payload), logger.warning + ) + if wire is None: + continue + for record in decoder.decode(minted, wire): + yield record + if result.pending is not None: + # A staged batch whose task History has not settled yet is a + # barrier: nothing past it is read until History says whether + # the task was accepted. + resolved = await _reconcile_output_stage( + backend=backend, + client=self._client, + workflow_id=self._workflow_id, + manifest=result.pending.manifest, + ) + if not resolved: + await asyncio.sleep(self._streams._poll.total_seconds()) + continue + if result.records: + continue + if closed: + return + # One more pass after learning the workflow closed, so a batch + # promoted between the read and the describe is not lost. + closed = await self._closed() + + async def _closed(self) -> bool: + handle = self._client.get_workflow_handle( + self._workflow_id, run_id=self._run_id + ) + try: + status = (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + # The run's History is gone; nothing more can be promoted. + return True + raise + if status is None or status == WorkflowExecutionStatus.RUNNING: + return False + # The streams are keyed by the chain, so a run that continued as new + # is not the end unless the handle was pinned to it. + return not ( + self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW + ) + + async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + """The cursor of the newest committed record on ``topic``, for following from now.""" + topic, _ = resolve_topic(topic) + backend = self._streams._require_backend() + chain = await _chain(self._client, self._workflow_id) + try: + tail = await backend.output_tail( + chain.stream_key(topic, direction=StreamDirection.OUTPUT) + ) + except TransportStreamError as error: + raise _storage_error(error, "the store's tail could not be read") from error + if tail.is_beginning: + return BEGINNING + assert tail.offset is not None + return mint_cursor(_PROVIDER, tail.offset.token) + + def producer( + self, + *, + topic: str | StreamTopic[Any], + producer_id: str = "", + attempt: int = 0, + ) -> RedisProducer[Any]: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + topic, _ = resolve_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return RedisProducer( + self._streams, self._client, self._workflow_id, topic, producer_id, attempt + ) + + +class RedisStreams(ProviderPlugin): + """The client-side provider over Redis streams. + + Construct one, pass it to the worker as a plugin and open handles from + it anywhere else. The Redis client is opened on first use, so it belongs + to the loop that uses it, and released by :meth:`close`; a ``backend`` + the caller hands in stays the caller's to close. + """ + + def __init__( + self, + *, + url: str = "redis://127.0.0.1:6379", + key_prefix: str = "temporal-streams", + idle_timeout: timedelta = timedelta(seconds=1), + backend: Any | None = None, + poll_interval: timedelta = timedelta(milliseconds=500), + ) -> None: + """Create the provider. + + Args: + url: The Redis to connect to when no ``backend`` is given. + key_prefix: Prepended to every key, so one Redis serves several + deployments. + idle_timeout: How long a workflow reader with nothing to read + holds its Workflow Task open before the worker parks it. + backend: A transport backend the caller constructed and owns. + poll_interval: How long an outside reader that is caught up waits + for a record before asking whether the workflow closed. + """ + self._url = url + self._key_prefix = key_prefix + self._idle_timeout = idle_timeout + self._backend = backend + self._owned_client: Any = None + self._poll = poll_interval + + def _require_backend(self) -> Any: + if self._backend is None: + import redis.asyncio + + from temporalio.contrib.external_workflow_streams._redis import ( + RedisStreamBackend, + ) + + # A dead peer would otherwise hold a blocking read open forever. + # Several block periods, so a healthy socket that is merely idle + # inside one read window is never abandoned. + self._owned_client = redis.asyncio.from_url( + self._url, + decode_responses=False, + socket_timeout=DEFAULT_WATCH_BLOCK.total_seconds() * 6, + ) + self._backend = RedisStreamBackend( + client=self._owned_client, key_prefix=self._key_prefix + ) + return self._backend + + def configure_worker(self, config: WorkerConfig) -> WorkerConfig: + """Set this provider and its transport backend on the worker.""" + config = super().configure_worker(config) + config["external_stream_backend"] = self._require_backend() + return config + + def configure_replayer(self, config: ReplayerConfig) -> ReplayerConfig: + """Set this provider and its transport backend on the replayer.""" + config = super().configure_replayer(config) + config["external_stream_backend"] = self._require_backend() + return config + + def workflow_provider(self) -> _RedisWorkflowProvider: + """The workflow half, over the transport's subscriptions and staged output.""" + return _RedisWorkflowProvider(self._idle_timeout) + + def get_stream_handle( + self, client: Client, workflow_id: str, *, run_id: str | None = None + ) -> RedisStreamHandle: + """A handle on ``workflow_id``'s topics; it follows the chain by construction.""" + return RedisStreamHandle(self, client, workflow_id, run_id) + + async def close(self) -> None: + """Release the Redis connections this provider opened.""" + client, self._owned_client = self._owned_client, None + if client is not None: + self._backend = None + await client.aclose() diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py new file mode 100644 index 000000000..994ef5309 --- /dev/null +++ b/tests/streams/test_redis_provider.py @@ -0,0 +1,45 @@ +"""What the Redis provider decides without a store: cursors and the sync publish.""" + +from __future__ import annotations + +import asyncio + +import pytest + +from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError +from temporalio.streams.providers.redis import _drive, _outside_position + + +def test_outside_cursors_name_output_positions(): + assert _outside_position(BEGINNING) is None + position = _outside_position(Cursor("redis:1700000000000-3")) + assert position is not None and position.token == "1700000000000-3" + # A workflow-side cursor names the input log, which outside code cannot + # read from, and a token another provider minted is refused the same way. + with pytest.raises(StreamCursorError): + _outside_position(Cursor("redis:in:1700000000000-3")) + with pytest.raises(StreamCursorError): + _outside_position(Cursor("memory:3")) + with pytest.raises(StreamCursorError): + _outside_position(Cursor("redis:not-an-id")) + + +def test_a_publish_that_completes_at_once_is_driven_to_the_end(): + done = [] + + async def publish() -> None: + done.append(True) + + _drive(publish()) + assert done == [True] + + +def test_a_publish_that_would_wait_fails_loudly(): + async def publish() -> None: + await asyncio.get_running_loop().create_future() + + async def run() -> None: + with pytest.raises(StreamError, match="batch is full"): + _drive(publish()) + + asyncio.run(run()) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py new file mode 100644 index 000000000..4ee50e68b --- /dev/null +++ b/tests/streams/test_redis_replay.py @@ -0,0 +1,207 @@ +"""Live checks for the client-side (Redis) provider inside a workflow. + +The conformance suite covers the outside surface when ``STREAMS_LIVE=redis``. +This module runs the interface loop inside a workflow over the staged commit, +lets a read end with the workflow, shares a topic between an outside producer +and the workflow, and queries a completed run, which replays it. All need a +dev server (``TEMPORAL_ADDRESS``) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or +``AI198_REDIS_URL``). The worker keeps a warm cache because the transport +holds the task open between records. +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from collections.abc import AsyncIterator +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.streams.providers.redis import RedisStreams +from temporalio.worker import Worker +from tests.streams.test_streams_conformance import take +from tests.streams.test_streams_workflow import ( + DECISIONS, + INPUTS, + ContractLoop, + OneLine, +) + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "redis", + reason="needs a live server and redis; run with STREAMS_LIVE=redis", +) + + +def redis_url() -> str: + return os.environ.get("TEMPORAL_TEST_REDIS_URL") or os.environ.get( + "AI198_REDIS_URL", "redis://127.0.0.1:6379" + ) + + +@pytest.fixture +async def provider() -> AsyncIterator[RedisStreams]: + # A prefix per case, because the store keeps what earlier cases wrote. + streams = RedisStreams( + url=redis_url(), key_prefix=f"streams-redis-{uuid.uuid4().hex}" + ) + try: + yield streams + finally: + await streams.close() + + +@pytest.fixture +async def live_client(client: Client) -> Client: + # The test environment's own server, unless TEMPORAL_ADDRESS names another. + address = os.environ.get("TEMPORAL_ADDRESS") + return await Client.connect(address) if address else client + + +async def test_interface_loop_over_redis(live_client: Client, provider: RedisStreams): + workflow_id = f"streams-redis-live-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[ContractLoop], + plugins=[provider], + max_cached_workflows=100, + ): + handle = await live_client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + await producer.append({"n": 3}) + await producer.finish() + + records = await take(stream.read(topic=DECISIONS), 4, 60) + assert [r.kind for r in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [r.value["decided"] for r in records[:3]] == [1, 2, 3] + assert all(r.producer_id == "" and r.topic == DECISIONS.name for r in records) + assert await handle.result() == [ + {"kind": "decision", "n": 1, "attempt": 1}, + {"kind": "decision", "n": 2, "attempt": 1}, + {"kind": "decision", "n": 3, "attempt": 1}, + {"kind": "finish", "producer": "model"}, + ] + + # The read ends by itself once the workflow is closed and every + # promoted record has been handed over. + async def read_everything() -> list[Any]: + return [ + r.value async for r in stream.read(topic=DECISIONS) + ] + + assert await asyncio.wait_for(read_everything(), 60) == [ + {"decided": 1}, + {"decided": 2}, + {"decided": 3}, + None, + ] + # The producer's own records are readable from outside as well, on + # the topic it wrote. + inputs = await take(stream.read(topic=INPUTS), 4, 60) + assert [r.value for r in inputs[:3]] == [{"n": 1}, {"n": 2}, {"n": 3}] + assert inputs[3].kind is RecordKind.FINISH + assert all(r.producer_id == "model" and r.attempt == 1 for r in inputs) + + +async def test_an_outside_producer_and_the_workflow_share_a_topic( + live_client: Client, provider: RedisStreams +): + workflow_id = f"streams-redis-shared-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[OneLine], + plugins=[provider], + ): + handle = await live_client.start_workflow( + OneLine.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + await stream.producer(topic=DECISIONS, producer_id="tool", attempt=1).append( + {"from": "producer"} + ) + await handle.result() + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DECISIONS)] + + records = await asyncio.wait_for(read_everything(), 60) + # Both writers land on one topic, each under its own identity. The order + # between them is whatever the store took first. + assert sorted( + ((r.producer_id, r.kind, r.value) for r in records), key=str + ) == sorted( + [ + ("tool", RecordKind.DATA, {"from": "producer"}), + ("", RecordKind.DATA, {"from": "workflow"}), + ("", RecordKind.FINISH, None), + ], + key=str, + ) + + +@workflow.defn +class SignalWokenPublish: + """Publishes in the task a signal wakes, then completes in that same task.""" + + def __init__(self) -> None: + self._closed = False + + @workflow.signal + def close(self) -> None: + self._closed = True + + @workflow.run + async def run(self) -> int: + out = workflow.stream_writer("out") + out.publish({"n": 0}) + await workflow.wait_condition(lambda: self._closed) + for n in range(1, 4): + out.publish({"n": n}) + return 4 + + @workflow.query + def probe(self) -> int: + return 1 + + +async def test_query_after_completion_replays_the_final_task( + live_client: Client, provider: RedisStreams +): + # A query against a completed run replays it. The final task's publishes + # were woken by a signal, which the activation applies before the replay + # marker, so the marker's expectations have to be installed before that + # task's code runs or the replay records nothing against a manifest of + # three. + workflow_id = f"streams-redis-replay-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[SignalWokenPublish], + plugins=[provider], + ): + handle = await live_client.start_workflow( + SignalWokenPublish.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + await take(stream.read(topic="out", result_type=dict), 1, timeout=60) + await handle.signal(SignalWokenPublish.close) + assert await handle.result() == 4 + assert await handle.query(SignalWokenPublish.probe) == 1 + values = [r.value async for r in stream.read(topic="out", result_type=dict)] + assert values == [{"n": 0}, {"n": 1}, {"n": 2}, {"n": 3}] diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9002ea16a..e4da91255 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,6 +21,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass @@ -28,8 +29,9 @@ import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.common import RawValue from temporalio.converter import DataConverter from temporalio.streams import ( @@ -46,6 +48,8 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.redis import RedisStreams +from tests.helpers import new_worker # Defined once and shared by every case, the way an application shares them # between its workflow, its activities and its backend. @@ -91,9 +95,61 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider.reset() +@workflow.defn +class StreamHost: + """Owns a stream and lingers, so outside code has a running workflow to address.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _redis_case(client: Client) -> AsyncIterator[ProviderCase]: + # The store is a Redis the test environment does not start; the server + # is the environment's own unless TEMPORAL_ADDRESS names another. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = RedisStreams( + url=os.environ.get("TEMPORAL_TEST_REDIS_URL") + or os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6379"), + # A prefix per setup, because the store keeps what earlier runs wrote. + key_prefix=f"streams-conformance-{uuid.uuid4().hex}", + ) + # Registered once, on the client: the host's worker inherits it and the + # cases open handles through client.get_stream_handle. + config = client.config() + config["plugins"] = [provider] + client = Client(**config) + hosts: dict[str, WorkflowHandle[Any, Any]] = {} + async with new_worker(client, StreamHost) as worker: + + async def host(workflow_id: str) -> None: + if workflow_id not in hosts: + hosts[workflow_id] = await client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + + yield ProviderCase("redis", provider, client, host=host) + for handle in hosts.values(): + await handle.terminate() + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ProviderCase]]] = { "memory": _memory_case } +if os.environ.get("STREAMS_LIVE") == "redis": + SETUPS["redis"] = _redis_case _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, From e578e679c0ce80fcdc33f9ac5eee6bf49c2fd3b8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:15:51 -0700 Subject: [PATCH 584/831] Seeded a Redis workflow reader from a cursor. The runtime and the manager already take a start cursor and the marker header records it; only subscribe() had no way to pass one. The provider now seeds the subscription from a redis:in: cursor, and refuses an outside cursor because the two streams number entries apart. --- .../contrib/external_workflow_streams/_api.py | 19 ++++- temporalio/streams/providers/redis.py | 43 +++++++--- .../external_workflow_streams/test_api.py | 18 +++++ tests/streams/test_redis_provider.py | 20 ++++- tests/streams/test_redis_replay.py | 81 ++++++++++++++++--- 5 files changed, 160 insertions(+), 21 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index 0a373b10b..1da059d80 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -35,6 +35,7 @@ classify_read_failure, ) from temporalio.contrib.external_workflow_streams._record import ( + Cursor, Offset, StreamRecord, ) @@ -95,6 +96,7 @@ def register( wait_id: int, stream_key: StreamKey, idle_timeout: timedelta, + start_cursor: Cursor | None = None, ) -> None: """Registers a wait with the Worker's subscription manager. @@ -267,7 +269,9 @@ class ExternalStreamTopic(Generic[AnyType]): value_type: type[AnyType] | None options: ExternalStreamOptions - def subscribe(self) -> ExternalStreamSubscription[AnyType]: + def subscribe( + self, *, start_cursor: Cursor | None = None + ) -> ExternalStreamSubscription[AnyType]: """Starts a new subscription and returns its async iterator. Each call is an **independent** subscription with its own ``wait_id``, @@ -278,6 +282,13 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: the same hazard class as timers and activities: inserting, removing, or reordering a ``subscribe()`` call renumbers every later wait in the Run and must be gated behind ``workflow.patched()``. + + Args: + start_cursor: The boundary the subscription begins after. ``None`` + resumes where the predecessor Run committed this wait, or at + ``BEGINNING`` on a first execution. A boundary the Workflow + names is recorded in the marker's header like the restored one, + so it must be derived deterministically: replay names it again. """ state = _run_state() if state.runtime is None: @@ -289,6 +300,11 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: state.next_wait_id += 1 stream_key = state.runtime.stream_key(self.name) + # Only a named boundary travels; the runtime derives the default itself + # from the predecessor Run's continuation. + start: dict[str, Any] = ( + {} if start_cursor is None else {"start_cursor": start_cursor} + ) state.runtime.register( wait_id=wait_id, stream_key=stream_key, @@ -299,6 +315,7 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: # `with_options` was given, so no configured value can ever reach # the reduction and every set parks after one second. idle_timeout=self.options.idle_timeout, + **start, ) # Registering a wait is not blocking on one. The quiescent snapshot is a # request to Core to retain the Workflow Task and, once the idle timer diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 0a345ae98..c6972cc84 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -23,9 +23,11 @@ is ``producer#attempt`` and every record carries a sequence, so a retried batch is dropped with the original position and a new attempt passes. - Cursors are ``redis:-`` on the outside surface and name a position - in the output stream. A workflow-side record carries ``redis:in:-`` - for information only: the transport starts a run's subscription where the - chain left off, so a workflow reader cannot resume from a cursor. + in the output stream. A workflow-side record carries ``redis:in:-``, + a position in the input stream, and only that form seeds a workflow reader: + the two streams number their entries independently, so an outside cursor + cannot stand in for one. A reader opened without a cursor starts where the + chain's predecessor run committed, which is the transport's own rule. - Streams are keyed by the chain's first run, so a handle follows continue-as- new by construction and ``run_id`` only decides whose close ends a read. - A task's publishes are staged as one batch. The transport's own per-task @@ -84,7 +86,6 @@ StreamError, StreamNotFoundError, StreamProducerError, - StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -141,6 +142,26 @@ def _outside_position(after: Cursor) -> Offset | None: return Offset(token) +def _workflow_position(after: Cursor) -> Offset | None: + """The input-stream offset a workflow reader's cursor names, or ``None`` for BEGINNING.""" + token = cursor_position(after, provider=_PROVIDER) + if token is None: + return None + if token.startswith(_INPUT_PREFIX): + entry = token[len(_INPUT_PREFIX) :] + if _REDIS_ID.fullmatch(entry): + return Offset(entry) + elif _REDIS_ID.fullmatch(token): + raise StreamCursorError( + f"cursor {after.token!r} names a position in the topic's output stream; " + "a workflow reader follows the input stream, whose entry ids differ, so " + "pass a cursor a workflow reader returned" + ) + raise StreamCursorError( + f"cursor {after.token!r} does not name a Redis stream position" + ) + + def _drive(coroutine: Coroutine[Any, Any, None]) -> None: """Run a transport publish to completion without yielding to the loop. @@ -209,12 +230,14 @@ def __init__(self, idle_timeout: timedelta) -> None: def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: _require_topic(topic) - if cursor_position(after, provider=_PROVIDER) is not None: - raise StreamUnsupportedError( - "the redis provider starts a run's subscription where the chain " - "left off; it cannot resume a workflow reader from a cursor" - ) - return _RedisReadSource(self._input.topic(topic, type=bytes).subscribe()) + position = _workflow_position(after) + # Without a position the transport resumes where the chain's + # predecessor run committed; with one, that is where the wait starts + # and what the marker's header records. + start = None if position is None else AFTER(position) + return _RedisReadSource( + self._input.topic(topic, type=bytes).subscribe(start_cursor=start) + ) def open_writer(self, topic: str) -> WriteSink: _require_topic(topic) diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 236d0b614..18095c310 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -30,6 +30,8 @@ ) from temporalio.contrib.external_workflow_streams._manager import PreparedRecord from temporalio.contrib.external_workflow_streams._record import ( + AFTER, + Cursor, Offset, RecordKind, StreamRecord, @@ -48,6 +50,7 @@ def __init__(self) -> None: #: `wait_id -> configured idle timeout`, so a test can see that the #: value `with_options` was given actually reached the Worker. self.idle_timeouts: dict[int, timedelta] = {} + self.start_cursors: dict[int, Cursor | None] = {} self.buffers: dict[int, list[StreamRecord]] = {} self.deliveries: list[tuple[int, StreamRecord]] = [] self.consumed: list[tuple[int, StreamRecord]] = [] @@ -72,9 +75,11 @@ def register( wait_id: int, stream_key: StreamKey, idle_timeout: timedelta, + start_cursor: Cursor | None = None, ) -> None: self.registrations.append((wait_id, stream_key)) self.idle_timeouts[wait_id] = idle_timeout + self.start_cursors[wait_id] = start_cursor def drain(self, wait_id: int, max_records: int | None = None) -> list[StreamRecord]: buffered = self.buffers.get(wait_id, []) @@ -192,6 +197,19 @@ def test_topics_inherit_their_options( assert subscription.idle_timeout == timedelta(seconds=3) +def test_a_subscription_may_name_the_boundary_it_starts_after( + runtime: FakeRuntime, +) -> None: + """A named boundary reaches the runtime; an unnamed one leaves the default to it.""" + boundary = AFTER(Offset("1700000000000-3")) + + seeded = external_stream.topic("tokens").subscribe(start_cursor=boundary) + default = external_stream.topic("tokens").subscribe() + + assert runtime.start_cursors[seeded.wait_id] == boundary + assert runtime.start_cursors[default.wait_id] is None + + # --- topics ------------------------------------------------------------------- diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 994ef5309..d4e215882 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -7,7 +7,11 @@ import pytest from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError -from temporalio.streams.providers.redis import _drive, _outside_position +from temporalio.streams.providers.redis import ( + _drive, + _outside_position, + _workflow_position, +) def test_outside_cursors_name_output_positions(): @@ -43,3 +47,17 @@ async def run() -> None: _drive(publish()) asyncio.run(run()) + + +def test_workflow_cursors_name_input_positions(): + assert _workflow_position(BEGINNING) is None + position = _workflow_position(Cursor("redis:in:1700000000000-3")) + assert position is not None and position.token == "1700000000000-3" + # An outside cursor names the output stream, whose entry ids are not the + # input stream's, so it cannot seed a workflow reader. + with pytest.raises(StreamCursorError, match="output stream"): + _workflow_position(Cursor("redis:1700000000000-3")) + with pytest.raises(StreamCursorError): + _workflow_position(Cursor("memory:3")) + with pytest.raises(StreamCursorError): + _workflow_position(Cursor("redis:in:not-an-id")) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 4ee50e68b..4871e1cfa 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -3,10 +3,10 @@ The conformance suite covers the outside surface when ``STREAMS_LIVE=redis``. This module runs the interface loop inside a workflow over the staged commit, lets a read end with the workflow, shares a topic between an outside producer -and the workflow, and queries a completed run, which replays it. All need a -dev server (``TEMPORAL_ADDRESS``) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or -``AI198_REDIS_URL``). The worker keeps a warm cache because the transport -holds the task open between records. +and the workflow, queries a completed run, which replays it, and seeds a +workflow reader from a cursor. All need a dev server (``TEMPORAL_ADDRESS``) +and a Redis (``TEMPORAL_TEST_REDIS_URL`` or ``AI198_REDIS_URL``). The worker +keeps a warm cache because the transport holds the task open between records. """ from __future__ import annotations @@ -21,9 +21,9 @@ from temporalio import workflow from temporalio.client import Client -from temporalio.streams import RecordKind +from temporalio.streams import BEGINNING, Cursor, RecordKind from temporalio.streams.providers.redis import RedisStreams -from temporalio.worker import Worker +from temporalio.worker import Replayer, Worker from tests.streams.test_streams_conformance import take from tests.streams.test_streams_workflow import ( DECISIONS, @@ -100,9 +100,7 @@ async def test_interface_loop_over_redis(live_client: Client, provider: RedisStr # The read ends by itself once the workflow is closed and every # promoted record has been handed over. async def read_everything() -> list[Any]: - return [ - r.value async for r in stream.read(topic=DECISIONS) - ] + return [r.value async for r in stream.read(topic=DECISIONS)] assert await asyncio.wait_for(read_everything(), 60) == [ {"decided": 1}, @@ -205,3 +203,68 @@ async def test_query_after_completion_replays_the_final_task( assert await handle.query(SignalWokenPublish.probe) == 1 values = [r.value async for r in stream.read(topic="out", result_type=dict)] assert values == [{"n": 0}, {"n": 1}, {"n": 2}, {"n": 3}] + + +@workflow.defn +class ResumeAfter: + """Reads ``inputs``; the first run hands its first record's cursor to the next.""" + + def __init__(self) -> None: + self._seen: list[int] = [] + + @workflow.query + def seen(self) -> list[int]: + return self._seen + + @workflow.run + async def run(self, after: str | None) -> list[int]: + reader = workflow.stream_reader( + INPUTS, after=Cursor(after) if after else BEGINNING + ) + first: str | None = None + async for record in reader: + if record.kind is RecordKind.FINISH: + break + assert record.value is not None + self._seen.append(record.value["n"]) + first = first or record.cursor.token + if after is None and len(self._seen) == 2: + workflow.continue_as_new(first) + return self._seen + + +async def test_a_workflow_reader_started_from_a_cursor_skips_the_earlier_records( + live_client: Client, provider: RedisStreams +): + # The first run reads two records and continues as new with the cursor of + # the first. Without the cursor the successor would resume after the + # second, which is where the chain left off; with it, it reads the second + # again and then the rest. + workflow_id = f"streams-redis-resume-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[ResumeAfter], + plugins=[provider], + max_cached_workflows=100, + ): + handle = await live_client.start_workflow( + ResumeAfter.run, None, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + await producer.finish() + assert await handle.result() == [2, 3] + # The completed run is evicted, so the query replays it cold with the + # seeded position and the recorded ranges. + assert await handle.query(ResumeAfter.seen) == [2, 3] + + # Both runs replay offline against the store, the seeded one included. + replayer = Replayer(workflows=[ResumeAfter], plugins=[provider]) + await replayer.replay_workflow( + await live_client.get_workflow_handle( + workflow_id, run_id=handle.first_execution_run_id + ).fetch_history() + ) + await replayer.replay_workflow(await handle.fetch_history()) From 84c77d4faa185bc4d0e3d67170f1856b51bcaaae Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:15:51 -0700 Subject: [PATCH 585/831] Trimmed the Redis streams by retention on every append. RedisStreams(retention=, max_len=) trims a topic's input and output keys behind every append the provider makes, exactly, because the approximate trim never fires on a stream shorter than a macro node. A backend that can tell a recorded range is gone now reports the loss itself rather than having it filed under a transient storage failure. --- .../external_workflow_streams/_replay.py | 4 +- temporalio/streams/providers/redis.py | 167 ++++++++++++++++- tests/streams/test_redis_provider.py | 13 ++ tests/streams/test_redis_replay.py | 169 +++++++++++++++++- 4 files changed, 339 insertions(+), 14 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_replay.py b/temporalio/contrib/external_workflow_streams/_replay.py index f136c9cbb..ac293c172 100644 --- a/temporalio/contrib/external_workflow_streams/_replay.py +++ b/temporalio/contrib/external_workflow_streams/_replay.py @@ -252,7 +252,9 @@ async def _read_range( """ try: return await backend.read_range(key, run.first_offset, run.last_offset) - except StreamStorageError: + except (StreamStorageError, StreamIntegrityError): + # A backend that can tell the range is gone reports the loss itself; + # wrapping it would file a permanent loss under a transient failure. raise except Exception as err: # Not integrity loss: nothing has been shown to be missing, only diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index c6972cc84..f67c11b6e 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -34,6 +34,11 @@ batch limits are lifted for this provider, because a synchronous publish cannot wait for the worker to stage a full batch; a batch it cannot stage fails the task. +- Retention is trimming, with no consumer floor. When ``retention`` or + ``max_len`` is set, every append the provider makes trims the key it wrote, + whatever any reader has reached. A replay that reaches a recorded range the + trim removed fails its Workflow Task, an outside cursor below the trim is + refused, and a fully trimmed topic reads as empty. """ from __future__ import annotations @@ -42,7 +47,7 @@ import logging import re import time -from collections.abc import AsyncGenerator, Coroutine +from collections.abc import AsyncGenerator, Coroutine, Sequence from datetime import timedelta from typing import Any, Generic, TypeVar @@ -74,11 +79,21 @@ from temporalio.contrib.external_workflow_streams import ( StreamError as TransportStreamError, ) -from temporalio.contrib.external_workflow_streams._backend import DEFAULT_WATCH_BLOCK +from temporalio.contrib.external_workflow_streams._backend import ( + DEFAULT_WATCH_BLOCK, + StreamKey, +) from temporalio.contrib.external_workflow_streams._codec import StreamPayloadCodec +from temporalio.contrib.external_workflow_streams._errors import StreamIntegrityError +from temporalio.contrib.external_workflow_streams._output_backend import ( + OutputStage, + OutputStageManifest, + StagedOutputRecord, +) from temporalio.contrib.external_workflow_streams._output_client import ( _reconcile_output_stage, ) +from temporalio.contrib.external_workflow_streams._redis import RedisStreamBackend from temporalio.converter import WorkflowSerializationContext from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import ( @@ -162,6 +177,101 @@ def _workflow_position(after: Cursor) -> Offset | None: ) +def _entry_id(token: str | bytes) -> tuple[int, int]: + """A Redis entry id as the ``(ms, seq)`` pair it orders by.""" + text = token.decode() if isinstance(token, bytes) else token + ms, _, seq = text.partition("-") + return int(ms), int(seq or 0) + + +class _RetainingBackend(RedisStreamBackend): + """The transport's Redis backend, trimming the key behind every append it makes. + + Trims are exact rather than approximate: Redis's approximate trim drops + whole macro nodes only, so a stream shorter than one node, a hundred + entries by default, would never trim and the window would not mean what + it says. Only the streams are trimmed; the idempotency and stage hashes + beside them keep one entry per record and stage. + """ + + def __init__( + self, + *, + client: Any, + key_prefix: str, + retention: timedelta | None, + max_len: int | None, + ) -> None: + super().__init__(client=client, key_prefix=key_prefix) + self._retention = retention + self._max_len = max_len + + def describe_window(self) -> str: + """The configured window, for messages.""" + parts = [] + if self._retention is not None: + parts.append(f"retention={self._retention}") + if self._max_len is not None: + parts.append(f"max_len={self._max_len}") + return ", ".join(parts) or "no retention" + + async def append(self, key: StreamKey, record: Any) -> Any: + placed = await super().append(key, record) + await self._trim(key) + return placed + + async def stage_output( + self, manifest: OutputStageManifest, records: Sequence[StagedOutputRecord] + ) -> OutputStage: + stage = await super().stage_output(manifest, records) + await self._trim(manifest.stream_key) + return stage + + async def read_range(self, key: StreamKey, first: Offset, last: Offset) -> Any: + # The replay read. Said here, where the trim is known, rather than left + # to the range checks, which can only report the record as missing. + if not await self.retains(key, first): + raise StreamIntegrityError( + f"the recorded range [{first}, {last}] on topic " + f"{key.stream_name!r} is past the redis provider's retention " + f"({self.describe_window()}): the records were trimmed, so this " + "run cannot be replayed" + ) + return await super().read_range(key, first, last) + + async def retains(self, key: StreamKey, offset: Offset) -> bool: + """Whether the record at ``offset`` survived trimming. + + A record at or after the first retained entry is there. On an emptied + stream the last id Redis generated says whether the record ever was. + """ + from redis.exceptions import ResponseError + + try: + info = await self._client.xinfo_stream(self.stream_key(key)) + except ResponseError as error: + if "no such key" in str(error).lower(): + return True + raise + wanted = _entry_id(offset.token) + first = info.get("first-entry") + if first: + return _entry_id(first[0]) <= wanted + return wanted > _entry_id(info["last-generated-id"]) + + async def _trim(self, key: StreamKey) -> None: + name = self.stream_key(key) + if self._retention is not None: + # The worker's clock names the floor, so a skewed worker shifts + # the window by its skew. + floor = int((time.time() - self._retention.total_seconds()) * 1000) + await self._client.xtrim( + name, minid=f"{max(floor, 0)}-0", approximate=False + ) + if self._max_len is not None: + await self._client.xtrim(name, maxlen=self._max_len, approximate=False) + + def _drive(coroutine: Coroutine[Any, Any, None]) -> None: """Run a transport publish to completion without yielding to the loop. @@ -504,6 +614,17 @@ async def _read( backend = self._streams._require_backend() chain = await _chain(self._client, self._workflow_id) key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) + if ( + position is not None + and isinstance(backend, _RetainingBackend) + and not await backend.retains(key, position) + ): + # Refused rather than resumed from the first retained record, + # which would skip whatever the trim took in between. + raise StreamCursorError( + f"cursor {after.token!r} names a record on {topic!r} that the " + f"provider's retention has trimmed ({backend.describe_window()})" + ) cursor = TRANSPORT_BEGINNING if position is None else AFTER(position) closed = False while True: @@ -616,6 +737,8 @@ def __init__( idle_timeout: timedelta = timedelta(seconds=1), backend: Any | None = None, poll_interval: timedelta = timedelta(milliseconds=500), + retention: timedelta | None = None, + max_len: int | None = None, ) -> None: """Create the provider. @@ -625,25 +748,48 @@ def __init__( deployments. idle_timeout: How long a workflow reader with nothing to read holds its Workflow Task open before the worker parks it. - backend: A transport backend the caller constructed and owns. + backend: A transport backend the caller constructed and owns. It + is trimmed by its owner, so it takes neither ``retention`` nor + ``max_len``. poll_interval: How long an outside reader that is caught up waits for a record before asking whether the workflow closed. + retention: Trim records older than this from a topic's input and + output keys on every append the provider makes to them. This + is retention without a consumer floor: nothing holds a record + for a reader that has not reached it. A workflow whose replay + reaches a recorded range past the window fails its Workflow + Task with the transport's ``StreamIntegrityError`` until the + window is raised, an outside ``read(after=)`` below the window + raises ``StreamCursorError``, and a live reader that falls + behind the window misses records. The floor the server-side + provider keeps would need a consumer registry in Redis. + max_len: Keep at most this many entries per key, trimmed on the + same appends and with the same consequences. It must exceed + the largest batch a task publishes, or a stage is trimmed + before its commit. """ + if retention is not None and retention <= timedelta(0): + raise ValueError("retention must be positive") + if max_len is not None and max_len < 1: + raise ValueError("max_len must be positive") + if backend is not None and (retention is not None or max_len is not None): + raise ValueError( + "retention and max_len trim the backend this provider opens; a " + "backend handed in is trimmed by its owner" + ) self._url = url self._key_prefix = key_prefix self._idle_timeout = idle_timeout self._backend = backend self._owned_client: Any = None self._poll = poll_interval + self._retention = retention + self._max_len = max_len def _require_backend(self) -> Any: if self._backend is None: import redis.asyncio - from temporalio.contrib.external_workflow_streams._redis import ( - RedisStreamBackend, - ) - # A dead peer would otherwise hold a blocking read open forever. # Several block periods, so a healthy socket that is merely idle # inside one read window is never abandoned. @@ -652,8 +798,11 @@ def _require_backend(self) -> Any: decode_responses=False, socket_timeout=DEFAULT_WATCH_BLOCK.total_seconds() * 6, ) - self._backend = RedisStreamBackend( - client=self._owned_client, key_prefix=self._key_prefix + self._backend = _RetainingBackend( + client=self._owned_client, + key_prefix=self._key_prefix, + retention=self._retention, + max_len=self._max_len, ) return self._backend diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index d4e215882..ac4919c81 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -3,11 +3,13 @@ from __future__ import annotations import asyncio +from datetime import timedelta import pytest from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError from temporalio.streams.providers.redis import ( + RedisStreams, _drive, _outside_position, _workflow_position, @@ -61,3 +63,14 @@ def test_workflow_cursors_name_input_positions(): _workflow_position(Cursor("memory:3")) with pytest.raises(StreamCursorError): _workflow_position(Cursor("redis:in:not-an-id")) + + +def test_retention_options_are_checked_at_construction(): + with pytest.raises(ValueError, match="retention"): + RedisStreams(retention=timedelta(0)) + with pytest.raises(ValueError, match="max_len"): + RedisStreams(max_len=0) + # A backend the caller owns is the caller's to trim. + with pytest.raises(ValueError, match="trimmed by its owner"): + RedisStreams(backend=object(), max_len=10) + RedisStreams(retention=timedelta(hours=1), max_len=10) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 4871e1cfa..167b0e310 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -3,7 +3,8 @@ The conformance suite covers the outside surface when ``STREAMS_LIVE=redis``. This module runs the interface loop inside a workflow over the staged commit, lets a read end with the workflow, shares a topic between an outside producer -and the workflow, queries a completed run, which replays it, and seeds a +and the workflow, queries a completed run, which replays it, trims by +retention and shows what a replay and a read past the trim do, and seeds a workflow reader from a cursor. All need a dev server (``TEMPORAL_ADDRESS``) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or ``AI198_REDIS_URL``). The worker keeps a warm cache because the transport holds the task open between records. @@ -15,16 +16,18 @@ import os import uuid from collections.abc import AsyncIterator +from datetime import timedelta from typing import Any import pytest from temporalio import workflow from temporalio.client import Client -from temporalio.streams import BEGINNING, Cursor, RecordKind -from temporalio.streams.providers.redis import RedisStreams +from temporalio.contrib.external_workflow_streams import StreamDirection +from temporalio.streams import BEGINNING, Cursor, RecordKind, StreamCursorError +from temporalio.streams.providers.redis import RedisStreams, _chain from temporalio.worker import Replayer, Worker -from tests.streams.test_streams_conformance import take +from tests.streams.test_streams_conformance import StreamHost, take from tests.streams.test_streams_workflow import ( DECISIONS, INPUTS, @@ -205,6 +208,164 @@ async def test_query_after_completion_replays_the_final_task( assert values == [{"n": 0}, {"n": 1}, {"n": 2}, {"n": 3}] +async def _key_lengths( + streams: RedisStreams, client: Client, workflow_id: str, topic: str +) -> tuple[int, int]: + """How many entries the topic's input and output keys hold.""" + import redis.asyncio + + backend = streams._require_backend() + chain = await _chain(client, workflow_id) + store = redis.asyncio.from_url(redis_url()) + try: + return ( + await store.xlen( + backend.stream_key( + chain.stream_key(topic, direction=StreamDirection.INPUT) + ) + ), + await store.xlen( + backend.stream_key( + chain.stream_key(topic, direction=StreamDirection.OUTPUT) + ) + ), + ) + finally: + await store.aclose() + + +async def _trim_everything( + streams: RedisStreams, client: Client, workflow_id: str, topic: str +) -> None: + """What retention elsewhere, or an operator, does to a topic's output key.""" + import redis.asyncio + + backend = streams._require_backend() + chain = await _chain(client, workflow_id) + store = redis.asyncio.from_url(redis_url()) + try: + await store.xtrim( + backend.stream_key( + chain.stream_key(topic, direction=StreamDirection.OUTPUT) + ), + maxlen=0, + approximate=False, + ) + finally: + await store.aclose() + + +async def test_a_replay_past_the_retention_window_fails_loudly(live_client: Client): + # Six entries per key: the loop's four input records stay while it runs, + # and six more appends afterwards push them out. + streams = RedisStreams( + url=redis_url(), key_prefix=f"streams-redis-{uuid.uuid4().hex}", max_len=6 + ) + workflow_id = f"streams-redis-retention-{uuid.uuid4().hex}" + try: + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[ContractLoop], + plugins=[streams], + max_cached_workflows=100, + ): + handle = await live_client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = streams.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + await producer.finish() + assert len(await handle.result()) == 4 + before = await take(stream.read(topic=INPUTS), 4, 60) + history = await handle.fetch_history() + assert await _key_lengths(streams, live_client, workflow_id, INPUTS.name) == ( + 4, + 4, + ) + + # Inside the window the recorded ranges read back and the replay passes. + await Replayer(workflows=[ContractLoop], plugins=[streams]).replay_workflow( + history + ) + + late = stream.producer(topic=INPUTS, producer_id="late", attempt=1) + cursors = [await late.append({"n": n}) for n in range(10, 16)] + assert await _key_lengths(streams, live_client, workflow_id, INPUTS.name) == ( + 6, + 6, + ) + + # The recorded input ranges are gone, and the replay says so rather + # than delivering fewer records. + with pytest.raises(Exception) as failure: + await Replayer(workflows=[ContractLoop], plugins=[streams]).replay_workflow( + history + ) + # The task fails under the transport's integrity row: its type, the + # external storage cause, and a message that names the window. + message = str(failure.value) + assert "StreamIntegrityError" in message and "ExternalStorageFailure" in message + assert "past the redis provider's retention (max_len=6)" in message + + # An outside cursor below the trim is refused, not resumed from the + # first retained record. + with pytest.raises(StreamCursorError, match="retention has trimmed"): + await take(stream.read(topic=INPUTS, after=before[0].cursor), 1, 10) + + # Inside the window a read still works and lands where append said. + records = [r async for r in stream.read(topic=INPUTS, after=cursors[1])] + assert [r.value for r in records] == [{"n": n} for n in range(12, 16)] + assert [r.cursor for r in records] == cursors[2:] + finally: + await streams.close() + + +async def test_retention_by_age_trims_older_entries(live_client: Client): + streams = RedisStreams( + url=redis_url(), + key_prefix=f"streams-redis-{uuid.uuid4().hex}", + retention=timedelta(milliseconds=300), + ) + workflow_id = f"streams-redis-age-{uuid.uuid4().hex}" + try: + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[streams], + ): + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = streams.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + first = await producer.append({"n": 1}) + await producer.append({"n": 2}) + await asyncio.sleep(0.6) + # The append that crosses the window is what trims the two before it. + third = await producer.append({"n": 3}) + assert await _key_lengths( + streams, live_client, workflow_id, INPUTS.name + ) == ( + 1, + 1, + ) + assert await stream.latest(topic=INPUTS) == third + with pytest.raises(StreamCursorError, match="retention has trimmed"): + await take(stream.read(topic=INPUTS, after=first), 1, 10) + + # A fully trimmed topic answers the way an empty one does. + await _trim_everything(streams, live_client, workflow_id, INPUTS.name) + assert await stream.latest(topic=INPUTS) == BEGINNING + await handle.signal(StreamHost.release) + await handle.result() + assert [r async for r in stream.read(topic=INPUTS)] == [] + finally: + await streams.close() + + @workflow.defn class ResumeAfter: """Reads ``inputs``; the first run hands its first record's cursor to the next.""" From 676ac98ecd98c60ec0304092286455e8cebe2353 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:12:22 -0700 Subject: [PATCH 586/831] Split the stream internals tests out of the conformance suite. The conformance file is what a new provider has to answer, so the cases that unit-test the shared wire, policy and id helpers belong beside them rather than in it. --- tests/streams/test_streams_conformance.py | 86 ++------------------ tests/streams/test_streams_internals.py | 95 +++++++++++++++++++++++ 2 files changed, 101 insertions(+), 80 deletions(-) create mode 100644 tests/streams/test_streams_internals.py diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index a9dcae815..43b30a973 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -9,11 +9,12 @@ ``reports_positions`` are skipped with a reason on a provider whose ``append()`` learns positions at read time. -What this file pins down is the contract: the record on the wire, producer -identity, retry deduplication, positions, supersession, topic addressing, -cursor resumption, cursor ownership, and store keys that cannot collide. The -workflow-side handles and the two rules about Workflow Tasks live in -``test_streams_workflow``. +What this file pins down is what a provider owes: producer identity, retry +deduplication, positions, supersession, topic addressing, cursor resumption +and cursor ownership. Every case here goes through the public surface, so a new provider answers this file and +nothing else. The shared pieces no provider implements are unit-tested in +``test_streams_internals``; the workflow-side handles and the two rules about +Workflow Tasks live in ``test_streams_workflow``. """ from __future__ import annotations @@ -29,7 +30,6 @@ from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.common import RawValue -from temporalio.converter import DataConverter from temporalio.streams import ( BEGINNING, Cursor, @@ -38,11 +38,8 @@ StreamHandle, StreamProvider, Supersession, - _ids, - _wire, topic, ) -from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams # Defined once and shared by every case, the way an application shares them @@ -119,77 +116,6 @@ async def _collect() -> None: return out -def test_record_roundtrips_through_the_wire(): - converter = DataConverter.default.payload_converter - wire = _wire.to_wire( - converter, - topic="decisions", - kind=RecordKind.DATA, - value={"n": 1}, - producer_id="model", - attempt=3, - sequence=7, - ) - parsed = _wire.WireRecord.FromString(wire.SerializeToString()) - record = _wire.from_wire(converter, Cursor("memory:0"), parsed, dict) - assert ( - record.kind, - record.topic, - record.producer_id, - record.attempt, - record.sequence, - record.value, - ) == (RecordKind.DATA, "decisions", "model", 3, 7, {"n": 1}) - assert record.supersession is None - finish = _wire.to_wire(converter, topic="decisions", kind=RecordKind.FINISH) - assert not finish.HasField("body") - assert _wire.from_wire(converter, Cursor("memory:1"), finish, dict).value is None - - -def test_a_stored_supersession_is_not_a_record(): - converter = DataConverter.default.payload_converter - wire = _wire.WireRecord(topic="t", kind=int(RecordKind.SUPERSEDED)) # type: ignore[arg-type] - with pytest.raises(ValueError, match="synthesized"): - _wire.from_wire(converter, Cursor("memory:0"), wire, None) - - -def test_an_unset_kind_is_read_as_data(): - converter = DataConverter.default.payload_converter - wire = _wire.WireRecord(topic="t", body=converter.to_payloads([{"n": 1}])[0]) - record = _wire.from_wire(converter, Cursor("memory:0"), wire, dict) - assert record.kind is RecordKind.DATA - assert record.value == {"n": 1} - - -def test_supersession_is_synthesized_from_observations(): - attempts = AttemptTracker() - assert attempts.note("model", 1, topic="t", previous=BEGINNING) is None - superseded = attempts.note("model", 2, topic="t", previous=Cursor("memory:0")) - assert superseded is not None - assert superseded.kind is RecordKind.SUPERSEDED - assert superseded.supersession == Supersession("model", 1, 2) - assert superseded.value is None - # Positioned before the triggering record, so a resume after it delivers - # that record next. - assert superseded.cursor == Cursor("memory:0") - # The same attempt again is not a new generation. - assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None - - -def test_topic_keys_cannot_collide(): - # A colon in a workflow id must not make two addresses one key. - assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") - assert _ids.topic_key("a%3Ab", "c") != _ids.topic_key("a:b", "c") - assert _ids.topic_key("wf", "inputs") == "wf:inputs" - - -def test_cursors_name_their_provider(): - assert _wire.cursor_position(BEGINNING, provider="memory") is None - assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" - with pytest.raises(StreamCursorError): - _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") - - async def test_append_read_roundtrip(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) diff --git a/tests/streams/test_streams_internals.py b/tests/streams/test_streams_internals.py new file mode 100644 index 000000000..3f3019336 --- /dev/null +++ b/tests/streams/test_streams_internals.py @@ -0,0 +1,95 @@ +"""Unit tests for the pieces under ``temporalio.streams`` that no provider owns. + +The wire format, the supersession policy, the store key and the cursor prefix +are shared by every provider and implemented once, so they are tested once, +here, against the private modules. What a provider owes +is in ``test_streams_conformance``; keeping the two apart is what makes that +file answerable by a new provider. +""" + +from __future__ import annotations + +import pytest + +from temporalio.converter import DataConverter +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + Supersession, + _ids, + _wire, +) +from temporalio.streams._policy import AttemptTracker + + +def test_record_roundtrips_through_the_wire(): + converter = DataConverter.default.payload_converter + wire = _wire.to_wire( + converter, + topic="decisions", + kind=RecordKind.DATA, + value={"n": 1}, + producer_id="model", + attempt=3, + sequence=7, + ) + parsed = _wire.WireRecord.FromString(wire.SerializeToString()) + record = _wire.from_wire(converter, Cursor("memory:0"), parsed, dict) + assert ( + record.kind, + record.topic, + record.producer_id, + record.attempt, + record.sequence, + record.value, + ) == (RecordKind.DATA, "decisions", "model", 3, 7, {"n": 1}) + assert record.supersession is None + finish = _wire.to_wire(converter, topic="decisions", kind=RecordKind.FINISH) + assert not finish.HasField("body") + assert _wire.from_wire(converter, Cursor("memory:1"), finish, dict).value is None + + +def test_a_stored_supersession_is_not_a_record(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", kind=int(RecordKind.SUPERSEDED)) # type: ignore[arg-type] + with pytest.raises(ValueError, match="synthesized"): + _wire.from_wire(converter, Cursor("memory:0"), wire, None) + + +def test_an_unset_kind_is_read_as_data(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", body=converter.to_payloads([{"n": 1}])[0]) + record = _wire.from_wire(converter, Cursor("memory:0"), wire, dict) + assert record.kind is RecordKind.DATA + assert record.value == {"n": 1} + + +def test_supersession_is_synthesized_from_observations(): + attempts = AttemptTracker() + assert attempts.note("model", 1, topic="t", previous=BEGINNING) is None + superseded = attempts.note("model", 2, topic="t", previous=Cursor("memory:0")) + assert superseded is not None + assert superseded.kind is RecordKind.SUPERSEDED + assert superseded.supersession == Supersession("model", 1, 2) + assert superseded.value is None + # Positioned before the triggering record, so a resume after it delivers + # that record next. + assert superseded.cursor == Cursor("memory:0") + # The same attempt again is not a new generation. + assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None + + +def test_topic_keys_cannot_collide(): + # A colon in a workflow id must not make two addresses one key. + assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") + assert _ids.topic_key("a%3Ab", "c") != _ids.topic_key("a:b", "c") + assert _ids.topic_key("wf", "inputs") == "wf:inputs" + + +def test_cursors_name_their_provider(): + assert _wire.cursor_position(BEGINNING, provider="memory") is None + assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" + with pytest.raises(StreamCursorError): + _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") From cf4ab8d68abb193bf61c091fccab426bf1eba9bc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:12:29 -0700 Subject: [PATCH 587/831] Refused a second provider on the stream registration slot. There is one slot and it decides where a client, worker or replayer reads and publishes, so a plugin that overwrites another provider's registration silently is a configuration bug with nothing to see. --- temporalio/streams/providers/__init__.py | 43 ++++++++++++++++++++---- tests/streams/test_streams_internals.py | 30 +++++++++++++++-- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/temporalio/streams/providers/__init__.py b/temporalio/streams/providers/__init__.py index 7aaa5a9b1..fcefdaa1b 100644 --- a/temporalio/streams/providers/__init__.py +++ b/temporalio/streams/providers/__init__.py @@ -45,9 +45,32 @@ class supplies the plugin hooks, so ``Client.connect(plugins=[provider])``, interceptor that calls the workflow half's lifecycle hooks. """ + def _claim(self, held: StreamProvider | None) -> StreamProvider: + """This provider, unless another one already holds the slot. + + There is one slot and it decides where every workflow on the thing + being configured reads and publishes. A last-write-wins here would + silently drop a provider the user passed by hand or a second provider + plugin, so say it instead; a process that talks to two stores opens + the other one's handles from the provider object. + + Raises: + ValueError: Another provider already holds the slot. + """ + if held is not None and held is not self: + raise ValueError( + f"stream provider {held!r} is already registered; pass one provider " + f"and open the other's handles from the object itself" + ) + return self + def configure_client(self, config: ClientConfig) -> ClientConfig: - """Set this provider as the client's ``stream_provider``.""" - config["stream_provider"] = self + """Set this provider as the client's ``stream_provider``. + + Raises: + ValueError: Another provider already holds the slot. + """ + config["stream_provider"] = self._claim(config.get("stream_provider")) return config async def connect_service_client( @@ -59,13 +82,21 @@ async def connect_service_client( return await next(config) def configure_worker(self, config: WorkerConfig) -> WorkerConfig: - """Set this provider as the worker's ``stream_provider``.""" - config["stream_provider"] = self + """Set this provider as the worker's ``stream_provider``. + + Raises: + ValueError: Another provider already holds the slot. + """ + config["stream_provider"] = self._claim(config.get("stream_provider")) return config def configure_replayer(self, config: ReplayerConfig) -> ReplayerConfig: - """Set this provider as the replayer's ``stream_provider``.""" - config["stream_provider"] = self + """Set this provider as the replayer's ``stream_provider``. + + Raises: + ValueError: Another provider already holds the slot. + """ + config["stream_provider"] = self._claim(config.get("stream_provider")) return config async def run_worker( diff --git a/tests/streams/test_streams_internals.py b/tests/streams/test_streams_internals.py index 3f3019336..e0a69394d 100644 --- a/tests/streams/test_streams_internals.py +++ b/tests/streams/test_streams_internals.py @@ -1,8 +1,8 @@ """Unit tests for the pieces under ``temporalio.streams`` that no provider owns. -The wire format, the supersession policy, the store key and the cursor prefix -are shared by every provider and implemented once, so they are tested once, -here, against the private modules. What a provider owes +The wire format, the supersession policy, the store key, the cursor prefix and +the plugin registration are shared by every provider and implemented once, so +they are tested once, here, against the private modules. What a provider owes is in ``test_streams_conformance``; keeping the two apart is what makes that file answerable by a new provider. """ @@ -11,6 +11,7 @@ import pytest +from temporalio.client import ClientConfig from temporalio.converter import DataConverter from temporalio.streams import ( BEGINNING, @@ -22,6 +23,8 @@ _wire, ) from temporalio.streams._policy import AttemptTracker +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.worker import ReplayerConfig, WorkerConfig def test_record_roundtrips_through_the_wire(): @@ -93,3 +96,24 @@ def test_cursors_name_their_provider(): assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" with pytest.raises(StreamCursorError): _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") + + +def test_registering_a_provider_twice_is_refused(): + # There is one slot on each of the three, and a user who passes a provider + # by hand and a provider plugin, or two provider plugins, meant both. + first, second = MemoryStreams(), MemoryStreams() + with pytest.raises(ValueError, match="already registered"): + second.configure_client(ClientConfig(stream_provider=first)) # type: ignore[typeddict-item] + with pytest.raises(ValueError, match="already registered"): + second.configure_worker(WorkerConfig(stream_provider=first)) # type: ignore[typeddict-item] + with pytest.raises(ValueError, match="already registered"): + second.configure_replayer(ReplayerConfig(stream_provider=first)) # type: ignore[typeddict-item] + + +def test_registering_the_same_provider_twice_is_fine(): + # A worker built from a client that already carries the plugin configures + # it again with the same object, which is not a conflict. + provider = MemoryStreams() + config = provider.configure_client(ClientConfig(stream_provider=provider)) # type: ignore[typeddict-item] + assert config.get("stream_provider") is provider + assert provider.configure_client(ClientConfig()).get("stream_provider") is provider # type: ignore[typeddict-item] From 3495053ae800946941de4068422860319d52573f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:12:52 -0700 Subject: [PATCH 588/831] Refused a divergent producer retry instead of dropping it. A repeat at a sequence the store already holds is only a retry when it carries the same content; answering a different one with the original position drops a record the writer meant to send. --- temporalio/streams/__init__.py | 5 ++- temporalio/streams/_provider.py | 12 ++++-- temporalio/streams/providers/memory.py | 52 ++++++++++++++++++----- tests/streams/conftest.py | 5 +++ tests/streams/test_memory_provider.py | 31 ++++++++++++++ tests/streams/test_streams_conformance.py | 27 +++++++++++- 6 files changed, 116 insertions(+), 16 deletions(-) create mode 100644 tests/streams/test_memory_provider.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index b23c95be4..b76a18ef1 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -21,7 +21,10 @@ outside process writes through a :class:`StreamProducer` with a producer id, an attempt and a sequence, and its records are visible as soon as the store accepts them. Those three let a reader tell a retry from a new - generation. + generation. A retry that carries the same content is written once; one that + carries different content at the same sequence is refused with + :class:`StreamProducerError`, so a divergent retry is never dropped in + silence. 4. **A cursor is opaque and belongs to its provider.** Hand it back to resume strictly after the record it names; :meth:`StreamHandle.latest` positions a follower. Do not compare two cursors or do arithmetic on one. diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 8c142080d..2c57125c0 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -61,9 +61,15 @@ def attempt(self) -> int: async def append(self, *values: T_contra) -> Cursor | None: """Append ``values`` and return the cursor of the last record as the store holds it. - A repeat of an earlier append (same producer, attempt and sequence) is - written once and returns the position the original landed at. An - empty call writes nothing and returns the same value a repeat would: + A repeat of an earlier append (same producer, attempt and sequence) + carrying the same content is written once and returns the position the + original landed at. A repeat carrying different content is a conflict, + not a retry: it raises :class:`StreamProducerError` and writes nothing, + because the store cannot tell which of the two the reader was meant to + see. A provider that cannot compare content says so in its own + documentation rather than picking one silently. + + An empty call writes nothing and returns the same value a repeat would: the position of this producer's last record, or ``BEGINNING`` when it has written none. ``None`` means one thing only: this provider learns positions at read time, and a caller that needs one positions itself diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index f175570a8..20ac2c190 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -25,6 +25,7 @@ from __future__ import annotations import asyncio +import hashlib import logging from collections.abc import AsyncGenerator from datetime import timedelta @@ -36,7 +37,7 @@ from temporalio import workflow from temporalio.client import Client, WorkflowExecutionStatus from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams._errors import StreamCursorError +from temporalio.streams._errors import StreamCursorError, StreamProducerError from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -65,6 +66,15 @@ def _wake(future: asyncio.Future[None]) -> None: future.set_result(None) +def _fingerprint(bodies: list[bytes]) -> bytes: + """A digest of one append's content, length-delimited so a split cannot collide.""" + digest = hashlib.sha256() + for body in bodies: + digest.update(len(body).to_bytes(8, "big")) + digest.update(body) + return digest.digest() + + class _Topic: """One topic's records, and the waiters parked on its tail.""" @@ -72,8 +82,9 @@ def __init__(self) -> None: self.records: list[bytes] = [] # Dedupe identity is (producer#attempt, first sequence of the append), # the same pair the storage providers use, mapped to where the batch - # landed so a repeat can answer with the original position. - self.seen: dict[tuple[str, int], tuple[int, int]] = {} + # landed and a digest of what it held, so a repeat answers with the + # original position and a divergent one is told apart from it. + self.seen: dict[tuple[str, int], tuple[int, int, bytes]] = {} # Each waiter is parked with the loop it belongs to. A workflow's # publish runs on the workflow thread, and waking a foreign loop's # future from there needs call_soon_threadsafe or the loop stays @@ -89,16 +100,32 @@ def append( ) -> tuple[int, int]: """Store ``wires`` and return where they landed as ``(first offset, count)``. - With a ``writer``, a repeat of ``(writer, sequence)`` stores nothing - and returns where the original landed. + With a ``writer``, a repeat of ``(writer, sequence)`` carrying the same + content stores nothing and returns where the original landed. + + Raises: + StreamProducerError: ``(writer, sequence)`` is held with different + content. """ key = (writer or "", sequence) - if writer is not None and key in self.seen: - return self.seen[key] + # Deterministic so the digest of one append does not depend on how + # protobuf happened to order a payload's metadata map. + bodies = [wire.SerializeToString(deterministic=True) for wire in wires] + content = _fingerprint(bodies) + if writer is not None: + held = self.seen.get(key) + if held is not None: + first, count, seen_content = held + if seen_content != content: + raise StreamProducerError( + f"producer sequence {sequence} already used with different " + f"content by {writer!r}" + ) + return first, count first = len(self.records) - self.records.extend(wire.SerializeToString() for wire in wires) + self.records.extend(bodies) if writer is not None: - self.seen[key] = (first, len(wires)) + self.seen[key] = (first, len(wires), content) waiters, self._waiters = self._waiters, [] for loop, future in waiters: loop.call_soon_threadsafe(_wake, future) @@ -233,8 +260,11 @@ def _writer(self) -> str: async def append(self, *values: T) -> Cursor: """Append ``values`` and return the cursor of the last record as stored. - A repeat returns where the original landed; an empty call returns - the position of this producer's last record. + A repeat of the same content returns where the original landed; an + empty call returns the position of this producer's last record. + + Raises: + StreamProducerError: This sequence is held with different content. """ if not values: return self._last diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 12663fa23..f4a3f7e1f 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -6,3 +6,8 @@ def pytest_configure(config: pytest.Config) -> None: "markers", "reports_positions: the case needs append() to return where records landed", ) + config.addinivalue_line( + "markers", + "detects_divergent_retries: the case needs append() to compare a repeat's " + "content with what the store holds", + ) diff --git a/tests/streams/test_memory_provider.py b/tests/streams/test_memory_provider.py new file mode 100644 index 000000000..ea2ab0249 --- /dev/null +++ b/tests/streams/test_memory_provider.py @@ -0,0 +1,31 @@ +"""What the reference provider does that the conformance suite cannot see. + +The conformance suite goes through the public surface, so it can say that a +divergent retry is refused but not what the store looks like afterwards. That +is this file: a few assertions against ``MemoryStreams`` internals. +""" + +from __future__ import annotations + +import pytest + +from temporalio.streams import StreamProducerError, topic +from temporalio.streams.providers.memory import MemoryStreams + +OUT = topic("out", dict) + + +async def test_a_divergent_retry_leaves_the_store_alone(): + provider = MemoryStreams() + stream = provider.get_stream_handle(None, "wf-divergent") # type: ignore[arg-type] + store = provider._topic("wf-divergent", OUT.name) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}) + assert len(store.records) == 1 + + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + with pytest.raises( + StreamProducerError, match="already used with different content" + ): + await retry.append({"n": 2}) + assert len(store.records) == 1 diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 43b30a973..d0891fcbb 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -10,7 +10,7 @@ ``append()`` learns positions at read time. What this file pins down is what a provider owes: producer identity, retry -deduplication, positions, supersession, topic addressing, cursor resumption +deduplication, positions, supersession, topic addressing, cursor resumption, and cursor ownership. Every case here goes through the public surface, so a new provider answers this file and nothing else. The shared pieces no provider implements are unit-tested in ``test_streams_internals``; the workflow-side handles and the two rules about @@ -36,6 +36,7 @@ RecordKind, StreamCursorError, StreamHandle, + StreamProducerError, StreamProvider, Supersession, topic, @@ -59,6 +60,8 @@ class ProviderCase: provider: StreamProvider reports_positions: bool = True """``append()`` returns where the records landed.""" + detects_divergent_retries: bool = True + """``append()`` compares a repeat's content with what it already holds.""" async def open( self, workflow_id: str, *, run_id: str | None = None @@ -83,6 +86,7 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, + "detects_divergent_retries": lambda case: case.detects_divergent_retries, } @@ -184,6 +188,27 @@ async def test_retried_append_is_stored_once(case: ProviderCase): assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] +@pytest.mark.detects_divergent_retries +async def test_a_divergent_retry_is_refused(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + await first.append({"id": "r1"}) + + # Same producer, attempt and sequence, different content. The store has no + # way to know which of the two the reader was meant to see, so it says so + # rather than answering with the position of the one it kept. + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + with pytest.raises(StreamProducerError): + await retry.append({"id": "other"}) + + # And it wrote nothing: the producer that owns the sequence carries on + # past the original, with no second record wedged in front of it. + await first.append({"id": "r2"}) + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] + + async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) From cab745c0e2e29b35e630b445412572ebe617e189 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:12:59 -0700 Subject: [PATCH 589/831] Released a memory read parked on a topic when its caller let go. The interface says a caller that stops early can aclose() the generator and get back what the provider parked; a cancelled wait left its waiter on the topic for the life of the process. --- temporalio/streams/providers/memory.py | 4 +++ tests/streams/test_memory_provider.py | 32 ++++++++++++++++++++--- tests/streams/test_streams_conformance.py | 24 ++++++++++++++++- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 20ac2c190..9bcf2ecf9 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -141,6 +141,10 @@ async def wait_past(self, offset: int, timeout: float | None) -> None: try: await asyncio.wait_for(future, timeout) except asyncio.TimeoutError: + pass + finally: + # Dropped on every exit, cancellation included, so a reader that + # aclose()s while parked here leaves nothing behind on the topic. self._waiters = [w for w in self._waiters if w[1] is not future] diff --git a/tests/streams/test_memory_provider.py b/tests/streams/test_memory_provider.py index ea2ab0249..4c08b3ea0 100644 --- a/tests/streams/test_memory_provider.py +++ b/tests/streams/test_memory_provider.py @@ -1,12 +1,15 @@ """What the reference provider does that the conformance suite cannot see. -The conformance suite goes through the public surface, so it can say that a -divergent retry is refused but not what the store looks like afterwards. That -is this file: a few assertions against ``MemoryStreams`` internals. +The conformance suite is the public surface, so it can say that closing a read +returns and that the topic still works afterwards, but not that the provider +let go of what the read parked on. That is this file: a few assertions against +``MemoryStreams`` internals, where holding on would leak quietly. """ from __future__ import annotations +import asyncio + import pytest from temporalio.streams import StreamProducerError, topic @@ -15,6 +18,29 @@ OUT = topic("out", dict) +async def test_closing_a_parked_read_drops_its_waiter(): + provider = MemoryStreams() + stream = provider.get_stream_handle(None, "wf-parked") # type: ignore[arg-type] + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}) + store = provider._topic("wf-parked", OUT.name) + + records = stream.read(topic=OUT) + await asyncio.wait_for(records.__anext__(), 5.0) + + pending = asyncio.ensure_future(records.__anext__()) + await asyncio.sleep(0.2) + assert store._waiters, "the read should be parked on the topic by now" + + pending.cancel() + with pytest.raises(asyncio.CancelledError): + await pending + # Nothing left behind: a reader that comes and goes must not grow this + # list for the life of the topic. + assert store._waiters == [] + await asyncio.wait_for(records.aclose(), 5.0) + + async def test_a_divergent_retry_leaves_the_store_alone(): provider = MemoryStreams() stream = provider.get_stream_handle(None, "wf-divergent") # type: ignore[arg-type] diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index d0891fcbb..484c39f6c 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -11,7 +11,8 @@ What this file pins down is what a provider owes: producer identity, retry deduplication, positions, supersession, topic addressing, cursor resumption, -and cursor ownership. Every case here goes through the public surface, so a new provider answers this file and +cursor ownership, and releasing a read the caller stopped early. Every case +here goes through the public surface, so a new provider answers this file and nothing else. The shared pieces no provider implements are unit-tested in ``test_streams_internals``; the workflow-side handles and the two rules about Workflow Tasks live in ``test_streams_workflow``. @@ -209,6 +210,27 @@ async def test_a_divergent_retry_is_refused(case: ProviderCase): assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] +async def test_closing_a_read_early_releases_it(case: ProviderCase): + # A read with nothing left to hand over waits against the store. Closing + # the generator is how a caller that stops early says so, and it has to + # let go of whatever it parked instead of hanging on it. + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}) + + records = stream.read(topic=OUT) + assert (await asyncio.wait_for(records.__anext__(), 5.0)).value == {"n": 1} + with pytest.raises(asyncio.TimeoutError): + await asyncio.wait_for(records.__anext__(), 0.5) + await asyncio.wait_for(records.aclose(), 5.0) + + # The topic is untouched by the close: a new read still sees everything. + await producer.append({"n": 2}) + again = await take(stream.read(topic=OUT), 2) + assert [r.value for r in again] == [{"n": 1}, {"n": 2}] + + async def test_new_attempt_supersedes_the_old_one(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) From 5303636020e71dd4de1a2ef6f8148fb9e42fc7aa Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:13:06 -0700 Subject: [PATCH 590/831] Named the application as the owner of a provider's close. One provider serves a client, the workers built from it and every handle opened outside them, so no single one of those can close it without cutting off the others. --- temporalio/streams/_provider.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 2c57125c0..6a36f7e7c 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -287,5 +287,12 @@ async def close(self) -> None: A provider that keeps a connection pool or an HTTP session open needs a moment where the process says it is done; this is it. A provider that holds nothing returns at once. + + The application calls this, not the worker and not the client. One + provider serves the workers built from a client and every handle + opened outside them, so no single one of those owns its lifetime and + a worker shutting down would close a connection its siblings are + still reading through. A provider that outlives the process it was + made in is the application's to close. """ ... From a62917cac3add8a0175bd25dde90ff1351d02133 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 08:12:04 -0700 Subject: [PATCH 591/831] Answered a legacy query without the stream snapshot beside it. A parked Run has no open Workflow Task, so the server dispatches a query on a task of its own and Core allows nothing beside the answer there. The instance still reported the registered wait set, Core refused the completion, and the query timed out. --- temporalio/worker/_workflow_instance.py | 14 ++++ .../test_worker_integration.py | 66 +++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 88e7a891b..56c39aef0 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -85,6 +85,9 @@ # Set to true to log all cases where we're ignoring things during delete LOG_IGNORE_DURING_DELETE = False +# Core answers a query carrying this id on the query's own task, alone. +_LEGACY_QUERY_ID = "legacy_query" + def _is_workflow_terminal_command( command: temporalio.bridge.proto.workflow_commands.workflow_commands_pb2.WorkflowCommand, @@ -2624,6 +2627,17 @@ def _emit_external_stream_commands(self) -> None: if runtime is None or self._deleting: return + # A legacy query is answered on a task of its own, and Core refuses any + # other command beside that answer. The activation ran no Workflow code, + # so the wait set it would report is the one the retained task already + # holds, and there is no observation delta to commit. + if any( + command.HasField("respond_to_query") + and command.respond_to_query.query_id == _LEGACY_QUERY_ID + for command in self._current_completion.successful.commands + ): + return + # First, because the boundary a Continue-As-New header has to carry is # the one this activation is about to commit, and it only stops moving # here. diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index cf797719f..f9ad6d5d7 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -301,6 +301,72 @@ async def test_a_blocked_workflow_retains_its_task_rather_than_completing_it( await handle.terminate() +@workflow.defn +class ParkedQueryWorkflow: + """Blocks on an empty stream with a short idle timeout, so the task parks.""" + + def __init__(self) -> None: + self._seen: list[str] = [] + + @workflow.run + async def run(self) -> list[str]: + tokens = external_stream.with_options(idle_timeout=timedelta(seconds=1)).topic( + "tokens", type=str + ) + async for token in tokens.subscribe(): + self._seen.append(token) + break + return self._seen + + @workflow.query + def seen(self) -> list[str]: + return self._seen + + +async def test_a_query_against_a_parked_workflow_is_answered( + client: Client, backend: MemoryStreamBackend +) -> None: + """A parked Run has no open Workflow Task, so its query travels alone. + + The server dispatches it on a task of its own, and Core allows nothing + beside the answer on that task. The wait set is still registered from the + parked task, so reporting it again with the answer made Core refuse the + completion, and the query never returned. + """ + task_queue = f"tq-{uuid.uuid4()}" + async with Worker( + client, + task_queue=task_queue, + workflows=[ParkedQueryWorkflow], + external_stream_backend=backend, + ): + handle = await client.start_workflow( + ParkedQueryWorkflow.run, + id=f"wf-{uuid.uuid4()}", + task_queue=task_queue, + ) + # Past the idle timeout the retained task is reported and the Run + # waits for a wake with no task open. + await asyncio.sleep(3) + + assert await asyncio.wait_for(handle.query(ParkedQueryWorkflow.seen), 10) == [] + + description = await handle.describe() + key = StreamKey( + client.namespace, + handle.id, + description.raw_description.workflow_execution_info.first_run_id, + "tokens", + ) + await publish(backend, key, ["first"]) + assert await asyncio.wait_for(handle.result(), 60) == ["first"] + + events = [e async for e in handle.fetch_history_events()] + assert not any( + e.HasField("workflow_task_failed_event_attributes") for e in events + ), "a Workflow Task failed while the query was outstanding" + + async def test_a_workflow_without_a_configured_backend_says_so( client: Client, ) -> None: From 2e556aa84ef44b3eb02eb9f054abf598cba81061 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:41:46 -0700 Subject: [PATCH 592/831] Asked the runtime whether it is evicting instead of guessing. Reading the eviction state off a private attribute name failed open: rename it upstream and the finish hook starts running during eviction, with every test still green. --- temporalio/worker/_workflow.py | 11 +++-------- temporalio/worker/_workflow_instance.py | 3 +++ temporalio/workflow/_context.py | 10 ++++++++++ tests/streams/test_stream_hooks.py | 26 +++++++++++++++++++++---- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 9b94de95a..9de338a7d 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -81,20 +81,15 @@ async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: except GeneratorExit: raise except BaseException: - if not _evicting(runtime): + # Eviction cancels the primary task the same way a workflow + # cancellation does, and only the cancellation is a run ending. + if not runtime.workflow_is_evicting(): await provider.on_workflow_finish() raise await provider.on_workflow_finish() return result -def _evicting(runtime: temporalio.workflow._Runtime) -> bool: - # Eviction cancels the primary task the same way a workflow cancellation - # does; the flag the instance sets before cancelling is what tells them - # apart, and only the cancellation is a run ending. - return bool(getattr(runtime, "_deleting", False)) - - # Value was chosen abitrarily as a small number that allows some concurrency and prevents # large numbers of concurrent external storage operations causing resource contention. # This default limit is per workflow task activation and does not limit the total number diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 26f796e57..7fa4405f0 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -1353,6 +1353,9 @@ def workflow_instance(self) -> Any: def workflow_is_continue_as_new_suggested(self) -> bool: return self._continue_as_new_suggested + def workflow_is_evicting(self) -> bool: + return self._deleting + def workflow_is_target_worker_deployment_version_changed(self) -> bool: return self._target_worker_deployment_version_changed diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 25523836a..160da8520 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -345,6 +345,16 @@ def workflow_instance(self) -> Any: ... @abstractmethod def workflow_is_continue_as_new_suggested(self) -> bool: ... + @abstractmethod + def workflow_is_evicting(self) -> bool: + """Whether this instance is being dropped from the cache rather than ending. + + Eviction cancels the primary task the way a workflow cancellation + does, so anything that runs on the way out has to be able to tell the + two apart. Instance state must not be touched while this is true. + """ + ... + @abstractmethod def workflow_is_target_worker_deployment_version_changed(self) -> bool: ... diff --git a/tests/streams/test_stream_hooks.py b/tests/streams/test_stream_hooks.py index 9f98f75f6..a547daf3e 100644 --- a/tests/streams/test_stream_hooks.py +++ b/tests/streams/test_stream_hooks.py @@ -20,6 +20,7 @@ WorkflowInboundInterceptor, ) from temporalio.worker._workflow import _StreamHooksInterceptor +from temporalio.worker._workflow_instance import _WorkflowInstanceImpl class _Provider: @@ -39,15 +40,24 @@ def __init__(self, provider: _Provider) -> None: class _FakeRuntime: - """Only what the interceptor reads: the stream state and the eviction flag.""" + """Only what the interceptor reads, and only through the runtime interface. - def __init__(self, provider: _Provider, *, deleting: bool = False) -> None: + It deliberately carries no ``_deleting`` attribute. An interceptor that + reads the eviction state by attribute name instead of by method would see + a runtime that is never evicting here, and the eviction case below would + catch it. + """ + + def __init__(self, provider: _Provider, *, evicting: bool = False) -> None: self._streams = _Streams(provider) - self._deleting = deleting + self._evicting = evicting def workflow_streams(self) -> _Streams: return self._streams + def workflow_is_evicting(self) -> bool: + return self._evicting + class _Body(WorkflowInboundInterceptor): """The workflow function's stand-in: returns, raises or parks forever.""" @@ -85,7 +95,7 @@ async def provider() -> Any: def _evicting(fake: _Provider) -> None: loop = asyncio.get_running_loop() - workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake, deleting=True)) # type: ignore[arg-type] + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake, evicting=True)) # type: ignore[arg-type] async def test_the_finish_hook_runs_on_return(provider: _Provider): @@ -137,3 +147,11 @@ async def test_the_finish_hook_does_not_run_during_eviction(provider: _Provider) _INPUT ) assert provider.calls == ["start"] + + +def test_the_runtime_answers_the_eviction_question_itself(): + # The interceptor asks the runtime rather than reading a private field, + # so the coupling is declared on the base class and the real instance has + # to answer it or fail to construct. + assert "workflow_is_evicting" in workflow._Runtime.__abstractmethods__ + assert "workflow_is_evicting" not in _WorkflowInstanceImpl.__abstractmethods__ From 296324666ae00617fb53a2f9e0b044989b2da3c0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:41:53 -0700 Subject: [PATCH 593/831] Held the finished topics on the run, not on the writer object. stream_writer() hands out a new object per call, so a guard kept on one of them let a publish land behind the finish marker it was meant to refuse. --- temporalio/workflow/_streams.py | 28 +++++++++++++------- tests/streams/test_streams_workflow.py | 36 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py index 5d319d50a..49f06902c 100644 --- a/temporalio/workflow/_streams.py +++ b/temporalio/workflow/_streams.py @@ -35,6 +35,10 @@ class _WorkflowStreams: def __init__(self, provider: WorkflowStreamProvider) -> None: self.provider = provider self.readers: dict[str, StreamReader[Any]] = {} + # Finishing is a statement about the topic, not about the writer + # object that made it, and stream_writer() hands out a new object on + # every call. Rebuilt in order on replay, so it stays deterministic. + self.finished: set[str] = set() class StreamReader(Generic[T]): @@ -135,11 +139,11 @@ class StreamWriter(Generic[T]): any value. """ - def __init__(self, sink: WriteSink, topic: str) -> None: + def __init__(self, sink: WriteSink, topic: str, finished: set[str]) -> None: """Prefer :func:`temporalio.workflow.stream_writer`.""" self._sink = sink self._topic = topic - self._finished = False + self._finished = finished @property def topic(self) -> str: @@ -156,9 +160,10 @@ def publish(self, value: T) -> None: through pre-encoded. Raises: - ValueError: :meth:`finish` was already called on this writer. + ValueError: The topic was already finished in this run, by this + writer or by another one on the same topic. """ - if self._finished: + if self._topic in self._finished: raise ValueError(f"topic {self._topic!r} was already finished") self._sink.publish( to_wire( @@ -173,11 +178,13 @@ def finish(self) -> None: """Write ``FINISH`` for this workflow on this topic. Idempotent. Says this workflow has nothing more to send on the topic. It does not - say the workflow succeeded, and it does not end anyone's read. + say the workflow succeeded, and it does not end anyone's read. The + marker belongs to the topic, so a second writer on the same topic in + the same run finds it already written. """ - if self._finished: + if self._topic in self._finished: return - self._finished = True + self._finished.add(self._topic) self._sink.publish( to_wire(payload_converter(), topic=self._topic, kind=RecordKind.FINISH) ) @@ -266,6 +273,9 @@ def stream_writer(topic: str) -> StreamWriter[Any]: ... def stream_writer(topic: str | StreamTopic[Any]) -> StreamWriter[Any]: """Publish to ``topic`` of this workflow's stream. + Every call returns a new writer, and they all share the run's record of + which topics were finished, so ``finish()`` on one is seen by the next. + Args: topic: A :func:`temporalio.streams.topic` definition, whose value type the writer's ``publish`` takes, or a plain string for a name @@ -275,5 +285,5 @@ def stream_writer(topic: str | StreamTopic[Any]) -> StreamWriter[Any]: ValueError: ``topic`` is empty. """ name, _ = resolve_topic(topic) - provider = _Runtime.current().workflow_streams().provider - return StreamWriter(provider.open_writer(name), name) + state = _Runtime.current().workflow_streams() + return StreamWriter(state.provider.open_writer(name), name, state.finished) diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index 71f2bb8bf..50572d419 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -357,6 +357,42 @@ async def test_a_second_reader_on_a_topic_shares_the_subscription( ] +@workflow.defn +class FinishThenPublish: + """Finishes a topic on one writer and publishes on a second one.""" + + @workflow.run + async def run(self) -> str: + workflow.stream_writer(DECISIONS).finish() + # A fresh writer object, the same topic. The marker is already there, + # so this publish would land after the end of the topic. + try: + workflow.stream_writer(DECISIONS).publish({"after": "finish"}) + except ValueError as error: + return str(error) + return "published" + + +async def test_a_finished_topic_stays_finished_across_writers( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, FinishThenPublish, plugins=[provider]) as worker: + handle = await client.start_workflow( + FinishThenPublish.run, id=workflow_id, task_queue=worker.task_queue + ) + assert "already finished" in await handle.result() + stream = provider.get_stream_handle(client, workflow_id) + + async def read_everything() -> list[Any]: + return [(r.kind, r.value) async for r in stream.read(topic=DECISIONS)] + + records = await asyncio.wait_for(read_everything(), 30) + # The marker is all that landed: the publish behind it never reached the + # topic, which is the point of the guard reading like a topic-wide rule. + assert records == [(RecordKind.FINISH, None)] + + @workflow.defn class ForeignCursor: """Resumes from a cursor another provider minted.""" From 4695c7df3f7f5b2307d71608262a22efbb61a675 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:42:02 -0700 Subject: [PATCH 594/831] Covered the reader promises nothing measured. A second loop on one reader, a cancelled read, a reopened topic and a workflow that touches no stream were all promised in a docstring and pinned by no case. --- tests/streams/test_stream_reader.py | 178 +++++++++++++++++++++++++ tests/streams/test_streams_workflow.py | 26 ++++ 2 files changed, 204 insertions(+) create mode 100644 tests/streams/test_stream_reader.py diff --git a/tests/streams/test_stream_reader.py b/tests/streams/test_stream_reader.py new file mode 100644 index 000000000..d3918fe40 --- /dev/null +++ b/tests/streams/test_stream_reader.py @@ -0,0 +1,178 @@ +"""The reader's rules that a workflow test cannot pin down. + +``stream_reader`` promises one subscription per topic per run, that a second +loop on one reader shares its buffer rather than racing the source, and that +closing it and opening the topic again is a new subscription. The memory +provider's source hands back everything it has without ever suspending, so a +workflow test cannot tell a reader that serialises its fetches from one that +does not. These drive the reader directly, with a source that suspends where +a real provider would, and a stand-in runtime on the loop. +""" + +from __future__ import annotations + +import asyncio +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.converter import DataConverter +from temporalio.streams import BEGINNING, Cursor, RecordKind, topic +from temporalio.streams._wire import WireRecord, to_wire +from temporalio.workflow._streams import _WorkflowStreams + +INPUTS = topic("inputs", dict) + +_CONVERTER = DataConverter.default.payload_converter + + +def _record(n: int) -> WireRecord: + return to_wire( + _CONVERTER, + topic=INPUTS.name, + kind=RecordKind.DATA, + value={"n": n}, + producer_id="model", + attempt=1, + sequence=n, + ) + + +class _SlowSource: + """Hands over one record per batch, suspending first the way a real one does.""" + + def __init__(self, count: int) -> None: + self.opened = True + self.next_calls = 0 + self.in_flight = 0 + self.overlapped = False + self._offset = 0 + self._count = count + + async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: + self.next_calls += 1 + self.in_flight += 1 + if self.in_flight > 1: + self.overlapped = True + try: + # Where a provider waits for the worker to deliver. Two fetches + # that both get here have both left the reader's buffer behind. + await asyncio.sleep(0) + await asyncio.sleep(0) + if self._offset >= self._count: + raise StopAsyncIteration + self._offset += 1 + return [(Cursor(f"fake:{self._offset - 1}"), _record(self._offset - 1))] + finally: + self.in_flight -= 1 + + def close(self) -> None: + self.opened = False + + +class _Half: + """A workflow half that hands out one source per topic and counts opens.""" + + def __init__(self) -> None: + self.sources: list[_SlowSource] = [] + + def open_reader(self, topic: str, *, after: Cursor) -> Any: + del topic, after + source = _SlowSource(4) + self.sources.append(source) + return source + + def open_writer(self, topic: str) -> Any: + del topic + raise NotImplementedError + + def on_workflow_start(self) -> None: + pass + + async def on_workflow_finish(self) -> None: + pass + + +class _FakeRuntime: + """Only what the reader reads: the stream state and the payload converter.""" + + def __init__(self, half: _Half) -> None: + self._streams = _WorkflowStreams(half) # type: ignore[arg-type] + + def workflow_streams(self) -> _WorkflowStreams: + return self._streams + + def workflow_payload_converter(self) -> Any: + return _CONVERTER + + +@pytest.fixture +async def half() -> Any: + fake = _Half() + loop = asyncio.get_running_loop() + workflow._Runtime.set_on_loop(loop, _FakeRuntime(fake)) # type: ignore[arg-type] + yield fake + workflow._Runtime.set_on_loop(loop, None) + + +async def test_two_loops_on_one_reader_split_the_records(half: _Half): + reader = workflow.stream_reader(INPUTS) + seen: list[int] = [] + + async def pull(count: int) -> None: + for _ in range(count): + record = await reader.__anext__() + assert record.value is not None + seen.append(record.value["n"]) + + await asyncio.wait_for(asyncio.gather(pull(2), pull(2)), 5.0) + # Every record once and none lost, whichever loop got there first, and + # the source was never asked for two batches at the same time. + assert sorted(seen) == [0, 1, 2, 3] + assert half.sources[0].overlapped is False + + +@pytest.mark.usefixtures("half") +async def test_a_cancelled_read_does_not_lose_the_record_it_waited_for(): + reader = workflow.stream_reader(INPUTS) + pending = asyncio.ensure_future(reader.__anext__()) + await asyncio.sleep(0) + pending.cancel() + with pytest.raises(asyncio.CancelledError): + await pending + + # The next read picks up where the cancelled one was, rather than finding + # the reader wedged behind a lock the cancelled fetch still holds. + record = await asyncio.wait_for(reader.__anext__(), 5.0) + assert record.value == {"n": 0} + + +async def test_closing_a_reader_lets_the_topic_be_opened_again(half: _Half): + reader = workflow.stream_reader(INPUTS) + assert workflow.stream_reader(INPUTS) is reader + reader.close() + assert half.sources[0].opened is False + + # A new subscription, not the closed one handed back. It is also a new + # command on a real provider, which is why the docstring says to gate it. + again = workflow.stream_reader(INPUTS) + assert again is not reader + assert len(half.sources) == 2 + assert (await asyncio.wait_for(again.__anext__(), 5.0)).value == {"n": 0} + + +@pytest.mark.usefixtures("half") +async def test_a_closed_reader_stops_iterating(): + reader = workflow.stream_reader(INPUTS) + assert (await asyncio.wait_for(reader.__anext__(), 5.0)).value == {"n": 0} + reader.close() + with pytest.raises(StopAsyncIteration): + await asyncio.wait_for(reader.__anext__(), 5.0) + + +@pytest.mark.usefixtures("half") +async def test_a_reader_ends_when_the_source_ends(): + reader = workflow.stream_reader(INPUTS, after=BEGINNING) + values = [record.value async for record in reader] + assert values == [{"n": 0}, {"n": 1}, {"n": 2}, {"n": 3}] diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index 50572d419..afc0b4cff 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -393,6 +393,32 @@ async def read_everything() -> list[Any]: assert records == [(RecordKind.FINISH, None)] +@workflow.defn +class NoStreams: + """Touches no stream at all, on a worker that has a provider.""" + + @workflow.run + async def run(self) -> str: + await asyncio.sleep(0) + return "done" + + +@pytest.mark.usefixtures("provider") +async def test_a_workflow_that_touches_no_stream_runs_unchanged(client: Client): + hooked = HookedMemory() + async with new_worker(client, NoStreams, plugins=[hooked]) as worker: + result = await client.execute_workflow( + NoStreams.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert result == "done" + # The interceptor is installed per worker, not per workflow, so the hooks + # still bracket a run that never opened a reader or a writer. A provider's + # hooks therefore have to be cheap and safe on a workflow that uses none. + assert [kind for kind, _ in hooked.calls] == ["start", "finish"] + + @workflow.defn class ForeignCursor: """Resumes from a cursor another provider minted.""" From 8e2deaacc07de5bf42a4185a400b3b0b1093a7e0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:44:55 -0700 Subject: [PATCH 595/831] Pointed the legacy query id at Core's own constant. The id is Core's, and nothing in this file said where it is defined, so a rename over there would be found by a failing query rather than by grep. --- temporalio/worker/_workflow_instance.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 56c39aef0..54481843c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -85,7 +85,8 @@ # Set to true to log all cases where we're ignoring things during delete LOG_IGNORE_DURING_DELETE = False -# Core answers a query carrying this id on the query's own task, alone. +# Core answers a query carrying this id on the query's own task, alone. Held in +# step with LEGACY_QUERY_ID in sdk-core, crates/sdk-core/src/worker/workflow/mod.rs. _LEGACY_QUERY_ID = "legacy_query" From 891d51469793c8f1aea4ec724d044e73e485c85e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:45:18 -0700 Subject: [PATCH 596/831] Kept a replay marker from earning a drain of its own. Behind a patch-only job set the install added a second drain, so every wait_condition predicate fired once more than the recorded task fired it. The dispatch moved to its own method so the schedule can be asserted. --- temporalio/worker/_workflow_instance.py | 98 ++++++++++++------- .../test_output_runtime.py | 67 +++++++++++++ 2 files changed, 128 insertions(+), 37 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 54481843c..81674909d 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -564,43 +564,7 @@ def activate( self._workflow_input = self._make_workflow_input(start_job) try: - if self._single_batch_activation: - # Applying every job before giving workflow tasks a chance to - # run prevents their order in the activation from hiding state - # that arrived in the same workflow task. - for job_set in job_sets: - for job in job_set: - # Let errors bubble out of these to the caller to fail the task - self._apply(job) - for job in replay_jobs: - self._apply(job) - if any(job_sets) or replay_jobs: - self._run_once( - check_conditions=bool(job_sets[1] or job_sets[2]) - ) - else: - # Preserve the legacy scheduling order for histories which do - # not contain the single-batch workflow logic flag. - replay_pending = bool(replay_jobs) - for index, job_set in enumerate(job_sets): - if not job_set: - continue - for job in job_set: - # Let errors bubble out of these to the caller to fail the task - self._apply(job) - if replay_pending and index >= 1: - for job in replay_jobs: - self._apply(job) - replay_pending = False - - # Run one iteration of the loop. We do not allow conditions to - # be checked in patch jobs (first index) or query jobs (last - # index). - self._run_once(check_conditions=index == 1 or index == 2) - if replay_pending: - for job in replay_jobs: - self._apply(job) - self._run_once(check_conditions=True) + self._apply_activation_jobs(job_sets, replay_jobs) except BaseException: # An error is already on its way out, so the replay is *abandoned* # rather than closed. Closing runs `verify_replay_consumed`, which @@ -705,6 +669,66 @@ def activate( return self._current_completion + def _apply_activation_jobs( + self, + job_sets: list[ + list[temporalio.bridge.proto.workflow_activation.WorkflowActivationJob] + ], + replay_jobs: list[ + temporalio.bridge.proto.workflow_activation.WorkflowActivationJob + ], + ) -> None: + """Apply one activation's jobs and run the drains they earn. + + An external stream replay marker is installed in front of the first + drain that can publish. A drain that publishes ahead of the install has + its records wiped by it and fails the manifest check, and an install + that earns a drain of its own makes the activation run one more drain + than the task the marker was written for. + """ + if self._single_batch_activation: + # Applying every job before giving workflow tasks a chance to + # run prevents their order in the activation from hiding state + # that arrived in the same workflow task. + for job_set in job_sets: + for job in job_set: + # Let errors bubble out of these to the caller to fail the task + self._apply(job) + for job in replay_jobs: + self._apply(job) + if any(job_sets) or replay_jobs: + self._run_once(check_conditions=bool(job_sets[1] or job_sets[2])) + return + + # Preserve the legacy scheduling order for histories which do + # not contain the single-batch workflow logic flag. + replay_pending = bool(replay_jobs) + # When nothing at index 1 or above will drain, the patch set's drain is + # the first one that can publish, so the install joins that set instead + # of adding a drain behind it. + first_draining_index = 1 if any(job_sets[1:]) else 0 + for index, job_set in enumerate(job_sets): + if not job_set: + continue + for job in job_set: + # Let errors bubble out of these to the caller to fail the task + self._apply(job) + if replay_pending and index >= first_draining_index: + for job in replay_jobs: + self._apply(job) + replay_pending = False + + # Run one iteration of the loop. We do not allow conditions to + # be checked in patch jobs (first index) or query jobs (last + # index). + self._run_once(check_conditions=index == 1 or index == 2) + if replay_pending: + # No job set drained, so the marker's drain is this one, under the + # conditions rule the single-batch branch gives the same activation. + for job in replay_jobs: + self._apply(job) + self._run_once(check_conditions=False) + def _apply( self, job: temporalio.bridge.proto.workflow_activation.WorkflowActivationJob ) -> None: diff --git a/tests/contrib/external_workflow_streams/test_output_runtime.py b/tests/contrib/external_workflow_streams/test_output_runtime.py index 56d0993d2..51c785733 100644 --- a/tests/contrib/external_workflow_streams/test_output_runtime.py +++ b/tests/contrib/external_workflow_streams/test_output_runtime.py @@ -1131,3 +1131,70 @@ async def test_combined_marker_preserves_empty_input_activations( assert staged.segment_record_counts == ((0,), (1,), (0,), (1,)) finally: await runtime._manager.shutdown() + + +class _SchedulingStub: + """The two calls the activation's job dispatch makes on the instance.""" + + def __init__(self, *, single_batch: bool) -> None: + self._single_batch_activation = single_batch + self.events: list[str] = [] + + def _apply(self, job: Any) -> None: + self.events.append(f"apply-{job.name}") + + def _run_once(self, *, check_conditions: bool) -> None: + self.events.append(f"drain({check_conditions})") + + +def _job(name: str) -> Any: + return SimpleNamespace(name=name) + + +def _dispatch(stub: _SchedulingStub, job_sets: list[list[Any]], replay: list[Any]): + cast(Any, _WorkflowInstanceImpl._apply_activation_jobs)(stub, job_sets, replay) + + +@pytest.mark.parametrize("single_batch", [False, True]) +def test_a_replay_marker_rides_the_patch_set_drain(single_batch: bool) -> None: + """A marker beside patch jobs alone must not earn a second drain. + + A patch job set drains once, and that drain is the first one that can + publish, so the install belongs in front of it. Behind it the activation + runs two drains where the recorded task ran one, and every + ``wait_condition`` predicate fires an extra time. + """ + stub = _SchedulingStub(single_batch=single_batch) + _dispatch(stub, [[_job("patch")], [], [], []], [_job("marker")]) + + assert stub.events == ["apply-patch", "apply-marker", "drain(False)"] + + +def test_a_marker_still_waits_for_the_signal_set_it_precedes() -> None: + stub = _SchedulingStub(single_batch=False) + _dispatch(stub, [[_job("patch")], [_job("signal")], [], []], [_job("marker")]) + + assert stub.events == [ + "apply-patch", + "drain(False)", + "apply-signal", + "apply-marker", + "drain(True)", + ] + + +def test_a_query_only_activation_answers_after_the_marker() -> None: + stub = _SchedulingStub(single_batch=False) + _dispatch(stub, [[], [], [], [_job("query")]], [_job("marker")]) + + assert stub.events == ["apply-query", "apply-marker", "drain(False)"] + + +@pytest.mark.parametrize("single_batch", [False, True]) +def test_a_marker_alone_drains_once_without_checking_conditions( + single_batch: bool, +) -> None: + stub = _SchedulingStub(single_batch=single_batch) + _dispatch(stub, [[], [], [], []], [_job("marker")]) + + assert stub.events == ["apply-marker", "drain(False)"] From 69987f27ea51b14073b2b344dab502f0e3cf47d1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:45:23 -0700 Subject: [PATCH 597/831] Held only the server-backed stream cases off the skipping clock. The suite-wide skip took roughly five hundred offline cases out of the time-skipping job. Only the cases that ask for a server observe its clock. --- .../external_workflow_streams/conftest.py | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/tests/contrib/external_workflow_streams/conftest.py b/tests/contrib/external_workflow_streams/conftest.py index dd1128b9f..ab2b4a395 100644 --- a/tests/contrib/external_workflow_streams/conftest.py +++ b/tests/contrib/external_workflow_streams/conftest.py @@ -16,23 +16,27 @@ import pytest import pytest_asyncio -from temporalio.testing import WorkflowEnvironment +#: Asking for either of these is what gives a case a running server. A case +#: that asks for neither never observes a clock, so no environment can fail it. +_SERVER_FIXTURES = frozenset({"client", "env"}) @pytest.fixture(autouse=True) -def skip_under_time_skipping(env: WorkflowEnvironment) -> None: - """Hold this suite to a server whose clock the tests can reason about. +def skip_under_time_skipping(request: pytest.FixtureRequest) -> None: + """Hold the server-backed cases to a clock the tests can reason about. - These cases measure real-server timing: how long a Workflow Task was held + Those cases measure real-server timing: how long a Workflow Task was held open, the interval a wake sweep runs on, the deadline a shutdown waits out. The time-skipping server advances the clock whenever workers go idle, which removes exactly the quantities being measured, so the failures it produces - say nothing about the feature. Which cases fail drifts run to run, between - fourteen and seventeen of them, which is why the whole suite is held rather - than a list of names. The ordinary dev-server step still runs all of it. + say nothing about the feature. Which of them fail drifts run to run, so the + server-backed cases are held as a group rather than by name. Everything + else here is offline and keeps running on both environments. """ - if env.supports_time_skipping: - pytest.skip("this suite measures real-server timing; see conftest") + if _SERVER_FIXTURES.isdisjoint(request.fixturenames): + return + if request.getfixturevalue("env").supports_time_skipping: + pytest.skip("this case measures real-server timing; see conftest") DEFAULT_REDIS_URL = "redis://127.0.0.1:6379" From a2f2f404b4bce5ff5af4655d5a388ff6acdd01f7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:47:12 -0700 Subject: [PATCH 598/831] Rewrote the unreleased Added block from the tip's own surface. Repeated merges against a moving base spliced one bullet into another and left three entries duplicated, two of them naming calls this branch does not export. --- CHANGELOG.md | 71 ++++++++++++++-------------------------------------- 1 file changed, 19 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ac886b1d..d2a68fbb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,66 +29,18 @@ to include examples, links to docs, or any other relevant information. anywhere a client is held. A topic is a typed definition, `streams.topic("inputs", Token)`, shared by workflow, activity and client code; a plain string names a topic decided at runtime. The record on the wire - is `temporal.api.stream.v1.StreamRecord` on every provider. - `temporalio.streams.providers.memory.MemoryStreams` is the in-memory - reference provider the conformance tests run against, and - `temporalio.streams.providers.redis.RedisStreams` serves the same interface - over External Workflow Streams, one topic as an input and an output stream. -- `ExternalStreamSubscription.records()` yields each value with the provider - offset it was read from, for a reader that has to name where it got to. - -- Added experimental External Workflow Streams in - `temporalio.contrib.external_workflow_streams`. Workflow stream payloads are - stored in a configured external backend instead of Temporal History, with a - Redis Streams provider included. Workflows subscribe with `external_stream`, - external processes publish with `ExternalStreamProducer`, and Workers are - configured with `external_stream_backend`. - -- Added the output direction for External Workflow Streams. - Workflows publish with `external_output_stream`, Activities and external - processes use `ExternalOutputStreamProducer`, and external consumers resume - through `ExternalOutputStreamClient`. Workflow output is staged outside - History and becomes readable only after its compact Workflow Task marker is - committed. -- **Experimental**: server-side streams. A workflow reads a stream the server - delivers on its Workflow Tasks and publishes with a command, through - `temporalio.workflow.read_stream`, `subscribe_stream` and - `add_stream_messages`. `temporalio.client_stream` and - `temporalio.contrib.server_streams` reach the same stream from outside a - workflow, and `temporalio.streams.providers.native` puts it behind the shared - stream interface. Requires a server that serves the stream service. - reference provider the conformance tests run against. - can read, decide on, and write. `workflow.stream_reader()` and - `workflow.stream_writer()` are the workflow-side entry points, a provider is a - worker plugin passed as `Worker(plugins=[provider])`, and - `provider.get_stream_handle()` reads and appends from outside. The record on - the wire is `temporal.api.stream.v1.StreamRecord` on every provider. + is `temporal.api.stream.v1.StreamRecord` on every provider, and `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. +- **Experimental**: `temporalio.streams.providers.redis.RedisStreams` serves the + stream interface over External Workflow Streams, holding one topic as an + input and an output stream. - **Experimental**: `temporalio.streams.providers.workflow_streams.WorkflowStreamsProvider` serves the stream interface over the shipped Workflow Streams transport as a worker plugin, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. Records are the `StreamRecord` proto inside the shipped item payload, and a handle without a run id follows continue-as-new run by run. -- **Experimental**: `temporalio.streams.providers.workflow_streams` serves the - stream interface over the shipped Workflow Streams transport, so a workflow - reads and publishes through `temporalio.contrib.workflow_streams` without - naming it. -- **Experimental**: `temporalio.streams.providers.nexus` puts one Nexus - endpoint in front of a storage provider, so a caller reaches a stream - through the endpoint and never names the store. Its contract is defined in - `temporal_streams.nexusrpc.yaml` and the bindings are generated from it. - Configure it with `data_converter=` to run a payload codec on the caller - side, so records are encoded before they leave the process. -- Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. -- **Experimental**: server-side streams. A workflow reads a stream the server - delivers on its Workflow Tasks and publishes with a command, through - `temporalio.workflow.read_stream`, `subscribe_stream` and - `add_stream_messages`. `temporalio.client_stream` and - `temporalio.contrib.server_streams` reach the same stream from outside a - workflow, and `temporalio.streams.providers.native` puts it behind the shared - stream interface. Requires a server that serves the stream service. - **Experimental**: `temporalio.streams.providers.nexus.NexusStreams` puts one Nexus endpoint in front of a storage provider, so a caller reaches a stream through the endpoint and never names the store, and @@ -119,6 +71,21 @@ to include examples, links to docs, or any other relevant information. `WorkflowHistory` while the stream is retained, `to_json()` and `from_json()` carry them as `streamSlices` beside the events, and a history that carries them replays with no server. +- Added experimental External Workflow Streams in + `temporalio.contrib.external_workflow_streams`. Workflow stream payloads are + stored in a configured external backend instead of Temporal History, with a + Redis Streams provider included. Workflows subscribe with `external_stream`, + external processes publish with `ExternalStreamProducer`, and Workers are + configured with `external_stream_backend`. +- Added the output direction for External Workflow Streams. + Workflows publish with `external_output_stream`, Activities and external + processes use `ExternalOutputStreamProducer`, and external consumers resume + through `ExternalOutputStreamClient`. Workflow output is staged outside + History and becomes readable only after its compact Workflow Task marker is + committed. +- `ExternalStreamSubscription.records()` yields each value with the provider + offset it was read from, for a reader that has to name where it got to. +- Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run. ### Changed From fc9216182599acc3f6aaca4425443b9759476bad Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:50:57 -0700 Subject: [PATCH 599/831] Told a sync activity what it is actually missing. A def activity is handed no client and no provider, so reporting the provider sent the reader to register one that was already there. --- temporalio/activity.py | 17 ++++++++-- temporalio/worker/_activity.py | 2 ++ tests/streams/test_stream_accessors.py | 44 ++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/temporalio/activity.py b/temporalio/activity.py index 33f3a90eb..09e3040fa 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -211,6 +211,9 @@ class _Context: client: Client | None cancellation_details: _ActivityCancellationDetailsHolder stream_provider: temporalio.streams.StreamProvider | None = None + # A ``def`` activity is handed no client and no stream provider, so what + # it is missing cannot be read off the fields that are absent. + sync: bool = False _logger_details: Mapping[str, Any] | None = None _payload_converter: temporalio.converter.PayloadConverter | None = None _metric_meter: temporalio.common.MetricMeter | None = None @@ -319,14 +322,24 @@ def stream_handle( activity. Raises: + RuntimeError: When the client is not available, which is what a + ``def`` activity gets, or when the activity has no workflow and + no ``workflow_id`` was given. temporalio.streams.StreamUnsupportedError: The worker has no stream provider. Register one with ``Client.connect(plugins=[provider])`` or ``Worker(plugins=[provider])``. - RuntimeError: When the client is not available, or when the activity - has no workflow and no ``workflow_id`` was given. ValueError: ``run_id`` was given without ``workflow_id``. """ context = _Context.current() + if context.sync: + # A sync activity is handed neither a client nor a provider. Saying + # the worker has none would send the reader to fix a registration + # that is not the problem. + raise RuntimeError( + "No stream handle available. Stream handles are only available in " + "`async def` activities; not in `def` activities, which are handed no " + "client to reach the store with." + ) provider = context.stream_provider if provider is None: raise temporalio.streams.StreamUnsupportedError( diff --git a/temporalio/worker/_activity.py b/temporalio/worker/_activity.py index 10bf45bd2..9b06f91ab 100644 --- a/temporalio/worker/_activity.py +++ b/temporalio/worker/_activity.py @@ -672,6 +672,7 @@ async def _execute_activity( stream_provider=( self._stream_provider if not running_activity.sync else None ), + sync=running_activity.sync, ) ) temporalio.activity.logger.debug("Starting activity") @@ -948,6 +949,7 @@ def heartbeat_fn(*details: Any) -> None: runtime_metric_meter=runtime_metric_meter, client=None, cancellation_details=cancellation_details, + sync=True, ) ) if not cancel_thread_raiser: diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py index eb733ba5b..1c6af098e 100644 --- a/tests/streams/test_stream_accessors.py +++ b/tests/streams/test_stream_accessors.py @@ -11,6 +11,7 @@ import asyncio import uuid +from concurrent.futures import ThreadPoolExecutor from datetime import timedelta from typing import Any @@ -120,3 +121,46 @@ async def ask() -> None: with pytest.raises(StreamUnsupportedError, match="plugins="): await ActivityEnvironment().run(ask) + + +@activity.defn +def ask_from_a_sync_activity() -> str: + try: + activity.stream_handle() + except RuntimeError as error: + return str(error) + return "opened" + + +@workflow.defn +class RunsASyncActivity: + """Runs the `def` activity that reaches for a handle.""" + + @workflow.run + async def run(self) -> str: + return await workflow.execute_activity( + ask_from_a_sync_activity, start_to_close_timeout=timedelta(seconds=30) + ) + + +async def test_a_sync_activity_is_told_it_cannot_have_a_handle( + client: Client, provider: MemoryStreams +): + # The worker has a provider. What a `def` activity is missing is the + # client, so that is what the error has to say, rather than sending the + # reader to register a provider that is already there. + registered = _with_provider(client, provider) + with ThreadPoolExecutor(max_workers=1) as executor: + async with new_worker( + registered, + RunsASyncActivity, + activities=[ask_from_a_sync_activity], + activity_executor=executor, + ) as worker: + result = await registered.execute_workflow( + RunsASyncActivity.run, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + assert "only available in `async def` activities" in result + assert "plugins=" not in result From e57bd027a8f7ba6165eafd3a2525212da128b791 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 13:50:57 -0700 Subject: [PATCH 600/831] Put the streams demo under the type checkers. The demo sat outside pyright's include, so two of the configured checkers never saw it. --- pyproject.toml | 2 +- streams_demo/run_demo.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b7077785f..c9bdf9923 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -267,7 +267,7 @@ reportUnnecessaryIsInstance = "none" reportUnnecessaryTypeIgnoreComment = "none" reportUnusedCallResult = "none" reportUnknownLambdaType = "none" -include = ["temporalio", "tests"] +include = ["temporalio", "tests", "streams_demo"] exclude = [ # Exclude auto generated files "temporalio/api", diff --git a/streams_demo/run_demo.py b/streams_demo/run_demo.py index e91bf2e31..769d7bf18 100644 --- a/streams_demo/run_demo.py +++ b/streams_demo/run_demo.py @@ -31,9 +31,11 @@ from temporalio.streams import RecordKind, StreamHandle from temporalio.worker import Worker +# Run as a script rather than imported as a module, so the two siblings are +# reached by name off this directory rather than through a package path. sys.path.insert(0, str(Path(__file__).resolve().parent)) -import provider_setup # noqa: E402 -from agent_loop import ( # noqa: E402 +import provider_setup # noqa: E402 # pyright: ignore[reportImplicitRelativeImport] +from agent_loop import ( # noqa: E402 # pyright: ignore[reportImplicitRelativeImport] DECISIONS, INPUTS, RECEIPTS, From f171df21f503353f541f1e78fe4bb5d6f8ee9132 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:06:18 -0700 Subject: [PATCH 601/831] Keyed the publish dedupe on where a producer's records end. A count of signals sent is not where the records reach, so a retry that batched its records differently either lost a batch or wrote records the log already held. What this transport still cannot do is refuse a divergent retry, which the provider now says plainly. --- .../streams/providers/workflow_streams.py | 26 ++++++++++--- tests/streams/test_streams_conformance.py | 7 ++++ .../streams/test_workflow_streams_provider.py | 37 ++++++++++++++++++- 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 88de82e29..392ae28cd 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -15,8 +15,20 @@ code stores and returns that ``Payload`` untouched, so the body's own encoding never meets the transport. - Producer identity dedupes through the shipped publisher state: the - publisher id is ``producer#attempt`` and every publish Signal carries a - monotonic sequence, so a retried batch drops and a new attempt passes. + publisher id is ``producer#attempt`` and every publish Signal carries the + sequence its records end at, so a retried batch drops and a new attempt + passes. + + What this transport cannot keep is the rest of that rule. A publish is a + Signal, which has no response, so the dedupe decision is taken in the + workflow and there is nowhere to report it. A repeat that carries + *different* content at a sequence the log already holds is therefore + dropped rather than refused with + :class:`temporalio.streams.StreamProducerError`, the way the memory and + native providers refuse it. Raising in the Signal handler is not an + alternative: it would fail the Workflow Task on every replay and the + caller would still learn nothing. A caller that needs a divergent retry to + be caught wants a provider whose append is a request and a response. - ``append()`` returns ``None``. The Signal transport learns positions at read time, so a caller that wants to follow from now asks ``latest()``. - A log belongs to one run and is not carried across continue-as-new, so a @@ -321,7 +333,6 @@ def __init__( self._producer_id = producer_id self._attempt = attempt self._sequence = 0 - self._signal_sequence = 0 self._pending: tuple[list[PublishEntry], int] | None = None @property @@ -391,7 +402,11 @@ async def _send(self, batch: list[tuple[RecordKind, Any]]) -> None: await self._signal(entries, next_sequence) async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: - signal_sequence = self._signal_sequence + 1 + # The dedupe sequence is where this producer's records end, not how + # many signals it has sent. The two differ once a retry batches its + # records differently from the send it is repeating, and a counter of + # signals then either drops a batch of new records or lets records + # that are already there through a second time. self._pending = (entries, next_sequence) try: await self._handle.signal( @@ -399,7 +414,7 @@ async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None PublishInput( items=entries, publisher_id=self._publisher_id, - sequence=signal_sequence, + sequence=next_sequence, ), ) except RPCError as error: @@ -409,7 +424,6 @@ async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None "cannot be appended to" ) from error raise - self._signal_sequence = signal_sequence self._sequence = next_sequence self._pending = None diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 86d14373d..6bea3aead 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -69,6 +69,8 @@ class ProviderCase: client: Client | None = None reports_positions: bool = True """``append()`` returns where the records landed.""" + detects_divergent_retries: bool = True + """``append()`` compares a repeat's content with what it already holds.""" host: Callable[[str], Awaitable[None]] | None = None """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" @@ -134,6 +136,10 @@ async def host(workflow_id: str) -> None: provider, client, reports_positions=False, + # A publish is a Signal, so the dedupe decision is taken in the + # workflow with nowhere to report it. See the module docstring of + # the provider. + detects_divergent_retries=False, host=host, ) for handle in hosts.values(): @@ -147,6 +153,7 @@ async def host(workflow_id: str) -> None: _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, + "detects_divergent_retries": lambda case: case.detects_divergent_retries, } diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 186de9094..f345bffa4 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -366,5 +366,40 @@ async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): await producer.append({"n": 1}) await producer.append({"n": 2}, {"n": 3}) await producer.finish() - assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1, 2]), (3, [3])] + assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (3, [1, 2]), (4, [3])] assert _wires(handle.sent[-1])[0].kind == int(RecordKind.FINISH) + + +class _PlainHandle: + """A workflow handle that accepts every Signal and remembers it.""" + + id = "plain" + + def __init__(self) -> None: + self.sent: list[PublishInput] = [] + + async def signal(self, name: str, arg: PublishInput) -> None: + del name + self.sent.append(arg) + + +async def test_the_dedupe_sequence_names_where_the_records_end(): + # The shipped handler drops a batch whose sequence it has already passed, + # so the sequence has to say how far this producer's records reach. A + # count of signals does not: a retry that batches its records differently + # from the send it repeats then carries a sequence the workflow has not + # seen, and the records it already holds go in a second time. + first = _PlainHandle() + original = _producer(first) # type: ignore[arg-type] + await original.append({"n": 1}, {"n": 2}) + + second = _PlainHandle() + retry = _producer(second) # type: ignore[arg-type] + await retry.append({"n": 1}) + await retry.append({"n": 2}) + await retry.append({"n": 3}) + + # The original ended at record 1, so its sequence is 2. Neither half of + # the retry's re-split reaches past it, and only the new record does. + assert _sequences(first.sent) == [(2, [0, 1])] + assert _sequences(second.sent) == [(1, [0]), (2, [1]), (3, [2])] From ffd14d1c9255f9374a5f6aec70d57d80104197fb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:06:53 -0700 Subject: [PATCH 602/831] Made the read path page its tail and name its failures. The tail Query answered a whole log in one blob, and latest() answered about the log rather than the topic it was given. A truncated position restarted the read from zero instead of saying the cursor is gone, and four failure paths reached the caller untranslated. --- .../streams/providers/workflow_streams.py | 181 ++++++++++---- temporalio/worker/_workflow_instance.py | 10 +- .../streams/test_workflow_streams_provider.py | 225 +++++++++++++++++- 3 files changed, 360 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 392ae28cd..c0a0dfb6e 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -75,11 +75,14 @@ PublishEntry, PublishInput, WorkflowStream, - WorkflowStreamClient, ) from temporalio.converter import PayloadConverter from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams._errors import StreamCursorError, StreamNotFoundError +from temporalio.streams._errors import ( + StreamCursorError, + StreamError, + StreamNotFoundError, +) from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord from temporalio.streams._topic import StreamTopic, resolve_topic @@ -92,6 +95,7 @@ to_wire, ) from temporalio.streams.providers import ProviderPlugin +from temporalio.worker._workflow_instance import QUERY_HANDLER_NOT_FOUND __all__ = [ "WorkflowStreamsHandle", @@ -103,7 +107,11 @@ _PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" +_LATEST_QUERY = "__temporal_streams_latest" _ENCODING = b"binary/plain" +# The same cap the shipped poll path answers under, because both are one +# response through the same server. +_MAX_TAIL_RESPONSE_BYTES = 1_000_000 # The server's failure type for an accepted Update whose run closed before # answering it: the poll's way of saying the run is over. _UPDATE_OUTLIVED_RUN = "AcceptedUpdateCompletedWorkflow" @@ -171,16 +179,46 @@ def __init__(self, stream: WorkflowStream | None = None) -> None: # final task published. The log is workflow state, so a Query # still serves it after completion. workflow.set_query_handler(_TAIL_QUERY, self._tail) + if workflow.get_query_handler(_LATEST_QUERY) is None: + workflow.set_query_handler(_LATEST_QUERY, self._latest) - def _tail(self, from_offset: int) -> list[dict[str, Any]]: - return [ - { - "offset": offset, - "topic": topic, - "data": base64.b64encode(payload.SerializeToString()).decode("ascii"), - } - for offset, topic, payload in self.stream.items_from(from_offset) - ] + def _tail(self, from_offset: int, topic: str) -> dict[str, Any]: + """One page of ``topic``'s items at or past ``from_offset``. + + Filtered and capped here rather than at the caller, because a Query + response has to fit the server's blob limit and a log the reader only + wants one topic of can be much larger than that. + """ + items: list[dict[str, Any]] = [] + size = 0 + next_offset = self.stream.next_offset + more_ready = False + for offset, item_topic, payload in self.stream.items_from(from_offset): + if item_topic != topic: + continue + data = base64.b64encode(payload.SerializeToString()).decode("ascii") + if items and size + len(data) > _MAX_TAIL_RESPONSE_BYTES: + next_offset, more_ready = offset, True + break + size += len(data) + items.append({"offset": offset, "topic": item_topic, "data": data}) + return { + "items": items, + "next_offset": next_offset, + "more_ready": more_ready, + } + + def _latest(self, topic: str) -> int: + """The newest offset holding a record on ``topic``, or -1 when it has none. + + The log orders every topic together, so the head of the log is not an + answer about one topic. Scanning here costs one Query rather than + shipping the log to the caller to find the same thing. + """ + for offset, item_topic, _ in reversed(self.stream.items_from(0)): + if item_topic == topic: + return offset + return -1 def _registered_stream() -> WorkflowStream | None: @@ -500,13 +538,14 @@ async def _read( continue # What landed after the last poll is still in workflow state, so # the tail comes back by Query rather than being lost with the run. - for offset_, shipped_topic, payload in await self._tail( - handle, next_offset - ): - if shipped_topic != topic: - continue - for record in self._records(decoder, run_id, offset_, payload): - yield record + tail_offset = next_offset + while True: + page, tail_offset, more = await self._tail(handle, topic, tail_offset) + for offset_, payload in page: + for record in self._records(decoder, run_id, offset_, payload): + yield record + if not more: + break if ( self._run_id is not None or status != WorkflowExecutionStatus.CONTINUED_AS_NEW @@ -550,10 +589,13 @@ async def _poll( except WorkflowUpdateFailedError as error: cause = getattr(error.cause, "type", None) if cause == TRUNCATED_OFFSET_ERROR_TYPE: - # The log was truncated past this position; zero means - # from whatever the run still retains. - offset = 0 - continue + # Restarting from the beginning would hand the caller + # records it already handled, and only the caller can + # decide to do that. + raise StreamCursorError( + f"offset {offset} of workflow {self._workflow_id!r} run " + f"{handle.run_id!r} is no longer retained" + ) from error if cause == STREAM_DRAINING_ERROR_TYPE: # Pollers are detached because the run is closing; the # next attempt learns how it closed. @@ -561,7 +603,9 @@ async def _poll( continue if cause == _UPDATE_OUTLIVED_RUN: return - raise + raise StreamError( + f"the poll update on workflow {self._workflow_id!r} failed: {error}" + ) from error except RPCError as error: # The run closed and its poll Update went with it, or the # workflow does not exist; the caller describes to tell which. @@ -587,16 +631,21 @@ def _records( def _handle(self, run_id: str | None) -> WorkflowHandle[Any, Any]: return self._client.get_workflow_handle(self._workflow_id, run_id=run_id) - async def _status( - self, handle: WorkflowHandle[Any, Any] - ) -> WorkflowExecutionStatus | None: + async def _describe(self, handle: WorkflowHandle[Any, Any]) -> Any | None: + """The description of ``handle``'s run, or ``None`` when it is gone.""" try: - return (await handle.describe()).status + return await handle.describe() except RPCError as error: if error.status == RPCStatusCode.NOT_FOUND: return None raise + async def _status( + self, handle: WorkflowHandle[Any, Any] + ) -> WorkflowExecutionStatus | None: + description = await self._describe(handle) + return None if description is None else description.status + async def _first_run(self) -> str: """The oldest retained run of the chain, walking back from the latest.""" try: @@ -629,48 +678,76 @@ async def _successor(self, handle: WorkflowHandle[Any, Any]) -> str | None: events = handle.fetch_history_events( event_filter_type=WorkflowHistoryEventFilterType.CLOSE_EVENT ) - async for event in events: - if event.HasField("workflow_execution_continued_as_new_event_attributes"): - attributes = event.workflow_execution_continued_as_new_event_attributes - return attributes.new_execution_run_id or None + try: + async for event in events: + if event.HasField( + "workflow_execution_continued_as_new_event_attributes" + ): + attributes = ( + event.workflow_execution_continued_as_new_event_attributes + ) + return attributes.new_execution_run_id or None + except RPCError as error: + if error.status != RPCStatusCode.NOT_FOUND: + raise + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} run {handle.run_id!r} was not found, " + "so its successor cannot be followed" + ) from error return None async def _tail( - self, handle: WorkflowHandle[Any, Any], from_offset: int - ) -> list[tuple[int, str, Payload]]: + self, handle: WorkflowHandle[Any, Any], topic: str, from_offset: int + ) -> tuple[list[tuple[int, Payload]], int, bool]: + """One page of ``topic``'s tail as ``(items, next offset, more to come)``.""" try: - wire = await handle.query(_TAIL_QUERY, from_offset, result_type=list) + wire = await handle.query( + _TAIL_QUERY, args=[from_offset, topic], result_type=dict + ) except WorkflowQueryFailedError as error: - if "expected but not found" not in str(error): - raise + if QUERY_HANDLER_NOT_FOUND not in str(error): + raise StreamError( + f"the tail query on workflow {self._workflow_id!r} failed: {error}" + ) from error # The workflow never opened a stream through this provider, so # there is no tail to serve. - return [] + return [], from_offset, False except RPCError as error: if error.status != RPCStatusCode.NOT_FOUND: raise # The History is gone; nothing is left to serve. - return [] - return [ - ( - item["offset"], - item["topic"], - Payload.FromString(base64.b64decode(item["data"])), - ) - for item in wire + return [], from_offset, False + items = [ + (item["offset"], Payload.FromString(base64.b64decode(item["data"]))) + for item in wire["items"] ] + return items, wire["next_offset"], bool(wire["more_ready"]) async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: - """The newest position in the log, which orders every topic of this workflow. + """The newest position holding a record on ``topic``. The log is one per run, so the cursor names the run it was read from: - the pinned run, or the latest run of the chain. + the pinned run, or the latest run of the chain. One log orders every + topic, so the answer comes from a Query that scans it for this topic + rather than from the head of the log, which usually names some other + topic's record. """ topic, _ = resolve_topic(topic) handle = self._handle(self._run_id) + description = await self._describe(handle) + if description is None: + raise StreamNotFoundError(f"workflow {self._workflow_id!r} was not found") try: - description = await handle.describe() - head = await WorkflowStreamClient(handle).get_offset() + head = await handle.query(_LATEST_QUERY, topic, result_type=int) + except WorkflowQueryFailedError as error: + if QUERY_HANDLER_NOT_FOUND not in str(error): + raise StreamError( + f"the latest query on workflow {self._workflow_id!r} failed: " + f"{error}" + ) from error + # The workflow never opened a stream through this provider, so + # the topic holds nothing. + head = -1 except RPCError as error: if error.status == RPCStatusCode.NOT_FOUND: raise StreamNotFoundError( @@ -679,9 +756,9 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: raise run_id = description.run_id assert run_id is not None - if head > 0: - return _cursor(run_id, head - 1) - # An empty log on the chain's first run is the beginning of the + if head >= 0: + return _cursor(run_id, head) + # An empty topic on the chain's first run is the beginning of the # stream; on a successor it is a position of its own, because # BEGINNING would send a chain-following read back to the first run. if await self._predecessor(run_id) is None: diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 26f796e57..f1d6d7bf7 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -91,6 +91,13 @@ logger = logging.getLogger(__name__) +QUERY_HANDLER_NOT_FOUND = "expected but not found" +"""The phrase a query for an unregistered handler comes back with. + +A caller that has to recognise the condition has only the failure message to +go on, so it matches this constant rather than a copy of the sentence. +""" + # Set to true to log all cases where we're ignoring things during delete LOG_IGNORE_DURING_DELETE = False @@ -818,7 +825,8 @@ async def run_query() -> None: if not defn: known_queries = sorted([k for k in self._queries.keys() if k]) raise RuntimeError( - f"Query handler for '{job.query_type}' expected but not found, " + f"Query handler for '{job.query_type}' " + f"{QUERY_HANDLER_NOT_FOUND}, " f"known queries: [{' '.join(known_queries)}]" ) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index f345bffa4..d99b1d1f6 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -13,6 +13,7 @@ import asyncio import base64 import uuid +from collections.abc import AsyncIterator from datetime import timedelta from typing import Any @@ -20,15 +21,30 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload -from temporalio.client import Client -from temporalio.contrib.workflow_streams import PublishInput +from temporalio.client import ( + Client, + WorkflowExecutionStatus, + WorkflowQueryFailedError, +) +from temporalio.contrib.workflow_streams import PublishInput, WorkflowStream from temporalio.converter import DataConverter -from temporalio.streams import RecordKind, Supersession +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import ( + BEGINNING, + RecordKind, + StreamCursorError, + StreamError, + StreamNotFoundError, + Supersession, +) from temporalio.streams._wire import WireRecord from temporalio.streams.providers.workflow_streams import ( + WorkflowStreamsHandle, WorkflowStreamsProducer, WorkflowStreamsProvider, + _InstanceStream, ) +from temporalio.worker._workflow_instance import QUERY_HANDLER_NOT_FOUND from tests.helpers import new_worker INPUTS = "inputs" @@ -242,6 +258,106 @@ async def read_forever() -> None: assert await handle.result() == 0 +@workflow.defn +class Truncating: + """Publishes on two topics and truncates its log when told to.""" + + def __init__(self) -> None: + # Constructed here so the shipped signal handler is registered before + # the provider looks for it, the way a migrating application holds it. + self._stream = WorkflowStream() + self._released = False + + @workflow.signal + def truncate_to(self, offset: int) -> None: + self._stream.truncate(offset) + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + decisions = workflow.stream_writer(DECISIONS) + other = workflow.stream_writer(INPUTS) + decisions.publish({"n": 0}) + other.publish({"side": "inputs"}) + decisions.publish({"n": 1}) + await workflow.wait_condition(lambda: self._released) + + +async def test_a_truncated_position_is_refused_rather_than_restarted( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, Truncating, plugins=[provider]) as worker: + handle = await client.start_workflow( + Truncating.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + first = await take(stream.read(topic=DECISIONS, result_type=dict), 1) + assert first[0].value == {"n": 0} + + # Everything the reader's cursor names is dropped from the log. + await handle.signal(Truncating.truncate_to, 3) + resumed = stream.read(topic=DECISIONS, result_type=dict, after=first[0].cursor) + # Starting over would hand back records the caller already handled, + # and only the caller can decide to do that. + with pytest.raises(StreamCursorError): + await take(resumed, 1, timeout=30) + + await handle.signal(Truncating.release) + await handle.result() + + +async def test_latest_names_the_newest_record_on_the_topic_asked_for( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, Truncating, plugins=[provider]) as worker: + handle = await client.start_workflow( + Truncating.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + decisions = await take(stream.read(topic=DECISIONS, result_type=dict), 2) + + # One log orders both topics and the newest item on it belongs to + # `inputs`, so a log-global answer would be the wrong cursor here. + assert await stream.latest(topic=DECISIONS) == decisions[-1].cursor + inputs = await take(stream.read(topic=INPUTS, result_type=dict), 1) + assert await stream.latest(topic=INPUTS) == inputs[0].cursor + assert await stream.latest(topic="never-written") == BEGINNING + + await handle.signal(Truncating.release) + await handle.result() + + +async def test_the_tail_query_pages_instead_of_answering_in_one_blob(): + # The workflow-side half of the tail, driven directly: a Query response + # has to fit the server's blob limit, so a log larger than the cap comes + # back a page at a time with a position to resume from. + big = Payload(metadata={"encoding": b"binary/plain"}, data=b"x" * 400_000) + items = [(offset, DECISIONS, big) for offset in range(6)] + + class _Log: + next_offset = len(items) + + def items_from(self, offset: int) -> list[Any]: + return [item for item in items if item[0] >= offset] + + instance = _InstanceStream.__new__(_InstanceStream) + instance.stream = _Log() # type: ignore[assignment] + + seen: list[int] = [] + offset, more = 0, True + while more: + page = instance._tail(offset, DECISIONS) + assert page["items"], "a page that fits nothing would never finish" + seen.extend(item["offset"] for item in page["items"]) + offset, more = page["next_offset"], page["more_ready"] + assert seen == list(range(6)) + + @workflow.defn class Relay: """Publishes one record per run and continues as new once.""" @@ -370,6 +486,109 @@ async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): assert _wires(handle.sent[-1])[0].kind == int(RecordKind.FINISH) +class _Description: + run_id = "the-only-run" + status = WorkflowExecutionStatus.COMPLETED + + +class _StubHandle: + """A workflow handle that answers describe and fails whatever the test names.""" + + id = "stub" + run_id = "the-only-run" + + def __init__( + self, + *, + query_error: BaseException | None = None, + events_error: BaseException | None = None, + ) -> None: + self._query_error = query_error + self._events_error = events_error + + async def describe(self) -> Any: + return _Description() + + async def start_update(self, *args: Any, **kwargs: Any) -> Any: + del args, kwargs + # The run is closed, so its poll Update is gone with it and the read + # goes on to the tail Query, which is what these cases are about. + raise RPCError("no poll update", RPCStatusCode.NOT_FOUND, b"") + + async def query(self, *args: Any, **kwargs: Any) -> Any: + del args, kwargs + assert self._query_error is not None + raise self._query_error + + def fetch_history_events(self, *args: Any, **kwargs: Any) -> Any: + del args, kwargs + error = self._events_error + + async def _events() -> AsyncIterator[Any]: + for event in (): + yield event + if error is not None: + raise error + + return _events() + + +class _OneHandleClient: + """A client that answers every handle request with the same handle.""" + + data_converter = DataConverter.default + + def __init__(self, handle: Any) -> None: + self._handle = handle + + def get_workflow_handle( + self, workflow_id: str, *, run_id: str | None = None + ) -> Any: + del workflow_id, run_id + return self._handle + + +def _handle_over(stub: _StubHandle) -> WorkflowStreamsHandle: + return WorkflowStreamsHandle( + _OneHandleClient(stub), # type: ignore[arg-type] + "wf", + "the-only-run", + timedelta(0), + ) + + +async def test_a_failing_tail_query_comes_back_as_a_stream_error(): + # The handler being absent is the one benign case; anything else is a + # real failure, and the interface says a caller catches stream conditions + # by meaning rather than by the client's own exception types. + stub = _StubHandle(query_error=WorkflowQueryFailedError("the workflow rejected it")) + with pytest.raises(StreamError): + await take(_handle_over(stub).read(topic=DECISIONS, result_type=dict), 1) + + +async def test_a_missing_tail_handler_ends_the_read_instead_of_failing_it(): + stub = _StubHandle( + query_error=WorkflowQueryFailedError( + f"Query handler for 'x' {QUERY_HANDLER_NOT_FOUND}, known queries: []" + ) + ) + # The workflow never opened a stream through this provider, so the run + # holds no tail and the read is simply over. + assert [r async for r in _handle_over(stub).read(topic=DECISIONS)] == [] + + +async def test_a_failing_latest_query_comes_back_as_a_stream_error(): + stub = _StubHandle(query_error=WorkflowQueryFailedError("the workflow rejected it")) + with pytest.raises(StreamError): + await _handle_over(stub).latest(topic=DECISIONS) + + +async def test_a_missing_run_leaves_the_successor_lookup_as_a_stream_error(): + stub = _StubHandle(events_error=RPCError("gone", RPCStatusCode.NOT_FOUND, b"")) + with pytest.raises(StreamNotFoundError): + await _handle_over(stub)._successor(stub) # type: ignore[arg-type] + + class _PlainHandle: """A workflow handle that accepts every Signal and remembers it.""" From 2d7f0c9fc776352e24205ceecb40d32d93537ed6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:19:15 -0700 Subject: [PATCH 603/831] Made the stream handler hold one batch and one read at a time. An append's repeat check and its commit have an await between them, so two copies of one batch both reached the store. A failed read left its subscription in place, where the caller's retry was answered end of stream, and a finish took its state away so the retry had nowhere to land. --- temporalio/streams/providers/nexus.py | 58 ++++++++-- tests/streams/test_nexus_provider.py | 153 +++++++++++++++++++++++++- 2 files changed, 199 insertions(+), 12 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 09e00cf43..7d17aa522 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -57,6 +57,7 @@ import time import urllib.error import urllib.request +import weakref from collections import OrderedDict from collections.abc import AsyncGenerator, Awaitable, Callable, Mapping from dataclasses import dataclass @@ -125,7 +126,6 @@ _QUEUE_DEPTH = 1000 _APPEND_TIMEOUT = timedelta(seconds=30) _ROUND_TRIP_MARGIN = timedelta(seconds=5) - _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover raise RuntimeError("the generated stream service carries no nexus definition") @@ -213,6 +213,7 @@ class _ProducerState: batch_index: int sequence: int last_cursor: str | None + finished: bool = False @nexusrpc.handler.service_handler(service=TemporalStreams) @@ -247,7 +248,15 @@ def __init__( ) self._max_producers = max_producers self._subscriptions: dict[tuple[str, str, str], _Subscription] = {} - self._read_locks: dict[tuple[str, str, str], asyncio.Lock] = {} + # Held weakly, and by the call that is using one for as long as it + # runs. A strong map would keep an entry per address ever read or + # appended to, and nothing would ever reach it again. + self._read_locks: weakref.WeakValueDictionary[ + tuple[str, str, str], asyncio.Lock + ] = weakref.WeakValueDictionary() + self._append_locks: weakref.WeakValueDictionary[ + tuple[str, str, str, str, int], asyncio.Lock + ] = weakref.WeakValueDictionary() self._subscription_idle = subscription_idle.total_seconds() def _stream(self, workflow_id: str, run_id: str | None) -> StreamHandle: @@ -286,6 +295,17 @@ async def _append(self, input: AppendInput) -> AppendOutput: input.producer_id, input.attempt, ) + # The repeat check and the commit have an await between them, so two + # in-flight copies of one batch would both pass the check and both + # reach the store. The read path serialises per address for the same + # reason. + lock = self._append_locks.setdefault(key, asyncio.Lock()) + async with lock: + return await self._append_locked(input, key) + + async def _append_locked( + self, input: AppendInput, key: tuple[str, str, str, str, int] + ) -> AppendOutput: state = self._producers.get(key) if state is None: if input.batch_index != 1 or input.sequence != 0: @@ -317,6 +337,11 @@ async def _append(self, input: AppendInput) -> AppendOutput: f"batch {input.batch_index} skips ahead of {state.batch_index} for " f"producer {input.producer_id!r} attempt {input.attempt}" ) + elif state.finished: + raise StreamProducerError( + f"producer {input.producer_id!r} attempt {input.attempt} already " + "finished this topic; open a new attempt" + ) if input.sequence != state.sequence: raise StreamProducerError( f"sequence {input.sequence} does not continue at {state.sequence} for " @@ -329,13 +354,15 @@ async def _append(self, input: AppendInput) -> AppendOutput: cursor = appended.token if appended is not None else None if input.finish: await state.delegate.finish() - self._producers.pop(key, None) - return AppendOutput(cursor=cursor) # Recorded only once the store accepted the batch, so a failed append - # is not mistaken for a repeat when the caller retries it. + # is not mistaken for a repeat when the caller retries it. A finish is + # recorded the same way rather than dropping the state: a lost + # response would otherwise leave the caller with a batch it can + # neither repeat nor abandon. state.batch_index = input.batch_index state.sequence += len(payloads) state.last_cursor = cursor + state.finished = state.finished or bool(input.finish) self._producers[key] = state self._producers.move_to_end(key) while len(self._producers) > self._max_producers: @@ -405,7 +432,14 @@ async def _read( if subscription is not None: await self._drop(key) subscription = self._subscribe(key, stream, input.topic, after) - records, next_token = await self._drain(subscription, max_records, wait) + try: + records, next_token = await self._drain(subscription, max_records, wait) + except Exception: + # The pump failed. Keeping the subscription would answer the + # caller's retry from the same token with end of stream, so a + # transient read failure would read as the stream ending. + await self._drop(key) + raise subscription.position = next_token subscription.last_used = time.monotonic() done = ( @@ -483,8 +517,10 @@ async def _drain( records.append(self._wire(record)) next_token = record.cursor.token if not records and subscription.failure is not None: - failure, subscription.failure = subscription.failure, None - raise failure + # Left on the subscription rather than cleared: the caller is + # answered with the failure and the subscription is dropped, so + # there is nothing for a second reader of it to be misled by. + raise subscription.failure return records, next_token @staticmethod @@ -511,7 +547,6 @@ async def close(self) -> None: """ for key in list(self._subscriptions): await self._drop(key) - self._read_locks.clear() async def _drop(self, key: tuple[str, str, str]) -> None: subscription = self._subscriptions.pop(key, None) @@ -530,7 +565,6 @@ async def _expire_subscriptions(self) -> None: if lock is not None and lock.locked(): continue await self._drop(key) - self._read_locks.pop(key, None) class _EndpointFailure(Exception): @@ -892,6 +926,10 @@ def __init__( """ if not endpoint: raise ValueError("endpoint must not be empty") + # Checked here rather than on the first read, because the contract + # refuses an out-of-range value with a payload validation error that + # is neither a StreamError nor an RPCError, a long way from the line + # that got it wrong. self._endpoint = endpoint self._http_address = http_address.rstrip("/") self._headers = dict(headers or {}) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index b09b8d2e2..726a5b7b9 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -20,12 +20,13 @@ import asyncio import base64 import dataclasses +import gc import json import os import uuid -from collections.abc import Mapping, Sequence +from collections.abc import AsyncIterator, Mapping, Sequence from datetime import datetime, timedelta, timezone -from typing import Any +from typing import Any, cast import nexusrpc import nexusrpc.handler @@ -587,3 +588,151 @@ async def read_everything() -> list[Any]: (RecordKind.DATA, {"echo": 3}), (RecordKind.FINISH, None), ] + + +class _SlowStore(MemoryStreams): + """The memory store with a real await inside ``append``. + + The handler's repeat check and its commit have an await between them. + Without a gate there, two in-flight copies of one batch both finish the + check before either commits and both reach the store. + """ + + def __init__(self) -> None: + super().__init__() + self.gate = asyncio.Event() + self.appends = 0 + + def get_stream_handle( + self, client: Any, workflow_id: str, *, run_id: str | None = None + ) -> Any: + handle = super().get_stream_handle(client, workflow_id, run_id=run_id) + outer = self + make_producer = handle.producer + + def producer(**kwargs: Any) -> Any: + delegate = make_producer(**kwargs) + inner_append = delegate.append + + async def append(*values: Any) -> Any: + outer.appends += 1 + await outer.gate.wait() + return await inner_append(*values) + + delegate.append = append # type: ignore[method-assign] + return delegate + + handle.producer = producer # type: ignore[method-assign] + return handle + + +async def test_two_copies_of_one_batch_reach_the_store_once(): + store = _SlowStore() + handler = TemporalStreamsHandler(store, None) + both = asyncio.gather( + _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})), + _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})), + ) + await asyncio.sleep(0.1) + store.gate.set() + first, second = await asyncio.wait_for(both, 10) + # One of them wrote and the other was answered from the state it left. + # Counted at the store because a store that dedupes by itself would hide + # a second commit the handler should never have made. + assert store.appends == 1 + assert first.cursor == second.cursor + assert await _stored(store, "wf") == [{"n": 1}] + + +async def test_a_finished_batch_can_be_retried(): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) + await _dispatch(handler, APPEND_OPERATION, _append("wf", 1, {"n": 1})) + finished = await _dispatch( + handler, APPEND_OPERATION, _append("wf", 2, {"n": 2}, finish=True) + ) + # The caller never saw the answer. The byte-identical retry has to be + # answerable, because a finish the caller cannot repeat is a batch it can + # neither complete nor abandon. + again = await _dispatch( + handler, APPEND_OPERATION, _append("wf", 2, {"n": 2}, finish=True) + ) + assert again.cursor == finished.cursor + assert await _stored(store, "wf") == [{"n": 1}, {"n": 2}] + # And the attempt is over: a batch after the finish is refused rather + # than landing behind the marker. + with pytest.raises(nexusrpc.HandlerError) as after: + await _dispatch(handler, APPEND_OPERATION, _append("wf", 3, {"n": 3})) + assert "already finished" in str(after.value) + + +class _FailingReadStore(MemoryStreams): + """A store whose read fails once, the way a transient store failure does.""" + + def __init__(self) -> None: + super().__init__() + self.reads = 0 + + def get_stream_handle( + self, client: Any, workflow_id: str, *, run_id: str | None = None + ) -> Any: + handle = super().get_stream_handle(client, workflow_id, run_id=run_id) + outer = self + + def read(**kwargs: Any) -> Any: + outer.reads += 1 + if outer.reads == 1: + + async def failing() -> AsyncIterator[Any]: + for record in cast("list[Any]", []): + yield record + raise RuntimeError("the store went away") + + return failing() + return MemoryStreams.get_stream_handle( + outer, client, workflow_id, run_id=run_id + ).read(**kwargs) + + handle.read = read # type: ignore[method-assign] + return handle + + +async def test_a_failed_read_is_not_reported_as_the_end_of_the_stream(): + store = _FailingReadStore() + handler = TemporalStreamsHandler(store, None) + await ( + store.get_stream_handle(None, "wf") + .producer(topic=INPUTS, producer_id="model", attempt=1) + .append({"n": 1}) + ) + + request = ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=200, max_records=10) + with pytest.raises(RuntimeError, match="the store went away"): + await _dispatch(handler, READ_OPERATION, request) + # The retry from the same token has to re-subscribe rather than be + # answered done=True off the subscription the failed pump left behind. + answer = await _dispatch(handler, READ_OPERATION, request) + assert [WireRecord.FromString(r.record).sequence for r in answer.records] == [0] + assert answer.done is False + await handler.close() + + +async def test_the_handler_does_not_grow_a_lock_per_address(): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) + for index in range(25): + workflow_id = f"wf-{index}" + await _dispatch( + handler, APPEND_OPERATION, _append(workflow_id, 1, {"n": index}) + ) + await _dispatch( + handler, + READ_OPERATION, + ReadInput(workflow_id=workflow_id, topic=INPUTS, wait_ms=0, max_records=1), + ) + gc.collect() + # Held weakly, so an address nobody is reading or appending to leaves + # nothing behind. A strong map would hold one entry per address forever. + assert len(handler._read_locks) == 0 # pyright: ignore[reportPrivateUsage] + assert len(handler._append_locks) == 0 # pyright: ignore[reportPrivateUsage] + await handler.close() From f6ef1a7b9522bade073c7df3be3a4b2d12b44b3b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:19:37 -0700 Subject: [PATCH 604/831] Kept the endpoint's transport failures off the caller. urllib wraps only the request, so a socket timeout left the call as builtins.TimeoutError, which on 3.11 and later cannot be told from the caller's own deadline. The read bounds are now refused where they are set rather than by the contract on the first read. --- temporalio/streams/providers/nexus.py | 63 ++++++++++++++++++++++----- tests/streams/test_nexus_provider.py | 46 +++++++++++++++++++ 2 files changed, 97 insertions(+), 12 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 7d17aa522..324c3c3f0 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -52,6 +52,7 @@ from __future__ import annotations import asyncio +import http.client import json import logging import time @@ -126,6 +127,13 @@ _QUEUE_DEPTH = 1000 _APPEND_TIMEOUT = timedelta(seconds=30) _ROUND_TRIP_MARGIN = timedelta(seconds=5) +# What ReadInput accepts in temporal_streams.nexusrpc.yaml. Repeated here so +# a caller's mistake is refused where it was made rather than on the wire. +_MIN_READ_WAIT = timedelta(0) +_MAX_READ_WAIT = timedelta(milliseconds=60_000) +_MIN_MAX_RECORDS = 1 +_MAX_MAX_RECORDS = 1000 + _definition = nexusrpc.get_service_definition(TemporalStreams) if _definition is None: # pragma: no cover raise RuntimeError("the generated stream service carries no nexus definition") @@ -605,19 +613,25 @@ def _post( url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta ) -> bytes: timeout_ms = int(timeout.total_seconds() * 1000) - request = urllib.request.Request( - url, - data=body, - headers={ - "Content-Type": "application/json", - # Tells the server how long the handler may park, so it does not - # time the call out ahead of a wait the caller asked for. - "Request-Timeout": f"{timeout_ms}ms", - **headers, - }, - method="POST", - ) + # Everything is inside the try, because urllib wraps only the request in + # URLError: a bad url raises from Request(), and a socket timeout or a + # dropped connection raises from getresponse() and read() as + # builtins.TimeoutError or an http.client exception. On 3.11 and later + # TimeoutError is asyncio.TimeoutError, so letting one out would be + # indistinguishable from the caller's own wait_for expiring. try: + request = urllib.request.Request( + url, + data=body, + headers={ + "Content-Type": "application/json", + # Tells the server how long the handler may park, so it does + # not time the call out ahead of a wait the caller asked for. + "Request-Timeout": f"{timeout_ms}ms", + **headers, + }, + method="POST", + ) with urllib.request.urlopen( request, timeout=(timeout + _ROUND_TRIP_MARGIN).total_seconds() ) as response: @@ -630,6 +644,10 @@ def _post( raise _EndpointFailure( f"stream endpoint unreachable at {url}: {error.reason}", None ) from error + except (TimeoutError, http.client.HTTPException, OSError, ValueError) as error: + raise _EndpointFailure( + f"stream endpoint at {url} did not answer: {error!r}", None + ) from error class _Front: @@ -810,6 +828,13 @@ def read( The token is opaque here, so a cursor from another store is refused by the store behind the endpoint and raises :class:`temporalio.streams.StreamCursorError` on the first iteration. + + ``aclose()`` on the result releases nothing at the endpoint at once. + The contract carries no unsubscribe operation, so the handler cannot + be told; it reclaims the parked read when it has gone idle, which is + a minute by default. Until then the subscription and its long poll on + the store stay, and a caller that stops and starts many reads on one + topic should expect that lag rather than an immediate release. """ topic, result_type = resolve_topic(topic, result_type) return self._read(topic, after, result_type) @@ -930,6 +955,20 @@ def __init__( # refuses an out-of-range value with a payload validation error that # is neither a StreamError nor an RPCError, a long way from the line # that got it wrong. + if not _MIN_READ_WAIT <= read_wait <= _MAX_READ_WAIT: + raise ValueError( + f"read_wait must be between {_MIN_READ_WAIT} and {_MAX_READ_WAIT}, " + f"got {read_wait}" + ) + if read_wait.microseconds % 1000: + raise ValueError( + f"read_wait is carried in whole milliseconds, got {read_wait}" + ) + if not _MIN_MAX_RECORDS <= max_records <= _MAX_MAX_RECORDS: + raise ValueError( + f"max_records must be between {_MIN_MAX_RECORDS} and " + f"{_MAX_MAX_RECORDS}, got {max_records}" + ) self._endpoint = endpoint self._http_address = http_address.rstrip("/") self._headers = dict(headers or {}) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 726a5b7b9..ed2ccdb6e 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -21,12 +21,14 @@ import base64 import dataclasses import gc +import http.client import json import os import uuid from collections.abc import AsyncIterator, Mapping, Sequence from datetime import datetime, timedelta, timezone from typing import Any, cast +from unittest import mock import nexusrpc import nexusrpc.handler @@ -736,3 +738,47 @@ async def test_the_handler_does_not_grow_a_lock_per_address(): assert len(handler._read_locks) == 0 # pyright: ignore[reportPrivateUsage] assert len(handler._append_locks) == 0 # pyright: ignore[reportPrivateUsage] await handler.close() + + +def test_the_read_bounds_are_checked_where_they_are_set(): + # The contract accepts a wait up to a minute and a batch up to a + # thousand; past that the endpoint answers with a payload validation + # error, which is neither a stream condition nor an RPC failure. + with pytest.raises(ValueError, match="read_wait"): + NexusStreams(endpoint="e", read_wait=timedelta(minutes=2)) + with pytest.raises(ValueError, match="read_wait"): + NexusStreams(endpoint="e", read_wait=timedelta(seconds=-1)) + with pytest.raises(ValueError, match="max_records"): + NexusStreams(endpoint="e", max_records=0) + with pytest.raises(ValueError, match="max_records"): + NexusStreams(endpoint="e", max_records=1001) + NexusStreams(endpoint="e", read_wait=timedelta(seconds=60), max_records=1000) + + +def test_a_socket_failure_never_reaches_the_caller_as_a_timeout(): + # urllib wraps only the request in URLError, so a read timeout comes out + # of getresponse() as builtins.TimeoutError, which on 3.11 and later is + # asyncio.TimeoutError and would be taken for the caller's own deadline. + def _raise(*args: Any, **kwargs: Any) -> Any: + del args, kwargs + raise TimeoutError("the socket read timed out") + + with mock.patch("urllib.request.urlopen", _raise): + with pytest.raises(nexus._EndpointFailure): # pyright: ignore[reportPrivateUsage] + nexus._post( # pyright: ignore[reportPrivateUsage] + "http://127.0.0.1:1/x", b"{}", {}, timedelta(seconds=1) + ) + + def _disconnect(*args: Any, **kwargs: Any) -> Any: + del args, kwargs + raise http.client.RemoteDisconnected("the endpoint hung up") + + with mock.patch("urllib.request.urlopen", _disconnect): + with pytest.raises(nexus._EndpointFailure): # pyright: ignore[reportPrivateUsage] + nexus._post( # pyright: ignore[reportPrivateUsage] + "http://127.0.0.1:1/x", b"{}", {}, timedelta(seconds=1) + ) + + # A url urllib cannot even build a request from does not escape either. + with pytest.raises(nexus._EndpointFailure): # pyright: ignore[reportPrivateUsage] + nexus._post("not a url", b"{}", {}, timedelta(seconds=1)) # pyright: ignore[reportPrivateUsage] From b09e3f1e8458c054f8eafc3be21b408c6027b490 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:25:42 -0700 Subject: [PATCH 605/831] Named a producer conflict as a producer error. The server refuses a producer sequence it already holds, which is exactly what StreamProducerError is documented for; it reached the caller as a bare argument failure instead. --- temporalio/client_stream.py | 17 +++++++++++++++-- tests/test_client_stream.py | 21 ++++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index b482941af..2448cf1c9 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -22,7 +22,9 @@ here rather than by the machinery that normally handles that. A failed call raises :class:`temporalio.streams.StreamNotFoundError` when the -server answers ``NOT_FOUND`` and :class:`temporalio.service.RPCError` +server answers ``NOT_FOUND``, +:class:`temporalio.streams.StreamProducerError` when it refuses a producer +sequence it already holds, and :class:`temporalio.service.RPCError` otherwise, never the transport's own exception type. """ @@ -42,7 +44,7 @@ from temporalio.api.stream.v1 import StreamRecord from temporalio.api.streamservice.v1 import service_pb2_grpc from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams import StreamNotFoundError +from temporalio.streams import StreamNotFoundError, StreamProducerError __all__ = [ "Appended", @@ -57,6 +59,12 @@ _T = TypeVar("_T") +# The server refuses a producer sequence it already holds with a message and +# no typed detail, so the phrase is the only thing to match on. Both refusals +# it sends carry it: a repeat with different content, and one behind the +# sequence it accepted last. +_PRODUCER_CONFLICT = "producer sequence" + @dataclass(frozen=True) class Appended: @@ -140,6 +148,11 @@ def _translate(error: grpc.aio.AioRpcError) -> Exception: details = error.details() or code.name if code is grpc.StatusCode.NOT_FOUND: return StreamNotFoundError(details) + if code is grpc.StatusCode.INVALID_ARGUMENT and _PRODUCER_CONFLICT in details: + # A producer sequence the store already holds, either with different + # content or behind the one it accepted last. The caller asked to be + # deduplicated and could not be, which is a condition of its own. + return StreamProducerError(details) raw = b"" # The aio metadata iterates as (key, value) pairs at runtime, whatever # shape the stubs give its items. diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index e3f16f38e..b6b9a4b7a 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -22,7 +22,7 @@ from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind from temporalio.client_stream import StreamClient, StreamHandle from temporalio.service import RPCError -from temporalio.streams import StreamNotFoundError +from temporalio.streams import StreamNotFoundError, StreamProducerError TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -190,3 +190,22 @@ async def test_failures_surface_as_sdk_errors(streams: StreamClient) -> None: await missing.describe() with pytest.raises((StreamNotFoundError, RPCError)): await missing.append(rec(b"x")) + + +# A producer that asked to be deduplicated and could not be is a condition of +# its own, not a bare argument error: the store already holds that sequence. +async def test_a_producer_conflict_is_a_stream_producer_error( + stream: StreamHandle, +) -> None: + await stream.append(rec(b"one"), producer_id="p1", sequence=0) + # Same producer and sequence, different content. The server cannot know + # which of the two the reader was meant to see. + with pytest.raises(StreamProducerError, match="different content"): + await stream.append(rec(b"other"), producer_id="p1", sequence=0) + # And a sequence behind the one it accepted last. + await stream.append(rec(b"two"), producer_id="p1", sequence=1) + with pytest.raises(StreamProducerError, match="stale producer sequence"): + await stream.append(rec(b"three"), producer_id="p1", sequence=0) + + entries, _ = await stream.read() + assert data(entries) == [b"one", b"two"] From c18e031f459b30af3045406a179cc87530721900 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:25:45 -0700 Subject: [PATCH 606/831] Copied a stream record by descriptor in both directions. Six hand-copied fields each way meant a field added to StreamRecord would be dropped in silence on the way out and on the way back. --- temporalio/client_stream.py | 73 +++++++++++++++++++---------- tests/test_client_stream_records.py | 50 ++++++++++++++++++++ 2 files changed, 98 insertions(+), 25 deletions(-) create mode 100644 tests/test_client_stream_records.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 2448cf1c9..a043b8e03 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -39,6 +39,7 @@ import google.protobuf.duration_pb2 import grpc import grpc.aio +from google.protobuf.message import Message import temporalio.api.streamservice.v1 as stream from temporalio.api.stream.v1 import StreamRecord @@ -110,36 +111,58 @@ class Page: run_id: str = "" +def _copy_by_name(source: Message, target: Message, *, skip: frozenset[str]) -> None: + """Copy every field ``source`` has set onto the field of ``target`` with that name. + + By descriptor rather than field by field, so a field added to + ``StreamRecord`` crosses in both directions without anybody remembering to + add a line here. A field the target does not have raises, which is the + answer a reader wants: better a loud failure than a body that arrives + without the thing that described it. + """ + fields = target.DESCRIPTOR.fields_by_name + for descriptor, value in source.ListFields(): + if descriptor.name in skip: + continue + if descriptor.name not in fields: + raise ValueError( + f"{source.DESCRIPTOR.full_name}.{descriptor.name} has no counterpart " + f"on {target.DESCRIPTOR.full_name}" + ) + field = getattr(target, descriptor.name) + if descriptor.message_type is not None and ( + descriptor.message_type.GetOptions().map_entry + ): + holds_message = ( + descriptor.message_type.fields_by_name["value"].message_type is not None + ) + for key, item in value.items(): + if holds_message: + field[key].CopyFrom(item) + else: + field[key] = item + elif hasattr(field, "extend"): + # A plain repeated field; maps answered above and everything else + # takes an assignment or a CopyFrom. + field.extend(value) + elif descriptor.type == descriptor.TYPE_MESSAGE: + field.CopyFrom(value) + else: + setattr(target, descriptor.name, value) + + def _to_service(record: StreamRecord) -> stream.StreamRecord: - # Field for field the public record; the stored shape only adds the offset - # a read assigns. An unset body stays unset so a FINISH record reads back - # as one. - out = stream.StreamRecord( - topic=record.topic, - kind=record.kind, - producer_id=record.producer_id, - attempt=record.attempt, - sequence=record.sequence, - ) - if record.HasField("body"): - out.body.CopyFrom(record.body) - for key, value in record.metadata.items(): - out.metadata[key].CopyFrom(value) + # The stored shape is the public record plus the offset a read assigns. + # An unset body stays unset, so a FINISH record reads back as one. + out = stream.StreamRecord() + _copy_by_name(record, out, skip=frozenset()) return out def _to_public(record: stream.StreamRecord) -> StreamEntry: - out = StreamRecord( - topic=record.topic, - kind=record.kind, - producer_id=record.producer_id, - attempt=record.attempt, - sequence=record.sequence, - ) - if record.HasField("body"): - out.body.CopyFrom(record.body) - for key, value in record.metadata.items(): - out.metadata[key].CopyFrom(value) + out = StreamRecord() + # The offset is the store's, not the record's; it rides on the entry. + _copy_by_name(record, out, skip=frozenset({"offset"})) return StreamEntry(record=out, offset=record.offset) diff --git a/tests/test_client_stream_records.py b/tests/test_client_stream_records.py new file mode 100644 index 000000000..261d0b74f --- /dev/null +++ b/tests/test_client_stream_records.py @@ -0,0 +1,50 @@ +"""How a record crosses between the public shape and the stored one. + +No server: what this pins is that the two converters carry every field the +record declares, so a field added to ``StreamRecord`` is not dropped in +silence on the way out or the way back. +""" + +from __future__ import annotations + +import pytest + +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind +from temporalio.client_stream import _copy_by_name, _to_public, _to_service + + +def test_a_record_crosses_both_ways_without_dropping_a_field() -> None: + # Copied by descriptor rather than field by field, so a field added to + # StreamRecord crosses without anybody adding a line to the converters. + sent = StreamRecord( + topic="t", + kind=StreamRecordKind.STREAM_RECORD_KIND_FINISH, + producer_id="model", + attempt=3, + sequence=7, + ) + sent.body.CopyFrom(Payload(data=b"x", metadata={"encoding": b"binary/plain"})) + sent.metadata["trace"].CopyFrom(Payload(data=b"abc")) + + entry = _to_public(_to_service(sent)) + assert entry.record == sent + assert {f.name for f, _ in sent.ListFields()} == { + f.name for f, _ in entry.record.ListFields() + } + # Every field the public record declares is carried, not only the ones + # the converters happened to name. + crossed = {f.name for f, _ in _to_service(sent).ListFields()} - {"offset"} + assert crossed == {f.name for f in StreamRecord.DESCRIPTOR.fields} + + +def test_a_field_with_no_counterpart_is_refused_rather_than_dropped() -> None: + # The stored shape carries an offset the public record has no room for. + # Copying it across has to say so rather than leave it behind, because + # the same silence is what loses a field somebody adds later. + stored = _to_service(StreamRecord(topic="t")) + stored.offset = 12 + with pytest.raises(ValueError, match="offset"): + _copy_by_name(stored, StreamRecord(), skip=frozenset()) + # Named explicitly, the offset is the store's and rides on the entry. + assert _to_public(stored).offset == 12 From f2511f7d1a1bad49252e218650a28c9d3e850cef Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:46:43 -0700 Subject: [PATCH 607/831] Gave the contrib client a producer identity and a pending batch. The module says an application swaps the import and keeps its code, but the append carried no identity and took the batch off the buffer before the await, so a retried Activity wrote twice and a failed append lost what it held. --- temporalio/contrib/server_streams/__init__.py | 64 +++++++++++--- tests/contrib/test_server_streams_flush.py | 86 +++++++++++++++++++ 2 files changed, 136 insertions(+), 14 deletions(-) create mode 100644 tests/contrib/test_server_streams_flush.py diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index 95eb48d7e..0f6c5142d 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -4,7 +4,9 @@ by a Temporal-owned log instead of by Signals and Updates. An application swaps the import and keeps its code: publishing from a Workflow is still a plain call, publishing from an Activity is still a buffered handle, and a consumer -still subscribes by topic from an offset. +still subscribes by topic from an offset. An Activity's appends carry its own +id and attempt, so a retried Activity's repeat is deduplicated by the server +rather than written twice. What changes is underneath. A publish is a Workflow Command whose payload never enters History, so History gets one fixed-size event per Workflow Task rather @@ -128,7 +130,7 @@ def publish(self, value: T | RawValue) -> None: transition. The Worker's payload codec applies to the body as it does to any other payload the Workflow sends. """ - workflow.append_stream_records( + workflow._append_stream_records( [_record(workflow.payload_converter(), self._name, value)] ) @@ -220,6 +222,7 @@ def __init__( *, codec: PayloadCodec | None = None, describe: Callable[[], Awaitable[WorkflowExecutionDescription]] | None = None, + producer_id: str = "", ) -> None: """Prefer :meth:`create` or :meth:`from_within_activity`. @@ -227,13 +230,18 @@ def __init__( a namespace whose payloads are encoded agrees with the Worker, whose payload visitor applies the same codec to the Workflow's publishes. ``describe`` is how an unpinned handle learns which run it follows; - see :meth:`WorkflowStreamHandle.pin`. + see :meth:`WorkflowStreamHandle.pin`. ``producer_id`` is who the + appends are written as; without one they are at-least-once, because + the server has nothing to deduplicate a retry against. """ self._handle = handle self._converter = converter self._codec = codec self._batch_interval = batch_interval self._describe = describe + self._producer_id = producer_id + self._sequence = 0 + self._pending: tuple[list[StreamRecord], int] | None = None self._buffered: list[tuple[str, Any]] = [] self._flusher: asyncio.Task[None] | None = None self._wake = asyncio.Event() @@ -247,13 +255,16 @@ def create( *, owner_run_id: str = "", batch_interval: timedelta = DEFAULT_BATCH_INTERVAL, + producer_id: str = "", ) -> WorkflowStreamClient: """Open the stream owned by ``workflow_id``. Without ``owner_run_id`` the current run is looked up on the first call and the handle pinned to it, so a reader following across a continue-as-new sees the run end rather than being moved to the - successor's stream at a stale offset. + successor's stream at a stale offset. Without ``producer_id`` the + appends are at-least-once; inside an Activity, + :meth:`from_within_activity` supplies one. """ return cls( _stream_client(client).workflow_stream( @@ -263,6 +274,7 @@ def create( batch_interval, codec=client.data_converter.payload_codec, describe=client.get_workflow_handle(workflow_id).describe, + producer_id=producer_id, ) @classmethod @@ -277,12 +289,14 @@ def from_within_activity( "Workflow" ) # The Activity's output belongs to the run that scheduled it, and the - # Activity already knows which run that is. + # Activity already knows which run that is. Its id and attempt are + # also what lets the server drop a batch a retried Activity re-sends. return cls.create( activity.client(), info.workflow_id, owner_run_id=info.workflow_run_id or "", batch_interval=batch_interval, + producer_id=f"{info.activity_id}#{info.attempt}", ) async def __aenter__(self) -> WorkflowStreamClient: @@ -380,16 +394,38 @@ async def poll_raw( ) async def flush(self) -> None: - """Append everything buffered as one batch.""" - pending, self._buffered = self._buffered, [] - if not pending: - return + """Append everything buffered as one batch. + + A batch whose append failed stays pending and goes out again on the + next flush under the sequence it already had, so an append the server + did accept is deduplicated and one it never saw still lands. Nothing + comes off the buffer until there is a batch to replace it with. + + Raises: + temporalio.streams.StreamProducerError: The server holds this + producer's sequence with different content. + """ + if self._pending is not None: + records, sequence = self._pending + else: + if not self._buffered: + return + await self._pin() + # Encoded before the buffer is cleared, so a converter failure + # leaves the values where the caller can still see them. + records = [ + await self._encoded(_record(self._converter, topic, value)) + for topic, value in self._buffered + ] + sequence = self._sequence + self._buffered = [] + self._pending = (records, sequence) await self._pin() - records = [ - await self._encoded(_record(self._converter, topic, value)) - for topic, value in pending - ] - await self._handle.append(*records) + await self._handle.append( + *records, producer_id=self._producer_id, sequence=sequence + ) + self._sequence = sequence + len(records) + self._pending = None def _buffer(self, topic: str, value: Any) -> None: self._buffered.append((topic, value)) diff --git a/tests/contrib/test_server_streams_flush.py b/tests/contrib/test_server_streams_flush.py new file mode 100644 index 000000000..23a72106e --- /dev/null +++ b/tests/contrib/test_server_streams_flush.py @@ -0,0 +1,86 @@ +"""What the buffered client does with a batch, without a server. + +The parity claim in the module docstring is that an application swaps the +import and keeps its code, so the two things the shipped client does on every +flush have to hold here too: the append carries a producer identity, and a +batch whose append failed is kept for the retry rather than lost with it. +""" + +from __future__ import annotations + +from datetime import timedelta +from typing import Any + +import pytest + +from temporalio.api.stream.v1 import StreamRecord +from temporalio.contrib.server_streams import WorkflowStreamClient +from temporalio.converter import DataConverter + + +class _Handle: + """A stream handle that records its appends and can fail the first one.""" + + owner_run_id = "run" + + def __init__(self, *, fail_first: bool = False) -> None: + self.sent: list[tuple[list[StreamRecord], str, int]] = [] + self._fail_first = fail_first + + def pin(self, run_id: str) -> None: + del run_id + + async def append( + self, *records: StreamRecord, producer_id: str = "", sequence: int = 0 + ) -> Any: + self.sent.append((list(records), producer_id, sequence)) + if self._fail_first: + self._fail_first = False + raise ConnectionResetError("the server took it, the reply was lost") + return None + + +def _client(handle: _Handle) -> WorkflowStreamClient: + return WorkflowStreamClient( + handle, # type: ignore[arg-type] + DataConverter.default.payload_converter, + timedelta(seconds=60), + producer_id="act#1", + ) + + +def _bodies(sent: tuple[list[StreamRecord], str, int]) -> list[bytes]: + return [record.body.data for record in sent[0]] + + +async def test_an_append_carries_who_wrote_it_and_where_it_sits() -> None: + handle = _Handle() + client = _client(handle) + client.topic("t").publish({"n": 1}) + client.topic("t").publish({"n": 2}) + await client.flush() + client.topic("t").publish({"n": 3}) + await client.flush() + + # Without an identity the append is at-least-once, which is what the + # shipped client refuses to be. + assert [(who, seq) for _, who, seq in handle.sent] == [("act#1", 0), ("act#1", 2)] + + +async def test_a_batch_whose_append_failed_goes_out_again() -> None: + handle = _Handle(fail_first=True) + client = _client(handle) + client.topic("t").publish({"n": 1}) + with pytest.raises(ConnectionResetError): + await client.flush() + # Taken off the buffer before the await, it would have gone with the + # failure. It goes out again under the sequence it already had, so a copy + # the server did accept is deduplicated and one it never saw lands. + await client.flush() + assert len(handle.sent) == 2 + assert _bodies(handle.sent[0]) == _bodies(handle.sent[1]) + assert [seq for _, _, seq in handle.sent] == [0, 0] + + client.topic("t").publish({"n": 2}) + await client.flush() + assert handle.sent[2][2] == 1, "the next batch continues past the first" From e3b42303b6e3d611b3f5b2118749dbbb4df44eac Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:47:16 -0700 Subject: [PATCH 608/831] Closed only the stream channels a provider opened. One channel is shared per loop, target and namespace, so closing a provider took out channels another one in the same process was still reading through. --- temporalio/client_stream.py | 24 ++++++++---- temporalio/streams/providers/native.py | 40 ++++++++++++++++---- tests/test_client_stream_sharing.py | 52 ++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 14 deletions(-) create mode 100644 tests/test_client_stream_sharing.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index a043b8e03..6e0d47227 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -639,12 +639,22 @@ def shared_client(target_host: str, namespace: str) -> StreamClient: return existing -async def close_shared_clients() -> None: - """Close every shared client this loop opened. - - For a process that is done with streams, and for tests, which open a - loop per case and would otherwise leave a channel behind on each. +async def close_shared_clients(*keys: tuple[str, str]) -> None: + """Close the shared clients this loop opened for ``keys``, or all of them. + + A provider closes the ones it opened, named by ``(target host, + namespace)``: another provider on the same loop may still be reading + through a channel of its own, and taking that out from under it is not + this one's to do. With no keys it closes every one, which is what a + process finished with streams wants, and what a test that opened a loop + of its own wants. """ - per_loop = _shared.pop(asyncio.get_running_loop(), {}) - for client in per_loop.values(): + loop = asyncio.get_running_loop() + if not keys: + per_loop = _shared.pop(loop, {}) + closing = list(per_loop.values()) + else: + per_loop = _shared.get(loop, {}) + closing = [per_loop.pop(key) for key in keys if key in per_loop] + for client in closing: await client.close() diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 9c0cb3dbd..6ec1de705 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -267,11 +267,23 @@ async def _write(self, records: list[WireRecord]) -> Cursor: class NativeStreamHandle: """One workflow's topics from outside, over the stream service.""" - def __init__(self, client: Client, workflow_id: str, run_id: str | None) -> None: - """Address ``workflow_id``'s topics, pinned to ``run_id`` when one is given.""" + def __init__( + self, + client: Client, + workflow_id: str, + run_id: str | None, + *, + opened: set[tuple[str, str]] | None = None, + ) -> None: + """Address ``workflow_id``'s topics, pinned to ``run_id`` when one is given. + + ``opened`` is where this handle records the shared channel it used, so + the provider that made it closes that one and no other. + """ self._client = client self._workflow_id = workflow_id self._run_id = run_id + self._opened = set() if opened is None else opened self._converter = client.data_converter.payload_converter self._codec = client.data_converter.payload_codec self._streams: StreamClient | None = None @@ -280,10 +292,12 @@ def _service(self) -> StreamClient: # Resolved on first use, because the shared channel belongs to the # running loop and a handle may be made before there is one. if self._streams is None: - self._streams = shared_client( + key = ( self._client.service_client.config.target_host, self._client.namespace, ) + self._streams = shared_client(*key) + self._opened.add(key) return self._streams def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: @@ -445,9 +459,15 @@ class NativeStreams(ProviderPlugin): Takes no options: the streams are on the server the client is already connected to. Construct one, pass it to the worker as a plugin and open handles from it anywhere else; :meth:`close` releases the channels this - process opened to the stream service. + provider opened to the stream service. """ + def __init__(self) -> None: + """Create the provider.""" + # What this provider's handles opened, so closing it leaves another + # provider's channels on the same loop alone. + self._opened: set[tuple[str, str]] = set() + def workflow_provider(self) -> _NativeWorkflowProvider: """The workflow half, over the server's commands and delivered ranges.""" return _NativeWorkflowProvider() @@ -456,8 +476,14 @@ def get_stream_handle( self, client: Client, workflow_id: str, *, run_id: str | None = None ) -> NativeStreamHandle: """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain.""" - return NativeStreamHandle(client, workflow_id, run_id) + return NativeStreamHandle(client, workflow_id, run_id, opened=self._opened) async def close(self) -> None: - """Close the channels this process opened to the stream service.""" - await close_shared_clients() + """Close the channels this provider opened to the stream service. + + The application calls this; no worker or client owns the provider's + lifetime, because one provider serves the workers built from a client + and every handle opened outside them. + """ + await close_shared_clients(*self._opened) + self._opened.clear() diff --git a/tests/test_client_stream_sharing.py b/tests/test_client_stream_sharing.py new file mode 100644 index 000000000..793ba122a --- /dev/null +++ b/tests/test_client_stream_sharing.py @@ -0,0 +1,52 @@ +"""Who owns a shared channel, and who may close it. + +One channel is shared per loop, target and namespace, so two providers in one +process can be using the same one. Closing a provider has to leave the other's +channels alone. +""" + +from __future__ import annotations + +import asyncio + +from temporalio import client_stream +from temporalio.streams.providers.native import NativeStreams + + +class _FakeClient: + """Stands in for a StreamClient, which would want a real channel.""" + + def __init__(self) -> None: + self.closed = False + + async def close(self) -> None: + self.closed = True + + +def _put(target: str, namespace: str) -> _FakeClient: + fake = _FakeClient() + per_loop = client_stream._shared.setdefault(asyncio.get_running_loop(), {}) + per_loop[(target, namespace)] = fake # type: ignore[assignment] + return fake + + +async def test_closing_named_clients_leaves_the_others_open() -> None: + mine = _put("host-a:7233", "ns") + theirs = _put("host-b:7233", "ns") + await client_stream.close_shared_clients(("host-a:7233", "ns")) + assert mine.closed + assert not theirs.closed, "another provider is still reading through it" + await client_stream.close_shared_clients() + assert theirs.closed + + +async def test_a_provider_closes_only_what_its_own_handles_opened() -> None: + mine = _put("host-a:7233", "ns") + theirs = _put("host-b:7233", "ns") + + provider = NativeStreams() + provider._opened.add(("host-a:7233", "ns")) + await provider.close() + assert mine.closed + assert not theirs.closed + await client_stream.close_shared_clients() From a223504ce78779e638cb9891652568ffa7d79fa2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:47:53 -0700 Subject: [PATCH 609/831] Named the way out of a stream continuity failure. The check fails the Workflow Task and keeps failing it, because the range is recorded as consumed and is never sent again, so the message has to say what a reader can do about it. The copied batch limits now say what breaks if the server's differ. --- temporalio/worker/_workflow_instance.py | 26 +++++++++++++++++++++++-- tests/worker/test_workflow_stream.py | 9 +++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 9b1e1ea0b..9503e2e5c 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -276,6 +276,27 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: # Match the server's per-batch limits. A record over its limit is refused where # it is published, because a rejected command would be reissued on every # replay; a task's records are split into commands that fit the batch limits. +# +# Copied rather than learned: the activation does not carry them and the +# server does not report them, so this is a second copy of a number somebody +# else owns. If the server lowers one, or makes it per namespace, the split +# here stops fitting and the command is rejected on every replay, which is +# the failure the split exists to avoid. Carrying them on the activation is +# what would fix that, and it needs a Core and server change. +_STREAM_CONTINUITY_REMEDY = ( + "This fails the Workflow Task and will keep failing it, because the range " + "is recorded as consumed and will not be sent again. Reset the workflow to " + "before the subscription to start its stream reading over, or terminate it " + "if its output is no longer wanted." +) + +_STREAM_CONTINUITY_REMEDY = ( + "This fails the Workflow Task and will keep failing it, because the range " + "is recorded as consumed and will not be sent again. Reset the workflow to " + "before the subscription to start its stream reading over, or terminate it " + "if its output is no longer wanted." +) + _MAX_STREAM_RECORDS_PER_BATCH = 1000 _MAX_STREAM_RECORD_BYTES = 1 << 20 _MAX_STREAM_BATCH_BYTES = 2 << 20 @@ -345,12 +366,13 @@ def extend( if to_offset - from_offset != len(records): raise RuntimeError( f"stream {self._stream_id!r} delivered {len(records)} records " - f"for offsets [{from_offset}, {to_offset})" + f"for offsets [{from_offset}, {to_offset}). {_STREAM_CONTINUITY_REMEDY}" ) if self._next_offset is not None and from_offset != self._next_offset: raise RuntimeError( f"stream {self._stream_id!r} delivered offsets [{from_offset}, " - f"{to_offset}) but the last range ended at {self._next_offset}" + f"{to_offset}) but the last range ended at {self._next_offset}. " + f"{_STREAM_CONTINUITY_REMEDY}" ) self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 9083e74a9..568e6adaf 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -286,3 +286,12 @@ def test_a_task_over_the_batch_limits_is_split_into_commands() -> None: stub.publish(big, big, record(b"y" * room)) stub.flush() assert [len(c.append_stream_records.records) for c in stub.commands] == [2, 1] + + +async def test_the_continuity_failure_says_what_to_do_about_it() -> None: + buffer = _StreamBuffer("s") + buffer.extend([record(b"one")], 0, 1) + with pytest.raises(RuntimeError) as failed: + buffer.extend([record(b"two")], 5, 6) + # The task fails and keeps failing, so the message has to name the way out. + assert "Reset the workflow" in str(failed.value) From 2b3577fc489ae55817fa69461668313d14467d02 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:48:12 -0700 Subject: [PATCH 610/831] Stopped holding records for a reader that closed. There is no unsubscribe command, so the server keeps delivering for the life of the run and the buffer grew for a reader nobody would read again. The raw stream API that takes stream ids and protos is private now: the typed surface beside it is the one an application should reach for. --- temporalio/streams/providers/native.py | 21 +++++++-- temporalio/worker/_workflow_instance.py | 51 ++++++++++++++------- temporalio/workflow/__init__.py | 25 +++++++---- temporalio/workflow/_context.py | 35 +++++++++++---- tests/worker/test_workflow_stream.py | 56 ++++++++++++++++++++++++ tests/worker/test_workflow_stream_e2e.py | 12 ++--- 6 files changed, 159 insertions(+), 41 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 6ec1de705..83aeacfa7 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -113,11 +113,26 @@ def __init__(self, stream_id: str, run_id: str) -> None: async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: if self._closed: raise StopAsyncIteration - delivered = await workflow.read_stream_records(self._stream_id) + delivered = await workflow._read_stream_records(self._stream_id) + if self._closed: + # Closed while this was parked; the buffer woke it with nothing. + raise StopAsyncIteration return [(_cursor(self._run_id, item.offset), item.record) for item in delivered] def close(self) -> None: + """Stop reading, and stop keeping what the server keeps delivering. + + The server has no unsubscribe command, so ranges keep arriving on + every Workflow Task for the life of the run. What this ends is the + reading and the keeping: nothing further is held for this stream, so + a run that closes a reader early does not grow for the rest of its + life. The subscription itself, and the delivery it costs each task, + stay until the run ends. + """ + if self._closed: + return self._closed = True + workflow._close_stream_records(self._stream_id) class _NativeWriteSink: @@ -128,7 +143,7 @@ def publish(self, record: WireRecord) -> None: # Held by the runtime until the task completes, when the task's # records on this topic become one command the server applies with # the task: rule 1 through the server's own commit. - workflow.append_stream_records([record], stream_id=self._topic) + workflow._append_stream_records([record], stream_id=self._topic) class _NativeWorkflowProvider: @@ -145,7 +160,7 @@ def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: f"cursor {after.token!r} names another run; a run's stream is its own" ) start = named[1] + 1 - workflow.subscribe_stream(topic, start_offset=start) + workflow._subscribe_stream(topic, start_offset=start) return _NativeReadSource(topic, run_id) def open_writer(self, topic: str) -> WriteSink: diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 9503e2e5c..69182d192 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -290,13 +290,6 @@ def create_instance(self, det: WorkflowInstanceDetails) -> WorkflowInstance: "if its output is no longer wanted." ) -_STREAM_CONTINUITY_REMEDY = ( - "This fails the Workflow Task and will keep failing it, because the range " - "is recorded as consumed and will not be sent again. Reset the workflow to " - "before the subscription to start its stream reading over, or terminate it " - "if its output is no longer wanted." -) - _MAX_STREAM_RECORDS_PER_BATCH = 1000 _MAX_STREAM_RECORD_BYTES = 1 << 20 _MAX_STREAM_BATCH_BYTES = 2 << 20 @@ -344,12 +337,35 @@ class _StreamBuffer: def __init__(self, stream_id: str = "") -> None: self._stream_id = stream_id - self._records: list[temporalio.workflow.DeliveredStreamRecord] = [] + self._records: list[temporalio.workflow._DeliveredStreamRecord] = [] self._waiters: list[asyncio.Future] = [] # Where the next range has to start. Unknown until the first one # arrives, because a subscription may start wherever the stream is and # the server is the one that resolves that. self._next_offset: int | None = None + self._closed = False + + @property + def closed(self) -> bool: + """Whether workflow code has said it wants no more of this stream.""" + return self._closed + + def close(self) -> None: + """Stop keeping what arrives, and let go of what is held. Idempotent. + + There is no unsubscribe command, so the server keeps delivering for + the life of the run. Holding those records would grow the instance + without bound for a reader nobody will read again. Dropping them is + replay-safe because the close happens at the same point of the same + workflow code every time, so the same ranges are dropped; continuity + is still tracked, so a range that repeats or skips is still caught. + """ + self._closed = True + self._records = [] + waiters, self._waiters = self._waiters, [] + for waiter in waiters: + if not waiter.done(): + waiter.set_result(None) def extend( self, @@ -376,8 +392,10 @@ def extend( ) self._next_offset = to_offset # An empty range still counts as a delivery, but there is nothing to - # hand a reader, so only a non-empty one wakes anyone. - if not records: + # hand a reader, so only a non-empty one wakes anyone. A closed buffer + # counts the range and keeps nothing: continuity is still checked + # above, and nobody is left to read what it held. + if not records or self._closed: return # Offsets are dense inside a delivered range and the range arrives in # order, so counting from its start is the position rather than an @@ -388,7 +406,7 @@ def extend( kept = temporalio.api.stream.v1.StreamRecord() kept.CopyFrom(record) self._records.append( - temporalio.workflow.DeliveredStreamRecord( + temporalio.workflow._DeliveredStreamRecord( record=kept, offset=from_offset + index ) ) @@ -397,12 +415,12 @@ def extend( if not waiter.done(): waiter.set_result(None) - def take(self) -> list[temporalio.workflow.DeliveredStreamRecord]: + def take(self) -> list[temporalio.workflow._DeliveredStreamRecord]: taken, self._records = self._records, [] return taken def put_back( - self, records: Sequence[temporalio.workflow.DeliveredStreamRecord] + self, records: Sequence[temporalio.workflow._DeliveredStreamRecord] ) -> None: """Return an unread tail to the front of the buffer.""" self._records[:0] = records @@ -1534,15 +1552,18 @@ def _flush_stream_appends(self) -> None: commands.insert(insert_at, command) insert_at += 1 + def workflow_close_stream_records(self, stream_id: str) -> None: + self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)).close() + async def workflow_read_stream_records( self, stream_id: str, max_records: int - ) -> list[temporalio.workflow.DeliveredStreamRecord]: + ) -> list[temporalio.workflow._DeliveredStreamRecord]: # Ranges arrive on Workflow Tasks, and a query activation carries none, # so without this the read waits on a future nothing can resolve and the # query times out with nothing to say why. self._assert_not_read_only("read stream") buffer = self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) - while not len(buffer): + while not len(buffer) and not buffer.closed: await buffer.wait_future() taken = buffer.take() if max_records and len(taken) > max_records: diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 18d04cb0c..68822fd49 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -57,8 +57,7 @@ as_completed, wait, ) -from ._context import ( - DeliveredStreamRecord, +from ._context import ( # noqa: F401 Info, ParentInfo, RootInfo, @@ -66,7 +65,6 @@ _current_update_info, _Runtime, _set_current_update_info, - append_stream_records, cancellation_reason, current_update_info, deprecate_patch, @@ -88,11 +86,9 @@ payload_converter, random, random_seed, - read_stream_records, register_random_seed_callback, set_current_details, sleep, - subscribe_stream, time, time_ns, upsert_memo, @@ -101,6 +97,21 @@ uuid7, wait_condition, ) +from ._context import ( + _append_stream_records as _append_stream_records, +) +from ._context import ( + _close_stream_records as _close_stream_records, +) +from ._context import ( + _DeliveredStreamRecord as _DeliveredStreamRecord, +) +from ._context import ( + _read_stream_records as _read_stream_records, +) +from ._context import ( + _subscribe_stream as _subscribe_stream, +) from ._definition import ( DynamicWorkflowConfig, _Definition, @@ -237,10 +248,6 @@ "upsert_search_attributes", "uuid4", "uuid7", - "DeliveredStreamRecord", - "read_stream_records", - "append_stream_records", - "subscribe_stream", "wait_condition", "DynamicWorkflowConfig", "defn", diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 8b6c07782..2b9c0a8f8 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -324,10 +324,13 @@ def workflow_append_stream_records( records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: ... + @abstractmethod + def workflow_close_stream_records(self, stream_id: str) -> None: ... + @abstractmethod async def workflow_read_stream_records( self, stream_id: str, max_records: int - ) -> list[DeliveredStreamRecord]: ... + ) -> list[_DeliveredStreamRecord]: ... @abstractmethod def workflow_get_current_history_length(self) -> int: ... @@ -965,11 +968,13 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N ) -def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: +def _subscribe_stream( # type: ignore[reportUnusedFunction] + stream_id: str, *, start_offset: int = 0 +) -> None: """Subscribe this workflow to a server-side stream. From here on its Workflow Tasks carry the ranges it has not consumed yet, - and :func:`read_stream_records` returns them. Safe to call again: a second + and :func:`_read_stream_records` returns them. Safe to call again: a second subscription to a stream this run already consumes does not move its cursor, though it does write one event. Calling it on every replay is harmless because replay matches the command to the event already recorded. @@ -990,7 +995,7 @@ def subscribe_stream(stream_id: str, *, start_offset: int = 0) -> None: _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) -def append_stream_records( +def _append_stream_records( # type: ignore[reportUnusedFunction] records: Sequence[temporalio.api.stream.v1.StreamRecord], *, stream_id: str = "", @@ -1019,7 +1024,7 @@ def append_stream_records( @dataclass(frozen=True) -class DeliveredStreamRecord: +class _DeliveredStreamRecord: """One record a consuming workflow was given, with where it sat.""" record: temporalio.api.stream.v1.StreamRecord @@ -1027,15 +1032,29 @@ class DeliveredStreamRecord: """Its position in the whole stream, which is what a reader resumes from.""" -async def read_stream_records( +def _close_stream_records(stream_id: str) -> None: # type: ignore[reportUnusedFunction] + """Say this workflow wants no more of ``stream_id``. + + There is no unsubscribe command, so the server keeps delivering for the + life of the run; this drops what arrives instead of holding it for a + reader that has gone. Deterministic on replay, because the same workflow + code closes at the same point and the same ranges are dropped. + + Args: + stream_id: Stream to stop keeping records for. + """ + _Runtime.current().workflow_close_stream_records(stream_id) + + +async def _read_stream_records( # type: ignore[reportUnusedFunction] stream_id: str, *, max_records: int = 0 -) -> list[DeliveredStreamRecord]: +) -> list[_DeliveredStreamRecord]: """Read the next records of a server-side stream this workflow consumes. Waits until at least one record is available. Ranges arrive on Workflow Tasks, and only the offsets they covered are written to History, so this is deterministic on replay: the server re-supplies the same ranges by reading - the stream again. Subscribe first with :func:`subscribe_stream`; this only + the stream again. Subscribe first with :func:`_subscribe_stream`; this only reads what has already been delivered to this workflow. Args: diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 568e6adaf..676b29c90 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -288,6 +288,37 @@ def test_a_task_over_the_batch_limits_is_split_into_commands() -> None: assert [len(c.append_stream_records.records) for c in stub.commands] == [2, 1] +async def test_a_closed_buffer_keeps_nothing_and_still_checks_continuity() -> None: + # There is no unsubscribe command, so the server keeps delivering for the + # life of the run. A reader that closed would otherwise grow the instance + # for the rest of it. + buffer = _StreamBuffer("s") + buffer.extend([record(b"one")], 0, 1) + assert len(buffer) == 1 + + buffer.close() + assert buffer.closed + assert len(buffer) == 0, "what it held is let go of, not kept for nobody" + + buffer.extend([record(b"two"), record(b"three")], 1, 3) + assert len(buffer) == 0 + # Continuity is still tracked across what it dropped, so a range that + # repeats or skips is caught rather than passing unnoticed. + with pytest.raises(RuntimeError, match="last range ended at 3"): + buffer.extend([record(b"four")], 9, 10) + buffer.extend([record(b"four")], 3, 4) + + +async def test_closing_a_buffer_wakes_a_reader_parked_on_it() -> None: + buffer = _StreamBuffer("s") + waiter = buffer.wait_future() + buffer.close() + # Woken rather than left parked: the reader has to unwind, and nothing + # will ever arrive for it again. + await asyncio.wait_for(waiter, 5) + assert waiter.done() + + async def test_the_continuity_failure_says_what_to_do_about_it() -> None: buffer = _StreamBuffer("s") buffer.extend([record(b"one")], 0, 1) @@ -295,3 +326,28 @@ async def test_the_continuity_failure_says_what_to_do_about_it() -> None: buffer.extend([record(b"two")], 5, 6) # The task fails and keeps failing, so the message has to name the way out. assert "Reset the workflow" in str(failed.value) + + +def test_the_raw_workflow_stream_api_is_not_public() -> None: + # A second workflow surface taking raw stream ids and raw protos, beside + # the typed one, is not what an application should reach for. It stays + # reachable under its private name, which is what the provider and the + # contrib surface use. + import temporalio.workflow as wf + + for name in ( + "subscribe_stream", + "append_stream_records", + "read_stream_records", + "DeliveredStreamRecord", + ): + assert name not in wf.__all__ + assert not hasattr(wf, name) + for name in ( + "_subscribe_stream", + "_append_stream_records", + "_read_stream_records", + "_close_stream_records", + "_DeliveredStreamRecord", + ): + assert hasattr(wf, name) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 1d974b401..694b90b71 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -270,18 +270,18 @@ class PublishAndRead: @workflow.run async def run(self) -> list[str]: - workflow.append_stream_records( + workflow._append_stream_records( [_record(b"alpha", "progress"), _record(b"beta", "progress")], stream_id="output", ) - workflow.append_stream_records([_record(b"gamma")], stream_id="output") + workflow._append_stream_records([_record(b"gamma")], stream_id="output") # A name this workflow has not written yet still names a stream it # owns, so subscribing creates the one the later publish lands in. - workflow.subscribe_stream("output", start_offset=0) + workflow._subscribe_stream("output", start_offset=0) received: list[str] = [] while len(received) < 3: - for item in await workflow.read_stream_records("output"): + for item in await workflow._read_stream_records("output"): received.append(item.record.body.data.decode()) return received @@ -331,10 +331,10 @@ class ConsumeAcrossTasks: @workflow.run async def run(self, stream_id: str, expected: int) -> list[str]: - workflow.subscribe_stream(stream_id, start_offset=0) + workflow._subscribe_stream(stream_id, start_offset=0) seen: list[str] = [] while len(seen) < expected: - for item in await workflow.read_stream_records(stream_id): + for item in await workflow._read_stream_records(stream_id): seen.append(item.record.body.data.decode()) return seen From 588b41c5a0dfd77a2d49c8bbfeaa0260e70dc6f6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:49:34 -0700 Subject: [PATCH 611/831] Refused a stream publish from a query handler. A query is answered on a task that carries the answer alone, so the record could only ever be dropped on the way out. The call says so instead. --- temporalio/workflow/_streams.py | 10 +++++++ tests/streams/test_streams_workflow.py | 36 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py index 5d319d50a..b99125ca3 100644 --- a/temporalio/workflow/_streams.py +++ b/temporalio/workflow/_streams.py @@ -22,6 +22,7 @@ from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import RecordDecoder, to_wire from temporalio.workflow._context import _Runtime, payload_converter +from temporalio.workflow._exceptions import ReadOnlyContextError from temporalio.workflow._sandbox import logger __all__ = ["StreamReader", "StreamWriter", "stream_reader", "stream_writer"] @@ -157,9 +158,18 @@ def publish(self, value: T) -> None: Raises: ValueError: :meth:`finish` was already called on this writer. + temporalio.workflow.ReadOnlyContextError: Called from a query or an + update validator, which commit nothing. """ if self._finished: raise ValueError(f"topic {self._topic!r} was already finished") + # A query is answered on a task that carries the answer and nothing else, so a + # record published here could only ever be dropped. Said at the call rather than + # thrown away later without a word. + if _Runtime.current().workflow_is_read_only(): + raise ReadOnlyContextError( + "While in read-only function, action attempted: publish to a stream" + ) self._sink.publish( to_wire( payload_converter(), diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index 71f2bb8bf..05adf23db 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -25,6 +25,7 @@ from temporalio import workflow from temporalio.client import Client from temporalio.streams import ( + BEGINNING, Cursor, ReadSource, RecordKind, @@ -441,3 +442,38 @@ async def read_everything() -> list[Any]: ("", RecordKind.DATA, {"from": "workflow"}), ("", RecordKind.FINISH, None), ] + + +@workflow.defn +class PublishFromQuery: + """Publishes from a query handler, which commits nothing.""" + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: False) + + @workflow.query + def peek(self) -> str: + workflow.stream_writer(DECISIONS).publish({"from": "query"}) + return "unreachable" + + +async def test_a_publish_from_a_query_handler_is_refused_at_the_call( + client: Client, provider: MemoryStreams +): + # A query is answered on a task that carries the answer alone, so the record + # could only ever be dropped on the way out. The call says so instead. + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, PublishFromQuery, plugins=[provider]) as worker: + handle = await client.start_workflow( + PublishFromQuery.run, id=workflow_id, task_queue=worker.task_queue + ) + try: + with pytest.raises(Exception) as caught: + await handle.query(PublishFromQuery.peek) + assert "publish to a stream" in str(caught.value) + + stream = provider.get_stream_handle(client, workflow_id) + assert await stream.latest(topic=DECISIONS) == BEGINNING + finally: + await handle.terminate() From d69847fd4dbf9ae7879046bcc65adc467d148e2e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:49:34 -0700 Subject: [PATCH 612/831] Said so when a producer's attempt goes backwards. Attempts only rise on one producer, so a lower one means the store reordered two generations and the older half would render as the current answer. --- temporalio/streams/_policy.py | 17 +++++++++++++++-- temporalio/streams/_wire.py | 2 +- tests/streams/test_streams_conformance.py | 21 +++++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/temporalio/streams/_policy.py b/temporalio/streams/_policy.py index 81949e4fc..b27c839e5 100644 --- a/temporalio/streams/_policy.py +++ b/temporalio/streams/_policy.py @@ -12,6 +12,7 @@ from __future__ import annotations +from collections.abc import Callable from typing import Any from temporalio.streams._record import ( @@ -27,9 +28,10 @@ class AttemptTracker: """Watches producer attempts on one subscription.""" - def __init__(self) -> None: - """Start with no producer seen.""" + def __init__(self, warn: Callable[[str], None] | None = None) -> None: + """Start with no producer seen, saying anything odd through ``warn``.""" self._attempts: dict[str, int] = {} + self._warn = warn def note( self, producer_id: str, attempt: int, *, topic: str, previous: Cursor @@ -45,10 +47,21 @@ def note( A producer that declares no attempt supersedes nothing, because there is no generation to compare. That is the same answer as an unnumbered record: the interface reports what it was told and invents nothing. + + An attempt that goes backwards supersedes nothing either, and is said + rather than passed off as ordinary data: attempts only ever rise on one + producer, so a lower one means a store reordered two generations, and a + consumer reading it as the current answer would render a stale one. """ if not producer_id or attempt <= 0: return None seen = self._attempts.get(producer_id, 0) + if attempt < seen and self._warn is not None: + self._warn( + f"stream record on {topic!r} at {previous} is from attempt {attempt} of " + f"producer {producer_id!r}, behind attempt {seen}, which this reader has " + "already delivered: the store handed back two generations out of order" + ) if attempt <= seen: return None self._attempts[producer_id] = attempt diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py index 52299f44e..c6eaa3f02 100644 --- a/temporalio/streams/_wire.py +++ b/temporalio/streams/_wire.py @@ -118,7 +118,7 @@ def __init__( self._result_type = result_type self._previous = after self._warn = warn - self._attempts = AttemptTracker() + self._attempts = AttemptTracker(warn) def decode(self, cursor: Cursor, wire: WireRecord) -> list[StreamRecord[Any]]: """The records to yield for one stored record, in order.""" diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9002ea16a..a13d48f43 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -187,6 +187,27 @@ def test_supersession_is_synthesized_from_observations(): assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None +def test_an_attempt_that_goes_backwards_is_said_rather_than_passed_off(): + # Attempts only rise on one producer, so a lower one means the store handed + # two generations back out of order. Yielded as data with no signal, a + # consumer renders the stale generation as the current answer. + said: list[str] = [] + attempts = AttemptTracker(said.append) + assert attempts.note("model", 2, topic="t", previous=BEGINNING) is None + assert attempts.note("model", 1, topic="t", previous=Cursor("memory:3")) is None + assert len(said) == 1 + assert "attempt 1" in said[0] and "behind attempt 2" in said[0] + assert "model" in said[0] + + +def test_a_repeat_of_the_current_attempt_is_not_worth_saying(): + said: list[str] = [] + attempts = AttemptTracker(said.append) + attempts.note("model", 1, topic="t", previous=BEGINNING) + assert attempts.note("model", 1, topic="t", previous=Cursor("memory:1")) is None + assert said == [] + + def test_topic_keys_cannot_collide(): # A colon in a workflow id must not make two addresses one key. assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") From c927584693c9a41a3487467f2a987122c20723db Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:56:28 -0700 Subject: [PATCH 613/831] Named the replayer's stream client limit and closed its channel. Only the client's host and namespace are read and the stream service is reached without TLS, so a Cloud client fails in a way the parameter name does not suggest. The channel the fetch opened outlived the replay it served. --- temporalio/worker/_replayer.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index 47a54c218..088975ec7 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -87,6 +87,13 @@ def __init__( service and hands the records to the replay, so the workflow sees what it saw the first time. A range the stream no longer holds fails that replay with :py:class:`temporalio.streams.StreamNotFoundError`. + Only the client's target host and namespace are read: the stream + service is reached on a channel of its own, opened without TLS or + an API key, so a client connected to Temporal Cloud names the right + address and still cannot authenticate. That is a prototype limit of + :py:mod:`temporalio.client_stream`, which is where it will be + lifted. The replayer closes the channel it opened when the replay + is finished. * The history carries none and there is no client: replaying it fails and the message names both remedies. @@ -263,6 +270,7 @@ async def _workflow_replay_iterator( pusher = None workflow_worker_task = None bridge_worker_scope = None + stream_client = self._config.get("stream_client") try: last_replay_failure: Exception | None @@ -415,8 +423,6 @@ def on_eviction_hook( # Start worker workflow_worker_task = asyncio.create_task(workflow_worker.run()) - stream_client = self._config.get("stream_client") - # Yield iterator async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: async for history in histories: @@ -481,6 +487,18 @@ async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: yield replay_iterator() finally: + # The stream channel is opened by the fetch, on this loop, and is + # the replayer's to close: nothing else in the process asked for + # it, and leaving it open outlives the replay it served. + if stream_client is not None: + from temporalio.client_stream import close_shared_clients + + await close_shared_clients( + ( + stream_client.service_client.config.target_host, + stream_client.namespace, + ) + ) # Close the pusher if pusher is not None: pusher.close() From d77a5974095334a47a395a2d25fff49b055d4220 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:56:28 -0700 Subject: [PATCH 614/831] Stopped parsing an exported history twice to look for slices. Handing the parsed dict on made the history helper deep-copy it, so a large export was materialised twice for the common case of no slices. --- temporalio/client/_workflow.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/temporalio/client/_workflow.py b/temporalio/client/_workflow.py index 10a4853fd..fae6c02e7 100644 --- a/temporalio/client/_workflow.py +++ b/temporalio/client/_workflow.py @@ -1725,20 +1725,26 @@ def from_json(workflow_id: str, history: str | dict[str, Any]) -> WorkflowHistor Returns: Workflow history """ - if isinstance(history, str): - history = json.loads(history) parsed = _history_from_json(history) - slices: list[temporalio.api.stream.v1.StreamSlice] = [] + raw: Any = [] if isinstance(history, dict): raw = history.get("streamSlices") or history.get("stream_slices") or [] - for entry in raw: - slices.append( - google.protobuf.json_format.ParseDict( - entry, - temporalio.api.stream.v1.StreamSlice(), - ignore_unknown_fields=True, - ) - ) + elif '"streamSlices"' in history or '"stream_slices"' in history: + # Read again only when the text mentions them. Almost every + # history has none, and handing the parsed dict to + # _history_from_json instead would make it deep-copy an export + # that can be very large. + decoded = json.loads(history) + if isinstance(decoded, dict): + raw = decoded.get("streamSlices") or decoded.get("stream_slices") or [] + slices: list[temporalio.api.stream.v1.StreamSlice] = [ + google.protobuf.json_format.ParseDict( + entry, + temporalio.api.stream.v1.StreamSlice(), + ignore_unknown_fields=True, + ) + for entry in raw + ] return WorkflowHistory(workflow_id, parsed.events, slices) def to_json(self) -> str: From 27cad8d3676d4a0e930d7456da494787c32dbae5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:56:28 -0700 Subject: [PATCH 615/831] Followed a chain of two resets to its end. A run cannot be reset twice, so more than one reset is a chain rather than a branch. What was untested is that the walk crosses every link and stops. --- tests/worker/test_workflow_stream_e2e.py | 105 +++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index d3513c0e2..4811c3a84 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -960,3 +960,108 @@ async def test_an_exported_history_replays_offline_with_its_records() -> None: assert "fetch_stream_slices" in str(raised.value) finally: await provider.close() + + +async def test_a_chain_of_two_resets_is_followed_to_its_end() -> None: + """A run reset, and that run reset again: what a chain-following read walks. + + Resetting the same run twice is not a thing the server allows; the first + reset terminates it and the second is refused. So "reset more than once" + means a chain, base into A into B, and each run names only the one after + it. A chain-following read walks it one link at a time and stops at the + end, which is also the answer to whether it can loop: a reset always + makes a run that has never been reset itself. + """ + provider = NativeStreams() + client = await _connect(provider) + task_queue = "reset2-tq-" + uuid.uuid4().hex[:8] + workflow_id = "reset2-wf-" + uuid.uuid4().hex[:8] + + async def reset(run_id: str, reason: str) -> str: + # The last completed task of the run, whatever it did: a reset run + # picks up from there, and what matters here is the chain it makes. + completion_id = 0 + async for event in client.get_workflow_handle( + workflow_id, run_id=run_id + ).fetch_history_events(): + if event.HasField("workflow_task_completed_event_attributes"): + completion_id = event.event_id + assert completion_id + answer = await client.workflow_service.reset_workflow_execution( + ResetWorkflowExecutionRequest( + namespace=client.namespace, + workflow_execution=WorkflowExecution( + workflow_id=workflow_id, run_id=run_id + ), + reason=reason, + workflow_task_finish_event_id=completion_id, + request_id=uuid.uuid4().hex, + ) + ) + return answer.run_id + + async def reset_run_of(run_id: str) -> str: + described = await client.get_workflow_handle( + workflow_id, run_id=run_id + ).describe() + return described.raw_description.workflow_extended_info.reset_run_id + + try: + async with Worker(client, task_queue=task_queue, workflows=[ContractLoop]): + base = await client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=task_queue + ) + base_run = base.result_run_id + assert base_run + await _feed_two(client, workflow_id) + base_stream = client.get_stream_handle(workflow_id, run_id=base_run) + await take( + base_stream.read(topic=DECISIONS, result_type=dict), 2, timeout=60 + ) + + first = await reset(base_run, "the first reset") + second = await reset(first, "the second reset") + assert len({base_run, first, second}) == 3 + + # Each link names the one after it and nothing else. The last has + # not been reset, so the walk ends there rather than going round. + assert await reset_run_of(base_run) == first + assert await reset_run_of(first) == second + assert not await reset_run_of(second) + + # Let the end of the chain finish so a read can reach an end. + carry_on = client.get_stream_handle(workflow_id).producer( + topic=INPUTS, producer_id="model2", attempt=1 + ) + await carry_on.append({"n": 4}) + await carry_on.finish() + await asyncio.wait_for( + client.get_workflow_handle(workflow_id, run_id=second).result(), 60 + ) + + # The walk itself: one link at a time, ending at the run that was + # not reset. A middle run may have published nothing, so this is + # asked of the provider rather than read off the records. + handle = client.get_stream_handle(workflow_id) + walked = [base_run] + while True: + onward = await handle._successor(DECISIONS, walked[-1]) # type: ignore[attr-defined] + if onward is None: + break + assert onward[0] not in walked, "the chain must not double back" + walked.append(onward[0]) + assert walked == [base_run, first, second] + + # And a chain-following read ends, having crossed the same runs + # and repeated none of them. + decisions = await asyncio.wait_for( + _collect(client, workflow_id, DECISIONS, None), 60 + ) + seen: list[str] = [] + for _, run, _ in decisions: + if not seen or seen[-1] != run: + seen.append(run) + assert seen == sorted(set(seen), key=walked.index) + assert seen[0] == base_run and seen[-1] == second + finally: + await provider.close() From 10413f8374609cf641f9e7adc33371bf6ef7f13c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:56:57 -0700 Subject: [PATCH 616/831] Left the reach of aclose to the provider that answers it. Two of the three providers here have no way to tell their store a reader has gone, so a flat promise of an immediate release was one the interface could not keep. --- temporalio/streams/_provider.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 6a36f7e7c..86a891a62 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -132,8 +132,12 @@ def read( sees every record exactly once. The read ends when the owning execution, or its chain, is closed and every retained record after ``after`` has been delivered; until then it waits. The result is a - generator, so a caller that stops early can ``aclose()`` it and - release whatever the provider parked against the store. + generator, so a caller that stops early should ``aclose()`` it. How + much that releases is the provider's to say: one that holds only + local state lets go at once, and one that parked something on a + store it cannot un-park says in its own documentation what it + releases and when. Read the provider's ``read`` before relying on an + immediate release. Raises: ValueError: ``result_type`` was passed with a topic definition, From bb2d7ca59e89aeedb3513bba950c8cd0bae64192 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:57:45 -0700 Subject: [PATCH 617/831] Repaired the Redis provider's writes, refusals and error family. A producer's record now lands on both of a topic's keys or on neither, a batch the retention window cannot hold is refused where it is staged, and a run that continued as new still counts as a consumer. The transport's stage and integrity types no longer reach the public surface. --- temporalio/streams/providers/redis.py | 266 +++++++++++++++++--- tests/streams/test_redis_replay.py | 340 +++++++++++++++++++++++++- 2 files changed, 576 insertions(+), 30 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index f67c11b6e..69ac99a03 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -15,7 +15,10 @@ output stream, where the workflow's own promoted batches land, so an outside reader sees the producer's records and the workflow's in one order and a workflow reading the topic misses nothing however early the producer - started. The cost is one more append per record and one wake per batch. + started. Both keys are written by one script, so a record is on both or on + neither: split across two calls, a crash between them leaves a record the + workflow consumes and no outside reader can ever see. The cost is one more + append per record and one wake per batch. - A record rides as the transport's payload: the serialized ``StreamRecord`` proto as a ``binary/plain`` value, which the worker's codec encodes and decodes like any other payload. @@ -49,7 +52,7 @@ import time from collections.abc import AsyncGenerator, Coroutine, Sequence from datetime import timedelta -from typing import Any, Generic, TypeVar +from typing import Any, Final, Generic, TypeVar from google.protobuf.message import DecodeError @@ -79,6 +82,9 @@ from temporalio.contrib.external_workflow_streams import ( StreamError as TransportStreamError, ) +from temporalio.contrib.external_workflow_streams import ( + StreamRecord as TransportRecord, +) from temporalio.contrib.external_workflow_streams._backend import ( DEFAULT_WATCH_BLOCK, StreamKey, @@ -87,13 +93,20 @@ from temporalio.contrib.external_workflow_streams._errors import StreamIntegrityError from temporalio.contrib.external_workflow_streams._output_backend import ( OutputStage, + OutputStageConflictError, OutputStageManifest, + OutputStageNotFoundError, + OutputStageResolutionError, StagedOutputRecord, ) from temporalio.contrib.external_workflow_streams._output_client import ( _reconcile_output_stage, ) -from temporalio.contrib.external_workflow_streams._redis import RedisStreamBackend +from temporalio.contrib.external_workflow_streams._redis import ( + RedisStreamBackend, + _content_hash, + _text, +) from temporalio.converter import WorkflowSerializationContext from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import ( @@ -184,6 +197,115 @@ def _entry_id(token: str | bytes) -> tuple[int, int]: return int(ms), int(seq or 0) +#: Append one record to a topic's two keys, or to neither. +#: +#: The provider's own write, not the transport's: the transport appends one key at a +#: time, and the two calls that would take are not one failure. A record on the input +#: key alone is one the workflow consumes and no outside reader can ever see, and a +#: producer that comes back with a fresh sequence never heals it. +#: +#: Both idempotency hashes are read before either stream is touched, so a key already +#: used with different bytes refuses the pair rather than half-writing it. Either half +#: already present is reused, which is what settles a pair some earlier call left +#: half-written. The retention trims ride along rather than costing their own round +#: trips, and they are exact for the reason the backend's own trims are. +_PAIRED_APPEND_LUA: Final = """ +local minid = ARGV[1] +local maxlen = ARGV[2] +local function placed(idem, key, digest) + local existing = redis.call('HGET', idem, key) + if not existing then + return nil + end + local sep = string.find(existing, '|') + if string.sub(existing, sep + 1) ~= digest then + return 'conflict' + end + return string.sub(existing, 1, sep - 1) +end +local input = placed(KEYS[2], ARGV[3], ARGV[4]) +local output = placed(KEYS[4], ARGV[3], ARGV[4]) +if input == 'conflict' or output == 'conflict' then + return {'conflict', '', ''} +end +local fields = {unpack(ARGV, 5)} +if not input then + input = redis.call('XADD', KEYS[1], '*', unpack(fields)) + redis.call('HSET', KEYS[2], ARGV[3], input .. '|' .. ARGV[4]) +end +if not output then + output = redis.call('XADD', KEYS[3], '*', unpack(fields)) + redis.call('HSET', KEYS[4], ARGV[3], output .. '|' .. ARGV[4]) +end +if minid ~= '' then + redis.call('XTRIM', KEYS[1], 'MINID', minid) + redis.call('XTRIM', KEYS[3], 'MINID', minid) +end +if maxlen ~= '' then + redis.call('XTRIM', KEYS[1], 'MAXLEN', maxlen) + redis.call('XTRIM', KEYS[3], 'MAXLEN', maxlen) +end +return {'ok', input, output} +""" + + +class _PairedAppend: + """One logical record on a topic's input and output keys, in one Redis call.""" + + def __init__(self, backend: RedisStreamBackend) -> None: + """Bind to ``backend``'s client and key layout.""" + self._backend = backend + self._script = backend._client.register_script(_PAIRED_APPEND_LUA) + + async def write( + self, + *, + input_key: StreamKey, + output_key: StreamKey, + record: TransportRecord, + ) -> Offset: + """Append ``record`` to both keys and return where it landed on the output key. + + A repeat of the same ``(session, sequence)`` with the same bytes returns the + original positions and writes nothing, so a call whose answer was lost is + settled by making it again. + """ + args: list[Any] = [ + self._minid().encode(), + self._maxlen().encode(), + str(record.idempotency_key).encode(), + _content_hash(record).encode(), + ] + for name, value in sorted(record.to_fields().items()): + args.append(name.encode()) + args.append(value) + outcome, _, output = await self._script( + keys=[ + self._backend.stream_key(input_key), + self._backend._idempotency_key(input_key), + self._backend.stream_key(output_key), + self._backend._idempotency_key(output_key), + ], + args=args, + ) + if _text(outcome) == "conflict": + raise AppendConflictError(record.idempotency_key) + return Offset(_text(output)) + + def _minid(self) -> str: + retention = getattr(self._backend, "_retention", None) + if retention is None: + return "" + # The worker's clock names the floor, so a skewed worker shifts the window by + # its skew, the same as the backend's own trim. + floor = int((time.time() - retention.total_seconds()) * 1000) + return f"{max(floor, 0)}-0" + + def _maxlen(self) -> str: + max_len = getattr(self._backend, "_max_len", None) + return "" if max_len is None else str(max_len) + + class _RetainingBackend(RedisStreamBackend): """The transport's Redis backend, trimming the key behind every append it makes. @@ -223,6 +345,18 @@ async def append(self, key: StreamKey, record: Any) -> Any: async def stage_output( self, manifest: OutputStageManifest, records: Sequence[StagedOutputRecord] ) -> OutputStage: + # A stage is invisible until its task commits, and the trim has no consumer + # floor to hold it: a window at or below the batch takes entries out of the + # stage that was just written, and the commit then fails on a missing record + # for as long as the task retries. Flooring the trim instead would need the + # floor this provider deliberately does not keep, and would not hold anyway, + # because the trim that removes the stage is not the one that staged it. + if self._max_len is not None and manifest.record_count >= self._max_len: + raise ValueError( + f"this task publishes {manifest.record_count} records and max_len is " + f"{self._max_len}: the window has to exceed the largest batch a task " + "publishes, or the batch is trimmed before it commits" + ) stage = await super().stage_output(manifest, records) await self._trim(manifest.stream_key) return stage @@ -245,14 +379,11 @@ async def retains(self, key: StreamKey, offset: Offset) -> bool: A record at or after the first retained entry is there. On an emptied stream the last id Redis generated says whether the record ever was. """ - from redis.exceptions import ResponseError - - try: - info = await self._client.xinfo_stream(self.stream_key(key)) - except ResponseError as error: - if "no such key" in str(error).lower(): - return True - raise + name = self.stream_key(key) + if not await self._client.exists(name): + # Nothing was ever written under this key, so nothing was trimmed from it. + return True + info = await self._client.xinfo_stream(name) wanted = _entry_id(offset.token) first = info.get("first-entry") if first: @@ -376,10 +507,24 @@ async def _chain(client: Client, workflow_id: str) -> WorkflowChainKey: ) +#: A chain still has a consumer while a run is in either of these: a run that +#: continued as new hands the stream to its successor rather than ending it. +_STILL_CONSUMING: Final = ( + WorkflowExecutionStatus.RUNNING, + WorkflowExecutionStatus.CONTINUED_AS_NEW, +) + + def _storage_error(error: Exception, what: str) -> StreamError: return StreamError(f"{what}: {error}") +def _integrity_error(error: Exception, what: str) -> StreamError: + # Named as a loss rather than a transient read failure, because no retry brings + # a trimmed record back and the caller's next move is different. + return StreamNotFoundError(f"{what}: {error}") + + class RedisProducer(Generic[T]): """Appends to a topic from outside workflow code. @@ -410,6 +555,8 @@ def __init__( self._last = BEGINNING self._input: Any = None self._output: Any = None + self._pair: _PairedAppend | None = None + self._codec: StreamPayloadCodec[bytes] | None = None @property def producer_id(self) -> str: @@ -501,16 +648,36 @@ async def _connect(self) -> None: ) from error self._output = output.topic(self._topic, type=bytes) self._input = input_.topic(self._topic, type=bytes) + self._pair = _PairedAppend(backend) + self._codec = StreamPayloadCodec( + self._client.data_converter.with_context( + WorkflowSerializationContext( + namespace=chain.namespace, workflow_id=chain.workflow_id + ) + ), + bytes, + ) async def _write(self, records: list[WireRecord]) -> Cursor: await self._connect() + assert self._pair is not None and self._codec is not None last: Offset | None = None try: - for record in records: - frame = record.SerializeToString() - await self._input.publish(frame, wake=False) - placed = await self._output.publish(frame) - last = placed.offset + for index, record in enumerate(records): + # Built here rather than handed to the transport's publish, which + # appends one key per call. The identity is the same one the transport + # would derive, so a record either side already holds is reused. + staged = TransportRecord( + kind=TransportRecordKind.DATA, + payload=await self._codec.encode(record.SerializeToString()), + producer_session_id=self._session, + sequence=self._sequence + index, + ) + last = await self._pair.write( + input_key=self._input.stream_key, + output_key=self._output.stream_key, + record=staged, + ) await self._wake() except AppendConflictError as error: raise StreamProducerError( @@ -544,7 +711,8 @@ async def _consumer_has_gone(self) -> bool: Asked for a few seconds rather than once: the server refuses the wake while the execution is closing, and at that moment its status is - still the running one. + still the running one. A run that continued as new has not gone: the + streams are keyed by the chain, so its successor is the consumer now. """ handle = self._client.get_workflow_handle(self._workflow_id) deadline = time.monotonic() + 5 @@ -555,7 +723,7 @@ async def _consumer_has_gone(self) -> bool: if error.status == RPCStatusCode.NOT_FOUND: return True raise - if status is not None and status != WorkflowExecutionStatus.RUNNING: + if status is not None and status not in _STILL_CONSUMING: return True if time.monotonic() >= deadline: return False @@ -594,7 +762,19 @@ def read( after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes. + + Two refusals and they do not land together. A cursor another provider minted, + or one naming the workflow's own input log, is refused by this call: reading + the token needs nothing from the store. A well-formed cursor the retention has + trimmed is refused on the first step of the generator, because answering that + needs a round trip and this call is not a coroutine. Neither yields a record + first. + + Raises: + StreamCursorError: The cursor is another provider's, or names the + workflow's input log. + """ topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. @@ -635,6 +815,11 @@ async def _read( max_records=_READ_BATCH, block=self._streams._poll, ) + except StreamIntegrityError as error: + # Integrity loss is permanent, and the taxonomy the transport builds + # on it is the difference between a retry that clears and one that + # never will. Filed as a store read, an operator retries forever. + raise _integrity_error(error, "the store lost records") from error except TransportStreamError as error: raise _storage_error(error, "the store could not be read") from error for placed in result.records: @@ -653,12 +838,31 @@ async def _read( # A staged batch whose task History has not settled yet is a # barrier: nothing past it is read until History says whether # the task was accepted. - resolved = await _reconcile_output_stage( - backend=backend, - client=self._client, - workflow_id=self._workflow_id, - manifest=result.pending.manifest, - ) + try: + resolved = await _reconcile_output_stage( + backend=backend, + client=self._client, + workflow_id=self._workflow_id, + manifest=result.pending.manifest, + ) + except StreamIntegrityError as error: + raise _integrity_error( + error, "a staged batch lost records" + ) from error + except ( + OutputStageConflictError, + OutputStageNotFoundError, + OutputStageResolutionError, + ) as error: + # The transport's own stage vocabulary does not cross the public + # surface: to a reader this is a batch that cannot be settled. + raise _storage_error( + error, "a staged batch could not be settled" + ) from error + except TransportStreamError as error: + raise _storage_error( + error, "a staged batch could not be settled" + ) from error if not resolved: await asyncio.sleep(self._streams._poll.total_seconds()) continue @@ -685,12 +889,16 @@ async def _closed(self) -> bool: return False # The streams are keyed by the chain, so a run that continued as new # is not the end unless the handle was pinned to it. - return not ( - self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW - ) + return not (self._run_id is None and status in _STILL_CONSUMING) async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: - """The cursor of the newest committed record on ``topic``, for following from now.""" + """The cursor of the newest committed record on ``topic``, for following from now. + + ``BEGINNING`` when the topic holds no committed record, which a topic whose + records retention has all trimmed answers too: the two are the same state to + a reader, and a read from it starts at the first record retained after it + rather than at the tail the caller asked to follow from. + """ topic, _ = resolve_topic(topic) backend = self._streams._require_backend() chain = await _chain(self._client, self._workflow_id) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 167b0e310..a2b716756 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -23,8 +23,25 @@ from temporalio import workflow from temporalio.client import Client +from temporalio.contrib.external_workflow_streams import ( + RecordKind as TransportRecordKind, +) from temporalio.contrib.external_workflow_streams import StreamDirection -from temporalio.streams import BEGINNING, Cursor, RecordKind, StreamCursorError +from temporalio.contrib.external_workflow_streams._codec import StreamPayloadCodec +from temporalio.contrib.external_workflow_streams._output_backend import ( + OutputStageManifest, + OutputStageStatus, + StagedOutputRecord, +) +from temporalio.converter import WorkflowSerializationContext +from temporalio.streams import ( + BEGINNING, + Cursor, + RecordKind, + StreamCursorError, + StreamProducerError, +) +from temporalio.streams._wire import to_wire from temporalio.streams.providers.redis import RedisStreams, _chain from temporalio.worker import Replayer, Worker from tests.streams.test_streams_conformance import StreamHost, take @@ -429,3 +446,324 @@ async def test_a_workflow_reader_started_from_a_cursor_skips_the_earlier_records ).fetch_history() ) await replayer.replay_workflow(await handle.fetch_history()) + + +async def _stage_one( + streams: RedisStreams, + client: Client, + workflow_id: str, + run_id: str, + topic: str, + values: list[Any], +) -> tuple[Any, Any]: + """Stage ``values`` on ``topic``'s output key without committing them. + + Staged the way the worker stages a task's publishes, so the records read back as + records rather than as bytes the reader has to skip. + """ + backend = streams._require_backend() + chain = await _chain(client, workflow_id) + key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) + codec: StreamPayloadCodec[bytes] = StreamPayloadCodec( + client.data_converter.with_context( + WorkflowSerializationContext( + namespace=client.namespace, workflow_id=workflow_id + ) + ), + bytes, + ) + records = [] + for index, value in enumerate(values): + wire = to_wire( + client.data_converter.payload_converter, + topic=topic, + kind=RecordKind.DATA, + value=value, + ) + records.append( + StagedOutputRecord( + kind=TransportRecordKind.DATA, + payload=await codec.encode(wire.SerializeToString()), + publish_index=index, + ) + ) + manifest = OutputStageManifest( + stream_key=key, + provider_id=backend.provider_id, + provider_format_version=backend.provider_format_version, + stage_token=uuid.uuid4().hex, + run_id=run_id, + history_floor_event_id=3, + sub_batch_id=0, + fingerprint_version=1, + fingerprint=b"\x01" * 32, + record_count=len(records), + logical_byte_count=sum(len(r.payload) for r in records), + ) + await backend.stage_output(manifest, records) + return backend, manifest + + +async def test_a_pending_stage_is_settled_by_the_reader_rather_than_wedging_it( + live_client: Client, provider: RedisStreams +): + # The commit protocol's own failure modes, which nothing else here reaches: a + # stage whose task never landed in History is a barrier until the reader + # reconciles it, the reconcile aborts it, and the records it held are never + # handed over while everything behind it flows. + workflow_id = f"streams-redis-stage-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[provider], + ) as worker: + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + + backend, manifest = await _stage_one( + provider, + live_client, + workflow_id, + handle.first_execution_run_id or "", + INPUTS.name, + [{"n": 10}, {"n": 11}], + ) + assert ( + await backend.output_stage(manifest) + ).status is OutputStageStatus.PENDING + + # Behind the stage so the read has to get past it to reach this. + await producer.append({"n": 2}) + + assert [r.value for r in await take(stream.read(topic=INPUTS), 2, 30)] == [ + {"n": 1}, + {"n": 2}, + ] + # The task never reached History, so the reader settled the stage as + # aborted and its records are gone rather than pending forever. + assert ( + await backend.output_stage(manifest) + ).status is OutputStageStatus.ABORTED + + await handle.signal(StreamHost.release) + await handle.result() + + +async def test_an_aborted_stage_yields_nothing_and_stops_being_a_barrier( + live_client: Client, provider: RedisStreams +): + workflow_id = f"streams-redis-abort-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[provider], + ) as worker: + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + backend, manifest = await _stage_one( + provider, + live_client, + workflow_id, + handle.first_execution_run_id or "", + INPUTS.name, + [{"n": 10}], + ) + await backend.abort_output(manifest) + await producer.append({"n": 2}) + + await handle.signal(StreamHost.release) + await handle.result() + assert [r.value async for r in stream.read(topic=INPUTS)] == [ + {"n": 1}, + {"n": 2}, + ] + + +async def test_a_committed_stage_is_released_in_the_order_it_was_staged( + live_client: Client, provider: RedisStreams +): + workflow_id = f"streams-redis-commit-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[provider], + ) as worker: + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(live_client, workflow_id) + backend, manifest = await _stage_one( + provider, + live_client, + workflow_id, + handle.first_execution_run_id or "", + INPUTS.name, + [{"n": 10}, {"n": 11}], + ) + await backend.commit_output(manifest) + + assert await stream.latest(topic=INPUTS) != BEGINNING + await handle.signal(StreamHost.release) + await handle.result() + assert [r.value async for r in stream.read(topic=INPUTS)] == [ + {"n": 10}, + {"n": 11}, + ] + + +async def test_a_batch_the_window_cannot_hold_is_refused_at_the_stage( + live_client: Client, +): + # max_len at or below a task's batch trims the stage before its commit, and + # the commit then fails on a missing record for as long as the task retries. + streams = RedisStreams( + url=redis_url(), key_prefix=f"streams-redis-{uuid.uuid4().hex}", max_len=2 + ) + workflow_id = f"streams-redis-window-{uuid.uuid4().hex}" + try: + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[streams], + ) as worker: + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + run_id = handle.first_execution_run_id or "" + with pytest.raises(ValueError, match="has to exceed the largest batch"): + await _stage_one( + streams, + live_client, + workflow_id, + run_id, + INPUTS.name, + [{"n": 1}, {"n": 2}], + ) + # One below the window still stages. + await _stage_one( + streams, live_client, workflow_id, run_id, INPUTS.name, [{"n": 1}] + ) + await handle.signal(StreamHost.release) + await handle.result() + finally: + await streams.close() + + +async def test_a_producer_record_lands_on_both_keys_or_on_neither( + live_client: Client, provider: RedisStreams +): + # The workflow reads the input key and outside readers read the output key. + # Written one at a time, a crash between them leaves a record the workflow + # acts on that no outside reader can ever see. + workflow_id = f"streams-redis-pair-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[provider], + ) as worker: + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + producer = provider.get_stream_handle(live_client, workflow_id).producer( + topic=INPUTS, producer_id="model", attempt=1 + ) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( + 3, + 3, + ) + + # A producer that comes back with a fresh sequence re-appends the same + # identities, which the script reuses rather than doubling. + again = provider.get_stream_handle(live_client, workflow_id).producer( + topic=INPUTS, producer_id="model", attempt=1 + ) + await again.append({"n": 1}, {"n": 2}, {"n": 3}) + assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( + 3, + 3, + ) + + await handle.signal(StreamHost.release) + await handle.result() + + +async def test_a_repeat_under_one_identity_with_other_bytes_writes_neither_key( + live_client: Client, provider: RedisStreams +): + workflow_id = f"streams-redis-conflict-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[provider], + ) as worker: + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(live_client, workflow_id) + await stream.producer(topic=INPUTS, producer_id="model", attempt=1).append( + {"n": 1} + ) + other = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + with pytest.raises(StreamProducerError, match="sequence 0"): + await other.append({"n": 99}) + # The refusal wrote nothing on either key. + assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( + 1, + 1, + ) + await handle.signal(StreamHost.release) + await handle.result() + + +async def test_a_refused_output_half_leaves_the_input_key_untouched( + live_client: Client, provider: RedisStreams +): + # The two keys are one write. Written one at a time, the input half lands + # before the output half is refused, and the workflow then consumes a record + # no outside reader can ever see. + workflow_id = f"streams-redis-atomic-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[StreamHost], + plugins=[provider], + ) as worker: + handle = await live_client.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + backend = provider._require_backend() + chain = await _chain(live_client, workflow_id) + output_key = chain.stream_key(INPUTS.name, direction=StreamDirection.OUTPUT) + # Claim the output half's first identity with other bytes, which is what a + # refusal of that half looks like from the producer's side. + await backend._client.hset( + backend._idempotency_key(output_key), "model#1/0", "1-0|" + "0" * 64 + ) + + producer = provider.get_stream_handle(live_client, workflow_id).producer( + topic=INPUTS, producer_id="model", attempt=1 + ) + with pytest.raises(StreamProducerError, match="sequence 0"): + await producer.append({"n": 1}) + + assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( + 0, + 0, + ) + await handle.signal(StreamHost.release) + await handle.result() From 17a308e634d4146321ef2e0eea94d6b54bab9f2b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 14:58:10 -0700 Subject: [PATCH 618/831] Ran the Redis stream tests in CI against a service container. Every case that proves retention, cursor ownership and the staged commit was behind a gate no job set, so the provider had no automated evidence at all. --- .github/workflows/ci.yml | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a53035a7d..f55413c2a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -100,6 +100,56 @@ jobs: npx doctoc README.md [[ -z $(git status --porcelain README.md) ]] || (git diff README.md; echo "README changed"; exit 1) + # The client-side (Redis) stream provider's own evidence. Its tests need a store + # this repo does not otherwise stand up, so without this job nothing that proves + # retention, cursor ownership, the staged commit or the paired producer write ever + # runs anywhere but a developer's machine. + streams-redis: + timeout-minutes: 30 + runs-on: ubuntu-latest + services: + redis: + image: redis:8-alpine + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 5s + --health-timeout 3s + --health-retries 10 + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + submodules: recursive + - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.13" + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: temporalio/bridge -> target + key: streams-redis-${{ env.pythonLocation }} + - uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3 + with: + version: "23.x" + repo-token: ${{ secrets.GITHUB_TOKEN }} + - uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8 + - run: uv tool install poethepoet + - run: uv sync --all-extras + - run: poe build-develop + # The dev server comes from the test environment, the store from the service + # above. Run serially: the cases measure real timing and share one Redis. + - run: uv run pytest tests/streams -p no:randomly -s + timeout-minutes: 20 + env: + STREAMS_LIVE: redis + TEMPORAL_TEST_REDIS_URL: redis://127.0.0.1:6379 + AI198_REDIS_URL: redis://127.0.0.1:6379 + # Also without the store, so the gate itself keeps working and the memory + # provider's conformance run stays honest. + - run: uv run pytest tests/streams -p no:randomly -s + timeout-minutes: 10 + # Verify the optional FIPS build: the Rust core must link aws-lc-fips-sys # (aws-lc-rs FIPS mode) and must NOT link `ring` (the cargo-tree guard, ported # from sdk-ruby PR #466's `fips_tree` guard); then run the test suite against the From 9ea02e9642c5384be2457ecd63cbf99ab9ea4621 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 15:36:49 -0700 Subject: [PATCH 619/831] Regenerated the vendored stream protos and repinned Core. The stream commands name a stream rather than an id, and an appended batch records its end offset rather than a count. Core moves to the matching protos-only branch so the vendored tree still regenerates from the pin. --- temporalio/api/command/v1/message_pb2.py | 8 +- temporalio/api/command/v1/message_pb2.pyi | 44 ++-- temporalio/api/history/v1/message_pb2.py | 240 +++++++++++----------- temporalio/api/history/v1/message_pb2.pyi | 43 ++-- temporalio/api/stream/v1/message_pb2.pyi | 39 +++- temporalio/bridge/sdk-core | 2 +- 6 files changed, 210 insertions(+), 166 deletions(-) diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index 8c36c1f7b..dc2cf111b 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x42\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"r\n$AppendStreamRecordsCommandAttributes\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"S\n SubscribeStreamCommandAttributes\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x42\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -455,7 +455,7 @@ _COMMAND._serialized_start = 5274 _COMMAND._serialized_end = 7806 _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7808 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7920 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7922 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 7997 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7922 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7924 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8007 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index f623eecfd..15414b7d0 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -1405,10 +1405,14 @@ class AppendStreamRecordsCommandAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - STREAM_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int RECORDS_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Empty means the Workflow's default output stream.""" + stream_name: builtins.str + """Name of a stream this Workflow owns, scoped to the Workflow. Created on + first use. Empty means the Workflow's default output stream. A Workflow + cannot append to a stream in another execution, so this is never the id + of a standalone stream. + """ @property def records( self, @@ -1421,7 +1425,7 @@ class AppendStreamRecordsCommandAttributes(google.protobuf.message.Message): def __init__( self, *, - stream_id: builtins.str = ..., + stream_name: builtins.str = ..., records: collections.abc.Iterable[ temporalio.api.stream.v1.message_pb2.StreamRecord ] @@ -1430,7 +1434,7 @@ class AppendStreamRecordsCommandAttributes(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "records", b"records", "stream_id", b"stream_id" + "records", b"records", "stream_name", b"stream_name" ], ) -> None: ... @@ -1447,30 +1451,36 @@ class SubscribeStreamCommandAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - STREAM_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_OR_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Stream to consume. A stream in another execution is addressed by its id; - one this Workflow owns is addressed by the name it was published under. - The server resolves an owned name first and falls back to a standalone - id, so a Workflow that owns a stream under this name cannot reach a - standalone stream with the same id. + stream_name_or_id: builtins.str + """Stream to consume, named either way round: a stream this Workflow owns + by the name it appends under, a stream in another execution by its id. + The server tries them in that order, so a Workflow that owns a stream + under this name cannot reach a standalone stream with the same id. When + neither exists the Workflow gets a stream of its own by that name, which + is how a reader subscribes before the first record is written. """ start_offset: builtins.int - """Where to start. Negative means from wherever the stream is when the - subscription is registered, which the server resolves and records so - replay does not resolve it again. + """Where to start, as an absolute offset. Any negative value means the head + of the stream as of registration, and they all mean the same thing. The + server resolves it and records the result, so replay does not resolve it + again. + + There is no way to ask for the earliest readable offset of a stream that + has been truncated. Reading it from DescribeStream and passing it here + races with further truncation. """ def __init__( self, *, - stream_id: builtins.str = ..., + stream_name_or_id: builtins.str = ..., start_offset: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "start_offset", b"start_offset", "stream_id", b"stream_id" + "start_offset", b"start_offset", "stream_name_or_id", b"stream_name_or_id" ], ) -> None: ... diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index 14b3cbfb9..7d6d747ab 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -61,7 +61,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -1258,127 +1258,127 @@ _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5999 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6002 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6151 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6154 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6545 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6548 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7254 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7257 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7543 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7546 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7778 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7781 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8067 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8070 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8268 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8270 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8384 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8387 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8661 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8664 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8811 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8813 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8884 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8887 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9021 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9024 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9223 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9226 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9361 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9364 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9725 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9645 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9725 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9728 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10047 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10050 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10179 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10182 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 6005 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6008 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6157 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6160 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6551 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6554 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7260 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7263 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7549 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7552 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7784 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7787 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8073 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8076 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8274 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8276 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8390 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8393 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8667 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8670 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8817 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8819 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8890 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8893 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9027 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9030 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9229 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9232 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9367 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9370 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9731 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9651 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9731 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9734 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10053 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10056 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10185 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10188 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10466 + 10472 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10469 + 10475 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10815 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10818 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11015 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11018 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11397 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11400 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11739 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11742 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11953 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11956 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12114 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12117 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12255 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12258 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13534 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13537 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13879 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13882 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14177 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14180 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14505 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14508 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14887 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14890 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15215 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15218 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15548 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15551 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15827 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15830 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16560 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16410 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16560 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16563 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16883 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16886 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17030 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17032 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17156 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17159 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17310 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17313 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17533 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17536 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17706 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17709 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17980 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17983 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18147 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18149 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18243 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18245 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18341 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18344 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18541 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18544 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19108 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19058 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19108 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19111 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19248 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19251 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19388 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19391 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19527 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19530 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19668 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19671 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19809 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19811 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19927 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19930 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20081 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20084 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20283 - _HISTORYEVENT._serialized_start = 20286 - _HISTORYEVENT._serialized_end = 28678 - _HISTORY._serialized_start = 28680 - _HISTORY._serialized_end = 28744 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10821 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10824 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11021 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11024 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11403 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11406 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11745 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11748 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11959 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11962 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12120 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12123 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12261 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12264 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13540 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13543 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13885 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13888 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14183 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14186 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14511 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14514 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14893 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14896 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15221 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15224 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15554 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15557 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15833 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15836 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16566 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16416 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16566 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16569 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16889 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16892 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17036 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17038 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17162 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17165 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17312 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17315 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17535 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17538 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17708 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17711 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17982 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17985 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18149 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18151 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18245 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18247 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18343 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18346 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18543 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18546 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19110 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19060 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19110 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19113 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19250 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19253 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19390 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19393 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19529 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19532 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19670 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19673 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19811 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19813 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19929 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19932 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20083 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20086 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20285 + _HISTORYEVENT._serialized_start = 20288 + _HISTORYEVENT._serialized_end = 28680 + _HISTORY._serialized_start = 28682 + _HISTORY._serialized_end = 28746 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index bc708a6cb..6cfdea7ef 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -1081,7 +1081,6 @@ class WorkflowTaskCompletedEventAttributes(google.protobuf.message.Message): Recorded on every task where a subscription is active, including when it observed nothing: an empty range is a fact replay must reproduce, and omitting it would let replay deliver records the Workflow did not have. - Numbered 20 to leave 14 through 19 free for fields added on the main line. """ def __init__( self, @@ -3634,7 +3633,10 @@ class WorkflowStreamSubscribedEventAttributes(google.protobuf.message.Message): subscription. """ stream_id: builtins.str - """Stream the Workflow subscribed to.""" + """The stream the Workflow subscribed to, as the command addressed it: + either the name of a stream this Workflow owns or the id of one in + another execution. + """ start_offset: builtins.int """The offset the subscription actually starts from. Resolved by the server when the subscription is registered and recorded here, so replay reads @@ -3669,38 +3671,45 @@ class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Messa WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int STREAM_ID_FIELD_NUMBER: builtins.int - FIRST_OFFSET_FIELD_NUMBER: builtins.int - RECORD_COUNT_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int workflow_task_completed_event_id: builtins.int """The WorkflowTaskCompleted event of the task whose command appended this batch. """ stream_id: builtins.str - """Stream the Workflow appended to.""" - first_offset: builtins.int - """Offset the first record of the batch landed at.""" - record_count: builtins.int - """How many records the batch held. With first_offset this names the range - without carrying any of it, which is what keeps this event a fixed size - no matter how large the batch or its payloads are. + """Name of the stream the Workflow appended to.""" + from_offset: builtins.int + """Inclusive. Same range vocabulary as StreamRange and StreamSlice, so a + reader does not have to remember which of the three counts and which + bounds. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "from" and "to" name a half-open offset range. --) + """ + to_offset: builtins.int + """Exclusive. With from_offset this names the range without carrying any of + it, which is what keeps this event a fixed size no matter how large the + batch or its payloads are. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "from" and "to" name a half-open offset range. --) """ def __init__( self, *, workflow_task_completed_event_id: builtins.int = ..., stream_id: builtins.str = ..., - first_offset: builtins.int = ..., - record_count: builtins.int = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "first_offset", - b"first_offset", - "record_count", - b"record_count", + "from_offset", + b"from_offset", "stream_id", b"stream_id", + "to_offset", + b"to_offset", "workflow_task_completed_event_id", b"workflow_task_completed_event_id", ], diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi index 74a6d4a75..ffd60bcb2 100644 --- a/temporalio/api/stream/v1/message_pb2.pyi +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -95,8 +95,13 @@ class StreamRecord(google.protobuf.message.Message): SEQUENCE_FIELD_NUMBER: builtins.int @property def body(self) -> temporalio.api.common.v1.message_pb2.Payload: - """The value the producer published, stored as sent. A payload codec - applies here as it does to any other payload. + """The value the producer published, stored as sent. + + A payload codec applies on the paths this API owns: the append command on + RespondWorkflowTaskCompleted, and the slices on PollWorkflowTaskQueue. + Records a producer writes or reads through the stream service take a + different path, whose messages are not part of this API yet and so are + outside what a codec-applying proxy walks. """ @property def metadata( @@ -116,8 +121,9 @@ class StreamRecord(google.protobuf.message.Message): producer as superseding what the earlier one wrote. """ sequence: builtins.int - """The producer's position within its attempt, or -1 when unnumbered. - Stored as sent; the server does not assign, validate or order by it. + """The producer's position within its attempt, zero when it does not number + its records. Stored as sent; the server does not assign, validate or + order by it, and the stream's own offsets are what order a read. """ def __init__( self, @@ -173,15 +179,24 @@ class StreamSlice(google.protobuf.message.Message): RECORDS_FIELD_NUMBER: builtins.int WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int stream_id: builtins.str + """The stream, as the subscribing command addressed it: either the name of + a stream the consuming Workflow owns or the id of one in another + execution. + """ run_id: builtins.str """Run id of the execution that owns the stream. Set on both a slice for the task being started and a re-supplied one. """ from_offset: builtins.int - """Inclusive.""" + """Inclusive. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "from" and "to" name a half-open offset range. --) + """ to_offset: builtins.int """Exclusive. Equal to from_offset when the subscription observed nothing, which is a fact replay has to reproduce rather than an absence of one. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "from" and "to" name a half-open offset range. --) """ @property def records( @@ -241,10 +256,20 @@ class StreamRange(google.protobuf.message.Message): FROM_OFFSET_FIELD_NUMBER: builtins.int TO_OFFSET_FIELD_NUMBER: builtins.int stream_id: builtins.str + """The stream, as the subscribing command addressed it: either the name of + a stream the consuming Workflow owns or the id of one in another + execution. + """ from_offset: builtins.int - """Inclusive.""" + """Inclusive. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "from" and "to" name a half-open offset range. --) + """ to_offset: builtins.int - """Exclusive.""" + """Exclusive. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "from" and "to" name a half-open offset range. --) + """ def __init__( self, *, diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 5209468cb..2e05ed425 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 5209468cb61533f95b78c9f9d5561d55400e2d25 +Subproject commit 2e05ed42508992625d9e9fd93acf3a74495923b0 From d0e99f779c4bcbdab5e43fc3adb2ab7359e713e4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 15:43:09 -0700 Subject: [PATCH 620/831] Freed zero to mean a producer that does not number. The wire no longer carries a sentinel for an unnumbered record, so the memory producer starts its own numbering at one and leaves zero to the producers that never set it. --- temporalio/streams/_record.py | 4 ++-- temporalio/streams/_wire.py | 2 +- temporalio/streams/providers/memory.py | 4 +++- tests/streams/test_streams_conformance.py | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index fef63e51c..15bd8b253 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -107,8 +107,8 @@ class StreamRecord(Generic[T]): """Who wrote it, or empty when the owning workflow wrote it itself.""" attempt: int = 0 """The producer's attempt, or 0 when it did not declare one.""" - sequence: int = -1 - """The producer's position within its attempt, or -1 when unnumbered.""" + sequence: int = 0 + """The producer's position within its attempt, or 0 when it does not number.""" value: T | None = None """The published value. Set on ``DATA`` only.""" supersession: Supersession | None = None diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py index 52299f44e..4913cc308 100644 --- a/temporalio/streams/_wire.py +++ b/temporalio/streams/_wire.py @@ -43,7 +43,7 @@ def to_wire( value: Any = None, producer_id: str = "", attempt: int = 0, - sequence: int = -1, + sequence: int = 0, ) -> WireRecord: """Build the record a provider stores or ships. diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 9bcf2ecf9..93b2a3482 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -240,7 +240,9 @@ def __init__( self._topic = topic self._producer_id = producer_id self._attempt = attempt - self._sequence = 0 + # One-based, because zero on the wire says the producer does not + # number its records and this one does. + self._sequence = 1 self._last = BEGINNING @property diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 484c39f6c..b17bbf802 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -138,7 +138,7 @@ async def test_append_read_roundtrip(case: ProviderCase): assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] assert records[2].value is None assert all(r.producer_id == "model" and r.attempt == 1 for r in records) - assert [r.sequence for r in records] == [0, 1, 2] + assert [r.sequence for r in records] == [1, 2, 3] assert all(r.topic == OUT.name for r in records) From ced05ace7478fe253eb12ae168aa51df9443339e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 15:49:10 -0700 Subject: [PATCH 621/831] Freed zero to mean a producer that does not number. The wire no longer carries a sentinel for an unnumbered record, so the memory producer starts its own numbering at one and leaves zero to the producers that never set it. --- temporalio/streams/_record.py | 4 ++-- temporalio/streams/_wire.py | 2 +- temporalio/streams/providers/memory.py | 4 +++- tests/streams/test_streams_conformance.py | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index fef63e51c..15bd8b253 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -107,8 +107,8 @@ class StreamRecord(Generic[T]): """Who wrote it, or empty when the owning workflow wrote it itself.""" attempt: int = 0 """The producer's attempt, or 0 when it did not declare one.""" - sequence: int = -1 - """The producer's position within its attempt, or -1 when unnumbered.""" + sequence: int = 0 + """The producer's position within its attempt, or 0 when it does not number.""" value: T | None = None """The published value. Set on ``DATA`` only.""" supersession: Supersession | None = None diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py index 52299f44e..4913cc308 100644 --- a/temporalio/streams/_wire.py +++ b/temporalio/streams/_wire.py @@ -43,7 +43,7 @@ def to_wire( value: Any = None, producer_id: str = "", attempt: int = 0, - sequence: int = -1, + sequence: int = 0, ) -> WireRecord: """Build the record a provider stores or ships. diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index f175570a8..b63c52ecf 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -209,7 +209,9 @@ def __init__( self._topic = topic self._producer_id = producer_id self._attempt = attempt - self._sequence = 0 + # One-based, because zero on the wire says the producer does not + # number its records and this one does. + self._sequence = 1 self._last = BEGINNING @property diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9002ea16a..11e73643c 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -218,7 +218,7 @@ async def test_append_read_roundtrip(case: ProviderCase): assert [r.value for r in records[:2]] == [{"id": "r1"}, {"id": "r2"}] assert records[2].value is None assert all(r.producer_id == "model" and r.attempt == 1 for r in records) - assert [r.sequence for r in records] == [0, 1, 2] + assert [r.sequence for r in records] == [1, 2, 3] assert all(r.topic == OUT.name for r in records) From 55eef1855d0fc1eedbf94541803eb5f8a7f465e6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 15:51:13 -0700 Subject: [PATCH 622/831] Started the native producer's numbering at one. Zero on the wire says a producer does not number its records, and this one does, so it cannot start there. --- temporalio/streams/providers/native.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 83aeacfa7..c1595d039 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -201,7 +201,9 @@ def __init__( self._topic = topic self._producer_id = producer_id self._attempt = attempt - self._sequence = 0 + # One-based, because zero on the wire says the producer does not + # number its records and this one does. + self._sequence = 1 self._last = BEGINNING @property From 1ebd3c157199efa2cd7ee92f59780e5f79c4e80a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 15:58:41 -0700 Subject: [PATCH 623/831] Repinned Core to the renamed stream command fields. The pinned Core names the stream command fields after what they carry, so the generated bridge modules have to match it. --- .../workflow_commands_pb2.py | 136 +++++++++--------- .../workflow_commands_pb2.pyi | 35 +++-- temporalio/bridge/sdk-core | 2 +- 3 files changed, 93 insertions(+), 80 deletions(-) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 5af8f0744..792170b7a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"_\n\x13\x41ppendStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord":\n\x0fSubscribeStream\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"B\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -511,74 +511,74 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9020 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9108 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9030 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9118 _WORKFLOWCOMMAND._serialized_start = 556 _WORKFLOWCOMMAND._serialized_end = 2798 _APPENDSTREAMRECORDS._serialized_start = 2800 - _APPENDSTREAMRECORDS._serialized_end = 2895 - _SUBSCRIBESTREAM._serialized_start = 2897 - _SUBSCRIBESTREAM._serialized_end = 2955 - _STARTTIMER._serialized_start = 2957 - _STARTTIMER._serialized_end = 3040 - _CANCELTIMER._serialized_start = 3042 - _CANCELTIMER._serialized_end = 3068 - _SCHEDULEACTIVITY._serialized_start = 3071 - _SCHEDULEACTIVITY._serialized_end = 3895 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3816 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3895 - _SCHEDULELOCALACTIVITY._serialized_start = 3898 - _SCHEDULELOCALACTIVITY._serialized_end = 4687 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3816 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3895 - _REQUESTCANCELACTIVITY._serialized_start = 4689 - _REQUESTCANCELACTIVITY._serialized_end = 4725 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4727 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4768 - _QUERYRESULT._serialized_start = 4771 - _QUERYRESULT._serialized_end = 4927 - _QUERYSUCCESS._serialized_start = 4929 - _QUERYSUCCESS._serialized_end = 4994 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4996 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5072 - _FAILWORKFLOWEXECUTION._serialized_start = 5074 - _FAILWORKFLOWEXECUTION._serialized_end = 5148 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5151 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6065 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _CANCELWORKFLOWEXECUTION._serialized_start = 6067 - _CANCELWORKFLOWEXECUTION._serialized_end = 6143 - _SETPATCHMARKER._serialized_start = 6145 - _SETPATCHMARKER._serialized_end = 6199 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6202 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7376 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5908 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5984 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7378 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7452 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7455 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7597 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7600 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7999 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3816 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3895 - _CANCELSIGNALWORKFLOW._serialized_start = 8001 - _CANCELSIGNALWORKFLOW._serialized_end = 8036 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8038 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8139 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8141 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8220 - _UPDATERESPONSE._serialized_start = 8223 - _UPDATERESPONSE._serialized_end = 8433 - _SCHEDULENEXUSOPERATION._serialized_start = 8436 - _SCHEDULENEXUSOPERATION._serialized_end = 8974 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8924 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8974 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8976 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9018 + _APPENDSTREAMRECORDS._serialized_end = 2897 + _SUBSCRIBESTREAM._serialized_start = 2899 + _SUBSCRIBESTREAM._serialized_end = 2965 + _STARTTIMER._serialized_start = 2967 + _STARTTIMER._serialized_end = 3050 + _CANCELTIMER._serialized_start = 3052 + _CANCELTIMER._serialized_end = 3078 + _SCHEDULEACTIVITY._serialized_start = 3081 + _SCHEDULEACTIVITY._serialized_end = 3905 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3826 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3905 + _SCHEDULELOCALACTIVITY._serialized_start = 3908 + _SCHEDULELOCALACTIVITY._serialized_end = 4697 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3826 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3905 + _REQUESTCANCELACTIVITY._serialized_start = 4699 + _REQUESTCANCELACTIVITY._serialized_end = 4735 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4737 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4778 + _QUERYRESULT._serialized_start = 4781 + _QUERYRESULT._serialized_end = 4937 + _QUERYSUCCESS._serialized_start = 4939 + _QUERYSUCCESS._serialized_end = 5004 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 5006 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5082 + _FAILWORKFLOWEXECUTION._serialized_start = 5084 + _FAILWORKFLOWEXECUTION._serialized_end = 5158 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5161 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6075 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5918 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5994 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 + _CANCELWORKFLOWEXECUTION._serialized_start = 6077 + _CANCELWORKFLOWEXECUTION._serialized_end = 6153 + _SETPATCHMARKER._serialized_start = 6155 + _SETPATCHMARKER._serialized_end = 6209 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6212 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7386 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5918 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5994 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7388 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7462 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7465 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7607 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7610 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8009 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 + _CANCELSIGNALWORKFLOW._serialized_start = 8011 + _CANCELSIGNALWORKFLOW._serialized_end = 8046 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8048 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8149 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8151 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8230 + _UPDATERESPONSE._serialized_start = 8233 + _UPDATERESPONSE._serialized_end = 8443 + _SCHEDULENEXUSOPERATION._serialized_start = 8446 + _SCHEDULENEXUSOPERATION._serialized_end = 8984 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8934 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8984 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8986 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9028 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index b4848ddb1..32ad8194a 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -391,10 +391,14 @@ class AppendStreamRecords(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - STREAM_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_FIELD_NUMBER: builtins.int RECORDS_FIELD_NUMBER: builtins.int - stream_id: builtins.str - """Empty means the workflow's default output stream.""" + stream_name: builtins.str + """Name of a stream this workflow owns, scoped to the workflow. Created on + first use. Empty means the workflow's default output stream. A workflow + cannot append to a stream in another execution, so this is never the id + of a standalone stream. + """ @property def records( self, @@ -404,7 +408,7 @@ class AppendStreamRecords(google.protobuf.message.Message): def __init__( self, *, - stream_id: builtins.str = ..., + stream_name: builtins.str = ..., records: collections.abc.Iterable[ temporalio.api.stream.v1.message_pb2.StreamRecord ] @@ -413,7 +417,7 @@ class AppendStreamRecords(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "records", b"records", "stream_id", b"stream_id" + "records", b"records", "stream_name", b"stream_name" ], ) -> None: ... @@ -430,23 +434,32 @@ class SubscribeStream(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor - STREAM_ID_FIELD_NUMBER: builtins.int + STREAM_NAME_OR_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int - stream_id: builtins.str + stream_name_or_id: builtins.str + """Stream to consume, named either way round: a stream this workflow owns + by the name it appends under, a stream in another execution by its id. + The server tries them in that order, so a workflow that owns a stream + under this name cannot reach a standalone stream with the same id. When + neither exists the workflow gets a stream of its own by that name, which + is how a reader subscribes before the first record is written. + """ start_offset: builtins.int - """Negative means from wherever the stream is when the subscription is - registered. The server resolves that once and records it. + """Where to start, as an absolute offset. Any negative value means the head + of the stream as of registration, and they all mean the same thing. The + server resolves it and records the result, so replay does not resolve it + again. """ def __init__( self, *, - stream_id: builtins.str = ..., + stream_name_or_id: builtins.str = ..., start_offset: builtins.int = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "start_offset", b"start_offset", "stream_id", b"stream_id" + "start_offset", b"start_offset", "stream_name_or_id", b"stream_name_or_id" ], ) -> None: ... diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 32c66693f..d32142625 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 32c66693f07222832443a5acb1ddb92006c23ea7 +Subproject commit d321426250ee736cbff8121765e3579d0a9af969 From 9160c82911217fb37351909075b6e37e71194251 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 16:05:03 -0700 Subject: [PATCH 624/831] Renamed the stream command fields the workflow writes. Core names these fields after what they carry, so the writes and the helpers that feed them read the same way. --- temporalio/streams/providers/native.py | 2 +- temporalio/worker/_workflow_instance.py | 18 +++++++++------- temporalio/workflow/_context.py | 26 ++++++++++++++---------- tests/worker/test_workflow_stream.py | 8 ++++---- tests/worker/test_workflow_stream_e2e.py | 4 ++-- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index c1595d039..d0026b7ed 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -143,7 +143,7 @@ def publish(self, record: WireRecord) -> None: # Held by the runtime until the task completes, when the task's # records on this topic become one command the server applies with # the task: rule 1 through the server's own commit. - workflow._append_stream_records([record], stream_id=self._topic) + workflow._append_stream_records([record], stream_name=self._topic) class _NativeWorkflowProvider: diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 69182d192..fd65fd1cc 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -1499,18 +1499,22 @@ def workflow_get_current_deployment_version( def get_info(self) -> temporalio.workflow.Info: return self._info - def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: + def workflow_subscribe_stream( + self, stream_name_or_id: str, start_offset: int + ) -> None: # Reissued on every replay, so the buffer has to exist before the first # range arrives and the command has to be harmless the second time. A # repeat subscription leaves the server-side cursor where it is. - self._stream_buffers.setdefault(stream_id, _StreamBuffer(stream_id)) + self._stream_buffers.setdefault( + stream_name_or_id, _StreamBuffer(stream_name_or_id) + ) command = self._add_command() - command.subscribe_stream.stream_id = stream_id + command.subscribe_stream.stream_name_or_id = stream_name_or_id command.subscribe_stream.start_offset = start_offset def workflow_append_stream_records( self, - stream_id: str, + stream_name: str, records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: self._assert_not_read_only("append stream records") @@ -1530,7 +1534,7 @@ def workflow_append_stream_records( kept.append(copy) # Held until the task completes, so a task's publishes on one stream # become one command and one History event however many there were. - self._stream_appends.setdefault(stream_id, []).extend(kept) + self._stream_appends.setdefault(stream_name, []).extend(kept) def _flush_stream_appends(self) -> None: appends, self._stream_appends = self._stream_appends, {} @@ -1544,10 +1548,10 @@ def _flush_stream_appends(self) -> None: if _is_completion_command(command): insert_at = index break - for stream_id, records in appends.items(): + for stream_name, records in appends.items(): for batch in _stream_batches(records): command = temporalio.bridge.proto.workflow_commands.WorkflowCommand() - command.append_stream_records.stream_id = stream_id + command.append_stream_records.stream_name = stream_name command.append_stream_records.records.extend(batch) commands.insert(insert_at, command) insert_at += 1 diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 2b9c0a8f8..8d09cb8d3 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -315,12 +315,14 @@ def workflow_get_current_deployment_version( ) -> temporalio.common.WorkerDeploymentVersion | None: ... @abstractmethod - def workflow_subscribe_stream(self, stream_id: str, start_offset: int) -> None: ... + def workflow_subscribe_stream( + self, stream_name_or_id: str, start_offset: int + ) -> None: ... @abstractmethod def workflow_append_stream_records( self, - stream_id: str, + stream_name: str, records: Sequence[temporalio.api.stream.v1.StreamRecord], ) -> None: ... @@ -969,7 +971,7 @@ async def sleep(duration: float | timedelta, *, summary: str | None = None) -> N def _subscribe_stream( # type: ignore[reportUnusedFunction] - stream_id: str, *, start_offset: int = 0 + stream_name_or_id: str, *, start_offset: int = 0 ) -> None: """Subscribe this workflow to a server-side stream. @@ -979,26 +981,27 @@ def _subscribe_stream( # type: ignore[reportUnusedFunction] cursor, though it does write one event. Calling it on every replay is harmless because replay matches the command to the event already recorded. - Only the stream id and start offset go to the server. The rest of the + Only the name or id and the start offset go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up without doing I/O and a value it carried would be a reading rather than a fact. A name this workflow has not written yet names a stream it owns, and subscribing creates it. Args: - stream_id: Stream to consume: the name of one this workflow owns, or - the id of a standalone stream. + stream_name_or_id: Stream to consume: the name of one this workflow + owns, or the id of a standalone stream. The server tries them in + that order. start_offset: Where to start. Negative means from wherever the stream is when the subscription is registered; the server resolves that once and records it, so replay does not resolve it again. """ - _Runtime.current().workflow_subscribe_stream(stream_id, start_offset) + _Runtime.current().workflow_subscribe_stream(stream_name_or_id, start_offset) def _append_stream_records( # type: ignore[reportUnusedFunction] records: Sequence[temporalio.api.stream.v1.StreamRecord], *, - stream_id: str = "", + stream_name: str = "", ) -> None: """Publish records to a server-side stream this workflow owns. @@ -1013,14 +1016,15 @@ def _append_stream_records( # type: ignore[reportUnusedFunction] Args: records: Records to append, in order. The server stores each with an empty ``producer_id``, because the workflow is the producer. - stream_id: Stream to publish to. Empty means the workflow's default - output stream. + stream_name: Name of a stream this workflow owns, created on first + use. Empty means the workflow's default output stream. A workflow + cannot append to a stream another execution owns. Raises: ValueError: ``records`` is empty or one of them is over the server's per-record size limit. """ - _Runtime.current().workflow_append_stream_records(stream_id, records) + _Runtime.current().workflow_append_stream_records(stream_name, records) @dataclass(frozen=True) diff --git a/tests/worker/test_workflow_stream.py b/tests/worker/test_workflow_stream.py index 676b29c90..b4dd6107b 100644 --- a/tests/worker/test_workflow_stream.py +++ b/tests/worker/test_workflow_stream.py @@ -197,10 +197,10 @@ def _assert_not_read_only(self, _action: str) -> None: def commands(self) -> list[WorkflowCommand]: return self._current_completion.successful.commands - def publish(self, *records: api_stream.StreamRecord, stream_id: str = "") -> None: + def publish(self, *records: api_stream.StreamRecord, stream_name: str = "") -> None: instance: Any = self _WorkflowInstanceImpl.workflow_append_stream_records( - instance, stream_id, list(records) + instance, stream_name, list(records) ) def flush(self) -> None: @@ -214,13 +214,13 @@ def test_a_tasks_publishes_on_one_stream_become_one_command() -> None: stub = _CommandStub() stub.publish(record(b"a"), record(b"b")) stub.publish(record(b"c")) - stub.publish(record(b"d"), stream_id="other") + stub.publish(record(b"d"), stream_name="other") assert stub.commands == [] stub.flush() by_stream = { - command.append_stream_records.stream_id: [ + command.append_stream_records.stream_name: [ r.body.data for r in command.append_stream_records.records ] for command in stub.commands diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 694b90b71..5dc15dd4f 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -272,9 +272,9 @@ class PublishAndRead: async def run(self) -> list[str]: workflow._append_stream_records( [_record(b"alpha", "progress"), _record(b"beta", "progress")], - stream_id="output", + stream_name="output", ) - workflow._append_stream_records([_record(b"gamma")], stream_id="output") + workflow._append_stream_records([_record(b"gamma")], stream_name="output") # A name this workflow has not written yet still names a stream it # owns, so subscribing creates the one the later publish lands in. workflow._subscribe_stream("output", start_offset=0) From bae3a83695693ac94b44a4fe79b07c562a2d0f20 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:02:05 -0700 Subject: [PATCH 625/831] Numbered the Workflow Streams producer's records from one. Zero on the wire now says a producer does not number its records, so the WFS producer follows the memory producer and starts at one. --- temporalio/streams/providers/workflow_streams.py | 4 +++- tests/streams/test_workflow_streams_provider.py | 10 +++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index c0a0dfb6e..20e6cc526 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -370,7 +370,9 @@ def __init__( self._topic = topic self._producer_id = producer_id self._attempt = attempt - self._sequence = 0 + # One-based, because zero on the wire says the producer does not + # number its records and this one does. + self._sequence = 1 self._pending: tuple[list[PublishEntry], int] | None = None @property diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index d99b1d1f6..c46d0f791 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -471,7 +471,7 @@ async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): # The retry carries the same signal sequence and the same record # sequence as the failed send, so the shipped dedupe drops the copy; the # batch after it continues the numbering. - assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (2, [1])] + assert _sequences(handle.sent) == [(2, [1]), (2, [1]), (3, [2])] assert all(publish.publisher_id == "model#1" for publish in handle.sent) @@ -482,7 +482,7 @@ async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): await producer.append({"n": 1}) await producer.append({"n": 2}, {"n": 3}) await producer.finish() - assert _sequences(handle.sent) == [(1, [0]), (1, [0]), (3, [1, 2]), (4, [3])] + assert _sequences(handle.sent) == [(2, [1]), (2, [1]), (4, [2, 3]), (5, [4])] assert _wires(handle.sent[-1])[0].kind == int(RecordKind.FINISH) @@ -618,7 +618,7 @@ async def test_the_dedupe_sequence_names_where_the_records_end(): await retry.append({"n": 2}) await retry.append({"n": 3}) - # The original ended at record 1, so its sequence is 2. Neither half of + # The original ended at record 2, so its sequence is 3. Neither half of # the retry's re-split reaches past it, and only the new record does. - assert _sequences(first.sent) == [(2, [0, 1])] - assert _sequences(second.sent) == [(1, [0]), (2, [1]), (3, [2])] + assert _sequences(first.sent) == [(3, [1, 2])] + assert _sequences(second.sent) == [(2, [1]), (3, [2]), (4, [3])] From cc6dbbd7aed6bcb355a759182b2778902931922a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:02:05 -0700 Subject: [PATCH 626/831] Typed the empty history iterator in the provider test double. --- tests/streams/test_workflow_streams_provider.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index c46d0f791..e520936d0 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -525,7 +525,8 @@ def fetch_history_events(self, *args: Any, **kwargs: Any) -> Any: error = self._events_error async def _events() -> AsyncIterator[Any]: - for event in (): + events: tuple[Any, ...] = () + for event in events: yield event if error is not None: raise error From e629ae11f00b11e91786b62ae2a3c89fc8e9a072 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:06:24 -0700 Subject: [PATCH 627/831] Encoded the Nexus contract with the internal payload converter. The public default converter no longer applies transfer type hooks, and the generated contract types carry their JSON shape as one. The worker already decodes with the internal converter. --- temporalio/streams/providers/nexus.py | 7 +++++-- tests/streams/test_nexus_provider.py | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 324c3c3f0..84e94c551 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -685,8 +685,11 @@ async def invoke( ) -> _OutputT: # The contract types carry their own JSON encoding, so the raw caller # and the worker serving the operation agree on the body without - # either of them spelling the fields out. - contract = temporalio.converter.DataConverter.default.payload_converter + # either of them spelling the fields out. That encoding is a transfer + # type hook, which only the internal converter applies. + contract = ( + temporalio.converter.DataConverter.default._get_internal_payload_converter() + ) url = f"{await self._base_url()}/{operation}" try: raw = await asyncio.to_thread( diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index ed2ccdb6e..19fb0a0c5 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -201,7 +201,9 @@ def _in_process_endpoint( then reported as a transport failure, the ambiguous case a retry has to survive. """ - contract = temporalio.converter.DataConverter.default.payload_converter + contract = ( + temporalio.converter.DataConverter.default._get_internal_payload_converter() + ) loop = asyncio.get_running_loop() failing = set(fail_after_applying or []) From 526532b49e5c52d0a3756e138f29bbfaff0d4235 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:06:24 -0700 Subject: [PATCH 628/831] Expected the one-based sequence from the memory producer. --- tests/streams/test_nexus_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 19fb0a0c5..051ed1306 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -716,7 +716,7 @@ async def test_a_failed_read_is_not_reported_as_the_end_of_the_stream(): # The retry from the same token has to re-subscribe rather than be # answered done=True off the subscription the failed pump left behind. answer = await _dispatch(handler, READ_OPERATION, request) - assert [WireRecord.FromString(r.record).sequence for r in answer.records] == [0] + assert [WireRecord.FromString(r.record).sequence for r in answer.records] == [1] assert answer.done is False await handler.close() From c3e1f586285fdfe65856130026b38a2222fbc715 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:15:29 -0700 Subject: [PATCH 629/831] Built the bridge against the 1.0 Core crates. The merged Core renumbered its crates and moved the payload warning options behind the client's experimental feature. --- temporalio/bridge/Cargo.lock | 13 ++++++------- temporalio/bridge/Cargo.toml | 7 ++++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/temporalio/bridge/Cargo.lock b/temporalio/bridge/Cargo.lock index 72f89d746..d00649f06 100644 --- a/temporalio/bridge/Cargo.lock +++ b/temporalio/bridge/Cargo.lock @@ -2588,7 +2588,7 @@ dependencies = [ [[package]] name = "temporalio-client" -version = "0.7.0" +version = "1.0.0" dependencies = [ "anyhow", "async-trait", @@ -2620,7 +2620,7 @@ dependencies = [ [[package]] name = "temporalio-common" -version = "0.7.0" +version = "1.0.0" dependencies = [ "anyhow", "async-trait", @@ -2661,7 +2661,7 @@ dependencies = [ [[package]] name = "temporalio-common-wasm" -version = "0.7.0" +version = "1.0.0" dependencies = [ "anyhow", "async-trait", @@ -2686,7 +2686,7 @@ dependencies = [ [[package]] name = "temporalio-macros" -version = "0.7.0" +version = "1.0.0" dependencies = [ "proc-macro2", "quote", @@ -2695,7 +2695,7 @@ dependencies = [ [[package]] name = "temporalio-protos" -version = "0.7.0" +version = "0.9.0" dependencies = [ "anyhow", "base64 0.23.1", @@ -2704,7 +2704,6 @@ dependencies = [ "pbjson", "pbjson-build", "prost", - "prost-types", "prost-wkt-types", "serde", "serde_json", @@ -2716,7 +2715,7 @@ dependencies = [ [[package]] name = "temporalio-sdk-core" -version = "0.7.0" +version = "0.9.0" dependencies = [ "anyhow", "async-trait", diff --git a/temporalio/bridge/Cargo.toml b/temporalio/bridge/Cargo.toml index 3e4b3d37b..44af176fd 100644 --- a/temporalio/bridge/Cargo.toml +++ b/temporalio/bridge/Cargo.toml @@ -58,15 +58,16 @@ pythonize = "0.29" # default-features disabled so the rustls provider isn't pinned to `tls-ring`; # the bridge's tls-ring/tls-aws-lc features (above) select it. Re-add the # crate's non-TLS default (`envconfig`). -temporalio-client = { version = "0.7", path = "./sdk-core/crates/client", default-features = false, features = [ +temporalio-client = { version = "1.0", path = "./sdk-core/crates/client", default-features = false, features = [ "envconfig", + "experimental", ] } -temporalio-common = { version = "0.7", path = "./sdk-core/crates/common", features = [ +temporalio-common = { version = "1.0", path = "./sdk-core/crates/common", features = [ "envconfig", "otel" ]} # default-features disabled (drops the pinned `tls-ring`); re-add the non-TLS # defaults the bridge relied on (`envconfig`, `prometheus`) plus `ephemeral-server`. -temporalio-sdk-core = { version = "0.7", path = "./sdk-core/crates/sdk-core", default-features = false, features = [ +temporalio-sdk-core = { version = "0.9", path = "./sdk-core/crates/sdk-core", default-features = false, features = [ "ephemeral-server", "envconfig", "prometheus", From 397ac1e5ecb2aba2618bc5a5c243da139277bc38 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:15:29 -0700 Subject: [PATCH 630/831] Regenerated the protos from the merged Core. The upstream Core merge carried newer API protos and the lang proto changes that go with them. --- temporalio/api/callback/v1/message_pb2.py | 4 +- temporalio/api/callback/v1/message_pb2.pyi | 8 + temporalio/api/common/v1/message_pb2.py | 110 +- temporalio/api/common/v1/message_pb2.pyi | 156 ++- temporalio/api/enums/v1/__init__.py | 2 + temporalio/api/enums/v1/common_pb2.py | 7 +- temporalio/api/enums/v1/common_pb2.pyi | 8 +- temporalio/api/enums/v1/failed_cause_pb2.py | 31 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 67 + temporalio/api/history/v1/message_pb2.py | 216 ++-- temporalio/api/history/v1/message_pb2.pyi | 6 + temporalio/api/nexusoperation/__init__.py | 0 temporalio/api/nexusoperation/v1/__init__.py | 6 + .../api/nexusoperation/v1/message_pb2.py | 85 ++ .../api/nexusoperation/v1/message_pb2.pyi | 125 ++ .../api/notificationservice/__init__.py | 0 .../api/notificationservice/v1/__init__.py | 6 + .../v1/request_response_pb2.py | 60 + .../v1/request_response_pb2.pyi | 94 ++ .../v1/request_response_pb2_grpc.py | 4 + .../v1/request_response_pb2_grpc.pyi | 4 + temporalio/api/replication/v1/message_pb2.py | 15 +- temporalio/api/replication/v1/message_pb2.pyi | 22 +- temporalio/api/workflow/v1/message_pb2.py | 68 +- temporalio/api/workflow/v1/message_pb2.pyi | 8 + .../v1/request_response_pb2.py | 1125 +++++++++-------- .../v1/request_response_pb2.pyi | 74 ++ .../workflow_activation_pb2.py | 113 +- .../workflow_activation_pb2.pyi | 23 +- .../workflow_commands_pb2.py | 96 +- .../workflow_commands_pb2.pyi | 10 +- 31 files changed, 1663 insertions(+), 890 deletions(-) create mode 100644 temporalio/api/nexusoperation/__init__.py create mode 100644 temporalio/api/nexusoperation/v1/__init__.py create mode 100644 temporalio/api/nexusoperation/v1/message_pb2.py create mode 100644 temporalio/api/nexusoperation/v1/message_pb2.pyi create mode 100644 temporalio/api/notificationservice/__init__.py create mode 100644 temporalio/api/notificationservice/v1/__init__.py create mode 100644 temporalio/api/notificationservice/v1/request_response_pb2.py create mode 100644 temporalio/api/notificationservice/v1/request_response_pb2.pyi create mode 100644 temporalio/api/notificationservice/v1/request_response_pb2_grpc.py create mode 100644 temporalio/api/notificationservice/v1/request_response_pb2_grpc.pyi diff --git a/temporalio/api/callback/v1/message_pb2.py b/temporalio/api/callback/v1/message_pb2.py index 5d4ccb917..b91db112d 100644 --- a/temporalio/api/callback/v1/message_pb2.py +++ b/temporalio/api/callback/v1/message_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/callback/v1/message.proto\x12\x18temporal.api.callback.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a%temporal/api/failure/v1/message.proto"\x97\x03\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x35\n\x11registration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x06 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x08 \x01(\tB\x93\x01\n\x1bio.temporal.api.callback.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/callback/v1;callback\xaa\x02\x1aTemporalio.Api.Callback.V1\xea\x02\x1dTemporalio::Api::Callback::V1b\x06proto3' + b'\n&temporal/api/callback/v1/message.proto\x12\x18temporal.api.callback.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a%temporal/api/failure/v1/message.proto"\xab\x03\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x35\n\x11registration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x06 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x08 \x01(\t\x12\x12\n\nrequest_id\x18\t \x01(\tB\x93\x01\n\x1bio.temporal.api.callback.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/callback/v1;callback\xaa\x02\x1aTemporalio.Api.Callback.V1\xea\x02\x1dTemporalio::Api::Callback::V1b\x06proto3' ) @@ -47,5 +47,5 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\033io.temporal.api.callback.v1B\014MessageProtoP\001Z'go.temporal.io/api/callback/v1;callback\252\002\032Temporalio.Api.Callback.V1\352\002\035Temporalio::Api::Callback::V1" _CALLBACKINFO._serialized_start = 215 - _CALLBACKINFO._serialized_end = 622 + _CALLBACKINFO._serialized_end = 642 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/callback/v1/message_pb2.pyi b/temporalio/api/callback/v1/message_pb2.pyi index ea7d6444b..a9f2ddec4 100644 --- a/temporalio/api/callback/v1/message_pb2.pyi +++ b/temporalio/api/callback/v1/message_pb2.pyi @@ -34,6 +34,7 @@ class CallbackInfo(google.protobuf.message.Message): LAST_ATTEMPT_FAILURE_FIELD_NUMBER: builtins.int NEXT_ATTEMPT_SCHEDULE_TIME_FIELD_NUMBER: builtins.int BLOCKED_REASON_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int @property def callback(self) -> temporalio.api.common.v1.message_pb2.Callback: """Information on how this callback should be invoked (e.g. its URL and type).""" @@ -57,6 +58,10 @@ class CallbackInfo(google.protobuf.message.Message): """The time when the next attempt is scheduled.""" blocked_reason: builtins.str """If the state is BLOCKED, blocked reason provides additional information.""" + request_id: builtins.str + """Server-generated request ID used as an idempotency token when invoking callbacks. + It has no relation to caller-side request_id sent in operations like StartNexusOperationExecutionRequest. + """ def __init__( self, *, @@ -71,6 +76,7 @@ class CallbackInfo(google.protobuf.message.Message): next_attempt_schedule_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., blocked_reason: builtins.str = ..., + request_id: builtins.str = ..., ) -> None: ... def HasField( self, @@ -104,6 +110,8 @@ class CallbackInfo(google.protobuf.message.Message): b"next_attempt_schedule_time", "registration_time", b"registration_time", + "request_id", + b"request_id", "state", b"state", ], diff --git a/temporalio/api/common/v1/message_pb2.py b/temporalio/api/common/v1/message_pb2.py index 538be6a23..4a375947e 100644 --- a/temporalio/api/common/v1/message_pb2.py +++ b/temporalio/api/common/v1/message_pb2.py @@ -29,7 +29,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n$temporal/api/common/v1/message.proto\x12\x16temporal.api.common.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a!temporal/api/enums/v1/reset.proto"T\n\x08\x44\x61taBlob\x12:\n\rencoding_type\x18\x01 \x01(\x0e\x32#.temporal.api.enums.v1.EncodingType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c"=\n\x08Payloads\x12\x31\n\x08payloads\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x8a\x02\n\x07Payload\x12?\n\x08metadata\x18\x01 \x03(\x0b\x32-.temporal.api.common.v1.Payload.MetadataEntry\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12Q\n\x11\x65xternal_payloads\x18\x03 \x03(\x0b\x32\x36.temporal.api.common.v1.Payload.ExternalPayloadDetails\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x1a,\n\x16\x45xternalPayloadDetails\x12\x12\n\nsize_bytes\x18\x01 \x01(\x03"\xbe\x01\n\x10SearchAttributes\x12S\n\x0eindexed_fields\x18\x01 \x03(\x0b\x32;.temporal.api.common.v1.SearchAttributes.IndexedFieldsEntry\x1aU\n\x12IndexedFieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x90\x01\n\x04Memo\x12\x38\n\x06\x66ields\x18\x01 \x03(\x0b\x32(.temporal.api.common.v1.Memo.FieldsEntry\x1aN\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x94\x01\n\x06Header\x12:\n\x06\x66ields\x18\x01 \x03(\x0b\x32*.temporal.api.common.v1.Header.FieldsEntry\x1aN\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"8\n\x11WorkflowExecution\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"d\n\tExecution\x12\x32\n\x04type\x18\x01 \x01(\x0e\x32$.temporal.api.enums.v1.ExecutionType\x12\x13\n\x0b\x62usiness_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\x1c\n\x0cWorkflowType\x12\x0c\n\x04name\x18\x01 \x01(\t"\x1c\n\x0c\x41\x63tivityType\x12\x0c\n\x04name\x18\x01 \x01(\t"\xd1\x01\n\x0bRetryPolicy\x12\x33\n\x10initial_interval\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x1b\n\x13\x62\x61\x63koff_coefficient\x18\x02 \x01(\x01\x12\x33\n\x10maximum_interval\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10maximum_attempts\x18\x04 \x01(\x05\x12!\n\x19non_retryable_error_types\x18\x05 \x03(\t"F\n\x10MeteringMetadata\x12\x32\n*nonfirst_local_activity_execution_attempts\x18\r \x01(\r">\n\x12WorkerVersionStamp\x12\x10\n\x08\x62uild_id\x18\x01 \x01(\t\x12\x16\n\x0euse_versioning\x18\x03 \x01(\x08"e\n\x19WorkerVersionCapabilities\x12\x10\n\x08\x62uild_id\x18\x01 \x01(\t\x12\x16\n\x0euse_versioning\x18\x02 \x01(\x08\x12\x1e\n\x16\x64\x65ployment_series_name\x18\x04 \x01(\t"\xed\x02\n\x0cResetOptions\x12\x35\n\x13\x66irst_workflow_task\x18\x01 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x12last_workflow_task\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x1a\n\x10workflow_task_id\x18\x03 \x01(\x03H\x00\x12\x12\n\x08\x62uild_id\x18\x04 \x01(\tH\x00\x12G\n\x12reset_reapply_type\x18\n \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12\x18\n\x10\x63urrent_run_only\x18\x0b \x01(\x08\x12S\n\x1breset_reapply_exclude_types\x18\x0c \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeTypeB\x08\n\x06target"\xe4\x02\n\x08\x43\x61llback\x12\x37\n\x05nexus\x18\x02 \x01(\x0b\x32&.temporal.api.common.v1.Callback.NexusH\x00\x12=\n\x08internal\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.Callback.InternalH\x00\x12+\n\x05links\x18\x64 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x87\x01\n\x05Nexus\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x42\n\x06header\x18\x02 \x03(\x0b\x32\x32.temporal.api.common.v1.Callback.Nexus.HeaderEntry\x1a-\n\x0bHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x18\n\x08Internal\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x42\t\n\x07variantJ\x04\x08\x01\x10\x02"\x8a\x08\n\x04Link\x12\x44\n\x0eworkflow_event\x18\x01 \x01(\x0b\x32*.temporal.api.common.v1.Link.WorkflowEventH\x00\x12:\n\tbatch_job\x18\x02 \x01(\x0b\x32%.temporal.api.common.v1.Link.BatchJobH\x00\x12\x39\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32%.temporal.api.common.v1.Link.ActivityH\x00\x12\x46\n\x0fnexus_operation\x18\x04 \x01(\x0b\x32+.temporal.api.common.v1.Link.NexusOperationH\x00\x12\x39\n\x08workflow\x18\x05 \x01(\x0b\x32%.temporal.api.common.v1.Link.WorkflowH\x00\x1a\xb7\x03\n\rWorkflowEvent\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12N\n\tevent_ref\x18\x64 \x01(\x0b\x32\x39.temporal.api.common.v1.Link.WorkflowEvent.EventReferenceH\x00\x12W\n\x0erequest_id_ref\x18\x65 \x01(\x0b\x32=.temporal.api.common.v1.Link.WorkflowEvent.RequestIdReferenceH\x00\x1aX\n\x0e\x45ventReference\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12\x34\n\nevent_type\x18\x02 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x1a^\n\x12RequestIdReference\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x34\n\nevent_type\x18\x02 \x01(\x0e\x32 .temporal.api.enums.v1.EventTypeB\x0b\n\treference\x1a\x1a\n\x08\x42\x61tchJob\x12\x0e\n\x06job_id\x18\x01 \x01(\t\x1a\x42\n\x08\x41\x63tivity\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x1aI\n\x0eNexusOperation\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x1aR\n\x08Workflow\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\tB\t\n\x07variant"\'\n\tPrincipal\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t"O\n\x08Priority\x12\x14\n\x0cpriority_key\x18\x01 \x01(\x05\x12\x14\n\x0c\x66\x61irness_key\x18\x02 \x01(\t\x12\x17\n\x0f\x66\x61irness_weight\x18\x03 \x01(\x02";\n\x0eWorkerSelector\x12\x1d\n\x13worker_instance_key\x18\x01 \x01(\tH\x00\x42\n\n\x08selector"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"\xaa\x01\n\x12TimeSkippingConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x46\n\x13\x66\x61st_forward_config\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.FastForwardConfig\x12\x1b\n\x13\x64isable_propagation\x18\x03 \x01(\x08\x12\x1e\n\x16max_session_skip_count\x18\x04 \x01(\x05"L\n\x11\x46\x61stForwardConfig\x12\n\n\x02id\x18\x01 \x01(\t\x12+\n\x08\x64uration\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\xb5\x01\n\x1cTimeSkippingStatePropagation\x12;\n\x18initial_skipped_duration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x18\x66\x61st_forward_target_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1a\n\x12initial_skip_count\x18\x03 \x01(\x05"\xfe\x01\n\x10TimeSkippingInfo\x12\x30\n\x0c\x63urrent_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x44\n\x10\x65\x66\x66\x65\x63tive_config\x18\x02 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12N\n\x11\x66\x61st_forward_info\x18\x04 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfo\x12"\n\x1a\x63urrent_session_skip_count\x18\x06 \x01(\x05"\xb8\x01\n\x1bTimeSkippingFastForwardInfo\x12\x38\n\x15\x66\x61st_forward_duration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x17\n\x0f\x66\x61st_forward_id\x18\x02 \x01(\t\x12/\n\x0btarget_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rhas_completed\x18\x04 \x01(\x08\x42\x89\x01\n\x19io.temporal.api.common.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/common/v1;common\xaa\x02\x18Temporalio.Api.Common.V1\xea\x02\x1bTemporalio::Api::Common::V1b\x06proto3' + b'\n$temporal/api/common/v1/message.proto\x12\x16temporal.api.common.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a!temporal/api/enums/v1/reset.proto"T\n\x08\x44\x61taBlob\x12:\n\rencoding_type\x18\x01 \x01(\x0e\x32#.temporal.api.enums.v1.EncodingType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c"=\n\x08Payloads\x12\x31\n\x08payloads\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x8a\x02\n\x07Payload\x12?\n\x08metadata\x18\x01 \x03(\x0b\x32-.temporal.api.common.v1.Payload.MetadataEntry\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12Q\n\x11\x65xternal_payloads\x18\x03 \x03(\x0b\x32\x36.temporal.api.common.v1.Payload.ExternalPayloadDetails\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x1a,\n\x16\x45xternalPayloadDetails\x12\x12\n\nsize_bytes\x18\x01 \x01(\x03"\xbe\x01\n\x10SearchAttributes\x12S\n\x0eindexed_fields\x18\x01 \x03(\x0b\x32;.temporal.api.common.v1.SearchAttributes.IndexedFieldsEntry\x1aU\n\x12IndexedFieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x90\x01\n\x04Memo\x12\x38\n\x06\x66ields\x18\x01 \x03(\x0b\x32(.temporal.api.common.v1.Memo.FieldsEntry\x1aN\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x94\x01\n\x06Header\x12:\n\x06\x66ields\x18\x01 \x03(\x0b\x32*.temporal.api.common.v1.Header.FieldsEntry\x1aN\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"8\n\x11WorkflowExecution\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"d\n\tExecution\x12\x32\n\x04type\x18\x01 \x01(\x0e\x32$.temporal.api.enums.v1.ExecutionType\x12\x13\n\x0b\x62usiness_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\x1c\n\x0cWorkflowType\x12\x0c\n\x04name\x18\x01 \x01(\t"\x1c\n\x0c\x41\x63tivityType\x12\x0c\n\x04name\x18\x01 \x01(\t"\xd1\x01\n\x0bRetryPolicy\x12\x33\n\x10initial_interval\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x1b\n\x13\x62\x61\x63koff_coefficient\x18\x02 \x01(\x01\x12\x33\n\x10maximum_interval\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x18\n\x10maximum_attempts\x18\x04 \x01(\x05\x12!\n\x19non_retryable_error_types\x18\x05 \x03(\t"F\n\x10MeteringMetadata\x12\x32\n*nonfirst_local_activity_execution_attempts\x18\r \x01(\r">\n\x12WorkerVersionStamp\x12\x10\n\x08\x62uild_id\x18\x01 \x01(\t\x12\x16\n\x0euse_versioning\x18\x03 \x01(\x08"e\n\x19WorkerVersionCapabilities\x12\x10\n\x08\x62uild_id\x18\x01 \x01(\t\x12\x16\n\x0euse_versioning\x18\x02 \x01(\x08\x12\x1e\n\x16\x64\x65ployment_series_name\x18\x04 \x01(\t"\xed\x02\n\x0cResetOptions\x12\x35\n\x13\x66irst_workflow_task\x18\x01 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x12last_workflow_task\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x1a\n\x10workflow_task_id\x18\x03 \x01(\x03H\x00\x12\x12\n\x08\x62uild_id\x18\x04 \x01(\tH\x00\x12G\n\x12reset_reapply_type\x18\n \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12\x18\n\x10\x63urrent_run_only\x18\x0b \x01(\x08\x12S\n\x1breset_reapply_exclude_types\x18\x0c \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeTypeB\x08\n\x06target"\xb3\x04\n\x08\x43\x61llback\x12\x37\n\x05nexus\x18\x02 \x01(\x0b\x32&.temporal.api.common.v1.Callback.NexusH\x00\x12=\n\x08internal\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.Callback.InternalH\x00\x12\x46\n\rnexus_handler\x18\x04 \x01(\x0b\x32-.temporal.api.common.v1.Callback.NexusHandlerH\x00\x12+\n\x05links\x18\x64 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x87\x01\n\x05Nexus\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x42\n\x06header\x18\x02 \x03(\x0b\x32\x32.temporal.api.common.v1.Callback.Nexus.HeaderEntry\x1a-\n\x0bHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x18\n\x08Internal\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x1a\x84\x01\n\x0cNexusHandler\x12\x17\n\x0ftask_queue_name\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x37\n\x0esource_context\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadB\t\n\x07variantJ\x04\x08\x01\x10\x02"\xc6\t\n\x04Link\x12\x44\n\x0eworkflow_event\x18\x01 \x01(\x0b\x32*.temporal.api.common.v1.Link.WorkflowEventH\x00\x12:\n\tbatch_job\x18\x02 \x01(\x0b\x32%.temporal.api.common.v1.Link.BatchJobH\x00\x12\x39\n\x08\x61\x63tivity\x18\x03 \x01(\x0b\x32%.temporal.api.common.v1.Link.ActivityH\x00\x12\x46\n\x0fnexus_operation\x18\x04 \x01(\x0b\x32+.temporal.api.common.v1.Link.NexusOperationH\x00\x12\x39\n\x08workflow\x18\x05 \x01(\x0b\x32%.temporal.api.common.v1.Link.WorkflowH\x00\x12\x39\n\x08\x63\x61llback\x18\x06 \x01(\x0b\x32%.temporal.api.common.v1.Link.CallbackH\x00\x1a\xb7\x03\n\rWorkflowEvent\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12N\n\tevent_ref\x18\x64 \x01(\x0b\x32\x39.temporal.api.common.v1.Link.WorkflowEvent.EventReferenceH\x00\x12W\n\x0erequest_id_ref\x18\x65 \x01(\x0b\x32=.temporal.api.common.v1.Link.WorkflowEvent.RequestIdReferenceH\x00\x1aX\n\x0e\x45ventReference\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12\x34\n\nevent_type\x18\x02 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x1a^\n\x12RequestIdReference\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x34\n\nevent_type\x18\x02 \x01(\x0e\x32 .temporal.api.enums.v1.EventTypeB\x0b\n\treference\x1a\x1a\n\x08\x42\x61tchJob\x12\x0e\n\x06job_id\x18\x01 \x01(\t\x1a\x42\n\x08\x41\x63tivity\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x1aI\n\x0eNexusOperation\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x1aR\n\x08Workflow\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x1a\x7f\n\x08\x43\x61llback\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x34\n\texecution\x18\x02 \x01(\x0b\x32!.temporal.api.common.v1.Execution\x12\x16\n\x0e\x63omponent_path\x18\x03 \x03(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\tB\t\n\x07variant"\'\n\tPrincipal\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t"O\n\x08Priority\x12\x14\n\x0cpriority_key\x18\x01 \x01(\x05\x12\x14\n\x0c\x66\x61irness_key\x18\x02 \x01(\t\x12\x17\n\x0f\x66\x61irness_weight\x18\x03 \x01(\x02";\n\x0eWorkerSelector\x12\x1d\n\x13worker_instance_key\x18\x01 \x01(\tH\x00\x42\n\n\x08selector"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"\xaa\x01\n\x12TimeSkippingConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x46\n\x13\x66\x61st_forward_config\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.FastForwardConfig\x12\x1b\n\x13\x64isable_propagation\x18\x03 \x01(\x08\x12\x1e\n\x16max_session_skip_count\x18\x04 \x01(\x05"L\n\x11\x46\x61stForwardConfig\x12\n\n\x02id\x18\x01 \x01(\t\x12+\n\x08\x64uration\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\xb5\x01\n\x1cTimeSkippingStatePropagation\x12;\n\x18initial_skipped_duration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x18\x66\x61st_forward_target_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1a\n\x12initial_skip_count\x18\x03 \x01(\x05"\xfe\x01\n\x10TimeSkippingInfo\x12\x30\n\x0c\x63urrent_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x44\n\x10\x65\x66\x66\x65\x63tive_config\x18\x02 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12N\n\x11\x66\x61st_forward_info\x18\x04 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfo\x12"\n\x1a\x63urrent_session_skip_count\x18\x06 \x01(\x05"\xb8\x01\n\x1bTimeSkippingFastForwardInfo\x12\x38\n\x15\x66\x61st_forward_duration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x17\n\x0f\x66\x61st_forward_id\x18\x02 \x01(\t\x12/\n\x0btarget_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rhas_completed\x18\x04 \x01(\x08\x42\x89\x01\n\x19io.temporal.api.common.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/common/v1;common\xaa\x02\x18Temporalio.Api.Common.V1\xea\x02\x1bTemporalio::Api::Common::V1b\x06proto3' ) @@ -63,6 +63,7 @@ _CALLBACK_NEXUS = _CALLBACK.nested_types_by_name["Nexus"] _CALLBACK_NEXUS_HEADERENTRY = _CALLBACK_NEXUS.nested_types_by_name["HeaderEntry"] _CALLBACK_INTERNAL = _CALLBACK.nested_types_by_name["Internal"] +_CALLBACK_NEXUSHANDLER = _CALLBACK.nested_types_by_name["NexusHandler"] _LINK = DESCRIPTOR.message_types_by_name["Link"] _LINK_WORKFLOWEVENT = _LINK.nested_types_by_name["WorkflowEvent"] _LINK_WORKFLOWEVENT_EVENTREFERENCE = _LINK_WORKFLOWEVENT.nested_types_by_name[ @@ -75,6 +76,7 @@ _LINK_ACTIVITY = _LINK.nested_types_by_name["Activity"] _LINK_NEXUSOPERATION = _LINK.nested_types_by_name["NexusOperation"] _LINK_WORKFLOW = _LINK.nested_types_by_name["Workflow"] +_LINK_CALLBACK = _LINK.nested_types_by_name["Callback"] _PRINCIPAL = DESCRIPTOR.message_types_by_name["Principal"] _PRIORITY = DESCRIPTOR.message_types_by_name["Priority"] _WORKERSELECTOR = DESCRIPTOR.message_types_by_name["WorkerSelector"] @@ -334,6 +336,15 @@ # @@protoc_insertion_point(class_scope:temporal.api.common.v1.Callback.Internal) }, ), + "NexusHandler": _reflection.GeneratedProtocolMessageType( + "NexusHandler", + (_message.Message,), + { + "DESCRIPTOR": _CALLBACK_NEXUSHANDLER, + "__module__": "temporalio.api.common.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.common.v1.Callback.NexusHandler) + }, + ), "DESCRIPTOR": _CALLBACK, "__module__": "temporalio.api.common.v1.message_pb2", # @@protoc_insertion_point(class_scope:temporal.api.common.v1.Callback) @@ -343,6 +354,7 @@ _sym_db.RegisterMessage(Callback.Nexus) _sym_db.RegisterMessage(Callback.Nexus.HeaderEntry) _sym_db.RegisterMessage(Callback.Internal) +_sym_db.RegisterMessage(Callback.NexusHandler) Link = _reflection.GeneratedProtocolMessageType( "Link", @@ -411,6 +423,15 @@ # @@protoc_insertion_point(class_scope:temporal.api.common.v1.Link.Workflow) }, ), + "Callback": _reflection.GeneratedProtocolMessageType( + "Callback", + (_message.Message,), + { + "DESCRIPTOR": _LINK_CALLBACK, + "__module__": "temporalio.api.common.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.common.v1.Link.Callback) + }, + ), "DESCRIPTOR": _LINK, "__module__": "temporalio.api.common.v1.message_pb2", # @@protoc_insertion_point(class_scope:temporal.api.common.v1.Link) @@ -424,6 +445,7 @@ _sym_db.RegisterMessage(Link.Activity) _sym_db.RegisterMessage(Link.NexusOperation) _sym_db.RegisterMessage(Link.Workflow) +_sym_db.RegisterMessage(Link.Callback) Principal = _reflection.GeneratedProtocolMessageType( "Principal", @@ -580,45 +602,49 @@ _RESETOPTIONS._serialized_start = 1850 _RESETOPTIONS._serialized_end = 2215 _CALLBACK._serialized_start = 2218 - _CALLBACK._serialized_end = 2574 - _CALLBACK_NEXUS._serialized_start = 2396 - _CALLBACK_NEXUS._serialized_end = 2531 - _CALLBACK_NEXUS_HEADERENTRY._serialized_start = 2486 - _CALLBACK_NEXUS_HEADERENTRY._serialized_end = 2531 - _CALLBACK_INTERNAL._serialized_start = 2533 - _CALLBACK_INTERNAL._serialized_end = 2557 - _LINK._serialized_start = 2577 - _LINK._serialized_end = 3611 - _LINK_WORKFLOWEVENT._serialized_start = 2906 - _LINK_WORKFLOWEVENT._serialized_end = 3345 - _LINK_WORKFLOWEVENT_EVENTREFERENCE._serialized_start = 3148 - _LINK_WORKFLOWEVENT_EVENTREFERENCE._serialized_end = 3236 - _LINK_WORKFLOWEVENT_REQUESTIDREFERENCE._serialized_start = 3238 - _LINK_WORKFLOWEVENT_REQUESTIDREFERENCE._serialized_end = 3332 - _LINK_BATCHJOB._serialized_start = 3347 - _LINK_BATCHJOB._serialized_end = 3373 - _LINK_ACTIVITY._serialized_start = 3375 - _LINK_ACTIVITY._serialized_end = 3441 - _LINK_NEXUSOPERATION._serialized_start = 3443 - _LINK_NEXUSOPERATION._serialized_end = 3516 - _LINK_WORKFLOW._serialized_start = 3518 - _LINK_WORKFLOW._serialized_end = 3600 - _PRINCIPAL._serialized_start = 3613 - _PRINCIPAL._serialized_end = 3652 - _PRIORITY._serialized_start = 3654 - _PRIORITY._serialized_end = 3733 - _WORKERSELECTOR._serialized_start = 3735 - _WORKERSELECTOR._serialized_end = 3794 - _ONCONFLICTOPTIONS._serialized_start = 3796 - _ONCONFLICTOPTIONS._serialized_end = 3901 - _TIMESKIPPINGCONFIG._serialized_start = 3904 - _TIMESKIPPINGCONFIG._serialized_end = 4074 - _FASTFORWARDCONFIG._serialized_start = 4076 - _FASTFORWARDCONFIG._serialized_end = 4152 - _TIMESKIPPINGSTATEPROPAGATION._serialized_start = 4155 - _TIMESKIPPINGSTATEPROPAGATION._serialized_end = 4336 - _TIMESKIPPINGINFO._serialized_start = 4339 - _TIMESKIPPINGINFO._serialized_end = 4593 - _TIMESKIPPINGFASTFORWARDINFO._serialized_start = 4596 - _TIMESKIPPINGFASTFORWARDINFO._serialized_end = 4780 + _CALLBACK._serialized_end = 2781 + _CALLBACK_NEXUS._serialized_start = 2468 + _CALLBACK_NEXUS._serialized_end = 2603 + _CALLBACK_NEXUS_HEADERENTRY._serialized_start = 2558 + _CALLBACK_NEXUS_HEADERENTRY._serialized_end = 2603 + _CALLBACK_INTERNAL._serialized_start = 2605 + _CALLBACK_INTERNAL._serialized_end = 2629 + _CALLBACK_NEXUSHANDLER._serialized_start = 2632 + _CALLBACK_NEXUSHANDLER._serialized_end = 2764 + _LINK._serialized_start = 2784 + _LINK._serialized_end = 4006 + _LINK_WORKFLOWEVENT._serialized_start = 3172 + _LINK_WORKFLOWEVENT._serialized_end = 3611 + _LINK_WORKFLOWEVENT_EVENTREFERENCE._serialized_start = 3414 + _LINK_WORKFLOWEVENT_EVENTREFERENCE._serialized_end = 3502 + _LINK_WORKFLOWEVENT_REQUESTIDREFERENCE._serialized_start = 3504 + _LINK_WORKFLOWEVENT_REQUESTIDREFERENCE._serialized_end = 3598 + _LINK_BATCHJOB._serialized_start = 3613 + _LINK_BATCHJOB._serialized_end = 3639 + _LINK_ACTIVITY._serialized_start = 3641 + _LINK_ACTIVITY._serialized_end = 3707 + _LINK_NEXUSOPERATION._serialized_start = 3709 + _LINK_NEXUSOPERATION._serialized_end = 3782 + _LINK_WORKFLOW._serialized_start = 3784 + _LINK_WORKFLOW._serialized_end = 3866 + _LINK_CALLBACK._serialized_start = 3868 + _LINK_CALLBACK._serialized_end = 3995 + _PRINCIPAL._serialized_start = 4008 + _PRINCIPAL._serialized_end = 4047 + _PRIORITY._serialized_start = 4049 + _PRIORITY._serialized_end = 4128 + _WORKERSELECTOR._serialized_start = 4130 + _WORKERSELECTOR._serialized_end = 4189 + _ONCONFLICTOPTIONS._serialized_start = 4191 + _ONCONFLICTOPTIONS._serialized_end = 4296 + _TIMESKIPPINGCONFIG._serialized_start = 4299 + _TIMESKIPPINGCONFIG._serialized_end = 4469 + _FASTFORWARDCONFIG._serialized_start = 4471 + _FASTFORWARDCONFIG._serialized_end = 4547 + _TIMESKIPPINGSTATEPROPAGATION._serialized_start = 4550 + _TIMESKIPPINGSTATEPROPAGATION._serialized_end = 4731 + _TIMESKIPPINGINFO._serialized_start = 4734 + _TIMESKIPPINGINFO._serialized_end = 4988 + _TIMESKIPPINGFASTFORWARDINFO._serialized_start = 4991 + _TIMESKIPPINGFASTFORWARDINFO._serialized_end = 5175 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/common/v1/message_pb2.pyi b/temporalio/api/common/v1/message_pb2.pyi index f7ed8d0fd..441f1cdf1 100644 --- a/temporalio/api/common/v1/message_pb2.pyi +++ b/temporalio/api/common/v1/message_pb2.pyi @@ -322,9 +322,7 @@ class WorkflowExecution(google.protobuf.message.Message): global___WorkflowExecution = WorkflowExecution class Execution(google.protobuf.message.Message): - """Identifies a specific execution within a namespace. This is used for standalone activities - executions in batch jobs currently. - """ + """Identifies a specific execution within a namespace.""" DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -676,6 +674,10 @@ class Callback(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor class Nexus(google.protobuf.message.Message): + """Nexus callbacks are used to delivery Nexus operation completions, as defined in the Nexus RPC spec: + https://github.com/nexus-rpc/api/blob/main/SPEC.md#callback-urls + """ + DESCRIPTOR: google.protobuf.descriptor.Descriptor class HeaderEntry(google.protobuf.message.Message): @@ -737,14 +739,82 @@ class Callback(google.protobuf.message.Message): self, field_name: typing_extensions.Literal["data", b"data"] ) -> None: ... + class NexusHandler(google.protobuf.message.Message): + """NexusHandler callbacks are requests to invoke a specific shape of Nexus operation on a Temporal worker. + The specified Nexus operation must have the following: + - Input: temporalio.api.notificationservice.v1.OnCompleteRequest + - Output: temporalio.api.notificationservice.v1.OnCompleteResponse + + The targeted Nexus service must be registered within the same namespace as the source operation + the callback is attached to. (While Nexus allows for cross-namespace operations, NexusHandler callbacks + are strictly caller-side.) + + NexusHandler callbacks are only supported for certain types of operations, e.g. standalone Nexus operations. + Attempting to attach a Worker callback for an unsupported operation will result in an INVALID_ARGUMENT + error from the server. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TASK_QUEUE_NAME_FIELD_NUMBER: builtins.int + SERVICE_FIELD_NUMBER: builtins.int + OPERATION_FIELD_NUMBER: builtins.int + SOURCE_CONTEXT_FIELD_NUMBER: builtins.int + task_queue_name: builtins.str + """Nexus task queue the Temporal worker is listening on. + + NOTE: This is not a temporalio.api.taskqueue.v1.TaskQueue to avoid a circular dependency. + """ + service: builtins.str + """Target Nexus service, e.g. "HTTPAdapter".""" + operation: builtins.str + """Target operation, e.g. "DeliverAsWebhook".""" + @property + def source_context(self) -> global___Payload: + """Arbitrary user-supplied data from the source operation's callsite. (As applicable, not all operations + support attaching context data.) + + There are restrictions on the maxium payload size a single callback can carry, as well as the + total sum of all source context payloads attached to an execution. See dynamic configuration: + "callback.nexusHandler.sourceContext.maxSize", "callback.nexusHandler.sourceContext.aggregateMaxSize". + """ + def __init__( + self, + *, + task_queue_name: builtins.str = ..., + service: builtins.str = ..., + operation: builtins.str = ..., + source_context: global___Payload | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["source_context", b"source_context"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "operation", + b"operation", + "service", + b"service", + "source_context", + b"source_context", + "task_queue_name", + b"task_queue_name", + ], + ) -> None: ... + NEXUS_FIELD_NUMBER: builtins.int INTERNAL_FIELD_NUMBER: builtins.int + NEXUS_HANDLER_FIELD_NUMBER: builtins.int LINKS_FIELD_NUMBER: builtins.int @property def nexus(self) -> global___Callback.Nexus: ... @property def internal(self) -> global___Callback.Internal: ... @property + def nexus_handler(self) -> global___Callback.NexusHandler: ... + @property def links( self, ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ @@ -758,12 +828,20 @@ class Callback(google.protobuf.message.Message): *, nexus: global___Callback.Nexus | None = ..., internal: global___Callback.Internal | None = ..., + nexus_handler: global___Callback.NexusHandler | None = ..., links: collections.abc.Iterable[global___Link] | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "internal", b"internal", "nexus", b"nexus", "variant", b"variant" + "internal", + b"internal", + "nexus", + b"nexus", + "nexus_handler", + b"nexus_handler", + "variant", + b"variant", ], ) -> builtins.bool: ... def ClearField( @@ -775,13 +853,15 @@ class Callback(google.protobuf.message.Message): b"links", "nexus", b"nexus", + "nexus_handler", + b"nexus_handler", "variant", b"variant", ], ) -> None: ... def WhichOneof( self, oneof_group: typing_extensions.Literal["variant", b"variant"] - ) -> typing_extensions.Literal["nexus", "internal"] | None: ... + ) -> typing_extensions.Literal["nexus", "internal", "nexus_handler"] | None: ... global___Callback = Callback @@ -1011,11 +1091,63 @@ class Link(google.protobuf.message.Message): ], ) -> None: ... + class Callback(google.protobuf.message.Message): + """A link to a worker callback attached to an execution. An execution (e.g. standalone Nexus operation) can have + multiple callbacks attached, and will be differentiated by the request_id used when the callback is invoked. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int + COMPONENT_PATH_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + @property + def execution(self) -> global___Execution: ... + @property + def component_path( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[ + builtins.str + ]: + """In most cases, the Execution is sufficient to identify the callback's source. But the callback could have + been attached some child component of that execution. e.g. a workflow update. The component path describes + the unique component as applicable, typically ending with a unique ID. e.g. ["Update", $workflowUpdateId ] + """ + request_id: builtins.str + """Server-generate request ID sent when the callback was dispatched.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + execution: global___Execution | None = ..., + component_path: collections.abc.Iterable[builtins.str] | None = ..., + request_id: builtins.str = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["execution", b"execution"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "component_path", + b"component_path", + "execution", + b"execution", + "namespace", + b"namespace", + "request_id", + b"request_id", + ], + ) -> None: ... + WORKFLOW_EVENT_FIELD_NUMBER: builtins.int BATCH_JOB_FIELD_NUMBER: builtins.int ACTIVITY_FIELD_NUMBER: builtins.int NEXUS_OPERATION_FIELD_NUMBER: builtins.int WORKFLOW_FIELD_NUMBER: builtins.int + CALLBACK_FIELD_NUMBER: builtins.int @property def workflow_event(self) -> global___Link.WorkflowEvent: ... @property @@ -1026,6 +1158,8 @@ class Link(google.protobuf.message.Message): def nexus_operation(self) -> global___Link.NexusOperation: ... @property def workflow(self) -> global___Link.Workflow: ... + @property + def callback(self) -> global___Link.Callback: ... def __init__( self, *, @@ -1034,6 +1168,7 @@ class Link(google.protobuf.message.Message): activity: global___Link.Activity | None = ..., nexus_operation: global___Link.NexusOperation | None = ..., workflow: global___Link.Workflow | None = ..., + callback: global___Link.Callback | None = ..., ) -> None: ... def HasField( self, @@ -1042,6 +1177,8 @@ class Link(google.protobuf.message.Message): b"activity", "batch_job", b"batch_job", + "callback", + b"callback", "nexus_operation", b"nexus_operation", "variant", @@ -1059,6 +1196,8 @@ class Link(google.protobuf.message.Message): b"activity", "batch_job", b"batch_job", + "callback", + b"callback", "nexus_operation", b"nexus_operation", "variant", @@ -1073,7 +1212,12 @@ class Link(google.protobuf.message.Message): self, oneof_group: typing_extensions.Literal["variant", b"variant"] ) -> ( typing_extensions.Literal[ - "workflow_event", "batch_job", "activity", "nexus_operation", "workflow" + "workflow_event", + "batch_job", + "activity", + "nexus_operation", + "workflow", + "callback", ] | None ): ... diff --git a/temporalio/api/enums/v1/__init__.py b/temporalio/api/enums/v1/__init__.py index 3dc3a179b..518a2f32b 100644 --- a/temporalio/api/enums/v1/__init__.py +++ b/temporalio/api/enums/v1/__init__.py @@ -25,6 +25,7 @@ ) from .event_type_pb2 import EventType from .failed_cause_pb2 import ( + ActivityTaskFailedCause, CancelExternalWorkflowExecutionFailedCause, ResourceExhaustedCause, ResourceExhaustedScope, @@ -74,6 +75,7 @@ "ActivityExecutionStatus", "ActivityIdConflictPolicy", "ActivityIdReusePolicy", + "ActivityTaskFailedCause", "ApplicationErrorCategory", "ArchivalState", "BatchOperationState", diff --git a/temporalio/api/enums/v1/common_pb2.py b/temporalio/api/enums/v1/common_pb2.py index a646df4ad..f14182ffc 100644 --- a/temporalio/api/enums/v1/common_pb2.py +++ b/temporalio/api/enums/v1/common_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n\"temporal/api/enums/v1/common.proto\x12\x15temporal.api.enums.v1*_\n\x0c\x45ncodingType\x12\x1d\n\x19\x45NCODING_TYPE_UNSPECIFIED\x10\x00\x12\x18\n\x14\x45NCODING_TYPE_PROTO3\x10\x01\x12\x16\n\x12\x45NCODING_TYPE_JSON\x10\x02*\x91\x02\n\x10IndexedValueType\x12\"\n\x1eINDEXED_VALUE_TYPE_UNSPECIFIED\x10\x00\x12\x1b\n\x17INDEXED_VALUE_TYPE_TEXT\x10\x01\x12\x1e\n\x1aINDEXED_VALUE_TYPE_KEYWORD\x10\x02\x12\x1a\n\x16INDEXED_VALUE_TYPE_INT\x10\x03\x12\x1d\n\x19INDEXED_VALUE_TYPE_DOUBLE\x10\x04\x12\x1b\n\x17INDEXED_VALUE_TYPE_BOOL\x10\x05\x12\x1f\n\x1bINDEXED_VALUE_TYPE_DATETIME\x10\x06\x12#\n\x1fINDEXED_VALUE_TYPE_KEYWORD_LIST\x10\x07*^\n\x08Severity\x12\x18\n\x14SEVERITY_UNSPECIFIED\x10\x00\x12\x11\n\rSEVERITY_HIGH\x10\x01\x12\x13\n\x0fSEVERITY_MEDIUM\x10\x02\x12\x10\n\x0cSEVERITY_LOW\x10\x03*\xde\x01\n\rCallbackState\x12\x1e\n\x1a\x43\x41LLBACK_STATE_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43\x41LLBACK_STATE_STANDBY\x10\x01\x12\x1c\n\x18\x43\x41LLBACK_STATE_SCHEDULED\x10\x02\x12\x1e\n\x1a\x43\x41LLBACK_STATE_BACKING_OFF\x10\x03\x12\x19\n\x15\x43\x41LLBACK_STATE_FAILED\x10\x04\x12\x1c\n\x18\x43\x41LLBACK_STATE_SUCCEEDED\x10\x05\x12\x1a\n\x16\x43\x41LLBACK_STATE_BLOCKED\x10\x06*\xfd\x01\n\x1aPendingNexusOperationState\x12-\n)PENDING_NEXUS_OPERATION_STATE_UNSPECIFIED\x10\x00\x12+\n'PENDING_NEXUS_OPERATION_STATE_SCHEDULED\x10\x01\x12-\n)PENDING_NEXUS_OPERATION_STATE_BACKING_OFF\x10\x02\x12)\n%PENDING_NEXUS_OPERATION_STATE_STARTED\x10\x03\x12)\n%PENDING_NEXUS_OPERATION_STATE_BLOCKED\x10\x04*\xfe\x02\n\x1fNexusOperationCancellationState\x12\x32\n.NEXUS_OPERATION_CANCELLATION_STATE_UNSPECIFIED\x10\x00\x12\x30\n,NEXUS_OPERATION_CANCELLATION_STATE_SCHEDULED\x10\x01\x12\x32\n.NEXUS_OPERATION_CANCELLATION_STATE_BACKING_OFF\x10\x02\x12\x30\n,NEXUS_OPERATION_CANCELLATION_STATE_SUCCEEDED\x10\x03\x12-\n)NEXUS_OPERATION_CANCELLATION_STATE_FAILED\x10\x04\x12\x30\n,NEXUS_OPERATION_CANCELLATION_STATE_TIMED_OUT\x10\x05\x12.\n*NEXUS_OPERATION_CANCELLATION_STATE_BLOCKED\x10\x06*\x97\x01\n\x17WorkflowRuleActionScope\x12*\n&WORKFLOW_RULE_ACTION_SCOPE_UNSPECIFIED\x10\x00\x12'\n#WORKFLOW_RULE_ACTION_SCOPE_WORKFLOW\x10\x01\x12'\n#WORKFLOW_RULE_ACTION_SCOPE_ACTIVITY\x10\x02*m\n\x18\x41pplicationErrorCategory\x12*\n&APPLICATION_ERROR_CATEGORY_UNSPECIFIED\x10\x00\x12%\n!APPLICATION_ERROR_CATEGORY_BENIGN\x10\x01*\x85\x01\n\x0cWorkerStatus\x12\x1d\n\x19WORKER_STATUS_UNSPECIFIED\x10\x00\x12\x19\n\x15WORKER_STATUS_RUNNING\x10\x01\x12\x1f\n\x1bWORKER_STATUS_SHUTTING_DOWN\x10\x02\x12\x1a\n\x16WORKER_STATUS_SHUTDOWN\x10\x03*i\n\rExecutionType\x12\x1e\n\x1a\x45XECUTION_TYPE_UNSPECIFIED\x10\x00\x12\x1b\n\x17\x45XECUTION_TYPE_WORKFLOW\x10\x01\x12\x1b\n\x17\x45XECUTION_TYPE_ACTIVITY\x10\x02\x42\x83\x01\n\x18io.temporal.api.enums.v1B\x0b\x43ommonProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n\"temporal/api/enums/v1/common.proto\x12\x15temporal.api.enums.v1*_\n\x0c\x45ncodingType\x12\x1d\n\x19\x45NCODING_TYPE_UNSPECIFIED\x10\x00\x12\x18\n\x14\x45NCODING_TYPE_PROTO3\x10\x01\x12\x16\n\x12\x45NCODING_TYPE_JSON\x10\x02*\x91\x02\n\x10IndexedValueType\x12\"\n\x1eINDEXED_VALUE_TYPE_UNSPECIFIED\x10\x00\x12\x1b\n\x17INDEXED_VALUE_TYPE_TEXT\x10\x01\x12\x1e\n\x1aINDEXED_VALUE_TYPE_KEYWORD\x10\x02\x12\x1a\n\x16INDEXED_VALUE_TYPE_INT\x10\x03\x12\x1d\n\x19INDEXED_VALUE_TYPE_DOUBLE\x10\x04\x12\x1b\n\x17INDEXED_VALUE_TYPE_BOOL\x10\x05\x12\x1f\n\x1bINDEXED_VALUE_TYPE_DATETIME\x10\x06\x12#\n\x1fINDEXED_VALUE_TYPE_KEYWORD_LIST\x10\x07*^\n\x08Severity\x12\x18\n\x14SEVERITY_UNSPECIFIED\x10\x00\x12\x11\n\rSEVERITY_HIGH\x10\x01\x12\x13\n\x0fSEVERITY_MEDIUM\x10\x02\x12\x10\n\x0cSEVERITY_LOW\x10\x03*\xde\x01\n\rCallbackState\x12\x1e\n\x1a\x43\x41LLBACK_STATE_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43\x41LLBACK_STATE_STANDBY\x10\x01\x12\x1c\n\x18\x43\x41LLBACK_STATE_SCHEDULED\x10\x02\x12\x1e\n\x1a\x43\x41LLBACK_STATE_BACKING_OFF\x10\x03\x12\x19\n\x15\x43\x41LLBACK_STATE_FAILED\x10\x04\x12\x1c\n\x18\x43\x41LLBACK_STATE_SUCCEEDED\x10\x05\x12\x1a\n\x16\x43\x41LLBACK_STATE_BLOCKED\x10\x06*\xfd\x01\n\x1aPendingNexusOperationState\x12-\n)PENDING_NEXUS_OPERATION_STATE_UNSPECIFIED\x10\x00\x12+\n'PENDING_NEXUS_OPERATION_STATE_SCHEDULED\x10\x01\x12-\n)PENDING_NEXUS_OPERATION_STATE_BACKING_OFF\x10\x02\x12)\n%PENDING_NEXUS_OPERATION_STATE_STARTED\x10\x03\x12)\n%PENDING_NEXUS_OPERATION_STATE_BLOCKED\x10\x04*\xfe\x02\n\x1fNexusOperationCancellationState\x12\x32\n.NEXUS_OPERATION_CANCELLATION_STATE_UNSPECIFIED\x10\x00\x12\x30\n,NEXUS_OPERATION_CANCELLATION_STATE_SCHEDULED\x10\x01\x12\x32\n.NEXUS_OPERATION_CANCELLATION_STATE_BACKING_OFF\x10\x02\x12\x30\n,NEXUS_OPERATION_CANCELLATION_STATE_SUCCEEDED\x10\x03\x12-\n)NEXUS_OPERATION_CANCELLATION_STATE_FAILED\x10\x04\x12\x30\n,NEXUS_OPERATION_CANCELLATION_STATE_TIMED_OUT\x10\x05\x12.\n*NEXUS_OPERATION_CANCELLATION_STATE_BLOCKED\x10\x06*\x97\x01\n\x17WorkflowRuleActionScope\x12*\n&WORKFLOW_RULE_ACTION_SCOPE_UNSPECIFIED\x10\x00\x12'\n#WORKFLOW_RULE_ACTION_SCOPE_WORKFLOW\x10\x01\x12'\n#WORKFLOW_RULE_ACTION_SCOPE_ACTIVITY\x10\x02*m\n\x18\x41pplicationErrorCategory\x12*\n&APPLICATION_ERROR_CATEGORY_UNSPECIFIED\x10\x00\x12%\n!APPLICATION_ERROR_CATEGORY_BENIGN\x10\x01*\x85\x01\n\x0cWorkerStatus\x12\x1d\n\x19WORKER_STATUS_UNSPECIFIED\x10\x00\x12\x19\n\x15WORKER_STATUS_RUNNING\x10\x01\x12\x1f\n\x1bWORKER_STATUS_SHUTTING_DOWN\x10\x02\x12\x1a\n\x16WORKER_STATUS_SHUTDOWN\x10\x03*\x8d\x01\n\rExecutionType\x12\x1e\n\x1a\x45XECUTION_TYPE_UNSPECIFIED\x10\x00\x12\x1b\n\x17\x45XECUTION_TYPE_WORKFLOW\x10\x01\x12\x1b\n\x17\x45XECUTION_TYPE_ACTIVITY\x10\x02\x12\"\n\x1e\x45XECUTION_TYPE_NEXUS_OPERATION\x10\x03\x42\x83\x01\n\x18io.temporal.api.enums.v1B\x0b\x43ommonProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _ENCODINGTYPE = DESCRIPTOR.enum_types_by_name["EncodingType"] @@ -93,6 +93,7 @@ EXECUTION_TYPE_UNSPECIFIED = 0 EXECUTION_TYPE_WORKFLOW = 1 EXECUTION_TYPE_ACTIVITY = 2 +EXECUTION_TYPE_NEXUS_OPERATION = 3 if _descriptor._USE_C_DESCRIPTORS == False: @@ -116,6 +117,6 @@ _APPLICATIONERRORCATEGORY._serialized_end = 1659 _WORKERSTATUS._serialized_start = 1662 _WORKERSTATUS._serialized_end = 1795 - _EXECUTIONTYPE._serialized_start = 1797 - _EXECUTIONTYPE._serialized_end = 1902 + _EXECUTIONTYPE._serialized_start = 1798 + _EXECUTIONTYPE._serialized_end = 1939 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/common_pb2.pyi b/temporalio/api/enums/v1/common_pb2.pyi index 47b6d030b..c2c73deb2 100644 --- a/temporalio/api/enums/v1/common_pb2.pyi +++ b/temporalio/api/enums/v1/common_pb2.pyi @@ -119,7 +119,7 @@ class _CallbackStateEnumTypeWrapper( CALLBACK_STATE_SUCCEEDED: _CallbackState.ValueType # 5 """Callback has succeeded.""" CALLBACK_STATE_BLOCKED: _CallbackState.ValueType # 6 - """Callback is blocked (eg: by circuit breaker).""" + """Callback is blocked, e.g. by circuit breaker.""" class CallbackState(_CallbackState, metaclass=_CallbackStateEnumTypeWrapper): """State of a callback.""" @@ -137,7 +137,7 @@ CALLBACK_STATE_FAILED: CallbackState.ValueType # 4 CALLBACK_STATE_SUCCEEDED: CallbackState.ValueType # 5 """Callback has succeeded.""" CALLBACK_STATE_BLOCKED: CallbackState.ValueType # 6 -"""Callback is blocked (eg: by circuit breaker).""" +"""Callback is blocked, e.g. by circuit breaker.""" global___CallbackState = CallbackState class _PendingNexusOperationState: @@ -356,6 +356,8 @@ class _ExecutionTypeEnumTypeWrapper( """A workflow execution archetype.""" EXECUTION_TYPE_ACTIVITY: _ExecutionType.ValueType # 2 """An activity execution archetype. This is reserved for standalone activities.""" + EXECUTION_TYPE_NEXUS_OPERATION: _ExecutionType.ValueType # 3 + """A Nexus operation execution archetype. This is reserved for standalone Nexus operations.""" class ExecutionType(_ExecutionType, metaclass=_ExecutionTypeEnumTypeWrapper): ... @@ -364,4 +366,6 @@ EXECUTION_TYPE_WORKFLOW: ExecutionType.ValueType # 1 """A workflow execution archetype.""" EXECUTION_TYPE_ACTIVITY: ExecutionType.ValueType # 2 """An activity execution archetype. This is reserved for standalone activities.""" +EXECUTION_TYPE_NEXUS_OPERATION: ExecutionType.ValueType # 3 +"""A Nexus operation execution archetype. This is reserved for standalone Nexus operations.""" global___ExecutionType = ExecutionType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 70229ee81..8e2512a3b 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,11 +16,13 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xce\x15\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xce\x15\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+*\xf3\x01\n\x17\x41\x63tivityTaskFailedCause\x12*\n&ACTIVITY_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x31\n-ACTIVITY_TASK_FAILED_CAUSE_PAYLOADS_TOO_LARGE\x10\x01\x12\x37\n3ACTIVITY_TASK_FAILED_CAUSE_EXTERNAL_STORAGE_FAILURE\x10\x02\x12@\n\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xdd\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12=\n\x05\x63\x61use\x18\x07 \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -1270,115 +1270,115 @@ _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7552 _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7784 _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7787 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8073 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8076 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8274 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8276 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8390 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8393 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8667 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8670 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8817 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8819 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8890 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8893 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9027 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9030 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9229 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9232 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9367 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9370 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9731 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9651 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9731 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9734 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10053 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10056 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10185 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10188 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8136 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8139 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8337 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8339 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8453 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8456 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8730 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8733 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8880 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8882 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8953 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8956 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9090 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9093 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9292 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9295 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9430 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9433 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9794 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9714 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9794 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9797 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10116 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10119 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10248 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10251 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10472 + 10535 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10475 + 10538 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10821 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10824 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11021 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11024 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11403 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11406 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11745 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11748 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11959 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11962 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12120 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12123 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12261 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12264 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13540 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13543 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13885 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13888 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14183 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14186 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14511 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14514 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14893 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14896 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15221 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15224 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15554 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15557 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15833 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15836 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16566 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16416 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16566 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16569 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16889 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16892 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17036 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17038 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17162 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17165 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17312 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17315 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17535 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17538 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17708 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17711 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17982 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17985 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18149 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18151 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18245 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18247 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18343 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18346 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18543 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18546 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19110 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19060 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19110 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19113 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19250 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19253 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19390 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19393 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19529 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19532 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19670 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19673 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19811 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19813 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19929 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19932 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20083 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20086 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20285 - _HISTORYEVENT._serialized_start = 20288 - _HISTORYEVENT._serialized_end = 28680 - _HISTORY._serialized_start = 28682 - _HISTORY._serialized_end = 28746 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10884 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10887 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11084 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11087 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11466 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11469 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11808 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11811 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12022 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12025 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12183 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12186 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12324 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12327 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13603 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13606 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13948 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13951 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14246 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14249 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14574 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14577 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14956 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14959 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15284 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15287 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15617 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15620 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15896 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15899 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16629 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16479 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16629 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16632 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16952 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16955 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17099 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17101 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17225 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17228 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17375 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17378 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17598 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17601 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17771 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17774 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18045 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18048 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18212 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18214 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18308 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18310 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18406 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18409 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18606 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18609 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19173 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19123 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19173 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19176 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19313 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19316 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19453 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19456 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19592 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19595 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19733 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19736 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19874 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19876 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19992 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19995 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20146 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20149 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20348 + _HISTORYEVENT._serialized_start = 20351 + _HISTORYEVENT._serialized_end = 28743 + _HISTORY._serialized_start = 28745 + _HISTORY._serialized_end = 28809 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 6cfdea7ef..4dbd1c98b 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -1574,6 +1574,7 @@ class ActivityTaskFailedEventAttributes(google.protobuf.message.Message): IDENTITY_FIELD_NUMBER: builtins.int RETRY_STATE_FIELD_NUMBER: builtins.int WORKER_VERSION_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int @property def failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: """Failure details""" @@ -1589,6 +1590,8 @@ class ActivityTaskFailedEventAttributes(google.protobuf.message.Message): """Version info of the worker who processed this workflow task. Deprecated. This field should be cleaned up when versioning-2 API is removed. [cleanup-experimental-wv] """ + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType + """Why did the task fail? When unset, the failure is treated as an unspecified activity failure.""" def __init__( self, *, @@ -1599,6 +1602,7 @@ class ActivityTaskFailedEventAttributes(google.protobuf.message.Message): retry_state: temporalio.api.enums.v1.workflow_pb2.RetryState.ValueType = ..., worker_version: temporalio.api.common.v1.message_pb2.WorkerVersionStamp | None = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType = ..., ) -> None: ... def HasField( self, @@ -1609,6 +1613,8 @@ class ActivityTaskFailedEventAttributes(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "cause", + b"cause", "failure", b"failure", "identity", diff --git a/temporalio/api/nexusoperation/__init__.py b/temporalio/api/nexusoperation/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/nexusoperation/v1/__init__.py b/temporalio/api/nexusoperation/v1/__init__.py new file mode 100644 index 000000000..635700305 --- /dev/null +++ b/temporalio/api/nexusoperation/v1/__init__.py @@ -0,0 +1,6 @@ +from .message_pb2 import CallbackInfo, OnConflictOptions + +__all__ = [ + "CallbackInfo", + "OnConflictOptions", +] diff --git a/temporalio/api/nexusoperation/v1/message_pb2.py b/temporalio/api/nexusoperation/v1/message_pb2.py new file mode 100644 index 000000000..a48e8d82a --- /dev/null +++ b/temporalio/api/nexusoperation/v1/message_pb2.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/nexusoperation/v1/message.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.callback.v1 import ( + message_pb2 as temporal_dot_api_dot_callback_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n,temporal/api/nexusoperation/v1/message.proto\x12\x1etemporal.api.nexusoperation.v1\x1a&temporal/api/callback/v1/message.proto"\x97\x02\n\x0c\x43\x61llbackInfo\x12\x45\n\x07trigger\x18\x01 \x01(\x0b\x32\x34.temporal.api.nexusoperation.v1.CallbackInfo.Trigger\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.callback.v1.CallbackInfo\x1a\x14\n\x12OperationCompleted\x1at\n\x07Trigger\x12^\n\x13operation_completed\x18\x01 \x01(\x0b\x32?.temporal.api.nexusoperation.v1.CallbackInfo.OperationCompletedH\x00\x42\t\n\x07variant"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08\x42\xb1\x01\n!io.temporal.api.nexusoperation.v1B\x0cMessageProtoP\x01Z3go.temporal.io/api/nexusoperation/v1;nexusoperation\xaa\x02 Temporalio.Api.NexusOperation.V1\xea\x02#Temporalio::Api::NexusOperation::V1b\x06proto3' +) + + +_CALLBACKINFO = DESCRIPTOR.message_types_by_name["CallbackInfo"] +_CALLBACKINFO_OPERATIONCOMPLETED = _CALLBACKINFO.nested_types_by_name[ + "OperationCompleted" +] +_CALLBACKINFO_TRIGGER = _CALLBACKINFO.nested_types_by_name["Trigger"] +_ONCONFLICTOPTIONS = DESCRIPTOR.message_types_by_name["OnConflictOptions"] +CallbackInfo = _reflection.GeneratedProtocolMessageType( + "CallbackInfo", + (_message.Message,), + { + "OperationCompleted": _reflection.GeneratedProtocolMessageType( + "OperationCompleted", + (_message.Message,), + { + "DESCRIPTOR": _CALLBACKINFO_OPERATIONCOMPLETED, + "__module__": "temporalio.api.nexusoperation.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.nexusoperation.v1.CallbackInfo.OperationCompleted) + }, + ), + "Trigger": _reflection.GeneratedProtocolMessageType( + "Trigger", + (_message.Message,), + { + "DESCRIPTOR": _CALLBACKINFO_TRIGGER, + "__module__": "temporalio.api.nexusoperation.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.nexusoperation.v1.CallbackInfo.Trigger) + }, + ), + "DESCRIPTOR": _CALLBACKINFO, + "__module__": "temporalio.api.nexusoperation.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.nexusoperation.v1.CallbackInfo) + }, +) +_sym_db.RegisterMessage(CallbackInfo) +_sym_db.RegisterMessage(CallbackInfo.OperationCompleted) +_sym_db.RegisterMessage(CallbackInfo.Trigger) + +OnConflictOptions = _reflection.GeneratedProtocolMessageType( + "OnConflictOptions", + (_message.Message,), + { + "DESCRIPTOR": _ONCONFLICTOPTIONS, + "__module__": "temporalio.api.nexusoperation.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.nexusoperation.v1.OnConflictOptions) + }, +) +_sym_db.RegisterMessage(OnConflictOptions) + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n!io.temporal.api.nexusoperation.v1B\014MessageProtoP\001Z3go.temporal.io/api/nexusoperation/v1;nexusoperation\252\002 Temporalio.Api.NexusOperation.V1\352\002#Temporalio::Api::NexusOperation::V1" + _CALLBACKINFO._serialized_start = 121 + _CALLBACKINFO._serialized_end = 400 + _CALLBACKINFO_OPERATIONCOMPLETED._serialized_start = 262 + _CALLBACKINFO_OPERATIONCOMPLETED._serialized_end = 282 + _CALLBACKINFO_TRIGGER._serialized_start = 284 + _CALLBACKINFO_TRIGGER._serialized_end = 400 + _ONCONFLICTOPTIONS._serialized_start = 402 + _ONCONFLICTOPTIONS._serialized_end = 507 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/nexusoperation/v1/message_pb2.pyi b/temporalio/api/nexusoperation/v1/message_pb2.pyi new file mode 100644 index 000000000..6b81093e7 --- /dev/null +++ b/temporalio/api/nexusoperation/v1/message_pb2.pyi @@ -0,0 +1,125 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import sys + +import google.protobuf.descriptor +import google.protobuf.message + +import temporalio.api.callback.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class CallbackInfo(google.protobuf.message.Message): + """CallbackInfo contains the state of a callback attached to a standalone Nexus operation.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class OperationCompleted(google.protobuf.message.Message): + """Trigger for when the Nexus operation is completed, covering both success cases as + well as any type of failure. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + + class Trigger(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + OPERATION_COMPLETED_FIELD_NUMBER: builtins.int + @property + def operation_completed(self) -> global___CallbackInfo.OperationCompleted: ... + def __init__( + self, + *, + operation_completed: global___CallbackInfo.OperationCompleted | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "operation_completed", b"operation_completed", "variant", b"variant" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "operation_completed", b"operation_completed", "variant", b"variant" + ], + ) -> None: ... + def WhichOneof( + self, oneof_group: typing_extensions.Literal["variant", b"variant"] + ) -> typing_extensions.Literal["operation_completed"] | None: ... + + TRIGGER_FIELD_NUMBER: builtins.int + INFO_FIELD_NUMBER: builtins.int + @property + def trigger(self) -> global___CallbackInfo.Trigger: + """Trigger for this callback.""" + @property + def info(self) -> temporalio.api.callback.v1.message_pb2.CallbackInfo: + """Common callback info.""" + def __init__( + self, + *, + trigger: global___CallbackInfo.Trigger | None = ..., + info: temporalio.api.callback.v1.message_pb2.CallbackInfo | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal["info", b"info", "trigger", b"trigger"], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["info", b"info", "trigger", b"trigger"], + ) -> None: ... + +global___CallbackInfo = CallbackInfo + +class OnConflictOptions(google.protobuf.message.Message): + """When StartNexusOperationExecutionRequest uses the conflict policy NEXUS_OPERATION_ID_CONFLICT_POLICY_USE_EXISTING + and there is already an existing, running standalone Nexus operation, OnConflictOptions defines actions to be + taken. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ATTACH_REQUEST_ID_FIELD_NUMBER: builtins.int + ATTACH_COMPLETION_CALLBACKS_FIELD_NUMBER: builtins.int + ATTACH_LINKS_FIELD_NUMBER: builtins.int + attach_request_id: builtins.bool + """Attaches the request ID to the running operation.""" + attach_completion_callbacks: builtins.bool + """Attaches the completion callbacks to the running operation.""" + attach_links: builtins.bool + """Attaches any new links to the running operation.""" + def __init__( + self, + *, + attach_request_id: builtins.bool = ..., + attach_completion_callbacks: builtins.bool = ..., + attach_links: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "attach_completion_callbacks", + b"attach_completion_callbacks", + "attach_links", + b"attach_links", + "attach_request_id", + b"attach_request_id", + ], + ) -> None: ... + +global___OnConflictOptions = OnConflictOptions diff --git a/temporalio/api/notificationservice/__init__.py b/temporalio/api/notificationservice/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/notificationservice/v1/__init__.py b/temporalio/api/notificationservice/v1/__init__.py new file mode 100644 index 000000000..7b51b0a83 --- /dev/null +++ b/temporalio/api/notificationservice/v1/__init__.py @@ -0,0 +1,6 @@ +from .request_response_pb2 import OnCompleteRequest, OnCompleteResponse + +__all__ = [ + "OnCompleteRequest", + "OnCompleteResponse", +] diff --git a/temporalio/api/notificationservice/v1/request_response_pb2.py b/temporalio/api/notificationservice/v1/request_response_pb2.py new file mode 100644 index 000000000..0f7296d1b --- /dev/null +++ b/temporalio/api/notificationservice/v1/request_response_pb2.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/notificationservice/v1/request_response.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) +from temporalio.api.failure.v1 import ( + message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n:temporal/api/notificationservice/v1/request_response.proto\x12#temporal.api.notificationservice.v1\x1a$temporal/api/common/v1/message.proto\x1a%temporal/api/failure/v1/message.proto"\xbf\x01\n\x11OnCompleteRequest\x12\x32\n\x07success\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x37\n\x0esource_context\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadB\x08\n\x06result"\x14\n\x12OnCompleteResponseB\xd2\x01\n&io.temporal.api.notificationservice.v1B\x14RequestResponseProtoP\x01Z=go.temporal.io/api/notificationservice/v1;notificationservice\xaa\x02%Temporalio.Api.NotificationService.V1\xea\x02(Temporalio::Api::NotificationService::V1b\x06proto3' +) + + +_ONCOMPLETEREQUEST = DESCRIPTOR.message_types_by_name["OnCompleteRequest"] +_ONCOMPLETERESPONSE = DESCRIPTOR.message_types_by_name["OnCompleteResponse"] +OnCompleteRequest = _reflection.GeneratedProtocolMessageType( + "OnCompleteRequest", + (_message.Message,), + { + "DESCRIPTOR": _ONCOMPLETEREQUEST, + "__module__": "temporalio.api.notificationservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notificationservice.v1.OnCompleteRequest) + }, +) +_sym_db.RegisterMessage(OnCompleteRequest) + +OnCompleteResponse = _reflection.GeneratedProtocolMessageType( + "OnCompleteResponse", + (_message.Message,), + { + "DESCRIPTOR": _ONCOMPLETERESPONSE, + "__module__": "temporalio.api.notificationservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notificationservice.v1.OnCompleteResponse) + }, +) +_sym_db.RegisterMessage(OnCompleteResponse) + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n&io.temporal.api.notificationservice.v1B\024RequestResponseProtoP\001Z=go.temporal.io/api/notificationservice/v1;notificationservice\252\002%Temporalio.Api.NotificationService.V1\352\002(Temporalio::Api::NotificationService::V1" + _ONCOMPLETEREQUEST._serialized_start = 177 + _ONCOMPLETEREQUEST._serialized_end = 368 + _ONCOMPLETERESPONSE._serialized_start = 370 + _ONCOMPLETERESPONSE._serialized_end = 390 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/notificationservice/v1/request_response_pb2.pyi b/temporalio/api/notificationservice/v1/request_response_pb2.pyi new file mode 100644 index 000000000..f83768a3c --- /dev/null +++ b/temporalio/api/notificationservice/v1/request_response_pb2.pyi @@ -0,0 +1,94 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import sys + +import google.protobuf.descriptor +import google.protobuf.message + +import temporalio.api.common.v1.message_pb2 +import temporalio.api.failure.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class OnCompleteRequest(google.protobuf.message.Message): + """OnCompleteRequest is the request type to the NotificationService's OnComplete operation, + allowing for defining completion handlers for arbitrary operations. + + Information about the source operation will be available in the form of a commonpb.Link, + which will be available separately from this OnCompleteRequest. e.g. a link to the source + standalone Nexus operation would be found in the nexuspb.StartOperationRequest parameter + sent to the worker callback. (In addition to this OnCompleteRequest.) + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + FAILURE_FIELD_NUMBER: builtins.int + SOURCE_CONTEXT_FIELD_NUMBER: builtins.int + @property + def success(self) -> temporalio.api.common.v1.message_pb2.Payload: + """The operation was successful, and resulted in the given payload.""" + @property + def failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: + """The operation failed. Includes timeout, cancellation, and application errors.""" + @property + def source_context(self) -> temporalio.api.common.v1.message_pb2.Payload: + """User-supplied data which was added to the source invocation. (As applicable.)""" + def __init__( + self, + *, + success: temporalio.api.common.v1.message_pb2.Payload | None = ..., + failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., + source_context: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "failure", + b"failure", + "result", + b"result", + "source_context", + b"source_context", + "success", + b"success", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "failure", + b"failure", + "result", + b"result", + "source_context", + b"source_context", + "success", + b"success", + ], + ) -> None: ... + def WhichOneof( + self, oneof_group: typing_extensions.Literal["result", b"result"] + ) -> typing_extensions.Literal["success", "failure"] | None: ... + +global___OnCompleteRequest = OnCompleteRequest + +class OnCompleteResponse(google.protobuf.message.Message): + """OnCompleteResponse is the return type of the OnComplete operation.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___OnCompleteResponse = OnCompleteResponse diff --git a/temporalio/api/notificationservice/v1/request_response_pb2_grpc.py b/temporalio/api/notificationservice/v1/request_response_pb2_grpc.py new file mode 100644 index 000000000..bf947056a --- /dev/null +++ b/temporalio/api/notificationservice/v1/request_response_pb2_grpc.py @@ -0,0 +1,4 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" + +import grpc diff --git a/temporalio/api/notificationservice/v1/request_response_pb2_grpc.pyi b/temporalio/api/notificationservice/v1/request_response_pb2_grpc.pyi new file mode 100644 index 000000000..f3a5a087e --- /dev/null +++ b/temporalio/api/notificationservice/v1/request_response_pb2_grpc.pyi @@ -0,0 +1,4 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" diff --git a/temporalio/api/replication/v1/message_pb2.py b/temporalio/api/replication/v1/message_pb2.py index 8dbe73e1d..b77c51032 100644 --- a/temporalio/api/replication/v1/message_pb2.py +++ b/temporalio/api/replication/v1/message_pb2.py @@ -14,6 +14,7 @@ _sym_db = _symbol_database.Default() +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 from temporalio.api.enums.v1 import ( @@ -21,7 +22,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n)temporal/api/replication/v1/message.proto\x12\x1btemporal.api.replication.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a%temporal/api/enums/v1/namespace.proto"0\n\x18\x43lusterReplicationConfig\x12\x14\n\x0c\x63luster_name\x18\x01 \x01(\t"\xba\x01\n\x1aNamespaceReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x01 \x01(\t\x12G\n\x08\x63lusters\x18\x02 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x36\n\x05state\x18\x03 \x01(\x0e\x32\'.temporal.api.enums.v1.ReplicationState"]\n\x0e\x46\x61iloverStatus\x12\x31\n\rfailover_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x66\x61ilover_version\x18\x02 \x01(\x03\x42\xa2\x01\n\x1eio.temporal.api.replication.v1B\x0cMessageProtoP\x01Z-go.temporal.io/api/replication/v1;replication\xaa\x02\x1dTemporalio.Api.Replication.V1\xea\x02 Temporalio::Api::Replication::V1b\x06proto3' + b'\n)temporal/api/replication/v1/message.proto\x12\x1btemporal.api.replication.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a%temporal/api/enums/v1/namespace.proto"n\n\x18\x43lusterReplicationConfig\x12\x14\n\x0c\x63luster_name\x18\x01 \x01(\t\x12<\n\x19replication_ramp_duration\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\xba\x01\n\x1aNamespaceReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x01 \x01(\t\x12G\n\x08\x63lusters\x18\x02 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x36\n\x05state\x18\x03 \x01(\x0e\x32\'.temporal.api.enums.v1.ReplicationState"]\n\x0e\x46\x61iloverStatus\x12\x31\n\rfailover_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x66\x61ilover_version\x18\x02 \x01(\x03\x42\xa2\x01\n\x1eio.temporal.api.replication.v1B\x0cMessageProtoP\x01Z-go.temporal.io/api/replication/v1;replication\xaa\x02\x1dTemporalio.Api.Replication.V1\xea\x02 Temporalio::Api::Replication::V1b\x06proto3' ) @@ -66,10 +67,10 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\036io.temporal.api.replication.v1B\014MessageProtoP\001Z-go.temporal.io/api/replication/v1;replication\252\002\035Temporalio.Api.Replication.V1\352\002 Temporalio::Api::Replication::V1" - _CLUSTERREPLICATIONCONFIG._serialized_start = 146 - _CLUSTERREPLICATIONCONFIG._serialized_end = 194 - _NAMESPACEREPLICATIONCONFIG._serialized_start = 197 - _NAMESPACEREPLICATIONCONFIG._serialized_end = 383 - _FAILOVERSTATUS._serialized_start = 385 - _FAILOVERSTATUS._serialized_end = 478 + _CLUSTERREPLICATIONCONFIG._serialized_start = 178 + _CLUSTERREPLICATIONCONFIG._serialized_end = 288 + _NAMESPACEREPLICATIONCONFIG._serialized_start = 291 + _NAMESPACEREPLICATIONCONFIG._serialized_end = 477 + _FAILOVERSTATUS._serialized_start = 479 + _FAILOVERSTATUS._serialized_end = 572 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/replication/v1/message_pb2.pyi b/temporalio/api/replication/v1/message_pb2.pyi index e6f04334f..d3393bb58 100644 --- a/temporalio/api/replication/v1/message_pb2.pyi +++ b/temporalio/api/replication/v1/message_pb2.pyi @@ -8,6 +8,7 @@ import collections.abc import sys import google.protobuf.descriptor +import google.protobuf.duration_pb2 import google.protobuf.internal.containers import google.protobuf.message import google.protobuf.timestamp_pb2 @@ -25,14 +26,33 @@ class ClusterReplicationConfig(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor CLUSTER_NAME_FIELD_NUMBER: builtins.int + REPLICATION_RAMP_DURATION_FIELD_NUMBER: builtins.int cluster_name: builtins.str + @property + def replication_ramp_duration(self) -> google.protobuf.duration_pb2.Duration: + """Ramp duration when this cluster is added as passive by UpdateNamespace; unset or non-positive disables gradual connect. + This field is not persisted and is omitted from namespace responses. + """ def __init__( self, *, cluster_name: builtins.str = ..., + replication_ramp_duration: google.protobuf.duration_pb2.Duration | None = ..., ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "replication_ramp_duration", b"replication_ramp_duration" + ], + ) -> builtins.bool: ... def ClearField( - self, field_name: typing_extensions.Literal["cluster_name", b"cluster_name"] + self, + field_name: typing_extensions.Literal[ + "cluster_name", + b"cluster_name", + "replication_ramp_duration", + b"replication_ramp_duration", + ], ) -> None: ... global___ClusterReplicationConfig = ClusterReplicationConfig diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index 032f2b2b5..e4f1ccc48 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x96\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -566,37 +566,37 @@ _NEWWORKFLOWEXECUTIONINFO._serialized_start = 6163 _NEWWORKFLOWEXECUTIONINFO._serialized_end = 7064 _CALLBACKINFO._serialized_start = 7067 - _CALLBACKINFO._serialized_end = 7837 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7541 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7557 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7559 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7612 - _CALLBACKINFO_TRIGGER._serialized_start = 7615 - _CALLBACKINFO_TRIGGER._serialized_end = 7837 - _PENDINGNEXUSOPERATIONINFO._serialized_start = 7840 - _PENDINGNEXUSOPERATIONINFO._serialized_end = 8619 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8622 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9010 - _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9013 - _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9240 - _VERSIONINGOVERRIDE._serialized_start = 9243 - _VERSIONINGOVERRIDE._serialized_end = 10005 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9608 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 9781 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 9783 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 9888 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 9890 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 9993 - _ONCONFLICTOPTIONS._serialized_start = 10007 - _ONCONFLICTOPTIONS._serialized_end = 10112 - _REQUESTIDINFO._serialized_start = 10114 - _REQUESTIDINFO._serialized_end = 10219 - _POSTRESETOPERATION._serialized_start = 10222 - _POSTRESETOPERATION._serialized_end = 10789 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10436 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10615 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10618 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10778 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10791 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10902 + _CALLBACKINFO._serialized_end = 7857 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7561 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7577 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7579 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7632 + _CALLBACKINFO_TRIGGER._serialized_start = 7635 + _CALLBACKINFO_TRIGGER._serialized_end = 7857 + _PENDINGNEXUSOPERATIONINFO._serialized_start = 7860 + _PENDINGNEXUSOPERATIONINFO._serialized_end = 8639 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8642 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9030 + _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9033 + _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9260 + _VERSIONINGOVERRIDE._serialized_start = 9263 + _VERSIONINGOVERRIDE._serialized_end = 10025 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9628 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 9801 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 9803 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 9908 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 9910 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 10013 + _ONCONFLICTOPTIONS._serialized_start = 10027 + _ONCONFLICTOPTIONS._serialized_end = 10132 + _REQUESTIDINFO._serialized_start = 10134 + _REQUESTIDINFO._serialized_end = 10239 + _POSTRESETOPERATION._serialized_start = 10242 + _POSTRESETOPERATION._serialized_end = 10809 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10456 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10635 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10638 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10798 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10811 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10922 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index b390d94f4..f884493c2 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -1553,6 +1553,7 @@ class CallbackInfo(google.protobuf.message.Message): LAST_ATTEMPT_FAILURE_FIELD_NUMBER: builtins.int NEXT_ATTEMPT_SCHEDULE_TIME_FIELD_NUMBER: builtins.int BLOCKED_REASON_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int @property def callback(self) -> temporalio.api.common.v1.message_pb2.Callback: """Information on how this callback should be invoked (e.g. its URL and type).""" @@ -1578,6 +1579,10 @@ class CallbackInfo(google.protobuf.message.Message): """The time when the next attempt is scheduled.""" blocked_reason: builtins.str """If the state is BLOCKED, blocked reason provides additional information.""" + request_id: builtins.str + """Server-generated request ID used as an idempotency token when invoking callbacks. + It has no relation to caller-side request_id sent in operations like StartWorkflowExecutionRequest. + """ def __init__( self, *, @@ -1593,6 +1598,7 @@ class CallbackInfo(google.protobuf.message.Message): next_attempt_schedule_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., blocked_reason: builtins.str = ..., + request_id: builtins.str = ..., ) -> None: ... def HasField( self, @@ -1628,6 +1634,8 @@ class CallbackInfo(google.protobuf.message.Message): b"next_attempt_schedule_time", "registration_time", b"registration_time", + "request_id", + b"request_id", "state", b"state", "trigger", diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index cdf2becc2..1cfae35e9 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.nexusoperation.v1 import ( + message_pb2 as temporal_dot_api_dot_nexusoperation_dot_v1_dot_message__pb2, +) from temporalio.api.protocol.v1 import ( message_pb2 as temporal_dot_api_dot_protocol_dot_v1_dot_message__pb2, ) @@ -134,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4217,578 +4220,578 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1684 - _REGISTERNAMESPACEREQUEST._serialized_end = 2332 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 - _REGISTERNAMESPACERESPONSE._serialized_start = 2334 - _REGISTERNAMESPACERESPONSE._serialized_end = 2361 - _LISTNAMESPACESREQUEST._serialized_start = 2364 - _LISTNAMESPACESREQUEST._serialized_end = 2501 - _LISTNAMESPACESRESPONSE._serialized_start = 2504 - _LISTNAMESPACESRESPONSE._serialized_end = 2633 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 - _UPDATENAMESPACEREQUEST._serialized_start = 3237 - _UPDATENAMESPACEREQUEST._serialized_end = 3572 - _UPDATENAMESPACERESPONSE._serialized_start = 3575 - _UPDATENAMESPACERESPONSE._serialized_end = 3866 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 - _SHUTDOWNWORKERREQUEST._serialized_start = 21102 - _SHUTDOWNWORKERREQUEST._serialized_end = 21385 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 - _QUERYWORKFLOWREQUEST._serialized_start = 21414 - _QUERYWORKFLOWREQUEST._serialized_end = 21647 - _QUERYWORKFLOWRESPONSE._serialized_start = 21650 - _QUERYWORKFLOWRESPONSE._serialized_end = 21835 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 - _GETCLUSTERINFOREQUEST._serialized_start = 24160 - _GETCLUSTERINFOREQUEST._serialized_end = 24183 - _GETCLUSTERINFORESPONSE._serialized_start = 24186 - _GETCLUSTERINFORESPONSE._serialized_end = 24651 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 - _GETSYSTEMINFOREQUEST._serialized_start = 24653 - _GETSYSTEMINFOREQUEST._serialized_end = 24675 - _GETSYSTEMINFORESPONSE._serialized_start = 24678 - _GETSYSTEMINFORESPONSE._serialized_end = 25255 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 - _CREATESCHEDULEREQUEST._serialized_start = 25595 - _CREATESCHEDULEREQUEST._serialized_end = 25927 - _CREATESCHEDULERESPONSE._serialized_start = 25929 - _CREATESCHEDULERESPONSE._serialized_end = 25977 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 - _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 - _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 - _UPDATESCHEDULEREQUEST._serialized_start = 26321 - _UPDATESCHEDULEREQUEST._serialized_end = 26613 - _UPDATESCHEDULERESPONSE._serialized_start = 26615 - _UPDATESCHEDULERESPONSE._serialized_end = 26639 - _PATCHSCHEDULEREQUEST._serialized_start = 26642 - _PATCHSCHEDULEREQUEST._serialized_end = 26798 - _PATCHSCHEDULERESPONSE._serialized_start = 26800 - _PATCHSCHEDULERESPONSE._serialized_end = 26823 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 - _DELETESCHEDULEREQUEST._serialized_start = 27081 - _DELETESCHEDULEREQUEST._serialized_end = 27162 - _DELETESCHEDULERESPONSE._serialized_start = 27164 - _DELETESCHEDULERESPONSE._serialized_end = 27188 - _LISTSCHEDULESREQUEST._serialized_start = 27190 - _LISTSCHEDULESREQUEST._serialized_end = 27298 - _LISTSCHEDULESRESPONSE._serialized_start = 27300 - _LISTSCHEDULESRESPONSE._serialized_end = 27412 - _COUNTSCHEDULESREQUEST._serialized_start = 27414 - _COUNTSCHEDULESREQUEST._serialized_end = 27471 - _COUNTSCHEDULESRESPONSE._serialized_start = 27474 - _COUNTSCHEDULESRESPONSE._serialized_end = 27693 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 + _REGISTERNAMESPACEREQUEST._serialized_start = 1730 + _REGISTERNAMESPACEREQUEST._serialized_end = 2378 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2335 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2378 + _REGISTERNAMESPACERESPONSE._serialized_start = 2380 + _REGISTERNAMESPACERESPONSE._serialized_end = 2407 + _LISTNAMESPACESREQUEST._serialized_start = 2410 + _LISTNAMESPACESREQUEST._serialized_end = 2547 + _LISTNAMESPACESRESPONSE._serialized_start = 2550 + _LISTNAMESPACESRESPONSE._serialized_end = 2679 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2681 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2764 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2767 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3280 + _UPDATENAMESPACEREQUEST._serialized_start = 3283 + _UPDATENAMESPACEREQUEST._serialized_end = 3618 + _UPDATENAMESPACERESPONSE._serialized_start = 3621 + _UPDATENAMESPACERESPONSE._serialized_end = 3912 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3914 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3984 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3986 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4014 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4017 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5634 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5637 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5935 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5938 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6236 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6239 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6425 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6428 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6604 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6606 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6726 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6729 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7169 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7172 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8319 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8235 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8319 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8322 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9660 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9494 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9589 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9591 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9660 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9663 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9908 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9911 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10436 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10438 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10473 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10476 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10962 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10965 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12146 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12149 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12314 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12316 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12428 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12431 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12638 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12640 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12756 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12759 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13141 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13143 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13181 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13184 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13391 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13393 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13435 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13438 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13947 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13949 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14036 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14039 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14373 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14375 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14466 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14469 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14851 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14853 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14890 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14893 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15181 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15183 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15224 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15227 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15487 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15489 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15529 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15532 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15882 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15884 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15961 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15964 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17303 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17306 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17464 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17467 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17916 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17918 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17966 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17969 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18256 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18258 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18294 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18296 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18418 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18420 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18453 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18456 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18785 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18788 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18918 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18921 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19315 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19318 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19450 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19452 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19561 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19563 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19689 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19691 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19808 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19811 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19945 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19947 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 20056 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20058 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20184 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20186 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20252 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20255 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20492 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20404 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20492 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20494 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20522 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20525 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20726 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20642 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20726 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20729 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 21090 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 21092 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 21127 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 21129 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21239 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21241 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21271 + _SHUTDOWNWORKERREQUEST._serialized_start = 21274 + _SHUTDOWNWORKERREQUEST._serialized_end = 21557 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21559 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21583 + _QUERYWORKFLOWREQUEST._serialized_start = 21586 + _QUERYWORKFLOWREQUEST._serialized_end = 21819 + _QUERYWORKFLOWRESPONSE._serialized_start = 21822 + _QUERYWORKFLOWRESPONSE._serialized_end = 22007 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 22009 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 22124 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 22127 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22792 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22795 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23323 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23326 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24330 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 24010 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 24110 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 24112 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24228 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24230 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24330 + _GETCLUSTERINFOREQUEST._serialized_start = 24332 + _GETCLUSTERINFOREQUEST._serialized_end = 24355 + _GETCLUSTERINFORESPONSE._serialized_start = 24358 + _GETCLUSTERINFORESPONSE._serialized_end = 24823 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24768 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24823 + _GETSYSTEMINFOREQUEST._serialized_start = 24825 + _GETSYSTEMINFOREQUEST._serialized_end = 24847 + _GETSYSTEMINFORESPONSE._serialized_start = 24850 + _GETSYSTEMINFORESPONSE._serialized_end = 25427 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24991 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25427 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25429 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25538 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25541 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25764 + _CREATESCHEDULEREQUEST._serialized_start = 25767 + _CREATESCHEDULEREQUEST._serialized_end = 26099 + _CREATESCHEDULERESPONSE._serialized_start = 26101 + _CREATESCHEDULERESPONSE._serialized_end = 26149 + _DESCRIBESCHEDULEREQUEST._serialized_start = 26151 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26216 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26219 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26490 + _UPDATESCHEDULEREQUEST._serialized_start = 26493 + _UPDATESCHEDULEREQUEST._serialized_end = 26785 + _UPDATESCHEDULERESPONSE._serialized_start = 26787 + _UPDATESCHEDULERESPONSE._serialized_end = 26811 + _PATCHSCHEDULEREQUEST._serialized_start = 26814 + _PATCHSCHEDULEREQUEST._serialized_end = 26970 + _PATCHSCHEDULERESPONSE._serialized_start = 26972 + _PATCHSCHEDULERESPONSE._serialized_end = 26995 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26998 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 27166 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 27168 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27251 + _DELETESCHEDULEREQUEST._serialized_start = 27253 + _DELETESCHEDULEREQUEST._serialized_end = 27334 + _DELETESCHEDULERESPONSE._serialized_start = 27336 + _DELETESCHEDULERESPONSE._serialized_end = 27360 + _LISTSCHEDULESREQUEST._serialized_start = 27362 + _LISTSCHEDULESREQUEST._serialized_end = 27470 + _LISTSCHEDULESRESPONSE._serialized_start = 27472 + _LISTSCHEDULESRESPONSE._serialized_end = 27584 + _COUNTSCHEDULESREQUEST._serialized_start = 27586 + _COUNTSCHEDULESREQUEST._serialized_end = 27643 + _COUNTSCHEDULESRESPONSE._serialized_start = 27646 + _COUNTSCHEDULESRESPONSE._serialized_end = 27865 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20404 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20492 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27868 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28514 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28315 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28254 + 28426 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28428 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28501 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28516 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28580 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28582 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28677 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28679 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28795 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28798 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30515 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29850 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29791 + 29963 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29966 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29923 + 30095 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 30097 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29989 + 30161 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 - _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 - _PAUSEACTIVITYREQUEST._serialized_start = 37249 - _PAUSEACTIVITYREQUEST._serialized_end = 37448 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 - _PAUSEACTIVITYRESPONSE._serialized_start = 37636 - _PAUSEACTIVITYRESPONSE._serialized_end = 37659 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 - _RESETACTIVITYREQUEST._serialized_start = 38318 - _RESETACTIVITYREQUEST._serialized_end = 38625 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 - _RESETACTIVITYRESPONSE._serialized_start = 38920 - _RESETACTIVITYRESPONSE._serialized_end = 38943 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30163 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30269 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30271 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30381 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30383 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30445 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30447 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30502 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30518 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30770 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30772 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30844 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30847 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 31096 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 31099 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31255 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31257 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31371 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31374 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31635 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31638 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31897 + _STARTBATCHOPERATIONREQUEST._serialized_start = 31900 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33266 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33268 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33297 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33299 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33395 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33397 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33425 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33427 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33493 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33496 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33968 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 33970 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 34061 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 34063 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34184 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34187 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34372 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34375 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34594 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34597 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 35013 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 35016 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35370 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35373 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35540 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35542 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35577 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35580 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35800 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35802 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35834 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35837 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36209 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 36003 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36209 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36212 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36544 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36338 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36544 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36547 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36883 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36886 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37205 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37207 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37307 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37309 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37418 + _PAUSEACTIVITYREQUEST._serialized_start = 37421 + _PAUSEACTIVITYREQUEST._serialized_end = 37620 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37623 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37806 + _PAUSEACTIVITYRESPONSE._serialized_start = 37808 + _PAUSEACTIVITYRESPONSE._serialized_end = 37831 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37833 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37865 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37868 + _UNPAUSEACTIVITYREQUEST._serialized_end = 38148 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38151 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38424 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38426 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38451 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38453 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38487 + _RESETACTIVITYREQUEST._serialized_start = 38490 + _RESETACTIVITYREQUEST._serialized_end = 38797 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38800 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 39090 + _RESETACTIVITYRESPONSE._serialized_start = 39092 + _RESETACTIVITYRESPONSE._serialized_end = 39115 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 39117 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 39149 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 39152 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39436 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39439 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39616 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39618 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39724 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39726 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39823 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39826 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 40020 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 40023 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40675 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40284 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40675 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 24010 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 24110 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40677 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40754 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40757 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40897 + _LISTDEPLOYMENTSREQUEST._serialized_start = 40899 + _LISTDEPLOYMENTSREQUEST._serialized_end = 41007 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 41009 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 41128 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 41131 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41336 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41339 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41524 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41527 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41756 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41759 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41950 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41953 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42202 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42205 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42429 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42431 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42544 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42546 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42602 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42604 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42697 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42700 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43371 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42875 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43371 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43374 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43614 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43616 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43655 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43658 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43858 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43860 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43899 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43901 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43994 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43996 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 44028 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44031 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44547 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44424 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44547 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44549 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44601 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44604 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45104 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44424 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44547 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45106 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45160 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 45163 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45581 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45496 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45409 + 45581 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 - _LISTWORKERSREQUEST._serialized_start = 47493 - _LISTWORKERSREQUEST._serialized_end = 47623 - _LISTWORKERSRESPONSE._serialized_start = 47626 - _LISTWORKERSRESPONSE._serialized_end = 47791 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45583 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45693 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45696 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45885 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45887 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45986 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45988 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 46057 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 46059 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 46166 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 46168 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46281 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46284 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46511 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46514 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46694 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46696 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46791 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46793 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46858 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46860 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46941 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 46943 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 47006 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 47008 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 47036 + _LISTWORKFLOWRULESREQUEST._serialized_start = 47038 + _LISTWORKFLOWRULESREQUEST._serialized_end = 47108 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 47110 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47214 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47217 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47423 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47425 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47471 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47474 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47629 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47631 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47662 + _LISTWORKERSREQUEST._serialized_start = 47665 + _LISTWORKERSREQUEST._serialized_end = 47795 + _LISTWORKERSRESPONSE._serialized_start = 47798 + _LISTWORKERSRESPONSE._serialized_end = 47963 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47966 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48691 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48533 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48624 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48454 + 48626 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48519 + 48691 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 - _DESCRIBEWORKERREQUEST._serialized_start = 49233 - _DESCRIBEWORKERREQUEST._serialized_end = 49304 - _DESCRIBEWORKERRESPONSE._serialized_start = 49306 - _DESCRIBEWORKERRESPONSE._serialized_end = 49387 - _COUNTWORKERSREQUEST._serialized_start = 49389 - _COUNTWORKERSREQUEST._serialized_end = 49476 - _COUNTWORKERSRESPONSE._serialized_start = 49478 - _COUNTWORKERSRESPONSE._serialized_end = 49515 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48693 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48784 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48787 + _FETCHWORKERCONFIGREQUEST._serialized_end = 48945 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 48947 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 49032 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 49035 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49301 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49303 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49403 + _DESCRIBEWORKERREQUEST._serialized_start = 49405 + _DESCRIBEWORKERREQUEST._serialized_end = 49476 + _DESCRIBEWORKERRESPONSE._serialized_start = 49478 + _DESCRIBEWORKERRESPONSE._serialized_end = 49559 + _COUNTWORKERSREQUEST._serialized_start = 49561 + _COUNTWORKERSREQUEST._serialized_end = 49648 + _COUNTWORKERSRESPONSE._serialized_start = 49650 + _COUNTWORKERSRESPONSE._serialized_end = 49687 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49690 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49831 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49833 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49865 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49868 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 50011 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 50013 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 50047 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 50050 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51227 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51229 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51338 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51341 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51569 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51572 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51888 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51890 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51976 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51978 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 52094 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 52096 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52205 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52208 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52338 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52341 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53379 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 53329 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53379 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53381 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53452 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53455 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53625 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53628 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54015 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54018 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54179 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54182 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54443 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54445 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54560 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54563 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54702 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54704 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54770 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54773 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 55010 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20404 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20492 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55012 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55084 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55087 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55336 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20404 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20492 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 55339 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55488 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55490 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55530 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55533 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55678 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55680 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55716 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55718 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55806 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55808 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55841 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55844 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56000 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56002 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56048 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56051 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56203 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56205 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56247 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56249 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56344 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56346 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56385 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 56388 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56545 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56548 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56780 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index e66c90384..ed7cb2987 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -38,6 +38,7 @@ import temporalio.api.filter.v1.message_pb2 import temporalio.api.history.v1.message_pb2 import temporalio.api.namespace.v1.message_pb2 import temporalio.api.nexus.v1.message_pb2 +import temporalio.api.nexusoperation.v1.message_pb2 import temporalio.api.protocol.v1.message_pb2 import temporalio.api.query.v1.message_pb2 import temporalio.api.replication.v1.message_pb2 @@ -2712,6 +2713,7 @@ class RespondActivityTaskFailedRequest(google.protobuf.message.Message): WORKER_VERSION_FIELD_NUMBER: builtins.int DEPLOYMENT_FIELD_NUMBER: builtins.int DEPLOYMENT_OPTIONS_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int task_token: builtins.bytes """The task token as received in `PollActivityTaskQueueResponse`""" @property @@ -2743,6 +2745,8 @@ class RespondActivityTaskFailedRequest(google.protobuf.message.Message): self, ) -> temporalio.api.deployment.v1.message_pb2.WorkerDeploymentOptions: """Worker deployment options that user has set in the worker.""" + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType + """Why did the task fail? When unset, the failure is treated as an unspecified activity failure.""" def __init__( self, *, @@ -2758,6 +2762,7 @@ class RespondActivityTaskFailedRequest(google.protobuf.message.Message): deployment: temporalio.api.deployment.v1.message_pb2.Deployment | None = ..., deployment_options: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentOptions | None = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType = ..., ) -> None: ... def HasField( self, @@ -2777,6 +2782,8 @@ class RespondActivityTaskFailedRequest(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "cause", + b"cause", "deployment", b"deployment", "deployment_options", @@ -2838,6 +2845,7 @@ class RespondActivityTaskFailedByIdRequest(google.protobuf.message.Message): IDENTITY_FIELD_NUMBER: builtins.int LAST_HEARTBEAT_DETAILS_FIELD_NUMBER: builtins.int RESOURCE_ID_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int namespace: builtins.str """Namespace of the workflow which scheduled this activity""" workflow_id: builtins.str @@ -2858,6 +2866,10 @@ class RespondActivityTaskFailedByIdRequest(google.protobuf.message.Message): """Additional details to be stored as last activity heartbeat""" resource_id: builtins.str """Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities.""" + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType + """Why did the activity task fail? Optional; when unset the failure is treated as a normal + activity failure. See the type's doc for more. + """ def __init__( self, *, @@ -2870,6 +2882,7 @@ class RespondActivityTaskFailedByIdRequest(google.protobuf.message.Message): last_heartbeat_details: temporalio.api.common.v1.message_pb2.Payloads | None = ..., resource_id: builtins.str = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType = ..., ) -> None: ... def HasField( self, @@ -2882,6 +2895,8 @@ class RespondActivityTaskFailedByIdRequest(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "activity_id", b"activity_id", + "cause", + b"cause", "failure", b"failure", "identity", @@ -12560,9 +12575,12 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): INPUT_FIELD_NUMBER: builtins.int ID_REUSE_POLICY_FIELD_NUMBER: builtins.int ID_CONFLICT_POLICY_FIELD_NUMBER: builtins.int + ON_CONFLICT_OPTIONS_FIELD_NUMBER: builtins.int SEARCH_ATTRIBUTES_FIELD_NUMBER: builtins.int NEXUS_HEADER_FIELD_NUMBER: builtins.int USER_METADATA_FIELD_NUMBER: builtins.int + COMPLETION_CALLBACKS_FIELD_NUMBER: builtins.int + LINKS_FIELD_NUMBER: builtins.int namespace: builtins.str identity: builtins.str """The identity of the client who initiated this request.""" @@ -12623,6 +12641,14 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): The default policy is NEXUS_OPERATION_ID_CONFLICT_POLICY_FAIL. """ @property + def on_conflict_options( + self, + ) -> temporalio.api.nexusoperation.v1.message_pb2.OnConflictOptions: + """Defines actions to be done to the existing running standalone Nexus when the conflict policy + NEXUS_OPERATION_ID_CONFLICT_POLICY_USE_EXISTING is used. If not set or set to a empty object + (all options with default value), it will not modify the running operation. + """ + @property def search_attributes( self, ) -> temporalio.api.common.v1.message_pb2.SearchAttributes: @@ -12641,6 +12667,22 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """Metadata for use by user interfaces to display the fixed as-of-start summary and details of the operation.""" + @property + def completion_callbacks( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.common.v1.message_pb2.Callback + ]: + """Completion callbacks to be invoked once the Nexus operation reaches a terminal state.""" + @property + def links( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.common.v1.message_pb2.Link + ]: + """Links to be associated with the Nexus operation. Callbacks may also have associated links; + links already included with a callback should not be duplicated here. + """ def __init__( self, *, @@ -12657,17 +12699,27 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): input: temporalio.api.common.v1.message_pb2.Payload | None = ..., id_reuse_policy: temporalio.api.enums.v1.nexus_pb2.NexusOperationIdReusePolicy.ValueType = ..., id_conflict_policy: temporalio.api.enums.v1.nexus_pb2.NexusOperationIdConflictPolicy.ValueType = ..., + on_conflict_options: temporalio.api.nexusoperation.v1.message_pb2.OnConflictOptions + | None = ..., search_attributes: temporalio.api.common.v1.message_pb2.SearchAttributes | None = ..., nexus_header: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., user_metadata: temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata | None = ..., + completion_callbacks: collections.abc.Iterable[ + temporalio.api.common.v1.message_pb2.Callback + ] + | None = ..., + links: collections.abc.Iterable[temporalio.api.common.v1.message_pb2.Link] + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ "input", b"input", + "on_conflict_options", + b"on_conflict_options", "schedule_to_close_timeout", b"schedule_to_close_timeout", "schedule_to_start_timeout", @@ -12683,6 +12735,8 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "completion_callbacks", + b"completion_callbacks", "endpoint", b"endpoint", "id_conflict_policy", @@ -12693,10 +12747,14 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): b"identity", "input", b"input", + "links", + b"links", "namespace", b"namespace", "nexus_header", b"nexus_header", + "on_conflict_options", + b"on_conflict_options", "operation", b"operation", "operation_id", @@ -12808,6 +12866,7 @@ class DescribeNexusOperationExecutionResponse(google.protobuf.message.Message): RESULT_FIELD_NUMBER: builtins.int FAILURE_FIELD_NUMBER: builtins.int LONG_POLL_TOKEN_FIELD_NUMBER: builtins.int + COMPLETION_CALLBACKS_FIELD_NUMBER: builtins.int run_id: builtins.str """The run ID of the operation, useful when run_id was not specified in the request.""" @property @@ -12826,6 +12885,15 @@ class DescribeNexusOperationExecutionResponse(google.protobuf.message.Message): """The failure if the operation completed unsuccessfully.""" long_poll_token: builtins.bytes """Token for follow-on long-poll requests. Absent only if the operation is complete.""" + @property + def completion_callbacks( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.nexusoperation.v1.message_pb2.CallbackInfo + ]: + """Completion callbacks to be invoked once the Nexus operation reaches a terminal state. + They will remain in the CALLBACK_STATE_STANDBY state until the Nexus operation is finished. + """ def __init__( self, *, @@ -12836,6 +12904,10 @@ class DescribeNexusOperationExecutionResponse(google.protobuf.message.Message): result: temporalio.api.common.v1.message_pb2.Payload | None = ..., failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., long_poll_token: builtins.bytes = ..., + completion_callbacks: collections.abc.Iterable[ + temporalio.api.nexusoperation.v1.message_pb2.CallbackInfo + ] + | None = ..., ) -> None: ... def HasField( self, @@ -12855,6 +12927,8 @@ class DescribeNexusOperationExecutionResponse(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "completion_callbacks", + b"completion_callbacks", "failure", b"failure", "info", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 7f6d3e782..cd62e8b47 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -21,6 +21,9 @@ from temporalio.api.common.v1 import ( message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, ) +from temporalio.api.enums.v1 import ( + failed_cause_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_failed__cause__pb2, +) from temporalio.api.enums.v1 import ( workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, ) @@ -47,7 +50,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb5\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"\xb1\x01\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12P\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause"\xb8\x01\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12P\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) @@ -391,58 +394,58 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 570 - _WORKFLOWACTIVATION._serialized_end = 1116 - _WORKFLOWACTIVATIONJOB._serialized_start = 1119 - _WORKFLOWACTIVATIONJOB._serialized_end = 2580 - _DELIVERSTREAMRECORDS._serialized_start = 2583 - _DELIVERSTREAMRECORDS._serialized_end = 2719 - _INITIALIZEWORKFLOW._serialized_start = 2722 - _INITIALIZEWORKFLOW._serialized_end = 4126 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _FIRETIMER._serialized_start = 4128 - _FIRETIMER._serialized_end = 4152 - _RESOLVEACTIVITY._serialized_start = 4154 - _RESOLVEACTIVITY._serialized_end = 4263 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4266 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4603 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4605 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4664 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4667 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4833 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4835 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4931 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4933 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5038 - _UPDATERANDOMSEED._serialized_start = 5040 - _UPDATERANDOMSEED._serialized_end = 5083 - _QUERYWORKFLOW._serialized_start = 5086 - _QUERYWORKFLOW._serialized_end = 5346 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _CANCELWORKFLOW._serialized_start = 5348 - _CANCELWORKFLOW._serialized_end = 5380 - _SIGNALWORKFLOW._serialized_start = 5383 - _SIGNALWORKFLOW._serialized_end = 5672 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4047 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4126 - _NOTIFYHASPATCH._serialized_start = 5674 - _NOTIFYHASPATCH._serialized_end = 5708 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5710 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5805 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5807 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5909 - _DOUPDATE._serialized_start = 5912 - _DOUPDATE._serialized_end = 6243 - _DOUPDATE_HEADERSENTRY._serialized_start = 4047 - _DOUPDATE_HEADERSENTRY._serialized_end = 4126 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6246 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6400 - _RESOLVENEXUSOPERATION._serialized_start = 6402 - _RESOLVENEXUSOPERATION._serialized_end = 6491 - _REMOVEFROMCACHE._serialized_start = 6494 - _REMOVEFROMCACHE._serialized_end = 6846 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6608 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6846 + _WORKFLOWACTIVATION._serialized_start = 612 + _WORKFLOWACTIVATION._serialized_end = 1158 + _WORKFLOWACTIVATIONJOB._serialized_start = 1161 + _WORKFLOWACTIVATIONJOB._serialized_end = 2622 + _DELIVERSTREAMRECORDS._serialized_start = 2625 + _DELIVERSTREAMRECORDS._serialized_end = 2761 + _INITIALIZEWORKFLOW._serialized_start = 2764 + _INITIALIZEWORKFLOW._serialized_end = 4168 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4089 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4168 + _FIRETIMER._serialized_start = 4170 + _FIRETIMER._serialized_end = 4194 + _RESOLVEACTIVITY._serialized_start = 4196 + _RESOLVEACTIVITY._serialized_end = 4305 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4308 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4645 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4647 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4706 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4709 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4875 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4877 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4973 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4975 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5080 + _UPDATERANDOMSEED._serialized_start = 5082 + _UPDATERANDOMSEED._serialized_end = 5125 + _QUERYWORKFLOW._serialized_start = 5128 + _QUERYWORKFLOW._serialized_end = 5388 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4089 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4168 + _CANCELWORKFLOW._serialized_start = 5390 + _CANCELWORKFLOW._serialized_end = 5422 + _SIGNALWORKFLOW._serialized_start = 5425 + _SIGNALWORKFLOW._serialized_end = 5714 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4089 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4168 + _NOTIFYHASPATCH._serialized_start = 5716 + _NOTIFYHASPATCH._serialized_end = 5750 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5753 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5930 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5933 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 6117 + _DOUPDATE._serialized_start = 6120 + _DOUPDATE._serialized_end = 6451 + _DOUPDATE_HEADERSENTRY._serialized_start = 4089 + _DOUPDATE_HEADERSENTRY._serialized_end = 4168 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6454 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6608 + _RESOLVENEXUSOPERATION._serialized_start = 6610 + _RESOLVENEXUSOPERATION._serialized_end = 6699 + _REMOVEFROMCACHE._serialized_start = 6702 + _REMOVEFROMCACHE._serialized_end = 7054 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6816 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 7054 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index ac9ac13f7..430b86602 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,6 +19,7 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.enums.v1.failed_cause_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.stream.v1.message_pb2 @@ -1255,6 +1256,7 @@ class ResolveSignalExternalWorkflow(google.protobuf.message.Message): SEQ_FIELD_NUMBER: builtins.int FAILURE_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int seq: builtins.int """Sequence number as provided by lang in the corresponding SignalExternalWorkflowExecution command @@ -1264,18 +1266,25 @@ class ResolveSignalExternalWorkflow(google.protobuf.message.Message): """If populated, this signal either failed to be sent or was cancelled depending on failure type / info. """ + cause: temporalio.api.enums.v1.failed_cause_pb2.SignalExternalWorkflowExecutionFailedCause.ValueType + """The server-reported cause when the signal failed. Unspecified when the signal succeeded or + was cancelled before being sent. + """ def __init__( self, *, seq: builtins.int = ..., failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.SignalExternalWorkflowExecutionFailedCause.ValueType = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["failure", b"failure"] ) -> builtins.bool: ... def ClearField( self, - field_name: typing_extensions.Literal["failure", b"failure", "seq", b"seq"], + field_name: typing_extensions.Literal[ + "cause", b"cause", "failure", b"failure", "seq", b"seq" + ], ) -> None: ... global___ResolveSignalExternalWorkflow = ResolveSignalExternalWorkflow @@ -1285,27 +1294,31 @@ class ResolveRequestCancelExternalWorkflow(google.protobuf.message.Message): SEQ_FIELD_NUMBER: builtins.int FAILURE_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int seq: builtins.int """Sequence number as provided by lang in the corresponding RequestCancelExternalWorkflowExecution command """ @property def failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: - """If populated, this signal either failed to be sent or was cancelled depending on failure - type / info. - """ + """If populated, the cancellation request failed.""" + cause: temporalio.api.enums.v1.failed_cause_pb2.CancelExternalWorkflowExecutionFailedCause.ValueType + """The server-reported cause when the cancellation request failed.""" def __init__( self, *, seq: builtins.int = ..., failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.CancelExternalWorkflowExecutionFailedCause.ValueType = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["failure", b"failure"] ) -> builtins.bool: ... def ClearField( self, - field_name: typing_extensions.Literal["failure", b"failure", "seq", b"seq"], + field_name: typing_extensions.Literal[ + "cause", b"cause", "failure", b"failure", "seq", b"seq" + ], ) -> None: ... global___ResolveRequestCancelExternalWorkflow = ResolveRequestCancelExternalWorkflow diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 792170b7a..89f3816fa 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"B\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"B\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x93\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12#\n\x1binclude_arguments_in_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -511,8 +511,8 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9030 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9118 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9028 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9116 _WORKFLOWCOMMAND._serialized_start = 556 _WORKFLOWCOMMAND._serialized_end = 2798 _APPENDSTREAMRECORDS._serialized_start = 2800 @@ -528,57 +528,57 @@ _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3826 _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3905 _SCHEDULELOCALACTIVITY._serialized_start = 3908 - _SCHEDULELOCALACTIVITY._serialized_end = 4697 + _SCHEDULELOCALACTIVITY._serialized_end = 4695 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3826 _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3905 - _REQUESTCANCELACTIVITY._serialized_start = 4699 - _REQUESTCANCELACTIVITY._serialized_end = 4735 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4737 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4778 - _QUERYRESULT._serialized_start = 4781 - _QUERYRESULT._serialized_end = 4937 - _QUERYSUCCESS._serialized_start = 4939 - _QUERYSUCCESS._serialized_end = 5004 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 5006 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5082 - _FAILWORKFLOWEXECUTION._serialized_start = 5084 - _FAILWORKFLOWEXECUTION._serialized_end = 5158 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5161 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6075 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5918 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5994 + _REQUESTCANCELACTIVITY._serialized_start = 4697 + _REQUESTCANCELACTIVITY._serialized_end = 4733 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4735 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4776 + _QUERYRESULT._serialized_start = 4779 + _QUERYRESULT._serialized_end = 4935 + _QUERYSUCCESS._serialized_start = 4937 + _QUERYSUCCESS._serialized_end = 5002 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 5004 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5080 + _FAILWORKFLOWEXECUTION._serialized_start = 5082 + _FAILWORKFLOWEXECUTION._serialized_end = 5156 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5159 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6073 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5916 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5992 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 - _CANCELWORKFLOWEXECUTION._serialized_start = 6077 - _CANCELWORKFLOWEXECUTION._serialized_end = 6153 - _SETPATCHMARKER._serialized_start = 6155 - _SETPATCHMARKER._serialized_end = 6209 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6212 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7386 + _CANCELWORKFLOWEXECUTION._serialized_start = 6075 + _CANCELWORKFLOWEXECUTION._serialized_end = 6151 + _SETPATCHMARKER._serialized_start = 6153 + _SETPATCHMARKER._serialized_end = 6207 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6210 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7384 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5918 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5994 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7388 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7462 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7465 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7607 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7610 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8009 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5916 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5992 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7386 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7460 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7463 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7605 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7608 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8007 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 - _CANCELSIGNALWORKFLOW._serialized_start = 8011 - _CANCELSIGNALWORKFLOW._serialized_end = 8046 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8048 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8149 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8151 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8230 - _UPDATERESPONSE._serialized_start = 8233 - _UPDATERESPONSE._serialized_end = 8443 - _SCHEDULENEXUSOPERATION._serialized_start = 8446 - _SCHEDULENEXUSOPERATION._serialized_end = 8984 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8934 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8984 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8986 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9028 + _CANCELSIGNALWORKFLOW._serialized_start = 8009 + _CANCELSIGNALWORKFLOW._serialized_end = 8044 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8046 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8147 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8149 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8228 + _UPDATERESPONSE._serialized_start = 8231 + _UPDATERESPONSE._serialized_end = 8441 + _SCHEDULENEXUSOPERATION._serialized_start = 8444 + _SCHEDULENEXUSOPERATION._serialized_end = 8982 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8932 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8982 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8984 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9026 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 32ad8194a..d388f3b26 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -729,7 +729,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): RETRY_POLICY_FIELD_NUMBER: builtins.int LOCAL_RETRY_THRESHOLD_FIELD_NUMBER: builtins.int CANCELLATION_TYPE_FIELD_NUMBER: builtins.int - INCLUDE_ARGUMENTS_INTO_MARKER_FIELD_NUMBER: builtins.int + INCLUDE_ARGUMENTS_IN_MARKER_FIELD_NUMBER: builtins.int seq: builtins.int """Lang's incremental sequence number, used as the operation identifier""" activity_id: builtins.str @@ -794,7 +794,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): confirmed. Lang should default this to `WAIT_CANCELLATION_COMPLETED`, even though proto will default to `TRY_CANCEL` automatically. """ - include_arguments_into_marker: builtins.bool + include_arguments_in_marker: builtins.bool """If set, the local activity arguments will be included in the resulting marker under the `input` key. This is disabled by default to avoid increasing history size unless the lang SDK explicitly chooses to expose it. @@ -821,7 +821,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., local_retry_threshold: google.protobuf.duration_pb2.Duration | None = ..., cancellation_type: global___ActivityCancellationType.ValueType = ..., - include_arguments_into_marker: builtins.bool = ..., + include_arguments_in_marker: builtins.bool = ..., ) -> None: ... def HasField( self, @@ -855,8 +855,8 @@ class ScheduleLocalActivity(google.protobuf.message.Message): b"cancellation_type", "headers", b"headers", - "include_arguments_into_marker", - b"include_arguments_into_marker", + "include_arguments_in_marker", + b"include_arguments_in_marker", "local_retry_threshold", b"local_retry_threshold", "original_schedule_time", From dab098b0bd17e5a78891b455c36ead8c1f6f332d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:15:29 -0700 Subject: [PATCH 631/831] Refused the new callback link variant like the batch job one. --- temporalio/nexus/_link_conversion.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/temporalio/nexus/_link_conversion.py b/temporalio/nexus/_link_conversion.py index e3ef3988b..138618b2e 100644 --- a/temporalio/nexus/_link_conversion.py +++ b/temporalio/nexus/_link_conversion.py @@ -120,6 +120,9 @@ def temporal_link_to_nexus_link( case "batch_job": raise NotImplementedError("batch_job links are not supported") + case "callback": + raise NotImplementedError("callback links are not supported") + case None: logger.warning("Invalid Temporal link: missing variant") return None From 491193dfdcefc121e5778362411366705f86bd16 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:15:29 -0700 Subject: [PATCH 632/831] Split the unset-kind default into its own gated stream test. --- tests/test_client_stream.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index b6b9a4b7a..80bd8695f 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -6,7 +6,9 @@ TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/test_client_stream.py Skipped otherwise, rather than silently passing against a server that has no -idea what a stream is. +idea what a stream is. ``TEMPORAL_STREAM_SERVER_PREDATES_KIND_DEFAULT=1`` skips +the one case that needs the server to store an unset kind as ``DATA``, for a +branch build older than that rule. """ from __future__ import annotations @@ -119,6 +121,7 @@ async def test_the_record_roundtrips_field_for_field(stream: StreamHandle) -> No sent.producer_id = "model" sent.attempt = 2 sent.sequence = 7 + sent.kind = StreamRecordKind.STREAM_RECORD_KIND_DATA sent.metadata["trace"].CopyFrom(Payload(data=b"abc")) finish = StreamRecord( topic="t", kind=StreamRecordKind.STREAM_RECORD_KIND_FINISH, producer_id="model" @@ -139,6 +142,16 @@ async def test_the_record_roundtrips_field_for_field(stream: StreamHandle) -> No assert not entries[1].record.HasField("body") +@pytest.mark.skipif( + bool(os.environ.get("TEMPORAL_STREAM_SERVER_PREDATES_KIND_DEFAULT")), + reason="the target server stores an unset kind as sent", +) +async def test_an_unset_kind_reads_back_as_data(stream: StreamHandle) -> None: + await stream.append(rec(b"x")) + entries, _ = await stream.read() + assert entries[0].record.kind == StreamRecordKind.STREAM_RECORD_KIND_DATA + + # A closed stream stays readable, which is what removes the shutdown handshake # between producer and consumer. async def test_follow_drains_then_ends_when_the_stream_closes( From 3117bfd31e5888b49ceae41d9c795d3237d5d929 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:22:14 -0700 Subject: [PATCH 633/831] Dropped the server-age gate from the unset-kind stream test. Every native live module needs a server with the record kind rule, so one gate for one case only hid the requirement. --- tests/test_client_stream.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index 80bd8695f..ddd5ae76c 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -6,9 +6,7 @@ TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/test_client_stream.py Skipped otherwise, rather than silently passing against a server that has no -idea what a stream is. ``TEMPORAL_STREAM_SERVER_PREDATES_KIND_DEFAULT=1`` skips -the one case that needs the server to store an unset kind as ``DATA``, for a -branch build older than that rule. +idea what a stream is. """ from __future__ import annotations @@ -142,10 +140,6 @@ async def test_the_record_roundtrips_field_for_field(stream: StreamHandle) -> No assert not entries[1].record.HasField("body") -@pytest.mark.skipif( - bool(os.environ.get("TEMPORAL_STREAM_SERVER_PREDATES_KIND_DEFAULT")), - reason="the target server stores an unset kind as sent", -) async def test_an_unset_kind_reads_back_as_data(stream: StreamHandle) -> None: await stream.append(rec(b"x")) entries, _ = await stream.read() From 506475ac528d607b4ca1c2e48a6e8b5ac74b53d2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:24:40 -0700 Subject: [PATCH 634/831] Repinned Core to the external repairs head. Two code-only fixes: a replacement task for output left buffered behind a commit, and the outstanding-activation breach logged in release builds. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index c713b5e49..2e8455ef5 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit c713b5e49977b9f00485f7c94f2f944f6a295aee +Subproject commit 2e8455ef5212561a8b43987710d63761b598ac11 From c6db4716906d5ba7497c86981fc7acca0de6b76e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:37:23 -0700 Subject: [PATCH 635/831] Said why the Nexus front is not a conformance setup. --- tests/streams/test_streams_conformance.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index fda24684c..061083da6 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -11,6 +11,11 @@ skipped with a reason on a provider whose ``append()`` learns positions at read time. +``NexusStreams`` is deliberately absent from ``SETUPS``. It is a front with no +workflow half (its ``workflow_provider()`` raises), so there is no store for a +host workflow to own; ``test_nexus_provider`` covers it through an endpoint +that fronts a storage provider. + What this file pins down is what a provider owes: producer identity, retry deduplication, positions, supersession, topic addressing, cursor resumption, cursor ownership, and releasing a read the caller stopped early. Every case From a09d0d83f2c6bf2ead9493f5534cc0a9be45b89c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:37:23 -0700 Subject: [PATCH 636/831] Skipped the native conformance setup without a server address. With STREAMS_LIVE=native and no TEMPORAL_ADDRESS the cases reached the environment's own server, which has no stream service, and failed on the wire. --- tests/streams/test_streams_conformance.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 061083da6..346355a05 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -156,11 +156,17 @@ async def host(workflow_id: str) -> None: async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: # The store is a server built from the stream-carrying branch, which the # test environment's own server is not; TEMPORAL_ADDRESS names it. + # Without it the cases would reach a server that has no stream service and + # fail on the wire, which says nothing about the provider. address = os.environ.get("TEMPORAL_ADDRESS") - if address: - client = await Client.connect( - address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + if not address: + pytest.skip( + "STREAMS_LIVE=native needs TEMPORAL_ADDRESS naming a server with the " + "stream service" ) + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) provider = NativeStreams() # Registered once, on the client: the host's worker inherits it and the # cases open handles through client.get_stream_handle. @@ -242,6 +248,15 @@ async def case( yield provider_case +async def test_the_native_setup_skips_without_a_server_address( + monkeypatch: pytest.MonkeyPatch, client: Client +): + monkeypatch.delenv("TEMPORAL_ADDRESS", raising=False) + setup = _native_case(client) + with pytest.raises(pytest.skip.Exception, match="TEMPORAL_ADDRESS"): + await setup.__anext__() + + def new_workflow_id() -> str: # Unique per case, because a storage provider keeps what earlier cases # wrote and the memory provider only happens to forget. From 86a455cfd3c954cd14f003d74c77f806e2223ecb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:41:35 -0700 Subject: [PATCH 637/831] Numbered the Redis producer's records from one. Zero on the wire now says a producer does not number its records, which the union's conformance suite checks on every store. --- temporalio/streams/providers/redis.py | 4 +++- tests/streams/test_redis_replay.py | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 69ac99a03..b16283619 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -551,7 +551,9 @@ def __init__( self._producer_id = producer_id self._attempt = attempt self._converter = client.data_converter.payload_converter - self._sequence = 0 + # One-based, because zero on the wire says the producer does not + # number its records and this one does. + self._sequence = 1 self._last = BEGINNING self._input: Any = None self._output: Any = None diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index a2b716756..c6806e306 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -719,7 +719,7 @@ async def test_a_repeat_under_one_identity_with_other_bytes_writes_neither_key( {"n": 1} ) other = stream.producer(topic=INPUTS, producer_id="model", attempt=1) - with pytest.raises(StreamProducerError, match="sequence 0"): + with pytest.raises(StreamProducerError, match="sequence 1"): await other.append({"n": 99}) # The refusal wrote nothing on either key. assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( @@ -752,13 +752,13 @@ async def test_a_refused_output_half_leaves_the_input_key_untouched( # Claim the output half's first identity with other bytes, which is what a # refusal of that half looks like from the producer's side. await backend._client.hset( - backend._idempotency_key(output_key), "model#1/0", "1-0|" + "0" * 64 + backend._idempotency_key(output_key), "model#1/1", "1-0|" + "0" * 64 ) producer = provider.get_stream_handle(live_client, workflow_id).producer( topic=INPUTS, producer_id="model", attempt=1 ) - with pytest.raises(StreamProducerError, match="sequence 0"): + with pytest.raises(StreamProducerError, match="sequence 1"): await producer.append({"n": 1}) assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( From 5205f73c9f580f3300d8ce0b6b7702c07639b2d4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:57:09 -0700 Subject: [PATCH 638/831] Raced the agent's reader against its generator. A failed attempt writes no FINISH, so awaiting the reader first parked the run forever when the generator ran out of attempts. --- examples/streams/agent.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/examples/streams/agent.py b/examples/streams/agent.py index e6d838bb1..b815c98ee 100644 --- a/examples/streams/agent.py +++ b/examples/streams/agent.py @@ -12,6 +12,7 @@ from __future__ import annotations +import asyncio from dataclasses import dataclass from datetime import timedelta @@ -67,7 +68,6 @@ class Agent: @workflow.run async def run(self, count: int) -> int: """Decide on at most ``count`` inputs, then return how many landed.""" - inputs = workflow.stream_reader(INPUTS) decisions = workflow.stream_writer(DECISIONS) generating = workflow.start_activity( @@ -78,9 +78,31 @@ async def run(self, count: int) -> int: # retrying forever while every attempt streams from the start. retry_policy=RetryPolicy(maximum_attempts=3), ) + consuming = asyncio.create_task(self._consume(count, decisions)) + # Raced rather than awaited in turn: an attempt that fails writes no + # FINISH, so a generator that exhausts its attempts leaves the reader + # waiting forever. Its failure ends the run with its cause instead. + done, _ = await workflow.wait( + [consuming, generating], return_when=asyncio.FIRST_COMPLETED + ) + if generating in done and consuming not in done: + try: + await generating + except BaseException: + consuming.cancel() + raise + seen = await consuming + await generating + + decisions.finish() + return seen + + async def _consume( + self, count: int, decisions: workflow.StreamWriter[Decision] + ) -> int: seen = 0 - async for record in inputs: + async for record in workflow.stream_reader(INPUTS): if record.kind is RecordKind.FINISH: break if record.kind is RecordKind.SUPERSEDED: @@ -100,9 +122,4 @@ async def run(self, count: int) -> int: ) if seen >= count: break - # A generator that exhausted its attempts fails the run with its cause - # here, rather than being forgotten once the loop has what it wanted. - await generating - - decisions.finish() return seen From 471941421700270fd3ae1c71dd0a1e68d3bb558f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:57:09 -0700 Subject: [PATCH 639/831] Closed the backend reads that stop at FINISH. --- examples/streams/path_b_produce.py | 44 +++++++++++++++++------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/examples/streams/path_b_produce.py b/examples/streams/path_b_produce.py index 782a5ffa0..773d0a972 100644 --- a/examples/streams/path_b_produce.py +++ b/examples/streams/path_b_produce.py @@ -23,6 +23,7 @@ from __future__ import annotations import asyncio +import contextlib import uuid from dataclasses import dataclass from datetime import timedelta @@ -117,28 +118,33 @@ async def main() -> None: # A backend consumer keeps the tokens per attempt and drops an # attempt the moment a newer one starts writing. + # Both reads stop at FINISH while the run is still open, so each one + # is closed on the way out rather than left for the collector. tokens: dict[int, list[int]] = {} - async for record in stream.read(topic=INPUTS): - if record.kind is RecordKind.SUPERSEDED: - assert record.supersession is not None - dropped = tokens.pop(record.supersession.previous_attempt, []) - print( - f" attempt {record.supersession.previous_attempt} superseded" - ) - print(f" dropped {dropped}") - continue - if record.kind is RecordKind.FINISH: - print(f" {record.producer_id} attempt {record.attempt} finished") - break - assert record.value is not None - tokens.setdefault(record.attempt, []).append(record.value.n) + async with contextlib.aclosing(stream.read(topic=INPUTS)) as records: + async for record in records: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + attempt = record.supersession.previous_attempt + dropped = tokens.pop(attempt, []) + print(f" attempt {attempt} superseded") + print(f" dropped {dropped}") + continue + if record.kind is RecordKind.FINISH: + print( + f" {record.producer_id} attempt {record.attempt} finished" + ) + break + assert record.value is not None + tokens.setdefault(record.attempt, []).append(record.value.n) print(f"kept {tokens}") - async for note in stream.read(topic=NOTES): - if note.kind is RecordKind.FINISH: - break - assert note.value is not None - print(f" note from {note.producer_id}: {note.value.text}") + async with contextlib.aclosing(stream.read(topic=NOTES)) as notes_read: + async for note in notes_read: + if note.kind is RecordKind.FINISH: + break + assert note.value is not None + print(f" note from {note.producer_id}: {note.value.text}") await handle.signal(Session.close) await handle.result() From dc1fdac2f816ad104594747991ca1bd85e338a41 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:57:09 -0700 Subject: [PATCH 640/831] Named each example file's own topics in the README table. Also awaited the activity producer's append, which is a coroutine. --- examples/streams/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/streams/README.md b/examples/streams/README.md index adb2ae0d7..2e06253f7 100644 --- a/examples/streams/README.md +++ b/examples/streams/README.md @@ -14,12 +14,12 @@ DECISIONS = streams.topic("decisions", Decision) | Path | Who | Call | Example file | |---|---|---|---| -| A: the workflow publishes | workflow code | `workflow.stream_writer(DECISIONS).publish(Decision(...))`, then `.finish()` | `path_a_publish.py` | -| A: a backend follows | any process with a client | `stream = client.get_stream_handle(workflow_id)`, then `stream.read(topic=DECISIONS, after=await stream.latest(topic=DECISIONS))` | `path_a_publish.py` | -| B: an Activity produces | activity code | `activity.stream_handle().producer(topic=INPUTS).append(Token(...))` | `path_b_produce.py` | -| B: a backend produces | any process with a client | `client.get_stream_handle(workflow_id).producer(topic=INPUTS, producer_id=..., attempt=...)` | `path_b_produce.py` | +| A: the workflow publishes | workflow code | `workflow.stream_writer(PROGRESS).publish(Progress(...))`, then `.finish()` | `path_a_publish.py` | +| A: a backend follows | any process with a client | `stream = client.get_stream_handle(workflow_id)`, then `stream.read(topic=PROGRESS, after=await stream.latest(topic=PROGRESS))` | `path_a_publish.py` | +| B: an Activity produces | activity code | `await activity.stream_handle().producer(topic=INPUTS).append(Token(...))` | `path_b_produce.py` | +| B: a backend produces | any process with a client | `client.get_stream_handle(workflow_id).producer(topic=NOTES, producer_id=..., attempt=...)` | `path_b_produce.py` | | B: a backend consumes | any process with a client | `client.get_stream_handle(workflow_id).read(topic=INPUTS)` | `path_b_produce.py` | -| C: the workflow consumes | workflow code | `async for record in workflow.stream_reader(INPUTS)` | `path_c_consume.py` | +| C: the workflow consumes | workflow code | `async for record in workflow.stream_reader(COMMANDS)` | `path_c_consume.py` | A plain string names a topic decided at runtime, with `result_type=` on the call; the examples never need one. From f45c1ed7233b91401c42c2349c78e6cac7f3746a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 25 Sep 2026 20:57:09 -0700 Subject: [PATCH 641/831] Refused the nexus mode without an endpoint as a usage error. --- examples/streams/run.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/streams/run.py b/examples/streams/run.py index 824975c34..a2820b7f1 100644 --- a/examples/streams/run.py +++ b/examples/streams/run.py @@ -58,6 +58,10 @@ async def main() -> None: help="task queue the nexus endpoint routes to", ) args = parser.parse_args() + # Checked before any provider exists, so a missing flag is a usage error + # rather than a traceback with a provider left open. + if args.provider == "nexus" and not args.endpoint: + parser.error("nexus needs --endpoint ") store = args.behind if args.provider == "nexus" else args.provider provider = _setup.make_provider(store, args) From 88aa1b94fa64ac113c145f07ae89c7cded6a965f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 14:45:21 -0700 Subject: [PATCH 642/831] Added a default topic that a stream call reaches by naming none. The server already resolves an unnamed workflow stream to "output", so the SDK uses the same name and a no-topic call on any provider lands on the stream the server would pick. --- temporalio/streams/__init__.py | 11 +++++++++-- temporalio/streams/_provider.py | 21 ++++++++++++++------- temporalio/streams/_topic.py | 21 +++++++++++++++++++-- temporalio/streams/providers/memory.py | 6 +++--- tests/streams/test_streams_conformance.py | 18 ++++++++++++++++++ 5 files changed, 63 insertions(+), 14 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index b76a18ef1..fbb32e3fa 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -34,7 +34,8 @@ application's business. A topic is defined once with :func:`topic`, with the type its records decode to, and that definition is shared by the workflow, its activities and the backend; a plain string names a topic - decided at runtime. + decided at runtime. A call that names no topic addresses the workflow's + default topic, :data:`DEFAULT_TOPIC`. A provider is an object, registered once as a plugin: ``Client.connect(plugins=[provider])``; workers built from that client inherit @@ -86,10 +87,16 @@ StreamRecord, Supersession, ) -from temporalio.streams._topic import StreamTopic, resolve_topic, topic +from temporalio.streams._topic import ( + DEFAULT_TOPIC, + StreamTopic, + resolve_topic, + topic, +) __all__ = [ "BEGINNING", + "DEFAULT_TOPIC", "Cursor", "ReadSource", "RecordKind", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 86a891a62..e14b9faeb 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -109,23 +109,28 @@ def read( @overload def read( - self, *, topic: str, after: Cursor = ..., result_type: type[T] + self, *, topic: str | None = None, after: Cursor = ..., result_type: type[T] ) -> AsyncGenerator[StreamRecord[T], None]: ... @overload def read( - self, *, topic: str, after: Cursor = ..., result_type: None = None + self, + *, + topic: str | None = None, + after: Cursor = ..., + result_type: None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: ... def read( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records on ``topic`` after ``after`` as they arrive. + Without ``topic`` it reads :data:`temporalio.streams.DEFAULT_TOPIC`. ``BEGINNING`` yields everything the topic retains. Any other cursor came from a record a reader saw, and reading resumes just past it, so a reader that stores the last cursor it handled and hands it back @@ -150,9 +155,11 @@ def read( """ ... - async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The cursor of the newest record on ``topic``, or ``BEGINNING`` when empty. + Without ``topic`` it answers for :data:`temporalio.streams.DEFAULT_TOPIC`. + For a reader that wants to follow from now: ``read(after=latest())`` yields only what is published after this call returned, which is how a client that is about to send a message positions itself before @@ -167,17 +174,17 @@ def producer( @overload def producer( - self, *, topic: str, producer_id: str = ..., attempt: int = ... + self, *, topic: str | None = None, producer_id: str = ..., attempt: int = ... ) -> StreamProducer[Any]: ... def producer( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, producer_id: str = "", attempt: int = 0, ) -> StreamProducer[Any]: - """A producer on ``topic``. + """A producer on ``topic``, or on the default topic without one. Inside an activity, leave ``producer_id`` and ``attempt`` unset: the activity's own id and attempt are the right answer, and they are what diff --git a/temporalio/streams/_topic.py b/temporalio/streams/_topic.py index 173291fad..557b9c24a 100644 --- a/temporalio/streams/_topic.py +++ b/temporalio/streams/_topic.py @@ -10,6 +10,10 @@ The wire does not change: a topic is a string on the proto and in every store, and :attr:`temporalio.streams.StreamRecord.topic` is that string. + +Every workflow also has a default topic, :data:`DEFAULT_TOPIC`, which a call +addresses by naming no topic at all. It is an ordinary name, so naming it +explicitly is the same topic, not an error. """ from __future__ import annotations @@ -17,10 +21,20 @@ from dataclasses import dataclass from typing import Any, Generic, TypeVar, overload -__all__ = ["StreamTopic", "resolve_topic", "topic"] +__all__ = ["DEFAULT_TOPIC", "StreamTopic", "resolve_topic", "topic"] T = TypeVar("T") +DEFAULT_TOPIC = "output" +"""The topic a call addresses when it names none. + +The server resolves an unnamed stream of a workflow to this same name, so on +the native provider the default topic is the server's default stream, and a +store with no default of its own holds it under this name. It stays an +ordinary name rather than a reserved one for the same reason the server does +not reserve it: refusing it would make one stream reachable under two rules. +""" + @dataclass(frozen=True) class StreamTopic(Generic[T]): @@ -67,12 +81,13 @@ def topic(name: str, result_type: type | None = None) -> StreamTopic[Any]: def resolve_topic( - topic: str | StreamTopic[Any], result_type: type | None = None + topic: str | StreamTopic[Any] | None = None, result_type: type | None = None ) -> tuple[str, type | None]: """The name and decode hint a call means, from either form of topic. Providers call this once at the top of ``read``, ``latest`` and ``producer``, so a definition and a string are the same to the store. + ``None`` is a call that named no topic, and means :data:`DEFAULT_TOPIC`. Raises: ValueError: A definition was given together with ``result_type``, @@ -85,6 +100,8 @@ def resolve_topic( "result_type= with a definition" ) name, result_type = topic.name, topic.result_type + elif topic is None: + name = DEFAULT_TOPIC else: name = topic if not name: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 93b2a3482..d139cfb51 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -337,7 +337,7 @@ def __init__( def read( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: @@ -406,7 +406,7 @@ async def _closed(self) -> bool: self._run_id is None and status == WorkflowExecutionStatus.CONTINUED_AS_NEW ) - async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The cursor of the newest record on ``topic``, for following from now.""" name, _ = resolve_topic(topic) count = len(self._streams._topic(self._workflow_id, name).records) @@ -415,7 +415,7 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: def producer( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, producer_id: str = "", attempt: int = 0, ) -> MemoryProducer[Any]: diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index b17bbf802..69c838c65 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -33,6 +33,7 @@ from temporalio.common import RawValue from temporalio.streams import ( BEGINNING, + DEFAULT_TOPIC, Cursor, RecordKind, StreamCursorError, @@ -285,6 +286,23 @@ async def test_topics_are_addressed_by_name(case: ProviderCase): assert [(r.topic, r.value) for r in only_b] == [("b", {"n": 2})] +async def test_naming_no_topic_addresses_the_default_topic(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + assert await stream.latest() == BEGINNING + producer = stream.producer(producer_id="model", attempt=1) + await producer.append({"n": 1}) + await stream.producer(topic=OUT, producer_id="model", attempt=1).append({"n": 2}) + + records = await take(stream.read(), 1) + assert [(r.topic, r.value) for r in records] == [(DEFAULT_TOPIC, {"n": 1})] + assert await stream.latest() == records[0].cursor + # The default is an ordinary name, so naming it is the same topic. + named = await take(stream.read(topic=DEFAULT_TOPIC, result_type=dict), 1) + assert [r.value for r in named] == [{"n": 1}] + assert await stream.latest(topic=DEFAULT_TOPIC) == records[0].cursor + + async def test_cursor_resumes_where_it_points(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) From 00f9b2d58a8cac94f750759f8f70e151191159f5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 14:46:33 -0700 Subject: [PATCH 643/831] Let stream_reader() and stream_writer() default to the default topic. A workflow with one stream should not have to invent a topic name for it; with no topic both resolve to DEFAULT_TOPIC and decode as a string-named topic does. --- temporalio/workflow/_streams.py | 25 ++++++++++------- tests/streams/test_streams_workflow.py | 38 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py index 49f06902c..7a545444a 100644 --- a/temporalio/workflow/_streams.py +++ b/temporalio/workflow/_streams.py @@ -196,18 +196,18 @@ def stream_reader(topic: StreamTopic[T], *, after: Cursor = ...) -> StreamReader @overload def stream_reader( - topic: str, *, result_type: type[T], after: Cursor = ... + topic: str | None = None, *, result_type: type[T], after: Cursor = ... ) -> StreamReader[T]: ... @overload def stream_reader( - topic: str, *, result_type: None = None, after: Cursor = ... + topic: str | None = None, *, result_type: None = None, after: Cursor = ... ) -> StreamReader[Any]: ... def stream_reader( - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, *, result_type: type | None = None, after: Cursor = BEGINNING, @@ -216,7 +216,9 @@ def stream_reader( ``topic`` is a :func:`temporalio.streams.topic` definition, which carries the record type, or a plain string with ``result_type=`` for a name - decided at runtime. One subscription per topic per run. A second call + decided at runtime, and without one the reader is on + :data:`temporalio.streams.DEFAULT_TOPIC`, decoded as a string-named topic + is. One subscription per topic per run. A second call for the same topic returns the reader already open on it, so records go to whichever loop pulls first; such a call may pass neither ``after`` nor a different type. Adding a reader on a new topic is a new command, so @@ -225,8 +227,9 @@ def stream_reader( continue-as-new implicitly. Args: - topic: The topic, relative to this workflow's stream. - result_type: The value type for a string-named topic, used as the + topic: The topic, relative to this workflow's stream. Omit it for + the default topic. + result_type: The value type for a string-named or default topic, used as the decode hint. :class:`temporalio.common.RawValue` returns the payload untouched. after: Resume strictly after this record. Honoured on the first @@ -267,11 +270,11 @@ def stream_writer(topic: StreamTopic[T]) -> StreamWriter[T]: ... @overload -def stream_writer(topic: str) -> StreamWriter[Any]: ... +def stream_writer(topic: str | None = None) -> StreamWriter[Any]: ... -def stream_writer(topic: str | StreamTopic[Any]) -> StreamWriter[Any]: - """Publish to ``topic`` of this workflow's stream. +def stream_writer(topic: str | StreamTopic[Any] | None = None) -> StreamWriter[Any]: + """Publish to ``topic`` of this workflow's stream, or to its default topic. Every call returns a new writer, and they all share the run's record of which topics were finished, so ``finish()`` on one is seen by the next. @@ -279,7 +282,9 @@ def stream_writer(topic: str | StreamTopic[Any]) -> StreamWriter[Any]: Args: topic: A :func:`temporalio.streams.topic` definition, whose value type the writer's ``publish`` takes, or a plain string for a name - decided at runtime. Encoding follows each published value. + decided at runtime. Omitted, the writer is on + :data:`temporalio.streams.DEFAULT_TOPIC`. Encoding follows each + published value. Raises: ValueError: ``topic`` is empty. diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index afc0b4cff..f13c13f44 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -25,6 +25,7 @@ from temporalio import workflow from temporalio.client import Client from temporalio.streams import ( + DEFAULT_TOPIC, Cursor, ReadSource, RecordKind, @@ -503,3 +504,40 @@ async def read_everything() -> list[Any]: ("", RecordKind.DATA, {"from": "workflow"}), ("", RecordKind.FINISH, None), ] + + +@workflow.defn +class DefaultTopicEcho: + """Reads one value on its default topic and answers on the same topic.""" + + @workflow.run + async def run(self) -> None: + reader = workflow.stream_reader(result_type=dict) + writer = workflow.stream_writer() + async for value in reader.values(): + writer.publish({"echo": value["n"] * 2}) + reader.close() + writer.finish() + + +async def test_a_workflow_reads_and_writes_its_default_topic( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, DefaultTopicEcho, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(producer_id="client", attempt=1).append({"n": 21}) + handle = await client.start_workflow( + DefaultTopicEcho.run, id=workflow_id, task_queue=worker.task_queue + ) + await handle.result() + + async def read_everything() -> list[Any]: + return [r async for r in stream.read(topic=DEFAULT_TOPIC)] + + records = await asyncio.wait_for(read_everything(), 30) + assert [(r.topic, r.kind, r.value) for r in records] == [ + (DEFAULT_TOPIC, RecordKind.DATA, {"n": 21}), + (DEFAULT_TOPIC, RecordKind.DATA, {"echo": 42}), + (DEFAULT_TOPIC, RecordKind.FINISH, None), + ] From 1466028b344253cc88b9c1af5d90199198cf595e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 14:47:39 -0700 Subject: [PATCH 644/831] Documented the default topic on the stream accessors. Handles from client.get_stream_handle() and activity.stream_handle() reach the same default topic as the workflow side, so the accessor docs and the changelog say so and a test pins it across all three contexts. --- CHANGELOG.md | 4 +- temporalio/activity.py | 7 +++- temporalio/client/_client.py | 5 ++- tests/streams/test_stream_accessors.py | 51 +++++++++++++++++++++++++- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77db8e269..dfd1c61df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,9 @@ to include examples, links to docs, or any other relevant information. `activity.stream_handle()` in an activity, and `client.get_stream_handle()` anywhere a client is held. A topic is a typed definition, `streams.topic("inputs", Token)`, shared by workflow, activity and client - code; a plain string names a topic decided at runtime. The record on the wire + code; a plain string names a topic decided at runtime, and a call that names + no topic addresses the default topic, `streams.DEFAULT_TOPIC` (`"output"`, + the server's default stream name). The record on the wire is `temporal.api.stream.v1.StreamRecord` on every provider. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. diff --git a/temporalio/activity.py b/temporalio/activity.py index 4dec55248..7315c661b 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -308,7 +308,12 @@ def stream_handle( the run the activity belongs to, so a producer opened from it writes onto that run's stream and a read follows that run. Name a ``workflow_id`` to address another workflow; ``run_id`` then pins the handle to one run and - its absence follows the execution chain. See :py:mod:`temporalio.streams`. + its absence follows the execution chain. A ``read``, ``latest`` or + ``producer`` that names no topic addresses the workflow's default topic, + :py:data:`temporalio.streams.DEFAULT_TOPIC`, the one + :py:func:`temporalio.workflow.stream_reader` and + :py:func:`temporalio.workflow.stream_writer` use without a topic. See + :py:mod:`temporalio.streams`. Like :py:func:`client`, this is only available in ``async def`` activities. diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 7cf624242..33fcedf14 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -905,7 +905,10 @@ def get_stream_handle( follows the workflow's execution chain across continue-as-new, with one it is pinned to that run. The provider is the one registered with ``plugins=[provider]`` at :py:meth:`connect`, or passed as - ``stream_provider``. See :py:mod:`temporalio.streams`. + ``stream_provider``. The handle's ``read``, ``latest`` and + ``producer`` take a topic, and without one address the workflow's + default topic, :py:data:`temporalio.streams.DEFAULT_TOPIC`. See + :py:mod:`temporalio.streams`. Args: workflow_id: Workflow ID whose stream to get a handle to. diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py index 1c6af098e..f25381406 100644 --- a/tests/streams/test_stream_accessors.py +++ b/tests/streams/test_stream_accessors.py @@ -19,7 +19,13 @@ from temporalio import activity, workflow from temporalio.client import Client -from temporalio.streams import RecordKind, StreamUnsupportedError, topic +from temporalio.streams import ( + BEGINNING, + DEFAULT_TOPIC, + RecordKind, + StreamUnsupportedError, + topic, +) from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import ActivityEnvironment, WorkflowEnvironment from tests.helpers import new_worker @@ -110,6 +116,49 @@ async def read_everything() -> list[Any]: ] +@activity.defn +async def emit_on_the_default_topic() -> None: + await activity.stream_handle().producer().append({"from": "activity"}) + + +@workflow.defn +class Answers: + """Waits for the activity's record on the default topic and answers there.""" + + @workflow.run + async def run(self) -> None: + reader = workflow.stream_reader(result_type=dict) + await workflow.execute_activity( + emit_on_the_default_topic, start_to_close_timeout=timedelta(seconds=30) + ) + async for value in reader.values(): + workflow.stream_writer().publish({"answer": value["from"]}) + reader.close() + + +async def test_every_accessor_defaults_to_the_same_topic( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker( + registered, Answers, activities=[emit_on_the_default_topic] + ) as worker: + stream = registered.get_stream_handle(workflow_id) + assert await stream.latest() == BEGINNING + await registered.execute_workflow( + Answers.run, id=workflow_id, task_queue=worker.task_queue + ) + + async def read_everything() -> list[Any]: + return [(r.topic, r.value) async for r in stream.read()] + + assert await asyncio.wait_for(read_everything(), 30) == [ + (DEFAULT_TOPIC, {"from": "activity"}), + (DEFAULT_TOPIC, {"answer": "activity"}), + ] + + async def test_get_stream_handle_needs_a_registered_provider(client: Client): with pytest.raises(StreamUnsupportedError, match="plugins="): client.get_stream_handle("wf") From a48b223af43151bf6a3e2ba9b1b558e9d1f865fa Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 14:48:45 -0700 Subject: [PATCH 645/831] Mapped the native default topic onto the server's default stream. The server resolves an unnamed stream to the same name as DEFAULT_TOPIC, so the native handle takes no topic and sends the name explicitly, which keeps a record's topic equal to its stream's name. --- temporalio/streams/providers/native.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index d0026b7ed..78e194c7b 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -6,7 +6,11 @@ transaction that accepts the Workflow Task, subscribes to it by name and reads the ranges the server delivers on its Workflow Tasks; outside code appends and reads through the stream service, and the workflow's records and an outside -producer's land in one log in the order the server accepted them. +producer's land in one log in the order the server accepted them. The default +topic, :data:`temporalio.streams.DEFAULT_TOPIC`, is the server's default +stream: the server resolves an unnamed stream to that same name, so the +provider sends the name explicitly and a record's topic and its stream's name +never differ. A cursor names the run as well as the offset, because an owned stream belongs to one run and a successor's starts over at zero. A handle without a run id @@ -325,7 +329,7 @@ def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: def read( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: @@ -374,7 +378,7 @@ async def _read( return run_id, offset = successor, 0 - async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The cursor of the newest record on ``topic``, naming the run it was read from. An empty topic on the chain's first run is the beginning of the @@ -398,7 +402,7 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: def producer( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, producer_id: str = "", attempt: int = 0, ) -> NativeProducer[Any]: From 7668b1c18ceb5295564a572366a156f11ef0850f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 14:52:03 -0700 Subject: [PATCH 646/831] Gave the union's stream providers the default topic. Redis, Workflow Streams and the Nexus front store the default topic under DEFAULT_TOPIC like any name, and a workflow-half case shows each storage provider's workflow and outside callers meeting on it. --- temporalio/streams/providers/nexus.py | 6 +-- temporalio/streams/providers/redis.py | 6 +-- .../streams/providers/workflow_streams.py | 6 +-- tests/streams/test_streams_conformance.py | 52 +++++++++++++++++-- 4 files changed, 56 insertions(+), 14 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 84e94c551..2d6bab005 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -822,7 +822,7 @@ def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: def read( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: @@ -881,7 +881,7 @@ async def _read( if answer.done: return - async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The newest position on ``topic`` behind the endpoint, for following from now.""" topic, _ = resolve_topic(topic) answer = await self._front.invoke( @@ -901,7 +901,7 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: def producer( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, producer_id: str = "", attempt: int = 0, ) -> NexusProducer[Any]: diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index b16283619..df41b8c11 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -760,7 +760,7 @@ def __init__( def read( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: @@ -893,7 +893,7 @@ async def _closed(self) -> bool: # is not the end unless the handle was pinned to it. return not (self._run_id is None and status in _STILL_CONSUMING) - async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The cursor of the newest committed record on ``topic``, for following from now. ``BEGINNING`` when the topic holds no committed record, which a topic whose @@ -918,7 +918,7 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: def producer( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, producer_id: str = "", attempt: int = 0, ) -> RedisProducer[Any]: diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 20e6cc526..ac83aa965 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -488,7 +488,7 @@ def __init__( def read( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: @@ -725,7 +725,7 @@ async def _tail( ] return items, wire["next_offset"], bool(wire["more_ready"]) - async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The newest position holding a record on ``topic``. The log is one per run, so the cursor names the run it was read from: @@ -770,7 +770,7 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: def producer( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer[Any]: diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index a00e06a41..04d755206 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -81,6 +81,8 @@ class ProviderCase: """``append()`` compares a repeat's content with what it already holds.""" host: Callable[[str], Awaitable[None]] | None = None """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" + task_queue: str | None = None + """Where the setup's worker runs the workflows below, when it has one.""" async def open( self, workflow_id: str, *, run_id: str | None = None @@ -121,6 +123,18 @@ async def run(self) -> None: await workflow.wait_condition(lambda: self._released) +@workflow.defn +class DefaultTopicAnswer: + """Reads one value on its default topic and answers on the same topic.""" + + @workflow.run + async def run(self) -> None: + reader = workflow.stream_reader(result_type=dict) + async for value in reader.values(): + workflow.stream_writer().publish({"answer": value["n"] * 2}) + reader.close() + + async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: # No STREAMS_LIVE gate: the store is the workflow's own History, which the # test environment's server provides. @@ -131,7 +145,7 @@ async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: config["plugins"] = [provider] client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost) as worker: + async with new_worker(client, StreamHost, DefaultTopicAnswer) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: @@ -149,6 +163,7 @@ async def host(workflow_id: str) -> None: # the provider. detects_divergent_retries=False, host=host, + task_queue=worker.task_queue, ) for handle in hosts.values(): await handle.terminate() @@ -175,7 +190,7 @@ async def _native_case(client: Client) -> AsyncIterator[ProviderCase]: config["plugins"] = [provider] client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost) as worker: + async with new_worker(client, StreamHost, DefaultTopicAnswer) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: @@ -183,7 +198,9 @@ async def host(workflow_id: str) -> None: StreamHost.run, id=workflow_id, task_queue=worker.task_queue ) - yield ProviderCase("native", provider, client, host=host) + yield ProviderCase( + "native", provider, client, host=host, task_queue=worker.task_queue + ) for handle in hosts.values(): await handle.terminate() await provider.close() @@ -209,7 +226,7 @@ async def _redis_case(client: Client) -> AsyncIterator[ProviderCase]: config["plugins"] = [provider] client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost) as worker: + async with new_worker(client, StreamHost, DefaultTopicAnswer) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: @@ -217,7 +234,9 @@ async def host(workflow_id: str) -> None: StreamHost.run, id=workflow_id, task_queue=worker.task_queue ) - yield ProviderCase("redis", provider, client, host=host) + yield ProviderCase( + "redis", provider, client, host=host, task_queue=worker.task_queue + ) for handle in hosts.values(): await handle.terminate() await provider.close() @@ -458,6 +477,29 @@ async def test_naming_no_topic_addresses_the_default_topic(case: ProviderCase): assert await stream.latest(topic=DEFAULT_TOPIC) == records[0].cursor +async def test_a_workflow_answers_on_its_default_topic(case: ProviderCase): + if case.client is None or case.task_queue is None: + pytest.skip( + f"the {case.name} setup runs no worker; test_streams_workflow covers " + "its workflow half" + ) + workflow_id = new_workflow_id() + handle = await case.client.start_workflow( + DefaultTopicAnswer.run, id=workflow_id, task_queue=case.task_queue + ) + stream = case.client.get_stream_handle(workflow_id) + await stream.producer(producer_id="client", attempt=1).append({"n": 21}) + await handle.result() + + # The outside producer and the workflow, each naming no topic, meet on + # one topic that a reader naming none sees in order. + records = await take(stream.read(), 2, timeout=30.0) + assert [(r.topic, r.producer_id, r.value) for r in records] == [ + (DEFAULT_TOPIC, "client", {"n": 21}), + (DEFAULT_TOPIC, "", {"answer": 42}), + ] + + async def test_cursor_resumes_where_it_points(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) From 92c4b8c24c1ca00c854538ebf44cd25b71d3b4b2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 15:55:53 -0700 Subject: [PATCH 647/831] Let activities own streams and resolve stream_handle() by a static rule. A standalone activity now reaches its own stream, which used to raise, and scope="activity" gives a workflow's activity its own streams without changing what a bare call reaches. The rule never probes, because a stream is created by its first write and probing would split attempts across two streams. --- temporalio/activity.py | 89 ++++++++++++++++++------ temporalio/client/_client.py | 33 ++++++--- temporalio/streams/__init__.py | 9 ++- temporalio/streams/_provider.py | 32 ++++++++- temporalio/streams/providers/memory.py | 93 ++++++++++++++++++++++---- 5 files changed, 209 insertions(+), 47 deletions(-) diff --git a/temporalio/activity.py b/temporalio/activity.py index 7315c661b..f790c9bc2 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -20,6 +20,7 @@ from typing import ( TYPE_CHECKING, Any, + Literal, NoReturn, overload, ) @@ -300,36 +301,62 @@ def client() -> Client: def stream_handle( - workflow_id: str | None = None, *, run_id: str | None = None + workflow_id: str | None = None, + *, + run_id: str | None = None, + scope: Literal["workflow", "activity"] | None = None, ) -> temporalio.streams.StreamHandle: """Return a stream handle from the provider the worker was given. - With no arguments the handle is on this activity's own workflow, pinned to - the run the activity belongs to, so a producer opened from it writes onto - that run's stream and a read follows that run. Name a ``workflow_id`` to - address another workflow; ``run_id`` then pins the handle to one run and - its absence follows the execution chain. A ``read``, ``latest`` or - ``producer`` that names no topic addresses the workflow's default topic, - :py:data:`temporalio.streams.DEFAULT_TOPIC`, the one - :py:func:`temporalio.workflow.stream_reader` and + Which stream a call with no ``workflow_id`` reaches is decided by where + the activity runs, never by what exists: + + - In an activity a workflow scheduled, it is that workflow's stream, + pinned to the run the activity belongs to. + - In a standalone activity, it is the activity's own stream. + - ``scope="activity"`` gives an activity a workflow scheduled its own + streams instead, apart from the workflow's. ``scope="workflow"`` asks + for the workflow explicitly, and a standalone activity has none. + + The rule is static because a stream is created by its first write, so a + rule that looked for one would send attempt 1 to the workflow and a retry + to the stream attempt 1 created. An activity's own streams are one per + activity execution, not per attempt: a retry writes to the same stream, + under a new attempt, and they end when the activity reaches a terminal + status. + + Name a ``workflow_id`` to address another workflow; ``run_id`` then pins + the handle to one run and its absence follows the execution chain. A + ``read``, ``latest`` or ``producer`` that names no topic addresses the + owner's default topic, :py:data:`temporalio.streams.DEFAULT_TOPIC`, the + one :py:func:`temporalio.workflow.stream_reader` and :py:func:`temporalio.workflow.stream_writer` use without a topic. See :py:mod:`temporalio.streams`. Like :py:func:`client`, this is only available in ``async def`` activities. + Args: + workflow_id: Another workflow whose stream to address. + run_id: The run of ``workflow_id`` to pin to. + scope: ``"activity"`` for this activity's own streams, + ``"workflow"`` for its workflow's. Without it the rule above + decides. + Returns: :py:class:`temporalio.streams.StreamHandle` for use in the current activity. Raises: RuntimeError: When the client is not available, which is what a - ``def`` activity gets, or when the activity has no workflow and - no ``workflow_id`` was given. + ``def`` activity gets, or when ``scope="workflow"`` is asked of + an activity that belongs to no workflow. temporalio.streams.StreamUnsupportedError: The worker has no stream - provider. Register one with ``Client.connect(plugins=[provider])`` - or ``Worker(plugins=[provider])``. - ValueError: ``run_id`` was given without ``workflow_id``. + provider, or its provider cannot hold a stream an activity owns. + Register one with ``Client.connect(plugins=[provider])`` or + ``Worker(plugins=[provider])``. + ValueError: ``run_id`` was given without ``workflow_id``, or + ``scope="activity"`` with one. """ context = _Context.current() if context.sync: @@ -347,17 +374,37 @@ def stream_handle( "no stream provider is configured on this worker; register one with " "Client.connect(plugins=[provider]) or Worker(plugins=[provider])" ) - if workflow_id is None: - if run_id is not None: - raise ValueError("run_id needs a workflow_id") - info = context.info() + if workflow_id is not None: + if scope == "activity": + raise ValueError( + "scope='activity' addresses this activity's own streams, so it takes " + "no workflow_id" + ) + return provider.get_stream_handle(client(), workflow_id, run_id=run_id) + if run_id is not None: + raise ValueError("run_id needs a workflow_id") + info = context.info() + if scope is None: + scope = "workflow" if info.in_workflow else "activity" + if scope == "workflow": if info.workflow_id is None: raise RuntimeError( "this activity belongs to no workflow, so name the workflow_id to " - "address" + "address, or leave scope unset for the activity's own streams" ) - workflow_id, run_id = info.workflow_id, info.workflow_run_id - return provider.get_stream_handle(client(), workflow_id, run_id=run_id) + return provider.get_stream_handle( + client(), info.workflow_id, run_id=info.workflow_run_id + ) + if info.workflow_id is not None: + return provider.get_activity_stream_handle( + client(), + info.activity_id, + workflow_id=info.workflow_id, + run_id=info.workflow_run_id, + ) + return provider.get_activity_stream_handle( + client(), info.activity_id, run_id=info.activity_run_id + ) def in_activity() -> bool: diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 33fcedf14..c6e6fa241 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -897,29 +897,40 @@ def get_workflow_handle( ) def get_stream_handle( - self, workflow_id: str, *, run_id: str | None = None + self, + workflow_id: str | None = None, + *, + run_id: str | None = None, + activity_id: str | None = None, ) -> temporalio.streams.StreamHandle: - """Get a handle on a workflow's stream from the provider registered on this client. + """Get a handle on a workflow's or an activity's stream from the provider registered on this client. Mirrors :py:meth:`get_workflow_handle`: without ``run_id`` the handle follows the workflow's execution chain across continue-as-new, with - one it is pinned to that run. The provider is the one registered with - ``plugins=[provider]`` at :py:meth:`connect`, or passed as - ``stream_provider``. The handle's ``read``, ``latest`` and - ``producer`` take a topic, and without one address the workflow's + one it is pinned to that run. With ``activity_id`` the handle is on + the streams that activity owns: a standalone activity's when + ``workflow_id`` is left out, and ``run_id`` then pins the activity's + run, or an activity that ``workflow_id`` scheduled. The provider is + the one registered with ``plugins=[provider]`` at :py:meth:`connect`, + or passed as ``stream_provider``. The handle's ``read``, ``latest`` + and ``producer`` take a topic, and without one address the owner's default topic, :py:data:`temporalio.streams.DEFAULT_TOPIC`. See :py:mod:`temporalio.streams`. Args: - workflow_id: Workflow ID whose stream to get a handle to. + workflow_id: Workflow ID whose stream to get a handle to, or the + workflow that scheduled ``activity_id``. run_id: Run ID to pin the handle to. + activity_id: Activity ID whose own streams to get a handle to. Returns: The stream handle. Raises: + ValueError: Neither ``workflow_id`` nor ``activity_id`` was given. temporalio.streams.StreamUnsupportedError: No stream provider is - registered on this client. + registered on this client, or it cannot hold a stream an + activity owns. """ provider = self._config.get("stream_provider") if provider is None: @@ -927,6 +938,12 @@ def get_stream_handle( "no stream provider is registered on this client; connect with " "plugins=[provider]" ) + if activity_id is not None: + return provider.get_activity_stream_handle( + self, activity_id, workflow_id=workflow_id, run_id=run_id + ) + if workflow_id is None: + raise ValueError("name the workflow_id or the activity_id to address") return provider.get_stream_handle(self, workflow_id, run_id=run_id) def get_workflow_handle_for( diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index fbb32e3fa..1eed3e0df 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -43,10 +43,13 @@ registers it on a worker alone. Each context then asks for its stream the same way. Workflow code uses :func:`temporalio.workflow.stream_reader` and :func:`temporalio.workflow.stream_writer`. An activity uses -:func:`temporalio.activity.stream_handle`, which is its own workflow pinned -to its run unless told otherwise. Any process holding a client uses +:func:`temporalio.activity.stream_handle`: an activity a workflow scheduled +reaches that workflow's stream pinned to its run, a standalone activity +reaches its own, and ``scope="activity"`` gives the first kind its own +streams too. Any process holding a client uses :meth:`temporalio.client.Client.get_stream_handle`, which mirrors -``get_workflow_handle``. The explicit form, +``get_workflow_handle`` and takes an ``activity_id`` for an activity's +streams. The explicit form, ``provider.get_stream_handle(client, workflow_id)``, stays for a process that talks to two stores. This module keeps the shared types, the errors and the protocols a provider implements; nothing here that workflow code imports does diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index e14b9faeb..6ad41a5bb 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -91,10 +91,11 @@ async def finish(self) -> None: class StreamHandle(Protocol): - """One workflow's stream, addressed by topic, from outside workflow code. + """One owner's stream, addressed by topic, from outside workflow code. - A handle follows the workflow's execution chain unless it was opened with - a ``run_id``, in which case it is pinned to that run. A topic is a + The owner is a workflow or an activity. A handle on a workflow follows + its execution chain unless it was opened with a ``run_id``, in which case + it is pinned to that run. A topic is a :class:`temporalio.streams.StreamTopic` definition, which carries the record type, or a plain string with ``result_type=`` for a name decided at runtime. A transport failure surfaces as @@ -292,6 +293,31 @@ def get_stream_handle( """ ... + def get_activity_stream_handle( + self, + client: Client, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> StreamHandle: + """A handle on the streams an activity owns. + + Without ``workflow_id`` the activity is a standalone one, an execution + of its own, and ``run_id`` pins one run of it. With ``workflow_id`` it + is an activity that workflow scheduled, and ``run_id`` pins the + workflow's run. Either way these streams are apart from any + workflow's: a topic here and the same topic on the workflow's handle + are two streams. A retry of the activity writes to the same streams, + and a read ends when the activity reaches a terminal status, not when + an attempt fails. + + Raises: + StreamUnsupportedError: The provider's store cannot hold a stream + an activity owns. + """ + ... + async def close(self) -> None: """Release what this provider holds for the process. diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index d139cfb51..98a76fd25 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -15,6 +15,12 @@ handle only decides which run's close ends a read. - It learns that a workflow closed by describing it, so a handle opened without a client reads until the caller closes it. +- An activity's own streams are keyed by the activity, not by its run. A + standalone activity's read ends when describing it shows a terminal + status. A workflow's activity is described through its workflow: the read + ends once the activity has been seen pending and is no longer, or the + workflow closed, so a read opened after the activity already finished + waits for the workflow. The outside surface (producer identity, retry deduplication, positions, supersession, cursors) is faithful, which is what the conformance tests lean @@ -35,7 +41,7 @@ import temporalio.converter from temporalio import workflow -from temporalio.client import Client, WorkflowExecutionStatus +from temporalio.client import ActivityExecutionStatus, Client, WorkflowExecutionStatus from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import StreamCursorError, StreamProducerError from temporalio.streams._ids import topic_key @@ -314,20 +320,28 @@ def _write(self, wires: list[WireRecord]) -> Cursor: class MemoryStreamHandle: - """One workflow's stream from outside, with the shared reader rules.""" + """One owner's stream from outside, with the shared reader rules. + + The owner is ``workflow_id``'s workflow, or with ``activity_id`` an + activity: a standalone one without ``workflow_id``, or one that workflow + scheduled. + """ def __init__( self, streams: MemoryStreams, client: Client | None, - workflow_id: str, + workflow_id: str | None, run_id: str | None, + activity_id: str | None = None, ) -> None: - """Address ``workflow_id``'s topics in ``streams``.""" + """Address the owner's topics in ``streams``.""" self._streams = streams self._client = client self._workflow_id = workflow_id self._run_id = run_id + self._activity_id = activity_id + self._seen_pending = False self._converter = ( client.data_converter.payload_converter if client is not None @@ -343,7 +357,7 @@ def read( ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records on ``topic`` after ``after`` until the workflow closes.""" name, result_type = resolve_topic(topic, result_type) - store = self._streams._topic(self._workflow_id, name) + store = self._store(name) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. start = self._streams._offset_after(after) @@ -383,21 +397,46 @@ async def _read( else self._streams._poll.total_seconds(), ) + def _store(self, topic: str) -> _Topic: + if self._activity_id is not None: + return self._streams._activity_topic( + self._workflow_id, self._activity_id, topic + ) + assert self._workflow_id is not None + return self._streams._topic(self._workflow_id, topic) + async def _closed(self) -> bool: if self._client is None: return False - handle = self._client.get_workflow_handle( - self._workflow_id, run_id=self._run_id - ) try: - description = await handle.describe() + if self._activity_id is not None and self._workflow_id is None: + activity = await self._client.get_activity_handle( + self._activity_id, run_id=self._run_id + ).describe() + return activity.status != ActivityExecutionStatus.RUNNING + assert self._workflow_id is not None + description = await self._client.get_workflow_handle( + self._workflow_id, run_id=self._run_id + ).describe() except RPCError as error: if error.status == RPCStatusCode.NOT_FOUND: - # A producer may write before the workflow exists; there is + # A producer may write before the owner exists; there is # nothing to follow yet, so keep waiting. return False raise status = description.status + if self._activity_id is not None: + pending = any( + info.activity_id == self._activity_id + for info in description.raw_description.pending_activities + ) + if pending: + self._seen_pending = True + elif self._seen_pending: + return True + # The activity's streams are not the workflow's chain: a run that + # continued as new took its activities with it. + return status is not None and status != WorkflowExecutionStatus.RUNNING if status is None or status == WorkflowExecutionStatus.RUNNING: return False # Following the chain, a run that continued as new is not the end: @@ -409,7 +448,7 @@ async def _closed(self) -> bool: async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The cursor of the newest record on ``topic``, for following from now.""" name, _ = resolve_topic(topic) - count = len(self._streams._topic(self._workflow_id, name).records) + count = len(self._store(name).records) return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING def producer( @@ -421,7 +460,7 @@ def producer( ) -> MemoryProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" name, _ = resolve_topic(topic) - store = self._streams._topic(self._workflow_id, name) + store = self._store(name) producer_id, attempt = producer_identity(producer_id, attempt) return MemoryProducer(store, self._converter, name, producer_id, attempt) @@ -445,10 +484,12 @@ def __init__( """ self._poll = poll_interval self._topics: dict[str, _Topic] = {} + self._activity_topics: dict[tuple[str | None, str, str], _Topic] = {} def reset(self) -> None: """Drop every topic. For tests.""" self._topics.clear() + self._activity_topics.clear() def workflow_provider(self) -> _MemoryWorkflowProvider: """The workflow half, over this provider's topics.""" @@ -465,6 +506,21 @@ def get_stream_handle( """ return MemoryStreamHandle(self, client, workflow_id, run_id) + def get_activity_stream_handle( + self, + client: Client | None, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> MemoryStreamHandle: + """A handle on the topics ``activity_id`` owns, apart from any workflow's. + + As on :meth:`get_stream_handle`, ``client`` may be ``None``, and then + a read waits until the caller closes it. + """ + return MemoryStreamHandle(self, client, workflow_id, run_id, activity_id) + async def close(self) -> None: """Nothing to release: the provider holds no connection.""" @@ -477,6 +533,19 @@ def _topic(self, workflow_id: str, topic: str) -> _Topic: found = self._topics[key] = _Topic() return found + def _activity_topic( + self, workflow_id: str | None, activity_id: str, topic: str + ) -> _Topic: + # Kept apart from the workflow topics, so no workflow id can name an + # activity's stream. + if not topic: + raise ValueError("topic must not be empty") + key = (workflow_id, activity_id, topic) + found = self._activity_topics.get(key) + if found is None: + found = self._activity_topics[key] = _Topic() + return found + def _offset_after(self, after: Cursor) -> int: position = cursor_position(after, provider=_PROVIDER) if position is None: From be5118605d628e30b291abd2f86f095e33534947 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 15:55:53 -0700 Subject: [PATCH 648/831] Tested the activity stream accessor rule and retry supersession. Covers all three arms of the rule, a retry writing to the same stream, and the misaddressed calls, on every provider the tree can stand up. --- tests/streams/test_activity_streams.py | 261 +++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 tests/streams/test_activity_streams.py diff --git a/tests/streams/test_activity_streams.py b/tests/streams/test_activity_streams.py new file mode 100644 index 000000000..8aa4a653a --- /dev/null +++ b/tests/streams/test_activity_streams.py @@ -0,0 +1,261 @@ +"""Streams owned by activities, and which stream an activity's accessor reaches. + +``activity.stream_handle()`` resolves by a static rule, never by what exists: +an activity a workflow scheduled reaches its workflow's stream, a standalone +activity reaches its own, and ``scope="activity"`` gives an activity a +workflow scheduled its own streams. An activity's own streams are one per +activity execution, so a retry writes to the same stream and a reader sees +the attempt change as ``SUPERSEDED``. + +The memory provider always runs. A storage provider adds itself to +``SETUPS`` behind its own ``STREAMS_LIVE`` gate: its setup receives the +environment's client and hands back the provider and a client with it +registered, which the workers and the reads in these cases share. +""" + +from __future__ import annotations + +import asyncio +import uuid +from collections.abc import AsyncIterator, Callable +from dataclasses import dataclass +from datetime import timedelta +from typing import Any + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.common import RetryPolicy +from temporalio.streams import ( + BEGINNING, + RecordKind, + StreamProvider, + topic, +) +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import WorkflowEnvironment +from tests.helpers import new_worker + +TOKENS = topic("tokens", dict) + + +@dataclass +class ActivitySetup: + """A provider under test, registered on the client the cases use.""" + + name: str + provider: StreamProvider + client: Client + + +async def _memory_setup(client: Client) -> AsyncIterator[ActivitySetup]: + provider = MemoryStreams(poll_interval=timedelta(milliseconds=50)) + config = client.config() + config["plugins"] = [provider] + yield ActivitySetup("memory", provider, Client(**config)) + provider.reset() + + +SETUPS: dict[str, Callable[[Client], AsyncIterator[ActivitySetup]]] = { + "memory": _memory_setup +} + + +@pytest.fixture(params=sorted(SETUPS)) +async def setup( + request: pytest.FixtureRequest, client: Client, env: WorkflowEnvironment +) -> AsyncIterator[ActivitySetup]: + if env.supports_time_skipping: + pytest.skip("the time-skipping test server has no standalone activities") + async for found in SETUPS[request.param](client): + yield found + + +async def read_all(records: Any, timeout: float = 30.0) -> list: + """Read until the stream ends, which is when its owner does.""" + + async def _collect() -> list: + return [record async for record in records] + + return await asyncio.wait_for(_collect(), timeout) + + +def summary(records: list) -> list[tuple[Any, ...]]: + return [ + (r.kind, r.attempt, r.value["token"] if r.kind is RecordKind.DATA else None) + for r in records + ] + + +@activity.defn +async def write_by_default(label: str) -> str: + # No arguments: where this lands depends only on where the activity runs. + producer = activity.stream_handle().producer(topic=TOKENS) + await producer.append({"token": label}) + await producer.finish() + return activity.info().activity_id + + +@activity.defn +async def write_to_own_streams(label: str) -> str: + producer = activity.stream_handle(scope="activity").producer(topic=TOKENS) + await producer.append({"token": label}) + await producer.finish() + return activity.info().activity_id + + +@workflow.defn +class RunsOneActivity: + """Runs one activity by name and returns what it returned.""" + + @workflow.run + async def run(self, name: str, label: str) -> str: + return await workflow.execute_activity( + name, + label, + activity_id="streamer", + start_to_close_timeout=timedelta(seconds=30), + ) + + +async def test_workflow_activity_defaults_to_its_workflow(setup: ActivitySetup): + client = setup.client + workflow_id = f"streams-wfa-{uuid.uuid4().hex}" + async with new_worker( + client, RunsOneActivity, activities=[write_by_default] + ) as worker: + await client.execute_workflow( + RunsOneActivity.run, + args=["write_by_default", "to the workflow"], + id=workflow_id, + task_queue=worker.task_queue, + ) + records = await read_all( + client.get_stream_handle(workflow_id).read(topic=TOKENS) + ) + assert summary(records) == [ + (RecordKind.DATA, 1, "to the workflow"), + (RecordKind.FINISH, 1, None), + ] + assert all(r.producer_id == "streamer" for r in records) + own = client.get_stream_handle(workflow_id, activity_id="streamer") + assert await own.latest(topic=TOKENS) == BEGINNING + + +async def test_scope_activity_gives_a_workflow_activity_its_own_streams( + setup: ActivitySetup, +): + client = setup.client + workflow_id = f"streams-wfa-own-{uuid.uuid4().hex}" + async with new_worker( + client, RunsOneActivity, activities=[write_to_own_streams] + ) as worker: + await client.execute_workflow( + RunsOneActivity.run, + args=["write_to_own_streams", "to the activity"], + id=workflow_id, + task_queue=worker.task_queue, + ) + own = client.get_stream_handle(workflow_id, activity_id="streamer") + assert summary(await read_all(own.read(topic=TOKENS))) == [ + (RecordKind.DATA, 1, "to the activity"), + (RecordKind.FINISH, 1, None), + ] + # The workflow's topic of the same name is a different stream. + workflow_stream = client.get_stream_handle(workflow_id) + assert await workflow_stream.latest(topic=TOKENS) == BEGINNING + + +async def test_standalone_activity_defaults_to_its_own_stream(setup: ActivitySetup): + client = setup.client + activity_id = f"streams-saa-{uuid.uuid4().hex}" + async with new_worker(client, activities=[write_by_default]) as worker: + handle = await client.start_activity( + write_by_default, + "standalone", + id=activity_id, + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=30), + ) + assert await handle.result() == activity_id + stream = client.get_stream_handle(activity_id=activity_id) + # The read ends by itself: the activity reached a terminal status. + records = await read_all(stream.read(topic=TOKENS)) + assert summary(records) == [ + (RecordKind.DATA, 1, "standalone"), + (RecordKind.FINISH, 1, None), + ] + assert all(r.producer_id == activity_id for r in records) + + +@activity.defn +async def fail_once_after_writing() -> None: + attempt = activity.info().attempt + producer = activity.stream_handle().producer(topic=TOKENS) + await producer.append({"token": f"attempt {attempt}"}) + if attempt == 1: + raise RuntimeError("the first attempt fails after writing") + await producer.finish() + + +async def test_a_retry_inherits_the_stream_and_supersedes(setup: ActivitySetup): + client = setup.client + activity_id = f"streams-saa-retry-{uuid.uuid4().hex}" + async with new_worker(client, activities=[fail_once_after_writing]) as worker: + handle = await client.start_activity( + fail_once_after_writing, + id=activity_id, + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=30), + retry_policy=RetryPolicy( + initial_interval=timedelta(milliseconds=200), maximum_attempts=2 + ), + ) + await handle.result() + records = await read_all( + client.get_stream_handle(activity_id=activity_id).read(topic=TOKENS) + ) + # One stream across both attempts, with the takeover reported between. + assert summary(records) == [ + (RecordKind.DATA, 1, "attempt 1"), + (RecordKind.SUPERSEDED, 2, None), + (RecordKind.DATA, 2, "attempt 2"), + (RecordKind.FINISH, 2, None), + ] + superseded = records[1].supersession + assert superseded is not None + assert (superseded.previous_attempt, superseded.attempt) == (1, 2) + + +@activity.defn +async def ask_for_misaddressed_handles() -> list[str]: + errors: list[str] = [] + try: + activity.stream_handle(scope="workflow") + except RuntimeError as error: + errors.append(f"RuntimeError: {error}") + try: + activity.stream_handle("some-workflow", scope="activity") + except ValueError as error: + errors.append(f"ValueError: {error}") + return errors + + +async def test_a_standalone_activity_has_no_workflow_to_address(setup: ActivitySetup): + client = setup.client + async with new_worker(client, activities=[ask_for_misaddressed_handles]) as worker: + errors = await client.execute_activity( + ask_for_misaddressed_handles, + id=f"streams-saa-errors-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=30), + ) + assert len(errors) == 2 + assert errors[0].startswith("RuntimeError: this activity belongs to no workflow") + assert errors[1].startswith("ValueError: scope='activity'") + + +async def test_get_stream_handle_needs_an_owner(setup: ActivitySetup): + with pytest.raises(ValueError, match="workflow_id or the activity_id"): + setup.client.get_stream_handle() From 52edf6d2e5147a32acdd4604606b83d462dcf511 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 15:58:57 -0700 Subject: [PATCH 649/831] Regenerated the vendored stream protos with the owner reference. The server's owned-stream calls take one owner reference for a workflow, a standalone activity, or a workflow's activity. --- temporalio/api/streamservice/v1/__init__.py | 12 + .../api/streamservice/v1/message_pb2.pyi | 4 +- .../streamservice/v1/request_response_pb2.py | 214 ++++++++++-------- .../streamservice/v1/request_response_pb2.pyi | 157 +++++++++++-- .../api/streamservice/v1/service_pb2_grpc.py | 4 +- .../api/streamservice/v1/service_pb2_grpc.pyi | 8 +- .../api/streamservice/v1/stream_state_pb2.pyi | 11 +- 7 files changed, 288 insertions(+), 122 deletions(-) diff --git a/temporalio/api/streamservice/v1/__init__.py b/temporalio/api/streamservice/v1/__init__.py index 1e909c223..f63562365 100644 --- a/temporalio/api/streamservice/v1/__init__.py +++ b/temporalio/api/streamservice/v1/__init__.py @@ -8,6 +8,10 @@ StreamRecordBatch, ) from .request_response_pb2 import ( + STREAM_OWNER_KIND_ACTIVITY, + STREAM_OWNER_KIND_UNSPECIFIED, + STREAM_OWNER_KIND_WORKFLOW, + STREAM_OWNER_KIND_WORKFLOW_ACTIVITY, AddMessagesInput, AddMessagesOutput, AddMessagesRequest, @@ -58,6 +62,8 @@ RegisterStreamConsumerRequest, RegisterStreamConsumerResponse, StreamListEntry, + StreamOwner, + StreamOwnerKind, SubscribeWorkflowInput, SubscribeWorkflowOutput, SubscribeWorkflowRequest, @@ -128,9 +134,15 @@ "RegisterStreamConsumerOutput", "RegisterStreamConsumerRequest", "RegisterStreamConsumerResponse", + "STREAM_OWNER_KIND_ACTIVITY", + "STREAM_OWNER_KIND_UNSPECIFIED", + "STREAM_OWNER_KIND_WORKFLOW", + "STREAM_OWNER_KIND_WORKFLOW_ACTIVITY", "StreamBudget", "StreamLifecycle", "StreamListEntry", + "StreamOwner", + "StreamOwnerKind", "StreamRecord", "StreamRecordBatch", "StreamState", diff --git a/temporalio/api/streamservice/v1/message_pb2.pyi b/temporalio/api/streamservice/v1/message_pb2.pyi index 548460a97..620917088 100644 --- a/temporalio/api/streamservice/v1/message_pb2.pyi +++ b/temporalio/api/streamservice/v1/message_pb2.pyi @@ -70,8 +70,8 @@ class StreamRecord(google.protobuf.message.Message): """Producer-supplied provenance, stored as sent.""" topic: builtins.str sequence: builtins.int - """The producer's position within its attempt, or -1 when unnumbered. Stored - as sent; the global offset is what orders the stream. + """The producer's position within its attempt, zero when it does not number + its records. Stored as sent; the global offset is what orders the stream. """ kind: temporalio.api.stream.v1.message_pb2.StreamRecordKind.ValueType """Settled to DATA on append when left unspecified, so a retry hashes the diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index 3df3e3c35..cadc35a7c 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -8,6 +8,7 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper # @@protoc_insertion_point(imports) @@ -25,9 +26,16 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xf5\x01\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12H\n\x07records\x18\x03 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08J\x04\x08\x07\x10\x08"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"\x94\x01\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x06 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xdf\x01\n\x12PollMessagesOutput\x12H\n\x07records\x18\x01 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x0e\n\x06run_id\x18\x06 \x01(\t";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\xc4\x01\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x08 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"p\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x04 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xde\x01\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x07 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12H\n\x07records\x18\x04 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"H\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\r\n\x05\x66orce\x18\x03 \x01(\x08"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x90\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"T\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutputB>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x90\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"k\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03\x12\x15\n\rstream_absent\x18\x05 \x01(\x08J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutput*\x9d\x01\n\x0fStreamOwnerKind\x12!\n\x1dSTREAM_OWNER_KIND_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTREAM_OWNER_KIND_WORKFLOW\x10\x01\x12\x1e\n\x1aSTREAM_OWNER_KIND_ACTIVITY\x10\x02\x12\'\n#STREAM_OWNER_KIND_WORKFLOW_ACTIVITY\x10\x03\x42>Z= (3, 8): +if sys.version_info >= (3, 10): import typing as typing_extensions else: import typing_extensions DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +class _StreamOwnerKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _StreamOwnerKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ + _StreamOwnerKind.ValueType + ], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + STREAM_OWNER_KIND_UNSPECIFIED: _StreamOwnerKind.ValueType # 0 + STREAM_OWNER_KIND_WORKFLOW: _StreamOwnerKind.ValueType # 1 + STREAM_OWNER_KIND_ACTIVITY: _StreamOwnerKind.ValueType # 2 + """A standalone activity, which is an execution of its own.""" + STREAM_OWNER_KIND_WORKFLOW_ACTIVITY: _StreamOwnerKind.ValueType # 3 + """An activity a workflow scheduled. It is not an execution of its own, so + its streams are reached through the workflow and routed on it. + """ + +class StreamOwnerKind(_StreamOwnerKind, metaclass=_StreamOwnerKindEnumTypeWrapper): + """The kind of execution an owned stream lives in.""" + +STREAM_OWNER_KIND_UNSPECIFIED: StreamOwnerKind.ValueType # 0 +STREAM_OWNER_KIND_WORKFLOW: StreamOwnerKind.ValueType # 1 +STREAM_OWNER_KIND_ACTIVITY: StreamOwnerKind.ValueType # 2 +"""A standalone activity, which is an execution of its own.""" +STREAM_OWNER_KIND_WORKFLOW_ACTIVITY: StreamOwnerKind.ValueType # 3 +"""An activity a workflow scheduled. It is not an execution of its own, so +its streams are reached through the workflow and routed on it. +""" +global___StreamOwnerKind = StreamOwnerKind + class CreateStreamInput(google.protobuf.message.Message): """The frontend-facing shapes are defined here rather than in the public API because streams have no public API yet. Keeping them in a nested @@ -448,15 +483,63 @@ class DescribeStreamInput(google.protobuf.message.Message): global___DescribeStreamInput = DescribeStreamInput +class StreamOwner(google.protobuf.message.Message): + """The execution that owns a stream. An attached stream has no id of its own, + so it is named by this and a stream name, and routed on id. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KIND_FIELD_NUMBER: builtins.int + ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + ACTIVITY_ID_FIELD_NUMBER: builtins.int + kind: global___StreamOwnerKind.ValueType + id: builtins.str + """The workflow id for WORKFLOW and WORKFLOW_ACTIVITY, the activity id for + ACTIVITY. + """ + run_id: builtins.str + """Optional. Pins to one run of the execution named by id, so a caller is not + silently redirected to a later run's stream, which starts empty and at + offset zero. Empty means whichever run is current. + """ + activity_id: builtins.str + """The activity within the workflow, for WORKFLOW_ACTIVITY only.""" + def __init__( + self, + *, + kind: global___StreamOwnerKind.ValueType = ..., + id: builtins.str = ..., + run_id: builtins.str = ..., + activity_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "activity_id", + b"activity_id", + "id", + b"id", + "kind", + b"kind", + "run_id", + b"run_id", + ], + ) -> None: ... + +global___StreamOwner = StreamOwner + class PollWorkflowMessagesInput(google.protobuf.message.Message): - """A stream a workflow owns lives inside that workflow's execution, so it has - no standalone id to address it by. It is named by its owner and its name - instead, and routed on the owner. + """A stream an execution owns lives inside it, so it has no standalone id to + address it by. It is named by its owner and its name instead, and routed on + the owner. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor NAMESPACE_FIELD_NUMBER: builtins.int + OWNER_FIELD_NUMBER: builtins.int WORKFLOW_ID_FIELD_NUMBER: builtins.int OWNER_RUN_ID_FIELD_NUMBER: builtins.int STREAM_NAME_FIELD_NUMBER: builtins.int @@ -465,14 +548,13 @@ class PollWorkflowMessagesInput(google.protobuf.message.Message): TOPICS_FIELD_NUMBER: builtins.int WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int namespace: builtins.str + @property + def owner(self) -> global___StreamOwner: ... workflow_id: builtins.str + """Shorthand for an owner of kind WORKFLOW, and refused alongside owner.""" owner_run_id: builtins.str - """Optional. Pins to one run, so a caller that has continued as new is not - silently redirected to the successor's stream, which starts empty and at - offset zero. Empty means whichever run is current. - """ stream_name: builtins.str - """Empty means the workflow's default output stream.""" + """Empty means the owner's default output stream.""" from_offset: builtins.int max_messages: builtins.int @property @@ -485,6 +567,7 @@ class PollWorkflowMessagesInput(google.protobuf.message.Message): self, *, namespace: builtins.str = ..., + owner: global___StreamOwner | None = ..., workflow_id: builtins.str = ..., owner_run_id: builtins.str = ..., stream_name: builtins.str = ..., @@ -493,6 +576,9 @@ class PollWorkflowMessagesInput(google.protobuf.message.Message): topics: collections.abc.Iterable[builtins.str] | None = ..., wait_new_messages: builtins.bool = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["owner", b"owner"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ @@ -502,6 +588,8 @@ class PollWorkflowMessagesInput(google.protobuf.message.Message): b"max_messages", "namespace", b"namespace", + "owner", + b"owner", "owner_run_id", b"owner_run_id", "stream_name", @@ -521,30 +609,36 @@ class DescribeWorkflowStreamInput(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor NAMESPACE_FIELD_NUMBER: builtins.int + OWNER_FIELD_NUMBER: builtins.int WORKFLOW_ID_FIELD_NUMBER: builtins.int OWNER_RUN_ID_FIELD_NUMBER: builtins.int STREAM_NAME_FIELD_NUMBER: builtins.int namespace: builtins.str + @property + def owner(self) -> global___StreamOwner: ... workflow_id: builtins.str + """Shorthand for an owner of kind WORKFLOW, and refused alongside owner.""" owner_run_id: builtins.str - """Optional. Pins to one run, so a caller that has continued as new is not - silently redirected to the successor's stream, which starts empty and at - offset zero. Empty means whichever run is current. - """ stream_name: builtins.str def __init__( self, *, namespace: builtins.str = ..., + owner: global___StreamOwner | None = ..., workflow_id: builtins.str = ..., owner_run_id: builtins.str = ..., stream_name: builtins.str = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["owner", b"owner"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ "namespace", b"namespace", + "owner", + b"owner", "owner_run_id", b"owner_run_id", "stream_name", @@ -557,13 +651,14 @@ class DescribeWorkflowStreamInput(google.protobuf.message.Message): global___DescribeWorkflowStreamInput = DescribeWorkflowStreamInput class AddWorkflowMessagesInput(google.protobuf.message.Message): - """Appending to a stream a workflow owns, from outside that workflow. The - workflow's own publishes ride its Workflow Task instead. + """Appending to an owned stream from outside its owner. A workflow's own + publishes ride its Workflow Task instead; an activity has no other path. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor NAMESPACE_FIELD_NUMBER: builtins.int + OWNER_FIELD_NUMBER: builtins.int WORKFLOW_ID_FIELD_NUMBER: builtins.int OWNER_RUN_ID_FIELD_NUMBER: builtins.int STREAM_NAME_FIELD_NUMBER: builtins.int @@ -571,14 +666,13 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): PRODUCER_ID_FIELD_NUMBER: builtins.int SEQUENCE_FIELD_NUMBER: builtins.int namespace: builtins.str + @property + def owner(self) -> global___StreamOwner: ... workflow_id: builtins.str + """Shorthand for an owner of kind WORKFLOW, and refused alongside owner.""" owner_run_id: builtins.str - """Optional. Pins to one run, so a caller that has continued as new is not - silently redirected to the successor's stream, which starts empty and at - offset zero. Empty means whichever run is current. - """ stream_name: builtins.str - """Empty means the workflow's default output stream.""" + """Empty means the owner's default output stream.""" @property def records( self, @@ -592,6 +686,7 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): self, *, namespace: builtins.str = ..., + owner: global___StreamOwner | None = ..., workflow_id: builtins.str = ..., owner_run_id: builtins.str = ..., stream_name: builtins.str = ..., @@ -602,11 +697,16 @@ class AddWorkflowMessagesInput(google.protobuf.message.Message): producer_id: builtins.str = ..., sequence: builtins.int = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["owner", b"owner"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ "namespace", b"namespace", + "owner", + b"owner", "owner_run_id", b"owner_run_id", "producer_id", @@ -1242,21 +1342,36 @@ class RegisterStreamConsumerOutput(google.protobuf.message.Message): START_OFFSET_FIELD_NUMBER: builtins.int KNOWN_HEAD_FIELD_NUMBER: builtins.int + STREAM_ABSENT_FIELD_NUMBER: builtins.int start_offset: builtins.int known_head: builtins.int """The frontier at registration, so the cursor starts with a known head instead of waiting for the first push. """ + stream_absent: builtins.bool + """No execution in this namespace holds a stream with that id, so nothing + was registered. An answer rather than a NotFound because the caller acts + on it: a subscribe command falls back to a stream of the workflow's own by + that name. Every other NotFound, from a registry miss to a shard that has + moved, stays an error, since binding the workflow to different data on one + of those would be silent and permanent. + """ def __init__( self, *, start_offset: builtins.int = ..., known_head: builtins.int = ..., + stream_absent: builtins.bool = ..., ) -> None: ... def ClearField( self, field_name: typing_extensions.Literal[ - "known_head", b"known_head", "start_offset", b"start_offset" + "known_head", + b"known_head", + "start_offset", + b"start_offset", + "stream_absent", + b"stream_absent", ], ) -> None: ... diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.py b/temporalio/api/streamservice/v1/service_pb2_grpc.py index ae742a2e2..65eb9f4fb 100644 --- a/temporalio/api/streamservice/v1/service_pb2_grpc.py +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.py @@ -134,7 +134,9 @@ def DescribeStream(self, request, context): raise NotImplementedError("Method not implemented!") def PollWorkflowMessages(self, request, context): - """Routed on the owner, because the stream it reads has no id of its own.""" + """The owned-stream calls are routed on the owner, because the stream has no + id of its own. A workflow's activity is routed on the workflow. + """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") diff --git a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi index 1530074ec..c6d8650c4 100644 --- a/temporalio/api/streamservice/v1/service_pb2_grpc.pyi +++ b/temporalio/api/streamservice/v1/service_pb2_grpc.pyi @@ -39,7 +39,9 @@ class StreamServiceStub: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse, ] - """Routed on the owner, because the stream it reads has no id of its own.""" + """The owned-stream calls are routed on the owner, because the stream has no + id of its own. A workflow's activity is routed on the workflow. + """ DescribeWorkflowStream: grpc.UnaryUnaryMultiCallable[ temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamRequest, temporalio.api.streamservice.v1.request_response_pb2.DescribeWorkflowStreamResponse, @@ -127,7 +129,9 @@ class StreamServiceServicer(metaclass=abc.ABCMeta): request: temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesRequest, context: grpc.ServicerContext, ) -> temporalio.api.streamservice.v1.request_response_pb2.PollWorkflowMessagesResponse: - """Routed on the owner, because the stream it reads has no id of its own.""" + """The owned-stream calls are routed on the owner, because the stream has no + id of its own. A workflow's activity is routed on the workflow. + """ @abc.abstractmethod def DescribeWorkflowStream( self, diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.pyi b/temporalio/api/streamservice/v1/stream_state_pb2.pyi index f44a56c07..805e2a93e 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.pyi +++ b/temporalio/api/streamservice/v1/stream_state_pb2.pyi @@ -122,7 +122,10 @@ class StreamState(google.protobuf.message.Message): """ appended_bytes: builtins.int """Bytes appended over the stream's life, kept for the budget check. A stream - with a budget never reclaims, so this is also what it holds. + with a budget carries no lifecycle cap and is never truncated, so nothing + reclaims behind it and this is also what it holds. The item side of the + budget measures head minus base for the same reason: offsets are global + and a stream can begin above zero. """ notify_pending: builtins.bool """A notify task is scheduled and has not run yet. Appends while it is set @@ -414,6 +417,12 @@ class StreamLifecycle(google.protobuf.message.Message): max_items: builtins.int """Cap on readable messages. Whole batches are reclaimed once the floor passes them, so a capped stream has bounded storage. + + While a workflow consumer is registered the cap stops being a rolling + window: the consumer's floor sits at the offset it subscribed from, + because replay re-reads every range its History recorded, so the cap + behaves as a lifetime quota measured from that subscription and appends + past it are refused rather than reclaiming behind the consumer. """ def __init__( self, From 9addbc6abda29915c11d6fc79233256644497f86 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 15:58:57 -0700 Subject: [PATCH 650/831] Opened activity-owned streams from the wire client. A workflow owner keeps going out in the workflow fields, so a server without owner support still routes it; only an activity sends the owner reference. --- temporalio/client_stream.py | 83 ++++++++++++++++++++++++++----- tests/test_client_stream_owner.py | 78 +++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 13 deletions(-) create mode 100644 tests/test_client_stream_owner.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index a043b8e03..939d29a88 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -284,6 +284,33 @@ def workflow_stream( self._stub, self._namespace, workflow_id, name, owner_run_id ) + def activity_stream( + self, + activity_id: str, + name: str = "", + *, + workflow_id: str = "", + run_id: str = "", + ) -> WorkflowStreamHandle: + """Open a stream an activity owns. + + Without ``workflow_id`` the activity is a standalone one, an execution + of its own, and ``run_id`` pins one run of it. With ``workflow_id`` it + is an activity that workflow scheduled, reached through the workflow, + and ``run_id`` pins the workflow's run. Either way the stream is apart + from the workflow's streams, one per activity execution rather than + per attempt, and it reads as closed once the activity reaches a + terminal status. An empty name is the activity's default stream. + """ + return WorkflowStreamHandle( + self._stub, + self._namespace, + workflow_id, + name, + run_id, + activity_id=activity_id, + ) + class StreamHandle: """A handle to one standalone stream.""" @@ -438,12 +465,13 @@ async def describe(self) -> stream.StreamState: class WorkflowStreamHandle: - """A handle to a stream a workflow owns. + """A handle to a stream a workflow or an activity owns. - The workflow writes to it from inside its Workflow Task, which costs it no - transition of its own. Anything else writes through :meth:`append`, which - costs one transition on the owning execution per batch. Both land in the - same log in the order the server accepted them. + A workflow writes to its own from inside its Workflow Task, which costs it + no transition of its own. Anything else writes through :meth:`append`, + which costs one transition on the owning execution per batch. Both land in + the same log in the order the server accepted them. An activity has only + the second path. """ def __init__( @@ -453,19 +481,51 @@ def __init__( workflow_id: str, name: str = "", owner_run_id: str = "", + *, + activity_id: str = "", ) -> None: - """Prefer :meth:`StreamClient.workflow_stream`.""" + """Prefer :meth:`StreamClient.workflow_stream` or :meth:`StreamClient.activity_stream`.""" self._stub = stub self._namespace = namespace self._workflow_id = workflow_id self._name = name self._owner_run_id = owner_run_id + self._activity_id = activity_id @property def workflow_id(self) -> str: - """Id of the workflow that owns this stream.""" + """Id of the workflow that owns this stream, or that scheduled the activity that does.""" return self._workflow_id + @property + def activity_id(self) -> str: + """Id of the activity that owns this stream, empty when a workflow does.""" + return self._activity_id + + def _owner(self) -> dict[str, Any]: + # A workflow owner goes out in the workflow fields, which a server + # without owner support still routes on; only an activity needs the + # owner reference. + if not self._activity_id: + return { + "workflow_id": self._workflow_id, + "owner_run_id": self._owner_run_id, + } + if self._workflow_id: + owner = stream.StreamOwner( + kind=stream.STREAM_OWNER_KIND_WORKFLOW_ACTIVITY, + id=self._workflow_id, + run_id=self._owner_run_id, + activity_id=self._activity_id, + ) + else: + owner = stream.StreamOwner( + kind=stream.STREAM_OWNER_KIND_ACTIVITY, + id=self._activity_id, + run_id=self._owner_run_id, + ) + return {"owner": owner} + @property def name(self) -> str: """Name the owner publishes under, empty for its default stream.""" @@ -507,8 +567,7 @@ async def append( stream.AddWorkflowMessagesRequest( frontend_request=stream.AddWorkflowMessagesInput( namespace=self._namespace, - workflow_id=self._workflow_id, - owner_run_id=self._owner_run_id, + **self._owner(), stream_name=self._name, records=[_to_service(record) for record in records], producer_id=producer_id, @@ -567,8 +626,7 @@ async def poll( stream.PollWorkflowMessagesRequest( frontend_request=stream.PollWorkflowMessagesInput( namespace=self._namespace, - workflow_id=self._workflow_id, - owner_run_id=self._owner_run_id, + **self._owner(), stream_name=self._name, from_offset=from_offset, max_messages=max_records, @@ -590,8 +648,7 @@ async def describe(self) -> stream.StreamState: stream.DescribeWorkflowStreamRequest( frontend_request=stream.DescribeWorkflowStreamInput( namespace=self._namespace, - workflow_id=self._workflow_id, - owner_run_id=self._owner_run_id, + **self._owner(), stream_name=self._name, ) ), diff --git a/tests/test_client_stream_owner.py b/tests/test_client_stream_owner.py new file mode 100644 index 000000000..f48b36bbe --- /dev/null +++ b/tests/test_client_stream_owner.py @@ -0,0 +1,78 @@ +"""Which owner an owned-stream call names on the wire. + +A workflow owner goes out in the workflow fields, which a server without +owner support still routes on. An activity owner needs the owner reference: +a standalone activity is routed on its own id, and an activity a workflow +scheduled is routed on the workflow. +""" + +from __future__ import annotations + +from typing import Any + +import temporalio.api.streamservice.v1 as stream +from temporalio.api.stream.v1 import StreamRecord +from temporalio.client_stream import StreamClient + + +class _Recorder: + """Stands in for the stub and answers every call with an empty response.""" + + def __init__(self) -> None: + self.requests: list[Any] = [] + + def __getattr__(self, method: str) -> Any: + responses = { + "AddWorkflowMessages": stream.AddWorkflowMessagesResponse, + "PollWorkflowMessages": stream.PollWorkflowMessagesResponse, + "DescribeWorkflowStream": stream.DescribeWorkflowStreamResponse, + } + + async def call(request: Any, **_: Any) -> Any: + self.requests.append(request.frontend_request) + return responses[method]() + + return call + + +def _client(recorder: _Recorder) -> StreamClient: + client = StreamClient.__new__(StreamClient) + client._stub = recorder + client._namespace = "ns" + return client + + +async def _every_call(handle: Any) -> None: + await handle.append(StreamRecord()) + await handle.poll(wait=False) + await handle.describe() + + +async def test_a_workflow_owner_uses_the_workflow_fields(): + recorder = _Recorder() + await _every_call(_client(recorder).workflow_stream("wf", owner_run_id="run")) + for request in recorder.requests: + assert (request.workflow_id, request.owner_run_id) == ("wf", "run") + assert not request.HasField("owner") + + +async def test_a_standalone_activity_is_its_own_owner(): + recorder = _Recorder() + await _every_call(_client(recorder).activity_stream("act", run_id="run")) + for request in recorder.requests: + assert request.owner == stream.StreamOwner( + kind=stream.STREAM_OWNER_KIND_ACTIVITY, id="act", run_id="run" + ) + assert request.workflow_id == "" + + +async def test_a_workflow_activity_is_reached_through_its_workflow(): + recorder = _Recorder() + await _every_call( + _client(recorder).activity_stream("act", "reasoning", workflow_id="wf") + ) + for request in recorder.requests: + assert request.owner == stream.StreamOwner( + kind=stream.STREAM_OWNER_KIND_WORKFLOW_ACTIVITY, id="wf", activity_id="act" + ) + assert request.stream_name == "reasoning" From 6be84731eadebac9291e3bc17ae1a5ad19479958 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:01:48 -0700 Subject: [PATCH 651/831] Opened activity-owned streams on the native provider. A standalone activity is its own owner on the server and a workflow's activity is reached through its workflow; the handle pins one activity execution and never follows a chain, because a retry writes to the same stream. --- temporalio/streams/providers/native.py | 85 +++++++++++++++++++++++++- tests/streams/test_activity_streams.py | 19 ++++++ 2 files changed, 103 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 78e194c7b..8bcf32c04 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -12,6 +12,12 @@ provider sends the name explicitly and a record's topic and its stream's name never differ. +An activity owns topics of its own, apart from its workflow's: a standalone +activity is its own owner on the server, and an activity a workflow scheduled +is addressed through that workflow. They are one stream per activity +execution, so a retry writes to the same stream, and the server ends them when +the activity reaches a terminal status. + A cursor names the run as well as the offset, because an owned stream belongs to one run and a successor's starts over at zero. A handle without a run id reads run after run, learning from the poll that a run's stream is closed and @@ -52,7 +58,12 @@ ) from temporalio.streams.providers import ProviderPlugin -__all__ = ["NativeProducer", "NativeStreamHandle", "NativeStreams"] +__all__ = [ + "NativeActivityStreamHandle", + "NativeProducer", + "NativeStreamHandle", + "NativeStreams", +] T = TypeVar("T") @@ -474,6 +485,60 @@ async def _successor(self, run_id: str) -> str | None: return None +class NativeActivityStreamHandle(NativeStreamHandle): + """The topics one activity owns, from outside, over the stream service. + + An activity's streams belong to one activity execution, not to a chain of + runs: a retry writes to the same stream and a read ends when the activity + reaches a terminal status. So the handle pins the execution on first use + and never follows a successor. A standalone activity is its own owner; an + activity a workflow scheduled is reached through that workflow's run. + """ + + def __init__( + self, + client: Client, + activity_id: str, + workflow_id: str | None, + run_id: str | None, + *, + opened: set[tuple[str, str]] | None = None, + ) -> None: + """Address ``activity_id``'s topics, pinned to ``run_id`` when one is given.""" + super().__init__(client, workflow_id or "", run_id, opened=opened) + self._activity_id = activity_id + + def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: + return self._service().activity_stream( + self._activity_id, topic, workflow_id=self._workflow_id, run_id=run_id + ) + + async def _current_run(self) -> str: + if self._workflow_id: + return await super()._current_run() + try: + description = await self._client.get_activity_handle( + self._activity_id + ).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"activity {self._activity_id!r} was not found" + ) from error + raise + assert description.activity_run_id is not None + return description.activity_run_id + + async def _first_run(self) -> str: + return await self._current_run() + + async def _predecessor(self, run_id: str) -> str | None: + return None + + async def _successor(self, run_id: str) -> str | None: + return None + + class NativeStreams(ProviderPlugin): """The server-side provider. @@ -499,6 +564,24 @@ def get_stream_handle( """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain.""" return NativeStreamHandle(client, workflow_id, run_id, opened=self._opened) + def get_activity_stream_handle( + self, + client: Client, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> NativeActivityStreamHandle: + """A handle on the topics ``activity_id`` owns, apart from any workflow's. + + Without ``workflow_id`` the activity is a standalone one and ``run_id`` + pins its run; with one it is that workflow's activity and ``run_id`` + pins the workflow's run. + """ + return NativeActivityStreamHandle( + client, activity_id, workflow_id, run_id, opened=self._opened + ) + async def close(self) -> None: """Close the channels this provider opened to the stream service. diff --git a/tests/streams/test_activity_streams.py b/tests/streams/test_activity_streams.py index 8aa4a653a..62d8b924c 100644 --- a/tests/streams/test_activity_streams.py +++ b/tests/streams/test_activity_streams.py @@ -16,6 +16,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Callable from dataclasses import dataclass @@ -34,6 +35,7 @@ topic, ) from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.native import NativeStreams from temporalio.testing import WorkflowEnvironment from tests.helpers import new_worker @@ -57,9 +59,26 @@ async def _memory_setup(client: Client) -> AsyncIterator[ActivitySetup]: provider.reset() +async def _native_setup(client: Client) -> AsyncIterator[ActivitySetup]: + # The store is a server built from the stream-carrying branch, which the + # test environment's own server is not; TEMPORAL_ADDRESS names it. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = NativeStreams() + config = client.config() + config["plugins"] = [provider] + yield ActivitySetup("native", provider, Client(**config)) + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ActivitySetup]]] = { "memory": _memory_setup } +if os.environ.get("STREAMS_LIVE") == "native": + SETUPS["native"] = _native_setup @pytest.fixture(params=sorted(SETUPS)) From 420bbd827e850e91269b71c192d0ee26c5c353fb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:03:49 -0700 Subject: [PATCH 652/831] Matched the activity handle to the replay layer's successor lookup. This layer looks a successor up per topic and returns where to resume, so the activity handle's override, which never has a successor, takes the same arguments. --- temporalio/streams/providers/native.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 214d3b12a..bfa6565ad 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -597,7 +597,7 @@ async def _first_run(self) -> str: async def _predecessor(self, run_id: str) -> str | None: return None - async def _successor(self, run_id: str) -> str | None: + async def _successor(self, topic: str, run_id: str) -> tuple[str, int] | None: return None From 407095c86ebad453e6a114ad7f0581bfa2b3296b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:06:22 -0700 Subject: [PATCH 653/831] Declared activity-owned streams absent on redis, WFS and nexus. Each transport addresses a stream by workflow, and a standalone activity has none, so these providers refuse with StreamUnsupportedError rather than putting the stream somewhere else. --- temporalio/streams/providers/nexus.py | 18 +++++++++++++ temporalio/streams/providers/redis.py | 25 +++++++++++++++++- .../streams/providers/workflow_streams.py | 26 ++++++++++++++++++- tests/streams/test_activity_streams.py | 26 +++++++++++++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 2d6bab005..54aca7ee8 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -995,6 +995,24 @@ def get_stream_handle( """ return NexusStreamHandle(_Front(self, client), workflow_id, run_id) + def get_activity_stream_handle( + self, + client: Client | None, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> NoReturn: + """Refused: the endpoint's operations address a stream by workflow only. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the nexus provider cannot reach a stream an activity owns: the endpoint's " + "operations address a stream by workflow only" + ) + async def close(self) -> None: """Nothing to release: each call opens and closes its own connection.""" diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index df41b8c11..5b86014b5 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -52,7 +52,7 @@ import time from collections.abc import AsyncGenerator, Coroutine, Sequence from datetime import timedelta -from typing import Any, Final, Generic, TypeVar +from typing import Any, Final, Generic, NoReturn, TypeVar from google.protobuf.message import DecodeError @@ -114,6 +114,7 @@ StreamError, StreamNotFoundError, StreamProducerError, + StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -1038,6 +1039,28 @@ def get_stream_handle( """A handle on ``workflow_id``'s topics; it follows the chain by construction.""" return RedisStreamHandle(self, client, workflow_id, run_id) + def get_activity_stream_handle( + self, + client: Client, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> NoReturn: + """Refused: this provider cannot hold a stream an activity owns. + + The transport keys every stream by a workflow chain, and a standalone + activity has none. An activity writes to its workflow's topics + instead, through ``activity.stream_handle()`` without a scope. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the redis provider cannot hold a stream an activity owns: its transport " + "keys every stream by a workflow chain" + ) + async def close(self) -> None: """Release the Redis connections this provider opened.""" client, self._owned_client = self._owned_client, None diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index ac83aa965..3bc8f008b 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -49,7 +49,7 @@ import logging from collections.abc import AsyncGenerator from datetime import timedelta -from typing import Any, Generic, TypeVar +from typing import Any, Generic, NoReturn, TypeVar from google.protobuf.message import DecodeError @@ -82,6 +82,7 @@ StreamCursorError, StreamError, StreamNotFoundError, + StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord @@ -806,5 +807,28 @@ def get_stream_handle( """A handle on ``workflow_id``'s log; without ``run_id`` it follows the chain.""" return WorkflowStreamsHandle(client, workflow_id, run_id, self._poll_cooldown) + def get_activity_stream_handle( + self, + client: Client, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> NoReturn: + """Refused: this provider cannot hold a stream an activity owns. + + The log lives inside a running workflow and is served by its handlers, + and a standalone activity has no workflow to host one. An activity + writes to its workflow's topics instead, through + ``activity.stream_handle()`` without a scope. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the workflow streams provider cannot hold a stream an activity owns: its " + "log lives inside a running workflow" + ) + async def close(self) -> None: """Nothing to release: the provider holds no connection of its own.""" diff --git a/tests/streams/test_activity_streams.py b/tests/streams/test_activity_streams.py index 62d8b924c..78d91423a 100644 --- a/tests/streams/test_activity_streams.py +++ b/tests/streams/test_activity_streams.py @@ -32,10 +32,14 @@ BEGINNING, RecordKind, StreamProvider, + StreamUnsupportedError, topic, ) from temporalio.streams.providers.memory import MemoryStreams from temporalio.streams.providers.native import NativeStreams +from temporalio.streams.providers.nexus import NexusStreams +from temporalio.streams.providers.redis import RedisStreams +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.testing import WorkflowEnvironment from tests.helpers import new_worker @@ -278,3 +282,25 @@ async def test_a_standalone_activity_has_no_workflow_to_address(setup: ActivityS async def test_get_stream_handle_needs_an_owner(setup: ActivitySetup): with pytest.raises(ValueError, match="workflow_id or the activity_id"): setup.client.get_stream_handle() + + +@pytest.mark.parametrize( + "make", + [ + lambda: RedisStreams(), + lambda: WorkflowStreamsProvider(), + lambda: NexusStreams(endpoint="unused"), + ], + ids=["redis", "workflow_streams", "nexus"], +) +async def test_a_provider_without_activity_owners_says_so( + client: Client, make: Callable[[], StreamProvider] +): + # Whether a store can hold an activity's stream is the provider's + # capability, so the refusal is the documented error, never an + # AttributeError or a stream silently put somewhere else. + provider = make() + with pytest.raises(StreamUnsupportedError, match="activity"): + provider.get_activity_stream_handle(client, "act") + with pytest.raises(StreamUnsupportedError, match="activity"): + provider.get_activity_stream_handle(client, "act", workflow_id="wf") From 4247064795fbd8cf47c629d10fd251e8819ec85e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:46:24 -0700 Subject: [PATCH 654/831] Regenerated the vendored protos for the subscribe start position. Core moves to the protos-only branch that carries the new StreamStartPosition message and the start_position field, so the vendored tree regenerates from the pin. --- temporalio/api/command/v1/message_pb2.py | 6 +- temporalio/api/command/v1/message_pb2.pyi | 33 ++++++++--- temporalio/api/stream/v1/__init__.py | 9 ++- temporalio/api/stream/v1/message_pb2.py | 20 ++++++- temporalio/api/stream/v1/message_pb2.pyi | 69 +++++++++++++++++++++++ temporalio/bridge/sdk-core | 2 +- 6 files changed, 122 insertions(+), 17 deletions(-) diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index dc2cf111b..68d370f59 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"r\n$AppendStreamRecordsCommandAttributes\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"S\n SubscribeStreamCommandAttributes\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x42\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"r\n$AppendStreamRecordsCommandAttributes\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x98\x01\n SubscribeStreamCommandAttributes\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPositionB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -456,6 +456,6 @@ _COMMAND._serialized_end = 7806 _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7808 _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7922 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7924 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8007 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7925 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8077 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 15414b7d0..6d6422c50 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -1453,6 +1453,7 @@ class SubscribeStreamCommandAttributes(google.protobuf.message.Message): STREAM_NAME_OR_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int + START_POSITION_FIELD_NUMBER: builtins.int stream_name_or_id: builtins.str """Stream to consume, named either way round: a stream this Workflow owns by the name it appends under, a stream in another execution by its id. @@ -1462,25 +1463,39 @@ class SubscribeStreamCommandAttributes(google.protobuf.message.Message): is how a reader subscribes before the first record is written. """ start_offset: builtins.int - """Where to start, as an absolute offset. Any negative value means the head - of the stream as of registration, and they all mean the same thing. The - server resolves it and records the result, so replay does not resolve it - again. - - There is no way to ask for the earliest readable offset of a stream that - has been truncated. Reading it from DescribeStream and passing it here - races with further truncation. + """Where to start, as an absolute offset. Read only when `start_position` + is unset. A negative value is refused: the head of the stream is asked + for with `start_position.tail`. """ + @property + def start_position( + self, + ) -> temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """Where to start. The server resolves it once, when it registers the + subscription, and records the resolved absolute offset on the subscribed + event, so replay does not resolve it again. Setting it together with a + non-zero `start_offset` fails the command. + """ def __init__( self, *, stream_name_or_id: builtins.str = ..., start_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["start_position", b"start_position"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ - "start_offset", b"start_offset", "stream_name_or_id", b"stream_name_or_id" + "start_offset", + b"start_offset", + "start_position", + b"start_position", + "stream_name_or_id", + b"stream_name_or_id", ], ) -> None: ... diff --git a/temporalio/api/stream/v1/__init__.py b/temporalio/api/stream/v1/__init__.py index 9d54188ec..96544007e 100644 --- a/temporalio/api/stream/v1/__init__.py +++ b/temporalio/api/stream/v1/__init__.py @@ -1,8 +1,15 @@ -from .message_pb2 import StreamRange, StreamRecord, StreamRecordKind, StreamSlice +from .message_pb2 import ( + StreamRange, + StreamRecord, + StreamRecordKind, + StreamSlice, + StreamStartPosition, +) __all__ = [ "StreamRange", "StreamRecord", "StreamRecordKind", "StreamSlice", + "StreamStartPosition", ] diff --git a/temporalio/api/stream/v1/message_pb2.py b/temporalio/api/stream/v1/message_pb2.py index c28393a50..57962eb34 100644 --- a/temporalio/api/stream/v1/message_pb2.py +++ b/temporalio/api/stream/v1/message_pb2.py @@ -20,7 +20,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xd4\x02\n\x0cStreamRecord\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x44\n\x08metadata\x18\x02 \x03(\x0b\x32\x32.temporal.api.stream.v1.StreamRecord.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x36\n\x04kind\x18\x04 \x01(\x0e\x32(.temporal.api.stream.v1.StreamRecordKind\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x03\x12\x10\n\x08sequence\x18\x07 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xb9\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x35\n\x07records\x18\x05 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"H\n\x0bStreamRange\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03*r\n\x10StreamRecordKind\x12"\n\x1eSTREAM_RECORD_KIND_UNSPECIFIED\x10\x00\x12\x1b\n\x17STREAM_RECORD_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_RECORD_KIND_FINISH\x10\x02\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' + b'\n$temporal/api/stream/v1/message.proto\x12\x16temporal.api.stream.v1\x1a$temporal/api/common/v1/message.proto"\xd4\x02\n\x0cStreamRecord\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x44\n\x08metadata\x18\x02 \x03(\x0b\x32\x32.temporal.api.stream.v1.StreamRecord.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x36\n\x04kind\x18\x04 \x01(\x0e\x32(.temporal.api.stream.v1.StreamRecordKind\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x03\x12\x10\n\x08sequence\x18\x07 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xb9\x01\n\x0bStreamSlice\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03\x12\x35\n\x07records\x18\x05 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord\x12(\n workflow_task_completed_event_id\x18\x06 \x01(\x03"H\n\x0bStreamRange\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03"i\n\x13StreamStartPosition\x12\x10\n\x06offset\x18\x01 \x01(\x03H\x00\x12\x10\n\x06last_n\x18\x02 \x01(\x03H\x00\x12\x12\n\x08\x65\x61rliest\x18\x03 \x01(\x08H\x00\x12\x0e\n\x04tail\x18\x04 \x01(\x08H\x00\x42\n\n\x08position*r\n\x10StreamRecordKind\x12"\n\x1eSTREAM_RECORD_KIND_UNSPECIFIED\x10\x00\x12\x1b\n\x17STREAM_RECORD_KIND_DATA\x10\x01\x12\x1d\n\x19STREAM_RECORD_KIND_FINISH\x10\x02\x42\x89\x01\n\x19io.temporal.api.stream.v1B\x0cMessageProtoP\x01Z#go.temporal.io/api/stream/v1;stream\xaa\x02\x18Temporalio.Api.Stream.V1\xea\x02\x1bTemporalio::Api::Stream::V1b\x06proto3' ) _STREAMRECORDKIND = DESCRIPTOR.enum_types_by_name["StreamRecordKind"] @@ -34,6 +34,7 @@ _STREAMRECORD_METADATAENTRY = _STREAMRECORD.nested_types_by_name["MetadataEntry"] _STREAMSLICE = DESCRIPTOR.message_types_by_name["StreamSlice"] _STREAMRANGE = DESCRIPTOR.message_types_by_name["StreamRange"] +_STREAMSTARTPOSITION = DESCRIPTOR.message_types_by_name["StreamStartPosition"] StreamRecord = _reflection.GeneratedProtocolMessageType( "StreamRecord", (_message.Message,), @@ -77,13 +78,24 @@ ) _sym_db.RegisterMessage(StreamRange) +StreamStartPosition = _reflection.GeneratedProtocolMessageType( + "StreamStartPosition", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSTARTPOSITION, + "__module__": "temporalio.api.stream.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.stream.v1.StreamStartPosition) + }, +) +_sym_db.RegisterMessage(StreamStartPosition) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\031io.temporal.api.stream.v1B\014MessageProtoP\001Z#go.temporal.io/api/stream/v1;stream\252\002\030Temporalio.Api.Stream.V1\352\002\033Temporalio::Api::Stream::V1" _STREAMRECORD_METADATAENTRY._options = None _STREAMRECORD_METADATAENTRY._serialized_options = b"8\001" - _STREAMRECORDKIND._serialized_start = 707 - _STREAMRECORDKIND._serialized_end = 821 + _STREAMRECORDKIND._serialized_start = 814 + _STREAMRECORDKIND._serialized_end = 928 _STREAMRECORD._serialized_start = 103 _STREAMRECORD._serialized_end = 443 _STREAMRECORD_METADATAENTRY._serialized_start = 363 @@ -92,4 +104,6 @@ _STREAMSLICE._serialized_end = 631 _STREAMRANGE._serialized_start = 633 _STREAMRANGE._serialized_end = 705 + _STREAMSTARTPOSITION._serialized_start = 707 + _STREAMSTARTPOSITION._serialized_end = 812 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/stream/v1/message_pb2.pyi b/temporalio/api/stream/v1/message_pb2.pyi index ffd60bcb2..80417d937 100644 --- a/temporalio/api/stream/v1/message_pb2.pyi +++ b/temporalio/api/stream/v1/message_pb2.pyi @@ -290,3 +290,72 @@ class StreamRange(google.protobuf.message.Message): ) -> None: ... global___StreamRange = StreamRange + +class StreamStartPosition(google.protobuf.message.Message): + """Where a new subscription or read begins. The server resolves it against the + stream as it stands in the same transaction that registers the reader, so + the result does not race with appends or truncation, and records the + resolved absolute offset. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + OFFSET_FIELD_NUMBER: builtins.int + LAST_N_FIELD_NUMBER: builtins.int + EARLIEST_FIELD_NUMBER: builtins.int + TAIL_FIELD_NUMBER: builtins.int + offset: builtins.int + """Absolute and inclusive. Refused when below the stream's floor.""" + last_n: builtins.int + """The last N records the stream holds, or all of them when it holds + fewer. Counts records of every kind. Must be positive. + """ + earliest: builtins.bool + """The oldest record the stream still holds. Must be true.""" + tail: builtins.bool + """Only records appended after registration: the stream's head offset. + Must be true. + """ + def __init__( + self, + *, + offset: builtins.int = ..., + last_n: builtins.int = ..., + earliest: builtins.bool = ..., + tail: builtins.bool = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "earliest", + b"earliest", + "last_n", + b"last_n", + "offset", + b"offset", + "position", + b"position", + "tail", + b"tail", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "earliest", + b"earliest", + "last_n", + b"last_n", + "offset", + b"offset", + "position", + b"position", + "tail", + b"tail", + ], + ) -> None: ... + def WhichOneof( + self, oneof_group: typing_extensions.Literal["position", b"position"] + ) -> typing_extensions.Literal["offset", "last_n", "earliest", "tail"] | None: ... + +global___StreamStartPosition = StreamStartPosition diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 2e05ed425..0b6992495 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 2e05ed42508992625d9e9fd93acf3a74495923b0 +Subproject commit 0b6992495d9a81631e5098041b2122e5a8bd699b From ec46a74e412902ee9e2f7fc1d31dbdfe3d00f1f8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:52:11 -0700 Subject: [PATCH 655/831] Mapped BEGINNING to the oldest record held and added END and last=N. BEGINNING is documented as the oldest record a stream still retains, which on a truncated stream is not offset zero. END follows the tail from when a read starts and last=N starts at the newest records; after= stays the only way to resume. --- temporalio/streams/__init__.py | 6 +- temporalio/streams/_provider.py | 46 +++++++++-- temporalio/streams/_record.py | 31 +++++++ temporalio/streams/providers/memory.py | 108 ++++++++++++++++++++----- 4 files changed, 161 insertions(+), 30 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index fbb32e3fa..40edf1324 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -27,7 +27,9 @@ silence. 4. **A cursor is opaque and belongs to its provider.** Hand it back to resume strictly after the record it names; :meth:`StreamHandle.latest` positions a - follower. Do not compare two cursors or do arithmetic on one. + follower. Do not compare two cursors or do arithmetic on one. A read with + no cursor yet starts at :data:`BEGINNING`, at :data:`END`, or at the last + ``N`` records with ``last=N``. 5. **A workflow addresses its streams relative to itself, by topic.** A topic can be written by the workflow and by outside producers, and read by the workflow and by outside consumers; which of those happen is the @@ -82,6 +84,7 @@ ) from temporalio.streams._record import ( BEGINNING, + END, Cursor, RecordKind, StreamRecord, @@ -97,6 +100,7 @@ __all__ = [ "BEGINNING", "DEFAULT_TOPIC", + "END", "Cursor", "ReadSource", "RecordKind", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index e14b9faeb..e1df049aa 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -104,12 +104,21 @@ class StreamHandle(Protocol): @overload def read( - self, *, topic: StreamTopic[T], after: Cursor = ... + self, + *, + topic: StreamTopic[T], + after: Cursor = ..., + last: int | None = None, ) -> AsyncGenerator[StreamRecord[T], None]: ... @overload def read( - self, *, topic: str | None = None, after: Cursor = ..., result_type: type[T] + self, + *, + topic: str | None = None, + after: Cursor = ..., + last: int | None = None, + result_type: type[T], ) -> AsyncGenerator[StreamRecord[T], None]: ... @overload @@ -118,6 +127,7 @@ def read( *, topic: str | None = None, after: Cursor = ..., + last: int | None = None, result_type: None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: ... @@ -126,15 +136,21 @@ def read( *, topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records on ``topic`` after ``after`` as they arrive. Without ``topic`` it reads :data:`temporalio.streams.DEFAULT_TOPIC`. - ``BEGINNING`` yields everything the topic retains. Any other cursor - came from a record a reader saw, and reading resumes just past it, so - a reader that stores the last cursor it handled and hands it back - sees every record exactly once. The read ends when the owning + ``BEGINNING`` yields everything the topic retains, starting at the + oldest record it still holds. ``END`` yields only what is appended + after the read starts. ``last=N`` starts at the newest ``N`` records, + or at all of them when there are fewer; it counts records of every + kind, so a ``FINISH`` among them leaves fewer than ``N`` values, and + it is exclusive with a cursor. Any other cursor came from a record a + reader saw, and reading resumes just past it, so a reader that stores + the last cursor it handled and hands it back sees every record + exactly once; that is the only way to resume. The read ends when the owning execution, or its chain, is closed and every retained record after ``after`` has been delivered; until then it waits. The result is a generator, so a caller that stops early should ``aclose()`` it. How @@ -146,10 +162,14 @@ def read( Raises: ValueError: ``result_type`` was passed with a topic definition, - or the topic is empty. + the topic is empty, ``last`` is not positive, or ``last`` was + passed with a cursor. StreamCursorError: ``after`` came from another provider or names a record no longer retained. Raised by this call, not by the first iteration. + StreamUnsupportedError: The provider cannot start a read where + ``END`` or ``last=`` asks. A provider that raises it says so + in its own documentation. StreamNotFoundError: The workflow or topic does not exist or is past retention. """ @@ -239,11 +259,21 @@ class WorkflowStreamProvider(Protocol): the definitions are resolved before it is called. """ - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: """Subscribe the running workflow to ``topic`` of its own stream. + ``after`` and ``last`` mean what they mean on + :meth:`StreamHandle.read`, and arrive already checked. Where a start + is resolved has to be something replay reproduces, so a provider + resolves it in the store and records the result, never by reading + the store from the workflow thread. + Raises: StreamCursorError: ``after`` was minted by another provider. + StreamUnsupportedError: The provider cannot start where ``END`` + or ``last`` asks. """ ... diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index 15bd8b253..c31050ede 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -12,6 +12,7 @@ __all__ = [ "BEGINNING", + "END", "Cursor", "RecordKind", "StreamRecord", @@ -80,6 +81,36 @@ def __str__(self) -> str: BEGINNING = Cursor("") """Read from the oldest record the stream still retains.""" +END = Cursor("$end") +"""Read only what is appended after the read starts. + +Provider-neutral, like :data:`BEGINNING`. It is resolved when the read +starts, not when it is called, so it cannot position a client before it +sends something; :meth:`temporalio.streams.StreamHandle.latest` does that. +""" + + +def check_read_start(after: Cursor, last: int | None) -> None: + """Refuse a read start that names two places, or a count that names none. + + ``after=`` resumes a read and ``last=`` starts one, so a call gives one or + the other. ``BEGINNING`` is the default for ``after=``, and passing it + alongside ``last=`` is the same as passing ``last=`` alone. + + Raises: + ValueError: ``last`` is not a positive int, or it was given together + with a cursor. + """ + if last is None: + return + if isinstance(last, bool) or not isinstance(last, int) or last <= 0: + raise ValueError(f"last must be a positive int, got {last!r}") + if after != BEGINNING: + raise ValueError( + "pass either after= or last=, not both: after= resumes a read and " + "last= starts one" + ) + @dataclass(frozen=True) class Supersession: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index d139cfb51..067697887 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -15,6 +15,8 @@ handle only decides which run's close ends a read. - It learns that a workflow closed by describing it, so a handle opened without a client reads until the caller closes it. +- It keeps every record until :meth:`MemoryStreams.truncate` drops the + oldest ones, which stands in for a store's retention in tests. The outside surface (producer identity, retry deduplication, positions, supersession, cursors) is faithful, which is what the conformance tests lean @@ -40,7 +42,14 @@ from temporalio.streams._errors import StreamCursorError, StreamProducerError from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -79,6 +88,10 @@ class _Topic: """One topic's records, and the waiters parked on its tail.""" def __init__(self) -> None: + # The retained records, the first of which sits at offset ``base``. + # Offsets are never reused, so a cursor keeps naming the same record + # after truncation drops the ones before it. + self.base = 0 self.records: list[bytes] = [] # Dedupe identity is (producer#attempt, first sequence of the append), # the same pair the storage providers use, mapped to where the batch @@ -122,7 +135,7 @@ def append( f"content by {writer!r}" ) return first, count - first = len(self.records) + first = self.head self.records.extend(bodies) if writer is not None: self.seen[key] = (first, len(wires), content) @@ -131,9 +144,24 @@ def append( loop.call_soon_threadsafe(_wake, future) return first, len(wires) + @property + def head(self) -> int: + """The offset the next record lands at.""" + return self.base + len(self.records) + + def at(self, offset: int) -> bytes: + """The retained record at ``offset``.""" + return self.records[offset - self.base] + + def truncate(self, keep: int) -> None: + """Drop all but the newest ``keep`` records.""" + drop = max(0, len(self.records) - keep) + self.base += drop + del self.records[:drop] + async def wait_past(self, offset: int, timeout: float | None) -> None: """Wait until a record exists at ``offset``, or ``timeout`` passes.""" - if len(self.records) > offset: + if self.head > offset: return loop = asyncio.get_running_loop() future: asyncio.Future[None] = loop.create_future() @@ -173,15 +201,17 @@ def __init__(self, store: _Topic, start: int, poll: timedelta) -> None: async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: while not self._closed: - records = self._store.records - if len(records) > self._offset: + head = self._store.head + if head > self._offset: batch: list[tuple[Cursor, WireRecord]] = [] - for offset in range(self._offset, len(records)): + for offset in range(max(self._offset, self._store.base), head): cursor = mint_cursor(_PROVIDER, str(offset)) - wire = _parse(cursor, records[offset], workflow.logger.warning) + wire = _parse( + cursor, self._store.at(offset), workflow.logger.warning + ) if wire is not None: batch.append((cursor, wire)) - self._offset = len(records) + self._offset = head if batch: return batch continue @@ -208,9 +238,12 @@ class _MemoryWorkflowProvider: def __init__(self, streams: MemoryStreams) -> None: self._streams = streams - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: - start = self._streams._offset_after(after) + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: + check_read_start(after, last) store = self._streams._topic(workflow.info().workflow_id, topic) + start = self._streams._start(store, after, last) return _MemReadSource(store, start, self._streams._poll) def open_writer(self, topic: str) -> WriteSink: @@ -339,15 +372,24 @@ def read( *, topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the workflow closes.""" + """Yield records on ``topic`` from where the read starts until the workflow closes. + + ``END`` and ``last=`` are resolved by this call, against what the + topic holds when it is made. + """ + check_read_start(after, last) name, result_type = resolve_topic(topic, result_type) store = self._streams._topic(self._workflow_id, name) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. - start = self._streams._offset_after(after) - return self._read(store, start, after, result_type) + start = self._streams._start(store, after, last) + # The decoder positions a synthesized record at the one before it, so + # it is told the position before the first record this read yields. + previous = mint_cursor(_PROVIDER, str(start - 1)) if start else BEGINNING + return self._read(store, start, previous, result_type) async def _read( self, @@ -361,10 +403,14 @@ async def _read( ) closed = False while True: - records = store.records - while offset < len(records): + while offset < store.head: + if offset < store.base: + raise StreamCursorError( + f"offset {offset} was truncated while this read was behind; " + f"the topic now starts at {store.base}" + ) cursor = mint_cursor(_PROVIDER, str(offset)) - wire = _parse(cursor, records[offset], logger.warning) + wire = _parse(cursor, store.at(offset), logger.warning) offset += 1 if wire is None: continue @@ -409,8 +455,8 @@ async def _closed(self) -> bool: async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The cursor of the newest record on ``topic``, for following from now.""" name, _ = resolve_topic(topic) - count = len(self._streams._topic(self._workflow_id, name).records) - return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING + head = self._streams._topic(self._workflow_id, name).head + return mint_cursor(_PROVIDER, str(head - 1)) if head else BEGINNING def producer( self, @@ -450,6 +496,15 @@ def reset(self) -> None: """Drop every topic. For tests.""" self._topics.clear() + def truncate(self, workflow_id: str, topic: str, *, keep: int) -> None: + """Drop all but the newest ``keep`` records of a topic. For tests. + + Stands in for a store's retention: offsets are kept, so a cursor from + before still names its record, and a read from ``BEGINNING`` starts + at the oldest one left. + """ + self._topic(workflow_id, topic).truncate(keep) + def workflow_provider(self) -> _MemoryWorkflowProvider: """The workflow half, over this provider's topics.""" return _MemoryWorkflowProvider(self) @@ -477,13 +532,24 @@ def _topic(self, workflow_id: str, topic: str) -> _Topic: found = self._topics[key] = _Topic() return found - def _offset_after(self, after: Cursor) -> int: + def _start(self, store: _Topic, after: Cursor, last: int | None) -> int: + """The offset a read starts at, resolved against what ``store`` holds now.""" + if last is not None: + return max(store.base, store.head - last) + if after == END: + return store.head position = cursor_position(after, provider=_PROVIDER) if position is None: - return 0 + return store.base try: - return int(position) + 1 + start = int(position) + 1 except ValueError: raise StreamCursorError( f"cursor {after.token!r} does not name a position on the memory provider" ) from None + if start < store.base: + raise StreamCursorError( + f"cursor {after.token!r} names a record no longer retained; the " + f"topic starts at offset {store.base}" + ) + return start From 2e4298439c6bf3e5e036d889061537771a592875 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:52:11 -0700 Subject: [PATCH 656/831] Added conformance cases for each read start, on a truncated topic too. --- tests/streams/conftest.py | 4 + tests/streams/test_streams_conformance.py | 99 ++++++++++++++++++++++- 2 files changed, 101 insertions(+), 2 deletions(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index f4a3f7e1f..b8a152f20 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -11,3 +11,7 @@ def pytest_configure(config: pytest.Config) -> None: "detects_divergent_retries: the case needs append() to compare a repeat's " "content with what the store holds", ) + config.addinivalue_line( + "markers", + "truncates: the case needs a way to drop a topic's oldest records", + ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 69c838c65..2d9e103ad 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -22,7 +22,7 @@ import asyncio import uuid -from collections.abc import AsyncIterator, Callable +from collections.abc import AsyncIterator, Awaitable, Callable from dataclasses import dataclass from typing import Any @@ -34,6 +34,7 @@ from temporalio.streams import ( BEGINNING, DEFAULT_TOPIC, + END, Cursor, RecordKind, StreamCursorError, @@ -64,6 +65,9 @@ class ProviderCase: """``append()`` returns where the records landed.""" detects_divergent_retries: bool = True """``append()`` compares a repeat's content with what it already holds.""" + truncate: Callable[[str, str, int], Awaitable[None]] | None = None + """Drops all but the newest records of a workflow's topic, standing in + for retention, or ``None`` when the provider offers no way to.""" async def open( self, workflow_id: str, *, run_id: str | None = None @@ -78,7 +82,11 @@ async def open( async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider = MemoryStreams() - yield ProviderCase("memory", provider) + + async def truncate(workflow_id: str, topic: str, keep: int) -> None: + provider.truncate(workflow_id, topic, keep=keep) + + yield ProviderCase("memory", provider, truncate=truncate) provider.reset() @@ -89,6 +97,7 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, "detects_divergent_retries": lambda case: case.detects_divergent_retries, + "truncates": lambda case: case.truncate is not None, } @@ -394,3 +403,89 @@ async def test_a_definition_carries_its_type_once(case: ProviderCase): topic("", dict) # A string names a topic decided at runtime, and the hint rides the call. assert await stream.latest(topic=OUT.name) == BEGINNING + + +async def test_last_n_starts_at_the_newest_records(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + + newest = await take(stream.read(topic=OUT, last=2), 2) + assert [r.value for r in newest] == [{"n": 3}, {"n": 4}] + # Fewer records than asked for is all of them, not an error. + everything = await take(stream.read(topic=OUT, last=100), 4) + assert [r.value for r in everything] == [{"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}] + # The cursors it yields are ordinary cursors, so a resume after one works. + again = await take(stream.read(topic=OUT, after=newest[0].cursor), 1) + assert [r.value for r in again] == [{"n": 4}] + + +async def test_last_n_counts_finish_records(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + await producer.finish() + + records = await take(stream.read(topic=OUT, last=2), 2) + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"n": 2}), + (RecordKind.FINISH, None), + ] + + +async def test_end_reads_only_what_arrives_after_the_read_starts(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": "old"}, {"n": "old"}) + + records = stream.read(topic=OUT, after=END) + first = asyncio.ensure_future(records.__anext__()) + # END resolves when the read starts, and nothing says when that was, so + # appends keep coming until the reader takes one. + try: + for _ in range(100): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({first}, timeout=0.1) + if done: + break + record = await asyncio.wait_for(first, 5) + finally: + await records.aclose() + assert record.value == {"n": "new"} + + +@pytest.mark.truncates +async def test_beginning_starts_at_the_oldest_record_still_held(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + before = await take(stream.read(topic=OUT), 1) + assert case.truncate is not None + await case.truncate(workflow_id, OUT.name, 2) + + # BEGINNING is the oldest record retained, not offset zero, which a + # truncated stream no longer holds. + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [{"n": 3}, {"n": 4}] + newest = await take(stream.read(topic=OUT, last=3), 2) + assert [r.value for r in newest] == [{"n": 3}, {"n": 4}] + with pytest.raises(StreamCursorError): + stream.read(topic=OUT, after=before[0].cursor) + + +async def test_a_read_start_names_one_place(case: ProviderCase): + stream = await case.open(new_workflow_id()) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + appended = await producer.append({"n": 1}) + for last in (0, -1, True): + with pytest.raises(ValueError, match="positive"): + stream.read(topic=OUT, last=last) + if appended is not None: + with pytest.raises(ValueError, match="either after= or last="): + stream.read(topic=OUT, after=appended, last=1) + with pytest.raises(ValueError, match="either after= or last="): + stream.read(topic=OUT, after=END, last=1) From a3edfbbfbc80261e7b2b7bfb414c41902a02417b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:55:12 -0700 Subject: [PATCH 657/831] Let stream_reader() start at END or at the last N records. A workflow could only start from BEGINNING or a cursor, so it had no way to follow from now. The provider resolves the start outside the workflow and records it, so replay reproduces it; last= is passed only when given, which keeps older providers working. --- temporalio/workflow/_streams.py | 72 +++++++++++++++++++------ tests/streams/test_streams_workflow.py | 75 ++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 15 deletions(-) diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py index 7a545444a..54353508d 100644 --- a/temporalio/workflow/_streams.py +++ b/temporalio/workflow/_streams.py @@ -18,7 +18,14 @@ from typing import Any, Generic, TypeVar, cast, overload from temporalio.streams._provider import ReadSource, WorkflowStreamProvider, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import RecordDecoder, to_wire from temporalio.workflow._context import _Runtime, payload_converter @@ -191,18 +198,28 @@ def finish(self) -> None: @overload -def stream_reader(topic: StreamTopic[T], *, after: Cursor = ...) -> StreamReader[T]: ... +def stream_reader( + topic: StreamTopic[T], *, after: Cursor = ..., last: int | None = None +) -> StreamReader[T]: ... @overload def stream_reader( - topic: str | None = None, *, result_type: type[T], after: Cursor = ... + topic: str | None = None, + *, + result_type: type[T], + after: Cursor = ..., + last: int | None = None, ) -> StreamReader[T]: ... @overload def stream_reader( - topic: str | None = None, *, result_type: None = None, after: Cursor = ... + topic: str | None = None, + *, + result_type: None = None, + after: Cursor = ..., + last: int | None = None, ) -> StreamReader[Any]: ... @@ -211,6 +228,7 @@ def stream_reader( *, result_type: type | None = None, after: Cursor = BEGINNING, + last: int | None = None, ) -> StreamReader[Any]: """Subscribe this workflow to ``topic`` of its own stream. @@ -220,8 +238,8 @@ def stream_reader( :data:`temporalio.streams.DEFAULT_TOPIC`, decoded as a string-named topic is. One subscription per topic per run. A second call for the same topic returns the reader already open on it, so records go - to whichever loop pulls first; such a call may pass neither ``after`` nor - a different type. Adding a reader on a new topic is a new command, so + to whichever loop pulls first; such a call may pass no ``after``, no + ``last`` and no different type. Adding a reader on a new topic is a new command, so gate it with :func:`temporalio.workflow.patched` as you would a timer. A reader in a successor run starts a new subscription: nothing crosses continue-as-new implicitly. @@ -232,34 +250,58 @@ def stream_reader( result_type: The value type for a string-named or default topic, used as the decode hint. :class:`temporalio.common.RawValue` returns the payload untouched. - after: Resume strictly after this record. Honoured on the first - subscription of a run, because after that the recorded - observations decide. + after: Resume strictly after this record. ``BEGINNING`` starts at + the oldest record the topic still holds and + :data:`temporalio.streams.END` at whatever is appended after the + subscription is registered. Honoured on the first subscription + of a run, because after that the recorded observations decide. + last: Start at the newest ``last`` records instead, or at all of + them when there are fewer. Records of every kind count. Exclusive + with a cursor in ``after``. Where it lands is resolved once, + outside the workflow, and replay reproduces it. Raises: ValueError: ``topic`` is empty, ``result_type`` was passed with a - definition, or a reader on the topic is already open and this - call asked for a different position or type. + definition, ``last`` is not positive or came with a cursor, or a + reader on the topic is already open and this call asked for a + different position or type. temporalio.streams.StreamCursorError: ``after`` was minted by another provider. + temporalio.streams.StreamUnsupportedError: The provider cannot start + where ``END`` or ``last`` asks. """ + check_read_start(after, last) name, result_type = resolve_topic(topic, result_type) state: _WorkflowStreams = _Runtime.current().workflow_streams() existing = state.readers.get(name) if existing is not None: - if after != BEGINNING or result_type is not existing._result_type: + if ( + after != BEGINNING + or last is not None + or result_type is not existing._result_type + ): raise ValueError( f"topic {name!r} already has a reader in this run; a second " - "stream_reader shares it and takes no after= or other type" + "stream_reader shares it and takes no after=, last= or other type" ) return existing - source = state.provider.open_reader(name, after=after) + # Passed only when given, so a provider written before last= existed + # still serves every read it can. + source = ( + state.provider.open_reader(name, after=after) + if last is None + else state.provider.open_reader(name, after=after, last=last) + ) def forget() -> None: state.readers.pop(name, None) + # The decoder positions a synthesized record at the one before it. Where + # END or last= lands is not known here, so BEGINNING stands in: resuming + # from it may deliver a record twice, where END would skip one. + previous = BEGINNING if after == END or last is not None else after reader: StreamReader[Any] = StreamReader( - source, topic=name, result_type=result_type, after=after, on_close=forget + source, topic=name, result_type=result_type, after=previous, on_close=forget ) state.readers[name] = reader return reader diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index f13c13f44..b666a4adc 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -26,6 +26,7 @@ from temporalio.client import Client from temporalio.streams import ( DEFAULT_TOPIC, + END, Cursor, ReadSource, RecordKind, @@ -541,3 +542,77 @@ async def read_everything() -> list[Any]: (DEFAULT_TOPIC, RecordKind.DATA, {"echo": 42}), (DEFAULT_TOPIC, RecordKind.FINISH, None), ] + + +@workflow.defn +class NewestTwo: + """Starts at the newest two records on ``inputs`` and returns their values.""" + + @workflow.run + async def run(self) -> list[Any]: + reader = workflow.stream_reader(INPUTS, last=2) + values: list[Any] = [] + async for value in reader.values(): + values.append(value["n"]) + if len(values) == 2: + reader.close() + return values + + +async def test_a_workflow_reader_starts_at_the_last_n_records( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, NewestTwo, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=INPUTS, producer_id="tool", attempt=1).append( + {"n": 1}, {"n": 2}, {"n": 3}, {"n": 4} + ) + handle = await client.start_workflow( + NewestTwo.run, id=workflow_id, task_queue=worker.task_queue + ) + assert await handle.result() == [3, 4] + + +@workflow.defn +class FromNow: + """Follows ``inputs`` from when it subscribes and returns the first value.""" + + @workflow.run + async def run(self) -> Any: + reader = workflow.stream_reader(INPUTS, after=END) + async for value in reader.values(): + reader.close() + return value["n"] + return None + + +async def test_a_workflow_reader_at_end_skips_what_was_there( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, FromNow, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": "old"}) + handle = await client.start_workflow( + FromNow.run, id=workflow_id, task_queue=worker.task_queue + ) + result = asyncio.ensure_future(handle.result()) + # The subscription starts when the workflow runs, which the test does + # not observe, so appends keep coming until the workflow takes one. + for _ in range(150): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({result}, timeout=0.2) + if done: + break + assert await asyncio.wait_for(result, 10) == "new" + + +def test_a_workflow_reader_start_names_one_place(): + # Checked before the reader needs a running workflow, so a mistake says + # what it is rather than that there is no workflow. + with pytest.raises(ValueError, match="either after= or last="): + workflow.stream_reader(INPUTS, after=END, last=1) + with pytest.raises(ValueError, match="positive"): + workflow.stream_reader(INPUTS, last=0) From 06cfa0182b86bf9ebe4c8f63014ede3cce1de48e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:56:25 -0700 Subject: [PATCH 658/831] Documented the read starts on both accessors and tested an activity stream. --- temporalio/activity.py | 6 ++++-- temporalio/client/_client.py | 5 ++++- tests/streams/test_stream_accessors.py | 22 ++++++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/temporalio/activity.py b/temporalio/activity.py index f790c9bc2..5f7a62373 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -330,8 +330,10 @@ def stream_handle( ``read``, ``latest`` or ``producer`` that names no topic addresses the owner's default topic, :py:data:`temporalio.streams.DEFAULT_TOPIC`, the one :py:func:`temporalio.workflow.stream_reader` and - :py:func:`temporalio.workflow.stream_writer` use without a topic. See - :py:mod:`temporalio.streams`. + :py:func:`temporalio.workflow.stream_writer` use without a topic. A + ``read`` starts at :py:data:`temporalio.streams.BEGINNING`, at + :py:data:`temporalio.streams.END` or at the last ``N`` records with + ``last=N``. See :py:mod:`temporalio.streams`. Like :py:func:`client`, this is only available in ``async def`` activities. diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index c6e6fa241..2e0cc3f3b 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -914,7 +914,10 @@ def get_stream_handle( the one registered with ``plugins=[provider]`` at :py:meth:`connect`, or passed as ``stream_provider``. The handle's ``read``, ``latest`` and ``producer`` take a topic, and without one address the owner's - default topic, :py:data:`temporalio.streams.DEFAULT_TOPIC`. See + default topic, :py:data:`temporalio.streams.DEFAULT_TOPIC`. A + ``read`` starts at :py:data:`temporalio.streams.BEGINNING`, at + :py:data:`temporalio.streams.END` or at the last ``N`` records with + ``last=N``, and resumes only after a cursor it was handed. See :py:mod:`temporalio.streams`. Args: diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py index f25381406..85a1f87c5 100644 --- a/tests/streams/test_stream_accessors.py +++ b/tests/streams/test_stream_accessors.py @@ -22,6 +22,7 @@ from temporalio.streams import ( BEGINNING, DEFAULT_TOPIC, + END, RecordKind, StreamUnsupportedError, topic, @@ -213,3 +214,24 @@ async def test_a_sync_activity_is_told_it_cannot_have_a_handle( ) assert "only available in `async def` activities" in result assert "plugins=" not in result + + +async def test_an_activity_owned_stream_takes_every_read_start( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + stream = registered.get_stream_handle(activity_id=f"act-{uuid.uuid4().hex}") + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + async def first(records: Any) -> Any: + async for record in records: + await records.aclose() + return record.value + return None + + assert await first(stream.read(topic=INPUTS, after=BEGINNING)) == {"n": 1} + assert await first(stream.read(topic=INPUTS, last=1)) == {"n": 3} + at_end = stream.read(topic=INPUTS, after=END) + await producer.append({"n": 4}) + assert await asyncio.wait_for(first(at_end), 10) == {"n": 4} From ad73179de6b35dc044aa44f525cc470747a2ec09 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:59:17 -0700 Subject: [PATCH 659/831] Repinned Core to the subscribe start position and regenerated its protos. The bridge's subscribe command and the server's poll and subscribe inputs carry a start position, so the lang side can ask for the earliest record, the tail or the last N. --- .../streamservice/v1/request_response_pb2.py | 245 +++++++++--------- .../streamservice/v1/request_response_pb2.pyi | 72 ++++- .../workflow_commands_pb2.py | 134 +++++----- .../workflow_commands_pb2.pyi | 27 +- temporalio/bridge/sdk-core | 2 +- 5 files changed, 281 insertions(+), 199 deletions(-) diff --git a/temporalio/api/streamservice/v1/request_response_pb2.py b/temporalio/api/streamservice/v1/request_response_pb2.py index cadc35a7c..0ecfa75c6 100644 --- a/temporalio/api/streamservice/v1/request_response_pb2.py +++ b/temporalio/api/streamservice/v1/request_response_pb2.py @@ -18,6 +18,9 @@ from temporalio.api.common.v1 import ( message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.streamservice.v1 import ( message_pb2 as temporalio_dot_api_dot_stream_dot_v1_dot_message__pb2, ) @@ -26,7 +29,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n/temporalio/api/stream/v1/request_response.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a&temporalio/api/stream/v1/message.proto\x1a+temporalio/api/stream/v1/stream_state.proto\x1a$temporal/api/common/v1/message.proto"\x88\x01\n\x11\x43reateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12M\n\tlifecycle\x18\x03 \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle"$\n\x12\x43reateStreamOutput\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xf5\x01\n\x10\x41\x64\x64MessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\t \x01(\t\x12H\n\x07records\x18\x03 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bproducer_id\x18\x04 \x01(\t\x12\x10\n\x08sequence\x18\x05 \x01(\x03\x12\x17\n\x0f\x65xpected_offset\x18\x06 \x01(\x03\x12\x1b\n\x13use_expected_offset\x18\x08 \x01(\x08J\x04\x08\x07\x10\x08"c\n\x11\x41\x64\x64MessagesOutput\x12\x14\n\x0c\x66irst_offset\x18\x01 \x01(\x03\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x64\x65\x64uplicated\x18\x04 \x01(\x08"O\n\x12\x46inishWritingInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0bproducer_id\x18\x03 \x01(\t"\x15\n\x13\x46inishWritingOutput"\x94\x01\n\x16SubscribeWorkflowInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x06 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x11\n\tstream_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"/\n\x17SubscribeWorkflowOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03"\x9f\x01\n\x11PollMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x07 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x04 \x01(\x05\x12\x0e\n\x06topics\x18\x05 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x06 \x01(\x08"\xdf\x01\n\x12PollMessagesOutput\x12H\n\x07records\x18\x01 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bnext_offset\x18\x02 \x01(\x03\x12\x13\n\x0bhead_offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x0e\n\x06run_id\x18\x06 \x01(\t";\n\x13\x44\x65scribeStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t"\x88\x01\n\x0bStreamOwner\x12H\n\x04kind\x18\x01 \x01(\x0e\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamOwnerKind\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t"\x8b\x02\n\x19PollWorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x05owner\x18\t \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamOwner\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x08 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x04 \x01(\x03\x12\x14\n\x0cmax_messages\x18\x05 \x01(\x05\x12\x0e\n\x06topics\x18\x06 \x03(\t\x12\x19\n\x11wait_new_messages\x18\x07 \x01(\x08"\xb7\x01\n\x1b\x44\x65scribeWorkflowStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x05owner\x18\x05 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamOwner\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x04 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t"\xa5\x02\n\x18\x41\x64\x64WorkflowMessagesInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x05owner\x18\x08 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamOwner\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x07 \x01(\t\x12\x13\n\x0bstream_name\x18\x03 \x01(\t\x12H\n\x07records\x18\x04 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecord\x12\x13\n\x0bproducer_id\x18\x05 \x01(\t\x12\x10\n\x08sequence\x18\x06 \x01(\x03"]\n\x14\x44\x65scribeStreamOutput\x12\x45\n\x05state\x18\x01 \x01(\x0b\x32\x36.temporal.server.chasm.lib.stream.proto.v1.StreamState"i\n\x10\x43loseStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12/\n\x06reason\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"\x13\n\x11\x43loseStreamOutput"T\n\x13TruncateStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x17\n\x0fnew_base_offset\x18\x03 \x01(\x03"\x16\n\x14TruncateStreamOutput"H\n\x11\x44\x65leteStreamInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\r\n\x05\x66orce\x18\x03 \x01(\x08"\x14\n\x12\x44\x65leteStreamOutput"\x83\x01\n\x13\x43reateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CreateStreamInput"p\n\x14\x43reateStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.CreateStreamOutput"\x81\x01\n\x12\x41\x64\x64MessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.AddMessagesInput"n\n\x13\x41\x64\x64MessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x85\x01\n\x14\x46inishWritingRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12W\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.FinishWritingInput"r\n\x15\x46inishWritingResponse\x12Y\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x90\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03"k\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03\x12\x15\n\rstream_absent\x18\x05 \x01(\x08J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutput*\x9d\x01\n\x0fStreamOwnerKind\x12!\n\x1dSTREAM_OWNER_KIND_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTREAM_OWNER_KIND_WORKFLOW\x10\x01\x12\x1e\n\x1aSTREAM_OWNER_KIND_ACTIVITY\x10\x02\x12\'\n#STREAM_OWNER_KIND_WORKFLOW_ACTIVITY\x10\x03\x42>Z.temporal.server.chasm.lib.stream.proto.v1.FinishWritingOutput"\x8d\x01\n\x18SubscribeWorkflowRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12[\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x41.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowInput"z\n\x19SubscribeWorkflowResponse\x12]\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x42.temporal.server.chasm.lib.stream.proto.v1.SubscribeWorkflowOutput"\x83\x01\n\x13PollMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.PollMessagesInput"p\n\x14PollMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x87\x01\n\x15\x44\x65scribeStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamInput"t\n\x16\x44\x65scribeStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\x93\x01\n\x1bPollWorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12^\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.PollWorkflowMessagesInput"x\n\x1cPollWorkflowMessagesResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.PollMessagesOutput"\x97\x01\n\x1d\x44\x65scribeWorkflowStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.DescribeWorkflowStreamInput"|\n\x1e\x44\x65scribeWorkflowStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.DescribeStreamOutput"\xd5\x01\n\x1bRegisterStreamConsumerInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x1c\n\x14\x63onsumer_workflow_id\x18\x03 \x01(\t\x12\x17\n\x0f\x63onsumer_run_id\x18\x05 \x01(\t\x12\x14\n\x0cstart_offset\x18\x04 \x01(\x03\x12\x43\n\x0estart_position\x18\x06 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"k\n\x1cRegisterStreamConsumerOutput\x12\x14\n\x0cstart_offset\x18\x01 \x01(\x03\x12\x12\n\nknown_head\x18\x04 \x01(\x03\x12\x15\n\rstream_absent\x18\x05 \x01(\x08J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"\x80\x01\n\x18\x41\x64vanceConsumerHeadInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x14\n\x0cowner_run_id\x18\x05 \x01(\t\x12\x11\n\tstream_id\x18\x03 \x01(\t\x12\x13\n\x0bhead_offset\x18\x04 \x01(\x03"n\n\x19\x41\x64vanceConsumerHeadOutput\x12\x17\n\x0f\x63onsumer_closed\x18\x01 \x01(\x08\x12\x18\n\x10successor_run_id\x18\x02 \x01(\t\x12\x1e\n\x16successor_start_offset\x18\x03 \x01(\x03"\x91\x01\n\x1a\x41\x64\x64WorkflowMessagesRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AddWorkflowMessagesInput"v\n\x1b\x41\x64\x64WorkflowMessagesResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.AddMessagesOutput"\x97\x01\n\x1dRegisterStreamConsumerRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12`\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x46.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerInput"\x84\x01\n\x1eRegisterStreamConsumerResponse\x12\x62\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32G.temporal.server.chasm.lib.stream.proto.v1.RegisterStreamConsumerOutput"\x91\x01\n\x1a\x41\x64vanceConsumerHeadRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12]\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32\x43.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadInput"~\n\x1b\x41\x64vanceConsumerHeadResponse\x12_\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32\x44.temporal.server.chasm.lib.stream.proto.v1.AdvanceConsumerHeadOutput"\x81\x01\n\x12\x43loseStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.CloseStreamInput"n\n\x13\x43loseStreamResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.CloseStreamOutput"\x87\x01\n\x15TruncateStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12X\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32>.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamInput"t\n\x16TruncateStreamResponse\x12Z\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32?.temporal.server.chasm.lib.stream.proto.v1.TruncateStreamOutput"`\n\x10ListStreamsInput\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"4\n\x0fStreamListEntry\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t"y\n\x11ListStreamsOutput\x12K\n\x07streams\x18\x01 \x03(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x81\x01\n\x12ListStreamsRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12U\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32;.temporal.server.chasm.lib.stream.proto.v1.ListStreamsInput"n\n\x13ListStreamsResponse\x12W\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.ListStreamsOutput"\x83\x01\n\x13\x44\x65leteStreamRequest\x12\x14\n\x0cnamespace_id\x18\x01 \x01(\t\x12V\n\x10\x66rontend_request\x18\x02 \x01(\x0b\x32<.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamInput"p\n\x14\x44\x65leteStreamResponse\x12X\n\x11\x66rontend_response\x18\x01 \x01(\x0b\x32=.temporal.server.chasm.lib.stream.proto.v1.DeleteStreamOutput*\x9d\x01\n\x0fStreamOwnerKind\x12!\n\x1dSTREAM_OWNER_KIND_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSTREAM_OWNER_KIND_WORKFLOW\x10\x01\x12\x1e\n\x1aSTREAM_OWNER_KIND_ACTIVITY\x10\x02\x12\'\n#STREAM_OWNER_KIND_WORKFLOW_ACTIVITY\x10\x03\x42>Z temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """Where to start. Resolved here rather than at delivery, so the first + recorded range starts from a fact instead of a reading. Refused alongside a + non-zero start_offset. + """ def __init__( self, *, @@ -303,7 +313,12 @@ class SubscribeWorkflowInput(google.protobuf.message.Message): stream_name: builtins.str = ..., stream_id: builtins.str = ..., start_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["start_position", b"start_position"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ @@ -313,6 +328,8 @@ class SubscribeWorkflowInput(google.protobuf.message.Message): b"owner_run_id", "start_offset", b"start_offset", + "start_position", + b"start_position", "stream_id", b"stream_id", "stream_name", @@ -347,6 +364,7 @@ class PollMessagesInput(google.protobuf.message.Message): STREAM_ID_FIELD_NUMBER: builtins.int RUN_ID_FIELD_NUMBER: builtins.int FROM_OFFSET_FIELD_NUMBER: builtins.int + START_POSITION_FIELD_NUMBER: builtins.int MAX_MESSAGES_FIELD_NUMBER: builtins.int TOPICS_FIELD_NUMBER: builtins.int WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int @@ -355,6 +373,15 @@ class PollMessagesInput(google.protobuf.message.Message): run_id: builtins.str """Optional, as on AddMessagesInput.""" from_offset: builtins.int + @property + def start_position( + self, + ) -> temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """Where a first poll starts, when the reader has no offset yet. Resolved in + the same read that serves the records, so it cannot race with truncation, + and next_offset carries the result for the polls after it. Refused + alongside a non-zero from_offset. + """ max_messages: builtins.int @property def topics( @@ -375,10 +402,15 @@ class PollMessagesInput(google.protobuf.message.Message): stream_id: builtins.str = ..., run_id: builtins.str = ..., from_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., max_messages: builtins.int = ..., topics: collections.abc.Iterable[builtins.str] | None = ..., wait_new_messages: builtins.bool = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["start_position", b"start_position"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ @@ -390,6 +422,8 @@ class PollMessagesInput(google.protobuf.message.Message): b"namespace", "run_id", b"run_id", + "start_position", + b"start_position", "stream_id", b"stream_id", "topics", @@ -544,6 +578,7 @@ class PollWorkflowMessagesInput(google.protobuf.message.Message): OWNER_RUN_ID_FIELD_NUMBER: builtins.int STREAM_NAME_FIELD_NUMBER: builtins.int FROM_OFFSET_FIELD_NUMBER: builtins.int + START_POSITION_FIELD_NUMBER: builtins.int MAX_MESSAGES_FIELD_NUMBER: builtins.int TOPICS_FIELD_NUMBER: builtins.int WAIT_NEW_MESSAGES_FIELD_NUMBER: builtins.int @@ -556,6 +591,11 @@ class PollWorkflowMessagesInput(google.protobuf.message.Message): stream_name: builtins.str """Empty means the owner's default output stream.""" from_offset: builtins.int + @property + def start_position( + self, + ) -> temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """As on PollMessagesInput.""" max_messages: builtins.int @property def topics( @@ -572,12 +612,17 @@ class PollWorkflowMessagesInput(google.protobuf.message.Message): owner_run_id: builtins.str = ..., stream_name: builtins.str = ..., from_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., max_messages: builtins.int = ..., topics: collections.abc.Iterable[builtins.str] | None = ..., wait_new_messages: builtins.bool = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["owner", b"owner"] + self, + field_name: typing_extensions.Literal[ + "owner", b"owner", "start_position", b"start_position" + ], ) -> builtins.bool: ... def ClearField( self, @@ -592,6 +637,8 @@ class PollWorkflowMessagesInput(google.protobuf.message.Message): b"owner", "owner_run_id", b"owner_run_id", + "start_position", + b"start_position", "stream_name", b"stream_name", "topics", @@ -1298,6 +1345,7 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): CONSUMER_WORKFLOW_ID_FIELD_NUMBER: builtins.int CONSUMER_RUN_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int + START_POSITION_FIELD_NUMBER: builtins.int namespace: builtins.str stream_id: builtins.str consumer_workflow_id: builtins.str @@ -1307,9 +1355,16 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): """ consumer_run_id: builtins.str start_offset: builtins.int - """Negative means from wherever the stream is when the pin is taken. Resolved - here, where the frontier is, and returned so the cursor records a fact. + """An absolute offset, read only when start_position is unset. A negative + value is refused. """ + @property + def start_position( + self, + ) -> temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """Resolved here, where the frontier is, and returned as start_offset on the + output so the cursor records a fact. + """ def __init__( self, *, @@ -1318,7 +1373,12 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): consumer_workflow_id: builtins.str = ..., consumer_run_id: builtins.str = ..., start_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["start_position", b"start_position"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ @@ -1330,6 +1390,8 @@ class RegisterStreamConsumerInput(google.protobuf.message.Message): b"namespace", "start_offset", b"start_offset", + "start_position", + b"start_position", "stream_id", b"stream_id", ], diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 89f3816fa..1a0dc2cd5 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"B\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x93\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12#\n\x1binclude_arguments_in_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xc2\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x42\t\n\x07variant"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x87\x01\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x93\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12#\n\x1binclude_arguments_in_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -511,74 +511,74 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9028 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9116 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9098 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9186 _WORKFLOWCOMMAND._serialized_start = 556 _WORKFLOWCOMMAND._serialized_end = 2798 _APPENDSTREAMRECORDS._serialized_start = 2800 _APPENDSTREAMRECORDS._serialized_end = 2897 - _SUBSCRIBESTREAM._serialized_start = 2899 - _SUBSCRIBESTREAM._serialized_end = 2965 - _STARTTIMER._serialized_start = 2967 - _STARTTIMER._serialized_end = 3050 - _CANCELTIMER._serialized_start = 3052 - _CANCELTIMER._serialized_end = 3078 - _SCHEDULEACTIVITY._serialized_start = 3081 - _SCHEDULEACTIVITY._serialized_end = 3905 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3826 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3905 - _SCHEDULELOCALACTIVITY._serialized_start = 3908 - _SCHEDULELOCALACTIVITY._serialized_end = 4695 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3826 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3905 - _REQUESTCANCELACTIVITY._serialized_start = 4697 - _REQUESTCANCELACTIVITY._serialized_end = 4733 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4735 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4776 - _QUERYRESULT._serialized_start = 4779 - _QUERYRESULT._serialized_end = 4935 - _QUERYSUCCESS._serialized_start = 4937 - _QUERYSUCCESS._serialized_end = 5002 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 5004 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5080 - _FAILWORKFLOWEXECUTION._serialized_start = 5082 - _FAILWORKFLOWEXECUTION._serialized_end = 5156 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5159 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6073 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5916 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5992 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 - _CANCELWORKFLOWEXECUTION._serialized_start = 6075 - _CANCELWORKFLOWEXECUTION._serialized_end = 6151 - _SETPATCHMARKER._serialized_start = 6153 - _SETPATCHMARKER._serialized_end = 6207 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6210 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7384 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5916 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5992 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7386 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7460 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7463 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7605 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7608 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8007 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3826 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3905 - _CANCELSIGNALWORKFLOW._serialized_start = 8009 - _CANCELSIGNALWORKFLOW._serialized_end = 8044 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8046 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8147 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8149 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8228 - _UPDATERESPONSE._serialized_start = 8231 - _UPDATERESPONSE._serialized_end = 8441 - _SCHEDULENEXUSOPERATION._serialized_start = 8444 - _SCHEDULENEXUSOPERATION._serialized_end = 8982 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8932 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8982 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8984 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9026 + _SUBSCRIBESTREAM._serialized_start = 2900 + _SUBSCRIBESTREAM._serialized_end = 3035 + _STARTTIMER._serialized_start = 3037 + _STARTTIMER._serialized_end = 3120 + _CANCELTIMER._serialized_start = 3122 + _CANCELTIMER._serialized_end = 3148 + _SCHEDULEACTIVITY._serialized_start = 3151 + _SCHEDULEACTIVITY._serialized_end = 3975 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3896 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3975 + _SCHEDULELOCALACTIVITY._serialized_start = 3978 + _SCHEDULELOCALACTIVITY._serialized_end = 4765 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3896 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3975 + _REQUESTCANCELACTIVITY._serialized_start = 4767 + _REQUESTCANCELACTIVITY._serialized_end = 4803 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4805 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4846 + _QUERYRESULT._serialized_start = 4849 + _QUERYRESULT._serialized_end = 5005 + _QUERYSUCCESS._serialized_start = 5007 + _QUERYSUCCESS._serialized_end = 5072 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 5074 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5150 + _FAILWORKFLOWEXECUTION._serialized_start = 5152 + _FAILWORKFLOWEXECUTION._serialized_end = 5226 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5229 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6143 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5986 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 6062 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3896 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3975 + _CANCELWORKFLOWEXECUTION._serialized_start = 6145 + _CANCELWORKFLOWEXECUTION._serialized_end = 6221 + _SETPATCHMARKER._serialized_start = 6223 + _SETPATCHMARKER._serialized_end = 6277 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6280 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7454 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3896 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3975 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5986 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 6062 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7456 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7530 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7533 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7675 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7678 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8077 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3896 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3975 + _CANCELSIGNALWORKFLOW._serialized_start = 8079 + _CANCELSIGNALWORKFLOW._serialized_end = 8114 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8116 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8217 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8219 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8298 + _UPDATERESPONSE._serialized_start = 8301 + _UPDATERESPONSE._serialized_end = 8511 + _SCHEDULENEXUSOPERATION._serialized_start = 8514 + _SCHEDULENEXUSOPERATION._serialized_end = 9052 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 9002 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 9052 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 9054 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9096 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index d388f3b26..1761eabc1 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -436,6 +436,7 @@ class SubscribeStream(google.protobuf.message.Message): STREAM_NAME_OR_ID_FIELD_NUMBER: builtins.int START_OFFSET_FIELD_NUMBER: builtins.int + START_POSITION_FIELD_NUMBER: builtins.int stream_name_or_id: builtins.str """Stream to consume, named either way round: a stream this workflow owns by the name it appends under, a stream in another execution by its id. @@ -445,21 +446,37 @@ class SubscribeStream(google.protobuf.message.Message): is how a reader subscribes before the first record is written. """ start_offset: builtins.int - """Where to start, as an absolute offset. Any negative value means the head - of the stream as of registration, and they all mean the same thing. The - server resolves it and records the result, so replay does not resolve it - again. + """Where to start, as an absolute offset. Read only when start_position is + unset. The server refuses a negative value. """ + @property + def start_position( + self, + ) -> temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """Where to start: an offset, the earliest record held, the tail, or the + last N records. The server resolves it and records the resulting offset, + so replay does not resolve it again and Core does not keep it. + """ def __init__( self, *, stream_name_or_id: builtins.str = ..., start_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["start_position", b"start_position"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ - "start_offset", b"start_offset", "stream_name_or_id", b"stream_name_or_id" + "start_offset", + b"start_offset", + "start_position", + b"start_position", + "stream_name_or_id", + b"stream_name_or_id", ], ) -> None: ... diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index a0fb9f544..adb29aecb 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit a0fb9f5448d0a28540a630dd0010ab1b61d76a06 +Subproject commit adb29aecbe1c8598e0d7e61981219219a49e5ce1 From cf139591676c5e6fe6acf1e4d6c786acd9c2d964 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 17:02:04 -0700 Subject: [PATCH 660/831] Let a first read on the stream client name a start position. A reader with no offset had to send zero, which a truncated stream refuses. The first poll now carries the position and later polls continue from the offset it returns; truncate() is there so a caller and the tests can reach a truncated stream. --- temporalio/client_stream.py | 57 +++++++++++++++++++++++++++---- tests/test_client_stream.py | 50 ++++++++++++++++++++++++++- tests/test_client_stream_owner.py | 13 ++++++- 3 files changed, 112 insertions(+), 8 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 939d29a88..30c3de995 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -42,7 +42,7 @@ from google.protobuf.message import Message import temporalio.api.streamservice.v1 as stream -from temporalio.api.stream.v1 import StreamRecord +from temporalio.api.stream.v1 import StreamRecord, StreamStartPosition from temporalio.api.streamservice.v1 import service_pb2_grpc from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import StreamNotFoundError, StreamProducerError @@ -364,6 +364,7 @@ async def read( self, *, from_offset: int = 0, + start: StreamStartPosition | None = None, max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, @@ -371,12 +372,21 @@ async def read( """Read once from ``from_offset``, returning the entries and the offset to read from next. + A reader with no offset yet passes ``start`` instead: the oldest + record held, the tail, or the last N records. The server resolves it + in the same read, so it cannot race with truncation, and the offset + returned is where to continue. Passing both is refused. + With ``wait`` set, blocks until something arrives, the stream closes, or the server's long-poll window elapses. A window that elapses returns an empty list rather than raising, so the caller just reads again. """ page = await self.poll( - from_offset=from_offset, max_records=max_records, topics=topics, wait=wait + from_offset=from_offset, + start=start, + max_records=max_records, + topics=topics, + wait=wait, ) return page.entries, page.next_offset @@ -384,9 +394,10 @@ async def follow( self, *, from_offset: int = 0, + start: StreamStartPosition | None = None, topics: Sequence[str] = (), ) -> AsyncIterator[StreamEntry]: - """Yield entries as they arrive, starting at ``from_offset``. + """Yield entries as they arrive, starting at ``from_offset`` or ``start``. Ends once the stream is closed and this reader has drained it. A closed stream stays readable until its retention expires, so a reader that @@ -395,7 +406,10 @@ async def follow( """ offset = from_offset while True: - page = await self.poll(from_offset=offset, topics=topics) + page = await self.poll(from_offset=offset, start=start, topics=topics) + # The first page carries where the start resolved to, and every + # later poll continues from the offset it handed back. + start = None for entry in page.entries: yield entry offset = page.next_offset @@ -406,6 +420,7 @@ async def poll( self, *, from_offset: int = 0, + start: StreamStartPosition | None = None, topics: Sequence[str] = (), max_records: int = 0, wait: bool = True, @@ -419,6 +434,7 @@ async def poll( stream_id=self._id, run_id=self._run_id, from_offset=from_offset, + start_position=start, max_messages=max_records, topics=list(topics), wait_new_messages=wait, @@ -427,6 +443,24 @@ async def poll( ) return _page(response.frontend_response) + async def truncate(self, new_base_offset: int) -> None: + """Drop every record below ``new_base_offset``. + + A reader that asks for an offset below it is refused. One that has no + offset yet and wants the oldest record left asks for + ``StreamStartPosition(earliest=True)`` rather than offset zero. + """ + await _call( + self._stub.TruncateStream, + stream.TruncateStreamRequest( + frontend_request=stream.TruncateStreamInput( + namespace=self._namespace, + stream_id=self._id, + new_base_offset=new_base_offset, + ) + ), + ) + async def finish_writing(self, producer_id: str) -> None: """Declare one producer done without ending the stream for others.""" await _call( @@ -581,13 +615,18 @@ async def read( self, *, from_offset: int = 0, + start: StreamStartPosition | None = None, max_records: int = 0, topics: Sequence[str] = (), wait: bool = False, ) -> tuple[list[StreamEntry], int]: """Read once from ``from_offset``, as :meth:`StreamHandle.read`.""" page = await self.poll( - from_offset=from_offset, max_records=max_records, topics=topics, wait=wait + from_offset=from_offset, + start=start, + max_records=max_records, + topics=topics, + wait=wait, ) return page.entries, page.next_offset @@ -595,12 +634,16 @@ async def follow( self, *, from_offset: int = 0, + start: StreamStartPosition | None = None, topics: Sequence[str] = (), ) -> AsyncIterator[StreamEntry]: """Yield entries as they arrive, as :meth:`StreamHandle.follow`.""" offset = from_offset while True: - page = await self.poll(from_offset=offset, topics=topics) + page = await self.poll(from_offset=offset, start=start, topics=topics) + # The first page carries where the start resolved to, and every + # later poll continues from the offset it handed back. + start = None for entry in page.entries: yield entry offset = page.next_offset @@ -611,6 +654,7 @@ async def poll( self, *, from_offset: int = 0, + start: StreamStartPosition | None = None, topics: Sequence[str] = (), max_records: int = 0, wait: bool = True, @@ -629,6 +673,7 @@ async def poll( **self._owner(), stream_name=self._name, from_offset=from_offset, + start_position=start, max_messages=max_records, topics=list(topics), wait_new_messages=wait, diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index ddd5ae76c..89abb0559 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -19,7 +19,11 @@ import pytest from temporalio.api.common.v1 import Payload -from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind +from temporalio.api.stream.v1 import ( + StreamRecord, + StreamRecordKind, + StreamStartPosition, +) from temporalio.client_stream import StreamClient, StreamHandle from temporalio.service import RPCError from temporalio.streams import StreamNotFoundError, StreamProducerError @@ -216,3 +220,47 @@ async def test_a_producer_conflict_is_a_stream_producer_error( entries, _ = await stream.read() assert data(entries) == [b"one", b"two"] + + +async def test_earliest_reads_from_the_floor_of_a_truncated_stream( + stream: StreamHandle, +) -> None: + await stream.append(rec(b"a"), rec(b"b"), rec(b"c"), rec(b"d")) + await stream.truncate(2) + + # Offset zero is what a reader with no position used to send, and a + # truncated stream no longer holds it. + with pytest.raises(RPCError, match="truncated"): + await stream.read(from_offset=0) + entries, next_offset = await stream.read(start=StreamStartPosition(earliest=True)) + assert data(entries) == [b"c", b"d"] + assert [entry.offset for entry in entries] == [2, 3] + assert next_offset == 4 + + +async def test_last_n_and_tail_resolve_on_the_first_read(stream: StreamHandle) -> None: + await stream.append(rec(b"a"), rec(b"b"), rec(b"c")) + + entries, _ = await stream.read(start=StreamStartPosition(last_n=2)) + assert data(entries) == [b"b", b"c"] + entries, next_offset = await stream.read(start=StreamStartPosition(tail=True)) + assert entries == [] + assert next_offset == 3 + with pytest.raises(RPCError): + await stream.read(from_offset=1, start=StreamStartPosition(earliest=True)) + + +async def test_follow_from_the_tail_skips_what_was_there(stream: StreamHandle) -> None: + await stream.append(rec(b"old")) + following = stream.follow(start=StreamStartPosition(tail=True)) + first = asyncio.ensure_future(following.__anext__()) + try: + for _ in range(100): + await stream.append(rec(b"new")) + done, _ = await asyncio.wait({first}, timeout=0.1) + if done: + break + entry = await asyncio.wait_for(first, 10) + finally: + first.cancel() + assert entry.record.body.data == b"new" diff --git a/tests/test_client_stream_owner.py b/tests/test_client_stream_owner.py index f48b36bbe..a87f9d782 100644 --- a/tests/test_client_stream_owner.py +++ b/tests/test_client_stream_owner.py @@ -11,7 +11,7 @@ from typing import Any import temporalio.api.streamservice.v1 as stream -from temporalio.api.stream.v1 import StreamRecord +from temporalio.api.stream.v1 import StreamRecord, StreamStartPosition from temporalio.client_stream import StreamClient @@ -76,3 +76,14 @@ async def test_a_workflow_activity_is_reached_through_its_workflow(): kind=stream.STREAM_OWNER_KIND_WORKFLOW_ACTIVITY, id="wf", activity_id="act" ) assert request.stream_name == "reasoning" + + +async def test_a_first_read_carries_its_start_position(): + recorder = _Recorder() + handle = _client(recorder).workflow_stream("wf") + await handle.read(start=StreamStartPosition(last_n=3)) + await handle.read(from_offset=4) + first, later = recorder.requests + assert first.start_position == StreamStartPosition(last_n=3) + assert first.from_offset == 0 + assert not later.HasField("start_position") From c8cd5e84ef6f65b7df27cc84afe069d2b5395564 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 17:05:20 -0700 Subject: [PATCH 661/831] Mapped every read start onto the native provider. BEGINNING now asks the server for the earliest record rather than offset zero, which a stream with a raised floor refuses. END and last=N become the tail and last-N positions, resolved by the server on the first poll or at subscription and recorded, so replay never resolves them again. --- temporalio/streams/providers/native.py | 92 +++++++++++++++---- temporalio/worker/_workflow_instance.py | 6 +- temporalio/workflow/_context.py | 21 +++-- tests/streams/test_streams_conformance.py | 3 + tests/worker/test_workflow_stream_e2e.py | 105 +++++++++++++++++++++- 5 files changed, 200 insertions(+), 27 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 8bcf32c04..62a1c8b7a 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -35,8 +35,10 @@ from typing import Any, Generic, TypeVar from temporalio import workflow +from temporalio.api.stream.v1 import StreamStartPosition from temporalio.client import Client, WorkflowHistoryEventFilterType from temporalio.client_stream import ( + Page, StreamClient, WorkflowStreamHandle, close_shared_clients, @@ -46,7 +48,14 @@ from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import StreamCursorError, StreamNotFoundError from temporalio.streams._provider import ReadSource, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -164,18 +173,30 @@ def publish(self, record: WireRecord) -> None: class _NativeWorkflowProvider: """The workflow half: the server's commands and delivered ranges.""" - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: + check_read_start(after, last) _require_topic(topic) run_id = workflow.info().run_id - start = 0 - named = _position(after) - if named is not None: + # The server resolves the position when it registers the subscription + # and records the offset on the subscribed event, so replay never + # resolves it again. + if last is not None: + start = StreamStartPosition(last_n=last) + elif after == END: + start = StreamStartPosition(tail=True) + elif after == BEGINNING: + start = StreamStartPosition(earliest=True) + else: + named = _position(after) + assert named is not None if named[0] != run_id: raise StreamCursorError( f"cursor {after.token!r} names another run; a run's stream is its own" ) - start = named[1] + 1 - workflow._subscribe_stream(topic, start_offset=start) + start = StreamStartPosition(offset=named[1] + 1) + workflow._subscribe_stream(topic, start=start) return _NativeReadSource(topic, run_id) def open_writer(self, topic: str) -> WriteSink: @@ -342,37 +363,63 @@ def read( *, topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + """Yield records on ``topic`` from where the read starts until the chain, or the pinned run, closes. + + ``BEGINNING`` is the oldest record the chain's first retained run + still holds. ``END`` and ``last=`` start on the current run, or the + pinned one: an earlier run of a chain has ended and holds neither the + tail nor the newest records. The server resolves each on the first + poll, in the read that serves it. + """ + check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. - named = _position(after) + named = None if after == END else _position(after) if named is not None and self._run_id is not None and named[0] != self._run_id: raise StreamCursorError( f"cursor {after.token!r} names another run than this handle is pinned to" ) - return self._read(topic, named, after, result_type) + start: StreamStartPosition | None = None + if last is not None: + start = StreamStartPosition(last_n=last) + elif after == END: + start = StreamStartPosition(tail=True) + elif named is None: + start = StreamStartPosition(earliest=True) + return self._read(topic, named, start, after, result_type) async def _read( self, topic: str, named: tuple[str, int] | None, + start: StreamStartPosition | None, after: Cursor, result_type: type | None, ) -> AsyncGenerator[StreamRecord[Any], None]: - decoder = RecordDecoder( - self._converter, result_type, after=after, warn=logger.warning - ) + decoder: RecordDecoder | None = None + offset = 0 if named is not None: run_id, offset = named[0], named[1] + 1 + elif start is not None and start.WhichOneof("position") != "earliest": + run_id = self._run_id or await self._current_run() else: - run_id, offset = self._run_id or await self._first_run(), 0 + run_id = self._run_id or await self._first_run() while True: stream = self._stream(topic, run_id) while True: - page = await stream.poll(from_offset=offset) + page = await stream.poll(from_offset=offset, start=start) + if decoder is None: + decoder = RecordDecoder( + self._converter, + result_type, + after=self._previous(run_id, page, start, after), + warn=logger.warning, + ) + start = None for entry in page.entries: record = await _decode_body(self._codec, entry.record) for out in decoder.decode(_cursor(run_id, entry.offset), record): @@ -389,6 +436,21 @@ async def _read( return run_id, offset = successor, 0 + @staticmethod + def _previous( + run_id: str, page: Page, start: StreamStartPosition | None, after: Cursor + ) -> Cursor: + """The position before the first record a read yields. + + A synthesized record is positioned there. After ``END`` or ``last=`` + it is only known once the server resolved the start, from the first + page. It names a run so a chain-following resume stays on this one. + """ + if start is None or start.WhichOneof("position") == "earliest": + return after + first = page.entries[0].offset if page.entries else page.next_offset + return _cursor(run_id, first - 1) + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The cursor of the newest record on ``topic``, naming the run it was read from. diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index c31bc9dc4..86d4922d1 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -1510,7 +1510,9 @@ def get_info(self) -> temporalio.workflow.Info: return self._info def workflow_subscribe_stream( - self, stream_name_or_id: str, start_offset: int + self, + stream_name_or_id: str, + start: temporalio.api.stream.v1.StreamStartPosition, ) -> None: # Reissued on every replay, so the buffer has to exist before the first # range arrives and the command has to be harmless the second time. A @@ -1520,7 +1522,7 @@ def workflow_subscribe_stream( ) command = self._add_command() command.subscribe_stream.stream_name_or_id = stream_name_or_id - command.subscribe_stream.start_offset = start_offset + command.subscribe_stream.start_position.CopyFrom(start) def workflow_append_stream_records( self, diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index ef5c6016e..d9fe9b051 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -325,7 +325,9 @@ def workflow_get_current_deployment_version( @abstractmethod def workflow_subscribe_stream( - self, stream_name_or_id: str, start_offset: int + self, + stream_name_or_id: str, + start: temporalio.api.stream.v1.StreamStartPosition, ) -> None: ... @abstractmethod @@ -1049,7 +1051,9 @@ async def sleep( def _subscribe_stream( # type: ignore[reportUnusedFunction] - stream_name_or_id: str, *, start_offset: int = 0 + stream_name_or_id: str, + *, + start: temporalio.api.stream.v1.StreamStartPosition | None = None, ) -> None: """Subscribe this workflow to a server-side stream. @@ -1059,7 +1063,7 @@ def _subscribe_stream( # type: ignore[reportUnusedFunction] cursor, though it does write one event. Calling it on every replay is harmless because replay matches the command to the event already recorded. - Only the name or id and the start offset go to the server. The rest of the + Only the name or id and the start position go to the server. The rest of the stream's addressing is resolved there, because a workflow cannot look it up without doing I/O and a value it carried would be a reading rather than a fact. A name this workflow has not written yet names a stream it owns, and @@ -1069,11 +1073,14 @@ def _subscribe_stream( # type: ignore[reportUnusedFunction] stream_name_or_id: Stream to consume: the name of one this workflow owns, or the id of a standalone stream. The server tries them in that order. - start_offset: Where to start. Negative means from wherever the stream is - when the subscription is registered; the server resolves that once - and records it, so replay does not resolve it again. + start: Where to start: an absolute offset, the oldest record the + stream holds, the tail as of registration, or the last N records. + Omitted, it is the oldest record held. The server resolves it + once and records the offset, so replay does not resolve it again. """ - _Runtime.current().workflow_subscribe_stream(stream_name_or_id, start_offset) + if start is None: + start = temporalio.api.stream.v1.StreamStartPosition(earliest=True) + _Runtime.current().workflow_subscribe_stream(stream_name_or_id, start) def _append_stream_records( # type: ignore[reportUnusedFunction] diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index e6d544df8..52261c61c 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -144,6 +144,9 @@ async def host(workflow_id: str) -> None: StreamHost.run, id=workflow_id, task_queue=worker.task_queue ) + # No truncate hook: a stream a workflow owns has no truncation call. + # BEGINNING on a truncated stream is covered on the stream client, + # whose standalone streams can be truncated. yield ProviderCase("native", provider, client, host=host) for handle in hosts.values(): await handle.terminate() diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 5dc15dd4f..e2ca2d9da 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -27,7 +27,7 @@ from temporalio.api.stream.v1 import StreamRecord from temporalio.client import Client from temporalio.client_stream import StreamClient -from temporalio.streams import RecordKind +from temporalio.streams import END, RecordKind from temporalio.streams.providers.native import NativeStreams from temporalio.worker import Worker from tests.streams.test_streams_conformance import take @@ -277,7 +277,7 @@ async def run(self) -> list[str]: workflow._append_stream_records([_record(b"gamma")], stream_name="output") # A name this workflow has not written yet still names a stream it # owns, so subscribing creates the one the later publish lands in. - workflow._subscribe_stream("output", start_offset=0) + workflow._subscribe_stream("output") received: list[str] = [] while len(received) < 3: @@ -331,7 +331,7 @@ class ConsumeAcrossTasks: @workflow.run async def run(self, stream_id: str, expected: int) -> list[str]: - workflow._subscribe_stream(stream_id, start_offset=0) + workflow._subscribe_stream(stream_id) seen: list[str] = [] while len(seen) < expected: for item in await workflow._read_stream_records(stream_id): @@ -384,3 +384,102 @@ async def test_a_cached_workflow_consumes_across_sticky_tasks() -> None: ) finally: await streams.close() + + +@workflow.defn +class StartsWhenTold: + """Subscribes to ``inputs`` at a start given by a signal and returns what it read.""" + + def __init__(self) -> None: + self._start: str | None = None + + @workflow.signal + def begin(self, start: str) -> None: + self._start = start + + @workflow.run + async def run(self) -> list[Any]: + await workflow.wait_condition(lambda: self._start is not None) + if self._start == "end": + reader = workflow.stream_reader(INPUTS, result_type=dict, after=END) + want = 1 + else: + reader = workflow.stream_reader(INPUTS, result_type=dict, last=2) + want = 2 + values: list[Any] = [] + async for value in reader.values(): + values.append(value["n"]) + if len(values) == want: + break + return values + + +async def _subscribed_offsets(client: Client, workflow_id: str) -> list[int]: + return [ + event.workflow_stream_subscribed_event_attributes.start_offset + async for event in client.get_workflow_handle( + workflow_id + ).fetch_history_events() + if event.event_type == EVENT_STREAM_SUBSCRIBED + ] + + +async def test_a_workflow_reader_starts_at_the_last_n_records_on_the_server() -> None: + provider = NativeStreams() + client = await _connect(provider) + task_queue = "last-tq-" + uuid.uuid4().hex[:8] + workflow_id = "last-wf-" + uuid.uuid4().hex[:8] + try: + # Cold, so every task replays and the recorded start is what places + # the reader, not a second resolution. + async with Worker( + client, + task_queue=task_queue, + workflows=[StartsWhenTold], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + StartsWhenTold.run, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + await handle.signal(StartsWhenTold.begin, "last") + assert await asyncio.wait_for(handle.result(), 60) == [3, 4] + assert await _subscribed_offsets(client, workflow_id) == [2] + finally: + await provider.close() + + +async def test_a_workflow_reader_at_end_skips_what_was_there_on_the_server() -> None: + provider = NativeStreams() + client = await _connect(provider) + task_queue = "end-tq-" + uuid.uuid4().hex[:8] + workflow_id = "end-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[StartsWhenTold], + max_cached_workflows=0, + ): + handle = await client.start_workflow( + StartsWhenTold.run, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": "old"}, {"n": "old"}) + await handle.signal(StartsWhenTold.begin, "end") + result = asyncio.ensure_future(handle.result()) + # The subscription registers when the signalled task completes, + # which the test does not observe, so appends keep coming. + for _ in range(150): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({result}, timeout=0.2) + if done: + break + assert await asyncio.wait_for(result, 60) == ["new"] + offsets = await _subscribed_offsets(client, workflow_id) + assert len(offsets) == 1 and offsets[0] >= 2 + finally: + await provider.close() From 02862047b392b6c03ec13f979eaef5ff3ce842ff Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 17:07:31 -0700 Subject: [PATCH 662/831] Tested a pinned read of a reset run from BEGINNING. --- tests/worker/test_workflow_stream_e2e.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 308755616..60ef16139 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -890,6 +890,13 @@ async def test_a_reset_run_is_followed_and_replayed() -> None: latest = await client.get_stream_handle(workflow_id).latest(topic=INPUTS) assert latest.token == f"native:{reset_run}:3" + # Pinned to the reset run, BEGINNING is the floor its inherited + # stream starts at. Offset zero, which it never held, is refused. + from_floor = await asyncio.wait_for( + _collect(client, workflow_id, INPUTS, reset_run), 30 + ) + assert from_floor == [({"n": 4}, reset_run, 2), (None, reset_run, 3)] + # The reset run's history: the base run's events, the reset marker # naming both runs, then its own. The replayer fetches the first era # from the base run's stream and the rest from the reset run's. From 7ef3bc6a1c90cb38ad41eec247744569456ae028 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 17:18:53 -0700 Subject: [PATCH 663/831] Mapped END and last=N onto the workflow_streams provider. The log is workflow state, so the workflow half resolves both against it and replay lands on the same offset. Outside, a Query on the run answers where the read starts, and the conformance setup can truncate the log so BEGINNING is checked against a raised base. --- .../streams/providers/workflow_streams.py | 115 ++++++++++++++++-- tests/streams/test_streams_conformance.py | 38 +++++- .../streams/test_workflow_streams_provider.py | 58 +++++++++ 3 files changed, 200 insertions(+), 11 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 3bc8f008b..d989240c6 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -85,7 +85,14 @@ StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -109,6 +116,7 @@ _PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" _LATEST_QUERY = "__temporal_streams_latest" +_START_QUERY = "__temporal_streams_start" _ENCODING = b"binary/plain" # The same cap the shipped poll path answers under, because both are one # response through the same server. @@ -182,6 +190,8 @@ def __init__(self, stream: WorkflowStream | None = None) -> None: workflow.set_query_handler(_TAIL_QUERY, self._tail) if workflow.get_query_handler(_LATEST_QUERY) is None: workflow.set_query_handler(_LATEST_QUERY, self._latest) + if workflow.get_query_handler(_START_QUERY) is None: + workflow.set_query_handler(_START_QUERY, self._start) def _tail(self, from_offset: int, topic: str) -> dict[str, Any]: """One page of ``topic``'s items at or past ``from_offset``. @@ -221,6 +231,33 @@ def _latest(self, topic: str) -> int: return offset return -1 + def _start(self, topic: str, last_n: int) -> int: + """Where a read starts: the log's head, or ``topic``'s newest ``last_n`` records. + + Zero ``last_n`` asks for the head, which is where ``END`` starts. + """ + return start_offset(self.stream, topic, last_n) + + +def start_offset(stream: WorkflowStream, topic: str, last_n: int) -> int: + """The log offset a read of ``topic`` starts at. + + ``last_n`` of zero is the head of the log, so only what is published next + is read. Otherwise it is the offset of ``topic``'s ``last_n``-th newest + item, or the oldest one the log holds when there are fewer. The log is + workflow state, so the workflow half answers the same on every replay. + """ + if last_n <= 0: + return stream.next_offset + items = stream.items_from(0) + seen = 0 + for offset, item_topic, _ in reversed(items): + if item_topic == topic: + seen += 1 + if seen == last_n: + return offset + return items[0][0] if items else stream.next_offset + def _registered_stream() -> WorkflowStream | None: handler = workflow.get_signal_handler(PUBLISH_SIGNAL_NAME) @@ -309,10 +346,25 @@ def _own_stream(self) -> WorkflowStream: self._stream = _instance().stream return self._stream - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: + check_read_start(after, last) _require_topic(topic) run_id = workflow.info().run_id start = 0 + # The log is workflow state, so END and last= resolve against it here + # and land on the same offset on every replay. + if last is not None: + return _WSReadSource( + self._own_stream(), + topic, + start_offset(self._own_stream(), topic, last), + run_id, + ) + if after == END: + stream = self._own_stream() + return _WSReadSource(stream, topic, stream.next_offset, run_id) named = _position(after) if named is not None: if named[0] != run_id: @@ -491,33 +543,46 @@ def read( *, topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + """Yield records on ``topic`` from where the read starts until the chain, or the pinned run, closes. + + ``BEGINNING`` is the oldest item the first retained run's log still + holds: the poll Update reads offset zero as the log's base. ``END`` + and ``last=`` start on the current run, or the pinned one, at an + offset its workflow answers by Query when the read starts. + """ + check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. - named = _position(after) + named = None if after == END else _position(after) if named is not None and self._run_id is not None and named[0] != self._run_id: raise StreamCursorError( f"cursor {after.token!r} names another run than this handle is pinned to" ) - return self._read(topic, named, after, result_type) + return self._read(topic, named, after, last, result_type) async def _read( self, topic: str, named: tuple[str, int] | None, after: Cursor, + last: int | None, result_type: type | None, ) -> AsyncGenerator[StreamRecord[Any], None]: - decoder = RecordDecoder( - self._converter, result_type, after=after, warn=logger.warning - ) if named is not None: run_id, offset = named[0], named[1] + 1 + elif last is not None or after == END: + run_id, offset = await self._start_on_current_run(topic, last or 0) + # A synthesized record is positioned before the first one read. + after = _cursor(run_id, offset - 1) else: run_id, offset = self._run_id or await self._first_run(), 0 + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) while True: handle = self._handle(run_id) next_offset = offset @@ -726,6 +791,40 @@ async def _tail( ] return items, wire["next_offset"], bool(wire["more_ready"]) + async def _start_on_current_run(self, topic: str, last_n: int) -> tuple[str, int]: + """The run a read at ``END`` or of the newest records starts on, and the offset. + + Raises: + StreamUnsupportedError: The workflow's worker runs a provider that + predates these reads and cannot answer where they start. + """ + handle = self._handle(self._run_id) + description = await self._describe(handle) + if description is None: + raise StreamNotFoundError(f"workflow {self._workflow_id!r} was not found") + run_id = description.run_id + assert run_id is not None + try: + offset = await self._handle(run_id).query( + _START_QUERY, args=[topic, last_n], result_type=int + ) + except WorkflowQueryFailedError as error: + if QUERY_HANDLER_NOT_FOUND not in str(error): + raise StreamError( + f"the start query on workflow {self._workflow_id!r} failed: {error}" + ) from error + raise StreamUnsupportedError( + f"workflow {self._workflow_id!r} does not answer where a read at END " + "or of the last records starts; its worker's provider predates them" + ) from error + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + return run_id, offset + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The newest position holding a record on ``topic``. diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 787297409..979ff8c33 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -54,6 +54,7 @@ Supersession, topic, ) +from temporalio.streams.providers import workflow_streams from temporalio.streams.providers.memory import MemoryStreams from temporalio.streams.providers.native import NativeStreams from temporalio.streams.providers.redis import RedisStreams @@ -131,6 +132,27 @@ async def run(self) -> None: await workflow.wait_condition(lambda: self._released) +@workflow.defn +class TruncatingStreamHost: + """A stream host whose log an update can truncate, the way a workflow's retention would.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.update + def truncate(self, topic: str, keep: int) -> None: + stream = workflow_streams._instance().stream # pyright: ignore[reportPrivateUsage] + stream.truncate(workflow_streams.start_offset(stream, topic, keep)) + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + @workflow.defn class DefaultTopicAnswer: """Reads one value on its default topic and answers on the same topic.""" @@ -153,14 +175,21 @@ async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: config["plugins"] = [provider] client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost, DefaultTopicAnswer) as worker: + async with new_worker(client, TruncatingStreamHost, DefaultTopicAnswer) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: hosts[workflow_id] = await client.start_workflow( - StreamHost.run, id=workflow_id, task_queue=worker.task_queue + TruncatingStreamHost.run, + id=workflow_id, + task_queue=worker.task_queue, ) + async def truncate(workflow_id: str, topic: str, keep: int) -> None: + await hosts[workflow_id].execute_update( + TruncatingStreamHost.truncate, args=[topic, keep] + ) + yield ProviderCase( "workflow_streams", provider, @@ -172,6 +201,7 @@ async def host(workflow_id: str) -> None: detects_divergent_retries=False, host=host, task_queue=worker.task_queue, + truncate=truncate, ) for handle in hosts.values(): await handle.terminate() @@ -673,8 +703,10 @@ async def test_beginning_starts_at_the_oldest_record_still_held(case: ProviderCa assert [r.value for r in records] == [{"n": 3}, {"n": 4}] newest = await take(stream.read(topic=OUT, last=3), 2) assert [r.value for r in newest] == [{"n": 3}, {"n": 4}] + # A cursor below the floor is refused. A provider that needs a round trip + # to know says so on the first step rather than on the call. with pytest.raises(StreamCursorError): - stream.read(topic=OUT, after=before[0].cursor) + await take(stream.read(topic=OUT, after=before[0].cursor), 1) async def test_a_read_start_names_one_place(case: ProviderCase): diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index e520936d0..ef79614f6 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -31,6 +31,7 @@ from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( BEGINNING, + END, RecordKind, StreamCursorError, StreamError, @@ -623,3 +624,60 @@ async def test_the_dedupe_sequence_names_where_the_records_end(): # the retry's re-split reaches past it, and only the new record does. assert _sequences(first.sent) == [(3, [1, 2])] assert _sequences(second.sent) == [(2, [1]), (3, [2]), (4, [3])] + + +@workflow.defn +class StartsWhenTold: + """Opens a reader on ``inputs`` at the start a signal names and returns what it read.""" + + def __init__(self) -> None: + self._start: str | None = None + + @workflow.signal + def begin(self, start: str) -> None: + self._start = start + + @workflow.run + async def run(self) -> list[Any]: + await workflow.wait_condition(lambda: self._start is not None) + if self._start == "end": + reader = workflow.stream_reader(INPUTS, result_type=dict, after=END) + want = 1 + else: + reader = workflow.stream_reader(INPUTS, result_type=dict, last=2) + want = 2 + values: list[Any] = [] + async for value in reader.values(): + values.append(value["n"]) + if len(values) == want: + break + return values + + +async def test_a_workflow_reader_starts_at_end_or_the_newest_records( + client: Client, provider: WorkflowStreamsProvider +): + # The log is workflow state, so both starts resolve against it on the + # workflow thread; a cold cache replays every task and has to land the + # reader on the same offset each time. + async with new_worker( + client, StartsWhenTold, plugins=[provider], max_cached_workflows=0 + ) as worker: + for start, expected in (("last", [3, 4]), ("end", ["new"])): + handle = await client.start_workflow( + StartsWhenTold.run, + id=f"ws-start-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + stream = provider.get_stream_handle(client, handle.id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + await handle.signal(StartsWhenTold.begin, start) + result = asyncio.ensure_future(handle.result()) + if start == "end": + for _ in range(150): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({result}, timeout=0.2) + if done: + break + assert await asyncio.wait_for(result, 30) == expected From 561758f7345d0a7dba57d8f4ca9547c810723241 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 17:18:53 -0700 Subject: [PATCH 664/831] Mapped END and last=N onto outside Redis reads, and refused them inside. Outside, both resolve against the committed prefix when the read starts. The transport records where a workflow subscription starts and cannot find the tail without a store read on the workflow thread, so a workflow reader raises StreamUnsupportedError. --- temporalio/streams/providers/redis.py | 95 ++++++++++++++++++++++++--- tests/streams/test_redis_provider.py | 21 +++++- 2 files changed, 106 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 5b86014b5..0d25b5082 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -37,6 +37,14 @@ batch limits are lifted for this provider, because a synchronous publish cannot wait for the worker to stage a full batch; a batch it cannot stage fails the task. +- A read starts at ``BEGINNING``, which is the oldest entry the trim left, at + ``END``, the committed tail when the read starts, or at the last ``N`` + committed records, found by scanning the committed prefix. A workflow + reader takes ``BEGINNING`` or a cursor only: the transport records where a + subscription starts, and resolving the tail or the newest records needs a + store read the workflow thread cannot make and nothing would record, so + ``END`` and ``last=`` there raise + :class:`temporalio.streams.StreamUnsupportedError`. - Retention is trimming, with no consumer floor. When ``retention`` or ``max_len`` is set, every append the provider makes trims the key it wrote, whatever any reader has reached. A replay that reaches a recorded range the @@ -50,6 +58,7 @@ import logging import re import time +from collections import deque from collections.abc import AsyncGenerator, Coroutine, Sequence from datetime import timedelta from typing import Any, Final, Generic, NoReturn, TypeVar @@ -76,6 +85,9 @@ from temporalio.contrib.external_workflow_streams import ( BEGINNING as TRANSPORT_BEGINNING, ) +from temporalio.contrib.external_workflow_streams import ( + Cursor as TransportCursor, +) from temporalio.contrib.external_workflow_streams import ( RecordKind as TransportRecordKind, ) @@ -117,7 +129,14 @@ StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -470,8 +489,18 @@ class _RedisWorkflowProvider: def __init__(self, idle_timeout: timedelta) -> None: self._input = external_stream.with_options(idle_timeout=idle_timeout) - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: + check_read_start(after, last) _require_topic(topic) + if last is not None or after == END: + raise StreamUnsupportedError( + "the redis provider cannot start a workflow reader at END or at the " + "last records: the transport starts a subscription at a cursor the " + "workflow names or where its predecessor committed, and finding the " + "tail is a store read the workflow thread cannot make" + ) position = _workflow_position(after) # Without a position the transport resumes where the chain's # predecessor run committed; with one, that is where the wait starts @@ -492,6 +521,33 @@ async def on_workflow_finish(self) -> None: pass +async def _start_cursor( + backend: RedisStreamBackend, key: StreamKey, last: int | None +) -> TransportCursor: + """Where an outside read at ``END``, or of the newest ``last`` records, starts. + + Both come from the committed prefix, so a staged batch whose task has not + settled is not counted, and neither is a fence or an aborted stage. + """ + if last is None: + return await backend.output_tail(key) + newest: deque[Offset] = deque(maxlen=last + 1) + cursor = TRANSPORT_BEGINNING + while True: + result = await backend.read_output_after( + key, cursor, max_records=256, block=timedelta(0) + ) + for placed in result.records: + cursor = AFTER(placed.offset) + if placed.kind is TransportRecordKind.DATA: + newest.append(placed.offset) + if result.pending is not None or not result.records: + break + if len(newest) <= last: + return TRANSPORT_BEGINNING + return AFTER(newest[0]) + + async def _chain(client: Client, workflow_id: str) -> WorkflowChainKey: try: description = await client.get_workflow_handle(workflow_id).describe() @@ -763,9 +819,13 @@ def read( *, topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes. + """Yield records on ``topic`` from where the read starts until the chain, or the pinned run, closes. + + ``END`` and ``last=`` are resolved on the first step, against the + committed records: ``last=`` scans the committed prefix to find them. Two refusals and they do not land together. A cursor another provider minted, or one naming the workflow's own input log, is refused by this call: reading @@ -778,25 +838,39 @@ def read( StreamCursorError: The cursor is another provider's, or names the workflow's input log. """ + check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. - position = _outside_position(after) - return self._read(topic, position, after, result_type) + position = None if after == END else _outside_position(after) + return self._read(topic, position, after, last, result_type) async def _read( self, topic: str, position: Offset | None, after: Cursor, + last: int | None, result_type: type | None, ) -> AsyncGenerator[StreamRecord[Any], None]: - decoder = RecordDecoder( - self._converter, result_type, after=after, warn=logger.warning - ) backend = self._streams._require_backend() chain = await _chain(self._client, self._workflow_id) key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) + start: TransportCursor | None = None + if last is not None or after == END: + try: + start = await _start_cursor(backend, key, last) + except TransportStreamError as error: + raise _storage_error(error, "the store could not be read") from error + # A synthesized record is positioned before the first one read. + after = ( + BEGINNING + if start.is_beginning + else mint_cursor(_PROVIDER, start.offset.token) # type: ignore[union-attr] + ) + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) if ( position is not None and isinstance(backend, _RetainingBackend) @@ -808,7 +882,10 @@ async def _read( f"cursor {after.token!r} names a record on {topic!r} that the " f"provider's retention has trimmed ({backend.describe_window()})" ) - cursor = TRANSPORT_BEGINNING if position is None else AFTER(position) + if start is not None: + cursor = start + else: + cursor = TRANSPORT_BEGINNING if position is None else AFTER(position) closed = False while True: try: diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index ac4919c81..d207a4b58 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -7,11 +7,19 @@ import pytest -from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError +from temporalio.streams import ( + BEGINNING, + END, + Cursor, + StreamCursorError, + StreamError, + StreamUnsupportedError, +) from temporalio.streams.providers.redis import ( RedisStreams, _drive, _outside_position, + _RedisWorkflowProvider, _workflow_position, ) @@ -74,3 +82,14 @@ def test_retention_options_are_checked_at_construction(): with pytest.raises(ValueError, match="trimmed by its owner"): RedisStreams(backend=object(), max_len=10) RedisStreams(retention=timedelta(hours=1), max_len=10) + + +def test_a_workflow_reader_cannot_start_at_end_or_the_last_records(): + # The transport records where a subscription starts, and finding the tail + # is a store read the workflow thread cannot make, so both are refused + # before anything is subscribed. + workflow_half = _RedisWorkflowProvider(timedelta(seconds=1)) + with pytest.raises(StreamUnsupportedError, match="END or at the last records"): + workflow_half.open_reader("inputs", after=END) + with pytest.raises(StreamUnsupportedError, match="END or at the last records"): + workflow_half.open_reader("inputs", after=BEGINNING, last=2) From e245fdd0732cfcd7bac08b58b6e1904511b954c0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 17:18:53 -0700 Subject: [PATCH 665/831] Carried last_n on the Nexus read contract and followed END from latest. The pinned nexgen regenerates the contract cleanly, so last_n rides to the store behind the endpoint. END reuses the existing latest_only read and resumes after it, which yields only what is appended from then on. --- .../providers/_nexus_generated/models.py | 39 +++++++++++ temporalio/streams/providers/nexus.py | 68 ++++++++++++++++--- .../providers/temporal_streams.nexusrpc.yaml | 8 +++ tests/streams/test_nexus_provider.py | 45 ++++++++++++ 4 files changed, 149 insertions(+), 11 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index 2677843ef..cab83100b 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -525,6 +525,27 @@ def from_transfer_type( else: latest_only_value = latest_only_value_raw + last_n_value: int | None = None + if "last_n" in raw: + last_n_value_raw = raw["last_n"] + if last_n_value_raw is None: + violations.append( + Violation(path="last_n", reason="explicit null not allowed") + ) + else: + last_n_value_parsed = _parse_spec_integer( + last_n_value_raw, "last_n", violations + ) + if last_n_value_parsed is not None: + last_n_value = last_n_value_parsed + if last_n_value < 1: + violations.append( + Violation( + path="last_n", + reason=f"must be >= 1, got {last_n_value}", + ) + ) + for key in raw: if ( key != "workflow_id" @@ -534,6 +555,7 @@ def from_transfer_type( and key != "max_records" and key != "wait_ms" and key != "latest_only" + and key != "last_n" ): violations.append(Violation(path=key, reason="unknown field")) if violations: @@ -546,6 +568,7 @@ def from_transfer_type( max_records=max_records_value, wait_ms=wait_ms_value, latest_only=latest_only_value, + last_n=last_n_value, ) @typing_extensions.override @@ -600,6 +623,16 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: out["wait_ms"] = value.wait_ms if value.latest_only is not None: out["latest_only"] = value.latest_only + if value.last_n is not None: + if abs(value.last_n) > 9007199254740991: + violations.append( + Violation(path="last_n", reason="exceeds ±(2^53-1) integer cap") + ) + if value.last_n < 1: + violations.append( + Violation(path="last_n", reason=f"must be >= 1, got {value.last_n}") + ) + out["last_n"] = value.last_n if violations: raise temporalio.converter.create_payload_validation_error(violations) return out @@ -642,6 +675,12 @@ class ReadInput: from now. """ + last_n: int | None = None + """With no after_token, start at the newest this many records, or at all of them when + the stream holds fewer. Records of every kind count. Refused alongside an + after_token, which is how a read resumes. + """ + class _ReadOutputTransferTypeConverter( temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 54aca7ee8..dec565ea1 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -84,7 +84,14 @@ StreamUnsupportedError, ) from temporalio.streams._provider import StreamHandle, StreamProducer, StreamProvider -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -210,6 +217,8 @@ class _Subscription: records: asyncio.Queue[StreamRecord[Any]] position: str last_used: float + last_n: int | None = None + """The newest-N start this subscription was opened with, when it had no token.""" pump: asyncio.Task[None] | None = None failure: BaseException | None = None done: bool = False @@ -431,15 +440,26 @@ async def _read( left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN wait = max(0.0, min(wait, left.total_seconds())) after = input.after_token or "" + if after and input.last_n is not None: + raise ValueError( + "pass either after_token or last_n, not both: a token resumes a " + "read and last_n starts one" + ) key = (input.workflow_id, input.run_id or "", input.topic) await self._expire_subscriptions() lock = self._read_locks.setdefault(key, asyncio.Lock()) async with lock: subscription = self._subscriptions.get(key) - if subscription is None or subscription.position != after: + if ( + subscription is None + or subscription.position != after + or (not after and subscription.last_n != input.last_n) + ): if subscription is not None: await self._drop(key) - subscription = self._subscribe(key, stream, input.topic, after) + subscription = self._subscribe( + key, stream, input.topic, after, input.last_n + ) try: records, next_token = await self._drain(subscription, max_records, wait) except Exception: @@ -462,20 +482,30 @@ async def _read( return ReadOutput(records=records, next_token=next_token, done=done) def _subscribe( - self, key: tuple[str, str, str], stream: StreamHandle, topic: str, after: str + self, + key: tuple[str, str, str], + stream: StreamHandle, + topic: str, + after: str, + last_n: int | None, ) -> _Subscription: # Raw payloads: the handler forwards what the store holds without # decoding it, so an encoding only the caller's codec understands # passes through untouched. A foreign token is refused right here. - source = stream.read( - topic=topic, - after=Cursor(after) if after else BEGINNING, - result_type=RawValue, + source = ( + stream.read(topic=topic, last=last_n, result_type=RawValue) + if last_n is not None + else stream.read( + topic=topic, + after=Cursor(after) if after else BEGINNING, + result_type=RawValue, + ) ) subscription = _Subscription( records=asyncio.Queue(maxsize=_QUEUE_DEPTH), position=after, last_used=time.monotonic(), + last_n=last_n, ) async def pump() -> None: @@ -824,9 +854,15 @@ def read( *, topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after``, one endpoint batch at a time. + """Yield records on ``topic`` from where the read starts, one endpoint batch at a time. + + ``BEGINNING`` and ``last=`` are resolved by the store behind the + endpoint on the first call. ``END`` is the endpoint's newest position, + asked for with a ``latest_only`` call when the read starts, and the + read resumes after it, so it yields only what is appended from then on. The token is opaque here, so a cursor from another store is refused by the store behind the endpoint and raises @@ -839,16 +875,23 @@ def read( the store stay, and a caller that stops and starts many reads on one topic should expect that lag rather than an immediate release. """ + check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) - return self._read(topic, after, result_type) + return self._read(topic, after, last, result_type) async def _read( - self, topic: str, after: Cursor, result_type: type | None + self, topic: str, after: Cursor, last: int | None, result_type: type | None ) -> AsyncGenerator[StreamRecord[Any], None]: + if after == END: + after = await self.latest(topic=topic) + # Where last= lands is the store's to say, so BEGINNING stands in for + # the position before it: a resume from it may repeat a record, where + # anything later could skip one. decoder = RecordDecoder( self._front.converter, result_type, after=after, warn=logger.warning ) token = after.token + last_n = last while True: answer = await self._front.invoke( _READ_OPERATION, @@ -857,6 +900,7 @@ async def _read( run_id=self._run_id, topic=topic, after_token=token, + last_n=last_n, max_records=self._front.max_records, wait_ms=int(self._front.read_wait.total_seconds() * 1000), ), @@ -878,6 +922,8 @@ async def _read( for out in decoder.decode(cursor, record): yield out token = answer.next_token or token + if token: + last_n = None if answer.done: return diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index bf97209b3..482335ed8 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -157,6 +157,14 @@ $defs: description: >- Answer with the newest position and no records, for a reader that wants to follow from now. + last_n: + type: integer + minimum: 1 + description: >- + With no after_token, start at the newest this many records, or at + all of them when the stream holds fewer. Records of every kind + count. Refused alongside an after_token, which is how a read + resumes. required: - workflow_id - topic diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 051ed1306..8830b4076 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -40,6 +40,7 @@ from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( BEGINNING, + END, Cursor, RecordKind, StreamCursorError, @@ -784,3 +785,47 @@ def _disconnect(*args: Any, **kwargs: Any) -> Any: # A url urllib cannot even build a request from does not escape either. with pytest.raises(nexus._EndpointFailure): # pyright: ignore[reportPrivateUsage] nexus._post("not a url", b"{}", {}, timedelta(seconds=1)) # pyright: ignore[reportPrivateUsage] + + +async def test_the_front_carries_every_read_start(monkeypatch: pytest.MonkeyPatch): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + stream = _front(None).get_stream_handle(None, "wf-starts") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + # last= rides the contract to the store behind the endpoint. + newest = await take( + stream.read(topic=INPUTS, result_type=dict, last=2), 2, timeout=30 + ) + assert [record.value for record in newest] == [{"n": 2}, {"n": 3}] + + # END is the endpoint's newest position when the read starts. + at_end = stream.read(topic=INPUTS, result_type=dict, after=END) + first = asyncio.ensure_future(at_end.__anext__()) + try: + for _ in range(100): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({first}, timeout=0.1) + if done: + break + record = await asyncio.wait_for(first, 30) + finally: + await at_end.aclose() + assert record.value == {"n": "new"} + + # A token resumes a read and last_n starts one, so the two are refused. + with pytest.raises(nexusrpc.HandlerError) as both: + await _dispatch( + handler, + READ_OPERATION, + ReadInput( + workflow_id="wf-starts", + topic=INPUTS, + after_token=newest[0].cursor.token, + last_n=1, + ), + ) + assert both.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + await handler.close() From 3dc0d665323b6fa3138a2c8fca37de6e919a5e34 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 08:30:03 -0700 Subject: [PATCH 666/831] Retried a poll that reaches a run before its first task registers. An Update in a run's first task runs ahead of the start hook, so a live read hit it on every successor after continue-as-new. A second rejection on a running run now names the missing provider instead. --- .../streams/providers/workflow_streams.py | 31 +++- .../streams/test_workflow_streams_provider.py | 163 ++++++++++++++++++ 2 files changed, 191 insertions(+), 3 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 20e6cc526..2b5f1b625 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -115,6 +115,9 @@ # The server's failure type for an accepted Update whose run closed before # answering it: the poll's way of saying the run is over. _UPDATE_OUTLIVED_RUN = "AcceptedUpdateCompletedWorkflow" +# The SDK's rejection of an Update no handler is registered for. It shares +# its wording with the Query one. +_HANDLER_NOT_FOUND = QUERY_HANDLER_NOT_FOUND logger = logging.getLogger(__name__) @@ -326,9 +329,10 @@ def open_writer(self, topic: str) -> WriteSink: return _WSWriteSink(self._own_stream(), topic) def on_workflow_start(self) -> None: - # Registered before the first task completes, because an outside - # reader can poll before workflow code has opened anything, and an - # Update with no handler yet is rejected rather than held. + # Registered on the first task, because an outside reader can poll + # before workflow code has opened anything, and an Update with no + # handler yet is rejected rather than held. A poll that arrives in + # that first task still runs ahead of this hook; the reader retries it. self._own_stream() async def on_workflow_finish(self) -> None: @@ -572,6 +576,7 @@ async def _poll( runs, which is the outer loop's job. """ cooldown = self._poll_cooldown.total_seconds() + unhandled = False while True: try: update = await handle.start_update( @@ -605,6 +610,26 @@ async def _poll( continue if cause == _UPDATE_OUTLIVED_RUN: return + if _HANDLER_NOT_FOUND in str(error.cause): + if await self._status(handle) != WorkflowExecutionStatus.RUNNING: + # The run closed with the rejecting task, as a run + # that continues as new on its first task does; the + # caller describes it and follows the chain. + return + if unhandled: + raise StreamError( + f"workflow {self._workflow_id!r} run {handle.run_id!r} " + "does not serve the poll update: the workflow_streams " + "provider is not installed on its worker, and no " + "WorkflowStream was constructed" + ) from error + # A rejection comes back with the completion of the task + # that made it, so a retry reaches a later task, and the + # start hook registers the handler on the first one. Only + # a second rejection means there is no handler to wait for. + unhandled = True + await asyncio.sleep(cooldown) + continue raise StreamError( f"the poll update on workflow {self._workflow_id!r} failed: {error}" ) from error diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index e520936d0..4b88e16c1 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -417,6 +417,169 @@ async def read_everything(stream: Any) -> list[Any]: assert resumed == [{"run": 1}, None] +@workflow.defn +class Rolling: + """Publishes what it is sent, continues as new onto ``successor_queue`` once.""" + + def __init__(self) -> None: + self._sent: list[int] = [] + self._roll_to = "" + self._released = False + + @workflow.signal + def emit(self, n: int) -> None: + self._sent.append(n) + + @workflow.signal + def roll(self, successor_queue: str) -> None: + self._roll_to = successor_queue + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self, run: int) -> None: + decisions = workflow.stream_writer(DECISIONS) + while True: + await workflow.wait_condition( + lambda: bool(self._sent or self._roll_to or self._released) + ) + while self._sent: + decisions.publish({"run": run, "n": self._sent.pop(0)}) + if self._roll_to: + workflow.continue_as_new(run + 1, task_queue=self._roll_to) + if self._released: + decisions.finish() + return + + +@workflow.defn +class Idle: + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def _collect_all(records: Any, into: list[Any]) -> None: + async for record in records: + into.append((record.kind, record.value)) + + +async def test_a_live_read_without_a_run_id_follows_continue_as_new( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + successor_queue = f"streams-ws-successor-{uuid.uuid4().hex}" + async with new_worker(client, Rolling, plugins=[provider]) as worker: + handle = await client.start_workflow( + Rolling.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + seen: list[Any] = [] + reader = asyncio.create_task( + _collect_all( + provider.get_stream_handle(client, workflow_id).read( + topic=DECISIONS, result_type=dict + ), + seen, + ) + ) + await handle.signal(Rolling.emit, 1) + await handle.signal(Rolling.emit, 2) + await assert_eventually_len(seen, 2, reader) + + # The successor runs on a queue nobody polls yet, so the reader's + # first poll on it waits for the successor's first task and lands in + # it, ahead of the hook that registers the handler. + await handle.signal(Rolling.roll, successor_queue) + successor = client.get_workflow_handle(workflow_id) + while (await successor.describe()).run_id == handle.result_run_id: + await asyncio.sleep(0.05) + await asyncio.sleep(1) + assert not reader.done() + async with new_worker( + client, Rolling, plugins=[provider], task_queue=successor_queue + ): + await successor.signal(Rolling.emit, 3) + await successor.signal(Rolling.emit, 4) + await assert_eventually_len(seen, 4, reader) + await successor.signal(Rolling.release) + await asyncio.wait_for(reader, 30) + await successor.result() + + assert seen == [ + (RecordKind.DATA, {"run": 0, "n": 1}), + (RecordKind.DATA, {"run": 0, "n": 2}), + (RecordKind.DATA, {"run": 1, "n": 3}), + (RecordKind.DATA, {"run": 1, "n": 4}), + (RecordKind.FINISH, None), + ] + + +async def test_a_poll_that_arrives_before_the_first_task_is_retried( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + task_queue = f"streams-ws-{uuid.uuid4().hex}" + handle = await client.start_workflow( + Rolling.run, 0, id=workflow_id, task_queue=task_queue + ) + seen: list[Any] = [] + reader = asyncio.create_task( + _collect_all( + provider.get_stream_handle(client, workflow_id).read( + topic=DECISIONS, result_type=dict + ), + seen, + ) + ) + # No worker yet, so the poll is delivered in the run's first task. + await asyncio.sleep(1) + async with new_worker(client, Rolling, plugins=[provider], task_queue=task_queue): + await handle.signal(Rolling.emit, 1) + await assert_eventually_len(seen, 1, reader) + await handle.signal(Rolling.release) + await asyncio.wait_for(reader, 30) + await handle.result() + assert seen == [(RecordKind.DATA, {"run": 0, "n": 1}), (RecordKind.FINISH, None)] + + +async def test_a_running_workflow_without_the_provider_fails_the_read_clearly( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, Idle) as worker: + handle = await client.start_workflow( + Idle.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(client, workflow_id) + with pytest.raises(StreamError, match="provider is not installed"): + await take(stream.read(topic=DECISIONS), 1) + await handle.signal(Idle.release) + await handle.result() + + +async def assert_eventually_len( + items: list[Any], count: int, reader: asyncio.Task[None] +) -> None: + async def _wait() -> None: + while len(items) < count: + if reader.done(): + # A read that failed surfaces its error instead of a timeout. + reader.result() + raise AssertionError(f"the read ended early with {items}") + await asyncio.sleep(0.05) + + await asyncio.wait_for(_wait(), 30) + + async def _values(records: Any) -> list[Any]: return [r.value async for r in records] From a86d190beb25d98d7c8745e2aea608dc4d9f3132 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 08:44:14 -0700 Subject: [PATCH 667/831] Let the example parser take extra providers, and build the memory one. The June scenarios need memory for truncation and activity-owned streams, but the parent examples keep it out because it is not replay-safe. --- examples/streams/_setup.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/streams/_setup.py b/examples/streams/_setup.py index 7ded3f1f8..9765674e5 100644 --- a/examples/streams/_setup.py +++ b/examples/streams/_setup.py @@ -18,10 +18,12 @@ PROVIDERS = ("workflow_streams", "native", "redis") -def parser(description: str) -> argparse.ArgumentParser: +def parser( + description: str, providers: tuple[str, ...] = PROVIDERS +) -> argparse.ArgumentParser: """The flags every example shares.""" parser = argparse.ArgumentParser(description=description) - parser.add_argument("provider", choices=PROVIDERS) + parser.add_argument("provider", choices=providers) parser.add_argument("--address", default="localhost:7233") parser.add_argument("--redis", default="redis://127.0.0.1:6379") return parser @@ -43,6 +45,12 @@ def make_provider(name: str, args: argparse.Namespace) -> ProviderPlugin: from temporalio.streams.providers.native import NativeStreams return NativeStreams() + if name == "memory": + # Only for examples that keep a warm cache: this provider is not + # replay-safe, which is why PROVIDERS leaves it out. + from temporalio.streams.providers.memory import MemoryStreams + + return MemoryStreams() raise SystemExit(f"unknown provider {name}") From 5bfb3d256c2d3db5c1a09721f18f7e6d7763a996 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 08:44:14 -0700 Subject: [PATCH 668/831] Mapped every scenario in Roey's June streaming notes onto a demo. Each file names his scenario, says whether it is implemented, emulated or unsupported by design, and runs on the providers that can serve it. --- examples/streams/README.md | 2 + examples/streams/june_scenarios/README.md | 55 ++++ examples/streams/june_scenarios/__init__.py | 1 + examples/streams/june_scenarios/_common.py | 38 +++ examples/streams/june_scenarios/run.py | 58 ++++ .../june_scenarios/s1_client_consumes.py | 166 +++++++++++ .../june_scenarios/s2_standalone_streams.py | 192 ++++++++++++ .../june_scenarios/s3_workflow_producer.py | 167 +++++++++++ .../s4_workflow_as_generator.py | 156 ++++++++++ .../june_scenarios/s5_activity_producers.py | 194 ++++++++++++ .../s6_activity_as_generator.py | 153 ++++++++++ .../june_scenarios/s7_workflow_consumer.py | 149 ++++++++++ .../june_scenarios/s8_nexus_consumers.py | 277 ++++++++++++++++++ 13 files changed, 1608 insertions(+) create mode 100644 examples/streams/june_scenarios/README.md create mode 100644 examples/streams/june_scenarios/__init__.py create mode 100644 examples/streams/june_scenarios/_common.py create mode 100644 examples/streams/june_scenarios/run.py create mode 100644 examples/streams/june_scenarios/s1_client_consumes.py create mode 100644 examples/streams/june_scenarios/s2_standalone_streams.py create mode 100644 examples/streams/june_scenarios/s3_workflow_producer.py create mode 100644 examples/streams/june_scenarios/s4_workflow_as_generator.py create mode 100644 examples/streams/june_scenarios/s5_activity_producers.py create mode 100644 examples/streams/june_scenarios/s6_activity_as_generator.py create mode 100644 examples/streams/june_scenarios/s7_workflow_consumer.py create mode 100644 examples/streams/june_scenarios/s8_nexus_consumers.py diff --git a/examples/streams/README.md b/examples/streams/README.md index 2e06253f7..9513974c4 100644 --- a/examples/streams/README.md +++ b/examples/streams/README.md @@ -26,6 +26,8 @@ call; the examples never need one. `agent.py` and `run.py` compose all three paths in one agent, on every provider and behind the Nexus front. `_setup.py` is the one place a store is named. +`june_scenarios/` maps every scenario in Roey's June design notes onto this +surface, one file per scenario family, with a status on each. ## Running diff --git a/examples/streams/june_scenarios/README.md b/examples/streams/june_scenarios/README.md new file mode 100644 index 000000000..9b377cdc8 --- /dev/null +++ b/examples/streams/june_scenarios/README.md @@ -0,0 +1,55 @@ +# Roey's June scenarios, on the shipped surface + +Every scenario in Roey's Notion page "Streaming Design Discussion Prep Notes" +(June 2, under "Streaming Links") mapped onto `temporalio.streams` as it +ships on this branch. Each file opens with his scenario heading, a status, +and one sentence why. Where his sketch uses a call shape we do not have, the +docstring shows his shape in one line and the code uses ours. Nothing here +reaches into private SDK code or adds a feature. + +| Roey's scenario | File | Status | Note | +|---|---|---|---| +| Client starts and consume stream: primary and named | `s1_client_consumes.py` | implemented | Default topic with no name, a typed topic, `last=N`, `after=END`, `BEGINNING` on a moved floor (memory only) | +| Client starts and consume stream: standalone alt 1, 2, 3 | `s2_standalone_streams.py` | alt 2 implemented; alts 1 and 3 open | Native only. Shows `StreamNotFoundError` for alt 1; wait-for-creation reads and start-committed stream arguments are open questions on the blueprint | +| Workflow as Producer: as named handle | `s3_workflow_producer.py` | implemented | His turn loop with continue-as-new; the client follows the chain. On `workflow_streams` the live follow across runs hits a provider bug, so it reads the finished chain there | +| Workflow as Producer: as return type | `s4_workflow_as_generator.py` | emulated | Default-topic publishes plus `FINISH`, result from the workflow; the generator signature is sugar not built | +| Activity as Producer: as named handle | `s5_activity_producers.py` | implemented | Workflow topic (Path B), `scope="activity"`, standalone activity; the last two on native and memory only | +| Activity as Producer: as return type | `s6_activity_as_generator.py` | emulated | Appends plus a heartbeat checkpoint; the retry resumes and readers see `SUPERSEDED` | +| Workflow as Consumer | `s7_workflow_consumer.py` | implemented; foreign stream unsupported | Own inbound topic across continue-as-new, carrying a checkpoint because a run's topic is its own; reading a foreign stream from a workflow is rule 5 | +| Client as Consumer over Standalone Nexus | `s8_nexus_consumers.py` (a) | implemented | Activity reads through the `NexusStreams` front and resumes from a heartbeat cursor | +| Nexus operation handler | `s8_nexus_consumers.py` (b) | emulated | The operation returns a `StreamRef` that the client reads through the front; streams as operation results are the nexgen IDL follow-on | +| Workflow as Consumer over Nexus | `s8_nexus_consumers.py` docstring | unsupported by design | A workflow's reads ride its Workflow Task and never cross Nexus | + +## Running + +Each file runs on its own and takes the provider's name, the same way the +examples one directory up do. `run.py` runs them all in order: + +```sh +python -m examples.streams.june_scenarios.run native --address 127.0.0.1:7333 +python -m examples.streams.june_scenarios.run workflow_streams --address 127.0.0.1:7333 +python -m examples.streams.june_scenarios.run memory --address 127.0.0.1:7333 +python -m examples.streams.june_scenarios.s5_activity_producers native --address 127.0.0.1:7333 +``` + +`native` needs a server built from the stream-carrying branch. `s5` (b) +and (c) need a server with standalone activities and activity-owned +streams, and `s8` needs the server's Nexus HTTP ingress (`--http`, default +`http://127.0.0.1:7243`); the stream-carrying server has all three, so the +commands above point every provider at it. `s8` creates and deletes its own +Nexus endpoint. `memory` is offered here, not in the parent examples, +because it is not replay-safe; these scenarios keep a warm cache. `redis` +is accepted too, with `--redis`, but was not part of the runs behind this +directory. + +On `workflow_streams`, an outside read that polls before the run's first +Workflow Task can be refused inside the provider, because its poll handler +is registered when the workflow function starts, after the Update in that +first task has already been turned away. It is a provider bug, not a demo +one, and a rerun passes; s3 steps around it on that provider because a +successor run hits it every time. + +A scenario a provider cannot serve says so in its output and moves on: +`s2` on anything but `native`, `s5` (b) and (c) on `workflow_streams` and +`redis`, `s1` (d) on anything but `memory`, and `s7` on `memory`, which +keeps one topic across a chain rather than one per run. diff --git a/examples/streams/june_scenarios/__init__.py b/examples/streams/june_scenarios/__init__.py new file mode 100644 index 000000000..646be7dae --- /dev/null +++ b/examples/streams/june_scenarios/__init__.py @@ -0,0 +1 @@ +"""Roey's June streaming scenarios, each mapped onto the shipped streams surface.""" diff --git a/examples/streams/june_scenarios/_common.py b/examples/streams/june_scenarios/_common.py new file mode 100644 index 000000000..837097444 --- /dev/null +++ b/examples/streams/june_scenarios/_common.py @@ -0,0 +1,38 @@ +"""What every scenario shares: its flags, its ids and one way to print. + +The store is still named in one place, ``examples.streams._setup``. The +scenarios add the memory provider to the choices because two of them need an +activity-owned stream or truncation, and memory is the one in-process store +that has both. +""" + +from __future__ import annotations + +import argparse +import uuid + +from examples.streams import _setup + +PROVIDERS = (*_setup.PROVIDERS, "memory") + + +def parser(description: str) -> argparse.ArgumentParser: + """The example flags, plus the memory provider and the Nexus ingress.""" + parser = _setup.parser(description, PROVIDERS) + parser.add_argument( + "--http", + default="http://127.0.0.1:7243", + help="the server's Nexus HTTP ingress, for s8", + ) + return parser + + +def ids(prefix: str) -> tuple[str, str]: + """A fresh workflow id and its own task queue, so reruns never collide.""" + workflow_id = f"{prefix}-{uuid.uuid4().hex[:8]}" + return workflow_id, f"tq-{workflow_id}" + + +def banner(title: str, provider: str) -> None: + """Head each scenario's output, so a run of all of them reads in sections.""" + print(f"\n== {title} [{provider}]") diff --git a/examples/streams/june_scenarios/run.py b/examples/streams/june_scenarios/run.py new file mode 100644 index 000000000..e6d08dec5 --- /dev/null +++ b/examples/streams/june_scenarios/run.py @@ -0,0 +1,58 @@ +r"""Run every June scenario, in order, on one provider. + + python -m examples.streams.june_scenarios.run native --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.run workflow_streams --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.run memory --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.run native --address 127.0.0.1:7333 --only s2,s5 + +Each scenario connects, runs and closes on its own, exactly as it does when +run as its own module, so one that a provider cannot serve prints why and +the next one starts clean. ``s8`` needs the server's Nexus HTTP ingress, +which ``--http`` names. +""" + +from __future__ import annotations + +import asyncio + +from examples.streams.june_scenarios import ( + _common, + s1_client_consumes, + s2_standalone_streams, + s3_workflow_producer, + s4_workflow_as_generator, + s5_activity_producers, + s6_activity_as_generator, + s7_workflow_consumer, + s8_nexus_consumers, +) + +SCENARIOS = { + "s1": s1_client_consumes.run, + "s2": s2_standalone_streams.run, + "s3": s3_workflow_producer.run, + "s4": s4_workflow_as_generator.run, + "s5": s5_activity_producers.run, + "s6": s6_activity_as_generator.run, + "s7": s7_workflow_consumer.run, + "s8": s8_nexus_consumers.run, +} + + +async def main() -> None: + """Run the scenarios named by ``--only``, or all of them.""" + parser = _common.parser(__doc__ or "") + parser.add_argument( + "--only", default="", help="comma-separated scenarios, for example s1,s5" + ) + args = parser.parse_args() + chosen = [name for name in args.only.split(",") if name] or list(SCENARIOS) + unknown = [name for name in chosen if name not in SCENARIOS] + if unknown: + parser.error(f"unknown scenarios {unknown}; choose from {list(SCENARIOS)}") + for name in chosen: + await SCENARIOS[name](args) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/june_scenarios/s1_client_consumes.py b/examples/streams/june_scenarios/s1_client_consumes.py new file mode 100644 index 000000000..f99c7a7a1 --- /dev/null +++ b/examples/streams/june_scenarios/s1_client_consumes.py @@ -0,0 +1,166 @@ +"""Scenario "Client starts and consume stream": primary and named execution stream. + +Status: implemented. + +Why: a workflow's default topic is the primary stream he reads without a +name, and a typed topic is his named stream, so both sketches are one call. + + python -m examples.streams.june_scenarios.s1_client_consumes workflow_streams + python -m examples.streams.june_scenarios.s1_client_consumes native --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.s1_client_consumes memory --address 127.0.0.1:7333 + +His shape is ``handle.stream(ScoreUpdate)`` and +``handle.stream(ScoreUpdate, name="scores")``. Ours keeps the address on the +handle and the name and type on the topic: +``client.get_stream_handle(wid).read(result_type=ScoreUpdate)`` for the +default topic and ``.read(topic=SCORES)`` for the named one. + +The game plays two halves and waits for a signal between them, so the reads +below land at known places. The client reads the first half from the start +of the default topic, then joins the named topic at ``END`` and sees only +the second half, then asks for the ``last=3`` records, which count the +``FINISH`` record too. Last, it reads a truncated topic from ``BEGINNING``, +which starts at the oldest record left rather than at offset zero. Only the +memory provider can truncate from here; an owned topic on the native server +is budgeted and never truncated, and ``s2`` shows a moved floor on a +standalone stream there. +""" + +from __future__ import annotations + +import argparse +import asyncio +import contextlib +from dataclasses import dataclass +from datetime import timedelta + +from examples.streams import _setup +from examples.streams.june_scenarios import _common +from temporalio import streams, workflow +from temporalio.streams import END, RecordKind, StreamRecord +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.worker import Worker + + +@dataclass +class ScoreUpdate: + """The score at one moment of the game.""" + + home_score: int + away_score: int + clock: str + + +SCORES = streams.topic("scores", ScoreUpdate) + + +@workflow.defn +class Game: + """Publishes every score change on the default topic and on ``scores``.""" + + def __init__(self) -> None: + """Start in the first half.""" + self._second_half = False + + @workflow.signal + def second_half(self) -> None: + """Let the second half start.""" + self._second_half = True + + @workflow.run + async def run(self, per_half: int) -> str: + """Play two halves of ``per_half`` updates each and return the final score.""" + primary = workflow.stream_writer() + named = workflow.stream_writer(SCORES) + home = away = 0 + for half in (1, 2): + if half == 2: + await workflow.wait_condition(lambda: self._second_half) + for minute in range(per_half): + if minute % 2 == 0: + home += 1 + else: + away += 1 + update = ScoreUpdate(home, away, clock=f"H{half} {minute:02}'") + primary.publish(update) + named.publish(update) + await workflow.sleep(timedelta(milliseconds=200)) + primary.finish() + named.finish() + return f"{home}-{away}" + + +def show(record: StreamRecord[ScoreUpdate]) -> None: + """One line per record.""" + print(f" {record.kind.name:6} {record.value}") + + +async def run(args: argparse.Namespace) -> None: + """Play the game and read it four ways.""" + _common.banner("s1 client consumes", args.provider) + client, provider = await _setup.connect(args) + workflow_id, task_queue = _common.ids("june-s1") + per_half = 3 + try: + async with Worker(client, task_queue=task_queue, workflows=[Game]): + handle = await client.start_workflow( + Game.run, per_half, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + + print(" (a) default topic, no name, from the start: the first half") + seen = 0 + async with contextlib.aclosing( + stream.read(result_type=ScoreUpdate) + ) as primary: + async for record in primary: + show(record) + seen += record.kind is RecordKind.DATA + if seen == per_half: + break + + print(" (b) named topic from END: only what lands after joining") + + async def follow_from_end() -> None: + joined = stream.read(topic=SCORES, after=END) + async with contextlib.aclosing(joined) as records: + async for record in records: + show(record) + if record.kind is RecordKind.FINISH: + break + + joined = asyncio.create_task(follow_from_end()) + # END resolves on the reader's first poll, not at this call, so the + # half-time whistle waits until that poll has had time to land. + await asyncio.sleep(1.0) + await handle.signal(Game.second_half) + await joined + print(f" final score {await handle.result()}") + + print(" (c) named topic, last=3: FINISH counts as one of the three") + async for record in stream.read(topic=SCORES, last=3): + show(record) + + print(" (d) BEGINNING after the floor moved") + if isinstance(provider, MemoryStreams): + # Truncation is a store's retention, not part of the provider + # contract, so only the in-process store offers it by hand. + provider.truncate(workflow_id, SCORES.name, keep=2) + async for record in stream.read(topic=SCORES): + show(record) + else: + print( + f" {args.provider} cannot truncate a workflow's topic from " + "outside; see s2 for BEGINNING on a moved floor" + ) + finally: + await provider.close() + + +async def main() -> None: + """Parse the flags and run the scenario.""" + await run(_common.parser(__doc__ or "").parse_args()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/june_scenarios/s2_standalone_streams.py b/examples/streams/june_scenarios/s2_standalone_streams.py new file mode 100644 index 000000000..f85a3ef82 --- /dev/null +++ b/examples/streams/june_scenarios/s2_standalone_streams.py @@ -0,0 +1,192 @@ +"""Scenario "Client starts and consume stream", the three standalone alternatives. + +Status: implemented for alt 2, with one open note for alts 1 and 3. + +Why: the server holds standalone streams with their own id and lifecycle, and +the stream client creates, appends to, truncates and reads them today. + + python -m examples.streams.june_scenarios.s2_standalone_streams native --address 127.0.0.1:7333 + +His alt 2 is ``stream = await client.create_stream(ProgressUpdate, +stream_id=...)`` and then ``start_workflow(..., arg=stream)``. Ours creates +the stream through ``temporalio.client_stream.StreamClient`` and passes its +id, a plain string, as the workflow argument. The workflow's activity appends +to it, an outside producer appends beside it, and the client follows it +until the stream is closed. The orphan he warns about is real: nothing ties +the stream to the workflow, so a crash between the two calls leaves it to +its retention. + +Two of his asks are open questions on the blueprint, not built. His alt 1, +a read that blocks until the stream exists, is shown below as what happens +today: the reader probes and gets ``StreamNotFoundError``. His alt 3, a +client-side stream made durable by the start call, is the stream-reference +and append-with-start follow-on. + +Only the native provider reaches the stream service, so on any other +provider this scenario says so and stops. It also shows ``BEGINNING`` on a +moved floor, which ``s1`` cannot show on native: after a truncate, an offset +below the floor is refused, and the ``earliest`` start lands on the oldest +record left. +""" + +from __future__ import annotations + +import argparse +import asyncio +from dataclasses import dataclass +from datetime import timedelta + +from examples.streams import _setup +from examples.streams.june_scenarios import _common +from temporalio import activity, workflow +from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind, StreamStartPosition +from temporalio.client_stream import StreamClient, StreamEntry +from temporalio.converter import PayloadConverter +from temporalio.service import RPCError +from temporalio.streams import RecordKind, StreamError, StreamNotFoundError +from temporalio.worker import Worker + + +@dataclass +class ProgressUpdate: + """One line of progress on the session.""" + + message: str + + +def encode( + converter: PayloadConverter, update: ProgressUpdate, producer_id: str +) -> StreamRecord: + """A standalone stream takes wire records, so the value becomes a payload here.""" + return StreamRecord( + kind=StreamRecordKind.STREAM_RECORD_KIND_DATA, + body=converter.to_payload(update), + producer_id=producer_id, + ) + + +def show(converter: PayloadConverter, entry: StreamEntry) -> None: + """One line per entry.""" + record = entry.record + kind = RecordKind(record.kind or RecordKind.DATA) + value = ( + converter.from_payload(record.body, ProgressUpdate) + if kind is RecordKind.DATA + else None + ) + print(f" {entry.offset}: {kind.name:6} {record.producer_id:8} {value}") + + +@activity.defn +async def report_progress(stream_id: str) -> int: + """Append three steps to the standalone stream named by ``stream_id``. + + Each append carries the producer id and a sequence, so a retry of this + activity lands each step once. + """ + client = activity.client() + service = StreamClient.connect( + client.service_client.config.target_host, client.namespace + ) + try: + stream = service.get(stream_id) + converter = client.data_converter.payload_converter + for step in range(1, 4): + update = ProgressUpdate(f"step {step} done") + await stream.append( + encode(converter, update, "agent"), + producer_id="agent", + sequence=step, + ) + await asyncio.sleep(0.2) + await stream.finish_writing("agent") + return 3 + finally: + await service.close() + + +@workflow.defn +class Session: + """Receives the stream's id as its argument and hands it to its activity.""" + + @workflow.run + async def run(self, stream_id: str) -> int: + """Run the activity that writes to the stream; the workflow never touches it.""" + return await workflow.execute_activity( + report_progress, stream_id, start_to_close_timeout=timedelta(minutes=1) + ) + + +async def run(args: argparse.Namespace) -> None: + """Probe, create, produce from two places, consume, then truncate.""" + _common.banner("s2 standalone streams", args.provider) + if args.provider != "native": + print( + " standalone streams live on the server's stream service, which only " + "the native provider reaches; skipped" + ) + return + client, provider = await _setup.connect(args) + service = StreamClient.connect( + client.service_client.config.target_host, client.namespace + ) + converter = client.data_converter.payload_converter + workflow_id, task_queue = _common.ids("june-s2") + stream_id = f"session-{workflow_id.rsplit('-', 1)[1]}" + try: + print(" alt 1 today: a reader probes a stream nobody has created") + try: + await service.get(stream_id).read() + except StreamNotFoundError as error: + print(f" StreamNotFoundError: {error}") + + print(" alt 2: create, pass the id to the workflow, produce, consume") + stream = await service.create(stream_id, retention=600) + + async def consume() -> None: + async for entry in stream.follow(): + show(converter, entry) + + consumer = asyncio.create_task(consume()) + async with Worker( + client, + task_queue=task_queue, + workflows=[Session], + activities=[report_progress], + ): + handle = await client.start_workflow( + Session.run, stream_id, id=workflow_id, task_queue=task_queue + ) + for n, note in enumerate(("watching", "looks good"), start=1): + await stream.append( + encode(converter, ProgressUpdate(note), "operator"), + producer_id="operator", + sequence=n, + ) + await stream.finish_writing("operator") + await handle.result() + + await stream.truncate(2) + await stream.close() + await consumer + + print(" the floor moved to offset 2") + try: + await stream.read(from_offset=0) + except (StreamError, RPCError) as error: + print(f" offset 0 refused: {type(error).__name__}: {error}") + print(" from the earliest record left:") + async for entry in stream.follow(start=StreamStartPosition(earliest=True)): + show(converter, entry) + finally: + await service.close() + await provider.close() + + +async def main() -> None: + """Parse the flags and run the scenario.""" + await run(_common.parser(__doc__ or "").parse_args()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/june_scenarios/s3_workflow_producer.py b/examples/streams/june_scenarios/s3_workflow_producer.py new file mode 100644 index 000000000..555a52e09 --- /dev/null +++ b/examples/streams/june_scenarios/s3_workflow_producer.py @@ -0,0 +1,167 @@ +"""Scenario "Workflow as Producer", as a named handle. + +Status: implemented. + +Why: a workflow publishes to a typed topic of its own stream, and a client +handle without a run id follows the execution chain across continue-as-new. + + python -m examples.streams.june_scenarios.s3_workflow_producer workflow_streams + python -m examples.streams.june_scenarios.s3_workflow_producer native --address 127.0.0.1:7333 + +His shape is ``workflow.StreamHandle[ProgressUpdate](name="progress")`` +and ``.send(...)``. Ours is ``workflow.stream_writer(PROGRESS)`` and +``.publish(...)``, which commits with the Workflow Task. His standalone +variant, a workflow writing to a stream it does not own, is not offered: +a workflow publishes only to its own topics, and an activity writes to a +standalone stream instead, as in ``s2``. + +The loop is his, turn by turn: publish, call the model, publish, call a +tool, publish. Continue-as-new is taken when the server suggests it, and +also every two turns here so a short demo crosses runs. Each run's topic +belongs to that run, and the client's read walks from one run to the next +without being told. + +On ``workflow_streams`` a live read across continue-as-new currently fails +inside the provider: its poll Update reaches the successor run before that +run has registered the handler for it. So there the client waits for the +chain to finish and then reads it whole. That still walks every run, and the +output says which mode ran. +""" + +from __future__ import annotations + +import argparse +import asyncio +from dataclasses import dataclass +from datetime import timedelta + +from examples.streams import _setup +from examples.streams.june_scenarios import _common +from temporalio import activity, streams, workflow +from temporalio.worker import Worker + + +@dataclass +class ProgressUpdate: + """What the agent is doing now, and which run of the chain said it.""" + + message: str + run: int + + +@dataclass +class LlmResult: + """The model's answer: done, or a tool to call.""" + + done: bool + tool: str = "" + + +@dataclass +class AgentInput: + """The prompt, and where a continued run picks up.""" + + prompt: str + turn: int = 0 + run: int = 1 + + +PROGRESS = streams.topic("progress", ProgressUpdate) +TURNS_PER_RUN = 2 +TOTAL_TURNS = 5 + + +@activity.defn +async def call_llm(input: AgentInput) -> LlmResult: + """A stand-in model: asks for a tool until the last turn.""" + if input.turn + 1 >= TOTAL_TURNS: + return LlmResult(done=True) + return LlmResult(done=False, tool=f"search #{input.turn + 1}") + + +@activity.defn +async def call_tool(result: LlmResult) -> str: + """A stand-in tool: its answer becomes the next prompt.""" + return f"results of {result.tool}" + + +@workflow.defn +class AgentWorkflow: + """His turn loop, publishing progress on the ``progress`` topic.""" + + @workflow.run + async def run(self, input: AgentInput) -> str: + """Run turns until the model is done, continuing as new along the way.""" + progress = workflow.stream_writer(PROGRESS) + prompt, turn, run = input.prompt, input.turn, input.run + timeout = timedelta(seconds=30) + + def send(message: str) -> None: + progress.publish(ProgressUpdate(message, run)) + + while True: + if ( + workflow.info().is_continue_as_new_suggested() + or turn - input.turn >= TURNS_PER_RUN + ): + workflow.continue_as_new(AgentInput(prompt, turn, run + 1)) + send(f"turn {turn} started") + result = await workflow.execute_activity( + call_llm, AgentInput(prompt, turn), start_to_close_timeout=timeout + ) + send(f"turn {turn} ended") + if result.done: + break + send(f"tool call {result.tool} started") + prompt = await workflow.execute_activity( + call_tool, result, start_to_close_timeout=timeout + ) + send(f"tool call {result.tool} ended") + turn += 1 + progress.finish() + return f"done after {turn + 1} turns" + + +async def run(args: argparse.Namespace) -> None: + """Start the agent and follow its progress across every run of the chain.""" + _common.banner("s3 workflow producer", args.provider) + client, provider = await _setup.connect(args) + workflow_id, task_queue = _common.ids("june-s3") + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[AgentWorkflow], + activities=[call_llm, call_tool], + ): + handle = await client.start_workflow( + AgentWorkflow.run, + AgentInput("plan a trip"), + id=workflow_id, + task_queue=task_queue, + ) + if args.provider == "workflow_streams": + print(" live follow across runs is blocked here; reading the") + print(" finished chain instead") + await handle.result() + # No run id on the handle, so the read follows the chain and ends + # when its last run is closed and the tail has been delivered. + async for record in client.get_stream_handle(workflow_id).read( + topic=PROGRESS + ): + if record.value is None: + print(f" {record.kind.name}") + continue + print(f" run {record.value.run} {record.value.message}") + print(f" {await handle.result()}") + finally: + await provider.close() + + +async def main() -> None: + """Parse the flags and run the scenario.""" + await run(_common.parser(__doc__ or "").parse_args()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/june_scenarios/s4_workflow_as_generator.py b/examples/streams/june_scenarios/s4_workflow_as_generator.py new file mode 100644 index 000000000..0c067c2e6 --- /dev/null +++ b/examples/streams/june_scenarios/s4_workflow_as_generator.py @@ -0,0 +1,156 @@ +r"""Scenario "Workflow as Producer", as return type (async generator). + +Status: emulated. + +Why: the async-generator run signature is sugar that is not built, and +publishing each value to the default topic, then ``FINISH``, then returning +the result is what that sugar would lower to. + + python -m examples.streams.june_scenarios.s4_workflow_as_generator workflow_streams + python -m examples.streams.june_scenarios.s4_workflow_as_generator \ + native --address 127.0.0.1:7333 + +His shape is ``async def run(...) -> workflow.Stream[ScoreUpdate, +GameFinalResult]`` with ``yield`` per update and ``return`` for the result. +Ours replaces each ``yield`` with ``workflow.stream_writer().publish(...)`` +on the default topic, so a reader needs no topic name, and the ``return`` +stays an ordinary workflow result. The client reads the updates until +``FINISH`` and then fetches the result from the workflow handle, which is +the two halves his generator type would have handed it at once. +""" + +from __future__ import annotations + +import argparse +import asyncio +import contextlib +from dataclasses import dataclass +from datetime import timedelta + +from examples.streams import _setup +from examples.streams.june_scenarios import _common +from temporalio import activity, workflow +from temporalio.streams import RecordKind +from temporalio.worker import Worker + + +@dataclass +class ScoreUpdate: + """What each ``yield`` would have produced.""" + + home_score: int + away_score: int + clock: str + + +@dataclass +class GameFinalResult: + """What the ``return`` produces.""" + + winner: str + final_score: str + + +@dataclass +class GameState: + """One poll of the game feed.""" + + home_score: int + away_score: int + clock: str + is_finished: bool + + +@dataclass +class GamePoll: + """Which game to poll, and which poll this is.""" + + game_id: str + tick: int + + +@activity.defn +async def get_game_state(poll: GamePoll) -> GameState: + """A stand-in feed that reports the game over on its fourth poll.""" + tick = poll.tick + return GameState( + home_score=(tick + 1) // 2 + tick // 3, + away_score=tick // 2, + clock=f"{tick * 20}'", + is_finished=tick >= 3, + ) + + +@workflow.defn +class LiveScoresWorkflow: + """His generator, with ``yield`` spelled as a publish to the default topic.""" + + @workflow.run + async def run(self, game_id: str) -> GameFinalResult: + """Publish each score, then finish the topic and return the result.""" + scores = workflow.stream_writer() + tick = 0 + while True: + game = await workflow.execute_activity( + get_game_state, + GamePoll(game_id, tick), + start_to_close_timeout=timedelta(seconds=30), + ) + # yield ScoreUpdate(...) + scores.publish(ScoreUpdate(game.home_score, game.away_score, game.clock)) + if game.is_finished: + break + tick += 1 + await workflow.sleep(timedelta(milliseconds=200)) + # The end of the generator, so a reader knows no more values follow. + scores.finish() + home, away = game.home_score, game.away_score + return GameFinalResult( + winner="home" if home > away else "away" if away > home else "draw", + final_score=f"{home}-{away}", + ) + + +async def run(args: argparse.Namespace) -> None: + """Read the yielded values, then the returned one.""" + _common.banner("s4 workflow as generator", args.provider) + client, provider = await _setup.connect(args) + workflow_id, task_queue = _common.ids("june-s4") + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[LiveScoresWorkflow], + activities=[get_game_state], + ): + handle = await client.start_workflow( + LiveScoresWorkflow.run, "game-7", id=workflow_id, task_queue=task_queue + ) + # FINISH is the end of the generator, so the read stops there + # rather than waiting for the run to close. + records = client.get_stream_handle(workflow_id).read( + result_type=ScoreUpdate + ) + async with contextlib.aclosing(records) as updates: + async for record in updates: + if record.kind is RecordKind.FINISH: + print(" FINISH: the generator is exhausted") + break + assert record.value is not None + update = record.value + print( + f" Score: {update.home_score}-{update.away_score} " + f"at {update.clock}" + ) + print(f" returned {await handle.result()}") + finally: + await provider.close() + + +async def main() -> None: + """Parse the flags and run the scenario.""" + await run(_common.parser(__doc__ or "").parse_args()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/june_scenarios/s5_activity_producers.py b/examples/streams/june_scenarios/s5_activity_producers.py new file mode 100644 index 000000000..ba5c10983 --- /dev/null +++ b/examples/streams/june_scenarios/s5_activity_producers.py @@ -0,0 +1,194 @@ +"""Scenario "Activity as Producer", as named handle, separate from return type. + +Status: implemented. + +Why: ``activity.stream_handle()`` reaches the workflow's topics, the +activity's own streams with ``scope="activity"``, or a standalone +activity's own streams, by a static rule and with the same producer verbs. + + python -m examples.streams.june_scenarios.s5_activity_producers native --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.s5_activity_producers memory --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.s5_activity_producers workflow_streams + +His three shapes and ours, one line each: + +- ``activity.StreamHandle[ProgressUpdate](workflow_id=..., name="progress")`` + is ``activity.stream_handle().producer(topic=PROGRESS)``: the workflow + that scheduled the activity, pinned to its run, which is Path B. +- ``activity.StreamHandle[ProgressUpdate](name="progress")`` in an activity + that owns its streams is ``activity.stream_handle(scope="activity")`` + inside a workflow, and plain ``activity.stream_handle()`` in a standalone + activity. The rule is static because a stream is created by its first + write, so a rule that probed for one would send a retry somewhere else. +- ``client.StreamHandle[...](stream_id=...)``, a standalone stream, is the + stream client in ``s2``. + +A topic on an activity's own streams and the same topic on its workflow are +two streams, which part (b) shows by writing ``progress`` to both. Parts (b) +and (c) need a store that can hold an activity-owned stream: native and +memory can, and on any other provider the client's first handle raises +``StreamUnsupportedError``, which is printed in their place. +""" + +from __future__ import annotations + +import argparse +import asyncio +import contextlib +from dataclasses import dataclass +from datetime import timedelta + +from examples.streams import _setup +from examples.streams.june_scenarios import _common +from temporalio import activity, streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind, StreamHandle, StreamUnsupportedError +from temporalio.worker import Worker + + +@dataclass +class ProgressUpdate: + """One line of progress from a tool call.""" + + message: str + + +@dataclass +class ToolCallInput: + """The call, and which stream its progress goes to. + + ``target`` is ``"workflow"`` for the scheduling workflow's topic, + ``"own"`` for the activity's own streams inside a workflow, and + ``"standalone"`` for a standalone activity's own default topic. + """ + + tool: str + target: str + + +PROGRESS = streams.topic("progress", ProgressUpdate) + + +@activity.defn +async def tool_call_activity(input: ToolCallInput) -> str: + """His tool call: progress before and after, and the answer as the result.""" + if input.target == "workflow": + progress = activity.stream_handle().producer(topic=PROGRESS) + elif input.target == "own": + progress = activity.stream_handle(scope="activity").producer(topic=PROGRESS) + else: + # A standalone activity owns its streams without a scope, and naming + # no topic writes its default one. + progress = activity.stream_handle().producer() + await progress.append(ProgressUpdate(f"{input.tool} started")) + await asyncio.sleep(0.3) + await progress.append(ProgressUpdate(f"{input.tool} ended")) + await progress.finish() + return f"{input.tool} answered" + + +@workflow.defn +class ToolWorkflow: + """Schedules the tool call once per stream target it is asked for.""" + + @workflow.run + async def run(self, own_streams: bool) -> list[str]: + """Run (a), and (b) when the store can hold an activity's own streams.""" + timeout = timedelta(seconds=30) + answers = [ + await workflow.execute_activity( + tool_call_activity, + ToolCallInput("search", "workflow"), + activity_id="tool-a", + start_to_close_timeout=timeout, + ) + ] + if own_streams: + answers.append( + await workflow.execute_activity( + tool_call_activity, + ToolCallInput("fetch", "own"), + activity_id="tool-b", + start_to_close_timeout=timeout, + ) + ) + return answers + + +async def show(stream: StreamHandle, topic: streams.StreamTopic | None) -> None: + """Print one stream until its producer finishes.""" + records = ( + stream.read(topic=topic) + if topic is not None + else stream.read(result_type=ProgressUpdate) + ) + async with contextlib.aclosing(records) as reading: + async for record in reading: + value = record.value.message if record.value else "" + print(f" {record.kind.name:6} {record.producer_id:6} {value}") + if record.kind is RecordKind.FINISH: + break + + +def supports_activity_owners(client: Client) -> bool: + """Ask the provider for an activity handle; one that cannot hold it says so.""" + try: + client.get_stream_handle(activity_id="probe") + except StreamUnsupportedError as error: + print(f" StreamUnsupportedError: {error}") + return False + return True + + +async def run(args: argparse.Namespace) -> None: + """Produce from an activity three ways and read each stream from outside.""" + _common.banner("s5 activity producers", args.provider) + client, provider = await _setup.connect(args) + workflow_id, task_queue = _common.ids("june-s5") + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ToolWorkflow], + activities=[tool_call_activity], + ): + print(" can this provider hold a stream an activity owns?") + own = supports_activity_owners(client) + handle = await client.start_workflow( + ToolWorkflow.run, own, id=workflow_id, task_queue=task_queue + ) + print(f" workflow returned {await handle.result()}") + + print(" (a) activity in a workflow, onto the workflow's progress topic") + await show(client.get_stream_handle(workflow_id), PROGRESS) + if not own: + print(" (b) and (c) skipped: they need an activity-owned stream") + return + + print(" (b) same activity with scope='activity', onto its own progress") + await show( + client.get_stream_handle(workflow_id, activity_id="tool-b"), PROGRESS + ) + + print(" (c) standalone activity, onto its own default topic") + activity_id = workflow_id.replace("june-s5", "saa") + started = await client.start_activity( + tool_call_activity, + ToolCallInput("summarize", "standalone"), + id=activity_id, + task_queue=task_queue, + start_to_close_timeout=timedelta(seconds=30), + ) + await show(client.get_stream_handle(activity_id=activity_id), None) + print(f" result {await started.result()}") + finally: + await provider.close() + + +async def main() -> None: + """Parse the flags and run the scenario.""" + await run(_common.parser(__doc__ or "").parse_args()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/june_scenarios/s6_activity_as_generator.py b/examples/streams/june_scenarios/s6_activity_as_generator.py new file mode 100644 index 000000000..170a86915 --- /dev/null +++ b/examples/streams/june_scenarios/s6_activity_as_generator.py @@ -0,0 +1,153 @@ +r"""Scenario "Activity as Producer", as return type (async generator). + +Status: emulated. + +Why: the yield-based activity signature is not built; each ``yield`` becomes +an append on the workflow's default topic, and his "load last heartbeat and +resume from snapshot" is a heartbeat checkpoint the retry reads back. + + python -m examples.streams.june_scenarios.s6_activity_as_generator workflow_streams + python -m examples.streams.june_scenarios.s6_activity_as_generator \ + native --address 127.0.0.1:7333 + +His shape is ``yield ProgressUpdate(...)`` inside the activity. Ours is +``await progress.append(ProgressUpdate(...))`` on +``activity.stream_handle().producer()``, followed by +``activity.heartbeat(next_step)`` once the step is safely written. + +The first attempt dies after writing step 3 and before checkpointing it. The +retry reads the checkpoint, so it starts again at step 3 rather than at the +top, and writes under a new attempt. The reader sees that change as a +``SUPERSEDED`` record and keys what it keeps by step, so step 3 arriving +twice, once per attempt, leaves one copy. The heartbeat is a hint, not the +truth: it can lag the stream, which is why the retry repeats a step rather +than skipping one. +""" + +from __future__ import annotations + +import argparse +import asyncio +import contextlib +from dataclasses import dataclass +from datetime import timedelta + +from examples.streams import _setup +from examples.streams.june_scenarios import _common +from temporalio import activity, workflow +from temporalio.common import RetryPolicy +from temporalio.streams import RecordKind +from temporalio.worker import Worker + + +@dataclass +class ProgressUpdate: + """One step of the agent loop.""" + + step: int + message: str + + +STEPS = ( + "Turn started", + "Turn ended", + "Tool call started", + "Tool call ended", + "Turn started", + "Turn ended", +) +CRASH_AFTER_STEP = 3 + + +@activity.defn +async def agent_activity(prompt: str) -> str: + """His generator: each ``yield`` is an append, each safe point a heartbeat.""" + info = activity.info() + # load last heartbeat and resume from snapshot + start = int(info.heartbeat_details[0]) if info.heartbeat_details else 0 + progress = activity.stream_handle().producer() + for step in range(start, len(STEPS)): + await progress.append(ProgressUpdate(step, STEPS[step])) + if step == CRASH_AFTER_STEP and info.attempt == 1: + raise RuntimeError("the worker died mid-stream") + # The checkpoint is the next step to write. A throttled heartbeat + # still reaches the server, because the worker sends the last one + # with the failure. + activity.heartbeat(step + 1) + await asyncio.sleep(0.1) + await progress.finish() + return f"answered {prompt!r} in attempt {info.attempt} from step {start}" + + +@workflow.defn +class AgentSession: + """Runs the generator activity and returns what it answered.""" + + @workflow.run + async def run(self, prompt: str) -> str: + """Run the activity with a short retry, so the crash retries at once.""" + return await workflow.execute_activity( + agent_activity, + prompt, + start_to_close_timeout=timedelta(minutes=1), + heartbeat_timeout=timedelta(seconds=10), + retry_policy=RetryPolicy( + initial_interval=timedelta(milliseconds=200), maximum_attempts=3 + ), + ) + + +async def run(args: argparse.Namespace) -> None: + """Read the generator's values across the crash and the resumed retry.""" + _common.banner("s6 activity as generator", args.provider) + client, provider = await _setup.connect(args) + workflow_id, task_queue = _common.ids("june-s6") + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[AgentSession], + activities=[agent_activity], + ): + handle = await client.start_workflow( + AgentSession.run, "plan a trip", id=workflow_id, task_queue=task_queue + ) + kept: dict[int, str] = {} + # A failed attempt writes no FINISH, so the first one seen is the + # attempt that completed, and the read can stop there. + records = client.get_stream_handle(workflow_id).read( + result_type=ProgressUpdate + ) + async with contextlib.aclosing(records) as reading: + async for record in reading: + if record.kind is RecordKind.SUPERSEDED: + assert record.supersession is not None + change = record.supersession + print( + f" SUPERSEDED attempt {change.previous_attempt} " + f"by attempt {change.attempt}" + ) + elif record.kind is RecordKind.FINISH: + print(f" FINISH attempt {record.attempt}") + break + else: + assert record.value is not None + update = record.value + kept[update.step] = update.message + print( + f" DATA attempt {record.attempt} " + f"step {update.step} {update.message}" + ) + print(f" kept one copy of steps {sorted(kept)}") + print(f" {await handle.result()}") + finally: + await provider.close() + + +async def main() -> None: + """Parse the flags and run the scenario.""" + await run(_common.parser(__doc__ or "").parse_args()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/june_scenarios/s7_workflow_consumer.py b/examples/streams/june_scenarios/s7_workflow_consumer.py new file mode 100644 index 000000000..900ddc428 --- /dev/null +++ b/examples/streams/june_scenarios/s7_workflow_consumer.py @@ -0,0 +1,149 @@ +"""Scenario "Workflow as Consumer". + +Status: implemented for the workflow's own inbound topic; consuming a foreign +standalone stream from workflow code is unsupported by design. + +Why: a workflow reads its own topics as recorded observations that replay +re-supplies, and rule 5 keeps reading somebody else's stream out of this +release. + + python -m examples.streams.june_scenarios.s7_workflow_consumer workflow_streams + python -m examples.streams.june_scenarios.s7_workflow_consumer native --address 127.0.0.1:7333 + +His shape is ``workflow.StreamHandle[ProgressUpdate](stream_id="...", +offset=offset)`` with ``continue_as_new(update.offset)``. Ours is +``workflow.stream_reader(COMMANDS)`` on the workflow's own ``commands`` +topic, fed from outside by a producer. + +Two deliberate differences. First, the stream: his reads a standalone +stream by id, and ours reads only a topic the workflow owns. Reading a +foreign stream from workflow code is not exposed; the server half exists +(external subscriptions), and the memo's foreign-read sketch covers the SDK +half. Second, what crosses continue-as-new: his offset works because his +stream outlives the run. A workflow's topic belongs to one run on the native +and ``workflow_streams`` providers, a successor's starts empty, and a cursor +from the previous run is refused there. So the run hands over at a batch +boundary, marked by the sender's ``FINISH``, and what it carries is its own +checkpoint: what it has applied so far. The sender waits for the successor +before writing the next batch, which is the one piece of coordination the +per-run topic asks for. + +The memory provider keys a topic by workflow rather than by run, so a +successor would read its predecessor's batches again; it is skipped there. +""" + +from __future__ import annotations + +import argparse +import asyncio +from dataclasses import dataclass, field + +from examples.streams import _setup +from examples.streams.june_scenarios import _common +from temporalio import streams, workflow +from temporalio.client import Client +from temporalio.streams import RecordKind +from temporalio.worker import Worker + + +@dataclass +class Command: + """One instruction from outside.""" + + op: str + + +@dataclass +class Checkpoint: + """What a run carries into its successor instead of a cursor.""" + + run: int = 1 + applied: list[str] = field(default_factory=list) + + +COMMANDS = streams.topic("commands", Command) +STOP = "stop" + + +@workflow.defn +class ConsumerWorkflow: + """Reads its commands topic batch by batch, one batch per run.""" + + @workflow.run + async def run(self, checkpoint: Checkpoint) -> list[str]: + """Apply this run's batch, then continue as new or stop.""" + stop = False + async for record in workflow.stream_reader(COMMANDS): + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + assert record.value is not None + workflow.logger.info("got command %s", record.value.op) + if record.value.op == STOP: + stop = True + continue + checkpoint.applied.append(f"run {checkpoint.run}: {record.value.op}") + if stop: + return checkpoint.applied + # Taken at every batch boundary here, so the demo crosses runs; a + # real consumer would also wait for is_continue_as_new_suggested(). + workflow.continue_as_new( + Checkpoint(run=checkpoint.run + 1, applied=checkpoint.applied) + ) + + +async def current_run(client: Client, workflow_id: str, previous: str | None) -> str: + """Wait until the chain's newest run is a new one and still open.""" + while True: + description = await client.get_workflow_handle(workflow_id).describe() + assert description.run_id is not None + if description.run_id != previous and description.close_time is None: + return description.run_id + await asyncio.sleep(0.2) + + +async def run(args: argparse.Namespace) -> None: + """Send three batches, one per run, and print what the chain applied.""" + _common.banner("s7 workflow consumer", args.provider) + if args.provider == "memory": + print( + " the memory provider keeps one topic across the chain, not one per " + "run; skipped" + ) + return + client, provider = await _setup.connect(args) + workflow_id, task_queue = _common.ids("june-s7") + batches = [["open", "resize"], ["rotate"], ["close", STOP]] + try: + async with Worker(client, task_queue=task_queue, workflows=[ConsumerWorkflow]): + handle = await client.start_workflow( + ConsumerWorkflow.run, + Checkpoint(), + id=workflow_id, + task_queue=task_queue, + ) + run_id: str | None = None + for number, batch in enumerate(batches, start=1): + run_id = await current_run(client, workflow_id, run_id) + # A producer made now writes to the run that is current now. + sender = client.get_stream_handle(workflow_id).producer( + topic=COMMANDS, producer_id="console", attempt=1 + ) + for op in batch: + await sender.append(Command(op)) + await sender.finish() + print(f" batch {number} sent to run ...{run_id[-6:]}: {batch}") + for line in await handle.result(): + print(f" applied {line}") + finally: + await provider.close() + + +async def main() -> None: + """Parse the flags and run the scenario.""" + await run(_common.parser(__doc__ or "").parse_args()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/streams/june_scenarios/s8_nexus_consumers.py b/examples/streams/june_scenarios/s8_nexus_consumers.py new file mode 100644 index 000000000..736fb9307 --- /dev/null +++ b/examples/streams/june_scenarios/s8_nexus_consumers.py @@ -0,0 +1,277 @@ +r"""Scenarios over Nexus: client consumer, operation handler, workflow consumer. + +Status: "Client as Consumer over Standalone Nexus" is implemented; "Nexus +operation handler" returning a stream is emulated; "Workflow as Consumer +over Nexus" is unsupported by design. + +Why: the ``NexusStreams`` front serves outside reads through one endpoint, +so a client consumes over Nexus today, while a workflow's reads ride its +Workflow Task and never cross Nexus. + + python -m examples.streams.june_scenarios.s8_nexus_consumers native --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.s8_nexus_consumers \ + workflow_streams --address 127.0.0.1:7333 + +The run creates its own Nexus endpoint through the operator service, routed +to its worker's task queue, and deletes it at the end. ``--http`` is the +server's Nexus HTTP ingress, which the front posts to. + +(a) His consumer activity starts a stream operation, or on a retry gets the +operation handle by id, and reads from the offset in its heartbeat. Ours +reads through the front with ``front.get_stream_handle(client, +workflow_id).read(topic=SCORES, after=cursor)`` and heartbeats each record's +cursor. No operation handle is needed to resume: every read is a short sync +operation, so the cursor alone is the resume point. The first attempt dies +after two records and the retry picks up after the second. + +(b) His handler returns ``Stream[ProgressUpdate]``. Ours returns a +``StreamRef``, a plain dataclass naming the producing workflow and the +topic; the calling workflow passes it on as its result and the client reads +it through the front. Streams as first-class operation inputs and results +are the nexgen IDL follow-on. + +Not shown, by design: a workflow consuming over Nexus. The workflow half of +a provider records its reads on the Workflow Task, which cannot cross an +RPC, so the front has no workflow half. A workflow reads its own topics, as +in ``s7``. +""" + +from __future__ import annotations + +import argparse +import asyncio +import contextlib +from dataclasses import dataclass +from datetime import timedelta + +import nexusrpc +import nexusrpc.handler + +from examples.streams import _setup +from examples.streams.june_scenarios import _common +from temporalio import activity, nexus, streams, workflow +from temporalio.api.nexus.v1 import EndpointSpec, EndpointTarget +from temporalio.api.operatorservice.v1 import ( + CreateNexusEndpointRequest, + DeleteNexusEndpointRequest, +) +from temporalio.common import RetryPolicy, WorkflowIDConflictPolicy +from temporalio.streams import BEGINNING, Cursor, RecordKind +from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler +from temporalio.worker import Worker + + +@dataclass +class ScoreUpdate: + """One score change.""" + + home_score: int + away_score: int + + +@dataclass +class Consumed: + """What the consumer activity's last attempt read, and where it resumed.""" + + attempt: int + resumed_after: str + scores: list[str] + + +@dataclass +class GameRequest: + """Which game the operation should start.""" + + game_id: str + + +@dataclass +class StreamRef: + """A reference to a stream: the owning workflow and the topic name.""" + + workflow_id: str + topic: str + + +@dataclass +class CallerInput: + """The endpoint to call and the game to ask for.""" + + endpoint: str + game_id: str + + +SCORES = streams.topic("scores", ScoreUpdate) + + +@workflow.defn +class ScoresProducer: + """Publishes a short game on ``scores``.""" + + @workflow.run + async def run(self, updates: int) -> None: + """Publish ``updates`` scores, spaced out, then finish the topic.""" + scores = workflow.stream_writer(SCORES) + for n in range(updates): + scores.publish(ScoreUpdate(home_score=(n + 1) // 2, away_score=n // 2)) + await workflow.sleep(timedelta(milliseconds=300)) + scores.finish() + + +class Consumer: + """The consumer activity, holding the front it reads through.""" + + def __init__(self, front: NexusStreams) -> None: + """Read through ``front``.""" + self._front = front + + @activity.defn + async def consume_scores(self, workflow_id: str) -> Consumed: + """His standalone-Nexus consumer: resume from the cursor in the heartbeat.""" + info = activity.info() + token = str(info.heartbeat_details[0]) if info.heartbeat_details else "" + after = Cursor(token) if token else BEGINNING + stream = self._front.get_stream_handle(activity.client(), workflow_id) + scores: list[str] = [] + async with contextlib.aclosing( + stream.read(topic=SCORES, after=after) + ) as reading: + async for record in reading: + if record.kind is RecordKind.FINISH: + break + assert record.value is not None + scores.append(f"{record.value.home_score}-{record.value.away_score}") + activity.heartbeat(record.cursor.token) + if info.attempt == 1 and len(scores) == 2: + raise RuntimeError("the consumer died after two records") + return Consumed(info.attempt, token or "BEGINNING", scores) + + +@nexusrpc.service +class ScoresService: + """A service whose operation hands back a stream reference.""" + + start_game: nexusrpc.Operation[GameRequest, StreamRef] + + +@nexusrpc.handler.service_handler(service=ScoresService) +class ScoresHandler: + """Starts the producing workflow and returns where to read it.""" + + def __init__(self, task_queue: str) -> None: + """Start producers on ``task_queue``.""" + self._task_queue = task_queue + + @nexusrpc.handler.sync_operation + async def start_game( + self, _ctx: nexusrpc.handler.StartOperationContext, input: GameRequest + ) -> StreamRef: + """His "pre-create and start" handler, returning a reference instead of a stream.""" + # Reusing a running workflow makes a retried start of this sync + # operation hand back the same reference. + await nexus.client().start_workflow( + ScoresProducer.run, + 3, + id=input.game_id, + task_queue=self._task_queue, + id_conflict_policy=WorkflowIDConflictPolicy.USE_EXISTING, + ) + return StreamRef(workflow_id=input.game_id, topic=SCORES.name) + + +@workflow.defn +class Caller: + """Calls the operation and passes the reference on; it never reads the stream.""" + + @workflow.run + async def run(self, input: CallerInput) -> StreamRef: + """Return the stream reference the operation handed back.""" + client = workflow.create_nexus_client( + service=ScoresService, endpoint=input.endpoint + ) + return await client.execute_operation( + ScoresService.start_game, GameRequest(input.game_id) + ) + + +async def run(args: argparse.Namespace) -> None: + """Consume through the front from an activity, then read a returned reference.""" + _common.banner("s8 nexus consumers", args.provider) + client, provider = await _setup.connect(args) + workflow_id, task_queue = _common.ids("june-s8") + endpoint_name = workflow_id + created = await client.operator_service.create_nexus_endpoint( + CreateNexusEndpointRequest( + spec=EndpointSpec( + name=endpoint_name, + target=EndpointTarget( + worker=EndpointTarget.Worker( + namespace=client.namespace, task_queue=task_queue + ) + ), + ) + ) + ) + front = NexusStreams(endpoint=endpoint_name, http_address=args.http) + consumer_activities = Consumer(front) + try: + async with Worker( + client, + task_queue=task_queue, + workflows=[ScoresProducer, Caller], + activities=[consumer_activities.consume_scores], + # The front's handler serves the store this worker writes to, and + # the scores service sits beside it behind the same endpoint. + nexus_service_handlers=[ + TemporalStreamsHandler(provider, client), + ScoresHandler(task_queue), + ], + ): + print(" (a) activity consumer through the front, resuming from heartbeat") + producer = await client.start_workflow( + ScoresProducer.run, 5, id=f"{workflow_id}-a", task_queue=task_queue + ) + consumer = await client.start_activity( + consumer_activities.consume_scores, + producer.id, + id=f"{workflow_id}-consumer", + task_queue=task_queue, + start_to_close_timeout=timedelta(minutes=1), + retry_policy=RetryPolicy(initial_interval=timedelta(milliseconds=200)), + ) + consumed = await consumer.result() + print( + f" attempt {consumed.attempt} resumed after {consumed.resumed_after}" + ) + print(f" and read {consumed.scores}") + await producer.result() + + print(" (b) an operation returns a stream reference; the client reads it") + ref = await client.execute_workflow( + Caller.run, + CallerInput(endpoint_name, f"{workflow_id}-b"), + id=f"{workflow_id}-caller", + task_queue=task_queue, + ) + print(f" operation returned {ref}") + async for record in front.get_stream_handle(client, ref.workflow_id).read( + topic=ref.topic, result_type=ScoreUpdate + ): + print(f" {record.kind.name:6} {record.value}") + finally: + await front.close() + await client.operator_service.delete_nexus_endpoint( + DeleteNexusEndpointRequest( + id=created.endpoint.id, version=created.endpoint.version + ) + ) + await provider.close() + + +async def main() -> None: + """Parse the flags and run the scenario.""" + await run(_common.parser(__doc__ or "").parse_args()) + + +if __name__ == "__main__": + asyncio.run(main()) From 037413769cca991528115938a0a1b65b75267e3c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 08:49:52 -0700 Subject: [PATCH 669/831] Followed the s3 chain live on workflow_streams again. The merged provider fix accepts a poll that reaches a run before its handler is registered, so the finished-chain fallback is no longer needed. --- examples/streams/june_scenarios/README.md | 9 +-------- .../streams/june_scenarios/s3_workflow_producer.py | 10 ---------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/examples/streams/june_scenarios/README.md b/examples/streams/june_scenarios/README.md index 9b377cdc8..78d2abedc 100644 --- a/examples/streams/june_scenarios/README.md +++ b/examples/streams/june_scenarios/README.md @@ -11,7 +11,7 @@ reaches into private SDK code or adds a feature. |---|---|---|---| | Client starts and consume stream: primary and named | `s1_client_consumes.py` | implemented | Default topic with no name, a typed topic, `last=N`, `after=END`, `BEGINNING` on a moved floor (memory only) | | Client starts and consume stream: standalone alt 1, 2, 3 | `s2_standalone_streams.py` | alt 2 implemented; alts 1 and 3 open | Native only. Shows `StreamNotFoundError` for alt 1; wait-for-creation reads and start-committed stream arguments are open questions on the blueprint | -| Workflow as Producer: as named handle | `s3_workflow_producer.py` | implemented | His turn loop with continue-as-new; the client follows the chain. On `workflow_streams` the live follow across runs hits a provider bug, so it reads the finished chain there | +| Workflow as Producer: as named handle | `s3_workflow_producer.py` | implemented | His turn loop with continue-as-new; the client follows the chain live | | Workflow as Producer: as return type | `s4_workflow_as_generator.py` | emulated | Default-topic publishes plus `FINISH`, result from the workflow; the generator signature is sugar not built | | Activity as Producer: as named handle | `s5_activity_producers.py` | implemented | Workflow topic (Path B), `scope="activity"`, standalone activity; the last two on native and memory only | | Activity as Producer: as return type | `s6_activity_as_generator.py` | emulated | Appends plus a heartbeat checkpoint; the retry resumes and readers see `SUPERSEDED` | @@ -42,13 +42,6 @@ because it is not replay-safe; these scenarios keep a warm cache. `redis` is accepted too, with `--redis`, but was not part of the runs behind this directory. -On `workflow_streams`, an outside read that polls before the run's first -Workflow Task can be refused inside the provider, because its poll handler -is registered when the workflow function starts, after the Update in that -first task has already been turned away. It is a provider bug, not a demo -one, and a rerun passes; s3 steps around it on that provider because a -successor run hits it every time. - A scenario a provider cannot serve says so in its output and moves on: `s2` on anything but `native`, `s5` (b) and (c) on `workflow_streams` and `redis`, `s1` (d) on anything but `memory`, and `s7` on `memory`, which diff --git a/examples/streams/june_scenarios/s3_workflow_producer.py b/examples/streams/june_scenarios/s3_workflow_producer.py index 555a52e09..9bf60e29e 100644 --- a/examples/streams/june_scenarios/s3_workflow_producer.py +++ b/examples/streams/june_scenarios/s3_workflow_producer.py @@ -20,12 +20,6 @@ also every two turns here so a short demo crosses runs. Each run's topic belongs to that run, and the client's read walks from one run to the next without being told. - -On ``workflow_streams`` a live read across continue-as-new currently fails -inside the provider: its poll Update reaches the successor run before that -run has registered the handler for it. So there the client waits for the -chain to finish and then reads it whole. That still walks every run, and the -output says which mode ran. """ from __future__ import annotations @@ -140,10 +134,6 @@ async def run(args: argparse.Namespace) -> None: id=workflow_id, task_queue=task_queue, ) - if args.provider == "workflow_streams": - print(" live follow across runs is blocked here; reading the") - print(" finished chain instead") - await handle.result() # No run id on the handle, so the read follows the chain and ends # when its last run is closed and the tail has been delivered. async for record in client.get_stream_handle(workflow_id).read( From 515b59195cf2685260f9aa570a5d252d52555cea Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 10:05:52 -0700 Subject: [PATCH 670/831] Regenerated the Nexus system API for the repinned Core WIT. The Core repin at this layer updated the nexus WIT doc strings and marked user metadata experimental, but only the protobuf output was regenerated. The check-protos job regenerates with nexgen 0.2.4 and saw these two files drift. --- temporalio/nexus/system/workflow_service/models.py | 5 +++++ .../operations/signal_with_start_workflow.py | 11 ++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/temporalio/nexus/system/workflow_service/models.py b/temporalio/nexus/system/workflow_service/models.py index 1e81199db..232bc91ca 100644 --- a/temporalio/nexus/system/workflow_service/models.py +++ b/temporalio/nexus/system/workflow_service/models.py @@ -239,6 +239,11 @@ def to_transfer_type( @dataclasses.dataclass(slots=True) class UserMetadata: + """ + .. warning:: + This API is experimental and subject to change. + """ + static_summary: typing.Any | None = None static_details: typing.Any | None = None diff --git a/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py b/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py index 177666ae9..2698b110a 100644 --- a/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py +++ b/temporalio/nexus/system/workflow_service/operations/signal_with_start_workflow.py @@ -575,7 +575,7 @@ async def signal_with_start_workflow( args: List-form arguments for workflow. Cannot be set if positional_args are set. For typed workflow callables, list contents are not statically typechecked; pass workflow arguments positionally for precise typechecking. - id: Unique identifier for the workflow execution. + id: Unique identifier for the workflow execution. Must be nonempty. task_queue: Task queue to run the workflow on. signal: Signal name or callable to send with the start request. signal_args: Argument value, or list of argument values, for signal. For typed @@ -584,14 +584,15 @@ async def signal_with_start_workflow( pass a single signal argument that is itself a list, wrap it in another list; otherwise the list is interpreted as multiple signal arguments. execution_timeout: Total workflow execution timeout, including retries and - continue-as-new. - run_timeout: Timeout of a single workflow run. - task_timeout: Timeout of a single workflow task. + continue-as-new. Defaults to unlimited. + run_timeout: Timeout of a single workflow run. Defaults to the workflow + execution timeout. + task_timeout: Timeout of a single workflow task. Defaults to 10 seconds. id_reuse_policy: Behavior when a closed workflow with the same ID exists. Default is allow-duplicate. id_conflict_policy: Behavior when a workflow is currently running with the same ID. Set to use-existing for idempotent deduplication on workflow ID. Cannot - be set if id-reuse-policy is terminate-if-running. + be set if id-reuse-policy is terminate-if-running. Defaults to use-existing. retry_policy: Retry policy for the workflow. cron_schedule: Cron schedule for recurring workflow executions. See https://docs.temporal.io/cron-job. From 2332342d6c28d1dd92179c2b8d08388bca3e29ce Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 10:10:31 -0700 Subject: [PATCH 671/831] Absorbed the current stream contract on Workflow Streams. The provider serves a read that starts at END or at the last N records, defaults the topic when a call names none, and refuses a stream an activity owns, since its log lives inside a running workflow. The conformance setup gained the truncate hook and the worker the shared cases expect. --- .../streams/providers/workflow_streams.py | 147 ++++++++++++++++-- tests/streams/test_streams_conformance.py | 64 +++++++- .../streams/test_workflow_streams_provider.py | 71 +++++++++ 3 files changed, 265 insertions(+), 17 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 2b5f1b625..b03fbbbe4 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -49,7 +49,7 @@ import logging from collections.abc import AsyncGenerator from datetime import timedelta -from typing import Any, Generic, TypeVar +from typing import Any, Generic, NoReturn, TypeVar from google.protobuf.message import DecodeError @@ -82,9 +82,17 @@ StreamCursorError, StreamError, StreamNotFoundError, + StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -108,6 +116,7 @@ _PROVIDER = "workflow_streams" _TAIL_QUERY = "__temporal_streams_tail" _LATEST_QUERY = "__temporal_streams_latest" +_START_QUERY = "__temporal_streams_start" _ENCODING = b"binary/plain" # The same cap the shipped poll path answers under, because both are one # response through the same server. @@ -184,6 +193,8 @@ def __init__(self, stream: WorkflowStream | None = None) -> None: workflow.set_query_handler(_TAIL_QUERY, self._tail) if workflow.get_query_handler(_LATEST_QUERY) is None: workflow.set_query_handler(_LATEST_QUERY, self._latest) + if workflow.get_query_handler(_START_QUERY) is None: + workflow.set_query_handler(_START_QUERY, self._start) def _tail(self, from_offset: int, topic: str) -> dict[str, Any]: """One page of ``topic``'s items at or past ``from_offset``. @@ -223,6 +234,33 @@ def _latest(self, topic: str) -> int: return offset return -1 + def _start(self, topic: str, last_n: int) -> int: + """Where a read starts: the log's head, or ``topic``'s newest ``last_n`` records. + + Zero ``last_n`` asks for the head, which is where ``END`` starts. + """ + return start_offset(self.stream, topic, last_n) + + +def start_offset(stream: WorkflowStream, topic: str, last_n: int) -> int: + """The log offset a read of ``topic`` starts at. + + ``last_n`` of zero is the head of the log, so only what is published next + is read. Otherwise it is the offset of ``topic``'s ``last_n``-th newest + item, or the oldest one the log holds when there are fewer. The log is + workflow state, so the workflow half answers the same on every replay. + """ + if last_n <= 0: + return stream.next_offset + items = stream.items_from(0) + seen = 0 + for offset, item_topic, _ in reversed(items): + if item_topic == topic: + seen += 1 + if seen == last_n: + return offset + return items[0][0] if items else stream.next_offset + def _registered_stream() -> WorkflowStream | None: handler = workflow.get_signal_handler(PUBLISH_SIGNAL_NAME) @@ -311,10 +349,25 @@ def _own_stream(self) -> WorkflowStream: self._stream = _instance().stream return self._stream - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: + check_read_start(after, last) _require_topic(topic) run_id = workflow.info().run_id start = 0 + # The log is workflow state, so END and last= resolve against it here + # and land on the same offset on every replay. + if last is not None: + return _WSReadSource( + self._own_stream(), + topic, + start_offset(self._own_stream(), topic, last), + run_id, + ) + if after == END: + stream = self._own_stream() + return _WSReadSource(stream, topic, stream.next_offset, run_id) named = _position(after) if named is not None: if named[0] != run_id: @@ -492,35 +545,48 @@ def __init__( def read( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes.""" + """Yield records on ``topic`` from where the read starts until the chain, or the pinned run, closes. + + ``BEGINNING`` is the oldest item the first retained run's log still + holds: the poll Update reads offset zero as the log's base. ``END`` + and ``last=`` start on the current run, or the pinned one, at an + offset its workflow answers by Query when the read starts. + """ + check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. - named = _position(after) + named = None if after == END else _position(after) if named is not None and self._run_id is not None and named[0] != self._run_id: raise StreamCursorError( f"cursor {after.token!r} names another run than this handle is pinned to" ) - return self._read(topic, named, after, result_type) + return self._read(topic, named, after, last, result_type) async def _read( self, topic: str, named: tuple[str, int] | None, after: Cursor, + last: int | None, result_type: type | None, ) -> AsyncGenerator[StreamRecord[Any], None]: - decoder = RecordDecoder( - self._converter, result_type, after=after, warn=logger.warning - ) if named is not None: run_id, offset = named[0], named[1] + 1 + elif last is not None or after == END: + run_id, offset = await self._start_on_current_run(topic, last or 0) + # A synthesized record is positioned before the first one read. + after = _cursor(run_id, offset - 1) else: run_id, offset = self._run_id or await self._first_run(), 0 + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) while True: handle = self._handle(run_id) next_offset = offset @@ -750,7 +816,41 @@ async def _tail( ] return items, wire["next_offset"], bool(wire["more_ready"]) - async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + async def _start_on_current_run(self, topic: str, last_n: int) -> tuple[str, int]: + """The run a read at ``END`` or of the newest records starts on, and the offset. + + Raises: + StreamUnsupportedError: The workflow's worker runs a provider that + predates these reads and cannot answer where they start. + """ + handle = self._handle(self._run_id) + description = await self._describe(handle) + if description is None: + raise StreamNotFoundError(f"workflow {self._workflow_id!r} was not found") + run_id = description.run_id + assert run_id is not None + try: + offset = await self._handle(run_id).query( + _START_QUERY, args=[topic, last_n], result_type=int + ) + except WorkflowQueryFailedError as error: + if QUERY_HANDLER_NOT_FOUND not in str(error): + raise StreamError( + f"the start query on workflow {self._workflow_id!r} failed: {error}" + ) from error + raise StreamUnsupportedError( + f"workflow {self._workflow_id!r} does not answer where a read at END " + "or of the last records starts; its worker's provider predates them" + ) from error + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} was not found" + ) from error + raise + return run_id, offset + + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The newest position holding a record on ``topic``. The log is one per run, so the cursor names the run it was read from: @@ -795,7 +895,7 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: def producer( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, producer_id: str = "", attempt: int = 0, ) -> WorkflowStreamsProducer[Any]: @@ -831,5 +931,28 @@ def get_stream_handle( """A handle on ``workflow_id``'s log; without ``run_id`` it follows the chain.""" return WorkflowStreamsHandle(client, workflow_id, run_id, self._poll_cooldown) + def get_activity_stream_handle( + self, + client: Client, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> NoReturn: + """Refused: this provider cannot hold a stream an activity owns. + + The log lives inside a running workflow and is served by its handlers, + and a standalone activity has no workflow to host one. An activity + writes to its workflow's topics instead, through + ``activity.stream_handle()`` without a scope. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the workflow streams provider cannot hold a stream an activity owns: its " + "log lives inside a running workflow" + ) + async def close(self) -> None: """Nothing to release: the provider holds no connection of its own.""" diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 8b1560f1d..942595170 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -48,6 +48,7 @@ Supersession, topic, ) +from temporalio.streams.providers import workflow_streams from temporalio.streams.providers.memory import MemoryStreams from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from tests.helpers import new_worker @@ -74,6 +75,8 @@ class ProviderCase: """``append()`` compares a repeat's content with what it already holds.""" host: Callable[[str], Awaitable[None]] | None = None """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" + task_queue: str | None = None + """Where the setup's worker runs the workflows below, when it has one.""" truncate: Callable[[str, str, int], Awaitable[None]] | None = None """Drops all but the newest records of a workflow's topic, standing in for retention, or ``None`` when the provider offers no way to.""" @@ -106,8 +109,8 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: @workflow.defn -class StreamHost: - """Owns a stream and lingers, so outside code has a running workflow to address.""" +class TruncatingStreamHost: + """A stream host whose log an update can truncate, the way a workflow's retention would.""" def __init__(self) -> None: self._released = False @@ -116,11 +119,28 @@ def __init__(self) -> None: def release(self) -> None: self._released = True + @workflow.update + def truncate(self, topic: str, keep: int) -> None: + stream = workflow_streams._instance().stream # pyright: ignore[reportPrivateUsage] + stream.truncate(workflow_streams.start_offset(stream, topic, keep)) + @workflow.run async def run(self) -> None: await workflow.wait_condition(lambda: self._released) +@workflow.defn +class DefaultTopicAnswer: + """Reads one value on its default topic and answers on the same topic.""" + + @workflow.run + async def run(self) -> None: + reader = workflow.stream_reader(result_type=dict) + async for value in reader.values(): + workflow.stream_writer().publish({"answer": value["n"] * 2}) + reader.close() + + async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: # No STREAMS_LIVE gate: the store is the workflow's own History, which the # test environment's server provides. @@ -131,14 +151,21 @@ async def _workflow_streams_case(client: Client) -> AsyncIterator[ProviderCase]: config["plugins"] = [provider] client = Client(**config) hosts: dict[str, WorkflowHandle[Any, Any]] = {} - async with new_worker(client, StreamHost) as worker: + async with new_worker(client, TruncatingStreamHost, DefaultTopicAnswer) as worker: async def host(workflow_id: str) -> None: if workflow_id not in hosts: hosts[workflow_id] = await client.start_workflow( - StreamHost.run, id=workflow_id, task_queue=worker.task_queue + TruncatingStreamHost.run, + id=workflow_id, + task_queue=worker.task_queue, ) + async def truncate(workflow_id: str, topic: str, keep: int) -> None: + await hosts[workflow_id].execute_update( + TruncatingStreamHost.truncate, args=[topic, keep] + ) + yield ProviderCase( "workflow_streams", provider, @@ -149,6 +176,8 @@ async def host(workflow_id: str) -> None: # the provider. detects_divergent_retries=False, host=host, + task_queue=worker.task_queue, + truncate=truncate, ) for handle in hosts.values(): await handle.terminate() @@ -377,6 +406,29 @@ async def test_naming_no_topic_addresses_the_default_topic(case: ProviderCase): assert await stream.latest(topic=DEFAULT_TOPIC) == records[0].cursor +async def test_a_workflow_answers_on_its_default_topic(case: ProviderCase): + if case.client is None or case.task_queue is None: + pytest.skip( + f"the {case.name} setup runs no worker; test_streams_workflow covers " + "its workflow half" + ) + workflow_id = new_workflow_id() + handle = await case.client.start_workflow( + DefaultTopicAnswer.run, id=workflow_id, task_queue=case.task_queue + ) + stream = case.client.get_stream_handle(workflow_id) + await stream.producer(producer_id="client", attempt=1).append({"n": 21}) + await handle.result() + + # The outside producer and the workflow, each naming no topic, meet on + # one topic that a reader naming none sees in order. + records = await take(stream.read(), 2, timeout=30.0) + assert [(r.topic, r.producer_id, r.value) for r in records] == [ + (DEFAULT_TOPIC, "client", {"n": 21}), + (DEFAULT_TOPIC, "", {"answer": 42}), + ] + + async def test_cursor_resumes_where_it_points(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) @@ -538,8 +590,10 @@ async def test_beginning_starts_at_the_oldest_record_still_held(case: ProviderCa assert [r.value for r in records] == [{"n": 3}, {"n": 4}] newest = await take(stream.read(topic=OUT, last=3), 2) assert [r.value for r in newest] == [{"n": 3}, {"n": 4}] + # A cursor below the floor is refused. A provider that needs a round trip + # to know says so on the first step rather than on the call. with pytest.raises(StreamCursorError): - stream.read(topic=OUT, after=before[0].cursor) + await take(stream.read(topic=OUT, after=before[0].cursor), 1) async def test_a_read_start_names_one_place(case: ProviderCase): diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 4b88e16c1..6415f07ad 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -31,10 +31,12 @@ from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( BEGINNING, + END, RecordKind, StreamCursorError, StreamError, StreamNotFoundError, + StreamUnsupportedError, Supersession, ) from temporalio.streams._wire import WireRecord @@ -786,3 +788,72 @@ async def test_the_dedupe_sequence_names_where_the_records_end(): # the retry's re-split reaches past it, and only the new record does. assert _sequences(first.sent) == [(3, [1, 2])] assert _sequences(second.sent) == [(2, [1]), (3, [2]), (4, [3])] + + +@workflow.defn +class StartsWhenTold: + """Opens a reader on ``inputs`` at the start a signal names and returns what it read.""" + + def __init__(self) -> None: + self._start: str | None = None + + @workflow.signal + def begin(self, start: str) -> None: + self._start = start + + @workflow.run + async def run(self) -> list[Any]: + await workflow.wait_condition(lambda: self._start is not None) + if self._start == "end": + reader = workflow.stream_reader(INPUTS, result_type=dict, after=END) + want = 1 + else: + reader = workflow.stream_reader(INPUTS, result_type=dict, last=2) + want = 2 + values: list[Any] = [] + async for value in reader.values(): + values.append(value["n"]) + if len(values) == want: + break + return values + + +async def test_a_workflow_reader_starts_at_end_or_the_newest_records( + client: Client, provider: WorkflowStreamsProvider +): + # The log is workflow state, so both starts resolve against it on the + # workflow thread; a cold cache replays every task and has to land the + # reader on the same offset each time. + async with new_worker( + client, StartsWhenTold, plugins=[provider], max_cached_workflows=0 + ) as worker: + for start, expected in (("last", [3, 4]), ("end", ["new"])): + handle = await client.start_workflow( + StartsWhenTold.run, + id=f"ws-start-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + stream = provider.get_stream_handle(client, handle.id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + await handle.signal(StartsWhenTold.begin, start) + result = asyncio.ensure_future(handle.result()) + if start == "end": + for _ in range(150): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({result}, timeout=0.2) + if done: + break + assert await asyncio.wait_for(result, 30) == expected + + +async def test_a_stream_an_activity_owns_is_refused( + client: Client, provider: WorkflowStreamsProvider +): + # The log lives inside a running workflow, so an activity has no place to + # put a stream of its own here. The refusal is the documented error, not + # an AttributeError or a stream silently put somewhere else. + with pytest.raises(StreamUnsupportedError, match="activity"): + provider.get_activity_stream_handle(client, "act") + with pytest.raises(StreamUnsupportedError, match="activity"): + provider.get_activity_stream_handle(client, "act", workflow_id="wf") From 65635589edbce661e298022ba64878eb8c9e90ad Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 10:12:52 -0700 Subject: [PATCH 672/831] Absorbed the current stream contract on the Nexus front. The front defaults the topic, carries last_n on the contract so the store behind the endpoint resolves where the newest records start, maps END onto the endpoint's newest position, and refuses a stream an activity owns, since the operations address a stream by workflow only. --- .../providers/_nexus_generated/models.py | 39 ++++++++ temporalio/streams/providers/nexus.py | 92 ++++++++++++++++--- .../providers/temporal_streams.nexusrpc.yaml | 8 ++ tests/streams/test_nexus_provider.py | 56 +++++++++++ tests/streams/test_streams_conformance.py | 5 + 5 files changed, 186 insertions(+), 14 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index 2677843ef..cab83100b 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -525,6 +525,27 @@ def from_transfer_type( else: latest_only_value = latest_only_value_raw + last_n_value: int | None = None + if "last_n" in raw: + last_n_value_raw = raw["last_n"] + if last_n_value_raw is None: + violations.append( + Violation(path="last_n", reason="explicit null not allowed") + ) + else: + last_n_value_parsed = _parse_spec_integer( + last_n_value_raw, "last_n", violations + ) + if last_n_value_parsed is not None: + last_n_value = last_n_value_parsed + if last_n_value < 1: + violations.append( + Violation( + path="last_n", + reason=f"must be >= 1, got {last_n_value}", + ) + ) + for key in raw: if ( key != "workflow_id" @@ -534,6 +555,7 @@ def from_transfer_type( and key != "max_records" and key != "wait_ms" and key != "latest_only" + and key != "last_n" ): violations.append(Violation(path=key, reason="unknown field")) if violations: @@ -546,6 +568,7 @@ def from_transfer_type( max_records=max_records_value, wait_ms=wait_ms_value, latest_only=latest_only_value, + last_n=last_n_value, ) @typing_extensions.override @@ -600,6 +623,16 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: out["wait_ms"] = value.wait_ms if value.latest_only is not None: out["latest_only"] = value.latest_only + if value.last_n is not None: + if abs(value.last_n) > 9007199254740991: + violations.append( + Violation(path="last_n", reason="exceeds ±(2^53-1) integer cap") + ) + if value.last_n < 1: + violations.append( + Violation(path="last_n", reason=f"must be >= 1, got {value.last_n}") + ) + out["last_n"] = value.last_n if violations: raise temporalio.converter.create_payload_validation_error(violations) return out @@ -642,6 +675,12 @@ class ReadInput: from now. """ + last_n: int | None = None + """With no after_token, start at the newest this many records, or at all of them when + the stream holds fewer. Records of every kind count. Refused alongside an + after_token, which is how a read resumes. + """ + class _ReadOutputTransferTypeConverter( temporalio.converter.TransferTypeConverter["ReadOutput", typing.Any] diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 84e94c551..dec565ea1 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -84,7 +84,14 @@ StreamUnsupportedError, ) from temporalio.streams._provider import StreamHandle, StreamProducer, StreamProvider -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -210,6 +217,8 @@ class _Subscription: records: asyncio.Queue[StreamRecord[Any]] position: str last_used: float + last_n: int | None = None + """The newest-N start this subscription was opened with, when it had no token.""" pump: asyncio.Task[None] | None = None failure: BaseException | None = None done: bool = False @@ -431,15 +440,26 @@ async def _read( left = deadline - datetime.now(timezone.utc) - _DEADLINE_MARGIN wait = max(0.0, min(wait, left.total_seconds())) after = input.after_token or "" + if after and input.last_n is not None: + raise ValueError( + "pass either after_token or last_n, not both: a token resumes a " + "read and last_n starts one" + ) key = (input.workflow_id, input.run_id or "", input.topic) await self._expire_subscriptions() lock = self._read_locks.setdefault(key, asyncio.Lock()) async with lock: subscription = self._subscriptions.get(key) - if subscription is None or subscription.position != after: + if ( + subscription is None + or subscription.position != after + or (not after and subscription.last_n != input.last_n) + ): if subscription is not None: await self._drop(key) - subscription = self._subscribe(key, stream, input.topic, after) + subscription = self._subscribe( + key, stream, input.topic, after, input.last_n + ) try: records, next_token = await self._drain(subscription, max_records, wait) except Exception: @@ -462,20 +482,30 @@ async def _read( return ReadOutput(records=records, next_token=next_token, done=done) def _subscribe( - self, key: tuple[str, str, str], stream: StreamHandle, topic: str, after: str + self, + key: tuple[str, str, str], + stream: StreamHandle, + topic: str, + after: str, + last_n: int | None, ) -> _Subscription: # Raw payloads: the handler forwards what the store holds without # decoding it, so an encoding only the caller's codec understands # passes through untouched. A foreign token is refused right here. - source = stream.read( - topic=topic, - after=Cursor(after) if after else BEGINNING, - result_type=RawValue, + source = ( + stream.read(topic=topic, last=last_n, result_type=RawValue) + if last_n is not None + else stream.read( + topic=topic, + after=Cursor(after) if after else BEGINNING, + result_type=RawValue, + ) ) subscription = _Subscription( records=asyncio.Queue(maxsize=_QUEUE_DEPTH), position=after, last_used=time.monotonic(), + last_n=last_n, ) async def pump() -> None: @@ -822,11 +852,17 @@ def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: def read( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after``, one endpoint batch at a time. + """Yield records on ``topic`` from where the read starts, one endpoint batch at a time. + + ``BEGINNING`` and ``last=`` are resolved by the store behind the + endpoint on the first call. ``END`` is the endpoint's newest position, + asked for with a ``latest_only`` call when the read starts, and the + read resumes after it, so it yields only what is appended from then on. The token is opaque here, so a cursor from another store is refused by the store behind the endpoint and raises @@ -839,16 +875,23 @@ def read( the store stay, and a caller that stops and starts many reads on one topic should expect that lag rather than an immediate release. """ + check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) - return self._read(topic, after, result_type) + return self._read(topic, after, last, result_type) async def _read( - self, topic: str, after: Cursor, result_type: type | None + self, topic: str, after: Cursor, last: int | None, result_type: type | None ) -> AsyncGenerator[StreamRecord[Any], None]: + if after == END: + after = await self.latest(topic=topic) + # Where last= lands is the store's to say, so BEGINNING stands in for + # the position before it: a resume from it may repeat a record, where + # anything later could skip one. decoder = RecordDecoder( self._front.converter, result_type, after=after, warn=logger.warning ) token = after.token + last_n = last while True: answer = await self._front.invoke( _READ_OPERATION, @@ -857,6 +900,7 @@ async def _read( run_id=self._run_id, topic=topic, after_token=token, + last_n=last_n, max_records=self._front.max_records, wait_ms=int(self._front.read_wait.total_seconds() * 1000), ), @@ -878,10 +922,12 @@ async def _read( for out in decoder.decode(cursor, record): yield out token = answer.next_token or token + if token: + last_n = None if answer.done: return - async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: """The newest position on ``topic`` behind the endpoint, for following from now.""" topic, _ = resolve_topic(topic) answer = await self._front.invoke( @@ -901,7 +947,7 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: def producer( self, *, - topic: str | StreamTopic[Any], + topic: str | StreamTopic[Any] | None = None, producer_id: str = "", attempt: int = 0, ) -> NexusProducer[Any]: @@ -995,6 +1041,24 @@ def get_stream_handle( """ return NexusStreamHandle(_Front(self, client), workflow_id, run_id) + def get_activity_stream_handle( + self, + client: Client | None, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> NoReturn: + """Refused: the endpoint's operations address a stream by workflow only. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the nexus provider cannot reach a stream an activity owns: the endpoint's " + "operations address a stream by workflow only" + ) + async def close(self) -> None: """Nothing to release: each call opens and closes its own connection.""" diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index bf97209b3..482335ed8 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -157,6 +157,14 @@ $defs: description: >- Answer with the newest position and no records, for a reader that wants to follow from now. + last_n: + type: integer + minimum: 1 + description: >- + With no after_token, start at the newest this many records, or at + all of them when the stream holds fewer. Records of every kind + count. Refused alongside an after_token, which is how a read + resumes. required: - workflow_id - topic diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 051ed1306..660aa6e3b 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -40,6 +40,7 @@ from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( BEGINNING, + END, Cursor, RecordKind, StreamCursorError, @@ -784,3 +785,58 @@ def _disconnect(*args: Any, **kwargs: Any) -> Any: # A url urllib cannot even build a request from does not escape either. with pytest.raises(nexus._EndpointFailure): # pyright: ignore[reportPrivateUsage] nexus._post("not a url", b"{}", {}, timedelta(seconds=1)) # pyright: ignore[reportPrivateUsage] + + +async def test_the_front_carries_every_read_start(monkeypatch: pytest.MonkeyPatch): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + stream = _front(None).get_stream_handle(None, "wf-starts") + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + # last= rides the contract to the store behind the endpoint. + newest = await take( + stream.read(topic=INPUTS, result_type=dict, last=2), 2, timeout=30 + ) + assert [record.value for record in newest] == [{"n": 2}, {"n": 3}] + + # END is the endpoint's newest position when the read starts. + at_end = stream.read(topic=INPUTS, result_type=dict, after=END) + first = asyncio.ensure_future(at_end.__anext__()) + try: + for _ in range(100): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({first}, timeout=0.1) + if done: + break + record = await asyncio.wait_for(first, 30) + finally: + await at_end.aclose() + assert record.value == {"n": "new"} + + # A token resumes a read and last_n starts one, so the two are refused. + with pytest.raises(nexusrpc.HandlerError) as both: + await _dispatch( + handler, + READ_OPERATION, + ReadInput( + workflow_id="wf-starts", + topic=INPUTS, + after_token=newest[0].cursor.token, + last_n=1, + ), + ) + assert both.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + await handler.close() + + +async def test_a_stream_an_activity_owns_is_refused(client: Client): + # The endpoint's operations address a stream by workflow, so the front has + # no way to reach one an activity owns. The refusal is the documented + # error, not an AttributeError or a stream silently put somewhere else. + front = _front(None) + with pytest.raises(StreamUnsupportedError, match="activity"): + front.get_activity_stream_handle(client, "act") + with pytest.raises(StreamUnsupportedError, match="activity"): + front.get_activity_stream_handle(client, "act", workflow_id="wf") diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 942595170..496efdb3f 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -11,6 +11,11 @@ skipped with a reason on a provider whose ``append()`` learns positions at read time. +``NexusStreams`` is deliberately absent from ``SETUPS``. It is a front with no +workflow half (its ``workflow_provider()`` raises), so there is no store for a +host workflow to own; ``test_nexus_provider`` covers it through an endpoint +that fronts a storage provider. + What this file pins down is what a provider owes: producer identity, retry deduplication, positions, supersession, topic addressing, cursor resumption, cursor ownership, and releasing a read the caller stopped early. Every case From 560f5a01edbef4216a9653e841625a1da263e229 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 12:44:03 -0700 Subject: [PATCH 673/831] Retried throttled and unavailable stream calls as sdk-core does. The stream client has a channel of its own, so Core's retry never covered it and a reader under frontend rate limiting raised mid-read. An append without a producer id goes again only on a refusal the server sent before doing anything, because the server has nothing to deduplicate it against. --- temporalio/client_stream.py | 277 +++++++++++++++++++++++++++--- tests/test_client_stream_owner.py | 1 + tests/test_client_stream_retry.py | 257 +++++++++++++++++++++++++++ 3 files changed, 507 insertions(+), 28 deletions(-) create mode 100644 tests/test_client_stream_retry.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 4364073d2..e2afc8297 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -26,11 +26,24 @@ :class:`temporalio.streams.StreamProducerError` when it refuses a producer sequence it already holds, and :class:`temporalio.service.RPCError` otherwise, never the transport's own exception type. + +A failure sdk-core would retry is retried here, on the same codes and with the +same default :class:`temporalio.service.RetryConfig`, because this channel is +not Core's and gets none of its retrying. ``RESOURCE_EXHAUSTED`` backs off +longer than the rest, as in Core, so a caller the server is throttling does not +add to the load. A call the server cannot tell from its own repeat, an append +without a producer id or a create, is retried only on ``RESOURCE_EXHAUSTED``, +which the server sends before it does anything. The budget is bounded; a caller +that wants a shorter one cancels, as with ``asyncio.timeout``, and the +cancellation lands whether an attempt or a wait between attempts is in progress. """ from __future__ import annotations import asyncio +import logging +import random +import time import weakref from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass @@ -42,9 +55,12 @@ from google.protobuf.message import Message import temporalio.api.streamservice.v1 as stream +from temporalio.api.common.v1 import GrpcStatus +from temporalio.api.enums.v1 import ResourceExhaustedCause +from temporalio.api.errordetails.v1 import ResourceExhaustedFailure from temporalio.api.stream.v1 import StreamRecord, StreamStartPosition from temporalio.api.streamservice.v1 import service_pb2_grpc -from temporalio.service import RPCError, RPCStatusCode +from temporalio.service import RetryConfig, RPCError, RPCStatusCode from temporalio.streams import StreamNotFoundError, StreamProducerError __all__ = [ @@ -60,12 +76,133 @@ _T = TypeVar("_T") +logger = logging.getLogger(__name__) + # The server refuses a producer sequence it already holds with a message and # no typed detail, so the phrase is the only thing to match on. Both refusals # it sends carry it: a repeat with different content, and one behind the # sequence it accepted last. _PRODUCER_CONFLICT = "producer sequence" +# The codes sdk-core retries. +_RETRYABLE = frozenset( + { + grpc.StatusCode.DATA_LOSS, + grpc.StatusCode.INTERNAL, + grpc.StatusCode.UNKNOWN, + grpc.StatusCode.RESOURCE_EXHAUSTED, + grpc.StatusCode.ABORTED, + grpc.StatusCode.OUT_OF_RANGE, + grpc.StatusCode.UNAVAILABLE, + } +) +# What the server sends before it does anything, so a call that cannot be told +# from its own repeat is still safe to make again on it. +_REFUSED = frozenset({grpc.StatusCode.RESOURCE_EXHAUSTED}) +# A message over the channel's limit comes back as RESOURCE_EXHAUSTED and is +# the same size every time. +_TOO_LARGE = ( + "grpc: received message larger than max", + "grpc: message after decompression larger than max", + "grpc: received message after decompression larger than max", +) +# The floor under a throttled call's wait, sdk-core's own. +_THROTTLE = RetryConfig( + initial_interval_millis=1000, + multiplier=2.0, + max_interval_millis=10000, + max_elapsed_time_millis=None, + max_retries=0, +) + + +class _Backoff: + """Exponential backoff over a :class:`RetryConfig`, with sdk-core's arithmetic.""" + + def __init__(self, config: RetryConfig) -> None: + self._config = config + self._started = time.monotonic() + self._interval = config.initial_interval_millis / 1000 + self._failures = 0 + + def next(self) -> float | None: + """Seconds to wait before the next attempt, or ``None`` once the budget is spent.""" + config = self._config + self._failures += 1 + if config.max_retries and self._failures >= config.max_retries: + return None + base = self._interval + self._interval = min( + base * config.multiplier, config.max_interval_millis / 1000 + ) + spread = base * config.randomization_factor + delay = max(base + random.uniform(-spread, spread), 0.0) + if config.max_elapsed_time_millis is not None and ( + time.monotonic() - self._started + delay + > config.max_elapsed_time_millis / 1000 + ): + return None + return delay + + +def _raw_status(error: grpc.aio.AioRpcError) -> bytes: + # The aio metadata iterates as (key, value) pairs at runtime, whatever + # shape the stubs give its items. + trailing: Any = error.trailing_metadata() + for item in trailing or (): + key, value = item[0], item[1] + if key == "grpc-status-details-bin" and isinstance(value, bytes): + return value + return b"" + + +def _exhausted_cause(error: grpc.aio.AioRpcError) -> int | None: + """The cause the server attached to a ``RESOURCE_EXHAUSTED``, when it attached one.""" + raw = _raw_status(error) + if not raw: + return None + status = GrpcStatus() + status.ParseFromString(raw) + for detail in status.details: + if detail.Is(ResourceExhaustedFailure.DESCRIPTOR): + failure = ResourceExhaustedFailure() + detail.Unpack(failure) + return failure.cause + return None + + +def _worth_waiting_out(error: grpc.aio.AioRpcError) -> bool: + """Whether a ``RESOURCE_EXHAUSTED`` is load the server will shed, rather than a limit.""" + if (error.details() or "").startswith(_TOO_LARGE): + return False + # A stream's budget refuses an append for as long as the stream is that + # full, which no wait changes. + return _exhausted_cause(error) != ( + ResourceExhaustedCause.RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT + ) + + +def _retry_after( + error: grpc.aio.AioRpcError, + backoff: _Backoff, + throttle: _Backoff, + *, + idempotent: bool, +) -> float | None: + """Seconds to wait before making the call again, or ``None`` to raise it.""" + code = error.code() + if code not in _RETRYABLE or (not idempotent and code not in _REFUSED): + return None + throttled = code is grpc.StatusCode.RESOURCE_EXHAUSTED + if throttled and not _worth_waiting_out(error): + return None + delay = backoff.next() + if delay is None: + return None + if throttled: + delay = max(delay, throttle.next() or 0.0) + return delay + @dataclass(frozen=True) class Appended: @@ -176,44 +313,93 @@ def _translate(error: grpc.aio.AioRpcError) -> Exception: # content or behind the one it accepted last. The caller asked to be # deduplicated and could not be, which is a condition of its own. return StreamProducerError(details) - raw = b"" - # The aio metadata iterates as (key, value) pairs at runtime, whatever - # shape the stubs give its items. - trailing: Any = error.trailing_metadata() - for item in trailing or (): - key, value = item[0], item[1] - if key == "grpc-status-details-bin" and isinstance(value, bytes): - raw = value - return RPCError(details, RPCStatusCode(code.value[0]), raw) - - -async def _call(method: Callable[[Any], Awaitable[_T]], request: Any) -> _T: - """Make one stub call, translating the transport's failure to the SDK's.""" - try: - return await method(request) - except grpc.aio.AioRpcError as error: - raise _translate(error) from error + return RPCError(details, RPCStatusCode(code.value[0]), _raw_status(error)) + + +async def _call( + method: Callable[[Any], Awaitable[_T]], + request: Any, + *, + retry_config: RetryConfig | None = None, + idempotent: bool = True, +) -> _T: + """Make one stub call, retried as sdk-core would, translating the failure to the SDK's. + + ``idempotent`` is false for a call the server cannot tell from its own + repeat, which is then retried only on a refusal the server sent before it + did anything. The request is the same object on every attempt, so a + numbered append is deduplicated by the server whichever attempt landed. + """ + config = retry_config or RetryConfig() + backoff = _Backoff(config) + throttle = _Backoff(_THROTTLE) + attempts = 0 + while True: + attempts += 1 + try: + return await method(request) + except grpc.aio.AioRpcError as error: + delay = _retry_after(error, backoff, throttle, idempotent=idempotent) + if delay is None: + raise _translate(error) from error + _log_retry(error, attempts, config) + await asyncio.sleep(delay) + + +def _log_retry(error: grpc.aio.AioRpcError, attempts: int, config: RetryConfig) -> None: + # Quiet at first and louder once half the budget is gone, as sdk-core does, + # so a single throttled call is not a warning but a struggling one is. + level = logging.DEBUG + if config.max_retries and attempts * 2 >= config.max_retries: + level = logging.WARNING + logger.log( + level, + "stream call failed with %s on attempt %d, retrying: %s", + error.code().name, + attempts, + error.details(), + ) class StreamClient: """Creates and opens streams on a namespace.""" - def __init__(self, channel: Any, namespace: str) -> None: - """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`.""" + def __init__( + self, + channel: Any, + namespace: str, + *, + retry_config: RetryConfig | None = None, + ) -> None: + """Wrap an existing ``grpc.aio`` channel. Prefer :meth:`connect`. + + ``retry_config`` is the policy every call made through this client + retries under; ``None`` is the SDK's default. + """ self._channel = channel self._namespace = namespace + self._retry_config = retry_config # The generated stub is typed for a synchronous channel. This client # drives it over ``grpc.aio``, where every call is awaited. self._stub: Any = service_pb2_grpc.StreamServiceStub(channel) @staticmethod - def connect(target_host: str, namespace: str = "default") -> StreamClient: + def connect( + target_host: str, + namespace: str = "default", + *, + retry_config: RetryConfig | None = None, + ) -> StreamClient: """Open a channel to a frontend. Separate from ``Client.connect`` because this does not share the connection the rest of the SDK uses. """ - return StreamClient(grpc.aio.insecure_channel(target_host), namespace) + return StreamClient( + grpc.aio.insecure_channel(target_host), + namespace, + retry_config=retry_config, + ) async def close(self) -> None: """Close the underlying channel.""" @@ -240,6 +426,8 @@ async def create( if max_items is not None: lifecycle.max_items = max_items + # A create that landed but was not answered would be refused as a + # repeat, so it goes again only on a refusal. response = await _call( self._stub.CreateStream, stream.CreateStreamRequest( @@ -249,17 +437,22 @@ async def create( lifecycle=lifecycle, ) ), + retry_config=self._retry_config, + idempotent=False, ) return StreamHandle( self._stub, self._namespace, stream_id, run_id=response.frontend_response.run_id, + retry_config=self._retry_config, ) def get(self, stream_id: str) -> StreamHandle: """Open an existing stream without a round trip.""" - return StreamHandle(self._stub, self._namespace, stream_id) + return StreamHandle( + self._stub, self._namespace, stream_id, retry_config=self._retry_config + ) def workflow_stream( self, workflow_id: str, name: str = "", *, owner_run_id: str = "" @@ -281,7 +474,12 @@ def workflow_stream( :meth:`WorkflowStreamHandle.pin` for why a follower wants that. """ return WorkflowStreamHandle( - self._stub, self._namespace, workflow_id, name, owner_run_id + self._stub, + self._namespace, + workflow_id, + name, + owner_run_id, + retry_config=self._retry_config, ) def activity_stream( @@ -309,6 +507,7 @@ def activity_stream( name, run_id, activity_id=activity_id, + retry_config=self._retry_config, ) @@ -316,7 +515,13 @@ class StreamHandle: """A handle to one standalone stream.""" def __init__( - self, stub: Any, namespace: str, stream_id: str, run_id: str = "" + self, + stub: Any, + namespace: str, + stream_id: str, + run_id: str = "", + *, + retry_config: RetryConfig | None = None, ) -> None: """Prefer :meth:`StreamClient.get` or :meth:`StreamClient.create`.""" self._stub = stub @@ -325,6 +530,7 @@ def __init__( # Passing this back saves the server resolving the current run on every # call, which is otherwise a persistence lookup per request. self._run_id = run_id + self._retry_config = retry_config @property def id(self) -> str: @@ -341,9 +547,11 @@ async def append( Supplying ``producer_id`` and ``sequence`` makes the append idempotent: a retry with the same pair returns the original offsets rather than - appending twice, and says so. Without them the append is - at-least-once, which is only the right trade when duplicates are - harmless. + appending twice, and says so. That is also what lets a failed append + be made again here on every code sdk-core retries. Without them the + append is at-least-once, which is only the right trade when duplicates + are harmless, and it is made again only on a refusal the server sent + before it did anything. """ response = await _call( self._stub.AddMessages, @@ -357,6 +565,8 @@ async def append( sequence=sequence, ) ), + retry_config=self._retry_config, + idempotent=bool(producer_id), ) return _appended(response.frontend_response) @@ -440,6 +650,7 @@ async def poll( wait_new_messages=wait, ) ), + retry_config=self._retry_config, ) return _page(response.frontend_response) @@ -459,6 +670,7 @@ async def truncate(self, new_base_offset: int) -> None: new_base_offset=new_base_offset, ) ), + retry_config=self._retry_config, ) async def finish_writing(self, producer_id: str) -> None: @@ -472,6 +684,7 @@ async def finish_writing(self, producer_id: str) -> None: producer_id=producer_id, ) ), + retry_config=self._retry_config, ) async def close(self) -> None: @@ -483,6 +696,7 @@ async def close(self) -> None: namespace=self._namespace, stream_id=self._id ) ), + retry_config=self._retry_config, ) async def describe(self) -> stream.StreamState: @@ -494,6 +708,7 @@ async def describe(self) -> stream.StreamState: namespace=self._namespace, stream_id=self._id ) ), + retry_config=self._retry_config, ) return response.frontend_response.state @@ -517,6 +732,7 @@ def __init__( owner_run_id: str = "", *, activity_id: str = "", + retry_config: RetryConfig | None = None, ) -> None: """Prefer :meth:`StreamClient.workflow_stream` or :meth:`StreamClient.activity_stream`.""" self._stub = stub @@ -525,6 +741,7 @@ def __init__( self._name = name self._owner_run_id = owner_run_id self._activity_id = activity_id + self._retry_config = retry_config @property def workflow_id(self) -> str: @@ -608,6 +825,8 @@ async def append( sequence=sequence, ) ), + retry_config=self._retry_config, + idempotent=bool(producer_id), ) return _appended(response.frontend_response) @@ -679,6 +898,7 @@ async def poll( wait_new_messages=wait, ) ), + retry_config=self._retry_config, ) return _page(response.frontend_response) @@ -697,6 +917,7 @@ async def describe(self) -> stream.StreamState: stream_name=self._name, ) ), + retry_config=self._retry_config, ) return response.frontend_response.state diff --git a/tests/test_client_stream_owner.py b/tests/test_client_stream_owner.py index a87f9d782..a19e8dbc8 100644 --- a/tests/test_client_stream_owner.py +++ b/tests/test_client_stream_owner.py @@ -39,6 +39,7 @@ def _client(recorder: _Recorder) -> StreamClient: client = StreamClient.__new__(StreamClient) client._stub = recorder client._namespace = "ns" + client._retry_config = None return client diff --git a/tests/test_client_stream_retry.py b/tests/test_client_stream_retry.py new file mode 100644 index 000000000..8baa2939b --- /dev/null +++ b/tests/test_client_stream_retry.py @@ -0,0 +1,257 @@ +"""What the stream client retries, and what it raises at once. + +The stream service is reached over a channel of the client's own, outside +sdk-core, so the retry Core gives every other call is reproduced here. These +pin its edges with a scripted stub: a throttled read or numbered append goes +again, an append the server could not tell from its repeat does not, a code +Core would not retry is raised at once, and cancelling the caller lands during +the wait between attempts. +""" + +from __future__ import annotations + +import asyncio +from collections import defaultdict +from types import SimpleNamespace +from typing import Any + +import grpc +import grpc.aio +import pytest + +import temporalio.api.streamservice.v1 as stream +import temporalio.converter +from temporalio import client_stream +from temporalio.api.common.v1 import GrpcStatus +from temporalio.api.enums.v1 import ResourceExhaustedCause +from temporalio.api.errordetails.v1 import ResourceExhaustedFailure +from temporalio.api.stream.v1 import StreamRecord +from temporalio.client_stream import WorkflowStreamHandle, _to_service +from temporalio.service import RetryConfig, RPCError, RPCStatusCode +from temporalio.streams import StreamNotFoundError +from temporalio.streams._record import RecordKind +from temporalio.streams._wire import to_wire +from temporalio.streams.providers.native import NativeStreamHandle + +FAST = RetryConfig( + initial_interval_millis=1, + max_interval_millis=2, + max_elapsed_time_millis=5000, + max_retries=5, +) + + +@pytest.fixture(autouse=True) +def fast_throttle(monkeypatch: pytest.MonkeyPatch) -> None: + # The floor under a throttled wait is a second, which is right for a + # caller and wrong for a test. + monkeypatch.setattr( + client_stream, + "_THROTTLE", + RetryConfig( + initial_interval_millis=1, + max_interval_millis=2, + max_elapsed_time_millis=None, + max_retries=0, + ), + ) + + +class _Stub: + """Answers each method from a script of exceptions and responses, in order.""" + + def __init__(self, **scripts: list[Any]) -> None: + self.calls: dict[str, int] = defaultdict(int) + self._scripts = scripts + + def __getattr__(self, method: str) -> Any: + script = self._scripts[method] + + async def call(_request: Any, **_: Any) -> Any: + self.calls[method] += 1 + outcome = script.pop(0) + if isinstance(outcome, BaseException): + raise outcome + return outcome + + return call + + +def _error( + code: grpc.StatusCode, + details: str = "", + *, + cause: ResourceExhaustedCause.ValueType | None = None, +) -> grpc.aio.AioRpcError: + trailing = grpc.aio.Metadata() + if cause is not None: + status = GrpcStatus(code=code.value[0], message=details) + status.details.add().Pack(ResourceExhaustedFailure(cause=cause)) + trailing.add("grpc-status-details-bin", status.SerializeToString()) + return grpc.aio.AioRpcError(code, grpc.aio.Metadata(), trailing, details=details) + + +def _throttled() -> grpc.aio.AioRpcError: + return _error( + grpc.StatusCode.RESOURCE_EXHAUSTED, + "service rate limit exceeded", + cause=ResourceExhaustedCause.RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT, + ) + + +def _page(*records: stream.StreamRecord) -> stream.PollWorkflowMessagesResponse: + return stream.PollWorkflowMessagesResponse( + frontend_response=stream.PollMessagesOutput( + records=list(records), + next_offset=len(records), + head_offset=len(records), + closed=True, + run_id="run", + ) + ) + + +def _appended() -> stream.AddWorkflowMessagesResponse: + return stream.AddWorkflowMessagesResponse( + frontend_response=stream.AddMessagesOutput( + first_offset=0, next_offset=1, count=1 + ) + ) + + +def _handle(stub: _Stub, retry: RetryConfig = FAST) -> WorkflowStreamHandle: + return WorkflowStreamHandle(stub, "ns", "wf", "topic", "run", retry_config=retry) + + +async def test_a_throttled_poll_is_read_again() -> None: + stub = _Stub(PollWorkflowMessages=[_throttled(), _page()]) + page = await _handle(stub).poll() + assert page.closed + assert stub.calls["PollWorkflowMessages"] == 2 + + +async def test_a_throttled_numbered_append_goes_again() -> None: + stub = _Stub(AddWorkflowMessages=[_throttled(), _appended()]) + appended = await _handle(stub).append(StreamRecord(), producer_id="p", sequence=1) + assert appended.next_offset == 1 + assert stub.calls["AddWorkflowMessages"] == 2 + + +async def test_a_numbered_append_survives_an_ambiguous_failure() -> None: + # The server holds the producer's sequence, so whichever attempt landed, + # the repeat comes back with the original offsets. + stub = _Stub(AddWorkflowMessages=[_error(grpc.StatusCode.UNAVAILABLE), _appended()]) + await _handle(stub).append(StreamRecord(), producer_id="p", sequence=1) + assert stub.calls["AddWorkflowMessages"] == 2 + + +async def test_an_unnumbered_append_is_not_made_again_after_an_ambiguous_failure() -> ( + None +): + stub = _Stub(AddWorkflowMessages=[_error(grpc.StatusCode.UNAVAILABLE), _appended()]) + with pytest.raises(RPCError) as raised: + await _handle(stub).append(StreamRecord()) + assert raised.value.status == RPCStatusCode.UNAVAILABLE + assert stub.calls["AddWorkflowMessages"] == 1 + + +async def test_an_unnumbered_append_goes_again_after_a_refusal() -> None: + # Throttling is answered before the handler runs, so nothing landed. + stub = _Stub(AddWorkflowMessages=[_throttled(), _appended()]) + await _handle(stub).append(StreamRecord()) + assert stub.calls["AddWorkflowMessages"] == 2 + + +async def test_a_code_core_would_not_retry_is_raised_at_once() -> None: + stub = _Stub( + PollWorkflowMessages=[_error(grpc.StatusCode.INVALID_ARGUMENT, "bad"), _page()] + ) + with pytest.raises(RPCError) as raised: + await _handle(stub).poll() + assert raised.value.status == RPCStatusCode.INVALID_ARGUMENT + assert stub.calls["PollWorkflowMessages"] == 1 + + stub = _Stub(PollWorkflowMessages=[_error(grpc.StatusCode.NOT_FOUND), _page()]) + with pytest.raises(StreamNotFoundError): + await _handle(stub).poll() + assert stub.calls["PollWorkflowMessages"] == 1 + + +async def test_the_budget_is_bounded() -> None: + stub = _Stub(PollWorkflowMessages=[_throttled() for _ in range(10)]) + with pytest.raises(RPCError) as raised: + await _handle( + stub, RetryConfig(initial_interval_millis=1, max_retries=3) + ).poll() + assert raised.value.status == RPCStatusCode.RESOURCE_EXHAUSTED + assert stub.calls["PollWorkflowMessages"] == 3 + + +async def test_a_full_stream_is_not_waited_out() -> None: + full = _error( + grpc.StatusCode.RESOURCE_EXHAUSTED, + "stream holds 10 of its budget of 10 records", + cause=ResourceExhaustedCause.RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT, + ) + stub = _Stub(AddWorkflowMessages=[full, _appended()]) + with pytest.raises(RPCError) as raised: + await _handle(stub).append(StreamRecord(), producer_id="p", sequence=1) + assert raised.value.status == RPCStatusCode.RESOURCE_EXHAUSTED + assert stub.calls["AddWorkflowMessages"] == 1 + + too_large = _error( + grpc.StatusCode.RESOURCE_EXHAUSTED, + "grpc: received message larger than max (5 vs. 4)", + ) + stub = _Stub(AddWorkflowMessages=[too_large, _appended()]) + with pytest.raises(RPCError): + await _handle(stub).append(StreamRecord(), producer_id="p", sequence=1) + assert stub.calls["AddWorkflowMessages"] == 1 + + +async def test_cancelling_the_caller_lands_during_the_wait( + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr( + client_stream, + "_THROTTLE", + RetryConfig(initial_interval_millis=60_000, max_elapsed_time_millis=None), + ) + stub = _Stub(PollWorkflowMessages=[_throttled(), _page()]) + task = asyncio.ensure_future(_handle(stub).poll()) + for _ in range(10): + await asyncio.sleep(0) + assert stub.calls["PollWorkflowMessages"] == 1, "parked in the wait" + task.cancel() + with pytest.raises(asyncio.CancelledError): + await task + assert stub.calls["PollWorkflowMessages"] == 1 + + +async def test_a_native_read_survives_a_throttled_poll( + monkeypatch: pytest.MonkeyPatch, +) -> None: + converter = temporalio.converter.default() + record = _to_service( + to_wire( + converter.payload_converter, + topic="topic", + kind=RecordKind.DATA, + value="hello", + producer_id="p", + sequence=1, + ) + ) + stub = _Stub(PollWorkflowMessages=[_throttled(), _page(record)]) + client: Any = SimpleNamespace(data_converter=converter) + handle = NativeStreamHandle(client, "wf", "run") + + def open_stream(_topic: str, _run_id: str) -> WorkflowStreamHandle: + return _handle(stub) + + monkeypatch.setattr(handle, "_stream", open_stream) + + values = [item.value async for item in handle.read(topic="topic")] + + assert values == ["hello"] + assert stub.calls["PollWorkflowMessages"] == 2 From 375a352793b6fc6393a26a756a0b37376e02abe4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 16:57:55 -0700 Subject: [PATCH 674/831] Let activities own streams and resolve stream_handle() by a static rule. Mirrors the accessor layer of the interface chain on the external base, so the Redis provider above it can hold a stream an activity owns. A standalone activity now reaches its own stream, which used to raise, and scope="activity" gives a workflow's activity its own streams without changing what a bare call reaches. The rule never probes, because a stream is created by its first write and probing would split attempts across two streams. --- temporalio/activity.py | 85 ++++++++++++++++++----- temporalio/client/_client.py | 31 +++++++-- temporalio/streams/__init__.py | 9 ++- temporalio/streams/_provider.py | 32 ++++++++- temporalio/streams/providers/memory.py | 93 ++++++++++++++++++++++---- 5 files changed, 207 insertions(+), 43 deletions(-) diff --git a/temporalio/activity.py b/temporalio/activity.py index 271f3e9e7..701a4f3c6 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -20,6 +20,7 @@ from typing import ( TYPE_CHECKING, Any, + Literal, NoReturn, overload, ) @@ -301,30 +302,58 @@ def client() -> Client: def stream_handle( - workflow_id: str | None = None, *, run_id: str | None = None + workflow_id: str | None = None, + *, + run_id: str | None = None, + scope: Literal["workflow", "activity"] | None = None, ) -> temporalio.streams.StreamHandle: """Return a stream handle from the provider the worker was given. - With no arguments the handle is on this activity's own workflow, pinned to - the run the activity belongs to, so a producer opened from it writes onto - that run's stream and a read follows that run. Name a ``workflow_id`` to - address another workflow; ``run_id`` then pins the handle to one run and - its absence follows the execution chain. See :py:mod:`temporalio.streams`. + Which stream a call with no ``workflow_id`` reaches is decided by where + the activity runs, never by what exists: + + - In an activity a workflow scheduled, it is that workflow's stream, + pinned to the run the activity belongs to. + - In a standalone activity, it is the activity's own stream. + - ``scope="activity"`` gives an activity a workflow scheduled its own + streams instead, apart from the workflow's. ``scope="workflow"`` asks + for the workflow explicitly, and a standalone activity has none. + + The rule is static because a stream is created by its first write, so a + rule that looked for one would send attempt 1 to the workflow and a retry + to the stream attempt 1 created. An activity's own streams are one per + activity execution, not per attempt: a retry writes to the same stream, + under a new attempt, and they end when the activity reaches a terminal + status. + + Name a ``workflow_id`` to address another workflow; ``run_id`` then pins + the handle to one run and its absence follows the execution chain. See + :py:mod:`temporalio.streams`. Like :py:func:`client`, this is only available in ``async def`` activities. + Args: + workflow_id: Another workflow whose stream to address. + run_id: The run of ``workflow_id`` to pin to. + scope: ``"activity"`` for this activity's own streams, + ``"workflow"`` for its workflow's. Without it the rule above + decides. + Returns: :py:class:`temporalio.streams.StreamHandle` for use in the current activity. Raises: + RuntimeError: When the client is not available, which is what a + ``def`` activity gets, or when ``scope="workflow"`` is asked of + an activity that belongs to no workflow. temporalio.streams.StreamUnsupportedError: The worker has no stream - provider. Register one with ``Client.connect(plugins=[provider])`` - or ``Worker(plugins=[provider])``. - RuntimeError: When the client is not available, or when the activity - has no workflow and no ``workflow_id`` was given. - ValueError: ``run_id`` was given without ``workflow_id``. + provider, or its provider cannot hold a stream an activity owns. + Register one with ``Client.connect(plugins=[provider])`` or + ``Worker(plugins=[provider])``. + ValueError: ``run_id`` was given without ``workflow_id``, or + ``scope="activity"`` with one. """ context = _Context.current() provider = context.stream_provider @@ -333,17 +362,37 @@ def stream_handle( "no stream provider is configured on this worker; register one with " "Client.connect(plugins=[provider]) or Worker(plugins=[provider])" ) - if workflow_id is None: - if run_id is not None: - raise ValueError("run_id needs a workflow_id") - info = context.info() + if workflow_id is not None: + if scope == "activity": + raise ValueError( + "scope='activity' addresses this activity's own streams, so it takes " + "no workflow_id" + ) + return provider.get_stream_handle(client(), workflow_id, run_id=run_id) + if run_id is not None: + raise ValueError("run_id needs a workflow_id") + info = context.info() + if scope is None: + scope = "workflow" if info.in_workflow else "activity" + if scope == "workflow": if info.workflow_id is None: raise RuntimeError( "this activity belongs to no workflow, so name the workflow_id to " - "address" + "address, or leave scope unset for the activity's own streams" ) - workflow_id, run_id = info.workflow_id, info.workflow_run_id - return provider.get_stream_handle(client(), workflow_id, run_id=run_id) + return provider.get_stream_handle( + client(), info.workflow_id, run_id=info.workflow_run_id + ) + if info.workflow_id is not None: + return provider.get_activity_stream_handle( + client(), + info.activity_id, + workflow_id=info.workflow_id, + run_id=info.workflow_run_id, + ) + return provider.get_activity_stream_handle( + client(), info.activity_id, run_id=info.activity_run_id + ) def in_activity() -> bool: diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 79617dff4..ed3a90500 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -908,26 +908,37 @@ def get_workflow_handle( ) def get_stream_handle( - self, workflow_id: str, *, run_id: str | None = None + self, + workflow_id: str | None = None, + *, + run_id: str | None = None, + activity_id: str | None = None, ) -> temporalio.streams.StreamHandle: - """Get a handle on a workflow's stream from the provider registered on this client. + """Get a handle on a workflow's or an activity's stream from the provider registered on this client. Mirrors :py:meth:`get_workflow_handle`: without ``run_id`` the handle follows the workflow's execution chain across continue-as-new, with - one it is pinned to that run. The provider is the one registered with - ``plugins=[provider]`` at :py:meth:`connect`, or passed as - ``stream_provider``. See :py:mod:`temporalio.streams`. + one it is pinned to that run. With ``activity_id`` the handle is on + the streams that activity owns: a standalone activity's when + ``workflow_id`` is left out, and ``run_id`` then pins the activity's + run, or an activity that ``workflow_id`` scheduled. The provider is + the one registered with ``plugins=[provider]`` at :py:meth:`connect`, + or passed as ``stream_provider``. See :py:mod:`temporalio.streams`. Args: - workflow_id: Workflow ID whose stream to get a handle to. + workflow_id: Workflow ID whose stream to get a handle to, or the + workflow that scheduled ``activity_id``. run_id: Run ID to pin the handle to. + activity_id: Activity ID whose own streams to get a handle to. Returns: The stream handle. Raises: + ValueError: Neither ``workflow_id`` nor ``activity_id`` was given. temporalio.streams.StreamUnsupportedError: No stream provider is - registered on this client. + registered on this client, or it cannot hold a stream an + activity owns. """ provider = self._config.get("stream_provider") if provider is None: @@ -935,6 +946,12 @@ def get_stream_handle( "no stream provider is registered on this client; connect with " "plugins=[provider]" ) + if activity_id is not None: + return provider.get_activity_stream_handle( + self, activity_id, workflow_id=workflow_id, run_id=run_id + ) + if workflow_id is None: + raise ValueError("name the workflow_id or the activity_id to address") return provider.get_stream_handle(self, workflow_id, run_id=run_id) def get_workflow_handle_for( diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index b23c95be4..e4f9d1691 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -39,10 +39,13 @@ registers it on a worker alone. Each context then asks for its stream the same way. Workflow code uses :func:`temporalio.workflow.stream_reader` and :func:`temporalio.workflow.stream_writer`. An activity uses -:func:`temporalio.activity.stream_handle`, which is its own workflow pinned -to its run unless told otherwise. Any process holding a client uses +:func:`temporalio.activity.stream_handle`: an activity a workflow scheduled +reaches that workflow's stream pinned to its run, a standalone activity +reaches its own, and ``scope="activity"`` gives the first kind its own +streams too. Any process holding a client uses :meth:`temporalio.client.Client.get_stream_handle`, which mirrors -``get_workflow_handle``. The explicit form, +``get_workflow_handle`` and takes an ``activity_id`` for an activity's +streams. The explicit form, ``provider.get_stream_handle(client, workflow_id)``, stays for a process that talks to two stores. This module keeps the shared types, the errors and the protocols a provider implements; nothing here that workflow code imports does diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 8c142080d..621915f99 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -85,10 +85,11 @@ async def finish(self) -> None: class StreamHandle(Protocol): - """One workflow's stream, addressed by topic, from outside workflow code. + """One owner's stream, addressed by topic, from outside workflow code. - A handle follows the workflow's execution chain unless it was opened with - a ``run_id``, in which case it is pinned to that run. A topic is a + The owner is a workflow or an activity. A handle on a workflow follows + its execution chain unless it was opened with a ``run_id``, in which case + it is pinned to that run. A topic is a :class:`temporalio.streams.StreamTopic` definition, which carries the record type, or a plain string with ``result_type=`` for a name decided at runtime. A transport failure surfaces as @@ -275,6 +276,31 @@ def get_stream_handle( """ ... + def get_activity_stream_handle( + self, + client: Client, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> StreamHandle: + """A handle on the streams an activity owns. + + Without ``workflow_id`` the activity is a standalone one, an execution + of its own, and ``run_id`` pins one run of it. With ``workflow_id`` it + is an activity that workflow scheduled, and ``run_id`` pins the + workflow's run. Either way these streams are apart from any + workflow's: a topic here and the same topic on the workflow's handle + are two streams. A retry of the activity writes to the same streams, + and a read ends when the activity reaches a terminal status, not when + an attempt fails. + + Raises: + StreamUnsupportedError: The provider's store cannot hold a stream + an activity owns. + """ + ... + async def close(self) -> None: """Release what this provider holds for the process. diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index f175570a8..e3392e268 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -15,6 +15,12 @@ handle only decides which run's close ends a read. - It learns that a workflow closed by describing it, so a handle opened without a client reads until the caller closes it. +- An activity's own streams are keyed by the activity, not by its run. A + standalone activity's read ends when describing it shows a terminal + status. A workflow's activity is described through its workflow: the read + ends once the activity has been seen pending and is no longer, or the + workflow closed, so a read opened after the activity already finished + waits for the workflow. The outside surface (producer identity, retry deduplication, positions, supersession, cursors) is faithful, which is what the conformance tests lean @@ -34,7 +40,7 @@ import temporalio.converter from temporalio import workflow -from temporalio.client import Client, WorkflowExecutionStatus +from temporalio.client import ActivityExecutionStatus, Client, WorkflowExecutionStatus from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import StreamCursorError from temporalio.streams._ids import topic_key @@ -278,20 +284,28 @@ def _write(self, wires: list[WireRecord]) -> Cursor: class MemoryStreamHandle: - """One workflow's stream from outside, with the shared reader rules.""" + """One owner's stream from outside, with the shared reader rules. + + The owner is ``workflow_id``'s workflow, or with ``activity_id`` an + activity: a standalone one without ``workflow_id``, or one that workflow + scheduled. + """ def __init__( self, streams: MemoryStreams, client: Client | None, - workflow_id: str, + workflow_id: str | None, run_id: str | None, + activity_id: str | None = None, ) -> None: - """Address ``workflow_id``'s topics in ``streams``.""" + """Address the owner's topics in ``streams``.""" self._streams = streams self._client = client self._workflow_id = workflow_id self._run_id = run_id + self._activity_id = activity_id + self._seen_pending = False self._converter = ( client.data_converter.payload_converter if client is not None @@ -307,7 +321,7 @@ def read( ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield records on ``topic`` after ``after`` until the workflow closes.""" name, result_type = resolve_topic(topic, result_type) - store = self._streams._topic(self._workflow_id, name) + store = self._store(name) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. start = self._streams._offset_after(after) @@ -347,21 +361,46 @@ async def _read( else self._streams._poll.total_seconds(), ) + def _store(self, topic: str) -> _Topic: + if self._activity_id is not None: + return self._streams._activity_topic( + self._workflow_id, self._activity_id, topic + ) + assert self._workflow_id is not None + return self._streams._topic(self._workflow_id, topic) + async def _closed(self) -> bool: if self._client is None: return False - handle = self._client.get_workflow_handle( - self._workflow_id, run_id=self._run_id - ) try: - description = await handle.describe() + if self._activity_id is not None and self._workflow_id is None: + activity = await self._client.get_activity_handle( + self._activity_id, run_id=self._run_id + ).describe() + return activity.status != ActivityExecutionStatus.RUNNING + assert self._workflow_id is not None + description = await self._client.get_workflow_handle( + self._workflow_id, run_id=self._run_id + ).describe() except RPCError as error: if error.status == RPCStatusCode.NOT_FOUND: - # A producer may write before the workflow exists; there is + # A producer may write before the owner exists; there is # nothing to follow yet, so keep waiting. return False raise status = description.status + if self._activity_id is not None: + pending = any( + info.activity_id == self._activity_id + for info in description.raw_description.pending_activities + ) + if pending: + self._seen_pending = True + elif self._seen_pending: + return True + # The activity's streams are not the workflow's chain: a run that + # continued as new took its activities with it. + return status is not None and status != WorkflowExecutionStatus.RUNNING if status is None or status == WorkflowExecutionStatus.RUNNING: return False # Following the chain, a run that continued as new is not the end: @@ -373,7 +412,7 @@ async def _closed(self) -> bool: async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, for following from now.""" name, _ = resolve_topic(topic) - count = len(self._streams._topic(self._workflow_id, name).records) + count = len(self._store(name).records) return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING def producer( @@ -385,7 +424,7 @@ def producer( ) -> MemoryProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" name, _ = resolve_topic(topic) - store = self._streams._topic(self._workflow_id, name) + store = self._store(name) producer_id, attempt = producer_identity(producer_id, attempt) return MemoryProducer(store, self._converter, name, producer_id, attempt) @@ -409,10 +448,12 @@ def __init__( """ self._poll = poll_interval self._topics: dict[str, _Topic] = {} + self._activity_topics: dict[tuple[str | None, str, str], _Topic] = {} def reset(self) -> None: """Drop every topic. For tests.""" self._topics.clear() + self._activity_topics.clear() def workflow_provider(self) -> _MemoryWorkflowProvider: """The workflow half, over this provider's topics.""" @@ -429,6 +470,21 @@ def get_stream_handle( """ return MemoryStreamHandle(self, client, workflow_id, run_id) + def get_activity_stream_handle( + self, + client: Client | None, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> MemoryStreamHandle: + """A handle on the topics ``activity_id`` owns, apart from any workflow's. + + As on :meth:`get_stream_handle`, ``client`` may be ``None``, and then + a read waits until the caller closes it. + """ + return MemoryStreamHandle(self, client, workflow_id, run_id, activity_id) + async def close(self) -> None: """Nothing to release: the provider holds no connection.""" @@ -441,6 +497,19 @@ def _topic(self, workflow_id: str, topic: str) -> _Topic: found = self._topics[key] = _Topic() return found + def _activity_topic( + self, workflow_id: str | None, activity_id: str, topic: str + ) -> _Topic: + # Kept apart from the workflow topics, so no workflow id can name an + # activity's stream. + if not topic: + raise ValueError("topic must not be empty") + key = (workflow_id, activity_id, topic) + found = self._activity_topics.get(key) + if found is None: + found = self._activity_topics[key] = _Topic() + return found + def _offset_after(self, after: Cursor) -> int: position = cursor_position(after, provider=_PROVIDER) if position is None: From 350457282a2a5bbf547b9e79dbedc4b905325bcf Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 16:57:55 -0700 Subject: [PATCH 675/831] Tested the activity stream accessor rule and retry supersession. Covers all three arms of the rule, a retry writing to the same stream, and the misaddressed calls, on the memory provider. A storage provider adds itself to the setups behind its own STREAMS_LIVE gate. --- tests/streams/test_activity_streams.py | 261 +++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 tests/streams/test_activity_streams.py diff --git a/tests/streams/test_activity_streams.py b/tests/streams/test_activity_streams.py new file mode 100644 index 000000000..8aa4a653a --- /dev/null +++ b/tests/streams/test_activity_streams.py @@ -0,0 +1,261 @@ +"""Streams owned by activities, and which stream an activity's accessor reaches. + +``activity.stream_handle()`` resolves by a static rule, never by what exists: +an activity a workflow scheduled reaches its workflow's stream, a standalone +activity reaches its own, and ``scope="activity"`` gives an activity a +workflow scheduled its own streams. An activity's own streams are one per +activity execution, so a retry writes to the same stream and a reader sees +the attempt change as ``SUPERSEDED``. + +The memory provider always runs. A storage provider adds itself to +``SETUPS`` behind its own ``STREAMS_LIVE`` gate: its setup receives the +environment's client and hands back the provider and a client with it +registered, which the workers and the reads in these cases share. +""" + +from __future__ import annotations + +import asyncio +import uuid +from collections.abc import AsyncIterator, Callable +from dataclasses import dataclass +from datetime import timedelta +from typing import Any + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.common import RetryPolicy +from temporalio.streams import ( + BEGINNING, + RecordKind, + StreamProvider, + topic, +) +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import WorkflowEnvironment +from tests.helpers import new_worker + +TOKENS = topic("tokens", dict) + + +@dataclass +class ActivitySetup: + """A provider under test, registered on the client the cases use.""" + + name: str + provider: StreamProvider + client: Client + + +async def _memory_setup(client: Client) -> AsyncIterator[ActivitySetup]: + provider = MemoryStreams(poll_interval=timedelta(milliseconds=50)) + config = client.config() + config["plugins"] = [provider] + yield ActivitySetup("memory", provider, Client(**config)) + provider.reset() + + +SETUPS: dict[str, Callable[[Client], AsyncIterator[ActivitySetup]]] = { + "memory": _memory_setup +} + + +@pytest.fixture(params=sorted(SETUPS)) +async def setup( + request: pytest.FixtureRequest, client: Client, env: WorkflowEnvironment +) -> AsyncIterator[ActivitySetup]: + if env.supports_time_skipping: + pytest.skip("the time-skipping test server has no standalone activities") + async for found in SETUPS[request.param](client): + yield found + + +async def read_all(records: Any, timeout: float = 30.0) -> list: + """Read until the stream ends, which is when its owner does.""" + + async def _collect() -> list: + return [record async for record in records] + + return await asyncio.wait_for(_collect(), timeout) + + +def summary(records: list) -> list[tuple[Any, ...]]: + return [ + (r.kind, r.attempt, r.value["token"] if r.kind is RecordKind.DATA else None) + for r in records + ] + + +@activity.defn +async def write_by_default(label: str) -> str: + # No arguments: where this lands depends only on where the activity runs. + producer = activity.stream_handle().producer(topic=TOKENS) + await producer.append({"token": label}) + await producer.finish() + return activity.info().activity_id + + +@activity.defn +async def write_to_own_streams(label: str) -> str: + producer = activity.stream_handle(scope="activity").producer(topic=TOKENS) + await producer.append({"token": label}) + await producer.finish() + return activity.info().activity_id + + +@workflow.defn +class RunsOneActivity: + """Runs one activity by name and returns what it returned.""" + + @workflow.run + async def run(self, name: str, label: str) -> str: + return await workflow.execute_activity( + name, + label, + activity_id="streamer", + start_to_close_timeout=timedelta(seconds=30), + ) + + +async def test_workflow_activity_defaults_to_its_workflow(setup: ActivitySetup): + client = setup.client + workflow_id = f"streams-wfa-{uuid.uuid4().hex}" + async with new_worker( + client, RunsOneActivity, activities=[write_by_default] + ) as worker: + await client.execute_workflow( + RunsOneActivity.run, + args=["write_by_default", "to the workflow"], + id=workflow_id, + task_queue=worker.task_queue, + ) + records = await read_all( + client.get_stream_handle(workflow_id).read(topic=TOKENS) + ) + assert summary(records) == [ + (RecordKind.DATA, 1, "to the workflow"), + (RecordKind.FINISH, 1, None), + ] + assert all(r.producer_id == "streamer" for r in records) + own = client.get_stream_handle(workflow_id, activity_id="streamer") + assert await own.latest(topic=TOKENS) == BEGINNING + + +async def test_scope_activity_gives_a_workflow_activity_its_own_streams( + setup: ActivitySetup, +): + client = setup.client + workflow_id = f"streams-wfa-own-{uuid.uuid4().hex}" + async with new_worker( + client, RunsOneActivity, activities=[write_to_own_streams] + ) as worker: + await client.execute_workflow( + RunsOneActivity.run, + args=["write_to_own_streams", "to the activity"], + id=workflow_id, + task_queue=worker.task_queue, + ) + own = client.get_stream_handle(workflow_id, activity_id="streamer") + assert summary(await read_all(own.read(topic=TOKENS))) == [ + (RecordKind.DATA, 1, "to the activity"), + (RecordKind.FINISH, 1, None), + ] + # The workflow's topic of the same name is a different stream. + workflow_stream = client.get_stream_handle(workflow_id) + assert await workflow_stream.latest(topic=TOKENS) == BEGINNING + + +async def test_standalone_activity_defaults_to_its_own_stream(setup: ActivitySetup): + client = setup.client + activity_id = f"streams-saa-{uuid.uuid4().hex}" + async with new_worker(client, activities=[write_by_default]) as worker: + handle = await client.start_activity( + write_by_default, + "standalone", + id=activity_id, + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=30), + ) + assert await handle.result() == activity_id + stream = client.get_stream_handle(activity_id=activity_id) + # The read ends by itself: the activity reached a terminal status. + records = await read_all(stream.read(topic=TOKENS)) + assert summary(records) == [ + (RecordKind.DATA, 1, "standalone"), + (RecordKind.FINISH, 1, None), + ] + assert all(r.producer_id == activity_id for r in records) + + +@activity.defn +async def fail_once_after_writing() -> None: + attempt = activity.info().attempt + producer = activity.stream_handle().producer(topic=TOKENS) + await producer.append({"token": f"attempt {attempt}"}) + if attempt == 1: + raise RuntimeError("the first attempt fails after writing") + await producer.finish() + + +async def test_a_retry_inherits_the_stream_and_supersedes(setup: ActivitySetup): + client = setup.client + activity_id = f"streams-saa-retry-{uuid.uuid4().hex}" + async with new_worker(client, activities=[fail_once_after_writing]) as worker: + handle = await client.start_activity( + fail_once_after_writing, + id=activity_id, + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=30), + retry_policy=RetryPolicy( + initial_interval=timedelta(milliseconds=200), maximum_attempts=2 + ), + ) + await handle.result() + records = await read_all( + client.get_stream_handle(activity_id=activity_id).read(topic=TOKENS) + ) + # One stream across both attempts, with the takeover reported between. + assert summary(records) == [ + (RecordKind.DATA, 1, "attempt 1"), + (RecordKind.SUPERSEDED, 2, None), + (RecordKind.DATA, 2, "attempt 2"), + (RecordKind.FINISH, 2, None), + ] + superseded = records[1].supersession + assert superseded is not None + assert (superseded.previous_attempt, superseded.attempt) == (1, 2) + + +@activity.defn +async def ask_for_misaddressed_handles() -> list[str]: + errors: list[str] = [] + try: + activity.stream_handle(scope="workflow") + except RuntimeError as error: + errors.append(f"RuntimeError: {error}") + try: + activity.stream_handle("some-workflow", scope="activity") + except ValueError as error: + errors.append(f"ValueError: {error}") + return errors + + +async def test_a_standalone_activity_has_no_workflow_to_address(setup: ActivitySetup): + client = setup.client + async with new_worker(client, activities=[ask_for_misaddressed_handles]) as worker: + errors = await client.execute_activity( + ask_for_misaddressed_handles, + id=f"streams-saa-errors-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=30), + ) + assert len(errors) == 2 + assert errors[0].startswith("RuntimeError: this activity belongs to no workflow") + assert errors[1].startswith("ValueError: scope='activity'") + + +async def test_get_stream_handle_needs_an_owner(setup: ActivitySetup): + with pytest.raises(ValueError, match="workflow_id or the activity_id"): + setup.client.get_stream_handle() From 5b9fbda2835889820ba0fed4f25b03190cbd72b1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 17:07:53 -0700 Subject: [PATCH 676/831] Held an activity's own streams on the Redis provider. An activity's streams are one Redis stream per topic under an owner component the chain keys can never render, written by a single-key form of the paired script so retries dedupe and a new attempt reads as SUPERSEDED. A read ends when the owner is terminal: a standalone activity is described directly, and a workflow's activity through its workflow, whose close ends the read, as does the activity leaving the pending set once its stream exists. --- temporalio/streams/providers/redis.py | 495 ++++++++++++++++++++++---- 1 file changed, 417 insertions(+), 78 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 69ac99a03..09232ed70 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -31,17 +31,35 @@ the two streams number their entries independently, so an outside cursor cannot stand in for one. A reader opened without a cursor starts where the chain's predecessor run committed, which is the transport's own rule. -- Streams are keyed by the chain's first run, so a handle follows continue-as- - new by construction and ``run_id`` only decides whose close ends a read. +- A workflow's streams are keyed by the chain's first run, so a handle + follows continue-as-new by construction and ``run_id`` only decides whose + close ends a read. +- An activity's own streams are one Redis stream per topic, keyed by the + namespace, the workflow id, empty for a standalone activity, and the + activity id. The owner is one key component joined with ``/``, a character + the chain keys percent-encode out of every id, so no chain key and no key + derived from one can name an activity's stream. There is no input stream, + because no workflow reads these, and no staging, because an activity's + append is visible as soon as the store accepts it. The key holds the + activity id and not its run, so a retry writes to the same stream, which a + reader sees as ``SUPERSEDED``, and an id started again continues it. A + read ends when the owner is terminal and the retained tail is delivered: a + standalone activity is described directly, and a workflow's activity + through its workflow, whose close ends the read, as does the activity + leaving the pending set once its stream exists. An activity that never + wrote has no stream, so a read on it waits for the workflow. Nothing gates + an append after that, so a late attempt still lands, and a read that has + ended does not see it. - A task's publishes are staged as one batch. The transport's own per-task batch limits are lifted for this provider, because a synchronous publish cannot wait for the worker to stage a full batch; a batch it cannot stage fails the task. - Retention is trimming, with no consumer floor. When ``retention`` or ``max_len`` is set, every append the provider makes trims the key it wrote, - whatever any reader has reached. A replay that reaches a recorded range the - trim removed fails its Workflow Task, an outside cursor below the trim is - refused, and a fully trimmed topic reads as empty. + an activity's stream included, whatever any reader has reached. A replay + that reaches a recorded range the trim removed fails its Workflow Task, an + outside cursor below the trim is refused, and a fully trimmed topic reads + as empty. """ from __future__ import annotations @@ -51,13 +69,15 @@ import re import time from collections.abc import AsyncGenerator, Coroutine, Sequence +from dataclasses import dataclass from datetime import timedelta from typing import Any, Final, Generic, TypeVar +from urllib.parse import quote from google.protobuf.message import DecodeError from temporalio import workflow -from temporalio.client import Client, WorkflowExecutionStatus +from temporalio.client import ActivityExecutionStatus, Client, WorkflowExecutionStatus from temporalio.contrib.external_workflow_streams import ( AFTER, AppendConflictError, @@ -103,11 +123,17 @@ _reconcile_output_stage, ) from temporalio.contrib.external_workflow_streams._redis import ( + _BEGINNING_SENTINEL, RedisStreamBackend, _content_hash, _text, + _to_record, +) +from temporalio.converter import ( + ActivitySerializationContext, + SerializationContext, + WorkflowSerializationContext, ) -from temporalio.converter import WorkflowSerializationContext from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import ( StreamCursorError, @@ -249,6 +275,35 @@ def _entry_id(token: str | bytes) -> tuple[int, int]: """ +def _trim_floor(backend: Any) -> str: + retention = getattr(backend, "_retention", None) + if retention is None: + return "" + # The worker's clock names the floor, so a skewed worker shifts the window by + # its skew, the same as the backend's own trim. + floor = int((time.time() - retention.total_seconds()) * 1000) + return f"{max(floor, 0)}-0" + + +def _trim_maxlen(backend: Any) -> str: + max_len = getattr(backend, "_max_len", None) + return "" if max_len is None else str(max_len) + + +def _append_args(backend: Any, record: TransportRecord) -> list[Any]: + """What both append scripts take: the trims, the record's identity, its fields.""" + args: list[Any] = [ + _trim_floor(backend).encode(), + _trim_maxlen(backend).encode(), + str(record.idempotency_key).encode(), + _content_hash(record).encode(), + ] + for name, value in sorted(record.to_fields().items()): + args.append(name.encode()) + args.append(value) + return args + + class _PairedAppend: """One logical record on a topic's input and output keys, in one Redis call.""" @@ -270,15 +325,6 @@ async def write( original positions and writes nothing, so a call whose answer was lost is settled by making it again. """ - args: list[Any] = [ - self._minid().encode(), - self._maxlen().encode(), - str(record.idempotency_key).encode(), - _content_hash(record).encode(), - ] - for name, value in sorted(record.to_fields().items()): - args.append(name.encode()) - args.append(value) outcome, _, output = await self._script( keys=[ self._backend.stream_key(input_key), @@ -286,24 +332,136 @@ async def write( self._backend.stream_key(output_key), self._backend._idempotency_key(output_key), ], - args=args, + args=_append_args(self._backend, record), ) if _text(outcome) == "conflict": raise AppendConflictError(record.idempotency_key) return Offset(_text(output)) - def _minid(self) -> str: - retention = getattr(self._backend, "_retention", None) - if retention is None: - return "" - # The worker's clock names the floor, so a skewed worker shifts the window by - # its skew, the same as the backend's own trim. - floor = int((time.time() - retention.total_seconds()) * 1000) - return f"{max(floor, 0)}-0" - def _maxlen(self) -> str: - max_len = getattr(self._backend, "_max_len", None) - return "" if max_len is None else str(max_len) +#: Append one record to an activity's stream, or answer where it already is. +#: +#: The single-key form of the paired write: an activity's stream has no input +#: half and no stage, so one stream and its idempotency hash are the whole +#: write, and the retention trims ride along as they do on the pair. +_OWNED_APPEND_LUA: Final = """ +local minid = ARGV[1] +local maxlen = ARGV[2] +local existing = redis.call('HGET', KEYS[2], ARGV[3]) +if existing then + local sep = string.find(existing, '|') + if string.sub(existing, sep + 1) ~= ARGV[4] then + return {'conflict', ''} + end + return {'ok', string.sub(existing, 1, sep - 1)} +end +local id = redis.call('XADD', KEYS[1], '*', unpack(ARGV, 5)) +redis.call('HSET', KEYS[2], ARGV[3], id .. '|' .. ARGV[4]) +if minid ~= '' then + redis.call('XTRIM', KEYS[1], 'MINID', minid) +end +if maxlen ~= '' then + redis.call('XTRIM', KEYS[1], 'MAXLEN', maxlen) +end +return {'ok', id} +""" + + +class _OwnedAppend: + """One record on an activity's stream, in one Redis call.""" + + def __init__(self, backend: RedisStreamBackend) -> None: + """Bind to ``backend``'s client.""" + self._backend = backend + self._script = backend._client.register_script(_OWNED_APPEND_LUA) + + async def write(self, *, name: str, record: TransportRecord) -> Offset: + """Append ``record`` to the stream ``name`` and return where it landed. + + A repeat of the same ``(session, sequence)`` with the same bytes returns + the original position and writes nothing. + """ + outcome, placed = await self._script( + keys=[name, f"{name}:idem"], args=_append_args(self._backend, record) + ) + if _text(outcome) == "conflict": + raise AppendConflictError(record.idempotency_key) + return Offset(_text(placed)) + + +def _prefix(backend: Any) -> str: + """The key prefix ``backend`` writes under, for keys the provider derives itself.""" + return backend._key_prefix + + +@dataclass(frozen=True) +class _ActivityOwner: + """The activity whose streams a handle addresses, and where Redis keeps them. + + ``workflow_id`` is ``None`` for a standalone activity. ``run_id`` pins the + workflow's run for a workflow's activity and the activity's own run for a + standalone one: it decides whose close ends a read and never which key is + read, because an activity's streams belong to the activity id. + """ + + namespace: str + workflow_id: str | None + activity_id: str + run_id: str | None + + def key(self, key_prefix: str, topic: str) -> str: + """The Redis stream holding ``topic`` of this activity's streams.""" + # The chain keys percent-encode every id, so none of their components + # holds a "/", and a component built around one can never equal a + # chain key or a key derived from one. + namespace = quote(self.namespace, safe="") + owner = f"activity/{quote(self.workflow_id or '', safe='')}/" + owner += quote(self.activity_id, safe="") + return f"{key_prefix}:{namespace}:{owner}:{quote(topic, safe='')}" + + def context(self) -> SerializationContext: + """What the owner's payloads are coded under. + + A workflow's activity writes the workflow's data, as it does on the + workflow's own topics; a standalone activity has no workflow, so its + own identity is the context. + """ + if self.workflow_id is not None: + return WorkflowSerializationContext( + namespace=self.namespace, workflow_id=self.workflow_id + ) + return ActivitySerializationContext( + namespace=self.namespace, + activity_id=self.activity_id, + activity_type=None, + activity_task_queue=None, + workflow_id=None, + workflow_type=None, + is_local=False, + ) + + def __str__(self) -> str: + """The owner, for messages.""" + if self.workflow_id is None: + return f"activity {self.activity_id!r}" + return f"activity {self.activity_id!r} of workflow {self.workflow_id!r}" + + +async def _retained(client: Any, name: str, offset: Offset) -> bool: + """Whether the record at ``offset`` on the stream ``name`` survived trimming. + + A record at or after the first retained entry is there. On an emptied + stream the last id Redis generated says whether the record ever was. + """ + if not await client.exists(name): + # Nothing was ever written under this key, so nothing was trimmed from it. + return True + info = await client.xinfo_stream(name) + wanted = _entry_id(offset.token) + first = info.get("first-entry") + if first: + return _entry_id(first[0]) <= wanted + return wanted > _entry_id(info["last-generated-id"]) class _RetainingBackend(RedisStreamBackend): @@ -374,21 +532,8 @@ async def read_range(self, key: StreamKey, first: Offset, last: Offset) -> Any: return await super().read_range(key, first, last) async def retains(self, key: StreamKey, offset: Offset) -> bool: - """Whether the record at ``offset`` survived trimming. - - A record at or after the first retained entry is there. On an emptied - stream the last id Redis generated says whether the record ever was. - """ - name = self.stream_key(key) - if not await self._client.exists(name): - # Nothing was ever written under this key, so nothing was trimmed from it. - return True - info = await self._client.xinfo_stream(name) - wanted = _entry_id(offset.token) - first = info.get("first-entry") - if first: - return _entry_id(first[0]) <= wanted - return wanted > _entry_id(info["last-generated-id"]) + """Whether the record at ``offset`` survived trimming.""" + return await _retained(self._client, self.stream_key(key), offset) async def _trim(self, key: StreamKey) -> None: name = self.stream_key(key) @@ -538,15 +683,17 @@ def __init__( self, streams: RedisStreams, client: Client, - workflow_id: str, + workflow_id: str | None, topic: str, producer_id: str, attempt: int, + owner: _ActivityOwner | None = None, ) -> None: - """Bind this producer to ``topic`` of ``workflow_id``'s stream.""" + """Bind this producer to ``topic`` of ``workflow_id``'s chain, or of ``owner``'s streams.""" self._streams = streams self._client = client self._workflow_id = workflow_id + self._owner = owner self._topic = topic self._producer_id = producer_id self._attempt = attempt @@ -556,6 +703,8 @@ def __init__( self._input: Any = None self._output: Any = None self._pair: _PairedAppend | None = None + self._owned: _OwnedAppend | None = None + self._name: str | None = None self._codec: StreamPayloadCodec[bytes] | None = None @property @@ -624,9 +773,19 @@ async def finish(self) -> None: ) async def _connect(self) -> None: - if self._output is not None: + if self._codec is not None: return backend = self._streams._require_backend() + if self._owner is not None: + # No transport producer to bind and no one to wake: an activity's + # stream has no workflow reader and no chain to check the key against. + self._name = self._owner.key(_prefix(backend), self._topic) + self._owned = _OwnedAppend(backend) + self._codec = StreamPayloadCodec( + self._client.data_converter.with_context(self._owner.context()), bytes + ) + return + assert self._workflow_id is not None chain = await _chain(self._client, self._workflow_id) try: output = await ExternalOutputStreamProducer.connect( @@ -660,25 +819,8 @@ async def _connect(self) -> None: async def _write(self, records: list[WireRecord]) -> Cursor: await self._connect() - assert self._pair is not None and self._codec is not None - last: Offset | None = None try: - for index, record in enumerate(records): - # Built here rather than handed to the transport's publish, which - # appends one key per call. The identity is the same one the transport - # would derive, so a record either side already holds is reused. - staged = TransportRecord( - kind=TransportRecordKind.DATA, - payload=await self._codec.encode(record.SerializeToString()), - producer_session_id=self._session, - sequence=self._sequence + index, - ) - last = await self._pair.write( - input_key=self._input.stream_key, - output_key=self._output.stream_key, - record=staged, - ) - await self._wake() + last = await self._place(records) except AppendConflictError as error: raise StreamProducerError( f"producer {self._session!r} already wrote a different record at " @@ -693,6 +835,34 @@ async def _write(self, records: list[WireRecord]) -> Cursor: self._last = mint_cursor(_PROVIDER, last.token) return self._last + async def _place(self, records: list[WireRecord]) -> Offset | None: + """Append ``records`` where the owner keeps them and return the last position.""" + assert self._codec is not None + last: Offset | None = None + for index, record in enumerate(records): + # Built here rather than handed to the transport's publish, which + # appends one key per call. The identity is the same one the transport + # would derive, so a record either side already holds is reused. + staged = TransportRecord( + kind=TransportRecordKind.DATA, + payload=await self._codec.encode(record.SerializeToString()), + producer_session_id=self._session, + sequence=self._sequence + index, + ) + if self._owned is not None: + assert self._name is not None + last = await self._owned.write(name=self._name, record=staged) + continue + assert self._pair is not None + last = await self._pair.write( + input_key=self._input.stream_key, + output_key=self._output.stream_key, + record=staged, + ) + if self._owned is None: + await self._wake() + return last + async def _wake(self) -> None: try: await self._input.wake() @@ -714,6 +884,7 @@ async def _consumer_has_gone(self) -> bool: still the running one. A run that continued as new has not gone: the streams are keyed by the chain, so its successor is the consumer now. """ + assert self._workflow_id is not None handle = self._client.get_workflow_handle(self._workflow_id) deadline = time.monotonic() + 5 while True: @@ -731,28 +902,44 @@ async def _consumer_has_gone(self) -> bool: class RedisStreamHandle: - """One workflow's topics from outside, over the transport's output streams.""" + """One owner's topics from outside. + + The owner is ``workflow_id``'s workflow, read over the transport's output + streams, or with ``activity_id`` an activity, read from the stream the + provider keeps for it: a standalone activity without ``workflow_id``, or + an activity that workflow scheduled. + """ def __init__( self, streams: RedisStreams, client: Client, - workflow_id: str, + workflow_id: str | None, run_id: str | None, + activity_id: str | None = None, ) -> None: - """Address ``workflow_id``'s topics; ``run_id`` decides whose close ends a read.""" + """Address the owner's topics; ``run_id`` decides whose close ends a read.""" self._streams = streams self._client = client self._workflow_id = workflow_id self._run_id = run_id + self._owner: _ActivityOwner | None = None + if activity_id is not None: + self._owner = _ActivityOwner( + client.namespace, workflow_id, activity_id, run_id + ) + context = self._owner.context() + else: + if workflow_id is None: + raise ValueError( + "a stream handle needs a workflow_id or an activity_id" + ) + context = WorkflowSerializationContext( + namespace=client.namespace, workflow_id=workflow_id + ) self._converter = client.data_converter.payload_converter self._codec: StreamPayloadCodec[bytes] = StreamPayloadCodec( - client.data_converter.with_context( - WorkflowSerializationContext( - namespace=client.namespace, workflow_id=workflow_id - ) - ), - bytes, + client.data_converter.with_context(context), bytes ) def read( @@ -762,25 +949,140 @@ def read( after: Cursor = BEGINNING, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the chain, or the pinned run, closes. + """Yield records on ``topic`` after ``after`` until the owner closes. + + For a workflow that is the chain, or the pinned run; for an activity it is + the activity reaching a terminal status, learned as the module docstring + says. Two refusals and they do not land together. A cursor another provider minted, - or one naming the workflow's own input log, is refused by this call: reading - the token needs nothing from the store. A well-formed cursor the retention has + or one naming a workflow's input log, is refused by this call: reading the + token needs nothing from the store. A well-formed cursor the retention has trimmed is refused on the first step of the generator, because answering that needs a round trip and this call is not a coroutine. Neither yields a record first. Raises: - StreamCursorError: The cursor is another provider's, or names the + StreamCursorError: The cursor is another provider's, or names a workflow's input log. """ topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. position = _outside_position(after) + if self._owner is not None: + return self._read_owned(self._owner, topic, position, after, result_type) return self._read(topic, position, after, result_type) + async def _read_owned( + self, + owner: _ActivityOwner, + topic: str, + position: Offset | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + backend = self._streams._require_backend() + await self._require_owner(owner) + store = backend._client + name = owner.key(_prefix(backend), topic) + if ( + position is not None + and isinstance(backend, _RetainingBackend) + and not await _retained(store, name, position) + ): + # Refused rather than resumed from the first retained record, + # which would skip whatever the trim took in between. + raise StreamCursorError( + f"cursor {after.token!r} names a record on {topic!r} that the " + f"provider's retention has trimmed ({backend.describe_window()})" + ) + start = _BEGINNING_SENTINEL if position is None else position.token + # XREAD BLOCK 0 waits forever, which is not what a zero poll asks for. + block = int(self._streams._poll.total_seconds() * 1000) or None + closed = False + while True: + found: Any = await store.xread( + {name: start}, count=_READ_BATCH, block=block + ) + entries = found[0][1] if found else [] + for entry_id, fields in entries: + placed = _to_record(entry_id, fields) + assert placed.offset is not None + start = placed.offset.token + if placed.kind is not TransportRecordKind.DATA: + continue + minted = mint_cursor(_PROVIDER, placed.offset.token) + wire = _parse( + minted, await self._codec.decode(placed.payload), logger.warning + ) + if wire is None: + continue + for record in decoder.decode(minted, wire): + yield record + if entries: + continue + if closed: + return + # One more pass after learning the owner is terminal, so a record + # that landed between the read and the describe is not lost. + closed = await self._owner_closed(owner, store, name) + + async def _require_owner(self, owner: _ActivityOwner) -> None: + """Raise ``StreamNotFoundError`` when the server does not know ``owner``.""" + try: + if owner.workflow_id is None: + await self._client.get_activity_handle( + owner.activity_id, run_id=owner.run_id + ).describe() + else: + await self._client.get_workflow_handle( + owner.workflow_id, run_id=owner.run_id + ).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError(f"{owner} was not found") from error + raise + + async def _owner_closed(self, owner: _ActivityOwner, store: Any, name: str) -> bool: + """Whether the owning activity is terminal, as far as this store can tell. + + A standalone activity says so itself. The server does not describe a + workflow's activity, so its workflow is asked: the workflow closing ends + the read, and so does the activity leaving the pending set once its + stream exists. Before the first write there is no stream, so an + activity that never wrote is read until its workflow closes. + """ + try: + if owner.workflow_id is None: + described = await self._client.get_activity_handle( + owner.activity_id, run_id=owner.run_id + ).describe() + return described.status != ActivityExecutionStatus.RUNNING + description = await self._client.get_workflow_handle( + owner.workflow_id, run_id=owner.run_id + ).describe() + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + # The owner's History is gone, so there is nothing left to follow. + return True + raise + status = description.status + if status is not None and status != WorkflowExecutionStatus.RUNNING: + # An activity's streams are not the chain's: a run that continued + # as new took its activities with it. + return True + pending = any( + info.activity_id == owner.activity_id + for info in description.raw_description.pending_activities + ) + if pending: + return False + return bool(await store.exists(name)) + async def _read( self, topic: str, @@ -792,6 +1094,7 @@ async def _read( self._converter, result_type, after=after, warn=logger.warning ) backend = self._streams._require_backend() + assert self._workflow_id is not None chain = await _chain(self._client, self._workflow_id) key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) if ( @@ -875,6 +1178,7 @@ async def _read( closed = await self._closed() async def _closed(self) -> bool: + assert self._workflow_id is not None handle = self._client.get_workflow_handle( self._workflow_id, run_id=self._run_id ) @@ -901,6 +1205,14 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """ topic, _ = resolve_topic(topic) backend = self._streams._require_backend() + if self._owner is not None: + newest: Any = await backend._client.xrevrange( + self._owner.key(_prefix(backend), topic), "+", "-", count=1 + ) + if not newest: + return BEGINNING + return mint_cursor(_PROVIDER, _text(newest[0][0])) + assert self._workflow_id is not None chain = await _chain(self._client, self._workflow_id) try: tail = await backend.output_tail( @@ -924,7 +1236,13 @@ def producer( topic, _ = resolve_topic(topic) producer_id, attempt = producer_identity(producer_id, attempt) return RedisProducer( - self._streams, self._client, self._workflow_id, topic, producer_id, attempt + self._streams, + self._client, + self._workflow_id, + topic, + producer_id, + attempt, + owner=self._owner, ) @@ -1036,6 +1354,27 @@ def get_stream_handle( """A handle on ``workflow_id``'s topics; it follows the chain by construction.""" return RedisStreamHandle(self, client, workflow_id, run_id) + def get_activity_stream_handle( + self, + client: Client, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + ) -> RedisStreamHandle: + """A handle on the topics ``activity_id`` owns, apart from any workflow's. + + Without ``workflow_id`` the activity is a standalone one and ``run_id`` + pins its run; with one it is that workflow's activity and ``run_id`` + pins the workflow's run. The streams are keyed by the activity id and + not its run, so a retry writes to the same ones and a reader sees the + attempt change as ``SUPERSEDED``, and an id started again continues + them. A read ends when the activity is terminal and the retained tail + is delivered; the store has no gate on an append after that, so a late + attempt still lands, and a read that has ended does not see it. + """ + return RedisStreamHandle(self, client, workflow_id, run_id, activity_id) + async def close(self) -> None: """Release the Redis connections this provider opened.""" client, self._owned_client = self._owned_client, None From aa6733971c8c4c6eb17d2e1a06a0520c3371eac2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Tue, 29 Sep 2026 17:07:53 -0700 Subject: [PATCH 677/831] Tested activity-owned streams on the Redis provider. The shared activity cases run on Redis behind the STREAMS_LIVE gate, beside the key scheme and what only this store decides: how a read on a workflow's activity ends, the wait for one that never wrote, retention on its stream and the append nothing gates once the owner is terminal. --- tests/streams/test_activity_streams.py | 25 +++ tests/streams/test_redis_activity_streams.py | 215 +++++++++++++++++++ tests/streams/test_redis_provider.py | 48 +++++ 3 files changed, 288 insertions(+) create mode 100644 tests/streams/test_redis_activity_streams.py diff --git a/tests/streams/test_activity_streams.py b/tests/streams/test_activity_streams.py index 8aa4a653a..3695b1416 100644 --- a/tests/streams/test_activity_streams.py +++ b/tests/streams/test_activity_streams.py @@ -16,6 +16,7 @@ from __future__ import annotations import asyncio +import os import uuid from collections.abc import AsyncIterator, Callable from dataclasses import dataclass @@ -34,6 +35,7 @@ topic, ) from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.redis import RedisStreams from temporalio.testing import WorkflowEnvironment from tests.helpers import new_worker @@ -57,9 +59,32 @@ async def _memory_setup(client: Client) -> AsyncIterator[ActivitySetup]: provider.reset() +async def _redis_setup(client: Client) -> AsyncIterator[ActivitySetup]: + # The store is a Redis the test environment does not start; the server + # is the environment's own unless TEMPORAL_ADDRESS names another. + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = RedisStreams( + url=os.environ.get("TEMPORAL_TEST_REDIS_URL") + or os.environ.get("AI198_REDIS_URL", "redis://127.0.0.1:6379"), + # A prefix per setup, because the store keeps what earlier runs wrote. + key_prefix=f"streams-activity-{uuid.uuid4().hex}", + poll_interval=timedelta(milliseconds=100), + ) + config = client.config() + config["plugins"] = [provider] + yield ActivitySetup("redis", provider, Client(**config)) + await provider.close() + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ActivitySetup]]] = { "memory": _memory_setup } +if os.environ.get("STREAMS_LIVE") == "redis": + SETUPS["redis"] = _redis_setup @pytest.fixture(params=sorted(SETUPS)) diff --git a/tests/streams/test_redis_activity_streams.py b/tests/streams/test_redis_activity_streams.py new file mode 100644 index 000000000..ec60a4a7f --- /dev/null +++ b/tests/streams/test_redis_activity_streams.py @@ -0,0 +1,215 @@ +"""Live checks for what the Redis provider decides about an activity's streams. + +``test_activity_streams`` runs the shared cases on this provider behind +``STREAMS_LIVE=redis``. This module covers what only this store does: how a +read learns that a workflow's activity is terminal without the server saying +so, that an activity that never wrote is read until its workflow closes, +that retention trims an activity's stream like any other, and that nothing +gates an append once the owner is terminal. All need a dev server +(``TEMPORAL_ADDRESS`` or the test environment's own) and a Redis +(``TEMPORAL_TEST_REDIS_URL`` or ``AI198_REDIS_URL``). +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from collections.abc import AsyncIterator +from datetime import timedelta + +import pytest + +from temporalio import activity, workflow +from temporalio.client import Client +from temporalio.streams import BEGINNING, RecordKind, StreamCursorError +from temporalio.streams.providers.redis import RedisStreams +from temporalio.testing import WorkflowEnvironment +from tests.helpers import new_worker +from tests.streams.test_activity_streams import ( + TOKENS, + read_all, + summary, + write_by_default, + write_to_own_streams, +) +from tests.streams.test_streams_conformance import StreamHost, take + +pytestmark = pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "redis", + reason="needs a live server and redis; run with STREAMS_LIVE=redis", +) + + +def redis_url() -> str: + return os.environ.get("TEMPORAL_TEST_REDIS_URL") or os.environ.get( + "AI198_REDIS_URL", "redis://127.0.0.1:6379" + ) + + +@pytest.fixture +async def live(client: Client, env: WorkflowEnvironment) -> AsyncIterator[Client]: + """A client with a fresh provider registered, on a server with standalone activities.""" + if env.supports_time_skipping: + pytest.skip("the time-skipping test server has no standalone activities") + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect( + address, namespace=os.environ.get("TEMPORAL_NAMESPACE", "default") + ) + provider = RedisStreams( + url=redis_url(), + # A prefix per case, because the store keeps what earlier cases wrote. + key_prefix=f"streams-redis-activity-{uuid.uuid4().hex}", + poll_interval=timedelta(milliseconds=100), + ) + config = client.config() + config["plugins"] = [provider] + try: + yield Client(**config) + finally: + await provider.close() + + +@activity.defn +async def write_nothing(label: str) -> str: + return label + + +@workflow.defn +class RunsOneActivityThenWaits: + """Runs one activity by name, then stays open until released.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self, name: str, label: str) -> str: + result = await workflow.execute_activity( + name, + label, + activity_id="streamer", + start_to_close_timeout=timedelta(seconds=30), + ) + await workflow.wait_condition(lambda: self._released) + return result + + +async def test_a_read_opened_after_the_activity_finished_ends_by_itself( + live: Client, +): + # The server does not describe a workflow's activity, so the provider ends + # the read once the activity is no longer pending and its stream exists. + workflow_id = f"streams-redis-wfa-{uuid.uuid4().hex}" + async with new_worker( + live, RunsOneActivityThenWaits, activities=[write_to_own_streams] + ) as worker: + handle = await live.start_workflow( + RunsOneActivityThenWaits.run, + args=["write_to_own_streams", "to the activity"], + id=workflow_id, + task_queue=worker.task_queue, + ) + own = live.get_stream_handle(workflow_id, activity_id="streamer") + # The first read follows the activity to its FINISH while it runs. + await take(own.read(topic=TOKENS), 2, 30) + # A read opened afterwards ends on its own, with the workflow still open. + records = await read_all(own.read(topic=TOKENS), timeout=10) + assert summary(records) == [ + (RecordKind.DATA, 1, "to the activity"), + (RecordKind.FINISH, 1, None), + ] + assert (await handle.describe()).status is not None + await handle.signal(RunsOneActivityThenWaits.release) + await handle.result() + + +async def test_an_activity_that_never_wrote_is_read_until_its_workflow_closes( + live: Client, +): + workflow_id = f"streams-redis-wfa-silent-{uuid.uuid4().hex}" + async with new_worker( + live, RunsOneActivityThenWaits, activities=[write_nothing] + ) as worker: + handle = await live.start_workflow( + RunsOneActivityThenWaits.run, + args=["write_nothing", "quiet"], + id=workflow_id, + task_queue=worker.task_queue, + ) + assert await handle.query("__temporal_workflow_metadata") is not None + own = live.get_stream_handle(workflow_id, activity_id="streamer") + reading = asyncio.ensure_future(read_all(own.read(topic=TOKENS), timeout=30)) + # No stream exists for an activity that wrote nothing, so the read has + # nothing to say the activity is over and waits for the workflow. + await asyncio.sleep(1.0) + assert not reading.done() + await handle.signal(RunsOneActivityThenWaits.release) + await handle.result() + assert await reading == [] + + +async def test_retention_trims_an_activity_stream_too(client: Client): + address = os.environ.get("TEMPORAL_ADDRESS") + if address: + client = await Client.connect(address) + provider = RedisStreams( + url=redis_url(), + key_prefix=f"streams-redis-activity-{uuid.uuid4().hex}", + poll_interval=timedelta(milliseconds=100), + max_len=2, + ) + config = client.config() + config["plugins"] = [provider] + live = Client(**config) + workflow_id = f"streams-redis-wfa-trim-{uuid.uuid4().hex}" + try: + async with new_worker(live, StreamHost) as worker: + host = await live.start_workflow( + StreamHost.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = live.get_stream_handle(workflow_id, activity_id="tool") + producer = stream.producer(topic=TOKENS, producer_id="tool", attempt=1) + first = await producer.append({"token": "one"}) + assert first is not None + await producer.append({"token": "two"}, {"token": "three"}) + # The window holds two entries, so the first record is gone. + records = await take(stream.read(topic=TOKENS), 2, 10) + assert [r.value["token"] for r in records] == ["two", "three"] + with pytest.raises(StreamCursorError, match="retention has trimmed"): + await take(stream.read(topic=TOKENS, after=first), 1, 10) + await host.terminate() + finally: + await provider.close() + + +async def test_an_append_after_the_owner_is_terminal_still_lands(live: Client): + # The store has no gate the server would have: a late attempt writes, and + # a reader that already ended is not told. + activity_id = f"streams-redis-saa-late-{uuid.uuid4().hex}" + async with new_worker(live, activities=[write_by_default]) as worker: + handle = await live.start_activity( + write_by_default, + "standalone", + id=activity_id, + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=30), + ) + assert await handle.result() == activity_id + stream = live.get_stream_handle(activity_id=activity_id) + before = await stream.latest(topic=TOKENS) + assert before != BEGINNING + late = stream.producer(topic=TOKENS, producer_id=activity_id, attempt=2) + after = await late.append({"token": "late"}) + assert after != before + records = await read_all(stream.read(topic=TOKENS), timeout=10) + assert summary(records) == [ + (RecordKind.DATA, 1, "standalone"), + (RecordKind.FINISH, 1, None), + (RecordKind.SUPERSEDED, 2, None), + (RecordKind.DATA, 2, "late"), + ] diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index ac4919c81..6066cce8b 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -7,15 +7,63 @@ import pytest +from temporalio.contrib.external_workflow_streams import StreamDirection +from temporalio.contrib.external_workflow_streams._backend import StreamKey +from temporalio.contrib.external_workflow_streams._redis import RedisStreamBackend from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError from temporalio.streams.providers.redis import ( RedisStreams, + _ActivityOwner, _drive, _outside_position, _workflow_position, ) +class _NoRedis: + """Enough of a Redis client to construct a backend and render its keys.""" + + def register_script(self, _script: str) -> None: + return None + + +def test_activity_keys_encode_their_ids_and_never_meet_chain_keys(): + assert ( + _ActivityOwner("ns", "wf", "act", None).key("p", "t") + == "p:ns:activity/wf/act:t" + ) + assert ( + _ActivityOwner("ns", None, "act", None).key("p", "t") == "p:ns:activity//act:t" + ) + # An id holding a separator is encoded, so it cannot move a boundary. + assert ( + _ActivityOwner("n:s", "w/f", "a:c", None).key("p", "t/u") + == "p:n%3As:activity/w%2Ff/a%3Ac:t%2Fu" + ) + # A chain key percent-encodes every id, so none of its components holds a + # "/" however the ids are chosen, and the owner component here always does. + backend = RedisStreamBackend(client=_NoRedis(), key_prefix="p") + forged = StreamKey( + namespace="ns", + workflow_id="activity/wf/act", + first_execution_run_id="t", + stream_name="t", + direction=StreamDirection.OUTPUT, + ) + assert "/" not in backend.stream_key(forged) + assert backend.stream_key(forged) != _ActivityOwner("ns", "wf", "act", None).key( + "p", "t" + ) + + +def test_an_activity_owner_names_itself_for_messages(): + assert str(_ActivityOwner("ns", None, "act", None)) == "activity 'act'" + assert ( + str(_ActivityOwner("ns", "wf", "act", "run")) + == "activity 'act' of workflow 'wf'" + ) + + def test_outside_cursors_name_output_positions(): assert _outside_position(BEGINNING) is None position = _outside_position(Cursor("redis:1700000000000-3")) From ea80bf534318e6d0e991ac83a82b3ea58a25f364 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 00:32:17 -0700 Subject: [PATCH 678/831] Noted what the June scenarios do on Redis now that it holds activity streams. The last two parts of s5 run on Redis since the provider keeps an activity's own streams, so the refusal list and the s5 note change. s7 stops on Redis at a wake the consumer run refuses while continuing as new, which is open on the provider, so the README says so. --- examples/streams/june_scenarios/README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/examples/streams/june_scenarios/README.md b/examples/streams/june_scenarios/README.md index 78d2abedc..9b3f58992 100644 --- a/examples/streams/june_scenarios/README.md +++ b/examples/streams/june_scenarios/README.md @@ -13,7 +13,7 @@ reaches into private SDK code or adds a feature. | Client starts and consume stream: standalone alt 1, 2, 3 | `s2_standalone_streams.py` | alt 2 implemented; alts 1 and 3 open | Native only. Shows `StreamNotFoundError` for alt 1; wait-for-creation reads and start-committed stream arguments are open questions on the blueprint | | Workflow as Producer: as named handle | `s3_workflow_producer.py` | implemented | His turn loop with continue-as-new; the client follows the chain live | | Workflow as Producer: as return type | `s4_workflow_as_generator.py` | emulated | Default-topic publishes plus `FINISH`, result from the workflow; the generator signature is sugar not built | -| Activity as Producer: as named handle | `s5_activity_producers.py` | implemented | Workflow topic (Path B), `scope="activity"`, standalone activity; the last two on native and memory only | +| Activity as Producer: as named handle | `s5_activity_producers.py` | implemented | Workflow topic (Path B), `scope="activity"`, standalone activity; the last two on native, memory and Redis | | Activity as Producer: as return type | `s6_activity_as_generator.py` | emulated | Appends plus a heartbeat checkpoint; the retry resumes and readers see `SUPERSEDED` | | Workflow as Consumer | `s7_workflow_consumer.py` | implemented; foreign stream unsupported | Own inbound topic across continue-as-new, carrying a checkpoint because a run's topic is its own; reading a foreign stream from a workflow is rule 5 | | Client as Consumer over Standalone Nexus | `s8_nexus_consumers.py` (a) | implemented | Activity reads through the `NexusStreams` front and resumes from a heartbeat cursor | @@ -29,6 +29,7 @@ examples one directory up do. `run.py` runs them all in order: python -m examples.streams.june_scenarios.run native --address 127.0.0.1:7333 python -m examples.streams.june_scenarios.run workflow_streams --address 127.0.0.1:7333 python -m examples.streams.june_scenarios.run memory --address 127.0.0.1:7333 +python -m examples.streams.june_scenarios.run redis --address 127.0.0.1:7333 --redis redis://127.0.0.1:6379 python -m examples.streams.june_scenarios.s5_activity_producers native --address 127.0.0.1:7333 ``` @@ -39,10 +40,15 @@ streams, and `s8` needs the server's Nexus HTTP ingress (`--http`, default commands above point every provider at it. `s8` creates and deletes its own Nexus endpoint. `memory` is offered here, not in the parent examples, because it is not replay-safe; these scenarios keep a warm cache. `redis` -is accepted too, with `--redis`, but was not part of the runs behind this -directory. +runs with `--redis` naming a local Redis: `s1` apart from (d), `s3` to `s6` +with all three parts of `s5`, and `s8` ran green against the stream server, +and `s2` refuses as on every provider but `native`. `s7` fails on `redis`: +the sender's `finish()` lands while the consumer run is continuing as new, +the closing run refuses the provider's wake, and the producer raises +`WakeNotAcknowledgedError` instead of waking the successor. That is open on +the Redis provider, so `run.py redis` stops there. A scenario a provider cannot serve says so in its output and moves on: -`s2` on anything but `native`, `s5` (b) and (c) on `workflow_streams` and -`redis`, `s1` (d) on anything but `memory`, and `s7` on `memory`, which -keeps one topic across a chain rather than one per run. +`s2` on anything but `native`, `s5` (b) and (c) on `workflow_streams`, +`s1` (d) on anything but `memory`, and `s7` on `memory`, which keeps one +topic across a chain rather than one per run. From 2c19822627a96fb65ca31eaa6c156b3d67286b70 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 00:40:16 -0700 Subject: [PATCH 679/831] Sent a refused wake again along the chain instead of failing the sender. A consumer that reads the sender's FINISH straight from the store and continues as new on it closes before the wake Signal for that record lands, and the server refuses a Signal to a closing run. The streams are keyed by the chain, so the records are already where the successor reads them; only the wake has to follow, and it is given up only once the chain is terminal. --- temporalio/streams/providers/redis.py | 79 +++++++++------ tests/streams/test_redis_provider.py | 137 +++++++++++++++++++++++++- tests/streams/test_redis_replay.py | 71 +++++++++++++ 3 files changed, 255 insertions(+), 32 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 09232ed70..06a2f7c12 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -18,7 +18,12 @@ started. Both keys are written by one script, so a record is on both or on neither: split across two calls, a crash between them leaves a record the workflow consumes and no outside reader can ever see. The cost is one more - append per record and one wake per batch. + append per record and one wake per batch. A wake the server refuses because + the consuming run is closing is sent again after a short wait: a run that + continues as new hands the stream to its successor, the records are already + where the successor reads them, and only the wake has to follow. The + retries stop when the chain's current run takes the wake or the chain + proves terminal. - A record rides as the transport's payload: the serialized ``StreamRecord`` proto as a ``binary/plain`` value, which the worker's codec encodes and decodes like any other payload. @@ -164,6 +169,12 @@ _REDIS_ID = re.compile(r"\d+-\d+") _READ_BATCH = 256 +#: How long a wake the server refused is sent again before it is given up, and +#: the pause between attempts. The pause is there because in the instant between +#: two runs of a chain the successor is not yet the run a Signal resolves to. +_WAKE_RETRY_WINDOW: Final = timedelta(seconds=5) +_WAKE_RETRY_BACKOFF: Final = timedelta(milliseconds=200) + # The transport's per-task batch limits are a backpressure point that awaits # inside the workflow, and a synchronous publish has nowhere to await. Lifted # to where they cannot fire, so a task's publishes stage as one batch. @@ -864,41 +875,49 @@ async def _place(self, records: list[WireRecord]) -> Offset | None: return last async def _wake(self) -> None: - try: - await self._input.wake() - except WakeNotAcknowledgedError: - # The records are appended; what failed is telling a consumer that - # is no longer there to be told. A terminal record most often races - # the consumer acting on it, so an absent consumer is the ordinary - # ending rather than an error. - if not await self._consumer_has_gone(): - raise - except TransportStreamError as error: - raise _storage_error(error, "the wake could not be sent") from error + """Wake the consuming workflow, following the chain past a closing run. + + The records are appended before this is called; what can fail is + telling the consumer. The server refuses a Signal while the run it + resolves to is closing, and a consumer that reads a terminal record + straight from the store and continues as new on it closes in exactly + that way, ahead of the wake for that record. The streams are keyed by + the chain, so the records are already where the successor reads them + and only the wake has to follow: it is sent again, addressed to the + workflow id as every wake is, until the chain's current run takes it. + A chain that has ended instead is the ordinary ending of a terminal + record racing the consumer acting on it, not an error. + """ + deadline = time.monotonic() + _WAKE_RETRY_WINDOW.total_seconds() + while True: + try: + await self._input.wake() + return + except WakeNotAcknowledgedError: + if await self._chain_is_terminal(): + return + if time.monotonic() >= deadline: + raise + except TransportStreamError as error: + raise _storage_error(error, "the wake could not be sent") from error + await asyncio.sleep(_WAKE_RETRY_BACKOFF.total_seconds()) - async def _consumer_has_gone(self) -> bool: - """Whether the consuming execution is closing or closed. + async def _chain_is_terminal(self) -> bool: + """Whether the chain has ended for good, rather than handing over. - Asked for a few seconds rather than once: the server refuses the wake - while the execution is closing, and at that moment its status is - still the running one. A run that continued as new has not gone: the - streams are keyed by the chain, so its successor is the consumer now. + A run that continued as new is not the end: its successor is the + consumer now, and a closing run still describes as running. A chain + whose History is gone has ended. """ assert self._workflow_id is not None handle = self._client.get_workflow_handle(self._workflow_id) - deadline = time.monotonic() + 5 - while True: - try: - status = (await handle.describe()).status - except RPCError as error: - if error.status == RPCStatusCode.NOT_FOUND: - return True - raise - if status is not None and status not in _STILL_CONSUMING: + try: + status = (await handle.describe()).status + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: return True - if time.monotonic() >= deadline: - return False - await asyncio.sleep(0.1) + raise + return status is not None and status not in _STILL_CONSUMING class RedisStreamHandle: diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 6066cce8b..54ef6f46c 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -1,17 +1,30 @@ -"""What the Redis provider decides without a store: cursors and the sync publish.""" +"""What the Redis provider decides without a store: cursors, the sync publish, the wake.""" from __future__ import annotations import asyncio from datetime import timedelta +from types import SimpleNamespace +from typing import Any, cast import pytest -from temporalio.contrib.external_workflow_streams import StreamDirection +from temporalio.client import WorkflowExecutionStatus +from temporalio.contrib.external_workflow_streams import ( + StreamDirection, + WakeNotAcknowledgedError, +) +from temporalio.contrib.external_workflow_streams import ( + StreamError as TransportStreamError, +) from temporalio.contrib.external_workflow_streams._backend import StreamKey from temporalio.contrib.external_workflow_streams._redis import RedisStreamBackend +from temporalio.converter import DataConverter +from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError +from temporalio.streams.providers import redis as redis_provider from temporalio.streams.providers.redis import ( + RedisProducer, RedisStreams, _ActivityOwner, _drive, @@ -20,6 +33,126 @@ ) +class _ChainClient: + """A client whose describes of the chain answer from a script of statuses. + + The last entry repeats, so a chain that stays running keeps saying so. + """ + + def __init__(self, *answers: WorkflowExecutionStatus | Exception) -> None: + self.data_converter = DataConverter.default + self.namespace = "default" + self._answers = list(answers) + self.describes = 0 + + def get_workflow_handle(self, _workflow_id: str, **_: Any) -> Any: + return self + + async def describe(self) -> Any: + self.describes += 1 + answer = self._answers.pop(0) if len(self._answers) > 1 else self._answers[0] + if isinstance(answer, Exception): + raise answer + return SimpleNamespace(status=answer) + + +class _RefusingInput: + """The transport's input topic, refusing the first ``refusals`` wakes.""" + + def __init__(self, refusals: int, error: Exception | None = None) -> None: + self._refusals = refusals + self._error = error + self.calls = 0 + + async def wake(self) -> list[str]: + self.calls += 1 + if self.calls <= self._refusals: + raise self._error or WakeNotAcknowledgedError( + "workflow operation can not be applied because workflow is closing", + pending=[], + ) + return ["sent"] + + +def _waking_producer(client: _ChainClient, wakes: _RefusingInput) -> RedisProducer[Any]: + producer: RedisProducer[Any] = RedisProducer( + RedisStreams(), cast(Any, client), "wf", "inputs", "console", 1 + ) + producer._input = wakes + return producer + + +@pytest.fixture +def quick_wake_retries(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr( + redis_provider, "_WAKE_RETRY_BACKOFF", timedelta(milliseconds=10) + ) + monkeypatch.setattr( + redis_provider, "_WAKE_RETRY_WINDOW", timedelta(milliseconds=300) + ) + + +@pytest.mark.usefixtures("quick_wake_retries") +async def test_a_wake_refused_by_a_closing_run_is_sent_again_to_its_successor(): + # The chain describes as running: the run that refused the wake handed over + # to a successor, which is where the records already are. + client = _ChainClient(WorkflowExecutionStatus.RUNNING) + wakes = _RefusingInput(refusals=1) + await _waking_producer(client, wakes)._wake() + assert (wakes.calls, client.describes) == (2, 1) + + +@pytest.mark.usefixtures("quick_wake_retries") +async def test_a_refused_wake_waits_for_the_successor_to_become_current(): + # In the instant between two runs the chain still describes as the + # predecessor that continued as new, and the next Signal is refused too. + client = _ChainClient( + WorkflowExecutionStatus.CONTINUED_AS_NEW, WorkflowExecutionStatus.RUNNING + ) + wakes = _RefusingInput(refusals=2) + await _waking_producer(client, wakes)._wake() + assert (wakes.calls, client.describes) == (3, 2) + + +@pytest.mark.usefixtures("quick_wake_retries") +@pytest.mark.parametrize( + "ending", + [ + WorkflowExecutionStatus.COMPLETED, + WorkflowExecutionStatus.FAILED, + WorkflowExecutionStatus.CANCELED, + WorkflowExecutionStatus.TERMINATED, + WorkflowExecutionStatus.TIMED_OUT, + RPCError("gone", RPCStatusCode.NOT_FOUND, b""), + ], + ids=lambda ending: getattr(ending, "name", "not found"), +) +async def test_a_wake_refused_by_a_finished_chain_is_the_ordinary_ending( + ending: WorkflowExecutionStatus | Exception, +): + client = _ChainClient(ending) + wakes = _RefusingInput(refusals=99) + await _waking_producer(client, wakes)._wake() + assert wakes.calls == 1 + + +@pytest.mark.usefixtures("quick_wake_retries") +async def test_a_wake_refused_for_the_whole_window_is_raised(): + client = _ChainClient(WorkflowExecutionStatus.RUNNING) + wakes = _RefusingInput(refusals=99) + with pytest.raises(WakeNotAcknowledgedError, match="closing"): + await _waking_producer(client, wakes)._wake() + assert wakes.calls > 1 + + +async def test_a_wake_the_store_could_not_send_is_a_storage_error(): + client = _ChainClient(WorkflowExecutionStatus.RUNNING) + wakes = _RefusingInput(refusals=1, error=TransportStreamError("no connection")) + with pytest.raises(StreamError, match="could not be sent"): + await _waking_producer(client, wakes)._wake() + assert (wakes.calls, client.describes) == (1, 0) + + class _NoRedis: """Enough of a Redis client to construct a backend and render its keys.""" diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index a2b716756..1e7ddb663 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -448,6 +448,77 @@ async def test_a_workflow_reader_started_from_a_cursor_skips_the_earlier_records await replayer.replay_workflow(await handle.fetch_history()) +@workflow.defn +class BatchConsumer: + """Applies one batch of ``inputs`` per run, handing over at the sender's FINISH.""" + + @workflow.run + async def run(self, applied: list[str]) -> list[str]: + stop = False + async for record in workflow.stream_reader(INPUTS): + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + assert record.value is not None + if record.value["op"] == "stop": + stop = True + continue + applied.append(record.value["op"]) + if stop: + return applied + workflow.continue_as_new(applied) + + +async def _current_open_run( + client: Client, workflow_id: str, previous: str | None +) -> str: + """Wait until the chain's newest run is a new one and still open.""" + while True: + description = await client.get_workflow_handle(workflow_id).describe() + assert description.run_id is not None + if description.run_id != previous and description.close_time is None: + return description.run_id + await asyncio.sleep(0.1) + + +async def test_a_wake_refused_by_a_run_continuing_as_new_reaches_its_successor( + live_client: Client, provider: RedisStreams +): + # The consumer reads the sender's FINISH straight from the store while it + # holds its task open and continues as new on it, so the wake Signal for + # that record resolves to a run that is closing and the server refuses it. + # The records are keyed by the chain and already where the successor reads + # them; the wake has to follow, and finish() must not fail the sender. + workflow_id = f"streams-redis-batches-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[BatchConsumer], + plugins=[provider], + max_cached_workflows=100, + ): + handle = await live_client.start_workflow( + BatchConsumer.run, [], id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + run_id: str | None = None + for number, batch in enumerate([["a", "b"], ["c"], ["d", "stop"]], start=1): + run_id = await asyncio.wait_for( + _current_open_run(live_client, workflow_id, run_id), 30 + ) + # A sender per batch: the stream spans the chain, so one identity + # numbering its records from the start again would collide with + # the batch before. + sender = stream.producer( + topic=INPUTS, producer_id=f"console-{number}", attempt=1 + ) + for op in batch: + await sender.append({"op": op}) + await sender.finish() + assert await asyncio.wait_for(handle.result(), 30) == ["a", "b", "c", "d"] + + async def _stage_one( streams: RedisStreams, client: Client, From bf99f744b8075b8e8dd99c1e2ab268182887bf0d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:12:21 -0700 Subject: [PATCH 680/831] Trimmed Redis stream keys to seven days unless told otherwise. No trimming was the default, so unbounded growth was the default failure mode of a store with no consumer floor. An age rather than a count, because a count cap refuses a task whose batch does not fit under it; `retention=None` opts out. --- temporalio/streams/providers/redis.py | 52 ++++++++++++++++++--------- tests/streams/test_redis_provider.py | 26 +++++++++++++- tests/streams/test_redis_replay.py | 3 +- 3 files changed, 63 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 06a2f7c12..1ada92889 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -59,12 +59,16 @@ batch limits are lifted for this provider, because a synchronous publish cannot wait for the worker to stage a full batch; a batch it cannot stage fails the task. -- Retention is trimming, with no consumer floor. When ``retention`` or - ``max_len`` is set, every append the provider makes trims the key it wrote, - an activity's stream included, whatever any reader has reached. A replay - that reaches a recorded range the trim removed fails its Workflow Task, an - outside cursor below the trim is refused, and a fully trimmed topic reads - as empty. +- Retention is trimming, with no consumer floor. By default a record older + than :data:`DEFAULT_RETENTION`, seven days, is trimmed by the next append + the provider makes to its key, an activity's stream included, whatever any + reader has reached; ``retention=None`` turns the age trim off, and + ``max_len`` adds a count cap that is off by default. A replay that reaches + a recorded range the trim removed fails its Workflow Task, an outside + cursor below the trim is refused, and a fully trimmed topic reads as + empty. A run that has to replay cold after seven days of consuming fails, + so a long-lived consumer continues as new inside the window, or is + configured with a longer one. """ from __future__ import annotations @@ -160,7 +164,7 @@ from temporalio.streams.providers import ProviderPlugin from temporalio.worker import ReplayerConfig, WorkerConfig -__all__ = ["RedisProducer", "RedisStreamHandle", "RedisStreams"] +__all__ = ["DEFAULT_RETENTION", "RedisProducer", "RedisStreamHandle", "RedisStreams"] T = TypeVar("T") @@ -169,6 +173,15 @@ _REDIS_ID = re.compile(r"\d+-\d+") _READ_BATCH = 256 +#: How long a record is kept when the constructor is not told otherwise. +#: +#: An age rather than a count, because the count a topic can afford depends on +#: its record size and the age does not, and because a count cap refuses a task +#: whose batch does not fit under it. Seven days is long enough to replay a +#: consumer that was evicted over a weekend and short enough that a chain +#: nobody reads any more does not keep its records for good. +DEFAULT_RETENTION: Final = timedelta(days=7) + #: How long a wake the server refused is sent again before it is given up, and #: the pause between attempts. The pause is there because in the instant between #: two runs of a chain the successor is not yet the run a Signal resolves to. @@ -1282,7 +1295,7 @@ def __init__( idle_timeout: timedelta = timedelta(seconds=1), backend: Any | None = None, poll_interval: timedelta = timedelta(milliseconds=500), - retention: timedelta | None = None, + retention: timedelta | None = DEFAULT_RETENTION, max_len: int | None = None, ) -> None: """Create the provider. @@ -1294,13 +1307,17 @@ def __init__( idle_timeout: How long a workflow reader with nothing to read holds its Workflow Task open before the worker parks it. backend: A transport backend the caller constructed and owns. It - is trimmed by its owner, so it takes neither ``retention`` nor - ``max_len``. + is trimmed by its owner, so it takes no ``max_len`` and no + ``retention`` other than the default, which does not apply + to it. poll_interval: How long an outside reader that is caught up waits for a record before asking whether the workflow closed. retention: Trim records older than this from a topic's input and - output keys on every append the provider makes to them. This - is retention without a consumer floor: nothing holds a record + output keys on every append the provider makes to them. + :data:`DEFAULT_RETENTION`, seven days, unless the caller says + otherwise; ``None`` keeps every record until ``max_len`` + trims it, or for good when that is unset too. This is + retention without a consumer floor: nothing holds a record for a reader that has not reached it. A workflow whose replay reaches a recorded range past the window fails its Workflow Task with the transport's ``StreamIntegrityError`` until the @@ -1309,15 +1326,18 @@ def __init__( behind the window misses records. The floor the server-side provider keeps would need a consumer registry in Redis. max_len: Keep at most this many entries per key, trimmed on the - same appends and with the same consequences. It must exceed - the largest batch a task publishes, or a stage is trimmed - before its commit. + same appends and with the same consequences. Off unless set. + It must exceed the largest batch a task publishes, or a stage + is trimmed before its commit; a batch at or above it is + refused where it is staged. """ if retention is not None and retention <= timedelta(0): raise ValueError("retention must be positive") if max_len is not None and max_len < 1: raise ValueError("max_len must be positive") - if backend is not None and (retention is not None or max_len is not None): + if backend is not None and ( + retention not in (None, DEFAULT_RETENTION) or max_len is not None + ): raise ValueError( "retention and max_len trim the backend this provider opens; a " "backend handed in is trimmed by its owner" diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 54ef6f46c..36dc56fb8 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -24,6 +24,7 @@ from temporalio.streams import BEGINNING, Cursor, StreamCursorError, StreamError from temporalio.streams.providers import redis as redis_provider from temporalio.streams.providers.redis import ( + DEFAULT_RETENTION, RedisProducer, RedisStreams, _ActivityOwner, @@ -251,7 +252,30 @@ def test_retention_options_are_checked_at_construction(): RedisStreams(retention=timedelta(0)) with pytest.raises(ValueError, match="max_len"): RedisStreams(max_len=0) - # A backend the caller owns is the caller's to trim. + # A backend the caller owns is the caller's to trim; the default window + # is not a request to trim it. with pytest.raises(ValueError, match="trimmed by its owner"): RedisStreams(backend=object(), max_len=10) + with pytest.raises(ValueError, match="trimmed by its owner"): + RedisStreams(backend=object(), retention=timedelta(hours=1)) + RedisStreams(backend=object()) RedisStreams(retention=timedelta(hours=1), max_len=10) + + +async def test_the_default_window_is_an_age_and_can_be_turned_off(): + # Nothing is trimmed on a topic nobody appends to, so the default has to + # be a window that every append applies; a count cap would refuse a task + # whose batch does not fit under it, so that one stays off. + provider = RedisStreams() + try: + backend = provider._require_backend() + assert backend._retention == DEFAULT_RETENTION == timedelta(days=7) + assert backend._max_len is None + assert backend.describe_window() == f"retention={DEFAULT_RETENTION}" + finally: + await provider.close() + unbounded = RedisStreams(retention=None) + try: + assert unbounded._require_backend().describe_window() == "no retention" + finally: + await unbounded.close() diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 1e7ddb663..6a9cea2b6 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -324,7 +324,8 @@ async def test_a_replay_past_the_retention_window_fails_loudly(live_client: Clie # external storage cause, and a message that names the window. message = str(failure.value) assert "StreamIntegrityError" in message and "ExternalStorageFailure" in message - assert "past the redis provider's retention (max_len=6)" in message + assert "past the redis provider's retention (" in message + assert "max_len=6)" in message # An outside cursor below the trim is refused, not resumed from the # first retained record. From b51c3e378a7c0598967753d2b6bf8725c9941bde Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:16:14 -0700 Subject: [PATCH 681/831] Keyed an activity's Redis streams by the run its execution is in. The key held the activity id alone, so an id started again continued the earlier stream. The workflow's run for a workflow's activity and the activity's own run for a standalone one make each execution's streams its own, as on the server-side provider; a handle opened without a run describes the owner first. --- temporalio/streams/providers/redis.py | 119 ++++++++++++------- tests/streams/test_redis_activity_streams.py | 83 ++++++++++++- tests/streams/test_redis_provider.py | 19 ++- 3 files changed, 165 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 1ada92889..082a93c7d 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -40,21 +40,25 @@ follows continue-as-new by construction and ``run_id`` only decides whose close ends a read. - An activity's own streams are one Redis stream per topic, keyed by the - namespace, the workflow id, empty for a standalone activity, and the - activity id. The owner is one key component joined with ``/``, a character - the chain keys percent-encode out of every id, so no chain key and no key - derived from one can name an activity's stream. There is no input stream, - because no workflow reads these, and no staging, because an activity's - append is visible as soon as the store accepts it. The key holds the - activity id and not its run, so a retry writes to the same stream, which a - reader sees as ``SUPERSEDED``, and an id started again continues it. A - read ends when the owner is terminal and the retained tail is delivered: a - standalone activity is described directly, and a workflow's activity - through its workflow, whose close ends the read, as does the activity - leaving the pending set once its stream exists. An activity that never - wrote has no stream, so a read on it waits for the workflow. Nothing gates - an append after that, so a late attempt still lands, and a read that has - ended does not see it. + namespace, the workflow id, empty for a standalone activity, the run the + activity execution belongs to, and the activity id. The run is the + workflow's for a workflow's activity and the activity's own for a + standalone one, so a retry writes to the same stream, which a reader sees + as ``SUPERSEDED``, and an id started again, in a new run, starts a new + one, as it does on the server-side provider. Inside the activity the run + is in its info; a handle opened outside without one describes the owner + and takes its current run. The owner is one key component joined with + ``/``, a character the chain keys percent-encode out of every id, so no + chain key and no key derived from one can name an activity's stream. + There is no input stream, because no workflow reads these, and no + staging, because an activity's append is visible as soon as the store + accepts it. A read ends when the owner is terminal and the retained tail + is delivered: a standalone activity is described directly, and a + workflow's activity through its workflow, whose close ends the read, as + does the activity leaving the pending set once its stream exists. An + activity that never wrote has no stream, so a read on it waits for the + workflow. Nothing gates an append after that, so a late attempt still + lands, and a read that has ended does not see it. - A task's publishes are staged as one batch. The transport's own per-task batch limits are lifted for this provider, because a synchronous publish cannot wait for the worker to stage a full batch; a batch it cannot stage @@ -78,7 +82,7 @@ import re import time from collections.abc import AsyncGenerator, Coroutine, Sequence -from dataclasses import dataclass +from dataclasses import dataclass, replace from datetime import timedelta from typing import Any, Final, Generic, TypeVar from urllib.parse import quote @@ -422,10 +426,13 @@ def _prefix(backend: Any) -> str: class _ActivityOwner: """The activity whose streams a handle addresses, and where Redis keeps them. - ``workflow_id`` is ``None`` for a standalone activity. ``run_id`` pins the + ``workflow_id`` is ``None`` for a standalone activity. ``run_id`` is the workflow's run for a workflow's activity and the activity's own run for a - standalone one: it decides whose close ends a read and never which key is - read, because an activity's streams belong to the activity id. + standalone one. It is part of the key, so an activity execution's streams + are its own and an id started again in a new run starts new ones, and it + decides whose close ends a read. ``None`` means the run is not known yet: + a handle opened outside without one asks the server for the current run + before it touches a key. """ namespace: str @@ -435,12 +442,14 @@ class _ActivityOwner: def key(self, key_prefix: str, topic: str) -> str: """The Redis stream holding ``topic`` of this activity's streams.""" + if self.run_id is None: + raise RuntimeError(f"the run of {self} was not resolved before its key") # The chain keys percent-encode every id, so none of their components # holds a "/", and a component built around one can never equal a # chain key or a key derived from one. namespace = quote(self.namespace, safe="") owner = f"activity/{quote(self.workflow_id or '', safe='')}/" - owner += quote(self.activity_id, safe="") + owner += f"{quote(self.run_id, safe='')}/{quote(self.activity_id, safe='')}" return f"{key_prefix}:{namespace}:{owner}:{quote(topic, safe='')}" def context(self) -> SerializationContext: @@ -471,6 +480,34 @@ def __str__(self) -> str: return f"activity {self.activity_id!r} of workflow {self.workflow_id!r}" +async def _resolve_owner(client: Client, owner: _ActivityOwner) -> _ActivityOwner: + """``owner`` with its run known, or ``StreamNotFoundError`` when the server does not know it. + + One describe: it says whether the owner exists and, for a handle opened + without a run, which run is current. A standalone activity is described + itself; a workflow's activity is described through its workflow, because + the server does not describe it on its own. + """ + try: + if owner.workflow_id is None: + described = await client.get_activity_handle( + owner.activity_id, run_id=owner.run_id + ).describe() + run_id = owner.run_id or described.activity_run_id + else: + description = await client.get_workflow_handle( + owner.workflow_id, run_id=owner.run_id + ).describe() + run_id = owner.run_id or description.run_id + except RPCError as error: + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError(f"{owner} was not found") from error + raise + if not run_id: + raise StreamNotFoundError(f"the server reports no run for {owner}") + return replace(owner, run_id=run_id) + + async def _retained(client: Any, name: str, offset: Offset) -> bool: """Whether the record at ``offset`` on the stream ``name`` survived trimming. @@ -803,6 +840,9 @@ async def _connect(self) -> None: if self._owner is not None: # No transport producer to bind and no one to wake: an activity's # stream has no workflow reader and no chain to check the key against. + # Inside the activity the run is known and nothing is described. + if self._owner.run_id is None: + self._owner = await _resolve_owner(self._client, self._owner) self._name = self._owner.key(_prefix(backend), self._topic) self._owned = _OwnedAppend(backend) self._codec = StreamPayloadCodec( @@ -1018,7 +1058,9 @@ async def _read_owned( self._converter, result_type, after=after, warn=logger.warning ) backend = self._streams._require_backend() - await self._require_owner(owner) + # Described on every read, so a handle without a run reads the run that + # is current when the read starts, and ends with it. + owner = await _resolve_owner(self._client, owner) store = backend._client name = owner.key(_prefix(backend), topic) if ( @@ -1063,22 +1105,6 @@ async def _read_owned( # that landed between the read and the describe is not lost. closed = await self._owner_closed(owner, store, name) - async def _require_owner(self, owner: _ActivityOwner) -> None: - """Raise ``StreamNotFoundError`` when the server does not know ``owner``.""" - try: - if owner.workflow_id is None: - await self._client.get_activity_handle( - owner.activity_id, run_id=owner.run_id - ).describe() - else: - await self._client.get_workflow_handle( - owner.workflow_id, run_id=owner.run_id - ).describe() - except RPCError as error: - if error.status == RPCStatusCode.NOT_FOUND: - raise StreamNotFoundError(f"{owner} was not found") from error - raise - async def _owner_closed(self, owner: _ActivityOwner, store: Any, name: str) -> bool: """Whether the owning activity is terminal, as far as this store can tell. @@ -1238,8 +1264,9 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: topic, _ = resolve_topic(topic) backend = self._streams._require_backend() if self._owner is not None: + owner = await _resolve_owner(self._client, self._owner) newest: Any = await backend._client.xrevrange( - self._owner.key(_prefix(backend), topic), "+", "-", count=1 + owner.key(_prefix(backend), topic), "+", "-", count=1 ) if not newest: return BEGINNING @@ -1404,13 +1431,15 @@ def get_activity_stream_handle( """A handle on the topics ``activity_id`` owns, apart from any workflow's. Without ``workflow_id`` the activity is a standalone one and ``run_id`` - pins its run; with one it is that workflow's activity and ``run_id`` - pins the workflow's run. The streams are keyed by the activity id and - not its run, so a retry writes to the same ones and a reader sees the - attempt change as ``SUPERSEDED``, and an id started again continues - them. A read ends when the activity is terminal and the retained tail - is delivered; the store has no gate on an append after that, so a late - attempt still lands, and a read that has ended does not see it. + names its run; with one it is that workflow's activity and ``run_id`` + names the workflow's run. The streams are keyed by that run, so a + retry writes to the same ones and a reader sees the attempt change as + ``SUPERSEDED``, while an id started again in a new run starts new + ones. Without ``run_id`` each read, ``latest()`` and the first append + of a producer describe the owner and take the run current at that + moment. A read ends when the activity is terminal and the retained + tail is delivered; the store has no gate on an append after that, so + a late attempt still lands, and a read that has ended does not see it. """ return RedisStreamHandle(self, client, workflow_id, run_id, activity_id) diff --git a/tests/streams/test_redis_activity_streams.py b/tests/streams/test_redis_activity_streams.py index ec60a4a7f..9208fb54f 100644 --- a/tests/streams/test_redis_activity_streams.py +++ b/tests/streams/test_redis_activity_streams.py @@ -4,10 +4,12 @@ ``STREAMS_LIVE=redis``. This module covers what only this store does: how a read learns that a workflow's activity is terminal without the server saying so, that an activity that never wrote is read until its workflow closes, -that retention trims an activity's stream like any other, and that nothing -gates an append once the owner is terminal. All need a dev server -(``TEMPORAL_ADDRESS`` or the test environment's own) and a Redis -(``TEMPORAL_TEST_REDIS_URL`` or ``AI198_REDIS_URL``). +that retention trims an activity's stream like any other, that nothing +gates an append once the owner is terminal, and that an activity's streams +belong to the run its execution is in, so an id started again in a new run +starts new ones. All need a dev server (``TEMPORAL_ADDRESS`` or the test +environment's own) and a Redis (``TEMPORAL_TEST_REDIS_URL`` or +``AI198_REDIS_URL``). """ from __future__ import annotations @@ -28,6 +30,7 @@ from tests.helpers import new_worker from tests.streams.test_activity_streams import ( TOKENS, + RunsOneActivity, read_all, summary, write_by_default, @@ -189,7 +192,8 @@ async def test_retention_trims_an_activity_stream_too(client: Client): async def test_an_append_after_the_owner_is_terminal_still_lands(live: Client): # The store has no gate the server would have: a late attempt writes, and - # a reader that already ended is not told. + # a reader that already ended is not told. The handle names no run, so it + # describes the finished activity and lands on that run's stream. activity_id = f"streams-redis-saa-late-{uuid.uuid4().hex}" async with new_worker(live, activities=[write_by_default]) as worker: handle = await live.start_activity( @@ -213,3 +217,72 @@ async def test_an_append_after_the_owner_is_terminal_still_lands(live: Client): (RecordKind.SUPERSEDED, 2, None), (RecordKind.DATA, 2, "late"), ] + # Pinned to the run, the same stream reads the same way. + pinned = live.get_stream_handle(activity_id=activity_id, run_id=handle.run_id) + assert summary(await read_all(pinned.read(topic=TOKENS), timeout=10)) == summary( + records + ) + + +async def test_a_standalone_activity_id_started_again_starts_a_new_stream( + live: Client, +): + # The stream belongs to the activity execution, which is its run, not to + # the id: the second execution under the same id writes to a new stream, + # a handle without a run reads the current one, and a run pins the other. + activity_id = f"streams-redis-saa-again-{uuid.uuid4().hex}" + async with new_worker(live, activities=[write_by_default]) as worker: + runs = [] + for label in ("first", "second"): + handle = await live.start_activity( + write_by_default, + label, + id=activity_id, + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=30), + ) + assert await handle.result() == activity_id + runs.append(handle.run_id) + assert runs[0] != runs[1] + current = live.get_stream_handle(activity_id=activity_id) + assert summary(await read_all(current.read(topic=TOKENS), timeout=10)) == [ + (RecordKind.DATA, 1, "second"), + (RecordKind.FINISH, 1, None), + ] + earlier = live.get_stream_handle(activity_id=activity_id, run_id=runs[0]) + assert summary(await read_all(earlier.read(topic=TOKENS), timeout=10)) == [ + (RecordKind.DATA, 1, "first"), + (RecordKind.FINISH, 1, None), + ] + + +async def test_a_workflow_activity_in_a_new_run_starts_a_new_stream(live: Client): + # The same workflow id run again schedules the same activity id; keyed by + # the workflow's run, the two executions keep their streams apart. + workflow_id = f"streams-redis-wfa-again-{uuid.uuid4().hex}" + async with new_worker( + live, RunsOneActivity, activities=[write_to_own_streams] + ) as worker: + runs = [] + for label in ("first", "second"): + handle = await live.start_workflow( + RunsOneActivity.run, + args=["write_to_own_streams", label], + id=workflow_id, + task_queue=worker.task_queue, + ) + await handle.result() + runs.append(handle.result_run_id) + assert runs[0] != runs[1] + current = live.get_stream_handle(workflow_id, activity_id="streamer") + assert summary(await read_all(current.read(topic=TOKENS), timeout=10)) == [ + (RecordKind.DATA, 1, "second"), + (RecordKind.FINISH, 1, None), + ] + earlier = live.get_stream_handle( + workflow_id, activity_id="streamer", run_id=runs[0] + ) + assert summary(await read_all(earlier.read(topic=TOKENS), timeout=10)) == [ + (RecordKind.DATA, 1, "first"), + (RecordKind.FINISH, 1, None), + ] diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 36dc56fb8..dcb51adff 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -162,18 +162,25 @@ def register_script(self, _script: str) -> None: def test_activity_keys_encode_their_ids_and_never_meet_chain_keys(): + # The run is part of the key: a workflow's activity is keyed by the + # workflow's run and a standalone one by its own, so an id started again + # in a new run starts a new stream. assert ( - _ActivityOwner("ns", "wf", "act", None).key("p", "t") - == "p:ns:activity/wf/act:t" + _ActivityOwner("ns", "wf", "act", "run").key("p", "t") + == "p:ns:activity/wf/run/act:t" ) assert ( - _ActivityOwner("ns", None, "act", None).key("p", "t") == "p:ns:activity//act:t" + _ActivityOwner("ns", None, "act", "run").key("p", "t") + == "p:ns:activity//run/act:t" ) # An id holding a separator is encoded, so it cannot move a boundary. assert ( - _ActivityOwner("n:s", "w/f", "a:c", None).key("p", "t/u") - == "p:n%3As:activity/w%2Ff/a%3Ac:t%2Fu" + _ActivityOwner("n:s", "w/f", "a:c", "r/1").key("p", "t/u") + == "p:n%3As:activity/w%2Ff/r%2F1/a%3Ac:t%2Fu" ) + # A key needs the run; a handle opened without one resolves it first. + with pytest.raises(RuntimeError, match="not resolved"): + _ActivityOwner("ns", "wf", "act", None).key("p", "t") # A chain key percent-encodes every id, so none of its components holds a # "/" however the ids are chosen, and the owner component here always does. backend = RedisStreamBackend(client=_NoRedis(), key_prefix="p") @@ -185,7 +192,7 @@ def test_activity_keys_encode_their_ids_and_never_meet_chain_keys(): direction=StreamDirection.OUTPUT, ) assert "/" not in backend.stream_key(forged) - assert backend.stream_key(forged) != _ActivityOwner("ns", "wf", "act", None).key( + assert backend.stream_key(forged) != _ActivityOwner("ns", "wf", "act", "t").key( "p", "t" ) From 0e567a739ce2f59609c6d0ad6840aefd85416971 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:16:31 -0700 Subject: [PATCH 682/831] Hosted a workflow activity's own streams as reserved topics in the log. An activity a workflow scheduled keeps its streams under activity// in the workflow's log, the way native reserves that prefix, so activity.stream_handle(scope="activity") and the client's activity handle work here. A standalone activity stays refused because no workflow hosts its log, and the read ends with the activity as the workflow describes it. --- .../streams/providers/workflow_streams.py | 190 ++++++++++++++++-- tests/streams/conftest.py | 5 + tests/streams/test_activity_streams.py | 37 +++- .../streams/test_workflow_streams_provider.py | 105 +++++++++- 4 files changed, 307 insertions(+), 30 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index b03fbbbe4..538d9d472 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -40,6 +40,13 @@ through the handler the shipped class registers on it. An evicted and rebuilt workflow gets its own, so a task that failed leaks nothing into the next attempt's log and a replayed run does not see records twice. +- An activity a workflow scheduled keeps its own streams inside that + workflow's log, under the reserved topic ``activity//`` + with ``%`` and ``/`` in the id percent-encoded, the way the native + provider reserves ``activity/`` in the owner's map. The record itself + carries the plain name. A standalone activity has no workflow to host a + log, so its streams are refused, and a workflow's own topic may not start + with the reserved prefix. """ from __future__ import annotations @@ -49,7 +56,7 @@ import logging from collections.abc import AsyncGenerator from datetime import timedelta -from typing import Any, Generic, NoReturn, TypeVar +from typing import Any, Generic, TypeVar from google.protobuf.message import DecodeError @@ -106,6 +113,7 @@ from temporalio.worker._workflow_instance import QUERY_HANDLER_NOT_FOUND __all__ = [ + "WorkflowStreamsActivityHandle", "WorkflowStreamsHandle", "WorkflowStreamsProducer", "WorkflowStreamsProvider", @@ -118,6 +126,9 @@ _LATEST_QUERY = "__temporal_streams_latest" _START_QUERY = "__temporal_streams_start" _ENCODING = b"binary/plain" +# The topics an activity owns live in its workflow's log under this prefix, +# so no workflow topic may start with it. +_ACTIVITY_PREFIX = "activity/" # The same cap the shipped poll path answers under, because both are one # response through the same server. _MAX_TAIL_RESPONSE_BYTES = 1_000_000 @@ -134,6 +145,21 @@ def _require_topic(topic: str) -> None: if not topic: raise ValueError("topic must not be empty") + if topic.startswith(_ACTIVITY_PREFIX): + raise ValueError( + f"topic {topic!r} is reserved: names under {_ACTIVITY_PREFIX!r} hold the " + "streams of the workflow's activities on the workflow_streams provider" + ) + + +def _activity_topic(activity_id: str, topic: str) -> str: + """The reserved name ``topic`` of ``activity_id``'s streams takes in the log. + + The id is percent-encoded so an id holding ``/`` cannot be read as two + components; the name comes last, so it may hold anything. + """ + escaped = activity_id.replace("%", "%25").replace("/", "%2F") + return f"{_ACTIVITY_PREFIX}{escaped}/{topic}" def _cursor(run_id: str, offset: int) -> Cursor: @@ -207,7 +233,8 @@ def _tail(self, from_offset: int, topic: str) -> dict[str, Any]: size = 0 next_offset = self.stream.next_offset more_ready = False - for offset, item_topic, payload in self.stream.items_from(from_offset): + held = self.stream.items_from(from_offset) + for offset, item_topic, payload in held: if item_topic != topic: continue data = base64.b64encode(payload.SerializeToString()).decode("ascii") @@ -220,6 +247,9 @@ def _tail(self, from_offset: int, topic: str) -> dict[str, Any]: "items": items, "next_offset": next_offset, "more_ready": more_ready, + # Where the retained log starts at or past ``from_offset``: a + # reader whose position is below it has fallen behind truncation. + "base_offset": held[0][0] if held else next_offset, } def _latest(self, topic: str) -> int: @@ -420,11 +450,19 @@ def __init__( topic: str, producer_id: str, attempt: int, + *, + item_topic: str | None = None, ) -> None: - """Bind this producer to ``topic`` on the workflow behind ``handle``.""" + """Bind this producer to ``topic`` on the workflow behind ``handle``. + + ``item_topic`` is the name the log files the records under when it + differs from the name the records carry, as an activity's reserved + topics do. + """ self._handle = handle self._converter = converter self._topic = topic + self._item_topic = topic if item_topic is None else item_topic self._producer_id = producer_id self._attempt = attempt # One-based, because zero on the wire says the producer does not @@ -483,7 +521,7 @@ def _entries( ) sequence += 1 entries.append( - PublishEntry(topic=self._topic, data=_entry_data(_wrap(wire))) + PublishEntry(topic=self._item_topic, data=_entry_data(_wrap(wire))) ) return entries, sequence @@ -559,6 +597,7 @@ def read( """ check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) + wire_topic = self._wire_topic(topic) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. named = None if after == END else _position(after) @@ -566,7 +605,12 @@ def read( raise StreamCursorError( f"cursor {after.token!r} names another run than this handle is pinned to" ) - return self._read(topic, named, after, last, result_type) + return self._read(wire_topic, named, after, last, result_type) + + def _wire_topic(self, topic: str) -> str: + """The name the log files ``topic`` under: the topic itself for a workflow's.""" + _require_topic(topic) + return topic async def _read( self, @@ -810,6 +854,13 @@ async def _tail( raise # The History is gone; nothing is left to serve. return [], from_offset, False + if from_offset and wire.get("base_offset", from_offset) > from_offset: + # Restarting from the base would hand the caller records it + # already handled, and only the caller can decide to do that. + raise StreamCursorError( + f"offset {from_offset} of workflow {self._workflow_id!r} run " + f"{handle.run_id!r} is no longer retained" + ) items = [ (item["offset"], Payload.FromString(base64.b64decode(item["data"]))) for item in wire["items"] @@ -860,12 +911,13 @@ async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor topic's record. """ topic, _ = resolve_topic(topic) + wire_topic = self._wire_topic(topic) handle = self._handle(self._run_id) description = await self._describe(handle) if description is None: raise StreamNotFoundError(f"workflow {self._workflow_id!r} was not found") try: - head = await handle.query(_LATEST_QUERY, topic, result_type=int) + head = await handle.query(_LATEST_QUERY, wire_topic, result_type=int) except WorkflowQueryFailedError as error: if QUERY_HANDLER_NOT_FOUND not in str(error): raise StreamError( @@ -901,10 +953,108 @@ def producer( ) -> WorkflowStreamsProducer[Any]: """A producer on ``topic``; inside an activity its identity is the activity's.""" topic, _ = resolve_topic(topic) + wire_topic = self._wire_topic(topic) producer_id, attempt = producer_identity(producer_id, attempt) return WorkflowStreamsProducer( - self._handle(self._run_id), self._converter, topic, producer_id, attempt + self._handle(self._run_id), + self._converter, + topic, + producer_id, + attempt, + item_topic=wire_topic, + ) + + +class WorkflowStreamsActivityHandle(WorkflowStreamsHandle): + """The streams one activity of a workflow owns, kept in that workflow's log. + + Each topic is the reserved topic ``activity//`` of the + workflow's log, so an activity's ``tokens`` and its workflow's ``tokens`` + are two streams. The activity belongs to one run, so the handle pins the + run on first use and never follows a successor. A read ends when the + workflow closes, or once the activity has been seen pending, is pending + no longer and the read delivered a record: a stream the activity never + wrote has nothing to close, so a read on it waits for the workflow. + + A read here polls the tail Query and describes the workflow between + polls, every ``poll_cooldown``, rather than parking on the poll Update: + an Update parked in the workflow returns only when the log grows, so it + could not notice the activity ending, and each abandoned one would stay + parked against the run's Update caps. + """ + + def __init__( + self, + client: Client, + workflow_id: str, + run_id: str | None, + activity_id: str, + poll_cooldown: timedelta, + ) -> None: + """Address ``activity_id``'s streams inside ``workflow_id``'s log.""" + super().__init__(client, workflow_id, run_id, poll_cooldown) + self._activity_id = activity_id + + def _wire_topic(self, topic: str) -> str: + return _activity_topic(self._activity_id, topic) + + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + after: Cursor, + last: int | None, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + if named is not None: + run_id, offset = named[0], named[1] + 1 + elif last is not None or after == END: + run_id, offset = await self._start_on_current_run(topic, last or 0) + after = _cursor(run_id, offset - 1) + else: + run_id, offset = await self._current_run(), 0 + handle = self._handle(run_id) + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning ) + cooldown = self._poll_cooldown.total_seconds() + seen_pending = False + delivered = False + ended = False + while True: + more = True + while more: + page, offset, more = await self._tail(handle, topic, offset) + for offset_, payload in page: + for record in self._records(decoder, run_id, offset_, payload): + delivered = True + yield record + if ended: + return + description = await self._describe(handle) + if description is None: + raise StreamNotFoundError( + f"workflow {self._workflow_id!r} run {run_id!r} was not found" + ) + pending = any( + info.activity_id == self._activity_id + for info in description.raw_description.pending_activities + ) + seen_pending = seen_pending or pending + # One more pass after learning the stream ended, so a record that + # landed between the tail and the describe is not lost. + ended = description.status != WorkflowExecutionStatus.RUNNING or ( + seen_pending and not pending and delivered + ) + if not ended: + await asyncio.sleep(cooldown) + + async def _current_run(self) -> str: + description = await self._describe(self._handle(self._run_id)) + if description is None: + raise StreamNotFoundError(f"workflow {self._workflow_id!r} was not found") + assert description.run_id is not None + return description.run_id class WorkflowStreamsProvider(ProviderPlugin): @@ -938,20 +1088,26 @@ def get_activity_stream_handle( *, workflow_id: str | None = None, run_id: str | None = None, - ) -> NoReturn: - """Refused: this provider cannot hold a stream an activity owns. + ) -> WorkflowStreamsActivityHandle: + """A handle on the streams an activity of ``workflow_id`` owns. - The log lives inside a running workflow and is served by its handlers, - and a standalone activity has no workflow to host one. An activity - writes to its workflow's topics instead, through - ``activity.stream_handle()`` without a scope. + They live in the workflow's log under the reserved topics + ``activity//``, and ``run_id`` pins the workflow's + run. Without ``workflow_id`` the activity is a standalone one, which + has no workflow to host a log, so this provider refuses it; such an + activity addresses a workflow's stream by ``workflow_id`` instead. Raises: - StreamUnsupportedError: Always. + StreamUnsupportedError: ``workflow_id`` was not given. """ - raise StreamUnsupportedError( - "the workflow streams provider cannot hold a stream an activity owns: its " - "log lives inside a running workflow" + if workflow_id is None: + raise StreamUnsupportedError( + "the workflow_streams provider cannot hold a stream a standalone " + "activity owns: its log lives inside a running workflow, and no " + "workflow hosts this activity's" + ) + return WorkflowStreamsActivityHandle( + client, workflow_id, run_id, activity_id, self._poll_cooldown ) async def close(self) -> None: diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index b8a152f20..45e09bfd5 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -15,3 +15,8 @@ def pytest_configure(config: pytest.Config) -> None: "markers", "truncates: the case needs a way to drop a topic's oldest records", ) + config.addinivalue_line( + "markers", + "standalone_activities: the case needs the streams of an activity outside " + "any workflow", + ) diff --git a/tests/streams/test_activity_streams.py b/tests/streams/test_activity_streams.py index 8aa4a653a..af77646aa 100644 --- a/tests/streams/test_activity_streams.py +++ b/tests/streams/test_activity_streams.py @@ -7,10 +7,13 @@ activity execution, so a retry writes to the same stream and a reader sees the attempt change as ``SUPERSEDED``. -The memory provider always runs. A storage provider adds itself to -``SETUPS`` behind its own ``STREAMS_LIVE`` gate: its setup receives the -environment's client and hands back the provider and a client with it -registered, which the workers and the reads in these cases share. +The memory provider always runs, and so does Workflow Streams, whose store is +the workflow's own History. A storage provider adds itself to ``SETUPS`` +behind its own ``STREAMS_LIVE`` gate: its setup receives the environment's +client and hands back the provider and a client with it registered, which the +workers and the reads in these cases share, and says whether it holds the +streams of a standalone activity, so the cases marked +``standalone_activities`` are skipped with a reason where it does not. """ from __future__ import annotations @@ -34,6 +37,7 @@ topic, ) from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.workflow_streams import WorkflowStreamsProvider from temporalio.testing import WorkflowEnvironment from tests.helpers import new_worker @@ -47,6 +51,8 @@ class ActivitySetup: name: str provider: StreamProvider client: Client + standalone_activities: bool = True + """The provider holds the streams of an activity outside any workflow.""" async def _memory_setup(client: Client) -> AsyncIterator[ActivitySetup]: @@ -57,8 +63,20 @@ async def _memory_setup(client: Client) -> AsyncIterator[ActivitySetup]: provider.reset() +async def _workflow_streams_setup(client: Client) -> AsyncIterator[ActivitySetup]: + provider = WorkflowStreamsProvider(poll_cooldown=timedelta(milliseconds=20)) + config = client.config() + config["plugins"] = [provider] + # An activity's streams live in its workflow's log, so a standalone + # activity has nowhere to put them. See the provider's module docstring. + yield ActivitySetup( + "workflow_streams", provider, Client(**config), standalone_activities=False + ) + + SETUPS: dict[str, Callable[[Client], AsyncIterator[ActivitySetup]]] = { - "memory": _memory_setup + "memory": _memory_setup, + "workflow_streams": _workflow_streams_setup, } @@ -69,6 +87,13 @@ async def setup( if env.supports_time_skipping: pytest.skip("the time-skipping test server has no standalone activities") async for found in SETUPS[request.param](client): + if ( + request.node.get_closest_marker("standalone_activities") + and not found.standalone_activities + ): + pytest.skip( + f"the {found.name} provider does not hold a standalone activity's streams" + ) yield found @@ -167,6 +192,7 @@ async def test_scope_activity_gives_a_workflow_activity_its_own_streams( assert await workflow_stream.latest(topic=TOKENS) == BEGINNING +@pytest.mark.standalone_activities async def test_standalone_activity_defaults_to_its_own_stream(setup: ActivitySetup): client = setup.client activity_id = f"streams-saa-{uuid.uuid4().hex}" @@ -199,6 +225,7 @@ async def fail_once_after_writing() -> None: await producer.finish() +@pytest.mark.standalone_activities async def test_a_retry_inherits_the_stream_and_supersedes(setup: ActivitySetup): client = setup.client activity_id = f"streams-saa-retry-{uuid.uuid4().hex}" diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 6415f07ad..ed5eb106a 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -19,7 +19,7 @@ import pytest -from temporalio import workflow +from temporalio import activity, workflow from temporalio.api.common.v1 import Payload from temporalio.client import ( Client, @@ -41,6 +41,7 @@ ) from temporalio.streams._wire import WireRecord from temporalio.streams.providers.workflow_streams import ( + WorkflowStreamsActivityHandle, WorkflowStreamsHandle, WorkflowStreamsProducer, WorkflowStreamsProvider, @@ -847,13 +848,101 @@ async def test_a_workflow_reader_starts_at_end_or_the_newest_records( assert await asyncio.wait_for(result, 30) == expected -async def test_a_stream_an_activity_owns_is_refused( +async def test_a_standalone_activity_stream_is_refused( client: Client, provider: WorkflowStreamsProvider ): - # The log lives inside a running workflow, so an activity has no place to - # put a stream of its own here. The refusal is the documented error, not - # an AttributeError or a stream silently put somewhere else. - with pytest.raises(StreamUnsupportedError, match="activity"): + # The log lives inside a running workflow, so an activity outside any + # workflow has no place to put a stream of its own here. The refusal is + # the documented error, not an AttributeError or a stream silently put + # somewhere else. An activity a workflow scheduled is served. + with pytest.raises(StreamUnsupportedError, match="standalone"): provider.get_activity_stream_handle(client, "act") - with pytest.raises(StreamUnsupportedError, match="activity"): - provider.get_activity_stream_handle(client, "act", workflow_id="wf") + assert isinstance( + provider.get_activity_stream_handle(client, "act", workflow_id="wf"), + WorkflowStreamsActivityHandle, + ) + + +TOKENS = "tokens" + + +@activity.defn +async def stream_then_finish(count: int) -> None: + producer = activity.stream_handle(scope="activity").producer(topic=TOKENS) + for n in range(count): + await producer.append({"n": n}) + # Long enough for a reader polling every few milliseconds to see this + # activity pending before it finishes. + await asyncio.sleep(1) + await producer.finish() + + +@workflow.defn +class RunsAnActivityThenLingers: + """Runs the streaming activity by a fixed id, then waits to be released.""" + + def __init__(self) -> None: + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self, count: int) -> None: + await workflow.execute_activity( + stream_then_finish, + count, + activity_id="streamer", + start_to_close_timeout=timedelta(seconds=30), + ) + await workflow.wait_condition(lambda: self._released) + + +async def test_an_activity_read_ends_with_the_activity_while_the_workflow_runs( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker( + client, + RunsAnActivityThenLingers, + activities=[stream_then_finish], + plugins=[provider], + ) as worker: + handle = await client.start_workflow( + RunsAnActivityThenLingers.run, + 2, + id=workflow_id, + task_queue=worker.task_queue, + ) + own = provider.get_activity_stream_handle( + client, "streamer", workflow_id=workflow_id + ) + + async def read_everything() -> list[Any]: + return [r async for r in own.read(topic=TOKENS, result_type=dict)] + + records = await asyncio.wait_for(read_everything(), 30) + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"n": 0}), + (RecordKind.DATA, {"n": 1}), + (RecordKind.FINISH, None), + ] + # The producer is the activity, and the record carries the plain + # topic name; the reserved name is the log's business. + assert all(r.producer_id == "streamer" and r.attempt == 1 for r in records) + assert all(r.topic == TOKENS for r in records) + # The activity's end ended the read: the workflow is still running. + assert (await handle.describe()).status == WorkflowExecutionStatus.RUNNING + + # The workflow's topic of the same name is another stream, and the + # reserved name cannot be reached as a workflow topic. + workflow_stream = provider.get_stream_handle(client, workflow_id) + assert await workflow_stream.latest(topic=TOKENS) == BEGINNING + with pytest.raises(ValueError, match="reserved"): + workflow_stream.read(topic="activity/streamer/tokens") + with pytest.raises(ValueError, match="reserved"): + workflow_stream.producer(topic="activity/x", producer_id="p", attempt=1) + + await handle.signal(RunsAnActivityThenLingers.release) + await handle.result() From 93a4e4554e586da79f04b112f2dca945d2c415d8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:21:02 -0700 Subject: [PATCH 683/831] Followed a reset run from the position the read had reached. The base run closes with nothing in its own History about the reset, so a chain-following read asks describe for the run reset into it. That run rebuilt the base run's log up to the reset point by replay, so the items before it sit at the same offsets and the read carries on where it was. --- .../streams/providers/workflow_streams.py | 62 ++++++++-- .../streams/test_workflow_streams_provider.py | 116 +++++++++++++++++- 2 files changed, 168 insertions(+), 10 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 538d9d472..e700ba959 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -35,7 +35,11 @@ cursor names the run as well as the offset. A handle without a run id reads run after run: each log through the poll Update while its run is open and through the tail Query once it has closed, then the successor's - from its first record. + from its first record. A run that was reset is followed too, into the run + describe names, at the position the read had reached: the reset run + rebuilt the base run's log up to the reset point by replay, so the items + before it sit at the same offsets. The reset itself is not reported to + the reader as a record; that is a wire change for a later round. - The workflow-side stream object belongs to the workflow instance, found through the handler the shipped class registers on it. An evicted and rebuilt workflow gets its own, so a task that failed leaks nothing into @@ -594,6 +598,11 @@ def read( holds: the poll Update reads offset zero as the log's base. ``END`` and ``last=`` start on the current run, or the pinned one, at an offset its workflow answers by Query when the read starts. + + The chain is followed across continue-as-new, into the successor's + log from its first record, and across a reset, into the run describe + names at the position the read had reached. A handle pinned to a run + ends with that run either way. """ check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) @@ -662,15 +671,44 @@ async def _read( yield record if not more: break - if ( - self._run_id is not None - or status != WorkflowExecutionStatus.CONTINUED_AS_NEW - ): + if self._run_id is not None: return - successor = await self._successor(handle) - if successor is None: + following = await self._following(handle, status, tail_offset) + if following is None: return - run_id, offset = successor, 0 + run_id, offset = following + + async def _following( + self, + handle: WorkflowHandle[Any, Any], + status: WorkflowExecutionStatus, + position: int, + ) -> tuple[str, int] | None: + """The run that carries on after ``handle``'s, and where to read it from. + + A continue-as-new names its successor in the close event, and the + successor's log starts over at zero. A reset does not: the base run is + closed with no word of it in its own History, and only describe names + the run reset from it. That run rebuilt its log by replaying the base + run's History up to the reset point, so the items before that point + sit at the same offsets in both logs, and the read carries on at the + position it reached. Past the reset point the two logs differ, and a + reader already there is not told: reporting the reset to consumers as + a record is a wire change for a later round. + """ + if status == WorkflowExecutionStatus.CONTINUED_AS_NEW: + successor = await self._successor(handle) + return None if successor is None else (successor, 0) + reset_run = await self._reset_run(handle) + return None if reset_run is None else (reset_run, position) + + async def _reset_run(self, handle: WorkflowHandle[Any, Any]) -> str | None: + """The run ``handle``'s run was reset into, which only describe reports.""" + description = await self._describe(handle) + if description is None: + return None + extended = description.raw_description.workflow_extended_info + return extended.reset_run_id or None async def _poll( self, handle: WorkflowHandle[Any, Any], topic: str, offset: int @@ -804,7 +842,13 @@ async def _predecessor(self, run_id: str) -> str | None: try: async for event in self._handle(run_id).fetch_history_events(page_size=1): attributes = event.workflow_execution_started_event_attributes - return attributes.continued_execution_run_id or None + if attributes.continued_execution_run_id: + return attributes.continued_execution_run_id + # A reset run's start event is the base run's, copied, and the + # original run id it carries is kept across resets, so it names + # the run the chain of resets began from. + original = attributes.original_execution_run_id + return original if original and original != run_id else None except RPCError as error: if error.status != RPCStatusCode.NOT_FOUND: raise diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index ed5eb106a..f37fccd8a 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -20,7 +20,8 @@ import pytest from temporalio import activity, workflow -from temporalio.api.common.v1 import Payload +from temporalio.api.common.v1 import Payload, WorkflowExecution +from temporalio.api.workflowservice.v1 import ResetWorkflowExecutionRequest from temporalio.client import ( Client, WorkflowExecutionStatus, @@ -554,6 +555,119 @@ async def test_a_poll_that_arrives_before_the_first_task_is_retried( assert seen == [(RecordKind.DATA, {"run": 0, "n": 1}), (RecordKind.FINISH, None)] +async def _reset_at_last_completed_task( + client: Client, workflow_id: str, run_id: str +) -> str: + """Reset ``run_id`` at its last completed task; the id of the run reset into.""" + completion_id = 0 + events = client.get_workflow_handle( + workflow_id, run_id=run_id + ).fetch_history_events() + async for event in events: + if event.HasField("workflow_task_completed_event_attributes"): + completion_id = event.event_id + assert completion_id + answer = await client.workflow_service.reset_workflow_execution( + ResetWorkflowExecutionRequest( + namespace=client.namespace, + workflow_execution=WorkflowExecution( + workflow_id=workflow_id, run_id=run_id + ), + reason="re-run from the last completed task", + workflow_task_finish_event_id=completion_id, + request_id=uuid.uuid4().hex, + ) + ) + return answer.run_id + + +async def _collect_records(records: Any, into: list[Any]) -> None: + async for record in records: + into.append(record) + + +def _run_and_offset(record: Any) -> tuple[str, int]: + _, run_id, offset = record.cursor.token.split(":") + return run_id, int(offset) + + +async def test_a_live_read_without_a_run_id_follows_a_reset( + client: Client, provider: WorkflowStreamsProvider +): + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, Rolling, plugins=[provider]) as worker: + handle = await client.start_workflow( + Rolling.run, 0, id=workflow_id, task_queue=worker.task_queue + ) + base_run = handle.result_run_id + assert base_run is not None + seen: list[Any] = [] + reader = asyncio.create_task( + _collect_records( + provider.get_stream_handle(client, workflow_id).read( + topic=DECISIONS, result_type=dict + ), + seen, + ) + ) + await handle.signal(Rolling.emit, 1) + await handle.signal(Rolling.emit, 2) + await assert_eventually_len(seen, 2, reader) + + # The base run is closed by the reset with nothing in its own History + # to say so; the reader learns where it went from describe. The reset + # run replays the base run's History up to the last completed task, + # so its log holds the same two records at the same offsets, and the + # read carries on from the position it had reached. + reset_run = await _reset_at_last_completed_task(client, workflow_id, base_run) + assert reset_run != base_run + current = client.get_workflow_handle(workflow_id) + assert (await current.describe()).run_id == reset_run + await current.signal(Rolling.emit, 3) + await current.signal(Rolling.emit, 4) + await assert_eventually_len(seen, 4, reader) + await current.signal(Rolling.release) + await asyncio.wait_for(reader, 30) + await current.result() + + assert [(r.kind, r.value) for r in seen] == [ + (RecordKind.DATA, {"run": 0, "n": 1}), + (RecordKind.DATA, {"run": 0, "n": 2}), + (RecordKind.DATA, {"run": 0, "n": 3}), + (RecordKind.DATA, {"run": 0, "n": 4}), + (RecordKind.FINISH, None), + ] + # Two records from the base run, then the reset run's, whose offsets + # continue where the base run's log stood at the reset point. + assert [_run_and_offset(r) for r in seen] == [ + (base_run, 0), + (base_run, 1), + (reset_run, 2), + (reset_run, 3), + (reset_run, 4), + ] + # A handle pinned to the base run ends with it. Both closed runs are + # served by the tail Query, which needs the worker still up. + pinned = provider.get_stream_handle(client, workflow_id, run_id=base_run) + pinned_records: list[Any] = [] + await asyncio.wait_for( + _collect_records(pinned.read(topic=DECISIONS), pinned_records), 30 + ) + assert [_run_and_offset(r) for r in pinned_records] == [ + (base_run, 0), + (base_run, 1), + ] + # BEGINNING on the chain starts at the base run, whose start event the + # reset run copied, and a resume from a base run cursor crosses over. + chain = provider.get_stream_handle(client, workflow_id) + resumed = await take(chain.read(topic=DECISIONS, after=seen[1].cursor), 3) + assert [_run_and_offset(r) for r in resumed] == [ + (reset_run, 2), + (reset_run, 3), + (reset_run, 4), + ] + + async def test_a_running_workflow_without_the_provider_fails_the_read_clearly( client: Client, provider: WorkflowStreamsProvider ): From 50b278bbb2739e975f1e48c872155363dfb17f13 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:22:54 -0700 Subject: [PATCH 684/831] Ran stream bodies through the data converter with a plaintext hash. A provider owes a record body the codec and external storage the SDK gives every payload. The shared helper takes the retry fingerprint before either runs and stamps the plaintext hash on the record, so a nondeterministic codec cannot turn a retry into a divergent write and the store can compare retries without the plaintext. --- temporalio/streams/__init__.py | 22 +++- temporalio/streams/_body.py | 116 +++++++++++++++++++ temporalio/streams/_provider.py | 24 +++- temporalio/streams/providers/memory.py | 60 ++++++---- tests/streams/test_memory_provider.py | 14 ++- tests/streams/test_streams_conformance.py | 135 +++++++++++++++++++++- tests/streams/test_streams_internals.py | 131 ++++++++++++++++++++- 7 files changed, 472 insertions(+), 30 deletions(-) create mode 100644 temporalio/streams/_body.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 40edf1324..ab6fa9c17 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -62,11 +62,26 @@ The record on the wire is ``temporal.api.stream.v1.StreamRecord`` on every provider, with the user's value in ``body`` as an ordinary payload, so a -reader in any language decodes the same bytes and a payload codec applies. +reader in any language decodes the same bytes and a payload codec applies. A +provider owes that body what the SDK gives every payload it sends: it encodes +it through the client's data converter, so the codec and the +:class:`temporalio.converter.ExternalStorage` drivers apply, it takes the +retry fingerprint over the converted bytes before either runs and leaves the +plaintext hash on the record under :data:`CONTENT_HASH_KEY`, and it offloads a +workflow's own publish off the workflow thread. :func:`encode_body`, +:func:`decode_body` and :func:`content_fingerprint` are the shared code for +that; :class:`StreamProvider` states the rule. """ from __future__ import annotations +from temporalio.streams._body import ( + CONTENT_HASH_KEY, + content_fingerprint, + content_hash, + decode_body, + encode_body, +) from temporalio.streams._errors import ( StreamCursorError, StreamError, @@ -99,6 +114,7 @@ __all__ = [ "BEGINNING", + "CONTENT_HASH_KEY", "DEFAULT_TOPIC", "END", "Cursor", @@ -117,6 +133,10 @@ "Supersession", "WorkflowStreamProvider", "WriteSink", + "content_fingerprint", + "content_hash", + "decode_body", + "encode_body", "resolve_topic", "topic", ] diff --git a/temporalio/streams/_body.py b/temporalio/streams/_body.py new file mode 100644 index 000000000..2f10b6d4a --- /dev/null +++ b/temporalio/streams/_body.py @@ -0,0 +1,116 @@ +"""What a provider owes a record's body between the converter and its store. + +:func:`temporalio.streams._wire.to_wire` converts a value into the body with +the payload converter and stops there. Every other payload the SDK sends then +passes through the payload codec and external storage, and a stream body owes +the same, or a codec-protected deployment would leak plaintext through its +streams and a claim-check deployment would push oversized bodies at its store. +A provider runs the body through :func:`encode_body` before it stores or ships +a record and through :func:`decode_body` after it reads one back, off the +workflow thread in both directions. + +The order inside :func:`encode_body` is the point. The plaintext hash is taken +first and stamped on the record, and :func:`content_fingerprint` is taken over +the converted records too, before the codec runs, because a codec that +encrypts with a fresh nonce makes every retry's bytes differ, and a store that +fingerprinted those bytes would refuse the retry as a divergent write. The +store keeps the plaintext hash under :data:`CONTENT_HASH_KEY` and can compare +retries by it without ever seeing the plaintext. +""" + +from __future__ import annotations + +import hashlib +from collections.abc import Sequence + +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord as WireRecord +from temporalio.converter import DataConverter + +__all__ = [ + "CONTENT_HASH_KEY", + "content_fingerprint", + "content_hash", + "decode_body", + "encode_body", +] + +CONTENT_HASH_KEY = "temporal.io/content-hash" +"""The record metadata key the plaintext hash of the body is stored under. + +Its value is a payload with ``encoding`` ``binary/plain`` whose data is the +hex digest :func:`content_hash` returns. A ``FINISH`` record carries no body +and no hash. +""" + +_HASH_ENCODING = b"binary/plain" + + +def content_hash(payload: Payload) -> str: + """The hex SHA-256 of ``payload`` as the converter produced it. + + Taken over the deterministic serialization of the whole payload, metadata + included, so two payloads that differ only in their encoding hash apart. + """ + return hashlib.sha256(payload.SerializeToString(deterministic=True)).hexdigest() + + +def content_fingerprint(records: Sequence[WireRecord]) -> bytes: + """The identity of one append, taken over its converted records. + + Length-delimited, so a batch split differently cannot collide with this + one. Take it before :func:`encode_body`, while the bodies are still what + the converter produced; that is what makes a retry through a + nondeterministic codec match its original. + """ + digest = hashlib.sha256() + for record in records: + body = record.SerializeToString(deterministic=True) + digest.update(len(body).to_bytes(8, "big")) + digest.update(body) + return digest.digest() + + +async def encode_body(converter: DataConverter, record: WireRecord) -> WireRecord: + """Stamp the plaintext hash on ``record`` and encode its body for the store. + + In place, and returned for convenience. The hash goes under + :data:`CONTENT_HASH_KEY` first; then the body passes through + ``converter``'s payload codec and external storage in the order + :meth:`temporalio.converter.DataConverter.encode` uses, so a body above + the external storage threshold is replaced by a claim and the claim is + what the store holds. A record without a body is returned untouched. + """ + if not record.HasField("body"): + return record + record.metadata[CONTENT_HASH_KEY].CopyFrom( + Payload( + metadata={"encoding": _HASH_ENCODING}, + data=content_hash(record.body).encode(), + ) + ) + encoded = await converter._encode_payload_sequence([record.body]) + stored = await converter._external_store_payload_sequence(encoded) + record.body.CopyFrom(stored[0]) + return record + + +async def decode_body(converter: DataConverter, record: WireRecord) -> WireRecord: + """Undo :func:`encode_body` on a record read back from the store. + + In place, and returned for convenience. The body is retrieved from + external storage when it is a claim and then run through the payload + codec, in the order :meth:`temporalio.converter.DataConverter.decode` + uses, leaving the payload the converter can turn back into a value. The + hash stays on the record. + + Raises: + RuntimeError: The body is a claim and ``converter`` has no external + storage to redeem it with. + """ + if not record.HasField("body"): + return record + retrieved = await converter._external_retrieve_payload_sequence([record.body]) + decoded = await converter._decode_payload_sequence(retrieved) + record.body.CopyFrom(decoded[0]) + return record diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index e1df049aa..24a26e64a 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -11,7 +11,10 @@ A provider only moves ``temporal.api.stream.v1.StreamRecord`` protos. The handles around it convert values, synthesize supersession and mint cursors, and turn a :class:`temporalio.streams.StreamTopic` into the plain name the -provider sees, through :func:`temporalio.streams.resolve_topic`. +provider sees, through :func:`temporalio.streams.resolve_topic`. What it owes +a record's body on the way to and from its store, :class:`StreamProvider` +lists and :func:`temporalio.streams.encode_body` and +:func:`temporalio.streams.decode_body` do. """ from __future__ import annotations @@ -306,6 +309,25 @@ class StreamProvider(Protocol): ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` for a worker alone, and open handles from it anywhere else. Nothing is global: two workers in one process may hold two providers. + + **What a provider owes a record's body.** The handles convert a value + into the body with the payload converter and no more; what the SDK does + to every other payload it sends, the codec and external storage, the + provider owes the body too, through the client's data converter, so the + :class:`temporalio.converter.ExternalStorage` drivers an application + configured apply to stream bodies as well. It does that in one order. + First it takes the retry fingerprint, the identity a repeated append is + matched by, over the converted bytes, before the codec and before any + offload, so a codec that encrypts with a fresh nonce cannot turn a retry + into a divergent write; the plaintext hash also rides the record under + :data:`temporalio.streams.CONTENT_HASH_KEY`, where the store can read it. + Then it encodes the body and offloads it, and on a read it does the + reverse before the record reaches a reader. A workflow's own publish is + converted on the workflow thread and no further: the codec and the offload + run when the provider commits the task's batch, off that thread. + :func:`temporalio.streams.encode_body`, + :func:`temporalio.streams.decode_body` and + :func:`temporalio.streams.content_fingerprint` are that rule in code. """ def workflow_provider(self) -> WorkflowStreamProvider: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 067697887..28a506709 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -17,6 +17,11 @@ without a client reads until the caller closes it. - It keeps every record until :meth:`MemoryStreams.truncate` drops the oldest ones, which stands in for a store's retention in tests. +- The outside path encodes and decodes bodies through the client's data + converter, codec and external storage included, and fingerprints a retry + over the converted bytes first. The workflow half has no client, so a + workflow's own publish is stored as the payload converter produced it and + a workflow-side read hands records over as stored. The outside surface (producer identity, retry deduplication, positions, supersession, cursors) is faithful, which is what the conformance tests lean @@ -27,7 +32,6 @@ from __future__ import annotations import asyncio -import hashlib import logging from collections.abc import AsyncGenerator from datetime import timedelta @@ -39,7 +43,12 @@ from temporalio import workflow from temporalio.client import Client, WorkflowExecutionStatus from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams._errors import StreamCursorError, StreamProducerError +from temporalio.streams._body import content_fingerprint, decode_body, encode_body +from temporalio.streams._errors import ( + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, +) from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import ( @@ -75,15 +84,6 @@ def _wake(future: asyncio.Future[None]) -> None: future.set_result(None) -def _fingerprint(bodies: list[bytes]) -> bytes: - """A digest of one append's content, length-delimited so a split cannot collide.""" - digest = hashlib.sha256() - for body in bodies: - digest.update(len(body).to_bytes(8, "big")) - digest.update(body) - return digest.digest() - - class _Topic: """One topic's records, and the waiters parked on its tail.""" @@ -110,21 +110,24 @@ def append( *, writer: str | None = None, sequence: int = 0, + content: bytes | None = None, ) -> tuple[int, int]: """Store ``wires`` and return where they landed as ``(first offset, count)``. With a ``writer``, a repeat of ``(writer, sequence)`` carrying the same content stores nothing and returns where the original landed. + ``content`` is the fingerprint the repeat is matched by; a producer + takes it over the records before their bodies are encoded, and + without one it is taken over ``wires`` as they are. Raises: StreamProducerError: ``(writer, sequence)`` is held with different content. """ key = (writer or "", sequence) - # Deterministic so the digest of one append does not depend on how - # protobuf happened to order a payload's metadata map. bodies = [wire.SerializeToString(deterministic=True) for wire in wires] - content = _fingerprint(bodies) + if content is None: + content = content_fingerprint(wires) if writer is not None: held = self.seen.get(key) if held is not None: @@ -262,7 +265,7 @@ class MemoryProducer(Generic[T]): def __init__( self, store: _Topic, - converter: temporalio.converter.PayloadConverter, + converter: temporalio.converter.DataConverter, topic: str, producer_id: str, attempt: int, @@ -307,10 +310,10 @@ async def append(self, *values: T) -> Cursor: """ if not values: return self._last - return self._write( + return await self._write( [ to_wire( - self._converter, + self._converter.payload_converter, topic=self._topic, kind=RecordKind.DATA, value=value, @@ -324,10 +327,10 @@ async def append(self, *values: T) -> Cursor: async def finish(self) -> None: """Write ``FINISH`` for this producer on this topic.""" - self._write( + await self._write( [ to_wire( - self._converter, + self._converter.payload_converter, topic=self._topic, kind=RecordKind.FINISH, producer_id=self._producer_id, @@ -337,9 +340,14 @@ async def finish(self) -> None: ] ) - def _write(self, wires: list[WireRecord]) -> Cursor: + async def _write(self, wires: list[WireRecord]) -> Cursor: + # The fingerprint comes first, over the converted records, so a codec + # that encrypts with a fresh nonce cannot make a retry look divergent. + content = content_fingerprint(wires) + for wire in wires: + await encode_body(self._converter, wire) first, count = self._store.append( - wires, writer=self._writer, sequence=self._sequence + wires, writer=self._writer, sequence=self._sequence, content=content ) self._sequence += len(wires) self._last = mint_cursor(_PROVIDER, str(first + count - 1)) @@ -362,9 +370,9 @@ def __init__( self._workflow_id = workflow_id self._run_id = run_id self._converter = ( - client.data_converter.payload_converter + client.data_converter if client is not None - else temporalio.converter.DataConverter.default.payload_converter + else temporalio.converter.DataConverter.default ) def read( @@ -399,7 +407,10 @@ async def _read( result_type: type | None, ) -> AsyncGenerator[StreamRecord[Any], None]: decoder = RecordDecoder( - self._converter, result_type, after=after, warn=logger.warning + self._converter.payload_converter, + result_type, + after=after, + warn=logger.warning, ) closed = False while True: @@ -414,6 +425,7 @@ async def _read( offset += 1 if wire is None: continue + await decode_body(self._converter, wire) for record in decoder.decode(cursor, wire): yield record if closed: diff --git a/tests/streams/test_memory_provider.py b/tests/streams/test_memory_provider.py index 4c08b3ea0..3fd83a9fb 100644 --- a/tests/streams/test_memory_provider.py +++ b/tests/streams/test_memory_provider.py @@ -12,7 +12,8 @@ import pytest -from temporalio.streams import StreamProducerError, topic +from temporalio.api.stream.v1 import StreamRecord +from temporalio.streams import CONTENT_HASH_KEY, StreamProducerError, topic from temporalio.streams.providers.memory import MemoryStreams OUT = topic("out", dict) @@ -55,3 +56,14 @@ async def test_a_divergent_retry_leaves_the_store_alone(): ): await retry.append({"n": 2}) assert len(store.records) == 1 + + +async def test_a_stored_record_carries_the_plaintext_hash(): + provider = MemoryStreams() + stream = provider.get_stream_handle(None, "wf-hash") # type: ignore[arg-type] + await stream.producer(topic=OUT, producer_id="model", attempt=1).append({"n": 1}) + stored = StreamRecord.FromString(provider._topic("wf-hash", OUT.name).records[0]) + # What the store holds is the record after encode_body: the hash the + # server-side dedupe reads is on it, under the shared key. + assert stored.metadata[CONTENT_HASH_KEY].data.decode().isalnum() + assert len(stored.metadata[CONTENT_HASH_KEY].data) == 64 diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 2d9e103ad..77fa7d3cb 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,8 +21,10 @@ from __future__ import annotations import asyncio +import dataclasses +import os import uuid -from collections.abc import AsyncIterator, Awaitable, Callable +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass from typing import Any @@ -31,6 +33,15 @@ from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.common import RawValue +from temporalio.converter import ( + DataConverter, + ExternalStorage, + PayloadCodec, + StorageDriver, + StorageDriverClaim, + StorageDriverRetrieveContext, + StorageDriverStoreContext, +) from temporalio.streams import ( BEGINNING, DEFAULT_TOPIC, @@ -70,8 +81,16 @@ class ProviderCase: for retention, or ``None`` when the provider offers no way to.""" async def open( - self, workflow_id: str, *, run_id: str | None = None + self, + workflow_id: str, + *, + run_id: str | None = None, + client: Client | None = None, ) -> StreamHandle: + if client is not None: + # The explicit form, for a case that needs the handle to encode + # bodies through this client's data converter. + return self.provider.get_stream_handle(client, workflow_id, run_id=run_id) # Only the memory provider gets here, and it takes no client. return self.provider.get_stream_handle( None, # type: ignore[arg-type] @@ -80,6 +99,65 @@ async def open( ) +class RecordingDriver(StorageDriver): + """An in-memory external storage driver that counts what it was asked to hold.""" + + def __init__(self) -> None: + self.held: dict[str, bytes] = {} + self.stored = 0 + self.retrieved = 0 + + def name(self) -> str: + return "recording" + + async def store( + self, context: StorageDriverStoreContext, payloads: Sequence[Payload] + ) -> list[StorageDriverClaim]: + claims: list[StorageDriverClaim] = [] + for payload in payloads: + key = f"payload-{len(self.held)}" + self.held[key] = payload.SerializeToString() + self.stored += 1 + claims.append(StorageDriverClaim(claim_data={"key": key})) + return claims + + async def retrieve( + self, + context: StorageDriverRetrieveContext, + claims: Sequence[StorageDriverClaim], + ) -> list[Payload]: + self.retrieved += len(claims) + return [Payload.FromString(self.held[c.claim_data["key"]]) for c in claims] + + +class NonceCodec(PayloadCodec): + """A codec whose output differs on every call, as one that encrypts with a fresh nonce does.""" + + def __init__(self) -> None: + self.encoded = 0 + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + self.encoded += len(payloads) + return [ + Payload( + metadata={"encoding": b"binary/nonce"}, + data=os.urandom(16) + p.SerializeToString(), + ) + for p in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [Payload.FromString(p.data[16:]) for p in payloads] + + +def _client_with(client: Client, converter: DataConverter) -> Client: + # The same connection, carrying the converter the case wants bodies to + # pass through. + config = client.config() + config["data_converter"] = converter + return Client(**config) + + async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider = MemoryStreams() @@ -489,3 +567,56 @@ async def test_a_read_start_names_one_place(case: ProviderCase): stream.read(topic=OUT, after=appended, last=1) with pytest.raises(ValueError, match="either after= or last="): stream.read(topic=OUT, after=END, last=1) + + +async def test_a_body_above_the_threshold_is_offloaded_and_read_back( + case: ProviderCase, client: Client +): + driver = RecordingDriver() + converter = dataclasses.replace( + DataConverter.default, + external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=256), + ) + workflow_id = new_workflow_id() + stream = await case.open(workflow_id, client=_client_with(client, converter)) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + small = {"n": 1} + large = {"blob": "x" * 1024} + await producer.append(small) + await producer.append(large) + # Only the body over the threshold left the record; the small one stayed + # inline, as it would on any other payload the SDK sends. + assert driver.stored == 1 + + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [small, large] + assert driver.retrieved == 1 + + +@pytest.mark.detects_divergent_retries +async def test_a_retry_through_a_nondeterministic_codec_still_deduplicates( + case: ProviderCase, client: Client +): + codec = NonceCodec() + converter = dataclasses.replace(DataConverter.default, payload_codec=codec) + workflow_id = new_workflow_id() + stream = await case.open(workflow_id, client=_client_with(client, converter)) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + landed = await first.append({"id": "r1"}) + assert codec.encoded == 1 + + # The codec produced different bytes for the retry. The provider matched + # it by the plaintext it converted, so it is the same append: stored + # once, answered with the original position. + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + again = await retry.append({"id": "r1"}) + if landed is not None: + assert again == landed + # And a retry that really does differ is still told apart. + divergent = stream.producer(topic=OUT, producer_id="model", attempt=1) + with pytest.raises(StreamProducerError): + await divergent.append({"id": "other"}) + + await first.append({"id": "r2"}) + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] diff --git a/tests/streams/test_streams_internals.py b/tests/streams/test_streams_internals.py index e0a69394d..d986e2084 100644 --- a/tests/streams/test_streams_internals.py +++ b/tests/streams/test_streams_internals.py @@ -9,18 +9,36 @@ from __future__ import annotations +import dataclasses +import os +from collections.abc import Sequence + import pytest +from temporalio.api.common.v1 import Payload from temporalio.client import ClientConfig -from temporalio.converter import DataConverter +from temporalio.converter import ( + DataConverter, + ExternalStorage, + PayloadCodec, + StorageDriver, + StorageDriverClaim, + StorageDriverRetrieveContext, + StorageDriverStoreContext, +) from temporalio.streams import ( BEGINNING, + CONTENT_HASH_KEY, Cursor, RecordKind, StreamCursorError, Supersession, _ids, _wire, + content_fingerprint, + content_hash, + decode_body, + encode_body, ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams @@ -117,3 +135,114 @@ def test_registering_the_same_provider_twice_is_fine(): config = provider.configure_client(ClientConfig(stream_provider=provider)) # type: ignore[typeddict-item] assert config.get("stream_provider") is provider assert provider.configure_client(ClientConfig()).get("stream_provider") is provider # type: ignore[typeddict-item] + + +class _HoldEverything(StorageDriver): + """A driver that keeps every payload it is handed, in memory.""" + + def __init__(self) -> None: + self.held: list[bytes] = [] + + def name(self) -> str: + return "hold" + + async def store( + self, context: StorageDriverStoreContext, payloads: Sequence[Payload] + ) -> list[StorageDriverClaim]: + claims = [] + for payload in payloads: + claims.append(StorageDriverClaim(claim_data={"i": str(len(self.held))})) + self.held.append(payload.SerializeToString()) + return claims + + async def retrieve( + self, + context: StorageDriverRetrieveContext, + claims: Sequence[StorageDriverClaim], + ) -> list[Payload]: + return [Payload.FromString(self.held[int(c.claim_data["i"])]) for c in claims] + + +class _NonceCodec(PayloadCodec): + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [ + Payload( + metadata={"encoding": b"binary/nonce"}, + data=os.urandom(8) + p.SerializeToString(), + ) + for p in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [Payload.FromString(p.data[8:]) for p in payloads] + + +async def test_encode_body_stamps_the_plaintext_hash_and_offloads_the_body(): + driver = _HoldEverything() + converter = dataclasses.replace( + DataConverter.default, + payload_codec=_NonceCodec(), + external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=0), + ) + wire = _wire.to_wire( + converter.payload_converter, topic="t", kind=RecordKind.DATA, value={"n": 1} + ) + plaintext = Payload() + plaintext.CopyFrom(wire.body) + + await encode_body(converter, wire) + # The hash is over what the converter produced, not over what the codec + # or the driver made of it, and it rides the record where the store can + # read it without the plaintext. + stamped = wire.metadata[CONTENT_HASH_KEY] + assert stamped.metadata["encoding"] == b"binary/plain" + assert stamped.data.decode() == content_hash(plaintext) + assert len(stamped.data) == 64 + # With a threshold of zero the body was offloaded: the record holds the + # claim and the driver holds the coded payload. + assert wire.body != plaintext + assert len(wire.body.external_payloads) == 1 + assert len(driver.held) == 1 + + await decode_body(converter, wire) + assert wire.body == plaintext + assert wire.metadata[CONTENT_HASH_KEY] == stamped + + # A record without a body has nothing to hash or offload. + finish = _wire.to_wire( + converter.payload_converter, topic="t", kind=RecordKind.FINISH + ) + await encode_body(converter, finish) + assert CONTENT_HASH_KEY not in finish.metadata + assert len(driver.held) == 1 + + +async def test_content_fingerprint_is_taken_before_the_codec(): + converter = dataclasses.replace(DataConverter.default, payload_codec=_NonceCodec()) + plain = converter.payload_converter + + def batch(*values: dict) -> list[_wire.WireRecord]: + return [ + _wire.to_wire(plain, topic="t", kind=RecordKind.DATA, value=v, sequence=i) + for i, v in enumerate(values, 1) + ] + + first, retry = batch({"n": 1}, {"n": 2}), batch({"n": 1}, {"n": 2}) + before = content_fingerprint(first) + assert before == content_fingerprint(retry) + # Different content, and the same content split differently, both differ. + assert before != content_fingerprint(batch({"n": 1}, {"n": 3})) + assert before != content_fingerprint(batch({"n": 1}) + batch({"n": 2})) + + for record in first + retry: + await encode_body(converter, record) + # The codec made the two batches' bytes differ; the identity taken first + # is what lets a store still recognise the retry. + assert first[0].body != retry[0].body + assert content_fingerprint(first) != content_fingerprint(retry) + # Decoding gives the converted bodies back; the hash stays stamped on the + # record, which is why the identity is taken before encoding, not after. + for record in first: + await decode_body(converter, record) + assert [r.body for r in first] == [r.body for r in batch({"n": 1}, {"n": 2})] + assert all(CONTENT_HASH_KEY in r.metadata for r in first) From ca0515cb33af15f6723905e2270d488c5b0ffc7a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:22:54 -0700 Subject: [PATCH 685/831] Declared standalone streams and a handle close on the provider surface. A stream with an id of its own and no owner is created on purpose with a retention policy and sealed on purpose. The memory provider refuses both calls for now, and a workflow's handle refuses close, since its stream ends with the workflow. --- temporalio/streams/__init__.py | 11 ++++ temporalio/streams/_errors.py | 8 +++ temporalio/streams/_provider.py | 69 +++++++++++++++++++++++ temporalio/streams/providers/memory.py | 40 +++++++++++++ tests/streams/test_streams_conformance.py | 10 ++++ 5 files changed, 138 insertions(+) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index ab6fa9c17..abbd8b8e9 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -54,6 +54,15 @@ protocols a provider implements; nothing here that workflow code imports does I/O. + +A stream can also stand alone, with an id of its own and no owner. +``client.create_stream(stream_id, retention=...)`` creates it with a retention +policy and returns its handle, ``client.get_stream_handle(stream_id=...)`` +reaches an existing one, and the handle's ``close()`` seals it, after which +appends are refused with :class:`StreamClosedError` and the retained records +stay readable. A provider whose store cannot hold an ownerless stream raises +:class:`StreamUnsupportedError` for both. + What the contract does not promise: that a :attr:`RecordKind.FINISH` record means the writing activity succeeded, that a superseded attempt's records can be withdrawn, or that a stream outlives the retention its provider is @@ -83,6 +92,7 @@ encode_body, ) from temporalio.streams._errors import ( + StreamClosedError, StreamCursorError, StreamError, StreamNotFoundError, @@ -120,6 +130,7 @@ "Cursor", "ReadSource", "RecordKind", + "StreamClosedError", "StreamCursorError", "StreamError", "StreamHandle", diff --git a/temporalio/streams/_errors.py b/temporalio/streams/_errors.py index f00bf1c3a..a2f4fecf5 100644 --- a/temporalio/streams/_errors.py +++ b/temporalio/streams/_errors.py @@ -12,6 +12,7 @@ import temporalio.exceptions __all__ = [ + "StreamClosedError", "StreamCursorError", "StreamError", "StreamNotFoundError", @@ -36,5 +37,12 @@ class StreamProducerError(StreamError): """The producer attempt or sequence conflicts with what the store holds.""" +class StreamClosedError(StreamError): + """The standalone stream was sealed, so it takes no more records. + + Its retained records stay readable; only appends are refused. + """ + + class StreamUnsupportedError(StreamError): """This provider does not offer the requested capability.""" diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 24a26e64a..946f37217 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -20,6 +20,7 @@ from __future__ import annotations from collections.abc import AsyncGenerator +from datetime import timedelta from typing import TYPE_CHECKING, Any, Protocol, TypeVar, overload from temporalio.api.stream.v1 import StreamRecord as WireRecord @@ -217,6 +218,22 @@ def producer( ... + async def close(self) -> None: + """Seal the standalone stream this handle is on. + + A sealed stream takes no more records: a later ``append`` raises + :class:`temporalio.streams.StreamClosedError`, while everything it + retains stays readable and a read on it ends once that tail has been + delivered. Idempotent. Only a standalone stream can be closed here, + because an owned stream ends with its owner. + + Raises: + ValueError: This handle is on a workflow's or an activity's + stream. + """ + ... + + class ReadSource(Protocol): """One subscription, as a provider supplies it to the workflow thread.""" @@ -328,6 +345,15 @@ class StreamProvider(Protocol): :func:`temporalio.streams.encode_body`, :func:`temporalio.streams.decode_body` and :func:`temporalio.streams.content_fingerprint` are that rule in code. + + **Standalone streams.** A stream can have an id of its own and no owner. + It is created on purpose, with :meth:`create_standalone_stream` and a + retention policy, and sealed on purpose, with the handle's ``close``. It + is addressed by topic like an owner's streams; how a provider lays its + topics out in the store is its own. A provider whose store cannot hold a + stream without an owner raises + :class:`temporalio.streams.StreamUnsupportedError` from both standalone + calls. """ def workflow_provider(self) -> WorkflowStreamProvider: @@ -344,6 +370,49 @@ def get_stream_handle( """ ... + async def create_standalone_stream( + self, + client: Client, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> StreamHandle: + """Create the standalone stream ``stream_id`` and return a handle on it. + + The three policy arguments bound what the stream retains: records + older than ``retention``, beyond the newest ``max_records``, or past + ``max_bytes`` of stored records are dropped, and ``None`` leaves that + bound to the provider's default. Creating a stream that exists with + the same policy returns a handle on it, so a retried create is + harmless. + + Raises: + ValueError: ``stream_id`` is empty, a bound is not positive, or + the stream exists with a different policy. + StreamUnsupportedError: The provider's store cannot hold a stream + without an owner. + """ + ... + + def get_standalone_stream_handle( + self, client: Client, stream_id: str + ) -> StreamHandle: + """A handle on the standalone stream ``stream_id``, which must exist. + + Nothing here creates the stream: the first ``read``, ``latest`` or + ``producer`` on a stream that does not exist raises + :class:`temporalio.streams.StreamNotFoundError`, unless the provider + can wait for the stream to be created, in which case a ``read`` parks + until the first write and says so in its own documentation. + + Raises: + StreamUnsupportedError: The provider's store cannot hold a stream + without an owner. + """ + ... + async def close(self) -> None: """Release what this provider holds for the process. diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 28a506709..1d03abbb1 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -17,6 +17,8 @@ without a client reads until the caller closes it. - It keeps every record until :meth:`MemoryStreams.truncate` drops the oldest ones, which stands in for a store's retention in tests. +- It does not host standalone streams; both standalone calls raise + :class:`temporalio.streams.StreamUnsupportedError`. - The outside path encodes and decodes bodies through the client's data converter, codec and external storage included, and fingerprints a retry over the converted bytes first. The workflow half has no client, so a @@ -484,6 +486,14 @@ def producer( return MemoryProducer(store, self._converter, name, producer_id, attempt) + async def close(self) -> None: + """Refuse: a workflow's stream ends with the workflow, not by a caller.""" + raise ValueError( + "only a standalone stream can be closed; this handle is on a workflow's " + "stream, which ends when the workflow does" + ) + + class MemoryStreams(ProviderPlugin): """The in-memory provider, one list per topic. @@ -532,6 +542,36 @@ def get_stream_handle( """ return MemoryStreamHandle(self, client, workflow_id, run_id) + async def create_standalone_stream( + self, + client: Client | None, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> MemoryStreamHandle: + """Refuse: this provider keeps no stream without an owner. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the memory provider does not host standalone streams" + ) + + def get_standalone_stream_handle( + self, client: Client | None, stream_id: str + ) -> MemoryStreamHandle: + """Refuse: this provider keeps no stream without an owner. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the memory provider does not host standalone streams" + ) + async def close(self) -> None: """Nothing to release: the provider holds no connection.""" diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 77fa7d3cb..e89947afa 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -569,6 +569,16 @@ async def test_a_read_start_names_one_place(case: ProviderCase): stream.read(topic=OUT, after=END, last=1) + + +async def test_an_owned_stream_cannot_be_closed_by_a_handle(case: ProviderCase): + # A workflow's stream ends with the workflow; close() is for a stream + # that stands alone. + stream = await case.open(new_workflow_id()) + with pytest.raises(ValueError, match="standalone"): + await stream.close() + + async def test_a_body_above_the_threshold_is_offloaded_and_read_back( case: ProviderCase, client: Client ): From 5d600c45a791330a99e3a86236fe546ce0e6ee34 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:22:54 -0700 Subject: [PATCH 686/831] Added StreamRef, a serializable name for one stream. A handle is bound to its client and provider, so a stream crosses a process boundary as its owner and topic in plain data, with no cursor and no provider name. The default converter carries it as JSON, so it can be a workflow argument, an activity result or a Nexus operation input or result. --- temporalio/streams/__init__.py | 9 ++ temporalio/streams/_provider.py | 38 ++++-- temporalio/streams/_ref.py | 142 ++++++++++++++++++++++ temporalio/streams/providers/memory.py | 6 + tests/streams/test_streams_conformance.py | 37 +++++- tests/streams/test_streams_internals.py | 30 +++++ 6 files changed, 248 insertions(+), 14 deletions(-) create mode 100644 temporalio/streams/_ref.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index abbd8b8e9..f5b8076fa 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -54,6 +54,12 @@ protocols a provider implements; nothing here that workflow code imports does I/O. +A handle is bound to its client and provider, so a stream is handed to another +process as a :class:`StreamRef`: the owner and the topic as plain data, with +no cursor and no provider name. :meth:`StreamHandle.ref` makes one, the +default data converter carries it as JSON, and the receiver opens it with +``client.get_stream_handle(ref)`` or ``activity.stream_handle(ref)`` on +whatever provider its client has. A stream can also stand alone, with an id of its own and no owner. ``client.create_stream(stream_id, retention=...)`` creates it with a retention @@ -115,6 +121,7 @@ StreamRecord, Supersession, ) +from temporalio.streams._ref import StreamOwnerKind, StreamRef from temporalio.streams._topic import ( DEFAULT_TOPIC, StreamTopic, @@ -135,10 +142,12 @@ "StreamError", "StreamHandle", "StreamNotFoundError", + "StreamOwnerKind", "StreamProducer", "StreamProducerError", "StreamProvider", "StreamRecord", + "StreamRef", "StreamTopic", "StreamUnsupportedError", "Supersession", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 946f37217..cadb7c106 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -29,6 +29,7 @@ if TYPE_CHECKING: from temporalio.client import Client + from temporalio.streams._ref import StreamRef __all__ = [ "ReadSource", @@ -95,15 +96,23 @@ async def finish(self) -> None: class StreamHandle(Protocol): - """One workflow's stream, addressed by topic, from outside workflow code. - - A handle follows the workflow's execution chain unless it was opened with - a ``run_id``, in which case it is pinned to that run. A topic is a - :class:`temporalio.streams.StreamTopic` definition, which carries the - record type, or a plain string with ``result_type=`` for a name decided - at runtime. A transport failure surfaces as - :class:`temporalio.service.RPCError`, never as the transport's own - exception type. + """One owner's stream, addressed by topic, from outside workflow code. + + The owner is a workflow, an activity, or a standalone stream that has an + id of its own and no owner. A handle on a workflow follows its execution + chain unless it was opened with a ``run_id``, in which case it is pinned + to that run. A topic is a :class:`temporalio.streams.StreamTopic` + definition, which carries the record type, or a plain string with + ``result_type=`` for a name decided at runtime. A transport failure + surfaces as :class:`temporalio.service.RPCError`, never as the + transport's own exception type. + + A handle is bound to its client and provider. To hand a stream to another + process, :meth:`ref` names it as a :class:`temporalio.streams.StreamRef`, + which is plain data; the receiver opens it with + :meth:`temporalio.client.Client.get_stream_handle` or + :func:`temporalio.activity.stream_handle`, and calls that name no topic + on that handle address the ref's topic. """ @overload @@ -217,6 +226,17 @@ def producer( """ ... + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A :class:`temporalio.streams.StreamRef` to ``topic`` of this owner. + + Without ``topic`` it names :data:`temporalio.streams.DEFAULT_TOPIC`, + or the topic this handle was opened from a ref with. The ref carries + the owner exactly as this handle addresses it, a ``run_id`` included + when the handle is pinned, and no cursor or provider name, so it can + travel as a workflow argument, an activity result or a Nexus + operation input or result and be opened wherever a client is. + """ + ... async def close(self) -> None: """Seal the standalone stream this handle is on. diff --git a/temporalio/streams/_ref.py b/temporalio/streams/_ref.py new file mode 100644 index 000000000..5322f4cdb --- /dev/null +++ b/temporalio/streams/_ref.py @@ -0,0 +1,142 @@ +"""A reference to one stream that crosses a process boundary as data. + +A handle is bound to a client and a provider, so it cannot be a workflow +argument, an activity result or a Nexus operation result. A +:class:`StreamRef` can: it names the owner and the topic, nothing more, and +whoever receives it opens the stream on the provider its own client carries. +It carries no cursor, because a position belongs to a reader, and no provider +name, because the same owner and topic name the same stream on every provider +a deployment runs. +""" + +from __future__ import annotations + +import dataclasses +from dataclasses import dataclass +from typing import Any, Literal + +from temporalio.streams._topic import DEFAULT_TOPIC, StreamTopic, resolve_topic + +__all__ = ["StreamOwnerKind", "StreamRef"] + +StreamOwnerKind = Literal["workflow", "activity", "standalone"] +"""What owns a stream: a workflow, an activity, or the stream itself.""" + + +@dataclass(frozen=True) +class StreamRef: + """One stream, named by its owner and its topic. + + ``kind`` says what owns the stream. A ``"workflow"`` ref carries + ``workflow_id`` and, when pinned to one run, ``run_id``. An ``"activity"`` + ref carries ``activity_id``, plus ``workflow_id`` (and its ``run_id``) + when a workflow scheduled the activity; without ``workflow_id`` it is a + standalone activity, and ``run_id`` then pins one run of it. A + ``"standalone"`` ref carries ``stream_id`` and nothing else. ``topic`` is + the topic's name, and a handle opened from a ref addresses it whenever a + call names no topic. + + A ref comes from :meth:`temporalio.streams.StreamHandle.ref`, or from + :meth:`for_workflow`, :meth:`for_activity` and :meth:`for_standalone` + when only the ids are at hand. The default data converter carries it as + JSON, so it can be a workflow argument, an activity result, or a Nexus + operation input or result, and + :meth:`temporalio.client.Client.get_stream_handle` and + :func:`temporalio.activity.stream_handle` open one directly. + """ + + kind: StreamOwnerKind + topic: str = DEFAULT_TOPIC + workflow_id: str | None = None + run_id: str | None = None + activity_id: str | None = None + stream_id: str | None = None + + def __post_init__(self) -> None: + """Refuse a ref that names an owner its kind does not have.""" + if not self.topic: + raise ValueError("a StreamRef needs a topic name") + if self.kind == "workflow": + if not self.workflow_id: + raise ValueError("a workflow StreamRef needs a workflow_id") + if self.activity_id is not None or self.stream_id is not None: + raise ValueError( + "a workflow StreamRef carries no activity_id and no stream_id" + ) + elif self.kind == "activity": + if not self.activity_id: + raise ValueError("an activity StreamRef needs an activity_id") + if self.stream_id is not None: + raise ValueError("an activity StreamRef carries no stream_id") + elif self.kind == "standalone": + if not self.stream_id: + raise ValueError("a standalone StreamRef needs a stream_id") + if ( + self.workflow_id is not None + or self.run_id is not None + or self.activity_id is not None + ): + raise ValueError("a standalone StreamRef carries only its stream_id") + else: + raise ValueError( + f"unknown StreamRef kind {self.kind!r}; expected 'workflow', " + "'activity' or 'standalone'" + ) + + @classmethod + def for_workflow( + cls, + workflow_id: str, + *, + run_id: str | None = None, + topic: str | StreamTopic[Any] | None = None, + ) -> StreamRef: + """A ref to ``topic`` of ``workflow_id``'s stream. + + Without ``run_id`` a handle opened from it follows the execution + chain; with one it is pinned to that run. Without ``topic`` it names + :data:`temporalio.streams.DEFAULT_TOPIC`. + """ + name, _ = resolve_topic(topic) + return cls("workflow", name, workflow_id=workflow_id, run_id=run_id) + + @classmethod + def for_activity( + cls, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + topic: str | StreamTopic[Any] | None = None, + ) -> StreamRef: + """A ref to ``topic`` of the streams ``activity_id`` owns. + + With ``workflow_id`` the activity is one that workflow scheduled and + ``run_id`` is the workflow's run; without it the activity is a + standalone one and ``run_id`` pins one run of it. + """ + name, _ = resolve_topic(topic) + return cls( + "activity", + name, + workflow_id=workflow_id, + run_id=run_id, + activity_id=activity_id, + ) + + @classmethod + def for_standalone( + cls, stream_id: str, *, topic: str | StreamTopic[Any] | None = None + ) -> StreamRef: + """A ref to ``topic`` of the standalone stream ``stream_id``.""" + name, _ = resolve_topic(topic) + return cls("standalone", name, stream_id=stream_id) + + def with_topic(self, topic: str | StreamTopic[Any] | None) -> StreamRef: + """The same owner, naming ``topic`` instead. + + ``None`` names :data:`temporalio.streams.DEFAULT_TOPIC`, as a call + that passes no topic does. + """ + name, _ = resolve_topic(topic) + return dataclasses.replace(self, topic=name) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 1d03abbb1..87f4d5116 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -61,6 +61,7 @@ StreamRecord, check_read_start, ) +from temporalio.streams._ref import StreamRef from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -485,6 +486,11 @@ def producer( producer_id, attempt = producer_identity(producer_id, attempt) return MemoryProducer(store, self._converter, name, producer_id, attempt) + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A ref to ``topic`` of this workflow's stream, pinned as this handle is.""" + return StreamRef.for_workflow( + self._workflow_id, run_id=self._run_id, topic=topic + ) async def close(self) -> None: """Refuse: a workflow's stream ends with the workflow, not by a caller.""" diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index e89947afa..3ed924b5e 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -11,11 +11,14 @@ What this file pins down is what a provider owes: producer identity, retry deduplication, positions, supersession, topic addressing, cursor resumption, -cursor ownership, and releasing a read the caller stopped early. Every case -here goes through the public surface, so a new provider answers this file and -nothing else. The shared pieces no provider implements are unit-tested in -``test_streams_internals``; the workflow-side handles and the two rules about -Workflow Tasks live in ``test_streams_workflow``. +cursor ownership, releasing a read the caller stopped early, naming a stream +as a ``StreamRef``, and running bodies through the client's data converter so +external storage applies and a retry through a nondeterministic codec still +matches its original. Every case here goes through the public surface, so a +new provider answers this file and nothing else. The shared pieces no provider +implements are unit-tested in ``test_streams_internals``; the workflow-side +handles and the two rules about Workflow Tasks live in +``test_streams_workflow``. """ from __future__ import annotations @@ -52,6 +55,7 @@ StreamHandle, StreamProducerError, StreamProvider, + StreamRef, Supersession, topic, ) @@ -569,6 +573,29 @@ async def test_a_read_start_names_one_place(case: ProviderCase): stream.read(topic=OUT, after=END, last=1) +async def test_a_ref_names_the_stream_and_round_trips_as_data(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + ref = stream.ref(topic=OUT) + assert ref == StreamRef.for_workflow(workflow_id, topic="out") + assert (ref.kind, ref.run_id, ref.activity_id, ref.stream_id) == ( + "workflow", + None, + None, + None, + ) + # Without a topic the ref names the default topic, like every other call. + assert stream.ref().topic == DEFAULT_TOPIC + assert stream.ref().with_topic(A) == stream.ref(topic=A) + # A pinned handle hands out a pinned ref. + pinned = await case.open(workflow_id, run_id="run-1") + assert pinned.ref(topic=OUT).run_id == "run-1" + + # Plain data through the default converter, so it can be a workflow + # argument, an activity result or a Nexus operation input or result. + converter = DataConverter.default + [carried] = await converter.decode(await converter.encode([ref]), [StreamRef]) + assert carried == ref async def test_an_owned_stream_cannot_be_closed_by_a_handle(case: ProviderCase): diff --git a/tests/streams/test_streams_internals.py b/tests/streams/test_streams_internals.py index d986e2084..8e3d09feb 100644 --- a/tests/streams/test_streams_internals.py +++ b/tests/streams/test_streams_internals.py @@ -32,6 +32,7 @@ Cursor, RecordKind, StreamCursorError, + StreamRef, Supersession, _ids, _wire, @@ -246,3 +247,32 @@ def batch(*values: dict) -> list[_wire.WireRecord]: await decode_body(converter, record) assert [r.body for r in first] == [r.body for r in batch({"n": 1}, {"n": 2})] assert all(CONTENT_HASH_KEY in r.metadata for r in first) + + +async def test_a_stream_ref_names_one_owner_and_travels_as_json(): + workflow = StreamRef.for_workflow("wf", run_id="r", topic="out") + activity = StreamRef.for_activity("act", workflow_id="wf", topic="progress") + standalone = StreamRef.for_standalone("shared") + assert workflow == StreamRef("workflow", "out", workflow_id="wf", run_id="r") + assert activity.kind == "activity" and activity.activity_id == "act" + assert standalone == StreamRef("standalone", "output", stream_id="shared") + assert standalone.with_topic("x").topic == "x" + + for bad in ( + dict(kind="workflow"), + dict(kind="workflow", workflow_id="wf", stream_id="s"), + dict(kind="activity", workflow_id="wf"), + dict(kind="standalone", stream_id="s", workflow_id="wf"), + dict(kind="standalone"), + dict(kind="nexus", stream_id="s"), + dict(kind="workflow", workflow_id="wf", topic=""), + ): + with pytest.raises(ValueError): + StreamRef(**bad) # type: ignore[arg-type] + + converter = DataConverter.default + for ref in (workflow, activity, standalone): + [carried] = await converter.decode(await converter.encode([ref]), [StreamRef]) + assert carried == ref + payload = (await converter.encode([standalone]))[0] + assert payload.metadata["encoding"] == b"json/plain" From 5c3421e074600c2842ef075f3f414167695d9baa Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:13:48 -0700 Subject: [PATCH 687/831] Derived the stream channel from the client's connection. The stream service was reached on a bare insecure channel, so a client with TLS, an API key, default headers or its own retry policy lost all of them on that path. Connection reads the client's ConnectConfig and opens a grpcio channel with the same target, TLS material, bearer header, headers, keep-alive and proxy, and the shared client retries under the client's retry_config. --- temporalio/client_stream.py | 219 ++++++++++++++++-- temporalio/contrib/server_streams/__init__.py | 2 +- temporalio/streams/providers/native.py | 21 +- tests/test_client_stream_connection.py | 216 +++++++++++++++++ tests/test_client_stream_sharing.py | 27 ++- 5 files changed, 443 insertions(+), 42 deletions(-) create mode 100644 tests/test_client_stream_connection.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index e2afc8297..55e924eda 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -18,8 +18,11 @@ - **This client is for use outside a Workflow.** Workflow code publishes and consumes with ``workflow.append_stream_records`` and ``workflow.read_stream_records`` instead. -- **No TLS or API-key support**, for the same reason: the channel is built - here rather than by the machinery that normally handles that. +- **The channel mirrors the client's connection rather than sharing it.** + :class:`Connection` reads a :class:`temporalio.service.ConnectConfig` and + opens a ``grpcio`` channel with the same target, TLS material, API key, + headers and keep-alive, so a client connected to Temporal Cloud reaches the + stream service the same way. What it cannot mirror is noted on that class. A failed call raises :class:`temporalio.streams.StreamNotFoundError` when the server answers ``NOT_FOUND``, @@ -47,7 +50,7 @@ import weakref from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass -from typing import Any, TypeVar +from typing import TYPE_CHECKING, Any, TypeVar import google.protobuf.duration_pb2 import grpc @@ -60,11 +63,22 @@ from temporalio.api.errordetails.v1 import ResourceExhaustedFailure from temporalio.api.stream.v1 import StreamRecord, StreamStartPosition from temporalio.api.streamservice.v1 import service_pb2_grpc -from temporalio.service import RetryConfig, RPCError, RPCStatusCode +from temporalio.service import ( + ConnectConfig, + RetryConfig, + RPCError, + RPCStatusCode, + TLSConfig, + __version__, +) from temporalio.streams import StreamNotFoundError, StreamProducerError +if TYPE_CHECKING: + from temporalio.client import Client + __all__ = [ "Appended", + "Connection", "Page", "StreamClient", "StreamEntry", @@ -72,6 +86,7 @@ "WorkflowStreamHandle", "close_shared_clients", "shared_client", + "shared_key", ] _T = TypeVar("_T") @@ -204,6 +219,145 @@ def _retry_after( return delay +class _Headers(grpc.aio.UnaryUnaryClientInterceptor): + """Attaches the connection's headers to every call, as Core's interceptor does.""" + + def __init__(self, headers: Sequence[tuple[str, str | bytes]]) -> None: + self._headers = headers + + async def intercept_unary_unary( # type: ignore[override] + self, + continuation: Callable[[grpc.aio.ClientCallDetails, Any], Awaitable[Any]], + client_call_details: grpc.aio.ClientCallDetails, + request: Any, + ) -> Any: + # The aio metadata iterates as (key, value) pairs at runtime, whatever + # shape the stubs give its items. + given: Any = client_call_details.metadata + metadata = grpc.aio.Metadata(*(given or ())) + for key, value in self._headers: + # A header the caller set on the call wins over the connection's. + if key not in metadata: + metadata.add(key, value) + details = client_call_details._replace(metadata=metadata) # type: ignore[attr-defined] + return await continuation(details, request) + + +@dataclass(frozen=True) +class Connection: + """How a stream channel reaches a frontend, taken from a client's connection. + + :meth:`from_config` reads what ``Client.connect`` was given and this opens + a ``grpc.aio`` channel that behaves the same way: the target, TLS with the + same root CA, client certificate and key, the API key as a bearer + ``authorization`` header, the client's default headers and keep-alive. + Two clients with the same settings yield equal connections, which is what + lets them share one channel per namespace. + + Two things ``grpcio`` cannot express the way sdk-core does. It has one + override for both the TLS server name it sends and the name it verifies, + so ``verification_server_name`` takes that override when set and + ``domain`` otherwise, while ``domain`` alone still sets the HTTP/2 + authority. And it reads the settings once, when the channel is opened, so + an API key or header updated on the client afterwards reaches the stream + channel only through a new connection. + """ + + target: str + secure: bool + server_root_ca_cert: bytes | None = None + client_cert: bytes | None = None + client_private_key: bytes | None = None + server_name: str | None = None + authority: str | None = None + headers: tuple[tuple[str, str | bytes], ...] = () + keep_alive: tuple[int, int] | None = None + http_proxy: str | None = None + + @staticmethod + def from_config(config: ConnectConfig) -> Connection: + """Read a :class:`temporalio.service.ConnectConfig` the way the bridge does.""" + target = config.target_host + tls: TLSConfig | None = None + if "://" in target: + # The bridge still accepts a URL with a scheme; the scheme decides. + scheme, _, target = target.partition("://") + secure = scheme == "https" + if isinstance(config.tls, TLSConfig): + tls = config.tls + elif isinstance(config.tls, TLSConfig): + secure, tls = True, config.tls + elif config.tls: + secure = True + else: + # TLS is on by default when an API key is given and tls was left unset. + secure = config.tls is None and config.api_key is not None + + headers: list[tuple[str, str | bytes]] = [ + ("client-name", "temporal-python"), + ("client-version", __version__), + ] + given = {key.lower() for key in config.rpc_metadata} + if config.api_key is not None and "authorization" not in given: + headers.append(("authorization", f"Bearer {config.api_key}")) + headers.extend(config.rpc_metadata.items()) + + proxy = config.http_connect_proxy_config + http_proxy: str | None = None + if proxy is not None: + auth = ( + f"{proxy.basic_auth[0]}:{proxy.basic_auth[1]}@" + if proxy.basic_auth + else "" + ) + http_proxy = f"http://{auth}{proxy.target_host}" + + keep_alive = config.keep_alive_config + return Connection( + target=target, + secure=secure, + server_root_ca_cert=tls.server_root_ca_cert if tls else None, + client_cert=tls.client_cert if tls else None, + client_private_key=tls.client_private_key if tls else None, + server_name=((tls.verification_server_name or tls.domain) if tls else None), + authority=tls.domain if tls else None, + headers=tuple(headers), + keep_alive=( + (keep_alive.interval_millis, keep_alive.timeout_millis) + if keep_alive + else None + ), + http_proxy=http_proxy, + ) + + def channel(self) -> grpc.aio.Channel: + """Open a channel with these settings. Nothing is sent until the first call.""" + options: list[tuple[str, Any]] = [] + if self.keep_alive is not None: + options.append(("grpc.keepalive_time_ms", self.keep_alive[0])) + options.append(("grpc.keepalive_timeout_ms", self.keep_alive[1])) + if self.server_name: + options.append(("grpc.ssl_target_name_override", self.server_name)) + if self.authority: + options.append(("grpc.default_authority", self.authority)) + if self.http_proxy: + options.append(("grpc.http_proxy", self.http_proxy)) + # The stubs do not know the aio interceptor base as a ClientInterceptor. + interceptors: Any = [_Headers(self.headers)] if self.headers else None + if not self.secure: + return grpc.aio.insecure_channel( + self.target, options=options, interceptors=interceptors + ) + credentials = grpc.ssl_channel_credentials( + root_certificates=self.server_root_ca_cert, + private_key=self.client_private_key, + certificate_chain=self.client_cert, + ) + return grpc.aio.secure_channel( + self.target, credentials, options=options, interceptors=interceptors + ) + + @dataclass(frozen=True) class Appended: """Where one append landed. @@ -390,10 +544,11 @@ def connect( *, retry_config: RetryConfig | None = None, ) -> StreamClient: - """Open a channel to a frontend. + """Open a plaintext channel to a frontend, for a local server. Separate from ``Client.connect`` because this does not share the - connection the rest of the SDK uses. + connection the rest of the SDK uses; :meth:`for_connection` opens + one with a client's settings. """ return StreamClient( grpc.aio.insecure_channel(target_host), @@ -401,6 +556,20 @@ def connect( retry_config=retry_config, ) + @staticmethod + def for_connection( + connection: Connection, + namespace: str = "default", + *, + retry_config: RetryConfig | None = None, + ) -> StreamClient: + """Open a channel the way ``connection`` describes. + + ``retry_config`` left ``None`` is the SDK's default; pass the client's + own to retry as its other calls do. + """ + return StreamClient(connection.channel(), namespace, retry_config=retry_config) + async def close(self) -> None: """Close the underlying channel.""" await self._channel.close() @@ -941,36 +1110,48 @@ def _page(out: stream.PollMessagesOutput) -> Page: ) -# One channel per loop, target and namespace, shared by every handle in the +# One channel per loop, connection and namespace, shared by every handle in the # process. A channel is multiplexed and long lived, and callers open a handle # per subscription, which would otherwise be a connection per subscription. The # loop is the key because a grpc.aio channel belongs to the loop that made it, # and it is held weakly so a loop that is gone cannot lend its channel to a # successor that happens to reuse its id. +SharedKey = tuple[Connection, str] + _shared: weakref.WeakKeyDictionary[ - asyncio.AbstractEventLoop, dict[tuple[str, str], StreamClient] + asyncio.AbstractEventLoop, dict[SharedKey, StreamClient] ] = weakref.WeakKeyDictionary() -def shared_client(target_host: str, namespace: str) -> StreamClient: - """The process-wide client for ``target_host`` and ``namespace`` on this loop.""" +def shared_key(client: Client) -> SharedKey: + """What names the shared channel ``client`` reaches the stream service through.""" + return Connection.from_config(client.service_client.config), client.namespace + + +def shared_client(client: Client) -> StreamClient: + """The process-wide stream client on this loop for ``client``'s connection and namespace. + + Opened with the client's connection settings and its ``retry_config``, so + a call on it authenticates and retries as the client's other calls do. + """ per_loop = _shared.setdefault(asyncio.get_running_loop(), {}) - key = (target_host, namespace) + key = shared_key(client) existing = per_loop.get(key) if existing is None: - existing = per_loop[key] = StreamClient.connect(target_host, namespace) + existing = per_loop[key] = StreamClient.for_connection( + key[0], key[1], retry_config=client.service_client.config.retry_config + ) return existing -async def close_shared_clients(*keys: tuple[str, str]) -> None: +async def close_shared_clients(*keys: SharedKey) -> None: """Close the shared clients this loop opened for ``keys``, or all of them. - A provider closes the ones it opened, named by ``(target host, - namespace)``: another provider on the same loop may still be reading - through a channel of its own, and taking that out from under it is not - this one's to do. With no keys it closes every one, which is what a - process finished with streams wants, and what a test that opened a loop - of its own wants. + A provider closes the ones it opened, named by :func:`shared_key`: + another provider on the same loop may still be reading through a channel + of its own, and taking that out from under it is not this one's to do. + With no keys it closes every one, which is what a process finished with + streams wants, and what a test that opened a loop of its own wants. """ loop = asyncio.get_running_loop() if not keys: diff --git a/temporalio/contrib/server_streams/__init__.py b/temporalio/contrib/server_streams/__init__.py index 0f6c5142d..f6ac83556 100644 --- a/temporalio/contrib/server_streams/__init__.py +++ b/temporalio/contrib/server_streams/__init__.py @@ -457,4 +457,4 @@ async def _decoded(self, record: StreamRecord) -> StreamRecord: def _stream_client(client: Client) -> StreamClient: - return shared_client(client.service_client.config.target_host, client.namespace) + return shared_client(client) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 62a1c8b7a..751489727 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -24,8 +24,9 @@ from the run's close event who came next; with a run id it is pinned. Prototype support for AI-198. It needs a server built from that branch and -opens its own gRPC channel to it, because sdk-core does not know the stream -service yet, which is also why it does not support TLS or API keys. +reaches the stream service on a channel of its own, opened with the client's +connection settings (target, TLS, API key, headers, retries), because sdk-core +does not know the service yet. """ from __future__ import annotations @@ -39,10 +40,12 @@ from temporalio.client import Client, WorkflowHistoryEventFilterType from temporalio.client_stream import ( Page, + SharedKey, StreamClient, WorkflowStreamHandle, close_shared_clients, shared_client, + shared_key, ) from temporalio.converter import PayloadCodec, PayloadConverter from temporalio.service import RPCError, RPCStatusCode @@ -326,7 +329,7 @@ def __init__( workflow_id: str, run_id: str | None, *, - opened: set[tuple[str, str]] | None = None, + opened: set[SharedKey] | None = None, ) -> None: """Address ``workflow_id``'s topics, pinned to ``run_id`` when one is given. @@ -345,12 +348,8 @@ def _service(self) -> StreamClient: # Resolved on first use, because the shared channel belongs to the # running loop and a handle may be made before there is one. if self._streams is None: - key = ( - self._client.service_client.config.target_host, - self._client.namespace, - ) - self._streams = shared_client(*key) - self._opened.add(key) + self._streams = shared_client(self._client) + self._opened.add(shared_key(self._client)) return self._streams def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: @@ -564,7 +563,7 @@ def __init__( workflow_id: str | None, run_id: str | None, *, - opened: set[tuple[str, str]] | None = None, + opened: set[SharedKey] | None = None, ) -> None: """Address ``activity_id``'s topics, pinned to ``run_id`` when one is given.""" super().__init__(client, workflow_id or "", run_id, opened=opened) @@ -614,7 +613,7 @@ def __init__(self) -> None: """Create the provider.""" # What this provider's handles opened, so closing it leaves another # provider's channels on the same loop alone. - self._opened: set[tuple[str, str]] = set() + self._opened: set[SharedKey] = set() def workflow_provider(self) -> _NativeWorkflowProvider: """The workflow half, over the server's commands and delivered ranges.""" diff --git a/tests/test_client_stream_connection.py b/tests/test_client_stream_connection.py new file mode 100644 index 000000000..73e4c5314 --- /dev/null +++ b/tests/test_client_stream_connection.py @@ -0,0 +1,216 @@ +"""The stream channel is the client's connection, opened again with ``grpcio``. + +sdk-core does not know the stream service, so its channel cannot be shared. +What can be shared is the configuration: these pin that a TLS-configured +client yields a secure channel with the same material, that an API key rides +as the bearer header along with the client's other headers, and that the +client's ``retry_config`` is what the shared stream client retries under. +""" + +from __future__ import annotations + +from types import SimpleNamespace +from typing import Any + +import grpc +import grpc.aio +import pytest + +import temporalio.api.streamservice.v1 as stream +from temporalio import client_stream +from temporalio.client_stream import Connection, StreamClient +from temporalio.service import ( + ConnectConfig, + HttpConnectProxyConfig, + KeepAliveConfig, + RetryConfig, + TLSConfig, + __version__, +) + +# The name the vendored stubs call the service by, server-internal as it is. +_SERVICE = "temporal.server.chasm.lib.stream.proto.v1.StreamService" + + +def _fake_client(config: ConnectConfig, namespace: str = "ns") -> Any: + return SimpleNamespace( + service_client=SimpleNamespace(config=config), namespace=namespace + ) + + +def test_a_plaintext_client_yields_an_insecure_channel( + monkeypatch: pytest.MonkeyPatch, +) -> None: + opened: dict[str, Any] = {} + + def insecure_channel(target: str, **kwargs: Any) -> str: + opened.update(target=target, **kwargs) + return "channel" + + monkeypatch.setattr(grpc.aio, "insecure_channel", insecure_channel) + connection = Connection.from_config(ConnectConfig(target_host="localhost:7233")) + assert not connection.secure + assert connection.channel() == "channel" + assert opened["target"] == "localhost:7233" + keep_alive = KeepAliveConfig.default + assert ("grpc.keepalive_time_ms", keep_alive.interval_millis) in opened["options"] + assert ("grpc.keepalive_timeout_ms", keep_alive.timeout_millis) in opened["options"] + + +def test_a_tls_client_yields_a_secure_channel_with_its_credentials( + monkeypatch: pytest.MonkeyPatch, +) -> None: + made: dict[str, Any] = {} + opened: dict[str, Any] = {} + + def ssl_channel_credentials(**kwargs: Any) -> str: + made.update(kwargs) + return "credentials" + + def secure_channel(target: str, credentials: Any, **kwargs: Any) -> str: + opened.update(target=target, credentials=credentials, **kwargs) + return "channel" + + monkeypatch.setattr(grpc, "ssl_channel_credentials", ssl_channel_credentials) + monkeypatch.setattr(grpc.aio, "secure_channel", secure_channel) + + connection = Connection.from_config( + ConnectConfig( + target_host="cloud.example:7233", + tls=TLSConfig( + server_root_ca_cert=b"root", + client_cert=b"cert", + client_private_key=b"key", + domain="cloud.example", + verification_server_name="pinned.test", + ), + ) + ) + assert connection.secure + assert connection.channel() == "channel" + assert made == { + "root_certificates": b"root", + "private_key": b"key", + "certificate_chain": b"cert", + } + assert opened["target"] == "cloud.example:7233" + assert opened["credentials"] == "credentials" + assert ("grpc.ssl_target_name_override", "pinned.test") in opened["options"] + assert ("grpc.default_authority", "cloud.example") in opened["options"] + + +def test_tls_is_on_by_default_with_an_api_key_and_off_when_refused() -> None: + with_key = Connection.from_config( + ConnectConfig(target_host="cloud.example:7233", api_key="secret") + ) + assert with_key.secure + assert with_key.server_root_ca_cert is None, "system roots" + refused = Connection.from_config( + ConnectConfig(target_host="localhost:7233", api_key="secret", tls=False) + ) + assert not refused.secure + assert ("authorization", "Bearer secret") in refused.headers + + +def test_a_scheme_in_the_target_decides_and_is_dropped() -> None: + connection = Connection.from_config( + ConnectConfig(target_host="https://cloud.example:7233") + ) + assert connection.secure + assert connection.target == "cloud.example:7233" + + +def test_a_proxy_and_the_clients_own_authorization_carry_over() -> None: + connection = Connection.from_config( + ConnectConfig( + target_host="localhost:7233", + api_key="ignored", + tls=False, + rpc_metadata={"Authorization": "Custom token", "x-tenant": "t1"}, + http_connect_proxy_config=HttpConnectProxyConfig( + target_host="proxy:3128", basic_auth=("user", "pass") + ), + ) + ) + # Core leaves a caller's own authorization header alone. + assert ("Authorization", "Custom token") in connection.headers + assert ("x-tenant", "t1") in connection.headers + assert not any(key == "authorization" for key, _ in connection.headers) + assert connection.http_proxy == "http://user:pass@proxy:3128" + + +class _Recorder: + """Answers describe and keeps the headers it arrived with.""" + + def __init__(self) -> None: + self.metadata: dict[str, str | bytes] = {} + + async def describe( + self, _request: Any, context: Any + ) -> stream.DescribeStreamResponse: + self.metadata = dict(context.invocation_metadata() or ()) + return stream.DescribeStreamResponse( + frontend_response=stream.DescribeStreamOutput( + state=stream.StreamState(head_offset=3) + ) + ) + + def register(self, server: grpc.aio.Server) -> None: + # The generated registration wants the whole servicer; one method is + # enough to see the headers. + handler: Any = grpc.unary_unary_rpc_method_handler( + self.describe, + request_deserializer=stream.DescribeStreamRequest.FromString, + response_serializer=stream.DescribeStreamResponse.SerializeToString, + ) + server.add_generic_rpc_handlers( + ( + grpc.method_handlers_generic_handler( + _SERVICE, {"DescribeStream": handler} + ), + ) + ) + + +async def test_an_api_key_client_sends_the_header_on_every_call() -> None: + recorder = _Recorder() + server = grpc.aio.server() + recorder.register(server) + port = server.add_insecure_port("127.0.0.1:0") + await server.start() + config = ConnectConfig( + target_host=f"127.0.0.1:{port}", + api_key="secret", + tls=False, + rpc_metadata={"x-tenant": "t1"}, + ) + streams = StreamClient.for_connection(Connection.from_config(config), "ns") + try: + state = await streams.get("s").describe() + assert state.head_offset == 3 + assert recorder.metadata["authorization"] == "Bearer secret" + assert recorder.metadata["x-tenant"] == "t1" + assert recorder.metadata["client-name"] == "temporal-python" + assert recorder.metadata["client-version"] == __version__ + finally: + await streams.close() + await server.stop(None) + + +async def test_the_shared_client_retries_under_the_clients_config() -> None: + retry = RetryConfig(max_retries=3) + client = _fake_client( + ConnectConfig(target_host="localhost:7233", retry_config=retry), "ns" + ) + try: + shared = client_stream.shared_client(client) + assert shared._retry_config is retry + assert shared is client_stream.shared_client(client), "one channel per key" + # A client with other credentials to the same host is not the same channel. + other = _fake_client( + ConnectConfig(target_host="localhost:7233", api_key="k", tls=False), "ns" + ) + assert client_stream.shared_client(other) is not shared + assert client_stream.shared_key(other) != client_stream.shared_key(client) + finally: + await client_stream.close_shared_clients() diff --git a/tests/test_client_stream_sharing.py b/tests/test_client_stream_sharing.py index 793ba122a..55fd3e7e3 100644 --- a/tests/test_client_stream_sharing.py +++ b/tests/test_client_stream_sharing.py @@ -1,8 +1,8 @@ """Who owns a shared channel, and who may close it. -One channel is shared per loop, target and namespace, so two providers in one -process can be using the same one. Closing a provider has to leave the other's -channels alone. +One channel is shared per loop, connection and namespace, so two providers in +one process can be using the same one. Closing a provider has to leave the +other's channels alone. """ from __future__ import annotations @@ -10,6 +10,7 @@ import asyncio from temporalio import client_stream +from temporalio.client_stream import Connection, SharedKey from temporalio.streams.providers.native import NativeStreams @@ -23,17 +24,21 @@ async def close(self) -> None: self.closed = True -def _put(target: str, namespace: str) -> _FakeClient: +def _key(target: str, namespace: str) -> SharedKey: + return Connection(target=target, secure=False), namespace + + +def _put(key: SharedKey) -> _FakeClient: fake = _FakeClient() per_loop = client_stream._shared.setdefault(asyncio.get_running_loop(), {}) - per_loop[(target, namespace)] = fake # type: ignore[assignment] + per_loop[key] = fake # type: ignore[assignment] return fake async def test_closing_named_clients_leaves_the_others_open() -> None: - mine = _put("host-a:7233", "ns") - theirs = _put("host-b:7233", "ns") - await client_stream.close_shared_clients(("host-a:7233", "ns")) + mine = _put(_key("host-a:7233", "ns")) + theirs = _put(_key("host-b:7233", "ns")) + await client_stream.close_shared_clients(_key("host-a:7233", "ns")) assert mine.closed assert not theirs.closed, "another provider is still reading through it" await client_stream.close_shared_clients() @@ -41,11 +46,11 @@ async def test_closing_named_clients_leaves_the_others_open() -> None: async def test_a_provider_closes_only_what_its_own_handles_opened() -> None: - mine = _put("host-a:7233", "ns") - theirs = _put("host-b:7233", "ns") + mine = _put(_key("host-a:7233", "ns")) + theirs = _put(_key("host-b:7233", "ns")) provider = NativeStreams() - provider._opened.add(("host-a:7233", "ns")) + provider._opened.add(_key("host-a:7233", "ns")) await provider.close() assert mine.closed assert not theirs.closed From 61a58f78b953b5c5fdeac575c1c3c64e9d099d5b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:30:38 -0700 Subject: [PATCH 688/831] Let the client and activity accessors open refs and standalone streams. A StreamRef in place of the workflow id opens the stream it names on whatever provider the client carries, and its topic becomes the handle's default. A standalone stream is created with client.create_stream and reached by its stream_id. --- CHANGELOG.md | 8 +- temporalio/activity.py | 21 ++++- temporalio/client/_client.py | 103 ++++++++++++++++++++++--- temporalio/streams/_ref.py | 91 +++++++++++++++++++++- tests/streams/test_activity_streams.py | 4 +- 5 files changed, 208 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfd1c61df..d335d6db4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,7 +48,13 @@ to include examples, links to docs, or any other relevant information. code; a plain string names a topic decided at runtime, and a call that names no topic addresses the default topic, `streams.DEFAULT_TOPIC` (`"output"`, the server's default stream name). The record on the wire - is `temporal.api.stream.v1.StreamRecord` on every provider. + is `temporal.api.stream.v1.StreamRecord` on every provider. A stream is + handed to another process as a `streams.StreamRef`, plain data naming the + owner and the topic, which `client.get_stream_handle(ref)` and + `activity.stream_handle(ref)` open; `client.create_stream(stream_id, ...)` + creates a standalone stream with a retention policy, and its handle's + `close()` seals it. A provider runs record bodies through the client's data + converter, so a payload codec and external storage apply to them. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. diff --git a/temporalio/activity.py b/temporalio/activity.py index 5f7a62373..40821db39 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -34,6 +34,7 @@ from temporalio.converter._payload_converter import ( _TemporalTransferTypePayloadConverter, ) +from temporalio.streams._ref import open_ref from .types import CallableType @@ -301,13 +302,18 @@ def client() -> Client: def stream_handle( - workflow_id: str | None = None, + workflow_id: str | temporalio.streams.StreamRef | None = None, *, run_id: str | None = None, scope: Literal["workflow", "activity"] | None = None, ) -> temporalio.streams.StreamHandle: """Return a stream handle from the provider the worker was given. + A :py:class:`temporalio.streams.StreamRef` in place of ``workflow_id``, + such as one this activity received as an argument, opens the stream it + names, whatever owns it, and takes no other argument; the handle's calls + that name no topic then address the ref's topic. + Which stream a call with no ``workflow_id`` reaches is decided by where the activity runs, never by what exists: @@ -339,7 +345,8 @@ def stream_handle( activities. Args: - workflow_id: Another workflow whose stream to address. + workflow_id: Another workflow whose stream to address, or a + :py:class:`temporalio.streams.StreamRef` naming the stream. run_id: The run of ``workflow_id`` to pin to. scope: ``"activity"`` for this activity's own streams, ``"workflow"`` for its workflow's. Without it the rule above @@ -357,8 +364,8 @@ def stream_handle( provider, or its provider cannot hold a stream an activity owns. Register one with ``Client.connect(plugins=[provider])`` or ``Worker(plugins=[provider])``. - ValueError: ``run_id`` was given without ``workflow_id``, or - ``scope="activity"`` with one. + ValueError: ``run_id`` was given without ``workflow_id``, + ``scope="activity"`` with one, or a ref with either. """ context = _Context.current() if context.sync: @@ -376,6 +383,12 @@ def stream_handle( "no stream provider is configured on this worker; register one with " "Client.connect(plugins=[provider]) or Worker(plugins=[provider])" ) + if isinstance(workflow_id, temporalio.streams.StreamRef): + if run_id is not None or scope is not None: + raise ValueError( + "a StreamRef names the stream in full, so it takes no run_id or scope" + ) + return open_ref(provider, client(), workflow_id) if workflow_id is not None: if scope == "activity": raise ValueError( diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 2e0cc3f3b..d770a73b1 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -40,6 +40,7 @@ ServiceClient, TLSConfig, ) +from temporalio.streams._ref import open_ref from ..common import HeaderCodecBehavior from ..types import ( @@ -898,22 +899,29 @@ def get_workflow_handle( def get_stream_handle( self, - workflow_id: str | None = None, + workflow_id: str | temporalio.streams.StreamRef | None = None, *, run_id: str | None = None, activity_id: str | None = None, + stream_id: str | None = None, ) -> temporalio.streams.StreamHandle: - """Get a handle on a workflow's or an activity's stream from the provider registered on this client. + """Get a handle on a stream from the provider registered on this client. Mirrors :py:meth:`get_workflow_handle`: without ``run_id`` the handle follows the workflow's execution chain across continue-as-new, with one it is pinned to that run. With ``activity_id`` the handle is on the streams that activity owns: a standalone activity's when ``workflow_id`` is left out, and ``run_id`` then pins the activity's - run, or an activity that ``workflow_id`` scheduled. The provider is - the one registered with ``plugins=[provider]`` at :py:meth:`connect`, - or passed as ``stream_provider``. The handle's ``read``, ``latest`` - and ``producer`` take a topic, and without one address the owner's + run, or an activity that ``workflow_id`` scheduled. With + ``stream_id`` it is on a standalone stream, one with an id of its own + and no owner, which :py:meth:`create_stream` made; it takes no other + argument. A :py:class:`temporalio.streams.StreamRef` in place of + ``workflow_id`` opens the stream the ref names, whatever owns it, and + takes no other argument either: the handle's calls that name no topic + then address the ref's topic. The provider is the one registered + with ``plugins=[provider]`` at :py:meth:`connect`, or passed as + ``stream_provider``. The handle's ``read``, ``latest`` and + ``producer`` take a topic, and without one address the owner's default topic, :py:data:`temporalio.streams.DEFAULT_TOPIC`. A ``read`` starts at :py:data:`temporalio.streams.BEGINNING`, at :py:data:`temporalio.streams.END` or at the last ``N`` records with @@ -921,19 +929,22 @@ def get_stream_handle( :py:mod:`temporalio.streams`. Args: - workflow_id: Workflow ID whose stream to get a handle to, or the - workflow that scheduled ``activity_id``. + workflow_id: Workflow ID whose stream to get a handle to, the + workflow that scheduled ``activity_id``, or a + :py:class:`temporalio.streams.StreamRef` naming the stream. run_id: Run ID to pin the handle to. activity_id: Activity ID whose own streams to get a handle to. + stream_id: ID of the standalone stream to get a handle to. Returns: The stream handle. Raises: - ValueError: Neither ``workflow_id`` nor ``activity_id`` was given. + ValueError: No owner was named, or a ref or ``stream_id`` was + given together with another argument. temporalio.streams.StreamUnsupportedError: No stream provider is registered on this client, or it cannot hold a stream an - activity owns. + activity owns or a stream without an owner. """ provider = self._config.get("stream_provider") if provider is None: @@ -941,14 +952,84 @@ def get_stream_handle( "no stream provider is registered on this client; connect with " "plugins=[provider]" ) + if isinstance(workflow_id, temporalio.streams.StreamRef): + if run_id is not None or activity_id is not None or stream_id is not None: + raise ValueError( + "a StreamRef names the stream in full, so it takes no run_id, " + "activity_id or stream_id" + ) + return open_ref(provider, self, workflow_id) + if stream_id is not None: + if workflow_id is not None or run_id is not None or activity_id is not None: + raise ValueError( + "stream_id names a standalone stream, which has no workflow_id, " + "run_id or activity_id" + ) + return provider.get_standalone_stream_handle(self, stream_id) if activity_id is not None: return provider.get_activity_stream_handle( self, activity_id, workflow_id=workflow_id, run_id=run_id ) if workflow_id is None: - raise ValueError("name the workflow_id or the activity_id to address") + raise ValueError( + "name the workflow_id, the activity_id or the stream_id to address" + ) return provider.get_stream_handle(self, workflow_id, run_id=run_id) + async def create_stream( + self, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> temporalio.streams.StreamHandle: + """Create a standalone stream and get a handle on it. + + A standalone stream has an id of its own and no owner, so it is + created here on purpose rather than by its first write, and it is + sealed on purpose with the handle's ``close()``, after which appends + are refused and the retained records stay readable. The three policy + arguments bound what it retains: records older than ``retention``, + beyond the newest ``max_records`` or past ``max_bytes`` of stored + records are dropped, and ``None`` leaves a bound to the provider's + default. Creating a stream that exists with the same policy returns a + handle on it, so a retried create is harmless. Another process + reaches the stream with ``get_stream_handle(stream_id=...)`` or with + the handle's ``ref()``. + + Args: + stream_id: ID of the stream to create. + retention: How long a record is kept. + max_records: How many of the newest records are kept. + max_bytes: How many bytes of records are kept. + + Returns: + A handle on the new or existing stream. + + Raises: + ValueError: ``stream_id`` is empty, a bound is not positive, or + the stream exists with a different policy. + temporalio.streams.StreamUnsupportedError: No stream provider is + registered on this client, or it cannot hold a stream without + an owner. + """ + provider = self._config.get("stream_provider") + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is registered on this client; connect with " + "plugins=[provider]" + ) + if not stream_id: + raise ValueError("stream_id must not be empty") + return await provider.create_standalone_stream( + self, + stream_id, + retention=retention, + max_records=max_records, + max_bytes=max_bytes, + ) + def get_workflow_handle_for( self, workflow: ( diff --git a/temporalio/streams/_ref.py b/temporalio/streams/_ref.py index 5322f4cdb..9e8130af7 100644 --- a/temporalio/streams/_ref.py +++ b/temporalio/streams/_ref.py @@ -12,12 +12,22 @@ from __future__ import annotations import dataclasses +from collections.abc import AsyncGenerator from dataclasses import dataclass -from typing import Any, Literal +from typing import TYPE_CHECKING, Any, Literal +from temporalio.streams._record import BEGINNING, Cursor, StreamRecord from temporalio.streams._topic import DEFAULT_TOPIC, StreamTopic, resolve_topic -__all__ = ["StreamOwnerKind", "StreamRef"] +if TYPE_CHECKING: + from temporalio.client import Client + from temporalio.streams._provider import ( + StreamHandle, + StreamProducer, + StreamProvider, + ) + +__all__ = ["StreamOwnerKind", "StreamRef", "open_ref"] StreamOwnerKind = Literal["workflow", "activity", "standalone"] """What owns a stream: a workflow, an activity, or the stream itself.""" @@ -140,3 +150,80 @@ def with_topic(self, topic: str | StreamTopic[Any] | None) -> StreamRef: """ name, _ = resolve_topic(topic) return dataclasses.replace(self, topic=name) + + +def open_ref(provider: StreamProvider, client: Client, ref: StreamRef) -> StreamHandle: + """The handle ``ref`` names, on ``provider``. + + The ref's kind picks the provider call that opens the owner, and its + topic becomes the handle's default, so a call that names none addresses + the stream the ref names. A provider that cannot host that owner kind + raises :class:`temporalio.streams.StreamUnsupportedError` from the call + that would have opened it. + """ + if ref.kind == "workflow": + assert ref.workflow_id is not None + handle = provider.get_stream_handle(client, ref.workflow_id, run_id=ref.run_id) + elif ref.kind == "activity": + assert ref.activity_id is not None + handle = provider.get_activity_stream_handle( + client, ref.activity_id, workflow_id=ref.workflow_id, run_id=ref.run_id + ) + else: + assert ref.stream_id is not None + handle = provider.get_standalone_stream_handle(client, ref.stream_id) + return _RefHandle(handle, ref) + + +class _RefHandle: + """A provider's handle whose default topic is the one a ref names. + + Every call passes through unchanged when it names a topic; one that + names none gets the ref's. The wrapper exists so a ref can address a + stream without every provider learning about refs. + """ + + def __init__(self, inner: StreamHandle, ref: StreamRef) -> None: + self._inner = inner + self._ref = ref + + def _topic(self, topic: str | StreamTopic[Any] | None) -> str | StreamTopic[Any]: + return self._ref.topic if topic is None else topic + + def read( + self, + *, + topic: str | StreamTopic[Any] | None = None, + after: Cursor = BEGINNING, + last: int | None = None, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + # The protocol's overloads each take one shape of topic and + # result_type; a passthrough hands over whatever it was given. + inner: Any = self._inner + return inner.read( + topic=self._topic(topic), after=after, last=last, result_type=result_type + ) + + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: + return await self._inner.latest(topic=self._topic(topic)) + + def producer( + self, + *, + topic: str | StreamTopic[Any] | None = None, + producer_id: str = "", + attempt: int = 0, + ) -> StreamProducer[Any]: + inner: Any = self._inner + return inner.producer( + topic=self._topic(topic), producer_id=producer_id, attempt=attempt + ) + + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + if topic is None: + return self._ref + return self._inner.ref(topic=topic) + + async def close(self) -> None: + await self._inner.close() diff --git a/tests/streams/test_activity_streams.py b/tests/streams/test_activity_streams.py index 8aa4a653a..bd0a675ac 100644 --- a/tests/streams/test_activity_streams.py +++ b/tests/streams/test_activity_streams.py @@ -257,5 +257,7 @@ async def test_a_standalone_activity_has_no_workflow_to_address(setup: ActivityS async def test_get_stream_handle_needs_an_owner(setup: ActivitySetup): - with pytest.raises(ValueError, match="workflow_id or the activity_id"): + with pytest.raises( + ValueError, match="workflow_id, the activity_id or the stream_id" + ): setup.client.get_stream_handle() From fa7c9947e89bf3dea0087f499b63df1ed28bf918 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:29:20 -0700 Subject: [PATCH 689/831] Addressed a stream by reference on the Nexus front. The two operations took a workflow id, run id and topic, so an operation of the application's own had no standard value to return for a stream and the front could not reach a stream an activity owns. A StreamRef naming the owner kind, its ids and the topic replaces the triple, and the handler maps it onto the store's accessor for that owner. --- CHANGELOG.md | 8 +- pyproject.toml | 5 + .../providers/_nexus_generated/__init__.py | 2 + .../providers/_nexus_generated/models.py | 335 ++++++++++++------ temporalio/streams/providers/nexus.py | 212 +++++++---- .../providers/temporal_streams.nexusrpc.yaml | 61 ++-- tests/streams/test_nexus_provider.py | 167 +++++++-- 7 files changed, 556 insertions(+), 234 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7fb8e3fb..fff14568e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,9 +67,11 @@ to include examples, links to docs, or any other relevant information. `TemporalStreamsHandler` serves that endpoint by fronting the provider's own handles. Its contract is defined in `temporal_streams.nexusrpc.yaml` and the bindings are generated from it; a record crosses as the serialized - `StreamRecord` proto. Configure the front with `data_converter=` to run a - payload codec on the caller side, so records are encoded before they leave - the process. + `StreamRecord` proto, and both operations address a stream by a `StreamRef` + naming its owner (a workflow, an activity or a standalone stream) and topic, + which the handler maps onto the store's accessor for that owner. Configure + the front with `data_converter=` to run a payload codec on the caller side, + so records are encoded before they leave the process. ### Changed diff --git a/pyproject.toml b/pyproject.toml index 227a6a2cc..fcf82b526 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -201,12 +201,17 @@ exclude = [ 'temporalio/api', 'temporalio/bridge/proto', 'temporalio/nexus/system/workflow_service', + 'temporalio/streams/providers/_nexus_generated', ] [[tool.mypy.overrides]] module = "temporalio.nexus.system.workflow_service.*" ignore_errors = true +[[tool.mypy.overrides]] +module = "temporalio.streams.providers._nexus_generated.*" +ignore_errors = true + [tool.pydocstyle] convention = "google" # https://github.com/PyCQA/pydocstyle/issues/363#issuecomment-625563088 diff --git a/temporalio/streams/providers/_nexus_generated/__init__.py b/temporalio/streams/providers/_nexus_generated/__init__.py index c62eaa6dd..d855a6381 100644 --- a/temporalio/streams/providers/_nexus_generated/__init__.py +++ b/temporalio/streams/providers/_nexus_generated/__init__.py @@ -9,6 +9,7 @@ ReadInput, ReadOutput, RecordWire, + StreamRef, ) from .services import TemporalStreams @@ -19,5 +20,6 @@ "ReadInput", "ReadOutput", "RecordWire", + "StreamRef", "TemporalStreams", ] diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index cab83100b..033cded90 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -16,6 +16,7 @@ _format_base64, _parse_base64, _parse_spec_integer, + _quote, _transfer_type_convertible, ) @@ -42,42 +43,17 @@ def from_transfer_type( ) raw = typing.cast("dict[str, typing.Any]", value) - workflow_id_value: str = typing.cast("typing.Any", None) - if "workflow_id" not in raw or raw["workflow_id"] is None: - violations.append(Violation(path="workflow_id", reason="required")) + stream_value: StreamRef = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) else: - workflow_id_value_raw = raw["workflow_id"] - if not isinstance(workflow_id_value_raw, str): - violations.append( - Violation(path="workflow_id", reason="expected string") - ) - else: - workflow_id_value = workflow_id_value_raw - - run_id_value: str | None = None - if "run_id" in raw: - run_id_value_raw = raw["run_id"] - if run_id_value_raw is None: - violations.append( - Violation(path="run_id", reason="explicit null not allowed") + stream_value_raw = raw["stream"] + try: + stream_value = _StreamRefTransferTypeConverter().from_transfer_type( + stream_value_raw, StreamRef ) - else: - if not isinstance(run_id_value_raw, str): - violations.append( - Violation(path="run_id", reason="expected string") - ) - else: - run_id_value = run_id_value_raw - - topic_value: str = typing.cast("typing.Any", None) - if "topic" not in raw or raw["topic"] is None: - violations.append(Violation(path="topic", reason="required")) - else: - topic_value_raw = raw["topic"] - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw + except temporalio.exceptions.ApplicationError as error: + _collect(violations, "stream", error) producer_id_value: str = typing.cast("typing.Any", None) if "producer_id" not in raw or raw["producer_id"] is None: @@ -194,9 +170,7 @@ def from_transfer_type( for key in raw: if ( - key != "workflow_id" - and key != "run_id" - and key != "topic" + key != "stream" and key != "producer_id" and key != "attempt" and key != "sequence" @@ -208,9 +182,7 @@ def from_transfer_type( if violations: raise temporalio.converter.create_payload_validation_error(violations) return AppendInput( - workflow_id=workflow_id_value, - run_id=run_id_value, - topic=topic_value, + stream=stream_value, producer_id=producer_id_value, attempt=attempt_value, sequence=sequence_value, @@ -223,10 +195,12 @@ def from_transfer_type( def to_transfer_type(self, value: "AppendInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} - out["workflow_id"] = value.workflow_id - if value.run_id is not None: - out["run_id"] = value.run_id - out["topic"] = value.topic + try: + out["stream"] = _StreamRefTransferTypeConverter().to_transfer_type( + value.stream + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, "stream", error) out["producer_id"] = value.producer_id if abs(value.attempt) > 9007199254740991: violations.append( @@ -267,16 +241,7 @@ def to_transfer_type(self, value: "AppendInput") -> typing.Any: class AppendInput: """One append call: who is writing, where, and what.""" - workflow_id: str - """The workflow whose stream is being written.""" - - run_id: str | None = None - """The run to address. Empty addresses the workflow's execution chain, which is what a - producer normally wants. - """ - - topic: str - """The topic of the workflow's stream to append to.""" + stream: StreamRef producer_id: str """Identifies the writer across its retries, so its attempts can be ordered. Never @@ -402,42 +367,17 @@ def from_transfer_type( ) raw = typing.cast("dict[str, typing.Any]", value) - workflow_id_value: str = typing.cast("typing.Any", None) - if "workflow_id" not in raw or raw["workflow_id"] is None: - violations.append(Violation(path="workflow_id", reason="required")) + stream_value: StreamRef = typing.cast("typing.Any", None) + if "stream" not in raw or raw["stream"] is None: + violations.append(Violation(path="stream", reason="required")) else: - workflow_id_value_raw = raw["workflow_id"] - if not isinstance(workflow_id_value_raw, str): - violations.append( - Violation(path="workflow_id", reason="expected string") - ) - else: - workflow_id_value = workflow_id_value_raw - - run_id_value: str | None = None - if "run_id" in raw: - run_id_value_raw = raw["run_id"] - if run_id_value_raw is None: - violations.append( - Violation(path="run_id", reason="explicit null not allowed") + stream_value_raw = raw["stream"] + try: + stream_value = _StreamRefTransferTypeConverter().from_transfer_type( + stream_value_raw, StreamRef ) - else: - if not isinstance(run_id_value_raw, str): - violations.append( - Violation(path="run_id", reason="expected string") - ) - else: - run_id_value = run_id_value_raw - - topic_value: str = typing.cast("typing.Any", None) - if "topic" not in raw or raw["topic"] is None: - violations.append(Violation(path="topic", reason="required")) - else: - topic_value_raw = raw["topic"] - if not isinstance(topic_value_raw, str): - violations.append(Violation(path="topic", reason="expected string")) - else: - topic_value = topic_value_raw + except temporalio.exceptions.ApplicationError as error: + _collect(violations, "stream", error) after_token_value: str | None = None if "after_token" in raw: @@ -548,9 +488,7 @@ def from_transfer_type( for key in raw: if ( - key != "workflow_id" - and key != "run_id" - and key != "topic" + key != "stream" and key != "after_token" and key != "max_records" and key != "wait_ms" @@ -561,9 +499,7 @@ def from_transfer_type( if violations: raise temporalio.converter.create_payload_validation_error(violations) return ReadInput( - workflow_id=workflow_id_value, - run_id=run_id_value, - topic=topic_value, + stream=stream_value, after_token=after_token_value, max_records=max_records_value, wait_ms=wait_ms_value, @@ -575,10 +511,12 @@ def from_transfer_type( def to_transfer_type(self, value: "ReadInput") -> typing.Any: violations: list[Violation] = [] out: dict[str, typing.Any] = {} - out["workflow_id"] = value.workflow_id - if value.run_id is not None: - out["run_id"] = value.run_id - out["topic"] = value.topic + try: + out["stream"] = _StreamRefTransferTypeConverter().to_transfer_type( + value.stream + ) + except temporalio.exceptions.ApplicationError as error: + _collect(violations, "stream", error) if value.after_token is not None: out["after_token"] = value.after_token if value.max_records is not None: @@ -643,16 +581,7 @@ def to_transfer_type(self, value: "ReadInput") -> typing.Any: class ReadInput: """One read call: where to resume from and how long to wait.""" - workflow_id: str - """The workflow whose stream is being read.""" - - run_id: str | None = None - """Pin the read to this run. Empty follows the workflow's execution chain across - continue-as-new. - """ - - topic: str - """The topic of the workflow's stream to read.""" + stream: StreamRef after_token: str | None = None """Opaque cursor from an earlier record or append. The read resumes strictly after the @@ -915,3 +844,193 @@ class RecordWire: additional_properties: dict[str, typing.Any] = dataclasses.field( default_factory=dict ) + + +class _StreamRefTransferTypeConverter( + temporalio.converter.TransferTypeConverter["StreamRef", typing.Any] +): + @typing_extensions.override + def from_transfer_type( + self, value: typing.Any, type_hint: type["StreamRef"] + ) -> "StreamRef": + violations: list[Violation] = [] + if not isinstance(value, dict): + raise temporalio.converter.create_payload_validation_error( + [Violation(path="", reason="expected object")] + ) + raw = typing.cast("dict[str, typing.Any]", value) + + kind_value: typing.Literal["workflow", "activity", "standalone"] = typing.cast( + "typing.Any", None + ) + if "kind" not in raw or raw["kind"] is None: + violations.append(Violation(path="kind", reason="required")) + else: + kind_value_raw = raw["kind"] + if not isinstance(kind_value_raw, str): + violations.append(Violation(path="kind", reason="expected string")) + elif kind_value_raw not in ("workflow", "activity", "standalone"): + violations.append( + Violation( + path="kind", + reason=f'must be one of ["workflow", "activity", "standalone"], got {_quote(kind_value_raw)}', + ) + ) + else: + kind_value = kind_value_raw + + workflow_id_value: str | None = None + if "workflow_id" in raw: + workflow_id_value_raw = raw["workflow_id"] + if workflow_id_value_raw is None: + violations.append( + Violation(path="workflow_id", reason="explicit null not allowed") + ) + else: + if not isinstance(workflow_id_value_raw, str): + violations.append( + Violation(path="workflow_id", reason="expected string") + ) + else: + workflow_id_value = workflow_id_value_raw + + run_id_value: str | None = None + if "run_id" in raw: + run_id_value_raw = raw["run_id"] + if run_id_value_raw is None: + violations.append( + Violation(path="run_id", reason="explicit null not allowed") + ) + else: + if not isinstance(run_id_value_raw, str): + violations.append( + Violation(path="run_id", reason="expected string") + ) + else: + run_id_value = run_id_value_raw + + activity_id_value: str | None = None + if "activity_id" in raw: + activity_id_value_raw = raw["activity_id"] + if activity_id_value_raw is None: + violations.append( + Violation(path="activity_id", reason="explicit null not allowed") + ) + else: + if not isinstance(activity_id_value_raw, str): + violations.append( + Violation(path="activity_id", reason="expected string") + ) + else: + activity_id_value = activity_id_value_raw + + stream_id_value: str | None = None + if "stream_id" in raw: + stream_id_value_raw = raw["stream_id"] + if stream_id_value_raw is None: + violations.append( + Violation(path="stream_id", reason="explicit null not allowed") + ) + else: + if not isinstance(stream_id_value_raw, str): + violations.append( + Violation(path="stream_id", reason="expected string") + ) + else: + stream_id_value = stream_id_value_raw + + topic_value: str = typing.cast("typing.Any", None) + if "topic" not in raw or raw["topic"] is None: + violations.append(Violation(path="topic", reason="required")) + else: + topic_value_raw = raw["topic"] + if not isinstance(topic_value_raw, str): + violations.append(Violation(path="topic", reason="expected string")) + else: + topic_value = topic_value_raw + + for key in raw: + if ( + key != "kind" + and key != "workflow_id" + and key != "run_id" + and key != "activity_id" + and key != "stream_id" + and key != "topic" + ): + violations.append(Violation(path=key, reason="unknown field")) + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return StreamRef( + kind=kind_value, + workflow_id=workflow_id_value, + run_id=run_id_value, + activity_id=activity_id_value, + stream_id=stream_id_value, + topic=topic_value, + ) + + @typing_extensions.override + def to_transfer_type(self, value: "StreamRef") -> typing.Any: + violations: list[Violation] = [] + out: dict[str, typing.Any] = {} + if typing.cast("object", value.kind) not in ( + "workflow", + "activity", + "standalone", + ): + violations.append( + Violation( + path="kind", + reason=f'must be one of ["workflow", "activity", "standalone"], got {_quote(value.kind)}', + ) + ) + out["kind"] = value.kind + if value.workflow_id is not None: + out["workflow_id"] = value.workflow_id + if value.run_id is not None: + out["run_id"] = value.run_id + if value.activity_id is not None: + out["activity_id"] = value.activity_id + if value.stream_id is not None: + out["stream_id"] = value.stream_id + out["topic"] = value.topic + if violations: + raise temporalio.converter.create_payload_validation_error(violations) + return out + + +@_transfer_type_convertible(_StreamRefTransferTypeConverter) +@dataclasses.dataclass(slots=True, kw_only=True) +class StreamRef: + """A stream, named by its owner and a topic: what an operation returns to hand a stream + to its caller, and what read and append take in place of an owner spelled out. It + names no cursor and no store, so the same reference is good behind any endpoint that + serves the owner. + """ + + kind: typing.Literal["workflow", "activity", "standalone"] + """What owns the stream. A workflow's streams are keyed by workflow_id and, when + pinned, run_id. An activity's own streams are keyed by activity_id and, when a + workflow scheduled it, that workflow's ids. A standalone stream has its own + stream_id and no execution behind it. + """ + + workflow_id: str | None = None + """The owning workflow, or the workflow that scheduled the owning activity. Required + for a workflow owner. + """ + + run_id: str | None = None + """Pin the owner to this run. Absent follows the execution chain across + continue-as-new, which is what a producer normally wants. + """ + + activity_id: str | None = None + """The owning activity. Required for an activity owner.""" + + stream_id: str | None = None + """The stream's own id. Required for a standalone owner.""" + + topic: str + """The topic on the owner's stream.""" diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index dec565ea1..c22118f54 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -29,7 +29,17 @@ foreign one is refused by the store behind the endpoint and reaches the caller on the first read. -The handler keeps one parked read per ``(workflow, run, topic)`` and serves +Both operations address a stream by a reference, ``StreamRef`` on the wire: +the owner (a workflow, an activity, or a standalone stream), the ids that +name it, and the topic. The handler maps the reference onto the store's own +accessor for that owner and refuses an owner the store cannot host with +:class:`temporalio.streams.StreamUnsupportedError`, so a reference is good +behind any endpoint that serves the owner. The same reference is what an +operation of the application's own returns to hand a stream to its caller; +:meth:`NexusStreamHandle.ref` makes one and :meth:`NexusStreams.open` opens +it. + +The handler keeps one parked read per stream reference and serves consecutive calls from it, so an idle caller does not leave one abandoned long poll on the store per call. A call whose token does not match the parked position replaces the subscription, and an idle one is released after a @@ -40,7 +50,7 @@ producer attempt refuses to continue it rather than starting a fresh delegate whose numbering the store would drop as a repeat; the caller opens a new attempt, which readers report as a supersession. And any caller the endpoint -admits may touch any workflow's streams in the namespace; the endpoint's own +admits may touch any owner's streams in the namespace; the endpoint's own authorization is the boundary. A failure from the endpoint reaches the caller as the @@ -63,7 +73,7 @@ from collections.abc import AsyncGenerator, Awaitable, Callable, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, Generic, NoReturn, TypeVar, cast +from typing import Any, Generic, Literal, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler @@ -107,16 +117,24 @@ RecordWire, TemporalStreams, ) +from temporalio.streams.providers._nexus_generated import StreamRef as WireStreamRef __all__ = [ "NexusProducer", "NexusStreamHandle", "NexusStreams", "TemporalStreamsHandler", + "WireStreamRef", ] T = TypeVar("T") +_Kind = Literal["workflow", "activity", "standalone"] +# The reference's identity on the handler, topic included, so one parked read +# and one producer state key on exactly what the wire names. +_StreamKey = tuple[str, str, str, str, str, str] +_ProducerKey = tuple[_StreamKey, str, int] + _WORKFLOW_SIDE_ERROR = ( "the nexus provider is an outside transport; a worker publishes and reads " "through a storage provider, so give the worker one of those" @@ -192,6 +210,49 @@ def _require_topic(topic: str) -> None: raise ValueError("topic must not be empty") +def _check_ref(ref: WireStreamRef) -> None: + """Refuse a reference whose owner lacks the id that names it.""" + _require_topic(ref.topic) + if ref.kind == "workflow" and not ref.workflow_id: + raise ValueError("a stream reference with a workflow owner needs workflow_id") + if ref.kind == "activity" and not ref.activity_id: + raise ValueError("a stream reference with an activity owner needs activity_id") + if ref.kind == "standalone" and not ref.stream_id: + raise ValueError("a stream reference with a standalone owner needs stream_id") + + +def _stream_key(ref: WireStreamRef) -> _StreamKey: + return ( + ref.kind, + ref.workflow_id or "", + ref.run_id or "", + ref.activity_id or "", + ref.stream_id or "", + ref.topic, + ) + + +@dataclass(frozen=True) +class _Address: + """The owner a handle is bound to; a topic completes it into a reference.""" + + kind: _Kind + workflow_id: str | None = None + run_id: str | None = None + activity_id: str | None = None + stream_id: str | None = None + + def ref(self, topic: str) -> WireStreamRef: + return WireStreamRef( + kind=self.kind, + workflow_id=self.workflow_id, + run_id=self.run_id, + activity_id=self.activity_id, + stream_id=self.stream_id, + topic=topic, + ) + + def _handler_error(error: StreamError) -> nexusrpc.HandlerError: """Carry a stream condition across the endpoint under its own class name.""" kind = ( @@ -260,27 +321,46 @@ def __init__( """ self._provider = provider self._client = client - self._producers: OrderedDict[tuple[str, str, str, str, int], _ProducerState] = ( - OrderedDict() - ) + self._producers: OrderedDict[_ProducerKey, _ProducerState] = OrderedDict() self._max_producers = max_producers - self._subscriptions: dict[tuple[str, str, str], _Subscription] = {} + self._subscriptions: dict[_StreamKey, _Subscription] = {} # Held weakly, and by the call that is using one for as long as it # runs. A strong map would keep an entry per address ever read or # appended to, and nothing would ever reach it again. - self._read_locks: weakref.WeakValueDictionary[ - tuple[str, str, str], asyncio.Lock - ] = weakref.WeakValueDictionary() - self._append_locks: weakref.WeakValueDictionary[ - tuple[str, str, str, str, int], asyncio.Lock - ] = weakref.WeakValueDictionary() + self._read_locks: weakref.WeakValueDictionary[_StreamKey, asyncio.Lock] = ( + weakref.WeakValueDictionary() + ) + self._append_locks: weakref.WeakValueDictionary[_ProducerKey, asyncio.Lock] = ( + weakref.WeakValueDictionary() + ) self._subscription_idle = subscription_idle.total_seconds() - def _stream(self, workflow_id: str, run_id: str | None) -> StreamHandle: + def _stream(self, ref: WireStreamRef) -> StreamHandle: + """The store's handle for the owner ``ref`` names. + + Raises: + StreamUnsupportedError: The store has no accessor for that owner. + """ # A storage provider wants a client; the memory provider, which the # tests front, accepts none, so the cast only lies where it is unread. - return self._provider.get_stream_handle( - cast(Client, self._client), workflow_id, run_id=run_id or None + client = cast(Client, self._client) + if ref.kind == "workflow": + return self._provider.get_stream_handle( + client, cast(str, ref.workflow_id), run_id=ref.run_id or None + ) + if ref.kind == "activity": + return self._provider.get_activity_stream_handle( + client, + cast(str, ref.activity_id), + workflow_id=ref.workflow_id or None, + run_id=ref.run_id or None, + ) + # The provider protocol reaches a stream through its owning execution; + # a standalone stream has none, so no store behind the endpoint can be + # asked for it yet. + raise StreamUnsupportedError( + "the store behind the endpoint cannot host a standalone stream: a " + "provider addresses a stream by its owning workflow or activity" ) @nexusrpc.handler.sync_operation @@ -292,9 +372,10 @@ async def append( Raises: nexusrpc.HandlerError: ``BAD_REQUEST`` when the batch index or sequence does not continue the producer attempt, when the - attempt is one this handler has no state for, or when a - payload is not a serialized ``Payload``; ``NOT_FOUND`` when - the store has no such workflow. + attempt is one this handler has no state for, when a payload + is not a serialized ``Payload``, or when the store cannot host + the reference's owner; ``NOT_FOUND`` when the store has no + such owner. """ try: return await self._append(input) @@ -304,11 +385,9 @@ async def append( raise _bad_request(str(error)) from error async def _append(self, input: AppendInput) -> AppendOutput: - _require_topic(input.topic) - key = ( - input.workflow_id, - input.run_id or "", - input.topic, + _check_ref(input.stream) + key: _ProducerKey = ( + _stream_key(input.stream), input.producer_id, input.attempt, ) @@ -321,7 +400,7 @@ async def _append(self, input: AppendInput) -> AppendOutput: return await self._append_locked(input, key) async def _append_locked( - self, input: AppendInput, key: tuple[str, str, str, str, int] + self, input: AppendInput, key: _ProducerKey ) -> AppendOutput: state = self._producers.get(key) if state is None: @@ -335,8 +414,10 @@ async def _append_locked( f"at batch {input.batch_index} on a handler that has no state for " "it; open a new attempt" ) - delegate = self._stream(input.workflow_id, input.run_id).producer( - topic=input.topic, producer_id=input.producer_id, attempt=input.attempt + delegate = self._stream(input.stream).producer( + topic=input.stream.topic, + producer_id=input.producer_id, + attempt=input.attempt, ) state = _ProducerState(delegate, 0, 0, None) elif input.batch_index == state.batch_index: @@ -406,7 +487,8 @@ async def read( Raises: nexusrpc.HandlerError: ``BAD_REQUEST`` when the store refuses the - token, ``NOT_FOUND`` when it has no such workflow. + token or cannot host the reference's owner, ``NOT_FOUND`` when + it has no such owner. """ try: return await self._read(ctx, input) @@ -418,10 +500,11 @@ async def read( async def _read( self, ctx: nexusrpc.handler.StartOperationContext, input: ReadInput ) -> ReadOutput: - _require_topic(input.topic) - stream = self._stream(input.workflow_id, input.run_id) + _check_ref(input.stream) + topic = input.stream.topic + stream = self._stream(input.stream) if input.latest_only: - return ReadOutput(next_token=(await stream.latest(topic=input.topic)).token) + return ReadOutput(next_token=(await stream.latest(topic=topic)).token) max_records = ( _DEFAULT_MAX_RECORDS if input.max_records is None else input.max_records ) @@ -445,7 +528,7 @@ async def _read( "pass either after_token or last_n, not both: a token resumes a " "read and last_n starts one" ) - key = (input.workflow_id, input.run_id or "", input.topic) + key = _stream_key(input.stream) await self._expire_subscriptions() lock = self._read_locks.setdefault(key, asyncio.Lock()) async with lock: @@ -457,9 +540,7 @@ async def _read( ): if subscription is not None: await self._drop(key) - subscription = self._subscribe( - key, stream, input.topic, after, input.last_n - ) + subscription = self._subscribe(key, stream, topic, after, input.last_n) try: records, next_token = await self._drain(subscription, max_records, wait) except Exception: @@ -483,7 +564,7 @@ async def _read( def _subscribe( self, - key: tuple[str, str, str], + key: _StreamKey, stream: StreamHandle, topic: str, after: str, @@ -586,7 +667,7 @@ async def close(self) -> None: for key in list(self._subscriptions): await self._drop(key) - async def _drop(self, key: tuple[str, str, str]) -> None: + async def _drop(self, key: _StreamKey) -> None: subscription = self._subscriptions.pop(key, None) if subscription is None or subscription.pump is None: return @@ -748,17 +829,13 @@ class NexusProducer(Generic[T]): def __init__( self, front: _Front, - workflow_id: str, - run_id: str | None, - topic: str, + stream: WireStreamRef, producer_id: str, attempt: int, ) -> None: - """Bind this producer to ``topic`` on the workflow behind the endpoint.""" + """Bind this producer to the stream ``stream`` names behind the endpoint.""" self._front = front - self._workflow_id = workflow_id - self._run_id = run_id - self._topic = topic + self._stream = stream self._producer_id = producer_id self._attempt = attempt self._batch_index = 0 @@ -815,9 +892,7 @@ async def _call(self, payloads: list[Payload], *, finish: bool) -> AppendOutput: elif self._pending is not None: return await self._send(*self._pending) request = AppendInput( - workflow_id=self._workflow_id, - run_id=self._run_id, - topic=self._topic, + stream=self._stream, producer_id=self._producer_id, attempt=self._attempt, sequence=self._sequence, @@ -841,13 +916,12 @@ async def _send( class NexusStreamHandle: - """One workflow's stream through the endpoint, re-synthesizing supersession.""" + """One owner's stream through the endpoint, re-synthesizing supersession.""" - def __init__(self, front: _Front, workflow_id: str, run_id: str | None) -> None: - """Address ``workflow_id``'s stream, pinned to ``run_id`` when one is given.""" + def __init__(self, front: _Front, address: _Address) -> None: + """Address the owner ``address`` names; each call completes it with a topic.""" self._front = front - self._workflow_id = workflow_id - self._run_id = run_id + self._address = address def read( self, @@ -892,13 +966,12 @@ async def _read( ) token = after.token last_n = last + stream = self._address.ref(topic) while True: answer = await self._front.invoke( _READ_OPERATION, ReadInput( - workflow_id=self._workflow_id, - run_id=self._run_id, - topic=topic, + stream=stream, after_token=token, last_n=last_n, max_records=self._front.max_records, @@ -932,12 +1005,7 @@ async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor topic, _ = resolve_topic(topic) answer = await self._front.invoke( _READ_OPERATION, - ReadInput( - workflow_id=self._workflow_id, - run_id=self._run_id, - topic=topic, - latest_only=True, - ), + ReadInput(stream=self._address.ref(topic), latest_only=True), ReadOutput, timeout=_APPEND_TIMEOUT, ) @@ -955,7 +1023,7 @@ def producer( topic, _ = resolve_topic(topic) producer_id, attempt = producer_identity(producer_id, attempt) return NexusProducer( - self._front, self._workflow_id, self._run_id, topic, producer_id, attempt + self._front, self._address.ref(topic), producer_id, attempt ) @@ -1039,7 +1107,9 @@ def get_stream_handle( ``client`` is not used for transport: it resolves the endpoint's name and supplies the data converter when none was configured. """ - return NexusStreamHandle(_Front(self, client), workflow_id, run_id) + return NexusStreamHandle( + _Front(self, client), _Address("workflow", workflow_id, run_id) + ) def get_activity_stream_handle( self, @@ -1048,15 +1118,17 @@ def get_activity_stream_handle( *, workflow_id: str | None = None, run_id: str | None = None, - ) -> NoReturn: - """Refused: the endpoint's operations address a stream by workflow only. + ) -> NexusStreamHandle: + """A handle on the streams ``activity_id`` owns, through the endpoint. - Raises: - StreamUnsupportedError: Always. + The reference carries the activity owner across; whether the store + behind the endpoint can host it is the store's answer, and a refusal + reaches the caller as :class:`temporalio.streams.StreamUnsupportedError` + on the first call. """ - raise StreamUnsupportedError( - "the nexus provider cannot reach a stream an activity owns: the endpoint's " - "operations address a stream by workflow only" + return NexusStreamHandle( + _Front(self, client), + _Address("activity", workflow_id, run_id, activity_id), ) async def close(self) -> None: diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index 482335ed8..61660c861 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -38,21 +38,52 @@ services: output: { $ref: "#/$defs/ReadOutput" } $defs: - AppendInput: + StreamRef: type: object - description: "One append call: who is writing, where, and what." + description: >- + A stream, named by its owner and a topic: what an operation returns to + hand a stream to its caller, and what read and append take in place of + an owner spelled out. It names no cursor and no store, so the same + reference is good behind any endpoint that serves the owner. properties: + kind: + type: string + enum: [workflow, activity, standalone] + description: >- + What owns the stream. A workflow's streams are keyed by workflow_id + and, when pinned, run_id. An activity's own streams are keyed by + activity_id and, when a workflow scheduled it, that workflow's ids. + A standalone stream has its own stream_id and no execution behind + it. workflow_id: type: string - description: "The workflow whose stream is being written." + description: >- + The owning workflow, or the workflow that scheduled the owning + activity. Required for a workflow owner. run_id: type: string description: >- - The run to address. Empty addresses the workflow's execution chain, - which is what a producer normally wants. + Pin the owner to this run. Absent follows the execution chain + across continue-as-new, which is what a producer normally wants. + activity_id: + type: string + description: "The owning activity. Required for an activity owner." + stream_id: + type: string + description: "The stream's own id. Required for a standalone owner." topic: type: string - description: "The topic of the workflow's stream to append to." + description: "The topic on the owner's stream." + required: + - kind + - topic + additionalProperties: false + + AppendInput: + type: object + description: "One append call: who is writing, where, and what." + properties: + stream: { $ref: "#/$defs/StreamRef" } producer_id: type: string description: >- @@ -95,8 +126,7 @@ $defs: Write FINISH for this producer after the batch: it will write nothing more on the topic. Says nothing about the producer's outcome. required: - - workflow_id - - topic + - stream - producer_id - attempt - sequence @@ -120,17 +150,7 @@ $defs: type: object description: "One read call: where to resume from and how long to wait." properties: - workflow_id: - type: string - description: "The workflow whose stream is being read." - run_id: - type: string - description: >- - Pin the read to this run. Empty follows the workflow's execution - chain across continue-as-new. - topic: - type: string - description: "The topic of the workflow's stream to read." + stream: { $ref: "#/$defs/StreamRef" } after_token: type: string description: >- @@ -166,8 +186,7 @@ $defs: count. Refused alongside an after_token, which is how a read resumes. required: - - workflow_id - - topic + - stream additionalProperties: false RecordWire: diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 660aa6e3b..0d5a0f43b 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -4,12 +4,12 @@ provider's own handles, so these tests are the provider-hiding demonstration: nothing on the caller side names or could name the store. -The loop test runs over the server's Nexus HTTP ingress and is gated behind -``STREAMS_LIVE=nexus`` because it needs a dev server with an HTTP port and a -registered Nexus endpoint. Environment: ``TEMPORAL_ADDRESS`` (default -``localhost:7233``), ``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``), -and an endpoint named ``streams-e2e`` targeting task queue -``streams-handlers-e2e``. +The live tests run over the server's Nexus HTTP ingress and are gated behind +``STREAMS_LIVE=nexus`` because they need a dev server with an HTTP port. +Environment: ``TEMPORAL_ADDRESS`` (default ``localhost:7233``) and +``TEMPORAL_HTTP`` (default ``http://127.0.0.1:7243``). Each live test +registers its own Nexus endpoint through the operator service and deletes it +at the end. Everything else stands the endpoint up in this process, because what it checks is the bytes the caller puts on the wire and the handler's own rules. @@ -19,6 +19,7 @@ import asyncio import base64 +import contextlib import dataclasses import gc import http.client @@ -36,6 +37,11 @@ import temporalio.converter from temporalio.api.common.v1 import Payload +from temporalio.api.nexus.v1 import EndpointSpec, EndpointTarget +from temporalio.api.operatorservice.v1 import ( + CreateNexusEndpointRequest, + DeleteNexusEndpointRequest, +) from temporalio.client import Client from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( @@ -50,6 +56,7 @@ from temporalio.streams._wire import WireRecord from temporalio.streams.providers import nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput +from temporalio.streams.providers._nexus_generated import StreamRef as WireStreamRef from temporalio.streams.providers.memory import MemoryStreams from temporalio.streams.providers.nexus import ( NexusStreamHandle, @@ -67,30 +74,67 @@ reason="needs a live server and nexus endpoint; run with STREAMS_LIVE=nexus", ) -ENDPOINT = "streams-e2e" -HANDLER_TQ = "streams-handlers-e2e" APPEND_OPERATION = nexus._APPEND_OPERATION # pyright: ignore[reportPrivateUsage] READ_OPERATION = nexus._READ_OPERATION # pyright: ignore[reportPrivateUsage] INPUTS = "inputs" DECISIONS = "decisions" +async def _live_client() -> Client: + return await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) + + +def _live_front(endpoint: str) -> NexusStreams: + return NexusStreams( + endpoint=endpoint, + http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), + read_wait=timedelta(seconds=5), + ) + + +@contextlib.asynccontextmanager +async def _own_endpoint( + client: Client, name: str, task_queue: str +) -> AsyncIterator[str]: + """Register a Nexus endpoint routed to ``task_queue`` for one test's life.""" + created = await client.operator_service.create_nexus_endpoint( + CreateNexusEndpointRequest( + spec=EndpointSpec( + name=name, + target=EndpointTarget( + worker=EndpointTarget.Worker( + namespace=client.namespace, task_queue=task_queue + ) + ), + ) + ) + ) + try: + yield name + finally: + await client.operator_service.delete_nexus_endpoint( + DeleteNexusEndpointRequest( + id=created.endpoint.id, version=created.endpoint.version + ) + ) + + @live_only async def test_interface_loop_through_the_nexus_front(): # The workflow worker and the handler worker both use the storage # provider; only the caller goes through the front, and it names the # endpoint the way an operator does, by name. store = WorkflowStreamsProvider() - client = await Client.connect(os.environ.get("TEMPORAL_ADDRESS", "localhost:7233")) - front = NexusStreams( - endpoint=ENDPOINT, - http_address=os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243"), - read_wait=timedelta(seconds=5), - ) + client = await _live_client() workflow_id = f"streams-nexus-live-{uuid.uuid4().hex}" handler = TemporalStreamsHandler(store, client) + handler_tq = f"handlers-{workflow_id}" - async with Worker(client, task_queue=HANDLER_TQ, nexus_service_handlers=[handler]): + async with ( + _own_endpoint(client, workflow_id, handler_tq) as endpoint, + Worker(client, task_queue=handler_tq, nexus_service_handlers=[handler]), + ): + front = _live_front(endpoint) async with Worker( client, task_queue=f"tq-{workflow_id}", @@ -319,6 +363,10 @@ async def test_without_a_codec_the_same_records_go_out_in_the_clear( assert b"tuna" in _answered_bodies(answered) +def _ref(workflow_id: str, topic: str = INPUTS) -> WireStreamRef: + return WireStreamRef(kind="workflow", workflow_id=workflow_id, topic=topic) + + def _append( workflow_id: str, batch_index: int, @@ -328,8 +376,7 @@ def _append( ) -> AppendInput: converter = temporalio.converter.DataConverter.default.payload_converter return AppendInput( - workflow_id=workflow_id, - topic=INPUTS, + stream=_ref(workflow_id), producer_id="model", attempt=1, # Batches of one, numbered in step with the batch index unless a @@ -515,7 +562,7 @@ async def test_consecutive_reads_share_one_parked_subscription(): first = await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", topic=INPUTS, max_records=1, wait_ms=200), + ReadInput(stream=_ref("wf"), max_records=1, wait_ms=200), ) assert len(first.records) == 1 parked = handler._subscriptions # pyright: ignore[reportPrivateUsage] @@ -526,8 +573,7 @@ async def test_consecutive_reads_share_one_parked_subscription(): handler, READ_OPERATION, ReadInput( - workflow_id="wf", - topic=INPUTS, + stream=_ref("wf"), after_token=first.next_token, max_records=1, wait_ms=200, @@ -540,7 +586,7 @@ async def test_consecutive_reads_share_one_parked_subscription(): await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=200), + ReadInput(stream=_ref("wf"), wait_ms=200), ) assert len(parked) == 1 and next(iter(parked.values())).pump is not pump await handler.close() @@ -552,7 +598,7 @@ async def test_the_read_wait_is_cut_to_the_request_deadline(): started = asyncio.get_running_loop().time() answer = await handler.read( _context(READ_OPERATION, datetime.now(timezone.utc) + timedelta(seconds=1)), - ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=60000), + ReadInput(stream=_ref("wf"), wait_ms=60000), ) assert answer.records == [] and answer.next_token == "" and not answer.done assert asyncio.get_running_loop().time() - started < 5 @@ -711,7 +757,7 @@ async def test_a_failed_read_is_not_reported_as_the_end_of_the_stream(): .append({"n": 1}) ) - request = ReadInput(workflow_id="wf", topic=INPUTS, wait_ms=200, max_records=10) + request = ReadInput(stream=_ref("wf"), wait_ms=200, max_records=10) with pytest.raises(RuntimeError, match="the store went away"): await _dispatch(handler, READ_OPERATION, request) # The retry from the same token has to re-subscribe rather than be @@ -733,7 +779,7 @@ async def test_the_handler_does_not_grow_a_lock_per_address(): await _dispatch( handler, READ_OPERATION, - ReadInput(workflow_id=workflow_id, topic=INPUTS, wait_ms=0, max_records=1), + ReadInput(stream=_ref(workflow_id), wait_ms=0, max_records=1), ) gc.collect() # Held weakly, so an address nobody is reading or appending to leaves @@ -821,8 +867,7 @@ async def test_the_front_carries_every_read_start(monkeypatch: pytest.MonkeyPatc handler, READ_OPERATION, ReadInput( - workflow_id="wf-starts", - topic=INPUTS, + stream=_ref("wf-starts"), after_token=newest[0].cursor.token, last_n=1, ), @@ -831,12 +876,70 @@ async def test_the_front_carries_every_read_start(monkeypatch: pytest.MonkeyPatc await handler.close() -async def test_a_stream_an_activity_owns_is_refused(client: Client): - # The endpoint's operations address a stream by workflow, so the front has - # no way to reach one an activity owns. The refusal is the documented - # error, not an AttributeError or a stream silently put somewhere else. +async def test_an_activity_owner_crosses_the_endpoint(monkeypatch: pytest.MonkeyPatch): + # The reference carries the owner, so an activity's own stream is reached + # through the same two operations and lands on the store's activity + # accessor, apart from the workflow's topics of the same name. + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) front = _front(None) + own = front.get_activity_stream_handle(None, "act", workflow_id="wf") + await own.producer(topic=INPUTS, producer_id="model", attempt=1).append({"n": 1}) + records = await take(own.read(topic=INPUTS, result_type=dict), 1, timeout=30) + assert records[0].value == {"n": 1} + assert await _stored(store, "wf") == [] + stored = store.get_activity_stream_handle(None, "act", workflow_id="wf") + assert [r.value async for r in _take_data(stored, 1)] == [{"n": 1}] + await handler.close() + + +async def _take_data(stream: Any, count: int) -> AsyncIterator[Any]: + async for record in stream.read(topic=INPUTS, result_type=dict): + if record.kind is RecordKind.DATA: + yield record + count -= 1 + if count == 0: + return + + +async def test_an_owner_the_store_cannot_host_is_refused_under_its_own_class( + client: Client, monkeypatch: pytest.MonkeyPatch +): + # Whether an owner is supported is the store's answer, not the front's: + # the Workflow Streams store has no activity accessor, and its refusal + # reaches the caller as the class it raised. + handler = TemporalStreamsHandler(WorkflowStreamsProvider(), client) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + own = _front(None).get_activity_stream_handle(None, "act", workflow_id="wf") with pytest.raises(StreamUnsupportedError, match="activity"): - front.get_activity_stream_handle(client, "act") + await own.producer(topic=INPUTS, producer_id="model", attempt=1).append( + {"n": 1} + ) with pytest.raises(StreamUnsupportedError, match="activity"): - front.get_activity_stream_handle(client, "act", workflow_id="wf") + await take(own.read(topic=INPUTS), 1) + # No provider addresses a standalone stream yet, so that owner is refused + # for every store. + standalone = WireStreamRef(kind="standalone", stream_id="s-1", topic=INPUTS) + with pytest.raises(nexusrpc.HandlerError) as refused: + await _dispatch(handler, READ_OPERATION, ReadInput(stream=standalone)) + assert str(refused.value).startswith("StreamUnsupportedError: ") + await handler.close() + + +async def test_a_reference_missing_its_owner_id_is_the_callers_fault(): + handler = TemporalStreamsHandler(MemoryStreams(), None) + for ref in ( + WireStreamRef(kind="workflow", topic=INPUTS), + WireStreamRef(kind="activity", workflow_id="wf", topic=INPUTS), + WireStreamRef(kind="standalone", topic=INPUTS), + WireStreamRef(kind="workflow", workflow_id="wf", topic=""), + ): + with pytest.raises(nexusrpc.HandlerError) as failed: + await _dispatch(handler, READ_OPERATION, ReadInput(stream=ref)) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + with pytest.raises(nexusrpc.HandlerError) as failed: + request = _append("wf", 1, {"n": 1}) + request.stream = ref + await _dispatch(handler, APPEND_OPERATION, request) + assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST From 47f75c17f13ef29ca2f23e1272d5f1d1f7e75723 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:16:38 -0700 Subject: [PATCH 690/831] Mapped the server's typed refusals to the interface errors. A divergent or stale producer repeat is a StreamProducerError and a poll below the retention floor is a StreamCursorError, the fix the spec lists as pending. The server names each refusal with a reason token at the front of the message, so one function matches the status code and the token, keeps the phrases an older server sends, and leaves every other failure an RPCError. --- temporalio/client_stream.py | 69 +++++++++++++++++----- tests/test_client_stream_errors.py | 95 ++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 tests/test_client_stream_errors.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 55e924eda..babab6fc1 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -27,8 +27,10 @@ A failed call raises :class:`temporalio.streams.StreamNotFoundError` when the server answers ``NOT_FOUND``, :class:`temporalio.streams.StreamProducerError` when it refuses a producer -sequence it already holds, and :class:`temporalio.service.RPCError` -otherwise, never the transport's own exception type. +sequence it already holds, :class:`temporalio.streams.StreamCursorError` when +it refuses a read below the retention floor, and +:class:`temporalio.service.RPCError` otherwise, never the transport's own +exception type. :func:`translate_error` is the one place that decides. A failure sdk-core would retry is retried here, on the same codes and with the same default :class:`temporalio.service.RetryConfig`, because this channel is @@ -71,7 +73,11 @@ TLSConfig, __version__, ) -from temporalio.streams import StreamNotFoundError, StreamProducerError +from temporalio.streams import ( + StreamCursorError, + StreamNotFoundError, + StreamProducerError, +) if TYPE_CHECKING: from temporalio.client import Client @@ -87,17 +93,28 @@ "close_shared_clients", "shared_client", "shared_key", + "translate_error", ] _T = TypeVar("_T") logger = logging.getLogger(__name__) -# The server refuses a producer sequence it already holds with a message and -# no typed detail, so the phrase is the only thing to match on. Both refusals -# it sends carry it: a repeat with different content, and one behind the -# sequence it accepted last. -_PRODUCER_CONFLICT = "producer sequence" +# A refusal the caller has to act on is a FAILED_PRECONDITION whose message +# begins with a reason token and ": ", since the service carries no typed +# detail for these yet. A repeat with different content and one behind the +# sequence the server accepted last are both a producer error; a read below +# the retention floor is a cursor error. +_REASON_SEPARATOR = ": " +_REASONS: dict[str, type[Exception]] = { + "STREAM_PRODUCER_CONFLICT": StreamProducerError, + "STREAM_PRODUCER_STALE_SEQUENCE": StreamProducerError, + "STREAM_CURSOR_BELOW_FLOOR": StreamCursorError, +} +# The phrases a server built before the tokens existed sends for the same +# refusals, so a reader of either server gets the typed error. +_PRODUCER_PHRASE = "producer sequence" +_CURSOR_PHRASE = "below the stream's floor" # The codes sdk-core retries. _RETRYABLE = frozenset( @@ -457,17 +474,37 @@ def _to_public(record: stream.StreamRecord) -> StreamEntry: return StreamEntry(record=out, offset=record.offset) -def _translate(error: grpc.aio.AioRpcError) -> Exception: - code = error.code() - details = error.details() or code.name +def translate_error( + code: grpc.StatusCode, details: str, raw_status: bytes = b"" +) -> Exception: + """The SDK error for one failed call, from its status code and message. + + ``NOT_FOUND`` is :class:`temporalio.streams.StreamNotFoundError`. A + ``FAILED_PRECONDITION`` whose message begins with a reason token is the + error the token names: a producer refusal, a repeat with different content + or one behind the sequence the server accepted last, is + :class:`temporalio.streams.StreamProducerError`, because the caller asked + to be deduplicated and could not be; a read below the retention floor is + :class:`temporalio.streams.StreamCursorError`. Everything else is + :class:`temporalio.service.RPCError` with the code and the raw status. + """ + details = details or code.name if code is grpc.StatusCode.NOT_FOUND: return StreamNotFoundError(details) - if code is grpc.StatusCode.INVALID_ARGUMENT and _PRODUCER_CONFLICT in details: - # A producer sequence the store already holds, either with different - # content or behind the one it accepted last. The caller asked to be - # deduplicated and could not be, which is a condition of its own. + if code is grpc.StatusCode.FAILED_PRECONDITION: + token, separator, _ = details.partition(_REASON_SEPARATOR) + typed = _REASONS.get(token) if separator else None + if typed is not None: + return typed(details) + if _CURSOR_PHRASE in details: + return StreamCursorError(details) + if code is grpc.StatusCode.INVALID_ARGUMENT and _PRODUCER_PHRASE in details: return StreamProducerError(details) - return RPCError(details, RPCStatusCode(code.value[0]), _raw_status(error)) + return RPCError(details, RPCStatusCode(code.value[0]), raw_status) + + +def _translate(error: grpc.aio.AioRpcError) -> Exception: + return translate_error(error.code(), error.details() or "", _raw_status(error)) async def _call( diff --git a/tests/test_client_stream_errors.py b/tests/test_client_stream_errors.py new file mode 100644 index 000000000..ae0b452a6 --- /dev/null +++ b/tests/test_client_stream_errors.py @@ -0,0 +1,95 @@ +"""What a refused stream call raises. + +The service carries no typed detail for its refusals, so a typed one arrives +as a ``FAILED_PRECONDITION`` with a reason token at the front of the message. +These pin the mapping: each token to its error, the phrases an older server +sends to the same errors, and an unrelated message on the same code to a +plain ``RPCError`` that keeps the code. +""" + +from __future__ import annotations + +import grpc +import pytest + +from temporalio.client_stream import translate_error +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import ( + StreamCursorError, + StreamNotFoundError, + StreamProducerError, +) + + +@pytest.mark.parametrize( + "details", + [ + "STREAM_PRODUCER_CONFLICT: producer sequence 3 already used with different content", + "STREAM_PRODUCER_STALE_SEQUENCE: stale producer sequence 2, last accepted for " + 'producer "p" is 3', + ], +) +def test_a_producer_refusal_is_a_producer_error(details: str) -> None: + error = translate_error(grpc.StatusCode.FAILED_PRECONDITION, details) + assert isinstance(error, StreamProducerError) + assert str(error) == details + + +def test_an_older_servers_producer_refusal_is_a_producer_error() -> None: + # Before the tokens the refusal was an INVALID_ARGUMENT with the phrase. + details = 'stale producer sequence 2, last accepted for producer "p" is 3' + error = translate_error(grpc.StatusCode.INVALID_ARGUMENT, details) + assert isinstance(error, StreamProducerError) + + +@pytest.mark.parametrize( + "details", + [ + "STREAM_CURSOR_BELOW_FLOOR: offset 2 is below the stream's floor of 5", + "offset 2 is below the stream's floor of 5", + ], +) +def test_a_read_below_the_floor_is_a_cursor_error(details: str) -> None: + error = translate_error(grpc.StatusCode.FAILED_PRECONDITION, details) + assert isinstance(error, StreamCursorError) + assert str(error) == details + + +def test_not_found_is_a_not_found_error() -> None: + error = translate_error(grpc.StatusCode.NOT_FOUND, "no stream with id 's'") + assert isinstance(error, StreamNotFoundError) + + +def test_an_unrelated_message_keeps_its_code() -> None: + # The same codes with another message are the server's ordinary refusals. + for code, expected in [ + (grpc.StatusCode.INVALID_ARGUMENT, RPCStatusCode.INVALID_ARGUMENT), + (grpc.StatusCode.FAILED_PRECONDITION, RPCStatusCode.FAILED_PRECONDITION), + (grpc.StatusCode.UNAVAILABLE, RPCStatusCode.UNAVAILABLE), + ]: + error = translate_error(code, "stream is closed", b"raw") + assert type(error) is RPCError + assert error.status == expected + assert error.raw_grpc_status == b"raw" + assert str(error) == "stream is closed" + + +def test_a_token_needs_its_code_and_its_separator() -> None: + # A token on another code is prose, and so is one with no ": " after it. + error = translate_error( + grpc.StatusCode.INVALID_ARGUMENT, "STREAM_PRODUCER_CONFLICT: elsewhere" + ) + assert type(error) is RPCError + error = translate_error( + grpc.StatusCode.FAILED_PRECONDITION, "STREAM_CURSOR_BELOW_FLOOR" + ) + assert type(error) is RPCError + error = translate_error( + grpc.StatusCode.FAILED_PRECONDITION, "STREAM_SOMETHING_ELSE: unknown token" + ) + assert type(error) is RPCError + + +def test_an_empty_message_reads_as_the_code() -> None: + error = translate_error(grpc.StatusCode.UNAVAILABLE, "") + assert str(error) == "UNAVAILABLE" From defaf5c061ead0820a48e3e162e8e2c71fa76bd3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:20:46 -0700 Subject: [PATCH 691/831] Stamped every native record with the hash of its plaintext body. The server deduplicated a producer's repeat on the encoded bytes, so a codec with a fresh nonce per call made every retry look divergent. The provider now puts the hex SHA-256 of the converted body under temporal.io/content-hash in the record's metadata, before the codec on the outside path and before the worker's payload pass on the workflow path; the server dedupes on it when present. The live nonce-codec case needs a server with that dedupe. --- temporalio/streams/providers/native.py | 29 ++- tests/streams/test_native_fingerprint.py | 116 +++++++++++ .../test_workflow_stream_payloads_e2e.py | 184 ++++++++++++++++++ 3 files changed, 326 insertions(+), 3 deletions(-) create mode 100644 tests/streams/test_native_fingerprint.py create mode 100644 tests/worker/test_workflow_stream_payloads_e2e.py diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 751489727..0a420c76c 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -31,11 +31,13 @@ from __future__ import annotations +import hashlib import logging from collections.abc import AsyncGenerator from typing import Any, Generic, TypeVar from temporalio import workflow +from temporalio.api.common.v1 import Payload from temporalio.api.stream.v1 import StreamStartPosition from temporalio.client import Client, WorkflowHistoryEventFilterType from temporalio.client_stream import ( @@ -71,6 +73,7 @@ from temporalio.streams.providers import ProviderPlugin __all__ = [ + "CONTENT_HASH_KEY", "NativeActivityStreamHandle", "NativeProducer", "NativeStreamHandle", @@ -81,6 +84,9 @@ _PROVIDER = "native" +CONTENT_HASH_KEY = "temporal.io/content-hash" +"""The record metadata key carrying the hex SHA-256 of the plaintext body.""" + logger = logging.getLogger(__name__) @@ -110,6 +116,22 @@ def _position(after: Cursor) -> tuple[str, int] | None: ) from None +def _fingerprint(record: WireRecord) -> WireRecord: + """Stamp ``record`` with the hash of its body as converted, before a codec or offload. + + The server deduplicates a producer's repeat on this when present, so a + codec that encrypts with a fresh nonce per call cannot turn a retry into + a divergent write. A record without a body has nothing to compare. + """ + if not record.HasField("body"): + return record + digest = hashlib.sha256(record.body.SerializeToString()).hexdigest() + record.metadata[CONTENT_HASH_KEY].CopyFrom( + Payload(metadata={"encoding": b"binary/plain"}, data=digest.encode()) + ) + return record + + async def _encode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: # The worker's payload visitor runs a codec over the bodies a workflow # publishes and receives; the outside half has no such pass, so it applies @@ -169,8 +191,9 @@ def __init__(self, topic: str) -> None: def publish(self, record: WireRecord) -> None: # Held by the runtime until the task completes, when the task's # records on this topic become one command the server applies with - # the task: rule 1 through the server's own commit. - workflow._append_stream_records([record], stream_name=self._topic) + # the task: rule 1 through the server's own commit. The body is still + # plaintext here; the worker's payload pass runs after the task. + workflow._append_stream_records([_fingerprint(record)], stream_name=self._topic) class _NativeWorkflowProvider: @@ -311,7 +334,7 @@ async def _write(self, records: list[WireRecord]) -> Cursor: if not self._handle.owner_run_id: self._handle.pin(await self._pin()) for record in records: - await _encode_body(self._codec, record) + await _encode_body(self._codec, _fingerprint(record)) appended = await self._handle.append( *records, producer_id=self._writer, sequence=self._sequence ) diff --git a/tests/streams/test_native_fingerprint.py b/tests/streams/test_native_fingerprint.py new file mode 100644 index 000000000..0134b379a --- /dev/null +++ b/tests/streams/test_native_fingerprint.py @@ -0,0 +1,116 @@ +"""The native provider stamps every body with the hash of its plaintext. + +The server deduplicates a producer's repeat on that hash when it is present, +so a codec that encrypts with a fresh nonce per call cannot turn a retry into +a divergent write. These pin where the stamp is taken: over the body as the +payload converter produced it, before the codec on the outside path and before +the worker's payload pass on the workflow path. +""" + +from __future__ import annotations + +import hashlib +from collections.abc import Sequence +from typing import Any + +import pytest + +import temporalio.converter +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord +from temporalio.client_stream import Appended +from temporalio.converter import PayloadCodec +from temporalio.streams.providers import native +from temporalio.streams.providers.native import CONTENT_HASH_KEY, NativeProducer + + +class _NonceCodec(PayloadCodec): + """Encodes to something different every time, like a nonce-based cipher.""" + + def __init__(self) -> None: + self.calls = 0 + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + self.calls += 1 + return [ + Payload( + metadata={"encoding": b"binary/nonce"}, + data=f"{self.calls}:".encode() + p.data, + ) + for p in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [Payload(data=p.data.split(b":", 1)[1]) for p in payloads] + + +class _Handle: + """Records what a producer appends and answers as the server would.""" + + def __init__(self) -> None: + self.owner_run_id = "run" + self.appended: list[StreamRecord] = [] + + async def append(self, *records: StreamRecord, **_: Any) -> Appended: + self.appended.extend(records) + return Appended(first_offset=0, next_offset=len(records), count=len(records)) + + +def _plaintext_hash(value: Any) -> bytes: + payload = temporalio.converter.default().payload_converter.to_payloads([value])[0] + return hashlib.sha256(payload.SerializeToString()).hexdigest().encode() + + +async def test_an_outside_append_is_stamped_before_the_codec() -> None: + handle: Any = _Handle() + codec = _NonceCodec() + converter = temporalio.converter.default().payload_converter + producer: NativeProducer[Any] = NativeProducer( + handle, None, codec, converter, "t", "p", 1 + ) + + await producer.append({"n": 1}) + await producer.append({"n": 1}) + + first, second = handle.appended + # The bodies went out differently encoded and the stamps agree anyway. + assert first.body.data != second.body.data + assert first.metadata[CONTENT_HASH_KEY].data == _plaintext_hash({"n": 1}) + assert second.metadata[CONTENT_HASH_KEY].data == _plaintext_hash({"n": 1}) + assert first.metadata[CONTENT_HASH_KEY].metadata["encoding"] == b"binary/plain" + + +async def test_a_finish_record_carries_no_stamp() -> None: + handle: Any = _Handle() + converter = temporalio.converter.default().payload_converter + producer: NativeProducer[Any] = NativeProducer( + handle, None, None, converter, "t", "p", 1 + ) + await producer.finish() + (record,) = handle.appended + assert CONTENT_HASH_KEY not in record.metadata + + +def test_a_workflow_publish_is_stamped_on_the_workflow_thread( + monkeypatch: pytest.MonkeyPatch, +) -> None: + staged: list[StreamRecord] = [] + + def stage(records: Sequence[StreamRecord], *, stream_name: str) -> None: + assert stream_name == "t" + staged.extend(records) + + monkeypatch.setattr(workflow, "_append_stream_records", stage) + converter = temporalio.converter.default().payload_converter + body = converter.to_payloads([{"n": 2}])[0] + record = StreamRecord(topic="t", body=body) + + native._NativeWriteSink("t").publish(record) + + (stamped,) = staged + assert stamped.metadata[CONTENT_HASH_KEY].data == _plaintext_hash({"n": 2}) + # Two publishes of the same value stamp the same, which is what replay + # reissues. + native._NativeWriteSink("t").publish(StreamRecord(topic="t", body=body)) + assert staged[1].metadata[CONTENT_HASH_KEY] == stamped.metadata[CONTENT_HASH_KEY] diff --git a/tests/worker/test_workflow_stream_payloads_e2e.py b/tests/worker/test_workflow_stream_payloads_e2e.py new file mode 100644 index 000000000..97357a0d5 --- /dev/null +++ b/tests/worker/test_workflow_stream_payloads_e2e.py @@ -0,0 +1,184 @@ +"""How a body's encoding meets the server: retry identity and external storage. + +A payload codec and an ``ExternalStorage`` driver both change the bytes a body +is stored as. The server must still recognize a retry, and a driver must be +applied on both halves of the native provider. Needs a Temporal server built +from the AI-198 branch: + + TEMPORAL_STREAM_TARGET=127.0.0.1:7333 uv run pytest tests/worker/test_workflow_stream_payloads_e2e.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid +from collections.abc import Sequence +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.api.common.v1 import Payload +from temporalio.client import Client +from temporalio.client_stream import StreamClient +from temporalio.converter import DataConverter, PayloadCodec +from temporalio.streams import RecordKind +from temporalio.streams.providers.native import CONTENT_HASH_KEY, NativeStreams +from temporalio.worker import Worker +from tests.streams.test_streams_conformance import take + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream commands", +) + +INPUTS = "inputs" +DECISIONS = "decisions" + + +class _NonceCodec(PayloadCodec): + """Encodes to different bytes on every call, as a nonce-based cipher does. + + The plaintext is kept in the clear behind a counter so the test can read + the stored bytes back and see that two encodings of one value differ. + """ + + def __init__(self) -> None: + self.calls = 0 + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + self.calls += 1 + return [ + Payload( + metadata={"encoding": b"binary/nonce"}, + data=f"{self.calls}:".encode() + p.SerializeToString(), + ) + for p in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + out: list[Payload] = [] + for p in payloads: + if p.metadata.get("encoding", b"") != b"binary/nonce": + out.append(p) + continue + out.append(Payload.FromString(p.data.split(b":", 1)[1])) + return out + + +@workflow.defn +class Echo: + """Reads ``inputs`` and publishes each value on ``decisions``, until told to stop.""" + + def __init__(self) -> None: + self._stop = False + + @workflow.signal + def stop(self) -> None: + self._stop = True + + @workflow.run + async def run(self, count: int) -> list[Any]: + inputs = workflow.stream_reader(INPUTS, result_type=dict) + decisions = workflow.stream_writer(DECISIONS) + seen: list[Any] = [] + async for value in inputs.values(): + decisions.publish({"echo": value}) + seen.append(value) + if len(seen) >= count: + break + decisions.finish() + await workflow.wait_condition(lambda: self._stop) + return seen + + +async def _connect(converter: DataConverter, provider: NativeStreams) -> Client: + plain = await Client.connect(TARGET or "") + config = plain.config() + config["data_converter"] = converter + config["plugins"] = [provider] + return Client(**config) + + +async def test_a_retried_append_under_a_nonce_codec_is_deduplicated() -> None: + """Retry identity is the plaintext hash, not the encoded bytes. + + Two producers with the same identity append the same value at the same + sequence, as a retry after a lost response would. The codec encodes each + differently, so the server sees two different bodies and one hash, and + writes the record once. + """ + provider = NativeStreams() + client = await _connect(DataConverter(payload_codec=_NonceCodec()), provider) + raw = StreamClient.connect(TARGET or "") + task_queue = "nonce-tq-" + uuid.uuid4().hex[:8] + workflow_id = "nonce-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker(client, task_queue=task_queue, workflows=[Echo]): + handle = await client.start_workflow( + Echo.run, 1, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + first = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + retry = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + landed = await first.append({"n": 1}) + again = await retry.append({"n": 1}) + assert again == landed, "the repeat answers with the original position" + + echoed = await take(stream.read(topic=DECISIONS, result_type=dict), 1) + assert [r.value for r in echoed] == [{"echo": {"n": 1}}] + await handle.signal(Echo.stop) + assert await asyncio.wait_for(handle.result(), 60) == [{"n": 1}] + + run_id = (await handle.describe()).run_id + assert run_id is not None + page = await raw.workflow_stream(workflow_id, INPUTS, owner_run_id=run_id).poll( + from_offset=0, wait=False + ) + bodies = [e.record for e in page.entries if e.record.HasField("body")] + assert len(bodies) == 1, "written once" + assert bodies[0].body.metadata["encoding"] == b"binary/nonce" + assert bodies[0].metadata[CONTENT_HASH_KEY].data + finally: + await raw.close() + await provider.close() + + +async def test_a_workflow_publish_carries_the_plaintext_hash() -> None: + """The workflow's own records are stamped too, from the workflow thread.""" + provider = NativeStreams() + client = await _connect(DataConverter.default, provider) + raw = StreamClient.connect(TARGET or "") + task_queue = "stamp-tq-" + uuid.uuid4().hex[:8] + workflow_id = "stamp-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker(client, task_queue=task_queue, workflows=[Echo]): + handle = await client.start_workflow( + Echo.run, 1, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + await stream.producer(topic=INPUTS, producer_id="tool", attempt=1).append( + {"n": 7} + ) + await take(stream.read(topic=DECISIONS, result_type=dict), 1) + await handle.signal(Echo.stop) + await asyncio.wait_for(handle.result(), 60) + + run_id = (await handle.describe()).run_id + assert run_id is not None + page = await raw.workflow_stream( + workflow_id, DECISIONS, owner_run_id=run_id + ).poll(from_offset=0, wait=False) + kinds = {e.record.kind for e in page.entries} + assert len(page.entries) == 2, "one decision and the finish" + data = [e.record for e in page.entries if e.record.HasField("body")] + assert len(data) == 1 and data[0].metadata[CONTENT_HASH_KEY].data + finish = [e.record for e in page.entries if not e.record.HasField("body")] + assert CONTENT_HASH_KEY not in finish[0].metadata + assert RecordKind.FINISH in {RecordKind(k) for k in kinds} + finally: + await raw.close() + await provider.close() From 0ee2aaa35d826be4aecea6006cab272cee5556a1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:26:01 -0700 Subject: [PATCH 692/831] Routed native stream bodies through the client's data converter. The outside half applied the payload codec alone, so an ExternalStorage driver on the client never saw a stream body and a body the worker offloaded could not be read back. Encode and decode now run the codec and the external store in the worker's order, an offloaded body is stored under the owning execution, and the fingerprint is taken before either. --- temporalio/streams/providers/native.py | 81 +++++++++++++------ tests/streams/test_native_fingerprint.py | 18 +++-- .../test_workflow_stream_payloads_e2e.py | 70 +++++++++++++++- 3 files changed, 139 insertions(+), 30 deletions(-) diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 0a420c76c..70a0de6a5 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -33,7 +33,7 @@ import hashlib import logging -from collections.abc import AsyncGenerator +from collections.abc import AsyncGenerator, Callable from typing import Any, Generic, TypeVar from temporalio import workflow @@ -49,7 +49,11 @@ shared_client, shared_key, ) -from temporalio.converter import PayloadCodec, PayloadConverter +from temporalio.converter import ( + DataConverter, + StorageDriverStoreContext, + StorageDriverWorkflowInfo, +) from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import StreamCursorError, StreamNotFoundError from temporalio.streams._provider import ReadSource, WriteSink @@ -132,21 +136,24 @@ def _fingerprint(record: WireRecord) -> WireRecord: return record -async def _encode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: - # The worker's payload visitor runs a codec over the bodies a workflow - # publishes and receives; the outside half has no such pass, so it applies - # the client's codec here or the two sides would not agree. - if codec is None or not record.HasField("body"): +async def _encode_body(converter: DataConverter, record: WireRecord) -> WireRecord: + # The worker's payload pass runs the codec and then the external store over + # the bodies a workflow publishes and receives; the outside half has no such + # pass, so it applies the client's data converter here in the same order, + # or the two sides would not agree. + if not record.HasField("body"): return record - encoded = await codec.encode([record.body]) - record.body.CopyFrom(encoded[0]) + encoded = await converter._encode_payload_sequence([record.body]) + stored = await converter._external_store_payload_sequence(encoded) + record.body.CopyFrom(stored[0]) return record -async def _decode_body(codec: PayloadCodec | None, record: WireRecord) -> WireRecord: - if codec is None or not record.HasField("body"): +async def _decode_body(converter: DataConverter, record: WireRecord) -> WireRecord: + if not record.HasField("body"): return record - decoded = await codec.decode([record.body]) + retrieved = await converter._external_retrieve_payload_sequence([record.body]) + decoded = await converter._decode_payload_sequence(retrieved) record.body.CopyFrom(decoded[0]) return record @@ -249,17 +256,24 @@ def __init__( self, handle: WorkflowStreamHandle, pin: Any, - codec: PayloadCodec | None, - converter: PayloadConverter, + converter: DataConverter, + store_target: Callable[[str], StorageDriverWorkflowInfo], topic: str, producer_id: str, attempt: int, ) -> None: - """Bind this producer to ``topic`` on the stream ``handle`` names.""" + """Bind this producer to ``topic`` on the stream ``handle`` names. + + ``converter`` is the client's data converter, applied to every body + as the worker applies it to a workflow's own records. ``store_target`` + names the execution an offloaded body is stored under, given the run + the producer pinned. + """ self._handle = handle self._pin = pin - self._codec = codec self._converter = converter + self._store_target = store_target + self._bound: DataConverter | None = None self._topic = topic self._producer_id = producer_id self._attempt = attempt @@ -301,7 +315,7 @@ async def append(self, *values: T) -> Cursor: return await self._write( [ to_wire( - self._converter, + self._converter.payload_converter, topic=self._topic, kind=RecordKind.DATA, value=value, @@ -318,7 +332,7 @@ async def finish(self) -> None: await self._write( [ to_wire( - self._converter, + self._converter.payload_converter, topic=self._topic, kind=RecordKind.FINISH, producer_id=self._producer_id, @@ -333,8 +347,16 @@ async def _write(self, records: list[WireRecord]) -> Cursor: # out names the run its records landed in. if not self._handle.owner_run_id: self._handle.pin(await self._pin()) + if self._bound is None: + # An offloaded body is stored under the execution that owns the + # stream, as the worker stores a workflow's own. + self._bound = self._converter._with_store_context( + StorageDriverStoreContext( + target=self._store_target(self._handle.owner_run_id) + ) + ) for record in records: - await _encode_body(self._codec, _fingerprint(record)) + await _encode_body(self._bound, _fingerprint(record)) appended = await self._handle.append( *records, producer_id=self._writer, sequence=self._sequence ) @@ -363,8 +385,8 @@ def __init__( self._workflow_id = workflow_id self._run_id = run_id self._opened = set() if opened is None else opened + self._data_converter = client.data_converter self._converter = client.data_converter.payload_converter - self._codec = client.data_converter.payload_codec self._streams: StreamClient | None = None def _service(self) -> StreamClient: @@ -443,7 +465,7 @@ async def _read( ) start = None for entry in page.entries: - record = await _decode_body(self._codec, entry.record) + record = await _decode_body(self._data_converter, entry.record) for out in decoder.decode(_cursor(run_id, entry.offset), record): yield out offset = page.next_offset @@ -507,13 +529,19 @@ def producer( return NativeProducer( self._stream(topic, self._run_id or ""), self._current_run, - self._codec, - self._converter, + self._data_converter, + self._store_target, topic, producer_id, attempt, ) + def _store_target(self, run_id: str) -> StorageDriverWorkflowInfo: + """The execution an offloaded body of this owner's stream is stored under.""" + return StorageDriverWorkflowInfo( + namespace=self._client.namespace, id=self._workflow_id, run_id=run_id + ) + async def _current_run(self) -> str: try: description = await self._client.get_workflow_handle( @@ -597,6 +625,13 @@ def _stream(self, topic: str, run_id: str) -> WorkflowStreamHandle: self._activity_id, topic, workflow_id=self._workflow_id, run_id=run_id ) + def _store_target(self, run_id: str) -> StorageDriverWorkflowInfo: + # A workflow's activity stores under that workflow, as the worker does + # for its activities; a standalone activity has no workflow to name. + if self._workflow_id: + return super()._store_target(run_id) + return StorageDriverWorkflowInfo(namespace=self._client.namespace) + async def _current_run(self) -> str: if self._workflow_id: return await super()._current_run() diff --git a/tests/streams/test_native_fingerprint.py b/tests/streams/test_native_fingerprint.py index 0134b379a..a66c4c79f 100644 --- a/tests/streams/test_native_fingerprint.py +++ b/tests/streams/test_native_fingerprint.py @@ -20,7 +20,11 @@ from temporalio.api.common.v1 import Payload from temporalio.api.stream.v1 import StreamRecord from temporalio.client_stream import Appended -from temporalio.converter import PayloadCodec +from temporalio.converter import ( + DataConverter, + PayloadCodec, + StorageDriverWorkflowInfo, +) from temporalio.streams.providers import native from temporalio.streams.providers.native import CONTENT_HASH_KEY, NativeProducer @@ -62,12 +66,15 @@ def _plaintext_hash(value: Any) -> bytes: return hashlib.sha256(payload.SerializeToString()).hexdigest().encode() +def _target(_run_id: str) -> StorageDriverWorkflowInfo: + return StorageDriverWorkflowInfo(namespace="ns", id="wf") + + async def test_an_outside_append_is_stamped_before_the_codec() -> None: handle: Any = _Handle() - codec = _NonceCodec() - converter = temporalio.converter.default().payload_converter + converter = DataConverter(payload_codec=_NonceCodec()) producer: NativeProducer[Any] = NativeProducer( - handle, None, codec, converter, "t", "p", 1 + handle, None, converter, _target, "t", "p", 1 ) await producer.append({"n": 1}) @@ -83,9 +90,8 @@ async def test_an_outside_append_is_stamped_before_the_codec() -> None: async def test_a_finish_record_carries_no_stamp() -> None: handle: Any = _Handle() - converter = temporalio.converter.default().payload_converter producer: NativeProducer[Any] = NativeProducer( - handle, None, None, converter, "t", "p", 1 + handle, None, DataConverter.default, _target, "t", "p", 1 ) await producer.finish() (record,) = handle.appended diff --git a/tests/worker/test_workflow_stream_payloads_e2e.py b/tests/worker/test_workflow_stream_payloads_e2e.py index 97357a0d5..fd300d512 100644 --- a/tests/worker/test_workflow_stream_payloads_e2e.py +++ b/tests/worker/test_workflow_stream_payloads_e2e.py @@ -20,13 +20,20 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload +from temporalio.api.sdk.v1.external_storage_pb2 import ExternalStorageReference from temporalio.client import Client from temporalio.client_stream import StreamClient -from temporalio.converter import DataConverter, PayloadCodec +from temporalio.converter import ( + DataConverter, + ExternalStorage, + JSONProtoPayloadConverter, + PayloadCodec, +) from temporalio.streams import RecordKind from temporalio.streams.providers.native import CONTENT_HASH_KEY, NativeStreams from temporalio.worker import Worker from tests.streams.test_streams_conformance import take +from tests.test_extstore import InMemoryTestDriver TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -182,3 +189,64 @@ async def test_a_workflow_publish_carries_the_plaintext_hash() -> None: finally: await raw.close() await provider.close() + + +async def test_external_storage_applies_on_both_halves() -> None: + """A ``StorageDriver`` on the client offloads stream bodies on both paths. + + Every body is over the threshold. The outside producer's append is stored + through the driver before it reaches the server; the workflow retrieves it + on its task, publishes, and the worker's payload pass offloads that too, off + the workflow thread, so the outside reader retrieves it. Read raw, the + server holds references on both topics and no plaintext. + """ + driver = InMemoryTestDriver() + converter = DataConverter( + external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=0) + ) + provider = NativeStreams() + client = await _connect(converter, provider) + raw = StreamClient.connect(TARGET or "") + task_queue = "offload-tq-" + uuid.uuid4().hex[:8] + workflow_id = "offload-wf-" + uuid.uuid4().hex[:8] + try: + async with Worker(client, task_queue=task_queue, workflows=[Echo]): + handle = await client.start_workflow( + Echo.run, 1, id=workflow_id, task_queue=task_queue + ) + stream = client.get_stream_handle(workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": "plaintext-marker"}) + stores_after_append = driver._store_calls + assert stores_after_append >= 1, "the outside append offloaded" + + echoed = await take(stream.read(topic=DECISIONS, result_type=dict), 1) + assert [r.value for r in echoed] == [{"echo": {"n": "plaintext-marker"}}] + await handle.signal(Echo.stop) + assert await asyncio.wait_for(handle.result(), 60) == [ + {"n": "plaintext-marker"} + ] + + run_id = (await handle.describe()).run_id + assert run_id is not None + for topic in (INPUTS, DECISIONS): + page = await raw.workflow_stream( + workflow_id, topic, owner_run_id=run_id + ).poll(from_offset=0, wait=False) + bodies = [e.record.body for e in page.entries if e.record.HasField("body")] + assert len(bodies) == 1, topic + assert b"plaintext-marker" not in bodies[0].data, topic + reference = JSONProtoPayloadConverter().from_payload( + bodies[0], ExternalStorageReference + ) + assert reference.driver_name == driver.name(), topic + # The workflow's publish was offloaded by the worker, after the append. + assert driver._store_calls > stores_after_append + # Both halves retrieved: the worker on its task and the outside reader. + assert driver._retrieve_calls >= 2 + # The outside append was stored under the workflow that owns the stream. + targets = [ctx.target for ctx in driver._store_contexts if ctx.target] + assert any(t.id == workflow_id and t.run_id == run_id for t in targets) + finally: + await raw.close() + await provider.close() From 60fd7eca8466ffa2768893906082b553cf5797ea Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:28:35 -0700 Subject: [PATCH 693/831] Kept the declared content hash out of the worker's payload pass. The payload visitor walks a stream record's metadata payloads like any other, so a codec encrypted the hash a workflow publish declared and an external store could offload it. The server reads that value as sent and refuses one that is not hex, which would have failed the workflow's own append. The key and the digest now live in the streams wire module, where both halves and the worker read them. --- temporalio/streams/_wire.py | 18 +++++++++++ temporalio/streams/providers/native.py | 13 ++++---- temporalio/worker/_command_aware_visitor.py | 14 +++++++++ tests/streams/test_native_fingerprint.py | 31 ++++++++++++++++++- .../test_workflow_stream_payloads_e2e.py | 3 +- 5 files changed, 70 insertions(+), 9 deletions(-) diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py index 4913cc308..7f9818ace 100644 --- a/temporalio/streams/_wire.py +++ b/temporalio/streams/_wire.py @@ -14,10 +14,12 @@ from __future__ import annotations +import hashlib from collections.abc import Callable from typing import Any import temporalio.converter +from temporalio.api.common.v1 import Payload from temporalio.api.stream.v1 import StreamRecord as WireRecord from temporalio.api.stream.v1 import StreamRecordKind from temporalio.streams._errors import StreamCursorError @@ -25,8 +27,10 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord __all__ = [ + "CONTENT_HASH_KEY", "RecordDecoder", "WireRecord", + "content_hash", "cursor_position", "from_wire", "mint_cursor", @@ -34,6 +38,20 @@ "to_wire", ] +CONTENT_HASH_KEY = "temporal.io/content-hash" +"""The record metadata key under which a producer declares its body's identity. + +The value is the lowercase hex SHA-256 of the body as the payload converter +produced it, before any codec or offload, so a store can tell a retry from a +divergent repeat whatever the encoding did to the bytes. It is read as sent: +nothing may encode or offload this one metadata payload. +""" + + +def content_hash(body: Payload) -> str: + """The lowercase hex SHA-256 of ``body`` as converted.""" + return hashlib.sha256(body.SerializeToString()).hexdigest() + def to_wire( converter: temporalio.converter.PayloadConverter, diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 70a0de6a5..8311cf0b1 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -31,7 +31,6 @@ from __future__ import annotations -import hashlib import logging from collections.abc import AsyncGenerator, Callable from typing import Any, Generic, TypeVar @@ -67,8 +66,10 @@ ) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( + CONTENT_HASH_KEY, RecordDecoder, WireRecord, + content_hash, cursor_position, mint_cursor, producer_identity, @@ -77,7 +78,6 @@ from temporalio.streams.providers import ProviderPlugin __all__ = [ - "CONTENT_HASH_KEY", "NativeActivityStreamHandle", "NativeProducer", "NativeStreamHandle", @@ -88,9 +88,6 @@ _PROVIDER = "native" -CONTENT_HASH_KEY = "temporal.io/content-hash" -"""The record metadata key carrying the hex SHA-256 of the plaintext body.""" - logger = logging.getLogger(__name__) @@ -129,9 +126,11 @@ def _fingerprint(record: WireRecord) -> WireRecord: """ if not record.HasField("body"): return record - digest = hashlib.sha256(record.body.SerializeToString()).hexdigest() record.metadata[CONTENT_HASH_KEY].CopyFrom( - Payload(metadata={"encoding": b"binary/plain"}, data=digest.encode()) + Payload( + metadata={"encoding": b"binary/plain"}, + data=content_hash(record.body).encode(), + ) ) return record diff --git a/temporalio/worker/_command_aware_visitor.py b/temporalio/worker/_command_aware_visitor.py index 7c03c2cd4..bc3e3f35a 100644 --- a/temporalio/worker/_command_aware_visitor.py +++ b/temporalio/worker/_command_aware_visitor.py @@ -6,6 +6,7 @@ from dataclasses import dataclass from temporalio.api.enums.v1.command_type_pb2 import CommandType +from temporalio.api.stream.v1 import StreamRecord from temporalio.bridge._visitor import PayloadVisitor from temporalio.bridge._visitor_functions import VisitorFunctions from temporalio.bridge.proto.workflow_activation.workflow_activation_pb2 import ( @@ -26,6 +27,7 @@ StartChildWorkflowExecution, WorkflowCommand, ) +from temporalio.streams._wire import CONTENT_HASH_KEY @dataclass(frozen=True) @@ -116,6 +118,18 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( with current_command(CommandType.COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION, o.seq): await super()._visit_coresdk_workflow_commands_ScheduleNexusOperation(fs, o) + async def _visit_temporal_api_stream_v1_StreamRecord( + self, fs: VisitorFunctions, o: StreamRecord + ) -> None: + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for key, value in o.metadata.items(): + # The declared content hash is the server's dedupe identity and is + # read as sent, so neither the codec nor the store may rewrite it. + if key == CONTENT_HASH_KEY: + continue + await self._visit_temporal_api_common_v1_Payload(fs, value) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: WorkflowCommand ) -> None: diff --git a/tests/streams/test_native_fingerprint.py b/tests/streams/test_native_fingerprint.py index a66c4c79f..9cac71755 100644 --- a/tests/streams/test_native_fingerprint.py +++ b/tests/streams/test_native_fingerprint.py @@ -19,14 +19,17 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.api.stream.v1 import StreamRecord +from temporalio.bridge.proto.workflow_completion import WorkflowActivationCompletion +from temporalio.bridge.worker import encode_completion from temporalio.client_stream import Appended from temporalio.converter import ( DataConverter, PayloadCodec, StorageDriverWorkflowInfo, ) +from temporalio.streams._wire import CONTENT_HASH_KEY from temporalio.streams.providers import native -from temporalio.streams.providers.native import CONTENT_HASH_KEY, NativeProducer +from temporalio.streams.providers.native import NativeProducer class _NonceCodec(PayloadCodec): @@ -120,3 +123,29 @@ def stage(records: Sequence[StreamRecord], *, stream_name: str) -> None: # reissues. native._NativeWriteSink("t").publish(StreamRecord(topic="t", body=body)) assert staged[1].metadata[CONTENT_HASH_KEY] == stamped.metadata[CONTENT_HASH_KEY] + + +async def test_the_workers_payload_pass_leaves_the_stamp_alone() -> None: + """The codec and the store rewrite the body and the other metadata, never the hash. + + The server reads the declared hash as sent and refuses a value that is not + hex, so a codec that touched it would fail the workflow's own append. + """ + converter = DataConverter(payload_codec=_NonceCodec()) + body = converter.payload_converter.to_payloads([{"n": 3}])[0] + record = native._fingerprint(StreamRecord(topic="t", body=body)) + record.metadata["note"].CopyFrom(Payload(data=b"plain")) + completion = WorkflowActivationCompletion() + command = completion.successful.commands.add() + command.append_stream_records.stream_name = "t" + command.append_stream_records.records.append(record) + + await encode_completion( + completion, converter, encode_headers=False, storage_concurrency_limit=1 + ) + + sent = completion.successful.commands[0].append_stream_records.records[0] + assert sent.body.metadata["encoding"] == b"binary/nonce" + assert sent.metadata["note"].metadata["encoding"] == b"binary/nonce" + assert sent.metadata[CONTENT_HASH_KEY].data == _plaintext_hash({"n": 3}) + assert sent.metadata[CONTENT_HASH_KEY].metadata["encoding"] == b"binary/plain" diff --git a/tests/worker/test_workflow_stream_payloads_e2e.py b/tests/worker/test_workflow_stream_payloads_e2e.py index fd300d512..54ffe74ea 100644 --- a/tests/worker/test_workflow_stream_payloads_e2e.py +++ b/tests/worker/test_workflow_stream_payloads_e2e.py @@ -30,7 +30,8 @@ PayloadCodec, ) from temporalio.streams import RecordKind -from temporalio.streams.providers.native import CONTENT_HASH_KEY, NativeStreams +from temporalio.streams._wire import CONTENT_HASH_KEY +from temporalio.streams.providers.native import NativeStreams from temporalio.worker import Worker from tests.streams.test_streams_conformance import take from tests.test_extstore import InMemoryTestDriver From 9cdb2272145f59b0d8262b92bbd1dae5588d8386 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:34:45 -0700 Subject: [PATCH 694/831] Derived the replayer's stream channel from its client. The replayer fetched recorded ranges over a bare channel to the client's host, so a client with TLS or an API key named the right server and could not authenticate. It now opens the shared channel from the client's connection and closes it by the same key. A range refused below the retention floor arrives typed now and is reported as the stream no longer holding it, as before. --- temporalio/worker/_replayer.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index 088975ec7..c7e3478df 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -87,13 +87,11 @@ def __init__( service and hands the records to the replay, so the workflow sees what it saw the first time. A range the stream no longer holds fails that replay with :py:class:`temporalio.streams.StreamNotFoundError`. - Only the client's target host and namespace are read: the stream - service is reached on a channel of its own, opened without TLS or - an API key, so a client connected to Temporal Cloud names the right - address and still cannot authenticate. That is a prototype limit of - :py:mod:`temporalio.client_stream`, which is where it will be - lifted. The replayer closes the channel it opened when the replay - is finished. + The stream service is reached on a channel of its own, opened with + the client's connection settings (target, TLS, API key, headers, + retries), as :py:class:`temporalio.client_stream.Connection` + describes. The replayer closes the channel it opened when the + replay is finished. * The history carries none and there is no client: replaying it fails and the message names both remedies. @@ -491,14 +489,9 @@ async def replay_iterator() -> AsyncIterator[WorkflowReplayResult]: # the replayer's to close: nothing else in the process asked for # it, and leaving it open outlives the replay it served. if stream_client is not None: - from temporalio.client_stream import close_shared_clients + from temporalio.client_stream import close_shared_clients, shared_key - await close_shared_clients( - ( - stream_client.service_client.config.target_host, - stream_client.namespace, - ) - ) + await close_shared_clients(shared_key(stream_client)) # Close the pusher if pusher is not None: pusher.close() @@ -601,7 +594,7 @@ async def _stream_slices( # without a stream client never touches. from temporalio.client_stream import shared_client - streams = shared_client(client.service_client.config.target_host, client.namespace) + streams = shared_client(client) # The handle that served each run's stream, so later ranges of the same # stream go straight to it. served_by: dict[tuple[str, str], Any] = {} @@ -696,8 +689,11 @@ async def _read_range( if not records: return None, "" raise + except temporalio.streams.StreamCursorError as error: + # Below the truncation floor: the records a task consumed are gone. + raise temporalio.streams.StreamNotFoundError(gone) from error except temporalio.service.RPCError as error: - # Below the truncation floor or past the head: the server refuses + # Past the head, or a refusal the server does not type: it refuses # the offset rather than answering short. if error.status in ( temporalio.service.RPCStatusCode.FAILED_PRECONDITION, From b5321258a4556848b7dc2a64e8923aa273fa087c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:38:25 -0700 Subject: [PATCH 695/831] Carried outside publishes by an Update that answers and refuses. A Signal has no response, so the workflow could only drop a divergent retry. The publish Update answers with the batch's position, so append() returns a cursor, and refuses a conflicting repeat with a typed error before accepting it. A producer falls back to the Signal on a workflow whose worker predates the Update; the Action cost is one per batch either way. --- CHANGELOG.md | 6 +- .../streams/providers/workflow_streams.py | 377 +++++++++++++++--- tests/streams/test_streams_conformance.py | 7 +- .../streams/test_workflow_streams_provider.py | 192 ++++++++- 4 files changed, 506 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7913ec4e..f43009cbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,7 +56,11 @@ to include examples, links to docs, or any other relevant information. worker plugin, so a workflow reads and publishes through `temporalio.contrib.workflow_streams` without naming it. Records are the `StreamRecord` proto inside the shipped item payload, and a handle without a - run id follows continue-as-new run by run. + run id follows continue-as-new run by run and a reset into the run reset to. + An outside publish is an Update that answers with the batch's position and + refuses a conflicting repeat, falling back to the shipped Signal on a + workflow whose worker predates it. A workflow's activity keeps its own + streams in the workflow's log under `activity//`. ### Changed diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index e700ba959..0ec67b870 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -14,23 +14,31 @@ ``StreamRecord`` proto and its encoding is ``binary/plain``. The shipped code stores and returns that ``Payload`` untouched, so the body's own encoding never meets the transport. -- Producer identity dedupes through the shipped publisher state: the - publisher id is ``producer#attempt`` and every publish Signal carries the - sequence its records end at, so a retried batch drops and a new attempt - passes. - - What this transport cannot keep is the rest of that rule. A publish is a - Signal, which has no response, so the dedupe decision is taken in the - workflow and there is nowhere to report it. A repeat that carries - *different* content at a sequence the log already holds is therefore - dropped rather than refused with - :class:`temporalio.streams.StreamProducerError`, the way the memory and - native providers refuse it. Raising in the Signal handler is not an - alternative: it would fail the Workflow Task on every replay and the - caller would still learn nothing. A caller that needs a divergent retry to - be caught wants a provider whose append is a request and a response. -- ``append()`` returns ``None``. The Signal transport learns positions at - read time, so a caller that wants to follow from now asks ``latest()``. +- An outside publish is an Update, ``__temporal_streams_publish``, carrying + the shipped publish Signal's input. Producer identity dedupes through the + shipped publisher state, the publisher id being ``producer#attempt`` and + the sequence where the batch's records end, and the Update adds what a + Signal has no room for: a response. The workflow answers with the run and + offset the batch landed at, so ``append()`` returns a cursor, and it + refuses a repeat that carries *different* content at a sequence it holds, + or one behind its most recent, before accepting the Update, so the caller + gets :class:`temporalio.streams.StreamProducerError` and the log takes + nothing. Content is compared by a hash the workflow keeps per producer. + The Update's id is derived from producer, sequence and content, so a + retry after a lost reply is answered by the server from the first + outcome. The Action cost is unchanged: one Update per append batch in + place of one Signal. + + The Signal stays as the transport a worker that predates the Update + serves. A producer that is told twice, across a task boundary, that the + workflow has no publish Update falls back to it for the rest of its life + and returns ``None`` from ``append()``, since a Signal learns positions at + read time; ``publish_transport="signal"`` on the provider picks it from + the start. Records land in the same log either way, so a log written by + Signals reads the same. The shipped Signal handler's dedupe is one table + per publisher across topics, so on that transport one identity writing + two topics at the same sequence has its second batch dropped; the Update + keeps one per producer and topic, as the other providers do. - A log belongs to one run and is not carried across continue-as-new, so a cursor names the run as well as the offset. A handle without a run id reads run after run: each log through the poll Update while its run is @@ -57,10 +65,12 @@ import asyncio import base64 +import hashlib import logging from collections.abc import AsyncGenerator +from dataclasses import dataclass from datetime import timedelta -from typing import Any, Generic, TypeVar +from typing import Any, Generic, Literal, TypeVar from google.protobuf.message import DecodeError @@ -88,11 +98,13 @@ WorkflowStream, ) from temporalio.converter import PayloadConverter +from temporalio.exceptions import ApplicationError from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._errors import ( StreamCursorError, StreamError, StreamNotFoundError, + StreamProducerError, StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink @@ -117,6 +129,8 @@ from temporalio.worker._workflow_instance import QUERY_HANDLER_NOT_FOUND __all__ = [ + "PRODUCER_CONFLICT_ERROR_TYPE", + "PublishTransport", "WorkflowStreamsActivityHandle", "WorkflowStreamsHandle", "WorkflowStreamsProducer", @@ -125,7 +139,18 @@ T = TypeVar("T") +PublishTransport = Literal["update", "signal"] +"""How an outside producer's batches reach the workflow.""" + +PRODUCER_CONFLICT_ERROR_TYPE = "StreamProducerConflict" +"""The ``ApplicationError.type`` the publish Update refuses a producer conflict with. + +Public so a caller driving the Update itself can tell the refusal from any +other failure. +""" + _PROVIDER = "workflow_streams" +_PUBLISH_UPDATE = "__temporal_streams_publish" _TAIL_QUERY = "__temporal_streams_tail" _LATEST_QUERY = "__temporal_streams_latest" _START_QUERY = "__temporal_streams_start" @@ -146,6 +171,17 @@ logger = logging.getLogger(__name__) +def _run_is_closing(error: RPCError) -> bool: + """Whether the server refused an Update because the run is completing. + + The window between a run deciding to close, or continue as new, and its + close being recorded; the next attempt learns how it closed. + """ + return ( + error.status == RPCStatusCode.FAILED_PRECONDITION and "closing" in error.message + ) + + def _require_topic(topic: str) -> None: if not topic: raise ValueError("topic must not be empty") @@ -206,6 +242,51 @@ def _entry_data(payload: Payload) -> str: return base64.b64encode(payload.SerializeToString()).decode("ascii") +def _content(publish: PublishInput) -> str: + """A digest of one batch's content, length-delimited so a resplit cannot collide.""" + digest = hashlib.sha256() + for entry in publish.items: + for part in (entry.topic.encode(), entry.data.encode("ascii")): + digest.update(len(part).to_bytes(8, "big")) + digest.update(part) + return digest.hexdigest() + + +def _producer_key(publish: PublishInput) -> tuple[str, str]: + # A batch is one topic's, so its first entry names the stream. + topic = publish.items[0].topic if publish.items else "" + return publish.publisher_id, topic + + +def _decode_payload(data: str) -> Payload: + return Payload.FromString(base64.b64decode(data)) + + +def _publish_id(publish: PublishInput, content: str) -> str: + # One id per (producer, sequence, content): a retry after a lost reply + # is answered from the first outcome without reaching the workflow, and a + # divergent repeat is a new Update the workflow gets to refuse. + key = f"{publish.publisher_id}\0{publish.sequence}\0{content}".encode() + return f"streams-publish-{hashlib.sha256(key).hexdigest()[:32]}" + + +@dataclass +class _PublishResult: + """The publish Update's answer: where the batch's last record sits.""" + + run_id: str + last_offset: int + + +@dataclass +class _Held: + """What the workflow keeps of a producer's most recent accepted batch.""" + + sequence: int + content: str + last_offset: int + + class _InstanceStream: """A view over the shipped stream object of the running workflow instance. @@ -215,6 +296,12 @@ class _InstanceStream: def __init__(self, stream: WorkflowStream | None = None) -> None: self.stream = WorkflowStream() if stream is None else stream + # Per producer and topic, the most recent batch taken by the publish + # Update, so a repeat is answered and a divergent one refused. A + # producer's identity is one per stream, as on every provider, so + # the same identity on two topics is two producers. Workflow state, + # rebuilt on replay like the log itself. + self._producers: dict[tuple[str, str], _Held] = {} if workflow.get_query_handler(_TAIL_QUERY) is None: # The poll Update stops answering once the workflow is closing, # and a reader between polls at that moment would lose what the @@ -225,6 +312,58 @@ def __init__(self, stream: WorkflowStream | None = None) -> None: workflow.set_query_handler(_LATEST_QUERY, self._latest) if workflow.get_query_handler(_START_QUERY) is None: workflow.set_query_handler(_START_QUERY, self._start) + if workflow.get_update_handler(_PUBLISH_UPDATE) is None: + workflow.set_update_handler( + _PUBLISH_UPDATE, self._publish, validator=self._validate_publish + ) + + def _validate_publish(self, publish: PublishInput) -> None: + """Refuse a conflicting batch before the Update is accepted. + + Refused here rather than in the handler so the refusal writes no + event: the caller learns of it and the log is untouched. + + Raises: + ApplicationError: Typed ``PRODUCER_CONFLICT_ERROR_TYPE``. The + batch repeats this producer's most recent sequence with + other content, or names a sequence behind it. + """ + held = self._producers.get(_producer_key(publish)) + if held is None: + return + if publish.sequence < held.sequence: + raise ApplicationError( + f"producer {publish.publisher_id!r} already wrote past sequence " + f"{publish.sequence}; only its most recent append can be repeated", + type=PRODUCER_CONFLICT_ERROR_TYPE, + ) + if publish.sequence == held.sequence and _content(publish) != held.content: + raise ApplicationError( + f"producer {publish.publisher_id!r} repeated sequence " + f"{publish.sequence} with different content", + type=PRODUCER_CONFLICT_ERROR_TYPE, + ) + + def _publish(self, publish: PublishInput) -> _PublishResult: + """Take one outside batch into the log and answer where it landed. + + A repeat of the producer's most recent batch, which the validator + let through because its content matches, is answered with the + original position and writes nothing. The Update keeps its own + table rather than the shipped Signal handler's, which is one per + publisher across topics; a producer stays on one transport for its + life, so the two never judge the same batch. + """ + run_id = workflow.info().run_id + key = _producer_key(publish) + held = self._producers.get(key) + if held is not None and publish.sequence == held.sequence: + return _PublishResult(run_id=run_id, last_offset=held.last_offset) + for entry in publish.items: + self.stream.topic(entry.topic).publish(_decode_payload(entry.data)) + last = self.stream.next_offset - 1 + self._producers[key] = _Held(publish.sequence, _content(publish), last) + return _PublishResult(run_id=run_id, last_offset=last) def _tail(self, from_offset: int, topic: str) -> dict[str, Any]: """One page of ``topic``'s items at or past ``from_offset``. @@ -315,6 +454,10 @@ def _instance() -> _InstanceStream: # id: the SDK rebuilds an evicted workflow from history as a new object, # and a map would hand that object the stale log with its unregistered # handlers and the records of a task that failed. + handler = workflow.get_update_handler(_PUBLISH_UPDATE) + registered = getattr(handler, "__self__", None) + if isinstance(registered, _InstanceStream): + return registered stream = _registered_stream() return _InstanceStream() if stream is None else _InstanceStream(stream) @@ -433,18 +576,19 @@ async def on_workflow_finish(self) -> None: class WorkflowStreamsProducer(Generic[T]): - """Appends by sending the shipped publish Signal directly. + """Appends through the publish Update, or the shipped publish Signal. Direct rather than through ``WorkflowStreamClient`` because the interface owns the publisher identity: it must be ``producer#attempt`` for the shipped dedupe to drop a retry and pass a new generation, and the client would use its own random id. - Sequences are committed only after the server accepted the Signal. A - batch whose Signal raised stays pending and goes out again under the - same signal sequence, either when the caller retries the same values or - ahead of whatever the caller sends next, so an ambiguous failure writes - the batch once and loses nothing. + Sequences are committed only after the server accepted the batch. A + batch whose send raised stays pending and goes out again under the same + sequence, either when the caller retries the same values or ahead of + whatever the caller sends next, so an ambiguous failure writes the batch + once and loses nothing. A batch the workflow refused is dropped from the + pending slot: the refusal is the answer. """ def __init__( @@ -456,12 +600,16 @@ def __init__( attempt: int, *, item_topic: str | None = None, + transport: PublishTransport = "update", + retry_cooldown: timedelta = timedelta(milliseconds=100), ) -> None: """Bind this producer to ``topic`` on the workflow behind ``handle``. ``item_topic`` is the name the log files the records under when it differs from the name the records carry, as an activity's reserved - topics do. + topics do. ``transport`` is how batches travel; ``"update"`` falls + back to ``"signal"`` on a workflow that has no publish Update, after + one retry ``retry_cooldown`` later. """ self._handle = handle self._converter = converter @@ -469,10 +617,18 @@ def __init__( self._item_topic = topic if item_topic is None else item_topic self._producer_id = producer_id self._attempt = attempt + self._transport: PublishTransport = transport + self._retry_cooldown = retry_cooldown # One-based, because zero on the wire says the producer does not # number its records and this one does. self._sequence = 1 self._pending: tuple[list[PublishEntry], int] | None = None + self._last: Cursor | None = None + + @property + def transport(self) -> PublishTransport: + """How this producer's batches travel now: the Signal once it fell back.""" + return self._transport @property def producer_id(self) -> str: @@ -493,16 +649,23 @@ def _publisher_id(self) -> str: ) async def append(self, *values: T) -> Cursor | None: - """Append ``values`` through the shipped publish Signal. + """Append ``values`` and return the cursor of the batch's last record. + + A repeat of this producer's most recent append with the same content + is answered with the position the original landed at; an empty call + returns the position of the last record this producer wrote, or + ``None`` before its first. ``None`` is also the answer on the Signal + transport, which learns positions at read time, so a caller that + wants to follow from now asks :meth:`WorkflowStreamsHandle.latest`. - Always ``None``: this transport learns positions at read time, so a - caller that wants to follow from now asks - :meth:`WorkflowStreamsHandle.latest`. + Raises: + StreamProducerError: The workflow holds this sequence with other + content, or the producer already wrote past it. + StreamNotFoundError: The workflow does not exist or has closed. """ if not values: - return None - await self._send([(RecordKind.DATA, value) for value in values]) - return None + return self._last + return await self._send([(RecordKind.DATA, value) for value in values]) async def finish(self) -> None: """Write ``FINISH`` for this producer on this topic.""" @@ -529,33 +692,104 @@ def _entries( ) return entries, sequence - async def _send(self, batch: list[tuple[RecordKind, Any]]) -> None: + async def _send(self, batch: list[tuple[RecordKind, Any]]) -> Cursor | None: entries, next_sequence = self._entries(batch) if self._pending is not None and self._pending[0] != entries: - # The caller moved on from a batch whose Signal raised. It goes - # first, under the signal sequence it already had, so a copy the - # server did accept is dropped and one it never saw lands. The - # new batch is then renumbered behind it. - await self._signal(*self._pending) + # The caller moved on from a batch whose send raised. It goes + # first, under the sequence it already had, so a copy the server + # did accept is answered or dropped and one it never saw lands. + # The new batch is then renumbered behind it. + await self._deliver(*self._pending) entries, next_sequence = self._entries(batch) - await self._signal(entries, next_sequence) + return await self._deliver(entries, next_sequence) - async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None: + async def _deliver( + self, entries: list[PublishEntry], next_sequence: int + ) -> Cursor | None: # The dedupe sequence is where this producer's records end, not how - # many signals it has sent. The two differ once a retry batches its + # many batches it has sent. The two differ once a retry batches its # records differently from the send it is repeating, and a counter of - # signals then either drops a batch of new records or lets records + # batches then either drops a batch of new records or lets records # that are already there through a second time. self._pending = (entries, next_sequence) + publish = PublishInput( + items=entries, publisher_id=self._publisher_id, sequence=next_sequence + ) + if self._transport == "signal": + landed = await self._signal(publish) + else: + landed = await self._update(publish) + self._sequence = next_sequence + self._pending = None + if landed is not None: + self._last = landed + return landed + + async def _update(self, publish: PublishInput) -> Cursor | None: + content = _content(publish) + retried = False + while True: + try: + answer = await self._handle.execute_update( + _PUBLISH_UPDATE, + publish, + id=_publish_id(publish, content), + result_type=_PublishResult, + ) + except WorkflowUpdateFailedError as error: + cause = error.cause + cause_type = getattr(cause, "type", None) + if cause_type == PRODUCER_CONFLICT_ERROR_TYPE: + # Final for this batch: there is nothing to send again. + self._pending = None + raise StreamProducerError(str(cause)) from error + if cause_type == _UPDATE_OUTLIVED_RUN: + # Accepted, then the run closed before the handler ran: + # the same answer a Signal to a closed run gets. + raise StreamNotFoundError( + f"workflow {self._handle.id!r} closed before taking the " + "batch, so its stream cannot be appended to" + ) from error + if _HANDLER_NOT_FOUND not in str(cause): + raise StreamError( + f"the publish update on workflow {self._handle.id!r} " + f"failed: {error}" + ) from error + if not retried: + # A rejection comes back with the completion of the task + # that made it, so a retry reaches a later task, and the + # start hook registers the handler on the first one. + retried = True + await asyncio.sleep(self._retry_cooldown.total_seconds()) + continue + # Rejected across a task boundary: the workflow's worker + # predates the publish Update. Its Signal takes the batch, + # and every later one from this producer. + logger.info( + "workflow %r has no publish update; appending by Signal", + self._handle.id, + ) + self._transport = "signal" + return await self._signal(publish) + except RPCError as error: + if _run_is_closing(error): + # Where a Signal would be carried to the successor, the + # Update is refused; the retry reaches the run that + # takes over, since the handle follows the chain. + await asyncio.sleep(self._retry_cooldown.total_seconds()) + continue + if error.status == RPCStatusCode.NOT_FOUND: + raise StreamNotFoundError( + f"workflow {self._handle.id!r} was not found, so its stream " + "cannot be appended to" + ) from error + raise + return _cursor(answer.run_id, answer.last_offset) + + async def _signal(self, publish: PublishInput) -> Cursor | None: + # Always None: a Signal has no response to carry the position. try: - await self._handle.signal( - PUBLISH_SIGNAL_NAME, - PublishInput( - items=entries, - publisher_id=self._publisher_id, - sequence=next_sequence, - ), - ) + await self._handle.signal(PUBLISH_SIGNAL_NAME, publish) except RPCError as error: if error.status == RPCStatusCode.NOT_FOUND: raise StreamNotFoundError( @@ -563,8 +797,7 @@ async def _signal(self, entries: list[PublishEntry], next_sequence: int) -> None "cannot be appended to" ) from error raise - self._sequence = next_sequence - self._pending = None + return None class WorkflowStreamsHandle: @@ -576,12 +809,14 @@ def __init__( workflow_id: str, run_id: str | None, poll_cooldown: timedelta, + publish_transport: PublishTransport = "update", ) -> None: """Address ``workflow_id``'s log, pinned to ``run_id`` when one is given.""" self._client = client self._workflow_id = workflow_id self._run_id = run_id self._poll_cooldown = poll_cooldown + self._publish_transport: PublishTransport = publish_transport self._converter = client.data_converter.payload_converter def read( @@ -782,6 +1017,11 @@ async def _poll( f"the poll update on workflow {self._workflow_id!r} failed: {error}" ) from error except RPCError as error: + if _run_is_closing(error): + # Continuing as new, or completing: the next attempt + # learns how it closed, the way a draining poll does. + await asyncio.sleep(cooldown) + continue # The run closed and its poll Update went with it, or the # workflow does not exist; the caller describes to tell which. if error.status != RPCStatusCode.NOT_FOUND: @@ -1006,6 +1246,8 @@ def producer( producer_id, attempt, item_topic=wire_topic, + transport=self._publish_transport, + retry_cooldown=self._poll_cooldown, ) @@ -1034,9 +1276,10 @@ def __init__( run_id: str | None, activity_id: str, poll_cooldown: timedelta, + publish_transport: PublishTransport = "update", ) -> None: """Address ``activity_id``'s streams inside ``workflow_id``'s log.""" - super().__init__(client, workflow_id, run_id, poll_cooldown) + super().__init__(client, workflow_id, run_id, poll_cooldown, publish_transport) self._activity_id = activity_id def _wire_topic(self, topic: str) -> str: @@ -1105,15 +1348,28 @@ class WorkflowStreamsProvider(ProviderPlugin): """The provider over the shipped Workflow Streams transport.""" def __init__( - self, *, poll_cooldown: timedelta = timedelta(milliseconds=100) + self, + *, + poll_cooldown: timedelta = timedelta(milliseconds=100), + publish_transport: PublishTransport = "update", ) -> None: """Create the provider. Args: poll_cooldown: How long an outside reader that is caught up waits - between polls. Backlogs drain at full speed regardless. + between polls. Backlogs drain at full speed regardless. Also + how long a producer waits before retrying a publish Update + the workflow's first task rejected. + publish_transport: How an outside producer's batches reach the + workflow. ``"update"``, the default, answers each batch with + its position and refuses a conflicting repeat; on a workflow + whose worker predates the publish Update the producer falls + back to the Signal by itself. ``"signal"`` is the transport + of the first release and skips the detection. Both cost one + Action per batch. """ self._poll_cooldown = poll_cooldown + self._publish_transport: PublishTransport = publish_transport def workflow_provider(self) -> _WSWorkflowProvider: """The workflow half, over the running instance's shipped stream object.""" @@ -1123,7 +1379,9 @@ def get_stream_handle( self, client: Client, workflow_id: str, *, run_id: str | None = None ) -> WorkflowStreamsHandle: """A handle on ``workflow_id``'s log; without ``run_id`` it follows the chain.""" - return WorkflowStreamsHandle(client, workflow_id, run_id, self._poll_cooldown) + return WorkflowStreamsHandle( + client, workflow_id, run_id, self._poll_cooldown, self._publish_transport + ) def get_activity_stream_handle( self, @@ -1151,7 +1409,12 @@ def get_activity_stream_handle( "workflow hosts this activity's" ) return WorkflowStreamsActivityHandle( - client, workflow_id, run_id, activity_id, self._poll_cooldown + client, + workflow_id, + run_id, + activity_id, + self._poll_cooldown, + self._publish_transport, ) async def close(self) -> None: diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 942595170..e8959dfc7 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -166,15 +166,12 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: TruncatingStreamHost.truncate, args=[topic, keep] ) + # A publish is an Update, so the workflow answers with the position + # and refuses a divergent repeat: both capabilities hold here. yield ProviderCase( "workflow_streams", provider, client, - reports_positions=False, - # A publish is a Signal, so the dedupe decision is taken in the - # workflow with nowhere to report it. See the module docstring of - # the provider. - detects_divergent_retries=False, host=host, task_queue=worker.task_queue, truncate=truncate, diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index f37fccd8a..e5d713971 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -1,11 +1,12 @@ """Conformance for the workflow_streams provider on the test environment's server. Runs the interface loop over the shipped Option 0 transport: an outside -producer appends through the publish Signal, the workflow reads and -republishes through its own state, and an outside reader follows the poll -Update while the run is open and the tail Query once it has closed. The -outside-surface cases shared by every provider run from -``test_streams_conformance``; this file covers what the transport adds. +producer appends through the publish Update, or the shipped publish Signal +where a workflow has no Update, the workflow reads and republishes through +its own state, and an outside reader follows the poll Update while the run is +open and the tail Query once it has closed. The outside-surface cases shared +by every provider run from ``test_streams_conformance``; this file covers +what the transport adds. """ from __future__ import annotations @@ -26,17 +27,21 @@ Client, WorkflowExecutionStatus, WorkflowQueryFailedError, + WorkflowUpdateFailedError, ) from temporalio.contrib.workflow_streams import PublishInput, WorkflowStream from temporalio.converter import DataConverter +from temporalio.exceptions import ApplicationError from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( BEGINNING, END, + Cursor, RecordKind, StreamCursorError, StreamError, StreamNotFoundError, + StreamProducerError, StreamUnsupportedError, Supersession, ) @@ -47,6 +52,7 @@ WorkflowStreamsProducer, WorkflowStreamsProvider, _InstanceStream, + _PublishResult, ) from temporalio.worker._workflow_instance import QUERY_HANDLER_NOT_FOUND from tests.helpers import new_worker @@ -150,21 +156,32 @@ async def test_retried_producer_dedupes_and_new_attempt_supersedes( stream = provider.get_stream_handle(client, workflow_id) first = stream.producer(topic=INPUTS, producer_id="model", attempt=1) - # Positions are learnt at read time on this transport. - assert await first.append({"n": 1}) is None - # The retry of the same attempt re-sends its first batch. + # The publish Update answers with where the batch landed. + landed = await first.append({"n": 1}) + assert landed is not None + # The retry of the same attempt re-sends its first batch and is + # answered with the same position. retry = stream.producer(topic=INPUTS, producer_id="model", attempt=1) - await retry.append({"n": 1}) + assert await retry.append({"n": 1}) == landed second = stream.producer(topic=INPUTS, producer_id="model", attempt=2) await second.append({"n": 2}) records = await take(stream.read(topic=INPUTS, result_type=dict), 3) assert records[0].kind is RecordKind.DATA and records[0].attempt == 1 + assert records[0].cursor == landed assert records[1].kind is RecordKind.SUPERSEDED assert records[1].supersession == Supersession("model", 1, 2) assert records[2].kind is RecordKind.DATA and records[2].attempt == 2 assert all(r.topic == INPUTS for r in records) + # A sequence behind the producer's most recent one is stale, and a + # refusal is typed rather than a silent drop. + await second.append({"n": 3}) + stale = stream.producer(topic=INPUTS, producer_id="model", attempt=2) + with pytest.raises(StreamProducerError, match="most recent"): + await stale.append({"n": "other"}) + assert stale.transport == "update" + await second.finish() await handle.signal(EchoLoop.release) await handle.result() @@ -668,6 +685,48 @@ async def test_a_live_read_without_a_run_id_follows_a_reset( ] +@workflow.defn +class ShippedOnly: + """Holds the shipped stream object alone, as a workflow on a worker without the provider.""" + + def __init__(self) -> None: + self._stream = WorkflowStream() + self._released = False + + @workflow.signal + def release(self) -> None: + self._released = True + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: self._released) + + +async def test_a_workflow_without_the_publish_update_is_appended_to_by_signal( + client: Client, provider: WorkflowStreamsProvider +): + # The worker has no provider, so the workflow serves the shipped Signal + # and nothing else. The producer learns that from two rejections and + # falls back, and the batches land in the shipped log all the same. + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(client, ShippedOnly) as worker: + handle = await client.start_workflow( + ShippedOnly.run, id=workflow_id, task_queue=worker.task_queue + ) + producer = provider.get_stream_handle(client, workflow_id).producer( + topic=INPUTS, producer_id="model", attempt=1 + ) + assert await producer.append({"n": 1}) is None + assert producer.transport == "signal" + await producer.append({"n": 2}, {"n": 3}) + assert ( + await handle.query("__temporal_workflow_stream_offset", result_type=int) + == 3 + ) + await handle.signal(ShippedOnly.release) + await handle.result() + + async def test_a_running_workflow_without_the_provider_fails_the_read_clearly( client: Client, provider: WorkflowStreamsProvider ): @@ -735,18 +794,25 @@ def _sequences(sent: list[PublishInput]) -> list[tuple[int, list[int]]]: ] -def _producer(handle: _FlakyHandle) -> WorkflowStreamsProducer: +def _producer(handle: Any, transport: Any = "signal") -> WorkflowStreamsProducer: return WorkflowStreamsProducer( - handle, DataConverter.default.payload_converter, INPUTS, "model", 1 + handle, + DataConverter.default.payload_converter, + INPUTS, + "model", + 1, + transport=transport, + retry_cooldown=timedelta(0), ) async def test_a_retried_append_after_an_ambiguous_failure_writes_once(): + # The Signal transport: what a producer that fell back to it does. handle = _FlakyHandle() producer = _producer(handle) with pytest.raises(ConnectionResetError): await producer.append({"n": 1}) - await producer.append({"n": 1}) + assert await producer.append({"n": 1}) is None await producer.append({"n": 2}) # The retry carries the same signal sequence and the same record # sequence as the failed send, so the shipped dedupe drops the copy; the @@ -766,6 +832,99 @@ async def test_a_batch_whose_signal_failed_goes_out_before_the_next_one(): assert _wires(handle.sent[-1])[0].kind == int(RecordKind.FINISH) +class _UpdateHandle: + """A workflow handle serving the publish Update as the server and workflow would. + + Answers a repeated update id from the first outcome, the way the server + does, positions each new batch at the head of a log, the way the + workflow does, and loses the reply of the first call when told to. + Without a handler it rejects every Update the way a workflow whose + worker predates it does, and takes Signals. + """ + + id = "update" + + def __init__(self, *, lose_first_reply: bool = False, handler: bool = True): + self.sent: list[tuple[str, PublishInput]] = [] + self.signalled: list[PublishInput] = [] + self._outcomes: dict[str, _PublishResult] = {} + self._head = 0 + self._lose = lose_first_reply + self._handler = handler + + async def execute_update( + self, name: str, arg: PublishInput, *, id: str, result_type: Any + ) -> _PublishResult: + del name, result_type + self.sent.append((id, arg)) + if not self._handler: + raise WorkflowUpdateFailedError( + ApplicationError( + f"Update handler for 'x' {QUERY_HANDLER_NOT_FOUND}, known updates: []" + ) + ) + answer = self._outcomes.get(id) + if answer is None: + answer = _PublishResult("run", self._head + len(arg.items) - 1) + self._head += len(arg.items) + self._outcomes[id] = answer + if self._lose: + self._lose = False + raise ConnectionResetError("the server took the update, the reply was lost") + return answer + + async def signal(self, name: str, arg: PublishInput) -> None: + del name + self.signalled.append(arg) + + +def _at(offset: int) -> Cursor: + return Cursor(f"workflow_streams:run:{offset}") + + +async def test_a_retried_update_after_a_lost_reply_is_answered_from_its_id(): + handle = _UpdateHandle(lose_first_reply=True) + producer = _producer(handle, "update") + assert await producer.append() is None + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + # The retry is the same Update: same producer, sequence and content make + # the same id, so the server answers with the outcome it already holds + # and the log takes the batch once. The batch after it is a new one. + assert await producer.append({"n": 1}) == _at(0) + assert await producer.append({"n": 2}) == _at(1) + assert await producer.append() == _at(1) + ids = [id for id, _ in handle.sent] + assert ids[0] == ids[1] != ids[2] + assert _sequences([arg for _, arg in handle.sent]) == [(2, [1]), (2, [1]), (3, [2])] + + +async def test_a_batch_whose_update_failed_goes_out_before_the_next_one(): + handle = _UpdateHandle(lose_first_reply=True) + producer = _producer(handle, "update") + with pytest.raises(ConnectionResetError): + await producer.append({"n": 1}) + # The pending batch lands first, at offset 0, so the new one follows it. + assert await producer.append({"n": 2}, {"n": 3}) == _at(2) + await producer.finish() + sent = [arg for _, arg in handle.sent] + assert _sequences(sent) == [(2, [1]), (2, [1]), (4, [2, 3]), (5, [4])] + assert _wires(sent[-1])[0].kind == int(RecordKind.FINISH) + + +async def test_a_producer_falls_back_to_the_signal_without_a_publish_update(): + handle = _UpdateHandle(handler=False) + producer = _producer(handle, "update") + # Rejected twice across a task boundary means the workflow's worker + # predates the Update; the batch goes by Signal, and so does every later + # one, without asking again. + assert await producer.append({"n": 1}) is None + assert producer.transport == "signal" + assert await producer.append({"n": 2}) is None + assert len(handle.sent) == 2 + assert _sequences(handle.signalled) == [(2, [1]), (3, [2])] + + class _Description: run_id = "the-only-run" status = WorkflowExecutionStatus.COMPLETED @@ -955,7 +1114,14 @@ async def test_a_workflow_reader_starts_at_end_or_the_newest_records( result = asyncio.ensure_future(handle.result()) if start == "end": for _ in range(150): - await producer.append({"n": "new"}) + try: + await producer.append({"n": "new"}) + except StreamNotFoundError: + # The Update returns once the workflow took the + # batch, and reading it is what closes the workflow, + # so the next append can find it gone before the + # result has been noticed. + break done, _ = await asyncio.wait({result}, timeout=0.2) if done: break From 84e268c6e3beab665fe94d3b7e256212132d4a80 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:39:25 -0700 Subject: [PATCH 696/831] Kept one Redis log per topic instead of an input and an output key. The two-key split gave the workflow and outside readers different views of one topic. The provider's backend renders both transport directions onto the input key's log, an outside producer appends once, the workflow's staged batches are promoted into the same log, and the workflow reader drops its own records by producer identity. Cursors name entries of the one log on both sides. --- temporalio/streams/providers/redis.py | 418 ++++++++++++-------------- tests/streams/test_redis_provider.py | 56 ++-- tests/streams/test_redis_replay.py | 170 +++++++---- 3 files changed, 326 insertions(+), 318 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 082a93c7d..9e1b47853 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -8,34 +8,33 @@ The mapping, in one place: -- The transport keeps two Redis streams per topic, one the workflow reads and - one outside readers read, because the direction is part of every key it - derives. An outside producer therefore appends each record to both: the - input stream, which wakes a workflow subscribed to the topic, and the - output stream, where the workflow's own promoted batches land, so an - outside reader sees the producer's records and the workflow's in one order - and a workflow reading the topic misses nothing however early the producer - started. Both keys are written by one script, so a record is on both or on - neither: split across two calls, a crash between them leaves a record the - workflow consumes and no outside reader can ever see. The cost is one more - append per record and one wake per batch. A wake the server refuses because - the consuming run is closing is sent again after a short wait: a run that - continues as new hands the stream to its successor, the records are already - where the successor reads them, and only the wake has to follow. The - retries stop when the chain's current run takes the wake or the chain - proves terminal. +- One Redis stream per topic, the topic's log, read by the workflow and by + outside readers alike. The transport derives an input key and an output key + for a topic, because the direction is part of every key it renders; this + provider's backend renders both onto the log. An outside producer appends a + record once, and it is where the workflow's subscription reads and where an + outside read follows; the workflow's staged batches land in the same log + when its task completes and are promoted there, so an outside reader sees + the producer's records and the workflow's in one order. The workflow does + not read its own records: the backend drops the entries the workflow staged + from every read it serves the transport, the live read and the replay read + alike, so a recorded range and its replay agree. The wake path is the + transport's own: a producer appends, then wakes the subscribed run through + the input key. A wake the server refuses because the consuming run is + closing is sent again after a short wait: a run that continues as new hands + the log to its successor, the records are already where the successor + reads them, and only the wake has to follow. The retries stop when the + chain's current run takes the wake or the chain proves terminal. - A record rides as the transport's payload: the serialized ``StreamRecord`` proto as a ``binary/plain`` value, which the worker's codec encodes and decodes like any other payload. - Producer identity dedupes through the transport's idempotency: the session is ``producer#attempt`` and every record carries a sequence, so a retried batch is dropped with the original position and a new attempt passes. -- Cursors are ``redis:-`` on the outside surface and name a position - in the output stream. A workflow-side record carries ``redis:in:-``, - a position in the input stream, and only that form seeds a workflow reader: - the two streams number their entries independently, so an outside cursor - cannot stand in for one. A reader opened without a cursor starts where the - chain's predecessor run committed, which is the transport's own rule. +- Cursors are ``redis:-`` and name an entry of the topic's log, so a + cursor a workflow reader returned seeds an outside read and the other way + round. A reader opened without a cursor starts where the chain's + predecessor run committed, which is the transport's own rule. - A workflow's streams are keyed by the chain's first run, so a handle follows continue-as-new by construction and ``run_id`` only decides whose close ends a read. @@ -73,6 +72,18 @@ empty. A run that has to replay cold after seven days of consuming fails, so a long-lived consumer continues as new inside the window, or is configured with a longer one. + +Keys written by the earlier layout. Before the log, a topic was two keys: the +transport's input key, ``::::`` +with every id percent-encoded, and its output key, the same with an ``output`` +component before the topic. The log is the input key, so the records outside +producers wrote, the ranges a workflow recorded and the cursors its readers +returned, ``redis:in:-``, read as they did. The output key is not read +any more: batches a workflow promoted under the old layout are not delivered to +an outside reader, and an outside cursor minted then names an entry of that +key, so a reader holding one starts over from ``BEGINNING`` or positions itself +with ``latest()``. Nothing moves or deletes an old output key; it ages out under +the operator's own retention. """ from __future__ import annotations @@ -96,10 +107,8 @@ AppendConflictError, AppendNotAcknowledgedError, ChainKeyMismatchError, - ExternalOutputStreamProducer, ExternalStreamProducer, Offset, - OutputAppendNotAcknowledgedError, StreamDirection, WakeNotAcknowledgedError, WorkflowChainKey, @@ -137,6 +146,7 @@ ) from temporalio.contrib.external_workflow_streams._redis import ( _BEGINNING_SENTINEL, + _OUTPUT_STAGE_FIELD, RedisStreamBackend, _content_hash, _text, @@ -173,9 +183,12 @@ T = TypeVar("T") _PROVIDER = "redis" -_INPUT_PREFIX = "in:" +#: What a workflow reader's cursor carried when a topic was two keys. It named +#: an entry of the input key, which is the log now, so the form is still read. +_LEGACY_INPUT_PREFIX = "in:" _REDIS_ID = re.compile(r"\d+-\d+") _READ_BATCH = 256 +_STAGE_FIELD: Final = _OUTPUT_STAGE_FIELD.encode() #: How long a record is kept when the constructor is not told otherwise. #: @@ -207,16 +220,18 @@ def _require_topic(topic: str) -> None: raise ValueError("topic must not be empty") -def _outside_position(after: Cursor) -> Offset | None: - """The output-stream offset an outside cursor names, or ``None`` for BEGINNING.""" +def _position(after: Cursor) -> Offset | None: + """The log entry a cursor names, or ``None`` for BEGINNING. + + Raises: + StreamCursorError: The cursor is another provider's, or does not name + a Redis entry id. + """ token = cursor_position(after, provider=_PROVIDER) if token is None: return None - if token.startswith(_INPUT_PREFIX): - raise StreamCursorError( - f"cursor {after.token!r} names a position in the workflow's input log, " - "which only the workflow reads" - ) + if token.startswith(_LEGACY_INPUT_PREFIX): + token = token[len(_LEGACY_INPUT_PREFIX) :] if not _REDIS_ID.fullmatch(token): raise StreamCursorError( f"cursor {after.token!r} does not name a Redis stream position" @@ -224,26 +239,6 @@ def _outside_position(after: Cursor) -> Offset | None: return Offset(token) -def _workflow_position(after: Cursor) -> Offset | None: - """The input-stream offset a workflow reader's cursor names, or ``None`` for BEGINNING.""" - token = cursor_position(after, provider=_PROVIDER) - if token is None: - return None - if token.startswith(_INPUT_PREFIX): - entry = token[len(_INPUT_PREFIX) :] - if _REDIS_ID.fullmatch(entry): - return Offset(entry) - elif _REDIS_ID.fullmatch(token): - raise StreamCursorError( - f"cursor {after.token!r} names a position in the topic's output stream; " - "a workflow reader follows the input stream, whose entry ids differ, so " - "pass a cursor a workflow reader returned" - ) - raise StreamCursorError( - f"cursor {after.token!r} does not name a Redis stream position" - ) - - def _entry_id(token: str | bytes) -> tuple[int, int]: """A Redis entry id as the ``(ms, seq)`` pair it orders by.""" text = token.decode() if isinstance(token, bytes) else token @@ -251,58 +246,6 @@ def _entry_id(token: str | bytes) -> tuple[int, int]: return int(ms), int(seq or 0) -#: Append one record to a topic's two keys, or to neither. -#: -#: The provider's own write, not the transport's: the transport appends one key at a -#: time, and the two calls that would take are not one failure. A record on the input -#: key alone is one the workflow consumes and no outside reader can ever see, and a -#: producer that comes back with a fresh sequence never heals it. -#: -#: Both idempotency hashes are read before either stream is touched, so a key already -#: used with different bytes refuses the pair rather than half-writing it. Either half -#: already present is reused, which is what settles a pair some earlier call left -#: half-written. The retention trims ride along rather than costing their own round -#: trips, and they are exact for the reason the backend's own trims are. -_PAIRED_APPEND_LUA: Final = """ -local minid = ARGV[1] -local maxlen = ARGV[2] -local function placed(idem, key, digest) - local existing = redis.call('HGET', idem, key) - if not existing then - return nil - end - local sep = string.find(existing, '|') - if string.sub(existing, sep + 1) ~= digest then - return 'conflict' - end - return string.sub(existing, 1, sep - 1) -end -local input = placed(KEYS[2], ARGV[3], ARGV[4]) -local output = placed(KEYS[4], ARGV[3], ARGV[4]) -if input == 'conflict' or output == 'conflict' then - return {'conflict', '', ''} -end -local fields = {unpack(ARGV, 5)} -if not input then - input = redis.call('XADD', KEYS[1], '*', unpack(fields)) - redis.call('HSET', KEYS[2], ARGV[3], input .. '|' .. ARGV[4]) -end -if not output then - output = redis.call('XADD', KEYS[3], '*', unpack(fields)) - redis.call('HSET', KEYS[4], ARGV[3], output .. '|' .. ARGV[4]) -end -if minid ~= '' then - redis.call('XTRIM', KEYS[1], 'MINID', minid) - redis.call('XTRIM', KEYS[3], 'MINID', minid) -end -if maxlen ~= '' then - redis.call('XTRIM', KEYS[1], 'MAXLEN', maxlen) - redis.call('XTRIM', KEYS[3], 'MAXLEN', maxlen) -end -return {'ok', input, output} -""" - - def _trim_floor(backend: Any) -> str: retention = getattr(backend, "_retention", None) if retention is None: @@ -319,7 +262,7 @@ def _trim_maxlen(backend: Any) -> str: def _append_args(backend: Any, record: TransportRecord) -> list[Any]: - """What both append scripts take: the trims, the record's identity, its fields.""" + """What the append script takes: the trims, the record's identity, its fields.""" args: list[Any] = [ _trim_floor(backend).encode(), _trim_maxlen(backend).encode(), @@ -332,47 +275,15 @@ def _append_args(backend: Any, record: TransportRecord) -> list[Any]: return args -class _PairedAppend: - """One logical record on a topic's input and output keys, in one Redis call.""" - - def __init__(self, backend: RedisStreamBackend) -> None: - """Bind to ``backend``'s client and key layout.""" - self._backend = backend - self._script = backend._client.register_script(_PAIRED_APPEND_LUA) - - async def write( - self, - *, - input_key: StreamKey, - output_key: StreamKey, - record: TransportRecord, - ) -> Offset: - """Append ``record`` to both keys and return where it landed on the output key. - - A repeat of the same ``(session, sequence)`` with the same bytes returns the - original positions and writes nothing, so a call whose answer was lost is - settled by making it again. - """ - outcome, _, output = await self._script( - keys=[ - self._backend.stream_key(input_key), - self._backend._idempotency_key(input_key), - self._backend.stream_key(output_key), - self._backend._idempotency_key(output_key), - ], - args=_append_args(self._backend, record), - ) - if _text(outcome) == "conflict": - raise AppendConflictError(record.idempotency_key) - return Offset(_text(output)) - - -#: Append one record to an activity's stream, or answer where it already is. +#: Append one record to a log, or answer where it already is. #: -#: The single-key form of the paired write: an activity's stream has no input -#: half and no stage, so one stream and its idempotency hash are the whole -#: write, and the retention trims ride along as they do on the pair. -_OWNED_APPEND_LUA: Final = """ +#: The provider's own write rather than the transport's, so the retention trims +#: ride along instead of costing their own round trips; they are exact for the +#: reason the backend's own trims are. The idempotency hash is read before the +#: log is touched, so an identity already used with different bytes refuses the +#: record rather than writing it, and one used with the same bytes answers with +#: the original position, which is what settles a call whose answer was lost. +_LOG_APPEND_LUA: Final = """ local minid = ARGV[1] local maxlen = ARGV[2] local existing = redis.call('HGET', KEYS[2], ARGV[3]) @@ -395,16 +306,16 @@ async def write( """ -class _OwnedAppend: - """One record on an activity's stream, in one Redis call.""" +class _LogAppend: + """One record on one log, a topic's or an activity's, in one Redis call.""" def __init__(self, backend: RedisStreamBackend) -> None: """Bind to ``backend``'s client.""" self._backend = backend - self._script = backend._client.register_script(_OWNED_APPEND_LUA) + self._script = backend._client.register_script(_LOG_APPEND_LUA) async def write(self, *, name: str, record: TransportRecord) -> Offset: - """Append ``record`` to the stream ``name`` and return where it landed. + """Append ``record`` to the log ``name`` and return where it landed. A repeat of the same ``(session, sequence)`` with the same bytes returns the original position and writes nothing. @@ -525,13 +436,27 @@ async def _retained(client: Any, name: str, offset: Offset) -> bool: return wanted > _entry_id(info["last-generated-id"]) -class _RetainingBackend(RedisStreamBackend): - """The transport's Redis backend, trimming the key behind every append it makes. +def _is_staged(fields: Any) -> bool: + """Whether a log entry is one the workflow staged, rather than a producer's.""" + return _STAGE_FIELD in fields + + +class _TopicLogBackend(RedisStreamBackend): + """The transport's Redis backend with this provider's layout and trims. + + One key per topic: the transport renders a topic's input key and its + output key apart, because the direction is part of every key it derives, + and this backend renders both onto the log, the input key's rendering. + Every read the transport makes through an input key, the live watch and + the replay range alike, drops the entries the workflow staged itself, so + a workflow never reads its own records and a recorded range replays to + what was delivered. Reads through an output key are the outside reader's + and see the whole log, with the stage protocol deciding what is visible. Trims are exact rather than approximate: Redis's approximate trim drops whole macro nodes only, so a stream shorter than one node, a hundred entries by default, would never trim and the window would not mean what - it says. Only the streams are trimmed; the idempotency and stage hashes + it says. Only the logs are trimmed; the idempotency and stage hashes beside them keep one entry per record and stage. """ @@ -547,6 +472,51 @@ def __init__( self._retention = retention self._max_len = max_len + def stream_key(self, key: StreamKey) -> str: + """The topic's log, whichever direction the transport asks for.""" + return super().stream_key(replace(key, direction=StreamDirection.INPUT)) + + async def read_after( + self, + key: StreamKey, + after: Any, + *, + max_records: int, + block: timedelta | None = DEFAULT_WATCH_BLOCK, + ) -> list[TransportRecord]: + """The live read, without the entries the workflow staged itself. + + A batch that held nothing but the workflow's own entries is read past + without blocking again, so the transport's recheck, which asks for one + record, is not answered "nothing" while a producer's record sits behind + a staged batch. + """ + if key.direction is StreamDirection.OUTPUT: + return await super().read_after( + key, after, max_records=max_records, block=block + ) + name = self.stream_key(key) + start = _BEGINNING_SENTINEL if after.is_beginning else after.offset.serialize() + block_ms = None if block is None else int(block.total_seconds() * 1000) + if block_ms is not None and block_ms <= 0: + block_ms = None + while True: + found: Any = await self._client.xread( + {name: start}, count=max_records, block=block_ms + ) + entries = found[0][1] if found else [] + if not entries: + return [] + records = [ + _to_record(entry_id, fields) + for entry_id, fields in entries + if not _is_staged(fields) + ] + if records: + return records + start = _text(entries[-1][0]) + block_ms = None + def describe_window(self) -> str: """The configured window, for messages.""" parts = [] @@ -580,7 +550,9 @@ async def stage_output( await self._trim(manifest.stream_key) return stage - async def read_range(self, key: StreamKey, first: Offset, last: Offset) -> Any: + async def read_range( + self, key: StreamKey, first: Offset, last: Offset + ) -> list[TransportRecord]: # The replay read. Said here, where the trim is known, rather than left # to the range checks, which can only report the record as missing. if not await self.retains(key, first): @@ -590,7 +562,16 @@ async def read_range(self, key: StreamKey, first: Offset, last: Offset) -> Any: f"({self.describe_window()}): the records were trimmed, so this " "run cannot be replayed" ) - return await super().read_range(key, first, last) + entries: Any = await self._client.xrange( + self.stream_key(key), first.serialize(), last.serialize() + ) + # The same entries the live read dropped, so the range holds the count + # the marker recorded. + return [ + _to_record(entry_id, fields) + for entry_id, fields in entries + if key.direction is StreamDirection.OUTPUT or not _is_staged(fields) + ] async def retains(self, key: StreamKey, offset: Offset) -> bool: """Whether the record at ``offset`` survived trimming.""" @@ -638,7 +619,7 @@ def _parse(cursor: Cursor, raw: bytes, warn: Any) -> WireRecord | None: class _RedisReadSource: - """One subscription of the running workflow, over the transport's input stream.""" + """One subscription of the running workflow, over the transport's input key.""" def __init__(self, subscription: Any) -> None: self._subscription = subscription @@ -649,7 +630,7 @@ async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: # One record per batch: the transport reports readiness per record, # and a batch here would invent a boundary replay never observed. offset, body = await self._records.__anext__() - cursor = mint_cursor(_PROVIDER, f"{_INPUT_PREFIX}{offset.token}") + cursor = mint_cursor(_PROVIDER, offset.token) wire = _parse(cursor, body, workflow.logger.warning) if wire is not None: return [(cursor, wire)] @@ -677,7 +658,7 @@ def __init__(self, idle_timeout: timedelta) -> None: def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: _require_topic(topic) - position = _workflow_position(after) + position = _position(after) # Without a position the transport resumes where the chain's # predecessor run committed; with one, that is where the wait starts # and what the marker's header records. @@ -735,9 +716,9 @@ class RedisProducer(Generic[T]): """Appends to a topic from outside workflow code. Every append is visible as soon as the store accepts it. Each record goes - to the topic's input stream, waking a workflow subscribed to it, and to - its output stream, where outside readers and the workflow's own records - meet; the cursor returned names the output position. + to the topic's log, where the workflow's subscription reads it and where + outside readers see it beside the workflow's own records, and a workflow + subscribed to the topic is woken; the cursor returned names the entry. """ def __init__( @@ -762,9 +743,7 @@ def __init__( self._sequence = 0 self._last = BEGINNING self._input: Any = None - self._output: Any = None - self._pair: _PairedAppend | None = None - self._owned: _OwnedAppend | None = None + self._append: _LogAppend | None = None self._name: str | None = None self._codec: StreamPayloadCodec[bytes] | None = None @@ -837,6 +816,7 @@ async def _connect(self) -> None: if self._codec is not None: return backend = self._streams._require_backend() + self._append = _LogAppend(backend) if self._owner is not None: # No transport producer to bind and no one to wake: an activity's # stream has no workflow reader and no chain to check the key against. @@ -844,7 +824,6 @@ async def _connect(self) -> None: if self._owner.run_id is None: self._owner = await _resolve_owner(self._client, self._owner) self._name = self._owner.key(_prefix(backend), self._topic) - self._owned = _OwnedAppend(backend) self._codec = StreamPayloadCodec( self._client.data_converter.with_context(self._owner.context()), bytes ) @@ -852,12 +831,8 @@ async def _connect(self) -> None: assert self._workflow_id is not None chain = await _chain(self._client, self._workflow_id) try: - output = await ExternalOutputStreamProducer.connect( - backend=backend, - workflow=chain, - client=self._client, - session_id=self._session, - ) + # The transport's producer is bound for its wake and its key: the + # append itself is the provider's, so the trims ride along with it. input_ = await ExternalStreamProducer.connect( backend=backend, workflow=chain, @@ -869,9 +844,8 @@ async def _connect(self) -> None: f"workflow {self._workflow_id!r} is not the chain this producer " f"was opened on: {error}" ) from error - self._output = output.topic(self._topic, type=bytes) self._input = input_.topic(self._topic, type=bytes) - self._pair = _PairedAppend(backend) + self._name = backend.stream_key(self._input.stream_key) self._codec = StreamPayloadCodec( self._client.data_converter.with_context( WorkflowSerializationContext( @@ -890,7 +864,7 @@ async def _write(self, records: list[WireRecord]) -> Cursor: f"producer {self._session!r} already wrote a different record at " f"sequence {error.key.sequence}" ) from error - except (AppendNotAcknowledgedError, OutputAppendNotAcknowledgedError) as error: + except AppendNotAcknowledgedError as error: raise _storage_error(error, "an append was not acknowledged") from error except TransportStreamError as error: raise _storage_error(error, "the store refused an append") from error @@ -900,30 +874,22 @@ async def _write(self, records: list[WireRecord]) -> Cursor: return self._last async def _place(self, records: list[WireRecord]) -> Offset | None: - """Append ``records`` where the owner keeps them and return the last position.""" - assert self._codec is not None + """Append ``records`` to the owner's log and return the last position.""" + assert self._codec is not None and self._append is not None + assert self._name is not None last: Offset | None = None for index, record in enumerate(records): - # Built here rather than handed to the transport's publish, which - # appends one key per call. The identity is the same one the transport - # would derive, so a record either side already holds is reused. + # Built here rather than handed to the transport's publish, so the + # trims ride along. The identity is the one the transport would + # derive, so a record the log already holds is reused. staged = TransportRecord( kind=TransportRecordKind.DATA, payload=await self._codec.encode(record.SerializeToString()), producer_session_id=self._session, sequence=self._sequence + index, ) - if self._owned is not None: - assert self._name is not None - last = await self._owned.write(name=self._name, record=staged) - continue - assert self._pair is not None - last = await self._pair.write( - input_key=self._input.stream_key, - output_key=self._output.stream_key, - record=staged, - ) - if self._owned is None: + last = await self._append.write(name=self._name, record=staged) + if self._owner is None: await self._wake() return last @@ -976,8 +942,9 @@ async def _chain_is_terminal(self) -> bool: class RedisStreamHandle: """One owner's topics from outside. - The owner is ``workflow_id``'s workflow, read over the transport's output - streams, or with ``activity_id`` an activity, read from the stream the + The owner is ``workflow_id``'s workflow, whose topic logs are read through + the transport's output read so a staged batch is a barrier until its task + settles, or with ``activity_id`` an activity, read from the stream the provider keeps for it: a standalone activity without ``workflow_id``, or an activity that workflow scheduled. """ @@ -1028,20 +995,20 @@ def read( says. Two refusals and they do not land together. A cursor another provider minted, - or one naming a workflow's input log, is refused by this call: reading the + or one that is not a Redis entry id, is refused by this call: reading the token needs nothing from the store. A well-formed cursor the retention has trimmed is refused on the first step of the generator, because answering that needs a round trip and this call is not a coroutine. Neither yields a record first. Raises: - StreamCursorError: The cursor is another provider's, or names a - workflow's input log. + StreamCursorError: The cursor is another provider's, or does not name + a Redis entry. """ topic, result_type = resolve_topic(topic, result_type) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. - position = _outside_position(after) + position = _position(after) if self._owner is not None: return self._read_owned(self._owner, topic, position, after, result_type) return self._read(topic, position, after, result_type) @@ -1065,7 +1032,7 @@ async def _read_owned( name = owner.key(_prefix(backend), topic) if ( position is not None - and isinstance(backend, _RetainingBackend) + and isinstance(backend, _TopicLogBackend) and not await _retained(store, name, position) ): # Refused rather than resumed from the first retained record, @@ -1157,7 +1124,7 @@ async def _read( key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) if ( position is not None - and isinstance(backend, _RetainingBackend) + and isinstance(backend, _TopicLogBackend) and not await backend.retains(key, position) ): # Refused rather than resumed from the first retained record, @@ -1320,7 +1287,7 @@ def __init__( url: str = "redis://127.0.0.1:6379", key_prefix: str = "temporal-streams", idle_timeout: timedelta = timedelta(seconds=1), - backend: Any | None = None, + client: Any | None = None, poll_interval: timedelta = timedelta(milliseconds=500), retention: timedelta | None = DEFAULT_RETENTION, max_len: int | None = None, @@ -1328,19 +1295,18 @@ def __init__( """Create the provider. Args: - url: The Redis to connect to when no ``backend`` is given. + url: The Redis to connect to when no ``client`` is given. key_prefix: Prepended to every key, so one Redis serves several deployments. idle_timeout: How long a workflow reader with nothing to read holds its Workflow Task open before the worker parks it. - backend: A transport backend the caller constructed and owns. It - is trimmed by its owner, so it takes no ``max_len`` and no - ``retention`` other than the default, which does not apply - to it. + client: A ``redis.asyncio.Redis`` the caller opened, with + ``decode_responses=False``, and closes itself; the provider + puts its own key layout and trims on top of it. poll_interval: How long an outside reader that is caught up waits for a record before asking whether the workflow closed. - retention: Trim records older than this from a topic's input and - output keys on every append the provider makes to them. + retention: Trim records older than this from a topic's log on + every append the provider makes to it. :data:`DEFAULT_RETENTION`, seven days, unless the caller says otherwise; ``None`` keeps every record until ``max_len`` trims it, or for good when that is unset too. This is @@ -1362,36 +1328,32 @@ def __init__( raise ValueError("retention must be positive") if max_len is not None and max_len < 1: raise ValueError("max_len must be positive") - if backend is not None and ( - retention not in (None, DEFAULT_RETENTION) or max_len is not None - ): - raise ValueError( - "retention and max_len trim the backend this provider opens; a " - "backend handed in is trimmed by its owner" - ) self._url = url self._key_prefix = key_prefix self._idle_timeout = idle_timeout - self._backend = backend + self._client = client + self._backend: _TopicLogBackend | None = None self._owned_client: Any = None self._poll = poll_interval self._retention = retention self._max_len = max_len - def _require_backend(self) -> Any: + def _require_backend(self) -> _TopicLogBackend: if self._backend is None: - import redis.asyncio - - # A dead peer would otherwise hold a blocking read open forever. - # Several block periods, so a healthy socket that is merely idle - # inside one read window is never abandoned. - self._owned_client = redis.asyncio.from_url( - self._url, - decode_responses=False, - socket_timeout=DEFAULT_WATCH_BLOCK.total_seconds() * 6, - ) - self._backend = _RetainingBackend( - client=self._owned_client, + client = self._client + if client is None: + import redis.asyncio + + # A dead peer would otherwise hold a blocking read open forever. + # Several block periods, so a healthy socket that is merely idle + # inside one read window is never abandoned. + client = self._owned_client = redis.asyncio.from_url( + self._url, + decode_responses=False, + socket_timeout=DEFAULT_WATCH_BLOCK.total_seconds() * 6, + ) + self._backend = _TopicLogBackend( + client=client, key_prefix=self._key_prefix, retention=self._retention, max_len=self._max_len, @@ -1444,8 +1406,8 @@ def get_activity_stream_handle( return RedisStreamHandle(self, client, workflow_id, run_id, activity_id) async def close(self) -> None: - """Release the Redis connections this provider opened.""" + """Release the Redis connection this provider opened; a caller's stays open.""" + self._backend = None client, self._owned_client = self._owned_client, None if client is not None: - self._backend = None await client.aclose() diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index dcb51adff..93758076e 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -29,8 +29,7 @@ RedisStreams, _ActivityOwner, _drive, - _outside_position, - _workflow_position, + _position, ) @@ -205,18 +204,21 @@ def test_an_activity_owner_names_itself_for_messages(): ) -def test_outside_cursors_name_output_positions(): - assert _outside_position(BEGINNING) is None - position = _outside_position(Cursor("redis:1700000000000-3")) +def test_cursors_name_entries_of_the_topics_one_log(): + assert _position(BEGINNING) is None + position = _position(Cursor("redis:1700000000000-3")) assert position is not None and position.token == "1700000000000-3" - # A workflow-side cursor names the input log, which outside code cannot - # read from, and a token another provider minted is refused the same way. + # A workflow reader and an outside reader name the same log, so either + # side's cursor seeds the other. The form the two-key layout minted for + # workflow readers named an entry of the input key, which is the log now. + legacy = _position(Cursor("redis:in:1700000000000-3")) + assert legacy is not None and legacy.token == "1700000000000-3" with pytest.raises(StreamCursorError): - _outside_position(Cursor("redis:in:1700000000000-3")) + _position(Cursor("memory:3")) with pytest.raises(StreamCursorError): - _outside_position(Cursor("memory:3")) + _position(Cursor("redis:not-an-id")) with pytest.raises(StreamCursorError): - _outside_position(Cursor("redis:not-an-id")) + _position(Cursor("redis:in:not-an-id")) def test_a_publish_that_completes_at_once_is_driven_to_the_end(): @@ -240,35 +242,27 @@ async def run() -> None: asyncio.run(run()) -def test_workflow_cursors_name_input_positions(): - assert _workflow_position(BEGINNING) is None - position = _workflow_position(Cursor("redis:in:1700000000000-3")) - assert position is not None and position.token == "1700000000000-3" - # An outside cursor names the output stream, whose entry ids are not the - # input stream's, so it cannot seed a workflow reader. - with pytest.raises(StreamCursorError, match="output stream"): - _workflow_position(Cursor("redis:1700000000000-3")) - with pytest.raises(StreamCursorError): - _workflow_position(Cursor("memory:3")) - with pytest.raises(StreamCursorError): - _workflow_position(Cursor("redis:in:not-an-id")) - - def test_retention_options_are_checked_at_construction(): with pytest.raises(ValueError, match="retention"): RedisStreams(retention=timedelta(0)) with pytest.raises(ValueError, match="max_len"): RedisStreams(max_len=0) - # A backend the caller owns is the caller's to trim; the default window - # is not a request to trim it. - with pytest.raises(ValueError, match="trimmed by its owner"): - RedisStreams(backend=object(), max_len=10) - with pytest.raises(ValueError, match="trimmed by its owner"): - RedisStreams(backend=object(), retention=timedelta(hours=1)) - RedisStreams(backend=object()) RedisStreams(retention=timedelta(hours=1), max_len=10) +async def test_a_client_the_caller_opened_gets_the_providers_layout_and_stays_open(): + # The layout and the trims are the provider's whichever connection it + # runs on, and closing the provider does not close a caller's client. + client = _NoRedis() + provider = RedisStreams(client=client, max_len=10) + backend = provider._require_backend() + assert backend._client is client + assert backend.describe_window() == f"retention={DEFAULT_RETENTION}, max_len=10" + await provider.close() + assert provider._require_backend() is not backend + assert provider._require_backend()._client is client + + async def test_the_default_window_is_an_age_and_can_be_turned_off(): # Nothing is trimmed on a topic nobody appends to, so the default has to # be a window that every append applies; a count cap would refuse a task diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 6a9cea2b6..586cbefb0 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -225,28 +225,29 @@ async def test_query_after_completion_replays_the_final_task( assert values == [{"n": 0}, {"n": 1}, {"n": 2}, {"n": 3}] -async def _key_lengths( +async def _log_length( streams: RedisStreams, client: Client, workflow_id: str, topic: str -) -> tuple[int, int]: - """How many entries the topic's input and output keys hold.""" +) -> int: + """How many entries the topic's log holds. + + Both of the transport's keys for the topic render onto the log, which is + what makes it one; asked through both so a test would notice if they came + apart. + """ import redis.asyncio backend = streams._require_backend() chain = await _chain(client, workflow_id) store = redis.asyncio.from_url(redis_url()) try: - return ( - await store.xlen( - backend.stream_key( - chain.stream_key(topic, direction=StreamDirection.INPUT) - ) - ), - await store.xlen( - backend.stream_key( - chain.stream_key(topic, direction=StreamDirection.OUTPUT) - ) - ), + by_input = backend.stream_key( + chain.stream_key(topic, direction=StreamDirection.INPUT) ) + by_output = backend.stream_key( + chain.stream_key(topic, direction=StreamDirection.OUTPUT) + ) + assert by_input == by_output + return await store.xlen(by_input) finally: await store.aclose() @@ -297,10 +298,7 @@ async def test_a_replay_past_the_retention_window_fails_loudly(live_client: Clie assert len(await handle.result()) == 4 before = await take(stream.read(topic=INPUTS), 4, 60) history = await handle.fetch_history() - assert await _key_lengths(streams, live_client, workflow_id, INPUTS.name) == ( - 4, - 4, - ) + assert await _log_length(streams, live_client, workflow_id, INPUTS.name) == 4 # Inside the window the recorded ranges read back and the replay passes. await Replayer(workflows=[ContractLoop], plugins=[streams]).replay_workflow( @@ -309,10 +307,7 @@ async def test_a_replay_past_the_retention_window_fails_loudly(live_client: Clie late = stream.producer(topic=INPUTS, producer_id="late", attempt=1) cursors = [await late.append({"n": n}) for n in range(10, 16)] - assert await _key_lengths(streams, live_client, workflow_id, INPUTS.name) == ( - 6, - 6, - ) + assert await _log_length(streams, live_client, workflow_id, INPUTS.name) == 6 # The recorded input ranges are gone, and the replay says so rather # than delivering fewer records. @@ -364,11 +359,8 @@ async def test_retention_by_age_trims_older_entries(live_client: Client): await asyncio.sleep(0.6) # The append that crosses the window is what trims the two before it. third = await producer.append({"n": 3}) - assert await _key_lengths( - streams, live_client, workflow_id, INPUTS.name - ) == ( - 1, - 1, + assert ( + await _log_length(streams, live_client, workflow_id, INPUTS.name) == 1 ) assert await stream.latest(topic=INPUTS) == third with pytest.raises(StreamCursorError, match="retention has trimmed"): @@ -733,13 +725,12 @@ async def test_a_batch_the_window_cannot_hold_is_refused_at_the_stage( await streams.close() -async def test_a_producer_record_lands_on_both_keys_or_on_neither( +async def test_a_producer_record_lands_once_however_often_it_is_sent( live_client: Client, provider: RedisStreams ): - # The workflow reads the input key and outside readers read the output key. - # Written one at a time, a crash between them leaves a record the workflow - # acts on that no outside reader can ever see. - workflow_id = f"streams-redis-pair-{uuid.uuid4().hex}" + # One log per topic: an outside record is written once, where the + # workflow's subscription and outside readers both find it. + workflow_id = f"streams-redis-once-{uuid.uuid4().hex}" async with Worker( live_client, task_queue=f"tq-{workflow_id}", @@ -753,10 +744,7 @@ async def test_a_producer_record_lands_on_both_keys_or_on_neither( topic=INPUTS, producer_id="model", attempt=1 ) await producer.append({"n": 1}, {"n": 2}, {"n": 3}) - assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( - 3, - 3, - ) + assert await _log_length(provider, live_client, workflow_id, INPUTS.name) == 3 # A producer that comes back with a fresh sequence re-appends the same # identities, which the script reuses rather than doubling. @@ -764,16 +752,13 @@ async def test_a_producer_record_lands_on_both_keys_or_on_neither( topic=INPUTS, producer_id="model", attempt=1 ) await again.append({"n": 1}, {"n": 2}, {"n": 3}) - assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( - 3, - 3, - ) + assert await _log_length(provider, live_client, workflow_id, INPUTS.name) == 3 await handle.signal(StreamHost.release) await handle.result() -async def test_a_repeat_under_one_identity_with_other_bytes_writes_neither_key( +async def test_a_repeat_under_one_identity_with_other_bytes_writes_nothing( live_client: Client, provider: RedisStreams ): workflow_id = f"streams-redis-conflict-{uuid.uuid4().hex}" @@ -793,22 +778,18 @@ async def test_a_repeat_under_one_identity_with_other_bytes_writes_neither_key( other = stream.producer(topic=INPUTS, producer_id="model", attempt=1) with pytest.raises(StreamProducerError, match="sequence 0"): await other.append({"n": 99}) - # The refusal wrote nothing on either key. - assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( - 1, - 1, - ) + # The refusal wrote nothing. + assert await _log_length(provider, live_client, workflow_id, INPUTS.name) == 1 await handle.signal(StreamHost.release) await handle.result() -async def test_a_refused_output_half_leaves_the_input_key_untouched( +async def test_an_identity_claimed_with_other_bytes_refuses_the_first_append( live_client: Client, provider: RedisStreams ): - # The two keys are one write. Written one at a time, the input half lands - # before the output half is refused, and the workflow then consumes a record - # no outside reader can ever see. - workflow_id = f"streams-redis-atomic-{uuid.uuid4().hex}" + # The idempotency hash is read before the log is touched, so a claim that + # disagrees with the record refuses it without writing. + workflow_id = f"streams-redis-claimed-{uuid.uuid4().hex}" async with Worker( live_client, task_queue=f"tq-{workflow_id}", @@ -820,11 +801,9 @@ async def test_a_refused_output_half_leaves_the_input_key_untouched( ) backend = provider._require_backend() chain = await _chain(live_client, workflow_id) - output_key = chain.stream_key(INPUTS.name, direction=StreamDirection.OUTPUT) - # Claim the output half's first identity with other bytes, which is what a - # refusal of that half looks like from the producer's side. + key = chain.stream_key(INPUTS.name, direction=StreamDirection.OUTPUT) await backend._client.hset( - backend._idempotency_key(output_key), "model#1/0", "1-0|" + "0" * 64 + backend._idempotency_key(key), "model#1/0", "1-0|" + "0" * 64 ) producer = provider.get_stream_handle(live_client, workflow_id).producer( @@ -833,9 +812,82 @@ async def test_a_refused_output_half_leaves_the_input_key_untouched( with pytest.raises(StreamProducerError, match="sequence 0"): await producer.append({"n": 1}) - assert await _key_lengths(provider, live_client, workflow_id, INPUTS.name) == ( - 0, - 0, - ) + assert await _log_length(provider, live_client, workflow_id, INPUTS.name) == 0 await handle.signal(StreamHost.release) await handle.result() + + +@workflow.defn +class EchoOnOneTopic: + """Reads ``inputs`` and answers each value on the same topic. + + Its own records land in the log it reads, so what it returns says whether + it read them back. + """ + + @workflow.run + async def run(self) -> list[Any]: + seen: list[Any] = [] + out = workflow.stream_writer(INPUTS) + async for record in workflow.stream_reader(INPUTS): + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + seen.append(record.value) + out.publish({"echo": record.value}) + out.finish() + return seen + + @workflow.query + def probe(self) -> int: + return 1 + + +async def test_a_workflow_does_not_read_its_own_records_from_the_shared_log( + live_client: Client, provider: RedisStreams +): + workflow_id = f"streams-redis-echo-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[EchoOnOneTopic], + plugins=[provider], + ) as worker: + handle = await live_client.start_workflow( + EchoOnOneTopic.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + # The echoes are promoted into the same log the producer wrote to. + first_four = await take(stream.read(topic=INPUTS), 4, 60) + assert sorted( + ((r.producer_id, r.value) for r in first_four), key=str + ) == sorted( + [ + ("model", {"n": 1}), + ("model", {"n": 2}), + ("", {"echo": {"n": 1}}), + ("", {"echo": {"n": 2}}), + ], + key=str, + ) + await producer.finish() + # The workflow saw the producer's records and none of its echoes. + assert await asyncio.wait_for(handle.result(), 60) == [{"n": 1}, {"n": 2}] + assert await _log_length(provider, live_client, workflow_id, INPUTS.name) == 6 + + # A cold query replays the run against the log with its own entries + # in every recorded range; the read filters them the way the live one did. + assert await handle.query(EchoOnOneTopic.probe) == 1 + everything = [r async for r in stream.read(topic=INPUTS)] + assert [(r.producer_id, r.kind) for r in everything if r.producer_id == ""] == [ + ("", RecordKind.DATA), + ("", RecordKind.DATA), + ("", RecordKind.FINISH), + ] + + await Replayer(workflows=[EchoOnOneTopic], plugins=[provider]).replay_workflow( + await handle.fetch_history() + ) From b8ca5b8ac4b36f88ea19a44169aba953d1b301f4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:40:12 -0700 Subject: [PATCH 697/831] Handed a stream across a Nexus operation as a StreamRef. The front's handle names its stream as the SDK's StreamRef, the front implements the three owner accessors so client.get_stream_handle(ref) opens a ref through the endpoint, and the handler asks the store for a standalone stream by its own accessor. The live test is June scenario s8 (b) without the emulation: an operation returns a ref, another appends to one. --- temporalio/streams/providers/nexus.py | 102 +++++++++-- tests/streams/test_nexus_provider.py | 253 ++++++++++++++++++++++++++ 2 files changed, 342 insertions(+), 13 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index c22118f54..27ac56da3 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -73,7 +73,7 @@ from collections.abc import AsyncGenerator, Awaitable, Callable, Mapping from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, Generic, Literal, NoReturn, TypeVar, cast +from typing import Any, Generic, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler @@ -87,6 +87,7 @@ from temporalio.common import RawValue from temporalio.service import ConnectConfig, RPCError, RPCStatusCode, ServiceClient from temporalio.streams._errors import ( + StreamClosedError, StreamCursorError, StreamError, StreamNotFoundError, @@ -102,6 +103,7 @@ StreamRecord, check_read_start, ) +from temporalio.streams._ref import StreamOwnerKind, StreamRef from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -129,7 +131,6 @@ T = TypeVar("T") -_Kind = Literal["workflow", "activity", "standalone"] # The reference's identity on the handler, topic included, so one parked read # and one producer state key on exactly what the wire names. _StreamKey = tuple[str, str, str, str, str, str] @@ -182,6 +183,7 @@ StreamNotFoundError, StreamCursorError, StreamProducerError, + StreamClosedError, StreamUnsupportedError, ) } @@ -236,13 +238,13 @@ def _stream_key(ref: WireStreamRef) -> _StreamKey: class _Address: """The owner a handle is bound to; a topic completes it into a reference.""" - kind: _Kind + kind: StreamOwnerKind workflow_id: str | None = None run_id: str | None = None activity_id: str | None = None stream_id: str | None = None - def ref(self, topic: str) -> WireStreamRef: + def wire(self, topic: str) -> WireStreamRef: return WireStreamRef( kind=self.kind, workflow_id=self.workflow_id, @@ -252,6 +254,18 @@ def ref(self, topic: str) -> WireStreamRef: topic=topic, ) + def ref(self, topic: str) -> StreamRef: + # The same members under the SDK's own name, so what an operation + # returns is what client.get_stream_handle(ref) opens. + return StreamRef( + self.kind, + topic, + workflow_id=self.workflow_id, + run_id=self.run_id, + activity_id=self.activity_id, + stream_id=self.stream_id, + ) + def _handler_error(error: StreamError) -> nexusrpc.HandlerError: """Carry a stream condition across the endpoint under its own class name.""" @@ -355,12 +369,8 @@ def _stream(self, ref: WireStreamRef) -> StreamHandle: workflow_id=ref.workflow_id or None, run_id=ref.run_id or None, ) - # The provider protocol reaches a stream through its owning execution; - # a standalone stream has none, so no store behind the endpoint can be - # asked for it yet. - raise StreamUnsupportedError( - "the store behind the endpoint cannot host a standalone stream: a " - "provider addresses a stream by its owning workflow or activity" + return self._provider.get_standalone_stream_handle( + client, cast(str, ref.stream_id) ) @nexusrpc.handler.sync_operation @@ -966,7 +976,7 @@ async def _read( ) token = after.token last_n = last - stream = self._address.ref(topic) + stream = self._address.wire(topic) while True: answer = await self._front.invoke( _READ_OPERATION, @@ -1005,7 +1015,7 @@ async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor topic, _ = resolve_topic(topic) answer = await self._front.invoke( _READ_OPERATION, - ReadInput(stream=self._address.ref(topic), latest_only=True), + ReadInput(stream=self._address.wire(topic), latest_only=True), ReadOutput, timeout=_APPEND_TIMEOUT, ) @@ -1023,7 +1033,37 @@ def producer( topic, _ = resolve_topic(topic) producer_id, attempt = producer_identity(producer_id, attempt) return NexusProducer( - self._front, self._address.ref(topic), producer_id, attempt + self._front, self._address.wire(topic), producer_id, attempt + ) + + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A :class:`temporalio.streams.StreamRef` to ``topic`` of this owner. + + Plain data naming the owner as this handle addresses it and the + topic, with no cursor and no endpoint, so an operation can return it + and whoever receives it opens it with ``client.get_stream_handle(ref)`` + on the front or on the store itself. + """ + name, _ = resolve_topic(topic) + return self._address.ref(name) + + async def close(self) -> None: + """Refused: the contract carries no operation that seals a stream. + + Raises: + ValueError: The handle is on a workflow's or an activity's stream, + which ends with its owner. + StreamUnsupportedError: The handle is on a standalone stream; seal + it on the store's own handle. + """ + if self._address.kind != "standalone": + raise ValueError( + "only a standalone stream can be closed; this handle is on an owner's " + "stream, which ends when the owner does" + ) + raise StreamUnsupportedError( + "the stream endpoint has no operation that seals a standalone stream; " + "close it on the store's own handle" ) @@ -1131,6 +1171,42 @@ def get_activity_stream_handle( _Address("activity", workflow_id, run_id, activity_id), ) + def get_standalone_stream_handle( + self, client: Client | None, stream_id: str + ) -> NexusStreamHandle: + """A handle on the standalone stream ``stream_id``, through the endpoint. + + The reference carries the standalone owner across; the store behind + the endpoint answers whether it hosts one, and a refusal reaches the + caller as :class:`temporalio.streams.StreamUnsupportedError` on the + first call. + """ + if not stream_id: + raise ValueError("stream_id must not be empty") + return NexusStreamHandle( + _Front(self, client), _Address("standalone", stream_id=stream_id) + ) + + async def create_standalone_stream( + self, + client: Client | None, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> NoReturn: + """Refused: the contract carries no operation that creates a stream. + + Raises: + StreamUnsupportedError: Always. Create the stream on the store + behind the endpoint and hand its reference to callers. + """ + raise StreamUnsupportedError( + "the stream endpoint has no operation that creates a standalone stream; " + "create it on the store behind the endpoint and pass its StreamRef" + ) + async def close(self) -> None: """Nothing to release: each call opens and closes its own connection.""" diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 0d5a0f43b..8982441ad 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -27,6 +27,7 @@ import os import uuid from collections.abc import AsyncIterator, Mapping, Sequence +from dataclasses import dataclass from datetime import datetime, timedelta, timezone from typing import Any, cast from unittest import mock @@ -36,6 +37,8 @@ import pytest import temporalio.converter +from temporalio import nexus as temporal_nexus +from temporalio import streams, workflow from temporalio.api.common.v1 import Payload from temporalio.api.nexus.v1 import EndpointSpec, EndpointTarget from temporalio.api.operatorservice.v1 import ( @@ -43,6 +46,7 @@ DeleteNexusEndpointRequest, ) from temporalio.client import Client +from temporalio.common import WorkflowIDConflictPolicy from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( BEGINNING, @@ -51,8 +55,10 @@ RecordKind, StreamCursorError, StreamProducerError, + StreamRef, StreamUnsupportedError, ) +from temporalio.streams._ref import open_ref from temporalio.streams._wire import WireRecord from temporalio.streams.providers import nexus from temporalio.streams.providers._nexus_generated import AppendInput, ReadInput @@ -943,3 +949,250 @@ async def test_a_reference_missing_its_owner_id_is_the_callers_fault(): request.stream = ref await _dispatch(handler, APPEND_OPERATION, request) assert failed.value.type is nexusrpc.HandlerErrorType.BAD_REQUEST + + +async def test_a_handle_names_its_stream_as_a_ref_that_opens_on_the_front( + monkeypatch: pytest.MonkeyPatch, +): + store = MemoryStreams() + handler = TemporalStreamsHandler(store, None) + monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) + front = _front(None) + handle = front.get_stream_handle(None, "wf", run_id="r1") + ref = handle.ref(topic=INPUTS) + assert ref == StreamRef.for_workflow("wf", run_id="r1", topic=INPUTS) + # Plain data: the default converter carries it the way an operation + # result or a workflow argument is carried. + converter = temporalio.converter.DataConverter.default.payload_converter + carried = converter.from_payloads([converter.to_payloads([ref])[0]], [StreamRef]) + assert carried == [ref] + # Opened on the front, the ref reaches the same stream and its topic is + # the handle's default; the client accessor goes through open_ref. + opened = open_ref(front, cast(Client, None), ref) + await opened.producer(producer_id="model", attempt=1).append({"n": 1}) + records = await take(handle.read(topic=INPUTS, result_type=dict), 1, timeout=30) + assert records[0].value == {"n": 1} + assert opened.ref() == ref + # Every owner kind names itself. + assert front.get_activity_stream_handle( + None, "act", workflow_id="wf" + ).ref() == StreamRef.for_activity("act", workflow_id="wf") + assert front.get_standalone_stream_handle(None, "s-1").ref( + topic="t" + ) == StreamRef.for_standalone("s-1", topic="t") + await handler.close() + + +async def test_the_front_refuses_what_the_contract_cannot_carry(): + # No create and no seal operation: an owned stream cannot be closed by + # anyone, and a standalone stream is created and sealed on the store. + front = _front(None) + with pytest.raises(ValueError, match="only a standalone stream"): + await front.get_stream_handle(None, "wf").close() + with pytest.raises(StreamUnsupportedError, match="seals"): + await front.get_standalone_stream_handle(None, "s-1").close() + with pytest.raises(StreamUnsupportedError, match="creates"): + await front.create_standalone_stream(None, "s-1") + with pytest.raises(ValueError, match="stream_id"): + front.get_standalone_stream_handle(None, "") + + +# --------------------------------------------------------------------------- +# A stream as an operation result and as an operation input (June s8 b). +# --------------------------------------------------------------------------- + + +@dataclass +class ScoreUpdate: + """One score change.""" + + home: int + away: int + + +@dataclass +class GameRequest: + """Which game to start, and where its workflow runs.""" + + game_id: str + task_queue: str + + +@dataclass +class ScorePost: + """A score for the stream given, and whether it is the last one.""" + + stream: StreamRef + score: ScoreUpdate + last: bool = False + + +@dataclass +class CallerInput: + """The endpoint to call, the game to ask for, and the scores to post.""" + + endpoint: str + game_id: str + task_queue: str + scores: list[ScoreUpdate] + + +SCORES = streams.topic("scores", ScoreUpdate) +COMMANDS = streams.topic("commands", ScoreUpdate) + + +@workflow.defn +class ScoreboardGame: + """Reads posted scores on ``commands`` and publishes each on ``scores``.""" + + @workflow.run + async def run(self) -> int: + """Relay every posted score until the poster finishes, then finish.""" + posted = 0 + scores = workflow.stream_writer(SCORES) + async for record in workflow.stream_reader(COMMANDS): + if record.kind is RecordKind.FINISH: + break + if record.kind is RecordKind.DATA: + assert record.value is not None + scores.publish(record.value) + posted += 1 + scores.finish() + return posted + + +@nexusrpc.service +class ScoreboardService: + """Starts a game and hands back its stream; takes a stream to post to.""" + + start_game: nexusrpc.Operation[GameRequest, StreamRef] + post_score: nexusrpc.Operation[ScorePost, None] + + +@nexusrpc.handler.service_handler(service=ScoreboardService) +class ScoreboardHandler: + """Serves the two operations as a client of the stream front.""" + + @nexusrpc.handler.sync_operation + async def start_game( + self, _ctx: nexusrpc.handler.StartOperationContext, input: GameRequest + ) -> StreamRef: + """Start the game workflow and return a ref to its ``scores`` topic.""" + client = temporal_nexus.client() + # Reusing a running game makes a retried start hand back the same ref. + await client.start_workflow( + ScoreboardGame.run, + id=input.game_id, + task_queue=input.task_queue, + id_conflict_policy=WorkflowIDConflictPolicy.USE_EXISTING, + ) + return client.get_stream_handle(input.game_id).ref(topic=SCORES) + + @nexusrpc.handler.sync_operation + async def post_score( + self, ctx: nexusrpc.handler.StartOperationContext, input: ScorePost + ) -> None: + """Append the score to the stream the caller named.""" + # The request id is the producer, so a retried post writes once. + producer = ( + temporal_nexus.client() + .get_stream_handle(input.stream) + .producer(producer_id=f"post-{ctx.request_id}", attempt=1) + ) + await producer.append(input.score) + if input.last: + await producer.finish() + + +@workflow.defn +class ScoreboardCaller: + """Calls the operations and passes the ref on; it never reads the stream.""" + + @workflow.run + async def run(self, input: CallerInput) -> StreamRef: + """Start a game, post the scores to it, and return where to read them.""" + scoreboard = workflow.create_nexus_client( + service=ScoreboardService, endpoint=input.endpoint + ) + ref = await scoreboard.execute_operation( + ScoreboardService.start_game, + GameRequest(input.game_id, input.task_queue), + ) + for index, score in enumerate(input.scores): + await scoreboard.execute_operation( + ScoreboardService.post_score, + ScorePost( + ref.with_topic(COMMANDS), score, last=index == len(input.scores) - 1 + ), + ) + return ref + + +@live_only +async def test_an_operation_returns_a_stream_ref_and_another_takes_one(): + # June s8 (b) without the emulation: the operation's result type is the + # SDK's StreamRef, the calling workflow passes it on as data, the client + # opens it on the front it carries and long-polls it, and a second + # operation appends to a stream it was given as input. The handlers are + # clients of the front like any process; only the game workflow's worker + # holds the store. + store = WorkflowStreamsProvider() + plain = await _live_client() + game_id = f"streams-nexus-ref-{uuid.uuid4().hex}" + handler_tq = f"handlers-{game_id}" + stream_handler = TemporalStreamsHandler(store, plain) + + async with ( + _own_endpoint(plain, game_id, handler_tq) as endpoint, + Worker( + plain, + task_queue=handler_tq, + nexus_service_handlers=[stream_handler], + ), + ): + front = _live_front(endpoint) + config = plain.config() + config["plugins"] = [front] + fronted = Client(**config) + async with ( + Worker( + fronted, + task_queue=f"scoreboard-{game_id}", + nexus_service_handlers=[ScoreboardHandler()], + ), + Worker( + plain, + task_queue=f"tq-{game_id}", + workflows=[ScoreboardGame, ScoreboardCaller], + plugins=[store], + ), + ): + # The scoreboard service sits behind its own endpoint. + async with _own_endpoint( + plain, f"scoreboard-{game_id}", f"scoreboard-{game_id}" + ) as scoreboard_endpoint: + posted = [ScoreUpdate(1, 0), ScoreUpdate(1, 1), ScoreUpdate(2, 1)] + ref = await plain.execute_workflow( + ScoreboardCaller.run, + CallerInput(scoreboard_endpoint, game_id, f"tq-{game_id}", posted), + id=f"{game_id}-caller", + task_queue=f"tq-{game_id}", + ) + assert ref == StreamRef.for_workflow(game_id, topic=SCORES) + + # The ref is plain data the client opens on its own provider, + # here the front, and reads with the endpoint's long poll. It + # names the topic, not the record type, so the reader says + # what to decode as, the way a runtime topic name does. + records = await take( + fronted.get_stream_handle(ref).read(result_type=ScoreUpdate), 4, 60 + ) + assert [record.kind for record in records] == [ + RecordKind.DATA, + RecordKind.DATA, + RecordKind.DATA, + RecordKind.FINISH, + ] + assert [record.value for record in records[:3]] == posted + assert await plain.get_workflow_handle(game_id).result() == 3 + await stream_handler.close() From a95c913161d5211baab19cd5d7fba594566061f8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:42:04 -0700 Subject: [PATCH 698/831] Hosted standalone streams in the memory provider. A standalone stream lives in the provider with its policy and a sealed flag. The policy trims on append, a seal wakes parked readers so their reads end, and a stream id that was never created is refused at the call, so the conformance suite can run the standalone cases without a server. --- temporalio/streams/providers/memory.py | 180 +++++++++++++++++++++---- 1 file changed, 152 insertions(+), 28 deletions(-) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 3139805c1..ce8a4ae10 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -23,8 +23,13 @@ waits for the workflow. - It keeps every record until :meth:`MemoryStreams.truncate` drops the oldest ones, which stands in for a store's retention in tests. -- It does not host standalone streams; both standalone calls raise - :class:`temporalio.streams.StreamUnsupportedError`. +- A standalone stream lives here with its policy and a sealed flag. + ``retention``, ``max_records`` and ``max_bytes`` are applied when a record + is appended, so a stream nobody writes to keeps records past their + retention. A read on it ends when it is sealed and the tail delivered, and + a read, ``latest`` or ``producer`` on a stream id that does not exist + raises :class:`temporalio.streams.StreamNotFoundError` at the call rather + than waiting for the stream to be created. - The outside path encodes and decodes bodies through the client's data converter, codec and external storage included, and fingerprints a retry over the converted bytes first. The workflow half has no client, so a @@ -41,7 +46,9 @@ import asyncio import logging +import time from collections.abc import AsyncGenerator +from dataclasses import dataclass from datetime import timedelta from typing import Any, Generic, TypeVar @@ -53,9 +60,10 @@ from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._body import content_fingerprint, decode_body, encode_body from temporalio.streams._errors import ( + StreamClosedError, StreamCursorError, + StreamNotFoundError, StreamProducerError, - StreamUnsupportedError, ) from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink @@ -93,15 +101,45 @@ def _wake(future: asyncio.Future[None]) -> None: future.set_result(None) +@dataclass(frozen=True) +class _Policy: + """What a standalone stream retains, applied as records are appended.""" + + retention: timedelta | None = None + max_records: int | None = None + max_bytes: int | None = None + + def __post_init__(self) -> None: + if self.retention is not None and self.retention <= timedelta(0): + raise ValueError("retention must be positive") + if self.max_records is not None and self.max_records <= 0: + raise ValueError("max_records must be positive") + if self.max_bytes is not None and self.max_bytes <= 0: + raise ValueError("max_bytes must be positive") + + +class _Standalone: + """One standalone stream: its policy, its seal and its topics.""" + + def __init__(self, policy: _Policy) -> None: + self.policy = policy + self.sealed = False + self.topics: dict[str, _Topic] = {} + + class _Topic: """One topic's records, and the waiters parked on its tail.""" - def __init__(self) -> None: + def __init__(self, policy: _Policy | None = None, *, sealed: bool = False) -> None: + self.policy = policy + self.sealed = sealed # The retained records, the first of which sits at offset ``base``. # Offsets are never reused, so a cursor keeps naming the same record # after truncation drops the ones before it. self.base = 0 self.records: list[bytes] = [] + # When each retained record landed, for a retention policy. + self.stamps: list[float] = [] # Dedupe identity is (producer#attempt, first sequence of the append), # the same pair the storage providers use, mapped to where the batch # landed and a digest of what it held, so a repeat answers with the @@ -132,7 +170,10 @@ def append( Raises: StreamProducerError: ``(writer, sequence)`` is held with different content. + StreamClosedError: The stream was sealed. """ + if self.sealed: + raise StreamClosedError("the stream is closed and takes no more records") key = (writer or "", sequence) bodies = [wire.SerializeToString(deterministic=True) for wire in wires] if content is None: @@ -148,13 +189,43 @@ def append( ) return first, count first = self.head + now = time.time() self.records.extend(bodies) + self.stamps.extend([now] * len(bodies)) if writer is not None: self.seen[key] = (first, len(wires), content) + self._apply_policy(now) + self._wake_waiters() + return first, len(wires) + + def _wake_waiters(self) -> None: waiters, self._waiters = self._waiters, [] for loop, future in waiters: loop.call_soon_threadsafe(_wake, future) - return first, len(wires) + + def _apply_policy(self, now: float) -> None: + policy = self.policy + if policy is None: + return + drop = 0 + if policy.max_records is not None: + drop = max(drop, len(self.records) - policy.max_records) + if policy.max_bytes is not None: + held = sum(len(record) for record in self.records) + while drop < len(self.records) and held > policy.max_bytes: + held -= len(self.records[drop]) + drop += 1 + if policy.retention is not None: + floor = now - policy.retention.total_seconds() + while drop < len(self.records) and self.stamps[drop] < floor: + drop += 1 + if drop: + self._drop(drop) + + def seal(self) -> None: + """Take no more records, and let parked readers see the end.""" + self.sealed = True + self._wake_waiters() @property def head(self) -> int: @@ -167,9 +238,12 @@ def at(self, offset: int) -> bytes: def truncate(self, keep: int) -> None: """Drop all but the newest ``keep`` records.""" - drop = max(0, len(self.records) - keep) - self.base += drop - del self.records[:drop] + self._drop(max(0, len(self.records) - keep)) + + def _drop(self, count: int) -> None: + self.base += count + del self.records[:count] + del self.stamps[:count] async def wait_past(self, offset: int, timeout: float | None) -> None: """Wait until a record exists at ``offset``, or ``timeout`` passes.""" @@ -368,7 +442,8 @@ class MemoryStreamHandle: The owner is ``workflow_id``'s workflow, or with ``activity_id`` an activity: a standalone one without ``workflow_id``, or one that workflow - scheduled. + scheduled. With ``stream_id`` the handle is on a standalone stream, which + has no owner. """ def __init__( @@ -378,6 +453,7 @@ def __init__( workflow_id: str | None, run_id: str | None, activity_id: str | None = None, + stream_id: str | None = None, ) -> None: """Address the owner's topics in ``streams``.""" self._streams = streams @@ -385,6 +461,7 @@ def __init__( self._workflow_id = workflow_id self._run_id = run_id self._activity_id = activity_id + self._stream_id = stream_id self._seen_pending = False self._converter = ( client.data_converter @@ -400,10 +477,11 @@ def read( last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` from where the read starts until the workflow closes. + """Yield records on ``topic`` from where the read starts until the owner closes. ``END`` and ``last=`` are resolved by this call, against what the - topic holds when it is made. + topic holds when it is made. On a standalone stream the read ends + once the stream is sealed and the tail delivered. """ check_read_start(after, last) name, result_type = resolve_topic(topic, result_type) @@ -459,6 +537,8 @@ async def _read( ) def _store(self, topic: str) -> _Topic: + if self._stream_id is not None: + return self._streams._standalone_topic(self._stream_id, topic) if self._activity_id is not None: return self._streams._activity_topic( self._workflow_id, self._activity_id, topic @@ -467,6 +547,8 @@ def _store(self, topic: str) -> _Topic: return self._streams._topic(self._workflow_id, topic) async def _closed(self) -> bool: + if self._stream_id is not None: + return self._streams._standalone_stream(self._stream_id).sealed if self._client is None: return False try: @@ -527,6 +609,8 @@ def producer( def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: """A ref to ``topic`` of this owner's stream, pinned as this handle is.""" + if self._stream_id is not None: + return StreamRef.for_standalone(self._stream_id, topic=topic) if self._activity_id is not None: return StreamRef.for_activity( self._activity_id, @@ -540,11 +624,13 @@ def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: ) async def close(self) -> None: - """Refuse: an owned stream ends with its owner, not by a caller.""" - raise ValueError( - "only a standalone stream can be closed; this handle is on an owned " - "stream, which ends when its workflow or activity does" - ) + """Seal a standalone stream. An owned stream ends with its owner, not by a caller.""" + if self._stream_id is None: + raise ValueError( + "only a standalone stream can be closed; this handle is on an owned " + "stream, which ends when its workflow or activity does" + ) + self._streams._seal(self._stream_id) class MemoryStreams(ProviderPlugin): @@ -567,11 +653,13 @@ def __init__( self._poll = poll_interval self._topics: dict[str, _Topic] = {} self._activity_topics: dict[tuple[str | None, str, str], _Topic] = {} + self._standalone: dict[str, _Standalone] = {} def reset(self) -> None: - """Drop every topic. For tests.""" + """Drop every topic and every standalone stream. For tests.""" self._topics.clear() self._activity_topics.clear() + self._standalone.clear() def truncate(self, workflow_id: str, topic: str, *, keep: int) -> None: """Drop all but the newest ``keep`` records of a topic. For tests. @@ -621,26 +709,38 @@ async def create_standalone_stream( max_records: int | None = None, max_bytes: int | None = None, ) -> MemoryStreamHandle: - """Refuse: this provider keeps no stream without an owner. + """Create the standalone stream ``stream_id``, or find it with the same policy. + + The policy is applied on every append to any of the stream's topics. + ``client`` may be ``None``, as on the other handles. Raises: - StreamUnsupportedError: Always. + ValueError: ``stream_id`` is empty, a bound is not positive, or + the stream exists with a different policy. """ - raise StreamUnsupportedError( - "the memory provider does not host standalone streams" - ) + if not stream_id: + raise ValueError("stream_id must not be empty") + policy = _Policy(retention, max_records, max_bytes) + existing = self._standalone.get(stream_id) + if existing is None: + self._standalone[stream_id] = _Standalone(policy) + elif existing.policy != policy: + raise ValueError( + f"standalone stream {stream_id!r} exists with policy " + f"{existing.policy}, not {policy}" + ) + return MemoryStreamHandle(self, client, None, None, stream_id=stream_id) def get_standalone_stream_handle( self, client: Client | None, stream_id: str ) -> MemoryStreamHandle: - """Refuse: this provider keeps no stream without an owner. + """A handle on the standalone stream ``stream_id``. - Raises: - StreamUnsupportedError: Always. + Nothing is checked here: a ``read``, ``latest`` or ``producer`` on a + stream that was never created raises + :class:`temporalio.streams.StreamNotFoundError` at the call. """ - raise StreamUnsupportedError( - "the memory provider does not host standalone streams" - ) + return MemoryStreamHandle(self, client, None, None, stream_id=stream_id) async def close(self) -> None: """Nothing to release: the provider holds no connection.""" @@ -667,6 +767,30 @@ def _activity_topic( found = self._activity_topics[key] = _Topic() return found + def _standalone_stream(self, stream_id: str) -> _Standalone: + stream = self._standalone.get(stream_id) + if stream is None: + raise StreamNotFoundError( + f"standalone stream {stream_id!r} does not exist; create it with " + "client.create_stream" + ) + return stream + + def _standalone_topic(self, stream_id: str, topic: str) -> _Topic: + stream = self._standalone_stream(stream_id) + if not topic: + raise ValueError("topic must not be empty") + found = stream.topics.get(topic) + if found is None: + found = stream.topics[topic] = _Topic(stream.policy, sealed=stream.sealed) + return found + + def _seal(self, stream_id: str) -> None: + stream = self._standalone_stream(stream_id) + stream.sealed = True + for store in stream.topics.values(): + store.seal() + def _start(self, store: _Topic, after: Cursor, last: int | None) -> int: """The offset a read starts at, resolved against what ``store`` holds now.""" if last is not None: From 5287f6e53a6b5a512d3297ce39a6bcd7b70deba6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:42:04 -0700 Subject: [PATCH 699/831] Tested refs, standalone streams and body encoding through the accessors. The conformance suite opens a ref, creates and seals a standalone stream and checks its retention policy on every provider that hosts one. The accessor tests carry a ref through a workflow argument and result and open it from the activity and the client. --- tests/streams/conftest.py | 5 + tests/streams/test_stream_accessors.py | 87 ++++++++++ tests/streams/test_streams_conformance.py | 194 ++++++++++++++++++++++ 3 files changed, 286 insertions(+) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index b8a152f20..f03dbc919 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -15,3 +15,8 @@ def pytest_configure(config: pytest.Config) -> None: "markers", "truncates: the case needs a way to drop a topic's oldest records", ) + config.addinivalue_line( + "markers", + "hosts_standalone_streams: the case needs a stream with an id of its own and " + "no owner", + ) diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py index 85a1f87c5..4fd3f9b4e 100644 --- a/tests/streams/test_stream_accessors.py +++ b/tests/streams/test_stream_accessors.py @@ -24,6 +24,8 @@ DEFAULT_TOPIC, END, RecordKind, + StreamClosedError, + StreamRef, StreamUnsupportedError, topic, ) @@ -235,3 +237,88 @@ async def first(records: Any) -> Any: at_end = stream.read(topic=INPUTS, after=END) await producer.append({"n": 4}) assert await asyncio.wait_for(first(at_end), 10) == {"n": 4} + + +NOTES = topic("notes", dict) + + +@activity.defn +async def append_to_ref(ref: StreamRef) -> str: + # The ref arrived as an argument and names the stream in full, so it + # takes no scope; the handle it opens writes to the ref's topic. + try: + activity.stream_handle(ref, scope="activity") + except ValueError as error: + refused = str(error) + else: + refused = "accepted" + await activity.stream_handle(ref).producer().append({"via": "activity"}) + return refused + + +@workflow.defn +class PublishToRef: + """Hands a stream ref to an activity and returns it, both as plain data.""" + + @workflow.run + async def run(self, ref: StreamRef) -> tuple[StreamRef, str]: + refused = await workflow.execute_activity( + append_to_ref, ref, start_to_close_timeout=timedelta(seconds=30) + ) + return ref, refused + + +async def test_a_ref_travels_as_data_and_opens_from_every_context( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + shared = await registered.create_stream(f"shared-{uuid.uuid4().hex}") + ref = shared.ref(topic=NOTES) + async with new_worker( + registered, PublishToRef, activities=[append_to_ref] + ) as worker: + returned, refused = await registered.execute_workflow( + PublishToRef.run, + ref, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + # The workflow argument and result went through the data converter. + assert returned == ref + assert "takes no run_id or scope" in refused + # The activity wrote to the referenced topic, and the client reads it + # from the ref without naming the topic. Sealing the stream is what ends + # a full read of it. + await shared.close() + records = [ + (r.topic, r.value) async for r in registered.get_stream_handle(ref).read(last=1) + ] + assert records == [("notes", {"via": "activity"})] + with pytest.raises(ValueError, match="takes no run_id"): + registered.get_stream_handle(ref, run_id="r") + + +async def test_the_client_creates_reaches_and_closes_a_standalone_stream( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + stream_id = f"shared-{uuid.uuid4().hex}" + created = await registered.create_stream(stream_id, max_records=3) + producer = created.producer(topic=NOTES, producer_id="writer", attempt=1) + await producer.append({"n": 1}) + + reached = registered.get_stream_handle(stream_id=stream_id) + assert await reached.latest(topic=NOTES) != BEGINNING + await reached.close() + with pytest.raises(StreamClosedError): + await producer.append({"n": 2}) + assert [r.value async for r in reached.read(topic=NOTES)] == [{"n": 1}] + + with pytest.raises(ValueError, match="no workflow_id"): + registered.get_stream_handle(stream_id=stream_id, workflow_id="wf") + with pytest.raises(ValueError, match="empty"): + await registered.create_stream("") + with pytest.raises(StreamUnsupportedError, match="plugins="): + await client.create_stream(stream_id) + with pytest.raises(StreamUnsupportedError, match="plugins="): + client.get_stream_handle(stream_id=stream_id) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index afbb1d2d7..0ffd35982 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -31,6 +31,7 @@ import uuid from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass +from datetime import timedelta from typing import Any import pytest @@ -53,14 +54,17 @@ END, Cursor, RecordKind, + StreamClosedError, StreamCursorError, StreamHandle, + StreamNotFoundError, StreamProducerError, StreamProvider, StreamRef, Supersession, topic, ) +from temporalio.streams._ref import open_ref from temporalio.streams.providers.memory import MemoryStreams # Defined once and shared by every case, the way an application shares them @@ -88,6 +92,11 @@ class ProviderCase: truncate: Callable[[str, str, int], Awaitable[None]] | None = None """Drops all but the newest records of a workflow's topic, standing in for retention, or ``None`` when the provider offers no way to.""" + hosts_standalone_streams: bool = True + """The store holds a stream with an id of its own and no owner.""" + waits_for_standalone_creation: bool = False + """A read on a standalone stream id that does not exist yet parks until + the first write instead of raising ``StreamNotFoundError``.""" async def open( self, @@ -113,6 +122,42 @@ async def open( run_id=run_id, ) + async def open_ref(self, ref: StreamRef) -> StreamHandle: + if self.client is not None: + return self.client.get_stream_handle(ref) + return open_ref(self.provider, None, ref) # type: ignore[arg-type] + + async def create_stream( + self, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> StreamHandle: + if self.client is not None: + return await self.client.create_stream( + stream_id, + retention=retention, + max_records=max_records, + max_bytes=max_bytes, + ) + return await self.provider.create_standalone_stream( + None, # type: ignore[arg-type] + stream_id, + retention=retention, + max_records=max_records, + max_bytes=max_bytes, + ) + + async def open_standalone(self, stream_id: str) -> StreamHandle: + if self.client is not None: + return self.client.get_stream_handle(stream_id=stream_id) + return self.provider.get_standalone_stream_handle( + None, # type: ignore[arg-type] + stream_id, + ) + class RecordingDriver(StorageDriver): """An in-memory external storage driver that counts what it was asked to hold.""" @@ -191,6 +236,7 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: "reports_positions": lambda case: case.reports_positions, "detects_divergent_retries": lambda case: case.detects_divergent_retries, "truncates": lambda case: case.truncate is not None, + "hosts_standalone_streams": lambda case: case.hosts_standalone_streams, } @@ -224,6 +270,19 @@ async def _collect() -> None: return out +async def drain(records: Any, timeout: float = 5.0) -> list: + """Every record until the read ends on its own.""" + + async def _collect() -> list: + return [record async for record in records] + + return await asyncio.wait_for(_collect(), timeout) + + +def new_stream_id() -> str: + return f"stream-{uuid.uuid4().hex}" + + async def test_append_read_roundtrip(case: ProviderCase): workflow_id = new_workflow_id() stream = await case.open(workflow_id) @@ -668,3 +727,138 @@ async def test_a_retry_through_a_nondeterministic_codec_still_deduplicates( await first.append({"id": "r2"}) records = await take(stream.read(topic=OUT), 2) assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] + + +async def test_a_ref_opens_the_stream_it_names(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + await stream.producer(topic=A, producer_id="model", attempt=1).append({"n": 1}) + ref = stream.ref(topic=A) + + # The receiver names no topic: the ref carried it, so every call on the + # handle it opened addresses topic ``a`` of that workflow. + opened = await case.open_ref(ref) + records = await take(opened.read(result_type=dict), 1) + assert [(r.topic, r.value) for r in records] == [("a", {"n": 1})] + assert await opened.latest() == records[0].cursor + assert opened.ref() == ref + await opened.producer(producer_id="tool", attempt=1).append({"n": 2}) + assert [r.value for r in await take(stream.read(topic=A), 2)] == [ + {"n": 1}, + {"n": 2}, + ] + # Naming a topic on the opened handle addresses that topic instead. + assert await opened.latest(topic=B) == BEGINNING + assert opened.ref(topic=B) == stream.ref(topic=B) + + +@pytest.mark.hosts_standalone_streams +async def test_a_standalone_stream_is_read_from_another_handle(case: ProviderCase): + stream_id = new_stream_id() + created = await case.create_stream(stream_id) + producer = created.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + + # Any process reaches the stream by its id, or by a ref the creator + # handed out; nothing about the stream depends on who created it. + other = await case.open_standalone(stream_id) + records = await take(other.read(topic=OUT), 2) + assert [r.value for r in records] == [{"n": 1}, {"n": 2}] + assert await other.latest(topic=OUT) == records[1].cursor + assert other.ref(topic=OUT) == StreamRef.for_standalone(stream_id, topic="out") + via_ref = await case.open_ref(created.ref(topic=OUT)) + assert [r.value for r in await take(via_ref.read(), 2)] == [{"n": 1}, {"n": 2}] + + +@pytest.mark.hosts_standalone_streams +async def test_a_missing_standalone_stream_is_not_found(case: ProviderCase): + if case.waits_for_standalone_creation: + pytest.skip( + f"the {case.name} provider waits for a standalone stream to be created" + ) + # get_stream_handle(stream_id=) creates nothing: the stream has to have + # been created on purpose, and a use before that says so. + stream = await case.open_standalone(new_stream_id()) + with pytest.raises(StreamNotFoundError): + await stream.latest(topic=OUT) + with pytest.raises(StreamNotFoundError): + await take(stream.read(topic=OUT), 1) + with pytest.raises(StreamNotFoundError): + await stream.producer(topic=OUT, producer_id="writer", attempt=1).append( + {"n": 1} + ) + + +@pytest.mark.hosts_standalone_streams +async def test_creating_a_standalone_stream_is_idempotent_for_one_policy( + case: ProviderCase, +): + stream_id = new_stream_id() + first = await case.create_stream(stream_id, max_records=10) + # The same id and policy again is the same stream, not an error, so a + # retried create is harmless. + again = await case.create_stream(stream_id, max_records=10) + await first.producer(topic=OUT, producer_id="writer", attempt=1).append({"n": 1}) + assert [r.value for r in await take(again.read(topic=OUT), 1)] == [{"n": 1}] + # A different policy on an existing id is a mistake, not a change. + with pytest.raises(ValueError): + await case.create_stream(stream_id, max_records=5) + for bad in (dict(max_records=0), dict(max_bytes=-1), dict(retention=timedelta(0))): + with pytest.raises(ValueError): + await case.create_stream(new_stream_id(), **bad) # type: ignore[arg-type] + + +@pytest.mark.hosts_standalone_streams +async def test_closing_a_standalone_stream_ends_reads_and_refuses_appends( + case: ProviderCase, +): + stream_id = new_stream_id() + stream = await case.create_stream(stream_id) + producer = stream.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 1}) + # A reader parked on the tail before the close has to learn of it. + other = await case.open_standalone(stream_id) + parked = asyncio.ensure_future(drain(other.read(topic=OUT), timeout=10)) + await asyncio.sleep(0.2) + await producer.append({"n": 2}) + + await stream.close() + assert [r.value for r in await parked] == [{"n": 1}, {"n": 2}] + # Sealed: the tail stays readable, and a read opened now ends by itself. + assert [r.value for r in await drain(stream.read(topic=OUT))] == [ + {"n": 1}, + {"n": 2}, + ] + with pytest.raises(StreamClosedError): + await producer.append({"n": 3}) + with pytest.raises(StreamClosedError): + await other.producer(topic=A, producer_id="late", attempt=1).append({"n": 3}) + # Closing again is not an error. + await stream.close() + + +@pytest.mark.hosts_standalone_streams +async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCase): + by_count = await case.create_stream(new_stream_id(), max_records=2) + producer = by_count.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + # BEGINNING is the oldest record still held, which the policy decided. + kept = await take(by_count.read(topic=OUT), 2) + assert [r.value for r in kept] == [{"n": 3}, {"n": 4}] + + by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) + producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) + for n in range(3): + await producer.append({"n": n, "blob": "x" * 500}) + kept = await take(by_bytes.read(topic=OUT), 1) + assert kept[0].value is not None and kept[0].value["n"] == 2 + + by_age = await case.create_stream( + new_stream_id(), retention=timedelta(milliseconds=200) + ) + producer = by_age.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": "old"}) + await asyncio.sleep(0.3) + await producer.append({"n": "new"}) + kept = await take(by_age.read(topic=OUT), 1) + assert [r.value for r in kept] == [{"n": "new"}] From 3db4601b2cea6e7bffb8025f0ed800aa33dd42b2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:42:09 -0700 Subject: [PATCH 700/831] Absorbed refs, the body hash and the standalone refusal on Workflow Streams. Handles name their stream as a StreamRef and refuse close(), standalone streams are refused with a housing workflow noted as the option, and each record carries the plaintext hash of its body, which the workflow now matches a repeated batch by. Bodies meet the codec and external storage at the transport's envelope, since the workflow thread reads them from state. --- .../streams/providers/workflow_streams.py | 116 +++++++++++++++++- tests/streams/conftest.py | 5 + tests/streams/test_streams_conformance.py | 13 +- .../streams/test_workflow_streams_provider.py | 108 +++++++++++++++- 4 files changed, 237 insertions(+), 5 deletions(-) diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 0ec67b870..2b7036941 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -58,7 +58,27 @@ provider reserves ``activity/`` in the owner's map. The record itself carries the plain name. A standalone activity has no workflow to host a log, so its streams are refused, and a workflow's own topic may not start - with the reserved prefix. + with the reserved prefix. A standalone stream, one with no owner at all, + is refused too: there is no workflow whose state could hold it. A housing + workflow per stream id is the design option for that, not built here. +- A record's body meets the client's data converter at the transport's + envelope rather than one record at a time. A batch travels as a Signal or + Update argument and comes back as an Update or Query result, and the SDK + runs the payload codec and external storage over those the way it does + over every payload it sends, off the workflow thread, so a batch above the + storage threshold is offloaded as a claim and a codec protects it in + History. The bodies inside are left as the payload converter produced + them, because the workflow thread reads them straight out of its state + and could not decode a codec's output or redeem a claim there. So the + worker's converter has to match the clients', as it does for every other + payload, and a client with a converter of its own cannot read another's + records. What each record does carry is the plaintext hash of its body + under ``temporal.io/content-hash``, stamped by the producer before the + envelope is encoded, and the workflow matches a repeated batch by those + hashes rather than by the bytes. +- A handle names its stream as a :class:`temporalio.streams.StreamRef` with + ``ref()``, a workflow's or an activity's, and ``close()`` refuses, since + an owned stream ends with its owner. """ from __future__ import annotations @@ -100,6 +120,7 @@ from temporalio.converter import PayloadConverter from temporalio.exceptions import ApplicationError from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._body import CONTENT_HASH_KEY, content_hash from temporalio.streams._errors import ( StreamCursorError, StreamError, @@ -116,6 +137,7 @@ StreamRecord, check_read_start, ) +from temporalio.streams._ref import StreamRef from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -243,10 +265,23 @@ def _entry_data(payload: Payload) -> str: def _content(publish: PublishInput) -> str: - """A digest of one batch's content, length-delimited so a resplit cannot collide.""" + """A digest of one batch's content, length-delimited so a resplit cannot collide. + + Each record counts by the plaintext hash stamped on it under + ``CONTENT_HASH_KEY``, so a body's encoding never enters the identity a + repeat is matched by; a record without a body, such as ``FINISH``, counts + by its bytes. + """ digest = hashlib.sha256() for entry in publish.items: - for part in (entry.topic.encode(), entry.data.encode("ascii")): + record = WireRecord.FromString(_decode_payload(entry.data).data) + stamped = record.metadata.get(CONTENT_HASH_KEY) + identity = ( + stamped.data + if stamped is not None + else record.SerializeToString(deterministic=True) + ) + for part in (entry.topic.encode(), identity): digest.update(len(part).to_bytes(8, "big")) digest.update(part) return digest.hexdigest() @@ -687,6 +722,16 @@ def _entries( sequence=sequence, ) sequence += 1 + if wire.HasField("body"): + # The plaintext hash the workflow matches a repeat by, taken + # as the converter produced the body, before the transport's + # codec meets the envelope. + wire.metadata[CONTENT_HASH_KEY].CopyFrom( + Payload( + metadata={"encoding": _ENCODING}, + data=content_hash(wire.body).encode(), + ) + ) entries.append( PublishEntry(topic=self._item_topic, data=_entry_data(_wrap(wire))) ) @@ -1250,6 +1295,19 @@ def producer( retry_cooldown=self._poll_cooldown, ) + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A ref to ``topic`` of this workflow's stream, pinned as this handle is.""" + return StreamRef.for_workflow( + self._workflow_id, run_id=self._run_id, topic=topic + ) + + async def close(self) -> None: + """Refuse: an owned stream ends with its owner, not by a caller.""" + raise ValueError( + "only a standalone stream can be closed; this handle is on an owned " + "stream, which ends when its workflow or activity does" + ) + class WorkflowStreamsActivityHandle(WorkflowStreamsHandle): """The streams one activity of a workflow owns, kept in that workflow's log. @@ -1285,6 +1343,15 @@ def __init__( def _wire_topic(self, topic: str) -> str: return _activity_topic(self._activity_id, topic) + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A ref to ``topic`` of this activity's streams, through its workflow.""" + return StreamRef.for_activity( + self._activity_id, + workflow_id=self._workflow_id, + run_id=self._run_id, + topic=topic, + ) + async def _read( self, topic: str, @@ -1417,5 +1484,48 @@ def get_activity_stream_handle( self._publish_transport, ) + async def create_standalone_stream( + self, + client: Client, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> WorkflowStreamsHandle: + """Refused: this provider has no store for a stream without an owner. + + Every log here is a running workflow's state, served by that + workflow's handlers, and a standalone stream has no workflow. A + housing workflow started for the stream id, with the retention policy + as its state and ``close()`` as a Signal, would be one way to offer + it on this transport; it is a design option for a later round, not + built here. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the workflow_streams provider does not host standalone streams: every " + "log is a running workflow's state, and a stream without an owner has " + "no workflow" + ) + + def get_standalone_stream_handle( + self, client: Client, stream_id: str + ) -> WorkflowStreamsHandle: + """Refused: this provider has no store for a stream without an owner. + + See :meth:`create_standalone_stream`. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the workflow_streams provider does not host standalone streams: every " + "log is a running workflow's state, and a stream without an owner has " + "no workflow" + ) + async def close(self) -> None: """Nothing to release: the provider holds no connection of its own.""" diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 45e09bfd5..a9699ab94 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -15,6 +15,11 @@ def pytest_configure(config: pytest.Config) -> None: "markers", "truncates: the case needs a way to drop a topic's oldest records", ) + config.addinivalue_line( + "markers", + "encodes_bodies: the case needs the outside path to run each body through " + "the client's data converter", + ) config.addinivalue_line( "markers", "standalone_activities: the case needs the streams of an activity outside " diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 6f9dd793e..ed3b27610 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -88,6 +88,9 @@ class ProviderCase: """``append()`` returns where the records landed.""" detects_divergent_retries: bool = True """``append()`` compares a repeat's content with what it already holds.""" + encodes_bodies: bool = True + """The outside path runs each body through the client's data converter, so a + client with a converter of its own reads and writes another's records.""" host: Callable[[str], Awaitable[None]] | None = None """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" task_queue: str | None = None @@ -249,11 +252,16 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: ) # A publish is an Update, so the workflow answers with the position - # and refuses a divergent repeat: both capabilities hold here. + # and refuses a divergent repeat: both capabilities hold here. Bodies + # meet the codec and external storage at the transport's envelope, + # which the worker's converter has to match, so a case whose client + # carries a converter of its own is skipped; see the provider's + # module docstring. yield ProviderCase( "workflow_streams", provider, client, + encodes_bodies=False, host=host, task_queue=worker.task_queue, truncate=truncate, @@ -270,6 +278,7 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, "detects_divergent_retries": lambda case: case.detects_divergent_retries, + "encodes_bodies": lambda case: case.encodes_bodies, "truncates": lambda case: case.truncate is not None, } @@ -722,6 +731,7 @@ async def test_an_owned_stream_cannot_be_closed_by_a_handle(case: ProviderCase): await stream.close() +@pytest.mark.encodes_bodies async def test_a_body_above_the_threshold_is_offloaded_and_read_back( case: ProviderCase, client: Client ): @@ -747,6 +757,7 @@ async def test_a_body_above_the_threshold_is_offloaded_and_read_back( @pytest.mark.detects_divergent_retries +@pytest.mark.encodes_bodies async def test_a_retry_through_a_nondeterministic_codec_still_deduplicates( case: ProviderCase, client: Client ): diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index e5d713971..320a8bf03 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -13,6 +13,7 @@ import asyncio import base64 +import dataclasses import uuid from collections.abc import AsyncIterator from datetime import timedelta @@ -30,11 +31,13 @@ WorkflowUpdateFailedError, ) from temporalio.contrib.workflow_streams import PublishInput, WorkflowStream -from temporalio.converter import DataConverter +from temporalio.converter import DataConverter, ExternalStorage from temporalio.exceptions import ApplicationError from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( BEGINNING, + CONTENT_HASH_KEY, + DEFAULT_TOPIC, END, Cursor, RecordKind, @@ -42,10 +45,13 @@ StreamError, StreamNotFoundError, StreamProducerError, + StreamRef, StreamUnsupportedError, Supersession, + content_hash, ) from temporalio.streams._wire import WireRecord +from temporalio.streams.providers import workflow_streams from temporalio.streams.providers.workflow_streams import ( WorkflowStreamsActivityHandle, WorkflowStreamsHandle, @@ -1143,6 +1149,106 @@ async def test_a_standalone_activity_stream_is_refused( ) +async def test_a_standalone_stream_is_refused( + client: Client, provider: WorkflowStreamsProvider +): + # Every log is a running workflow's state; a stream with no owner has no + # workflow to live in. Both the create and the lookup say so. + with pytest.raises(StreamUnsupportedError, match="standalone"): + await provider.create_standalone_stream(client, "shared") + with pytest.raises(StreamUnsupportedError, match="standalone"): + provider.get_standalone_stream_handle(client, "shared") + + +async def test_a_handle_names_its_stream_as_a_ref( + client: Client, provider: WorkflowStreamsProvider +): + workflow_stream = provider.get_stream_handle(client, "wf", run_id="run-1") + assert workflow_stream.ref(topic=INPUTS) == StreamRef.for_workflow( + "wf", run_id="run-1", topic=INPUTS + ) + own = provider.get_activity_stream_handle(client, "act", workflow_id="wf") + assert own.ref(topic=TOKENS) == StreamRef.for_activity( + "act", workflow_id="wf", topic=TOKENS + ) + assert own.ref().topic == DEFAULT_TOPIC + # An owned stream ends with its owner; only a standalone one closes. + with pytest.raises(ValueError, match="standalone"): + await own.close() + + +def test_a_record_carries_the_plaintext_hash_the_workflow_dedupes_by(): + handle = _UpdateHandle() + producer = _producer(handle, "update") + entries, _ = producer._entries( + [(RecordKind.DATA, {"n": 1}), (RecordKind.FINISH, None)] + ) # pyright: ignore[reportPrivateUsage] + data, finish = _wires(PublishInput(items=entries)) + # A DATA record is stamped with the hash of its converted body, where the + # workflow can read it without the body; FINISH has nothing to hash. + assert data.metadata[CONTENT_HASH_KEY].data.decode() == content_hash(data.body) + assert CONTENT_HASH_KEY not in finish.metadata + + # The workflow's identity for a batch is those hashes, so a body whose + # bytes a codec changed is still the same batch, and a different value + # is not. + def batch(*values: dict) -> PublishInput: + made, _ = _producer(handle, "update")._entries( # pyright: ignore[reportPrivateUsage] + [(RecordKind.DATA, value) for value in values] + ) + return PublishInput(items=made, publisher_id="model#1", sequence=3) + + same, recoded, other = batch({"n": 1}), batch({"n": 1}), batch({"n": 2}) + record = _wires(recoded)[0] + record.body.data = b"\x00" + record.body.data + recoded.items[0].data = base64.b64encode( + Payload( + metadata={"encoding": b"binary/plain"}, data=record.SerializeToString() + ).SerializeToString() + ).decode("ascii") + assert workflow_streams._content(same) == workflow_streams._content(recoded) # pyright: ignore[reportPrivateUsage] + assert workflow_streams._content(same) != workflow_streams._content(other) # pyright: ignore[reportPrivateUsage] + + +async def test_external_storage_applies_at_the_envelope_the_workflow_reads_through( + client: Client, provider: WorkflowStreamsProvider +): + # Worker and clients share one converter, as a deployment's do. A batch + # above the threshold leaves as a claim on the Update argument, the + # worker redeems it, the workflow reads the value, and the outside + # reader gets the poll response the same way. + from tests.streams.test_streams_conformance import RecordingDriver + + driver = RecordingDriver() + converter = dataclasses.replace( + DataConverter.default, + external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=512), + ) + config = client.config() + config["data_converter"] = converter + shared = Client(**config) + workflow_id = f"streams-ws-{uuid.uuid4().hex}" + async with new_worker(shared, EchoLoop, plugins=[provider]) as worker: + handle = await shared.start_workflow( + EchoLoop.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = provider.get_stream_handle(shared, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + assert driver.stored == 0 + await producer.append({"n": 2, "blob": "x" * 4096}) + assert driver.stored == 1 + await producer.finish() + + records = await take(stream.read(topic=DECISIONS, result_type=dict), 3) + assert [r.value.get("echo") for r in records[:2]] == [1, 2] + assert records[2].kind is RecordKind.FINISH + assert driver.retrieved >= 1 + + await handle.signal(EchoLoop.release) + assert await handle.result() == 2 + + TOKENS = "tokens" From af134caaf439a05ddf8bf860fc66309bf3026b92 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:41:20 -0700 Subject: [PATCH 701/831] Filled a task's short stream range from the stream service before it ran. The server re-supplies a replaying workflow's recorded ranges within a budget, and a range it cannot fit has to come from somewhere or the task cannot run. The worker now reads the missing offsets of a short DeliverStreamRecords job through the client's stream channel before the activation runs, with the range readers the replayer already had, moved where both can use them. The server still refuses an over-budget task outright and the pinned Core fails a short slice itself, so this half waits on a server flag and a Core pass-through. --- temporalio/worker/_replayer.py | 99 +-------------- temporalio/worker/_stream_ranges.py | 173 +++++++++++++++++++++++++++ temporalio/worker/_worker.py | 3 + temporalio/worker/_workflow.py | 15 ++- tests/worker/test_stream_resupply.py | 150 +++++++++++++++++++++++ 5 files changed, 342 insertions(+), 98 deletions(-) create mode 100644 temporalio/worker/_stream_ranges.py create mode 100644 tests/worker/test_stream_resupply.py diff --git a/temporalio/worker/_replayer.py b/temporalio/worker/_replayer.py index c7e3478df..38304be48 100644 --- a/temporalio/worker/_replayer.py +++ b/temporalio/worker/_replayer.py @@ -20,13 +20,13 @@ import temporalio.client import temporalio.converter import temporalio.runtime -import temporalio.service import temporalio.streams import temporalio.worker import temporalio.workflow from ..common import HeaderCodecBehavior from ._interceptor import Interceptor +from ._stream_ranges import fetch_range from ._worker import load_default_build_id from ._workflow import _WorkflowWorker from ._workflow_instance import ( @@ -609,7 +609,7 @@ async def _stream_slices( workflow_task_completed_event_id=event_id, ) if consumed.to_offset > consumed.from_offset: - handle, records, owner_run_id = await _fetch_range( + handle, records, owner_run_id = await fetch_range( streams, history.workflow_id, run_id, @@ -623,101 +623,6 @@ async def _stream_slices( return slices -async def _fetch_range( - streams: Any, - workflow_id: str, - run_id: str, - consumed: temporalio.api.stream.v1.StreamRange, - known: Any, -) -> tuple[Any, list[temporalio.api.stream.v1.StreamRecord], str]: - """The records at exactly the recorded range, with the handle that served them. - - A subscribed name is resolved as the server resolves it: a stream the - workflow owns by that name first, else a standalone stream by that id. The - owned stream cannot be asked whether it exists, since a name nobody wrote - reads as empty, so the owned stream is probed for the range's first record - and the standalone one is tried when it has nothing there. - """ - gone = ( - f"stream {consumed.stream_id!r} no longer holds offsets " - f"[{consumed.from_offset}, {consumed.to_offset}) that a completed task of " - f"workflow {workflow_id!r} run {run_id!r} consumed; its records cannot be " - "replayed" - ) - candidates = ( - [known] - if known is not None - else [ - streams.workflow_stream( - workflow_id, consumed.stream_id, owner_run_id=run_id - ), - streams.get(consumed.stream_id), - ] - ) - last: Exception | None = None - for handle in candidates: - try: - records, owner_run_id = await _read_range(handle, consumed, gone) - except temporalio.streams.StreamNotFoundError as error: - last = error - continue - if records is not None: - return handle, records, owner_run_id - raise temporalio.streams.StreamNotFoundError(gone) from last - - -async def _read_range( - handle: Any, consumed: temporalio.api.stream.v1.StreamRange, gone: str -) -> tuple[list[temporalio.api.stream.v1.StreamRecord] | None, str]: - """Read ``[from_offset, to_offset)`` from one stream. - - ``None`` when the stream has nothing at the range's first offset, which is - how a name that is not this stream's reads; a stream that has the start but - not the rest, or refuses the offset as truncated or past its head, raises. - """ - records: list[temporalio.api.stream.v1.StreamRecord] = [] - owner_run_id = "" - offset = consumed.from_offset - while offset < consumed.to_offset: - try: - page = await handle.poll( - from_offset=offset, - max_records=consumed.to_offset - offset, - wait=False, - ) - except temporalio.streams.StreamNotFoundError: - if not records: - return None, "" - raise - except temporalio.streams.StreamCursorError as error: - # Below the truncation floor: the records a task consumed are gone. - raise temporalio.streams.StreamNotFoundError(gone) from error - except temporalio.service.RPCError as error: - # Past the head, or a refusal the server does not type: it refuses - # the offset rather than answering short. - if error.status in ( - temporalio.service.RPCStatusCode.FAILED_PRECONDITION, - temporalio.service.RPCStatusCode.INVALID_ARGUMENT, - temporalio.service.RPCStatusCode.OUT_OF_RANGE, - ): - raise temporalio.streams.StreamNotFoundError(gone) from error - raise - owner_run_id = page.run_id or owner_run_id - if not page.entries: - if not records: - return None, "" - raise temporalio.streams.StreamNotFoundError(gone) - for entry in page.entries: - if entry.offset != offset or offset >= consumed.to_offset: - raise temporalio.streams.StreamNotFoundError( - f"{gone}: the stream answered offset {entry.offset} where " - f"{offset} was due" - ) - records.append(entry.record) - offset += 1 - return records, owner_run_id - - class ReplayerConfig(TypedDict, total=False): """TypedDict of config originally passed to :py:class:`Replayer`.""" diff --git a/temporalio/worker/_stream_ranges.py b/temporalio/worker/_stream_ranges.py new file mode 100644 index 000000000..6bf35dbef --- /dev/null +++ b/temporalio/worker/_stream_ranges.py @@ -0,0 +1,173 @@ +"""Reading a recorded stream range back from the stream service. + +History records the offsets each Workflow Task consumed from a server-side +stream and never the records. Two paths have to read those offsets back: the +replayer, for a history it was handed without its records, and a live worker +handed a task whose re-supplied ranges stop short of what History recorded. +Both resolve a subscribed name the way the server does and read exactly the +recorded offsets, so the workflow sees what it saw the first time. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +import temporalio.api.stream.v1 +import temporalio.bridge.proto.workflow_activation +import temporalio.service +import temporalio.streams + +if TYPE_CHECKING: + import temporalio.client + +__all__ = ["fetch_range", "fill_short_stream_ranges", "read_range"] + + +async def fill_short_stream_ranges( + activation: temporalio.bridge.proto.workflow_activation.WorkflowActivation, + workflow_id: str, + client: temporalio.client.Client, +) -> None: + """Fetch the records a short ``DeliverStreamRecords`` job lacks, before the activation runs. + + The server re-supplies a replaying workflow's recorded ranges on the task + that carries them, within a budget. A job whose records stop short of its + range is that budget's remainder: the offsets are recorded in History and + the stream still holds them, so they are read from the stream service the + way the replayer reads them for an exported history, and the job is made + whole before the workflow runs on it. A job that covers its range, or that + records an empty observation, is left as it is. The fetch reads from the + activation's own run; a range recorded before a reset point lives on the + base run, which the job does not name yet. + + Raises: + temporalio.streams.StreamNotFoundError: The stream no longer holds the + missing offsets. The task fails rather than run on less input. + """ + short = [ + job.deliver_stream_records + for job in activation.jobs + if job.HasField("deliver_stream_records") + and len(job.deliver_stream_records.records) + < job.deliver_stream_records.to_offset - job.deliver_stream_records.from_offset + ] + if not short: + return + # Imported here: the stream client needs the grpc extra, which a worker + # that never sees a short range never touches. + from temporalio.client_stream import shared_client + + streams = shared_client(client) + served_by: dict[str, Any] = {} + for job in short: + missing = temporalio.api.stream.v1.StreamRange( + stream_id=job.stream_id, + from_offset=job.from_offset + len(job.records), + to_offset=job.to_offset, + ) + handle, records, _ = await fetch_range( + streams, + workflow_id, + activation.run_id, + missing, + served_by.get(job.stream_id), + ) + served_by[job.stream_id] = handle + job.records.extend(records) + + +async def fetch_range( + streams: Any, + workflow_id: str, + run_id: str, + consumed: temporalio.api.stream.v1.StreamRange, + known: Any, +) -> tuple[Any, list[temporalio.api.stream.v1.StreamRecord], str]: + """The records at exactly the recorded range, with the handle that served them. + + A subscribed name is resolved as the server resolves it: a stream the + workflow owns by that name first, else a standalone stream by that id. The + owned stream cannot be asked whether it exists, since a name nobody wrote + reads as empty, so the owned stream is probed for the range's first record + and the standalone one is tried when it has nothing there. ``known`` is the + handle that served this stream before, when there was one. + """ + gone = ( + f"stream {consumed.stream_id!r} no longer holds offsets " + f"[{consumed.from_offset}, {consumed.to_offset}) that a completed task of " + f"workflow {workflow_id!r} run {run_id!r} consumed; its records cannot be " + "replayed" + ) + candidates = ( + [known] + if known is not None + else [ + streams.workflow_stream( + workflow_id, consumed.stream_id, owner_run_id=run_id + ), + streams.get(consumed.stream_id), + ] + ) + last: Exception | None = None + for handle in candidates: + try: + records, owner_run_id = await read_range(handle, consumed, gone) + except temporalio.streams.StreamNotFoundError as error: + last = error + continue + if records is not None: + return handle, records, owner_run_id + raise temporalio.streams.StreamNotFoundError(gone) from last + + +async def read_range( + handle: Any, consumed: temporalio.api.stream.v1.StreamRange, gone: str +) -> tuple[list[temporalio.api.stream.v1.StreamRecord] | None, str]: + """Read ``[from_offset, to_offset)`` from one stream. + + ``None`` when the stream has nothing at the range's first offset, which is + how a name that is not this stream's reads; a stream that has the start but + not the rest, or refuses the offset as truncated or past its head, raises + :class:`temporalio.streams.StreamNotFoundError` with ``gone`` as the reason. + """ + records: list[temporalio.api.stream.v1.StreamRecord] = [] + owner_run_id = "" + offset = consumed.from_offset + while offset < consumed.to_offset: + try: + page = await handle.poll( + from_offset=offset, + max_records=consumed.to_offset - offset, + wait=False, + ) + except temporalio.streams.StreamNotFoundError: + if not records: + return None, "" + raise + except temporalio.streams.StreamCursorError as error: + # Below the truncation floor: the records a task consumed are gone. + raise temporalio.streams.StreamNotFoundError(gone) from error + except temporalio.service.RPCError as error: + # Past the head, or a refusal the server does not type: it refuses + # the offset rather than answering short. + if error.status in ( + temporalio.service.RPCStatusCode.FAILED_PRECONDITION, + temporalio.service.RPCStatusCode.INVALID_ARGUMENT, + temporalio.service.RPCStatusCode.OUT_OF_RANGE, + ): + raise temporalio.streams.StreamNotFoundError(gone) from error + raise + owner_run_id = page.run_id or owner_run_id + if not page.entries: + if not records: + return None, "" + raise temporalio.streams.StreamNotFoundError(gone) + for entry in page.entries: + if entry.offset != offset or offset >= consumed.to_offset: + raise temporalio.streams.StreamNotFoundError( + f"{gone}: the stream answered offset {entry.offset} where " + f"{offset} was due" + ) + records.append(entry.record) + offset += 1 + return records, owner_run_id diff --git a/temporalio/worker/_worker.py b/temporalio/worker/_worker.py index fade69c4d..2f6ff3792 100644 --- a/temporalio/worker/_worker.py +++ b/temporalio/worker/_worker.py @@ -579,6 +579,9 @@ def check_activity(activity: str): != HeaderCodecBehavior.NO_CODEC, max_workflow_task_external_storage_concurrency=max_workflow_task_external_storage_concurrency, stream_provider=stream_provider, + stream_client=( + config["client"] if stream_provider is not None else None # type: ignore[reportTypedDictNotRequiredAccess] + ), ) tuner = config.get("tuner") diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 79f5ca6e8..09cf68c0d 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -13,7 +13,7 @@ from dataclasses import dataclass from datetime import timezone from types import TracebackType -from typing import Any +from typing import TYPE_CHECKING, Any import temporalio.api.common.v1 import temporalio.bridge.proto.common @@ -42,6 +42,7 @@ WorkflowInboundInterceptor, WorkflowInterceptorClassInput, ) +from ._stream_ranges import fill_short_stream_ranges from ._workflow_instance import ( _DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS, PatchActivationInput, @@ -52,6 +53,9 @@ _WorkflowLogicFlag, ) +if TYPE_CHECKING: + import temporalio.client + logger = logging.getLogger(__name__) # Set to true to log all activations and completions @@ -140,6 +144,7 @@ def __init__( max_workflow_task_external_storage_concurrency: int, default_workflow_logic_flags: frozenset[_WorkflowLogicFlag] | None = None, stream_provider: temporalio.streams.StreamProvider | None = None, + stream_client: temporalio.client.Client | None = None, ) -> None: # Debug mode is enabled if specified or if the TEMPORAL_DEBUG env var is truthy debug_mode = debug_mode or bool(os.environ.get("TEMPORAL_DEBUG")) @@ -203,6 +208,9 @@ def __init__( # Innermost, so the lifecycle hooks bracket the workflow function # itself, after every user interceptor has done its own setup. self._interceptor_classes.append(_StreamHooksInterceptor) + # For the records a task's re-supplied ranges leave out, which the + # stream service still holds. + self._stream_client = stream_client self._workflow_failure_exception_types = workflow_failure_exception_types self._patch_activation_callback = patch_activation_callback @@ -397,6 +405,11 @@ async def _handle_activation( "Cache already exists for activation with initialize job" ) + # Before the bodies are decoded, so what is fetched is decoded with + # the rest, and before the workflow runs on the range. + if self._stream_client is not None: + await fill_short_stream_ranges(act, workflow_id, self._stream_client) + workflow_context = temporalio.converter.WorkflowSerializationContext( namespace=self._namespace, workflow_id=workflow_id, diff --git a/tests/worker/test_stream_resupply.py b/tests/worker/test_stream_resupply.py new file mode 100644 index 000000000..f7dcf3f78 --- /dev/null +++ b/tests/worker/test_stream_resupply.py @@ -0,0 +1,150 @@ +"""A task whose re-supplied ranges stop short is made whole before it runs. + +The server re-supplies a replaying workflow's recorded ranges within a budget. +These pin the worker's half: a ``DeliverStreamRecords`` job with fewer records +than its range spans has the rest fetched from the stream service, resolved as +the server resolves a subscribed name, while a whole job and an empty +observation are left alone and a range the stream no longer holds fails the +task rather than let it run on less input. +""" + +from __future__ import annotations + +from types import SimpleNamespace +from typing import Any + +import pytest + +from temporalio import client_stream +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord +from temporalio.bridge.proto.workflow_activation import WorkflowActivation +from temporalio.client_stream import Page, StreamEntry +from temporalio.streams import StreamNotFoundError +from temporalio.worker._stream_ranges import fill_short_stream_ranges + +# The fill-in only hands the client to the shared-channel lookup, which the +# tests replace. +_CLIENT: Any = SimpleNamespace() + + +def _record(offset: int) -> StreamRecord: + return StreamRecord(topic="inputs", body=Payload(data=f"r{offset}".encode())) + + +class _FakeStream: + """One stream's records by offset, answering polls as the service does.""" + + def __init__(self, held: dict[int, StreamRecord]) -> None: + self.held = held + self.polls: list[tuple[int, int]] = [] + + async def poll(self, *, from_offset: int, max_records: int, wait: bool) -> Page: + assert not wait + self.polls.append((from_offset, max_records)) + if not self.held: + raise StreamNotFoundError("no such stream") + entries = [ + StreamEntry(record=self.held[o], offset=o) + for o in range(from_offset, from_offset + max_records) + if o in self.held + ] + head = max(self.held) + 1 + return Page( + entries=entries, + next_offset=from_offset + len(entries), + head_offset=head, + closed=False, + ) + + +class _FakeStreams: + """The stream client: an owned stream per (workflow, name) and standalone ones by id.""" + + def __init__( + self, owned: dict[str, _FakeStream], standalone: dict[str, _FakeStream] + ) -> None: + self.owned = owned + self.standalone = standalone + + def workflow_stream( + self, workflow_id: str, name: str, *, owner_run_id: str + ) -> _FakeStream: + assert (workflow_id, owner_run_id) == ("wf", "run") + return self.owned.get(name, _FakeStream({})) + + def get(self, stream_id: str) -> _FakeStream: + return self.standalone.get(stream_id, _FakeStream({})) + + +def _activation(*jobs: tuple[str, int, int, int]) -> WorkflowActivation: + """An activation with one delivery per ``(stream, from, to, records present)``.""" + act = WorkflowActivation(run_id="run") + for stream_id, from_offset, to_offset, present in jobs: + job = act.jobs.add() + job.deliver_stream_records.stream_id = stream_id + job.deliver_stream_records.from_offset = from_offset + job.deliver_stream_records.to_offset = to_offset + job.deliver_stream_records.records.extend( + _record(o) for o in range(from_offset, from_offset + present) + ) + return act + + +@pytest.fixture +def streams(monkeypatch: pytest.MonkeyPatch) -> _FakeStreams: + fake = _FakeStreams( + owned={"inputs": _FakeStream({o: _record(o) for o in range(10)})}, + standalone={"shared": _FakeStream({o: _record(o) for o in range(5)})}, + ) + monkeypatch.setattr(client_stream, "shared_client", lambda _client: fake) + return fake + + +def _bodies(act: WorkflowActivation, index: int = 0) -> list[bytes]: + return [r.body.data for r in act.jobs[index].deliver_stream_records.records] + + +async def test_a_short_job_is_filled_from_the_owned_stream( + streams: _FakeStreams, +) -> None: + act = _activation(("inputs", 2, 7, 2)) + await fill_short_stream_ranges(act, "wf", _CLIENT) + assert _bodies(act) == [b"r2", b"r3", b"r4", b"r5", b"r6"] + # Only the missing tail was asked for. + assert streams.owned["inputs"].polls == [(4, 3)] + + +@pytest.mark.usefixtures("streams") +async def test_a_name_the_workflow_does_not_own_is_a_standalone_stream() -> None: + act = _activation(("shared", 0, 5, 1)) + await fill_short_stream_ranges(act, "wf", _CLIENT) + assert _bodies(act) == [b"r0", b"r1", b"r2", b"r3", b"r4"] + + +async def test_whole_and_empty_jobs_are_left_alone(streams: _FakeStreams) -> None: + act = _activation(("inputs", 0, 3, 3), ("inputs", 3, 3, 0)) + await fill_short_stream_ranges(act, "wf", _CLIENT) + assert _bodies(act, 0) == [b"r0", b"r1", b"r2"] + assert _bodies(act, 1) == [] + assert streams.owned["inputs"].polls == [] + + +@pytest.mark.usefixtures("streams") +async def test_a_range_the_stream_no_longer_holds_fails_loudly() -> None: + act = _activation(("inputs", 8, 12, 1)) + with pytest.raises( + StreamNotFoundError, match="no longer holds offsets \\[9, 12\\)" + ): + await fill_short_stream_ranges(act, "wf", _CLIENT) + + +async def test_no_client_is_needed_when_nothing_is_short( + monkeypatch: pytest.MonkeyPatch, +) -> None: + def refuse(_client: Any) -> Any: + raise AssertionError("no channel should be opened") + + monkeypatch.setattr(client_stream, "shared_client", refuse) + act = _activation(("inputs", 0, 2, 2)) + await fill_short_stream_ranges(act, "wf", _CLIENT) From f7fcf03a0e89990564e54734f31736c631b8587c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:45:13 -0700 Subject: [PATCH 702/831] Used a standalone activity as the owner Workflow Streams refuses. The store now hosts a workflow's activity streams as reserved topics, so the case that checks a store's refusal reaching the caller under its own class needs an owner it still refuses. --- tests/streams/test_nexus_provider.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 8982441ad..89c2bb8c6 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -913,11 +913,12 @@ async def test_an_owner_the_store_cannot_host_is_refused_under_its_own_class( client: Client, monkeypatch: pytest.MonkeyPatch ): # Whether an owner is supported is the store's answer, not the front's: - # the Workflow Streams store has no activity accessor, and its refusal + # the Workflow Streams store hosts only the streams of a workflow's + # activities, so a standalone activity's are refused, and its refusal # reaches the caller as the class it raised. handler = TemporalStreamsHandler(WorkflowStreamsProvider(), client) monkeypatch.setattr(nexus, "_post", _in_process_endpoint(handler, [], [])) - own = _front(None).get_activity_stream_handle(None, "act", workflow_id="wf") + own = _front(None).get_activity_stream_handle(None, "act") with pytest.raises(StreamUnsupportedError, match="activity"): await own.producer(topic=INPUTS, producer_id="model", attempt=1).append( {"n": 1} From d52fde7ae45bd0a1042a839065680b9fc90f49fb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:48:20 -0700 Subject: [PATCH 703/831] Gave each s7 batch its own producer so the chain's stream sees no repeat. A producer's (id, attempt, sequence) must not repeat with different content on one stream, and on Redis the stream spans the chain, so the same identity for every batch conflicted from the second batch on. The README now says s7 runs on native, Workflow Streams and Redis. --- examples/streams/june_scenarios/README.md | 13 +++++-------- .../streams/june_scenarios/s7_workflow_consumer.py | 14 +++++++++++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/examples/streams/june_scenarios/README.md b/examples/streams/june_scenarios/README.md index 9b3f58992..51b9da3d7 100644 --- a/examples/streams/june_scenarios/README.md +++ b/examples/streams/june_scenarios/README.md @@ -15,7 +15,7 @@ reaches into private SDK code or adds a feature. | Workflow as Producer: as return type | `s4_workflow_as_generator.py` | emulated | Default-topic publishes plus `FINISH`, result from the workflow; the generator signature is sugar not built | | Activity as Producer: as named handle | `s5_activity_producers.py` | implemented | Workflow topic (Path B), `scope="activity"`, standalone activity; the last two on native, memory and Redis | | Activity as Producer: as return type | `s6_activity_as_generator.py` | emulated | Appends plus a heartbeat checkpoint; the retry resumes and readers see `SUPERSEDED` | -| Workflow as Consumer | `s7_workflow_consumer.py` | implemented; foreign stream unsupported | Own inbound topic across continue-as-new, carrying a checkpoint because a run's topic is its own; reading a foreign stream from a workflow is rule 5 | +| Workflow as Consumer | `s7_workflow_consumer.py` | implemented; foreign stream unsupported | Own inbound topic across continue-as-new, handing over per batch with one producer per batch and carrying a checkpoint; runs on native, Workflow Streams and Redis, memory skips by design; reading a foreign stream from a workflow is rule 5 | | Client as Consumer over Standalone Nexus | `s8_nexus_consumers.py` (a) | implemented | Activity reads through the `NexusStreams` front and resumes from a heartbeat cursor | | Nexus operation handler | `s8_nexus_consumers.py` (b) | emulated | The operation returns a `StreamRef` that the client reads through the front; streams as operation results are the nexgen IDL follow-on | | Workflow as Consumer over Nexus | `s8_nexus_consumers.py` docstring | unsupported by design | A workflow's reads ride its Workflow Task and never cross Nexus | @@ -40,13 +40,10 @@ streams, and `s8` needs the server's Nexus HTTP ingress (`--http`, default commands above point every provider at it. `s8` creates and deletes its own Nexus endpoint. `memory` is offered here, not in the parent examples, because it is not replay-safe; these scenarios keep a warm cache. `redis` -runs with `--redis` naming a local Redis: `s1` apart from (d), `s3` to `s6` -with all three parts of `s5`, and `s8` ran green against the stream server, -and `s2` refuses as on every provider but `native`. `s7` fails on `redis`: -the sender's `finish()` lands while the consumer run is continuing as new, -the closing run refuses the provider's wake, and the producer raises -`WakeNotAcknowledgedError` instead of waking the successor. That is open on -the Redis provider, so `run.py redis` stops there. +runs with `--redis` naming a local Redis: `s1` apart from (d) and `s3` to +`s8`, with all three parts of `s5` and `s7` handing over per batch, ran +green against the stream server, and `s2` refuses as on every provider but +`native`. A scenario a provider cannot serve says so in its output and moves on: `s2` on anything but `native`, `s5` (b) and (c) on `workflow_streams`, diff --git a/examples/streams/june_scenarios/s7_workflow_consumer.py b/examples/streams/june_scenarios/s7_workflow_consumer.py index 900ddc428..d16c0e409 100644 --- a/examples/streams/june_scenarios/s7_workflow_consumer.py +++ b/examples/streams/june_scenarios/s7_workflow_consumer.py @@ -9,6 +9,7 @@ python -m examples.streams.june_scenarios.s7_workflow_consumer workflow_streams python -m examples.streams.june_scenarios.s7_workflow_consumer native --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.s7_workflow_consumer redis --address 127.0.0.1:7333 --redis redis://127.0.0.1:6379 His shape is ``workflow.StreamHandle[ProgressUpdate](stream_id="...", offset=offset)`` with ``continue_as_new(update.offset)``. Ours is @@ -26,7 +27,10 @@ boundary, marked by the sender's ``FINISH``, and what it carries is its own checkpoint: what it has applied so far. The sender waits for the successor before writing the next batch, which is the one piece of coordination the -per-run topic asks for. +per-run topic asks for. On ``redis`` the stream spans the chain and a +successor resumes where its predecessor committed, so the same handover +works there; each batch is its own producer, because a producer's identity +must not repeat with different content on one stream. The memory provider keys a topic by workflow rather than by run, so a successor would read its predecessor's batches again; it is skipped there. @@ -126,9 +130,13 @@ async def run(args: argparse.Namespace) -> None: run_id: str | None = None for number, batch in enumerate(batches, start=1): run_id = await current_run(client, workflow_id, run_id) - # A producer made now writes to the run that is current now. + # A producer made now writes to the run that is current now, + # and each batch is its own producer: a producer's (id, attempt, + # sequence) must not repeat with different content on the same + # stream, and on a store whose stream spans the chain every + # batch lands on one stream. sender = client.get_stream_handle(workflow_id).producer( - topic=COMMANDS, producer_id="console", attempt=1 + topic=COMMANDS, producer_id=f"console-{number}", attempt=1 ) for op in batch: await sender.append(Command(op)) From 85126ae8346caaa0f1e46b6c4d7161eedd3f4266 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:51:16 -0700 Subject: [PATCH 704/831] Typed the absent client in the ref-opening test as Any. basedpyright refuses a cast from None to Client, and the in-process endpoint is reached by id, so the test says outright that it opens without one. --- tests/streams/test_nexus_provider.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 89c2bb8c6..1a61b5728 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -968,8 +968,10 @@ async def test_a_handle_names_its_stream_as_a_ref_that_opens_on_the_front( carried = converter.from_payloads([converter.to_payloads([ref])[0]], [StreamRef]) assert carried == [ref] # Opened on the front, the ref reaches the same stream and its topic is - # the handle's default; the client accessor goes through open_ref. - opened = open_ref(front, cast(Client, None), ref) + # the handle's default; the client accessor goes through open_ref. The + # in-process endpoint is reached by id, so no client is needed to resolve it. + no_client: Any = None + opened = open_ref(front, no_client, ref) await opened.producer(producer_id="model", attempt=1).append({"n": 1}) records = await take(handle.read(topic=INPUTS, result_type=dict), 1, timeout=30) assert records[0].value == {"n": 1} From f37da2e073fae81dcfa7bf3829ac2b756a88e7a7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:58:40 -0700 Subject: [PATCH 705/831] Hosted standalone streams and refs on the native provider. A stream with an id of its own is created and sealed over the existing CreateStream and CloseStream calls, read through a handle whose cursors name the stream where an owned stream's name a run, and a read on an id nobody has created yet relies on the server's parked poll. Every native handle answers ref(), the provider opens a StreamRef, and a create of an id that exists is answered from the stream's own policy since the server does not say ALREADY_EXISTS. The content hash and the body encoding now come from the shared streams helper the interface chain added, and an append on a sealed stream is a StreamClosedError. --- temporalio/client_stream.py | 32 +- temporalio/streams/_wire.py | 18 - temporalio/streams/providers/native.py | 389 ++++++++++++++++-- temporalio/worker/_command_aware_visitor.py | 2 +- tests/streams/test_native_fingerprint.py | 2 +- tests/streams/test_native_handles.py | 110 +++++ tests/streams/test_native_standalone_e2e.py | 95 +++++ tests/streams/test_streams_conformance.py | 44 +- .../test_workflow_stream_payloads_e2e.py | 3 +- 9 files changed, 612 insertions(+), 83 deletions(-) create mode 100644 tests/streams/test_native_handles.py create mode 100644 tests/streams/test_native_standalone_e2e.py diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index babab6fc1..8ae0f114c 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -28,9 +28,11 @@ server answers ``NOT_FOUND``, :class:`temporalio.streams.StreamProducerError` when it refuses a producer sequence it already holds, :class:`temporalio.streams.StreamCursorError` when -it refuses a read below the retention floor, and -:class:`temporalio.service.RPCError` otherwise, never the transport's own -exception type. :func:`translate_error` is the one place that decides. +it refuses a read below the retention floor, +:class:`temporalio.streams.StreamClosedError` when it refuses an append to a +sealed stream, and :class:`temporalio.service.RPCError` otherwise, never the +transport's own exception type. :func:`translate_error` is the one place that +decides. A failure sdk-core would retry is retried here, on the same codes and with the same default :class:`temporalio.service.RetryConfig`, because this channel is @@ -52,9 +54,9 @@ import weakref from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass +from datetime import timedelta from typing import TYPE_CHECKING, Any, TypeVar -import google.protobuf.duration_pb2 import grpc import grpc.aio from google.protobuf.message import Message @@ -74,6 +76,7 @@ __version__, ) from temporalio.streams import ( + StreamClosedError, StreamCursorError, StreamNotFoundError, StreamProducerError, @@ -112,9 +115,11 @@ "STREAM_CURSOR_BELOW_FLOOR": StreamCursorError, } # The phrases a server built before the tokens existed sends for the same -# refusals, so a reader of either server gets the typed error. +# refusals, so a reader of either server gets the typed error. An append on a +# sealed stream has no token yet and is matched on its whole message. _PRODUCER_PHRASE = "producer sequence" _CURSOR_PHRASE = "below the stream's floor" +_CLOSED_PHRASE = "stream is closed" # The codes sdk-core retries. _RETRYABLE = frozenset( @@ -498,6 +503,8 @@ def translate_error( return typed(details) if _CURSOR_PHRASE in details: return StreamCursorError(details) + if details == _CLOSED_PHRASE: + return StreamClosedError(details) if code is grpc.StatusCode.INVALID_ARGUMENT and _PRODUCER_PHRASE in details: return StreamProducerError(details) return RPCError(details, RPCStatusCode(code.value[0]), raw_status) @@ -615,20 +622,21 @@ async def create( self, stream_id: str, *, - retention: float | None = None, + retention: float | timedelta | None = None, max_items: int | None = None, ) -> StreamHandle: """Create a stream and return a handle to it. - ``retention`` is how long a closed stream stays readable, in seconds. - ``max_items`` caps how many records remain readable, dropping the - oldest, which bounds storage for a stream nobody truncates. + ``retention`` is how long a closed stream stays readable, in seconds + or as a ``timedelta``. ``max_items`` caps how many records remain + readable, dropping the oldest, which bounds storage for a stream + nobody truncates. """ lifecycle = stream.StreamLifecycle() if retention is not None: - lifecycle.retention.CopyFrom( - google.protobuf.duration_pb2.Duration(seconds=int(retention)) - ) + if not isinstance(retention, timedelta): + retention = timedelta(seconds=retention) + lifecycle.retention.FromTimedelta(retention) if max_items is not None: lifecycle.max_items = max_items diff --git a/temporalio/streams/_wire.py b/temporalio/streams/_wire.py index 7f9818ace..4913cc308 100644 --- a/temporalio/streams/_wire.py +++ b/temporalio/streams/_wire.py @@ -14,12 +14,10 @@ from __future__ import annotations -import hashlib from collections.abc import Callable from typing import Any import temporalio.converter -from temporalio.api.common.v1 import Payload from temporalio.api.stream.v1 import StreamRecord as WireRecord from temporalio.api.stream.v1 import StreamRecordKind from temporalio.streams._errors import StreamCursorError @@ -27,10 +25,8 @@ from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord __all__ = [ - "CONTENT_HASH_KEY", "RecordDecoder", "WireRecord", - "content_hash", "cursor_position", "from_wire", "mint_cursor", @@ -38,20 +34,6 @@ "to_wire", ] -CONTENT_HASH_KEY = "temporal.io/content-hash" -"""The record metadata key under which a producer declares its body's identity. - -The value is the lowercase hex SHA-256 of the body as the payload converter -produced it, before any codec or offload, so a store can tell a retry from a -divergent repeat whatever the encoding did to the bytes. It is read as sent: -nothing may encode or offload this one metadata payload. -""" - - -def content_hash(body: Payload) -> str: - """The lowercase hex SHA-256 of ``body`` as converted.""" - return hashlib.sha256(body.SerializeToString()).hexdigest() - def to_wire( converter: temporalio.converter.PayloadConverter, diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 8311cf0b1..6904c7cae 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -31,8 +31,11 @@ from __future__ import annotations +import asyncio import logging +import time from collections.abc import AsyncGenerator, Callable +from datetime import timedelta from typing import Any, Generic, TypeVar from temporalio import workflow @@ -40,6 +43,7 @@ from temporalio.api.stream.v1 import StreamStartPosition from temporalio.client import Client, WorkflowHistoryEventFilterType from temporalio.client_stream import ( + Appended, Page, SharedKey, StreamClient, @@ -48,14 +52,25 @@ shared_client, shared_key, ) +from temporalio.client_stream import StreamHandle as ServiceStreamHandle from temporalio.converter import ( DataConverter, StorageDriverStoreContext, StorageDriverWorkflowInfo, ) from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams._errors import StreamCursorError, StreamNotFoundError -from temporalio.streams._provider import ReadSource, WriteSink +from temporalio.streams._body import ( + CONTENT_HASH_KEY, + content_hash, + decode_body, + encode_body, +) +from temporalio.streams._errors import ( + StreamCursorError, + StreamNotFoundError, + StreamUnsupportedError, +) +from temporalio.streams._provider import ReadSource, StreamHandle, WriteSink from temporalio.streams._record import ( BEGINNING, END, @@ -64,12 +79,11 @@ StreamRecord, check_read_start, ) +from temporalio.streams._ref import StreamRef, open_ref from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( - CONTENT_HASH_KEY, RecordDecoder, WireRecord, - content_hash, cursor_position, mint_cursor, producer_identity, @@ -80,6 +94,7 @@ __all__ = [ "NativeActivityStreamHandle", "NativeProducer", + "NativeStandaloneStreamHandle", "NativeStreamHandle", "NativeStreams", ] @@ -88,6 +103,10 @@ _PROVIDER = "native" +# Seconds between polls on a standalone stream that does not exist yet, when +# the server answers without parking. +_CREATE_WAIT_PACE = 1.0 + logger = logging.getLogger(__name__) @@ -97,6 +116,7 @@ def _require_topic(topic: str) -> None: def _cursor(run_id: str, offset: int) -> Cursor: + # A standalone stream has no run; its id takes the run's place. return mint_cursor(_PROVIDER, f"{run_id}:{offset}") @@ -118,11 +138,12 @@ def _position(after: Cursor) -> tuple[str, int] | None: def _fingerprint(record: WireRecord) -> WireRecord: - """Stamp ``record`` with the hash of its body as converted, before a codec or offload. + """Stamp ``record`` with the hash of its body as converted, before the worker's pass. - The server deduplicates a producer's repeat on this when present, so a - codec that encrypts with a fresh nonce per call cannot turn a retry into - a divergent write. A record without a body has nothing to compare. + The outside half gets the same stamp from :func:`encode_body`; a workflow's + own publish is encoded later, by the worker's payload pass, so the stamp + is taken here while the body is still what the converter produced. A + record without a body has nothing to compare. """ if not record.HasField("body"): return record @@ -135,28 +156,6 @@ def _fingerprint(record: WireRecord) -> WireRecord: return record -async def _encode_body(converter: DataConverter, record: WireRecord) -> WireRecord: - # The worker's payload pass runs the codec and then the external store over - # the bodies a workflow publishes and receives; the outside half has no such - # pass, so it applies the client's data converter here in the same order, - # or the two sides would not agree. - if not record.HasField("body"): - return record - encoded = await converter._encode_payload_sequence([record.body]) - stored = await converter._external_store_payload_sequence(encoded) - record.body.CopyFrom(stored[0]) - return record - - -async def _decode_body(converter: DataConverter, record: WireRecord) -> WireRecord: - if not record.HasField("body"): - return record - retrieved = await converter._external_retrieve_payload_sequence([record.body]) - decoded = await converter._decode_payload_sequence(retrieved) - record.body.CopyFrom(decoded[0]) - return record - - class _NativeReadSource: """One subscription of the running workflow, fed by delivered ranges.""" @@ -253,7 +252,7 @@ class NativeProducer(Generic[T]): def __init__( self, - handle: WorkflowStreamHandle, + handle: WorkflowStreamHandle | _StandaloneTarget, pin: Any, converter: DataConverter, store_target: Callable[[str], StorageDriverWorkflowInfo], @@ -264,9 +263,9 @@ def __init__( """Bind this producer to ``topic`` on the stream ``handle`` names. ``converter`` is the client's data converter, applied to every body - as the worker applies it to a workflow's own records. ``store_target`` - names the execution an offloaded body is stored under, given the run - the producer pinned. + as the worker applies it to a workflow's own records, with the + plaintext hash stamped first. ``store_target`` names the execution an + offloaded body is stored under, given the run the producer pinned. """ self._handle = handle self._pin = pin @@ -355,7 +354,7 @@ async def _write(self, records: list[WireRecord]) -> Cursor: ) ) for record in records: - await _encode_body(self._bound, _fingerprint(record)) + await encode_body(self._bound, record) appended = await self._handle.append( *records, producer_id=self._writer, sequence=self._sequence ) @@ -464,7 +463,7 @@ async def _read( ) start = None for entry in page.entries: - record = await _decode_body(self._data_converter, entry.record) + record = await decode_body(self._data_converter, entry.record) for out in decoder.decode(_cursor(run_id, entry.offset), record): yield out offset = page.next_offset @@ -535,6 +534,23 @@ def producer( attempt, ) + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A ref to ``topic`` of this workflow's stream, pinned as this handle is.""" + return StreamRef.for_workflow( + self._workflow_id, run_id=self._run_id, topic=topic + ) + + async def close(self) -> None: + """Refuse: a workflow's stream ends with the workflow. + + Raises: + ValueError: Always; only a standalone stream is closed by hand. + """ + raise ValueError( + "a workflow's stream ends with its workflow; only a standalone stream " + "can be closed" + ) + def _store_target(self, run_id: str) -> StorageDriverWorkflowInfo: """The execution an offloaded body of this owner's stream is stored under.""" return StorageDriverWorkflowInfo( @@ -631,6 +647,26 @@ def _store_target(self, run_id: str) -> StorageDriverWorkflowInfo: return super()._store_target(run_id) return StorageDriverWorkflowInfo(namespace=self._client.namespace) + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A ref to ``topic`` of this activity's streams, pinned as this handle is.""" + return StreamRef.for_activity( + self._activity_id, + workflow_id=self._workflow_id or None, + run_id=self._run_id, + topic=topic, + ) + + async def close(self) -> None: + """Refuse: an activity's streams end with the activity. + + Raises: + ValueError: Always; only a standalone stream is closed by hand. + """ + raise ValueError( + "an activity's streams end with the activity; only a standalone stream " + "can be closed" + ) + async def _current_run(self) -> str: if self._workflow_id: return await super()._current_run() @@ -657,6 +693,201 @@ async def _successor(self, run_id: str) -> str | None: return None +class _StandaloneTarget: + """A standalone stream as the producer addresses an owned one. + + The producer pins a run before its first write and names it in every + cursor it hands out. A standalone stream has no run to pin, so its id + stands in that place from the start and nothing is ever resolved. + """ + + def __init__(self, handle: ServiceStreamHandle, stream_id: str) -> None: + self._handle = handle + self.owner_run_id = stream_id + + def pin(self, run_id: str) -> None: + self.owner_run_id = run_id + + async def append( + self, *records: WireRecord, producer_id: str = "", sequence: int = 0 + ) -> Appended: + return await self._handle.append( + *records, producer_id=producer_id, sequence=sequence + ) + + +class NativeStandaloneStreamHandle: + """One standalone stream's topics from outside, over the stream service. + + A standalone stream has an id of its own and no owner, so there is no + chain to follow and no run to pin; a cursor names the stream id where an + owned stream's names a run, and a cursor from another stream is refused. + Its topics share one log, so a topic read is the server's filter over it. + + A read on an id nobody has created yet parks on the server until the + stream appears, so a reader can attach before the producer's first write. + ``latest`` and a producer's append on such an id raise + :class:`temporalio.streams.StreamNotFoundError`: they have nothing to wait + on. The server keeps a policy's ``retention`` for the stream's records + after it is closed rather than trimming an open stream by age, and it has + no byte bound on a standalone stream's lifecycle, so the provider refuses + ``max_bytes``. + """ + + def __init__( + self, client: Client, stream_id: str, *, opened: set[SharedKey] | None = None + ) -> None: + """Address the standalone stream ``stream_id``, which must exist or be created later.""" + self._client = client + self._stream_id = stream_id + self._opened = set() if opened is None else opened + self._data_converter = client.data_converter + self._converter = client.data_converter.payload_converter + self._streams: StreamClient | None = None + + @property + def stream_id(self) -> str: + """The id of the stream this handle is on.""" + return self._stream_id + + def _service(self) -> StreamClient: + if self._streams is None: + self._streams = shared_client(self._client) + self._opened.add(shared_key(self._client)) + return self._streams + + def _stream(self) -> ServiceStreamHandle: + return self._service().get(self._stream_id) + + def read( + self, + *, + topic: str | StreamTopic[Any] | None = None, + after: Cursor = BEGINNING, + last: int | None = None, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + """Yield records on ``topic`` from where the read starts until the stream is closed and drained. + + The server resolves ``BEGINNING``, ``END`` and ``last=`` on the first + poll. On an id that does not exist yet the poll parks until the stream + is created, so the read is open before the first write. + """ + check_read_start(after, last) + topic, result_type = resolve_topic(topic, result_type) + named = None if after == END else _position(after) + if named is not None and named[0] != self._stream_id: + raise StreamCursorError( + f"cursor {after.token!r} names another stream than {self._stream_id!r}" + ) + start: StreamStartPosition | None = None + if last is not None: + start = StreamStartPosition(last_n=last) + elif after == END: + start = StreamStartPosition(tail=True) + elif named is None: + start = StreamStartPosition(earliest=True) + return self._read(topic, named, start, after, result_type) + + async def _read( + self, + topic: str, + named: tuple[str, int] | None, + start: StreamStartPosition | None, + after: Cursor, + result_type: type | None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + stream = self._stream() + decoder: RecordDecoder | None = None + offset = named[1] + 1 if named is not None else 0 + while True: + asked = time.monotonic() + try: + page = await stream.poll( + from_offset=offset, start=start, topics=[topic] + ) + except StreamNotFoundError: + # The server parks a poll on an id nobody has created for its + # wait budget and answers NOT_FOUND when that runs out. The + # stream may still be created, so the read keeps waiting; one + # that has delivered before is gone for good. A server that + # answers at once does not park, so the wait is paced here. + if decoder is not None: + raise + if time.monotonic() - asked < _CREATE_WAIT_PACE: + await asyncio.sleep(_CREATE_WAIT_PACE) + continue + if decoder is None: + decoder = RecordDecoder( + self._converter, + result_type, + after=NativeStreamHandle._previous( + self._stream_id, page, start, after + ), + warn=logger.warning, + ) + start = None + for entry in page.entries: + record = await decode_body(self._data_converter, entry.record) + for out in decoder.decode( + _cursor(self._stream_id, entry.offset), record + ): + yield out + offset = page.next_offset + if page.closed and offset >= page.head_offset: + return + + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: + """The cursor of the newest record on the stream, or ``BEGINNING`` when empty. + + Topics share the stream's offsets, so the newest record may be on + another topic; a read after this cursor still yields only what lands + on ``topic`` later. + + Raises: + StreamNotFoundError: The stream does not exist. + """ + resolve_topic(topic) + head = (await self._stream().describe()).head_offset + return _cursor(self._stream_id, head - 1) if head > 0 else BEGINNING + + def producer( + self, + *, + topic: str | StreamTopic[Any] | None = None, + producer_id: str = "", + attempt: int = 0, + ) -> NativeProducer[Any]: + """A producer on ``topic``; inside an activity its identity is the activity's.""" + topic, _ = resolve_topic(topic) + producer_id, attempt = producer_identity(producer_id, attempt) + return NativeProducer( + _StandaloneTarget(self._stream(), self._stream_id), + self._no_run, + self._data_converter, + self._store_target, + topic, + producer_id, + attempt, + ) + + async def _no_run(self) -> str: + return self._stream_id + + def _store_target(self, _run_id: str) -> StorageDriverWorkflowInfo: + # No workflow owns the stream, so an offloaded body has only the + # namespace to be stored under. + return StorageDriverWorkflowInfo(namespace=self._client.namespace) + + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A ref to ``topic`` of this stream.""" + return StreamRef.for_standalone(self._stream_id, topic=topic) + + async def close(self) -> None: + """Seal the stream: appends are refused from now on and the tail stays readable. Idempotent.""" + await self._stream().close() + + class NativeStreams(ProviderPlugin): """The server-side provider. @@ -677,11 +908,91 @@ def workflow_provider(self) -> _NativeWorkflowProvider: return _NativeWorkflowProvider() def get_stream_handle( - self, client: Client, workflow_id: str, *, run_id: str | None = None - ) -> NativeStreamHandle: - """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain.""" + self, + client: Client, + workflow_id: str | StreamRef, + *, + run_id: str | None = None, + ) -> StreamHandle: + """A handle on ``workflow_id``'s topics; without ``run_id`` it follows the chain. + + A :class:`temporalio.streams.StreamRef` in place of the id opens the + stream it names, whatever its owner kind, with the ref's topic as the + handle's default. + """ + if isinstance(workflow_id, StreamRef): + if run_id is not None: + raise ValueError("a StreamRef names the run itself; pass no run_id") + return open_ref(self, client, workflow_id) return NativeStreamHandle(client, workflow_id, run_id, opened=self._opened) + async def create_standalone_stream( + self, + client: Client, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> NativeStandaloneStreamHandle: + """Create the standalone stream ``stream_id`` on the server and return a handle on it. + + ``max_records`` keeps the newest records and drops the oldest as they + are appended. ``retention`` is how long the records stay readable + after the stream is closed; the server does not trim an open stream + by age. ``max_bytes`` is refused: the server's lifecycle has no byte + bound. A create of an id that exists with the same policy returns a + handle on it; with another policy it is a ``ValueError``. + """ + if not stream_id: + raise ValueError("stream_id must not be empty") + if retention is not None and retention <= timedelta(0): + raise ValueError("retention must be positive") + if max_records is not None and max_records <= 0: + raise ValueError("max_records must be positive") + if max_bytes is not None: + if max_bytes <= 0: + raise ValueError("max_bytes must be positive") + raise StreamUnsupportedError( + "the native provider bounds a standalone stream by records and, " + "after it closes, by age; max_bytes is not on the server's lifecycle" + ) + streams = shared_client(client) + self._opened.add(shared_key(client)) + try: + await streams.create(stream_id, retention=retention, max_items=max_records) + except RPCError as error: + # The server answers a create of an id that exists with a generic + # failure rather than ALREADY_EXISTS; describe tells the two apart. + try: + held = (await streams.get(stream_id).describe()).lifecycle + except StreamNotFoundError: + raise error from None + # A bound left to the server's default is not a disagreement with + # whatever default the server filled in. + if (max_records is not None and held.max_items != max_records) or ( + retention is not None and held.retention.ToTimedelta() != retention + ): + raise ValueError( + f"stream {stream_id!r} exists with another policy: it keeps " + f"{held.max_items or 'all'} records for " + f"{held.retention.ToTimedelta()} after it closes" + ) from None + return NativeStandaloneStreamHandle(client, stream_id, opened=self._opened) + + def get_standalone_stream_handle( + self, client: Client, stream_id: str + ) -> NativeStandaloneStreamHandle: + """A handle on the standalone stream ``stream_id``. + + Nothing here creates the stream. A read on an id that does not exist + yet parks on the server until it is created; ``latest`` and a + producer's append raise :class:`temporalio.streams.StreamNotFoundError`. + """ + if not stream_id: + raise ValueError("stream_id must not be empty") + return NativeStandaloneStreamHandle(client, stream_id, opened=self._opened) + def get_activity_stream_handle( self, client: Client, diff --git a/temporalio/worker/_command_aware_visitor.py b/temporalio/worker/_command_aware_visitor.py index bc3e3f35a..fa6d5ba18 100644 --- a/temporalio/worker/_command_aware_visitor.py +++ b/temporalio/worker/_command_aware_visitor.py @@ -27,7 +27,7 @@ StartChildWorkflowExecution, WorkflowCommand, ) -from temporalio.streams._wire import CONTENT_HASH_KEY +from temporalio.streams._body import CONTENT_HASH_KEY @dataclass(frozen=True) diff --git a/tests/streams/test_native_fingerprint.py b/tests/streams/test_native_fingerprint.py index 9cac71755..fccc54aaa 100644 --- a/tests/streams/test_native_fingerprint.py +++ b/tests/streams/test_native_fingerprint.py @@ -27,7 +27,7 @@ PayloadCodec, StorageDriverWorkflowInfo, ) -from temporalio.streams._wire import CONTENT_HASH_KEY +from temporalio.streams import CONTENT_HASH_KEY from temporalio.streams.providers import native from temporalio.streams.providers.native import NativeProducer diff --git a/tests/streams/test_native_handles.py b/tests/streams/test_native_handles.py new file mode 100644 index 000000000..50b68c4db --- /dev/null +++ b/tests/streams/test_native_handles.py @@ -0,0 +1,110 @@ +"""What the native handles answer without a server. + +A ref names the owner as the handle addresses it, a close on an owned stream +is refused, a standalone handle refuses a cursor from another stream, and a +create refuses a policy the server cannot hold before any call is made. +""" + +from __future__ import annotations + +from datetime import timedelta +from types import SimpleNamespace +from typing import Any + +import pytest + +import temporalio.converter +from temporalio.streams import ( + DEFAULT_TOPIC, + StreamCursorError, + StreamRef, + StreamUnsupportedError, + topic, +) +from temporalio.streams.providers.native import ( + NativeActivityStreamHandle, + NativeStandaloneStreamHandle, + NativeStreamHandle, + NativeStreams, + _cursor, +) + +OUT = topic("out", dict) +_CLIENT: Any = SimpleNamespace( + data_converter=temporalio.converter.default(), namespace="ns" +) + + +def test_a_workflow_handle_refs_its_owner_as_it_is_pinned() -> None: + following = NativeStreamHandle(_CLIENT, "wf", None) + assert following.ref() == StreamRef.for_workflow("wf") + assert following.ref(topic=OUT) == StreamRef.for_workflow("wf", topic="out") + pinned = NativeStreamHandle(_CLIENT, "wf", "run-1") + assert pinned.ref(topic="a") == StreamRef.for_workflow( + "wf", run_id="run-1", topic="a" + ) + + +def test_an_activity_handle_refs_the_activity_and_its_workflow() -> None: + scheduled = NativeActivityStreamHandle(_CLIENT, "act", "wf", "run-1") + assert scheduled.ref() == StreamRef.for_activity( + "act", workflow_id="wf", run_id="run-1" + ) + standalone = NativeActivityStreamHandle(_CLIENT, "act", None, None) + assert standalone.ref(topic=OUT) == StreamRef.for_activity("act", topic="out") + assert standalone.ref().workflow_id is None + + +def test_a_standalone_handle_refs_its_id() -> None: + handle = NativeStandaloneStreamHandle(_CLIENT, "s1") + assert handle.stream_id == "s1" + assert handle.ref() == StreamRef.for_standalone("s1") + assert handle.ref().topic == DEFAULT_TOPIC + assert handle.ref(topic=OUT) == StreamRef.for_standalone("s1", topic="out") + + +async def test_only_a_standalone_stream_can_be_closed() -> None: + with pytest.raises(ValueError, match="standalone"): + await NativeStreamHandle(_CLIENT, "wf", None).close() + with pytest.raises(ValueError, match="standalone"): + await NativeActivityStreamHandle(_CLIENT, "act", "wf", None).close() + + +def test_a_standalone_handle_refuses_another_streams_cursor() -> None: + handle = NativeStandaloneStreamHandle(_CLIENT, "s1") + with pytest.raises(StreamCursorError, match="another stream"): + handle.read(topic=OUT, after=_cursor("s2", 3)) + with pytest.raises(StreamCursorError): + handle.read(topic=OUT, after=_cursor("", 3)) + + +def test_a_ref_opens_the_handle_it_names_on_the_provider() -> None: + provider = NativeStreams() + opened = provider.get_stream_handle( + _CLIENT, StreamRef.for_standalone("s1", topic="out") + ) + assert opened.ref() == StreamRef.for_standalone("s1", topic="out") + assert opened.ref(topic="b") == StreamRef.for_standalone("s1", topic="b") + workflow = provider.get_stream_handle( + _CLIENT, StreamRef.for_workflow("wf", run_id="r") + ) + assert workflow.ref() == StreamRef.for_workflow("wf", run_id="r") + with pytest.raises(ValueError, match="run_id"): + provider.get_stream_handle(_CLIENT, StreamRef.for_workflow("wf"), run_id="r") + + +async def test_a_create_refuses_a_policy_the_server_cannot_hold() -> None: + provider = NativeStreams() + for bad in ( + dict(max_records=0), + dict(max_bytes=-1), + dict(retention=timedelta(0)), + ): + with pytest.raises(ValueError): + await provider.create_standalone_stream(_CLIENT, "s1", **bad) # type: ignore[arg-type] + with pytest.raises(ValueError): + await provider.create_standalone_stream(_CLIENT, "") + with pytest.raises(StreamUnsupportedError, match="max_bytes"): + await provider.create_standalone_stream(_CLIENT, "s1", max_bytes=700) + with pytest.raises(ValueError): + provider.get_standalone_stream_handle(_CLIENT, "") diff --git a/tests/streams/test_native_standalone_e2e.py b/tests/streams/test_native_standalone_e2e.py new file mode 100644 index 000000000..2b9a43773 --- /dev/null +++ b/tests/streams/test_native_standalone_e2e.py @@ -0,0 +1,95 @@ +"""Standalone streams on the native provider against a live server. + +The conformance suite covers what every provider owes a standalone stream. +These pin what native adds on top: a read on an id nobody has created yet +parks on the server and delivers the first record once the stream exists, a +ref carries the stream to another client, and a create of an id that exists +is answered from the stream's own policy. Needs a server built from the +AI-198 branch: + + TEMPORAL_STREAM_TARGET=127.0.0.1:7433 uv run pytest tests/streams/test_native_standalone_e2e.py +""" + +from __future__ import annotations + +import asyncio +import os +import uuid + +import pytest + +from temporalio.client import Client +from temporalio.streams import StreamClosedError, StreamNotFoundError, StreamRef, topic +from temporalio.streams.providers.native import NativeStreams +from tests.streams.test_streams_conformance import take + +TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") + +pytestmark = pytest.mark.skipif( + not TARGET, + reason="set TEMPORAL_STREAM_TARGET to a server with the stream service", +) + +OUT = topic("out", dict) + + +async def _connect(provider: NativeStreams) -> Client: + return await Client.connect(TARGET or "", plugins=[provider]) + + +async def test_a_read_on_a_stream_not_yet_created_waits_for_it() -> None: + provider = NativeStreams() + client = await _connect(provider) + stream_id = "late-" + uuid.uuid4().hex[:8] + try: + reader = client.get_stream_handle(stream_id=stream_id) + # Nothing to wait on for these: the stream does not exist. + with pytest.raises(StreamNotFoundError): + await reader.latest(topic=OUT) + with pytest.raises(StreamNotFoundError): + await reader.producer(topic=OUT, producer_id="early", attempt=1).append( + {"n": 0} + ) + + parked = asyncio.ensure_future(take(reader.read(topic=OUT), 1, timeout=30)) + await asyncio.sleep(0.5) + assert not parked.done(), "the read is parked, not failed" + + created = await client.create_stream(stream_id) + await created.producer(topic=OUT, producer_id="writer", attempt=1).append( + {"n": 1} + ) + assert [r.value for r in await parked] == [{"n": 1}] + finally: + await provider.close() + + +async def test_a_ref_carries_a_standalone_stream_to_another_client() -> None: + provider = NativeStreams() + client = await _connect(provider) + other_provider = NativeStreams() + other = await _connect(other_provider) + stream_id = "ref-" + uuid.uuid4().hex[:8] + try: + created = await client.create_stream(stream_id, max_records=10) + await created.producer(topic=OUT, producer_id="writer", attempt=1).append( + {"n": 1} + ) + ref = created.ref(topic=OUT) + assert ref == StreamRef.for_standalone(stream_id, topic="out") + + opened = other.get_stream_handle(ref) + records = await take(opened.read(), 1) + assert [r.value for r in records] == [{"n": 1}] + assert await opened.latest() == records[0].cursor + + await opened.close() + with pytest.raises(StreamClosedError): + await created.producer(topic=OUT, producer_id="writer", attempt=2).append( + {"n": 2} + ) + # The tail stays readable and the read ends on its own. + assert [r.value async for r in created.read(topic=OUT)] == [{"n": 1}] + finally: + await provider.close() + await other_provider.close() diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index aae7148ef..9cd49daf8 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -62,6 +62,7 @@ StreamProducerError, StreamProvider, StreamRef, + StreamUnsupportedError, Supersession, topic, ) @@ -100,6 +101,11 @@ class ProviderCase: waits_for_standalone_creation: bool = False """A read on a standalone stream id that does not exist yet parks until the first write instead of raising ``StreamNotFoundError``.""" + bounds_standalone_bytes: bool = True + """A standalone stream's policy can bound the bytes it keeps.""" + trims_open_stream_by_age: bool = True + """A standalone stream drops records older than ``retention`` while it is + open, rather than keeping them that long after it closes.""" async def open( self, @@ -273,7 +279,15 @@ async def host(workflow_id: str) -> None: # No truncate hook: a stream a workflow owns has no truncation call. # BEGINNING on a truncated stream is covered on the stream client, # whose standalone streams can be truncated. - yield ProviderCase("native", provider, client, host=host) + yield ProviderCase( + "native", + provider, + client, + host=host, + waits_for_standalone_creation=True, + bounds_standalone_bytes=False, + trims_open_stream_by_age=False, + ) for handle in hosts.values(): await handle.terminate() await provider.close() @@ -738,7 +752,9 @@ async def test_a_body_above_the_threshold_is_offloaded_and_read_back( external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=256), ) workflow_id = new_workflow_id() - stream = await case.open(workflow_id, client=_client_with(client, converter)) + stream = await case.open( + workflow_id, client=_client_with(case.client or client, converter) + ) producer = stream.producer(topic=OUT, producer_id="model", attempt=1) small = {"n": 1} large = {"blob": "x" * 1024} @@ -760,7 +776,9 @@ async def test_a_retry_through_a_nondeterministic_codec_still_deduplicates( codec = NonceCodec() converter = dataclasses.replace(DataConverter.default, payload_codec=codec) workflow_id = new_workflow_id() - stream = await case.open(workflow_id, client=_client_with(client, converter)) + stream = await case.open( + workflow_id, client=_client_with(case.client or client, converter) + ) first = stream.producer(topic=OUT, producer_id="model", attempt=1) landed = await first.append({"id": "r1"}) assert codec.encoded == 1 @@ -899,13 +917,19 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas kept = await take(by_count.read(topic=OUT), 2) assert [r.value for r in kept] == [{"n": 3}, {"n": 4}] - by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) - producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) - for n in range(3): - await producer.append({"n": n, "blob": "x" * 500}) - kept = await take(by_bytes.read(topic=OUT), 1) - assert kept[0].value is not None and kept[0].value["n"] == 2 - + if case.bounds_standalone_bytes: + by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) + producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) + for n in range(3): + await producer.append({"n": n, "blob": "x" * 500}) + kept = await take(by_bytes.read(topic=OUT), 1) + assert kept[0].value is not None and kept[0].value["n"] == 2 + else: + with pytest.raises(StreamUnsupportedError): + await case.create_stream(new_stream_id(), max_bytes=700) + + if not case.trims_open_stream_by_age: + return by_age = await case.create_stream( new_stream_id(), retention=timedelta(milliseconds=200) ) diff --git a/tests/worker/test_workflow_stream_payloads_e2e.py b/tests/worker/test_workflow_stream_payloads_e2e.py index 54ffe74ea..aa739fb1f 100644 --- a/tests/worker/test_workflow_stream_payloads_e2e.py +++ b/tests/worker/test_workflow_stream_payloads_e2e.py @@ -29,8 +29,7 @@ JSONProtoPayloadConverter, PayloadCodec, ) -from temporalio.streams import RecordKind -from temporalio.streams._wire import CONTENT_HASH_KEY +from temporalio.streams import CONTENT_HASH_KEY, RecordKind from temporalio.streams.providers.native import NativeStreams from temporalio.worker import Worker from tests.streams.test_streams_conformance import take From 1acece8bdb6e88745f159a60e3f0914544c8c9f8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:59:14 -0700 Subject: [PATCH 706/831] Carried a Redis consumer through a reset and dropped a wake a closing run refuses. A reset run inherits the ranges the base run recorded and re-reads them from the log; the live cases show that, and that the reset-point task is run again from the log. The reset also surfaced a race: a wake buffered under a task that closes the run is refused as closing until the next task settles, so the producer failed although the record was in the log and the run's next park rechecks it. --- temporalio/streams/providers/redis.py | 44 ++++++- tests/streams/test_redis_provider.py | 17 ++- tests/streams/test_redis_replay.py | 163 ++++++++++++++++++++++++++ 3 files changed, 220 insertions(+), 4 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 9e1b47853..2461fa9f8 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -24,7 +24,20 @@ closing is sent again after a short wait: a run that continues as new hands the log to its successor, the records are already where the successor reads them, and only the wake has to follow. The retries stop when the - chain's current run takes the wake or the chain proves terminal. + chain's current run takes the wake or the chain proves terminal. A run + still refusing when the window passes is inside a Workflow Task that tried + to close it while the wake sat buffered; the wake is dropped, because the + record is in the log and a run that does not close after all rechecks the + log at its next park. +- A reset run inherits the base run's History up to the reset point, and + with it the ranges the base run's task completions recorded. It re-reads + them from the log and replays them against the inherited markers, so the + batches those tasks published are not published again, and live reading + continues from the last inherited boundary. The reset-point task itself is + run again, and what the base run consumed after the reset point is still + in the log, so the reset run reads it again and publishes again: an + outside reader sees that task's batch twice, once from each run. Nothing + in the log marks the reset. - A record rides as the transport's payload: the serialized ``StreamRecord`` proto as a ``binary/plain`` value, which the worker's codec encodes and decodes like any other payload. @@ -701,6 +714,16 @@ async def _chain(client: Client, workflow_id: str) -> WorkflowChainKey: WorkflowExecutionStatus.CONTINUED_AS_NEW, ) +#: What the server says when a Signal reaches a run whose Workflow Task is +#: closing it: on a continue-as-new handover for an instant, and after a task +#: that tried to close while the Signal sat buffered, until the next one settles. +_CLOSING_REFUSAL: Final = "workflow is closing" + + +def _refused_as_closing(error: WakeNotAcknowledgedError) -> bool: + """Whether the server refused a wake because the run is closing.""" + return _CLOSING_REFUSAL in str(error) + def _storage_error(error: Exception, what: str) -> StreamError: return StreamError(f"{what}: {error}") @@ -906,16 +929,33 @@ async def _wake(self) -> None: workflow id as every wake is, until the chain's current run takes it. A chain that has ended instead is the ordinary ending of a terminal record racing the consumer acting on it, not an error. + + A run that still refuses when the window passes is inside a Workflow + Task that tried to close it while this wake sat buffered, which the + server answers by failing that task and holding the run closed to + Signals until the next one settles. The wake is dropped then: if the + run closes, nothing is owed; if it does not, its next park rechecks + the log and finds the record, the transport's own rule for a record + appended before a park. Any other refusal that outlasts the window is + raised. """ deadline = time.monotonic() + _WAKE_RETRY_WINDOW.total_seconds() while True: try: await self._input.wake() return - except WakeNotAcknowledgedError: + except WakeNotAcknowledgedError as error: if await self._chain_is_terminal(): return if time.monotonic() >= deadline: + if _refused_as_closing(error): + logger.info( + "dropping the wake for %r on topic %r: the run is closing a " + "Workflow Task, and its next park rechecks the log", + self._workflow_id, + self._topic, + ) + return raise except TransportStreamError as error: raise _storage_error(error, "the wake could not be sent") from error diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 93758076e..680dc6e8d 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -137,10 +137,23 @@ async def test_a_wake_refused_by_a_finished_chain_is_the_ordinary_ending( @pytest.mark.usefixtures("quick_wake_retries") -async def test_a_wake_refused_for_the_whole_window_is_raised(): +async def test_a_wake_refused_as_closing_for_the_whole_window_is_dropped(): + # The run is inside a Workflow Task that tried to close it while the wake + # sat buffered. The record is in the log, so if the run stays open its + # next park rechecks the log and finds it; the producer is not failed. client = _ChainClient(WorkflowExecutionStatus.RUNNING) wakes = _RefusingInput(refusals=99) - with pytest.raises(WakeNotAcknowledgedError, match="closing"): + await _waking_producer(client, wakes)._wake() + assert wakes.calls > 1 + + +@pytest.mark.usefixtures("quick_wake_retries") +async def test_a_wake_refused_for_another_reason_for_the_whole_window_is_raised(): + client = _ChainClient(WorkflowExecutionStatus.RUNNING) + wakes = _RefusingInput( + refusals=99, error=WakeNotAcknowledgedError("signal rate limited", pending=[]) + ) + with pytest.raises(WakeNotAcknowledgedError, match="rate limited"): await _waking_producer(client, wakes)._wake() assert wakes.calls > 1 diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 586cbefb0..bac0ef3b7 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -817,6 +817,169 @@ async def test_an_identity_claimed_with_other_bytes_refuses_the_first_append( await handle.result() +@workflow.defn +class NudgedLoop: + """The contract loop with a signal that does nothing but complete a task.""" + + def __init__(self) -> None: + self._nudges = 0 + + @workflow.signal + def nudge(self) -> None: + self._nudges += 1 + + @workflow.run + async def run(self) -> list[int]: + decisions = workflow.stream_writer(DECISIONS) + seen: list[int] = [] + async for record in workflow.stream_reader(INPUTS): + if record.kind is RecordKind.FINISH: + break + if record.kind is not RecordKind.DATA: + continue + assert record.value is not None + decisions.publish({"decided": record.value["n"]}) + seen.append(record.value["n"]) + decisions.finish() + return seen + + +async def _completed_tasks(client: Client, workflow_id: str, run_id: str) -> list[int]: + return [ + event.event_id + async for event in client.get_workflow_handle( + workflow_id, run_id=run_id + ).fetch_history_events() + if event.HasField("workflow_task_completed_event_attributes") + ] + + +async def _reset_at(client: Client, workflow_id: str, run_id: str, *, task: int) -> str: + """Reset ``run_id`` at its ``task``-th completed Workflow Task; the new run id. + + The server keeps History up to that task's completion and runs the task + again, so the tasks before it are inherited and the task itself is not. + """ + from temporalio.api.common.v1 import WorkflowExecution + from temporalio.api.workflowservice.v1 import ResetWorkflowExecutionRequest + + completed = await _completed_tasks(client, workflow_id, run_id) + response = await client.workflow_service.reset_workflow_execution( + ResetWorkflowExecutionRequest( + namespace=client.namespace, + workflow_execution=WorkflowExecution( + workflow_id=workflow_id, run_id=run_id + ), + reason="streams: reset mid-stream", + workflow_task_finish_event_id=completed[task], + request_id=uuid.uuid4().hex, + ) + ) + return response.run_id + + +async def _consume_two_then_nudge( + live_client: Client, provider: RedisStreams, workflow_id: str, task_queue: str +) -> tuple[str, Any, Any]: + """Two records in two tasks, then a task that consumes nothing; the base run.""" + handle = await live_client.start_workflow( + NudgedLoop.run, id=workflow_id, task_queue=task_queue + ) + base_run = handle.result_run_id + assert base_run is not None + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + await producer.append({"n": 1}) + await take(stream.read(topic=DECISIONS), 1, 60) + await producer.append({"n": 2}) + await take(stream.read(topic=DECISIONS), 2, 60) + before = len(await _completed_tasks(live_client, workflow_id, base_run)) + await handle.signal(NudgedLoop.nudge) + for _ in range(300): + if len(await _completed_tasks(live_client, workflow_id, base_run)) > before: + break + await asyncio.sleep(0.1) + return base_run, stream, producer + + +async def test_a_reset_run_replays_the_inherited_ranges_and_continues( + live_client: Client, provider: RedisStreams +): + # Reset at the completion of the task the nudge woke, which consumed and + # published nothing: both consuming tasks are inherited. Their ranges are + # re-read from the log and replayed against the inherited markers, so + # their decisions are not published again, and reading continues from the + # last inherited boundary. + workflow_id = f"streams-redis-reset-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[NudgedLoop], + plugins=[provider], + max_cached_workflows=100, + ): + base_run, stream, producer = await _consume_two_then_nudge( + live_client, provider, workflow_id, f"tq-{workflow_id}" + ) + reset_run = await _reset_at(live_client, workflow_id, base_run, task=-1) + assert reset_run != base_run + + await producer.append({"n": 3}) + await producer.finish() + continued = live_client.get_workflow_handle(workflow_id, run_id=reset_run) + assert await asyncio.wait_for(continued.result(), 90) == [1, 2, 3] + decisions = [r async for r in stream.read(topic=DECISIONS)] + assert [(r.kind, r.value) for r in decisions] == [ + (RecordKind.DATA, {"decided": 1}), + (RecordKind.DATA, {"decided": 2}), + (RecordKind.DATA, {"decided": 3}), + (RecordKind.FINISH, None), + ] + + # Offline, the reset run's History reads the inherited ranges from the log. + await Replayer(workflows=[NudgedLoop], plugins=[provider]).replay_workflow( + await continued.fetch_history() + ) + + +async def test_a_reset_point_task_is_run_again_from_the_log( + live_client: Client, provider: RedisStreams +): + # Reset at the second consuming task's completion: the first task is + # inherited and the second is run again. The record it consumed is still + # in the log, so the reset run reads it again and publishes again, and an + # outside reader sees that decision from both runs. + workflow_id = f"streams-redis-reset-rerun-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[NudgedLoop], + plugins=[provider], + max_cached_workflows=100, + ): + base_run, stream, producer = await _consume_two_then_nudge( + live_client, provider, workflow_id, f"tq-{workflow_id}" + ) + reset_run = await _reset_at(live_client, workflow_id, base_run, task=1) + + await producer.append({"n": 3}) + await producer.finish() + continued = live_client.get_workflow_handle(workflow_id, run_id=reset_run) + assert await asyncio.wait_for(continued.result(), 90) == [1, 2, 3] + decisions = [r.value async for r in stream.read(topic=DECISIONS)] + assert decisions == [ + {"decided": 1}, + {"decided": 2}, + {"decided": 2}, + {"decided": 3}, + None, + ] + + await Replayer(workflows=[NudgedLoop], plugins=[provider]).replay_workflow( + await continued.fetch_history() + ) + + @workflow.defn class EchoOnOneTopic: """Reads ``inputs`` and answers each value on the same topic. From 60e8e036498d1af21e3866b99372a62ce34bbe72 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:52:11 -0700 Subject: [PATCH 707/831] Mapped BEGINNING to the oldest record held and added END and last=N. BEGINNING is documented as the oldest record a stream still retains, which on a truncated stream is not offset zero. END follows the tail from when a read starts and last=N starts at the newest records; after= stays the only way to resume. (cherry picked from commit ec46a74e412902ee9e2f7fc1d31dbdfe3d00f1f8) --- temporalio/streams/__init__.py | 6 +- temporalio/streams/_provider.py | 52 +++++++++--- temporalio/streams/_record.py | 31 +++++++ temporalio/streams/providers/memory.py | 108 ++++++++++++++++++++----- 4 files changed, 166 insertions(+), 31 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index e4f9d1691..6b6b61cfc 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -24,7 +24,9 @@ generation. 4. **A cursor is opaque and belongs to its provider.** Hand it back to resume strictly after the record it names; :meth:`StreamHandle.latest` positions a - follower. Do not compare two cursors or do arithmetic on one. + follower. Do not compare two cursors or do arithmetic on one. A read with + no cursor yet starts at :data:`BEGINNING`, at :data:`END`, or at the last + ``N`` records with ``last=N``. 5. **A workflow addresses its streams relative to itself, by topic.** A topic can be written by the workflow and by outside producers, and read by the workflow and by outside consumers; which of those happen is the @@ -81,6 +83,7 @@ ) from temporalio.streams._record import ( BEGINNING, + END, Cursor, RecordKind, StreamRecord, @@ -90,6 +93,7 @@ __all__ = [ "BEGINNING", + "END", "Cursor", "ReadSource", "RecordKind", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 621915f99..378791bc8 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -99,17 +99,31 @@ class StreamHandle(Protocol): @overload def read( - self, *, topic: StreamTopic[T], after: Cursor = ... + self, + *, + topic: StreamTopic[T], + after: Cursor = ..., + last: int | None = None, ) -> AsyncGenerator[StreamRecord[T], None]: ... @overload def read( - self, *, topic: str, after: Cursor = ..., result_type: type[T] + self, + *, + topic: str, + after: Cursor = ..., + last: int | None = None, + result_type: type[T], ) -> AsyncGenerator[StreamRecord[T], None]: ... @overload def read( - self, *, topic: str, after: Cursor = ..., result_type: None = None + self, + *, + topic: str, + after: Cursor = ..., + last: int | None = None, + result_type: None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: ... def read( @@ -117,14 +131,20 @@ def read( *, topic: str | StreamTopic[Any], after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: """Yield the records on ``topic`` after ``after`` as they arrive. - ``BEGINNING`` yields everything the topic retains. Any other cursor - came from a record a reader saw, and reading resumes just past it, so - a reader that stores the last cursor it handled and hands it back - sees every record exactly once. The read ends when the owning + ``BEGINNING`` yields everything the topic retains, starting at the + oldest record it still holds. ``END`` yields only what is appended + after the read starts. ``last=N`` starts at the newest ``N`` records, + or at all of them when there are fewer; it counts records of every + kind, so a ``FINISH`` among them leaves fewer than ``N`` values, and + it is exclusive with a cursor. Any other cursor came from a record a + reader saw, and reading resumes just past it, so a reader that stores + the last cursor it handled and hands it back sees every record + exactly once; that is the only way to resume. The read ends when the owning execution, or its chain, is closed and every retained record after ``after`` has been delivered; until then it waits. The result is a generator, so a caller that stops early can ``aclose()`` it and @@ -132,10 +152,14 @@ def read( Raises: ValueError: ``result_type`` was passed with a topic definition, - or the topic is empty. + the topic is empty, ``last`` is not positive, or ``last`` was + passed with a cursor. StreamCursorError: ``after`` came from another provider or names a record no longer retained. Raised by this call, not by the first iteration. + StreamUnsupportedError: The provider cannot start a read where + ``END`` or ``last=`` asks. A provider that raises it says so + in its own documentation. StreamNotFoundError: The workflow or topic does not exist or is past retention. """ @@ -223,11 +247,21 @@ class WorkflowStreamProvider(Protocol): the definitions are resolved before it is called. """ - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: """Subscribe the running workflow to ``topic`` of its own stream. + ``after`` and ``last`` mean what they mean on + :meth:`StreamHandle.read`, and arrive already checked. Where a start + is resolved has to be something replay reproduces, so a provider + resolves it in the store and records the result, never by reading + the store from the workflow thread. + Raises: StreamCursorError: ``after`` was minted by another provider. + StreamUnsupportedError: The provider cannot start where ``END`` + or ``last`` asks. """ ... diff --git a/temporalio/streams/_record.py b/temporalio/streams/_record.py index fef63e51c..ed499a5d8 100644 --- a/temporalio/streams/_record.py +++ b/temporalio/streams/_record.py @@ -12,6 +12,7 @@ __all__ = [ "BEGINNING", + "END", "Cursor", "RecordKind", "StreamRecord", @@ -80,6 +81,36 @@ def __str__(self) -> str: BEGINNING = Cursor("") """Read from the oldest record the stream still retains.""" +END = Cursor("$end") +"""Read only what is appended after the read starts. + +Provider-neutral, like :data:`BEGINNING`. It is resolved when the read +starts, not when it is called, so it cannot position a client before it +sends something; :meth:`temporalio.streams.StreamHandle.latest` does that. +""" + + +def check_read_start(after: Cursor, last: int | None) -> None: + """Refuse a read start that names two places, or a count that names none. + + ``after=`` resumes a read and ``last=`` starts one, so a call gives one or + the other. ``BEGINNING`` is the default for ``after=``, and passing it + alongside ``last=`` is the same as passing ``last=`` alone. + + Raises: + ValueError: ``last`` is not a positive int, or it was given together + with a cursor. + """ + if last is None: + return + if isinstance(last, bool) or not isinstance(last, int) or last <= 0: + raise ValueError(f"last must be a positive int, got {last!r}") + if after != BEGINNING: + raise ValueError( + "pass either after= or last=, not both: after= resumes a read and " + "last= starts one" + ) + @dataclass(frozen=True) class Supersession: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index e3392e268..7040ea646 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -21,6 +21,8 @@ ends once the activity has been seen pending and is no longer, or the workflow closed, so a read opened after the activity already finished waits for the workflow. +- It keeps every record until :meth:`MemoryStreams.truncate` drops the + oldest ones, which stands in for a store's retention in tests. The outside surface (producer identity, retry deduplication, positions, supersession, cursors) is faithful, which is what the conformance tests lean @@ -45,7 +47,14 @@ from temporalio.streams._errors import StreamCursorError from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -75,6 +84,10 @@ class _Topic: """One topic's records, and the waiters parked on its tail.""" def __init__(self) -> None: + # The retained records, the first of which sits at offset ``base``. + # Offsets are never reused, so a cursor keeps naming the same record + # after truncation drops the ones before it. + self.base = 0 self.records: list[bytes] = [] # Dedupe identity is (producer#attempt, first sequence of the append), # the same pair the storage providers use, mapped to where the batch @@ -101,7 +114,7 @@ def append( key = (writer or "", sequence) if writer is not None and key in self.seen: return self.seen[key] - first = len(self.records) + first = self.head self.records.extend(wire.SerializeToString() for wire in wires) if writer is not None: self.seen[key] = (first, len(wires)) @@ -110,9 +123,24 @@ def append( loop.call_soon_threadsafe(_wake, future) return first, len(wires) + @property + def head(self) -> int: + """The offset the next record lands at.""" + return self.base + len(self.records) + + def at(self, offset: int) -> bytes: + """The retained record at ``offset``.""" + return self.records[offset - self.base] + + def truncate(self, keep: int) -> None: + """Drop all but the newest ``keep`` records.""" + drop = max(0, len(self.records) - keep) + self.base += drop + del self.records[:drop] + async def wait_past(self, offset: int, timeout: float | None) -> None: """Wait until a record exists at ``offset``, or ``timeout`` passes.""" - if len(self.records) > offset: + if self.head > offset: return loop = asyncio.get_running_loop() future: asyncio.Future[None] = loop.create_future() @@ -148,15 +176,17 @@ def __init__(self, store: _Topic, start: int, poll: timedelta) -> None: async def next_batch(self) -> list[tuple[Cursor, WireRecord]]: while not self._closed: - records = self._store.records - if len(records) > self._offset: + head = self._store.head + if head > self._offset: batch: list[tuple[Cursor, WireRecord]] = [] - for offset in range(self._offset, len(records)): + for offset in range(max(self._offset, self._store.base), head): cursor = mint_cursor(_PROVIDER, str(offset)) - wire = _parse(cursor, records[offset], workflow.logger.warning) + wire = _parse( + cursor, self._store.at(offset), workflow.logger.warning + ) if wire is not None: batch.append((cursor, wire)) - self._offset = len(records) + self._offset = head if batch: return batch continue @@ -183,9 +213,12 @@ class _MemoryWorkflowProvider: def __init__(self, streams: MemoryStreams) -> None: self._streams = streams - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: - start = self._streams._offset_after(after) + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: + check_read_start(after, last) store = self._streams._topic(workflow.info().workflow_id, topic) + start = self._streams._start(store, after, last) return _MemReadSource(store, start, self._streams._poll) def open_writer(self, topic: str) -> WriteSink: @@ -317,15 +350,24 @@ def read( *, topic: str | StreamTopic[Any], after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the workflow closes.""" + """Yield records on ``topic`` from where the read starts until the workflow closes. + + ``END`` and ``last=`` are resolved by this call, against what the + topic holds when it is made. + """ + check_read_start(after, last) name, result_type = resolve_topic(topic, result_type) store = self._store(name) # Parsed here so a foreign cursor fails this call, not the first # iteration of the generator. - start = self._streams._offset_after(after) - return self._read(store, start, after, result_type) + start = self._streams._start(store, after, last) + # The decoder positions a synthesized record at the one before it, so + # it is told the position before the first record this read yields. + previous = mint_cursor(_PROVIDER, str(start - 1)) if start else BEGINNING + return self._read(store, start, previous, result_type) async def _read( self, @@ -339,10 +381,14 @@ async def _read( ) closed = False while True: - records = store.records - while offset < len(records): + while offset < store.head: + if offset < store.base: + raise StreamCursorError( + f"offset {offset} was truncated while this read was behind; " + f"the topic now starts at {store.base}" + ) cursor = mint_cursor(_PROVIDER, str(offset)) - wire = _parse(cursor, records[offset], logger.warning) + wire = _parse(cursor, store.at(offset), logger.warning) offset += 1 if wire is None: continue @@ -412,8 +458,8 @@ async def _closed(self) -> bool: async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """The cursor of the newest record on ``topic``, for following from now.""" name, _ = resolve_topic(topic) - count = len(self._store(name).records) - return mint_cursor(_PROVIDER, str(count - 1)) if count else BEGINNING + head = self._store(name).head + return mint_cursor(_PROVIDER, str(head - 1)) if head else BEGINNING def producer( self, @@ -455,6 +501,15 @@ def reset(self) -> None: self._topics.clear() self._activity_topics.clear() + def truncate(self, workflow_id: str, topic: str, *, keep: int) -> None: + """Drop all but the newest ``keep`` records of a topic. For tests. + + Stands in for a store's retention: offsets are kept, so a cursor from + before still names its record, and a read from ``BEGINNING`` starts + at the oldest one left. + """ + self._topic(workflow_id, topic).truncate(keep) + def workflow_provider(self) -> _MemoryWorkflowProvider: """The workflow half, over this provider's topics.""" return _MemoryWorkflowProvider(self) @@ -510,13 +565,24 @@ def _activity_topic( found = self._activity_topics[key] = _Topic() return found - def _offset_after(self, after: Cursor) -> int: + def _start(self, store: _Topic, after: Cursor, last: int | None) -> int: + """The offset a read starts at, resolved against what ``store`` holds now.""" + if last is not None: + return max(store.base, store.head - last) + if after == END: + return store.head position = cursor_position(after, provider=_PROVIDER) if position is None: - return 0 + return store.base try: - return int(position) + 1 + start = int(position) + 1 except ValueError: raise StreamCursorError( f"cursor {after.token!r} does not name a position on the memory provider" ) from None + if start < store.base: + raise StreamCursorError( + f"cursor {after.token!r} names a record no longer retained; the " + f"topic starts at offset {store.base}" + ) + return start From 9cc17dc7bdf75dde1bec2f39c492c74768b65467 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:52:11 -0700 Subject: [PATCH 708/831] Added conformance cases for each read start, on a truncated topic too. (cherry picked from commit 2e4298439c6bf3e5e036d889061537771a592875) --- tests/streams/conftest.py | 4 + tests/streams/test_streams_conformance.py | 97 ++++++++++++++++++++++- 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 12663fa23..7be000f3b 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -6,3 +6,7 @@ def pytest_configure(config: pytest.Config) -> None: "markers", "reports_positions: the case needs append() to return where records landed", ) + config.addinivalue_line( + "markers", + "truncates: the case needs a way to drop a topic's oldest records", + ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index a13d48f43..9aa456676 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -34,6 +34,7 @@ from temporalio.converter import DataConverter from temporalio.streams import ( BEGINNING, + END, Cursor, RecordKind, StreamCursorError, @@ -67,6 +68,9 @@ class ProviderCase: """``append()`` returns where the records landed.""" host: Callable[[str], Awaitable[None]] | None = None """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" + truncate: Callable[[str, str, int], Awaitable[None]] | None = None + """Drops all but the newest records of a workflow's topic, standing in + for retention, or ``None`` when the provider offers no way to.""" async def open( self, workflow_id: str, *, run_id: str | None = None @@ -87,7 +91,11 @@ async def open( async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider = MemoryStreams() - yield ProviderCase("memory", provider) + + async def truncate(workflow_id: str, topic: str, keep: int) -> None: + provider.truncate(workflow_id, topic, keep=keep) + + yield ProviderCase("memory", provider, truncate=truncate) provider.reset() @@ -97,6 +105,7 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, + "truncates": lambda case: case.truncate is not None, } @@ -435,3 +444,89 @@ async def test_a_definition_carries_its_type_once(case: ProviderCase): topic("", dict) # A string names a topic decided at runtime, and the hint rides the call. assert await stream.latest(topic=OUT.name) == BEGINNING + + +async def test_last_n_starts_at_the_newest_records(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + + newest = await take(stream.read(topic=OUT, last=2), 2) + assert [r.value for r in newest] == [{"n": 3}, {"n": 4}] + # Fewer records than asked for is all of them, not an error. + everything = await take(stream.read(topic=OUT, last=100), 4) + assert [r.value for r in everything] == [{"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}] + # The cursors it yields are ordinary cursors, so a resume after one works. + again = await take(stream.read(topic=OUT, after=newest[0].cursor), 1) + assert [r.value for r in again] == [{"n": 4}] + + +async def test_last_n_counts_finish_records(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + await producer.finish() + + records = await take(stream.read(topic=OUT, last=2), 2) + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"n": 2}), + (RecordKind.FINISH, None), + ] + + +async def test_end_reads_only_what_arrives_after_the_read_starts(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": "old"}, {"n": "old"}) + + records = stream.read(topic=OUT, after=END) + first = asyncio.ensure_future(records.__anext__()) + # END resolves when the read starts, and nothing says when that was, so + # appends keep coming until the reader takes one. + try: + for _ in range(100): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({first}, timeout=0.1) + if done: + break + record = await asyncio.wait_for(first, 5) + finally: + await records.aclose() + assert record.value == {"n": "new"} + + +@pytest.mark.truncates +async def test_beginning_starts_at_the_oldest_record_still_held(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + before = await take(stream.read(topic=OUT), 1) + assert case.truncate is not None + await case.truncate(workflow_id, OUT.name, 2) + + # BEGINNING is the oldest record retained, not offset zero, which a + # truncated stream no longer holds. + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [{"n": 3}, {"n": 4}] + newest = await take(stream.read(topic=OUT, last=3), 2) + assert [r.value for r in newest] == [{"n": 3}, {"n": 4}] + with pytest.raises(StreamCursorError): + stream.read(topic=OUT, after=before[0].cursor) + + +async def test_a_read_start_names_one_place(case: ProviderCase): + stream = await case.open(new_workflow_id()) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + appended = await producer.append({"n": 1}) + for last in (0, -1, True): + with pytest.raises(ValueError, match="positive"): + stream.read(topic=OUT, last=last) + if appended is not None: + with pytest.raises(ValueError, match="either after= or last="): + stream.read(topic=OUT, after=appended, last=1) + with pytest.raises(ValueError, match="either after= or last="): + stream.read(topic=OUT, after=END, last=1) From b81e932cc885169106de65bb0ed1d211d94f2612 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:55:12 -0700 Subject: [PATCH 709/831] Let stream_reader() start at END or at the last N records. A workflow could only start from BEGINNING or a cursor, so it had no way to follow from now. The provider resolves the start outside the workflow and records it, so replay reproduces it; last= is passed only when given, which keeps older providers working. (cherry picked from commit a3edfbbfbc80261e7b2b7bfb414c41902a02417b) --- temporalio/workflow/_streams.py | 72 +++++++++++++++++++------ tests/streams/test_streams_workflow.py | 75 ++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 15 deletions(-) diff --git a/temporalio/workflow/_streams.py b/temporalio/workflow/_streams.py index b99125ca3..550398869 100644 --- a/temporalio/workflow/_streams.py +++ b/temporalio/workflow/_streams.py @@ -18,7 +18,14 @@ from typing import Any, Generic, TypeVar, cast, overload from temporalio.streams._provider import ReadSource, WorkflowStreamProvider, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import RecordDecoder, to_wire from temporalio.workflow._context import _Runtime, payload_converter @@ -194,18 +201,28 @@ def finish(self) -> None: @overload -def stream_reader(topic: StreamTopic[T], *, after: Cursor = ...) -> StreamReader[T]: ... +def stream_reader( + topic: StreamTopic[T], *, after: Cursor = ..., last: int | None = None +) -> StreamReader[T]: ... @overload def stream_reader( - topic: str, *, result_type: type[T], after: Cursor = ... + topic: str, + *, + result_type: type[T], + after: Cursor = ..., + last: int | None = None, ) -> StreamReader[T]: ... @overload def stream_reader( - topic: str, *, result_type: None = None, after: Cursor = ... + topic: str, + *, + result_type: None = None, + after: Cursor = ..., + last: int | None = None, ) -> StreamReader[Any]: ... @@ -214,6 +231,7 @@ def stream_reader( *, result_type: type | None = None, after: Cursor = BEGINNING, + last: int | None = None, ) -> StreamReader[Any]: """Subscribe this workflow to ``topic`` of its own stream. @@ -221,8 +239,8 @@ def stream_reader( the record type, or a plain string with ``result_type=`` for a name decided at runtime. One subscription per topic per run. A second call for the same topic returns the reader already open on it, so records go - to whichever loop pulls first; such a call may pass neither ``after`` nor - a different type. Adding a reader on a new topic is a new command, so + to whichever loop pulls first; such a call may pass no ``after``, no + ``last`` and no different type. Adding a reader on a new topic is a new command, so gate it with :func:`temporalio.workflow.patched` as you would a timer. A reader in a successor run starts a new subscription: nothing crosses continue-as-new implicitly. @@ -232,34 +250,58 @@ def stream_reader( result_type: The value type for a string-named topic, used as the decode hint. :class:`temporalio.common.RawValue` returns the payload untouched. - after: Resume strictly after this record. Honoured on the first - subscription of a run, because after that the recorded - observations decide. + after: Resume strictly after this record. ``BEGINNING`` starts at + the oldest record the topic still holds and + :data:`temporalio.streams.END` at whatever is appended after the + subscription is registered. Honoured on the first subscription + of a run, because after that the recorded observations decide. + last: Start at the newest ``last`` records instead, or at all of + them when there are fewer. Records of every kind count. Exclusive + with a cursor in ``after``. Where it lands is resolved once, + outside the workflow, and replay reproduces it. Raises: ValueError: ``topic`` is empty, ``result_type`` was passed with a - definition, or a reader on the topic is already open and this - call asked for a different position or type. + definition, ``last`` is not positive or came with a cursor, or a + reader on the topic is already open and this call asked for a + different position or type. temporalio.streams.StreamCursorError: ``after`` was minted by another provider. + temporalio.streams.StreamUnsupportedError: The provider cannot start + where ``END`` or ``last`` asks. """ + check_read_start(after, last) name, result_type = resolve_topic(topic, result_type) state: _WorkflowStreams = _Runtime.current().workflow_streams() existing = state.readers.get(name) if existing is not None: - if after != BEGINNING or result_type is not existing._result_type: + if ( + after != BEGINNING + or last is not None + or result_type is not existing._result_type + ): raise ValueError( f"topic {name!r} already has a reader in this run; a second " - "stream_reader shares it and takes no after= or other type" + "stream_reader shares it and takes no after=, last= or other type" ) return existing - source = state.provider.open_reader(name, after=after) + # Passed only when given, so a provider written before last= existed + # still serves every read it can. + source = ( + state.provider.open_reader(name, after=after) + if last is None + else state.provider.open_reader(name, after=after, last=last) + ) def forget() -> None: state.readers.pop(name, None) + # The decoder positions a synthesized record at the one before it. Where + # END or last= lands is not known here, so BEGINNING stands in: resuming + # from it may deliver a record twice, where END would skip one. + previous = BEGINNING if after == END or last is not None else after reader: StreamReader[Any] = StreamReader( - source, topic=name, result_type=result_type, after=after, on_close=forget + source, topic=name, result_type=result_type, after=previous, on_close=forget ) state.readers[name] = reader return reader diff --git a/tests/streams/test_streams_workflow.py b/tests/streams/test_streams_workflow.py index 05adf23db..03b65b0da 100644 --- a/tests/streams/test_streams_workflow.py +++ b/tests/streams/test_streams_workflow.py @@ -26,6 +26,7 @@ from temporalio.client import Client from temporalio.streams import ( BEGINNING, + END, Cursor, ReadSource, RecordKind, @@ -477,3 +478,77 @@ async def test_a_publish_from_a_query_handler_is_refused_at_the_call( assert await stream.latest(topic=DECISIONS) == BEGINNING finally: await handle.terminate() + + +@workflow.defn +class NewestTwo: + """Starts at the newest two records on ``inputs`` and returns their values.""" + + @workflow.run + async def run(self) -> list[Any]: + reader = workflow.stream_reader(INPUTS, last=2) + values: list[Any] = [] + async for value in reader.values(): + values.append(value["n"]) + if len(values) == 2: + reader.close() + return values + + +async def test_a_workflow_reader_starts_at_the_last_n_records( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, NewestTwo, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + await stream.producer(topic=INPUTS, producer_id="tool", attempt=1).append( + {"n": 1}, {"n": 2}, {"n": 3}, {"n": 4} + ) + handle = await client.start_workflow( + NewestTwo.run, id=workflow_id, task_queue=worker.task_queue + ) + assert await handle.result() == [3, 4] + + +@workflow.defn +class FromNow: + """Follows ``inputs`` from when it subscribes and returns the first value.""" + + @workflow.run + async def run(self) -> Any: + reader = workflow.stream_reader(INPUTS, after=END) + async for value in reader.values(): + reader.close() + return value["n"] + return None + + +async def test_a_workflow_reader_at_end_skips_what_was_there( + client: Client, provider: MemoryStreams +): + workflow_id = f"streams-wf-{uuid.uuid4().hex}" + async with new_worker(client, FromNow, plugins=[provider]) as worker: + stream = provider.get_stream_handle(client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": "old"}) + handle = await client.start_workflow( + FromNow.run, id=workflow_id, task_queue=worker.task_queue + ) + result = asyncio.ensure_future(handle.result()) + # The subscription starts when the workflow runs, which the test does + # not observe, so appends keep coming until the workflow takes one. + for _ in range(150): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({result}, timeout=0.2) + if done: + break + assert await asyncio.wait_for(result, 10) == "new" + + +def test_a_workflow_reader_start_names_one_place(): + # Checked before the reader needs a running workflow, so a mistake says + # what it is rather than that there is no workflow. + with pytest.raises(ValueError, match="either after= or last="): + workflow.stream_reader(INPUTS, after=END, last=1) + with pytest.raises(ValueError, match="positive"): + workflow.stream_reader(INPUTS, last=0) From 440a18dbdeab1f3c8eb217c910a5d437b41621d4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:04:49 -0700 Subject: [PATCH 710/831] Declared the byte bound and age trim as standalone capabilities. A store may bound a standalone stream by record count and age but not by bytes, or apply retention only once the stream is closed. The two flags let such a provider say so and have the suite hold it to what it declares. --- tests/streams/test_streams_conformance.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 3ed924b5e..80fc167a5 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -83,6 +83,11 @@ class ProviderCase: truncate: Callable[[str, str, int], Awaitable[None]] | None = None """Drops all but the newest records of a workflow's topic, standing in for retention, or ``None`` when the provider offers no way to.""" + bounds_standalone_bytes: bool = True + """A standalone stream's policy can bound the bytes it keeps.""" + trims_open_stream_by_age: bool = True + """A standalone stream drops records older than ``retention`` while it is + open, rather than keeping them that long after it closes.""" async def open( self, @@ -168,7 +173,13 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: async def truncate(workflow_id: str, topic: str, keep: int) -> None: provider.truncate(workflow_id, topic, keep=keep) - yield ProviderCase("memory", provider, truncate=truncate) + yield ProviderCase( + "memory", + provider, + truncate=truncate, + bounds_standalone_bytes=True, + trims_open_stream_by_age=True, + ) provider.reset() From 24452e3aa7b2b7856c3b5814eb77ae949d82224d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Mon, 28 Sep 2026 16:56:25 -0700 Subject: [PATCH 711/831] Documented the read starts on both accessors and tested an activity stream. (cherry picked from commit 06cfa0182b86bf9ebe4c8f63014ede3cce1de48e) --- temporalio/activity.py | 6 ++++-- temporalio/client/_client.py | 6 +++++- tests/streams/test_stream_accessors.py | 29 +++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/temporalio/activity.py b/temporalio/activity.py index 701a4f3c6..1e4928a37 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -327,8 +327,10 @@ def stream_handle( status. Name a ``workflow_id`` to address another workflow; ``run_id`` then pins - the handle to one run and its absence follows the execution chain. See - :py:mod:`temporalio.streams`. + the handle to one run and its absence follows the execution chain. A + ``read`` starts at :py:data:`temporalio.streams.BEGINNING`, at + :py:data:`temporalio.streams.END` or at the last ``N`` records with + ``last=N``. See :py:mod:`temporalio.streams`. Like :py:func:`client`, this is only available in ``async def`` activities. diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index ed3a90500..ad0bea575 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -923,7 +923,11 @@ def get_stream_handle( ``workflow_id`` is left out, and ``run_id`` then pins the activity's run, or an activity that ``workflow_id`` scheduled. The provider is the one registered with ``plugins=[provider]`` at :py:meth:`connect`, - or passed as ``stream_provider``. See :py:mod:`temporalio.streams`. + or passed as ``stream_provider``. A ``read`` starts at + :py:data:`temporalio.streams.BEGINNING`, at + :py:data:`temporalio.streams.END` or at the last ``N`` records with + ``last=N``, and resumes only after a cursor it was handed. See + :py:mod:`temporalio.streams`. Args: workflow_id: Workflow ID whose stream to get a handle to, or the diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py index eb733ba5b..fed963aa6 100644 --- a/tests/streams/test_stream_accessors.py +++ b/tests/streams/test_stream_accessors.py @@ -18,7 +18,13 @@ from temporalio import activity, workflow from temporalio.client import Client -from temporalio.streams import RecordKind, StreamUnsupportedError, topic +from temporalio.streams import ( + BEGINNING, + END, + RecordKind, + StreamUnsupportedError, + topic, +) from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import ActivityEnvironment, WorkflowEnvironment from tests.helpers import new_worker @@ -120,3 +126,24 @@ async def ask() -> None: with pytest.raises(StreamUnsupportedError, match="plugins="): await ActivityEnvironment().run(ask) + + +async def test_an_activity_owned_stream_takes_every_read_start( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + stream = registered.get_stream_handle(activity_id=f"act-{uuid.uuid4().hex}") + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}) + + async def first(records: Any) -> Any: + async for record in records: + await records.aclose() + return record.value + return None + + assert await first(stream.read(topic=INPUTS, after=BEGINNING)) == {"n": 1} + assert await first(stream.read(topic=INPUTS, last=1)) == {"n": 3} + at_end = stream.read(topic=INPUTS, after=END) + await producer.append({"n": 4}) + assert await asyncio.wait_for(first(at_end), 10) == {"n": 4} From 3eb66641bf57efcbf42fe7e1042b682312cab50e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:04:48 -0700 Subject: [PATCH 712/831] Mapped the STREAM_CLOSED reason token to StreamClosedError. The server is giving an append on a sealed stream a reason token of its own, so the mapping takes the token beside the three it already knew and keeps the whole-message match for a server built before it. --- temporalio/client_stream.py | 5 +++-- tests/test_client_stream_errors.py | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 8ae0f114c..6b612dc3b 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -113,10 +113,11 @@ "STREAM_PRODUCER_CONFLICT": StreamProducerError, "STREAM_PRODUCER_STALE_SEQUENCE": StreamProducerError, "STREAM_CURSOR_BELOW_FLOOR": StreamCursorError, + "STREAM_CLOSED": StreamClosedError, } # The phrases a server built before the tokens existed sends for the same -# refusals, so a reader of either server gets the typed error. An append on a -# sealed stream has no token yet and is matched on its whole message. +# refusals, so a reader of either server gets the typed error. The sealed +# stream's message is matched whole. _PRODUCER_PHRASE = "producer sequence" _CURSOR_PHRASE = "below the stream's floor" _CLOSED_PHRASE = "stream is closed" diff --git a/tests/test_client_stream_errors.py b/tests/test_client_stream_errors.py index ae0b452a6..d317ced1f 100644 --- a/tests/test_client_stream_errors.py +++ b/tests/test_client_stream_errors.py @@ -15,6 +15,7 @@ from temporalio.client_stream import translate_error from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import ( + StreamClosedError, StreamCursorError, StreamNotFoundError, StreamProducerError, @@ -55,6 +56,16 @@ def test_a_read_below_the_floor_is_a_cursor_error(details: str) -> None: assert str(error) == details +@pytest.mark.parametrize( + "details", + ["STREAM_CLOSED: stream is closed", "stream is closed"], +) +def test_an_append_on_a_sealed_stream_is_a_closed_error(details: str) -> None: + error = translate_error(grpc.StatusCode.FAILED_PRECONDITION, details) + assert isinstance(error, StreamClosedError) + assert str(error) == details + + def test_not_found_is_a_not_found_error() -> None: error = translate_error(grpc.StatusCode.NOT_FOUND, "no stream with id 's'") assert isinstance(error, StreamNotFoundError) @@ -67,11 +78,11 @@ def test_an_unrelated_message_keeps_its_code() -> None: (grpc.StatusCode.FAILED_PRECONDITION, RPCStatusCode.FAILED_PRECONDITION), (grpc.StatusCode.UNAVAILABLE, RPCStatusCode.UNAVAILABLE), ]: - error = translate_error(code, "stream is closed", b"raw") + error = translate_error(code, "no records to append", b"raw") assert type(error) is RPCError assert error.status == expected assert error.raw_grpc_status == b"raw" - assert str(error) == "stream is closed" + assert str(error) == "no records to append" def test_a_token_needs_its_code_and_its_separator() -> None: From 4191d4d4f65880b58f3c0c99869f9f87aa6ebb3c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:22:54 -0700 Subject: [PATCH 713/831] Ran stream bodies through the data converter with a plaintext hash. A provider owes a record body the codec and external storage the SDK gives every payload. The shared helper takes the retry fingerprint before either runs and stamps the plaintext hash on the record, so a nondeterministic codec cannot turn a retry into a divergent write and the store can compare retries without the plaintext. (cherry picked from commit 50b278bbb2739e975f1e48c872155363dfb17f13) --- temporalio/streams/__init__.py | 22 +- temporalio/streams/_body.py | 116 ++++++++++ temporalio/streams/_provider.py | 24 ++- temporalio/streams/providers/memory.py | 68 ++++-- tests/streams/test_memory_provider.py | 69 ++++++ tests/streams/test_streams_conformance.py | 136 +++++++++++- tests/streams/test_streams_internals.py | 248 ++++++++++++++++++++++ 7 files changed, 663 insertions(+), 20 deletions(-) create mode 100644 temporalio/streams/_body.py create mode 100644 tests/streams/test_memory_provider.py create mode 100644 tests/streams/test_streams_internals.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 6b6b61cfc..10ca304ee 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -61,11 +61,26 @@ The record on the wire is ``temporal.api.stream.v1.StreamRecord`` on every provider, with the user's value in ``body`` as an ordinary payload, so a -reader in any language decodes the same bytes and a payload codec applies. +reader in any language decodes the same bytes and a payload codec applies. A +provider owes that body what the SDK gives every payload it sends: it encodes +it through the client's data converter, so the codec and the +:class:`temporalio.converter.ExternalStorage` drivers apply, it takes the +retry fingerprint over the converted bytes before either runs and leaves the +plaintext hash on the record under :data:`CONTENT_HASH_KEY`, and it offloads a +workflow's own publish off the workflow thread. :func:`encode_body`, +:func:`decode_body` and :func:`content_fingerprint` are the shared code for +that; :class:`StreamProvider` states the rule. """ from __future__ import annotations +from temporalio.streams._body import ( + CONTENT_HASH_KEY, + content_fingerprint, + content_hash, + decode_body, + encode_body, +) from temporalio.streams._errors import ( StreamCursorError, StreamError, @@ -93,6 +108,7 @@ __all__ = [ "BEGINNING", + "CONTENT_HASH_KEY", "END", "Cursor", "ReadSource", @@ -110,6 +126,10 @@ "Supersession", "WorkflowStreamProvider", "WriteSink", + "content_fingerprint", + "content_hash", + "decode_body", + "encode_body", "resolve_topic", "topic", ] diff --git a/temporalio/streams/_body.py b/temporalio/streams/_body.py new file mode 100644 index 000000000..2f10b6d4a --- /dev/null +++ b/temporalio/streams/_body.py @@ -0,0 +1,116 @@ +"""What a provider owes a record's body between the converter and its store. + +:func:`temporalio.streams._wire.to_wire` converts a value into the body with +the payload converter and stops there. Every other payload the SDK sends then +passes through the payload codec and external storage, and a stream body owes +the same, or a codec-protected deployment would leak plaintext through its +streams and a claim-check deployment would push oversized bodies at its store. +A provider runs the body through :func:`encode_body` before it stores or ships +a record and through :func:`decode_body` after it reads one back, off the +workflow thread in both directions. + +The order inside :func:`encode_body` is the point. The plaintext hash is taken +first and stamped on the record, and :func:`content_fingerprint` is taken over +the converted records too, before the codec runs, because a codec that +encrypts with a fresh nonce makes every retry's bytes differ, and a store that +fingerprinted those bytes would refuse the retry as a divergent write. The +store keeps the plaintext hash under :data:`CONTENT_HASH_KEY` and can compare +retries by it without ever seeing the plaintext. +""" + +from __future__ import annotations + +import hashlib +from collections.abc import Sequence + +from temporalio.api.common.v1 import Payload +from temporalio.api.stream.v1 import StreamRecord as WireRecord +from temporalio.converter import DataConverter + +__all__ = [ + "CONTENT_HASH_KEY", + "content_fingerprint", + "content_hash", + "decode_body", + "encode_body", +] + +CONTENT_HASH_KEY = "temporal.io/content-hash" +"""The record metadata key the plaintext hash of the body is stored under. + +Its value is a payload with ``encoding`` ``binary/plain`` whose data is the +hex digest :func:`content_hash` returns. A ``FINISH`` record carries no body +and no hash. +""" + +_HASH_ENCODING = b"binary/plain" + + +def content_hash(payload: Payload) -> str: + """The hex SHA-256 of ``payload`` as the converter produced it. + + Taken over the deterministic serialization of the whole payload, metadata + included, so two payloads that differ only in their encoding hash apart. + """ + return hashlib.sha256(payload.SerializeToString(deterministic=True)).hexdigest() + + +def content_fingerprint(records: Sequence[WireRecord]) -> bytes: + """The identity of one append, taken over its converted records. + + Length-delimited, so a batch split differently cannot collide with this + one. Take it before :func:`encode_body`, while the bodies are still what + the converter produced; that is what makes a retry through a + nondeterministic codec match its original. + """ + digest = hashlib.sha256() + for record in records: + body = record.SerializeToString(deterministic=True) + digest.update(len(body).to_bytes(8, "big")) + digest.update(body) + return digest.digest() + + +async def encode_body(converter: DataConverter, record: WireRecord) -> WireRecord: + """Stamp the plaintext hash on ``record`` and encode its body for the store. + + In place, and returned for convenience. The hash goes under + :data:`CONTENT_HASH_KEY` first; then the body passes through + ``converter``'s payload codec and external storage in the order + :meth:`temporalio.converter.DataConverter.encode` uses, so a body above + the external storage threshold is replaced by a claim and the claim is + what the store holds. A record without a body is returned untouched. + """ + if not record.HasField("body"): + return record + record.metadata[CONTENT_HASH_KEY].CopyFrom( + Payload( + metadata={"encoding": _HASH_ENCODING}, + data=content_hash(record.body).encode(), + ) + ) + encoded = await converter._encode_payload_sequence([record.body]) + stored = await converter._external_store_payload_sequence(encoded) + record.body.CopyFrom(stored[0]) + return record + + +async def decode_body(converter: DataConverter, record: WireRecord) -> WireRecord: + """Undo :func:`encode_body` on a record read back from the store. + + In place, and returned for convenience. The body is retrieved from + external storage when it is a claim and then run through the payload + codec, in the order :meth:`temporalio.converter.DataConverter.decode` + uses, leaving the payload the converter can turn back into a value. The + hash stays on the record. + + Raises: + RuntimeError: The body is a claim and ``converter`` has no external + storage to redeem it with. + """ + if not record.HasField("body"): + return record + retrieved = await converter._external_retrieve_payload_sequence([record.body]) + decoded = await converter._decode_payload_sequence(retrieved) + record.body.CopyFrom(decoded[0]) + return record diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 378791bc8..6cee7e5e6 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -11,7 +11,10 @@ A provider only moves ``temporal.api.stream.v1.StreamRecord`` protos. The handles around it convert values, synthesize supersession and mint cursors, and turn a :class:`temporalio.streams.StreamTopic` into the plain name the -provider sees, through :func:`temporalio.streams.resolve_topic`. +provider sees, through :func:`temporalio.streams.resolve_topic`. What it owes +a record's body on the way to and from its store, :class:`StreamProvider` +lists and :func:`temporalio.streams.encode_body` and +:func:`temporalio.streams.decode_body` do. """ from __future__ import annotations @@ -294,6 +297,25 @@ class StreamProvider(Protocol): ``Worker(plugins=[provider])`` and ``Replayer(plugins=[provider])`` for a worker alone, and open handles from it anywhere else. Nothing is global: two workers in one process may hold two providers. + + **What a provider owes a record's body.** The handles convert a value + into the body with the payload converter and no more; what the SDK does + to every other payload it sends, the codec and external storage, the + provider owes the body too, through the client's data converter, so the + :class:`temporalio.converter.ExternalStorage` drivers an application + configured apply to stream bodies as well. It does that in one order. + First it takes the retry fingerprint, the identity a repeated append is + matched by, over the converted bytes, before the codec and before any + offload, so a codec that encrypts with a fresh nonce cannot turn a retry + into a divergent write; the plaintext hash also rides the record under + :data:`temporalio.streams.CONTENT_HASH_KEY`, where the store can read it. + Then it encodes the body and offloads it, and on a read it does the + reverse before the record reaches a reader. A workflow's own publish is + converted on the workflow thread and no further: the codec and the offload + run when the provider commits the task's batch, off that thread. + :func:`temporalio.streams.encode_body`, + :func:`temporalio.streams.decode_body` and + :func:`temporalio.streams.content_fingerprint` are that rule in code. """ def workflow_provider(self) -> WorkflowStreamProvider: diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 7040ea646..ab9d84202 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -23,6 +23,11 @@ waits for the workflow. - It keeps every record until :meth:`MemoryStreams.truncate` drops the oldest ones, which stands in for a store's retention in tests. +- The outside path encodes and decodes bodies through the client's data + converter, codec and external storage included, and fingerprints a retry + over the converted bytes first. The workflow half has no client, so a + workflow's own publish is stored as the payload converter produced it and + a workflow-side read hands records over as stored. The outside surface (producer identity, retry deduplication, positions, supersession, cursors) is faithful, which is what the conformance tests lean @@ -44,7 +49,12 @@ from temporalio import workflow from temporalio.client import ActivityExecutionStatus, Client, WorkflowExecutionStatus from temporalio.service import RPCError, RPCStatusCode -from temporalio.streams._errors import StreamCursorError +from temporalio.streams._body import content_fingerprint, decode_body, encode_body +from temporalio.streams._errors import ( + StreamCursorError, + StreamProducerError, + StreamUnsupportedError, +) from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import ( @@ -105,15 +115,34 @@ def append( *, writer: str | None = None, sequence: int = 0, + content: bytes | None = None, ) -> tuple[int, int]: """Store ``wires`` and return where they landed as ``(first offset, count)``. - With a ``writer``, a repeat of ``(writer, sequence)`` stores nothing - and returns where the original landed. + With a ``writer``, a repeat of ``(writer, sequence)`` carrying the same + content stores nothing and returns where the original landed. + ``content`` is the fingerprint the repeat is matched by; a producer + takes it over the records before their bodies are encoded, and + without one it is taken over ``wires`` as they are. + + Raises: + StreamProducerError: ``(writer, sequence)`` is held with different + content. """ key = (writer or "", sequence) - if writer is not None and key in self.seen: - return self.seen[key] + bodies = [wire.SerializeToString(deterministic=True) for wire in wires] + if content is None: + content = content_fingerprint(wires) + if writer is not None: + held = self.seen.get(key) + if held is not None: + first, count, seen_content = held + if seen_content != content: + raise StreamProducerError( + f"producer sequence {sequence} already used with different " + f"content by {writer!r}" + ) + return first, count first = self.head self.records.extend(wire.SerializeToString() for wire in wires) if writer is not None: @@ -237,7 +266,7 @@ class MemoryProducer(Generic[T]): def __init__( self, store: _Topic, - converter: temporalio.converter.PayloadConverter, + converter: temporalio.converter.DataConverter, topic: str, producer_id: str, attempt: int, @@ -277,10 +306,10 @@ async def append(self, *values: T) -> Cursor: """ if not values: return self._last - return self._write( + return await self._write( [ to_wire( - self._converter, + self._converter.payload_converter, topic=self._topic, kind=RecordKind.DATA, value=value, @@ -294,10 +323,10 @@ async def append(self, *values: T) -> Cursor: async def finish(self) -> None: """Write ``FINISH`` for this producer on this topic.""" - self._write( + await self._write( [ to_wire( - self._converter, + self._converter.payload_converter, topic=self._topic, kind=RecordKind.FINISH, producer_id=self._producer_id, @@ -307,9 +336,14 @@ async def finish(self) -> None: ] ) - def _write(self, wires: list[WireRecord]) -> Cursor: + async def _write(self, wires: list[WireRecord]) -> Cursor: + # The fingerprint comes first, over the converted records, so a codec + # that encrypts with a fresh nonce cannot make a retry look divergent. + content = content_fingerprint(wires) + for wire in wires: + await encode_body(self._converter, wire) first, count = self._store.append( - wires, writer=self._writer, sequence=self._sequence + wires, writer=self._writer, sequence=self._sequence, content=content ) self._sequence += len(wires) self._last = mint_cursor(_PROVIDER, str(first + count - 1)) @@ -340,9 +374,9 @@ def __init__( self._activity_id = activity_id self._seen_pending = False self._converter = ( - client.data_converter.payload_converter + client.data_converter if client is not None - else temporalio.converter.DataConverter.default.payload_converter + else temporalio.converter.DataConverter.default ) def read( @@ -377,7 +411,10 @@ async def _read( result_type: type | None, ) -> AsyncGenerator[StreamRecord[Any], None]: decoder = RecordDecoder( - self._converter, result_type, after=after, warn=logger.warning + self._converter.payload_converter, + result_type, + after=after, + warn=logger.warning, ) closed = False while True: @@ -392,6 +429,7 @@ async def _read( offset += 1 if wire is None: continue + await decode_body(self._converter, wire) for record in decoder.decode(cursor, wire): yield record if closed: diff --git a/tests/streams/test_memory_provider.py b/tests/streams/test_memory_provider.py new file mode 100644 index 000000000..3fd83a9fb --- /dev/null +++ b/tests/streams/test_memory_provider.py @@ -0,0 +1,69 @@ +"""What the reference provider does that the conformance suite cannot see. + +The conformance suite is the public surface, so it can say that closing a read +returns and that the topic still works afterwards, but not that the provider +let go of what the read parked on. That is this file: a few assertions against +``MemoryStreams`` internals, where holding on would leak quietly. +""" + +from __future__ import annotations + +import asyncio + +import pytest + +from temporalio.api.stream.v1 import StreamRecord +from temporalio.streams import CONTENT_HASH_KEY, StreamProducerError, topic +from temporalio.streams.providers.memory import MemoryStreams + +OUT = topic("out", dict) + + +async def test_closing_a_parked_read_drops_its_waiter(): + provider = MemoryStreams() + stream = provider.get_stream_handle(None, "wf-parked") # type: ignore[arg-type] + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}) + store = provider._topic("wf-parked", OUT.name) + + records = stream.read(topic=OUT) + await asyncio.wait_for(records.__anext__(), 5.0) + + pending = asyncio.ensure_future(records.__anext__()) + await asyncio.sleep(0.2) + assert store._waiters, "the read should be parked on the topic by now" + + pending.cancel() + with pytest.raises(asyncio.CancelledError): + await pending + # Nothing left behind: a reader that comes and goes must not grow this + # list for the life of the topic. + assert store._waiters == [] + await asyncio.wait_for(records.aclose(), 5.0) + + +async def test_a_divergent_retry_leaves_the_store_alone(): + provider = MemoryStreams() + stream = provider.get_stream_handle(None, "wf-divergent") # type: ignore[arg-type] + store = provider._topic("wf-divergent", OUT.name) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + await producer.append({"n": 1}) + assert len(store.records) == 1 + + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + with pytest.raises( + StreamProducerError, match="already used with different content" + ): + await retry.append({"n": 2}) + assert len(store.records) == 1 + + +async def test_a_stored_record_carries_the_plaintext_hash(): + provider = MemoryStreams() + stream = provider.get_stream_handle(None, "wf-hash") # type: ignore[arg-type] + await stream.producer(topic=OUT, producer_id="model", attempt=1).append({"n": 1}) + stored = StreamRecord.FromString(provider._topic("wf-hash", OUT.name).records[0]) + # What the store holds is the record after encode_body: the hash the + # server-side dedupe reads is on it, under the shared key. + assert stored.metadata[CONTENT_HASH_KEY].data.decode().isalnum() + assert len(stored.metadata[CONTENT_HASH_KEY].data) == 64 diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9aa456676..f817208b1 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -21,8 +21,10 @@ from __future__ import annotations import asyncio +import dataclasses +import os import uuid -from collections.abc import AsyncIterator, Awaitable, Callable +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass from typing import Any @@ -31,7 +33,15 @@ from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.common import RawValue -from temporalio.converter import DataConverter +from temporalio.converter import ( + DataConverter, + ExternalStorage, + PayloadCodec, + StorageDriver, + StorageDriverClaim, + StorageDriverRetrieveContext, + StorageDriverStoreContext, +) from temporalio.streams import ( BEGINNING, END, @@ -73,10 +83,18 @@ class ProviderCase: for retention, or ``None`` when the provider offers no way to.""" async def open( - self, workflow_id: str, *, run_id: str | None = None + self, + workflow_id: str, + *, + run_id: str | None = None, + client: Client | None = None, ) -> StreamHandle: if self.host is not None: await self.host(workflow_id) + if client is not None: + # The explicit form, for a case that needs the handle to encode + # bodies through this client's data converter. + return self.provider.get_stream_handle(client, workflow_id, run_id=run_id) if self.client is not None: # A storage provider's setup registers the provider on the client, # so the cases go through the accessor an application uses. @@ -89,6 +107,65 @@ async def open( ) +class RecordingDriver(StorageDriver): + """An in-memory external storage driver that counts what it was asked to hold.""" + + def __init__(self) -> None: + self.held: dict[str, bytes] = {} + self.stored = 0 + self.retrieved = 0 + + def name(self) -> str: + return "recording" + + async def store( + self, context: StorageDriverStoreContext, payloads: Sequence[Payload] + ) -> list[StorageDriverClaim]: + claims: list[StorageDriverClaim] = [] + for payload in payloads: + key = f"payload-{len(self.held)}" + self.held[key] = payload.SerializeToString() + self.stored += 1 + claims.append(StorageDriverClaim(claim_data={"key": key})) + return claims + + async def retrieve( + self, + context: StorageDriverRetrieveContext, + claims: Sequence[StorageDriverClaim], + ) -> list[Payload]: + self.retrieved += len(claims) + return [Payload.FromString(self.held[c.claim_data["key"]]) for c in claims] + + +class NonceCodec(PayloadCodec): + """A codec whose output differs on every call, as one that encrypts with a fresh nonce does.""" + + def __init__(self) -> None: + self.encoded = 0 + + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + self.encoded += len(payloads) + return [ + Payload( + metadata={"encoding": b"binary/nonce"}, + data=os.urandom(16) + p.SerializeToString(), + ) + for p in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [Payload.FromString(p.data[16:]) for p in payloads] + + +def _client_with(client: Client, converter: DataConverter) -> Client: + # The same connection, carrying the converter the case wants bodies to + # pass through. + config = client.config() + config["data_converter"] = converter + return Client(**config) + + async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: provider = MemoryStreams() @@ -530,3 +607,56 @@ async def test_a_read_start_names_one_place(case: ProviderCase): stream.read(topic=OUT, after=appended, last=1) with pytest.raises(ValueError, match="either after= or last="): stream.read(topic=OUT, after=END, last=1) + + +async def test_a_body_above_the_threshold_is_offloaded_and_read_back( + case: ProviderCase, client: Client +): + driver = RecordingDriver() + converter = dataclasses.replace( + DataConverter.default, + external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=256), + ) + workflow_id = new_workflow_id() + stream = await case.open(workflow_id, client=_client_with(client, converter)) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + small = {"n": 1} + large = {"blob": "x" * 1024} + await producer.append(small) + await producer.append(large) + # Only the body over the threshold left the record; the small one stayed + # inline, as it would on any other payload the SDK sends. + assert driver.stored == 1 + + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [small, large] + assert driver.retrieved == 1 + + +@pytest.mark.detects_divergent_retries +async def test_a_retry_through_a_nondeterministic_codec_still_deduplicates( + case: ProviderCase, client: Client +): + codec = NonceCodec() + converter = dataclasses.replace(DataConverter.default, payload_codec=codec) + workflow_id = new_workflow_id() + stream = await case.open(workflow_id, client=_client_with(client, converter)) + first = stream.producer(topic=OUT, producer_id="model", attempt=1) + landed = await first.append({"id": "r1"}) + assert codec.encoded == 1 + + # The codec produced different bytes for the retry. The provider matched + # it by the plaintext it converted, so it is the same append: stored + # once, answered with the original position. + retry = stream.producer(topic=OUT, producer_id="model", attempt=1) + again = await retry.append({"id": "r1"}) + if landed is not None: + assert again == landed + # And a retry that really does differ is still told apart. + divergent = stream.producer(topic=OUT, producer_id="model", attempt=1) + with pytest.raises(StreamProducerError): + await divergent.append({"id": "other"}) + + await first.append({"id": "r2"}) + records = await take(stream.read(topic=OUT), 2) + assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] diff --git a/tests/streams/test_streams_internals.py b/tests/streams/test_streams_internals.py new file mode 100644 index 000000000..d986e2084 --- /dev/null +++ b/tests/streams/test_streams_internals.py @@ -0,0 +1,248 @@ +"""Unit tests for the pieces under ``temporalio.streams`` that no provider owns. + +The wire format, the supersession policy, the store key, the cursor prefix and +the plugin registration are shared by every provider and implemented once, so +they are tested once, here, against the private modules. What a provider owes +is in ``test_streams_conformance``; keeping the two apart is what makes that +file answerable by a new provider. +""" + +from __future__ import annotations + +import dataclasses +import os +from collections.abc import Sequence + +import pytest + +from temporalio.api.common.v1 import Payload +from temporalio.client import ClientConfig +from temporalio.converter import ( + DataConverter, + ExternalStorage, + PayloadCodec, + StorageDriver, + StorageDriverClaim, + StorageDriverRetrieveContext, + StorageDriverStoreContext, +) +from temporalio.streams import ( + BEGINNING, + CONTENT_HASH_KEY, + Cursor, + RecordKind, + StreamCursorError, + Supersession, + _ids, + _wire, + content_fingerprint, + content_hash, + decode_body, + encode_body, +) +from temporalio.streams._policy import AttemptTracker +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.worker import ReplayerConfig, WorkerConfig + + +def test_record_roundtrips_through_the_wire(): + converter = DataConverter.default.payload_converter + wire = _wire.to_wire( + converter, + topic="decisions", + kind=RecordKind.DATA, + value={"n": 1}, + producer_id="model", + attempt=3, + sequence=7, + ) + parsed = _wire.WireRecord.FromString(wire.SerializeToString()) + record = _wire.from_wire(converter, Cursor("memory:0"), parsed, dict) + assert ( + record.kind, + record.topic, + record.producer_id, + record.attempt, + record.sequence, + record.value, + ) == (RecordKind.DATA, "decisions", "model", 3, 7, {"n": 1}) + assert record.supersession is None + finish = _wire.to_wire(converter, topic="decisions", kind=RecordKind.FINISH) + assert not finish.HasField("body") + assert _wire.from_wire(converter, Cursor("memory:1"), finish, dict).value is None + + +def test_a_stored_supersession_is_not_a_record(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", kind=int(RecordKind.SUPERSEDED)) # type: ignore[arg-type] + with pytest.raises(ValueError, match="synthesized"): + _wire.from_wire(converter, Cursor("memory:0"), wire, None) + + +def test_an_unset_kind_is_read_as_data(): + converter = DataConverter.default.payload_converter + wire = _wire.WireRecord(topic="t", body=converter.to_payloads([{"n": 1}])[0]) + record = _wire.from_wire(converter, Cursor("memory:0"), wire, dict) + assert record.kind is RecordKind.DATA + assert record.value == {"n": 1} + + +def test_supersession_is_synthesized_from_observations(): + attempts = AttemptTracker() + assert attempts.note("model", 1, topic="t", previous=BEGINNING) is None + superseded = attempts.note("model", 2, topic="t", previous=Cursor("memory:0")) + assert superseded is not None + assert superseded.kind is RecordKind.SUPERSEDED + assert superseded.supersession == Supersession("model", 1, 2) + assert superseded.value is None + # Positioned before the triggering record, so a resume after it delivers + # that record next. + assert superseded.cursor == Cursor("memory:0") + # The same attempt again is not a new generation. + assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None + + +def test_topic_keys_cannot_collide(): + # A colon in a workflow id must not make two addresses one key. + assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") + assert _ids.topic_key("a%3Ab", "c") != _ids.topic_key("a:b", "c") + assert _ids.topic_key("wf", "inputs") == "wf:inputs" + + +def test_cursors_name_their_provider(): + assert _wire.cursor_position(BEGINNING, provider="memory") is None + assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" + with pytest.raises(StreamCursorError): + _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") + + +def test_registering_a_provider_twice_is_refused(): + # There is one slot on each of the three, and a user who passes a provider + # by hand and a provider plugin, or two provider plugins, meant both. + first, second = MemoryStreams(), MemoryStreams() + with pytest.raises(ValueError, match="already registered"): + second.configure_client(ClientConfig(stream_provider=first)) # type: ignore[typeddict-item] + with pytest.raises(ValueError, match="already registered"): + second.configure_worker(WorkerConfig(stream_provider=first)) # type: ignore[typeddict-item] + with pytest.raises(ValueError, match="already registered"): + second.configure_replayer(ReplayerConfig(stream_provider=first)) # type: ignore[typeddict-item] + + +def test_registering_the_same_provider_twice_is_fine(): + # A worker built from a client that already carries the plugin configures + # it again with the same object, which is not a conflict. + provider = MemoryStreams() + config = provider.configure_client(ClientConfig(stream_provider=provider)) # type: ignore[typeddict-item] + assert config.get("stream_provider") is provider + assert provider.configure_client(ClientConfig()).get("stream_provider") is provider # type: ignore[typeddict-item] + + +class _HoldEverything(StorageDriver): + """A driver that keeps every payload it is handed, in memory.""" + + def __init__(self) -> None: + self.held: list[bytes] = [] + + def name(self) -> str: + return "hold" + + async def store( + self, context: StorageDriverStoreContext, payloads: Sequence[Payload] + ) -> list[StorageDriverClaim]: + claims = [] + for payload in payloads: + claims.append(StorageDriverClaim(claim_data={"i": str(len(self.held))})) + self.held.append(payload.SerializeToString()) + return claims + + async def retrieve( + self, + context: StorageDriverRetrieveContext, + claims: Sequence[StorageDriverClaim], + ) -> list[Payload]: + return [Payload.FromString(self.held[int(c.claim_data["i"])]) for c in claims] + + +class _NonceCodec(PayloadCodec): + async def encode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [ + Payload( + metadata={"encoding": b"binary/nonce"}, + data=os.urandom(8) + p.SerializeToString(), + ) + for p in payloads + ] + + async def decode(self, payloads: Sequence[Payload]) -> list[Payload]: + return [Payload.FromString(p.data[8:]) for p in payloads] + + +async def test_encode_body_stamps_the_plaintext_hash_and_offloads_the_body(): + driver = _HoldEverything() + converter = dataclasses.replace( + DataConverter.default, + payload_codec=_NonceCodec(), + external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=0), + ) + wire = _wire.to_wire( + converter.payload_converter, topic="t", kind=RecordKind.DATA, value={"n": 1} + ) + plaintext = Payload() + plaintext.CopyFrom(wire.body) + + await encode_body(converter, wire) + # The hash is over what the converter produced, not over what the codec + # or the driver made of it, and it rides the record where the store can + # read it without the plaintext. + stamped = wire.metadata[CONTENT_HASH_KEY] + assert stamped.metadata["encoding"] == b"binary/plain" + assert stamped.data.decode() == content_hash(plaintext) + assert len(stamped.data) == 64 + # With a threshold of zero the body was offloaded: the record holds the + # claim and the driver holds the coded payload. + assert wire.body != plaintext + assert len(wire.body.external_payloads) == 1 + assert len(driver.held) == 1 + + await decode_body(converter, wire) + assert wire.body == plaintext + assert wire.metadata[CONTENT_HASH_KEY] == stamped + + # A record without a body has nothing to hash or offload. + finish = _wire.to_wire( + converter.payload_converter, topic="t", kind=RecordKind.FINISH + ) + await encode_body(converter, finish) + assert CONTENT_HASH_KEY not in finish.metadata + assert len(driver.held) == 1 + + +async def test_content_fingerprint_is_taken_before_the_codec(): + converter = dataclasses.replace(DataConverter.default, payload_codec=_NonceCodec()) + plain = converter.payload_converter + + def batch(*values: dict) -> list[_wire.WireRecord]: + return [ + _wire.to_wire(plain, topic="t", kind=RecordKind.DATA, value=v, sequence=i) + for i, v in enumerate(values, 1) + ] + + first, retry = batch({"n": 1}, {"n": 2}), batch({"n": 1}, {"n": 2}) + before = content_fingerprint(first) + assert before == content_fingerprint(retry) + # Different content, and the same content split differently, both differ. + assert before != content_fingerprint(batch({"n": 1}, {"n": 3})) + assert before != content_fingerprint(batch({"n": 1}) + batch({"n": 2})) + + for record in first + retry: + await encode_body(converter, record) + # The codec made the two batches' bytes differ; the identity taken first + # is what lets a store still recognise the retry. + assert first[0].body != retry[0].body + assert content_fingerprint(first) != content_fingerprint(retry) + # Decoding gives the converted bodies back; the hash stays stamped on the + # record, which is why the identity is taken before encoding, not after. + for record in first: + await decode_body(converter, record) + assert [r.body for r in first] == [r.body for r in batch({"n": 1}, {"n": 2})] + assert all(CONTENT_HASH_KEY in r.metadata for r in first) From f5a7e1bf7d0eff8485ce0f0f99162bacc8f8e73c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:06:35 -0700 Subject: [PATCH 714/831] Held the retention case to the declared capabilities and used the case's client. A provider that cannot bound a standalone stream by bytes is now expected to refuse the policy, and one that trims by age only after close skips that check. The converter cases derive their client from the provider's own, so a live provider is not asked to reach the fixture's dev server. --- tests/streams/test_streams_conformance.py | 29 ++++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 8fd498abf..62512e789 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -61,6 +61,7 @@ StreamProducerError, StreamProvider, StreamRef, + StreamUnsupportedError, Supersession, topic, ) @@ -696,7 +697,9 @@ async def test_a_body_above_the_threshold_is_offloaded_and_read_back( external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=256), ) workflow_id = new_workflow_id() - stream = await case.open(workflow_id, client=_client_with(client, converter)) + stream = await case.open( + workflow_id, client=_client_with(case.client or client, converter) + ) producer = stream.producer(topic=OUT, producer_id="model", attempt=1) small = {"n": 1} large = {"blob": "x" * 1024} @@ -718,7 +721,9 @@ async def test_a_retry_through_a_nondeterministic_codec_still_deduplicates( codec = NonceCodec() converter = dataclasses.replace(DataConverter.default, payload_codec=codec) workflow_id = new_workflow_id() - stream = await case.open(workflow_id, client=_client_with(client, converter)) + stream = await case.open( + workflow_id, client=_client_with(case.client or client, converter) + ) first = stream.producer(topic=OUT, producer_id="model", attempt=1) landed = await first.append({"id": "r1"}) assert codec.encoded == 1 @@ -857,13 +862,19 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas kept = await take(by_count.read(topic=OUT), 2) assert [r.value for r in kept] == [{"n": 3}, {"n": 4}] - by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) - producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) - for n in range(3): - await producer.append({"n": n, "blob": "x" * 500}) - kept = await take(by_bytes.read(topic=OUT), 1) - assert kept[0].value is not None and kept[0].value["n"] == 2 - + if case.bounds_standalone_bytes: + by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) + producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) + for n in range(3): + await producer.append({"n": n, "blob": "x" * 500}) + kept = await take(by_bytes.read(topic=OUT), 1) + assert kept[0].value is not None and kept[0].value["n"] == 2 + else: + with pytest.raises(StreamUnsupportedError): + await case.create_stream(new_stream_id(), max_bytes=700) + + if not case.trims_open_stream_by_age: + return by_age = await case.create_stream( new_stream_id(), retention=timedelta(milliseconds=200) ) From f52bb8210c6a17cc2bd79927c97f6a05d503603d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:22:54 -0700 Subject: [PATCH 715/831] Declared standalone streams and a handle close on the provider surface. A stream with an id of its own and no owner is created on purpose with a retention policy and sealed on purpose. The memory provider refuses both calls for now, and a workflow's handle refuses close, since its stream ends with the workflow. (cherry picked from commit ca0515cb33af15f6723905e2270d488c5b0ffc7a) --- temporalio/streams/__init__.py | 11 ++++ temporalio/streams/_errors.py | 8 +++ temporalio/streams/_provider.py | 68 +++++++++++++++++++++++ temporalio/streams/providers/memory.py | 48 ++++++++++++++-- tests/streams/test_streams_conformance.py | 10 ++++ 5 files changed, 141 insertions(+), 4 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 10ca304ee..9335e10bd 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -53,6 +53,15 @@ protocols a provider implements; nothing here that workflow code imports does I/O. + +A stream can also stand alone, with an id of its own and no owner. +``client.create_stream(stream_id, retention=...)`` creates it with a retention +policy and returns its handle, ``client.get_stream_handle(stream_id=...)`` +reaches an existing one, and the handle's ``close()`` seals it, after which +appends are refused with :class:`StreamClosedError` and the retained records +stay readable. A provider whose store cannot hold an ownerless stream raises +:class:`StreamUnsupportedError` for both. + What the contract does not promise: that a :attr:`RecordKind.FINISH` record means the writing activity succeeded, that a superseded attempt's records can be withdrawn, or that a stream outlives the retention its provider is @@ -82,6 +91,7 @@ encode_body, ) from temporalio.streams._errors import ( + StreamClosedError, StreamCursorError, StreamError, StreamNotFoundError, @@ -113,6 +123,7 @@ "Cursor", "ReadSource", "RecordKind", + "StreamClosedError", "StreamCursorError", "StreamError", "StreamHandle", diff --git a/temporalio/streams/_errors.py b/temporalio/streams/_errors.py index f00bf1c3a..a2f4fecf5 100644 --- a/temporalio/streams/_errors.py +++ b/temporalio/streams/_errors.py @@ -12,6 +12,7 @@ import temporalio.exceptions __all__ = [ + "StreamClosedError", "StreamCursorError", "StreamError", "StreamNotFoundError", @@ -36,5 +37,12 @@ class StreamProducerError(StreamError): """The producer attempt or sequence conflicts with what the store holds.""" +class StreamClosedError(StreamError): + """The standalone stream was sealed, so it takes no more records. + + Its retained records stay readable; only appends are refused. + """ + + class StreamUnsupportedError(StreamError): """This provider does not offer the requested capability.""" diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 6cee7e5e6..088cec252 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -20,6 +20,7 @@ from __future__ import annotations from collections.abc import AsyncGenerator +from datetime import timedelta from typing import TYPE_CHECKING, Any, Protocol, TypeVar, overload from temporalio.api.stream.v1 import StreamRecord as WireRecord @@ -204,6 +205,21 @@ def producer( """ ... + async def close(self) -> None: + """Seal the standalone stream this handle is on. + + A sealed stream takes no more records: a later ``append`` raises + :class:`temporalio.streams.StreamClosedError`, while everything it + retains stays readable and a read on it ends once that tail has been + delivered. Idempotent. Only a standalone stream can be closed here, + because an owned stream ends with its owner. + + Raises: + ValueError: This handle is on a workflow's or an activity's + stream. + """ + ... + class ReadSource(Protocol): """One subscription, as a provider supplies it to the workflow thread.""" @@ -316,6 +332,15 @@ class StreamProvider(Protocol): :func:`temporalio.streams.encode_body`, :func:`temporalio.streams.decode_body` and :func:`temporalio.streams.content_fingerprint` are that rule in code. + + **Standalone streams.** A stream can have an id of its own and no owner. + It is created on purpose, with :meth:`create_standalone_stream` and a + retention policy, and sealed on purpose, with the handle's ``close``. It + is addressed by topic like an owner's streams; how a provider lays its + topics out in the store is its own. A provider whose store cannot hold a + stream without an owner raises + :class:`temporalio.streams.StreamUnsupportedError` from both standalone + calls. """ def workflow_provider(self) -> WorkflowStreamProvider: @@ -357,6 +382,49 @@ def get_activity_stream_handle( """ ... + async def create_standalone_stream( + self, + client: Client, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> StreamHandle: + """Create the standalone stream ``stream_id`` and return a handle on it. + + The three policy arguments bound what the stream retains: records + older than ``retention``, beyond the newest ``max_records``, or past + ``max_bytes`` of stored records are dropped, and ``None`` leaves that + bound to the provider's default. Creating a stream that exists with + the same policy returns a handle on it, so a retried create is + harmless. + + Raises: + ValueError: ``stream_id`` is empty, a bound is not positive, or + the stream exists with a different policy. + StreamUnsupportedError: The provider's store cannot hold a stream + without an owner. + """ + ... + + def get_standalone_stream_handle( + self, client: Client, stream_id: str + ) -> StreamHandle: + """A handle on the standalone stream ``stream_id``, which must exist. + + Nothing here creates the stream: the first ``read``, ``latest`` or + ``producer`` on a stream that does not exist raises + :class:`temporalio.streams.StreamNotFoundError`, unless the provider + can wait for the stream to be created, in which case a ``read`` parks + until the first write and says so in its own documentation. + + Raises: + StreamUnsupportedError: The provider's store cannot hold a stream + without an owner. + """ + ... + async def close(self) -> None: """Release what this provider holds for the process. diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index ab9d84202..40fffd253 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -23,6 +23,8 @@ waits for the workflow. - It keeps every record until :meth:`MemoryStreams.truncate` drops the oldest ones, which stands in for a store's retention in tests. +- It does not host standalone streams; both standalone calls raise + :class:`temporalio.streams.StreamUnsupportedError`. - The outside path encodes and decodes bodies through the client's data converter, codec and external storage included, and fingerprints a retry over the converted bytes first. The workflow half has no client, so a @@ -101,8 +103,9 @@ def __init__(self) -> None: self.records: list[bytes] = [] # Dedupe identity is (producer#attempt, first sequence of the append), # the same pair the storage providers use, mapped to where the batch - # landed so a repeat can answer with the original position. - self.seen: dict[tuple[str, int], tuple[int, int]] = {} + # landed and a digest of what it held, so a repeat answers with the + # original position and a divergent one is told apart from it. + self.seen: dict[tuple[str, int], tuple[int, int, bytes]] = {} # Each waiter is parked with the loop it belongs to. A workflow's # publish runs on the workflow thread, and waking a foreign loop's # future from there needs call_soon_threadsafe or the loop stays @@ -144,9 +147,9 @@ def append( ) return first, count first = self.head - self.records.extend(wire.SerializeToString() for wire in wires) + self.records.extend(bodies) if writer is not None: - self.seen[key] = (first, len(wires)) + self.seen[key] = (first, len(wires), content) waiters, self._waiters = self._waiters, [] for loop, future in waiters: loop.call_soon_threadsafe(_wake, future) @@ -512,6 +515,13 @@ def producer( producer_id, attempt = producer_identity(producer_id, attempt) return MemoryProducer(store, self._converter, name, producer_id, attempt) + async def close(self) -> None: + """Refuse: a workflow's stream ends with the workflow, not by a caller.""" + raise ValueError( + "only a standalone stream can be closed; this handle is on a workflow's " + "stream, which ends when the workflow does" + ) + class MemoryStreams(ProviderPlugin): """The in-memory provider, one list per topic. @@ -578,6 +588,36 @@ def get_activity_stream_handle( """ return MemoryStreamHandle(self, client, workflow_id, run_id, activity_id) + async def create_standalone_stream( + self, + client: Client | None, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> MemoryStreamHandle: + """Refuse: this provider keeps no stream without an owner. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the memory provider does not host standalone streams" + ) + + def get_standalone_stream_handle( + self, client: Client | None, stream_id: str + ) -> MemoryStreamHandle: + """Refuse: this provider keeps no stream without an owner. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the memory provider does not host standalone streams" + ) + async def close(self) -> None: """Nothing to release: the provider holds no connection.""" diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index f817208b1..69773c2d5 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -609,6 +609,16 @@ async def test_a_read_start_names_one_place(case: ProviderCase): stream.read(topic=OUT, after=END, last=1) + + +async def test_an_owned_stream_cannot_be_closed_by_a_handle(case: ProviderCase): + # A workflow's stream ends with the workflow; close() is for a stream + # that stands alone. + stream = await case.open(new_workflow_id()) + with pytest.raises(ValueError, match="standalone"): + await stream.close() + + async def test_a_body_above_the_threshold_is_offloaded_and_read_back( case: ProviderCase, client: Client ): From b9ee5456bd3e9780b94b9166d30d24151d4f61dc Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:08:23 -0700 Subject: [PATCH 716/831] Declared the standalone byte bound and age trim absent on Workflow Streams. The provider hosts no standalone streams, so neither retention policy exists here and the retention case skips with the rest of them. --- tests/streams/test_streams_conformance.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 5bd2efcd3..39c41fc8a 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -322,8 +322,10 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: task_queue=worker.task_queue, truncate=truncate, # Every log is a running workflow's state; a stream with no owner - # has no workflow to live in. + # has no workflow to live in, so neither of its policies exists. hosts_standalone_streams=False, + bounds_standalone_bytes=False, + trims_open_stream_by_age=False, ) for handle in hosts.values(): await handle.terminate() From a1676e8cb81d2e7a0caebe4caa38c5d281fee208 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:09:23 -0700 Subject: [PATCH 717/831] Expected the reset run to read the reset-point task's input again. The server now seeds the reset run's inherited stream with the range the re-run task had consumed, at the offsets it held, so that task decides on the same input twice over and the inherited stream's floor holds the seeded record. The reset case follows that contract from the srv chain at 217eed936. --- tests/worker/test_workflow_stream_e2e.py | 30 +++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/tests/worker/test_workflow_stream_e2e.py b/tests/worker/test_workflow_stream_e2e.py index 60ef16139..b05fd653a 100644 --- a/tests/worker/test_workflow_stream_e2e.py +++ b/tests/worker/test_workflow_stream_e2e.py @@ -770,9 +770,9 @@ async def test_a_reset_run_is_followed_and_replayed() -> None: The reset re-runs the task named by the reset point, so the base run's history is copied up to that task and the ranges recorded in the copy are what the reset run replays, from the base run's streams. The inherited - ``inputs`` stream is the reset run's own from the inherited cursor on: it - starts empty at that offset, and the input the re-run task had consumed is - not delivered again, so the next input takes that offset. The + ``inputs`` stream is the reset run's own from the inherited cursor on: the + server seeds it with the input the re-run task had consumed, at the offset + it held, so the re-run task reads it again and the next input follows. The ``decisions`` stream, which the base run only published to, starts at zero. A handle without a run id follows the base run into the reset run and starts each stream at the floor it reports; a handle pinned to the base run ends @@ -792,7 +792,7 @@ async def test_a_reset_run_is_followed_and_replayed() -> None: assert base_run producer = await _feed_two(client, workflow_id) # A third input in a task of its own, which is the task the reset - # re-runs: its consumption is dropped with it. + # re-runs: the reset run is seeded with it and consumes it again. await producer.append({"n": 3}) base_stream = client.get_stream_handle(workflow_id, run_id=base_run) await take( @@ -839,8 +839,9 @@ async def test_a_reset_run_is_followed_and_replayed() -> None: 60, ) # The first two decisions were replayed from the base run's stream; - # the third input went with the task the reset re-ran. + # the third input came back with the task the reset re-ran. assert trace == TWO_DECISIONS + [ + {"kind": "decision", "n": 3}, {"kind": "decision", "n": 4}, {"kind": "finish", "producer": "model2"}, ] @@ -874,9 +875,11 @@ async def test_a_reset_run_is_followed_and_replayed() -> None: ({"decided": 1}, base_run, 0), ({"decided": 2}, base_run, 1), ({"decided": 3}, base_run, 2), - ({"decided": 4}, reset_run, 0), - (None, reset_run, 1), + ({"decided": 3}, reset_run, 0), + ({"decided": 4}, reset_run, 1), + (None, reset_run, 2), ] + # The seeded input sits at the offset it held in the base run. inputs = await asyncio.wait_for( _collect(client, workflow_id, INPUTS, None), 30 ) @@ -884,18 +887,23 @@ async def test_a_reset_run_is_followed_and_replayed() -> None: ({"n": 1}, base_run, 0), ({"n": 2}, base_run, 1), ({"n": 3}, base_run, 2), - ({"n": 4}, reset_run, 2), - (None, reset_run, 3), + ({"n": 3}, reset_run, 2), + ({"n": 4}, reset_run, 3), + (None, reset_run, 4), ] latest = await client.get_stream_handle(workflow_id).latest(topic=INPUTS) - assert latest.token == f"native:{reset_run}:3" + assert latest.token == f"native:{reset_run}:4" # Pinned to the reset run, BEGINNING is the floor its inherited # stream starts at. Offset zero, which it never held, is refused. from_floor = await asyncio.wait_for( _collect(client, workflow_id, INPUTS, reset_run), 30 ) - assert from_floor == [({"n": 4}, reset_run, 2), (None, reset_run, 3)] + assert from_floor == [ + ({"n": 3}, reset_run, 2), + ({"n": 4}, reset_run, 3), + (None, reset_run, 4), + ] # The reset run's history: the base run's events, the reset marker # naming both runs, then its own. The replayer fetches the first era From 1897c9184709e5a82351e2d627afdd8fccbdc583 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:22:54 -0700 Subject: [PATCH 718/831] Added StreamRef, a serializable name for one stream. A handle is bound to its client and provider, so a stream crosses a process boundary as its owner and topic in plain data, with no cursor and no provider name. The default converter carries it as JSON, so it can be a workflow argument, an activity result or a Nexus operation input or result. (cherry picked from commit 5d600c45a791330a99e3a86236fe546ce0e6ee34) --- temporalio/streams/__init__.py | 9 ++ temporalio/streams/_provider.py | 36 ++++-- temporalio/streams/_ref.py | 142 ++++++++++++++++++++++ temporalio/streams/providers/memory.py | 15 +++ tests/streams/test_streams_conformance.py | 38 +++++- tests/streams/test_streams_internals.py | 30 +++++ 6 files changed, 258 insertions(+), 12 deletions(-) create mode 100644 temporalio/streams/_ref.py diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 9335e10bd..1eda4e030 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -53,6 +53,12 @@ protocols a provider implements; nothing here that workflow code imports does I/O. +A handle is bound to its client and provider, so a stream is handed to another +process as a :class:`StreamRef`: the owner and the topic as plain data, with +no cursor and no provider name. :meth:`StreamHandle.ref` makes one, the +default data converter carries it as JSON, and the receiver opens it with +``client.get_stream_handle(ref)`` or ``activity.stream_handle(ref)`` on +whatever provider its client has. A stream can also stand alone, with an id of its own and no owner. ``client.create_stream(stream_id, retention=...)`` creates it with a retention @@ -114,6 +120,7 @@ StreamRecord, Supersession, ) +from temporalio.streams._ref import StreamOwnerKind, StreamRef from temporalio.streams._topic import StreamTopic, resolve_topic, topic __all__ = [ @@ -128,10 +135,12 @@ "StreamError", "StreamHandle", "StreamNotFoundError", + "StreamOwnerKind", "StreamProducer", "StreamProducerError", "StreamProvider", "StreamRecord", + "StreamRef", "StreamTopic", "StreamUnsupportedError", "Supersession", diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 088cec252..18bdc9e67 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -29,6 +29,7 @@ if TYPE_CHECKING: from temporalio.client import Client + from temporalio.streams._ref import StreamRef __all__ = [ "ReadSource", @@ -91,14 +92,21 @@ async def finish(self) -> None: class StreamHandle(Protocol): """One owner's stream, addressed by topic, from outside workflow code. - The owner is a workflow or an activity. A handle on a workflow follows - its execution chain unless it was opened with a ``run_id``, in which case - it is pinned to that run. A topic is a - :class:`temporalio.streams.StreamTopic` definition, which carries the - record type, or a plain string with ``result_type=`` for a name decided - at runtime. A transport failure surfaces as - :class:`temporalio.service.RPCError`, never as the transport's own - exception type. + The owner is a workflow, an activity, or a standalone stream that has an + id of its own and no owner. A handle on a workflow follows its execution + chain unless it was opened with a ``run_id``, in which case it is pinned + to that run. A topic is a :class:`temporalio.streams.StreamTopic` + definition, which carries the record type, or a plain string with + ``result_type=`` for a name decided at runtime. A transport failure + surfaces as :class:`temporalio.service.RPCError`, never as the + transport's own exception type. + + A handle is bound to its client and provider. To hand a stream to another + process, :meth:`ref` names it as a :class:`temporalio.streams.StreamRef`, + which is plain data; the receiver opens it with + :meth:`temporalio.client.Client.get_stream_handle` or + :func:`temporalio.activity.stream_handle` and names the topic on each + call, as on any handle. """ @overload @@ -205,6 +213,18 @@ def producer( """ ... + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A :class:`temporalio.streams.StreamRef` to ``topic`` of this owner. + + Without ``topic`` it names the owner alone, or the topic this handle + was opened from a ref with. The ref carries the owner exactly as this + handle addresses it, a ``run_id`` included when the handle is pinned, + and no cursor or provider name, so it can travel as a workflow + argument, an activity result or a Nexus operation input or result and + be opened wherever a client is. + """ + ... + async def close(self) -> None: """Seal the standalone stream this handle is on. diff --git a/temporalio/streams/_ref.py b/temporalio/streams/_ref.py new file mode 100644 index 000000000..35b52ec49 --- /dev/null +++ b/temporalio/streams/_ref.py @@ -0,0 +1,142 @@ +"""A reference to one stream that crosses a process boundary as data. + +A handle is bound to a client and a provider, so it cannot be a workflow +argument, an activity result or a Nexus operation result. A +:class:`StreamRef` can: it names the owner and the topic, nothing more, and +whoever receives it opens the stream on the provider its own client carries. +It carries no cursor, because a position belongs to a reader, and no provider +name, because the same owner and topic name the same stream on every provider +a deployment runs. +""" + +from __future__ import annotations + +import dataclasses +from dataclasses import dataclass +from typing import Any, Literal + +from temporalio.streams._topic import StreamTopic, resolve_topic + +__all__ = ["StreamOwnerKind", "StreamRef"] + +StreamOwnerKind = Literal["workflow", "activity", "standalone"] +"""What owns a stream: a workflow, an activity, or the stream itself.""" + + +@dataclass(frozen=True) +class StreamRef: + """One stream, named by its owner and its topic. + + ``kind`` says what owns the stream. A ``"workflow"`` ref carries + ``workflow_id`` and, when pinned to one run, ``run_id``. An ``"activity"`` + ref carries ``activity_id``, plus ``workflow_id`` (and its ``run_id``) + when a workflow scheduled the activity; without ``workflow_id`` it is a + standalone activity, and ``run_id`` then pins one run of it. A + ``"standalone"`` ref carries ``stream_id`` and nothing else. ``topic`` is + the topic's name when the ref names one; a ref may name the owner alone, + and the reader names the topic on each call, as on any handle. + + A ref comes from :meth:`temporalio.streams.StreamHandle.ref`, or from + :meth:`for_workflow`, :meth:`for_activity` and :meth:`for_standalone` + when only the ids are at hand. The default data converter carries it as + JSON, so it can be a workflow argument, an activity result, or a Nexus + operation input or result, and + :meth:`temporalio.client.Client.get_stream_handle` and + :func:`temporalio.activity.stream_handle` open one directly. + """ + + kind: StreamOwnerKind + topic: str | None = None + workflow_id: str | None = None + run_id: str | None = None + activity_id: str | None = None + stream_id: str | None = None + + def __post_init__(self) -> None: + """Refuse a ref that names an owner its kind does not have.""" + if self.topic is not None and not self.topic: + raise ValueError("a StreamRef's topic name must not be empty") + if self.kind == "workflow": + if not self.workflow_id: + raise ValueError("a workflow StreamRef needs a workflow_id") + if self.activity_id is not None or self.stream_id is not None: + raise ValueError( + "a workflow StreamRef carries no activity_id and no stream_id" + ) + elif self.kind == "activity": + if not self.activity_id: + raise ValueError("an activity StreamRef needs an activity_id") + if self.stream_id is not None: + raise ValueError("an activity StreamRef carries no stream_id") + elif self.kind == "standalone": + if not self.stream_id: + raise ValueError("a standalone StreamRef needs a stream_id") + if ( + self.workflow_id is not None + or self.run_id is not None + or self.activity_id is not None + ): + raise ValueError("a standalone StreamRef carries only its stream_id") + else: + raise ValueError( + f"unknown StreamRef kind {self.kind!r}; expected 'workflow', " + "'activity' or 'standalone'" + ) + + @classmethod + def for_workflow( + cls, + workflow_id: str, + *, + run_id: str | None = None, + topic: str | StreamTopic[Any] | None = None, + ) -> StreamRef: + """A ref to ``topic`` of ``workflow_id``'s stream. + + Without ``run_id`` a handle opened from it follows the execution + chain; with one it is pinned to that run. Without ``topic`` it names + the owner alone. + """ + return cls("workflow", _name(topic), workflow_id=workflow_id, run_id=run_id) + + @classmethod + def for_activity( + cls, + activity_id: str, + *, + workflow_id: str | None = None, + run_id: str | None = None, + topic: str | StreamTopic[Any] | None = None, + ) -> StreamRef: + """A ref to ``topic`` of the streams ``activity_id`` owns. + + With ``workflow_id`` the activity is one that workflow scheduled and + ``run_id`` is the workflow's run; without it the activity is a + standalone one and ``run_id`` pins one run of it. + """ + return cls( + "activity", + _name(topic), + workflow_id=workflow_id, + run_id=run_id, + activity_id=activity_id, + ) + + @classmethod + def for_standalone( + cls, stream_id: str, *, topic: str | StreamTopic[Any] | None = None + ) -> StreamRef: + """A ref to ``topic`` of the standalone stream ``stream_id``.""" + return cls("standalone", _name(topic), stream_id=stream_id) + + def with_topic(self, topic: str | StreamTopic[Any] | None) -> StreamRef: + """The same owner, naming ``topic`` instead, or the owner alone for ``None``.""" + return dataclasses.replace(self, topic=_name(topic)) + + +def _name(topic: str | StreamTopic[Any] | None) -> str | None: + """The topic's plain name, or ``None`` for a ref that names the owner alone.""" + if topic is None: + return None + name, _ = resolve_topic(topic) + return name diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index 40fffd253..c83893cbd 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -67,6 +67,7 @@ StreamRecord, check_read_start, ) +from temporalio.streams._ref import StreamRef from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -515,6 +516,20 @@ def producer( producer_id, attempt = producer_identity(producer_id, attempt) return MemoryProducer(store, self._converter, name, producer_id, attempt) + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A ref to ``topic`` of this owner's stream, pinned as this handle is.""" + if self._activity_id is not None: + return StreamRef.for_activity( + self._activity_id, + workflow_id=self._workflow_id, + run_id=self._run_id, + topic=topic, + ) + assert self._workflow_id is not None + return StreamRef.for_workflow( + self._workflow_id, run_id=self._run_id, topic=topic + ) + async def close(self) -> None: """Refuse: a workflow's stream ends with the workflow, not by a caller.""" raise ValueError( diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 69773c2d5..cd3664a31 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -11,10 +11,15 @@ skipped with a reason on a provider whose ``append()`` learns positions at read time. -What this file pins down is the contract: the record on the wire, producer -identity, retry deduplication, positions, supersession, topic addressing, -cursor resumption, cursor ownership, and store keys that cannot collide. The -workflow-side handles and the two rules about Workflow Tasks live in +What this file pins down is what a provider owes: producer identity, retry +deduplication, positions, supersession, topic addressing, cursor resumption, +cursor ownership, releasing a read the caller stopped early, naming a stream +as a ``StreamRef``, and running bodies through the client's data converter so +external storage applies and a retry through a nondeterministic codec still +matches its original. Every case here goes through the public surface, so a +new provider answers this file and nothing else. The shared pieces no provider +implements are unit-tested in ``test_streams_internals``; the workflow-side +handles and the two rules about Workflow Tasks live in ``test_streams_workflow``. """ @@ -49,7 +54,9 @@ RecordKind, StreamCursorError, StreamHandle, + StreamProducerError, StreamProvider, + StreamRef, Supersession, _ids, _wire, @@ -609,6 +616,29 @@ async def test_a_read_start_names_one_place(case: ProviderCase): stream.read(topic=OUT, after=END, last=1) +async def test_a_ref_names_the_stream_and_round_trips_as_data(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + ref = stream.ref(topic=OUT) + assert ref == StreamRef.for_workflow(workflow_id, topic="out") + assert (ref.kind, ref.run_id, ref.activity_id, ref.stream_id) == ( + "workflow", + None, + None, + None, + ) + # Without a topic the ref names the owner alone; the reader names one. + assert stream.ref().topic is None + assert stream.ref().with_topic(A) == stream.ref(topic=A) + # A pinned handle hands out a pinned ref. + pinned = await case.open(workflow_id, run_id="run-1") + assert pinned.ref(topic=OUT).run_id == "run-1" + + # Plain data through the default converter, so it can be a workflow + # argument, an activity result or a Nexus operation input or result. + converter = DataConverter.default + [carried] = await converter.decode(await converter.encode([ref]), [StreamRef]) + assert carried == ref async def test_an_owned_stream_cannot_be_closed_by_a_handle(case: ProviderCase): diff --git a/tests/streams/test_streams_internals.py b/tests/streams/test_streams_internals.py index d986e2084..8e3d09feb 100644 --- a/tests/streams/test_streams_internals.py +++ b/tests/streams/test_streams_internals.py @@ -32,6 +32,7 @@ Cursor, RecordKind, StreamCursorError, + StreamRef, Supersession, _ids, _wire, @@ -246,3 +247,32 @@ def batch(*values: dict) -> list[_wire.WireRecord]: await decode_body(converter, record) assert [r.body for r in first] == [r.body for r in batch({"n": 1}, {"n": 2})] assert all(CONTENT_HASH_KEY in r.metadata for r in first) + + +async def test_a_stream_ref_names_one_owner_and_travels_as_json(): + workflow = StreamRef.for_workflow("wf", run_id="r", topic="out") + activity = StreamRef.for_activity("act", workflow_id="wf", topic="progress") + standalone = StreamRef.for_standalone("shared") + assert workflow == StreamRef("workflow", "out", workflow_id="wf", run_id="r") + assert activity.kind == "activity" and activity.activity_id == "act" + assert standalone == StreamRef("standalone", "output", stream_id="shared") + assert standalone.with_topic("x").topic == "x" + + for bad in ( + dict(kind="workflow"), + dict(kind="workflow", workflow_id="wf", stream_id="s"), + dict(kind="activity", workflow_id="wf"), + dict(kind="standalone", stream_id="s", workflow_id="wf"), + dict(kind="standalone"), + dict(kind="nexus", stream_id="s"), + dict(kind="workflow", workflow_id="wf", topic=""), + ): + with pytest.raises(ValueError): + StreamRef(**bad) # type: ignore[arg-type] + + converter = DataConverter.default + for ref in (workflow, activity, standalone): + [carried] = await converter.decode(await converter.encode([ref]), [StreamRef]) + assert carried == ref + payload = (await converter.encode([standalone]))[0] + assert payload.metadata["encoding"] == b"json/plain" From 3019a5884f4c7eefcbd39915761b5782caab6eb5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:30:38 -0700 Subject: [PATCH 719/831] Let the client and activity accessors open refs and standalone streams. A StreamRef in place of the workflow id opens the stream it names on whatever provider the client carries, and its topic becomes the handle's default. A standalone stream is created with client.create_stream and reached by its stream_id. (cherry picked from commit 61a58f78b953b5c5fdeac575c1c3c64e9d099d5b) --- CHANGELOG.md | 8 +- temporalio/activity.py | 21 ++++- temporalio/client/_client.py | 101 ++++++++++++++++++++++--- temporalio/streams/_ref.py | 100 +++++++++++++++++++++++- tests/streams/test_activity_streams.py | 4 +- 5 files changed, 216 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bbd734e5..a1e7b5f40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,7 +44,13 @@ to include examples, links to docs, or any other relevant information. anywhere a client is held. A topic is a typed definition, `streams.topic("inputs", Token)`, shared by workflow, activity and client code; a plain string names a topic decided at runtime. The record on the wire - is `temporal.api.stream.v1.StreamRecord` on every provider. + is `temporal.api.stream.v1.StreamRecord` on every provider. A stream is + handed to another process as a `streams.StreamRef`, plain data naming the + owner and, when it has one, the topic, which `client.get_stream_handle(ref)` + and `activity.stream_handle(ref)` open; `client.create_stream(stream_id, ...)` + creates a standalone stream with a retention policy, and its handle's + `close()` seals it. A provider runs record bodies through the client's data + converter, so a payload codec and external storage apply to them. `temporalio.streams.providers.memory.MemoryStreams` is the in-memory reference provider the conformance tests run against. diff --git a/temporalio/activity.py b/temporalio/activity.py index 1e4928a37..b06e3c78a 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -34,6 +34,7 @@ from temporalio.converter._payload_converter import ( _TemporalTransferTypePayloadConverter, ) +from temporalio.streams._ref import open_ref from .types import CallableType @@ -302,13 +303,18 @@ def client() -> Client: def stream_handle( - workflow_id: str | None = None, + workflow_id: str | temporalio.streams.StreamRef | None = None, *, run_id: str | None = None, scope: Literal["workflow", "activity"] | None = None, ) -> temporalio.streams.StreamHandle: """Return a stream handle from the provider the worker was given. + A :py:class:`temporalio.streams.StreamRef` in place of ``workflow_id``, + such as one this activity received as an argument, opens the stream it + names, whatever owns it, and takes no other argument; the handle's calls + that name no topic then address a topic the ref names. + Which stream a call with no ``workflow_id`` reaches is decided by where the activity runs, never by what exists: @@ -336,7 +342,8 @@ def stream_handle( activities. Args: - workflow_id: Another workflow whose stream to address. + workflow_id: Another workflow whose stream to address, or a + :py:class:`temporalio.streams.StreamRef` naming the stream. run_id: The run of ``workflow_id`` to pin to. scope: ``"activity"`` for this activity's own streams, ``"workflow"`` for its workflow's. Without it the rule above @@ -354,8 +361,8 @@ def stream_handle( provider, or its provider cannot hold a stream an activity owns. Register one with ``Client.connect(plugins=[provider])`` or ``Worker(plugins=[provider])``. - ValueError: ``run_id`` was given without ``workflow_id``, or - ``scope="activity"`` with one. + ValueError: ``run_id`` was given without ``workflow_id``, + ``scope="activity"`` with one, or a ref with either. """ context = _Context.current() provider = context.stream_provider @@ -364,6 +371,12 @@ def stream_handle( "no stream provider is configured on this worker; register one with " "Client.connect(plugins=[provider]) or Worker(plugins=[provider])" ) + if isinstance(workflow_id, temporalio.streams.StreamRef): + if run_id is not None or scope is not None: + raise ValueError( + "a StreamRef names the stream in full, so it takes no run_id or scope" + ) + return open_ref(provider, client(), workflow_id) if workflow_id is not None: if scope == "activity": raise ValueError( diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index ad0bea575..01927bad5 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -41,6 +41,7 @@ ServiceClient, TLSConfig, ) +from temporalio.streams._ref import open_ref from ..common import HeaderCodecBehavior from ..types import ( @@ -909,40 +910,50 @@ def get_workflow_handle( def get_stream_handle( self, - workflow_id: str | None = None, + workflow_id: str | temporalio.streams.StreamRef | None = None, *, run_id: str | None = None, activity_id: str | None = None, + stream_id: str | None = None, ) -> temporalio.streams.StreamHandle: - """Get a handle on a workflow's or an activity's stream from the provider registered on this client. + """Get a handle on a stream from the provider registered on this client. Mirrors :py:meth:`get_workflow_handle`: without ``run_id`` the handle follows the workflow's execution chain across continue-as-new, with one it is pinned to that run. With ``activity_id`` the handle is on the streams that activity owns: a standalone activity's when ``workflow_id`` is left out, and ``run_id`` then pins the activity's - run, or an activity that ``workflow_id`` scheduled. The provider is - the one registered with ``plugins=[provider]`` at :py:meth:`connect`, - or passed as ``stream_provider``. A ``read`` starts at + run, or an activity that ``workflow_id`` scheduled. With + ``stream_id`` it is on a standalone stream, one with an id of its own + and no owner, which :py:meth:`create_stream` made; it takes no other + argument. A :py:class:`temporalio.streams.StreamRef` in place of + ``workflow_id`` opens the stream the ref names, whatever owns it, and + takes no other argument either; a topic the ref names is what the + handle's calls address when they name none. The provider is the one + registered with ``plugins=[provider]`` at :py:meth:`connect`, or + passed as ``stream_provider``. A ``read`` starts at :py:data:`temporalio.streams.BEGINNING`, at :py:data:`temporalio.streams.END` or at the last ``N`` records with ``last=N``, and resumes only after a cursor it was handed. See :py:mod:`temporalio.streams`. Args: - workflow_id: Workflow ID whose stream to get a handle to, or the - workflow that scheduled ``activity_id``. + workflow_id: Workflow ID whose stream to get a handle to, the + workflow that scheduled ``activity_id``, or a + :py:class:`temporalio.streams.StreamRef` naming the stream. run_id: Run ID to pin the handle to. activity_id: Activity ID whose own streams to get a handle to. + stream_id: ID of the standalone stream to get a handle to. Returns: The stream handle. Raises: - ValueError: Neither ``workflow_id`` nor ``activity_id`` was given. + ValueError: No owner was named, or a ref or ``stream_id`` was + given together with another argument. temporalio.streams.StreamUnsupportedError: No stream provider is registered on this client, or it cannot hold a stream an - activity owns. + activity owns or a stream without an owner. """ provider = self._config.get("stream_provider") if provider is None: @@ -950,14 +961,84 @@ def get_stream_handle( "no stream provider is registered on this client; connect with " "plugins=[provider]" ) + if isinstance(workflow_id, temporalio.streams.StreamRef): + if run_id is not None or activity_id is not None or stream_id is not None: + raise ValueError( + "a StreamRef names the stream in full, so it takes no run_id, " + "activity_id or stream_id" + ) + return open_ref(provider, self, workflow_id) + if stream_id is not None: + if workflow_id is not None or run_id is not None or activity_id is not None: + raise ValueError( + "stream_id names a standalone stream, which has no workflow_id, " + "run_id or activity_id" + ) + return provider.get_standalone_stream_handle(self, stream_id) if activity_id is not None: return provider.get_activity_stream_handle( self, activity_id, workflow_id=workflow_id, run_id=run_id ) if workflow_id is None: - raise ValueError("name the workflow_id or the activity_id to address") + raise ValueError( + "name the workflow_id, the activity_id or the stream_id to address" + ) return provider.get_stream_handle(self, workflow_id, run_id=run_id) + async def create_stream( + self, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> temporalio.streams.StreamHandle: + """Create a standalone stream and get a handle on it. + + A standalone stream has an id of its own and no owner, so it is + created here on purpose rather than by its first write, and it is + sealed on purpose with the handle's ``close()``, after which appends + are refused and the retained records stay readable. The three policy + arguments bound what it retains: records older than ``retention``, + beyond the newest ``max_records`` or past ``max_bytes`` of stored + records are dropped, and ``None`` leaves a bound to the provider's + default. Creating a stream that exists with the same policy returns a + handle on it, so a retried create is harmless. Another process + reaches the stream with ``get_stream_handle(stream_id=...)`` or with + the handle's ``ref()``. + + Args: + stream_id: ID of the stream to create. + retention: How long a record is kept. + max_records: How many of the newest records are kept. + max_bytes: How many bytes of records are kept. + + Returns: + A handle on the new or existing stream. + + Raises: + ValueError: ``stream_id`` is empty, a bound is not positive, or + the stream exists with a different policy. + temporalio.streams.StreamUnsupportedError: No stream provider is + registered on this client, or it cannot hold a stream without + an owner. + """ + provider = self._config.get("stream_provider") + if provider is None: + raise temporalio.streams.StreamUnsupportedError( + "no stream provider is registered on this client; connect with " + "plugins=[provider]" + ) + if not stream_id: + raise ValueError("stream_id must not be empty") + return await provider.create_standalone_stream( + self, + stream_id, + retention=retention, + max_records=max_records, + max_bytes=max_bytes, + ) + def get_workflow_handle_for( self, workflow: ( diff --git a/temporalio/streams/_ref.py b/temporalio/streams/_ref.py index 35b52ec49..33349e431 100644 --- a/temporalio/streams/_ref.py +++ b/temporalio/streams/_ref.py @@ -12,12 +12,22 @@ from __future__ import annotations import dataclasses +from collections.abc import AsyncGenerator from dataclasses import dataclass -from typing import Any, Literal +from typing import TYPE_CHECKING, Any, Literal +from temporalio.streams._record import BEGINNING, Cursor, StreamRecord from temporalio.streams._topic import StreamTopic, resolve_topic -__all__ = ["StreamOwnerKind", "StreamRef"] +if TYPE_CHECKING: + from temporalio.client import Client + from temporalio.streams._provider import ( + StreamHandle, + StreamProducer, + StreamProvider, + ) + +__all__ = ["StreamOwnerKind", "StreamRef", "open_ref"] StreamOwnerKind = Literal["workflow", "activity", "standalone"] """What owns a stream: a workflow, an activity, or the stream itself.""" @@ -140,3 +150,89 @@ def _name(topic: str | StreamTopic[Any] | None) -> str | None: return None name, _ = resolve_topic(topic) return name + + +def open_ref(provider: StreamProvider, client: Client, ref: StreamRef) -> StreamHandle: + """The handle ``ref`` names, on ``provider``. + + The ref's kind picks the provider call that opens the owner. A topic the + ref names becomes the handle's default, so a call that names none + addresses the stream the ref names; a ref that names the owner alone + leaves the topic to each call. A provider that cannot host that owner + kind raises :class:`temporalio.streams.StreamUnsupportedError` from the + call that would have opened it. + """ + if ref.kind == "workflow": + assert ref.workflow_id is not None + handle = provider.get_stream_handle(client, ref.workflow_id, run_id=ref.run_id) + elif ref.kind == "activity": + assert ref.activity_id is not None + handle = provider.get_activity_stream_handle( + client, ref.activity_id, workflow_id=ref.workflow_id, run_id=ref.run_id + ) + else: + assert ref.stream_id is not None + handle = provider.get_standalone_stream_handle(client, ref.stream_id) + return _RefHandle(handle, ref) + + +class _RefHandle: + """A provider's handle whose default topic is the one a ref names. + + Every call passes through unchanged when it names a topic; one that + names none gets the ref's, and is refused when the ref names none + either. The wrapper exists so a ref can address a stream without every + provider learning about refs. + """ + + def __init__(self, inner: StreamHandle, ref: StreamRef) -> None: + self._inner = inner + self._ref = ref + + def _topic(self, topic: str | StreamTopic[Any] | None) -> str | StreamTopic[Any]: + if topic is not None: + return topic + if self._ref.topic is None: + raise ValueError( + "this handle was opened from a ref that names no topic, so the call " + "has to name one" + ) + return self._ref.topic + + def read( + self, + *, + topic: str | StreamTopic[Any] | None = None, + after: Cursor = BEGINNING, + last: int | None = None, + result_type: type | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + # The protocol's overloads each take one shape of topic and + # result_type; a passthrough hands over whatever it was given. + inner: Any = self._inner + return inner.read( + topic=self._topic(topic), after=after, last=last, result_type=result_type + ) + + async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: + return await self._inner.latest(topic=self._topic(topic)) + + def producer( + self, + *, + topic: str | StreamTopic[Any] | None = None, + producer_id: str = "", + attempt: int = 0, + ) -> StreamProducer[Any]: + inner: Any = self._inner + return inner.producer( + topic=self._topic(topic), producer_id=producer_id, attempt=attempt + ) + + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + if topic is None: + return self._ref + return self._inner.ref(topic=topic) + + async def close(self) -> None: + await self._inner.close() diff --git a/tests/streams/test_activity_streams.py b/tests/streams/test_activity_streams.py index 8aa4a653a..bd0a675ac 100644 --- a/tests/streams/test_activity_streams.py +++ b/tests/streams/test_activity_streams.py @@ -257,5 +257,7 @@ async def test_a_standalone_activity_has_no_workflow_to_address(setup: ActivityS async def test_get_stream_handle_needs_an_owner(setup: ActivitySetup): - with pytest.raises(ValueError, match="workflow_id or the activity_id"): + with pytest.raises( + ValueError, match="workflow_id, the activity_id or the stream_id" + ): setup.client.get_stream_handle() From 4e20489e15af3701c2b0d055f18fbf97d22b179a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:42:04 -0700 Subject: [PATCH 720/831] Hosted standalone streams in the memory provider. A standalone stream lives in the provider with its policy and a sealed flag. The policy trims on append, a seal wakes parked readers so their reads end, and a stream id that was never created is refused at the call, so the conformance suite can run the standalone cases without a server. (cherry picked from commit a95c913161d5211baab19cd5d7fba594566061f8) --- temporalio/streams/providers/memory.py | 180 +++++++++++++++++++++---- 1 file changed, 152 insertions(+), 28 deletions(-) diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index c83893cbd..b8483ab43 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -23,8 +23,13 @@ waits for the workflow. - It keeps every record until :meth:`MemoryStreams.truncate` drops the oldest ones, which stands in for a store's retention in tests. -- It does not host standalone streams; both standalone calls raise - :class:`temporalio.streams.StreamUnsupportedError`. +- A standalone stream lives here with its policy and a sealed flag. + ``retention``, ``max_records`` and ``max_bytes`` are applied when a record + is appended, so a stream nobody writes to keeps records past their + retention. A read on it ends when it is sealed and the tail delivered, and + a read, ``latest`` or ``producer`` on a stream id that does not exist + raises :class:`temporalio.streams.StreamNotFoundError` at the call rather + than waiting for the stream to be created. - The outside path encodes and decodes bodies through the client's data converter, codec and external storage included, and fingerprints a retry over the converted bytes first. The workflow half has no client, so a @@ -41,7 +46,9 @@ import asyncio import logging +import time from collections.abc import AsyncGenerator +from dataclasses import dataclass from datetime import timedelta from typing import Any, Generic, TypeVar @@ -53,9 +60,10 @@ from temporalio.service import RPCError, RPCStatusCode from temporalio.streams._body import content_fingerprint, decode_body, encode_body from temporalio.streams._errors import ( + StreamClosedError, StreamCursorError, + StreamNotFoundError, StreamProducerError, - StreamUnsupportedError, ) from temporalio.streams._ids import topic_key from temporalio.streams._provider import ReadSource, WriteSink @@ -93,15 +101,45 @@ def _wake(future: asyncio.Future[None]) -> None: future.set_result(None) +@dataclass(frozen=True) +class _Policy: + """What a standalone stream retains, applied as records are appended.""" + + retention: timedelta | None = None + max_records: int | None = None + max_bytes: int | None = None + + def __post_init__(self) -> None: + if self.retention is not None and self.retention <= timedelta(0): + raise ValueError("retention must be positive") + if self.max_records is not None and self.max_records <= 0: + raise ValueError("max_records must be positive") + if self.max_bytes is not None and self.max_bytes <= 0: + raise ValueError("max_bytes must be positive") + + +class _Standalone: + """One standalone stream: its policy, its seal and its topics.""" + + def __init__(self, policy: _Policy) -> None: + self.policy = policy + self.sealed = False + self.topics: dict[str, _Topic] = {} + + class _Topic: """One topic's records, and the waiters parked on its tail.""" - def __init__(self) -> None: + def __init__(self, policy: _Policy | None = None, *, sealed: bool = False) -> None: + self.policy = policy + self.sealed = sealed # The retained records, the first of which sits at offset ``base``. # Offsets are never reused, so a cursor keeps naming the same record # after truncation drops the ones before it. self.base = 0 self.records: list[bytes] = [] + # When each retained record landed, for a retention policy. + self.stamps: list[float] = [] # Dedupe identity is (producer#attempt, first sequence of the append), # the same pair the storage providers use, mapped to where the batch # landed and a digest of what it held, so a repeat answers with the @@ -132,7 +170,10 @@ def append( Raises: StreamProducerError: ``(writer, sequence)`` is held with different content. + StreamClosedError: The stream was sealed. """ + if self.sealed: + raise StreamClosedError("the stream is closed and takes no more records") key = (writer or "", sequence) bodies = [wire.SerializeToString(deterministic=True) for wire in wires] if content is None: @@ -148,13 +189,43 @@ def append( ) return first, count first = self.head + now = time.time() self.records.extend(bodies) + self.stamps.extend([now] * len(bodies)) if writer is not None: self.seen[key] = (first, len(wires), content) + self._apply_policy(now) + self._wake_waiters() + return first, len(wires) + + def _wake_waiters(self) -> None: waiters, self._waiters = self._waiters, [] for loop, future in waiters: loop.call_soon_threadsafe(_wake, future) - return first, len(wires) + + def _apply_policy(self, now: float) -> None: + policy = self.policy + if policy is None: + return + drop = 0 + if policy.max_records is not None: + drop = max(drop, len(self.records) - policy.max_records) + if policy.max_bytes is not None: + held = sum(len(record) for record in self.records) + while drop < len(self.records) and held > policy.max_bytes: + held -= len(self.records[drop]) + drop += 1 + if policy.retention is not None: + floor = now - policy.retention.total_seconds() + while drop < len(self.records) and self.stamps[drop] < floor: + drop += 1 + if drop: + self._drop(drop) + + def seal(self) -> None: + """Take no more records, and let parked readers see the end.""" + self.sealed = True + self._wake_waiters() @property def head(self) -> int: @@ -167,9 +238,12 @@ def at(self, offset: int) -> bytes: def truncate(self, keep: int) -> None: """Drop all but the newest ``keep`` records.""" - drop = max(0, len(self.records) - keep) - self.base += drop - del self.records[:drop] + self._drop(max(0, len(self.records) - keep)) + + def _drop(self, count: int) -> None: + self.base += count + del self.records[:count] + del self.stamps[:count] async def wait_past(self, offset: int, timeout: float | None) -> None: """Wait until a record exists at ``offset``, or ``timeout`` passes.""" @@ -359,7 +433,8 @@ class MemoryStreamHandle: The owner is ``workflow_id``'s workflow, or with ``activity_id`` an activity: a standalone one without ``workflow_id``, or one that workflow - scheduled. + scheduled. With ``stream_id`` the handle is on a standalone stream, which + has no owner. """ def __init__( @@ -369,6 +444,7 @@ def __init__( workflow_id: str | None, run_id: str | None, activity_id: str | None = None, + stream_id: str | None = None, ) -> None: """Address the owner's topics in ``streams``.""" self._streams = streams @@ -376,6 +452,7 @@ def __init__( self._workflow_id = workflow_id self._run_id = run_id self._activity_id = activity_id + self._stream_id = stream_id self._seen_pending = False self._converter = ( client.data_converter @@ -391,10 +468,11 @@ def read( last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` from where the read starts until the workflow closes. + """Yield records on ``topic`` from where the read starts until the owner closes. ``END`` and ``last=`` are resolved by this call, against what the - topic holds when it is made. + topic holds when it is made. On a standalone stream the read ends + once the stream is sealed and the tail delivered. """ check_read_start(after, last) name, result_type = resolve_topic(topic, result_type) @@ -450,6 +528,8 @@ async def _read( ) def _store(self, topic: str) -> _Topic: + if self._stream_id is not None: + return self._streams._standalone_topic(self._stream_id, topic) if self._activity_id is not None: return self._streams._activity_topic( self._workflow_id, self._activity_id, topic @@ -458,6 +538,8 @@ def _store(self, topic: str) -> _Topic: return self._streams._topic(self._workflow_id, topic) async def _closed(self) -> bool: + if self._stream_id is not None: + return self._streams._standalone_stream(self._stream_id).sealed if self._client is None: return False try: @@ -518,6 +600,8 @@ def producer( def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: """A ref to ``topic`` of this owner's stream, pinned as this handle is.""" + if self._stream_id is not None: + return StreamRef.for_standalone(self._stream_id, topic=topic) if self._activity_id is not None: return StreamRef.for_activity( self._activity_id, @@ -531,11 +615,13 @@ def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: ) async def close(self) -> None: - """Refuse: a workflow's stream ends with the workflow, not by a caller.""" - raise ValueError( - "only a standalone stream can be closed; this handle is on a workflow's " - "stream, which ends when the workflow does" - ) + """Seal a standalone stream. An owned stream ends with its owner, not by a caller.""" + if self._stream_id is None: + raise ValueError( + "only a standalone stream can be closed; this handle is on an owned " + "stream, which ends when its workflow or activity does" + ) + self._streams._seal(self._stream_id) class MemoryStreams(ProviderPlugin): @@ -558,11 +644,13 @@ def __init__( self._poll = poll_interval self._topics: dict[str, _Topic] = {} self._activity_topics: dict[tuple[str | None, str, str], _Topic] = {} + self._standalone: dict[str, _Standalone] = {} def reset(self) -> None: - """Drop every topic. For tests.""" + """Drop every topic and every standalone stream. For tests.""" self._topics.clear() self._activity_topics.clear() + self._standalone.clear() def truncate(self, workflow_id: str, topic: str, *, keep: int) -> None: """Drop all but the newest ``keep`` records of a topic. For tests. @@ -612,26 +700,38 @@ async def create_standalone_stream( max_records: int | None = None, max_bytes: int | None = None, ) -> MemoryStreamHandle: - """Refuse: this provider keeps no stream without an owner. + """Create the standalone stream ``stream_id``, or find it with the same policy. + + The policy is applied on every append to any of the stream's topics. + ``client`` may be ``None``, as on the other handles. Raises: - StreamUnsupportedError: Always. + ValueError: ``stream_id`` is empty, a bound is not positive, or + the stream exists with a different policy. """ - raise StreamUnsupportedError( - "the memory provider does not host standalone streams" - ) + if not stream_id: + raise ValueError("stream_id must not be empty") + policy = _Policy(retention, max_records, max_bytes) + existing = self._standalone.get(stream_id) + if existing is None: + self._standalone[stream_id] = _Standalone(policy) + elif existing.policy != policy: + raise ValueError( + f"standalone stream {stream_id!r} exists with policy " + f"{existing.policy}, not {policy}" + ) + return MemoryStreamHandle(self, client, None, None, stream_id=stream_id) def get_standalone_stream_handle( self, client: Client | None, stream_id: str ) -> MemoryStreamHandle: - """Refuse: this provider keeps no stream without an owner. + """A handle on the standalone stream ``stream_id``. - Raises: - StreamUnsupportedError: Always. + Nothing is checked here: a ``read``, ``latest`` or ``producer`` on a + stream that was never created raises + :class:`temporalio.streams.StreamNotFoundError` at the call. """ - raise StreamUnsupportedError( - "the memory provider does not host standalone streams" - ) + return MemoryStreamHandle(self, client, None, None, stream_id=stream_id) async def close(self) -> None: """Nothing to release: the provider holds no connection.""" @@ -658,6 +758,30 @@ def _activity_topic( found = self._activity_topics[key] = _Topic() return found + def _standalone_stream(self, stream_id: str) -> _Standalone: + stream = self._standalone.get(stream_id) + if stream is None: + raise StreamNotFoundError( + f"standalone stream {stream_id!r} does not exist; create it with " + "client.create_stream" + ) + return stream + + def _standalone_topic(self, stream_id: str, topic: str) -> _Topic: + stream = self._standalone_stream(stream_id) + if not topic: + raise ValueError("topic must not be empty") + found = stream.topics.get(topic) + if found is None: + found = stream.topics[topic] = _Topic(stream.policy, sealed=stream.sealed) + return found + + def _seal(self, stream_id: str) -> None: + stream = self._standalone_stream(stream_id) + stream.sealed = True + for store in stream.topics.values(): + store.seal() + def _start(self, store: _Topic, after: Cursor, last: int | None) -> int: """The offset a read starts at, resolved against what ``store`` holds now.""" if last is not None: From 2b19d6eef5d2605f3b0b18ac23cf02857de355f3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:11:54 -0700 Subject: [PATCH 721/831] Took the server's word on a create of a standalone stream that exists. The server is answering ALREADY_EXISTS for an id that exists with the same policy and a STREAM_POLICY_MISMATCH refusal for one that differs, so the provider returns the handle on the first and lets the second arrive as the ValueError the contract names. The describe comparison stays for a server that answers both with a generic failure. --- temporalio/client_stream.py | 3 +++ temporalio/streams/providers/native.py | 10 ++++++++-- tests/test_client_stream_errors.py | 8 ++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 6b612dc3b..de0ed5c94 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -114,6 +114,9 @@ "STREAM_PRODUCER_STALE_SEQUENCE": StreamProducerError, "STREAM_CURSOR_BELOW_FLOOR": StreamCursorError, "STREAM_CLOSED": StreamClosedError, + # A create of an id that exists with another policy is the caller's + # mistake, which the interface contract spells as ValueError. + "STREAM_POLICY_MISMATCH": ValueError, } # The phrases a server built before the tokens existed sends for the same # refusals, so a reader of either server gets the typed error. The sealed diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 6904c7cae..5e6bd7f66 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -962,8 +962,14 @@ async def create_standalone_stream( try: await streams.create(stream_id, retention=retention, max_items=max_records) except RPCError as error: - # The server answers a create of an id that exists with a generic - # failure rather than ALREADY_EXISTS; describe tells the two apart. + # The server says ALREADY_EXISTS for an id that exists with this + # policy, and a policy that differs arrives typed as ValueError. An + # older server answers both with a generic failure, and describe + # tells the two apart. + if error.status == RPCStatusCode.ALREADY_EXISTS: + return NativeStandaloneStreamHandle( + client, stream_id, opened=self._opened + ) try: held = (await streams.get(stream_id).describe()).lifecycle except StreamNotFoundError: diff --git a/tests/test_client_stream_errors.py b/tests/test_client_stream_errors.py index d317ced1f..7b379f4c7 100644 --- a/tests/test_client_stream_errors.py +++ b/tests/test_client_stream_errors.py @@ -66,6 +66,14 @@ def test_an_append_on_a_sealed_stream_is_a_closed_error(details: str) -> None: assert str(error) == details +def test_a_create_with_another_policy_is_a_value_error() -> None: + error = translate_error( + grpc.StatusCode.FAILED_PRECONDITION, + "STREAM_POLICY_MISMATCH: stream exists keeping 10 records, asked for 5", + ) + assert type(error) is ValueError + + def test_not_found_is_a_not_found_error() -> None: error = translate_error(grpc.StatusCode.NOT_FOUND, "no stream with id 's'") assert isinstance(error, StreamNotFoundError) From 333e3f7cb75a3b8e0b2cfbf19d8fed507e91e4c8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 02:42:04 -0700 Subject: [PATCH 722/831] Tested refs, standalone streams and body encoding through the accessors. The conformance suite opens a ref, creates and seals a standalone stream and checks its retention policy on every provider that hosts one. The accessor tests carry a ref through a workflow argument and result and open it from the activity and the client. (cherry picked from commit 5287f6e53a6b5a512d3297ce39a6bcd7b70deba6) --- temporalio/activity.py | 18 ++ temporalio/client/_client.py | 20 ++ temporalio/streams/__init__.py | 3 +- temporalio/streams/_ref.py | 13 +- tests/streams/conftest.py | 5 + tests/streams/test_stream_accessors.py | 87 +++++++ tests/streams/test_streams_conformance.py | 285 +++++++++++++++------- 7 files changed, 333 insertions(+), 98 deletions(-) diff --git a/temporalio/activity.py b/temporalio/activity.py index b06e3c78a..c906c5f05 100644 --- a/temporalio/activity.py +++ b/temporalio/activity.py @@ -302,6 +302,24 @@ def client() -> Client: return client +@overload +def stream_handle( + workflow_id: temporalio.streams.StreamRef, + *, + run_id: str | None = None, + scope: Literal["workflow", "activity"] | None = None, +) -> temporalio.streams.RefHandle: ... + + +@overload +def stream_handle( + workflow_id: str | None = None, + *, + run_id: str | None = None, + scope: Literal["workflow", "activity"] | None = None, +) -> temporalio.streams.StreamHandle: ... + + def stream_handle( workflow_id: str | temporalio.streams.StreamRef | None = None, *, diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 01927bad5..568914cd3 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -908,6 +908,26 @@ def get_workflow_handle( result_type=result_type, ) + @overload + def get_stream_handle( + self, + workflow_id: temporalio.streams.StreamRef, + *, + run_id: str | None = None, + activity_id: str | None = None, + stream_id: str | None = None, + ) -> temporalio.streams.RefHandle: ... + + @overload + def get_stream_handle( + self, + workflow_id: str | None = None, + *, + run_id: str | None = None, + activity_id: str | None = None, + stream_id: str | None = None, + ) -> temporalio.streams.StreamHandle: ... + def get_stream_handle( self, workflow_id: str | temporalio.streams.StreamRef | None = None, diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index 1eda4e030..12a6576ed 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -120,7 +120,7 @@ StreamRecord, Supersession, ) -from temporalio.streams._ref import StreamOwnerKind, StreamRef +from temporalio.streams._ref import RefHandle, StreamOwnerKind, StreamRef from temporalio.streams._topic import StreamTopic, resolve_topic, topic __all__ = [ @@ -130,6 +130,7 @@ "Cursor", "ReadSource", "RecordKind", + "RefHandle", "StreamClosedError", "StreamCursorError", "StreamError", diff --git a/temporalio/streams/_ref.py b/temporalio/streams/_ref.py index 33349e431..586eeb4ae 100644 --- a/temporalio/streams/_ref.py +++ b/temporalio/streams/_ref.py @@ -27,7 +27,7 @@ StreamProvider, ) -__all__ = ["StreamOwnerKind", "StreamRef", "open_ref"] +__all__ = ["RefHandle", "StreamOwnerKind", "StreamRef", "open_ref"] StreamOwnerKind = Literal["workflow", "activity", "standalone"] """What owns a stream: a workflow, an activity, or the stream itself.""" @@ -152,7 +152,7 @@ def _name(topic: str | StreamTopic[Any] | None) -> str | None: return name -def open_ref(provider: StreamProvider, client: Client, ref: StreamRef) -> StreamHandle: +def open_ref(provider: StreamProvider, client: Client, ref: StreamRef) -> RefHandle: """The handle ``ref`` names, on ``provider``. The ref's kind picks the provider call that opens the owner. A topic the @@ -173,12 +173,17 @@ def open_ref(provider: StreamProvider, client: Client, ref: StreamRef) -> Stream else: assert ref.stream_id is not None handle = provider.get_standalone_stream_handle(client, ref.stream_id) - return _RefHandle(handle, ref) + return RefHandle(handle, ref) -class _RefHandle: +class RefHandle: """A provider's handle whose default topic is the one a ref names. + The handle :func:`open_ref`, :meth:`temporalio.client.Client.get_stream_handle` + and :func:`temporalio.activity.stream_handle` return for a + :class:`StreamRef`. It is a :class:`temporalio.streams.StreamHandle` whose + ``read``, ``latest`` and ``producer`` may leave the topic out. + Every call passes through unchanged when it names a topic; one that names none gets the ref's, and is refused when the ref names none either. The wrapper exists so a ref can address a stream without every diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 7be000f3b..d4dc1c010 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -10,3 +10,8 @@ def pytest_configure(config: pytest.Config) -> None: "markers", "truncates: the case needs a way to drop a topic's oldest records", ) + config.addinivalue_line( + "markers", + "hosts_standalone_streams: the case needs a stream with an id of its own and " + "no owner", + ) diff --git a/tests/streams/test_stream_accessors.py b/tests/streams/test_stream_accessors.py index fed963aa6..5717a995c 100644 --- a/tests/streams/test_stream_accessors.py +++ b/tests/streams/test_stream_accessors.py @@ -22,6 +22,8 @@ BEGINNING, END, RecordKind, + StreamClosedError, + StreamRef, StreamUnsupportedError, topic, ) @@ -147,3 +149,88 @@ async def first(records: Any) -> Any: at_end = stream.read(topic=INPUTS, after=END) await producer.append({"n": 4}) assert await asyncio.wait_for(first(at_end), 10) == {"n": 4} + + +NOTES = topic("notes", dict) + + +@activity.defn +async def append_to_ref(ref: StreamRef) -> str: + # The ref arrived as an argument and names the stream in full, so it + # takes no scope; the handle it opens writes to the ref's topic. + try: + activity.stream_handle(ref, scope="activity") + except ValueError as error: + refused = str(error) + else: + refused = "accepted" + await activity.stream_handle(ref).producer().append({"via": "activity"}) + return refused + + +@workflow.defn +class PublishToRef: + """Hands a stream ref to an activity and returns it, both as plain data.""" + + @workflow.run + async def run(self, ref: StreamRef) -> tuple[StreamRef, str]: + refused = await workflow.execute_activity( + append_to_ref, ref, start_to_close_timeout=timedelta(seconds=30) + ) + return ref, refused + + +async def test_a_ref_travels_as_data_and_opens_from_every_context( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + shared = await registered.create_stream(f"shared-{uuid.uuid4().hex}") + ref = shared.ref(topic=NOTES) + async with new_worker( + registered, PublishToRef, activities=[append_to_ref] + ) as worker: + returned, refused = await registered.execute_workflow( + PublishToRef.run, + ref, + id=f"streams-wf-{uuid.uuid4().hex}", + task_queue=worker.task_queue, + ) + # The workflow argument and result went through the data converter. + assert returned == ref + assert "takes no run_id or scope" in refused + # The activity wrote to the referenced topic, and the client reads it + # from the ref without naming the topic. Sealing the stream is what ends + # a full read of it. + await shared.close() + records = [ + (r.topic, r.value) async for r in registered.get_stream_handle(ref).read(last=1) + ] + assert records == [("notes", {"via": "activity"})] + with pytest.raises(ValueError, match="takes no run_id"): + registered.get_stream_handle(ref, run_id="r") + + +async def test_the_client_creates_reaches_and_closes_a_standalone_stream( + client: Client, provider: MemoryStreams +): + registered = _with_provider(client, provider) + stream_id = f"shared-{uuid.uuid4().hex}" + created = await registered.create_stream(stream_id, max_records=3) + producer = created.producer(topic=NOTES, producer_id="writer", attempt=1) + await producer.append({"n": 1}) + + reached = registered.get_stream_handle(stream_id=stream_id) + assert await reached.latest(topic=NOTES) != BEGINNING + await reached.close() + with pytest.raises(StreamClosedError): + await producer.append({"n": 2}) + assert [r.value async for r in reached.read(topic=NOTES)] == [{"n": 1}] + + with pytest.raises(ValueError, match="no workflow_id"): + registered.get_stream_handle(stream_id=stream_id, workflow_id="wf") + with pytest.raises(ValueError, match="empty"): + await registered.create_stream("") + with pytest.raises(StreamUnsupportedError, match="plugins="): + await client.create_stream(stream_id) + with pytest.raises(StreamUnsupportedError, match="plugins="): + client.get_stream_handle(stream_id=stream_id) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index cd3664a31..efc7f6861 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -31,6 +31,7 @@ import uuid from collections.abc import AsyncIterator, Awaitable, Callable, Sequence from dataclasses import dataclass +from datetime import timedelta from typing import Any import pytest @@ -52,17 +53,17 @@ END, Cursor, RecordKind, + StreamClosedError, StreamCursorError, StreamHandle, + StreamNotFoundError, StreamProducerError, StreamProvider, StreamRef, Supersession, - _ids, - _wire, topic, ) -from temporalio.streams._policy import AttemptTracker +from temporalio.streams._ref import RefHandle, open_ref from temporalio.streams.providers.memory import MemoryStreams # Defined once and shared by every case, the way an application shares them @@ -88,6 +89,11 @@ class ProviderCase: truncate: Callable[[str, str, int], Awaitable[None]] | None = None """Drops all but the newest records of a workflow's topic, standing in for retention, or ``None`` when the provider offers no way to.""" + hosts_standalone_streams: bool = True + """The store holds a stream with an id of its own and no owner.""" + waits_for_standalone_creation: bool = False + """A read on a standalone stream id that does not exist yet parks until + the first write instead of raising ``StreamNotFoundError``.""" async def open( self, @@ -113,6 +119,42 @@ async def open( run_id=run_id, ) + async def open_ref(self, ref: StreamRef) -> RefHandle: + if self.client is not None: + return self.client.get_stream_handle(ref) + return open_ref(self.provider, None, ref) # type: ignore[arg-type] + + async def create_stream( + self, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> StreamHandle: + if self.client is not None: + return await self.client.create_stream( + stream_id, + retention=retention, + max_records=max_records, + max_bytes=max_bytes, + ) + return await self.provider.create_standalone_stream( + None, # type: ignore[arg-type] + stream_id, + retention=retention, + max_records=max_records, + max_bytes=max_bytes, + ) + + async def open_standalone(self, stream_id: str) -> StreamHandle: + if self.client is not None: + return self.client.get_stream_handle(stream_id=stream_id) + return self.provider.get_standalone_stream_handle( + None, # type: ignore[arg-type] + stream_id, + ) + class RecordingDriver(StorageDriver): """An in-memory external storage driver that counts what it was asked to hold.""" @@ -190,6 +232,7 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, "truncates": lambda case: case.truncate is not None, + "hosts_standalone_streams": lambda case: case.hosts_standalone_streams, } @@ -223,96 +266,17 @@ async def _collect() -> None: return out -def test_record_roundtrips_through_the_wire(): - converter = DataConverter.default.payload_converter - wire = _wire.to_wire( - converter, - topic="decisions", - kind=RecordKind.DATA, - value={"n": 1}, - producer_id="model", - attempt=3, - sequence=7, - ) - parsed = _wire.WireRecord.FromString(wire.SerializeToString()) - record = _wire.from_wire(converter, Cursor("memory:0"), parsed, dict) - assert ( - record.kind, - record.topic, - record.producer_id, - record.attempt, - record.sequence, - record.value, - ) == (RecordKind.DATA, "decisions", "model", 3, 7, {"n": 1}) - assert record.supersession is None - finish = _wire.to_wire(converter, topic="decisions", kind=RecordKind.FINISH) - assert not finish.HasField("body") - assert _wire.from_wire(converter, Cursor("memory:1"), finish, dict).value is None - - -def test_a_stored_supersession_is_not_a_record(): - converter = DataConverter.default.payload_converter - wire = _wire.WireRecord(topic="t", kind=int(RecordKind.SUPERSEDED)) # type: ignore[arg-type] - with pytest.raises(ValueError, match="synthesized"): - _wire.from_wire(converter, Cursor("memory:0"), wire, None) - - -def test_an_unset_kind_is_read_as_data(): - converter = DataConverter.default.payload_converter - wire = _wire.WireRecord(topic="t", body=converter.to_payloads([{"n": 1}])[0]) - record = _wire.from_wire(converter, Cursor("memory:0"), wire, dict) - assert record.kind is RecordKind.DATA - assert record.value == {"n": 1} - - -def test_supersession_is_synthesized_from_observations(): - attempts = AttemptTracker() - assert attempts.note("model", 1, topic="t", previous=BEGINNING) is None - superseded = attempts.note("model", 2, topic="t", previous=Cursor("memory:0")) - assert superseded is not None - assert superseded.kind is RecordKind.SUPERSEDED - assert superseded.supersession == Supersession("model", 1, 2) - assert superseded.value is None - # Positioned before the triggering record, so a resume after it delivers - # that record next. - assert superseded.cursor == Cursor("memory:0") - # The same attempt again is not a new generation. - assert attempts.note("model", 2, topic="t", previous=Cursor("memory:1")) is None - - -def test_an_attempt_that_goes_backwards_is_said_rather_than_passed_off(): - # Attempts only rise on one producer, so a lower one means the store handed - # two generations back out of order. Yielded as data with no signal, a - # consumer renders the stale generation as the current answer. - said: list[str] = [] - attempts = AttemptTracker(said.append) - assert attempts.note("model", 2, topic="t", previous=BEGINNING) is None - assert attempts.note("model", 1, topic="t", previous=Cursor("memory:3")) is None - assert len(said) == 1 - assert "attempt 1" in said[0] and "behind attempt 2" in said[0] - assert "model" in said[0] - - -def test_a_repeat_of_the_current_attempt_is_not_worth_saying(): - said: list[str] = [] - attempts = AttemptTracker(said.append) - attempts.note("model", 1, topic="t", previous=BEGINNING) - assert attempts.note("model", 1, topic="t", previous=Cursor("memory:1")) is None - assert said == [] - - -def test_topic_keys_cannot_collide(): - # A colon in a workflow id must not make two addresses one key. - assert _ids.topic_key("a:b", "c") != _ids.topic_key("a", "b:c") - assert _ids.topic_key("a%3Ab", "c") != _ids.topic_key("a:b", "c") - assert _ids.topic_key("wf", "inputs") == "wf:inputs" - - -def test_cursors_name_their_provider(): - assert _wire.cursor_position(BEGINNING, provider="memory") is None - assert _wire.cursor_position(Cursor("memory:42"), provider="memory") == "42" - with pytest.raises(StreamCursorError): - _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") +async def drain(records: Any, timeout: float = 5.0) -> list: + """Every record until the read ends on its own.""" + + async def _collect() -> list: + return [record async for record in records] + + return await asyncio.wait_for(_collect(), timeout) + + +def new_stream_id() -> str: + return f"stream-{uuid.uuid4().hex}" async def test_append_read_roundtrip(case: ProviderCase): @@ -700,3 +664,138 @@ async def test_a_retry_through_a_nondeterministic_codec_still_deduplicates( await first.append({"id": "r2"}) records = await take(stream.read(topic=OUT), 2) assert [r.value for r in records] == [{"id": "r1"}, {"id": "r2"}] + + +async def test_a_ref_opens_the_stream_it_names(case: ProviderCase): + workflow_id = new_workflow_id() + stream = await case.open(workflow_id) + await stream.producer(topic=A, producer_id="model", attempt=1).append({"n": 1}) + ref = stream.ref(topic=A) + + # The receiver names no topic: the ref carried it, so every call on the + # handle it opened addresses topic ``a`` of that workflow. + opened = await case.open_ref(ref) + records = await take(opened.read(result_type=dict), 1) + assert [(r.topic, r.value) for r in records] == [("a", {"n": 1})] + assert await opened.latest() == records[0].cursor + assert opened.ref() == ref + await opened.producer(producer_id="tool", attempt=1).append({"n": 2}) + assert [r.value for r in await take(stream.read(topic=A), 2)] == [ + {"n": 1}, + {"n": 2}, + ] + # Naming a topic on the opened handle addresses that topic instead. + assert await opened.latest(topic=B) == BEGINNING + assert opened.ref(topic=B) == stream.ref(topic=B) + + +@pytest.mark.hosts_standalone_streams +async def test_a_standalone_stream_is_read_from_another_handle(case: ProviderCase): + stream_id = new_stream_id() + created = await case.create_stream(stream_id) + producer = created.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 1}, {"n": 2}) + + # Any process reaches the stream by its id, or by a ref the creator + # handed out; nothing about the stream depends on who created it. + other = await case.open_standalone(stream_id) + records = await take(other.read(topic=OUT), 2) + assert [r.value for r in records] == [{"n": 1}, {"n": 2}] + assert await other.latest(topic=OUT) == records[1].cursor + assert other.ref(topic=OUT) == StreamRef.for_standalone(stream_id, topic="out") + via_ref = await case.open_ref(created.ref(topic=OUT)) + assert [r.value for r in await take(via_ref.read(), 2)] == [{"n": 1}, {"n": 2}] + + +@pytest.mark.hosts_standalone_streams +async def test_a_missing_standalone_stream_is_not_found(case: ProviderCase): + if case.waits_for_standalone_creation: + pytest.skip( + f"the {case.name} provider waits for a standalone stream to be created" + ) + # get_stream_handle(stream_id=) creates nothing: the stream has to have + # been created on purpose, and a use before that says so. + stream = await case.open_standalone(new_stream_id()) + with pytest.raises(StreamNotFoundError): + await stream.latest(topic=OUT) + with pytest.raises(StreamNotFoundError): + await take(stream.read(topic=OUT), 1) + with pytest.raises(StreamNotFoundError): + await stream.producer(topic=OUT, producer_id="writer", attempt=1).append( + {"n": 1} + ) + + +@pytest.mark.hosts_standalone_streams +async def test_creating_a_standalone_stream_is_idempotent_for_one_policy( + case: ProviderCase, +): + stream_id = new_stream_id() + first = await case.create_stream(stream_id, max_records=10) + # The same id and policy again is the same stream, not an error, so a + # retried create is harmless. + again = await case.create_stream(stream_id, max_records=10) + await first.producer(topic=OUT, producer_id="writer", attempt=1).append({"n": 1}) + assert [r.value for r in await take(again.read(topic=OUT), 1)] == [{"n": 1}] + # A different policy on an existing id is a mistake, not a change. + with pytest.raises(ValueError): + await case.create_stream(stream_id, max_records=5) + for bad in (dict(max_records=0), dict(max_bytes=-1), dict(retention=timedelta(0))): + with pytest.raises(ValueError): + await case.create_stream(new_stream_id(), **bad) # type: ignore[arg-type] + + +@pytest.mark.hosts_standalone_streams +async def test_closing_a_standalone_stream_ends_reads_and_refuses_appends( + case: ProviderCase, +): + stream_id = new_stream_id() + stream = await case.create_stream(stream_id) + producer = stream.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 1}) + # A reader parked on the tail before the close has to learn of it. + other = await case.open_standalone(stream_id) + parked = asyncio.ensure_future(drain(other.read(topic=OUT), timeout=10)) + await asyncio.sleep(0.2) + await producer.append({"n": 2}) + + await stream.close() + assert [r.value for r in await parked] == [{"n": 1}, {"n": 2}] + # Sealed: the tail stays readable, and a read opened now ends by itself. + assert [r.value for r in await drain(stream.read(topic=OUT))] == [ + {"n": 1}, + {"n": 2}, + ] + with pytest.raises(StreamClosedError): + await producer.append({"n": 3}) + with pytest.raises(StreamClosedError): + await other.producer(topic=A, producer_id="late", attempt=1).append({"n": 3}) + # Closing again is not an error. + await stream.close() + + +@pytest.mark.hosts_standalone_streams +async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCase): + by_count = await case.create_stream(new_stream_id(), max_records=2) + producer = by_count.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + # BEGINNING is the oldest record still held, which the policy decided. + kept = await take(by_count.read(topic=OUT), 2) + assert [r.value for r in kept] == [{"n": 3}, {"n": 4}] + + by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) + producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) + for n in range(3): + await producer.append({"n": n, "blob": "x" * 500}) + kept = await take(by_bytes.read(topic=OUT), 1) + assert kept[0].value is not None and kept[0].value["n"] == 2 + + by_age = await case.create_stream( + new_stream_id(), retention=timedelta(milliseconds=200) + ) + producer = by_age.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": "old"}) + await asyncio.sleep(0.3) + await producer.append({"n": "new"}) + kept = await take(by_age.read(topic=OUT), 1) + assert [r.value for r in kept] == [{"n": "new"}] From f4e314dec4f4c4b16b22120e8f0ff97958317b2d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:17:49 -0700 Subject: [PATCH 723/831] Fitted the ported interface commits to this chain. This chain has no default topic, so a ref may name the owner alone and the handle opened from a ref is a public `RefHandle` whose calls may leave the topic out; the two accessors return it for a ref. The memory topic drops a parked waiter on cancellation, which the ported provider test checks, and the plugin-registry refusal test targets a registry this chain does not have. --- temporalio/streams/_ref.py | 6 ++++++ temporalio/streams/providers/memory.py | 4 ++++ tests/streams/conftest.py | 5 +++++ tests/streams/test_streams_conformance.py | 3 +++ tests/streams/test_streams_internals.py | 23 +++++++---------------- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/temporalio/streams/_ref.py b/temporalio/streams/_ref.py index 586eeb4ae..2b31b6c32 100644 --- a/temporalio/streams/_ref.py +++ b/temporalio/streams/_ref.py @@ -191,6 +191,7 @@ class RefHandle: """ def __init__(self, inner: StreamHandle, ref: StreamRef) -> None: + """Wrap ``inner``, the provider's handle on the owner ``ref`` names.""" self._inner = inner self._ref = ref @@ -212,6 +213,7 @@ def read( last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: + """Read ``topic``, or the ref's topic without one; see :meth:`StreamHandle.read`.""" # The protocol's overloads each take one shape of topic and # result_type; a passthrough hands over whatever it was given. inner: Any = self._inner @@ -220,6 +222,7 @@ def read( ) async def latest(self, *, topic: str | StreamTopic[Any] | None = None) -> Cursor: + """The newest cursor on ``topic``, or on the ref's topic without one.""" return await self._inner.latest(topic=self._topic(topic)) def producer( @@ -229,15 +232,18 @@ def producer( producer_id: str = "", attempt: int = 0, ) -> StreamProducer[Any]: + """A producer on ``topic``, or on the ref's topic without one.""" inner: Any = self._inner return inner.producer( topic=self._topic(topic), producer_id=producer_id, attempt=attempt ) def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """The ref this handle was opened from, or one to ``topic`` of the same owner.""" if topic is None: return self._ref return self._inner.ref(topic=topic) async def close(self) -> None: + """Seal the stream, as :meth:`StreamHandle.close` does.""" await self._inner.close() diff --git a/temporalio/streams/providers/memory.py b/temporalio/streams/providers/memory.py index b8483ab43..de6d2b43e 100644 --- a/temporalio/streams/providers/memory.py +++ b/temporalio/streams/providers/memory.py @@ -255,6 +255,10 @@ async def wait_past(self, offset: int, timeout: float | None) -> None: try: await asyncio.wait_for(future, timeout) except asyncio.TimeoutError: + pass + finally: + # Dropped on every exit, cancellation included, so a reader that + # aclose()s while parked here leaves nothing behind on the topic. self._waiters = [w for w in self._waiters if w[1] is not future] diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index d4dc1c010..f03dbc919 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -6,6 +6,11 @@ def pytest_configure(config: pytest.Config) -> None: "markers", "reports_positions: the case needs append() to return where records landed", ) + config.addinivalue_line( + "markers", + "detects_divergent_retries: the case needs append() to compare a repeat's " + "content with what the store holds", + ) config.addinivalue_line( "markers", "truncates: the case needs a way to drop a topic's oldest records", diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index efc7f6861..4dc09cd98 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -84,6 +84,8 @@ class ProviderCase: client: Client | None = None reports_positions: bool = True """``append()`` returns where the records landed.""" + detects_divergent_retries: bool = True + """``append()`` compares a repeat's content with what it already holds.""" host: Callable[[str], Awaitable[None]] | None = None """Starts the workflow that owns ``workflow_id``'s stream, when a store needs one.""" truncate: Callable[[str, str, int], Awaitable[None]] | None = None @@ -231,6 +233,7 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: _CAPABILITIES = { "reports_positions": lambda case: case.reports_positions, + "detects_divergent_retries": lambda case: case.detects_divergent_retries, "truncates": lambda case: case.truncate is not None, "hosts_standalone_streams": lambda case: case.hosts_standalone_streams, } diff --git a/tests/streams/test_streams_internals.py b/tests/streams/test_streams_internals.py index 8e3d09feb..8a6d60ecc 100644 --- a/tests/streams/test_streams_internals.py +++ b/tests/streams/test_streams_internals.py @@ -43,7 +43,6 @@ ) from temporalio.streams._policy import AttemptTracker from temporalio.streams.providers.memory import MemoryStreams -from temporalio.worker import ReplayerConfig, WorkerConfig def test_record_roundtrips_through_the_wire(): @@ -117,25 +116,16 @@ def test_cursors_name_their_provider(): _wire.cursor_position(Cursor("redis:1700000000000-0"), provider="memory") -def test_registering_a_provider_twice_is_refused(): - # There is one slot on each of the three, and a user who passes a provider - # by hand and a provider plugin, or two provider plugins, meant both. - first, second = MemoryStreams(), MemoryStreams() - with pytest.raises(ValueError, match="already registered"): - second.configure_client(ClientConfig(stream_provider=first)) # type: ignore[typeddict-item] - with pytest.raises(ValueError, match="already registered"): - second.configure_worker(WorkerConfig(stream_provider=first)) # type: ignore[typeddict-item] - with pytest.raises(ValueError, match="already registered"): - second.configure_replayer(ReplayerConfig(stream_provider=first)) # type: ignore[typeddict-item] - - def test_registering_the_same_provider_twice_is_fine(): # A worker built from a client that already carries the plugin configures # it again with the same object, which is not a conflict. provider = MemoryStreams() - config = provider.configure_client(ClientConfig(stream_provider=provider)) # type: ignore[typeddict-item] + config = provider.configure_client( + ClientConfig(stream_provider=provider) # type: ignore[typeddict-item] + ) assert config.get("stream_provider") is provider - assert provider.configure_client(ClientConfig()).get("stream_provider") is provider # type: ignore[typeddict-item] + registered = provider.configure_client(ClientConfig()) # type: ignore[typeddict-item] + assert registered.get("stream_provider") is provider # type: ignore[typeddict-item] class _HoldEverything(StorageDriver): @@ -255,7 +245,8 @@ async def test_a_stream_ref_names_one_owner_and_travels_as_json(): standalone = StreamRef.for_standalone("shared") assert workflow == StreamRef("workflow", "out", workflow_id="wf", run_id="r") assert activity.kind == "activity" and activity.activity_id == "act" - assert standalone == StreamRef("standalone", "output", stream_id="shared") + # Without a topic a ref names the owner alone on this chain. + assert standalone == StreamRef("standalone", None, stream_id="shared") assert standalone.with_topic("x").topic == "x" for bad in ( From 10d56a738771c254cedd64df01b8e5f90d3f8b6d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:38:34 -0700 Subject: [PATCH 724/831] Let a Redis reader start at the tail or at the newest N records. A workflow reader took the beginning or a cursor only. The tail is where the log is when the worker looks, which the workflow thread cannot see, so the transport records the request, the worker resolves it against the log after the task that opened the subscription and writes the entry into the marker beside it, and replay reads it from History. Outside, the tail is resolved on the generator's first step, as the retention check already is. --- .../external_workflow_streams/__init__.py | 2 + .../contrib/external_workflow_streams/_api.py | 14 +- .../external_workflow_streams/_backend.py | 17 ++ .../external_workflow_streams/_record.py | 22 ++ .../external_workflow_streams/_runtime.py | 95 +++++++- temporalio/streams/providers/redis.py | 226 ++++++++++++++++-- temporalio/worker/_workflow.py | 5 + .../external_workflow_streams/test_api.py | 6 +- .../test_registry.py | 1 + tests/streams/test_redis_replay.py | 105 ++++++++ tests/streams/test_streams_conformance.py | 16 +- 11 files changed, 475 insertions(+), 34 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/__init__.py b/temporalio/contrib/external_workflow_streams/__init__.py index 80acb17ae..a04387f21 100644 --- a/temporalio/contrib/external_workflow_streams/__init__.py +++ b/temporalio/contrib/external_workflow_streams/__init__.py @@ -100,6 +100,7 @@ Offset, OffsetComparator, RecordKind, + StartAtTail, StreamRecord, ) from temporalio.contrib.external_workflow_streams._wake import WakeRequest @@ -128,6 +129,7 @@ "ExternalStreamProducerTopic", "ExternalStreamSubscription", "ExternalStreamTopic", + "StartAtTail", "IdempotencyKey", "Offset", "OffsetComparator", diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index 1da059d80..f43210867 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -37,6 +37,7 @@ from temporalio.contrib.external_workflow_streams._record import ( Cursor, Offset, + StartAtTail, StreamRecord, ) from temporalio.types import AnyType @@ -97,6 +98,7 @@ def register( stream_key: StreamKey, idle_timeout: timedelta, start_cursor: Cursor | None = None, + start_at_tail: StartAtTail | None = None, ) -> None: """Registers a wait with the Worker's subscription manager. @@ -270,7 +272,10 @@ class ExternalStreamTopic(Generic[AnyType]): options: ExternalStreamOptions def subscribe( - self, *, start_cursor: Cursor | None = None + self, + *, + start_cursor: Cursor | None = None, + start_at_tail: StartAtTail | None = None, ) -> ExternalStreamSubscription[AnyType]: """Starts a new subscription and returns its async iterator. @@ -289,6 +294,11 @@ def subscribe( ``BEGINNING`` on a first execution. A boundary the Workflow names is recorded in the marker's header like the restored one, so it must be derived deterministically: replay names it again. + start_at_tail: Start at the stream's tail instead, or at its newest + ``last`` records. The Worker resolves the boundary against the + store after this Workflow Task and records it with the + subscription, so replay starts where the live run did rather + than asking the store again. Exclusive with ``start_cursor``. """ state = _run_state() if state.runtime is None: @@ -305,6 +315,8 @@ def subscribe( start: dict[str, Any] = ( {} if start_cursor is None else {"start_cursor": start_cursor} ) + if start_at_tail is not None: + start["start_at_tail"] = start_at_tail state.runtime.register( wait_id=wait_id, stream_key=stream_key, diff --git a/temporalio/contrib/external_workflow_streams/_backend.py b/temporalio/contrib/external_workflow_streams/_backend.py index ca7e1ecdd..1925bff06 100644 --- a/temporalio/contrib/external_workflow_streams/_backend.py +++ b/temporalio/contrib/external_workflow_streams/_backend.py @@ -273,6 +273,23 @@ def compare_offsets(self, left: Offset, right: Offset) -> int: inside a validation loop. """ + async def tail_cursor(self, key: StreamKey, *, before_last: int = 0) -> Cursor: + """The boundary the newest ``before_last`` records begin after. + + With ``before_last=0`` it is the boundary after the newest record, so a + read from it sees only what is appended after this call. ``BEGINNING`` + when the stream holds fewer records than asked for. Resolved on the + Worker, never on the Workflow thread, and recorded with the + subscription so replay reads it from the marker instead of asking + again. A provider that cannot answer leaves this as it is, and a + subscription that asks for a tail start fails when the Worker resolves + it. + """ + raise NotImplementedError( + f"{type(self).__name__} cannot resolve a start {before_last} records " + f"before the tail of {key}; subscribe with a cursor instead" + ) + # --- parking (P2b) ------------------------------------------------------ supports_leased_claims: ClassVar[bool] = False diff --git a/temporalio/contrib/external_workflow_streams/_record.py b/temporalio/contrib/external_workflow_streams/_record.py index 549c5c0b3..8b4d96b46 100644 --- a/temporalio/contrib/external_workflow_streams/_record.py +++ b/temporalio/contrib/external_workflow_streams/_record.py @@ -11,7 +11,29 @@ from dataclasses import dataclass, field from typing import Final, Protocol + +@dataclass(frozen=True) +class StartAtTail: + """A subscription start the Worker resolves against the store: the tail. + + ``last`` is how many of the newest records the read begins with; zero + means the boundary after the newest record, so the read sees only what + is appended after it was opened. The Workflow thread cannot ask the store + where the tail is, so the runtime records the request and the Worker + resolves it before the watcher starts, writing the boundary into the + marker beside the subscription as it does a cursor the Workflow named. + """ + + last: int = 0 + + def __post_init__(self) -> None: + """Refuse a negative count.""" + if self.last < 0: + raise ValueError(f"last must not be negative, got {self.last}") + + __all__ = [ + "StartAtTail", "AFTER", "BEGINNING", "Cursor", diff --git a/temporalio/contrib/external_workflow_streams/_runtime.py b/temporalio/contrib/external_workflow_streams/_runtime.py index e57b3aa91..29dbf6ad8 100644 --- a/temporalio/contrib/external_workflow_streams/_runtime.py +++ b/temporalio/contrib/external_workflow_streams/_runtime.py @@ -87,6 +87,7 @@ BEGINNING, Cursor, RecordKind, + StartAtTail, StreamRecord, ) from temporalio.contrib.external_workflow_streams._replay import ReplayPlan @@ -199,6 +200,14 @@ class _SubscriptionState: generation: int = 0 """Increments each time this wait re-enters the blocked state.""" + start_pending: bool = False + """The start is a tail the Worker has yet to resolve against the store. + + Until it does, the cursors hold ``BEGINNING`` as a placeholder, no watcher + runs, and the binding stays out of every header and bindings frame, so the + marker never records the placeholder as where this wait began. + """ + announced: bool = False """Whether the *current* annotation has carried this subscription's binding. @@ -290,6 +299,9 @@ def __init__( #: would give replay whatever the stream holds now (ADR-022). self._continuation = continuation self._subscriptions: dict[int, _SubscriptionState] = {} + #: Tail starts registered in the activation under way, resolved by the + #: Worker once it returns. See :meth:`resolve_pending_starts`. + self._pending_starts: dict[int, StartAtTail] = {} #: Where the *current* annotation begins, per wait. Captured when the #: annotation begins rather than when its header is first needed -- #: lazily reading the delivery cursor would let a record delivered @@ -599,7 +611,7 @@ def _reserve_bytes(self) -> int: late = { wait_id: self._binding(state) for wait_id, state in sorted(self._subscriptions.items()) - if not state.announced + if not state.announced and not state.start_pending } if late and self._accumulator is not None: # Only with an accumulator: without one the header is about to carry @@ -1129,13 +1141,16 @@ def register( stream_key: StreamKey, idle_timeout: timedelta | None = None, start_cursor: Cursor | None = None, + start_at_tail: StartAtTail | None = None, ) -> None: """Registers a wait with the Worker's manager. Non-blocking, no I/O. The start cursor defaults to what the predecessor Run committed for this ``wait_id``, so a chain resumes where it left off without the Workflow code saying anything about it -- and a first execution gets ``BEGINNING`` - from the same path. + from the same path. A ``start_at_tail`` is resolved by the Worker after + this activation and recorded with the subscription; on replay the + recorded boundary is taken from the marker and the store is not asked. Raises: ExternalStreamCapacityError: This subscription set cannot be recorded @@ -1156,7 +1171,20 @@ def register( "external streams are not configured on this Worker; pass " "external_stream_backend=... to the Worker" ) - if start_cursor is None: + if start_at_tail is not None and start_cursor is not None: + raise ValueError( + "a subscription starts at a cursor or at the tail, not at both" + ) + pending = False + if start_at_tail is not None: + recorded = (self._replay_bindings or {}).get(wait_id) + if recorded is not None: + # The live run resolved it and the marker carries the answer. + start_cursor = recorded.start_cursor + else: + pending = True + start_cursor = BEGINNING + elif start_cursor is None: start_cursor = self.restored_start(wait_id, stream_key.stream_name) if self._replay_bindings is not None: # A subscription made while a marker is being replayed -- which is @@ -1174,6 +1202,7 @@ def register( delivery_cursor=start_cursor, consumption_cursor=start_cursor, idle_timeout=idle_timeout or self._default_idle_timeout, + start_pending=pending, ) self._subscriptions[wait_id] = state # A subscription created part-way through an annotation begins at its @@ -1189,16 +1218,57 @@ def register( del self._annotation_start[wait_id] raise self._update_reserve() - self._manager.register( - run_id=self._run_id, - wait_id=wait_id, - stream_key=stream_key, - start_cursor=start_cursor, - ) + if pending: + assert start_at_tail is not None + self._pending_starts[wait_id] = start_at_tail + else: + self._manager.register( + run_id=self._run_id, + wait_id=wait_id, + stream_key=stream_key, + start_cursor=start_cursor, + ) # A registration alone is replay-visible: it is what puts the stream in # the annotation header, without which replay cannot start. self._observed_this_activation = True + async def resolve_pending_starts(self) -> None: + """Resolves every tail start the activation just finished registered. + + On the Worker's loop, between the activation and its completion. The + Workflow thread can do no I/O, and the boundary has to be fixed before + anything is delivered on the wait, so the marker records it beside the + subscription and replay reads it there instead of asking the store, + which by then holds something else. + """ + if not self._pending_starts: + return + backend = self._backend + if backend is None: + raise RuntimeError( + "external streams are not configured on this Worker; pass " + "external_stream_backend=... to the Worker" + ) + pending, self._pending_starts = self._pending_starts, {} + for wait_id, tail in pending.items(): + state = self._subscriptions.get(wait_id) + if state is None or not state.start_pending: + continue + cursor = await backend.tail_cursor(state.stream_key, before_last=tail.last) + state.start_cursor = cursor + state.delivery_cursor = cursor + state.consumption_cursor = cursor + state.start_pending = False + self._annotation_start[wait_id] = cursor + self._check_annotation_capacity(wait_id) + self._update_reserve() + self._manager.register( + run_id=self._run_id, + wait_id=wait_id, + stream_key=state.stream_key, + start_cursor=cursor, + ) + def drain(self, wait_id: int, max_records: int | None = None) -> list[StreamRecord]: """Pops buffered records. Performs no I/O and never blocks. @@ -2001,7 +2071,7 @@ def _announce_late_subscriptions(self) -> None: late = { wait_id: state for wait_id, state in sorted(self._subscriptions.items()) - if not state.announced + if not state.announced and not state.start_pending } if not late: return @@ -2028,11 +2098,13 @@ def _header(self) -> AnnotationHeader: wrong store for all the others. """ for state in self._subscriptions.values(): - state.announced = True + if not state.start_pending: + state.announced = True return AnnotationHeader( streams={ wait_id: self._binding(state) for wait_id, state in sorted(self._subscriptions.items()) + if not state.start_pending }, ) @@ -2047,6 +2119,7 @@ def _header_preview(self) -> AnnotationHeader: streams={ wait_id: self._binding(state) for wait_id, state in sorted(self._subscriptions.items()) + if not state.start_pending }, ) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 2461fa9f8..ba0b92807 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -47,7 +47,13 @@ - Cursors are ``redis:-`` and name an entry of the topic's log, so a cursor a workflow reader returned seeds an outside read and the other way round. A reader opened without a cursor starts where the chain's - predecessor run committed, which is the transport's own rule. + predecessor run committed, which is the transport's own rule. ``END`` and + ``last=N`` are positioned against the log when the read starts: outside, + on the first step of the generator, since the call itself cannot reach the + store; inside a workflow, by the worker right after the Workflow Task that + opened the subscription, which records the entry it resolved in the marker + beside the subscription, so replay and a cold start read it from History + and never ask the log again. - A workflow's streams are keyed by the chain's first run, so a handle follows continue-as-new by construction and ``run_id`` only decides whose close ends a read. @@ -105,7 +111,7 @@ import logging import re import time -from collections.abc import AsyncGenerator, Coroutine, Sequence +from collections.abc import AsyncGenerator, Awaitable, Callable, Coroutine, Sequence from dataclasses import dataclass, replace from datetime import timedelta from typing import Any, Final, Generic, TypeVar @@ -122,6 +128,7 @@ ChainKeyMismatchError, ExternalStreamProducer, Offset, + StartAtTail, StreamDirection, WakeNotAcknowledgedError, WorkflowChainKey, @@ -152,6 +159,7 @@ OutputStageManifest, OutputStageNotFoundError, OutputStageResolutionError, + OutputStageStatus, StagedOutputRecord, ) from temporalio.contrib.external_workflow_streams._output_client import ( @@ -176,9 +184,18 @@ StreamError, StreamNotFoundError, StreamProducerError, + StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink -from temporalio.streams._record import BEGINNING, Cursor, RecordKind, StreamRecord +from temporalio.streams._record import ( + BEGINNING, + END, + Cursor, + RecordKind, + StreamRecord, + check_read_start, +) +from temporalio.streams._ref import StreamRef from temporalio.streams._topic import StreamTopic, resolve_topic from temporalio.streams._wire import ( RecordDecoder, @@ -259,6 +276,45 @@ def _entry_id(token: str | bytes) -> tuple[int, int]: return int(ms), int(seq or 0) +#: Given one page of log entries, newest first, the ids of the ones that are +#: not records to the reader asking. +_SkipIn = Callable[[list[Any]], Awaitable[set[str]]] + + +async def _tail_after( + store: Any, name: str, before_last: int, *, skip_in: _SkipIn | None = None +) -> Offset | None: + """The entry the newest ``before_last`` records of the log ``name`` come after. + + ``None`` when the log holds no more than ``before_last`` records, which + means a read from the beginning. With ``before_last=0`` it is the newest + record itself, the boundary a read at ``END`` starts after. Walks the log + from its newest entry, leaving out what ``skip_in`` names. + """ + needed = before_last + 1 + end = "+" + seen = 0 + while True: + page: Any = await store.xrevrange(name, end, "-", count=max(needed - seen, 16)) + if not page: + return None + skipped = await skip_in(page) if skip_in is not None else set() + for entry_id, _fields in page: + token = _text(entry_id) + if token in skipped: + continue + seen += 1 + if seen == needed: + return Offset(token) + ms, seq = _entry_id(page[-1][0]) + if seq: + end = f"{ms}-{seq - 1}" + elif ms: + end = f"{ms - 1}-18446744073709551615" + else: + return None + + def _trim_floor(backend: Any) -> str: retention = getattr(backend, "_retention", None) if retention is None: @@ -586,6 +642,52 @@ async def read_range( if key.direction is StreamDirection.OUTPUT or not _is_staged(fields) ] + async def tail_cursor(self, key: StreamKey, *, before_last: int = 0) -> Any: + """The boundary the newest ``before_last`` records begin after. + + Through an input key the workflow's own staged entries are not + records, as on every read the transport makes; through an output key + only an aborted batch's entries are left out, since a pending one may + still commit. + """ + name = self.stream_key(key) + skip_in = ( + self._staged_in + if key.direction is StreamDirection.INPUT + else self._aborted_in(key) + ) + after = await _tail_after(self._client, name, before_last, skip_in=skip_in) + return TRANSPORT_BEGINNING if after is None else AFTER(after) + + @staticmethod + async def _staged_in(page: list[Any]) -> set[str]: + return {_text(entry_id) for entry_id, fields in page if _is_staged(fields)} + + def _aborted_in(self, key: StreamKey) -> _SkipIn: + async def aborted(page: list[Any]) -> set[str]: + staged = { + _text(entry_id): _text(fields[_STAGE_FIELD]) + for entry_id, fields in page + if _is_staged(fields) + } + if not staged: + return set() + stage_ids = sorted(set(staged.values())) + statuses = dict( + zip( + stage_ids, + await self._client.hmget(self._output_status_key(key), stage_ids), + ) + ) + return { + entry_id + for entry_id, stage_id in staged.items() + if _text(statuses.get(stage_id) or "") + == OutputStageStatus.ABORTED.value + } + + return aborted + async def retains(self, key: StreamKey, offset: Offset) -> bool: """Whether the record at ``offset`` survived trimming.""" return await _retained(self._client, self.stream_key(key), offset) @@ -669,16 +771,23 @@ class _RedisWorkflowProvider: def __init__(self, idle_timeout: timedelta) -> None: self._input = external_stream.with_options(idle_timeout=idle_timeout) - def open_reader(self, topic: str, *, after: Cursor) -> ReadSource: + def open_reader( + self, topic: str, *, after: Cursor, last: int | None = None + ) -> ReadSource: _require_topic(topic) + check_read_start(after, last) + subscribe = self._input.topic(topic, type=bytes).subscribe + if last is not None or after == END: + # The tail is where the log is when the worker looks, which the + # workflow thread cannot see: the transport has the worker resolve + # it after this task and record the entry with the subscription. + return _RedisReadSource(subscribe(start_at_tail=StartAtTail(last or 0))) position = _position(after) # Without a position the transport resumes where the chain's # predecessor run committed; with one, that is where the wait starts # and what the marker's header records. start = None if position is None else AFTER(position) - return _RedisReadSource( - self._input.topic(topic, type=bytes).subscribe(start_cursor=start) - ) + return _RedisReadSource(subscribe(start_cursor=start)) def open_writer(self, topic: str) -> WriteSink: _require_topic(topic) @@ -1026,13 +1135,15 @@ def read( *, topic: str | StreamTopic[Any], after: Cursor = BEGINNING, + last: int | None = None, result_type: type | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - """Yield records on ``topic`` after ``after`` until the owner closes. + """Yield records on ``topic`` from where the read starts until the owner closes. For a workflow that is the chain, or the pinned run; for an activity it is the activity reaching a terminal status, learned as the module docstring - says. + says. ``END`` and ``last=`` are positioned against the log on the first + step of the generator, since this call cannot reach the store. Two refusals and they do not land together. A cursor another provider minted, or one that is not a Redis entry id, is refused by this call: reading the @@ -1042,16 +1153,21 @@ def read( first. Raises: + ValueError: ``last`` is not positive or came with a cursor. StreamCursorError: The cursor is another provider's, or does not name a Redis entry. """ + check_read_start(after, last) topic, result_type = resolve_topic(topic, result_type) - # Parsed here so a foreign cursor fails this call, not the first - # iteration of the generator. - position = _position(after) + # A tail start is resolved in the generator; a cursor is parsed here so + # a foreign one fails this call, not the first iteration. + tail = last if last is not None else (0 if after == END else None) + position = None if tail is not None else _position(after) if self._owner is not None: - return self._read_owned(self._owner, topic, position, after, result_type) - return self._read(topic, position, after, result_type) + return self._read_owned( + self._owner, topic, position, after, result_type, tail=tail + ) + return self._read(topic, position, after, result_type, tail=tail) async def _read_owned( self, @@ -1060,16 +1176,25 @@ async def _read_owned( position: Offset | None, after: Cursor, result_type: type | None, + *, + tail: int | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - decoder = RecordDecoder( - self._converter, result_type, after=after, warn=logger.warning - ) backend = self._streams._require_backend() # Described on every read, so a handle without a run reads the run that # is current when the read starts, and ends with it. owner = await _resolve_owner(self._client, owner) store = backend._client name = owner.key(_prefix(backend), topic) + if tail is not None: + position = await _tail_after(store, name, tail) + after = ( + BEGINNING + if position is None + else mint_cursor(_PROVIDER, position.token) + ) + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) if ( position is not None and isinstance(backend, _TopicLogBackend) @@ -1154,14 +1279,24 @@ async def _read( position: Offset | None, after: Cursor, result_type: type | None, + *, + tail: int | None = None, ) -> AsyncGenerator[StreamRecord[Any], None]: - decoder = RecordDecoder( - self._converter, result_type, after=after, warn=logger.warning - ) backend = self._streams._require_backend() assert self._workflow_id is not None chain = await _chain(self._client, self._workflow_id) key = chain.stream_key(topic, direction=StreamDirection.OUTPUT) + if tail is not None: + resolved = await backend.tail_cursor(key, before_last=tail) + position = None if resolved.is_beginning else resolved.offset + after = ( + BEGINNING + if position is None + else mint_cursor(_PROVIDER, position.token) + ) + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) if ( position is not None and isinstance(backend, _TopicLogBackend) @@ -1291,6 +1426,27 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: assert tail.offset is not None return mint_cursor(_PROVIDER, tail.offset.token) + def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: + """A ref to ``topic`` of this owner's stream, pinned as this handle is.""" + if self._owner is not None: + return StreamRef.for_activity( + self._owner.activity_id, + workflow_id=self._owner.workflow_id, + run_id=self._owner.run_id, + topic=topic, + ) + assert self._workflow_id is not None + return StreamRef.for_workflow( + self._workflow_id, run_id=self._run_id, topic=topic + ) + + async def close(self) -> None: + """Refuse: an owned stream ends with its owner, not by a caller.""" + raise ValueError( + "only a standalone stream can be closed; this handle is on an owned " + "stream, which ends when its workflow or activity does" + ) + def producer( self, *, @@ -1445,6 +1601,36 @@ def get_activity_stream_handle( """ return RedisStreamHandle(self, client, workflow_id, run_id, activity_id) + async def create_standalone_stream( + self, + client: Client, + stream_id: str, + *, + retention: timedelta | None = None, + max_records: int | None = None, + max_bytes: int | None = None, + ) -> RedisStreamHandle: + """Refuse: this provider keeps no stream without an owner. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the redis provider does not host standalone streams" + ) + + def get_standalone_stream_handle( + self, client: Client, stream_id: str + ) -> RedisStreamHandle: + """Refuse: this provider keeps no stream without an owner. + + Raises: + StreamUnsupportedError: Always. + """ + raise StreamUnsupportedError( + "the redis provider does not host standalone streams" + ) + async def close(self) -> None: """Release the Redis connection this provider opened; a caller's stays open.""" self._backend = None diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index d646ebdac..66f511845 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -637,6 +637,11 @@ async def _handle_activation( raise deadlock_exc from None output_runtime = self._external_stream_runtimes.get(act.run_id) + if output_runtime is not None and completion.HasField("successful"): + # A subscription opened at a stream's tail is positioned here, + # off the Workflow thread and before the completion goes out, so + # the marker records the boundary the watcher starts from. + await output_runtime.resolve_pending_starts() if ( output_runtime is not None and completion.HasField("successful") diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 18095c310..0f969fd2c 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -76,10 +76,14 @@ def register( stream_key: StreamKey, idle_timeout: timedelta, start_cursor: Cursor | None = None, + start_at_tail: Any = None, ) -> None: self.registrations.append((wait_id, stream_key)) self.idle_timeouts[wait_id] = idle_timeout - self.start_cursors[wait_id] = start_cursor + # A tail start stands in for the cursor the Worker would resolve. + self.start_cursors[wait_id] = ( + start_cursor if start_at_tail is None else start_at_tail + ) def drain(self, wait_id: int, max_records: int | None = None) -> list[StreamRecord]: buffered = self.buffers.get(wait_id, []) diff --git a/tests/contrib/external_workflow_streams/test_registry.py b/tests/contrib/external_workflow_streams/test_registry.py index c368be89c..d18d658b4 100644 --- a/tests/contrib/external_workflow_streams/test_registry.py +++ b/tests/contrib/external_workflow_streams/test_registry.py @@ -104,6 +104,7 @@ def test_supported_entry_points_are_public() -> None: "PrecedingWriteFailedError", "RecordKind", "RedisStreamBackend", + "StartAtTail", "StreamBackend", "StreamDecodeError", "StreamError", diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index bac0ef3b7..26543701f 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -36,6 +36,7 @@ from temporalio.converter import WorkflowSerializationContext from temporalio.streams import ( BEGINNING, + END, Cursor, RecordKind, StreamCursorError, @@ -1054,3 +1055,107 @@ async def test_a_workflow_does_not_read_its_own_records_from_the_shared_log( await Replayer(workflows=[EchoOnOneTopic], plugins=[provider]).replay_workflow( await handle.fetch_history() ) + + +@workflow.defn +class NewestTwoOnGo: + """Opens ``inputs`` at its newest two records once told to, and returns them.""" + + def __init__(self) -> None: + self._go = False + + @workflow.signal + def go(self) -> None: + self._go = True + + @workflow.run + async def run(self) -> list[Any]: + await workflow.wait_condition(lambda: self._go) + reader = workflow.stream_reader(INPUTS, last=2) + values: list[Any] = [] + async for value in reader.values(): + values.append(value["n"]) + if len(values) == 2: + reader.close() + return values + + +@workflow.defn +class FromNowOnGo: + """Opens ``inputs`` at its end once told to, and returns the first value.""" + + def __init__(self) -> None: + self._go = False + + @workflow.signal + def go(self) -> None: + self._go = True + + @workflow.run + async def run(self) -> Any: + await workflow.wait_condition(lambda: self._go) + reader = workflow.stream_reader(INPUTS, after=END) + async for value in reader.values(): + reader.close() + return value["n"] + return None + + +async def test_a_workflow_reader_starts_at_the_last_n_records_and_replays_there( + live_client: Client, provider: RedisStreams +): + # The worker positions the subscription against the log after the task that + # opened it and records the entry with it; replay takes the entry from + # History, so what lands in the log later does not move the start. The + # producer needs the run to exist, so the reader opens on a signal. + workflow_id = f"streams-redis-last-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[NewestTwoOnGo], + plugins=[provider], + ): + handle = await live_client.start_workflow( + NewestTwoOnGo.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": 1}, {"n": 2}, {"n": 3}, {"n": 4}) + await handle.signal(NewestTwoOnGo.go) + assert await asyncio.wait_for(handle.result(), 60) == [3, 4] + history = await handle.fetch_history() + await producer.append({"n": 5}, {"n": 6}) + # Offline, with two more records in the log than the run ever saw. + await Replayer(workflows=[NewestTwoOnGo], plugins=[provider]).replay_workflow( + history + ) + + +async def test_a_workflow_reader_at_end_skips_what_was_there_and_replays( + live_client: Client, provider: RedisStreams +): + workflow_id = f"streams-redis-end-{uuid.uuid4().hex}" + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[FromNowOnGo], + plugins=[provider], + ): + handle = await live_client.start_workflow( + FromNowOnGo.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="tool", attempt=1) + await producer.append({"n": "old"}) + await handle.signal(FromNowOnGo.go) + result = asyncio.ensure_future(handle.result()) + # The subscription is positioned when the worker gets to it, which the + # test does not observe, so appends keep coming until the run takes one. + for _ in range(150): + await producer.append({"n": "new"}) + done, _ = await asyncio.wait({result}, timeout=0.2) + if done: + break + assert await asyncio.wait_for(result, 60) == "new" + history = await handle.fetch_history() + await Replayer(workflows=[FromNowOnGo], plugins=[provider]).replay_workflow(history) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 67ef81fbf..cd42ae0ca 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -274,7 +274,21 @@ async def host(workflow_id: str) -> None: StreamHost.run, id=workflow_id, task_queue=worker.task_queue ) - yield ProviderCase("redis", provider, client, host=host) + yield ProviderCase( + "redis", + provider, + client, + host=host, + # The refusal of a trimmed cursor lands on the first step on this + # provider, where the case wants it at the call; its own live module + # covers the trimmed floor. + truncate=None, + # Matched by encoded bytes for now, so a retry through a codec that + # differs on every call is not recognized; standalone streams are + # not hosted yet. + detects_divergent_retries=False, + hosts_standalone_streams=False, + ) for handle in hosts.values(): await handle.terminate() await provider.close() From 5a22233ab68ea9abff4d8c370e91a9713f0fec77 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:49:10 -0700 Subject: [PATCH 725/831] Hosted standalone streams on Redis and matched retries by the plaintext hash. A stream with an id and no owner gets its own key scheme: a hash for the policy and the seal, a log per topic, and an append script that reads the policy, refuses a sealed stream and trims by count, age and a per-topic byte total. Every record now carries the hash of its converted body and the append scripts compare that hash, so a retry through a codec that differs on every call still matches. --- temporalio/streams/providers/redis.py | 475 +++++++++++++++++++--- tests/streams/test_redis_provider.py | 14 + tests/streams/test_streams_conformance.py | 5 - 3 files changed, 435 insertions(+), 59 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index ba0b92807..b40199db0 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -92,6 +92,24 @@ so a long-lived consumer continues as new inside the window, or is configured with a longer one. +- Every record carries the SHA-256 of its converted body under + ``temporal.io/content-hash``, stamped before the payload codec runs, and the + append script compares that hash rather than the stored bytes, so a retry + through a codec that differs on every call is still the same append while a + divergent one is refused. A record without a body is matched by its + plaintext record instead. +- A standalone stream is one more key scheme: ``standalone/`` as the + owner component, a hash under it that holds the policy and the seal, and one + log per topic beside the hash. ``create_stream`` writes the hash once and + refuses a different policy for an id that has one; a handle on an id with no + hash raises ``StreamNotFoundError`` at its first use. Every append applies + the policy to the topic it wrote, ``max_records`` and ``retention`` as on the + other logs and ``max_bytes`` by a byte total the hash keeps per topic, + dropping the oldest entries until the topic fits. ``close()`` sets the seal: + a later append is refused with ``StreamClosedError``, the retained records + stay readable and a read ends once it has delivered them. Nothing in + Temporal knows these keys, so no tooling lists them. + Keys written by the earlier layout. Before the log, a topic was two keys: the transport's input key, ``::::`` with every id percent-encoded, and its output key, the same with an ``output`` @@ -108,6 +126,7 @@ from __future__ import annotations import asyncio +import hashlib import logging import re import time @@ -120,6 +139,7 @@ from google.protobuf.message import DecodeError from temporalio import workflow +from temporalio.api.common.v1 import Payload from temporalio.client import ActivityExecutionStatus, Client, WorkflowExecutionStatus from temporalio.contrib.external_workflow_streams import ( AFTER, @@ -169,7 +189,6 @@ _BEGINNING_SENTINEL, _OUTPUT_STAGE_FIELD, RedisStreamBackend, - _content_hash, _text, _to_record, ) @@ -179,12 +198,13 @@ WorkflowSerializationContext, ) from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._body import CONTENT_HASH_KEY, content_hash from temporalio.streams._errors import ( + StreamClosedError, StreamCursorError, StreamError, StreamNotFoundError, StreamProducerError, - StreamUnsupportedError, ) from temporalio.streams._provider import ReadSource, WriteSink from temporalio.streams._record import ( @@ -330,28 +350,58 @@ def _trim_maxlen(backend: Any) -> str: return "" if max_len is None else str(max_len) -def _append_args(backend: Any, record: TransportRecord) -> list[Any]: - """What the append script takes: the trims, the record's identity, its fields.""" - args: list[Any] = [ - _trim_floor(backend).encode(), - _trim_maxlen(backend).encode(), - str(record.idempotency_key).encode(), - _content_hash(record).encode(), - ] +def _fields_args(record: TransportRecord) -> list[Any]: + """The record's stored fields, name then value, as the append scripts take them.""" + args: list[Any] = [] for name, value in sorted(record.to_fields().items()): args.append(name.encode()) args.append(value) return args +def _append_args(backend: Any, record: TransportRecord, digest: str) -> list[Any]: + """What the log append script takes: the trims, the identity and digest, the fields. + + ``digest`` is the plaintext hash of what the record carries, taken before + the payload codec ran, so a retry the codec encoded differently is still + recognized as the same append. + """ + return [ + _trim_floor(backend).encode(), + _trim_maxlen(backend).encode(), + str(record.idempotency_key).encode(), + digest.encode(), + *_fields_args(record), + ] + + +def _plaintext_digest(wire: WireRecord) -> str: + """The digest an append is matched by: the body's hash, or the record's without one.""" + if wire.HasField("body"): + return content_hash(wire.body) + return hashlib.sha256(wire.SerializeToString(deterministic=True)).hexdigest() + + +def _stamp_hash(wire: WireRecord) -> None: + """Put the body's plaintext hash on ``wire`` under the shared metadata key.""" + if wire.HasField("body"): + wire.metadata[CONTENT_HASH_KEY].CopyFrom( + Payload( + metadata={"encoding": b"binary/plain"}, + data=content_hash(wire.body).encode(), + ) + ) + + #: Append one record to a log, or answer where it already is. #: #: The provider's own write rather than the transport's, so the retention trims #: ride along instead of costing their own round trips; they are exact for the #: reason the backend's own trims are. The idempotency hash is read before the -#: log is touched, so an identity already used with different bytes refuses the -#: record rather than writing it, and one used with the same bytes answers with -#: the original position, which is what settles a call whose answer was lost. +#: log is touched, so an identity already used with a different plaintext digest +#: refuses the record rather than writing it, and one used with the same digest +#: answers with the original position, which is what settles a call whose answer +#: was lost. _LOG_APPEND_LUA: Final = """ local minid = ARGV[1] local maxlen = ARGV[2] @@ -383,20 +433,176 @@ def __init__(self, backend: RedisStreamBackend) -> None: self._backend = backend self._script = backend._client.register_script(_LOG_APPEND_LUA) - async def write(self, *, name: str, record: TransportRecord) -> Offset: + async def write(self, *, name: str, record: TransportRecord, digest: str) -> Offset: """Append ``record`` to the log ``name`` and return where it landed. - A repeat of the same ``(session, sequence)`` with the same bytes returns - the original position and writes nothing. + A repeat of the same ``(session, sequence)`` with the same ``digest`` + returns the original position and writes nothing. """ outcome, placed = await self._script( - keys=[name, f"{name}:idem"], args=_append_args(self._backend, record) + keys=[name, f"{name}:idem"], + args=_append_args(self._backend, record, digest), ) if _text(outcome) == "conflict": raise AppendConflictError(record.idempotency_key) return Offset(_text(placed)) +@dataclass(frozen=True) +class _StandaloneOwner: + """A stream with an id of its own and no owner, and where Redis keeps it.""" + + namespace: str + stream_id: str + + def meta(self, key_prefix: str) -> str: + """The hash holding the stream's policy, seal and byte totals.""" + namespace = quote(self.namespace, safe="") + return f"{key_prefix}:{namespace}:standalone/{quote(self.stream_id, safe='')}" + + def key(self, key_prefix: str, topic: str) -> str: + """The log holding ``topic`` of this stream; one more component than the hash.""" + return f"{self.meta(key_prefix)}:{quote(topic, safe='')}" + + def __str__(self) -> str: + """The stream, for messages.""" + return f"standalone stream {self.stream_id!r}" + + +def _policy_fields( + retention: timedelta | None, max_records: int | None, max_bytes: int | None +) -> list[bytes]: + """The policy as the hash stores it: milliseconds, counts, and blanks for none.""" + return [ + b"" + if retention is None + else str(int(retention.total_seconds() * 1000)).encode(), + b"" if max_records is None else str(max_records).encode(), + b"" if max_bytes is None else str(max_bytes).encode(), + ] + + +#: Create a standalone stream's hash, or say whether the one there agrees. +_CREATE_STANDALONE_LUA: Final = """ +if redis.call('EXISTS', KEYS[1]) == 1 then + local held = redis.call('HMGET', KEYS[1], 'retention_ms', 'max_records', 'max_bytes') + if held[1] == ARGV[1] and held[2] == ARGV[2] and held[3] == ARGV[3] then + return 'same' + end + return 'conflict' +end +redis.call('HSET', KEYS[1], 'retention_ms', ARGV[1], 'max_records', ARGV[2], + 'max_bytes', ARGV[3], 'sealed', '0') +return 'created' +""" + + +#: Append one record to a standalone stream's topic under the stream's policy. +#: +#: The policy lives in the hash, so the script reads it rather than being told: +#: a sealed stream refuses, a missing one says so, and the trims apply to the +#: topic just written. ``max_bytes`` has no Redis trim of its own, so each entry +#: carries the size of the record it holds, the hash keeps a byte total per +#: topic, and the oldest entries are dropped one at a time until the topic fits. +_STANDALONE_APPEND_LUA: Final = """ +local meta = redis.call('HMGET', KEYS[3], 'sealed', 'retention_ms', 'max_records', + 'max_bytes', ARGV[6]) +if not meta[1] then + return {'missing', ''} +end +if meta[1] == '1' then + return {'closed', ''} +end +local existing = redis.call('HGET', KEYS[2], ARGV[1]) +if existing then + local sep = string.find(existing, '|') + if string.sub(existing, sep + 1) ~= ARGV[2] then + return {'conflict', ''} + end + return {'ok', string.sub(existing, 1, sep - 1)} +end +local id = redis.call('XADD', KEYS[1], '*', unpack(ARGV, 7)) +redis.call('HSET', KEYS[2], ARGV[1], id .. '|' .. ARGV[2]) +local total = tonumber(meta[5] or '0') + tonumber(ARGV[4]) +local floor = nil +if meta[2] ~= '' then + floor = tonumber(ARGV[3]) - tonumber(meta[2]) +end +while true do + local entries = redis.call('XRANGE', KEYS[1], '-', '+', 'COUNT', 1) + if #entries == 0 then break end + local entry = entries[1] + local drop = false + if meta[3] ~= '' and redis.call('XLEN', KEYS[1]) > tonumber(meta[3]) then drop = true end + if meta[4] ~= '' and total > tonumber(meta[4]) then drop = true end + if floor and tonumber(string.match(entry[1], '^(%d+)')) < floor then drop = true end + if not drop then break end + local size = 0 + local fields = entry[2] + for i = 1, #fields, 2 do + if fields[i] == ARGV[5] then size = tonumber(fields[i + 1]) end + end + redis.call('XDEL', KEYS[1], entry[1]) + total = total - size +end +redis.call('HSET', KEYS[3], ARGV[6], total) +return {'ok', id} +""" + + +#: The entry field holding the size a standalone stream's policy counts: the +#: serialized record, as the memory provider measures it, not the stored payload +#: with its envelope. +_SIZE_FIELD: Final = b"__size" + + +class _StandaloneAppend: + """One record on a standalone stream's topic, under its policy, in one call.""" + + def __init__(self, backend: RedisStreamBackend, owner: _StandaloneOwner) -> None: + """Bind to ``backend``'s client and ``owner``'s hash.""" + self._owner = owner + self._meta = owner.meta(_prefix(backend)) + self._script = backend._client.register_script(_STANDALONE_APPEND_LUA) + + async def write( + self, *, name: str, topic: str, record: TransportRecord, digest: str, size: int + ) -> Offset: + """Append ``record`` to the log ``name`` and return where it landed. + + ``size`` is what the stream's ``max_bytes`` counts for this record. + + Raises: + StreamNotFoundError: The stream was never created. + StreamClosedError: The stream is sealed. + AppendConflictError: The identity is held with a different digest. + """ + outcome, placed = await self._script( + keys=[name, f"{name}:idem", self._meta], + args=[ + str(record.idempotency_key).encode(), + digest.encode(), + str(int(time.time() * 1000)).encode(), + str(size).encode(), + _SIZE_FIELD, + f"bytes:{quote(topic, safe='')}".encode(), + *_fields_args(record), + _SIZE_FIELD, + str(size).encode(), + ], + ) + result = _text(outcome) + if result == "missing": + raise StreamNotFoundError(f"{self._owner} was not found") + if result == "closed": + raise StreamClosedError( + f"{self._owner} is closed and takes no more records" + ) + if result == "conflict": + raise AppendConflictError(record.idempotency_key) + return Offset(_text(placed)) + + def _prefix(backend: Any) -> str: """The key prefix ``backend`` writes under, for keys the provider derives itself.""" return backend._key_prefix @@ -505,6 +711,25 @@ async def _retained(client: Any, name: str, offset: Offset) -> bool: return wanted > _entry_id(info["last-generated-id"]) +async def _require_standalone(store: Any, meta: str, owner: _StandaloneOwner) -> None: + """Raise ``StreamNotFoundError`` unless ``owner``'s hash exists.""" + if not await store.exists(meta): + raise StreamNotFoundError(f"{owner} was not found") + + +async def _sealed(store: Any, meta: str) -> bool: + """Whether the standalone stream behind ``meta`` is sealed.""" + return _text(await store.hget(meta, "sealed") or b"0") == "1" + + +async def _newest(store: Any, name: str) -> Cursor: + """The cursor of the newest entry of the log ``name``, or ``BEGINNING``.""" + newest: Any = await store.xrevrange(name, "+", "-", count=1) + if not newest: + return BEGINNING + return mint_cursor(_PROVIDER, _text(newest[0][0])) + + def _is_staged(fields: Any) -> bool: """Whether a log entry is one the workflow staged, rather than a producer's.""" return _STAGE_FIELD in fields @@ -761,7 +986,9 @@ def __init__(self, topic: str) -> None: def publish(self, record: WireRecord) -> None: # Buffered in the transport's per-task batch, staged by the worker when # the task completes and promoted once History proves the task was - # accepted: rule 1 through the transport's own commit. + # accepted: rule 1 through the transport's own commit. The hash is a + # digest over bytes already in hand, so it costs no I/O here. + _stamp_hash(record) _drive(self._topic.publish(record.SerializeToString())) @@ -862,12 +1089,14 @@ def __init__( producer_id: str, attempt: int, owner: _ActivityOwner | None = None, + standalone: _StandaloneOwner | None = None, ) -> None: - """Bind this producer to ``topic`` of ``workflow_id``'s chain, or of ``owner``'s streams.""" + """Bind this producer to ``topic`` of the chain, of ``owner`` or of ``standalone``.""" self._streams = streams self._client = client self._workflow_id = workflow_id self._owner = owner + self._standalone = standalone self._topic = topic self._producer_id = producer_id self._attempt = attempt @@ -875,7 +1104,7 @@ def __init__( self._sequence = 0 self._last = BEGINNING self._input: Any = None - self._append: _LogAppend | None = None + self._append: _LogAppend | _StandaloneAppend | None = None self._name: str | None = None self._codec: StreamPayloadCodec[bytes] | None = None @@ -948,6 +1177,13 @@ async def _connect(self) -> None: if self._codec is not None: return backend = self._streams._require_backend() + if self._standalone is not None: + # No owner to code under and no one to wake: a standalone stream + # is read from outside only, and its hash says whether it exists. + self._name = self._standalone.key(_prefix(backend), self._topic) + self._append = _StandaloneAppend(backend, self._standalone) + self._codec = StreamPayloadCodec(self._client.data_converter, bytes) + return self._append = _LogAppend(backend) if self._owner is not None: # No transport producer to bind and no one to wake: an activity's @@ -1011,6 +1247,10 @@ async def _place(self, records: list[WireRecord]) -> Offset | None: assert self._name is not None last: Offset | None = None for index, record in enumerate(records): + # The digest is taken and stamped before the codec runs, so a retry + # the codec encodes differently still matches its original. + digest = _plaintext_digest(record) + _stamp_hash(record) # Built here rather than handed to the transport's publish, so the # trims ride along. The identity is the one the transport would # derive, so a record the log already holds is reused. @@ -1020,8 +1260,19 @@ async def _place(self, records: list[WireRecord]) -> Offset | None: producer_session_id=self._session, sequence=self._sequence + index, ) - last = await self._append.write(name=self._name, record=staged) - if self._owner is None: + if isinstance(self._append, _StandaloneAppend): + last = await self._append.write( + name=self._name, + topic=self._topic, + record=staged, + digest=digest, + size=record.ByteSize(), + ) + else: + last = await self._append.write( + name=self._name, record=staged, digest=digest + ) + if self._owner is None and self._standalone is None: await self._wake() return last @@ -1093,9 +1344,10 @@ class RedisStreamHandle: The owner is ``workflow_id``'s workflow, whose topic logs are read through the transport's output read so a staged batch is a barrier until its task - settles, or with ``activity_id`` an activity, read from the stream the - provider keeps for it: a standalone activity without ``workflow_id``, or - an activity that workflow scheduled. + settles; with ``activity_id`` an activity, read from the stream the + provider keeps for it, a standalone activity without ``workflow_id`` or an + activity that workflow scheduled; or with ``stream_id`` a standalone + stream, read from the logs under its hash until it is sealed. """ def __init__( @@ -1105,6 +1357,8 @@ def __init__( workflow_id: str | None, run_id: str | None, activity_id: str | None = None, + *, + stream_id: str | None = None, ) -> None: """Address the owner's topics; ``run_id`` decides whose close ends a read.""" self._streams = streams @@ -1112,23 +1366,28 @@ def __init__( self._workflow_id = workflow_id self._run_id = run_id self._owner: _ActivityOwner | None = None - if activity_id is not None: + self._standalone: _StandaloneOwner | None = None + converter = client.data_converter + if stream_id is not None: + # No owner, so nothing to code the bodies under. + self._standalone = _StandaloneOwner(client.namespace, stream_id) + elif activity_id is not None: self._owner = _ActivityOwner( client.namespace, workflow_id, activity_id, run_id ) - context = self._owner.context() + converter = converter.with_context(self._owner.context()) else: if workflow_id is None: raise ValueError( - "a stream handle needs a workflow_id or an activity_id" + "a stream handle needs a workflow_id, an activity_id or a stream_id" + ) + converter = converter.with_context( + WorkflowSerializationContext( + namespace=client.namespace, workflow_id=workflow_id ) - context = WorkflowSerializationContext( - namespace=client.namespace, workflow_id=workflow_id ) self._converter = client.data_converter.payload_converter - self._codec: StreamPayloadCodec[bytes] = StreamPayloadCodec( - client.data_converter.with_context(context), bytes - ) + self._codec: StreamPayloadCodec[bytes] = StreamPayloadCodec(converter, bytes) def read( self, @@ -1163,12 +1422,76 @@ def read( # a foreign one fails this call, not the first iteration. tail = last if last is not None else (0 if after == END else None) position = None if tail is not None else _position(after) + if self._standalone is not None: + return self._read_standalone( + self._standalone, topic, position, after, result_type, tail=tail + ) if self._owner is not None: return self._read_owned( self._owner, topic, position, after, result_type, tail=tail ) return self._read(topic, position, after, result_type, tail=tail) + async def _read_standalone( + self, + owner: _StandaloneOwner, + topic: str, + position: Offset | None, + after: Cursor, + result_type: type | None, + *, + tail: int | None = None, + ) -> AsyncGenerator[StreamRecord[Any], None]: + backend = self._streams._require_backend() + store = backend._client + meta = owner.meta(_prefix(backend)) + await _require_standalone(store, meta, owner) + name = owner.key(_prefix(backend), topic) + if tail is not None: + position = await _tail_after(store, name, tail) + after = ( + BEGINNING + if position is None + else mint_cursor(_PROVIDER, position.token) + ) + decoder = RecordDecoder( + self._converter, result_type, after=after, warn=logger.warning + ) + if position is not None and not await _retained(store, name, position): + raise StreamCursorError( + f"cursor {after.token!r} names a record on {topic!r} that the " + f"stream's policy has dropped" + ) + start = _BEGINNING_SENTINEL if position is None else position.token + block = int(self._streams._poll.total_seconds() * 1000) or None + closed = False + while True: + found: Any = await store.xread( + {name: start}, count=_READ_BATCH, block=block + ) + entries = found[0][1] if found else [] + for entry_id, fields in entries: + placed = _to_record(entry_id, fields) + assert placed.offset is not None + start = placed.offset.token + if placed.kind is not TransportRecordKind.DATA: + continue + minted = mint_cursor(_PROVIDER, placed.offset.token) + wire = _parse( + minted, await self._codec.decode(placed.payload), logger.warning + ) + if wire is None: + continue + for record in decoder.decode(minted, wire): + yield record + if entries: + continue + if closed: + return + # One more pass after learning of the seal, so a record that landed + # between the read and the seal is not lost. + closed = await _sealed(store, meta) + async def _read_owned( self, owner: _ActivityOwner, @@ -1405,14 +1728,18 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: """ topic, _ = resolve_topic(topic) backend = self._streams._require_backend() + if self._standalone is not None: + await _require_standalone( + backend._client, + self._standalone.meta(_prefix(backend)), + self._standalone, + ) + return await _newest( + backend._client, self._standalone.key(_prefix(backend), topic) + ) if self._owner is not None: owner = await _resolve_owner(self._client, self._owner) - newest: Any = await backend._client.xrevrange( - owner.key(_prefix(backend), topic), "+", "-", count=1 - ) - if not newest: - return BEGINNING - return mint_cursor(_PROVIDER, _text(newest[0][0])) + return await _newest(backend._client, owner.key(_prefix(backend), topic)) assert self._workflow_id is not None chain = await _chain(self._client, self._workflow_id) try: @@ -1428,6 +1755,8 @@ async def latest(self, *, topic: str | StreamTopic[Any]) -> Cursor: def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: """A ref to ``topic`` of this owner's stream, pinned as this handle is.""" + if self._standalone is not None: + return StreamRef.for_standalone(self._standalone.stream_id, topic=topic) if self._owner is not None: return StreamRef.for_activity( self._owner.activity_id, @@ -1441,11 +1770,25 @@ def ref(self, *, topic: str | StreamTopic[Any] | None = None) -> StreamRef: ) async def close(self) -> None: - """Refuse: an owned stream ends with its owner, not by a caller.""" - raise ValueError( - "only a standalone stream can be closed; this handle is on an owned " - "stream, which ends when its workflow or activity does" - ) + """Seal a standalone stream. An owned stream ends with its owner, not by a caller. + + The seal is a flag in the stream's hash that every append reads, so a + later append is refused with ``StreamClosedError`` and a read ends once + it has delivered the retained tail. Idempotent. + + Raises: + ValueError: This handle is on a workflow's or an activity's stream. + StreamNotFoundError: The stream was never created. + """ + if self._standalone is None: + raise ValueError( + "only a standalone stream can be closed; this handle is on an owned " + "stream, which ends when its workflow or activity does" + ) + backend = self._streams._require_backend() + meta = self._standalone.meta(_prefix(backend)) + await _require_standalone(backend._client, meta, self._standalone) + await backend._client.hset(meta, "sealed", "1") def producer( self, @@ -1465,6 +1808,7 @@ def producer( producer_id, attempt, owner=self._owner, + standalone=self._standalone, ) @@ -1610,26 +1954,49 @@ async def create_standalone_stream( max_records: int | None = None, max_bytes: int | None = None, ) -> RedisStreamHandle: - """Refuse: this provider keeps no stream without an owner. + """Create the standalone stream ``stream_id``, or find it with the same policy. + + The policy is written once into the stream's hash and applied on every + append to any of its topics. ``retention`` left unset takes this + provider's default window; the other two bounds are off unless set. Raises: - StreamUnsupportedError: Always. + ValueError: ``stream_id`` is empty, a bound is not positive, or + the stream exists with a different policy. """ - raise StreamUnsupportedError( - "the redis provider does not host standalone streams" + if not stream_id: + raise ValueError("stream_id must not be empty") + if retention is not None and retention <= timedelta(0): + raise ValueError("retention must be positive") + if max_records is not None and max_records <= 0: + raise ValueError("max_records must be positive") + if max_bytes is not None and max_bytes <= 0: + raise ValueError("max_bytes must be positive") + backend = self._require_backend() + owner = _StandaloneOwner(client.namespace, stream_id) + policy = _policy_fields( + self._retention if retention is None else retention, max_records, max_bytes ) + outcome = await backend._client.register_script(_CREATE_STANDALONE_LUA)( + keys=[owner.meta(_prefix(backend))], args=policy + ) + if _text(outcome) == "conflict": + raise ValueError( + f"{owner} exists with another policy; a policy is set when the " + "stream is created and does not change" + ) + return RedisStreamHandle(self, client, None, None, stream_id=stream_id) def get_standalone_stream_handle( self, client: Client, stream_id: str ) -> RedisStreamHandle: - """Refuse: this provider keeps no stream without an owner. + """A handle on the standalone stream ``stream_id``. - Raises: - StreamUnsupportedError: Always. + Nothing is checked here: a ``read``, ``latest``, ``producer`` or + ``close`` on a stream that was never created raises + :class:`temporalio.streams.StreamNotFoundError` when it is used. """ - raise StreamUnsupportedError( - "the redis provider does not host standalone streams" - ) + return RedisStreamHandle(self, client, None, None, stream_id=stream_id) async def close(self) -> None: """Release the Redis connection this provider opened; a caller's stays open.""" diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 680dc6e8d..56f67a578 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -30,6 +30,7 @@ _ActivityOwner, _drive, _position, + _StandaloneOwner, ) @@ -293,3 +294,16 @@ async def test_the_default_window_is_an_age_and_can_be_turned_off(): assert unbounded._require_backend().describe_window() == "no retention" finally: await unbounded.close() + + +def test_standalone_keys_have_their_own_owner_component(): + owner = _StandaloneOwner("ns", "shared") + assert owner.meta("p") == "p:ns:standalone/shared" + assert owner.key("p", "t") == "p:ns:standalone/shared:t" + # A topic log always has one more component than the hash, and every id and + # topic is encoded, so no name can land on the hash or on another topic. + assert owner.key("p", "meta") != owner.meta("p") + tricky = _StandaloneOwner("n:s", "a/b:c") + assert tricky.meta("p") == "p:n%3As:standalone/a%2Fb%3Ac" + assert tricky.key("p", "t/u") == "p:n%3As:standalone/a%2Fb%3Ac:t%2Fu" + assert str(owner) == "standalone stream 'shared'" diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index cd42ae0ca..074f6c4e2 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -283,11 +283,6 @@ async def host(workflow_id: str) -> None: # provider, where the case wants it at the call; its own live module # covers the trimmed floor. truncate=None, - # Matched by encoded bytes for now, so a retry through a codec that - # differs on every call is not recognized; standalone streams are - # not hosted yet. - detects_divergent_retries=False, - hosts_standalone_streams=False, ) for handle in hosts.values(): await handle.terminate() From e1f115f722ff56ec301d493de721e3121a8f22f0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:04:49 -0700 Subject: [PATCH 726/831] Declared the byte bound and age trim as standalone capabilities. A store may bound a standalone stream by record count and age but not by bytes, or apply retention only once the stream is closed. The two flags let such a provider say so and have the suite hold it to what it declares. (cherry picked from commit 440a18dbdeab1f3c8eb217c910a5d437b41621d4) --- tests/streams/test_streams_conformance.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 4dc09cd98..9b4575913 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -96,6 +96,11 @@ class ProviderCase: waits_for_standalone_creation: bool = False """A read on a standalone stream id that does not exist yet parks until the first write instead of raising ``StreamNotFoundError``.""" + bounds_standalone_bytes: bool = True + """A standalone stream's policy can bound the bytes it keeps.""" + trims_open_stream_by_age: bool = True + """A standalone stream drops records older than ``retention`` while it is + open, rather than keeping them that long after it closes.""" async def open( self, @@ -223,7 +228,13 @@ async def _memory_case(_client: Client) -> AsyncIterator[ProviderCase]: async def truncate(workflow_id: str, topic: str, keep: int) -> None: provider.truncate(workflow_id, topic, keep=keep) - yield ProviderCase("memory", provider, truncate=truncate) + yield ProviderCase( + "memory", + provider, + truncate=truncate, + bounds_standalone_bytes=True, + trims_open_stream_by_age=True, + ) provider.reset() From 1aceee767b1704f465e9874d462f6a9c881415b7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:06:35 -0700 Subject: [PATCH 727/831] Held the retention case to the declared capabilities and used the case's client. A provider that cannot bound a standalone stream by bytes is now expected to refuse the policy, and one that trims by age only after close skips that check. The converter cases derive their client from the provider's own, so a live provider is not asked to reach the fixture's dev server. (cherry picked from commit f5a7e1bf7d0eff8485ce0f0f99162bacc8f8e73c) --- tests/streams/test_streams_conformance.py | 29 ++++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 9b4575913..c557b9b69 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -60,6 +60,7 @@ StreamProducerError, StreamProvider, StreamRef, + StreamUnsupportedError, Supersession, topic, ) @@ -636,7 +637,9 @@ async def test_a_body_above_the_threshold_is_offloaded_and_read_back( external_storage=ExternalStorage(drivers=[driver], payload_size_threshold=256), ) workflow_id = new_workflow_id() - stream = await case.open(workflow_id, client=_client_with(client, converter)) + stream = await case.open( + workflow_id, client=_client_with(case.client or client, converter) + ) producer = stream.producer(topic=OUT, producer_id="model", attempt=1) small = {"n": 1} large = {"blob": "x" * 1024} @@ -658,7 +661,9 @@ async def test_a_retry_through_a_nondeterministic_codec_still_deduplicates( codec = NonceCodec() converter = dataclasses.replace(DataConverter.default, payload_codec=codec) workflow_id = new_workflow_id() - stream = await case.open(workflow_id, client=_client_with(client, converter)) + stream = await case.open( + workflow_id, client=_client_with(case.client or client, converter) + ) first = stream.producer(topic=OUT, producer_id="model", attempt=1) landed = await first.append({"id": "r1"}) assert codec.encoded == 1 @@ -797,13 +802,19 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas kept = await take(by_count.read(topic=OUT), 2) assert [r.value for r in kept] == [{"n": 3}, {"n": 4}] - by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) - producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) - for n in range(3): - await producer.append({"n": n, "blob": "x" * 500}) - kept = await take(by_bytes.read(topic=OUT), 1) - assert kept[0].value is not None and kept[0].value["n"] == 2 - + if case.bounds_standalone_bytes: + by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) + producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) + for n in range(3): + await producer.append({"n": n, "blob": "x" * 500}) + kept = await take(by_bytes.read(topic=OUT), 1) + assert kept[0].value is not None and kept[0].value["n"] == 2 + else: + with pytest.raises(StreamUnsupportedError): + await case.create_stream(new_stream_id(), max_bytes=700) + + if not case.trims_open_stream_by_age: + return by_age = await case.create_stream( new_stream_id(), retention=timedelta(milliseconds=200) ) From cbe1ec4b8166b096fb8b88a4fb0f80814f3dc10d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 03:52:26 -0700 Subject: [PATCH 728/831] Declared the Redis standalone stream's byte bound and open-stream age trim. The conformance suite now holds a provider to the standalone capabilities it declares. The Redis append script keeps a byte total per topic and trims by age on every append, so both hold while the stream is open. --- tests/streams/test_streams_conformance.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index fd42cf648..eb272d079 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -295,6 +295,11 @@ async def host(workflow_id: str) -> None: # provider, where the case wants it at the call; its own live module # covers the trimmed floor. truncate=None, + # A standalone stream's append script keeps a byte total per topic + # and trims by age on every append, so both bounds hold while the + # stream is open. + bounds_standalone_bytes=True, + trims_open_stream_by_age=True, ) for handle in hosts.values(): await handle.terminate() From 7868260eba0fec1c9f4c84ebf82b2f2a9ceb6791 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 18:23:52 -0700 Subject: [PATCH 729/831] Regenerated the vendored stream service protos for the byte cap. The server's StreamLifecycle gained max_bytes beside max_items, and StreamState reports held_bytes, so the standalone policy can bound bytes. Generated with the same protobuf 3 toolchain as before, so the modules still load on the oldest runtime this package supports. --- .../api/streamservice/v1/message_pb2.py | 16 ++++---- .../api/streamservice/v1/message_pb2.pyi | 21 ++++++++-- .../api/streamservice/v1/stream_state_pb2.py | 32 +++++++-------- .../api/streamservice/v1/stream_state_pb2.pyi | 40 ++++++++++++++++++- 4 files changed, 81 insertions(+), 28 deletions(-) diff --git a/temporalio/api/streamservice/v1/message_pb2.py b/temporalio/api/streamservice/v1/message_pb2.py index 8876ac29b..cd10df58f 100644 --- a/temporalio/api/streamservice/v1/message_pb2.py +++ b/temporalio/api/streamservice/v1/message_pb2.py @@ -14,6 +14,8 @@ _sym_db = _symbol_database.Default() +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + from temporalio.api.common.v1 import ( message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, ) @@ -22,7 +24,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporalio/api/stream/v1/message.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto"\xf7\x02\n\x0cStreamRecord\x12-\n\x04\x62ody\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12W\n\x08metadata\x18\x02 \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamRecord.MetadataEntry\x12\r\n\x05topic\x18\x03 \x01(\t\x12\x10\n\x08sequence\x18\x04 \x01(\x03\x12\x36\n\x04kind\x18\x05 \x01(\x0e\x32(.temporal.api.stream.v1.StreamRecordKind\x12\x0e\n\x06offset\x18\x06 \x01(\x03\x12\x13\n\x0bproducer_id\x18\x07 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x03\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"]\n\x11StreamRecordBatch\x12H\n\x07records\x18\x01 \x03(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamRecordB>ZZ google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ global___StreamRecord ]: ... + @property + def appended_at(self) -> google.protobuf.timestamp_pb2.Timestamp: + """When the batch was appended, for the lifecycle's retention age. Kept here + rather than in the stream's state so the state stays free of a per-batch + index; the age check reads the oldest batches to find it. + """ def __init__( self, *, records: collections.abc.Iterable[global___StreamRecord] | None = ..., + appended_at: google.protobuf.timestamp_pb2.Timestamp | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["appended_at", b"appended_at"] + ) -> builtins.bool: ... def ClearField( - self, field_name: typing_extensions.Literal["records", b"records"] + self, + field_name: typing_extensions.Literal[ + "appended_at", b"appended_at", "records", b"records" + ], ) -> None: ... global___StreamRecordBatch = StreamRecordBatch diff --git a/temporalio/api/streamservice/v1/stream_state_pb2.py b/temporalio/api/streamservice/v1/stream_state_pb2.py index 9f334a50f..2b4eeafa3 100644 --- a/temporalio/api/streamservice/v1/stream_state_pb2.py +++ b/temporalio/api/streamservice/v1/stream_state_pb2.py @@ -22,7 +22,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n+temporalio/api/stream/v1/stream_state.proto\x12)temporal.server.chasm.lib.stream.proto.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xb5\x06\n\x0bStreamState\x12\x13\n\x0bhead_offset\x18\x01 \x01(\x03\x12\x13\n\x0b\x62\x61se_offset\x18\x02 \x01(\x03\x12\x0e\n\x06\x63losed\x18\x04 \x01(\x08\x12\x35\n\x0c\x63lose_reason\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\tproducers\x18\t \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ProducersEntry\x12X\n\tconsumers\x18\n \x03(\x0b\x32\x45.temporal.server.chasm.lib.stream.proto.v1.StreamState.ConsumersEntry\x12M\n\tlifecycle\x18\x0b \x01(\x0b\x32:.temporal.server.chasm.lib.stream.proto.v1.StreamLifecycle\x12\x17\n\x0fredirect_run_id\x18\x0c \x01(\t\x12.\n\nclose_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12G\n\x06\x62udget\x18\x0e \x01(\x0b\x32\x37.temporal.server.chasm.lib.stream.proto.v1.StreamBudget\x12\x16\n\x0e\x61ppended_bytes\x18\x0f \x01(\x03\x12\x16\n\x0enotify_pending\x18\x10 \x01(\x08\x1ak\n\x0eProducersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ProducerCursor:\x02\x38\x01\x1ak\n\x0e\x43onsumersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12H\n\x05value\x18\x02 \x01(\x0b\x32\x39.temporal.server.chasm.lib.stream.proto.v1.ConsumerCursor:\x02\x38\x01J\x04\x08\x03\x10\x04J\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t"4\n\x0cStreamBudget\x12\x11\n\tmax_items\x18\x01 \x01(\x03\x12\x11\n\tmax_bytes\x18\x02 \x01(\x03"h\n\x0eProducerCursor\x12\x0b\n\x03seq\x18\x01 \x01(\x03\x12\x14\n\x0c\x66irst_offset\x18\x02 \x01(\x03\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x14\n\x0c\x63ontent_hash\x18\x04 \x01(\x0c\x12\x0e\n\x06\x66\x65nced\x18\x05 \x01(\x08"}\n\x0e\x43onsumerCursor\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x10\n\x08\x65xternal\x18\x05 \x01(\x08\x12\x14\n\x0creplay_floor\x18\x06 \x01(\x03"\xc0\x01\n\x14WorkflowStreamCursor\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x12\n\nknown_head\x18\x08 \x01(\x03\x12\x10\n\x08\x65xternal\x18\t \x01(\x08\x12\x14\n\x0cpending_from\x18\x05 \x01(\x03\x12\x12\n\npending_to\x18\x06 \x01(\x03\x12\x13\n\x0bhas_pending\x18\x07 \x01(\x08\x12\x14\n\x0cstart_offset\x18\n \x01(\x03J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04"R\n\x0fStreamLifecycle\x12,\n\tretention\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_items\x18\x02 \x01(\x03\x42>ZZ None: ... def HasField( self, @@ -166,6 +181,8 @@ class StreamState(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "age_task_pending", + b"age_task_pending", "appended_bytes", b"appended_bytes", "base_offset", @@ -182,6 +199,8 @@ class StreamState(google.protobuf.message.Message): b"consumers", "head_offset", b"head_offset", + "held_bytes", + b"held_bytes", "lifecycle", b"lifecycle", "notify_pending", @@ -411,9 +430,14 @@ class StreamLifecycle(google.protobuf.message.Message): RETENTION_FIELD_NUMBER: builtins.int MAX_ITEMS_FIELD_NUMBER: builtins.int + MAX_BYTES_FIELD_NUMBER: builtins.int @property def retention(self) -> google.protobuf.duration_pb2.Duration: - """How long a closed stream stays readable before it is deleted.""" + """How long a record stays readable, and how long a closed stream stays + readable before it is deleted. On an open stream batches older than this + are reclaimed behind the floor, never past an active consumer's floor; on + a closed one it is the time to deletion. + """ max_items: builtins.int """Cap on readable messages. Whole batches are reclaimed once the floor passes them, so a capped stream has bounded storage. @@ -424,11 +448,18 @@ class StreamLifecycle(google.protobuf.message.Message): behaves as a lifetime quota measured from that subscription and appends past it are refused rather than reclaiming behind the consumer. """ + max_bytes: builtins.int + """Cap on held bytes. Unlike max_items it reclaims nothing: an append that + would take the held bytes past it is refused, and room comes back only as + the record cap, an explicit truncation or the retention age reclaims + batches behind the floor. + """ def __init__( self, *, retention: google.protobuf.duration_pb2.Duration | None = ..., max_items: builtins.int = ..., + max_bytes: builtins.int = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["retention", b"retention"] @@ -436,7 +467,12 @@ class StreamLifecycle(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ - "max_items", b"max_items", "retention", b"retention" + "max_bytes", + b"max_bytes", + "max_items", + b"max_items", + "retention", + b"retention", ], ) -> None: ... From 973b6992c998bf2e499eb73a0cc629ddb61060cf Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 18:28:04 -0700 Subject: [PATCH 730/831] Moved the June standalone and Nexus scenarios onto the StreamRef surface. s2 now runs its three alternatives on the handle surface: a read that parks until the stream is created, create with a policy, close and the closed refusal, and a stream passed into the workflow start as a ref. s8 (b) returns the SDK's StreamRef and the client opens it on the front. --- examples/streams/june_scenarios/README.md | 46 ++-- .../june_scenarios/s2_standalone_streams.py | 245 +++++++++--------- .../june_scenarios/s8_nexus_consumers.py | 56 ++-- 3 files changed, 181 insertions(+), 166 deletions(-) diff --git a/examples/streams/june_scenarios/README.md b/examples/streams/june_scenarios/README.md index 51b9da3d7..e5e6388af 100644 --- a/examples/streams/june_scenarios/README.md +++ b/examples/streams/june_scenarios/README.md @@ -10,14 +10,14 @@ reaches into private SDK code or adds a feature. | Roey's scenario | File | Status | Note | |---|---|---|---| | Client starts and consume stream: primary and named | `s1_client_consumes.py` | implemented | Default topic with no name, a typed topic, `last=N`, `after=END`, `BEGINNING` on a moved floor (memory only) | -| Client starts and consume stream: standalone alt 1, 2, 3 | `s2_standalone_streams.py` | alt 2 implemented; alts 1 and 3 open | Native only. Shows `StreamNotFoundError` for alt 1; wait-for-creation reads and start-committed stream arguments are open questions on the blueprint | +| Client starts and consume stream: standalone alt 1, 2, 3 | `s2_standalone_streams.py` | alts 1, 2 and 3 implemented | Alt 1 as a read that parks until `create_stream` and an append land (native; memory and Redis answer `StreamNotFoundError`); alt 2 as `client.create_stream`, a policy floor, `close()` and `StreamClosedError`; alt 3 as a stream created first and passed into the workflow start as a `StreamRef`, opened in the activity with `activity.stream_handle(ref)`. A start that commits the stream with the workflow remains the design question. Workflow Streams declines | | Workflow as Producer: as named handle | `s3_workflow_producer.py` | implemented | His turn loop with continue-as-new; the client follows the chain live | | Workflow as Producer: as return type | `s4_workflow_as_generator.py` | emulated | Default-topic publishes plus `FINISH`, result from the workflow; the generator signature is sugar not built | -| Activity as Producer: as named handle | `s5_activity_producers.py` | implemented | Workflow topic (Path B), `scope="activity"`, standalone activity; the last two on native, memory and Redis | +| Activity as Producer: as named handle | `s5_activity_producers.py` | implemented | Workflow topic (Path B), `scope="activity"`, standalone activity; all three on native, memory and Redis, the last two skipped on Workflow Streams | | Activity as Producer: as return type | `s6_activity_as_generator.py` | emulated | Appends plus a heartbeat checkpoint; the retry resumes and readers see `SUPERSEDED` | | Workflow as Consumer | `s7_workflow_consumer.py` | implemented; foreign stream unsupported | Own inbound topic across continue-as-new, handing over per batch with one producer per batch and carrying a checkpoint; runs on native, Workflow Streams and Redis, memory skips by design; reading a foreign stream from a workflow is rule 5 | | Client as Consumer over Standalone Nexus | `s8_nexus_consumers.py` (a) | implemented | Activity reads through the `NexusStreams` front and resumes from a heartbeat cursor | -| Nexus operation handler | `s8_nexus_consumers.py` (b) | emulated | The operation returns a `StreamRef` that the client reads through the front; streams as operation results are the nexgen IDL follow-on | +| Nexus operation handler | `s8_nexus_consumers.py` (b) | implemented | The operation returns `temporalio.streams.StreamRef`, taken from the producing workflow's handle, and the client opens it with `get_stream_handle(ref)` on a client whose provider is the front; a stream type of its own in the operation IDL is the nexgen follow-on | | Workflow as Consumer over Nexus | `s8_nexus_consumers.py` docstring | unsupported by design | A workflow's reads ride its Workflow Task and never cross Nexus | ## Running @@ -26,26 +26,28 @@ Each file runs on its own and takes the provider's name, the same way the examples one directory up do. `run.py` runs them all in order: ```sh -python -m examples.streams.june_scenarios.run native --address 127.0.0.1:7333 -python -m examples.streams.june_scenarios.run workflow_streams --address 127.0.0.1:7333 -python -m examples.streams.june_scenarios.run memory --address 127.0.0.1:7333 -python -m examples.streams.june_scenarios.run redis --address 127.0.0.1:7333 --redis redis://127.0.0.1:6379 -python -m examples.streams.june_scenarios.s5_activity_producers native --address 127.0.0.1:7333 +python -m examples.streams.june_scenarios.run native --address 127.0.0.1:7433 --http http://127.0.0.1:7343 +python -m examples.streams.june_scenarios.run workflow_streams --address 127.0.0.1:7433 --http http://127.0.0.1:7343 +python -m examples.streams.june_scenarios.run memory --address 127.0.0.1:7433 --http http://127.0.0.1:7343 +python -m examples.streams.june_scenarios.run redis --address 127.0.0.1:7433 --http http://127.0.0.1:7343 --redis redis://127.0.0.1:6379 +python -m examples.streams.june_scenarios.s2_standalone_streams native --address 127.0.0.1:7433 ``` -`native` needs a server built from the stream-carrying branch. `s5` (b) -and (c) need a server with standalone activities and activity-owned -streams, and `s8` needs the server's Nexus HTTP ingress (`--http`, default -`http://127.0.0.1:7243`); the stream-carrying server has all three, so the -commands above point every provider at it. `s8` creates and deletes its own -Nexus endpoint. `memory` is offered here, not in the parent examples, -because it is not replay-safe; these scenarios keep a warm cache. `redis` -runs with `--redis` naming a local Redis: `s1` apart from (d) and `s3` to -`s8`, with all three parts of `s5` and `s7` handing over per batch, ran -green against the stream server, and `s2` refuses as on every provider but -`native`. +`native` needs a server built from the stream-carrying branch, and `s2` +alt 1's read that parks until the stream is created needs one built from +its current head. `s5` (b) and (c) need a server with standalone activities +and activity-owned streams, and `s8` needs the server's Nexus HTTP ingress +(`--http`, default `http://127.0.0.1:7243`, `7343` on the server above); +the stream-carrying server has all of them, so the commands above point +every provider at it. `s8` creates and deletes its own Nexus endpoint. +`memory` is offered here, not in the parent examples, because it is not +replay-safe; these scenarios keep a warm cache. `memory`, `native` and +`redis` hold standalone streams, so `s2` runs on all three; `redis` runs +with `--redis` naming a local Redis. Every scenario ran green on all four +providers against that server, apart from the refusals below. A scenario a provider cannot serve says so in its output and moves on: -`s2` on anything but `native`, `s5` (b) and (c) on `workflow_streams`, -`s1` (d) on anything but `memory`, and `s7` on `memory`, which keeps one -topic across a chain rather than one per run. +`s2` on `workflow_streams`, which keeps a stream inside a workflow's log, +`s5` (b) and (c) on `workflow_streams`, `s1` (d) on anything but `memory`, +and `s7` on `memory`, which keeps one topic across a chain rather than one +per run. diff --git a/examples/streams/june_scenarios/s2_standalone_streams.py b/examples/streams/june_scenarios/s2_standalone_streams.py index f85a3ef82..80eb51b4c 100644 --- a/examples/streams/june_scenarios/s2_standalone_streams.py +++ b/examples/streams/june_scenarios/s2_standalone_streams.py @@ -1,49 +1,60 @@ """Scenario "Client starts and consume stream", the three standalone alternatives. -Status: implemented for alt 2, with one open note for alts 1 and 3. +Status: implemented for alts 1, 2 and 3; alt 3 in the ref-argument shape. -Why: the server holds standalone streams with their own id and lifecycle, and -the stream client creates, appends to, truncates and reads them today. +Why: a standalone stream has an id of its own and no owner, the client +creates and seals it on purpose, and a ``StreamRef`` carries it as data into +a workflow start, an activity or a Nexus operation. - python -m examples.streams.june_scenarios.s2_standalone_streams native --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.s2_standalone_streams native --address 127.0.0.1:7433 + python -m examples.streams.june_scenarios.s2_standalone_streams memory --address 127.0.0.1:7433 + python -m examples.streams.june_scenarios.s2_standalone_streams redis --address 127.0.0.1:7433 + +His alt 1 is a read that blocks until the stream exists. On ``native`` a +read on an id nobody has created parks on the server and delivers the first +record once a ``create_stream`` and an append land; ``memory`` and ``redis`` +answer such a read with ``StreamNotFoundError`` instead, so the code shows +whichever the provider does. His alt 2 is ``stream = await client.create_stream(ProgressUpdate, -stream_id=...)`` and then ``start_workflow(..., arg=stream)``. Ours creates -the stream through ``temporalio.client_stream.StreamClient`` and passes its -id, a plain string, as the workflow argument. The workflow's activity appends -to it, an outside producer appends beside it, and the client follows it -until the stream is closed. The orphan he warns about is real: nothing ties -the stream to the workflow, so a crash between the two calls leaves it to -its retention. - -Two of his asks are open questions on the blueprint, not built. His alt 1, -a read that blocks until the stream exists, is shown below as what happens -today: the reader probes and gets ``StreamNotFoundError``. His alt 3, a -client-side stream made durable by the start call, is the stream-reference -and append-with-start follow-on. - -Only the native provider reaches the stream service, so on any other -provider this scenario says so and stops. It also shows ``BEGINNING`` on a -moved floor, which ``s1`` cannot show on native: after a truncate, an offset -below the floor is refused, and the ``earliest`` start lands on the oldest -record left. +stream_id=...)``. Ours is ``await client.create_stream(stream_id, +max_records=3)``: the policy is the stream's, the type is the topic's. An +outside producer appends, a second handle opened by id reads from +``BEGINNING``, which the policy has moved past the oldest record, and +``close()`` seals the stream: a late append raises ``StreamClosedError`` and +a read opened afterwards ends by itself once the retained tail is delivered. + +His alt 3 is a client-side stream made durable by the start call. Ours +creates the stream first and passes ``handle.ref()`` as the workflow's +argument; the workflow hands the ref to its activity, which opens it with +``activity.stream_handle(ref)`` and appends, and the client follows the same +ref. A start that commits the stream with the workflow, so a crash between +the two calls cannot leave an orphan, remains the design question. + +``workflow_streams`` keeps a stream inside a workflow's own log, so it has +nowhere to put a stream with no owner and declines. """ from __future__ import annotations import argparse import asyncio +import contextlib from dataclasses import dataclass from datetime import timedelta +from typing import Any from examples.streams import _setup from examples.streams.june_scenarios import _common -from temporalio import activity, workflow -from temporalio.api.stream.v1 import StreamRecord, StreamRecordKind, StreamStartPosition -from temporalio.client_stream import StreamClient, StreamEntry -from temporalio.converter import PayloadConverter -from temporalio.service import RPCError -from temporalio.streams import RecordKind, StreamError, StreamNotFoundError +from temporalio import activity, streams, workflow +from temporalio.streams import ( + RecordKind, + StreamClosedError, + StreamHandle, + StreamNotFoundError, + StreamRecord, + StreamRef, +) from temporalio.worker import Worker @@ -54,100 +65,112 @@ class ProgressUpdate: message: str -def encode( - converter: PayloadConverter, update: ProgressUpdate, producer_id: str -) -> StreamRecord: - """A standalone stream takes wire records, so the value becomes a payload here.""" - return StreamRecord( - kind=StreamRecordKind.STREAM_RECORD_KIND_DATA, - body=converter.to_payload(update), - producer_id=producer_id, - ) +PROGRESS = streams.topic("progress", ProgressUpdate) + +def show(record: StreamRecord[Any]) -> None: + """One line per record.""" + print(f" {record.kind.name:6} {record.producer_id:8} {record.value}") -def show(converter: PayloadConverter, entry: StreamEntry) -> None: - """One line per entry.""" - record = entry.record - kind = RecordKind(record.kind or RecordKind.DATA) - value = ( - converter.from_payload(record.body, ProgressUpdate) - if kind is RecordKind.DATA - else None - ) - print(f" {entry.offset}: {kind.name:6} {record.producer_id:8} {value}") + +async def first(reader: StreamHandle) -> StreamRecord[Any]: + """The first record of a read on ``PROGRESS``, closing the read after it. + + The read is opened in here, so a provider that refuses a missing stream at + the call refuses it inside the task that waits for the record. + """ + async with contextlib.aclosing(reader.read(topic=PROGRESS)) as reading: + async for record in reading: + return record + raise RuntimeError("the read ended before a record arrived") @activity.defn -async def report_progress(stream_id: str) -> int: - """Append three steps to the standalone stream named by ``stream_id``. +async def report_progress(session: StreamRef) -> int: + """Append three steps to the stream the ref names. - Each append carries the producer id and a sequence, so a retry of this - activity lands each step once. + Inside an activity the producer's identity is the activity's own, so a + retry of this activity lands each step once. """ - client = activity.client() - service = StreamClient.connect( - client.service_client.config.target_host, client.namespace - ) - try: - stream = service.get(stream_id) - converter = client.data_converter.payload_converter - for step in range(1, 4): - update = ProgressUpdate(f"step {step} done") - await stream.append( - encode(converter, update, "agent"), - producer_id="agent", - sequence=step, - ) - await asyncio.sleep(0.2) - await stream.finish_writing("agent") - return 3 - finally: - await service.close() + producer = activity.stream_handle(session).producer() + for step in range(1, 4): + await producer.append(ProgressUpdate(f"step {step} done")) + await asyncio.sleep(0.2) + await producer.finish() + return 3 @workflow.defn class Session: - """Receives the stream's id as its argument and hands it to its activity.""" + """Receives the stream as a ref and hands it to its activity.""" @workflow.run - async def run(self, stream_id: str) -> int: + async def run(self, session: StreamRef) -> int: """Run the activity that writes to the stream; the workflow never touches it.""" return await workflow.execute_activity( - report_progress, stream_id, start_to_close_timeout=timedelta(minutes=1) + report_progress, session, start_to_close_timeout=timedelta(minutes=1) ) async def run(args: argparse.Namespace) -> None: - """Probe, create, produce from two places, consume, then truncate.""" + """Wait for a stream, run one through its life, then pass one into a workflow.""" _common.banner("s2 standalone streams", args.provider) - if args.provider != "native": + if args.provider == "workflow_streams": print( - " standalone streams live on the server's stream service, which only " - "the native provider reaches; skipped" + " workflow_streams keeps a stream inside a workflow's log, so it has " + "nowhere to put a stream with no owner; skipped" ) return client, provider = await _setup.connect(args) - service = StreamClient.connect( - client.service_client.config.target_host, client.namespace - ) - converter = client.data_converter.payload_converter workflow_id, task_queue = _common.ids("june-s2") stream_id = f"session-{workflow_id.rsplit('-', 1)[1]}" try: - print(" alt 1 today: a reader probes a stream nobody has created") + print(" alt 1: a reader asks for a stream nobody has created yet") + reader = client.get_stream_handle(stream_id=stream_id) + waiting = asyncio.create_task(first(reader)) + await asyncio.sleep(0.5) + parked: asyncio.Task[StreamRecord[Any]] | None = waiting + if waiting.done(): + # memory and redis do not wait for a stream to be created. + try: + waiting.result() + except StreamNotFoundError as error: + print(f" StreamNotFoundError: {error}") + parked = None + else: + print(" the read is parked on the server until the stream exists") + created = await client.create_stream(stream_id, max_records=3) + await created.producer( + topic=PROGRESS, producer_id="operator", attempt=1 + ).append(ProgressUpdate("created")) + if parked is not None: + record = await parked + print( + " and it delivered the first record once the create and an append landed:" + ) + show(record) + + print(" alt 2: produce from outside, read by id, seal it") + operator = created.producer(topic=PROGRESS, producer_id="operator", attempt=2) + for note in ("watching", "looks good", "wrapping up"): + await operator.append(ProgressUpdate(note)) + await operator.finish() + await created.close() + print(" max_records=3 moved the floor: BEGINNING is the oldest record kept") + by_id = client.get_stream_handle(stream_id=stream_id) + async for record in by_id.read(topic=PROGRESS): + show(record) try: - await service.get(stream_id).read() - except StreamNotFoundError as error: - print(f" StreamNotFoundError: {error}") - - print(" alt 2: create, pass the id to the workflow, produce, consume") - stream = await service.create(stream_id, retention=600) - - async def consume() -> None: - async for entry in stream.follow(): - show(converter, entry) - - consumer = asyncio.create_task(consume()) + await created.producer( + topic=PROGRESS, producer_id="late", attempt=1 + ).append(ProgressUpdate("too late")) + except StreamClosedError as error: + print(f" a late append is refused: StreamClosedError: {error}") + + print(" alt 3: create, then start the workflow with the stream's ref") + session = await client.create_stream(f"{stream_id}-run") + ref = session.ref(topic=PROGRESS) + print(f" passing {ref}") async with Worker( client, task_queue=task_queue, @@ -155,31 +178,17 @@ async def consume() -> None: activities=[report_progress], ): handle = await client.start_workflow( - Session.run, stream_id, id=workflow_id, task_queue=task_queue + Session.run, ref, id=workflow_id, task_queue=task_queue ) - for n, note in enumerate(("watching", "looks good"), start=1): - await stream.append( - encode(converter, ProgressUpdate(note), "operator"), - producer_id="operator", - sequence=n, - ) - await stream.finish_writing("operator") - await handle.result() - - await stream.truncate(2) - await stream.close() - await consumer - - print(" the floor moved to offset 2") - try: - await stream.read(from_offset=0) - except (StreamError, RPCError) as error: - print(f" offset 0 refused: {type(error).__name__}: {error}") - print(" from the earliest record left:") - async for entry in stream.follow(start=StreamStartPosition(earliest=True)): - show(converter, entry) + # The ref names the topic, not its type; the typed topic says + # what to decode as. + async for record in client.get_stream_handle(ref).read(topic=PROGRESS): + show(record) + if record.kind is RecordKind.FINISH: + break + print(f" the workflow returned {await handle.result()}") + await session.close() finally: - await service.close() await provider.close() diff --git a/examples/streams/june_scenarios/s8_nexus_consumers.py b/examples/streams/june_scenarios/s8_nexus_consumers.py index 736fb9307..3405316d8 100644 --- a/examples/streams/june_scenarios/s8_nexus_consumers.py +++ b/examples/streams/june_scenarios/s8_nexus_consumers.py @@ -1,16 +1,17 @@ r"""Scenarios over Nexus: client consumer, operation handler, workflow consumer. -Status: "Client as Consumer over Standalone Nexus" is implemented; "Nexus -operation handler" returning a stream is emulated; "Workflow as Consumer -over Nexus" is unsupported by design. +Status: "Client as Consumer over Standalone Nexus" and "Nexus operation +handler" returning a stream are implemented; "Workflow as Consumer over +Nexus" is unsupported by design. Why: the ``NexusStreams`` front serves outside reads through one endpoint, so a client consumes over Nexus today, while a workflow's reads ride its Workflow Task and never cross Nexus. - python -m examples.streams.june_scenarios.s8_nexus_consumers native --address 127.0.0.1:7333 - python -m examples.streams.june_scenarios.s8_nexus_consumers \ - workflow_streams --address 127.0.0.1:7333 + python -m examples.streams.june_scenarios.s8_nexus_consumers native \ + --address 127.0.0.1:7433 --http http://127.0.0.1:7343 + python -m examples.streams.june_scenarios.s8_nexus_consumers workflow_streams \ + --address 127.0.0.1:7433 --http http://127.0.0.1:7343 The run creates its own Nexus endpoint through the operator service, routed to its worker's task queue, and deletes it at the end. ``--http`` is the @@ -25,10 +26,12 @@ after two records and the retry picks up after the second. (b) His handler returns ``Stream[ProgressUpdate]``. Ours returns a -``StreamRef``, a plain dataclass naming the producing workflow and the -topic; the calling workflow passes it on as its result and the client reads -it through the front. Streams as first-class operation inputs and results -are the nexgen IDL follow-on. +``temporalio.streams.StreamRef``, the SDK's name for one stream, taken from +the producing workflow's handle with ``ref(topic=SCORES)``; the calling +workflow passes it on as its result and the client opens it with +``get_stream_handle(ref)`` on a client whose provider is the front, so the +read goes over Nexus. The ref is plain data to the operation's IDL; a stream +type of its own there is the nexgen follow-on. Not shown, by design: a workflow consuming over Nexus. The workflow half of a provider records its reads on the Workflow Task, which cannot cross an @@ -55,8 +58,9 @@ CreateNexusEndpointRequest, DeleteNexusEndpointRequest, ) +from temporalio.client import Client from temporalio.common import RetryPolicy, WorkflowIDConflictPolicy -from temporalio.streams import BEGINNING, Cursor, RecordKind +from temporalio.streams import BEGINNING, Cursor, RecordKind, StreamRef from temporalio.streams.providers.nexus import NexusStreams, TemporalStreamsHandler from temporalio.worker import Worker @@ -85,14 +89,6 @@ class GameRequest: game_id: str -@dataclass -class StreamRef: - """A reference to a stream: the owning workflow and the topic name.""" - - workflow_id: str - topic: str - - @dataclass class CallerInput: """The endpoint to call and the game to ask for.""" @@ -166,17 +162,18 @@ def __init__(self, task_queue: str) -> None: async def start_game( self, _ctx: nexusrpc.handler.StartOperationContext, input: GameRequest ) -> StreamRef: - """His "pre-create and start" handler, returning a reference instead of a stream.""" + """His "pre-create and start" handler, returning a ref to the stream.""" # Reusing a running workflow makes a retried start of this sync - # operation hand back the same reference. - await nexus.client().start_workflow( + # operation hand back the same ref. + client = nexus.client() + await client.start_workflow( ScoresProducer.run, 3, id=input.game_id, task_queue=self._task_queue, id_conflict_policy=WorkflowIDConflictPolicy.USE_EXISTING, ) - return StreamRef(workflow_id=input.game_id, topic=SCORES.name) + return client.get_stream_handle(input.game_id).ref(topic=SCORES) @workflow.defn @@ -246,7 +243,9 @@ async def run(args: argparse.Namespace) -> None: print(f" and read {consumed.scores}") await producer.result() - print(" (b) an operation returns a stream reference; the client reads it") + print( + " (b) an operation returns a StreamRef; the client opens it on the front" + ) ref = await client.execute_workflow( Caller.run, CallerInput(endpoint_name, f"{workflow_id}-b"), @@ -254,8 +253,13 @@ async def run(args: argparse.Namespace) -> None: task_queue=task_queue, ) print(f" operation returned {ref}") - async for record in front.get_stream_handle(client, ref.workflow_id).read( - topic=ref.topic, result_type=ScoreUpdate + # The ref is opened on whatever provider the client carries; this + # one carries the front, so the read goes over Nexus. + config = client.config() + config["plugins"] = [front] + fronted = Client(**config) + async for record in fronted.get_stream_handle(ref).read( + result_type=ScoreUpdate ): print(f" {record.kind.name:6} {record.value}") finally: From 20ae07a98591d7fc269f9165d9ef559755b1c8d0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 18:30:26 -0700 Subject: [PATCH 731/831] Passed the byte cap through and trusted the server on a repeated create. The server's lifecycle now carries max_bytes, refuses an append that would cross it, reclaims an open standalone stream's records by age, and answers a create of an existing id with ALREADY_EXISTS or a STREAM_POLICY_MISMATCH refusal. The provider passes the cap through, drops the describe comparison, and the native conformance setup declares the byte cap as a refusal rather than a trim and waits for the store's age reclaim. --- temporalio/client_stream.py | 11 +++- temporalio/streams/providers/native.py | 69 ++++++++--------------- tests/streams/test_native_handles.py | 10 +--- tests/streams/test_streams_conformance.py | 38 +++++++++++-- 4 files changed, 66 insertions(+), 62 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index de0ed5c94..a7b5f8d32 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -628,13 +628,16 @@ async def create( *, retention: float | timedelta | None = None, max_items: int | None = None, + max_bytes: int | None = None, ) -> StreamHandle: """Create a stream and return a handle to it. - ``retention`` is how long a closed stream stays readable, in seconds - or as a ``timedelta``. ``max_items`` caps how many records remain + ``retention`` is the age past which an open stream's records are + reclaimed and how long a closed stream stays readable, in seconds or + as a ``timedelta``. ``max_items`` caps how many records remain readable, dropping the oldest, which bounds storage for a stream - nobody truncates. + nobody truncates. ``max_bytes`` caps the bytes held; an append that + would cross it is refused rather than reclaiming anything. """ lifecycle = stream.StreamLifecycle() if retention is not None: @@ -643,6 +646,8 @@ async def create( lifecycle.retention.FromTimedelta(retention) if max_items is not None: lifecycle.max_items = max_items + if max_bytes is not None: + lifecycle.max_bytes = max_bytes # A create that landed but was not answered would be refused as a # repeat, so it goes again only on a refusal. diff --git a/temporalio/streams/providers/native.py b/temporalio/streams/providers/native.py index 5e6bd7f66..95bb866a3 100644 --- a/temporalio/streams/providers/native.py +++ b/temporalio/streams/providers/native.py @@ -65,11 +65,7 @@ decode_body, encode_body, ) -from temporalio.streams._errors import ( - StreamCursorError, - StreamNotFoundError, - StreamUnsupportedError, -) +from temporalio.streams._errors import StreamCursorError, StreamNotFoundError from temporalio.streams._provider import ReadSource, StreamHandle, WriteSink from temporalio.streams._record import ( BEGINNING, @@ -728,10 +724,11 @@ class NativeStandaloneStreamHandle: stream appears, so a reader can attach before the producer's first write. ``latest`` and a producer's append on such an id raise :class:`temporalio.streams.StreamNotFoundError`: they have nothing to wait - on. The server keeps a policy's ``retention`` for the stream's records - after it is closed rather than trimming an open stream by age, and it has - no byte bound on a standalone stream's lifecycle, so the provider refuses - ``max_bytes``. + on. The policy is the server's lifecycle: ``retention`` is the age past + which an open stream's records are reclaimed and how long a closed one + stays readable, ``max_records`` drops the oldest records as new ones land, + and ``max_bytes`` refuses an append that would take the held bytes past it + rather than reclaiming anything. """ def __init__( @@ -937,12 +934,12 @@ async def create_standalone_stream( ) -> NativeStandaloneStreamHandle: """Create the standalone stream ``stream_id`` on the server and return a handle on it. - ``max_records`` keeps the newest records and drops the oldest as they - are appended. ``retention`` is how long the records stay readable - after the stream is closed; the server does not trim an open stream - by age. ``max_bytes`` is refused: the server's lifecycle has no byte - bound. A create of an id that exists with the same policy returns a - handle on it; with another policy it is a ``ValueError``. + The three bounds are the server's lifecycle: ``retention`` reclaims + records older than it on an open stream and times a closed one's + deletion, ``max_records`` drops the oldest records as new ones land, + and ``max_bytes`` refuses an append that would take the held bytes past + it. A create of an id that exists with the same policy returns a handle + on it; with another policy the server refuses it as a ``ValueError``. """ if not stream_id: raise ValueError("stream_id must not be empty") @@ -950,40 +947,22 @@ async def create_standalone_stream( raise ValueError("retention must be positive") if max_records is not None and max_records <= 0: raise ValueError("max_records must be positive") - if max_bytes is not None: - if max_bytes <= 0: - raise ValueError("max_bytes must be positive") - raise StreamUnsupportedError( - "the native provider bounds a standalone stream by records and, " - "after it closes, by age; max_bytes is not on the server's lifecycle" - ) + if max_bytes is not None and max_bytes <= 0: + raise ValueError("max_bytes must be positive") streams = shared_client(client) self._opened.add(shared_key(client)) try: - await streams.create(stream_id, retention=retention, max_items=max_records) + await streams.create( + stream_id, + retention=retention, + max_items=max_records, + max_bytes=max_bytes, + ) except RPCError as error: - # The server says ALREADY_EXISTS for an id that exists with this - # policy, and a policy that differs arrives typed as ValueError. An - # older server answers both with a generic failure, and describe - # tells the two apart. - if error.status == RPCStatusCode.ALREADY_EXISTS: - return NativeStandaloneStreamHandle( - client, stream_id, opened=self._opened - ) - try: - held = (await streams.get(stream_id).describe()).lifecycle - except StreamNotFoundError: - raise error from None - # A bound left to the server's default is not a disagreement with - # whatever default the server filled in. - if (max_records is not None and held.max_items != max_records) or ( - retention is not None and held.retention.ToTimedelta() != retention - ): - raise ValueError( - f"stream {stream_id!r} exists with another policy: it keeps " - f"{held.max_items or 'all'} records for " - f"{held.retention.ToTimedelta()} after it closes" - ) from None + # The id exists with this policy; a policy that differs arrives + # typed, as the ValueError the contract names. + if error.status != RPCStatusCode.ALREADY_EXISTS: + raise return NativeStandaloneStreamHandle(client, stream_id, opened=self._opened) def get_standalone_stream_handle( diff --git a/tests/streams/test_native_handles.py b/tests/streams/test_native_handles.py index 50b68c4db..318c30494 100644 --- a/tests/streams/test_native_handles.py +++ b/tests/streams/test_native_handles.py @@ -14,13 +14,7 @@ import pytest import temporalio.converter -from temporalio.streams import ( - DEFAULT_TOPIC, - StreamCursorError, - StreamRef, - StreamUnsupportedError, - topic, -) +from temporalio.streams import DEFAULT_TOPIC, StreamCursorError, StreamRef, topic from temporalio.streams.providers.native import ( NativeActivityStreamHandle, NativeStandaloneStreamHandle, @@ -104,7 +98,5 @@ async def test_a_create_refuses_a_policy_the_server_cannot_hold() -> None: await provider.create_standalone_stream(_CLIENT, "s1", **bad) # type: ignore[arg-type] with pytest.raises(ValueError): await provider.create_standalone_stream(_CLIENT, "") - with pytest.raises(StreamUnsupportedError, match="max_bytes"): - await provider.create_standalone_stream(_CLIENT, "s1", max_bytes=700) with pytest.raises(ValueError): provider.get_standalone_stream_handle(_CLIENT, "") diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index d6613a413..3c0d0c773 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -49,6 +49,7 @@ StorageDriverRetrieveContext, StorageDriverStoreContext, ) +from temporalio.service import RPCError from temporalio.streams import ( BEGINNING, DEFAULT_TOPIC, @@ -57,6 +58,7 @@ RecordKind, StreamClosedError, StreamCursorError, + StreamError, StreamHandle, StreamNotFoundError, StreamProducerError, @@ -103,6 +105,9 @@ class ProviderCase: the first write instead of raising ``StreamNotFoundError``.""" bounds_standalone_bytes: bool = True """A standalone stream's policy can bound the bytes it keeps.""" + refuses_appends_past_byte_cap: bool = False + """The byte bound refuses an append that would cross it, instead of + dropping the oldest records to make room.""" trims_open_stream_by_age: bool = True """A standalone stream drops records older than ``retention`` while it is open, rather than keeping them that long after it closes.""" @@ -291,8 +296,7 @@ async def host(workflow_id: str) -> None: client, host=host, waits_for_standalone_creation=True, - bounds_standalone_bytes=False, - trims_open_stream_by_age=False, + refuses_appends_past_byte_cap=True, ) for handle in hosts.values(): await handle.terminate() @@ -923,7 +927,19 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas kept = await take(by_count.read(topic=OUT), 2) assert [r.value for r in kept] == [{"n": 3}, {"n": 4}] - if case.bounds_standalone_bytes: + if case.bounds_standalone_bytes and case.refuses_appends_past_byte_cap: + # The cap counts the stored record, body and metadata included, so it + # holds one of these and not two. + by_bytes = await case.create_stream(new_stream_id(), max_bytes=1000) + producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 0, "blob": "x" * 500}) + # The second record would take the stream past its cap, so the store + # refuses it and keeps what it holds. + with pytest.raises((RPCError, StreamError)): + await producer.append({"n": 1, "blob": "x" * 500}) + kept = await take(by_bytes.read(topic=OUT), 1) + assert kept[0].value is not None and kept[0].value["n"] == 0 + elif case.bounds_standalone_bytes: by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) for n in range(3): @@ -943,5 +959,17 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas await producer.append({"n": "old"}) await asyncio.sleep(0.3) await producer.append({"n": "new"}) - kept = await take(by_age.read(topic=OUT), 1) - assert [r.value for r in kept] == [{"n": "new"}] + # A store reclaims by age on its own schedule, and a coarse one may have + # aged the newer record out as well by the time it is looked at. What the + # policy decides is that the older record is no longer where BEGINNING + # starts. + kept: list = [] + for _ in range(50): + try: + kept = await take(by_age.read(topic=OUT), 1, timeout=1) + except asyncio.TimeoutError: + kept = [] + if not kept or kept[0].value == {"n": "new"}: + break + await asyncio.sleep(0.2) + assert [r.value for r in kept] in ([{"n": "new"}], []) From e80180e50aba6c83b906f06bf8cf41fdcf73ec74 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 18:32:36 -0700 Subject: [PATCH 732/831] Reused the retention case's result variable instead of redeclaring it. --- tests/streams/test_streams_conformance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 3c0d0c773..7a2f6f435 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -963,7 +963,7 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas # aged the newer record out as well by the time it is looked at. What the # policy decides is that the older record is no longer where BEGINNING # starts. - kept: list = [] + kept = [] for _ in range(50): try: kept = await take(by_age.read(topic=OUT), 1, timeout=1) From 93fd4e25031ab87192814b69dad1ec286bcdb876 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 18:35:38 -0700 Subject: [PATCH 733/831] Declared refusing an append past the byte cap as a capability. A store may keep a standalone stream under its byte bound by refusing the append that would cross it rather than by dropping its oldest records. The flag lets a provider say which it does, and memory declares that it trims. --- tests/streams/test_streams_conformance.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 80fc167a5..fb819bcb4 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -85,6 +85,9 @@ class ProviderCase: for retention, or ``None`` when the provider offers no way to.""" bounds_standalone_bytes: bool = True """A standalone stream's policy can bound the bytes it keeps.""" + refuses_appends_past_byte_cap: bool = False + """The byte bound refuses an append that would cross it, instead of + dropping the oldest records to make room.""" trims_open_stream_by_age: bool = True """A standalone stream drops records older than ``retention`` while it is open, rather than keeping them that long after it closes.""" @@ -178,6 +181,7 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: provider, truncate=truncate, bounds_standalone_bytes=True, + refuses_appends_past_byte_cap=False, trims_open_stream_by_age=True, ) provider.reset() From f05f6c39423f81a0238079713767e8f4b8da6e7a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 18:37:05 -0700 Subject: [PATCH 734/831] Let the retention case accept a refused append and a coarse age sweep. A store that refuses the append crossing its byte cap is checked with a cap that holds one stored record, hash metadata included, and not two. The age subcase waits for the older record to leave BEGINNING and accepts the newer one aging out as well, since a store reclaims on its own schedule. --- tests/streams/test_streams_conformance.py | 32 ++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 3ba6eb61b..f9c53bdcf 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -48,6 +48,7 @@ StorageDriverRetrieveContext, StorageDriverStoreContext, ) +from temporalio.service import RPCError from temporalio.streams import ( BEGINNING, DEFAULT_TOPIC, @@ -56,6 +57,7 @@ RecordKind, StreamClosedError, StreamCursorError, + StreamError, StreamHandle, StreamNotFoundError, StreamProducerError, @@ -866,7 +868,19 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas kept = await take(by_count.read(topic=OUT), 2) assert [r.value for r in kept] == [{"n": 3}, {"n": 4}] - if case.bounds_standalone_bytes: + if case.bounds_standalone_bytes and case.refuses_appends_past_byte_cap: + # The cap counts the stored record, body and metadata included, so it + # holds one of these and not two. + by_bytes = await case.create_stream(new_stream_id(), max_bytes=1000) + producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 0, "blob": "x" * 500}) + # The second record would take the stream past its cap, so the store + # refuses it and keeps what it holds. + with pytest.raises((RPCError, StreamError)): + await producer.append({"n": 1, "blob": "x" * 500}) + kept = await take(by_bytes.read(topic=OUT), 1) + assert kept[0].value is not None and kept[0].value["n"] == 0 + elif case.bounds_standalone_bytes: by_bytes = await case.create_stream(new_stream_id(), max_bytes=700) producer = by_bytes.producer(topic=OUT, producer_id="writer", attempt=1) for n in range(3): @@ -886,5 +900,17 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas await producer.append({"n": "old"}) await asyncio.sleep(0.3) await producer.append({"n": "new"}) - kept = await take(by_age.read(topic=OUT), 1) - assert [r.value for r in kept] == [{"n": "new"}] + # A store reclaims by age on its own schedule, and a coarse one may have + # aged the newer record out as well by the time it is looked at. What the + # policy decides is that the older record is no longer where BEGINNING + # starts. + kept = [] + for _ in range(50): + try: + kept = await take(by_age.read(topic=OUT), 1, timeout=1) + except asyncio.TimeoutError: + kept = [] + if not kept or kept[0].value == {"n": "new"}: + break + await asyncio.sleep(0.2) + assert [r.value for r in kept] in ([{"n": "new"}], []) From cb6c7734ae9b2283ea9f1c089c964c2108ebafbd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 18:54:47 -0700 Subject: [PATCH 735/831] Registered the provider's handlers before the first task's Updates run. The SDK handles a task's Signals and Updates ahead of the workflow function, so a publish or poll Update that arrived with the first task was rejected and, on a worker with no cache, on every rebuilt instance too. The start hook now runs when the instance's loop first turns, and Workflow Streams binds the shipped stream object lazily so a workflow's own stays. --- temporalio/streams/_provider.py | 9 +- .../streams/providers/workflow_streams.py | 111 ++++++++++++++---- temporalio/worker/_workflow.py | 28 ++++- tests/streams/test_stream_hooks.py | 42 ++++--- .../streams/test_workflow_streams_provider.py | 29 +++-- 5 files changed, 163 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index 340cea87a..8982bf87b 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -322,10 +322,13 @@ def open_writer(self, topic: str) -> WriteSink: ... def on_workflow_start(self) -> None: - """Called before the workflow function runs. + """Called before the workflow function runs, and before the first task's handlers. - A provider that serves outside readers through handlers on the - workflow registers them here, before the first task completes. + After the workflow's own ``__init__`` and before any Signal or Update + of the first task is handled, which the SDK does ahead of the + workflow function. A provider that serves outside readers through + handlers on the workflow registers them here, so an Update that + arrives with the first task finds them. """ ... diff --git a/temporalio/streams/providers/workflow_streams.py b/temporalio/streams/providers/workflow_streams.py index 2b7036941..8a5ed5daa 100644 --- a/temporalio/streams/providers/workflow_streams.py +++ b/temporalio/streams/providers/workflow_streams.py @@ -52,6 +52,11 @@ through the handler the shipped class registers on it. An evicted and rebuilt workflow gets its own, so a task that failed leaks nothing into the next attempt's log and a replayed run does not see records twice. + The provider's handlers are registered as the instance is initialised, + before the first task's Signals and Updates are applied, so a publish or + poll that arrives with that task finds them; the stream object is bound + on first use, adopting one the workflow built in its ``__init__`` or + constructing the provider's own. - An activity a workflow scheduled keeps its own streams inside that workflow's log, under the reserved topic ``activity//`` with ``%`` and ``/`` in the id percent-encoded, the way the native @@ -322,15 +327,28 @@ class _Held: last_offset: int -class _InstanceStream: - """A view over the shipped stream object of the running workflow instance. +class _Shipped: + """Constructs the shipped stream object, which insists on a caller named ``__init__``.""" + + def __init__(self) -> None: + self.stream = WorkflowStream() - A separate class because ``WorkflowStream`` insists on being constructed - from a method named ``__init__``. + +class _InstanceStream: + """The provider's handlers on one workflow instance, over the shipped stream object. + + Built when the instance is initialised, before the workflow's own + ``__init__`` and before any Signal or Update of the first task is + applied, so the handlers are found by whatever arrives with that task. + The shipped stream object is bound on first use rather than here: a + workflow migrating from the contrib feature constructs its own in + ``__init__``, which the shipped class refuses to do twice, so this + adopts that one when it exists and constructs the provider's own when + nothing has, from a handler that may write or from the workflow half. """ - def __init__(self, stream: WorkflowStream | None = None) -> None: - self.stream = WorkflowStream() if stream is None else stream + def __init__(self) -> None: + self._stream: WorkflowStream | None = None # Per producer and topic, the most recent batch taken by the publish # Update, so a repeat is answered and a divergent one refused. A # producer's identity is one per stream, as on every provider, so @@ -351,6 +369,38 @@ def __init__(self, stream: WorkflowStream | None = None) -> None: workflow.set_update_handler( _PUBLISH_UPDATE, self._publish, validator=self._validate_publish ) + if workflow.get_update_handler(POLL_UPDATE_NAME) is None: + # Stands in for the shipped poll handler until a stream object is + # bound, whose constructor then registers the real one over it. + workflow.set_update_handler( + POLL_UPDATE_NAME, self._poll, validator=self._validate_poll + ) + + @property + def held(self) -> WorkflowStream | None: + """The shipped stream object, if the workflow or a handler has bound one. + + Looks one up and never constructs, so a Query may ask. + """ + if self._stream is None: + self._stream = _registered_stream() + return self._stream + + @property + def stream(self) -> WorkflowStream: + """The shipped stream object, adopting the workflow's own or constructing the provider's.""" + held = self.held + if held is None: + held = self._stream = _Shipped().stream + return held + + def _validate_poll(self, payload: PollInput) -> None: + held = self.held + if held is not None: + held._validate_poll(payload) # pyright: ignore[reportPrivateUsage] + + async def _poll(self, payload: PollInput) -> PollResult: + return await self.stream._on_poll(payload) # pyright: ignore[reportPrivateUsage] def _validate_publish(self, publish: PublishInput) -> None: """Refuse a conflicting batch before the Update is accepted. @@ -394,9 +444,10 @@ def _publish(self, publish: PublishInput) -> _PublishResult: held = self._producers.get(key) if held is not None and publish.sequence == held.sequence: return _PublishResult(run_id=run_id, last_offset=held.last_offset) + stream = self.stream for entry in publish.items: - self.stream.topic(entry.topic).publish(_decode_payload(entry.data)) - last = self.stream.next_offset - 1 + stream.topic(entry.topic).publish(_decode_payload(entry.data)) + last = stream.next_offset - 1 self._producers[key] = _Held(publish.sequence, _content(publish), last) return _PublishResult(run_id=run_id, last_offset=last) @@ -407,11 +458,20 @@ def _tail(self, from_offset: int, topic: str) -> dict[str, Any]: response has to fit the server's blob limit and a log the reader only wants one topic of can be much larger than that. """ + stream = self.held + if stream is None: + # Nothing has been bound, so nothing has been published. + return { + "items": [], + "next_offset": 0, + "more_ready": False, + "base_offset": 0, + } items: list[dict[str, Any]] = [] size = 0 - next_offset = self.stream.next_offset + next_offset = stream.next_offset more_ready = False - held = self.stream.items_from(from_offset) + held = stream.items_from(from_offset) for offset, item_topic, payload in held: if item_topic != topic: continue @@ -437,7 +497,10 @@ def _latest(self, topic: str) -> int: answer about one topic. Scanning here costs one Query rather than shipping the log to the caller to find the same thing. """ - for offset, item_topic, _ in reversed(self.stream.items_from(0)): + stream = self.held + if stream is None: + return -1 + for offset, item_topic, _ in reversed(stream.items_from(0)): if item_topic == topic: return offset return -1 @@ -447,7 +510,8 @@ def _start(self, topic: str, last_n: int) -> int: Zero ``last_n`` asks for the head, which is where ``END`` starts. """ - return start_offset(self.stream, topic, last_n) + stream = self.held + return 0 if stream is None else start_offset(stream, topic, last_n) def start_offset(stream: WorkflowStream, topic: str, last_n: int) -> int: @@ -493,8 +557,7 @@ def _instance() -> _InstanceStream: registered = getattr(handler, "__self__", None) if isinstance(registered, _InstanceStream): return registered - stream = _registered_stream() - return _InstanceStream() if stream is None else _InstanceStream(stream) + return _InstanceStream() class _WSReadSource: @@ -594,19 +657,23 @@ def open_writer(self, topic: str) -> WriteSink: return _WSWriteSink(self._own_stream(), topic) def on_workflow_start(self) -> None: - # Registered on the first task, because an outside reader can poll - # before workflow code has opened anything, and an Update with no - # handler yet is rejected rather than held. A poll that arrives in - # that first task still runs ahead of this hook; the reader retries it. - self._own_stream() + # Called as the instance is initialised, so the handlers exist before + # the first task's Updates are evaluated: an outside publish or poll + # that arrives with that task is served rather than rejected. The + # stream object itself is bound later, once the workflow's own + # __init__ has had its chance to construct one. + _instance() async def on_workflow_finish(self) -> None: # An Option 0 stream dies with its run, and a parked long-poll Update # would otherwise hold completion open. Same recipe the shipped - # feature documents before a return or a continue-as-new. - if self._stream is None: + # feature documents before a return or a continue-as-new. Asked of + # the instance rather than this object's cache, because a poll can + # bind the stream before workflow code touches it. + held = _instance().held + if held is None: return - self._stream.detach_pollers() + held.detach_pollers() await workflow.wait_condition(workflow.all_handlers_finished) diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 79f5ca6e8..f4001b32e 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -13,7 +13,7 @@ from dataclasses import dataclass from datetime import timezone from types import TracebackType -from typing import Any +from typing import Any, cast import temporalio.api.common.v1 import temporalio.bridge.proto.common @@ -41,6 +41,7 @@ Interceptor, WorkflowInboundInterceptor, WorkflowInterceptorClassInput, + WorkflowOutboundInterceptor, ) from ._workflow_instance import ( _DEFAULT_ENABLED_WORKFLOW_LOGIC_FLAGS, @@ -62,9 +63,14 @@ class _StreamHooksInterceptor(WorkflowInboundInterceptor): """Brackets the workflow function with the stream provider's lifecycle hooks. Installed by the worker when it has a stream provider, so no workflow - code has to call anything before it runs or before it returns. The finish - hook runs when the function returns, raises or continues as new, because - a provider that parked a reader against the run has to let go either way. + code has to call anything before it runs or before it returns. The start + hook runs when the instance's loop first turns, after the workflow's own + ``__init__`` and before the first task's Signals and Updates are handled, + because the SDK handles those ahead of the workflow function and a handler + registered any later would be missed by an Update that arrives with that + task. The finish hook runs when the function returns, raises or continues as new, + because a provider that parked a reader against the run has to let go + either way. It does not run when the run is being evicted from the cache or when the abandoned coroutine is collected: neither is the workflow ending, the instance's state is not to be touched during eviction, and at collection @@ -72,10 +78,22 @@ class _StreamHooksInterceptor(WorkflowInboundInterceptor): be running, so the hook would act on that one. """ + def init(self, outbound: WorkflowOutboundInterceptor) -> None: + super().init(outbound) + # The hook has to run after the workflow's own __init__, which may + # register handlers the provider adopts, and before the first task's + # Signals and Updates are handled, which the SDK does ahead of the + # workflow function. The instance is its own event loop and nothing + # is queued on it yet, so a callback queued now runs first when that + # loop first turns, which is after every job of the activation has + # been applied and before any task they created takes a step. + runtime = temporalio.workflow._Runtime.current() + loop = cast(asyncio.AbstractEventLoop, cast(object, runtime)) + loop.call_soon(lambda: runtime.workflow_streams().provider.on_workflow_start()) + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: runtime = temporalio.workflow._Runtime.current() provider = runtime.workflow_streams().provider - provider.on_workflow_start() try: result = await self.next.execute_workflow(input) except GeneratorExit: diff --git a/tests/streams/test_stream_hooks.py b/tests/streams/test_stream_hooks.py index a547daf3e..7908dfc57 100644 --- a/tests/streams/test_stream_hooks.py +++ b/tests/streams/test_stream_hooks.py @@ -10,7 +10,7 @@ from __future__ import annotations import asyncio -from typing import Any +from typing import Any, cast import pytest @@ -58,6 +58,11 @@ def workflow_streams(self) -> _Streams: def workflow_is_evicting(self) -> bool: return self._evicting + def call_soon(self, callback: Any) -> None: + # The real runtime is the workflow's event loop; here the test's loop + # stands in for it. + asyncio.get_running_loop().call_soon(callback) + class _Body(WorkflowInboundInterceptor): """The workflow function's stand-in: returns, raises or parks forever.""" @@ -65,6 +70,9 @@ class _Body(WorkflowInboundInterceptor): def __init__(self, outcome: Any) -> None: # type: ignore[reportMissingSuperCall] self._outcome = outcome + def init(self, outbound: Any) -> None: + del outbound + async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any: del input if self._outcome is _PARK: @@ -84,6 +92,18 @@ async def _unused_run_fn() -> None: _INPUT = ExecuteWorkflowInput(type=object, run_fn=_unused_run_fn, args=(), headers={}) +async def _hooked(body: _Body) -> _StreamHooksInterceptor: + """The interceptor over ``body``, initialised the way the instance does it. + + ``init`` queues the start hook for the loop's first turn, so one turn + runs it, as the instance's loop does before any task takes a step. + """ + interceptor = _StreamHooksInterceptor(body) + interceptor.init(cast(Any, None)) + await asyncio.sleep(0) + return interceptor + + @pytest.fixture async def provider() -> Any: fake = _Provider() @@ -99,40 +119,34 @@ def _evicting(fake: _Provider) -> None: async def test_the_finish_hook_runs_on_return(provider: _Provider): - assert ( - await _StreamHooksInterceptor(_Body("done")).execute_workflow(_INPUT) == "done" - ) + assert await (await _hooked(_Body("done"))).execute_workflow(_INPUT) == "done" assert provider.calls == ["start", "finish"] async def test_the_finish_hook_runs_when_the_function_raises(provider: _Provider): with pytest.raises(RuntimeError, match="boom"): - await _StreamHooksInterceptor(_Body(RuntimeError("boom"))).execute_workflow( - _INPUT - ) + await (await _hooked(_Body(RuntimeError("boom")))).execute_workflow(_INPUT) assert provider.calls == ["start", "finish"] async def test_the_finish_hook_runs_on_continue_as_new(provider: _Provider): error = workflow.ContinueAsNewError.__new__(workflow.ContinueAsNewError) with pytest.raises(workflow.ContinueAsNewError): - await _StreamHooksInterceptor(_Body(error)).execute_workflow(_INPUT) + await (await _hooked(_Body(error))).execute_workflow(_INPUT) assert provider.calls == ["start", "finish"] async def test_the_finish_hook_runs_on_a_workflow_cancellation(provider: _Provider): # A cancelled primary task is the run ending, so the provider lets go. with pytest.raises(asyncio.CancelledError): - await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( - _INPUT - ) + await (await _hooked(_Body(asyncio.CancelledError()))).execute_workflow(_INPUT) assert provider.calls == ["start", "finish"] async def test_the_finish_hook_does_not_run_when_the_coroutine_is_collected( provider: _Provider, ): - coroutine = _StreamHooksInterceptor(_Body(_PARK)).execute_workflow(_INPUT) + coroutine = (await _hooked(_Body(_PARK))).execute_workflow(_INPUT) # Run up to the park, the way a worker that shut down without evicting # leaves the primary task, then close it as garbage collection would. coroutine.send(None) @@ -143,9 +157,7 @@ async def test_the_finish_hook_does_not_run_when_the_coroutine_is_collected( async def test_the_finish_hook_does_not_run_during_eviction(provider: _Provider): _evicting(provider) with pytest.raises(asyncio.CancelledError): - await _StreamHooksInterceptor(_Body(asyncio.CancelledError())).execute_workflow( - _INPUT - ) + await (await _hooked(_Body(asyncio.CancelledError()))).execute_workflow(_INPUT) assert provider.calls == ["start"] diff --git a/tests/streams/test_workflow_streams_provider.py b/tests/streams/test_workflow_streams_provider.py index 320a8bf03..218c55fdc 100644 --- a/tests/streams/test_workflow_streams_provider.py +++ b/tests/streams/test_workflow_streams_provider.py @@ -373,7 +373,7 @@ def items_from(self, offset: int) -> list[Any]: return [item for item in items if item[0] >= offset] instance = _InstanceStream.__new__(_InstanceStream) - instance.stream = _Log() # type: ignore[assignment] + instance._stream = _Log() # type: ignore[assignment] # pyright: ignore[reportPrivateUsage] seen: list[int] = [] offset, more = 0, True @@ -590,17 +590,24 @@ async def _reset_at_last_completed_task( if event.HasField("workflow_task_completed_event_attributes"): completion_id = event.event_id assert completion_id - answer = await client.workflow_service.reset_workflow_execution( - ResetWorkflowExecutionRequest( - namespace=client.namespace, - workflow_execution=WorkflowExecution( - workflow_id=workflow_id, run_id=run_id - ), - reason="re-run from the last completed task", - workflow_task_finish_event_id=completion_id, - request_id=uuid.uuid4().hex, + try: + answer = await client.workflow_service.reset_workflow_execution( + ResetWorkflowExecutionRequest( + namespace=client.namespace, + workflow_execution=WorkflowExecution( + workflow_id=workflow_id, run_id=run_id + ), + reason="re-run from the last completed task", + workflow_task_finish_event_id=completion_id, + request_id=uuid.uuid4().hex, + ) ) - ) + except RPCError as error: + if error.status != RPCStatusCode.UNIMPLEMENTED: + raise + # The Java time-skipping test server has no reset; the real server + # does, and this never skips there. + pytest.skip("this test server does not implement ResetWorkflowExecution") return answer.run_id From 8ed252371eb7b36570178f679484abd6016d8860 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 18:57:54 -0700 Subject: [PATCH 736/831] Declared the byte-cap refusal absent on Workflow Streams. The provider hosts no standalone streams, so there is no byte cap to refuse an append past; the flag says so next to the other three. --- tests/streams/test_streams_conformance.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 1968a5080..993cba69b 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -332,6 +332,7 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: hosts_standalone_streams=False, bounds_standalone_bytes=False, trims_open_stream_by_age=False, + refuses_appends_past_byte_cap=False, ) for handle in hosts.values(): await handle.terminate() From 67f80ea92005b1c7e6ebe92a7a2fd31e411f9f3d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Wed, 30 Sep 2026 21:30:05 -0700 Subject: [PATCH 737/831] Took an aborted batch's entries out of the shared log. A completion the server rejects, such as a closing task with a wake Signal buffered under it, leaves the batch it staged with a token no marker will name; the re-run stages the batch again, and the dead stage stayed in the log once a reader or the worker aborted it. On the one-log layout those entries count against every window and bound, so the abort now deletes them and the stage's hashes stand in for them, and the worker settles a run's pending stages against History when it evicts the run rather than leaving them for a reader to find. --- temporalio/streams/providers/redis.py | 45 +++++++++++++++++++++ temporalio/worker/_workflow.py | 11 ++++++ tests/streams/test_redis_replay.py | 56 ++++++++++++++++++++++++++- 3 files changed, 111 insertions(+), 1 deletion(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index b40199db0..30bf24c08 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -180,6 +180,7 @@ OutputStageNotFoundError, OutputStageResolutionError, OutputStageStatus, + OutputStreamRecord, StagedOutputRecord, ) from temporalio.contrib.external_workflow_streams._output_client import ( @@ -844,6 +845,50 @@ async def stage_output( await self._trim(manifest.stream_key) return stage + async def abort_output(self, manifest: OutputStageManifest) -> OutputStage: + """Resolve the stage as aborted and take its entries out of the log. + + A batch whose task was not accepted yields nothing to any reader, and + on this provider the workflow's own entries share the log with the + producers' records, so leaving them would count them against every + window and bound the log holds. The stage's hashes stay, status and + offsets included, so a reader that captured the barrier settles it the + same way. + """ + stage = await super().abort_output(manifest) + if stage.records: + await self._client.xdel( + self.stream_key(manifest.stream_key), + *(record.offset.serialize() for record in stage.records), + ) + return stage + + async def _output_stage_from_offsets( + self, + manifest: OutputStageManifest, + status: OutputStageStatus, + encoded_offsets: str, + ) -> OutputStage: + # An aborted stage's entries are gone from the log here, so they are + # stood in for by their positions: the stage still names what it held. + if status is not OutputStageStatus.ABORTED: + return await super()._output_stage_from_offsets( + manifest, status, encoded_offsets + ) + offsets = [Offset(value) for value in encoded_offsets.split(",") if value] + if len(offsets) != manifest.record_count: + raise StreamIntegrityError( + "an output stage's stored offsets do not match its manifest" + ) + return OutputStage( + manifest, + tuple( + OutputStreamRecord(TransportRecordKind.DATA, b"", offset) + for offset in offsets + ), + status, + ) + async def read_range( self, key: StreamKey, first: Offset, last: Offset ) -> list[TransportRecord]: diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 66f511845..9cfe27350 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -905,6 +905,17 @@ async def _handle_cache_eviction( # skips the instance's eviction job entirely, and a Run whose # watchers outlived it would keep a backend connection open forever. self._external_stream_runtimes.pop(act.run_id, None) + # A Run evicted because its completion was not accepted may have + # staged a batch that no marker will ever name. History already + # says so when the task was failed or timed out, so the stage is + # settled here instead of waiting for a reader to find the barrier; + # an undecided one stays pending for the reader, as before. + pending = self._pending_external_output_stages.get(act.run_id) + if pending: + await self._promote_external_output( + run_id=act.run_id, + workflow_id=pending[0].stream_key.workflow_id, + ) self._pending_external_output_stages.pop(act.run_id, None) if self._external_stream_manager is not None: await self._external_stream_manager.evict_run(act.run_id) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 26543701f..b1f3ebc3e 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -43,7 +43,8 @@ StreamProducerError, ) from temporalio.streams._wire import to_wire -from temporalio.streams.providers.redis import RedisStreams, _chain +from temporalio.streams.providers import redis as redis_provider +from temporalio.streams.providers.redis import RedisStreams, _chain, _TopicLogBackend from temporalio.worker import Replayer, Worker from tests.streams.test_streams_conformance import StreamHost, take from tests.streams.test_streams_workflow import ( @@ -1159,3 +1160,56 @@ async def test_a_workflow_reader_at_end_skips_what_was_there_and_replays( assert await asyncio.wait_for(result, 60) == "new" history = await handle.fetch_history() await Replayer(workflows=[FromNowOnGo], plugins=[provider]).replay_workflow(history) + + +async def test_a_batch_staged_for_a_rejected_task_does_not_stay_in_the_log( + live_client: Client, monkeypatch: pytest.MonkeyPatch +): + # The first stage takes longer than the Workflow Task timeout, so the server + # times the task out and the worker's completion is rejected; the run is + # evicted and run again, and the second attempt stages the same batch under + # a new token. The first stage can never be named by a marker. It is + # settled against History when the run is evicted and its entries leave the + # log, so the log holds the batch once and nothing counts the dead one. + class SlowFirstStage(_TopicLogBackend): + delayed = False + + async def stage_output(self, manifest: Any, records: Any) -> Any: + if not SlowFirstStage.delayed: + SlowFirstStage.delayed = True + await asyncio.sleep(3) + return await super().stage_output(manifest, records) + + monkeypatch.setattr(redis_provider, "_TopicLogBackend", SlowFirstStage) + provider = RedisStreams( + url=redis_url(), key_prefix=f"streams-redis-{uuid.uuid4().hex}" + ) + workflow_id = f"streams-redis-rejected-{uuid.uuid4().hex}" + try: + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[OneLine], + plugins=[provider], + ): + handle = await live_client.start_workflow( + OneLine.run, + id=workflow_id, + task_queue=f"tq-{workflow_id}", + task_timeout=timedelta(seconds=1), + ) + await asyncio.wait_for(handle.result(), 60) + assert SlowFirstStage.delayed + # Counted before any reader could settle a barrier: the worker did. + assert ( + await _log_length(provider, live_client, workflow_id, DECISIONS.name) + == 2 + ) + stream = provider.get_stream_handle(live_client, workflow_id) + records = [r async for r in stream.read(topic=DECISIONS)] + assert [(r.kind, r.value) for r in records] == [ + (RecordKind.DATA, {"from": "workflow"}), + (RecordKind.FINISH, None), + ] + finally: + await provider.close() From a7804c250bb13f0a7f42e5a9b37f0053daacc115 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 09:42:16 -0700 Subject: [PATCH 738/831] Declared the reference's optional members nullable on the wire. The SDK writes null for every member a StreamRef does not use, and a generated caller refuses an explicit null on a member the contract did not make nullable, so a ref an operation returns as plain data could not cross a generated converter. --- .../providers/_nexus_generated/models.py | 19 ++++------- .../providers/temporal_streams.nexusrpc.yaml | 12 ++++--- tests/streams/test_nexus_provider.py | 33 +++++++++++++++++++ 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/temporalio/streams/providers/_nexus_generated/models.py b/temporalio/streams/providers/_nexus_generated/models.py index 033cded90..fd4c65fb6 100644 --- a/temporalio/streams/providers/_nexus_generated/models.py +++ b/temporalio/streams/providers/_nexus_generated/models.py @@ -883,9 +883,7 @@ def from_transfer_type( if "workflow_id" in raw: workflow_id_value_raw = raw["workflow_id"] if workflow_id_value_raw is None: - violations.append( - Violation(path="workflow_id", reason="explicit null not allowed") - ) + workflow_id_value = None else: if not isinstance(workflow_id_value_raw, str): violations.append( @@ -898,9 +896,7 @@ def from_transfer_type( if "run_id" in raw: run_id_value_raw = raw["run_id"] if run_id_value_raw is None: - violations.append( - Violation(path="run_id", reason="explicit null not allowed") - ) + run_id_value = None else: if not isinstance(run_id_value_raw, str): violations.append( @@ -913,9 +909,7 @@ def from_transfer_type( if "activity_id" in raw: activity_id_value_raw = raw["activity_id"] if activity_id_value_raw is None: - violations.append( - Violation(path="activity_id", reason="explicit null not allowed") - ) + activity_id_value = None else: if not isinstance(activity_id_value_raw, str): violations.append( @@ -928,9 +922,7 @@ def from_transfer_type( if "stream_id" in raw: stream_id_value_raw = raw["stream_id"] if stream_id_value_raw is None: - violations.append( - Violation(path="stream_id", reason="explicit null not allowed") - ) + stream_id_value = None else: if not isinstance(stream_id_value_raw, str): violations.append( @@ -1006,7 +998,8 @@ class StreamRef: """A stream, named by its owner and a topic: what an operation returns to hand a stream to its caller, and what read and append take in place of an owner spelled out. It names no cursor and no store, so the same reference is good behind any endpoint that - serves the owner. + serves the owner. A member the owner kind does not use is absent or null; null is + how the SDK writes an unset member of its own StreamRef. """ kind: typing.Literal["workflow", "activity", "standalone"] diff --git a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml index 61660c861..1b027cfeb 100644 --- a/temporalio/streams/providers/temporal_streams.nexusrpc.yaml +++ b/temporalio/streams/providers/temporal_streams.nexusrpc.yaml @@ -44,7 +44,9 @@ $defs: A stream, named by its owner and a topic: what an operation returns to hand a stream to its caller, and what read and append take in place of an owner spelled out. It names no cursor and no store, so the same - reference is good behind any endpoint that serves the owner. + reference is good behind any endpoint that serves the owner. A member + the owner kind does not use is absent or null; null is how the SDK + writes an unset member of its own StreamRef. properties: kind: type: string @@ -56,20 +58,20 @@ $defs: A standalone stream has its own stream_id and no execution behind it. workflow_id: - type: string + oneOf: [{ type: string }, { type: "null" }] description: >- The owning workflow, or the workflow that scheduled the owning activity. Required for a workflow owner. run_id: - type: string + oneOf: [{ type: string }, { type: "null" }] description: >- Pin the owner to this run. Absent follows the execution chain across continue-as-new, which is what a producer normally wants. activity_id: - type: string + oneOf: [{ type: string }, { type: "null" }] description: "The owning activity. Required for an activity owner." stream_id: - type: string + oneOf: [{ type: string }, { type: "null" }] description: "The stream's own id. Required for a standalone owner." topic: type: string diff --git a/tests/streams/test_nexus_provider.py b/tests/streams/test_nexus_provider.py index 1a61b5728..efec762c8 100644 --- a/tests/streams/test_nexus_provider.py +++ b/tests/streams/test_nexus_provider.py @@ -986,6 +986,39 @@ async def test_a_handle_names_its_stream_as_a_ref_that_opens_on_the_front( await handler.close() +def test_an_sdk_stream_ref_crosses_the_wire_model_with_its_nulls(): + # The SDK's default converter writes null for every member a ref does not + # use. The wire model declares those members nullable, so a ref an + # operation returned as plain data parses into the same wire reference + # the front builds, and the wire form of that reference reads back as + # the SDK type with nothing lost. + converter = temporalio.converter.DataConverter.default.payload_converter + contract = ( + temporalio.converter.DataConverter.default._get_internal_payload_converter() + ) + for ref in ( + StreamRef.for_workflow("wf", topic=INPUTS), + StreamRef.for_workflow("wf", run_id="r1", topic=INPUTS), + StreamRef.for_activity("act", workflow_id="wf", topic=INPUTS), + StreamRef.for_standalone("s-1", topic=INPUTS), + ): + as_sdk = converter.to_payloads([ref])[0] + assert b"null" in as_sdk.data, as_sdk.data + wire = contract.from_payloads([as_sdk], [WireStreamRef])[0] + assert wire == WireStreamRef( + kind=ref.kind, + topic=ref.topic, + workflow_id=ref.workflow_id, + run_id=ref.run_id, + activity_id=ref.activity_id, + stream_id=ref.stream_id, + ) + back = converter.from_payloads([contract.to_payloads([wire])[0]], [StreamRef])[ + 0 + ] + assert back == ref + + async def test_the_front_refuses_what_the_contract_cannot_carry(): # No create and no seal operation: an owned stream cannot be closed by # anyone, and a standalone stream is created and sealed on the store. From 78aedddd2619e66996bdc599cf871286181b7a94 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 10:01:12 -0700 Subject: [PATCH 739/831] Aborted only History-rejected output stages at eviction. The eviction-time reconcile also recommitted a stage whose marker is authoritative but whose one promotion had failed, which took the repair away from the cold client and broke the post-report commit failure contract. Eviction now applies an abort decision only, and a stage History has committed stays pending for the client. --- temporalio/worker/_workflow.py | 62 ++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 9cfe27350..a723b0fc1 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -905,17 +905,7 @@ async def _handle_cache_eviction( # skips the instance's eviction job entirely, and a Run whose # watchers outlived it would keep a backend connection open forever. self._external_stream_runtimes.pop(act.run_id, None) - # A Run evicted because its completion was not accepted may have - # staged a batch that no marker will ever name. History already - # says so when the task was failed or timed out, so the stage is - # settled here instead of waiting for a reader to find the barrier; - # an undecided one stays pending for the reader, as before. - pending = self._pending_external_output_stages.get(act.run_id) - if pending: - await self._promote_external_output( - run_id=act.run_id, - workflow_id=pending[0].stream_key.workflow_id, - ) + await self._abort_dead_external_output(run_id=act.run_id) self._pending_external_output_stages.pop(act.run_id, None) if self._external_stream_manager is not None: await self._external_stream_manager.evict_run(act.run_id) @@ -1304,6 +1294,56 @@ async def _promote_external_output( else: self._pending_external_output_stages.pop(run_id, None) + async def _abort_dead_external_output(self, *, run_id: str) -> None: + """Abort the staged batches of an evicted Run that History has rejected. + + A Run evicted because its completion was not accepted may have staged + a batch that no marker will ever name. History already says so when + the task was failed or timed out, so such a stage is aborted here + instead of waiting for a reader to find the barrier. A stage whose + marker is authoritative is never re-promoted from here: promotion is + attempted once after the completion, and a stage it left pending is + owed to a cold client's repair, as the contract tests pin down. + """ + backend = self._external_stream_backend + client = self._client + pending = self._pending_external_output_stages.get(run_id) + if backend is None or client is None or not pending: + return + + from temporalio.contrib.external_workflow_streams._output_client import ( + _apply_output_stage_decision, + _history_decision, + _HistoryDecision, + ) + + for manifest in pending: + workflow_id = manifest.stream_key.workflow_id + try: + decision = await _history_decision( + client=client, + workflow_id=workflow_id, + manifest=manifest, + ) + if decision is not _HistoryDecision.ABORT: + continue + await _apply_output_stage_decision( + backend=backend, + manifest=manifest, + decision=decision, + ) + except asyncio.CancelledError: + raise + except Exception as err: + self._stream_metrics.record(err) + logger.warning( + "Could not abort the dead external output stage %s for " + "Workflow %s at eviction; it remains pending for a client", + manifest.stage_token, + workflow_id, + exc_info=True, + ) + def _replay_stream_converters( self, plan: Any ) -> dict[int, temporalio.converter.DataConverter]: From c502b0987deb20bd262537fcac24277a04f1df34 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 11:21:11 -0700 Subject: [PATCH 740/831] Regenerated the vendored protos and the bridge client for the wake. Core moves to the protos-only branch that carries the Wake message, the wakes field on the workflow task poll response and the WakeWorkflowExecution call, so the vendored tree and the bridge client regenerate from the pin. --- temporalio/api/workflow/v1/__init__.py | 2 + temporalio/api/workflow/v1/message_pb2.py | 16 +- temporalio/api/workflow/v1/message_pb2.pyi | 49 + temporalio/api/workflowservice/v1/__init__.py | 4 + .../v1/request_response_pb2.py | 1080 +++++++++-------- .../v1/request_response_pb2.pyi | 94 ++ .../api/workflowservice/v1/service_pb2.py | 8 +- .../workflowservice/v1/service_pb2_grpc.py | 50 + .../workflowservice/v1/service_pb2_grpc.pyi | 22 + temporalio/bridge/sdk-core | 2 +- temporalio/bridge/services_generated.py | 18 + temporalio/bridge/src/client_rpc_generated.rs | 9 + 12 files changed, 826 insertions(+), 528 deletions(-) diff --git a/temporalio/api/workflow/v1/__init__.py b/temporalio/api/workflow/v1/__init__.py index ae647ab67..7f51920fe 100644 --- a/temporalio/api/workflow/v1/__init__.py +++ b/temporalio/api/workflow/v1/__init__.py @@ -14,6 +14,7 @@ ResetPointInfo, ResetPoints, VersioningOverride, + Wake, WorkflowExecutionConfig, WorkflowExecutionExtendedInfo, WorkflowExecutionInfo, @@ -38,6 +39,7 @@ "ResetPointInfo", "ResetPoints", "VersioningOverride", + "Wake", "WorkflowExecutionConfig", "WorkflowExecutionExtendedInfo", "WorkflowExecutionInfo", diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index 032f2b2b5..ae06653d6 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\t"9\n\x04Wake\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x42\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -114,6 +114,7 @@ _WORKFLOWEXECUTIONPAUSEINFO = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionPauseInfo" ] +_WAKE = DESCRIPTOR.message_types_by_name["Wake"] _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR = _VERSIONINGOVERRIDE.enum_types_by_name[ "PinnedOverrideBehavior" ] @@ -458,6 +459,17 @@ ) _sym_db.RegisterMessage(WorkflowExecutionPauseInfo) +Wake = _reflection.GeneratedProtocolMessageType( + "Wake", + (_message.Message,), + { + "DESCRIPTOR": _WAKE, + "__module__": "temporalio.api.workflow.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflow.v1.Wake) + }, +) +_sym_db.RegisterMessage(Wake) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\033io.temporal.api.workflow.v1B\014MessageProtoP\001Z'go.temporal.io/api/workflow/v1;workflow\252\002\032Temporalio.Api.Workflow.V1\352\002\035Temporalio::Api::Workflow::V1" @@ -599,4 +611,6 @@ _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10778 _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10791 _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10902 + _WAKE._serialized_start = 10904 + _WAKE._serialized_end = 10961 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index b390d94f4..1d0703adc 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -2428,3 +2428,52 @@ class WorkflowExecutionPauseInfo(google.protobuf.message.Message): ) -> None: ... global___WorkflowExecutionPauseInfo = WorkflowExecutionPauseInfo + +class Wake(google.protobuf.message.Message): + """A wake tells a running Workflow Execution that something it consumes has + moved, so it should run a Workflow Task and read from its own cursor. It is + a reason to run, not data: nothing is recorded in History and no record + travels with it. A store Temporal does not host sends one after the store + has acknowledged a write. Wakes for the same source fold while one is + pending and no task has received it yet, so a burst of writes costs one + task. Once a task has been handed the wake, a new wake for the source is + accepted again, because only the receiver knows what it read. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SOURCE_FIELD_NUMBER: builtins.int + POSITION_FIELD_NUMBER: builtins.int + COUNTER_FIELD_NUMBER: builtins.int + source: builtins.str + """What moved, as the sender names it. The server folds wakes by this value + and never interprets it. For a stream, the provider formats the stream's + identity, owner and topic, into it. + """ + position: builtins.bytes + """Where the source stands after the write that caused this wake, in the + store's own terms. Opaque to the server and handed to the Workflow as + received. Among wakes folded together, the position with the highest + counter is the one delivered. + """ + counter: builtins.int + """Orders wakes from one source, so that folding keeps the latest position. + Only the source's store can order its positions, so the sender derives + this from the position. It is not a durable identity: a wake sent after + a task received an equal counter is accepted again. + """ + def __init__( + self, + *, + source: builtins.str = ..., + position: builtins.bytes = ..., + counter: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "counter", b"counter", "position", b"position", "source", b"source" + ], + ) -> None: ... + +global___Wake = Wake diff --git a/temporalio/api/workflowservice/v1/__init__.py b/temporalio/api/workflowservice/v1/__init__.py index ab72e6b09..2a3caaf47 100644 --- a/temporalio/api/workflowservice/v1/__init__.py +++ b/temporalio/api/workflowservice/v1/__init__.py @@ -245,6 +245,8 @@ UpdateWorkflowExecutionResponse, ValidateWorkerDeploymentVersionComputeConfigRequest, ValidateWorkerDeploymentVersionComputeConfigResponse, + WakeWorkflowExecutionRequest, + WakeWorkflowExecutionResponse, ) __all__ = [ @@ -494,6 +496,8 @@ "UpdateWorkflowExecutionResponse", "ValidateWorkerDeploymentVersionComputeConfigRequest", "ValidateWorkerDeploymentVersionComputeConfigResponse", + "WakeWorkflowExecutionRequest", + "WakeWorkflowExecutionResponse", ] # gRPC is optional diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index cdf2becc2..fa34931d7 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -134,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -270,6 +270,12 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ "SignalWorkflowExecutionResponse" ] +_WAKEWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ + "WakeWorkflowExecutionRequest" +] +_WAKEWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ + "WakeWorkflowExecutionResponse" +] _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ "SignalWithStartWorkflowExecutionRequest" ] @@ -1438,6 +1444,28 @@ ) _sym_db.RegisterMessage(SignalWorkflowExecutionResponse) +WakeWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( + "WakeWorkflowExecutionRequest", + (_message.Message,), + { + "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionRequest) + }, +) +_sym_db.RegisterMessage(WakeWorkflowExecutionRequest) + +WakeWorkflowExecutionResponse = _reflection.GeneratedProtocolMessageType( + "WakeWorkflowExecutionResponse", + (_message.Message,), + { + "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse) + }, +) +_sym_db.RegisterMessage(WakeWorkflowExecutionResponse) + SignalWithStartWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( "SignalWithStartWorkflowExecutionRequest", (_message.Message,), @@ -4254,541 +4282,545 @@ _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 - _SHUTDOWNWORKERREQUEST._serialized_start = 21102 - _SHUTDOWNWORKERREQUEST._serialized_end = 21385 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 - _QUERYWORKFLOWREQUEST._serialized_start = 21414 - _QUERYWORKFLOWREQUEST._serialized_end = 21647 - _QUERYWORKFLOWRESPONSE._serialized_start = 21650 - _QUERYWORKFLOWRESPONSE._serialized_end = 21835 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 - _GETCLUSTERINFOREQUEST._serialized_start = 24160 - _GETCLUSTERINFOREQUEST._serialized_end = 24183 - _GETCLUSTERINFORESPONSE._serialized_start = 24186 - _GETCLUSTERINFORESPONSE._serialized_end = 24651 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 - _GETSYSTEMINFOREQUEST._serialized_start = 24653 - _GETSYSTEMINFOREQUEST._serialized_end = 24675 - _GETSYSTEMINFORESPONSE._serialized_start = 24678 - _GETSYSTEMINFORESPONSE._serialized_end = 25255 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 - _CREATESCHEDULEREQUEST._serialized_start = 25595 - _CREATESCHEDULEREQUEST._serialized_end = 25927 - _CREATESCHEDULERESPONSE._serialized_start = 25929 - _CREATESCHEDULERESPONSE._serialized_end = 25977 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 - _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 - _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 - _UPDATESCHEDULEREQUEST._serialized_start = 26321 - _UPDATESCHEDULEREQUEST._serialized_end = 26613 - _UPDATESCHEDULERESPONSE._serialized_start = 26615 - _UPDATESCHEDULERESPONSE._serialized_end = 26639 - _PATCHSCHEDULEREQUEST._serialized_start = 26642 - _PATCHSCHEDULEREQUEST._serialized_end = 26798 - _PATCHSCHEDULERESPONSE._serialized_start = 26800 - _PATCHSCHEDULERESPONSE._serialized_end = 26823 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 - _DELETESCHEDULEREQUEST._serialized_start = 27081 - _DELETESCHEDULEREQUEST._serialized_end = 27162 - _DELETESCHEDULERESPONSE._serialized_start = 27164 - _DELETESCHEDULERESPONSE._serialized_end = 27188 - _LISTSCHEDULESREQUEST._serialized_start = 27190 - _LISTSCHEDULESREQUEST._serialized_end = 27298 - _LISTSCHEDULESRESPONSE._serialized_start = 27300 - _LISTSCHEDULESRESPONSE._serialized_end = 27412 - _COUNTSCHEDULESREQUEST._serialized_start = 27414 - _COUNTSCHEDULESREQUEST._serialized_end = 27471 - _COUNTSCHEDULESRESPONSE._serialized_start = 27474 - _COUNTSCHEDULESRESPONSE._serialized_end = 27693 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8320 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8236 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8320 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8323 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9661 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9495 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9590 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9592 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9661 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9664 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9909 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9912 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10437 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10439 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10474 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10477 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10963 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10966 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12147 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12150 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12315 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12317 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12429 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12432 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12639 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12641 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12757 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12760 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13142 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13144 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13182 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13185 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13392 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13394 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13436 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13439 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13885 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13887 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13974 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13977 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14248 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14250 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14341 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14344 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14726 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14728 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14765 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14768 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15056 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15058 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15099 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15102 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15362 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15364 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15404 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15407 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15757 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15759 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15836 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15839 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16023 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16025 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16088 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 16091 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17430 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17433 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17591 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17594 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 18043 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 18045 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 18093 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 18096 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18383 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18385 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18421 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18423 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18545 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18547 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18580 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18583 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18912 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18915 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19045 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19048 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19442 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19445 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19577 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19579 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19688 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19690 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19816 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19818 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19935 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19938 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20072 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 20074 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 20183 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20185 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20311 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20313 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20379 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20382 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20619 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20621 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20649 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20652 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20853 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20769 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20853 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20856 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 21217 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 21219 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 21254 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 21256 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21366 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21368 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21398 + _SHUTDOWNWORKERREQUEST._serialized_start = 21401 + _SHUTDOWNWORKERREQUEST._serialized_end = 21684 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21686 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21710 + _QUERYWORKFLOWREQUEST._serialized_start = 21713 + _QUERYWORKFLOWREQUEST._serialized_end = 21946 + _QUERYWORKFLOWRESPONSE._serialized_start = 21949 + _QUERYWORKFLOWRESPONSE._serialized_end = 22134 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 22136 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 22251 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 22254 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22919 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22922 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23450 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23453 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24457 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 24137 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 24237 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 24239 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24355 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24357 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24457 + _GETCLUSTERINFOREQUEST._serialized_start = 24459 + _GETCLUSTERINFOREQUEST._serialized_end = 24482 + _GETCLUSTERINFORESPONSE._serialized_start = 24485 + _GETCLUSTERINFORESPONSE._serialized_end = 24950 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24895 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24950 + _GETSYSTEMINFOREQUEST._serialized_start = 24952 + _GETSYSTEMINFOREQUEST._serialized_end = 24974 + _GETSYSTEMINFORESPONSE._serialized_start = 24977 + _GETSYSTEMINFORESPONSE._serialized_end = 25554 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 25118 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25554 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25556 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25665 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25668 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25891 + _CREATESCHEDULEREQUEST._serialized_start = 25894 + _CREATESCHEDULEREQUEST._serialized_end = 26226 + _CREATESCHEDULERESPONSE._serialized_start = 26228 + _CREATESCHEDULERESPONSE._serialized_end = 26276 + _DESCRIBESCHEDULEREQUEST._serialized_start = 26278 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26343 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26346 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26617 + _UPDATESCHEDULEREQUEST._serialized_start = 26620 + _UPDATESCHEDULEREQUEST._serialized_end = 26912 + _UPDATESCHEDULERESPONSE._serialized_start = 26914 + _UPDATESCHEDULERESPONSE._serialized_end = 26938 + _PATCHSCHEDULEREQUEST._serialized_start = 26941 + _PATCHSCHEDULEREQUEST._serialized_end = 27097 + _PATCHSCHEDULERESPONSE._serialized_start = 27099 + _PATCHSCHEDULERESPONSE._serialized_end = 27122 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 27125 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 27293 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 27295 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27378 + _DELETESCHEDULEREQUEST._serialized_start = 27380 + _DELETESCHEDULEREQUEST._serialized_end = 27461 + _DELETESCHEDULERESPONSE._serialized_start = 27463 + _DELETESCHEDULERESPONSE._serialized_end = 27487 + _LISTSCHEDULESREQUEST._serialized_start = 27489 + _LISTSCHEDULESREQUEST._serialized_end = 27597 + _LISTSCHEDULESRESPONSE._serialized_start = 27599 + _LISTSCHEDULESRESPONSE._serialized_end = 27711 + _COUNTSCHEDULESREQUEST._serialized_start = 27713 + _COUNTSCHEDULESREQUEST._serialized_end = 27770 + _COUNTSCHEDULESRESPONSE._serialized_start = 27773 + _COUNTSCHEDULESRESPONSE._serialized_end = 27992 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27995 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28641 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28442 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28254 + 28553 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28555 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28628 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28643 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28707 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28709 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28804 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28806 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28922 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28925 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30642 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29977 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29791 + 30090 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 30093 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29923 + 30222 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 30224 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29989 + 30288 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 - _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 - _PAUSEACTIVITYREQUEST._serialized_start = 37249 - _PAUSEACTIVITYREQUEST._serialized_end = 37448 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 - _PAUSEACTIVITYRESPONSE._serialized_start = 37636 - _PAUSEACTIVITYRESPONSE._serialized_end = 37659 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 - _RESETACTIVITYREQUEST._serialized_start = 38318 - _RESETACTIVITYREQUEST._serialized_end = 38625 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 - _RESETACTIVITYRESPONSE._serialized_start = 38920 - _RESETACTIVITYRESPONSE._serialized_end = 38943 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30290 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30396 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30398 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30508 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30510 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30572 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30574 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30629 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30645 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30897 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30899 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30971 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30974 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 31223 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 31226 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31382 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31384 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31498 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31501 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31762 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31765 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 32024 + _STARTBATCHOPERATIONREQUEST._serialized_start = 32027 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33393 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33395 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33424 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33426 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33522 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33524 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33552 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33554 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33620 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33623 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 34095 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 34097 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 34188 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 34190 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34311 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34314 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34499 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34502 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34721 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34724 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 35140 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 35143 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35497 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35500 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35667 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35669 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35704 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35707 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35927 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35929 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35961 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35964 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36336 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 36130 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36336 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36339 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36671 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36465 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36671 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36674 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 37010 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 37013 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37332 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37334 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37434 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37436 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37545 + _PAUSEACTIVITYREQUEST._serialized_start = 37548 + _PAUSEACTIVITYREQUEST._serialized_end = 37747 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37750 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37933 + _PAUSEACTIVITYRESPONSE._serialized_start = 37935 + _PAUSEACTIVITYRESPONSE._serialized_end = 37958 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37960 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37992 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37995 + _UNPAUSEACTIVITYREQUEST._serialized_end = 38275 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38278 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38551 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38553 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38578 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38580 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38614 + _RESETACTIVITYREQUEST._serialized_start = 38617 + _RESETACTIVITYREQUEST._serialized_end = 38924 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38927 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 39217 + _RESETACTIVITYRESPONSE._serialized_start = 39219 + _RESETACTIVITYRESPONSE._serialized_end = 39242 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 39244 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 39276 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 39279 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39563 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39566 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39743 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39745 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39851 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39853 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39950 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39953 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 40147 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 40150 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40802 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40411 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40802 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 24137 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 24237 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40804 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40881 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40884 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 41024 + _LISTDEPLOYMENTSREQUEST._serialized_start = 41026 + _LISTDEPLOYMENTSREQUEST._serialized_end = 41134 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 41136 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 41255 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 41258 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41463 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41466 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41651 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41654 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41883 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41886 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 42077 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 42080 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42329 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42332 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42556 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42558 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42671 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42673 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42729 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42731 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42824 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42827 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43498 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 43002 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43498 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43501 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43741 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43743 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43782 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43785 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43985 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43987 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44026 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 44028 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 44121 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 44123 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 44155 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44158 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44674 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44551 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44674 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44676 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44728 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44731 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45231 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44551 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44674 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45233 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45287 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 45290 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45708 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45623 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45409 + 45708 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 - _LISTWORKERSREQUEST._serialized_start = 47493 - _LISTWORKERSREQUEST._serialized_end = 47623 - _LISTWORKERSRESPONSE._serialized_start = 47626 - _LISTWORKERSRESPONSE._serialized_end = 47791 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45710 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45820 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45823 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 46012 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 46014 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 46113 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 46115 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 46184 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 46186 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 46293 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 46295 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46408 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46411 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46638 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46641 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46821 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46823 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46918 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46920 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46985 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46987 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 47068 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 47070 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 47133 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 47135 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 47163 + _LISTWORKFLOWRULESREQUEST._serialized_start = 47165 + _LISTWORKFLOWRULESREQUEST._serialized_end = 47235 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 47237 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47341 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47344 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47550 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47552 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47598 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47601 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47756 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47758 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47789 + _LISTWORKERSREQUEST._serialized_start = 47792 + _LISTWORKERSREQUEST._serialized_end = 47922 + _LISTWORKERSRESPONSE._serialized_start = 47925 + _LISTWORKERSRESPONSE._serialized_end = 48090 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 48093 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48818 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48660 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48751 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48454 + 48753 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48519 + 48818 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 - _DESCRIBEWORKERREQUEST._serialized_start = 49233 - _DESCRIBEWORKERREQUEST._serialized_end = 49304 - _DESCRIBEWORKERRESPONSE._serialized_start = 49306 - _DESCRIBEWORKERRESPONSE._serialized_end = 49387 - _COUNTWORKERSREQUEST._serialized_start = 49389 - _COUNTWORKERSREQUEST._serialized_end = 49476 - _COUNTWORKERSRESPONSE._serialized_start = 49478 - _COUNTWORKERSRESPONSE._serialized_end = 49515 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48820 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48911 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48914 + _FETCHWORKERCONFIGREQUEST._serialized_end = 49072 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 49074 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 49159 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 49162 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49428 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49430 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49530 + _DESCRIBEWORKERREQUEST._serialized_start = 49532 + _DESCRIBEWORKERREQUEST._serialized_end = 49603 + _DESCRIBEWORKERRESPONSE._serialized_start = 49605 + _DESCRIBEWORKERRESPONSE._serialized_end = 49686 + _COUNTWORKERSREQUEST._serialized_start = 49688 + _COUNTWORKERSREQUEST._serialized_end = 49775 + _COUNTWORKERSRESPONSE._serialized_start = 49777 + _COUNTWORKERSRESPONSE._serialized_end = 49814 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49817 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49958 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49960 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49992 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49995 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 50138 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 50140 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 50174 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 50177 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51354 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51356 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51465 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51468 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51696 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51699 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 52015 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 52017 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 52103 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 52105 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 52221 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 52223 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52332 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52335 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52465 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52468 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53317 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 53267 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53317 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53319 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53390 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53393 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53563 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53566 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53877 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53880 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54041 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54044 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54305 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54307 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54422 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54425 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54564 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54566 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54632 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54635 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54872 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54874 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54946 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54949 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55198 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 55201 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55350 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55352 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55392 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55395 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55540 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55542 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55578 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55580 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55668 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55670 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55703 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55706 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55862 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55864 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55910 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55913 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56065 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56067 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56109 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56111 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56206 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56208 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56247 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 56250 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56407 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56410 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56642 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index e66c90384..ef9e22312 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -1280,6 +1280,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int STREAM_SLICES_FIELD_NUMBER: builtins.int + WAKES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1403,6 +1404,17 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): """Stream data attached to this task. Delivered out of band so the payloads never enter History; only the offset ranges are recorded there. """ + @property + def wakes( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.workflow.v1.message_pb2.Wake + ]: + """Wakes pending for this execution when the task started, folded by + source. Not recorded in History and never re-supplied on replay: the + Workflow treats one as a reason to read its source now and records what + it read itself. + """ def __init__( self, *, @@ -1442,6 +1454,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): temporalio.api.stream.v1.message_pb2.StreamSlice ] | None = ..., + wakes: collections.abc.Iterable[temporalio.api.workflow.v1.message_pb2.Wake] + | None = ..., ) -> None: ... def HasField( self, @@ -1503,6 +1517,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"stream_slices", "task_token", b"task_token", + "wakes", + b"wakes", "workflow_execution", b"workflow_execution", "workflow_execution_task_queue", @@ -3318,6 +3334,84 @@ class SignalWorkflowExecutionResponse(google.protobuf.message.Message): global___SignalWorkflowExecutionResponse = SignalWorkflowExecutionResponse +class WakeWorkflowExecutionRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + WAKE_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + namespace: builtins.str + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """The Workflow to wake. `run_id` is optional. When set, the wake goes to + the current run of the chain that run belongs to, so a sender that + learned a run id before a continue-as-new still reaches the consumer, + and it is refused with NotFound once that chain has ended. When unset, + the wake goes to the current run under the Workflow Id, whichever chain. + """ + @property + def wake(self) -> temporalio.api.workflow.v1.message_pb2.Wake: ... + identity: builtins.str + """The identity of the sender, for metrics and logs.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., + wake: temporalio.api.workflow.v1.message_pb2.Wake | None = ..., + identity: builtins.str = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "wake", b"wake", "workflow_execution", b"workflow_execution" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "identity", + b"identity", + "namespace", + b"namespace", + "wake", + b"wake", + "workflow_execution", + b"workflow_execution", + ], + ) -> None: ... + +global___WakeWorkflowExecutionRequest = WakeWorkflowExecutionRequest + +class WakeWorkflowExecutionResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + FOLDED_FIELD_NUMBER: builtins.int + run_id: builtins.str + """The run the wake was stored on.""" + folded: builtins.bool + """True when a wake for the source was already pending and no task had + received it yet, so this one changed nothing but possibly the position + and no new task results from it. + """ + def __init__( + self, + *, + run_id: builtins.str = ..., + folded: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal["folded", b"folded", "run_id", b"run_id"], + ) -> None: ... + +global___WakeWorkflowExecutionResponse = WakeWorkflowExecutionResponse + class SignalWithStartWorkflowExecutionRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index 92da5d6c2..6107f7a24 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xdc\xb2\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xa0\xb5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -135,6 +135,10 @@ _WORKFLOWSERVICE.methods_by_name[ "SignalWorkflowExecution" ]._serialized_options = b'\202\323\344\223\002\301\001"W/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}' + _WORKFLOWSERVICE.methods_by_name["WakeWorkflowExecution"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "WakeWorkflowExecution" + ]._serialized_options = b'\202\323\344\223\002\241\001"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*' _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -526,5 +530,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 39510 + _WORKFLOWSERVICE._serialized_end = 39834 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.py b/temporalio/api/workflowservice/v1/service_pb2_grpc.py index ac29720a3..5e86252af 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.py +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.py @@ -143,6 +143,11 @@ def __init__(self, channel): request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.SerializeToString, response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.FromString, ) + self.WakeWorkflowExecution = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, + ) self.SignalWithStartWorkflowExecution = channel.unary_unary( "/temporal.api.workflowservice.v1.WorkflowService/SignalWithStartWorkflowExecution", request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.SerializeToString, @@ -937,6 +942,17 @@ def SignalWorkflowExecution(self, request, context): context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") + def WakeWorkflowExecution(self, request, context): + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + def SignalWithStartWorkflowExecution(self, request, context): """SignalWithStartWorkflowExecution is used to ensure a signal is sent to a workflow, even if it isn't yet started. @@ -2038,6 +2054,11 @@ def add_WorkflowServiceServicer_to_server(servicer, server): request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.FromString, response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.SerializeToString, ), + "WakeWorkflowExecution": grpc.unary_unary_rpc_method_handler( + servicer.WakeWorkflowExecution, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.SerializeToString, + ), "SignalWithStartWorkflowExecution": grpc.unary_unary_rpc_method_handler( servicer.SignalWithStartWorkflowExecution, request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.FromString, @@ -3227,6 +3248,35 @@ def SignalWorkflowExecution( metadata, ) + @staticmethod + def WakeWorkflowExecution( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + @staticmethod def SignalWithStartWorkflowExecution( request, diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi index b743a159c..7df4ff12b 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi @@ -279,6 +279,16 @@ class WorkflowServiceStub: This results in a `WORKFLOW_EXECUTION_SIGNALED` event recorded in the history and a workflow task being created for the execution. """ + WakeWorkflowExecution: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, + temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse, + ] + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ SignalWithStartWorkflowExecution: grpc.UnaryUnaryMultiCallable[ temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, @@ -1482,6 +1492,18 @@ class WorkflowServiceServicer(metaclass=abc.ABCMeta): task being created for the execution. """ @abc.abstractmethod + def WakeWorkflowExecution( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse: + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ + @abc.abstractmethod def SignalWithStartWorkflowExecution( self, request: temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 0b6992495..3fafca0b1 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 0b6992495d9a81631e5098041b2122e5a8bd699b +Subproject commit 3fafca0b13c23b61565231a7810ba0749e559793 diff --git a/temporalio/bridge/services_generated.py b/temporalio/bridge/services_generated.py index c9960fcb5..fdd706cf4 100644 --- a/temporalio/bridge/services_generated.py +++ b/temporalio/bridge/services_generated.py @@ -2243,6 +2243,24 @@ async def validate_worker_deployment_version_compute_config( timeout=timeout, ) + async def wake_workflow_execution( + self, + req: temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse: + """Invokes the WorkflowService.wake_workflow_execution rpc method.""" + return await self._client._rpc_call( + rpc="wake_workflow_execution", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + class OperatorService: """RPC calls for the OperatorService.""" diff --git a/temporalio/bridge/src/client_rpc_generated.rs b/temporalio/bridge/src/client_rpc_generated.rs index ea00d4fd5..3017217c0 100644 --- a/temporalio/bridge/src/client_rpc_generated.rs +++ b/temporalio/bridge/src/client_rpc_generated.rs @@ -1127,6 +1127,15 @@ impl ClientRef { validate_worker_deployment_version_compute_config ) } + "wake_workflow_execution" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + wake_workflow_execution + ) + } _ => { return Err(PyValueError::new_err(format!( "Unknown RPC call {}", From 85f36187ace185f1a9b78eb99360af4c71f07c43 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 11:33:21 -0700 Subject: [PATCH 741/831] Repinned Core for the wake protos. The Core head carries the WakeWorkflowExecution call, so the vendored api and the bridge client are regenerated from it. --- temporalio/api/workflow/v1/__init__.py | 2 + temporalio/api/workflow/v1/message_pb2.py | 16 +- temporalio/api/workflow/v1/message_pb2.pyi | 49 + temporalio/api/workflowservice/v1/__init__.py | 4 + .../v1/request_response_pb2.py | 1080 +++++++++-------- .../v1/request_response_pb2.pyi | 94 ++ .../api/workflowservice/v1/service_pb2.py | 8 +- .../workflowservice/v1/service_pb2_grpc.py | 50 + .../workflowservice/v1/service_pb2_grpc.pyi | 22 + temporalio/bridge/sdk-core | 2 +- temporalio/bridge/services_generated.py | 18 + temporalio/bridge/src/client_rpc_generated.rs | 9 + 12 files changed, 826 insertions(+), 528 deletions(-) diff --git a/temporalio/api/workflow/v1/__init__.py b/temporalio/api/workflow/v1/__init__.py index ae647ab67..7f51920fe 100644 --- a/temporalio/api/workflow/v1/__init__.py +++ b/temporalio/api/workflow/v1/__init__.py @@ -14,6 +14,7 @@ ResetPointInfo, ResetPoints, VersioningOverride, + Wake, WorkflowExecutionConfig, WorkflowExecutionExtendedInfo, WorkflowExecutionInfo, @@ -38,6 +39,7 @@ "ResetPointInfo", "ResetPoints", "VersioningOverride", + "Wake", "WorkflowExecutionConfig", "WorkflowExecutionExtendedInfo", "WorkflowExecutionInfo", diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index 032f2b2b5..ae06653d6 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\t"9\n\x04Wake\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x42\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -114,6 +114,7 @@ _WORKFLOWEXECUTIONPAUSEINFO = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionPauseInfo" ] +_WAKE = DESCRIPTOR.message_types_by_name["Wake"] _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR = _VERSIONINGOVERRIDE.enum_types_by_name[ "PinnedOverrideBehavior" ] @@ -458,6 +459,17 @@ ) _sym_db.RegisterMessage(WorkflowExecutionPauseInfo) +Wake = _reflection.GeneratedProtocolMessageType( + "Wake", + (_message.Message,), + { + "DESCRIPTOR": _WAKE, + "__module__": "temporalio.api.workflow.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflow.v1.Wake) + }, +) +_sym_db.RegisterMessage(Wake) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\033io.temporal.api.workflow.v1B\014MessageProtoP\001Z'go.temporal.io/api/workflow/v1;workflow\252\002\032Temporalio.Api.Workflow.V1\352\002\035Temporalio::Api::Workflow::V1" @@ -599,4 +611,6 @@ _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10778 _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10791 _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10902 + _WAKE._serialized_start = 10904 + _WAKE._serialized_end = 10961 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index b390d94f4..1d0703adc 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -2428,3 +2428,52 @@ class WorkflowExecutionPauseInfo(google.protobuf.message.Message): ) -> None: ... global___WorkflowExecutionPauseInfo = WorkflowExecutionPauseInfo + +class Wake(google.protobuf.message.Message): + """A wake tells a running Workflow Execution that something it consumes has + moved, so it should run a Workflow Task and read from its own cursor. It is + a reason to run, not data: nothing is recorded in History and no record + travels with it. A store Temporal does not host sends one after the store + has acknowledged a write. Wakes for the same source fold while one is + pending and no task has received it yet, so a burst of writes costs one + task. Once a task has been handed the wake, a new wake for the source is + accepted again, because only the receiver knows what it read. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SOURCE_FIELD_NUMBER: builtins.int + POSITION_FIELD_NUMBER: builtins.int + COUNTER_FIELD_NUMBER: builtins.int + source: builtins.str + """What moved, as the sender names it. The server folds wakes by this value + and never interprets it. For a stream, the provider formats the stream's + identity, owner and topic, into it. + """ + position: builtins.bytes + """Where the source stands after the write that caused this wake, in the + store's own terms. Opaque to the server and handed to the Workflow as + received. Among wakes folded together, the position with the highest + counter is the one delivered. + """ + counter: builtins.int + """Orders wakes from one source, so that folding keeps the latest position. + Only the source's store can order its positions, so the sender derives + this from the position. It is not a durable identity: a wake sent after + a task received an equal counter is accepted again. + """ + def __init__( + self, + *, + source: builtins.str = ..., + position: builtins.bytes = ..., + counter: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "counter", b"counter", "position", b"position", "source", b"source" + ], + ) -> None: ... + +global___Wake = Wake diff --git a/temporalio/api/workflowservice/v1/__init__.py b/temporalio/api/workflowservice/v1/__init__.py index ab72e6b09..2a3caaf47 100644 --- a/temporalio/api/workflowservice/v1/__init__.py +++ b/temporalio/api/workflowservice/v1/__init__.py @@ -245,6 +245,8 @@ UpdateWorkflowExecutionResponse, ValidateWorkerDeploymentVersionComputeConfigRequest, ValidateWorkerDeploymentVersionComputeConfigResponse, + WakeWorkflowExecutionRequest, + WakeWorkflowExecutionResponse, ) __all__ = [ @@ -494,6 +496,8 @@ "UpdateWorkflowExecutionResponse", "ValidateWorkerDeploymentVersionComputeConfigRequest", "ValidateWorkerDeploymentVersionComputeConfigResponse", + "WakeWorkflowExecutionRequest", + "WakeWorkflowExecutionResponse", ] # gRPC is optional diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index cdf2becc2..fa34931d7 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -134,7 +134,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -270,6 +270,12 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ "SignalWorkflowExecutionResponse" ] +_WAKEWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ + "WakeWorkflowExecutionRequest" +] +_WAKEWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ + "WakeWorkflowExecutionResponse" +] _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ "SignalWithStartWorkflowExecutionRequest" ] @@ -1438,6 +1444,28 @@ ) _sym_db.RegisterMessage(SignalWorkflowExecutionResponse) +WakeWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( + "WakeWorkflowExecutionRequest", + (_message.Message,), + { + "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionRequest) + }, +) +_sym_db.RegisterMessage(WakeWorkflowExecutionRequest) + +WakeWorkflowExecutionResponse = _reflection.GeneratedProtocolMessageType( + "WakeWorkflowExecutionResponse", + (_message.Message,), + { + "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse) + }, +) +_sym_db.RegisterMessage(WakeWorkflowExecutionResponse) + SignalWithStartWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( "SignalWithStartWorkflowExecutionRequest", (_message.Message,), @@ -4254,541 +4282,545 @@ _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8273 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8189 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8273 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8276 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9614 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9448 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9543 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9545 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9614 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9617 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9862 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9865 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10390 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10392 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10427 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10430 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10916 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10919 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12100 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12103 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12268 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12270 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12382 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12385 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12592 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12594 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12710 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12713 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13095 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13097 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13135 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13138 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13345 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13347 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13389 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13392 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13838 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13840 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13927 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13930 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14201 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14203 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14294 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14297 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14679 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14681 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14718 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14721 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15009 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15011 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15052 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15055 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15315 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15317 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15357 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15360 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15710 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15712 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15789 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15792 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17131 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17134 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17292 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17295 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17744 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17746 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17794 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17797 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18084 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18086 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18122 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18124 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18246 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18248 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18281 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18284 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18613 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18616 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18746 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18749 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19143 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19146 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19278 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19280 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19389 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19391 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19517 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19519 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19636 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19639 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19773 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19775 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 19884 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19886 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20012 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20014 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20080 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20083 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20320 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20322 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20350 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20353 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20554 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20470 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20554 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20557 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 20918 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 20920 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 20955 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 20957 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21067 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21069 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21099 - _SHUTDOWNWORKERREQUEST._serialized_start = 21102 - _SHUTDOWNWORKERREQUEST._serialized_end = 21385 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21387 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21411 - _QUERYWORKFLOWREQUEST._serialized_start = 21414 - _QUERYWORKFLOWREQUEST._serialized_end = 21647 - _QUERYWORKFLOWRESPONSE._serialized_start = 21650 - _QUERYWORKFLOWRESPONSE._serialized_end = 21835 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 21837 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 21952 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 21955 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22620 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22623 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23151 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23154 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24158 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 23940 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24056 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24058 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24158 - _GETCLUSTERINFOREQUEST._serialized_start = 24160 - _GETCLUSTERINFOREQUEST._serialized_end = 24183 - _GETCLUSTERINFORESPONSE._serialized_start = 24186 - _GETCLUSTERINFORESPONSE._serialized_end = 24651 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24596 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24651 - _GETSYSTEMINFOREQUEST._serialized_start = 24653 - _GETSYSTEMINFOREQUEST._serialized_end = 24675 - _GETSYSTEMINFORESPONSE._serialized_start = 24678 - _GETSYSTEMINFORESPONSE._serialized_end = 25255 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24819 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25255 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25257 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25366 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25369 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25592 - _CREATESCHEDULEREQUEST._serialized_start = 25595 - _CREATESCHEDULEREQUEST._serialized_end = 25927 - _CREATESCHEDULERESPONSE._serialized_start = 25929 - _CREATESCHEDULERESPONSE._serialized_end = 25977 - _DESCRIBESCHEDULEREQUEST._serialized_start = 25979 - _DESCRIBESCHEDULEREQUEST._serialized_end = 26044 - _DESCRIBESCHEDULERESPONSE._serialized_start = 26047 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26318 - _UPDATESCHEDULEREQUEST._serialized_start = 26321 - _UPDATESCHEDULEREQUEST._serialized_end = 26613 - _UPDATESCHEDULERESPONSE._serialized_start = 26615 - _UPDATESCHEDULERESPONSE._serialized_end = 26639 - _PATCHSCHEDULEREQUEST._serialized_start = 26642 - _PATCHSCHEDULEREQUEST._serialized_end = 26798 - _PATCHSCHEDULERESPONSE._serialized_start = 26800 - _PATCHSCHEDULERESPONSE._serialized_end = 26823 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26826 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 26994 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 26996 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27079 - _DELETESCHEDULEREQUEST._serialized_start = 27081 - _DELETESCHEDULEREQUEST._serialized_end = 27162 - _DELETESCHEDULERESPONSE._serialized_start = 27164 - _DELETESCHEDULERESPONSE._serialized_end = 27188 - _LISTSCHEDULESREQUEST._serialized_start = 27190 - _LISTSCHEDULESREQUEST._serialized_end = 27298 - _LISTSCHEDULESRESPONSE._serialized_start = 27300 - _LISTSCHEDULESRESPONSE._serialized_end = 27412 - _COUNTSCHEDULESREQUEST._serialized_start = 27414 - _COUNTSCHEDULESREQUEST._serialized_end = 27471 - _COUNTSCHEDULESRESPONSE._serialized_start = 27474 - _COUNTSCHEDULESRESPONSE._serialized_end = 27693 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27696 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28342 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28143 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8320 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8236 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8320 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8323 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9661 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9495 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9590 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9592 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9661 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9664 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9909 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9912 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10437 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10439 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10474 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10477 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10963 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10966 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12147 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12150 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12315 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12317 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12429 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12432 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12639 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12641 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12757 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12760 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13142 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13144 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13182 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13185 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13392 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13394 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13436 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13439 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13885 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13887 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13974 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13977 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14248 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14250 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14341 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14344 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14726 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14728 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14765 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14768 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15056 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15058 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15099 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15102 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15362 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15364 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15404 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15407 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15757 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15759 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15836 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15839 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16023 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16025 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16088 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 16091 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17430 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17433 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17591 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17594 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 18043 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 18045 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 18093 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 18096 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18383 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18385 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18421 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18423 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18545 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18547 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18580 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18583 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18912 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18915 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19045 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19048 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19442 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19445 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19577 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19579 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19688 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19690 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19816 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19818 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19935 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19938 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20072 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 20074 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 20183 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20185 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20311 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20313 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20379 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20382 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20619 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20621 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20649 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20652 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20853 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20769 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20853 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20856 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 21217 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 21219 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 21254 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 21256 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21366 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21368 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21398 + _SHUTDOWNWORKERREQUEST._serialized_start = 21401 + _SHUTDOWNWORKERREQUEST._serialized_end = 21684 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21686 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21710 + _QUERYWORKFLOWREQUEST._serialized_start = 21713 + _QUERYWORKFLOWREQUEST._serialized_end = 21946 + _QUERYWORKFLOWRESPONSE._serialized_start = 21949 + _QUERYWORKFLOWRESPONSE._serialized_end = 22134 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 22136 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 22251 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 22254 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22919 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 22922 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23450 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23453 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24457 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 24137 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 24237 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 24239 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24355 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24357 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24457 + _GETCLUSTERINFOREQUEST._serialized_start = 24459 + _GETCLUSTERINFOREQUEST._serialized_end = 24482 + _GETCLUSTERINFORESPONSE._serialized_start = 24485 + _GETCLUSTERINFORESPONSE._serialized_end = 24950 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24895 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24950 + _GETSYSTEMINFOREQUEST._serialized_start = 24952 + _GETSYSTEMINFOREQUEST._serialized_end = 24974 + _GETSYSTEMINFORESPONSE._serialized_start = 24977 + _GETSYSTEMINFORESPONSE._serialized_end = 25554 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 25118 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25554 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25556 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25665 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25668 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25891 + _CREATESCHEDULEREQUEST._serialized_start = 25894 + _CREATESCHEDULEREQUEST._serialized_end = 26226 + _CREATESCHEDULERESPONSE._serialized_start = 26228 + _CREATESCHEDULERESPONSE._serialized_end = 26276 + _DESCRIBESCHEDULEREQUEST._serialized_start = 26278 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26343 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26346 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26617 + _UPDATESCHEDULEREQUEST._serialized_start = 26620 + _UPDATESCHEDULEREQUEST._serialized_end = 26912 + _UPDATESCHEDULERESPONSE._serialized_start = 26914 + _UPDATESCHEDULERESPONSE._serialized_end = 26938 + _PATCHSCHEDULEREQUEST._serialized_start = 26941 + _PATCHSCHEDULEREQUEST._serialized_end = 27097 + _PATCHSCHEDULERESPONSE._serialized_start = 27099 + _PATCHSCHEDULERESPONSE._serialized_end = 27122 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 27125 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 27293 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 27295 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27378 + _DELETESCHEDULEREQUEST._serialized_start = 27380 + _DELETESCHEDULEREQUEST._serialized_end = 27461 + _DELETESCHEDULERESPONSE._serialized_start = 27463 + _DELETESCHEDULERESPONSE._serialized_end = 27487 + _LISTSCHEDULESREQUEST._serialized_start = 27489 + _LISTSCHEDULESREQUEST._serialized_end = 27597 + _LISTSCHEDULESRESPONSE._serialized_start = 27599 + _LISTSCHEDULESRESPONSE._serialized_end = 27711 + _COUNTSCHEDULESREQUEST._serialized_start = 27713 + _COUNTSCHEDULESREQUEST._serialized_end = 27770 + _COUNTSCHEDULESRESPONSE._serialized_start = 27773 + _COUNTSCHEDULESRESPONSE._serialized_end = 27992 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27995 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28641 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28442 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28254 + 28553 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28256 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28329 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28344 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28408 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28410 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28505 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28507 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28623 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28626 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30343 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29678 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28555 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28628 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28643 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28707 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28709 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28804 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28806 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28922 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28925 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30642 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29977 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29791 + 30090 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29794 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 30093 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29923 + 30222 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 29925 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 30224 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 29989 + 30288 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 29991 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30097 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30099 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30209 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30211 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30273 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30275 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30330 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30346 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30598 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30600 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30672 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30675 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 30924 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 30927 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31083 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31085 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31199 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31202 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31463 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31466 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31725 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31728 - _STARTBATCHOPERATIONREQUEST._serialized_end = 33094 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 33096 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33125 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33127 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33223 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33225 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33253 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33255 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33321 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33324 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33796 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33798 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 33889 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 33891 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34012 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34015 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34200 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34203 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34422 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34425 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 34841 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 34844 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35198 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35201 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35368 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35370 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35405 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35408 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35628 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35630 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35662 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35665 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36037 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 35831 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36037 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36040 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36372 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36166 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36372 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36375 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36711 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36714 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37033 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37035 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37135 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37137 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37246 - _PAUSEACTIVITYREQUEST._serialized_start = 37249 - _PAUSEACTIVITYREQUEST._serialized_end = 37448 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37451 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37634 - _PAUSEACTIVITYRESPONSE._serialized_start = 37636 - _PAUSEACTIVITYRESPONSE._serialized_end = 37659 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37661 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37693 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37696 - _UNPAUSEACTIVITYREQUEST._serialized_end = 37976 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37979 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38252 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38254 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38279 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38281 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38315 - _RESETACTIVITYREQUEST._serialized_start = 38318 - _RESETACTIVITYREQUEST._serialized_end = 38625 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38628 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 38918 - _RESETACTIVITYRESPONSE._serialized_start = 38920 - _RESETACTIVITYRESPONSE._serialized_end = 38943 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 38945 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 38977 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 38980 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39264 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39267 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39444 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39446 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39552 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39554 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39651 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39654 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 39848 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 39851 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40503 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40112 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40503 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 23838 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 23938 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40505 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40582 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40585 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40725 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40727 - _LISTDEPLOYMENTSREQUEST._serialized_end = 40835 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 40837 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 40956 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 40959 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41164 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41167 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41352 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41355 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41584 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41587 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41778 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41781 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42030 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42033 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42257 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42259 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42372 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42374 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42430 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42432 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42525 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42528 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43199 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42703 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43199 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43202 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43442 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43444 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43483 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43486 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43686 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43688 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43727 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43729 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43822 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43824 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 43856 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 43859 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44375 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44377 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44429 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44432 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44932 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44252 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44375 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44934 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44988 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 44991 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45409 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45324 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30290 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30396 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30398 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30508 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30510 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30572 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30574 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30629 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30645 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30897 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30899 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30971 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30974 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 31223 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 31226 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31382 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31384 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31498 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31501 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31762 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31765 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 32024 + _STARTBATCHOPERATIONREQUEST._serialized_start = 32027 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33393 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33395 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33424 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33426 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33522 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33524 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33552 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33554 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33620 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33623 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 34095 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 34097 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 34188 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 34190 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34311 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34314 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34499 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34502 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34721 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34724 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 35140 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 35143 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35497 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35500 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35667 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35669 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35704 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35707 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35927 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35929 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35961 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35964 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36336 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 36130 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36336 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36339 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36671 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36465 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36671 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36674 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 37010 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 37013 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37332 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37334 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37434 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37436 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37545 + _PAUSEACTIVITYREQUEST._serialized_start = 37548 + _PAUSEACTIVITYREQUEST._serialized_end = 37747 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37750 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37933 + _PAUSEACTIVITYRESPONSE._serialized_start = 37935 + _PAUSEACTIVITYRESPONSE._serialized_end = 37958 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37960 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37992 + _UNPAUSEACTIVITYREQUEST._serialized_start = 37995 + _UNPAUSEACTIVITYREQUEST._serialized_end = 38275 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38278 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38551 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38553 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38578 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38580 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38614 + _RESETACTIVITYREQUEST._serialized_start = 38617 + _RESETACTIVITYREQUEST._serialized_end = 38924 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38927 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 39217 + _RESETACTIVITYRESPONSE._serialized_start = 39219 + _RESETACTIVITYRESPONSE._serialized_end = 39242 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 39244 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 39276 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 39279 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39563 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39566 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39743 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39745 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39851 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39853 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39950 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39953 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 40147 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 40150 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40802 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40411 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40802 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 24137 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 24237 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40804 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40881 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40884 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 41024 + _LISTDEPLOYMENTSREQUEST._serialized_start = 41026 + _LISTDEPLOYMENTSREQUEST._serialized_end = 41134 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 41136 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 41255 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 41258 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41463 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41466 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41651 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41654 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41883 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41886 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 42077 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 42080 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42329 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42332 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42556 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42558 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42671 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42673 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42729 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42731 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42824 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42827 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43498 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 43002 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43498 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43501 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43741 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43743 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43782 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43785 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43985 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43987 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44026 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 44028 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 44121 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 44123 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 44155 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44158 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44674 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44551 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44674 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44676 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44728 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44731 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45231 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44551 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44674 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45233 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45287 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 45290 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45708 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45623 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45409 + 45708 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45411 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45521 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45524 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45713 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45715 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45814 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45816 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 45885 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 45887 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 45994 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 45996 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46109 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46112 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46339 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46342 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46522 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46524 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46619 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46621 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46686 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46688 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46769 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46771 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 46834 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 46836 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 46864 - _LISTWORKFLOWRULESREQUEST._serialized_start = 46866 - _LISTWORKFLOWRULESREQUEST._serialized_end = 46936 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 46938 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 47042 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47045 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47251 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47253 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47299 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47302 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47457 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47459 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47490 - _LISTWORKERSREQUEST._serialized_start = 47493 - _LISTWORKERSREQUEST._serialized_end = 47623 - _LISTWORKERSRESPONSE._serialized_start = 47626 - _LISTWORKERSRESPONSE._serialized_end = 47791 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47794 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48519 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48361 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48452 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45710 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45820 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45823 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 46012 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 46014 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 46113 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 46115 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 46184 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 46186 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 46293 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 46295 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46408 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46411 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46638 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46641 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46821 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46823 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 46918 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46920 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46985 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46987 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 47068 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 47070 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 47133 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 47135 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 47163 + _LISTWORKFLOWRULESREQUEST._serialized_start = 47165 + _LISTWORKFLOWRULESREQUEST._serialized_end = 47235 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 47237 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47341 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47344 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47550 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47552 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47598 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47601 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47756 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47758 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47789 + _LISTWORKERSREQUEST._serialized_start = 47792 + _LISTWORKERSREQUEST._serialized_end = 47922 + _LISTWORKERSRESPONSE._serialized_start = 47925 + _LISTWORKERSRESPONSE._serialized_end = 48090 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 48093 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48818 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48660 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48751 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48454 + 48753 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48519 + 48818 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48521 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48612 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48615 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48773 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48775 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 48860 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 48863 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49129 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49131 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49231 - _DESCRIBEWORKERREQUEST._serialized_start = 49233 - _DESCRIBEWORKERREQUEST._serialized_end = 49304 - _DESCRIBEWORKERRESPONSE._serialized_start = 49306 - _DESCRIBEWORKERRESPONSE._serialized_end = 49387 - _COUNTWORKERSREQUEST._serialized_start = 49389 - _COUNTWORKERSREQUEST._serialized_end = 49476 - _COUNTWORKERSRESPONSE._serialized_start = 49478 - _COUNTWORKERSRESPONSE._serialized_end = 49515 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49518 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49659 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49661 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49693 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49696 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49839 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49841 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49875 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 49878 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51055 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51057 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51166 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51169 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51397 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51400 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51716 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51718 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51804 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51806 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 51922 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 51924 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52033 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52036 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52166 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52169 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53018 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 52968 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53018 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53020 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53091 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53094 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53264 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53267 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53578 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53581 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53742 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53745 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54006 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54008 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54123 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54126 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54265 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54267 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54333 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54336 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54573 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54575 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54647 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54650 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54899 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20232 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20320 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 54902 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55051 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55053 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55093 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55096 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55241 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55243 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55279 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55281 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55369 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55371 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55404 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55407 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55563 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55565 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55611 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55614 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55766 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55768 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55810 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55812 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55907 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55909 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55948 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 55951 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56108 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56111 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56343 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48820 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48911 + _FETCHWORKERCONFIGREQUEST._serialized_start = 48914 + _FETCHWORKERCONFIGREQUEST._serialized_end = 49072 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 49074 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 49159 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 49162 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49428 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49430 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49530 + _DESCRIBEWORKERREQUEST._serialized_start = 49532 + _DESCRIBEWORKERREQUEST._serialized_end = 49603 + _DESCRIBEWORKERRESPONSE._serialized_start = 49605 + _DESCRIBEWORKERRESPONSE._serialized_end = 49686 + _COUNTWORKERSREQUEST._serialized_start = 49688 + _COUNTWORKERSREQUEST._serialized_end = 49775 + _COUNTWORKERSRESPONSE._serialized_start = 49777 + _COUNTWORKERSRESPONSE._serialized_end = 49814 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49817 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49958 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49960 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49992 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49995 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 50138 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 50140 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 50174 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 50177 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51354 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51356 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51465 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51468 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51696 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51699 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 52015 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 52017 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 52103 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 52105 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 52221 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 52223 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52332 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52335 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52465 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52468 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53317 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 53267 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53317 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53319 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53390 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53393 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53563 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53566 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53877 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53880 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54041 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54044 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54305 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54307 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54422 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54425 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54564 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54566 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54632 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54635 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54872 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54874 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54946 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54949 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55198 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 55201 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55350 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55352 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55392 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55395 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55540 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55542 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55578 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55580 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55668 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55670 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55703 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55706 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55862 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55864 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55910 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55913 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56065 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56067 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56109 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56111 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56206 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56208 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56247 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 56250 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56407 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56410 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56642 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index e66c90384..ef9e22312 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -1280,6 +1280,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int STREAM_SLICES_FIELD_NUMBER: builtins.int + WAKES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1403,6 +1404,17 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): """Stream data attached to this task. Delivered out of band so the payloads never enter History; only the offset ranges are recorded there. """ + @property + def wakes( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.workflow.v1.message_pb2.Wake + ]: + """Wakes pending for this execution when the task started, folded by + source. Not recorded in History and never re-supplied on replay: the + Workflow treats one as a reason to read its source now and records what + it read itself. + """ def __init__( self, *, @@ -1442,6 +1454,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): temporalio.api.stream.v1.message_pb2.StreamSlice ] | None = ..., + wakes: collections.abc.Iterable[temporalio.api.workflow.v1.message_pb2.Wake] + | None = ..., ) -> None: ... def HasField( self, @@ -1503,6 +1517,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"stream_slices", "task_token", b"task_token", + "wakes", + b"wakes", "workflow_execution", b"workflow_execution", "workflow_execution_task_queue", @@ -3318,6 +3334,84 @@ class SignalWorkflowExecutionResponse(google.protobuf.message.Message): global___SignalWorkflowExecutionResponse = SignalWorkflowExecutionResponse +class WakeWorkflowExecutionRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + WAKE_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + namespace: builtins.str + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """The Workflow to wake. `run_id` is optional. When set, the wake goes to + the current run of the chain that run belongs to, so a sender that + learned a run id before a continue-as-new still reaches the consumer, + and it is refused with NotFound once that chain has ended. When unset, + the wake goes to the current run under the Workflow Id, whichever chain. + """ + @property + def wake(self) -> temporalio.api.workflow.v1.message_pb2.Wake: ... + identity: builtins.str + """The identity of the sender, for metrics and logs.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., + wake: temporalio.api.workflow.v1.message_pb2.Wake | None = ..., + identity: builtins.str = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "wake", b"wake", "workflow_execution", b"workflow_execution" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "identity", + b"identity", + "namespace", + b"namespace", + "wake", + b"wake", + "workflow_execution", + b"workflow_execution", + ], + ) -> None: ... + +global___WakeWorkflowExecutionRequest = WakeWorkflowExecutionRequest + +class WakeWorkflowExecutionResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + FOLDED_FIELD_NUMBER: builtins.int + run_id: builtins.str + """The run the wake was stored on.""" + folded: builtins.bool + """True when a wake for the source was already pending and no task had + received it yet, so this one changed nothing but possibly the position + and no new task results from it. + """ + def __init__( + self, + *, + run_id: builtins.str = ..., + folded: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal["folded", b"folded", "run_id", b"run_id"], + ) -> None: ... + +global___WakeWorkflowExecutionResponse = WakeWorkflowExecutionResponse + class SignalWithStartWorkflowExecutionRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index 92da5d6c2..6107f7a24 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xdc\xb2\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xa0\xb5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -135,6 +135,10 @@ _WORKFLOWSERVICE.methods_by_name[ "SignalWorkflowExecution" ]._serialized_options = b'\202\323\344\223\002\301\001"W/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}' + _WORKFLOWSERVICE.methods_by_name["WakeWorkflowExecution"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "WakeWorkflowExecution" + ]._serialized_options = b'\202\323\344\223\002\241\001"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*' _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -526,5 +530,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 39510 + _WORKFLOWSERVICE._serialized_end = 39834 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.py b/temporalio/api/workflowservice/v1/service_pb2_grpc.py index 486c6a394..034a933f9 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.py +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.py @@ -143,6 +143,11 @@ def __init__(self, channel): request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.SerializeToString, response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.FromString, ) + self.WakeWorkflowExecution = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, + ) self.SignalWithStartWorkflowExecution = channel.unary_unary( "/temporal.api.workflowservice.v1.WorkflowService/SignalWithStartWorkflowExecution", request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.SerializeToString, @@ -937,6 +942,17 @@ def SignalWorkflowExecution(self, request, context): context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") + def WakeWorkflowExecution(self, request, context): + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + def SignalWithStartWorkflowExecution(self, request, context): """SignalWithStartWorkflowExecution is used to ensure a signal is sent to a workflow, even if it isn't yet started. @@ -2055,6 +2071,11 @@ def add_WorkflowServiceServicer_to_server(servicer, server): request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.FromString, response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.SerializeToString, ), + "WakeWorkflowExecution": grpc.unary_unary_rpc_method_handler( + servicer.WakeWorkflowExecution, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.SerializeToString, + ), "SignalWithStartWorkflowExecution": grpc.unary_unary_rpc_method_handler( servicer.SignalWithStartWorkflowExecution, request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.FromString, @@ -3244,6 +3265,35 @@ def SignalWorkflowExecution( metadata, ) + @staticmethod + def WakeWorkflowExecution( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + @staticmethod def SignalWithStartWorkflowExecution( request, diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi index d25f044b4..5af97ddfd 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi @@ -279,6 +279,16 @@ class WorkflowServiceStub: This results in a `WORKFLOW_EXECUTION_SIGNALED` event recorded in the history and a workflow task being created for the execution. """ + WakeWorkflowExecution: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, + temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse, + ] + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ SignalWithStartWorkflowExecution: grpc.UnaryUnaryMultiCallable[ temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, @@ -1499,6 +1509,18 @@ class WorkflowServiceServicer(metaclass=abc.ABCMeta): task being created for the execution. """ @abc.abstractmethod + def WakeWorkflowExecution( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse: + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ + @abc.abstractmethod def SignalWithStartWorkflowExecution( self, request: temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 2e8455ef5..844901480 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 2e8455ef5212561a8b43987710d63761b598ac11 +Subproject commit 844901480aa83bf33a7453b91c6c57c6205e9a2f diff --git a/temporalio/bridge/services_generated.py b/temporalio/bridge/services_generated.py index c9960fcb5..fdd706cf4 100644 --- a/temporalio/bridge/services_generated.py +++ b/temporalio/bridge/services_generated.py @@ -2243,6 +2243,24 @@ async def validate_worker_deployment_version_compute_config( timeout=timeout, ) + async def wake_workflow_execution( + self, + req: temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse: + """Invokes the WorkflowService.wake_workflow_execution rpc method.""" + return await self._client._rpc_call( + rpc="wake_workflow_execution", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + class OperatorService: """RPC calls for the OperatorService.""" diff --git a/temporalio/bridge/src/client_rpc_generated.rs b/temporalio/bridge/src/client_rpc_generated.rs index ea00d4fd5..3017217c0 100644 --- a/temporalio/bridge/src/client_rpc_generated.rs +++ b/temporalio/bridge/src/client_rpc_generated.rs @@ -1127,6 +1127,15 @@ impl ClientRef { validate_worker_deployment_version_compute_config ) } + "wake_workflow_execution" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + wake_workflow_execution + ) + } _ => { return Err(PyValueError::new_err(format!( "Unknown RPC call {}", From d33b6af621de08f277baa91c6263b92e23f4ca30 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 11:33:21 -0700 Subject: [PATCH 742/831] Sent external-stream wakes over the wake call, with a Signal fallback. A wake records no History event and folds per stream, so a burst of appends costs one task. Servers without the call still get the reserved Signal. --- .../external_workflow_streams/_backend.py | 23 ++ .../external_workflow_streams/_producer.py | 41 ++- .../external_workflow_streams/_wake.py | 190 +++++++++++++- temporalio/worker/_workflow.py | 20 +- .../external_workflow_streams/test_wake.py | 241 ++++++++++++++++++ 5 files changed, 502 insertions(+), 13 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_backend.py b/temporalio/contrib/external_workflow_streams/_backend.py index ca7e1ecdd..2c366aa26 100644 --- a/temporalio/contrib/external_workflow_streams/_backend.py +++ b/temporalio/contrib/external_workflow_streams/_backend.py @@ -42,6 +42,7 @@ Offset, StreamRecord, ) +from temporalio.contrib.external_workflow_streams._wake import WakeTransport __all__ = [ "AppendConflictError", @@ -273,6 +274,28 @@ def compare_offsets(self, left: Offset, right: Offset) -> int: inside a validation loop. """ + # --- waking ------------------------------------------------------------- + + wake_transport: WakeTransport = "auto" + """How wakes for this backend's streams reach the server. + + Held on the backend because it is the one object both the producer and the + consuming Worker are configured with. A provider may set it per instance. + """ + + def wake_counter_for(self, offset: Offset) -> int: + """The order of ``offset`` as a positive integer, or 0 when unknown. + + While a wake for a stream is pending, the server folds later wakes into + it and keeps the highest counter's position, so the receiving task sees + the latest one. A counter derived from the store's own order ranks + positions the same way for producers and Workers, where a clock-derived + one does not. Implement it when offsets map to integers that increase + with the provider's order. + """ + del offset + return 0 + # --- parking (P2b) ------------------------------------------------------ supports_leased_claims: ClassVar[bool] = False diff --git a/temporalio/contrib/external_workflow_streams/_producer.py b/temporalio/contrib/external_workflow_streams/_producer.py index 18fb0c29b..95ac8431d 100644 --- a/temporalio/contrib/external_workflow_streams/_producer.py +++ b/temporalio/contrib/external_workflow_streams/_producer.py @@ -50,8 +50,10 @@ ) from temporalio.contrib.external_workflow_streams._wake import ( WakeRequest, - send_wake_signal, + send_wake, + wake_position, wake_request_for, + wake_transport_of, ) from temporalio.types import AnyType @@ -488,6 +490,10 @@ def __init__( #: no defined order between them to preserve, so ordering their appends #: would serialize a batch for nothing. self._appends: dict[StreamKey, list[_StreamOperation]] = {} + #: Per stream, the furthest offset this producer has seen acknowledged. + #: A wake reports it so its counter follows the store's order, and a + #: batch closed by a bare `wake()` still reports where it ended. + self._last_offsets: dict[StreamKey, Offset] = {} @staticmethod async def connect( @@ -850,8 +856,16 @@ async def _append( ) from err assert placed.offset is not None self._forget(record) + self._note_offset(placed.offset) return placed + def _note_offset(self, offset: Offset) -> None: + """Keeps the furthest acknowledged offset; a repeat append can be older.""" + offsets = self._producer._last_offsets + held = offsets.get(self._stream_key) + if held is None or self._producer._backend.compare_offsets(held, offset) < 0: + offsets[self._stream_key] = offset + async def _wake_for( self, placed: StreamRecord, *, wake: bool, lease: timedelta ) -> Offset: @@ -1160,6 +1174,7 @@ async def wake( self, *, lease: timedelta = DEFAULT_WAKE_CLAIM_LEASE, + position: Offset | None = None, ) -> list[str]: """Step 2 and 3 of the send sequence: observe or claim, then Signal. @@ -1199,9 +1214,16 @@ async def wake( either case loses the record until something else happens to wake the Workflow. + Args: + lease: How long a granted claim on a parked generation holds. + position: An offset this stream holds that was appended outside + this producer. The wake reports the furthest of it and this + producer's own appends, so its counter follows the store. + Returns: - The request ID of each Signal sent -- one per parked subscription, - or a single unparked wake when nothing on this stream is parked. + What :func:`send_wake` returned for each wake sent -- one per parked + subscription, or a single unparked wake when nothing on this stream + is parked. Raises: WakeNotAcknowledgedError: The wake did not complete. The record is @@ -1225,6 +1247,8 @@ async def wake( ) backend = producer._backend + if position is not None: + self._note_offset(position) # The coordination steps are inside the same guarantee as the Signal, and # every caller reaches here *after* a durable append. A provider outage in # any of them used to escape as whatever the provider raised -- a bare @@ -1249,6 +1273,9 @@ async def wake( if not targets: targets = [(0, None)] + reported, reported_counter = wake_position( + backend, producer._last_offsets.get(self._stream_key) + ) requests: list[WakeRequest] = [] for wait_id, generation in targets: if generation is not None: @@ -1274,6 +1301,8 @@ async def wake( wake_counter=( producer._next_wake_counter() if generation is None else 0 ), + position=reported, + position_counter=reported_counter, ) ) except WakeNotAcknowledgedError: @@ -1305,10 +1334,11 @@ async def wake( for index, request in enumerate(requests): try: sent.append( - await send_wake_signal( + await send_wake( producer._client, request, producer_session_id=producer.session_id, + transport=wake_transport_of(producer._backend), ) ) except (Exception, asyncio.CancelledError) as err: @@ -1352,10 +1382,11 @@ async def retry_wake(self, pending: list[WakeRequest]) -> list[str]: for index, request in enumerate(pending): try: sent.append( - await send_wake_signal( + await send_wake( producer._client, request, producer_session_id=producer.session_id, + transport=wake_transport_of(producer._backend), ) ) except (Exception, asyncio.CancelledError) as err: diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index a083068b1..daec3e3ee 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -1,8 +1,11 @@ -"""The producer wake-signal path (P14). +"""The producer wake path (P14). The server-visible wakeup, used whenever no open Workflow Task can accept local -readiness. It carries no stream payload -- only enough identity for Core to -decide whether it is a wake, a stale claim, or someone else's chain. +readiness. It carries no stream payload. It goes out over the server's +``WakeWorkflowExecution`` call when the server has one, see :func:`send_wake`, +and otherwise as the reserved Signal described below, which carries only enough +identity for Core to decide whether it is a wake, a stale claim, or someone +else's chain. Two properties are load-bearing and neither is available from the public Signal API, which is why this path does not reuse it: @@ -24,13 +27,18 @@ from __future__ import annotations import hashlib +import time import uuid +import weakref from dataclasses import dataclass -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Literal import temporalio.api.common.v1 +import temporalio.api.workflow.v1 import temporalio.api.workflowservice.v1 +import temporalio.service from temporalio.bridge.proto.external_stream.external_stream_pb2 import WakeSignal +from temporalio.contrib.external_workflow_streams._record import Offset if TYPE_CHECKING: import temporalio.client @@ -38,11 +46,22 @@ __all__ = [ "WakeRequest", + "WakeTransport", "new_sender_identity", + "send_wake", "send_wake_signal", "wake_request_id", ] +WakeTransport = Literal["auto", "wake", "signal"] +"""How a wake reaches the server. + +``"wake"`` uses the ``WakeWorkflowExecution`` call, which records no History +event and folds repeated wakes per source. ``"signal"`` uses the reserved +Signal. ``"auto"`` tries the wake call and falls back to the Signal against a +server that does not implement it, remembering the answer per client. +""" + WAKE_SIGNAL_NAME = "__temporal_external_stream_wake" """Fixed, and versioned by the envelope rather than by the name. @@ -111,6 +130,16 @@ class WakeRequest: park_generation: int sender_identity: str = "" wake_counter: int = 0 + position: bytes = b"" + """The store position the wake reports, opaque to the server.""" + position_counter: int = 0 + """The store's order for ``position``; 0 when the store cannot give one. + + Orders positions within one pending burst of wakes, so the task that takes + them sees the latest position. It is not a dedupe key: once a task has + received a source's wake, the server accepts the next one whatever its + counter, because only the receiver knows what it read. + """ @property def is_unparked(self) -> bool: @@ -232,6 +261,155 @@ async def send_wake_signal( return signal_request.request_id +_SIGNAL_ONLY: weakref.WeakKeyDictionary[Any, bool] = weakref.WeakKeyDictionary() +"""Service clients whose server answered the wake call with ``UNIMPLEMENTED``. + +Keyed weakly by the client's service client so the answer lives as long as the +connection it describes, without adding state to the public client. +""" + + +def _service_key(client: temporalio.client.Client) -> Any: + return getattr(client, "service_client", None) + + +def _known_signal_only(client: temporalio.client.Client) -> bool: + key = _service_key(client) + if key is None: + return False + try: + return key in _SIGNAL_ONLY + except TypeError: + return False + + +def _remember_signal_only(client: temporalio.client.Client) -> None: + key = _service_key(client) + if key is None: + return + try: + _SIGNAL_ONLY[key] = True + except TypeError: + pass + + +def wake_transport_of(backend: object) -> WakeTransport: + """The transport a backend asks for, defaulting for objects that predate it.""" + return getattr(backend, "wake_transport", "auto") + + +def wake_position(backend: object, offset: Offset | None) -> tuple[bytes, int]: + """The position and counter a wake reports for ``offset`` in ``backend``. + + A counter the backend cannot give is 0, which :func:`wake_call_counter` + replaces with the clock. + """ + if offset is None: + return b"", 0 + counter_for = getattr(backend, "wake_counter_for", None) + counter = counter_for(offset) if counter_for is not None else 0 + return offset.token.encode("utf-8"), max(counter, 0) + + +def wake_call_counter(request: WakeRequest) -> int: + """The counter the wake call carries for ``request``. + + The server folds a wake into one still pending for the same source when + its counter is not above the pending one, so the counter decides which + position the receiving task sees. The store's own order when it has one. + Otherwise the wall clock in nanoseconds, which keeps one sender's wakes + increasing but is not ordered across senders: a pending wake can then end + up reporting an older position than another sender's. That costs latency + only, because the task still reads from its own cursor and the watcher + reports whatever it finds. + """ + if request.position_counter > 0: + return request.position_counter + return time.time_ns() + + +def build_wake_request( + request: WakeRequest, *, identity: str +) -> temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest: + """The ``WakeWorkflowExecution`` request for one wake. + + ``run_id`` is the chain's first execution run, so the server follows the + chain to its current run and answers ``NOT_FOUND`` once the chain has + ended rather than waking a later chain that reused the Workflow ID. + """ + return temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest( + namespace=request.namespace, + workflow_execution=temporalio.api.common.v1.WorkflowExecution( + workflow_id=request.workflow_id, + run_id=request.first_execution_run_id, + ), + wake=temporalio.api.workflow.v1.Wake( + source=request.stream_name, + position=request.position, + counter=wake_call_counter(request), + ), + identity=identity, + ) + + +async def send_wake( + client: temporalio.client.Client, + request: WakeRequest, + *, + producer_session_id: str = "", + transport: WakeTransport = "auto", +) -> str: + """Sends one wake over ``transport`` and returns an identifier for it. + + The Signal path returns its request ID. The wake call has no request ID, + since the server folds by counter instead, so it returns the run the wake + was stored on. + + A ``NOT_FOUND`` from the wake call propagates as the ``RPCError`` it is, + which is what a Signal to an ended Workflow raises as well, so callers keep + one meaning for "the chain is over". + + Raises: + temporalio.service.RPCError: The server refused the wake. With + ``"wake"`` this includes ``UNIMPLEMENTED``, since that transport + was asked for explicitly. + """ + if transport not in ("auto", "wake", "signal"): + raise ValueError(f"unknown wake transport {transport!r}") + if transport == "auto" and _known_signal_only(client): + transport = "signal" + if transport != "signal": + service = getattr(client, "workflow_service", None) + call = getattr(service, "wake_workflow_execution", None) + if call is None: + # An SDK build whose generated service lacks the call can no more + # send a wake than a server that lacks it can take one. + if transport == "wake": + raise RuntimeError( + "the wake transport was requested but this client has no " + "WakeWorkflowExecution call" + ) + _remember_signal_only(client) + else: + try: + response = await call( + build_wake_request( + request, identity=client.service_client.config.identity + ) + ) + return response.run_id + except temporalio.service.RPCError as err: + if ( + transport == "wake" + or err.status != temporalio.service.RPCStatusCode.UNIMPLEMENTED + ): + raise + _remember_signal_only(client) + return await send_wake_signal( + client, request, producer_session_id=producer_session_id + ) + + def wake_request_for( workflow: WorkflowChainKey, *, @@ -240,6 +418,8 @@ def wake_request_for( park_generation: int | None, sender_identity: str, wake_counter: int = 0, + position: bytes = b"", + position_counter: int = 0, ) -> WakeRequest: """Builds the request from a chain key and an observed generation. @@ -257,4 +437,6 @@ def wake_request_for( ), sender_identity=sender_identity, wake_counter=wake_counter, + position=position, + position_counter=position_counter, ) diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 42fb07ff8..5e2f2fa0a 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -1390,9 +1390,9 @@ def _record_shutdown_wake_failed(self, subscription: Any) -> None: ) async def _send_external_stream_wake(self, subscription: Any) -> None: - """Sends the reserved wake Signal for a subscription that owes one. + """Sends the wake a subscription owes, over the backend's wake transport. - Addressed to the Workflow ID with no Run ID, so it lands on the current + Addressed to the chain rather than to a Run, so it lands on the current Run of the chain -- which may already be a successor by the time this runs. @@ -1421,7 +1421,9 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: """ from temporalio.contrib.external_workflow_streams._wake import ( WakeRequest, - send_wake_signal, + send_wake, + wake_position, + wake_transport_of, ) if self._client is None: @@ -1446,8 +1448,15 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: generation = ( await self._stream_manager().wake_park_generation(subscription) or 0 ) + # The furthest record this Worker has read, which is the record the + # Run has not consumed yet. A cleanup wake has no subscription left to + # have read anything. + read = getattr(subscription, "prefetch_cursor", None) + position, position_counter = wake_position( + subscription.backend, read.offset if read is not None else None + ) try: - await send_wake_signal( + await send_wake( self._client, WakeRequest( namespace=key.namespace, @@ -1465,7 +1474,10 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: # completed one. The manager coalesces reports until Core # accepts that cycle's successful task completion. wake_counter=subscription.wake_counter, + position=position, + position_counter=position_counter, ), + transport=wake_transport_of(subscription.backend), ) except Exception: logger.exception( diff --git a/tests/contrib/external_workflow_streams/test_wake.py b/tests/contrib/external_workflow_streams/test_wake.py index 97ec27d1e..72e49b545 100644 --- a/tests/contrib/external_workflow_streams/test_wake.py +++ b/tests/contrib/external_workflow_streams/test_wake.py @@ -22,8 +22,10 @@ import pytest import temporalio.api.common.v1 +import temporalio.api.workflowservice.v1 import temporalio.bridge import temporalio.converter +import temporalio.service from temporalio import workflow from temporalio.bridge.proto.external_stream.external_stream_pb2 import WakeSignal from temporalio.client import Client @@ -39,6 +41,7 @@ WorkflowChainKey, ) from temporalio.contrib.external_workflow_streams._record import ( + AFTER, BEGINNING, Offset, RecordKind, @@ -52,6 +55,7 @@ WAKE_SIGNAL_NAME, WakeRequest, build_signal_request, + send_wake, send_wake_signal, wake_request_id, ) @@ -1813,3 +1817,240 @@ async def test_one_senders_retry_stays_a_single_wake(client: Client) -> None: assert await _settled_signal_count(handle, 1) == 1 finally: await handle.terminate() + + +# --- the wake transport ------------------------------------------------------- + + +def _rpc_error(status: temporalio.service.RPCStatusCode) -> temporalio.service.RPCError: + return temporalio.service.RPCError(status.name, status, b"") + + +class WakeServiceClient(RecordingClient): + """A client whose service answers the wake call, or refuses it with ``refuse``.""" + + def __init__(self, refuse: temporalio.service.RPCStatusCode | None = None) -> None: + super().__init__() + self.refuse = refuse + self.wakes: list = [] + + async def wake_workflow_execution(self, request): # type: ignore[no-untyped-def] + self.wakes.append(request) + if self.refuse is not None: + raise _rpc_error(self.refuse) + return temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse( + run_id="current-run" + ) + + +@pytest.mark.asyncio +async def test_the_wake_call_names_the_chain_the_stream_and_its_position() -> None: + client = WakeServiceClient() + + sent = await send_wake( + client, # type: ignore[arg-type] + request(position=b"1700000000000-3", position_counter=42), + transport="wake", + ) + + assert sent == "current-run" + assert client.sent == [] + [wake] = client.wakes + assert wake.namespace == "ns" + assert wake.workflow_execution.workflow_id == "wf-1" + # The first run, so the server follows the chain and refuses a later chain + # that reused the Workflow ID. + assert wake.workflow_execution.run_id == "first-run-1" + assert wake.wake.source == "tokens" + assert wake.wake.position == b"1700000000000-3" + assert wake.wake.counter == 42 + assert wake.identity == "producer-identity" + + +@pytest.mark.asyncio +async def test_an_unknown_counter_falls_back_to_the_clock() -> None: + import time + + client = WakeServiceClient() + before = time.time_ns() + await send_wake(client, request(), transport="wake") # type: ignore[arg-type] + after = time.time_ns() + + assert before <= client.wakes[0].wake.counter <= after + + +@pytest.mark.asyncio +async def test_auto_falls_back_to_the_signal_once_and_remembers_the_client() -> None: + client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.UNIMPLEMENTED) + + first = await send_wake(client, request()) # type: ignore[arg-type] + second = await send_wake(client, request()) # type: ignore[arg-type] + + assert len(client.wakes) == 1, "the refusal was not remembered for the client" + assert [signal.request_id for signal in client.sent] == [first, second] + assert first == wake_request_id(request()) + + +@pytest.mark.asyncio +async def test_the_remembered_fallback_is_per_client() -> None: + old = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.UNIMPLEMENTED) + new = WakeServiceClient() + + await send_wake(old, request()) # type: ignore[arg-type] + await send_wake(new, request()) # type: ignore[arg-type] + + assert len(new.wakes) == 1 + assert new.sent == [] + + +@pytest.mark.asyncio +async def test_the_wake_transport_propagates_unimplemented() -> None: + client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.UNIMPLEMENTED) + + with pytest.raises(temporalio.service.RPCError) as raised: + await send_wake(client, request(), transport="wake") # type: ignore[arg-type] + + assert raised.value.status == temporalio.service.RPCStatusCode.UNIMPLEMENTED + assert client.sent == [] + # Asked for explicitly, so nothing is learned from it either. + client.refuse = None + await send_wake(client, request()) # type: ignore[arg-type] + assert len(client.wakes) == 2 + + +@pytest.mark.asyncio +async def test_the_signal_transport_never_tries_the_wake_call() -> None: + client = WakeServiceClient() + + await send_wake(client, request(), transport="signal") # type: ignore[arg-type] + + assert client.wakes == [] + assert len(client.sent) == 1 + + +@pytest.mark.asyncio +async def test_an_ended_chain_raises_what_a_signal_to_it_raises() -> None: + """``NOT_FOUND`` is the chain being over, under both transports. + + Not a reason to fall back: a Signal addressed by Workflow ID could reach a + later chain that reused the ID, which is the wake the server just refused. + """ + client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.NOT_FOUND) + + with pytest.raises(temporalio.service.RPCError) as raised: + await send_wake(client, request()) # type: ignore[arg-type] + + assert raised.value.status == temporalio.service.RPCStatusCode.NOT_FOUND + assert client.sent == [] + + +@pytest.mark.asyncio +async def test_a_producer_reports_an_ended_chain_as_the_cause_of_its_wake_failure() -> ( + None +): + backend = MemoryStreamBackend() + client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.NOT_FOUND) + topic = make_producer(backend, client).topic("tokens") + + with pytest.raises(WakeNotAcknowledgedError) as raised: + await topic.publish("hello") + + cause = raised.value.__cause__ + assert isinstance(cause, temporalio.service.RPCError) + assert cause.status == temporalio.service.RPCStatusCode.NOT_FOUND + + +class CountingBackend(MemoryStreamBackend): + """Orders offsets the way the Redis provider does, and asks for the wake call.""" + + wake_transport = "wake" + + def wake_counter_for(self, offset: Offset) -> int: + ms, seq = offset.token.split("-") + return int(ms) * 2**20 + int(seq) + + +@pytest.mark.asyncio +async def test_a_producer_wakes_with_the_position_it_appended() -> None: + backend = CountingBackend() + client = WakeServiceClient() + topic = make_producer(backend, client).topic("tokens") + + offset = await topic.publish("hello") + + [wake] = client.wakes + assert wake.wake.position == offset.token.encode() + assert wake.wake.counter == backend.wake_counter_for(offset) + assert client.sent == [] + + +@pytest.mark.asyncio +async def test_a_bare_wake_after_a_batch_reports_where_the_batch_ended() -> None: + """Without it the bare wake falls back to the clock and folds behind the store.""" + backend = CountingBackend() + client = WakeServiceClient() + topic = make_producer(backend, client).topic("tokens") + + await topic.publish("a", wake=False) + last = await topic.publish("b", wake=False) + await topic.wake() + + [wake] = client.wakes + assert wake.wake.position == last.token.encode() + assert wake.wake.counter == backend.wake_counter_for(last) + + +@pytest.mark.asyncio +async def test_a_retried_wake_carries_its_original_position() -> None: + backend = CountingBackend() + client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.UNAVAILABLE) + topic = make_producer(backend, client).topic("tokens") + + with pytest.raises(WakeNotAcknowledgedError) as raised: + await topic.publish("hello") + client.refuse = None + await topic.retry_wake(raised.value.pending) + + first, retried = client.wakes + assert retried.wake.position == first.wake.position + assert retried.wake.counter == first.wake.counter + + +class _ReadSubscription(_StubSubscription): + def __init__(self, backend, cursor) -> None: # type: ignore[no-untyped-def] + super().__init__() + self.backend = backend + self.prefetch_cursor = cursor + + +@pytest.mark.asyncio +async def test_a_worker_wakes_with_the_position_it_read() -> None: + class _Backend(CountingBackend): + async def current_park_generation(self, stream_key, wait_id): # type: ignore[no-untyped-def] + return None + + backend = _Backend() + client = WakeServiceClient() + worker = _worker_sending_wakes("client") + worker._client = client + read = Offset("1700000000000-5") + + await worker._send_external_stream_wake(_ReadSubscription(backend, AFTER(read))) + + [wake] = client.wakes + assert wake.wake.position == read.token.encode() + assert wake.wake.counter == backend.wake_counter_for(read) + + +@pytest.mark.asyncio +async def test_a_wake_reports_a_position_appended_outside_the_producer() -> None: + backend = CountingBackend() + client = WakeServiceClient() + topic = make_producer(backend, client).topic("tokens") + outside = Offset("1700000000000-9") + + await topic.wake(position=outside) + + [wake] = client.wakes + assert wake.wake.position == outside.token.encode() + assert wake.wake.counter == backend.wake_counter_for(outside) From 41b05d8c85396bdb3e83148f1d3336b25b24655c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 11:37:04 -0700 Subject: [PATCH 743/831] Repinned Core for the wake protos. Core moves to the delivery branch head that carries the Wake message, the wakes field on the workflow task poll response and the WakeWorkflowExecution call, so the vendored tree and the bridge client regenerate from the pin. --- temporalio/api/workflow/v1/__init__.py | 2 + temporalio/api/workflow/v1/message_pb2.py | 16 +- temporalio/api/workflow/v1/message_pb2.pyi | 49 + temporalio/api/workflowservice/v1/__init__.py | 4 + .../v1/request_response_pb2.py | 1080 +++++++++-------- .../v1/request_response_pb2.pyi | 94 ++ .../api/workflowservice/v1/service_pb2.py | 8 +- .../workflowservice/v1/service_pb2_grpc.py | 50 + .../workflowservice/v1/service_pb2_grpc.pyi | 22 + temporalio/bridge/sdk-core | 2 +- temporalio/bridge/services_generated.py | 18 + temporalio/bridge/src/client_rpc_generated.rs | 9 + 12 files changed, 826 insertions(+), 528 deletions(-) diff --git a/temporalio/api/workflow/v1/__init__.py b/temporalio/api/workflow/v1/__init__.py index ae647ab67..7f51920fe 100644 --- a/temporalio/api/workflow/v1/__init__.py +++ b/temporalio/api/workflow/v1/__init__.py @@ -14,6 +14,7 @@ ResetPointInfo, ResetPoints, VersioningOverride, + Wake, WorkflowExecutionConfig, WorkflowExecutionExtendedInfo, WorkflowExecutionInfo, @@ -38,6 +39,7 @@ "ResetPointInfo", "ResetPoints", "VersioningOverride", + "Wake", "WorkflowExecutionConfig", "WorkflowExecutionExtendedInfo", "WorkflowExecutionInfo", diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index e4f1ccc48..af29437d9 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x96\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x96\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\t"9\n\x04Wake\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x42\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -114,6 +114,7 @@ _WORKFLOWEXECUTIONPAUSEINFO = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionPauseInfo" ] +_WAKE = DESCRIPTOR.message_types_by_name["Wake"] _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR = _VERSIONINGOVERRIDE.enum_types_by_name[ "PinnedOverrideBehavior" ] @@ -458,6 +459,17 @@ ) _sym_db.RegisterMessage(WorkflowExecutionPauseInfo) +Wake = _reflection.GeneratedProtocolMessageType( + "Wake", + (_message.Message,), + { + "DESCRIPTOR": _WAKE, + "__module__": "temporalio.api.workflow.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflow.v1.Wake) + }, +) +_sym_db.RegisterMessage(Wake) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\033io.temporal.api.workflow.v1B\014MessageProtoP\001Z'go.temporal.io/api/workflow/v1;workflow\252\002\032Temporalio.Api.Workflow.V1\352\002\035Temporalio::Api::Workflow::V1" @@ -599,4 +611,6 @@ _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10798 _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10811 _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10922 + _WAKE._serialized_start = 10924 + _WAKE._serialized_end = 10981 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index f884493c2..edd40535e 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -2436,3 +2436,52 @@ class WorkflowExecutionPauseInfo(google.protobuf.message.Message): ) -> None: ... global___WorkflowExecutionPauseInfo = WorkflowExecutionPauseInfo + +class Wake(google.protobuf.message.Message): + """A wake tells a running Workflow Execution that something it consumes has + moved, so it should run a Workflow Task and read from its own cursor. It is + a reason to run, not data: nothing is recorded in History and no record + travels with it. A store Temporal does not host sends one after the store + has acknowledged a write. Wakes for the same source fold while one is + pending and no task has received it yet, so a burst of writes costs one + task. Once a task has been handed the wake, a new wake for the source is + accepted again, because only the receiver knows what it read. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SOURCE_FIELD_NUMBER: builtins.int + POSITION_FIELD_NUMBER: builtins.int + COUNTER_FIELD_NUMBER: builtins.int + source: builtins.str + """What moved, as the sender names it. The server folds wakes by this value + and never interprets it. For a stream, the provider formats the stream's + identity, owner and topic, into it. + """ + position: builtins.bytes + """Where the source stands after the write that caused this wake, in the + store's own terms. Opaque to the server and handed to the Workflow as + received. Among wakes folded together, the position with the highest + counter is the one delivered. + """ + counter: builtins.int + """Orders wakes from one source, so that folding keeps the latest position. + Only the source's store can order its positions, so the sender derives + this from the position. It is not a durable identity: a wake sent after + a task received an equal counter is accepted again. + """ + def __init__( + self, + *, + source: builtins.str = ..., + position: builtins.bytes = ..., + counter: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "counter", b"counter", "position", b"position", "source", b"source" + ], + ) -> None: ... + +global___Wake = Wake diff --git a/temporalio/api/workflowservice/v1/__init__.py b/temporalio/api/workflowservice/v1/__init__.py index ab72e6b09..2a3caaf47 100644 --- a/temporalio/api/workflowservice/v1/__init__.py +++ b/temporalio/api/workflowservice/v1/__init__.py @@ -245,6 +245,8 @@ UpdateWorkflowExecutionResponse, ValidateWorkerDeploymentVersionComputeConfigRequest, ValidateWorkerDeploymentVersionComputeConfigResponse, + WakeWorkflowExecutionRequest, + WakeWorkflowExecutionResponse, ) __all__ = [ @@ -494,6 +496,8 @@ "UpdateWorkflowExecutionResponse", "ValidateWorkerDeploymentVersionComputeConfigRequest", "ValidateWorkerDeploymentVersionComputeConfigResponse", + "WakeWorkflowExecutionRequest", + "WakeWorkflowExecutionResponse", ] # gRPC is optional diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index 1cfae35e9..576345944 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xfb\x08\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -273,6 +273,12 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ "SignalWorkflowExecutionResponse" ] +_WAKEWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ + "WakeWorkflowExecutionRequest" +] +_WAKEWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ + "WakeWorkflowExecutionResponse" +] _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ "SignalWithStartWorkflowExecutionRequest" ] @@ -1441,6 +1447,28 @@ ) _sym_db.RegisterMessage(SignalWorkflowExecutionResponse) +WakeWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( + "WakeWorkflowExecutionRequest", + (_message.Message,), + { + "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionRequest) + }, +) +_sym_db.RegisterMessage(WakeWorkflowExecutionRequest) + +WakeWorkflowExecutionResponse = _reflection.GeneratedProtocolMessageType( + "WakeWorkflowExecutionResponse", + (_message.Message,), + { + "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse) + }, +) +_sym_db.RegisterMessage(WakeWorkflowExecutionResponse) + SignalWithStartWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( "SignalWithStartWorkflowExecutionRequest", (_message.Message,), @@ -4257,541 +4285,545 @@ _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6729 _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7169 _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7172 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8319 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8235 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8319 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8322 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9660 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9494 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9589 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9591 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9660 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9663 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9908 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9911 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10436 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10438 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10473 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10476 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10962 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10965 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12146 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12149 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12314 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12316 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12428 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12431 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12638 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12640 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12756 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12759 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13141 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13143 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13181 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13184 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13391 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13393 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13435 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13438 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13947 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13949 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14036 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14039 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14373 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14375 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14466 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14469 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14851 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14853 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14890 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14893 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15181 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15183 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15224 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15227 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15487 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15489 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15529 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15532 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15882 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15884 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15961 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 15964 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17303 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17306 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17464 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17467 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 17916 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 17918 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 17966 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 17969 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18256 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18258 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18294 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18296 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18418 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18420 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18453 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18456 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18785 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18788 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 18918 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 18921 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19315 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19318 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19450 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19452 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19561 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19563 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19689 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19691 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19808 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19811 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19945 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 19947 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 20056 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20058 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20184 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20186 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20252 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20255 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20492 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20404 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20492 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20494 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20522 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20525 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20726 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20642 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20726 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20729 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 21090 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 21092 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 21127 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 21129 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21239 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21241 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21271 - _SHUTDOWNWORKERREQUEST._serialized_start = 21274 - _SHUTDOWNWORKERREQUEST._serialized_end = 21557 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21559 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21583 - _QUERYWORKFLOWREQUEST._serialized_start = 21586 - _QUERYWORKFLOWREQUEST._serialized_end = 21819 - _QUERYWORKFLOWRESPONSE._serialized_start = 21822 - _QUERYWORKFLOWRESPONSE._serialized_end = 22007 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 22009 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 22124 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 22127 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22792 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22795 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23323 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23326 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24330 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 24010 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 24110 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 24112 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24228 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24230 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24330 - _GETCLUSTERINFOREQUEST._serialized_start = 24332 - _GETCLUSTERINFOREQUEST._serialized_end = 24355 - _GETCLUSTERINFORESPONSE._serialized_start = 24358 - _GETCLUSTERINFORESPONSE._serialized_end = 24823 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24768 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24823 - _GETSYSTEMINFOREQUEST._serialized_start = 24825 - _GETSYSTEMINFOREQUEST._serialized_end = 24847 - _GETSYSTEMINFORESPONSE._serialized_start = 24850 - _GETSYSTEMINFORESPONSE._serialized_end = 25427 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 24991 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25427 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25429 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25538 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25541 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25764 - _CREATESCHEDULEREQUEST._serialized_start = 25767 - _CREATESCHEDULEREQUEST._serialized_end = 26099 - _CREATESCHEDULERESPONSE._serialized_start = 26101 - _CREATESCHEDULERESPONSE._serialized_end = 26149 - _DESCRIBESCHEDULEREQUEST._serialized_start = 26151 - _DESCRIBESCHEDULEREQUEST._serialized_end = 26216 - _DESCRIBESCHEDULERESPONSE._serialized_start = 26219 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26490 - _UPDATESCHEDULEREQUEST._serialized_start = 26493 - _UPDATESCHEDULEREQUEST._serialized_end = 26785 - _UPDATESCHEDULERESPONSE._serialized_start = 26787 - _UPDATESCHEDULERESPONSE._serialized_end = 26811 - _PATCHSCHEDULEREQUEST._serialized_start = 26814 - _PATCHSCHEDULEREQUEST._serialized_end = 26970 - _PATCHSCHEDULERESPONSE._serialized_start = 26972 - _PATCHSCHEDULERESPONSE._serialized_end = 26995 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 26998 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 27166 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 27168 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27251 - _DELETESCHEDULEREQUEST._serialized_start = 27253 - _DELETESCHEDULEREQUEST._serialized_end = 27334 - _DELETESCHEDULERESPONSE._serialized_start = 27336 - _DELETESCHEDULERESPONSE._serialized_end = 27360 - _LISTSCHEDULESREQUEST._serialized_start = 27362 - _LISTSCHEDULESREQUEST._serialized_end = 27470 - _LISTSCHEDULESRESPONSE._serialized_start = 27472 - _LISTSCHEDULESRESPONSE._serialized_end = 27584 - _COUNTSCHEDULESREQUEST._serialized_start = 27586 - _COUNTSCHEDULESREQUEST._serialized_end = 27643 - _COUNTSCHEDULESRESPONSE._serialized_start = 27646 - _COUNTSCHEDULESRESPONSE._serialized_end = 27865 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20404 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20492 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27868 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28514 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28315 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8366 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8282 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8366 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8369 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9707 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9541 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9636 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9638 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9707 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9955 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9958 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10483 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10485 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10520 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10523 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11009 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11012 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12193 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12196 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12361 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12363 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12475 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12478 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12685 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12687 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12803 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12806 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13188 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13190 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13228 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13231 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13438 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13440 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13482 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13485 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13994 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13996 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14083 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14086 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14420 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14422 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14513 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14516 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14898 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14900 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14937 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14940 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15228 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15230 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15271 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15274 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15534 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15536 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15576 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15579 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15929 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15931 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 16008 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 16011 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16195 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16197 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16260 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 16263 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17602 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17605 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17763 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17766 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 18215 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 18217 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 18265 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 18268 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18555 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18557 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18593 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18595 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18717 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18719 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18752 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18755 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 19084 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19087 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19217 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19220 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19614 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19617 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19749 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19751 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19860 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19862 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19988 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19990 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20107 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20110 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20244 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 20246 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 20355 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20357 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20483 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20485 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20551 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20554 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20791 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20703 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20791 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20793 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20821 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20824 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 21025 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20941 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 21025 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 21028 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 21389 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 21391 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 21426 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 21428 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21538 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21540 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21570 + _SHUTDOWNWORKERREQUEST._serialized_start = 21573 + _SHUTDOWNWORKERREQUEST._serialized_end = 21856 + _SHUTDOWNWORKERRESPONSE._serialized_start = 21858 + _SHUTDOWNWORKERRESPONSE._serialized_end = 21882 + _QUERYWORKFLOWREQUEST._serialized_start = 21885 + _QUERYWORKFLOWREQUEST._serialized_end = 22118 + _QUERYWORKFLOWRESPONSE._serialized_start = 22121 + _QUERYWORKFLOWRESPONSE._serialized_end = 22306 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 22308 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 22423 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 22426 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 23091 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 23094 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 23622 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 23625 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 24629 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 24309 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 24409 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 24411 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24527 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24529 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24629 + _GETCLUSTERINFOREQUEST._serialized_start = 24631 + _GETCLUSTERINFOREQUEST._serialized_end = 24654 + _GETCLUSTERINFORESPONSE._serialized_start = 24657 + _GETCLUSTERINFORESPONSE._serialized_end = 25122 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 25067 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 25122 + _GETSYSTEMINFOREQUEST._serialized_start = 25124 + _GETSYSTEMINFOREQUEST._serialized_end = 25146 + _GETSYSTEMINFORESPONSE._serialized_start = 25149 + _GETSYSTEMINFORESPONSE._serialized_end = 25726 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 25290 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25726 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25728 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25837 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25840 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 26063 + _CREATESCHEDULEREQUEST._serialized_start = 26066 + _CREATESCHEDULEREQUEST._serialized_end = 26398 + _CREATESCHEDULERESPONSE._serialized_start = 26400 + _CREATESCHEDULERESPONSE._serialized_end = 26448 + _DESCRIBESCHEDULEREQUEST._serialized_start = 26450 + _DESCRIBESCHEDULEREQUEST._serialized_end = 26515 + _DESCRIBESCHEDULERESPONSE._serialized_start = 26518 + _DESCRIBESCHEDULERESPONSE._serialized_end = 26789 + _UPDATESCHEDULEREQUEST._serialized_start = 26792 + _UPDATESCHEDULEREQUEST._serialized_end = 27084 + _UPDATESCHEDULERESPONSE._serialized_start = 27086 + _UPDATESCHEDULERESPONSE._serialized_end = 27110 + _PATCHSCHEDULEREQUEST._serialized_start = 27113 + _PATCHSCHEDULEREQUEST._serialized_end = 27269 + _PATCHSCHEDULERESPONSE._serialized_start = 27271 + _PATCHSCHEDULERESPONSE._serialized_end = 27294 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 27297 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 27465 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 27467 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27550 + _DELETESCHEDULEREQUEST._serialized_start = 27552 + _DELETESCHEDULEREQUEST._serialized_end = 27633 + _DELETESCHEDULERESPONSE._serialized_start = 27635 + _DELETESCHEDULERESPONSE._serialized_end = 27659 + _LISTSCHEDULESREQUEST._serialized_start = 27661 + _LISTSCHEDULESREQUEST._serialized_end = 27769 + _LISTSCHEDULESRESPONSE._serialized_start = 27771 + _LISTSCHEDULESRESPONSE._serialized_end = 27883 + _COUNTSCHEDULESREQUEST._serialized_start = 27885 + _COUNTSCHEDULESREQUEST._serialized_end = 27942 + _COUNTSCHEDULESRESPONSE._serialized_start = 27945 + _COUNTSCHEDULESRESPONSE._serialized_end = 28164 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20703 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20791 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28167 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28813 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28614 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28426 + 28725 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28428 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28501 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28516 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28580 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28582 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28677 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28679 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28795 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28798 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30515 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29850 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28727 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28800 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28815 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28879 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28881 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28976 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28978 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29094 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 29097 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30814 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 30149 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 29963 + 30262 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 29966 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 30265 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 30095 + 30394 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 30097 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 30396 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 30161 + 30460 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30163 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30269 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30271 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30381 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30383 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30445 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30447 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30502 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30518 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30770 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30772 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30844 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30847 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 31096 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 31099 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31255 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31257 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31371 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31374 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31635 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31638 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 31897 - _STARTBATCHOPERATIONREQUEST._serialized_start = 31900 - _STARTBATCHOPERATIONREQUEST._serialized_end = 33266 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 33268 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33297 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33299 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33395 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33397 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33425 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33427 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33493 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33496 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 33968 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 33970 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 34061 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 34063 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34184 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34187 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34372 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34375 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34594 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34597 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 35013 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 35016 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35370 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35373 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35540 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35542 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35577 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35580 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35800 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35802 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35834 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35837 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36209 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 36003 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36209 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36212 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36544 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36338 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36544 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36547 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 36883 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 36886 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37205 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37207 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37307 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37309 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37418 - _PAUSEACTIVITYREQUEST._serialized_start = 37421 - _PAUSEACTIVITYREQUEST._serialized_end = 37620 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37623 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37806 - _PAUSEACTIVITYRESPONSE._serialized_start = 37808 - _PAUSEACTIVITYRESPONSE._serialized_end = 37831 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37833 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37865 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37868 - _UNPAUSEACTIVITYREQUEST._serialized_end = 38148 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38151 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38424 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38426 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38451 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38453 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38487 - _RESETACTIVITYREQUEST._serialized_start = 38490 - _RESETACTIVITYREQUEST._serialized_end = 38797 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38800 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 39090 - _RESETACTIVITYRESPONSE._serialized_start = 39092 - _RESETACTIVITYRESPONSE._serialized_end = 39115 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 39117 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 39149 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 39152 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39436 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39439 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39616 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39618 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39724 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39726 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39823 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39826 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 40020 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 40023 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40675 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40284 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40675 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 24010 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 24110 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40677 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40754 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40757 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 40897 - _LISTDEPLOYMENTSREQUEST._serialized_start = 40899 - _LISTDEPLOYMENTSREQUEST._serialized_end = 41007 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 41009 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 41128 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 41131 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41336 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41339 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41524 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41527 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41756 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41759 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 41950 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 41953 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42202 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42205 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42429 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42431 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42544 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42546 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42602 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42604 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42697 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42700 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43371 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 42875 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43371 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43374 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43614 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43616 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43655 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43658 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43858 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43860 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43899 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 43901 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 43994 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 43996 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 44028 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44031 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44547 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44424 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44547 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44549 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44601 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44604 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45104 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44424 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44547 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45106 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45160 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 45163 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45581 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45496 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30462 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30568 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30570 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30680 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30682 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30744 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30746 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30801 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30817 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 31069 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 31071 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 31143 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 31146 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 31395 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 31398 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31554 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31556 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31670 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31673 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31934 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31937 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 32196 + _STARTBATCHOPERATIONREQUEST._serialized_start = 32199 + _STARTBATCHOPERATIONREQUEST._serialized_end = 33565 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 33567 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 33596 + _STOPBATCHOPERATIONREQUEST._serialized_start = 33598 + _STOPBATCHOPERATIONREQUEST._serialized_end = 33694 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 33696 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 33724 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33726 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33792 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33795 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 34267 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 34269 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 34360 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 34362 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34483 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34486 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34671 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34674 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34893 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34896 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 35312 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 35315 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35669 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35672 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35839 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35841 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35876 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35879 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 36099 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 36101 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 36133 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 36136 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36508 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 36302 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36508 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36511 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36843 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36637 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36843 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36846 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 37182 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 37185 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37504 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37506 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37606 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37608 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37717 + _PAUSEACTIVITYREQUEST._serialized_start = 37720 + _PAUSEACTIVITYREQUEST._serialized_end = 37919 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37922 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38105 + _PAUSEACTIVITYRESPONSE._serialized_start = 38107 + _PAUSEACTIVITYRESPONSE._serialized_end = 38130 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38132 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38164 + _UNPAUSEACTIVITYREQUEST._serialized_start = 38167 + _UNPAUSEACTIVITYREQUEST._serialized_end = 38447 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38450 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38723 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 38725 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 38750 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38752 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38786 + _RESETACTIVITYREQUEST._serialized_start = 38789 + _RESETACTIVITYREQUEST._serialized_end = 39096 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 39099 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 39389 + _RESETACTIVITYRESPONSE._serialized_start = 39391 + _RESETACTIVITYRESPONSE._serialized_end = 39414 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 39416 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 39448 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 39451 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39735 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39738 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39915 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39917 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 40023 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 40025 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 40122 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 40125 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 40319 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 40322 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40974 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40583 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40974 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 24309 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 24409 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40976 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 41053 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 41056 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 41196 + _LISTDEPLOYMENTSREQUEST._serialized_start = 41198 + _LISTDEPLOYMENTSREQUEST._serialized_end = 41306 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 41308 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 41427 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 41430 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41635 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41638 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41823 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41826 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 42055 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 42058 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 42249 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 42252 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42501 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42504 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42728 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42730 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42843 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42845 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42901 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42903 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42996 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42999 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43670 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 43174 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43670 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43673 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43913 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43915 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43954 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43957 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44157 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 44159 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44198 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 44200 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 44293 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 44295 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 44327 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44330 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44846 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44723 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44846 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44848 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44900 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44903 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45403 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44723 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44846 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45405 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45459 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 45462 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45880 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45795 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45581 + 45880 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45583 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45693 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45696 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 45885 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 45887 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 45986 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 45988 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 46057 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 46059 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 46166 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 46168 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46281 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46284 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46511 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46514 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46694 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46696 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46791 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46793 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46858 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46860 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 46941 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 46943 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 47006 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 47008 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 47036 - _LISTWORKFLOWRULESREQUEST._serialized_start = 47038 - _LISTWORKFLOWRULESREQUEST._serialized_end = 47108 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 47110 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 47214 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47217 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47423 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47425 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47471 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47474 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47629 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47631 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47662 - _LISTWORKERSREQUEST._serialized_start = 47665 - _LISTWORKERSREQUEST._serialized_end = 47795 - _LISTWORKERSRESPONSE._serialized_start = 47798 - _LISTWORKERSRESPONSE._serialized_end = 47963 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 47966 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48691 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48533 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48624 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45882 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45992 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45995 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 46184 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 46186 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 46285 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 46287 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 46356 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 46358 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 46465 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 46467 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46580 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46583 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46810 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 46813 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 46993 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 46995 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 47090 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 47092 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 47157 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 47159 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 47240 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 47242 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 47305 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 47307 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 47335 + _LISTWORKFLOWRULESREQUEST._serialized_start = 47337 + _LISTWORKFLOWRULESREQUEST._serialized_end = 47407 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 47409 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 47513 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47516 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47722 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47724 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47770 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47773 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47928 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47930 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47961 + _LISTWORKERSREQUEST._serialized_start = 47964 + _LISTWORKERSREQUEST._serialized_end = 48094 + _LISTWORKERSRESPONSE._serialized_start = 48097 + _LISTWORKERSRESPONSE._serialized_end = 48262 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 48265 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48990 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48832 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48923 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48626 + 48925 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48691 + 48990 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48693 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48784 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48787 - _FETCHWORKERCONFIGREQUEST._serialized_end = 48945 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 48947 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 49032 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 49035 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49301 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49303 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49403 - _DESCRIBEWORKERREQUEST._serialized_start = 49405 - _DESCRIBEWORKERREQUEST._serialized_end = 49476 - _DESCRIBEWORKERRESPONSE._serialized_start = 49478 - _DESCRIBEWORKERRESPONSE._serialized_end = 49559 - _COUNTWORKERSREQUEST._serialized_start = 49561 - _COUNTWORKERSREQUEST._serialized_end = 49648 - _COUNTWORKERSRESPONSE._serialized_start = 49650 - _COUNTWORKERSRESPONSE._serialized_end = 49687 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49690 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49831 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49833 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49865 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49868 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 50011 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 50013 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 50047 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 50050 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51227 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51229 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51338 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51341 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51569 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51572 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 51888 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 51890 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 51976 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 51978 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 52094 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 52096 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52205 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52208 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52338 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52341 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53379 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 53329 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53379 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53381 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53452 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53455 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53625 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53628 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54015 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54018 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54179 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54182 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54443 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54445 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54560 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54563 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54702 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54704 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54770 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54773 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 55010 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20404 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20492 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55012 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55084 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55087 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55336 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20404 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20492 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 55339 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55488 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55490 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55530 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55533 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55678 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55680 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55716 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55718 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55806 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55808 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55841 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55844 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56000 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56002 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56048 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56051 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56203 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56205 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56247 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56249 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56344 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56346 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56385 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 56388 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56545 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56548 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56780 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48992 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 49083 + _FETCHWORKERCONFIGREQUEST._serialized_start = 49086 + _FETCHWORKERCONFIGREQUEST._serialized_end = 49244 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 49246 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 49331 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 49334 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 49600 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49602 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49702 + _DESCRIBEWORKERREQUEST._serialized_start = 49704 + _DESCRIBEWORKERREQUEST._serialized_end = 49775 + _DESCRIBEWORKERRESPONSE._serialized_start = 49777 + _DESCRIBEWORKERRESPONSE._serialized_end = 49858 + _COUNTWORKERSREQUEST._serialized_start = 49860 + _COUNTWORKERSREQUEST._serialized_end = 49947 + _COUNTWORKERSRESPONSE._serialized_start = 49949 + _COUNTWORKERSRESPONSE._serialized_end = 49986 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49989 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 50130 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 50132 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 50164 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 50167 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 50310 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 50312 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 50346 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 50349 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51526 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51528 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51637 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51640 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51868 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51871 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 52187 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 52189 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 52275 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 52277 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 52393 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 52395 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52504 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52507 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52637 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52640 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53678 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 53628 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53678 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53680 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53751 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53754 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53924 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53927 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54314 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54317 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54478 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54481 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54742 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54744 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54859 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54862 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55001 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55003 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55069 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55072 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 55309 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20703 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20791 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55311 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55383 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55386 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55635 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20703 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20791 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 55638 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55787 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55789 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55829 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55832 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55977 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55979 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56015 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56017 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56105 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56107 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56140 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56143 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56299 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56301 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56347 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56350 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56502 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56504 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56546 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56548 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56643 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56645 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56684 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 56687 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56844 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56847 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57079 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index ed7cb2987..afd7b70f7 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -1281,6 +1281,7 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int STREAM_SLICES_FIELD_NUMBER: builtins.int + WAKES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1404,6 +1405,17 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): """Stream data attached to this task. Delivered out of band so the payloads never enter History; only the offset ranges are recorded there. """ + @property + def wakes( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.workflow.v1.message_pb2.Wake + ]: + """Wakes pending for this execution when the task started, folded by + source. Not recorded in History and never re-supplied on replay: the + Workflow treats one as a reason to read its source now and records what + it read itself. + """ def __init__( self, *, @@ -1443,6 +1455,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): temporalio.api.stream.v1.message_pb2.StreamSlice ] | None = ..., + wakes: collections.abc.Iterable[temporalio.api.workflow.v1.message_pb2.Wake] + | None = ..., ) -> None: ... def HasField( self, @@ -1504,6 +1518,8 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"stream_slices", "task_token", b"task_token", + "wakes", + b"wakes", "workflow_execution", b"workflow_execution", "workflow_execution_task_queue", @@ -3333,6 +3349,84 @@ class SignalWorkflowExecutionResponse(google.protobuf.message.Message): global___SignalWorkflowExecutionResponse = SignalWorkflowExecutionResponse +class WakeWorkflowExecutionRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + WAKE_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + namespace: builtins.str + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """The Workflow to wake. `run_id` is optional. When set, the wake goes to + the current run of the chain that run belongs to, so a sender that + learned a run id before a continue-as-new still reaches the consumer, + and it is refused with NotFound once that chain has ended. When unset, + the wake goes to the current run under the Workflow Id, whichever chain. + """ + @property + def wake(self) -> temporalio.api.workflow.v1.message_pb2.Wake: ... + identity: builtins.str + """The identity of the sender, for metrics and logs.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., + wake: temporalio.api.workflow.v1.message_pb2.Wake | None = ..., + identity: builtins.str = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "wake", b"wake", "workflow_execution", b"workflow_execution" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "identity", + b"identity", + "namespace", + b"namespace", + "wake", + b"wake", + "workflow_execution", + b"workflow_execution", + ], + ) -> None: ... + +global___WakeWorkflowExecutionRequest = WakeWorkflowExecutionRequest + +class WakeWorkflowExecutionResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUN_ID_FIELD_NUMBER: builtins.int + FOLDED_FIELD_NUMBER: builtins.int + run_id: builtins.str + """The run the wake was stored on.""" + folded: builtins.bool + """True when a wake for the source was already pending and no task had + received it yet, so this one changed nothing but possibly the position + and no new task results from it. + """ + def __init__( + self, + *, + run_id: builtins.str = ..., + folded: builtins.bool = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal["folded", b"folded", "run_id", b"run_id"], + ) -> None: ... + +global___WakeWorkflowExecutionResponse = WakeWorkflowExecutionResponse + class SignalWithStartWorkflowExecutionRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index 92da5d6c2..6107f7a24 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xdc\xb2\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xa0\xb5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -135,6 +135,10 @@ _WORKFLOWSERVICE.methods_by_name[ "SignalWorkflowExecution" ]._serialized_options = b'\202\323\344\223\002\301\001"W/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}' + _WORKFLOWSERVICE.methods_by_name["WakeWorkflowExecution"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "WakeWorkflowExecution" + ]._serialized_options = b'\202\323\344\223\002\241\001"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*' _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -526,5 +530,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 39510 + _WORKFLOWSERVICE._serialized_end = 39834 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.py b/temporalio/api/workflowservice/v1/service_pb2_grpc.py index ac29720a3..5e86252af 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.py +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.py @@ -143,6 +143,11 @@ def __init__(self, channel): request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.SerializeToString, response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.FromString, ) + self.WakeWorkflowExecution = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, + ) self.SignalWithStartWorkflowExecution = channel.unary_unary( "/temporal.api.workflowservice.v1.WorkflowService/SignalWithStartWorkflowExecution", request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.SerializeToString, @@ -937,6 +942,17 @@ def SignalWorkflowExecution(self, request, context): context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") + def WakeWorkflowExecution(self, request, context): + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + def SignalWithStartWorkflowExecution(self, request, context): """SignalWithStartWorkflowExecution is used to ensure a signal is sent to a workflow, even if it isn't yet started. @@ -2038,6 +2054,11 @@ def add_WorkflowServiceServicer_to_server(servicer, server): request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.FromString, response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.SerializeToString, ), + "WakeWorkflowExecution": grpc.unary_unary_rpc_method_handler( + servicer.WakeWorkflowExecution, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.SerializeToString, + ), "SignalWithStartWorkflowExecution": grpc.unary_unary_rpc_method_handler( servicer.SignalWithStartWorkflowExecution, request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.FromString, @@ -3227,6 +3248,35 @@ def SignalWorkflowExecution( metadata, ) + @staticmethod + def WakeWorkflowExecution( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + @staticmethod def SignalWithStartWorkflowExecution( request, diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi index b743a159c..7df4ff12b 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi @@ -279,6 +279,16 @@ class WorkflowServiceStub: This results in a `WORKFLOW_EXECUTION_SIGNALED` event recorded in the history and a workflow task being created for the execution. """ + WakeWorkflowExecution: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, + temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse, + ] + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ SignalWithStartWorkflowExecution: grpc.UnaryUnaryMultiCallable[ temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionResponse, @@ -1482,6 +1492,18 @@ class WorkflowServiceServicer(metaclass=abc.ABCMeta): task being created for the execution. """ @abc.abstractmethod + def WakeWorkflowExecution( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse: + """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow + Task because a source it consumes has moved. Unlike a Signal it records + no event, carries no payload, and folds with other wakes for the same + source, so a burst of writes costs one task. The Workflow learns the + source and its position from the task and reads the source itself. + """ + @abc.abstractmethod def SignalWithStartWorkflowExecution( self, request: temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index adb29aecb..0f7a80444 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit adb29aecbe1c8598e0d7e61981219219a49e5ce1 +Subproject commit 0f7a804448ece40abbff8322034db8a290a9f37c diff --git a/temporalio/bridge/services_generated.py b/temporalio/bridge/services_generated.py index c9960fcb5..fdd706cf4 100644 --- a/temporalio/bridge/services_generated.py +++ b/temporalio/bridge/services_generated.py @@ -2243,6 +2243,24 @@ async def validate_worker_deployment_version_compute_config( timeout=timeout, ) + async def wake_workflow_execution( + self, + req: temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse: + """Invokes the WorkflowService.wake_workflow_execution rpc method.""" + return await self._client._rpc_call( + rpc="wake_workflow_execution", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + class OperatorService: """RPC calls for the OperatorService.""" diff --git a/temporalio/bridge/src/client_rpc_generated.rs b/temporalio/bridge/src/client_rpc_generated.rs index ea00d4fd5..3017217c0 100644 --- a/temporalio/bridge/src/client_rpc_generated.rs +++ b/temporalio/bridge/src/client_rpc_generated.rs @@ -1127,6 +1127,15 @@ impl ClientRef { validate_worker_deployment_version_compute_config ) } + "wake_workflow_execution" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + wake_workflow_execution + ) + } _ => { return Err(PyValueError::new_err(format!( "Unknown RPC call {}", From 78454f4c4690529ed4ad92d9084e020bc5ceced2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 11:46:14 -0700 Subject: [PATCH 744/831] Woke Redis readers with the entry id as the wake position. The counter derives from the id so producers and workers order wakes alike, and the server's NOT_FOUND ends a wake without a describe. --- temporalio/streams/providers/redis.py | 59 ++++++++++++++++++++-- tests/streams/test_redis_provider.py | 70 ++++++++++++++++++++++++--- tests/streams/test_redis_replay.py | 69 ++++++++++++++++++++++++++ 3 files changed, 187 insertions(+), 11 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 30bf24c08..225ae98d8 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -193,6 +193,10 @@ _text, _to_record, ) +from temporalio.contrib.external_workflow_streams._redis import ( + _parse as _parse_entry_id, +) +from temporalio.contrib.external_workflow_streams._wake import WakeTransport from temporalio.converter import ( ActivitySerializationContext, SerializationContext, @@ -256,6 +260,26 @@ _WAKE_RETRY_WINDOW: Final = timedelta(seconds=5) _WAKE_RETRY_BACKOFF: Final = timedelta(milliseconds=200) +#: Bits of a wake counter given to an entry id's sequence part. Redis assigns +#: sequence numbers from 0 within one millisecond, so a million appends to one +#: log inside the same millisecond would be needed to reach the cap. +_WAKE_SEQUENCE_BITS: Final = 20 + + +def _wake_counter(offset: Offset) -> int: + """A wake counter from a Redis entry id ``-``. + + ``ms * 2**20 + min(seq, 2**20 - 1)``, which increases with the id's own + order and fits the server's signed 64-bit counter for any millisecond + timestamp before the year 2248. Ids past the cap within one millisecond + share a counter, which only lets a later wake fold into a pending one that + reports an earlier id of that same millisecond. + """ + ms, seq = _parse_entry_id(offset) + cap = (1 << _WAKE_SEQUENCE_BITS) - 1 + return (ms << _WAKE_SEQUENCE_BITS) + min(seq, cap) + + # The transport's per-task batch limits are a backpressure point that awaits # inside the workflow, and a synchronous publish has nowhere to await. Lifted # to where they cannot fire, so a task's publishes stage as one batch. @@ -762,10 +786,16 @@ def __init__( key_prefix: str, retention: timedelta | None, max_len: int | None, + wake_transport: WakeTransport = "auto", ) -> None: super().__init__(client=client, key_prefix=key_prefix) self._retention = retention self._max_len = max_len + self.wake_transport = wake_transport + + def wake_counter_for(self, offset: Offset) -> int: + """The entry id's own order, so producers and workers rank wakes alike.""" + return _wake_counter(offset) def stream_key(self, key: StreamKey) -> str: """The topic's log, whichever direction the transport asks for.""" @@ -1101,6 +1131,12 @@ async def _chain(client: Client, workflow_id: str) -> WorkflowChainKey: _CLOSING_REFUSAL: Final = "workflow is closing" +def _chain_ended(error: WakeNotAcknowledgedError) -> bool: + """Whether the server refused a wake because the chain has ended.""" + cause = error.__cause__ + return isinstance(cause, RPCError) and cause.status == RPCStatusCode.NOT_FOUND + + def _refused_as_closing(error: WakeNotAcknowledgedError) -> bool: """Whether the server refused a wake because the run is closing.""" return _CLOSING_REFUSAL in str(error) @@ -1318,10 +1354,10 @@ async def _place(self, records: list[WireRecord]) -> Offset | None: name=self._name, record=staged, digest=digest ) if self._owner is None and self._standalone is None: - await self._wake() + await self._wake(last) return last - async def _wake(self) -> None: + async def _wake(self, position: Offset | None) -> None: """Wake the consuming workflow, following the chain past a closing run. The records are appended before this is called; what can fail is @@ -1343,14 +1379,19 @@ async def _wake(self) -> None: the log and finds the record, the transport's own rule for a record appended before a park. Any other refusal that outlasts the window is raised. + + ``NOT_FOUND`` answers the chain question without a describe: the wake + call names the chain's first run, and the server refuses it that way + only once the chain has ended. A Signal, which names the Workflow ID + alone, refuses an ended run with it too. """ deadline = time.monotonic() + _WAKE_RETRY_WINDOW.total_seconds() while True: try: - await self._input.wake() + await self._input.wake(position=position) return except WakeNotAcknowledgedError as error: - if await self._chain_is_terminal(): + if _chain_ended(error) or await self._chain_is_terminal(): return if time.monotonic() >= deadline: if _refused_as_closing(error): @@ -1876,6 +1917,7 @@ def __init__( poll_interval: timedelta = timedelta(milliseconds=500), retention: timedelta | None = DEFAULT_RETENTION, max_len: int | None = None, + wake_transport: WakeTransport = "auto", ) -> None: """Create the provider. @@ -1908,7 +1950,14 @@ def __init__( It must exceed the largest batch a task publishes, or a stage is trimmed before its commit; a batch at or above it is refused where it is staged. + wake_transport: How a producer and a worker wake a workflow after + an append. ``"wake"`` uses the server's wake call, which + records no History event; ``"signal"`` uses the reserved + Signal, which does; ``"auto"`` tries the wake call and falls + back to the Signal on a server without it. """ + if wake_transport not in ("auto", "wake", "signal"): + raise ValueError(f"unknown wake transport {wake_transport!r}") if retention is not None and retention <= timedelta(0): raise ValueError("retention must be positive") if max_len is not None and max_len < 1: @@ -1922,6 +1971,7 @@ def __init__( self._poll = poll_interval self._retention = retention self._max_len = max_len + self._wake_transport: WakeTransport = wake_transport def _require_backend(self) -> _TopicLogBackend: if self._backend is None: @@ -1942,6 +1992,7 @@ def _require_backend(self) -> _TopicLogBackend: key_prefix=self._key_prefix, retention=self._retention, max_len=self._max_len, + wake_transport=self._wake_transport, ) return self._backend diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 56f67a578..4330d8703 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -18,6 +18,7 @@ StreamError as TransportStreamError, ) from temporalio.contrib.external_workflow_streams._backend import StreamKey +from temporalio.contrib.external_workflow_streams._record import Offset from temporalio.contrib.external_workflow_streams._redis import RedisStreamBackend from temporalio.converter import DataConverter from temporalio.service import RPCError, RPCStatusCode @@ -31,6 +32,7 @@ _drive, _position, _StandaloneOwner, + _wake_counter, ) @@ -64,9 +66,11 @@ def __init__(self, refusals: int, error: Exception | None = None) -> None: self._refusals = refusals self._error = error self.calls = 0 + self.positions: list[Any] = [] - async def wake(self) -> list[str]: + async def wake(self, *, position: Any = None) -> list[str]: self.calls += 1 + self.positions.append(position) if self.calls <= self._refusals: raise self._error or WakeNotAcknowledgedError( "workflow operation can not be applied because workflow is closing", @@ -99,7 +103,7 @@ async def test_a_wake_refused_by_a_closing_run_is_sent_again_to_its_successor(): # to a successor, which is where the records already are. client = _ChainClient(WorkflowExecutionStatus.RUNNING) wakes = _RefusingInput(refusals=1) - await _waking_producer(client, wakes)._wake() + await _waking_producer(client, wakes)._wake(None) assert (wakes.calls, client.describes) == (2, 1) @@ -111,7 +115,7 @@ async def test_a_refused_wake_waits_for_the_successor_to_become_current(): WorkflowExecutionStatus.CONTINUED_AS_NEW, WorkflowExecutionStatus.RUNNING ) wakes = _RefusingInput(refusals=2) - await _waking_producer(client, wakes)._wake() + await _waking_producer(client, wakes)._wake(None) assert (wakes.calls, client.describes) == (3, 2) @@ -133,7 +137,7 @@ async def test_a_wake_refused_by_a_finished_chain_is_the_ordinary_ending( ): client = _ChainClient(ending) wakes = _RefusingInput(refusals=99) - await _waking_producer(client, wakes)._wake() + await _waking_producer(client, wakes)._wake(None) assert wakes.calls == 1 @@ -144,7 +148,7 @@ async def test_a_wake_refused_as_closing_for_the_whole_window_is_dropped(): # next park rechecks the log and finds it; the producer is not failed. client = _ChainClient(WorkflowExecutionStatus.RUNNING) wakes = _RefusingInput(refusals=99) - await _waking_producer(client, wakes)._wake() + await _waking_producer(client, wakes)._wake(None) assert wakes.calls > 1 @@ -155,15 +159,67 @@ async def test_a_wake_refused_for_another_reason_for_the_whole_window_is_raised( refusals=99, error=WakeNotAcknowledgedError("signal rate limited", pending=[]) ) with pytest.raises(WakeNotAcknowledgedError, match="rate limited"): - await _waking_producer(client, wakes)._wake() + await _waking_producer(client, wakes)._wake(None) assert wakes.calls > 1 +@pytest.mark.usefixtures("quick_wake_retries") +async def test_a_wake_refused_as_not_found_ends_without_a_describe(): + # The wake call names the chain's first run, so the server's NOT_FOUND + # already says the chain has ended. + client = _ChainClient(WorkflowExecutionStatus.RUNNING) + refusal = WakeNotAcknowledgedError("gone", pending=[]) + refusal.__cause__ = RPCError("gone", RPCStatusCode.NOT_FOUND, b"") + wakes = _RefusingInput(refusals=99, error=refusal) + await _waking_producer(client, wakes)._wake(None) + assert (wakes.calls, client.describes) == (1, 0) + + +async def test_a_wake_reports_the_entry_it_follows(): + client = _ChainClient(WorkflowExecutionStatus.RUNNING) + wakes = _RefusingInput(refusals=0) + placed = Offset("1700000000000-4") + await _waking_producer(client, wakes)._wake(placed) + assert wakes.positions == [placed] + + +def test_a_wake_counter_follows_the_entry_id_order(): + ids = ["1700000000000-0", "1700000000000-1", "1700000000001-0", "1800000000000-7"] + counters = [_wake_counter(Offset(entry)) for entry in ids] + assert counters == sorted(counters) + assert len(set(counters)) == len(counters) + assert _wake_counter(Offset("1700000000000-3")) == 1700000000000 * 2**20 + 3 + + +def test_a_wake_counter_caps_the_sequence_inside_its_millisecond(): + capped = _wake_counter(Offset(f"5-{2**20 + 9}")) + assert capped == 5 * 2**20 + 2**20 - 1 + assert capped < _wake_counter(Offset("6-0")) + + +def test_a_wake_counter_fits_the_servers_signed_64_bit_field(): + year_2200_ms = 7258118400000 + assert _wake_counter(Offset(f"{year_2200_ms}-{2**20}")) < 2**63 + + +def test_the_wake_transport_reaches_the_backend_both_sides_share(): + streams = RedisStreams(client=_NoRedis(), wake_transport="signal") + backend = streams._require_backend() + assert backend.wake_transport == "signal" + assert backend.wake_counter_for(Offset("2-1")) == _wake_counter(Offset("2-1")) + assert RedisStreams(client=_NoRedis())._require_backend().wake_transport == "auto" + + +def test_an_unknown_wake_transport_is_refused_at_construction(): + with pytest.raises(ValueError, match="wake transport"): + RedisStreams(wake_transport=cast(Any, "carrier-pigeon")) + + async def test_a_wake_the_store_could_not_send_is_a_storage_error(): client = _ChainClient(WorkflowExecutionStatus.RUNNING) wakes = _RefusingInput(refusals=1, error=TransportStreamError("no connection")) with pytest.raises(StreamError, match="could not be sent"): - await _waking_producer(client, wakes)._wake() + await _waking_producer(client, wakes)._wake(None) assert (wakes.calls, client.describes) == (1, 0) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index b1f3ebc3e..4258e69e5 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -138,6 +138,75 @@ async def read_everything() -> list[Any]: assert all(r.producer_id == "model" and r.attempt == 1 for r in inputs) +async def _serves_wakes(client: Client) -> bool: + """Whether the server implements the wake call, probed with a wake to nobody.""" + import temporalio.api.common.v1 + import temporalio.api.workflow.v1 + import temporalio.api.workflowservice.v1 + from temporalio.service import RPCError, RPCStatusCode + + try: + await client.workflow_service.wake_workflow_execution( + temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest( + namespace=client.namespace, + workflow_execution=temporalio.api.common.v1.WorkflowExecution( + workflow_id=f"streams-redis-probe-{uuid.uuid4().hex}" + ), + wake=temporalio.api.workflow.v1.Wake(source="probe", counter=1), + ) + ) + except RPCError as error: + return error.status != RPCStatusCode.UNIMPLEMENTED + return True + + +async def test_an_outside_producer_wakes_the_reader_without_a_signal( + live_client: Client, +): + if not await _serves_wakes(live_client): + pytest.skip("the server does not implement WakeWorkflowExecution") + # The wake transport rather than "auto", so a fallback to the Signal fails + # the History check below instead of passing quietly. + provider = RedisStreams( + url=redis_url(), + key_prefix=f"streams-redis-{uuid.uuid4().hex}", + wake_transport="wake", + ) + workflow_id = f"streams-redis-wake-{uuid.uuid4().hex}" + try: + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[ContractLoop], + plugins=[provider], + max_cached_workflows=100, + ): + handle = await live_client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # Spaced past the reader's idle timeout, so the reader parks between + # appends and only a wake from outside can move it. + for n in (1, 2, 3): + await producer.append({"n": n}) + await asyncio.sleep(2) + await producer.finish() + + result = await asyncio.wait_for(handle.result(), 60) + assert [entry.get("n") for entry in result[:3]] == [1, 2, 3] + assert result[3] == {"kind": "finish", "producer": "model"} + + signalled = [ + event + async for event in handle.fetch_history_events() + if event.HasField("workflow_execution_signaled_event_attributes") + ] + assert signalled == [] + finally: + await provider.close() + + async def test_an_outside_producer_and_the_workflow_share_a_topic( live_client: Client, provider: RedisStreams ): From a9fcc6db46a5590eb4de9f9fe0ccf7fca27bedba Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 12:14:05 -0700 Subject: [PATCH 745/831] Kept the streams docstrings free of links to later layers. The workflow and activity accessors and Client.get_stream_handle arrive on a later layer, so pydoctor finds no target for them here and the docs build fails. They stay named as literal text. --- temporalio/streams/__init__.py | 12 ++++++------ temporalio/streams/_provider.py | 4 ++-- temporalio/streams/_ref.py | 4 ++-- temporalio/streams/_topic.py | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/temporalio/streams/__init__.py b/temporalio/streams/__init__.py index f5b8076fa..9b7cb2df2 100644 --- a/temporalio/streams/__init__.py +++ b/temporalio/streams/__init__.py @@ -8,12 +8,12 @@ The contract, in five statements: 1. **A workflow publishes only to topics of its own stream, and it publishes - transactionally.** :meth:`temporalio.workflow.StreamWriter.publish` + transactionally.** ``temporalio.workflow.StreamWriter.publish`` returns at once. The record is visible when the Workflow Task is accepted, and never if the task fails, so no reader can see a decision the workflow did not commit. 2. **Reading is an observation, and the SDK records it.** What - :class:`temporalio.workflow.StreamReader` handed to workflow code, + ``temporalio.workflow.StreamReader`` handed to workflow code, including the boundary where it found nothing, is committed with the commands that reading produced. Recovery re-supplies the same records in the same order. @@ -43,11 +43,11 @@ ``Client.connect(plugins=[provider])``; workers built from that client inherit it, and ``Worker(plugins=[provider])`` or ``Replayer(plugins=[provider])`` registers it on a worker alone. Each context then asks for its stream the -same way. Workflow code uses :func:`temporalio.workflow.stream_reader` and -:func:`temporalio.workflow.stream_writer`. An activity uses -:func:`temporalio.activity.stream_handle`, which is its own workflow pinned +same way. Workflow code uses ``temporalio.workflow.stream_reader`` and +``temporalio.workflow.stream_writer``. An activity uses +``temporalio.activity.stream_handle``, which is its own workflow pinned to its run unless told otherwise. Any process holding a client uses -:meth:`temporalio.client.Client.get_stream_handle`, which mirrors +``temporalio.client.Client.get_stream_handle``, which mirrors ``get_workflow_handle``. The explicit form, ``provider.get_stream_handle(client, workflow_id)``, stays for a process that talks to two stores. This module keeps the shared types, the errors and the diff --git a/temporalio/streams/_provider.py b/temporalio/streams/_provider.py index cadb7c106..662bc7918 100644 --- a/temporalio/streams/_provider.py +++ b/temporalio/streams/_provider.py @@ -110,8 +110,8 @@ class StreamHandle(Protocol): A handle is bound to its client and provider. To hand a stream to another process, :meth:`ref` names it as a :class:`temporalio.streams.StreamRef`, which is plain data; the receiver opens it with - :meth:`temporalio.client.Client.get_stream_handle` or - :func:`temporalio.activity.stream_handle`, and calls that name no topic + ``temporalio.client.Client.get_stream_handle`` or + ``temporalio.activity.stream_handle``, and calls that name no topic on that handle address the ref's topic. """ diff --git a/temporalio/streams/_ref.py b/temporalio/streams/_ref.py index 5322f4cdb..3d0eb0a5d 100644 --- a/temporalio/streams/_ref.py +++ b/temporalio/streams/_ref.py @@ -41,8 +41,8 @@ class StreamRef: when only the ids are at hand. The default data converter carries it as JSON, so it can be a workflow argument, an activity result, or a Nexus operation input or result, and - :meth:`temporalio.client.Client.get_stream_handle` and - :func:`temporalio.activity.stream_handle` open one directly. + ``temporalio.client.Client.get_stream_handle`` and + ``temporalio.activity.stream_handle`` open one directly. """ kind: StreamOwnerKind diff --git a/temporalio/streams/_topic.py b/temporalio/streams/_topic.py index 557b9c24a..f887b6b57 100644 --- a/temporalio/streams/_topic.py +++ b/temporalio/streams/_topic.py @@ -40,8 +40,8 @@ class StreamTopic(Generic[T]): """A topic of a workflow's stream, with the type its records decode to. - Made with :func:`topic`. Hand it to :func:`temporalio.workflow.stream_reader`, - :func:`temporalio.workflow.stream_writer`, and to a handle's ``read``, + Made with :func:`topic`. Hand it to ``temporalio.workflow.stream_reader``, + ``temporalio.workflow.stream_writer``, and to a handle's ``read``, ``latest`` and ``producer``, and the record and value types follow from it; ``result_type=`` is not passed alongside a definition. """ From 0b9bf5790075f8e8d88f73a3ebe09f473e5a8865 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 12:19:40 -0700 Subject: [PATCH 746/831] Pointed the Nexus provider docstring at the call that opens a reference. NexusStreams has no open method, so pydoctor found no link target and the docs build failed. --- temporalio/streams/providers/nexus.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 27ac56da3..1cc60d236 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -36,8 +36,8 @@ :class:`temporalio.streams.StreamUnsupportedError`, so a reference is good behind any endpoint that serves the owner. The same reference is what an operation of the application's own returns to hand a stream to its caller; -:meth:`NexusStreamHandle.ref` makes one and :meth:`NexusStreams.open` opens -it. +:meth:`NexusStreamHandle.ref` makes one and ``client.get_stream_handle(ref)`` +opens it. The handler keeps one parked read per stream reference and serves consecutive calls from it, so an idle caller does not leave one abandoned From 19216f93fe7f4af8cdc96470d65724e1da42d2fa Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 12:29:36 -0700 Subject: [PATCH 747/831] Repinned Core to the delivery head with the C bridge wake dispatch. The move only touches the C bridge, so the vendored protos and the bridge client regenerate unchanged. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 0f7a80444..e2f678358 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 0f7a804448ece40abbff8322034db8a290a9f37c +Subproject commit e2f6783585b8bcd1cd578d9867251370896a5dc3 From c19be0b4632fcabcc3ec7bd577af10f6da6a5686 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 12:54:43 -0700 Subject: [PATCH 748/831] Marked a wake() mention as literal so the docs build resolves. --- temporalio/contrib/external_workflow_streams/_producer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/contrib/external_workflow_streams/_producer.py b/temporalio/contrib/external_workflow_streams/_producer.py index 95ac8431d..a33aca753 100644 --- a/temporalio/contrib/external_workflow_streams/_producer.py +++ b/temporalio/contrib/external_workflow_streams/_producer.py @@ -492,7 +492,7 @@ def __init__( self._appends: dict[StreamKey, list[_StreamOperation]] = {} #: Per stream, the furthest offset this producer has seen acknowledged. #: A wake reports it so its counter follows the store's order, and a - #: batch closed by a bare `wake()` still reports where it ended. + #: batch closed by a bare ``wake()`` still reports where it ended. self._last_offsets: dict[StreamKey, Offset] = {} @staticmethod From b3c3e1f493c2bd2ae497fce172418a245e0e0763 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 12:54:59 -0700 Subject: [PATCH 749/831] Kept the producer's doc comment free of a pydoctor link. --- temporalio/contrib/external_workflow_streams/_producer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/contrib/external_workflow_streams/_producer.py b/temporalio/contrib/external_workflow_streams/_producer.py index 95ac8431d..a33aca753 100644 --- a/temporalio/contrib/external_workflow_streams/_producer.py +++ b/temporalio/contrib/external_workflow_streams/_producer.py @@ -492,7 +492,7 @@ def __init__( self._appends: dict[StreamKey, list[_StreamOperation]] = {} #: Per stream, the furthest offset this producer has seen acknowledged. #: A wake reports it so its counter follows the store's order, and a - #: batch closed by a bare `wake()` still reports where it ended. + #: batch closed by a bare ``wake()`` still reports where it ended. self._last_offsets: dict[StreamKey, Offset] = {} @staticmethod From 74e0b7581a6e8a0cc74a523230927a7f07f18610 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 13:24:17 -0700 Subject: [PATCH 750/831] Allowed external-stream publishes from the workflow constructor. Per-Run state lives on the SDK's Run object and the runtime is installed before the constructor runs, since the user's object does not exist yet while @workflow.init executes. --- .../contrib/external_workflow_streams/_api.py | 32 ++++++----- temporalio/worker/_workflow_instance.py | 27 +++++----- .../external_workflow_streams/test_api.py | 20 +++++-- .../test_delivery_budget.py | 5 +- .../test_multi_stream.py | 15 ++++-- .../external_workflow_streams/test_replay.py | 5 +- .../test_worker_integration.py | 54 +++++++++++++++++++ 7 files changed, 123 insertions(+), 35 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index c89986954..feca4ca7d 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -71,7 +71,7 @@ and diverge from the live run. """ -#: Where per-Run subscription state hangs off the Workflow instance. Reserved, +#: Where per-Run subscription state hangs off the SDK's Run object. Reserved, #: and deliberately not in the ``__temporal_workflow_stream*`` namespace the #: shipped contrib feature already owns. _RUN_STATE_ATTR = "__temporal_external_stream_state" @@ -175,9 +175,11 @@ def discard_pending(self, wait_id: int) -> None: class _RunState: """Per-Run subscription bookkeeping. - Lives on the Workflow instance rather than in a module global, so it shares - the instance's lifetime exactly -- a module global would outlive an evicted - Run and hand its wait ids to the next one. + Lives on the SDK's object for the Run rather than in a module global, so it + shares the Run's lifetime exactly -- a module global would outlive an evicted + Run and hand its wait ids to the next one. Not on the user's Workflow object + either: that object does not exist while its ``@workflow.init`` constructor + runs, and a constructor may publish. """ runtime: ExternalStreamRuntime | None = None @@ -186,26 +188,32 @@ class _RunState: pending: dict[int, Any] = field(default_factory=dict) +def _run_holder() -> Any: + """The object per-Run state hangs off: the SDK's runtime for the current Run.""" + return temporalio.workflow._Runtime.current() + + def _run_state() -> _RunState: - instance = temporalio.workflow.instance() - state = getattr(instance, _RUN_STATE_ATTR, None) + holder = _run_holder() + state = getattr(holder, _RUN_STATE_ATTR, None) if state is None: state = _RunState() - setattr(instance, _RUN_STATE_ATTR, state) + setattr(holder, _RUN_STATE_ATTR, state) return state def _install_runtime( # pyright: ignore[reportUnusedFunction] - instance: Any, runtime: ExternalStreamRuntime + holder: Any, runtime: ExternalStreamRuntime ) -> None: - """Gives a Workflow instance its handle to the Worker's manager. + """Gives a Run its handle to the Worker's manager. - Called by the Worker when it creates the instance. + Called by the Worker with its object for the Run, before the Workflow's + constructor runs, so a constructor can subscribe and publish. """ - state = getattr(instance, _RUN_STATE_ATTR, None) + state = getattr(holder, _RUN_STATE_ATTR, None) if state is None: state = _RunState() - setattr(instance, _RUN_STATE_ATTR, state) + setattr(holder, _RUN_STATE_ATTR, state) state.runtime = runtime diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 81674909d..2710d22f9 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -318,6 +318,19 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: self._extern_functions = det.extern_functions self._external_stream_runtime = det.external_stream_runtime self._external_streams_configured = det.external_streams_configured + # Installed on this object, before the Workflow's constructor runs, so a + # ``@workflow.init`` constructor can publish and subscribe. Per-Run state + # must share the Run's lifetime, which this object has and a module global + # would not. + if ( + self._external_stream_runtime is not None + and self._external_streams_configured + ): + from temporalio.contrib.external_workflow_streams._api import ( + _install_runtime, + ) + + _install_runtime(self, self._external_stream_runtime) self._pending_replay_finish: Any = None """A marker replay whose last segment the activation's own drain serves. @@ -3133,20 +3146,6 @@ def _instantiate_workflow_object(self) -> Any: else: workflow_instance = self._defn.cls() - # Hand the workflow object its External Stream handle. It goes on the - # object rather than in a module global because per-Run state must share - # the Run's lifetime exactly -- a global would outlive an evicted Run and - # hand its wait ids to the next one. - if ( - self._external_stream_runtime is not None - and self._external_streams_configured - ): - from temporalio.contrib.external_workflow_streams._api import ( - _install_runtime, - ) - - _install_runtime(workflow_instance, self._external_stream_runtime) - if self._defn.versioning_behavior: self._versioning_behavior = self._defn.versioning_behavior # If there's a dynamic config function, call it now after we've instantiated the object diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 236d0b614..9b950650d 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -148,7 +148,10 @@ class FakeInstance: @pytest.fixture def workflow_instance(monkeypatch: pytest.MonkeyPatch) -> FakeInstance: instance = FakeInstance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: instance, + ) return instance @@ -242,7 +245,10 @@ def test_wait_ids_reproduce_across_two_runs_of_the_same_code( def run_once() -> list[int]: instance = FakeInstance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: instance, + ) _install_runtime(instance, FakeRuntime()) return [ external_stream.topic(name).subscribe().wait_id @@ -276,12 +282,18 @@ def test_a_second_run_restarts_the_counter(monkeypatch: pytest.MonkeyPatch) -> N A module global would outlive the Run and hand its wait ids to the next one. """ first_instance = FakeInstance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: first_instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: first_instance, + ) _install_runtime(first_instance, FakeRuntime()) external_stream.topic("tokens").subscribe() second_instance = FakeInstance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: second_instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: second_instance, + ) _install_runtime(second_instance, FakeRuntime()) assert external_stream.topic("tokens").subscribe().wait_id == 1 diff --git a/tests/contrib/external_workflow_streams/test_delivery_budget.py b/tests/contrib/external_workflow_streams/test_delivery_budget.py index 79386d6fe..b2a2cb307 100644 --- a/tests/contrib/external_workflow_streams/test_delivery_budget.py +++ b/tests/contrib/external_workflow_streams/test_delivery_budget.py @@ -73,7 +73,10 @@ class FakeInstance: @pytest.fixture def workflow_instance(monkeypatch: pytest.MonkeyPatch) -> FakeInstance: instance = FakeInstance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: instance, + ) return instance diff --git a/tests/contrib/external_workflow_streams/test_multi_stream.py b/tests/contrib/external_workflow_streams/test_multi_stream.py index c90acb21c..856413032 100644 --- a/tests/contrib/external_workflow_streams/test_multi_stream.py +++ b/tests/contrib/external_workflow_streams/test_multi_stream.py @@ -215,7 +215,10 @@ class Instance: """Stands in for the Workflow object the per-Run state hangs off.""" instance = Instance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: instance, + ) runtime = make_runtime(manager, backend, idle=timedelta(seconds=1)) _install_runtime(instance, runtime) # type: ignore[arg-type] @@ -518,7 +521,10 @@ class FakeInstance: @pytest.fixture def fake_runtime(monkeypatch: pytest.MonkeyPatch) -> FakeRuntime: instance = FakeInstance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: instance, + ) runtime = FakeRuntime() _install_runtime(instance, runtime) # type: ignore[arg-type] return runtime @@ -802,7 +808,10 @@ class Instance: pass instance = Instance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: instance, + ) runtime = make_runtime(manager, backend) _install_runtime(instance, runtime) # type: ignore[arg-type] return runtime diff --git a/tests/contrib/external_workflow_streams/test_replay.py b/tests/contrib/external_workflow_streams/test_replay.py index bc9ee978c..d0d15490b 100644 --- a/tests/contrib/external_workflow_streams/test_replay.py +++ b/tests/contrib/external_workflow_streams/test_replay.py @@ -2103,7 +2103,10 @@ async def test_a_segment_replays_in_its_recorded_cross_stream_order( runtime = make_runtime(manager, backend) instance = FakeInstance() - monkeypatch.setattr(temporalio.workflow, "instance", lambda: instance) + monkeypatch.setattr( + "temporalio.contrib.external_workflow_streams._api._run_holder", + lambda: instance, + ) _install_runtime(instance, runtime) runtime.begin_replay(plan.annotation.header.streams) diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index f9ad6d5d7..76e6c8be2 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -132,6 +132,32 @@ async def run(self) -> None: timer.cancel() +@workflow.defn +class SubscribeInInitWorkflow: + """Subscribes from its ``@workflow.init`` constructor and consumes in ``run``. + + The user's object does not exist yet while the constructor runs, so per-Run + stream state cannot hang off it. + """ + + @workflow.init + def __init__(self, expected: int) -> None: + self._tokens = ( + external_stream.with_options(idle_timeout=timedelta(seconds=30)) + .topic("tokens", type=str) + .subscribe() + ) + + @workflow.run + async def run(self, expected: int) -> list[str]: + seen: list[str] = [] + async for token in self._tokens: + seen.append(token) + if len(seen) >= expected: + break + return seen + + @pytest.fixture def backend() -> MemoryStreamBackend: return MemoryStreamBackend() @@ -210,6 +236,34 @@ async def test_a_workflow_consumes_records_it_never_read_itself( ] +async def test_a_constructor_can_subscribe( + client: Client, backend: MemoryStreamBackend +) -> None: + task_queue = f"tq-{uuid.uuid4()}" + async with Worker( + client, + task_queue=task_queue, + workflows=[SubscribeInInitWorkflow], + external_stream_backend=backend, + ): + handle = await client.start_workflow( + SubscribeInInitWorkflow.run, + 2, + id=f"wf-{uuid.uuid4()}", + task_queue=task_queue, + ) + description = await handle.describe() + key = StreamKey( + client.namespace, + handle.id, + description.raw_description.workflow_execution_info.first_run_id, + "tokens", + ) + await publish(backend, key, ["alpha", "beta"]) + + assert await asyncio.wait_for(handle.result(), 30) == ["alpha", "beta"] + + async def test_no_stream_payload_reaches_history( client: Client, backend: MemoryStreamBackend ) -> None: From 41ddb61cce3c3f6c8628afb91e9c60280817d8ea Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 13:25:51 -0700 Subject: [PATCH 751/831] Added a conformance case for a publish from the constructor. --- tests/streams/test_streams_conformance.py | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index c557b9b69..195950f82 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -36,6 +36,7 @@ import pytest +from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.common import RawValue @@ -66,6 +67,8 @@ ) from temporalio.streams._ref import RefHandle, open_ref from temporalio.streams.providers.memory import MemoryStreams +from temporalio.testing import WorkflowEnvironment +from tests.helpers import new_worker # Defined once and shared by every case, the way an application shares them # between its workflow, its activities and its backend. @@ -824,3 +827,38 @@ async def test_a_standalone_stream_honors_its_retention_policy(case: ProviderCas await producer.append({"n": "new"}) kept = await take(by_age.read(topic=OUT), 1) assert [r.value for r in kept] == [{"n": "new"}] + + +@workflow.defn +class PublishFromConstructor: + """Publishes once from its ``@workflow.init`` constructor and once from ``run``.""" + + @workflow.init + def __init__(self) -> None: + workflow.stream_writer(OUT).publish({"from": "init"}) + + @workflow.run + async def run(self) -> None: + workflow.stream_writer(OUT).publish({"from": "run"}) + + +async def test_a_publish_from_the_constructor_is_delivered( + case: ProviderCase, client: Client, env: WorkflowEnvironment +): + if env.supports_time_skipping and case.client is None: + pytest.skip("the memory provider polls on a timer, which time skipping spins") + # A storage provider's setup registers it on its client, which a worker + # inherits; the memory provider is handed to the worker directly. + worker_client = case.client or client + plugins = [] if case.client is not None else [case.provider] + workflow_id = new_workflow_id() + async with new_worker( + worker_client, PublishFromConstructor, plugins=plugins + ) as worker: + handle = await worker_client.start_workflow( + PublishFromConstructor.run, id=workflow_id, task_queue=worker.task_queue + ) + await asyncio.wait_for(handle.result(), 30) + stream = case.provider.get_stream_handle(worker_client, workflow_id) + records = await take(stream.read(topic=OUT), 2, 30) + assert [r.value for r in records] == [{"from": "init"}, {"from": "run"}] From 9131330ba9cf6ded55ede0bb9875600fd1e32132 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 13:39:16 -0700 Subject: [PATCH 752/831] Read the constructor-publish case while the worker still polls. --- tests/streams/test_streams_conformance.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 48c6338ab..867d9dbe8 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -1199,6 +1199,8 @@ async def test_a_publish_from_the_constructor_is_delivered( PublishFromConstructor.run, id=workflow_id, task_queue=worker.task_queue ) await asyncio.wait_for(handle.result(), 30) - stream = case.provider.get_stream_handle(worker_client, workflow_id) - records = await take(stream.read(topic=OUT), 2, 30) + # Read while the worker still polls: the workflow_streams provider + # answers reads from the workflow itself. + stream = case.provider.get_stream_handle(worker_client, workflow_id) + records = await take(stream.read(topic=OUT), 2, 30) assert [r.value for r in records] == [{"from": "init"}, {"from": "run"}] From f57fd8004a319efede98508e70ba05fa799115d8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 18:17:06 -0700 Subject: [PATCH 753/831] Satisfied basedpyright on the wake transport and the new external-stream tests. --- temporalio/contrib/external_workflow_streams/_wake.py | 6 ++++-- tests/contrib/external_workflow_streams/test_api.py | 1 - .../external_workflow_streams/test_delivery_budget.py | 1 - .../contrib/external_workflow_streams/test_multi_stream.py | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index daec3e3ee..66e3db0d2 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -31,7 +31,7 @@ import uuid import weakref from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Literal +from typing import TYPE_CHECKING, Any, Literal, get_args import temporalio.api.common.v1 import temporalio.api.workflow.v1 @@ -374,7 +374,9 @@ async def send_wake( ``"wake"`` this includes ``UNIMPLEMENTED``, since that transport was asked for explicitly. """ - if transport not in ("auto", "wake", "signal"): + # Checked against the alias rather than a literal tuple so an untyped caller + # still gets a ValueError instead of a silent Signal. + if transport not in get_args(WakeTransport): raise ValueError(f"unknown wake transport {transport!r}") if transport == "auto" and _known_signal_only(client): transport = "signal" diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 9b950650d..0ed8b367e 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -10,7 +10,6 @@ import pytest import temporalio.converter -import temporalio.workflow from temporalio.contrib.external_workflow_streams import _api from temporalio.contrib.external_workflow_streams._api import ( DEFAULT_IDLE_TIMEOUT, diff --git a/tests/contrib/external_workflow_streams/test_delivery_budget.py b/tests/contrib/external_workflow_streams/test_delivery_budget.py index b2a2cb307..3c766417b 100644 --- a/tests/contrib/external_workflow_streams/test_delivery_budget.py +++ b/tests/contrib/external_workflow_streams/test_delivery_budget.py @@ -27,7 +27,6 @@ import pytest import temporalio.converter -import temporalio.workflow from temporalio.contrib.external_workflow_streams import _runtime as _runtime_module from temporalio.contrib.external_workflow_streams._annotation import ( MAX_ANNOTATION_BYTES, diff --git a/tests/contrib/external_workflow_streams/test_multi_stream.py b/tests/contrib/external_workflow_streams/test_multi_stream.py index 856413032..2bdb5c90b 100644 --- a/tests/contrib/external_workflow_streams/test_multi_stream.py +++ b/tests/contrib/external_workflow_streams/test_multi_stream.py @@ -20,7 +20,6 @@ import pytest_asyncio import temporalio.converter -import temporalio.workflow from temporalio import workflow from temporalio.client import Client from temporalio.contrib.external_workflow_streams._annotation import decode_annotation From a7c8a421bb71dcbd4ebf9181674c8f354e142308 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 18:20:09 -0700 Subject: [PATCH 754/831] Satisfied basedpyright on the Redis provider's wake transport guard. --- temporalio/streams/providers/redis.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 225ae98d8..dd382a19a 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -133,7 +133,7 @@ from collections.abc import AsyncGenerator, Awaitable, Callable, Coroutine, Sequence from dataclasses import dataclass, replace from datetime import timedelta -from typing import Any, Final, Generic, TypeVar +from typing import Any, Final, Generic, TypeVar, get_args from urllib.parse import quote from google.protobuf.message import DecodeError @@ -1956,7 +1956,8 @@ def __init__( Signal, which does; ``"auto"`` tries the wake call and falls back to the Signal on a server without it. """ - if wake_transport not in ("auto", "wake", "signal"): + # Checked against the alias so an untyped caller still gets a ValueError. + if wake_transport not in get_args(WakeTransport): raise ValueError(f"unknown wake transport {wake_transport!r}") if retention is not None and retention <= timedelta(0): raise ValueError("retention must be positive") From 0eb2927d58f069acb0bc3ff069120015e9533388 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 18:17:24 -0700 Subject: [PATCH 755/831] Pinned the Core protos with the notification channel and regenerated the clients. Core moves to the protos-only branch commit that carries the notification channel: the Notification message, the five channel calls, the subscribe command and event, the notifications on the scheduled Workflow Task event, and the bridge's command and activation job for them. The vendored tree, the payload visitor and the bridge client regenerate from the pin. --- temporalio/api/command/v1/__init__.py | 2 + temporalio/api/command/v1/message_pb2.py | 30 +- temporalio/api/command/v1/message_pb2.pyi | 36 + temporalio/api/enums/v1/command_type_pb2.py | 5 +- temporalio/api/enums/v1/command_type_pb2.pyi | 2 + temporalio/api/enums/v1/event_type_pb2.py | 5 +- temporalio/api/enums/v1/event_type_pb2.pyi | 8 + temporalio/api/enums/v1/failed_cause_pb2.py | 25 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 12 + temporalio/api/history/v1/__init__.py | 2 + temporalio/api/history/v1/message_pb2.py | 297 ++-- temporalio/api/history/v1/message_pb2.pyi | 63 + temporalio/api/notification/__init__.py | 0 temporalio/api/notification/v1/__init__.py | 7 + temporalio/api/notification/v1/message_pb2.py | 88 ++ .../api/notification/v1/message_pb2.pyi | 194 +++ temporalio/api/workflow/v1/message_pb2.pyi | 4 + temporalio/api/workflowservice/v1/__init__.py | 20 + .../v1/request_response_pb2.py | 1281 +++++++++-------- .../v1/request_response_pb2.pyi | 316 ++++ .../api/workflowservice/v1/service_pb2.py | 24 +- .../workflowservice/v1/service_pb2_grpc.py | 245 ++++ .../workflowservice/v1/service_pb2_grpc.pyi | 100 ++ temporalio/bridge/_visitor.py | 16 + .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 123 +- .../workflow_activation_pb2.pyi | 45 + .../proto/workflow_commands/__init__.py | 2 + .../workflow_commands_pb2.py | 148 +- .../workflow_commands_pb2.pyi | 35 + temporalio/bridge/sdk-core | 2 +- temporalio/bridge/services_generated.py | 90 ++ temporalio/bridge/src/client_rpc_generated.rs | 45 + 33 files changed, 2428 insertions(+), 846 deletions(-) create mode 100644 temporalio/api/notification/__init__.py create mode 100644 temporalio/api/notification/v1/__init__.py create mode 100644 temporalio/api/notification/v1/message_pb2.py create mode 100644 temporalio/api/notification/v1/message_pb2.pyi diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index d1b241274..2f9ac1a91 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -17,6 +17,7 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeNotificationChannelCommandAttributes, SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) @@ -40,6 +41,7 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeNotificationChannelCommandAttributes", "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index 68d370f59..d9f90890a 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"r\n$AppendStreamRecordsCommandAttributes\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x98\x01\n SubscribeStreamCommandAttributes\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPositionB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xea\x14\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x12\x83\x01\n1subscribe_notification_channel_command_attributes\x18\x16 \x01(\x0b\x32\x46.temporal.api.command.v1.SubscribeNotificationChannelCommandAttributesH\x00\x42\x0c\n\nattributes"r\n$AppendStreamRecordsCommandAttributes\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x98\x01\n SubscribeStreamCommandAttributes\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"@\n-SubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\tB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -115,6 +115,9 @@ _SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ "SubscribeStreamCommandAttributes" ] +_SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeNotificationChannelCommandAttributes" +] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", (_message.Message,), @@ -363,6 +366,19 @@ ) _sym_db.RegisterMessage(SubscribeStreamCommandAttributes) +SubscribeNotificationChannelCommandAttributes = ( + _reflection.GeneratedProtocolMessageType( + "SubscribeNotificationChannelCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeNotificationChannelCommandAttributes) + }, + ) +) +_sym_db.RegisterMessage(SubscribeNotificationChannelCommandAttributes) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\032io.temporal.api.command.v1B\014MessageProtoP\001Z%go.temporal.io/api/command/v1;command\252\002\031Temporalio.Api.Command.V1\352\002\034Temporalio::Api::Command::V1" @@ -453,9 +469,11 @@ _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 _COMMAND._serialized_start = 5274 - _COMMAND._serialized_end = 7806 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7808 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7922 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7925 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8077 + _COMMAND._serialized_end = 7940 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7942 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 8056 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 8059 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8211 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8213 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8277 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 6d6422c50..26fafd68b 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -1122,6 +1122,7 @@ class Command(google.protobuf.message.Message): REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int APPEND_STREAM_RECORDS_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_NOTIFICATION_CHANNEL_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1220,6 +1221,10 @@ class Command(google.protobuf.message.Message): def subscribe_stream_command_attributes( self, ) -> global___SubscribeStreamCommandAttributes: ... + @property + def subscribe_notification_channel_command_attributes( + self, + ) -> global___SubscribeNotificationChannelCommandAttributes: ... def __init__( self, *, @@ -1268,6 +1273,8 @@ class Command(google.protobuf.message.Message): | None = ..., subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes | None = ..., + subscribe_notification_channel_command_attributes: global___SubscribeNotificationChannelCommandAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -1308,6 +1315,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_notification_channel_command_attributes", + b"subscribe_notification_channel_command_attributes", "subscribe_stream_command_attributes", b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", @@ -1359,6 +1368,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_notification_channel_command_attributes", + b"subscribe_notification_channel_command_attributes", "subscribe_stream_command_attributes", b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", @@ -1390,6 +1401,7 @@ class Command(google.protobuf.message.Message): "request_cancel_nexus_operation_command_attributes", "append_stream_records_command_attributes", "subscribe_stream_command_attributes", + "subscribe_notification_channel_command_attributes", ] | None ): ... @@ -1500,3 +1512,27 @@ class SubscribeStreamCommandAttributes(google.protobuf.message.Message): ) -> None: ... global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes + +class SubscribeNotificationChannelCommandAttributes(google.protobuf.message.Message): + """Makes the Workflow a listener of a notification channel for this run. The + next notifications on the channel arrive on the scheduled event of a Workflow + Task. The subscription ends with the run, and a successor subscribes again. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """The channel to listen on, as the writers name it.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___SubscribeNotificationChannelCommandAttributes = ( + SubscribeNotificationChannelCommandAttributes +) diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 17f70d8a6..dcb39197c 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe7\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x98\x07\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x12/\n+COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL\x10\x15\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -41,11 +41,12 @@ COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 COMMAND_TYPE_APPEND_STREAM_RECORDS = 19 COMMAND_TYPE_SUBSCRIBE_STREAM = 20 +COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL = 21 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 939 + _COMMANDTYPE._serialized_end = 988 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index c6f21ab4b..64fb7729c 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -46,6 +46,7 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 COMMAND_TYPE_APPEND_STREAM_RECORDS: _CommandType.ValueType # 19 COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 + COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL: _CommandType.ValueType # 21 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -70,4 +71,5 @@ COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 COMMAND_TYPE_APPEND_STREAM_RECORDS: CommandType.ValueType # 19 COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 +COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL: CommandType.ValueType # 21 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index a41b486ee..4b615e909 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\xfa\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\xb3\x17\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\n\x12\x37\n3EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED\x10?B\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -84,11 +84,12 @@ EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED = 62 +EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED = 63 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 3004 + _EVENTTYPE._serialized_end = 3061 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 84db38b61..97a4c1166 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -226,6 +226,10 @@ class _EventTypeEnumTypeWrapper( batch, and carrying only the offset range it landed at: the bodies go to the stream's own log, never into History. """ + EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED: _EventType.ValueType # 63 + """A Workflow became a listener of a notification channel for its run. + The notifications themselves ride the WorkflowTaskScheduled event. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -428,4 +432,8 @@ EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: EventType.ValueType # 62 batch, and carrying only the offset range it landed at: the bodies go to the stream's own log, never into History. """ +EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED: EventType.ValueType # 63 +"""A Workflow became a listener of a notification channel for its run. +The notifications themselves ride the WorkflowTaskScheduled event. +""" global___EventType = EventType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 70229ee81..9c1970298 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xce\x15\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x9c\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _WORKFLOWTASKFAILEDCAUSE = DESCRIPTOR.enum_types_by_name["WorkflowTaskFailedCause"] @@ -89,6 +89,7 @@ WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES = 41 WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES = 42 WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE = 43 +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES = 44 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS = 1 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND = 2 @@ -120,15 +121,15 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020FailedCauseProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _WORKFLOWTASKFAILEDCAUSE._serialized_start = 68 - _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2834 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2837 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3157 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3160 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3433 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3436 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3790 - _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3793 - _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4328 - _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4331 - _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4474 + _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2912 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2915 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3235 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3238 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3511 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3514 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3868 + _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3871 + _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4406 + _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4409 + _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4552 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.pyi b/temporalio/api/enums/v1/failed_cause_pb2.pyi index 50124d1a9..b32872382 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.pyi +++ b/temporalio/api/enums/v1/failed_cause_pb2.pyi @@ -203,6 +203,12 @@ class _WorkflowTaskFailedCauseEnumTypeWrapper( History can no longer be served, for example after truncation or because it exceeds the replay bound. Check the workflow task failure message for more information. """ + WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 44 + """A SubscribeNotificationChannel command named an empty or too-long channel, or hit a + subscription or listener limit. + """ class WorkflowTaskFailedCause( _WorkflowTaskFailedCause, metaclass=_WorkflowTaskFailedCauseEnumTypeWrapper @@ -376,6 +382,12 @@ WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( History can no longer be served, for example after truncation or because it exceeds the replay bound. Check the workflow task failure message for more information. """ +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 44 +"""A SubscribeNotificationChannel command named an empty or too-long channel, or hit a +subscription or listener limit. +""" global___WorkflowTaskFailedCause = WorkflowTaskFailedCause class _StartChildWorkflowExecutionFailedCause: diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index 13d56f93a..7c765449d 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -55,6 +55,7 @@ WorkflowExecutionUpdateAdmittedEventAttributes, WorkflowExecutionUpdateCompletedEventAttributes, WorkflowExecutionUpdateRejectedEventAttributes, + WorkflowNotificationChannelSubscribedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, WorkflowStreamRecordsAppendedEventAttributes, @@ -123,6 +124,7 @@ "WorkflowExecutionUpdateAdmittedEventAttributes", "WorkflowExecutionUpdateCompletedEventAttributes", "WorkflowExecutionUpdateRejectedEventAttributes", + "WorkflowNotificationChannelSubscribedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", "WorkflowStreamRecordsAppendedEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index 7d6d747ab..891aa0012 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -38,6 +38,9 @@ from temporalio.api.failure.v1 import ( message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, ) +from temporalio.api.notification.v1 import ( + message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, +) from temporalio.api.sdk.v1 import ( event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, ) @@ -61,7 +64,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xdd\x42\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -221,6 +224,11 @@ _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowStreamSubscribedEventAttributes" ] +_WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES = ( + DESCRIPTOR.message_types_by_name[ + "WorkflowNotificationChannelSubscribedEventAttributes" + ] +) _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowStreamRecordsAppendedEventAttributes" ] @@ -839,6 +847,19 @@ ) _sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) +WorkflowNotificationChannelSubscribedEventAttributes = ( + _reflection.GeneratedProtocolMessageType( + "WorkflowNotificationChannelSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributes) + }, + ) +) +_sym_db.RegisterMessage(WorkflowNotificationChannelSubscribedEventAttributes) + WorkflowStreamRecordsAppendedEventAttributes = _reflection.GeneratedProtocolMessageType( "WorkflowStreamRecordsAppendedEventAttributes", (_message.Message,), @@ -1241,144 +1262,146 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 6005 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6008 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6157 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6160 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6551 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6554 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7260 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7263 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7549 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7552 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7784 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7787 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8073 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8076 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8274 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8276 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8390 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8393 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8667 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8670 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8817 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8819 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8890 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8893 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9027 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9030 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9229 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9232 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9367 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9370 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9731 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9651 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9731 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9734 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10053 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10056 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10185 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10188 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 745 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3139 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3142 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3278 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3281 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3446 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3449 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3668 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3671 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3799 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3802 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4735 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4738 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4977 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4980 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5396 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5399 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 6116 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6119 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6268 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6271 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6662 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6665 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7371 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7374 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7660 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7663 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7895 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7898 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8184 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8187 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8385 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8387 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8501 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8504 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8778 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8781 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8928 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8930 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 9001 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 9004 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9138 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9141 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9340 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9343 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9478 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9481 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9842 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9762 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9842 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9845 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10164 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10167 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10296 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10299 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10472 + 10583 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10475 + 10586 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10821 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10824 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11021 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11024 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11403 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11406 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11745 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11748 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11959 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11962 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12120 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12123 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12261 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12264 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13540 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13543 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13885 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13888 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14183 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14186 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14511 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14514 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14893 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14896 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15221 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15224 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15554 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15557 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15833 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15836 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16566 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16416 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16566 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16569 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16889 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16892 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17036 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17038 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17162 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17165 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17312 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17315 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17535 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17538 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17708 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17711 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17982 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17985 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18149 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18151 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18245 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18247 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18343 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18346 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18543 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18546 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19110 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19060 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19110 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19113 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19250 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19253 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19390 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19393 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19529 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19532 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19670 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19673 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19811 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19813 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19929 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19932 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20083 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20086 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20285 - _HISTORYEVENT._serialized_start = 20288 - _HISTORYEVENT._serialized_end = 28680 - _HISTORY._serialized_start = 28682 - _HISTORY._serialized_end = 28746 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10932 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10935 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11132 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11135 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11514 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11517 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11856 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11859 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12070 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12073 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12231 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12234 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12372 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12375 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13651 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13654 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13996 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13999 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14294 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14297 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14622 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14625 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 15004 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 15007 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15332 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15335 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15665 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15668 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15944 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15947 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16677 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16527 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16677 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16680 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17000 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 17003 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17147 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17149 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17273 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17275 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17388 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17391 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17538 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17541 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17761 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17764 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17934 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17937 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18208 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18211 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18375 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18377 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18471 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18473 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18569 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18572 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18769 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18772 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19336 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19286 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19336 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19339 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19476 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19479 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19616 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19619 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19755 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19758 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19896 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19899 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20037 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20039 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20155 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20158 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20309 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20312 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20511 + _HISTORYEVENT._serialized_start = 20514 + _HISTORYEVENT._serialized_end = 29055 + _HISTORY._serialized_start = 29057 + _HISTORY._serialized_end = 29121 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 6cfdea7ef..5d657927a 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -20,6 +20,7 @@ import temporalio.api.enums.v1.failed_cause_pb2 import temporalio.api.enums.v1.update_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.notification.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 @@ -853,6 +854,7 @@ class WorkflowTaskScheduledEventAttributes(google.protobuf.message.Message): TASK_QUEUE_FIELD_NUMBER: builtins.int START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: builtins.int ATTEMPT_FIELD_NUMBER: builtins.int + NOTIFICATIONS_FIELD_NUMBER: builtins.int @property def task_queue(self) -> temporalio.api.taskqueue.v1.message_pb2.TaskQueue: """The task queue this workflow task was enqueued in, which could be a normal or sticky queue""" @@ -865,12 +867,26 @@ class WorkflowTaskScheduledEventAttributes(google.protobuf.message.Message): """ attempt: builtins.int """Starting at 1, how many attempts there have been to complete this task""" + @property + def notifications( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.Notification + ]: + """Notifications for channels this Workflow listens to, folded per channel + since the last task was scheduled. In History so a Workflow may act on + them deterministically and replay sees the same. + """ def __init__( self, *, task_queue: temporalio.api.taskqueue.v1.message_pb2.TaskQueue | None = ..., start_to_close_timeout: google.protobuf.duration_pb2.Duration | None = ..., attempt: builtins.int = ..., + notifications: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.Notification + ] + | None = ..., ) -> None: ... def HasField( self, @@ -886,6 +902,8 @@ class WorkflowTaskScheduledEventAttributes(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "attempt", b"attempt", + "notifications", + b"notifications", "start_to_close_timeout", b"start_to_close_timeout", "task_queue", @@ -3666,6 +3684,39 @@ global___WorkflowStreamSubscribedEventAttributes = ( WorkflowStreamSubscribedEventAttributes ) +class WorkflowNotificationChannelSubscribedEventAttributes( + google.protobuf.message.Message +): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command created this + subscription. + """ + channel: builtins.str + """The channel the Workflow listens on for the rest of this run.""" + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", + b"channel", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowNotificationChannelSubscribedEventAttributes = ( + WorkflowNotificationChannelSubscribedEventAttributes +) + class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4578,6 +4629,7 @@ class HistoryEvent(google.protobuf.message.Message): ) WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int WORKFLOW_STREAM_RECORDS_APPENDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4871,6 +4923,10 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_stream_records_appended_event_attributes( self, ) -> global___WorkflowStreamRecordsAppendedEventAttributes: ... + @property + def workflow_notification_channel_subscribed_event_attributes( + self, + ) -> global___WorkflowNotificationChannelSubscribedEventAttributes: ... def __init__( self, *, @@ -5012,6 +5068,8 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_stream_records_appended_event_attributes: global___WorkflowStreamRecordsAppendedEventAttributes | None = ..., + workflow_notification_channel_subscribed_event_attributes: global___WorkflowNotificationChannelSubscribedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5130,6 +5188,8 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_execution_update_completed_event_attributes", "workflow_execution_update_rejected_event_attributes", b"workflow_execution_update_rejected_event_attributes", + "workflow_notification_channel_subscribed_event_attributes", + b"workflow_notification_channel_subscribed_event_attributes", "workflow_properties_modified_event_attributes", b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", @@ -5281,6 +5341,8 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_execution_update_completed_event_attributes", "workflow_execution_update_rejected_event_attributes", b"workflow_execution_update_rejected_event_attributes", + "workflow_notification_channel_subscribed_event_attributes", + b"workflow_notification_channel_subscribed_event_attributes", "workflow_properties_modified_event_attributes", b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", @@ -5367,6 +5429,7 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_time_skipping_transitioned_event_attributes", "workflow_stream_subscribed_event_attributes", "workflow_stream_records_appended_event_attributes", + "workflow_notification_channel_subscribed_event_attributes", ] | None ): ... diff --git a/temporalio/api/notification/__init__.py b/temporalio/api/notification/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/notification/v1/__init__.py b/temporalio/api/notification/v1/__init__.py new file mode 100644 index 000000000..bc7da47f6 --- /dev/null +++ b/temporalio/api/notification/v1/__init__.py @@ -0,0 +1,7 @@ +from .message_pb2 import ChannelListener, Notification, WorkflowListener + +__all__ = [ + "ChannelListener", + "Notification", + "WorkflowListener", +] diff --git a/temporalio/api/notification/v1/message_pb2.py b/temporalio/api/notification/v1/message_pb2.py new file mode 100644 index 000000000..d18373de8 --- /dev/null +++ b/temporalio/api/notification/v1/message_pb2.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/notification/v1/message.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xe0\x01\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\tB\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' +) + + +_NOTIFICATION = DESCRIPTOR.message_types_by_name["Notification"] +_NOTIFICATION_METADATAENTRY = _NOTIFICATION.nested_types_by_name["MetadataEntry"] +_CHANNELLISTENER = DESCRIPTOR.message_types_by_name["ChannelListener"] +_WORKFLOWLISTENER = DESCRIPTOR.message_types_by_name["WorkflowListener"] +Notification = _reflection.GeneratedProtocolMessageType( + "Notification", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFICATION_METADATAENTRY, + "__module__": "temporalio.api.notification.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notification.v1.Notification.MetadataEntry) + }, + ), + "DESCRIPTOR": _NOTIFICATION, + "__module__": "temporalio.api.notification.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notification.v1.Notification) + }, +) +_sym_db.RegisterMessage(Notification) +_sym_db.RegisterMessage(Notification.MetadataEntry) + +ChannelListener = _reflection.GeneratedProtocolMessageType( + "ChannelListener", + (_message.Message,), + { + "DESCRIPTOR": _CHANNELLISTENER, + "__module__": "temporalio.api.notification.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notification.v1.ChannelListener) + }, +) +_sym_db.RegisterMessage(ChannelListener) + +WorkflowListener = _reflection.GeneratedProtocolMessageType( + "WorkflowListener", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWLISTENER, + "__module__": "temporalio.api.notification.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notification.v1.WorkflowListener) + }, +) +_sym_db.RegisterMessage(WorkflowListener) + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\037io.temporal.api.notification.v1B\014MessageProtoP\001Z/go.temporal.io/api/notification/v1;notification\252\002\036Temporalio.Api.Notification.V1\352\002!Temporalio::Api::Notification::V1" + _NOTIFICATION_METADATAENTRY._options = None + _NOTIFICATION_METADATAENTRY._serialized_options = b"8\001" + _NOTIFICATION._serialized_start = 148 + _NOTIFICATION._serialized_end = 372 + _NOTIFICATION_METADATAENTRY._serialized_start = 292 + _NOTIFICATION_METADATAENTRY._serialized_end = 372 + _CHANNELLISTENER._serialized_start = 375 + _CHANNELLISTENER._serialized_end = 600 + _WORKFLOWLISTENER._serialized_start = 602 + _WORKFLOWLISTENER._serialized_end = 657 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/notification/v1/message_pb2.pyi b/temporalio/api/notification/v1/message_pb2.pyi new file mode 100644 index 000000000..55dd27655 --- /dev/null +++ b/temporalio/api/notification/v1/message_pb2.pyi @@ -0,0 +1,194 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message +import google.protobuf.timestamp_pb2 + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class Notification(google.protobuf.message.Message): + """A notification tells the listeners of a channel that a source they consume + has moved. It is not data: the listener reads the source itself. A channel + is named by the writer and its listeners; for a stream, the provider formats + the stream's identity into the name. Writers never learn who listens. The + server folds notifications per listener while one is pending and no task has + been scheduled for it, keeping the one with the highest counter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + CHANNEL_FIELD_NUMBER: builtins.int + POSITION_FIELD_NUMBER: builtins.int + COUNTER_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + channel: builtins.str + """The channel the writer notified. Listeners register on the same name.""" + position: builtins.bytes + """Where the source stands after the write that caused this notification, + in the writer's terms. Opaque to the server. + """ + counter: builtins.int + """Orders notifications from one channel's writers. The writer derives it + from the position, since only the source can order its positions. Among + notifications folded together, the one with the highest counter is kept. + """ + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: + """Details for the listener, such as which topic moved. Bounded in size and + carried as payloads, so a codec applies as to any payload. + """ + def __init__( + self, + *, + channel: builtins.str = ..., + position: builtins.bytes = ..., + counter: builtins.int = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", + b"channel", + "counter", + b"counter", + "metadata", + b"metadata", + "position", + b"position", + ], + ) -> None: ... + +global___Notification = Notification + +class ChannelListener(google.protobuf.message.Message): + """A listener of a channel: a Workflow Execution woken with a Workflow Task, or + a callback the server invokes with each notification. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LISTENER_ID_FIELD_NUMBER: builtins.int + WORKFLOW_FIELD_NUMBER: builtins.int + CALLBACK_FIELD_NUMBER: builtins.int + REGISTERED_TIME_FIELD_NUMBER: builtins.int + listener_id: builtins.str + """Assigned by the server when the listener registers.""" + @property + def workflow(self) -> global___WorkflowListener: ... + @property + def callback(self) -> temporalio.api.common.v1.message_pb2.Callback: ... + @property + def registered_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ... + def __init__( + self, + *, + listener_id: builtins.str = ..., + workflow: global___WorkflowListener | None = ..., + callback: temporalio.api.common.v1.message_pb2.Callback | None = ..., + registered_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "callback", + b"callback", + "listener", + b"listener", + "registered_time", + b"registered_time", + "workflow", + b"workflow", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "callback", + b"callback", + "listener", + b"listener", + "listener_id", + b"listener_id", + "registered_time", + b"registered_time", + "workflow", + b"workflow", + ], + ) -> None: ... + def WhichOneof( + self, oneof_group: typing_extensions.Literal["listener", b"listener"] + ) -> typing_extensions.Literal["workflow", "callback"] | None: ... + +global___ChannelListener = ChannelListener + +class WorkflowListener(google.protobuf.message.Message): + """A Workflow Execution listening on a channel.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + """The run that subscribed. The server follows a continue-as-new to the + chain's current run when it delivers. + """ + def __init__( + self, + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "workflow_id", b"workflow_id" + ], + ) -> None: ... + +global___WorkflowListener = WorkflowListener diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index 1d0703adc..78586c70d 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -2438,6 +2438,10 @@ class Wake(google.protobuf.message.Message): pending and no task has received it yet, so a burst of writes costs one task. Once a task has been handed the wake, a new wake for the source is accepted again, because only the receiver knows what it read. + + Superseded by the notification channel (`NotifyChannel` and the + `SubscribeNotificationChannel` command). Kept for one round and slated for + removal. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/__init__.py b/temporalio/api/workflowservice/v1/__init__.py index 2a3caaf47..5f95a044c 100644 --- a/temporalio/api/workflowservice/v1/__init__.py +++ b/temporalio/api/workflowservice/v1/__init__.py @@ -37,6 +37,8 @@ DescribeActivityExecutionResponse, DescribeBatchOperationRequest, DescribeBatchOperationResponse, + DescribeChannelRequest, + DescribeChannelResponse, DescribeDeploymentRequest, DescribeDeploymentResponse, DescribeNamespaceRequest, @@ -111,6 +113,8 @@ ListWorkflowExecutionsResponse, ListWorkflowRulesRequest, ListWorkflowRulesResponse, + NotifyChannelRequest, + NotifyChannelResponse, PatchScheduleRequest, PatchScheduleResponse, PauseActivityExecutionRequest, @@ -123,6 +127,8 @@ PollActivityExecutionResponse, PollActivityTaskQueueRequest, PollActivityTaskQueueResponse, + PollChannelRequest, + PollChannelResponse, PollNexusOperationExecutionRequest, PollNexusOperationExecutionResponse, PollNexusTaskQueueRequest, @@ -141,6 +147,8 @@ RecordActivityTaskHeartbeatResponse, RecordWorkerHeartbeatRequest, RecordWorkerHeartbeatResponse, + RegisterChannelListenerRequest, + RegisterChannelListenerResponse, RegisterNamespaceRequest, RegisterNamespaceResponse, RequestCancelActivityExecutionRequest, @@ -219,6 +227,8 @@ UnpauseActivityResponse, UnpauseWorkflowExecutionRequest, UnpauseWorkflowExecutionResponse, + UnregisterChannelListenerRequest, + UnregisterChannelListenerResponse, UpdateActivityExecutionOptionsRequest, UpdateActivityExecutionOptionsResponse, UpdateActivityOptionsRequest, @@ -288,6 +298,8 @@ "DescribeActivityExecutionResponse", "DescribeBatchOperationRequest", "DescribeBatchOperationResponse", + "DescribeChannelRequest", + "DescribeChannelResponse", "DescribeDeploymentRequest", "DescribeDeploymentResponse", "DescribeNamespaceRequest", @@ -362,6 +374,8 @@ "ListWorkflowExecutionsResponse", "ListWorkflowRulesRequest", "ListWorkflowRulesResponse", + "NotifyChannelRequest", + "NotifyChannelResponse", "PatchScheduleRequest", "PatchScheduleResponse", "PauseActivityExecutionRequest", @@ -374,6 +388,8 @@ "PollActivityExecutionResponse", "PollActivityTaskQueueRequest", "PollActivityTaskQueueResponse", + "PollChannelRequest", + "PollChannelResponse", "PollNexusOperationExecutionRequest", "PollNexusOperationExecutionResponse", "PollNexusTaskQueueRequest", @@ -392,6 +408,8 @@ "RecordActivityTaskHeartbeatResponse", "RecordWorkerHeartbeatRequest", "RecordWorkerHeartbeatResponse", + "RegisterChannelListenerRequest", + "RegisterChannelListenerResponse", "RegisterNamespaceRequest", "RegisterNamespaceResponse", "RequestCancelActivityExecutionRequest", @@ -470,6 +488,8 @@ "UnpauseActivityResponse", "UnpauseWorkflowExecutionRequest", "UnpauseWorkflowExecutionResponse", + "UnregisterChannelListenerRequest", + "UnregisterChannelListenerResponse", "UpdateActivityExecutionOptionsRequest", "UpdateActivityExecutionOptionsResponse", "UpdateActivityOptionsRequest", diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index fa34931d7..a2a505cfe 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.notification.v1 import ( + message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, +) from temporalio.api.protocol.v1 import ( message_pb2 as temporal_dot_api_dot_protocol_dot_v1_dot_message__pb2, ) @@ -134,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\x91\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\x9e\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"m\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"#\n!UnregisterChannelListenerResponse"\x93\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"<\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\xaf\x01\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -276,6 +279,24 @@ _WAKEWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ "WakeWorkflowExecutionResponse" ] +_NOTIFYCHANNELREQUEST = DESCRIPTOR.message_types_by_name["NotifyChannelRequest"] +_NOTIFYCHANNELRESPONSE = DESCRIPTOR.message_types_by_name["NotifyChannelResponse"] +_REGISTERCHANNELLISTENERREQUEST = DESCRIPTOR.message_types_by_name[ + "RegisterChannelListenerRequest" +] +_REGISTERCHANNELLISTENERRESPONSE = DESCRIPTOR.message_types_by_name[ + "RegisterChannelListenerResponse" +] +_UNREGISTERCHANNELLISTENERREQUEST = DESCRIPTOR.message_types_by_name[ + "UnregisterChannelListenerRequest" +] +_UNREGISTERCHANNELLISTENERRESPONSE = DESCRIPTOR.message_types_by_name[ + "UnregisterChannelListenerResponse" +] +_POLLCHANNELREQUEST = DESCRIPTOR.message_types_by_name["PollChannelRequest"] +_POLLCHANNELRESPONSE = DESCRIPTOR.message_types_by_name["PollChannelResponse"] +_DESCRIBECHANNELREQUEST = DESCRIPTOR.message_types_by_name["DescribeChannelRequest"] +_DESCRIBECHANNELRESPONSE = DESCRIPTOR.message_types_by_name["DescribeChannelResponse"] _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ "SignalWithStartWorkflowExecutionRequest" ] @@ -1466,6 +1487,116 @@ ) _sym_db.RegisterMessage(WakeWorkflowExecutionResponse) +NotifyChannelRequest = _reflection.GeneratedProtocolMessageType( + "NotifyChannelRequest", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYCHANNELREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.NotifyChannelRequest) + }, +) +_sym_db.RegisterMessage(NotifyChannelRequest) + +NotifyChannelResponse = _reflection.GeneratedProtocolMessageType( + "NotifyChannelResponse", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYCHANNELRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.NotifyChannelResponse) + }, +) +_sym_db.RegisterMessage(NotifyChannelResponse) + +RegisterChannelListenerRequest = _reflection.GeneratedProtocolMessageType( + "RegisterChannelListenerRequest", + (_message.Message,), + { + "DESCRIPTOR": _REGISTERCHANNELLISTENERREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.RegisterChannelListenerRequest) + }, +) +_sym_db.RegisterMessage(RegisterChannelListenerRequest) + +RegisterChannelListenerResponse = _reflection.GeneratedProtocolMessageType( + "RegisterChannelListenerResponse", + (_message.Message,), + { + "DESCRIPTOR": _REGISTERCHANNELLISTENERRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.RegisterChannelListenerResponse) + }, +) +_sym_db.RegisterMessage(RegisterChannelListenerResponse) + +UnregisterChannelListenerRequest = _reflection.GeneratedProtocolMessageType( + "UnregisterChannelListenerRequest", + (_message.Message,), + { + "DESCRIPTOR": _UNREGISTERCHANNELLISTENERREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.UnregisterChannelListenerRequest) + }, +) +_sym_db.RegisterMessage(UnregisterChannelListenerRequest) + +UnregisterChannelListenerResponse = _reflection.GeneratedProtocolMessageType( + "UnregisterChannelListenerResponse", + (_message.Message,), + { + "DESCRIPTOR": _UNREGISTERCHANNELLISTENERRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.UnregisterChannelListenerResponse) + }, +) +_sym_db.RegisterMessage(UnregisterChannelListenerResponse) + +PollChannelRequest = _reflection.GeneratedProtocolMessageType( + "PollChannelRequest", + (_message.Message,), + { + "DESCRIPTOR": _POLLCHANNELREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.PollChannelRequest) + }, +) +_sym_db.RegisterMessage(PollChannelRequest) + +PollChannelResponse = _reflection.GeneratedProtocolMessageType( + "PollChannelResponse", + (_message.Message,), + { + "DESCRIPTOR": _POLLCHANNELRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.PollChannelResponse) + }, +) +_sym_db.RegisterMessage(PollChannelResponse) + +DescribeChannelRequest = _reflection.GeneratedProtocolMessageType( + "DescribeChannelRequest", + (_message.Message,), + { + "DESCRIPTOR": _DESCRIBECHANNELREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.DescribeChannelRequest) + }, +) +_sym_db.RegisterMessage(DescribeChannelRequest) + +DescribeChannelResponse = _reflection.GeneratedProtocolMessageType( + "DescribeChannelResponse", + (_message.Message,), + { + "DESCRIPTOR": _DESCRIBECHANNELRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.DescribeChannelResponse) + }, +) +_sym_db.RegisterMessage(DescribeChannelResponse) + SignalWithStartWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( "SignalWithStartWorkflowExecutionRequest", (_message.Message,), @@ -4245,582 +4376,602 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1684 - _REGISTERNAMESPACEREQUEST._serialized_end = 2332 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 - _REGISTERNAMESPACERESPONSE._serialized_start = 2334 - _REGISTERNAMESPACERESPONSE._serialized_end = 2361 - _LISTNAMESPACESREQUEST._serialized_start = 2364 - _LISTNAMESPACESREQUEST._serialized_end = 2501 - _LISTNAMESPACESRESPONSE._serialized_start = 2504 - _LISTNAMESPACESRESPONSE._serialized_end = 2633 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 - _UPDATENAMESPACEREQUEST._serialized_start = 3237 - _UPDATENAMESPACEREQUEST._serialized_end = 3572 - _UPDATENAMESPACERESPONSE._serialized_start = 3575 - _UPDATENAMESPACERESPONSE._serialized_end = 3866 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8320 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8236 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8320 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8323 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9661 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9495 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9590 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9592 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9661 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9909 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9912 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10437 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10439 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10474 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10477 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10963 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10966 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12147 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12150 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12315 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12317 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12429 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12432 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12639 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12641 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12757 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12760 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13142 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13144 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13182 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13185 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13392 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13394 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13436 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13439 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13885 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13887 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13974 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13977 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14248 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14250 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14341 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14344 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14726 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14728 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14765 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14768 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15056 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15058 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15099 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15102 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15362 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15364 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15404 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15407 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15757 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15759 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15836 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15839 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16023 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16025 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16088 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 16091 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17430 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17433 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17591 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17594 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 18043 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 18045 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 18093 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 18096 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18383 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18385 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18421 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18423 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18545 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18547 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18580 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18583 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18912 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18915 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19442 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19445 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19577 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19579 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19688 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19690 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19816 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19818 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19935 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19938 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20072 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 20074 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 20183 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20185 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20311 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20313 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20379 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20382 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20619 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20621 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20649 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20652 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20853 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20769 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20853 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20856 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 21217 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 21219 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 21254 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 21256 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21366 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21368 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21398 - _SHUTDOWNWORKERREQUEST._serialized_start = 21401 - _SHUTDOWNWORKERREQUEST._serialized_end = 21684 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21686 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21710 - _QUERYWORKFLOWREQUEST._serialized_start = 21713 - _QUERYWORKFLOWREQUEST._serialized_end = 21946 - _QUERYWORKFLOWRESPONSE._serialized_start = 21949 - _QUERYWORKFLOWRESPONSE._serialized_end = 22134 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 22136 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 22251 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 22254 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22919 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22922 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23450 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23453 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24457 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 24137 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 24237 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 24239 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24355 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24357 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24457 - _GETCLUSTERINFOREQUEST._serialized_start = 24459 - _GETCLUSTERINFOREQUEST._serialized_end = 24482 - _GETCLUSTERINFORESPONSE._serialized_start = 24485 - _GETCLUSTERINFORESPONSE._serialized_end = 24950 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24895 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24950 - _GETSYSTEMINFOREQUEST._serialized_start = 24952 - _GETSYSTEMINFOREQUEST._serialized_end = 24974 - _GETSYSTEMINFORESPONSE._serialized_start = 24977 - _GETSYSTEMINFORESPONSE._serialized_end = 25554 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 25118 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25554 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25556 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25665 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25668 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25891 - _CREATESCHEDULEREQUEST._serialized_start = 25894 - _CREATESCHEDULEREQUEST._serialized_end = 26226 - _CREATESCHEDULERESPONSE._serialized_start = 26228 - _CREATESCHEDULERESPONSE._serialized_end = 26276 - _DESCRIBESCHEDULEREQUEST._serialized_start = 26278 - _DESCRIBESCHEDULEREQUEST._serialized_end = 26343 - _DESCRIBESCHEDULERESPONSE._serialized_start = 26346 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26617 - _UPDATESCHEDULEREQUEST._serialized_start = 26620 - _UPDATESCHEDULEREQUEST._serialized_end = 26912 - _UPDATESCHEDULERESPONSE._serialized_start = 26914 - _UPDATESCHEDULERESPONSE._serialized_end = 26938 - _PATCHSCHEDULEREQUEST._serialized_start = 26941 - _PATCHSCHEDULEREQUEST._serialized_end = 27097 - _PATCHSCHEDULERESPONSE._serialized_start = 27099 - _PATCHSCHEDULERESPONSE._serialized_end = 27122 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 27125 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 27293 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 27295 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27378 - _DELETESCHEDULEREQUEST._serialized_start = 27380 - _DELETESCHEDULEREQUEST._serialized_end = 27461 - _DELETESCHEDULERESPONSE._serialized_start = 27463 - _DELETESCHEDULERESPONSE._serialized_end = 27487 - _LISTSCHEDULESREQUEST._serialized_start = 27489 - _LISTSCHEDULESREQUEST._serialized_end = 27597 - _LISTSCHEDULESRESPONSE._serialized_start = 27599 - _LISTSCHEDULESRESPONSE._serialized_end = 27711 - _COUNTSCHEDULESREQUEST._serialized_start = 27713 - _COUNTSCHEDULESREQUEST._serialized_end = 27770 - _COUNTSCHEDULESRESPONSE._serialized_start = 27773 - _COUNTSCHEDULESRESPONSE._serialized_end = 27992 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27995 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28641 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28442 + _REGISTERNAMESPACEREQUEST._serialized_start = 1728 + _REGISTERNAMESPACEREQUEST._serialized_end = 2376 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2333 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2376 + _REGISTERNAMESPACERESPONSE._serialized_start = 2378 + _REGISTERNAMESPACERESPONSE._serialized_end = 2405 + _LISTNAMESPACESREQUEST._serialized_start = 2408 + _LISTNAMESPACESREQUEST._serialized_end = 2545 + _LISTNAMESPACESRESPONSE._serialized_start = 2548 + _LISTNAMESPACESRESPONSE._serialized_end = 2677 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2679 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2762 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2765 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3278 + _UPDATENAMESPACEREQUEST._serialized_start = 3281 + _UPDATENAMESPACEREQUEST._serialized_end = 3616 + _UPDATENAMESPACERESPONSE._serialized_start = 3619 + _UPDATENAMESPACERESPONSE._serialized_end = 3910 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3912 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3982 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3984 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4012 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4015 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5632 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5635 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5933 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5936 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6234 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6237 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6423 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6426 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6602 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6604 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6724 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8364 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8280 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8364 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8367 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9705 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9539 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9634 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9636 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9705 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9708 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9953 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9956 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10481 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10483 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10518 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10521 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11007 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11010 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12191 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12194 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12359 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12361 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12473 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12476 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12683 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12685 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12801 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12804 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13186 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13188 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13226 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13229 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13436 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13438 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13480 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13483 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13929 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13931 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14018 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14021 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14292 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14294 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14385 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14388 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14770 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14772 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14809 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14812 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15100 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15102 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15143 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15146 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15406 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15408 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15448 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15451 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15801 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15803 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15880 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15883 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16067 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16069 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16132 + _NOTIFYCHANNELREQUEST._serialized_start = 16135 + _NOTIFYCHANNELREQUEST._serialized_end = 16280 + _NOTIFYCHANNELRESPONSE._serialized_start = 16282 + _NOTIFYCHANNELRESPONSE._serialized_end = 16329 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16332 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16490 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16492 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16546 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16548 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16657 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16659 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16694 + _POLLCHANNELREQUEST._serialized_start = 16697 + _POLLCHANNELREQUEST._serialized_end = 16844 + _POLLCHANNELRESPONSE._serialized_start = 16846 + _POLLCHANNELRESPONSE._serialized_end = 16934 + _DESCRIBECHANNELREQUEST._serialized_start = 16936 + _DESCRIBECHANNELREQUEST._serialized_end = 16996 + _DESCRIBECHANNELRESPONSE._serialized_start = 16999 + _DESCRIBECHANNELRESPONSE._serialized_end = 17174 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17177 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18516 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18519 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18677 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18680 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19129 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19131 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19179 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19182 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19469 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19471 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19507 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19509 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19631 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19633 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19666 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19669 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 19998 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20001 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20131 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20134 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20528 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20531 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20663 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20665 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20774 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20776 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20902 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20904 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21021 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21024 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21158 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21160 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21269 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21271 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21397 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21399 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21465 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21468 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21705 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21707 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21735 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21738 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 21939 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 21855 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 21939 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 21942 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22303 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22305 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22340 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22342 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22452 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22454 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22484 + _SHUTDOWNWORKERREQUEST._serialized_start = 22487 + _SHUTDOWNWORKERREQUEST._serialized_end = 22770 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22772 + _SHUTDOWNWORKERRESPONSE._serialized_end = 22796 + _QUERYWORKFLOWREQUEST._serialized_start = 22799 + _QUERYWORKFLOWREQUEST._serialized_end = 23032 + _QUERYWORKFLOWRESPONSE._serialized_start = 23035 + _QUERYWORKFLOWRESPONSE._serialized_end = 23220 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23222 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23337 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23340 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24005 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24008 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24536 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24539 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25543 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25325 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25441 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25443 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25543 + _GETCLUSTERINFOREQUEST._serialized_start = 25545 + _GETCLUSTERINFOREQUEST._serialized_end = 25568 + _GETCLUSTERINFORESPONSE._serialized_start = 25571 + _GETCLUSTERINFORESPONSE._serialized_end = 26036 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 25981 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26036 + _GETSYSTEMINFOREQUEST._serialized_start = 26038 + _GETSYSTEMINFOREQUEST._serialized_end = 26060 + _GETSYSTEMINFORESPONSE._serialized_start = 26063 + _GETSYSTEMINFORESPONSE._serialized_end = 26640 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26204 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26640 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26642 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26751 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26754 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 26977 + _CREATESCHEDULEREQUEST._serialized_start = 26980 + _CREATESCHEDULEREQUEST._serialized_end = 27312 + _CREATESCHEDULERESPONSE._serialized_start = 27314 + _CREATESCHEDULERESPONSE._serialized_end = 27362 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27364 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27429 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27432 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27703 + _UPDATESCHEDULEREQUEST._serialized_start = 27706 + _UPDATESCHEDULEREQUEST._serialized_end = 27998 + _UPDATESCHEDULERESPONSE._serialized_start = 28000 + _UPDATESCHEDULERESPONSE._serialized_end = 28024 + _PATCHSCHEDULEREQUEST._serialized_start = 28027 + _PATCHSCHEDULEREQUEST._serialized_end = 28183 + _PATCHSCHEDULERESPONSE._serialized_start = 28185 + _PATCHSCHEDULERESPONSE._serialized_end = 28208 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28211 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28379 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28381 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28464 + _DELETESCHEDULEREQUEST._serialized_start = 28466 + _DELETESCHEDULEREQUEST._serialized_end = 28547 + _DELETESCHEDULERESPONSE._serialized_start = 28549 + _DELETESCHEDULERESPONSE._serialized_end = 28573 + _LISTSCHEDULESREQUEST._serialized_start = 28575 + _LISTSCHEDULESREQUEST._serialized_end = 28683 + _LISTSCHEDULESRESPONSE._serialized_start = 28685 + _LISTSCHEDULESRESPONSE._serialized_end = 28797 + _COUNTSCHEDULESREQUEST._serialized_start = 28799 + _COUNTSCHEDULESREQUEST._serialized_end = 28856 + _COUNTSCHEDULESRESPONSE._serialized_start = 28859 + _COUNTSCHEDULESRESPONSE._serialized_end = 29078 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29081 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29727 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29528 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28553 + 29639 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28555 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28628 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28643 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28707 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28709 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28804 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28806 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28922 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28925 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30642 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29977 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29641 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29714 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29729 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29793 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29795 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29890 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29892 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30008 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30011 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31728 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31063 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 30090 + 31176 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 30093 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31179 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 30222 + 31308 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 30224 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31310 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 30288 + 31374 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30290 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30396 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30398 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30508 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30510 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30572 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30574 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30629 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30645 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30897 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30899 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30971 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30974 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 31223 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 31226 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31382 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31384 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31498 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31501 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31762 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31765 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 32024 - _STARTBATCHOPERATIONREQUEST._serialized_start = 32027 - _STARTBATCHOPERATIONREQUEST._serialized_end = 33393 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 33395 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33424 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33426 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33522 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33524 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33552 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33554 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33620 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33623 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 34095 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 34097 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 34188 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 34190 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34311 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34314 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34499 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34502 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34721 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34724 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 35140 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 35143 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35497 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35500 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35667 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35669 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35704 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35707 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35927 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35929 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35961 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35964 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36336 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 36130 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36336 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36339 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36671 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36465 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36671 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36674 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 37010 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 37013 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37332 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37334 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37434 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37436 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37545 - _PAUSEACTIVITYREQUEST._serialized_start = 37548 - _PAUSEACTIVITYREQUEST._serialized_end = 37747 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37750 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37933 - _PAUSEACTIVITYRESPONSE._serialized_start = 37935 - _PAUSEACTIVITYRESPONSE._serialized_end = 37958 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37960 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37992 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37995 - _UNPAUSEACTIVITYREQUEST._serialized_end = 38275 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38278 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38551 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38553 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38578 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38580 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38614 - _RESETACTIVITYREQUEST._serialized_start = 38617 - _RESETACTIVITYREQUEST._serialized_end = 38924 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38927 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 39217 - _RESETACTIVITYRESPONSE._serialized_start = 39219 - _RESETACTIVITYRESPONSE._serialized_end = 39242 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 39244 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 39276 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 39279 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39563 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39566 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39743 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39745 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39851 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39853 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39950 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39953 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 40147 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 40150 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40802 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40411 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40802 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 24137 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 24237 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40804 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40881 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40884 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 41024 - _LISTDEPLOYMENTSREQUEST._serialized_start = 41026 - _LISTDEPLOYMENTSREQUEST._serialized_end = 41134 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 41136 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 41255 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 41258 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41463 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41466 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41651 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41654 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41883 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41886 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 42077 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 42080 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42329 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42332 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42556 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42558 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42671 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42673 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42729 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42731 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42824 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42827 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43498 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 43002 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43498 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43501 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43741 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43743 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43782 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43785 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43985 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43987 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44026 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 44028 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 44121 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 44123 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 44155 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44158 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44674 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44551 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44674 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44676 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44728 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44731 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45231 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44551 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44674 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45233 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45287 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 45290 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45708 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45623 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31376 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31482 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31484 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31594 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31596 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31658 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31660 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31715 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31731 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 31983 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 31985 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32057 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32060 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32309 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32312 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32468 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32470 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32584 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32587 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 32848 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 32851 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33110 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33113 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34479 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34481 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34510 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34512 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34608 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34610 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34638 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34640 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34706 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34709 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35181 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35183 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35274 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35276 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35397 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35400 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35585 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35588 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35807 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35810 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36226 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36229 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36583 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36586 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36753 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36755 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36790 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36793 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37013 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37015 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37047 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37050 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37422 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37216 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37422 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37425 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37757 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37551 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37757 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37760 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38096 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38099 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38418 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38420 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38520 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38522 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38631 + _PAUSEACTIVITYREQUEST._serialized_start = 38634 + _PAUSEACTIVITYREQUEST._serialized_end = 38833 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38836 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39019 + _PAUSEACTIVITYRESPONSE._serialized_start = 39021 + _PAUSEACTIVITYRESPONSE._serialized_end = 39044 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39046 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39078 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39081 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39361 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39364 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39637 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39639 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39664 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39666 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39700 + _RESETACTIVITYREQUEST._serialized_start = 39703 + _RESETACTIVITYREQUEST._serialized_end = 40010 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40013 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40303 + _RESETACTIVITYRESPONSE._serialized_start = 40305 + _RESETACTIVITYRESPONSE._serialized_end = 40328 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40330 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40362 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40365 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40649 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40652 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 40829 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 40831 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 40937 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 40939 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41036 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41039 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41233 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41236 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 41888 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41497 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 41888 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 41890 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 41967 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 41970 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42110 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42112 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42220 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42222 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42341 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42344 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42549 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42552 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42737 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42740 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 42969 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 42972 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43163 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43166 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43415 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43418 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43642 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43644 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43757 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43759 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43815 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43817 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 43910 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 43913 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44584 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44088 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44584 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44587 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44827 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 44829 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44868 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44871 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45071 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45073 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45112 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45114 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45207 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45209 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45241 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45244 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45760 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45762 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45814 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45817 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46317 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46319 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46373 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46376 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46794 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46709 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45708 + 46794 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45710 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45820 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45823 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 46012 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 46014 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 46113 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 46115 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 46184 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 46186 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 46293 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 46295 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46408 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46411 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46638 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46641 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46821 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46823 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46918 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46920 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46985 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46987 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 47068 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 47070 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 47133 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 47135 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 47163 - _LISTWORKFLOWRULESREQUEST._serialized_start = 47165 - _LISTWORKFLOWRULESREQUEST._serialized_end = 47235 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 47237 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 47341 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47344 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47550 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47552 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47598 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47601 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47756 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47758 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47789 - _LISTWORKERSREQUEST._serialized_start = 47792 - _LISTWORKERSREQUEST._serialized_end = 47922 - _LISTWORKERSRESPONSE._serialized_start = 47925 - _LISTWORKERSRESPONSE._serialized_end = 48090 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 48093 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48818 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48660 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48751 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46796 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 46906 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 46909 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47098 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47100 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47199 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47201 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47270 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47272 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47379 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47381 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47494 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47497 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47724 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47727 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 47907 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 47909 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48004 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48006 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48071 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48073 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48154 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48156 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48219 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48221 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48249 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48251 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48321 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48323 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48427 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48430 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48636 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48638 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48684 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48687 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 48842 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 48844 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 48875 + _LISTWORKERSREQUEST._serialized_start = 48878 + _LISTWORKERSREQUEST._serialized_end = 49008 + _LISTWORKERSRESPONSE._serialized_start = 49011 + _LISTWORKERSRESPONSE._serialized_end = 49176 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49179 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 49904 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49746 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 49837 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48753 + 49839 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48818 + 49904 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48820 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48911 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48914 - _FETCHWORKERCONFIGREQUEST._serialized_end = 49072 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 49074 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 49159 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 49162 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49428 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49430 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49530 - _DESCRIBEWORKERREQUEST._serialized_start = 49532 - _DESCRIBEWORKERREQUEST._serialized_end = 49603 - _DESCRIBEWORKERRESPONSE._serialized_start = 49605 - _DESCRIBEWORKERRESPONSE._serialized_end = 49686 - _COUNTWORKERSREQUEST._serialized_start = 49688 - _COUNTWORKERSREQUEST._serialized_end = 49775 - _COUNTWORKERSRESPONSE._serialized_start = 49777 - _COUNTWORKERSRESPONSE._serialized_end = 49814 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49817 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49958 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49960 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49992 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49995 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 50138 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 50140 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 50174 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 50177 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51354 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51356 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51465 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51468 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51696 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51699 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 52015 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 52017 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 52103 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 52105 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 52221 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 52223 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52332 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52335 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52465 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52468 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53317 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 53267 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53317 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53319 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53390 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53393 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53563 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53566 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53877 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53880 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54041 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54044 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54305 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54307 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54422 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54425 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54564 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54566 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54632 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54635 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54872 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54874 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54946 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54949 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55198 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 55201 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55350 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55352 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55392 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55395 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55540 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55542 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55578 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55580 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55668 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55670 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55703 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55706 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55862 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55864 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55910 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55913 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56065 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56067 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56109 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56111 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56206 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56208 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56247 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 56250 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56407 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56410 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56642 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 49906 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 49997 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50000 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50158 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50160 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50245 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50248 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50514 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50516 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50616 + _DESCRIBEWORKERREQUEST._serialized_start = 50618 + _DESCRIBEWORKERREQUEST._serialized_end = 50689 + _DESCRIBEWORKERRESPONSE._serialized_start = 50691 + _DESCRIBEWORKERRESPONSE._serialized_end = 50772 + _COUNTWORKERSREQUEST._serialized_start = 50774 + _COUNTWORKERSREQUEST._serialized_end = 50861 + _COUNTWORKERSRESPONSE._serialized_start = 50863 + _COUNTWORKERSRESPONSE._serialized_end = 50900 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 50903 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51044 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51046 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51078 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51081 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51224 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51226 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51260 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51263 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52440 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52442 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52551 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52554 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52782 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52785 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53101 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53103 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53189 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53191 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53307 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53309 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53418 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53421 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53551 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53554 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54403 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54353 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54403 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54405 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54476 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54479 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54649 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54652 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54963 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54966 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55127 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55130 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55391 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55393 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55508 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55511 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55650 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55652 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55718 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55721 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 55958 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55960 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56032 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56035 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56284 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56287 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56436 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56438 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56478 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56481 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56626 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56628 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56664 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56666 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56754 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56756 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56789 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56792 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56948 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56950 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56996 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56999 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57151 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57153 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57195 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57197 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57292 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57294 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57333 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57336 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57493 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57496 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57728 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index ef9e22312..381e1f4e0 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -38,6 +38,7 @@ import temporalio.api.filter.v1.message_pb2 import temporalio.api.history.v1.message_pb2 import temporalio.api.namespace.v1.message_pb2 import temporalio.api.nexus.v1.message_pb2 +import temporalio.api.notification.v1.message_pb2 import temporalio.api.protocol.v1.message_pb2 import temporalio.api.query.v1.message_pb2 import temporalio.api.replication.v1.message_pb2 @@ -3412,6 +3413,321 @@ class WakeWorkflowExecutionResponse(google.protobuf.message.Message): global___WakeWorkflowExecutionResponse = WakeWorkflowExecutionResponse +class NotifyChannelRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + NOTIFICATION_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + @property + def notification( + self, + ) -> temporalio.api.notification.v1.message_pb2.Notification: ... + identity: builtins.str + """The identity of the writer, for metrics and logs.""" + request_id: builtins.str + """Used to de-dupe a retried notification.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + notification: temporalio.api.notification.v1.message_pb2.Notification + | None = ..., + identity: builtins.str = ..., + request_id: builtins.str = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["notification", b"notification"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "identity", + b"identity", + "namespace", + b"namespace", + "notification", + b"notification", + "request_id", + b"request_id", + ], + ) -> None: ... + +global___NotifyChannelRequest = NotifyChannelRequest + +class NotifyChannelResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LISTENER_COUNT_FIELD_NUMBER: builtins.int + listener_count: builtins.int + """Listeners registered when the notification was accepted. Zero means the + notification was retained for pollers and woke nobody. + """ + def __init__( + self, + *, + listener_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["listener_count", b"listener_count"] + ) -> None: ... + +global___NotifyChannelResponse = NotifyChannelResponse + +class RegisterChannelListenerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + CALLBACK_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + namespace: builtins.str + channel: builtins.str + @property + def callback(self) -> temporalio.api.common.v1.message_pb2.Callback: + """Invoked with each notification on the channel.""" + request_id: builtins.str + """Used to de-dupe a retried registration.""" + identity: builtins.str + """The identity of the caller, for metrics and logs.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + channel: builtins.str = ..., + callback: temporalio.api.common.v1.message_pb2.Callback | None = ..., + request_id: builtins.str = ..., + identity: builtins.str = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["callback", b"callback"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "callback", + b"callback", + "channel", + b"channel", + "identity", + b"identity", + "namespace", + b"namespace", + "request_id", + b"request_id", + ], + ) -> None: ... + +global___RegisterChannelListenerRequest = RegisterChannelListenerRequest + +class RegisterChannelListenerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LISTENER_ID_FIELD_NUMBER: builtins.int + listener_id: builtins.str + def __init__( + self, + *, + listener_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["listener_id", b"listener_id"] + ) -> None: ... + +global___RegisterChannelListenerResponse = RegisterChannelListenerResponse + +class UnregisterChannelListenerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + LISTENER_ID_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + namespace: builtins.str + channel: builtins.str + listener_id: builtins.str + identity: builtins.str + """The identity of the caller, for metrics and logs.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + channel: builtins.str = ..., + listener_id: builtins.str = ..., + identity: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", + b"channel", + "identity", + b"identity", + "listener_id", + b"listener_id", + "namespace", + b"namespace", + ], + ) -> None: ... + +global___UnregisterChannelListenerRequest = UnregisterChannelListenerRequest + +class UnregisterChannelListenerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___UnregisterChannelListenerResponse = UnregisterChannelListenerResponse + +class PollChannelRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + AFTER_COUNTER_FIELD_NUMBER: builtins.int + WAIT_FIELD_NUMBER: builtins.int + MAX_NOTIFICATIONS_FIELD_NUMBER: builtins.int + namespace: builtins.str + channel: builtins.str + after_counter: builtins.int + """Only notifications with a counter above this one are returned. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "after" names the exclusive lower bound. --) + """ + @property + def wait(self) -> google.protobuf.duration_pb2.Duration: + """How long to wait for a notification when none is retained above + `after_counter`. + """ + max_notifications: builtins.int + """At most this many notifications are returned. Zero means the server's + default. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + channel: builtins.str = ..., + after_counter: builtins.int = ..., + wait: google.protobuf.duration_pb2.Duration | None = ..., + max_notifications: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["wait", b"wait"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "after_counter", + b"after_counter", + "channel", + b"channel", + "max_notifications", + b"max_notifications", + "namespace", + b"namespace", + "wait", + b"wait", + ], + ) -> None: ... + +global___PollChannelRequest = PollChannelRequest + +class PollChannelResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NOTIFICATIONS_FIELD_NUMBER: builtins.int + @property + def notifications( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.Notification + ]: ... + def __init__( + self, + *, + notifications: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.Notification + ] + | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["notifications", b"notifications"] + ) -> None: ... + +global___PollChannelResponse = PollChannelResponse + +class DescribeChannelRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + namespace: builtins.str + channel: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", b"channel", "namespace", b"namespace" + ], + ) -> None: ... + +global___DescribeChannelRequest = DescribeChannelRequest + +class DescribeChannelResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LISTENERS_FIELD_NUMBER: builtins.int + LATEST_FIELD_NUMBER: builtins.int + RETAINED_COUNT_FIELD_NUMBER: builtins.int + @property + def listeners( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.ChannelListener + ]: ... + @property + def latest(self) -> temporalio.api.notification.v1.message_pb2.Notification: + """The notification with the highest counter the channel retains.""" + retained_count: builtins.int + """How many notifications the channel retains for pollers.""" + def __init__( + self, + *, + listeners: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.ChannelListener + ] + | None = ..., + latest: temporalio.api.notification.v1.message_pb2.Notification | None = ..., + retained_count: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["latest", b"latest"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "latest", + b"latest", + "listeners", + b"listeners", + "retained_count", + b"retained_count", + ], + ) -> None: ... + +global___DescribeChannelResponse = DescribeChannelResponse + class SignalWithStartWorkflowExecutionRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index 6107f7a24..aec338a11 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xa0\xb5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\x8e\xc0\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\x97\x02\n\rNotifyChannel\x12\x35.temporal.api.workflowservice.v1.NotifyChannelRequest\x1a\x36.temporal.api.workflowservice.v1.NotifyChannelResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*\x12\xa0\x02\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\x81\x01\x82\xd3\xe4\x93\x02{"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*\x12\xbd\x02\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\x98\x01\x82\xd3\xe4\x93\x02\x91\x01*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}\x12\xfe\x01\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notifications\x12\xed\x01\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -139,6 +139,26 @@ _WORKFLOWSERVICE.methods_by_name[ "WakeWorkflowExecution" ]._serialized_options = b'\202\323\344\223\002\241\001"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*' + _WORKFLOWSERVICE.methods_by_name["NotifyChannel"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "NotifyChannel" + ]._serialized_options = b'\202\323\344\223\002\217\001">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*' + _WORKFLOWSERVICE.methods_by_name["RegisterChannelListener"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "RegisterChannelListener" + ]._serialized_options = b'\202\323\344\223\002{"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*' + _WORKFLOWSERVICE.methods_by_name["UnregisterChannelListener"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "UnregisterChannelListener" + ]._serialized_options = b"\202\323\344\223\002\221\001*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}" + _WORKFLOWSERVICE.methods_by_name["PollChannel"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "PollChannel" + ]._serialized_options = b"\202\323\344\223\002}\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notifications" + _WORKFLOWSERVICE.methods_by_name["DescribeChannel"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "DescribeChannel" + ]._serialized_options = b"\202\323\344\223\002a\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}" _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -530,5 +550,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 39834 + _WORKFLOWSERVICE._serialized_end = 41224 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.py b/temporalio/api/workflowservice/v1/service_pb2_grpc.py index 5e86252af..d636d3059 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.py +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.py @@ -148,6 +148,31 @@ def __init__(self, channel): request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, ) + self.NotifyChannel = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/NotifyChannel", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelResponse.FromString, + ) + self.RegisterChannelListener = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/RegisterChannelListener", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerResponse.FromString, + ) + self.UnregisterChannelListener = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/UnregisterChannelListener", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerResponse.FromString, + ) + self.PollChannel = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/PollChannel", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelResponse.FromString, + ) + self.DescribeChannel = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/DescribeChannel", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelResponse.FromString, + ) self.SignalWithStartWorkflowExecution = channel.unary_unary( "/temporal.api.workflowservice.v1.WorkflowService/SignalWithStartWorkflowExecution", request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.SerializeToString, @@ -948,6 +973,56 @@ def WakeWorkflowExecution(self, request, context): no event, carries no payload, and folds with other wakes for the same source, so a burst of writes costs one task. The Workflow learns the source and its position from the task and reads the source itself. + + Superseded by the notification channel (`NotifyChannel` and the + `SubscribeNotificationChannel` command). Kept for one round and slated for removal. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def NotifyChannel(self, request, context): + """NotifyChannel tells every listener of a channel that a source they consume + has moved. The writer names no addressee and never learns who listens. The + server wakes each listener: a Workflow with a Workflow Task, a callback by + invoking it. Nothing goes to History except the notifications a woken + Workflow Task carries on its scheduled event. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def RegisterChannelListener(self, request, context): + """RegisterChannelListener registers a callback as a listener of a channel. A + Workflow registers itself with the `SubscribeNotificationChannel` command + instead. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def UnregisterChannelListener(self, request, context): + """UnregisterChannelListener removes a listener from a channel. + + (-- api-linter: core::0136::http-method=disabled + aip.dev/not-precedent: Removing a listener is a delete of that listener. --) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def PollChannel(self, request, context): + """PollChannel is a long poll for clients. It returns the retained + notifications of a channel with a counter above `after_counter`, waiting + up to `wait` for one when none is retained yet. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def DescribeChannel(self, request, context): + """DescribeChannel returns the listeners of a channel and its latest + notification. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details("Method not implemented!") @@ -2059,6 +2134,31 @@ def add_WorkflowServiceServicer_to_server(servicer, server): request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.FromString, response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.SerializeToString, ), + "NotifyChannel": grpc.unary_unary_rpc_method_handler( + servicer.NotifyChannel, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelResponse.SerializeToString, + ), + "RegisterChannelListener": grpc.unary_unary_rpc_method_handler( + servicer.RegisterChannelListener, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerResponse.SerializeToString, + ), + "UnregisterChannelListener": grpc.unary_unary_rpc_method_handler( + servicer.UnregisterChannelListener, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerResponse.SerializeToString, + ), + "PollChannel": grpc.unary_unary_rpc_method_handler( + servicer.PollChannel, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelResponse.SerializeToString, + ), + "DescribeChannel": grpc.unary_unary_rpc_method_handler( + servicer.DescribeChannel, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelResponse.SerializeToString, + ), "SignalWithStartWorkflowExecution": grpc.unary_unary_rpc_method_handler( servicer.SignalWithStartWorkflowExecution, request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.FromString, @@ -3277,6 +3377,151 @@ def WakeWorkflowExecution( metadata, ) + @staticmethod + def NotifyChannel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/NotifyChannel", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def RegisterChannelListener( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/RegisterChannelListener", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def UnregisterChannelListener( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/UnregisterChannelListener", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def PollChannel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/PollChannel", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def DescribeChannel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/DescribeChannel", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + @staticmethod def SignalWithStartWorkflowExecution( request, diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi index 7df4ff12b..4ea73b3ff 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi @@ -288,6 +288,51 @@ class WorkflowServiceStub: no event, carries no payload, and folds with other wakes for the same source, so a burst of writes costs one task. The Workflow learns the source and its position from the task and reads the source itself. + + Superseded by the notification channel (`NotifyChannel` and the + `SubscribeNotificationChannel` command). Kept for one round and slated for removal. + """ + NotifyChannel: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelRequest, + temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelResponse, + ] + """NotifyChannel tells every listener of a channel that a source they consume + has moved. The writer names no addressee and never learns who listens. The + server wakes each listener: a Workflow with a Workflow Task, a callback by + invoking it. Nothing goes to History except the notifications a woken + Workflow Task carries on its scheduled event. + """ + RegisterChannelListener: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.RegisterChannelListenerRequest, + temporalio.api.workflowservice.v1.request_response_pb2.RegisterChannelListenerResponse, + ] + """RegisterChannelListener registers a callback as a listener of a channel. A + Workflow registers itself with the `SubscribeNotificationChannel` command + instead. + """ + UnregisterChannelListener: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.UnregisterChannelListenerRequest, + temporalio.api.workflowservice.v1.request_response_pb2.UnregisterChannelListenerResponse, + ] + """UnregisterChannelListener removes a listener from a channel. + + (-- api-linter: core::0136::http-method=disabled + aip.dev/not-precedent: Removing a listener is a delete of that listener. --) + """ + PollChannel: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.PollChannelRequest, + temporalio.api.workflowservice.v1.request_response_pb2.PollChannelResponse, + ] + """PollChannel is a long poll for clients. It returns the retained + notifications of a channel with a counter above `after_counter`, waiting + up to `wait` for one when none is retained yet. + """ + DescribeChannel: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.DescribeChannelRequest, + temporalio.api.workflowservice.v1.request_response_pb2.DescribeChannelResponse, + ] + """DescribeChannel returns the listeners of a channel and its latest + notification. """ SignalWithStartWorkflowExecution: grpc.UnaryUnaryMultiCallable[ temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, @@ -1502,6 +1547,61 @@ class WorkflowServiceServicer(metaclass=abc.ABCMeta): no event, carries no payload, and folds with other wakes for the same source, so a burst of writes costs one task. The Workflow learns the source and its position from the task and reads the source itself. + + Superseded by the notification channel (`NotifyChannel` and the + `SubscribeNotificationChannel` command). Kept for one round and slated for removal. + """ + @abc.abstractmethod + def NotifyChannel( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelResponse: + """NotifyChannel tells every listener of a channel that a source they consume + has moved. The writer names no addressee and never learns who listens. The + server wakes each listener: a Workflow with a Workflow Task, a callback by + invoking it. Nothing goes to History except the notifications a woken + Workflow Task carries on its scheduled event. + """ + @abc.abstractmethod + def RegisterChannelListener( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.RegisterChannelListenerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.RegisterChannelListenerResponse: + """RegisterChannelListener registers a callback as a listener of a channel. A + Workflow registers itself with the `SubscribeNotificationChannel` command + instead. + """ + @abc.abstractmethod + def UnregisterChannelListener( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.UnregisterChannelListenerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.UnregisterChannelListenerResponse: + """UnregisterChannelListener removes a listener from a channel. + + (-- api-linter: core::0136::http-method=disabled + aip.dev/not-precedent: Removing a listener is a delete of that listener. --) + """ + @abc.abstractmethod + def PollChannel( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.PollChannelRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.PollChannelResponse: + """PollChannel is a long poll for clients. It returns the retained + notifications of a channel with a counter above `after_counter`, waiting + up to `wait` for one when none is retained yet. + """ + @abc.abstractmethod + def DescribeChannel( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.DescribeChannelRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.DescribeChannelResponse: + """DescribeChannel returns the listeners of a channel and its latest + notification. """ @abc.abstractmethod def SignalWithStartWorkflowExecution( diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index d8fa05edf..5b57656ea 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,18 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_notification_v1_Notification( + self, fs: VisitorFunctions, o: Any + ): + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_NotificationsReceived( + self, fs: VisitorFunctions, o: Any + ): + for v in o.notifications: + await self._visit_temporal_api_notification_v1_Notification(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +365,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("notifications_received"): + await self._visit_coresdk_workflow_activation_NotificationsReceived( + fs, o.notifications_received + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5c178e218..421a143c9 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -3,6 +3,7 @@ DoUpdate, FireTimer, InitializeWorkflow, + NotificationsReceived, NotifyHasPatch, QueryWorkflow, RemoveFromCache, @@ -27,6 +28,7 @@ "DoUpdate", "FireTimer", "InitializeWorkflow", + "NotificationsReceived", "NotifyHasPatch", "QueryWorkflow", "RemoveFromCache", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 0caca7d48..2910aa008 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -27,6 +27,9 @@ from temporalio.api.failure.v1 import ( message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, ) +from temporalio.api.notification.v1 import ( + message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, +) from temporalio.api.update.v1 import ( message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, ) @@ -44,12 +47,13 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xe0\n\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a*temporal/api/notification/v1/message.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb6\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12T\n\x16notifications_received\x18\x16 \x01(\x0b\x32\x32.coresdk.workflow_activation.NotificationsReceivedH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"Z\n\x15NotificationsReceived\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_NOTIFICATIONSRECEIVED = DESCRIPTOR.message_types_by_name["NotificationsReceived"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ "HeadersEntry" @@ -114,6 +118,17 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) +NotificationsReceived = _reflection.GeneratedProtocolMessageType( + "NotificationsReceived", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFICATIONSRECEIVED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotificationsReceived) + }, +) +_sym_db.RegisterMessage(NotificationsReceived) + InitializeWorkflow = _reflection.GeneratedProtocolMessageType( "InitializeWorkflow", (_message.Message,), @@ -376,56 +391,58 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 532 - _WORKFLOWACTIVATION._serialized_end = 1078 - _WORKFLOWACTIVATIONJOB._serialized_start = 1081 - _WORKFLOWACTIVATIONJOB._serialized_end = 2457 - _INITIALIZEWORKFLOW._serialized_start = 2460 - _INITIALIZEWORKFLOW._serialized_end = 3864 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _FIRETIMER._serialized_start = 3866 - _FIRETIMER._serialized_end = 3890 - _RESOLVEACTIVITY._serialized_start = 3892 - _RESOLVEACTIVITY._serialized_end = 4001 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4004 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4341 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4343 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4402 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4405 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4571 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4573 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4669 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4671 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4776 - _UPDATERANDOMSEED._serialized_start = 4778 - _UPDATERANDOMSEED._serialized_end = 4821 - _QUERYWORKFLOW._serialized_start = 4824 - _QUERYWORKFLOW._serialized_end = 5084 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _CANCELWORKFLOW._serialized_start = 5086 - _CANCELWORKFLOW._serialized_end = 5118 - _SIGNALWORKFLOW._serialized_start = 5121 - _SIGNALWORKFLOW._serialized_end = 5410 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 3785 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 3864 - _NOTIFYHASPATCH._serialized_start = 5412 - _NOTIFYHASPATCH._serialized_end = 5446 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5448 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5543 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5545 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5647 - _DOUPDATE._serialized_start = 5650 - _DOUPDATE._serialized_end = 5981 - _DOUPDATE_HEADERSENTRY._serialized_start = 3785 - _DOUPDATE_HEADERSENTRY._serialized_end = 3864 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 5984 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6138 - _RESOLVENEXUSOPERATION._serialized_start = 6140 - _RESOLVENEXUSOPERATION._serialized_end = 6229 - _REMOVEFROMCACHE._serialized_start = 6232 - _REMOVEFROMCACHE._serialized_end = 6584 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6346 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6584 + _WORKFLOWACTIVATION._serialized_start = 576 + _WORKFLOWACTIVATION._serialized_end = 1122 + _WORKFLOWACTIVATIONJOB._serialized_start = 1125 + _WORKFLOWACTIVATIONJOB._serialized_end = 2587 + _NOTIFICATIONSRECEIVED._serialized_start = 2589 + _NOTIFICATIONSRECEIVED._serialized_end = 2679 + _INITIALIZEWORKFLOW._serialized_start = 2682 + _INITIALIZEWORKFLOW._serialized_end = 4086 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4007 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4086 + _FIRETIMER._serialized_start = 4088 + _FIRETIMER._serialized_end = 4112 + _RESOLVEACTIVITY._serialized_start = 4114 + _RESOLVEACTIVITY._serialized_end = 4223 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4226 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4563 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4565 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4624 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4627 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4793 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4795 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4891 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4893 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4998 + _UPDATERANDOMSEED._serialized_start = 5000 + _UPDATERANDOMSEED._serialized_end = 5043 + _QUERYWORKFLOW._serialized_start = 5046 + _QUERYWORKFLOW._serialized_end = 5306 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4007 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4086 + _CANCELWORKFLOW._serialized_start = 5308 + _CANCELWORKFLOW._serialized_end = 5340 + _SIGNALWORKFLOW._serialized_start = 5343 + _SIGNALWORKFLOW._serialized_end = 5632 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4007 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4086 + _NOTIFYHASPATCH._serialized_start = 5634 + _NOTIFYHASPATCH._serialized_end = 5668 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5670 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5765 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5767 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5869 + _DOUPDATE._serialized_start = 5872 + _DOUPDATE._serialized_end = 6203 + _DOUPDATE_HEADERSENTRY._serialized_start = 4007 + _DOUPDATE_HEADERSENTRY._serialized_end = 4086 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6206 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6360 + _RESOLVENEXUSOPERATION._serialized_start = 6362 + _RESOLVENEXUSOPERATION._serialized_end = 6451 + _REMOVEFROMCACHE._serialized_start = 6454 + _REMOVEFROMCACHE._serialized_end = 6806 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6568 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6806 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index afc7eb4ab..86a726e68 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -21,6 +21,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.notification.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -235,6 +236,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + NOTIFICATIONS_RECEIVED_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -295,6 +297,12 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property + def notifications_received(self) -> global___NotificationsReceived: + """17 to 21 are taken by the stream jobs, which share this message. + + Notifications from the channels the workflow subscribed to. + """ + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -322,6 +330,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + notifications_received: global___NotificationsReceived | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -335,6 +344,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"fire_timer", "initialize_workflow", b"initialize_workflow", + "notifications_received", + b"notifications_received", "notify_has_patch", b"notify_has_patch", "query_workflow", @@ -374,6 +385,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"fire_timer", "initialize_workflow", b"initialize_workflow", + "notifications_received", + b"notifications_received", "notify_has_patch", b"notify_has_patch", "query_workflow", @@ -421,6 +434,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "notifications_received", "remove_from_cache", ] | None @@ -428,6 +442,37 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class NotificationsReceived(google.protobuf.message.Message): + """Hand a workflow the notifications the server folded for its channels. + + They come from the scheduled event of the Workflow Task this activation + belongs to. History is the record, so a replay yields the same job with the + same notifications at the same point. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NOTIFICATIONS_FIELD_NUMBER: builtins.int + @property + def notifications( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.Notification + ]: ... + def __init__( + self, + *, + notifications: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.Notification + ] + | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["notifications", b"notifications"] + ) -> None: ... + +global___NotificationsReceived = NotificationsReceived + class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index f599917af..1153e3c9b 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -21,6 +21,7 @@ SignalExternalWorkflowExecution, StartChildWorkflowExecution, StartTimer, + SubscribeNotificationChannel, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -49,6 +50,7 @@ "SignalExternalWorkflowExecution", "StartChildWorkflowExecution", "StartTimer", + "SubscribeNotificationChannel", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 0cdc02c6b..54939089c 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa9\x10\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x42\t\n\x07variant"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\x8c\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x42\t\n\x07variant"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -56,6 +56,9 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_SUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ + "SubscribeNotificationChannel" +] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] _SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] @@ -130,6 +133,17 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +SubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( + "SubscribeNotificationChannel", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBENOTIFICATIONCHANNEL, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeNotificationChannel) + }, +) +_sym_db.RegisterMessage(SubscribeNotificationChannel) + StartTimer = _reflection.GeneratedProtocolMessageType( "StartTimer", (_message.Message,), @@ -484,70 +498,72 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8672 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8760 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8820 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 8908 _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2607 - _STARTTIMER._serialized_start = 2609 - _STARTTIMER._serialized_end = 2692 - _CANCELTIMER._serialized_start = 2694 - _CANCELTIMER._serialized_end = 2720 - _SCHEDULEACTIVITY._serialized_start = 2723 - _SCHEDULEACTIVITY._serialized_end = 3547 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3547 - _SCHEDULELOCALACTIVITY._serialized_start = 3550 - _SCHEDULELOCALACTIVITY._serialized_end = 4339 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3468 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3547 - _REQUESTCANCELACTIVITY._serialized_start = 4341 - _REQUESTCANCELACTIVITY._serialized_end = 4377 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4379 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4420 - _QUERYRESULT._serialized_start = 4423 - _QUERYRESULT._serialized_end = 4579 - _QUERYSUCCESS._serialized_start = 4581 - _QUERYSUCCESS._serialized_end = 4646 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4648 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4724 - _FAILWORKFLOWEXECUTION._serialized_start = 4726 - _FAILWORKFLOWEXECUTION._serialized_end = 4800 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4803 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5717 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELWORKFLOWEXECUTION._serialized_start = 5719 - _CANCELWORKFLOWEXECUTION._serialized_end = 5795 - _SETPATCHMARKER._serialized_start = 5797 - _SETPATCHMARKER._serialized_end = 5851 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 5854 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7028 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5560 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5636 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7030 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7104 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7107 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7249 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7252 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7651 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3468 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3547 - _CANCELSIGNALWORKFLOW._serialized_start = 7653 - _CANCELSIGNALWORKFLOW._serialized_end = 7688 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7690 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7791 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7793 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 7872 - _UPDATERESPONSE._serialized_start = 7875 - _UPDATERESPONSE._serialized_end = 8085 - _SCHEDULENEXUSOPERATION._serialized_start = 8088 - _SCHEDULENEXUSOPERATION._serialized_end = 8626 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8576 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8626 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8628 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8670 + _WORKFLOWCOMMAND._serialized_end = 2706 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 2708 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 2755 + _STARTTIMER._serialized_start = 2757 + _STARTTIMER._serialized_end = 2840 + _CANCELTIMER._serialized_start = 2842 + _CANCELTIMER._serialized_end = 2868 + _SCHEDULEACTIVITY._serialized_start = 2871 + _SCHEDULEACTIVITY._serialized_end = 3695 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3616 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3695 + _SCHEDULELOCALACTIVITY._serialized_start = 3698 + _SCHEDULELOCALACTIVITY._serialized_end = 4487 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3616 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3695 + _REQUESTCANCELACTIVITY._serialized_start = 4489 + _REQUESTCANCELACTIVITY._serialized_end = 4525 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4527 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4568 + _QUERYRESULT._serialized_start = 4571 + _QUERYRESULT._serialized_end = 4727 + _QUERYSUCCESS._serialized_start = 4729 + _QUERYSUCCESS._serialized_end = 4794 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4796 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 4872 + _FAILWORKFLOWEXECUTION._serialized_start = 4874 + _FAILWORKFLOWEXECUTION._serialized_end = 4948 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4951 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5865 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5708 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5784 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 + _CANCELWORKFLOWEXECUTION._serialized_start = 5867 + _CANCELWORKFLOWEXECUTION._serialized_end = 5943 + _SETPATCHMARKER._serialized_start = 5945 + _SETPATCHMARKER._serialized_end = 5999 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6002 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7176 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5708 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5784 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7178 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7252 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7255 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7397 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7400 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7799 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 + _CANCELSIGNALWORKFLOW._serialized_start = 7801 + _CANCELSIGNALWORKFLOW._serialized_end = 7836 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7838 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7939 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 7941 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8020 + _UPDATERESPONSE._serialized_start = 8023 + _UPDATERESPONSE._serialized_end = 8233 + _SCHEDULENEXUSOPERATION._serialized_start = 8236 + _SCHEDULENEXUSOPERATION._serialized_end = 8774 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8724 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8774 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8776 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8818 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index ad4a5f487..e658d1585 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -103,6 +103,7 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -177,6 +178,9 @@ class WorkflowCommand(google.protobuf.message.Message): def request_cancel_nexus_operation( self, ) -> global___RequestCancelNexusOperation: ... + @property + def subscribe_notification_channel(self) -> global___SubscribeNotificationChannel: + """23 to 30 are taken by the stream commands, which share this message.""" def __init__( self, *, @@ -215,6 +219,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_notification_channel: global___SubscribeNotificationChannel + | None = ..., ) -> None: ... def HasField( self, @@ -259,6 +265,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_notification_channel", + b"subscribe_notification_channel", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -314,6 +322,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_notification_channel", + b"subscribe_notification_channel", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -350,12 +360,37 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_notification_channel", ] | None ): ... global___WorkflowCommand = WorkflowCommand +class SubscribeNotificationChannel(google.protobuf.message.Message): + """Subscribe this workflow to a notification channel, so the scheduled event of + each later Workflow Task carries the notifications folded for it. + + The notifications live in History rather than arriving by a side channel, so + a replay reads the same ones the live run saw. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """Name of the channel, scoped to the namespace.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___SubscribeNotificationChannel = SubscribeNotificationChannel + class StartTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 3fafca0b1..a9a025b81 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 3fafca0b13c23b61565231a7810ba0749e559793 +Subproject commit a9a025b8172618a15777da64fbfc259d1c6b73f9 diff --git a/temporalio/bridge/services_generated.py b/temporalio/bridge/services_generated.py index fdd706cf4..88e63e187 100644 --- a/temporalio/bridge/services_generated.py +++ b/temporalio/bridge/services_generated.py @@ -369,6 +369,24 @@ async def describe_batch_operation( timeout=timeout, ) + async def describe_channel( + self, + req: temporalio.api.workflowservice.v1.DescribeChannelRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.DescribeChannelResponse: + """Invokes the WorkflowService.describe_channel rpc method.""" + return await self._client._rpc_call( + rpc="describe_channel", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.DescribeChannelResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def describe_deployment( self, req: temporalio.api.workflowservice.v1.DescribeDeploymentRequest, @@ -1035,6 +1053,24 @@ async def list_workflow_rules( timeout=timeout, ) + async def notify_channel( + self, + req: temporalio.api.workflowservice.v1.NotifyChannelRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.NotifyChannelResponse: + """Invokes the WorkflowService.notify_channel rpc method.""" + return await self._client._rpc_call( + rpc="notify_channel", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.NotifyChannelResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def patch_schedule( self, req: temporalio.api.workflowservice.v1.PatchScheduleRequest, @@ -1143,6 +1179,24 @@ async def poll_activity_task_queue( timeout=timeout, ) + async def poll_channel( + self, + req: temporalio.api.workflowservice.v1.PollChannelRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.PollChannelResponse: + """Invokes the WorkflowService.poll_channel rpc method.""" + return await self._client._rpc_call( + rpc="poll_channel", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.PollChannelResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def poll_nexus_operation_execution( self, req: temporalio.api.workflowservice.v1.PollNexusOperationExecutionRequest, @@ -1305,6 +1359,24 @@ async def record_worker_heartbeat( timeout=timeout, ) + async def register_channel_listener( + self, + req: temporalio.api.workflowservice.v1.RegisterChannelListenerRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.RegisterChannelListenerResponse: + """Invokes the WorkflowService.register_channel_listener rpc method.""" + return await self._client._rpc_call( + rpc="register_channel_listener", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.RegisterChannelListenerResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def register_namespace( self, req: temporalio.api.workflowservice.v1.RegisterNamespaceRequest, @@ -2007,6 +2079,24 @@ async def unpause_workflow_execution( timeout=timeout, ) + async def unregister_channel_listener( + self, + req: temporalio.api.workflowservice.v1.UnregisterChannelListenerRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.UnregisterChannelListenerResponse: + """Invokes the WorkflowService.unregister_channel_listener rpc method.""" + return await self._client._rpc_call( + rpc="unregister_channel_listener", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.UnregisterChannelListenerResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def update_activity_execution_options( self, req: temporalio.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest, diff --git a/temporalio/bridge/src/client_rpc_generated.rs b/temporalio/bridge/src/client_rpc_generated.rs index 3017217c0..ecac84667 100644 --- a/temporalio/bridge/src/client_rpc_generated.rs +++ b/temporalio/bridge/src/client_rpc_generated.rs @@ -191,6 +191,15 @@ impl ClientRef { describe_batch_operation ) } + "describe_channel" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + describe_channel + ) + } "describe_deployment" => { rpc_call!( connection, @@ -524,6 +533,15 @@ impl ClientRef { list_workflow_rules ) } + "notify_channel" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + notify_channel + ) + } "patch_schedule" => { rpc_call!( connection, @@ -578,6 +596,15 @@ impl ClientRef { poll_activity_task_queue ) } + "poll_channel" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + poll_channel + ) + } "poll_nexus_operation_execution" => { rpc_call!( connection, @@ -659,6 +686,15 @@ impl ClientRef { record_worker_heartbeat ) } + "register_channel_listener" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + register_channel_listener + ) + } "register_namespace" => { rpc_call!( connection, @@ -1010,6 +1046,15 @@ impl ClientRef { unpause_workflow_execution ) } + "unregister_channel_listener" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + unregister_channel_listener + ) + } "update_activity_execution_options" => { rpc_call!( connection, From aab2644615f3d870ded6c0e983ec3b32bc60017f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 18:24:51 -0700 Subject: [PATCH 756/831] Added channel subscriptions to the workflow runtime. A workflow subscribes to a notification channel once per run and gets the notifications the server folded for it with each Workflow Task. They travel in History, so a replay sees the same ones at the same points. --- temporalio/worker/_workflow_instance.py | 35 ++++ temporalio/workflow/__init__.py | 8 + temporalio/workflow/_channels.py | 144 +++++++++++++++ temporalio/workflow/_context.py | 4 + tests/streams/test_channels.py | 224 ++++++++++++++++++++++++ 5 files changed, 415 insertions(+) create mode 100644 temporalio/workflow/_channels.py create mode 100644 tests/streams/test_channels.py diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index d2b588c88..d37a001c4 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -308,6 +308,10 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: self._patch_activation_callback = det.patch_activation_callback self._stream_provider = det.stream_provider self._streams: temporalio.workflow._streams._WorkflowStreams | None = None + # Keyed by channel name; one subscription per channel per run + self._channel_subscriptions: dict[ + str, temporalio.workflow.ChannelSubscription + ] = {} self._default_workflow_logic_flags = det.default_workflow_logic_flags self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False @@ -629,6 +633,8 @@ def _apply( self._apply_query_workflow(job.query_workflow) elif job.HasField("notify_has_patch"): self._apply_notify_has_patch(job.notify_has_patch) + elif job.HasField("notifications_received"): + self._apply_notifications_received(job.notifications_received) elif job.HasField("remove_from_cache"): self._apply_remove_from_cache(job.remove_from_cache) elif job.HasField("resolve_activity"): @@ -870,6 +876,23 @@ async def run_query() -> None: # Schedule it self.create_task(run_query(), name=f"query: {job.query_type}") + def _apply_notifications_received( + self, job: temporalio.bridge.proto.workflow_activation.NotificationsReceived + ) -> None: + for proto in job.notifications: + subscription = self._channel_subscriptions.get(proto.channel) + if subscription is None: + # The server fans out to whatever listened at the time, so a + # channel this run never subscribed to is not the workflow's + # concern. + logger.debug( + "Dropping a notification on channel %r, which this run has not " + "subscribed to", + proto.channel, + ) + continue + subscription._deliver(temporalio.workflow.Notification._from_proto(proto)) + def _apply_notify_has_patch( self, job: temporalio.bridge.proto.workflow_activation.NotifyHasPatch ) -> None: @@ -1832,6 +1855,18 @@ def workflow_streams(self) -> temporalio.workflow._streams._WorkflowStreams: ) return self._streams + def workflow_subscribe_channel( + self, channel: str + ) -> temporalio.workflow.ChannelSubscription: + existing = self._channel_subscriptions.get(channel) + if existing is not None: + return existing + command = self._add_command() + command.subscribe_notification_channel.channel = channel + subscription = temporalio.workflow.ChannelSubscription(channel) + self._channel_subscriptions[channel] = subscription + return subscription + def workflow_time_ns(self) -> int: return self._time_ns diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 71354331b..0cf3b058a 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -57,6 +57,11 @@ as_completed, wait, ) +from ._channels import ( + ChannelSubscription, + Notification, + subscribe_channel, +) from ._context import ( Info, ParentInfo, @@ -264,6 +269,9 @@ "SandboxImportNotificationPolicy", "logger", "unsafe", + "ChannelSubscription", + "Notification", + "subscribe_channel", "StreamReader", "StreamWriter", "stream_reader", diff --git a/temporalio/workflow/_channels.py b/temporalio/workflow/_channels.py new file mode 100644 index 000000000..8fd045519 --- /dev/null +++ b/temporalio/workflow/_channels.py @@ -0,0 +1,144 @@ +"""Notification channels from inside workflow code. + +.. warning:: + This module is experimental and may change in future versions. + +A channel carries notifications, not data. A writer tells the channel's +listeners that a source they consume has moved, and each listener reads the +source itself. A workflow that subscribes gets the notifications the server +folded for it with each Workflow Task. They travel in History, so a replay +sees the same ones at the same points. +""" + +from __future__ import annotations + +import asyncio +from collections import deque +from collections.abc import Mapping +from dataclasses import dataclass, field + +import temporalio.api.common.v1 +import temporalio.api.notification.v1 +from temporalio.workflow._context import _Runtime + +__all__ = ["ChannelSubscription", "Notification", "subscribe_channel"] + + +@dataclass(frozen=True) +class Notification: + """One notification from a channel. + + The server folds notifications per listener while one is pending and no + task has been scheduled for it, keeping the one with the highest counter. + A listener therefore sees where a burst of writes ended, not every write. + """ + + channel: str + """The channel the writer notified.""" + + position: bytes + """Where the source stands after the write, in the writer's terms. + + Opaque to the server and handed over as sent. + """ + + counter: int + """Orders notifications from one channel's writers. Higher is later.""" + + metadata: Mapping[str, temporalio.api.common.v1.Payload] = field( + default_factory=dict + ) + """Details for the listener, such as which topic moved, as payloads. + + A codec has been applied. Convert a value with + :py:meth:`temporalio.converter.PayloadConverter.from_payload` on the + converter :py:func:`temporalio.workflow.payload_converter` returns. + """ + + @staticmethod + def _from_proto( + proto: temporalio.api.notification.v1.Notification, + ) -> Notification: + return Notification( + channel=proto.channel, + position=proto.position, + counter=proto.counter, + metadata=dict(proto.metadata.items()), + ) + + +class ChannelSubscription: + """A workflow's subscription to one channel. + + Prefer :func:`temporalio.workflow.subscribe_channel`. The subscription is + an async iterator over the notifications as they arrive, and + :meth:`receive` takes them one at a time. Notifications wait in arrival + order until taken. Two loops on one subscription share its buffer and + interleave. + """ + + def __init__(self, channel: str) -> None: + """Prefer :func:`temporalio.workflow.subscribe_channel`.""" + self._channel = channel + self._pending: deque[Notification] = deque() + self._waiters: deque[asyncio.Future[None]] = deque() + + @property + def channel(self) -> str: + """The channel this subscription is on.""" + return self._channel + + async def receive(self) -> Notification: + """The next notification on this channel, waiting for one to arrive. + + The wait is a future the delivery resolves, so it adds no command and + replays the same way. + """ + while not self._pending: + waiter: asyncio.Future[None] = asyncio.Future() + self._waiters.append(waiter) + try: + await waiter + finally: + if waiter in self._waiters: + self._waiters.remove(waiter) + return self._pending.popleft() + + def __aiter__(self) -> ChannelSubscription: + """The subscription is its own iterator.""" + return self + + async def __anext__(self) -> Notification: + """The next notification; the iteration never ends on its own.""" + return await self.receive() + + def _deliver(self, notification: Notification) -> None: + self._pending.append(notification) + # Every waiter wakes; the ones that find the buffer empty again wait + # once more. + while self._waiters: + waiter = self._waiters.popleft() + if not waiter.done(): + waiter.set_result(None) + + +def subscribe_channel(channel: str) -> ChannelSubscription: + """Subscribe this workflow to ``channel``. + + The first call for a channel in a run issues a command, so gate a new + channel with :func:`temporalio.workflow.patched` as you would a timer. A + second call for the same channel returns the subscription already open, + and the two share its buffer. From then on each Workflow Task carries the + notifications the server folded for this workflow on the channel, and + they arrive here. A successor run after continue-as-new starts with no + subscriptions. + + Args: + channel: Name of the channel, scoped to the namespace. + + Raises: + ValueError: ``channel`` is empty. + """ + if not channel: + raise ValueError("channel must not be empty") + return _Runtime.current().workflow_subscribe_channel(channel) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index fcea4b920..e0cb59a8d 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -22,6 +22,7 @@ if TYPE_CHECKING: from ._activities import ActivityCancellationType, ActivityHandle + from ._channels import ChannelSubscription from ._event_groups import EventGroup from ._exceptions import ContinueAsNewVersioningBehavior, VersioningIntent from ._nexus import NexusOperationCancellationType, NexusOperationHandle @@ -513,6 +514,9 @@ async def workflow_start_nexus_operation( @abstractmethod def workflow_streams(self) -> _WorkflowStreams: ... + @abstractmethod + def workflow_subscribe_channel(self, channel: str) -> ChannelSubscription: ... + @abstractmethod def workflow_time_ns(self) -> int: ... diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py new file mode 100644 index 000000000..a8b6a6d26 --- /dev/null +++ b/tests/streams/test_channels.py @@ -0,0 +1,224 @@ +"""The notification channel surface: the command, the delivery and the client calls. + +The workflow instance is driven with activations directly, the way Core +drives it, because the dev server this chain tests against does not accept +the subscribe command. +""" + +from __future__ import annotations + +from datetime import datetime, timedelta, timezone +from typing import Any + +import temporalio.api.common.v1 +import temporalio.api.notification.v1 +import temporalio.bridge.proto.workflow_activation +import temporalio.bridge.proto.workflow_completion +import temporalio.common +import temporalio.converter +from temporalio import workflow +from temporalio.worker._workflow_instance import ( + UnsandboxedWorkflowRunner, + WorkflowInstance, + WorkflowInstanceDetails, +) + +WorkflowActivation = temporalio.bridge.proto.workflow_activation.WorkflowActivation +WorkflowActivationJob = ( + temporalio.bridge.proto.workflow_activation.WorkflowActivationJob +) +WorkflowActivationCompletion = ( + temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion +) +Notification = temporalio.api.notification.v1.Notification + + +@workflow.defn +class ReceiveOne: + """Subscribes to one channel and reports the first notification.""" + + @workflow.run + async def run(self, channel: str) -> dict[str, Any]: + notification = await workflow.subscribe_channel(channel).receive() + return { + "channel": notification.channel, + "counter": notification.counter, + "position": notification.position.decode(), + "topic": ( + workflow.payload_converter().from_payload( + notification.metadata["topic"], str + ) + if "topic" in notification.metadata + else None + ), + } + + +@workflow.defn +class CountToTwo: + """Subscribes twice to one channel and counts notifications up to counter two.""" + + @workflow.run + async def run(self, channel: str) -> int: + first = workflow.subscribe_channel(channel) + second = workflow.subscribe_channel(channel) + assert first is second + seen = 0 + async for notification in second: + seen += 1 + if notification.counter >= 2: + break + return seen + + +@workflow.defn +class EmptyChannel: + """Asks for a channel with no name.""" + + @workflow.run + async def run(self) -> None: + workflow.subscribe_channel("") + + +def _instance(workflow_class: type) -> WorkflowInstance: + """Build an instance the way the worker does, without a worker. + + Needs a running event loop, since the constructor puts the runtime on it. + """ + defn = workflow._Definition.must_from_class(workflow_class) + now = datetime.now(timezone.utc) + info = workflow.Info( + attempt=1, + continued_run_id=None, + cron_schedule=None, + execution_timeout=None, + first_execution_run_id="run", + headers={}, + namespace="default", + original_execution_run_id="run", + parent=None, + root=None, + priority=temporalio.common.Priority.default, + raw_memo={}, + retry_policy=None, + run_id="run", + run_timeout=None, + search_attributes={}, + start_time=now, + task_queue="tq", + task_timeout=timedelta(seconds=10), + typed_search_attributes=temporalio.common.TypedSearchAttributes.empty, + workflow_id="wf", + workflow_start_time=now, + workflow_type=defn.name or "", + ) + converter = temporalio.converter.DataConverter.default + return UnsandboxedWorkflowRunner().create_instance( + WorkflowInstanceDetails( + payload_converter_factory=converter._new_internal_payload_converter, + failure_converter_class=converter.failure_converter_class, + interceptor_classes=[], + defn=defn, + info=info, + randomness_seed=0, + extern_functions={}, + disable_eager_activity_execution=False, + worker_level_failure_exception_types=[], + patch_activation_callback=None, + last_completion_result=temporalio.api.common.v1.Payloads(), + last_failure=None, + ) + ) + + +def _start(workflow_class: type, *args: Any) -> WorkflowActivation: + job = WorkflowActivationJob() + init = job.initialize_workflow + init.workflow_type = workflow._Definition.must_from_class(workflow_class).name or "" + init.workflow_id = "wf" + init.arguments.extend( + temporalio.converter.PayloadConverter.default.to_payloads(args) + ) + return WorkflowActivation(run_id="run", jobs=[job]) + + +def _notified(*notifications: Notification) -> WorkflowActivation: + job = WorkflowActivationJob() + job.notifications_received.notifications.extend(notifications) + return WorkflowActivation(run_id="run", jobs=[job]) + + +def _subscribed(completion: WorkflowActivationCompletion) -> list[str]: + assert completion.HasField("successful"), completion.failed.failure.message + return [ + command.subscribe_notification_channel.channel + for command in completion.successful.commands + if command.HasField("subscribe_notification_channel") + ] + + +def _completed(completion: WorkflowActivationCompletion) -> bool: + assert completion.HasField("successful"), completion.failed.failure.message + return any( + command.HasField("complete_workflow_execution") + for command in completion.successful.commands + ) + + +def _result(completion: WorkflowActivationCompletion) -> Any: + assert completion.HasField("successful"), completion.failed.failure.message + [done] = [ + command + for command in completion.successful.commands + if command.HasField("complete_workflow_execution") + ] + return temporalio.converter.PayloadConverter.default.from_payload( + done.complete_workflow_execution.result + ) + + +async def test_the_first_subscription_is_a_command_and_the_second_shares_it(): + instance = _instance(CountToTwo) + completion = instance.activate(_start(CountToTwo, "orders")) + assert _subscribed(completion) == ["orders"] + assert not _completed(completion) + + +async def test_a_notifications_received_job_wakes_the_receiver(): + instance = _instance(ReceiveOne) + assert _subscribed(instance.activate(_start(ReceiveOne, "orders"))) == ["orders"] + [topic] = temporalio.converter.PayloadConverter.default.to_payloads(["inputs"]) + completion = instance.activate( + _notified( + Notification( + channel="orders", position=b"7-0", counter=7, metadata={"topic": topic} + ) + ) + ) + assert _result(completion) == { + "channel": "orders", + "counter": 7, + "position": "7-0", + "topic": "inputs", + } + + +async def test_notifications_arrive_in_order_and_other_channels_are_dropped(): + instance = _instance(CountToTwo) + instance.activate(_start(CountToTwo, "orders")) + # A channel this run never subscribed to is not the workflow's concern. + completion = instance.activate(_notified(Notification(channel="other", counter=9))) + assert not _completed(completion) + completion = instance.activate( + _notified( + Notification(channel="orders", counter=1), + Notification(channel="orders", counter=2), + ) + ) + assert _result(completion) == 2 + + +async def test_an_empty_channel_name_is_refused(): + completion = _instance(EmptyChannel).activate(_start(EmptyChannel)) + assert completion.HasField("failed") + assert "channel must not be empty" in completion.failed.failure.message From 5f28a14f7f649d70ab5f8b0d1a9e3e6e9586cd0b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 18:24:51 -0700 Subject: [PATCH 757/831] Added the notification channel calls to the client. Notify, poll, describe, register and unregister go through the outbound interceptor with one input each. Metadata values are encoded with the data converter on the way out and come back as payloads, the shape workflow code sees. --- temporalio/client/__init__.py | 16 +++ temporalio/client/_channel.py | 78 ++++++++++++ temporalio/client/_client.py | 191 ++++++++++++++++++++++++++++++ temporalio/client/_impl.py | 122 +++++++++++++++++++ temporalio/client/_interceptor.py | 125 +++++++++++++++++++ tests/streams/conftest.py | 23 ++++ tests/streams/test_channels.py | 55 ++++++++- 7 files changed, 609 insertions(+), 1 deletion(-) create mode 100644 temporalio/client/_channel.py diff --git a/temporalio/client/__init__.py b/temporalio/client/__init__.py index 2eef41a39..1a879923c 100644 --- a/temporalio/client/__init__.py +++ b/temporalio/client/__init__.py @@ -64,6 +64,10 @@ from ._callback import ( Callback, ) +from ._channel import ( + ChannelDescription, + ChannelListener, +) from ._client import ( Client, ClientConfig, @@ -106,6 +110,7 @@ CreateScheduleInput, DeleteScheduleInput, DescribeActivityInput, + DescribeChannelInput, DescribeNexusOperationInput, DescribeScheduleInput, DescribeWorkflowInput, @@ -120,10 +125,13 @@ ListNexusOperationsInput, ListSchedulesInput, ListWorkflowsInput, + NotifyChannelInput, OutboundInterceptor, PauseActivityInput, PauseScheduleInput, + PollChannelInput, QueryWorkflowInput, + RegisterChannelListenerInput, ReportCancellationAsyncActivityInput, SignalWorkflowInput, StartActivityInput, @@ -137,6 +145,7 @@ TriggerScheduleInput, UnpauseActivityInput, UnpauseScheduleInput, + UnregisterChannelListenerInput, UpdateActivityOptionsInput, UpdateScheduleInput, UpdateWithStartStartWorkflowInput, @@ -315,6 +324,11 @@ "TerminateNexusOperationInput", "ListNexusOperationsInput", "CountNexusOperationsInput", + "DescribeChannelInput", + "NotifyChannelInput", + "PollChannelInput", + "RegisterChannelListenerInput", + "UnregisterChannelListenerInput", "StartWorkflowUpdateInput", "UpdateWithStartUpdateWorkflowInput", "UpdateWithStartStartWorkflowInput", @@ -351,6 +365,8 @@ "CloudOperationsClient", "Plugin", "Callback", + "ChannelDescription", + "ChannelListener", "_ClientImpl", "_apply_headers", "_decode_user_metadata", diff --git a/temporalio/client/_channel.py b/temporalio/client/_channel.py new file mode 100644 index 000000000..09d5e1d23 --- /dev/null +++ b/temporalio/client/_channel.py @@ -0,0 +1,78 @@ +"""Notification channel descriptions as the client reports them.""" + +from __future__ import annotations + +from collections.abc import Sequence +from dataclasses import dataclass +from datetime import datetime, timezone + +import temporalio.api.notification.v1 +from temporalio.workflow import Notification + +from ._callback import Callback + +__all__ = ["ChannelDescription", "ChannelListener"] + + +@dataclass(frozen=True) +class ChannelListener: + """One listener of a channel: a workflow or a callback. + + .. warning:: + This API is experimental and unstable. + """ + + listener_id: str + """Assigned by the server when the listener registered.""" + + workflow_id: str | None + """The subscribed workflow, when the listener is one.""" + + run_id: str | None + """The run that subscribed. Delivery follows the chain's current run.""" + + callback: Callback | None + """The callback the server invokes, when the listener is one.""" + + registered_time: datetime | None + """When the listener registered.""" + + @staticmethod + def _from_proto( + proto: temporalio.api.notification.v1.ChannelListener, + ) -> ChannelListener: + callback: Callback | None = None + if proto.HasField("callback") and proto.callback.HasField("nexus"): + callback = Callback( + url=proto.callback.nexus.url, headers=dict(proto.callback.nexus.header) + ) + workflow = proto.workflow if proto.HasField("workflow") else None + return ChannelListener( + listener_id=proto.listener_id, + workflow_id=workflow.workflow_id if workflow else None, + run_id=workflow.run_id if workflow else None, + callback=callback, + registered_time=( + proto.registered_time.ToDatetime(tzinfo=timezone.utc) + if proto.HasField("registered_time") + else None + ), + ) + + +@dataclass(frozen=True) +class ChannelDescription: + """What the server knows about a channel. + + .. warning:: + This API is experimental and unstable. + """ + + listeners: Sequence[ChannelListener] + """Who is listening, workflows and callbacks alike.""" + + latest: Notification | None + """The notification with the highest counter the channel retains.""" + + retained_count: int + """How many notifications the channel keeps for pollers.""" diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 999ad8bba..5368e2f5d 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -63,22 +63,29 @@ AsyncActivityHandle, AsyncActivityIDReference, ) +from ._callback import Callback +from ._channel import ChannelDescription from ._impl import _ClientImpl from ._interceptor import ( CountActivitiesInput, CountNexusOperationsInput, CountWorkflowsInput, CreateScheduleInput, + DescribeChannelInput, GetWorkerBuildIdCompatibilityInput, GetWorkerTaskReachabilityInput, ListActivitiesInput, ListNexusOperationsInput, ListSchedulesInput, ListWorkflowsInput, + NotifyChannelInput, OutboundInterceptor, + PollChannelInput, + RegisterChannelListenerInput, StartActivityInput, StartWorkflowInput, StartWorkflowUpdateWithStartInput, + UnregisterChannelListenerInput, UpdateWithStartUpdateWorkflowInput, UpdateWorkerBuildIdCompatibilityInput, ) @@ -114,6 +121,9 @@ from ._interceptor import Interceptor from ._plugin import Plugin +DEFAULT_CHANNEL_POLL_WAIT = timedelta(seconds=30) +"""How long :py:meth:`Client.poll_channel` waits for a notification by default.""" + class Client: """Client for accessing Temporal. @@ -2845,6 +2855,187 @@ async def get_worker_task_reachability( ) ) + async def notify_channel( + self, + channel: str, + *, + position: bytes = b"", + counter: int = 0, + metadata: Mapping[str, Any] | None = None, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> int: + """Notify the listeners of ``channel`` that a source they consume has moved. + + A workflow listening with :py:func:`temporalio.workflow.subscribe_channel` + runs a Workflow Task that carries the notification. The server folds + notifications per listener while one is pending, keeping the one with + the highest ``counter``, so a burst of writes costs a listener one task. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + position: Where the source stands after the write, in the writer's + own terms. Opaque to the server. + counter: Orders notifications from this channel's writers. Derive it + from ``position``, since only the source can order its positions. + metadata: Details for the listener, such as which topic moved. Each + value is encoded with the client's data converter. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + + Returns: + How many listeners the channel had when the notification arrived. + """ + return await self._impl.notify_channel( + NotifyChannelInput( + channel=channel, + position=position, + counter=counter, + metadata=metadata, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + ) + ) + + async def poll_channel( + self, + channel: str, + *, + after_counter: int = 0, + wait: bool | timedelta = True, + max_notifications: int = 100, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> list[temporalio.workflow.Notification]: + """Read the notifications ``channel`` retains above a counter. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + after_counter: Only notifications with a counter above this one are + returned. Pass the highest counter seen so far to page. + wait: How long the server holds the call when nothing is retained + above ``after_counter``. ``True`` waits up to + :py:data:`DEFAULT_CHANNEL_POLL_WAIT`, ``False`` returns at once. + max_notifications: Upper bound on the notifications returned. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + + Returns: + The notifications, oldest first. Empty when the wait ran out. + """ + if wait is True: + wait_for: timedelta | None = DEFAULT_CHANNEL_POLL_WAIT + elif wait is False: + wait_for = None + else: + wait_for = wait + return await self._impl.poll_channel( + PollChannelInput( + channel=channel, + after_counter=after_counter, + wait=wait_for, + max_notifications=max_notifications, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + ) + ) + + async def describe_channel( + self, + channel: str, + *, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> ChannelDescription: + """Describe ``channel``: its listeners and what it retains. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + """ + return await self._impl.describe_channel( + DescribeChannelInput( + channel=channel, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout + ) + ) + + async def register_channel_listener( + self, + channel: str, + callback: Callback, + *, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> str: + """Register ``callback`` as a listener of ``channel``. + + The server invokes the callback with each notification on the channel + until :py:meth:`unregister_channel_listener` removes it. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + callback: The callback to invoke. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + + Returns: + The listener id the server assigned. + """ + return await self._impl.register_channel_listener( + RegisterChannelListenerInput( + channel=channel, + callback=callback, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + ) + ) + + async def unregister_channel_listener( + self, + channel: str, + listener_id: str, + *, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> None: + """Remove a listener from ``channel``. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + listener_id: The id :py:meth:`register_channel_listener` returned. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + """ + await self._impl.unregister_channel_listener( + UnregisterChannelListenerInput( + channel=channel, + listener_id=listener_id, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + ) + ) + def create_nexus_client( self, service: type[NexusServiceType] | str, diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index abe3f8c09..36ea327e7 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -23,6 +23,7 @@ import temporalio.api.enums.v1 import temporalio.api.errordetails.v1 import temporalio.api.failure.v1 +import temporalio.api.notification.v1 import temporalio.api.schedule.v1 import temporalio.api.taskqueue.v1 import temporalio.api.update.v1 @@ -32,6 +33,7 @@ import temporalio.exceptions import temporalio.nexus import temporalio.nexus._operation_context +import temporalio.workflow from temporalio.activity import ActivityCancellationDetails from temporalio.converter import ( ActivitySerializationContext, @@ -54,6 +56,7 @@ ActivityHandle, AsyncActivityIDReference, ) +from ._channel import ChannelDescription, ChannelListener from ._exceptions import ( AsyncActivityCancelledError, ScheduleAlreadyRunningError, @@ -74,6 +77,7 @@ CreateScheduleInput, DeleteScheduleInput, DescribeActivityInput, + DescribeChannelInput, DescribeNexusOperationInput, DescribeScheduleInput, DescribeWorkflowInput, @@ -87,10 +91,13 @@ ListNexusOperationsInput, ListSchedulesInput, ListWorkflowsInput, + NotifyChannelInput, OutboundInterceptor, PauseActivityInput, PauseScheduleInput, + PollChannelInput, QueryWorkflowInput, + RegisterChannelListenerInput, ReportCancellationAsyncActivityInput, SignalWorkflowInput, StartActivityInput, @@ -104,6 +111,7 @@ TriggerScheduleInput, UnpauseActivityInput, UnpauseScheduleInput, + UnregisterChannelListenerInput, UpdateActivityOptionsInput, UpdateScheduleInput, UpdateWithStartStartWorkflowInput, @@ -1764,6 +1772,120 @@ async def count_nexus_operations( ) ) + ### Notification channel calls + + async def notify_channel(self, input: NotifyChannelInput) -> int: + notification = temporalio.api.notification.v1.Notification( + channel=input.channel, position=input.position, counter=input.counter + ) + for key, value in (input.metadata or {}).items(): + [payload] = await self._client.data_converter.encode([value]) + notification.metadata[key].CopyFrom(payload) + resp = await self._client.workflow_service.notify_channel( + temporalio.api.workflowservice.v1.NotifyChannelRequest( + namespace=self._client.namespace, + notification=notification, + identity=self._client.identity, + request_id=str(uuid.uuid4()), + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, + ) + return resp.listener_count + + async def poll_channel( + self, input: PollChannelInput + ) -> list[temporalio.workflow.Notification]: + req = temporalio.api.workflowservice.v1.PollChannelRequest( + namespace=self._client.namespace, + channel=input.channel, + after_counter=input.after_counter, + max_notifications=input.max_notifications, + ) + if input.wait is not None: + req.wait.FromTimedelta(input.wait) + resp = await self._client.workflow_service.poll_channel( + req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout + ) + return [await self._notification_from_proto(n) for n in resp.notifications] + + async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescription: + resp = await self._client.workflow_service.describe_channel( + temporalio.api.workflowservice.v1.DescribeChannelRequest( + namespace=self._client.namespace, channel=input.channel + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, + ) + return ChannelDescription( + listeners=[ + ChannelListener._from_proto(listener) for listener in resp.listeners + ], + latest=( + await self._notification_from_proto(resp.latest) + if resp.HasField("latest") + else None + ), + retained_count=resp.retained_count, + ) + + async def register_channel_listener( + self, input: RegisterChannelListenerInput + ) -> str: + resp = await self._client.workflow_service.register_channel_listener( + temporalio.api.workflowservice.v1.RegisterChannelListenerRequest( + namespace=self._client.namespace, + channel=input.channel, + callback=temporalio.api.common.v1.Callback( + nexus=temporalio.api.common.v1.Callback.Nexus( + url=input.callback.url, header=input.callback.headers + ) + ), + request_id=str(uuid.uuid4()), + identity=self._client.identity, + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, + ) + return resp.listener_id + + async def unregister_channel_listener( + self, input: UnregisterChannelListenerInput + ) -> None: + await self._client.workflow_service.unregister_channel_listener( + temporalio.api.workflowservice.v1.UnregisterChannelListenerRequest( + namespace=self._client.namespace, + channel=input.channel, + listener_id=input.listener_id, + identity=self._client.identity, + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, + ) + + async def _notification_from_proto( + self, proto: temporalio.api.notification.v1.Notification + ) -> temporalio.workflow.Notification: + # The worker runs the codec over a workflow's notifications before + # they reach workflow code. The client does the same here, so both + # sides hand out payloads a converter can read. + metadata = dict(proto.metadata.items()) + codec = self._client.data_converter.payload_codec + if codec and metadata: + keys = list(metadata) + decoded = await codec.decode([metadata[k] for k in keys]) + metadata = dict(zip(keys, decoded)) + return temporalio.workflow.Notification( + channel=proto.channel, + position=proto.position, + counter=proto.counter, + metadata=metadata, + ) + async def _apply_headers( self, source: Mapping[str, temporalio.api.common.v1.Payload] | None, diff --git a/temporalio/client/_interceptor.py b/temporalio/client/_interceptor.py index 68077ebc9..b08246f2b 100644 --- a/temporalio/client/_interceptor.py +++ b/temporalio/client/_interceptor.py @@ -21,6 +21,8 @@ from temporalio.converter import DataConverter if TYPE_CHECKING: + import temporalio.workflow + from ._activity import ( ActivityExecutionAsyncIterator, ActivityExecutionCount, @@ -30,6 +32,8 @@ ActivityOptionsUpdate, AsyncActivityIDReference, ) + from ._callback import Callback + from ._channel import ChannelDescription from ._nexus import ( NexusOperationExecutionAsyncIterator, NexusOperationExecutionCount, @@ -698,6 +702,79 @@ class CountNexusOperationsInput: rpc_timeout: timedelta | None +@dataclass +class NotifyChannelInput: + """Input for :py:meth:`OutboundInterceptor.notify_channel`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + position: bytes + counter: int + metadata: Mapping[str, Any] | None + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + +@dataclass +class PollChannelInput: + """Input for :py:meth:`OutboundInterceptor.poll_channel`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + after_counter: int + wait: timedelta | None + max_notifications: int + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + +@dataclass +class DescribeChannelInput: + """Input for :py:meth:`OutboundInterceptor.describe_channel`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + +@dataclass +class RegisterChannelListenerInput: + """Input for :py:meth:`OutboundInterceptor.register_channel_listener`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + callback: Callback + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + +@dataclass +class UnregisterChannelListenerInput: + """Input for :py:meth:`OutboundInterceptor.unregister_channel_listener`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + listener_id: str + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + @dataclass class Interceptor: """Interceptor for clients. @@ -1001,3 +1078,51 @@ async def count_nexus_operations( This API is experimental and unstable. """ return await self.next.count_nexus_operations(input) + + ### Notification channel calls + + async def notify_channel(self, input: NotifyChannelInput) -> int: + """Called for every :py:meth:`Client.notify_channel` call. + + .. warning:: + This API is experimental and unstable. + """ + return await self.next.notify_channel(input) + + async def poll_channel( + self, input: PollChannelInput + ) -> list[temporalio.workflow.Notification]: + """Called for every :py:meth:`Client.poll_channel` call. + + .. warning:: + This API is experimental and unstable. + """ + return await self.next.poll_channel(input) + + async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescription: + """Called for every :py:meth:`Client.describe_channel` call. + + .. warning:: + This API is experimental and unstable. + """ + return await self.next.describe_channel(input) + + async def register_channel_listener( + self, input: RegisterChannelListenerInput + ) -> str: + """Called for every :py:meth:`Client.register_channel_listener` call. + + .. warning:: + This API is experimental and unstable. + """ + return await self.next.register_channel_listener(input) + + async def unregister_channel_listener( + self, input: UnregisterChannelListenerInput + ) -> None: + """Called for every :py:meth:`Client.unregister_channel_listener` call. + + .. warning:: + This API is experimental and unstable. + """ + await self.next.unregister_channel_listener(input) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index b8a152f20..a476d8f0c 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -1,5 +1,7 @@ import pytest +_ENVIRONMENTS_WITHOUT_CHANNELS = ("local", "time-skipping", "envconfig") + def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( @@ -15,3 +17,24 @@ def pytest_configure(config: pytest.Config) -> None: "markers", "truncates: the case needs a way to drop a topic's oldest records", ) + config.addinivalue_line( + "markers", + "needs_channel_server: the case needs a server that serves notification " + "channels, named with -E host:port", + ) + + +def pytest_collection_modifyitems( + config: pytest.Config, items: list[pytest.Item] +) -> None: + # The dev server the suite starts for itself does not accept the + # subscribe command, so the live channel cases run only against a server + # the caller points at. + if config.getoption("--workflow-environment") not in _ENVIRONMENTS_WITHOUT_CHANNELS: + return + skip = pytest.mark.skip( + reason="needs a server that serves notification channels; name one with -E" + ) + for item in items: + if item.get_closest_marker("needs_channel_server"): + item.add_marker(skip) diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index a8b6a6d26..64965c789 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -2,14 +2,18 @@ The workflow instance is driven with activations directly, the way Core drives it, because the dev server this chain tests against does not accept -the subscribe command. +the subscribe command. The live cases at the end need a server that does and +skip otherwise. """ from __future__ import annotations +import uuid from datetime import datetime, timedelta, timezone from typing import Any +import pytest + import temporalio.api.common.v1 import temporalio.api.notification.v1 import temporalio.bridge.proto.workflow_activation @@ -17,11 +21,13 @@ import temporalio.common import temporalio.converter from temporalio import workflow +from temporalio.client import Callback, Client from temporalio.worker._workflow_instance import ( UnsandboxedWorkflowRunner, WorkflowInstance, WorkflowInstanceDetails, ) +from tests.helpers import assert_eventually, new_worker WorkflowActivation = temporalio.bridge.proto.workflow_activation.WorkflowActivation WorkflowActivationJob = ( @@ -222,3 +228,50 @@ async def test_an_empty_channel_name_is_refused(): completion = _instance(EmptyChannel).activate(_start(EmptyChannel)) assert completion.HasField("failed") assert "channel must not be empty" in completion.failed.failure.message + + +@pytest.mark.needs_channel_server +async def test_a_workflow_receives_a_client_notification(client: Client): + channel = f"orders-{uuid.uuid4()}" + async with new_worker(client, ReceiveOne) as worker: + handle = await client.start_workflow( + ReceiveOne.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + + async def listening() -> None: + description = await client.describe_channel(channel) + assert [listener.workflow_id for listener in description.listeners] == [ + handle.id + ] + + await assert_eventually(listening) + listeners = await client.notify_channel( + channel, position=b"1-0", counter=1, metadata={"topic": "inputs"} + ) + assert listeners == 1 + assert await handle.result() == { + "channel": channel, + "counter": 1, + "position": "1-0", + "topic": "inputs", + } + polled = await client.poll_channel(channel, wait=False) + assert [n.counter for n in polled] == [1] + description = await client.describe_channel(channel) + assert description.latest is not None and description.latest.counter == 1 + + +@pytest.mark.needs_channel_server +async def test_a_callback_listener_registers_and_unregisters(client: Client): + channel = f"orders-{uuid.uuid4()}" + callback = Callback(url="http://localhost:1/never-called", headers={}) + listener_id = await client.register_channel_listener(channel, callback) + description = await client.describe_channel(channel) + assert [listener.listener_id for listener in description.listeners] == [listener_id] + assert description.listeners[0].callback == callback + await client.unregister_channel_listener(channel, listener_id) + description = await client.describe_channel(channel) + assert description.listeners == [] From f8a99a9c0603b2db96f60c99c469d198f0830507 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:11:31 -0700 Subject: [PATCH 758/831] Made the live channel case fail fast on a Core without the command. A describe that races the subscribe is answered not found, and a worker whose Core refuses the subscribe command leaves the task in a timeout loop that the worker's shutdown waits on. The case now tolerates the first, names the second and bounds the shutdown. --- tests/streams/test_channels.py | 58 ++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index 64965c789..973a12c45 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -8,6 +8,8 @@ from __future__ import annotations +import asyncio +import contextlib import uuid from datetime import datetime, timedelta, timezone from typing import Any @@ -21,7 +23,9 @@ import temporalio.common import temporalio.converter from temporalio import workflow +from temporalio.api.enums.v1 import EventType from temporalio.client import Callback, Client +from temporalio.service import RPCError, RPCStatusCode from temporalio.worker._workflow_instance import ( UnsandboxedWorkflowRunner, WorkflowInstance, @@ -233,16 +237,40 @@ async def test_an_empty_channel_name_is_refused(): @pytest.mark.needs_channel_server async def test_a_workflow_receives_a_client_notification(client: Client): channel = f"orders-{uuid.uuid4()}" - async with new_worker(client, ReceiveOne) as worker: - handle = await client.start_workflow( - ReceiveOne.run, - channel, - id=f"wf-{uuid.uuid4()}", - task_queue=worker.task_queue, - ) + worker = new_worker(client, ReceiveOne) + running = asyncio.create_task(worker.run()) + handle = await client.start_workflow( + ReceiveOne.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + try: + + async def subscribed() -> None: + # The worker's Core has to carry the subscribe command to the + # server. One that refuses it fails every completion, and the task + # times out instead; say so rather than wait on the result forever. + events = [event.event_type async for event in handle.fetch_history_events()] + if EventType.EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT in events: + pytest.fail( + "the worker could not complete the task that subscribes; the Core " + "the bridge pins must carry the subscribe command" + ) + assert ( + EventType.EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED in events + ) + + await assert_eventually(subscribed, timeout=timedelta(seconds=30)) async def listening() -> None: - description = await client.describe_channel(channel) + # The channel exists once the subscribe lands, so a describe that + # races it is answered with not found. + try: + description = await client.describe_channel(channel) + except RPCError as err: + assert err.status != RPCStatusCode.NOT_FOUND, "channel not created yet" + raise assert [listener.workflow_id for listener in description.listeners] == [ handle.id ] @@ -252,7 +280,7 @@ async def listening() -> None: channel, position=b"1-0", counter=1, metadata={"topic": "inputs"} ) assert listeners == 1 - assert await handle.result() == { + assert await asyncio.wait_for(handle.result(), 30) == { "channel": channel, "counter": 1, "position": "1-0", @@ -262,6 +290,18 @@ async def listening() -> None: assert [n.counter for n in polled] == [1] description = await client.describe_channel(channel) assert description.latest is not None and description.latest.counter == 1 + finally: + # A Core that refuses the subscribe command leaves the task in a + # timeout loop and the worker's shutdown waiting on it, so end the run + # first and give the shutdown a bound. + with contextlib.suppress(RPCError): + await handle.terminate() + try: + await asyncio.wait_for(worker.shutdown(), 15) + except asyncio.TimeoutError: + running.cancel() + with contextlib.suppress(asyncio.CancelledError): + await running @pytest.mark.needs_channel_server From 82265749150a289ca9c7d194cb87750a32cd0ff1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:18:06 -0700 Subject: [PATCH 759/831] Skipped the workflow channel case where the pinned Core lacks the command. The protos-only Core refuses the subscribe command, so the case is gated on a conftest constant the native layers flip with their pin. A client-only case covers what the server keeps for pollers: a notify with no listener is retained and answers zero, a counter at or below the latest is not kept, and a bounded poll above the latest comes back empty. --- tests/streams/conftest.py | 41 ++++++++++++++++++++++++++++------ tests/streams/test_channels.py | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index a476d8f0c..8515273bf 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -2,6 +2,11 @@ _ENVIRONMENTS_WITHOUT_CHANNELS = ("local", "time-skipping", "envconfig") +# The Core the bridge pins decides whether a workflow's subscribe command +# reaches the server. The protos-only pin refuses it; the delivery pin that +# the native layers move to handles it. +PINNED_CORE_HANDLES_CHANNEL_COMMAND = False + def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( @@ -22,6 +27,11 @@ def pytest_configure(config: pytest.Config) -> None: "needs_channel_server: the case needs a server that serves notification " "channels, named with -E host:port", ) + config.addinivalue_line( + "markers", + "needs_channel_core: the case needs the pinned Core to handle the " + "subscribe-notification-channel command", + ) def pytest_collection_modifyitems( @@ -30,11 +40,28 @@ def pytest_collection_modifyitems( # The dev server the suite starts for itself does not accept the # subscribe command, so the live channel cases run only against a server # the caller points at. - if config.getoption("--workflow-environment") not in _ENVIRONMENTS_WITHOUT_CHANNELS: - return - skip = pytest.mark.skip( - reason="needs a server that serves notification channels; name one with -E" - ) + skips: list[tuple[str, pytest.MarkDecorator]] = [] + if config.getoption("--workflow-environment") in _ENVIRONMENTS_WITHOUT_CHANNELS: + skips.append( + ( + "needs_channel_server", + pytest.mark.skip( + reason="needs a server that serves notification channels; " + "name one with -E" + ), + ) + ) + if not PINNED_CORE_HANDLES_CHANNEL_COMMAND: + skips.append( + ( + "needs_channel_core", + pytest.mark.skip( + reason="the pinned Core refuses the subscribe command; py-05 " + "pins one that handles it" + ), + ) + ) for item in items: - if item.get_closest_marker("needs_channel_server"): - item.add_marker(skip) + for marker, skip in skips: + if item.get_closest_marker(marker): + item.add_marker(skip) diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index 973a12c45..4521bb1ab 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -235,6 +235,7 @@ async def test_an_empty_channel_name_is_refused(): @pytest.mark.needs_channel_server +@pytest.mark.needs_channel_core async def test_a_workflow_receives_a_client_notification(client: Client): channel = f"orders-{uuid.uuid4()}" worker = new_worker(client, ReceiveOne) @@ -315,3 +316,42 @@ async def test_a_callback_listener_registers_and_unregisters(client: Client): await client.unregister_channel_listener(channel, listener_id) description = await client.describe_channel(channel) assert description.listeners == [] + + +@pytest.mark.needs_channel_server +async def test_a_channel_retains_notifications_for_pollers(client: Client): + channel = f"orders-{uuid.uuid4()}" + # Nobody listens yet: the notification is kept for pollers and the count + # says zero. + assert await client.notify_channel(channel, position=b"2-0", counter=2) == 0 + polled = await client.poll_channel(channel, wait=False) + assert [(n.position, n.counter) for n in polled] == [(b"2-0", 2)] + # At or below the latest counter a notify changes nothing and is not kept. + assert await client.notify_channel(channel, position=b"1-0", counter=1) == 0 + assert await client.notify_channel(channel, position=b"2-0", counter=2) == 0 + description = await client.describe_channel(channel) + assert description.latest is not None and description.latest.counter == 2 + assert description.retained_count == 1 + # Above it the notification is kept, metadata and all, and a poll after + # the earlier counter sees only the new one. + assert ( + await client.notify_channel( + channel, position=b"3-0", counter=3, metadata={"topic": "inputs"} + ) + == 0 + ) + [newest] = await client.poll_channel(channel, after_counter=2, wait=False) + assert newest.counter == 3 + assert ( + client.data_converter.payload_converter.from_payload( + newest.metadata["topic"], str + ) + == "inputs" + ) + polled = await client.poll_channel(channel, wait=False) + assert [n.counter for n in polled] == [2, 3] + # A poll above the latest waits its bound out and comes back empty. + polled = await client.poll_channel( + channel, after_counter=3, wait=timedelta(seconds=1) + ) + assert polled == [] From 7e427c589d77181d0d58c15e50b2d903fdf2c09c Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:25:48 -0700 Subject: [PATCH 760/831] Pinned Core at the channel-round delivery head and regenerated the clients. Core moves to the core-3 commit that carries the subscribe-notification-channel command machine and the NotificationsReceived job folded from the task's scheduled events. The vendored tree and the payload visitor regenerate from the pin, and the live workflow channel case now runs on this layer. --- temporalio/api/enums/v1/failed_cause_pb2.py | 31 +- temporalio/api/history/v1/message_pb2.py | 220 ++-- .../v1/request_response_pb2.py | 1173 +++++++++-------- .../v1/request_response_pb2.pyi | 74 ++ temporalio/bridge/_visitor.py | 28 + .../workflow_activation_pb2.py | 130 +- .../workflow_activation_pb2.pyi | 103 +- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 169 ++- .../workflow_commands_pb2.pyi | 141 +- temporalio/bridge/sdk-core | 2 +- tests/streams/conftest.py | 2 +- 12 files changed, 1229 insertions(+), 848 deletions(-) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 9c1970298..0ec7fc3f2 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,11 +16,13 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x9c\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x9c\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,*\xf3\x01\n\x17\x41\x63tivityTaskFailedCause\x12*\n&ACTIVITY_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x31\n-ACTIVITY_TASK_FAILED_CAUSE_PAYLOADS_TOO_LARGE\x10\x01\x12\x37\n3ACTIVITY_TASK_FAILED_CAUSE_EXTERNAL_STORAGE_FAILURE\x10\x02\x12@\n\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xdd\x42\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xdd\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12=\n\x05\x63\x61use\x18\x07 \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xdd\x42\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -1291,117 +1291,117 @@ _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7663 _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7895 _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7898 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8184 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8187 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8385 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8387 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8501 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8504 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8778 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8781 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8928 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8930 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 9001 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 9004 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9138 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9141 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9340 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9343 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9478 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9481 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9842 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9762 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9842 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9845 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10164 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10167 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10296 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10299 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8247 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8250 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8448 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8450 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8564 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8567 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8841 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8844 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8991 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8993 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 9064 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 9067 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9201 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9204 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9403 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9406 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9541 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9544 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9905 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9825 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9905 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9908 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10227 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10230 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10359 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10362 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10583 + 10646 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10586 + 10649 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10932 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10935 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11132 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11135 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11514 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11517 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11856 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11859 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12070 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12073 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12231 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12234 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12372 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12375 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13651 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13654 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13996 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13999 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14294 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14297 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14622 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14625 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 15004 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 15007 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15332 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15335 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15665 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15668 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15944 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15947 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16677 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16527 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16677 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16680 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17000 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 17003 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17147 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17273 - _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17275 - _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17388 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17391 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17538 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17541 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17761 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17764 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17934 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17937 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18208 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18211 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18375 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18377 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18471 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18473 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18569 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18572 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18769 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18772 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19336 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19286 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19336 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19339 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19476 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19479 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19616 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19619 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19755 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19758 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19896 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19899 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20037 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20039 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20155 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20158 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20309 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20312 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20511 - _HISTORYEVENT._serialized_start = 20514 - _HISTORYEVENT._serialized_end = 29055 - _HISTORY._serialized_start = 29057 - _HISTORY._serialized_end = 29121 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10995 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10998 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11195 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11198 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11577 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11580 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11919 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11922 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12133 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12136 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12294 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12297 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12435 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12438 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13714 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13717 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14059 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 14062 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14357 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14360 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14685 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14688 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 15067 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 15070 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15395 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15398 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15728 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15731 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 16007 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 16010 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16740 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16590 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16740 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16743 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17063 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 17066 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17210 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17212 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17336 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17338 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17451 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17454 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17601 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17604 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17824 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17827 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17997 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 18000 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18271 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18274 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18438 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18440 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18534 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18536 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18632 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18635 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18832 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18835 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19399 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19349 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19399 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19402 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19539 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19542 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19679 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19682 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19818 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19821 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19959 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19962 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20100 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20102 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20218 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20221 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20372 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20375 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20574 + _HISTORYEVENT._serialized_start = 20577 + _HISTORYEVENT._serialized_end = 29118 + _HISTORY._serialized_start = 29120 + _HISTORY._serialized_end = 29184 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index a2a505cfe..fa3871af4 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.nexusoperation.v1 import ( + message_pb2 as temporal_dot_api_dot_nexusoperation_dot_v1_dot_message__pb2, +) from temporalio.api.notification.v1 import ( message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, ) @@ -137,7 +140,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\x91\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\x9e\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"m\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"#\n!UnregisterChannelListenerResponse"\x93\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"<\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\xaf\x01\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\x91\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\x9e\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"m\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"#\n!UnregisterChannelListenerResponse"\x93\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"<\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\xaf\x01\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4376,602 +4379,602 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1728 - _REGISTERNAMESPACEREQUEST._serialized_end = 2376 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2333 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2376 - _REGISTERNAMESPACERESPONSE._serialized_start = 2378 - _REGISTERNAMESPACERESPONSE._serialized_end = 2405 - _LISTNAMESPACESREQUEST._serialized_start = 2408 - _LISTNAMESPACESREQUEST._serialized_end = 2545 - _LISTNAMESPACESRESPONSE._serialized_start = 2548 - _LISTNAMESPACESRESPONSE._serialized_end = 2677 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2679 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2762 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2765 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3278 - _UPDATENAMESPACEREQUEST._serialized_start = 3281 - _UPDATENAMESPACEREQUEST._serialized_end = 3616 - _UPDATENAMESPACERESPONSE._serialized_start = 3619 - _UPDATENAMESPACERESPONSE._serialized_end = 3910 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3912 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3982 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3984 - _DEPRECATENAMESPACERESPONSE._serialized_end = 4012 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4015 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5632 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5635 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5933 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5936 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6234 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6237 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6423 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6426 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6602 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6604 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6724 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8364 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8280 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8364 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8367 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9705 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9539 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9634 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9636 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9705 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9708 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9953 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9956 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10481 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10483 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10518 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10521 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11007 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11010 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12191 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12194 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12359 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12361 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12473 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12476 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12683 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12685 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12801 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12804 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13186 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13188 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13226 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13229 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13436 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13438 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13480 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13483 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13929 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13931 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14018 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14021 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14292 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14294 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14385 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14388 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14770 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14772 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14809 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14812 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15100 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15102 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15143 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15146 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15406 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15408 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15448 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15451 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15801 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15803 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15880 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15883 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16067 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16069 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16132 - _NOTIFYCHANNELREQUEST._serialized_start = 16135 - _NOTIFYCHANNELREQUEST._serialized_end = 16280 - _NOTIFYCHANNELRESPONSE._serialized_start = 16282 - _NOTIFYCHANNELRESPONSE._serialized_end = 16329 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16332 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16490 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16492 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16546 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16548 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16657 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16659 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16694 - _POLLCHANNELREQUEST._serialized_start = 16697 - _POLLCHANNELREQUEST._serialized_end = 16844 - _POLLCHANNELRESPONSE._serialized_start = 16846 - _POLLCHANNELRESPONSE._serialized_end = 16934 - _DESCRIBECHANNELREQUEST._serialized_start = 16936 - _DESCRIBECHANNELREQUEST._serialized_end = 16996 - _DESCRIBECHANNELRESPONSE._serialized_start = 16999 - _DESCRIBECHANNELRESPONSE._serialized_end = 17174 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17177 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18516 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18519 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18677 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18680 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19129 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19131 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19179 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19182 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19469 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19471 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19507 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19509 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19631 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19633 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19666 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19669 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 19998 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20001 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20131 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20134 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20528 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20531 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20663 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20665 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20774 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20776 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20902 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20904 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21021 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21024 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21158 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21160 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21269 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21271 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21397 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21399 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21465 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21468 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21705 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21707 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21735 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21738 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 21939 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 21855 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 21939 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 21942 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22303 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22305 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22340 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22342 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22452 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22454 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22484 - _SHUTDOWNWORKERREQUEST._serialized_start = 22487 - _SHUTDOWNWORKERREQUEST._serialized_end = 22770 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22772 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22796 - _QUERYWORKFLOWREQUEST._serialized_start = 22799 - _QUERYWORKFLOWREQUEST._serialized_end = 23032 - _QUERYWORKFLOWRESPONSE._serialized_start = 23035 - _QUERYWORKFLOWRESPONSE._serialized_end = 23220 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23222 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23337 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23340 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24005 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24008 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24536 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24539 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25543 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25325 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25441 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25443 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25543 - _GETCLUSTERINFOREQUEST._serialized_start = 25545 - _GETCLUSTERINFOREQUEST._serialized_end = 25568 - _GETCLUSTERINFORESPONSE._serialized_start = 25571 - _GETCLUSTERINFORESPONSE._serialized_end = 26036 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 25981 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26036 - _GETSYSTEMINFOREQUEST._serialized_start = 26038 - _GETSYSTEMINFOREQUEST._serialized_end = 26060 - _GETSYSTEMINFORESPONSE._serialized_start = 26063 - _GETSYSTEMINFORESPONSE._serialized_end = 26640 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26204 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26640 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26642 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26751 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26754 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 26977 - _CREATESCHEDULEREQUEST._serialized_start = 26980 - _CREATESCHEDULEREQUEST._serialized_end = 27312 - _CREATESCHEDULERESPONSE._serialized_start = 27314 - _CREATESCHEDULERESPONSE._serialized_end = 27362 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27364 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27429 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27432 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27703 - _UPDATESCHEDULEREQUEST._serialized_start = 27706 - _UPDATESCHEDULEREQUEST._serialized_end = 27998 - _UPDATESCHEDULERESPONSE._serialized_start = 28000 - _UPDATESCHEDULERESPONSE._serialized_end = 28024 - _PATCHSCHEDULEREQUEST._serialized_start = 28027 - _PATCHSCHEDULEREQUEST._serialized_end = 28183 - _PATCHSCHEDULERESPONSE._serialized_start = 28185 - _PATCHSCHEDULERESPONSE._serialized_end = 28208 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28211 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28379 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28381 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28464 - _DELETESCHEDULEREQUEST._serialized_start = 28466 - _DELETESCHEDULEREQUEST._serialized_end = 28547 - _DELETESCHEDULERESPONSE._serialized_start = 28549 - _DELETESCHEDULERESPONSE._serialized_end = 28573 - _LISTSCHEDULESREQUEST._serialized_start = 28575 - _LISTSCHEDULESREQUEST._serialized_end = 28683 - _LISTSCHEDULESRESPONSE._serialized_start = 28685 - _LISTSCHEDULESRESPONSE._serialized_end = 28797 - _COUNTSCHEDULESREQUEST._serialized_start = 28799 - _COUNTSCHEDULESREQUEST._serialized_end = 28856 - _COUNTSCHEDULESRESPONSE._serialized_start = 28859 - _COUNTSCHEDULESRESPONSE._serialized_end = 29078 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29081 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29727 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29528 + _REGISTERNAMESPACEREQUEST._serialized_start = 1774 + _REGISTERNAMESPACEREQUEST._serialized_end = 2422 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2379 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2422 + _REGISTERNAMESPACERESPONSE._serialized_start = 2424 + _REGISTERNAMESPACERESPONSE._serialized_end = 2451 + _LISTNAMESPACESREQUEST._serialized_start = 2454 + _LISTNAMESPACESREQUEST._serialized_end = 2591 + _LISTNAMESPACESRESPONSE._serialized_start = 2594 + _LISTNAMESPACESRESPONSE._serialized_end = 2723 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2725 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2808 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2811 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3324 + _UPDATENAMESPACEREQUEST._serialized_start = 3327 + _UPDATENAMESPACEREQUEST._serialized_end = 3662 + _UPDATENAMESPACERESPONSE._serialized_start = 3665 + _UPDATENAMESPACERESPONSE._serialized_end = 3956 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3958 + _DEPRECATENAMESPACEREQUEST._serialized_end = 4028 + _DEPRECATENAMESPACERESPONSE._serialized_start = 4030 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4058 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4061 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5678 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5681 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5979 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5982 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6280 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6283 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6469 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6472 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6648 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6650 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6770 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6773 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7213 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7216 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8410 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8326 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8410 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8413 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9751 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9585 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9680 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9682 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9751 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9754 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9999 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 10002 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10527 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10529 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10564 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10567 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11053 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11056 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12237 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12240 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12405 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12407 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12519 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12522 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12729 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12731 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12847 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12850 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13232 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13234 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13272 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13275 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13482 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13484 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13526 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13529 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 14038 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 14040 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14127 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14130 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14464 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14466 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14557 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14560 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14942 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14944 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14981 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14984 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15272 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15274 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15315 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15318 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15578 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15580 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15620 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15623 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15973 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15975 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 16052 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 16055 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16239 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16241 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16304 + _NOTIFYCHANNELREQUEST._serialized_start = 16307 + _NOTIFYCHANNELREQUEST._serialized_end = 16452 + _NOTIFYCHANNELRESPONSE._serialized_start = 16454 + _NOTIFYCHANNELRESPONSE._serialized_end = 16501 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16504 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16662 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16664 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16718 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16720 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16829 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16831 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16866 + _POLLCHANNELREQUEST._serialized_start = 16869 + _POLLCHANNELREQUEST._serialized_end = 17016 + _POLLCHANNELRESPONSE._serialized_start = 17018 + _POLLCHANNELRESPONSE._serialized_end = 17106 + _DESCRIBECHANNELREQUEST._serialized_start = 17108 + _DESCRIBECHANNELREQUEST._serialized_end = 17168 + _DESCRIBECHANNELRESPONSE._serialized_start = 17171 + _DESCRIBECHANNELRESPONSE._serialized_end = 17346 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17349 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18688 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18691 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18849 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18852 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19301 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19303 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19351 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19354 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19641 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19643 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19679 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19681 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19803 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19805 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19838 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19841 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20170 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20173 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20303 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20306 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20700 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20703 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20835 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20837 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20946 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20948 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21074 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21076 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21193 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21196 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21330 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21332 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21441 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21443 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21569 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21571 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21637 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21640 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21877 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21789 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21877 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21879 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21907 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21910 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22111 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22027 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22111 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22114 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22475 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22477 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22512 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22514 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22624 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22626 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22656 + _SHUTDOWNWORKERREQUEST._serialized_start = 22659 + _SHUTDOWNWORKERREQUEST._serialized_end = 22942 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22944 + _SHUTDOWNWORKERRESPONSE._serialized_end = 22968 + _QUERYWORKFLOWREQUEST._serialized_start = 22971 + _QUERYWORKFLOWREQUEST._serialized_end = 23204 + _QUERYWORKFLOWRESPONSE._serialized_start = 23207 + _QUERYWORKFLOWRESPONSE._serialized_end = 23392 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23394 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23509 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23512 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24177 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24180 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24708 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24711 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25715 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25395 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25495 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25497 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25613 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25615 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25715 + _GETCLUSTERINFOREQUEST._serialized_start = 25717 + _GETCLUSTERINFOREQUEST._serialized_end = 25740 + _GETCLUSTERINFORESPONSE._serialized_start = 25743 + _GETCLUSTERINFORESPONSE._serialized_end = 26208 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26153 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26208 + _GETSYSTEMINFOREQUEST._serialized_start = 26210 + _GETSYSTEMINFOREQUEST._serialized_end = 26232 + _GETSYSTEMINFORESPONSE._serialized_start = 26235 + _GETSYSTEMINFORESPONSE._serialized_end = 26812 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26376 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26812 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26814 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26923 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26926 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27149 + _CREATESCHEDULEREQUEST._serialized_start = 27152 + _CREATESCHEDULEREQUEST._serialized_end = 27484 + _CREATESCHEDULERESPONSE._serialized_start = 27486 + _CREATESCHEDULERESPONSE._serialized_end = 27534 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27536 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27601 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27604 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27875 + _UPDATESCHEDULEREQUEST._serialized_start = 27878 + _UPDATESCHEDULEREQUEST._serialized_end = 28170 + _UPDATESCHEDULERESPONSE._serialized_start = 28172 + _UPDATESCHEDULERESPONSE._serialized_end = 28196 + _PATCHSCHEDULEREQUEST._serialized_start = 28199 + _PATCHSCHEDULEREQUEST._serialized_end = 28355 + _PATCHSCHEDULERESPONSE._serialized_start = 28357 + _PATCHSCHEDULERESPONSE._serialized_end = 28380 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28383 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28551 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28553 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28636 + _DELETESCHEDULEREQUEST._serialized_start = 28638 + _DELETESCHEDULEREQUEST._serialized_end = 28719 + _DELETESCHEDULERESPONSE._serialized_start = 28721 + _DELETESCHEDULERESPONSE._serialized_end = 28745 + _LISTSCHEDULESREQUEST._serialized_start = 28747 + _LISTSCHEDULESREQUEST._serialized_end = 28855 + _LISTSCHEDULESRESPONSE._serialized_start = 28857 + _LISTSCHEDULESRESPONSE._serialized_end = 28969 + _COUNTSCHEDULESREQUEST._serialized_start = 28971 + _COUNTSCHEDULESREQUEST._serialized_end = 29028 + _COUNTSCHEDULESRESPONSE._serialized_start = 29031 + _COUNTSCHEDULESRESPONSE._serialized_end = 29250 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21789 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21877 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29253 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29899 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29700 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29639 + 29811 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29641 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29714 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29729 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29793 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29795 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29890 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29892 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30008 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30011 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31728 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31063 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29813 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29886 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29901 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29965 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29967 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30062 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30064 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30180 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30183 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31900 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31235 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31176 + 31348 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31179 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31351 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31308 + 31480 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31310 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31482 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31374 + 31546 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31376 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31482 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31484 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31594 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31596 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31658 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31660 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31715 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31731 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 31983 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 31985 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32057 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32060 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32309 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32312 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32468 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32470 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32584 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32587 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 32848 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 32851 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33110 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33113 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34479 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34481 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34510 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34512 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34608 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34610 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34638 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34640 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34706 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34709 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35181 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35183 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35274 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35276 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35397 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35400 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35585 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35588 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35807 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35810 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36226 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36229 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36583 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36586 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36753 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36755 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36790 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36793 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37013 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37015 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37047 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37050 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37422 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37216 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37422 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37425 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37757 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37551 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37757 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37760 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38096 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38099 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38418 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38420 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38520 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38522 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38631 - _PAUSEACTIVITYREQUEST._serialized_start = 38634 - _PAUSEACTIVITYREQUEST._serialized_end = 38833 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38836 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39019 - _PAUSEACTIVITYRESPONSE._serialized_start = 39021 - _PAUSEACTIVITYRESPONSE._serialized_end = 39044 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39046 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39078 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39081 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39361 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39364 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39637 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39639 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39664 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39666 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39700 - _RESETACTIVITYREQUEST._serialized_start = 39703 - _RESETACTIVITYREQUEST._serialized_end = 40010 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40013 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40303 - _RESETACTIVITYRESPONSE._serialized_start = 40305 - _RESETACTIVITYRESPONSE._serialized_end = 40328 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40330 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40362 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40365 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40649 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40652 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 40829 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 40831 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 40937 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 40939 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41036 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41039 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41233 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41236 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 41888 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41497 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 41888 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 41890 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 41967 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 41970 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42110 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42112 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42220 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42222 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42341 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42344 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42549 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42552 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42737 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42740 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 42969 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 42972 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43163 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43166 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43415 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43418 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43642 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43644 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43757 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43759 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43815 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43817 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 43910 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 43913 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44584 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44088 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44584 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44587 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44827 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 44829 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44868 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44871 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45071 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45073 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45112 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45114 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45207 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45209 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45241 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45244 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45760 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45762 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45814 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45817 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46317 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46319 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46373 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46376 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46794 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46709 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31548 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31654 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31656 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31766 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31768 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31830 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31832 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31887 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31903 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32155 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32157 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32229 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32232 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32481 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32484 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32640 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32642 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32756 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32759 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33020 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33023 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33282 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33285 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34651 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34653 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34682 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34684 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34780 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34782 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34810 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34812 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34878 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34881 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35353 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35355 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35446 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35448 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35569 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35572 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35757 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35760 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35979 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35982 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36398 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36401 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36755 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36758 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36925 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36927 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36962 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36965 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37185 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37187 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37219 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37222 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37594 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37388 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37594 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37597 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37929 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37723 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37929 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37932 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38268 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38271 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38590 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38592 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38692 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38694 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38803 + _PAUSEACTIVITYREQUEST._serialized_start = 38806 + _PAUSEACTIVITYREQUEST._serialized_end = 39005 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39008 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39191 + _PAUSEACTIVITYRESPONSE._serialized_start = 39193 + _PAUSEACTIVITYRESPONSE._serialized_end = 39216 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39218 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39250 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39253 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39533 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39536 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39809 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39811 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39836 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39838 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39872 + _RESETACTIVITYREQUEST._serialized_start = 39875 + _RESETACTIVITYREQUEST._serialized_end = 40182 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40185 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40475 + _RESETACTIVITYRESPONSE._serialized_start = 40477 + _RESETACTIVITYRESPONSE._serialized_end = 40500 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40502 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40534 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40537 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40821 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40824 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41001 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41003 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41109 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41111 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41208 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41211 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41405 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41408 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42060 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41669 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42060 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25395 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25495 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42062 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42139 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42142 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42282 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42284 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42392 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42394 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42513 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42516 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42721 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42724 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42909 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42912 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43141 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43144 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43335 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43338 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43587 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43590 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43814 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43816 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43929 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43931 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43987 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43989 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44082 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44085 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44756 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44260 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44756 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44759 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44999 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45001 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45040 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45043 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45243 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45245 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45284 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45286 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45379 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45381 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45413 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45416 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45932 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45809 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45932 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45934 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45986 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45989 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46489 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45809 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45932 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46491 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46545 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46548 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46966 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46881 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 46794 + 46966 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46796 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 46906 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 46909 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47098 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47100 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47199 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47201 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47270 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47272 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47379 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47381 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47494 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47497 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47724 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47727 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 47907 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 47909 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48004 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48006 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48071 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48073 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48154 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48156 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48219 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48221 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48249 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48251 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48321 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48323 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48427 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48430 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48636 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48638 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48684 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48687 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 48842 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 48844 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 48875 - _LISTWORKERSREQUEST._serialized_start = 48878 - _LISTWORKERSREQUEST._serialized_end = 49008 - _LISTWORKERSRESPONSE._serialized_start = 49011 - _LISTWORKERSRESPONSE._serialized_end = 49176 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49179 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 49904 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49746 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 49837 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46968 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47078 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47081 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47270 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47272 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47371 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47373 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47442 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47444 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47551 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47553 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47666 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47669 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47896 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47899 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48079 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48081 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48176 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48178 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48243 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48245 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48326 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48328 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48391 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48393 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48421 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48423 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48493 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48495 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48599 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48602 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48808 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48810 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48856 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48859 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49014 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49016 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49047 + _LISTWORKERSREQUEST._serialized_start = 49050 + _LISTWORKERSREQUEST._serialized_end = 49180 + _LISTWORKERSRESPONSE._serialized_start = 49183 + _LISTWORKERSRESPONSE._serialized_end = 49348 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49351 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50076 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49918 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50009 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 49839 + 50011 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 49904 + 50076 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 49906 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 49997 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50000 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50158 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50160 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50245 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50248 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50514 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50516 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50616 - _DESCRIBEWORKERREQUEST._serialized_start = 50618 - _DESCRIBEWORKERREQUEST._serialized_end = 50689 - _DESCRIBEWORKERRESPONSE._serialized_start = 50691 - _DESCRIBEWORKERRESPONSE._serialized_end = 50772 - _COUNTWORKERSREQUEST._serialized_start = 50774 - _COUNTWORKERSREQUEST._serialized_end = 50861 - _COUNTWORKERSRESPONSE._serialized_start = 50863 - _COUNTWORKERSRESPONSE._serialized_end = 50900 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 50903 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51044 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51046 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51078 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51081 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51224 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51226 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51260 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51263 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52440 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52442 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52551 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52554 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52782 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52785 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53101 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53103 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53189 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53191 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53307 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53309 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53418 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53421 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53551 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53554 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54403 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54353 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54403 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54405 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54476 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54479 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54649 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54652 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54963 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54966 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55127 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55130 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55391 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55393 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55508 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55511 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55650 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55652 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55718 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55721 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 55958 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55960 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56032 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56035 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56284 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56287 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56436 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56438 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56478 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56481 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56626 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56628 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56664 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56666 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56754 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56756 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56789 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56792 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56948 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56950 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56996 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56999 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57151 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57153 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57195 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57197 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57292 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57294 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57333 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57336 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57493 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57496 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57728 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50078 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50169 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50172 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50330 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50332 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50417 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50420 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50686 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50688 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50788 + _DESCRIBEWORKERREQUEST._serialized_start = 50790 + _DESCRIBEWORKERREQUEST._serialized_end = 50861 + _DESCRIBEWORKERRESPONSE._serialized_start = 50863 + _DESCRIBEWORKERRESPONSE._serialized_end = 50944 + _COUNTWORKERSREQUEST._serialized_start = 50946 + _COUNTWORKERSREQUEST._serialized_end = 51033 + _COUNTWORKERSRESPONSE._serialized_start = 51035 + _COUNTWORKERSRESPONSE._serialized_end = 51072 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51075 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51216 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51218 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51250 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51253 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51396 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51398 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51432 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51435 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52612 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52614 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52723 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52726 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52954 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52957 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53273 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53275 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53361 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53363 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53479 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53481 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53590 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53593 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53723 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53726 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54764 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54714 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54764 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54766 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54837 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54840 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55010 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55013 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55400 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55403 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55564 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55567 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55828 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55830 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55945 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55948 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56087 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 56089 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56155 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56158 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56395 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21789 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21877 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56397 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56469 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56472 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56721 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21789 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21877 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56724 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56873 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56875 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56915 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56918 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 57063 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 57065 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 57101 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 57103 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57191 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57193 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57226 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57229 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57385 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57387 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57433 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57436 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57588 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57590 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57632 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57634 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57729 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57731 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57770 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57773 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57930 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57933 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58165 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index 381e1f4e0..7cb3995f4 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -38,6 +38,7 @@ import temporalio.api.filter.v1.message_pb2 import temporalio.api.history.v1.message_pb2 import temporalio.api.namespace.v1.message_pb2 import temporalio.api.nexus.v1.message_pb2 +import temporalio.api.nexusoperation.v1.message_pb2 import temporalio.api.notification.v1.message_pb2 import temporalio.api.protocol.v1.message_pb2 import temporalio.api.query.v1.message_pb2 @@ -2729,6 +2730,7 @@ class RespondActivityTaskFailedRequest(google.protobuf.message.Message): WORKER_VERSION_FIELD_NUMBER: builtins.int DEPLOYMENT_FIELD_NUMBER: builtins.int DEPLOYMENT_OPTIONS_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int task_token: builtins.bytes """The task token as received in `PollActivityTaskQueueResponse`""" @property @@ -2760,6 +2762,8 @@ class RespondActivityTaskFailedRequest(google.protobuf.message.Message): self, ) -> temporalio.api.deployment.v1.message_pb2.WorkerDeploymentOptions: """Worker deployment options that user has set in the worker.""" + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType + """Why did the task fail? When unset, the failure is treated as an unspecified activity failure.""" def __init__( self, *, @@ -2775,6 +2779,7 @@ class RespondActivityTaskFailedRequest(google.protobuf.message.Message): deployment: temporalio.api.deployment.v1.message_pb2.Deployment | None = ..., deployment_options: temporalio.api.deployment.v1.message_pb2.WorkerDeploymentOptions | None = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType = ..., ) -> None: ... def HasField( self, @@ -2794,6 +2799,8 @@ class RespondActivityTaskFailedRequest(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "cause", + b"cause", "deployment", b"deployment", "deployment_options", @@ -2855,6 +2862,7 @@ class RespondActivityTaskFailedByIdRequest(google.protobuf.message.Message): IDENTITY_FIELD_NUMBER: builtins.int LAST_HEARTBEAT_DETAILS_FIELD_NUMBER: builtins.int RESOURCE_ID_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int namespace: builtins.str """Namespace of the workflow which scheduled this activity""" workflow_id: builtins.str @@ -2875,6 +2883,10 @@ class RespondActivityTaskFailedByIdRequest(google.protobuf.message.Message): """Additional details to be stored as last activity heartbeat""" resource_id: builtins.str """Resource ID for routing. Contains "workflow:workflow_id" or "activity:activity_id" for standalone activities.""" + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType + """Why did the activity task fail? Optional; when unset the failure is treated as a normal + activity failure. See the type's doc for more. + """ def __init__( self, *, @@ -2887,6 +2899,7 @@ class RespondActivityTaskFailedByIdRequest(google.protobuf.message.Message): last_heartbeat_details: temporalio.api.common.v1.message_pb2.Payloads | None = ..., resource_id: builtins.str = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.ActivityTaskFailedCause.ValueType = ..., ) -> None: ... def HasField( self, @@ -2899,6 +2912,8 @@ class RespondActivityTaskFailedByIdRequest(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "activity_id", b"activity_id", + "cause", + b"cause", "failure", b"failure", "identity", @@ -12970,9 +12985,12 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): INPUT_FIELD_NUMBER: builtins.int ID_REUSE_POLICY_FIELD_NUMBER: builtins.int ID_CONFLICT_POLICY_FIELD_NUMBER: builtins.int + ON_CONFLICT_OPTIONS_FIELD_NUMBER: builtins.int SEARCH_ATTRIBUTES_FIELD_NUMBER: builtins.int NEXUS_HEADER_FIELD_NUMBER: builtins.int USER_METADATA_FIELD_NUMBER: builtins.int + COMPLETION_CALLBACKS_FIELD_NUMBER: builtins.int + LINKS_FIELD_NUMBER: builtins.int namespace: builtins.str identity: builtins.str """The identity of the client who initiated this request.""" @@ -13033,6 +13051,14 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): The default policy is NEXUS_OPERATION_ID_CONFLICT_POLICY_FAIL. """ @property + def on_conflict_options( + self, + ) -> temporalio.api.nexusoperation.v1.message_pb2.OnConflictOptions: + """Defines actions to be done to the existing running standalone Nexus when the conflict policy + NEXUS_OPERATION_ID_CONFLICT_POLICY_USE_EXISTING is used. If not set or set to a empty object + (all options with default value), it will not modify the running operation. + """ + @property def search_attributes( self, ) -> temporalio.api.common.v1.message_pb2.SearchAttributes: @@ -13051,6 +13077,22 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """Metadata for use by user interfaces to display the fixed as-of-start summary and details of the operation.""" + @property + def completion_callbacks( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.common.v1.message_pb2.Callback + ]: + """Completion callbacks to be invoked once the Nexus operation reaches a terminal state.""" + @property + def links( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.common.v1.message_pb2.Link + ]: + """Links to be associated with the Nexus operation. Callbacks may also have associated links; + links already included with a callback should not be duplicated here. + """ def __init__( self, *, @@ -13067,17 +13109,27 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): input: temporalio.api.common.v1.message_pb2.Payload | None = ..., id_reuse_policy: temporalio.api.enums.v1.nexus_pb2.NexusOperationIdReusePolicy.ValueType = ..., id_conflict_policy: temporalio.api.enums.v1.nexus_pb2.NexusOperationIdConflictPolicy.ValueType = ..., + on_conflict_options: temporalio.api.nexusoperation.v1.message_pb2.OnConflictOptions + | None = ..., search_attributes: temporalio.api.common.v1.message_pb2.SearchAttributes | None = ..., nexus_header: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., user_metadata: temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata | None = ..., + completion_callbacks: collections.abc.Iterable[ + temporalio.api.common.v1.message_pb2.Callback + ] + | None = ..., + links: collections.abc.Iterable[temporalio.api.common.v1.message_pb2.Link] + | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ "input", b"input", + "on_conflict_options", + b"on_conflict_options", "schedule_to_close_timeout", b"schedule_to_close_timeout", "schedule_to_start_timeout", @@ -13093,6 +13145,8 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "completion_callbacks", + b"completion_callbacks", "endpoint", b"endpoint", "id_conflict_policy", @@ -13103,10 +13157,14 @@ class StartNexusOperationExecutionRequest(google.protobuf.message.Message): b"identity", "input", b"input", + "links", + b"links", "namespace", b"namespace", "nexus_header", b"nexus_header", + "on_conflict_options", + b"on_conflict_options", "operation", b"operation", "operation_id", @@ -13218,6 +13276,7 @@ class DescribeNexusOperationExecutionResponse(google.protobuf.message.Message): RESULT_FIELD_NUMBER: builtins.int FAILURE_FIELD_NUMBER: builtins.int LONG_POLL_TOKEN_FIELD_NUMBER: builtins.int + COMPLETION_CALLBACKS_FIELD_NUMBER: builtins.int run_id: builtins.str """The run ID of the operation, useful when run_id was not specified in the request.""" @property @@ -13236,6 +13295,15 @@ class DescribeNexusOperationExecutionResponse(google.protobuf.message.Message): """The failure if the operation completed unsuccessfully.""" long_poll_token: builtins.bytes """Token for follow-on long-poll requests. Absent only if the operation is complete.""" + @property + def completion_callbacks( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.nexusoperation.v1.message_pb2.CallbackInfo + ]: + """Completion callbacks to be invoked once the Nexus operation reaches a terminal state. + They will remain in the CALLBACK_STATE_STANDBY state until the Nexus operation is finished. + """ def __init__( self, *, @@ -13246,6 +13314,10 @@ class DescribeNexusOperationExecutionResponse(google.protobuf.message.Message): result: temporalio.api.common.v1.message_pb2.Payload | None = ..., failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., long_poll_token: builtins.bytes = ..., + completion_callbacks: collections.abc.Iterable[ + temporalio.api.nexusoperation.v1.message_pb2.CallbackInfo + ] + | None = ..., ) -> None: ... def HasField( self, @@ -13265,6 +13337,8 @@ class DescribeNexusOperationExecutionResponse(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "completion_callbacks", + b"completion_callbacks", "failure", b"failure", "info", diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index 5b57656ea..92a37d7f4 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,20 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_stream_v1_StreamRecord( + self, fs: VisitorFunctions, o: Any + ): + if o.HasField("body"): + await self._visit_temporal_api_common_v1_Payload(fs, o.body) + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_DeliverStreamRecords( + self, fs: VisitorFunctions, o: Any + ): + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) + async def _visit_temporal_api_notification_v1_Notification( self, fs: VisitorFunctions, o: Any ): @@ -365,6 +379,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("deliver_stream_records"): + await self._visit_coresdk_workflow_activation_DeliverStreamRecords( + fs, o.deliver_stream_records + ) elif o.HasField("notifications_received"): await self._visit_coresdk_workflow_activation_NotificationsReceived( fs, o.notifications_received @@ -508,6 +526,12 @@ async def _visit_coresdk_workflow_commands_ScheduleNexusOperation( if o.HasField("input"): await self._visit_nexus_operation_input_payload(fs, o.input) + async def _visit_coresdk_workflow_commands_AppendStreamRecords( + self, fs: VisitorFunctions, o: Any + ): + for v in o.records: + await self._visit_temporal_api_stream_v1_StreamRecord(fs, v) + async def _visit_coresdk_workflow_commands_WorkflowCommand( self, fs: VisitorFunctions, o: Any ): @@ -567,6 +591,10 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand( await self._visit_coresdk_workflow_commands_ScheduleNexusOperation( fs, o.schedule_nexus_operation ) + elif o.HasField("append_stream_records"): + await self._visit_coresdk_workflow_commands_AppendStreamRecords( + fs, o.append_stream_records + ) async def _visit_coresdk_workflow_completion_Success( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 2910aa008..7c153f132 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -21,6 +21,9 @@ from temporalio.api.common.v1 import ( message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, ) +from temporalio.api.enums.v1 import ( + failed_cause_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_failed__cause__pb2, +) from temporalio.api.enums.v1 import ( workflow_pb2 as temporal_dot_api_dot_enums_dot_v1_dot_workflow__pb2, ) @@ -30,6 +33,9 @@ from temporalio.api.notification.v1 import ( message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.api.update.v1 import ( message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, ) @@ -47,12 +53,13 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a*temporal/api/notification/v1/message.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\xb6\x0b\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12T\n\x16notifications_received\x18\x16 \x01(\x0b\x32\x32.coresdk.workflow_activation.NotificationsReceivedH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"Z\n\x15NotificationsReceived\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\x8b\x0c\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12T\n\x16notifications_received\x18\x16 \x01(\x0b\x32\x32.coresdk.workflow_activation.NotificationsReceivedH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"Z\n\x15NotificationsReceived\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"\xb1\x01\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12P\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause"\xb8\x01\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12P\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _NOTIFICATIONSRECEIVED = DESCRIPTOR.message_types_by_name["NotificationsReceived"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ @@ -118,6 +125,17 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) +DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( + "DeliverStreamRecords", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMRECORDS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamRecords) + }, +) +_sym_db.RegisterMessage(DeliverStreamRecords) + NotificationsReceived = _reflection.GeneratedProtocolMessageType( "NotificationsReceived", (_message.Message,), @@ -391,58 +409,60 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 576 - _WORKFLOWACTIVATION._serialized_end = 1122 - _WORKFLOWACTIVATIONJOB._serialized_start = 1125 - _WORKFLOWACTIVATIONJOB._serialized_end = 2587 - _NOTIFICATIONSRECEIVED._serialized_start = 2589 - _NOTIFICATIONSRECEIVED._serialized_end = 2679 - _INITIALIZEWORKFLOW._serialized_start = 2682 - _INITIALIZEWORKFLOW._serialized_end = 4086 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4007 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4086 - _FIRETIMER._serialized_start = 4088 - _FIRETIMER._serialized_end = 4112 - _RESOLVEACTIVITY._serialized_start = 4114 - _RESOLVEACTIVITY._serialized_end = 4223 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4226 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4563 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4565 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4624 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4627 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 4793 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 4795 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 4891 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 4893 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 4998 - _UPDATERANDOMSEED._serialized_start = 5000 - _UPDATERANDOMSEED._serialized_end = 5043 - _QUERYWORKFLOW._serialized_start = 5046 - _QUERYWORKFLOW._serialized_end = 5306 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4007 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4086 - _CANCELWORKFLOW._serialized_start = 5308 - _CANCELWORKFLOW._serialized_end = 5340 - _SIGNALWORKFLOW._serialized_start = 5343 - _SIGNALWORKFLOW._serialized_end = 5632 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4007 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4086 - _NOTIFYHASPATCH._serialized_start = 5634 - _NOTIFYHASPATCH._serialized_end = 5668 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5670 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 5765 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 5767 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 5869 - _DOUPDATE._serialized_start = 5872 - _DOUPDATE._serialized_end = 6203 - _DOUPDATE_HEADERSENTRY._serialized_start = 4007 - _DOUPDATE_HEADERSENTRY._serialized_end = 4086 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6206 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6360 - _RESOLVENEXUSOPERATION._serialized_start = 6362 - _RESOLVENEXUSOPERATION._serialized_end = 6451 - _REMOVEFROMCACHE._serialized_start = 6454 - _REMOVEFROMCACHE._serialized_end = 6806 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 6568 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 6806 + _WORKFLOWACTIVATION._serialized_start = 656 + _WORKFLOWACTIVATION._serialized_end = 1202 + _WORKFLOWACTIVATIONJOB._serialized_start = 1205 + _WORKFLOWACTIVATIONJOB._serialized_end = 2752 + _DELIVERSTREAMRECORDS._serialized_start = 2755 + _DELIVERSTREAMRECORDS._serialized_end = 2891 + _NOTIFICATIONSRECEIVED._serialized_start = 2893 + _NOTIFICATIONSRECEIVED._serialized_end = 2983 + _INITIALIZEWORKFLOW._serialized_start = 2986 + _INITIALIZEWORKFLOW._serialized_end = 4390 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4311 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4390 + _FIRETIMER._serialized_start = 4392 + _FIRETIMER._serialized_end = 4416 + _RESOLVEACTIVITY._serialized_start = 4418 + _RESOLVEACTIVITY._serialized_end = 4527 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4530 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4867 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4869 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4928 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4931 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 5097 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 5099 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 5195 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 5197 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5302 + _UPDATERANDOMSEED._serialized_start = 5304 + _UPDATERANDOMSEED._serialized_end = 5347 + _QUERYWORKFLOW._serialized_start = 5350 + _QUERYWORKFLOW._serialized_end = 5610 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4311 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4390 + _CANCELWORKFLOW._serialized_start = 5612 + _CANCELWORKFLOW._serialized_end = 5644 + _SIGNALWORKFLOW._serialized_start = 5647 + _SIGNALWORKFLOW._serialized_end = 5936 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4311 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4390 + _NOTIFYHASPATCH._serialized_start = 5938 + _NOTIFYHASPATCH._serialized_end = 5972 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5975 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 6152 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 6155 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 6339 + _DOUPDATE._serialized_start = 6342 + _DOUPDATE._serialized_end = 6673 + _DOUPDATE_HEADERSENTRY._serialized_start = 4311 + _DOUPDATE_HEADERSENTRY._serialized_end = 4390 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 6676 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 6830 + _RESOLVENEXUSOPERATION._serialized_start = 6832 + _RESOLVENEXUSOPERATION._serialized_end = 6921 + _REMOVEFROMCACHE._serialized_start = 6924 + _REMOVEFROMCACHE._serialized_end = 7276 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 7038 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 7276 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 86a726e68..7db277935 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -19,9 +19,11 @@ import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 +import temporalio.api.enums.v1.failed_cause_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.notification.v1.message_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -45,7 +47,7 @@ class WorkflowActivation(google.protobuf.message.Message): 1. init workflow 2. patches 3. random-seed-updates - 4. signals/updates + 4. signals/updates/channel notifications 5. all others 6. local activity resolutions 7. queries @@ -55,6 +57,8 @@ class WorkflowActivation(google.protobuf.message.Message): * Patches are expected to apply to the entire activation * Signal and update handlers should be invoked before workflow routines are iterated. That is to say before the users' main workflow function and anything spawned by it is allowed to continue. + * Channel notifications are input from outside the workflow, like signals, so they go with + them and ahead of the stream ranges among the other jobs. * Local activities resolutions go after other normal jobs because while *not* replaying, they will always take longer than anything else that produces an immediate job (which is effectively instant). When *replaying* we need to scan ahead for LA markers so that we can @@ -236,6 +240,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): DO_UPDATE_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_START_FIELD_NUMBER: builtins.int RESOLVE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + DELIVER_STREAM_RECORDS_FIELD_NUMBER: builtins.int NOTIFICATIONS_RECEIVED_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property @@ -297,12 +302,17 @@ class WorkflowActivationJob(google.protobuf.message.Message): def resolve_nexus_operation(self) -> global___ResolveNexusOperation: """A nexus operation resolved.""" @property - def notifications_received(self) -> global___NotificationsReceived: - """17 to 21 are taken by the stream jobs, which share this message. + def deliver_stream_records(self) -> global___DeliverStreamRecords: + """17 to 20 are taken by the external stream jobs, which are developed + alongside this one and share this message. The number below is fixed + with that family and must not be reused. - Notifications from the channels the workflow subscribed to. + A range of a stream the workflow subscribed to. """ @property + def notifications_received(self) -> global___NotificationsReceived: + """Notifications from the channels the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -330,6 +340,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): do_update: global___DoUpdate | None = ..., resolve_nexus_operation_start: global___ResolveNexusOperationStart | None = ..., resolve_nexus_operation: global___ResolveNexusOperation | None = ..., + deliver_stream_records: global___DeliverStreamRecords | None = ..., notifications_received: global___NotificationsReceived | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... @@ -338,6 +349,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -379,6 +392,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "cancel_workflow", b"cancel_workflow", + "deliver_stream_records", + b"deliver_stream_records", "do_update", b"do_update", "fire_timer", @@ -434,6 +449,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "do_update", "resolve_nexus_operation_start", "resolve_nexus_operation", + "deliver_stream_records", "notifications_received", "remove_from_cache", ] @@ -442,6 +458,63 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class DeliverStreamRecords(google.protobuf.message.Message): + """Hand a workflow the next range of a stream it subscribed to. + + The range is delivered once, on the task the server decided it belongs to, + and the offsets it covered are recorded in History rather than the payloads. + On replay the server re-supplies the same range by reading the stream again, + so this job appears at the same point with the same contents both times. + + An empty range is still delivered: a task where the subscription saw nothing + is a fact replay has to reproduce, not an absence of one. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_ID_FIELD_NUMBER: builtins.int + FROM_OFFSET_FIELD_NUMBER: builtins.int + TO_OFFSET_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_id: builtins.str + """Id of the stream this range came from.""" + from_offset: builtins.int + """Inclusive.""" + to_offset: builtins.int + """Exclusive. Equal to from_offset when the subscription saw nothing.""" + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: ... + def __init__( + self, + *, + stream_id: builtins.str = ..., + from_offset: builtins.int = ..., + to_offset: builtins.int = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "from_offset", + b"from_offset", + "records", + b"records", + "stream_id", + b"stream_id", + "to_offset", + b"to_offset", + ], + ) -> None: ... + +global___DeliverStreamRecords = DeliverStreamRecords + class NotificationsReceived(google.protobuf.message.Message): """Hand a workflow the notifications the server folded for its channels. @@ -1227,6 +1300,7 @@ class ResolveSignalExternalWorkflow(google.protobuf.message.Message): SEQ_FIELD_NUMBER: builtins.int FAILURE_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int seq: builtins.int """Sequence number as provided by lang in the corresponding SignalExternalWorkflowExecution command @@ -1236,18 +1310,25 @@ class ResolveSignalExternalWorkflow(google.protobuf.message.Message): """If populated, this signal either failed to be sent or was cancelled depending on failure type / info. """ + cause: temporalio.api.enums.v1.failed_cause_pb2.SignalExternalWorkflowExecutionFailedCause.ValueType + """The server-reported cause when the signal failed. Unspecified when the signal succeeded or + was cancelled before being sent. + """ def __init__( self, *, seq: builtins.int = ..., failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.SignalExternalWorkflowExecutionFailedCause.ValueType = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["failure", b"failure"] ) -> builtins.bool: ... def ClearField( self, - field_name: typing_extensions.Literal["failure", b"failure", "seq", b"seq"], + field_name: typing_extensions.Literal[ + "cause", b"cause", "failure", b"failure", "seq", b"seq" + ], ) -> None: ... global___ResolveSignalExternalWorkflow = ResolveSignalExternalWorkflow @@ -1257,27 +1338,31 @@ class ResolveRequestCancelExternalWorkflow(google.protobuf.message.Message): SEQ_FIELD_NUMBER: builtins.int FAILURE_FIELD_NUMBER: builtins.int + CAUSE_FIELD_NUMBER: builtins.int seq: builtins.int """Sequence number as provided by lang in the corresponding RequestCancelExternalWorkflowExecution command """ @property def failure(self) -> temporalio.api.failure.v1.message_pb2.Failure: - """If populated, this signal either failed to be sent or was cancelled depending on failure - type / info. - """ + """If populated, the cancellation request failed.""" + cause: temporalio.api.enums.v1.failed_cause_pb2.CancelExternalWorkflowExecutionFailedCause.ValueType + """The server-reported cause when the cancellation request failed.""" def __init__( self, *, seq: builtins.int = ..., failure: temporalio.api.failure.v1.message_pb2.Failure | None = ..., + cause: temporalio.api.enums.v1.failed_cause_pb2.CancelExternalWorkflowExecutionFailedCause.ValueType = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["failure", b"failure"] ) -> builtins.bool: ... def ClearField( self, - field_name: typing_extensions.Literal["failure", b"failure", "seq", b"seq"], + field_name: typing_extensions.Literal[ + "cause", b"cause", "failure", b"failure", "seq", b"seq" + ], ) -> None: ... global___ResolveRequestCancelExternalWorkflow = ResolveRequestCancelExternalWorkflow diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 1153e3c9b..795fa4461 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AppendStreamRecords, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -22,6 +23,7 @@ StartChildWorkflowExecution, StartTimer, SubscribeNotificationChannel, + SubscribeStream, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -29,6 +31,7 @@ __all__ = [ "ActivityCancellationType", + "AppendStreamRecords", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -51,6 +54,7 @@ "StartChildWorkflowExecution", "StartTimer", "SubscribeNotificationChannel", + "SubscribeStream", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 54939089c..7a4b9399c 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.bridge.proto.child_workflow import ( child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, ) @@ -45,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\x8c\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x42\t\n\x07variant"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa5\x12\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x42\t\n\x07variant"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x87\x01\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x93\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12#\n\x1binclude_arguments_in_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -56,6 +59,8 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _SUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ "SubscribeNotificationChannel" ] @@ -133,6 +138,28 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +AppendStreamRecords = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecords", + (_message.Message,), + { + "DESCRIPTOR": _APPENDSTREAMRECORDS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AppendStreamRecords) + }, +) +_sym_db.RegisterMessage(AppendStreamRecords) + +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) +_sym_db.RegisterMessage(SubscribeStream) + SubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( "SubscribeNotificationChannel", (_message.Message,), @@ -498,72 +525,76 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8820 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8908 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2706 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 2708 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 2755 - _STARTTIMER._serialized_start = 2757 - _STARTTIMER._serialized_end = 2840 - _CANCELTIMER._serialized_start = 2842 - _CANCELTIMER._serialized_end = 2868 - _SCHEDULEACTIVITY._serialized_start = 2871 - _SCHEDULEACTIVITY._serialized_end = 3695 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3616 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3695 - _SCHEDULELOCALACTIVITY._serialized_start = 3698 - _SCHEDULELOCALACTIVITY._serialized_end = 4487 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3616 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3695 - _REQUESTCANCELACTIVITY._serialized_start = 4489 - _REQUESTCANCELACTIVITY._serialized_end = 4525 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4527 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4568 - _QUERYRESULT._serialized_start = 4571 - _QUERYRESULT._serialized_end = 4727 - _QUERYSUCCESS._serialized_start = 4729 - _QUERYSUCCESS._serialized_end = 4794 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4796 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4872 - _FAILWORKFLOWEXECUTION._serialized_start = 4874 - _FAILWORKFLOWEXECUTION._serialized_end = 4948 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4951 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5708 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5784 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 - _CANCELWORKFLOWEXECUTION._serialized_start = 5867 - _CANCELWORKFLOWEXECUTION._serialized_end = 5943 - _SETPATCHMARKER._serialized_start = 5945 - _SETPATCHMARKER._serialized_end = 5999 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6002 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7176 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5708 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5784 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7178 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7252 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7255 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7397 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7400 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7799 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 - _CANCELSIGNALWORKFLOW._serialized_start = 7801 - _CANCELSIGNALWORKFLOW._serialized_end = 7836 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7838 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7939 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7941 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8020 - _UPDATERESPONSE._serialized_start = 8023 - _UPDATERESPONSE._serialized_end = 8233 - _SCHEDULENEXUSOPERATION._serialized_start = 8236 - _SCHEDULENEXUSOPERATION._serialized_end = 8774 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8724 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8774 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8776 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8818 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9246 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9334 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 2897 + _APPENDSTREAMRECORDS._serialized_start = 2899 + _APPENDSTREAMRECORDS._serialized_end = 2996 + _SUBSCRIBESTREAM._serialized_start = 2999 + _SUBSCRIBESTREAM._serialized_end = 3134 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3136 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3183 + _STARTTIMER._serialized_start = 3185 + _STARTTIMER._serialized_end = 3268 + _CANCELTIMER._serialized_start = 3270 + _CANCELTIMER._serialized_end = 3296 + _SCHEDULEACTIVITY._serialized_start = 3299 + _SCHEDULEACTIVITY._serialized_end = 4123 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 4044 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 4123 + _SCHEDULELOCALACTIVITY._serialized_start = 4126 + _SCHEDULELOCALACTIVITY._serialized_end = 4913 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 4044 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 4123 + _REQUESTCANCELACTIVITY._serialized_start = 4915 + _REQUESTCANCELACTIVITY._serialized_end = 4951 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4953 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4994 + _QUERYRESULT._serialized_start = 4997 + _QUERYRESULT._serialized_end = 5153 + _QUERYSUCCESS._serialized_start = 5155 + _QUERYSUCCESS._serialized_end = 5220 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 5222 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5298 + _FAILWORKFLOWEXECUTION._serialized_start = 5300 + _FAILWORKFLOWEXECUTION._serialized_end = 5374 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5377 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6291 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 6134 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 6210 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4044 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4123 + _CANCELWORKFLOWEXECUTION._serialized_start = 6293 + _CANCELWORKFLOWEXECUTION._serialized_end = 6369 + _SETPATCHMARKER._serialized_start = 6371 + _SETPATCHMARKER._serialized_end = 6425 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6428 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7602 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4044 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4123 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 6134 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 6210 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7604 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7678 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7681 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7823 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7826 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8225 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4044 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4123 + _CANCELSIGNALWORKFLOW._serialized_start = 8227 + _CANCELSIGNALWORKFLOW._serialized_end = 8262 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8264 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8365 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8367 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8446 + _UPDATERESPONSE._serialized_start = 8449 + _UPDATERESPONSE._serialized_end = 8659 + _SCHEDULENEXUSOPERATION._serialized_start = 8662 + _SCHEDULENEXUSOPERATION._serialized_end = 9200 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 9150 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 9200 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 9202 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9244 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index e658d1585..d343d2020 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -25,6 +25,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int SUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -179,8 +182,17 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property - def subscribe_notification_channel(self) -> global___SubscribeNotificationChannel: - """23 to 30 are taken by the stream commands, which share this message.""" + def subscribe_stream(self) -> global___SubscribeStream: + """23 to 28 are taken by the external stream commands, which are developed + alongside these and share this message. The two numbers below are fixed + with that family and must not be reused. + """ + @property + def append_stream_records(self) -> global___AppendStreamRecords: ... + @property + def subscribe_notification_channel( + self, + ) -> global___SubscribeNotificationChannel: ... def __init__( self, *, @@ -219,12 +231,16 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + append_stream_records: global___AppendStreamRecords | None = ..., subscribe_notification_channel: global___SubscribeNotificationChannel | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -267,6 +283,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -280,6 +298,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -324,6 +344,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "subscribe_stream", + b"subscribe_stream", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -360,6 +382,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "append_stream_records", "subscribe_notification_channel", ] | None @@ -367,6 +391,109 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand records cost the same in History as one. The server + stores each record with an empty producer id, because the workflow is the + producer here. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_NAME_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_name: builtins.str + """Name of a stream this workflow owns, scoped to the workflow. Created on + first use. Empty means the workflow's default output stream. A workflow + cannot append to a stream in another execution, so this is never the id + of a standalone stream. + """ + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: ... + def __init__( + self, + *, + stream_name: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "records", b"records", "stream_name", b"stream_name" + ], + ) -> None: ... + +global___AppendStreamRecords = AppendStreamRecords + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_NAME_OR_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + START_POSITION_FIELD_NUMBER: builtins.int + stream_name_or_id: builtins.str + """Stream to consume, named either way round: a stream this workflow owns + by the name it appends under, a stream in another execution by its id. + The server tries them in that order, so a workflow that owns a stream + under this name cannot reach a standalone stream with the same id. When + neither exists the workflow gets a stream of its own by that name, which + is how a reader subscribes before the first record is written. + """ + start_offset: builtins.int + """Where to start, as an absolute offset. Read only when start_position is + unset. The server refuses a negative value. + """ + @property + def start_position( + self, + ) -> temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """Where to start: an offset, the earliest record held, the tail, or the + last N records. The server resolves it and records the resulting offset, + so replay does not resolve it again and Core does not keep it. + """ + def __init__( + self, + *, + stream_name_or_id: builtins.str = ..., + start_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["start_position", b"start_position"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "start_position", + b"start_position", + "stream_name_or_id", + b"stream_name_or_id", + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class SubscribeNotificationChannel(google.protobuf.message.Message): """Subscribe this workflow to a notification channel, so the scheduled event of each later Workflow Task carries the notifications folded for it. @@ -655,7 +782,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): RETRY_POLICY_FIELD_NUMBER: builtins.int LOCAL_RETRY_THRESHOLD_FIELD_NUMBER: builtins.int CANCELLATION_TYPE_FIELD_NUMBER: builtins.int - INCLUDE_ARGUMENTS_INTO_MARKER_FIELD_NUMBER: builtins.int + INCLUDE_ARGUMENTS_IN_MARKER_FIELD_NUMBER: builtins.int seq: builtins.int """Lang's incremental sequence number, used as the operation identifier""" activity_id: builtins.str @@ -720,7 +847,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): confirmed. Lang should default this to `WAIT_CANCELLATION_COMPLETED`, even though proto will default to `TRY_CANCEL` automatically. """ - include_arguments_into_marker: builtins.bool + include_arguments_in_marker: builtins.bool """If set, the local activity arguments will be included in the resulting marker under the `input` key. This is disabled by default to avoid increasing history size unless the lang SDK explicitly chooses to expose it. @@ -747,7 +874,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., local_retry_threshold: google.protobuf.duration_pb2.Duration | None = ..., cancellation_type: global___ActivityCancellationType.ValueType = ..., - include_arguments_into_marker: builtins.bool = ..., + include_arguments_in_marker: builtins.bool = ..., ) -> None: ... def HasField( self, @@ -781,8 +908,8 @@ class ScheduleLocalActivity(google.protobuf.message.Message): b"cancellation_type", "headers", b"headers", - "include_arguments_into_marker", - b"include_arguments_into_marker", + "include_arguments_in_marker", + b"include_arguments_in_marker", "local_retry_threshold", b"local_retry_threshold", "original_schedule_time", diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index a9a025b81..172074566 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit a9a025b8172618a15777da64fbfc259d1c6b73f9 +Subproject commit 1720745668086de0057e1daafa44317ec99fa532 diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 317c68416..94c668de6 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -5,7 +5,7 @@ # The Core the bridge pins decides whether a workflow's subscribe command # reaches the server. The protos-only pin refuses it; the delivery pin that # the native layers move to handles it. -PINNED_CORE_HANDLES_CHANNEL_COMMAND = False +PINNED_CORE_HANDLES_CHANNEL_COMMAND = True def pytest_configure(config: pytest.Config) -> None: From 89eafa3aa2bff0d57a9ebd9947d9029c81b3f927 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:26:40 -0700 Subject: [PATCH 761/831] Mapped the producer conflict under its failed-precondition status. The server reports a producer conflict as FAILED_PRECONDITION with a reason token, and this layer only knew the INVALID_ARGUMENT a server built before the tokens sent, so the typed error was lost on the current server. --- temporalio/client_stream.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/temporalio/client_stream.py b/temporalio/client_stream.py index 30c3de995..1f02ab128 100644 --- a/temporalio/client_stream.py +++ b/temporalio/client_stream.py @@ -65,6 +65,12 @@ # it sends carry it: a repeat with different content, and one behind the # sequence it accepted last. _PRODUCER_CONFLICT = "producer sequence" +# The status the server puts on a producer conflict; the older one is kept +# so a server built before the reason tokens still gets the typed error. +_PRODUCER_CONFLICT_CODES = ( + grpc.StatusCode.FAILED_PRECONDITION, + grpc.StatusCode.INVALID_ARGUMENT, +) @dataclass(frozen=True) @@ -171,10 +177,12 @@ def _translate(error: grpc.aio.AioRpcError) -> Exception: details = error.details() or code.name if code is grpc.StatusCode.NOT_FOUND: return StreamNotFoundError(details) - if code is grpc.StatusCode.INVALID_ARGUMENT and _PRODUCER_CONFLICT in details: + if code in _PRODUCER_CONFLICT_CODES and _PRODUCER_CONFLICT in details: # A producer sequence the store already holds, either with different # content or behind the one it accepted last. The caller asked to be - # deduplicated and could not be, which is a condition of its own. + # deduplicated and could not be, which is a condition of its own. The + # server reports it as a failed precondition; one built before the + # reason tokens existed called it an invalid argument. return StreamProducerError(details) raw = b"" # The aio metadata iterates as (key, value) pairs at runtime, whatever From c5b259c70cc4da93d7e84b331dc5ee57d2feafb1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:29:33 -0700 Subject: [PATCH 762/831] Expected the typed cursor error from a read below the floor. This layer maps the STREAM_CURSOR_BELOW_FLOOR token to StreamCursorError, which is not an RPCError, so the live case written on the wire layer no longer matched the exception it got. --- tests/test_client_stream.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_client_stream.py b/tests/test_client_stream.py index 89abb0559..779d1b188 100644 --- a/tests/test_client_stream.py +++ b/tests/test_client_stream.py @@ -26,7 +26,11 @@ ) from temporalio.client_stream import StreamClient, StreamHandle from temporalio.service import RPCError -from temporalio.streams import StreamNotFoundError, StreamProducerError +from temporalio.streams import ( + StreamCursorError, + StreamNotFoundError, + StreamProducerError, +) TARGET = os.environ.get("TEMPORAL_STREAM_TARGET") @@ -230,7 +234,7 @@ async def test_earliest_reads_from_the_floor_of_a_truncated_stream( # Offset zero is what a reader with no position used to send, and a # truncated stream no longer holds it. - with pytest.raises(RPCError, match="truncated"): + with pytest.raises(StreamCursorError, match="truncated"): await stream.read(from_offset=0) entries, next_offset = await stream.read(start=StreamStartPosition(earliest=True)) assert data(entries) == [b"c", b"d"] From 4d049cd9c18bb6175ff91651692f6c16f5cb0751 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:33:45 -0700 Subject: [PATCH 763/831] Checked the untouched channel and the retained position in the poller case. A channel nobody has touched is not found, and the first notify on a fresh channel shows up in describe with its position and counter before any poll. --- tests/streams/test_channels.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index 4521bb1ab..950ad28d1 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -321,9 +321,18 @@ async def test_a_callback_listener_registers_and_unregisters(client: Client): @pytest.mark.needs_channel_server async def test_a_channel_retains_notifications_for_pollers(client: Client): channel = f"orders-{uuid.uuid4()}" + # A channel nobody has touched does not exist. + with pytest.raises(RPCError) as untouched: + await client.describe_channel(f"untouched-{uuid.uuid4()}") + assert untouched.value.status == RPCStatusCode.NOT_FOUND # Nobody listens yet: the notification is kept for pollers and the count # says zero. assert await client.notify_channel(channel, position=b"2-0", counter=2) == 0 + description = await client.describe_channel(channel) + assert description.listeners == [] + assert description.latest is not None + assert (description.latest.position, description.latest.counter) == (b"2-0", 2) + assert description.retained_count == 1 polled = await client.poll_channel(channel, wait=False) assert [(n.position, n.counter) for n in polled] == [(b"2-0", 2)] # At or below the latest counter a notify changes nothing and is not kept. From 9c19f235ac8d97dc684203150a9ca787cb0d6564 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:40:28 -0700 Subject: [PATCH 764/831] Pinned Core with the notification channel and regenerated the clients. --- temporalio/api/command/v1/__init__.py | 2 + temporalio/api/command/v1/message_pb2.py | 30 +- temporalio/api/command/v1/message_pb2.pyi | 36 + temporalio/api/enums/v1/command_type_pb2.py | 5 +- temporalio/api/enums/v1/command_type_pb2.pyi | 2 + temporalio/api/enums/v1/event_type_pb2.py | 5 +- temporalio/api/enums/v1/event_type_pb2.pyi | 8 + temporalio/api/enums/v1/failed_cause_pb2.py | 25 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 12 + temporalio/api/history/v1/__init__.py | 2 + temporalio/api/history/v1/message_pb2.py | 297 ++-- temporalio/api/history/v1/message_pb2.pyi | 63 + temporalio/api/notification/__init__.py | 0 temporalio/api/notification/v1/__init__.py | 7 + temporalio/api/notification/v1/message_pb2.py | 88 ++ .../api/notification/v1/message_pb2.pyi | 194 +++ temporalio/api/workflow/v1/message_pb2.pyi | 4 + temporalio/api/workflowservice/v1/__init__.py | 20 + .../v1/request_response_pb2.py | 1281 +++++++++-------- .../v1/request_response_pb2.pyi | 316 ++++ .../api/workflowservice/v1/service_pb2.py | 24 +- .../workflowservice/v1/service_pb2_grpc.py | 245 ++++ .../workflowservice/v1/service_pb2_grpc.pyi | 100 ++ temporalio/bridge/_visitor.py | 16 + .../proto/workflow_activation/__init__.py | 2 + .../workflow_activation_pb2.py | 139 +- .../workflow_activation_pb2.pyi | 44 +- .../proto/workflow_commands/__init__.py | 2 + .../workflow_commands_pb2.py | 184 +-- .../workflow_commands_pb2.pyi | 36 + temporalio/bridge/sdk-core | 2 +- temporalio/bridge/services_generated.py | 90 ++ temporalio/bridge/src/client_rpc_generated.rs | 45 + 33 files changed, 2453 insertions(+), 873 deletions(-) create mode 100644 temporalio/api/notification/__init__.py create mode 100644 temporalio/api/notification/v1/__init__.py create mode 100644 temporalio/api/notification/v1/message_pb2.py create mode 100644 temporalio/api/notification/v1/message_pb2.pyi diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index d1b241274..2f9ac1a91 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -17,6 +17,7 @@ SignalExternalWorkflowExecutionCommandAttributes, StartChildWorkflowExecutionCommandAttributes, StartTimerCommandAttributes, + SubscribeNotificationChannelCommandAttributes, SubscribeStreamCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) @@ -40,6 +41,7 @@ "SignalExternalWorkflowExecutionCommandAttributes", "StartChildWorkflowExecutionCommandAttributes", "StartTimerCommandAttributes", + "SubscribeNotificationChannelCommandAttributes", "SubscribeStreamCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index 8c36c1f7b..4e6c50922 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xe4\x13\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x42\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xea\x14\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x12\x83\x01\n1subscribe_notification_channel_command_attributes\x18\x16 \x01(\x0b\x32\x46.temporal.api.command.v1.SubscribeNotificationChannelCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"@\n-SubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\tB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -115,6 +115,9 @@ _SUBSCRIBESTREAMCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ "SubscribeStreamCommandAttributes" ] +_SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "SubscribeNotificationChannelCommandAttributes" +] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", (_message.Message,), @@ -363,6 +366,19 @@ ) _sym_db.RegisterMessage(SubscribeStreamCommandAttributes) +SubscribeNotificationChannelCommandAttributes = ( + _reflection.GeneratedProtocolMessageType( + "SubscribeNotificationChannelCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.SubscribeNotificationChannelCommandAttributes) + }, + ) +) +_sym_db.RegisterMessage(SubscribeNotificationChannelCommandAttributes) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\032io.temporal.api.command.v1B\014MessageProtoP\001Z%go.temporal.io/api/command/v1;command\252\002\031Temporalio.Api.Command.V1\352\002\034Temporalio::Api::Command::V1" @@ -453,9 +469,11 @@ _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 _COMMAND._serialized_start = 5274 - _COMMAND._serialized_end = 7806 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7808 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 7920 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 7922 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 7997 + _COMMAND._serialized_end = 7940 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7942 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 8054 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 8056 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8131 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8133 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8197 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index f623eecfd..1fd211475 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -1122,6 +1122,7 @@ class Command(google.protobuf.message.Message): REQUEST_CANCEL_NEXUS_OPERATION_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int APPEND_STREAM_RECORDS_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + SUBSCRIBE_NOTIFICATION_CHANNEL_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1220,6 +1221,10 @@ class Command(google.protobuf.message.Message): def subscribe_stream_command_attributes( self, ) -> global___SubscribeStreamCommandAttributes: ... + @property + def subscribe_notification_channel_command_attributes( + self, + ) -> global___SubscribeNotificationChannelCommandAttributes: ... def __init__( self, *, @@ -1268,6 +1273,8 @@ class Command(google.protobuf.message.Message): | None = ..., subscribe_stream_command_attributes: global___SubscribeStreamCommandAttributes | None = ..., + subscribe_notification_channel_command_attributes: global___SubscribeNotificationChannelCommandAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -1308,6 +1315,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_notification_channel_command_attributes", + b"subscribe_notification_channel_command_attributes", "subscribe_stream_command_attributes", b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", @@ -1359,6 +1368,8 @@ class Command(google.protobuf.message.Message): b"start_child_workflow_execution_command_attributes", "start_timer_command_attributes", b"start_timer_command_attributes", + "subscribe_notification_channel_command_attributes", + b"subscribe_notification_channel_command_attributes", "subscribe_stream_command_attributes", b"subscribe_stream_command_attributes", "upsert_workflow_search_attributes_command_attributes", @@ -1390,6 +1401,7 @@ class Command(google.protobuf.message.Message): "request_cancel_nexus_operation_command_attributes", "append_stream_records_command_attributes", "subscribe_stream_command_attributes", + "subscribe_notification_channel_command_attributes", ] | None ): ... @@ -1475,3 +1487,27 @@ class SubscribeStreamCommandAttributes(google.protobuf.message.Message): ) -> None: ... global___SubscribeStreamCommandAttributes = SubscribeStreamCommandAttributes + +class SubscribeNotificationChannelCommandAttributes(google.protobuf.message.Message): + """Makes the Workflow a listener of a notification channel for this run. The + next notifications on the channel arrive on the scheduled event of a Workflow + Task. The subscription ends with the run, and a successor subscribes again. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """The channel to listen on, as the writers name it.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___SubscribeNotificationChannelCommandAttributes = ( + SubscribeNotificationChannelCommandAttributes +) diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index 17f70d8a6..dcb39197c 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xe7\x06\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x98\x07\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x12/\n+COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL\x10\x15\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -41,11 +41,12 @@ COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION = 18 COMMAND_TYPE_APPEND_STREAM_RECORDS = 19 COMMAND_TYPE_SUBSCRIBE_STREAM = 20 +COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL = 21 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 939 + _COMMANDTYPE._serialized_end = 988 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index c6f21ab4b..64fb7729c 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -46,6 +46,7 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: _CommandType.ValueType # 18 COMMAND_TYPE_APPEND_STREAM_RECORDS: _CommandType.ValueType # 19 COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 + COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL: _CommandType.ValueType # 21 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -70,4 +71,5 @@ COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION: CommandType.ValueType # 17 COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 COMMAND_TYPE_APPEND_STREAM_RECORDS: CommandType.ValueType # 19 COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 +COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL: CommandType.ValueType # 21 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index a41b486ee..4b615e909 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\xfa\x16\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\nB\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\xb3\x17\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\n\x12\x37\n3EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED\x10?B\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -84,11 +84,12 @@ EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_TRANSITIONED = 60 EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED = 62 +EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED = 63 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 3004 + _EVENTTYPE._serialized_end = 3061 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 84db38b61..97a4c1166 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -226,6 +226,10 @@ class _EventTypeEnumTypeWrapper( batch, and carrying only the offset range it landed at: the bodies go to the stream's own log, never into History. """ + EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED: _EventType.ValueType # 63 + """A Workflow became a listener of a notification channel for its run. + The notifications themselves ride the WorkflowTaskScheduled event. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -428,4 +432,8 @@ EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED: EventType.ValueType # 62 batch, and carrying only the offset range it landed at: the bodies go to the stream's own log, never into History. """ +EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED: EventType.ValueType # 63 +"""A Workflow became a listener of a notification channel for its run. +The notifications themselves ride the WorkflowTaskScheduled event. +""" global___EventType = EventType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 70229ee81..9c1970298 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xce\x15\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x9c\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _WORKFLOWTASKFAILEDCAUSE = DESCRIPTOR.enum_types_by_name["WorkflowTaskFailedCause"] @@ -89,6 +89,7 @@ WORKFLOW_TASK_FAILED_CAUSE_BAD_APPEND_STREAM_RECORDS_ATTRIBUTES = 41 WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES = 42 WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE = 43 +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES = 44 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS = 1 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND = 2 @@ -120,15 +121,15 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020FailedCauseProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _WORKFLOWTASKFAILEDCAUSE._serialized_start = 68 - _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2834 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2837 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3157 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3160 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3433 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3436 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3790 - _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3793 - _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4328 - _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4331 - _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4474 + _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2912 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2915 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3235 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3238 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3511 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3514 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3868 + _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3871 + _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4406 + _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4409 + _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4552 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.pyi b/temporalio/api/enums/v1/failed_cause_pb2.pyi index c90da0713..65e359473 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.pyi +++ b/temporalio/api/enums/v1/failed_cause_pb2.pyi @@ -203,6 +203,12 @@ class _WorkflowTaskFailedCauseEnumTypeWrapper( History can no longer be served, for example after truncation or because it exceeds the replay bound. Check the workflow task failure message for more information. """ + WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 44 + """A SubscribeNotificationChannel command named an empty or too-long channel, or hit a + subscription or listener limit. + """ class WorkflowTaskFailedCause( _WorkflowTaskFailedCause, metaclass=_WorkflowTaskFailedCauseEnumTypeWrapper @@ -376,6 +382,12 @@ WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE: ( History can no longer be served, for example after truncation or because it exceeds the replay bound. Check the workflow task failure message for more information. """ +WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 44 +"""A SubscribeNotificationChannel command named an empty or too-long channel, or hit a +subscription or listener limit. +""" global___WorkflowTaskFailedCause = WorkflowTaskFailedCause class _StartChildWorkflowExecutionFailedCause: diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index 13d56f93a..7c765449d 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -55,6 +55,7 @@ WorkflowExecutionUpdateAdmittedEventAttributes, WorkflowExecutionUpdateCompletedEventAttributes, WorkflowExecutionUpdateRejectedEventAttributes, + WorkflowNotificationChannelSubscribedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, WorkflowStreamRecordsAppendedEventAttributes, @@ -123,6 +124,7 @@ "WorkflowExecutionUpdateAdmittedEventAttributes", "WorkflowExecutionUpdateCompletedEventAttributes", "WorkflowExecutionUpdateRejectedEventAttributes", + "WorkflowNotificationChannelSubscribedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", "WorkflowStreamRecordsAppendedEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index 14b3cbfb9..6f482feaf 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -38,6 +38,9 @@ from temporalio.api.failure.v1 import ( message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, ) +from temporalio.api.notification.v1 import ( + message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, +) from temporalio.api.sdk.v1 import ( event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, ) @@ -61,7 +64,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xac\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xc8\x41\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xdd\x42\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -221,6 +224,11 @@ _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowStreamSubscribedEventAttributes" ] +_WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES = ( + DESCRIPTOR.message_types_by_name[ + "WorkflowNotificationChannelSubscribedEventAttributes" + ] +) _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowStreamRecordsAppendedEventAttributes" ] @@ -839,6 +847,19 @@ ) _sym_db.RegisterMessage(WorkflowStreamSubscribedEventAttributes) +WorkflowNotificationChannelSubscribedEventAttributes = ( + _reflection.GeneratedProtocolMessageType( + "WorkflowNotificationChannelSubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributes) + }, + ) +) +_sym_db.RegisterMessage(WorkflowNotificationChannelSubscribedEventAttributes) + WorkflowStreamRecordsAppendedEventAttributes = _reflection.GeneratedProtocolMessageType( "WorkflowStreamRecordsAppendedEventAttributes", (_message.Message,), @@ -1241,144 +1262,146 @@ _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES.fields_by_name[ "operation_id" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 701 - _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3095 - _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3098 - _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3234 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3237 - _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3402 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3405 - _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3624 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3627 - _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3755 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3758 - _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4691 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4694 - _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4866 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4869 - _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5285 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5288 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 5999 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6002 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6151 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6154 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6545 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6548 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7254 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7257 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7543 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7546 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7778 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7781 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8067 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8070 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8268 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8270 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8384 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8387 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8661 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8664 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8811 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8813 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8884 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8887 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9021 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9024 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9223 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9226 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9361 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9364 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9725 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9645 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9725 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9728 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10047 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10050 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10179 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10182 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 745 + _WORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 3139 + _DECLINEDTARGETVERSIONUPGRADE._serialized_start = 3142 + _DECLINEDTARGETVERSIONUPGRADE._serialized_end = 3278 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 3281 + _WORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 3446 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 3449 + _WORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 3668 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 3671 + _WORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 3799 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_start = 3802 + _WORKFLOWEXECUTIONCONTINUEDASNEWEVENTATTRIBUTES._serialized_end = 4735 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 4738 + _WORKFLOWTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 4977 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4980 + _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5396 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5399 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 6110 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6113 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6262 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6265 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6656 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6659 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7365 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7368 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7654 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7657 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7889 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7892 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8178 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8181 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8379 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8381 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8495 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8498 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8772 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8775 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8922 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8924 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8995 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8998 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9132 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9135 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9334 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9337 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9472 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9475 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9836 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9756 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9836 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9839 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10158 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10161 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10290 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10293 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10466 + 10577 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10469 + 10580 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10815 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10818 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11015 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11018 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11397 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11400 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11739 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11742 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 11953 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 11956 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12114 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12117 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12255 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12258 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13534 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13537 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13879 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13882 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14177 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14180 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14505 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14508 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14887 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 14890 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15215 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15218 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15548 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15551 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15827 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15830 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16560 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16410 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16560 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16563 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16883 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16886 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17030 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17032 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17156 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17159 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17310 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17313 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17533 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17536 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17706 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17709 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 17980 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 17983 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18147 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18149 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18243 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18245 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18341 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18344 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18541 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18544 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19108 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19058 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19108 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19111 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19248 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19251 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19388 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19391 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19527 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19530 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19668 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19671 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 19809 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 19811 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 19927 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 19930 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20081 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20084 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20283 - _HISTORYEVENT._serialized_start = 20286 - _HISTORYEVENT._serialized_end = 28678 - _HISTORY._serialized_start = 28680 - _HISTORY._serialized_end = 28744 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10926 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10929 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11126 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11129 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11508 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11511 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11850 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11853 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12064 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12067 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12225 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12228 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12366 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12369 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13645 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13648 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13990 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13993 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14288 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14291 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14616 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14619 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14998 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 15001 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15326 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15329 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15659 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15662 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15938 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15941 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16671 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16521 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16671 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16674 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16994 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16997 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17141 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17143 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17267 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17269 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17382 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17385 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17536 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17539 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17759 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17762 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17932 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17935 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18206 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18209 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18373 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18375 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18469 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18471 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18567 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18570 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18767 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18770 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19334 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19284 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19334 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19337 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19474 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19477 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19614 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19617 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19753 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19756 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19894 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19897 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20035 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20037 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20153 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20156 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20307 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20310 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20509 + _HISTORYEVENT._serialized_start = 20512 + _HISTORYEVENT._serialized_end = 29053 + _HISTORY._serialized_start = 29055 + _HISTORY._serialized_end = 29119 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index bc708a6cb..e25a8450d 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -20,6 +20,7 @@ import temporalio.api.enums.v1.failed_cause_pb2 import temporalio.api.enums.v1.update_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.notification.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.task_complete_metadata_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 @@ -853,6 +854,7 @@ class WorkflowTaskScheduledEventAttributes(google.protobuf.message.Message): TASK_QUEUE_FIELD_NUMBER: builtins.int START_TO_CLOSE_TIMEOUT_FIELD_NUMBER: builtins.int ATTEMPT_FIELD_NUMBER: builtins.int + NOTIFICATIONS_FIELD_NUMBER: builtins.int @property def task_queue(self) -> temporalio.api.taskqueue.v1.message_pb2.TaskQueue: """The task queue this workflow task was enqueued in, which could be a normal or sticky queue""" @@ -865,12 +867,26 @@ class WorkflowTaskScheduledEventAttributes(google.protobuf.message.Message): """ attempt: builtins.int """Starting at 1, how many attempts there have been to complete this task""" + @property + def notifications( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.Notification + ]: + """Notifications for channels this Workflow listens to, folded per channel + since the last task was scheduled. In History so a Workflow may act on + them deterministically and replay sees the same. + """ def __init__( self, *, task_queue: temporalio.api.taskqueue.v1.message_pb2.TaskQueue | None = ..., start_to_close_timeout: google.protobuf.duration_pb2.Duration | None = ..., attempt: builtins.int = ..., + notifications: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.Notification + ] + | None = ..., ) -> None: ... def HasField( self, @@ -886,6 +902,8 @@ class WorkflowTaskScheduledEventAttributes(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "attempt", b"attempt", + "notifications", + b"notifications", "start_to_close_timeout", b"start_to_close_timeout", "task_queue", @@ -3664,6 +3682,39 @@ global___WorkflowStreamSubscribedEventAttributes = ( WorkflowStreamSubscribedEventAttributes ) +class WorkflowNotificationChannelSubscribedEventAttributes( + google.protobuf.message.Message +): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command created this + subscription. + """ + channel: builtins.str + """The channel the Workflow listens on for the rest of this run.""" + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", + b"channel", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowNotificationChannelSubscribedEventAttributes = ( + WorkflowNotificationChannelSubscribedEventAttributes +) + class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4569,6 +4620,7 @@ class HistoryEvent(google.protobuf.message.Message): ) WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int WORKFLOW_STREAM_RECORDS_APPENDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4862,6 +4914,10 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_stream_records_appended_event_attributes( self, ) -> global___WorkflowStreamRecordsAppendedEventAttributes: ... + @property + def workflow_notification_channel_subscribed_event_attributes( + self, + ) -> global___WorkflowNotificationChannelSubscribedEventAttributes: ... def __init__( self, *, @@ -5003,6 +5059,8 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_stream_records_appended_event_attributes: global___WorkflowStreamRecordsAppendedEventAttributes | None = ..., + workflow_notification_channel_subscribed_event_attributes: global___WorkflowNotificationChannelSubscribedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5121,6 +5179,8 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_execution_update_completed_event_attributes", "workflow_execution_update_rejected_event_attributes", b"workflow_execution_update_rejected_event_attributes", + "workflow_notification_channel_subscribed_event_attributes", + b"workflow_notification_channel_subscribed_event_attributes", "workflow_properties_modified_event_attributes", b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", @@ -5272,6 +5332,8 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_execution_update_completed_event_attributes", "workflow_execution_update_rejected_event_attributes", b"workflow_execution_update_rejected_event_attributes", + "workflow_notification_channel_subscribed_event_attributes", + b"workflow_notification_channel_subscribed_event_attributes", "workflow_properties_modified_event_attributes", b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", @@ -5358,6 +5420,7 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_execution_time_skipping_transitioned_event_attributes", "workflow_stream_subscribed_event_attributes", "workflow_stream_records_appended_event_attributes", + "workflow_notification_channel_subscribed_event_attributes", ] | None ): ... diff --git a/temporalio/api/notification/__init__.py b/temporalio/api/notification/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/temporalio/api/notification/v1/__init__.py b/temporalio/api/notification/v1/__init__.py new file mode 100644 index 000000000..bc7da47f6 --- /dev/null +++ b/temporalio/api/notification/v1/__init__.py @@ -0,0 +1,7 @@ +from .message_pb2 import ChannelListener, Notification, WorkflowListener + +__all__ = [ + "ChannelListener", + "Notification", + "WorkflowListener", +] diff --git a/temporalio/api/notification/v1/message_pb2.py b/temporalio/api/notification/v1/message_pb2.py new file mode 100644 index 000000000..d18373de8 --- /dev/null +++ b/temporalio/api/notification/v1/message_pb2.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: temporal/api/notification/v1/message.proto +"""Generated protocol buffer code.""" + +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + +from temporalio.api.common.v1 import ( + message_pb2 as temporal_dot_api_dot_common_dot_v1_dot_message__pb2, +) + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xe0\x01\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\tB\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' +) + + +_NOTIFICATION = DESCRIPTOR.message_types_by_name["Notification"] +_NOTIFICATION_METADATAENTRY = _NOTIFICATION.nested_types_by_name["MetadataEntry"] +_CHANNELLISTENER = DESCRIPTOR.message_types_by_name["ChannelListener"] +_WORKFLOWLISTENER = DESCRIPTOR.message_types_by_name["WorkflowListener"] +Notification = _reflection.GeneratedProtocolMessageType( + "Notification", + (_message.Message,), + { + "MetadataEntry": _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFICATION_METADATAENTRY, + "__module__": "temporalio.api.notification.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notification.v1.Notification.MetadataEntry) + }, + ), + "DESCRIPTOR": _NOTIFICATION, + "__module__": "temporalio.api.notification.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notification.v1.Notification) + }, +) +_sym_db.RegisterMessage(Notification) +_sym_db.RegisterMessage(Notification.MetadataEntry) + +ChannelListener = _reflection.GeneratedProtocolMessageType( + "ChannelListener", + (_message.Message,), + { + "DESCRIPTOR": _CHANNELLISTENER, + "__module__": "temporalio.api.notification.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notification.v1.ChannelListener) + }, +) +_sym_db.RegisterMessage(ChannelListener) + +WorkflowListener = _reflection.GeneratedProtocolMessageType( + "WorkflowListener", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWLISTENER, + "__module__": "temporalio.api.notification.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.notification.v1.WorkflowListener) + }, +) +_sym_db.RegisterMessage(WorkflowListener) + +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b"\n\037io.temporal.api.notification.v1B\014MessageProtoP\001Z/go.temporal.io/api/notification/v1;notification\252\002\036Temporalio.Api.Notification.V1\352\002!Temporalio::Api::Notification::V1" + _NOTIFICATION_METADATAENTRY._options = None + _NOTIFICATION_METADATAENTRY._serialized_options = b"8\001" + _NOTIFICATION._serialized_start = 148 + _NOTIFICATION._serialized_end = 372 + _NOTIFICATION_METADATAENTRY._serialized_start = 292 + _NOTIFICATION_METADATAENTRY._serialized_end = 372 + _CHANNELLISTENER._serialized_start = 375 + _CHANNELLISTENER._serialized_end = 600 + _WORKFLOWLISTENER._serialized_start = 602 + _WORKFLOWLISTENER._serialized_end = 657 +# @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/notification/v1/message_pb2.pyi b/temporalio/api/notification/v1/message_pb2.pyi new file mode 100644 index 000000000..55dd27655 --- /dev/null +++ b/temporalio/api/notification/v1/message_pb2.pyi @@ -0,0 +1,194 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import sys + +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message +import google.protobuf.timestamp_pb2 + +import temporalio.api.common.v1.message_pb2 + +if sys.version_info >= (3, 8): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class Notification(google.protobuf.message.Message): + """A notification tells the listeners of a channel that a source they consume + has moved. It is not data: the listener reads the source itself. A channel + is named by the writer and its listeners; for a stream, the provider formats + the stream's identity into the name. Writers never learn who listens. The + server folds notifications per listener while one is pending and no task has + been scheduled for it, keeping the one with the highest counter. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> temporalio.api.common.v1.message_pb2.Payload: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: temporalio.api.common.v1.message_pb2.Payload | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["value", b"value"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal["key", b"key", "value", b"value"], + ) -> None: ... + + CHANNEL_FIELD_NUMBER: builtins.int + POSITION_FIELD_NUMBER: builtins.int + COUNTER_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + channel: builtins.str + """The channel the writer notified. Listeners register on the same name.""" + position: builtins.bytes + """Where the source stands after the write that caused this notification, + in the writer's terms. Opaque to the server. + """ + counter: builtins.int + """Orders notifications from one channel's writers. The writer derives it + from the position, since only the source can order its positions. Among + notifications folded together, the one with the highest counter is kept. + """ + @property + def metadata( + self, + ) -> google.protobuf.internal.containers.MessageMap[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ]: + """Details for the listener, such as which topic moved. Bounded in size and + carried as payloads, so a codec applies as to any payload. + """ + def __init__( + self, + *, + channel: builtins.str = ..., + position: builtins.bytes = ..., + counter: builtins.int = ..., + metadata: collections.abc.Mapping[ + builtins.str, temporalio.api.common.v1.message_pb2.Payload + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", + b"channel", + "counter", + b"counter", + "metadata", + b"metadata", + "position", + b"position", + ], + ) -> None: ... + +global___Notification = Notification + +class ChannelListener(google.protobuf.message.Message): + """A listener of a channel: a Workflow Execution woken with a Workflow Task, or + a callback the server invokes with each notification. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LISTENER_ID_FIELD_NUMBER: builtins.int + WORKFLOW_FIELD_NUMBER: builtins.int + CALLBACK_FIELD_NUMBER: builtins.int + REGISTERED_TIME_FIELD_NUMBER: builtins.int + listener_id: builtins.str + """Assigned by the server when the listener registers.""" + @property + def workflow(self) -> global___WorkflowListener: ... + @property + def callback(self) -> temporalio.api.common.v1.message_pb2.Callback: ... + @property + def registered_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ... + def __init__( + self, + *, + listener_id: builtins.str = ..., + workflow: global___WorkflowListener | None = ..., + callback: temporalio.api.common.v1.message_pb2.Callback | None = ..., + registered_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "callback", + b"callback", + "listener", + b"listener", + "registered_time", + b"registered_time", + "workflow", + b"workflow", + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "callback", + b"callback", + "listener", + b"listener", + "listener_id", + b"listener_id", + "registered_time", + b"registered_time", + "workflow", + b"workflow", + ], + ) -> None: ... + def WhichOneof( + self, oneof_group: typing_extensions.Literal["listener", b"listener"] + ) -> typing_extensions.Literal["workflow", "callback"] | None: ... + +global___ChannelListener = ChannelListener + +class WorkflowListener(google.protobuf.message.Message): + """A Workflow Execution listening on a channel.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_ID_FIELD_NUMBER: builtins.int + RUN_ID_FIELD_NUMBER: builtins.int + workflow_id: builtins.str + run_id: builtins.str + """The run that subscribed. The server follows a continue-as-new to the + chain's current run when it delivers. + """ + def __init__( + self, + *, + workflow_id: builtins.str = ..., + run_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "run_id", b"run_id", "workflow_id", b"workflow_id" + ], + ) -> None: ... + +global___WorkflowListener = WorkflowListener diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index 1d0703adc..78586c70d 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -2438,6 +2438,10 @@ class Wake(google.protobuf.message.Message): pending and no task has received it yet, so a burst of writes costs one task. Once a task has been handed the wake, a new wake for the source is accepted again, because only the receiver knows what it read. + + Superseded by the notification channel (`NotifyChannel` and the + `SubscribeNotificationChannel` command). Kept for one round and slated for + removal. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/__init__.py b/temporalio/api/workflowservice/v1/__init__.py index 2a3caaf47..5f95a044c 100644 --- a/temporalio/api/workflowservice/v1/__init__.py +++ b/temporalio/api/workflowservice/v1/__init__.py @@ -37,6 +37,8 @@ DescribeActivityExecutionResponse, DescribeBatchOperationRequest, DescribeBatchOperationResponse, + DescribeChannelRequest, + DescribeChannelResponse, DescribeDeploymentRequest, DescribeDeploymentResponse, DescribeNamespaceRequest, @@ -111,6 +113,8 @@ ListWorkflowExecutionsResponse, ListWorkflowRulesRequest, ListWorkflowRulesResponse, + NotifyChannelRequest, + NotifyChannelResponse, PatchScheduleRequest, PatchScheduleResponse, PauseActivityExecutionRequest, @@ -123,6 +127,8 @@ PollActivityExecutionResponse, PollActivityTaskQueueRequest, PollActivityTaskQueueResponse, + PollChannelRequest, + PollChannelResponse, PollNexusOperationExecutionRequest, PollNexusOperationExecutionResponse, PollNexusTaskQueueRequest, @@ -141,6 +147,8 @@ RecordActivityTaskHeartbeatResponse, RecordWorkerHeartbeatRequest, RecordWorkerHeartbeatResponse, + RegisterChannelListenerRequest, + RegisterChannelListenerResponse, RegisterNamespaceRequest, RegisterNamespaceResponse, RequestCancelActivityExecutionRequest, @@ -219,6 +227,8 @@ UnpauseActivityResponse, UnpauseWorkflowExecutionRequest, UnpauseWorkflowExecutionResponse, + UnregisterChannelListenerRequest, + UnregisterChannelListenerResponse, UpdateActivityExecutionOptionsRequest, UpdateActivityExecutionOptionsResponse, UpdateActivityOptionsRequest, @@ -288,6 +298,8 @@ "DescribeActivityExecutionResponse", "DescribeBatchOperationRequest", "DescribeBatchOperationResponse", + "DescribeChannelRequest", + "DescribeChannelResponse", "DescribeDeploymentRequest", "DescribeDeploymentResponse", "DescribeNamespaceRequest", @@ -362,6 +374,8 @@ "ListWorkflowExecutionsResponse", "ListWorkflowRulesRequest", "ListWorkflowRulesResponse", + "NotifyChannelRequest", + "NotifyChannelResponse", "PatchScheduleRequest", "PatchScheduleResponse", "PauseActivityExecutionRequest", @@ -374,6 +388,8 @@ "PollActivityExecutionResponse", "PollActivityTaskQueueRequest", "PollActivityTaskQueueResponse", + "PollChannelRequest", + "PollChannelResponse", "PollNexusOperationExecutionRequest", "PollNexusOperationExecutionResponse", "PollNexusTaskQueueRequest", @@ -392,6 +408,8 @@ "RecordActivityTaskHeartbeatResponse", "RecordWorkerHeartbeatRequest", "RecordWorkerHeartbeatResponse", + "RegisterChannelListenerRequest", + "RegisterChannelListenerResponse", "RegisterNamespaceRequest", "RegisterNamespaceResponse", "RequestCancelActivityExecutionRequest", @@ -470,6 +488,8 @@ "UnpauseActivityResponse", "UnpauseWorkflowExecutionRequest", "UnpauseWorkflowExecutionResponse", + "UnregisterChannelListenerRequest", + "UnregisterChannelListenerResponse", "UpdateActivityExecutionOptionsRequest", "UpdateActivityExecutionOptionsResponse", "UpdateActivityOptionsRequest", diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index fa34931d7..a2a505cfe 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.notification.v1 import ( + message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, +) from temporalio.api.protocol.v1 import ( message_pb2 as temporal_dot_api_dot_protocol_dot_v1_dot_message__pb2, ) @@ -134,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\x91\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\x9e\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"m\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"#\n!UnregisterChannelListenerResponse"\x93\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"<\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\xaf\x01\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -276,6 +279,24 @@ _WAKEWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ "WakeWorkflowExecutionResponse" ] +_NOTIFYCHANNELREQUEST = DESCRIPTOR.message_types_by_name["NotifyChannelRequest"] +_NOTIFYCHANNELRESPONSE = DESCRIPTOR.message_types_by_name["NotifyChannelResponse"] +_REGISTERCHANNELLISTENERREQUEST = DESCRIPTOR.message_types_by_name[ + "RegisterChannelListenerRequest" +] +_REGISTERCHANNELLISTENERRESPONSE = DESCRIPTOR.message_types_by_name[ + "RegisterChannelListenerResponse" +] +_UNREGISTERCHANNELLISTENERREQUEST = DESCRIPTOR.message_types_by_name[ + "UnregisterChannelListenerRequest" +] +_UNREGISTERCHANNELLISTENERRESPONSE = DESCRIPTOR.message_types_by_name[ + "UnregisterChannelListenerResponse" +] +_POLLCHANNELREQUEST = DESCRIPTOR.message_types_by_name["PollChannelRequest"] +_POLLCHANNELRESPONSE = DESCRIPTOR.message_types_by_name["PollChannelResponse"] +_DESCRIBECHANNELREQUEST = DESCRIPTOR.message_types_by_name["DescribeChannelRequest"] +_DESCRIBECHANNELRESPONSE = DESCRIPTOR.message_types_by_name["DescribeChannelResponse"] _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ "SignalWithStartWorkflowExecutionRequest" ] @@ -1466,6 +1487,116 @@ ) _sym_db.RegisterMessage(WakeWorkflowExecutionResponse) +NotifyChannelRequest = _reflection.GeneratedProtocolMessageType( + "NotifyChannelRequest", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYCHANNELREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.NotifyChannelRequest) + }, +) +_sym_db.RegisterMessage(NotifyChannelRequest) + +NotifyChannelResponse = _reflection.GeneratedProtocolMessageType( + "NotifyChannelResponse", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFYCHANNELRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.NotifyChannelResponse) + }, +) +_sym_db.RegisterMessage(NotifyChannelResponse) + +RegisterChannelListenerRequest = _reflection.GeneratedProtocolMessageType( + "RegisterChannelListenerRequest", + (_message.Message,), + { + "DESCRIPTOR": _REGISTERCHANNELLISTENERREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.RegisterChannelListenerRequest) + }, +) +_sym_db.RegisterMessage(RegisterChannelListenerRequest) + +RegisterChannelListenerResponse = _reflection.GeneratedProtocolMessageType( + "RegisterChannelListenerResponse", + (_message.Message,), + { + "DESCRIPTOR": _REGISTERCHANNELLISTENERRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.RegisterChannelListenerResponse) + }, +) +_sym_db.RegisterMessage(RegisterChannelListenerResponse) + +UnregisterChannelListenerRequest = _reflection.GeneratedProtocolMessageType( + "UnregisterChannelListenerRequest", + (_message.Message,), + { + "DESCRIPTOR": _UNREGISTERCHANNELLISTENERREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.UnregisterChannelListenerRequest) + }, +) +_sym_db.RegisterMessage(UnregisterChannelListenerRequest) + +UnregisterChannelListenerResponse = _reflection.GeneratedProtocolMessageType( + "UnregisterChannelListenerResponse", + (_message.Message,), + { + "DESCRIPTOR": _UNREGISTERCHANNELLISTENERRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.UnregisterChannelListenerResponse) + }, +) +_sym_db.RegisterMessage(UnregisterChannelListenerResponse) + +PollChannelRequest = _reflection.GeneratedProtocolMessageType( + "PollChannelRequest", + (_message.Message,), + { + "DESCRIPTOR": _POLLCHANNELREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.PollChannelRequest) + }, +) +_sym_db.RegisterMessage(PollChannelRequest) + +PollChannelResponse = _reflection.GeneratedProtocolMessageType( + "PollChannelResponse", + (_message.Message,), + { + "DESCRIPTOR": _POLLCHANNELRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.PollChannelResponse) + }, +) +_sym_db.RegisterMessage(PollChannelResponse) + +DescribeChannelRequest = _reflection.GeneratedProtocolMessageType( + "DescribeChannelRequest", + (_message.Message,), + { + "DESCRIPTOR": _DESCRIBECHANNELREQUEST, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.DescribeChannelRequest) + }, +) +_sym_db.RegisterMessage(DescribeChannelRequest) + +DescribeChannelResponse = _reflection.GeneratedProtocolMessageType( + "DescribeChannelResponse", + (_message.Message,), + { + "DESCRIPTOR": _DESCRIBECHANNELRESPONSE, + "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.DescribeChannelResponse) + }, +) +_sym_db.RegisterMessage(DescribeChannelResponse) + SignalWithStartWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( "SignalWithStartWorkflowExecutionRequest", (_message.Message,), @@ -4245,582 +4376,602 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1684 - _REGISTERNAMESPACEREQUEST._serialized_end = 2332 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2289 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2332 - _REGISTERNAMESPACERESPONSE._serialized_start = 2334 - _REGISTERNAMESPACERESPONSE._serialized_end = 2361 - _LISTNAMESPACESREQUEST._serialized_start = 2364 - _LISTNAMESPACESREQUEST._serialized_end = 2501 - _LISTNAMESPACESRESPONSE._serialized_start = 2504 - _LISTNAMESPACESRESPONSE._serialized_end = 2633 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2635 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2718 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2721 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3234 - _UPDATENAMESPACEREQUEST._serialized_start = 3237 - _UPDATENAMESPACEREQUEST._serialized_end = 3572 - _UPDATENAMESPACERESPONSE._serialized_start = 3575 - _UPDATENAMESPACERESPONSE._serialized_end = 3866 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3868 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3938 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3940 - _DEPRECATENAMESPACERESPONSE._serialized_end = 3968 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 3971 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5588 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5591 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5889 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5892 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6190 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6193 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6379 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6382 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6558 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6560 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6680 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6683 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7123 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7126 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8320 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8236 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8320 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8323 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9661 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9495 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9590 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9592 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9661 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9909 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9912 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10437 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10439 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10474 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10477 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10963 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10966 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12147 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12150 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12315 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12317 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12429 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12432 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12639 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12641 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12757 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12760 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13142 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13144 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13182 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13185 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13392 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13394 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13436 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13439 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13885 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13887 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13974 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13977 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14248 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14250 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14341 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14344 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14726 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14728 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14765 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14768 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15056 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15058 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15099 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15102 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15362 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15364 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15404 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15407 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15757 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15759 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15836 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15839 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16023 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16025 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16088 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 16091 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 17430 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 17433 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 17591 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 17594 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 18043 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 18045 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 18093 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 18096 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 18383 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18385 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18421 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 18423 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 18545 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 18547 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 18580 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 18583 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 18912 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 18915 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19045 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19048 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19442 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19445 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19577 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 19579 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 19688 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19690 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 19816 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 19818 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 19935 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 19938 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20072 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 20074 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 20183 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20185 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20311 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20313 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20379 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20382 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20619 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 20621 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 20649 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 20652 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 20853 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 20769 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 20853 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 20856 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 21217 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 21219 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 21254 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 21256 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 21366 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 21368 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 21398 - _SHUTDOWNWORKERREQUEST._serialized_start = 21401 - _SHUTDOWNWORKERREQUEST._serialized_end = 21684 - _SHUTDOWNWORKERRESPONSE._serialized_start = 21686 - _SHUTDOWNWORKERRESPONSE._serialized_end = 21710 - _QUERYWORKFLOWREQUEST._serialized_start = 21713 - _QUERYWORKFLOWREQUEST._serialized_end = 21946 - _QUERYWORKFLOWRESPONSE._serialized_start = 21949 - _QUERYWORKFLOWRESPONSE._serialized_end = 22134 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 22136 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 22251 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 22254 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 22919 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 22922 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 23450 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 23453 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 24457 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 24137 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 24237 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 24239 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 24355 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 24357 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 24457 - _GETCLUSTERINFOREQUEST._serialized_start = 24459 - _GETCLUSTERINFOREQUEST._serialized_end = 24482 - _GETCLUSTERINFORESPONSE._serialized_start = 24485 - _GETCLUSTERINFORESPONSE._serialized_end = 24950 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 24895 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 24950 - _GETSYSTEMINFOREQUEST._serialized_start = 24952 - _GETSYSTEMINFOREQUEST._serialized_end = 24974 - _GETSYSTEMINFORESPONSE._serialized_start = 24977 - _GETSYSTEMINFORESPONSE._serialized_end = 25554 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 25118 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 25554 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 25556 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 25665 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 25668 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 25891 - _CREATESCHEDULEREQUEST._serialized_start = 25894 - _CREATESCHEDULEREQUEST._serialized_end = 26226 - _CREATESCHEDULERESPONSE._serialized_start = 26228 - _CREATESCHEDULERESPONSE._serialized_end = 26276 - _DESCRIBESCHEDULEREQUEST._serialized_start = 26278 - _DESCRIBESCHEDULEREQUEST._serialized_end = 26343 - _DESCRIBESCHEDULERESPONSE._serialized_start = 26346 - _DESCRIBESCHEDULERESPONSE._serialized_end = 26617 - _UPDATESCHEDULEREQUEST._serialized_start = 26620 - _UPDATESCHEDULEREQUEST._serialized_end = 26912 - _UPDATESCHEDULERESPONSE._serialized_start = 26914 - _UPDATESCHEDULERESPONSE._serialized_end = 26938 - _PATCHSCHEDULEREQUEST._serialized_start = 26941 - _PATCHSCHEDULEREQUEST._serialized_end = 27097 - _PATCHSCHEDULERESPONSE._serialized_start = 27099 - _PATCHSCHEDULERESPONSE._serialized_end = 27122 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 27125 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 27293 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 27295 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 27378 - _DELETESCHEDULEREQUEST._serialized_start = 27380 - _DELETESCHEDULEREQUEST._serialized_end = 27461 - _DELETESCHEDULERESPONSE._serialized_start = 27463 - _DELETESCHEDULERESPONSE._serialized_end = 27487 - _LISTSCHEDULESREQUEST._serialized_start = 27489 - _LISTSCHEDULESREQUEST._serialized_end = 27597 - _LISTSCHEDULESRESPONSE._serialized_start = 27599 - _LISTSCHEDULESRESPONSE._serialized_end = 27711 - _COUNTSCHEDULESREQUEST._serialized_start = 27713 - _COUNTSCHEDULESREQUEST._serialized_end = 27770 - _COUNTSCHEDULESRESPONSE._serialized_start = 27773 - _COUNTSCHEDULESRESPONSE._serialized_end = 27992 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 27995 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28641 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 28442 + _REGISTERNAMESPACEREQUEST._serialized_start = 1728 + _REGISTERNAMESPACEREQUEST._serialized_end = 2376 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2333 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2376 + _REGISTERNAMESPACERESPONSE._serialized_start = 2378 + _REGISTERNAMESPACERESPONSE._serialized_end = 2405 + _LISTNAMESPACESREQUEST._serialized_start = 2408 + _LISTNAMESPACESREQUEST._serialized_end = 2545 + _LISTNAMESPACESRESPONSE._serialized_start = 2548 + _LISTNAMESPACESRESPONSE._serialized_end = 2677 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2679 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2762 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2765 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3278 + _UPDATENAMESPACEREQUEST._serialized_start = 3281 + _UPDATENAMESPACEREQUEST._serialized_end = 3616 + _UPDATENAMESPACERESPONSE._serialized_start = 3619 + _UPDATENAMESPACERESPONSE._serialized_end = 3910 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3912 + _DEPRECATENAMESPACEREQUEST._serialized_end = 3982 + _DEPRECATENAMESPACERESPONSE._serialized_start = 3984 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4012 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4015 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5632 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5635 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5933 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5936 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6234 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6237 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6423 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6426 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6602 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6604 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6724 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8364 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8280 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8364 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8367 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9705 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9539 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9634 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9636 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9705 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9708 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9953 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9956 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10481 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10483 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10518 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10521 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11007 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11010 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12191 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12194 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12359 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12361 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12473 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12476 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12683 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12685 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12801 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12804 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13186 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13188 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13226 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13229 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13436 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13438 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13480 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13483 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13929 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13931 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14018 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14021 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14292 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14294 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14385 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14388 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14770 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14772 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14809 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14812 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15100 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15102 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15143 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15146 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15406 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15408 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15448 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15451 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15801 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15803 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15880 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15883 + _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16067 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16069 + _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16132 + _NOTIFYCHANNELREQUEST._serialized_start = 16135 + _NOTIFYCHANNELREQUEST._serialized_end = 16280 + _NOTIFYCHANNELRESPONSE._serialized_start = 16282 + _NOTIFYCHANNELRESPONSE._serialized_end = 16329 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16332 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16490 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16492 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16546 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16548 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16657 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16659 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16694 + _POLLCHANNELREQUEST._serialized_start = 16697 + _POLLCHANNELREQUEST._serialized_end = 16844 + _POLLCHANNELRESPONSE._serialized_start = 16846 + _POLLCHANNELRESPONSE._serialized_end = 16934 + _DESCRIBECHANNELREQUEST._serialized_start = 16936 + _DESCRIBECHANNELREQUEST._serialized_end = 16996 + _DESCRIBECHANNELRESPONSE._serialized_start = 16999 + _DESCRIBECHANNELRESPONSE._serialized_end = 17174 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17177 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18516 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18519 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18677 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18680 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19129 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19131 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19179 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19182 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19469 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19471 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19507 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19509 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19631 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19633 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19666 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19669 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 19998 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20001 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20131 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20134 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20528 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20531 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20663 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20665 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20774 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20776 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20902 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20904 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21021 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21024 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21158 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21160 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21269 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21271 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21397 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21399 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21465 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21468 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21705 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21707 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21735 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21738 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 21939 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 21855 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 21939 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 21942 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22303 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22305 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22340 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22342 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22452 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22454 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22484 + _SHUTDOWNWORKERREQUEST._serialized_start = 22487 + _SHUTDOWNWORKERREQUEST._serialized_end = 22770 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22772 + _SHUTDOWNWORKERRESPONSE._serialized_end = 22796 + _QUERYWORKFLOWREQUEST._serialized_start = 22799 + _QUERYWORKFLOWREQUEST._serialized_end = 23032 + _QUERYWORKFLOWRESPONSE._serialized_start = 23035 + _QUERYWORKFLOWRESPONSE._serialized_end = 23220 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23222 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23337 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23340 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24005 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24008 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24536 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24539 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25543 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25325 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25441 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25443 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25543 + _GETCLUSTERINFOREQUEST._serialized_start = 25545 + _GETCLUSTERINFOREQUEST._serialized_end = 25568 + _GETCLUSTERINFORESPONSE._serialized_start = 25571 + _GETCLUSTERINFORESPONSE._serialized_end = 26036 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 25981 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26036 + _GETSYSTEMINFOREQUEST._serialized_start = 26038 + _GETSYSTEMINFOREQUEST._serialized_end = 26060 + _GETSYSTEMINFORESPONSE._serialized_start = 26063 + _GETSYSTEMINFORESPONSE._serialized_end = 26640 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26204 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26640 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26642 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26751 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26754 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 26977 + _CREATESCHEDULEREQUEST._serialized_start = 26980 + _CREATESCHEDULEREQUEST._serialized_end = 27312 + _CREATESCHEDULERESPONSE._serialized_start = 27314 + _CREATESCHEDULERESPONSE._serialized_end = 27362 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27364 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27429 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27432 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27703 + _UPDATESCHEDULEREQUEST._serialized_start = 27706 + _UPDATESCHEDULEREQUEST._serialized_end = 27998 + _UPDATESCHEDULERESPONSE._serialized_start = 28000 + _UPDATESCHEDULERESPONSE._serialized_end = 28024 + _PATCHSCHEDULEREQUEST._serialized_start = 28027 + _PATCHSCHEDULEREQUEST._serialized_end = 28183 + _PATCHSCHEDULERESPONSE._serialized_start = 28185 + _PATCHSCHEDULERESPONSE._serialized_end = 28208 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28211 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28379 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28381 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28464 + _DELETESCHEDULEREQUEST._serialized_start = 28466 + _DELETESCHEDULEREQUEST._serialized_end = 28547 + _DELETESCHEDULERESPONSE._serialized_start = 28549 + _DELETESCHEDULERESPONSE._serialized_end = 28573 + _LISTSCHEDULESREQUEST._serialized_start = 28575 + _LISTSCHEDULESREQUEST._serialized_end = 28683 + _LISTSCHEDULESRESPONSE._serialized_start = 28685 + _LISTSCHEDULESRESPONSE._serialized_end = 28797 + _COUNTSCHEDULESREQUEST._serialized_start = 28799 + _COUNTSCHEDULESREQUEST._serialized_end = 28856 + _COUNTSCHEDULESRESPONSE._serialized_start = 28859 + _COUNTSCHEDULESRESPONSE._serialized_end = 29078 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29081 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29727 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29528 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 28553 + 29639 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 28555 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 28628 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28643 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28707 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 28709 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 28804 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 28806 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 28922 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 28925 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 30642 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 29977 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29641 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29714 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29729 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29793 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29795 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29890 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29892 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30008 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30011 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31728 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31063 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 30090 + 31176 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 30093 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31179 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 30222 + 31308 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 30224 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31310 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 30288 + 31374 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30290 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30396 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30398 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30508 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 30510 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 30572 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 30574 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 30629 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 30645 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 30897 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 30899 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 30971 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 30974 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 31223 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 31226 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 31382 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 31384 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 31498 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 31501 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 31762 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 31765 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 32024 - _STARTBATCHOPERATIONREQUEST._serialized_start = 32027 - _STARTBATCHOPERATIONREQUEST._serialized_end = 33393 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 33395 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 33424 - _STOPBATCHOPERATIONREQUEST._serialized_start = 33426 - _STOPBATCHOPERATIONREQUEST._serialized_end = 33522 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 33524 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 33552 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 33554 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 33620 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 33623 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 34095 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 34097 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 34188 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 34190 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 34311 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 34314 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 34499 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 34502 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 34721 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 34724 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 35140 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 35143 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 35497 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 35500 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 35667 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 35669 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 35704 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 35707 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 35927 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 35929 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 35961 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 35964 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 36336 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 36130 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 36336 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 36339 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 36671 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 36465 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 36671 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 36674 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 37010 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 37013 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 37332 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 37334 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 37434 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 37436 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 37545 - _PAUSEACTIVITYREQUEST._serialized_start = 37548 - _PAUSEACTIVITYREQUEST._serialized_end = 37747 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 37750 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 37933 - _PAUSEACTIVITYRESPONSE._serialized_start = 37935 - _PAUSEACTIVITYRESPONSE._serialized_end = 37958 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 37960 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 37992 - _UNPAUSEACTIVITYREQUEST._serialized_start = 37995 - _UNPAUSEACTIVITYREQUEST._serialized_end = 38275 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38278 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 38551 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 38553 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 38578 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 38580 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 38614 - _RESETACTIVITYREQUEST._serialized_start = 38617 - _RESETACTIVITYREQUEST._serialized_end = 38924 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 38927 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 39217 - _RESETACTIVITYRESPONSE._serialized_start = 39219 - _RESETACTIVITYRESPONSE._serialized_end = 39242 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 39244 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 39276 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 39279 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 39563 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 39566 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 39743 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 39745 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 39851 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 39853 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 39950 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 39953 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 40147 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 40150 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 40802 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 40411 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 40802 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 24137 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 24237 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 40804 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 40881 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 40884 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 41024 - _LISTDEPLOYMENTSREQUEST._serialized_start = 41026 - _LISTDEPLOYMENTSREQUEST._serialized_end = 41134 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 41136 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 41255 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 41258 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 41463 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 41466 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 41651 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 41654 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 41883 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 41886 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 42077 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 42080 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 42329 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 42332 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 42556 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 42558 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 42671 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 42673 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 42729 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 42731 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 42824 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 42827 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 43498 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 43002 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 43498 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43501 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43741 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43743 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 43782 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 43785 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 43985 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 43987 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44026 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 44028 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 44121 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 44123 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 44155 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44158 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 44674 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44551 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44674 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 44676 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 44728 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 44731 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45231 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 44551 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 44674 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45233 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45287 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 45290 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 45708 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 45623 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31376 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31482 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31484 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31594 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31596 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31658 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31660 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31715 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31731 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 31983 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 31985 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32057 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32060 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32309 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32312 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32468 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32470 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32584 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32587 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 32848 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 32851 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33110 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33113 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34479 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34481 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34510 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34512 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34608 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34610 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34638 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34640 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34706 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34709 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35181 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35183 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35274 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35276 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35397 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35400 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35585 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35588 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35807 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35810 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36226 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36229 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36583 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36586 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36753 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36755 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36790 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36793 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37013 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37015 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37047 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37050 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37422 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37216 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37422 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37425 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37757 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37551 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37757 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37760 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38096 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38099 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38418 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38420 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38520 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38522 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38631 + _PAUSEACTIVITYREQUEST._serialized_start = 38634 + _PAUSEACTIVITYREQUEST._serialized_end = 38833 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38836 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39019 + _PAUSEACTIVITYRESPONSE._serialized_start = 39021 + _PAUSEACTIVITYRESPONSE._serialized_end = 39044 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39046 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39078 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39081 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39361 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39364 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39637 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39639 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39664 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39666 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39700 + _RESETACTIVITYREQUEST._serialized_start = 39703 + _RESETACTIVITYREQUEST._serialized_end = 40010 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40013 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40303 + _RESETACTIVITYRESPONSE._serialized_start = 40305 + _RESETACTIVITYRESPONSE._serialized_end = 40328 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40330 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40362 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40365 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40649 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40652 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 40829 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 40831 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 40937 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 40939 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41036 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41039 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41233 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41236 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 41888 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41497 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 41888 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 41890 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 41967 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 41970 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42110 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42112 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42220 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42222 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42341 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42344 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42549 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42552 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42737 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42740 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 42969 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 42972 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43163 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43166 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43415 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43418 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43642 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43644 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43757 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43759 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43815 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43817 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 43910 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 43913 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44584 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44088 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44584 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44587 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44827 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 44829 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44868 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44871 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45071 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45073 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45112 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45114 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45207 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45209 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45241 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45244 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45760 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45762 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45814 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45817 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46317 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46319 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46373 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46376 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46794 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46709 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 45708 + 46794 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 45710 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 45820 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 45823 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 46012 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 46014 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 46113 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 46115 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 46184 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 46186 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 46293 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 46295 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 46408 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 46411 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 46638 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 46641 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 46821 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 46823 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 46918 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 46920 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 46985 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 46987 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 47068 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 47070 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 47133 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 47135 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 47163 - _LISTWORKFLOWRULESREQUEST._serialized_start = 47165 - _LISTWORKFLOWRULESREQUEST._serialized_end = 47235 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 47237 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 47341 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 47344 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 47550 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 47552 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 47598 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 47601 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 47756 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 47758 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 47789 - _LISTWORKERSREQUEST._serialized_start = 47792 - _LISTWORKERSREQUEST._serialized_end = 47922 - _LISTWORKERSRESPONSE._serialized_start = 47925 - _LISTWORKERSRESPONSE._serialized_end = 48090 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 48093 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 48818 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 48660 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 48751 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46796 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 46906 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 46909 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47098 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47100 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47199 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47201 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47270 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47272 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47379 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47381 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47494 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47497 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47724 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47727 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 47907 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 47909 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48004 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48006 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48071 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48073 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48154 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48156 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48219 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48221 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48249 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48251 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48321 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48323 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48427 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48430 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48636 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48638 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48684 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48687 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 48842 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 48844 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 48875 + _LISTWORKERSREQUEST._serialized_start = 48878 + _LISTWORKERSREQUEST._serialized_end = 49008 + _LISTWORKERSRESPONSE._serialized_start = 49011 + _LISTWORKERSRESPONSE._serialized_end = 49176 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49179 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 49904 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49746 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 49837 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 48753 + 49839 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 48818 + 49904 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 48820 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 48911 - _FETCHWORKERCONFIGREQUEST._serialized_start = 48914 - _FETCHWORKERCONFIGREQUEST._serialized_end = 49072 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 49074 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 49159 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 49162 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 49428 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 49430 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 49530 - _DESCRIBEWORKERREQUEST._serialized_start = 49532 - _DESCRIBEWORKERREQUEST._serialized_end = 49603 - _DESCRIBEWORKERRESPONSE._serialized_start = 49605 - _DESCRIBEWORKERRESPONSE._serialized_end = 49686 - _COUNTWORKERSREQUEST._serialized_start = 49688 - _COUNTWORKERSREQUEST._serialized_end = 49775 - _COUNTWORKERSRESPONSE._serialized_start = 49777 - _COUNTWORKERSRESPONSE._serialized_end = 49814 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49817 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 49958 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 49960 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 49992 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 49995 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 50138 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 50140 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 50174 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 50177 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 51354 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 51356 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 51465 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 51468 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 51696 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 51699 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 52015 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 52017 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 52103 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 52105 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 52221 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 52223 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 52332 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 52335 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 52465 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 52468 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53317 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 53267 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 53317 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53319 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53390 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53393 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 53563 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 53566 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 53877 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53880 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54041 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54044 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54305 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54307 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54422 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54425 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 54564 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 54566 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 54632 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 54635 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54872 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 54874 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 54946 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 54949 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55198 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 20531 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 20619 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 55201 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 55350 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 55352 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 55392 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 55395 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 55540 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 55542 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 55578 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 55580 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 55668 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 55670 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 55703 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55706 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55862 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55864 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55910 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55913 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56065 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56067 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56109 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56111 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56206 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56208 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56247 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 56250 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 56407 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 56410 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 56642 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 49906 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 49997 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50000 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50158 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50160 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50245 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50248 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50514 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50516 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50616 + _DESCRIBEWORKERREQUEST._serialized_start = 50618 + _DESCRIBEWORKERREQUEST._serialized_end = 50689 + _DESCRIBEWORKERRESPONSE._serialized_start = 50691 + _DESCRIBEWORKERRESPONSE._serialized_end = 50772 + _COUNTWORKERSREQUEST._serialized_start = 50774 + _COUNTWORKERSREQUEST._serialized_end = 50861 + _COUNTWORKERSRESPONSE._serialized_start = 50863 + _COUNTWORKERSRESPONSE._serialized_end = 50900 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 50903 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51044 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51046 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51078 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51081 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51224 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51226 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51260 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51263 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52440 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52442 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52551 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52554 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52782 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52785 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53101 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53103 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53189 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53191 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53307 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53309 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53418 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53421 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53551 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53554 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54403 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54353 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54403 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54405 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54476 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54479 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54649 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54652 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54963 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54966 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55127 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55130 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55391 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55393 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55508 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55511 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55650 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55652 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55718 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55721 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 55958 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55960 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56032 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56035 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56284 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56287 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56436 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56438 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56478 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56481 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56626 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56628 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56664 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56666 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56754 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56756 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56789 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56792 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56948 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56950 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56996 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56999 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57151 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57153 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57195 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57197 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57292 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57294 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57333 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57336 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57493 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57496 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57728 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index ef9e22312..381e1f4e0 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -38,6 +38,7 @@ import temporalio.api.filter.v1.message_pb2 import temporalio.api.history.v1.message_pb2 import temporalio.api.namespace.v1.message_pb2 import temporalio.api.nexus.v1.message_pb2 +import temporalio.api.notification.v1.message_pb2 import temporalio.api.protocol.v1.message_pb2 import temporalio.api.query.v1.message_pb2 import temporalio.api.replication.v1.message_pb2 @@ -3412,6 +3413,321 @@ class WakeWorkflowExecutionResponse(google.protobuf.message.Message): global___WakeWorkflowExecutionResponse = WakeWorkflowExecutionResponse +class NotifyChannelRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + NOTIFICATION_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int + namespace: builtins.str + @property + def notification( + self, + ) -> temporalio.api.notification.v1.message_pb2.Notification: ... + identity: builtins.str + """The identity of the writer, for metrics and logs.""" + request_id: builtins.str + """Used to de-dupe a retried notification.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + notification: temporalio.api.notification.v1.message_pb2.Notification + | None = ..., + identity: builtins.str = ..., + request_id: builtins.str = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["notification", b"notification"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "identity", + b"identity", + "namespace", + b"namespace", + "notification", + b"notification", + "request_id", + b"request_id", + ], + ) -> None: ... + +global___NotifyChannelRequest = NotifyChannelRequest + +class NotifyChannelResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LISTENER_COUNT_FIELD_NUMBER: builtins.int + listener_count: builtins.int + """Listeners registered when the notification was accepted. Zero means the + notification was retained for pollers and woke nobody. + """ + def __init__( + self, + *, + listener_count: builtins.int = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["listener_count", b"listener_count"] + ) -> None: ... + +global___NotifyChannelResponse = NotifyChannelResponse + +class RegisterChannelListenerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + CALLBACK_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + namespace: builtins.str + channel: builtins.str + @property + def callback(self) -> temporalio.api.common.v1.message_pb2.Callback: + """Invoked with each notification on the channel.""" + request_id: builtins.str + """Used to de-dupe a retried registration.""" + identity: builtins.str + """The identity of the caller, for metrics and logs.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + channel: builtins.str = ..., + callback: temporalio.api.common.v1.message_pb2.Callback | None = ..., + request_id: builtins.str = ..., + identity: builtins.str = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["callback", b"callback"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "callback", + b"callback", + "channel", + b"channel", + "identity", + b"identity", + "namespace", + b"namespace", + "request_id", + b"request_id", + ], + ) -> None: ... + +global___RegisterChannelListenerRequest = RegisterChannelListenerRequest + +class RegisterChannelListenerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LISTENER_ID_FIELD_NUMBER: builtins.int + listener_id: builtins.str + def __init__( + self, + *, + listener_id: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["listener_id", b"listener_id"] + ) -> None: ... + +global___RegisterChannelListenerResponse = RegisterChannelListenerResponse + +class UnregisterChannelListenerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + LISTENER_ID_FIELD_NUMBER: builtins.int + IDENTITY_FIELD_NUMBER: builtins.int + namespace: builtins.str + channel: builtins.str + listener_id: builtins.str + identity: builtins.str + """The identity of the caller, for metrics and logs.""" + def __init__( + self, + *, + namespace: builtins.str = ..., + channel: builtins.str = ..., + listener_id: builtins.str = ..., + identity: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", + b"channel", + "identity", + b"identity", + "listener_id", + b"listener_id", + "namespace", + b"namespace", + ], + ) -> None: ... + +global___UnregisterChannelListenerRequest = UnregisterChannelListenerRequest + +class UnregisterChannelListenerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___UnregisterChannelListenerResponse = UnregisterChannelListenerResponse + +class PollChannelRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + AFTER_COUNTER_FIELD_NUMBER: builtins.int + WAIT_FIELD_NUMBER: builtins.int + MAX_NOTIFICATIONS_FIELD_NUMBER: builtins.int + namespace: builtins.str + channel: builtins.str + after_counter: builtins.int + """Only notifications with a counter above this one are returned. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "after" names the exclusive lower bound. --) + """ + @property + def wait(self) -> google.protobuf.duration_pb2.Duration: + """How long to wait for a notification when none is retained above + `after_counter`. + """ + max_notifications: builtins.int + """At most this many notifications are returned. Zero means the server's + default. + """ + def __init__( + self, + *, + namespace: builtins.str = ..., + channel: builtins.str = ..., + after_counter: builtins.int = ..., + wait: google.protobuf.duration_pb2.Duration | None = ..., + max_notifications: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["wait", b"wait"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "after_counter", + b"after_counter", + "channel", + b"channel", + "max_notifications", + b"max_notifications", + "namespace", + b"namespace", + "wait", + b"wait", + ], + ) -> None: ... + +global___PollChannelRequest = PollChannelRequest + +class PollChannelResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NOTIFICATIONS_FIELD_NUMBER: builtins.int + @property + def notifications( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.Notification + ]: ... + def __init__( + self, + *, + notifications: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.Notification + ] + | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["notifications", b"notifications"] + ) -> None: ... + +global___PollChannelResponse = PollChannelResponse + +class DescribeChannelRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAMESPACE_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + namespace: builtins.str + channel: builtins.str + def __init__( + self, + *, + namespace: builtins.str = ..., + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", b"channel", "namespace", b"namespace" + ], + ) -> None: ... + +global___DescribeChannelRequest = DescribeChannelRequest + +class DescribeChannelResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LISTENERS_FIELD_NUMBER: builtins.int + LATEST_FIELD_NUMBER: builtins.int + RETAINED_COUNT_FIELD_NUMBER: builtins.int + @property + def listeners( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.ChannelListener + ]: ... + @property + def latest(self) -> temporalio.api.notification.v1.message_pb2.Notification: + """The notification with the highest counter the channel retains.""" + retained_count: builtins.int + """How many notifications the channel retains for pollers.""" + def __init__( + self, + *, + listeners: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.ChannelListener + ] + | None = ..., + latest: temporalio.api.notification.v1.message_pb2.Notification | None = ..., + retained_count: builtins.int = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["latest", b"latest"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "latest", + b"latest", + "listeners", + b"listeners", + "retained_count", + b"retained_count", + ], + ) -> None: ... + +global___DescribeChannelResponse = DescribeChannelResponse + class SignalWithStartWorkflowExecutionRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index 6107f7a24..aec338a11 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xa0\xb5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\x8e\xc0\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\x97\x02\n\rNotifyChannel\x12\x35.temporal.api.workflowservice.v1.NotifyChannelRequest\x1a\x36.temporal.api.workflowservice.v1.NotifyChannelResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*\x12\xa0\x02\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\x81\x01\x82\xd3\xe4\x93\x02{"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*\x12\xbd\x02\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\x98\x01\x82\xd3\xe4\x93\x02\x91\x01*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}\x12\xfe\x01\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notifications\x12\xed\x01\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -139,6 +139,26 @@ _WORKFLOWSERVICE.methods_by_name[ "WakeWorkflowExecution" ]._serialized_options = b'\202\323\344\223\002\241\001"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*' + _WORKFLOWSERVICE.methods_by_name["NotifyChannel"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "NotifyChannel" + ]._serialized_options = b'\202\323\344\223\002\217\001">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*' + _WORKFLOWSERVICE.methods_by_name["RegisterChannelListener"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "RegisterChannelListener" + ]._serialized_options = b'\202\323\344\223\002{"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*' + _WORKFLOWSERVICE.methods_by_name["UnregisterChannelListener"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "UnregisterChannelListener" + ]._serialized_options = b"\202\323\344\223\002\221\001*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}" + _WORKFLOWSERVICE.methods_by_name["PollChannel"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "PollChannel" + ]._serialized_options = b"\202\323\344\223\002}\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notifications" + _WORKFLOWSERVICE.methods_by_name["DescribeChannel"]._options = None + _WORKFLOWSERVICE.methods_by_name[ + "DescribeChannel" + ]._serialized_options = b"\202\323\344\223\002a\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}" _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -530,5 +550,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 39834 + _WORKFLOWSERVICE._serialized_end = 41224 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.py b/temporalio/api/workflowservice/v1/service_pb2_grpc.py index 034a933f9..d58793174 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.py +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.py @@ -148,6 +148,31 @@ def __init__(self, channel): request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, ) + self.NotifyChannel = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/NotifyChannel", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelResponse.FromString, + ) + self.RegisterChannelListener = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/RegisterChannelListener", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerResponse.FromString, + ) + self.UnregisterChannelListener = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/UnregisterChannelListener", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerResponse.FromString, + ) + self.PollChannel = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/PollChannel", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelResponse.FromString, + ) + self.DescribeChannel = channel.unary_unary( + "/temporal.api.workflowservice.v1.WorkflowService/DescribeChannel", + request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelRequest.SerializeToString, + response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelResponse.FromString, + ) self.SignalWithStartWorkflowExecution = channel.unary_unary( "/temporal.api.workflowservice.v1.WorkflowService/SignalWithStartWorkflowExecution", request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.SerializeToString, @@ -948,6 +973,56 @@ def WakeWorkflowExecution(self, request, context): no event, carries no payload, and folds with other wakes for the same source, so a burst of writes costs one task. The Workflow learns the source and its position from the task and reads the source itself. + + Superseded by the notification channel (`NotifyChannel` and the + `SubscribeNotificationChannel` command). Kept for one round and slated for removal. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def NotifyChannel(self, request, context): + """NotifyChannel tells every listener of a channel that a source they consume + has moved. The writer names no addressee and never learns who listens. The + server wakes each listener: a Workflow with a Workflow Task, a callback by + invoking it. Nothing goes to History except the notifications a woken + Workflow Task carries on its scheduled event. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def RegisterChannelListener(self, request, context): + """RegisterChannelListener registers a callback as a listener of a channel. A + Workflow registers itself with the `SubscribeNotificationChannel` command + instead. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def UnregisterChannelListener(self, request, context): + """UnregisterChannelListener removes a listener from a channel. + + (-- api-linter: core::0136::http-method=disabled + aip.dev/not-precedent: Removing a listener is a delete of that listener. --) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def PollChannel(self, request, context): + """PollChannel is a long poll for clients. It returns the retained + notifications of a channel with a counter above `after_counter`, waiting + up to `wait` for one when none is retained yet. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def DescribeChannel(self, request, context): + """DescribeChannel returns the listeners of a channel and its latest + notification. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details("Method not implemented!") @@ -2076,6 +2151,31 @@ def add_WorkflowServiceServicer_to_server(servicer, server): request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.FromString, response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.SerializeToString, ), + "NotifyChannel": grpc.unary_unary_rpc_method_handler( + servicer.NotifyChannel, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelResponse.SerializeToString, + ), + "RegisterChannelListener": grpc.unary_unary_rpc_method_handler( + servicer.RegisterChannelListener, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerResponse.SerializeToString, + ), + "UnregisterChannelListener": grpc.unary_unary_rpc_method_handler( + servicer.UnregisterChannelListener, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerResponse.SerializeToString, + ), + "PollChannel": grpc.unary_unary_rpc_method_handler( + servicer.PollChannel, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelResponse.SerializeToString, + ), + "DescribeChannel": grpc.unary_unary_rpc_method_handler( + servicer.DescribeChannel, + request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelRequest.FromString, + response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelResponse.SerializeToString, + ), "SignalWithStartWorkflowExecution": grpc.unary_unary_rpc_method_handler( servicer.SignalWithStartWorkflowExecution, request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWithStartWorkflowExecutionRequest.FromString, @@ -3294,6 +3394,151 @@ def WakeWorkflowExecution( metadata, ) + @staticmethod + def NotifyChannel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/NotifyChannel", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def RegisterChannelListener( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/RegisterChannelListener", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.RegisterChannelListenerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def UnregisterChannelListener( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/UnregisterChannelListener", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.UnregisterChannelListenerResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def PollChannel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/PollChannel", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.PollChannelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def DescribeChannel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/temporal.api.workflowservice.v1.WorkflowService/DescribeChannel", + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelRequest.SerializeToString, + temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.DescribeChannelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + @staticmethod def SignalWithStartWorkflowExecution( request, diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi index 5af97ddfd..3b7a96cf9 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi @@ -288,6 +288,51 @@ class WorkflowServiceStub: no event, carries no payload, and folds with other wakes for the same source, so a burst of writes costs one task. The Workflow learns the source and its position from the task and reads the source itself. + + Superseded by the notification channel (`NotifyChannel` and the + `SubscribeNotificationChannel` command). Kept for one round and slated for removal. + """ + NotifyChannel: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelRequest, + temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelResponse, + ] + """NotifyChannel tells every listener of a channel that a source they consume + has moved. The writer names no addressee and never learns who listens. The + server wakes each listener: a Workflow with a Workflow Task, a callback by + invoking it. Nothing goes to History except the notifications a woken + Workflow Task carries on its scheduled event. + """ + RegisterChannelListener: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.RegisterChannelListenerRequest, + temporalio.api.workflowservice.v1.request_response_pb2.RegisterChannelListenerResponse, + ] + """RegisterChannelListener registers a callback as a listener of a channel. A + Workflow registers itself with the `SubscribeNotificationChannel` command + instead. + """ + UnregisterChannelListener: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.UnregisterChannelListenerRequest, + temporalio.api.workflowservice.v1.request_response_pb2.UnregisterChannelListenerResponse, + ] + """UnregisterChannelListener removes a listener from a channel. + + (-- api-linter: core::0136::http-method=disabled + aip.dev/not-precedent: Removing a listener is a delete of that listener. --) + """ + PollChannel: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.PollChannelRequest, + temporalio.api.workflowservice.v1.request_response_pb2.PollChannelResponse, + ] + """PollChannel is a long poll for clients. It returns the retained + notifications of a channel with a counter above `after_counter`, waiting + up to `wait` for one when none is retained yet. + """ + DescribeChannel: grpc.UnaryUnaryMultiCallable[ + temporalio.api.workflowservice.v1.request_response_pb2.DescribeChannelRequest, + temporalio.api.workflowservice.v1.request_response_pb2.DescribeChannelResponse, + ] + """DescribeChannel returns the listeners of a channel and its latest + notification. """ SignalWithStartWorkflowExecution: grpc.UnaryUnaryMultiCallable[ temporalio.api.workflowservice.v1.request_response_pb2.SignalWithStartWorkflowExecutionRequest, @@ -1519,6 +1564,61 @@ class WorkflowServiceServicer(metaclass=abc.ABCMeta): no event, carries no payload, and folds with other wakes for the same source, so a burst of writes costs one task. The Workflow learns the source and its position from the task and reads the source itself. + + Superseded by the notification channel (`NotifyChannel` and the + `SubscribeNotificationChannel` command). Kept for one round and slated for removal. + """ + @abc.abstractmethod + def NotifyChannel( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelResponse: + """NotifyChannel tells every listener of a channel that a source they consume + has moved. The writer names no addressee and never learns who listens. The + server wakes each listener: a Workflow with a Workflow Task, a callback by + invoking it. Nothing goes to History except the notifications a woken + Workflow Task carries on its scheduled event. + """ + @abc.abstractmethod + def RegisterChannelListener( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.RegisterChannelListenerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.RegisterChannelListenerResponse: + """RegisterChannelListener registers a callback as a listener of a channel. A + Workflow registers itself with the `SubscribeNotificationChannel` command + instead. + """ + @abc.abstractmethod + def UnregisterChannelListener( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.UnregisterChannelListenerRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.UnregisterChannelListenerResponse: + """UnregisterChannelListener removes a listener from a channel. + + (-- api-linter: core::0136::http-method=disabled + aip.dev/not-precedent: Removing a listener is a delete of that listener. --) + """ + @abc.abstractmethod + def PollChannel( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.PollChannelRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.PollChannelResponse: + """PollChannel is a long poll for clients. It returns the retained + notifications of a channel with a counter above `after_counter`, waiting + up to `wait` for one when none is retained yet. + """ + @abc.abstractmethod + def DescribeChannel( + self, + request: temporalio.api.workflowservice.v1.request_response_pb2.DescribeChannelRequest, + context: grpc.ServicerContext, + ) -> temporalio.api.workflowservice.v1.request_response_pb2.DescribeChannelResponse: + """DescribeChannel returns the listeners of a channel and its latest + notification. """ @abc.abstractmethod def SignalWithStartWorkflowExecution( diff --git a/temporalio/bridge/_visitor.py b/temporalio/bridge/_visitor.py index f26fc390f..0c30e2398 100644 --- a/temporalio/bridge/_visitor.py +++ b/temporalio/bridge/_visitor.py @@ -308,6 +308,18 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperation( if o.HasField("result"): await self._visit_coresdk_nexus_NexusOperationResult(fs, o.result) + async def _visit_temporal_api_notification_v1_Notification( + self, fs: VisitorFunctions, o: Any + ): + for v in o.metadata.values(): + await self._visit_temporal_api_common_v1_Payload(fs, v) + + async def _visit_coresdk_workflow_activation_NotificationsReceived( + self, fs: VisitorFunctions, o: Any + ): + for v in o.notifications: + await self._visit_temporal_api_notification_v1_Notification(fs, v) + async def _visit_coresdk_workflow_activation_WorkflowActivationJob( self, fs: VisitorFunctions, o: Any ): @@ -353,6 +365,10 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob( await self._visit_coresdk_workflow_activation_ResolveNexusOperation( fs, o.resolve_nexus_operation ) + elif o.HasField("notifications_received"): + await self._visit_coresdk_workflow_activation_NotificationsReceived( + fs, o.notifications_received + ) async def _visit_coresdk_workflow_activation_WorkflowActivation( self, fs: VisitorFunctions, o: Any diff --git a/temporalio/bridge/proto/workflow_activation/__init__.py b/temporalio/bridge/proto/workflow_activation/__init__.py index 5539eecd2..1e5623c94 100644 --- a/temporalio/bridge/proto/workflow_activation/__init__.py +++ b/temporalio/bridge/proto/workflow_activation/__init__.py @@ -4,6 +4,7 @@ FinalizeExternalStreams, FireTimer, InitializeWorkflow, + NotificationsReceived, NotifyHasPatch, PrepareExternalStreamPark, QueryWorkflow, @@ -32,6 +33,7 @@ "FinalizeExternalStreams", "FireTimer", "InitializeWorkflow", + "NotificationsReceived", "NotifyHasPatch", "PrepareExternalStreamPark", "QueryWorkflow", diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index b37fefd31..5b55ad7a0 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -27,6 +27,9 @@ from temporalio.api.failure.v1 import ( message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, ) +from temporalio.api.notification.v1 import ( + message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, +) from temporalio.api.update.v1 import ( message_pb2 as temporal_dot_api_dot_update_dot_v1_dot_message__pb2, ) @@ -50,12 +53,13 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto\x1a;temporal/sdk/core/workflow_commands/workflow_commands.proto"\xc2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\x12\x1e\n\x16history_floor_event_id\x18\r \x01(\x03"\xd4\r\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12`\n\x1dresolve_external_stream_waits\x18\x11 \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveExternalStreamWaitsH\x00\x12^\n\x1cprepare_external_stream_park\x18\x12 \x01(\x0b\x32\x36.coresdk.workflow_activation.PrepareExternalStreamParkH\x00\x12U\n\x17replay_external_streams\x18\x13 \x01(\x0b\x32\x32.coresdk.workflow_activation.ReplayExternalStreamsH\x00\x12Y\n\x19\x66inalize_external_streams\x18\x14 \x01(\x0b\x32\x34.coresdk.workflow_activation.FinalizeExternalStreamsH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x7f\n\x1aResolveExternalStreamWaits\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x42\n\x0bready_hints\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait"\xab\x01\n\x19PrepareExternalStreamPark\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x92\x02\n\x15ReplayExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x19\n\x11replay_annotation\x18\x03 \x01(\x0c\x12<\n\x11terminal_boundary\x18\x04 \x01(\x0e\x32!.coresdk.external_data.ParkReason\x12\x43\n\x06output\x18\x05 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest"\xa9\x01\n\x17\x46inalizeExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\xd9\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\x83\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a*temporal/api/notification/v1/message.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto\x1a;temporal/sdk/core/workflow_commands/workflow_commands.proto"\xc2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\x12\x1e\n\x16history_floor_event_id\x18\r \x01(\x03"\xaa\x0e\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12`\n\x1dresolve_external_stream_waits\x18\x11 \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveExternalStreamWaitsH\x00\x12^\n\x1cprepare_external_stream_park\x18\x12 \x01(\x0b\x32\x36.coresdk.workflow_activation.PrepareExternalStreamParkH\x00\x12U\n\x17replay_external_streams\x18\x13 \x01(\x0b\x32\x32.coresdk.workflow_activation.ReplayExternalStreamsH\x00\x12Y\n\x19\x66inalize_external_streams\x18\x14 \x01(\x0b\x32\x34.coresdk.workflow_activation.FinalizeExternalStreamsH\x00\x12T\n\x16notifications_received\x18\x16 \x01(\x0b\x32\x32.coresdk.workflow_activation.NotificationsReceivedH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"Z\n\x15NotificationsReceived\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x7f\n\x1aResolveExternalStreamWaits\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x42\n\x0bready_hints\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait"\xab\x01\n\x19PrepareExternalStreamPark\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x92\x02\n\x15ReplayExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x19\n\x11replay_annotation\x18\x03 \x01(\x0c\x12<\n\x11terminal_boundary\x18\x04 \x01(\x0e\x32!.coresdk.external_data.ParkReason\x12\x43\n\x06output\x18\x05 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest"\xa9\x01\n\x17\x46inalizeExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\xd9\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\x83\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"_\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"f\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] +_NOTIFICATIONSRECEIVED = DESCRIPTOR.message_types_by_name["NotificationsReceived"] _RESOLVEEXTERNALSTREAMWAITS = DESCRIPTOR.message_types_by_name[ "ResolveExternalStreamWaits" ] @@ -128,6 +132,17 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) +NotificationsReceived = _reflection.GeneratedProtocolMessageType( + "NotificationsReceived", + (_message.Message,), + { + "DESCRIPTOR": _NOTIFICATIONSRECEIVED, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotificationsReceived) + }, +) +_sym_db.RegisterMessage(NotificationsReceived) + ResolveExternalStreamWaits = _reflection.GeneratedProtocolMessageType( "ResolveExternalStreamWaits", (_message.Message,), @@ -434,64 +449,66 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 646 - _WORKFLOWACTIVATION._serialized_end = 1224 - _WORKFLOWACTIVATIONJOB._serialized_start = 1227 - _WORKFLOWACTIVATIONJOB._serialized_end = 2975 - _RESOLVEEXTERNALSTREAMWAITS._serialized_start = 2977 - _RESOLVEEXTERNALSTREAMWAITS._serialized_end = 3104 - _PREPAREEXTERNALSTREAMPARK._serialized_start = 3107 - _PREPAREEXTERNALSTREAMPARK._serialized_end = 3278 - _REPLAYEXTERNALSTREAMS._serialized_start = 3281 - _REPLAYEXTERNALSTREAMS._serialized_end = 3555 - _FINALIZEEXTERNALSTREAMS._serialized_start = 3558 - _FINALIZEEXTERNALSTREAMS._serialized_end = 3727 - _INITIALIZEWORKFLOW._serialized_start = 3730 - _INITIALIZEWORKFLOW._serialized_end = 5099 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 5020 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 5099 - _FIRETIMER._serialized_start = 5101 - _FIRETIMER._serialized_end = 5125 - _RESOLVEACTIVITY._serialized_start = 5127 - _RESOLVEACTIVITY._serialized_end = 5236 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 5239 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 5576 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 5578 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 5637 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 5640 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 5806 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 5808 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 5904 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 5906 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 6011 - _UPDATERANDOMSEED._serialized_start = 6013 - _UPDATERANDOMSEED._serialized_end = 6056 - _QUERYWORKFLOW._serialized_start = 6059 - _QUERYWORKFLOW._serialized_end = 6319 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 5020 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 5099 - _CANCELWORKFLOW._serialized_start = 6321 - _CANCELWORKFLOW._serialized_end = 6353 - _SIGNALWORKFLOW._serialized_start = 6356 - _SIGNALWORKFLOW._serialized_end = 6615 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 5020 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 5099 - _NOTIFYHASPATCH._serialized_start = 6617 - _NOTIFYHASPATCH._serialized_end = 6651 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 6653 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 6748 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 6750 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 6852 - _DOUPDATE._serialized_start = 6855 - _DOUPDATE._serialized_end = 7186 - _DOUPDATE_HEADERSENTRY._serialized_start = 5020 - _DOUPDATE_HEADERSENTRY._serialized_end = 5099 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 7189 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 7343 - _RESOLVENEXUSOPERATION._serialized_start = 7345 - _RESOLVENEXUSOPERATION._serialized_end = 7434 - _REMOVEFROMCACHE._serialized_start = 7437 - _REMOVEFROMCACHE._serialized_end = 7789 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 7551 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 7789 + _WORKFLOWACTIVATION._serialized_start = 690 + _WORKFLOWACTIVATION._serialized_end = 1268 + _WORKFLOWACTIVATIONJOB._serialized_start = 1271 + _WORKFLOWACTIVATIONJOB._serialized_end = 3105 + _NOTIFICATIONSRECEIVED._serialized_start = 3107 + _NOTIFICATIONSRECEIVED._serialized_end = 3197 + _RESOLVEEXTERNALSTREAMWAITS._serialized_start = 3199 + _RESOLVEEXTERNALSTREAMWAITS._serialized_end = 3326 + _PREPAREEXTERNALSTREAMPARK._serialized_start = 3329 + _PREPAREEXTERNALSTREAMPARK._serialized_end = 3500 + _REPLAYEXTERNALSTREAMS._serialized_start = 3503 + _REPLAYEXTERNALSTREAMS._serialized_end = 3777 + _FINALIZEEXTERNALSTREAMS._serialized_start = 3780 + _FINALIZEEXTERNALSTREAMS._serialized_end = 3949 + _INITIALIZEWORKFLOW._serialized_start = 3952 + _INITIALIZEWORKFLOW._serialized_end = 5321 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 5242 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 5321 + _FIRETIMER._serialized_start = 5323 + _FIRETIMER._serialized_end = 5347 + _RESOLVEACTIVITY._serialized_start = 5349 + _RESOLVEACTIVITY._serialized_end = 5458 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 5461 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 5798 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 5800 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 5859 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 5862 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 6028 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 6030 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 6126 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 6128 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 6233 + _UPDATERANDOMSEED._serialized_start = 6235 + _UPDATERANDOMSEED._serialized_end = 6278 + _QUERYWORKFLOW._serialized_start = 6281 + _QUERYWORKFLOW._serialized_end = 6541 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 5242 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 5321 + _CANCELWORKFLOW._serialized_start = 6543 + _CANCELWORKFLOW._serialized_end = 6575 + _SIGNALWORKFLOW._serialized_start = 6578 + _SIGNALWORKFLOW._serialized_end = 6837 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 5242 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 5321 + _NOTIFYHASPATCH._serialized_start = 6839 + _NOTIFYHASPATCH._serialized_end = 6873 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 6875 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 6970 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 6972 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 7074 + _DOUPDATE._serialized_start = 7077 + _DOUPDATE._serialized_end = 7408 + _DOUPDATE_HEADERSENTRY._serialized_start = 5242 + _DOUPDATE_HEADERSENTRY._serialized_end = 5321 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 7411 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 7565 + _RESOLVENEXUSOPERATION._serialized_start = 7567 + _RESOLVENEXUSOPERATION._serialized_end = 7656 + _REMOVEFROMCACHE._serialized_start = 7659 + _REMOVEFROMCACHE._serialized_end = 8011 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 7773 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 8011 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 365371137..8b7ee4905 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -21,6 +21,7 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.notification.v1.message_pb2 import temporalio.api.update.v1.message_pb2 import temporalio.bridge.proto.activity_result.activity_result_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 @@ -46,7 +47,7 @@ class WorkflowActivation(google.protobuf.message.Message): 1. init workflow 2. patches 3. random-seed-updates - 4. signals/updates + 4. signals/updates/channel notifications 5. all others 6. local activity resolutions 7. queries @@ -250,6 +251,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): PREPARE_EXTERNAL_STREAM_PARK_FIELD_NUMBER: builtins.int REPLAY_EXTERNAL_STREAMS_FIELD_NUMBER: builtins.int FINALIZE_EXTERNAL_STREAMS_FIELD_NUMBER: builtins.int + NOTIFICATIONS_RECEIVED_FIELD_NUMBER: builtins.int REMOVE_FROM_CACHE_FIELD_NUMBER: builtins.int @property def initialize_workflow(self) -> global___InitializeWorkflow: @@ -324,6 +326,9 @@ class WorkflowActivationJob(google.protobuf.message.Message): Runs no user code. """ @property + def notifications_received(self) -> global___NotificationsReceived: + """Notifications from the channels the workflow subscribed to.""" + @property def remove_from_cache(self) -> global___RemoveFromCache: """Remove the workflow identified by the [WorkflowActivation] containing this job from the cache after performing the activation. It is guaranteed that this will be the only job @@ -355,6 +360,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): prepare_external_stream_park: global___PrepareExternalStreamPark | None = ..., replay_external_streams: global___ReplayExternalStreams | None = ..., finalize_external_streams: global___FinalizeExternalStreams | None = ..., + notifications_received: global___NotificationsReceived | None = ..., remove_from_cache: global___RemoveFromCache | None = ..., ) -> None: ... def HasField( @@ -370,6 +376,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"fire_timer", "initialize_workflow", b"initialize_workflow", + "notifications_received", + b"notifications_received", "notify_has_patch", b"notify_has_patch", "prepare_external_stream_park", @@ -417,6 +425,8 @@ class WorkflowActivationJob(google.protobuf.message.Message): b"fire_timer", "initialize_workflow", b"initialize_workflow", + "notifications_received", + b"notifications_received", "notify_has_patch", b"notify_has_patch", "prepare_external_stream_park", @@ -474,6 +484,7 @@ class WorkflowActivationJob(google.protobuf.message.Message): "prepare_external_stream_park", "replay_external_streams", "finalize_external_streams", + "notifications_received", "remove_from_cache", ] | None @@ -481,6 +492,37 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class NotificationsReceived(google.protobuf.message.Message): + """Hand a workflow the notifications the server folded for its channels. + + They come from the scheduled event of the Workflow Task this activation + belongs to. History is the record, so a replay yields the same job with the + same notifications at the same point. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NOTIFICATIONS_FIELD_NUMBER: builtins.int + @property + def notifications( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.Notification + ]: ... + def __init__( + self, + *, + notifications: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.Notification + ] + | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["notifications", b"notifications"] + ) -> None: ... + +global___NotificationsReceived = NotificationsReceived + class ResolveExternalStreamWaits(google.protobuf.message.Message): """Tells lang that one or more external stream waits may now have data. diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index bf841f910..b06b32ba7 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -26,6 +26,7 @@ StartChildWorkflowExecution, StartTimer, StreamSetBecameReady, + SubscribeNotificationChannel, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -63,6 +64,7 @@ "StartChildWorkflowExecution", "StartTimer", "StreamSetBecameReady", + "SubscribeNotificationChannel", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 5cf86e960..2b2f7535b 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\x8e\x14\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x42\t\n\x07variant"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x19\n\x17\x43\x61ncelWorkflowExecution"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xf1\x14\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x42\t\n\x07variant"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x19\n\x17\x43\x61ncelWorkflowExecution"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -56,6 +56,9 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_SUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ + "SubscribeNotificationChannel" +] _WORKFLOWSTREAMPROGRESS = DESCRIPTOR.message_types_by_name["WorkflowStreamProgress"] _WORKFLOWSTREAMQUIESCENT = DESCRIPTOR.message_types_by_name["WorkflowStreamQuiescent"] _EXTERNALSTREAMWAIT = DESCRIPTOR.message_types_by_name["ExternalStreamWait"] @@ -143,6 +146,17 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +SubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( + "SubscribeNotificationChannel", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBENOTIFICATIONCHANNEL, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeNotificationChannel) + }, +) +_sym_db.RegisterMessage(SubscribeNotificationChannel) + WorkflowStreamProgress = _reflection.GeneratedProtocolMessageType( "WorkflowStreamProgress", (_message.Message,), @@ -596,88 +610,90 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 10005 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 10093 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 10153 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 10241 _WORKFLOWCOMMAND._serialized_start = 525 - _WORKFLOWCOMMAND._serialized_end = 3099 - _WORKFLOWSTREAMPROGRESS._serialized_start = 3101 - _WORKFLOWSTREAMPROGRESS._serialized_end = 3178 - _WORKFLOWSTREAMQUIESCENT._serialized_start = 3181 - _WORKFLOWSTREAMQUIESCENT._serialized_end = 3348 - _EXTERNALSTREAMWAIT._serialized_start = 3350 - _EXTERNALSTREAMWAIT._serialized_end = 3437 - _EXTERNALSTREAMPARKRESULT._serialized_start = 3440 - _EXTERNALSTREAMPARKRESULT._serialized_end = 3680 - _PARKSETCONFIRMED._serialized_start = 3682 - _PARKSETCONFIRMED._serialized_end = 3700 - _STREAMSETBECAMEREADY._serialized_start = 3702 - _STREAMSETBECAMEREADY._serialized_end = 3724 - _EXTERNALSTREAMFINALIZED._serialized_start = 3726 - _EXTERNALSTREAMFINALIZED._serialized_end = 3815 - _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 3817 - _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 3942 - _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 3944 - _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4030 - _STARTTIMER._serialized_start = 4032 - _STARTTIMER._serialized_end = 4115 - _CANCELTIMER._serialized_start = 4117 - _CANCELTIMER._serialized_end = 4143 - _SCHEDULEACTIVITY._serialized_start = 4146 - _SCHEDULEACTIVITY._serialized_end = 4970 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 4891 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 4970 - _SCHEDULELOCALACTIVITY._serialized_start = 4973 - _SCHEDULELOCALACTIVITY._serialized_end = 5723 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 4891 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 4970 - _REQUESTCANCELACTIVITY._serialized_start = 5725 - _REQUESTCANCELACTIVITY._serialized_end = 5761 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 5763 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 5804 - _QUERYRESULT._serialized_start = 5807 - _QUERYRESULT._serialized_end = 5963 - _QUERYSUCCESS._serialized_start = 5965 - _QUERYSUCCESS._serialized_end = 6030 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 6032 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 6108 - _FAILWORKFLOWEXECUTION._serialized_start = 6110 - _FAILWORKFLOWEXECUTION._serialized_end = 6184 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6187 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7101 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 6944 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7020 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4891 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4970 - _CANCELWORKFLOWEXECUTION._serialized_start = 7103 - _CANCELWORKFLOWEXECUTION._serialized_end = 7128 - _SETPATCHMARKER._serialized_start = 7130 - _SETPATCHMARKER._serialized_end = 7184 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7187 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8361 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4891 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4970 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 6944 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7020 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8363 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8437 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8440 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 8582 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 8585 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8984 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4891 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4970 - _CANCELSIGNALWORKFLOW._serialized_start = 8986 - _CANCELSIGNALWORKFLOW._serialized_end = 9021 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9023 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9124 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 9126 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 9205 - _UPDATERESPONSE._serialized_start = 9208 - _UPDATERESPONSE._serialized_end = 9418 - _SCHEDULENEXUSOPERATION._serialized_start = 9421 - _SCHEDULENEXUSOPERATION._serialized_end = 9959 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 9909 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 9959 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 9961 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 10003 + _WORKFLOWCOMMAND._serialized_end = 3198 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3200 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3247 + _WORKFLOWSTREAMPROGRESS._serialized_start = 3249 + _WORKFLOWSTREAMPROGRESS._serialized_end = 3326 + _WORKFLOWSTREAMQUIESCENT._serialized_start = 3329 + _WORKFLOWSTREAMQUIESCENT._serialized_end = 3496 + _EXTERNALSTREAMWAIT._serialized_start = 3498 + _EXTERNALSTREAMWAIT._serialized_end = 3585 + _EXTERNALSTREAMPARKRESULT._serialized_start = 3588 + _EXTERNALSTREAMPARKRESULT._serialized_end = 3828 + _PARKSETCONFIRMED._serialized_start = 3830 + _PARKSETCONFIRMED._serialized_end = 3848 + _STREAMSETBECAMEREADY._serialized_start = 3850 + _STREAMSETBECAMEREADY._serialized_end = 3872 + _EXTERNALSTREAMFINALIZED._serialized_start = 3874 + _EXTERNALSTREAMFINALIZED._serialized_end = 3963 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 3965 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4090 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4092 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4178 + _STARTTIMER._serialized_start = 4180 + _STARTTIMER._serialized_end = 4263 + _CANCELTIMER._serialized_start = 4265 + _CANCELTIMER._serialized_end = 4291 + _SCHEDULEACTIVITY._serialized_start = 4294 + _SCHEDULEACTIVITY._serialized_end = 5118 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5039 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5118 + _SCHEDULELOCALACTIVITY._serialized_start = 5121 + _SCHEDULELOCALACTIVITY._serialized_end = 5871 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5039 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5118 + _REQUESTCANCELACTIVITY._serialized_start = 5873 + _REQUESTCANCELACTIVITY._serialized_end = 5909 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 5911 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 5952 + _QUERYRESULT._serialized_start = 5955 + _QUERYRESULT._serialized_end = 6111 + _QUERYSUCCESS._serialized_start = 6113 + _QUERYSUCCESS._serialized_end = 6178 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 6180 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 6256 + _FAILWORKFLOWEXECUTION._serialized_start = 6258 + _FAILWORKFLOWEXECUTION._serialized_end = 6332 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6335 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7249 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7092 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7168 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5039 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5118 + _CANCELWORKFLOWEXECUTION._serialized_start = 7251 + _CANCELWORKFLOWEXECUTION._serialized_end = 7276 + _SETPATCHMARKER._serialized_start = 7278 + _SETPATCHMARKER._serialized_end = 7332 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7335 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8509 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5039 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5118 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7092 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7168 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8511 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8585 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8588 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 8730 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 8733 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9132 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5039 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5118 + _CANCELSIGNALWORKFLOW._serialized_start = 9134 + _CANCELSIGNALWORKFLOW._serialized_end = 9169 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9171 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9272 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 9274 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 9353 + _UPDATERESPONSE._serialized_start = 9356 + _UPDATERESPONSE._serialized_end = 9566 + _SCHEDULENEXUSOPERATION._serialized_start = 9569 + _SCHEDULENEXUSOPERATION._serialized_end = 10107 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10057 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10107 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 10109 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 10151 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 03e122596..9ff296f75 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -108,6 +108,7 @@ class WorkflowCommand(google.protobuf.message.Message): EXTERNAL_STREAM_FINALIZED_FIELD_NUMBER: builtins.int WORKFLOW_OUTPUT_STREAM_COMMIT_FIELD_NUMBER: builtins.int WORKFLOW_OUTPUT_STREAM_BUFFERED_FIELD_NUMBER: builtins.int + SUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -186,6 +187,10 @@ class WorkflowCommand(google.protobuf.message.Message): def workflow_output_stream_buffered( self, ) -> global___WorkflowOutputStreamBuffered: ... + @property + def subscribe_notification_channel( + self, + ) -> global___SubscribeNotificationChannel: ... def __init__( self, *, @@ -227,6 +232,8 @@ class WorkflowCommand(google.protobuf.message.Message): workflow_output_stream_commit: global___WorkflowOutputStreamCommit | None = ..., workflow_output_stream_buffered: global___WorkflowOutputStreamBuffered | None = ..., + subscribe_notification_channel: global___SubscribeNotificationChannel + | None = ..., ) -> None: ... def HasField( self, @@ -275,6 +282,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_notification_channel", + b"subscribe_notification_channel", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -340,6 +349,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_child_workflow_execution", "start_timer", b"start_timer", + "subscribe_notification_channel", + b"subscribe_notification_channel", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -390,12 +401,37 @@ class WorkflowCommand(google.protobuf.message.Message): "external_stream_finalized", "workflow_output_stream_commit", "workflow_output_stream_buffered", + "subscribe_notification_channel", ] | None ): ... global___WorkflowCommand = WorkflowCommand +class SubscribeNotificationChannel(google.protobuf.message.Message): + """Subscribe this workflow to a notification channel, so the scheduled event of + each later Workflow Task carries the notifications folded for it. + + The notifications live in History rather than arriving by a side channel, so + a replay reads the same ones the live run saw. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """Name of the channel, scoped to the namespace.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___SubscribeNotificationChannel = SubscribeNotificationChannel + class WorkflowStreamProgress(google.protobuf.message.Message): """Commits an observation delta for external streams. diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 844901480..0a3e3a925 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 844901480aa83bf33a7453b91c6c57c6205e9a2f +Subproject commit 0a3e3a92562b71e2416231d89c6e9db9a9afbf97 diff --git a/temporalio/bridge/services_generated.py b/temporalio/bridge/services_generated.py index fdd706cf4..88e63e187 100644 --- a/temporalio/bridge/services_generated.py +++ b/temporalio/bridge/services_generated.py @@ -369,6 +369,24 @@ async def describe_batch_operation( timeout=timeout, ) + async def describe_channel( + self, + req: temporalio.api.workflowservice.v1.DescribeChannelRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.DescribeChannelResponse: + """Invokes the WorkflowService.describe_channel rpc method.""" + return await self._client._rpc_call( + rpc="describe_channel", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.DescribeChannelResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def describe_deployment( self, req: temporalio.api.workflowservice.v1.DescribeDeploymentRequest, @@ -1035,6 +1053,24 @@ async def list_workflow_rules( timeout=timeout, ) + async def notify_channel( + self, + req: temporalio.api.workflowservice.v1.NotifyChannelRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.NotifyChannelResponse: + """Invokes the WorkflowService.notify_channel rpc method.""" + return await self._client._rpc_call( + rpc="notify_channel", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.NotifyChannelResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def patch_schedule( self, req: temporalio.api.workflowservice.v1.PatchScheduleRequest, @@ -1143,6 +1179,24 @@ async def poll_activity_task_queue( timeout=timeout, ) + async def poll_channel( + self, + req: temporalio.api.workflowservice.v1.PollChannelRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.PollChannelResponse: + """Invokes the WorkflowService.poll_channel rpc method.""" + return await self._client._rpc_call( + rpc="poll_channel", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.PollChannelResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def poll_nexus_operation_execution( self, req: temporalio.api.workflowservice.v1.PollNexusOperationExecutionRequest, @@ -1305,6 +1359,24 @@ async def record_worker_heartbeat( timeout=timeout, ) + async def register_channel_listener( + self, + req: temporalio.api.workflowservice.v1.RegisterChannelListenerRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.RegisterChannelListenerResponse: + """Invokes the WorkflowService.register_channel_listener rpc method.""" + return await self._client._rpc_call( + rpc="register_channel_listener", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.RegisterChannelListenerResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def register_namespace( self, req: temporalio.api.workflowservice.v1.RegisterNamespaceRequest, @@ -2007,6 +2079,24 @@ async def unpause_workflow_execution( timeout=timeout, ) + async def unregister_channel_listener( + self, + req: temporalio.api.workflowservice.v1.UnregisterChannelListenerRequest, + retry: bool = False, + metadata: Mapping[str, str | bytes] = {}, + timeout: timedelta | None = None, + ) -> temporalio.api.workflowservice.v1.UnregisterChannelListenerResponse: + """Invokes the WorkflowService.unregister_channel_listener rpc method.""" + return await self._client._rpc_call( + rpc="unregister_channel_listener", + req=req, + service=self._service, + resp_type=temporalio.api.workflowservice.v1.UnregisterChannelListenerResponse, + retry=retry, + metadata=metadata, + timeout=timeout, + ) + async def update_activity_execution_options( self, req: temporalio.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest, diff --git a/temporalio/bridge/src/client_rpc_generated.rs b/temporalio/bridge/src/client_rpc_generated.rs index 3017217c0..ecac84667 100644 --- a/temporalio/bridge/src/client_rpc_generated.rs +++ b/temporalio/bridge/src/client_rpc_generated.rs @@ -191,6 +191,15 @@ impl ClientRef { describe_batch_operation ) } + "describe_channel" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + describe_channel + ) + } "describe_deployment" => { rpc_call!( connection, @@ -524,6 +533,15 @@ impl ClientRef { list_workflow_rules ) } + "notify_channel" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + notify_channel + ) + } "patch_schedule" => { rpc_call!( connection, @@ -578,6 +596,15 @@ impl ClientRef { poll_activity_task_queue ) } + "poll_channel" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + poll_channel + ) + } "poll_nexus_operation_execution" => { rpc_call!( connection, @@ -659,6 +686,15 @@ impl ClientRef { record_worker_heartbeat ) } + "register_channel_listener" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + register_channel_listener + ) + } "register_namespace" => { rpc_call!( connection, @@ -1010,6 +1046,15 @@ impl ClientRef { unpause_workflow_execution ) } + "unregister_channel_listener" => { + rpc_call!( + connection, + call, + WorkflowService, + workflow_service, + unregister_channel_listener + ) + } "update_activity_execution_options" => { rpc_call!( connection, From 2ce4cd91e33d76d0580be002bc955572bce27684 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:40:28 -0700 Subject: [PATCH 765/831] Notified the stream's channel ahead of the wake call and the Signal. The channel is the stream identity formatted once for writers and readers. Under auto the transport steps down on UNIMPLEMENTED and remembers per client where it stopped. --- .../external_workflow_streams/_backend.py | 2 + .../external_workflow_streams/_wake.py | 259 ++++++++++++++---- 2 files changed, 210 insertions(+), 51 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_backend.py b/temporalio/contrib/external_workflow_streams/_backend.py index 2c366aa26..ca7cc7c47 100644 --- a/temporalio/contrib/external_workflow_streams/_backend.py +++ b/temporalio/contrib/external_workflow_streams/_backend.py @@ -281,6 +281,8 @@ def compare_offsets(self, left: Offset, right: Offset) -> int: Held on the backend because it is the one object both the producer and the consuming Worker are configured with. A provider may set it per instance. + ``"auto"`` notifies the stream's channel, then falls back to the wake call + and the Signal on a server without it. """ def wake_counter_for(self, offset: Offset) -> int: diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index 66e3db0d2..3dce38fa6 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -1,11 +1,12 @@ """The producer wake path (P14). The server-visible wakeup, used whenever no open Workflow Task can accept local -readiness. It carries no stream payload. It goes out over the server's -``WakeWorkflowExecution`` call when the server has one, see :func:`send_wake`, -and otherwise as the reserved Signal described below, which carries only enough -identity for Core to decide whether it is a wake, a stale claim, or someone -else's chain. +readiness. It carries no stream payload. It goes out as a notification on the +stream's channel when the server has channels, see :func:`send_wake` and +:func:`channel_for`, over the deprecated ``WakeWorkflowExecution`` call when it +has only that, and otherwise as the reserved Signal described below, which +carries only enough identity for Core to decide whether it is a wake, a stale +claim, or someone else's chain. Two properties are load-bearing and neither is available from the public Signal API, which is why this path does not reuse it: @@ -30,10 +31,13 @@ import time import uuid import weakref +from collections.abc import Mapping from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Literal, get_args +from urllib.parse import quote import temporalio.api.common.v1 +import temporalio.api.notification.v1 import temporalio.api.workflow.v1 import temporalio.api.workflowservice.v1 import temporalio.service @@ -42,26 +46,60 @@ if TYPE_CHECKING: import temporalio.client + from temporalio.contrib.external_workflow_streams._backend import StreamKey from temporalio.contrib.external_workflow_streams._producer import WorkflowChainKey __all__ = [ "WakeRequest", "WakeTransport", + "channel_for", "new_sender_identity", "send_wake", "send_wake_signal", + "server_has_channels", "wake_request_id", ] -WakeTransport = Literal["auto", "wake", "signal"] +WakeTransport = Literal["auto", "channel", "wake", "signal"] """How a wake reaches the server. -``"wake"`` uses the ``WakeWorkflowExecution`` call, which records no History -event and folds repeated wakes per source. ``"signal"`` uses the reserved -Signal. ``"auto"`` tries the wake call and falls back to the Signal against a -server that does not implement it, remembering the answer per client. +``"channel"`` notifies the stream's channel with ``NotifyChannel``. Every run +that subscribed to the channel is woken, and the only record is the +notification on the scheduled event of the Workflow Task it causes. ``"wake"`` +uses the deprecated ``WakeWorkflowExecution`` call, addressed to one chain. +``"signal"`` uses the reserved Signal. ``"auto"`` tries them in that order and +steps down on ``UNIMPLEMENTED``, remembering per client what the server lacks. """ +CHANNEL_PREFIX = "external-stream" +"""The first segment of every channel this package names. + +Keeps these channels apart from any a Workflow subscribes to by hand under a +name that happens to look like a stream's. +""" + + +def channel_for(key: StreamKey) -> str: + """The channel a stream's writers notify and its readers listen on. + + One formatting for both sides, so a producer process and the consuming + Worker never disagree on the name. The namespace is left out because the + server scopes a channel to the namespace of the call. Every segment is + percent-encoded, so a Workflow ID or stream name containing ``/`` cannot + collide with another stream's segments. + """ + return "/".join( + quote(part, safe="") + for part in ( + CHANNEL_PREFIX, + key.workflow_id, + key.first_execution_run_id, + key.direction.value, + key.stream_name, + ) + ) + + WAKE_SIGNAL_NAME = "__temporal_external_stream_wake" """Fixed, and versioned by the envelope rather than by the name. @@ -140,6 +178,13 @@ class WakeRequest: received a source's wake, the server accepts the next one whatever its counter, because only the receiver knows what it read. """ + channel: str = "" + """The channel the stream's readers listen on, see :func:`channel_for`. + + Empty for a request composed by code that predates the channel, which the + transport then wakes by chain. Not part of the request ID: the ID names the + wake, and the channel is only where it is delivered. + """ @property def is_unparked(self) -> bool: @@ -261,11 +306,22 @@ async def send_wake_signal( return signal_request.request_id -_SIGNAL_ONLY: weakref.WeakKeyDictionary[Any, bool] = weakref.WeakKeyDictionary() -"""Service clients whose server answered the wake call with ``UNIMPLEMENTED``. +_TRANSPORT_ORDER: tuple[str, ...] = ("channel", "wake", "signal") +"""What ``"auto"`` tries, in order. + +Each step is taken by every server that takes the one before it, so stepping +down never loses a wake, only the folding and the History the later transport +costs. +""" + +_CALL_NAMES = {"channel": "notify_channel", "wake": "wake_workflow_execution"} + +_BEST_TRANSPORT: weakref.WeakKeyDictionary[Any, str] = weakref.WeakKeyDictionary() +"""Per service client, the first transport its server has not refused. Keyed weakly by the client's service client so the answer lives as long as the -connection it describes, without adding state to the public client. +connection it describes, without adding state to the public client. Absent +means nothing has been learned yet and ``"auto"`` starts at the top. """ @@ -273,24 +329,74 @@ def _service_key(client: temporalio.client.Client) -> Any: return getattr(client, "service_client", None) -def _known_signal_only(client: temporalio.client.Client) -> bool: +def _best_transport(client: temporalio.client.Client) -> str: key = _service_key(client) if key is None: - return False + return _TRANSPORT_ORDER[0] try: - return key in _SIGNAL_ONLY + return _BEST_TRANSPORT.get(key, _TRANSPORT_ORDER[0]) except TypeError: - return False + return _TRANSPORT_ORDER[0] + +def _step_down(client: temporalio.client.Client, transport: str) -> str: + """Remembers that ``transport`` is beyond this client's server. -def _remember_signal_only(client: temporalio.client.Client) -> None: + Returns the transport to try next. Only ever moves forward: a refusal of a + later transport may already be on record, and going back would retry a + call known to fail. + """ + following = _TRANSPORT_ORDER[_TRANSPORT_ORDER.index(transport) + 1] key = _service_key(client) - if key is None: - return + if key is not None: + try: + known = _TRANSPORT_ORDER.index(_best_transport(client)) + if known < _TRANSPORT_ORDER.index(following): + _BEST_TRANSPORT[key] = following + except TypeError: + pass + return following + + +PROBE_CHANNEL = f"{CHANNEL_PREFIX}/probe" +"""A channel nobody writes to, described to learn whether the server has any.""" + + +async def server_has_channels(client: temporalio.client.Client) -> bool | None: + """Whether this client's server implements notification channels. + + Asked with a ``DescribeChannel`` of a channel nobody writes to, because the + one reader-side decision that depends on the answer is a command: a + Workflow Task that subscribes to a channel on a server without them fails, + and nothing in the wake path would ever tell the reader. A refusal is + remembered the way a refused notify is, so the writers on the same client + skip the call as well. + + Returns ``None`` when the server could not be asked, so the caller can ask + again later rather than settle on an answer the server never gave. + """ + if _best_transport(client) != "channel": + return False + service = getattr(client, "workflow_service", None) + call = getattr(service, "describe_channel", None) + if call is None: + _step_down(client, "channel") + return False try: - _SIGNAL_ONLY[key] = True - except TypeError: - pass + await call( + temporalio.api.workflowservice.v1.DescribeChannelRequest( + namespace=client.namespace, channel=PROBE_CHANNEL + ) + ) + except temporalio.service.RPCError as err: + if err.status == temporalio.service.RPCStatusCode.UNIMPLEMENTED: + _step_down(client, "channel") + return False + if err.status == temporalio.service.RPCStatusCode.NOT_FOUND: + # The server knows the call and has never seen this channel. + return True + return None + return True def wake_transport_of(backend: object) -> WakeTransport: @@ -352,61 +458,110 @@ def build_wake_request( ) +def build_notify_request( + request: WakeRequest, + *, + identity: str, + metadata: Mapping[str, temporalio.api.common.v1.Payload] | None = None, +) -> temporalio.api.workflowservice.v1.NotifyChannelRequest: + """The ``NotifyChannel`` request for one wake. + + The server deduplicates a retried notification by ``request_id``, so the + Signal's derivation serves here unchanged: two producers waking one parked + generation send the identical request, and a sender retrying an attempt + that may have landed sends it again rather than waking twice. + """ + if not request.channel: + raise ValueError( + "a channel notification needs the stream's channel; compose the " + "request with wake_request_for() or set WakeRequest.channel" + ) + return temporalio.api.workflowservice.v1.NotifyChannelRequest( + namespace=request.namespace, + notification=temporalio.api.notification.v1.Notification( + channel=request.channel, + position=request.position, + counter=wake_call_counter(request), + metadata=dict(metadata or {}), + ), + identity=identity, + request_id=wake_request_id(request), + ) + + async def send_wake( client: temporalio.client.Client, request: WakeRequest, *, producer_session_id: str = "", transport: WakeTransport = "auto", + metadata: Mapping[str, temporalio.api.common.v1.Payload] | None = None, ) -> str: """Sends one wake over ``transport`` and returns an identifier for it. - The Signal path returns its request ID. The wake call has no request ID, - since the server folds by counter instead, so it returns the run the wake - was stored on. + The channel and the Signal return the request ID the wake went out under. + The wake call has no request ID, since the server folds by counter + instead, so it returns the run the wake was stored on. + + ``"auto"`` starts at the best transport this client's server is known to + take and steps down on ``UNIMPLEMENTED``, remembering the step. A channel + with no listeners is not a reason to step down: the server retains the + notification and hands it to the next listener at registration, which is + what closes the gap between a reader's last look at the store and its + subscription taking effect. A ``NOT_FOUND`` from the wake call propagates as the ``RPCError`` it is, which is what a Signal to an ended Workflow raises as well, so callers keep one meaning for "the chain is over". + Args: + metadata: Payloads for the listeners, carried on the notification + only. The channel already names the stream, so most wakes send + none. + Raises: temporalio.service.RPCError: The server refused the wake. With - ``"wake"`` this includes ``UNIMPLEMENTED``, since that transport - was asked for explicitly. + ``"channel"`` or ``"wake"`` this includes ``UNIMPLEMENTED``, since + that transport was asked for explicitly. """ # Checked against the alias rather than a literal tuple so an untyped caller # still gets a ValueError instead of a silent Signal. if transport not in get_args(WakeTransport): raise ValueError(f"unknown wake transport {transport!r}") - if transport == "auto" and _known_signal_only(client): - transport = "signal" - if transport != "signal": + attempt = _best_transport(client) if transport == "auto" else transport + if attempt == "channel" and not request.channel and transport == "auto": + # Composed without its channel by a caller that predates it. Nothing + # about the server follows from that, so nothing is remembered. + attempt = "wake" + while attempt != "signal": service = getattr(client, "workflow_service", None) - call = getattr(service, "wake_workflow_execution", None) + call = getattr(service, _CALL_NAMES[attempt], None) if call is None: # An SDK build whose generated service lacks the call can no more # send a wake than a server that lacks it can take one. - if transport == "wake": + if transport != "auto": raise RuntimeError( - "the wake transport was requested but this client has no " - "WakeWorkflowExecution call" + f"the {attempt} transport was requested but this client has " + f"no {_CALL_NAMES[attempt]} call" ) - _remember_signal_only(client) - else: - try: - response = await call( - build_wake_request( - request, identity=client.service_client.config.identity - ) + attempt = _step_down(client, attempt) + continue + identity = client.service_client.config.identity + try: + if attempt == "channel": + await call( + build_notify_request(request, identity=identity, metadata=metadata) ) - return response.run_id - except temporalio.service.RPCError as err: - if ( - transport == "wake" - or err.status != temporalio.service.RPCStatusCode.UNIMPLEMENTED - ): - raise - _remember_signal_only(client) + return wake_request_id(request) + response = await call(build_wake_request(request, identity=identity)) + return response.run_id + except temporalio.service.RPCError as err: + if ( + transport != "auto" + or err.status != temporalio.service.RPCStatusCode.UNIMPLEMENTED + ): + raise + attempt = _step_down(client, attempt) return await send_wake_signal( client, request, producer_session_id=producer_session_id ) @@ -426,7 +581,8 @@ def wake_request_for( """Builds the request from a chain key and an observed generation. ``park_generation=None`` -- no confirmed park for this subscription -- - becomes an unparked wake rather than no wake at all. + becomes an unparked wake rather than no wake at all. The channel is the + input stream's, which is the only direction a producer writes. """ return WakeRequest( namespace=workflow.namespace, @@ -441,4 +597,5 @@ def wake_request_for( wake_counter=wake_counter, position=position, position_counter=position_counter, + channel=channel_for(workflow.stream_key(stream_name)), ) From 500f494f68f1813bc7e51d95d7f84af6c413cac8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:40:28 -0700 Subject: [PATCH 766/831] Subscribed external-stream readers to their streams' channels. The subscribe command is gated behind a lang flag the Worker sets after asking the server once, so a stock server never sees it and a replay emits it where the live run did. The notifications job only records positions; Core resumes the parked waits from it. --- .../contrib/external_workflow_streams/_api.py | 8 +++ .../external_workflow_streams/_runtime.py | 27 +++++++++- temporalio/worker/_workflow.py | 38 +++++++++++++ temporalio/worker/_workflow_instance.py | 53 +++++++++++++++++++ 4 files changed, 125 insertions(+), 1 deletion(-) diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index feca4ca7d..bbb620694 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -37,6 +37,7 @@ from temporalio.contrib.external_workflow_streams._record import ( StreamRecord, ) +from temporalio.contrib.external_workflow_streams._wake import channel_for from temporalio.types import AnyType __all__ = [ @@ -307,6 +308,13 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: # the reduction and every set parks after one second. idle_timeout=self.options.idle_timeout, ) + # The channel the stream's writers notify. Asked of the SDK's object for + # the Run rather than of the stream runtime, because the answer is a + # command and commands are the Run's to emit; it also decides, from the + # server it talks to, whether to emit one at all. + subscribe_channel = getattr(_run_holder(), "subscribe_channel", None) + if subscribe_channel is not None: + subscribe_channel(channel_for(stream_key)) # Registering a wait is not blocking on one. The quiescent snapshot is a # request to Core to retain the Workflow Task and, once the idle timer # expires, to park it; a subscription Workflow code has not begun diff --git a/temporalio/contrib/external_workflow_streams/_runtime.py b/temporalio/contrib/external_workflow_streams/_runtime.py index e57b3aa91..5cb4d5a1c 100644 --- a/temporalio/contrib/external_workflow_streams/_runtime.py +++ b/temporalio/contrib/external_workflow_streams/_runtime.py @@ -26,12 +26,13 @@ import asyncio import secrets -from collections.abc import Mapping, Sequence +from collections.abc import Iterable, Mapping, Sequence from dataclasses import dataclass from datetime import timedelta from typing import Any import temporalio.api.common.v1 +import temporalio.api.notification.v1 import temporalio.converter import temporalio.workflow from temporalio.contrib.external_workflow_streams._annotation import ( @@ -337,6 +338,10 @@ def __init__( #: because the two halves are in different modules and a second map #: would mean the side that resolves is never the side that registered. self._pending: dict[int, asyncio.Future[None]] = {} + #: Per channel, the latest notification a Workflow Task of this Run was + #: woken with. Positions only, never records: the reads that follow a + #: notification come from the Worker's watcher. + self._notifications: dict[str, temporalio.api.notification.v1.Notification] = {} #: Non-``None`` only while a recorded segment is being delivered. self._replay_ready: list[tuple[int, StreamRecord]] | None = None #: The bindings of the marker currently being replayed. Non-``None`` @@ -1496,6 +1501,26 @@ def clear_pending(self) -> None: """Drops every waiting future, as eviction requires.""" self._pending.clear() + def notifications_received( + self, notifications: Iterable[temporalio.api.notification.v1.Notification] + ) -> None: + """Notes the notifications a Workflow Task's scheduled event carried. + + Core resumes the parked waits for them; this side only remembers where + each channel's store stood, keeping the highest counter per channel the + way the server folds. Read from History, so a replay notes the same. + """ + for notification in notifications: + known = self._notifications.get(notification.channel) + if known is None or notification.counter >= known.counter: + self._notifications[notification.channel] = notification + + def latest_notification( + self, channel: str + ) -> temporalio.api.notification.v1.Notification | None: + """The latest notification this Run was woken with on ``channel``.""" + return self._notifications.get(channel) + # --- recording what Workflow code observed ------------------------------- def record_delivery(self, wait_id: int, record: StreamRecord) -> None: diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 5e2f2fa0a..8c372d858 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -241,6 +241,9 @@ def __init__( self._stream_metrics = StreamMetrics.create(metric_meter) self._external_stream_manager: Any = None + #: Whether the Runs this Worker builds subscribe to their streams' + #: notification channels. ``None`` until the server has been asked. + self._channel_subscriptions: bool | None = None self._workflow_failure_exception_types = workflow_failure_exception_types self._patch_activation_callback = patch_activation_callback @@ -473,6 +476,8 @@ async def _handle_activation( if self._external_stream_manager is not None: self._external_stream_manager.note_workflow_task_started(act.run_id) + if self._external_streams_configured and self._channel_subscriptions is None: + await self._decide_channel_subscriptions() # Build default success completion (e.g. remove-job-only activations) completion = ( @@ -1421,6 +1426,7 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: """ from temporalio.contrib.external_workflow_streams._wake import ( WakeRequest, + channel_for, send_wake, wake_position, wake_transport_of, @@ -1476,6 +1482,7 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: wake_counter=subscription.wake_counter, position=position, position_counter=position_counter, + channel=channel_for(key), ), transport=wake_transport_of(subscription.backend), ) @@ -1487,6 +1494,37 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: ) raise + async def _decide_channel_subscriptions(self) -> None: + """Turns the readers' channel subscriptions on when the server has channels. + + Decided once per Worker and before the Run is built, because the + decision is a lang flag the Run reads at construction. A probe that + cannot tell leaves the question open for the next activation; the Runs + built meanwhile do not subscribe, and their records still arrive by the + wake call or the Signal. + """ + from temporalio.contrib.external_workflow_streams._wake import ( + server_has_channels, + ) + + if self._client is None: + self._channel_subscriptions = False + return + try: + answer = await server_has_channels(self._client) + except Exception: + logger.warning( + "Could not ask the server whether it has notification channels", + exc_info=True, + ) + return + if answer is None: + return + self._channel_subscriptions = answer + self._set_default_workflow_logic_flag( + _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS, enabled=answer + ) + def _create_external_stream_runtime( self, act: temporalio.bridge.proto.workflow_activation.WorkflowActivation, diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 2710d22f9..2674de394 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -346,6 +346,7 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: ) self._patch_activation_callback = det.patch_activation_callback self._default_workflow_logic_flags = det.default_workflow_logic_flags + self._subscribed_channels: set[str] = set() self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False self._time_ns = 0 @@ -558,6 +559,10 @@ def activate( job_sets[0].append(job) elif job.HasField("signal_workflow") or job.HasField("do_update"): job_sets[1].append(job) + elif job.HasField("notifications_received"): + # Ordered with the Signals, where Core puts them: what a + # task was woken for is known before anything it resolves. + job_sets[1].append(job) elif job.HasField("replay_external_streams"): replay_jobs.append(job) elif not job.HasField("query_workflow"): @@ -763,6 +768,8 @@ def _apply( self._apply_resolve_external_stream_waits(job.resolve_external_stream_waits) elif job.HasField("replay_external_streams"): self._apply_replay_external_streams(job.replay_external_streams) + elif job.HasField("notifications_received"): + self._apply_notifications_received(job.notifications_received) elif job.HasField("resolve_child_workflow_execution"): self._apply_resolve_child_workflow_execution( job.resolve_child_workflow_execution @@ -954,6 +961,49 @@ def _apply_resolve_external_stream_waits( if self._external_stream_runtime is not None: self._external_stream_runtime.resolve_all_pending() + def _apply_notifications_received( + self, + job: temporalio.bridge.proto.workflow_activation.NotificationsReceived, + ) -> None: + """Notes the channel notifications this Workflow Task was woken with. + + Nothing is resumed from here. Core resolves the parked waits itself + when it hands over this job, live and on replay alike, and the resolve + job follows this one in the same activation. Resuming here as well + would wake every wait twice for one task. The runtime only keeps the + latest position per channel, which is what a notification is: where + the store stood, not a record. + """ + if self._external_stream_runtime is not None: + self._external_stream_runtime.notifications_received(job.notifications) + + def subscribe_channel(self, channel: str) -> bool: + """Makes this run a listener of ``channel``, once per channel per run. + + Emits the ``SubscribeNotificationChannel`` command. The server answers + it with an event and nothing else; the notifications arrive later on + the scheduled event of a Workflow Task. A second call for the same + channel changes nothing, so a run that opens two readers on one stream + pays one subscription. + + Gated behind a lang flag rather than emitted outright. A server without + channels fails a Workflow Task that carries the command, and the Worker + learns which server it talks to only at runtime. The flag records the + live decision in History, so a replay emits the command exactly where + the live run did, whatever server it replays against. + + Returns whether the run listens on the channel after this call. + """ + if channel in self._subscribed_channels: + return True + if self._read_only or not self._workflow_logic_flag_enabled( + _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS + ): + return False + self._subscribed_channels.add(channel) + self._add_command().subscribe_notification_channel.channel = channel + return True + def _apply_replay_external_streams( self, job: temporalio.bridge.proto.workflow_activation.ReplayExternalStreams, @@ -4613,6 +4663,9 @@ class _WorkflowLogicFlag(IntEnum): RAISE_ON_CANCELLING_COMPLETED_ACTIVITY = 1 PROCESS_WORKFLOW_ACTIVATION_JOBS_AS_SINGLE_BATCH = 2 + # Numbered away from the values upstream hands out in sequence, so a flag + # the main SDK adds later cannot read a History written with this one. + SUBSCRIBE_NOTIFICATION_CHANNELS = 100 # TODO: Enable PROCESS_WORKFLOW_ACTIVATION_JOBS_AS_SINGLE_BATCH by default after From 65b96d02265014105cb2f63c1114805bfc102715 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:40:28 -0700 Subject: [PATCH 767/831] Covered the channel transport, the subscription and the notified reader. The Signal-counting modules pin their backends to the Signal, since auto leaves none on a server with the channel or the wake call. --- .../external_workflow_streams/test_api.py | 32 +++ .../test_rollover_integration.py | 6 +- .../external_workflow_streams/test_wake.py | 261 ++++++++++++++++++ .../test_worker_handoff.py | 6 +- .../test_worker_integration.py | 77 +++++- 5 files changed, 379 insertions(+), 3 deletions(-) diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 0ed8b367e..e6fab5b5a 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -33,6 +33,7 @@ RecordKind, StreamRecord, ) +from temporalio.contrib.external_workflow_streams._wake import channel_for class FakeRuntime: @@ -790,3 +791,34 @@ async def decode(self, payloads: Any) -> Any: with pytest.raises(StreamDecodeError, match="could not be decoded"): await subscription.__aiter__().__anext__() assert runtime.consumed == [] + + +# --- the stream's channel ----------------------------------------------------- + + +def test_a_subscription_asks_the_run_to_listen_on_its_streams_channel( + runtime: FakeRuntime, workflow_instance: FakeInstance +) -> None: + """Every ``subscribe()`` asks; the Run keeps it to one command per channel.""" + asked: list[str] = [] + + def subscribe_channel(channel: str) -> bool: + asked.append(channel) + return True + + workflow_instance.subscribe_channel = subscribe_channel # type: ignore[attr-defined] + + external_stream.topic("tokens").subscribe() + external_stream.topic("tokens").subscribe() + external_stream.topic("events").subscribe() + + tokens = channel_for(runtime.stream_key("tokens")) + events = channel_for(runtime.stream_key("events")) + assert asked == [tokens, tokens, events] + + +def test_a_run_that_cannot_listen_still_subscribes(runtime: FakeRuntime) -> None: + # The bare FakeInstance has no subscribe_channel, like a Run object that + # predates the channel; the subscription itself is unaffected. + assert external_stream.topic("tokens").subscribe().wait_id == 1 + assert runtime.registrations[0][0] == 1 diff --git a/tests/contrib/external_workflow_streams/test_rollover_integration.py b/tests/contrib/external_workflow_streams/test_rollover_integration.py index 6c156fb0b..f68a2d1c8 100644 --- a/tests/contrib/external_workflow_streams/test_rollover_integration.py +++ b/tests/contrib/external_workflow_streams/test_rollover_integration.py @@ -183,7 +183,11 @@ async def run(self, before_pause: int) -> int: @pytest.fixture def backend() -> MemoryStreamBackend: - return MemoryStreamBackend() + backend = MemoryStreamBackend() + # These cases count the reserved Signal itself, so the transport is pinned + # to it rather than left to step down from a server that has more. + backend.wake_transport = "signal" + return backend async def stream_key_for(client: Client, handle: Any) -> StreamKey: diff --git a/tests/contrib/external_workflow_streams/test_wake.py b/tests/contrib/external_workflow_streams/test_wake.py index 72e49b545..bec1ce3cc 100644 --- a/tests/contrib/external_workflow_streams/test_wake.py +++ b/tests/contrib/external_workflow_streams/test_wake.py @@ -48,6 +48,7 @@ StreamRecord, ) from temporalio.contrib.external_workflow_streams._wake import ( + PROBE_CHANNEL, UNPARKED_WAKE_GENERATION, WAKE_SIGNAL_ENCODING, WAKE_SIGNAL_ENVELOPE_VERSION, @@ -55,8 +56,11 @@ WAKE_SIGNAL_NAME, WakeRequest, build_signal_request, + channel_for, send_wake, send_wake_signal, + server_has_channels, + wake_request_for, wake_request_id, ) from temporalio.worker import Worker @@ -2054,3 +2058,260 @@ async def test_a_wake_reports_a_position_appended_outside_the_producer() -> None [wake] = client.wakes assert wake.wake.position == outside.token.encode() assert wake.wake.counter == backend.wake_counter_for(outside) + + +# --- the notification channel ------------------------------------------------- + +UNIMPLEMENTED = temporalio.service.RPCStatusCode.UNIMPLEMENTED +NOT_FOUND = temporalio.service.RPCStatusCode.NOT_FOUND +UNAVAILABLE = temporalio.service.RPCStatusCode.UNAVAILABLE + + +class ChannelServiceClient(WakeServiceClient): + """A client whose service answers the channel calls, or refuses them.""" + + def __init__( + self, + refuse_channel: temporalio.service.RPCStatusCode | None = None, + refuse_wake: temporalio.service.RPCStatusCode | None = None, + listeners: int = 1, + describe: temporalio.service.RPCStatusCode | None = None, + ) -> None: + super().__init__(refuse=refuse_wake) + self.refuse_channel = refuse_channel + self.listeners = listeners + self.describe_status = describe + self.notified: list = [] + self.described: list = [] + + async def notify_channel(self, request): # type: ignore[no-untyped-def] + self.notified.append(request) + if self.refuse_channel is not None: + raise _rpc_error(self.refuse_channel) + return temporalio.api.workflowservice.v1.NotifyChannelResponse( + listener_count=self.listeners + ) + + async def describe_channel(self, request): # type: ignore[no-untyped-def] + self.described.append(request) + if self.describe_status is not None: + raise _rpc_error(self.describe_status) + return temporalio.api.workflowservice.v1.DescribeChannelResponse() + + +TOKENS_CHANNEL = channel_for(CHAIN.stream_key("tokens")) + + +def channel_request(**overrides) -> WakeRequest: # type: ignore[no-untyped-def] + return request(channel=TOKENS_CHANNEL, **overrides) + + +def test_the_channel_is_the_stream_identity_without_the_namespace() -> None: + key = StreamKey("ns", "wf-1", "first-run-1", "tokens") + + assert channel_for(key) == "external-stream/wf-1/first-run-1/input/tokens" + # The server scopes a channel to the namespace of the call. + assert channel_for(dataclasses.replace(key, namespace="other")) == channel_for(key) + + +def test_the_channel_tells_the_two_directions_apart() -> None: + from temporalio.contrib.external_workflow_streams._backend import StreamDirection + + key = StreamKey("ns", "wf-1", "first-run-1", "tokens") + output = dataclasses.replace(key, direction=StreamDirection.OUTPUT) + + assert channel_for(key) != channel_for(output) + + +def test_a_slash_in_a_name_cannot_borrow_another_streams_segments() -> None: + first = StreamKey("ns", "wf/1", "first-run-1", "tokens") + second = StreamKey("ns", "wf", "1/first-run-1", "tokens") + + assert channel_for(first) != channel_for(second) + assert channel_for(first).split("/")[1] == "wf%2F1" + + +def test_the_request_composed_for_a_chain_names_its_channel() -> None: + composed = wake_request_for( + CHAIN, stream_name="tokens", wait_id=1, park_generation=7, sender_identity="" + ) + + assert composed.channel == TOKENS_CHANNEL + + +def test_the_channel_is_not_part_of_the_request_id() -> None: + assert wake_request_id(channel_request()) == wake_request_id(request()) + + +@pytest.mark.asyncio +async def test_auto_notifies_the_channel_before_anything_else() -> None: + client = ChannelServiceClient() + + sent = await send_wake( + client, # type: ignore[arg-type] + channel_request(position=b"1700000000000-3", position_counter=42), + ) + + assert sent == wake_request_id(channel_request()) + assert client.wakes == [] + assert client.sent == [] + [notify] = client.notified + assert notify.namespace == "ns" + assert notify.notification.channel == TOKENS_CHANNEL + assert notify.notification.position == b"1700000000000-3" + assert notify.notification.counter == 42 + assert notify.identity == "producer-identity" + # The Signal's deduplication carried over: a retry is the same request. + assert notify.request_id == wake_request_id(channel_request()) + + +@pytest.mark.asyncio +async def test_a_channel_with_no_listeners_is_not_a_reason_to_step_down() -> None: + client = ChannelServiceClient(listeners=0) + + await send_wake(client, channel_request()) # type: ignore[arg-type] + await send_wake(client, channel_request()) # type: ignore[arg-type] + + assert len(client.notified) == 2 + assert client.wakes == [] + assert client.sent == [] + + +@pytest.mark.asyncio +async def test_auto_steps_down_to_the_wake_call_and_remembers_it() -> None: + client = ChannelServiceClient(refuse_channel=UNIMPLEMENTED) + + first = await send_wake(client, channel_request()) # type: ignore[arg-type] + second = await send_wake(client, channel_request()) # type: ignore[arg-type] + + assert first == second == "current-run" + assert len(client.notified) == 1, "the refusal was not remembered for the client" + assert len(client.wakes) == 2 + assert client.sent == [] + + +@pytest.mark.asyncio +async def test_auto_steps_down_twice_to_the_signal() -> None: + client = ChannelServiceClient( + refuse_channel=UNIMPLEMENTED, refuse_wake=UNIMPLEMENTED + ) + + await send_wake(client, channel_request()) # type: ignore[arg-type] + await send_wake(client, channel_request()) # type: ignore[arg-type] + + assert len(client.notified) == 1 + assert len(client.wakes) == 1 + assert len(client.sent) == 2 + + +@pytest.mark.asyncio +async def test_the_step_down_is_remembered_per_client() -> None: + old = ChannelServiceClient(refuse_channel=UNIMPLEMENTED) + new = ChannelServiceClient() + + await send_wake(old, channel_request()) # type: ignore[arg-type] + await send_wake(new, channel_request()) # type: ignore[arg-type] + + assert len(new.notified) == 1 + assert new.wakes == [] + + +@pytest.mark.asyncio +async def test_the_channel_transport_propagates_unimplemented() -> None: + client = ChannelServiceClient(refuse_channel=UNIMPLEMENTED) + + with pytest.raises(temporalio.service.RPCError) as raised: + await send_wake(client, channel_request(), transport="channel") # type: ignore[arg-type] + + assert raised.value.status == UNIMPLEMENTED + assert client.wakes == [] + assert client.sent == [] + # Asked for explicitly, so nothing is learned from it either. + client.refuse_channel = None + await send_wake(client, channel_request()) # type: ignore[arg-type] + assert len(client.notified) == 2 + assert client.wakes == [] + + +@pytest.mark.asyncio +async def test_the_channel_transport_needs_a_channel() -> None: + client = ChannelServiceClient() + + with pytest.raises(ValueError, match="channel"): + await send_wake(client, request(), transport="channel") # type: ignore[arg-type] + + # Under "auto" a request without a channel wakes by chain and learns nothing. + await send_wake(client, request()) # type: ignore[arg-type] + assert client.notified == [] + assert len(client.wakes) == 1 + await send_wake(client, channel_request()) # type: ignore[arg-type] + assert len(client.notified) == 1 + + +@pytest.mark.asyncio +async def test_a_client_without_the_notify_call_steps_down_under_auto() -> None: + client = WakeServiceClient() + + await send_wake(client, channel_request()) # type: ignore[arg-type] + + assert len(client.wakes) == 1 + assert client.sent == [] + with pytest.raises(RuntimeError, match="notify_channel"): + await send_wake( + WakeServiceClient(), # type: ignore[arg-type] + channel_request(), + transport="channel", + ) + + +@pytest.mark.asyncio +async def test_the_probe_says_yes_for_a_server_with_channels() -> None: + client = ChannelServiceClient() + + assert await server_has_channels(client) is True # type: ignore[arg-type] + + [described] = client.described + assert described.namespace == "ns" + assert described.channel == PROBE_CHANNEL + # An unknown channel is an answer from a server that knows the call. + unknown = ChannelServiceClient(describe=NOT_FOUND) + assert await server_has_channels(unknown) is True # type: ignore[arg-type] + + +@pytest.mark.asyncio +async def test_the_probe_remembers_a_server_without_channels() -> None: + client = ChannelServiceClient(describe=UNIMPLEMENTED) + + assert await server_has_channels(client) is False # type: ignore[arg-type] + + await send_wake(client, channel_request()) # type: ignore[arg-type] + assert client.notified == [], "the probe's answer was not shared with the writers" + assert len(client.wakes) == 1 + assert await server_has_channels(client) is False # type: ignore[arg-type] + assert len(client.described) == 1, "a remembered answer was asked for again" + + +@pytest.mark.asyncio +async def test_the_probe_leaves_an_unanswered_question_open() -> None: + client = ChannelServiceClient(describe=UNAVAILABLE) + + assert await server_has_channels(client) is None # type: ignore[arg-type] + + client.describe_status = None + assert await server_has_channels(client) is True # type: ignore[arg-type] + # A client whose service lacks the call has the answer in its shape. + assert await server_has_channels(WakeServiceClient()) is False # type: ignore[arg-type] + + +@pytest.mark.asyncio +async def test_a_producer_notifies_the_channel_of_the_stream_it_appended_to() -> None: + backend = MemoryStreamBackend() + client = ChannelServiceClient() + topic = make_producer(backend, client).topic("tokens") + + await topic.publish("hello") + + [notify] = client.notified + assert notify.notification.channel == channel_for(topic.stream_key) + assert client.wakes == [] + assert client.sent == [] diff --git a/tests/contrib/external_workflow_streams/test_worker_handoff.py b/tests/contrib/external_workflow_streams/test_worker_handoff.py index cf6b212a0..24294fc8b 100644 --- a/tests/contrib/external_workflow_streams/test_worker_handoff.py +++ b/tests/contrib/external_workflow_streams/test_worker_handoff.py @@ -138,7 +138,11 @@ async def run(self, expected: int) -> list[str]: @pytest.fixture def backend() -> MemoryStreamBackend: - return MemoryStreamBackend() + backend = MemoryStreamBackend() + # These cases read the reserved Signal's envelope, so the transport is + # pinned to it rather than left to step down from a server that has more. + backend.wake_transport = "signal" + return backend async def history(handle: Any) -> list[Any]: diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index 76e6c8be2..526755475 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -39,13 +39,15 @@ ) from temporalio.contrib.external_workflow_streams._wake import ( WakeRequest, + channel_for, send_wake_signal, + server_has_channels, wake_request_id, ) from temporalio.runtime import MetricBuffer, Runtime, TelemetryConfig from temporalio.service import RPCError, RPCStatusCode from temporalio.testing import WorkflowEnvironment -from temporalio.worker import Worker +from temporalio.worker import Replayer, Worker from tests.contrib.external_workflow_streams.memory_backend import MemoryStreamBackend with workflow.unsafe.imports_passed_through(): @@ -487,6 +489,9 @@ async def test_an_append_with_no_open_task_wakes_the_workflow( `NoOpenWorkflowTask` and sending the Signal is what makes the delivery reliable rather than incidental. """ + # The Signal is the mechanism under test, so it is asked for outright: on + # a server with channels or the wake call, "auto" would leave no Signal. + backend.wake_transport = "signal" task_queue = f"tq-{uuid.uuid4()}" async with Worker( client, @@ -1762,3 +1767,73 @@ async def test_each_failure_row_is_reported_as_its_own( f"the {row} failure incremented {sorted(counted)} rather than only " f"{metric}; an alert on one row must not be diluted by another" ) + + +async def test_an_outside_producer_wakes_the_reader_through_the_channel( + client: Client, backend: MemoryStreamBackend +) -> None: + """The channel path end to end: subscribe by command, notify, wake, replay. + + The same shape as the Signal case, with the backend asking for the channel + outright so a fallback fails the History checks below instead of passing + quietly. The Run subscribes to the stream's channel on the task that opens + the reader, the watcher notifies that channel when no task is open, and the + task the server schedules carries the notification. History then holds the + subscription event and no Signal, and a cold replay of it emits the + subscribe command where the live run did. + """ + if not await server_has_channels(client): + pytest.skip("the server does not implement notification channels") + backend.wake_transport = "channel" + task_queue = f"tq-{uuid.uuid4()}" + async with Worker( + client, + task_queue=task_queue, + workflows=[TimerThenConsumeWorkflow], + external_stream_backend=backend, + ): + handle = await client.start_workflow( + TimerThenConsumeWorkflow.run, + id=f"wf-{uuid.uuid4()}", + task_queue=task_queue, + ) + description = await handle.describe() + key = StreamKey( + client.namespace, + handle.id, + description.raw_description.workflow_execution_info.first_run_id, + "tokens", + ) + await asyncio.sleep(1) + await publish(backend, key, ["first"]) + await asyncio.sleep(1) + await publish(backend, key, ["second"]) + + assert await asyncio.wait_for(handle.result(), 60) == ["first", "second"] + + events = [e async for e in handle.fetch_history_events()] + signals = [ + e for e in events if e.HasField("workflow_execution_signaled_event_attributes") + ] + assert signals == [], ( + "a Signal woke the reader, so the channel was not the transport" + ) + subscribed = [ + e.workflow_notification_channel_subscribed_event_attributes.channel + for e in events + if e.HasField("workflow_notification_channel_subscribed_event_attributes") + ] + assert subscribed == [channel_for(key)] + notified = [ + notification + for e in events + if e.HasField("workflow_task_scheduled_event_attributes") + for notification in e.workflow_task_scheduled_event_attributes.notifications + ] + assert notified, "no Workflow Task was scheduled with a notification" + assert {n.channel for n in notified} == {channel_for(key)} + + result = await Replayer( + workflows=[TimerThenConsumeWorkflow], external_stream_backend=backend + ).replay_workflow(await handle.fetch_history()) + assert result.replay_failure is None, f"replay failed: {result.replay_failure}" From bb7e6fbc06afce990cc41e4b55e8b030cab35990 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:48:16 -0700 Subject: [PATCH 768/831] Added the notification channel surface to the workflow and client. The same names as the main chain: workflow.subscribe_channel() with ChannelSubscription and Notification, and the five channel calls on the client. The external-stream runtime keeps its gated entry beside the public one, and both emit the command once per channel per run. --- temporalio/client/__init__.py | 16 + temporalio/client/_channel.py | 78 ++++ temporalio/client/_client.py | 190 +++++++++ temporalio/client/_impl.py | 122 ++++++ temporalio/client/_interceptor.py | 125 ++++++ .../contrib/external_workflow_streams/_api.py | 6 +- temporalio/worker/_workflow_instance.py | 97 +++-- temporalio/workflow/__init__.py | 8 + temporalio/workflow/_channels.py | 144 +++++++ temporalio/workflow/_context.py | 4 + .../external_workflow_streams/conftest.py | 42 ++ .../external_workflow_streams/test_api.py | 6 +- .../test_channels.py | 365 ++++++++++++++++++ 13 files changed, 1171 insertions(+), 32 deletions(-) create mode 100644 temporalio/client/_channel.py create mode 100644 temporalio/workflow/_channels.py create mode 100644 tests/contrib/external_workflow_streams/test_channels.py diff --git a/temporalio/client/__init__.py b/temporalio/client/__init__.py index cdb34b860..53f7c433b 100644 --- a/temporalio/client/__init__.py +++ b/temporalio/client/__init__.py @@ -59,6 +59,10 @@ from ._callback import ( Callback, ) +from ._channel import ( + ChannelDescription, + ChannelListener, +) from ._client import ( Client, ClientConfig, @@ -101,6 +105,7 @@ CreateScheduleInput, DeleteScheduleInput, DescribeActivityInput, + DescribeChannelInput, DescribeNexusOperationInput, DescribeScheduleInput, DescribeWorkflowInput, @@ -115,9 +120,12 @@ ListNexusOperationsInput, ListSchedulesInput, ListWorkflowsInput, + NotifyChannelInput, OutboundInterceptor, PauseScheduleInput, + PollChannelInput, QueryWorkflowInput, + RegisterChannelListenerInput, ReportCancellationAsyncActivityInput, SignalWorkflowInput, StartActivityInput, @@ -130,6 +138,7 @@ TerminateWorkflowInput, TriggerScheduleInput, UnpauseScheduleInput, + UnregisterChannelListenerInput, UpdateScheduleInput, UpdateWithStartStartWorkflowInput, UpdateWithStartUpdateWorkflowInput, @@ -300,6 +309,11 @@ "TerminateNexusOperationInput", "ListNexusOperationsInput", "CountNexusOperationsInput", + "DescribeChannelInput", + "NotifyChannelInput", + "PollChannelInput", + "RegisterChannelListenerInput", + "UnregisterChannelListenerInput", "StartWorkflowUpdateInput", "UpdateWithStartUpdateWorkflowInput", "UpdateWithStartStartWorkflowInput", @@ -336,6 +350,8 @@ "CloudOperationsClient", "Plugin", "Callback", + "ChannelDescription", + "ChannelListener", "_ClientImpl", "_apply_headers", "_decode_user_metadata", diff --git a/temporalio/client/_channel.py b/temporalio/client/_channel.py new file mode 100644 index 000000000..09d5e1d23 --- /dev/null +++ b/temporalio/client/_channel.py @@ -0,0 +1,78 @@ +"""Notification channel descriptions as the client reports them.""" + +from __future__ import annotations + +from collections.abc import Sequence +from dataclasses import dataclass +from datetime import datetime, timezone + +import temporalio.api.notification.v1 +from temporalio.workflow import Notification + +from ._callback import Callback + +__all__ = ["ChannelDescription", "ChannelListener"] + + +@dataclass(frozen=True) +class ChannelListener: + """One listener of a channel: a workflow or a callback. + + .. warning:: + This API is experimental and unstable. + """ + + listener_id: str + """Assigned by the server when the listener registered.""" + + workflow_id: str | None + """The subscribed workflow, when the listener is one.""" + + run_id: str | None + """The run that subscribed. Delivery follows the chain's current run.""" + + callback: Callback | None + """The callback the server invokes, when the listener is one.""" + + registered_time: datetime | None + """When the listener registered.""" + + @staticmethod + def _from_proto( + proto: temporalio.api.notification.v1.ChannelListener, + ) -> ChannelListener: + callback: Callback | None = None + if proto.HasField("callback") and proto.callback.HasField("nexus"): + callback = Callback( + url=proto.callback.nexus.url, headers=dict(proto.callback.nexus.header) + ) + workflow = proto.workflow if proto.HasField("workflow") else None + return ChannelListener( + listener_id=proto.listener_id, + workflow_id=workflow.workflow_id if workflow else None, + run_id=workflow.run_id if workflow else None, + callback=callback, + registered_time=( + proto.registered_time.ToDatetime(tzinfo=timezone.utc) + if proto.HasField("registered_time") + else None + ), + ) + + +@dataclass(frozen=True) +class ChannelDescription: + """What the server knows about a channel. + + .. warning:: + This API is experimental and unstable. + """ + + listeners: Sequence[ChannelListener] + """Who is listening, workflows and callbacks alike.""" + + latest: Notification | None + """The notification with the highest counter the channel retains.""" + + retained_count: int + """How many notifications the channel keeps for pollers.""" diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 5acdfe476..f0fa8aaa9 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -64,22 +64,28 @@ AsyncActivityIDReference, ) from ._callback import Callback +from ._channel import ChannelDescription from ._impl import _ClientImpl from ._interceptor import ( CountActivitiesInput, CountNexusOperationsInput, CountWorkflowsInput, CreateScheduleInput, + DescribeChannelInput, GetWorkerBuildIdCompatibilityInput, GetWorkerTaskReachabilityInput, ListActivitiesInput, ListNexusOperationsInput, ListSchedulesInput, ListWorkflowsInput, + NotifyChannelInput, OutboundInterceptor, + PollChannelInput, + RegisterChannelListenerInput, StartActivityInput, StartWorkflowInput, StartWorkflowUpdateWithStartInput, + UnregisterChannelListenerInput, UpdateWithStartUpdateWorkflowInput, UpdateWorkerBuildIdCompatibilityInput, ) @@ -115,6 +121,9 @@ from ._interceptor import Interceptor from ._plugin import Plugin +DEFAULT_CHANNEL_POLL_WAIT = timedelta(seconds=30) +"""How long :py:meth:`Client.poll_channel` waits for a notification by default.""" + class Client: """Client for accessing Temporal. @@ -2880,6 +2889,187 @@ async def get_worker_task_reachability( ) ) + async def notify_channel( + self, + channel: str, + *, + position: bytes = b"", + counter: int = 0, + metadata: Mapping[str, Any] | None = None, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> int: + """Notify the listeners of ``channel`` that a source they consume has moved. + + A workflow listening with :py:func:`temporalio.workflow.subscribe_channel` + runs a Workflow Task that carries the notification. The server folds + notifications per listener while one is pending, keeping the one with + the highest ``counter``, so a burst of writes costs a listener one task. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + position: Where the source stands after the write, in the writer's + own terms. Opaque to the server. + counter: Orders notifications from this channel's writers. Derive it + from ``position``, since only the source can order its positions. + metadata: Details for the listener, such as which topic moved. Each + value is encoded with the client's data converter. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + + Returns: + How many listeners the channel had when the notification arrived. + """ + return await self._impl.notify_channel( + NotifyChannelInput( + channel=channel, + position=position, + counter=counter, + metadata=metadata, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + ) + ) + + async def poll_channel( + self, + channel: str, + *, + after_counter: int = 0, + wait: bool | timedelta = True, + max_notifications: int = 100, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> list[temporalio.workflow.Notification]: + """Read the notifications ``channel`` retains above a counter. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + after_counter: Only notifications with a counter above this one are + returned. Pass the highest counter seen so far to page. + wait: How long the server holds the call when nothing is retained + above ``after_counter``. ``True`` waits up to + :py:data:`DEFAULT_CHANNEL_POLL_WAIT`, ``False`` returns at once. + max_notifications: Upper bound on the notifications returned. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + + Returns: + The notifications, oldest first. Empty when the wait ran out. + """ + if wait is True: + wait_for: timedelta | None = DEFAULT_CHANNEL_POLL_WAIT + elif wait is False: + wait_for = None + else: + wait_for = wait + return await self._impl.poll_channel( + PollChannelInput( + channel=channel, + after_counter=after_counter, + wait=wait_for, + max_notifications=max_notifications, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + ) + ) + + async def describe_channel( + self, + channel: str, + *, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> ChannelDescription: + """Describe ``channel``: its listeners and what it retains. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + """ + return await self._impl.describe_channel( + DescribeChannelInput( + channel=channel, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout + ) + ) + + async def register_channel_listener( + self, + channel: str, + callback: Callback, + *, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> str: + """Register ``callback`` as a listener of ``channel``. + + The server invokes the callback with each notification on the channel + until :py:meth:`unregister_channel_listener` removes it. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + callback: The callback to invoke. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + + Returns: + The listener id the server assigned. + """ + return await self._impl.register_channel_listener( + RegisterChannelListenerInput( + channel=channel, + callback=callback, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + ) + ) + + async def unregister_channel_listener( + self, + channel: str, + listener_id: str, + *, + rpc_metadata: Mapping[str, str | bytes] = {}, + rpc_timeout: timedelta | None = None, + ) -> None: + """Remove a listener from ``channel``. + + .. warning:: + This API is experimental and unstable. + + Args: + channel: Name of the channel, scoped to the namespace. + listener_id: The id :py:meth:`register_channel_listener` returned. + rpc_metadata: Headers used on the RPC call. Keys here override + client-level RPC metadata keys. + rpc_timeout: Optional RPC deadline to set for the RPC call. + """ + await self._impl.unregister_channel_listener( + UnregisterChannelListenerInput( + channel=channel, + listener_id=listener_id, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + ) + ) + def create_nexus_client( self, service: type[NexusServiceType] | str, diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index 9595351f2..bbab0b890 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -23,6 +23,7 @@ import temporalio.api.enums.v1 import temporalio.api.errordetails.v1 import temporalio.api.failure.v1 +import temporalio.api.notification.v1 import temporalio.api.schedule.v1 import temporalio.api.taskqueue.v1 import temporalio.api.update.v1 @@ -32,6 +33,7 @@ import temporalio.exceptions import temporalio.nexus import temporalio.nexus._operation_context +import temporalio.workflow from temporalio.activity import ActivityCancellationDetails from temporalio.converter import ( ActivitySerializationContext, @@ -53,6 +55,7 @@ ActivityHandle, AsyncActivityIDReference, ) +from ._channel import ChannelDescription, ChannelListener from ._exceptions import ( AsyncActivityCancelledError, ScheduleAlreadyRunningError, @@ -73,6 +76,7 @@ CreateScheduleInput, DeleteScheduleInput, DescribeActivityInput, + DescribeChannelInput, DescribeNexusOperationInput, DescribeScheduleInput, DescribeWorkflowInput, @@ -86,9 +90,12 @@ ListNexusOperationsInput, ListSchedulesInput, ListWorkflowsInput, + NotifyChannelInput, OutboundInterceptor, PauseScheduleInput, + PollChannelInput, QueryWorkflowInput, + RegisterChannelListenerInput, ReportCancellationAsyncActivityInput, SignalWorkflowInput, StartActivityInput, @@ -101,6 +108,7 @@ TerminateWorkflowInput, TriggerScheduleInput, UnpauseScheduleInput, + UnregisterChannelListenerInput, UpdateScheduleInput, UpdateWithStartStartWorkflowInput, UpdateWithStartUpdateWorkflowInput, @@ -1697,6 +1705,120 @@ async def count_nexus_operations( ) ) + ### Notification channel calls + + async def notify_channel(self, input: NotifyChannelInput) -> int: + notification = temporalio.api.notification.v1.Notification( + channel=input.channel, position=input.position, counter=input.counter + ) + for key, value in (input.metadata or {}).items(): + [payload] = await self._client.data_converter.encode([value]) + notification.metadata[key].CopyFrom(payload) + resp = await self._client.workflow_service.notify_channel( + temporalio.api.workflowservice.v1.NotifyChannelRequest( + namespace=self._client.namespace, + notification=notification, + identity=self._client.identity, + request_id=str(uuid.uuid4()), + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, + ) + return resp.listener_count + + async def poll_channel( + self, input: PollChannelInput + ) -> list[temporalio.workflow.Notification]: + req = temporalio.api.workflowservice.v1.PollChannelRequest( + namespace=self._client.namespace, + channel=input.channel, + after_counter=input.after_counter, + max_notifications=input.max_notifications, + ) + if input.wait is not None: + req.wait.FromTimedelta(input.wait) + resp = await self._client.workflow_service.poll_channel( + req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout + ) + return [await self._notification_from_proto(n) for n in resp.notifications] + + async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescription: + resp = await self._client.workflow_service.describe_channel( + temporalio.api.workflowservice.v1.DescribeChannelRequest( + namespace=self._client.namespace, channel=input.channel + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, + ) + return ChannelDescription( + listeners=[ + ChannelListener._from_proto(listener) for listener in resp.listeners + ], + latest=( + await self._notification_from_proto(resp.latest) + if resp.HasField("latest") + else None + ), + retained_count=resp.retained_count, + ) + + async def register_channel_listener( + self, input: RegisterChannelListenerInput + ) -> str: + resp = await self._client.workflow_service.register_channel_listener( + temporalio.api.workflowservice.v1.RegisterChannelListenerRequest( + namespace=self._client.namespace, + channel=input.channel, + callback=temporalio.api.common.v1.Callback( + nexus=temporalio.api.common.v1.Callback.Nexus( + url=input.callback.url, header=input.callback.headers + ) + ), + request_id=str(uuid.uuid4()), + identity=self._client.identity, + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, + ) + return resp.listener_id + + async def unregister_channel_listener( + self, input: UnregisterChannelListenerInput + ) -> None: + await self._client.workflow_service.unregister_channel_listener( + temporalio.api.workflowservice.v1.UnregisterChannelListenerRequest( + namespace=self._client.namespace, + channel=input.channel, + listener_id=input.listener_id, + identity=self._client.identity, + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, + ) + + async def _notification_from_proto( + self, proto: temporalio.api.notification.v1.Notification + ) -> temporalio.workflow.Notification: + # The worker runs the codec over a workflow's notifications before + # they reach workflow code. The client does the same here, so both + # sides hand out payloads a converter can read. + metadata = dict(proto.metadata.items()) + codec = self._client.data_converter.payload_codec + if codec and metadata: + keys = list(metadata) + decoded = await codec.decode([metadata[k] for k in keys]) + metadata = dict(zip(keys, decoded)) + return temporalio.workflow.Notification( + channel=proto.channel, + position=proto.position, + counter=proto.counter, + metadata=metadata, + ) + async def _apply_headers( self, source: Mapping[str, temporalio.api.common.v1.Payload] | None, diff --git a/temporalio/client/_interceptor.py b/temporalio/client/_interceptor.py index a6daedd45..9270e577e 100644 --- a/temporalio/client/_interceptor.py +++ b/temporalio/client/_interceptor.py @@ -25,6 +25,8 @@ from ._callback import Callback if TYPE_CHECKING: + import temporalio.workflow + from ._activity import ( ActivityExecutionAsyncIterator, ActivityExecutionCount, @@ -32,6 +34,8 @@ ActivityHandle, AsyncActivityIDReference, ) + from ._callback import Callback + from ._channel import ChannelDescription from ._nexus import ( NexusOperationExecutionAsyncIterator, NexusOperationExecutionCount, @@ -679,6 +683,79 @@ class CountNexusOperationsInput: rpc_timeout: timedelta | None +@dataclass +class NotifyChannelInput: + """Input for :py:meth:`OutboundInterceptor.notify_channel`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + position: bytes + counter: int + metadata: Mapping[str, Any] | None + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + +@dataclass +class PollChannelInput: + """Input for :py:meth:`OutboundInterceptor.poll_channel`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + after_counter: int + wait: timedelta | None + max_notifications: int + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + +@dataclass +class DescribeChannelInput: + """Input for :py:meth:`OutboundInterceptor.describe_channel`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + +@dataclass +class RegisterChannelListenerInput: + """Input for :py:meth:`OutboundInterceptor.register_channel_listener`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + callback: Callback + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + +@dataclass +class UnregisterChannelListenerInput: + """Input for :py:meth:`OutboundInterceptor.unregister_channel_listener`. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + listener_id: str + rpc_metadata: Mapping[str, str | bytes] + rpc_timeout: timedelta | None + + @dataclass class Interceptor: """Interceptor for clients. @@ -979,3 +1056,51 @@ async def count_nexus_operations( This API is experimental and unstable. """ return await self.next.count_nexus_operations(input) + + ### Notification channel calls + + async def notify_channel(self, input: NotifyChannelInput) -> int: + """Called for every :py:meth:`Client.notify_channel` call. + + .. warning:: + This API is experimental and unstable. + """ + return await self.next.notify_channel(input) + + async def poll_channel( + self, input: PollChannelInput + ) -> list[temporalio.workflow.Notification]: + """Called for every :py:meth:`Client.poll_channel` call. + + .. warning:: + This API is experimental and unstable. + """ + return await self.next.poll_channel(input) + + async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescription: + """Called for every :py:meth:`Client.describe_channel` call. + + .. warning:: + This API is experimental and unstable. + """ + return await self.next.describe_channel(input) + + async def register_channel_listener( + self, input: RegisterChannelListenerInput + ) -> str: + """Called for every :py:meth:`Client.register_channel_listener` call. + + .. warning:: + This API is experimental and unstable. + """ + return await self.next.register_channel_listener(input) + + async def unregister_channel_listener( + self, input: UnregisterChannelListenerInput + ) -> None: + """Called for every :py:meth:`Client.unregister_channel_listener` call. + + .. warning:: + This API is experimental and unstable. + """ + await self.next.unregister_channel_listener(input) diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index bbb620694..5f0a532ac 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -312,9 +312,9 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: # the Run rather than of the stream runtime, because the answer is a # command and commands are the Run's to emit; it also decides, from the # server it talks to, whether to emit one at all. - subscribe_channel = getattr(_run_holder(), "subscribe_channel", None) - if subscribe_channel is not None: - subscribe_channel(channel_for(stream_key)) + subscribe = getattr(_run_holder(), "subscribe_stream_channel", None) + if subscribe is not None: + subscribe(channel_for(stream_key)) # Registering a wait is not blocking on one. The quiescent snapshot is a # request to Core to retain the Workflow Task and, once the idle timer # expires, to park it; a subscription Workflow code has not begun diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 2674de394..1b0572f44 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -347,6 +347,13 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: self._patch_activation_callback = det.patch_activation_callback self._default_workflow_logic_flags = det.default_workflow_logic_flags self._subscribed_channels: set[str] = set() + # Keyed by channel name; one subscription per channel per run + self._channel_subscriptions: dict[ + str, temporalio.workflow.ChannelSubscription + ] = {} + #: The gate's answer for this run, taken on the first stream subscription + #: and kept until continue-as-new; see ``subscribe_stream_channel``. + self._stream_channels_enabled: bool | None = None self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False self._time_ns = 0 @@ -965,44 +972,79 @@ def _apply_notifications_received( self, job: temporalio.bridge.proto.workflow_activation.NotificationsReceived, ) -> None: - """Notes the channel notifications this Workflow Task was woken with. - - Nothing is resumed from here. Core resolves the parked waits itself - when it hands over this job, live and on replay alike, and the resolve - job follows this one in the same activation. Resuming here as well - would wake every wait twice for one task. The runtime only keeps the - latest position per channel, which is what a notification is: where - the store stood, not a record. + """Hands the notifications this Workflow Task was woken with to their takers. + + A public subscription gets them in arrival order. The external-stream + runtime only notes the latest position per channel: Core resolves the + parked waits itself when it hands over this job, live and on replay + alike, and the resolve job follows this one in the same activation, so + resuming here as well would wake every wait twice for one task. """ + for proto in job.notifications: + subscription = self._channel_subscriptions.get(proto.channel) + if subscription is not None: + subscription._deliver( + temporalio.workflow.Notification._from_proto(proto) + ) + elif proto.channel not in self._subscribed_channels: + # The server fans out to whatever listened at the time, so a + # channel this run never subscribed to is not the workflow's + # concern. + logger.debug( + "Dropping a notification on channel %r, which this run has not " + "subscribed to", + proto.channel, + ) if self._external_stream_runtime is not None: self._external_stream_runtime.notifications_received(job.notifications) - def subscribe_channel(self, channel: str) -> bool: - """Makes this run a listener of ``channel``, once per channel per run. - - Emits the ``SubscribeNotificationChannel`` command. The server answers - it with an event and nothing else; the notifications arrive later on - the scheduled event of a Workflow Task. A second call for the same - channel changes nothing, so a run that opens two readers on one stream - pays one subscription. - - Gated behind a lang flag rather than emitted outright. A server without - channels fails a Workflow Task that carries the command, and the Worker - learns which server it talks to only at runtime. The flag records the - live decision in History, so a replay emits the command exactly where - the live run did, whatever server it replays against. + def workflow_subscribe_channel( + self, channel: str + ) -> temporalio.workflow.ChannelSubscription: + existing = self._channel_subscriptions.get(channel) + if existing is not None: + return existing + self._issue_channel_subscription(channel) + subscription = temporalio.workflow.ChannelSubscription(channel) + self._channel_subscriptions[channel] = subscription + return subscription + + def subscribe_stream_channel(self, channel: str) -> bool: + """Makes this run a listener of an external stream's channel, when it can. + + The external-stream runtime's entry, gated where the public + :py:func:`temporalio.workflow.subscribe_channel` is not: a reader opens + on whatever server the Worker talks to, and a server without channels + fails a Workflow Task that carries the command. The Worker asks the + server once and the answer becomes a lang flag, read here on the run's + first stream subscription and kept until continue-as-new, so a replay + emits the command exactly where the live run did. Returns whether the run listens on the channel after this call. """ if channel in self._subscribed_channels: return True - if self._read_only or not self._workflow_logic_flag_enabled( - _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS - ): + if self._read_only: return False + if self._stream_channels_enabled is None: + self._stream_channels_enabled = self._workflow_logic_flag_enabled( + _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS + ) + if not self._stream_channels_enabled: + return False + self._issue_channel_subscription(channel) + return True + + def _issue_channel_subscription(self, channel: str) -> None: + """Emits the subscribe command once per channel per run. + + A second command for one channel would only record a second event, so + the public subscription and the stream runtime share this set. + """ + if channel in self._subscribed_channels: + return self._subscribed_channels.add(channel) self._add_command().subscribe_notification_channel.channel = channel - return True def _apply_replay_external_streams( self, @@ -4663,6 +4705,9 @@ class _WorkflowLogicFlag(IntEnum): RAISE_ON_CANCELLING_COMPLETED_ACTIVITY = 1 PROCESS_WORKFLOW_ACTIVATION_JOBS_AS_SINGLE_BATCH = 2 + # Whether the run's external-stream readers subscribe to their channels. + # Set by the Worker from one probe of the server; a run reads it on its + # first stream subscription and keeps that answer until continue-as-new. # Numbered away from the values upstream hands out in sequence, so a flag # the main SDK adds later cannot read a History written with this one. SUBSCRIBE_NOTIFICATION_CHANNELS = 100 diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index fa2681139..85b442364 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -57,6 +57,11 @@ as_completed, wait, ) +from ._channels import ( + ChannelSubscription, + Notification, + subscribe_channel, +) from ._context import ( Info, ParentInfo, @@ -252,6 +257,9 @@ "SandboxImportNotificationPolicy", "logger", "unsafe", + "ChannelSubscription", + "Notification", + "subscribe_channel", "ChildWorkflowCancellationType", "ChildWorkflowConfig", "ChildWorkflowHandle", diff --git a/temporalio/workflow/_channels.py b/temporalio/workflow/_channels.py new file mode 100644 index 000000000..8fd045519 --- /dev/null +++ b/temporalio/workflow/_channels.py @@ -0,0 +1,144 @@ +"""Notification channels from inside workflow code. + +.. warning:: + This module is experimental and may change in future versions. + +A channel carries notifications, not data. A writer tells the channel's +listeners that a source they consume has moved, and each listener reads the +source itself. A workflow that subscribes gets the notifications the server +folded for it with each Workflow Task. They travel in History, so a replay +sees the same ones at the same points. +""" + +from __future__ import annotations + +import asyncio +from collections import deque +from collections.abc import Mapping +from dataclasses import dataclass, field + +import temporalio.api.common.v1 +import temporalio.api.notification.v1 +from temporalio.workflow._context import _Runtime + +__all__ = ["ChannelSubscription", "Notification", "subscribe_channel"] + + +@dataclass(frozen=True) +class Notification: + """One notification from a channel. + + The server folds notifications per listener while one is pending and no + task has been scheduled for it, keeping the one with the highest counter. + A listener therefore sees where a burst of writes ended, not every write. + """ + + channel: str + """The channel the writer notified.""" + + position: bytes + """Where the source stands after the write, in the writer's terms. + + Opaque to the server and handed over as sent. + """ + + counter: int + """Orders notifications from one channel's writers. Higher is later.""" + + metadata: Mapping[str, temporalio.api.common.v1.Payload] = field( + default_factory=dict + ) + """Details for the listener, such as which topic moved, as payloads. + + A codec has been applied. Convert a value with + :py:meth:`temporalio.converter.PayloadConverter.from_payload` on the + converter :py:func:`temporalio.workflow.payload_converter` returns. + """ + + @staticmethod + def _from_proto( + proto: temporalio.api.notification.v1.Notification, + ) -> Notification: + return Notification( + channel=proto.channel, + position=proto.position, + counter=proto.counter, + metadata=dict(proto.metadata.items()), + ) + + +class ChannelSubscription: + """A workflow's subscription to one channel. + + Prefer :func:`temporalio.workflow.subscribe_channel`. The subscription is + an async iterator over the notifications as they arrive, and + :meth:`receive` takes them one at a time. Notifications wait in arrival + order until taken. Two loops on one subscription share its buffer and + interleave. + """ + + def __init__(self, channel: str) -> None: + """Prefer :func:`temporalio.workflow.subscribe_channel`.""" + self._channel = channel + self._pending: deque[Notification] = deque() + self._waiters: deque[asyncio.Future[None]] = deque() + + @property + def channel(self) -> str: + """The channel this subscription is on.""" + return self._channel + + async def receive(self) -> Notification: + """The next notification on this channel, waiting for one to arrive. + + The wait is a future the delivery resolves, so it adds no command and + replays the same way. + """ + while not self._pending: + waiter: asyncio.Future[None] = asyncio.Future() + self._waiters.append(waiter) + try: + await waiter + finally: + if waiter in self._waiters: + self._waiters.remove(waiter) + return self._pending.popleft() + + def __aiter__(self) -> ChannelSubscription: + """The subscription is its own iterator.""" + return self + + async def __anext__(self) -> Notification: + """The next notification; the iteration never ends on its own.""" + return await self.receive() + + def _deliver(self, notification: Notification) -> None: + self._pending.append(notification) + # Every waiter wakes; the ones that find the buffer empty again wait + # once more. + while self._waiters: + waiter = self._waiters.popleft() + if not waiter.done(): + waiter.set_result(None) + + +def subscribe_channel(channel: str) -> ChannelSubscription: + """Subscribe this workflow to ``channel``. + + The first call for a channel in a run issues a command, so gate a new + channel with :func:`temporalio.workflow.patched` as you would a timer. A + second call for the same channel returns the subscription already open, + and the two share its buffer. From then on each Workflow Task carries the + notifications the server folded for this workflow on the channel, and + they arrive here. A successor run after continue-as-new starts with no + subscriptions. + + Args: + channel: Name of the channel, scoped to the namespace. + + Raises: + ValueError: ``channel`` is empty. + """ + if not channel: + raise ValueError("channel must not be empty") + return _Runtime.current().workflow_subscribe_channel(channel) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index b33f83150..62674c251 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -22,6 +22,7 @@ if TYPE_CHECKING: from ._activities import ActivityCancellationType, ActivityHandle + from ._channels import ChannelSubscription from ._exceptions import ContinueAsNewVersioningBehavior, VersioningIntent from ._nexus import NexusOperationCancellationType, NexusOperationHandle from ._workflow_ops import ( @@ -475,6 +476,9 @@ async def workflow_start_nexus_operation( summary: str | None, ) -> NexusOperationHandle[OutputT]: ... + @abstractmethod + def workflow_subscribe_channel(self, channel: str) -> ChannelSubscription: ... + @abstractmethod def workflow_time_ns(self) -> int: ... diff --git a/tests/contrib/external_workflow_streams/conftest.py b/tests/contrib/external_workflow_streams/conftest.py index ab2b4a395..db39230a5 100644 --- a/tests/contrib/external_workflow_streams/conftest.py +++ b/tests/contrib/external_workflow_streams/conftest.py @@ -20,6 +20,48 @@ #: that asks for neither never observes a clock, so no environment can fail it. _SERVER_FIXTURES = frozenset({"client", "env"}) +#: The environments whose server the suite starts for itself. None of them +#: accepts the subscribe-notification-channel command. +_ENVIRONMENTS_WITHOUT_CHANNELS = ("local", "time-skipping", "envconfig") + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "needs_channel_server: the case needs a server that serves notification " + "channels, named with -E host:port", + ) + + +def pytest_collection_modifyitems( + config: pytest.Config, items: list[pytest.Item] +) -> None: + if config.getoption("--workflow-environment") not in _ENVIRONMENTS_WITHOUT_CHANNELS: + return + skip = pytest.mark.skip( + reason="needs a server that serves notification channels; name one with -E" + ) + for item in items: + if item.get_closest_marker("needs_channel_server"): + item.add_marker(skip) + + +@pytest_asyncio.fixture # type: ignore[reportUntypedFunctionDecorator] +async def first_task_retained(client: object) -> None: + """Holds a case to servers where the task that opens a reader stays open. + + On a server with notification channels that task carries the subscribe + command, which Core cannot retain or park, so a case built on a retained or + parked first task measures nothing there. + """ + from temporalio.contrib.external_workflow_streams._wake import server_has_channels + + if await server_has_channels(client): # type: ignore[arg-type] + pytest.skip( + "the subscribe command ends the task that opens the first reader; " + "the follow-up defers it to the leaving completion" + ) + @pytest.fixture(autouse=True) def skip_under_time_skipping(request: pytest.FixtureRequest) -> None: diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index e6fab5b5a..14748a165 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -806,7 +806,7 @@ def subscribe_channel(channel: str) -> bool: asked.append(channel) return True - workflow_instance.subscribe_channel = subscribe_channel # type: ignore[attr-defined] + workflow_instance.subscribe_stream_channel = subscribe_channel # type: ignore[attr-defined] external_stream.topic("tokens").subscribe() external_stream.topic("tokens").subscribe() @@ -818,7 +818,7 @@ def subscribe_channel(channel: str) -> bool: def test_a_run_that_cannot_listen_still_subscribes(runtime: FakeRuntime) -> None: - # The bare FakeInstance has no subscribe_channel, like a Run object that - # predates the channel; the subscription itself is unaffected. + # The bare FakeInstance has no subscribe_stream_channel, like a Run object + # that predates the channel; the subscription itself is unaffected. assert external_stream.topic("tokens").subscribe().wait_id == 1 assert runtime.registrations[0][0] == 1 diff --git a/tests/contrib/external_workflow_streams/test_channels.py b/tests/contrib/external_workflow_streams/test_channels.py new file mode 100644 index 000000000..6a5b4f1ec --- /dev/null +++ b/tests/contrib/external_workflow_streams/test_channels.py @@ -0,0 +1,365 @@ +"""The notification channel surface: the command, the delivery and the client calls. + +The workflow instance is driven with activations directly, the way Core +drives it, because the dev server this chain tests against does not accept +the subscribe command. The live cases at the end need a server that does and +skip otherwise. The external-stream runtime's own subscriptions, which go +through the same instance behind a gate, are covered beside the stream tests. +""" + +from __future__ import annotations + +import asyncio +import contextlib +import uuid +from datetime import datetime, timedelta, timezone +from typing import Any + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.notification.v1 +import temporalio.bridge.proto.workflow_activation +import temporalio.bridge.proto.workflow_completion +import temporalio.common +import temporalio.converter +from temporalio import workflow +from temporalio.api.enums.v1 import EventType +from temporalio.client import Callback, Client +from temporalio.service import RPCError, RPCStatusCode +from temporalio.worker._workflow_instance import ( + UnsandboxedWorkflowRunner, + WorkflowInstance, + WorkflowInstanceDetails, +) +from tests.helpers import assert_eventually, new_worker + +WorkflowActivation = temporalio.bridge.proto.workflow_activation.WorkflowActivation +WorkflowActivationJob = ( + temporalio.bridge.proto.workflow_activation.WorkflowActivationJob +) +WorkflowActivationCompletion = ( + temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion +) +Notification = temporalio.api.notification.v1.Notification + + +@workflow.defn +class ReceiveOne: + """Subscribes to one channel and reports the first notification.""" + + @workflow.run + async def run(self, channel: str) -> dict[str, Any]: + notification = await workflow.subscribe_channel(channel).receive() + return { + "channel": notification.channel, + "counter": notification.counter, + "position": notification.position.decode(), + "topic": ( + workflow.payload_converter().from_payload( + notification.metadata["topic"], str + ) + if "topic" in notification.metadata + else None + ), + } + + +@workflow.defn +class CountToTwo: + """Subscribes twice to one channel and counts notifications up to counter two.""" + + @workflow.run + async def run(self, channel: str) -> int: + first = workflow.subscribe_channel(channel) + second = workflow.subscribe_channel(channel) + assert first is second + seen = 0 + async for notification in second: + seen += 1 + if notification.counter >= 2: + break + return seen + + +@workflow.defn +class EmptyChannel: + """Asks for a channel with no name.""" + + @workflow.run + async def run(self) -> None: + workflow.subscribe_channel("") + + +def _instance(workflow_class: type) -> WorkflowInstance: + """Build an instance the way the worker does, without a worker. + + Needs a running event loop, since the constructor puts the runtime on it. + """ + defn = workflow._Definition.must_from_class(workflow_class) + now = datetime.now(timezone.utc) + info = workflow.Info( + attempt=1, + continued_run_id=None, + cron_schedule=None, + execution_timeout=None, + first_execution_run_id="run", + headers={}, + namespace="default", + parent=None, + root=None, + priority=temporalio.common.Priority.default, + raw_memo={}, + retry_policy=None, + run_id="run", + run_timeout=None, + search_attributes={}, + start_time=now, + task_queue="tq", + task_timeout=timedelta(seconds=10), + typed_search_attributes=temporalio.common.TypedSearchAttributes.empty, + workflow_id="wf", + workflow_start_time=now, + workflow_type=defn.name or "", + ) + converter = temporalio.converter.DataConverter.default + return UnsandboxedWorkflowRunner().create_instance( + WorkflowInstanceDetails( + payload_converter_factory=converter._new_payload_converter, + failure_converter_class=converter.failure_converter_class, + interceptor_classes=[], + defn=defn, + info=info, + randomness_seed=0, + extern_functions={}, + disable_eager_activity_execution=False, + worker_level_failure_exception_types=[], + patch_activation_callback=None, + last_completion_result=temporalio.api.common.v1.Payloads(), + last_failure=None, + ) + ) + + +def _start(workflow_class: type, *args: Any) -> WorkflowActivation: + job = WorkflowActivationJob() + init = job.initialize_workflow + init.workflow_type = workflow._Definition.must_from_class(workflow_class).name or "" + init.workflow_id = "wf" + init.arguments.extend( + temporalio.converter.PayloadConverter.default.to_payloads(args) + ) + return WorkflowActivation(run_id="run", jobs=[job]) + + +def _notified(*notifications: Notification) -> WorkflowActivation: + job = WorkflowActivationJob() + job.notifications_received.notifications.extend(notifications) + return WorkflowActivation(run_id="run", jobs=[job]) + + +def _subscribed(completion: WorkflowActivationCompletion) -> list[str]: + assert completion.HasField("successful"), completion.failed.failure.message + return [ + command.subscribe_notification_channel.channel + for command in completion.successful.commands + if command.HasField("subscribe_notification_channel") + ] + + +def _completed(completion: WorkflowActivationCompletion) -> bool: + assert completion.HasField("successful"), completion.failed.failure.message + return any( + command.HasField("complete_workflow_execution") + for command in completion.successful.commands + ) + + +def _result(completion: WorkflowActivationCompletion) -> Any: + assert completion.HasField("successful"), completion.failed.failure.message + [done] = [ + command + for command in completion.successful.commands + if command.HasField("complete_workflow_execution") + ] + return temporalio.converter.PayloadConverter.default.from_payload( + done.complete_workflow_execution.result + ) + + +async def test_the_first_subscription_is_a_command_and_the_second_shares_it(): + instance = _instance(CountToTwo) + completion = instance.activate(_start(CountToTwo, "orders")) + assert _subscribed(completion) == ["orders"] + assert not _completed(completion) + + +async def test_a_notifications_received_job_wakes_the_receiver(): + instance = _instance(ReceiveOne) + assert _subscribed(instance.activate(_start(ReceiveOne, "orders"))) == ["orders"] + [topic] = temporalio.converter.PayloadConverter.default.to_payloads(["inputs"]) + completion = instance.activate( + _notified( + Notification( + channel="orders", position=b"7-0", counter=7, metadata={"topic": topic} + ) + ) + ) + assert _result(completion) == { + "channel": "orders", + "counter": 7, + "position": "7-0", + "topic": "inputs", + } + + +async def test_notifications_arrive_in_order_and_other_channels_are_dropped(): + instance = _instance(CountToTwo) + instance.activate(_start(CountToTwo, "orders")) + # A channel this run never subscribed to is not the workflow's concern. + completion = instance.activate(_notified(Notification(channel="other", counter=9))) + assert not _completed(completion) + completion = instance.activate( + _notified( + Notification(channel="orders", counter=1), + Notification(channel="orders", counter=2), + ) + ) + assert _result(completion) == 2 + + +async def test_an_empty_channel_name_is_refused(): + completion = _instance(EmptyChannel).activate(_start(EmptyChannel)) + assert completion.HasField("failed") + assert "channel must not be empty" in completion.failed.failure.message + + +@pytest.mark.needs_channel_server +async def test_a_workflow_receives_a_client_notification(client: Client): + channel = f"orders-{uuid.uuid4()}" + worker = new_worker(client, ReceiveOne) + running = asyncio.create_task(worker.run()) + handle = await client.start_workflow( + ReceiveOne.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + try: + + async def subscribed() -> None: + # The worker's Core has to carry the subscribe command to the + # server. One that refuses it fails every completion, and the task + # times out instead; say so rather than wait on the result forever. + events = [event.event_type async for event in handle.fetch_history_events()] + if EventType.EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT in events: + pytest.fail( + "the worker could not complete the task that subscribes; the Core " + "the bridge pins must carry the subscribe command" + ) + assert ( + EventType.EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED in events + ) + + await assert_eventually(subscribed, timeout=timedelta(seconds=30)) + + async def listening() -> None: + # The channel exists once the subscribe lands, so a describe that + # races it is answered with not found. + try: + description = await client.describe_channel(channel) + except RPCError as err: + assert err.status != RPCStatusCode.NOT_FOUND, "channel not created yet" + raise + assert [listener.workflow_id for listener in description.listeners] == [ + handle.id + ] + + await assert_eventually(listening) + listeners = await client.notify_channel( + channel, position=b"1-0", counter=1, metadata={"topic": "inputs"} + ) + assert listeners == 1 + assert await asyncio.wait_for(handle.result(), 30) == { + "channel": channel, + "counter": 1, + "position": "1-0", + "topic": "inputs", + } + polled = await client.poll_channel(channel, wait=False) + assert [n.counter for n in polled] == [1] + description = await client.describe_channel(channel) + assert description.latest is not None and description.latest.counter == 1 + finally: + # A Core that refuses the subscribe command leaves the task in a + # timeout loop and the worker's shutdown waiting on it, so end the run + # first and give the shutdown a bound. + with contextlib.suppress(RPCError): + await handle.terminate() + try: + await asyncio.wait_for(worker.shutdown(), 15) + except asyncio.TimeoutError: + running.cancel() + with contextlib.suppress(asyncio.CancelledError): + await running + + +@pytest.mark.needs_channel_server +async def test_a_callback_listener_registers_and_unregisters(client: Client): + channel = f"orders-{uuid.uuid4()}" + callback = Callback(url="http://localhost:1/never-called", headers={}) + listener_id = await client.register_channel_listener(channel, callback) + description = await client.describe_channel(channel) + assert [listener.listener_id for listener in description.listeners] == [listener_id] + assert description.listeners[0].callback == callback + await client.unregister_channel_listener(channel, listener_id) + description = await client.describe_channel(channel) + assert description.listeners == [] + + +@pytest.mark.needs_channel_server +async def test_a_channel_retains_notifications_for_pollers(client: Client): + channel = f"orders-{uuid.uuid4()}" + # A channel nobody has touched does not exist. + with pytest.raises(RPCError) as untouched: + await client.describe_channel(f"untouched-{uuid.uuid4()}") + assert untouched.value.status == RPCStatusCode.NOT_FOUND + # Nobody listens yet: the notification is kept for pollers and the count + # says zero. + assert await client.notify_channel(channel, position=b"2-0", counter=2) == 0 + description = await client.describe_channel(channel) + assert description.listeners == [] + assert description.latest is not None + assert (description.latest.position, description.latest.counter) == (b"2-0", 2) + assert description.retained_count == 1 + polled = await client.poll_channel(channel, wait=False) + assert [(n.position, n.counter) for n in polled] == [(b"2-0", 2)] + # At or below the latest counter a notify changes nothing and is not kept. + assert await client.notify_channel(channel, position=b"1-0", counter=1) == 0 + assert await client.notify_channel(channel, position=b"2-0", counter=2) == 0 + description = await client.describe_channel(channel) + assert description.latest is not None and description.latest.counter == 2 + assert description.retained_count == 1 + # Above it the notification is kept, metadata and all, and a poll after + # the earlier counter sees only the new one. + assert ( + await client.notify_channel( + channel, position=b"3-0", counter=3, metadata={"topic": "inputs"} + ) + == 0 + ) + [newest] = await client.poll_channel(channel, after_counter=2, wait=False) + assert newest.counter == 3 + assert ( + client.data_converter.payload_converter.from_payload( + newest.metadata["topic"], str + ) + == "inputs" + ) + polled = await client.poll_channel(channel, wait=False) + assert [n.counter for n in polled] == [2, 3] + # A poll above the latest waits its bound out and comes back empty. + polled = await client.poll_channel( + channel, after_counter=3, wait=timedelta(seconds=1) + ) + assert polled == [] From 8c40b07712d046f13eb7727df1319b0c6400f9f5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:48:16 -0700 Subject: [PATCH 769/831] Derived a positionless wake's counter from the backend's clock rule. A plain clock sits far below a counter derived from a store position, so the server would fold the shutdown sweep's wake away. Each backend states its rule once, beside wake_counter_for. --- .../external_workflow_streams/_backend.py | 14 +++++++++++ .../external_workflow_streams/_wake.py | 9 ++++--- .../external_workflow_streams/test_wake.py | 25 +++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_backend.py b/temporalio/contrib/external_workflow_streams/_backend.py index ca7cc7c47..2a6ff5588 100644 --- a/temporalio/contrib/external_workflow_streams/_backend.py +++ b/temporalio/contrib/external_workflow_streams/_backend.py @@ -30,6 +30,7 @@ import abc import enum +import time from collections.abc import AsyncIterator from dataclasses import dataclass from datetime import timedelta @@ -298,6 +299,19 @@ def wake_counter_for(self, offset: Offset) -> int: del offset return 0 + def wake_counter_now(self) -> int: + """The counter for a wake that reports no position, from the clock. + + A Worker's shutdown sweep wakes a subscription it leaves behind without + knowing where the store stands. Its counter still has to sit above every + counter the store has handed out so far, or the server folds the wake + into a pending one and the reader stays parked. A provider whose + counters follow its offsets derives this from the current time by the + same rule, with the largest sequence the rule allows. The default is the + clock in nanoseconds, which is the order the base counter has. + """ + return time.time_ns() + # --- parking (P2b) ------------------------------------------------------ supports_leased_claims: ClassVar[bool] = False diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index 3dce38fa6..8bef9d88b 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -407,11 +407,14 @@ def wake_transport_of(backend: object) -> WakeTransport: def wake_position(backend: object, offset: Offset | None) -> tuple[bytes, int]: """The position and counter a wake reports for ``offset`` in ``backend``. - A counter the backend cannot give is 0, which :func:`wake_call_counter` - replaces with the clock. + Without an offset the backend's own clock rule gives the counter, so a + wake that reports no position still orders above every position the store + handed out before now. A counter the backend cannot give is 0, which + :func:`wake_call_counter` replaces with the clock. """ if offset is None: - return b"", 0 + counter_now = getattr(backend, "wake_counter_now", None) + return b"", max(counter_now(), 0) if counter_now is not None else 0 counter_for = getattr(backend, "wake_counter_for", None) counter = counter_for(offset) if counter_for is not None else 0 return offset.token.encode("utf-8"), max(counter, 0) diff --git a/tests/contrib/external_workflow_streams/test_wake.py b/tests/contrib/external_workflow_streams/test_wake.py index bec1ce3cc..f32edf257 100644 --- a/tests/contrib/external_workflow_streams/test_wake.py +++ b/tests/contrib/external_workflow_streams/test_wake.py @@ -2315,3 +2315,28 @@ async def test_a_producer_notifies_the_channel_of_the_stream_it_appended_to() -> assert notify.notification.channel == channel_for(topic.stream_key) assert client.wakes == [] assert client.sent == [] + + +class ClockRuleBackend(CountingBackend): + """States the Redis rule for a wake without a position: now, maximal sequence.""" + + def wake_counter_now(self) -> int: + return 1_700_000_000_000 * 2**20 + 0xFFFFF + + +def test_a_wake_without_a_position_takes_the_backends_clock_rule() -> None: + from temporalio.contrib.external_workflow_streams._wake import wake_position + + assert wake_position(ClockRuleBackend(), None) == ( + b"", + 1_700_000_000_000 * 2**20 + 0xFFFFF, + ) + # The base rule is the clock in nanoseconds, which orders like the base counter. + position, counter = wake_position(MemoryStreamBackend(), None) + assert position == b"" + assert counter > 1_700_000_000 * 10**9 + # A positioned wake keeps the position's own order. + assert wake_position(ClockRuleBackend(), Offset("1700000000000-3")) == ( + b"1700000000000-3", + 1_700_000_000_000 * 2**20 + 3, + ) From 1e84b51de885479b81c26029f615241918076b26 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:48:16 -0700 Subject: [PATCH 770/831] Skipped the retained-first-task cases on servers with channels. The subscribe command ends the task that opens the first reader, so these cases measure nothing there until the command moves to the leaving completion. The skip fixture lives in the package conftest beside the channel-server marker. --- .../external_workflow_streams/test_output_worker_integration.py | 2 ++ .../contrib/external_workflow_streams/test_replay_end_to_end.py | 2 ++ .../external_workflow_streams/test_rollover_integration.py | 1 + tests/contrib/external_workflow_streams/test_worker_crash.py | 1 + tests/contrib/external_workflow_streams/test_worker_handoff.py | 2 ++ .../external_workflow_streams/test_worker_integration.py | 1 + 6 files changed, 9 insertions(+) diff --git a/tests/contrib/external_workflow_streams/test_output_worker_integration.py b/tests/contrib/external_workflow_streams/test_output_worker_integration.py index 668697f58..7ff967ca5 100644 --- a/tests/contrib/external_workflow_streams/test_output_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_output_worker_integration.py @@ -536,6 +536,7 @@ async def read_all() -> list[str]: assert b"workflow-output-secret" not in envelope.payloads[0].data +@pytest.mark.usefixtures("first_task_retained") async def test_output_latency_flushes_a_retained_workflow_task( client: Client, ) -> None: @@ -1203,6 +1204,7 @@ async def wait_for_replacement_stage() -> None: @pytest.mark.timeout(90) +@pytest.mark.usefixtures("first_task_retained") async def test_output_deadline_wins_park_race_and_removes_every_intent( client: Client, ) -> None: diff --git a/tests/contrib/external_workflow_streams/test_replay_end_to_end.py b/tests/contrib/external_workflow_streams/test_replay_end_to_end.py index 279b9a5db..92945d4c8 100644 --- a/tests/contrib/external_workflow_streams/test_replay_end_to_end.py +++ b/tests/contrib/external_workflow_streams/test_replay_end_to_end.py @@ -293,6 +293,7 @@ async def test_replaying_a_stream_history_reproduces_the_same_observations( ) +@pytest.mark.usefixtures("first_task_retained") async def test_live_and_replay_share_one_input_output_drain_schedule( client: Client, ) -> None: @@ -802,6 +803,7 @@ async def spy_notify(self, subscription): # type: ignore[no-untyped-def] LIVE_MANAGERS.clear() +@pytest.mark.usefixtures("first_task_retained") async def test_an_empty_stream_parked_and_evicted_replays_from_the_recorded_cursor( client: Client, backend: MemoryStreamBackend, diff --git a/tests/contrib/external_workflow_streams/test_rollover_integration.py b/tests/contrib/external_workflow_streams/test_rollover_integration.py index f68a2d1c8..5deab8396 100644 --- a/tests/contrib/external_workflow_streams/test_rollover_integration.py +++ b/tests/contrib/external_workflow_streams/test_rollover_integration.py @@ -411,6 +411,7 @@ async def test_a_continuously_fed_stream_survives_a_rollover( @pytest.mark.timeout(180) +@pytest.mark.usefixtures("first_task_retained") async def test_a_signal_into_a_retained_task_lands_by_the_rollover_deadline( client: Client, backend: MemoryStreamBackend ) -> None: diff --git a/tests/contrib/external_workflow_streams/test_worker_crash.py b/tests/contrib/external_workflow_streams/test_worker_crash.py index 5987318e6..be046feef 100644 --- a/tests/contrib/external_workflow_streams/test_worker_crash.py +++ b/tests/contrib/external_workflow_streams/test_worker_crash.py @@ -148,6 +148,7 @@ async def _output_stage_was_logged(redis_client: Any, prefix: str) -> bool: @pytest.mark.timeout(240) +@pytest.mark.usefixtures("first_task_retained") async def test_a_crash_before_the_marker_makes_the_next_worker_re_read( client: Client, redis_worker_id: str ) -> None: diff --git a/tests/contrib/external_workflow_streams/test_worker_handoff.py b/tests/contrib/external_workflow_streams/test_worker_handoff.py index 24294fc8b..d23b404b0 100644 --- a/tests/contrib/external_workflow_streams/test_worker_handoff.py +++ b/tests/contrib/external_workflow_streams/test_worker_handoff.py @@ -534,6 +534,7 @@ async def _park_is_installed(backend: MemoryStreamBackend, key: StreamKey) -> bo @pytest.mark.timeout(180) +@pytest.mark.usefixtures("first_task_retained") async def test_a_wake_that_resolves_a_park_removes_its_intent( client: Client, backend: MemoryStreamBackend ) -> None: @@ -571,6 +572,7 @@ async def test_a_wake_that_resolves_a_park_removes_its_intent( @pytest.mark.timeout(180) +@pytest.mark.usefixtures("first_task_retained") async def test_the_shutdown_probe_is_asked_while_core_still_holds_the_run( client: Client, backend: MemoryStreamBackend ) -> None: diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index 526755475..f0788d4a0 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -1769,6 +1769,7 @@ async def test_each_failure_row_is_reported_as_its_own( ) +@pytest.mark.needs_channel_server async def test_an_outside_producer_wakes_the_reader_through_the_channel( client: Client, backend: MemoryStreamBackend ) -> None: From c0a0d188ebfd94cf62732ff598ab7fa960097202 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:01:23 -0700 Subject: [PATCH 771/831] Added a conformance case for a reader woken through the channel. Gated by a wakes_by_notification capability, which the memory provider lacks since its reader polls on a timer. --- tests/streams/conftest.py | 5 ++ tests/streams/test_streams_conformance.py | 79 +++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index f03dbc919..107134d94 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -20,3 +20,8 @@ def pytest_configure(config: pytest.Config) -> None: "hosts_standalone_streams: the case needs a stream with an id of its own and " "no owner", ) + config.addinivalue_line( + "markers", + "wakes_by_notification: the case needs an outside append to wake a parked " + "workflow reader through the server", + ) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 195950f82..f8a128fae 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -40,6 +40,7 @@ from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.common import RawValue +from temporalio.contrib.external_workflow_streams._wake import server_has_channels from temporalio.converter import ( DataConverter, ExternalStorage, @@ -105,6 +106,9 @@ class ProviderCase: trims_open_stream_by_age: bool = True """A standalone stream drops records older than ``retention`` while it is open, rather than keeping them that long after it closes.""" + wakes_by_notification: bool = False + """An outside append wakes a parked workflow reader through the server, + rather than the reader finding the record on a timer of its own.""" async def open( self, @@ -251,6 +255,7 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: "detects_divergent_retries": lambda case: case.detects_divergent_retries, "truncates": lambda case: case.truncate is not None, "hosts_standalone_streams": lambda case: case.hosts_standalone_streams, + "wakes_by_notification": lambda case: case.wakes_by_notification, } @@ -862,3 +867,77 @@ async def test_a_publish_from_the_constructor_is_delivered( stream = case.provider.get_stream_handle(worker_client, workflow_id) records = await take(stream.read(topic=OUT), 2, 30) assert [r.value for r in records] == [{"from": "init"}, {"from": "run"}] + + +@workflow.defn +class ReadUntilFinished: + """Reads ``OUT`` until its producer finishes. + + Nothing but an outside append moves it, so what wakes it between appends + is the transport under test. + """ + + @workflow.run + async def run(self) -> list[Any]: + seen: list[Any] = [] + async for record in workflow.stream_reader(OUT): + if record.kind is RecordKind.FINISH: + break + seen.append(record.value) + return seen + + +@pytest.mark.wakes_by_notification +async def test_an_outside_producer_wakes_the_reader_through_the_channel( + case: ProviderCase, client: Client +): + """The channel path, on the public surface. + + The reader's run subscribes to the stream's channel on the task that opens + the reader, the producer's append notifies that channel, and the server + wakes the run with a Workflow Task whose scheduled event carries the + notification. History then holds the subscription and no Signal. + """ + worker_client = case.client or client + if not await server_has_channels(worker_client): + pytest.skip("the server does not implement notification channels") + plugins = [] if case.client is not None else [case.provider] + workflow_id = new_workflow_id() + async with new_worker(worker_client, ReadUntilFinished, plugins=plugins) as worker: + handle = await worker_client.start_workflow( + ReadUntilFinished.run, id=workflow_id, task_queue=worker.task_queue + ) + stream = case.provider.get_stream_handle(worker_client, workflow_id) + producer = stream.producer(topic=OUT, producer_id="model", attempt=1) + # Spaced past the reader's idle timeout, so the reader parks between + # appends and only a wake from outside can move it. + for n in (1, 2): + await producer.append({"n": n}) + await asyncio.sleep(2) + await producer.finish() + assert await asyncio.wait_for(handle.result(), 60) == [{"n": 1}, {"n": 2}] + + events = [e async for e in handle.fetch_history_events()] + signalled = [ + e for e in events if e.HasField("workflow_execution_signaled_event_attributes") + ] + assert signalled == [], ( + "a Signal woke the reader, so the channel was not the transport" + ) + subscribed = [ + e + for e in events + if e.HasField("workflow_notification_channel_subscribed_event_attributes") + ] + assert len(subscribed) == 1, "the run subscribes once per channel" + notified = [ + notification + for e in events + if e.HasField("workflow_task_scheduled_event_attributes") + for notification in e.workflow_task_scheduled_event_attributes.notifications + ] + assert notified, "no Workflow Task was scheduled with a notification" + channel = subscribed[ + 0 + ].workflow_notification_channel_subscribed_event_attributes.channel + assert {n.channel for n in notified} == {channel} From 58c87ba50a13e4523ba2b1fc741cf4975d7f943e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 20:02:55 -0700 Subject: [PATCH 772/831] Marked the channel conformance case for a channel server. The marker skips it unless -E names a server, the way the main chain gates its live channel cases; the memory provider skips it by capability as well. --- tests/streams/conftest.py | 23 +++++++++++++++++++++++ tests/streams/test_streams_conformance.py | 1 + 2 files changed, 24 insertions(+) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 107134d94..b891540fc 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -25,3 +25,26 @@ def pytest_configure(config: pytest.Config) -> None: "wakes_by_notification: the case needs an outside append to wake a parked " "workflow reader through the server", ) + config.addinivalue_line( + "markers", + "needs_channel_server: the case needs a server that serves notification " + "channels, named with -E host:port", + ) + + +#: The environments whose server the suite starts for itself. None of them +#: accepts the subscribe-notification-channel command. +_ENVIRONMENTS_WITHOUT_CHANNELS = ("local", "time-skipping", "envconfig") + + +def pytest_collection_modifyitems( + config: pytest.Config, items: list[pytest.Item] +) -> None: + if config.getoption("--workflow-environment") not in _ENVIRONMENTS_WITHOUT_CHANNELS: + return + skip = pytest.mark.skip( + reason="needs a server that serves notification channels; name one with -E" + ) + for item in items: + if item.get_closest_marker("needs_channel_server"): + item.add_marker(skip) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index f8a128fae..5e4408b62 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -888,6 +888,7 @@ async def run(self) -> list[Any]: @pytest.mark.wakes_by_notification +@pytest.mark.needs_channel_server async def test_an_outside_producer_wakes_the_reader_through_the_channel( case: ProviderCase, client: Client ): From 98b734986c60ed06dd8599b8019d2a30bbc81c42 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:04:37 -0700 Subject: [PATCH 773/831] Accepted the channel transport on the Redis provider. --- temporalio/streams/providers/redis.py | 10 ++++++---- tests/streams/test_redis_provider.py | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index dd382a19a..5af0b6c02 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -1951,10 +1951,12 @@ def __init__( is trimmed before its commit; a batch at or above it is refused where it is staged. wake_transport: How a producer and a worker wake a workflow after - an append. ``"wake"`` uses the server's wake call, which - records no History event; ``"signal"`` uses the reserved - Signal, which does; ``"auto"`` tries the wake call and falls - back to the Signal on a server without it. + an append. ``"channel"`` notifies the stream's channel, which + wakes every subscribed reader with the entry id as the + position; ``"wake"`` uses the server's deprecated wake call; + ``"signal"`` uses the reserved Signal, which writes a History + event; ``"auto"`` tries them in that order and steps down on + a server without the call. """ # Checked against the alias so an untyped caller still gets a ValueError. if wake_transport not in get_args(WakeTransport): diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 4330d8703..3dd45eed8 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -208,6 +208,8 @@ def test_the_wake_transport_reaches_the_backend_both_sides_share(): assert backend.wake_transport == "signal" assert backend.wake_counter_for(Offset("2-1")) == _wake_counter(Offset("2-1")) assert RedisStreams(client=_NoRedis())._require_backend().wake_transport == "auto" + channel = RedisStreams(client=_NoRedis(), wake_transport="channel") + assert channel._require_backend().wake_transport == "channel" def test_an_unknown_wake_transport_is_refused_at_construction(): From a10ced0b1dd11f63ba5281a5cc7c364389544fb3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:04:37 -0700 Subject: [PATCH 774/831] Covered the Redis reader woken through the channel. The live case asks for the channel outright and checks the subscribed event, the notified scheduled event with the entry id as position, and no Signal. The shared conformance case runs on Redis through the wakes_by_notification capability. --- tests/streams/test_redis_replay.py | 80 +++++++++++++++++++++++ tests/streams/test_streams_conformance.py | 3 + 2 files changed, 83 insertions(+) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 4258e69e5..c206edb3a 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -1282,3 +1282,83 @@ async def stage_output(self, manifest: Any, records: Any) -> Any: ] finally: await provider.close() + + +async def _serves_channels(client: Client) -> bool: + """Whether the server implements notification channels, asked of a probe channel.""" + from temporalio.contrib.external_workflow_streams._wake import server_has_channels + + return bool(await server_has_channels(client)) + + +async def test_an_outside_producer_wakes_the_reader_through_the_channel( + live_client: Client, +): + if not await _serves_channels(live_client): + pytest.skip("the server does not implement notification channels") + from temporalio.contrib.external_workflow_streams._record import Offset + + # The channel outright rather than "auto", so a step down to the wake call + # or the Signal fails the History checks below instead of passing quietly. + provider = RedisStreams( + url=redis_url(), + key_prefix=f"streams-redis-{uuid.uuid4().hex}", + wake_transport="channel", + ) + workflow_id = f"streams-redis-channel-{uuid.uuid4().hex}" + try: + async with Worker( + live_client, + task_queue=f"tq-{workflow_id}", + workflows=[ContractLoop], + plugins=[provider], + max_cached_workflows=100, + ): + handle = await live_client.start_workflow( + ContractLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" + ) + stream = provider.get_stream_handle(live_client, workflow_id) + producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) + # Spaced past the reader's idle timeout, so the reader parks between + # appends and only a notification from outside can move it. + for n in (1, 2, 3): + await producer.append({"n": n}) + await asyncio.sleep(2) + await producer.finish() + + result = await asyncio.wait_for(handle.result(), 60) + assert [entry.get("n") for entry in result[:3]] == [1, 2, 3] + assert result[3] == {"kind": "finish", "producer": "model"} + + events = [e async for e in handle.fetch_history_events()] + signalled = [ + e + for e in events + if e.HasField("workflow_execution_signaled_event_attributes") + ] + assert signalled == [], "a Signal woke the reader" + subscribed = [ + e.workflow_notification_channel_subscribed_event_attributes.channel + for e in events + if e.HasField( + "workflow_notification_channel_subscribed_event_attributes" + ) + ] + assert len(subscribed) == 1, "the run subscribes once per channel" + notified = [ + n + for e in events + if e.HasField("workflow_task_scheduled_event_attributes") + for n in e.workflow_task_scheduled_event_attributes.notifications + ] + assert notified, "no Workflow Task was scheduled with a notification" + assert {n.channel for n in notified} == set(subscribed) + # The position is the appended entry id and the counter derives + # from it, so producers and workers order the same wakes alike. + positioned = [note for note in notified if note.position] + assert positioned, "no notification carried the store's position" + for note in positioned: + offset = Offset(note.position.decode()) + assert note.counter == redis_provider._wake_counter(offset) + finally: + await provider.close() diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 83f64a2d1..f550ad3d1 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -305,6 +305,9 @@ async def host(workflow_id: str) -> None: # stream is open. bounds_standalone_bytes=True, trims_open_stream_by_age=True, + # An outside append notifies the stream's channel, and the + # reader's worker subscribes to it on the task that opens the read. + wakes_by_notification=True, ) for handle in hosts.values(): await handle.terminate() From 98692781ea0b1f6b7bdb99cf74aa139fe56026ce Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 19:16:12 -0700 Subject: [PATCH 775/831] Chose the reset point by the task that consumed the record. A task index names a different task on a server with channels, where the task that opens the reader carries the subscribe command and ends at once. --- tests/streams/test_redis_replay.py | 63 +++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index c206edb3a..3cf136c3f 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -925,16 +925,54 @@ async def _completed_tasks(client: Client, workflow_id: str, run_id: str) -> lis ] -async def _reset_at(client: Client, workflow_id: str, run_id: str, *, task: int) -> str: - """Reset ``run_id`` at its ``task``-th completed Workflow Task; the new run id. +_MARKER_DETAILS_KEY = "external_stream" + + +async def _consuming_tasks(client: Client, workflow_id: str, run_id: str) -> list[int]: + """The completed Workflow Tasks whose marker delivered a record, in order. + + Read from the markers rather than counted by position: which task opens + the reader, and whether that task can stay open for the first record, + depends on the server, so a task index names a different task from one + server to the next while the marker says what each task consumed. + """ + from temporalio.bridge.proto.external_data import ExternalStreamMarkerData + from temporalio.contrib.external_workflow_streams._annotation import ( + decode_annotation, + ) + + handle = client.get_workflow_handle(workflow_id, run_id=run_id) + completed: int | None = None + consuming: list[int] = [] + async for event in handle.fetch_history_events(): + if event.HasField("workflow_task_completed_event_attributes"): + completed = event.event_id + continue + if not event.HasField("marker_recorded_event_attributes"): + continue + details = event.marker_recorded_event_attributes.details + if _MARKER_DETAILS_KEY not in details or completed is None: + continue + data = ExternalStreamMarkerData() + data.ParseFromString(details[_MARKER_DETAILS_KEY].payloads[0].data) + annotation = decode_annotation(data.replay_annotation) + if any(segment.runs for segment in annotation.segments): + consuming.append(completed) + return consuming + + +async def _reset_at( + client: Client, workflow_id: str, run_id: str, *, finish_event_id: int +) -> str: + """Reset ``run_id`` at the Workflow Task completed by ``finish_event_id``. The server keeps History up to that task's completion and runs the task again, so the tasks before it are inherited and the task itself is not. + Returns the new run id. """ from temporalio.api.common.v1 import WorkflowExecution from temporalio.api.workflowservice.v1 import ResetWorkflowExecutionRequest - completed = await _completed_tasks(client, workflow_id, run_id) response = await client.workflow_service.reset_workflow_execution( ResetWorkflowExecutionRequest( namespace=client.namespace, @@ -942,7 +980,7 @@ async def _reset_at(client: Client, workflow_id: str, run_id: str, *, task: int) workflow_id=workflow_id, run_id=run_id ), reason="streams: reset mid-stream", - workflow_task_finish_event_id=completed[task], + workflow_task_finish_event_id=finish_event_id, request_id=uuid.uuid4().hex, ) ) @@ -952,7 +990,7 @@ async def _reset_at(client: Client, workflow_id: str, run_id: str, *, task: int) async def _consume_two_then_nudge( live_client: Client, provider: RedisStreams, workflow_id: str, task_queue: str ) -> tuple[str, Any, Any]: - """Two records in two tasks, then a task that consumes nothing; the base run.""" + """Two records, each consumed by a task of its own, then a nudged task; the base run.""" handle = await live_client.start_workflow( NudgedLoop.run, id=workflow_id, task_queue=task_queue ) @@ -992,7 +1030,10 @@ async def test_a_reset_run_replays_the_inherited_ranges_and_continues( base_run, stream, producer = await _consume_two_then_nudge( live_client, provider, workflow_id, f"tq-{workflow_id}" ) - reset_run = await _reset_at(live_client, workflow_id, base_run, task=-1) + last_task = (await _completed_tasks(live_client, workflow_id, base_run))[-1] + reset_run = await _reset_at( + live_client, workflow_id, base_run, finish_event_id=last_task + ) assert reset_run != base_run await producer.append({"n": 3}) @@ -1016,8 +1057,9 @@ async def test_a_reset_run_replays_the_inherited_ranges_and_continues( async def test_a_reset_point_task_is_run_again_from_the_log( live_client: Client, provider: RedisStreams ): - # Reset at the second consuming task's completion: the first task is - # inherited and the second is run again. The record it consumed is still + # Reset at the completion of the task that consumed the second record: the + # tasks before it are inherited, the one that consumed the first record + # among them, and this one is run again. The record it consumed is still # in the log, so the reset run reads it again and publishes again, and an # outside reader sees that decision from both runs. workflow_id = f"streams-redis-reset-rerun-{uuid.uuid4().hex}" @@ -1031,7 +1073,10 @@ async def test_a_reset_point_task_is_run_again_from_the_log( base_run, stream, producer = await _consume_two_then_nudge( live_client, provider, workflow_id, f"tq-{workflow_id}" ) - reset_run = await _reset_at(live_client, workflow_id, base_run, task=1) + second = (await _consuming_tasks(live_client, workflow_id, base_run))[1] + reset_run = await _reset_at( + live_client, workflow_id, base_run, finish_event_id=second + ) await producer.append({"n": 3}) await producer.finish() From 3bf0c94ddd8f80c70847b4c4055706f9767b80bd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 20:05:06 -0700 Subject: [PATCH 776/831] Derived the Redis sweep counter from the entry id rule. A wake without a position takes the current time with the largest sequence, so it orders above every entry appended before now and is not folded under the channel's latest. --- temporalio/streams/providers/redis.py | 10 ++++++++++ tests/streams/test_redis_provider.py | 11 +++++++++++ tests/streams/test_redis_replay.py | 1 + 3 files changed, 22 insertions(+) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 5af0b6c02..6a138d969 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -797,6 +797,16 @@ def wake_counter_for(self, offset: Offset) -> int: """The entry id's own order, so producers and workers rank wakes alike.""" return _wake_counter(offset) + def wake_counter_now(self) -> int: + """The entry id rule applied to the clock, with the largest sequence. + + Above every entry appended before now, so a wake that reports no + position, the worker's shutdown sweep, is not folded under the + channel's latest notification. + """ + now_ms = int(time.time() * 1000) + return (now_ms << _WAKE_SEQUENCE_BITS) + (1 << _WAKE_SEQUENCE_BITS) - 1 + def stream_key(self, key: StreamKey) -> str: """The topic's log, whichever direction the transport asks for.""" return super().stream_key(replace(key, direction=StreamDirection.INPUT)) diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 3dd45eed8..4a2da97f3 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio +import time from datetime import timedelta from types import SimpleNamespace from typing import Any, cast @@ -202,6 +203,16 @@ def test_a_wake_counter_fits_the_servers_signed_64_bit_field(): assert _wake_counter(Offset(f"{year_2200_ms}-{2**20}")) < 2**63 +def test_a_positionless_wake_counter_follows_the_entry_id_rule(): + backend = RedisStreams(client=_NoRedis())._require_backend() + before = _wake_counter(Offset(f"{int(time.time() * 1000)}-{2**20 - 1}")) + now = backend.wake_counter_now() + after = _wake_counter(Offset(f"{int(time.time() * 1000) + 1}-0")) + assert before <= now < after + # Any entry appended before the call orders below it. + assert now > _wake_counter(Offset(f"{int(time.time() * 1000) - 1}-7")) + + def test_the_wake_transport_reaches_the_backend_both_sides_share(): streams = RedisStreams(client=_NoRedis(), wake_transport="signal") backend = streams._require_backend() diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 3cf136c3f..8951d1a2f 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -1336,6 +1336,7 @@ async def _serves_channels(client: Client) -> bool: return bool(await server_has_channels(client)) +@pytest.mark.needs_channel_server async def test_an_outside_producer_wakes_the_reader_through_the_channel( live_client: Client, ): From c9daebc06eb76726c43e692c5a27273c093a09e6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 20:34:26 -0700 Subject: [PATCH 777/831] Kept one copy of the channel methods both chains lifted. --- temporalio/worker/_workflow_instance.py | 35 ------------------- .../test_channels.py | 3 +- 2 files changed, 2 insertions(+), 36 deletions(-) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 3f3ebd26e..0c0f55481 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -538,10 +538,6 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: ] = {} self._default_workflow_logic_flags = det.default_workflow_logic_flags self._subscribed_channels: set[str] = set() - # Keyed by channel name; one subscription per channel per run - self._channel_subscriptions: dict[ - str, temporalio.workflow.ChannelSubscription - ] = {} #: The gate's answer for this run, taken on the first stream subscription #: and kept until continue-as-new; see ``subscribe_stream_channel``. self._stream_channels_enabled: bool | None = None @@ -986,8 +982,6 @@ def _apply( self._apply_resolve_external_stream_waits(job.resolve_external_stream_waits) elif job.HasField("replay_external_streams"): self._apply_replay_external_streams(job.replay_external_streams) - elif job.HasField("notifications_received"): - self._apply_notifications_received(job.notifications_received) elif job.HasField("resolve_child_workflow_execution"): self._apply_resolve_child_workflow_execution( job.resolve_child_workflow_execution @@ -1544,23 +1538,6 @@ async def run_query() -> None: # Schedule it self.create_task(run_query(), name=f"query: {job.query_type}") - def _apply_notifications_received( - self, job: temporalio.bridge.proto.workflow_activation.NotificationsReceived - ) -> None: - for proto in job.notifications: - subscription = self._channel_subscriptions.get(proto.channel) - if subscription is None: - # The server fans out to whatever listened at the time, so a - # channel this run never subscribed to is not the workflow's - # concern. - logger.debug( - "Dropping a notification on channel %r, which this run has not " - "subscribed to", - proto.channel, - ) - continue - subscription._deliver(temporalio.workflow.Notification._from_proto(proto)) - def _apply_notify_has_patch( self, job: temporalio.bridge.proto.workflow_activation.NotifyHasPatch ) -> None: @@ -2621,18 +2598,6 @@ def workflow_streams(self) -> temporalio.workflow._streams._WorkflowStreams: ) return self._streams - def workflow_subscribe_channel( - self, channel: str - ) -> temporalio.workflow.ChannelSubscription: - existing = self._channel_subscriptions.get(channel) - if existing is not None: - return existing - command = self._add_command() - command.subscribe_notification_channel.channel = channel - subscription = temporalio.workflow.ChannelSubscription(channel) - self._channel_subscriptions[channel] = subscription - return subscription - def workflow_time_ns(self) -> int: return self._time_ns diff --git a/tests/contrib/external_workflow_streams/test_channels.py b/tests/contrib/external_workflow_streams/test_channels.py index 6a5b4f1ec..72e29683f 100644 --- a/tests/contrib/external_workflow_streams/test_channels.py +++ b/tests/contrib/external_workflow_streams/test_channels.py @@ -106,6 +106,7 @@ def _instance(workflow_class: type) -> WorkflowInstance: first_execution_run_id="run", headers={}, namespace="default", + original_execution_run_id="run", parent=None, root=None, priority=temporalio.common.Priority.default, @@ -125,7 +126,7 @@ def _instance(workflow_class: type) -> WorkflowInstance: converter = temporalio.converter.DataConverter.default return UnsandboxedWorkflowRunner().create_instance( WorkflowInstanceDetails( - payload_converter_factory=converter._new_payload_converter, + payload_converter_factory=converter._new_internal_payload_converter, failure_converter_class=converter.failure_converter_class, interceptor_classes=[], defn=defn, From 0ad4b3e436d1f89f6aac3a4135f861c30b751b42 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 20:34:26 -0700 Subject: [PATCH 778/831] Pinned Core at the channel-round union head and regenerated the clients. --- .../workflow_activation_pb2.py | 202 ++++++++---- .../workflow_activation_pb2.pyi | 64 ++-- .../workflow_commands_pb2.py | 305 +++++++++++++----- .../workflow_commands_pb2.pyi | 48 +-- temporalio/bridge/sdk-core | 2 +- 5 files changed, 409 insertions(+), 212 deletions(-) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py index 7c153f132..08dfd94b4 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.py @@ -48,19 +48,33 @@ from temporalio.bridge.proto.common import ( common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, ) +from temporalio.bridge.proto.external_data import ( + external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2, +) from temporalio.bridge.proto.nexus import ( nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, ) +from temporalio.bridge.proto.workflow_commands import ( + workflow_commands_pb2 as temporal_dot_sdk_dot_core_dot_workflow__commands_dot_workflow__commands__pb2, +) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto"\xa2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08"\x8b\x0c\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12T\n\x16notifications_received\x18\x16 \x01(\x0b\x32\x32.coresdk.workflow_activation.NotificationsReceivedH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"Z\n\x15NotificationsReceived\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"\xb1\x01\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12P\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause"\xb8\x01\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12P\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' + b'\n?temporal/sdk/core/workflow_activation/workflow_activation.proto\x12\x1b\x63oresdk.workflow_activation\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a*temporal/api/notification/v1/message.proto\x1a\x37temporal/sdk/core/activity_result/activity_result.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a%temporal/sdk/core/common/common.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto\x1a;temporal/sdk/core/workflow_commands/workflow_commands.proto"\xc2\x04\n\x12WorkflowActivation\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12-\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cis_replaying\x18\x03 \x01(\x08\x12\x16\n\x0ehistory_length\x18\x04 \x01(\r\x12@\n\x04jobs\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.WorkflowActivationJob\x12 \n\x18\x61vailable_internal_flags\x18\x06 \x03(\r\x12\x1a\n\x12history_size_bytes\x18\x07 \x01(\x04\x12!\n\x19\x63ontinue_as_new_suggested\x18\x08 \x01(\x08\x12T\n#deployment_version_for_current_task\x18\t \x01(\x0b\x32\'.coresdk.common.WorkerDeploymentVersion\x12\x18\n\x10last_sdk_version\x18\n \x01(\t\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x0b \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\x0c \x01(\x08\x12\x1e\n\x16history_floor_event_id\x18\r \x01(\x03"\xff\x0e\n\x15WorkflowActivationJob\x12N\n\x13initialize_workflow\x18\x01 \x01(\x0b\x32/.coresdk.workflow_activation.InitializeWorkflowH\x00\x12<\n\nfire_timer\x18\x02 \x01(\x0b\x32&.coresdk.workflow_activation.FireTimerH\x00\x12K\n\x12update_random_seed\x18\x04 \x01(\x0b\x32-.coresdk.workflow_activation.UpdateRandomSeedH\x00\x12\x44\n\x0equery_workflow\x18\x05 \x01(\x0b\x32*.coresdk.workflow_activation.QueryWorkflowH\x00\x12\x46\n\x0f\x63\x61ncel_workflow\x18\x06 \x01(\x0b\x32+.coresdk.workflow_activation.CancelWorkflowH\x00\x12\x46\n\x0fsignal_workflow\x18\x07 \x01(\x0b\x32+.coresdk.workflow_activation.SignalWorkflowH\x00\x12H\n\x10resolve_activity\x18\x08 \x01(\x0b\x32,.coresdk.workflow_activation.ResolveActivityH\x00\x12G\n\x10notify_has_patch\x18\t \x01(\x0b\x32+.coresdk.workflow_activation.NotifyHasPatchH\x00\x12q\n&resolve_child_workflow_execution_start\x18\n \x01(\x0b\x32?.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartH\x00\x12\x66\n resolve_child_workflow_execution\x18\x0b \x01(\x0b\x32:.coresdk.workflow_activation.ResolveChildWorkflowExecutionH\x00\x12\x66\n resolve_signal_external_workflow\x18\x0c \x01(\x0b\x32:.coresdk.workflow_activation.ResolveSignalExternalWorkflowH\x00\x12u\n(resolve_request_cancel_external_workflow\x18\r \x01(\x0b\x32\x41.coresdk.workflow_activation.ResolveRequestCancelExternalWorkflowH\x00\x12:\n\tdo_update\x18\x0e \x01(\x0b\x32%.coresdk.workflow_activation.DoUpdateH\x00\x12`\n\x1dresolve_nexus_operation_start\x18\x0f \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveNexusOperationStartH\x00\x12U\n\x17resolve_nexus_operation\x18\x10 \x01(\x0b\x32\x32.coresdk.workflow_activation.ResolveNexusOperationH\x00\x12`\n\x1dresolve_external_stream_waits\x18\x11 \x01(\x0b\x32\x37.coresdk.workflow_activation.ResolveExternalStreamWaitsH\x00\x12^\n\x1cprepare_external_stream_park\x18\x12 \x01(\x0b\x32\x36.coresdk.workflow_activation.PrepareExternalStreamParkH\x00\x12U\n\x17replay_external_streams\x18\x13 \x01(\x0b\x32\x32.coresdk.workflow_activation.ReplayExternalStreamsH\x00\x12Y\n\x19\x66inalize_external_streams\x18\x14 \x01(\x0b\x32\x34.coresdk.workflow_activation.FinalizeExternalStreamsH\x00\x12S\n\x16\x64\x65liver_stream_records\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_activation.DeliverStreamRecordsH\x00\x12T\n\x16notifications_received\x18\x16 \x01(\x0b\x32\x32.coresdk.workflow_activation.NotificationsReceivedH\x00\x12I\n\x11remove_from_cache\x18\x32 \x01(\x0b\x32,.coresdk.workflow_activation.RemoveFromCacheH\x00\x42\t\n\x07variant"Z\n\x15NotificationsReceived\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x7f\n\x1aResolveExternalStreamWaits\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x42\n\x0bready_hints\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait"\xab\x01\n\x19PrepareExternalStreamPark\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x92\x02\n\x15ReplayExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x19\n\x11replay_annotation\x18\x03 \x01(\x0c\x12<\n\x11terminal_boundary\x18\x04 \x01(\x0e\x32!.coresdk.external_data.ParkReason\x12\x43\n\x06output\x18\x05 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest"\xa9\x01\n\x17\x46inalizeExternalStreams\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.coresdk.external_data.ParkReason"\x88\x01\n\x14\x44\x65liverStreamRecords\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x02 \x01(\x03\x12\x11\n\tto_offset\x18\x03 \x01(\x03\x12\x35\n\x07records\x18\x04 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\xfc\n\n\x12InitializeWorkflow\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x17\n\x0frandomness_seed\x18\x04 \x01(\x04\x12M\n\x07headers\x18\x05 \x03(\x0b\x32<.coresdk.workflow_activation.InitializeWorkflow.HeadersEntry\x12\x10\n\x08identity\x18\x06 \x01(\t\x12I\n\x14parent_workflow_info\x18\x07 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12=\n\x1aworkflow_execution_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\'\n\x1f\x63ontinued_from_execution_run_id\x18\x0b \x01(\t\x12J\n\x13\x63ontinued_initiator\x18\x0c \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\r \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1e\n\x16\x66irst_execution_run_id\x18\x0f \x01(\t\x12\x39\n\x0cretry_policy\x18\x10 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x11 \x01(\x05\x12\x15\n\rcron_schedule\x18\x12 \x01(\t\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n"cron_schedule_to_schedule_interval\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x15 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x16 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\nstart_time\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\rroot_workflow\x18\x18 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x08priority\x18\x19 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12!\n\x19original_execution_run_id\x18\x1a \x01(\t\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x18\n\tFireTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"m\n\x0fResolveActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.activity_result.ActivityResolution\x12\x10\n\x08is_local\x18\x03 \x01(\x08"\xd1\x02\n"ResolveChildWorkflowExecutionStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12[\n\tsucceeded\x18\x02 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartSuccessH\x00\x12X\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32\x46.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartFailureH\x00\x12]\n\tcancelled\x18\x04 \x01(\x0b\x32H.coresdk.workflow_activation.ResolveChildWorkflowExecutionStartCancelledH\x00\x42\x08\n\x06status";\n)ResolveChildWorkflowExecutionStartSuccess\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\xa6\x01\n)ResolveChildWorkflowExecutionStartFailure\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x15\n\rworkflow_type\x18\x02 \x01(\t\x12M\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32>.coresdk.child_workflow.StartChildWorkflowExecutionFailedCause"`\n+ResolveChildWorkflowExecutionStartCancelled\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"i\n\x1dResolveChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12;\n\x06result\x18\x02 \x01(\x0b\x32+.coresdk.child_workflow.ChildWorkflowResult"+\n\x10UpdateRandomSeed\x12\x17\n\x0frandomness_seed\x18\x01 \x01(\x04"\x84\x02\n\rQueryWorkflow\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12\x12\n\nquery_type\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12H\n\x07headers\x18\x05 \x03(\x0b\x32\x37.coresdk.workflow_activation.QueryWorkflow.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01" \n\x0e\x43\x61ncelWorkflow\x12\x0e\n\x06reason\x18\x01 \x01(\t"\xa1\x02\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12.\n\x05input\x18\x02 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x10\n\x08identity\x18\x03 \x01(\t\x12I\n\x07headers\x18\x05 \x03(\x0b\x32\x38.coresdk.workflow_activation.SignalWorkflow.HeadersEntry\x12\x1c\n\x14originating_event_id\x18\x06 \x01(\x03\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01""\n\x0eNotifyHasPatch\x12\x10\n\x08patch_id\x18\x01 \x01(\t"\xb1\x01\n\x1dResolveSignalExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12P\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause"\xb8\x01\n$ResolveRequestCancelExternalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12P\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause"\xcb\x02\n\x08\x44oUpdate\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1c\n\x14protocol_instance_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x43\n\x07headers\x18\x05 \x03(\x0b\x32\x32.coresdk.workflow_activation.DoUpdate.HeadersEntry\x12*\n\x04meta\x18\x06 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x15\n\rrun_validator\x18\x07 \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x9a\x01\n\x1aResolveNexusOperationStart\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x19\n\x0foperation_token\x18\x02 \x01(\tH\x00\x12\x16\n\x0cstarted_sync\x18\x03 \x01(\x08H\x00\x12\x32\n\x06\x66\x61iled\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\x08\n\x06status"Y\n\x15ResolveNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x33\n\x06result\x18\x02 \x01(\x0b\x32#.coresdk.nexus.NexusOperationResult"\xe0\x02\n\x0fRemoveFromCache\x12\x0f\n\x07message\x18\x01 \x01(\t\x12K\n\x06reason\x18\x02 \x01(\x0e\x32;.coresdk.workflow_activation.RemoveFromCache.EvictionReason"\xee\x01\n\x0e\x45victionReason\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nCACHE_FULL\x10\x01\x12\x0e\n\nCACHE_MISS\x10\x02\x12\x12\n\x0eNONDETERMINISM\x10\x03\x12\r\n\tLANG_FAIL\x10\x04\x12\x12\n\x0eLANG_REQUESTED\x10\x05\x12\x12\n\x0eTASK_NOT_FOUND\x10\x06\x12\x15\n\x11UNHANDLED_COMMAND\x10\x07\x12\t\n\x05\x46\x41TAL\x10\x08\x12\x1f\n\x1bPAGINATION_OR_HISTORY_FETCH\x10\t\x12\x1d\n\x19WORKFLOW_EXECUTION_ENDING\x10\nB8\xea\x02\x35Temporalio::Internal::Bridge::Api::WorkflowActivationb\x06proto3' ) _WORKFLOWACTIVATION = DESCRIPTOR.message_types_by_name["WorkflowActivation"] _WORKFLOWACTIVATIONJOB = DESCRIPTOR.message_types_by_name["WorkflowActivationJob"] -_DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _NOTIFICATIONSRECEIVED = DESCRIPTOR.message_types_by_name["NotificationsReceived"] +_RESOLVEEXTERNALSTREAMWAITS = DESCRIPTOR.message_types_by_name[ + "ResolveExternalStreamWaits" +] +_PREPAREEXTERNALSTREAMPARK = DESCRIPTOR.message_types_by_name[ + "PrepareExternalStreamPark" +] +_REPLAYEXTERNALSTREAMS = DESCRIPTOR.message_types_by_name["ReplayExternalStreams"] +_FINALIZEEXTERNALSTREAMS = DESCRIPTOR.message_types_by_name["FinalizeExternalStreams"] +_DELIVERSTREAMRECORDS = DESCRIPTOR.message_types_by_name["DeliverStreamRecords"] _INITIALIZEWORKFLOW = DESCRIPTOR.message_types_by_name["InitializeWorkflow"] _INITIALIZEWORKFLOW_HEADERSENTRY = _INITIALIZEWORKFLOW.nested_types_by_name[ "HeadersEntry" @@ -125,27 +139,71 @@ ) _sym_db.RegisterMessage(WorkflowActivationJob) -DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( - "DeliverStreamRecords", +NotificationsReceived = _reflection.GeneratedProtocolMessageType( + "NotificationsReceived", (_message.Message,), { - "DESCRIPTOR": _DELIVERSTREAMRECORDS, + "DESCRIPTOR": _NOTIFICATIONSRECEIVED, "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamRecords) + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotificationsReceived) }, ) -_sym_db.RegisterMessage(DeliverStreamRecords) +_sym_db.RegisterMessage(NotificationsReceived) -NotificationsReceived = _reflection.GeneratedProtocolMessageType( - "NotificationsReceived", +ResolveExternalStreamWaits = _reflection.GeneratedProtocolMessageType( + "ResolveExternalStreamWaits", (_message.Message,), { - "DESCRIPTOR": _NOTIFICATIONSRECEIVED, + "DESCRIPTOR": _RESOLVEEXTERNALSTREAMWAITS, "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.NotificationsReceived) + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ResolveExternalStreamWaits) }, ) -_sym_db.RegisterMessage(NotificationsReceived) +_sym_db.RegisterMessage(ResolveExternalStreamWaits) + +PrepareExternalStreamPark = _reflection.GeneratedProtocolMessageType( + "PrepareExternalStreamPark", + (_message.Message,), + { + "DESCRIPTOR": _PREPAREEXTERNALSTREAMPARK, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.PrepareExternalStreamPark) + }, +) +_sym_db.RegisterMessage(PrepareExternalStreamPark) + +ReplayExternalStreams = _reflection.GeneratedProtocolMessageType( + "ReplayExternalStreams", + (_message.Message,), + { + "DESCRIPTOR": _REPLAYEXTERNALSTREAMS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.ReplayExternalStreams) + }, +) +_sym_db.RegisterMessage(ReplayExternalStreams) + +FinalizeExternalStreams = _reflection.GeneratedProtocolMessageType( + "FinalizeExternalStreams", + (_message.Message,), + { + "DESCRIPTOR": _FINALIZEEXTERNALSTREAMS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.FinalizeExternalStreams) + }, +) +_sym_db.RegisterMessage(FinalizeExternalStreams) + +DeliverStreamRecords = _reflection.GeneratedProtocolMessageType( + "DeliverStreamRecords", + (_message.Message,), + { + "DESCRIPTOR": _DELIVERSTREAMRECORDS, + "__module__": "temporal.sdk.core.workflow_activation.workflow_activation_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_activation.DeliverStreamRecords) + }, +) +_sym_db.RegisterMessage(DeliverStreamRecords) InitializeWorkflow = _reflection.GeneratedProtocolMessageType( "InitializeWorkflow", @@ -409,60 +467,68 @@ _SIGNALWORKFLOW_HEADERSENTRY._serialized_options = b"8\001" _DOUPDATE_HEADERSENTRY._options = None _DOUPDATE_HEADERSENTRY._serialized_options = b"8\001" - _WORKFLOWACTIVATION._serialized_start = 656 - _WORKFLOWACTIVATION._serialized_end = 1202 - _WORKFLOWACTIVATIONJOB._serialized_start = 1205 - _WORKFLOWACTIVATIONJOB._serialized_end = 2752 - _DELIVERSTREAMRECORDS._serialized_start = 2755 - _DELIVERSTREAMRECORDS._serialized_end = 2891 - _NOTIFICATIONSRECEIVED._serialized_start = 2893 - _NOTIFICATIONSRECEIVED._serialized_end = 2983 - _INITIALIZEWORKFLOW._serialized_start = 2986 - _INITIALIZEWORKFLOW._serialized_end = 4390 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 4311 - _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 4390 - _FIRETIMER._serialized_start = 4392 - _FIRETIMER._serialized_end = 4416 - _RESOLVEACTIVITY._serialized_start = 4418 - _RESOLVEACTIVITY._serialized_end = 4527 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 4530 - _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 4867 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 4869 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 4928 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 4931 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 5097 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 5099 - _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 5195 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 5197 - _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 5302 - _UPDATERANDOMSEED._serialized_start = 5304 - _UPDATERANDOMSEED._serialized_end = 5347 - _QUERYWORKFLOW._serialized_start = 5350 - _QUERYWORKFLOW._serialized_end = 5610 - _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 4311 - _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 4390 - _CANCELWORKFLOW._serialized_start = 5612 - _CANCELWORKFLOW._serialized_end = 5644 - _SIGNALWORKFLOW._serialized_start = 5647 - _SIGNALWORKFLOW._serialized_end = 5936 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 4311 - _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 4390 - _NOTIFYHASPATCH._serialized_start = 5938 - _NOTIFYHASPATCH._serialized_end = 5972 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 5975 - _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 6152 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 6155 - _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 6339 - _DOUPDATE._serialized_start = 6342 - _DOUPDATE._serialized_end = 6673 - _DOUPDATE_HEADERSENTRY._serialized_start = 4311 - _DOUPDATE_HEADERSENTRY._serialized_end = 4390 - _RESOLVENEXUSOPERATIONSTART._serialized_start = 6676 - _RESOLVENEXUSOPERATIONSTART._serialized_end = 6830 - _RESOLVENEXUSOPERATION._serialized_start = 6832 - _RESOLVENEXUSOPERATION._serialized_end = 6921 - _REMOVEFROMCACHE._serialized_start = 6924 - _REMOVEFROMCACHE._serialized_end = 7276 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 7038 - _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 7276 + _WORKFLOWACTIVATION._serialized_start = 770 + _WORKFLOWACTIVATION._serialized_end = 1348 + _WORKFLOWACTIVATIONJOB._serialized_start = 1351 + _WORKFLOWACTIVATIONJOB._serialized_end = 3270 + _NOTIFICATIONSRECEIVED._serialized_start = 3272 + _NOTIFICATIONSRECEIVED._serialized_end = 3362 + _RESOLVEEXTERNALSTREAMWAITS._serialized_start = 3364 + _RESOLVEEXTERNALSTREAMWAITS._serialized_end = 3491 + _PREPAREEXTERNALSTREAMPARK._serialized_start = 3494 + _PREPAREEXTERNALSTREAMPARK._serialized_end = 3665 + _REPLAYEXTERNALSTREAMS._serialized_start = 3668 + _REPLAYEXTERNALSTREAMS._serialized_end = 3942 + _FINALIZEEXTERNALSTREAMS._serialized_start = 3945 + _FINALIZEEXTERNALSTREAMS._serialized_end = 4114 + _DELIVERSTREAMRECORDS._serialized_start = 4117 + _DELIVERSTREAMRECORDS._serialized_end = 4253 + _INITIALIZEWORKFLOW._serialized_start = 4256 + _INITIALIZEWORKFLOW._serialized_end = 5660 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_start = 5581 + _INITIALIZEWORKFLOW_HEADERSENTRY._serialized_end = 5660 + _FIRETIMER._serialized_start = 5662 + _FIRETIMER._serialized_end = 5686 + _RESOLVEACTIVITY._serialized_start = 5688 + _RESOLVEACTIVITY._serialized_end = 5797 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_start = 5800 + _RESOLVECHILDWORKFLOWEXECUTIONSTART._serialized_end = 6137 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_start = 6139 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTSUCCESS._serialized_end = 6198 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_start = 6201 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTFAILURE._serialized_end = 6367 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_start = 6369 + _RESOLVECHILDWORKFLOWEXECUTIONSTARTCANCELLED._serialized_end = 6465 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_start = 6467 + _RESOLVECHILDWORKFLOWEXECUTION._serialized_end = 6572 + _UPDATERANDOMSEED._serialized_start = 6574 + _UPDATERANDOMSEED._serialized_end = 6617 + _QUERYWORKFLOW._serialized_start = 6620 + _QUERYWORKFLOW._serialized_end = 6880 + _QUERYWORKFLOW_HEADERSENTRY._serialized_start = 5581 + _QUERYWORKFLOW_HEADERSENTRY._serialized_end = 5660 + _CANCELWORKFLOW._serialized_start = 6882 + _CANCELWORKFLOW._serialized_end = 6914 + _SIGNALWORKFLOW._serialized_start = 6917 + _SIGNALWORKFLOW._serialized_end = 7206 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_start = 5581 + _SIGNALWORKFLOW_HEADERSENTRY._serialized_end = 5660 + _NOTIFYHASPATCH._serialized_start = 7208 + _NOTIFYHASPATCH._serialized_end = 7242 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_start = 7245 + _RESOLVESIGNALEXTERNALWORKFLOW._serialized_end = 7422 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_start = 7425 + _RESOLVEREQUESTCANCELEXTERNALWORKFLOW._serialized_end = 7609 + _DOUPDATE._serialized_start = 7612 + _DOUPDATE._serialized_end = 7943 + _DOUPDATE_HEADERSENTRY._serialized_start = 5581 + _DOUPDATE_HEADERSENTRY._serialized_end = 5660 + _RESOLVENEXUSOPERATIONSTART._serialized_start = 7946 + _RESOLVENEXUSOPERATIONSTART._serialized_end = 8100 + _RESOLVENEXUSOPERATION._serialized_start = 8102 + _RESOLVENEXUSOPERATION._serialized_end = 8191 + _REMOVEFROMCACHE._serialized_start = 8194 + _REMOVEFROMCACHE._serialized_end = 8546 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_start = 8308 + _REMOVEFROMCACHE_EVICTIONREASON._serialized_end = 8546 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi index 2252f86c2..bff7a735d 100644 --- a/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi +++ b/temporalio/bridge/proto/workflow_activation/workflow_activation_pb2.pyi @@ -59,8 +59,6 @@ class WorkflowActivation(google.protobuf.message.Message): * Patches are expected to apply to the entire activation * Signal and update handlers should be invoked before workflow routines are iterated. That is to say before the users' main workflow function and anything spawned by it is allowed to continue. - * Channel notifications are input from outside the workflow, like signals, so they go with - them and ahead of the stream ranges among the other jobs. * Local activities resolutions go after other normal jobs because while *not* replaying, they will always take longer than anything else that produces an immediate job (which is effectively instant). When *replaying* we need to scan ahead for LA markers so that we can @@ -510,6 +508,37 @@ class WorkflowActivationJob(google.protobuf.message.Message): global___WorkflowActivationJob = WorkflowActivationJob +class NotificationsReceived(google.protobuf.message.Message): + """Hand a workflow the notifications the server folded for its channels. + + They come from the scheduled event of the Workflow Task this activation + belongs to. History is the record, so a replay yields the same job with the + same notifications at the same point. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NOTIFICATIONS_FIELD_NUMBER: builtins.int + @property + def notifications( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.notification.v1.message_pb2.Notification + ]: ... + def __init__( + self, + *, + notifications: collections.abc.Iterable[ + temporalio.api.notification.v1.message_pb2.Notification + ] + | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["notifications", b"notifications"] + ) -> None: ... + +global___NotificationsReceived = NotificationsReceived + class ResolveExternalStreamWaits(google.protobuf.message.Message): """Tells lang that one or more external stream waits may now have data. @@ -773,37 +802,6 @@ class DeliverStreamRecords(google.protobuf.message.Message): global___DeliverStreamRecords = DeliverStreamRecords -class NotificationsReceived(google.protobuf.message.Message): - """Hand a workflow the notifications the server folded for its channels. - - They come from the scheduled event of the Workflow Task this activation - belongs to. History is the record, so a replay yields the same job with the - same notifications at the same point. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NOTIFICATIONS_FIELD_NUMBER: builtins.int - @property - def notifications( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.notification.v1.message_pb2.Notification - ]: ... - def __init__( - self, - *, - notifications: collections.abc.Iterable[ - temporalio.api.notification.v1.message_pb2.Notification - ] - | None = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["notifications", b"notifications"] - ) -> None: ... - -global___NotificationsReceived = NotificationsReceived - class InitializeWorkflow(google.protobuf.message.Message): """Initialize a new workflow""" diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 7a4b9399c..bd30f7bd7 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -43,12 +43,15 @@ from temporalio.bridge.proto.common import ( common_pb2 as temporal_dot_sdk_dot_core_dot_common_dot_common__pb2, ) +from temporalio.bridge.proto.external_data import ( + external_data_pb2 as temporal_dot_sdk_dot_core_dot_external__data_dot_external__data__pb2, +) from temporalio.bridge.proto.nexus import ( nexus_pb2 as temporal_dot_sdk_dot_core_dot_nexus_dot_nexus__pb2, ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xa5\x12\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x42\t\n\x07variant"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x87\x01\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x93\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12#\n\x1binclude_arguments_in_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xce\x16\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x42\t\n\x07variant"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x87\x01\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x93\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12#\n\x1binclude_arguments_in_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,11 +62,24 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] -_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] -_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _SUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ "SubscribeNotificationChannel" ] +_WORKFLOWSTREAMPROGRESS = DESCRIPTOR.message_types_by_name["WorkflowStreamProgress"] +_WORKFLOWSTREAMQUIESCENT = DESCRIPTOR.message_types_by_name["WorkflowStreamQuiescent"] +_EXTERNALSTREAMWAIT = DESCRIPTOR.message_types_by_name["ExternalStreamWait"] +_EXTERNALSTREAMPARKRESULT = DESCRIPTOR.message_types_by_name["ExternalStreamParkResult"] +_PARKSETCONFIRMED = DESCRIPTOR.message_types_by_name["ParkSetConfirmed"] +_STREAMSETBECAMEREADY = DESCRIPTOR.message_types_by_name["StreamSetBecameReady"] +_EXTERNALSTREAMFINALIZED = DESCRIPTOR.message_types_by_name["ExternalStreamFinalized"] +_WORKFLOWOUTPUTSTREAMCOMMIT = DESCRIPTOR.message_types_by_name[ + "WorkflowOutputStreamCommit" +] +_WORKFLOWOUTPUTSTREAMBUFFERED = DESCRIPTOR.message_types_by_name[ + "WorkflowOutputStreamBuffered" +] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] _SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] @@ -138,6 +154,116 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +SubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( + "SubscribeNotificationChannel", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBENOTIFICATIONCHANNEL, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeNotificationChannel) + }, +) +_sym_db.RegisterMessage(SubscribeNotificationChannel) + +WorkflowStreamProgress = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamProgress", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMPROGRESS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamProgress) + }, +) +_sym_db.RegisterMessage(WorkflowStreamProgress) + +WorkflowStreamQuiescent = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamQuiescent", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMQUIESCENT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamQuiescent) + }, +) +_sym_db.RegisterMessage(WorkflowStreamQuiescent) + +ExternalStreamWait = _reflection.GeneratedProtocolMessageType( + "ExternalStreamWait", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMWAIT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamWait) + }, +) +_sym_db.RegisterMessage(ExternalStreamWait) + +ExternalStreamParkResult = _reflection.GeneratedProtocolMessageType( + "ExternalStreamParkResult", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMPARKRESULT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamParkResult) + }, +) +_sym_db.RegisterMessage(ExternalStreamParkResult) + +ParkSetConfirmed = _reflection.GeneratedProtocolMessageType( + "ParkSetConfirmed", + (_message.Message,), + { + "DESCRIPTOR": _PARKSETCONFIRMED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ParkSetConfirmed) + }, +) +_sym_db.RegisterMessage(ParkSetConfirmed) + +StreamSetBecameReady = _reflection.GeneratedProtocolMessageType( + "StreamSetBecameReady", + (_message.Message,), + { + "DESCRIPTOR": _STREAMSETBECAMEREADY, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.StreamSetBecameReady) + }, +) +_sym_db.RegisterMessage(StreamSetBecameReady) + +ExternalStreamFinalized = _reflection.GeneratedProtocolMessageType( + "ExternalStreamFinalized", + (_message.Message,), + { + "DESCRIPTOR": _EXTERNALSTREAMFINALIZED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.ExternalStreamFinalized) + }, +) +_sym_db.RegisterMessage(ExternalStreamFinalized) + +WorkflowOutputStreamCommit = _reflection.GeneratedProtocolMessageType( + "WorkflowOutputStreamCommit", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWOUTPUTSTREAMCOMMIT, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowOutputStreamCommit) + }, +) +_sym_db.RegisterMessage(WorkflowOutputStreamCommit) + +WorkflowOutputStreamBuffered = _reflection.GeneratedProtocolMessageType( + "WorkflowOutputStreamBuffered", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWOUTPUTSTREAMBUFFERED, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowOutputStreamBuffered) + }, +) +_sym_db.RegisterMessage(WorkflowOutputStreamBuffered) + AppendStreamRecords = _reflection.GeneratedProtocolMessageType( "AppendStreamRecords", (_message.Message,), @@ -160,17 +286,6 @@ ) _sym_db.RegisterMessage(SubscribeStream) -SubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( - "SubscribeNotificationChannel", - (_message.Message,), - { - "DESCRIPTOR": _SUBSCRIBENOTIFICATIONCHANNEL, - "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", - # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeNotificationChannel) - }, -) -_sym_db.RegisterMessage(SubscribeNotificationChannel) - StartTimer = _reflection.GeneratedProtocolMessageType( "StartTimer", (_message.Message,), @@ -525,76 +640,94 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 9246 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9334 - _WORKFLOWCOMMAND._serialized_start = 556 - _WORKFLOWCOMMAND._serialized_end = 2897 - _APPENDSTREAMRECORDS._serialized_start = 2899 - _APPENDSTREAMRECORDS._serialized_end = 2996 - _SUBSCRIBESTREAM._serialized_start = 2999 - _SUBSCRIBESTREAM._serialized_end = 3134 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3136 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3183 - _STARTTIMER._serialized_start = 3185 - _STARTTIMER._serialized_end = 3268 - _CANCELTIMER._serialized_start = 3270 - _CANCELTIMER._serialized_end = 3296 - _SCHEDULEACTIVITY._serialized_start = 3299 - _SCHEDULEACTIVITY._serialized_end = 4123 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 4044 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 4123 - _SCHEDULELOCALACTIVITY._serialized_start = 4126 - _SCHEDULELOCALACTIVITY._serialized_end = 4913 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 4044 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 4123 - _REQUESTCANCELACTIVITY._serialized_start = 4915 - _REQUESTCANCELACTIVITY._serialized_end = 4951 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4953 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4994 - _QUERYRESULT._serialized_start = 4997 - _QUERYRESULT._serialized_end = 5153 - _QUERYSUCCESS._serialized_start = 5155 - _QUERYSUCCESS._serialized_end = 5220 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 5222 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5298 - _FAILWORKFLOWEXECUTION._serialized_start = 5300 - _FAILWORKFLOWEXECUTION._serialized_end = 5374 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5377 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6291 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 6134 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 6210 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4044 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4123 - _CANCELWORKFLOWEXECUTION._serialized_start = 6293 - _CANCELWORKFLOWEXECUTION._serialized_end = 6369 - _SETPATCHMARKER._serialized_start = 6371 - _SETPATCHMARKER._serialized_end = 6425 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6428 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7602 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4044 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4123 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 6134 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 6210 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7604 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7678 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7681 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7823 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7826 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8225 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4044 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4123 - _CANCELSIGNALWORKFLOW._serialized_start = 8227 - _CANCELSIGNALWORKFLOW._serialized_end = 8262 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8264 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8365 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8367 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8446 - _UPDATERESPONSE._serialized_start = 8449 - _UPDATERESPONSE._serialized_end = 8659 - _SCHEDULENEXUSOPERATION._serialized_start = 8662 - _SCHEDULENEXUSOPERATION._serialized_end = 9200 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 9150 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 9200 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 9202 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 9244 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 10783 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 10871 + _WORKFLOWCOMMAND._serialized_start = 609 + _WORKFLOWCOMMAND._serialized_end = 3503 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3505 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3552 + _WORKFLOWSTREAMPROGRESS._serialized_start = 3554 + _WORKFLOWSTREAMPROGRESS._serialized_end = 3631 + _WORKFLOWSTREAMQUIESCENT._serialized_start = 3634 + _WORKFLOWSTREAMQUIESCENT._serialized_end = 3801 + _EXTERNALSTREAMWAIT._serialized_start = 3803 + _EXTERNALSTREAMWAIT._serialized_end = 3890 + _EXTERNALSTREAMPARKRESULT._serialized_start = 3893 + _EXTERNALSTREAMPARKRESULT._serialized_end = 4133 + _PARKSETCONFIRMED._serialized_start = 4135 + _PARKSETCONFIRMED._serialized_end = 4153 + _STREAMSETBECAMEREADY._serialized_start = 4155 + _STREAMSETBECAMEREADY._serialized_end = 4177 + _EXTERNALSTREAMFINALIZED._serialized_start = 4179 + _EXTERNALSTREAMFINALIZED._serialized_end = 4268 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 4270 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4395 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4397 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4483 + _APPENDSTREAMRECORDS._serialized_start = 4485 + _APPENDSTREAMRECORDS._serialized_end = 4582 + _SUBSCRIBESTREAM._serialized_start = 4585 + _SUBSCRIBESTREAM._serialized_end = 4720 + _STARTTIMER._serialized_start = 4722 + _STARTTIMER._serialized_end = 4805 + _CANCELTIMER._serialized_start = 4807 + _CANCELTIMER._serialized_end = 4833 + _SCHEDULEACTIVITY._serialized_start = 4836 + _SCHEDULEACTIVITY._serialized_end = 5660 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5581 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5660 + _SCHEDULELOCALACTIVITY._serialized_start = 5663 + _SCHEDULELOCALACTIVITY._serialized_end = 6450 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5581 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5660 + _REQUESTCANCELACTIVITY._serialized_start = 6452 + _REQUESTCANCELACTIVITY._serialized_end = 6488 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 6490 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 6531 + _QUERYRESULT._serialized_start = 6534 + _QUERYRESULT._serialized_end = 6690 + _QUERYSUCCESS._serialized_start = 6692 + _QUERYSUCCESS._serialized_end = 6757 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 6759 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 6835 + _FAILWORKFLOWEXECUTION._serialized_start = 6837 + _FAILWORKFLOWEXECUTION._serialized_end = 6911 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6914 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7828 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7671 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7747 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5581 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5660 + _CANCELWORKFLOWEXECUTION._serialized_start = 7830 + _CANCELWORKFLOWEXECUTION._serialized_end = 7906 + _SETPATCHMARKER._serialized_start = 7908 + _SETPATCHMARKER._serialized_end = 7962 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7965 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 9139 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5581 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5660 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7671 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7747 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 9141 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 9215 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 9218 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9360 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9363 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9762 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5581 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5660 + _CANCELSIGNALWORKFLOW._serialized_start = 9764 + _CANCELSIGNALWORKFLOW._serialized_end = 9799 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9801 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9902 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 9904 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 9983 + _UPDATERESPONSE._serialized_start = 9986 + _UPDATERESPONSE._serialized_end = 10196 + _SCHEDULENEXUSOPERATION._serialized_start = 10199 + _SCHEDULENEXUSOPERATION._serialized_end = 10737 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10687 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10737 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 10739 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 10781 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 39d9eff0a..d6f5a98ba 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -448,6 +448,30 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand +class SubscribeNotificationChannel(google.protobuf.message.Message): + """Subscribe this workflow to a notification channel, so the scheduled event of + each later Workflow Task carries the notifications folded for it. + + The notifications live in History rather than arriving by a side channel, so + a replay reads the same ones the live run saw. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """Name of the channel, scoped to the namespace.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___SubscribeNotificationChannel = SubscribeNotificationChannel + class WorkflowStreamProgress(google.protobuf.message.Message): """Commits an observation delta for external streams. @@ -861,30 +885,6 @@ class SubscribeStream(google.protobuf.message.Message): global___SubscribeStream = SubscribeStream -class SubscribeNotificationChannel(google.protobuf.message.Message): - """Subscribe this workflow to a notification channel, so the scheduled event of - each later Workflow Task carries the notifications folded for it. - - The notifications live in History rather than arriving by a side channel, so - a replay reads the same ones the live run saw. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - CHANNEL_FIELD_NUMBER: builtins.int - channel: builtins.str - """Name of the channel, scoped to the namespace.""" - def __init__( - self, - *, - channel: builtins.str = ..., - ) -> None: ... - def ClearField( - self, field_name: typing_extensions.Literal["channel", b"channel"] - ) -> None: ... - -global___SubscribeNotificationChannel = SubscribeNotificationChannel - class StartTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 172074566..5b4b8573f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 1720745668086de0057e1daafa44317ec99fa532 +Subproject commit 5b4b8573fe2bcbd73777435a894d1e71d176847a From 3aaa09da67ff6acffc34111f144014f7d71b4713 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:03:00 -0700 Subject: [PATCH 779/831] Pinned Core without the point-to-point wake and with the linked channel contract. --- temporalio/api/notification/v1/__init__.py | 3 +- temporalio/api/notification/v1/message_pb2.py | 25 +- .../api/notification/v1/message_pb2.pyi | 52 +- temporalio/api/workflow/v1/__init__.py | 2 - temporalio/api/workflow/v1/message_pb2.py | 16 +- temporalio/api/workflow/v1/message_pb2.pyi | 53 - temporalio/api/workflowservice/v1/__init__.py | 4 - .../v1/request_response_pb2.py | 1120 ++++++++--------- .../v1/request_response_pb2.pyi | 212 ++-- .../api/workflowservice/v1/service_pb2.py | 18 +- .../workflowservice/v1/service_pb2_grpc.py | 53 - .../workflowservice/v1/service_pb2_grpc.pyi | 28 - temporalio/bridge/sdk-core | 2 +- temporalio/bridge/services_generated.py | 18 - temporalio/bridge/src/client_rpc_generated.rs | 9 - 15 files changed, 736 insertions(+), 879 deletions(-) diff --git a/temporalio/api/notification/v1/__init__.py b/temporalio/api/notification/v1/__init__.py index bc7da47f6..5814ff02e 100644 --- a/temporalio/api/notification/v1/__init__.py +++ b/temporalio/api/notification/v1/__init__.py @@ -1,6 +1,7 @@ -from .message_pb2 import ChannelListener, Notification, WorkflowListener +from .message_pb2 import ChannelKind, ChannelListener, Notification, WorkflowListener __all__ = [ + "ChannelKind", "ChannelListener", "Notification", "WorkflowListener", diff --git a/temporalio/api/notification/v1/message_pb2.py b/temporalio/api/notification/v1/message_pb2.py index d18373de8..ad5245d17 100644 --- a/temporalio/api/notification/v1/message_pb2.py +++ b/temporalio/api/notification/v1/message_pb2.py @@ -8,6 +8,7 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper # @@protoc_insertion_point(imports) @@ -21,9 +22,15 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xe0\x01\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\tB\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' + b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x9e\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' ) +_CHANNELKIND = DESCRIPTOR.enum_types_by_name["ChannelKind"] +ChannelKind = enum_type_wrapper.EnumTypeWrapper(_CHANNELKIND) +CHANNEL_KIND_UNSPECIFIED = 0 +CHANNEL_KIND_INDEPENDENT = 1 +CHANNEL_KIND_LINKED = 2 + _NOTIFICATION = DESCRIPTOR.message_types_by_name["Notification"] _NOTIFICATION_METADATAENTRY = _NOTIFICATION.nested_types_by_name["MetadataEntry"] @@ -77,12 +84,14 @@ DESCRIPTOR._serialized_options = b"\n\037io.temporal.api.notification.v1B\014MessageProtoP\001Z/go.temporal.io/api/notification/v1;notification\252\002\036Temporalio.Api.Notification.V1\352\002!Temporalio::Api::Notification::V1" _NOTIFICATION_METADATAENTRY._options = None _NOTIFICATION_METADATAENTRY._serialized_options = b"8\001" + _CHANNELKIND._serialized_start = 721 + _CHANNELKIND._serialized_end = 819 _NOTIFICATION._serialized_start = 148 - _NOTIFICATION._serialized_end = 372 - _NOTIFICATION_METADATAENTRY._serialized_start = 292 - _NOTIFICATION_METADATAENTRY._serialized_end = 372 - _CHANNELLISTENER._serialized_start = 375 - _CHANNELLISTENER._serialized_end = 600 - _WORKFLOWLISTENER._serialized_start = 602 - _WORKFLOWLISTENER._serialized_end = 657 + _NOTIFICATION._serialized_end = 434 + _NOTIFICATION_METADATAENTRY._serialized_start = 354 + _NOTIFICATION_METADATAENTRY._serialized_end = 434 + _CHANNELLISTENER._serialized_start = 437 + _CHANNELLISTENER._serialized_end = 662 + _WORKFLOWLISTENER._serialized_start = 664 + _WORKFLOWLISTENER._serialized_end = 719 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/notification/v1/message_pb2.pyi b/temporalio/api/notification/v1/message_pb2.pyi index 55dd27655..400969f66 100644 --- a/temporalio/api/notification/v1/message_pb2.pyi +++ b/temporalio/api/notification/v1/message_pb2.pyi @@ -6,21 +6,56 @@ isort:skip_file import builtins import collections.abc import sys +import typing import google.protobuf.descriptor import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -if sys.version_info >= (3, 8): +if sys.version_info >= (3, 10): import typing as typing_extensions else: import typing_extensions DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +class _ChannelKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _ChannelKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ChannelKind.ValueType], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + CHANNEL_KIND_UNSPECIFIED: _ChannelKind.ValueType # 0 + CHANNEL_KIND_INDEPENDENT: _ChannelKind.ValueType # 1 + """Its own execution, keyed by namespace and channel name. Any number of + workflows and callbacks listen to it. + """ + CHANNEL_KIND_LINKED: _ChannelKind.ValueType # 2 + """Kept in one workflow's state, keyed by namespace, workflow id and + channel name. The owning workflow is its listener by construction. + """ + +class ChannelKind(_ChannelKind, metaclass=_ChannelKindEnumTypeWrapper): + """Where a channel lives, which decides how a call addresses it.""" + +CHANNEL_KIND_UNSPECIFIED: ChannelKind.ValueType # 0 +CHANNEL_KIND_INDEPENDENT: ChannelKind.ValueType # 1 +"""Its own execution, keyed by namespace and channel name. Any number of +workflows and callbacks listen to it. +""" +CHANNEL_KIND_LINKED: ChannelKind.ValueType # 2 +"""Kept in one workflow's state, keyed by namespace, workflow id and +channel name. The owning workflow is its listener by construction. +""" +global___ChannelKind = ChannelKind + class Notification(google.protobuf.message.Message): """A notification tells the listeners of a channel that a source they consume has moved. It is not data: the listener reads the source itself. A channel @@ -58,6 +93,7 @@ class Notification(google.protobuf.message.Message): POSITION_FIELD_NUMBER: builtins.int COUNTER_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int + LINKED_TO_FIELD_NUMBER: builtins.int channel: builtins.str """The channel the writer notified. Listeners register on the same name.""" position: builtins.bytes @@ -78,6 +114,14 @@ class Notification(google.protobuf.message.Message): """Details for the listener, such as which topic moved. Bounded in size and carried as payloads, so a codec applies as to any payload. """ + @property + def linked_to(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """Set for a channel linked to a workflow: the owner and the run that + received the notification. Empty for an independent channel. A listener + that holds both kinds routes the notification by it. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "to" names the owner the channel is linked to. --) + """ def __init__( self, *, @@ -88,7 +132,11 @@ class Notification(google.protobuf.message.Message): builtins.str, temporalio.api.common.v1.message_pb2.Payload ] | None = ..., + linked_to: temporalio.api.common.v1.message_pb2.WorkflowExecution | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["linked_to", b"linked_to"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ @@ -96,6 +144,8 @@ class Notification(google.protobuf.message.Message): b"channel", "counter", b"counter", + "linked_to", + b"linked_to", "metadata", b"metadata", "position", diff --git a/temporalio/api/workflow/v1/__init__.py b/temporalio/api/workflow/v1/__init__.py index 7f51920fe..ae647ab67 100644 --- a/temporalio/api/workflow/v1/__init__.py +++ b/temporalio/api/workflow/v1/__init__.py @@ -14,7 +14,6 @@ ResetPointInfo, ResetPoints, VersioningOverride, - Wake, WorkflowExecutionConfig, WorkflowExecutionExtendedInfo, WorkflowExecutionInfo, @@ -39,7 +38,6 @@ "ResetPointInfo", "ResetPoints", "VersioningOverride", - "Wake", "WorkflowExecutionConfig", "WorkflowExecutionExtendedInfo", "WorkflowExecutionInfo", diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index ae06653d6..032f2b2b5 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\t"9\n\x04Wake\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x42\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -114,7 +114,6 @@ _WORKFLOWEXECUTIONPAUSEINFO = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionPauseInfo" ] -_WAKE = DESCRIPTOR.message_types_by_name["Wake"] _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR = _VERSIONINGOVERRIDE.enum_types_by_name[ "PinnedOverrideBehavior" ] @@ -459,17 +458,6 @@ ) _sym_db.RegisterMessage(WorkflowExecutionPauseInfo) -Wake = _reflection.GeneratedProtocolMessageType( - "Wake", - (_message.Message,), - { - "DESCRIPTOR": _WAKE, - "__module__": "temporalio.api.workflow.v1.message_pb2", - # @@protoc_insertion_point(class_scope:temporal.api.workflow.v1.Wake) - }, -) -_sym_db.RegisterMessage(Wake) - if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\033io.temporal.api.workflow.v1B\014MessageProtoP\001Z'go.temporal.io/api/workflow/v1;workflow\252\002\032Temporalio.Api.Workflow.V1\352\002\035Temporalio::Api::Workflow::V1" @@ -611,6 +599,4 @@ _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10778 _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10791 _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10902 - _WAKE._serialized_start = 10904 - _WAKE._serialized_end = 10961 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index 78586c70d..b390d94f4 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -2428,56 +2428,3 @@ class WorkflowExecutionPauseInfo(google.protobuf.message.Message): ) -> None: ... global___WorkflowExecutionPauseInfo = WorkflowExecutionPauseInfo - -class Wake(google.protobuf.message.Message): - """A wake tells a running Workflow Execution that something it consumes has - moved, so it should run a Workflow Task and read from its own cursor. It is - a reason to run, not data: nothing is recorded in History and no record - travels with it. A store Temporal does not host sends one after the store - has acknowledged a write. Wakes for the same source fold while one is - pending and no task has received it yet, so a burst of writes costs one - task. Once a task has been handed the wake, a new wake for the source is - accepted again, because only the receiver knows what it read. - - Superseded by the notification channel (`NotifyChannel` and the - `SubscribeNotificationChannel` command). Kept for one round and slated for - removal. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SOURCE_FIELD_NUMBER: builtins.int - POSITION_FIELD_NUMBER: builtins.int - COUNTER_FIELD_NUMBER: builtins.int - source: builtins.str - """What moved, as the sender names it. The server folds wakes by this value - and never interprets it. For a stream, the provider formats the stream's - identity, owner and topic, into it. - """ - position: builtins.bytes - """Where the source stands after the write that caused this wake, in the - store's own terms. Opaque to the server and handed to the Workflow as - received. Among wakes folded together, the position with the highest - counter is the one delivered. - """ - counter: builtins.int - """Orders wakes from one source, so that folding keeps the latest position. - Only the source's store can order its positions, so the sender derives - this from the position. It is not a durable identity: a wake sent after - a task received an equal counter is accepted again. - """ - def __init__( - self, - *, - source: builtins.str = ..., - position: builtins.bytes = ..., - counter: builtins.int = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "counter", b"counter", "position", b"position", "source", b"source" - ], - ) -> None: ... - -global___Wake = Wake diff --git a/temporalio/api/workflowservice/v1/__init__.py b/temporalio/api/workflowservice/v1/__init__.py index 5f95a044c..2ab6533c8 100644 --- a/temporalio/api/workflowservice/v1/__init__.py +++ b/temporalio/api/workflowservice/v1/__init__.py @@ -255,8 +255,6 @@ UpdateWorkflowExecutionResponse, ValidateWorkerDeploymentVersionComputeConfigRequest, ValidateWorkerDeploymentVersionComputeConfigResponse, - WakeWorkflowExecutionRequest, - WakeWorkflowExecutionResponse, ) __all__ = [ @@ -516,8 +514,6 @@ "UpdateWorkflowExecutionResponse", "ValidateWorkerDeploymentVersionComputeConfigRequest", "ValidateWorkerDeploymentVersionComputeConfigResponse", - "WakeWorkflowExecutionRequest", - "WakeWorkflowExecutionResponse", ] # gRPC is optional diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index a2a505cfe..9804b7923 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\x91\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\x9e\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"m\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"#\n!UnregisterChannelListenerResponse"\x93\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"<\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\xaf\x01\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -273,12 +273,6 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ "SignalWorkflowExecutionResponse" ] -_WAKEWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ - "WakeWorkflowExecutionRequest" -] -_WAKEWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ - "WakeWorkflowExecutionResponse" -] _NOTIFYCHANNELREQUEST = DESCRIPTOR.message_types_by_name["NotifyChannelRequest"] _NOTIFYCHANNELRESPONSE = DESCRIPTOR.message_types_by_name["NotifyChannelResponse"] _REGISTERCHANNELLISTENERREQUEST = DESCRIPTOR.message_types_by_name[ @@ -1465,28 +1459,6 @@ ) _sym_db.RegisterMessage(SignalWorkflowExecutionResponse) -WakeWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( - "WakeWorkflowExecutionRequest", - (_message.Message,), - { - "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONREQUEST, - "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", - # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionRequest) - }, -) -_sym_db.RegisterMessage(WakeWorkflowExecutionRequest) - -WakeWorkflowExecutionResponse = _reflection.GeneratedProtocolMessageType( - "WakeWorkflowExecutionResponse", - (_message.Message,), - { - "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONRESPONSE, - "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", - # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse) - }, -) -_sym_db.RegisterMessage(WakeWorkflowExecutionResponse) - NotifyChannelRequest = _reflection.GeneratedProtocolMessageType( "NotifyChannelRequest", (_message.Message,), @@ -4413,565 +4385,561 @@ _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8364 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8280 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8364 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8367 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9705 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9539 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9634 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9636 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9705 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9708 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9953 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9956 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10481 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10483 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10518 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10521 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11007 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11010 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12191 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12194 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12359 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12361 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12473 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12476 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12683 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12685 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12801 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12804 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13186 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13188 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13226 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13229 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13436 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13438 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13480 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13483 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13929 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13931 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14018 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14021 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14292 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14294 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14385 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14388 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14770 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14772 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14809 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14812 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15100 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15102 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15143 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15146 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15406 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15408 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15448 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15451 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15801 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15803 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15880 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15883 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16067 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16069 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16132 - _NOTIFYCHANNELREQUEST._serialized_start = 16135 - _NOTIFYCHANNELREQUEST._serialized_end = 16280 - _NOTIFYCHANNELRESPONSE._serialized_start = 16282 - _NOTIFYCHANNELRESPONSE._serialized_end = 16329 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16332 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16490 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16492 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16546 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16548 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16657 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16659 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16694 - _POLLCHANNELREQUEST._serialized_start = 16697 - _POLLCHANNELREQUEST._serialized_end = 16844 - _POLLCHANNELRESPONSE._serialized_start = 16846 - _POLLCHANNELRESPONSE._serialized_end = 16934 - _DESCRIBECHANNELREQUEST._serialized_start = 16936 - _DESCRIBECHANNELREQUEST._serialized_end = 16996 - _DESCRIBECHANNELRESPONSE._serialized_start = 16999 - _DESCRIBECHANNELRESPONSE._serialized_end = 17174 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17177 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18516 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18519 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18677 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18680 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19129 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19131 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19179 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19182 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19469 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19471 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19507 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19509 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19631 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19633 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19666 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19669 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 19998 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20001 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20131 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20134 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20528 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20531 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20663 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20665 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20774 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20776 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20902 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20904 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21021 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21024 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21158 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21160 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21269 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21271 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21397 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21399 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21465 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21468 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21705 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21707 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21735 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21738 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 21939 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 21855 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 21939 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 21942 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22303 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22305 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22340 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22342 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22452 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22454 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22484 - _SHUTDOWNWORKERREQUEST._serialized_start = 22487 - _SHUTDOWNWORKERREQUEST._serialized_end = 22770 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22772 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22796 - _QUERYWORKFLOWREQUEST._serialized_start = 22799 - _QUERYWORKFLOWREQUEST._serialized_end = 23032 - _QUERYWORKFLOWRESPONSE._serialized_start = 23035 - _QUERYWORKFLOWRESPONSE._serialized_end = 23220 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23222 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23337 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23340 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24005 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24008 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24536 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24539 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25543 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25325 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25441 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25443 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25543 - _GETCLUSTERINFOREQUEST._serialized_start = 25545 - _GETCLUSTERINFOREQUEST._serialized_end = 25568 - _GETCLUSTERINFORESPONSE._serialized_start = 25571 - _GETCLUSTERINFORESPONSE._serialized_end = 26036 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 25981 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26036 - _GETSYSTEMINFOREQUEST._serialized_start = 26038 - _GETSYSTEMINFOREQUEST._serialized_end = 26060 - _GETSYSTEMINFORESPONSE._serialized_start = 26063 - _GETSYSTEMINFORESPONSE._serialized_end = 26640 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26204 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26640 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26642 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26751 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26754 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 26977 - _CREATESCHEDULEREQUEST._serialized_start = 26980 - _CREATESCHEDULEREQUEST._serialized_end = 27312 - _CREATESCHEDULERESPONSE._serialized_start = 27314 - _CREATESCHEDULERESPONSE._serialized_end = 27362 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27364 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27429 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27432 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27703 - _UPDATESCHEDULEREQUEST._serialized_start = 27706 - _UPDATESCHEDULEREQUEST._serialized_end = 27998 - _UPDATESCHEDULERESPONSE._serialized_start = 28000 - _UPDATESCHEDULERESPONSE._serialized_end = 28024 - _PATCHSCHEDULEREQUEST._serialized_start = 28027 - _PATCHSCHEDULEREQUEST._serialized_end = 28183 - _PATCHSCHEDULERESPONSE._serialized_start = 28185 - _PATCHSCHEDULERESPONSE._serialized_end = 28208 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28211 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28379 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28381 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28464 - _DELETESCHEDULEREQUEST._serialized_start = 28466 - _DELETESCHEDULEREQUEST._serialized_end = 28547 - _DELETESCHEDULERESPONSE._serialized_start = 28549 - _DELETESCHEDULERESPONSE._serialized_end = 28573 - _LISTSCHEDULESREQUEST._serialized_start = 28575 - _LISTSCHEDULESREQUEST._serialized_end = 28683 - _LISTSCHEDULESRESPONSE._serialized_start = 28685 - _LISTSCHEDULESRESPONSE._serialized_end = 28797 - _COUNTSCHEDULESREQUEST._serialized_start = 28799 - _COUNTSCHEDULESREQUEST._serialized_end = 28856 - _COUNTSCHEDULESRESPONSE._serialized_start = 28859 - _COUNTSCHEDULESRESPONSE._serialized_end = 29078 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29081 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29727 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29528 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8323 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8233 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8317 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8326 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9664 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9498 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9593 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9595 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9664 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9667 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9912 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9915 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10440 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10442 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10477 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10480 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10966 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10969 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12150 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12153 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12318 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12320 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12432 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12435 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12642 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12644 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12760 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12763 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13145 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13147 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13185 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13188 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13395 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13397 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13439 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13442 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13888 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13890 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13977 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13980 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14251 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14253 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14344 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14347 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14729 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14731 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14768 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14771 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15059 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15061 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15102 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15105 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15365 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15367 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15407 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15410 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15760 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 + _NOTIFYCHANNELREQUEST._serialized_start = 15842 + _NOTIFYCHANNELREQUEST._serialized_end = 16058 + _NOTIFYCHANNELRESPONSE._serialized_start = 16060 + _NOTIFYCHANNELRESPONSE._serialized_end = 16107 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16110 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16339 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16341 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16395 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16398 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16578 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16580 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16615 + _POLLCHANNELREQUEST._serialized_start = 16618 + _POLLCHANNELREQUEST._serialized_end = 16836 + _POLLCHANNELRESPONSE._serialized_start = 16838 + _POLLCHANNELRESPONSE._serialized_end = 16926 + _DESCRIBECHANNELREQUEST._serialized_start = 16929 + _DESCRIBECHANNELREQUEST._serialized_end = 17060 + _DESCRIBECHANNELRESPONSE._serialized_start = 17063 + _DESCRIBECHANNELRESPONSE._serialized_end = 17357 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17360 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18699 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18702 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18860 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18863 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19312 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19314 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19362 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19365 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19652 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19654 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19690 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19692 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19814 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19816 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19849 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19852 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20181 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20184 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20314 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20317 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20711 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20714 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20846 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20848 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20957 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20959 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21085 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21087 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21204 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21207 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21341 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21343 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21452 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21454 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21580 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21582 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21648 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21651 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21888 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21890 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21918 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21921 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22122 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22038 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22122 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22125 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22486 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22488 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22523 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22525 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22635 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22637 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22667 + _SHUTDOWNWORKERREQUEST._serialized_start = 22670 + _SHUTDOWNWORKERREQUEST._serialized_end = 22953 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22955 + _SHUTDOWNWORKERRESPONSE._serialized_end = 22979 + _QUERYWORKFLOWREQUEST._serialized_start = 22982 + _QUERYWORKFLOWREQUEST._serialized_end = 23215 + _QUERYWORKFLOWRESPONSE._serialized_start = 23218 + _QUERYWORKFLOWRESPONSE._serialized_end = 23403 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24188 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24191 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24719 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24722 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25726 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25508 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25624 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25626 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25726 + _GETCLUSTERINFOREQUEST._serialized_start = 25728 + _GETCLUSTERINFOREQUEST._serialized_end = 25751 + _GETCLUSTERINFORESPONSE._serialized_start = 25754 + _GETCLUSTERINFORESPONSE._serialized_end = 26219 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26164 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26219 + _GETSYSTEMINFOREQUEST._serialized_start = 26221 + _GETSYSTEMINFOREQUEST._serialized_end = 26243 + _GETSYSTEMINFORESPONSE._serialized_start = 26246 + _GETSYSTEMINFORESPONSE._serialized_end = 26823 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26387 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26823 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26825 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26934 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26937 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27160 + _CREATESCHEDULEREQUEST._serialized_start = 27163 + _CREATESCHEDULEREQUEST._serialized_end = 27495 + _CREATESCHEDULERESPONSE._serialized_start = 27497 + _CREATESCHEDULERESPONSE._serialized_end = 27545 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27547 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27612 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27615 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27886 + _UPDATESCHEDULEREQUEST._serialized_start = 27889 + _UPDATESCHEDULEREQUEST._serialized_end = 28181 + _UPDATESCHEDULERESPONSE._serialized_start = 28183 + _UPDATESCHEDULERESPONSE._serialized_end = 28207 + _PATCHSCHEDULEREQUEST._serialized_start = 28210 + _PATCHSCHEDULEREQUEST._serialized_end = 28366 + _PATCHSCHEDULERESPONSE._serialized_start = 28368 + _PATCHSCHEDULERESPONSE._serialized_end = 28391 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28394 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28562 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28564 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28647 + _DELETESCHEDULEREQUEST._serialized_start = 28649 + _DELETESCHEDULEREQUEST._serialized_end = 28730 + _DELETESCHEDULERESPONSE._serialized_start = 28732 + _DELETESCHEDULERESPONSE._serialized_end = 28756 + _LISTSCHEDULESREQUEST._serialized_start = 28758 + _LISTSCHEDULESREQUEST._serialized_end = 28866 + _LISTSCHEDULESRESPONSE._serialized_start = 28868 + _LISTSCHEDULESRESPONSE._serialized_end = 28980 + _COUNTSCHEDULESREQUEST._serialized_start = 28982 + _COUNTSCHEDULESREQUEST._serialized_end = 29039 + _COUNTSCHEDULESRESPONSE._serialized_start = 29042 + _COUNTSCHEDULESRESPONSE._serialized_end = 29261 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29264 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29910 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29711 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29639 + 29822 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29641 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29714 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29729 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29793 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29795 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29890 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29892 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30008 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30011 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31728 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31063 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29824 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29897 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29912 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29976 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29978 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30073 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30075 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30191 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30194 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31911 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31246 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31176 + 31359 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31179 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31362 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31308 + 31491 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31310 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31493 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31374 + 31557 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31376 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31482 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31484 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31594 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31596 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31658 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31660 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31715 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31731 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 31983 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 31985 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32057 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32060 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32309 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32312 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32468 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32470 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32584 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32587 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 32848 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 32851 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33110 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33113 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34479 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34481 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34510 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34512 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34608 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34610 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34638 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34640 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34706 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34709 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35181 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35183 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35274 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35276 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35397 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35400 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35585 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35588 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35807 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35810 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36226 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36229 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36583 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36586 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36753 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36755 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36790 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36793 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37013 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37015 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37047 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37050 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37422 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37216 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37422 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37425 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37757 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37551 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37757 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37760 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38096 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38099 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38418 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38420 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38520 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38522 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38631 - _PAUSEACTIVITYREQUEST._serialized_start = 38634 - _PAUSEACTIVITYREQUEST._serialized_end = 38833 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38836 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39019 - _PAUSEACTIVITYRESPONSE._serialized_start = 39021 - _PAUSEACTIVITYRESPONSE._serialized_end = 39044 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39046 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39078 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39081 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39361 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39364 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39637 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39639 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39664 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39666 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39700 - _RESETACTIVITYREQUEST._serialized_start = 39703 - _RESETACTIVITYREQUEST._serialized_end = 40010 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40013 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40303 - _RESETACTIVITYRESPONSE._serialized_start = 40305 - _RESETACTIVITYRESPONSE._serialized_end = 40328 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40330 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40362 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40365 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40649 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40652 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 40829 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 40831 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 40937 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 40939 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41036 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41039 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41233 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41236 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 41888 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41497 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 41888 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 41890 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 41967 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 41970 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42110 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42112 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42220 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42222 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42341 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42344 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42549 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42552 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42737 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42740 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 42969 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 42972 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43163 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43166 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43415 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43418 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43642 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43644 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43757 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43759 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43815 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43817 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 43910 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 43913 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44584 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44088 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44584 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44587 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44827 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 44829 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44868 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44871 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45071 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45073 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45112 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45114 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45207 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45209 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45241 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45244 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45760 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45762 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45814 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45817 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46317 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46319 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46373 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46376 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46794 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46709 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31559 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31665 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31667 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31777 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31779 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31841 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31843 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31898 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31914 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32166 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32168 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32240 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32243 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32492 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32495 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32651 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32653 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32767 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32770 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33031 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33034 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33293 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33296 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34662 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34664 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34693 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34695 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34791 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34793 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34821 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34823 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34889 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34892 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35364 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35366 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35457 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35459 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35580 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35583 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35768 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35771 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35990 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35993 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36409 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36412 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36766 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36769 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36936 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36938 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36973 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36976 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37196 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37198 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37230 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37233 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37605 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37399 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37605 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37608 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37940 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37734 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37940 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37943 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38279 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38282 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38601 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38603 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38703 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38705 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38814 + _PAUSEACTIVITYREQUEST._serialized_start = 38817 + _PAUSEACTIVITYREQUEST._serialized_end = 39016 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39019 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39202 + _PAUSEACTIVITYRESPONSE._serialized_start = 39204 + _PAUSEACTIVITYRESPONSE._serialized_end = 39227 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39229 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39261 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39264 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39544 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39547 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39820 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39822 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39847 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39849 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39883 + _RESETACTIVITYREQUEST._serialized_start = 39886 + _RESETACTIVITYREQUEST._serialized_end = 40193 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40196 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40486 + _RESETACTIVITYRESPONSE._serialized_start = 40488 + _RESETACTIVITYRESPONSE._serialized_end = 40511 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40513 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40545 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40548 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40832 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40835 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41012 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41014 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41120 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41122 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41219 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41222 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41416 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41419 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42071 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41680 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42071 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42073 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42150 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42153 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42293 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42295 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42403 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42405 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42524 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42527 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42732 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42735 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42920 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42923 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43152 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43155 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43346 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43349 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43598 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43601 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43825 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43827 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43940 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43942 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43998 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44000 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44093 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44096 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44767 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44271 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44767 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44770 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45010 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45012 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45051 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45054 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45254 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45256 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45295 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45297 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45390 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45392 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45424 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45427 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45943 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45945 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45997 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46000 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46500 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46502 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46556 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46559 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46977 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46892 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 46794 + 46977 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46796 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 46906 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 46909 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47098 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47100 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47199 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47201 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47270 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47272 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47379 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47381 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47494 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47497 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47724 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47727 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 47907 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 47909 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48004 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48006 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48071 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48073 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48154 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48156 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48219 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48221 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48249 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48251 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48321 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48323 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48427 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48430 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48636 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48638 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48684 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48687 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 48842 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 48844 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 48875 - _LISTWORKERSREQUEST._serialized_start = 48878 - _LISTWORKERSREQUEST._serialized_end = 49008 - _LISTWORKERSRESPONSE._serialized_start = 49011 - _LISTWORKERSRESPONSE._serialized_end = 49176 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49179 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 49904 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49746 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 49837 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46979 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47089 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47092 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47281 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47283 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47382 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47384 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47453 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47455 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47562 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47564 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47677 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47680 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47907 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47910 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48090 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48092 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48187 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48189 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48254 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48256 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48337 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48339 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48402 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48404 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48432 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48434 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48504 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48506 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48610 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48613 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48819 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48821 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48867 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48870 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49025 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49027 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49058 + _LISTWORKERSREQUEST._serialized_start = 49061 + _LISTWORKERSREQUEST._serialized_end = 49191 + _LISTWORKERSRESPONSE._serialized_start = 49194 + _LISTWORKERSRESPONSE._serialized_end = 49359 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49362 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50087 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49929 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50020 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 49839 + 50022 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 49904 + 50087 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 49906 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 49997 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50000 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50158 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50160 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50245 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50248 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50514 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50516 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50616 - _DESCRIBEWORKERREQUEST._serialized_start = 50618 - _DESCRIBEWORKERREQUEST._serialized_end = 50689 - _DESCRIBEWORKERRESPONSE._serialized_start = 50691 - _DESCRIBEWORKERRESPONSE._serialized_end = 50772 - _COUNTWORKERSREQUEST._serialized_start = 50774 - _COUNTWORKERSREQUEST._serialized_end = 50861 - _COUNTWORKERSRESPONSE._serialized_start = 50863 - _COUNTWORKERSRESPONSE._serialized_end = 50900 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 50903 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51044 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51046 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51078 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51081 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51224 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51226 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51260 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51263 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52440 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52442 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52551 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52554 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52782 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52785 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53101 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53103 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53189 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53191 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53307 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53309 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53418 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53421 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53551 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53554 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54403 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54353 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54403 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54405 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54476 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54479 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54649 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54652 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54963 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54966 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55127 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55130 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55391 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55393 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55508 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55511 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55650 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55652 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55718 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55721 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 55958 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55960 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56032 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56035 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56284 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56287 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56436 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56438 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56478 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56481 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56626 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56628 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56664 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56666 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56754 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56756 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56789 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56792 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56948 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56950 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56996 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56999 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57151 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57153 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57195 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57197 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57292 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57294 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57333 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57336 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57493 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57496 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57728 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50089 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50180 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50183 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50341 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50343 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50428 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50431 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50697 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50699 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50799 + _DESCRIBEWORKERREQUEST._serialized_start = 50801 + _DESCRIBEWORKERREQUEST._serialized_end = 50872 + _DESCRIBEWORKERRESPONSE._serialized_start = 50874 + _DESCRIBEWORKERRESPONSE._serialized_end = 50955 + _COUNTWORKERSREQUEST._serialized_start = 50957 + _COUNTWORKERSREQUEST._serialized_end = 51044 + _COUNTWORKERSRESPONSE._serialized_start = 51046 + _COUNTWORKERSRESPONSE._serialized_end = 51083 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51086 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51227 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51229 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51261 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51264 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51407 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51409 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51443 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51446 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52623 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52625 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52734 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52737 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52965 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52968 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53284 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53286 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53372 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53374 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53490 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53492 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53601 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53604 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53734 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53737 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54586 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54536 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54586 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54588 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54659 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54662 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54832 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54835 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55146 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55149 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55310 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55313 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55574 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55576 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55691 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55694 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55833 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55835 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55901 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55904 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56141 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56143 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56215 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56218 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56467 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56470 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56619 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56621 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56661 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56664 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56809 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56811 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56847 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56849 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56937 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56939 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56975 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57131 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57133 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57179 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57182 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57334 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57336 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57378 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57380 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57475 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57477 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57516 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57519 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57676 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57679 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57911 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index 381e1f4e0..161d051c0 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -1281,7 +1281,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int STREAM_SLICES_FIELD_NUMBER: builtins.int - WAKES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1405,17 +1404,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): """Stream data attached to this task. Delivered out of band so the payloads never enter History; only the offset ranges are recorded there. """ - @property - def wakes( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.workflow.v1.message_pb2.Wake - ]: - """Wakes pending for this execution when the task started, folded by - source. Not recorded in History and never re-supplied on replay: the - Workflow treats one as a reason to read its source now and records what - it read itself. - """ def __init__( self, *, @@ -1455,8 +1443,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): temporalio.api.stream.v1.message_pb2.StreamSlice ] | None = ..., - wakes: collections.abc.Iterable[temporalio.api.workflow.v1.message_pb2.Wake] - | None = ..., ) -> None: ... def HasField( self, @@ -1518,8 +1504,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"stream_slices", "task_token", b"task_token", - "wakes", - b"wakes", "workflow_execution", b"workflow_execution", "workflow_execution_task_queue", @@ -3335,84 +3319,6 @@ class SignalWorkflowExecutionResponse(google.protobuf.message.Message): global___SignalWorkflowExecutionResponse = SignalWorkflowExecutionResponse -class WakeWorkflowExecutionRequest(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NAMESPACE_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - WAKE_FIELD_NUMBER: builtins.int - IDENTITY_FIELD_NUMBER: builtins.int - namespace: builtins.str - @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """The Workflow to wake. `run_id` is optional. When set, the wake goes to - the current run of the chain that run belongs to, so a sender that - learned a run id before a continue-as-new still reaches the consumer, - and it is refused with NotFound once that chain has ended. When unset, - the wake goes to the current run under the Workflow Id, whichever chain. - """ - @property - def wake(self) -> temporalio.api.workflow.v1.message_pb2.Wake: ... - identity: builtins.str - """The identity of the sender, for metrics and logs.""" - def __init__( - self, - *, - namespace: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., - wake: temporalio.api.workflow.v1.message_pb2.Wake | None = ..., - identity: builtins.str = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "wake", b"wake", "workflow_execution", b"workflow_execution" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "identity", - b"identity", - "namespace", - b"namespace", - "wake", - b"wake", - "workflow_execution", - b"workflow_execution", - ], - ) -> None: ... - -global___WakeWorkflowExecutionRequest = WakeWorkflowExecutionRequest - -class WakeWorkflowExecutionResponse(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - RUN_ID_FIELD_NUMBER: builtins.int - FOLDED_FIELD_NUMBER: builtins.int - run_id: builtins.str - """The run the wake was stored on.""" - folded: builtins.bool - """True when a wake for the source was already pending and no task had - received it yet, so this one changed nothing but possibly the position - and no new task results from it. - """ - def __init__( - self, - *, - run_id: builtins.str = ..., - folded: builtins.bool = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal["folded", b"folded", "run_id", b"run_id"], - ) -> None: ... - -global___WakeWorkflowExecutionResponse = WakeWorkflowExecutionResponse - class NotifyChannelRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -3420,6 +3326,7 @@ class NotifyChannelRequest(google.protobuf.message.Message): NOTIFICATION_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str @property def notification( @@ -3429,6 +3336,14 @@ class NotifyChannelRequest(google.protobuf.message.Message): """The identity of the writer, for metrics and logs.""" request_id: builtins.str """Used to de-dupe a retried notification.""" + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, @@ -3437,9 +3352,14 @@ class NotifyChannelRequest(google.protobuf.message.Message): | None = ..., identity: builtins.str = ..., request_id: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["notification", b"notification"] + self, + field_name: typing_extensions.Literal[ + "notification", b"notification", "workflow_execution", b"workflow_execution" + ], ) -> builtins.bool: ... def ClearField( self, @@ -3452,6 +3372,8 @@ class NotifyChannelRequest(google.protobuf.message.Message): b"notification", "request_id", b"request_id", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3484,6 +3406,7 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): CALLBACK_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str @property @@ -3493,6 +3416,14 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): """Used to de-dupe a retried registration.""" identity: builtins.str """The identity of the caller, for metrics and logs.""" + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, @@ -3501,9 +3432,14 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): callback: temporalio.api.common.v1.message_pb2.Callback | None = ..., request_id: builtins.str = ..., identity: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["callback", b"callback"] + self, + field_name: typing_extensions.Literal[ + "callback", b"callback", "workflow_execution", b"workflow_execution" + ], ) -> builtins.bool: ... def ClearField( self, @@ -3518,6 +3454,8 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): b"namespace", "request_id", b"request_id", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3546,11 +3484,20 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): CHANNEL_FIELD_NUMBER: builtins.int LISTENER_ID_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str listener_id: builtins.str identity: builtins.str """The identity of the caller, for metrics and logs.""" + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, @@ -3558,7 +3505,15 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): channel: builtins.str = ..., listener_id: builtins.str = ..., identity: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "workflow_execution", b"workflow_execution" + ], + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ @@ -3570,6 +3525,8 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): b"listener_id", "namespace", b"namespace", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3592,6 +3549,7 @@ class PollChannelRequest(google.protobuf.message.Message): AFTER_COUNTER_FIELD_NUMBER: builtins.int WAIT_FIELD_NUMBER: builtins.int MAX_NOTIFICATIONS_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str after_counter: builtins.int @@ -3608,6 +3566,14 @@ class PollChannelRequest(google.protobuf.message.Message): """At most this many notifications are returned. Zero means the server's default. """ + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, @@ -3616,9 +3582,14 @@ class PollChannelRequest(google.protobuf.message.Message): after_counter: builtins.int = ..., wait: google.protobuf.duration_pb2.Duration | None = ..., max_notifications: builtins.int = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["wait", b"wait"] + self, + field_name: typing_extensions.Literal[ + "wait", b"wait", "workflow_execution", b"workflow_execution" + ], ) -> builtins.bool: ... def ClearField( self, @@ -3633,6 +3604,8 @@ class PollChannelRequest(google.protobuf.message.Message): b"namespace", "wait", b"wait", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3667,18 +3640,40 @@ class DescribeChannelRequest(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int CHANNEL_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, namespace: builtins.str = ..., channel: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "workflow_execution", b"workflow_execution" + ], + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ - "channel", b"channel", "namespace", b"namespace" + "channel", + b"channel", + "namespace", + b"namespace", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3690,6 +3685,8 @@ class DescribeChannelResponse(google.protobuf.message.Message): LISTENERS_FIELD_NUMBER: builtins.int LATEST_FIELD_NUMBER: builtins.int RETAINED_COUNT_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + LINKED_TO_FIELD_NUMBER: builtins.int @property def listeners( self, @@ -3701,6 +3698,14 @@ class DescribeChannelResponse(google.protobuf.message.Message): """The notification with the highest counter the channel retains.""" retained_count: builtins.int """How many notifications the channel retains for pollers.""" + kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType + @property + def linked_to(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """The owner of a linked channel and the run that holds it. Empty for an + independent channel. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "to" names the owner the channel is linked to. --) + """ def __init__( self, *, @@ -3710,15 +3715,24 @@ class DescribeChannelResponse(google.protobuf.message.Message): | None = ..., latest: temporalio.api.notification.v1.message_pb2.Notification | None = ..., retained_count: builtins.int = ..., + kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType = ..., + linked_to: temporalio.api.common.v1.message_pb2.WorkflowExecution | None = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["latest", b"latest"] + self, + field_name: typing_extensions.Literal[ + "latest", b"latest", "linked_to", b"linked_to" + ], ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ + "kind", + b"kind", "latest", b"latest", + "linked_to", + b"linked_to", "listeners", b"listeners", "retained_count", diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index aec338a11..57e919ce9 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\x8e\xc0\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\x97\x02\n\rNotifyChannel\x12\x35.temporal.api.workflowservice.v1.NotifyChannelRequest\x1a\x36.temporal.api.workflowservice.v1.NotifyChannelResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*\x12\xa0\x02\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\x81\x01\x82\xd3\xe4\x93\x02{"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*\x12\xbd\x02\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\x98\x01\x82\xd3\xe4\x93\x02\x91\x01*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}\x12\xfe\x01\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notifications\x12\xed\x01\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xff\xc5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA"/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*Zn"i/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\x01*Zu"p/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\x01*\x12\xf4\x03\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\xd5\x02\x82\xd3\xe4\x93\x02\xce\x02"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*Zd"_/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\x01*Zk"f/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\x01*\x12\xa6\x04\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\x81\x03\x82\xd3\xe4\x93\x02\xfa\x02*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zo*m/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}Zv*t/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}\x12\xd4\x03\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\xd9\x02\x82\xd3\xe4\x93\x02\xd2\x02\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZe\x12\x63/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notificationsZl\x12j/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notifications\x12\xa8\x03\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"\xa1\x02\x82\xd3\xe4\x93\x02\x9a\x02\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}ZW\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}Z^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -135,30 +135,26 @@ _WORKFLOWSERVICE.methods_by_name[ "SignalWorkflowExecution" ]._serialized_options = b'\202\323\344\223\002\301\001"W/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}' - _WORKFLOWSERVICE.methods_by_name["WakeWorkflowExecution"]._options = None - _WORKFLOWSERVICE.methods_by_name[ - "WakeWorkflowExecution" - ]._serialized_options = b'\202\323\344\223\002\241\001"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*' _WORKFLOWSERVICE.methods_by_name["NotifyChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "NotifyChannel" - ]._serialized_options = b'\202\323\344\223\002\217\001">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*' + ]._serialized_options = b'\202\323\344\223\002\366\002">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*Zn"i/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\001*Zu"p/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\001*' _WORKFLOWSERVICE.methods_by_name["RegisterChannelListener"]._options = None _WORKFLOWSERVICE.methods_by_name[ "RegisterChannelListener" - ]._serialized_options = b'\202\323\344\223\002{"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*' + ]._serialized_options = b'\202\323\344\223\002\316\002"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*Zd"_/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\001*Zk"f/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\001*' _WORKFLOWSERVICE.methods_by_name["UnregisterChannelListener"]._options = None _WORKFLOWSERVICE.methods_by_name[ "UnregisterChannelListener" - ]._serialized_options = b"\202\323\344\223\002\221\001*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}" + ]._serialized_options = b"\202\323\344\223\002\372\002*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zo*m/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}Zv*t/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}" _WORKFLOWSERVICE.methods_by_name["PollChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "PollChannel" - ]._serialized_options = b"\202\323\344\223\002}\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notifications" + ]._serialized_options = b"\202\323\344\223\002\322\002\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZe\022c/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notificationsZl\022j/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notifications" _WORKFLOWSERVICE.methods_by_name["DescribeChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "DescribeChannel" - ]._serialized_options = b"\202\323\344\223\002a\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}" + ]._serialized_options = b"\202\323\344\223\002\232\002\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}ZW\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}Z^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}" _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -550,5 +546,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 41224 + _WORKFLOWSERVICE._serialized_end = 41977 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.py b/temporalio/api/workflowservice/v1/service_pb2_grpc.py index d58793174..f419463da 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.py +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.py @@ -143,11 +143,6 @@ def __init__(self, channel): request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.SerializeToString, response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.FromString, ) - self.WakeWorkflowExecution = channel.unary_unary( - "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", - request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, - response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, - ) self.NotifyChannel = channel.unary_unary( "/temporal.api.workflowservice.v1.WorkflowService/NotifyChannel", request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.SerializeToString, @@ -967,20 +962,6 @@ def SignalWorkflowExecution(self, request, context): context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") - def WakeWorkflowExecution(self, request, context): - """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow - Task because a source it consumes has moved. Unlike a Signal it records - no event, carries no payload, and folds with other wakes for the same - source, so a burst of writes costs one task. The Workflow learns the - source and its position from the task and reads the source itself. - - Superseded by the notification channel (`NotifyChannel` and the - `SubscribeNotificationChannel` command). Kept for one round and slated for removal. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - def NotifyChannel(self, request, context): """NotifyChannel tells every listener of a channel that a source they consume has moved. The writer names no addressee and never learns who listens. The @@ -2146,11 +2127,6 @@ def add_WorkflowServiceServicer_to_server(servicer, server): request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.FromString, response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.SerializeToString, ), - "WakeWorkflowExecution": grpc.unary_unary_rpc_method_handler( - servicer.WakeWorkflowExecution, - request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.FromString, - response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.SerializeToString, - ), "NotifyChannel": grpc.unary_unary_rpc_method_handler( servicer.NotifyChannel, request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.FromString, @@ -3365,35 +3341,6 @@ def SignalWorkflowExecution( metadata, ) - @staticmethod - def WakeWorkflowExecution( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", - temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, - temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) - @staticmethod def NotifyChannel( request, diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi index 3b7a96cf9..8a25f86a7 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi @@ -279,19 +279,6 @@ class WorkflowServiceStub: This results in a `WORKFLOW_EXECUTION_SIGNALED` event recorded in the history and a workflow task being created for the execution. """ - WakeWorkflowExecution: grpc.UnaryUnaryMultiCallable[ - temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, - temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse, - ] - """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow - Task because a source it consumes has moved. Unlike a Signal it records - no event, carries no payload, and folds with other wakes for the same - source, so a burst of writes costs one task. The Workflow learns the - source and its position from the task and reads the source itself. - - Superseded by the notification channel (`NotifyChannel` and the - `SubscribeNotificationChannel` command). Kept for one round and slated for removal. - """ NotifyChannel: grpc.UnaryUnaryMultiCallable[ temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelRequest, temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelResponse, @@ -1554,21 +1541,6 @@ class WorkflowServiceServicer(metaclass=abc.ABCMeta): task being created for the execution. """ @abc.abstractmethod - def WakeWorkflowExecution( - self, - request: temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, - context: grpc.ServicerContext, - ) -> temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse: - """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow - Task because a source it consumes has moved. Unlike a Signal it records - no event, carries no payload, and folds with other wakes for the same - source, so a burst of writes costs one task. The Workflow learns the - source and its position from the task and reads the source itself. - - Superseded by the notification channel (`NotifyChannel` and the - `SubscribeNotificationChannel` command). Kept for one round and slated for removal. - """ - @abc.abstractmethod def NotifyChannel( self, request: temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelRequest, diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 0a3e3a925..bdca403d9 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 0a3e3a92562b71e2416231d89c6e9db9a9afbf97 +Subproject commit bdca403d9777bb1d80c759ff1fe9b3b8c82590fd diff --git a/temporalio/bridge/services_generated.py b/temporalio/bridge/services_generated.py index 88e63e187..b8298fde7 100644 --- a/temporalio/bridge/services_generated.py +++ b/temporalio/bridge/services_generated.py @@ -2333,24 +2333,6 @@ async def validate_worker_deployment_version_compute_config( timeout=timeout, ) - async def wake_workflow_execution( - self, - req: temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest, - retry: bool = False, - metadata: Mapping[str, str | bytes] = {}, - timeout: timedelta | None = None, - ) -> temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse: - """Invokes the WorkflowService.wake_workflow_execution rpc method.""" - return await self._client._rpc_call( - rpc="wake_workflow_execution", - req=req, - service=self._service, - resp_type=temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse, - retry=retry, - metadata=metadata, - timeout=timeout, - ) - class OperatorService: """RPC calls for the OperatorService.""" diff --git a/temporalio/bridge/src/client_rpc_generated.rs b/temporalio/bridge/src/client_rpc_generated.rs index ecac84667..3d3c98018 100644 --- a/temporalio/bridge/src/client_rpc_generated.rs +++ b/temporalio/bridge/src/client_rpc_generated.rs @@ -1172,15 +1172,6 @@ impl ClientRef { validate_worker_deployment_version_compute_config ) } - "wake_workflow_execution" => { - rpc_call!( - connection, - call, - WorkflowService, - workflow_service, - wake_workflow_execution - ) - } _ => { return Err(PyValueError::new_err(format!( "Unknown RPC call {}", From 12fa935176e5261818af6861e0c4140dcb9dd314 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:07:52 -0700 Subject: [PATCH 780/831] Removed the point-to-point wake transport. --- .../external_workflow_streams/_backend.py | 4 +- .../external_workflow_streams/_wake.py | 124 +++----- temporalio/worker/_workflow.py | 2 +- .../external_workflow_streams/test_wake.py | 268 ++++++------------ .../test_worker_integration.py | 2 +- 5 files changed, 132 insertions(+), 268 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_backend.py b/temporalio/contrib/external_workflow_streams/_backend.py index 2a6ff5588..90f0be3e0 100644 --- a/temporalio/contrib/external_workflow_streams/_backend.py +++ b/temporalio/contrib/external_workflow_streams/_backend.py @@ -282,8 +282,8 @@ def compare_offsets(self, left: Offset, right: Offset) -> int: Held on the backend because it is the one object both the producer and the consuming Worker are configured with. A provider may set it per instance. - ``"auto"`` notifies the stream's channel, then falls back to the wake call - and the Signal on a server without it. + ``"auto"`` notifies the stream's channel and falls back to the Signal on a + server without channels. """ def wake_counter_for(self, offset: Offset) -> int: diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index 8bef9d88b..f402fdc61 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -3,10 +3,9 @@ The server-visible wakeup, used whenever no open Workflow Task can accept local readiness. It carries no stream payload. It goes out as a notification on the stream's channel when the server has channels, see :func:`send_wake` and -:func:`channel_for`, over the deprecated ``WakeWorkflowExecution`` call when it -has only that, and otherwise as the reserved Signal described below, which -carries only enough identity for Core to decide whether it is a wake, a stale -claim, or someone else's chain. +:func:`channel_for`, and otherwise as the reserved Signal described below, +which carries only enough identity for Core to decide whether it is a wake, a +stale claim, or someone else's chain. Two properties are load-bearing and neither is available from the public Signal API, which is why this path does not reuse it: @@ -38,7 +37,6 @@ import temporalio.api.common.v1 import temporalio.api.notification.v1 -import temporalio.api.workflow.v1 import temporalio.api.workflowservice.v1 import temporalio.service from temporalio.bridge.proto.external_stream.external_stream_pb2 import WakeSignal @@ -60,15 +58,15 @@ "wake_request_id", ] -WakeTransport = Literal["auto", "channel", "wake", "signal"] +WakeTransport = Literal["auto", "channel", "signal"] """How a wake reaches the server. -``"channel"`` notifies the stream's channel with ``NotifyChannel``. Every run -that subscribed to the channel is woken, and the only record is the -notification on the scheduled event of the Workflow Task it causes. ``"wake"`` -uses the deprecated ``WakeWorkflowExecution`` call, addressed to one chain. -``"signal"`` uses the reserved Signal. ``"auto"`` tries them in that order and -steps down on ``UNIMPLEMENTED``, remembering per client what the server lacks. +``"channel"`` notifies the stream's channel with ``NotifyChannel``. Every +listener of the channel is woken, and the only record is the notification on +the scheduled event of the Workflow Task it causes. ``"signal"`` uses the +reserved Signal. ``"auto"`` tries the channel first and steps down to the +Signal on ``UNIMPLEMENTED``, remembering per client that the server lacks +channels. """ CHANNEL_PREFIX = "external-stream" @@ -306,16 +304,13 @@ async def send_wake_signal( return signal_request.request_id -_TRANSPORT_ORDER: tuple[str, ...] = ("channel", "wake", "signal") +_TRANSPORT_ORDER: tuple[str, ...] = ("channel", "signal") """What ``"auto"`` tries, in order. -Each step is taken by every server that takes the one before it, so stepping -down never loses a wake, only the folding and the History the later transport -costs. +Every server takes the Signal, so stepping down never loses a wake, only the +folding the channel gives and the History event the Signal costs. """ -_CALL_NAMES = {"channel": "notify_channel", "wake": "wake_workflow_execution"} - _BEST_TRANSPORT: weakref.WeakKeyDictionary[Any, str] = weakref.WeakKeyDictionary() """Per service client, the first transport its server has not refused. @@ -421,46 +416,22 @@ def wake_position(backend: object, offset: Offset | None) -> tuple[bytes, int]: def wake_call_counter(request: WakeRequest) -> int: - """The counter the wake call carries for ``request``. - - The server folds a wake into one still pending for the same source when - its counter is not above the pending one, so the counter decides which - position the receiving task sees. The store's own order when it has one. - Otherwise the wall clock in nanoseconds, which keeps one sender's wakes - increasing but is not ordered across senders: a pending wake can then end - up reporting an older position than another sender's. That costs latency - only, because the task still reads from its own cursor and the watcher - reports whatever it finds. + """The counter the notification carries for ``request``. + + The server folds a notification into one still pending for the same + listener when its counter is not above the pending one, so the counter + decides which position the receiving task sees. The store's own order when + it has one. Otherwise the wall clock in nanoseconds, which keeps one + sender's wakes increasing but is not ordered across senders: a pending + notification can then end up reporting an older position than another + sender's. That costs latency only, because the task still reads from its + own cursor and the watcher reports whatever it finds. """ if request.position_counter > 0: return request.position_counter return time.time_ns() -def build_wake_request( - request: WakeRequest, *, identity: str -) -> temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest: - """The ``WakeWorkflowExecution`` request for one wake. - - ``run_id`` is the chain's first execution run, so the server follows the - chain to its current run and answers ``NOT_FOUND`` once the chain has - ended rather than waking a later chain that reused the Workflow ID. - """ - return temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest( - namespace=request.namespace, - workflow_execution=temporalio.api.common.v1.WorkflowExecution( - workflow_id=request.workflow_id, - run_id=request.first_execution_run_id, - ), - wake=temporalio.api.workflow.v1.Wake( - source=request.stream_name, - position=request.position, - counter=wake_call_counter(request), - ), - identity=identity, - ) - - def build_notify_request( request: WakeRequest, *, @@ -500,11 +471,7 @@ async def send_wake( transport: WakeTransport = "auto", metadata: Mapping[str, temporalio.api.common.v1.Payload] | None = None, ) -> str: - """Sends one wake over ``transport`` and returns an identifier for it. - - The channel and the Signal return the request ID the wake went out under. - The wake call has no request ID, since the server folds by counter - instead, so it returns the run the wake was stored on. + """Sends one wake over ``transport`` and returns the request ID it went under. ``"auto"`` starts at the best transport this client's server is known to take and steps down on ``UNIMPLEMENTED``, remembering the step. A channel @@ -513,7 +480,7 @@ async def send_wake( what closes the gap between a reader's last look at the store and its subscription taking effect. - A ``NOT_FOUND`` from the wake call propagates as the ``RPCError`` it is, + A ``NOT_FOUND`` from the channel propagates as the ``RPCError`` it is, which is what a Signal to an ended Workflow raises as well, so callers keep one meaning for "the chain is over". @@ -524,8 +491,8 @@ async def send_wake( Raises: temporalio.service.RPCError: The server refused the wake. With - ``"channel"`` or ``"wake"`` this includes ``UNIMPLEMENTED``, since - that transport was asked for explicitly. + ``"channel"`` this includes ``UNIMPLEMENTED``, since that + transport was asked for explicitly. """ # Checked against the alias rather than a literal tuple so an untyped caller # still gets a ValueError instead of a silent Signal. @@ -535,36 +502,33 @@ async def send_wake( if attempt == "channel" and not request.channel and transport == "auto": # Composed without its channel by a caller that predates it. Nothing # about the server follows from that, so nothing is remembered. - attempt = "wake" - while attempt != "signal": + attempt = "signal" + if attempt == "channel": service = getattr(client, "workflow_service", None) - call = getattr(service, _CALL_NAMES[attempt], None) + call = getattr(service, "notify_channel", None) if call is None: # An SDK build whose generated service lacks the call can no more - # send a wake than a server that lacks it can take one. + # send a notification than a server that lacks it can take one. if transport != "auto": raise RuntimeError( - f"the {attempt} transport was requested but this client has " - f"no {_CALL_NAMES[attempt]} call" + "the channel transport was requested but this client has " + "no notify_channel call" ) - attempt = _step_down(client, attempt) - continue - identity = client.service_client.config.identity - try: - if attempt == "channel": + _step_down(client, "channel") + else: + identity = client.service_client.config.identity + try: await call( build_notify_request(request, identity=identity, metadata=metadata) ) return wake_request_id(request) - response = await call(build_wake_request(request, identity=identity)) - return response.run_id - except temporalio.service.RPCError as err: - if ( - transport != "auto" - or err.status != temporalio.service.RPCStatusCode.UNIMPLEMENTED - ): - raise - attempt = _step_down(client, attempt) + except temporalio.service.RPCError as err: + if ( + transport != "auto" + or err.status != temporalio.service.RPCStatusCode.UNIMPLEMENTED + ): + raise + _step_down(client, "channel") return await send_wake_signal( client, request, producer_session_id=producer_session_id ) diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 8c372d858..476b6edbc 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -1501,7 +1501,7 @@ async def _decide_channel_subscriptions(self) -> None: decision is a lang flag the Run reads at construction. A probe that cannot tell leaves the question open for the next activation; the Runs built meanwhile do not subscribe, and their records still arrive by the - wake call or the Signal. + Signal. """ from temporalio.contrib.external_workflow_streams._wake import ( server_has_channels, diff --git a/tests/contrib/external_workflow_streams/test_wake.py b/tests/contrib/external_workflow_streams/test_wake.py index f32edf257..9b7763459 100644 --- a/tests/contrib/external_workflow_streams/test_wake.py +++ b/tests/contrib/external_workflow_streams/test_wake.py @@ -1830,105 +1830,80 @@ def _rpc_error(status: temporalio.service.RPCStatusCode) -> temporalio.service.R return temporalio.service.RPCError(status.name, status, b"") -class WakeServiceClient(RecordingClient): - """A client whose service answers the wake call, or refuses it with ``refuse``.""" +UNIMPLEMENTED = temporalio.service.RPCStatusCode.UNIMPLEMENTED +NOT_FOUND = temporalio.service.RPCStatusCode.NOT_FOUND +UNAVAILABLE = temporalio.service.RPCStatusCode.UNAVAILABLE - def __init__(self, refuse: temporalio.service.RPCStatusCode | None = None) -> None: + +class ChannelServiceClient(RecordingClient): + """A client whose service answers the channel calls, or refuses them.""" + + def __init__( + self, + refuse_channel: temporalio.service.RPCStatusCode | None = None, + listeners: int = 1, + describe: temporalio.service.RPCStatusCode | None = None, + ) -> None: super().__init__() - self.refuse = refuse - self.wakes: list = [] - - async def wake_workflow_execution(self, request): # type: ignore[no-untyped-def] - self.wakes.append(request) - if self.refuse is not None: - raise _rpc_error(self.refuse) - return temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse( - run_id="current-run" + self.refuse_channel = refuse_channel + self.listeners = listeners + self.describe_status = describe + self.notified: list = [] + self.described: list = [] + + async def notify_channel(self, request): # type: ignore[no-untyped-def] + self.notified.append(request) + if self.refuse_channel is not None: + raise _rpc_error(self.refuse_channel) + return temporalio.api.workflowservice.v1.NotifyChannelResponse( + listener_count=self.listeners ) + async def describe_channel(self, request): # type: ignore[no-untyped-def] + self.described.append(request) + if self.describe_status is not None: + raise _rpc_error(self.describe_status) + return temporalio.api.workflowservice.v1.DescribeChannelResponse() -@pytest.mark.asyncio -async def test_the_wake_call_names_the_chain_the_stream_and_its_position() -> None: - client = WakeServiceClient() - sent = await send_wake( - client, # type: ignore[arg-type] - request(position=b"1700000000000-3", position_counter=42), - transport="wake", - ) +TOKENS_CHANNEL = channel_for(CHAIN.stream_key("tokens")) - assert sent == "current-run" - assert client.sent == [] - [wake] = client.wakes - assert wake.namespace == "ns" - assert wake.workflow_execution.workflow_id == "wf-1" - # The first run, so the server follows the chain and refuses a later chain - # that reused the Workflow ID. - assert wake.workflow_execution.run_id == "first-run-1" - assert wake.wake.source == "tokens" - assert wake.wake.position == b"1700000000000-3" - assert wake.wake.counter == 42 - assert wake.identity == "producer-identity" + +def channel_request(**overrides) -> WakeRequest: # type: ignore[no-untyped-def] + return request(channel=TOKENS_CHANNEL, **overrides) @pytest.mark.asyncio async def test_an_unknown_counter_falls_back_to_the_clock() -> None: import time - client = WakeServiceClient() + client = ChannelServiceClient() before = time.time_ns() - await send_wake(client, request(), transport="wake") # type: ignore[arg-type] + await send_wake(client, channel_request(), transport="channel") # type: ignore[arg-type] after = time.time_ns() - assert before <= client.wakes[0].wake.counter <= after + assert before <= client.notified[0].notification.counter <= after @pytest.mark.asyncio -async def test_auto_falls_back_to_the_signal_once_and_remembers_the_client() -> None: - client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.UNIMPLEMENTED) +async def test_auto_steps_down_to_the_signal_once_and_remembers_the_client() -> None: + client = ChannelServiceClient(refuse_channel=UNIMPLEMENTED) - first = await send_wake(client, request()) # type: ignore[arg-type] - second = await send_wake(client, request()) # type: ignore[arg-type] + first = await send_wake(client, channel_request()) # type: ignore[arg-type] + second = await send_wake(client, channel_request()) # type: ignore[arg-type] - assert len(client.wakes) == 1, "the refusal was not remembered for the client" + assert len(client.notified) == 1, "the refusal was not remembered for the client" assert [signal.request_id for signal in client.sent] == [first, second] - assert first == wake_request_id(request()) - - -@pytest.mark.asyncio -async def test_the_remembered_fallback_is_per_client() -> None: - old = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.UNIMPLEMENTED) - new = WakeServiceClient() - - await send_wake(old, request()) # type: ignore[arg-type] - await send_wake(new, request()) # type: ignore[arg-type] - - assert len(new.wakes) == 1 - assert new.sent == [] - - -@pytest.mark.asyncio -async def test_the_wake_transport_propagates_unimplemented() -> None: - client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.UNIMPLEMENTED) - - with pytest.raises(temporalio.service.RPCError) as raised: - await send_wake(client, request(), transport="wake") # type: ignore[arg-type] - - assert raised.value.status == temporalio.service.RPCStatusCode.UNIMPLEMENTED - assert client.sent == [] - # Asked for explicitly, so nothing is learned from it either. - client.refuse = None - await send_wake(client, request()) # type: ignore[arg-type] - assert len(client.wakes) == 2 + assert first == wake_request_id(channel_request()) @pytest.mark.asyncio -async def test_the_signal_transport_never_tries_the_wake_call() -> None: - client = WakeServiceClient() +async def test_the_signal_transport_never_tries_the_channel() -> None: + client = ChannelServiceClient() - await send_wake(client, request(), transport="signal") # type: ignore[arg-type] + await send_wake(client, channel_request(), transport="signal") # type: ignore[arg-type] - assert client.wakes == [] + assert client.notified == [] assert len(client.sent) == 1 @@ -1939,12 +1914,12 @@ async def test_an_ended_chain_raises_what_a_signal_to_it_raises() -> None: Not a reason to fall back: a Signal addressed by Workflow ID could reach a later chain that reused the ID, which is the wake the server just refused. """ - client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.NOT_FOUND) + client = ChannelServiceClient(refuse_channel=NOT_FOUND) with pytest.raises(temporalio.service.RPCError) as raised: - await send_wake(client, request()) # type: ignore[arg-type] + await send_wake(client, channel_request()) # type: ignore[arg-type] - assert raised.value.status == temporalio.service.RPCStatusCode.NOT_FOUND + assert raised.value.status == NOT_FOUND assert client.sent == [] @@ -1953,7 +1928,7 @@ async def test_a_producer_reports_an_ended_chain_as_the_cause_of_its_wake_failur None ): backend = MemoryStreamBackend() - client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.NOT_FOUND) + client = ChannelServiceClient(refuse_channel=NOT_FOUND) topic = make_producer(backend, client).topic("tokens") with pytest.raises(WakeNotAcknowledgedError) as raised: @@ -1961,13 +1936,13 @@ async def test_a_producer_reports_an_ended_chain_as_the_cause_of_its_wake_failur cause = raised.value.__cause__ assert isinstance(cause, temporalio.service.RPCError) - assert cause.status == temporalio.service.RPCStatusCode.NOT_FOUND + assert cause.status == NOT_FOUND class CountingBackend(MemoryStreamBackend): - """Orders offsets the way the Redis provider does, and asks for the wake call.""" + """Orders offsets the way the Redis provider does, and asks for the channel.""" - wake_transport = "wake" + wake_transport = "channel" def wake_counter_for(self, offset: Offset) -> int: ms, seq = offset.token.split("-") @@ -1977,14 +1952,14 @@ def wake_counter_for(self, offset: Offset) -> int: @pytest.mark.asyncio async def test_a_producer_wakes_with_the_position_it_appended() -> None: backend = CountingBackend() - client = WakeServiceClient() + client = ChannelServiceClient() topic = make_producer(backend, client).topic("tokens") offset = await topic.publish("hello") - [wake] = client.wakes - assert wake.wake.position == offset.token.encode() - assert wake.wake.counter == backend.wake_counter_for(offset) + [notify] = client.notified + assert notify.notification.position == offset.token.encode() + assert notify.notification.counter == backend.wake_counter_for(offset) assert client.sent == [] @@ -1992,32 +1967,32 @@ async def test_a_producer_wakes_with_the_position_it_appended() -> None: async def test_a_bare_wake_after_a_batch_reports_where_the_batch_ended() -> None: """Without it the bare wake falls back to the clock and folds behind the store.""" backend = CountingBackend() - client = WakeServiceClient() + client = ChannelServiceClient() topic = make_producer(backend, client).topic("tokens") await topic.publish("a", wake=False) last = await topic.publish("b", wake=False) await topic.wake() - [wake] = client.wakes - assert wake.wake.position == last.token.encode() - assert wake.wake.counter == backend.wake_counter_for(last) + [notify] = client.notified + assert notify.notification.position == last.token.encode() + assert notify.notification.counter == backend.wake_counter_for(last) @pytest.mark.asyncio async def test_a_retried_wake_carries_its_original_position() -> None: backend = CountingBackend() - client = WakeServiceClient(refuse=temporalio.service.RPCStatusCode.UNAVAILABLE) + client = ChannelServiceClient(refuse_channel=UNAVAILABLE) topic = make_producer(backend, client).topic("tokens") with pytest.raises(WakeNotAcknowledgedError) as raised: await topic.publish("hello") - client.refuse = None + client.refuse_channel = None await topic.retry_wake(raised.value.pending) - first, retried = client.wakes - assert retried.wake.position == first.wake.position - assert retried.wake.counter == first.wake.counter + first, retried = client.notified + assert retried.notification.position == first.notification.position + assert retried.notification.counter == first.notification.counter class _ReadSubscription(_StubSubscription): @@ -2034,77 +2009,34 @@ async def current_park_generation(self, stream_key, wait_id): # type: ignore[no return None backend = _Backend() - client = WakeServiceClient() + client = ChannelServiceClient() worker = _worker_sending_wakes("client") worker._client = client read = Offset("1700000000000-5") await worker._send_external_stream_wake(_ReadSubscription(backend, AFTER(read))) - [wake] = client.wakes - assert wake.wake.position == read.token.encode() - assert wake.wake.counter == backend.wake_counter_for(read) + [notify] = client.notified + assert notify.notification.position == read.token.encode() + assert notify.notification.counter == backend.wake_counter_for(read) @pytest.mark.asyncio async def test_a_wake_reports_a_position_appended_outside_the_producer() -> None: backend = CountingBackend() - client = WakeServiceClient() + client = ChannelServiceClient() topic = make_producer(backend, client).topic("tokens") outside = Offset("1700000000000-9") await topic.wake(position=outside) - [wake] = client.wakes - assert wake.wake.position == outside.token.encode() - assert wake.wake.counter == backend.wake_counter_for(outside) + [notify] = client.notified + assert notify.notification.position == outside.token.encode() + assert notify.notification.counter == backend.wake_counter_for(outside) # --- the notification channel ------------------------------------------------- -UNIMPLEMENTED = temporalio.service.RPCStatusCode.UNIMPLEMENTED -NOT_FOUND = temporalio.service.RPCStatusCode.NOT_FOUND -UNAVAILABLE = temporalio.service.RPCStatusCode.UNAVAILABLE - - -class ChannelServiceClient(WakeServiceClient): - """A client whose service answers the channel calls, or refuses them.""" - - def __init__( - self, - refuse_channel: temporalio.service.RPCStatusCode | None = None, - refuse_wake: temporalio.service.RPCStatusCode | None = None, - listeners: int = 1, - describe: temporalio.service.RPCStatusCode | None = None, - ) -> None: - super().__init__(refuse=refuse_wake) - self.refuse_channel = refuse_channel - self.listeners = listeners - self.describe_status = describe - self.notified: list = [] - self.described: list = [] - - async def notify_channel(self, request): # type: ignore[no-untyped-def] - self.notified.append(request) - if self.refuse_channel is not None: - raise _rpc_error(self.refuse_channel) - return temporalio.api.workflowservice.v1.NotifyChannelResponse( - listener_count=self.listeners - ) - - async def describe_channel(self, request): # type: ignore[no-untyped-def] - self.described.append(request) - if self.describe_status is not None: - raise _rpc_error(self.describe_status) - return temporalio.api.workflowservice.v1.DescribeChannelResponse() - - -TOKENS_CHANNEL = channel_for(CHAIN.stream_key("tokens")) - - -def channel_request(**overrides) -> WakeRequest: # type: ignore[no-untyped-def] - return request(channel=TOKENS_CHANNEL, **overrides) - def test_the_channel_is_the_stream_identity_without_the_namespace() -> None: key = StreamKey("ns", "wf-1", "first-run-1", "tokens") @@ -2153,7 +2085,6 @@ async def test_auto_notifies_the_channel_before_anything_else() -> None: ) assert sent == wake_request_id(channel_request()) - assert client.wakes == [] assert client.sent == [] [notify] = client.notified assert notify.namespace == "ns" @@ -2173,37 +2104,9 @@ async def test_a_channel_with_no_listeners_is_not_a_reason_to_step_down() -> Non await send_wake(client, channel_request()) # type: ignore[arg-type] assert len(client.notified) == 2 - assert client.wakes == [] - assert client.sent == [] - - -@pytest.mark.asyncio -async def test_auto_steps_down_to_the_wake_call_and_remembers_it() -> None: - client = ChannelServiceClient(refuse_channel=UNIMPLEMENTED) - - first = await send_wake(client, channel_request()) # type: ignore[arg-type] - second = await send_wake(client, channel_request()) # type: ignore[arg-type] - - assert first == second == "current-run" - assert len(client.notified) == 1, "the refusal was not remembered for the client" - assert len(client.wakes) == 2 assert client.sent == [] -@pytest.mark.asyncio -async def test_auto_steps_down_twice_to_the_signal() -> None: - client = ChannelServiceClient( - refuse_channel=UNIMPLEMENTED, refuse_wake=UNIMPLEMENTED - ) - - await send_wake(client, channel_request()) # type: ignore[arg-type] - await send_wake(client, channel_request()) # type: ignore[arg-type] - - assert len(client.notified) == 1 - assert len(client.wakes) == 1 - assert len(client.sent) == 2 - - @pytest.mark.asyncio async def test_the_step_down_is_remembered_per_client() -> None: old = ChannelServiceClient(refuse_channel=UNIMPLEMENTED) @@ -2213,7 +2116,7 @@ async def test_the_step_down_is_remembered_per_client() -> None: await send_wake(new, channel_request()) # type: ignore[arg-type] assert len(new.notified) == 1 - assert new.wakes == [] + assert new.sent == [] @pytest.mark.asyncio @@ -2224,13 +2127,12 @@ async def test_the_channel_transport_propagates_unimplemented() -> None: await send_wake(client, channel_request(), transport="channel") # type: ignore[arg-type] assert raised.value.status == UNIMPLEMENTED - assert client.wakes == [] assert client.sent == [] # Asked for explicitly, so nothing is learned from it either. client.refuse_channel = None await send_wake(client, channel_request()) # type: ignore[arg-type] assert len(client.notified) == 2 - assert client.wakes == [] + assert client.sent == [] @pytest.mark.asyncio @@ -2240,25 +2142,24 @@ async def test_the_channel_transport_needs_a_channel() -> None: with pytest.raises(ValueError, match="channel"): await send_wake(client, request(), transport="channel") # type: ignore[arg-type] - # Under "auto" a request without a channel wakes by chain and learns nothing. + # Under "auto" a request without a channel goes by Signal and learns nothing. await send_wake(client, request()) # type: ignore[arg-type] assert client.notified == [] - assert len(client.wakes) == 1 + assert len(client.sent) == 1 await send_wake(client, channel_request()) # type: ignore[arg-type] assert len(client.notified) == 1 @pytest.mark.asyncio async def test_a_client_without_the_notify_call_steps_down_under_auto() -> None: - client = WakeServiceClient() + client = RecordingClient() await send_wake(client, channel_request()) # type: ignore[arg-type] - assert len(client.wakes) == 1 - assert client.sent == [] + assert len(client.sent) == 1 with pytest.raises(RuntimeError, match="notify_channel"): await send_wake( - WakeServiceClient(), # type: ignore[arg-type] + RecordingClient(), # type: ignore[arg-type] channel_request(), transport="channel", ) @@ -2286,7 +2187,7 @@ async def test_the_probe_remembers_a_server_without_channels() -> None: await send_wake(client, channel_request()) # type: ignore[arg-type] assert client.notified == [], "the probe's answer was not shared with the writers" - assert len(client.wakes) == 1 + assert len(client.sent) == 1 assert await server_has_channels(client) is False # type: ignore[arg-type] assert len(client.described) == 1, "a remembered answer was asked for again" @@ -2300,7 +2201,7 @@ async def test_the_probe_leaves_an_unanswered_question_open() -> None: client.describe_status = None assert await server_has_channels(client) is True # type: ignore[arg-type] # A client whose service lacks the call has the answer in its shape. - assert await server_has_channels(WakeServiceClient()) is False # type: ignore[arg-type] + assert await server_has_channels(RecordingClient()) is False # type: ignore[arg-type] @pytest.mark.asyncio @@ -2313,7 +2214,6 @@ async def test_a_producer_notifies_the_channel_of_the_stream_it_appended_to() -> [notify] = client.notified assert notify.notification.channel == channel_for(topic.stream_key) - assert client.wakes == [] assert client.sent == [] diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index f0788d4a0..2cc4d2a09 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -490,7 +490,7 @@ async def test_an_append_with_no_open_task_wakes_the_workflow( reliable rather than incidental. """ # The Signal is the mechanism under test, so it is asked for outright: on - # a server with channels or the wake call, "auto" would leave no Signal. + # a server with channels, "auto" would leave no Signal. backend.wake_transport = "signal" task_queue = f"tq-{uuid.uuid4()}" async with Worker( From b4a4216553f48a6d7d153617242022fac3ce12db Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:11:55 -0700 Subject: [PATCH 781/831] Pinned Core without the wake and with the linked channel contract. --- temporalio/api/notification/v1/__init__.py | 3 +- temporalio/api/notification/v1/message_pb2.py | 25 +- .../api/notification/v1/message_pb2.pyi | 52 +- temporalio/api/workflow/v1/__init__.py | 2 - temporalio/api/workflow/v1/message_pb2.py | 16 +- temporalio/api/workflow/v1/message_pb2.pyi | 53 - temporalio/api/workflowservice/v1/__init__.py | 4 - .../v1/request_response_pb2.py | 1120 ++++++++--------- .../v1/request_response_pb2.pyi | 212 ++-- .../api/workflowservice/v1/service_pb2.py | 18 +- .../workflowservice/v1/service_pb2_grpc.py | 53 - .../workflowservice/v1/service_pb2_grpc.pyi | 28 - temporalio/bridge/sdk-core | 2 +- temporalio/bridge/services_generated.py | 18 - temporalio/bridge/src/client_rpc_generated.rs | 9 - 15 files changed, 736 insertions(+), 879 deletions(-) diff --git a/temporalio/api/notification/v1/__init__.py b/temporalio/api/notification/v1/__init__.py index bc7da47f6..5814ff02e 100644 --- a/temporalio/api/notification/v1/__init__.py +++ b/temporalio/api/notification/v1/__init__.py @@ -1,6 +1,7 @@ -from .message_pb2 import ChannelListener, Notification, WorkflowListener +from .message_pb2 import ChannelKind, ChannelListener, Notification, WorkflowListener __all__ = [ + "ChannelKind", "ChannelListener", "Notification", "WorkflowListener", diff --git a/temporalio/api/notification/v1/message_pb2.py b/temporalio/api/notification/v1/message_pb2.py index d18373de8..ad5245d17 100644 --- a/temporalio/api/notification/v1/message_pb2.py +++ b/temporalio/api/notification/v1/message_pb2.py @@ -8,6 +8,7 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper # @@protoc_insertion_point(imports) @@ -21,9 +22,15 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\xe0\x01\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\tB\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' + b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x9e\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' ) +_CHANNELKIND = DESCRIPTOR.enum_types_by_name["ChannelKind"] +ChannelKind = enum_type_wrapper.EnumTypeWrapper(_CHANNELKIND) +CHANNEL_KIND_UNSPECIFIED = 0 +CHANNEL_KIND_INDEPENDENT = 1 +CHANNEL_KIND_LINKED = 2 + _NOTIFICATION = DESCRIPTOR.message_types_by_name["Notification"] _NOTIFICATION_METADATAENTRY = _NOTIFICATION.nested_types_by_name["MetadataEntry"] @@ -77,12 +84,14 @@ DESCRIPTOR._serialized_options = b"\n\037io.temporal.api.notification.v1B\014MessageProtoP\001Z/go.temporal.io/api/notification/v1;notification\252\002\036Temporalio.Api.Notification.V1\352\002!Temporalio::Api::Notification::V1" _NOTIFICATION_METADATAENTRY._options = None _NOTIFICATION_METADATAENTRY._serialized_options = b"8\001" + _CHANNELKIND._serialized_start = 721 + _CHANNELKIND._serialized_end = 819 _NOTIFICATION._serialized_start = 148 - _NOTIFICATION._serialized_end = 372 - _NOTIFICATION_METADATAENTRY._serialized_start = 292 - _NOTIFICATION_METADATAENTRY._serialized_end = 372 - _CHANNELLISTENER._serialized_start = 375 - _CHANNELLISTENER._serialized_end = 600 - _WORKFLOWLISTENER._serialized_start = 602 - _WORKFLOWLISTENER._serialized_end = 657 + _NOTIFICATION._serialized_end = 434 + _NOTIFICATION_METADATAENTRY._serialized_start = 354 + _NOTIFICATION_METADATAENTRY._serialized_end = 434 + _CHANNELLISTENER._serialized_start = 437 + _CHANNELLISTENER._serialized_end = 662 + _WORKFLOWLISTENER._serialized_start = 664 + _WORKFLOWLISTENER._serialized_end = 719 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/notification/v1/message_pb2.pyi b/temporalio/api/notification/v1/message_pb2.pyi index 55dd27655..400969f66 100644 --- a/temporalio/api/notification/v1/message_pb2.pyi +++ b/temporalio/api/notification/v1/message_pb2.pyi @@ -6,21 +6,56 @@ isort:skip_file import builtins import collections.abc import sys +import typing import google.protobuf.descriptor import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper import google.protobuf.message import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 -if sys.version_info >= (3, 8): +if sys.version_info >= (3, 10): import typing as typing_extensions else: import typing_extensions DESCRIPTOR: google.protobuf.descriptor.FileDescriptor +class _ChannelKind: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _ChannelKindEnumTypeWrapper( + google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ChannelKind.ValueType], + builtins.type, +): # noqa: F821 + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + CHANNEL_KIND_UNSPECIFIED: _ChannelKind.ValueType # 0 + CHANNEL_KIND_INDEPENDENT: _ChannelKind.ValueType # 1 + """Its own execution, keyed by namespace and channel name. Any number of + workflows and callbacks listen to it. + """ + CHANNEL_KIND_LINKED: _ChannelKind.ValueType # 2 + """Kept in one workflow's state, keyed by namespace, workflow id and + channel name. The owning workflow is its listener by construction. + """ + +class ChannelKind(_ChannelKind, metaclass=_ChannelKindEnumTypeWrapper): + """Where a channel lives, which decides how a call addresses it.""" + +CHANNEL_KIND_UNSPECIFIED: ChannelKind.ValueType # 0 +CHANNEL_KIND_INDEPENDENT: ChannelKind.ValueType # 1 +"""Its own execution, keyed by namespace and channel name. Any number of +workflows and callbacks listen to it. +""" +CHANNEL_KIND_LINKED: ChannelKind.ValueType # 2 +"""Kept in one workflow's state, keyed by namespace, workflow id and +channel name. The owning workflow is its listener by construction. +""" +global___ChannelKind = ChannelKind + class Notification(google.protobuf.message.Message): """A notification tells the listeners of a channel that a source they consume has moved. It is not data: the listener reads the source itself. A channel @@ -58,6 +93,7 @@ class Notification(google.protobuf.message.Message): POSITION_FIELD_NUMBER: builtins.int COUNTER_FIELD_NUMBER: builtins.int METADATA_FIELD_NUMBER: builtins.int + LINKED_TO_FIELD_NUMBER: builtins.int channel: builtins.str """The channel the writer notified. Listeners register on the same name.""" position: builtins.bytes @@ -78,6 +114,14 @@ class Notification(google.protobuf.message.Message): """Details for the listener, such as which topic moved. Bounded in size and carried as payloads, so a codec applies as to any payload. """ + @property + def linked_to(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """Set for a channel linked to a workflow: the owner and the run that + received the notification. Empty for an independent channel. A listener + that holds both kinds routes the notification by it. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "to" names the owner the channel is linked to. --) + """ def __init__( self, *, @@ -88,7 +132,11 @@ class Notification(google.protobuf.message.Message): builtins.str, temporalio.api.common.v1.message_pb2.Payload ] | None = ..., + linked_to: temporalio.api.common.v1.message_pb2.WorkflowExecution | None = ..., ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["linked_to", b"linked_to"] + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ @@ -96,6 +144,8 @@ class Notification(google.protobuf.message.Message): b"channel", "counter", b"counter", + "linked_to", + b"linked_to", "metadata", b"metadata", "position", diff --git a/temporalio/api/workflow/v1/__init__.py b/temporalio/api/workflow/v1/__init__.py index 7f51920fe..ae647ab67 100644 --- a/temporalio/api/workflow/v1/__init__.py +++ b/temporalio/api/workflow/v1/__init__.py @@ -14,7 +14,6 @@ ResetPointInfo, ResetPoints, VersioningOverride, - Wake, WorkflowExecutionConfig, WorkflowExecutionExtendedInfo, WorkflowExecutionInfo, @@ -39,7 +38,6 @@ "ResetPointInfo", "ResetPoints", "VersioningOverride", - "Wake", "WorkflowExecutionConfig", "WorkflowExecutionExtendedInfo", "WorkflowExecutionInfo", diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index ae06653d6..032f2b2b5 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\t"9\n\x04Wake\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x42\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -114,7 +114,6 @@ _WORKFLOWEXECUTIONPAUSEINFO = DESCRIPTOR.message_types_by_name[ "WorkflowExecutionPauseInfo" ] -_WAKE = DESCRIPTOR.message_types_by_name["Wake"] _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR = _VERSIONINGOVERRIDE.enum_types_by_name[ "PinnedOverrideBehavior" ] @@ -459,17 +458,6 @@ ) _sym_db.RegisterMessage(WorkflowExecutionPauseInfo) -Wake = _reflection.GeneratedProtocolMessageType( - "Wake", - (_message.Message,), - { - "DESCRIPTOR": _WAKE, - "__module__": "temporalio.api.workflow.v1.message_pb2", - # @@protoc_insertion_point(class_scope:temporal.api.workflow.v1.Wake) - }, -) -_sym_db.RegisterMessage(Wake) - if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\033io.temporal.api.workflow.v1B\014MessageProtoP\001Z'go.temporal.io/api/workflow/v1;workflow\252\002\032Temporalio.Api.Workflow.V1\352\002\035Temporalio::Api::Workflow::V1" @@ -611,6 +599,4 @@ _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10778 _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10791 _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10902 - _WAKE._serialized_start = 10904 - _WAKE._serialized_end = 10961 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index 78586c70d..b390d94f4 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -2428,56 +2428,3 @@ class WorkflowExecutionPauseInfo(google.protobuf.message.Message): ) -> None: ... global___WorkflowExecutionPauseInfo = WorkflowExecutionPauseInfo - -class Wake(google.protobuf.message.Message): - """A wake tells a running Workflow Execution that something it consumes has - moved, so it should run a Workflow Task and read from its own cursor. It is - a reason to run, not data: nothing is recorded in History and no record - travels with it. A store Temporal does not host sends one after the store - has acknowledged a write. Wakes for the same source fold while one is - pending and no task has received it yet, so a burst of writes costs one - task. Once a task has been handed the wake, a new wake for the source is - accepted again, because only the receiver knows what it read. - - Superseded by the notification channel (`NotifyChannel` and the - `SubscribeNotificationChannel` command). Kept for one round and slated for - removal. - """ - - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - SOURCE_FIELD_NUMBER: builtins.int - POSITION_FIELD_NUMBER: builtins.int - COUNTER_FIELD_NUMBER: builtins.int - source: builtins.str - """What moved, as the sender names it. The server folds wakes by this value - and never interprets it. For a stream, the provider formats the stream's - identity, owner and topic, into it. - """ - position: builtins.bytes - """Where the source stands after the write that caused this wake, in the - store's own terms. Opaque to the server and handed to the Workflow as - received. Among wakes folded together, the position with the highest - counter is the one delivered. - """ - counter: builtins.int - """Orders wakes from one source, so that folding keeps the latest position. - Only the source's store can order its positions, so the sender derives - this from the position. It is not a durable identity: a wake sent after - a task received an equal counter is accepted again. - """ - def __init__( - self, - *, - source: builtins.str = ..., - position: builtins.bytes = ..., - counter: builtins.int = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "counter", b"counter", "position", b"position", "source", b"source" - ], - ) -> None: ... - -global___Wake = Wake diff --git a/temporalio/api/workflowservice/v1/__init__.py b/temporalio/api/workflowservice/v1/__init__.py index 5f95a044c..2ab6533c8 100644 --- a/temporalio/api/workflowservice/v1/__init__.py +++ b/temporalio/api/workflowservice/v1/__init__.py @@ -255,8 +255,6 @@ UpdateWorkflowExecutionResponse, ValidateWorkerDeploymentVersionComputeConfigRequest, ValidateWorkerDeploymentVersionComputeConfigResponse, - WakeWorkflowExecutionRequest, - WakeWorkflowExecutionResponse, ) __all__ = [ @@ -516,8 +514,6 @@ "UpdateWorkflowExecutionResponse", "ValidateWorkerDeploymentVersionComputeConfigRequest", "ValidateWorkerDeploymentVersionComputeConfigResponse", - "WakeWorkflowExecutionRequest", - "WakeWorkflowExecutionResponse", ] # gRPC is optional diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index a2a505cfe..9804b7923 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\xaa\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x12-\n\x05wakes\x18\x15 \x03(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xb8\x01\n\x1cWakeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12,\n\x04wake\x18\x03 \x01(\x0b\x32\x1e.temporal.api.workflow.v1.Wake\x12\x10\n\x08identity\x18\x04 \x01(\t"?\n\x1dWakeWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0e\n\x06\x66olded\x18\x02 \x01(\x08"\x91\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\x9e\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"m\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"#\n!UnregisterChannelListenerResponse"\x93\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"<\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\xaf\x01\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -273,12 +273,6 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ "SignalWorkflowExecutionResponse" ] -_WAKEWORKFLOWEXECUTIONREQUEST = DESCRIPTOR.message_types_by_name[ - "WakeWorkflowExecutionRequest" -] -_WAKEWORKFLOWEXECUTIONRESPONSE = DESCRIPTOR.message_types_by_name[ - "WakeWorkflowExecutionResponse" -] _NOTIFYCHANNELREQUEST = DESCRIPTOR.message_types_by_name["NotifyChannelRequest"] _NOTIFYCHANNELRESPONSE = DESCRIPTOR.message_types_by_name["NotifyChannelResponse"] _REGISTERCHANNELLISTENERREQUEST = DESCRIPTOR.message_types_by_name[ @@ -1465,28 +1459,6 @@ ) _sym_db.RegisterMessage(SignalWorkflowExecutionResponse) -WakeWorkflowExecutionRequest = _reflection.GeneratedProtocolMessageType( - "WakeWorkflowExecutionRequest", - (_message.Message,), - { - "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONREQUEST, - "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", - # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionRequest) - }, -) -_sym_db.RegisterMessage(WakeWorkflowExecutionRequest) - -WakeWorkflowExecutionResponse = _reflection.GeneratedProtocolMessageType( - "WakeWorkflowExecutionResponse", - (_message.Message,), - { - "DESCRIPTOR": _WAKEWORKFLOWEXECUTIONRESPONSE, - "__module__": "temporalio.api.workflowservice.v1.request_response_pb2", - # @@protoc_insertion_point(class_scope:temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse) - }, -) -_sym_db.RegisterMessage(WakeWorkflowExecutionResponse) - NotifyChannelRequest = _reflection.GeneratedProtocolMessageType( "NotifyChannelRequest", (_message.Message,), @@ -4413,565 +4385,561 @@ _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8364 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8280 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8364 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8367 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9705 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9539 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9634 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9636 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9705 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9708 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9953 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9956 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10481 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10483 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10518 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10521 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11007 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11010 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12191 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12194 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12359 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12361 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12473 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12476 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12683 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12685 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12801 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12804 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13186 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13188 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13226 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13229 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13436 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13438 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13480 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13483 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13929 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13931 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14018 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14021 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14292 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14294 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14385 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14388 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14770 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14772 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14809 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14812 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15100 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15102 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15143 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15146 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15406 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15408 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15448 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15451 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15801 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15803 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15880 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_start = 15883 - _WAKEWORKFLOWEXECUTIONREQUEST._serialized_end = 16067 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_start = 16069 - _WAKEWORKFLOWEXECUTIONRESPONSE._serialized_end = 16132 - _NOTIFYCHANNELREQUEST._serialized_start = 16135 - _NOTIFYCHANNELREQUEST._serialized_end = 16280 - _NOTIFYCHANNELRESPONSE._serialized_start = 16282 - _NOTIFYCHANNELRESPONSE._serialized_end = 16329 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16332 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16490 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16492 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16546 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16548 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16657 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16659 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16694 - _POLLCHANNELREQUEST._serialized_start = 16697 - _POLLCHANNELREQUEST._serialized_end = 16844 - _POLLCHANNELRESPONSE._serialized_start = 16846 - _POLLCHANNELRESPONSE._serialized_end = 16934 - _DESCRIBECHANNELREQUEST._serialized_start = 16936 - _DESCRIBECHANNELREQUEST._serialized_end = 16996 - _DESCRIBECHANNELRESPONSE._serialized_start = 16999 - _DESCRIBECHANNELRESPONSE._serialized_end = 17174 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17177 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18516 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18519 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18677 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18680 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19129 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19131 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19179 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19182 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19469 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19471 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19507 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19509 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19631 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19633 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19666 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19669 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 19998 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20001 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20131 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20134 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20528 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20531 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20663 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20665 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20774 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20776 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20902 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20904 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21021 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21024 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21158 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21160 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21269 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21271 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21397 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21399 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21465 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21468 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21705 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21707 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21735 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21738 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 21939 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 21855 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 21939 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 21942 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22303 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22305 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22340 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22342 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22452 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22454 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22484 - _SHUTDOWNWORKERREQUEST._serialized_start = 22487 - _SHUTDOWNWORKERREQUEST._serialized_end = 22770 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22772 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22796 - _QUERYWORKFLOWREQUEST._serialized_start = 22799 - _QUERYWORKFLOWREQUEST._serialized_end = 23032 - _QUERYWORKFLOWRESPONSE._serialized_start = 23035 - _QUERYWORKFLOWRESPONSE._serialized_end = 23220 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23222 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23337 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23340 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24005 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24008 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24536 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24539 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25543 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25325 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25441 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25443 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25543 - _GETCLUSTERINFOREQUEST._serialized_start = 25545 - _GETCLUSTERINFOREQUEST._serialized_end = 25568 - _GETCLUSTERINFORESPONSE._serialized_start = 25571 - _GETCLUSTERINFORESPONSE._serialized_end = 26036 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 25981 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26036 - _GETSYSTEMINFOREQUEST._serialized_start = 26038 - _GETSYSTEMINFOREQUEST._serialized_end = 26060 - _GETSYSTEMINFORESPONSE._serialized_start = 26063 - _GETSYSTEMINFORESPONSE._serialized_end = 26640 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26204 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26640 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26642 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26751 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26754 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 26977 - _CREATESCHEDULEREQUEST._serialized_start = 26980 - _CREATESCHEDULEREQUEST._serialized_end = 27312 - _CREATESCHEDULERESPONSE._serialized_start = 27314 - _CREATESCHEDULERESPONSE._serialized_end = 27362 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27364 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27429 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27432 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27703 - _UPDATESCHEDULEREQUEST._serialized_start = 27706 - _UPDATESCHEDULEREQUEST._serialized_end = 27998 - _UPDATESCHEDULERESPONSE._serialized_start = 28000 - _UPDATESCHEDULERESPONSE._serialized_end = 28024 - _PATCHSCHEDULEREQUEST._serialized_start = 28027 - _PATCHSCHEDULEREQUEST._serialized_end = 28183 - _PATCHSCHEDULERESPONSE._serialized_start = 28185 - _PATCHSCHEDULERESPONSE._serialized_end = 28208 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28211 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28379 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28381 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28464 - _DELETESCHEDULEREQUEST._serialized_start = 28466 - _DELETESCHEDULEREQUEST._serialized_end = 28547 - _DELETESCHEDULERESPONSE._serialized_start = 28549 - _DELETESCHEDULERESPONSE._serialized_end = 28573 - _LISTSCHEDULESREQUEST._serialized_start = 28575 - _LISTSCHEDULESREQUEST._serialized_end = 28683 - _LISTSCHEDULESRESPONSE._serialized_start = 28685 - _LISTSCHEDULESRESPONSE._serialized_end = 28797 - _COUNTSCHEDULESREQUEST._serialized_start = 28799 - _COUNTSCHEDULESREQUEST._serialized_end = 28856 - _COUNTSCHEDULESRESPONSE._serialized_start = 28859 - _COUNTSCHEDULESRESPONSE._serialized_end = 29078 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29081 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29727 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29528 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8323 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8233 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8317 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8326 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9664 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9498 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9593 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9595 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9664 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9667 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9912 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9915 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10440 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10442 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10477 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10480 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10966 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10969 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12150 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12153 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12318 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12320 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12432 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12435 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12642 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12644 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12760 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12763 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13145 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13147 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13185 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13188 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13395 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13397 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13439 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13442 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13888 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13890 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13977 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13980 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14251 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14253 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14344 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14347 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14729 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14731 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14768 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14771 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15059 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15061 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15102 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15105 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15365 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15367 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15407 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15410 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15760 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 + _NOTIFYCHANNELREQUEST._serialized_start = 15842 + _NOTIFYCHANNELREQUEST._serialized_end = 16058 + _NOTIFYCHANNELRESPONSE._serialized_start = 16060 + _NOTIFYCHANNELRESPONSE._serialized_end = 16107 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16110 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16339 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16341 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16395 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16398 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16578 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16580 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16615 + _POLLCHANNELREQUEST._serialized_start = 16618 + _POLLCHANNELREQUEST._serialized_end = 16836 + _POLLCHANNELRESPONSE._serialized_start = 16838 + _POLLCHANNELRESPONSE._serialized_end = 16926 + _DESCRIBECHANNELREQUEST._serialized_start = 16929 + _DESCRIBECHANNELREQUEST._serialized_end = 17060 + _DESCRIBECHANNELRESPONSE._serialized_start = 17063 + _DESCRIBECHANNELRESPONSE._serialized_end = 17357 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17360 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18699 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18702 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18860 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18863 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19312 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19314 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19362 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19365 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19652 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19654 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19690 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19692 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19814 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19816 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19849 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19852 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20181 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20184 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20314 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20317 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20711 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20714 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20846 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20848 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20957 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20959 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21085 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21087 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21204 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21207 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21341 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21343 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21452 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21454 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21580 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21582 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21648 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21651 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21888 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21890 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21918 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21921 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22122 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22038 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22122 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22125 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22486 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22488 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22523 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22525 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22635 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22637 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22667 + _SHUTDOWNWORKERREQUEST._serialized_start = 22670 + _SHUTDOWNWORKERREQUEST._serialized_end = 22953 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22955 + _SHUTDOWNWORKERRESPONSE._serialized_end = 22979 + _QUERYWORKFLOWREQUEST._serialized_start = 22982 + _QUERYWORKFLOWREQUEST._serialized_end = 23215 + _QUERYWORKFLOWRESPONSE._serialized_start = 23218 + _QUERYWORKFLOWRESPONSE._serialized_end = 23403 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24188 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24191 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24719 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24722 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25726 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25508 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25624 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25626 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25726 + _GETCLUSTERINFOREQUEST._serialized_start = 25728 + _GETCLUSTERINFOREQUEST._serialized_end = 25751 + _GETCLUSTERINFORESPONSE._serialized_start = 25754 + _GETCLUSTERINFORESPONSE._serialized_end = 26219 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26164 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26219 + _GETSYSTEMINFOREQUEST._serialized_start = 26221 + _GETSYSTEMINFOREQUEST._serialized_end = 26243 + _GETSYSTEMINFORESPONSE._serialized_start = 26246 + _GETSYSTEMINFORESPONSE._serialized_end = 26823 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26387 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26823 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26825 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26934 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26937 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27160 + _CREATESCHEDULEREQUEST._serialized_start = 27163 + _CREATESCHEDULEREQUEST._serialized_end = 27495 + _CREATESCHEDULERESPONSE._serialized_start = 27497 + _CREATESCHEDULERESPONSE._serialized_end = 27545 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27547 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27612 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27615 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27886 + _UPDATESCHEDULEREQUEST._serialized_start = 27889 + _UPDATESCHEDULEREQUEST._serialized_end = 28181 + _UPDATESCHEDULERESPONSE._serialized_start = 28183 + _UPDATESCHEDULERESPONSE._serialized_end = 28207 + _PATCHSCHEDULEREQUEST._serialized_start = 28210 + _PATCHSCHEDULEREQUEST._serialized_end = 28366 + _PATCHSCHEDULERESPONSE._serialized_start = 28368 + _PATCHSCHEDULERESPONSE._serialized_end = 28391 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28394 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28562 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28564 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28647 + _DELETESCHEDULEREQUEST._serialized_start = 28649 + _DELETESCHEDULEREQUEST._serialized_end = 28730 + _DELETESCHEDULERESPONSE._serialized_start = 28732 + _DELETESCHEDULERESPONSE._serialized_end = 28756 + _LISTSCHEDULESREQUEST._serialized_start = 28758 + _LISTSCHEDULESREQUEST._serialized_end = 28866 + _LISTSCHEDULESRESPONSE._serialized_start = 28868 + _LISTSCHEDULESRESPONSE._serialized_end = 28980 + _COUNTSCHEDULESREQUEST._serialized_start = 28982 + _COUNTSCHEDULESREQUEST._serialized_end = 29039 + _COUNTSCHEDULESRESPONSE._serialized_start = 29042 + _COUNTSCHEDULESRESPONSE._serialized_end = 29261 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29264 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29910 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29711 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29639 + 29822 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29641 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29714 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29729 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29793 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29795 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29890 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29892 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30008 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30011 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31728 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31063 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29824 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29897 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29912 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29976 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29978 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30073 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30075 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30191 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30194 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31911 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31246 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31176 + 31359 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31179 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31362 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31308 + 31491 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31310 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31493 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31374 + 31557 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31376 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31482 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31484 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31594 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31596 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31658 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31660 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31715 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31731 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 31983 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 31985 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32057 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32060 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32309 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32312 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32468 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32470 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32584 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32587 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 32848 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 32851 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33110 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33113 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34479 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34481 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34510 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34512 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34608 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34610 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34638 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34640 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34706 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34709 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35181 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35183 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35274 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35276 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35397 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35400 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35585 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35588 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35807 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35810 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36226 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36229 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36583 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36586 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36753 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36755 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36790 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36793 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37013 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37015 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37047 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37050 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37422 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37216 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37422 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37425 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37757 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37551 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37757 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37760 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38096 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38099 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38418 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38420 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38520 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38522 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38631 - _PAUSEACTIVITYREQUEST._serialized_start = 38634 - _PAUSEACTIVITYREQUEST._serialized_end = 38833 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 38836 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39019 - _PAUSEACTIVITYRESPONSE._serialized_start = 39021 - _PAUSEACTIVITYRESPONSE._serialized_end = 39044 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39046 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39078 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39081 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39361 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39364 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39637 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39639 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39664 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39666 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39700 - _RESETACTIVITYREQUEST._serialized_start = 39703 - _RESETACTIVITYREQUEST._serialized_end = 40010 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40013 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40303 - _RESETACTIVITYRESPONSE._serialized_start = 40305 - _RESETACTIVITYRESPONSE._serialized_end = 40328 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40330 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40362 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40365 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40649 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40652 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 40829 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 40831 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 40937 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 40939 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41036 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41039 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41233 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41236 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 41888 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41497 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 41888 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25223 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25323 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 41890 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 41967 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 41970 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42110 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42112 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42220 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42222 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42341 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42344 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42549 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42552 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42737 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42740 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 42969 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 42972 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43163 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43166 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43415 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43418 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43642 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43644 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43757 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43759 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43815 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43817 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 43910 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 43913 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44584 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44088 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44584 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44587 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44827 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 44829 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 44868 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44871 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45071 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45073 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45112 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45114 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45207 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45209 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45241 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45244 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45760 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45762 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45814 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45817 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46317 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45637 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45760 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46319 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46373 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46376 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46794 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46709 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31559 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31665 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31667 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31777 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31779 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31841 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31843 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31898 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31914 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32166 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32168 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32240 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32243 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32492 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32495 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32651 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32653 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32767 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32770 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33031 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33034 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33293 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33296 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34662 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34664 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34693 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34695 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34791 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34793 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34821 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34823 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34889 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34892 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35364 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35366 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35457 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35459 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35580 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35583 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35768 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35771 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35990 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35993 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36409 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36412 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36766 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36769 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36936 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36938 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36973 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36976 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37196 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37198 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37230 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37233 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37605 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37399 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37605 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37608 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37940 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37734 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37940 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37943 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38279 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38282 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38601 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38603 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38703 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38705 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38814 + _PAUSEACTIVITYREQUEST._serialized_start = 38817 + _PAUSEACTIVITYREQUEST._serialized_end = 39016 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39019 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39202 + _PAUSEACTIVITYRESPONSE._serialized_start = 39204 + _PAUSEACTIVITYRESPONSE._serialized_end = 39227 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39229 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39261 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39264 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39544 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39547 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39820 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39822 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39847 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39849 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39883 + _RESETACTIVITYREQUEST._serialized_start = 39886 + _RESETACTIVITYREQUEST._serialized_end = 40193 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40196 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40486 + _RESETACTIVITYRESPONSE._serialized_start = 40488 + _RESETACTIVITYRESPONSE._serialized_end = 40511 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40513 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40545 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40548 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40832 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40835 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41012 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41014 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41120 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41122 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41219 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41222 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41416 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41419 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42071 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41680 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42071 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42073 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42150 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42153 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42293 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42295 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42403 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42405 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42524 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42527 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42732 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42735 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42920 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42923 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43152 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43155 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43346 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43349 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43598 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43601 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43825 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43827 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43940 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43942 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43998 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44000 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44093 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44096 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44767 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44271 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44767 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44770 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45010 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45012 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45051 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45054 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45254 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45256 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45295 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45297 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45390 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45392 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45424 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45427 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45943 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45945 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45997 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46000 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46500 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46502 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46556 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46559 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46977 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46892 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 46794 + 46977 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46796 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 46906 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 46909 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47098 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47100 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47199 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47201 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47270 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47272 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47379 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47381 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47494 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47497 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47724 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47727 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 47907 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 47909 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48004 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48006 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48071 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48073 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48154 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48156 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48219 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48221 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48249 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48251 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48321 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48323 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48427 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48430 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48636 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48638 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48684 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48687 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 48842 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 48844 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 48875 - _LISTWORKERSREQUEST._serialized_start = 48878 - _LISTWORKERSREQUEST._serialized_end = 49008 - _LISTWORKERSRESPONSE._serialized_start = 49011 - _LISTWORKERSRESPONSE._serialized_end = 49176 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49179 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 49904 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49746 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 49837 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46979 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47089 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47092 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47281 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47283 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47382 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47384 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47453 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47455 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47562 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47564 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47677 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47680 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47907 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47910 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48090 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48092 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48187 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48189 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48254 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48256 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48337 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48339 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48402 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48404 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48432 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48434 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48504 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48506 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48610 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48613 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48819 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48821 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48867 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48870 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49025 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49027 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49058 + _LISTWORKERSREQUEST._serialized_start = 49061 + _LISTWORKERSREQUEST._serialized_end = 49191 + _LISTWORKERSRESPONSE._serialized_start = 49194 + _LISTWORKERSRESPONSE._serialized_end = 49359 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49362 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50087 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49929 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50020 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 49839 + 50022 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 49904 + 50087 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 49906 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 49997 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50000 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50158 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50160 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50245 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50248 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50514 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50516 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50616 - _DESCRIBEWORKERREQUEST._serialized_start = 50618 - _DESCRIBEWORKERREQUEST._serialized_end = 50689 - _DESCRIBEWORKERRESPONSE._serialized_start = 50691 - _DESCRIBEWORKERRESPONSE._serialized_end = 50772 - _COUNTWORKERSREQUEST._serialized_start = 50774 - _COUNTWORKERSREQUEST._serialized_end = 50861 - _COUNTWORKERSRESPONSE._serialized_start = 50863 - _COUNTWORKERSRESPONSE._serialized_end = 50900 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 50903 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51044 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51046 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51078 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51081 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51224 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51226 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51260 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51263 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52440 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52442 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52551 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52554 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52782 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52785 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53101 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53103 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53189 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53191 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53307 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53309 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53418 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53421 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53551 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53554 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54403 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54353 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54403 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54405 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54476 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54479 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54649 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54652 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54963 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54966 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55127 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55130 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55391 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55393 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55508 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55511 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55650 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55652 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55718 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55721 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 55958 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55960 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56032 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56035 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56284 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21617 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21705 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56287 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56436 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56438 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56478 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56481 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56626 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56628 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56664 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56666 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56754 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56756 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56789 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56792 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 56948 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 56950 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56996 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56999 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57151 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57153 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57195 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57197 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57292 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57294 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57333 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57336 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57493 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57496 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57728 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50089 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50180 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50183 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50341 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50343 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50428 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50431 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50697 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50699 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50799 + _DESCRIBEWORKERREQUEST._serialized_start = 50801 + _DESCRIBEWORKERREQUEST._serialized_end = 50872 + _DESCRIBEWORKERRESPONSE._serialized_start = 50874 + _DESCRIBEWORKERRESPONSE._serialized_end = 50955 + _COUNTWORKERSREQUEST._serialized_start = 50957 + _COUNTWORKERSREQUEST._serialized_end = 51044 + _COUNTWORKERSRESPONSE._serialized_start = 51046 + _COUNTWORKERSRESPONSE._serialized_end = 51083 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51086 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51227 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51229 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51261 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51264 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51407 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51409 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51443 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51446 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52623 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52625 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52734 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52737 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52965 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52968 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53284 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53286 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53372 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53374 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53490 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53492 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53601 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53604 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53734 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53737 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54586 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54536 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54586 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54588 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54659 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54662 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54832 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54835 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55146 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55149 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55310 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55313 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55574 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55576 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55691 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55694 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55833 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55835 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55901 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55904 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56141 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56143 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56215 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56218 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56467 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56470 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56619 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56621 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56661 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56664 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56809 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56811 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56847 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56849 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56937 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56939 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56975 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57131 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57133 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57179 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57182 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57334 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57336 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57378 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57380 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57475 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57477 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57516 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57519 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57676 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57679 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57911 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index 381e1f4e0..161d051c0 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -1281,7 +1281,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): POLLER_GROUP_INFOS_FIELD_NUMBER: builtins.int POLLER_GROUPS_INFO_FIELD_NUMBER: builtins.int STREAM_SLICES_FIELD_NUMBER: builtins.int - WAKES_FIELD_NUMBER: builtins.int task_token: builtins.bytes """A unique identifier for this task""" @property @@ -1405,17 +1404,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): """Stream data attached to this task. Delivered out of band so the payloads never enter History; only the offset ranges are recorded there. """ - @property - def wakes( - self, - ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ - temporalio.api.workflow.v1.message_pb2.Wake - ]: - """Wakes pending for this execution when the task started, folded by - source. Not recorded in History and never re-supplied on replay: the - Workflow treats one as a reason to read its source now and records what - it read itself. - """ def __init__( self, *, @@ -1455,8 +1443,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): temporalio.api.stream.v1.message_pb2.StreamSlice ] | None = ..., - wakes: collections.abc.Iterable[temporalio.api.workflow.v1.message_pb2.Wake] - | None = ..., ) -> None: ... def HasField( self, @@ -1518,8 +1504,6 @@ class PollWorkflowTaskQueueResponse(google.protobuf.message.Message): b"stream_slices", "task_token", b"task_token", - "wakes", - b"wakes", "workflow_execution", b"workflow_execution", "workflow_execution_task_queue", @@ -3335,84 +3319,6 @@ class SignalWorkflowExecutionResponse(google.protobuf.message.Message): global___SignalWorkflowExecutionResponse = SignalWorkflowExecutionResponse -class WakeWorkflowExecutionRequest(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - NAMESPACE_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int - WAKE_FIELD_NUMBER: builtins.int - IDENTITY_FIELD_NUMBER: builtins.int - namespace: builtins.str - @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """The Workflow to wake. `run_id` is optional. When set, the wake goes to - the current run of the chain that run belongs to, so a sender that - learned a run id before a continue-as-new still reaches the consumer, - and it is refused with NotFound once that chain has ended. When unset, - the wake goes to the current run under the Workflow Id, whichever chain. - """ - @property - def wake(self) -> temporalio.api.workflow.v1.message_pb2.Wake: ... - identity: builtins.str - """The identity of the sender, for metrics and logs.""" - def __init__( - self, - *, - namespace: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., - wake: temporalio.api.workflow.v1.message_pb2.Wake | None = ..., - identity: builtins.str = ..., - ) -> None: ... - def HasField( - self, - field_name: typing_extensions.Literal[ - "wake", b"wake", "workflow_execution", b"workflow_execution" - ], - ) -> builtins.bool: ... - def ClearField( - self, - field_name: typing_extensions.Literal[ - "identity", - b"identity", - "namespace", - b"namespace", - "wake", - b"wake", - "workflow_execution", - b"workflow_execution", - ], - ) -> None: ... - -global___WakeWorkflowExecutionRequest = WakeWorkflowExecutionRequest - -class WakeWorkflowExecutionResponse(google.protobuf.message.Message): - DESCRIPTOR: google.protobuf.descriptor.Descriptor - - RUN_ID_FIELD_NUMBER: builtins.int - FOLDED_FIELD_NUMBER: builtins.int - run_id: builtins.str - """The run the wake was stored on.""" - folded: builtins.bool - """True when a wake for the source was already pending and no task had - received it yet, so this one changed nothing but possibly the position - and no new task results from it. - """ - def __init__( - self, - *, - run_id: builtins.str = ..., - folded: builtins.bool = ..., - ) -> None: ... - def ClearField( - self, - field_name: typing_extensions.Literal["folded", b"folded", "run_id", b"run_id"], - ) -> None: ... - -global___WakeWorkflowExecutionResponse = WakeWorkflowExecutionResponse - class NotifyChannelRequest(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -3420,6 +3326,7 @@ class NotifyChannelRequest(google.protobuf.message.Message): NOTIFICATION_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str @property def notification( @@ -3429,6 +3336,14 @@ class NotifyChannelRequest(google.protobuf.message.Message): """The identity of the writer, for metrics and logs.""" request_id: builtins.str """Used to de-dupe a retried notification.""" + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, @@ -3437,9 +3352,14 @@ class NotifyChannelRequest(google.protobuf.message.Message): | None = ..., identity: builtins.str = ..., request_id: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["notification", b"notification"] + self, + field_name: typing_extensions.Literal[ + "notification", b"notification", "workflow_execution", b"workflow_execution" + ], ) -> builtins.bool: ... def ClearField( self, @@ -3452,6 +3372,8 @@ class NotifyChannelRequest(google.protobuf.message.Message): b"notification", "request_id", b"request_id", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3484,6 +3406,7 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): CALLBACK_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str @property @@ -3493,6 +3416,14 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): """Used to de-dupe a retried registration.""" identity: builtins.str """The identity of the caller, for metrics and logs.""" + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, @@ -3501,9 +3432,14 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): callback: temporalio.api.common.v1.message_pb2.Callback | None = ..., request_id: builtins.str = ..., identity: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["callback", b"callback"] + self, + field_name: typing_extensions.Literal[ + "callback", b"callback", "workflow_execution", b"workflow_execution" + ], ) -> builtins.bool: ... def ClearField( self, @@ -3518,6 +3454,8 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): b"namespace", "request_id", b"request_id", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3546,11 +3484,20 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): CHANNEL_FIELD_NUMBER: builtins.int LISTENER_ID_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str listener_id: builtins.str identity: builtins.str """The identity of the caller, for metrics and logs.""" + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, @@ -3558,7 +3505,15 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): channel: builtins.str = ..., listener_id: builtins.str = ..., identity: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "workflow_execution", b"workflow_execution" + ], + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ @@ -3570,6 +3525,8 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): b"listener_id", "namespace", b"namespace", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3592,6 +3549,7 @@ class PollChannelRequest(google.protobuf.message.Message): AFTER_COUNTER_FIELD_NUMBER: builtins.int WAIT_FIELD_NUMBER: builtins.int MAX_NOTIFICATIONS_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str after_counter: builtins.int @@ -3608,6 +3566,14 @@ class PollChannelRequest(google.protobuf.message.Message): """At most this many notifications are returned. Zero means the server's default. """ + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, @@ -3616,9 +3582,14 @@ class PollChannelRequest(google.protobuf.message.Message): after_counter: builtins.int = ..., wait: google.protobuf.duration_pb2.Duration | None = ..., max_notifications: builtins.int = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["wait", b"wait"] + self, + field_name: typing_extensions.Literal[ + "wait", b"wait", "workflow_execution", b"workflow_execution" + ], ) -> builtins.bool: ... def ClearField( self, @@ -3633,6 +3604,8 @@ class PollChannelRequest(google.protobuf.message.Message): b"namespace", "wait", b"wait", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3667,18 +3640,40 @@ class DescribeChannelRequest(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int CHANNEL_FIELD_NUMBER: builtins.int + WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str + @property + def workflow_execution( + self, + ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """When set, the call addresses the channel linked to this workflow; `run_id` + is optional and resolves to the chain's current run, as a Signal does. + When unset, the call addresses the independent channel of that name. + """ def __init__( self, *, namespace: builtins.str = ..., channel: builtins.str = ..., + workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution + | None = ..., ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "workflow_execution", b"workflow_execution" + ], + ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ - "channel", b"channel", "namespace", b"namespace" + "channel", + b"channel", + "namespace", + b"namespace", + "workflow_execution", + b"workflow_execution", ], ) -> None: ... @@ -3690,6 +3685,8 @@ class DescribeChannelResponse(google.protobuf.message.Message): LISTENERS_FIELD_NUMBER: builtins.int LATEST_FIELD_NUMBER: builtins.int RETAINED_COUNT_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + LINKED_TO_FIELD_NUMBER: builtins.int @property def listeners( self, @@ -3701,6 +3698,14 @@ class DescribeChannelResponse(google.protobuf.message.Message): """The notification with the highest counter the channel retains.""" retained_count: builtins.int """How many notifications the channel retains for pollers.""" + kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType + @property + def linked_to(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + """The owner of a linked channel and the run that holds it. Empty for an + independent channel. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "to" names the owner the channel is linked to. --) + """ def __init__( self, *, @@ -3710,15 +3715,24 @@ class DescribeChannelResponse(google.protobuf.message.Message): | None = ..., latest: temporalio.api.notification.v1.message_pb2.Notification | None = ..., retained_count: builtins.int = ..., + kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType = ..., + linked_to: temporalio.api.common.v1.message_pb2.WorkflowExecution | None = ..., ) -> None: ... def HasField( - self, field_name: typing_extensions.Literal["latest", b"latest"] + self, + field_name: typing_extensions.Literal[ + "latest", b"latest", "linked_to", b"linked_to" + ], ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ + "kind", + b"kind", "latest", b"latest", + "linked_to", + b"linked_to", "listeners", b"listeners", "retained_count", diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index aec338a11..57e919ce9 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\x8e\xc0\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA".temporal.api.workflowservice.v1.WakeWorkflowExecutionResponse"\xa8\x01\x82\xd3\xe4\x93\x02\xa1\x01"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\x01*\x12\x97\x02\n\rNotifyChannel\x12\x35.temporal.api.workflowservice.v1.NotifyChannelRequest\x1a\x36.temporal.api.workflowservice.v1.NotifyChannelResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*\x12\xa0\x02\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\x81\x01\x82\xd3\xe4\x93\x02{"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*\x12\xbd\x02\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\x98\x01\x82\xd3\xe4\x93\x02\x91\x01*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}\x12\xfe\x01\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notifications\x12\xed\x01\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xff\xc5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA"/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*Zn"i/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\x01*Zu"p/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\x01*\x12\xf4\x03\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\xd5\x02\x82\xd3\xe4\x93\x02\xce\x02"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*Zd"_/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\x01*Zk"f/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\x01*\x12\xa6\x04\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\x81\x03\x82\xd3\xe4\x93\x02\xfa\x02*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zo*m/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}Zv*t/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}\x12\xd4\x03\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\xd9\x02\x82\xd3\xe4\x93\x02\xd2\x02\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZe\x12\x63/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notificationsZl\x12j/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notifications\x12\xa8\x03\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"\xa1\x02\x82\xd3\xe4\x93\x02\x9a\x02\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}ZW\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}Z^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -135,30 +135,26 @@ _WORKFLOWSERVICE.methods_by_name[ "SignalWorkflowExecution" ]._serialized_options = b'\202\323\344\223\002\301\001"W/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/signal/{signal_name}:\001*\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}' - _WORKFLOWSERVICE.methods_by_name["WakeWorkflowExecution"]._options = None - _WORKFLOWSERVICE.methods_by_name[ - "WakeWorkflowExecution" - ]._serialized_options = b'\202\323\344\223\002\241\001"G/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*ZS"N/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/wake:\001*' _WORKFLOWSERVICE.methods_by_name["NotifyChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "NotifyChannel" - ]._serialized_options = b'\202\323\344\223\002\217\001">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*' + ]._serialized_options = b'\202\323\344\223\002\366\002">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*Zn"i/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\001*Zu"p/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\001*' _WORKFLOWSERVICE.methods_by_name["RegisterChannelListener"]._options = None _WORKFLOWSERVICE.methods_by_name[ "RegisterChannelListener" - ]._serialized_options = b'\202\323\344\223\002{"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*' + ]._serialized_options = b'\202\323\344\223\002\316\002"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*Zd"_/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\001*Zk"f/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\001*' _WORKFLOWSERVICE.methods_by_name["UnregisterChannelListener"]._options = None _WORKFLOWSERVICE.methods_by_name[ "UnregisterChannelListener" - ]._serialized_options = b"\202\323\344\223\002\221\001*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}" + ]._serialized_options = b"\202\323\344\223\002\372\002*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zo*m/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}Zv*t/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}" _WORKFLOWSERVICE.methods_by_name["PollChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "PollChannel" - ]._serialized_options = b"\202\323\344\223\002}\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notifications" + ]._serialized_options = b"\202\323\344\223\002\322\002\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZe\022c/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notificationsZl\022j/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notifications" _WORKFLOWSERVICE.methods_by_name["DescribeChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "DescribeChannel" - ]._serialized_options = b"\202\323\344\223\002a\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}" + ]._serialized_options = b"\202\323\344\223\002\232\002\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}ZW\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}Z^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}" _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -550,5 +546,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 41224 + _WORKFLOWSERVICE._serialized_end = 41977 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.py b/temporalio/api/workflowservice/v1/service_pb2_grpc.py index d636d3059..9f639fa10 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.py +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.py @@ -143,11 +143,6 @@ def __init__(self, channel): request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.SerializeToString, response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.FromString, ) - self.WakeWorkflowExecution = channel.unary_unary( - "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", - request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, - response_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, - ) self.NotifyChannel = channel.unary_unary( "/temporal.api.workflowservice.v1.WorkflowService/NotifyChannel", request_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.SerializeToString, @@ -967,20 +962,6 @@ def SignalWorkflowExecution(self, request, context): context.set_details("Method not implemented!") raise NotImplementedError("Method not implemented!") - def WakeWorkflowExecution(self, request, context): - """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow - Task because a source it consumes has moved. Unlike a Signal it records - no event, carries no payload, and folds with other wakes for the same - source, so a burst of writes costs one task. The Workflow learns the - source and its position from the task and reads the source itself. - - Superseded by the notification channel (`NotifyChannel` and the - `SubscribeNotificationChannel` command). Kept for one round and slated for removal. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - def NotifyChannel(self, request, context): """NotifyChannel tells every listener of a channel that a source they consume has moved. The writer names no addressee and never learns who listens. The @@ -2129,11 +2110,6 @@ def add_WorkflowServiceServicer_to_server(servicer, server): request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionRequest.FromString, response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.SignalWorkflowExecutionResponse.SerializeToString, ), - "WakeWorkflowExecution": grpc.unary_unary_rpc_method_handler( - servicer.WakeWorkflowExecution, - request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.FromString, - response_serializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.SerializeToString, - ), "NotifyChannel": grpc.unary_unary_rpc_method_handler( servicer.NotifyChannel, request_deserializer=temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.NotifyChannelRequest.FromString, @@ -3348,35 +3324,6 @@ def SignalWorkflowExecution( metadata, ) - @staticmethod - def WakeWorkflowExecution( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, - target, - "/temporal.api.workflowservice.v1.WorkflowService/WakeWorkflowExecution", - temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionRequest.SerializeToString, - temporal_dot_api_dot_workflowservice_dot_v1_dot_request__response__pb2.WakeWorkflowExecutionResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) - @staticmethod def NotifyChannel( request, diff --git a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi index 4ea73b3ff..38a22ebff 100644 --- a/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi +++ b/temporalio/api/workflowservice/v1/service_pb2_grpc.pyi @@ -279,19 +279,6 @@ class WorkflowServiceStub: This results in a `WORKFLOW_EXECUTION_SIGNALED` event recorded in the history and a workflow task being created for the execution. """ - WakeWorkflowExecution: grpc.UnaryUnaryMultiCallable[ - temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, - temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse, - ] - """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow - Task because a source it consumes has moved. Unlike a Signal it records - no event, carries no payload, and folds with other wakes for the same - source, so a burst of writes costs one task. The Workflow learns the - source and its position from the task and reads the source itself. - - Superseded by the notification channel (`NotifyChannel` and the - `SubscribeNotificationChannel` command). Kept for one round and slated for removal. - """ NotifyChannel: grpc.UnaryUnaryMultiCallable[ temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelRequest, temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelResponse, @@ -1537,21 +1524,6 @@ class WorkflowServiceServicer(metaclass=abc.ABCMeta): task being created for the execution. """ @abc.abstractmethod - def WakeWorkflowExecution( - self, - request: temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionRequest, - context: grpc.ServicerContext, - ) -> temporalio.api.workflowservice.v1.request_response_pb2.WakeWorkflowExecutionResponse: - """WakeWorkflowExecution asks a running Workflow Execution to run a Workflow - Task because a source it consumes has moved. Unlike a Signal it records - no event, carries no payload, and folds with other wakes for the same - source, so a burst of writes costs one task. The Workflow learns the - source and its position from the task and reads the source itself. - - Superseded by the notification channel (`NotifyChannel` and the - `SubscribeNotificationChannel` command). Kept for one round and slated for removal. - """ - @abc.abstractmethod def NotifyChannel( self, request: temporalio.api.workflowservice.v1.request_response_pb2.NotifyChannelRequest, diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index a9a025b81..0c21f1c0f 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit a9a025b8172618a15777da64fbfc259d1c6b73f9 +Subproject commit 0c21f1c0f637acc056660f49db1c0214a8e0d85c diff --git a/temporalio/bridge/services_generated.py b/temporalio/bridge/services_generated.py index 88e63e187..b8298fde7 100644 --- a/temporalio/bridge/services_generated.py +++ b/temporalio/bridge/services_generated.py @@ -2333,24 +2333,6 @@ async def validate_worker_deployment_version_compute_config( timeout=timeout, ) - async def wake_workflow_execution( - self, - req: temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest, - retry: bool = False, - metadata: Mapping[str, str | bytes] = {}, - timeout: timedelta | None = None, - ) -> temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse: - """Invokes the WorkflowService.wake_workflow_execution rpc method.""" - return await self._client._rpc_call( - rpc="wake_workflow_execution", - req=req, - service=self._service, - resp_type=temporalio.api.workflowservice.v1.WakeWorkflowExecutionResponse, - retry=retry, - metadata=metadata, - timeout=timeout, - ) - class OperatorService: """RPC calls for the OperatorService.""" diff --git a/temporalio/bridge/src/client_rpc_generated.rs b/temporalio/bridge/src/client_rpc_generated.rs index ecac84667..3d3c98018 100644 --- a/temporalio/bridge/src/client_rpc_generated.rs +++ b/temporalio/bridge/src/client_rpc_generated.rs @@ -1172,15 +1172,6 @@ impl ClientRef { validate_worker_deployment_version_compute_config ) } - "wake_workflow_execution" => { - rpc_call!( - connection, - call, - WorkflowService, - workflow_service, - wake_workflow_execution - ) - } _ => { return Err(PyValueError::new_err(format!( "Unknown RPC call {}", From 741c97b9999343fd777c0dd020cb1cc15b24bcb3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:22:23 -0700 Subject: [PATCH 782/831] Added the channel linked to a workflow to the runtime and the client. --- temporalio/client/__init__.py | 2 + temporalio/client/_channel.py | 46 +++- temporalio/client/_client.py | 73 ++++- temporalio/client/_impl.py | 26 +- temporalio/client/_interceptor.py | 10 + temporalio/worker/_workflow_instance.py | 29 +- temporalio/workflow/__init__.py | 2 + temporalio/workflow/_channels.py | 72 ++++- temporalio/workflow/_context.py | 3 + tests/streams/conftest.py | 24 ++ tests/streams/test_channels.py | 338 +++++++++++++++++++++++- 11 files changed, 592 insertions(+), 33 deletions(-) diff --git a/temporalio/client/__init__.py b/temporalio/client/__init__.py index 1a879923c..2577111d2 100644 --- a/temporalio/client/__init__.py +++ b/temporalio/client/__init__.py @@ -66,6 +66,7 @@ ) from ._channel import ( ChannelDescription, + ChannelKind, ChannelListener, ) from ._client import ( @@ -366,6 +367,7 @@ "Plugin", "Callback", "ChannelDescription", + "ChannelKind", "ChannelListener", "_ClientImpl", "_apply_headers", diff --git a/temporalio/client/_channel.py b/temporalio/client/_channel.py index 09d5e1d23..d05d2875b 100644 --- a/temporalio/client/_channel.py +++ b/temporalio/client/_channel.py @@ -5,13 +5,43 @@ from collections.abc import Sequence from dataclasses import dataclass from datetime import datetime, timezone +from enum import IntEnum +import temporalio.api.common.v1 import temporalio.api.notification.v1 from temporalio.workflow import Notification from ._callback import Callback -__all__ = ["ChannelDescription", "ChannelListener"] +__all__ = ["ChannelDescription", "ChannelKind", "ChannelListener"] + + +class ChannelKind(IntEnum): + """Where a channel lives, which decides how a call addresses it. + + .. warning:: + This API is experimental and unstable. + """ + + UNSPECIFIED = int( + temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_UNSPECIFIED + ) + """The server did not say; an older server answers this.""" + + INDEPENDENT = int( + temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_INDEPENDENT + ) + """Its own execution, keyed by namespace and channel name. + + Any number of workflows subscribe to it and callbacks register on it. + """ + + LINKED = int(temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED) + """Kept in one workflow's state, keyed by namespace, workflow id and name. + + The owning workflow is its listener by construction; a call reaches it + with the ``workflow_id`` argument. + """ @dataclass(frozen=True) @@ -76,3 +106,17 @@ class ChannelDescription: retained_count: int """How many notifications the channel keeps for pollers.""" + + kind: ChannelKind = ChannelKind.UNSPECIFIED + """Which kind of channel this is. + + A linked channel of a running workflow exists by construction, so a + describe with ``workflow_id`` answers :attr:`ChannelKind.LINKED` with no + listeners and nothing retained for a name nobody has notified yet. + """ + + linked_to: temporalio.api.common.v1.WorkflowExecution | None = None + """The owner of a linked channel and the run that holds it. + + ``None`` for an independent channel. + """ diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 5368e2f5d..f8725afcc 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -2862,27 +2862,36 @@ async def notify_channel( position: bytes = b"", counter: int = 0, metadata: Mapping[str, Any] | None = None, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> int: """Notify the listeners of ``channel`` that a source they consume has moved. A workflow listening with :py:func:`temporalio.workflow.subscribe_channel` - runs a Workflow Task that carries the notification. The server folds - notifications per listener while one is pending, keeping the one with - the highest ``counter``, so a burst of writes costs a listener one task. + or :py:func:`temporalio.workflow.linked_channel` runs a Workflow Task + that carries the notification. The server folds notifications per + listener while one is pending, keeping the one with the highest + ``counter``, so a burst of writes costs a listener one task. .. warning:: This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel. Scoped to the namespace, or to the + workflow when ``workflow_id`` is given. position: Where the source stands after the write, in the writer's own terms. Opaque to the server. counter: Orders notifications from this channel's writers. Derive it from ``position``, since only the source can order its positions. metadata: Details for the listener, such as which topic moved. Each value is encoded with the client's data converter. + workflow_id: Address the channel linked to this workflow instead of + the independent channel of that name. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run, as a Signal does. Unset means the + current run under the workflow id. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -2898,6 +2907,8 @@ async def notify_channel( metadata=metadata, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) @@ -2908,6 +2919,8 @@ async def poll_channel( after_counter: int = 0, wait: bool | timedelta = True, max_notifications: int = 100, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> list[temporalio.workflow.Notification]: @@ -2917,13 +2930,18 @@ async def poll_channel( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel. Scoped to the namespace, or to the + workflow when ``workflow_id`` is given. after_counter: Only notifications with a counter above this one are returned. Pass the highest counter seen so far to page. wait: How long the server holds the call when nothing is retained above ``after_counter``. ``True`` waits up to :py:data:`DEFAULT_CHANNEL_POLL_WAIT`, ``False`` returns at once. max_notifications: Upper bound on the notifications returned. + workflow_id: Address the channel linked to this workflow instead of + the independent channel of that name. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -2945,6 +2963,8 @@ async def poll_channel( max_notifications=max_notifications, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) @@ -2952,23 +2972,37 @@ async def describe_channel( self, channel: str, *, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> ChannelDescription: - """Describe ``channel``: its listeners and what it retains. + """Describe ``channel``: its kind, its listeners and what it retains. .. warning:: This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel. Scoped to the namespace, or to the + workflow when ``workflow_id`` is given. + workflow_id: Describe the channel linked to this workflow instead + of the independent channel of that name. A linked channel of a + running workflow exists by construction, so the answer for a + name nobody has notified yet is a linked channel with no + listeners and nothing retained, not a not-found error. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. """ return await self._impl.describe_channel( DescribeChannelInput( - channel=channel, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout + channel=channel, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) @@ -2977,6 +3011,8 @@ async def register_channel_listener( channel: str, callback: Callback, *, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> str: @@ -2989,8 +3025,14 @@ async def register_channel_listener( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel. Scoped to the namespace, or to the + workflow when ``workflow_id`` is given. callback: The callback to invoke. + workflow_id: Listen on the channel linked to this workflow instead + of the independent channel of that name. The listener lives in + that workflow's state and ends with its run. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3004,6 +3046,8 @@ async def register_channel_listener( callback=callback, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) @@ -3012,6 +3056,8 @@ async def unregister_channel_listener( channel: str, listener_id: str, *, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> None: @@ -3021,8 +3067,13 @@ async def unregister_channel_listener( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel. Scoped to the namespace, or to the + workflow when ``workflow_id`` is given. listener_id: The id :py:meth:`register_channel_listener` returned. + workflow_id: The workflow whose linked channel the listener is on, + when it was registered with one. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3033,6 +3084,8 @@ async def unregister_channel_listener( listener_id=listener_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index 36ea327e7..d29838195 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -56,7 +56,7 @@ ActivityHandle, AsyncActivityIDReference, ) -from ._channel import ChannelDescription, ChannelListener +from ._channel import ChannelDescription, ChannelKind, ChannelListener from ._exceptions import ( AsyncActivityCancelledError, ScheduleAlreadyRunningError, @@ -1787,6 +1787,7 @@ async def notify_channel(self, input: NotifyChannelInput) -> int: notification=notification, identity=self._client.identity, request_id=str(uuid.uuid4()), + workflow_execution=_channel_owner(input.workflow_id, input.run_id), ), retry=True, metadata=input.rpc_metadata, @@ -1802,6 +1803,7 @@ async def poll_channel( channel=input.channel, after_counter=input.after_counter, max_notifications=input.max_notifications, + workflow_execution=_channel_owner(input.workflow_id, input.run_id), ) if input.wait is not None: req.wait.FromTimedelta(input.wait) @@ -1813,7 +1815,9 @@ async def poll_channel( async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescription: resp = await self._client.workflow_service.describe_channel( temporalio.api.workflowservice.v1.DescribeChannelRequest( - namespace=self._client.namespace, channel=input.channel + namespace=self._client.namespace, + channel=input.channel, + workflow_execution=_channel_owner(input.workflow_id, input.run_id), ), retry=True, metadata=input.rpc_metadata, @@ -1829,6 +1833,8 @@ async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescript else None ), retained_count=resp.retained_count, + kind=ChannelKind(resp.kind), + linked_to=resp.linked_to if resp.HasField("linked_to") else None, ) async def register_channel_listener( @@ -1845,6 +1851,7 @@ async def register_channel_listener( ), request_id=str(uuid.uuid4()), identity=self._client.identity, + workflow_execution=_channel_owner(input.workflow_id, input.run_id), ), retry=True, metadata=input.rpc_metadata, @@ -1861,6 +1868,7 @@ async def unregister_channel_listener( channel=input.channel, listener_id=input.listener_id, identity=self._client.identity, + workflow_execution=_channel_owner(input.workflow_id, input.run_id), ), retry=True, metadata=input.rpc_metadata, @@ -1884,6 +1892,7 @@ async def _notification_from_proto( position=proto.position, counter=proto.counter, metadata=metadata, + linked_to=proto.linked_to if proto.HasField("linked_to") else None, ) async def _apply_headers( @@ -1898,3 +1907,16 @@ async def _apply_headers( == HeaderCodecBehavior.CODEC, self._client.data_converter, ) + + +def _channel_owner( + workflow_id: str | None, run_id: str | None +) -> temporalio.api.common.v1.WorkflowExecution | None: + """The workflow a channel call addresses, or ``None`` for an independent channel.""" + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id needs workflow_id") + return None + return temporalio.api.common.v1.WorkflowExecution( + workflow_id=workflow_id, run_id=run_id or "" + ) diff --git a/temporalio/client/_interceptor.py b/temporalio/client/_interceptor.py index b08246f2b..78fa1b6d9 100644 --- a/temporalio/client/_interceptor.py +++ b/temporalio/client/_interceptor.py @@ -716,6 +716,8 @@ class NotifyChannelInput: metadata: Mapping[str, Any] | None rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + run_id: str | None = None @dataclass @@ -732,6 +734,8 @@ class PollChannelInput: max_notifications: int rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + run_id: str | None = None @dataclass @@ -745,6 +749,8 @@ class DescribeChannelInput: channel: str rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + run_id: str | None = None @dataclass @@ -759,6 +765,8 @@ class RegisterChannelListenerInput: callback: Callback rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + run_id: str | None = None @dataclass @@ -773,6 +781,8 @@ class UnregisterChannelListenerInput: listener_id: str rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + run_id: str | None = None @dataclass diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index d37a001c4..0ffebe5c1 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -312,6 +312,12 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: self._channel_subscriptions: dict[ str, temporalio.workflow.ChannelSubscription ] = {} + # The channels linked to this workflow, keyed by name as well. No + # command: the owner is the listener by construction, so the map only + # routes a notification carrying ``linked_to`` to its handle. + self._linked_channel_subscriptions: dict[ + str, temporalio.workflow.ChannelSubscription + ] = {} self._default_workflow_logic_flags = det.default_workflow_logic_flags self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False @@ -880,14 +886,19 @@ def _apply_notifications_received( self, job: temporalio.bridge.proto.workflow_activation.NotificationsReceived ) -> None: for proto in job.notifications: - subscription = self._channel_subscriptions.get(proto.channel) + # A name may be open as both kinds; the kind the server stamped + # on the notification picks the handle. + if proto.HasField("linked_to"): + subscription = self._linked_channel_subscriptions.get(proto.channel) + else: + subscription = self._channel_subscriptions.get(proto.channel) if subscription is None: # The server fans out to whatever listened at the time, so a - # channel this run never subscribed to is not the workflow's + # channel this run never asked for is not the workflow's # concern. logger.debug( - "Dropping a notification on channel %r, which this run has not " - "subscribed to", + "Dropping a notification on channel %r, which this run does " + "not listen on", proto.channel, ) continue @@ -1867,6 +1878,16 @@ def workflow_subscribe_channel( self._channel_subscriptions[channel] = subscription return subscription + def workflow_linked_channel( + self, channel: str + ) -> temporalio.workflow.ChannelSubscription: + existing = self._linked_channel_subscriptions.get(channel) + if existing is not None: + return existing + subscription = temporalio.workflow.ChannelSubscription(channel, linked=True) + self._linked_channel_subscriptions[channel] = subscription + return subscription + def workflow_time_ns(self) -> int: return self._time_ns diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 0cf3b058a..212625511 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -60,6 +60,7 @@ from ._channels import ( ChannelSubscription, Notification, + linked_channel, subscribe_channel, ) from ._context import ( @@ -271,6 +272,7 @@ "unsafe", "ChannelSubscription", "Notification", + "linked_channel", "subscribe_channel", "StreamReader", "StreamWriter", diff --git a/temporalio/workflow/_channels.py b/temporalio/workflow/_channels.py index 8fd045519..fbbf6843d 100644 --- a/temporalio/workflow/_channels.py +++ b/temporalio/workflow/_channels.py @@ -21,7 +21,12 @@ import temporalio.api.notification.v1 from temporalio.workflow._context import _Runtime -__all__ = ["ChannelSubscription", "Notification", "subscribe_channel"] +__all__ = [ + "ChannelSubscription", + "Notification", + "linked_channel", + "subscribe_channel", +] @dataclass(frozen=True) @@ -55,6 +60,15 @@ class Notification: converter :py:func:`temporalio.workflow.payload_converter` returns. """ + linked_to: temporalio.api.common.v1.WorkflowExecution | None = None + """The workflow a linked channel belongs to, and the run that received this. + + ``None`` for a notification from an independent channel. A workflow that + holds both kinds of handle on one name gets a notification on the handle + its kind names: :func:`temporalio.workflow.linked_channel` when set, + :func:`temporalio.workflow.subscribe_channel` otherwise. + """ + @staticmethod def _from_proto( proto: temporalio.api.notification.v1.Notification, @@ -64,30 +78,42 @@ def _from_proto( position=proto.position, counter=proto.counter, metadata=dict(proto.metadata.items()), + linked_to=proto.linked_to if proto.HasField("linked_to") else None, ) class ChannelSubscription: - """A workflow's subscription to one channel. - - Prefer :func:`temporalio.workflow.subscribe_channel`. The subscription is - an async iterator over the notifications as they arrive, and - :meth:`receive` takes them one at a time. Notifications wait in arrival - order until taken. Two loops on one subscription share its buffer and - interleave. + """A workflow's handle on one channel, of either kind. + + Prefer :func:`temporalio.workflow.subscribe_channel` for an independent + channel and :func:`temporalio.workflow.linked_channel` for one linked to + this workflow. The handle is an async iterator over the notifications as + they arrive, and :meth:`receive` takes them one at a time. Notifications + wait in arrival order until taken. Two loops on one handle share its + buffer and interleave. """ - def __init__(self, channel: str) -> None: - """Prefer :func:`temporalio.workflow.subscribe_channel`.""" + def __init__(self, channel: str, *, linked: bool = False) -> None: + """Prefer the two module functions named above.""" self._channel = channel + self._linked = linked self._pending: deque[Notification] = deque() self._waiters: deque[asyncio.Future[None]] = deque() @property def channel(self) -> str: - """The channel this subscription is on.""" + """The channel this handle is on.""" return self._channel + @property + def linked(self) -> bool: + """Whether the channel is the one linked to this workflow. + + A linked handle gets the notifications that carry + :attr:`Notification.linked_to`; an independent one gets the rest. + """ + return self._linked + async def receive(self) -> Notification: """The next notification on this channel, waiting for one to arrive. @@ -142,3 +168,27 @@ def subscribe_channel(channel: str) -> ChannelSubscription: if not channel: raise ValueError("channel must not be empty") return _Runtime.current().workflow_subscribe_channel(channel) + + +def linked_channel(channel: str) -> ChannelSubscription: + """Listen on the channel named ``channel`` that is linked to this workflow. + + A linked channel lives in this workflow's own state, so the workflow is + its listener by construction: no command, no event, and no gate needed + for a new name. A writer reaches it with the workflow id, as in + :py:meth:`temporalio.client.Client.notify_channel` with ``workflow_id``, + and a successor run after continue-as-new is reached by the same calls. + A second call for the same name returns the handle already open, and the + two share its buffer. The name does not collide with an independent + channel's: a notification carrying :attr:`Notification.linked_to` comes + here, one without it goes to :func:`subscribe_channel`. + + Args: + channel: Name of the channel, scoped to this workflow. + + Raises: + ValueError: ``channel`` is empty. + """ + if not channel: + raise ValueError("channel must not be empty") + return _Runtime.current().workflow_linked_channel(channel) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index e0cb59a8d..1371afc29 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -517,6 +517,9 @@ def workflow_streams(self) -> _WorkflowStreams: ... @abstractmethod def workflow_subscribe_channel(self, channel: str) -> ChannelSubscription: ... + @abstractmethod + def workflow_linked_channel(self, channel: str) -> ChannelSubscription: ... + @abstractmethod def workflow_time_ns(self) -> int: ... diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 8515273bf..22e3fa18e 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -7,6 +7,11 @@ # the native layers move to handles it. PINNED_CORE_HANDLES_CHANNEL_COMMAND = False +# A channel linked to a workflow needs no command or machine in Core, only +# the protos that carry `linked_to` on the notification, so the protos-only +# pin already handles it and the live linked cases run from this layer on. +PINNED_CORE_HANDLES_LINKED_CHANNEL = True + def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( @@ -32,6 +37,12 @@ def pytest_configure(config: pytest.Config) -> None: "needs_channel_core: the case needs the pinned Core to handle the " "subscribe-notification-channel command", ) + config.addinivalue_line( + "markers", + "needs_linked_server: the case needs a server that serves channels linked " + "to a workflow, named with -E host:port, and a Core whose protos carry " + "the linked contract", + ) def pytest_collection_modifyitems( @@ -61,6 +72,19 @@ def pytest_collection_modifyitems( ), ) ) + if ( + config.getoption("--workflow-environment") in _ENVIRONMENTS_WITHOUT_CHANNELS + or not PINNED_CORE_HANDLES_LINKED_CHANNEL + ): + skips.append( + ( + "needs_linked_server", + pytest.mark.skip( + reason="needs a server with channels linked to a workflow, " + "named with -E, and a Core pin with the linked contract" + ), + ) + ) for item in items: for marker, skip in skips: if item.get_closest_marker(marker): diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index 950ad28d1..ac22e2a4c 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -1,9 +1,11 @@ """The notification channel surface: the command, the delivery and the client calls. -The workflow instance is driven with activations directly, the way Core -drives it, because the dev server this chain tests against does not accept -the subscribe command. The live cases at the end need a server that does and -skip otherwise. +Both kinds of channel are covered: the independent one a workflow subscribes +to by command, and the one linked to the workflow, which needs none. The +workflow instance is driven with activations directly, the way Core drives +it, because the dev server this chain tests against does not accept the +subscribe command. The live cases at the end need a server that does, or one +with the linked kind, and skip otherwise. """ from __future__ import annotations @@ -18,13 +20,14 @@ import temporalio.api.common.v1 import temporalio.api.notification.v1 +import temporalio.api.workflowservice.v1 import temporalio.bridge.proto.workflow_activation import temporalio.bridge.proto.workflow_completion import temporalio.common import temporalio.converter from temporalio import workflow from temporalio.api.enums.v1 import EventType -from temporalio.client import Callback, Client +from temporalio.client import Callback, ChannelKind, Client from temporalio.service import RPCError, RPCStatusCode from temporalio.worker._workflow_instance import ( UnsandboxedWorkflowRunner, @@ -90,6 +93,89 @@ async def run(self) -> None: workflow.subscribe_channel("") +@workflow.defn +class EmptyLinkedChannel: + """Asks for a linked channel with no name.""" + + @workflow.run + async def run(self) -> None: + workflow.linked_channel("") + + +def _describe(notification: workflow.Notification) -> dict[str, Any]: + return { + "channel": notification.channel, + "counter": notification.counter, + "position": notification.position.decode(), + "topic": ( + workflow.payload_converter().from_payload( + notification.metadata["topic"], str + ) + if "topic" in notification.metadata + else None + ), + "owner": ( + notification.linked_to.workflow_id if notification.linked_to else None + ), + "owner_run": notification.linked_to.run_id if notification.linked_to else None, + } + + +@workflow.defn +class ReceiveLinked: + """Listens on its linked channel and reports the first notification.""" + + @workflow.run + async def run(self, channel: str) -> dict[str, Any]: + handle = workflow.linked_channel(channel) + assert handle is workflow.linked_channel(channel) + assert handle.linked + return _describe(await handle.receive()) + + +@workflow.defn +class BothKinds: + """Holds both kinds of handle on one name and keeps what each receives. + + Ends once the linked handle has seen counter two. + """ + + @workflow.run + async def run(self, channel: str) -> dict[str, list[int]]: + independent = workflow.subscribe_channel(channel) + linked = workflow.linked_channel(channel) + assert not independent.linked and linked.linked + seen: dict[str, list[int]] = {"independent": [], "linked": []} + + async def collect_independent() -> None: + async for notification in independent: + assert notification.linked_to is None + seen["independent"].append(notification.counter) + + collector = asyncio.create_task(collect_independent()) + async for notification in linked: + assert notification.linked_to is not None + seen["linked"].append(notification.counter) + if notification.counter >= 2: + break + collector.cancel() + return seen + + +@workflow.defn +class CountLinked: + """Counts the notifications on its linked channel up to counter two.""" + + @workflow.run + async def run(self, channel: str) -> int: + seen = 0 + async for notification in workflow.linked_channel(channel): + seen += 1 + if notification.counter >= 2: + break + return seen + + def _instance(workflow_class: type) -> WorkflowInstance: """Build an instance the way the worker does, without a worker. @@ -158,6 +244,18 @@ def _notified(*notifications: Notification) -> WorkflowActivation: return WorkflowActivation(run_id="run", jobs=[job]) +def _linked(channel: str, counter: int, position: bytes = b"") -> Notification: + """A notification the way a linked channel's owner receives it.""" + return Notification( + channel=channel, + counter=counter, + position=position, + linked_to=temporalio.api.common.v1.WorkflowExecution( + workflow_id="wf", run_id="run" + ), + ) + + def _subscribed(completion: WorkflowActivationCompletion) -> list[str]: assert completion.HasField("successful"), completion.failed.failure.message return [ @@ -234,6 +332,113 @@ async def test_an_empty_channel_name_is_refused(): assert "channel must not be empty" in completion.failed.failure.message +async def test_an_empty_linked_channel_name_is_refused(): + completion = _instance(EmptyLinkedChannel).activate(_start(EmptyLinkedChannel)) + assert completion.HasField("failed") + assert "channel must not be empty" in completion.failed.failure.message + + +async def test_a_linked_channel_issues_no_command_and_gets_its_own_notifications(): + instance = _instance(ReceiveLinked) + completion = instance.activate(_start(ReceiveLinked, "orders")) + assert completion.HasField("successful"), completion.failed.failure.message + assert list(completion.successful.commands) == [] + # Without an owner the notification is the independent channel's, which + # this run never subscribed to. + completion = instance.activate(_notified(Notification(channel="orders", counter=1))) + assert not _completed(completion) + [topic] = temporalio.converter.PayloadConverter.default.to_payloads(["inputs"]) + notification = _linked("orders", 7, b"7-0") + notification.metadata["topic"].CopyFrom(topic) + assert _result(instance.activate(_notified(notification))) == { + "channel": "orders", + "counter": 7, + "position": "7-0", + "topic": "inputs", + "owner": "wf", + "owner_run": "run", + } + + +async def test_the_owner_on_a_notification_picks_the_handle_of_its_kind(): + instance = _instance(BothKinds) + completion = instance.activate(_start(BothKinds, "orders")) + # Only the independent handle costs a command. + assert _subscribed(completion) == ["orders"] + assert len(completion.successful.commands) == 1 + assert not _completed(instance.activate(_notified(_linked("orders", 1)))) + assert not _completed( + instance.activate(_notified(Notification(channel="orders", counter=5))) + ) + completion = instance.activate(_notified(_linked("orders", 2))) + assert _result(completion) == {"independent": [5], "linked": [1, 2]} + + +async def test_the_client_addresses_a_linked_channel_by_workflow( + client: Client, monkeypatch: pytest.MonkeyPatch +): + """Every channel call carries the owner it was given, and only then.""" + requests: list[Any] = [] + owner = temporalio.api.common.v1.WorkflowExecution(workflow_id="wf", run_id="run") + describe_response = temporalio.api.workflowservice.v1.DescribeChannelResponse( + kind=temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED, + linked_to=owner, + latest=_linked("orders", 3, b"3-0"), + ) + responses = { + "notify_channel": temporalio.api.workflowservice.v1.NotifyChannelResponse(), + "poll_channel": temporalio.api.workflowservice.v1.PollChannelResponse( + notifications=[_linked("orders", 3, b"3-0")] + ), + "describe_channel": describe_response, + "register_channel_listener": ( + temporalio.api.workflowservice.v1.RegisterChannelListenerResponse( + listener_id="listener" + ) + ), + "unregister_channel_listener": ( + temporalio.api.workflowservice.v1.UnregisterChannelListenerResponse() + ), + } + for name, response in responses.items(): + + async def call(req: Any, *, _response: Any = response, **_: Any) -> Any: + requests.append(req) + return _response + + monkeypatch.setattr(client.workflow_service, name, call) + + callback = Callback(url="http://localhost:1/never-called", headers={}) + await client.notify_channel("orders", counter=1, workflow_id="wf", run_id="run") + [polled] = await client.poll_channel("orders", workflow_id="wf", wait=False) + description = await client.describe_channel("orders", workflow_id="wf") + await client.register_channel_listener("orders", callback, workflow_id="wf") + await client.unregister_channel_listener("orders", "listener", workflow_id="wf") + assert [req.workflow_execution for req in requests] == [ + owner, + temporalio.api.common.v1.WorkflowExecution(workflow_id="wf"), + temporalio.api.common.v1.WorkflowExecution(workflow_id="wf"), + temporalio.api.common.v1.WorkflowExecution(workflow_id="wf"), + temporalio.api.common.v1.WorkflowExecution(workflow_id="wf"), + ] + assert polled.linked_to == owner + assert description.kind == ChannelKind.LINKED + assert description.linked_to == owner + assert description.latest is not None and description.latest.linked_to == owner + + # Without an owner the calls address the independent channel. + requests.clear() + await client.notify_channel("orders", counter=1) + await client.poll_channel("orders", wait=False) + await client.describe_channel("orders") + await client.register_channel_listener("orders", callback) + await client.unregister_channel_listener("orders", "listener") + assert [req.HasField("workflow_execution") for req in requests] == [False] * 5 + + with pytest.raises(ValueError, match="run_id needs workflow_id"): + await client.notify_channel("orders", counter=1, run_id="run") + + @pytest.mark.needs_channel_server @pytest.mark.needs_channel_core async def test_a_workflow_receives_a_client_notification(client: Client): @@ -364,3 +569,126 @@ async def test_a_channel_retains_notifications_for_pollers(client: Client): channel, after_counter=3, wait=timedelta(seconds=1) ) assert polled == [] + + +async def _stop(handle: Any, worker: Any, running: asyncio.Task[None]) -> None: + """End the run and the worker, with a bound on the shutdown.""" + with contextlib.suppress(RPCError): + await handle.terminate() + try: + await asyncio.wait_for(worker.shutdown(), 15) + except asyncio.TimeoutError: + running.cancel() + with contextlib.suppress(asyncio.CancelledError): + await running + + +@pytest.mark.needs_linked_server +async def test_a_workflow_receives_a_notification_on_its_linked_channel( + client: Client, +): + channel = f"orders-{uuid.uuid4()}" + worker = new_worker(client, ReceiveLinked) + running = asyncio.create_task(worker.run()) + handle = await client.start_workflow( + ReceiveLinked.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + try: + # The channel exists with the run: no listener registers, nothing is + # retained yet, and the owner is named. + description = await client.describe_channel(channel, workflow_id=handle.id) + assert description.kind == ChannelKind.LINKED + assert description.listeners == [] + assert description.latest is None + assert description.retained_count == 0 + assert description.linked_to is not None + assert description.linked_to.workflow_id == handle.id + await client.notify_channel( + channel, + position=b"1-0", + counter=1, + metadata={"topic": "inputs"}, + workflow_id=handle.id, + ) + assert await asyncio.wait_for(handle.result(), 30) == { + "channel": channel, + "counter": 1, + "position": "1-0", + "topic": "inputs", + "owner": handle.id, + "owner_run": handle.first_execution_run_id, + } + # The owner listens by construction, so History holds no subscribe + # event; the notification rode a scheduled event. + events = [event.event_type async for event in handle.fetch_history_events()] + assert ( + EventType.EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED not in events + ) + finally: + await _stop(handle, worker, running) + + +@pytest.mark.needs_linked_server +async def test_a_linked_channel_of_a_running_workflow_exists_untouched(client: Client): + worker = new_worker(client, CountLinked) + running = asyncio.create_task(worker.run()) + handle = await client.start_workflow( + CountLinked.run, + f"orders-{uuid.uuid4()}", + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + try: + untouched = f"untouched-{uuid.uuid4()}" + description = await client.describe_channel(untouched, workflow_id=handle.id) + assert description.kind == ChannelKind.LINKED + assert (description.listeners, description.latest) == ([], None) + assert description.retained_count == 0 + assert description.linked_to is not None + assert description.linked_to.workflow_id == handle.id + # The independent channel of that name is a different thing and does + # not exist. + with pytest.raises(RPCError) as independent: + await client.describe_channel(untouched) + assert independent.value.status == RPCStatusCode.NOT_FOUND + finally: + await _stop(handle, worker, running) + + +@pytest.mark.needs_linked_server +async def test_a_linked_channel_is_polled_by_workflow_id(client: Client): + channel = f"orders-{uuid.uuid4()}" + worker = new_worker(client, CountLinked) + running = asyncio.create_task(worker.run()) + handle = await client.start_workflow( + CountLinked.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + try: + await client.notify_channel( + channel, position=b"1-0", counter=1, workflow_id=handle.id + ) + polled = await client.poll_channel(channel, workflow_id=handle.id, wait=False) + assert [(n.position, n.counter) for n in polled] == [(b"1-0", 1)] + assert polled[0].linked_to is not None + assert polled[0].linked_to.workflow_id == handle.id + description = await client.describe_channel(channel, workflow_id=handle.id) + assert description.kind == ChannelKind.LINKED + assert description.latest is not None and description.latest.counter == 1 + assert description.retained_count == 1 + # A poll above the latest waits its bound out and comes back empty. + polled = await client.poll_channel( + channel, workflow_id=handle.id, after_counter=1, wait=timedelta(seconds=1) + ) + assert polled == [] + await client.notify_channel( + channel, position=b"2-0", counter=2, workflow_id=handle.id + ) + assert await asyncio.wait_for(handle.result(), 30) == 2 + finally: + await _stop(handle, worker, running) From c14a88d577458328147abedea107a210923ade2a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:25:58 -0700 Subject: [PATCH 783/831] Listened on the linked channel for the streams a run owns. A stream key names a workflow chain, so its channel is addressed to that workflow. A server with the linked kind keeps the channel in the owner's state and the owner listens by construction, so the task that opens the first reader needs no subscribe command and stays retained. The Worker's probe becomes three-way and is recorded as two lang flags. --- .../contrib/external_workflow_streams/_api.py | 7 +- .../external_workflow_streams/_wake.py | 176 +++++++++++++++--- temporalio/worker/_workflow.py | 59 ++++-- temporalio/worker/_workflow_instance.py | 84 +++++++-- temporalio/workflow/__init__.py | 2 + temporalio/workflow/_channels.py | 69 ++++++- temporalio/workflow/_context.py | 3 + .../external_workflow_streams/conftest.py | 51 ++++- .../external_workflow_streams/test_api.py | 4 +- .../external_workflow_streams/test_wake.py | 94 +++++++++- .../test_worker_integration.py | 95 ++++++++-- 11 files changed, 543 insertions(+), 101 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index 5f0a532ac..e8d3e560d 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -309,9 +309,10 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: idle_timeout=self.options.idle_timeout, ) # The channel the stream's writers notify. Asked of the SDK's object for - # the Run rather than of the stream runtime, because the answer is a - # command and commands are the Run's to emit; it also decides, from the - # server it talks to, whether to emit one at all. + # the Run rather than of the stream runtime, because the answer may be + # a command and commands are the Run's to emit; it also decides, from + # the server it talks to, whether the Run is the channel's listener + # already or has to subscribe. subscribe = getattr(_run_holder(), "subscribe_stream_channel", None) if subscribe is not None: subscribe(channel_for(stream_key)) diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index f402fdc61..d13849af0 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -26,6 +26,7 @@ from __future__ import annotations +import enum import hashlib import time import uuid @@ -48,9 +49,12 @@ from temporalio.contrib.external_workflow_streams._producer import WorkflowChainKey __all__ = [ + "ChannelAddress", + "ChannelSupport", "WakeRequest", "WakeTransport", "channel_for", + "channel_support", "new_sender_identity", "send_wake", "send_wake_signal", @@ -77,7 +81,40 @@ """ -def channel_for(key: StreamKey) -> str: +@dataclass(frozen=True) +class ChannelAddress: + """Where a stream's notifications go. + + A channel linked to a workflow lives in that workflow's state and is + addressed by the channel name and the workflow id; the workflow is its + listener by construction. An independent channel is addressed by name + alone and listened on by command. + """ + + channel: str + """The channel name, see :func:`channel_for`.""" + + workflow_id: str = "" + """The workflow the channel is linked to, or empty for an independent channel. + + The chain's id without a run, so the server resolves the chain's current + run the way it does for a Signal and a continue-as-new successor is + reached by the same address. + """ + + @property + def linked(self) -> bool: + """Whether the channel is linked to a workflow.""" + return bool(self.workflow_id) + + def execution(self) -> temporalio.api.common.v1.WorkflowExecution | None: + """The ``workflow_execution`` a channel call carries, or none.""" + if not self.workflow_id: + return None + return temporalio.api.common.v1.WorkflowExecution(workflow_id=self.workflow_id) + + +def channel_for(key: StreamKey) -> ChannelAddress: """The channel a stream's writers notify and its readers listen on. One formatting for both sides, so a producer process and the consuming @@ -85,8 +122,15 @@ def channel_for(key: StreamKey) -> str: server scopes a channel to the namespace of the call. Every segment is percent-encoded, so a Workflow ID or stream name containing ``/`` cannot collide with another stream's segments. + + A stream key names a workflow chain, so the channel is linked to that + workflow: it is the stream's owner and the one reader of its input. A + server with the linked kind keeps the channel in the owner's state, where + a notification is one write and no subscription is needed. A server + without it ignores the owner and serves the independent channel of the + same name, which the reader then subscribes to by command. """ - return "/".join( + channel = "/".join( quote(part, safe="") for part in ( CHANNEL_PREFIX, @@ -96,6 +140,7 @@ def channel_for(key: StreamKey) -> str: key.stream_name, ) ) + return ChannelAddress(channel=channel, workflow_id=key.workflow_id) WAKE_SIGNAL_NAME = "__temporal_external_stream_wake" @@ -180,10 +225,23 @@ class WakeRequest: """The channel the stream's readers listen on, see :func:`channel_for`. Empty for a request composed by code that predates the channel, which the - transport then wakes by chain. Not part of the request ID: the ID names the - wake, and the channel is only where it is delivered. + transport then wakes by Signal. Not part of the request ID: the ID names + the wake, and the channel is only where it is delivered. + """ + channel_workflow_id: str = "" + """The workflow the channel is linked to, empty for an independent channel. + + Set with ``channel`` for a workflow-owned stream, so the notification + addresses the owner's linked channel on a server that has the kind. """ + @property + def channel_address(self) -> ChannelAddress: + """The channel and its owner as one address.""" + return ChannelAddress( + channel=self.channel, workflow_id=self.channel_workflow_id + ) + @property def is_unparked(self) -> bool: """Whether this wake requests a task outside a confirmed park.""" @@ -357,41 +415,99 @@ def _step_down(client: temporalio.client.Client, transport: str) -> str: """A channel nobody writes to, described to learn whether the server has any.""" -async def server_has_channels(client: temporalio.client.Client) -> bool | None: - """Whether this client's server implements notification channels. +class ChannelSupport(enum.Enum): + """What a server offers a stream's readers, as :func:`channel_support` finds it.""" - Asked with a ``DescribeChannel`` of a channel nobody writes to, because the - one reader-side decision that depends on the answer is a command: a - Workflow Task that subscribes to a channel on a server without them fails, - and nothing in the wake path would ever tell the reader. A refusal is - remembered the way a refused notify is, so the writers on the same client - skip the call as well. + NONE = "none" + """No notification channels: readers are woken by the Signal.""" - Returns ``None`` when the server could not be asked, so the caller can ask - again later rather than settle on an answer the server never gave. + INDEPENDENT = "independent" + """Channels, each its own execution: readers subscribe to them by command.""" + + LINKED = "linked" + """Channels linked to a workflow as well: a workflow-owned stream's reader is + the channel's listener by construction, and only the other streams need + the command.""" + + +async def _describe_probe( + client: temporalio.client.Client, + workflow_id: str | None, +) -> temporalio.api.workflowservice.v1.DescribeChannelResponse | None: + """Describes the probe channel, or returns ``None`` for a server without channels. + + A refusal is remembered the way a refused notify is, so the writers on + the same client skip the call as well. Any other failure propagates for + the caller to decide what it means. """ if _best_transport(client) != "channel": - return False + return None service = getattr(client, "workflow_service", None) call = getattr(service, "describe_channel", None) if call is None: _step_down(client, "channel") - return False + return None + request = temporalio.api.workflowservice.v1.DescribeChannelRequest( + namespace=client.namespace, channel=PROBE_CHANNEL + ) + if workflow_id: + request.workflow_execution.workflow_id = workflow_id try: - await call( - temporalio.api.workflowservice.v1.DescribeChannelRequest( - namespace=client.namespace, channel=PROBE_CHANNEL - ) - ) + return await call(request) except temporalio.service.RPCError as err: if err.status == temporalio.service.RPCStatusCode.UNIMPLEMENTED: _step_down(client, "channel") - return False + return None + raise + + +async def server_has_channels(client: temporalio.client.Client) -> bool | None: + """Whether this client's server implements notification channels. + + Asked with a ``DescribeChannel`` of a channel nobody writes to, because the + one reader-side decision that depends on the answer is a command: a + Workflow Task that subscribes to a channel on a server without them fails, + and nothing in the wake path would ever tell the reader. + + Returns ``None`` when the server could not be asked, so the caller can ask + again later rather than settle on an answer the server never gave. + """ + try: + return await _describe_probe(client, None) is not None + except temporalio.service.RPCError as err: if err.status == temporalio.service.RPCStatusCode.NOT_FOUND: # The server knows the call and has never seen this channel. return True return None - return True + + +async def channel_support( + client: temporalio.client.Client, workflow_id: str +) -> ChannelSupport | None: + """What this client's server offers the readers of ``workflow_id``'s streams. + + Asked with a ``DescribeChannel`` of the probe channel linked to that + workflow, which has to be running: a linked channel of a running workflow + exists by construction, so a server with the kind describes it, with no + listeners and nothing retained, where a server with only independent + channels ignores the owner and answers ``NOT_FOUND`` for a name nobody has + notified, and a server without channels answers ``UNIMPLEMENTED``. + + The caller records the answer on the run's first task as a lang flag, so + a replay takes the same path whatever server replays it. Returns ``None`` + when the server could not be asked. + """ + try: + response = await _describe_probe(client, workflow_id) + except temporalio.service.RPCError as err: + if err.status == temporalio.service.RPCStatusCode.NOT_FOUND: + return ChannelSupport.INDEPENDENT + return None + if response is None: + return ChannelSupport.NONE + if response.kind == temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED: + return ChannelSupport.LINKED + return ChannelSupport.INDEPENDENT def wake_transport_of(backend: object) -> WakeTransport: @@ -444,13 +560,18 @@ def build_notify_request( Signal's derivation serves here unchanged: two producers waking one parked generation send the identical request, and a sender retrying an attempt that may have landed sends it again rather than waking twice. + + A channel with an owner is addressed to it, so a server with the linked + kind delivers to the owner's own channel; one without the kind ignores + the owner and serves the independent channel of the same name, which is + the one the reader subscribed to there. """ if not request.channel: raise ValueError( "a channel notification needs the stream's channel; compose the " "request with wake_request_for() or set WakeRequest.channel" ) - return temporalio.api.workflowservice.v1.NotifyChannelRequest( + notify = temporalio.api.workflowservice.v1.NotifyChannelRequest( namespace=request.namespace, notification=temporalio.api.notification.v1.Notification( channel=request.channel, @@ -461,6 +582,9 @@ def build_notify_request( identity=identity, request_id=wake_request_id(request), ) + if request.channel_workflow_id: + notify.workflow_execution.workflow_id = request.channel_workflow_id + return notify async def send_wake( @@ -551,6 +675,7 @@ def wake_request_for( becomes an unparked wake rather than no wake at all. The channel is the input stream's, which is the only direction a producer writes. """ + address = channel_for(workflow.stream_key(stream_name)) return WakeRequest( namespace=workflow.namespace, workflow_id=workflow.workflow_id, @@ -564,5 +689,6 @@ def wake_request_for( wake_counter=wake_counter, position=position, position_counter=position_counter, - channel=channel_for(workflow.stream_key(stream_name)), + channel=address.channel, + channel_workflow_id=address.workflow_id, ) diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 476b6edbc..f67a8ab5e 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -241,9 +241,10 @@ def __init__( self._stream_metrics = StreamMetrics.create(metric_meter) self._external_stream_manager: Any = None - #: Whether the Runs this Worker builds subscribe to their streams' - #: notification channels. ``None`` until the server has been asked. - self._channel_subscriptions: bool | None = None + #: How the Runs this Worker builds listen for their streams: by the + #: linked channel, the independent channel or the Signal. ``None`` + #: until the server has been asked. + self._channel_support: Any = None self._workflow_failure_exception_types = workflow_failure_exception_types self._patch_activation_callback = patch_activation_callback @@ -476,8 +477,8 @@ async def _handle_activation( if self._external_stream_manager is not None: self._external_stream_manager.note_workflow_task_started(act.run_id) - if self._external_streams_configured and self._channel_subscriptions is None: - await self._decide_channel_subscriptions() + if self._external_streams_configured and self._channel_support is None: + await self._decide_channel_subscriptions(act) # Build default success completion (e.g. remove-job-only activations) completion = ( @@ -1461,6 +1462,7 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: position, position_counter = wake_position( subscription.backend, read.offset if read is not None else None ) + address = channel_for(key) try: await send_wake( self._client, @@ -1482,7 +1484,8 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: wake_counter=subscription.wake_counter, position=position, position_counter=position_counter, - channel=channel_for(key), + channel=address.channel, + channel_workflow_id=address.workflow_id, ), transport=wake_transport_of(subscription.backend), ) @@ -1494,24 +1497,41 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: ) raise - async def _decide_channel_subscriptions(self) -> None: - """Turns the readers' channel subscriptions on when the server has channels. + async def _decide_channel_subscriptions( + self, act: temporalio.bridge.proto.workflow_activation.WorkflowActivation + ) -> None: + """Decides how the readers listen, from what the server offers. Decided once per Worker and before the Run is built, because the - decision is a lang flag the Run reads at construction. A probe that - cannot tell leaves the question open for the next activation; the Runs - built meanwhile do not subscribe, and their records still arrive by the - Signal. + decision is a pair of lang flags the Run reads at construction: one + for the independent channel and its subscribe command, one for the + channel linked to the stream's owner, which needs no command. The + linked kind shows only on a running workflow, so the probe asks about + the workflow whose first task this is. A probe that cannot tell, or an + activation without a start to name a workflow, leaves the question + open for the next activation; the Runs built meanwhile do not + subscribe, and their records still arrive by the Signal. """ from temporalio.contrib.external_workflow_streams._wake import ( - server_has_channels, + ChannelSupport, + channel_support, ) if self._client is None: - self._channel_subscriptions = False + self._channel_support = ChannelSupport.NONE + return + workflow_id = next( + ( + job.initialize_workflow.workflow_id + for job in act.jobs + if job.HasField("initialize_workflow") + ), + None, + ) + if not workflow_id: return try: - answer = await server_has_channels(self._client) + answer = await channel_support(self._client, workflow_id) except Exception: logger.warning( "Could not ask the server whether it has notification channels", @@ -1520,9 +1540,14 @@ async def _decide_channel_subscriptions(self) -> None: return if answer is None: return - self._channel_subscriptions = answer + self._channel_support = answer + self._set_default_workflow_logic_flag( + _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS, + enabled=answer is not ChannelSupport.NONE, + ) self._set_default_workflow_logic_flag( - _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS, enabled=answer + _WorkflowLogicFlag.LINKED_NOTIFICATION_CHANNELS, + enabled=answer is ChannelSupport.LINKED, ) def _create_external_stream_runtime( diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 1b0572f44..58a36ef92 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -351,9 +351,18 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: self._channel_subscriptions: dict[ str, temporalio.workflow.ChannelSubscription ] = {} - #: The gate's answer for this run, taken on the first stream subscription - #: and kept until continue-as-new; see ``subscribe_stream_channel``. + #: The channels linked to this workflow that the run listens on. No + #: command: the owner is the listener by construction, so the set only + #: tells a notification carrying ``linked_to`` from one nobody asked for. + self._linked_channels: set[str] = set() + self._linked_channel_subscriptions: dict[ + str, temporalio.workflow.ChannelSubscription + ] = {} + #: The gate's answers for this run, taken on the first stream + #: subscription and kept until continue-as-new; see + #: ``subscribe_stream_channel``. self._stream_channels_enabled: bool | None = None + self._stream_channels_linked = False self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False self._time_ns = 0 @@ -974,25 +983,34 @@ def _apply_notifications_received( ) -> None: """Hands the notifications this Workflow Task was woken with to their takers. - A public subscription gets them in arrival order. The external-stream - runtime only notes the latest position per channel: Core resolves the - parked waits itself when it hands over this job, live and on replay - alike, and the resolve job follows this one in the same activation, so - resuming here as well would wake every wait twice for one task. + A notification names the channel it came over and, for a channel + linked to this workflow, the owner in ``linked_to``; a public + subscription of the matching kind gets it in arrival order. The + external-stream runtime only notes the latest position per channel, + whichever kind carried it: Core resolves the parked waits itself when + it hands over this job, live and on replay alike, and the resolve job + follows this one in the same activation, so resuming here as well + would wake every wait twice for one task. """ for proto in job.notifications: - subscription = self._channel_subscriptions.get(proto.channel) + if proto.HasField("linked_to"): + subscriptions = self._linked_channel_subscriptions + listened = self._linked_channels + else: + subscriptions = self._channel_subscriptions + listened = self._subscribed_channels + subscription = subscriptions.get(proto.channel) if subscription is not None: subscription._deliver( temporalio.workflow.Notification._from_proto(proto) ) - elif proto.channel not in self._subscribed_channels: + elif proto.channel not in listened: # The server fans out to whatever listened at the time, so a - # channel this run never subscribed to is not the workflow's + # channel this run never asked for is not the workflow's # concern. logger.debug( - "Dropping a notification on channel %r, which this run has not " - "subscribed to", + "Dropping a notification on channel %r, which this run does " + "not listen on", proto.channel, ) if self._external_stream_runtime is not None: @@ -1009,20 +1027,38 @@ def workflow_subscribe_channel( self._channel_subscriptions[channel] = subscription return subscription - def subscribe_stream_channel(self, channel: str) -> bool: + def workflow_linked_channel( + self, channel: str + ) -> temporalio.workflow.ChannelSubscription: + existing = self._linked_channel_subscriptions.get(channel) + if existing is not None: + return existing + self._linked_channels.add(channel) + subscription = temporalio.workflow.ChannelSubscription(channel, linked=True) + self._linked_channel_subscriptions[channel] = subscription + return subscription + + def subscribe_stream_channel(self, address: Any) -> bool: """Makes this run a listener of an external stream's channel, when it can. The external-stream runtime's entry, gated where the public :py:func:`temporalio.workflow.subscribe_channel` is not: a reader opens on whatever server the Worker talks to, and a server without channels fails a Workflow Task that carries the command. The Worker asks the - server once and the answer becomes a lang flag, read here on the run's - first stream subscription and kept until continue-as-new, so a replay - emits the command exactly where the live run did. + server once and the answer becomes two lang flags, read here on the + run's first stream subscription and kept until continue-as-new, so a + replay takes the path the live run took. + + With the linked kind a stream owned by this workflow needs no command: + its channel lives in this run's state and the run is its listener by + construction, so the task that opens the reader can stay retained. + A stream with another owner, or no owner, listens on the independent + channel of its name by command. Returns whether the run listens on the channel after this call. """ - if channel in self._subscribed_channels: + channel: str = address.channel + if channel in self._subscribed_channels or channel in self._linked_channels: return True if self._read_only: return False @@ -1030,8 +1066,18 @@ def subscribe_stream_channel(self, channel: str) -> bool: self._stream_channels_enabled = self._workflow_logic_flag_enabled( _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS ) + if self._stream_channels_enabled: + self._stream_channels_linked = self._workflow_logic_flag_enabled( + _WorkflowLogicFlag.LINKED_NOTIFICATION_CHANNELS + ) if not self._stream_channels_enabled: return False + if ( + self._stream_channels_linked + and address.workflow_id == self._info.workflow_id + ): + self._linked_channels.add(channel) + return True self._issue_channel_subscription(channel) return True @@ -4711,6 +4757,10 @@ class _WorkflowLogicFlag(IntEnum): # Numbered away from the values upstream hands out in sequence, so a flag # the main SDK adds later cannot read a History written with this one. SUBSCRIBE_NOTIFICATION_CHANNELS = 100 + # Whether a stream this workflow owns listens on its linked channel, which + # needs no command, rather than subscribing to the independent one. Set + # with the flag above from the same probe and read with it. + LINKED_NOTIFICATION_CHANNELS = 101 # TODO: Enable PROCESS_WORKFLOW_ACTIVATION_JOBS_AS_SINGLE_BATCH by default after diff --git a/temporalio/workflow/__init__.py b/temporalio/workflow/__init__.py index 85b442364..edb054bd6 100644 --- a/temporalio/workflow/__init__.py +++ b/temporalio/workflow/__init__.py @@ -60,6 +60,7 @@ from ._channels import ( ChannelSubscription, Notification, + linked_channel, subscribe_channel, ) from ._context import ( @@ -259,6 +260,7 @@ "unsafe", "ChannelSubscription", "Notification", + "linked_channel", "subscribe_channel", "ChildWorkflowCancellationType", "ChildWorkflowConfig", diff --git a/temporalio/workflow/_channels.py b/temporalio/workflow/_channels.py index 8fd045519..8bd5224b8 100644 --- a/temporalio/workflow/_channels.py +++ b/temporalio/workflow/_channels.py @@ -5,9 +5,16 @@ A channel carries notifications, not data. A writer tells the channel's listeners that a source they consume has moved, and each listener reads the -source itself. A workflow that subscribes gets the notifications the server +source itself. A workflow that listens gets the notifications the server folded for it with each Workflow Task. They travel in History, so a replay sees the same ones at the same points. + +A channel comes in two kinds. An independent channel is its own execution, +named in the namespace; any number of workflows subscribe to it with +:func:`subscribe_channel`, which issues a command. A channel linked to a +workflow lives in that workflow's own state; the workflow is its listener by +construction and reads it with :func:`linked_channel`, which issues nothing. +Writers address a linked channel by the workflow id and the channel name. """ from __future__ import annotations @@ -21,7 +28,12 @@ import temporalio.api.notification.v1 from temporalio.workflow._context import _Runtime -__all__ = ["ChannelSubscription", "Notification", "subscribe_channel"] +__all__ = [ + "ChannelSubscription", + "Notification", + "linked_channel", + "subscribe_channel", +] @dataclass(frozen=True) @@ -55,6 +67,13 @@ class Notification: converter :py:func:`temporalio.workflow.payload_converter` returns. """ + linked_to: temporalio.api.common.v1.WorkflowExecution | None = None + """The workflow the channel is linked to, and the run that received this. + + ``None`` for a notification from an independent channel. A listener that + holds both kinds under one name tells them apart by it. + """ + @staticmethod def _from_proto( proto: temporalio.api.notification.v1.Notification, @@ -64,22 +83,24 @@ def _from_proto( position=proto.position, counter=proto.counter, metadata=dict(proto.metadata.items()), + linked_to=proto.linked_to if proto.HasField("linked_to") else None, ) class ChannelSubscription: """A workflow's subscription to one channel. - Prefer :func:`temporalio.workflow.subscribe_channel`. The subscription is - an async iterator over the notifications as they arrive, and - :meth:`receive` takes them one at a time. Notifications wait in arrival - order until taken. Two loops on one subscription share its buffer and - interleave. + Prefer :func:`temporalio.workflow.subscribe_channel` or + :func:`temporalio.workflow.linked_channel`. The subscription is an async + iterator over the notifications as they arrive, and :meth:`receive` takes + them one at a time. Notifications wait in arrival order until taken. Two + loops on one subscription share its buffer and interleave. """ - def __init__(self, channel: str) -> None: + def __init__(self, channel: str, *, linked: bool = False) -> None: """Prefer :func:`temporalio.workflow.subscribe_channel`.""" self._channel = channel + self._linked = linked self._pending: deque[Notification] = deque() self._waiters: deque[asyncio.Future[None]] = deque() @@ -88,6 +109,11 @@ def channel(self) -> str: """The channel this subscription is on.""" return self._channel + @property + def linked(self) -> bool: + """Whether the channel is linked to this workflow.""" + return self._linked + async def receive(self) -> Notification: """The next notification on this channel, waiting for one to arrive. @@ -142,3 +168,30 @@ def subscribe_channel(channel: str) -> ChannelSubscription: if not channel: raise ValueError("channel must not be empty") return _Runtime.current().workflow_subscribe_channel(channel) + + +def linked_channel(channel: str) -> ChannelSubscription: + """Read the channel named ``channel`` that is linked to this workflow. + + No command: the channel lives in this workflow's state and the workflow + is its listener by construction, so the first call needs no + :func:`temporalio.workflow.patched` gate. A second call for the same name + returns the subscription already open. Writers reach it with the + ``workflow_id`` argument of :py:meth:`temporalio.client.Client.notify_channel`, + and each Workflow Task carries the notifications the server folded for + it. The channel's state dies with the run: a successor after + continue-as-new starts with an empty one, under the same address. + + Needs a server with linked channels. On one without, a writer's + notification addressed to this workflow goes to the independent channel + of the same name, which this subscription does not hear. + + Args: + channel: Name of the channel, scoped to this workflow. + + Raises: + ValueError: ``channel`` is empty. + """ + if not channel: + raise ValueError("channel must not be empty") + return _Runtime.current().workflow_linked_channel(channel) diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 62674c251..d53ba79b2 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -479,6 +479,9 @@ async def workflow_start_nexus_operation( @abstractmethod def workflow_subscribe_channel(self, channel: str) -> ChannelSubscription: ... + @abstractmethod + def workflow_linked_channel(self, channel: str) -> ChannelSubscription: ... + @abstractmethod def workflow_time_ns(self) -> int: ... diff --git a/tests/contrib/external_workflow_streams/conftest.py b/tests/contrib/external_workflow_streams/conftest.py index db39230a5..252dc4747 100644 --- a/tests/contrib/external_workflow_streams/conftest.py +++ b/tests/contrib/external_workflow_streams/conftest.py @@ -12,6 +12,7 @@ import uuid from collections.abc import AsyncGenerator from dataclasses import dataclass +from typing import Any import pytest import pytest_asyncio @@ -31,6 +32,12 @@ def pytest_configure(config: pytest.Config) -> None: "needs_channel_server: the case needs a server that serves notification " "channels, named with -E host:port", ) + config.addinivalue_line( + "markers", + "needs_linked_server: the case needs a server that serves channels linked " + "to a workflow, named with -E host:port; the case skips itself on one " + "with only independent channels", + ) def pytest_collection_modifyitems( @@ -42,24 +49,54 @@ def pytest_collection_modifyitems( reason="needs a server that serves notification channels; name one with -E" ) for item in items: - if item.get_closest_marker("needs_channel_server"): + if item.get_closest_marker("needs_channel_server") or item.get_closest_marker( + "needs_linked_server" + ): item.add_marker(skip) +async def server_channel_support(client: Any) -> Any: + """What the server offers a stream's readers, as the Worker would find it. + + The linked kind shows only on a running workflow, so one is started on a + task queue nobody polls and asked about; the probe is the Worker's own. + """ + from temporalio.contrib.external_workflow_streams._wake import ( + ChannelSupport, + channel_support, + server_has_channels, + ) + + if not await server_has_channels(client): + return ChannelSupport.NONE + probe = uuid.uuid4().hex + handle = await client.start_workflow( + "ChannelSupportProbe", + id=f"channel-support-probe-{probe}", + task_queue=f"nobody-polls-{probe}", + ) + try: + return await channel_support(client, handle.id) + finally: + await handle.terminate() + + @pytest_asyncio.fixture # type: ignore[reportUntypedFunctionDecorator] async def first_task_retained(client: object) -> None: """Holds a case to servers where the task that opens a reader stays open. - On a server with notification channels that task carries the subscribe - command, which Core cannot retain or park, so a case built on a retained or - parked first task measures nothing there. + On a server whose channels are all independent that task carries the + subscribe command, which Core cannot retain or park, so a case built on a + retained or parked first task measures nothing there. With the linked + kind a workflow-owned stream needs no command and the task stays open, as + it does on a server without channels. """ - from temporalio.contrib.external_workflow_streams._wake import server_has_channels + from temporalio.contrib.external_workflow_streams._wake import ChannelSupport - if await server_has_channels(client): # type: ignore[arg-type] + if await server_channel_support(client) is ChannelSupport.INDEPENDENT: pytest.skip( "the subscribe command ends the task that opens the first reader; " - "the follow-up defers it to the leaving completion" + "the linked channel kind keeps it open" ) diff --git a/tests/contrib/external_workflow_streams/test_api.py b/tests/contrib/external_workflow_streams/test_api.py index 14748a165..0557ddb25 100644 --- a/tests/contrib/external_workflow_streams/test_api.py +++ b/tests/contrib/external_workflow_streams/test_api.py @@ -800,9 +800,9 @@ def test_a_subscription_asks_the_run_to_listen_on_its_streams_channel( runtime: FakeRuntime, workflow_instance: FakeInstance ) -> None: """Every ``subscribe()`` asks; the Run keeps it to one command per channel.""" - asked: list[str] = [] + asked: list[object] = [] - def subscribe_channel(channel: str) -> bool: + def subscribe_channel(channel: object) -> bool: asked.append(channel) return True diff --git a/tests/contrib/external_workflow_streams/test_wake.py b/tests/contrib/external_workflow_streams/test_wake.py index 9b7763459..7f7920e40 100644 --- a/tests/contrib/external_workflow_streams/test_wake.py +++ b/tests/contrib/external_workflow_streams/test_wake.py @@ -22,6 +22,7 @@ import pytest import temporalio.api.common.v1 +import temporalio.api.notification.v1 import temporalio.api.workflowservice.v1 import temporalio.bridge import temporalio.converter @@ -54,9 +55,12 @@ WAKE_SIGNAL_ENVELOPE_VERSION, WAKE_SIGNAL_MESSAGE_TYPE, WAKE_SIGNAL_NAME, + ChannelAddress, + ChannelSupport, WakeRequest, build_signal_request, channel_for, + channel_support, send_wake, send_wake_signal, server_has_channels, @@ -1843,11 +1847,14 @@ def __init__( refuse_channel: temporalio.service.RPCStatusCode | None = None, listeners: int = 1, describe: temporalio.service.RPCStatusCode | None = None, + linked: bool = False, ) -> None: super().__init__() self.refuse_channel = refuse_channel self.listeners = listeners self.describe_status = describe + #: Whether a describe addressed to a workflow finds its linked channel. + self.linked = linked self.notified: list = [] self.described: list = [] @@ -1863,10 +1870,17 @@ async def describe_channel(self, request): # type: ignore[no-untyped-def] self.described.append(request) if self.describe_status is not None: raise _rpc_error(self.describe_status) + if self.linked and request.HasField("workflow_execution"): + return temporalio.api.workflowservice.v1.DescribeChannelResponse( + kind=temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED, + linked_to=temporalio.api.common.v1.WorkflowExecution( + workflow_id=request.workflow_execution.workflow_id, run_id="run" + ), + ) return temporalio.api.workflowservice.v1.DescribeChannelResponse() -TOKENS_CHANNEL = channel_for(CHAIN.stream_key("tokens")) +TOKENS_CHANNEL = channel_for(CHAIN.stream_key("tokens")).channel def channel_request(**overrides) -> WakeRequest: # type: ignore[no-untyped-def] @@ -2041,11 +2055,25 @@ async def test_a_wake_reports_a_position_appended_outside_the_producer() -> None def test_the_channel_is_the_stream_identity_without_the_namespace() -> None: key = StreamKey("ns", "wf-1", "first-run-1", "tokens") - assert channel_for(key) == "external-stream/wf-1/first-run-1/input/tokens" + assert channel_for(key).channel == "external-stream/wf-1/first-run-1/input/tokens" # The server scopes a channel to the namespace of the call. assert channel_for(dataclasses.replace(key, namespace="other")) == channel_for(key) +def test_the_channel_is_linked_to_the_streams_workflow() -> None: + """A stream key names a chain, so its channel is the owner's, by id alone.""" + address = channel_for(StreamKey("ns", "wf-1", "first-run-1", "tokens")) + + assert address.workflow_id == "wf-1" + assert address.linked + execution = address.execution() + assert execution is not None + assert execution.workflow_id == "wf-1" and execution.run_id == "" + # A channel without an owner is addressed by name alone. + independent = ChannelAddress(channel="orders") + assert not independent.linked and independent.execution() is None + + def test_the_channel_tells_the_two_directions_apart() -> None: from temporalio.contrib.external_workflow_streams._backend import StreamDirection @@ -2060,7 +2088,7 @@ def test_a_slash_in_a_name_cannot_borrow_another_streams_segments() -> None: second = StreamKey("ns", "wf", "1/first-run-1", "tokens") assert channel_for(first) != channel_for(second) - assert channel_for(first).split("/")[1] == "wf%2F1" + assert channel_for(first).channel.split("/")[1] == "wf%2F1" def test_the_request_composed_for_a_chain_names_its_channel() -> None: @@ -2069,6 +2097,8 @@ def test_the_request_composed_for_a_chain_names_its_channel() -> None: ) assert composed.channel == TOKENS_CHANNEL + assert composed.channel_workflow_id == "wf-1" + assert composed.channel_address == channel_for(CHAIN.stream_key("tokens")) def test_the_channel_is_not_part_of_the_request_id() -> None: @@ -2204,6 +2234,59 @@ async def test_the_probe_leaves_an_unanswered_question_open() -> None: assert await server_has_channels(RecordingClient()) is False # type: ignore[arg-type] +@pytest.mark.asyncio +async def test_the_probe_finds_the_linked_kind_on_a_running_workflow() -> None: + """A running workflow's linked channel exists by construction, so describing + the probe channel as that workflow's is answered, kind and all.""" + client = ChannelServiceClient(linked=True) + + assert await channel_support(client, "wf-1") is ChannelSupport.LINKED # type: ignore[arg-type] + + [described] = client.described + assert described.namespace == "ns" + assert described.channel == PROBE_CHANNEL + assert described.workflow_execution.workflow_id == "wf-1" + assert described.workflow_execution.run_id == "" + + +@pytest.mark.asyncio +async def test_a_server_with_only_independent_channels_answers_not_found() -> None: + # The owner is ignored there, and the probe channel has never been notified. + client = ChannelServiceClient(describe=NOT_FOUND) + + assert await channel_support(client, "wf-1") is ChannelSupport.INDEPENDENT # type: ignore[arg-type] + # A describe answered without a kind is from a server that predates them. + assert ( + await channel_support(ChannelServiceClient(), "wf-1") # type: ignore[arg-type] + is ChannelSupport.INDEPENDENT + ) + + +@pytest.mark.asyncio +async def test_a_server_without_channels_is_remembered_by_the_three_way_probe() -> None: + client = ChannelServiceClient(describe=UNIMPLEMENTED) + + assert await channel_support(client, "wf-1") is ChannelSupport.NONE # type: ignore[arg-type] + + await send_wake(client, channel_request()) # type: ignore[arg-type] + assert client.notified == [], "the probe's answer was not shared with the writers" + assert len(client.sent) == 1 + assert await channel_support(client, "wf-1") is ChannelSupport.NONE # type: ignore[arg-type] + assert len(client.described) == 1, "a remembered answer was asked for again" + # A client whose service lacks the call has the answer in its shape. + assert await channel_support(RecordingClient(), "wf-1") is ChannelSupport.NONE # type: ignore[arg-type] + + +@pytest.mark.asyncio +async def test_the_three_way_probe_leaves_an_unanswered_question_open() -> None: + client = ChannelServiceClient(describe=UNAVAILABLE, linked=True) + + assert await channel_support(client, "wf-1") is None # type: ignore[arg-type] + + client.describe_status = None + assert await channel_support(client, "wf-1") is ChannelSupport.LINKED # type: ignore[arg-type] + + @pytest.mark.asyncio async def test_a_producer_notifies_the_channel_of_the_stream_it_appended_to() -> None: backend = MemoryStreamBackend() @@ -2213,7 +2296,10 @@ async def test_a_producer_notifies_the_channel_of_the_stream_it_appended_to() -> await topic.publish("hello") [notify] = client.notified - assert notify.notification.channel == channel_for(topic.stream_key) + assert notify.notification.channel == channel_for(topic.stream_key).channel + # The owner rides along, so a server with linked channels delivers to it. + assert notify.workflow_execution.workflow_id == "wf-1" + assert notify.workflow_execution.run_id == "" assert client.sent == [] diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index 2cc4d2a09..5fa5bc908 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -18,6 +18,7 @@ from collections.abc import Sequence from datetime import timedelta from pathlib import Path +from typing import Any import pytest @@ -25,7 +26,7 @@ import temporalio.api.enums.v1 import temporalio.converter from temporalio import workflow -from temporalio.client import Client +from temporalio.client import Client, WorkflowHandle from temporalio.contrib.external_workflow_streams._backend import StreamKey from temporalio.contrib.external_workflow_streams._errors import ( METRIC_DECODE, @@ -38,16 +39,17 @@ StreamRecord, ) from temporalio.contrib.external_workflow_streams._wake import ( + ChannelSupport, WakeRequest, channel_for, send_wake_signal, - server_has_channels, wake_request_id, ) from temporalio.runtime import MetricBuffer, Runtime, TelemetryConfig from temporalio.service import RPCError, RPCStatusCode from temporalio.testing import WorkflowEnvironment from temporalio.worker import Replayer, Worker +from tests.contrib.external_workflow_streams.conftest import server_channel_support from tests.contrib.external_workflow_streams.memory_backend import MemoryStreamBackend with workflow.unsafe.imports_passed_through(): @@ -1783,8 +1785,68 @@ async def test_an_outside_producer_wakes_the_reader_through_the_channel( subscription event and no Signal, and a cold replay of it emits the subscribe command where the live run did. """ - if not await server_has_channels(client): + support = await server_channel_support(client) + if support is ChannelSupport.NONE: pytest.skip("the server does not implement notification channels") + if support is ChannelSupport.LINKED: + pytest.skip("a workflow-owned stream listens on its linked channel there") + handle, key = await _consume_two_through_the_channel(client, backend) + events = [e async for e in handle.fetch_history_events()] + assert _signalled(events) == [], ( + "a Signal woke the reader, so the channel was not the transport" + ) + assert _subscribed(events) == [channel_for(key).channel] + notified = _notified(events) + assert notified, "no Workflow Task was scheduled with a notification" + assert {n.channel for n in notified} == {channel_for(key).channel} + assert not any(n.HasField("linked_to") for n in notified) + + result = await Replayer( + workflows=[TimerThenConsumeWorkflow], external_stream_backend=backend + ).replay_workflow(await handle.fetch_history()) + assert result.replay_failure is None, f"replay failed: {result.replay_failure}" + + +@pytest.mark.needs_linked_server +async def test_an_outside_producer_wakes_the_reader_through_its_linked_channel( + client: Client, backend: MemoryStreamBackend +) -> None: + """The linked kind end to end: no command, notify the owner, wake, replay. + + The stream's channel lives in the reading workflow's own state, so the + run subscribes to nothing: the task that opens the reader carries no + command, the watcher notifies the channel by the owner's id, and the task + the server schedules carries a notification naming the owner. History then + holds neither a Signal nor a subscription event, and a cold replay takes + the same path from the recorded flags. + """ + if await server_channel_support(client) is not ChannelSupport.LINKED: + pytest.skip("the server does not serve channels linked to a workflow") + handle, key = await _consume_two_through_the_channel(client, backend) + events = [e async for e in handle.fetch_history_events()] + assert _signalled(events) == [], ( + "a Signal woke the reader, so the channel was not the transport" + ) + assert _subscribed(events) == [], "the owner is the listener by construction" + notified = _notified(events) + assert notified, "no Workflow Task was scheduled with a notification" + assert {n.channel for n in notified} == {channel_for(key).channel} + assert {n.linked_to.workflow_id for n in notified} == {handle.id} + + result = await Replayer( + workflows=[TimerThenConsumeWorkflow], external_stream_backend=backend + ).replay_workflow(await handle.fetch_history()) + assert result.replay_failure is None, f"replay failed: {result.replay_failure}" + + +async def _consume_two_through_the_channel( + client: Client, backend: MemoryStreamBackend +) -> tuple[WorkflowHandle, StreamKey]: + """Runs the timer-then-consume shape with the channel asked for outright. + + The channel rather than ``auto``, so a step down to the Signal fails the + History checks of the caller instead of passing quietly. + """ backend.wake_transport = "channel" task_queue = f"tq-{uuid.uuid4()}" async with Worker( @@ -1811,30 +1873,27 @@ async def test_an_outside_producer_wakes_the_reader_through_the_channel( await publish(backend, key, ["second"]) assert await asyncio.wait_for(handle.result(), 60) == ["first", "second"] + return handle, key - events = [e async for e in handle.fetch_history_events()] - signals = [ + +def _signalled(events: Sequence[Any]) -> list[Any]: + return [ e for e in events if e.HasField("workflow_execution_signaled_event_attributes") ] - assert signals == [], ( - "a Signal woke the reader, so the channel was not the transport" - ) - subscribed = [ + + +def _subscribed(events: Sequence[Any]) -> list[str]: + return [ e.workflow_notification_channel_subscribed_event_attributes.channel for e in events if e.HasField("workflow_notification_channel_subscribed_event_attributes") ] - assert subscribed == [channel_for(key)] - notified = [ + + +def _notified(events: Sequence[Any]) -> list[Any]: + return [ notification for e in events if e.HasField("workflow_task_scheduled_event_attributes") for notification in e.workflow_task_scheduled_event_attributes.notifications ] - assert notified, "no Workflow Task was scheduled with a notification" - assert {n.channel for n in notified} == {channel_for(key)} - - result = await Replayer( - workflows=[TimerThenConsumeWorkflow], external_stream_backend=backend - ).replay_workflow(await handle.fetch_history()) - assert result.replay_failure is None, f"replay failed: {result.replay_failure}" From 93f9ac11ae195a3fa1626ae90187a5609abce0e1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:25:58 -0700 Subject: [PATCH 784/831] Addressed the client's channel calls to a workflow's linked channel. The five calls take workflow_id and run_id, the description reports the kind and the owner, and a notification names the workflow it is linked to. --- temporalio/client/__init__.py | 2 + temporalio/client/_channel.py | 28 +- temporalio/client/_client.py | 73 +++- temporalio/client/_impl.py | 97 +++-- temporalio/client/_interceptor.py | 15 + .../test_channels.py | 373 +++++++++++++++++- 6 files changed, 532 insertions(+), 56 deletions(-) diff --git a/temporalio/client/__init__.py b/temporalio/client/__init__.py index 53f7c433b..3f736f919 100644 --- a/temporalio/client/__init__.py +++ b/temporalio/client/__init__.py @@ -61,6 +61,7 @@ ) from ._channel import ( ChannelDescription, + ChannelKind, ChannelListener, ) from ._client import ( @@ -351,6 +352,7 @@ "Plugin", "Callback", "ChannelDescription", + "ChannelKind", "ChannelListener", "_ClientImpl", "_apply_headers", diff --git a/temporalio/client/_channel.py b/temporalio/client/_channel.py index 09d5e1d23..b83c032dd 100644 --- a/temporalio/client/_channel.py +++ b/temporalio/client/_channel.py @@ -5,13 +5,33 @@ from collections.abc import Sequence from dataclasses import dataclass from datetime import datetime, timezone +from enum import IntEnum +import temporalio.api.common.v1 import temporalio.api.notification.v1 from temporalio.workflow import Notification from ._callback import Callback -__all__ = ["ChannelDescription", "ChannelListener"] +__all__ = ["ChannelDescription", "ChannelKind", "ChannelListener"] + + +class ChannelKind(IntEnum): + """Where a channel lives, which decides how a call addresses it. + + .. warning:: + This API is experimental and unstable. + """ + + INDEPENDENT = int( + temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_INDEPENDENT + ) + """Its own execution, keyed by namespace and channel name. Any number of + workflows and callbacks listen to it.""" + + LINKED = int(temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED) + """Kept in one workflow's state, keyed by namespace, workflow id and channel + name. The owning workflow is its listener by construction.""" @dataclass(frozen=True) @@ -76,3 +96,9 @@ class ChannelDescription: retained_count: int """How many notifications the channel keeps for pollers.""" + + kind: ChannelKind | None = None + """Which kind of channel this is, or ``None`` from a server that predates the kinds.""" + + linked_to: temporalio.api.common.v1.WorkflowExecution | None = None + """The owner of a linked channel and the run that holds it; ``None`` otherwise.""" diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index f0fa8aaa9..985d68c91 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -2896,27 +2896,36 @@ async def notify_channel( position: bytes = b"", counter: int = 0, metadata: Mapping[str, Any] | None = None, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> int: """Notify the listeners of ``channel`` that a source they consume has moved. A workflow listening with :py:func:`temporalio.workflow.subscribe_channel` - runs a Workflow Task that carries the notification. The server folds - notifications per listener while one is pending, keeping the one with - the highest ``counter``, so a burst of writes costs a listener one task. + or :py:func:`temporalio.workflow.linked_channel` runs a Workflow Task + that carries the notification. The server folds notifications per + listener while one is pending, keeping the one with the highest + ``counter``, so a burst of writes costs a listener one task. .. warning:: This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel, scoped to the namespace, or to the + workflow when ``workflow_id`` is given. position: Where the source stands after the write, in the writer's own terms. Opaque to the server. counter: Orders notifications from this channel's writers. Derive it from ``position``, since only the source can order its positions. metadata: Details for the listener, such as which topic moved. Each value is encoded with the client's data converter. + workflow_id: Address the channel linked to this workflow instead of + the independent channel of that name. The workflow is the + listener by construction. + run_id: With ``workflow_id``, the run whose chain is addressed. Left + out, the chain's current run is addressed, as a Signal does. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -2930,6 +2939,8 @@ async def notify_channel( position=position, counter=counter, metadata=metadata, + workflow_id=workflow_id, + run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, ) @@ -2942,6 +2953,8 @@ async def poll_channel( after_counter: int = 0, wait: bool | timedelta = True, max_notifications: int = 100, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> list[temporalio.workflow.Notification]: @@ -2951,13 +2964,18 @@ async def poll_channel( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel, scoped to the namespace, or to the + workflow when ``workflow_id`` is given. after_counter: Only notifications with a counter above this one are returned. Pass the highest counter seen so far to page. wait: How long the server holds the call when nothing is retained above ``after_counter``. ``True`` waits up to :py:data:`DEFAULT_CHANNEL_POLL_WAIT`, ``False`` returns at once. max_notifications: Upper bound on the notifications returned. + workflow_id: Address the channel linked to this workflow instead of + the independent channel of that name. + run_id: With ``workflow_id``, the run whose chain is addressed. Left + out, the chain's current run is addressed. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -2977,6 +2995,8 @@ async def poll_channel( after_counter=after_counter, wait=wait_for, max_notifications=max_notifications, + workflow_id=workflow_id, + run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, ) @@ -2986,23 +3006,36 @@ async def describe_channel( self, channel: str, *, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> ChannelDescription: - """Describe ``channel``: its listeners and what it retains. + """Describe ``channel``: its kind, its listeners and what it retains. .. warning:: This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel, scoped to the namespace, or to the + workflow when ``workflow_id`` is given. + workflow_id: Describe the channel linked to this workflow instead of + the independent channel of that name. A running workflow's + linked channel exists by construction, so the description + says so even when nobody has notified it yet. + run_id: With ``workflow_id``, the run whose chain is addressed. Left + out, the chain's current run is addressed. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. """ return await self._impl.describe_channel( DescribeChannelInput( - channel=channel, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout + channel=channel, + workflow_id=workflow_id, + run_id=run_id, + rpc_metadata=rpc_metadata, + rpc_timeout=rpc_timeout, ) ) @@ -3011,6 +3044,8 @@ async def register_channel_listener( channel: str, callback: Callback, *, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> str: @@ -3023,8 +3058,15 @@ async def register_channel_listener( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel, scoped to the namespace, or to the + workflow when ``workflow_id`` is given. callback: The callback to invoke. + workflow_id: Listen on the channel linked to this workflow instead + of the independent channel of that name. The listener is kept + in the workflow's state and does not carry over to a + continue-as-new successor. + run_id: With ``workflow_id``, the run whose chain is addressed. Left + out, the chain's current run is addressed. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3036,6 +3078,8 @@ async def register_channel_listener( RegisterChannelListenerInput( channel=channel, callback=callback, + workflow_id=workflow_id, + run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, ) @@ -3046,6 +3090,8 @@ async def unregister_channel_listener( channel: str, listener_id: str, *, + workflow_id: str | None = None, + run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, rpc_timeout: timedelta | None = None, ) -> None: @@ -3055,8 +3101,13 @@ async def unregister_channel_listener( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace. + channel: Name of the channel, scoped to the namespace, or to the + workflow when ``workflow_id`` is given. listener_id: The id :py:meth:`register_channel_listener` returned. + workflow_id: The workflow whose linked channel the listener is on, + when it was registered with one. + run_id: With ``workflow_id``, the run whose chain is addressed. Left + out, the chain's current run is addressed. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3065,6 +3116,8 @@ async def unregister_channel_listener( UnregisterChannelListenerInput( channel=channel, listener_id=listener_id, + workflow_id=workflow_id, + run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, ) diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index bbab0b890..85cef534a 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -55,7 +55,7 @@ ActivityHandle, AsyncActivityIDReference, ) -from ._channel import ChannelDescription, ChannelListener +from ._channel import ChannelDescription, ChannelKind, ChannelListener from ._exceptions import ( AsyncActivityCancelledError, ScheduleAlreadyRunningError, @@ -144,6 +144,20 @@ from ._client import Client +def _address_channel(request: Any, workflow_id: str | None, run_id: str | None) -> None: + """Points a channel request at a workflow's linked channel, when one is named. + + Left unset, the request addresses the independent channel of that name. + """ + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id names a run of workflow_id, which is missing") + return + request.workflow_execution.workflow_id = workflow_id + if run_id is not None: + request.workflow_execution.run_id = run_id + + class _ClientImpl(OutboundInterceptor): # pyright: ignore[reportUnusedClass] def __init__(self, client: Client) -> None: # type: ignore # We are intentionally not calling the base class's __init__ here @@ -1714,16 +1728,15 @@ async def notify_channel(self, input: NotifyChannelInput) -> int: for key, value in (input.metadata or {}).items(): [payload] = await self._client.data_converter.encode([value]) notification.metadata[key].CopyFrom(payload) + req = temporalio.api.workflowservice.v1.NotifyChannelRequest( + namespace=self._client.namespace, + notification=notification, + identity=self._client.identity, + request_id=str(uuid.uuid4()), + ) + _address_channel(req, input.workflow_id, input.run_id) resp = await self._client.workflow_service.notify_channel( - temporalio.api.workflowservice.v1.NotifyChannelRequest( - namespace=self._client.namespace, - notification=notification, - identity=self._client.identity, - request_id=str(uuid.uuid4()), - ), - retry=True, - metadata=input.rpc_metadata, - timeout=input.rpc_timeout, + req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout ) return resp.listener_count @@ -1738,20 +1751,21 @@ async def poll_channel( ) if input.wait is not None: req.wait.FromTimedelta(input.wait) + _address_channel(req, input.workflow_id, input.run_id) resp = await self._client.workflow_service.poll_channel( req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout ) return [await self._notification_from_proto(n) for n in resp.notifications] async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescription: + req = temporalio.api.workflowservice.v1.DescribeChannelRequest( + namespace=self._client.namespace, channel=input.channel + ) + _address_channel(req, input.workflow_id, input.run_id) resp = await self._client.workflow_service.describe_channel( - temporalio.api.workflowservice.v1.DescribeChannelRequest( - namespace=self._client.namespace, channel=input.channel - ), - retry=True, - metadata=input.rpc_metadata, - timeout=input.rpc_timeout, + req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout ) + kinds = temporalio.api.notification.v1.ChannelKind return ChannelDescription( listeners=[ ChannelListener._from_proto(listener) for listener in resp.listeners @@ -1762,42 +1776,46 @@ async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescript else None ), retained_count=resp.retained_count, + kind=( + ChannelKind(resp.kind) + if resp.kind != kinds.CHANNEL_KIND_UNSPECIFIED + else None + ), + linked_to=resp.linked_to if resp.HasField("linked_to") else None, ) async def register_channel_listener( self, input: RegisterChannelListenerInput ) -> str: - resp = await self._client.workflow_service.register_channel_listener( - temporalio.api.workflowservice.v1.RegisterChannelListenerRequest( - namespace=self._client.namespace, - channel=input.channel, - callback=temporalio.api.common.v1.Callback( - nexus=temporalio.api.common.v1.Callback.Nexus( - url=input.callback.url, header=input.callback.headers - ) - ), - request_id=str(uuid.uuid4()), - identity=self._client.identity, + req = temporalio.api.workflowservice.v1.RegisterChannelListenerRequest( + namespace=self._client.namespace, + channel=input.channel, + callback=temporalio.api.common.v1.Callback( + nexus=temporalio.api.common.v1.Callback.Nexus( + url=input.callback.url, header=input.callback.headers + ) ), - retry=True, - metadata=input.rpc_metadata, - timeout=input.rpc_timeout, + request_id=str(uuid.uuid4()), + identity=self._client.identity, + ) + _address_channel(req, input.workflow_id, input.run_id) + resp = await self._client.workflow_service.register_channel_listener( + req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout ) return resp.listener_id async def unregister_channel_listener( self, input: UnregisterChannelListenerInput ) -> None: + req = temporalio.api.workflowservice.v1.UnregisterChannelListenerRequest( + namespace=self._client.namespace, + channel=input.channel, + listener_id=input.listener_id, + identity=self._client.identity, + ) + _address_channel(req, input.workflow_id, input.run_id) await self._client.workflow_service.unregister_channel_listener( - temporalio.api.workflowservice.v1.UnregisterChannelListenerRequest( - namespace=self._client.namespace, - channel=input.channel, - listener_id=input.listener_id, - identity=self._client.identity, - ), - retry=True, - metadata=input.rpc_metadata, - timeout=input.rpc_timeout, + req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout ) async def _notification_from_proto( @@ -1817,6 +1835,7 @@ async def _notification_from_proto( position=proto.position, counter=proto.counter, metadata=metadata, + linked_to=proto.linked_to if proto.HasField("linked_to") else None, ) async def _apply_headers( diff --git a/temporalio/client/_interceptor.py b/temporalio/client/_interceptor.py index 9270e577e..ef8d4e059 100644 --- a/temporalio/client/_interceptor.py +++ b/temporalio/client/_interceptor.py @@ -697,6 +697,9 @@ class NotifyChannelInput: metadata: Mapping[str, Any] | None rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" + run_id: str | None = None @dataclass @@ -713,6 +716,9 @@ class PollChannelInput: max_notifications: int rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" + run_id: str | None = None @dataclass @@ -726,6 +732,9 @@ class DescribeChannelInput: channel: str rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" + run_id: str | None = None @dataclass @@ -740,6 +749,9 @@ class RegisterChannelListenerInput: callback: Callback rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" + run_id: str | None = None @dataclass @@ -754,6 +766,9 @@ class UnregisterChannelListenerInput: listener_id: str rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None + workflow_id: str | None = None + """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" + run_id: str | None = None @dataclass diff --git a/tests/contrib/external_workflow_streams/test_channels.py b/tests/contrib/external_workflow_streams/test_channels.py index 6a5b4f1ec..cd8c8bf32 100644 --- a/tests/contrib/external_workflow_streams/test_channels.py +++ b/tests/contrib/external_workflow_streams/test_channels.py @@ -3,8 +3,10 @@ The workflow instance is driven with activations directly, the way Core drives it, because the dev server this chain tests against does not accept the subscribe command. The live cases at the end need a server that does and -skip otherwise. The external-stream runtime's own subscriptions, which go -through the same instance behind a gate, are covered beside the stream tests. +skip otherwise; the ones on the linked kind need a server with it. The +external-stream runtime's own subscriptions go through the same instance +behind a gate, which is driven here too, and are covered beside the stream +tests as well. """ from __future__ import annotations @@ -12,6 +14,7 @@ import asyncio import contextlib import uuid +from collections.abc import Iterable from datetime import datetime, timedelta, timezone from typing import Any @@ -19,19 +22,25 @@ import temporalio.api.common.v1 import temporalio.api.notification.v1 +import temporalio.api.workflowservice.v1 import temporalio.bridge.proto.workflow_activation import temporalio.bridge.proto.workflow_completion import temporalio.common import temporalio.converter from temporalio import workflow from temporalio.api.enums.v1 import EventType -from temporalio.client import Callback, Client +from temporalio.client import Callback, ChannelKind, Client +from temporalio.client._impl import _address_channel +from temporalio.contrib.external_workflow_streams._wake import ChannelAddress from temporalio.service import RPCError, RPCStatusCode from temporalio.worker._workflow_instance import ( UnsandboxedWorkflowRunner, WorkflowInstance, WorkflowInstanceDetails, + _WorkflowLogicFlag, ) +from temporalio.workflow._context import _Runtime +from tests.contrib.external_workflow_streams.conftest import server_channel_support from tests.helpers import assert_eventually, new_worker WorkflowActivation = temporalio.bridge.proto.workflow_activation.WorkflowActivation @@ -42,6 +51,18 @@ temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion ) Notification = temporalio.api.notification.v1.Notification +WorkflowExecution = temporalio.api.common.v1.WorkflowExecution +INDEPENDENT = _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS +LINKED = _WorkflowLogicFlag.LINKED_NOTIFICATION_CHANNELS + + +def _linked_to(notification: workflow.Notification) -> dict[str, str] | None: + if notification.linked_to is None: + return None + return { + "workflow_id": notification.linked_to.workflow_id, + "run_id": notification.linked_to.run_id, + } @workflow.defn @@ -91,10 +112,61 @@ async def run(self) -> None: workflow.subscribe_channel("") -def _instance(workflow_class: type) -> WorkflowInstance: +@workflow.defn +class ReceiveLinked: + """Reads its own linked channel and reports the first notification.""" + + @workflow.run + async def run(self, channel: str) -> dict[str, Any]: + subscription = workflow.linked_channel(channel) + assert subscription is workflow.linked_channel(channel) + assert subscription.linked + notification = await subscription.receive() + return { + "channel": notification.channel, + "counter": notification.counter, + "linked_to": _linked_to(notification), + } + + +@workflow.defn +class BothKinds: + """Listens on the independent and the linked channel of one name.""" + + @workflow.run + async def run(self, channel: str) -> list[str]: + independent = workflow.subscribe_channel(channel) + linked = workflow.linked_channel(channel) + seen: list[str] = [] + + async def take(kind: str, subscription: workflow.ChannelSubscription) -> None: + notification = await subscription.receive() + assert (notification.linked_to is not None) == (kind == "linked") + seen.append(kind) + + await asyncio.gather(take("independent", independent), take("linked", linked)) + return seen + + +@workflow.defn +class ListenOnStream: + """Asks the run to listen for a stream the way the stream runtime does.""" + + @workflow.run + async def run(self, channel: str, owner: str) -> bool: + instance: Any = _Runtime.current() + return instance.subscribe_stream_channel( + ChannelAddress(channel=channel, workflow_id=owner) + ) + + +def _instance( + workflow_class: type, flags: Iterable[_WorkflowLogicFlag] = () +) -> WorkflowInstance: """Build an instance the way the worker does, without a worker. Needs a running event loop, since the constructor puts the runtime on it. + ``flags`` are the lang flags the Worker would default on from its probe. """ defn = workflow._Definition.must_from_class(workflow_class) now = datetime.now(timezone.utc) @@ -137,11 +209,21 @@ def _instance(workflow_class: type) -> WorkflowInstance: patch_activation_callback=None, last_completion_result=temporalio.api.common.v1.Payloads(), last_failure=None, + default_workflow_logic_flags=frozenset(flags), ) ) -def _start(workflow_class: type, *args: Any) -> WorkflowActivation: +def _start( + workflow_class: type, + *args: Any, + recorded_flags: Iterable[_WorkflowLogicFlag] = (), +) -> WorkflowActivation: + """The run's first activation. + + With ``recorded_flags`` it is a replay, and those are the flags History + says the live run used. + """ job = WorkflowActivationJob() init = job.initialize_workflow init.workflow_type = workflow._Definition.must_from_class(workflow_class).name or "" @@ -149,7 +231,13 @@ def _start(workflow_class: type, *args: Any) -> WorkflowActivation: init.arguments.extend( temporalio.converter.PayloadConverter.default.to_payloads(args) ) - return WorkflowActivation(run_id="run", jobs=[job]) + recorded = [int(flag) for flag in recorded_flags] + return WorkflowActivation( + run_id="run", + jobs=[job], + is_replaying=bool(recorded), + available_internal_flags=recorded, + ) def _notified(*notifications: Notification) -> WorkflowActivation: @@ -234,6 +322,279 @@ async def test_an_empty_channel_name_is_refused(): assert "channel must not be empty" in completion.failed.failure.message +# --- the linked kind ---------------------------------------------------------- + + +def _linked(channel: str, counter: int, run_id: str = "run") -> Notification: + return Notification( + channel=channel, + counter=counter, + linked_to=WorkflowExecution(workflow_id="wf", run_id=run_id), + ) + + +async def test_a_linked_channel_issues_no_command_and_gets_its_notification(): + instance = _instance(ReceiveLinked) + completion = instance.activate(_start(ReceiveLinked, "orders")) + assert _subscribed(completion) == [] + assert not _completed(completion) + completion = instance.activate(_notified(_linked("orders", 7))) + assert _result(completion) == { + "channel": "orders", + "counter": 7, + "linked_to": {"workflow_id": "wf", "run_id": "run"}, + } + + +async def test_a_notification_without_an_owner_does_not_reach_the_linked_channel(): + instance = _instance(ReceiveLinked) + instance.activate(_start(ReceiveLinked, "orders")) + # The independent channel of the same name is somebody else's. + completion = instance.activate(_notified(Notification(channel="orders", counter=1))) + assert not _completed(completion) + assert _result(instance.activate(_notified(_linked("orders", 2))))["counter"] == 2 + + +async def test_the_two_kinds_under_one_name_are_told_apart_by_the_owner(): + instance = _instance(BothKinds) + completion = instance.activate(_start(BothKinds, "orders")) + assert _subscribed(completion) == ["orders"] + completion = instance.activate( + _notified(Notification(channel="orders", counter=1), _linked("orders", 1)) + ) + assert sorted(_result(completion)) == ["independent", "linked"] + + +async def test_a_linked_notification_nobody_asked_for_is_dropped(): + instance = _instance(ReceiveLinked) + instance.activate(_start(ReceiveLinked, "orders")) + completion = instance.activate(_notified(_linked("other", 9))) + assert completion.HasField("successful") + assert not _completed(completion) + + +def _used_flags(completion: WorkflowActivationCompletion) -> set[int]: + assert completion.HasField("successful"), completion.failed.failure.message + return set(completion.successful.used_internal_flags) + + +async def test_a_stream_the_run_owns_listens_on_its_linked_channel_without_a_command(): + """The three-way probe's answer, recorded on the first task as two flags.""" + instance = _instance(ListenOnStream, flags=[INDEPENDENT, LINKED]) + completion = instance.activate(_start(ListenOnStream, "external-stream/x", "wf")) + assert _result(completion) is True + assert _subscribed(completion) == [] + assert _used_flags(completion) == {int(INDEPENDENT), int(LINKED)} + + +async def test_a_stream_with_another_owner_subscribes_by_command_on_a_linked_server(): + # Both built before either runs: a completed run leaves no loop to build on. + another_owner = _instance(ListenOnStream, flags=[INDEPENDENT, LINKED]) + no_owner = _instance(ListenOnStream, flags=[INDEPENDENT, LINKED]) + completion = another_owner.activate( + _start(ListenOnStream, "external-stream/x", "other") + ) + assert _result(completion) is True + assert _subscribed(completion) == ["external-stream/x"] + # A stream nobody owns does the same. + completion = no_owner.activate(_start(ListenOnStream, "standalone/x", "")) + assert _subscribed(completion) == ["standalone/x"] + + +async def test_a_server_with_only_independent_channels_takes_the_command(): + instance = _instance(ListenOnStream, flags=[INDEPENDENT]) + completion = instance.activate(_start(ListenOnStream, "external-stream/x", "wf")) + assert _result(completion) is True + assert _subscribed(completion) == ["external-stream/x"] + assert _used_flags(completion) == {int(INDEPENDENT)} + + +async def test_a_server_without_channels_leaves_the_run_to_the_signal(): + instance = _instance(ListenOnStream) + completion = instance.activate(_start(ListenOnStream, "external-stream/x", "wf")) + assert _result(completion) is False + assert _subscribed(completion) == [] + assert _used_flags(completion) == set() + + +async def test_a_replay_takes_the_path_the_live_run_recorded(): + without_channels = _instance(ListenOnStream) + with_linked = _instance(ListenOnStream, flags=[INDEPENDENT, LINKED]) + # Replayed on a Worker that found no channels: the flags come from History. + completion = without_channels.activate( + _start( + ListenOnStream, + "external-stream/x", + "wf", + recorded_flags=[INDEPENDENT, LINKED], + ) + ) + assert _result(completion) is True + assert _subscribed(completion) == [] + # And a live run on a linked server replays the independent path it took. + completion = with_linked.activate( + _start(ListenOnStream, "external-stream/x", "wf", recorded_flags=[INDEPENDENT]) + ) + assert _result(completion) is True + assert _subscribed(completion) == ["external-stream/x"] + + +def test_a_channel_call_names_the_workflow_it_is_linked_to(): + request = temporalio.api.workflowservice.v1.DescribeChannelRequest(channel="c") + _address_channel(request, None, None) + assert not request.HasField("workflow_execution") + _address_channel(request, "wf", None) + assert ( + request.workflow_execution.workflow_id, + request.workflow_execution.run_id, + ) == ( + "wf", + "", + ) + _address_channel(request, "wf", "run") + assert request.workflow_execution.run_id == "run" + with pytest.raises(ValueError, match="workflow_id"): + _address_channel(request, None, "run") + + +async def test_the_client_describes_a_linked_channel_by_its_owner( + client: Client, monkeypatch: pytest.MonkeyPatch +): + described: list[temporalio.api.workflowservice.v1.DescribeChannelRequest] = [] + + async def describe(request, **kwargs): # type: ignore[no-untyped-def] + described.append(request) + return temporalio.api.workflowservice.v1.DescribeChannelResponse( + kind=temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED, + linked_to=WorkflowExecution(workflow_id="wf", run_id="run"), + latest=_linked("orders", 3), + ) + + monkeypatch.setattr(client.workflow_service, "describe_channel", describe) + description = await client.describe_channel( + "orders", workflow_id="wf", run_id="run" + ) + [request] = described + assert request.channel == "orders" + assert request.workflow_execution.workflow_id == "wf" + assert request.workflow_execution.run_id == "run" + assert description.kind is ChannelKind.LINKED + assert description.linked_to is not None + assert description.linked_to.workflow_id == "wf" + assert description.latest is not None + assert _linked_to(description.latest) == {"workflow_id": "wf", "run_id": "run"} + # A server that predates the kinds reports none. + monkeypatch.setattr( + client.workflow_service, + "describe_channel", + lambda request, **kwargs: _answer( # type: ignore[no-untyped-def] + temporalio.api.workflowservice.v1.DescribeChannelResponse() + ), + ) + description = await client.describe_channel("orders") + assert description.kind is None and description.linked_to is None + + +async def _answer(response: Any) -> Any: + return response + + +async def _require_linked(client: Client) -> None: + from temporalio.contrib.external_workflow_streams._wake import ChannelSupport + + if await server_channel_support(client) is not ChannelSupport.LINKED: + pytest.skip("the server does not serve channels linked to a workflow") + + +@pytest.mark.needs_linked_server +async def test_a_workflow_receives_a_notification_on_its_linked_channel(client: Client): + await _require_linked(client) + channel = f"orders-{uuid.uuid4()}" + worker = new_worker(client, ReceiveLinked) + running = asyncio.create_task(worker.run()) + handle = await client.start_workflow( + ReceiveLinked.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + try: + # The channel exists with the run: no listener to register, nothing + # retained yet, and the owner named. + description = await client.describe_channel(channel, workflow_id=handle.id) + assert description.kind is ChannelKind.LINKED + assert description.linked_to is not None + assert description.linked_to.workflow_id == handle.id + assert description.listeners == [] + assert description.latest is None + await client.notify_channel( + channel, position=b"1-0", counter=1, workflow_id=handle.id + ) + result = await asyncio.wait_for(handle.result(), 30) + assert (result["channel"], result["counter"]) == (channel, 1) + # The owner and the run that received it, so a listener holding both + # kinds under one name can route it. + assert result["linked_to"]["workflow_id"] == handle.id + assert result["linked_to"]["run_id"] + events = [event.event_type async for event in handle.fetch_history_events()] + assert ( + EventType.EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED not in events + ) + # The channel's state dies with the run. + with pytest.raises(RPCError) as closed: + await client.notify_channel(channel, counter=2, workflow_id=handle.id) + assert closed.value.status == RPCStatusCode.NOT_FOUND + finally: + with contextlib.suppress(RPCError): + await handle.terminate() + await asyncio.wait_for(worker.shutdown(), 15) + await running + + +@pytest.mark.needs_linked_server +async def test_a_linked_channel_retains_for_pollers_and_takes_callbacks(client: Client): + await _require_linked(client) + channel = f"orders-{uuid.uuid4()}" + # Nobody polls this queue, so the run stays open for the calls below. + handle = await client.start_workflow( + ReceiveLinked.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=f"nobody-polls-{uuid.uuid4()}", + ) + try: + callback = Callback(url="http://localhost:1/never-called", headers={}) + listener_id = await client.register_channel_listener( + channel, callback, workflow_id=handle.id + ) + description = await client.describe_channel(channel, workflow_id=handle.id) + assert [listener.listener_id for listener in description.listeners] == [ + listener_id + ] + assert description.listeners[0].callback == callback + await client.unregister_channel_listener( + channel, listener_id, workflow_id=handle.id + ) + description = await client.describe_channel(channel, workflow_id=handle.id) + assert description.listeners == [] + # The owner is woken, so a notify counts no registered listener but + # still retains for pollers. + await client.notify_channel( + channel, position=b"2-0", counter=2, workflow_id=handle.id + ) + polled = await client.poll_channel(channel, workflow_id=handle.id, wait=False) + assert [(n.counter, _linked_to(n) is not None) for n in polled] == [(2, True)] + description = await client.describe_channel(channel, workflow_id=handle.id) + assert description.latest is not None and description.latest.counter == 2 + # The independent channel of the same name is untouched. + with pytest.raises(RPCError) as untouched: + await client.describe_channel(channel) + assert untouched.value.status == RPCStatusCode.NOT_FOUND + finally: + with contextlib.suppress(RPCError): + await handle.terminate() + + @pytest.mark.needs_channel_server async def test_a_workflow_receives_a_client_notification(client: Client): channel = f"orders-{uuid.uuid4()}" From fb67a8f949e2e98ad44b5c08063fea50f2889821 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:29:48 -0700 Subject: [PATCH 785/831] Added a conformance case for a reader woken through its linked channel. --- tests/streams/conftest.py | 15 ++++- tests/streams/test_streams_conformance.py | 82 ++++++++++++++++++----- 2 files changed, 80 insertions(+), 17 deletions(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index b891540fc..53aa935bd 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -25,11 +25,22 @@ def pytest_configure(config: pytest.Config) -> None: "wakes_by_notification: the case needs an outside append to wake a parked " "workflow reader through the server", ) + config.addinivalue_line( + "markers", + "wakes_by_linked_notification: the case needs an outside append to wake a " + "parked workflow reader through the channel linked to its workflow", + ) config.addinivalue_line( "markers", "needs_channel_server: the case needs a server that serves notification " "channels, named with -E host:port", ) + config.addinivalue_line( + "markers", + "needs_linked_server: the case needs a server that serves channels linked " + "to a workflow, named with -E host:port; the case skips itself on one " + "with only independent channels", + ) #: The environments whose server the suite starts for itself. None of them @@ -46,5 +57,7 @@ def pytest_collection_modifyitems( reason="needs a server that serves notification channels; name one with -E" ) for item in items: - if item.get_closest_marker("needs_channel_server"): + if item.get_closest_marker("needs_channel_server") or item.get_closest_marker( + "needs_linked_server" + ): item.add_marker(skip) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 5e4408b62..de62a66fe 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -40,7 +40,7 @@ from temporalio.api.common.v1 import Payload from temporalio.client import Client from temporalio.common import RawValue -from temporalio.contrib.external_workflow_streams._wake import server_has_channels +from temporalio.contrib.external_workflow_streams._wake import ChannelSupport from temporalio.converter import ( DataConverter, ExternalStorage, @@ -69,6 +69,7 @@ from temporalio.streams._ref import RefHandle, open_ref from temporalio.streams.providers.memory import MemoryStreams from temporalio.testing import WorkflowEnvironment +from tests.contrib.external_workflow_streams.conftest import server_channel_support from tests.helpers import new_worker # Defined once and shared by every case, the way an application shares them @@ -109,6 +110,9 @@ class ProviderCase: wakes_by_notification: bool = False """An outside append wakes a parked workflow reader through the server, rather than the reader finding the record on a timer of its own.""" + wakes_by_linked_notification: bool = False + """The wake above reaches a workflow-owned stream's reader through the + channel linked to its workflow, so the reader subscribes to nothing.""" async def open( self, @@ -256,6 +260,7 @@ async def truncate(workflow_id: str, topic: str, keep: int) -> None: "truncates": lambda case: case.truncate is not None, "hosts_standalone_streams": lambda case: case.hosts_standalone_streams, "wakes_by_notification": lambda case: case.wakes_by_notification, + "wakes_by_linked_notification": lambda case: case.wakes_by_linked_notification, } @@ -900,8 +905,54 @@ async def test_an_outside_producer_wakes_the_reader_through_the_channel( notification. History then holds the subscription and no Signal. """ worker_client = case.client or client - if not await server_has_channels(worker_client): + support = await server_channel_support(worker_client) + if support is ChannelSupport.NONE: pytest.skip("the server does not implement notification channels") + if support is ChannelSupport.LINKED: + pytest.skip("a workflow-owned stream listens on its linked channel there") + handle = await _read_two_woken_from_outside(case, worker_client) + events = [e async for e in handle.fetch_history_events()] + assert _signalled(events) == [], ( + "a Signal woke the reader, so the channel was not the transport" + ) + subscribed = _subscribed(events) + assert len(subscribed) == 1, "the run subscribes once per channel" + notified = _notified(events) + assert notified, "no Workflow Task was scheduled with a notification" + assert {n.channel for n in notified} == set(subscribed) + assert not any(n.HasField("linked_to") for n in notified) + + +@pytest.mark.wakes_by_linked_notification +@pytest.mark.needs_linked_server +async def test_an_outside_producer_wakes_the_reader_through_its_linked_channel( + case: ProviderCase, client: Client +): + """The linked kind, on the public surface. + + The stream's channel lives in the reading workflow's own state, so the run + subscribes to nothing; the producer's append notifies the channel by the + owner's id, and the server wakes the owner with a Workflow Task whose + scheduled event carries the notification naming it. History then holds + neither a Signal nor a subscription. + """ + worker_client = case.client or client + if await server_channel_support(worker_client) is not ChannelSupport.LINKED: + pytest.skip("the server does not serve channels linked to a workflow") + handle = await _read_two_woken_from_outside(case, worker_client) + events = [e async for e in handle.fetch_history_events()] + assert _signalled(events) == [], ( + "a Signal woke the reader, so the channel was not the transport" + ) + assert _subscribed(events) == [], "the owner is the listener by construction" + notified = _notified(events) + assert notified, "no Workflow Task was scheduled with a notification" + assert {n.linked_to.workflow_id for n in notified} == {handle.id} + assert len({n.channel for n in notified}) == 1 + + +async def _read_two_woken_from_outside(case: ProviderCase, worker_client: Client): + """Runs the reader with two appends spaced past its idle timeout.""" plugins = [] if case.client is not None else [case.provider] workflow_id = new_workflow_id() async with new_worker(worker_client, ReadUntilFinished, plugins=plugins) as worker: @@ -917,28 +968,27 @@ async def test_an_outside_producer_wakes_the_reader_through_the_channel( await asyncio.sleep(2) await producer.finish() assert await asyncio.wait_for(handle.result(), 60) == [{"n": 1}, {"n": 2}] + return handle - events = [e async for e in handle.fetch_history_events()] - signalled = [ + +def _signalled(events: Sequence[Any]) -> list[Any]: + return [ e for e in events if e.HasField("workflow_execution_signaled_event_attributes") ] - assert signalled == [], ( - "a Signal woke the reader, so the channel was not the transport" - ) - subscribed = [ - e + + +def _subscribed(events: Sequence[Any]) -> list[str]: + return [ + e.workflow_notification_channel_subscribed_event_attributes.channel for e in events if e.HasField("workflow_notification_channel_subscribed_event_attributes") ] - assert len(subscribed) == 1, "the run subscribes once per channel" - notified = [ + + +def _notified(events: Sequence[Any]) -> list[Any]: + return [ notification for e in events if e.HasField("workflow_task_scheduled_event_attributes") for notification in e.workflow_task_scheduled_event_attributes.notifications ] - assert notified, "no Workflow Task was scheduled with a notification" - channel = subscribed[ - 0 - ].workflow_notification_channel_subscribed_event_attributes.channel - assert {n.channel for n in notified} == {channel} From 2a18a2d85b9ff4bb5fe2e79be2e3d2b46358804b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:31:59 -0700 Subject: [PATCH 786/831] Pinned Core at the linked-channel head and regenerated the clients. --- temporalio/api/workflow/v1/message_pb2.py | 68 +- .../v1/request_response_pb2.py | 1165 +++++++++-------- temporalio/bridge/sdk-core | 2 +- 3 files changed, 619 insertions(+), 616 deletions(-) diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index 032f2b2b5..e4f1ccc48 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -48,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x96\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -566,37 +566,37 @@ _NEWWORKFLOWEXECUTIONINFO._serialized_start = 6163 _NEWWORKFLOWEXECUTIONINFO._serialized_end = 7064 _CALLBACKINFO._serialized_start = 7067 - _CALLBACKINFO._serialized_end = 7837 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7541 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7557 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7559 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7612 - _CALLBACKINFO_TRIGGER._serialized_start = 7615 - _CALLBACKINFO_TRIGGER._serialized_end = 7837 - _PENDINGNEXUSOPERATIONINFO._serialized_start = 7840 - _PENDINGNEXUSOPERATIONINFO._serialized_end = 8619 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8622 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9010 - _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9013 - _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9240 - _VERSIONINGOVERRIDE._serialized_start = 9243 - _VERSIONINGOVERRIDE._serialized_end = 10005 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9608 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 9781 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 9783 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 9888 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 9890 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 9993 - _ONCONFLICTOPTIONS._serialized_start = 10007 - _ONCONFLICTOPTIONS._serialized_end = 10112 - _REQUESTIDINFO._serialized_start = 10114 - _REQUESTIDINFO._serialized_end = 10219 - _POSTRESETOPERATION._serialized_start = 10222 - _POSTRESETOPERATION._serialized_end = 10789 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10436 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10615 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10618 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10778 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10791 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10902 + _CALLBACKINFO._serialized_end = 7857 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7561 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7577 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7579 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7632 + _CALLBACKINFO_TRIGGER._serialized_start = 7635 + _CALLBACKINFO_TRIGGER._serialized_end = 7857 + _PENDINGNEXUSOPERATIONINFO._serialized_start = 7860 + _PENDINGNEXUSOPERATIONINFO._serialized_end = 8639 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8642 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9030 + _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9033 + _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9260 + _VERSIONINGOVERRIDE._serialized_start = 9263 + _VERSIONINGOVERRIDE._serialized_end = 10025 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9628 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 9801 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 9803 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 9908 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 9910 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 10013 + _ONCONFLICTOPTIONS._serialized_start = 10027 + _ONCONFLICTOPTIONS._serialized_end = 10132 + _REQUESTIDINFO._serialized_start = 10134 + _REQUESTIDINFO._serialized_end = 10239 + _POSTRESETOPERATION._serialized_start = 10242 + _POSTRESETOPERATION._serialized_end = 10809 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10456 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10635 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10638 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10798 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10811 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10922 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index 9804b7923..cc88e661f 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.nexusoperation.v1 import ( + message_pb2 as temporal_dot_api_dot_nexusoperation_dot_v1_dot_message__pb2, +) from temporalio.api.notification.v1 import ( message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, ) @@ -137,7 +140,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4348,598 +4351,598 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1728 - _REGISTERNAMESPACEREQUEST._serialized_end = 2376 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2333 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2376 - _REGISTERNAMESPACERESPONSE._serialized_start = 2378 - _REGISTERNAMESPACERESPONSE._serialized_end = 2405 - _LISTNAMESPACESREQUEST._serialized_start = 2408 - _LISTNAMESPACESREQUEST._serialized_end = 2545 - _LISTNAMESPACESRESPONSE._serialized_start = 2548 - _LISTNAMESPACESRESPONSE._serialized_end = 2677 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2679 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2762 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2765 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3278 - _UPDATENAMESPACEREQUEST._serialized_start = 3281 - _UPDATENAMESPACEREQUEST._serialized_end = 3616 - _UPDATENAMESPACERESPONSE._serialized_start = 3619 - _UPDATENAMESPACERESPONSE._serialized_end = 3910 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3912 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3982 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3984 - _DEPRECATENAMESPACERESPONSE._serialized_end = 4012 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4015 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5632 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5635 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5933 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5936 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6234 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6237 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6423 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6426 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6602 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6604 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6724 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8323 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8233 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8317 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8326 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9498 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9593 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9595 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9667 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9912 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9915 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10440 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10442 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10477 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10480 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10966 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10969 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12150 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12153 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12318 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12320 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12432 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12435 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12642 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12644 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12760 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12763 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13145 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13147 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13185 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13188 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13395 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13397 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13439 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13442 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13888 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13890 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13977 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13980 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14251 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14253 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14344 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14347 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14729 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14731 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14768 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14771 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15059 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15061 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15102 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15105 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15365 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15367 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15407 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15410 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15760 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 - _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16058 - _NOTIFYCHANNELRESPONSE._serialized_start = 16060 - _NOTIFYCHANNELRESPONSE._serialized_end = 16107 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16110 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16339 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16341 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16395 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16398 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16578 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16580 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16615 - _POLLCHANNELREQUEST._serialized_start = 16618 - _POLLCHANNELREQUEST._serialized_end = 16836 - _POLLCHANNELRESPONSE._serialized_start = 16838 - _POLLCHANNELRESPONSE._serialized_end = 16926 - _DESCRIBECHANNELREQUEST._serialized_start = 16929 - _DESCRIBECHANNELREQUEST._serialized_end = 17060 - _DESCRIBECHANNELRESPONSE._serialized_start = 17063 - _DESCRIBECHANNELRESPONSE._serialized_end = 17357 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17360 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18699 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18702 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18860 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18863 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19312 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19314 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19362 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19365 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19652 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19654 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19690 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19692 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19814 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19816 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19849 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19852 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20181 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20184 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20314 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20317 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20711 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20714 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20846 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20848 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20957 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20959 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21085 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21087 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21204 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21207 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21341 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21343 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21452 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21454 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21580 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21582 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21648 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21651 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21888 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21890 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21918 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21921 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22122 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22038 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22122 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22125 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22486 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22488 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22523 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22525 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22635 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22637 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22667 - _SHUTDOWNWORKERREQUEST._serialized_start = 22670 - _SHUTDOWNWORKERREQUEST._serialized_end = 22953 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22955 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22979 - _QUERYWORKFLOWREQUEST._serialized_start = 22982 - _QUERYWORKFLOWREQUEST._serialized_end = 23215 - _QUERYWORKFLOWRESPONSE._serialized_start = 23218 - _QUERYWORKFLOWRESPONSE._serialized_end = 23403 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24188 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24191 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24719 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24722 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25726 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25508 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25624 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25626 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25726 - _GETCLUSTERINFOREQUEST._serialized_start = 25728 - _GETCLUSTERINFOREQUEST._serialized_end = 25751 - _GETCLUSTERINFORESPONSE._serialized_start = 25754 - _GETCLUSTERINFORESPONSE._serialized_end = 26219 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26164 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26219 - _GETSYSTEMINFOREQUEST._serialized_start = 26221 - _GETSYSTEMINFOREQUEST._serialized_end = 26243 - _GETSYSTEMINFORESPONSE._serialized_start = 26246 - _GETSYSTEMINFORESPONSE._serialized_end = 26823 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26387 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26823 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26825 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26934 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26937 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27160 - _CREATESCHEDULEREQUEST._serialized_start = 27163 - _CREATESCHEDULEREQUEST._serialized_end = 27495 - _CREATESCHEDULERESPONSE._serialized_start = 27497 - _CREATESCHEDULERESPONSE._serialized_end = 27545 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27547 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27612 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27615 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27886 - _UPDATESCHEDULEREQUEST._serialized_start = 27889 - _UPDATESCHEDULEREQUEST._serialized_end = 28181 - _UPDATESCHEDULERESPONSE._serialized_start = 28183 - _UPDATESCHEDULERESPONSE._serialized_end = 28207 - _PATCHSCHEDULEREQUEST._serialized_start = 28210 - _PATCHSCHEDULEREQUEST._serialized_end = 28366 - _PATCHSCHEDULERESPONSE._serialized_start = 28368 - _PATCHSCHEDULERESPONSE._serialized_end = 28391 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28394 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28562 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28564 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28647 - _DELETESCHEDULEREQUEST._serialized_start = 28649 - _DELETESCHEDULEREQUEST._serialized_end = 28730 - _DELETESCHEDULERESPONSE._serialized_start = 28732 - _DELETESCHEDULERESPONSE._serialized_end = 28756 - _LISTSCHEDULESREQUEST._serialized_start = 28758 - _LISTSCHEDULESREQUEST._serialized_end = 28866 - _LISTSCHEDULESRESPONSE._serialized_start = 28868 - _LISTSCHEDULESRESPONSE._serialized_end = 28980 - _COUNTSCHEDULESREQUEST._serialized_start = 28982 - _COUNTSCHEDULESREQUEST._serialized_end = 29039 - _COUNTSCHEDULESRESPONSE._serialized_start = 29042 - _COUNTSCHEDULESRESPONSE._serialized_end = 29261 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29264 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29910 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29711 + _REGISTERNAMESPACEREQUEST._serialized_start = 1774 + _REGISTERNAMESPACEREQUEST._serialized_end = 2422 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2379 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2422 + _REGISTERNAMESPACERESPONSE._serialized_start = 2424 + _REGISTERNAMESPACERESPONSE._serialized_end = 2451 + _LISTNAMESPACESREQUEST._serialized_start = 2454 + _LISTNAMESPACESREQUEST._serialized_end = 2591 + _LISTNAMESPACESRESPONSE._serialized_start = 2594 + _LISTNAMESPACESRESPONSE._serialized_end = 2723 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2725 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2808 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2811 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3324 + _UPDATENAMESPACEREQUEST._serialized_start = 3327 + _UPDATENAMESPACEREQUEST._serialized_end = 3662 + _UPDATENAMESPACERESPONSE._serialized_start = 3665 + _UPDATENAMESPACERESPONSE._serialized_end = 3956 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3958 + _DEPRECATENAMESPACEREQUEST._serialized_end = 4028 + _DEPRECATENAMESPACERESPONSE._serialized_start = 4030 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4058 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4061 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5678 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5681 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5979 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5982 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6280 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6283 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6469 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6472 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6648 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6650 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6770 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6773 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7213 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7216 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8369 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8279 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8363 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8372 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9544 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9639 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9641 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9713 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9958 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9961 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10486 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10488 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10523 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10526 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11012 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11015 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12196 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12199 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12364 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12366 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12478 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12481 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12688 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12690 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12806 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12809 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13191 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13193 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13231 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13234 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13441 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13443 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13485 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13488 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13997 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13999 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14086 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14089 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14423 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14425 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14516 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14519 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14901 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14903 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14940 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14943 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15231 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15233 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15274 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15277 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15537 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15539 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15579 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15582 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15932 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15934 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 16011 + _NOTIFYCHANNELREQUEST._serialized_start = 16014 + _NOTIFYCHANNELREQUEST._serialized_end = 16230 + _NOTIFYCHANNELRESPONSE._serialized_start = 16232 + _NOTIFYCHANNELRESPONSE._serialized_end = 16279 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16282 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16511 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16513 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16567 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16570 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16750 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16752 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16787 + _POLLCHANNELREQUEST._serialized_start = 16790 + _POLLCHANNELREQUEST._serialized_end = 17008 + _POLLCHANNELRESPONSE._serialized_start = 17010 + _POLLCHANNELRESPONSE._serialized_end = 17098 + _DESCRIBECHANNELREQUEST._serialized_start = 17101 + _DESCRIBECHANNELREQUEST._serialized_end = 17232 + _DESCRIBECHANNELRESPONSE._serialized_start = 17235 + _DESCRIBECHANNELRESPONSE._serialized_end = 17529 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17532 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18871 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18874 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 19032 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 19035 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19484 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19486 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19534 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19537 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19824 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19826 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19862 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19864 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19986 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19988 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 20021 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 20024 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20353 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20356 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20486 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20489 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20883 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20886 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21018 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21020 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21129 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21131 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21257 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21259 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21376 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21379 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21513 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21515 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21624 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21626 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21752 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21754 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21820 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21823 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 22060 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 22062 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 22090 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 22093 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22294 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22210 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22294 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22297 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22658 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22660 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22695 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22697 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22807 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22809 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22839 + _SHUTDOWNWORKERREQUEST._serialized_start = 22842 + _SHUTDOWNWORKERREQUEST._serialized_end = 23125 + _SHUTDOWNWORKERRESPONSE._serialized_start = 23127 + _SHUTDOWNWORKERRESPONSE._serialized_end = 23151 + _QUERYWORKFLOWREQUEST._serialized_start = 23154 + _QUERYWORKFLOWREQUEST._serialized_end = 23387 + _QUERYWORKFLOWRESPONSE._serialized_start = 23390 + _QUERYWORKFLOWRESPONSE._serialized_end = 23575 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23577 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23692 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23695 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24360 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24363 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24891 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24894 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25898 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25578 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25678 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25680 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25796 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25798 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25898 + _GETCLUSTERINFOREQUEST._serialized_start = 25900 + _GETCLUSTERINFOREQUEST._serialized_end = 25923 + _GETCLUSTERINFORESPONSE._serialized_start = 25926 + _GETCLUSTERINFORESPONSE._serialized_end = 26391 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26336 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26391 + _GETSYSTEMINFOREQUEST._serialized_start = 26393 + _GETSYSTEMINFOREQUEST._serialized_end = 26415 + _GETSYSTEMINFORESPONSE._serialized_start = 26418 + _GETSYSTEMINFORESPONSE._serialized_end = 26995 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26559 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26995 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26997 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27106 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27109 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27332 + _CREATESCHEDULEREQUEST._serialized_start = 27335 + _CREATESCHEDULEREQUEST._serialized_end = 27667 + _CREATESCHEDULERESPONSE._serialized_start = 27669 + _CREATESCHEDULERESPONSE._serialized_end = 27717 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27719 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27784 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27787 + _DESCRIBESCHEDULERESPONSE._serialized_end = 28058 + _UPDATESCHEDULEREQUEST._serialized_start = 28061 + _UPDATESCHEDULEREQUEST._serialized_end = 28353 + _UPDATESCHEDULERESPONSE._serialized_start = 28355 + _UPDATESCHEDULERESPONSE._serialized_end = 28379 + _PATCHSCHEDULEREQUEST._serialized_start = 28382 + _PATCHSCHEDULEREQUEST._serialized_end = 28538 + _PATCHSCHEDULERESPONSE._serialized_start = 28540 + _PATCHSCHEDULERESPONSE._serialized_end = 28563 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28566 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28734 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28736 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28819 + _DELETESCHEDULEREQUEST._serialized_start = 28821 + _DELETESCHEDULEREQUEST._serialized_end = 28902 + _DELETESCHEDULERESPONSE._serialized_start = 28904 + _DELETESCHEDULERESPONSE._serialized_end = 28928 + _LISTSCHEDULESREQUEST._serialized_start = 28930 + _LISTSCHEDULESREQUEST._serialized_end = 29038 + _LISTSCHEDULESRESPONSE._serialized_start = 29040 + _LISTSCHEDULESRESPONSE._serialized_end = 29152 + _COUNTSCHEDULESREQUEST._serialized_start = 29154 + _COUNTSCHEDULESREQUEST._serialized_end = 29211 + _COUNTSCHEDULESRESPONSE._serialized_start = 29214 + _COUNTSCHEDULESRESPONSE._serialized_end = 29433 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29436 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30082 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29883 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29822 + 29994 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29824 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29897 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29912 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29976 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29978 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30073 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30075 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30191 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30194 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31911 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31246 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29996 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30069 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30084 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30148 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30150 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30245 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30247 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30363 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30366 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32083 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31418 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31359 + 31531 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31362 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31534 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31491 + 31663 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31493 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31665 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31557 + 31729 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31559 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31665 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31667 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31777 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31779 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31841 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31843 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31898 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31914 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32166 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32168 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32240 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32243 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32492 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32495 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32651 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32653 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32767 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32770 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33031 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33034 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33293 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33296 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34662 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34664 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34693 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34695 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34791 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34793 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34821 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34823 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34889 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34892 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35364 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35366 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35457 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35459 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35580 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35583 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35768 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35771 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35990 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35993 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36409 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36412 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36766 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36769 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36936 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36938 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36973 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36976 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37196 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37198 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37230 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37233 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37605 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37399 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37605 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37608 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37940 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37734 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37940 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37943 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38279 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38282 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38601 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38603 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38703 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38705 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38814 - _PAUSEACTIVITYREQUEST._serialized_start = 38817 - _PAUSEACTIVITYREQUEST._serialized_end = 39016 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39019 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39202 - _PAUSEACTIVITYRESPONSE._serialized_start = 39204 - _PAUSEACTIVITYRESPONSE._serialized_end = 39227 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39229 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39261 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39264 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39544 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39547 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39820 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39822 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39847 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39849 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39883 - _RESETACTIVITYREQUEST._serialized_start = 39886 - _RESETACTIVITYREQUEST._serialized_end = 40193 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40196 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40486 - _RESETACTIVITYRESPONSE._serialized_start = 40488 - _RESETACTIVITYRESPONSE._serialized_end = 40511 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40513 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40545 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40548 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40832 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40835 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41012 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41014 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41120 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41122 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41219 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41222 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41416 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41419 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42071 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41680 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42071 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42073 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42150 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42153 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42293 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42295 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42403 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42405 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42524 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42527 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42732 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42735 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42920 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42923 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43152 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43155 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43346 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43349 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43598 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43601 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43825 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43827 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43940 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43942 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43998 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44000 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44093 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44096 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44767 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44271 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44767 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44770 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45010 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45012 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45051 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45054 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45254 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45256 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45295 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45297 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45390 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45392 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45424 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45427 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45943 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45945 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45997 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46000 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46500 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46502 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46556 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46559 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46977 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46892 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31731 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31837 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31839 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31949 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31951 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 32013 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 32015 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32070 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32086 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32338 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32340 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32412 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32415 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32664 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32667 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32823 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32825 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32939 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32942 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33203 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33206 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33465 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33468 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34834 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34836 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34865 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34867 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34963 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34965 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34993 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34995 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35061 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35064 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35536 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35538 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35629 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35631 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35752 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35755 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35940 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35943 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36162 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36165 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36581 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36584 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36938 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36941 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37108 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37110 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37145 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37148 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37368 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37370 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37402 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37405 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37777 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37571 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37777 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37780 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38112 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37906 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38112 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38115 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38451 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38454 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38773 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38775 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38875 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38877 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38986 + _PAUSEACTIVITYREQUEST._serialized_start = 38989 + _PAUSEACTIVITYREQUEST._serialized_end = 39188 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39191 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39374 + _PAUSEACTIVITYRESPONSE._serialized_start = 39376 + _PAUSEACTIVITYRESPONSE._serialized_end = 39399 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39401 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39433 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39436 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39716 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39719 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39992 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39994 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 40019 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 40021 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40055 + _RESETACTIVITYREQUEST._serialized_start = 40058 + _RESETACTIVITYREQUEST._serialized_end = 40365 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40368 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40658 + _RESETACTIVITYRESPONSE._serialized_start = 40660 + _RESETACTIVITYRESPONSE._serialized_end = 40683 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40685 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40717 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40720 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 41004 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 41007 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41184 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41186 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41292 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41294 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41391 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41394 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41588 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41591 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42243 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41852 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42243 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25578 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25678 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42245 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42322 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42325 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42465 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42467 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42575 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42577 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42696 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42699 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42904 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42907 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43092 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43095 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43324 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43327 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43518 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43521 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43770 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43773 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43997 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43999 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44112 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44114 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44170 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44172 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44265 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44268 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44939 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44443 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44939 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44942 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45182 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45184 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45223 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45226 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45426 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45428 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45467 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45469 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45562 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45564 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45596 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45599 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46115 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45992 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46115 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46117 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46169 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46172 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46672 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45992 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46115 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46674 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46728 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46731 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47149 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47064 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 46977 + 47149 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46979 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47089 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47092 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47281 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47283 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47382 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47384 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47453 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47455 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47562 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47564 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47677 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47680 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47907 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47910 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48090 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48092 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48187 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48189 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48254 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48256 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48337 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48339 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48402 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48404 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48432 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48434 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48504 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48506 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48610 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48613 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48819 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48821 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48867 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48870 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49025 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49027 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49058 - _LISTWORKERSREQUEST._serialized_start = 49061 - _LISTWORKERSREQUEST._serialized_end = 49191 - _LISTWORKERSRESPONSE._serialized_start = 49194 - _LISTWORKERSRESPONSE._serialized_end = 49359 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49362 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50087 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49929 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50020 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47151 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47261 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47264 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47453 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47455 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47554 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47556 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47625 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47627 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47734 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47736 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47849 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47852 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48079 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 48082 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48262 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48264 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48359 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48361 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48426 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48428 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48509 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48511 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48574 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48576 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48604 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48606 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48676 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48678 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48782 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48785 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48991 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48993 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 49039 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 49042 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49197 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49199 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49230 + _LISTWORKERSREQUEST._serialized_start = 49233 + _LISTWORKERSREQUEST._serialized_end = 49363 + _LISTWORKERSRESPONSE._serialized_start = 49366 + _LISTWORKERSRESPONSE._serialized_end = 49531 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49534 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50259 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50101 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50192 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50022 + 50194 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50087 + 50259 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50089 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50180 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50183 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50341 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50343 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50428 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50431 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50697 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50699 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50799 - _DESCRIBEWORKERREQUEST._serialized_start = 50801 - _DESCRIBEWORKERREQUEST._serialized_end = 50872 - _DESCRIBEWORKERRESPONSE._serialized_start = 50874 - _DESCRIBEWORKERRESPONSE._serialized_end = 50955 - _COUNTWORKERSREQUEST._serialized_start = 50957 - _COUNTWORKERSREQUEST._serialized_end = 51044 - _COUNTWORKERSRESPONSE._serialized_start = 51046 - _COUNTWORKERSRESPONSE._serialized_end = 51083 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51086 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51227 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51229 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51261 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51264 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51407 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51409 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51443 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51446 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52623 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52625 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52734 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52737 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52965 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52968 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53284 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53286 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53372 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53374 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53490 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53492 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53601 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53604 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53734 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53737 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54586 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54536 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54586 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54588 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54659 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54662 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54832 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54835 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55146 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55149 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55310 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55313 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55574 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55576 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55691 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55694 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55833 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55835 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55901 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55904 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56141 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56143 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56215 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56218 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56467 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56470 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56619 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56621 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56661 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56664 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56809 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56811 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56847 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56849 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56937 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56939 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56975 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57131 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57133 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57179 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57182 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57334 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57336 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57378 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57380 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57475 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57477 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57516 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57519 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57676 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57679 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57911 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50261 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50352 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50355 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50513 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50515 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50600 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50603 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50869 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50871 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50971 + _DESCRIBEWORKERREQUEST._serialized_start = 50973 + _DESCRIBEWORKERREQUEST._serialized_end = 51044 + _DESCRIBEWORKERRESPONSE._serialized_start = 51046 + _DESCRIBEWORKERRESPONSE._serialized_end = 51127 + _COUNTWORKERSREQUEST._serialized_start = 51129 + _COUNTWORKERSREQUEST._serialized_end = 51216 + _COUNTWORKERSRESPONSE._serialized_start = 51218 + _COUNTWORKERSRESPONSE._serialized_end = 51255 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51258 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51399 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51401 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51433 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51436 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51579 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51581 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51615 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51618 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52795 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52797 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52906 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52909 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53137 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53140 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53456 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53458 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53544 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53546 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53662 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53664 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53773 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53776 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53906 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53909 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54947 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54897 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54947 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54949 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55020 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55023 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55193 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55196 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55583 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55586 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55747 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55750 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56011 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56013 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56128 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56131 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56270 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 56272 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56338 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56341 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56578 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56580 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56652 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56655 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56904 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56907 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 57056 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 57058 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 57098 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 57101 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 57246 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 57248 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 57284 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 57286 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57374 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57376 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57409 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57412 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57568 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57570 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57616 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57619 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57771 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57773 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57815 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57817 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57912 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57914 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57953 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57956 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 58113 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 58116 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58348 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 0c21f1c0f..005721848 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 0c21f1c0f637acc056660f49db1c0214a8e0d85c +Subproject commit 00572184848dd86ef425ec1320df6c514beb4946 From 401616e352012cffc9c324b4077b1cbeedeeccd5 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:33:09 -0700 Subject: [PATCH 787/831] Covered the Redis reader woken through its linked channel. The provider passes the owner through the shared channel address, so nothing changes in it beyond the transport's documentation; the live channel case gains a linked variant and the case on the removed transport goes. --- temporalio/streams/providers/redis.py | 14 +- tests/streams/test_redis_provider.py | 5 +- tests/streams/test_redis_replay.py | 182 +++++++++------------- tests/streams/test_streams_conformance.py | 7 +- 4 files changed, 93 insertions(+), 115 deletions(-) diff --git a/temporalio/streams/providers/redis.py b/temporalio/streams/providers/redis.py index 6a138d969..4171bac6d 100644 --- a/temporalio/streams/providers/redis.py +++ b/temporalio/streams/providers/redis.py @@ -1961,12 +1961,14 @@ def __init__( is trimmed before its commit; a batch at or above it is refused where it is staged. wake_transport: How a producer and a worker wake a workflow after - an append. ``"channel"`` notifies the stream's channel, which - wakes every subscribed reader with the entry id as the - position; ``"wake"`` uses the server's deprecated wake call; - ``"signal"`` uses the reserved Signal, which writes a History - event; ``"auto"`` tries them in that order and steps down on - a server without the call. + an append. ``"channel"`` notifies the stream's channel with + the entry id as the position: on a server with channels + linked to a workflow the channel lives in the reading + workflow's own state and nothing subscribes, on one with + independent channels every subscribed reader is woken. + ``"signal"`` uses the reserved Signal, which writes a + History event. ``"auto"`` notifies the channel and steps + down to the Signal on a server without channels. """ # Checked against the alias so an untyped caller still gets a ValueError. if wake_transport not in get_args(WakeTransport): diff --git a/tests/streams/test_redis_provider.py b/tests/streams/test_redis_provider.py index 4a2da97f3..3a3ee0870 100644 --- a/tests/streams/test_redis_provider.py +++ b/tests/streams/test_redis_provider.py @@ -166,8 +166,9 @@ async def test_a_wake_refused_for_another_reason_for_the_whole_window_is_raised( @pytest.mark.usefixtures("quick_wake_retries") async def test_a_wake_refused_as_not_found_ends_without_a_describe(): - # The wake call names the chain's first run, so the server's NOT_FOUND - # already says the chain has ended. + # The server answers NOT_FOUND for a chain that has ended, whether the + # wake went as a Signal or to the owner's linked channel, so nothing is + # left to describe. client = _ChainClient(WorkflowExecutionStatus.RUNNING) refusal = WakeNotAcknowledgedError("gone", pending=[]) refusal.__cause__ = RPCError("gone", RPCStatusCode.NOT_FOUND, b"") diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 8951d1a2f..78155f56b 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -138,75 +138,6 @@ async def read_everything() -> list[Any]: assert all(r.producer_id == "model" and r.attempt == 1 for r in inputs) -async def _serves_wakes(client: Client) -> bool: - """Whether the server implements the wake call, probed with a wake to nobody.""" - import temporalio.api.common.v1 - import temporalio.api.workflow.v1 - import temporalio.api.workflowservice.v1 - from temporalio.service import RPCError, RPCStatusCode - - try: - await client.workflow_service.wake_workflow_execution( - temporalio.api.workflowservice.v1.WakeWorkflowExecutionRequest( - namespace=client.namespace, - workflow_execution=temporalio.api.common.v1.WorkflowExecution( - workflow_id=f"streams-redis-probe-{uuid.uuid4().hex}" - ), - wake=temporalio.api.workflow.v1.Wake(source="probe", counter=1), - ) - ) - except RPCError as error: - return error.status != RPCStatusCode.UNIMPLEMENTED - return True - - -async def test_an_outside_producer_wakes_the_reader_without_a_signal( - live_client: Client, -): - if not await _serves_wakes(live_client): - pytest.skip("the server does not implement WakeWorkflowExecution") - # The wake transport rather than "auto", so a fallback to the Signal fails - # the History check below instead of passing quietly. - provider = RedisStreams( - url=redis_url(), - key_prefix=f"streams-redis-{uuid.uuid4().hex}", - wake_transport="wake", - ) - workflow_id = f"streams-redis-wake-{uuid.uuid4().hex}" - try: - async with Worker( - live_client, - task_queue=f"tq-{workflow_id}", - workflows=[ContractLoop], - plugins=[provider], - max_cached_workflows=100, - ): - handle = await live_client.start_workflow( - ContractLoop.run, id=workflow_id, task_queue=f"tq-{workflow_id}" - ) - stream = provider.get_stream_handle(live_client, workflow_id) - producer = stream.producer(topic=INPUTS, producer_id="model", attempt=1) - # Spaced past the reader's idle timeout, so the reader parks between - # appends and only a wake from outside can move it. - for n in (1, 2, 3): - await producer.append({"n": n}) - await asyncio.sleep(2) - await producer.finish() - - result = await asyncio.wait_for(handle.result(), 60) - assert [entry.get("n") for entry in result[:3]] == [1, 2, 3] - assert result[3] == {"kind": "finish", "producer": "model"} - - signalled = [ - event - async for event in handle.fetch_history_events() - if event.HasField("workflow_execution_signaled_event_attributes") - ] - assert signalled == [] - finally: - await provider.close() - - async def test_an_outside_producer_and_the_workflow_share_a_topic( live_client: Client, provider: RedisStreams ): @@ -1329,23 +1260,64 @@ async def stage_output(self, manifest: Any, records: Any) -> Any: await provider.close() -async def _serves_channels(client: Client) -> bool: - """Whether the server implements notification channels, asked of a probe channel.""" - from temporalio.contrib.external_workflow_streams._wake import server_has_channels +async def _channel_support(client: Client) -> Any: + """What the server offers the readers: no channels, independent ones or linked ones.""" + from tests.contrib.external_workflow_streams.conftest import server_channel_support - return bool(await server_has_channels(client)) + return await server_channel_support(client) @pytest.mark.needs_channel_server async def test_an_outside_producer_wakes_the_reader_through_the_channel( live_client: Client, ): - if not await _serves_channels(live_client): + from temporalio.contrib.external_workflow_streams._wake import ChannelSupport + + support = await _channel_support(live_client) + if support is ChannelSupport.NONE: pytest.skip("the server does not implement notification channels") + if support is ChannelSupport.LINKED: + pytest.skip("a workflow-owned stream listens on its linked channel there") + events = await _consume_three_through_the_channel(live_client) + subscribed = _subscribed(events) + assert len(subscribed) == 1, "the run subscribes once per channel" + notified = _notified(events) + assert {n.channel for n in notified} == set(subscribed) + assert not any(n.HasField("linked_to") for n in notified) + + +@pytest.mark.needs_linked_server +async def test_an_outside_producer_wakes_the_reader_through_its_linked_channel( + live_client: Client, +): + """The stream's channel is the reading workflow's own, so nothing subscribes.""" + from temporalio.contrib.external_workflow_streams._wake import ChannelSupport + + if await _channel_support(live_client) is not ChannelSupport.LINKED: + pytest.skip("the server does not serve channels linked to a workflow") + events = await _consume_three_through_the_channel(live_client) + assert _subscribed(events) == [], "the owner is the listener by construction" + notified = _notified(events) + assert len({n.channel for n in notified}) == 1 + [workflow_id] = { + e.workflow_execution_started_event_attributes.workflow_id + for e in events + if e.HasField("workflow_execution_started_event_attributes") + } or {""} + assert {n.linked_to.workflow_id for n in notified} == {workflow_id} + + +async def _consume_three_through_the_channel(live_client: Client) -> list[Any]: + """Runs the contract loop with three spaced appends and returns its History. + + The channel outright rather than ``"auto"``, so a step down to the Signal + fails the checks here instead of passing quietly. Common to both channel + kinds: no Signal, a notification per wake, and the entry id as the + position with the counter derived from it, so producers and workers order + the same wakes alike. + """ from temporalio.contrib.external_workflow_streams._record import Offset - # The channel outright rather than "auto", so a step down to the wake call - # or the Signal fails the History checks below instead of passing quietly. provider = RedisStreams( url=redis_url(), key_prefix=f"streams-redis-{uuid.uuid4().hex}", @@ -1377,34 +1349,34 @@ async def test_an_outside_producer_wakes_the_reader_through_the_channel( assert result[3] == {"kind": "finish", "producer": "model"} events = [e async for e in handle.fetch_history_events()] - signalled = [ - e - for e in events - if e.HasField("workflow_execution_signaled_event_attributes") - ] - assert signalled == [], "a Signal woke the reader" - subscribed = [ - e.workflow_notification_channel_subscribed_event_attributes.channel - for e in events - if e.HasField( - "workflow_notification_channel_subscribed_event_attributes" - ) - ] - assert len(subscribed) == 1, "the run subscribes once per channel" - notified = [ - n - for e in events - if e.HasField("workflow_task_scheduled_event_attributes") - for n in e.workflow_task_scheduled_event_attributes.notifications - ] - assert notified, "no Workflow Task was scheduled with a notification" - assert {n.channel for n in notified} == set(subscribed) - # The position is the appended entry id and the counter derives - # from it, so producers and workers order the same wakes alike. - positioned = [note for note in notified if note.position] - assert positioned, "no notification carried the store's position" - for note in positioned: - offset = Offset(note.position.decode()) - assert note.counter == redis_provider._wake_counter(offset) finally: await provider.close() + signalled = [ + e for e in events if e.HasField("workflow_execution_signaled_event_attributes") + ] + assert signalled == [], "a Signal woke the reader" + notified = _notified(events) + assert notified, "no Workflow Task was scheduled with a notification" + positioned = [note for note in notified if note.position] + assert positioned, "no notification carried the store's position" + for note in positioned: + offset = Offset(note.position.decode()) + assert note.counter == redis_provider._wake_counter(offset) + return events + + +def _subscribed(events: list[Any]) -> list[str]: + return [ + e.workflow_notification_channel_subscribed_event_attributes.channel + for e in events + if e.HasField("workflow_notification_channel_subscribed_event_attributes") + ] + + +def _notified(events: list[Any]) -> list[Any]: + return [ + n + for e in events + if e.HasField("workflow_task_scheduled_event_attributes") + for n in e.workflow_task_scheduled_event_attributes.notifications + ] diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index d5e2fdf4b..21b08e4ab 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -309,9 +309,12 @@ async def host(workflow_id: str) -> None: # stream is open. bounds_standalone_bytes=True, trims_open_stream_by_age=True, - # An outside append notifies the stream's channel, and the - # reader's worker subscribes to it on the task that opens the read. + # An outside append notifies the stream's channel, addressed to + # the workflow that owns the stream; the reader's worker subscribes + # to it on the task that opens the read where the server has no + # linked kind, and listens by construction where it has. wakes_by_notification=True, + wakes_by_linked_notification=True, ) for handle in hosts.values(): await handle.terminate() From 52f950862988506d5432815073f9b1658f572b4f Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:47:11 -0700 Subject: [PATCH 788/831] Gated the linked receive cases on the Core that delivers the job. --- tests/streams/conftest.py | 37 ++++++++----- tests/streams/test_channels.py | 99 +++++++++++++++++++++++++--------- 2 files changed, 99 insertions(+), 37 deletions(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 22e3fa18e..13b2a999c 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -7,10 +7,12 @@ # the native layers move to handles it. PINNED_CORE_HANDLES_CHANNEL_COMMAND = False -# A channel linked to a workflow needs no command or machine in Core, only -# the protos that carry `linked_to` on the notification, so the protos-only -# pin already handles it and the live linked cases run from this layer on. -PINNED_CORE_HANDLES_LINKED_CHANNEL = True +# A channel linked to a workflow needs no command, but a notification reaches +# workflow code as the `NotificationsReceived` job Core builds from the +# scheduled event, and the protos-only pin ignores that job. So a linked case +# in which the workflow receives waits for the delivery pin as well; one that +# only talks to the server from the client runs on every layer. +PINNED_CORE_HANDLES_LINKED_CHANNEL = False def pytest_configure(config: pytest.Config) -> None: @@ -40,8 +42,12 @@ def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( "markers", "needs_linked_server: the case needs a server that serves channels linked " - "to a workflow, named with -E host:port, and a Core whose protos carry " - "the linked contract", + "to a workflow, named with -E host:port", + ) + config.addinivalue_line( + "markers", + "needs_linked_core: the case needs the pinned Core to hand a linked " + "channel's notifications to workflow code", ) @@ -72,16 +78,23 @@ def pytest_collection_modifyitems( ), ) ) - if ( - config.getoption("--workflow-environment") in _ENVIRONMENTS_WITHOUT_CHANNELS - or not PINNED_CORE_HANDLES_LINKED_CHANNEL - ): + if config.getoption("--workflow-environment") in _ENVIRONMENTS_WITHOUT_CHANNELS: skips.append( ( "needs_linked_server", pytest.mark.skip( - reason="needs a server with channels linked to a workflow, " - "named with -E, and a Core pin with the linked contract" + reason="needs a server with channels linked to a workflow; " + "name one with -E" + ), + ) + ) + if not PINNED_CORE_HANDLES_LINKED_CHANNEL: + skips.append( + ( + "needs_linked_core", + pytest.mark.skip( + reason="the pinned Core ignores the notifications job; py-05 " + "pins one that delivers it" ), ) ) diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index ac22e2a4c..e7f3c87f8 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -584,6 +584,7 @@ async def _stop(handle: Any, worker: Any, running: asyncio.Task[None]) -> None: @pytest.mark.needs_linked_server +@pytest.mark.needs_linked_core async def test_a_workflow_receives_a_notification_on_its_linked_channel( client: Client, ): @@ -606,13 +607,15 @@ async def test_a_workflow_receives_a_notification_on_its_linked_channel( assert description.retained_count == 0 assert description.linked_to is not None assert description.linked_to.workflow_id == handle.id - await client.notify_channel( + # The owner is the one listener. + listeners = await client.notify_channel( channel, position=b"1-0", counter=1, metadata={"topic": "inputs"}, workflow_id=handle.id, ) + assert listeners == 1 assert await asyncio.wait_for(handle.result(), 30) == { "channel": channel, "counter": 1, @@ -632,33 +635,59 @@ async def test_a_workflow_receives_a_notification_on_its_linked_channel( @pytest.mark.needs_linked_server -async def test_a_linked_channel_of_a_running_workflow_exists_untouched(client: Client): - worker = new_worker(client, CountLinked) - running = asyncio.create_task(worker.run()) +async def test_a_linked_channel_lives_and_dies_with_its_workflow(client: Client): + """The client side alone: no worker polls, so the run stays open until ended.""" + channel = f"orders-{uuid.uuid4()}" handle = await client.start_workflow( CountLinked.run, - f"orders-{uuid.uuid4()}", + channel, id=f"wf-{uuid.uuid4()}", - task_queue=worker.task_queue, + task_queue=f"nobody-polls-{uuid.uuid4()}", ) - try: - untouched = f"untouched-{uuid.uuid4()}" - description = await client.describe_channel(untouched, workflow_id=handle.id) - assert description.kind == ChannelKind.LINKED - assert (description.listeners, description.latest) == ([], None) - assert description.retained_count == 0 - assert description.linked_to is not None - assert description.linked_to.workflow_id == handle.id - # The independent channel of that name is a different thing and does - # not exist. - with pytest.raises(RPCError) as independent: - await client.describe_channel(untouched) - assert independent.value.status == RPCStatusCode.NOT_FOUND - finally: - await _stop(handle, worker, running) + run_id = handle.first_execution_run_id + assert run_id is not None + # A name nobody has notified exists all the same, with nothing in it. + description = await client.describe_channel(channel, workflow_id=handle.id) + assert description.kind == ChannelKind.LINKED + assert (description.listeners, description.latest) == ([], None) + assert description.retained_count == 0 + assert description.linked_to is not None + assert (description.linked_to.workflow_id, description.linked_to.run_id) == ( + handle.id, + run_id, + ) + # The independent channel of that name is a different thing and does not + # exist. + with pytest.raises(RPCError) as independent: + await client.describe_channel(channel) + assert independent.value.status == RPCStatusCode.NOT_FOUND + # A run id names that run; one that is not the chain's is not found, and + # neither is a workflow that never ran. + description = await client.describe_channel( + channel, workflow_id=handle.id, run_id=run_id + ) + assert description.kind == ChannelKind.LINKED + for wrong in ( + client.describe_channel( + channel, workflow_id=handle.id, run_id=str(uuid.uuid4()) + ), + client.notify_channel( + channel, counter=1, workflow_id=handle.id, run_id=str(uuid.uuid4()) + ), + client.notify_channel(channel, counter=1, workflow_id=f"never-{uuid.uuid4()}"), + ): + with pytest.raises(RPCError) as missing: + await wrong + assert missing.value.status == RPCStatusCode.NOT_FOUND + # The channel ends with the run. + await handle.terminate() + with pytest.raises(RPCError) as closed: + await client.notify_channel(channel, counter=1, workflow_id=handle.id) + assert closed.value.status == RPCStatusCode.NOT_FOUND @pytest.mark.needs_linked_server +@pytest.mark.needs_linked_core async def test_a_linked_channel_is_polled_by_workflow_id(client: Client): channel = f"orders-{uuid.uuid4()}" worker = new_worker(client, CountLinked) @@ -670,13 +699,26 @@ async def test_a_linked_channel_is_polled_by_workflow_id(client: Client): task_queue=worker.task_queue, ) try: - await client.notify_channel( - channel, position=b"1-0", counter=1, workflow_id=handle.id + assert ( + await client.notify_channel( + channel, position=b"1-0", counter=1, workflow_id=handle.id + ) + == 1 ) polled = await client.poll_channel(channel, workflow_id=handle.id, wait=False) assert [(n.position, n.counter) for n in polled] == [(b"1-0", 1)] assert polled[0].linked_to is not None assert polled[0].linked_to.workflow_id == handle.id + # The run id reaches the same channel. + assert [ + n.counter + for n in await client.poll_channel( + channel, + workflow_id=handle.id, + run_id=handle.first_execution_run_id, + wait=False, + ) + ] == [1] description = await client.describe_channel(channel, workflow_id=handle.id) assert description.kind == ChannelKind.LINKED assert description.latest is not None and description.latest.counter == 1 @@ -686,9 +728,16 @@ async def test_a_linked_channel_is_polled_by_workflow_id(client: Client): channel, workflow_id=handle.id, after_counter=1, wait=timedelta(seconds=1) ) assert polled == [] - await client.notify_channel( - channel, position=b"2-0", counter=2, workflow_id=handle.id + assert ( + await client.notify_channel( + channel, position=b"2-0", counter=2, workflow_id=handle.id + ) + == 1 ) assert await asyncio.wait_for(handle.result(), 30) == 2 + polled = await client.poll_channel( + channel, workflow_id=handle.id, after_counter=1, wait=False + ) + assert [n.counter for n in polled] == [2] finally: await _stop(handle, worker, running) From 394faebaee0004662d1a817657f8f9079dc9d9f7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:49:15 -0700 Subject: [PATCH 789/831] Flipped the linked-channel skip on the delivery Core pin. --- tests/streams/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 724338de7..9984b2e52 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -12,7 +12,7 @@ # scheduled event, and the protos-only pin ignores that job. So a linked case # in which the workflow receives waits for the delivery pin as well; one that # only talks to the server from the client runs on every layer. -PINNED_CORE_HANDLES_LINKED_CHANNEL = False +PINNED_CORE_HANDLES_LINKED_CHANNEL = True def pytest_configure(config: pytest.Config) -> None: From 10ca9cb8b110c708dee6022aeedd2639a220705e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:49:23 -0700 Subject: [PATCH 790/831] Matched the main chain's linked channel surface and the listener list. The channel module, the client dataclasses and the five calls take the main chain's text, so the union merges without a second copy. A linked channel's description lists the owner beside a registered callback once the channel holds state, so the live case looks for the callback among the listeners. --- temporalio/client/_channel.py | 32 +++-- temporalio/client/_client.py | 68 +++++------ temporalio/client/_impl.py | 113 +++++++++--------- temporalio/client/_interceptor.py | 5 - temporalio/workflow/_channels.py | 67 +++++------ .../test_channels.py | 51 ++++---- 6 files changed, 179 insertions(+), 157 deletions(-) diff --git a/temporalio/client/_channel.py b/temporalio/client/_channel.py index b83c032dd..d05d2875b 100644 --- a/temporalio/client/_channel.py +++ b/temporalio/client/_channel.py @@ -23,15 +23,25 @@ class ChannelKind(IntEnum): This API is experimental and unstable. """ + UNSPECIFIED = int( + temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_UNSPECIFIED + ) + """The server did not say; an older server answers this.""" + INDEPENDENT = int( temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_INDEPENDENT ) - """Its own execution, keyed by namespace and channel name. Any number of - workflows and callbacks listen to it.""" + """Its own execution, keyed by namespace and channel name. + + Any number of workflows subscribe to it and callbacks register on it. + """ LINKED = int(temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED) - """Kept in one workflow's state, keyed by namespace, workflow id and channel - name. The owning workflow is its listener by construction.""" + """Kept in one workflow's state, keyed by namespace, workflow id and name. + + The owning workflow is its listener by construction; a call reaches it + with the ``workflow_id`` argument. + """ @dataclass(frozen=True) @@ -97,8 +107,16 @@ class ChannelDescription: retained_count: int """How many notifications the channel keeps for pollers.""" - kind: ChannelKind | None = None - """Which kind of channel this is, or ``None`` from a server that predates the kinds.""" + kind: ChannelKind = ChannelKind.UNSPECIFIED + """Which kind of channel this is. + + A linked channel of a running workflow exists by construction, so a + describe with ``workflow_id`` answers :attr:`ChannelKind.LINKED` with no + listeners and nothing retained for a name nobody has notified yet. + """ linked_to: temporalio.api.common.v1.WorkflowExecution | None = None - """The owner of a linked channel and the run that holds it; ``None`` otherwise.""" + """The owner of a linked channel and the run that holds it. + + ``None`` for an independent channel. + """ diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 985d68c91..e50ef6d54 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -2913,7 +2913,7 @@ async def notify_channel( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace, or to the + channel: Name of the channel. Scoped to the namespace, or to the workflow when ``workflow_id`` is given. position: Where the source stands after the write, in the writer's own terms. Opaque to the server. @@ -2922,10 +2922,10 @@ async def notify_channel( metadata: Details for the listener, such as which topic moved. Each value is encoded with the client's data converter. workflow_id: Address the channel linked to this workflow instead of - the independent channel of that name. The workflow is the - listener by construction. - run_id: With ``workflow_id``, the run whose chain is addressed. Left - out, the chain's current run is addressed, as a Signal does. + the independent channel of that name. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run, as a Signal does. Unset means the + current run under the workflow id. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -2939,10 +2939,10 @@ async def notify_channel( position=position, counter=counter, metadata=metadata, - workflow_id=workflow_id, - run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) @@ -2964,7 +2964,7 @@ async def poll_channel( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace, or to the + channel: Name of the channel. Scoped to the namespace, or to the workflow when ``workflow_id`` is given. after_counter: Only notifications with a counter above this one are returned. Pass the highest counter seen so far to page. @@ -2974,8 +2974,8 @@ async def poll_channel( max_notifications: Upper bound on the notifications returned. workflow_id: Address the channel linked to this workflow instead of the independent channel of that name. - run_id: With ``workflow_id``, the run whose chain is addressed. Left - out, the chain's current run is addressed. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -2995,10 +2995,10 @@ async def poll_channel( after_counter=after_counter, wait=wait_for, max_notifications=max_notifications, - workflow_id=workflow_id, - run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) @@ -3017,14 +3017,15 @@ async def describe_channel( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace, or to the + channel: Name of the channel. Scoped to the namespace, or to the workflow when ``workflow_id`` is given. - workflow_id: Describe the channel linked to this workflow instead of - the independent channel of that name. A running workflow's - linked channel exists by construction, so the description - says so even when nobody has notified it yet. - run_id: With ``workflow_id``, the run whose chain is addressed. Left - out, the chain's current run is addressed. + workflow_id: Describe the channel linked to this workflow instead + of the independent channel of that name. A linked channel of a + running workflow exists by construction, so the answer for a + name nobody has notified yet is a linked channel with no + listeners and nothing retained, not a not-found error. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3032,10 +3033,10 @@ async def describe_channel( return await self._impl.describe_channel( DescribeChannelInput( channel=channel, - workflow_id=workflow_id, - run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) @@ -3058,15 +3059,14 @@ async def register_channel_listener( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace, or to the + channel: Name of the channel. Scoped to the namespace, or to the workflow when ``workflow_id`` is given. callback: The callback to invoke. workflow_id: Listen on the channel linked to this workflow instead - of the independent channel of that name. The listener is kept - in the workflow's state and does not carry over to a - continue-as-new successor. - run_id: With ``workflow_id``, the run whose chain is addressed. Left - out, the chain's current run is addressed. + of the independent channel of that name. The listener lives in + that workflow's state and ends with its run. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3078,10 +3078,10 @@ async def register_channel_listener( RegisterChannelListenerInput( channel=channel, callback=callback, - workflow_id=workflow_id, - run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) @@ -3101,13 +3101,13 @@ async def unregister_channel_listener( This API is experimental and unstable. Args: - channel: Name of the channel, scoped to the namespace, or to the + channel: Name of the channel. Scoped to the namespace, or to the workflow when ``workflow_id`` is given. listener_id: The id :py:meth:`register_channel_listener` returned. workflow_id: The workflow whose linked channel the listener is on, when it was registered with one. - run_id: With ``workflow_id``, the run whose chain is addressed. Left - out, the chain's current run is addressed. + run_id: With ``workflow_id``, a run of its chain; the call reaches + the chain's current run. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3116,10 +3116,10 @@ async def unregister_channel_listener( UnregisterChannelListenerInput( channel=channel, listener_id=listener_id, - workflow_id=workflow_id, - run_id=run_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, + workflow_id=workflow_id, + run_id=run_id, ) ) diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index 85cef534a..0d7d8c726 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -144,20 +144,6 @@ from ._client import Client -def _address_channel(request: Any, workflow_id: str | None, run_id: str | None) -> None: - """Points a channel request at a workflow's linked channel, when one is named. - - Left unset, the request addresses the independent channel of that name. - """ - if workflow_id is None: - if run_id is not None: - raise ValueError("run_id names a run of workflow_id, which is missing") - return - request.workflow_execution.workflow_id = workflow_id - if run_id is not None: - request.workflow_execution.run_id = run_id - - class _ClientImpl(OutboundInterceptor): # pyright: ignore[reportUnusedClass] def __init__(self, client: Client) -> None: # type: ignore # We are intentionally not calling the base class's __init__ here @@ -1728,15 +1714,17 @@ async def notify_channel(self, input: NotifyChannelInput) -> int: for key, value in (input.metadata or {}).items(): [payload] = await self._client.data_converter.encode([value]) notification.metadata[key].CopyFrom(payload) - req = temporalio.api.workflowservice.v1.NotifyChannelRequest( - namespace=self._client.namespace, - notification=notification, - identity=self._client.identity, - request_id=str(uuid.uuid4()), - ) - _address_channel(req, input.workflow_id, input.run_id) resp = await self._client.workflow_service.notify_channel( - req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout + temporalio.api.workflowservice.v1.NotifyChannelRequest( + namespace=self._client.namespace, + notification=notification, + identity=self._client.identity, + request_id=str(uuid.uuid4()), + workflow_execution=_channel_owner(input.workflow_id, input.run_id), + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, ) return resp.listener_count @@ -1748,24 +1736,26 @@ async def poll_channel( channel=input.channel, after_counter=input.after_counter, max_notifications=input.max_notifications, + workflow_execution=_channel_owner(input.workflow_id, input.run_id), ) if input.wait is not None: req.wait.FromTimedelta(input.wait) - _address_channel(req, input.workflow_id, input.run_id) resp = await self._client.workflow_service.poll_channel( req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout ) return [await self._notification_from_proto(n) for n in resp.notifications] async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescription: - req = temporalio.api.workflowservice.v1.DescribeChannelRequest( - namespace=self._client.namespace, channel=input.channel - ) - _address_channel(req, input.workflow_id, input.run_id) resp = await self._client.workflow_service.describe_channel( - req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout + temporalio.api.workflowservice.v1.DescribeChannelRequest( + namespace=self._client.namespace, + channel=input.channel, + workflow_execution=_channel_owner(input.workflow_id, input.run_id), + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, ) - kinds = temporalio.api.notification.v1.ChannelKind return ChannelDescription( listeners=[ ChannelListener._from_proto(listener) for listener in resp.listeners @@ -1776,46 +1766,46 @@ async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescript else None ), retained_count=resp.retained_count, - kind=( - ChannelKind(resp.kind) - if resp.kind != kinds.CHANNEL_KIND_UNSPECIFIED - else None - ), + kind=ChannelKind(resp.kind), linked_to=resp.linked_to if resp.HasField("linked_to") else None, ) async def register_channel_listener( self, input: RegisterChannelListenerInput ) -> str: - req = temporalio.api.workflowservice.v1.RegisterChannelListenerRequest( - namespace=self._client.namespace, - channel=input.channel, - callback=temporalio.api.common.v1.Callback( - nexus=temporalio.api.common.v1.Callback.Nexus( - url=input.callback.url, header=input.callback.headers - ) - ), - request_id=str(uuid.uuid4()), - identity=self._client.identity, - ) - _address_channel(req, input.workflow_id, input.run_id) resp = await self._client.workflow_service.register_channel_listener( - req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout + temporalio.api.workflowservice.v1.RegisterChannelListenerRequest( + namespace=self._client.namespace, + channel=input.channel, + callback=temporalio.api.common.v1.Callback( + nexus=temporalio.api.common.v1.Callback.Nexus( + url=input.callback.url, header=input.callback.headers + ) + ), + request_id=str(uuid.uuid4()), + identity=self._client.identity, + workflow_execution=_channel_owner(input.workflow_id, input.run_id), + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, ) return resp.listener_id async def unregister_channel_listener( self, input: UnregisterChannelListenerInput ) -> None: - req = temporalio.api.workflowservice.v1.UnregisterChannelListenerRequest( - namespace=self._client.namespace, - channel=input.channel, - listener_id=input.listener_id, - identity=self._client.identity, - ) - _address_channel(req, input.workflow_id, input.run_id) await self._client.workflow_service.unregister_channel_listener( - req, retry=True, metadata=input.rpc_metadata, timeout=input.rpc_timeout + temporalio.api.workflowservice.v1.UnregisterChannelListenerRequest( + namespace=self._client.namespace, + channel=input.channel, + listener_id=input.listener_id, + identity=self._client.identity, + workflow_execution=_channel_owner(input.workflow_id, input.run_id), + ), + retry=True, + metadata=input.rpc_metadata, + timeout=input.rpc_timeout, ) async def _notification_from_proto( @@ -1850,3 +1840,16 @@ async def _apply_headers( == HeaderCodecBehavior.CODEC, self._client.data_converter, ) + + +def _channel_owner( + workflow_id: str | None, run_id: str | None +) -> temporalio.api.common.v1.WorkflowExecution | None: + """The workflow a channel call addresses, or ``None`` for an independent channel.""" + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id needs workflow_id") + return None + return temporalio.api.common.v1.WorkflowExecution( + workflow_id=workflow_id, run_id=run_id or "" + ) diff --git a/temporalio/client/_interceptor.py b/temporalio/client/_interceptor.py index ef8d4e059..ac40ddeb4 100644 --- a/temporalio/client/_interceptor.py +++ b/temporalio/client/_interceptor.py @@ -698,7 +698,6 @@ class NotifyChannelInput: rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None workflow_id: str | None = None - """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" run_id: str | None = None @@ -717,7 +716,6 @@ class PollChannelInput: rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None workflow_id: str | None = None - """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" run_id: str | None = None @@ -733,7 +731,6 @@ class DescribeChannelInput: rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None workflow_id: str | None = None - """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" run_id: str | None = None @@ -750,7 +747,6 @@ class RegisterChannelListenerInput: rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None workflow_id: str | None = None - """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" run_id: str | None = None @@ -767,7 +763,6 @@ class UnregisterChannelListenerInput: rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None workflow_id: str | None = None - """The workflow whose linked channel is addressed; ``None`` for an independent channel.""" run_id: str | None = None diff --git a/temporalio/workflow/_channels.py b/temporalio/workflow/_channels.py index 8bd5224b8..fbbf6843d 100644 --- a/temporalio/workflow/_channels.py +++ b/temporalio/workflow/_channels.py @@ -5,16 +5,9 @@ A channel carries notifications, not data. A writer tells the channel's listeners that a source they consume has moved, and each listener reads the -source itself. A workflow that listens gets the notifications the server +source itself. A workflow that subscribes gets the notifications the server folded for it with each Workflow Task. They travel in History, so a replay sees the same ones at the same points. - -A channel comes in two kinds. An independent channel is its own execution, -named in the namespace; any number of workflows subscribe to it with -:func:`subscribe_channel`, which issues a command. A channel linked to a -workflow lives in that workflow's own state; the workflow is its listener by -construction and reads it with :func:`linked_channel`, which issues nothing. -Writers address a linked channel by the workflow id and the channel name. """ from __future__ import annotations @@ -68,10 +61,12 @@ class Notification: """ linked_to: temporalio.api.common.v1.WorkflowExecution | None = None - """The workflow the channel is linked to, and the run that received this. + """The workflow a linked channel belongs to, and the run that received this. - ``None`` for a notification from an independent channel. A listener that - holds both kinds under one name tells them apart by it. + ``None`` for a notification from an independent channel. A workflow that + holds both kinds of handle on one name gets a notification on the handle + its kind names: :func:`temporalio.workflow.linked_channel` when set, + :func:`temporalio.workflow.subscribe_channel` otherwise. """ @staticmethod @@ -88,17 +83,18 @@ def _from_proto( class ChannelSubscription: - """A workflow's subscription to one channel. - - Prefer :func:`temporalio.workflow.subscribe_channel` or - :func:`temporalio.workflow.linked_channel`. The subscription is an async - iterator over the notifications as they arrive, and :meth:`receive` takes - them one at a time. Notifications wait in arrival order until taken. Two - loops on one subscription share its buffer and interleave. + """A workflow's handle on one channel, of either kind. + + Prefer :func:`temporalio.workflow.subscribe_channel` for an independent + channel and :func:`temporalio.workflow.linked_channel` for one linked to + this workflow. The handle is an async iterator over the notifications as + they arrive, and :meth:`receive` takes them one at a time. Notifications + wait in arrival order until taken. Two loops on one handle share its + buffer and interleave. """ def __init__(self, channel: str, *, linked: bool = False) -> None: - """Prefer :func:`temporalio.workflow.subscribe_channel`.""" + """Prefer the two module functions named above.""" self._channel = channel self._linked = linked self._pending: deque[Notification] = deque() @@ -106,12 +102,16 @@ def __init__(self, channel: str, *, linked: bool = False) -> None: @property def channel(self) -> str: - """The channel this subscription is on.""" + """The channel this handle is on.""" return self._channel @property def linked(self) -> bool: - """Whether the channel is linked to this workflow.""" + """Whether the channel is the one linked to this workflow. + + A linked handle gets the notifications that carry + :attr:`Notification.linked_to`; an independent one gets the rest. + """ return self._linked async def receive(self) -> Notification: @@ -171,20 +171,17 @@ def subscribe_channel(channel: str) -> ChannelSubscription: def linked_channel(channel: str) -> ChannelSubscription: - """Read the channel named ``channel`` that is linked to this workflow. - - No command: the channel lives in this workflow's state and the workflow - is its listener by construction, so the first call needs no - :func:`temporalio.workflow.patched` gate. A second call for the same name - returns the subscription already open. Writers reach it with the - ``workflow_id`` argument of :py:meth:`temporalio.client.Client.notify_channel`, - and each Workflow Task carries the notifications the server folded for - it. The channel's state dies with the run: a successor after - continue-as-new starts with an empty one, under the same address. - - Needs a server with linked channels. On one without, a writer's - notification addressed to this workflow goes to the independent channel - of the same name, which this subscription does not hear. + """Listen on the channel named ``channel`` that is linked to this workflow. + + A linked channel lives in this workflow's own state, so the workflow is + its listener by construction: no command, no event, and no gate needed + for a new name. A writer reaches it with the workflow id, as in + :py:meth:`temporalio.client.Client.notify_channel` with ``workflow_id``, + and a successor run after continue-as-new is reached by the same calls. + A second call for the same name returns the handle already open, and the + two share its buffer. The name does not collide with an independent + channel's: a notification carrying :attr:`Notification.linked_to` comes + here, one without it goes to :func:`subscribe_channel`. Args: channel: Name of the channel, scoped to this workflow. diff --git a/tests/contrib/external_workflow_streams/test_channels.py b/tests/contrib/external_workflow_streams/test_channels.py index cd8c8bf32..104eeb8ce 100644 --- a/tests/contrib/external_workflow_streams/test_channels.py +++ b/tests/contrib/external_workflow_streams/test_channels.py @@ -30,7 +30,7 @@ from temporalio import workflow from temporalio.api.enums.v1 import EventType from temporalio.client import Callback, ChannelKind, Client -from temporalio.client._impl import _address_channel +from temporalio.client._impl import _channel_owner from temporalio.contrib.external_workflow_streams._wake import ChannelAddress from temporalio.service import RPCError, RPCStatusCode from temporalio.worker._workflow_instance import ( @@ -440,21 +440,20 @@ async def test_a_replay_takes_the_path_the_live_run_recorded(): def test_a_channel_call_names_the_workflow_it_is_linked_to(): - request = temporalio.api.workflowservice.v1.DescribeChannelRequest(channel="c") - _address_channel(request, None, None) - assert not request.HasField("workflow_execution") - _address_channel(request, "wf", None) - assert ( - request.workflow_execution.workflow_id, - request.workflow_execution.run_id, - ) == ( - "wf", - "", - ) - _address_channel(request, "wf", "run") - assert request.workflow_execution.run_id == "run" + assert _channel_owner(None, None) is None + owner = _channel_owner("wf", None) + assert owner is not None + assert (owner.workflow_id, owner.run_id) == ("wf", "") + owner = _channel_owner("wf", "run") + assert owner is not None + assert (owner.workflow_id, owner.run_id) == ("wf", "run") with pytest.raises(ValueError, match="workflow_id"): - _address_channel(request, None, "run") + _channel_owner(None, "run") + # Unset, the request addresses the independent channel of that name. + request = temporalio.api.workflowservice.v1.DescribeChannelRequest( + channel="c", workflow_execution=_channel_owner(None, None) + ) + assert not request.HasField("workflow_execution") async def test_the_client_describes_a_linked_channel_by_its_owner( @@ -492,7 +491,8 @@ async def describe(request, **kwargs): # type: ignore[no-untyped-def] ), ) description = await client.describe_channel("orders") - assert description.kind is None and description.linked_to is None + assert description.kind is ChannelKind.UNSPECIFIED + assert description.linked_to is None async def _answer(response: Any) -> Any: @@ -568,16 +568,25 @@ async def test_a_linked_channel_retains_for_pollers_and_takes_callbacks(client: channel, callback, workflow_id=handle.id ) description = await client.describe_channel(channel, workflow_id=handle.id) - assert [listener.listener_id for listener in description.listeners] == [ - listener_id + # The owner listens by construction and the server may list it beside + # the callback once the channel holds state; the callback is the one + # listener that was registered. + assert {listener.workflow_id for listener in description.listeners} <= { + None, + handle.id, + } + [registered] = [ + listener for listener in description.listeners if listener.callback ] - assert description.listeners[0].callback == callback + assert (registered.listener_id, registered.callback) == (listener_id, callback) await client.unregister_channel_listener( channel, listener_id, workflow_id=handle.id ) description = await client.describe_channel(channel, workflow_id=handle.id) - assert description.listeners == [] - # The owner is woken, so a notify counts no registered listener but + assert [ + listener for listener in description.listeners if listener.callback + ] == [] + # The owner is woken, so a notify counts no registered callback but # still retains for pollers. await client.notify_channel( channel, position=b"2-0", counter=2, workflow_id=handle.id From 77c4289298ca2c3de6964d01fb474c2f3f95d2ec Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:51:26 -0700 Subject: [PATCH 791/831] Expected not found from a poll on a closed workflow's linked channel. --- tests/streams/test_channels.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index e7f3c87f8..687b5c63a 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -735,9 +735,12 @@ async def test_a_linked_channel_is_polled_by_workflow_id(client: Client): == 1 ) assert await asyncio.wait_for(handle.result(), 30) == 2 - polled = await client.poll_channel( - channel, workflow_id=handle.id, after_counter=1, wait=False - ) - assert [n.counter for n in polled] == [2] + # The ring went with the run, so a poll after the close finds nothing + # to read. + with pytest.raises(RPCError) as closed: + await client.poll_channel( + channel, workflow_id=handle.id, after_counter=1, wait=False + ) + assert closed.value.status == RPCStatusCode.NOT_FOUND finally: await _stop(handle, worker, running) From 1ce5766f06ae601776667413dc87691db7e11c56 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Thu, 1 Oct 2026 23:52:41 -0700 Subject: [PATCH 792/831] Repinned Core to the external repairs head. One test-only commit on top of the linked contract pin; the generated clients and the bridge are unchanged. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index bdca403d9..c6af51752 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit bdca403d9777bb1d80c759ff1fe9b3b8c82590fd +Subproject commit c6af517523500ed33a42a4b35220459f1f0bee00 From d7af9eb419f6befe0d74d14c38053f0b38165d92 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 00:17:17 -0700 Subject: [PATCH 793/831] Pinned Core at the linked-channel union head and regenerated the clients. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 005721848..c3b4b3550 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 00572184848dd86ef425ec1320df6c514beb4946 +Subproject commit c3b4b35501bda488906ce9f65a31a325e75962d6 From c051962c08f090c44d3302b1b97b2206edfeb2dd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:12:35 -0700 Subject: [PATCH 794/831] Added the Nexus operation that consumes a stream through its channel. The handler registers a callback listener on the stream's channel and reads from its cursor on each delivery, so the Nexus and channel designs share one path instead of the handler polling the front. The aiohttp service is the standalone host the PoC demonstrates. --- temporalio/streams/providers/nexus.py | 617 +++++++++++++++++- .../providers/nexus_consumer_service.py | 509 +++++++++++++++ 2 files changed, 1124 insertions(+), 2 deletions(-) create mode 100644 temporalio/streams/providers/nexus_consumer_service.py diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 1cc60d236..531c1d515 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -57,33 +57,56 @@ :class:`temporalio.streams.StreamError` the store raised, when the handler named one, and as :class:`temporalio.service.RPCError` otherwise, never as an HTTP or urllib exception. + +The third piece is the consumer side of a Nexus operation. +:class:`StreamConsumerOperation`, built with :func:`stream_consumer_operation`, +is an asynchronous operation handler whose input is a ``StreamRef`` and whose +result is what a consume function folded the stream's records into. It does +not poll. On start it registers a callback listener on the stream's +notification channel, with a URL the hosting process serves and a header that +names the operation, and reads the stream from its start through the client's +provider, the front when the client carries one. The server posts every +notification on the channel to that URL, the handler reads from its cursor to +the head, and the close completes the operation through the caller's +completion callback. The delivery is what the server's channel library posts: +``POST`` to the listener's URL, the ``Notification`` as protobuf JSON with +``Content-Type: application/json``, the listener's own headers and the +channel's name in ``Temporal-Notification-Channel``. A process that hosts the +handler feeds each such request to :meth:`StreamConsumerOperation.deliver`; +``nexus_consumer_service`` in this package is the standalone one. """ from __future__ import annotations import asyncio +import email.utils import http.client +import inspect import json import logging import time import urllib.error import urllib.request +import uuid import weakref from collections import OrderedDict from collections.abc import AsyncGenerator, Awaitable, Callable, Mapping -from dataclasses import dataclass +from dataclasses import dataclass, field from datetime import datetime, timedelta, timezone from typing import Any, Generic, NoReturn, TypeVar, cast import nexusrpc import nexusrpc.handler +from google.protobuf import json_format from google.protobuf.message import DecodeError +import temporalio.api.notification.v1 import temporalio.client import temporalio.converter +import temporalio.nexus from temporalio.api.common.v1 import Payload from temporalio.api.operatorservice.v1 import ListNexusEndpointsRequest -from temporalio.client import Client, ClientConfig +from temporalio.client import Callback, Client, ClientConfig from temporalio.common import RawValue from temporalio.service import ConnectConfig, RPCError, RPCStatusCode, ServiceClient from temporalio.streams._errors import ( @@ -120,16 +143,25 @@ TemporalStreams, ) from temporalio.streams.providers._nexus_generated import StreamRef as WireStreamRef +from temporalio.workflow import Notification __all__ = [ + "NOTIFICATION_CHANNEL_HEADER", + "STREAM_CONSUMER_TOKEN_HEADER", + "ConsumerState", + "Delivery", "NexusProducer", "NexusStreamHandle", "NexusStreams", + "StreamConsumerOperation", "TemporalStreamsHandler", "WireStreamRef", + "stream_channel_name", + "stream_consumer_operation", ] T = TypeVar("T") +S = TypeVar("S") # The reference's identity on the handler, topic included, so one parked read # and one producer state key on exactly what the wire names. @@ -1240,3 +1272,584 @@ async def _endpoint_id(self, client: Client | None) -> str: ) self._resolved = found.endpoints[0].id return self._resolved + + +# --------------------------------------------------------------------------- +# A Nexus operation as a stream consumer. +# --------------------------------------------------------------------------- + +NOTIFICATION_CHANNEL_HEADER = "Temporal-Notification-Channel" +"""The header the server adds to a channel's callback delivery, naming the channel.""" + +STREAM_CONSUMER_TOKEN_HEADER = "Temporal-Stream-Consumer-Token" +"""The header a consumer's listener registration carries, naming the operation. + +The server sends a listener's own headers back on every delivery, so this is +how one delivery URL serves any number of operations. +""" + +_COMPLETION_TIMEOUT = timedelta(seconds=30) +_CLOSED_KEY = "closed" +_FAILURE_CONTENT_TYPE = "application/json" +_CONTENT_TYPE_HEADER = "Content-Type" +_STATE_HEADER = "Nexus-Operation-State" +_TOKEN_HEADER = "Nexus-Operation-Token" +_START_TIME_HEADER = "Nexus-Operation-Start-Time" + + +def stream_channel_name(ref: StreamRef) -> str: + """The notification channel a stream's writers notify, from the stream's identity. + + The name folds the owner the ref names and the topic into one string, so + a producer and a consumer that hold the same ref meet on the same + channel. A ref pinned to a run names a different channel from one that + follows the chain, because the two name different streams. + """ + parts = ["stream", ref.kind] + if ref.kind == "workflow": + parts += [ref.workflow_id or "", ref.run_id or ""] + elif ref.kind == "activity": + parts += [ref.workflow_id or "", ref.run_id or "", ref.activity_id or ""] + else: + parts.append(ref.stream_id or "") + parts.append(ref.topic) + return ":".join(parts) + + +ConsumeFunction = Callable[[StreamRecord[Any], S], "S | Awaitable[S]"] + + +@dataclass(frozen=True) +class ConsumerState(Generic[S]): + """What a consumer operation holds for one token, read-only. + + .. warning:: + This API is experimental and unstable. + """ + + ref: StreamRef + """The stream being consumed.""" + + channel: str + """The channel the listener is registered on.""" + + listener_id: str + """The listener id the server assigned.""" + + cursor: Cursor + """Where the next read starts. :data:`BEGINNING` until a record was consumed.""" + + value: S + """What the consume function has folded the records into so far.""" + + reads: int + """How many read passes reached the store, the start's included.""" + + deliveries: int + """How many notifications were delivered for this operation.""" + + records: int + """How many records the consume function has been handed.""" + + +@dataclass(frozen=True) +class Delivery: + """What one delivered notification led to. + + .. warning:: + This API is experimental and unstable. + """ + + token: str | None + """The operation the delivery named, when the headers carried one.""" + + known: bool + """Whether this process holds that operation. A delivery for one it does not is ignored.""" + + read: bool + """Whether the delivery led to a read. One that brought nothing new does not.""" + + records: int + """How many records that read handed to the consume function.""" + + completed: bool + """Whether the delivery closed the operation.""" + + +@dataclass +class _Consumption(Generic[S]): + ref: StreamRef + channel: str + listener_id: str + callback_url: str | None + callback_headers: dict[str, str] + started: datetime + value: S + cursor: Cursor = BEGINNING + lock: asyncio.Lock = field(default_factory=asyncio.Lock) + reads: int = 0 + deliveries: int = 0 + records: int = 0 + finished: bool = False + done: bool = False + opening: asyncio.Task[None] | None = None + + +def _header(headers: Mapping[str, str], name: str) -> str | None: + wanted = name.lower() + for key, value in headers.items(): + if key.lower() == wanted: + return value + return None + + +def _parse_notification(body: bytes | str | Mapping[str, Any]) -> Notification: + """The notification a delivery carries, from the JSON the server posts.""" + text = json.dumps(body) if isinstance(body, Mapping) else body + if isinstance(text, bytes): + text = text.decode() + proto = json_format.Parse( + text, temporalio.api.notification.v1.Notification(), ignore_unknown_fields=True + ) + return Notification._from_proto(proto) + + +def _payload_content(payload: Payload) -> tuple[dict[str, str], bytes]: + """The HTTP content headers and body that carry ``payload`` to the server. + + The mapping is the server's: a plain JSON payload travels as JSON, a null + one as an empty body with no type, and anything else, a codec's output + included, as the serialized payload itself. + """ + metadata = {key: value.decode() for key, value in payload.metadata.items()} + encoding = metadata.get("encoding") + if set(metadata) == {"encoding"}: + if encoding == "json/plain": + return {_CONTENT_TYPE_HEADER: "application/json"}, payload.data + if encoding == "binary/plain": + return {_CONTENT_TYPE_HEADER: "application/octet-stream"}, payload.data + if encoding == "binary/null": + return {}, b"" + return ( + {_CONTENT_TYPE_HEADER: "application/x-temporal-payload"}, + payload.SerializeToString(), + ) + + +def _post_completion( + url: str, body: bytes, headers: Mapping[str, str], timeout: timedelta +) -> None: + """Post an operation completion to the caller's callback URL. + + Unlike :func:`_post` this sets no content type of its own, because a null + result travels without one. + + Raises: + _EndpointFailure: The callback answered with an error or not at all. + """ + try: + request = urllib.request.Request( + url, data=body or None, headers=dict(headers), method="POST" + ) + with urllib.request.urlopen(request, timeout=timeout.total_seconds()): + return + except urllib.error.HTTPError as error: + raise _EndpointFailure( + error.read().decode(errors="replace"), error.code + ) from error + except urllib.error.URLError as error: + raise _EndpointFailure( + f"completion callback unreachable at {url}: {error.reason}", None + ) from error + except (TimeoutError, http.client.HTTPException, OSError, ValueError) as error: + raise _EndpointFailure( + f"completion callback at {url} did not answer: {error!r}", None + ) from error + + +class StreamConsumerOperation(nexusrpc.handler.OperationHandler[StreamRef, S]): + """An asynchronous operation that consumes the stream its input names. + + The caller starts it with a :class:`temporalio.streams.StreamRef` and + awaits its result. On start the handler registers a callback listener on + the stream's notification channel, with the URL the hosting process + serves and this operation's token in a header, and reads the stream from + its start through the client's provider. Every notification the server + delivers leads to one read from the cursor to the head, however many + writes the channel folded into it, and a delivery that brings nothing new + reads nothing. The operation completes through the caller's completion + callback when the notification says the stream closed, when the read + reaches ``FINISH`` or when the store ends the read, with what the consume + function folded the records into. Cancel unregisters the listener and + reports the operation canceled. + + The consume function is a reducer: it takes a record and the value so far + and returns the new value, awaitable or not. It is handed every record + kind and narrows on ``kind`` itself. An exception from it fails the + operation. The cursor and the value live in this process keyed by the + operation token, so a process that loses them loses the operation; a + durable cursor is a follow-up. + + .. warning:: + This API is experimental and unstable. + """ + + def __init__( + self, + consume: ConsumeFunction[S], + *, + initial: Callable[[], S], + listener_url: str, + client: Client | None = None, + channel_for: Callable[[StreamRef], str] = stream_channel_name, + result_type: type | None = None, + token_header: str = STREAM_CONSUMER_TOKEN_HEADER, + ) -> None: + """Consume with ``consume``, served at ``listener_url``. + + Args: + consume: The reducer each record is handed with the value so far. + initial: Makes the value an operation starts with. + listener_url: Where the server posts the channel's notifications. + The hosting process serves it and feeds each request to + :meth:`deliver`. + client: Registers the listener and opens the stream. Leave it + unset in a handler hosted by a Temporal worker, where the + operation context's client is used. + channel_for: Names the channel for a ref. The default is + :func:`stream_channel_name`; a store that names channels + its own way passes its rule. + result_type: What record values are decoded as. + token_header: The header carrying the operation token on the + registration and so on every delivery. + """ + if not listener_url: + raise ValueError("listener_url must not be empty") + self._consume = consume + self._initial = initial + self._listener_url = listener_url + self._given_client = client + self._channel_for = channel_for + self._result_type = result_type + self._token_header = token_header + self._states: dict[str, _Consumption[S]] = {} + + @property + def tokens(self) -> list[str]: + """The operations this process holds, oldest first.""" + return list(self._states) + + def state(self, token: str) -> ConsumerState[S] | None: + """What is held for ``token``, or ``None`` once it completed or never was.""" + held = self._states.get(token) + if held is None: + return None + return ConsumerState( + ref=held.ref, + channel=held.channel, + listener_id=held.listener_id, + cursor=held.cursor, + value=held.value, + reads=held.reads, + deliveries=held.deliveries, + records=held.records, + ) + + def _client(self) -> Client: + if self._given_client is not None: + return self._given_client + return temporalio.nexus.client() + + async def start( + self, ctx: nexusrpc.handler.StartOperationContext, input: StreamRef + ) -> nexusrpc.handler.StartOperationResultAsync: + """Register as the stream's listener and start reading it. + + The read runs after the start answers, so a long stream does not hold + the start request, and the first delivery waits on it. + """ + client = self._client() + token = uuid.uuid4().hex + channel = self._channel_for(input) + # Registered before the first read: a record appended between the + # read and the registration would otherwise be missed, where one + # appended between the registration and the read is read twice at + # worst, once by the read and once by the delivery it provokes, and + # the cursor makes the second a no-op. + listener_id = await client.register_channel_listener( + channel, + Callback(url=self._listener_url, headers={self._token_header: token}), + ) + state: _Consumption[S] = _Consumption( + ref=input, + channel=channel, + listener_id=listener_id, + callback_url=ctx.callback_url, + callback_headers=dict(ctx.callback_headers), + started=datetime.now(timezone.utc), + value=self._initial(), + ) + self._states[token] = state + state.opening = asyncio.create_task(self._open(token, state, client)) + return nexusrpc.handler.StartOperationResultAsync(token) + + async def _open(self, token: str, state: _Consumption[S], client: Client) -> None: + try: + async with state.lock: + if state.done: + return + await self._catch_up(token, state, client) + if state.finished and not state.done: + await self._complete(token, state, client) + except Exception: + # The next delivery reads again from the cursor, so a failure here + # costs nothing but the records it would have consumed early. + logger.exception("the first read of %s failed", state.ref) + + async def deliver( + self, headers: Mapping[str, str], body: bytes | str | Mapping[str, Any] + ) -> Delivery: + """Act on one notification the server posted to the listener URL. + + ``headers`` are the request's, in any case; ``body`` is the + ``Notification`` as protobuf JSON, raw or already parsed. The delivery + is matched to its operation by the token header. Reading from the + cursor to the head happens under the operation's lock, so a delivery + that arrives during the first read waits for it and then finds the + cursor at the head. + + A failure to read raises, so the hosting process answers the server + with an error and the server retries the delivery; a failure in the + consume function fails the operation instead. + """ + token = _header(headers, self._token_header) + state = self._states.get(token) if token is not None else None + if token is None or state is None: + logger.warning( + "ignoring a channel delivery for an operation this process does not hold" + ) + return Delivery(token, known=False, read=False, records=0, completed=False) + client = self._client() + notification = _parse_notification(body) + closed = await self._closed(notification, client) + async with state.lock: + if state.done: + return Delivery(token, True, read=False, records=0, completed=True) + state.deliveries += 1 + reads_before = state.reads + records = await self._catch_up(token, state, client) + completed = False + if (closed or state.finished) and not state.done: + await self._complete(token, state, client) + completed = True + return Delivery( + token, + True, + read=state.reads > reads_before, + records=records, + completed=completed, + ) + + async def _closed(self, notification: Notification, client: Client) -> bool: + payload = notification.metadata.get(_CLOSED_KEY) + if payload is None: + return False + try: + converter = client.data_converter + if converter.payload_codec is not None: + [payload] = await converter.payload_codec.decode([payload]) + return bool(converter.payload_converter.from_payload(payload, bool)) + except Exception: + logger.warning( + "could not decode the notification's closed flag", exc_info=True + ) + return False + + async def _catch_up( + self, token: str, state: _Consumption[S], client: Client + ) -> int: + """Read from the cursor to the head, consuming, and return how many records.""" + handle = client.get_stream_handle(state.ref) + head = await handle.latest() + if head == state.cursor: + return 0 + state.reads += 1 + source = handle.read(after=state.cursor, result_type=self._result_type) + count = 0 + exhausted = True + try: + async for record in source: + try: + value = self._consume(record, state.value) + if inspect.isawaitable(value): + value = await value + except Exception as error: + await self._complete(token, state, client, error=error) + return count + state.value = cast(S, value) + state.cursor = record.cursor + state.records += 1 + count += 1 + if record.kind is RecordKind.FINISH: + state.finished = True + exhausted = False + break + if record.cursor == head: + exhausted = False + break + finally: + await source.aclose() + if exhausted: + # The store ended the read: nothing more will arrive on it. + state.finished = True + return count + + async def _complete( + self, + token: str, + state: _Consumption[S], + client: Client, + *, + error: BaseException | None = None, + ) -> None: + state.done = True + if error is None: + await self._post_result(token, state, client) + else: + await self._post_failure( + token, state, "failed", f"{type(error).__name__}: {error}" + ) + await self._unregister(client, state) + self._states.pop(token, None) + + async def cancel( + self, ctx: nexusrpc.handler.CancelOperationContext, token: str + ) -> None: + """Unregister the listener and report the operation canceled. + + Raises: + nexusrpc.HandlerError: ``NOT_FOUND`` when this process holds no + operation under ``token``. + """ + del ctx + state = self._states.get(token) + if state is None: + raise nexusrpc.HandlerError( + "no stream consumer operation is held under this token", + type=nexusrpc.HandlerErrorType.NOT_FOUND, + retryable_override=False, + ) + client = self._client() + if state.opening is not None and not state.opening.done(): + state.opening.cancel() + async with state.lock: + if state.done: + return + state.done = True + await self._unregister(client, state) + await self._post_failure( + token, state, "canceled", "the caller canceled the stream consumer" + ) + self._states.pop(token, None) + + async def close(self) -> None: + """Unregister every listener this process still holds, completing nothing. + + Call it when the hosting process stops, so the server does not keep + posting to a URL nobody serves. + """ + client = self._given_client + for token, state in list(self._states.items()): + if state.opening is not None and not state.opening.done(): + state.opening.cancel() + state.done = True + if client is not None: + await self._unregister(client, state) + self._states.pop(token, None) + + async def _unregister(self, client: Client, state: _Consumption[S]) -> None: + try: + await client.unregister_channel_listener(state.channel, state.listener_id) + except RPCError: + logger.warning( + "could not unregister listener %s from channel %s", + state.listener_id, + state.channel, + exc_info=True, + ) + + async def _post_result( + self, token: str, state: _Consumption[S], client: Client + ) -> None: + converter = client.data_converter + [payload] = converter.payload_converter.to_payloads([state.value]) + if converter.payload_codec is not None: + [payload] = await converter.payload_codec.encode([payload]) + headers, body = _payload_content(payload) + await self._post(token, state, "succeeded", headers, body) + + async def _post_failure( + self, token: str, state: _Consumption[S], outcome: str, message: str + ) -> None: + await self._post( + token, + state, + outcome, + {_CONTENT_TYPE_HEADER: _FAILURE_CONTENT_TYPE}, + json.dumps({"message": message}).encode(), + ) + + async def _post( + self, + token: str, + state: _Consumption[S], + outcome: str, + content: Mapping[str, str], + body: bytes, + ) -> None: + if not state.callback_url: + logger.warning( + "operation %s %s with no completion callback to tell", token, outcome + ) + return + headers = { + **state.callback_headers, + _TOKEN_HEADER: token, + _STATE_HEADER: outcome, + _START_TIME_HEADER: email.utils.format_datetime(state.started, usegmt=True), + **content, + } + try: + await asyncio.to_thread( + _post_completion, state.callback_url, body, headers, _COMPLETION_TIMEOUT + ) + except _EndpointFailure: + logger.exception("could not complete operation %s as %s", token, outcome) + + +def stream_consumer_operation( + consume: ConsumeFunction[S], + *, + initial: Callable[[], S], + listener_url: str, + client: Client | None = None, + channel_for: Callable[[StreamRef], str] = stream_channel_name, + result_type: type | None = None, + token_header: str = STREAM_CONSUMER_TOKEN_HEADER, +) -> StreamConsumerOperation[S]: + """Turn ``consume`` into an asynchronous operation handler that consumes a stream. + + A service handler returns the result from an operation handler factory, + and the hosting process feeds the deliveries it receives at + ``listener_url`` to the same object's :meth:`StreamConsumerOperation.deliver`. + See :class:`StreamConsumerOperation` for the arguments and the contract. + """ + return StreamConsumerOperation( + consume, + initial=initial, + listener_url=listener_url, + client=client, + channel_for=channel_for, + result_type=result_type, + token_header=token_header, + ) diff --git a/temporalio/streams/providers/nexus_consumer_service.py b/temporalio/streams/providers/nexus_consumer_service.py new file mode 100644 index 000000000..0aea10d46 --- /dev/null +++ b/temporalio/streams/providers/nexus_consumer_service.py @@ -0,0 +1,509 @@ +r"""A standalone Nexus handler process that consumes a stream through its channel. + +The Temporal frontend forwards a caller's ``StartOperation`` to an endpoint +whose target is an external URL, over the Nexus HTTP protocol. This module +serves that protocol with aiohttp for one :class:`nexusrpc.handler.Handler`, +start and cancel, and one more route the server's notification channels post +to, which it hands to the :class:`StreamConsumerOperation` instances it was +given. It is the shape the PoC demonstrates: a process with a URL of its own, +no worker, consuming a stream the server tells it about. + +Run it with one command, against a server that serves channels and a stream +front endpoint named ``streams``:: + + uv run python -m temporalio.streams.providers.nexus_consumer_service \\ + --address 127.0.0.1:7813 --http http://127.0.0.1:7823 \\ + --endpoint streams --port 8813 --register-endpoint consumers + +``--register-endpoint`` creates a Nexus endpoint whose target is this process, +so a workflow calls ``CollectStream.collect`` on it with a ``StreamRef`` and +gets the stream's values back when the stream closes. The server has to allow +this host in ``callback.allowedAddresses``. + +The wire details are the Nexus SDK's: a start is ``POST /{service}/{operation}`` +with the input as the body, the caller's completion callback in the ``callback`` +query parameter and its headers under the ``Nexus-Callback-`` prefix; an +asynchronous start answers ``201`` with the operation token; a cancel is +``POST /{service}/{operation}/cancel`` with the token in +``Nexus-Operation-Token`` and answers ``202``; a handler error answers the +status its type maps to with a JSON failure body. The body of a start is +turned into a payload the way the server does it, by content type, and a +synchronous result goes back the same way. +""" + +from __future__ import annotations + +import argparse +import asyncio +import logging +import re +import uuid +from collections.abc import Mapping, Sequence +from datetime import datetime, timedelta, timezone +from typing import Any + +import nexusrpc +import nexusrpc.handler +from aiohttp import web + +import temporalio.converter +from temporalio.api.common.v1 import Payload +from temporalio.api.nexus.v1 import EndpointSpec, EndpointTarget +from temporalio.api.operatorservice.v1 import CreateNexusEndpointRequest +from temporalio.client import Client +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams._record import RecordKind, StreamRecord +from temporalio.streams._ref import StreamRef +from temporalio.streams.providers.nexus import ( + NexusStreams, + StreamConsumerOperation, + _payload_content, + stream_consumer_operation, +) + +__all__ = [ + "CollectStream", + "CollectStreamHandler", + "NexusHttpService", + "collect_values", + "main", +] + +logger = logging.getLogger(__name__) + +_CALLBACK_PREFIX = "nexus-callback-" +_CONTENT_PREFIX = "content-" +_REQUEST_ID_HEADER = "nexus-request-id" +_REQUEST_TIMEOUT_HEADER = "request-timeout" +_OPERATION_TOKEN_HEADER = "nexus-operation-token" +_OPERATION_STATE_HEADER = "nexus-operation-state" +_RETRYABLE_HEADER = "nexus-request-retryable" +_CALLBACK_QUERY = "callback" +_TOKEN_QUERY = "token" +_DEFAULT_DELIVERIES_PATH = "/deliveries" + +# The status each handler error type answers with, per the Nexus HTTP spec. +_ERROR_STATUS = { + nexusrpc.HandlerErrorType.BAD_REQUEST: 400, + nexusrpc.HandlerErrorType.UNAUTHENTICATED: 401, + nexusrpc.HandlerErrorType.UNAUTHORIZED: 403, + nexusrpc.HandlerErrorType.NOT_FOUND: 404, + nexusrpc.HandlerErrorType.REQUEST_TIMEOUT: 408, + nexusrpc.HandlerErrorType.CONFLICT: 409, + nexusrpc.HandlerErrorType.RESOURCE_EXHAUSTED: 429, + nexusrpc.HandlerErrorType.INTERNAL: 500, + nexusrpc.HandlerErrorType.NOT_IMPLEMENTED: 501, + nexusrpc.HandlerErrorType.UNAVAILABLE: 503, + nexusrpc.HandlerErrorType.UPSTREAM_TIMEOUT: 520, +} +_OPERATION_FAILED_STATUS = 424 + +_DURATION = re.compile(r"(\d+(?:\.\d+)?)(ns|us|µs|ms|s|m|h)") +_UNIT_SECONDS = { + "ns": 1e-9, + "us": 1e-6, + "µs": 1e-6, + "ms": 1e-3, + "s": 1.0, + "m": 60.0, + "h": 3600.0, +} + + +class _NeverCancelled(nexusrpc.handler.OperationTaskCancellation): + """The task cancellation of a request no worker is going to cancel.""" + + def is_cancelled(self) -> bool: + return False + + def cancellation_reason(self) -> str | None: + return None + + def wait_until_cancelled_sync(self, timeout: float | None = None) -> bool: + del timeout + return False + + async def wait_until_cancelled(self) -> None: + await asyncio.Event().wait() + + +def _deadline(timeout: str | None) -> datetime | None: + """The request deadline a Go duration string in ``Request-Timeout`` names.""" + if not timeout: + return None + seconds = 0.0 + matched = False + for amount, unit in _DURATION.findall(timeout): + seconds += float(amount) * _UNIT_SECONDS[unit] + matched = True + if not matched: + return None + return datetime.now(timezone.utc) + timedelta(seconds=seconds) + + +def _media_type(content_type: str) -> tuple[str, dict[str, str]]: + media, _, rest = content_type.partition(";") + params: dict[str, str] = {} + for part in rest.split(";"): + key, _, value = part.strip().partition("=") + if key: + params[key.strip().lower()] = value.strip().strip('"') + return media.strip().lower(), params + + +def _payload_from_content(headers: Mapping[str, str], body: bytes) -> Payload: + """The payload a start body is, mapped the way the server maps Nexus content.""" + content = { + key[len(_CONTENT_PREFIX) :]: value + for key, value in headers.items() + if key.startswith(_CONTENT_PREFIX) + } + content_type = content.pop("type", "") + content.pop("length", None) + if not content_type: + if not content and not body: + return Payload(metadata={"encoding": b"binary/null"}) + return _unknown(content, body) + media, params = _media_type(content_type) + if media == "application/x-temporal-payload": + return Payload.FromString(body) + if media == "application/json": + if params.get("format") == "protobuf" and params.get("message-type"): + return Payload( + metadata={ + "encoding": b"json/protobuf", + "messageType": params["message-type"].encode(), + }, + data=body, + ) + return Payload(metadata={"encoding": b"json/plain"}, data=body) + if media == "application/x-protobuf" and params.get("message-type"): + return Payload( + metadata={ + "encoding": b"binary/protobuf", + "messageType": params["message-type"].encode(), + }, + data=body, + ) + if media == "application/octet-stream": + return Payload(metadata={"encoding": b"binary/plain"}, data=body) + content["type"] = content_type + return _unknown(content, body) + + +def _unknown(content: Mapping[str, str], body: bytes) -> Payload: + metadata = {key: value.encode() for key, value in content.items()} + metadata["encoding"] = b"unknown/nexus-content" + return Payload(metadata=metadata, data=body) + + +class _PayloadSerializer: + """Hands a start's payload to the handler through the data converter.""" + + def __init__( + self, converter: temporalio.converter.DataConverter, payload: Payload + ) -> None: + self._converter = converter + self._payload = payload + + async def serialize(self, value: Any) -> nexusrpc.Content: + del value + raise NotImplementedError("the service serializes results itself") + + async def deserialize( + self, content: nexusrpc.Content, as_type: type[Any] | None = None + ) -> Any: + del content + payload = self._payload + if self._converter.payload_codec is not None: + [payload] = await self._converter.payload_codec.decode([payload]) + try: + [value] = self._converter.payload_converter.from_payloads( + [payload], [as_type] if as_type is not None else None + ) + except Exception as error: + raise nexusrpc.HandlerError( + f"invalid operation input: {error}", + type=nexusrpc.HandlerErrorType.BAD_REQUEST, + retryable_override=False, + ) from error + return value + + +def _failure(error: nexusrpc.HandlerError) -> web.Response: + headers = {} + if error.retryable_override is not None: + headers[_RETRYABLE_HEADER] = "true" if error.retryable_override else "false" + error_type = ( + error.type + if isinstance(error.type, nexusrpc.HandlerErrorType) + else nexusrpc.HandlerErrorType.UNKNOWN + ) + return web.json_response( + {"message": error.message}, + status=_ERROR_STATUS.get(error_type, 500), + headers=headers, + ) + + +class NexusHttpService: + """Serves one Nexus handler over HTTP, plus the route channel deliveries reach. + + ``handler`` is the Nexus SDK's dispatcher over the service handlers the + process hosts. ``consumers`` are the stream consumer operations among + them; a delivery is offered to each until one holds the operation it + names. ``data_converter`` turns start bodies into inputs and results + into bodies; the caller's converter when a client is at hand. + + .. warning:: + This API is experimental and unstable. + """ + + def __init__( + self, + handler: nexusrpc.handler.Handler, + consumers: Sequence[StreamConsumerOperation[Any]], + *, + data_converter: temporalio.converter.DataConverter | None = None, + deliveries_path: str = _DEFAULT_DELIVERIES_PATH, + ) -> None: + """Serve ``handler`` and route deliveries at ``deliveries_path`` to ``consumers``.""" + if deliveries_path.count("/") != 1 or not deliveries_path.startswith("/"): + raise ValueError( + "deliveries_path must be one path segment, so it cannot be mistaken " + "for a start request" + ) + self._handler = handler + self._consumers = list(consumers) + self._converter = data_converter or temporalio.converter.DataConverter.default + self._deliveries_path = deliveries_path + + @property + def deliveries_path(self) -> str: + """The route the channel's deliveries are served at.""" + return self._deliveries_path + + def application(self) -> web.Application: + """The aiohttp application serving the routes; run it with the usual runner.""" + app = web.Application() + app.add_routes( + [ + web.post(self._deliveries_path, self._deliver), + web.post("/{service}/{operation}", self._start), + web.post("/{service}/{operation}/cancel", self._cancel), + ] + ) + return app + + async def _start(self, request: web.Request) -> web.Response: + headers = {key.lower(): value for key, value in request.headers.items()} + body = await request.read() + ctx = nexusrpc.handler.StartOperationContext( + service=request.match_info["service"], + operation=request.match_info["operation"], + headers={ + key: value + for key, value in headers.items() + if not key.startswith((_CONTENT_PREFIX, _CALLBACK_PREFIX)) + }, + request_id=headers.get(_REQUEST_ID_HEADER) or uuid.uuid4().hex, + callback_url=request.query.get(_CALLBACK_QUERY), + callback_headers={ + key[len(_CALLBACK_PREFIX) :]: value + for key, value in headers.items() + if key.startswith(_CALLBACK_PREFIX) + }, + task_cancellation=_NeverCancelled(), + request_deadline=_deadline(headers.get(_REQUEST_TIMEOUT_HEADER)), + ) + input = nexusrpc.LazyValue( + serializer=_PayloadSerializer( + self._converter, _payload_from_content(headers, body) + ), + headers={}, + stream=None, + ) + try: + result = await self._handler.start_operation(ctx, input) + except nexusrpc.HandlerError as error: + return _failure(error) + except nexusrpc.OperationError as error: + return web.json_response( + {"message": str(error)}, + status=_OPERATION_FAILED_STATUS, + headers={_OPERATION_STATE_HEADER: error.state.value}, + ) + if isinstance(result, nexusrpc.handler.StartOperationResultAsync): + return web.json_response( + {"token": result.token, "state": "running"}, status=201 + ) + [payload] = self._converter.payload_converter.to_payloads([result.value]) + if self._converter.payload_codec is not None: + [payload] = await self._converter.payload_codec.encode([payload]) + content, data = _payload_content(payload) + return web.Response(status=200, body=data, headers=content) + + async def _cancel(self, request: web.Request) -> web.Response: + headers = {key.lower(): value for key, value in request.headers.items()} + token = headers.get(_OPERATION_TOKEN_HEADER) or request.query.get(_TOKEN_QUERY) + if not token: + return _failure( + nexusrpc.HandlerError( + "missing operation token", + type=nexusrpc.HandlerErrorType.BAD_REQUEST, + ) + ) + ctx = nexusrpc.handler.CancelOperationContext( + service=request.match_info["service"], + operation=request.match_info["operation"], + headers={ + key: value + for key, value in headers.items() + if key != _OPERATION_TOKEN_HEADER + }, + task_cancellation=_NeverCancelled(), + ) + try: + await self._handler.cancel_operation(ctx, token) + except nexusrpc.HandlerError as error: + return _failure(error) + return web.Response(status=202) + + async def _deliver(self, request: web.Request) -> web.Response: + body = await request.read() + headers = dict(request.headers) + try: + for consumer in self._consumers: + if (await consumer.deliver(headers, body)).known: + break + except Exception as error: + # A 5xx makes the server retry the delivery, which is what a + # failed read needs. + logger.exception("a channel delivery failed") + return web.json_response({"message": str(error)}, status=500) + return web.Response(status=200) + + +# --------------------------------------------------------------------------- +# The demo service: collect a stream's values into the operation's result. +# --------------------------------------------------------------------------- + + +def collect_values(record: StreamRecord[Any], values: list[Any]) -> list[Any]: + """The demo's consume function: keep every published value, in order.""" + if record.kind is RecordKind.DATA: + values.append(record.value) + return values + + +@nexusrpc.service +class CollectStream: + """Consumes the stream a ref names and answers with its values when it closes.""" + + collect: nexusrpc.Operation[StreamRef, list[Any]] + + +@nexusrpc.handler.service_handler(service=CollectStream) +class CollectStreamHandler: + """Serves :class:`CollectStream` out of one consumer operation.""" + + def __init__(self, consumer: StreamConsumerOperation[list[Any]]) -> None: + """Serve ``collect`` with ``consumer``, which the deliveries also reach.""" + self._consumer = consumer + + @nexusrpc.handler.operation_handler + def collect(self) -> nexusrpc.handler.OperationHandler[StreamRef, list[Any]]: + """The consumer operation, as the operation handler factory hands it out.""" + return self._consumer + + +async def _register_endpoint(client: Client, name: str, url: str) -> None: + try: + await client.operator_service.create_nexus_endpoint( + CreateNexusEndpointRequest( + spec=EndpointSpec( + name=name, + target=EndpointTarget(external=EndpointTarget.External(url=url)), + ) + ) + ) + logger.info("registered nexus endpoint %s -> %s", name, url) + except RPCError as error: + if error.status is not RPCStatusCode.ALREADY_EXISTS: + raise + logger.info("nexus endpoint %s exists; leaving it as it is", name) + + +async def main(argv: Sequence[str] | None = None) -> None: + """Serve the demo consumer until interrupted; see the module docstring.""" + parser = argparse.ArgumentParser(description=(__doc__ or "").split("\n\n")[0]) + parser.add_argument( + "--address", default="127.0.0.1:7233", help="the server's gRPC address" + ) + parser.add_argument("--namespace", default="default") + parser.add_argument( + "--http", + default="http://127.0.0.1:7243", + help="the server's Nexus HTTP ingress, where the stream front is read", + ) + parser.add_argument( + "--endpoint", required=True, help="the stream front's Nexus endpoint name" + ) + parser.add_argument("--host", default="127.0.0.1", help="the interface to serve on") + parser.add_argument("--port", type=int, default=8813, help="the port to serve on") + parser.add_argument( + "--listener-url", + default=None, + help="the URL the server posts deliveries to; defaults to this process's route", + ) + parser.add_argument( + "--register-endpoint", + default=None, + metavar="NAME", + help="create a Nexus endpoint of this name whose target is this process", + ) + args = parser.parse_args(argv) + logging.basicConfig( + level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s" + ) + + base_url = f"http://{args.host}:{args.port}" + client = await Client.connect( + args.address, + namespace=args.namespace, + plugins=[NexusStreams(endpoint=args.endpoint, http_address=args.http)], + ) + consumer = stream_consumer_operation( + collect_values, + initial=list, + listener_url=args.listener_url or base_url + _DEFAULT_DELIVERIES_PATH, + client=client, + ) + service = NexusHttpService( + nexusrpc.handler.Handler([CollectStreamHandler(consumer)]), + [consumer], + data_converter=client.data_converter, + ) + runner = web.AppRunner(service.application()) + await runner.setup() + try: + await web.TCPSite(runner, args.host, args.port).start() + if args.register_endpoint: + await _register_endpoint(client, args.register_endpoint, base_url) + logger.info( + "serving %s at %s, deliveries at %s", + CollectStream.__name__, + base_url, + consumer._listener_url, # pyright: ignore[reportPrivateUsage] + ) + await asyncio.Event().wait() + finally: + await consumer.close() + await runner.cleanup() + + +if __name__ == "__main__": + try: + asyncio.run(main()) + except KeyboardInterrupt: + pass From 560e278bad84dba9b19ef72b5999dcb19c1c1e38 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:12:35 -0700 Subject: [PATCH 795/831] Tested the stream consumer against a channel server. Unit cases drive the state machine with a client stand-in over the memory store. Live cases put the memory store behind the front and notify the channel by hand, since this layer has no store that notifies on its own. The worker-hosted variant stops before the close: a worker's start context names temporal://system as the callback, which an HTTP post cannot reach. --- tests/streams/conftest.py | 24 + tests/streams/test_nexus_consumer.py | 977 +++++++++++++++++++++++++++ 2 files changed, 1001 insertions(+) create mode 100644 tests/streams/test_nexus_consumer.py diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index cf16360de..afdb1bcf7 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -14,6 +14,12 @@ # only talks to the server from the client runs on every layer. PINNED_CORE_HANDLES_LINKED_CHANNEL = False +# A native stream's writes notify a channel named after the stream only on a +# server that has the stream component do so. The channel servers this chain +# runs against do not yet, so a case that consumes a native stream through +# its channel waits for one that does. +SERVER_NAMES_STREAM_CHANNELS = False + def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( @@ -64,6 +70,11 @@ def pytest_configure(config: pytest.Config) -> None: "needs_linked_core: the case needs the pinned Core to hand a linked " "channel's notifications to workflow code", ) + config.addinivalue_line( + "markers", + "needs_stream_channel_server: the case needs a server whose native streams " + "notify a channel named after them, named with -E host:port", + ) def pytest_collection_modifyitems( @@ -113,6 +124,19 @@ def pytest_collection_modifyitems( ), ) ) + if ( + config.getoption("--workflow-environment") in _ENVIRONMENTS_WITHOUT_CHANNELS + or not SERVER_NAMES_STREAM_CHANNELS + ): + skips.append( + ( + "needs_stream_channel_server", + pytest.mark.skip( + reason="needs a server whose native streams notify a channel " + "named after them; name one with -E once a layer has it" + ), + ) + ) for item in items: for marker, skip in skips: if item.get_closest_marker(marker): diff --git a/tests/streams/test_nexus_consumer.py b/tests/streams/test_nexus_consumer.py new file mode 100644 index 000000000..715674425 --- /dev/null +++ b/tests/streams/test_nexus_consumer.py @@ -0,0 +1,977 @@ +"""The Nexus operation that consumes a stream through its notification channel. + +The unit cases drive :class:`StreamConsumerOperation` with a client stand-in +over the memory store and the deliveries a server would post, and catch what +it posts back as completions. The live cases need a server with notification +channels and a Nexus HTTP ingress, named with ``-E host:port`` and +``TEMPORAL_HTTP``; they put the memory store behind the Nexus front, because +this layer carries no store whose producers notify a channel themselves, so +the producer notifies the stream's channel by hand the way such a store +would. The consumer's HTTP port is ``STREAM_CONSUMER_PORT``, 8813 by default. +""" + +from __future__ import annotations + +import asyncio +import contextlib +import email.utils +import json +import os +import uuid +from collections.abc import AsyncIterator, Callable, Mapping +from dataclasses import dataclass +from datetime import timedelta +from typing import Any, cast + +import nexusrpc +import nexusrpc.handler +import pytest +from aiohttp import web +from aiohttp.test_utils import TestClient, TestServer +from google.protobuf import json_format + +import temporalio.api.notification.v1 +import temporalio.converter +from temporalio import workflow +from temporalio.api.nexus.v1 import EndpointSpec, EndpointTarget +from temporalio.api.operatorservice.v1 import ( + CreateNexusEndpointRequest, + DeleteNexusEndpointRequest, +) +from temporalio.client import Callback, Client +from temporalio.exceptions import NexusOperationError +from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import BEGINNING, StreamProvider, StreamRecord, StreamRef +from temporalio.streams._ref import open_ref +from temporalio.streams.providers import nexus +from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.nexus import ( + STREAM_CONSUMER_TOKEN_HEADER, + NexusStreams, + StreamConsumerOperation, + TemporalStreamsHandler, + stream_channel_name, + stream_consumer_operation, +) +from temporalio.streams.providers.nexus_consumer_service import ( + CollectStream, + CollectStreamHandler, + NexusHttpService, + _NeverCancelled, + collect_values, +) +from temporalio.worker import Worker +from tests.helpers import assert_eventually +from tests.streams.test_nexus_provider import _own_endpoint + +VALUES = "values" +LISTENER_URL = "http://127.0.0.1:8813/deliveries" +CALLBACK_URL = "http://caller.invalid/namespaces/default/nexus/callback" +CALLBACK_HEADERS = {"temporal-callback-token": "caller-token"} + +_HTTP = os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243") +_PORT = int(os.environ.get("STREAM_CONSUMER_PORT", "8813")) + + +# --------------------------------------------------------------------------- +# Stand-ins. +# --------------------------------------------------------------------------- + + +def _as_client(stand_in: object) -> Client: + """Pass a stand-in where a client is typed; the consumer uses only what both have.""" + return cast(Client, stand_in) + + +class _ClientStandIn: + """What the consumer asks of a client: a provider, a converter, the channel calls.""" + + def __init__(self, store: MemoryStreams) -> None: + self._store = store + self.data_converter = temporalio.converter.DataConverter.default + self.registered: list[tuple[str, Callback]] = [] + self.unregistered: list[tuple[str, str]] = [] + + def get_stream_handle(self, ref: StreamRef) -> Any: + # The memory store opens a handle without a client. + return open_ref(self._store, _as_client(None), ref) + + async def register_channel_listener(self, channel: str, callback: Callback) -> str: + self.registered.append((channel, callback)) + return f"listener-{len(self.registered)}" + + async def unregister_channel_listener(self, channel: str, listener_id: str) -> None: + self.unregistered.append((channel, listener_id)) + + +@dataclass +class _Posted: + url: str + headers: dict[str, str] + body: bytes + + @property + def state(self) -> str: + return self.headers["Nexus-Operation-State"] + + +@pytest.fixture +def posted(monkeypatch: pytest.MonkeyPatch) -> list[_Posted]: + """Catch the completions the consumer posts to the caller's callback.""" + caught: list[_Posted] = [] + + def record(url: str, body: bytes, headers: Mapping[str, str], timeout: Any) -> None: + del timeout + caught.append(_Posted(url, dict(headers), body)) + + monkeypatch.setattr(nexus, "_post_completion", record) + return caught + + +def _start_context( + callback_url: str | None = CALLBACK_URL, +) -> nexusrpc.handler.StartOperationContext: + return nexusrpc.handler.StartOperationContext( + service="CollectStream", + operation="collect", + headers={}, + request_id=uuid.uuid4().hex, + callback_url=callback_url, + callback_headers=dict(CALLBACK_HEADERS), + task_cancellation=_NeverCancelled(), + ) + + +def _cancel_context() -> nexusrpc.handler.CancelOperationContext: + return nexusrpc.handler.CancelOperationContext( + service="CollectStream", + operation="collect", + headers={}, + task_cancellation=_NeverCancelled(), + ) + + +def _notification( + channel: str, counter: int, *, position: bytes = b"", closed: bool = False +) -> bytes: + """The body the server posts: the notification as protobuf JSON.""" + proto = temporalio.api.notification.v1.Notification( + channel=channel, counter=counter, position=position + ) + if closed: + proto.metadata["closed"].CopyFrom( + temporalio.converter.DataConverter.default.payload_converter.to_payload( + True + ) + ) + return json_format.MessageToJson(proto).encode() + + +@dataclass +class _Rig: + store: MemoryStreams + client: _ClientStandIn + operation: StreamConsumerOperation[list[Any]] + ref: StreamRef + channel: str + producer: Any + + async def start(self) -> str: + result = await self.operation.start(_start_context(), self.ref) + assert isinstance(result, nexusrpc.handler.StartOperationResultAsync) + await self.settled(result.token) + return result.token + + async def settled(self, token: str) -> None: + """Wait for the read the start kicked off.""" + opening = self.operation._states[token].opening + assert opening is not None + await asyncio.wait_for(opening, 10) + + def headers(self, token: str) -> dict[str, str]: + return {STREAM_CONSUMER_TOKEN_HEADER: token} + + async def deliver(self, token: str, counter: int, *, closed: bool = False) -> Any: + return await self.operation.deliver( + self.headers(token), _notification(self.channel, counter, closed=closed) + ) + + +async def _rig( + consume: Callable[[StreamRecord[Any], list[Any]], list[Any]] = collect_values, +) -> _Rig: + store = MemoryStreams() + stream_id = f"consumed-{uuid.uuid4().hex}" + handle = await store.create_standalone_stream(None, stream_id) + ref = handle.ref(topic=VALUES) + client = _ClientStandIn(store) + operation = stream_consumer_operation( + consume, + initial=list, + listener_url=LISTENER_URL, + client=_as_client(client), + ) + return _Rig( + store, + client, + operation, + ref, + stream_channel_name(ref), + handle.producer(topic=VALUES, producer_id="writer", attempt=1), + ) + + +# --------------------------------------------------------------------------- +# The helper's state machine. +# --------------------------------------------------------------------------- + + +def test_the_channel_name_folds_the_owner_and_the_topic(): + assert ( + stream_channel_name(StreamRef.for_standalone("s-1", topic="values")) + == "stream:standalone:s-1:values" + ) + assert ( + stream_channel_name(StreamRef.for_workflow("wf", topic="t")) + == "stream:workflow:wf::t" + ) + assert ( + stream_channel_name(StreamRef.for_workflow("wf", run_id="r", topic="t")) + == "stream:workflow:wf:r:t" + ) + assert ( + stream_channel_name(StreamRef.for_activity("act", workflow_id="wf", topic="t")) + == "stream:activity:wf::act:t" + ) + + +async def test_start_registers_the_listener_and_reads_what_was_there( + posted: list[_Posted], +): + rig = await _rig() + await rig.producer.append("a", "b") + token = await rig.start() + + assert rig.operation.tokens == [token] + assert rig.client.registered == [ + ( + rig.channel, + Callback(url=LISTENER_URL, headers={STREAM_CONSUMER_TOKEN_HEADER: token}), + ) + ] + state = rig.operation.state(token) + assert state is not None + assert state.value == ["a", "b"] + assert (state.reads, state.deliveries, state.records) == (1, 0, 2) + assert state.cursor != BEGINNING + assert state.listener_id == "listener-1" + assert posted == [] + + +async def test_a_delivery_reads_from_the_cursor_once_and_in_order( + posted: list[_Posted], +): + rig = await _rig() + await rig.producer.append("a") + token = await rig.start() + + # Records after the registration arrive on the next delivery, each once. + await rig.producer.append("b", "c") + delivery = await rig.deliver(token, 1) + assert (delivery.known, delivery.read, delivery.records, delivery.completed) == ( + True, + True, + 2, + False, + ) + state = rig.operation.state(token) + assert state is not None and state.value == ["a", "b", "c"] + + # A delivery that brings nothing new reads nothing. + delivery = await rig.deliver(token, 1) + assert (delivery.read, delivery.records) == (False, 0) + state = rig.operation.state(token) + assert state is not None and (state.reads, state.deliveries) == (2, 2) + + # A burst the channel folded into one delivery costs one read. + await rig.producer.append("d", "e", "f") + delivery = await rig.operation.deliver( + {STREAM_CONSUMER_TOKEN_HEADER.lower(): token}, _notification(rig.channel, 4) + ) + assert (delivery.read, delivery.records) == (True, 3) + state = rig.operation.state(token) + assert state is not None + assert state.value == ["a", "b", "c", "d", "e", "f"] + assert (state.reads, state.deliveries, state.records) == (3, 3, 6) + assert posted == [] + + +async def test_the_close_completes_through_the_callers_callback( + posted: list[_Posted], +): + rig = await _rig() + await rig.producer.append("a") + token = await rig.start() + await rig.producer.append("b") + + delivery = await rig.deliver(token, 2, closed=True) + assert (delivery.read, delivery.records, delivery.completed) == (True, 1, True) + [completion] = posted + assert completion.url == CALLBACK_URL + assert completion.state == "succeeded" + assert completion.headers["temporal-callback-token"] == "caller-token" + assert completion.headers["Nexus-Operation-Token"] == token + assert completion.headers["Content-Type"] == "application/json" + assert email.utils.parsedate_to_datetime( + completion.headers["Nexus-Operation-Start-Time"] + ) + assert json.loads(completion.body) == ["a", "b"] + assert rig.client.unregistered == [(rig.channel, "listener-1")] + assert rig.operation.state(token) is None + assert rig.operation.tokens == [] + + # Once complete, the token is unknown and a late delivery is ignored. + delivery = await rig.deliver(token, 3) + assert (delivery.known, delivery.read) == (False, False) + assert len(posted) == 1 + + +async def test_a_finish_record_closes_the_operation(posted: list[_Posted]): + rig = await _rig() + token = await rig.start() + await rig.producer.append("only") + await rig.producer.finish() + + delivery = await rig.deliver(token, 1) + assert delivery.completed + [completion] = posted + assert completion.state == "succeeded" + assert json.loads(completion.body) == ["only"] + assert rig.client.unregistered == [(rig.channel, "listener-1")] + + +async def test_a_stream_finished_before_the_start_completes_at_once( + posted: list[_Posted], +): + rig = await _rig() + await rig.producer.append("a") + await rig.producer.finish() + token = await rig.start() + assert rig.operation.state(token) is None + [completion] = posted + assert completion.state == "succeeded" + assert json.loads(completion.body) == ["a"] + + +async def test_cancel_unregisters_and_reports_canceled(posted: list[_Posted]): + rig = await _rig() + token = await rig.start() + + await rig.operation.cancel(_cancel_context(), token) + assert rig.client.unregistered == [(rig.channel, "listener-1")] + [completion] = posted + assert completion.state == "canceled" + assert completion.headers["Nexus-Operation-Token"] == token + assert completion.headers["Content-Type"] == "application/json" + assert "canceled" in json.loads(completion.body)["message"] + assert rig.operation.state(token) is None + + with pytest.raises(nexusrpc.HandlerError) as unknown: + await rig.operation.cancel(_cancel_context(), token) + assert unknown.value.type is nexusrpc.HandlerErrorType.NOT_FOUND + + +async def test_a_delivery_for_an_operation_not_held_here_is_ignored( + posted: list[_Posted], +): + rig = await _rig() + await rig.producer.append("a") + delivery = await rig.operation.deliver({}, _notification(rig.channel, 1)) + assert (delivery.token, delivery.known) == (None, False) + delivery = await rig.deliver("nobody", 1) + assert (delivery.token, delivery.known, delivery.read) == ("nobody", False, False) + assert posted == [] + + +async def test_a_consume_failure_fails_the_operation(posted: list[_Posted]): + def fussy(record: StreamRecord[Any], values: list[Any]) -> list[Any]: + if record.value == "bad": + raise ValueError("cannot take bad") + return collect_values(record, values) + + rig = await _rig(fussy) + token = await rig.start() + await rig.producer.append("good", "bad", "later") + delivery = await rig.deliver(token, 1) + assert (delivery.records, delivery.completed) == (1, False) + [completion] = posted + assert completion.state == "failed" + assert json.loads(completion.body)["message"] == "ValueError: cannot take bad" + assert rig.client.unregistered == [(rig.channel, "listener-1")] + assert rig.operation.state(token) is None + + +async def test_a_read_failure_leaves_the_operation_for_the_retry( + posted: list[_Posted], monkeypatch: pytest.MonkeyPatch +): + rig = await _rig() + token = await rig.start() + await rig.producer.append("a") + handle = rig.client.get_stream_handle + + def broken(ref: StreamRef) -> Any: + del ref + raise RuntimeError("the store is away") + + monkeypatch.setattr(rig.client, "get_stream_handle", broken) + with pytest.raises(RuntimeError, match="away"): + await rig.deliver(token, 1) + monkeypatch.setattr(rig.client, "get_stream_handle", handle) + delivery = await rig.deliver(token, 1) + assert (delivery.read, delivery.records) == (True, 1) + assert posted == [] + + +async def test_close_lets_go_of_every_listener_without_completing( + posted: list[_Posted], +): + rig = await _rig() + first = await rig.start() + second = await rig.start() + assert rig.operation.tokens == [first, second] + await rig.operation.close() + assert rig.operation.tokens == [] + assert rig.client.unregistered == [ + (rig.channel, "listener-1"), + (rig.channel, "listener-2"), + ] + assert posted == [] + + +async def test_a_null_result_travels_without_a_content_type(posted: list[_Posted]): + def nothing(record: StreamRecord[Any], value: None) -> None: + del record + return value + + store = MemoryStreams() + handle = await store.create_standalone_stream(None, "silent") + ref = handle.ref(topic=VALUES) + client = _ClientStandIn(store) + operation = stream_consumer_operation( + nothing, + initial=lambda: None, + listener_url=LISTENER_URL, + client=_as_client(client), + ) + result = await operation.start(_start_context(), ref) + assert isinstance(result, nexusrpc.handler.StartOperationResultAsync) + await handle.producer(topic=VALUES, producer_id="w", attempt=1).finish() + await operation.deliver( + {STREAM_CONSUMER_TOKEN_HEADER: result.token}, + _notification(stream_channel_name(ref), 1), + ) + [completion] = posted + assert completion.state == "succeeded" + assert "Content-Type" not in completion.headers + assert completion.body == b"" + + +async def test_the_listener_url_must_be_given(): + with pytest.raises(ValueError, match="listener_url"): + stream_consumer_operation(collect_values, initial=list, listener_url="") + + +# --------------------------------------------------------------------------- +# The standalone service speaks the Nexus HTTP protocol. +# --------------------------------------------------------------------------- + + +async def test_the_service_speaks_the_nexus_http_protocol(posted: list[_Posted]): + rig = await _rig() + service = NexusHttpService( + nexusrpc.handler.Handler([CollectStreamHandler(rig.operation)]), [rig.operation] + ) + converter = temporalio.converter.DataConverter.default.payload_converter + ref_body = converter.to_payload(rig.ref).data + async with TestClient(TestServer(service.application())) as http: + # A start carries the completion callback in the query and its + # headers under the callback prefix; an asynchronous start is a 201. + answer = await http.post( + "/CollectStream/collect", + params={"callback": CALLBACK_URL}, + data=ref_body, + headers={ + "Content-Type": "application/json", + "Nexus-Request-Id": "req-1", + "Nexus-Callback-Temporal-Callback-Token": "caller-token", + "Request-Timeout": "9.5s", + }, + ) + assert answer.status == 201 + token = (await answer.json())["token"] + assert rig.operation.tokens == [token] + held = rig.operation._states[token] + assert held.callback_url == CALLBACK_URL + assert held.callback_headers == {"temporal-callback-token": "caller-token"} + await rig.settled(token) + + # The delivery route reaches the operation the token names. + await rig.producer.append("a") + answer = await http.post( + service.deliveries_path, + data=_notification(rig.channel, 1), + headers={ + "Content-Type": "application/json", + "Temporal-Notification-Channel": rig.channel, + STREAM_CONSUMER_TOKEN_HEADER: token, + }, + ) + assert answer.status == 200 + state = rig.operation.state(token) + assert state is not None and state.value == ["a"] + + # A cancel names the token in its header and is accepted; a second one + # finds nothing and says so. + answer = await http.post( + "/CollectStream/collect/cancel", headers={"Nexus-Operation-Token": token} + ) + assert answer.status == 202 + assert [p.state for p in posted] == ["canceled"] + answer = await http.post( + "/CollectStream/collect/cancel", headers={"Nexus-Operation-Token": token} + ) + assert answer.status == 404 + assert "token" in (await answer.json())["message"] + + # What is not a stream reference is the caller's fault. + answer = await http.post( + "/CollectStream/collect", + data=b'{"kind": "nowhere"}', + headers={"Content-Type": "application/json"}, + ) + assert answer.status == 400 + answer = await http.post("/Other/op", data=b"{}") + assert answer.status == 404 + + +# --------------------------------------------------------------------------- +# Live: an external stream whose producer notifies the stream's channel. +# --------------------------------------------------------------------------- + + +@dataclass +class ConsumeInput: + """Which endpoint and service to call, which stream to hand it, and whether to cancel.""" + + endpoint: str + service: str + ref: StreamRef + cancel: bool = False + + +@workflow.defn +class ConsumeCaller: + """Starts the consumer operation with a ref and awaits its result.""" + + def __init__(self) -> None: + self._go = False + + @workflow.signal + def go(self) -> None: + """Let a cancelling run cancel now.""" + self._go = True + + @workflow.run + async def run(self, input: ConsumeInput) -> Any: + """Return the operation's result, or ``"canceled"`` after a cancel.""" + client = workflow.create_nexus_client( + service=input.service, endpoint=input.endpoint + ) + handle = await client.start_operation("collect", input.ref, output_type=list) + if not input.cancel: + return await handle + await workflow.wait_condition(lambda: self._go) + handle.cancel() + try: + await handle + except NexusOperationError: + return "canceled" + return "completed" + + +@contextlib.asynccontextmanager +async def _own_external_endpoint( + client: Client, name: str, url: str +) -> AsyncIterator[str]: + """Register a Nexus endpoint whose target is ``url`` for one test's life.""" + created = await client.operator_service.create_nexus_endpoint( + CreateNexusEndpointRequest( + spec=EndpointSpec( + name=name, + target=EndpointTarget(external=EndpointTarget.External(url=url)), + ) + ) + ) + try: + yield name + finally: + await client.operator_service.delete_nexus_endpoint( + DeleteNexusEndpointRequest( + id=created.endpoint.id, version=created.endpoint.version + ) + ) + + +@dataclass +class _Live: + store: StreamProvider + fronted: Client + consumer: StreamConsumerOperation[list[Any]] + endpoint: str + service: str + + +@contextlib.asynccontextmanager +async def _consumer_service( + client: Client, store: StreamProvider | None = None +) -> AsyncIterator[_Live]: + """Stand up the front over ``store`` and the standalone consumer behind an endpoint.""" + store = store or MemoryStreams() + uid = uuid.uuid4().hex + stream_handler = TemporalStreamsHandler(store, client) + handler_tq = f"streams-{uid}" + async with ( + _own_endpoint(client, f"streams-{uid}", handler_tq) as front_endpoint, + Worker(client, task_queue=handler_tq, nexus_service_handlers=[stream_handler]), + ): + front = NexusStreams( + endpoint=front_endpoint, http_address=_HTTP, read_wait=timedelta(seconds=2) + ) + config = client.config() + config["plugins"] = [front] + fronted = Client(**config) + consumer = stream_consumer_operation( + collect_values, + initial=list, + listener_url=f"http://127.0.0.1:{_PORT}/deliveries", + client=fronted, + ) + service = NexusHttpService( + nexusrpc.handler.Handler([CollectStreamHandler(consumer)]), + [consumer], + data_converter=fronted.data_converter, + ) + runner = web.AppRunner(service.application()) + await runner.setup() + await web.TCPSite(runner, "127.0.0.1", _PORT).start() + try: + async with _own_external_endpoint( + client, f"consumers-{uid}", f"http://127.0.0.1:{_PORT}" + ) as endpoint: + yield _Live(store, fronted, consumer, endpoint, CollectStream.__name__) + finally: + await consumer.close() + await runner.cleanup() + await stream_handler.close() + + +async def _listener_token(client: Client, channel: str) -> str: + """The operation token the one callback listener on ``channel`` carries.""" + + async def registered() -> str: + # The channel comes into being with the registration, so a describe + # that races it is answered with not found. + try: + description = await client.describe_channel(channel) + except RPCError as err: + assert err.status != RPCStatusCode.NOT_FOUND, "channel not created yet" + raise + assert len(description.listeners) == 1, description.listeners + [listener] = description.listeners + assert listener.callback is not None + # The server reports the registration's headers in lower case. + headers = { + key.lower(): value for key, value in listener.callback.headers.items() + } + return headers[STREAM_CONSUMER_TOKEN_HEADER.lower()] + + return await assert_eventually(registered, timeout=timedelta(seconds=30)) + + +async def _consumed( + consumer: StreamConsumerOperation[list[Any]], token: str, count: int +) -> None: + async def reached() -> None: + state = consumer.state(token) + assert state is not None and state.records == count, state + + await assert_eventually(reached, timeout=timedelta(seconds=30)) + + +@pytest.mark.needs_channel_server +async def test_a_standalone_service_consumes_an_external_stream_through_its_channel( + client: Client, +): + store = MemoryStreams() + stream_id = f"consumed-{uuid.uuid4().hex}" + handle = await store.create_standalone_stream(None, stream_id) + ref = handle.ref(topic=VALUES) + channel = stream_channel_name(ref) + producer = handle.producer(topic=VALUES, producer_id="writer", attempt=1) + + async with _consumer_service(client, store) as live: + # Written before anyone listens: the channel keeps the notification, + # and the registration is handed it once. + await producer.append("a", "b") + assert await client.notify_channel(channel, position=b"2", counter=2) == 0 + + async with Worker( + client, task_queue=f"callers-{stream_id}", workflows=[ConsumeCaller] + ) as worker: + run = await client.start_workflow( + ConsumeCaller.run, + ConsumeInput(live.endpoint, live.service, ref), + id=f"caller-{stream_id}", + task_queue=worker.task_queue, + ) + token = await _listener_token(client, channel) + await _consumed(live.consumer, token, 2) + + # Written after the registration: each notification is delivered + # and read from the cursor; the retained one brought nothing new. + await producer.append("c") + assert await client.notify_channel(channel, position=b"3", counter=3) == 1 + await _consumed(live.consumer, token, 3) + await producer.append("d", "e", "f") + for counter in (4, 5, 6): + await client.notify_channel( + channel, position=b"%d" % counter, counter=counter + ) + await _consumed(live.consumer, token, 6) + state = live.consumer.state(token) + assert state is not None + assert state.value == ["a", "b", "c", "d", "e", "f"] + # Every read moved the cursor, none repeated a record, and a burst + # of three cost at most three reads. + assert state.reads <= 1 + 1 + 3 + assert state.deliveries >= 2 + + # The close completes the operation with what was consumed. + await producer.append("g") + await producer.finish() + await client.notify_channel( + channel, position=b"7", counter=7, metadata={"closed": True} + ) + assert await asyncio.wait_for(run.result(), 60) == [ + "a", + "b", + "c", + "d", + "e", + "f", + "g", + ] + assert live.consumer.state(token) is None + assert (await client.describe_channel(channel)).listeners == [] + + +@pytest.mark.needs_channel_server +async def test_cancel_unregisters_the_listener(client: Client): + store = MemoryStreams() + stream_id = f"consumed-{uuid.uuid4().hex}" + handle = await store.create_standalone_stream(None, stream_id) + ref = handle.ref(topic=VALUES) + channel = stream_channel_name(ref) + + async with ( + _consumer_service(client, store) as live, + Worker( + client, task_queue=f"callers-{stream_id}", workflows=[ConsumeCaller] + ) as worker, + ): + run = await client.start_workflow( + ConsumeCaller.run, + ConsumeInput(live.endpoint, live.service, ref, cancel=True), + id=f"caller-{stream_id}", + task_queue=worker.task_queue, + ) + token = await _listener_token(client, channel) + await run.signal(ConsumeCaller.go) + assert await asyncio.wait_for(run.result(), 60) == "canceled" + assert live.consumer.state(token) is None + assert (await client.describe_channel(channel)).listeners == [] + + +# --------------------------------------------------------------------------- +# Live: the handler hosted in a Temporal worker, deliveries through the +# frontend's Nexus route of a companion operation. +# --------------------------------------------------------------------------- + + +@nexusrpc.service +class CollectInWorker: + """The consumer next to the synchronous operation the channel posts to.""" + + collect: nexusrpc.Operation[StreamRef, list[Any]] + deliver: nexusrpc.Operation[dict[str, Any], None] + + +@nexusrpc.handler.service_handler(service=CollectInWorker) +class CollectInWorkerHandler: + """Hosts the consumer in a worker; ``deliver`` is the listener's URL target.""" + + def __init__(self, consumer: StreamConsumerOperation[list[Any]]) -> None: + self._consumer = consumer + + @nexusrpc.handler.operation_handler + def collect(self) -> nexusrpc.handler.OperationHandler[StreamRef, list[Any]]: + return self._consumer + + @nexusrpc.handler.sync_operation + async def deliver( + self, ctx: nexusrpc.handler.StartOperationContext, input: dict[str, Any] + ) -> None: + # The server's delivery arrives as a start of this operation: the + # notification is the input and the listener's headers are the + # request's. + await self._consumer.deliver(ctx.headers, input) + + +@pytest.mark.needs_channel_server +async def test_a_worker_hosted_consumer_is_reached_through_the_frontend( + client: Client, +): + """The frontend takes the channel's post as a start of the companion operation. + + What the worker-hosted shape still lacks is the completion: the start + context a worker hands the handler names ``temporal://system`` as the + callback, which only a workflow or activity run the server completes + can reach, not an HTTP post. So this case checks the deliveries and + stops before the close; the completion through a run is a follow-up. + """ + store = MemoryStreams() + stream_id = f"consumed-{uuid.uuid4().hex}" + handle = await store.create_standalone_stream(None, stream_id) + ref = handle.ref(topic=VALUES) + channel = stream_channel_name(ref) + producer = handle.producer(topic=VALUES, producer_id="writer", attempt=1) + uid = uuid.uuid4().hex + stream_handler = TemporalStreamsHandler(store, client) + + async with ( + _own_endpoint(client, f"streams-{uid}", f"streams-{uid}") as front_endpoint, + Worker( + client, task_queue=f"streams-{uid}", nexus_service_handlers=[stream_handler] + ), + ): + front = NexusStreams( + endpoint=front_endpoint, http_address=_HTTP, read_wait=timedelta(seconds=2) + ) + config = client.config() + config["plugins"] = [front] + fronted = Client(**config) + # The listener's URL is the frontend's route to the companion + # operation, so the endpoint has to exist before the consumer does. + created = await client.operator_service.create_nexus_endpoint( + CreateNexusEndpointRequest( + spec=EndpointSpec( + name=f"hosted-{uid}", + target=EndpointTarget( + worker=EndpointTarget.Worker( + namespace=client.namespace, task_queue=f"hosted-{uid}" + ) + ), + ) + ) + ) + consumer = stream_consumer_operation( + collect_values, + initial=list, + listener_url=( + f"{_HTTP}/nexus/endpoints/{created.endpoint.id}/services/" + f"{CollectInWorker.__name__}/deliver" + ), + ) + try: + async with ( + Worker( + fronted, + task_queue=f"hosted-{uid}", + nexus_service_handlers=[CollectInWorkerHandler(consumer)], + ), + Worker( + client, task_queue=f"callers-{uid}", workflows=[ConsumeCaller] + ) as callers, + ): + await producer.append("a") + run = await client.start_workflow( + ConsumeCaller.run, + ConsumeInput(f"hosted-{uid}", CollectInWorker.__name__, ref), + id=f"caller-{uid}", + task_queue=callers.task_queue, + ) + token = await _listener_token(client, channel) + await _consumed(consumer, token, 1) + await producer.append("b", "c") + assert ( + await client.notify_channel(channel, position=b"3", counter=3) == 1 + ) + await _consumed(consumer, token, 3) + state = consumer.state(token) + assert state is not None + assert state.value == ["a", "b", "c"] + assert state.deliveries >= 1 + held = consumer._states[token] + assert held.callback_url is not None + assert held.callback_url.startswith("temporal://"), held.callback_url + await run.terminate() + finally: + await consumer.close() + await stream_handler.close() + await client.operator_service.delete_nexus_endpoint( + DeleteNexusEndpointRequest( + id=created.endpoint.id, version=created.endpoint.version + ) + ) + + +# --------------------------------------------------------------------------- +# Live, waiting for a server: a native standalone stream notifies its own +# channel, so nobody notifies by hand. +# --------------------------------------------------------------------------- + + +@pytest.mark.needs_stream_channel_server +async def test_a_native_standalone_stream_is_consumed_through_its_channel( + client: Client, +): + provider: StreamProvider | None = client.config().get("stream_provider") + assert provider is not None, "the client needs the native provider registered" + stream_id = f"consumed-{uuid.uuid4().hex}" + handle = await client.create_stream(stream_id) + ref = handle.ref(topic=VALUES) + producer = handle.producer(topic=VALUES, producer_id="writer", attempt=1) + + async with _consumer_service(client, provider) as live: + await producer.append("a", "b") + async with Worker( + client, task_queue=f"callers-{stream_id}", workflows=[ConsumeCaller] + ) as worker: + run = await client.start_workflow( + ConsumeCaller.run, + ConsumeInput(live.endpoint, live.service, ref), + id=f"caller-{stream_id}", + task_queue=worker.task_queue, + ) + token = await _listener_token(client, stream_channel_name(ref)) + await _consumed(live.consumer, token, 2) + # The server notifies the stream's channel on every append and on + # the close, so the records reach the consumer without a notify. + await producer.append("c") + await _consumed(live.consumer, token, 3) + await producer.finish() + await handle.close() + assert await asyncio.wait_for(run.result(), 60) == ["a", "b", "c"] + assert ( + await client.describe_channel(stream_channel_name(ref)) + ).listeners == [] From af0e4ddf1636a7c8128bf64fa7f15e81b9429965 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:16:40 -0700 Subject: [PATCH 796/831] Pinned Core with the describe field and the unsubscribe command. The protos pin carries ChannelSubscriptionInfo on the describe response and the UnsubscribeNotificationChannel command, event and failed cause. The pin refuses the lang command the way it refuses the subscribe, so the layers above pin the delivery Core before a workflow can unsubscribe. --- temporalio/api/command/v1/__init__.py | 2 + temporalio/api/command/v1/message_pb2.py | 34 +- temporalio/api/command/v1/message_pb2.pyi | 37 + temporalio/api/enums/v1/command_type_pb2.py | 5 +- temporalio/api/enums/v1/command_type_pb2.pyi | 2 + temporalio/api/enums/v1/event_type_pb2.py | 5 +- temporalio/api/enums/v1/event_type_pb2.pyi | 10 + temporalio/api/enums/v1/failed_cause_pb2.py | 25 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 8 + temporalio/api/history/v1/__init__.py | 2 + temporalio/api/history/v1/message_pb2.py | 102 ++- temporalio/api/history/v1/message_pb2.pyi | 56 ++ temporalio/api/workflow/v1/__init__.py | 2 + temporalio/api/workflow/v1/message_pb2.py | 151 ++-- temporalio/api/workflow/v1/message_pb2.pyi | 89 ++ .../v1/request_response_pb2.py | 784 +++++++++--------- .../v1/request_response_pb2.pyi | 16 + .../proto/workflow_commands/__init__.py | 2 + .../workflow_commands_pb2.py | 152 ++-- .../workflow_commands_pb2.pyi | 36 + temporalio/bridge/sdk-core | 2 +- 21 files changed, 929 insertions(+), 593 deletions(-) diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index 2f9ac1a91..4335f783d 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -19,6 +19,7 @@ StartTimerCommandAttributes, SubscribeNotificationChannelCommandAttributes, SubscribeStreamCommandAttributes, + UnsubscribeNotificationChannelCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) @@ -43,5 +44,6 @@ "StartTimerCommandAttributes", "SubscribeNotificationChannelCommandAttributes", "SubscribeStreamCommandAttributes", + "UnsubscribeNotificationChannelCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index d9f90890a..52bea94d2 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xea\x14\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x12\x83\x01\n1subscribe_notification_channel_command_attributes\x18\x16 \x01(\x0b\x32\x46.temporal.api.command.v1.SubscribeNotificationChannelCommandAttributesH\x00\x42\x0c\n\nattributes"r\n$AppendStreamRecordsCommandAttributes\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x98\x01\n SubscribeStreamCommandAttributes\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"@\n-SubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\tB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xf4\x15\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x12\x83\x01\n1subscribe_notification_channel_command_attributes\x18\x16 \x01(\x0b\x32\x46.temporal.api.command.v1.SubscribeNotificationChannelCommandAttributesH\x00\x12\x87\x01\n3unsubscribe_notification_channel_command_attributes\x18\x17 \x01(\x0b\x32H.temporal.api.command.v1.UnsubscribeNotificationChannelCommandAttributesH\x00\x42\x0c\n\nattributes"r\n$AppendStreamRecordsCommandAttributes\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x98\x01\n SubscribeStreamCommandAttributes\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"@\n-SubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"B\n/UnsubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\tB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -118,6 +118,9 @@ _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ "SubscribeNotificationChannelCommandAttributes" ] +_UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UnsubscribeNotificationChannelCommandAttributes" +] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", (_message.Message,), @@ -379,6 +382,19 @@ ) _sym_db.RegisterMessage(SubscribeNotificationChannelCommandAttributes) +UnsubscribeNotificationChannelCommandAttributes = ( + _reflection.GeneratedProtocolMessageType( + "UnsubscribeNotificationChannelCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.UnsubscribeNotificationChannelCommandAttributes) + }, + ) +) +_sym_db.RegisterMessage(UnsubscribeNotificationChannelCommandAttributes) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\032io.temporal.api.command.v1B\014MessageProtoP\001Z%go.temporal.io/api/command/v1;command\252\002\031Temporalio.Api.Command.V1\352\002\034Temporalio::Api::Command::V1" @@ -469,11 +485,13 @@ _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 _COMMAND._serialized_start = 5274 - _COMMAND._serialized_end = 7940 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7942 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 8056 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 8059 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8211 - _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8213 - _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8277 + _COMMAND._serialized_end = 8078 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 8080 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 8194 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 8197 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8349 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8351 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8415 + _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8417 + _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8483 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 26fafd68b..4a5edb571 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -1123,6 +1123,7 @@ class Command(google.protobuf.message.Message): APPEND_STREAM_RECORDS_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SUBSCRIBE_NOTIFICATION_CHANNEL_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + UNSUBSCRIBE_NOTIFICATION_CHANNEL_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1225,6 +1226,10 @@ class Command(google.protobuf.message.Message): def subscribe_notification_channel_command_attributes( self, ) -> global___SubscribeNotificationChannelCommandAttributes: ... + @property + def unsubscribe_notification_channel_command_attributes( + self, + ) -> global___UnsubscribeNotificationChannelCommandAttributes: ... def __init__( self, *, @@ -1275,6 +1280,8 @@ class Command(google.protobuf.message.Message): | None = ..., subscribe_notification_channel_command_attributes: global___SubscribeNotificationChannelCommandAttributes | None = ..., + unsubscribe_notification_channel_command_attributes: global___UnsubscribeNotificationChannelCommandAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -1319,6 +1326,8 @@ class Command(google.protobuf.message.Message): b"subscribe_notification_channel_command_attributes", "subscribe_stream_command_attributes", b"subscribe_stream_command_attributes", + "unsubscribe_notification_channel_command_attributes", + b"unsubscribe_notification_channel_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1372,6 +1381,8 @@ class Command(google.protobuf.message.Message): b"subscribe_notification_channel_command_attributes", "subscribe_stream_command_attributes", b"subscribe_stream_command_attributes", + "unsubscribe_notification_channel_command_attributes", + b"unsubscribe_notification_channel_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1402,6 +1413,7 @@ class Command(google.protobuf.message.Message): "append_stream_records_command_attributes", "subscribe_stream_command_attributes", "subscribe_notification_channel_command_attributes", + "unsubscribe_notification_channel_command_attributes", ] | None ): ... @@ -1536,3 +1548,28 @@ class SubscribeNotificationChannelCommandAttributes(google.protobuf.message.Mess global___SubscribeNotificationChannelCommandAttributes = ( SubscribeNotificationChannelCommandAttributes ) + +class UnsubscribeNotificationChannelCommandAttributes(google.protobuf.message.Message): + """Ends the run's subscription to a notification channel. Notifications already + recorded on a scheduled event still reach that Workflow Task; later ones do + not. A command naming a channel the run is not subscribed to records its + event and changes nothing, so replay matches every command to an event. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """The channel to stop listening on, as the writers name it.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___UnsubscribeNotificationChannelCommandAttributes = ( + UnsubscribeNotificationChannelCommandAttributes +) diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index dcb39197c..dece3c0f4 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x98\x07\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x12/\n+COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL\x10\x15\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xcb\x07\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x12/\n+COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL\x10\x15\x12\x31\n-COMMAND_TYPE_UNSUBSCRIBE_NOTIFICATION_CHANNEL\x10\x16\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -42,11 +42,12 @@ COMMAND_TYPE_APPEND_STREAM_RECORDS = 19 COMMAND_TYPE_SUBSCRIBE_STREAM = 20 COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL = 21 +COMMAND_TYPE_UNSUBSCRIBE_NOTIFICATION_CHANNEL = 22 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 988 + _COMMANDTYPE._serialized_end = 1039 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 64fb7729c..327e66386 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -47,6 +47,7 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_APPEND_STREAM_RECORDS: _CommandType.ValueType # 19 COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL: _CommandType.ValueType # 21 + COMMAND_TYPE_UNSUBSCRIBE_NOTIFICATION_CHANNEL: _CommandType.ValueType # 22 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -72,4 +73,5 @@ COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 COMMAND_TYPE_APPEND_STREAM_RECORDS: CommandType.ValueType # 19 COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL: CommandType.ValueType # 21 +COMMAND_TYPE_UNSUBSCRIBE_NOTIFICATION_CHANNEL: CommandType.ValueType # 22 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 4b615e909..c012b3cd2 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\xb3\x17\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\n\x12\x37\n3EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED\x10?B\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\xee\x17\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\n\x12\x37\n3EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED\x10?\x12\x39\n5EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED\x10@B\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -85,11 +85,12 @@ EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED = 62 EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED = 63 +EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED = 64 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 3061 + _EVENTTYPE._serialized_end = 3120 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 97a4c1166..e5ca2bb1f 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -230,6 +230,11 @@ class _EventTypeEnumTypeWrapper( """A Workflow became a listener of a notification channel for its run. The notifications themselves ride the WorkflowTaskScheduled event. """ + EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED: _EventType.ValueType # 64 + """A Workflow stopped listening on a notification channel for its run. + Recorded for every UnsubscribeNotificationChannel command, including one + naming a channel the run was not subscribed to. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -436,4 +441,9 @@ EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED: EventType.ValueType # 63 """A Workflow became a listener of a notification channel for its run. The notifications themselves ride the WorkflowTaskScheduled event. """ +EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED: EventType.ValueType # 64 +"""A Workflow stopped listening on a notification channel for its run. +Recorded for every UnsubscribeNotificationChannel command, including one +naming a channel the run was not subscribed to. +""" global___EventType = EventType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 9c1970298..eb29a1449 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x9c\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xec\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,\x12N\nJWORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10-*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _WORKFLOWTASKFAILEDCAUSE = DESCRIPTOR.enum_types_by_name["WorkflowTaskFailedCause"] @@ -90,6 +90,7 @@ WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES = 42 WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE = 43 WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES = 44 +WORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES = 45 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS = 1 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND = 2 @@ -121,15 +122,15 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020FailedCauseProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _WORKFLOWTASKFAILEDCAUSE._serialized_start = 68 - _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2912 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2915 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3235 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3238 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3511 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3514 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3868 - _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3871 - _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4406 - _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4409 - _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4552 + _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2992 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2995 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3315 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3318 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3591 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3594 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3948 + _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3951 + _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4486 + _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4489 + _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4632 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.pyi b/temporalio/api/enums/v1/failed_cause_pb2.pyi index b32872382..b5c14f6d1 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.pyi +++ b/temporalio/api/enums/v1/failed_cause_pb2.pyi @@ -209,6 +209,10 @@ class _WorkflowTaskFailedCauseEnumTypeWrapper( """A SubscribeNotificationChannel command named an empty or too-long channel, or hit a subscription or listener limit. """ + WORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 45 + """An UnsubscribeNotificationChannel command named an empty or too-long channel.""" class WorkflowTaskFailedCause( _WorkflowTaskFailedCause, metaclass=_WorkflowTaskFailedCauseEnumTypeWrapper @@ -388,6 +392,10 @@ WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( """A SubscribeNotificationChannel command named an empty or too-long channel, or hit a subscription or listener limit. """ +WORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 45 +"""An UnsubscribeNotificationChannel command named an empty or too-long channel.""" global___WorkflowTaskFailedCause = WorkflowTaskFailedCause class _StartChildWorkflowExecutionFailedCause: diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index 7c765449d..088533d0e 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -56,6 +56,7 @@ WorkflowExecutionUpdateCompletedEventAttributes, WorkflowExecutionUpdateRejectedEventAttributes, WorkflowNotificationChannelSubscribedEventAttributes, + WorkflowNotificationChannelUnsubscribedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, WorkflowStreamRecordsAppendedEventAttributes, @@ -125,6 +126,7 @@ "WorkflowExecutionUpdateCompletedEventAttributes", "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowNotificationChannelSubscribedEventAttributes", + "WorkflowNotificationChannelUnsubscribedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", "WorkflowStreamRecordsAppendedEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index 891aa0012..961d93f42 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -64,7 +64,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xdd\x42\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x90\x01\n6WorkflowNotificationChannelUnsubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xf6\x43\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x12\x96\x01\n;workflow_notification_channel_unsubscribed_event_attributes\x18\x45 \x01(\x0b\x32O.temporal.api.history.v1.WorkflowNotificationChannelUnsubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -229,6 +229,11 @@ "WorkflowNotificationChannelSubscribedEventAttributes" ] ) +_WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES = ( + DESCRIPTOR.message_types_by_name[ + "WorkflowNotificationChannelUnsubscribedEventAttributes" + ] +) _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowStreamRecordsAppendedEventAttributes" ] @@ -860,6 +865,19 @@ ) _sym_db.RegisterMessage(WorkflowNotificationChannelSubscribedEventAttributes) +WorkflowNotificationChannelUnsubscribedEventAttributes = ( + _reflection.GeneratedProtocolMessageType( + "WorkflowNotificationChannelUnsubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowNotificationChannelUnsubscribedEventAttributes) + }, + ) +) +_sym_db.RegisterMessage(WorkflowNotificationChannelUnsubscribedEventAttributes) + WorkflowStreamRecordsAppendedEventAttributes = _reflection.GeneratedProtocolMessageType( "WorkflowStreamRecordsAppendedEventAttributes", (_message.Message,), @@ -1364,44 +1382,46 @@ _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17273 _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17275 _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17388 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17391 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17538 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17541 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17761 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17764 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17934 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17937 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18208 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18211 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18375 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18377 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18471 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18473 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18569 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18572 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18769 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18772 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19336 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19286 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19336 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19339 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19476 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19479 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19616 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19619 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19755 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19758 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19896 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19899 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20037 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20039 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20155 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20158 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20309 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20312 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20511 - _HISTORYEVENT._serialized_start = 20514 - _HISTORYEVENT._serialized_end = 29055 - _HISTORY._serialized_start = 29057 - _HISTORY._serialized_end = 29121 + _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17391 + _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17535 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17538 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17685 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17688 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17908 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17911 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 18081 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 18084 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18355 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18358 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18522 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18524 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18618 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18620 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18716 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18719 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18916 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18919 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19483 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19433 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19483 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19486 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19623 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19626 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19763 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19766 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19902 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19905 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 20043 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 20046 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20184 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20186 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20302 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20305 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20456 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20459 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20658 + _HISTORYEVENT._serialized_start = 20661 + _HISTORYEVENT._serialized_end = 29355 + _HISTORY._serialized_start = 29357 + _HISTORY._serialized_end = 29421 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index 5d657927a..ef9deda9c 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -3717,6 +3717,48 @@ global___WorkflowNotificationChannelSubscribedEventAttributes = ( WorkflowNotificationChannelSubscribedEventAttributes ) +class WorkflowNotificationChannelUnsubscribedEventAttributes( + google.protobuf.message.Message +): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + SUBSCRIBED_EVENT_ID_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command ended this + subscription. + """ + channel: builtins.str + """The channel the Workflow stopped listening on.""" + subscribed_event_id: builtins.int + """The WorkflowNotificationChannelSubscribed event that recorded the + subscription this command ended. Zero when the run held no subscription + for the channel. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + channel: builtins.str = ..., + subscribed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", + b"channel", + "subscribed_event_id", + b"subscribed_event_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowNotificationChannelUnsubscribedEventAttributes = ( + WorkflowNotificationChannelUnsubscribedEventAttributes +) + class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4630,6 +4672,9 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int WORKFLOW_STREAM_RECORDS_APPENDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( + builtins.int + ) event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4927,6 +4972,10 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_notification_channel_subscribed_event_attributes( self, ) -> global___WorkflowNotificationChannelSubscribedEventAttributes: ... + @property + def workflow_notification_channel_unsubscribed_event_attributes( + self, + ) -> global___WorkflowNotificationChannelUnsubscribedEventAttributes: ... def __init__( self, *, @@ -5070,6 +5119,8 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_notification_channel_subscribed_event_attributes: global___WorkflowNotificationChannelSubscribedEventAttributes | None = ..., + workflow_notification_channel_unsubscribed_event_attributes: global___WorkflowNotificationChannelUnsubscribedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5190,6 +5241,8 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_execution_update_rejected_event_attributes", "workflow_notification_channel_subscribed_event_attributes", b"workflow_notification_channel_subscribed_event_attributes", + "workflow_notification_channel_unsubscribed_event_attributes", + b"workflow_notification_channel_unsubscribed_event_attributes", "workflow_properties_modified_event_attributes", b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", @@ -5343,6 +5396,8 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_execution_update_rejected_event_attributes", "workflow_notification_channel_subscribed_event_attributes", b"workflow_notification_channel_subscribed_event_attributes", + "workflow_notification_channel_unsubscribed_event_attributes", + b"workflow_notification_channel_unsubscribed_event_attributes", "workflow_properties_modified_event_attributes", b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", @@ -5430,6 +5485,7 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_stream_subscribed_event_attributes", "workflow_stream_records_appended_event_attributes", "workflow_notification_channel_subscribed_event_attributes", + "workflow_notification_channel_unsubscribed_event_attributes", ] | None ): ... diff --git a/temporalio/api/workflow/v1/__init__.py b/temporalio/api/workflow/v1/__init__.py index ae647ab67..b708ebed6 100644 --- a/temporalio/api/workflow/v1/__init__.py +++ b/temporalio/api/workflow/v1/__init__.py @@ -1,5 +1,6 @@ from .message_pb2 import ( CallbackInfo, + ChannelSubscriptionInfo, DeploymentTransition, DeploymentVersionTransition, NewWorkflowExecutionInfo, @@ -24,6 +25,7 @@ __all__ = [ "CallbackInfo", + "ChannelSubscriptionInfo", "DeploymentTransition", "DeploymentVersionTransition", "NewWorkflowExecutionInfo", diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index 032f2b2b5..3f6c7d950 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -40,6 +40,9 @@ from temporalio.api.failure.v1 import ( message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, ) +from temporalio.api.notification.v1 import ( + message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, +) from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) @@ -48,7 +51,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xc3\x02\n\x17\x43hannelSubscriptionInfo\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03\x12\x14\n\x0clast_counter\x18\x04 \x01(\x03\x12H\n\x14pending_notification\x18\x05 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x19\n\x11scheduled_counter\x18\x06 \x01(\x03\x12\x16\n\x0elistener_count\x18\x07 \x01(\x05\x12\x16\n\x0eretained_count\x18\x08 \x01(\x05\x12\x16\n\x0e\x61\x63\x63\x65pted_count\x18\t \x01(\x03"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -94,6 +97,7 @@ _NEXUSOPERATIONCANCELLATIONINFO = DESCRIPTOR.message_types_by_name[ "NexusOperationCancellationInfo" ] +_CHANNELSUBSCRIPTIONINFO = DESCRIPTOR.message_types_by_name["ChannelSubscriptionInfo"] _WORKFLOWEXECUTIONOPTIONS = DESCRIPTOR.message_types_by_name["WorkflowExecutionOptions"] _VERSIONINGOVERRIDE = DESCRIPTOR.message_types_by_name["VersioningOverride"] _VERSIONINGOVERRIDE_PINNEDOVERRIDE = _VERSIONINGOVERRIDE.nested_types_by_name[ @@ -352,6 +356,17 @@ ) _sym_db.RegisterMessage(NexusOperationCancellationInfo) +ChannelSubscriptionInfo = _reflection.GeneratedProtocolMessageType( + "ChannelSubscriptionInfo", + (_message.Message,), + { + "DESCRIPTOR": _CHANNELSUBSCRIPTIONINFO, + "__module__": "temporalio.api.workflow.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflow.v1.ChannelSubscriptionInfo) + }, +) +_sym_db.RegisterMessage(ChannelSubscriptionInfo) + WorkflowExecutionOptions = _reflection.GeneratedProtocolMessageType( "WorkflowExecutionOptions", (_message.Message,), @@ -533,70 +548,72 @@ _VERSIONINGOVERRIDE.fields_by_name[ "pinned_version" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONINFO._serialized_start = 552 - _WORKFLOWEXECUTIONINFO._serialized_end = 1816 - _WORKFLOWEXECUTIONEXTENDEDINFO._serialized_start = 1819 - _WORKFLOWEXECUTIONEXTENDEDINFO._serialized_end = 2471 - _WORKFLOWEXECUTIONEXTENDEDINFO_REQUESTIDINFOSENTRY._serialized_start = 2377 - _WORKFLOWEXECUTIONEXTENDEDINFO_REQUESTIDINFOSENTRY._serialized_end = 2471 - _WORKFLOWEXECUTIONVERSIONINGINFO._serialized_start = 2474 - _WORKFLOWEXECUTIONVERSIONINGINFO._serialized_end = 3109 - _DEPLOYMENTTRANSITION._serialized_start = 3111 - _DEPLOYMENTTRANSITION._serialized_end = 3193 - _DEPLOYMENTVERSIONTRANSITION._serialized_start = 3196 - _DEPLOYMENTVERSIONTRANSITION._serialized_end = 3327 - _WORKFLOWEXECUTIONCONFIG._serialized_start = 3330 - _WORKFLOWEXECUTIONCONFIG._serialized_end = 3657 - _PENDINGACTIVITYINFO._serialized_start = 3660 - _PENDINGACTIVITYINFO._serialized_end = 5385 - _PENDINGACTIVITYINFO_PAUSEINFO._serialized_start = 5029 - _PENDINGACTIVITYINFO_PAUSEINFO._serialized_end = 5364 - _PENDINGACTIVITYINFO_PAUSEINFO_MANUAL._serialized_start = 5250 - _PENDINGACTIVITYINFO_PAUSEINFO_MANUAL._serialized_end = 5292 - _PENDINGACTIVITYINFO_PAUSEINFO_RULE._serialized_start = 5294 - _PENDINGACTIVITYINFO_PAUSEINFO_RULE._serialized_end = 5351 - _PENDINGCHILDEXECUTIONINFO._serialized_start = 5388 - _PENDINGCHILDEXECUTIONINFO._serialized_end = 5573 - _PENDINGWORKFLOWTASKINFO._serialized_start = 5576 - _PENDINGWORKFLOWTASKINFO._serialized_end = 5845 - _RESETPOINTS._serialized_start = 5847 - _RESETPOINTS._serialized_end = 5918 - _RESETPOINTINFO._serialized_start = 5921 - _RESETPOINTINFO._serialized_end = 6160 - _NEWWORKFLOWEXECUTIONINFO._serialized_start = 6163 - _NEWWORKFLOWEXECUTIONINFO._serialized_end = 7064 - _CALLBACKINFO._serialized_start = 7067 - _CALLBACKINFO._serialized_end = 7837 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7541 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7557 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7559 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7612 - _CALLBACKINFO_TRIGGER._serialized_start = 7615 - _CALLBACKINFO_TRIGGER._serialized_end = 7837 - _PENDINGNEXUSOPERATIONINFO._serialized_start = 7840 - _PENDINGNEXUSOPERATIONINFO._serialized_end = 8619 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8622 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9010 - _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9013 - _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9240 - _VERSIONINGOVERRIDE._serialized_start = 9243 - _VERSIONINGOVERRIDE._serialized_end = 10005 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9608 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 9781 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 9783 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 9888 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 9890 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 9993 - _ONCONFLICTOPTIONS._serialized_start = 10007 - _ONCONFLICTOPTIONS._serialized_end = 10112 - _REQUESTIDINFO._serialized_start = 10114 - _REQUESTIDINFO._serialized_end = 10219 - _POSTRESETOPERATION._serialized_start = 10222 - _POSTRESETOPERATION._serialized_end = 10789 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10436 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10615 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10618 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10778 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10791 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10902 + _WORKFLOWEXECUTIONINFO._serialized_start = 596 + _WORKFLOWEXECUTIONINFO._serialized_end = 1860 + _WORKFLOWEXECUTIONEXTENDEDINFO._serialized_start = 1863 + _WORKFLOWEXECUTIONEXTENDEDINFO._serialized_end = 2515 + _WORKFLOWEXECUTIONEXTENDEDINFO_REQUESTIDINFOSENTRY._serialized_start = 2421 + _WORKFLOWEXECUTIONEXTENDEDINFO_REQUESTIDINFOSENTRY._serialized_end = 2515 + _WORKFLOWEXECUTIONVERSIONINGINFO._serialized_start = 2518 + _WORKFLOWEXECUTIONVERSIONINGINFO._serialized_end = 3153 + _DEPLOYMENTTRANSITION._serialized_start = 3155 + _DEPLOYMENTTRANSITION._serialized_end = 3237 + _DEPLOYMENTVERSIONTRANSITION._serialized_start = 3240 + _DEPLOYMENTVERSIONTRANSITION._serialized_end = 3371 + _WORKFLOWEXECUTIONCONFIG._serialized_start = 3374 + _WORKFLOWEXECUTIONCONFIG._serialized_end = 3701 + _PENDINGACTIVITYINFO._serialized_start = 3704 + _PENDINGACTIVITYINFO._serialized_end = 5429 + _PENDINGACTIVITYINFO_PAUSEINFO._serialized_start = 5073 + _PENDINGACTIVITYINFO_PAUSEINFO._serialized_end = 5408 + _PENDINGACTIVITYINFO_PAUSEINFO_MANUAL._serialized_start = 5294 + _PENDINGACTIVITYINFO_PAUSEINFO_MANUAL._serialized_end = 5336 + _PENDINGACTIVITYINFO_PAUSEINFO_RULE._serialized_start = 5338 + _PENDINGACTIVITYINFO_PAUSEINFO_RULE._serialized_end = 5395 + _PENDINGCHILDEXECUTIONINFO._serialized_start = 5432 + _PENDINGCHILDEXECUTIONINFO._serialized_end = 5617 + _PENDINGWORKFLOWTASKINFO._serialized_start = 5620 + _PENDINGWORKFLOWTASKINFO._serialized_end = 5889 + _RESETPOINTS._serialized_start = 5891 + _RESETPOINTS._serialized_end = 5962 + _RESETPOINTINFO._serialized_start = 5965 + _RESETPOINTINFO._serialized_end = 6204 + _NEWWORKFLOWEXECUTIONINFO._serialized_start = 6207 + _NEWWORKFLOWEXECUTIONINFO._serialized_end = 7108 + _CALLBACKINFO._serialized_start = 7111 + _CALLBACKINFO._serialized_end = 7881 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7585 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7601 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7603 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7656 + _CALLBACKINFO_TRIGGER._serialized_start = 7659 + _CALLBACKINFO_TRIGGER._serialized_end = 7881 + _PENDINGNEXUSOPERATIONINFO._serialized_start = 7884 + _PENDINGNEXUSOPERATIONINFO._serialized_end = 8663 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8666 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9054 + _CHANNELSUBSCRIPTIONINFO._serialized_start = 9057 + _CHANNELSUBSCRIPTIONINFO._serialized_end = 9380 + _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9383 + _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9610 + _VERSIONINGOVERRIDE._serialized_start = 9613 + _VERSIONINGOVERRIDE._serialized_end = 10375 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9978 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 10151 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 10153 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 10258 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 10260 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 10363 + _ONCONFLICTOPTIONS._serialized_start = 10377 + _ONCONFLICTOPTIONS._serialized_end = 10482 + _REQUESTIDINFO._serialized_start = 10484 + _REQUESTIDINFO._serialized_end = 10589 + _POSTRESETOPERATION._serialized_start = 10592 + _POSTRESETOPERATION._serialized_end = 11159 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10806 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10985 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10988 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 11148 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 11161 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 11272 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index b390d94f4..a9e882f10 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -24,6 +24,7 @@ import temporalio.api.enums.v1.common_pb2 import temporalio.api.enums.v1.event_type_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.notification.v1.message_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.taskqueue.v1.message_pb2 @@ -1887,6 +1888,94 @@ class NexusOperationCancellationInfo(google.protobuf.message.Message): global___NexusOperationCancellationInfo = NexusOperationCancellationInfo +class ChannelSubscriptionInfo(google.protobuf.message.Message): + """A workflow's standing on a notification channel, as reported by DescribeWorkflowExecution.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + SUBSCRIBED_EVENT_ID_FIELD_NUMBER: builtins.int + LAST_COUNTER_FIELD_NUMBER: builtins.int + PENDING_NOTIFICATION_FIELD_NUMBER: builtins.int + SCHEDULED_COUNTER_FIELD_NUMBER: builtins.int + LISTENER_COUNT_FIELD_NUMBER: builtins.int + RETAINED_COUNT_FIELD_NUMBER: builtins.int + ACCEPTED_COUNT_FIELD_NUMBER: builtins.int + channel: builtins.str + """Channel name.""" + kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType + """CHANNEL_KIND_INDEPENDENT for a channel the workflow subscribed to with a + SubscribeNotificationChannel command. CHANNEL_KIND_LINKED for a channel linked to this + workflow, which lists it once the channel holds any state. + """ + subscribed_event_id: builtins.int + """Independent kind: id of the WorkflowNotificationChannelSubscribed event that recorded the + subscription. Zero for the linked kind. + """ + last_counter: builtins.int + """Highest counter the workflow has accepted from the channel. Zero when none has arrived.""" + @property + def pending_notification( + self, + ) -> temporalio.api.notification.v1.message_pb2.Notification: + """The notification held for the workflow's next Workflow Task, when one is pending.""" + scheduled_counter: builtins.int + """Counter carried by the scheduled event of a Workflow Task that has not started yet. Zero + otherwise. + """ + listener_count: builtins.int + """Linked kind: callback listeners registered on the channel.""" + retained_count: builtins.int + """Linked kind: notifications retained for pollers.""" + accepted_count: builtins.int + """Linked kind: notifications the channel has accepted over its life.""" + def __init__( + self, + *, + channel: builtins.str = ..., + kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType = ..., + subscribed_event_id: builtins.int = ..., + last_counter: builtins.int = ..., + pending_notification: temporalio.api.notification.v1.message_pb2.Notification + | None = ..., + scheduled_counter: builtins.int = ..., + listener_count: builtins.int = ..., + retained_count: builtins.int = ..., + accepted_count: builtins.int = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "pending_notification", b"pending_notification" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "accepted_count", + b"accepted_count", + "channel", + b"channel", + "kind", + b"kind", + "last_counter", + b"last_counter", + "listener_count", + b"listener_count", + "pending_notification", + b"pending_notification", + "retained_count", + b"retained_count", + "scheduled_counter", + b"scheduled_counter", + "subscribed_event_id", + b"subscribed_event_id", + ], + ) -> None: ... + +global___ChannelSubscriptionInfo = ChannelSubscriptionInfo + class WorkflowExecutionOptions(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index 9804b7923..aee2202bf 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4531,415 +4531,415 @@ _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24188 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24191 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24719 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24722 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25726 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25508 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25624 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25626 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25726 - _GETCLUSTERINFOREQUEST._serialized_start = 25728 - _GETCLUSTERINFOREQUEST._serialized_end = 25751 - _GETCLUSTERINFORESPONSE._serialized_start = 25754 - _GETCLUSTERINFORESPONSE._serialized_end = 26219 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26164 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26219 - _GETSYSTEMINFOREQUEST._serialized_start = 26221 - _GETSYSTEMINFOREQUEST._serialized_end = 26243 - _GETSYSTEMINFORESPONSE._serialized_start = 26246 - _GETSYSTEMINFORESPONSE._serialized_end = 26823 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26387 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26823 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26825 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26934 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26937 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27160 - _CREATESCHEDULEREQUEST._serialized_start = 27163 - _CREATESCHEDULEREQUEST._serialized_end = 27495 - _CREATESCHEDULERESPONSE._serialized_start = 27497 - _CREATESCHEDULERESPONSE._serialized_end = 27545 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27547 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27612 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27615 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27886 - _UPDATESCHEDULEREQUEST._serialized_start = 27889 - _UPDATESCHEDULEREQUEST._serialized_end = 28181 - _UPDATESCHEDULERESPONSE._serialized_start = 28183 - _UPDATESCHEDULERESPONSE._serialized_end = 28207 - _PATCHSCHEDULEREQUEST._serialized_start = 28210 - _PATCHSCHEDULEREQUEST._serialized_end = 28366 - _PATCHSCHEDULERESPONSE._serialized_start = 28368 - _PATCHSCHEDULERESPONSE._serialized_end = 28391 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28394 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28562 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28564 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28647 - _DELETESCHEDULEREQUEST._serialized_start = 28649 - _DELETESCHEDULEREQUEST._serialized_end = 28730 - _DELETESCHEDULERESPONSE._serialized_start = 28732 - _DELETESCHEDULERESPONSE._serialized_end = 28756 - _LISTSCHEDULESREQUEST._serialized_start = 28758 - _LISTSCHEDULESREQUEST._serialized_end = 28866 - _LISTSCHEDULESRESPONSE._serialized_start = 28868 - _LISTSCHEDULESRESPONSE._serialized_end = 28980 - _COUNTSCHEDULESREQUEST._serialized_start = 28982 - _COUNTSCHEDULESREQUEST._serialized_end = 29039 - _COUNTSCHEDULESRESPONSE._serialized_start = 29042 - _COUNTSCHEDULESRESPONSE._serialized_end = 29261 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24270 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24273 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24801 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24804 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25808 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25590 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25706 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25708 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25808 + _GETCLUSTERINFOREQUEST._serialized_start = 25810 + _GETCLUSTERINFOREQUEST._serialized_end = 25833 + _GETCLUSTERINFORESPONSE._serialized_start = 25836 + _GETCLUSTERINFORESPONSE._serialized_end = 26301 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26246 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26301 + _GETSYSTEMINFOREQUEST._serialized_start = 26303 + _GETSYSTEMINFOREQUEST._serialized_end = 26325 + _GETSYSTEMINFORESPONSE._serialized_start = 26328 + _GETSYSTEMINFORESPONSE._serialized_end = 26905 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26469 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26905 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26907 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27016 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27019 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27242 + _CREATESCHEDULEREQUEST._serialized_start = 27245 + _CREATESCHEDULEREQUEST._serialized_end = 27577 + _CREATESCHEDULERESPONSE._serialized_start = 27579 + _CREATESCHEDULERESPONSE._serialized_end = 27627 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27629 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27694 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27697 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27968 + _UPDATESCHEDULEREQUEST._serialized_start = 27971 + _UPDATESCHEDULEREQUEST._serialized_end = 28263 + _UPDATESCHEDULERESPONSE._serialized_start = 28265 + _UPDATESCHEDULERESPONSE._serialized_end = 28289 + _PATCHSCHEDULEREQUEST._serialized_start = 28292 + _PATCHSCHEDULEREQUEST._serialized_end = 28448 + _PATCHSCHEDULERESPONSE._serialized_start = 28450 + _PATCHSCHEDULERESPONSE._serialized_end = 28473 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28476 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28644 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28646 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28729 + _DELETESCHEDULEREQUEST._serialized_start = 28731 + _DELETESCHEDULEREQUEST._serialized_end = 28812 + _DELETESCHEDULERESPONSE._serialized_start = 28814 + _DELETESCHEDULERESPONSE._serialized_end = 28838 + _LISTSCHEDULESREQUEST._serialized_start = 28840 + _LISTSCHEDULESREQUEST._serialized_end = 28948 + _LISTSCHEDULESRESPONSE._serialized_start = 28950 + _LISTSCHEDULESRESPONSE._serialized_end = 29062 + _COUNTSCHEDULESREQUEST._serialized_start = 29064 + _COUNTSCHEDULESREQUEST._serialized_end = 29121 + _COUNTSCHEDULESRESPONSE._serialized_start = 29124 + _COUNTSCHEDULESRESPONSE._serialized_end = 29343 _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29264 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29910 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29711 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29346 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29992 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29793 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29822 + 29904 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29824 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29897 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29912 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29976 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29978 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30073 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30075 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30191 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30194 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31911 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31246 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29906 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29979 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29994 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30058 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30060 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30155 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30157 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30276 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31993 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31328 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31359 + 31441 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31362 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31444 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31491 + 31573 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31493 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31575 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31557 + 31639 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31559 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31665 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31667 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31777 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31779 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31841 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31843 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31898 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31914 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32166 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32168 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32240 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32243 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32492 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32495 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32651 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32653 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32767 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32770 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33031 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33034 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33293 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33296 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34662 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34664 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34693 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34695 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34791 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34793 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34821 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34823 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34889 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34892 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35364 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35366 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35457 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35459 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35580 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35583 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35768 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35771 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35990 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35993 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36409 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36412 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36766 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36769 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36936 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36938 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36973 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36976 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37196 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37198 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37230 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37233 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37605 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37399 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37605 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37608 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37940 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37734 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37940 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37943 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38279 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38282 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38601 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38603 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38703 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38705 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38814 - _PAUSEACTIVITYREQUEST._serialized_start = 38817 - _PAUSEACTIVITYREQUEST._serialized_end = 39016 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39019 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39202 - _PAUSEACTIVITYRESPONSE._serialized_start = 39204 - _PAUSEACTIVITYRESPONSE._serialized_end = 39227 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39229 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39261 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39264 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39544 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39547 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39820 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39822 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39847 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39849 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39883 - _RESETACTIVITYREQUEST._serialized_start = 39886 - _RESETACTIVITYREQUEST._serialized_end = 40193 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40196 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40486 - _RESETACTIVITYRESPONSE._serialized_start = 40488 - _RESETACTIVITYRESPONSE._serialized_end = 40511 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40513 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40545 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40548 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40832 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40835 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41012 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41014 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41120 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41122 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41219 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41222 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41416 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41419 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42071 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41680 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42071 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42073 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42150 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42153 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42293 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42295 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42403 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42405 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42524 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42527 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42732 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42735 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42920 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42923 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43152 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43155 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43346 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43349 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43598 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43601 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43825 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43827 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43940 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43942 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43998 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44000 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44093 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44096 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44767 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44271 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44767 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44770 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45010 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45012 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45051 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45054 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45254 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45256 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45295 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45297 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45390 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45392 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45424 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45427 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45943 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45945 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45997 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46000 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46500 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46502 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46556 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46559 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46977 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46892 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31641 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31747 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31749 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31859 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31861 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31923 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31925 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31980 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31996 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32248 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32250 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32322 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32325 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32574 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32577 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32733 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32735 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32849 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32852 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33113 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33116 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33375 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33378 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34744 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34746 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34775 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34777 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34873 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34875 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34903 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34905 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34971 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34974 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35446 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35448 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35539 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35541 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35662 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35665 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35850 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35853 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36072 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36075 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36491 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36494 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36848 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36851 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37018 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37020 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37055 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37058 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37278 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37280 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37312 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37315 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37687 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37481 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37687 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37690 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38022 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37816 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38022 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38025 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38361 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38364 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38683 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38685 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38785 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38787 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38896 + _PAUSEACTIVITYREQUEST._serialized_start = 38899 + _PAUSEACTIVITYREQUEST._serialized_end = 39098 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39101 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39284 + _PAUSEACTIVITYRESPONSE._serialized_start = 39286 + _PAUSEACTIVITYRESPONSE._serialized_end = 39309 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39311 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39343 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39346 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39626 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39629 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39902 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39904 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39929 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39931 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39965 + _RESETACTIVITYREQUEST._serialized_start = 39968 + _RESETACTIVITYREQUEST._serialized_end = 40275 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40278 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40568 + _RESETACTIVITYRESPONSE._serialized_start = 40570 + _RESETACTIVITYRESPONSE._serialized_end = 40593 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40595 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40627 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40630 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40914 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40917 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41094 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41096 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41202 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41204 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41301 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41304 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41498 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41501 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42153 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41762 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42153 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42155 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42232 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42235 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42375 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42377 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42485 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42487 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42606 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42609 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42814 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42817 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43002 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43005 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43234 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43237 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43428 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43431 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43680 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43683 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43907 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43909 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44022 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44024 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44080 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44082 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44175 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44178 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44849 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44353 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44849 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44852 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45092 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45094 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45133 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45136 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45336 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45338 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45377 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45379 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45472 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45474 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45506 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45509 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46025 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46027 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46079 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46082 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46582 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46584 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46638 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46641 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47059 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46974 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 46977 + 47059 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46979 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47089 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47092 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47281 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47283 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47382 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47384 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47453 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47455 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47562 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47564 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47677 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47680 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47907 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47910 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48090 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48092 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48187 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48189 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48254 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48256 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48337 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48339 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48402 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48404 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48432 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48434 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48504 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48506 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48610 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48613 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48819 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48821 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48867 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48870 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49025 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49027 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49058 - _LISTWORKERSREQUEST._serialized_start = 49061 - _LISTWORKERSREQUEST._serialized_end = 49191 - _LISTWORKERSRESPONSE._serialized_start = 49194 - _LISTWORKERSRESPONSE._serialized_end = 49359 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49362 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50087 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49929 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50020 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47061 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47171 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47174 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47363 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47365 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47464 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47466 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47535 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47537 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47644 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47646 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47759 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47762 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47989 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47992 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48172 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48174 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48269 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48271 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48336 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48338 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48419 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48421 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48484 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48486 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48514 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48516 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48586 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48588 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48692 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48695 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48901 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48903 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48949 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48952 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49107 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49109 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49140 + _LISTWORKERSREQUEST._serialized_start = 49143 + _LISTWORKERSREQUEST._serialized_end = 49273 + _LISTWORKERSRESPONSE._serialized_start = 49276 + _LISTWORKERSRESPONSE._serialized_end = 49441 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49444 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50169 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50011 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50102 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50022 + 50104 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50087 + 50169 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50089 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50180 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50183 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50341 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50343 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50428 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50431 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50697 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50699 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50799 - _DESCRIBEWORKERREQUEST._serialized_start = 50801 - _DESCRIBEWORKERREQUEST._serialized_end = 50872 - _DESCRIBEWORKERRESPONSE._serialized_start = 50874 - _DESCRIBEWORKERRESPONSE._serialized_end = 50955 - _COUNTWORKERSREQUEST._serialized_start = 50957 - _COUNTWORKERSREQUEST._serialized_end = 51044 - _COUNTWORKERSRESPONSE._serialized_start = 51046 - _COUNTWORKERSRESPONSE._serialized_end = 51083 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51086 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51227 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51229 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51261 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51264 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51407 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51409 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51443 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51446 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52623 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52625 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52734 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52737 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52965 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52968 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53284 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53286 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53372 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53374 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53490 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53492 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53601 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53604 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53734 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53737 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54586 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54536 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54586 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54588 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54659 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54662 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54832 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54835 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55146 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55149 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55310 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55313 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55574 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55576 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55691 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55694 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55833 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55835 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55901 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55904 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56141 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50171 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50262 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50265 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50423 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50425 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50510 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50513 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50779 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50781 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50881 + _DESCRIBEWORKERREQUEST._serialized_start = 50883 + _DESCRIBEWORKERREQUEST._serialized_end = 50954 + _DESCRIBEWORKERRESPONSE._serialized_start = 50956 + _DESCRIBEWORKERRESPONSE._serialized_end = 51037 + _COUNTWORKERSREQUEST._serialized_start = 51039 + _COUNTWORKERSREQUEST._serialized_end = 51126 + _COUNTWORKERSRESPONSE._serialized_start = 51128 + _COUNTWORKERSRESPONSE._serialized_end = 51165 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51168 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51309 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51311 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51343 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51346 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51489 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51491 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51525 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51528 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52705 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52707 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52816 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52819 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53047 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53050 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53366 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53368 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53454 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53456 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53572 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53574 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53683 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53686 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53816 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53819 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54668 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54618 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54668 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54670 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54741 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54744 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54914 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54917 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55228 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55231 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55392 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55395 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55656 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55658 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55773 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55776 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55915 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55917 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55983 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55986 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56223 _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56143 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56215 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56218 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56467 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56225 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56297 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56300 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56549 _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56470 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56619 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56621 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56661 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56664 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56809 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56811 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56847 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56849 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56937 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56939 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56975 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57131 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57133 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57179 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57182 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57334 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57336 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57378 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57380 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57475 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57477 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57516 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57519 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57676 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57679 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57911 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56552 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56701 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56703 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56743 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56746 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56891 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56893 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56929 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56931 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57019 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57021 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57054 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57057 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57213 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57215 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57261 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57264 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57416 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57418 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57460 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57462 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57557 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57559 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57598 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57601 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57758 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57761 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57993 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index 161d051c0..c6a2378a5 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -5205,6 +5205,7 @@ class DescribeWorkflowExecutionResponse(google.protobuf.message.Message): CALLBACKS_FIELD_NUMBER: builtins.int PENDING_NEXUS_OPERATIONS_FIELD_NUMBER: builtins.int WORKFLOW_EXTENDED_INFO_FIELD_NUMBER: builtins.int + CHANNEL_SUBSCRIPTIONS_FIELD_NUMBER: builtins.int @property def execution_config( self, @@ -5245,6 +5246,15 @@ class DescribeWorkflowExecutionResponse(google.protobuf.message.Message): def workflow_extended_info( self, ) -> temporalio.api.workflow.v1.message_pb2.WorkflowExecutionExtendedInfo: ... + @property + def channel_subscriptions( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.workflow.v1.message_pb2.ChannelSubscriptionInfo + ]: + """The notification channels this run stands on: the independent channels it subscribed to and + the channels linked to it that hold any state. Empty when there are none. + """ def __init__( self, *, @@ -5272,6 +5282,10 @@ class DescribeWorkflowExecutionResponse(google.protobuf.message.Message): | None = ..., workflow_extended_info: temporalio.api.workflow.v1.message_pb2.WorkflowExecutionExtendedInfo | None = ..., + channel_subscriptions: collections.abc.Iterable[ + temporalio.api.workflow.v1.message_pb2.ChannelSubscriptionInfo + ] + | None = ..., ) -> None: ... def HasField( self, @@ -5291,6 +5305,8 @@ class DescribeWorkflowExecutionResponse(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "callbacks", b"callbacks", + "channel_subscriptions", + b"channel_subscriptions", "execution_config", b"execution_config", "pending_activities", diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index 1153e3c9b..d73537054 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -22,6 +22,7 @@ StartChildWorkflowExecution, StartTimer, SubscribeNotificationChannel, + UnsubscribeNotificationChannel, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, @@ -51,6 +52,7 @@ "StartChildWorkflowExecution", "StartTimer", "SubscribeNotificationChannel", + "UnsubscribeNotificationChannel", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 54939089c..d989b014f 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\x8c\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x42\t\n\x07variant"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xf3\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x12\x65\n unsubscribe_notification_channel\x18 \x01(\x0b\x32\x39.coresdk.workflow_commands.UnsubscribeNotificationChannelH\x00\x42\t\n\x07variant"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"1\n\x1eUnsubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -59,6 +59,9 @@ _SUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ "SubscribeNotificationChannel" ] +_UNSUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ + "UnsubscribeNotificationChannel" +] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] _SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] @@ -144,6 +147,17 @@ ) _sym_db.RegisterMessage(SubscribeNotificationChannel) +UnsubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( + "UnsubscribeNotificationChannel", + (_message.Message,), + { + "DESCRIPTOR": _UNSUBSCRIBENOTIFICATIONCHANNEL, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UnsubscribeNotificationChannel) + }, +) +_sym_db.RegisterMessage(UnsubscribeNotificationChannel) + StartTimer = _reflection.GeneratedProtocolMessageType( "StartTimer", (_message.Message,), @@ -498,72 +512,74 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8820 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 8908 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 8974 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9062 _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2706 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 2708 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 2755 - _STARTTIMER._serialized_start = 2757 - _STARTTIMER._serialized_end = 2840 - _CANCELTIMER._serialized_start = 2842 - _CANCELTIMER._serialized_end = 2868 - _SCHEDULEACTIVITY._serialized_start = 2871 - _SCHEDULEACTIVITY._serialized_end = 3695 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3616 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3695 - _SCHEDULELOCALACTIVITY._serialized_start = 3698 - _SCHEDULELOCALACTIVITY._serialized_end = 4487 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3616 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3695 - _REQUESTCANCELACTIVITY._serialized_start = 4489 - _REQUESTCANCELACTIVITY._serialized_end = 4525 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4527 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4568 - _QUERYRESULT._serialized_start = 4571 - _QUERYRESULT._serialized_end = 4727 - _QUERYSUCCESS._serialized_start = 4729 - _QUERYSUCCESS._serialized_end = 4794 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4796 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 4872 - _FAILWORKFLOWEXECUTION._serialized_start = 4874 - _FAILWORKFLOWEXECUTION._serialized_end = 4948 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 4951 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 5865 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5708 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5784 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 - _CANCELWORKFLOWEXECUTION._serialized_start = 5867 - _CANCELWORKFLOWEXECUTION._serialized_end = 5943 - _SETPATCHMARKER._serialized_start = 5945 - _SETPATCHMARKER._serialized_end = 5999 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6002 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7176 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5708 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5784 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7178 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7252 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7255 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7397 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7400 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7799 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3616 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3695 - _CANCELSIGNALWORKFLOW._serialized_start = 7801 - _CANCELSIGNALWORKFLOW._serialized_end = 7836 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7838 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 7939 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 7941 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8020 - _UPDATERESPONSE._serialized_start = 8023 - _UPDATERESPONSE._serialized_end = 8233 - _SCHEDULENEXUSOPERATION._serialized_start = 8236 - _SCHEDULENEXUSOPERATION._serialized_end = 8774 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8724 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8774 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8776 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8818 + _WORKFLOWCOMMAND._serialized_end = 2809 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 2811 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 2858 + _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 2860 + _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 2909 + _STARTTIMER._serialized_start = 2911 + _STARTTIMER._serialized_end = 2994 + _CANCELTIMER._serialized_start = 2996 + _CANCELTIMER._serialized_end = 3022 + _SCHEDULEACTIVITY._serialized_start = 3025 + _SCHEDULEACTIVITY._serialized_end = 3849 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3770 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3849 + _SCHEDULELOCALACTIVITY._serialized_start = 3852 + _SCHEDULELOCALACTIVITY._serialized_end = 4641 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3770 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3849 + _REQUESTCANCELACTIVITY._serialized_start = 4643 + _REQUESTCANCELACTIVITY._serialized_end = 4679 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 4681 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 4722 + _QUERYRESULT._serialized_start = 4725 + _QUERYRESULT._serialized_end = 4881 + _QUERYSUCCESS._serialized_start = 4883 + _QUERYSUCCESS._serialized_end = 4948 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 4950 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5026 + _FAILWORKFLOWEXECUTION._serialized_start = 5028 + _FAILWORKFLOWEXECUTION._serialized_end = 5102 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5105 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6019 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5862 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5938 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3770 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3849 + _CANCELWORKFLOWEXECUTION._serialized_start = 6021 + _CANCELWORKFLOWEXECUTION._serialized_end = 6097 + _SETPATCHMARKER._serialized_start = 6099 + _SETPATCHMARKER._serialized_end = 6153 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6156 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7330 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3770 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3849 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5862 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5938 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7332 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7406 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7409 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7551 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7554 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7953 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3770 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3849 + _CANCELSIGNALWORKFLOW._serialized_start = 7955 + _CANCELSIGNALWORKFLOW._serialized_end = 7990 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7992 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8093 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8095 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8174 + _UPDATERESPONSE._serialized_start = 8177 + _UPDATERESPONSE._serialized_end = 8387 + _SCHEDULENEXUSOPERATION._serialized_start = 8390 + _SCHEDULENEXUSOPERATION._serialized_end = 8928 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8878 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8928 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 8930 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 8972 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index e658d1585..f351a96db 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -104,6 +104,7 @@ class WorkflowCommand(google.protobuf.message.Message): SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int SUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int + UNSUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -181,6 +182,10 @@ class WorkflowCommand(google.protobuf.message.Message): @property def subscribe_notification_channel(self) -> global___SubscribeNotificationChannel: """23 to 30 are taken by the stream commands, which share this message.""" + @property + def unsubscribe_notification_channel( + self, + ) -> global___UnsubscribeNotificationChannel: ... def __init__( self, *, @@ -221,6 +226,8 @@ class WorkflowCommand(google.protobuf.message.Message): | None = ..., subscribe_notification_channel: global___SubscribeNotificationChannel | None = ..., + unsubscribe_notification_channel: global___UnsubscribeNotificationChannel + | None = ..., ) -> None: ... def HasField( self, @@ -267,6 +274,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "unsubscribe_notification_channel", + b"unsubscribe_notification_channel", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -324,6 +333,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "unsubscribe_notification_channel", + b"unsubscribe_notification_channel", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -361,6 +372,7 @@ class WorkflowCommand(google.protobuf.message.Message): "schedule_nexus_operation", "request_cancel_nexus_operation", "subscribe_notification_channel", + "unsubscribe_notification_channel", ] | None ): ... @@ -391,6 +403,30 @@ class SubscribeNotificationChannel(google.protobuf.message.Message): global___SubscribeNotificationChannel = SubscribeNotificationChannel +class UnsubscribeNotificationChannel(google.protobuf.message.Message): + """End this workflow's subscription to a notification channel. Notifications + already recorded on a scheduled event still reach that Workflow Task. + + The server records an event for every unsubscribe, also one naming a channel + the run is not subscribed to, so replay can hold each command to its event. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """Name of the channel, scoped to the namespace.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___UnsubscribeNotificationChannel = UnsubscribeNotificationChannel + class StartTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 0c21f1c0f..acd30916e 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 0c21f1c0f637acc056660f49db1c0214a8e0d85c +Subproject commit acd30916e56c10d0dd47e6774a26cb0e9532aaee From 65df92f00116c72ff5585d0d2a7a9b78754674df Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:21:05 -0700 Subject: [PATCH 797/831] Named the consumer's channel the way the server names a stream's. A standalone stream notifies stream/, an owned one stream/ linked to the owning workflow, so the registration carries the owner. The rule is the channel_for default and a store with its own passes it. --- temporalio/streams/providers/nexus.py | 58 +++++++++------ tests/streams/test_nexus_consumer.py | 100 +++++++++++++++++--------- 2 files changed, 102 insertions(+), 56 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 531c1d515..798a375e5 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -156,7 +156,7 @@ "StreamConsumerOperation", "TemporalStreamsHandler", "WireStreamRef", - "stream_channel_name", + "stream_channel", "stream_consumer_operation", ] @@ -1297,26 +1297,27 @@ async def _endpoint_id(self, client: Client | None) -> str: _START_TIME_HEADER = "Nexus-Operation-Start-Time" -def stream_channel_name(ref: StreamRef) -> str: - """The notification channel a stream's writers notify, from the stream's identity. +def stream_channel(ref: StreamRef) -> tuple[str, str | None]: + """The channel a native stream notifies, and the owner a linked one belongs to. - The name folds the owner the ref names and the topic into one string, so - a producer and a consumer that hold the same ref meet on the same - channel. A ref pinned to a run names a different channel from one that - follows the chain, because the two name different streams. + The server's rule: a standalone stream notifies the independent channel + ``stream/``; a workflow's stream notifies ``stream/`` + linked to the owning workflow; an activity's stream notifies + ``stream//``, linked to the workflow that scheduled + the activity and independent for a standalone activity. The second + member is the workflow id a registration addresses the linked channel + with, ``None`` for an independent channel. A store that names channels + its own way passes its rule as ``channel_for`` instead. """ - parts = ["stream", ref.kind] - if ref.kind == "workflow": - parts += [ref.workflow_id or "", ref.run_id or ""] - elif ref.kind == "activity": - parts += [ref.workflow_id or "", ref.run_id or "", ref.activity_id or ""] - else: - parts.append(ref.stream_id or "") - parts.append(ref.topic) - return ":".join(parts) + if ref.kind == "standalone": + return f"stream/{ref.stream_id}", None + if ref.kind == "activity": + return f"stream/{ref.activity_id}/{ref.topic}", ref.workflow_id + return f"stream/{ref.topic}", ref.workflow_id ConsumeFunction = Callable[[StreamRecord[Any], S], "S | Awaitable[S]"] +ChannelRule = Callable[[StreamRef], tuple[str, "str | None"]] @dataclass(frozen=True) @@ -1333,6 +1334,9 @@ class ConsumerState(Generic[S]): channel: str """The channel the listener is registered on.""" + owner: str | None + """The workflow a linked channel belongs to, ``None`` for an independent one.""" + listener_id: str """The listener id the server assigned.""" @@ -1380,6 +1384,7 @@ class Delivery: class _Consumption(Generic[S]): ref: StreamRef channel: str + owner: str | None listener_id: str callback_url: str | None callback_headers: dict[str, str] @@ -1501,7 +1506,7 @@ def __init__( initial: Callable[[], S], listener_url: str, client: Client | None = None, - channel_for: Callable[[StreamRef], str] = stream_channel_name, + channel_for: ChannelRule = stream_channel, result_type: type | None = None, token_header: str = STREAM_CONSUMER_TOKEN_HEADER, ) -> None: @@ -1516,9 +1521,11 @@ def __init__( client: Registers the listener and opens the stream. Leave it unset in a handler hosted by a Temporal worker, where the operation context's client is used. - channel_for: Names the channel for a ref. The default is - :func:`stream_channel_name`; a store that names channels - its own way passes its rule. + channel_for: Names the channel for a ref, and the workflow a + linked channel belongs to. The default is + :func:`stream_channel`, the server's rule for native + streams; a store that names channels its own way passes + its rule. result_type: What record values are decoded as. token_header: The header carrying the operation token on the registration and so on every delivery. @@ -1547,6 +1554,7 @@ def state(self, token: str) -> ConsumerState[S] | None: return ConsumerState( ref=held.ref, channel=held.channel, + owner=held.owner, listener_id=held.listener_id, cursor=held.cursor, value=held.value, @@ -1570,7 +1578,7 @@ async def start( """ client = self._client() token = uuid.uuid4().hex - channel = self._channel_for(input) + channel, owner = self._channel_for(input) # Registered before the first read: a record appended between the # read and the registration would otherwise be missed, where one # appended between the registration and the read is read twice at @@ -1579,10 +1587,12 @@ async def start( listener_id = await client.register_channel_listener( channel, Callback(url=self._listener_url, headers={self._token_header: token}), + workflow_id=owner, ) state: _Consumption[S] = _Consumption( ref=input, channel=channel, + owner=owner, listener_id=listener_id, callback_url=ctx.callback_url, callback_headers=dict(ctx.callback_headers), @@ -1769,7 +1779,9 @@ async def close(self) -> None: async def _unregister(self, client: Client, state: _Consumption[S]) -> None: try: - await client.unregister_channel_listener(state.channel, state.listener_id) + await client.unregister_channel_listener( + state.channel, state.listener_id, workflow_id=state.owner + ) except RPCError: logger.warning( "could not unregister listener %s from channel %s", @@ -1833,7 +1845,7 @@ def stream_consumer_operation( initial: Callable[[], S], listener_url: str, client: Client | None = None, - channel_for: Callable[[StreamRef], str] = stream_channel_name, + channel_for: ChannelRule = stream_channel, result_type: type | None = None, token_header: str = STREAM_CONSUMER_TOKEN_HEADER, ) -> StreamConsumerOperation[S]: diff --git a/tests/streams/test_nexus_consumer.py b/tests/streams/test_nexus_consumer.py index 715674425..c512bd626 100644 --- a/tests/streams/test_nexus_consumer.py +++ b/tests/streams/test_nexus_consumer.py @@ -50,7 +50,7 @@ NexusStreams, StreamConsumerOperation, TemporalStreamsHandler, - stream_channel_name, + stream_channel, stream_consumer_operation, ) from temporalio.streams.providers.nexus_consumer_service import ( @@ -89,19 +89,23 @@ class _ClientStandIn: def __init__(self, store: MemoryStreams) -> None: self._store = store self.data_converter = temporalio.converter.DataConverter.default - self.registered: list[tuple[str, Callback]] = [] - self.unregistered: list[tuple[str, str]] = [] + self.registered: list[tuple[str, Callback, str | None]] = [] + self.unregistered: list[tuple[str, str, str | None]] = [] def get_stream_handle(self, ref: StreamRef) -> Any: # The memory store opens a handle without a client. return open_ref(self._store, _as_client(None), ref) - async def register_channel_listener(self, channel: str, callback: Callback) -> str: - self.registered.append((channel, callback)) + async def register_channel_listener( + self, channel: str, callback: Callback, *, workflow_id: str | None = None + ) -> str: + self.registered.append((channel, callback, workflow_id)) return f"listener-{len(self.registered)}" - async def unregister_channel_listener(self, channel: str, listener_id: str) -> None: - self.unregistered.append((channel, listener_id)) + async def unregister_channel_listener( + self, channel: str, listener_id: str, *, workflow_id: str | None = None + ) -> None: + self.unregistered.append((channel, listener_id, workflow_id)) @dataclass @@ -216,7 +220,7 @@ async def _rig( client, operation, ref, - stream_channel_name(ref), + stream_channel(ref)[0], handle.producer(topic=VALUES, producer_id="writer", attempt=1), ) @@ -226,23 +230,52 @@ async def _rig( # --------------------------------------------------------------------------- -def test_the_channel_name_folds_the_owner_and_the_topic(): - assert ( - stream_channel_name(StreamRef.for_standalone("s-1", topic="values")) - == "stream:standalone:s-1:values" +def test_the_channel_follows_the_servers_names(): + # A standalone stream's channel is independent; an owned stream's is + # linked to the owning workflow, which the second member names. + assert stream_channel(StreamRef.for_standalone("s-1", topic="values")) == ( + "stream/s-1", + None, + ) + assert stream_channel(StreamRef.for_workflow("wf", topic="t")) == ("stream/t", "wf") + assert stream_channel(StreamRef.for_workflow("wf", run_id="r", topic="t")) == ( + "stream/t", + "wf", ) - assert ( - stream_channel_name(StreamRef.for_workflow("wf", topic="t")) - == "stream:workflow:wf::t" + assert stream_channel( + StreamRef.for_activity("act", workflow_id="wf", topic="t") + ) == ("stream/act/t", "wf") + assert stream_channel(StreamRef.for_activity("act", topic="t")) == ( + "stream/act/t", + None, ) - assert ( - stream_channel_name(StreamRef.for_workflow("wf", run_id="r", topic="t")) - == "stream:workflow:wf:r:t" + + +async def test_an_owned_stream_registers_on_the_owners_linked_channel( + posted: list[_Posted], +): + store = MemoryStreams() + ref = store.get_stream_handle(None, "wf-1").ref(topic=VALUES) + client = _ClientStandIn(store) + operation = stream_consumer_operation( + collect_values, + initial=list, + listener_url=LISTENER_URL, + client=_as_client(client), ) - assert ( - stream_channel_name(StreamRef.for_activity("act", workflow_id="wf", topic="t")) - == "stream:activity:wf::act:t" + result = await operation.start(_start_context(), ref) + assert isinstance(result, nexusrpc.handler.StartOperationResultAsync) + state = operation.state(result.token) + assert state is not None and (state.channel, state.owner) == ( + "stream/values", + "wf-1", ) + assert [(channel, owner) for channel, _, owner in client.registered] == [ + ("stream/values", "wf-1") + ] + await operation.close() + assert client.unregistered == [("stream/values", "listener-1", "wf-1")] + assert posted == [] async def test_start_registers_the_listener_and_reads_what_was_there( @@ -257,6 +290,7 @@ async def test_start_registers_the_listener_and_reads_what_was_there( ( rig.channel, Callback(url=LISTENER_URL, headers={STREAM_CONSUMER_TOKEN_HEADER: token}), + None, ) ] state = rig.operation.state(token) @@ -326,7 +360,7 @@ async def test_the_close_completes_through_the_callers_callback( completion.headers["Nexus-Operation-Start-Time"] ) assert json.loads(completion.body) == ["a", "b"] - assert rig.client.unregistered == [(rig.channel, "listener-1")] + assert rig.client.unregistered == [(rig.channel, "listener-1", None)] assert rig.operation.state(token) is None assert rig.operation.tokens == [] @@ -347,7 +381,7 @@ async def test_a_finish_record_closes_the_operation(posted: list[_Posted]): [completion] = posted assert completion.state == "succeeded" assert json.loads(completion.body) == ["only"] - assert rig.client.unregistered == [(rig.channel, "listener-1")] + assert rig.client.unregistered == [(rig.channel, "listener-1", None)] async def test_a_stream_finished_before_the_start_completes_at_once( @@ -368,7 +402,7 @@ async def test_cancel_unregisters_and_reports_canceled(posted: list[_Posted]): token = await rig.start() await rig.operation.cancel(_cancel_context(), token) - assert rig.client.unregistered == [(rig.channel, "listener-1")] + assert rig.client.unregistered == [(rig.channel, "listener-1", None)] [completion] = posted assert completion.state == "canceled" assert completion.headers["Nexus-Operation-Token"] == token @@ -407,7 +441,7 @@ def fussy(record: StreamRecord[Any], values: list[Any]) -> list[Any]: [completion] = posted assert completion.state == "failed" assert json.loads(completion.body)["message"] == "ValueError: cannot take bad" - assert rig.client.unregistered == [(rig.channel, "listener-1")] + assert rig.client.unregistered == [(rig.channel, "listener-1", None)] assert rig.operation.state(token) is None @@ -442,8 +476,8 @@ async def test_close_lets_go_of_every_listener_without_completing( await rig.operation.close() assert rig.operation.tokens == [] assert rig.client.unregistered == [ - (rig.channel, "listener-1"), - (rig.channel, "listener-2"), + (rig.channel, "listener-1", None), + (rig.channel, "listener-2", None), ] assert posted == [] @@ -468,7 +502,7 @@ def nothing(record: StreamRecord[Any], value: None) -> None: await handle.producer(topic=VALUES, producer_id="w", attempt=1).finish() await operation.deliver( {STREAM_CONSUMER_TOKEN_HEADER: result.token}, - _notification(stream_channel_name(ref), 1), + _notification(stream_channel(ref)[0], 1), ) [completion] = posted assert completion.state == "succeeded" @@ -716,7 +750,7 @@ async def test_a_standalone_service_consumes_an_external_stream_through_its_chan stream_id = f"consumed-{uuid.uuid4().hex}" handle = await store.create_standalone_stream(None, stream_id) ref = handle.ref(topic=VALUES) - channel = stream_channel_name(ref) + channel = stream_channel(ref)[0] producer = handle.producer(topic=VALUES, producer_id="writer", attempt=1) async with _consumer_service(client, store) as live: @@ -781,7 +815,7 @@ async def test_cancel_unregisters_the_listener(client: Client): stream_id = f"consumed-{uuid.uuid4().hex}" handle = await store.create_standalone_stream(None, stream_id) ref = handle.ref(topic=VALUES) - channel = stream_channel_name(ref) + channel = stream_channel(ref)[0] async with ( _consumer_service(client, store) as live, @@ -853,7 +887,7 @@ async def test_a_worker_hosted_consumer_is_reached_through_the_frontend( stream_id = f"consumed-{uuid.uuid4().hex}" handle = await store.create_standalone_stream(None, stream_id) ref = handle.ref(topic=VALUES) - channel = stream_channel_name(ref) + channel = stream_channel(ref)[0] producer = handle.producer(topic=VALUES, producer_id="writer", attempt=1) uid = uuid.uuid4().hex stream_handler = TemporalStreamsHandler(store, client) @@ -963,7 +997,7 @@ async def test_a_native_standalone_stream_is_consumed_through_its_channel( id=f"caller-{stream_id}", task_queue=worker.task_queue, ) - token = await _listener_token(client, stream_channel_name(ref)) + token = await _listener_token(client, stream_channel(ref)[0]) await _consumed(live.consumer, token, 2) # The server notifies the stream's channel on every append and on # the close, so the records reach the consumer without a notify. @@ -973,5 +1007,5 @@ async def test_a_native_standalone_stream_is_consumed_through_its_channel( await handle.close() assert await asyncio.wait_for(run.result(), 60) == ["a", "b", "c"] assert ( - await client.describe_channel(stream_channel_name(ref)) + await client.describe_channel(stream_channel(ref)[0]) ).listeners == [] From 5a85fb2a025484959a893b66c150dac6c3fa04fe Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:26:53 -0700 Subject: [PATCH 798/831] Added channel unsubscribe, subscriptions on describe and stream_channel. A subscription used to end only with the run. The handle now records the unsubscribe command once and closes, so a workflow can rotate channels under the per-run cap. The description lists what a run stands on, and stream_channel derives the channel a native stream notifies so a client can follow a stream without asking the server. --- temporalio/client/__init__.py | 6 + temporalio/client/_channel.py | 127 ++++++- temporalio/client/_workflow.py | 17 + temporalio/worker/_workflow_instance.py | 7 + temporalio/workflow/_channels.py | 70 +++- temporalio/workflow/_context.py | 9 + tests/streams/conftest.py | 48 +++ tests/streams/test_channels.py | 453 +++++++++++++++++++++++- 8 files changed, 725 insertions(+), 12 deletions(-) diff --git a/temporalio/client/__init__.py b/temporalio/client/__init__.py index 2577111d2..7ed7187be 100644 --- a/temporalio/client/__init__.py +++ b/temporalio/client/__init__.py @@ -65,9 +65,12 @@ Callback, ) from ._channel import ( + ChannelAddress, ChannelDescription, ChannelKind, ChannelListener, + ChannelSubscriptionInfo, + stream_channel, ) from ._client import ( Client, @@ -369,6 +372,9 @@ "ChannelDescription", "ChannelKind", "ChannelListener", + "ChannelAddress", + "ChannelSubscriptionInfo", + "stream_channel", "_ClientImpl", "_apply_headers", "_decode_user_metadata", diff --git a/temporalio/client/_channel.py b/temporalio/client/_channel.py index d05d2875b..5ae2d3371 100644 --- a/temporalio/client/_channel.py +++ b/temporalio/client/_channel.py @@ -9,11 +9,23 @@ import temporalio.api.common.v1 import temporalio.api.notification.v1 +import temporalio.api.workflow.v1 +from temporalio.streams._ref import StreamRef from temporalio.workflow import Notification from ._callback import Callback -__all__ = ["ChannelDescription", "ChannelKind", "ChannelListener"] +__all__ = [ + "ChannelAddress", + "ChannelDescription", + "ChannelKind", + "ChannelListener", + "ChannelSubscriptionInfo", + "stream_channel", +] + +STREAM_CHANNEL_PREFIX = "stream/" +"""The first segment of the channel a native stream notifies.""" class ChannelKind(IntEnum): @@ -120,3 +132,116 @@ class ChannelDescription: ``None`` for an independent channel. """ + + +@dataclass(frozen=True) +class ChannelSubscriptionInfo: + """A workflow's standing on one channel, as its description reports it. + + An independent channel is listed from the subscribe event until the run + unsubscribes or closes. A linked channel is listed once it holds state. A + closed run keeps listing what it stood on, and a continue-as-new + successor starts with nothing. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + """Channel name.""" + + kind: ChannelKind + """:attr:`ChannelKind.INDEPENDENT` for a subscription the workflow made by + command, :attr:`ChannelKind.LINKED` for a channel linked to it.""" + + subscribed_event_id: int + """Id of the event that recorded the subscription. Zero for the linked kind.""" + + last_counter: int + """Highest counter the workflow has accepted from the channel. Zero when + none has arrived.""" + + pending_notification: Notification | None + """The notification held for the workflow's next Workflow Task, when one + is pending.""" + + scheduled_counter: int + """Counter carried by the scheduled event of a Workflow Task that has not + started yet. Zero otherwise.""" + + listener_count: int + """Linked kind: callback listeners registered on the channel.""" + + retained_count: int + """Linked kind: notifications retained for pollers.""" + + accepted_count: int + """Linked kind: notifications the channel has accepted over its life.""" + + @staticmethod + def _from_proto( + proto: temporalio.api.workflow.v1.ChannelSubscriptionInfo, + ) -> ChannelSubscriptionInfo: + return ChannelSubscriptionInfo( + channel=proto.channel, + kind=ChannelKind(proto.kind), + subscribed_event_id=proto.subscribed_event_id, + last_counter=proto.last_counter, + pending_notification=( + Notification._from_proto(proto.pending_notification) + if proto.HasField("pending_notification") + else None + ), + scheduled_counter=proto.scheduled_counter, + listener_count=proto.listener_count, + retained_count=proto.retained_count, + accepted_count=proto.accepted_count, + ) + + +@dataclass(frozen=True) +class ChannelAddress: + """Where a channel call reaches a channel: its name and, when linked, its owner. + + .. warning:: + This API is experimental and unstable. + """ + + channel: str + """The channel name.""" + + workflow_id: str | None + """The workflow the channel is linked to, or ``None`` for an independent one. + + Pass both to :py:meth:`temporalio.client.Client.poll_channel` and the + other channel calls as ``channel`` and ``workflow_id``. + """ + + +def stream_channel(ref: StreamRef) -> ChannelAddress: + """The channel a native stream notifies on every append and on its close. + + The server derives the name from the stream's identity, and this helper + derives the same one, so a client polls or registers a callback without + asking. A stream a workflow owns notifies ``stream/`` linked to the + owning workflow. A stream an activity owns notifies + ``stream//``, linked to the workflow that scheduled + the activity, or independent for a standalone activity, which has no + linked channels of its own. A standalone stream notifies the independent + channel ``stream/``, whatever the topic, since its topics share + one stream on the server. + + Each change arrives as one notification: the stream's change sequence as + the counter, the head after the change as the position, and ``closed`` + set in the metadata on the close. + """ + if ref.kind == "workflow": + assert ref.workflow_id is not None + return ChannelAddress(STREAM_CHANNEL_PREFIX + ref.topic, ref.workflow_id) + if ref.kind == "activity": + assert ref.activity_id is not None + return ChannelAddress( + f"{STREAM_CHANNEL_PREFIX}{ref.activity_id}/{ref.topic}", ref.workflow_id + ) + assert ref.stream_id is not None + return ChannelAddress(STREAM_CHANNEL_PREFIX + ref.stream_id, None) diff --git a/temporalio/client/_workflow.py b/temporalio/client/_workflow.py index 0607ade0a..9fbc60138 100644 --- a/temporalio/client/_workflow.py +++ b/temporalio/client/_workflow.py @@ -59,6 +59,7 @@ ReturnType, SelfType, ) +from ._channel import ChannelSubscriptionInfo from ._exceptions import ( WorkflowContinuedAsNewError, WorkflowFailureError, @@ -1418,6 +1419,18 @@ class WorkflowExecutionDescription(WorkflowExecution): raw_description: temporalio.api.workflowservice.v1.DescribeWorkflowExecutionResponse """Underlying protobuf description.""" + channel_subscriptions: Sequence[ChannelSubscriptionInfo] = () + """The notification channels this run stands on. + + The independent channels it subscribed to and the channels linked to it + that hold any state, sorted by name with the independent kind first. + Empty when there are none. See + :py:class:`temporalio.client.ChannelSubscriptionInfo`. + + .. warning:: + This API is experimental and unstable. + """ + _static_summary: str | None = None _static_details: str | None = None _metadata_decoded: bool = False @@ -1456,6 +1469,10 @@ async def _from_raw_description( namespace=namespace, converter=converter, raw_description=description, + channel_subscriptions=tuple( + ChannelSubscriptionInfo._from_proto(info) + for info in description.channel_subscriptions + ), ) diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 0ffebe5c1..13f2a1490 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -1878,6 +1878,13 @@ def workflow_subscribe_channel( self._channel_subscriptions[channel] = subscription return subscription + def workflow_unsubscribe_channel(self, channel: str) -> None: + command = self._add_command() + command.unsubscribe_notification_channel.channel = channel + # Out of the map before the next activation: the server may still hand + # this run a notification it folded onto a task ahead of the command. + self._channel_subscriptions.pop(channel, None) + def workflow_linked_channel( self, channel: str ) -> temporalio.workflow.ChannelSubscription: diff --git a/temporalio/workflow/_channels.py b/temporalio/workflow/_channels.py index fbbf6843d..04d6fb836 100644 --- a/temporalio/workflow/_channels.py +++ b/temporalio/workflow/_channels.py @@ -90,13 +90,15 @@ class ChannelSubscription: this workflow. The handle is an async iterator over the notifications as they arrive, and :meth:`receive` takes them one at a time. Notifications wait in arrival order until taken. Two loops on one handle share its - buffer and interleave. + buffer and interleave. :meth:`unsubscribe` ends an independent + subscription; a linked channel lasts as long as the run. """ def __init__(self, channel: str, *, linked: bool = False) -> None: """Prefer the two module functions named above.""" self._channel = channel self._linked = linked + self._closed = False self._pending: deque[Notification] = deque() self._waiters: deque[asyncio.Future[None]] = deque() @@ -114,13 +116,68 @@ def linked(self) -> bool: """ return self._linked + @property + def closed(self) -> bool: + """Whether :meth:`unsubscribe` has ended this subscription. + + A closed handle still hands out the notifications it had queued, then + :meth:`receive` raises and iteration ends. + """ + return self._closed + + def unsubscribe(self) -> None: + """End this workflow's subscription to the channel. + + Issues the unsubscribe command once; a second call changes nothing. + Notifications already queued on this handle can still be read, and + one the server put on a scheduled Workflow Task before the command + landed is dropped on arrival. A later + :func:`temporalio.workflow.subscribe_channel` for the same name opens + a new subscription with a new command. + + Raises: + ValueError: The handle is from + :func:`temporalio.workflow.linked_channel`. A linked channel is + part of the run and has no subscription to end. + """ + if self._linked: + raise ValueError("a linked channel has no subscription") + if self._closed: + return + _Runtime.current().workflow_unsubscribe_channel(self._channel) + self._closed = True + # The waiters wake to find the handle closed with nothing queued. + self._wake() + async def receive(self) -> Notification: """The next notification on this channel, waiting for one to arrive. The wait is a future the delivery resolves, so it adds no command and replays the same way. + + Raises: + RuntimeError: The subscription is closed and nothing is queued. """ + notification = await self._next() + if notification is None: + raise RuntimeError("channel subscription closed") + return notification + + def __aiter__(self) -> ChannelSubscription: + """The subscription is its own iterator.""" + return self + + async def __anext__(self) -> Notification: + """The next notification. The iteration ends once the handle is closed and drained.""" + notification = await self._next() + if notification is None: + raise StopAsyncIteration + return notification + + async def _next(self) -> Notification | None: while not self._pending: + if self._closed: + return None waiter: asyncio.Future[None] = asyncio.Future() self._waiters.append(waiter) try: @@ -130,16 +187,11 @@ async def receive(self) -> Notification: self._waiters.remove(waiter) return self._pending.popleft() - def __aiter__(self) -> ChannelSubscription: - """The subscription is its own iterator.""" - return self - - async def __anext__(self) -> Notification: - """The next notification; the iteration never ends on its own.""" - return await self.receive() - def _deliver(self, notification: Notification) -> None: self._pending.append(notification) + self._wake() + + def _wake(self) -> None: # Every waiter wakes; the ones that find the buffer empty again wait # once more. while self._waiters: diff --git a/temporalio/workflow/_context.py b/temporalio/workflow/_context.py index 1371afc29..a04791baf 100644 --- a/temporalio/workflow/_context.py +++ b/temporalio/workflow/_context.py @@ -517,6 +517,15 @@ def workflow_streams(self) -> _WorkflowStreams: ... @abstractmethod def workflow_subscribe_channel(self, channel: str) -> ChannelSubscription: ... + @abstractmethod + def workflow_unsubscribe_channel(self, channel: str) -> None: + """Record the unsubscribe command for ``channel`` and forget its handle. + + Called once per subscription, by the handle that owns it, so a late + notification for the channel finds no handle and is dropped. + """ + ... + @abstractmethod def workflow_linked_channel(self, channel: str) -> ChannelSubscription: ... diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 13b2a999c..8af40d565 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -14,6 +14,10 @@ # only talks to the server from the client runs on every layer. PINNED_CORE_HANDLES_LINKED_CHANNEL = False +# The unsubscribe is a command like the subscribe, refused by the protos-only +# pin and matched against its event by the delivery pin. +PINNED_CORE_HANDLES_UNSUBSCRIBE = False + def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( @@ -49,6 +53,26 @@ def pytest_configure(config: pytest.Config) -> None: "needs_linked_core: the case needs the pinned Core to hand a linked " "channel's notifications to workflow code", ) + config.addinivalue_line( + "markers", + "needs_describe_server: the case needs a server whose workflow description " + "lists the channel subscriptions, named with -E host:port", + ) + config.addinivalue_line( + "markers", + "needs_unsubscribe_server: the case needs a server that accepts the " + "unsubscribe-notification-channel command, named with -E host:port", + ) + config.addinivalue_line( + "markers", + "needs_unsubscribe_core: the case needs the pinned Core to handle the " + "unsubscribe-notification-channel command", + ) + config.addinivalue_line( + "markers", + "needs_stream_channel_server: the case needs a server on which a native " + "stream notifies the channel named by the stream, named with -E host:port", + ) def pytest_collection_modifyitems( @@ -98,6 +122,30 @@ def pytest_collection_modifyitems( ), ) ) + if config.getoption("--workflow-environment") in _ENVIRONMENTS_WITHOUT_CHANNELS: + for marker, what in ( + ("needs_describe_server", "lists channel subscriptions on describe"), + ("needs_unsubscribe_server", "accepts the unsubscribe command"), + ("needs_stream_channel_server", "notifies a stream's channel"), + ): + skips.append( + ( + marker, + pytest.mark.skip( + reason=f"needs a server that {what}; name one with -E" + ), + ) + ) + if not PINNED_CORE_HANDLES_UNSUBSCRIBE: + skips.append( + ( + "needs_unsubscribe_core", + pytest.mark.skip( + reason="the pinned Core refuses the unsubscribe command; py-05 " + "pins one that handles it" + ), + ) + ) for item in items: for marker, skip in skips: if item.get_closest_marker(marker): diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index 687b5c63a..3a3ac88ee 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -5,7 +5,8 @@ workflow instance is driven with activations directly, the way Core drives it, because the dev server this chain tests against does not accept the subscribe command. The live cases at the end need a server that does, or one -with the linked kind, and skip otherwise. +with the linked kind, one whose describe lists the subscriptions, or one that +accepts the unsubscribe, and skip otherwise. """ from __future__ import annotations @@ -19,7 +20,9 @@ import pytest import temporalio.api.common.v1 +import temporalio.api.enums.v1 import temporalio.api.notification.v1 +import temporalio.api.workflow.v1 import temporalio.api.workflowservice.v1 import temporalio.bridge.proto.workflow_activation import temporalio.bridge.proto.workflow_completion @@ -27,8 +30,17 @@ import temporalio.converter from temporalio import workflow from temporalio.api.enums.v1 import EventType -from temporalio.client import Callback, ChannelKind, Client +from temporalio.client import ( + Callback, + ChannelAddress, + ChannelKind, + ChannelSubscriptionInfo, + Client, + WorkflowExecutionDescription, + stream_channel, +) from temporalio.service import RPCError, RPCStatusCode +from temporalio.streams import DEFAULT_TOPIC, StreamRef from temporalio.worker._workflow_instance import ( UnsandboxedWorkflowRunner, WorkflowInstance, @@ -176,6 +188,80 @@ async def run(self, channel: str) -> int: return seen +async def _drain(handle: workflow.ChannelSubscription) -> dict[str, Any]: + """What a closed handle still gives: the queue, then the end, then the refusal.""" + drained = [notification.counter async for notification in handle] + try: + await handle.receive() + except RuntimeError as err: + refused: str | None = str(err) + else: + refused = None + return {"closed": handle.closed, "drained": drained, "refused": refused} + + +@workflow.defn +class ReceiveThenUnsubscribe: + """Takes the first notification, unsubscribes twice, then waits to be finished. + + The wait keeps the run open so a late notification can be aimed at it. + """ + + def __init__(self) -> None: + self._done = False + + @workflow.run + async def run(self, channel: str) -> dict[str, Any]: + handle = workflow.subscribe_channel(channel) + first = await handle.receive() + assert not handle.closed + handle.unsubscribe() + handle.unsubscribe() + drained = await _drain(handle) + await workflow.wait_condition(lambda: self._done) + return {"first": first.counter, **drained} + + @workflow.signal + def finish(self) -> None: + self._done = True + + +@workflow.defn +class UnsubscribeWithOneQueued: + """Unsubscribes with a notification still queued and reads it afterwards.""" + + @workflow.run + async def run(self, channel: str) -> dict[str, Any]: + handle = workflow.subscribe_channel(channel) + first = await handle.receive() + handle.unsubscribe() + return {"first": first.counter, **(await _drain(handle))} + + +@workflow.defn +class UnsubscribeLinked: + """Tries to unsubscribe from its linked channel.""" + + @workflow.run + async def run(self, channel: str) -> None: + workflow.linked_channel(channel).unsubscribe() + + +@workflow.defn +class Resubscribe: + """Subscribes, unsubscribes and subscribes again, then receives on the new handle.""" + + @workflow.run + async def run(self, channel: str) -> dict[str, Any]: + first = workflow.subscribe_channel(channel) + first.unsubscribe() + second = workflow.subscribe_channel(channel) + assert second is not first + assert first.closed and not second.closed + notification = await second.receive() + return {"counter": notification.counter, **(await _drain(first))} + + def _instance(workflow_class: type) -> WorkflowInstance: """Build an instance the way the worker does, without a worker. @@ -256,6 +342,12 @@ def _linked(channel: str, counter: int, position: bytes = b"") -> Notification: ) +def _signalled(name: str) -> WorkflowActivation: + job = WorkflowActivationJob() + job.signal_workflow.signal_name = name + return WorkflowActivation(run_id="run", jobs=[job]) + + def _subscribed(completion: WorkflowActivationCompletion) -> list[str]: assert completion.HasField("successful"), completion.failed.failure.message return [ @@ -265,6 +357,24 @@ def _subscribed(completion: WorkflowActivationCompletion) -> list[str]: ] +def _channel_commands( + completion: WorkflowActivationCompletion, +) -> list[tuple[str, str]]: + """The channel commands of a completion in order, as (verb, channel) pairs.""" + assert completion.HasField("successful"), completion.failed.failure.message + commands: list[tuple[str, str]] = [] + for command in completion.successful.commands: + if command.HasField("subscribe_notification_channel"): + commands.append( + ("subscribe", command.subscribe_notification_channel.channel) + ) + elif command.HasField("unsubscribe_notification_channel"): + commands.append( + ("unsubscribe", command.unsubscribe_notification_channel.channel) + ) + return commands + + def _completed(completion: WorkflowActivationCompletion) -> bool: assert completion.HasField("successful"), completion.failed.failure.message return any( @@ -374,6 +484,168 @@ async def test_the_owner_on_a_notification_picks_the_handle_of_its_kind(): assert _result(completion) == {"independent": [5], "linked": [1, 2]} +_CLOSED = "channel subscription closed" + + +async def test_an_unsubscribe_is_one_command_and_a_late_notification_is_dropped(): + instance = _instance(ReceiveThenUnsubscribe) + assert _channel_commands( + instance.activate(_start(ReceiveThenUnsubscribe, "orders")) + ) == [("subscribe", "orders")] + # The first notification is taken, then the two unsubscribe calls cost one + # command between them. + completion = instance.activate(_notified(Notification(channel="orders", counter=1))) + assert _channel_commands(completion) == [("unsubscribe", "orders")] + assert not _completed(completion) + # The server may still hand the run a notification it folded onto a task + # before the command landed. Nothing listens, so it changes nothing. + completion = instance.activate(_notified(Notification(channel="orders", counter=2))) + assert _channel_commands(completion) == [] + assert not _completed(completion) + assert _result(instance.activate(_signalled("finish"))) == { + "first": 1, + "closed": True, + "drained": [], + "refused": _CLOSED, + } + + +async def test_a_queued_notification_survives_the_unsubscribe_then_the_iteration_ends(): + instance = _instance(UnsubscribeWithOneQueued) + instance.activate(_start(UnsubscribeWithOneQueued, "orders")) + completion = instance.activate( + _notified( + Notification(channel="orders", counter=1), + Notification(channel="orders", counter=2), + ) + ) + assert _channel_commands(completion) == [("unsubscribe", "orders")] + assert _result(completion) == { + "first": 1, + "closed": True, + "drained": [2], + "refused": _CLOSED, + } + + +async def test_a_linked_handle_has_no_subscription_to_end(): + completion = _instance(UnsubscribeLinked).activate( + _start(UnsubscribeLinked, "orders") + ) + assert completion.HasField("failed") + assert "a linked channel has no subscription" in completion.failed.failure.message + + +async def test_a_subscription_after_an_unsubscribe_is_a_new_one(): + instance = _instance(Resubscribe) + completion = instance.activate(_start(Resubscribe, "orders")) + assert _channel_commands(completion) == [ + ("subscribe", "orders"), + ("unsubscribe", "orders"), + ("subscribe", "orders"), + ] + assert not _completed(completion) + # The notification reaches the open handle, and the closed one stays closed. + assert _result( + instance.activate(_notified(Notification(channel="orders", counter=3))) + ) == { + "counter": 3, + "closed": True, + "drained": [], + "refused": _CLOSED, + } + + +async def test_a_stream_names_the_channel_it_notifies(): + assert stream_channel(StreamRef.for_workflow("wf", topic="out")) == ChannelAddress( + "stream/out", "wf" + ) + assert stream_channel(StreamRef.for_workflow("wf", run_id="run")) == ChannelAddress( + "stream/" + DEFAULT_TOPIC, "wf" + ) + assert stream_channel( + StreamRef.for_activity("act", workflow_id="wf", topic="out") + ) == ChannelAddress("stream/act/out", "wf") + # A standalone activity is an execution of its own with no linked channels. + assert stream_channel(StreamRef.for_activity("act", topic="out")) == ChannelAddress( + "stream/act/out", None + ) + # A standalone stream's topics share one stream on the server, so the + # topic is not part of the name. + assert stream_channel( + StreamRef.for_standalone("sid", topic="out") + ) == ChannelAddress("stream/sid", None) + + +async def test_the_description_maps_every_channel_subscription_field(): + [topic] = temporalio.converter.PayloadConverter.default.to_payloads(["inputs"]) + pending = Notification(channel="orders", position=b"4-0", counter=4) + pending.metadata["topic"].CopyFrom(topic) + raw = temporalio.api.workflowservice.v1.DescribeWorkflowExecutionResponse( + workflow_execution_info=temporalio.api.workflow.v1.WorkflowExecutionInfo( + execution=temporalio.api.common.v1.WorkflowExecution( + workflow_id="wf", run_id="run" + ), + type=temporalio.api.common.v1.WorkflowType(name="ReceiveOne"), + status=temporalio.api.enums.v1.WorkflowExecutionStatus.WORKFLOW_EXECUTION_STATUS_RUNNING, + task_queue="tq", + ), + channel_subscriptions=[ + temporalio.api.workflow.v1.ChannelSubscriptionInfo( + channel="orders", + kind=temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_INDEPENDENT, + subscribed_event_id=5, + last_counter=3, + pending_notification=pending, + scheduled_counter=4, + ), + temporalio.api.workflow.v1.ChannelSubscriptionInfo( + channel="orders", + kind=temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED, + last_counter=2, + listener_count=1, + retained_count=2, + accepted_count=7, + ), + ], + ) + description = await WorkflowExecutionDescription._from_raw_description( + raw, "default", temporalio.converter.DataConverter.default + ) + assert description.id == "wf" + assert description.channel_subscriptions == ( + ChannelSubscriptionInfo( + channel="orders", + kind=ChannelKind.INDEPENDENT, + subscribed_event_id=5, + last_counter=3, + pending_notification=workflow.Notification( + channel="orders", position=b"4-0", counter=4, metadata={"topic": topic} + ), + scheduled_counter=4, + listener_count=0, + retained_count=0, + accepted_count=0, + ), + ChannelSubscriptionInfo( + channel="orders", + kind=ChannelKind.LINKED, + subscribed_event_id=0, + last_counter=2, + pending_notification=None, + scheduled_counter=0, + listener_count=1, + retained_count=2, + accepted_count=7, + ), + ) + raw.ClearField("channel_subscriptions") + description = await WorkflowExecutionDescription._from_raw_description( + raw, "default", temporalio.converter.DataConverter.default + ) + assert description.channel_subscriptions == () + + async def test_the_client_addresses_a_linked_channel_by_workflow( client: Client, monkeypatch: pytest.MonkeyPatch ): @@ -744,3 +1016,180 @@ async def test_a_linked_channel_is_polled_by_workflow_id(client: Client): assert closed.value.status == RPCStatusCode.NOT_FOUND finally: await _stop(handle, worker, running) + + +_SUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED +_UNSUBSCRIBED = EventType.EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED + + +async def _event_ids(handle: Any, event_type: Any) -> list[int]: + """The ids of the events of ``event_type`` in the run's History so far.""" + return [ + event.event_id + async for event in handle.fetch_history_events() + if event.event_type == event_type + ] + + +async def _one_event(handle: Any, event_type: Any) -> int: + """The id of the one event of ``event_type``, failing until it is there.""" + ids = await _event_ids(handle, event_type) + assert len(ids) == 1, ids + return ids[0] + + +@pytest.mark.needs_describe_server +@pytest.mark.needs_channel_core +async def test_a_description_lists_an_independent_subscription(client: Client): + channel = f"orders-{uuid.uuid4()}" + worker = new_worker(client, CountToTwo) + running = asyncio.create_task(worker.run()) + handle = await client.start_workflow( + CountToTwo.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + try: + event_id = await assert_eventually( + lambda: _one_event(handle, _SUBSCRIBED), timeout=timedelta(seconds=30) + ) + # Listed from the subscribe event on, with nothing accepted yet. The + # counts belong to the channel execution and stay zero here. + description = await handle.describe() + assert description.channel_subscriptions == ( + ChannelSubscriptionInfo( + channel=channel, + kind=ChannelKind.INDEPENDENT, + subscribed_event_id=event_id, + last_counter=0, + pending_notification=None, + scheduled_counter=0, + listener_count=0, + retained_count=0, + accepted_count=0, + ), + ) + assert await client.notify_channel(channel, position=b"1-0", counter=1) == 1 + + async def accepted() -> None: + # Once the task that carried it completes, the counter is the + # run's and nothing is pending or scheduled any more. + [info] = (await handle.describe()).channel_subscriptions + assert info.last_counter == 1 + assert info.pending_notification is None + assert info.scheduled_counter == 0 + + await assert_eventually(accepted) + assert await client.notify_channel(channel, position=b"2-0", counter=2) == 1 + assert await asyncio.wait_for(handle.result(), 30) == 2 + # A closed run keeps listing what it stood on. + [info] = (await handle.describe()).channel_subscriptions + assert (info.kind, info.last_counter) == (ChannelKind.INDEPENDENT, 2) + finally: + await _stop(handle, worker, running) + + +@pytest.mark.needs_describe_server +async def test_a_description_lists_a_linked_channel_once_it_holds_state( + client: Client, +): + """The client side alone: no worker polls, so the run stays open until ended.""" + channel = f"orders-{uuid.uuid4()}" + handle = await client.start_workflow( + CountLinked.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=f"nobody-polls-{uuid.uuid4()}", + ) + try: + # An untouched linked name exists by construction and holds nothing, + # so it is not listed. + assert (await handle.describe()).channel_subscriptions == () + assert ( + await client.notify_channel( + channel, position=b"1-0", counter=1, workflow_id=handle.id + ) + == 1 + ) + [info] = (await handle.describe()).channel_subscriptions + assert (info.channel, info.kind) == (channel, ChannelKind.LINKED) + assert (info.subscribed_event_id, info.last_counter) == (0, 0) + assert (info.listener_count, info.retained_count, info.accepted_count) == ( + 0, + 1, + 1, + ) + # Nobody polls. The notification either rode the task the notify + # scheduled or waits behind the first task, which was scheduled + # without a counter when the run started. + pending = ( + info.pending_notification.counter if info.pending_notification else None + ) + assert (info.scheduled_counter, pending) in {(1, None), (0, 1)} + # A callback on the linked channel shows up in the owner's count. + callback = Callback(url="http://localhost:1/never-called", headers={}) + listener_id = await client.register_channel_listener( + channel, callback, workflow_id=handle.id + ) + [info] = (await handle.describe()).channel_subscriptions + assert info.listener_count == 1 + await client.unregister_channel_listener( + channel, listener_id, workflow_id=handle.id + ) + [info] = (await handle.describe()).channel_subscriptions + assert info.listener_count == 0 + finally: + with contextlib.suppress(RPCError): + await handle.terminate() + + +@pytest.mark.needs_unsubscribe_server +@pytest.mark.needs_unsubscribe_core +async def test_a_workflow_unsubscribes_and_a_later_notify_wakes_nothing( + client: Client, +): + channel = f"orders-{uuid.uuid4()}" + worker = new_worker(client, ReceiveThenUnsubscribe) + running = asyncio.create_task(worker.run()) + handle = await client.start_workflow( + ReceiveThenUnsubscribe.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=worker.task_queue, + ) + try: + subscribed_id = await assert_eventually( + lambda: _one_event(handle, _SUBSCRIBED), timeout=timedelta(seconds=30) + ) + assert await client.notify_channel(channel, position=b"1-0", counter=1) == 1 + unsubscribed_id = await assert_eventually( + lambda: _one_event(handle, _UNSUBSCRIBED), timeout=timedelta(seconds=30) + ) + assert unsubscribed_id > subscribed_id + # The event names the subscription it ended. + [event] = [ + event + async for event in handle.fetch_history_events() + if event.event_id == unsubscribed_id + ] + attrs = event.workflow_notification_channel_unsubscribed_event_attributes + assert (attrs.channel, attrs.subscribed_event_id) == (channel, subscribed_id) + # Gone from both sides: the channel's listeners and the run's standing. + description = await client.describe_channel(channel) + assert [listener.workflow_id for listener in description.listeners] == [] + assert (await handle.describe()).channel_subscriptions == () + # Nothing listens any more, so a notify wakes nobody and is only + # retained for pollers. + assert await client.notify_channel(channel, position=b"2-0", counter=2) == 0 + await handle.signal(ReceiveThenUnsubscribe.finish) + assert await asyncio.wait_for(handle.result(), 30) == { + "first": 1, + "closed": True, + "drained": [], + "refused": _CLOSED, + } + assert await _event_ids(handle, _SUBSCRIBED) == [subscribed_id] + assert await _event_ids(handle, _UNSUBSCRIBED) == [unsubscribed_id] + finally: + await _stop(handle, worker, running) From ce77f32d5f0a2cb800212733c5958c537550023d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:31:38 -0700 Subject: [PATCH 799/831] Pinned Core at the unsubscribe head and regenerated the clients. The delivery Core carries the unsubscribe command machine, so a workflow on this layer can end a subscription and replay through its event. --- temporalio/api/enums/v1/failed_cause_pb2.py | 31 +- temporalio/api/history/v1/message_pb2.py | 224 ++-- temporalio/api/workflow/v1/message_pb2.py | 72 +- .../v1/request_response_pb2.py | 1165 +++++++++-------- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 173 ++- .../workflow_commands_pb2.pyi | 141 +- temporalio/bridge/sdk-core | 2 +- 8 files changed, 993 insertions(+), 819 deletions(-) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index eb29a1449..1a3d4f93e 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,11 +16,13 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xec\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,\x12N\nJWORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10-*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xec\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,\x12N\nJWORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10-*\xf3\x01\n\x17\x41\x63tivityTaskFailedCause\x12*\n&ACTIVITY_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x31\n-ACTIVITY_TASK_FAILED_CAUSE_PAYLOADS_TOO_LARGE\x10\x01\x12\x37\n3ACTIVITY_TASK_FAILED_CAUSE_EXTERNAL_STORAGE_FAILURE\x10\x02\x12@\n\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x90\x01\n6WorkflowNotificationChannelUnsubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xf6\x43\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x12\x96\x01\n;workflow_notification_channel_unsubscribed_event_attributes\x18\x45 \x01(\x0b\x32O.temporal.api.history.v1.WorkflowNotificationChannelUnsubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xdd\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12=\n\x05\x63\x61use\x18\x07 \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x90\x01\n6WorkflowNotificationChannelUnsubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xf6\x43\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x12\x96\x01\n;workflow_notification_channel_unsubscribed_event_attributes\x18\x45 \x01(\x0b\x32O.temporal.api.history.v1.WorkflowNotificationChannelUnsubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -1309,119 +1309,119 @@ _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7663 _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7895 _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7898 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8184 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8187 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8385 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8387 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8501 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8504 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8778 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8781 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8928 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8930 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 9001 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 9004 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9138 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9141 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9340 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9343 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9478 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9481 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9842 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9762 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9842 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9845 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10164 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10167 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10296 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10299 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8247 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8250 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8448 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8450 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8564 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8567 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8841 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8844 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8991 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8993 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 9064 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 9067 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9201 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9204 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9403 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9406 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9541 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9544 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9905 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9825 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9905 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9908 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10227 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10230 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10359 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10362 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10583 + 10646 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10586 + 10649 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10932 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10935 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11132 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11135 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11514 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11517 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11856 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11859 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12070 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12073 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12231 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12234 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12372 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12375 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13651 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13654 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13996 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13999 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14294 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14297 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14622 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14625 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 15004 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 15007 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15332 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15335 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15665 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15668 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15944 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15947 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16677 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16527 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16677 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16680 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17000 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 17003 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17147 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17149 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17273 - _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17275 - _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17388 - _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17391 - _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17535 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17538 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17685 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17688 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17908 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17911 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 18081 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 18084 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18355 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18358 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18522 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18524 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18618 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18620 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18716 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18719 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18916 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18919 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19483 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19433 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19483 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19486 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19623 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19626 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19763 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19766 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19902 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19905 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 20043 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 20046 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20184 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20186 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20302 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20305 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20456 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20459 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20658 - _HISTORYEVENT._serialized_start = 20661 - _HISTORYEVENT._serialized_end = 29355 - _HISTORY._serialized_start = 29357 - _HISTORY._serialized_end = 29421 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10995 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10998 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11195 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11198 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11577 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11580 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11919 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11922 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12133 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12136 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12294 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12297 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12435 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12438 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13714 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13717 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14059 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 14062 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14357 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14360 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14685 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14688 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 15067 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 15070 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15395 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15398 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15728 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15731 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 16007 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 16010 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16740 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16590 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16740 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16743 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17063 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 17066 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17210 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17212 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17336 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17338 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17451 + _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17454 + _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17598 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17601 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17748 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17751 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17971 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17974 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 18144 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 18147 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18418 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18421 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18585 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18587 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18681 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18683 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18779 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18782 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18979 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18982 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19546 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19496 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19546 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19549 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19686 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19689 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19826 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19829 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19965 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19968 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 20106 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 20109 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20247 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20249 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20365 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20368 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20519 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20522 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20721 + _HISTORYEVENT._serialized_start = 20724 + _HISTORYEVENT._serialized_end = 29418 + _HISTORY._serialized_start = 29420 + _HISTORY._serialized_end = 29484 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index 3f6c7d950..89648e72c 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -51,7 +51,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xc3\x02\n\x17\x43hannelSubscriptionInfo\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03\x12\x14\n\x0clast_counter\x18\x04 \x01(\x03\x12H\n\x14pending_notification\x18\x05 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x19\n\x11scheduled_counter\x18\x06 \x01(\x03\x12\x16\n\x0elistener_count\x18\x07 \x01(\x05\x12\x16\n\x0eretained_count\x18\x08 \x01(\x05\x12\x16\n\x0e\x61\x63\x63\x65pted_count\x18\t \x01(\x03"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x96\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xc3\x02\n\x17\x43hannelSubscriptionInfo\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03\x12\x14\n\x0clast_counter\x18\x04 \x01(\x03\x12H\n\x14pending_notification\x18\x05 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x19\n\x11scheduled_counter\x18\x06 \x01(\x03\x12\x16\n\x0elistener_count\x18\x07 \x01(\x05\x12\x16\n\x0eretained_count\x18\x08 \x01(\x05\x12\x16\n\x0e\x61\x63\x63\x65pted_count\x18\t \x01(\x03"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -581,39 +581,39 @@ _NEWWORKFLOWEXECUTIONINFO._serialized_start = 6207 _NEWWORKFLOWEXECUTIONINFO._serialized_end = 7108 _CALLBACKINFO._serialized_start = 7111 - _CALLBACKINFO._serialized_end = 7881 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7585 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7601 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7603 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7656 - _CALLBACKINFO_TRIGGER._serialized_start = 7659 - _CALLBACKINFO_TRIGGER._serialized_end = 7881 - _PENDINGNEXUSOPERATIONINFO._serialized_start = 7884 - _PENDINGNEXUSOPERATIONINFO._serialized_end = 8663 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8666 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9054 - _CHANNELSUBSCRIPTIONINFO._serialized_start = 9057 - _CHANNELSUBSCRIPTIONINFO._serialized_end = 9380 - _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9383 - _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9610 - _VERSIONINGOVERRIDE._serialized_start = 9613 - _VERSIONINGOVERRIDE._serialized_end = 10375 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9978 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 10151 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 10153 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 10258 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 10260 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 10363 - _ONCONFLICTOPTIONS._serialized_start = 10377 - _ONCONFLICTOPTIONS._serialized_end = 10482 - _REQUESTIDINFO._serialized_start = 10484 - _REQUESTIDINFO._serialized_end = 10589 - _POSTRESETOPERATION._serialized_start = 10592 - _POSTRESETOPERATION._serialized_end = 11159 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10806 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10985 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10988 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 11148 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 11161 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 11272 + _CALLBACKINFO._serialized_end = 7901 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7605 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7621 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7623 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7676 + _CALLBACKINFO_TRIGGER._serialized_start = 7679 + _CALLBACKINFO_TRIGGER._serialized_end = 7901 + _PENDINGNEXUSOPERATIONINFO._serialized_start = 7904 + _PENDINGNEXUSOPERATIONINFO._serialized_end = 8683 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8686 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9074 + _CHANNELSUBSCRIPTIONINFO._serialized_start = 9077 + _CHANNELSUBSCRIPTIONINFO._serialized_end = 9400 + _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9403 + _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9630 + _VERSIONINGOVERRIDE._serialized_start = 9633 + _VERSIONINGOVERRIDE._serialized_end = 10395 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9998 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 10171 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 10173 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 10278 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 10280 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 10383 + _ONCONFLICTOPTIONS._serialized_start = 10397 + _ONCONFLICTOPTIONS._serialized_end = 10502 + _REQUESTIDINFO._serialized_start = 10504 + _REQUESTIDINFO._serialized_end = 10609 + _POSTRESETOPERATION._serialized_start = 10612 + _POSTRESETOPERATION._serialized_end = 11179 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10826 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 11005 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 11008 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 11168 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 11181 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 11292 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index aee2202bf..7318b0d99 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.nexusoperation.v1 import ( + message_pb2 as temporal_dot_api_dot_nexusoperation_dot_v1_dot_message__pb2, +) from temporalio.api.notification.v1 import ( message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, ) @@ -137,7 +140,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4348,598 +4351,598 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1728 - _REGISTERNAMESPACEREQUEST._serialized_end = 2376 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2333 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2376 - _REGISTERNAMESPACERESPONSE._serialized_start = 2378 - _REGISTERNAMESPACERESPONSE._serialized_end = 2405 - _LISTNAMESPACESREQUEST._serialized_start = 2408 - _LISTNAMESPACESREQUEST._serialized_end = 2545 - _LISTNAMESPACESRESPONSE._serialized_start = 2548 - _LISTNAMESPACESRESPONSE._serialized_end = 2677 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2679 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2762 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2765 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3278 - _UPDATENAMESPACEREQUEST._serialized_start = 3281 - _UPDATENAMESPACEREQUEST._serialized_end = 3616 - _UPDATENAMESPACERESPONSE._serialized_start = 3619 - _UPDATENAMESPACERESPONSE._serialized_end = 3910 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3912 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3982 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3984 - _DEPRECATENAMESPACERESPONSE._serialized_end = 4012 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4015 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5632 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5635 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5933 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5936 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6234 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6237 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6423 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6426 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6602 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6604 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6724 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8323 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8233 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8317 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8326 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9498 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9593 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9595 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9667 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9912 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9915 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10440 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10442 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10477 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10480 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10966 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10969 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12150 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12153 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12318 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12320 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12432 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12435 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12642 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12644 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12760 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12763 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13145 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13147 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13185 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13188 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13395 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13397 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13439 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13442 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13888 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13890 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13977 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13980 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14251 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14253 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14344 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14347 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14729 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14731 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14768 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14771 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15059 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15061 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15102 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15105 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15365 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15367 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15407 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15410 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15760 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 - _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16058 - _NOTIFYCHANNELRESPONSE._serialized_start = 16060 - _NOTIFYCHANNELRESPONSE._serialized_end = 16107 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16110 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16339 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16341 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16395 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16398 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16578 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16580 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16615 - _POLLCHANNELREQUEST._serialized_start = 16618 - _POLLCHANNELREQUEST._serialized_end = 16836 - _POLLCHANNELRESPONSE._serialized_start = 16838 - _POLLCHANNELRESPONSE._serialized_end = 16926 - _DESCRIBECHANNELREQUEST._serialized_start = 16929 - _DESCRIBECHANNELREQUEST._serialized_end = 17060 - _DESCRIBECHANNELRESPONSE._serialized_start = 17063 - _DESCRIBECHANNELRESPONSE._serialized_end = 17357 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17360 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18699 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18702 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18860 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18863 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19312 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19314 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19362 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19365 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19652 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19654 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19690 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19692 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19814 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19816 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19849 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19852 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20181 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20184 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20314 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20317 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20711 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20714 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20846 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20848 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20957 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20959 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21085 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21087 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21204 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21207 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21341 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21343 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21452 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21454 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21580 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21582 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21648 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21651 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21888 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21890 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21918 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21921 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22122 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22038 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22122 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22125 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22486 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22488 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22523 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22525 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22635 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22637 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22667 - _SHUTDOWNWORKERREQUEST._serialized_start = 22670 - _SHUTDOWNWORKERREQUEST._serialized_end = 22953 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22955 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22979 - _QUERYWORKFLOWREQUEST._serialized_start = 22982 - _QUERYWORKFLOWREQUEST._serialized_end = 23215 - _QUERYWORKFLOWRESPONSE._serialized_start = 23218 - _QUERYWORKFLOWRESPONSE._serialized_end = 23403 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24270 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24273 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24801 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24804 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25808 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25590 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25706 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25708 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25808 - _GETCLUSTERINFOREQUEST._serialized_start = 25810 - _GETCLUSTERINFOREQUEST._serialized_end = 25833 - _GETCLUSTERINFORESPONSE._serialized_start = 25836 - _GETCLUSTERINFORESPONSE._serialized_end = 26301 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26246 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26301 - _GETSYSTEMINFOREQUEST._serialized_start = 26303 - _GETSYSTEMINFOREQUEST._serialized_end = 26325 - _GETSYSTEMINFORESPONSE._serialized_start = 26328 - _GETSYSTEMINFORESPONSE._serialized_end = 26905 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26469 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26905 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26907 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27016 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27019 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27242 - _CREATESCHEDULEREQUEST._serialized_start = 27245 - _CREATESCHEDULEREQUEST._serialized_end = 27577 - _CREATESCHEDULERESPONSE._serialized_start = 27579 - _CREATESCHEDULERESPONSE._serialized_end = 27627 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27629 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27694 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27697 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27968 - _UPDATESCHEDULEREQUEST._serialized_start = 27971 - _UPDATESCHEDULEREQUEST._serialized_end = 28263 - _UPDATESCHEDULERESPONSE._serialized_start = 28265 - _UPDATESCHEDULERESPONSE._serialized_end = 28289 - _PATCHSCHEDULEREQUEST._serialized_start = 28292 - _PATCHSCHEDULEREQUEST._serialized_end = 28448 - _PATCHSCHEDULERESPONSE._serialized_start = 28450 - _PATCHSCHEDULERESPONSE._serialized_end = 28473 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28476 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28644 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28646 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28729 - _DELETESCHEDULEREQUEST._serialized_start = 28731 - _DELETESCHEDULEREQUEST._serialized_end = 28812 - _DELETESCHEDULERESPONSE._serialized_start = 28814 - _DELETESCHEDULERESPONSE._serialized_end = 28838 - _LISTSCHEDULESREQUEST._serialized_start = 28840 - _LISTSCHEDULESREQUEST._serialized_end = 28948 - _LISTSCHEDULESRESPONSE._serialized_start = 28950 - _LISTSCHEDULESRESPONSE._serialized_end = 29062 - _COUNTSCHEDULESREQUEST._serialized_start = 29064 - _COUNTSCHEDULESREQUEST._serialized_end = 29121 - _COUNTSCHEDULESRESPONSE._serialized_start = 29124 - _COUNTSCHEDULESRESPONSE._serialized_end = 29343 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29346 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29992 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29793 + _REGISTERNAMESPACEREQUEST._serialized_start = 1774 + _REGISTERNAMESPACEREQUEST._serialized_end = 2422 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2379 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2422 + _REGISTERNAMESPACERESPONSE._serialized_start = 2424 + _REGISTERNAMESPACERESPONSE._serialized_end = 2451 + _LISTNAMESPACESREQUEST._serialized_start = 2454 + _LISTNAMESPACESREQUEST._serialized_end = 2591 + _LISTNAMESPACESRESPONSE._serialized_start = 2594 + _LISTNAMESPACESRESPONSE._serialized_end = 2723 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2725 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2808 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2811 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3324 + _UPDATENAMESPACEREQUEST._serialized_start = 3327 + _UPDATENAMESPACEREQUEST._serialized_end = 3662 + _UPDATENAMESPACERESPONSE._serialized_start = 3665 + _UPDATENAMESPACERESPONSE._serialized_end = 3956 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3958 + _DEPRECATENAMESPACEREQUEST._serialized_end = 4028 + _DEPRECATENAMESPACERESPONSE._serialized_start = 4030 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4058 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4061 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5678 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5681 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5979 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5982 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6280 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6283 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6469 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6472 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6648 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6650 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6770 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6773 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7213 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7216 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8369 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8279 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8363 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8372 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9544 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9639 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9641 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9713 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9958 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9961 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10486 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10488 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10523 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10526 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11012 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11015 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12196 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12199 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12364 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12366 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12478 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12481 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12688 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12690 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12806 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12809 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13191 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13193 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13231 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13234 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13441 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13443 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13485 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13488 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13997 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13999 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14086 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14089 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14423 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14425 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14516 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14519 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14901 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14903 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14940 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14943 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15231 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15233 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15274 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15277 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15537 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15539 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15579 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15582 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15932 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15934 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 16011 + _NOTIFYCHANNELREQUEST._serialized_start = 16014 + _NOTIFYCHANNELREQUEST._serialized_end = 16230 + _NOTIFYCHANNELRESPONSE._serialized_start = 16232 + _NOTIFYCHANNELRESPONSE._serialized_end = 16279 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16282 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16511 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16513 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16567 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16570 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16750 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16752 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16787 + _POLLCHANNELREQUEST._serialized_start = 16790 + _POLLCHANNELREQUEST._serialized_end = 17008 + _POLLCHANNELRESPONSE._serialized_start = 17010 + _POLLCHANNELRESPONSE._serialized_end = 17098 + _DESCRIBECHANNELREQUEST._serialized_start = 17101 + _DESCRIBECHANNELREQUEST._serialized_end = 17232 + _DESCRIBECHANNELRESPONSE._serialized_start = 17235 + _DESCRIBECHANNELRESPONSE._serialized_end = 17529 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17532 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18871 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18874 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 19032 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 19035 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19484 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19486 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19534 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19537 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19824 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19826 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19862 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19864 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19986 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19988 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 20021 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 20024 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20353 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20356 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20486 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20489 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20883 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20886 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21018 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21020 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21129 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21131 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21257 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21259 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21376 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21379 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21513 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21515 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21624 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21626 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21752 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21754 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21820 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21823 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 22060 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 22062 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 22090 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 22093 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22294 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22210 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22294 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22297 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22658 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22660 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22695 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22697 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22807 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22809 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22839 + _SHUTDOWNWORKERREQUEST._serialized_start = 22842 + _SHUTDOWNWORKERREQUEST._serialized_end = 23125 + _SHUTDOWNWORKERRESPONSE._serialized_start = 23127 + _SHUTDOWNWORKERRESPONSE._serialized_end = 23151 + _QUERYWORKFLOWREQUEST._serialized_start = 23154 + _QUERYWORKFLOWREQUEST._serialized_end = 23387 + _QUERYWORKFLOWRESPONSE._serialized_start = 23390 + _QUERYWORKFLOWRESPONSE._serialized_end = 23575 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23577 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23692 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23695 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24442 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24445 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24973 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24976 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25980 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25660 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25760 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25762 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25878 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25880 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25980 + _GETCLUSTERINFOREQUEST._serialized_start = 25982 + _GETCLUSTERINFOREQUEST._serialized_end = 26005 + _GETCLUSTERINFORESPONSE._serialized_start = 26008 + _GETCLUSTERINFORESPONSE._serialized_end = 26473 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26418 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26473 + _GETSYSTEMINFOREQUEST._serialized_start = 26475 + _GETSYSTEMINFOREQUEST._serialized_end = 26497 + _GETSYSTEMINFORESPONSE._serialized_start = 26500 + _GETSYSTEMINFORESPONSE._serialized_end = 27077 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26641 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 27077 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 27079 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27188 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27191 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27414 + _CREATESCHEDULEREQUEST._serialized_start = 27417 + _CREATESCHEDULEREQUEST._serialized_end = 27749 + _CREATESCHEDULERESPONSE._serialized_start = 27751 + _CREATESCHEDULERESPONSE._serialized_end = 27799 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27801 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27866 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27869 + _DESCRIBESCHEDULERESPONSE._serialized_end = 28140 + _UPDATESCHEDULEREQUEST._serialized_start = 28143 + _UPDATESCHEDULEREQUEST._serialized_end = 28435 + _UPDATESCHEDULERESPONSE._serialized_start = 28437 + _UPDATESCHEDULERESPONSE._serialized_end = 28461 + _PATCHSCHEDULEREQUEST._serialized_start = 28464 + _PATCHSCHEDULEREQUEST._serialized_end = 28620 + _PATCHSCHEDULERESPONSE._serialized_start = 28622 + _PATCHSCHEDULERESPONSE._serialized_end = 28645 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28648 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28816 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28818 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28901 + _DELETESCHEDULEREQUEST._serialized_start = 28903 + _DELETESCHEDULEREQUEST._serialized_end = 28984 + _DELETESCHEDULERESPONSE._serialized_start = 28986 + _DELETESCHEDULERESPONSE._serialized_end = 29010 + _LISTSCHEDULESREQUEST._serialized_start = 29012 + _LISTSCHEDULESREQUEST._serialized_end = 29120 + _LISTSCHEDULESRESPONSE._serialized_start = 29122 + _LISTSCHEDULESRESPONSE._serialized_end = 29234 + _COUNTSCHEDULESREQUEST._serialized_start = 29236 + _COUNTSCHEDULESREQUEST._serialized_end = 29293 + _COUNTSCHEDULESRESPONSE._serialized_start = 29296 + _COUNTSCHEDULESRESPONSE._serialized_end = 29515 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29518 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30164 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29965 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29904 + 30076 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29906 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29979 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29994 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30058 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30060 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30155 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30157 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30273 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30276 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31993 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31328 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 30078 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30151 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30166 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30230 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30232 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30327 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30329 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30445 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30448 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32165 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31500 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31441 + 31613 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31444 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31616 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31573 + 31745 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31575 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31747 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31639 + 31811 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31641 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31747 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31749 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31859 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31861 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31923 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31925 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31980 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31996 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32248 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32250 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32322 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32325 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32574 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32577 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32733 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32735 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32849 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32852 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33113 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33116 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33375 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33378 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34744 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34746 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34775 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34777 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34873 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34875 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34903 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34905 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34971 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34974 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35446 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35448 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35539 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35541 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35662 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35665 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35850 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35853 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36072 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36075 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36491 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36494 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36848 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36851 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37018 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37020 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37055 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37058 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37278 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37280 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37312 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37315 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37687 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37481 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37687 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37690 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38022 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37816 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38022 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38025 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38361 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38364 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38683 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38685 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38785 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38787 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38896 - _PAUSEACTIVITYREQUEST._serialized_start = 38899 - _PAUSEACTIVITYREQUEST._serialized_end = 39098 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39101 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39284 - _PAUSEACTIVITYRESPONSE._serialized_start = 39286 - _PAUSEACTIVITYRESPONSE._serialized_end = 39309 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39311 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39343 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39346 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39626 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39629 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39902 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39904 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39929 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39931 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39965 - _RESETACTIVITYREQUEST._serialized_start = 39968 - _RESETACTIVITYREQUEST._serialized_end = 40275 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40278 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40568 - _RESETACTIVITYRESPONSE._serialized_start = 40570 - _RESETACTIVITYRESPONSE._serialized_end = 40593 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40595 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40627 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40630 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40914 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40917 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41094 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41096 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41202 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41204 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41301 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41304 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41498 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41501 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42153 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41762 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42153 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42155 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42232 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42235 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42375 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42377 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42485 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42487 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42606 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42609 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42814 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42817 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43002 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43005 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43234 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43237 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43428 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43431 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43907 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43909 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44022 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44024 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44080 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44082 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44175 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44178 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44849 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44353 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44849 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44852 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45092 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45094 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45133 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45136 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45336 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45338 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45377 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45379 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45472 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45474 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45506 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45509 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46025 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46027 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46079 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46082 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46582 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46584 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46638 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46641 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47059 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46974 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31813 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31919 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31921 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 32031 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 32033 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 32095 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 32097 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32152 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32168 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32420 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32422 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32494 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32497 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32746 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32749 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32905 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32907 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 33021 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 33024 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33285 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33288 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33547 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33550 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34916 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34918 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34947 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34949 + _STOPBATCHOPERATIONREQUEST._serialized_end = 35045 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 35047 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 35075 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 35077 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35143 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35146 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35618 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35620 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35711 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35713 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35834 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35837 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 36022 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 36025 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36244 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36247 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36663 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36666 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 37020 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 37023 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37190 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37192 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37227 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37230 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37450 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37452 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37484 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37487 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37859 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37653 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37859 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37862 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38194 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37988 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38194 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38197 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38533 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38536 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38855 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38857 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38957 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38959 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 39068 + _PAUSEACTIVITYREQUEST._serialized_start = 39071 + _PAUSEACTIVITYREQUEST._serialized_end = 39270 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39273 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39456 + _PAUSEACTIVITYRESPONSE._serialized_start = 39458 + _PAUSEACTIVITYRESPONSE._serialized_end = 39481 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39483 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39515 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39518 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39798 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39801 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 40074 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 40076 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 40101 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 40103 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40137 + _RESETACTIVITYREQUEST._serialized_start = 40140 + _RESETACTIVITYREQUEST._serialized_end = 40447 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40450 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40740 + _RESETACTIVITYRESPONSE._serialized_start = 40742 + _RESETACTIVITYRESPONSE._serialized_end = 40765 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40767 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40799 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40802 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 41086 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 41089 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41266 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41268 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41374 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41376 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41473 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41476 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41670 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41673 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42325 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41934 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42325 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25660 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25760 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42327 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42404 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42407 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42547 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42549 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42657 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42659 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42778 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42781 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42986 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42989 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43174 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43177 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43406 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43409 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43600 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43603 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43852 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43855 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 44079 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 44081 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44194 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44196 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44252 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44254 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44347 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44350 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 45021 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44525 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 45021 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45024 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45264 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45266 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45305 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45308 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45508 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45510 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45549 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45551 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45644 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45646 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45678 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45681 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46197 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 46074 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46197 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46199 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46251 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46254 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46754 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 46074 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46197 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46756 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46810 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46813 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47231 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47146 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 47059 + 47231 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47061 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47171 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47174 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47363 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47365 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47464 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47466 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47535 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47537 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47644 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47646 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47759 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47762 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47989 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47992 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48172 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48174 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48269 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48271 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48336 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48338 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48419 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48421 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48484 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48486 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48514 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48516 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48586 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48588 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48692 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48695 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48901 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48903 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48949 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48952 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49107 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49109 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49140 - _LISTWORKERSREQUEST._serialized_start = 49143 - _LISTWORKERSREQUEST._serialized_end = 49273 - _LISTWORKERSRESPONSE._serialized_start = 49276 - _LISTWORKERSRESPONSE._serialized_end = 49441 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49444 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50169 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50011 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50102 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47233 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47343 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47346 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47535 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47537 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47636 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47638 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47707 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47709 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47816 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47818 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47931 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47934 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48161 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 48164 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48344 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48346 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48441 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48443 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48508 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48510 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48591 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48593 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48656 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48658 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48686 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48688 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48758 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48760 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48864 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48867 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 49073 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 49075 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 49121 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 49124 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49279 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49281 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49312 + _LISTWORKERSREQUEST._serialized_start = 49315 + _LISTWORKERSREQUEST._serialized_end = 49445 + _LISTWORKERSRESPONSE._serialized_start = 49448 + _LISTWORKERSRESPONSE._serialized_end = 49613 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49616 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50341 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50183 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50274 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50104 + 50276 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50169 + 50341 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50171 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50262 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50265 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50423 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50425 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50510 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50513 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50779 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50781 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50881 - _DESCRIBEWORKERREQUEST._serialized_start = 50883 - _DESCRIBEWORKERREQUEST._serialized_end = 50954 - _DESCRIBEWORKERRESPONSE._serialized_start = 50956 - _DESCRIBEWORKERRESPONSE._serialized_end = 51037 - _COUNTWORKERSREQUEST._serialized_start = 51039 - _COUNTWORKERSREQUEST._serialized_end = 51126 - _COUNTWORKERSRESPONSE._serialized_start = 51128 - _COUNTWORKERSRESPONSE._serialized_end = 51165 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51168 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51309 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51311 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51343 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51346 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51489 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51491 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51525 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51528 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52705 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52707 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52816 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52819 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53047 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53050 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53366 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53368 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53454 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53456 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53572 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53574 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53683 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53686 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53816 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53819 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54668 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54618 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54668 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54670 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54741 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54744 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54914 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54917 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55228 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55231 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55392 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55395 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55656 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55658 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55773 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55776 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55915 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55917 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55983 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55986 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56223 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56225 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56297 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56300 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56552 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56701 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56703 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56743 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56746 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56891 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56893 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56929 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56931 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57019 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57021 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57054 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57057 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57213 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57215 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57261 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57264 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57416 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57418 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57460 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57462 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57557 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57559 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57598 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57601 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57758 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57761 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57993 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50343 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50434 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50437 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50595 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50597 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50682 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50685 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50951 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50953 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 51053 + _DESCRIBEWORKERREQUEST._serialized_start = 51055 + _DESCRIBEWORKERREQUEST._serialized_end = 51126 + _DESCRIBEWORKERRESPONSE._serialized_start = 51128 + _DESCRIBEWORKERRESPONSE._serialized_end = 51209 + _COUNTWORKERSREQUEST._serialized_start = 51211 + _COUNTWORKERSREQUEST._serialized_end = 51298 + _COUNTWORKERSRESPONSE._serialized_start = 51300 + _COUNTWORKERSRESPONSE._serialized_end = 51337 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51340 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51481 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51483 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51515 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51518 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51661 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51663 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51697 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51700 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52877 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52879 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52988 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52991 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53219 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53222 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53538 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53540 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53626 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53628 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53744 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53746 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53855 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53858 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53988 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53991 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55029 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54979 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 55029 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55031 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55102 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55105 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55275 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55278 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55665 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55668 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55829 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55832 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56093 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56095 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56210 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56213 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56352 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 56354 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56420 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56423 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56660 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56662 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56734 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56737 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56986 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56989 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 57138 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 57140 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 57180 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 57183 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 57328 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 57330 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 57366 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 57368 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57456 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57458 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57491 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57494 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57650 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57652 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57698 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57701 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57853 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57855 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57897 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57899 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57994 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57996 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 58035 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 58038 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 58195 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 58198 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58430 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index d73537054..2165995b1 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AppendStreamRecords, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -22,6 +23,7 @@ StartChildWorkflowExecution, StartTimer, SubscribeNotificationChannel, + SubscribeStream, UnsubscribeNotificationChannel, UpdateResponse, UpsertWorkflowSearchAttributes, @@ -30,6 +32,7 @@ __all__ = [ "ActivityCancellationType", + "AppendStreamRecords", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -52,6 +55,7 @@ "StartChildWorkflowExecution", "StartTimer", "SubscribeNotificationChannel", + "SubscribeStream", "UnsubscribeNotificationChannel", "UpdateResponse", "UpsertWorkflowSearchAttributes", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index d989b014f..9043484d4 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -34,6 +34,9 @@ from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.bridge.proto.child_workflow import ( child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, ) @@ -45,7 +48,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\xf3\x11\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x12\x65\n unsubscribe_notification_channel\x18 \x01(\x0b\x32\x39.coresdk.workflow_commands.UnsubscribeNotificationChannelH\x00\x42\t\n\x07variant"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"1\n\x1eUnsubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x95\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12%\n\x1dinclude_arguments_into_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto"\x8c\x13\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x12\x65\n unsubscribe_notification_channel\x18 \x01(\x0b\x32\x39.coresdk.workflow_commands.UnsubscribeNotificationChannelH\x00\x42\t\n\x07variant"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x87\x01\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"1\n\x1eUnsubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x93\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12#\n\x1binclude_arguments_in_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -56,6 +59,8 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _SUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ "SubscribeNotificationChannel" ] @@ -136,6 +141,28 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +AppendStreamRecords = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecords", + (_message.Message,), + { + "DESCRIPTOR": _APPENDSTREAMRECORDS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AppendStreamRecords) + }, +) +_sym_db.RegisterMessage(AppendStreamRecords) + +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) +_sym_db.RegisterMessage(SubscribeStream) + SubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( "SubscribeNotificationChannel", (_message.Message,), @@ -512,74 +539,78 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 8974 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 9062 - _WORKFLOWCOMMAND._serialized_start = 518 - _WORKFLOWCOMMAND._serialized_end = 2809 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 2811 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 2858 - _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 2860 - _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 2909 - _STARTTIMER._serialized_start = 2911 - _STARTTIMER._serialized_end = 2994 - _CANCELTIMER._serialized_start = 2996 - _CANCELTIMER._serialized_end = 3022 - _SCHEDULEACTIVITY._serialized_start = 3025 - _SCHEDULEACTIVITY._serialized_end = 3849 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 3770 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 3849 - _SCHEDULELOCALACTIVITY._serialized_start = 3852 - _SCHEDULELOCALACTIVITY._serialized_end = 4641 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 3770 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 3849 - _REQUESTCANCELACTIVITY._serialized_start = 4643 - _REQUESTCANCELACTIVITY._serialized_end = 4679 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 4681 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 4722 - _QUERYRESULT._serialized_start = 4725 - _QUERYRESULT._serialized_end = 4881 - _QUERYSUCCESS._serialized_start = 4883 - _QUERYSUCCESS._serialized_end = 4948 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 4950 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 5026 - _FAILWORKFLOWEXECUTION._serialized_start = 5028 - _FAILWORKFLOWEXECUTION._serialized_end = 5102 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5105 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6019 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5862 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5938 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3770 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3849 - _CANCELWORKFLOWEXECUTION._serialized_start = 6021 - _CANCELWORKFLOWEXECUTION._serialized_end = 6097 - _SETPATCHMARKER._serialized_start = 6099 - _SETPATCHMARKER._serialized_end = 6153 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6156 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7330 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3770 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3849 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 5862 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 5938 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7332 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7406 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7409 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7551 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7554 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 7953 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 3770 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 3849 - _CANCELSIGNALWORKFLOW._serialized_start = 7955 - _CANCELSIGNALWORKFLOW._serialized_end = 7990 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 7992 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8093 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 8095 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 8174 - _UPDATERESPONSE._serialized_start = 8177 - _UPDATERESPONSE._serialized_end = 8387 - _SCHEDULENEXUSOPERATION._serialized_start = 8390 - _SCHEDULENEXUSOPERATION._serialized_end = 8928 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 8878 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 8928 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 8930 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 8972 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 9400 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 9488 + _WORKFLOWCOMMAND._serialized_start = 556 + _WORKFLOWCOMMAND._serialized_end = 3000 + _APPENDSTREAMRECORDS._serialized_start = 3002 + _APPENDSTREAMRECORDS._serialized_end = 3099 + _SUBSCRIBESTREAM._serialized_start = 3102 + _SUBSCRIBESTREAM._serialized_end = 3237 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3239 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3286 + _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3288 + _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3337 + _STARTTIMER._serialized_start = 3339 + _STARTTIMER._serialized_end = 3422 + _CANCELTIMER._serialized_start = 3424 + _CANCELTIMER._serialized_end = 3450 + _SCHEDULEACTIVITY._serialized_start = 3453 + _SCHEDULEACTIVITY._serialized_end = 4277 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 4198 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 4277 + _SCHEDULELOCALACTIVITY._serialized_start = 4280 + _SCHEDULELOCALACTIVITY._serialized_end = 5067 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 4198 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 4277 + _REQUESTCANCELACTIVITY._serialized_start = 5069 + _REQUESTCANCELACTIVITY._serialized_end = 5105 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 5107 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 5148 + _QUERYRESULT._serialized_start = 5151 + _QUERYRESULT._serialized_end = 5307 + _QUERYSUCCESS._serialized_start = 5309 + _QUERYSUCCESS._serialized_end = 5374 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 5376 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 5452 + _FAILWORKFLOWEXECUTION._serialized_start = 5454 + _FAILWORKFLOWEXECUTION._serialized_end = 5528 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 5531 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 6445 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 6288 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 6364 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4198 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4277 + _CANCELWORKFLOWEXECUTION._serialized_start = 6447 + _CANCELWORKFLOWEXECUTION._serialized_end = 6523 + _SETPATCHMARKER._serialized_start = 6525 + _SETPATCHMARKER._serialized_end = 6579 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 6582 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 7756 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4198 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4277 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 6288 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 6364 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 7758 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 7832 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 7835 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 7977 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 7980 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 8379 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 4198 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 4277 + _CANCELSIGNALWORKFLOW._serialized_start = 8381 + _CANCELSIGNALWORKFLOW._serialized_end = 8416 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 8418 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 8519 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 8521 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 8600 + _UPDATERESPONSE._serialized_start = 8603 + _UPDATERESPONSE._serialized_end = 8813 + _SCHEDULENEXUSOPERATION._serialized_start = 8816 + _SCHEDULENEXUSOPERATION._serialized_end = 9354 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 9304 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 9354 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 9356 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 9398 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index f351a96db..aac056535 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -25,6 +25,7 @@ import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.nexus.nexus_pb2 @@ -103,6 +104,8 @@ class WorkflowCommand(google.protobuf.message.Message): UPDATE_RESPONSE_FIELD_NUMBER: builtins.int SCHEDULE_NEXUS_OPERATION_FIELD_NUMBER: builtins.int REQUEST_CANCEL_NEXUS_OPERATION_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int SUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int UNSUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int @property @@ -180,8 +183,17 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___RequestCancelNexusOperation: ... @property - def subscribe_notification_channel(self) -> global___SubscribeNotificationChannel: - """23 to 30 are taken by the stream commands, which share this message.""" + def subscribe_stream(self) -> global___SubscribeStream: + """23 to 28 are taken by the external stream commands, which are developed + alongside these and share this message. The two numbers below are fixed + with that family and must not be reused. + """ + @property + def append_stream_records(self) -> global___AppendStreamRecords: ... + @property + def subscribe_notification_channel( + self, + ) -> global___SubscribeNotificationChannel: ... @property def unsubscribe_notification_channel( self, @@ -224,6 +236,8 @@ class WorkflowCommand(google.protobuf.message.Message): schedule_nexus_operation: global___ScheduleNexusOperation | None = ..., request_cancel_nexus_operation: global___RequestCancelNexusOperation | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + append_stream_records: global___AppendStreamRecords | None = ..., subscribe_notification_channel: global___SubscribeNotificationChannel | None = ..., unsubscribe_notification_channel: global___UnsubscribeNotificationChannel @@ -232,6 +246,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -274,6 +290,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "subscribe_stream", + b"subscribe_stream", "unsubscribe_notification_channel", b"unsubscribe_notification_channel", "update_response", @@ -289,6 +307,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -333,6 +353,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "subscribe_stream", + b"subscribe_stream", "unsubscribe_notification_channel", b"unsubscribe_notification_channel", "update_response", @@ -371,6 +393,8 @@ class WorkflowCommand(google.protobuf.message.Message): "update_response", "schedule_nexus_operation", "request_cancel_nexus_operation", + "subscribe_stream", + "append_stream_records", "subscribe_notification_channel", "unsubscribe_notification_channel", ] @@ -379,6 +403,109 @@ class WorkflowCommand(google.protobuf.message.Message): global___WorkflowCommand = WorkflowCommand +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand records cost the same in History as one. The server + stores each record with an empty producer id, because the workflow is the + producer here. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_NAME_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_name: builtins.str + """Name of a stream this workflow owns, scoped to the workflow. Created on + first use. Empty means the workflow's default output stream. A workflow + cannot append to a stream in another execution, so this is never the id + of a standalone stream. + """ + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: ... + def __init__( + self, + *, + stream_name: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "records", b"records", "stream_name", b"stream_name" + ], + ) -> None: ... + +global___AppendStreamRecords = AppendStreamRecords + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_NAME_OR_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + START_POSITION_FIELD_NUMBER: builtins.int + stream_name_or_id: builtins.str + """Stream to consume, named either way round: a stream this workflow owns + by the name it appends under, a stream in another execution by its id. + The server tries them in that order, so a workflow that owns a stream + under this name cannot reach a standalone stream with the same id. When + neither exists the workflow gets a stream of its own by that name, which + is how a reader subscribes before the first record is written. + """ + start_offset: builtins.int + """Where to start, as an absolute offset. Read only when start_position is + unset. The server refuses a negative value. + """ + @property + def start_position( + self, + ) -> temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """Where to start: an offset, the earliest record held, the tail, or the + last N records. The server resolves it and records the resulting offset, + so replay does not resolve it again and Core does not keep it. + """ + def __init__( + self, + *, + stream_name_or_id: builtins.str = ..., + start_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["start_position", b"start_position"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "start_position", + b"start_position", + "stream_name_or_id", + b"stream_name_or_id", + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class SubscribeNotificationChannel(google.protobuf.message.Message): """Subscribe this workflow to a notification channel, so the scheduled event of each later Workflow Task carries the notifications folded for it. @@ -691,7 +818,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): RETRY_POLICY_FIELD_NUMBER: builtins.int LOCAL_RETRY_THRESHOLD_FIELD_NUMBER: builtins.int CANCELLATION_TYPE_FIELD_NUMBER: builtins.int - INCLUDE_ARGUMENTS_INTO_MARKER_FIELD_NUMBER: builtins.int + INCLUDE_ARGUMENTS_IN_MARKER_FIELD_NUMBER: builtins.int seq: builtins.int """Lang's incremental sequence number, used as the operation identifier""" activity_id: builtins.str @@ -756,7 +883,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): confirmed. Lang should default this to `WAIT_CANCELLATION_COMPLETED`, even though proto will default to `TRY_CANCEL` automatically. """ - include_arguments_into_marker: builtins.bool + include_arguments_in_marker: builtins.bool """If set, the local activity arguments will be included in the resulting marker under the `input` key. This is disabled by default to avoid increasing history size unless the lang SDK explicitly chooses to expose it. @@ -783,7 +910,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., local_retry_threshold: google.protobuf.duration_pb2.Duration | None = ..., cancellation_type: global___ActivityCancellationType.ValueType = ..., - include_arguments_into_marker: builtins.bool = ..., + include_arguments_in_marker: builtins.bool = ..., ) -> None: ... def HasField( self, @@ -817,8 +944,8 @@ class ScheduleLocalActivity(google.protobuf.message.Message): b"cancellation_type", "headers", b"headers", - "include_arguments_into_marker", - b"include_arguments_into_marker", + "include_arguments_in_marker", + b"include_arguments_in_marker", "local_retry_threshold", b"local_retry_threshold", "original_schedule_time", diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index acd30916e..7661e3a5c 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit acd30916e56c10d0dd47e6774a26cb0e9532aaee +Subproject commit 7661e3a5cb297043c6aef15c54b0e4eb1a1b2bc8 From 4fcf9aac94053e77c5614833bd1a0a0e9ef4bed0 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:31:38 -0700 Subject: [PATCH 800/831] Flipped the unsubscribe skip on the delivery Core pin. --- tests/streams/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index f0e6920c7..f3b7f04ee 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -16,7 +16,7 @@ # The unsubscribe is a command like the subscribe, refused by the protos-only # pin and matched against its event by the delivery pin. -PINNED_CORE_HANDLES_UNSUBSCRIBE = False +PINNED_CORE_HANDLES_UNSUBSCRIBE = True def pytest_configure(config: pytest.Config) -> None: From f235b47d4c9dd93d59313f8701200bb39ff56620 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:35:31 -0700 Subject: [PATCH 801/831] Followed a native stream through its channel on a live server. The two cases poll the channel stream_channel derives, one standalone and one owned by a workflow, and register a callback on the derived name. They need a server on which streams drive channels and skip otherwise. --- tests/streams/test_stream_channel_e2e.py | 182 +++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 tests/streams/test_stream_channel_e2e.py diff --git a/tests/streams/test_stream_channel_e2e.py b/tests/streams/test_stream_channel_e2e.py new file mode 100644 index 000000000..e2013c49f --- /dev/null +++ b/tests/streams/test_stream_channel_e2e.py @@ -0,0 +1,182 @@ +"""A native stream notifies the channel named by the stream, on a live server. + +Every append and the close of a native stream notify the channel +:func:`temporalio.client.stream_channel` derives from the stream's ref, so a +client follows a stream the way it follows an external one: by polling the +channel or registering a callback on it. The workflow's own consumption of a +stream is untouched by this and is covered elsewhere. Needs a server on which +streams drive channels, named with ``-E host:port``; skipped otherwise. +""" + +from __future__ import annotations + +import asyncio +import contextlib +import uuid +from datetime import timedelta +from typing import Any + +import pytest + +from temporalio import workflow +from temporalio.client import ( + Callback, + ChannelAddress, + ChannelKind, + Client, + stream_channel, +) +from temporalio.service import RPCError +from temporalio.streams import StreamRef, topic +from temporalio.streams.providers.native import NativeStreams +from tests.helpers import assert_eventually, new_worker + +OUT = topic("out", dict) + +pytestmark = pytest.mark.needs_stream_channel_server + + +async def _native(client: Client, provider: NativeStreams) -> Client: + """A client on the same server as ``client`` with the native provider on it.""" + return await Client.connect( + client.service_client.config.target_host, + namespace=client.namespace, + plugins=[provider], + ) + + +def _closed(client: Client, notification: Any) -> bool: + if "closed" not in notification.metadata: + return False + return client.data_converter.payload_converter.from_payload( + notification.metadata["closed"], bool + ) + + +async def test_a_standalone_stream_notifies_the_channel_named_by_its_id( + client: Client, +): + provider = NativeStreams() + native = await _native(client, provider) + stream_id = f"chan-{uuid.uuid4().hex[:8]}" + try: + created = await native.create_stream(stream_id) + address = stream_channel(created.ref(topic=OUT)) + # A standalone stream's topics share one stream, so the topic is not in + # the name and the channel is an independent one. + assert address == ChannelAddress(f"stream/{stream_id}", None) + producer = created.producer(topic=OUT, producer_id="writer", attempt=1) + await producer.append({"n": 1}) + await producer.append({"n": 2}) + + async def two_changes() -> list[Any]: + # A standalone stream reaches its channel through a task of its + # own, so the notifications may trail the appends. + polled = await native.poll_channel(address.channel, wait=False) + assert [n.counter for n in polled] == [1, 2] + return polled + + polled = await assert_eventually(two_changes) + for notification in polled: + assert notification.channel == address.channel + assert notification.linked_to is None + # The position is the head after the change, as a native cursor + # names one: the stream id in place of a run, then the offset. + assert notification.position.decode().startswith(f"{stream_id}:") + assert not _closed(native, notification) + await created.close() + [third] = await native.poll_channel( + address.channel, after_counter=2, wait=timedelta(seconds=10) + ) + assert third.counter == 3 + assert _closed(native, third) + description = await native.describe_channel(address.channel) + assert description.kind == ChannelKind.INDEPENDENT + assert description.latest is not None and description.latest.counter == 3 + assert description.retained_count == 3 + # A callback registers on the derived name like on any channel. + callback = Callback(url="http://localhost:1/never-called", headers={}) + listener_id = await native.register_channel_listener(address.channel, callback) + description = await native.describe_channel(address.channel) + assert [listener.callback for listener in description.listeners] == [callback] + await native.unregister_channel_listener(address.channel, listener_id) + finally: + await provider.close() + + +@workflow.defn +class WriteOnNudge: + """Writes one record at the start and one more per nudge, until ``rounds``.""" + + def __init__(self) -> None: + self._nudges = 0 + self._written = 0 + + @workflow.run + async def run(self, rounds: int) -> int: + writer = workflow.stream_writer(OUT) + writer.publish({"n": 0}) + while self._written < rounds: + await workflow.wait_condition(lambda: self._nudges > self._written) + self._written += 1 + writer.publish({"n": self._written}) + return self._written + + @workflow.signal + def nudge(self) -> None: + self._nudges += 1 + + +async def test_a_workflow_stream_notifies_the_channel_linked_to_its_owner( + client: Client, +): + provider = NativeStreams() + native = await _native(client, provider) + worker = new_worker(native, WriteOnNudge) + running = asyncio.create_task(worker.run()) + # More rounds than nudges: the linked ring dies with the run, so the run + # stays open until the test has read it and is ended by hand. + handle = await native.start_workflow( + WriteOnNudge.run, 10, id=f"wf-{uuid.uuid4()}", task_queue=worker.task_queue + ) + try: + address = stream_channel(StreamRef.for_workflow(handle.id, topic=OUT)) + assert address == ChannelAddress("stream/out", handle.id) + assert address == stream_channel( + native.get_stream_handle(handle.id).ref(topic=OUT) + ) + + async def changes(count: int) -> list[Any]: + polled = await native.poll_channel( + address.channel, workflow_id=address.workflow_id, wait=False + ) + assert [n.counter for n in polled] == list(range(1, count + 1)) + return polled + + # The first task's publish is one append, so one notification. + await assert_eventually(lambda: changes(1), timeout=timedelta(seconds=30)) + await handle.signal(WriteOnNudge.nudge) + await assert_eventually(lambda: changes(2), timeout=timedelta(seconds=30)) + await handle.signal(WriteOnNudge.nudge) + polled = await assert_eventually( + lambda: changes(3), timeout=timedelta(seconds=30) + ) + run_id = handle.first_execution_run_id + for notification in polled: + assert notification.linked_to is not None + assert notification.linked_to.workflow_id == handle.id + assert notification.position.decode().startswith(f"{run_id}:") + description = await native.describe_channel( + address.channel, workflow_id=address.workflow_id + ) + assert description.kind == ChannelKind.LINKED + assert description.latest is not None and description.latest.counter == 3 + finally: + with contextlib.suppress(RPCError): + await handle.terminate() + try: + await asyncio.wait_for(worker.shutdown(), 15) + except asyncio.TimeoutError: + running.cancel() + await asyncio.gather(running, return_exceptions=True) + await provider.close() From 1f7cee0cab82e611db6f2d8f1f6fb0fed4c910a7 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:43:18 -0700 Subject: [PATCH 802/831] Waited for each standalone append's notification before the next. A standalone stream hands its channel the latest change through one outstanding task, so a burst of appends arrives as its newest change. The case now observes every change rather than a fold. --- tests/streams/test_stream_channel_e2e.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/streams/test_stream_channel_e2e.py b/tests/streams/test_stream_channel_e2e.py index e2013c49f..e698db6a1 100644 --- a/tests/streams/test_stream_channel_e2e.py +++ b/tests/streams/test_stream_channel_e2e.py @@ -66,17 +66,20 @@ async def test_a_standalone_stream_notifies_the_channel_named_by_its_id( # the name and the channel is an independent one. assert address == ChannelAddress(f"stream/{stream_id}", None) producer = created.producer(topic=OUT, producer_id="writer", attempt=1) - await producer.append({"n": 1}) - await producer.append({"n": 2}) - async def two_changes() -> list[Any]: - # A standalone stream reaches its channel through a task of its - # own, so the notifications may trail the appends. + async def changes(count: int) -> list[Any]: polled = await native.poll_channel(address.channel, wait=False) - assert [n.counter for n in polled] == [1, 2] + assert [n.counter for n in polled] == list(range(1, count + 1)) return polled - polled = await assert_eventually(two_changes) + # A standalone stream reaches its channel through a task of its own + # that hands over the latest change, so the notifications trail the + # appends and a burst arrives as its newest change. Each append waits + # for its notification so that every change is seen. + await producer.append({"n": 1}) + await assert_eventually(lambda: changes(1)) + await producer.append({"n": 2}) + polled = await assert_eventually(lambda: changes(2)) for notification in polled: assert notification.channel == address.channel assert notification.linked_to is None From b4e41f23183a22859f663571eedf8a4b93de039a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:44:08 -0700 Subject: [PATCH 803/831] Pinned the linked channel's describe fields to the server's timing. The owner's state takes a notification in the write that accepts it, so the counter is the run's at once, and with the first task already scheduled the notification waits behind it as the pending entry. A closed run keeps its listing. --- tests/streams/test_channels.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index 3a3ac88ee..c41ac75dc 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -1114,19 +1114,21 @@ async def test_a_description_lists_a_linked_channel_once_it_holds_state( ) [info] = (await handle.describe()).channel_subscriptions assert (info.channel, info.kind) == (channel, ChannelKind.LINKED) - assert (info.subscribed_event_id, info.last_counter) == (0, 0) + # The owner's state took the notification in the write that accepted + # it, so the counter is the run's at once. Nobody polls, and the first + # task was scheduled without a counter when the run started, so the + # notification waits behind it as the pending entry. + assert (info.subscribed_event_id, info.last_counter) == (0, 1) + assert info.pending_notification is not None + assert info.pending_notification.counter == 1 + assert info.pending_notification.linked_to is not None + assert info.pending_notification.linked_to.workflow_id == handle.id + assert info.scheduled_counter == 0 assert (info.listener_count, info.retained_count, info.accepted_count) == ( 0, 1, 1, ) - # Nobody polls. The notification either rode the task the notify - # scheduled or waits behind the first task, which was scheduled - # without a counter when the run started. - pending = ( - info.pending_notification.counter if info.pending_notification else None - ) - assert (info.scheduled_counter, pending) in {(1, None), (0, 1)} # A callback on the linked channel shows up in the owner's count. callback = Callback(url="http://localhost:1/never-called", headers={}) listener_id = await client.register_channel_listener( @@ -1139,6 +1141,10 @@ async def test_a_description_lists_a_linked_channel_once_it_holds_state( ) [info] = (await handle.describe()).channel_subscriptions assert info.listener_count == 0 + # A closed run keeps listing what it stood on. + await handle.terminate() + [info] = (await handle.describe()).channel_subscriptions + assert (info.kind, info.last_counter) == (ChannelKind.LINKED, 1) finally: with contextlib.suppress(RPCError): await handle.terminate() From 68cdb9e943c66c1a088746aaeb1ae17914e907ff Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:44:49 -0700 Subject: [PATCH 804/831] Repinned Core to the unsubscribe and channel-report head. The api tree carries the unsubscribe command, its event and failed cause, and the workflow's channel subscriptions on describe. The Core commands gain `UnsubscribeNotificationChannel` and `WorkflowStreamChannels`, regenerated here. --- temporalio/api/command/v1/__init__.py | 2 + temporalio/api/command/v1/message_pb2.py | 34 +- temporalio/api/command/v1/message_pb2.pyi | 37 + temporalio/api/enums/v1/command_type_pb2.py | 5 +- temporalio/api/enums/v1/command_type_pb2.pyi | 2 + temporalio/api/enums/v1/event_type_pb2.py | 5 +- temporalio/api/enums/v1/event_type_pb2.pyi | 10 + temporalio/api/enums/v1/failed_cause_pb2.py | 25 +- temporalio/api/enums/v1/failed_cause_pb2.pyi | 8 + temporalio/api/history/v1/__init__.py | 2 + temporalio/api/history/v1/message_pb2.py | 102 ++- temporalio/api/history/v1/message_pb2.pyi | 56 ++ temporalio/api/workflow/v1/__init__.py | 2 + temporalio/api/workflow/v1/message_pb2.py | 151 ++-- temporalio/api/workflow/v1/message_pb2.pyi | 89 ++ .../v1/request_response_pb2.py | 784 +++++++++--------- .../v1/request_response_pb2.pyi | 16 + .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 202 +++-- .../workflow_commands_pb2.pyi | 77 ++ temporalio/bridge/sdk-core | 2 +- 21 files changed, 1004 insertions(+), 611 deletions(-) diff --git a/temporalio/api/command/v1/__init__.py b/temporalio/api/command/v1/__init__.py index 2f9ac1a91..4335f783d 100644 --- a/temporalio/api/command/v1/__init__.py +++ b/temporalio/api/command/v1/__init__.py @@ -19,6 +19,7 @@ StartTimerCommandAttributes, SubscribeNotificationChannelCommandAttributes, SubscribeStreamCommandAttributes, + UnsubscribeNotificationChannelCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes, ) @@ -43,5 +44,6 @@ "StartTimerCommandAttributes", "SubscribeNotificationChannelCommandAttributes", "SubscribeStreamCommandAttributes", + "UnsubscribeNotificationChannelCommandAttributes", "UpsertWorkflowSearchAttributesCommandAttributes", ] diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index 4e6c50922..c29fcb610 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xea\x14\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x12\x83\x01\n1subscribe_notification_channel_command_attributes\x18\x16 \x01(\x0b\x32\x46.temporal.api.command.v1.SubscribeNotificationChannelCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"@\n-SubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\tB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xf4\x15\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x12\x83\x01\n1subscribe_notification_channel_command_attributes\x18\x16 \x01(\x0b\x32\x46.temporal.api.command.v1.SubscribeNotificationChannelCommandAttributesH\x00\x12\x87\x01\n3unsubscribe_notification_channel_command_attributes\x18\x17 \x01(\x0b\x32H.temporal.api.command.v1.UnsubscribeNotificationChannelCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"@\n-SubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"B\n/UnsubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\tB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -118,6 +118,9 @@ _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ "SubscribeNotificationChannelCommandAttributes" ] +_UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES = DESCRIPTOR.message_types_by_name[ + "UnsubscribeNotificationChannelCommandAttributes" +] ScheduleActivityTaskCommandAttributes = _reflection.GeneratedProtocolMessageType( "ScheduleActivityTaskCommandAttributes", (_message.Message,), @@ -379,6 +382,19 @@ ) _sym_db.RegisterMessage(SubscribeNotificationChannelCommandAttributes) +UnsubscribeNotificationChannelCommandAttributes = ( + _reflection.GeneratedProtocolMessageType( + "UnsubscribeNotificationChannelCommandAttributes", + (_message.Message,), + { + "DESCRIPTOR": _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES, + "__module__": "temporalio.api.command.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.command.v1.UnsubscribeNotificationChannelCommandAttributes) + }, + ) +) +_sym_db.RegisterMessage(UnsubscribeNotificationChannelCommandAttributes) + if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\032io.temporal.api.command.v1B\014MessageProtoP\001Z%go.temporal.io/api/command/v1;command\252\002\031Temporalio.Api.Command.V1\352\002\034Temporalio::Api::Command::V1" @@ -469,11 +485,13 @@ _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_start = 5197 _REQUESTCANCELNEXUSOPERATIONCOMMANDATTRIBUTES._serialized_end = 5271 _COMMAND._serialized_start = 5274 - _COMMAND._serialized_end = 7940 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 7942 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 8054 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 8056 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8131 - _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8133 - _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8197 + _COMMAND._serialized_end = 8078 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 8080 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 8192 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 8194 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8269 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8271 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8335 + _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8337 + _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8403 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/command/v1/message_pb2.pyi b/temporalio/api/command/v1/message_pb2.pyi index 1fd211475..84bb8e0ea 100644 --- a/temporalio/api/command/v1/message_pb2.pyi +++ b/temporalio/api/command/v1/message_pb2.pyi @@ -1123,6 +1123,7 @@ class Command(google.protobuf.message.Message): APPEND_STREAM_RECORDS_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SUBSCRIBE_STREAM_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int SUBSCRIBE_NOTIFICATION_CHANNEL_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int + UNSUBSCRIBE_NOTIFICATION_CHANNEL_COMMAND_ATTRIBUTES_FIELD_NUMBER: builtins.int command_type: temporalio.api.enums.v1.command_type_pb2.CommandType.ValueType @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: @@ -1225,6 +1226,10 @@ class Command(google.protobuf.message.Message): def subscribe_notification_channel_command_attributes( self, ) -> global___SubscribeNotificationChannelCommandAttributes: ... + @property + def unsubscribe_notification_channel_command_attributes( + self, + ) -> global___UnsubscribeNotificationChannelCommandAttributes: ... def __init__( self, *, @@ -1275,6 +1280,8 @@ class Command(google.protobuf.message.Message): | None = ..., subscribe_notification_channel_command_attributes: global___SubscribeNotificationChannelCommandAttributes | None = ..., + unsubscribe_notification_channel_command_attributes: global___UnsubscribeNotificationChannelCommandAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -1319,6 +1326,8 @@ class Command(google.protobuf.message.Message): b"subscribe_notification_channel_command_attributes", "subscribe_stream_command_attributes", b"subscribe_stream_command_attributes", + "unsubscribe_notification_channel_command_attributes", + b"unsubscribe_notification_channel_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1372,6 +1381,8 @@ class Command(google.protobuf.message.Message): b"subscribe_notification_channel_command_attributes", "subscribe_stream_command_attributes", b"subscribe_stream_command_attributes", + "unsubscribe_notification_channel_command_attributes", + b"unsubscribe_notification_channel_command_attributes", "upsert_workflow_search_attributes_command_attributes", b"upsert_workflow_search_attributes_command_attributes", "user_metadata", @@ -1402,6 +1413,7 @@ class Command(google.protobuf.message.Message): "append_stream_records_command_attributes", "subscribe_stream_command_attributes", "subscribe_notification_channel_command_attributes", + "unsubscribe_notification_channel_command_attributes", ] | None ): ... @@ -1511,3 +1523,28 @@ class SubscribeNotificationChannelCommandAttributes(google.protobuf.message.Mess global___SubscribeNotificationChannelCommandAttributes = ( SubscribeNotificationChannelCommandAttributes ) + +class UnsubscribeNotificationChannelCommandAttributes(google.protobuf.message.Message): + """Ends the run's subscription to a notification channel. Notifications already + recorded on a scheduled event still reach that Workflow Task; later ones do + not. A command naming a channel the run is not subscribed to records its + event and changes nothing, so replay matches every command to an event. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """The channel to stop listening on, as the writers name it.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___UnsubscribeNotificationChannelCommandAttributes = ( + UnsubscribeNotificationChannelCommandAttributes +) diff --git a/temporalio/api/enums/v1/command_type_pb2.py b/temporalio/api/enums/v1/command_type_pb2.py index dcb39197c..dece3c0f4 100644 --- a/temporalio/api/enums/v1/command_type_pb2.py +++ b/temporalio/api/enums/v1/command_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\x98\x07\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x12/\n+COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL\x10\x15\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" + b"\n(temporal/api/enums/v1/command_type.proto\x12\x15temporal.api.enums.v1*\xcb\x07\n\x0b\x43ommandType\x12\x1c\n\x18\x43OMMAND_TYPE_UNSPECIFIED\x10\x00\x12'\n#COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK\x10\x01\x12-\n)COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK\x10\x02\x12\x1c\n\x18\x43OMMAND_TYPE_START_TIMER\x10\x03\x12,\n(COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION\x10\x04\x12(\n$COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION\x10\x05\x12\x1d\n\x19\x43OMMAND_TYPE_CANCEL_TIMER\x10\x06\x12*\n&COMMAND_TYPE_CANCEL_WORKFLOW_EXECUTION\x10\x07\x12;\n7COMMAND_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION\x10\x08\x12\x1e\n\x1a\x43OMMAND_TYPE_RECORD_MARKER\x10\t\x12\x33\n/COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION\x10\n\x12/\n+COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION\x10\x0b\x12\x33\n/COMMAND_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION\x10\x0c\x12\x32\n.COMMAND_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\x10\r\x12!\n\x1d\x43OMMAND_TYPE_PROTOCOL_MESSAGE\x10\x0e\x12+\n'COMMAND_TYPE_MODIFY_WORKFLOW_PROPERTIES\x10\x10\x12)\n%COMMAND_TYPE_SCHEDULE_NEXUS_OPERATION\x10\x11\x12/\n+COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION\x10\x12\x12&\n\"COMMAND_TYPE_APPEND_STREAM_RECORDS\x10\x13\x12!\n\x1d\x43OMMAND_TYPE_SUBSCRIBE_STREAM\x10\x14\x12/\n+COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL\x10\x15\x12\x31\n-COMMAND_TYPE_UNSUBSCRIBE_NOTIFICATION_CHANNEL\x10\x16\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x43ommandTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3" ) _COMMANDTYPE = DESCRIPTOR.enum_types_by_name["CommandType"] @@ -42,11 +42,12 @@ COMMAND_TYPE_APPEND_STREAM_RECORDS = 19 COMMAND_TYPE_SUBSCRIBE_STREAM = 20 COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL = 21 +COMMAND_TYPE_UNSUBSCRIBE_NOTIFICATION_CHANNEL = 22 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020CommandTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _COMMANDTYPE._serialized_start = 68 - _COMMANDTYPE._serialized_end = 988 + _COMMANDTYPE._serialized_end = 1039 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/command_type_pb2.pyi b/temporalio/api/enums/v1/command_type_pb2.pyi index 64fb7729c..327e66386 100644 --- a/temporalio/api/enums/v1/command_type_pb2.pyi +++ b/temporalio/api/enums/v1/command_type_pb2.pyi @@ -47,6 +47,7 @@ class _CommandTypeEnumTypeWrapper( COMMAND_TYPE_APPEND_STREAM_RECORDS: _CommandType.ValueType # 19 COMMAND_TYPE_SUBSCRIBE_STREAM: _CommandType.ValueType # 20 COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL: _CommandType.ValueType # 21 + COMMAND_TYPE_UNSUBSCRIBE_NOTIFICATION_CHANNEL: _CommandType.ValueType # 22 class CommandType(_CommandType, metaclass=_CommandTypeEnumTypeWrapper): """Whenever this list of command types is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering.""" @@ -72,4 +73,5 @@ COMMAND_TYPE_REQUEST_CANCEL_NEXUS_OPERATION: CommandType.ValueType # 18 COMMAND_TYPE_APPEND_STREAM_RECORDS: CommandType.ValueType # 19 COMMAND_TYPE_SUBSCRIBE_STREAM: CommandType.ValueType # 20 COMMAND_TYPE_SUBSCRIBE_NOTIFICATION_CHANNEL: CommandType.ValueType # 21 +COMMAND_TYPE_UNSUBSCRIBE_NOTIFICATION_CHANNEL: CommandType.ValueType # 22 global___CommandType = CommandType diff --git a/temporalio/api/enums/v1/event_type_pb2.py b/temporalio/api/enums/v1/event_type_pb2.py index 4b615e909..c012b3cd2 100644 --- a/temporalio/api/enums/v1/event_type_pb2.py +++ b/temporalio/api/enums/v1/event_type_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\xb3\x17\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\n\x12\x37\n3EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED\x10?B\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n&temporal/api/enums/v1/event_type.proto\x12\x15temporal.api.enums.v1*\xee\x17\n\tEventType\x12\x1a\n\x16\x45VENT_TYPE_UNSPECIFIED\x10\x00\x12)\n%EVENT_TYPE_WORKFLOW_EXECUTION_STARTED\x10\x01\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\x10\x02\x12(\n$EVENT_TYPE_WORKFLOW_EXECUTION_FAILED\x10\x03\x12+\n\'EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT\x10\x04\x12&\n"EVENT_TYPE_WORKFLOW_TASK_SCHEDULED\x10\x05\x12$\n EVENT_TYPE_WORKFLOW_TASK_STARTED\x10\x06\x12&\n"EVENT_TYPE_WORKFLOW_TASK_COMPLETED\x10\x07\x12&\n"EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT\x10\x08\x12#\n\x1f\x45VENT_TYPE_WORKFLOW_TASK_FAILED\x10\t\x12&\n"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED\x10\n\x12$\n EVENT_TYPE_ACTIVITY_TASK_STARTED\x10\x0b\x12&\n"EVENT_TYPE_ACTIVITY_TASK_COMPLETED\x10\x0c\x12#\n\x1f\x45VENT_TYPE_ACTIVITY_TASK_FAILED\x10\r\x12&\n"EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT\x10\x0e\x12-\n)EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED\x10\x0f\x12%\n!EVENT_TYPE_ACTIVITY_TASK_CANCELED\x10\x10\x12\x1c\n\x18\x45VENT_TYPE_TIMER_STARTED\x10\x11\x12\x1a\n\x16\x45VENT_TYPE_TIMER_FIRED\x10\x12\x12\x1d\n\x19\x45VENT_TYPE_TIMER_CANCELED\x10\x13\x12\x32\n.EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED\x10\x14\x12*\n&EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\x10\x15\x12\x43\n?EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\x10\x16\x12@\n\x12\x37\n3EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED\x10?\x12\x39\n5EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED\x10@B\x86\x01\n\x18io.temporal.api.enums.v1B\x0e\x45ventTypeProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _EVENTTYPE = DESCRIPTOR.enum_types_by_name["EventType"] @@ -85,11 +85,12 @@ EVENT_TYPE_WORKFLOW_STREAM_SUBSCRIBED = 61 EVENT_TYPE_WORKFLOW_STREAM_RECORDS_APPENDED = 62 EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED = 63 +EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED = 64 if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\016EventTypeProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _EVENTTYPE._serialized_start = 66 - _EVENTTYPE._serialized_end = 3061 + _EVENTTYPE._serialized_end = 3120 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/event_type_pb2.pyi b/temporalio/api/enums/v1/event_type_pb2.pyi index 97a4c1166..e5ca2bb1f 100644 --- a/temporalio/api/enums/v1/event_type_pb2.pyi +++ b/temporalio/api/enums/v1/event_type_pb2.pyi @@ -230,6 +230,11 @@ class _EventTypeEnumTypeWrapper( """A Workflow became a listener of a notification channel for its run. The notifications themselves ride the WorkflowTaskScheduled event. """ + EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED: _EventType.ValueType # 64 + """A Workflow stopped listening on a notification channel for its run. + Recorded for every UnsubscribeNotificationChannel command, including one + naming a channel the run was not subscribed to. + """ class EventType(_EventType, metaclass=_EventTypeEnumTypeWrapper): """Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering""" @@ -436,4 +441,9 @@ EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED: EventType.ValueType # 63 """A Workflow became a listener of a notification channel for its run. The notifications themselves ride the WorkflowTaskScheduled event. """ +EVENT_TYPE_WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED: EventType.ValueType # 64 +"""A Workflow stopped listening on a notification channel for its run. +Recorded for every UnsubscribeNotificationChannel command, including one +naming a channel the run was not subscribed to. +""" global___EventType = EventType diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index 9c1970298..eb29a1449 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,7 +16,7 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\x9c\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xec\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,\x12N\nJWORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10-*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' ) _WORKFLOWTASKFAILEDCAUSE = DESCRIPTOR.enum_types_by_name["WorkflowTaskFailedCause"] @@ -90,6 +90,7 @@ WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES = 42 WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE = 43 WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES = 44 +WORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES = 45 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED = 0 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS = 1 START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND = 2 @@ -121,15 +122,15 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b"\n\030io.temporal.api.enums.v1B\020FailedCauseProtoP\001Z!go.temporal.io/api/enums/v1;enums\252\002\027Temporalio.Api.Enums.V1\352\002\032Temporalio::Api::Enums::V1" _WORKFLOWTASKFAILEDCAUSE._serialized_start = 68 - _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2912 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2915 - _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3235 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3238 - _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3511 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3514 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3868 - _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3871 - _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4406 - _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4409 - _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4552 + _WORKFLOWTASKFAILEDCAUSE._serialized_end = 2992 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 2995 + _STARTCHILDWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3315 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3318 + _CANCELEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3591 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_start = 3594 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDCAUSE._serialized_end = 3948 + _RESOURCEEXHAUSTEDCAUSE._serialized_start = 3951 + _RESOURCEEXHAUSTEDCAUSE._serialized_end = 4486 + _RESOURCEEXHAUSTEDSCOPE._serialized_start = 4489 + _RESOURCEEXHAUSTEDSCOPE._serialized_end = 4632 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.pyi b/temporalio/api/enums/v1/failed_cause_pb2.pyi index 65e359473..fe51b7f95 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.pyi +++ b/temporalio/api/enums/v1/failed_cause_pb2.pyi @@ -209,6 +209,10 @@ class _WorkflowTaskFailedCauseEnumTypeWrapper( """A SubscribeNotificationChannel command named an empty or too-long channel, or hit a subscription or listener limit. """ + WORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( + _WorkflowTaskFailedCause.ValueType + ) # 45 + """An UnsubscribeNotificationChannel command named an empty or too-long channel.""" class WorkflowTaskFailedCause( _WorkflowTaskFailedCause, metaclass=_WorkflowTaskFailedCauseEnumTypeWrapper @@ -388,6 +392,10 @@ WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( """A SubscribeNotificationChannel command named an empty or too-long channel, or hit a subscription or listener limit. """ +WORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES: ( + WorkflowTaskFailedCause.ValueType +) # 45 +"""An UnsubscribeNotificationChannel command named an empty or too-long channel.""" global___WorkflowTaskFailedCause = WorkflowTaskFailedCause class _StartChildWorkflowExecutionFailedCause: diff --git a/temporalio/api/history/v1/__init__.py b/temporalio/api/history/v1/__init__.py index 7c765449d..088533d0e 100644 --- a/temporalio/api/history/v1/__init__.py +++ b/temporalio/api/history/v1/__init__.py @@ -56,6 +56,7 @@ WorkflowExecutionUpdateCompletedEventAttributes, WorkflowExecutionUpdateRejectedEventAttributes, WorkflowNotificationChannelSubscribedEventAttributes, + WorkflowNotificationChannelUnsubscribedEventAttributes, WorkflowPropertiesModifiedEventAttributes, WorkflowPropertiesModifiedExternallyEventAttributes, WorkflowStreamRecordsAppendedEventAttributes, @@ -125,6 +126,7 @@ "WorkflowExecutionUpdateCompletedEventAttributes", "WorkflowExecutionUpdateRejectedEventAttributes", "WorkflowNotificationChannelSubscribedEventAttributes", + "WorkflowNotificationChannelUnsubscribedEventAttributes", "WorkflowPropertiesModifiedEventAttributes", "WorkflowPropertiesModifiedExternallyEventAttributes", "WorkflowStreamRecordsAppendedEventAttributes", diff --git a/temporalio/api/history/v1/message_pb2.py b/temporalio/api/history/v1/message_pb2.py index 6f482feaf..e4ddd593b 100644 --- a/temporalio/api/history/v1/message_pb2.py +++ b/temporalio/api/history/v1/message_pb2.py @@ -64,7 +64,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xdd\x42\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x90\x01\n6WorkflowNotificationChannelUnsubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xf6\x43\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x12\x96\x01\n;workflow_notification_channel_unsubscribed_event_attributes\x18\x45 \x01(\x0b\x32O.temporal.api.history.v1.WorkflowNotificationChannelUnsubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -229,6 +229,11 @@ "WorkflowNotificationChannelSubscribedEventAttributes" ] ) +_WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES = ( + DESCRIPTOR.message_types_by_name[ + "WorkflowNotificationChannelUnsubscribedEventAttributes" + ] +) _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES = DESCRIPTOR.message_types_by_name[ "WorkflowStreamRecordsAppendedEventAttributes" ] @@ -860,6 +865,19 @@ ) _sym_db.RegisterMessage(WorkflowNotificationChannelSubscribedEventAttributes) +WorkflowNotificationChannelUnsubscribedEventAttributes = ( + _reflection.GeneratedProtocolMessageType( + "WorkflowNotificationChannelUnsubscribedEventAttributes", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES, + "__module__": "temporalio.api.history.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.history.v1.WorkflowNotificationChannelUnsubscribedEventAttributes) + }, + ) +) +_sym_db.RegisterMessage(WorkflowNotificationChannelUnsubscribedEventAttributes) + WorkflowStreamRecordsAppendedEventAttributes = _reflection.GeneratedProtocolMessageType( "WorkflowStreamRecordsAppendedEventAttributes", (_message.Message,), @@ -1364,44 +1382,46 @@ _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17267 _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17269 _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17382 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17385 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17536 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17539 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17759 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17762 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 17932 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 17935 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18206 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18209 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18373 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18375 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18469 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18471 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18567 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18570 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18767 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18770 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19334 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19284 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19334 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19337 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19474 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19477 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19614 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19617 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19753 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19756 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 19894 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 19897 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20035 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20037 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20153 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20156 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20307 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20310 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20509 - _HISTORYEVENT._serialized_start = 20512 - _HISTORYEVENT._serialized_end = 29053 - _HISTORY._serialized_start = 29055 - _HISTORY._serialized_end = 29119 + _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17385 + _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17529 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17532 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17683 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17686 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17906 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17909 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 18079 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 18082 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18353 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18356 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18520 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18522 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18616 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18618 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18714 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18717 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18914 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18917 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19481 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19431 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19481 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19484 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19621 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19624 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19761 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19764 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19900 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19903 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 20041 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 20044 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20182 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20184 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20300 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20303 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20454 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20457 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20656 + _HISTORYEVENT._serialized_start = 20659 + _HISTORYEVENT._serialized_end = 29353 + _HISTORY._serialized_start = 29355 + _HISTORY._serialized_end = 29419 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/history/v1/message_pb2.pyi b/temporalio/api/history/v1/message_pb2.pyi index e25a8450d..2d564ce56 100644 --- a/temporalio/api/history/v1/message_pb2.pyi +++ b/temporalio/api/history/v1/message_pb2.pyi @@ -3715,6 +3715,48 @@ global___WorkflowNotificationChannelSubscribedEventAttributes = ( WorkflowNotificationChannelSubscribedEventAttributes ) +class WorkflowNotificationChannelUnsubscribedEventAttributes( + google.protobuf.message.Message +): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKFLOW_TASK_COMPLETED_EVENT_ID_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + SUBSCRIBED_EVENT_ID_FIELD_NUMBER: builtins.int + workflow_task_completed_event_id: builtins.int + """The WorkflowTaskCompleted event of the task whose command ended this + subscription. + """ + channel: builtins.str + """The channel the Workflow stopped listening on.""" + subscribed_event_id: builtins.int + """The WorkflowNotificationChannelSubscribed event that recorded the + subscription this command ended. Zero when the run held no subscription + for the channel. + """ + def __init__( + self, + *, + workflow_task_completed_event_id: builtins.int = ..., + channel: builtins.str = ..., + subscribed_event_id: builtins.int = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "channel", + b"channel", + "subscribed_event_id", + b"subscribed_event_id", + "workflow_task_completed_event_id", + b"workflow_task_completed_event_id", + ], + ) -> None: ... + +global___WorkflowNotificationChannelUnsubscribedEventAttributes = ( + WorkflowNotificationChannelUnsubscribedEventAttributes +) + class WorkflowStreamRecordsAppendedEventAttributes(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -4621,6 +4663,9 @@ class HistoryEvent(google.protobuf.message.Message): WORKFLOW_STREAM_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int WORKFLOW_STREAM_RECORDS_APPENDED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int WORKFLOW_NOTIFICATION_CHANNEL_SUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: builtins.int + WORKFLOW_NOTIFICATION_CHANNEL_UNSUBSCRIBED_EVENT_ATTRIBUTES_FIELD_NUMBER: ( + builtins.int + ) event_id: builtins.int """Monotonically increasing event number, starts at 1.""" @property @@ -4918,6 +4963,10 @@ class HistoryEvent(google.protobuf.message.Message): def workflow_notification_channel_subscribed_event_attributes( self, ) -> global___WorkflowNotificationChannelSubscribedEventAttributes: ... + @property + def workflow_notification_channel_unsubscribed_event_attributes( + self, + ) -> global___WorkflowNotificationChannelUnsubscribedEventAttributes: ... def __init__( self, *, @@ -5061,6 +5110,8 @@ class HistoryEvent(google.protobuf.message.Message): | None = ..., workflow_notification_channel_subscribed_event_attributes: global___WorkflowNotificationChannelSubscribedEventAttributes | None = ..., + workflow_notification_channel_unsubscribed_event_attributes: global___WorkflowNotificationChannelUnsubscribedEventAttributes + | None = ..., ) -> None: ... def HasField( self, @@ -5181,6 +5232,8 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_execution_update_rejected_event_attributes", "workflow_notification_channel_subscribed_event_attributes", b"workflow_notification_channel_subscribed_event_attributes", + "workflow_notification_channel_unsubscribed_event_attributes", + b"workflow_notification_channel_unsubscribed_event_attributes", "workflow_properties_modified_event_attributes", b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", @@ -5334,6 +5387,8 @@ class HistoryEvent(google.protobuf.message.Message): b"workflow_execution_update_rejected_event_attributes", "workflow_notification_channel_subscribed_event_attributes", b"workflow_notification_channel_subscribed_event_attributes", + "workflow_notification_channel_unsubscribed_event_attributes", + b"workflow_notification_channel_unsubscribed_event_attributes", "workflow_properties_modified_event_attributes", b"workflow_properties_modified_event_attributes", "workflow_properties_modified_externally_event_attributes", @@ -5421,6 +5476,7 @@ class HistoryEvent(google.protobuf.message.Message): "workflow_stream_subscribed_event_attributes", "workflow_stream_records_appended_event_attributes", "workflow_notification_channel_subscribed_event_attributes", + "workflow_notification_channel_unsubscribed_event_attributes", ] | None ): ... diff --git a/temporalio/api/workflow/v1/__init__.py b/temporalio/api/workflow/v1/__init__.py index ae647ab67..b708ebed6 100644 --- a/temporalio/api/workflow/v1/__init__.py +++ b/temporalio/api/workflow/v1/__init__.py @@ -1,5 +1,6 @@ from .message_pb2 import ( CallbackInfo, + ChannelSubscriptionInfo, DeploymentTransition, DeploymentVersionTransition, NewWorkflowExecutionInfo, @@ -24,6 +25,7 @@ __all__ = [ "CallbackInfo", + "ChannelSubscriptionInfo", "DeploymentTransition", "DeploymentVersionTransition", "NewWorkflowExecutionInfo", diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index 032f2b2b5..3f6c7d950 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -40,6 +40,9 @@ from temporalio.api.failure.v1 import ( message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, ) +from temporalio.api.notification.v1 import ( + message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, +) from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) @@ -48,7 +51,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xc3\x02\n\x17\x43hannelSubscriptionInfo\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03\x12\x14\n\x0clast_counter\x18\x04 \x01(\x03\x12H\n\x14pending_notification\x18\x05 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x19\n\x11scheduled_counter\x18\x06 \x01(\x03\x12\x16\n\x0elistener_count\x18\x07 \x01(\x05\x12\x16\n\x0eretained_count\x18\x08 \x01(\x05\x12\x16\n\x0e\x61\x63\x63\x65pted_count\x18\t \x01(\x03"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -94,6 +97,7 @@ _NEXUSOPERATIONCANCELLATIONINFO = DESCRIPTOR.message_types_by_name[ "NexusOperationCancellationInfo" ] +_CHANNELSUBSCRIPTIONINFO = DESCRIPTOR.message_types_by_name["ChannelSubscriptionInfo"] _WORKFLOWEXECUTIONOPTIONS = DESCRIPTOR.message_types_by_name["WorkflowExecutionOptions"] _VERSIONINGOVERRIDE = DESCRIPTOR.message_types_by_name["VersioningOverride"] _VERSIONINGOVERRIDE_PINNEDOVERRIDE = _VERSIONINGOVERRIDE.nested_types_by_name[ @@ -352,6 +356,17 @@ ) _sym_db.RegisterMessage(NexusOperationCancellationInfo) +ChannelSubscriptionInfo = _reflection.GeneratedProtocolMessageType( + "ChannelSubscriptionInfo", + (_message.Message,), + { + "DESCRIPTOR": _CHANNELSUBSCRIPTIONINFO, + "__module__": "temporalio.api.workflow.v1.message_pb2", + # @@protoc_insertion_point(class_scope:temporal.api.workflow.v1.ChannelSubscriptionInfo) + }, +) +_sym_db.RegisterMessage(ChannelSubscriptionInfo) + WorkflowExecutionOptions = _reflection.GeneratedProtocolMessageType( "WorkflowExecutionOptions", (_message.Message,), @@ -533,70 +548,72 @@ _VERSIONINGOVERRIDE.fields_by_name[ "pinned_version" ]._serialized_options = b"\030\001" - _WORKFLOWEXECUTIONINFO._serialized_start = 552 - _WORKFLOWEXECUTIONINFO._serialized_end = 1816 - _WORKFLOWEXECUTIONEXTENDEDINFO._serialized_start = 1819 - _WORKFLOWEXECUTIONEXTENDEDINFO._serialized_end = 2471 - _WORKFLOWEXECUTIONEXTENDEDINFO_REQUESTIDINFOSENTRY._serialized_start = 2377 - _WORKFLOWEXECUTIONEXTENDEDINFO_REQUESTIDINFOSENTRY._serialized_end = 2471 - _WORKFLOWEXECUTIONVERSIONINGINFO._serialized_start = 2474 - _WORKFLOWEXECUTIONVERSIONINGINFO._serialized_end = 3109 - _DEPLOYMENTTRANSITION._serialized_start = 3111 - _DEPLOYMENTTRANSITION._serialized_end = 3193 - _DEPLOYMENTVERSIONTRANSITION._serialized_start = 3196 - _DEPLOYMENTVERSIONTRANSITION._serialized_end = 3327 - _WORKFLOWEXECUTIONCONFIG._serialized_start = 3330 - _WORKFLOWEXECUTIONCONFIG._serialized_end = 3657 - _PENDINGACTIVITYINFO._serialized_start = 3660 - _PENDINGACTIVITYINFO._serialized_end = 5385 - _PENDINGACTIVITYINFO_PAUSEINFO._serialized_start = 5029 - _PENDINGACTIVITYINFO_PAUSEINFO._serialized_end = 5364 - _PENDINGACTIVITYINFO_PAUSEINFO_MANUAL._serialized_start = 5250 - _PENDINGACTIVITYINFO_PAUSEINFO_MANUAL._serialized_end = 5292 - _PENDINGACTIVITYINFO_PAUSEINFO_RULE._serialized_start = 5294 - _PENDINGACTIVITYINFO_PAUSEINFO_RULE._serialized_end = 5351 - _PENDINGCHILDEXECUTIONINFO._serialized_start = 5388 - _PENDINGCHILDEXECUTIONINFO._serialized_end = 5573 - _PENDINGWORKFLOWTASKINFO._serialized_start = 5576 - _PENDINGWORKFLOWTASKINFO._serialized_end = 5845 - _RESETPOINTS._serialized_start = 5847 - _RESETPOINTS._serialized_end = 5918 - _RESETPOINTINFO._serialized_start = 5921 - _RESETPOINTINFO._serialized_end = 6160 - _NEWWORKFLOWEXECUTIONINFO._serialized_start = 6163 - _NEWWORKFLOWEXECUTIONINFO._serialized_end = 7064 - _CALLBACKINFO._serialized_start = 7067 - _CALLBACKINFO._serialized_end = 7837 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7541 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7557 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7559 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7612 - _CALLBACKINFO_TRIGGER._serialized_start = 7615 - _CALLBACKINFO_TRIGGER._serialized_end = 7837 - _PENDINGNEXUSOPERATIONINFO._serialized_start = 7840 - _PENDINGNEXUSOPERATIONINFO._serialized_end = 8619 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8622 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9010 - _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9013 - _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9240 - _VERSIONINGOVERRIDE._serialized_start = 9243 - _VERSIONINGOVERRIDE._serialized_end = 10005 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9608 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 9781 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 9783 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 9888 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 9890 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 9993 - _ONCONFLICTOPTIONS._serialized_start = 10007 - _ONCONFLICTOPTIONS._serialized_end = 10112 - _REQUESTIDINFO._serialized_start = 10114 - _REQUESTIDINFO._serialized_end = 10219 - _POSTRESETOPERATION._serialized_start = 10222 - _POSTRESETOPERATION._serialized_end = 10789 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10436 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10615 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10618 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 10778 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 10791 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 10902 + _WORKFLOWEXECUTIONINFO._serialized_start = 596 + _WORKFLOWEXECUTIONINFO._serialized_end = 1860 + _WORKFLOWEXECUTIONEXTENDEDINFO._serialized_start = 1863 + _WORKFLOWEXECUTIONEXTENDEDINFO._serialized_end = 2515 + _WORKFLOWEXECUTIONEXTENDEDINFO_REQUESTIDINFOSENTRY._serialized_start = 2421 + _WORKFLOWEXECUTIONEXTENDEDINFO_REQUESTIDINFOSENTRY._serialized_end = 2515 + _WORKFLOWEXECUTIONVERSIONINGINFO._serialized_start = 2518 + _WORKFLOWEXECUTIONVERSIONINGINFO._serialized_end = 3153 + _DEPLOYMENTTRANSITION._serialized_start = 3155 + _DEPLOYMENTTRANSITION._serialized_end = 3237 + _DEPLOYMENTVERSIONTRANSITION._serialized_start = 3240 + _DEPLOYMENTVERSIONTRANSITION._serialized_end = 3371 + _WORKFLOWEXECUTIONCONFIG._serialized_start = 3374 + _WORKFLOWEXECUTIONCONFIG._serialized_end = 3701 + _PENDINGACTIVITYINFO._serialized_start = 3704 + _PENDINGACTIVITYINFO._serialized_end = 5429 + _PENDINGACTIVITYINFO_PAUSEINFO._serialized_start = 5073 + _PENDINGACTIVITYINFO_PAUSEINFO._serialized_end = 5408 + _PENDINGACTIVITYINFO_PAUSEINFO_MANUAL._serialized_start = 5294 + _PENDINGACTIVITYINFO_PAUSEINFO_MANUAL._serialized_end = 5336 + _PENDINGACTIVITYINFO_PAUSEINFO_RULE._serialized_start = 5338 + _PENDINGACTIVITYINFO_PAUSEINFO_RULE._serialized_end = 5395 + _PENDINGCHILDEXECUTIONINFO._serialized_start = 5432 + _PENDINGCHILDEXECUTIONINFO._serialized_end = 5617 + _PENDINGWORKFLOWTASKINFO._serialized_start = 5620 + _PENDINGWORKFLOWTASKINFO._serialized_end = 5889 + _RESETPOINTS._serialized_start = 5891 + _RESETPOINTS._serialized_end = 5962 + _RESETPOINTINFO._serialized_start = 5965 + _RESETPOINTINFO._serialized_end = 6204 + _NEWWORKFLOWEXECUTIONINFO._serialized_start = 6207 + _NEWWORKFLOWEXECUTIONINFO._serialized_end = 7108 + _CALLBACKINFO._serialized_start = 7111 + _CALLBACKINFO._serialized_end = 7881 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7585 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7601 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7603 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7656 + _CALLBACKINFO_TRIGGER._serialized_start = 7659 + _CALLBACKINFO_TRIGGER._serialized_end = 7881 + _PENDINGNEXUSOPERATIONINFO._serialized_start = 7884 + _PENDINGNEXUSOPERATIONINFO._serialized_end = 8663 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8666 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9054 + _CHANNELSUBSCRIPTIONINFO._serialized_start = 9057 + _CHANNELSUBSCRIPTIONINFO._serialized_end = 9380 + _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9383 + _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9610 + _VERSIONINGOVERRIDE._serialized_start = 9613 + _VERSIONINGOVERRIDE._serialized_end = 10375 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9978 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 10151 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 10153 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 10258 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 10260 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 10363 + _ONCONFLICTOPTIONS._serialized_start = 10377 + _ONCONFLICTOPTIONS._serialized_end = 10482 + _REQUESTIDINFO._serialized_start = 10484 + _REQUESTIDINFO._serialized_end = 10589 + _POSTRESETOPERATION._serialized_start = 10592 + _POSTRESETOPERATION._serialized_end = 11159 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10806 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10985 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10988 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 11148 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 11161 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 11272 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.pyi b/temporalio/api/workflow/v1/message_pb2.pyi index b390d94f4..a9e882f10 100644 --- a/temporalio/api/workflow/v1/message_pb2.pyi +++ b/temporalio/api/workflow/v1/message_pb2.pyi @@ -24,6 +24,7 @@ import temporalio.api.enums.v1.common_pb2 import temporalio.api.enums.v1.event_type_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.notification.v1.message_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 import temporalio.api.taskqueue.v1.message_pb2 @@ -1887,6 +1888,94 @@ class NexusOperationCancellationInfo(google.protobuf.message.Message): global___NexusOperationCancellationInfo = NexusOperationCancellationInfo +class ChannelSubscriptionInfo(google.protobuf.message.Message): + """A workflow's standing on a notification channel, as reported by DescribeWorkflowExecution.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + KIND_FIELD_NUMBER: builtins.int + SUBSCRIBED_EVENT_ID_FIELD_NUMBER: builtins.int + LAST_COUNTER_FIELD_NUMBER: builtins.int + PENDING_NOTIFICATION_FIELD_NUMBER: builtins.int + SCHEDULED_COUNTER_FIELD_NUMBER: builtins.int + LISTENER_COUNT_FIELD_NUMBER: builtins.int + RETAINED_COUNT_FIELD_NUMBER: builtins.int + ACCEPTED_COUNT_FIELD_NUMBER: builtins.int + channel: builtins.str + """Channel name.""" + kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType + """CHANNEL_KIND_INDEPENDENT for a channel the workflow subscribed to with a + SubscribeNotificationChannel command. CHANNEL_KIND_LINKED for a channel linked to this + workflow, which lists it once the channel holds any state. + """ + subscribed_event_id: builtins.int + """Independent kind: id of the WorkflowNotificationChannelSubscribed event that recorded the + subscription. Zero for the linked kind. + """ + last_counter: builtins.int + """Highest counter the workflow has accepted from the channel. Zero when none has arrived.""" + @property + def pending_notification( + self, + ) -> temporalio.api.notification.v1.message_pb2.Notification: + """The notification held for the workflow's next Workflow Task, when one is pending.""" + scheduled_counter: builtins.int + """Counter carried by the scheduled event of a Workflow Task that has not started yet. Zero + otherwise. + """ + listener_count: builtins.int + """Linked kind: callback listeners registered on the channel.""" + retained_count: builtins.int + """Linked kind: notifications retained for pollers.""" + accepted_count: builtins.int + """Linked kind: notifications the channel has accepted over its life.""" + def __init__( + self, + *, + channel: builtins.str = ..., + kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType = ..., + subscribed_event_id: builtins.int = ..., + last_counter: builtins.int = ..., + pending_notification: temporalio.api.notification.v1.message_pb2.Notification + | None = ..., + scheduled_counter: builtins.int = ..., + listener_count: builtins.int = ..., + retained_count: builtins.int = ..., + accepted_count: builtins.int = ..., + ) -> None: ... + def HasField( + self, + field_name: typing_extensions.Literal[ + "pending_notification", b"pending_notification" + ], + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "accepted_count", + b"accepted_count", + "channel", + b"channel", + "kind", + b"kind", + "last_counter", + b"last_counter", + "listener_count", + b"listener_count", + "pending_notification", + b"pending_notification", + "retained_count", + b"retained_count", + "scheduled_counter", + b"scheduled_counter", + "subscribed_event_id", + b"subscribed_event_id", + ], + ) -> None: ... + +global___ChannelSubscriptionInfo = ChannelSubscriptionInfo + class WorkflowExecutionOptions(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index 9804b7923..aee2202bf 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x99\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4531,415 +4531,415 @@ _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24188 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24191 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24719 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24722 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25726 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25508 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25624 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25626 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25726 - _GETCLUSTERINFOREQUEST._serialized_start = 25728 - _GETCLUSTERINFOREQUEST._serialized_end = 25751 - _GETCLUSTERINFORESPONSE._serialized_start = 25754 - _GETCLUSTERINFORESPONSE._serialized_end = 26219 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26164 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26219 - _GETSYSTEMINFOREQUEST._serialized_start = 26221 - _GETSYSTEMINFOREQUEST._serialized_end = 26243 - _GETSYSTEMINFORESPONSE._serialized_start = 26246 - _GETSYSTEMINFORESPONSE._serialized_end = 26823 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26387 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26823 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26825 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26934 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26937 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27160 - _CREATESCHEDULEREQUEST._serialized_start = 27163 - _CREATESCHEDULEREQUEST._serialized_end = 27495 - _CREATESCHEDULERESPONSE._serialized_start = 27497 - _CREATESCHEDULERESPONSE._serialized_end = 27545 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27547 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27612 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27615 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27886 - _UPDATESCHEDULEREQUEST._serialized_start = 27889 - _UPDATESCHEDULEREQUEST._serialized_end = 28181 - _UPDATESCHEDULERESPONSE._serialized_start = 28183 - _UPDATESCHEDULERESPONSE._serialized_end = 28207 - _PATCHSCHEDULEREQUEST._serialized_start = 28210 - _PATCHSCHEDULEREQUEST._serialized_end = 28366 - _PATCHSCHEDULERESPONSE._serialized_start = 28368 - _PATCHSCHEDULERESPONSE._serialized_end = 28391 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28394 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28562 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28564 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28647 - _DELETESCHEDULEREQUEST._serialized_start = 28649 - _DELETESCHEDULEREQUEST._serialized_end = 28730 - _DELETESCHEDULERESPONSE._serialized_start = 28732 - _DELETESCHEDULERESPONSE._serialized_end = 28756 - _LISTSCHEDULESREQUEST._serialized_start = 28758 - _LISTSCHEDULESREQUEST._serialized_end = 28866 - _LISTSCHEDULESRESPONSE._serialized_start = 28868 - _LISTSCHEDULESRESPONSE._serialized_end = 28980 - _COUNTSCHEDULESREQUEST._serialized_start = 28982 - _COUNTSCHEDULESREQUEST._serialized_end = 29039 - _COUNTSCHEDULESRESPONSE._serialized_start = 29042 - _COUNTSCHEDULESRESPONSE._serialized_end = 29261 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24270 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24273 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24801 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24804 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25808 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25590 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25706 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25708 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25808 + _GETCLUSTERINFOREQUEST._serialized_start = 25810 + _GETCLUSTERINFOREQUEST._serialized_end = 25833 + _GETCLUSTERINFORESPONSE._serialized_start = 25836 + _GETCLUSTERINFORESPONSE._serialized_end = 26301 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26246 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26301 + _GETSYSTEMINFOREQUEST._serialized_start = 26303 + _GETSYSTEMINFOREQUEST._serialized_end = 26325 + _GETSYSTEMINFORESPONSE._serialized_start = 26328 + _GETSYSTEMINFORESPONSE._serialized_end = 26905 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26469 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26905 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26907 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27016 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27019 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27242 + _CREATESCHEDULEREQUEST._serialized_start = 27245 + _CREATESCHEDULEREQUEST._serialized_end = 27577 + _CREATESCHEDULERESPONSE._serialized_start = 27579 + _CREATESCHEDULERESPONSE._serialized_end = 27627 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27629 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27694 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27697 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27968 + _UPDATESCHEDULEREQUEST._serialized_start = 27971 + _UPDATESCHEDULEREQUEST._serialized_end = 28263 + _UPDATESCHEDULERESPONSE._serialized_start = 28265 + _UPDATESCHEDULERESPONSE._serialized_end = 28289 + _PATCHSCHEDULEREQUEST._serialized_start = 28292 + _PATCHSCHEDULEREQUEST._serialized_end = 28448 + _PATCHSCHEDULERESPONSE._serialized_start = 28450 + _PATCHSCHEDULERESPONSE._serialized_end = 28473 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28476 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28644 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28646 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28729 + _DELETESCHEDULEREQUEST._serialized_start = 28731 + _DELETESCHEDULEREQUEST._serialized_end = 28812 + _DELETESCHEDULERESPONSE._serialized_start = 28814 + _DELETESCHEDULERESPONSE._serialized_end = 28838 + _LISTSCHEDULESREQUEST._serialized_start = 28840 + _LISTSCHEDULESREQUEST._serialized_end = 28948 + _LISTSCHEDULESRESPONSE._serialized_start = 28950 + _LISTSCHEDULESRESPONSE._serialized_end = 29062 + _COUNTSCHEDULESREQUEST._serialized_start = 29064 + _COUNTSCHEDULESREQUEST._serialized_end = 29121 + _COUNTSCHEDULESRESPONSE._serialized_start = 29124 + _COUNTSCHEDULESRESPONSE._serialized_end = 29343 _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29264 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29910 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29711 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29346 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29992 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29793 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29822 + 29904 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29824 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29897 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29912 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29976 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29978 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30073 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30075 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30191 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30194 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31911 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31246 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29906 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29979 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29994 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30058 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30060 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30155 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30157 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30273 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30276 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31993 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31328 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31359 + 31441 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31362 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31444 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31491 + 31573 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31493 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31575 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31557 + 31639 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31559 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31665 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31667 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31777 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31779 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31841 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31843 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31898 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31914 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32166 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32168 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32240 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32243 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32492 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32495 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32651 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32653 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32767 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32770 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33031 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33034 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33293 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33296 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34662 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34664 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34693 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34695 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34791 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34793 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34821 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34823 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34889 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34892 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35364 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35366 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35457 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35459 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35580 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35583 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35768 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35771 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35990 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35993 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36409 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36412 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36766 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36769 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36936 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36938 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36973 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36976 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37196 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37198 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37230 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37233 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37605 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37399 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37605 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37608 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37940 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37734 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37940 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37943 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38279 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38282 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38601 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38603 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38703 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38705 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38814 - _PAUSEACTIVITYREQUEST._serialized_start = 38817 - _PAUSEACTIVITYREQUEST._serialized_end = 39016 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39019 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39202 - _PAUSEACTIVITYRESPONSE._serialized_start = 39204 - _PAUSEACTIVITYRESPONSE._serialized_end = 39227 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39229 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39261 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39264 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39544 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39547 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39820 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39822 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39847 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39849 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39883 - _RESETACTIVITYREQUEST._serialized_start = 39886 - _RESETACTIVITYREQUEST._serialized_end = 40193 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40196 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40486 - _RESETACTIVITYRESPONSE._serialized_start = 40488 - _RESETACTIVITYRESPONSE._serialized_end = 40511 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40513 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40545 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40548 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40832 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40835 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41012 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41014 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41120 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41122 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41219 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41222 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41416 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41419 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42071 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41680 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42071 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25406 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25506 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42073 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42150 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42153 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42293 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42295 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42403 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42405 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42524 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42527 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42732 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42735 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42920 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42923 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43152 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43155 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43346 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43349 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43598 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43601 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43825 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43827 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43940 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43942 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43998 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44000 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44093 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44096 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44767 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44271 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44767 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44770 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45010 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45012 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45051 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45054 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45254 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45256 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45295 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45297 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45390 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45392 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45424 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45427 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45943 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45945 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45997 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46000 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46500 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45820 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45943 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46502 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46556 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46559 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46977 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46892 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31641 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31747 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31749 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31859 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31861 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31923 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31925 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31980 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31996 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32248 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32250 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32322 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32325 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32574 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32577 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32733 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32735 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32849 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32852 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33113 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33116 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33375 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33378 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34744 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34746 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34775 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34777 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34873 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34875 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34903 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34905 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34971 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34974 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35446 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35448 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35539 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35541 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35662 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35665 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35850 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35853 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36072 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36075 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36491 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36494 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36848 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36851 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37018 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37020 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37055 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37058 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37278 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37280 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37312 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37315 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37687 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37481 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37687 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37690 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38022 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37816 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38022 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38025 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38361 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38364 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38683 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38685 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38785 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38787 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38896 + _PAUSEACTIVITYREQUEST._serialized_start = 38899 + _PAUSEACTIVITYREQUEST._serialized_end = 39098 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39101 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39284 + _PAUSEACTIVITYRESPONSE._serialized_start = 39286 + _PAUSEACTIVITYRESPONSE._serialized_end = 39309 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39311 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39343 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39346 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39626 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39629 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39902 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39904 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39929 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39931 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39965 + _RESETACTIVITYREQUEST._serialized_start = 39968 + _RESETACTIVITYREQUEST._serialized_end = 40275 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40278 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40568 + _RESETACTIVITYRESPONSE._serialized_start = 40570 + _RESETACTIVITYRESPONSE._serialized_end = 40593 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40595 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40627 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40630 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40914 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40917 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41094 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41096 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41202 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41204 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41301 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41304 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41498 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41501 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42153 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41762 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42153 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42155 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42232 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42235 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42375 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42377 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42485 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42487 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42606 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42609 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42814 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42817 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43002 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43005 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43234 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43237 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43428 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43431 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43680 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43683 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43907 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43909 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44022 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44024 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44080 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44082 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44175 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44178 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44849 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44353 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44849 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44852 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45092 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45094 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45133 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45136 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45336 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45338 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45377 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45379 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45472 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45474 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45506 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45509 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46025 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46027 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46079 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46082 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46582 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46584 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46638 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46641 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47059 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46974 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 46977 + 47059 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46979 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47089 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47092 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47281 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47283 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47382 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47384 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47453 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47455 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47562 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47564 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47677 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47680 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47907 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47910 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48090 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48092 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48187 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48189 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48254 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48256 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48337 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48339 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48402 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48404 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48432 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48434 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48504 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48506 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48610 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48613 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48819 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48821 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48867 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48870 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49025 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49027 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49058 - _LISTWORKERSREQUEST._serialized_start = 49061 - _LISTWORKERSREQUEST._serialized_end = 49191 - _LISTWORKERSRESPONSE._serialized_start = 49194 - _LISTWORKERSRESPONSE._serialized_end = 49359 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49362 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50087 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49929 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50020 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47061 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47171 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47174 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47363 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47365 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47464 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47466 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47535 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47537 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47644 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47646 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47759 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47762 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47989 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47992 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48172 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48174 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48269 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48271 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48336 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48338 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48419 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48421 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48484 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48486 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48514 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48516 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48586 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48588 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48692 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48695 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48901 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48903 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48949 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48952 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49107 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49109 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49140 + _LISTWORKERSREQUEST._serialized_start = 49143 + _LISTWORKERSREQUEST._serialized_end = 49273 + _LISTWORKERSRESPONSE._serialized_start = 49276 + _LISTWORKERSRESPONSE._serialized_end = 49441 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49444 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50169 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50011 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50102 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50022 + 50104 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50087 + 50169 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50089 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50180 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50183 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50341 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50343 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50428 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50431 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50697 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50699 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50799 - _DESCRIBEWORKERREQUEST._serialized_start = 50801 - _DESCRIBEWORKERREQUEST._serialized_end = 50872 - _DESCRIBEWORKERRESPONSE._serialized_start = 50874 - _DESCRIBEWORKERRESPONSE._serialized_end = 50955 - _COUNTWORKERSREQUEST._serialized_start = 50957 - _COUNTWORKERSREQUEST._serialized_end = 51044 - _COUNTWORKERSRESPONSE._serialized_start = 51046 - _COUNTWORKERSRESPONSE._serialized_end = 51083 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51086 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51227 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51229 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51261 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51264 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51407 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51409 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51443 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51446 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52623 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52625 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52734 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52737 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52965 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52968 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53284 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53286 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53372 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53374 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53490 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53492 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53601 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53604 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53734 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53737 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54586 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54536 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54586 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54588 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54659 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54662 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54832 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54835 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55146 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55149 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55310 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55313 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55574 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55576 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55691 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55694 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55833 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55835 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55901 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55904 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56141 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50171 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50262 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50265 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50423 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50425 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50510 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50513 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50779 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50781 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50881 + _DESCRIBEWORKERREQUEST._serialized_start = 50883 + _DESCRIBEWORKERREQUEST._serialized_end = 50954 + _DESCRIBEWORKERRESPONSE._serialized_start = 50956 + _DESCRIBEWORKERRESPONSE._serialized_end = 51037 + _COUNTWORKERSREQUEST._serialized_start = 51039 + _COUNTWORKERSREQUEST._serialized_end = 51126 + _COUNTWORKERSRESPONSE._serialized_start = 51128 + _COUNTWORKERSRESPONSE._serialized_end = 51165 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51168 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51309 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51311 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51343 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51346 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51489 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51491 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51525 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51528 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52705 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52707 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52816 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52819 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53047 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53050 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53366 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53368 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53454 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53456 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53572 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53574 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53683 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53686 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53816 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53819 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54668 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54618 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54668 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54670 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54741 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54744 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54914 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54917 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55228 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55231 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55392 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55395 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55656 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55658 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55773 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55776 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55915 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55917 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55983 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55986 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56223 _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56143 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56215 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56218 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56467 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56225 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56297 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56300 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56549 _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56470 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56619 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56621 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56661 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56664 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56809 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56811 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56847 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56849 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56937 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56939 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56975 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57131 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57133 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57179 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57182 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57334 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57336 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57378 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57380 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57475 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57477 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57516 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57519 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57676 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57679 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57911 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56552 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56701 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56703 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56743 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56746 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56891 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56893 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56929 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56931 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57019 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57021 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57054 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57057 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57213 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57215 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57261 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57264 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57416 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57418 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57460 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57462 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57557 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57559 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57598 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57601 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57758 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57761 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57993 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index 161d051c0..c6a2378a5 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -5205,6 +5205,7 @@ class DescribeWorkflowExecutionResponse(google.protobuf.message.Message): CALLBACKS_FIELD_NUMBER: builtins.int PENDING_NEXUS_OPERATIONS_FIELD_NUMBER: builtins.int WORKFLOW_EXTENDED_INFO_FIELD_NUMBER: builtins.int + CHANNEL_SUBSCRIPTIONS_FIELD_NUMBER: builtins.int @property def execution_config( self, @@ -5245,6 +5246,15 @@ class DescribeWorkflowExecutionResponse(google.protobuf.message.Message): def workflow_extended_info( self, ) -> temporalio.api.workflow.v1.message_pb2.WorkflowExecutionExtendedInfo: ... + @property + def channel_subscriptions( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.workflow.v1.message_pb2.ChannelSubscriptionInfo + ]: + """The notification channels this run stands on: the independent channels it subscribed to and + the channels linked to it that hold any state. Empty when there are none. + """ def __init__( self, *, @@ -5272,6 +5282,10 @@ class DescribeWorkflowExecutionResponse(google.protobuf.message.Message): | None = ..., workflow_extended_info: temporalio.api.workflow.v1.message_pb2.WorkflowExecutionExtendedInfo | None = ..., + channel_subscriptions: collections.abc.Iterable[ + temporalio.api.workflow.v1.message_pb2.ChannelSubscriptionInfo + ] + | None = ..., ) -> None: ... def HasField( self, @@ -5291,6 +5305,8 @@ class DescribeWorkflowExecutionResponse(google.protobuf.message.Message): field_name: typing_extensions.Literal[ "callbacks", b"callbacks", + "channel_subscriptions", + b"channel_subscriptions", "execution_config", b"execution_config", "pending_activities", diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index b06b32ba7..fb31abf6e 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -27,11 +27,13 @@ StartTimer, StreamSetBecameReady, SubscribeNotificationChannel, + UnsubscribeNotificationChannel, UpdateResponse, UpsertWorkflowSearchAttributes, WorkflowCommand, WorkflowOutputStreamBuffered, WorkflowOutputStreamCommit, + WorkflowStreamChannels, WorkflowStreamProgress, WorkflowStreamQuiescent, ) @@ -65,11 +67,13 @@ "StartTimer", "StreamSetBecameReady", "SubscribeNotificationChannel", + "UnsubscribeNotificationChannel", "UpdateResponse", "UpsertWorkflowSearchAttributes", "WorkflowCommand", "WorkflowOutputStreamBuffered", "WorkflowOutputStreamCommit", + "WorkflowStreamChannels", "WorkflowStreamProgress", "WorkflowStreamQuiescent", ] diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 2b2f7535b..9f96ab91c 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xf1\x14\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x42\t\n\x07variant"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x19\n\x17\x43\x61ncelWorkflowExecution"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xaf\x16\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x12\x65\n unsubscribe_notification_channel\x18 \x01(\x0b\x32\x39.coresdk.workflow_commands.UnsubscribeNotificationChannelH\x00\x12U\n\x18workflow_stream_channels\x18! \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamChannelsH\x00\x42\t\n\x07variant"1\n\x1eUnsubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"*\n\x16WorkflowStreamChannels\x12\x10\n\x08\x63hannels\x18\x01 \x03(\t"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x19\n\x17\x43\x61ncelWorkflowExecution"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -56,6 +56,10 @@ _WORKFLOWCOMMAND = DESCRIPTOR.message_types_by_name["WorkflowCommand"] +_UNSUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ + "UnsubscribeNotificationChannel" +] +_WORKFLOWSTREAMCHANNELS = DESCRIPTOR.message_types_by_name["WorkflowStreamChannels"] _SUBSCRIBENOTIFICATIONCHANNEL = DESCRIPTOR.message_types_by_name[ "SubscribeNotificationChannel" ] @@ -146,6 +150,28 @@ ) _sym_db.RegisterMessage(WorkflowCommand) +UnsubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( + "UnsubscribeNotificationChannel", + (_message.Message,), + { + "DESCRIPTOR": _UNSUBSCRIBENOTIFICATIONCHANNEL, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.UnsubscribeNotificationChannel) + }, +) +_sym_db.RegisterMessage(UnsubscribeNotificationChannel) + +WorkflowStreamChannels = _reflection.GeneratedProtocolMessageType( + "WorkflowStreamChannels", + (_message.Message,), + { + "DESCRIPTOR": _WORKFLOWSTREAMCHANNELS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.WorkflowStreamChannels) + }, +) +_sym_db.RegisterMessage(WorkflowStreamChannels) + SubscribeNotificationChannel = _reflection.GeneratedProtocolMessageType( "SubscribeNotificationChannel", (_message.Message,), @@ -610,90 +636,94 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 10153 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 10241 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 10438 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 10526 _WORKFLOWCOMMAND._serialized_start = 525 - _WORKFLOWCOMMAND._serialized_end = 3198 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3200 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3247 - _WORKFLOWSTREAMPROGRESS._serialized_start = 3249 - _WORKFLOWSTREAMPROGRESS._serialized_end = 3326 - _WORKFLOWSTREAMQUIESCENT._serialized_start = 3329 - _WORKFLOWSTREAMQUIESCENT._serialized_end = 3496 - _EXTERNALSTREAMWAIT._serialized_start = 3498 - _EXTERNALSTREAMWAIT._serialized_end = 3585 - _EXTERNALSTREAMPARKRESULT._serialized_start = 3588 - _EXTERNALSTREAMPARKRESULT._serialized_end = 3828 - _PARKSETCONFIRMED._serialized_start = 3830 - _PARKSETCONFIRMED._serialized_end = 3848 - _STREAMSETBECAMEREADY._serialized_start = 3850 - _STREAMSETBECAMEREADY._serialized_end = 3872 - _EXTERNALSTREAMFINALIZED._serialized_start = 3874 - _EXTERNALSTREAMFINALIZED._serialized_end = 3963 - _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 3965 - _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4090 - _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4092 - _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4178 - _STARTTIMER._serialized_start = 4180 - _STARTTIMER._serialized_end = 4263 - _CANCELTIMER._serialized_start = 4265 - _CANCELTIMER._serialized_end = 4291 - _SCHEDULEACTIVITY._serialized_start = 4294 - _SCHEDULEACTIVITY._serialized_end = 5118 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5039 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5118 - _SCHEDULELOCALACTIVITY._serialized_start = 5121 - _SCHEDULELOCALACTIVITY._serialized_end = 5871 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5039 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5118 - _REQUESTCANCELACTIVITY._serialized_start = 5873 - _REQUESTCANCELACTIVITY._serialized_end = 5909 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 5911 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 5952 - _QUERYRESULT._serialized_start = 5955 - _QUERYRESULT._serialized_end = 6111 - _QUERYSUCCESS._serialized_start = 6113 - _QUERYSUCCESS._serialized_end = 6178 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 6180 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 6256 - _FAILWORKFLOWEXECUTION._serialized_start = 6258 - _FAILWORKFLOWEXECUTION._serialized_end = 6332 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6335 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7249 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7092 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7168 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5039 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5118 - _CANCELWORKFLOWEXECUTION._serialized_start = 7251 - _CANCELWORKFLOWEXECUTION._serialized_end = 7276 - _SETPATCHMARKER._serialized_start = 7278 - _SETPATCHMARKER._serialized_end = 7332 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7335 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8509 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5039 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5118 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7092 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7168 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8511 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8585 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8588 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 8730 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 8733 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9132 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5039 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5118 - _CANCELSIGNALWORKFLOW._serialized_start = 9134 - _CANCELSIGNALWORKFLOW._serialized_end = 9169 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9171 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9272 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 9274 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 9353 - _UPDATERESPONSE._serialized_start = 9356 - _UPDATERESPONSE._serialized_end = 9566 - _SCHEDULENEXUSOPERATION._serialized_start = 9569 - _SCHEDULENEXUSOPERATION._serialized_end = 10107 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10057 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10107 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 10109 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 10151 + _WORKFLOWCOMMAND._serialized_end = 3388 + _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3390 + _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3439 + _WORKFLOWSTREAMCHANNELS._serialized_start = 3441 + _WORKFLOWSTREAMCHANNELS._serialized_end = 3483 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3485 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3532 + _WORKFLOWSTREAMPROGRESS._serialized_start = 3534 + _WORKFLOWSTREAMPROGRESS._serialized_end = 3611 + _WORKFLOWSTREAMQUIESCENT._serialized_start = 3614 + _WORKFLOWSTREAMQUIESCENT._serialized_end = 3781 + _EXTERNALSTREAMWAIT._serialized_start = 3783 + _EXTERNALSTREAMWAIT._serialized_end = 3870 + _EXTERNALSTREAMPARKRESULT._serialized_start = 3873 + _EXTERNALSTREAMPARKRESULT._serialized_end = 4113 + _PARKSETCONFIRMED._serialized_start = 4115 + _PARKSETCONFIRMED._serialized_end = 4133 + _STREAMSETBECAMEREADY._serialized_start = 4135 + _STREAMSETBECAMEREADY._serialized_end = 4157 + _EXTERNALSTREAMFINALIZED._serialized_start = 4159 + _EXTERNALSTREAMFINALIZED._serialized_end = 4248 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 4250 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4375 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4377 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4463 + _STARTTIMER._serialized_start = 4465 + _STARTTIMER._serialized_end = 4548 + _CANCELTIMER._serialized_start = 4550 + _CANCELTIMER._serialized_end = 4576 + _SCHEDULEACTIVITY._serialized_start = 4579 + _SCHEDULEACTIVITY._serialized_end = 5403 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5324 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5403 + _SCHEDULELOCALACTIVITY._serialized_start = 5406 + _SCHEDULELOCALACTIVITY._serialized_end = 6156 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5324 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5403 + _REQUESTCANCELACTIVITY._serialized_start = 6158 + _REQUESTCANCELACTIVITY._serialized_end = 6194 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 6196 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 6237 + _QUERYRESULT._serialized_start = 6240 + _QUERYRESULT._serialized_end = 6396 + _QUERYSUCCESS._serialized_start = 6398 + _QUERYSUCCESS._serialized_end = 6463 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 6465 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 6541 + _FAILWORKFLOWEXECUTION._serialized_start = 6543 + _FAILWORKFLOWEXECUTION._serialized_end = 6617 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6620 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7534 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7377 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7453 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5324 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5403 + _CANCELWORKFLOWEXECUTION._serialized_start = 7536 + _CANCELWORKFLOWEXECUTION._serialized_end = 7561 + _SETPATCHMARKER._serialized_start = 7563 + _SETPATCHMARKER._serialized_end = 7617 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7620 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8794 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5324 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5403 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7377 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7453 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8796 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8870 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8873 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9015 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9018 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9417 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5324 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5403 + _CANCELSIGNALWORKFLOW._serialized_start = 9419 + _CANCELSIGNALWORKFLOW._serialized_end = 9454 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9456 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9557 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 9559 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 9638 + _UPDATERESPONSE._serialized_start = 9641 + _UPDATERESPONSE._serialized_end = 9851 + _SCHEDULENEXUSOPERATION._serialized_start = 9854 + _SCHEDULENEXUSOPERATION._serialized_end = 10392 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10342 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10392 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 10394 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 10436 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 9ff296f75..958032576 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -109,6 +109,8 @@ class WorkflowCommand(google.protobuf.message.Message): WORKFLOW_OUTPUT_STREAM_COMMIT_FIELD_NUMBER: builtins.int WORKFLOW_OUTPUT_STREAM_BUFFERED_FIELD_NUMBER: builtins.int SUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int + UNSUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int + WORKFLOW_STREAM_CHANNELS_FIELD_NUMBER: builtins.int @property def user_metadata(self) -> temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata: """User metadata that may or may not be persisted into history depending on the command type. @@ -191,6 +193,12 @@ class WorkflowCommand(google.protobuf.message.Message): def subscribe_notification_channel( self, ) -> global___SubscribeNotificationChannel: ... + @property + def unsubscribe_notification_channel( + self, + ) -> global___UnsubscribeNotificationChannel: ... + @property + def workflow_stream_channels(self) -> global___WorkflowStreamChannels: ... def __init__( self, *, @@ -234,6 +242,9 @@ class WorkflowCommand(google.protobuf.message.Message): | None = ..., subscribe_notification_channel: global___SubscribeNotificationChannel | None = ..., + unsubscribe_notification_channel: global___UnsubscribeNotificationChannel + | None = ..., + workflow_stream_channels: global___WorkflowStreamChannels | None = ..., ) -> None: ... def HasField( self, @@ -284,6 +295,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "unsubscribe_notification_channel", + b"unsubscribe_notification_channel", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -296,6 +309,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"workflow_output_stream_buffered", "workflow_output_stream_commit", b"workflow_output_stream_commit", + "workflow_stream_channels", + b"workflow_stream_channels", "workflow_stream_progress", b"workflow_stream_progress", "workflow_stream_quiescent", @@ -351,6 +366,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "unsubscribe_notification_channel", + b"unsubscribe_notification_channel", "update_response", b"update_response", "upsert_workflow_search_attributes", @@ -363,6 +380,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"workflow_output_stream_buffered", "workflow_output_stream_commit", b"workflow_output_stream_commit", + "workflow_stream_channels", + b"workflow_stream_channels", "workflow_stream_progress", b"workflow_stream_progress", "workflow_stream_quiescent", @@ -402,12 +421,70 @@ class WorkflowCommand(google.protobuf.message.Message): "workflow_output_stream_commit", "workflow_output_stream_buffered", "subscribe_notification_channel", + "unsubscribe_notification_channel", + "workflow_stream_channels", ] | None ): ... global___WorkflowCommand = WorkflowCommand +class UnsubscribeNotificationChannel(google.protobuf.message.Message): + """End this workflow's subscription to a notification channel. Notifications + already recorded on a scheduled event still reach that Workflow Task. + + The server records the event whether or not the run held a subscription, so + every command has an event to match on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNEL_FIELD_NUMBER: builtins.int + channel: builtins.str + """Name of the channel, scoped to the namespace.""" + def __init__( + self, + *, + channel: builtins.str = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channel", b"channel"] + ) -> None: ... + +global___UnsubscribeNotificationChannel = UnsubscribeNotificationChannel + +class WorkflowStreamChannels(google.protobuf.message.Message): + """The complete set of notification channels the run listens on, one per open external stream + reader, in a stable order replay reproduces. + + Core subscribes the run to a channel it has not yet subscribed on the completion that ends the + Workflow Task, after the progress marker and never on a run-ending completion. Issued from the + activation that opened the reader, the server-bound subscribe command would end a task that + was meant to stay retained. Reported on every completion once a reader has been opened, the + empty set included: an absent command leaves Core's view unchanged, which is what the park and + finalization answers rely on. Carries no retention request of its own. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CHANNELS_FIELD_NUMBER: builtins.int + @property + def channels( + self, + ) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[ + builtins.str + ]: ... + def __init__( + self, + *, + channels: collections.abc.Iterable[builtins.str] | None = ..., + ) -> None: ... + def ClearField( + self, field_name: typing_extensions.Literal["channels", b"channels"] + ) -> None: ... + +global___WorkflowStreamChannels = WorkflowStreamChannels + class SubscribeNotificationChannel(google.protobuf.message.Message): """Subscribe this workflow to a notification channel, so the scheduled event of each later Workflow Task carries the notifications folded for it. diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index c6af51752..4afe3e5d4 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit c6af517523500ed33a42a4b35220459f1f0bee00 +Subproject commit 4afe3e5d40eaee6ae44969cbfd7d0e773a62804f From 47956526998c166ba3d7c461912ede8700c9b618 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:44:49 -0700 Subject: [PATCH 805/831] Reported the readers' channels instead of subscribing to them. The subscribe command is server-bound, so the task that opened the first reader could never be retained or parked. The run reports the complete set of channels its open readers listen on with `WorkflowStreamChannels` on every completion, and Core subscribes and unsubscribes on the completion that ends the task. The eight retained-first-task cases run on every channel server. --- .../contrib/external_workflow_streams/_api.py | 8 +- .../external_workflow_streams/_runtime.py | 15 + temporalio/worker/_workflow.py | 9 +- temporalio/worker/_workflow_instance.py | 94 +++- .../external_workflow_streams/conftest.py | 37 +- .../test_channel_report.py | 425 ++++++++++++++++++ .../test_channels.py | 16 +- .../test_delivery_budget.py | 3 + .../test_output_worker_integration.py | 2 - .../test_replay_end_to_end.py | 2 - .../test_rollover_integration.py | 1 - .../test_worker_crash.py | 1 - .../test_worker_handoff.py | 2 - 13 files changed, 556 insertions(+), 59 deletions(-) create mode 100644 tests/contrib/external_workflow_streams/test_channel_report.py diff --git a/temporalio/contrib/external_workflow_streams/_api.py b/temporalio/contrib/external_workflow_streams/_api.py index e8d3e560d..f69674c25 100644 --- a/temporalio/contrib/external_workflow_streams/_api.py +++ b/temporalio/contrib/external_workflow_streams/_api.py @@ -309,10 +309,10 @@ def subscribe(self) -> ExternalStreamSubscription[AnyType]: idle_timeout=self.options.idle_timeout, ) # The channel the stream's writers notify. Asked of the SDK's object for - # the Run rather than of the stream runtime, because the answer may be - # a command and commands are the Run's to emit; it also decides, from - # the server it talks to, whether the Run is the channel's listener - # already or has to subscribe. + # the Run rather than of the stream runtime, because the answer is part + # of the Run's completion and completions are the Run's to emit; it + # also decides, from the server it talks to, whether the Run is the + # channel's listener already or has to be subscribed. subscribe = getattr(_run_holder(), "subscribe_stream_channel", None) if subscribe is not None: subscribe(channel_for(stream_key)) diff --git a/temporalio/contrib/external_workflow_streams/_runtime.py b/temporalio/contrib/external_workflow_streams/_runtime.py index 5cb4d5a1c..9e7c5e53a 100644 --- a/temporalio/contrib/external_workflow_streams/_runtime.py +++ b/temporalio/contrib/external_workflow_streams/_runtime.py @@ -2135,6 +2135,21 @@ def effective_idle_timeout(self) -> timedelta: reduced = min(reduced, state.idle_timeout) return reduced + def listened_stream_keys(self) -> list[StreamKey]: + """The stream of every reader still open, in ``wait_id`` order. + + What the run's channel report is built from. A reader that has not + blocked yet is open: records appended before its first iteration have + to wake the run as much as later ones. A closed reader has left, so its + stream is not listened on even though its state is kept for replay and + for the Continue-As-New cursor. + """ + return [ + state.stream_key + for _, state in sorted(self._subscriptions.items()) + if not state.closed + ] + # --- teardown ------------------------------------------------------------- def subscriptions(self) -> list[int]: diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index f67a8ab5e..421b57cd0 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -104,8 +104,15 @@ def _try_buffer_external_output( and commands[0].HasField("external_stream_park_result") and commands[0].external_stream_park_result.HasField("became_ready") ) + # The channel report rides every completion and asks nothing of the + # server, so it does not make a quiescent completion anything else. quiescent = "workflow_stream_quiescent" in variants and all( - variant in ("workflow_stream_progress", "workflow_stream_quiescent") + variant + in ( + "workflow_stream_progress", + "workflow_stream_quiescent", + "workflow_stream_channels", + ) for variant in variants ) if not became_ready and not quiescent: diff --git a/temporalio/worker/_workflow_instance.py b/temporalio/worker/_workflow_instance.py index 58a36ef92..cd46317b4 100644 --- a/temporalio/worker/_workflow_instance.py +++ b/temporalio/worker/_workflow_instance.py @@ -18,6 +18,7 @@ from collections.abc import ( Awaitable, Callable, + Collection, Coroutine, Generator, Iterable, @@ -363,6 +364,14 @@ def __init__(self, det: WorkflowInstanceDetails) -> None: #: ``subscribe_stream_channel``. self._stream_channels_enabled: bool | None = None self._stream_channels_linked = False + #: Whether a stream reader has been opened on a server with channels. + #: From then on every completion reports the channels the run + #: listens on, the empty set included, and Core keeps the server's + #: subscriptions in step with the report. + self._stream_channels_reporting = False + #: The last report, so a notification on a channel the readers + #: listen on is told from one nobody asked for. + self._stream_channels: list[str] = [] self._primary_task: asyncio.Task[None] | None = None self._cancel_primary_task_pending = False self._time_ns = 0 @@ -995,10 +1004,10 @@ def _apply_notifications_received( for proto in job.notifications: if proto.HasField("linked_to"): subscriptions = self._linked_channel_subscriptions - listened = self._linked_channels + listened: Collection[str] = self._linked_channels else: subscriptions = self._channel_subscriptions - listened = self._subscribed_channels + listened = self._subscribed_channels.union(self._stream_channels) subscription = subscriptions.get(proto.channel) if subscription is not None: subscription._deliver( @@ -1044,21 +1053,29 @@ def subscribe_stream_channel(self, address: Any) -> bool: The external-stream runtime's entry, gated where the public :py:func:`temporalio.workflow.subscribe_channel` is not: a reader opens on whatever server the Worker talks to, and a server without channels - fails a Workflow Task that carries the command. The Worker asks the + fails a Workflow Task that carries a subscription. The Worker asks the server once and the answer becomes two lang flags, read here on the run's first stream subscription and kept until continue-as-new, so a replay takes the path the live run took. - With the linked kind a stream owned by this workflow needs no command: - its channel lives in this run's state and the run is its listener by - construction, so the task that opens the reader can stay retained. - A stream with another owner, or no owner, listens on the independent - channel of its name by command. + No command is issued here. The subscribe command is server-bound, so + a completion carrying it cannot be retained, and the task that opens + a reader is the one that should stay open and park. Instead every + completion from now on reports the channels of the open readers in + ``WorkflowStreamChannels``, and Core subscribes the new ones on the + completion that ends the task, after the progress marker, and + unsubscribes the ones whose readers have gone; see + :meth:`_report_stream_channels`. + + With the linked kind a stream owned by this workflow is not reported + at all: its channel lives in this run's state and the run is its + listener by construction. A stream with another owner, or no owner, + listens on the independent channel of its name. Returns whether the run listens on the channel after this call. """ channel: str = address.channel - if channel in self._subscribed_channels or channel in self._linked_channels: + if channel in self._linked_channels: return True if self._read_only: return False @@ -1072,15 +1089,48 @@ def subscribe_stream_channel(self, address: Any) -> bool: ) if not self._stream_channels_enabled: return False + self._stream_channels_reporting = True if ( self._stream_channels_linked and address.workflow_id == self._info.workflow_id ): self._linked_channels.add(channel) - return True - self._issue_channel_subscription(channel) return True + def _stream_channel_name(self, stream_key: Any) -> str | None: + """The channel an open reader's stream is listened on. + + ``None`` for a stream this run is the listener of by construction. + """ + from temporalio.contrib.external_workflow_streams._wake import channel_for + + address = channel_for(stream_key) + if ( + self._stream_channels_linked + and address.workflow_id == self._info.workflow_id + ): + return None + return address.channel + + def _report_stream_channels(self, runtime: Any) -> None: + """Puts the complete set of channels the open readers listen on in the + completion. + + Emitted on every completion once a reader has been opened on a server + with channels, the empty set included: Core treats an absent report as + unchanged, and only the latest report counts, so a reader opened and + closed inside one task is never subscribed. The order is the readers' + ``wait_id`` order with repeats dropped, which replay reproduces, and + Core issues the subscribes in it. + """ + channels: list[str] = [] + for stream_key in runtime.listened_stream_keys(): + channel = self._stream_channel_name(stream_key) + if channel is not None and channel not in channels: + channels.append(channel) + self._stream_channels = channels + self._add_command().workflow_stream_channels.channels.extend(channels) + def _issue_channel_subscription(self, channel: str) -> None: """Emits the subscribe command once per channel per run. @@ -2965,6 +3015,13 @@ def _emit_external_stream_commands(self) -> None: # the consumed data. commands.insert(0, progress) + # Whether or not anything is blocked, and on replay too: the report + # is what Core derives the server's subscriptions from, and a task + # that read a record and then scheduled an activity leaves with no + # snapshot but still with readers to keep listening for. + if self._stream_channels_reporting: + self._report_stream_channels(runtime) + if not snapshot: return @@ -4751,15 +4808,16 @@ class _WorkflowLogicFlag(IntEnum): RAISE_ON_CANCELLING_COMPLETED_ACTIVITY = 1 PROCESS_WORKFLOW_ACTIVATION_JOBS_AS_SINGLE_BATCH = 2 - # Whether the run's external-stream readers subscribe to their channels. - # Set by the Worker from one probe of the server; a run reads it on its - # first stream subscription and keeps that answer until continue-as-new. - # Numbered away from the values upstream hands out in sequence, so a flag - # the main SDK adds later cannot read a History written with this one. + # Whether the run reports the channels its external-stream readers listen + # on, for Core to subscribe it to. Set by the Worker from one probe of the + # server; a run reads it on its first stream subscription and keeps that + # answer until continue-as-new. Numbered away from the values upstream + # hands out in sequence, so a flag the main SDK adds later cannot read a + # History written with this one. SUBSCRIBE_NOTIFICATION_CHANNELS = 100 # Whether a stream this workflow owns listens on its linked channel, which - # needs no command, rather than subscribing to the independent one. Set - # with the flag above from the same probe and read with it. + # needs no subscription, rather than on the independent one. Set with the + # flag above from the same probe and read with it. LINKED_NOTIFICATION_CHANNELS = 101 diff --git a/tests/contrib/external_workflow_streams/conftest.py b/tests/contrib/external_workflow_streams/conftest.py index 252dc4747..6b35d9bf2 100644 --- a/tests/contrib/external_workflow_streams/conftest.py +++ b/tests/contrib/external_workflow_streams/conftest.py @@ -38,6 +38,20 @@ def pytest_configure(config: pytest.Config) -> None: "to a workflow, named with -E host:port; the case skips itself on one " "with only independent channels", ) + config.addinivalue_line( + "markers", + "needs_unsubscribe_server: the case needs a server that accepts the " + "unsubscribe-notification-channel command, named with -E host:port; an " + "older channel server fails the Workflow Task that carries it", + ) + + +#: The markers naming a server capability the suite's own servers lack. +_CHANNEL_SERVER_MARKERS = ( + "needs_channel_server", + "needs_linked_server", + "needs_unsubscribe_server", +) def pytest_collection_modifyitems( @@ -49,9 +63,7 @@ def pytest_collection_modifyitems( reason="needs a server that serves notification channels; name one with -E" ) for item in items: - if item.get_closest_marker("needs_channel_server") or item.get_closest_marker( - "needs_linked_server" - ): + if any(item.get_closest_marker(marker) for marker in _CHANNEL_SERVER_MARKERS): item.add_marker(skip) @@ -81,25 +93,6 @@ async def server_channel_support(client: Any) -> Any: await handle.terminate() -@pytest_asyncio.fixture # type: ignore[reportUntypedFunctionDecorator] -async def first_task_retained(client: object) -> None: - """Holds a case to servers where the task that opens a reader stays open. - - On a server whose channels are all independent that task carries the - subscribe command, which Core cannot retain or park, so a case built on a - retained or parked first task measures nothing there. With the linked - kind a workflow-owned stream needs no command and the task stays open, as - it does on a server without channels. - """ - from temporalio.contrib.external_workflow_streams._wake import ChannelSupport - - if await server_channel_support(client) is ChannelSupport.INDEPENDENT: - pytest.skip( - "the subscribe command ends the task that opens the first reader; " - "the linked channel kind keeps it open" - ) - - @pytest.fixture(autouse=True) def skip_under_time_skipping(request: pytest.FixtureRequest) -> None: """Hold the server-backed cases to a clock the tests can reason about. diff --git a/tests/contrib/external_workflow_streams/test_channel_report.py b/tests/contrib/external_workflow_streams/test_channel_report.py new file mode 100644 index 000000000..cc4b13370 --- /dev/null +++ b/tests/contrib/external_workflow_streams/test_channel_report.py @@ -0,0 +1,425 @@ +"""The channel report: what a run tells Core its readers listen on. + +Driven with activations directly, the way Core drives the instance, over a +real stream runtime on the memory backend, so the report is built from the +readers the runtime holds open exactly as the Worker's would be. Core keeps +the server's subscriptions in step with the report, so what is pinned down +here is the report alone: when it goes out, what it carries and in which +order, and that the external runtime no longer issues the subscribe command +itself. +""" + +from __future__ import annotations + +import logging +from collections.abc import AsyncIterator, Iterable +from datetime import datetime, timedelta, timezone +from typing import Any + +import pytest + +import temporalio.api.common.v1 +import temporalio.api.notification.v1 +import temporalio.bridge.proto.workflow_activation +import temporalio.bridge.proto.workflow_completion +import temporalio.common +import temporalio.converter +from temporalio import workflow +from temporalio.contrib.external_workflow_streams import external_stream +from temporalio.contrib.external_workflow_streams._manager import ( + ReadinessResult, + StreamSubscriptionManager, +) +from temporalio.contrib.external_workflow_streams._runtime import WorkflowStreamRuntime +from temporalio.contrib.external_workflow_streams._wake import channel_for +from temporalio.worker._workflow import _WorkflowWorker +from temporalio.worker._workflow_instance import ( + UnsandboxedWorkflowRunner, + WorkflowInstance, + WorkflowInstanceDetails, + _WorkflowLogicFlag, +) +from tests.contrib.external_workflow_streams.memory_backend import MemoryStreamBackend + +WorkflowActivation = temporalio.bridge.proto.workflow_activation.WorkflowActivation +WorkflowActivationJob = ( + temporalio.bridge.proto.workflow_activation.WorkflowActivationJob +) +WorkflowActivationCompletion = ( + temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion +) +Notification = temporalio.api.notification.v1.Notification +INDEPENDENT = _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS +LINKED = _WorkflowLogicFlag.LINKED_NOTIFICATION_CHANNELS +RUN_ID = "run" +WORKFLOW_ID = "wf" + + +@workflow.defn +class OpenThenWait: + """Opens a reader without blocking on it, waits, closes it, waits again. + + The reader is open across the first task and gone across the second, + while neither task blocks on a stream, so both completions leave with a + timer and no quiescent snapshot. + """ + + @workflow.run + async def run(self) -> None: + reader = external_stream.topic("tokens", type=str).subscribe() + await workflow.sleep(60) + reader.close() + await workflow.sleep(60) + + +@workflow.defn +class ReadOne: + """Blocks on a reader until its first value arrives.""" + + @workflow.run + async def run(self) -> str: + async for value in external_stream.topic("tokens", type=str).subscribe(): + return value + return "" + + +@workflow.defn +class SleepThenRead: + """Waits on a timer before opening any reader.""" + + @workflow.run + async def run(self) -> str: + await workflow.sleep(60) + async for value in external_stream.topic("tokens", type=str).subscribe(): + return value + return "" + + +@workflow.defn +class ThreeReaders: + """Opens readers on two streams, the first of them twice, then waits.""" + + @workflow.run + async def run(self) -> None: + external_stream.topic("b", type=str).subscribe() + external_stream.topic("a", type=str).subscribe() + external_stream.topic("b", type=str).subscribe() + await workflow.sleep(60) + + +async def _accept(run_id: str, wait_id: int, generation: int) -> str: + del run_id, wait_id, generation + return ReadinessResult.ACCEPTED + + +@pytest.fixture +async def manager() -> AsyncIterator[StreamSubscriptionManager]: + manager = StreamSubscriptionManager( + backend=MemoryStreamBackend(), + notify_ready=_accept, + watch_block=timedelta(milliseconds=10), + ) + try: + yield manager + finally: + await manager.shutdown() + + +def _runtime(manager: StreamSubscriptionManager) -> WorkflowStreamRuntime: + return WorkflowStreamRuntime( + manager=manager, + backend=manager._backend, + run_id=RUN_ID, + namespace="default", + workflow_id=WORKFLOW_ID, + first_execution_run_id=RUN_ID, + data_converter=temporalio.converter.DataConverter.default, + default_idle_timeout=timedelta(seconds=1), + ) + + +def _instance( + workflow_class: type, + runtime: WorkflowStreamRuntime, + flags: Iterable[_WorkflowLogicFlag] = (), +) -> WorkflowInstance: + """Build an instance the way the worker does, with its stream runtime. + + Needs a running event loop, since the constructor puts the runtime on it. + ``flags`` are the lang flags the Worker would default on from its probe. + """ + defn = workflow._Definition.must_from_class(workflow_class) + now = datetime.now(timezone.utc) + info = workflow.Info( + attempt=1, + continued_run_id=None, + cron_schedule=None, + execution_timeout=None, + first_execution_run_id=RUN_ID, + headers={}, + namespace="default", + parent=None, + root=None, + priority=temporalio.common.Priority.default, + raw_memo={}, + retry_policy=None, + run_id=RUN_ID, + run_timeout=None, + search_attributes={}, + start_time=now, + task_queue="tq", + task_timeout=timedelta(seconds=10), + typed_search_attributes=temporalio.common.TypedSearchAttributes.empty, + workflow_id=WORKFLOW_ID, + workflow_start_time=now, + workflow_type=defn.name or "", + ) + converter = temporalio.converter.DataConverter.default + return UnsandboxedWorkflowRunner().create_instance( + WorkflowInstanceDetails( + payload_converter_factory=converter._new_payload_converter, + failure_converter_class=converter.failure_converter_class, + interceptor_classes=[], + defn=defn, + info=info, + randomness_seed=0, + extern_functions={}, + disable_eager_activity_execution=False, + worker_level_failure_exception_types=[], + patch_activation_callback=None, + last_completion_result=temporalio.api.common.v1.Payloads(), + last_failure=None, + default_workflow_logic_flags=frozenset(flags), + external_stream_runtime=runtime, + external_streams_configured=True, + ) + ) + + +def _start( + workflow_class: type, recorded_flags: Iterable[_WorkflowLogicFlag] = () +) -> WorkflowActivation: + """The run's first activation, a replay when ``recorded_flags`` is given.""" + job = WorkflowActivationJob() + init = job.initialize_workflow + init.workflow_type = workflow._Definition.must_from_class(workflow_class).name or "" + init.workflow_id = WORKFLOW_ID + init.first_execution_run_id = RUN_ID + recorded = [int(flag) for flag in recorded_flags] + return WorkflowActivation( + run_id=RUN_ID, + jobs=[job], + is_replaying=bool(recorded), + available_internal_flags=recorded, + ) + + +def _timer_fired(seq: int) -> WorkflowActivation: + job = WorkflowActivationJob() + job.fire_timer.seq = seq + return WorkflowActivation(run_id=RUN_ID, jobs=[job]) + + +def _notified(*notifications: Notification) -> WorkflowActivation: + job = WorkflowActivationJob() + job.notifications_received.notifications.extend(notifications) + return WorkflowActivation(run_id=RUN_ID, jobs=[job]) + + +def _variants(completion: WorkflowActivationCompletion) -> list[str]: + assert completion.HasField("successful"), completion.failed.failure.message + return [ + command.WhichOneof("variant") or "" + for command in completion.successful.commands + ] + + +def _reported(completion: WorkflowActivationCompletion) -> list[str] | None: + """The channel report, or ``None`` when the completion carries none.""" + assert completion.HasField("successful"), completion.failed.failure.message + reports = [ + list(command.workflow_stream_channels.channels) + for command in completion.successful.commands + if command.HasField("workflow_stream_channels") + ] + assert len(reports) <= 1, "one report per completion" + return reports[0] if reports else None + + +def _subscribed(completion: WorkflowActivationCompletion) -> list[str]: + return [ + command.subscribe_notification_channel.channel + for command in completion.successful.commands + if command.HasField("subscribe_notification_channel") + ] + + +def _channel(runtime: WorkflowStreamRuntime, stream: str) -> str: + return channel_for(runtime.stream_key(stream)).channel + + +async def test_the_report_goes_out_on_a_completion_without_a_snapshot( + manager: StreamSubscriptionManager, +) -> None: + """A reader that is open but not blocked on is still listened for.""" + runtime = _runtime(manager) + instance = _instance(OpenThenWait, runtime, flags=[INDEPENDENT]) + completion = instance.activate(_start(OpenThenWait)) + assert "start_timer" in _variants(completion) + assert "workflow_stream_quiescent" not in _variants(completion) + assert _reported(completion) == [_channel(runtime, "tokens")] + assert _subscribed(completion) == [] + + +async def test_the_report_goes_out_with_a_snapshot( + manager: StreamSubscriptionManager, +) -> None: + runtime = _runtime(manager) + instance = _instance(ReadOne, runtime, flags=[INDEPENDENT]) + completion = instance.activate(_start(ReadOne)) + assert "workflow_stream_quiescent" in _variants(completion) + assert _reported(completion) == [_channel(runtime, "tokens")] + assert _subscribed(completion) == [] + + +async def test_the_report_is_absent_before_any_reader_opened( + manager: StreamSubscriptionManager, +) -> None: + """Absent means unchanged to Core, and nothing has changed yet.""" + runtime = _runtime(manager) + instance = _instance(SleepThenRead, runtime, flags=[INDEPENDENT]) + completion = instance.activate(_start(SleepThenRead)) + assert _variants(completion) == ["start_timer"] + assert _reported(completion) is None + completion = instance.activate(_timer_fired(1)) + assert _reported(completion) == [_channel(runtime, "tokens")] + + +async def test_the_report_carries_the_empty_set_after_the_last_reader_closes( + manager: StreamSubscriptionManager, +) -> None: + """Empty is a report, not an absence: it is what Core unsubscribes from.""" + runtime = _runtime(manager) + instance = _instance(OpenThenWait, runtime, flags=[INDEPENDENT]) + instance.activate(_start(OpenThenWait)) + completion = instance.activate(_timer_fired(1)) + assert "start_timer" in _variants(completion) + assert _reported(completion) == [] + + +async def test_the_report_orders_channels_by_reader_and_names_each_once( + manager: StreamSubscriptionManager, +) -> None: + runtime = _runtime(manager) + instance = _instance(ThreeReaders, runtime, flags=[INDEPENDENT]) + completion = instance.activate(_start(ThreeReaders)) + assert _reported(completion) == [_channel(runtime, "b"), _channel(runtime, "a")] + + +async def test_a_linked_server_reports_nothing_for_the_runs_own_streams( + manager: StreamSubscriptionManager, +) -> None: + """The owner is the listener by construction, so there is nothing to subscribe.""" + runtime = _runtime(manager) + instance = _instance(ReadOne, runtime, flags=[INDEPENDENT, LINKED]) + completion = instance.activate(_start(ReadOne)) + assert "workflow_stream_quiescent" in _variants(completion) + assert _reported(completion) == [] + assert _subscribed(completion) == [] + + +async def test_a_server_without_channels_gets_no_report( + manager: StreamSubscriptionManager, +) -> None: + runtime = _runtime(manager) + instance = _instance(ReadOne, runtime) + completion = instance.activate(_start(ReadOne)) + assert "workflow_stream_quiescent" in _variants(completion) + assert _reported(completion) is None + assert _subscribed(completion) == [] + + +async def test_a_replay_reports_what_the_live_run_did( + manager: StreamSubscriptionManager, +) -> None: + """Core matches the recorded subscribed event from the replayed report.""" + runtime = _runtime(manager) + instance = _instance(ReadOne, runtime) + completion = instance.activate(_start(ReadOne, recorded_flags=[INDEPENDENT])) + assert _reported(completion) == [_channel(runtime, "tokens")] + assert _subscribed(completion) == [] + + +class _BareWorker: + """Only the two things ``_handle_external_stream_jobs`` reaches for.""" + + def __init__(self, runtime: WorkflowStreamRuntime, manager: object) -> None: + self._external_stream_runtimes = {RUN_ID: runtime} + self._manager = manager + + def _stream_manager(self) -> object: + return self._manager + + +def _park_job(quiescence_generation: int, *wait_ids: int) -> WorkflowActivation: + activation = WorkflowActivation(run_id=RUN_ID) + job = activation.jobs.add().prepare_external_stream_park + job.quiescence_generation = quiescence_generation + for wait_id in wait_ids: + job.waits.add().wait_id = wait_id + return activation + + +def _finalize_job(quiescence_generation: int) -> WorkflowActivation: + activation = WorkflowActivation(run_id=RUN_ID) + job = activation.jobs.add().finalize_external_streams + job.quiescence_generation = quiescence_generation + return activation + + +async def test_the_park_and_finalize_answers_carry_no_report( + manager: StreamSubscriptionManager, +) -> None: + """Those answers run no Workflow code, so Core keeps the last report.""" + runtime = _runtime(manager) + instance = _instance(ReadOne, runtime, flags=[INDEPENDENT]) + assert _reported(instance.activate(_start(ReadOne))) is not None + worker: Any = _BareWorker(runtime, manager) + + parked = await _WorkflowWorker._handle_external_stream_jobs( + worker, + _park_job(1, 1), + None, # type: ignore[arg-type] + ) + assert parked is not None + assert _variants(parked) == ["external_stream_park_result"] + + finalized = await _WorkflowWorker._handle_external_stream_jobs( + worker, + _finalize_job(1), + None, # type: ignore[arg-type] + ) + assert finalized is not None + assert _variants(finalized) == ["external_stream_finalized"] + + +async def test_a_notification_on_a_reported_channel_is_the_runs_concern( + manager: StreamSubscriptionManager, caplog: pytest.LogCaptureFixture +) -> None: + """The report, not a command, says which channels the run listens on.""" + runtime = _runtime(manager) + instance = _instance(ReadOne, runtime, flags=[INDEPENDENT]) + instance.activate(_start(ReadOne)) + with caplog.at_level(logging.DEBUG, logger="temporalio.worker._workflow_instance"): + instance.activate( + _notified( + Notification(channel=_channel(runtime, "tokens"), counter=1), + Notification(channel="other", counter=1), + ) + ) + dropped = [ + record.getMessage() + for record in caplog.records + if "Dropping a notification" in record.getMessage() + ] + assert len(dropped) == 1 and "'other'" in dropped[0], dropped diff --git a/tests/contrib/external_workflow_streams/test_channels.py b/tests/contrib/external_workflow_streams/test_channels.py index 104eeb8ce..420e92193 100644 --- a/tests/contrib/external_workflow_streams/test_channels.py +++ b/tests/contrib/external_workflow_streams/test_channels.py @@ -387,7 +387,10 @@ async def test_a_stream_the_run_owns_listens_on_its_linked_channel_without_a_com assert _used_flags(completion) == {int(INDEPENDENT), int(LINKED)} -async def test_a_stream_with_another_owner_subscribes_by_command_on_a_linked_server(): +async def test_a_stream_with_another_owner_is_listened_on_by_report_on_a_linked_server(): + """No command of its own either way: the run's channel report, built from + the stream runtime's open readers on every completion, is what Core + subscribes from. See ``test_channel_report`` for the report itself.""" # Both built before either runs: a completed run leaves no loop to build on. another_owner = _instance(ListenOnStream, flags=[INDEPENDENT, LINKED]) no_owner = _instance(ListenOnStream, flags=[INDEPENDENT, LINKED]) @@ -395,17 +398,18 @@ async def test_a_stream_with_another_owner_subscribes_by_command_on_a_linked_ser _start(ListenOnStream, "external-stream/x", "other") ) assert _result(completion) is True - assert _subscribed(completion) == ["external-stream/x"] + assert _subscribed(completion) == [] # A stream nobody owns does the same. completion = no_owner.activate(_start(ListenOnStream, "standalone/x", "")) - assert _subscribed(completion) == ["standalone/x"] + assert _result(completion) is True + assert _subscribed(completion) == [] -async def test_a_server_with_only_independent_channels_takes_the_command(): +async def test_a_server_with_only_independent_channels_listens_by_report(): instance = _instance(ListenOnStream, flags=[INDEPENDENT]) completion = instance.activate(_start(ListenOnStream, "external-stream/x", "wf")) assert _result(completion) is True - assert _subscribed(completion) == ["external-stream/x"] + assert _subscribed(completion) == [] assert _used_flags(completion) == {int(INDEPENDENT)} @@ -436,7 +440,7 @@ async def test_a_replay_takes_the_path_the_live_run_recorded(): _start(ListenOnStream, "external-stream/x", "wf", recorded_flags=[INDEPENDENT]) ) assert _result(completion) is True - assert _subscribed(completion) == ["external-stream/x"] + assert _subscribed(completion) == [] def test_a_channel_call_names_the_workflow_it_is_linked_to(): diff --git a/tests/contrib/external_workflow_streams/test_delivery_budget.py b/tests/contrib/external_workflow_streams/test_delivery_budget.py index 3c766417b..06681da96 100644 --- a/tests/contrib/external_workflow_streams/test_delivery_budget.py +++ b/tests/contrib/external_workflow_streams/test_delivery_budget.py @@ -950,6 +950,9 @@ def __init__(self, runtime: Any, *, replaying: bool = False) -> None: self._external_stream_runtime = runtime self._deleting = False self._is_replaying = replaying + # No reader has been opened on a server with channels, so the + # completion carries no channel report; the report has its own tests. + self._stream_channels_reporting = False import temporalio.bridge.proto.workflow_completion self._current_completion = ( diff --git a/tests/contrib/external_workflow_streams/test_output_worker_integration.py b/tests/contrib/external_workflow_streams/test_output_worker_integration.py index 7ff967ca5..668697f58 100644 --- a/tests/contrib/external_workflow_streams/test_output_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_output_worker_integration.py @@ -536,7 +536,6 @@ async def read_all() -> list[str]: assert b"workflow-output-secret" not in envelope.payloads[0].data -@pytest.mark.usefixtures("first_task_retained") async def test_output_latency_flushes_a_retained_workflow_task( client: Client, ) -> None: @@ -1204,7 +1203,6 @@ async def wait_for_replacement_stage() -> None: @pytest.mark.timeout(90) -@pytest.mark.usefixtures("first_task_retained") async def test_output_deadline_wins_park_race_and_removes_every_intent( client: Client, ) -> None: diff --git a/tests/contrib/external_workflow_streams/test_replay_end_to_end.py b/tests/contrib/external_workflow_streams/test_replay_end_to_end.py index 92945d4c8..279b9a5db 100644 --- a/tests/contrib/external_workflow_streams/test_replay_end_to_end.py +++ b/tests/contrib/external_workflow_streams/test_replay_end_to_end.py @@ -293,7 +293,6 @@ async def test_replaying_a_stream_history_reproduces_the_same_observations( ) -@pytest.mark.usefixtures("first_task_retained") async def test_live_and_replay_share_one_input_output_drain_schedule( client: Client, ) -> None: @@ -803,7 +802,6 @@ async def spy_notify(self, subscription): # type: ignore[no-untyped-def] LIVE_MANAGERS.clear() -@pytest.mark.usefixtures("first_task_retained") async def test_an_empty_stream_parked_and_evicted_replays_from_the_recorded_cursor( client: Client, backend: MemoryStreamBackend, diff --git a/tests/contrib/external_workflow_streams/test_rollover_integration.py b/tests/contrib/external_workflow_streams/test_rollover_integration.py index 5deab8396..f68a2d1c8 100644 --- a/tests/contrib/external_workflow_streams/test_rollover_integration.py +++ b/tests/contrib/external_workflow_streams/test_rollover_integration.py @@ -411,7 +411,6 @@ async def test_a_continuously_fed_stream_survives_a_rollover( @pytest.mark.timeout(180) -@pytest.mark.usefixtures("first_task_retained") async def test_a_signal_into_a_retained_task_lands_by_the_rollover_deadline( client: Client, backend: MemoryStreamBackend ) -> None: diff --git a/tests/contrib/external_workflow_streams/test_worker_crash.py b/tests/contrib/external_workflow_streams/test_worker_crash.py index be046feef..5987318e6 100644 --- a/tests/contrib/external_workflow_streams/test_worker_crash.py +++ b/tests/contrib/external_workflow_streams/test_worker_crash.py @@ -148,7 +148,6 @@ async def _output_stage_was_logged(redis_client: Any, prefix: str) -> bool: @pytest.mark.timeout(240) -@pytest.mark.usefixtures("first_task_retained") async def test_a_crash_before_the_marker_makes_the_next_worker_re_read( client: Client, redis_worker_id: str ) -> None: diff --git a/tests/contrib/external_workflow_streams/test_worker_handoff.py b/tests/contrib/external_workflow_streams/test_worker_handoff.py index d23b404b0..24294fc8b 100644 --- a/tests/contrib/external_workflow_streams/test_worker_handoff.py +++ b/tests/contrib/external_workflow_streams/test_worker_handoff.py @@ -534,7 +534,6 @@ async def _park_is_installed(backend: MemoryStreamBackend, key: StreamKey) -> bo @pytest.mark.timeout(180) -@pytest.mark.usefixtures("first_task_retained") async def test_a_wake_that_resolves_a_park_removes_its_intent( client: Client, backend: MemoryStreamBackend ) -> None: @@ -572,7 +571,6 @@ async def test_a_wake_that_resolves_a_park_removes_its_intent( @pytest.mark.timeout(180) -@pytest.mark.usefixtures("first_task_retained") async def test_the_shutdown_probe_is_asked_while_core_still_holds_the_run( client: Client, backend: MemoryStreamBackend ) -> None: From 22db1792b26a24d034fe101030c661ede4a6c9eb Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:46:29 -0700 Subject: [PATCH 806/831] Took the channel address from the client's stream_channel rule. channel_for answers with a ChannelAddress or a (channel, workflow_id) pair and defaults to the main chain's rule, so the consumer and the server agree on a native stream's channel. The native case also waits for a layer that carries a native provider, which this one does not. --- temporalio/streams/providers/nexus.py | 49 +++++++++------------ tests/streams/conftest.py | 21 +++++++++ tests/streams/test_nexus_consumer.py | 61 ++++++++++++++++++--------- 3 files changed, 82 insertions(+), 49 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 798a375e5..356f8fc63 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -156,7 +156,6 @@ "StreamConsumerOperation", "TemporalStreamsHandler", "WireStreamRef", - "stream_channel", "stream_consumer_operation", ] @@ -1297,27 +1296,19 @@ async def _endpoint_id(self, client: Client | None) -> str: _START_TIME_HEADER = "Nexus-Operation-Start-Time" -def stream_channel(ref: StreamRef) -> tuple[str, str | None]: - """The channel a native stream notifies, and the owner a linked one belongs to. - - The server's rule: a standalone stream notifies the independent channel - ``stream/``; a workflow's stream notifies ``stream/`` - linked to the owning workflow; an activity's stream notifies - ``stream//``, linked to the workflow that scheduled - the activity and independent for a standalone activity. The second - member is the workflow id a registration addresses the linked channel - with, ``None`` for an independent channel. A store that names channels - its own way passes its rule as ``channel_for`` instead. - """ - if ref.kind == "standalone": - return f"stream/{ref.stream_id}", None - if ref.kind == "activity": - return f"stream/{ref.activity_id}/{ref.topic}", ref.workflow_id - return f"stream/{ref.topic}", ref.workflow_id +ConsumeFunction = Callable[[StreamRecord[Any], S], "S | Awaitable[S]"] +ChannelRule = Callable[ + [StreamRef], "temporalio.client.ChannelAddress | tuple[str, str | None]" +] -ConsumeFunction = Callable[[StreamRecord[Any], S], "S | Awaitable[S]"] -ChannelRule = Callable[[StreamRef], tuple[str, "str | None"]] +def _address(where: Any) -> tuple[str, str | None]: + """The channel name and the owner a rule answered with, as an address or a pair.""" + channel = getattr(where, "channel", None) + if isinstance(channel, str): + return channel, getattr(where, "workflow_id", None) + channel, owner = where + return channel, owner @dataclass(frozen=True) @@ -1506,7 +1497,7 @@ def __init__( initial: Callable[[], S], listener_url: str, client: Client | None = None, - channel_for: ChannelRule = stream_channel, + channel_for: ChannelRule = temporalio.client.stream_channel, result_type: type | None = None, token_header: str = STREAM_CONSUMER_TOKEN_HEADER, ) -> None: @@ -1521,11 +1512,13 @@ def __init__( client: Registers the listener and opens the stream. Leave it unset in a handler hosted by a Temporal worker, where the operation context's client is used. - channel_for: Names the channel for a ref, and the workflow a - linked channel belongs to. The default is - :func:`stream_channel`, the server's rule for native - streams; a store that names channels its own way passes - its rule. + channel_for: Names the channel for a ref and the workflow a + linked channel belongs to, as a + :class:`temporalio.client.ChannelAddress` or a + ``(channel, workflow_id)`` pair. The default is + :func:`temporalio.client.stream_channel`, the server's rule + for native streams; a store that names channels its own + way passes its rule. result_type: What record values are decoded as. token_header: The header carrying the operation token on the registration and so on every delivery. @@ -1578,7 +1571,7 @@ async def start( """ client = self._client() token = uuid.uuid4().hex - channel, owner = self._channel_for(input) + channel, owner = _address(self._channel_for(input)) # Registered before the first read: a record appended between the # read and the registration would otherwise be missed, where one # appended between the registration and the read is read twice at @@ -1845,7 +1838,7 @@ def stream_consumer_operation( initial: Callable[[], S], listener_url: str, client: Client | None = None, - channel_for: ChannelRule = stream_channel, + channel_for: ChannelRule = temporalio.client.stream_channel, result_type: type | None = None, token_header: str = STREAM_CONSUMER_TOKEN_HEADER, ) -> StreamConsumerOperation[S]: diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index a1dbe5359..bfa934ddf 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -18,6 +18,12 @@ # pin and matched against its event by the delivery pin. PINNED_CORE_HANDLES_UNSUBSCRIBE = False +# A native stream lives on the server, and only the native layers carry a +# provider that opens one; the providers here hold streams in memory or in a +# workflow's History. A case that produces to a native stream waits for the +# layer with that provider. +PINNED_LAYER_HOSTS_NATIVE_STREAMS = False + def pytest_configure(config: pytest.Config) -> None: config.addinivalue_line( @@ -88,6 +94,11 @@ def pytest_configure(config: pytest.Config) -> None: "needs_stream_channel_server: the case needs a server on which a native " "stream notifies the channel named by the stream, named with -E host:port", ) + config.addinivalue_line( + "markers", + "needs_native_provider: the case needs a provider that opens native streams " + "on the server, which only the native layers carry", + ) def pytest_collection_modifyitems( @@ -161,6 +172,16 @@ def pytest_collection_modifyitems( ), ) ) + if not PINNED_LAYER_HOSTS_NATIVE_STREAMS: + skips.append( + ( + "needs_native_provider", + pytest.mark.skip( + reason="this layer carries no provider for native streams; the " + "native layers and the union do" + ), + ) + ) for item in items: for marker, skip in skips: if item.get_closest_marker(marker): diff --git a/tests/streams/test_nexus_consumer.py b/tests/streams/test_nexus_consumer.py index c512bd626..61b8610c5 100644 --- a/tests/streams/test_nexus_consumer.py +++ b/tests/streams/test_nexus_consumer.py @@ -38,7 +38,7 @@ CreateNexusEndpointRequest, DeleteNexusEndpointRequest, ) -from temporalio.client import Callback, Client +from temporalio.client import Callback, ChannelAddress, Client, stream_channel from temporalio.exceptions import NexusOperationError from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import BEGINNING, StreamProvider, StreamRecord, StreamRef @@ -50,7 +50,6 @@ NexusStreams, StreamConsumerOperation, TemporalStreamsHandler, - stream_channel, stream_consumer_operation, ) from temporalio.streams.providers.nexus_consumer_service import ( @@ -220,7 +219,7 @@ async def _rig( client, operation, ref, - stream_channel(ref)[0], + stream_channel(ref).channel, handle.producer(topic=VALUES, producer_id="writer", attempt=1), ) @@ -230,27 +229,46 @@ async def _rig( # --------------------------------------------------------------------------- -def test_the_channel_follows_the_servers_names(): - # A standalone stream's channel is independent; an owned stream's is - # linked to the owning workflow, which the second member names. +def test_the_default_rule_is_the_servers_naming_of_a_streams_channel(): + # The consumer registers where the server's stream component notifies: + # a standalone stream's channel is independent, an owned stream's is + # linked to the owning workflow. assert stream_channel(StreamRef.for_standalone("s-1", topic="values")) == ( - "stream/s-1", - None, + ChannelAddress("stream/s-1", None) ) - assert stream_channel(StreamRef.for_workflow("wf", topic="t")) == ("stream/t", "wf") - assert stream_channel(StreamRef.for_workflow("wf", run_id="r", topic="t")) == ( - "stream/t", - "wf", + assert stream_channel(StreamRef.for_workflow("wf", topic="t")) == ChannelAddress( + "stream/t", "wf" ) assert stream_channel( StreamRef.for_activity("act", workflow_id="wf", topic="t") - ) == ("stream/act/t", "wf") + ) == ChannelAddress("stream/act/t", "wf") assert stream_channel(StreamRef.for_activity("act", topic="t")) == ( - "stream/act/t", - None, + ChannelAddress("stream/act/t", None) ) +async def test_a_rule_may_answer_with_a_pair(posted: list[_Posted]): + # A store's rule that returns (channel, workflow_id) fits as well as an + # address does. + store = MemoryStreams() + handle = await store.create_standalone_stream(None, "paired") + client = _ClientStandIn(store) + operation = stream_consumer_operation( + collect_values, + initial=list, + listener_url=LISTENER_URL, + client=_as_client(client), + channel_for=lambda ref: (f"custom/{ref.stream_id}", None), + ) + result = await operation.start(_start_context(), handle.ref(topic=VALUES)) + assert isinstance(result, nexusrpc.handler.StartOperationResultAsync) + state = operation.state(result.token) + assert state is not None and (state.channel, state.owner) == ("custom/paired", None) + await operation.close() + assert client.unregistered == [("custom/paired", "listener-1", None)] + assert posted == [] + + async def test_an_owned_stream_registers_on_the_owners_linked_channel( posted: list[_Posted], ): @@ -502,7 +520,7 @@ def nothing(record: StreamRecord[Any], value: None) -> None: await handle.producer(topic=VALUES, producer_id="w", attempt=1).finish() await operation.deliver( {STREAM_CONSUMER_TOKEN_HEADER: result.token}, - _notification(stream_channel(ref)[0], 1), + _notification(stream_channel(ref).channel, 1), ) [completion] = posted assert completion.state == "succeeded" @@ -750,7 +768,7 @@ async def test_a_standalone_service_consumes_an_external_stream_through_its_chan stream_id = f"consumed-{uuid.uuid4().hex}" handle = await store.create_standalone_stream(None, stream_id) ref = handle.ref(topic=VALUES) - channel = stream_channel(ref)[0] + channel = stream_channel(ref).channel producer = handle.producer(topic=VALUES, producer_id="writer", attempt=1) async with _consumer_service(client, store) as live: @@ -815,7 +833,7 @@ async def test_cancel_unregisters_the_listener(client: Client): stream_id = f"consumed-{uuid.uuid4().hex}" handle = await store.create_standalone_stream(None, stream_id) ref = handle.ref(topic=VALUES) - channel = stream_channel(ref)[0] + channel = stream_channel(ref).channel async with ( _consumer_service(client, store) as live, @@ -887,7 +905,7 @@ async def test_a_worker_hosted_consumer_is_reached_through_the_frontend( stream_id = f"consumed-{uuid.uuid4().hex}" handle = await store.create_standalone_stream(None, stream_id) ref = handle.ref(topic=VALUES) - channel = stream_channel(ref)[0] + channel = stream_channel(ref).channel producer = handle.producer(topic=VALUES, producer_id="writer", attempt=1) uid = uuid.uuid4().hex stream_handler = TemporalStreamsHandler(store, client) @@ -976,6 +994,7 @@ async def test_a_worker_hosted_consumer_is_reached_through_the_frontend( @pytest.mark.needs_stream_channel_server +@pytest.mark.needs_native_provider async def test_a_native_standalone_stream_is_consumed_through_its_channel( client: Client, ): @@ -997,7 +1016,7 @@ async def test_a_native_standalone_stream_is_consumed_through_its_channel( id=f"caller-{stream_id}", task_queue=worker.task_queue, ) - token = await _listener_token(client, stream_channel(ref)[0]) + token = await _listener_token(client, stream_channel(ref).channel) await _consumed(live.consumer, token, 2) # The server notifies the stream's channel on every append and on # the close, so the records reach the consumer without a notify. @@ -1007,5 +1026,5 @@ async def test_a_native_standalone_stream_is_consumed_through_its_channel( await handle.close() assert await asyncio.wait_for(run.result(), 60) == ["a", "b", "c"] assert ( - await client.describe_channel(stream_channel(ref)[0]) + await client.describe_channel(stream_channel(ref).channel) ).listeners == [] From 790f8337834f8e58c6c65c804badaabfb0ac78b8 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:48:34 -0700 Subject: [PATCH 807/831] Added conformance cases for a reader leaving its channel. A reader closed short of FINISH and one closed at FINISH both end the run's subscription on the completion that leaves, after the progress marker, and a reader opened and closed inside one task never subscribes. The cases need a server that accepts the unsubscribe command, so they carry a marker of their own. --- tests/streams/conftest.py | 17 ++- tests/streams/test_streams_conformance.py | 177 +++++++++++++++++++++- 2 files changed, 186 insertions(+), 8 deletions(-) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 53aa935bd..4dc059e13 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -41,12 +41,25 @@ def pytest_configure(config: pytest.Config) -> None: "to a workflow, named with -E host:port; the case skips itself on one " "with only independent channels", ) + config.addinivalue_line( + "markers", + "needs_unsubscribe_server: the case needs a server that accepts the " + "unsubscribe-notification-channel command, named with -E host:port; an " + "older channel server fails the Workflow Task that carries it", + ) #: The environments whose server the suite starts for itself. None of them #: accepts the subscribe-notification-channel command. _ENVIRONMENTS_WITHOUT_CHANNELS = ("local", "time-skipping", "envconfig") +#: The markers naming a server capability the suite's own servers lack. +_CHANNEL_SERVER_MARKERS = ( + "needs_channel_server", + "needs_linked_server", + "needs_unsubscribe_server", +) + def pytest_collection_modifyitems( config: pytest.Config, items: list[pytest.Item] @@ -57,7 +70,5 @@ def pytest_collection_modifyitems( reason="needs a server that serves notification channels; name one with -E" ) for item in items: - if item.get_closest_marker("needs_channel_server") or item.get_closest_marker( - "needs_linked_server" - ): + if any(item.get_closest_marker(marker) for marker in _CHANNEL_SERVER_MARKERS): item.add_marker(skip) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index de62a66fe..749b7c3c5 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -951,13 +951,169 @@ async def test_an_outside_producer_wakes_the_reader_through_its_linked_channel( assert len({n.channel for n in notified}) == 1 -async def _read_two_woken_from_outside(case: ProviderCase, worker_client: Client): - """Runs the reader with two appends spaced past its idle timeout.""" +@workflow.defn +class ReadTwoThenClose: + """Reads two values of ``OUT``, closes the reader short of ``FINISH``, waits. + + The timer after the close is what makes the close leave on a completion + the run survives: the channel has to leave on that completion, not with + the run. + """ + + @workflow.run + async def run(self) -> list[Any]: + reader = workflow.stream_reader(OUT) + seen: list[Any] = [] + async for record in reader: + seen.append(record.value) + if len(seen) == 2: + break + reader.close() + await workflow.sleep(1) + return seen + + +@workflow.defn +class ReadUntilFinishedThenClose: + """Reads ``OUT`` to its producer's ``FINISH``, closes the reader there, waits.""" + + @workflow.run + async def run(self) -> list[Any]: + reader = workflow.stream_reader(OUT) + seen: list[Any] = [] + async for record in reader: + if record.kind is RecordKind.FINISH: + break + seen.append(record.value) + reader.close() + await workflow.sleep(1) + return seen + + +@workflow.defn +class OpenAndCloseBesideTheRead: + """Opens and closes a reader on ``A`` in the task that opens the ``OUT`` reader.""" + + @workflow.run + async def run(self) -> list[Any]: + workflow.stream_reader(A).close() + seen: list[Any] = [] + async for record in workflow.stream_reader(OUT): + if record.kind is RecordKind.FINISH: + break + seen.append(record.value) + return seen + + +async def _independent_channels_or_skip(worker_client: Client) -> None: + support = await server_channel_support(worker_client) + if support is ChannelSupport.NONE: + pytest.skip("the server does not implement notification channels") + if support is ChannelSupport.LINKED: + pytest.skip("a workflow-owned stream listens on its linked channel there") + + +@pytest.mark.wakes_by_notification +@pytest.mark.needs_unsubscribe_server +async def test_a_reader_closed_short_of_finish_leaves_its_channel( + case: ProviderCase, client: Client +): + """Closing the reader ends the run's subscription on the completion that + leaves, after the progress marker and before the workflow's own command. + + The producer finishes only after the run has returned, so the reader + never saw ``FINISH``; it left because the workflow closed it. + """ + worker_client = case.client or client + await _independent_channels_or_skip(worker_client) + handle = await _read_two_woken_from_outside( + case, worker_client, ReadTwoThenClose, finish_before_result=False + ) + _assert_the_channel_left_after_the_marker( + [e async for e in handle.fetch_history_events()] + ) + + +@pytest.mark.wakes_by_notification +@pytest.mark.needs_unsubscribe_server +async def test_a_reader_closed_at_finish_leaves_its_channel( + case: ProviderCase, client: Client +): + """The same leaving, on the completion that consumed the producer's ``FINISH``.""" + worker_client = case.client or client + await _independent_channels_or_skip(worker_client) + handle = await _read_two_woken_from_outside( + case, worker_client, ReadUntilFinishedThenClose + ) + _assert_the_channel_left_after_the_marker( + [e async for e in handle.fetch_history_events()] + ) + + +@pytest.mark.wakes_by_notification +@pytest.mark.needs_unsubscribe_server +async def test_a_channel_opened_and_closed_in_one_task_is_never_subscribed( + case: ProviderCase, client: Client +): + """Only the latest report of a task counts, so a reader that came and went + inside it costs the server nothing: no subscription, no unsubscription.""" + worker_client = case.client or client + await _independent_channels_or_skip(worker_client) + handle = await _read_two_woken_from_outside( + case, worker_client, OpenAndCloseBesideTheRead + ) + events = [e async for e in handle.fetch_history_events()] + subscribed = _subscribed(events) + assert len(subscribed) == 1, "only the reader that stayed open subscribes" + assert {n.channel for n in _notified(events)} == set(subscribed) + assert _unsubscribed(events) == [], "the run ended with its reader open" + + +def _assert_the_channel_left_after_the_marker(events: Sequence[Any]) -> None: + [channel] = _subscribed(events) + assert _unsubscribed(events) == [channel], "the channel leaves once" + [(index, leaving)] = [ + (i, e) + for i, e in enumerate(events) + if e.HasField("workflow_notification_channel_unsubscribed_event_attributes") + ] + [joined] = [ + e + for e in events + if e.HasField("workflow_notification_channel_subscribed_event_attributes") + ] + attributes = leaving.workflow_notification_channel_unsubscribed_event_attributes + assert attributes.subscribed_event_id == joined.event_id + assert events[index - 1].HasField("marker_recorded_event_attributes"), ( + "the unsubscribe follows the progress marker of the leaving completion" + ) + assert events[index + 1].HasField("timer_started_event_attributes"), ( + "the leaving completion carried the workflow's own command after it" + ) + assert not any( + e.workflow_task_scheduled_event_attributes.notifications + for e in events[index + 1 :] + if e.HasField("workflow_task_scheduled_event_attributes") + ), "a notification reached the run after it left the channel" + + +async def _read_two_woken_from_outside( + case: ProviderCase, + worker_client: Client, + workflow_class: Any = ReadUntilFinished, + *, + finish_before_result: bool = True, +): + """Runs a reader with two appends spaced past its idle timeout. + + ``finish_before_result`` says whether the producer's ``FINISH`` is what + lets the workflow return, or is written only once it has. + """ plugins = [] if case.client is not None else [case.provider] workflow_id = new_workflow_id() - async with new_worker(worker_client, ReadUntilFinished, plugins=plugins) as worker: + async with new_worker(worker_client, workflow_class, plugins=plugins) as worker: handle = await worker_client.start_workflow( - ReadUntilFinished.run, id=workflow_id, task_queue=worker.task_queue + workflow_class.run, id=workflow_id, task_queue=worker.task_queue ) stream = case.provider.get_stream_handle(worker_client, workflow_id) producer = stream.producer(topic=OUT, producer_id="model", attempt=1) @@ -966,8 +1122,11 @@ async def _read_two_woken_from_outside(case: ProviderCase, worker_client: Client for n in (1, 2): await producer.append({"n": n}) await asyncio.sleep(2) - await producer.finish() + if finish_before_result: + await producer.finish() assert await asyncio.wait_for(handle.result(), 60) == [{"n": 1}, {"n": 2}] + if not finish_before_result: + await producer.finish() return handle @@ -985,6 +1144,14 @@ def _subscribed(events: Sequence[Any]) -> list[str]: ] +def _unsubscribed(events: Sequence[Any]) -> list[str]: + return [ + e.workflow_notification_channel_unsubscribed_event_attributes.channel + for e in events + if e.HasField("workflow_notification_channel_unsubscribed_event_attributes") + ] + + def _notified(events: Sequence[Any]) -> list[Any]: return [ notification From 662eba9c78892b6b39dfb2946fddc5d2c8996d03 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:49:59 -0700 Subject: [PATCH 808/831] Checked that the subscription waits for the completion that ends the task. The channel case now finds the subscribed event after a marker, which is where Core puts it, so the task that opened the reader stayed retained. --- tests/streams/test_streams_conformance.py | 36 ++++++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index 749b7c3c5..d1c54fb17 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -899,8 +899,10 @@ async def test_an_outside_producer_wakes_the_reader_through_the_channel( ): """The channel path, on the public surface. - The reader's run subscribes to the stream's channel on the task that opens - the reader, the producer's append notifies that channel, and the server + The reader's run is subscribed to the stream's channel on the completion + that ends the task that opened the reader, after that task's marker, so + the task stays retained and parks as it would on a server without + channels. The producer's append notifies the channel, and the server wakes the run with a Workflow Task whose scheduled event carries the notification. History then holds the subscription and no Signal. """ @@ -917,6 +919,9 @@ async def test_an_outside_producer_wakes_the_reader_through_the_channel( ) subscribed = _subscribed(events) assert len(subscribed) == 1, "the run subscribes once per channel" + assert _preceded_by_a_marker(events, _subscribed_event_index(events)), ( + "the subscription did not wait for the completion that ends the task" + ) notified = _notified(events) assert notified, "no Workflow Task was scheduled with a notification" assert {n.channel for n in notified} == set(subscribed) @@ -1069,6 +1074,25 @@ async def test_a_channel_opened_and_closed_in_one_task_is_never_subscribed( assert _unsubscribed(events) == [], "the run ended with its reader open" +def _subscribed_event_index(events: Sequence[Any]) -> int: + [index] = [ + i + for i, e in enumerate(events) + if e.HasField("workflow_notification_channel_subscribed_event_attributes") + ] + return index + + +def _preceded_by_a_marker(events: Sequence[Any], index: int) -> bool: + """Whether the event at ``index`` follows the progress marker of its completion. + + Core issues the channel commands after the external stream marker, so an + event right after a marker landed on the completion that ended a task + rather than on a task of its own. + """ + return events[index - 1].HasField("marker_recorded_event_attributes") + + def _assert_the_channel_left_after_the_marker(events: Sequence[Any]) -> None: [channel] = _subscribed(events) assert _unsubscribed(events) == [channel], "the channel leaves once" @@ -1077,14 +1101,10 @@ def _assert_the_channel_left_after_the_marker(events: Sequence[Any]) -> None: for i, e in enumerate(events) if e.HasField("workflow_notification_channel_unsubscribed_event_attributes") ] - [joined] = [ - e - for e in events - if e.HasField("workflow_notification_channel_subscribed_event_attributes") - ] + joined = events[_subscribed_event_index(events)] attributes = leaving.workflow_notification_channel_unsubscribed_event_attributes assert attributes.subscribed_event_id == joined.event_id - assert events[index - 1].HasField("marker_recorded_event_attributes"), ( + assert _preceded_by_a_marker(events, index), ( "the unsubscribe follows the progress marker of the leaving completion" ) assert events[index + 1].HasField("timer_started_event_attributes"), ( From 04f802527fd6045ff3b8a3771fc49478c6b6fcc3 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 03:52:15 -0700 Subject: [PATCH 809/831] Checked where the Redis reader's subscription lands. The channel case finds the subscribed event after a marker, so the task that opened the reader stayed retained until it left. The provider case's note says the same. --- tests/streams/test_redis_replay.py | 10 ++++++++++ tests/streams/test_streams_conformance.py | 7 ++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 78155f56b..647b2e820 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -1281,6 +1281,16 @@ async def test_an_outside_producer_wakes_the_reader_through_the_channel( events = await _consume_three_through_the_channel(live_client) subscribed = _subscribed(events) assert len(subscribed) == 1, "the run subscribes once per channel" + [index] = [ + i + for i, e in enumerate(events) + if e.HasField("workflow_notification_channel_subscribed_event_attributes") + ] + # Core issues the subscription after the marker of the completion that + # ends the task, so the task that opened the reader stayed retained. + assert events[index - 1].HasField("marker_recorded_event_attributes"), ( + "the subscription did not wait for the completion that ends the task" + ) notified = _notified(events) assert {n.channel for n in notified} == set(subscribed) assert not any(n.HasField("linked_to") for n in notified) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index fa51ec71d..2c52f10b7 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -310,9 +310,10 @@ async def host(workflow_id: str) -> None: bounds_standalone_bytes=True, trims_open_stream_by_age=True, # An outside append notifies the stream's channel, addressed to - # the workflow that owns the stream; the reader's worker subscribes - # to it on the task that opens the read where the server has no - # linked kind, and listens by construction where it has. + # the workflow that owns the stream; the reader's run is + # subscribed to it when the task that opened the read ends where + # the server has no linked kind, and listens by construction + # where it has. wakes_by_notification=True, wakes_by_linked_notification=True, ) From 13750be2d36775afd3c8014d7e9de5613ca57293 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 04:18:18 -0700 Subject: [PATCH 810/831] Kept the client's ChannelAddress as the one type for both chains. Both lineages had grown an address type for a channel and its owner. The external module now re-exports the client's, with None for no owner. --- .../external_workflow_streams/_wake.py | 36 ++----------------- .../external_workflow_streams/test_wake.py | 11 +++--- 2 files changed, 7 insertions(+), 40 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index d13849af0..6139f47a6 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -41,6 +41,7 @@ import temporalio.api.workflowservice.v1 import temporalio.service from temporalio.bridge.proto.external_stream.external_stream_pb2 import WakeSignal +from temporalio.client._channel import ChannelAddress from temporalio.contrib.external_workflow_streams._record import Offset if TYPE_CHECKING: @@ -81,39 +82,6 @@ """ -@dataclass(frozen=True) -class ChannelAddress: - """Where a stream's notifications go. - - A channel linked to a workflow lives in that workflow's state and is - addressed by the channel name and the workflow id; the workflow is its - listener by construction. An independent channel is addressed by name - alone and listened on by command. - """ - - channel: str - """The channel name, see :func:`channel_for`.""" - - workflow_id: str = "" - """The workflow the channel is linked to, or empty for an independent channel. - - The chain's id without a run, so the server resolves the chain's current - run the way it does for a Signal and a continue-as-new successor is - reached by the same address. - """ - - @property - def linked(self) -> bool: - """Whether the channel is linked to a workflow.""" - return bool(self.workflow_id) - - def execution(self) -> temporalio.api.common.v1.WorkflowExecution | None: - """The ``workflow_execution`` a channel call carries, or none.""" - if not self.workflow_id: - return None - return temporalio.api.common.v1.WorkflowExecution(workflow_id=self.workflow_id) - - def channel_for(key: StreamKey) -> ChannelAddress: """The channel a stream's writers notify and its readers listen on. @@ -239,7 +207,7 @@ class WakeRequest: def channel_address(self) -> ChannelAddress: """The channel and its owner as one address.""" return ChannelAddress( - channel=self.channel, workflow_id=self.channel_workflow_id + channel=self.channel, workflow_id=self.channel_workflow_id or None ) @property diff --git a/tests/contrib/external_workflow_streams/test_wake.py b/tests/contrib/external_workflow_streams/test_wake.py index 7f7920e40..ec33082c0 100644 --- a/tests/contrib/external_workflow_streams/test_wake.py +++ b/tests/contrib/external_workflow_streams/test_wake.py @@ -2065,13 +2065,12 @@ def test_the_channel_is_linked_to_the_streams_workflow() -> None: address = channel_for(StreamKey("ns", "wf-1", "first-run-1", "tokens")) assert address.workflow_id == "wf-1" - assert address.linked - execution = address.execution() - assert execution is not None - assert execution.workflow_id == "wf-1" and execution.run_id == "" + assert address == ChannelAddress( + "external-stream/wf-1/first-run-1/input/tokens", "wf-1" + ) # A channel without an owner is addressed by name alone. - independent = ChannelAddress(channel="orders") - assert not independent.linked and independent.execution() is None + independent = ChannelAddress(channel="orders", workflow_id=None) + assert independent.workflow_id is None def test_the_channel_tells_the_two_directions_apart() -> None: From 0a0a4c0fe31b1e410debfc4b9569cda814bed6d2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 04:18:18 -0700 Subject: [PATCH 811/831] Pinned Core at the observability union head and regenerated the clients. The union Core carries the unsubscribe command and the channel report of both lineages, so the bridge protos come from one tree again. --- temporalio/api/command/v1/message_pb2.py | 16 +- temporalio/api/enums/v1/failed_cause_pb2.py | 31 +- temporalio/api/history/v1/message_pb2.py | 248 ++-- temporalio/api/workflow/v1/message_pb2.py | 72 +- .../v1/request_response_pb2.py | 1165 +++++++++-------- .../proto/workflow_commands/__init__.py | 4 + .../workflow_commands_pb2.py | 216 +-- .../workflow_commands_pb2.pyi | 163 +++ temporalio/bridge/sdk-core | 2 +- 9 files changed, 1065 insertions(+), 852 deletions(-) diff --git a/temporalio/api/command/v1/message_pb2.py b/temporalio/api/command/v1/message_pb2.py index c29fcb610..52bea94d2 100644 --- a/temporalio/api/command/v1/message_pb2.py +++ b/temporalio/api/command/v1/message_pb2.py @@ -45,7 +45,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xf4\x15\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x12\x83\x01\n1subscribe_notification_channel_command_attributes\x18\x16 \x01(\x0b\x32\x46.temporal.api.command.v1.SubscribeNotificationChannelCommandAttributesH\x00\x12\x87\x01\n3unsubscribe_notification_channel_command_attributes\x18\x17 \x01(\x0b\x32H.temporal.api.command.v1.UnsubscribeNotificationChannelCommandAttributesH\x00\x42\x0c\n\nattributes"p\n$AppendStreamRecordsCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"K\n SubscribeStreamCommandAttributes\x12\x11\n\tstream_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03"@\n-SubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"B\n/UnsubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\tB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' + b'\n%temporal/api/command/v1/message.proto\x12\x17temporal.api.command.v1\x1a\x1egoogle/protobuf/duration.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a(temporal/api/enums/v1/command_type.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xb6\x05\n%ScheduleActivityTaskCommandAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x1f\n\x17request_eager_execution\x18\x0c \x01(\x08\x12\x1d\n\x15use_workflow_build_id\x18\r \x01(\x08\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"H\n*RequestCancelActivityTaskCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"i\n\x1bStartTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"^\n*CompleteWorkflowExecutionCommandAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"[\n&FailWorkflowExecutionCommandAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"0\n\x1c\x43\x61ncelTimerCommandAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t"]\n(CancelWorkflowExecutionCommandAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xb7\x01\n7RequestCancelExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xaf\x02\n0SignalExternalWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x06 \x01(\x08\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"v\n/UpsertWorkflowSearchAttributesCommandAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"`\n)ModifyWorkflowPropertiesCommandAttributes\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xbf\x02\n\x1dRecordMarkerCommandAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.command.v1.RecordMarkerCommandAttributes.DetailsEntry\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xac\x07\n/ContinueAsNewWorkflowExecutionCommandAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x07 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12@\n\tinitiator\x18\x08 \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x31\n\x07\x66\x61ilure\x18\t \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\n \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rcron_schedule\x18\x0b \x01(\t\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xec\x07\n,StartChildWorkflowExecutionCommandAttributes\x12\x15\n\tnamespace\x18\x01 \x01(\tB\x02\x18\x01\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x0f\n\x07\x63ontrol\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12.\n\x06header\x18\x0e \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x0f \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x10 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x11 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12I\n\x13versioning_override\x18\x13 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride"6\n ProtocolMessageCommandAttributes\x12\x12\n\nmessage_id\x18\x01 \x01(\t"\xe3\x03\n\'ScheduleNexusOperationCommandAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12g\n\x0cnexus_header\x18\x06 \x03(\x0b\x32Q.temporal.api.command.v1.ScheduleNexusOperationCommandAttributes.NexusHeaderEntry\x12<\n\x19schedule_to_start_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"J\n,RequestCancelNexusOperationCommandAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03"\xf4\x15\n\x07\x43ommand\x12\x38\n\x0c\x63ommand_type\x18\x01 \x01(\x0e\x32".temporal.api.enums.v1.CommandType\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x43\n\x13\x65vent_group_markers\x18\xae\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12s\n)schedule_activity_task_command_attributes\x18\x02 \x01(\x0b\x32>.temporal.api.command.v1.ScheduleActivityTaskCommandAttributesH\x00\x12^\n\x1estart_timer_command_attributes\x18\x03 \x01(\x0b\x32\x34.temporal.api.command.v1.StartTimerCommandAttributesH\x00\x12}\n.complete_workflow_execution_command_attributes\x18\x04 \x01(\x0b\x32\x43.temporal.api.command.v1.CompleteWorkflowExecutionCommandAttributesH\x00\x12u\n*fail_workflow_execution_command_attributes\x18\x05 \x01(\x0b\x32?.temporal.api.command.v1.FailWorkflowExecutionCommandAttributesH\x00\x12~\n/request_cancel_activity_task_command_attributes\x18\x06 \x01(\x0b\x32\x43.temporal.api.command.v1.RequestCancelActivityTaskCommandAttributesH\x00\x12`\n\x1f\x63\x61ncel_timer_command_attributes\x18\x07 \x01(\x0b\x32\x35.temporal.api.command.v1.CancelTimerCommandAttributesH\x00\x12y\n,cancel_workflow_execution_command_attributes\x18\x08 \x01(\x0b\x32\x41.temporal.api.command.v1.CancelWorkflowExecutionCommandAttributesH\x00\x12\x99\x01\n=request_cancel_external_workflow_execution_command_attributes\x18\t \x01(\x0b\x32P.temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributesH\x00\x12\x62\n record_marker_command_attributes\x18\n \x01(\x0b\x32\x36.temporal.api.command.v1.RecordMarkerCommandAttributesH\x00\x12\x89\x01\n5continue_as_new_workflow_execution_command_attributes\x18\x0b \x01(\x0b\x32H.temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributesH\x00\x12\x82\x01\n1start_child_workflow_execution_command_attributes\x18\x0c \x01(\x0b\x32\x45.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributesH\x00\x12\x8a\x01\n5signal_external_workflow_execution_command_attributes\x18\r \x01(\x0b\x32I.temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributesH\x00\x12\x88\x01\n4upsert_workflow_search_attributes_command_attributes\x18\x0e \x01(\x0b\x32H.temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributesH\x00\x12h\n#protocol_message_command_attributes\x18\x0f \x01(\x0b\x32\x39.temporal.api.command.v1.ProtocolMessageCommandAttributesH\x00\x12{\n-modify_workflow_properties_command_attributes\x18\x11 \x01(\x0b\x32\x42.temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributesH\x00\x12w\n+schedule_nexus_operation_command_attributes\x18\x12 \x01(\x0b\x32@.temporal.api.command.v1.ScheduleNexusOperationCommandAttributesH\x00\x12\x82\x01\n1request_cancel_nexus_operation_command_attributes\x18\x13 \x01(\x0b\x32\x45.temporal.api.command.v1.RequestCancelNexusOperationCommandAttributesH\x00\x12q\n(append_stream_records_command_attributes\x18\x14 \x01(\x0b\x32=.temporal.api.command.v1.AppendStreamRecordsCommandAttributesH\x00\x12h\n#subscribe_stream_command_attributes\x18\x15 \x01(\x0b\x32\x39.temporal.api.command.v1.SubscribeStreamCommandAttributesH\x00\x12\x83\x01\n1subscribe_notification_channel_command_attributes\x18\x16 \x01(\x0b\x32\x46.temporal.api.command.v1.SubscribeNotificationChannelCommandAttributesH\x00\x12\x87\x01\n3unsubscribe_notification_channel_command_attributes\x18\x17 \x01(\x0b\x32H.temporal.api.command.v1.UnsubscribeNotificationChannelCommandAttributesH\x00\x42\x0c\n\nattributes"r\n$AppendStreamRecordsCommandAttributes\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x98\x01\n SubscribeStreamCommandAttributes\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"@\n-SubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"B\n/UnsubscribeNotificationChannelCommandAttributes\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\tB\x8e\x01\n\x1aio.temporal.api.command.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/command/v1;command\xaa\x02\x19Temporalio.Api.Command.V1\xea\x02\x1cTemporalio::Api::Command::V1b\x06proto3' ) @@ -487,11 +487,11 @@ _COMMAND._serialized_start = 5274 _COMMAND._serialized_end = 8078 _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_start = 8080 - _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 8192 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 8194 - _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8269 - _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8271 - _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8335 - _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8337 - _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8403 + _APPENDSTREAMRECORDSCOMMANDATTRIBUTES._serialized_end = 8194 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_start = 8197 + _SUBSCRIBESTREAMCOMMANDATTRIBUTES._serialized_end = 8349 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8351 + _SUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8415 + _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_start = 8417 + _UNSUBSCRIBENOTIFICATIONCHANNELCOMMANDATTRIBUTES._serialized_end = 8483 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/enums/v1/failed_cause_pb2.py b/temporalio/api/enums/v1/failed_cause_pb2.py index eb29a1449..1a3d4f93e 100644 --- a/temporalio/api/enums/v1/failed_cause_pb2.py +++ b/temporalio/api/enums/v1/failed_cause_pb2.py @@ -16,11 +16,13 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xec\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,\x12N\nJWORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10-*\xc0\x02\n&StartChildWorkflowExecutionFailedCause\x12;\n7START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12G\nCSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_WORKFLOW_ALREADY_EXISTS\x10\x01\x12\x43\n?START_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12K\nGSTART_CHILD_WORKFLOW_EXECUTION_FAILED_CAUSE_INVALID_VERSIONING_OVERRIDE\x10\x03*\x91\x02\n*CancelExternalWorkflowExecutionFailedCause\x12?\n;CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCCANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02*\xe2\x02\n*SignalExternalWorkflowExecutionFailedCause\x12?\n;SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12Y\nUSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_EXTERNAL_WORKFLOW_EXECUTION_NOT_FOUND\x10\x01\x12G\nCSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_NAMESPACE_NOT_FOUND\x10\x02\x12O\nKSIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED_CAUSE_SIGNAL_COUNT_LIMIT_EXCEEDED\x10\x03*\x97\x04\n\x16ResourceExhaustedCause\x12(\n$RESOURCE_EXHAUSTED_CAUSE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT\x10\x01\x12-\n)RESOURCE_EXHAUSTED_CAUSE_CONCURRENT_LIMIT\x10\x02\x12.\n*RESOURCE_EXHAUSTED_CAUSE_SYSTEM_OVERLOADED\x10\x03\x12.\n*RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_LIMIT\x10\x04\x12*\n&RESOURCE_EXHAUSTED_CAUSE_BUSY_WORKFLOW\x10\x05\x12&\n"RESOURCE_EXHAUSTED_CAUSE_APS_LIMIT\x10\x06\x12\x36\n2RESOURCE_EXHAUSTED_CAUSE_PERSISTENCE_STORAGE_LIMIT\x10\x07\x12\x31\n-RESOURCE_EXHAUSTED_CAUSE_CIRCUIT_BREAKER_OPEN\x10\x08\x12&\n"RESOURCE_EXHAUSTED_CAUSE_OPS_LIMIT\x10\t\x12\x35\n1RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS\x10\n*\x8f\x01\n\x16ResourceExhaustedScope\x12(\n$RESOURCE_EXHAUSTED_SCOPE_UNSPECIFIED\x10\x00\x12&\n"RESOURCE_EXHAUSTED_SCOPE_NAMESPACE\x10\x01\x12#\n\x1fRESOURCE_EXHAUSTED_SCOPE_SYSTEM\x10\x02\x42\x88\x01\n\x18io.temporal.api.enums.v1B\x10\x46\x61iledCauseProtoP\x01Z!go.temporal.io/api/enums/v1;enums\xaa\x02\x17Temporalio.Api.Enums.V1\xea\x02\x1aTemporalio::Api::Enums::V1b\x06proto3' + b'\n(temporal/api/enums/v1/failed_cause.proto\x12\x15temporal.api.enums.v1*\xec\x16\n\x17WorkflowTaskFailedCause\x12*\n&WORKFLOW_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x30\n,WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND\x10\x01\x12?\n;WORKFLOW_TASK_FAILED_CAUSE_BAD_SCHEDULE_ACTIVITY_ATTRIBUTES\x10\x02\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_ACTIVITY_ATTRIBUTES\x10\x03\x12\x39\n5WORKFLOW_TASK_FAILED_CAUSE_BAD_START_TIMER_ATTRIBUTES\x10\x04\x12:\n6WORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_TIMER_ATTRIBUTES\x10\x05\x12;\n7WORKFLOW_TASK_FAILED_CAUSE_BAD_RECORD_MARKER_ATTRIBUTES\x10\x06\x12I\nEWORKFLOW_TASK_FAILED_CAUSE_BAD_COMPLETE_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x07\x12\x45\nAWORKFLOW_TASK_FAILED_CAUSE_BAD_FAIL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\x08\x12G\nCWORKFLOW_TASK_FAILED_CAUSE_BAD_CANCEL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\t\x12X\nTWORKFLOW_TASK_FAILED_CAUSE_BAD_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_ATTRIBUTES\x10\n\x12=\n9WORKFLOW_TASK_FAILED_CAUSE_BAD_CONTINUE_AS_NEW_ATTRIBUTES\x10\x0b\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_START_TIMER_DUPLICATE_ID\x10\x0c\x12\x36\n2WORKFLOW_TASK_FAILED_CAUSE_RESET_STICKY_TASK_QUEUE\x10\r\x12@\n\n:WORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_STREAM_ATTRIBUTES\x10*\x12\x37\n3WORKFLOW_TASK_FAILED_CAUSE_STREAM_RANGE_UNAVAILABLE\x10+\x12L\nHWORKFLOW_TASK_FAILED_CAUSE_BAD_SUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10,\x12N\nJWORKFLOW_TASK_FAILED_CAUSE_BAD_UNSUBSCRIBE_NOTIFICATION_CHANNEL_ATTRIBUTES\x10-*\xf3\x01\n\x17\x41\x63tivityTaskFailedCause\x12*\n&ACTIVITY_TASK_FAILED_CAUSE_UNSPECIFIED\x10\x00\x12\x31\n-ACTIVITY_TASK_FAILED_CAUSE_PAYLOADS_TOO_LARGE\x10\x01\x12\x37\n3ACTIVITY_TASK_FAILED_CAUSE_EXTERNAL_STORAGE_FAILURE\x10\x02\x12@\n\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xc7\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRange"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x9e\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x90\x01\n6WorkflowNotificationChannelUnsubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03"\x97\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0c\x66irst_offset\x18\x03 \x01(\x03\x12\x14\n\x0crecord_count\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xf6\x43\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x12\x96\x01\n;workflow_notification_channel_unsubscribed_event_attributes\x18\x45 \x01(\x0b\x32O.temporal.api.history.v1.WorkflowNotificationChannelUnsubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' + b'\n%temporal/api/history/v1/message.proto\x12\x17temporal.api.history.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a"temporal/api/enums/v1/update.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto"\xda\x12\n\'WorkflowExecutionStartedEventAttributes\x12;\n\rworkflow_type\x18\x01 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19parent_workflow_namespace\x18\x02 \x01(\t\x12$\n\x1cparent_workflow_namespace_id\x18\x1b \x01(\t\x12L\n\x19parent_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12!\n\x19parent_initiated_event_id\x18\x04 \x01(\x03\x12\x38\n\ntask_queue\x18\x05 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12"\n\x1a\x63ontinued_execution_run_id\x18\n \x01(\t\x12@\n\tinitiator\x18\x0b \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12;\n\x11\x63ontinued_failure\x18\x0c \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12!\n\x19original_execution_run_id\x18\x0e \x01(\t\x12\x10\n\x08identity\x18\x0f \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x10 \x01(\t\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x0f\n\x07\x61ttempt\x18\x12 \x01(\x05\x12\x46\n"workflow_execution_expiration_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcron_schedule\x18\x14 \x01(\t\x12>\n\x1b\x66irst_workflow_task_backoff\x18\x15 \x01(\x0b\x32\x19.google.protobuf.Duration\x12*\n\x04memo\x18\x16 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x17 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x45\n\x16prev_auto_reset_points\x18\x18 \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12.\n\x06header\x18\x19 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12&\n\x1eparent_initiated_event_version\x18\x1a \x01(\x03\x12\x13\n\x0bworkflow_id\x18\x1c \x01(\t\x12L\n\x14source_version_stamp\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\x14\x63ompletion_callbacks\x18\x1e \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12J\n\x17root_workflow_execution\x18\x1f \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x12inherited_build_id\x18 \x01(\tB\x02\x18\x01\x12I\n\x13versioning_override\x18! \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x33\n\'parent_pinned_worker_deployment_version\x18" \x01(\tB\x02\x18\x01\x12\x32\n\x08priority\x18# \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12U\n\x18inherited_pinned_version\x18% \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12Y\n\x1binherited_auto_upgrade_info\x18\' \x01(\x0b\x32\x34.temporal.api.deployment.v1.InheritedAutoUpgradeInfo\x12 \n\x18\x65\x61ger_execution_accepted\x18& \x01(\x08\x12^\n\x1f\x64\x65\x63lined_target_version_upgrade\x18( \x01(\x0b\x32\x35.temporal.api.history.v1.DeclinedTargetVersionUpgrade\x12H\n\x14time_skipping_config\x18) \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18+ \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagationJ\x04\x08$\x10%J\x04\x08*\x10+R parent_pinned_deployment_versionR\x18initial_skipped_duration"\x88\x01\n\x1c\x44\x65\x63linedTargetVersionUpgrade\x12O\n\x12\x64\x65ployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x17\n\x0frevision_number\x18\x02 \x01(\x03"\xa5\x01\n)WorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x03 \x01(\t"\xdb\x01\n&WorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x36\n\x0bretry_state\x18\x02 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x1c\n\x14new_execution_run_id\x18\x04 \x01(\t"\x80\x01\n(WorkflowExecutionTimedOutEventAttributes\x12\x36\n\x0bretry_state\x18\x01 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x1c\n\x14new_execution_run_id\x18\x02 \x01(\t"\xa5\x07\n.WorkflowExecutionContinuedAsNewEventAttributes\x12\x1c\n\x14new_execution_run_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_run_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\tinitiator\x18\t \x01(\x0e\x32-.temporal.api.enums.v1.ContinueAsNewInitiator\x12\x35\n\x07\x66\x61ilure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.FailureB\x02\x18\x01\x12@\n\x16last_completion_result\x18\x0b \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x0c \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\r \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x0f \x01(\x08\x42\x02\x18\x01\x12[\n\x1binitial_versioning_behavior\x18\x10 \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"\xef\x01\n$WorkflowTaskScheduledEventAttributes\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x39\n\x16start_to_close_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12\x41\n\rnotifications\x18\x04 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\xa0\x03\n"WorkflowTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x1f\n\x17suggest_continue_as_new\x18\x04 \x01(\x08\x12Z\n\x1fsuggest_continue_as_new_reasons\x18\x08 \x03(\x0e\x32\x31.temporal.api.enums.v1.SuggestContinueAsNewReason\x12\x30\n(target_worker_deployment_version_changed\x18\t \x01(\x08\x12\x1a\n\x12history_size_bytes\x18\x05 \x01(\x03\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xcd\x05\n$WorkflowTaskCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12H\n\x0csdk_metadata\x18\x06 \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x08 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12%\n\x19worker_deployment_version\x18\t \x01(\tB\x02\x18\x01\x12\x1e\n\x16worker_deployment_name\x18\n \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x0b \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x43\n\x16\x63onsumed_stream_ranges\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamRangeJ\x04\x08\x0e\x10\x14"\x95\x01\n#WorkflowTaskTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12\x38\n\x0ctimeout_type\x18\x03 \x01(\x0e\x32".temporal.api.enums.v1.TimeoutType"\x87\x03\n!WorkflowTaskFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12=\n\x05\x63\x61use\x18\x03 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x04 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x62\x61se_run_id\x18\x06 \x01(\t\x12\x12\n\nnew_run_id\x18\x07 \x01(\t\x12\x1a\n\x12\x66ork_event_version\x18\x08 \x01(\x03\x12\x1b\n\x0f\x62inary_checksum\x18\t \x01(\tB\x02\x18\x01\x12\x46\n\x0eworker_version\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xc2\x05\n$ActivityTaskScheduledEventAttributes\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12!\n\x15use_workflow_build_id\x18\r \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x0e \x01(\x0b\x32 .temporal.api.common.v1.PriorityJ\x04\x08\x03\x10\x04"\x9e\x02\n"ActivityTaskStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\x05\x12\x36\n\x0clast_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12%\n\x19\x62uild_id_redirect_counter\x18\x07 \x01(\x03\x42\x02\x18\x01"\xe8\x01\n$ActivityTaskCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\xdd\x02\n!ActivityTaskFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x36\n\x0bretry_state\x18\x05 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12=\n\x05\x63\x61use\x18\x07 \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"\xc6\x01\n#ActivityTaskTimedOutEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x02 \x01(\x03\x12\x18\n\x10started_event_id\x18\x03 \x01(\x03\x12\x36\n\x0bretry_state\x18\x04 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"r\n*ActivityTaskCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x92\x02\n#ActivityTaskCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12(\n latest_cancel_requested_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03\x12\x18\n\x10started_event_id\x18\x04 \x01(\x03\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01"\x93\x01\n\x1bTimerStartedEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03"G\n\x19TimerFiredEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03"\x86\x01\n\x1cTimerCanceledEventAttributes\x12\x10\n\x08timer_id\x18\x01 \x01(\t\x12\x18\n\x10started_event_id\x18\x02 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12\x10\n\x08identity\x18\x04 \x01(\t"\xc7\x01\n/WorkflowExecutionCancelRequestedEventAttributes\x12\r\n\x05\x63\x61use\x18\x01 \x01(\t\x12#\n\x1b\x65xternal_initiated_event_id\x18\x02 \x01(\x03\x12N\n\x1b\x65xternal_workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x04 \x01(\t"\x87\x01\n(WorkflowExecutionCanceledEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"\xe9\x02\n\x1dMarkerRecordedEventAttributes\x12\x13\n\x0bmarker_name\x18\x01 \x01(\t\x12T\n\x07\x64\x65tails\x18\x02 \x03(\x0b\x32\x43.temporal.api.history.v1.MarkerRecordedEventAttributes.DetailsEntry\x12(\n workflow_task_completed_event_id\x18\x03 \x01(\x03\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x1aP\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads:\x02\x38\x01"\xbf\x02\n(WorkflowExecutionSignaledEventAttributes\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12.\n\x06header\x18\x04 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\'\n\x1bskip_generate_workflow_task\x18\x05 \x01(\x08\x42\x02\x18\x01\x12N\n\x1b\x65xternal_workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x12\n\nrequest_id\x18\x07 \x01(\t"\x81\x01\n*WorkflowExecutionTerminatedEventAttributes\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t"\x9c\x02\n>RequestCancelExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x05 \x01(\x08\x12\x0e\n\x06reason\x18\x06 \x01(\t"\xda\x02\n;RequestCancelExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.CancelExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xc5\x01\n7ExternalWorkflowExecutionCancelRequestedEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xfb\x02\n7SignalExternalWorkflowExecutionInitiatedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\t \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01\x12\x1b\n\x13\x63hild_workflow_only\x18\x07 \x01(\x08\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xd3\x02\n4SignalExternalWorkflowExecutionFailedEventAttributes\x12P\n\x05\x63\x61use\x18\x01 \x01(\x0e\x32\x41.temporal.api.enums.v1.SignalExternalWorkflowExecutionFailedCause\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x11\n\tnamespace\x18\x03 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x13\n\x07\x63ontrol\x18\x06 \x01(\tB\x02\x18\x01"\xd3\x01\n0ExternalWorkflowExecutionSignaledEventAttributes\x12\x1a\n\x12initiated_event_id\x18\x01 \x01(\x03\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x07\x63ontrol\x18\x04 \x01(\tB\x02\x18\x01"\x9e\x01\n-UpsertWorkflowSearchAttributesEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x43\n\x11search_attributes\x18\x02 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"\x8a\x01\n)WorkflowPropertiesModifiedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x33\n\rupserted_memo\x18\x02 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xfc\t\n3StartChildWorkflowExecutionInitiatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x12 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x45\n\x13parent_close_policy\x18\t \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy\x12\x13\n\x07\x63ontrol\x18\n \x01(\tB\x02\x18\x01\x12(\n workflow_task_completed_event_id\x18\x0b \x01(\x03\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12.\n\x06header\x18\x0f \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12*\n\x04memo\x18\x10 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x1c\n\x10inherit_build_id\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x15 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12]\n\x1ftime_skipping_state_propagation\x18\x17 \x01(\x0b\x32\x34.temporal.api.common.v1.TimeSkippingStatePropagation\x12I\n\x13versioning_override\x18\x18 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverrideJ\x04\x08\x16\x10\x17R\x18initial_skipped_duration"\xd6\x02\n0StartChildWorkflowExecutionFailedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12L\n\x05\x63\x61use\x18\x04 \x01(\x0e\x32=.temporal.api.enums.v1.StartChildWorkflowExecutionFailedCause\x12\x13\n\x07\x63ontrol\x18\x05 \x01(\tB\x02\x18\x01\x12\x1a\n\x12initiated_event_id\x18\x06 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03"\xa7\x02\n,ChildWorkflowExecutionStartedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x1a\n\x12initiated_event_id\x18\x02 \x01(\x03\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\x06header\x18\x05 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header"\xc5\x02\n.ChildWorkflowExecutionCompletedEventAttributes\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xfb\x02\n+ChildWorkflowExecutionFailedEventAttributes\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x08 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03\x12\x36\n\x0bretry_state\x18\x07 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\xc5\x02\n-ChildWorkflowExecutionCanceledEventAttributes\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x04 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x05 \x01(\x03\x12\x18\n\x10started_event_id\x18\x06 \x01(\x03"\xca\x02\n-ChildWorkflowExecutionTimedOutEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x07 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x36\n\x0bretry_state\x18\x06 \x01(\x0e\x32!.temporal.api.enums.v1.RetryState"\x94\x02\n/ChildWorkflowExecutionTerminatedEventAttributes\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0cnamespace_id\x18\x06 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x1a\n\x12initiated_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03"\xda\x05\n.WorkflowExecutionOptionsUpdatedEventAttributes\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12!\n\x19unset_versioning_override\x18\x02 \x01(\x08\x12\x1b\n\x13\x61ttached_request_id\x18\x03 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x04 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x32\n\x08priority\x18\x06 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x07 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig\x12$\n\x1ctime_skipping_config_updated\x18\t \x01(\x08\x12\x84\x01\n\x17workflow_update_options\x18\x08 \x03(\x0b\x32\x63.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributes.WorkflowUpdateOptionsUpdate\x1a\x96\x01\n\x1bWorkflowUpdateOptionsUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x1b\n\x13\x61ttached_request_id\x18\x02 \x01(\t\x12G\n\x1d\x61ttached_completion_callbacks\x18\x03 \x03(\x0b\x32 .temporal.api.common.v1.Callback"\xc0\x02\n3WorkflowPropertiesModifiedExternallyEventAttributes\x12\x16\n\x0enew_task_queue\x18\x01 \x01(\t\x12<\n\x19new_workflow_task_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12;\n\x18new_workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x1enew_workflow_execution_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x33\n\rupserted_memo\x18\x05 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x90\x01\n3ActivityPropertiesModifiedExternallyEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12=\n\x10new_retry_policy\x18\x02 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy"|\n\'WorkflowStreamSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x03"q\n4WorkflowNotificationChannelSubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t"\x90\x01\n6WorkflowNotificationChannelUnsubscribedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03"\x93\x01\n,WorkflowStreamRecordsAppendedEventAttributes\x12(\n workflow_task_completed_event_id\x18\x01 \x01(\x03\x12\x11\n\tstream_id\x18\x02 \x01(\t\x12\x13\n\x0b\x66rom_offset\x18\x03 \x01(\x03\x12\x11\n\tto_offset\x18\x04 \x01(\x03"\xdc\x01\n.WorkflowExecutionUpdateAcceptedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1b\x61\x63\x63\x65pted_request_message_id\x18\x02 \x01(\t\x12,\n$accepted_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10\x61\x63\x63\x65pted_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\xaa\x01\n/WorkflowExecutionUpdateCompletedEventAttributes\x12*\n\x04meta\x18\x01 \x01(\x0b\x32\x1c.temporal.api.update.v1.Meta\x12\x19\n\x11\x61\x63\x63\x65pted_event_id\x18\x03 \x01(\x03\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome"\x8f\x02\n.WorkflowExecutionUpdateRejectedEventAttributes\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12#\n\x1brejected_request_message_id\x18\x02 \x01(\t\x12,\n$rejected_request_sequencing_event_id\x18\x03 \x01(\x03\x12\x39\n\x10rejected_request\x18\x04 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\xa4\x01\n.WorkflowExecutionUpdateAdmittedEventAttributes\x12\x30\n\x07request\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request\x12@\n\x06origin\x18\x02 \x01(\x0e\x32\x30.temporal.api.enums.v1.UpdateAdmittedEventOrigin"^\n&WorkflowExecutionPausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"`\n(WorkflowExecutionUnpausedEventAttributes\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\xc5\x01\n8WorkflowExecutionTimeSkippingTransitionedEventAttributes\x12/\n\x0btarget_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12#\n\x1b\x64isabled_after_fast_forward\x18\x02 \x01(\x08\x12\x33\n\x0fwall_clock_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x04\n&NexusOperationScheduledEventAttributes\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12.\n\x05input\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x66\n\x0cnexus_header\x18\x06 \x03(\x0b\x32P.temporal.api.history.v1.NexusOperationScheduledEventAttributes.NexusHeaderEntry\x12(\n workflow_task_completed_event_id\x18\x07 \x01(\x03\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12\x13\n\x0b\x65ndpoint_id\x18\t \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x89\x01\n$NexusOperationStartedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x18\n\x0coperation_id\x18\x03 \x01(\tB\x02\x18\x01\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x17\n\x0foperation_token\x18\x05 \x01(\t"\x89\x01\n&NexusOperationCompletedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12/\n\x06result\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x88\x01\n#NexusOperationFailedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationTimedOutEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"\x8a\x01\n%NexusOperationCanceledEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x12\n\nrequest_id\x18\x03 \x01(\t"t\n,NexusOperationCancelRequestedEventAttributes\x12\x1a\n\x12scheduled_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03"\x97\x01\n3NexusOperationCancelRequestCompletedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x1a\n\x12scheduled_event_id\x18\x03 \x01(\x03"\xc7\x01\n0NexusOperationCancelRequestFailedEventAttributes\x12\x1a\n\x12requested_event_id\x18\x01 \x01(\x03\x12(\n workflow_task_completed_event_id\x18\x02 \x01(\x03\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1a\n\x12scheduled_event_id\x18\x04 \x01(\x03"\xf6\x43\n\x0cHistoryEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x03\x12.\n\nevent_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x34\n\nevent_type\x18\x03 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x0f\n\x07version\x18\x04 \x01(\x03\x12\x0f\n\x07task_id\x18\x05 \x01(\x03\x12\x1a\n\x11worker_may_ignore\x18\xac\x02 \x01(\x08\x12\x39\n\ruser_metadata\x18\xad\x02 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12,\n\x05links\x18\xae\x02 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x35\n\tprincipal\x18\xaf\x02 \x01(\x0b\x32!.temporal.api.common.v1.Principal\x12\x43\n\x13\x65vent_group_markers\x18\xb0\x02 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12w\n+workflow_execution_started_event_attributes\x18\x06 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowExecutionStartedEventAttributesH\x00\x12{\n-workflow_execution_completed_event_attributes\x18\x07 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowExecutionCompletedEventAttributesH\x00\x12u\n*workflow_execution_failed_event_attributes\x18\x08 \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionFailedEventAttributesH\x00\x12z\n-workflow_execution_timed_out_event_attributes\x18\t \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionTimedOutEventAttributesH\x00\x12q\n(workflow_task_scheduled_event_attributes\x18\n \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskScheduledEventAttributesH\x00\x12m\n&workflow_task_started_event_attributes\x18\x0b \x01(\x0b\x32;.temporal.api.history.v1.WorkflowTaskStartedEventAttributesH\x00\x12q\n(workflow_task_completed_event_attributes\x18\x0c \x01(\x0b\x32=.temporal.api.history.v1.WorkflowTaskCompletedEventAttributesH\x00\x12p\n(workflow_task_timed_out_event_attributes\x18\r \x01(\x0b\x32<.temporal.api.history.v1.WorkflowTaskTimedOutEventAttributesH\x00\x12k\n%workflow_task_failed_event_attributes\x18\x0e \x01(\x0b\x32:.temporal.api.history.v1.WorkflowTaskFailedEventAttributesH\x00\x12q\n(activity_task_scheduled_event_attributes\x18\x0f \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskScheduledEventAttributesH\x00\x12m\n&activity_task_started_event_attributes\x18\x10 \x01(\x0b\x32;.temporal.api.history.v1.ActivityTaskStartedEventAttributesH\x00\x12q\n(activity_task_completed_event_attributes\x18\x11 \x01(\x0b\x32=.temporal.api.history.v1.ActivityTaskCompletedEventAttributesH\x00\x12k\n%activity_task_failed_event_attributes\x18\x12 \x01(\x0b\x32:.temporal.api.history.v1.ActivityTaskFailedEventAttributesH\x00\x12p\n(activity_task_timed_out_event_attributes\x18\x13 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskTimedOutEventAttributesH\x00\x12^\n\x1etimer_started_event_attributes\x18\x14 \x01(\x0b\x32\x34.temporal.api.history.v1.TimerStartedEventAttributesH\x00\x12Z\n\x1ctimer_fired_event_attributes\x18\x15 \x01(\x0b\x32\x32.temporal.api.history.v1.TimerFiredEventAttributesH\x00\x12~\n/activity_task_cancel_requested_event_attributes\x18\x16 \x01(\x0b\x32\x43.temporal.api.history.v1.ActivityTaskCancelRequestedEventAttributesH\x00\x12o\n\'activity_task_canceled_event_attributes\x18\x17 \x01(\x0b\x32<.temporal.api.history.v1.ActivityTaskCanceledEventAttributesH\x00\x12`\n\x1ftimer_canceled_event_attributes\x18\x18 \x01(\x0b\x32\x35.temporal.api.history.v1.TimerCanceledEventAttributesH\x00\x12\x62\n marker_recorded_event_attributes\x18\x19 \x01(\x0b\x32\x36.temporal.api.history.v1.MarkerRecordedEventAttributesH\x00\x12y\n,workflow_execution_signaled_event_attributes\x18\x1a \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionSignaledEventAttributesH\x00\x12}\n.workflow_execution_terminated_event_attributes\x18\x1b \x01(\x0b\x32\x43.temporal.api.history.v1.WorkflowExecutionTerminatedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_cancel_requested_event_attributes\x18\x1c \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionCancelRequestedEventAttributesH\x00\x12y\n,workflow_execution_canceled_event_attributes\x18\x1d \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionCanceledEventAttributesH\x00\x12\xa8\x01\nErequest_cancel_external_workflow_execution_initiated_event_attributes\x18\x1e \x01(\x0b\x32W.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\xa2\x01\nBrequest_cancel_external_workflow_execution_failed_event_attributes\x18\x1f \x01(\x0b\x32T.temporal.api.history.v1.RequestCancelExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x99\x01\n=external_workflow_execution_cancel_requested_event_attributes\x18 \x01(\x0b\x32P.temporal.api.history.v1.ExternalWorkflowExecutionCancelRequestedEventAttributesH\x00\x12\x87\x01\n4workflow_execution_continued_as_new_event_attributes\x18! \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionContinuedAsNewEventAttributesH\x00\x12\x91\x01\n9start_child_workflow_execution_initiated_event_attributes\x18" \x01(\x0b\x32L.temporal.api.history.v1.StartChildWorkflowExecutionInitiatedEventAttributesH\x00\x12\x8b\x01\n6start_child_workflow_execution_failed_event_attributes\x18# \x01(\x0b\x32I.temporal.api.history.v1.StartChildWorkflowExecutionFailedEventAttributesH\x00\x12\x82\x01\n1child_workflow_execution_started_event_attributes\x18$ \x01(\x0b\x32\x45.temporal.api.history.v1.ChildWorkflowExecutionStartedEventAttributesH\x00\x12\x86\x01\n3child_workflow_execution_completed_event_attributes\x18% \x01(\x0b\x32G.temporal.api.history.v1.ChildWorkflowExecutionCompletedEventAttributesH\x00\x12\x80\x01\n0child_workflow_execution_failed_event_attributes\x18& \x01(\x0b\x32\x44.temporal.api.history.v1.ChildWorkflowExecutionFailedEventAttributesH\x00\x12\x84\x01\n2child_workflow_execution_canceled_event_attributes\x18\' \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionCanceledEventAttributesH\x00\x12\x85\x01\n3child_workflow_execution_timed_out_event_attributes\x18( \x01(\x0b\x32\x46.temporal.api.history.v1.ChildWorkflowExecutionTimedOutEventAttributesH\x00\x12\x88\x01\n4child_workflow_execution_terminated_event_attributes\x18) \x01(\x0b\x32H.temporal.api.history.v1.ChildWorkflowExecutionTerminatedEventAttributesH\x00\x12\x99\x01\n=signal_external_workflow_execution_initiated_event_attributes\x18* \x01(\x0b\x32P.temporal.api.history.v1.SignalExternalWorkflowExecutionInitiatedEventAttributesH\x00\x12\x93\x01\n:signal_external_workflow_execution_failed_event_attributes\x18+ \x01(\x0b\x32M.temporal.api.history.v1.SignalExternalWorkflowExecutionFailedEventAttributesH\x00\x12\x8a\x01\n5external_workflow_execution_signaled_event_attributes\x18, \x01(\x0b\x32I.temporal.api.history.v1.ExternalWorkflowExecutionSignaledEventAttributesH\x00\x12\x84\x01\n2upsert_workflow_search_attributes_event_attributes\x18- \x01(\x0b\x32\x46.temporal.api.history.v1.UpsertWorkflowSearchAttributesEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_accepted_event_attributes\x18. \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAcceptedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_rejected_event_attributes\x18/ \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateRejectedEventAttributesH\x00\x12\x88\x01\n4workflow_execution_update_completed_event_attributes\x18\x30 \x01(\x0b\x32H.temporal.api.history.v1.WorkflowExecutionUpdateCompletedEventAttributesH\x00\x12\x90\x01\n8workflow_properties_modified_externally_event_attributes\x18\x31 \x01(\x0b\x32L.temporal.api.history.v1.WorkflowPropertiesModifiedExternallyEventAttributesH\x00\x12\x90\x01\n8activity_properties_modified_externally_event_attributes\x18\x32 \x01(\x0b\x32L.temporal.api.history.v1.ActivityPropertiesModifiedExternallyEventAttributesH\x00\x12{\n-workflow_properties_modified_event_attributes\x18\x33 \x01(\x0b\x32\x42.temporal.api.history.v1.WorkflowPropertiesModifiedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_update_admitted_event_attributes\x18\x34 \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionUpdateAdmittedEventAttributesH\x00\x12u\n*nexus_operation_scheduled_event_attributes\x18\x35 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationScheduledEventAttributesH\x00\x12q\n(nexus_operation_started_event_attributes\x18\x36 \x01(\x0b\x32=.temporal.api.history.v1.NexusOperationStartedEventAttributesH\x00\x12u\n*nexus_operation_completed_event_attributes\x18\x37 \x01(\x0b\x32?.temporal.api.history.v1.NexusOperationCompletedEventAttributesH\x00\x12o\n\'nexus_operation_failed_event_attributes\x18\x38 \x01(\x0b\x32<.temporal.api.history.v1.NexusOperationFailedEventAttributesH\x00\x12s\n)nexus_operation_canceled_event_attributes\x18\x39 \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationCanceledEventAttributesH\x00\x12t\n*nexus_operation_timed_out_event_attributes\x18: \x01(\x0b\x32>.temporal.api.history.v1.NexusOperationTimedOutEventAttributesH\x00\x12\x82\x01\n1nexus_operation_cancel_requested_event_attributes\x18; \x01(\x0b\x32\x45.temporal.api.history.v1.NexusOperationCancelRequestedEventAttributesH\x00\x12\x86\x01\n3workflow_execution_options_updated_event_attributes\x18< \x01(\x0b\x32G.temporal.api.history.v1.WorkflowExecutionOptionsUpdatedEventAttributesH\x00\x12\x91\x01\n9nexus_operation_cancel_request_completed_event_attributes\x18= \x01(\x0b\x32L.temporal.api.history.v1.NexusOperationCancelRequestCompletedEventAttributesH\x00\x12\x8b\x01\n6nexus_operation_cancel_request_failed_event_attributes\x18> \x01(\x0b\x32I.temporal.api.history.v1.NexusOperationCancelRequestFailedEventAttributesH\x00\x12u\n*workflow_execution_paused_event_attributes\x18? \x01(\x0b\x32?.temporal.api.history.v1.WorkflowExecutionPausedEventAttributesH\x00\x12y\n,workflow_execution_unpaused_event_attributes\x18@ \x01(\x0b\x32\x41.temporal.api.history.v1.WorkflowExecutionUnpausedEventAttributesH\x00\x12\x9b\x01\n>workflow_execution_time_skipping_transitioned_event_attributes\x18\x41 \x01(\x0b\x32Q.temporal.api.history.v1.WorkflowExecutionTimeSkippingTransitionedEventAttributesH\x00\x12w\n+workflow_stream_subscribed_event_attributes\x18\x42 \x01(\x0b\x32@.temporal.api.history.v1.WorkflowStreamSubscribedEventAttributesH\x00\x12\x82\x01\n1workflow_stream_records_appended_event_attributes\x18\x43 \x01(\x0b\x32\x45.temporal.api.history.v1.WorkflowStreamRecordsAppendedEventAttributesH\x00\x12\x92\x01\n9workflow_notification_channel_subscribed_event_attributes\x18\x44 \x01(\x0b\x32M.temporal.api.history.v1.WorkflowNotificationChannelSubscribedEventAttributesH\x00\x12\x96\x01\n;workflow_notification_channel_unsubscribed_event_attributes\x18\x45 \x01(\x0b\x32O.temporal.api.history.v1.WorkflowNotificationChannelUnsubscribedEventAttributesH\x00\x42\x0c\n\nattributes"@\n\x07History\x12\x35\n\x06\x65vents\x18\x01 \x03(\x0b\x32%.temporal.api.history.v1.HistoryEventB\x8e\x01\n\x1aio.temporal.api.history.v1B\x0cMessageProtoP\x01Z%go.temporal.io/api/history/v1;history\xaa\x02\x19Temporalio.Api.History.V1\xea\x02\x1cTemporalio::Api::History::V1b\x06proto3' ) @@ -1297,131 +1297,131 @@ _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_start = 4980 _WORKFLOWTASKSTARTEDEVENTATTRIBUTES._serialized_end = 5396 _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 5399 - _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 6110 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6113 - _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6262 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6265 - _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6656 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6659 - _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7365 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7368 - _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7654 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7657 - _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7889 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7892 - _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8178 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8181 - _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8379 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8381 - _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8495 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8498 - _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8772 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8775 - _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8922 - _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8924 - _TIMERFIREDEVENTATTRIBUTES._serialized_end = 8995 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 8998 - _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9132 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9135 - _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9334 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9337 - _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9472 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9475 - _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9836 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9756 - _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9836 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9839 - _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10158 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10161 - _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10290 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10293 + _WORKFLOWTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 6116 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 6119 + _WORKFLOWTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 6268 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_start = 6271 + _WORKFLOWTASKFAILEDEVENTATTRIBUTES._serialized_end = 6662 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_start = 6665 + _ACTIVITYTASKSCHEDULEDEVENTATTRIBUTES._serialized_end = 7371 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_start = 7374 + _ACTIVITYTASKSTARTEDEVENTATTRIBUTES._serialized_end = 7660 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_start = 7663 + _ACTIVITYTASKCOMPLETEDEVENTATTRIBUTES._serialized_end = 7895 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_start = 7898 + _ACTIVITYTASKFAILEDEVENTATTRIBUTES._serialized_end = 8247 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_start = 8250 + _ACTIVITYTASKTIMEDOUTEVENTATTRIBUTES._serialized_end = 8448 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 8450 + _ACTIVITYTASKCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 8564 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_start = 8567 + _ACTIVITYTASKCANCELEDEVENTATTRIBUTES._serialized_end = 8841 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_start = 8844 + _TIMERSTARTEDEVENTATTRIBUTES._serialized_end = 8991 + _TIMERFIREDEVENTATTRIBUTES._serialized_start = 8993 + _TIMERFIREDEVENTATTRIBUTES._serialized_end = 9064 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_start = 9067 + _TIMERCANCELEDEVENTATTRIBUTES._serialized_end = 9201 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 9204 + _WORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 9403 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 9406 + _WORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 9541 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_start = 9544 + _MARKERRECORDEDEVENTATTRIBUTES._serialized_end = 9905 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_start = 9825 + _MARKERRECORDEDEVENTATTRIBUTES_DETAILSENTRY._serialized_end = 9905 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 9908 + _WORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 10227 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 10230 + _WORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 10359 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 10362 _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = ( - 10577 + 10646 ) _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = ( - 10580 + 10649 ) - _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10926 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10929 - _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11126 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11129 - _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11508 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11511 - _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11850 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11853 - _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12064 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12067 - _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12225 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12228 - _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12366 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12369 - _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13645 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13648 - _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 13990 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 13993 - _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14288 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14291 - _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14616 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14619 - _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14998 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 15001 - _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15326 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15329 - _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15659 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15662 - _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 15938 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 15941 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16671 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16521 - _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16671 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16674 - _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 16994 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16997 - _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17141 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17143 - _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17267 - _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17269 - _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17382 - _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17385 - _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17529 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17532 - _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17683 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17686 - _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17906 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17909 - _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 18079 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 18082 - _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18353 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18356 - _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18520 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18522 - _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18616 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18618 - _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18714 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18717 - _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18914 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18917 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19481 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19431 - _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19481 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19484 - _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19621 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19624 - _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19761 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19764 - _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19900 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19903 - _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 20041 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 20044 - _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20182 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20184 - _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20300 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20303 - _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20454 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20457 - _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20656 - _HISTORYEVENT._serialized_start = 20659 - _HISTORYEVENT._serialized_end = 29353 - _HISTORY._serialized_start = 29355 - _HISTORY._serialized_end = 29419 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 10995 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 10998 + _EXTERNALWORKFLOWEXECUTIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 11195 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 11198 + _SIGNALEXTERNALWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 11577 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 11580 + _SIGNALEXTERNALWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 11919 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_start = 11922 + _EXTERNALWORKFLOWEXECUTIONSIGNALEDEVENTATTRIBUTES._serialized_end = 12133 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_start = 12136 + _UPSERTWORKFLOWSEARCHATTRIBUTESEVENTATTRIBUTES._serialized_end = 12294 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_start = 12297 + _WORKFLOWPROPERTIESMODIFIEDEVENTATTRIBUTES._serialized_end = 12435 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_start = 12438 + _STARTCHILDWORKFLOWEXECUTIONINITIATEDEVENTATTRIBUTES._serialized_end = 13714 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 13717 + _STARTCHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 14059 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_start = 14062 + _CHILDWORKFLOWEXECUTIONSTARTEDEVENTATTRIBUTES._serialized_end = 14357 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 14360 + _CHILDWORKFLOWEXECUTIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 14685 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_start = 14688 + _CHILDWORKFLOWEXECUTIONFAILEDEVENTATTRIBUTES._serialized_end = 15067 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_start = 15070 + _CHILDWORKFLOWEXECUTIONCANCELEDEVENTATTRIBUTES._serialized_end = 15395 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 15398 + _CHILDWORKFLOWEXECUTIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 15728 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_start = 15731 + _CHILDWORKFLOWEXECUTIONTERMINATEDEVENTATTRIBUTES._serialized_end = 16007 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_start = 16010 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES._serialized_end = 16740 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_start = 16590 + _WORKFLOWEXECUTIONOPTIONSUPDATEDEVENTATTRIBUTES_WORKFLOWUPDATEOPTIONSUPDATE._serialized_end = 16740 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 16743 + _WORKFLOWPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17063 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_start = 17066 + _ACTIVITYPROPERTIESMODIFIEDEXTERNALLYEVENTATTRIBUTES._serialized_end = 17210 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17212 + _WORKFLOWSTREAMSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17336 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17338 + _WORKFLOWNOTIFICATIONCHANNELSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17451 + _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_start = 17454 + _WORKFLOWNOTIFICATIONCHANNELUNSUBSCRIBEDEVENTATTRIBUTES._serialized_end = 17598 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_start = 17601 + _WORKFLOWSTREAMRECORDSAPPENDEDEVENTATTRIBUTES._serialized_end = 17748 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_start = 17751 + _WORKFLOWEXECUTIONUPDATEACCEPTEDEVENTATTRIBUTES._serialized_end = 17971 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_start = 17974 + _WORKFLOWEXECUTIONUPDATECOMPLETEDEVENTATTRIBUTES._serialized_end = 18144 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_start = 18147 + _WORKFLOWEXECUTIONUPDATEREJECTEDEVENTATTRIBUTES._serialized_end = 18418 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_start = 18421 + _WORKFLOWEXECUTIONUPDATEADMITTEDEVENTATTRIBUTES._serialized_end = 18585 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_start = 18587 + _WORKFLOWEXECUTIONPAUSEDEVENTATTRIBUTES._serialized_end = 18681 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_start = 18683 + _WORKFLOWEXECUTIONUNPAUSEDEVENTATTRIBUTES._serialized_end = 18779 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_start = 18782 + _WORKFLOWEXECUTIONTIMESKIPPINGTRANSITIONEDEVENTATTRIBUTES._serialized_end = 18979 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_start = 18982 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES._serialized_end = 19546 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_start = 19496 + _NEXUSOPERATIONSCHEDULEDEVENTATTRIBUTES_NEXUSHEADERENTRY._serialized_end = 19546 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_start = 19549 + _NEXUSOPERATIONSTARTEDEVENTATTRIBUTES._serialized_end = 19686 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_start = 19689 + _NEXUSOPERATIONCOMPLETEDEVENTATTRIBUTES._serialized_end = 19826 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_start = 19829 + _NEXUSOPERATIONFAILEDEVENTATTRIBUTES._serialized_end = 19965 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_start = 19968 + _NEXUSOPERATIONTIMEDOUTEVENTATTRIBUTES._serialized_end = 20106 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_start = 20109 + _NEXUSOPERATIONCANCELEDEVENTATTRIBUTES._serialized_end = 20247 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_start = 20249 + _NEXUSOPERATIONCANCELREQUESTEDEVENTATTRIBUTES._serialized_end = 20365 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_start = 20368 + _NEXUSOPERATIONCANCELREQUESTCOMPLETEDEVENTATTRIBUTES._serialized_end = 20519 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_start = 20522 + _NEXUSOPERATIONCANCELREQUESTFAILEDEVENTATTRIBUTES._serialized_end = 20721 + _HISTORYEVENT._serialized_start = 20724 + _HISTORYEVENT._serialized_end = 29418 + _HISTORY._serialized_start = 29420 + _HISTORY._serialized_end = 29484 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflow/v1/message_pb2.py b/temporalio/api/workflow/v1/message_pb2.py index 3f6c7d950..89648e72c 100644 --- a/temporalio/api/workflow/v1/message_pb2.py +++ b/temporalio/api/workflow/v1/message_pb2.py @@ -51,7 +51,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x82\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xc3\x02\n\x17\x43hannelSubscriptionInfo\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03\x12\x14\n\x0clast_counter\x18\x04 \x01(\x03\x12H\n\x14pending_notification\x18\x05 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x19\n\x11scheduled_counter\x18\x06 \x01(\x03\x12\x16\n\x0elistener_count\x18\x07 \x01(\x05\x12\x16\n\x0eretained_count\x18\x08 \x01(\x05\x12\x16\n\x0e\x61\x63\x63\x65pted_count\x18\t \x01(\x03"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' + b'\n&temporal/api/workflow/v1/message.proto\x12\x18temporal.api.workflow.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a google/protobuf/field_mask.proto\x1a&temporal/api/activity/v1/message.proto\x1a"temporal/api/enums/v1/common.proto\x1a&temporal/api/enums/v1/event_type.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a$temporal/api/common/v1/message.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto"\xf0\t\n\x15WorkflowExecutionInfo\x12<\n\texecution\x18\x01 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x04type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12\x16\n\x0ehistory_length\x18\x06 \x01(\x03\x12\x1b\n\x13parent_namespace_id\x18\x07 \x01(\t\x12\x43\n\x10parent_execution\x18\x08 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x32\n\x0e\x65xecution_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x04memo\x18\n \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0b \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12@\n\x11\x61uto_reset_points\x18\x0c \x01(\x0b\x32%.temporal.api.workflow.v1.ResetPoints\x12\x12\n\ntask_queue\x18\r \x01(\t\x12\x1e\n\x16state_transition_count\x18\x0e \x01(\x03\x12\x1a\n\x12history_size_bytes\x18\x0f \x01(\x03\x12X\n most_recent_worker_version_stamp\x18\x10 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x35\n\x12\x65xecution_duration\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x0eroot_execution\x18\x12 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1d\n\x11\x61ssigned_build_id\x18\x13 \x01(\tB\x02\x18\x01\x12\x1e\n\x12inherited_build_id\x18\x14 \x01(\tB\x02\x18\x01\x12\x14\n\x0c\x66irst_run_id\x18\x15 \x01(\t\x12R\n\x0fversioning_info\x18\x16 \x01(\x0b\x32\x39.temporal.api.workflow.v1.WorkflowExecutionVersioningInfo\x12\x1e\n\x16worker_deployment_name\x18\x17 \x01(\t\x12\x32\n\x08priority\x18\x18 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12#\n\x1b\x65xternal_payload_size_bytes\x18\x19 \x01(\x03\x12\x1e\n\x16\x65xternal_payload_count\x18\x1a \x01(\x03"\x8c\x05\n\x1dWorkflowExecutionExtendedInfo\x12=\n\x19\x65xecution_expiration_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13run_expiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63\x61ncel_requested\x18\x03 \x01(\x08\x12\x33\n\x0flast_reset_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x37\n\x13original_start_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0creset_run_id\x18\x06 \x01(\t\x12\x65\n\x10request_id_infos\x18\x07 \x03(\x0b\x32K.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo.RequestIdInfosEntry\x12H\n\npause_info\x18\x08 \x01(\x0b\x32\x34.temporal.api.workflow.v1.WorkflowExecutionPauseInfo\x12\x44\n\x12time_skipping_info\x18\t \x01(\x0b\x32(.temporal.api.common.v1.TimeSkippingInfo\x1a^\n\x13RequestIdInfosEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.temporal.api.workflow.v1.RequestIdInfo:\x02\x38\x01"\xfb\x04\n\x1fWorkflowExecutionVersioningInfo\x12;\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x13\n\x07version\x18\x05 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12I\n\x13versioning_override\x18\x03 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12Q\n\x15\x64\x65ployment_transition\x18\x04 \x01(\x0b\x32..temporal.api.workflow.v1.DeploymentTransitionB\x02\x18\x01\x12Q\n\x12version_transition\x18\x06 \x01(\x0b\x32\x35.temporal.api.workflow.v1.DeploymentVersionTransition\x12\x17\n\x0frevision_number\x18\x08 \x01(\x03\x12k\n+continue_as_new_initial_versioning_behavior\x18\t \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior"R\n\x14\x44\x65ploymentTransition\x12:\n\ndeployment\x18\x01 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\x83\x01\n\x1b\x44\x65ploymentVersionTransition\x12\x13\n\x07version\x18\x01 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"\xc7\x02\n\x17WorkflowExecutionConfig\x12\x38\n\ntask_queue\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x1aworkflow_execution_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration\x12@\n\x1d\x64\x65\x66\x61ult_workflow_task_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x05 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata"\xbd\r\n\x13PendingActivityInfo\x12\x13\n\x0b\x61\x63tivity_id\x18\x01 \x01(\t\x12;\n\ractivity_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.temporal.api.enums.v1.PendingActivityState\x12;\n\x11heartbeat_details\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x13last_heartbeat_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_started_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x07 \x01(\x05\x12\x18\n\x10maximum_attempts\x18\x08 \x01(\x05\x12\x32\n\x0escheduled_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x65xpiration_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\x0clast_failure\x18\x0b \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x1c\n\x14last_worker_identity\x18\x0c \x01(\t\x12;\n\x15use_workflow_build_id\x18\r \x01(\x0b\x32\x16.google.protobuf.EmptyB\x02\x18\x01H\x00\x12\x32\n$last_independently_assigned_build_id\x18\x0e \x01(\tB\x02\x18\x01H\x00\x12Q\n\x19last_worker_version_stamp\x18\x0f \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x39\n\x16\x63urrent_retry_interval\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x1alast_attempt_complete_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1anext_attempt_schedule_time\x18\x12 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06paused\x18\x13 \x01(\x08\x12\x43\n\x0flast_deployment\x18\x14 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12*\n\x1elast_worker_deployment_version\x18\x15 \x01(\tB\x02\x18\x01\x12T\n\x17last_deployment_version\x18\x19 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x32\n\x08priority\x18\x16 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12K\n\npause_info\x18\x17 \x01(\x0b\x32\x37.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo\x12\x43\n\x10\x61\x63tivity_options\x18\x18 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x1a\xcf\x02\n\tPauseInfo\x12.\n\npause_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12P\n\x06manual\x18\x02 \x01(\x0b\x32>.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.ManualH\x00\x12L\n\x04rule\x18\x04 \x01(\x0b\x32<.temporal.api.workflow.v1.PendingActivityInfo.PauseInfo.RuleH\x00\x1a*\n\x06Manual\x12\x10\n\x08identity\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x39\n\x04Rule\x12\x0f\n\x07rule_id\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x0b\n\tpaused_byB\x13\n\x11\x61ssigned_build_id"\xb9\x01\n\x19PendingChildExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12\x1a\n\x12workflow_type_name\x18\x03 \x01(\t\x12\x14\n\x0cinitiated_id\x18\x04 \x01(\x03\x12\x45\n\x13parent_close_policy\x18\x05 \x01(\x0e\x32(.temporal.api.enums.v1.ParentClosePolicy"\x8d\x02\n\x17PendingWorkflowTaskInfo\x12>\n\x05state\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.PendingWorkflowTaskState\x12\x32\n\x0escheduled_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x17original_scheduled_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05"G\n\x0bResetPoints\x12\x38\n\x06points\x18\x01 \x03(\x0b\x32(.temporal.api.workflow.v1.ResetPointInfo"\xef\x01\n\x0eResetPointInfo\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x01 \x01(\tB\x02\x18\x01\x12\x0e\n\x06run_id\x18\x02 \x01(\t\x12(\n first_workflow_task_completed_id\x18\x03 \x01(\x03\x12/\n\x0b\x63reate_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x65xpire_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nresettable\x18\x06 \x01(\x08"\x85\x07\n\x18NewWorkflowExecutionInfo\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12;\n\rworkflow_type\x18\x02 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x18workflow_id_reuse_policy\x18\x08 \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\n \x01(\t\x12*\n\x04memo\x18\x0b \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0c \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\r \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x0e \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12I\n\x13versioning_override\x18\x0f \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority"\x96\x06\n\x0c\x43\x61llbackInfo\x12\x32\n\x08\x63\x61llback\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12?\n\x07trigger\x18\x02 \x01(\x0b\x32..temporal.api.workflow.v1.CallbackInfo.Trigger\x12\x35\n\x11registration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x05state\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.CallbackState\x12\x0f\n\x07\x61ttempt\x18\x05 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x1a\x10\n\x0eWorkflowClosed\x1a\x35\n UpdateWorkflowExecutionCompleted\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x1a\xde\x01\n\x07Trigger\x12P\n\x0fworkflow_closed\x18\x01 \x01(\x0b\x32\x35.temporal.api.workflow.v1.CallbackInfo.WorkflowClosedH\x00\x12v\n#update_workflow_execution_completed\x18\x02 \x01(\x0b\x32G.temporal.api.workflow.v1.CallbackInfo.UpdateWorkflowExecutionCompletedH\x00\x42\t\n\x07variant"\x8b\x06\n\x19PendingNexusOperationInfo\x12\x10\n\x08\x65ndpoint\x18\x01 \x01(\t\x12\x0f\n\x07service\x18\x02 \x01(\t\x12\x11\n\toperation\x18\x03 \x01(\t\x12\x18\n\x0coperation_id\x18\x04 \x01(\tB\x02\x18\x01\x12<\n\x19schedule_to_close_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0escheduled_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12@\n\x05state\x18\x07 \x01(\x0e\x32\x31.temporal.api.enums.v1.PendingNexusOperationState\x12\x0f\n\x07\x61ttempt\x18\x08 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\n \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12S\n\x11\x63\x61ncellation_info\x18\x0c \x01(\x0b\x32\x38.temporal.api.workflow.v1.NexusOperationCancellationInfo\x12\x1a\n\x12scheduled_event_id\x18\r \x01(\x03\x12\x16\n\x0e\x62locked_reason\x18\x0e \x01(\t\x12\x17\n\x0foperation_token\x18\x0f \x01(\t\x12<\n\x19schedule_to_start_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x11 \x01(\x0b\x32\x19.google.protobuf.Duration"\x84\x03\n\x1eNexusOperationCancellationInfo\x12\x32\n\x0erequested_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x05state\x18\x02 \x01(\x0e\x32\x36.temporal.api.enums.v1.NexusOperationCancellationState\x12\x0f\n\x07\x61ttempt\x18\x03 \x01(\x05\x12>\n\x1alast_attempt_complete_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x14last_attempt_failure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12>\n\x1anext_attempt_schedule_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x16\n\x0e\x62locked_reason\x18\x07 \x01(\t"\xc3\x02\n\x17\x43hannelSubscriptionInfo\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x37\n\x04kind\x18\x02 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x1b\n\x13subscribed_event_id\x18\x03 \x01(\x03\x12\x14\n\x0clast_counter\x18\x04 \x01(\x03\x12H\n\x14pending_notification\x18\x05 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x19\n\x11scheduled_counter\x18\x06 \x01(\x03\x12\x16\n\x0elistener_count\x18\x07 \x01(\x05\x12\x16\n\x0eretained_count\x18\x08 \x01(\x05\x12\x16\n\x0e\x61\x63\x63\x65pted_count\x18\t \x01(\x03"\xe3\x01\n\x18WorkflowExecutionOptions\x12I\n\x13versioning_override\x18\x01 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x03 \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xfa\x05\n\x12VersioningOverride\x12M\n\x06pinned\x18\x03 \x01(\x0b\x32;.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideH\x00\x12\x16\n\x0c\x61uto_upgrade\x18\x04 \x01(\x08H\x00\x12P\n\x08one_time\x18\x05 \x01(\x0b\x32<.temporal.api.workflow.v1.VersioningOverride.OneTimeOverrideH\x00\x12?\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehaviorB\x02\x18\x01\x12>\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x1a\n\x0epinned_version\x18\t \x01(\tB\x02\x18\x01\x1a\xad\x01\n\x0ePinnedOverride\x12U\n\x08\x62\x65havior\x18\x01 \x01(\x0e\x32\x43.temporal.api.workflow.v1.VersioningOverride.PinnedOverrideBehavior\x12\x44\n\x07version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x1ai\n\x0fOneTimeOverride\x12V\n\x19target_deployment_version\x18\x01 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion"g\n\x16PinnedOverrideBehavior\x12(\n$PINNED_OVERRIDE_BEHAVIOR_UNSPECIFIED\x10\x00\x12#\n\x1fPINNED_OVERRIDE_BEHAVIOR_PINNED\x10\x01\x42\n\n\x08override"i\n\x11OnConflictOptions\x12\x19\n\x11\x61ttach_request_id\x18\x01 \x01(\x08\x12#\n\x1b\x61ttach_completion_callbacks\x18\x02 \x01(\x08\x12\x14\n\x0c\x61ttach_links\x18\x03 \x01(\x08"i\n\rRequestIdInfo\x12\x34\n\nevent_type\x18\x01 \x01(\x0e\x32 .temporal.api.enums.v1.EventType\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\x03\x12\x10\n\x08\x62uffered\x18\x03 \x01(\x08"\xb7\x04\n\x12PostResetOperation\x12V\n\x0fsignal_workflow\x18\x01 \x01(\x0b\x32;.temporal.api.workflow.v1.PostResetOperation.SignalWorkflowH\x00\x12\x65\n\x17update_workflow_options\x18\x02 \x01(\x0b\x32\x42.temporal.api.workflow.v1.PostResetOperation.UpdateWorkflowOptionsH\x00\x1a\xb3\x01\n\x0eSignalWorkflow\x12\x13\n\x0bsignal_name\x18\x01 \x01(\t\x12/\n\x05input\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12.\n\x06header\x18\x03 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\x04 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\xa0\x01\n\x15UpdateWorkflowOptions\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\t\n\x07variant"o\n\x1aWorkflowExecutionPauseInfo\x12\x10\n\x08identity\x18\x01 \x01(\t\x12/\n\x0bpaused_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06reason\x18\x03 \x01(\tB\x93\x01\n\x1bio.temporal.api.workflow.v1B\x0cMessageProtoP\x01Z\'go.temporal.io/api/workflow/v1;workflow\xaa\x02\x1aTemporalio.Api.Workflow.V1\xea\x02\x1dTemporalio::Api::Workflow::V1b\x06proto3' ) @@ -581,39 +581,39 @@ _NEWWORKFLOWEXECUTIONINFO._serialized_start = 6207 _NEWWORKFLOWEXECUTIONINFO._serialized_end = 7108 _CALLBACKINFO._serialized_start = 7111 - _CALLBACKINFO._serialized_end = 7881 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7585 - _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7601 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7603 - _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7656 - _CALLBACKINFO_TRIGGER._serialized_start = 7659 - _CALLBACKINFO_TRIGGER._serialized_end = 7881 - _PENDINGNEXUSOPERATIONINFO._serialized_start = 7884 - _PENDINGNEXUSOPERATIONINFO._serialized_end = 8663 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8666 - _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9054 - _CHANNELSUBSCRIPTIONINFO._serialized_start = 9057 - _CHANNELSUBSCRIPTIONINFO._serialized_end = 9380 - _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9383 - _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9610 - _VERSIONINGOVERRIDE._serialized_start = 9613 - _VERSIONINGOVERRIDE._serialized_end = 10375 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9978 - _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 10151 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 10153 - _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 10258 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 10260 - _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 10363 - _ONCONFLICTOPTIONS._serialized_start = 10377 - _ONCONFLICTOPTIONS._serialized_end = 10482 - _REQUESTIDINFO._serialized_start = 10484 - _REQUESTIDINFO._serialized_end = 10589 - _POSTRESETOPERATION._serialized_start = 10592 - _POSTRESETOPERATION._serialized_end = 11159 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10806 - _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 10985 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 10988 - _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 11148 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 11161 - _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 11272 + _CALLBACKINFO._serialized_end = 7901 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_start = 7605 + _CALLBACKINFO_WORKFLOWCLOSED._serialized_end = 7621 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_start = 7623 + _CALLBACKINFO_UPDATEWORKFLOWEXECUTIONCOMPLETED._serialized_end = 7676 + _CALLBACKINFO_TRIGGER._serialized_start = 7679 + _CALLBACKINFO_TRIGGER._serialized_end = 7901 + _PENDINGNEXUSOPERATIONINFO._serialized_start = 7904 + _PENDINGNEXUSOPERATIONINFO._serialized_end = 8683 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_start = 8686 + _NEXUSOPERATIONCANCELLATIONINFO._serialized_end = 9074 + _CHANNELSUBSCRIPTIONINFO._serialized_start = 9077 + _CHANNELSUBSCRIPTIONINFO._serialized_end = 9400 + _WORKFLOWEXECUTIONOPTIONS._serialized_start = 9403 + _WORKFLOWEXECUTIONOPTIONS._serialized_end = 9630 + _VERSIONINGOVERRIDE._serialized_start = 9633 + _VERSIONINGOVERRIDE._serialized_end = 10395 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_start = 9998 + _VERSIONINGOVERRIDE_PINNEDOVERRIDE._serialized_end = 10171 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_start = 10173 + _VERSIONINGOVERRIDE_ONETIMEOVERRIDE._serialized_end = 10278 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_start = 10280 + _VERSIONINGOVERRIDE_PINNEDOVERRIDEBEHAVIOR._serialized_end = 10383 + _ONCONFLICTOPTIONS._serialized_start = 10397 + _ONCONFLICTOPTIONS._serialized_end = 10502 + _REQUESTIDINFO._serialized_start = 10504 + _REQUESTIDINFO._serialized_end = 10609 + _POSTRESETOPERATION._serialized_start = 10612 + _POSTRESETOPERATION._serialized_end = 11179 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_start = 10826 + _POSTRESETOPERATION_SIGNALWORKFLOW._serialized_end = 11005 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_start = 11008 + _POSTRESETOPERATION_UPDATEWORKFLOWOPTIONS._serialized_end = 11168 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_start = 11181 + _WORKFLOWEXECUTIONPAUSEINFO._serialized_end = 11292 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index aee2202bf..7318b0d99 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.nexusoperation.v1 import ( + message_pb2 as temporal_dot_api_dot_nexusoperation_dot_v1_dot_message__pb2, +) from temporalio.api.notification.v1 import ( message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, ) @@ -137,7 +140,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4348,598 +4351,598 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1728 - _REGISTERNAMESPACEREQUEST._serialized_end = 2376 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2333 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2376 - _REGISTERNAMESPACERESPONSE._serialized_start = 2378 - _REGISTERNAMESPACERESPONSE._serialized_end = 2405 - _LISTNAMESPACESREQUEST._serialized_start = 2408 - _LISTNAMESPACESREQUEST._serialized_end = 2545 - _LISTNAMESPACESRESPONSE._serialized_start = 2548 - _LISTNAMESPACESRESPONSE._serialized_end = 2677 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2679 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2762 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2765 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3278 - _UPDATENAMESPACEREQUEST._serialized_start = 3281 - _UPDATENAMESPACEREQUEST._serialized_end = 3616 - _UPDATENAMESPACERESPONSE._serialized_start = 3619 - _UPDATENAMESPACERESPONSE._serialized_end = 3910 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3912 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3982 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3984 - _DEPRECATENAMESPACERESPONSE._serialized_end = 4012 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4015 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5632 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5635 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5933 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5936 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6234 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6237 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6423 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6426 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6602 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6604 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6724 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8323 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8233 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8317 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8326 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9498 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9593 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9595 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9667 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9912 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9915 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10440 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10442 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10477 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10480 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10966 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10969 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12150 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12153 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12318 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12320 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12432 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12435 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12642 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12644 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12760 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12763 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13145 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13147 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13185 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13188 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13395 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13397 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13439 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13442 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13888 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13890 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13977 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13980 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14251 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14253 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14344 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14347 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14729 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14731 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14768 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14771 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15059 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15061 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15102 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15105 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15365 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15367 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15407 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15410 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15760 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 - _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16058 - _NOTIFYCHANNELRESPONSE._serialized_start = 16060 - _NOTIFYCHANNELRESPONSE._serialized_end = 16107 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16110 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16339 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16341 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16395 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16398 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16578 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16580 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16615 - _POLLCHANNELREQUEST._serialized_start = 16618 - _POLLCHANNELREQUEST._serialized_end = 16836 - _POLLCHANNELRESPONSE._serialized_start = 16838 - _POLLCHANNELRESPONSE._serialized_end = 16926 - _DESCRIBECHANNELREQUEST._serialized_start = 16929 - _DESCRIBECHANNELREQUEST._serialized_end = 17060 - _DESCRIBECHANNELRESPONSE._serialized_start = 17063 - _DESCRIBECHANNELRESPONSE._serialized_end = 17357 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17360 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18699 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18702 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18860 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18863 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19312 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19314 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19362 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19365 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19652 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19654 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19690 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19692 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19814 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19816 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19849 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19852 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20181 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20184 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20314 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20317 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20711 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20714 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20846 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20848 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20957 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20959 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21085 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21087 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21204 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21207 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21341 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21343 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21452 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21454 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21580 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21582 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21648 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21651 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21888 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21890 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21918 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21921 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22122 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22038 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22122 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22125 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22486 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22488 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22523 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22525 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22635 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22637 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22667 - _SHUTDOWNWORKERREQUEST._serialized_start = 22670 - _SHUTDOWNWORKERREQUEST._serialized_end = 22953 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22955 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22979 - _QUERYWORKFLOWREQUEST._serialized_start = 22982 - _QUERYWORKFLOWREQUEST._serialized_end = 23215 - _QUERYWORKFLOWRESPONSE._serialized_start = 23218 - _QUERYWORKFLOWRESPONSE._serialized_end = 23403 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24270 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24273 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24801 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24804 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25808 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25590 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25706 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25708 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25808 - _GETCLUSTERINFOREQUEST._serialized_start = 25810 - _GETCLUSTERINFOREQUEST._serialized_end = 25833 - _GETCLUSTERINFORESPONSE._serialized_start = 25836 - _GETCLUSTERINFORESPONSE._serialized_end = 26301 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26246 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26301 - _GETSYSTEMINFOREQUEST._serialized_start = 26303 - _GETSYSTEMINFOREQUEST._serialized_end = 26325 - _GETSYSTEMINFORESPONSE._serialized_start = 26328 - _GETSYSTEMINFORESPONSE._serialized_end = 26905 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26469 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26905 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26907 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27016 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27019 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27242 - _CREATESCHEDULEREQUEST._serialized_start = 27245 - _CREATESCHEDULEREQUEST._serialized_end = 27577 - _CREATESCHEDULERESPONSE._serialized_start = 27579 - _CREATESCHEDULERESPONSE._serialized_end = 27627 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27629 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27694 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27697 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27968 - _UPDATESCHEDULEREQUEST._serialized_start = 27971 - _UPDATESCHEDULEREQUEST._serialized_end = 28263 - _UPDATESCHEDULERESPONSE._serialized_start = 28265 - _UPDATESCHEDULERESPONSE._serialized_end = 28289 - _PATCHSCHEDULEREQUEST._serialized_start = 28292 - _PATCHSCHEDULEREQUEST._serialized_end = 28448 - _PATCHSCHEDULERESPONSE._serialized_start = 28450 - _PATCHSCHEDULERESPONSE._serialized_end = 28473 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28476 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28644 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28646 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28729 - _DELETESCHEDULEREQUEST._serialized_start = 28731 - _DELETESCHEDULEREQUEST._serialized_end = 28812 - _DELETESCHEDULERESPONSE._serialized_start = 28814 - _DELETESCHEDULERESPONSE._serialized_end = 28838 - _LISTSCHEDULESREQUEST._serialized_start = 28840 - _LISTSCHEDULESREQUEST._serialized_end = 28948 - _LISTSCHEDULESRESPONSE._serialized_start = 28950 - _LISTSCHEDULESRESPONSE._serialized_end = 29062 - _COUNTSCHEDULESREQUEST._serialized_start = 29064 - _COUNTSCHEDULESREQUEST._serialized_end = 29121 - _COUNTSCHEDULESRESPONSE._serialized_start = 29124 - _COUNTSCHEDULESRESPONSE._serialized_end = 29343 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29346 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29992 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29793 + _REGISTERNAMESPACEREQUEST._serialized_start = 1774 + _REGISTERNAMESPACEREQUEST._serialized_end = 2422 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2379 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2422 + _REGISTERNAMESPACERESPONSE._serialized_start = 2424 + _REGISTERNAMESPACERESPONSE._serialized_end = 2451 + _LISTNAMESPACESREQUEST._serialized_start = 2454 + _LISTNAMESPACESREQUEST._serialized_end = 2591 + _LISTNAMESPACESRESPONSE._serialized_start = 2594 + _LISTNAMESPACESRESPONSE._serialized_end = 2723 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2725 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2808 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2811 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3324 + _UPDATENAMESPACEREQUEST._serialized_start = 3327 + _UPDATENAMESPACEREQUEST._serialized_end = 3662 + _UPDATENAMESPACERESPONSE._serialized_start = 3665 + _UPDATENAMESPACERESPONSE._serialized_end = 3956 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3958 + _DEPRECATENAMESPACEREQUEST._serialized_end = 4028 + _DEPRECATENAMESPACERESPONSE._serialized_start = 4030 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4058 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4061 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5678 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5681 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5979 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5982 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6280 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6283 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6469 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6472 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6648 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6650 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6770 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6773 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7213 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7216 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8369 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8279 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8363 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8372 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9544 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9639 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9641 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9713 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9958 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9961 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10486 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10488 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10523 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10526 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11012 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11015 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12196 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12199 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12364 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12366 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12478 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12481 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12688 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12690 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12806 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12809 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13191 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13193 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13231 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13234 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13441 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13443 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13485 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13488 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13997 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13999 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14086 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14089 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14423 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14425 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14516 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14519 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14901 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14903 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14940 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14943 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15231 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15233 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15274 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15277 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15537 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15539 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15579 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15582 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15932 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15934 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 16011 + _NOTIFYCHANNELREQUEST._serialized_start = 16014 + _NOTIFYCHANNELREQUEST._serialized_end = 16230 + _NOTIFYCHANNELRESPONSE._serialized_start = 16232 + _NOTIFYCHANNELRESPONSE._serialized_end = 16279 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16282 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16511 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16513 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16567 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16570 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16750 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16752 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16787 + _POLLCHANNELREQUEST._serialized_start = 16790 + _POLLCHANNELREQUEST._serialized_end = 17008 + _POLLCHANNELRESPONSE._serialized_start = 17010 + _POLLCHANNELRESPONSE._serialized_end = 17098 + _DESCRIBECHANNELREQUEST._serialized_start = 17101 + _DESCRIBECHANNELREQUEST._serialized_end = 17232 + _DESCRIBECHANNELRESPONSE._serialized_start = 17235 + _DESCRIBECHANNELRESPONSE._serialized_end = 17529 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17532 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18871 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18874 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 19032 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 19035 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19484 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19486 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19534 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19537 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19824 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19826 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19862 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19864 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19986 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19988 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 20021 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 20024 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20353 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20356 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20486 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20489 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20883 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20886 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21018 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21020 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21129 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21131 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21257 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21259 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21376 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21379 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21513 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21515 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21624 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21626 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21752 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21754 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21820 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21823 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 22060 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 22062 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 22090 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 22093 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22294 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22210 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22294 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22297 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22658 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22660 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22695 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22697 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22807 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22809 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22839 + _SHUTDOWNWORKERREQUEST._serialized_start = 22842 + _SHUTDOWNWORKERREQUEST._serialized_end = 23125 + _SHUTDOWNWORKERRESPONSE._serialized_start = 23127 + _SHUTDOWNWORKERRESPONSE._serialized_end = 23151 + _QUERYWORKFLOWREQUEST._serialized_start = 23154 + _QUERYWORKFLOWREQUEST._serialized_end = 23387 + _QUERYWORKFLOWRESPONSE._serialized_start = 23390 + _QUERYWORKFLOWRESPONSE._serialized_end = 23575 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23577 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23692 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23695 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24442 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24445 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24973 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24976 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25980 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25660 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25760 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25762 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25878 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25880 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25980 + _GETCLUSTERINFOREQUEST._serialized_start = 25982 + _GETCLUSTERINFOREQUEST._serialized_end = 26005 + _GETCLUSTERINFORESPONSE._serialized_start = 26008 + _GETCLUSTERINFORESPONSE._serialized_end = 26473 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26418 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26473 + _GETSYSTEMINFOREQUEST._serialized_start = 26475 + _GETSYSTEMINFOREQUEST._serialized_end = 26497 + _GETSYSTEMINFORESPONSE._serialized_start = 26500 + _GETSYSTEMINFORESPONSE._serialized_end = 27077 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26641 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 27077 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 27079 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27188 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27191 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27414 + _CREATESCHEDULEREQUEST._serialized_start = 27417 + _CREATESCHEDULEREQUEST._serialized_end = 27749 + _CREATESCHEDULERESPONSE._serialized_start = 27751 + _CREATESCHEDULERESPONSE._serialized_end = 27799 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27801 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27866 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27869 + _DESCRIBESCHEDULERESPONSE._serialized_end = 28140 + _UPDATESCHEDULEREQUEST._serialized_start = 28143 + _UPDATESCHEDULEREQUEST._serialized_end = 28435 + _UPDATESCHEDULERESPONSE._serialized_start = 28437 + _UPDATESCHEDULERESPONSE._serialized_end = 28461 + _PATCHSCHEDULEREQUEST._serialized_start = 28464 + _PATCHSCHEDULEREQUEST._serialized_end = 28620 + _PATCHSCHEDULERESPONSE._serialized_start = 28622 + _PATCHSCHEDULERESPONSE._serialized_end = 28645 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28648 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28816 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28818 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28901 + _DELETESCHEDULEREQUEST._serialized_start = 28903 + _DELETESCHEDULEREQUEST._serialized_end = 28984 + _DELETESCHEDULERESPONSE._serialized_start = 28986 + _DELETESCHEDULERESPONSE._serialized_end = 29010 + _LISTSCHEDULESREQUEST._serialized_start = 29012 + _LISTSCHEDULESREQUEST._serialized_end = 29120 + _LISTSCHEDULESRESPONSE._serialized_start = 29122 + _LISTSCHEDULESRESPONSE._serialized_end = 29234 + _COUNTSCHEDULESREQUEST._serialized_start = 29236 + _COUNTSCHEDULESREQUEST._serialized_end = 29293 + _COUNTSCHEDULESRESPONSE._serialized_start = 29296 + _COUNTSCHEDULESRESPONSE._serialized_end = 29515 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29518 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30164 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29965 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29904 + 30076 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29906 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29979 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29994 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30058 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30060 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30155 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30157 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30273 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30276 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31993 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31328 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 30078 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30151 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30166 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30230 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30232 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30327 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30329 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30445 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30448 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32165 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31500 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31441 + 31613 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31444 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31616 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31573 + 31745 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31575 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31747 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31639 + 31811 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31641 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31747 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31749 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31859 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31861 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31923 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31925 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31980 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31996 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32248 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32250 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32322 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32325 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32574 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32577 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32733 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32735 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32849 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32852 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33113 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33116 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33375 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33378 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34744 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34746 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34775 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34777 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34873 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34875 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34903 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34905 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34971 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34974 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35446 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35448 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35539 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35541 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35662 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35665 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35850 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35853 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36072 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36075 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36491 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36494 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36848 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36851 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37018 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37020 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37055 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37058 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37278 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37280 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37312 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37315 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37687 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37481 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37687 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37690 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38022 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37816 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38022 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38025 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38361 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38364 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38683 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38685 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38785 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38787 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38896 - _PAUSEACTIVITYREQUEST._serialized_start = 38899 - _PAUSEACTIVITYREQUEST._serialized_end = 39098 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39101 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39284 - _PAUSEACTIVITYRESPONSE._serialized_start = 39286 - _PAUSEACTIVITYRESPONSE._serialized_end = 39309 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39311 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39343 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39346 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39626 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39629 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39902 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39904 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39929 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39931 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39965 - _RESETACTIVITYREQUEST._serialized_start = 39968 - _RESETACTIVITYREQUEST._serialized_end = 40275 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40278 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40568 - _RESETACTIVITYRESPONSE._serialized_start = 40570 - _RESETACTIVITYRESPONSE._serialized_end = 40593 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40595 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40627 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40630 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40914 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40917 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41094 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41096 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41202 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41204 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41301 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41304 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41498 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41501 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42153 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41762 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42153 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42155 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42232 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42235 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42375 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42377 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42485 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42487 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42606 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42609 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42814 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42817 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43002 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43005 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43234 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43237 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43428 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43431 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43907 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43909 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44022 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44024 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44080 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44082 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44175 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44178 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44849 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44353 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44849 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44852 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45092 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45094 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45133 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45136 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45336 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45338 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45377 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45379 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45472 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45474 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45506 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45509 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46025 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46027 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46079 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46082 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46582 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46584 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46638 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46641 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47059 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46974 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31813 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31919 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31921 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 32031 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 32033 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 32095 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 32097 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32152 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32168 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32420 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32422 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32494 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32497 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32746 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32749 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32905 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32907 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 33021 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 33024 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33285 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33288 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33547 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33550 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34916 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34918 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34947 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34949 + _STOPBATCHOPERATIONREQUEST._serialized_end = 35045 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 35047 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 35075 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 35077 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35143 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35146 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35618 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35620 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35711 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35713 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35834 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35837 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 36022 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 36025 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36244 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36247 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36663 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36666 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 37020 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 37023 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37190 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37192 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37227 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37230 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37450 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37452 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37484 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37487 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37859 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37653 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37859 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37862 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38194 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37988 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38194 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38197 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38533 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38536 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38855 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38857 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38957 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38959 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 39068 + _PAUSEACTIVITYREQUEST._serialized_start = 39071 + _PAUSEACTIVITYREQUEST._serialized_end = 39270 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39273 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39456 + _PAUSEACTIVITYRESPONSE._serialized_start = 39458 + _PAUSEACTIVITYRESPONSE._serialized_end = 39481 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39483 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39515 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39518 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39798 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39801 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 40074 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 40076 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 40101 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 40103 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40137 + _RESETACTIVITYREQUEST._serialized_start = 40140 + _RESETACTIVITYREQUEST._serialized_end = 40447 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40450 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40740 + _RESETACTIVITYRESPONSE._serialized_start = 40742 + _RESETACTIVITYRESPONSE._serialized_end = 40765 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40767 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40799 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40802 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 41086 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 41089 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41266 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41268 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41374 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41376 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41473 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41476 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41670 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41673 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42325 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41934 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42325 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25660 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25760 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42327 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42404 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42407 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42547 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42549 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42657 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42659 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42778 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42781 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42986 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42989 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43174 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43177 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43406 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43409 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43600 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43603 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43852 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43855 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 44079 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 44081 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44194 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44196 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44252 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44254 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44347 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44350 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 45021 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44525 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 45021 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45024 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45264 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45266 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45305 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45308 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45508 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45510 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45549 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45551 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45644 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45646 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45678 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45681 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46197 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 46074 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46197 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46199 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46251 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46254 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46754 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 46074 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46197 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46756 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46810 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46813 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47231 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47146 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 47059 + 47231 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47061 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47171 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47174 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47363 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47365 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47464 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47466 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47535 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47537 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47644 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47646 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47759 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47762 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47989 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47992 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48172 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48174 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48269 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48271 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48336 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48338 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48419 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48421 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48484 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48486 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48514 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48516 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48586 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48588 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48692 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48695 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48901 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48903 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48949 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48952 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49107 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49109 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49140 - _LISTWORKERSREQUEST._serialized_start = 49143 - _LISTWORKERSREQUEST._serialized_end = 49273 - _LISTWORKERSRESPONSE._serialized_start = 49276 - _LISTWORKERSRESPONSE._serialized_end = 49441 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49444 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50169 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50011 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50102 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47233 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47343 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47346 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47535 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47537 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47636 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47638 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47707 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47709 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47816 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47818 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47931 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47934 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48161 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 48164 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48344 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48346 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48441 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48443 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48508 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48510 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48591 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48593 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48656 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48658 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48686 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48688 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48758 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48760 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48864 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48867 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 49073 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 49075 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 49121 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 49124 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49279 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49281 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49312 + _LISTWORKERSREQUEST._serialized_start = 49315 + _LISTWORKERSREQUEST._serialized_end = 49445 + _LISTWORKERSRESPONSE._serialized_start = 49448 + _LISTWORKERSRESPONSE._serialized_end = 49613 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49616 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50341 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50183 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50274 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50104 + 50276 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50169 + 50341 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50171 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50262 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50265 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50423 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50425 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50510 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50513 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50779 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50781 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50881 - _DESCRIBEWORKERREQUEST._serialized_start = 50883 - _DESCRIBEWORKERREQUEST._serialized_end = 50954 - _DESCRIBEWORKERRESPONSE._serialized_start = 50956 - _DESCRIBEWORKERRESPONSE._serialized_end = 51037 - _COUNTWORKERSREQUEST._serialized_start = 51039 - _COUNTWORKERSREQUEST._serialized_end = 51126 - _COUNTWORKERSRESPONSE._serialized_start = 51128 - _COUNTWORKERSRESPONSE._serialized_end = 51165 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51168 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51309 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51311 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51343 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51346 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51489 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51491 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51525 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51528 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52705 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52707 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52816 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52819 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53047 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53050 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53366 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53368 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53454 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53456 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53572 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53574 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53683 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53686 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53816 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53819 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54668 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54618 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54668 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54670 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54741 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54744 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54914 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54917 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55228 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55231 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55392 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55395 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55656 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55658 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55773 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55776 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55915 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55917 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55983 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55986 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56223 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56225 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56297 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56300 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56552 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56701 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56703 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56743 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56746 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56891 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56893 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56929 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56931 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57019 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57021 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57054 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57057 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57213 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57215 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57261 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57264 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57416 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57418 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57460 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57462 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57557 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57559 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57598 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57601 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57758 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57761 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57993 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50343 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50434 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50437 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50595 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50597 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50682 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50685 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50951 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50953 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 51053 + _DESCRIBEWORKERREQUEST._serialized_start = 51055 + _DESCRIBEWORKERREQUEST._serialized_end = 51126 + _DESCRIBEWORKERRESPONSE._serialized_start = 51128 + _DESCRIBEWORKERRESPONSE._serialized_end = 51209 + _COUNTWORKERSREQUEST._serialized_start = 51211 + _COUNTWORKERSREQUEST._serialized_end = 51298 + _COUNTWORKERSRESPONSE._serialized_start = 51300 + _COUNTWORKERSRESPONSE._serialized_end = 51337 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51340 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51481 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51483 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51515 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51518 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51661 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51663 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51697 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51700 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52877 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52879 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52988 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52991 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53219 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53222 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53538 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53540 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53626 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53628 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53744 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53746 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53855 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53858 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53988 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53991 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55029 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54979 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 55029 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55031 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55102 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55105 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55275 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55278 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55665 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55668 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55829 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55832 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56093 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56095 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56210 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56213 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56352 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 56354 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56420 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56423 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56660 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56662 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56734 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56737 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56986 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21972 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22060 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56989 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 57138 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 57140 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 57180 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 57183 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 57328 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 57330 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 57366 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 57368 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57456 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57458 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57491 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57494 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57650 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57652 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57698 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57701 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57853 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57855 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57897 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57899 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57994 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57996 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 58035 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 58038 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 58195 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 58198 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58430 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/__init__.py b/temporalio/bridge/proto/workflow_commands/__init__.py index fb31abf6e..039d7a363 100644 --- a/temporalio/bridge/proto/workflow_commands/__init__.py +++ b/temporalio/bridge/proto/workflow_commands/__init__.py @@ -1,5 +1,6 @@ from .workflow_commands_pb2 import ( ActivityCancellationType, + AppendStreamRecords, CancelChildWorkflowExecution, CancelSignalWorkflow, CancelTimer, @@ -27,6 +28,7 @@ StartTimer, StreamSetBecameReady, SubscribeNotificationChannel, + SubscribeStream, UnsubscribeNotificationChannel, UpdateResponse, UpsertWorkflowSearchAttributes, @@ -40,6 +42,7 @@ __all__ = [ "ActivityCancellationType", + "AppendStreamRecords", "CancelChildWorkflowExecution", "CancelSignalWorkflow", "CancelTimer", @@ -67,6 +70,7 @@ "StartTimer", "StreamSetBecameReady", "SubscribeNotificationChannel", + "SubscribeStream", "UnsubscribeNotificationChannel", "UpdateResponse", "UpsertWorkflowSearchAttributes", diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py index 9f96ab91c..6b2613120 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.py @@ -28,9 +28,15 @@ from temporalio.api.failure.v1 import ( message_pb2 as temporal_dot_api_dot_failure_dot_v1_dot_message__pb2, ) +from temporalio.api.sdk.v1 import ( + event_group_marker_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_event__group__marker__pb2, +) from temporalio.api.sdk.v1 import ( user_metadata_pb2 as temporal_dot_api_dot_sdk_dot_v1_dot_user__metadata__pb2, ) +from temporalio.api.stream.v1 import ( + message_pb2 as temporal_dot_api_dot_stream_dot_v1_dot_message__pb2, +) from temporalio.bridge.proto.child_workflow import ( child_workflow_pb2 as temporal_dot_sdk_dot_core_dot_child__workflow_dot_child__workflow__pb2, ) @@ -45,7 +51,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\xaf\x16\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x12\x65\n unsubscribe_notification_channel\x18 \x01(\x0b\x32\x39.coresdk.workflow_commands.UnsubscribeNotificationChannelH\x00\x12U\n\x18workflow_stream_channels\x18! \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamChannelsH\x00\x42\t\n\x07variant"1\n\x1eUnsubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"*\n\x16WorkflowStreamChannels\x12\x10\n\x08\x63hannels\x18\x01 \x03(\t"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xee\x05\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x19\n\x17\x43\x61ncelWorkflowExecution"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' + b'\n;temporal/sdk/core/workflow_commands/workflow_commands.proto\x12\x19\x63oresdk.workflow_commands\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/failure/v1/message.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a$temporal/api/stream/v1/message.proto\x1a,temporal/api/sdk/v1/event_group_marker.proto\x1a\x35temporal/sdk/core/child_workflow/child_workflow.proto\x1a#temporal/sdk/core/nexus/nexus.proto\x1a%temporal/sdk/core/common/common.proto\x1a\x33temporal/sdk/core/external_data/external_data.proto"\x8c\x18\n\x0fWorkflowCommand\x12\x38\n\ruser_metadata\x18\x64 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x42\n\x13\x65vent_group_markers\x18\x65 \x03(\x0b\x32%.temporal.api.sdk.v1.EventGroupMarker\x12<\n\x0bstart_timer\x18\x01 \x01(\x0b\x32%.coresdk.workflow_commands.StartTimerH\x00\x12H\n\x11schedule_activity\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ScheduleActivityH\x00\x12\x42\n\x10respond_to_query\x18\x03 \x01(\x0b\x32&.coresdk.workflow_commands.QueryResultH\x00\x12S\n\x17request_cancel_activity\x18\x04 \x01(\x0b\x32\x30.coresdk.workflow_commands.RequestCancelActivityH\x00\x12>\n\x0c\x63\x61ncel_timer\x18\x05 \x01(\x0b\x32&.coresdk.workflow_commands.CancelTimerH\x00\x12[\n\x1b\x63omplete_workflow_execution\x18\x06 \x01(\x0b\x32\x34.coresdk.workflow_commands.CompleteWorkflowExecutionH\x00\x12S\n\x17\x66\x61il_workflow_execution\x18\x07 \x01(\x0b\x32\x30.coresdk.workflow_commands.FailWorkflowExecutionH\x00\x12g\n"continue_as_new_workflow_execution\x18\x08 \x01(\x0b\x32\x39.coresdk.workflow_commands.ContinueAsNewWorkflowExecutionH\x00\x12W\n\x19\x63\x61ncel_workflow_execution\x18\t \x01(\x0b\x32\x32.coresdk.workflow_commands.CancelWorkflowExecutionH\x00\x12\x45\n\x10set_patch_marker\x18\n \x01(\x0b\x32).coresdk.workflow_commands.SetPatchMarkerH\x00\x12`\n\x1estart_child_workflow_execution\x18\x0b \x01(\x0b\x32\x36.coresdk.workflow_commands.StartChildWorkflowExecutionH\x00\x12\x62\n\x1f\x63\x61ncel_child_workflow_execution\x18\x0c \x01(\x0b\x32\x37.coresdk.workflow_commands.CancelChildWorkflowExecutionH\x00\x12w\n*request_cancel_external_workflow_execution\x18\r \x01(\x0b\x32\x41.coresdk.workflow_commands.RequestCancelExternalWorkflowExecutionH\x00\x12h\n"signal_external_workflow_execution\x18\x0e \x01(\x0b\x32:.coresdk.workflow_commands.SignalExternalWorkflowExecutionH\x00\x12Q\n\x16\x63\x61ncel_signal_workflow\x18\x0f \x01(\x0b\x32/.coresdk.workflow_commands.CancelSignalWorkflowH\x00\x12S\n\x17schedule_local_activity\x18\x10 \x01(\x0b\x32\x30.coresdk.workflow_commands.ScheduleLocalActivityH\x00\x12^\n\x1drequest_cancel_local_activity\x18\x11 \x01(\x0b\x32\x35.coresdk.workflow_commands.RequestCancelLocalActivityH\x00\x12\x66\n!upsert_workflow_search_attributes\x18\x12 \x01(\x0b\x32\x39.coresdk.workflow_commands.UpsertWorkflowSearchAttributesH\x00\x12Y\n\x1amodify_workflow_properties\x18\x13 \x01(\x0b\x32\x33.coresdk.workflow_commands.ModifyWorkflowPropertiesH\x00\x12\x44\n\x0fupdate_response\x18\x14 \x01(\x0b\x32).coresdk.workflow_commands.UpdateResponseH\x00\x12U\n\x18schedule_nexus_operation\x18\x15 \x01(\x0b\x32\x31.coresdk.workflow_commands.ScheduleNexusOperationH\x00\x12`\n\x1erequest_cancel_nexus_operation\x18\x16 \x01(\x0b\x32\x36.coresdk.workflow_commands.RequestCancelNexusOperationH\x00\x12U\n\x18workflow_stream_progress\x18\x17 \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamProgressH\x00\x12W\n\x19workflow_stream_quiescent\x18\x18 \x01(\x0b\x32\x32.coresdk.workflow_commands.WorkflowStreamQuiescentH\x00\x12Z\n\x1b\x65xternal_stream_park_result\x18\x19 \x01(\x0b\x32\x33.coresdk.workflow_commands.ExternalStreamParkResultH\x00\x12W\n\x19\x65xternal_stream_finalized\x18\x1a \x01(\x0b\x32\x32.coresdk.workflow_commands.ExternalStreamFinalizedH\x00\x12^\n\x1dworkflow_output_stream_commit\x18\x1b \x01(\x0b\x32\x35.coresdk.workflow_commands.WorkflowOutputStreamCommitH\x00\x12\x62\n\x1fworkflow_output_stream_buffered\x18\x1c \x01(\x0b\x32\x37.coresdk.workflow_commands.WorkflowOutputStreamBufferedH\x00\x12\x46\n\x10subscribe_stream\x18\x1d \x01(\x0b\x32*.coresdk.workflow_commands.SubscribeStreamH\x00\x12O\n\x15\x61ppend_stream_records\x18\x1e \x01(\x0b\x32..coresdk.workflow_commands.AppendStreamRecordsH\x00\x12\x61\n\x1esubscribe_notification_channel\x18\x1f \x01(\x0b\x32\x37.coresdk.workflow_commands.SubscribeNotificationChannelH\x00\x12\x65\n unsubscribe_notification_channel\x18 \x01(\x0b\x32\x39.coresdk.workflow_commands.UnsubscribeNotificationChannelH\x00\x12U\n\x18workflow_stream_channels\x18! \x01(\x0b\x32\x31.coresdk.workflow_commands.WorkflowStreamChannelsH\x00\x42\t\n\x07variant"1\n\x1eUnsubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"*\n\x16WorkflowStreamChannels\x12\x10\n\x08\x63hannels\x18\x01 \x03(\t"/\n\x1cSubscribeNotificationChannel\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t"M\n\x16WorkflowStreamProgress\x12\x19\n\x11observation_delta\x18\x01 \x01(\x0c\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"\xa7\x01\n\x17WorkflowStreamQuiescent\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12<\n\x05waits\x18\x02 \x03(\x0b\x32-.coresdk.workflow_commands.ExternalStreamWait\x12/\n\x0cidle_timeout\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"W\n\x12\x45xternalStreamWait\x12\x0f\n\x07wait_id\x18\x01 \x01(\r\x12\x12\n\ngeneration\x18\x02 \x01(\x04\x12\x1c\n\x14immediately_parkable\x18\x03 \x01(\x08"\xf0\x01\n\x18\x45xternalStreamParkResult\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12@\n\tconfirmed\x18\x02 \x01(\x0b\x32+.coresdk.workflow_commands.ParkSetConfirmedH\x00\x12G\n\x0c\x62\x65\x63\x61me_ready\x18\x03 \x01(\x0b\x32/.coresdk.workflow_commands.StreamSetBecameReadyH\x00\x12\x1f\n\x17\x66inal_observation_delta\x18\x04 \x01(\x0c\x42\t\n\x07outcome"\x12\n\x10ParkSetConfirmed"\x16\n\x14StreamSetBecameReady"Y\n\x17\x45xternalStreamFinalized\x12\x1d\n\x15quiescence_generation\x18\x01 \x01(\x04\x12\x1f\n\x17\x66inal_observation_delta\x18\x02 \x01(\x0c"}\n\x1aWorkflowOutputStreamCommit\x12\x45\n\x08manifest\x18\x01 \x01(\x0b\x32\x33.coresdk.external_data.ExternalOutputStreamManifest\x12\x18\n\x10request_rollover\x18\x02 \x01(\x08"V\n\x1cWorkflowOutputStreamBuffered\x12\x36\n\x13max_publish_latency\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration"a\n\x13\x41ppendStreamRecords\x12\x13\n\x0bstream_name\x18\x01 \x01(\t\x12\x35\n\x07records\x18\x02 \x03(\x0b\x32$.temporal.api.stream.v1.StreamRecord"\x87\x01\n\x0fSubscribeStream\x12\x19\n\x11stream_name_or_id\x18\x01 \x01(\t\x12\x14\n\x0cstart_offset\x18\x02 \x01(\x03\x12\x43\n\x0estart_position\x18\x03 \x01(\x0b\x32+.temporal.api.stream.v1.StreamStartPosition"S\n\nStartTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x38\n\x15start_to_fire_timeout\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration"\x1a\n\x0b\x43\x61ncelTimer\x12\x0b\n\x03seq\x18\x01 \x01(\r"\xb8\x06\n\x10ScheduleActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12I\n\x07headers\x18\x06 \x03(\x0b\x32\x38.coresdk.workflow_commands.ScheduleActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x0b \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12\x1e\n\x16\x64o_not_eagerly_execute\x18\x0e \x01(\x08\x12;\n\x11versioning_intent\x18\x0f \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x10 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\x93\x06\n\x15ScheduleLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x15\n\ractivity_type\x18\x03 \x01(\t\x12\x0f\n\x07\x61ttempt\x18\x04 \x01(\r\x12:\n\x16original_schedule_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12N\n\x07headers\x18\x06 \x03(\x0b\x32=.coresdk.workflow_commands.ScheduleLocalActivity.HeadersEntry\x12\x32\n\targuments\x18\x07 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x38\n\x15local_retry_threshold\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x12N\n\x11\x63\x61ncellation_type\x18\r \x01(\x0e\x32\x33.coresdk.workflow_commands.ActivityCancellationType\x12#\n\x1binclude_arguments_in_marker\x18\x0e \x01(\x08\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"$\n\x15RequestCancelActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r")\n\x1aRequestCancelLocalActivity\x12\x0b\n\x03seq\x18\x01 \x01(\r"\x9c\x01\n\x0bQueryResult\x12\x10\n\x08query_id\x18\x01 \x01(\t\x12<\n\tsucceeded\x18\x02 \x01(\x0b\x32\'.coresdk.workflow_commands.QuerySuccessH\x00\x12\x32\n\x06\x66\x61iled\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07variant"A\n\x0cQuerySuccess\x12\x31\n\x08response\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"L\n\x19\x43ompleteWorkflowExecution\x12/\n\x06result\x18\x01 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload"J\n\x15\x46\x61ilWorkflowExecution\x12\x31\n\x07\x66\x61ilure\x18\x01 \x01(\x0b\x32 .temporal.api.failure.v1.Failure"\x92\x07\n\x1e\x43ontinueAsNewWorkflowExecution\x12\x15\n\rworkflow_type\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x32\n\targuments\x18\x03 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x37\n\x14workflow_run_timeout\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x12Q\n\x04memo\x18\x06 \x03(\x0b\x32\x43.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.MemoEntry\x12W\n\x07headers\x18\x07 \x03(\x0b\x32\x46.coresdk.workflow_commands.ContinueAsNewWorkflowExecution.HeadersEntry\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x39\n\x0cretry_policy\x18\t \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12;\n\x11versioning_intent\x18\n \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12[\n\x1binitial_versioning_behavior\x18\x0b \x01(\x0e\x32\x36.temporal.api.enums.v1.ContinueAsNewVersioningBehavior\x12\x39\n\x16\x62\x61\x63koff_start_interval\x18\x0c \x01(\x0b\x32\x19.google.protobuf.Duration\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"L\n\x17\x43\x61ncelWorkflowExecution\x12\x31\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads"6\n\x0eSetPatchMarker\x12\x10\n\x08patch_id\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x02 \x01(\x08"\x96\t\n\x1bStartChildWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x11\n\tnamespace\x18\x02 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x03 \x01(\t\x12\x15\n\rworkflow_type\x18\x04 \x01(\t\x12\x12\n\ntask_queue\x18\x05 \x01(\t\x12.\n\x05input\x18\x06 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12=\n\x1aworkflow_execution_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x46\n\x13parent_close_policy\x18\n \x01(\x0e\x32).coresdk.child_workflow.ParentClosePolicy\x12N\n\x18workflow_id_reuse_policy\x18\x0c \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12\x39\n\x0cretry_policy\x18\r \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x0e \x01(\t\x12T\n\x07headers\x18\x0f \x03(\x0b\x32\x43.coresdk.workflow_commands.StartChildWorkflowExecution.HeadersEntry\x12N\n\x04memo\x18\x10 \x03(\x0b\x32@.coresdk.workflow_commands.StartChildWorkflowExecution.MemoEntry\x12\x43\n\x11search_attributes\x18\x11 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12P\n\x11\x63\x61ncellation_type\x18\x12 \x01(\x0e\x32\x35.coresdk.child_workflow.ChildWorkflowCancellationType\x12;\n\x11versioning_intent\x18\x13 \x01(\x0e\x32 .coresdk.common.VersioningIntent\x12\x32\n\x08priority\x18\x14 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x1aL\n\tMemoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"J\n\x1c\x43\x61ncelChildWorkflowExecution\x12\x1a\n\x12\x63hild_workflow_seq\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t"\x8e\x01\n&RequestCancelExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12G\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t"\x8f\x03\n\x1fSignalExternalWorkflowExecution\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12I\n\x12workflow_execution\x18\x02 \x01(\x0b\x32+.coresdk.common.NamespacedWorkflowExecutionH\x00\x12\x1b\n\x11\x63hild_workflow_id\x18\x03 \x01(\tH\x00\x12\x13\n\x0bsignal_name\x18\x04 \x01(\t\x12-\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12X\n\x07headers\x18\x06 \x03(\x0b\x32G.coresdk.workflow_commands.SignalExternalWorkflowExecution.HeadersEntry\x1aO\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01\x42\x08\n\x06target"#\n\x14\x43\x61ncelSignalWorkflow\x12\x0b\n\x03seq\x18\x01 \x01(\r"e\n\x1eUpsertWorkflowSearchAttributes\x12\x43\n\x11search_attributes\x18\x01 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"O\n\x18ModifyWorkflowProperties\x12\x33\n\rupserted_memo\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\xd2\x01\n\x0eUpdateResponse\x12\x1c\n\x14protocol_instance_id\x18\x01 \x01(\t\x12*\n\x08\x61\x63\x63\x65pted\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12\x34\n\x08rejected\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x34\n\tcompleted\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x42\n\n\x08response"\x9a\x04\n\x16ScheduleNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x10\n\x08\x65ndpoint\x18\x02 \x01(\t\x12\x0f\n\x07service\x18\x03 \x01(\t\x12\x11\n\toperation\x18\x04 \x01(\t\x12.\n\x05input\x18\x05 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12<\n\x19schedule_to_close_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12X\n\x0cnexus_header\x18\x07 \x03(\x0b\x32\x42.coresdk.workflow_commands.ScheduleNexusOperation.NexusHeaderEntry\x12H\n\x11\x63\x61ncellation_type\x18\x08 \x01(\x0e\x32-.coresdk.nexus.NexusOperationCancellationType\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"*\n\x1bRequestCancelNexusOperation\x12\x0b\n\x03seq\x18\x01 \x01(\r*X\n\x18\x41\x63tivityCancellationType\x12\x0e\n\nTRY_CANCEL\x10\x00\x12\x1f\n\x1bWAIT_CANCELLATION_COMPLETED\x10\x01\x12\x0b\n\x07\x41\x42\x41NDON\x10\x02\x42\x36\xea\x02\x33Temporalio::Internal::Bridge::Api::WorkflowCommandsb\x06proto3' ) _ACTIVITYCANCELLATIONTYPE = DESCRIPTOR.enum_types_by_name["ActivityCancellationType"] @@ -76,6 +82,8 @@ _WORKFLOWOUTPUTSTREAMBUFFERED = DESCRIPTOR.message_types_by_name[ "WorkflowOutputStreamBuffered" ] +_APPENDSTREAMRECORDS = DESCRIPTOR.message_types_by_name["AppendStreamRecords"] +_SUBSCRIBESTREAM = DESCRIPTOR.message_types_by_name["SubscribeStream"] _STARTTIMER = DESCRIPTOR.message_types_by_name["StartTimer"] _CANCELTIMER = DESCRIPTOR.message_types_by_name["CancelTimer"] _SCHEDULEACTIVITY = DESCRIPTOR.message_types_by_name["ScheduleActivity"] @@ -282,6 +290,28 @@ ) _sym_db.RegisterMessage(WorkflowOutputStreamBuffered) +AppendStreamRecords = _reflection.GeneratedProtocolMessageType( + "AppendStreamRecords", + (_message.Message,), + { + "DESCRIPTOR": _APPENDSTREAMRECORDS, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.AppendStreamRecords) + }, +) +_sym_db.RegisterMessage(AppendStreamRecords) + +SubscribeStream = _reflection.GeneratedProtocolMessageType( + "SubscribeStream", + (_message.Message,), + { + "DESCRIPTOR": _SUBSCRIBESTREAM, + "__module__": "temporal.sdk.core.workflow_commands.workflow_commands_pb2", + # @@protoc_insertion_point(class_scope:coresdk.workflow_commands.SubscribeStream) + }, +) +_sym_db.RegisterMessage(SubscribeStream) + StartTimer = _reflection.GeneratedProtocolMessageType( "StartTimer", (_message.Message,), @@ -636,94 +666,98 @@ _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_options = b"8\001" _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._options = None _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_options = b"8\001" - _ACTIVITYCANCELLATIONTYPE._serialized_start = 10438 - _ACTIVITYCANCELLATIONTYPE._serialized_end = 10526 - _WORKFLOWCOMMAND._serialized_start = 525 - _WORKFLOWCOMMAND._serialized_end = 3388 - _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3390 - _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3439 - _WORKFLOWSTREAMCHANNELS._serialized_start = 3441 - _WORKFLOWSTREAMCHANNELS._serialized_end = 3483 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3485 - _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3532 - _WORKFLOWSTREAMPROGRESS._serialized_start = 3534 - _WORKFLOWSTREAMPROGRESS._serialized_end = 3611 - _WORKFLOWSTREAMQUIESCENT._serialized_start = 3614 - _WORKFLOWSTREAMQUIESCENT._serialized_end = 3781 - _EXTERNALSTREAMWAIT._serialized_start = 3783 - _EXTERNALSTREAMWAIT._serialized_end = 3870 - _EXTERNALSTREAMPARKRESULT._serialized_start = 3873 - _EXTERNALSTREAMPARKRESULT._serialized_end = 4113 - _PARKSETCONFIRMED._serialized_start = 4115 - _PARKSETCONFIRMED._serialized_end = 4133 - _STREAMSETBECAMEREADY._serialized_start = 4135 - _STREAMSETBECAMEREADY._serialized_end = 4157 - _EXTERNALSTREAMFINALIZED._serialized_start = 4159 - _EXTERNALSTREAMFINALIZED._serialized_end = 4248 - _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 4250 - _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4375 - _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4377 - _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4463 - _STARTTIMER._serialized_start = 4465 - _STARTTIMER._serialized_end = 4548 - _CANCELTIMER._serialized_start = 4550 - _CANCELTIMER._serialized_end = 4576 - _SCHEDULEACTIVITY._serialized_start = 4579 - _SCHEDULEACTIVITY._serialized_end = 5403 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5324 - _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5403 - _SCHEDULELOCALACTIVITY._serialized_start = 5406 - _SCHEDULELOCALACTIVITY._serialized_end = 6156 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5324 - _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5403 - _REQUESTCANCELACTIVITY._serialized_start = 6158 - _REQUESTCANCELACTIVITY._serialized_end = 6194 - _REQUESTCANCELLOCALACTIVITY._serialized_start = 6196 - _REQUESTCANCELLOCALACTIVITY._serialized_end = 6237 - _QUERYRESULT._serialized_start = 6240 - _QUERYRESULT._serialized_end = 6396 - _QUERYSUCCESS._serialized_start = 6398 - _QUERYSUCCESS._serialized_end = 6463 - _COMPLETEWORKFLOWEXECUTION._serialized_start = 6465 - _COMPLETEWORKFLOWEXECUTION._serialized_end = 6541 - _FAILWORKFLOWEXECUTION._serialized_start = 6543 - _FAILWORKFLOWEXECUTION._serialized_end = 6617 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 6620 - _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 7534 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7377 - _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7453 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5324 - _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5403 - _CANCELWORKFLOWEXECUTION._serialized_start = 7536 - _CANCELWORKFLOWEXECUTION._serialized_end = 7561 - _SETPATCHMARKER._serialized_start = 7563 - _SETPATCHMARKER._serialized_end = 7617 - _STARTCHILDWORKFLOWEXECUTION._serialized_start = 7620 - _STARTCHILDWORKFLOWEXECUTION._serialized_end = 8794 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5324 - _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5403 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7377 - _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 7453 - _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 8796 - _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 8870 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 8873 - _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9015 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9018 - _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 9417 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5324 - _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5403 - _CANCELSIGNALWORKFLOW._serialized_start = 9419 - _CANCELSIGNALWORKFLOW._serialized_end = 9454 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 9456 - _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 9557 - _MODIFYWORKFLOWPROPERTIES._serialized_start = 9559 - _MODIFYWORKFLOWPROPERTIES._serialized_end = 9638 - _UPDATERESPONSE._serialized_start = 9641 - _UPDATERESPONSE._serialized_end = 9851 - _SCHEDULENEXUSOPERATION._serialized_start = 9854 - _SCHEDULENEXUSOPERATION._serialized_end = 10392 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10342 - _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 10392 - _REQUESTCANCELNEXUSOPERATION._serialized_start = 10394 - _REQUESTCANCELNEXUSOPERATION._serialized_end = 10436 + _ACTIVITYCANCELLATIONTYPE._serialized_start = 11068 + _ACTIVITYCANCELLATIONTYPE._serialized_end = 11156 + _WORKFLOWCOMMAND._serialized_start = 609 + _WORKFLOWCOMMAND._serialized_end = 3693 + _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3695 + _UNSUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3744 + _WORKFLOWSTREAMCHANNELS._serialized_start = 3746 + _WORKFLOWSTREAMCHANNELS._serialized_end = 3788 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_start = 3790 + _SUBSCRIBENOTIFICATIONCHANNEL._serialized_end = 3837 + _WORKFLOWSTREAMPROGRESS._serialized_start = 3839 + _WORKFLOWSTREAMPROGRESS._serialized_end = 3916 + _WORKFLOWSTREAMQUIESCENT._serialized_start = 3919 + _WORKFLOWSTREAMQUIESCENT._serialized_end = 4086 + _EXTERNALSTREAMWAIT._serialized_start = 4088 + _EXTERNALSTREAMWAIT._serialized_end = 4175 + _EXTERNALSTREAMPARKRESULT._serialized_start = 4178 + _EXTERNALSTREAMPARKRESULT._serialized_end = 4418 + _PARKSETCONFIRMED._serialized_start = 4420 + _PARKSETCONFIRMED._serialized_end = 4438 + _STREAMSETBECAMEREADY._serialized_start = 4440 + _STREAMSETBECAMEREADY._serialized_end = 4462 + _EXTERNALSTREAMFINALIZED._serialized_start = 4464 + _EXTERNALSTREAMFINALIZED._serialized_end = 4553 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_start = 4555 + _WORKFLOWOUTPUTSTREAMCOMMIT._serialized_end = 4680 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_start = 4682 + _WORKFLOWOUTPUTSTREAMBUFFERED._serialized_end = 4768 + _APPENDSTREAMRECORDS._serialized_start = 4770 + _APPENDSTREAMRECORDS._serialized_end = 4867 + _SUBSCRIBESTREAM._serialized_start = 4870 + _SUBSCRIBESTREAM._serialized_end = 5005 + _STARTTIMER._serialized_start = 5007 + _STARTTIMER._serialized_end = 5090 + _CANCELTIMER._serialized_start = 5092 + _CANCELTIMER._serialized_end = 5118 + _SCHEDULEACTIVITY._serialized_start = 5121 + _SCHEDULEACTIVITY._serialized_end = 5945 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_start = 5866 + _SCHEDULEACTIVITY_HEADERSENTRY._serialized_end = 5945 + _SCHEDULELOCALACTIVITY._serialized_start = 5948 + _SCHEDULELOCALACTIVITY._serialized_end = 6735 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_start = 5866 + _SCHEDULELOCALACTIVITY_HEADERSENTRY._serialized_end = 5945 + _REQUESTCANCELACTIVITY._serialized_start = 6737 + _REQUESTCANCELACTIVITY._serialized_end = 6773 + _REQUESTCANCELLOCALACTIVITY._serialized_start = 6775 + _REQUESTCANCELLOCALACTIVITY._serialized_end = 6816 + _QUERYRESULT._serialized_start = 6819 + _QUERYRESULT._serialized_end = 6975 + _QUERYSUCCESS._serialized_start = 6977 + _QUERYSUCCESS._serialized_end = 7042 + _COMPLETEWORKFLOWEXECUTION._serialized_start = 7044 + _COMPLETEWORKFLOWEXECUTION._serialized_end = 7120 + _FAILWORKFLOWEXECUTION._serialized_start = 7122 + _FAILWORKFLOWEXECUTION._serialized_end = 7196 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_start = 7199 + _CONTINUEASNEWWORKFLOWEXECUTION._serialized_end = 8113 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7956 + _CONTINUEASNEWWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 8032 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5866 + _CONTINUEASNEWWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5945 + _CANCELWORKFLOWEXECUTION._serialized_start = 8115 + _CANCELWORKFLOWEXECUTION._serialized_end = 8191 + _SETPATCHMARKER._serialized_start = 8193 + _SETPATCHMARKER._serialized_end = 8247 + _STARTCHILDWORKFLOWEXECUTION._serialized_start = 8250 + _STARTCHILDWORKFLOWEXECUTION._serialized_end = 9424 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5866 + _STARTCHILDWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5945 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_start = 7956 + _STARTCHILDWORKFLOWEXECUTION_MEMOENTRY._serialized_end = 8032 + _CANCELCHILDWORKFLOWEXECUTION._serialized_start = 9426 + _CANCELCHILDWORKFLOWEXECUTION._serialized_end = 9500 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_start = 9503 + _REQUESTCANCELEXTERNALWORKFLOWEXECUTION._serialized_end = 9645 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_start = 9648 + _SIGNALEXTERNALWORKFLOWEXECUTION._serialized_end = 10047 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_start = 5866 + _SIGNALEXTERNALWORKFLOWEXECUTION_HEADERSENTRY._serialized_end = 5945 + _CANCELSIGNALWORKFLOW._serialized_start = 10049 + _CANCELSIGNALWORKFLOW._serialized_end = 10084 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_start = 10086 + _UPSERTWORKFLOWSEARCHATTRIBUTES._serialized_end = 10187 + _MODIFYWORKFLOWPROPERTIES._serialized_start = 10189 + _MODIFYWORKFLOWPROPERTIES._serialized_end = 10268 + _UPDATERESPONSE._serialized_start = 10271 + _UPDATERESPONSE._serialized_end = 10481 + _SCHEDULENEXUSOPERATION._serialized_start = 10484 + _SCHEDULENEXUSOPERATION._serialized_end = 11022 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_start = 10972 + _SCHEDULENEXUSOPERATION_NEXUSHEADERENTRY._serialized_end = 11022 + _REQUESTCANCELNEXUSOPERATION._serialized_start = 11024 + _REQUESTCANCELNEXUSOPERATION._serialized_end = 11066 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi index 958032576..9199b814e 100644 --- a/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi +++ b/temporalio/bridge/proto/workflow_commands/workflow_commands_pb2.pyi @@ -23,7 +23,9 @@ import google.protobuf.timestamp_pb2 import temporalio.api.common.v1.message_pb2 import temporalio.api.enums.v1.workflow_pb2 import temporalio.api.failure.v1.message_pb2 +import temporalio.api.sdk.v1.event_group_marker_pb2 import temporalio.api.sdk.v1.user_metadata_pb2 +import temporalio.api.stream.v1.message_pb2 import temporalio.bridge.proto.child_workflow.child_workflow_pb2 import temporalio.bridge.proto.common.common_pb2 import temporalio.bridge.proto.external_data.external_data_pb2 @@ -80,6 +82,7 @@ class WorkflowCommand(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor USER_METADATA_FIELD_NUMBER: builtins.int + EVENT_GROUP_MARKERS_FIELD_NUMBER: builtins.int START_TIMER_FIELD_NUMBER: builtins.int SCHEDULE_ACTIVITY_FIELD_NUMBER: builtins.int RESPOND_TO_QUERY_FIELD_NUMBER: builtins.int @@ -108,6 +111,8 @@ class WorkflowCommand(google.protobuf.message.Message): EXTERNAL_STREAM_FINALIZED_FIELD_NUMBER: builtins.int WORKFLOW_OUTPUT_STREAM_COMMIT_FIELD_NUMBER: builtins.int WORKFLOW_OUTPUT_STREAM_BUFFERED_FIELD_NUMBER: builtins.int + SUBSCRIBE_STREAM_FIELD_NUMBER: builtins.int + APPEND_STREAM_RECORDS_FIELD_NUMBER: builtins.int SUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int UNSUBSCRIBE_NOTIFICATION_CHANNEL_FIELD_NUMBER: builtins.int WORKFLOW_STREAM_CHANNELS_FIELD_NUMBER: builtins.int @@ -118,6 +123,16 @@ class WorkflowCommand(google.protobuf.message.Message): per-command basis where applicable. """ @property + def event_group_markers( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.sdk.v1.event_group_marker_pb2.EventGroupMarker + ]: + """Event group markers attached to the command. These are forwarded onto + the corresponding server-side Command, and consequently surfaced on the + resulting HistoryEvent. See `temporal/api/sdk/v1/event_group_marker.proto`. + """ + @property def start_timer(self) -> global___StartTimer: ... @property def schedule_activity(self) -> global___ScheduleActivity: ... @@ -190,6 +205,13 @@ class WorkflowCommand(google.protobuf.message.Message): self, ) -> global___WorkflowOutputStreamBuffered: ... @property + def subscribe_stream(self) -> global___SubscribeStream: + """The two numbers below are shared with the native stream tree, which + leaves 23 to 28 to the commands above, and must not be reused. + """ + @property + def append_stream_records(self) -> global___AppendStreamRecords: ... + @property def subscribe_notification_channel( self, ) -> global___SubscribeNotificationChannel: ... @@ -204,6 +226,10 @@ class WorkflowCommand(google.protobuf.message.Message): *, user_metadata: temporalio.api.sdk.v1.user_metadata_pb2.UserMetadata | None = ..., + event_group_markers: collections.abc.Iterable[ + temporalio.api.sdk.v1.event_group_marker_pb2.EventGroupMarker + ] + | None = ..., start_timer: global___StartTimer | None = ..., schedule_activity: global___ScheduleActivity | None = ..., respond_to_query: global___QueryResult | None = ..., @@ -240,6 +266,8 @@ class WorkflowCommand(google.protobuf.message.Message): workflow_output_stream_commit: global___WorkflowOutputStreamCommit | None = ..., workflow_output_stream_buffered: global___WorkflowOutputStreamBuffered | None = ..., + subscribe_stream: global___SubscribeStream | None = ..., + append_stream_records: global___AppendStreamRecords | None = ..., subscribe_notification_channel: global___SubscribeNotificationChannel | None = ..., unsubscribe_notification_channel: global___UnsubscribeNotificationChannel @@ -249,6 +277,8 @@ class WorkflowCommand(google.protobuf.message.Message): def HasField( self, field_name: typing_extensions.Literal[ + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -295,6 +325,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "subscribe_stream", + b"subscribe_stream", "unsubscribe_notification_channel", b"unsubscribe_notification_channel", "update_response", @@ -320,6 +352,8 @@ class WorkflowCommand(google.protobuf.message.Message): def ClearField( self, field_name: typing_extensions.Literal[ + "append_stream_records", + b"append_stream_records", "cancel_child_workflow_execution", b"cancel_child_workflow_execution", "cancel_signal_workflow", @@ -332,6 +366,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"complete_workflow_execution", "continue_as_new_workflow_execution", b"continue_as_new_workflow_execution", + "event_group_markers", + b"event_group_markers", "external_stream_finalized", b"external_stream_finalized", "external_stream_park_result", @@ -366,6 +402,8 @@ class WorkflowCommand(google.protobuf.message.Message): b"start_timer", "subscribe_notification_channel", b"subscribe_notification_channel", + "subscribe_stream", + b"subscribe_stream", "unsubscribe_notification_channel", b"unsubscribe_notification_channel", "update_response", @@ -420,6 +458,8 @@ class WorkflowCommand(google.protobuf.message.Message): "external_stream_finalized", "workflow_output_stream_commit", "workflow_output_stream_buffered", + "subscribe_stream", + "append_stream_records", "subscribe_notification_channel", "unsubscribe_notification_channel", "workflow_stream_channels", @@ -819,6 +859,109 @@ class WorkflowOutputStreamBuffered(google.protobuf.message.Message): global___WorkflowOutputStreamBuffered = WorkflowOutputStreamBuffered +class AppendStreamRecords(google.protobuf.message.Message): + """Append a batch of records to a stream this workflow owns. + + The bodies go to the stream's own log rather than into History, which gets + one fixed-size event naming the offset range. That is what makes the batch + size free: a thousand records cost the same in History as one. The server + stores each record with an empty producer id, because the workflow is the + producer here. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_NAME_FIELD_NUMBER: builtins.int + RECORDS_FIELD_NUMBER: builtins.int + stream_name: builtins.str + """Name of a stream this workflow owns, scoped to the workflow. Created on + first use. Empty means the workflow's default output stream. A workflow + cannot append to a stream in another execution, so this is never the id + of a standalone stream. + """ + @property + def records( + self, + ) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ]: ... + def __init__( + self, + *, + stream_name: builtins.str = ..., + records: collections.abc.Iterable[ + temporalio.api.stream.v1.message_pb2.StreamRecord + ] + | None = ..., + ) -> None: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "records", b"records", "stream_name", b"stream_name" + ], + ) -> None: ... + +global___AppendStreamRecords = AppendStreamRecords + +class SubscribeStream(google.protobuf.message.Message): + """Subscribe this workflow to a stream, so later Workflow Tasks carry the + ranges it has not consumed yet. + + The stream's addressing is resolved by the server. A workflow cannot look it + up without doing I/O, and a value it carried would be a reading rather than a + fact, so it could differ on replay. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STREAM_NAME_OR_ID_FIELD_NUMBER: builtins.int + START_OFFSET_FIELD_NUMBER: builtins.int + START_POSITION_FIELD_NUMBER: builtins.int + stream_name_or_id: builtins.str + """Stream to consume, named either way round: a stream this workflow owns + by the name it appends under, a stream in another execution by its id. + The server tries them in that order, so a workflow that owns a stream + under this name cannot reach a standalone stream with the same id. When + neither exists the workflow gets a stream of its own by that name, which + is how a reader subscribes before the first record is written. + """ + start_offset: builtins.int + """Where to start, as an absolute offset. Read only when start_position is + unset. The server refuses a negative value. + """ + @property + def start_position( + self, + ) -> temporalio.api.stream.v1.message_pb2.StreamStartPosition: + """Where to start: an offset, the earliest record held, the tail, or the + last N records. The server resolves it and records the resulting offset, + so replay does not resolve it again and Core does not keep it. + """ + def __init__( + self, + *, + stream_name_or_id: builtins.str = ..., + start_offset: builtins.int = ..., + start_position: temporalio.api.stream.v1.message_pb2.StreamStartPosition + | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["start_position", b"start_position"] + ) -> builtins.bool: ... + def ClearField( + self, + field_name: typing_extensions.Literal[ + "start_offset", + b"start_offset", + "start_position", + b"start_position", + "stream_name_or_id", + b"stream_name_or_id", + ], + ) -> None: ... + +global___SubscribeStream = SubscribeStream + class StartTimer(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -1083,6 +1226,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): RETRY_POLICY_FIELD_NUMBER: builtins.int LOCAL_RETRY_THRESHOLD_FIELD_NUMBER: builtins.int CANCELLATION_TYPE_FIELD_NUMBER: builtins.int + INCLUDE_ARGUMENTS_IN_MARKER_FIELD_NUMBER: builtins.int seq: builtins.int """Lang's incremental sequence number, used as the operation identifier""" activity_id: builtins.str @@ -1147,6 +1291,11 @@ class ScheduleLocalActivity(google.protobuf.message.Message): confirmed. Lang should default this to `WAIT_CANCELLATION_COMPLETED`, even though proto will default to `TRY_CANCEL` automatically. """ + include_arguments_in_marker: builtins.bool + """If set, the local activity arguments will be included in the resulting marker under the + `input` key. This is disabled by default to avoid increasing history size unless the lang + SDK explicitly chooses to expose it. + """ def __init__( self, *, @@ -1169,6 +1318,7 @@ class ScheduleLocalActivity(google.protobuf.message.Message): retry_policy: temporalio.api.common.v1.message_pb2.RetryPolicy | None = ..., local_retry_threshold: google.protobuf.duration_pb2.Duration | None = ..., cancellation_type: global___ActivityCancellationType.ValueType = ..., + include_arguments_in_marker: builtins.bool = ..., ) -> None: ... def HasField( self, @@ -1202,6 +1352,8 @@ class ScheduleLocalActivity(google.protobuf.message.Message): b"cancellation_type", "headers", b"headers", + "include_arguments_in_marker", + b"include_arguments_in_marker", "local_retry_threshold", b"local_retry_threshold", "original_schedule_time", @@ -1565,8 +1717,19 @@ class CancelWorkflowExecution(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor + DETAILS_FIELD_NUMBER: builtins.int + @property + def details(self) -> temporalio.api.common.v1.message_pb2.Payloads: ... def __init__( self, + *, + details: temporalio.api.common.v1.message_pb2.Payloads | None = ..., + ) -> None: ... + def HasField( + self, field_name: typing_extensions.Literal["details", b"details"] + ) -> builtins.bool: ... + def ClearField( + self, field_name: typing_extensions.Literal["details", b"details"] ) -> None: ... global___CancelWorkflowExecution = CancelWorkflowExecution diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 4afe3e5d4..67426be9e 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 4afe3e5d40eaee6ae44969cbfd7d0e773a62804f +Subproject commit 67426be9e38c4d25ac107d110b8cc297e18f9b1a From 455c15deabe4e0ec70739130359ebd2909337c0a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 04:36:06 -0700 Subject: [PATCH 812/831] Consumed a Redis stream through the channel its producer notifies. The union carries a store whose producer notifies the stream's channel itself, so one live case needs no notify by hand. The native case opens its own client with the native provider on it. --- tests/streams/test_nexus_consumer.py | 139 ++++++++++++++++++++++++--- 1 file changed, 128 insertions(+), 11 deletions(-) diff --git a/tests/streams/test_nexus_consumer.py b/tests/streams/test_nexus_consumer.py index 61b8610c5..7bcd03c7f 100644 --- a/tests/streams/test_nexus_consumer.py +++ b/tests/streams/test_nexus_consumer.py @@ -4,10 +4,10 @@ over the memory store and the deliveries a server would post, and catch what it posts back as completions. The live cases need a server with notification channels and a Nexus HTTP ingress, named with ``-E host:port`` and -``TEMPORAL_HTTP``; they put the memory store behind the Nexus front, because -this layer carries no store whose producers notify a channel themselves, so -the producer notifies the stream's channel by hand the way such a store -would. The consumer's HTTP port is ``STREAM_CONSUMER_PORT``, 8813 by default. +``TEMPORAL_HTTP``; they put the memory store behind the Nexus front, where +the producer notifies the stream's channel by hand, and with +``STREAMS_LIVE=redis`` the Redis provider, whose producer notifies it itself. +The consumer's HTTP port is ``STREAM_CONSUMER_PORT``, 8813 by default. """ from __future__ import annotations @@ -39,12 +39,16 @@ DeleteNexusEndpointRequest, ) from temporalio.client import Callback, ChannelAddress, Client, stream_channel +from temporalio.contrib.external_workflow_streams._wake import ( + channel_for as external_channel_for, +) from temporalio.exceptions import NexusOperationError from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import BEGINNING, StreamProvider, StreamRecord, StreamRef from temporalio.streams._ref import open_ref from temporalio.streams.providers import nexus from temporalio.streams.providers.memory import MemoryStreams +from temporalio.streams.providers.native import NativeStreams from temporalio.streams.providers.nexus import ( STREAM_CONSUMER_TOKEN_HEADER, NexusStreams, @@ -59,6 +63,7 @@ _NeverCancelled, collect_values, ) +from temporalio.streams.providers.redis import RedisStreams, _chain from temporalio.worker import Worker from tests.helpers import assert_eventually from tests.streams.test_nexus_provider import _own_endpoint @@ -70,6 +75,9 @@ _HTTP = os.environ.get("TEMPORAL_HTTP", "http://127.0.0.1:7243") _PORT = int(os.environ.get("STREAM_CONSUMER_PORT", "8813")) +_REDIS_URL = os.environ.get("TEMPORAL_TEST_REDIS_URL") or os.environ.get( + "AI198_REDIS_URL", "redis://127.0.0.1:6379" +) # --------------------------------------------------------------------------- @@ -685,7 +693,10 @@ class _Live: @contextlib.asynccontextmanager async def _consumer_service( - client: Client, store: StreamProvider | None = None + client: Client, + store: StreamProvider | None = None, + *, + channel_for: nexus.ChannelRule = stream_channel, ) -> AsyncIterator[_Live]: """Stand up the front over ``store`` and the standalone consumer behind an endpoint.""" store = store or MemoryStreams() @@ -707,6 +718,7 @@ async def _consumer_service( initial=list, listener_url=f"http://127.0.0.1:{_PORT}/deliveries", client=fronted, + channel_for=channel_for, ) service = NexusHttpService( nexusrpc.handler.Handler([CollectStreamHandler(consumer)]), @@ -727,19 +739,25 @@ async def _consumer_service( await stream_handler.close() -async def _listener_token(client: Client, channel: str) -> str: +async def _listener_token( + client: Client, channel: str, *, workflow_id: str | None = None +) -> str: """The operation token the one callback listener on ``channel`` carries.""" async def registered() -> str: # The channel comes into being with the registration, so a describe # that races it is answered with not found. try: - description = await client.describe_channel(channel) + description = await client.describe_channel( + channel, workflow_id=workflow_id + ) except RPCError as err: assert err.status != RPCStatusCode.NOT_FOUND, "channel not created yet" raise - assert len(description.listeners) == 1, description.listeners - [listener] = description.listeners + # A channel linked to a workflow lists its owner as a listener as well. + callbacks = [one for one in description.listeners if one.callback is not None] + assert len(callbacks) == 1, description.listeners + [listener] = callbacks assert listener.callback is not None # The server reports the registration's headers in lower case. headers = { @@ -854,6 +872,101 @@ async def test_cancel_unregisters_the_listener(client: Client): assert (await client.describe_channel(channel)).listeners == [] +@workflow.defn +class StreamOwner: + """Owns the stream an outside producer writes to, and reads nothing itself.""" + + @workflow.run + async def run(self) -> None: + await workflow.wait_condition(lambda: False) + + +@pytest.mark.needs_channel_server +@pytest.mark.skipif( + os.environ.get("STREAMS_LIVE") != "redis", + reason="needs a Redis; run with STREAMS_LIVE=redis", +) +async def test_a_redis_stream_is_consumed_through_the_channel_its_producer_notifies( + client: Client, +): + """The Redis provider notifies the stream's channel on every append, so no + one notifies by hand: the channel is the owner's, named by the chain.""" + provider = RedisStreams( + url=_REDIS_URL, key_prefix=f"nexus-consumer-{uuid.uuid4().hex}" + ) + config = client.config() + config["plugins"] = [provider] + redis_client = Client(**config) + owner_id = f"owner-{uuid.uuid4().hex}" + try: + async with Worker( + client, + task_queue=f"owners-{owner_id}", + workflows=[StreamOwner, ConsumeCaller], + ) as worker: + owner = await client.start_workflow( + StreamOwner.run, id=owner_id, task_queue=worker.task_queue + ) + try: + chain = await _chain(redis_client, owner_id) + address = external_channel_for(chain.stream_key(VALUES)) + ref = StreamRef.for_workflow(owner_id, topic=VALUES) + producer = redis_client.get_stream_handle(owner_id).producer( + topic=VALUES, producer_id="writer", attempt=1 + ) + async with _consumer_service( + redis_client, + provider, + channel_for=lambda ref: external_channel_for( + chain.stream_key(ref.topic) + ), + ) as live: + # Written before the consumer exists: the start reads them. + await producer.append("a", "b") + run = await client.start_workflow( + ConsumeCaller.run, + ConsumeInput(live.endpoint, live.service, ref), + id=f"caller-{owner_id}", + task_queue=worker.task_queue, + ) + token = await _listener_token( + client, address.channel, workflow_id=address.workflow_id + ) + await _consumed(live.consumer, token, 2) + + # Each append notifies the channel, and the consumer reads + # from its cursor on the delivery. + await producer.append("c") + await _consumed(live.consumer, token, 3) + await producer.append("d", "e", "f") + await _consumed(live.consumer, token, 6) + state = live.consumer.state(token) + assert state is not None + assert state.value == ["a", "b", "c", "d", "e", "f"] + assert state.deliveries >= 2 + + # The producer's FINISH is a record like any other, and the + # consumer completes on it. + await producer.finish() + assert await asyncio.wait_for(run.result(), 60) == [ + "a", + "b", + "c", + "d", + "e", + "f", + ] + assert live.consumer.state(token) is None + description = await client.describe_channel( + address.channel, workflow_id=address.workflow_id + ) + assert [one for one in description.listeners if one.callback] == [] + finally: + await owner.terminate() + finally: + await provider.close() + + # --------------------------------------------------------------------------- # Live: the handler hosted in a Temporal worker, deliveries through the # frontend's Nexus route of a companion operation. @@ -998,8 +1111,12 @@ async def test_a_worker_hosted_consumer_is_reached_through_the_frontend( async def test_a_native_standalone_stream_is_consumed_through_its_channel( client: Client, ): - provider: StreamProvider | None = client.config().get("stream_provider") - assert provider is not None, "the client needs the native provider registered" + provider = NativeStreams() + client = await Client.connect( + client.service_client.config.target_host, + namespace=client.namespace, + plugins=[provider], + ) stream_id = f"consumed-{uuid.uuid4().hex}" handle = await client.create_stream(stream_id) ref = handle.ref(topic=VALUES) From 0d1e6591d8760a4c4036b3742d024d4ccf065ee1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 04:36:07 -0700 Subject: [PATCH 813/831] Built the channel report test's instance the way the union's worker does. The workflow info and the payload converter factory grew on this base after the external chain's helper was written. --- tests/contrib/external_workflow_streams/test_channel_report.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/contrib/external_workflow_streams/test_channel_report.py b/tests/contrib/external_workflow_streams/test_channel_report.py index cc4b13370..42130e9e1 100644 --- a/tests/contrib/external_workflow_streams/test_channel_report.py +++ b/tests/contrib/external_workflow_streams/test_channel_report.py @@ -158,6 +158,7 @@ def _instance( first_execution_run_id=RUN_ID, headers={}, namespace="default", + original_execution_run_id=RUN_ID, parent=None, root=None, priority=temporalio.common.Priority.default, @@ -177,7 +178,7 @@ def _instance( converter = temporalio.converter.DataConverter.default return UnsandboxedWorkflowRunner().create_instance( WorkflowInstanceDetails( - payload_converter_factory=converter._new_payload_converter, + payload_converter_factory=converter._new_internal_payload_converter, failure_converter_class=converter.failure_converter_class, interceptor_classes=[], defn=defn, From 6c117adb9548360983883853fb2c5e438c3baea1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 04:36:07 -0700 Subject: [PATCH 814/831] Left the wake request's owner empty where the address carries none. The shared address type says None for no owner, and the request keeps its empty string. --- temporalio/contrib/external_workflow_streams/_wake.py | 2 +- temporalio/worker/_workflow.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index 6139f47a6..a31c0f4e7 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -658,5 +658,5 @@ def wake_request_for( position=position, position_counter=position_counter, channel=address.channel, - channel_workflow_id=address.workflow_id, + channel_workflow_id=address.workflow_id or "", ) diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index d045e0a58..06e974e8a 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -1623,7 +1623,7 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: position=position, position_counter=position_counter, channel=address.channel, - channel_workflow_id=address.workflow_id, + channel_workflow_id=address.workflow_id or "", ), transport=wake_transport_of(subscription.backend), ) From 2a9234caeeb2f4e11671039a193b36844dbcb000 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 17:46:38 -0700 Subject: [PATCH 815/831] Pinned Core with a linked channel addressed by execution. A standalone activity can own a channel too, so the five channel requests and both `linked_to` fields carry `common.v1.Execution` in place of `WorkflowExecution`, with the old numbers reserved. --- temporalio/api/notification/v1/message_pb2.py | 20 +- .../api/notification/v1/message_pb2.pyi | 19 +- .../v1/request_response_pb2.py | 968 +++++++++--------- .../v1/request_response_pb2.pyi | 128 +-- .../api/workflowservice/v1/service_pb2.py | 14 +- temporalio/bridge/sdk-core | 2 +- 6 files changed, 568 insertions(+), 583 deletions(-) diff --git a/temporalio/api/notification/v1/message_pb2.py b/temporalio/api/notification/v1/message_pb2.py index ad5245d17..c7c5fa51c 100644 --- a/temporalio/api/notification/v1/message_pb2.py +++ b/temporalio/api/notification/v1/message_pb2.py @@ -22,7 +22,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x9e\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' + b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x9c\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01J\x04\x08\x05\x10\x06"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' ) _CHANNELKIND = DESCRIPTOR.enum_types_by_name["ChannelKind"] @@ -84,14 +84,14 @@ DESCRIPTOR._serialized_options = b"\n\037io.temporal.api.notification.v1B\014MessageProtoP\001Z/go.temporal.io/api/notification/v1;notification\252\002\036Temporalio.Api.Notification.V1\352\002!Temporalio::Api::Notification::V1" _NOTIFICATION_METADATAENTRY._options = None _NOTIFICATION_METADATAENTRY._serialized_options = b"8\001" - _CHANNELKIND._serialized_start = 721 - _CHANNELKIND._serialized_end = 819 + _CHANNELKIND._serialized_start = 719 + _CHANNELKIND._serialized_end = 817 _NOTIFICATION._serialized_start = 148 - _NOTIFICATION._serialized_end = 434 - _NOTIFICATION_METADATAENTRY._serialized_start = 354 - _NOTIFICATION_METADATAENTRY._serialized_end = 434 - _CHANNELLISTENER._serialized_start = 437 - _CHANNELLISTENER._serialized_end = 662 - _WORKFLOWLISTENER._serialized_start = 664 - _WORKFLOWLISTENER._serialized_end = 719 + _NOTIFICATION._serialized_end = 432 + _NOTIFICATION_METADATAENTRY._serialized_start = 346 + _NOTIFICATION_METADATAENTRY._serialized_end = 426 + _CHANNELLISTENER._serialized_start = 435 + _CHANNELLISTENER._serialized_end = 660 + _WORKFLOWLISTENER._serialized_start = 662 + _WORKFLOWLISTENER._serialized_end = 717 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/notification/v1/message_pb2.pyi b/temporalio/api/notification/v1/message_pb2.pyi index 400969f66..43c8070b6 100644 --- a/temporalio/api/notification/v1/message_pb2.pyi +++ b/temporalio/api/notification/v1/message_pb2.pyi @@ -38,8 +38,8 @@ class _ChannelKindEnumTypeWrapper( workflows and callbacks listen to it. """ CHANNEL_KIND_LINKED: _ChannelKind.ValueType # 2 - """Kept in one workflow's state, keyed by namespace, workflow id and - channel name. The owning workflow is its listener by construction. + """Kept in one execution's state, keyed by namespace, execution and + channel name. The owning execution is its listener by construction. """ class ChannelKind(_ChannelKind, metaclass=_ChannelKindEnumTypeWrapper): @@ -51,8 +51,8 @@ CHANNEL_KIND_INDEPENDENT: ChannelKind.ValueType # 1 workflows and callbacks listen to it. """ CHANNEL_KIND_LINKED: ChannelKind.ValueType # 2 -"""Kept in one workflow's state, keyed by namespace, workflow id and -channel name. The owning workflow is its listener by construction. +"""Kept in one execution's state, keyed by namespace, execution and +channel name. The owning execution is its listener by construction. """ global___ChannelKind = ChannelKind @@ -112,11 +112,14 @@ class Notification(google.protobuf.message.Message): builtins.str, temporalio.api.common.v1.message_pb2.Payload ]: """Details for the listener, such as which topic moved. Bounded in size and - carried as payloads, so a codec applies as to any payload. + carried as payloads, so a codec applies as to any payload. This is state, + not a log: a fold keeps the latest notification only, so a writer puts + here what is true at `position`, such as which topic moved or a close + flag, never something a consumer must see once per write. """ @property - def linked_to(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """Set for a channel linked to a workflow: the owner and the run that + def linked_to(self) -> temporalio.api.common.v1.message_pb2.Execution: + """Set for a channel linked to an execution: the owner and the run that received the notification. Empty for an independent channel. A listener that holds both kinds routes the notification by it. (-- api-linter: core::0140::prepositions=disabled @@ -132,7 +135,7 @@ class Notification(google.protobuf.message.Message): builtins.str, temporalio.api.common.v1.message_pb2.Payload ] | None = ..., - linked_to: temporalio.api.common.v1.message_pb2.WorkflowExecution | None = ..., + linked_to: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["linked_to", b"linked_to"] diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index aee2202bf..b77db53a7 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe1\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xee\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xbd\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"#\n!UnregisterChannelListenerResponse"\xe3\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x8c\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x04 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x03\x10\x04R\x12workflow_execution"\xa4\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4445,501 +4445,501 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16058 - _NOTIFYCHANNELRESPONSE._serialized_start = 16060 - _NOTIFYCHANNELRESPONSE._serialized_end = 16107 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16110 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16339 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16341 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16395 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16398 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16578 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16580 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16615 - _POLLCHANNELREQUEST._serialized_start = 16618 - _POLLCHANNELREQUEST._serialized_end = 16836 - _POLLCHANNELRESPONSE._serialized_start = 16838 - _POLLCHANNELRESPONSE._serialized_end = 16926 - _DESCRIBECHANNELREQUEST._serialized_start = 16929 - _DESCRIBECHANNELREQUEST._serialized_end = 17060 - _DESCRIBECHANNELRESPONSE._serialized_start = 17063 - _DESCRIBECHANNELRESPONSE._serialized_end = 17357 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17360 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18699 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18702 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18860 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18863 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19312 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19314 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19362 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19365 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19652 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19654 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19690 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19692 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19814 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19816 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19849 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19852 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20181 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20184 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20314 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20317 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20711 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20714 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20846 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20848 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20957 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20959 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21085 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21087 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21204 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21207 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21341 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21343 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21452 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21454 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21580 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21582 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21648 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21651 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21888 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21890 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21918 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21921 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22122 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22038 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22122 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22125 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22486 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22488 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22523 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22525 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22635 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22637 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22667 - _SHUTDOWNWORKERREQUEST._serialized_start = 22670 - _SHUTDOWNWORKERREQUEST._serialized_end = 22953 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22955 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22979 - _QUERYWORKFLOWREQUEST._serialized_start = 22982 - _QUERYWORKFLOWREQUEST._serialized_end = 23215 - _QUERYWORKFLOWRESPONSE._serialized_start = 23218 - _QUERYWORKFLOWRESPONSE._serialized_end = 23403 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24270 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24273 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24801 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24804 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25808 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25590 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25706 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25708 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25808 - _GETCLUSTERINFOREQUEST._serialized_start = 25810 - _GETCLUSTERINFOREQUEST._serialized_end = 25833 - _GETCLUSTERINFORESPONSE._serialized_start = 25836 - _GETCLUSTERINFORESPONSE._serialized_end = 26301 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26246 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26301 - _GETSYSTEMINFOREQUEST._serialized_start = 26303 - _GETSYSTEMINFOREQUEST._serialized_end = 26325 - _GETSYSTEMINFORESPONSE._serialized_start = 26328 - _GETSYSTEMINFORESPONSE._serialized_end = 26905 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26469 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26905 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26907 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27016 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27019 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27242 - _CREATESCHEDULEREQUEST._serialized_start = 27245 - _CREATESCHEDULEREQUEST._serialized_end = 27577 - _CREATESCHEDULERESPONSE._serialized_start = 27579 - _CREATESCHEDULERESPONSE._serialized_end = 27627 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27629 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27694 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27697 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27968 - _UPDATESCHEDULEREQUEST._serialized_start = 27971 - _UPDATESCHEDULEREQUEST._serialized_end = 28263 - _UPDATESCHEDULERESPONSE._serialized_start = 28265 - _UPDATESCHEDULERESPONSE._serialized_end = 28289 - _PATCHSCHEDULEREQUEST._serialized_start = 28292 - _PATCHSCHEDULEREQUEST._serialized_end = 28448 - _PATCHSCHEDULERESPONSE._serialized_start = 28450 - _PATCHSCHEDULERESPONSE._serialized_end = 28473 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28476 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28644 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28646 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28729 - _DELETESCHEDULEREQUEST._serialized_start = 28731 - _DELETESCHEDULEREQUEST._serialized_end = 28812 - _DELETESCHEDULERESPONSE._serialized_start = 28814 - _DELETESCHEDULERESPONSE._serialized_end = 28838 - _LISTSCHEDULESREQUEST._serialized_start = 28840 - _LISTSCHEDULESREQUEST._serialized_end = 28948 - _LISTSCHEDULESRESPONSE._serialized_start = 28950 - _LISTSCHEDULESRESPONSE._serialized_end = 29062 - _COUNTSCHEDULESREQUEST._serialized_start = 29064 - _COUNTSCHEDULESREQUEST._serialized_end = 29121 - _COUNTSCHEDULESRESPONSE._serialized_start = 29124 - _COUNTSCHEDULESRESPONSE._serialized_end = 29343 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29346 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29992 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29793 + _NOTIFYCHANNELREQUEST._serialized_end = 16067 + _NOTIFYCHANNELRESPONSE._serialized_start = 16069 + _NOTIFYCHANNELRESPONSE._serialized_end = 16116 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16119 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16357 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16359 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16413 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16416 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16605 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16607 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16642 + _POLLCHANNELREQUEST._serialized_start = 16645 + _POLLCHANNELREQUEST._serialized_end = 16872 + _POLLCHANNELRESPONSE._serialized_start = 16874 + _POLLCHANNELRESPONSE._serialized_end = 16962 + _DESCRIBECHANNELREQUEST._serialized_start = 16965 + _DESCRIBECHANNELREQUEST._serialized_end = 17105 + _DESCRIBECHANNELRESPONSE._serialized_start = 17108 + _DESCRIBECHANNELRESPONSE._serialized_end = 17400 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17403 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18742 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18745 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18903 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18906 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19355 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19357 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19405 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19408 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19695 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19697 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19733 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19735 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19857 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19859 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19892 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19895 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20224 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20227 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20357 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20360 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20754 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20757 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20889 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20891 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21000 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21002 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21128 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21130 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21247 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21250 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21384 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21386 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21495 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21497 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21623 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21625 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21691 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21694 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21931 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21933 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21961 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21964 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22165 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22081 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22165 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22168 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22529 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22531 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22566 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22568 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22678 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22680 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22710 + _SHUTDOWNWORKERREQUEST._serialized_start = 22713 + _SHUTDOWNWORKERREQUEST._serialized_end = 22996 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22998 + _SHUTDOWNWORKERRESPONSE._serialized_end = 23022 + _QUERYWORKFLOWREQUEST._serialized_start = 23025 + _QUERYWORKFLOWREQUEST._serialized_end = 23258 + _QUERYWORKFLOWRESPONSE._serialized_start = 23261 + _QUERYWORKFLOWRESPONSE._serialized_end = 23446 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23448 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23563 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23566 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24313 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24316 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24844 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24847 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25851 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25633 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25749 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25751 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25851 + _GETCLUSTERINFOREQUEST._serialized_start = 25853 + _GETCLUSTERINFOREQUEST._serialized_end = 25876 + _GETCLUSTERINFORESPONSE._serialized_start = 25879 + _GETCLUSTERINFORESPONSE._serialized_end = 26344 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26289 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26344 + _GETSYSTEMINFOREQUEST._serialized_start = 26346 + _GETSYSTEMINFOREQUEST._serialized_end = 26368 + _GETSYSTEMINFORESPONSE._serialized_start = 26371 + _GETSYSTEMINFORESPONSE._serialized_end = 26948 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26512 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26948 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26950 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27059 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27062 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27285 + _CREATESCHEDULEREQUEST._serialized_start = 27288 + _CREATESCHEDULEREQUEST._serialized_end = 27620 + _CREATESCHEDULERESPONSE._serialized_start = 27622 + _CREATESCHEDULERESPONSE._serialized_end = 27670 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27672 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27737 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27740 + _DESCRIBESCHEDULERESPONSE._serialized_end = 28011 + _UPDATESCHEDULEREQUEST._serialized_start = 28014 + _UPDATESCHEDULEREQUEST._serialized_end = 28306 + _UPDATESCHEDULERESPONSE._serialized_start = 28308 + _UPDATESCHEDULERESPONSE._serialized_end = 28332 + _PATCHSCHEDULEREQUEST._serialized_start = 28335 + _PATCHSCHEDULEREQUEST._serialized_end = 28491 + _PATCHSCHEDULERESPONSE._serialized_start = 28493 + _PATCHSCHEDULERESPONSE._serialized_end = 28516 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28519 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28687 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28689 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28772 + _DELETESCHEDULEREQUEST._serialized_start = 28774 + _DELETESCHEDULEREQUEST._serialized_end = 28855 + _DELETESCHEDULERESPONSE._serialized_start = 28857 + _DELETESCHEDULERESPONSE._serialized_end = 28881 + _LISTSCHEDULESREQUEST._serialized_start = 28883 + _LISTSCHEDULESREQUEST._serialized_end = 28991 + _LISTSCHEDULESRESPONSE._serialized_start = 28993 + _LISTSCHEDULESRESPONSE._serialized_end = 29105 + _COUNTSCHEDULESREQUEST._serialized_start = 29107 + _COUNTSCHEDULESREQUEST._serialized_end = 29164 + _COUNTSCHEDULESRESPONSE._serialized_start = 29167 + _COUNTSCHEDULESRESPONSE._serialized_end = 29386 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29389 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30035 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29836 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29904 + 29947 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29906 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29979 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29994 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30058 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30060 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30155 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30157 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30273 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30276 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31993 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31328 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29949 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30022 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30037 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30101 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30103 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30198 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30200 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30316 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30319 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32036 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31371 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31441 + 31484 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31444 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31487 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31573 + 31616 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31575 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31618 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31639 + 31682 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31641 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31747 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31749 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31859 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31861 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31923 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31925 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31980 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31996 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32248 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32250 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32322 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32325 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32574 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32577 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32733 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32735 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32849 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32852 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33113 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33116 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33375 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33378 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34744 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34746 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34775 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34777 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34873 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34875 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34903 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34905 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34971 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34974 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35446 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35448 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35539 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35541 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35662 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35665 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35850 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35853 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36072 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36075 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36491 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36494 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36848 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36851 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37018 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37020 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37055 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37058 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37278 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37280 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37312 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37315 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37687 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37481 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37687 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37690 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38022 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37816 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38022 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38025 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38361 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38364 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38683 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38685 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38785 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38787 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38896 - _PAUSEACTIVITYREQUEST._serialized_start = 38899 - _PAUSEACTIVITYREQUEST._serialized_end = 39098 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39101 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39284 - _PAUSEACTIVITYRESPONSE._serialized_start = 39286 - _PAUSEACTIVITYRESPONSE._serialized_end = 39309 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39311 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39343 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39346 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39626 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39629 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39902 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39904 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39929 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39931 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39965 - _RESETACTIVITYREQUEST._serialized_start = 39968 - _RESETACTIVITYREQUEST._serialized_end = 40275 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40278 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40568 - _RESETACTIVITYRESPONSE._serialized_start = 40570 - _RESETACTIVITYRESPONSE._serialized_end = 40593 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40595 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40627 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40630 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40914 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40917 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41094 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41096 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41202 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41204 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41301 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41304 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41498 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41501 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42153 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41762 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42153 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42155 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42232 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42235 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42375 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42377 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42485 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42487 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42606 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42609 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42814 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42817 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43002 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43005 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43234 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43237 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43428 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43431 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43907 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43909 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44022 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44024 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44080 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44082 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44175 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44178 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44849 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44353 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44849 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44852 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45092 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45094 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45133 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45136 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45336 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45338 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45377 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45379 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45472 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45474 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45506 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45509 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46025 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46027 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46079 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46082 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46582 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46584 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46638 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46641 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47059 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46974 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31684 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31790 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31792 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31902 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31904 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31966 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31968 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32023 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32039 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32291 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32293 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32365 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32368 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32617 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32620 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32776 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32778 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32892 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32895 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33156 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33159 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33418 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33421 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34787 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34789 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34818 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34820 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34916 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34918 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34946 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34948 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35014 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35017 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35489 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35491 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35582 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35584 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35705 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35708 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35893 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35896 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36115 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36118 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36534 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36537 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36891 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36894 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37061 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37063 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37098 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37101 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37321 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37323 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37355 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37358 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37730 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37524 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37730 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37733 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38065 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37859 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38065 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38068 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38404 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38407 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38726 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38728 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38828 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38830 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38939 + _PAUSEACTIVITYREQUEST._serialized_start = 38942 + _PAUSEACTIVITYREQUEST._serialized_end = 39141 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39144 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39327 + _PAUSEACTIVITYRESPONSE._serialized_start = 39329 + _PAUSEACTIVITYRESPONSE._serialized_end = 39352 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39354 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39386 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39389 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39669 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39672 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39945 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39947 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39972 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39974 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40008 + _RESETACTIVITYREQUEST._serialized_start = 40011 + _RESETACTIVITYREQUEST._serialized_end = 40318 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40321 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40611 + _RESETACTIVITYRESPONSE._serialized_start = 40613 + _RESETACTIVITYRESPONSE._serialized_end = 40636 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40638 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40670 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40673 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40957 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40960 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41137 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41139 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41245 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41247 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41344 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41347 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41541 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41544 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42196 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41805 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42196 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42198 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42275 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42278 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42418 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42420 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42528 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42530 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42649 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42652 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42857 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42860 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43045 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43048 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43277 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43280 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43471 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43474 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43723 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43726 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43950 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43952 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44065 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44067 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44123 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44125 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44218 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44221 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44892 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44396 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44892 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44895 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45135 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45137 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45176 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45179 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45379 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45381 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45420 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45422 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45515 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45517 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45549 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45552 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46068 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46070 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46122 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46125 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46625 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46627 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46681 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46684 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47102 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47017 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 47059 + 47102 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47061 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47171 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47174 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47363 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47365 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47464 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47466 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47535 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47537 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47644 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47646 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47759 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47762 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47989 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47992 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48172 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48174 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48269 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48271 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48336 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48338 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48419 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48421 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48484 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48486 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48514 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48516 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48586 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48588 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48692 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48695 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48901 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48903 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48949 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48952 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49107 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49109 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49140 - _LISTWORKERSREQUEST._serialized_start = 49143 - _LISTWORKERSREQUEST._serialized_end = 49273 - _LISTWORKERSRESPONSE._serialized_start = 49276 - _LISTWORKERSRESPONSE._serialized_end = 49441 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49444 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50169 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50011 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50102 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47104 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47214 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47217 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47406 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47408 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47507 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47509 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47578 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47580 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47687 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47689 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47802 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47805 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48032 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 48035 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48215 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48217 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48312 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48314 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48379 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48381 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48462 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48464 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48527 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48529 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48557 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48559 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48629 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48631 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48735 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48738 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48944 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48946 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48992 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48995 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49150 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49152 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49183 + _LISTWORKERSREQUEST._serialized_start = 49186 + _LISTWORKERSREQUEST._serialized_end = 49316 + _LISTWORKERSRESPONSE._serialized_start = 49319 + _LISTWORKERSRESPONSE._serialized_end = 49484 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49487 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50212 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50054 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50145 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50104 + 50147 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50169 + 50212 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50171 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50262 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50265 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50423 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50425 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50510 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50513 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50779 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50781 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50881 - _DESCRIBEWORKERREQUEST._serialized_start = 50883 - _DESCRIBEWORKERREQUEST._serialized_end = 50954 - _DESCRIBEWORKERRESPONSE._serialized_start = 50956 - _DESCRIBEWORKERRESPONSE._serialized_end = 51037 - _COUNTWORKERSREQUEST._serialized_start = 51039 - _COUNTWORKERSREQUEST._serialized_end = 51126 - _COUNTWORKERSRESPONSE._serialized_start = 51128 - _COUNTWORKERSRESPONSE._serialized_end = 51165 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51168 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51309 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51311 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51343 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51346 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51489 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51491 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51525 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51528 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52705 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52707 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52816 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52819 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53047 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53050 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53366 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53368 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53454 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53456 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53572 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53574 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53683 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53686 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53816 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53819 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54668 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54618 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54668 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54670 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54741 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54744 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54914 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54917 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55228 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55231 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55392 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55395 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55656 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55658 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55773 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55776 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55915 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55917 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55983 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55986 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56223 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56225 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56297 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56300 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56552 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56701 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56703 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56743 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56746 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56891 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56893 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56929 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56931 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57019 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57021 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57054 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57057 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57213 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57215 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57261 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57264 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57416 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57418 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57460 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57462 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57557 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57559 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57598 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57601 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57758 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57761 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57993 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50214 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50305 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50308 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50466 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50468 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50553 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50556 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50822 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50824 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50924 + _DESCRIBEWORKERREQUEST._serialized_start = 50926 + _DESCRIBEWORKERREQUEST._serialized_end = 50997 + _DESCRIBEWORKERRESPONSE._serialized_start = 50999 + _DESCRIBEWORKERRESPONSE._serialized_end = 51080 + _COUNTWORKERSREQUEST._serialized_start = 51082 + _COUNTWORKERSREQUEST._serialized_end = 51169 + _COUNTWORKERSRESPONSE._serialized_start = 51171 + _COUNTWORKERSRESPONSE._serialized_end = 51208 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51211 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51352 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51354 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51386 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51389 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51532 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51534 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51568 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51571 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52748 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52750 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52859 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52862 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53090 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53093 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53409 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53411 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53497 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53499 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53615 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53617 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53726 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53729 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53859 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53862 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54711 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54661 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54711 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54713 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54784 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54787 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54957 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54960 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55271 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55274 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55435 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55438 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55699 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55701 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55816 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55819 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55958 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55960 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56026 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56029 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56266 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56268 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56340 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56343 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56592 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56595 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56744 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56746 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56786 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56789 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56934 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56936 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56974 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57062 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57064 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57097 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57100 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57256 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57258 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57304 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57307 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57459 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57461 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57503 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57505 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57600 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57602 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57641 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57644 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57801 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57804 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58036 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index c6a2378a5..e11f11822 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -3326,23 +3326,25 @@ class NotifyChannelRequest(google.protobuf.message.Message): NOTIFICATION_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str @property def notification( self, ) -> temporalio.api.notification.v1.message_pb2.Notification: ... identity: builtins.str - """The identity of the writer, for metrics and logs.""" + """The identity of the caller, for audit, metrics and logs. It is not copied + into the notification. A writer that wants the consumer to see who wrote + puts that in the notification's `metadata`. + """ request_id: builtins.str """Used to de-dupe a retried notification.""" @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, @@ -3352,18 +3354,19 @@ class NotifyChannelRequest(google.protobuf.message.Message): | None = ..., identity: builtins.str = ..., request_id: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "notification", b"notification", "workflow_execution", b"workflow_execution" + "execution", b"execution", "notification", b"notification" ], ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ + "execution", + b"execution", "identity", b"identity", "namespace", @@ -3372,8 +3375,6 @@ class NotifyChannelRequest(google.protobuf.message.Message): b"notification", "request_id", b"request_id", - "workflow_execution", - b"workflow_execution", ], ) -> None: ... @@ -3406,7 +3407,7 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): CALLBACK_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str @property @@ -3417,12 +3418,11 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): identity: builtins.str """The identity of the caller, for metrics and logs.""" @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, @@ -3432,13 +3432,12 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): callback: temporalio.api.common.v1.message_pb2.Callback | None = ..., request_id: builtins.str = ..., identity: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "callback", b"callback", "workflow_execution", b"workflow_execution" + "callback", b"callback", "execution", b"execution" ], ) -> builtins.bool: ... def ClearField( @@ -3448,14 +3447,14 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): b"callback", "channel", b"channel", + "execution", + b"execution", "identity", b"identity", "namespace", b"namespace", "request_id", b"request_id", - "workflow_execution", - b"workflow_execution", ], ) -> None: ... @@ -3484,19 +3483,18 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): CHANNEL_FIELD_NUMBER: builtins.int LISTENER_ID_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str listener_id: builtins.str identity: builtins.str """The identity of the caller, for metrics and logs.""" @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, @@ -3505,28 +3503,24 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): channel: builtins.str = ..., listener_id: builtins.str = ..., identity: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( - self, - field_name: typing_extensions.Literal[ - "workflow_execution", b"workflow_execution" - ], + self, field_name: typing_extensions.Literal["execution", b"execution"] ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ "channel", b"channel", + "execution", + b"execution", "identity", b"identity", "listener_id", b"listener_id", "namespace", b"namespace", - "workflow_execution", - b"workflow_execution", ], ) -> None: ... @@ -3549,7 +3543,7 @@ class PollChannelRequest(google.protobuf.message.Message): AFTER_COUNTER_FIELD_NUMBER: builtins.int WAIT_FIELD_NUMBER: builtins.int MAX_NOTIFICATIONS_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str after_counter: builtins.int @@ -3567,12 +3561,11 @@ class PollChannelRequest(google.protobuf.message.Message): default. """ @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, @@ -3582,13 +3575,12 @@ class PollChannelRequest(google.protobuf.message.Message): after_counter: builtins.int = ..., wait: google.protobuf.duration_pb2.Duration | None = ..., max_notifications: builtins.int = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "wait", b"wait", "workflow_execution", b"workflow_execution" + "execution", b"execution", "wait", b"wait" ], ) -> builtins.bool: ... def ClearField( @@ -3598,14 +3590,14 @@ class PollChannelRequest(google.protobuf.message.Message): b"after_counter", "channel", b"channel", + "execution", + b"execution", "max_notifications", b"max_notifications", "namespace", b"namespace", "wait", b"wait", - "workflow_execution", - b"workflow_execution", ], ) -> None: ... @@ -3640,40 +3632,30 @@ class DescribeChannelRequest(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int CHANNEL_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, *, namespace: builtins.str = ..., channel: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( - self, - field_name: typing_extensions.Literal[ - "workflow_execution", b"workflow_execution" - ], + self, field_name: typing_extensions.Literal["execution", b"execution"] ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ - "channel", - b"channel", - "namespace", - b"namespace", - "workflow_execution", - b"workflow_execution", + "channel", b"channel", "execution", b"execution", "namespace", b"namespace" ], ) -> None: ... @@ -3700,7 +3682,7 @@ class DescribeChannelResponse(google.protobuf.message.Message): """How many notifications the channel retains for pollers.""" kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType @property - def linked_to(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + def linked_to(self) -> temporalio.api.common.v1.message_pb2.Execution: """The owner of a linked channel and the run that holds it. Empty for an independent channel. (-- api-linter: core::0140::prepositions=disabled @@ -3716,7 +3698,7 @@ class DescribeChannelResponse(google.protobuf.message.Message): latest: temporalio.api.notification.v1.message_pb2.Notification | None = ..., retained_count: builtins.int = ..., kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType = ..., - linked_to: temporalio.api.common.v1.message_pb2.WorkflowExecution | None = ..., + linked_to: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index 57e919ce9..12492145e 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xff\xc5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA"/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*Zn"i/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\x01*Zu"p/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\x01*\x12\xf4\x03\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\xd5\x02\x82\xd3\xe4\x93\x02\xce\x02"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*Zd"_/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\x01*Zk"f/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\x01*\x12\xa6\x04\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\x81\x03\x82\xd3\xe4\x93\x02\xfa\x02*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zo*m/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}Zv*t/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}\x12\xd4\x03\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\xd9\x02\x82\xd3\xe4\x93\x02\xd2\x02\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZe\x12\x63/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notificationsZl\x12j/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notifications\x12\xa8\x03\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"\xa1\x02\x82\xd3\xe4\x93\x02\x9a\x02\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}ZW\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}Z^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\x86\xcd\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA"/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*Ze"`/namespaces/{namespace}/workflows/{execution.business_id}/channels/{notification.channel}/notify:\x01*Zl"g/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{notification.channel}/notify:\x01*Zf"a/namespaces/{namespace}/activities/{execution.business_id}/channels/{notification.channel}/notify:\x01*Zm"h/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{notification.channel}/notify:\x01*\x12\xa5\x05\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\x86\x04\x82\xd3\xe4\x93\x02\xff\x03"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z["V/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners:\x01*Zb"]/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners:\x01*Z\\"W/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners:\x01*Zc"^/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners:\x01*\x12\xed\x05\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\xc8\x04\x82\xd3\xe4\x93\x02\xc1\x04*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zf*d/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zm*k/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zg*e/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zn*l/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners/{listener_id}\x12\x87\x05\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\x8c\x04\x82\xd3\xe4\x93\x02\x85\x04\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZ\\\x12Z/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/notificationsZc\x12\x61/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/notificationsZ]\x12[/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/notificationsZd\x12\x62/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/notifications\x12\xbf\x04\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"\xb8\x03\x82\xd3\xe4\x93\x02\xb1\x03\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}ZN\x12L/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}ZU\x12S/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}ZO\x12M/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}ZV\x12T/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -138,23 +138,23 @@ _WORKFLOWSERVICE.methods_by_name["NotifyChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "NotifyChannel" - ]._serialized_options = b'\202\323\344\223\002\366\002">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*Zn"i/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\001*Zu"p/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\001*' + ]._serialized_options = b'\202\323\344\223\002\273\004">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*Ze"`/namespaces/{namespace}/workflows/{execution.business_id}/channels/{notification.channel}/notify:\001*Zl"g/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{notification.channel}/notify:\001*Zf"a/namespaces/{namespace}/activities/{execution.business_id}/channels/{notification.channel}/notify:\001*Zm"h/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{notification.channel}/notify:\001*' _WORKFLOWSERVICE.methods_by_name["RegisterChannelListener"]._options = None _WORKFLOWSERVICE.methods_by_name[ "RegisterChannelListener" - ]._serialized_options = b'\202\323\344\223\002\316\002"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*Zd"_/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\001*Zk"f/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\001*' + ]._serialized_options = b'\202\323\344\223\002\377\003"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*Z["V/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners:\001*Zb"]/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners:\001*Z\\"W/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners:\001*Zc"^/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners:\001*' _WORKFLOWSERVICE.methods_by_name["UnregisterChannelListener"]._options = None _WORKFLOWSERVICE.methods_by_name[ "UnregisterChannelListener" - ]._serialized_options = b"\202\323\344\223\002\372\002*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zo*m/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}Zv*t/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}" + ]._serialized_options = b"\202\323\344\223\002\301\004*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zf*d/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zm*k/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zg*e/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zn*l/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners/{listener_id}" _WORKFLOWSERVICE.methods_by_name["PollChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "PollChannel" - ]._serialized_options = b"\202\323\344\223\002\322\002\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZe\022c/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notificationsZl\022j/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notifications" + ]._serialized_options = b"\202\323\344\223\002\205\004\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZ\\\022Z/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/notificationsZc\022a/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/notificationsZ]\022[/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/notificationsZd\022b/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/notifications" _WORKFLOWSERVICE.methods_by_name["DescribeChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "DescribeChannel" - ]._serialized_options = b"\202\323\344\223\002\232\002\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}ZW\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}Z^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}" + ]._serialized_options = b"\202\323\344\223\002\261\003\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}ZN\022L/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}ZU\022S/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}ZO\022M/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}ZV\022T/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}" _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -546,5 +546,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 41977 + _WORKFLOWSERVICE._serialized_end = 42880 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index acd30916e..7a0d774b5 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit acd30916e56c10d0dd47e6774a26cb0e9532aaee +Subproject commit 7a0d774b5dab911a90497b840e6574dd14a48f13 From 49faf69804134470865eaaa2d5411747f13ddab1 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 17:48:28 -0700 Subject: [PATCH 816/831] Pinned Core at the protos that address a channel by execution. The five channel requests carry `execution` as a `temporal.api.common.v1.Execution`, and both `linked_to` fields take the same type. The generated api and clients follow the pin. --- temporalio/api/notification/v1/message_pb2.py | 20 +- .../api/notification/v1/message_pb2.pyi | 19 +- .../v1/request_response_pb2.py | 968 +++++++++--------- .../v1/request_response_pb2.pyi | 128 +-- .../api/workflowservice/v1/service_pb2.py | 14 +- temporalio/bridge/sdk-core | 2 +- 6 files changed, 568 insertions(+), 583 deletions(-) diff --git a/temporalio/api/notification/v1/message_pb2.py b/temporalio/api/notification/v1/message_pb2.py index ad5245d17..c7c5fa51c 100644 --- a/temporalio/api/notification/v1/message_pb2.py +++ b/temporalio/api/notification/v1/message_pb2.py @@ -22,7 +22,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x9e\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' + b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x9c\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01J\x04\x08\x05\x10\x06"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' ) _CHANNELKIND = DESCRIPTOR.enum_types_by_name["ChannelKind"] @@ -84,14 +84,14 @@ DESCRIPTOR._serialized_options = b"\n\037io.temporal.api.notification.v1B\014MessageProtoP\001Z/go.temporal.io/api/notification/v1;notification\252\002\036Temporalio.Api.Notification.V1\352\002!Temporalio::Api::Notification::V1" _NOTIFICATION_METADATAENTRY._options = None _NOTIFICATION_METADATAENTRY._serialized_options = b"8\001" - _CHANNELKIND._serialized_start = 721 - _CHANNELKIND._serialized_end = 819 + _CHANNELKIND._serialized_start = 719 + _CHANNELKIND._serialized_end = 817 _NOTIFICATION._serialized_start = 148 - _NOTIFICATION._serialized_end = 434 - _NOTIFICATION_METADATAENTRY._serialized_start = 354 - _NOTIFICATION_METADATAENTRY._serialized_end = 434 - _CHANNELLISTENER._serialized_start = 437 - _CHANNELLISTENER._serialized_end = 662 - _WORKFLOWLISTENER._serialized_start = 664 - _WORKFLOWLISTENER._serialized_end = 719 + _NOTIFICATION._serialized_end = 432 + _NOTIFICATION_METADATAENTRY._serialized_start = 346 + _NOTIFICATION_METADATAENTRY._serialized_end = 426 + _CHANNELLISTENER._serialized_start = 435 + _CHANNELLISTENER._serialized_end = 660 + _WORKFLOWLISTENER._serialized_start = 662 + _WORKFLOWLISTENER._serialized_end = 717 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/notification/v1/message_pb2.pyi b/temporalio/api/notification/v1/message_pb2.pyi index 400969f66..43c8070b6 100644 --- a/temporalio/api/notification/v1/message_pb2.pyi +++ b/temporalio/api/notification/v1/message_pb2.pyi @@ -38,8 +38,8 @@ class _ChannelKindEnumTypeWrapper( workflows and callbacks listen to it. """ CHANNEL_KIND_LINKED: _ChannelKind.ValueType # 2 - """Kept in one workflow's state, keyed by namespace, workflow id and - channel name. The owning workflow is its listener by construction. + """Kept in one execution's state, keyed by namespace, execution and + channel name. The owning execution is its listener by construction. """ class ChannelKind(_ChannelKind, metaclass=_ChannelKindEnumTypeWrapper): @@ -51,8 +51,8 @@ CHANNEL_KIND_INDEPENDENT: ChannelKind.ValueType # 1 workflows and callbacks listen to it. """ CHANNEL_KIND_LINKED: ChannelKind.ValueType # 2 -"""Kept in one workflow's state, keyed by namespace, workflow id and -channel name. The owning workflow is its listener by construction. +"""Kept in one execution's state, keyed by namespace, execution and +channel name. The owning execution is its listener by construction. """ global___ChannelKind = ChannelKind @@ -112,11 +112,14 @@ class Notification(google.protobuf.message.Message): builtins.str, temporalio.api.common.v1.message_pb2.Payload ]: """Details for the listener, such as which topic moved. Bounded in size and - carried as payloads, so a codec applies as to any payload. + carried as payloads, so a codec applies as to any payload. This is state, + not a log: a fold keeps the latest notification only, so a writer puts + here what is true at `position`, such as which topic moved or a close + flag, never something a consumer must see once per write. """ @property - def linked_to(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """Set for a channel linked to a workflow: the owner and the run that + def linked_to(self) -> temporalio.api.common.v1.message_pb2.Execution: + """Set for a channel linked to an execution: the owner and the run that received the notification. Empty for an independent channel. A listener that holds both kinds routes the notification by it. (-- api-linter: core::0140::prepositions=disabled @@ -132,7 +135,7 @@ class Notification(google.protobuf.message.Message): builtins.str, temporalio.api.common.v1.message_pb2.Payload ] | None = ..., - linked_to: temporalio.api.common.v1.message_pb2.WorkflowExecution | None = ..., + linked_to: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal["linked_to", b"linked_to"] diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index aee2202bf..b77db53a7 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd8\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xe5\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xb4\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x45\n\x12workflow_execution\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"#\n!UnregisterChannelListenerResponse"\xda\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x45\n\x12workflow_execution\x18\x06 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x83\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x45\n\x12workflow_execution\x18\x03 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xa6\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12<\n\tlinked_to\x18\x05 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe1\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xee\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xbd\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"#\n!UnregisterChannelListenerResponse"\xe3\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x8c\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x04 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x03\x10\x04R\x12workflow_execution"\xa4\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4445,501 +4445,501 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16058 - _NOTIFYCHANNELRESPONSE._serialized_start = 16060 - _NOTIFYCHANNELRESPONSE._serialized_end = 16107 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16110 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16339 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16341 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16395 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16398 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16578 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16580 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16615 - _POLLCHANNELREQUEST._serialized_start = 16618 - _POLLCHANNELREQUEST._serialized_end = 16836 - _POLLCHANNELRESPONSE._serialized_start = 16838 - _POLLCHANNELRESPONSE._serialized_end = 16926 - _DESCRIBECHANNELREQUEST._serialized_start = 16929 - _DESCRIBECHANNELREQUEST._serialized_end = 17060 - _DESCRIBECHANNELRESPONSE._serialized_start = 17063 - _DESCRIBECHANNELRESPONSE._serialized_end = 17357 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17360 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18699 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18702 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18860 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18863 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19312 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19314 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19362 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19365 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19652 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19654 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19690 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19692 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19814 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19816 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19849 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19852 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20181 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20184 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20314 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20317 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20711 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20714 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20846 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20848 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20957 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20959 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21085 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21087 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21204 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21207 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21341 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21343 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21452 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21454 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21580 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21582 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21648 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21651 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21888 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21890 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21918 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21921 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22122 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22038 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22122 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22125 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22486 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22488 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22523 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22525 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22635 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22637 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22667 - _SHUTDOWNWORKERREQUEST._serialized_start = 22670 - _SHUTDOWNWORKERREQUEST._serialized_end = 22953 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22955 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22979 - _QUERYWORKFLOWREQUEST._serialized_start = 22982 - _QUERYWORKFLOWREQUEST._serialized_end = 23215 - _QUERYWORKFLOWRESPONSE._serialized_start = 23218 - _QUERYWORKFLOWRESPONSE._serialized_end = 23403 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23405 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23520 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23523 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24270 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24273 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24801 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24804 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25808 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25590 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25706 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25708 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25808 - _GETCLUSTERINFOREQUEST._serialized_start = 25810 - _GETCLUSTERINFOREQUEST._serialized_end = 25833 - _GETCLUSTERINFORESPONSE._serialized_start = 25836 - _GETCLUSTERINFORESPONSE._serialized_end = 26301 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26246 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26301 - _GETSYSTEMINFOREQUEST._serialized_start = 26303 - _GETSYSTEMINFOREQUEST._serialized_end = 26325 - _GETSYSTEMINFORESPONSE._serialized_start = 26328 - _GETSYSTEMINFORESPONSE._serialized_end = 26905 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26469 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26905 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26907 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27016 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27019 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27242 - _CREATESCHEDULEREQUEST._serialized_start = 27245 - _CREATESCHEDULEREQUEST._serialized_end = 27577 - _CREATESCHEDULERESPONSE._serialized_start = 27579 - _CREATESCHEDULERESPONSE._serialized_end = 27627 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27629 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27694 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27697 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27968 - _UPDATESCHEDULEREQUEST._serialized_start = 27971 - _UPDATESCHEDULEREQUEST._serialized_end = 28263 - _UPDATESCHEDULERESPONSE._serialized_start = 28265 - _UPDATESCHEDULERESPONSE._serialized_end = 28289 - _PATCHSCHEDULEREQUEST._serialized_start = 28292 - _PATCHSCHEDULEREQUEST._serialized_end = 28448 - _PATCHSCHEDULERESPONSE._serialized_start = 28450 - _PATCHSCHEDULERESPONSE._serialized_end = 28473 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28476 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28644 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28646 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28729 - _DELETESCHEDULEREQUEST._serialized_start = 28731 - _DELETESCHEDULEREQUEST._serialized_end = 28812 - _DELETESCHEDULERESPONSE._serialized_start = 28814 - _DELETESCHEDULERESPONSE._serialized_end = 28838 - _LISTSCHEDULESREQUEST._serialized_start = 28840 - _LISTSCHEDULESREQUEST._serialized_end = 28948 - _LISTSCHEDULESRESPONSE._serialized_start = 28950 - _LISTSCHEDULESRESPONSE._serialized_end = 29062 - _COUNTSCHEDULESREQUEST._serialized_start = 29064 - _COUNTSCHEDULESREQUEST._serialized_end = 29121 - _COUNTSCHEDULESRESPONSE._serialized_start = 29124 - _COUNTSCHEDULESRESPONSE._serialized_end = 29343 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29346 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29992 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29793 + _NOTIFYCHANNELREQUEST._serialized_end = 16067 + _NOTIFYCHANNELRESPONSE._serialized_start = 16069 + _NOTIFYCHANNELRESPONSE._serialized_end = 16116 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16119 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16357 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16359 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16413 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16416 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16605 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16607 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16642 + _POLLCHANNELREQUEST._serialized_start = 16645 + _POLLCHANNELREQUEST._serialized_end = 16872 + _POLLCHANNELRESPONSE._serialized_start = 16874 + _POLLCHANNELRESPONSE._serialized_end = 16962 + _DESCRIBECHANNELREQUEST._serialized_start = 16965 + _DESCRIBECHANNELREQUEST._serialized_end = 17105 + _DESCRIBECHANNELRESPONSE._serialized_start = 17108 + _DESCRIBECHANNELRESPONSE._serialized_end = 17400 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17403 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18742 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18745 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18903 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18906 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19355 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19357 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19405 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19408 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19695 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19697 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19733 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19735 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19857 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19859 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19892 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19895 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20224 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20227 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20357 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20360 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20754 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20757 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20889 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20891 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21000 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21002 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21128 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21130 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21247 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21250 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21384 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21386 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21495 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21497 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21623 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21625 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21691 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21694 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21931 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21933 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21961 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21964 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22165 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22081 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22165 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22168 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22529 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22531 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22566 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22568 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22678 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22680 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22710 + _SHUTDOWNWORKERREQUEST._serialized_start = 22713 + _SHUTDOWNWORKERREQUEST._serialized_end = 22996 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22998 + _SHUTDOWNWORKERRESPONSE._serialized_end = 23022 + _QUERYWORKFLOWREQUEST._serialized_start = 23025 + _QUERYWORKFLOWREQUEST._serialized_end = 23258 + _QUERYWORKFLOWRESPONSE._serialized_start = 23261 + _QUERYWORKFLOWRESPONSE._serialized_end = 23446 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23448 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23563 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23566 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24313 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24316 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24844 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24847 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25851 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25633 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25749 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25751 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25851 + _GETCLUSTERINFOREQUEST._serialized_start = 25853 + _GETCLUSTERINFOREQUEST._serialized_end = 25876 + _GETCLUSTERINFORESPONSE._serialized_start = 25879 + _GETCLUSTERINFORESPONSE._serialized_end = 26344 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26289 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26344 + _GETSYSTEMINFOREQUEST._serialized_start = 26346 + _GETSYSTEMINFOREQUEST._serialized_end = 26368 + _GETSYSTEMINFORESPONSE._serialized_start = 26371 + _GETSYSTEMINFORESPONSE._serialized_end = 26948 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26512 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26948 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26950 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27059 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27062 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27285 + _CREATESCHEDULEREQUEST._serialized_start = 27288 + _CREATESCHEDULEREQUEST._serialized_end = 27620 + _CREATESCHEDULERESPONSE._serialized_start = 27622 + _CREATESCHEDULERESPONSE._serialized_end = 27670 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27672 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27737 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27740 + _DESCRIBESCHEDULERESPONSE._serialized_end = 28011 + _UPDATESCHEDULEREQUEST._serialized_start = 28014 + _UPDATESCHEDULEREQUEST._serialized_end = 28306 + _UPDATESCHEDULERESPONSE._serialized_start = 28308 + _UPDATESCHEDULERESPONSE._serialized_end = 28332 + _PATCHSCHEDULEREQUEST._serialized_start = 28335 + _PATCHSCHEDULEREQUEST._serialized_end = 28491 + _PATCHSCHEDULERESPONSE._serialized_start = 28493 + _PATCHSCHEDULERESPONSE._serialized_end = 28516 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28519 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28687 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28689 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28772 + _DELETESCHEDULEREQUEST._serialized_start = 28774 + _DELETESCHEDULEREQUEST._serialized_end = 28855 + _DELETESCHEDULERESPONSE._serialized_start = 28857 + _DELETESCHEDULERESPONSE._serialized_end = 28881 + _LISTSCHEDULESREQUEST._serialized_start = 28883 + _LISTSCHEDULESREQUEST._serialized_end = 28991 + _LISTSCHEDULESRESPONSE._serialized_start = 28993 + _LISTSCHEDULESRESPONSE._serialized_end = 29105 + _COUNTSCHEDULESREQUEST._serialized_start = 29107 + _COUNTSCHEDULESREQUEST._serialized_end = 29164 + _COUNTSCHEDULESRESPONSE._serialized_start = 29167 + _COUNTSCHEDULESRESPONSE._serialized_end = 29386 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29389 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30035 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29836 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29904 + 29947 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29906 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29979 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29994 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30058 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30060 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30155 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30157 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30273 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30276 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31993 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31328 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29949 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30022 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30037 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30101 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30103 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30198 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30200 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30316 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30319 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32036 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31371 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31441 + 31484 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31444 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31487 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31573 + 31616 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31575 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31618 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31639 + 31682 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31641 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31747 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31749 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31859 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31861 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31923 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31925 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31980 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31996 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32248 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32250 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32322 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32325 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32574 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32577 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32733 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32735 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32849 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32852 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33113 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33116 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33375 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33378 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34744 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34746 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34775 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34777 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34873 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34875 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34903 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34905 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34971 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34974 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35446 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35448 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35539 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35541 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35662 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35665 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35850 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35853 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36072 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36075 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36491 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36494 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36848 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36851 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37018 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37020 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37055 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37058 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37278 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37280 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37312 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37315 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37687 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37481 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37687 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37690 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38022 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37816 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38022 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38025 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38361 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38364 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38683 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38685 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38785 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38787 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38896 - _PAUSEACTIVITYREQUEST._serialized_start = 38899 - _PAUSEACTIVITYREQUEST._serialized_end = 39098 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39101 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39284 - _PAUSEACTIVITYRESPONSE._serialized_start = 39286 - _PAUSEACTIVITYRESPONSE._serialized_end = 39309 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39311 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39343 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39346 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39626 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39629 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39902 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39904 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39929 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39931 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39965 - _RESETACTIVITYREQUEST._serialized_start = 39968 - _RESETACTIVITYREQUEST._serialized_end = 40275 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40278 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40568 - _RESETACTIVITYRESPONSE._serialized_start = 40570 - _RESETACTIVITYRESPONSE._serialized_end = 40593 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40595 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40627 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40630 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40914 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40917 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41094 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41096 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41202 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41204 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41301 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41304 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41498 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41501 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42153 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41762 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42153 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25488 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25588 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42155 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42232 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42235 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42375 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42377 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42485 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42487 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42606 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42609 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42814 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42817 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43002 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43005 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43234 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43237 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43428 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43431 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43680 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43683 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43907 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43909 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44022 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44024 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44080 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44082 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44175 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44178 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44849 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44353 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44849 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44852 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45092 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45094 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45133 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45136 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45336 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45338 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45377 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45379 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45472 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45474 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45506 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45509 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46025 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46027 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46079 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46082 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46582 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45902 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46025 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46584 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46638 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46641 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47059 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46974 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31684 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31790 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31792 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31902 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31904 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31966 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31968 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32023 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32039 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32291 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32293 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32365 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32368 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32617 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32620 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32776 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32778 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32892 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32895 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33156 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33159 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33418 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33421 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34787 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34789 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34818 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34820 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34916 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34918 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34946 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34948 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35014 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35017 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35489 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35491 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35582 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35584 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35705 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35708 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35893 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35896 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36115 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36118 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36534 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36537 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36891 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36894 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37061 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37063 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37098 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37101 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37321 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37323 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37355 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37358 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37730 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37524 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37730 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37733 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38065 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37859 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38065 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38068 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38404 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38407 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38726 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38728 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38828 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38830 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38939 + _PAUSEACTIVITYREQUEST._serialized_start = 38942 + _PAUSEACTIVITYREQUEST._serialized_end = 39141 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39144 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39327 + _PAUSEACTIVITYRESPONSE._serialized_start = 39329 + _PAUSEACTIVITYRESPONSE._serialized_end = 39352 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39354 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39386 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39389 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39669 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39672 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39945 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39947 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39972 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39974 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40008 + _RESETACTIVITYREQUEST._serialized_start = 40011 + _RESETACTIVITYREQUEST._serialized_end = 40318 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40321 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40611 + _RESETACTIVITYRESPONSE._serialized_start = 40613 + _RESETACTIVITYRESPONSE._serialized_end = 40636 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40638 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40670 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40673 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40957 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40960 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41137 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41139 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41245 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41247 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41344 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41347 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41541 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41544 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42196 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41805 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42196 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42198 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42275 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42278 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42418 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42420 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42528 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42530 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42649 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42652 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42857 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42860 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43045 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43048 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43277 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43280 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43471 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43474 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43723 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43726 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43950 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43952 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44065 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44067 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44123 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44125 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44218 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44221 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44892 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44396 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44892 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44895 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45135 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45137 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45176 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45179 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45379 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45381 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45420 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45422 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45515 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45517 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45549 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45552 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46068 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46070 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46122 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46125 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46625 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46627 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46681 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46684 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47102 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47017 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 47059 + 47102 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47061 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47171 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47174 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47363 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47365 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47464 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47466 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47535 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47537 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47644 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47646 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47759 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47762 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47989 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47992 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48172 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48174 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48269 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48271 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48336 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48338 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48419 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48421 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48484 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48486 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48514 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48516 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48586 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48588 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48692 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48695 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48901 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48903 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48949 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48952 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49107 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49109 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49140 - _LISTWORKERSREQUEST._serialized_start = 49143 - _LISTWORKERSREQUEST._serialized_end = 49273 - _LISTWORKERSRESPONSE._serialized_start = 49276 - _LISTWORKERSRESPONSE._serialized_end = 49441 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49444 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50169 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50011 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50102 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47104 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47214 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47217 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47406 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47408 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47507 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47509 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47578 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47580 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47687 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47689 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47802 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47805 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48032 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 48035 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48215 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48217 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48312 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48314 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48379 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48381 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48462 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48464 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48527 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48529 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48557 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48559 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48629 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48631 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48735 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48738 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48944 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48946 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48992 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48995 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49150 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49152 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49183 + _LISTWORKERSREQUEST._serialized_start = 49186 + _LISTWORKERSREQUEST._serialized_end = 49316 + _LISTWORKERSRESPONSE._serialized_start = 49319 + _LISTWORKERSRESPONSE._serialized_end = 49484 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49487 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50212 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50054 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50145 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50104 + 50147 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50169 + 50212 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50171 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50262 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50265 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50423 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50425 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50510 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50513 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50779 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50781 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50881 - _DESCRIBEWORKERREQUEST._serialized_start = 50883 - _DESCRIBEWORKERREQUEST._serialized_end = 50954 - _DESCRIBEWORKERRESPONSE._serialized_start = 50956 - _DESCRIBEWORKERRESPONSE._serialized_end = 51037 - _COUNTWORKERSREQUEST._serialized_start = 51039 - _COUNTWORKERSREQUEST._serialized_end = 51126 - _COUNTWORKERSRESPONSE._serialized_start = 51128 - _COUNTWORKERSRESPONSE._serialized_end = 51165 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51168 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51309 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51311 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51343 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51346 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51489 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51491 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51525 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51528 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52705 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52707 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52816 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52819 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53047 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53050 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53366 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53368 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53454 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53456 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53572 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53574 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53683 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53686 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53816 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53819 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54668 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54618 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54668 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54670 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54741 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54744 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54914 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54917 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55228 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55231 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55392 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55395 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55656 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55658 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55773 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55776 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55915 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55917 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55983 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55986 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56223 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56225 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56297 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56300 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56549 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21800 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21888 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56552 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56701 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56703 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56743 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56746 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56891 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56893 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56929 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56931 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57019 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57021 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57054 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57057 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57213 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57215 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57261 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57264 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57416 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57418 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57460 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57462 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57557 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57559 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57598 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57601 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57758 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57761 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57993 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50214 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50305 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50308 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50466 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50468 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50553 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50556 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50822 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50824 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50924 + _DESCRIBEWORKERREQUEST._serialized_start = 50926 + _DESCRIBEWORKERREQUEST._serialized_end = 50997 + _DESCRIBEWORKERRESPONSE._serialized_start = 50999 + _DESCRIBEWORKERRESPONSE._serialized_end = 51080 + _COUNTWORKERSREQUEST._serialized_start = 51082 + _COUNTWORKERSREQUEST._serialized_end = 51169 + _COUNTWORKERSRESPONSE._serialized_start = 51171 + _COUNTWORKERSRESPONSE._serialized_end = 51208 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51211 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51352 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51354 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51386 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51389 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51532 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51534 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51568 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51571 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52748 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52750 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52859 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52862 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53090 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53093 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53409 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53411 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53497 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53499 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53615 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53617 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53726 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53729 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53859 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53862 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54711 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54661 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54711 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54713 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54784 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54787 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54957 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54960 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55271 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55274 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55435 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55438 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55699 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55701 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55816 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55819 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55958 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55960 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56026 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56029 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56266 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56268 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56340 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56343 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56592 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56595 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56744 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56746 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56786 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56789 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56934 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56936 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56974 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57062 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57064 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57097 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57100 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57256 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57258 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57304 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57307 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57459 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57461 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57503 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57505 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57600 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57602 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57641 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57644 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57801 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57804 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58036 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.pyi b/temporalio/api/workflowservice/v1/request_response_pb2.pyi index c6a2378a5..e11f11822 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.pyi +++ b/temporalio/api/workflowservice/v1/request_response_pb2.pyi @@ -3326,23 +3326,25 @@ class NotifyChannelRequest(google.protobuf.message.Message): NOTIFICATION_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str @property def notification( self, ) -> temporalio.api.notification.v1.message_pb2.Notification: ... identity: builtins.str - """The identity of the writer, for metrics and logs.""" + """The identity of the caller, for audit, metrics and logs. It is not copied + into the notification. A writer that wants the consumer to see who wrote + puts that in the notification's `metadata`. + """ request_id: builtins.str """Used to de-dupe a retried notification.""" @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, @@ -3352,18 +3354,19 @@ class NotifyChannelRequest(google.protobuf.message.Message): | None = ..., identity: builtins.str = ..., request_id: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "notification", b"notification", "workflow_execution", b"workflow_execution" + "execution", b"execution", "notification", b"notification" ], ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ + "execution", + b"execution", "identity", b"identity", "namespace", @@ -3372,8 +3375,6 @@ class NotifyChannelRequest(google.protobuf.message.Message): b"notification", "request_id", b"request_id", - "workflow_execution", - b"workflow_execution", ], ) -> None: ... @@ -3406,7 +3407,7 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): CALLBACK_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str @property @@ -3417,12 +3418,11 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): identity: builtins.str """The identity of the caller, for metrics and logs.""" @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, @@ -3432,13 +3432,12 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): callback: temporalio.api.common.v1.message_pb2.Callback | None = ..., request_id: builtins.str = ..., identity: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "callback", b"callback", "workflow_execution", b"workflow_execution" + "callback", b"callback", "execution", b"execution" ], ) -> builtins.bool: ... def ClearField( @@ -3448,14 +3447,14 @@ class RegisterChannelListenerRequest(google.protobuf.message.Message): b"callback", "channel", b"channel", + "execution", + b"execution", "identity", b"identity", "namespace", b"namespace", "request_id", b"request_id", - "workflow_execution", - b"workflow_execution", ], ) -> None: ... @@ -3484,19 +3483,18 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): CHANNEL_FIELD_NUMBER: builtins.int LISTENER_ID_FIELD_NUMBER: builtins.int IDENTITY_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str listener_id: builtins.str identity: builtins.str """The identity of the caller, for metrics and logs.""" @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, @@ -3505,28 +3503,24 @@ class UnregisterChannelListenerRequest(google.protobuf.message.Message): channel: builtins.str = ..., listener_id: builtins.str = ..., identity: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( - self, - field_name: typing_extensions.Literal[ - "workflow_execution", b"workflow_execution" - ], + self, field_name: typing_extensions.Literal["execution", b"execution"] ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ "channel", b"channel", + "execution", + b"execution", "identity", b"identity", "listener_id", b"listener_id", "namespace", b"namespace", - "workflow_execution", - b"workflow_execution", ], ) -> None: ... @@ -3549,7 +3543,7 @@ class PollChannelRequest(google.protobuf.message.Message): AFTER_COUNTER_FIELD_NUMBER: builtins.int WAIT_FIELD_NUMBER: builtins.int MAX_NOTIFICATIONS_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str after_counter: builtins.int @@ -3567,12 +3561,11 @@ class PollChannelRequest(google.protobuf.message.Message): default. """ @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, @@ -3582,13 +3575,12 @@ class PollChannelRequest(google.protobuf.message.Message): after_counter: builtins.int = ..., wait: google.protobuf.duration_pb2.Duration | None = ..., max_notifications: builtins.int = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, field_name: typing_extensions.Literal[ - "wait", b"wait", "workflow_execution", b"workflow_execution" + "execution", b"execution", "wait", b"wait" ], ) -> builtins.bool: ... def ClearField( @@ -3598,14 +3590,14 @@ class PollChannelRequest(google.protobuf.message.Message): b"after_counter", "channel", b"channel", + "execution", + b"execution", "max_notifications", b"max_notifications", "namespace", b"namespace", "wait", b"wait", - "workflow_execution", - b"workflow_execution", ], ) -> None: ... @@ -3640,40 +3632,30 @@ class DescribeChannelRequest(google.protobuf.message.Message): NAMESPACE_FIELD_NUMBER: builtins.int CHANNEL_FIELD_NUMBER: builtins.int - WORKFLOW_EXECUTION_FIELD_NUMBER: builtins.int + EXECUTION_FIELD_NUMBER: builtins.int namespace: builtins.str channel: builtins.str @property - def workflow_execution( - self, - ) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: - """When set, the call addresses the channel linked to this workflow; `run_id` - is optional and resolves to the chain's current run, as a Signal does. - When unset, the call addresses the independent channel of that name. + def execution(self) -> temporalio.api.common.v1.message_pb2.Execution: + """When set, the call addresses the channel linked to this execution. + `run_id` is optional and resolves to the current run of a workflow chain, + as a Signal does. When unset, the call addresses the independent channel + of that name. """ def __init__( self, *, namespace: builtins.str = ..., channel: builtins.str = ..., - workflow_execution: temporalio.api.common.v1.message_pb2.WorkflowExecution - | None = ..., + execution: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( - self, - field_name: typing_extensions.Literal[ - "workflow_execution", b"workflow_execution" - ], + self, field_name: typing_extensions.Literal["execution", b"execution"] ) -> builtins.bool: ... def ClearField( self, field_name: typing_extensions.Literal[ - "channel", - b"channel", - "namespace", - b"namespace", - "workflow_execution", - b"workflow_execution", + "channel", b"channel", "execution", b"execution", "namespace", b"namespace" ], ) -> None: ... @@ -3700,7 +3682,7 @@ class DescribeChannelResponse(google.protobuf.message.Message): """How many notifications the channel retains for pollers.""" kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType @property - def linked_to(self) -> temporalio.api.common.v1.message_pb2.WorkflowExecution: + def linked_to(self) -> temporalio.api.common.v1.message_pb2.Execution: """The owner of a linked channel and the run that holds it. Empty for an independent channel. (-- api-linter: core::0140::prepositions=disabled @@ -3716,7 +3698,7 @@ class DescribeChannelResponse(google.protobuf.message.Message): latest: temporalio.api.notification.v1.message_pb2.Notification | None = ..., retained_count: builtins.int = ..., kind: temporalio.api.notification.v1.message_pb2.ChannelKind.ValueType = ..., - linked_to: temporalio.api.common.v1.message_pb2.WorkflowExecution | None = ..., + linked_to: temporalio.api.common.v1.message_pb2.Execution | None = ..., ) -> None: ... def HasField( self, diff --git a/temporalio/api/workflowservice/v1/service_pb2.py b/temporalio/api/workflowservice/v1/service_pb2.py index 57e919ce9..12492145e 100644 --- a/temporalio/api/workflowservice/v1/service_pb2.py +++ b/temporalio/api/workflowservice/v1/service_pb2.py @@ -27,7 +27,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\xff\xc5\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA"/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*Zn"i/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\x01*Zu"p/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\x01*\x12\xf4\x03\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\xd5\x02\x82\xd3\xe4\x93\x02\xce\x02"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*Zd"_/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\x01*Zk"f/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\x01*\x12\xa6\x04\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\x81\x03\x82\xd3\xe4\x93\x02\xfa\x02*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zo*m/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}Zv*t/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}\x12\xd4\x03\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\xd9\x02\x82\xd3\xe4\x93\x02\xd2\x02\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZe\x12\x63/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notificationsZl\x12j/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notifications\x12\xa8\x03\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"\xa1\x02\x82\xd3\xe4\x93\x02\x9a\x02\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}ZW\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}Z^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n-temporal/api/workflowservice/v1/service.proto\x12\x1ftemporal.api.workflowservice.v1\x1a\x1cgoogle/api/annotations.proto\x1a!nexusannotations/v1/options.proto\x1a+temporal/api/protometa/v1/annotations.proto\x1a\x36temporal/api/workflowservice/v1/request_response.proto2\x86\xcd\x02\n\x0fWorkflowService\x12\xc3\x01\n\x11RegisterNamespace\x12\x39.temporal.api.workflowservice.v1.RegisterNamespaceRequest\x1a:.temporal.api.workflowservice.v1.RegisterNamespaceResponse"7\x82\xd3\xe4\x93\x02\x31"\x13/cluster/namespaces:\x01*Z\x17"\x12/api/v1/namespaces:\x01*\x12\xd5\x01\n\x11\x44\x65scribeNamespace\x12\x39.temporal.api.workflowservice.v1.DescribeNamespaceRequest\x1a:.temporal.api.workflowservice.v1.DescribeNamespaceResponse"I\x82\xd3\xe4\x93\x02\x43\x12\x1f/cluster/namespaces/{namespace}Z \x12\x1e/api/v1/namespaces/{namespace}\x12\xb4\x01\n\x0eListNamespaces\x12\x36.temporal.api.workflowservice.v1.ListNamespacesRequest\x1a\x37.temporal.api.workflowservice.v1.ListNamespacesResponse"1\x82\xd3\xe4\x93\x02+\x12\x13/cluster/namespacesZ\x14\x12\x12/api/v1/namespaces\x12\xe3\x01\n\x0fUpdateNamespace\x12\x37.temporal.api.workflowservice.v1.UpdateNamespaceRequest\x1a\x38.temporal.api.workflowservice.v1.UpdateNamespaceResponse"]\x82\xd3\xe4\x93\x02W"&/cluster/namespaces/{namespace}/update:\x01*Z*"%/api/v1/namespaces/{namespace}/update:\x01*\x12\x8f\x01\n\x12\x44\x65precateNamespace\x12:.temporal.api.workflowservice.v1.DeprecateNamespaceRequest\x1a;.temporal.api.workflowservice.v1.DeprecateNamespaceResponse"\x00\x12\xc6\x02\n\x16StartWorkflowExecution\x12>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponse"\xaa\x01\x82\xd3\xe4\x93\x02q"//namespaces/{namespace}/workflows/{workflow_id}:\x01*Z;"6/api/v1/namespaces/{namespace}/workflows/{workflow_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc2\x01\n\x15\x45xecuteMultiOperation\x12=.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest\x1a>.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfe\x02\n\x1bGetWorkflowExecutionHistory\x12\x43.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest\x1a\x44.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse"\xd3\x01\x82\xd3\xe4\x93\x02\x8f\x01\x12\x41/namespaces/{namespace}/workflows/{execution.workflow_id}/historyZJ\x12H/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xa3\x03\n"GetWorkflowExecutionHistoryReverse\x12J.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest\x1aK.temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse"\xe3\x01\x82\xd3\xe4\x93\x02\x9f\x01\x12I/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverseZR\x12P/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/history-reverse\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xcd\x01\n\x15PollWorkflowTaskQueue\x12=.temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd7\x01\n\x1cRespondWorkflowTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xce\x01\n\x19RespondWorkflowTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondWorkflowTaskFailedResponse"*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x01\n\x15PollActivityTaskQueue\x12=.temporal.api.workflowservice.v1.PollActivityTaskQueueRequest\x1a>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xc2\x02\n\x1bRecordActivityTaskHeartbeat\x12\x43.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest\x1a\x44.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatResponse"\x97\x01\x82\xd3\xe4\x93\x02g"*/namespaces/{namespace}/activity-heartbeat:\x01*Z6"1/api/v1/namespaces/{namespace}/activity-heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa8\x04\n\x1fRecordActivityTaskHeartbeatById\x12G.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdRequest\x1aH.temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatByIdResponse"\xf1\x02\x82\xd3\xe4\x93\x02\xc0\x02":/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/heartbeat:\x01*ZW"R/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xc3\x02\n\x1cRespondActivityTaskCompleted\x12\x44.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest\x1a\x45.temporal.api.workflowservice.v1.RespondActivityTaskCompletedResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/activity-complete:\x01*Z5"0/api/v1/namespaces/{namespace}/activity-complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xa7\x04\n RespondActivityTaskCompletedById\x12H.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdRequest\x1aI.temporal.api.workflowservice.v1.RespondActivityTaskCompletedByIdResponse"\xed\x02\x82\xd3\xe4\x93\x02\xbc\x02"9/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZE"@/api/v1/namespaces/{namespace}/activities/{activity_id}/complete:\x01*ZV"Q/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*Z]"X/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/complete:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb2\x02\n\x19RespondActivityTaskFailed\x12\x41.temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondActivityTaskFailedResponse"\x8d\x01\x82\xd3\xe4\x93\x02]"%/namespaces/{namespace}/activity-fail:\x01*Z1",/api/v1/namespaces/{namespace}/activity-fail:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8e\x04\n\x1dRespondActivityTaskFailedById\x12\x45.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdRequest\x1a\x46.temporal.api.workflowservice.v1.RespondActivityTaskFailedByIdResponse"\xdd\x02\x82\xd3\xe4\x93\x02\xac\x02"5/namespaces/{namespace}/activities/{activity_id}/fail:\x01*ZA"/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\x01*Ze"`/namespaces/{namespace}/workflows/{execution.business_id}/channels/{notification.channel}/notify:\x01*Zl"g/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{notification.channel}/notify:\x01*Zf"a/namespaces/{namespace}/activities/{execution.business_id}/channels/{notification.channel}/notify:\x01*Zm"h/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{notification.channel}/notify:\x01*\x12\xa5\x05\n\x17RegisterChannelListener\x12?.temporal.api.workflowservice.v1.RegisterChannelListenerRequest\x1a@.temporal.api.workflowservice.v1.RegisterChannelListenerResponse"\x86\x04\x82\xd3\xe4\x93\x02\xff\x03"4/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\x01*Z["V/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners:\x01*Zb"]/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners:\x01*Z\\"W/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners:\x01*Zc"^/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners:\x01*\x12\xed\x05\n\x19UnregisterChannelListener\x12\x41.temporal.api.workflowservice.v1.UnregisterChannelListenerRequest\x1a\x42.temporal.api.workflowservice.v1.UnregisterChannelListenerResponse"\xc8\x04\x82\xd3\xe4\x93\x02\xc1\x04*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zf*d/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zm*k/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zg*e/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zn*l/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners/{listener_id}\x12\x87\x05\n\x0bPollChannel\x12\x33.temporal.api.workflowservice.v1.PollChannelRequest\x1a\x34.temporal.api.workflowservice.v1.PollChannelResponse"\x8c\x04\x82\xd3\xe4\x93\x02\x85\x04\x12\x38/namespaces/{namespace}/channels/{channel}/notificationsZA\x12?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZ\\\x12Z/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/notificationsZc\x12\x61/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/notificationsZ]\x12[/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/notificationsZd\x12\x62/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/notifications\x12\xbf\x04\n\x0f\x44\x65scribeChannel\x12\x37.temporal.api.workflowservice.v1.DescribeChannelRequest\x1a\x38.temporal.api.workflowservice.v1.DescribeChannelResponse"\xb8\x03\x82\xd3\xe4\x93\x02\xb1\x03\x12*/namespaces/{namespace}/channels/{channel}Z3\x12\x31/api/v1/namespaces/{namespace}/channels/{channel}ZN\x12L/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}ZU\x12S/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}ZO\x12M/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}ZV\x12T/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}\x12\xb2\x03\n SignalWithStartWorkflowExecution\x12H.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest\x1aI.temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionResponse"\xf8\x01\xd2\x82\x04\t\x12\x07\x65xposed\x82\xd3\xe4\x93\x02\xb1\x01"O/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*Z["V/api/v1/namespaces/{namespace}/workflows/{workflow_id}/signal-with-start/{signal_name}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\x8c\x03\n\x16ResetWorkflowExecution\x12>.temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetWorkflowExecutionResponse"\xf0\x01\x82\xd3\xe4\x93\x02\xa3\x01"H/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*ZT"O/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/reset:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa0\x03\n\x1aTerminateWorkflowExecution\x12\x42.temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateWorkflowExecutionResponse"\xf8\x01\x82\xd3\xe4\x93\x02\xab\x01"L/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*ZX"S/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/terminate:\x01*\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xe4\x01\n\x17\x44\x65leteWorkflowExecution\x12?.temporal.api.workflowservice.v1.DeleteWorkflowExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteWorkflowExecutionResponse"F\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}\x12\xa7\x01\n\x1aListOpenWorkflowExecutions\x12\x42.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsRequest\x1a\x43.temporal.api.workflowservice.v1.ListOpenWorkflowExecutionsResponse"\x00\x12\xad\x01\n\x1cListClosedWorkflowExecutions\x12\x44.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListClosedWorkflowExecutionsResponse"\x00\x12\xf0\x01\n\x16ListWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ListWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListWorkflowExecutionsResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/workflowsZ*\x12(/api/v1/namespaces/{namespace}/workflows\x12\x9a\x02\n\x1eListArchivedWorkflowExecutions\x12\x46.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsRequest\x1aG.temporal.api.workflowservice.v1.ListArchivedWorkflowExecutionsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/archived-workflowsZ3\x12\x31/api/v1/namespaces/{namespace}/archived-workflows\x12\x9b\x01\n\x16ScanWorkflowExecutions\x12>.temporal.api.workflowservice.v1.ScanWorkflowExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ScanWorkflowExecutionsResponse"\x00\x12\xfd\x01\n\x17\x43ountWorkflowExecutions\x12?.temporal.api.workflowservice.v1.CountWorkflowExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/workflow-countZ/\x12-/api/v1/namespaces/{namespace}/workflow-count\x12\x92\x01\n\x13GetSearchAttributes\x12;.temporal.api.workflowservice.v1.GetSearchAttributesRequest\x1a<.temporal.api.workflowservice.v1.GetSearchAttributesResponse"\x00\x12\xd9\x01\n\x19RespondQueryTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondQueryTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd2\x01\n\x14ResetStickyTaskQueue\x12<.temporal.api.workflowservice.v1.ResetStickyTaskQueueRequest\x1a=.temporal.api.workflowservice.v1.ResetStickyTaskQueueResponse"=\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\x83\x01\n\x0eShutdownWorker\x12\x36.temporal.api.workflowservice.v1.ShutdownWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.ShutdownWorkerResponse"\x00\x12\xfc\x02\n\rQueryWorkflow\x12\x35.temporal.api.workflowservice.v1.QueryWorkflowRequest\x1a\x36.temporal.api.workflowservice.v1.QueryWorkflowResponse"\xfb\x01\x82\xd3\xe4\x93\x02\xb7\x01"R/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*Z^"Y/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}/query/{query.query_type}:\x01*\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xe7\x02\n\x19\x44\x65scribeWorkflowExecution\x12\x41.temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeWorkflowExecutionResponse"\xc2\x01\x82\xd3\xe4\x93\x02\x7f\x12\x39/namespaces/{namespace}/workflows/{execution.workflow_id}ZB\x12@/api/v1/namespaces/{namespace}/workflows/{execution.workflow_id}\x8a\x9d\xcc\x1b\x38\n\x14temporal-resource-id\x12 workflow:{execution.workflow_id}\x12\xc2\x02\n\x11\x44\x65scribeTaskQueue\x12\x39.temporal.api.workflowservice.v1.DescribeTaskQueueRequest\x1a:.temporal.api.workflowservice.v1.DescribeTaskQueueResponse"\xb5\x01\x82\xd3\xe4\x93\x02w\x12\x35/namespaces/{namespace}/task-queues/{task_queue.name}Z>\x12/namespaces/{namespace}/schedules/{schedule_id}/matching-timesZG\x12\x45/api/v1/namespaces/{namespace}/schedules/{schedule_id}/matching-times\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xa8\x02\n\x0e\x44\x65leteSchedule\x12\x36.temporal.api.workflowservice.v1.DeleteScheduleRequest\x1a\x37.temporal.api.workflowservice.v1.DeleteScheduleResponse"\xa4\x01\x82\xd3\xe4\x93\x02k*//namespaces/{namespace}/schedules/{schedule_id}Z8*6/api/v1/namespaces/{namespace}/schedules/{schedule_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16schedule:{schedule_id}\x12\xd5\x01\n\rListSchedules\x12\x35.temporal.api.workflowservice.v1.ListSchedulesRequest\x1a\x36.temporal.api.workflowservice.v1.ListSchedulesResponse"U\x82\xd3\xe4\x93\x02O\x12!/namespaces/{namespace}/schedulesZ*\x12(/api/v1/namespaces/{namespace}/schedules\x12\xe2\x01\n\x0e\x43ountSchedules\x12\x36.temporal.api.workflowservice.v1.CountSchedulesRequest\x1a\x37.temporal.api.workflowservice.v1.CountSchedulesResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/schedule-countZ/\x12-/api/v1/namespaces/{namespace}/schedule-count\x12\xb9\x01\n UpdateWorkerBuildIdCompatibility\x12H.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest\x1aI.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityResponse"\x00\x12\xe1\x02\n\x1dGetWorkerBuildIdCompatibility\x12\x45.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest\x1a\x46.temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse"\xb0\x01\x82\xd3\xe4\x93\x02\xa9\x01\x12N/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibilityZW\x12U/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-build-id-compatibility\x12\xaa\x01\n\x1bUpdateWorkerVersioningRules\x12\x43.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest\x1a\x44.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse"\x00\x12\xc6\x02\n\x18GetWorkerVersioningRules\x12@.temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest\x1a\x41.temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse"\xa4\x01\x82\xd3\xe4\x93\x02\x9d\x01\x12H/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rulesZQ\x12O/api/v1/namespaces/{namespace}/task-queues/{task_queue}/worker-versioning-rules\x12\x97\x02\n\x19GetWorkerTaskReachability\x12\x41.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetWorkerTaskReachabilityResponse"s\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/worker-task-reachabilityZ9\x12\x37/api/v1/namespaces/{namespace}/worker-task-reachability\x12\xc8\x02\n\x12\x44\x65scribeDeployment\x12:.temporal.api.workflowservice.v1.DescribeDeploymentRequest\x1a;.temporal.api.workflowservice.v1.DescribeDeploymentResponse"\xb8\x01\x82\xd3\xe4\x93\x02\xb1\x01\x12R/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}Z[\x12Y/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}\x12\x81\x04\n\x1f\x44\x65scribeWorkerDeploymentVersion\x12G.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionRequest\x1aH.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse"\xca\x02\x82\xd3\xe4\x93\x02\xf7\x01\x12u/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}Z~\x12|/api/v1/namespaces/{namespace}/worker-deployment-versions/{deployment_version.deployment_name}/{deployment_version.build_id}\x8a\x9d\xcc\x1bG\n\x14temporal-resource-id\x12/deployment:{deployment_version.deployment_name}\x12\xdf\x01\n\x0fListDeployments\x12\x37.temporal.api.workflowservice.v1.ListDeploymentsRequest\x1a\x38.temporal.api.workflowservice.v1.ListDeploymentsResponse"Y\x82\xd3\xe4\x93\x02S\x12#/namespaces/{namespace}/deploymentsZ,\x12*/api/v1/namespaces/{namespace}/deployments\x12\xf7\x02\n\x19GetDeploymentReachability\x12\x41.temporal.api.workflowservice.v1.GetDeploymentReachabilityRequest\x1a\x42.temporal.api.workflowservice.v1.GetDeploymentReachabilityResponse"\xd2\x01\x82\xd3\xe4\x93\x02\xcb\x01\x12_/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachabilityZh\x12\x66/api/v1/namespaces/{namespace}/deployments/{deployment.series_name}/{deployment.build_id}/reachability\x12\x99\x02\n\x14GetCurrentDeployment\x12<.temporal.api.workflowservice.v1.GetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.GetCurrentDeploymentResponse"\x83\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/current-deployment/{series_name}ZA\x12?/api/v1/namespaces/{namespace}/current-deployment/{series_name}\x12\xb6\x02\n\x14SetCurrentDeployment\x12<.temporal.api.workflowservice.v1.SetCurrentDeploymentRequest\x1a=.temporal.api.workflowservice.v1.SetCurrentDeploymentResponse"\xa0\x01\x82\xd3\xe4\x93\x02\x99\x01"C/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*ZO"J/api/v1/namespaces/{namespace}/current-deployment/{deployment.series_name}:\x01*\x12\xb0\x03\n!SetWorkerDeploymentCurrentVersion\x12I.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionRequest\x1aJ.temporal.api.workflowservice.v1.SetWorkerDeploymentCurrentVersionResponse"\xf3\x01\x82\xd3\xe4\x93\x02\xb3\x01"P/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*Z\\"W/api/v1/namespaces/{namespace}/worker-deployments/{deployment_name}/set-current-version:\x01*\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1c\x64\x65ployment:{deployment_name}\x12\xe7\x02\n\x18\x44\x65scribeWorkerDeployment\x12@.temporal.api.workflowservice.v1.DescribeWorkerDeploymentRequest\x1a\x41.temporal.api.workflowservice.v1.DescribeWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.DeleteWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.DeleteWorkerDeploymentResponse"\xc5\x01\x82\xd3\xe4\x93\x02\x85\x01*.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse"g\x82\xd3\xe4\x93\x02\x61\x12*/namespaces/{namespace}/worker-deploymentsZ3\x12\x31/api/v1/namespaces/{namespace}/worker-deployments\x12\xae\x02\n\x16\x43reateWorkerDeployment\x12>.temporal.api.workflowservice.v1.CreateWorkerDeploymentRequest\x1a?.temporal.api.workflowservice.v1.CreateWorkerDeploymentResponse"\x92\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.DescribeBatchOperationRequest\x1a?.temporal.api.workflowservice.v1.DescribeBatchOperationResponse"\xa0\x01\x82\xd3\xe4\x93\x02o\x12\x31/namespaces/{namespace}/batch-operations/{job_id}Z:\x12\x38/api/v1/namespaces/{namespace}/batch-operations/{job_id}\x8a\x9d\xcc\x1b&\n\x14temporal-resource-id\x12\x0e\x62\x61tch:{job_id}\x12\xf5\x01\n\x13ListBatchOperations\x12;.temporal.api.workflowservice.v1.ListBatchOperationsRequest\x1a<.temporal.api.workflowservice.v1.ListBatchOperationsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/batch-operationsZ1\x12//api/v1/namespaces/{namespace}/batch-operations\x12\xc4\x01\n\x12PollNexusTaskQueue\x12:.temporal.api.workflowservice.v1.PollNexusTaskQueueRequest\x1a;.temporal.api.workflowservice.v1.PollNexusTaskQueueResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd9\x01\n\x19RespondNexusTaskCompleted\x12\x41.temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest\x1a\x42.temporal.api.workflowservice.v1.RespondNexusTaskCompletedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xd0\x01\n\x16RespondNexusTaskFailed\x12>.temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest\x1a?.temporal.api.workflowservice.v1.RespondNexusTaskFailedResponse"5\x8a\x9d\xcc\x1b\x30\n\x14temporal-resource-id\x12\x18poller:{poller_group_id}\x12\xe8\x02\n\x15UpdateActivityOptions\x12=.temporal.api.workflowservice.v1.UpdateActivityOptionsRequest\x1a>.temporal.api.workflowservice.v1.UpdateActivityOptionsResponse"\xcf\x01\x82\xd3\xe4\x93\x02\x8b\x01".temporal.api.workflowservice.v1.RecordWorkerHeartbeatResponse"\x95\x01\x82\xd3\xe4\x93\x02\x65")/namespaces/{namespace}/workers/heartbeat:\x01*Z5"0/api/v1/namespaces/{namespace}/workers/heartbeat:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcb\x01\n\x0bListWorkers\x12\x33.temporal.api.workflowservice.v1.ListWorkersRequest\x1a\x34.temporal.api.workflowservice.v1.ListWorkersResponse"Q\x82\xd3\xe4\x93\x02K\x12\x1f/namespaces/{namespace}/workersZ(\x12&/api/v1/namespaces/{namespace}/workers\x12\xd8\x01\n\x0c\x43ountWorkers\x12\x34.temporal.api.workflowservice.v1.CountWorkersRequest\x1a\x35.temporal.api.workflowservice.v1.CountWorkersResponse"[\x82\xd3\xe4\x93\x02U\x12$/namespaces/{namespace}/worker-countZ-\x12+/api/v1/namespaces/{namespace}/worker-count\x12\xe2\x02\n\x15UpdateTaskQueueConfig\x12=.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest\x1a>.temporal.api.workflowservice.v1.UpdateTaskQueueConfigResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*ZJ"E/api/v1/namespaces/{namespace}/task-queues/{task_queue}/update-config:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16taskqueue:{task_queue}\x12\xa8\x02\n\x11\x46\x65tchWorkerConfig\x12\x39.temporal.api.workflowservice.v1.FetchWorkerConfigRequest\x1a:.temporal.api.workflowservice.v1.FetchWorkerConfigResponse"\x9b\x01\x82\xd3\xe4\x93\x02k",/namespaces/{namespace}/workers/fetch-config:\x01*Z8"3/api/v1/namespaces/{namespace}/workers/fetch-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xad\x02\n\x12UpdateWorkerConfig\x12:.temporal.api.workflowservice.v1.UpdateWorkerConfigRequest\x1a;.temporal.api.workflowservice.v1.UpdateWorkerConfigResponse"\x9d\x01\x82\xd3\xe4\x93\x02m"-/namespaces/{namespace}/workers/update-config:\x01*Z9"4/api/v1/namespaces/{namespace}/workers/update-config:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xcd\x02\n\x0e\x44\x65scribeWorker\x12\x36.temporal.api.workflowservice.v1.DescribeWorkerRequest\x1a\x37.temporal.api.workflowservice.v1.DescribeWorkerResponse"\xc9\x01\x82\xd3\xe4\x93\x02\x89\x01\x12>/namespaces/{namespace}/workers/describe/{worker_instance_key}ZG\x12\x45/api/v1/namespaces/{namespace}/workers/describe/{worker_instance_key}\x8a\x9d\xcc\x1b\x34\n\x14temporal-resource-id\x12\x1cworker:{worker_instance_key}\x12\xd2\x02\n\x16PauseWorkflowExecution\x12>.temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseWorkflowExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}"5/namespaces/{namespace}/workflows/{workflow_id}/pause:\x01*ZA"/api/v1/namespaces/{namespace}/workflows/{workflow_id}/unpause:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16workflow:{workflow_id}\x12\xc8\x02\n\x16StartActivityExecution\x12>.temporal.api.workflowservice.v1.StartActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.StartActivityExecutionResponse"\xac\x01\x82\xd3\xe4\x93\x02s"0/namespaces/{namespace}/activities/{activity_id}:\x01*Z<"7/api/v1/namespaces/{namespace}/activities/{activity_id}:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb6\x02\n\x1cStartNexusOperationExecution\x12\x44.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest\x1a\x45.temporal.api.workflowservice.v1.StartNexusOperationExecutionResponse"\x88\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*ZC">/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}:\x01*\x12\xcb\x02\n\x19\x44\x65scribeActivityExecution\x12\x41.temporal.api.workflowservice.v1.DescribeActivityExecutionRequest\x1a\x42.temporal.api.workflowservice.v1.DescribeActivityExecutionResponse"\xa6\x01\x82\xd3\xe4\x93\x02m\x12\x30/namespaces/{namespace}/activities/{activity_id}Z9\x12\x37/api/v1/namespaces/{namespace}/activities/{activity_id}\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb8\x02\n\x1f\x44\x65scribeNexusOperationExecution\x12G.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionRequest\x1aH.temporal.api.workflowservice.v1.DescribeNexusOperationExecutionResponse"\x81\x01\x82\xd3\xe4\x93\x02{\x12\x37/namespaces/{namespace}/nexus-operations/{operation_id}Z@\x12>/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}\x12\xcf\x02\n\x15PollActivityExecution\x12=.temporal.api.workflowservice.v1.PollActivityExecutionRequest\x1a>.temporal.api.workflowservice.v1.PollActivityExecutionResponse"\xb6\x01\x82\xd3\xe4\x93\x02}\x12\x38/namespaces/{namespace}/activities/{activity_id}/outcomeZA\x12?/api/v1/namespaces/{namespace}/activities/{activity_id}/outcome\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xb7\x02\n\x1bPollNexusOperationExecution\x12\x43.temporal.api.workflowservice.v1.PollNexusOperationExecutionRequest\x1a\x44.temporal.api.workflowservice.v1.PollNexusOperationExecutionResponse"\x8c\x01\x82\xd3\xe4\x93\x02\x85\x01\x12.temporal.api.workflowservice.v1.ListActivityExecutionsRequest\x1a?.temporal.api.workflowservice.v1.ListActivityExecutionsResponse"W\x82\xd3\xe4\x93\x02Q\x12"/namespaces/{namespace}/activitiesZ+\x12)/api/v1/namespaces/{namespace}/activities\x12\x90\x02\n\x1cListNexusOperationExecutions\x12\x44.temporal.api.workflowservice.v1.ListNexusOperationExecutionsRequest\x1a\x45.temporal.api.workflowservice.v1.ListNexusOperationExecutionsResponse"c\x82\xd3\xe4\x93\x02]\x12(/namespaces/{namespace}/nexus-operationsZ1\x12//api/v1/namespaces/{namespace}/nexus-operations\x12\xfd\x01\n\x17\x43ountActivityExecutions\x12?.temporal.api.workflowservice.v1.CountActivityExecutionsRequest\x1a@.temporal.api.workflowservice.v1.CountActivityExecutionsResponse"_\x82\xd3\xe4\x93\x02Y\x12&/namespaces/{namespace}/activity-countZ/\x12-/api/v1/namespaces/{namespace}/activity-count\x12\x9d\x02\n\x1d\x43ountNexusOperationExecutions\x12\x45.temporal.api.workflowservice.v1.CountNexusOperationExecutionsRequest\x1a\x46.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse"m\x82\xd3\xe4\x93\x02g\x12-/namespaces/{namespace}/nexus-operation-countZ6\x12\x34/api/v1/namespaces/{namespace}/nexus-operation-count\x12\xef\x02\n\x1eRequestCancelActivityExecution\x12\x46.temporal.api.workflowservice.v1.RequestCancelActivityExecutionRequest\x1aG.temporal.api.workflowservice.v1.RequestCancelActivityExecutionResponse"\xbb\x01\x82\xd3\xe4\x93\x02\x81\x01"7/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*ZC">/api/v1/namespaces/{namespace}/activities/{activity_id}/cancel:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\xdc\x02\n$RequestCancelNexusOperationExecution\x12L.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionRequest\x1aM.temporal.api.workflowservice.v1.RequestCancelNexusOperationExecutionResponse"\x96\x01\x82\xd3\xe4\x93\x02\x8f\x01">/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*ZJ"E/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/cancel:\x01*\x12\xe9\x02\n\x1aTerminateActivityExecution\x12\x42.temporal.api.workflowservice.v1.TerminateActivityExecutionRequest\x1a\x43.temporal.api.workflowservice.v1.TerminateActivityExecutionResponse"\xc1\x01\x82\xd3\xe4\x93\x02\x87\x01":/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*ZF"A/api/v1/namespaces/{namespace}/activities/{activity_id}/terminate:\x01*\x8a\x9d\xcc\x1b.\n\x14temporal-resource-id\x12\x16\x61\x63tivity:{activity_id}\x12\x9e\x01\n\x17\x44\x65leteActivityExecution\x12?.temporal.api.workflowservice.v1.DeleteActivityExecutionRequest\x1a@.temporal.api.workflowservice.v1.DeleteActivityExecutionResponse"\x00\x12\xfd\x03\n\x16PauseActivityExecution\x12>.temporal.api.workflowservice.v1.PauseActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.PauseActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/pause:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/pause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xfd\x03\n\x16ResetActivityExecution\x12>.temporal.api.workflowservice.v1.ResetActivityExecutionRequest\x1a?.temporal.api.workflowservice.v1.ResetActivityExecutionResponse"\xe1\x02\x82\xd3\xe4\x93\x02\xb0\x02"6/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZB"=/api/v1/namespaces/{namespace}/activities/{activity_id}/reset:\x01*ZS"N/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*ZZ"U/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/reset:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\x8b\x04\n\x18UnpauseActivityExecution\x12@.temporal.api.workflowservice.v1.UnpauseActivityExecutionRequest\x1a\x41.temporal.api.workflowservice.v1.UnpauseActivityExecutionResponse"\xe9\x02\x82\xd3\xe4\x93\x02\xb8\x02"8/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZD"?/api/v1/namespaces/{namespace}/activities/{activity_id}/unpause:\x01*ZU"P/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*Z\\"W/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/unpause:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xb9\x04\n\x1eUpdateActivityExecutionOptions\x12\x46.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsRequest\x1aG.temporal.api.workflowservice.v1.UpdateActivityExecutionOptionsResponse"\x85\x03\x82\xd3\xe4\x93\x02\xd4\x02"?/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*ZK"F/api/v1/namespaces/{namespace}/activities/{activity_id}/update-options:\x01*Z\\"W/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*Zc"^/api/v1/namespaces/{namespace}/workflows/{workflow_id}/activities/{activity_id}/update-options:\x01*\x8a\x9d\xcc\x1b%\n\x14temporal-resource-id\x12\r{resource_id}\x12\xd6\x02\n TerminateNexusOperationExecution\x12H.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionRequest\x1aI.temporal.api.workflowservice.v1.TerminateNexusOperationExecutionResponse"\x9c\x01\x82\xd3\xe4\x93\x02\x95\x01"A/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*ZM"H/api/v1/namespaces/{namespace}/nexus-operations/{operation_id}/terminate:\x01*\x12\xb0\x01\n\x1d\x44\x65leteNexusOperationExecution\x12\x45.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionRequest\x1a\x46.temporal.api.workflowservice.v1.DeleteNexusOperationExecutionResponse"\x00\x12\xc1\x03\n!PollWorkflowExecutionTimeSkipping\x12I.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingRequest\x1aJ.temporal.api.workflowservice.v1.PollWorkflowExecutionTimeSkippingResponse"\x84\x02\x82\xd3\xe4\x93\x02\xb7\x01\x12U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\x12\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\x8a\x9d\xcc\x1b\x41\n\x14temporal-resource-id\x12)workflow:{workflow_execution.workflow_id}B\xb6\x01\n"io.temporal.api.workflowservice.v1B\x0cServiceProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -138,23 +138,23 @@ _WORKFLOWSERVICE.methods_by_name["NotifyChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "NotifyChannel" - ]._serialized_options = b'\202\323\344\223\002\366\002">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*Zn"i/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\001*Zu"p/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{notification.channel}/notify:\001*' + ]._serialized_options = b'\202\323\344\223\002\273\004">/namespaces/{namespace}/channels/{notification.channel}/notify:\001*ZJ"E/api/v1/namespaces/{namespace}/channels/{notification.channel}/notify:\001*Ze"`/namespaces/{namespace}/workflows/{execution.business_id}/channels/{notification.channel}/notify:\001*Zl"g/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{notification.channel}/notify:\001*Zf"a/namespaces/{namespace}/activities/{execution.business_id}/channels/{notification.channel}/notify:\001*Zm"h/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{notification.channel}/notify:\001*' _WORKFLOWSERVICE.methods_by_name["RegisterChannelListener"]._options = None _WORKFLOWSERVICE.methods_by_name[ "RegisterChannelListener" - ]._serialized_options = b'\202\323\344\223\002\316\002"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*Zd"_/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\001*Zk"f/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners:\001*' + ]._serialized_options = b'\202\323\344\223\002\377\003"4/namespaces/{namespace}/channels/{channel}/listeners:\001*Z@";/api/v1/namespaces/{namespace}/channels/{channel}/listeners:\001*Z["V/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners:\001*Zb"]/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners:\001*Z\\"W/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners:\001*Zc"^/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners:\001*' _WORKFLOWSERVICE.methods_by_name["UnregisterChannelListener"]._options = None _WORKFLOWSERVICE.methods_by_name[ "UnregisterChannelListener" - ]._serialized_options = b"\202\323\344\223\002\372\002*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zo*m/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}Zv*t/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/listeners/{listener_id}" + ]._serialized_options = b"\202\323\344\223\002\301\004*B/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}ZK*I/api/v1/namespaces/{namespace}/channels/{channel}/listeners/{listener_id}Zf*d/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zm*k/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zg*e/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners/{listener_id}Zn*l/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/listeners/{listener_id}" _WORKFLOWSERVICE.methods_by_name["PollChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "PollChannel" - ]._serialized_options = b"\202\323\344\223\002\322\002\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZe\022c/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notificationsZl\022j/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}/notifications" + ]._serialized_options = b"\202\323\344\223\002\205\004\0228/namespaces/{namespace}/channels/{channel}/notificationsZA\022?/api/v1/namespaces/{namespace}/channels/{channel}/notificationsZ\\\022Z/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/notificationsZc\022a/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}/notificationsZ]\022[/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/notificationsZd\022b/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}/notifications" _WORKFLOWSERVICE.methods_by_name["DescribeChannel"]._options = None _WORKFLOWSERVICE.methods_by_name[ "DescribeChannel" - ]._serialized_options = b"\202\323\344\223\002\232\002\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}ZW\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}Z^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/channels/{channel}" + ]._serialized_options = b"\202\323\344\223\002\261\003\022*/namespaces/{namespace}/channels/{channel}Z3\0221/api/v1/namespaces/{namespace}/channels/{channel}ZN\022L/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}ZU\022S/api/v1/namespaces/{namespace}/workflows/{execution.business_id}/channels/{channel}ZO\022M/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}ZV\022T/api/v1/namespaces/{namespace}/activities/{execution.business_id}/channels/{channel}" _WORKFLOWSERVICE.methods_by_name["SignalWithStartWorkflowExecution"]._options = None _WORKFLOWSERVICE.methods_by_name[ "SignalWithStartWorkflowExecution" @@ -546,5 +546,5 @@ "PollWorkflowExecutionTimeSkipping" ]._serialized_options = b"\202\323\344\223\002\267\001\022U/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/pollZ^\022\\/api/v1/namespaces/{namespace}/workflows/{workflow_execution.workflow_id}/time-skipping/poll\212\235\314\033A\n\024temporal-resource-id\022)workflow:{workflow_execution.workflow_id}" _WORKFLOWSERVICE._serialized_start = 250 - _WORKFLOWSERVICE._serialized_end = 41977 + _WORKFLOWSERVICE._serialized_end = 42880 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 4afe3e5d4..700698135 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 4afe3e5d40eaee6ae44969cbfd7d0e773a62804f +Subproject commit 700698135fec798742dc280aa867f9db99a222fc From a59c3a8b797ef152d748752dd859c9b84a9a441b Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 17:48:28 -0700 Subject: [PATCH 817/831] Addressed a linked channel by execution. A standalone activity can own a channel too, so the client calls, the stream wake path and the probe name the owner as a `temporalio.common.Execution`, with `workflow_id` kept as the short form for a workflow. --- temporalio/client/_channel.py | 15 +-- temporalio/client/_client.py | 119 ++++++++++++------ temporalio/client/_impl.py | 36 +++--- temporalio/client/_interceptor.py | 20 +-- temporalio/common.py | 60 +++++++++ .../external_workflow_streams/_wake.py | 62 +++++---- temporalio/worker/_workflow.py | 2 +- temporalio/workflow/_channels.py | 18 ++- .../test_channels.py | 90 +++++++++---- .../external_workflow_streams/test_wake.py | 36 ++++-- .../test_worker_integration.py | 4 +- 11 files changed, 322 insertions(+), 140 deletions(-) diff --git a/temporalio/client/_channel.py b/temporalio/client/_channel.py index d05d2875b..d12f93e3b 100644 --- a/temporalio/client/_channel.py +++ b/temporalio/client/_channel.py @@ -7,8 +7,8 @@ from datetime import datetime, timezone from enum import IntEnum -import temporalio.api.common.v1 import temporalio.api.notification.v1 +import temporalio.common from temporalio.workflow import Notification from ._callback import Callback @@ -37,10 +37,11 @@ class ChannelKind(IntEnum): """ LINKED = int(temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED) - """Kept in one workflow's state, keyed by namespace, workflow id and name. + """Kept in one execution's state, keyed by namespace, execution and name. - The owning workflow is its listener by construction; a call reaches it - with the ``workflow_id`` argument. + The owning execution, a workflow or a standalone activity, is its listener + by construction. A call reaches it with the ``execution`` argument, or + with ``workflow_id`` for a workflow. """ @@ -110,12 +111,12 @@ class ChannelDescription: kind: ChannelKind = ChannelKind.UNSPECIFIED """Which kind of channel this is. - A linked channel of a running workflow exists by construction, so a - describe with ``workflow_id`` answers :attr:`ChannelKind.LINKED` with no + A linked channel of a running execution exists by construction, so a + describe with ``execution`` answers :attr:`ChannelKind.LINKED` with no listeners and nothing retained for a name nobody has notified yet. """ - linked_to: temporalio.api.common.v1.WorkflowExecution | None = None + linked_to: temporalio.common.Execution | None = None """The owner of a linked channel and the run that holds it. ``None`` for an independent channel. diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index e50ef6d54..368cee9ed 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -125,6 +125,28 @@ """How long :py:meth:`Client.poll_channel` waits for a notification by default.""" +def _channel_execution( + execution: temporalio.common.Execution | None, + workflow_id: str | None, + run_id: str | None, +) -> temporalio.common.Execution | None: + """The execution a channel call addresses, from either spelling of it. + + ``workflow_id`` and ``run_id`` are the short form for a workflow. They + cannot be combined with ``execution``, and ``run_id`` needs ``workflow_id``. + ``None`` addresses the independent channel of the name. + """ + if execution is not None: + if workflow_id is not None or run_id is not None: + raise ValueError("pass either execution or workflow_id, not both") + return execution + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id needs workflow_id") + return None + return temporalio.common.Execution.workflow(workflow_id, run_id) + + class Client: """Client for accessing Temporal. @@ -2896,6 +2918,7 @@ async def notify_channel( position: bytes = b"", counter: int = 0, metadata: Mapping[str, Any] | None = None, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -2914,24 +2937,30 @@ async def notify_channel( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. + execution when one is given. position: Where the source stands after the write, in the writer's own terms. Opaque to the server. counter: Orders notifications from this channel's writers. Derive it from ``position``, since only the source can order its positions. metadata: Details for the listener, such as which topic moved. Each value is encoded with the client's data converter. - workflow_id: Address the channel linked to this workflow instead of - the independent channel of that name. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run, as a Signal does. Unset means the - current run under the workflow id. + execution: Address the channel linked to this execution, a workflow + or a standalone activity, instead of the independent channel of + that name. Without a run id the call reaches the current run, + as a Signal does. + workflow_id: Short for ``execution`` naming a workflow. Not with + ``execution``. + run_id: With ``workflow_id``, a run of its chain. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. Returns: How many listeners the channel had when the notification arrived. + + Raises: + ValueError: Both ``execution`` and ``workflow_id`` were given, or + ``run_id`` without ``workflow_id``. """ return await self._impl.notify_channel( NotifyChannelInput( @@ -2941,8 +2970,7 @@ async def notify_channel( metadata=metadata, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -2953,6 +2981,7 @@ async def poll_channel( after_counter: int = 0, wait: bool | timedelta = True, max_notifications: int = 100, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -2965,23 +2994,29 @@ async def poll_channel( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. + execution when one is given. after_counter: Only notifications with a counter above this one are returned. Pass the highest counter seen so far to page. wait: How long the server holds the call when nothing is retained above ``after_counter``. ``True`` waits up to :py:data:`DEFAULT_CHANNEL_POLL_WAIT`, ``False`` returns at once. max_notifications: Upper bound on the notifications returned. - workflow_id: Address the channel linked to this workflow instead of - the independent channel of that name. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run. + execution: Address the channel linked to this execution instead of + the independent channel of that name. Without a run id the + call reaches the current run. + workflow_id: Short for ``execution`` naming a workflow. Not with + ``execution``. + run_id: With ``workflow_id``, a run of its chain. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. Returns: The notifications, oldest first. Empty when the wait ran out. + + Raises: + ValueError: Both ``execution`` and ``workflow_id`` were given, or + ``run_id`` without ``workflow_id``. """ if wait is True: wait_for: timedelta | None = DEFAULT_CHANNEL_POLL_WAIT @@ -2997,8 +3032,7 @@ async def poll_channel( max_notifications=max_notifications, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -3006,6 +3040,7 @@ async def describe_channel( self, channel: str, *, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -3018,25 +3053,29 @@ async def describe_channel( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. - workflow_id: Describe the channel linked to this workflow instead + execution when one is given. + execution: Describe the channel linked to this execution instead of the independent channel of that name. A linked channel of a - running workflow exists by construction, so the answer for a + running execution exists by construction, so the answer for a name nobody has notified yet is a linked channel with no listeners and nothing retained, not a not-found error. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run. + workflow_id: Short for ``execution`` naming a workflow. Not with + ``execution``. + run_id: With ``workflow_id``, a run of its chain. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. + + Raises: + ValueError: Both ``execution`` and ``workflow_id`` were given, or + ``run_id`` without ``workflow_id``. """ return await self._impl.describe_channel( DescribeChannelInput( channel=channel, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -3045,6 +3084,7 @@ async def register_channel_listener( channel: str, callback: Callback, *, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -3060,19 +3100,24 @@ async def register_channel_listener( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. + execution when one is given. callback: The callback to invoke. - workflow_id: Listen on the channel linked to this workflow instead + execution: Listen on the channel linked to this execution instead of the independent channel of that name. The listener lives in - that workflow's state and ends with its run. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run. + that execution's state and ends with its run. + workflow_id: Short for ``execution`` naming a workflow. Not with + ``execution``. + run_id: With ``workflow_id``, a run of its chain. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. Returns: The listener id the server assigned. + + Raises: + ValueError: Both ``execution`` and ``workflow_id`` were given, or + ``run_id`` without ``workflow_id``. """ return await self._impl.register_channel_listener( RegisterChannelListenerInput( @@ -3080,8 +3125,7 @@ async def register_channel_listener( callback=callback, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -3090,6 +3134,7 @@ async def unregister_channel_listener( channel: str, listener_id: str, *, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -3102,15 +3147,20 @@ async def unregister_channel_listener( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. + execution when one is given. listener_id: The id :py:meth:`register_channel_listener` returned. - workflow_id: The workflow whose linked channel the listener is on, + execution: The execution whose linked channel the listener is on, when it was registered with one. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run. + workflow_id: Short for ``execution`` naming a workflow. Not with + ``execution``. + run_id: With ``workflow_id``, a run of its chain. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. + + Raises: + ValueError: Both ``execution`` and ``workflow_id`` were given, or + ``run_id`` without ``workflow_id``. """ await self._impl.unregister_channel_listener( UnregisterChannelListenerInput( @@ -3118,8 +3168,7 @@ async def unregister_channel_listener( listener_id=listener_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, + execution=_channel_execution(execution, workflow_id, run_id), ) ) diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index 0d7d8c726..197404b43 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -1720,7 +1720,7 @@ async def notify_channel(self, input: NotifyChannelInput) -> int: notification=notification, identity=self._client.identity, request_id=str(uuid.uuid4()), - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner(input.execution), ), retry=True, metadata=input.rpc_metadata, @@ -1736,7 +1736,7 @@ async def poll_channel( channel=input.channel, after_counter=input.after_counter, max_notifications=input.max_notifications, - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner(input.execution), ) if input.wait is not None: req.wait.FromTimedelta(input.wait) @@ -1750,7 +1750,7 @@ async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescript temporalio.api.workflowservice.v1.DescribeChannelRequest( namespace=self._client.namespace, channel=input.channel, - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner(input.execution), ), retry=True, metadata=input.rpc_metadata, @@ -1767,7 +1767,11 @@ async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescript ), retained_count=resp.retained_count, kind=ChannelKind(resp.kind), - linked_to=resp.linked_to if resp.HasField("linked_to") else None, + linked_to=( + temporalio.common.Execution.from_proto(resp.linked_to) + if resp.HasField("linked_to") + else None + ), ) async def register_channel_listener( @@ -1784,7 +1788,7 @@ async def register_channel_listener( ), request_id=str(uuid.uuid4()), identity=self._client.identity, - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner(input.execution), ), retry=True, metadata=input.rpc_metadata, @@ -1801,7 +1805,7 @@ async def unregister_channel_listener( channel=input.channel, listener_id=input.listener_id, identity=self._client.identity, - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner(input.execution), ), retry=True, metadata=input.rpc_metadata, @@ -1825,7 +1829,11 @@ async def _notification_from_proto( position=proto.position, counter=proto.counter, metadata=metadata, - linked_to=proto.linked_to if proto.HasField("linked_to") else None, + linked_to=( + temporalio.common.Execution.from_proto(proto.linked_to) + if proto.HasField("linked_to") + else None + ), ) async def _apply_headers( @@ -1843,13 +1851,7 @@ async def _apply_headers( def _channel_owner( - workflow_id: str | None, run_id: str | None -) -> temporalio.api.common.v1.WorkflowExecution | None: - """The workflow a channel call addresses, or ``None`` for an independent channel.""" - if workflow_id is None: - if run_id is not None: - raise ValueError("run_id needs workflow_id") - return None - return temporalio.api.common.v1.WorkflowExecution( - workflow_id=workflow_id, run_id=run_id or "" - ) + execution: temporalio.common.Execution | None, +) -> temporalio.api.common.v1.Execution | None: + """The execution a channel call addresses, or ``None`` for an independent channel.""" + return execution.to_proto() if execution is not None else None diff --git a/temporalio/client/_interceptor.py b/temporalio/client/_interceptor.py index ac40ddeb4..80e3da7fa 100644 --- a/temporalio/client/_interceptor.py +++ b/temporalio/client/_interceptor.py @@ -697,8 +697,8 @@ class NotifyChannelInput: metadata: Mapping[str, Any] | None rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None + execution: temporalio.common.Execution | None = None + """The owner of the linked channel addressed, ``None`` for an independent one.""" @dataclass @@ -715,8 +715,8 @@ class PollChannelInput: max_notifications: int rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None + execution: temporalio.common.Execution | None = None + """The owner of the linked channel addressed, ``None`` for an independent one.""" @dataclass @@ -730,8 +730,8 @@ class DescribeChannelInput: channel: str rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None + execution: temporalio.common.Execution | None = None + """The owner of the linked channel addressed, ``None`` for an independent one.""" @dataclass @@ -746,8 +746,8 @@ class RegisterChannelListenerInput: callback: Callback rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None + execution: temporalio.common.Execution | None = None + """The owner of the linked channel addressed, ``None`` for an independent one.""" @dataclass @@ -762,8 +762,8 @@ class UnregisterChannelListenerInput: listener_id: str rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None + execution: temporalio.common.Execution | None = None + """The owner of the linked channel addressed, ``None`` for an independent one.""" @dataclass diff --git a/temporalio/common.py b/temporalio/common.py index ad75b56b9..9728daa92 100644 --- a/temporalio/common.py +++ b/temporalio/common.py @@ -335,6 +335,66 @@ class NexusOperationCancellationState(IntEnum): """Cancellation request is blocked, eg: by circuit breaker.""" +class ExecutionType(IntEnum): + """What kind of execution an :py:class:`Execution` names. + + .. warning:: + This API is experimental and unstable. + + See :py:class:`temporalio.api.enums.v1.ExecutionType`. + """ + + UNSPECIFIED = int(temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_UNSPECIFIED) + WORKFLOW = int(temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_WORKFLOW) + ACTIVITY = int(temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_ACTIVITY) + """A standalone activity.""" + + +@dataclass(frozen=True) +class Execution: + """One execution in a namespace: a workflow or a standalone activity. + + Where a call can address either kind, this names which one and by what id. + The id is the business id the caller chose, a workflow id or an activity + id, with an optional run id below it. + + .. warning:: + This API is experimental and unstable. + """ + + type: ExecutionType + """Which kind of execution ``business_id`` names.""" + + business_id: str + """The workflow id or the activity id.""" + + run_id: str | None = None + """A run of the execution. ``None`` means its current run.""" + + @classmethod + def workflow(cls, workflow_id: str, run_id: str | None = None) -> Execution: + """A workflow execution by its id and, optionally, a run.""" + return cls(ExecutionType.WORKFLOW, workflow_id, run_id) + + @classmethod + def activity(cls, activity_id: str, run_id: str | None = None) -> Execution: + """A standalone activity execution by its id and, optionally, a run.""" + return cls(ExecutionType.ACTIVITY, activity_id, run_id) + + def to_proto(self) -> temporalio.api.common.v1.Execution: + """The protobuf form of this execution.""" + return temporalio.api.common.v1.Execution( + type=temporalio.api.enums.v1.ExecutionType.ValueType(int(self.type)), + business_id=self.business_id, + run_id=self.run_id or "", + ) + + @classmethod + def from_proto(cls, proto: temporalio.api.common.v1.Execution) -> Execution: + """The execution a protobuf names. An empty run id becomes ``None``.""" + return cls(ExecutionType(proto.type), proto.business_id, proto.run_id or None) + + class QueryRejectCondition(IntEnum): """Whether a query should be rejected in certain conditions. diff --git a/temporalio/contrib/external_workflow_streams/_wake.py b/temporalio/contrib/external_workflow_streams/_wake.py index d13849af0..993ca2d10 100644 --- a/temporalio/contrib/external_workflow_streams/_wake.py +++ b/temporalio/contrib/external_workflow_streams/_wake.py @@ -39,6 +39,7 @@ import temporalio.api.common.v1 import temporalio.api.notification.v1 import temporalio.api.workflowservice.v1 +import temporalio.common import temporalio.service from temporalio.bridge.proto.external_stream.external_stream_pb2 import WakeSignal from temporalio.contrib.external_workflow_streams._record import Offset @@ -85,33 +86,37 @@ class ChannelAddress: """Where a stream's notifications go. - A channel linked to a workflow lives in that workflow's state and is - addressed by the channel name and the workflow id; the workflow is its - listener by construction. An independent channel is addressed by name - alone and listened on by command. + A channel linked to an execution lives in that execution's state and is + addressed by the channel name and the execution, which is its listener + by construction. An independent channel is addressed by name alone and + listened on by command. """ channel: str """The channel name, see :func:`channel_for`.""" - workflow_id: str = "" - """The workflow the channel is linked to, or empty for an independent channel. + execution: temporalio.common.Execution | None = None + """The execution the channel is linked to, or ``None`` for an independent channel. - The chain's id without a run, so the server resolves the chain's current - run the way it does for a Signal and a continue-as-new successor is - reached by the same address. + A workflow is named by the chain's id without a run, so the server + resolves the chain's current run the way it does for a Signal and a + continue-as-new successor is reached by the same address. """ @property def linked(self) -> bool: - """Whether the channel is linked to a workflow.""" - return bool(self.workflow_id) + """Whether the channel is linked to an execution.""" + return self.execution is not None - def execution(self) -> temporalio.api.common.v1.WorkflowExecution | None: - """The ``workflow_execution`` a channel call carries, or none.""" - if not self.workflow_id: + @property + def workflow_id(self) -> str | None: + """The workflow the channel is linked to, when the owner is one.""" + if ( + self.execution is None + or self.execution.type is not temporalio.common.ExecutionType.WORKFLOW + ): return None - return temporalio.api.common.v1.WorkflowExecution(workflow_id=self.workflow_id) + return self.execution.business_id def channel_for(key: StreamKey) -> ChannelAddress: @@ -140,7 +145,14 @@ def channel_for(key: StreamKey) -> ChannelAddress: key.stream_name, ) ) - return ChannelAddress(channel=channel, workflow_id=key.workflow_id) + return ChannelAddress( + channel=channel, + execution=( + temporalio.common.Execution.workflow(key.workflow_id) + if key.workflow_id + else None + ), + ) WAKE_SIGNAL_NAME = "__temporal_external_stream_wake" @@ -228,8 +240,8 @@ class WakeRequest: transport then wakes by Signal. Not part of the request ID: the ID names the wake, and the channel is only where it is delivered. """ - channel_workflow_id: str = "" - """The workflow the channel is linked to, empty for an independent channel. + channel_execution: temporalio.common.Execution | None = None + """The execution the channel is linked to, ``None`` for an independent channel. Set with ``channel`` for a workflow-owned stream, so the notification addresses the owner's linked channel on a server that has the kind. @@ -238,9 +250,7 @@ class WakeRequest: @property def channel_address(self) -> ChannelAddress: """The channel and its owner as one address.""" - return ChannelAddress( - channel=self.channel, workflow_id=self.channel_workflow_id - ) + return ChannelAddress(channel=self.channel, execution=self.channel_execution) @property def is_unparked(self) -> bool: @@ -451,7 +461,9 @@ async def _describe_probe( namespace=client.namespace, channel=PROBE_CHANNEL ) if workflow_id: - request.workflow_execution.workflow_id = workflow_id + request.execution.CopyFrom( + temporalio.common.Execution.workflow(workflow_id).to_proto() + ) try: return await call(request) except temporalio.service.RPCError as err: @@ -582,8 +594,8 @@ def build_notify_request( identity=identity, request_id=wake_request_id(request), ) - if request.channel_workflow_id: - notify.workflow_execution.workflow_id = request.channel_workflow_id + if request.channel_execution is not None: + notify.execution.CopyFrom(request.channel_execution.to_proto()) return notify @@ -690,5 +702,5 @@ def wake_request_for( position=position, position_counter=position_counter, channel=address.channel, - channel_workflow_id=address.workflow_id, + channel_execution=address.execution, ) diff --git a/temporalio/worker/_workflow.py b/temporalio/worker/_workflow.py index 421b57cd0..9689dd4e7 100644 --- a/temporalio/worker/_workflow.py +++ b/temporalio/worker/_workflow.py @@ -1492,7 +1492,7 @@ async def _send_external_stream_wake(self, subscription: Any) -> None: position=position, position_counter=position_counter, channel=address.channel, - channel_workflow_id=address.workflow_id, + channel_execution=address.execution, ), transport=wake_transport_of(subscription.backend), ) diff --git a/temporalio/workflow/_channels.py b/temporalio/workflow/_channels.py index fbbf6843d..52aa2da19 100644 --- a/temporalio/workflow/_channels.py +++ b/temporalio/workflow/_channels.py @@ -19,6 +19,7 @@ import temporalio.api.common.v1 import temporalio.api.notification.v1 +import temporalio.common from temporalio.workflow._context import _Runtime __all__ = [ @@ -60,8 +61,8 @@ class Notification: converter :py:func:`temporalio.workflow.payload_converter` returns. """ - linked_to: temporalio.api.common.v1.WorkflowExecution | None = None - """The workflow a linked channel belongs to, and the run that received this. + linked_to: temporalio.common.Execution | None = None + """The execution a linked channel belongs to, and the run that received this. ``None`` for a notification from an independent channel. A workflow that holds both kinds of handle on one name gets a notification on the handle @@ -78,7 +79,11 @@ def _from_proto( position=proto.position, counter=proto.counter, metadata=dict(proto.metadata.items()), - linked_to=proto.linked_to if proto.HasField("linked_to") else None, + linked_to=( + temporalio.common.Execution.from_proto(proto.linked_to) + if proto.HasField("linked_to") + else None + ), ) @@ -175,9 +180,10 @@ def linked_channel(channel: str) -> ChannelSubscription: A linked channel lives in this workflow's own state, so the workflow is its listener by construction: no command, no event, and no gate needed - for a new name. A writer reaches it with the workflow id, as in - :py:meth:`temporalio.client.Client.notify_channel` with ``workflow_id``, - and a successor run after continue-as-new is reached by the same calls. + for a new name. A writer reaches it by naming this workflow as the + execution, as in :py:meth:`temporalio.client.Client.notify_channel` with + ``workflow_id``, and a successor run after continue-as-new is reached by + the same calls. A second call for the same name returns the handle already open, and the two share its buffer. The name does not collide with an independent channel's: a notification carrying :attr:`Notification.linked_to` comes diff --git a/tests/contrib/external_workflow_streams/test_channels.py b/tests/contrib/external_workflow_streams/test_channels.py index 420e92193..3466dccce 100644 --- a/tests/contrib/external_workflow_streams/test_channels.py +++ b/tests/contrib/external_workflow_streams/test_channels.py @@ -21,6 +21,7 @@ import pytest import temporalio.api.common.v1 +import temporalio.api.enums.v1 import temporalio.api.notification.v1 import temporalio.api.workflowservice.v1 import temporalio.bridge.proto.workflow_activation @@ -30,7 +31,9 @@ from temporalio import workflow from temporalio.api.enums.v1 import EventType from temporalio.client import Callback, ChannelKind, Client +from temporalio.client._client import _channel_execution from temporalio.client._impl import _channel_owner +from temporalio.common import Execution, ExecutionType from temporalio.contrib.external_workflow_streams._wake import ChannelAddress from temporalio.service import RPCError, RPCStatusCode from temporalio.worker._workflow_instance import ( @@ -51,16 +54,18 @@ temporalio.bridge.proto.workflow_completion.WorkflowActivationCompletion ) Notification = temporalio.api.notification.v1.Notification -WorkflowExecution = temporalio.api.common.v1.WorkflowExecution +ExecutionProto = temporalio.api.common.v1.Execution +WORKFLOW_TYPE = temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_WORKFLOW INDEPENDENT = _WorkflowLogicFlag.SUBSCRIBE_NOTIFICATION_CHANNELS LINKED = _WorkflowLogicFlag.LINKED_NOTIFICATION_CHANNELS -def _linked_to(notification: workflow.Notification) -> dict[str, str] | None: +def _linked_to(notification: workflow.Notification) -> dict[str, Any] | None: if notification.linked_to is None: return None return { - "workflow_id": notification.linked_to.workflow_id, + "type": notification.linked_to.type.name, + "business_id": notification.linked_to.business_id, "run_id": notification.linked_to.run_id, } @@ -156,7 +161,10 @@ class ListenOnStream: async def run(self, channel: str, owner: str) -> bool: instance: Any = _Runtime.current() return instance.subscribe_stream_channel( - ChannelAddress(channel=channel, workflow_id=owner) + ChannelAddress( + channel=channel, + execution=Execution.workflow(owner) if owner else None, + ) ) @@ -329,7 +337,7 @@ def _linked(channel: str, counter: int, run_id: str = "run") -> Notification: return Notification( channel=channel, counter=counter, - linked_to=WorkflowExecution(workflow_id="wf", run_id=run_id), + linked_to=ExecutionProto(type=WORKFLOW_TYPE, business_id="wf", run_id=run_id), ) @@ -342,7 +350,7 @@ async def test_a_linked_channel_issues_no_command_and_gets_its_notification(): assert _result(completion) == { "channel": "orders", "counter": 7, - "linked_to": {"workflow_id": "wf", "run_id": "run"}, + "linked_to": {"type": "WORKFLOW", "business_id": "wf", "run_id": "run"}, } @@ -443,21 +451,39 @@ async def test_a_replay_takes_the_path_the_live_run_recorded(): assert _subscribed(completion) == [] -def test_a_channel_call_names_the_workflow_it_is_linked_to(): - assert _channel_owner(None, None) is None - owner = _channel_owner("wf", None) - assert owner is not None - assert (owner.workflow_id, owner.run_id) == ("wf", "") - owner = _channel_owner("wf", "run") - assert owner is not None - assert (owner.workflow_id, owner.run_id) == ("wf", "run") +def test_a_channel_call_names_the_execution_it_is_linked_to(): + # The short form names a workflow. The long form names any execution. + assert _channel_execution(None, None, None) is None + assert _channel_execution(None, "wf", None) == Execution.workflow("wf") + assert _channel_execution(None, "wf", "run") == Execution.workflow("wf", "run") + activity = Execution.activity("act") + assert _channel_execution(activity, None, None) is activity with pytest.raises(ValueError, match="workflow_id"): - _channel_owner(None, "run") + _channel_execution(None, None, "run") + with pytest.raises(ValueError, match="not both"): + _channel_execution(activity, "wf", None) + with pytest.raises(ValueError, match="not both"): + _channel_execution(activity, None, "run") # Unset, the request addresses the independent channel of that name. request = temporalio.api.workflowservice.v1.DescribeChannelRequest( - channel="c", workflow_execution=_channel_owner(None, None) + channel="c", execution=_channel_owner(None) + ) + assert not request.HasField("execution") + owner = _channel_owner(Execution.workflow("wf")) + assert owner is not None + assert (owner.type, owner.business_id, owner.run_id) == (WORKFLOW_TYPE, "wf", "") + owner = _channel_owner(Execution.workflow("wf", "run")) + assert owner is not None + assert (owner.type, owner.business_id, owner.run_id) == ( + WORKFLOW_TYPE, + "wf", + "run", + ) + assert Execution.from_proto(owner) == Execution.workflow("wf", "run") + assert Execution.from_proto(_channel_owner(activity)) == activity # type: ignore[arg-type] + assert Execution.from_proto(ExecutionProto(business_id="x")) == Execution( + ExecutionType.UNSPECIFIED, "x" ) - assert not request.HasField("workflow_execution") async def test_the_client_describes_a_linked_channel_by_its_owner( @@ -469,7 +495,9 @@ async def describe(request, **kwargs): # type: ignore[no-untyped-def] described.append(request) return temporalio.api.workflowservice.v1.DescribeChannelResponse( kind=temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED, - linked_to=WorkflowExecution(workflow_id="wf", run_id="run"), + linked_to=ExecutionProto( + type=WORKFLOW_TYPE, business_id="wf", run_id="run" + ), latest=_linked("orders", 3), ) @@ -479,13 +507,23 @@ async def describe(request, **kwargs): # type: ignore[no-untyped-def] ) [request] = described assert request.channel == "orders" - assert request.workflow_execution.workflow_id == "wf" - assert request.workflow_execution.run_id == "run" + assert request.execution.type == WORKFLOW_TYPE + assert request.execution.business_id == "wf" + assert request.execution.run_id == "run" assert description.kind is ChannelKind.LINKED - assert description.linked_to is not None - assert description.linked_to.workflow_id == "wf" + assert description.linked_to == Execution.workflow("wf", "run") assert description.latest is not None - assert _linked_to(description.latest) == {"workflow_id": "wf", "run_id": "run"} + assert _linked_to(description.latest) == { + "type": "WORKFLOW", + "business_id": "wf", + "run_id": "run", + } + # The long form carries any execution as given. + activity = Execution.activity("act", "run-2") + await client.describe_channel("orders", execution=activity) + assert Execution.from_proto(described[-1].execution) == activity + with pytest.raises(ValueError, match="not both"): + await client.describe_channel("orders", execution=activity, workflow_id="wf") # A server that predates the kinds reports none. monkeypatch.setattr( client.workflow_service, @@ -528,7 +566,8 @@ async def test_a_workflow_receives_a_notification_on_its_linked_channel(client: description = await client.describe_channel(channel, workflow_id=handle.id) assert description.kind is ChannelKind.LINKED assert description.linked_to is not None - assert description.linked_to.workflow_id == handle.id + assert description.linked_to.type is ExecutionType.WORKFLOW + assert description.linked_to.business_id == handle.id assert description.listeners == [] assert description.latest is None await client.notify_channel( @@ -538,7 +577,8 @@ async def test_a_workflow_receives_a_notification_on_its_linked_channel(client: assert (result["channel"], result["counter"]) == (channel, 1) # The owner and the run that received it, so a listener holding both # kinds under one name can route it. - assert result["linked_to"]["workflow_id"] == handle.id + assert result["linked_to"]["type"] == "WORKFLOW" + assert result["linked_to"]["business_id"] == handle.id assert result["linked_to"]["run_id"] events = [event.event_type async for event in handle.fetch_history_events()] assert ( diff --git a/tests/contrib/external_workflow_streams/test_wake.py b/tests/contrib/external_workflow_streams/test_wake.py index 7f7920e40..c17edf9d8 100644 --- a/tests/contrib/external_workflow_streams/test_wake.py +++ b/tests/contrib/external_workflow_streams/test_wake.py @@ -22,6 +22,7 @@ import pytest import temporalio.api.common.v1 +import temporalio.api.enums.v1 import temporalio.api.notification.v1 import temporalio.api.workflowservice.v1 import temporalio.bridge @@ -30,6 +31,7 @@ from temporalio import workflow from temporalio.bridge.proto.external_stream.external_stream_pb2 import WakeSignal from temporalio.client import Client +from temporalio.common import Execution from temporalio.contrib.external_workflow_streams._backend import ( AppendConflictError, ParkIntent, @@ -1870,17 +1872,20 @@ async def describe_channel(self, request): # type: ignore[no-untyped-def] self.described.append(request) if self.describe_status is not None: raise _rpc_error(self.describe_status) - if self.linked and request.HasField("workflow_execution"): + if self.linked and request.HasField("execution"): return temporalio.api.workflowservice.v1.DescribeChannelResponse( kind=temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED, - linked_to=temporalio.api.common.v1.WorkflowExecution( - workflow_id=request.workflow_execution.workflow_id, run_id="run" + linked_to=temporalio.api.common.v1.Execution( + type=request.execution.type, + business_id=request.execution.business_id, + run_id="run", ), ) return temporalio.api.workflowservice.v1.DescribeChannelResponse() TOKENS_CHANNEL = channel_for(CHAIN.stream_key("tokens")).channel +WORKFLOW_TYPE = temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_WORKFLOW def channel_request(**overrides) -> WakeRequest: # type: ignore[no-untyped-def] @@ -2064,14 +2069,17 @@ def test_the_channel_is_linked_to_the_streams_workflow() -> None: """A stream key names a chain, so its channel is the owner's, by id alone.""" address = channel_for(StreamKey("ns", "wf-1", "first-run-1", "tokens")) - assert address.workflow_id == "wf-1" assert address.linked - execution = address.execution() - assert execution is not None - assert execution.workflow_id == "wf-1" and execution.run_id == "" + # The chain's id without a run, so the current run is the one reached. + assert address.execution == Execution.workflow("wf-1", run_id=None) + assert address.workflow_id == "wf-1" # A channel without an owner is addressed by name alone. independent = ChannelAddress(channel="orders") - assert not independent.linked and independent.execution() is None + assert not independent.linked + assert independent.execution is None and independent.workflow_id is None + # An owner that is not a workflow has no workflow id to give. + owned = ChannelAddress(channel="orders", execution=Execution.activity("act")) + assert owned.linked and owned.workflow_id is None def test_the_channel_tells_the_two_directions_apart() -> None: @@ -2097,7 +2105,7 @@ def test_the_request_composed_for_a_chain_names_its_channel() -> None: ) assert composed.channel == TOKENS_CHANNEL - assert composed.channel_workflow_id == "wf-1" + assert composed.channel_execution == Execution.workflow("wf-1") assert composed.channel_address == channel_for(CHAIN.stream_key("tokens")) @@ -2245,8 +2253,9 @@ async def test_the_probe_finds_the_linked_kind_on_a_running_workflow() -> None: [described] = client.described assert described.namespace == "ns" assert described.channel == PROBE_CHANNEL - assert described.workflow_execution.workflow_id == "wf-1" - assert described.workflow_execution.run_id == "" + assert described.execution.type == WORKFLOW_TYPE + assert described.execution.business_id == "wf-1" + assert described.execution.run_id == "" @pytest.mark.asyncio @@ -2298,8 +2307,9 @@ async def test_a_producer_notifies_the_channel_of_the_stream_it_appended_to() -> [notify] = client.notified assert notify.notification.channel == channel_for(topic.stream_key).channel # The owner rides along, so a server with linked channels delivers to it. - assert notify.workflow_execution.workflow_id == "wf-1" - assert notify.workflow_execution.run_id == "" + assert notify.execution.type == WORKFLOW_TYPE + assert notify.execution.business_id == "wf-1" + assert notify.execution.run_id == "" assert client.sent == [] diff --git a/tests/contrib/external_workflow_streams/test_worker_integration.py b/tests/contrib/external_workflow_streams/test_worker_integration.py index 5fa5bc908..a88c8cc89 100644 --- a/tests/contrib/external_workflow_streams/test_worker_integration.py +++ b/tests/contrib/external_workflow_streams/test_worker_integration.py @@ -1831,7 +1831,9 @@ async def test_an_outside_producer_wakes_the_reader_through_its_linked_channel( notified = _notified(events) assert notified, "no Workflow Task was scheduled with a notification" assert {n.channel for n in notified} == {channel_for(key).channel} - assert {n.linked_to.workflow_id for n in notified} == {handle.id} + assert {(n.linked_to.type, n.linked_to.business_id) for n in notified} == { + (temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_WORKFLOW, handle.id) + } result = await Replayer( workflows=[TimerThenConsumeWorkflow], external_stream_backend=backend From 58baa2ad899f648a41e3acbd0ebad82c58fc49ef Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 17:50:58 -0700 Subject: [PATCH 818/831] Read the linked owner as an execution in the conformance case. The notified scheduled event names the owner as a `temporal.api.common.v1.Execution`, so the case checks the type and the business id through the public helper. --- tests/streams/test_streams_conformance.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/streams/test_streams_conformance.py b/tests/streams/test_streams_conformance.py index d1c54fb17..a5c32adcb 100644 --- a/tests/streams/test_streams_conformance.py +++ b/tests/streams/test_streams_conformance.py @@ -39,7 +39,7 @@ from temporalio import workflow from temporalio.api.common.v1 import Payload from temporalio.client import Client -from temporalio.common import RawValue +from temporalio.common import Execution, ExecutionType, RawValue from temporalio.contrib.external_workflow_streams._wake import ChannelSupport from temporalio.converter import ( DataConverter, @@ -952,7 +952,10 @@ async def test_an_outside_producer_wakes_the_reader_through_its_linked_channel( assert _subscribed(events) == [], "the owner is the listener by construction" notified = _notified(events) assert notified, "no Workflow Task was scheduled with a notification" - assert {n.linked_to.workflow_id for n in notified} == {handle.id} + owners = {Execution.from_proto(n.linked_to) for n in notified} + assert {(owner.type, owner.business_id) for owner in owners} == { + (ExecutionType.WORKFLOW, handle.id) + } assert len({n.channel for n in notified}) == 1 From 7718b1ef273a5d80596a5fa53ee7e881cc4c8617 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 17:54:26 -0700 Subject: [PATCH 819/831] Read the linked owner as an execution in the Redis replay case. The notified scheduled event names the owner as a `temporal.api.common.v1.Execution`, so the case checks the type and the business id through the public helper. --- tests/streams/test_redis_replay.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/streams/test_redis_replay.py b/tests/streams/test_redis_replay.py index 647b2e820..9d078a712 100644 --- a/tests/streams/test_redis_replay.py +++ b/tests/streams/test_redis_replay.py @@ -23,6 +23,7 @@ from temporalio import workflow from temporalio.client import Client +from temporalio.common import Execution, ExecutionType from temporalio.contrib.external_workflow_streams import ( RecordKind as TransportRecordKind, ) @@ -1314,7 +1315,10 @@ async def test_an_outside_producer_wakes_the_reader_through_its_linked_channel( for e in events if e.HasField("workflow_execution_started_event_attributes") } or {""} - assert {n.linked_to.workflow_id for n in notified} == {workflow_id} + owners = {Execution.from_proto(n.linked_to) for n in notified} + assert {(owner.type, owner.business_id) for owner in owners} == { + (ExecutionType.WORKFLOW, workflow_id) + } async def _consume_three_through_the_channel(live_client: Client) -> list[Any]: From d6b39adaa6ac35d58eef8b003dab3f0108800e06 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 17:56:13 -0700 Subject: [PATCH 820/831] Addressed a linked channel by execution on the client. A standalone activity can own a channel too, so `temporalio.common.Execution` names the owner of a linked channel, the five channel calls take it, and `workflow_id` with `run_id` stays as the shorthand for a workflow owner. `stream_channel` names a standalone activity's channel as `stream/` linked to the activity execution. --- temporalio/client/_channel.py | 55 ++++++++++---- temporalio/client/_client.py | 78 ++++++++++++-------- temporalio/client/_impl.py | 50 +++++++++---- temporalio/client/_interceptor.py | 5 ++ temporalio/common.py | 58 +++++++++++++++ temporalio/workflow/_channels.py | 11 ++- tests/streams/conftest.py | 7 ++ tests/streams/test_channels.py | 117 ++++++++++++++++++++++++------ 8 files changed, 298 insertions(+), 83 deletions(-) diff --git a/temporalio/client/_channel.py b/temporalio/client/_channel.py index 5ae2d3371..f3996bd8e 100644 --- a/temporalio/client/_channel.py +++ b/temporalio/client/_channel.py @@ -7,9 +7,9 @@ from datetime import datetime, timezone from enum import IntEnum -import temporalio.api.common.v1 import temporalio.api.notification.v1 import temporalio.api.workflow.v1 +import temporalio.common from temporalio.streams._ref import StreamRef from temporalio.workflow import Notification @@ -49,10 +49,11 @@ class ChannelKind(IntEnum): """ LINKED = int(temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED) - """Kept in one workflow's state, keyed by namespace, workflow id and name. + """Kept in one execution's state, keyed by namespace, execution and name. - The owning workflow is its listener by construction; a call reaches it - with the ``workflow_id`` argument. + The owning execution, a workflow or a standalone activity, is its listener + by construction. A call reaches it with the ``execution`` argument, or + with ``workflow_id`` when the owner is a workflow. """ @@ -127,7 +128,7 @@ class ChannelDescription: listeners and nothing retained for a name nobody has notified yet. """ - linked_to: temporalio.api.common.v1.WorkflowExecution | None = None + linked_to: temporalio.common.Execution | None = None """The owner of a linked channel and the run that holds it. ``None`` for an independent channel. @@ -210,13 +211,27 @@ class ChannelAddress: channel: str """The channel name.""" - workflow_id: str | None - """The workflow the channel is linked to, or ``None`` for an independent one. + execution: temporalio.common.Execution | None + """The execution the channel is linked to, or ``None`` for an independent one. Pass both to :py:meth:`temporalio.client.Client.poll_channel` and the - other channel calls as ``channel`` and ``workflow_id``. + other channel calls as ``channel`` and ``execution``. """ + @property + def workflow_id(self) -> str | None: + """The owning workflow's id, when the owner is a workflow. + + ``None`` for an independent channel and for one a standalone activity + owns, which only ``execution`` reaches. + """ + if ( + self.execution is not None + and self.execution.type == temporalio.common.ExecutionType.WORKFLOW + ): + return self.execution.business_id + return None + def stream_channel(ref: StreamRef) -> ChannelAddress: """The channel a native stream notifies on every append and on its close. @@ -225,11 +240,12 @@ def stream_channel(ref: StreamRef) -> ChannelAddress: derives the same one, so a client polls or registers a callback without asking. A stream a workflow owns notifies ``stream/`` linked to the owning workflow. A stream an activity owns notifies - ``stream//``, linked to the workflow that scheduled - the activity, or independent for a standalone activity, which has no - linked channels of its own. A standalone stream notifies the independent - channel ``stream/``, whatever the topic, since its topics share - one stream on the server. + ``stream//`` linked to the workflow that scheduled + the activity, or ``stream/`` linked to the activity execution + itself when the activity is a standalone one. A standalone stream notifies + the independent channel ``stream/``, whatever the topic, since + its topics share one stream on the server. The address names the owner + without a run, so it reaches the owner's current run. Each change arrives as one notification: the stream's change sequence as the counter, the head after the change as the position, and ``closed`` @@ -237,11 +253,20 @@ def stream_channel(ref: StreamRef) -> ChannelAddress: """ if ref.kind == "workflow": assert ref.workflow_id is not None - return ChannelAddress(STREAM_CHANNEL_PREFIX + ref.topic, ref.workflow_id) + return ChannelAddress( + STREAM_CHANNEL_PREFIX + ref.topic, + temporalio.common.Execution.workflow(ref.workflow_id), + ) if ref.kind == "activity": assert ref.activity_id is not None + if not ref.workflow_id: + return ChannelAddress( + STREAM_CHANNEL_PREFIX + ref.topic, + temporalio.common.Execution.activity(ref.activity_id), + ) return ChannelAddress( - f"{STREAM_CHANNEL_PREFIX}{ref.activity_id}/{ref.topic}", ref.workflow_id + f"{STREAM_CHANNEL_PREFIX}{ref.activity_id}/{ref.topic}", + temporalio.common.Execution.workflow(ref.workflow_id), ) assert ref.stream_id is not None return ChannelAddress(STREAM_CHANNEL_PREFIX + ref.stream_id, None) diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index f8725afcc..29de96098 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -2862,6 +2862,7 @@ async def notify_channel( position: bytes = b"", counter: int = 0, metadata: Mapping[str, Any] | None = None, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -2880,18 +2881,20 @@ async def notify_channel( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. + execution when one is given. position: Where the source stands after the write, in the writer's own terms. Opaque to the server. counter: Orders notifications from this channel's writers. Derive it from ``position``, since only the source can order its positions. metadata: Details for the listener, such as which topic moved. Each value is encoded with the client's data converter. - workflow_id: Address the channel linked to this workflow instead of - the independent channel of that name. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run, as a Signal does. Unset means the - current run under the workflow id. + execution: Address the channel linked to this execution, a workflow + or a standalone activity, instead of the independent channel of + that name. Without a run id the call reaches the current run of + a workflow chain, as a Signal does. + workflow_id: Shorthand for ``execution`` naming a workflow. Not + with ``execution``. + run_id: With ``workflow_id``, the run of its chain to address. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -2909,6 +2912,7 @@ async def notify_channel( rpc_timeout=rpc_timeout, workflow_id=workflow_id, run_id=run_id, + execution=execution, ) ) @@ -2919,6 +2923,7 @@ async def poll_channel( after_counter: int = 0, wait: bool | timedelta = True, max_notifications: int = 100, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -2931,17 +2936,20 @@ async def poll_channel( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. + execution when one is given. after_counter: Only notifications with a counter above this one are returned. Pass the highest counter seen so far to page. wait: How long the server holds the call when nothing is retained above ``after_counter``. ``True`` waits up to :py:data:`DEFAULT_CHANNEL_POLL_WAIT`, ``False`` returns at once. max_notifications: Upper bound on the notifications returned. - workflow_id: Address the channel linked to this workflow instead of - the independent channel of that name. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run. + execution: Address the channel linked to this execution, a workflow + or a standalone activity, instead of the independent channel of + that name. Without a run id the call reaches the current run of + a workflow chain. + workflow_id: Shorthand for ``execution`` naming a workflow. Not + with ``execution``. + run_id: With ``workflow_id``, the run of its chain to address. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -2965,6 +2973,7 @@ async def poll_channel( rpc_timeout=rpc_timeout, workflow_id=workflow_id, run_id=run_id, + execution=execution, ) ) @@ -2972,6 +2981,7 @@ async def describe_channel( self, channel: str, *, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -2984,14 +2994,16 @@ async def describe_channel( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. - workflow_id: Describe the channel linked to this workflow instead - of the independent channel of that name. A linked channel of a - running workflow exists by construction, so the answer for a - name nobody has notified yet is a linked channel with no - listeners and nothing retained, not a not-found error. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run. + execution when one is given. + execution: Describe the channel linked to this execution, a + workflow or a standalone activity, instead of the independent + channel of that name. A linked channel of a running execution + exists by construction, so the answer for a name nobody has + notified yet is a linked channel with no listeners and nothing + retained, not a not-found error. + workflow_id: Shorthand for ``execution`` naming a workflow. Not + with ``execution``. + run_id: With ``workflow_id``, the run of its chain to address. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3003,6 +3015,7 @@ async def describe_channel( rpc_timeout=rpc_timeout, workflow_id=workflow_id, run_id=run_id, + execution=execution, ) ) @@ -3011,6 +3024,7 @@ async def register_channel_listener( channel: str, callback: Callback, *, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -3026,13 +3040,15 @@ async def register_channel_listener( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. + execution when one is given. callback: The callback to invoke. - workflow_id: Listen on the channel linked to this workflow instead - of the independent channel of that name. The listener lives in - that workflow's state and ends with its run. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run. + execution: Listen on the channel linked to this execution, a + workflow or a standalone activity, instead of the independent + channel of that name. The listener lives in that execution's + state and ends with its run. + workflow_id: Shorthand for ``execution`` naming a workflow. Not + with ``execution``. + run_id: With ``workflow_id``, the run of its chain to address. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3048,6 +3064,7 @@ async def register_channel_listener( rpc_timeout=rpc_timeout, workflow_id=workflow_id, run_id=run_id, + execution=execution, ) ) @@ -3056,6 +3073,7 @@ async def unregister_channel_listener( channel: str, listener_id: str, *, + execution: temporalio.common.Execution | None = None, workflow_id: str | None = None, run_id: str | None = None, rpc_metadata: Mapping[str, str | bytes] = {}, @@ -3068,12 +3086,13 @@ async def unregister_channel_listener( Args: channel: Name of the channel. Scoped to the namespace, or to the - workflow when ``workflow_id`` is given. + execution when one is given. listener_id: The id :py:meth:`register_channel_listener` returned. - workflow_id: The workflow whose linked channel the listener is on, + execution: The execution whose linked channel the listener is on, when it was registered with one. - run_id: With ``workflow_id``, a run of its chain; the call reaches - the chain's current run. + workflow_id: Shorthand for ``execution`` naming a workflow. Not + with ``execution``. + run_id: With ``workflow_id``, the run of its chain to address. rpc_metadata: Headers used on the RPC call. Keys here override client-level RPC metadata keys. rpc_timeout: Optional RPC deadline to set for the RPC call. @@ -3086,6 +3105,7 @@ async def unregister_channel_listener( rpc_timeout=rpc_timeout, workflow_id=workflow_id, run_id=run_id, + execution=execution, ) ) diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index d29838195..f21b7df54 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -1787,7 +1787,9 @@ async def notify_channel(self, input: NotifyChannelInput) -> int: notification=notification, identity=self._client.identity, request_id=str(uuid.uuid4()), - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner( + input.execution, input.workflow_id, input.run_id + ), ), retry=True, metadata=input.rpc_metadata, @@ -1803,7 +1805,7 @@ async def poll_channel( channel=input.channel, after_counter=input.after_counter, max_notifications=input.max_notifications, - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner(input.execution, input.workflow_id, input.run_id), ) if input.wait is not None: req.wait.FromTimedelta(input.wait) @@ -1817,7 +1819,9 @@ async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescript temporalio.api.workflowservice.v1.DescribeChannelRequest( namespace=self._client.namespace, channel=input.channel, - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner( + input.execution, input.workflow_id, input.run_id + ), ), retry=True, metadata=input.rpc_metadata, @@ -1834,7 +1838,11 @@ async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescript ), retained_count=resp.retained_count, kind=ChannelKind(resp.kind), - linked_to=resp.linked_to if resp.HasField("linked_to") else None, + linked_to=( + temporalio.common.Execution.from_proto(resp.linked_to) + if resp.HasField("linked_to") + else None + ), ) async def register_channel_listener( @@ -1851,7 +1859,9 @@ async def register_channel_listener( ), request_id=str(uuid.uuid4()), identity=self._client.identity, - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner( + input.execution, input.workflow_id, input.run_id + ), ), retry=True, metadata=input.rpc_metadata, @@ -1868,7 +1878,9 @@ async def unregister_channel_listener( channel=input.channel, listener_id=input.listener_id, identity=self._client.identity, - workflow_execution=_channel_owner(input.workflow_id, input.run_id), + execution=_channel_owner( + input.execution, input.workflow_id, input.run_id + ), ), retry=True, metadata=input.rpc_metadata, @@ -1892,7 +1904,11 @@ async def _notification_from_proto( position=proto.position, counter=proto.counter, metadata=metadata, - linked_to=proto.linked_to if proto.HasField("linked_to") else None, + linked_to=( + temporalio.common.Execution.from_proto(proto.linked_to) + if proto.HasField("linked_to") + else None + ), ) async def _apply_headers( @@ -1910,13 +1926,21 @@ async def _apply_headers( def _channel_owner( - workflow_id: str | None, run_id: str | None -) -> temporalio.api.common.v1.WorkflowExecution | None: - """The workflow a channel call addresses, or ``None`` for an independent channel.""" + execution: temporalio.common.Execution | None, + workflow_id: str | None, + run_id: str | None, +) -> temporalio.api.common.v1.Execution | None: + """The execution a channel call addresses, or ``None`` for an independent channel. + + ``workflow_id`` and ``run_id`` are the shorthand for a workflow owner, so + they do not combine with ``execution``. + """ + if execution is not None: + if workflow_id is not None or run_id is not None: + raise ValueError("pass execution or workflow_id, not both") + return execution.to_proto() if workflow_id is None: if run_id is not None: raise ValueError("run_id needs workflow_id") return None - return temporalio.api.common.v1.WorkflowExecution( - workflow_id=workflow_id, run_id=run_id or "" - ) + return temporalio.common.Execution.workflow(workflow_id, run_id).to_proto() diff --git a/temporalio/client/_interceptor.py b/temporalio/client/_interceptor.py index 78fa1b6d9..b0282fe38 100644 --- a/temporalio/client/_interceptor.py +++ b/temporalio/client/_interceptor.py @@ -718,6 +718,7 @@ class NotifyChannelInput: rpc_timeout: timedelta | None workflow_id: str | None = None run_id: str | None = None + execution: temporalio.common.Execution | None = None @dataclass @@ -736,6 +737,7 @@ class PollChannelInput: rpc_timeout: timedelta | None workflow_id: str | None = None run_id: str | None = None + execution: temporalio.common.Execution | None = None @dataclass @@ -751,6 +753,7 @@ class DescribeChannelInput: rpc_timeout: timedelta | None workflow_id: str | None = None run_id: str | None = None + execution: temporalio.common.Execution | None = None @dataclass @@ -767,6 +770,7 @@ class RegisterChannelListenerInput: rpc_timeout: timedelta | None workflow_id: str | None = None run_id: str | None = None + execution: temporalio.common.Execution | None = None @dataclass @@ -783,6 +787,7 @@ class UnregisterChannelListenerInput: rpc_timeout: timedelta | None workflow_id: str | None = None run_id: str | None = None + execution: temporalio.common.Execution | None = None @dataclass diff --git a/temporalio/common.py b/temporalio/common.py index 04081bf19..cf126ff95 100644 --- a/temporalio/common.py +++ b/temporalio/common.py @@ -18,6 +18,7 @@ Generic, TypeAlias, TypeVar, + cast, get_origin, get_type_hints, overload, @@ -108,6 +109,63 @@ def _validate(self) -> None: raise ValueError("Maximum attempts cannot be negative") +class ExecutionType(IntEnum): + """What kind of execution an :class:`Execution` names. + + .. warning:: + This API is experimental and unstable. + """ + + UNSPECIFIED = int(temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_UNSPECIFIED) + WORKFLOW = int(temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_WORKFLOW) + ACTIVITY = int(temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_ACTIVITY) + """A standalone activity, one started by a client rather than a workflow.""" + + +@dataclass(frozen=True) +class Execution: + """One execution in a namespace: a workflow or a standalone activity. + + ``business_id`` is the id the caller chose, the workflow id or the + activity id. ``run_id`` pins one run of it. Unset, a call reaches the + current run of a workflow chain, as a Signal does. + + .. warning:: + This API is experimental and unstable. + """ + + type: ExecutionType + business_id: str + run_id: str | None = None + + @classmethod + def workflow(cls, workflow_id: str, run_id: str | None = None) -> Execution: + """A workflow execution.""" + return cls(ExecutionType.WORKFLOW, workflow_id, run_id) + + @classmethod + def activity(cls, activity_id: str, run_id: str | None = None) -> Execution: + """A standalone activity execution.""" + return cls(ExecutionType.ACTIVITY, activity_id, run_id) + + def to_proto(self) -> temporalio.api.common.v1.Execution: + """This execution as the API names it.""" + return temporalio.api.common.v1.Execution( + type=cast( + "temporalio.api.enums.v1.ExecutionType.ValueType", int(self.type) + ), + business_id=self.business_id, + run_id=self.run_id or "", + ) + + @staticmethod + def from_proto(proto: temporalio.api.common.v1.Execution) -> Execution: + """From the API's form. An empty run id reads as unset.""" + return Execution( + ExecutionType(proto.type), proto.business_id, proto.run_id or None + ) + + class WorkflowIDReusePolicy(IntEnum): """How already-in-use workflow IDs are handled on start. diff --git a/temporalio/workflow/_channels.py b/temporalio/workflow/_channels.py index 04d6fb836..929f99b2d 100644 --- a/temporalio/workflow/_channels.py +++ b/temporalio/workflow/_channels.py @@ -19,6 +19,7 @@ import temporalio.api.common.v1 import temporalio.api.notification.v1 +import temporalio.common from temporalio.workflow._context import _Runtime __all__ = [ @@ -60,8 +61,8 @@ class Notification: converter :py:func:`temporalio.workflow.payload_converter` returns. """ - linked_to: temporalio.api.common.v1.WorkflowExecution | None = None - """The workflow a linked channel belongs to, and the run that received this. + linked_to: temporalio.common.Execution | None = None + """The execution a linked channel belongs to, and the run that received this. ``None`` for a notification from an independent channel. A workflow that holds both kinds of handle on one name gets a notification on the handle @@ -78,7 +79,11 @@ def _from_proto( position=proto.position, counter=proto.counter, metadata=dict(proto.metadata.items()), - linked_to=proto.linked_to if proto.HasField("linked_to") else None, + linked_to=( + temporalio.common.Execution.from_proto(proto.linked_to) + if proto.HasField("linked_to") + else None + ), ) diff --git a/tests/streams/conftest.py b/tests/streams/conftest.py index 8af40d565..049fa2da1 100644 --- a/tests/streams/conftest.py +++ b/tests/streams/conftest.py @@ -73,6 +73,12 @@ def pytest_configure(config: pytest.Config) -> None: "needs_stream_channel_server: the case needs a server on which a native " "stream notifies the channel named by the stream, named with -E host:port", ) + config.addinivalue_line( + "markers", + "needs_execution_server: the case needs a server that addresses a linked " + "channel by execution, a standalone activity's included, named with " + "-E host:port", + ) def pytest_collection_modifyitems( @@ -127,6 +133,7 @@ def pytest_collection_modifyitems( ("needs_describe_server", "lists channel subscriptions on describe"), ("needs_unsubscribe_server", "accepts the unsubscribe command"), ("needs_stream_channel_server", "notifies a stream's channel"), + ("needs_execution_server", "addresses a linked channel by execution"), ): skips.append( ( diff --git a/tests/streams/test_channels.py b/tests/streams/test_channels.py index c41ac75dc..afcdc4a44 100644 --- a/tests/streams/test_channels.py +++ b/tests/streams/test_channels.py @@ -127,7 +127,7 @@ def _describe(notification: workflow.Notification) -> dict[str, Any]: else None ), "owner": ( - notification.linked_to.workflow_id if notification.linked_to else None + notification.linked_to.business_id if notification.linked_to else None ), "owner_run": notification.linked_to.run_id if notification.linked_to else None, } @@ -336,9 +336,7 @@ def _linked(channel: str, counter: int, position: bytes = b"") -> Notification: channel=channel, counter=counter, position=position, - linked_to=temporalio.api.common.v1.WorkflowExecution( - workflow_id="wf", run_id="run" - ), + linked_to=temporalio.common.Execution.workflow("wf", "run").to_proto(), ) @@ -557,24 +555,32 @@ async def test_a_subscription_after_an_unsubscribe_is_a_new_one(): async def test_a_stream_names_the_channel_it_notifies(): + owner = temporalio.common.Execution.workflow("wf") assert stream_channel(StreamRef.for_workflow("wf", topic="out")) == ChannelAddress( - "stream/out", "wf" + "stream/out", owner ) + # The address names the owner without a run, so it follows the chain. assert stream_channel(StreamRef.for_workflow("wf", run_id="run")) == ChannelAddress( - "stream/" + DEFAULT_TOPIC, "wf" + "stream/" + DEFAULT_TOPIC, owner ) assert stream_channel( StreamRef.for_activity("act", workflow_id="wf", topic="out") - ) == ChannelAddress("stream/act/out", "wf") - # A standalone activity is an execution of its own with no linked channels. + ) == ChannelAddress("stream/act/out", owner) + # A standalone activity is an execution of its own, so its stream's + # channel is linked to it under the topic's name alone. assert stream_channel(StreamRef.for_activity("act", topic="out")) == ChannelAddress( - "stream/act/out", None + "stream/out", temporalio.common.Execution.activity("act") ) # A standalone stream's topics share one stream on the server, so the # topic is not part of the name. assert stream_channel( StreamRef.for_standalone("sid", topic="out") ) == ChannelAddress("stream/sid", None) + # The workflow id stays readable for a caller that addresses by it, and + # only names a workflow. + assert stream_channel(StreamRef.for_workflow("wf")).workflow_id == "wf" + assert stream_channel(StreamRef.for_activity("act")).workflow_id is None + assert stream_channel(StreamRef.for_standalone("sid")).workflow_id is None async def test_the_description_maps_every_channel_subscription_field(): @@ -646,15 +652,15 @@ async def test_the_description_maps_every_channel_subscription_field(): assert description.channel_subscriptions == () -async def test_the_client_addresses_a_linked_channel_by_workflow( +async def test_the_client_addresses_a_linked_channel_by_execution( client: Client, monkeypatch: pytest.MonkeyPatch ): """Every channel call carries the owner it was given, and only then.""" requests: list[Any] = [] - owner = temporalio.api.common.v1.WorkflowExecution(workflow_id="wf", run_id="run") + owner = temporalio.common.Execution.workflow("wf", "run") describe_response = temporalio.api.workflowservice.v1.DescribeChannelResponse( kind=temporalio.api.notification.v1.ChannelKind.CHANNEL_KIND_LINKED, - linked_to=owner, + linked_to=owner.to_proto(), latest=_linked("orders", 3, b"3-0"), ) responses = { @@ -686,18 +692,33 @@ async def call(req: Any, *, _response: Any = response, **_: Any) -> Any: description = await client.describe_channel("orders", workflow_id="wf") await client.register_channel_listener("orders", callback, workflow_id="wf") await client.unregister_channel_listener("orders", "listener", workflow_id="wf") - assert [req.workflow_execution for req in requests] == [ - owner, - temporalio.api.common.v1.WorkflowExecution(workflow_id="wf"), - temporalio.api.common.v1.WorkflowExecution(workflow_id="wf"), - temporalio.api.common.v1.WorkflowExecution(workflow_id="wf"), - temporalio.api.common.v1.WorkflowExecution(workflow_id="wf"), + # The workflow id is shorthand for a workflow execution, run id and all. + by_workflow_id = temporalio.common.Execution.workflow("wf").to_proto() + assert [req.execution for req in requests] == [ + owner.to_proto(), + by_workflow_id, + by_workflow_id, + by_workflow_id, + by_workflow_id, ] assert polled.linked_to == owner assert description.kind == ChannelKind.LINKED assert description.linked_to == owner assert description.latest is not None and description.latest.linked_to == owner + # An execution names any owner, a standalone activity included. + requests.clear() + activity = temporalio.common.Execution.activity("act", "run") + await client.notify_channel("orders", counter=1, execution=activity) + await client.poll_channel("orders", execution=activity, wait=False) + await client.describe_channel("orders", execution=activity) + await client.register_channel_listener("orders", callback, execution=activity) + await client.unregister_channel_listener("orders", "listener", execution=activity) + assert [req.execution for req in requests] == [activity.to_proto()] * 5 + assert activity.to_proto().type == ( + temporalio.api.enums.v1.ExecutionType.EXECUTION_TYPE_ACTIVITY + ) + # Without an owner the calls address the independent channel. requests.clear() await client.notify_channel("orders", counter=1) @@ -705,10 +726,17 @@ async def call(req: Any, *, _response: Any = response, **_: Any) -> Any: await client.describe_channel("orders") await client.register_channel_listener("orders", callback) await client.unregister_channel_listener("orders", "listener") - assert [req.HasField("workflow_execution") for req in requests] == [False] * 5 + assert [req.HasField("execution") for req in requests] == [False] * 5 with pytest.raises(ValueError, match="run_id needs workflow_id"): await client.notify_channel("orders", counter=1, run_id="run") + # The shorthand and the execution are two ways to say one thing. + with pytest.raises(ValueError, match="not both"): + await client.notify_channel( + "orders", counter=1, execution=activity, workflow_id="wf" + ) + with pytest.raises(ValueError, match="not both"): + await client.poll_channel("orders", execution=activity, run_id="run") @pytest.mark.needs_channel_server @@ -878,7 +906,7 @@ async def test_a_workflow_receives_a_notification_on_its_linked_channel( assert description.latest is None assert description.retained_count == 0 assert description.linked_to is not None - assert description.linked_to.workflow_id == handle.id + assert description.linked_to.business_id == handle.id # The owner is the one listener. listeners = await client.notify_channel( channel, @@ -924,7 +952,7 @@ async def test_a_linked_channel_lives_and_dies_with_its_workflow(client: Client) assert (description.listeners, description.latest) == ([], None) assert description.retained_count == 0 assert description.linked_to is not None - assert (description.linked_to.workflow_id, description.linked_to.run_id) == ( + assert (description.linked_to.business_id, description.linked_to.run_id) == ( handle.id, run_id, ) @@ -958,6 +986,49 @@ async def test_a_linked_channel_lives_and_dies_with_its_workflow(client: Client) assert closed.value.status == RPCStatusCode.NOT_FOUND +@pytest.mark.needs_linked_server +@pytest.mark.needs_execution_server +async def test_a_linked_channel_names_its_owner_as_an_execution(client: Client): + """The client side alone: the owner comes back typed, by either spelling.""" + channel = f"orders-{uuid.uuid4()}" + handle = await client.start_workflow( + CountLinked.run, + channel, + id=f"wf-{uuid.uuid4()}", + task_queue=f"nobody-polls-{uuid.uuid4()}", + ) + run_id = handle.first_execution_run_id + assert run_id is not None + by_id = temporalio.common.Execution.workflow(handle.id) + by_run = temporalio.common.Execution.workflow(handle.id, run_id) + try: + description = await client.describe_channel(channel, execution=by_id) + assert description.kind == ChannelKind.LINKED + assert description.linked_to is not None + assert description.linked_to == by_run + assert description.linked_to.type is temporalio.common.ExecutionType.WORKFLOW + # The execution and the workflow id shorthand reach one channel. + assert ( + await client.notify_channel( + channel, position=b"1-0", counter=1, execution=by_id + ) + == 1 + ) + [polled] = await client.poll_channel(channel, workflow_id=handle.id, wait=False) + assert (polled.counter, polled.linked_to) == (1, by_run) + [polled] = await client.poll_channel(channel, execution=by_run, wait=False) + assert polled.counter == 1 + # The same id as an activity names an execution that never ran. + with pytest.raises(RPCError) as missing: + await client.describe_channel( + channel, execution=temporalio.common.Execution.activity(handle.id) + ) + assert missing.value.status == RPCStatusCode.NOT_FOUND + finally: + with contextlib.suppress(RPCError): + await handle.terminate() + + @pytest.mark.needs_linked_server @pytest.mark.needs_linked_core async def test_a_linked_channel_is_polled_by_workflow_id(client: Client): @@ -980,7 +1051,7 @@ async def test_a_linked_channel_is_polled_by_workflow_id(client: Client): polled = await client.poll_channel(channel, workflow_id=handle.id, wait=False) assert [(n.position, n.counter) for n in polled] == [(b"1-0", 1)] assert polled[0].linked_to is not None - assert polled[0].linked_to.workflow_id == handle.id + assert polled[0].linked_to.business_id == handle.id # The run id reaches the same channel. assert [ n.counter @@ -1122,7 +1193,7 @@ async def test_a_description_lists_a_linked_channel_once_it_holds_state( assert info.pending_notification is not None assert info.pending_notification.counter == 1 assert info.pending_notification.linked_to is not None - assert info.pending_notification.linked_to.workflow_id == handle.id + assert info.pending_notification.linked_to.business_id == handle.id assert info.scheduled_counter == 0 assert (info.listener_count, info.retained_count, info.accepted_count) == ( 0, From 75165681a3fb50b3883717918b8f8f27cb086a07 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 17:58:21 -0700 Subject: [PATCH 821/831] Pinned the delivery Core with a linked channel addressed by execution. The core-3 head carries the api change: the five channel requests and both `linked_to` fields take `common.v1.Execution`, so a notification names a standalone activity owner as well as a workflow. --- .../v1/request_response_pb2.py | 1165 +++++++++-------- temporalio/bridge/sdk-core | 2 +- 2 files changed, 585 insertions(+), 582 deletions(-) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index b77db53a7..53bf8766b 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.nexusoperation.v1 import ( + message_pb2 as temporal_dot_api_dot_nexusoperation_dot_v1_dot_message__pb2, +) from temporalio.api.notification.v1 import ( message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, ) @@ -137,7 +140,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe1\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xee\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xbd\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"#\n!UnregisterChannelListenerResponse"\xe3\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x8c\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x04 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x03\x10\x04R\x12workflow_execution"\xa4\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe1\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xee\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xbd\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"#\n!UnregisterChannelListenerResponse"\xe3\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x8c\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x04 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x03\x10\x04R\x12workflow_execution"\xa4\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4348,598 +4351,598 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1728 - _REGISTERNAMESPACEREQUEST._serialized_end = 2376 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2333 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2376 - _REGISTERNAMESPACERESPONSE._serialized_start = 2378 - _REGISTERNAMESPACERESPONSE._serialized_end = 2405 - _LISTNAMESPACESREQUEST._serialized_start = 2408 - _LISTNAMESPACESREQUEST._serialized_end = 2545 - _LISTNAMESPACESRESPONSE._serialized_start = 2548 - _LISTNAMESPACESRESPONSE._serialized_end = 2677 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2679 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2762 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2765 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3278 - _UPDATENAMESPACEREQUEST._serialized_start = 3281 - _UPDATENAMESPACEREQUEST._serialized_end = 3616 - _UPDATENAMESPACERESPONSE._serialized_start = 3619 - _UPDATENAMESPACERESPONSE._serialized_end = 3910 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3912 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3982 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3984 - _DEPRECATENAMESPACERESPONSE._serialized_end = 4012 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4015 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5632 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5635 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5933 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5936 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6234 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6237 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6423 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6426 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6602 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6604 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6724 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8323 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8233 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8317 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8326 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9498 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9593 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9595 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9667 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9912 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9915 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10440 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10442 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10477 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10480 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10966 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10969 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12150 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12153 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12318 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12320 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12432 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12435 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12642 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12644 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12760 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12763 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13145 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13147 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13185 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13188 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13395 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13397 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13439 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13442 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13888 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13890 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13977 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13980 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14251 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14253 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14344 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14347 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14729 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14731 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14768 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14771 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15059 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15061 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15102 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15105 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15365 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15367 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15407 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15410 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15760 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 - _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16067 - _NOTIFYCHANNELRESPONSE._serialized_start = 16069 - _NOTIFYCHANNELRESPONSE._serialized_end = 16116 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16119 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16357 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16359 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16413 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16416 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16605 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16607 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16642 - _POLLCHANNELREQUEST._serialized_start = 16645 - _POLLCHANNELREQUEST._serialized_end = 16872 - _POLLCHANNELRESPONSE._serialized_start = 16874 - _POLLCHANNELRESPONSE._serialized_end = 16962 - _DESCRIBECHANNELREQUEST._serialized_start = 16965 - _DESCRIBECHANNELREQUEST._serialized_end = 17105 - _DESCRIBECHANNELRESPONSE._serialized_start = 17108 - _DESCRIBECHANNELRESPONSE._serialized_end = 17400 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17403 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18742 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18745 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18903 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18906 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19355 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19357 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19405 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19408 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19695 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19697 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19733 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19735 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19857 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19859 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19892 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19895 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20224 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20227 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20357 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20360 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20754 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20757 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20889 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20891 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21000 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21002 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21128 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21130 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21247 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21250 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21384 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21386 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21495 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21497 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21623 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21625 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21691 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21694 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21931 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21933 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21961 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21964 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22165 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22081 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22165 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22168 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22529 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22531 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22566 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22568 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22678 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22680 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22710 - _SHUTDOWNWORKERREQUEST._serialized_start = 22713 - _SHUTDOWNWORKERREQUEST._serialized_end = 22996 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22998 - _SHUTDOWNWORKERRESPONSE._serialized_end = 23022 - _QUERYWORKFLOWREQUEST._serialized_start = 23025 - _QUERYWORKFLOWREQUEST._serialized_end = 23258 - _QUERYWORKFLOWRESPONSE._serialized_start = 23261 - _QUERYWORKFLOWRESPONSE._serialized_end = 23446 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23448 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23563 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23566 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24313 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24316 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24844 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24847 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25851 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25633 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25749 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25751 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25851 - _GETCLUSTERINFOREQUEST._serialized_start = 25853 - _GETCLUSTERINFOREQUEST._serialized_end = 25876 - _GETCLUSTERINFORESPONSE._serialized_start = 25879 - _GETCLUSTERINFORESPONSE._serialized_end = 26344 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26289 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26344 - _GETSYSTEMINFOREQUEST._serialized_start = 26346 - _GETSYSTEMINFOREQUEST._serialized_end = 26368 - _GETSYSTEMINFORESPONSE._serialized_start = 26371 - _GETSYSTEMINFORESPONSE._serialized_end = 26948 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26512 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26948 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26950 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27059 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27062 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27285 - _CREATESCHEDULEREQUEST._serialized_start = 27288 - _CREATESCHEDULEREQUEST._serialized_end = 27620 - _CREATESCHEDULERESPONSE._serialized_start = 27622 - _CREATESCHEDULERESPONSE._serialized_end = 27670 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27672 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27737 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27740 - _DESCRIBESCHEDULERESPONSE._serialized_end = 28011 - _UPDATESCHEDULEREQUEST._serialized_start = 28014 - _UPDATESCHEDULEREQUEST._serialized_end = 28306 - _UPDATESCHEDULERESPONSE._serialized_start = 28308 - _UPDATESCHEDULERESPONSE._serialized_end = 28332 - _PATCHSCHEDULEREQUEST._serialized_start = 28335 - _PATCHSCHEDULEREQUEST._serialized_end = 28491 - _PATCHSCHEDULERESPONSE._serialized_start = 28493 - _PATCHSCHEDULERESPONSE._serialized_end = 28516 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28519 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28687 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28689 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28772 - _DELETESCHEDULEREQUEST._serialized_start = 28774 - _DELETESCHEDULEREQUEST._serialized_end = 28855 - _DELETESCHEDULERESPONSE._serialized_start = 28857 - _DELETESCHEDULERESPONSE._serialized_end = 28881 - _LISTSCHEDULESREQUEST._serialized_start = 28883 - _LISTSCHEDULESREQUEST._serialized_end = 28991 - _LISTSCHEDULESRESPONSE._serialized_start = 28993 - _LISTSCHEDULESRESPONSE._serialized_end = 29105 - _COUNTSCHEDULESREQUEST._serialized_start = 29107 - _COUNTSCHEDULESREQUEST._serialized_end = 29164 - _COUNTSCHEDULESRESPONSE._serialized_start = 29167 - _COUNTSCHEDULESRESPONSE._serialized_end = 29386 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29389 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30035 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29836 + _REGISTERNAMESPACEREQUEST._serialized_start = 1774 + _REGISTERNAMESPACEREQUEST._serialized_end = 2422 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2379 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2422 + _REGISTERNAMESPACERESPONSE._serialized_start = 2424 + _REGISTERNAMESPACERESPONSE._serialized_end = 2451 + _LISTNAMESPACESREQUEST._serialized_start = 2454 + _LISTNAMESPACESREQUEST._serialized_end = 2591 + _LISTNAMESPACESRESPONSE._serialized_start = 2594 + _LISTNAMESPACESRESPONSE._serialized_end = 2723 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2725 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2808 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2811 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3324 + _UPDATENAMESPACEREQUEST._serialized_start = 3327 + _UPDATENAMESPACEREQUEST._serialized_end = 3662 + _UPDATENAMESPACERESPONSE._serialized_start = 3665 + _UPDATENAMESPACERESPONSE._serialized_end = 3956 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3958 + _DEPRECATENAMESPACEREQUEST._serialized_end = 4028 + _DEPRECATENAMESPACERESPONSE._serialized_start = 4030 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4058 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4061 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5678 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5681 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5979 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5982 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6280 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6283 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6469 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6472 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6648 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6650 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6770 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6773 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7213 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7216 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8369 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8279 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8363 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8372 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9544 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9639 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9641 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9713 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9958 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9961 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10486 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10488 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10523 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10526 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11012 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11015 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12196 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12199 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12364 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12366 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12478 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12481 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12688 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12690 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12806 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12809 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13191 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13193 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13231 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13234 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13441 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13443 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13485 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13488 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13997 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13999 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14086 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14089 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14423 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14425 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14516 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14519 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14901 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14903 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14940 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14943 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15231 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15233 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15274 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15277 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15537 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15539 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15579 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15582 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15932 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15934 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 16011 + _NOTIFYCHANNELREQUEST._serialized_start = 16014 + _NOTIFYCHANNELREQUEST._serialized_end = 16239 + _NOTIFYCHANNELRESPONSE._serialized_start = 16241 + _NOTIFYCHANNELRESPONSE._serialized_end = 16288 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16291 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16529 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16531 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16585 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16588 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16777 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16779 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16814 + _POLLCHANNELREQUEST._serialized_start = 16817 + _POLLCHANNELREQUEST._serialized_end = 17044 + _POLLCHANNELRESPONSE._serialized_start = 17046 + _POLLCHANNELRESPONSE._serialized_end = 17134 + _DESCRIBECHANNELREQUEST._serialized_start = 17137 + _DESCRIBECHANNELREQUEST._serialized_end = 17277 + _DESCRIBECHANNELRESPONSE._serialized_start = 17280 + _DESCRIBECHANNELRESPONSE._serialized_end = 17572 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17575 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18914 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18917 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 19075 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 19078 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19527 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19529 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19577 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19580 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19867 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19869 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19905 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19907 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 20029 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 20031 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 20064 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 20067 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20396 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20399 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20529 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20532 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20926 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20929 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21061 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21063 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21172 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21174 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21300 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21302 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21419 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21422 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21556 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21558 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21667 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21669 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21795 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21797 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21863 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21866 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 22103 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 22015 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22103 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 22105 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 22133 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 22136 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22337 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22253 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22337 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22340 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22701 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22703 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22738 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22740 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22850 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22852 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22882 + _SHUTDOWNWORKERREQUEST._serialized_start = 22885 + _SHUTDOWNWORKERREQUEST._serialized_end = 23168 + _SHUTDOWNWORKERRESPONSE._serialized_start = 23170 + _SHUTDOWNWORKERRESPONSE._serialized_end = 23194 + _QUERYWORKFLOWREQUEST._serialized_start = 23197 + _QUERYWORKFLOWREQUEST._serialized_end = 23430 + _QUERYWORKFLOWRESPONSE._serialized_start = 23433 + _QUERYWORKFLOWRESPONSE._serialized_end = 23618 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23620 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23735 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23738 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24485 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24488 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 25016 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 25019 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 26023 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25703 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25803 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25805 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25921 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25923 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 26023 + _GETCLUSTERINFOREQUEST._serialized_start = 26025 + _GETCLUSTERINFOREQUEST._serialized_end = 26048 + _GETCLUSTERINFORESPONSE._serialized_start = 26051 + _GETCLUSTERINFORESPONSE._serialized_end = 26516 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26461 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26516 + _GETSYSTEMINFOREQUEST._serialized_start = 26518 + _GETSYSTEMINFOREQUEST._serialized_end = 26540 + _GETSYSTEMINFORESPONSE._serialized_start = 26543 + _GETSYSTEMINFORESPONSE._serialized_end = 27120 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26684 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 27120 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 27122 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27231 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27234 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27457 + _CREATESCHEDULEREQUEST._serialized_start = 27460 + _CREATESCHEDULEREQUEST._serialized_end = 27792 + _CREATESCHEDULERESPONSE._serialized_start = 27794 + _CREATESCHEDULERESPONSE._serialized_end = 27842 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27844 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27909 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27912 + _DESCRIBESCHEDULERESPONSE._serialized_end = 28183 + _UPDATESCHEDULEREQUEST._serialized_start = 28186 + _UPDATESCHEDULEREQUEST._serialized_end = 28478 + _UPDATESCHEDULERESPONSE._serialized_start = 28480 + _UPDATESCHEDULERESPONSE._serialized_end = 28504 + _PATCHSCHEDULEREQUEST._serialized_start = 28507 + _PATCHSCHEDULEREQUEST._serialized_end = 28663 + _PATCHSCHEDULERESPONSE._serialized_start = 28665 + _PATCHSCHEDULERESPONSE._serialized_end = 28688 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28691 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28859 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28861 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28944 + _DELETESCHEDULEREQUEST._serialized_start = 28946 + _DELETESCHEDULEREQUEST._serialized_end = 29027 + _DELETESCHEDULERESPONSE._serialized_start = 29029 + _DELETESCHEDULERESPONSE._serialized_end = 29053 + _LISTSCHEDULESREQUEST._serialized_start = 29055 + _LISTSCHEDULESREQUEST._serialized_end = 29163 + _LISTSCHEDULESRESPONSE._serialized_start = 29165 + _LISTSCHEDULESRESPONSE._serialized_end = 29277 + _COUNTSCHEDULESREQUEST._serialized_start = 29279 + _COUNTSCHEDULESREQUEST._serialized_end = 29336 + _COUNTSCHEDULESRESPONSE._serialized_start = 29339 + _COUNTSCHEDULESRESPONSE._serialized_end = 29558 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 22015 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 22103 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29561 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30207 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 30008 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29947 + 30119 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29949 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30022 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30037 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30101 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30103 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30198 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30200 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30316 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30319 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32036 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31371 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 30121 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30194 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30209 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30273 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30275 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30370 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30372 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30488 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30491 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32208 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31543 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31484 + 31656 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31487 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31659 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31616 + 31788 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31618 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31790 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31682 + 31854 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31684 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31790 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31792 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31902 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31904 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31966 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31968 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32023 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32039 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32291 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32293 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32365 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32368 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32617 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32620 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32776 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32778 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32892 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32895 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33156 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33159 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33418 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33421 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34787 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34789 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34818 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34820 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34916 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34918 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34946 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34948 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35014 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35017 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35489 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35491 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35582 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35584 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35705 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35708 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35893 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35896 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36115 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36118 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36534 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36537 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36891 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36894 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37061 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37063 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37098 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37101 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37321 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37323 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37355 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37358 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37730 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37524 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37730 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37733 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38065 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37859 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38065 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38068 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38404 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38407 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38726 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38728 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38828 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38830 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38939 - _PAUSEACTIVITYREQUEST._serialized_start = 38942 - _PAUSEACTIVITYREQUEST._serialized_end = 39141 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39144 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39327 - _PAUSEACTIVITYRESPONSE._serialized_start = 39329 - _PAUSEACTIVITYRESPONSE._serialized_end = 39352 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39354 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39386 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39389 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39669 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39672 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39945 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39947 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39972 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39974 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40008 - _RESETACTIVITYREQUEST._serialized_start = 40011 - _RESETACTIVITYREQUEST._serialized_end = 40318 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40321 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40611 - _RESETACTIVITYRESPONSE._serialized_start = 40613 - _RESETACTIVITYRESPONSE._serialized_end = 40636 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40638 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40670 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40673 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40957 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40960 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41137 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41139 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41245 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41247 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41344 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41347 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41541 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41544 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42196 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41805 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42196 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42198 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42275 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42278 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42418 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42420 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42528 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42530 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42649 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42652 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42857 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42860 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43045 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43048 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43277 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43280 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43471 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43474 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43723 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43726 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43950 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43952 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44065 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44067 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44123 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44125 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44218 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44221 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44892 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44396 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44892 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44895 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45135 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45137 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45176 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45179 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45379 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45381 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45420 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45422 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45515 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45517 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45549 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45552 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46068 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46070 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46122 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46125 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46625 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46627 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46681 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46684 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47102 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47017 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31856 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31962 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31964 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 32074 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 32076 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 32138 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 32140 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32195 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32211 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32463 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32465 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32537 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32540 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32789 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32792 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32948 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32950 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 33064 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 33067 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33328 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33331 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33590 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33593 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34959 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34961 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34990 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34992 + _STOPBATCHOPERATIONREQUEST._serialized_end = 35088 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 35090 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 35118 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 35120 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35186 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35189 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35661 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35663 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35754 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35756 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35877 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35880 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 36065 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 36068 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36287 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36290 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36706 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36709 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 37063 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 37066 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37233 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37235 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37270 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37273 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37493 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37495 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37527 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37530 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37902 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37696 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37902 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37905 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38237 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 38031 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38237 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38240 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38576 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38579 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38898 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38900 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 39000 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 39002 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 39111 + _PAUSEACTIVITYREQUEST._serialized_start = 39114 + _PAUSEACTIVITYREQUEST._serialized_end = 39313 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39316 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39499 + _PAUSEACTIVITYRESPONSE._serialized_start = 39501 + _PAUSEACTIVITYRESPONSE._serialized_end = 39524 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39526 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39558 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39561 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39841 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39844 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 40117 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 40119 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 40144 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 40146 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40180 + _RESETACTIVITYREQUEST._serialized_start = 40183 + _RESETACTIVITYREQUEST._serialized_end = 40490 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40493 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40783 + _RESETACTIVITYRESPONSE._serialized_start = 40785 + _RESETACTIVITYRESPONSE._serialized_end = 40808 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40810 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40842 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40845 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 41129 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 41132 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41309 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41311 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41417 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41419 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41516 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41519 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41713 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41716 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42368 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41977 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42368 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25703 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25803 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42370 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42447 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42450 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42590 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42592 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42700 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42702 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42821 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42824 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 43029 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 43032 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43217 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43220 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43449 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43452 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43643 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43646 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43895 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43898 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 44122 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 44124 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44237 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44239 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44295 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44297 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44390 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44393 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 45064 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44568 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 45064 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45067 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45307 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45309 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45348 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45351 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45551 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45553 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45592 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45594 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45687 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45689 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45721 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45724 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46240 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 46117 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46240 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46242 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46294 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46297 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46797 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 46117 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46240 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46799 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46853 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46856 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47274 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47189 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 47102 + 47274 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47104 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47214 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47217 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47406 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47408 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47507 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47509 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47578 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47580 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47687 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47689 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47802 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47805 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48032 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 48035 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48215 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48217 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48312 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48314 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48379 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48381 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48462 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48464 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48527 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48529 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48557 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48559 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48629 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48631 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48735 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48738 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48944 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48946 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48992 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48995 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49150 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49152 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49183 - _LISTWORKERSREQUEST._serialized_start = 49186 - _LISTWORKERSREQUEST._serialized_end = 49316 - _LISTWORKERSRESPONSE._serialized_start = 49319 - _LISTWORKERSRESPONSE._serialized_end = 49484 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49487 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50212 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50054 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50145 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47276 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47386 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47389 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47578 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47580 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47679 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47681 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47750 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47752 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47859 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47861 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47974 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47977 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48204 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 48207 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48387 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48389 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48484 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48486 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48551 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48553 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48634 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48636 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48699 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48701 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48729 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48731 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48801 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48803 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48907 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48910 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 49116 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 49118 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 49164 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 49167 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49322 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49324 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49355 + _LISTWORKERSREQUEST._serialized_start = 49358 + _LISTWORKERSREQUEST._serialized_end = 49488 + _LISTWORKERSRESPONSE._serialized_start = 49491 + _LISTWORKERSRESPONSE._serialized_end = 49656 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49659 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50384 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50226 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50317 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50147 + 50319 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50212 + 50384 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50214 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50305 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50308 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50466 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50468 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50553 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50556 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50822 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50824 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50924 - _DESCRIBEWORKERREQUEST._serialized_start = 50926 - _DESCRIBEWORKERREQUEST._serialized_end = 50997 - _DESCRIBEWORKERRESPONSE._serialized_start = 50999 - _DESCRIBEWORKERRESPONSE._serialized_end = 51080 - _COUNTWORKERSREQUEST._serialized_start = 51082 - _COUNTWORKERSREQUEST._serialized_end = 51169 - _COUNTWORKERSRESPONSE._serialized_start = 51171 - _COUNTWORKERSRESPONSE._serialized_end = 51208 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51211 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51352 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51354 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51386 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51389 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51532 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51534 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51568 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51571 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52748 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52750 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52859 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52862 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53090 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53093 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53409 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53411 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53497 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53499 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53615 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53617 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53726 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53729 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53859 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53862 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54711 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54661 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54711 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54713 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54784 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54787 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54957 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54960 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55271 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55274 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55435 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55438 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55699 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55701 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55816 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55819 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55958 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55960 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56026 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56029 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56266 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56268 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56340 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56343 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56592 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56595 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56744 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56746 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56786 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56789 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56934 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56936 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56974 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57062 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57064 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57097 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57100 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57256 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57258 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57304 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57307 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57459 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57461 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57503 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57505 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57600 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57602 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57641 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57644 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57801 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57804 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58036 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50386 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50477 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50480 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50638 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50640 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50725 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50728 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50994 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50996 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 51096 + _DESCRIBEWORKERREQUEST._serialized_start = 51098 + _DESCRIBEWORKERREQUEST._serialized_end = 51169 + _DESCRIBEWORKERRESPONSE._serialized_start = 51171 + _DESCRIBEWORKERRESPONSE._serialized_end = 51252 + _COUNTWORKERSREQUEST._serialized_start = 51254 + _COUNTWORKERSREQUEST._serialized_end = 51341 + _COUNTWORKERSRESPONSE._serialized_start = 51343 + _COUNTWORKERSRESPONSE._serialized_end = 51380 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51383 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51524 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51526 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51558 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51561 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51704 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51706 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51740 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51743 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52920 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52922 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 53031 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 53034 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53262 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53265 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53581 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53583 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53669 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53671 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53787 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53789 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53898 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53901 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 54031 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54034 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55072 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 55022 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 55072 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55074 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55145 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55148 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55318 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55321 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55708 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55711 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55872 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55875 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 56136 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56138 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56253 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56256 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56395 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 56397 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56463 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56466 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56703 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 22015 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22103 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56705 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56777 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56780 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 57029 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 22015 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 22103 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 57032 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 57181 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 57183 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 57223 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 57226 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 57371 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 57373 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 57409 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 57411 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57499 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57501 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57534 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57537 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57693 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57695 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57741 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57744 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57896 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57898 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57940 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57942 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 58037 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 58039 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 58078 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 58081 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 58238 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 58241 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58473 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 7a0d774b5..9d2f8d060 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 7a0d774b5dab911a90497b840e6574dd14a48f13 +Subproject commit 9d2f8d0605c2cba6ed6b98412b5108f5c8420e66 From c85be89dae2eb4acb59ea1a9700928ee6092f8d6 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 18:04:39 -0700 Subject: [PATCH 822/831] Registered the stream consumer by execution. The helper hands the owner `stream_channel` names to the registration as `execution`, so a stream a standalone activity owns is consumed through the channel linked to the activity. A `channel_for` rule answers with an address or a `(channel, execution)` pair. --- temporalio/streams/providers/nexus.py | 27 ++++++++++++++------------ tests/streams/test_nexus_consumer.py | 28 +++++++++++++++------------ 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/temporalio/streams/providers/nexus.py b/temporalio/streams/providers/nexus.py index 356f8fc63..f4ad1f9ce 100644 --- a/temporalio/streams/providers/nexus.py +++ b/temporalio/streams/providers/nexus.py @@ -102,6 +102,7 @@ import temporalio.api.notification.v1 import temporalio.client +import temporalio.common import temporalio.converter import temporalio.nexus from temporalio.api.common.v1 import Payload @@ -1298,15 +1299,16 @@ async def _endpoint_id(self, client: Client | None) -> str: ConsumeFunction = Callable[[StreamRecord[Any], S], "S | Awaitable[S]"] ChannelRule = Callable[ - [StreamRef], "temporalio.client.ChannelAddress | tuple[str, str | None]" + [StreamRef], + "temporalio.client.ChannelAddress | tuple[str, temporalio.common.Execution | None]", ] -def _address(where: Any) -> tuple[str, str | None]: +def _address(where: Any) -> tuple[str, temporalio.common.Execution | None]: """The channel name and the owner a rule answered with, as an address or a pair.""" channel = getattr(where, "channel", None) if isinstance(channel, str): - return channel, getattr(where, "workflow_id", None) + return channel, getattr(where, "execution", None) channel, owner = where return channel, owner @@ -1325,8 +1327,8 @@ class ConsumerState(Generic[S]): channel: str """The channel the listener is registered on.""" - owner: str | None - """The workflow a linked channel belongs to, ``None`` for an independent one.""" + owner: temporalio.common.Execution | None + """The execution a linked channel belongs to, ``None`` for an independent one.""" listener_id: str """The listener id the server assigned.""" @@ -1375,7 +1377,7 @@ class Delivery: class _Consumption(Generic[S]): ref: StreamRef channel: str - owner: str | None + owner: temporalio.common.Execution | None listener_id: str callback_url: str | None callback_headers: dict[str, str] @@ -1512,10 +1514,11 @@ def __init__( client: Registers the listener and opens the stream. Leave it unset in a handler hosted by a Temporal worker, where the operation context's client is used. - channel_for: Names the channel for a ref and the workflow a - linked channel belongs to, as a - :class:`temporalio.client.ChannelAddress` or a - ``(channel, workflow_id)`` pair. The default is + channel_for: Names the channel for a ref and the execution a + linked channel belongs to, a workflow or a standalone + activity, as a :class:`temporalio.client.ChannelAddress` or a + ``(channel, execution)`` pair with ``None`` for an + independent channel. The default is :func:`temporalio.client.stream_channel`, the server's rule for native streams; a store that names channels its own way passes its rule. @@ -1580,7 +1583,7 @@ async def start( listener_id = await client.register_channel_listener( channel, Callback(url=self._listener_url, headers={self._token_header: token}), - workflow_id=owner, + execution=owner, ) state: _Consumption[S] = _Consumption( ref=input, @@ -1773,7 +1776,7 @@ async def close(self) -> None: async def _unregister(self, client: Client, state: _Consumption[S]) -> None: try: await client.unregister_channel_listener( - state.channel, state.listener_id, workflow_id=state.owner + state.channel, state.listener_id, execution=state.owner ) except RPCError: logger.warning( diff --git a/tests/streams/test_nexus_consumer.py b/tests/streams/test_nexus_consumer.py index 61b8610c5..afe081993 100644 --- a/tests/streams/test_nexus_consumer.py +++ b/tests/streams/test_nexus_consumer.py @@ -39,6 +39,7 @@ DeleteNexusEndpointRequest, ) from temporalio.client import Callback, ChannelAddress, Client, stream_channel +from temporalio.common import Execution from temporalio.exceptions import NexusOperationError from temporalio.service import RPCError, RPCStatusCode from temporalio.streams import BEGINNING, StreamProvider, StreamRecord, StreamRef @@ -88,23 +89,23 @@ class _ClientStandIn: def __init__(self, store: MemoryStreams) -> None: self._store = store self.data_converter = temporalio.converter.DataConverter.default - self.registered: list[tuple[str, Callback, str | None]] = [] - self.unregistered: list[tuple[str, str, str | None]] = [] + self.registered: list[tuple[str, Callback, Execution | None]] = [] + self.unregistered: list[tuple[str, str, Execution | None]] = [] def get_stream_handle(self, ref: StreamRef) -> Any: # The memory store opens a handle without a client. return open_ref(self._store, _as_client(None), ref) async def register_channel_listener( - self, channel: str, callback: Callback, *, workflow_id: str | None = None + self, channel: str, callback: Callback, *, execution: Execution | None = None ) -> str: - self.registered.append((channel, callback, workflow_id)) + self.registered.append((channel, callback, execution)) return f"listener-{len(self.registered)}" async def unregister_channel_listener( - self, channel: str, listener_id: str, *, workflow_id: str | None = None + self, channel: str, listener_id: str, *, execution: Execution | None = None ) -> None: - self.unregistered.append((channel, listener_id, workflow_id)) + self.unregistered.append((channel, listener_id, execution)) @dataclass @@ -237,13 +238,15 @@ def test_the_default_rule_is_the_servers_naming_of_a_streams_channel(): ChannelAddress("stream/s-1", None) ) assert stream_channel(StreamRef.for_workflow("wf", topic="t")) == ChannelAddress( - "stream/t", "wf" + "stream/t", Execution.workflow("wf") ) assert stream_channel( StreamRef.for_activity("act", workflow_id="wf", topic="t") - ) == ChannelAddress("stream/act/t", "wf") + ) == ChannelAddress("stream/act/t", Execution.workflow("wf")) + # A standalone activity is an execution of its own, so its stream's + # channel is linked to it. assert stream_channel(StreamRef.for_activity("act", topic="t")) == ( - ChannelAddress("stream/act/t", None) + ChannelAddress("stream/t", Execution.activity("act")) ) @@ -284,15 +287,16 @@ async def test_an_owned_stream_registers_on_the_owners_linked_channel( result = await operation.start(_start_context(), ref) assert isinstance(result, nexusrpc.handler.StartOperationResultAsync) state = operation.state(result.token) + owner = Execution.workflow("wf-1") assert state is not None and (state.channel, state.owner) == ( "stream/values", - "wf-1", + owner, ) assert [(channel, owner) for channel, _, owner in client.registered] == [ - ("stream/values", "wf-1") + ("stream/values", owner) ] await operation.close() - assert client.unregistered == [("stream/values", "listener-1", "wf-1")] + assert client.unregistered == [("stream/values", "listener-1", owner)] assert posted == [] From 7cd9b3a938cc7156a266966505103ad34534d93a Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 18:09:57 -0700 Subject: [PATCH 823/831] Carried one execution field on the channel inputs. The interceptor inputs name the owner once, as `execution`, and the client resolves the `workflow_id` and `run_id` shorthand before building them, so an interceptor sees one spelling. --- temporalio/client/_client.py | 41 ++++++++++++++++++++----------- temporalio/client/_impl.py | 36 ++++++--------------------- temporalio/client/_interceptor.py | 10 -------- 3 files changed, 33 insertions(+), 54 deletions(-) diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index 29de96098..63a1dace5 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -2910,9 +2910,7 @@ async def notify_channel( metadata=metadata, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, - execution=execution, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -2971,9 +2969,7 @@ async def poll_channel( max_notifications=max_notifications, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, - execution=execution, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -3013,9 +3009,7 @@ async def describe_channel( channel=channel, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, - execution=execution, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -3062,9 +3056,7 @@ async def register_channel_listener( callback=callback, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, - execution=execution, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -3103,9 +3095,7 @@ async def unregister_channel_listener( listener_id=listener_id, rpc_metadata=rpc_metadata, rpc_timeout=rpc_timeout, - workflow_id=workflow_id, - run_id=run_id, - execution=execution, + execution=_channel_execution(execution, workflow_id, run_id), ) ) @@ -3300,3 +3290,24 @@ class ClientConfig(TypedDict, total=False): ] header_codec_behavior: Required[HeaderCodecBehavior] stream_provider: temporalio.streams.StreamProvider | None + + +def _channel_execution( + execution: temporalio.common.Execution | None, + workflow_id: str | None, + run_id: str | None, +) -> temporalio.common.Execution | None: + """The owner a channel call names, by ``execution`` or by the workflow id shorthand. + + The two spellings do not combine, and a run id needs its workflow id. + ``None`` names the independent channel. + """ + if execution is not None: + if workflow_id is not None or run_id is not None: + raise ValueError("pass execution or workflow_id, not both") + return execution + if workflow_id is None: + if run_id is not None: + raise ValueError("run_id needs workflow_id") + return None + return temporalio.common.Execution.workflow(workflow_id, run_id) diff --git a/temporalio/client/_impl.py b/temporalio/client/_impl.py index f21b7df54..4be55aa90 100644 --- a/temporalio/client/_impl.py +++ b/temporalio/client/_impl.py @@ -1787,9 +1787,7 @@ async def notify_channel(self, input: NotifyChannelInput) -> int: notification=notification, identity=self._client.identity, request_id=str(uuid.uuid4()), - execution=_channel_owner( - input.execution, input.workflow_id, input.run_id - ), + execution=_channel_owner(input.execution), ), retry=True, metadata=input.rpc_metadata, @@ -1805,7 +1803,7 @@ async def poll_channel( channel=input.channel, after_counter=input.after_counter, max_notifications=input.max_notifications, - execution=_channel_owner(input.execution, input.workflow_id, input.run_id), + execution=_channel_owner(input.execution), ) if input.wait is not None: req.wait.FromTimedelta(input.wait) @@ -1819,9 +1817,7 @@ async def describe_channel(self, input: DescribeChannelInput) -> ChannelDescript temporalio.api.workflowservice.v1.DescribeChannelRequest( namespace=self._client.namespace, channel=input.channel, - execution=_channel_owner( - input.execution, input.workflow_id, input.run_id - ), + execution=_channel_owner(input.execution), ), retry=True, metadata=input.rpc_metadata, @@ -1859,9 +1855,7 @@ async def register_channel_listener( ), request_id=str(uuid.uuid4()), identity=self._client.identity, - execution=_channel_owner( - input.execution, input.workflow_id, input.run_id - ), + execution=_channel_owner(input.execution), ), retry=True, metadata=input.rpc_metadata, @@ -1878,9 +1872,7 @@ async def unregister_channel_listener( channel=input.channel, listener_id=input.listener_id, identity=self._client.identity, - execution=_channel_owner( - input.execution, input.workflow_id, input.run_id - ), + execution=_channel_owner(input.execution), ), retry=True, metadata=input.rpc_metadata, @@ -1927,20 +1919,6 @@ async def _apply_headers( def _channel_owner( execution: temporalio.common.Execution | None, - workflow_id: str | None, - run_id: str | None, ) -> temporalio.api.common.v1.Execution | None: - """The execution a channel call addresses, or ``None`` for an independent channel. - - ``workflow_id`` and ``run_id`` are the shorthand for a workflow owner, so - they do not combine with ``execution``. - """ - if execution is not None: - if workflow_id is not None or run_id is not None: - raise ValueError("pass execution or workflow_id, not both") - return execution.to_proto() - if workflow_id is None: - if run_id is not None: - raise ValueError("run_id needs workflow_id") - return None - return temporalio.common.Execution.workflow(workflow_id, run_id).to_proto() + """The owner on the wire, or ``None`` for an independent channel.""" + return None if execution is None else execution.to_proto() diff --git a/temporalio/client/_interceptor.py b/temporalio/client/_interceptor.py index b0282fe38..c35a1281f 100644 --- a/temporalio/client/_interceptor.py +++ b/temporalio/client/_interceptor.py @@ -716,8 +716,6 @@ class NotifyChannelInput: metadata: Mapping[str, Any] | None rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None execution: temporalio.common.Execution | None = None @@ -735,8 +733,6 @@ class PollChannelInput: max_notifications: int rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None execution: temporalio.common.Execution | None = None @@ -751,8 +747,6 @@ class DescribeChannelInput: channel: str rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None execution: temporalio.common.Execution | None = None @@ -768,8 +762,6 @@ class RegisterChannelListenerInput: callback: Callback rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None execution: temporalio.common.Execution | None = None @@ -785,8 +777,6 @@ class UnregisterChannelListenerInput: listener_id: str rpc_metadata: Mapping[str, str | bytes] rpc_timeout: timedelta | None - workflow_id: str | None = None - run_id: str | None = None execution: temporalio.common.Execution | None = None From 56ab5119d54bb831079dc44fc6ad9a0c3687dd68 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 18:13:22 -0700 Subject: [PATCH 824/831] Named a standalone activity's stream channel by execution on the native cases. The native e2e cases read the owner as an execution, and a new live case polls the channel linked to a standalone activity, which waits for the server layer that addresses a linked channel by execution. --- tests/streams/test_stream_channel_e2e.py | 75 +++++++++++++++++++++++- 1 file changed, 72 insertions(+), 3 deletions(-) diff --git a/tests/streams/test_stream_channel_e2e.py b/tests/streams/test_stream_channel_e2e.py index e698db6a1..6a632556a 100644 --- a/tests/streams/test_stream_channel_e2e.py +++ b/tests/streams/test_stream_channel_e2e.py @@ -18,7 +18,7 @@ import pytest -from temporalio import workflow +from temporalio import activity, workflow from temporalio.client import ( Callback, ChannelAddress, @@ -26,6 +26,7 @@ Client, stream_channel, ) +from temporalio.common import Execution, ExecutionType from temporalio.service import RPCError from temporalio.streams import StreamRef, topic from temporalio.streams.providers.native import NativeStreams @@ -144,7 +145,8 @@ async def test_a_workflow_stream_notifies_the_channel_linked_to_its_owner( ) try: address = stream_channel(StreamRef.for_workflow(handle.id, topic=OUT)) - assert address == ChannelAddress("stream/out", handle.id) + assert address == ChannelAddress("stream/out", Execution.workflow(handle.id)) + assert address.workflow_id == handle.id assert address == stream_channel( native.get_stream_handle(handle.id).ref(topic=OUT) ) @@ -167,7 +169,7 @@ async def changes(count: int) -> list[Any]: run_id = handle.first_execution_run_id for notification in polled: assert notification.linked_to is not None - assert notification.linked_to.workflow_id == handle.id + assert notification.linked_to.business_id == handle.id assert notification.position.decode().startswith(f"{run_id}:") description = await native.describe_channel( address.channel, workflow_id=address.workflow_id @@ -183,3 +185,70 @@ async def changes(count: int) -> list[Any]: running.cancel() await asyncio.gather(running, return_exceptions=True) await provider.close() + + +_released: dict[str, bool] = {} +"""Activity ids the test has let go, read by the activity in the same process.""" + + +@activity.defn +async def write_then_wait() -> str: + """Writes one record to the activity's own stream and lingers until released.""" + activity_id = activity.info().activity_id + producer = activity.stream_handle().producer(topic=OUT) + await producer.append({"n": 1}) + while not _released.get(activity_id): + activity.heartbeat() + await asyncio.sleep(0.2) + return activity_id + + +@pytest.mark.needs_execution_server +async def test_a_standalone_activity_stream_notifies_the_channel_linked_to_it( + client: Client, +): + provider = NativeStreams() + native = await _native(client, provider) + activity_id = f"act-{uuid.uuid4().hex[:8]}" + async with new_worker(native, activities=[write_then_wait]) as worker: + handle = await native.start_activity( + write_then_wait, + id=activity_id, + task_queue=worker.task_queue, + start_to_close_timeout=timedelta(seconds=60), + ) + try: + # A standalone activity is an execution of its own, so its stream + # notifies a channel linked to it, under the topic's name alone. + address = stream_channel(StreamRef.for_activity(activity_id, topic=OUT)) + assert address == ChannelAddress( + "stream/out", Execution.activity(activity_id) + ) + assert address.workflow_id is None + + async def changes(count: int) -> list[Any]: + polled = await native.poll_channel( + address.channel, execution=address.execution, wait=False + ) + assert [n.counter for n in polled] == list(range(1, count + 1)) + return polled + + [first] = await assert_eventually( + lambda: changes(1), timeout=timedelta(seconds=30) + ) + assert first.linked_to is not None + assert (first.linked_to.type, first.linked_to.business_id) == ( + ExecutionType.ACTIVITY, + activity_id, + ) + description = await native.describe_channel( + address.channel, execution=address.execution + ) + assert description.kind == ChannelKind.LINKED + assert description.linked_to is not None + assert description.linked_to.business_id == activity_id + finally: + _released[activity_id] = True + with contextlib.suppress(Exception): + await asyncio.wait_for(handle.result(), 30) + await provider.close() From df93277edc0bc17ab953a430103933f002be450d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 18:25:31 -0700 Subject: [PATCH 825/831] Pinned Core at the execution-addressed union head. The union Core addresses a linked channel by execution in both lineages, so the api and bridge protos regenerate from one tree again. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 67426be9e..c017e35c5 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 67426be9e38c4d25ac107d110b8cc297e18f9b1a +Subproject commit c017e35c59f344cc3d9a91cdbc6df825e36539a5 From 611d7720d6260d6bd8926553c9ede937fb1cbbe2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 18:27:34 -0700 Subject: [PATCH 826/831] Kept one copy of the client's channel owner resolver. Both lineages added the same helper in different places of the module, and the type checkers flag the shadowed one. --- temporalio/client/_client.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/temporalio/client/_client.py b/temporalio/client/_client.py index b76494959..5330bf7af 100644 --- a/temporalio/client/_client.py +++ b/temporalio/client/_client.py @@ -126,28 +126,6 @@ """How long :py:meth:`Client.poll_channel` waits for a notification by default.""" -def _channel_execution( - execution: temporalio.common.Execution | None, - workflow_id: str | None, - run_id: str | None, -) -> temporalio.common.Execution | None: - """The execution a channel call addresses, from either spelling of it. - - ``workflow_id`` and ``run_id`` are the short form for a workflow. They - cannot be combined with ``execution``, and ``run_id`` needs ``workflow_id``. - ``None`` addresses the independent channel of the name. - """ - if execution is not None: - if workflow_id is not None or run_id is not None: - raise ValueError("pass either execution or workflow_id, not both") - return execution - if workflow_id is None: - if run_id is not None: - raise ValueError("run_id needs workflow_id") - return None - return temporalio.common.Execution.workflow(workflow_id, run_id) - - class Client: """Client for accessing Temporal. From 97ddcd8c5f9a5eb5679eabb4a78e0952fb6c3fcd Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 19:22:48 -0700 Subject: [PATCH 827/831] Pinned Core at the protos that reuse the old numbers for execution. The execution fields take the numbers of the workflow-addressed shape, which was never released, and nothing is reserved. Only the two generated descriptors change. --- temporalio/api/notification/v1/message_pb2.py | 16 +- .../v1/request_response_pb2.py | 968 +++++++++--------- temporalio/bridge/sdk-core | 2 +- 3 files changed, 493 insertions(+), 493 deletions(-) diff --git a/temporalio/api/notification/v1/message_pb2.py b/temporalio/api/notification/v1/message_pb2.py index c7c5fa51c..cdcdb467d 100644 --- a/temporalio/api/notification/v1/message_pb2.py +++ b/temporalio/api/notification/v1/message_pb2.py @@ -22,7 +22,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x9c\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01J\x04\x08\x05\x10\x06"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' + b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x96\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12\x34\n\tlinked_to\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' ) _CHANNELKIND = DESCRIPTOR.enum_types_by_name["ChannelKind"] @@ -84,14 +84,14 @@ DESCRIPTOR._serialized_options = b"\n\037io.temporal.api.notification.v1B\014MessageProtoP\001Z/go.temporal.io/api/notification/v1;notification\252\002\036Temporalio.Api.Notification.V1\352\002!Temporalio::Api::Notification::V1" _NOTIFICATION_METADATAENTRY._options = None _NOTIFICATION_METADATAENTRY._serialized_options = b"8\001" - _CHANNELKIND._serialized_start = 719 - _CHANNELKIND._serialized_end = 817 + _CHANNELKIND._serialized_start = 713 + _CHANNELKIND._serialized_end = 811 _NOTIFICATION._serialized_start = 148 - _NOTIFICATION._serialized_end = 432 + _NOTIFICATION._serialized_end = 426 _NOTIFICATION_METADATAENTRY._serialized_start = 346 _NOTIFICATION_METADATAENTRY._serialized_end = 426 - _CHANNELLISTENER._serialized_start = 435 - _CHANNELLISTENER._serialized_end = 660 - _WORKFLOWLISTENER._serialized_start = 662 - _WORKFLOWLISTENER._serialized_end = 717 + _CHANNELLISTENER._serialized_start = 429 + _CHANNELLISTENER._serialized_end = 654 + _WORKFLOWLISTENER._serialized_start = 656 + _WORKFLOWLISTENER._serialized_end = 711 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index b77db53a7..7e7280fba 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe1\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xee\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xbd\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"#\n!UnregisterChannelListenerResponse"\xe3\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x8c\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x04 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x03\x10\x04R\x12workflow_execution"\xa4\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc7\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xd4\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xa3\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"#\n!UnregisterChannelListenerResponse"\xc9\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"r\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x03 \x01(\x0b\x32!.temporal.api.common.v1.Execution"\x9e\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4445,501 +4445,501 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16067 - _NOTIFYCHANNELRESPONSE._serialized_start = 16069 - _NOTIFYCHANNELRESPONSE._serialized_end = 16116 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16119 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16357 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16359 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16413 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16416 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16605 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16607 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16642 - _POLLCHANNELREQUEST._serialized_start = 16645 - _POLLCHANNELREQUEST._serialized_end = 16872 - _POLLCHANNELRESPONSE._serialized_start = 16874 - _POLLCHANNELRESPONSE._serialized_end = 16962 - _DESCRIBECHANNELREQUEST._serialized_start = 16965 - _DESCRIBECHANNELREQUEST._serialized_end = 17105 - _DESCRIBECHANNELRESPONSE._serialized_start = 17108 - _DESCRIBECHANNELRESPONSE._serialized_end = 17400 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17403 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18742 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18745 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18903 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18906 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19355 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19357 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19405 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19408 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19695 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19697 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19733 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19735 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19857 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19859 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19892 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19895 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20224 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20227 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20357 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20360 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20754 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20757 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20889 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20891 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21000 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21002 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21128 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21130 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21247 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21250 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21384 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21386 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21495 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21497 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21623 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21625 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21691 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21694 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21931 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21933 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21961 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21964 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22165 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22081 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22165 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22168 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22529 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22531 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22566 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22568 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22678 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22680 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22710 - _SHUTDOWNWORKERREQUEST._serialized_start = 22713 - _SHUTDOWNWORKERREQUEST._serialized_end = 22996 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22998 - _SHUTDOWNWORKERRESPONSE._serialized_end = 23022 - _QUERYWORKFLOWREQUEST._serialized_start = 23025 - _QUERYWORKFLOWREQUEST._serialized_end = 23258 - _QUERYWORKFLOWRESPONSE._serialized_start = 23261 - _QUERYWORKFLOWRESPONSE._serialized_end = 23446 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23448 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23563 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23566 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24313 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24316 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24844 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24847 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25851 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25633 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25749 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25751 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25851 - _GETCLUSTERINFOREQUEST._serialized_start = 25853 - _GETCLUSTERINFOREQUEST._serialized_end = 25876 - _GETCLUSTERINFORESPONSE._serialized_start = 25879 - _GETCLUSTERINFORESPONSE._serialized_end = 26344 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26289 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26344 - _GETSYSTEMINFOREQUEST._serialized_start = 26346 - _GETSYSTEMINFOREQUEST._serialized_end = 26368 - _GETSYSTEMINFORESPONSE._serialized_start = 26371 - _GETSYSTEMINFORESPONSE._serialized_end = 26948 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26512 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26948 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26950 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27059 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27062 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27285 - _CREATESCHEDULEREQUEST._serialized_start = 27288 - _CREATESCHEDULEREQUEST._serialized_end = 27620 - _CREATESCHEDULERESPONSE._serialized_start = 27622 - _CREATESCHEDULERESPONSE._serialized_end = 27670 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27672 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27737 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27740 - _DESCRIBESCHEDULERESPONSE._serialized_end = 28011 - _UPDATESCHEDULEREQUEST._serialized_start = 28014 - _UPDATESCHEDULEREQUEST._serialized_end = 28306 - _UPDATESCHEDULERESPONSE._serialized_start = 28308 - _UPDATESCHEDULERESPONSE._serialized_end = 28332 - _PATCHSCHEDULEREQUEST._serialized_start = 28335 - _PATCHSCHEDULEREQUEST._serialized_end = 28491 - _PATCHSCHEDULERESPONSE._serialized_start = 28493 - _PATCHSCHEDULERESPONSE._serialized_end = 28516 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28519 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28687 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28689 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28772 - _DELETESCHEDULEREQUEST._serialized_start = 28774 - _DELETESCHEDULEREQUEST._serialized_end = 28855 - _DELETESCHEDULERESPONSE._serialized_start = 28857 - _DELETESCHEDULERESPONSE._serialized_end = 28881 - _LISTSCHEDULESREQUEST._serialized_start = 28883 - _LISTSCHEDULESREQUEST._serialized_end = 28991 - _LISTSCHEDULESRESPONSE._serialized_start = 28993 - _LISTSCHEDULESRESPONSE._serialized_end = 29105 - _COUNTSCHEDULESREQUEST._serialized_start = 29107 - _COUNTSCHEDULESREQUEST._serialized_end = 29164 - _COUNTSCHEDULESRESPONSE._serialized_start = 29167 - _COUNTSCHEDULESRESPONSE._serialized_end = 29386 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29389 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30035 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29836 + _NOTIFYCHANNELREQUEST._serialized_end = 16041 + _NOTIFYCHANNELRESPONSE._serialized_start = 16043 + _NOTIFYCHANNELRESPONSE._serialized_end = 16090 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16093 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16305 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16307 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16361 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16364 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16527 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16529 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16564 + _POLLCHANNELREQUEST._serialized_start = 16567 + _POLLCHANNELREQUEST._serialized_end = 16768 + _POLLCHANNELRESPONSE._serialized_start = 16770 + _POLLCHANNELRESPONSE._serialized_end = 16858 + _DESCRIBECHANNELREQUEST._serialized_start = 16860 + _DESCRIBECHANNELREQUEST._serialized_end = 16974 + _DESCRIBECHANNELRESPONSE._serialized_start = 16977 + _DESCRIBECHANNELRESPONSE._serialized_end = 17263 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17266 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18605 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18608 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18766 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18769 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19218 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19220 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19268 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19271 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19558 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19560 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19596 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19598 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19720 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19722 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19755 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19758 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20087 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20090 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20220 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20223 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20617 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20620 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20752 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20754 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20863 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20865 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20991 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20993 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21110 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21113 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21247 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21249 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21358 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21360 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21486 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21488 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21554 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21557 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21794 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21796 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21824 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21827 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22028 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 21944 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22028 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22031 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22392 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22394 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22429 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22431 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22541 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22543 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22573 + _SHUTDOWNWORKERREQUEST._serialized_start = 22576 + _SHUTDOWNWORKERREQUEST._serialized_end = 22859 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22861 + _SHUTDOWNWORKERRESPONSE._serialized_end = 22885 + _QUERYWORKFLOWREQUEST._serialized_start = 22888 + _QUERYWORKFLOWREQUEST._serialized_end = 23121 + _QUERYWORKFLOWRESPONSE._serialized_start = 23124 + _QUERYWORKFLOWRESPONSE._serialized_end = 23309 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23311 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23426 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23429 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24176 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24179 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24707 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24710 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25714 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25394 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25494 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25496 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25612 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25614 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25714 + _GETCLUSTERINFOREQUEST._serialized_start = 25716 + _GETCLUSTERINFOREQUEST._serialized_end = 25739 + _GETCLUSTERINFORESPONSE._serialized_start = 25742 + _GETCLUSTERINFORESPONSE._serialized_end = 26207 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26152 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26207 + _GETSYSTEMINFOREQUEST._serialized_start = 26209 + _GETSYSTEMINFOREQUEST._serialized_end = 26231 + _GETSYSTEMINFORESPONSE._serialized_start = 26234 + _GETSYSTEMINFORESPONSE._serialized_end = 26811 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26375 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26811 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26813 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26922 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26925 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27148 + _CREATESCHEDULEREQUEST._serialized_start = 27151 + _CREATESCHEDULEREQUEST._serialized_end = 27483 + _CREATESCHEDULERESPONSE._serialized_start = 27485 + _CREATESCHEDULERESPONSE._serialized_end = 27533 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27535 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27600 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27603 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27874 + _UPDATESCHEDULEREQUEST._serialized_start = 27877 + _UPDATESCHEDULEREQUEST._serialized_end = 28169 + _UPDATESCHEDULERESPONSE._serialized_start = 28171 + _UPDATESCHEDULERESPONSE._serialized_end = 28195 + _PATCHSCHEDULEREQUEST._serialized_start = 28198 + _PATCHSCHEDULEREQUEST._serialized_end = 28354 + _PATCHSCHEDULERESPONSE._serialized_start = 28356 + _PATCHSCHEDULERESPONSE._serialized_end = 28379 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28382 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28550 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28552 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28635 + _DELETESCHEDULEREQUEST._serialized_start = 28637 + _DELETESCHEDULEREQUEST._serialized_end = 28718 + _DELETESCHEDULERESPONSE._serialized_start = 28720 + _DELETESCHEDULERESPONSE._serialized_end = 28744 + _LISTSCHEDULESREQUEST._serialized_start = 28746 + _LISTSCHEDULESREQUEST._serialized_end = 28854 + _LISTSCHEDULESRESPONSE._serialized_start = 28856 + _LISTSCHEDULESRESPONSE._serialized_end = 28968 + _COUNTSCHEDULESREQUEST._serialized_start = 28970 + _COUNTSCHEDULESREQUEST._serialized_end = 29027 + _COUNTSCHEDULESRESPONSE._serialized_start = 29030 + _COUNTSCHEDULESRESPONSE._serialized_end = 29249 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29252 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29898 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29699 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29947 + 29810 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29949 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30022 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30037 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30101 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30103 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30198 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30200 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30316 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30319 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32036 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31371 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29812 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29885 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29900 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29964 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29966 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30061 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30063 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30179 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30182 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31899 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31234 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31484 + 31347 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31487 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31350 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31616 + 31479 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31618 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31481 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31682 + 31545 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31684 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31790 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31792 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31902 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31904 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31966 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31968 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32023 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32039 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32291 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32293 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32365 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32368 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32617 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32620 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32776 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32778 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32892 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32895 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33156 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33159 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33418 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33421 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34787 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34789 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34818 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34820 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34916 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34918 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34946 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34948 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35014 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35017 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35489 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35491 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35582 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35584 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35705 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35708 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35893 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35896 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36115 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36118 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36534 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36537 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36891 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36894 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37061 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37063 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37098 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37101 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37321 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37323 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37355 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37358 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37730 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37524 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37730 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37733 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38065 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37859 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38065 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38068 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38404 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38407 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38726 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38728 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38828 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38830 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38939 - _PAUSEACTIVITYREQUEST._serialized_start = 38942 - _PAUSEACTIVITYREQUEST._serialized_end = 39141 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39144 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39327 - _PAUSEACTIVITYRESPONSE._serialized_start = 39329 - _PAUSEACTIVITYRESPONSE._serialized_end = 39352 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39354 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39386 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39389 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39669 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39672 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39945 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39947 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39972 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39974 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40008 - _RESETACTIVITYREQUEST._serialized_start = 40011 - _RESETACTIVITYREQUEST._serialized_end = 40318 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40321 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40611 - _RESETACTIVITYRESPONSE._serialized_start = 40613 - _RESETACTIVITYRESPONSE._serialized_end = 40636 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40638 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40670 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40673 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40957 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40960 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41137 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41139 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41245 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41247 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41344 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41347 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41541 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41544 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42196 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41805 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42196 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42198 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42275 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42278 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42418 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42420 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42528 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42530 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42649 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42652 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42857 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42860 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43045 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43048 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43277 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43280 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43471 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43474 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43723 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43726 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43950 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43952 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44065 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44067 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44123 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44125 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44218 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44221 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44892 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44396 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44892 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44895 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45135 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45137 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45176 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45179 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45379 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45381 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45420 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45422 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45515 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45517 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45549 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45552 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46068 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46070 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46122 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46125 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46625 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46627 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46681 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46684 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47102 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47017 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31547 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31653 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31655 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31765 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31767 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31829 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31831 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31886 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31902 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32154 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32156 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32228 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32231 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32480 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32483 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32639 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32641 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32755 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32758 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33019 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33022 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33281 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33284 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34650 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34652 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34681 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34683 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34779 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34781 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34809 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34811 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34877 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34880 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35352 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35354 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35445 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35447 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35568 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35571 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35756 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35759 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35978 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35981 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36397 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36400 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36754 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36757 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36924 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36926 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36961 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36964 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37184 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37186 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37218 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37221 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37593 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37387 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37593 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37596 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37928 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37722 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37928 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37931 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38267 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38270 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38589 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38591 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38691 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38693 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38802 + _PAUSEACTIVITYREQUEST._serialized_start = 38805 + _PAUSEACTIVITYREQUEST._serialized_end = 39004 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39007 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39190 + _PAUSEACTIVITYRESPONSE._serialized_start = 39192 + _PAUSEACTIVITYRESPONSE._serialized_end = 39215 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39217 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39249 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39252 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39532 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39535 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39808 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39810 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39835 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39837 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39871 + _RESETACTIVITYREQUEST._serialized_start = 39874 + _RESETACTIVITYREQUEST._serialized_end = 40181 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40184 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40474 + _RESETACTIVITYRESPONSE._serialized_start = 40476 + _RESETACTIVITYRESPONSE._serialized_end = 40499 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40501 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40533 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40536 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40820 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40823 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41000 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41002 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41108 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41110 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41207 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41210 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41404 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41407 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42059 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41668 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42059 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25394 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25494 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42061 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42138 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42141 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42281 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42283 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42391 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42393 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42512 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42515 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42720 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42723 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42908 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42911 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43140 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43143 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43334 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43337 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43586 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43589 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43813 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43815 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43928 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43930 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43986 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43988 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44081 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44084 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44755 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44259 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44755 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44758 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44998 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45000 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45039 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45042 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45242 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45244 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45283 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45285 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45378 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45380 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45412 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45415 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45931 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45808 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45931 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45933 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45985 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45988 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46488 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45808 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45931 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46490 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46544 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46547 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46965 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46880 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 47102 + 46965 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47104 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47214 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47217 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47406 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47408 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47507 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47509 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47578 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47580 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47687 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47689 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47802 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47805 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48032 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 48035 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48215 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48217 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48312 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48314 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48379 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48381 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48462 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48464 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48527 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48529 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48557 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48559 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48629 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48631 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48735 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48738 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48944 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48946 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48992 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48995 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49150 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49152 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49183 - _LISTWORKERSREQUEST._serialized_start = 49186 - _LISTWORKERSREQUEST._serialized_end = 49316 - _LISTWORKERSRESPONSE._serialized_start = 49319 - _LISTWORKERSRESPONSE._serialized_end = 49484 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49487 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50212 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50054 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50145 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46967 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47077 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47080 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47269 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47271 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47370 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47372 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47441 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47443 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47550 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47552 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47665 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47668 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47895 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47898 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48078 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48080 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48175 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48177 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48242 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48244 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48325 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48327 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48390 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48392 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48420 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48422 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48492 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48494 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48598 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48601 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48807 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48809 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48855 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48858 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49013 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49015 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49046 + _LISTWORKERSREQUEST._serialized_start = 49049 + _LISTWORKERSREQUEST._serialized_end = 49179 + _LISTWORKERSRESPONSE._serialized_start = 49182 + _LISTWORKERSRESPONSE._serialized_end = 49347 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49350 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50075 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49917 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50008 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50147 + 50010 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50212 + 50075 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50214 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50305 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50308 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50466 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50468 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50553 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50556 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50822 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50824 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50924 - _DESCRIBEWORKERREQUEST._serialized_start = 50926 - _DESCRIBEWORKERREQUEST._serialized_end = 50997 - _DESCRIBEWORKERRESPONSE._serialized_start = 50999 - _DESCRIBEWORKERRESPONSE._serialized_end = 51080 - _COUNTWORKERSREQUEST._serialized_start = 51082 - _COUNTWORKERSREQUEST._serialized_end = 51169 - _COUNTWORKERSRESPONSE._serialized_start = 51171 - _COUNTWORKERSRESPONSE._serialized_end = 51208 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51211 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51352 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51354 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51386 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51389 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51532 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51534 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51568 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51571 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52748 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52750 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52859 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52862 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53090 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53093 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53409 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53411 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53497 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53499 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53615 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53617 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53726 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53729 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53859 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53862 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54711 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54661 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54711 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54713 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54784 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54787 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54957 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54960 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55271 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55274 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55435 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55438 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55699 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55701 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55816 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55819 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55958 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55960 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56026 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56029 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56266 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56268 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56340 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56343 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56592 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56595 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56744 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56746 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56786 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56789 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56934 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56936 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56974 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57062 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57064 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57097 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57100 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57256 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57258 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57304 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57307 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57459 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57461 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57503 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57505 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57600 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57602 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57641 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57644 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57801 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57804 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58036 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50077 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50168 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50171 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50329 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50331 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50416 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50419 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50685 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50687 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50787 + _DESCRIBEWORKERREQUEST._serialized_start = 50789 + _DESCRIBEWORKERREQUEST._serialized_end = 50860 + _DESCRIBEWORKERRESPONSE._serialized_start = 50862 + _DESCRIBEWORKERRESPONSE._serialized_end = 50943 + _COUNTWORKERSREQUEST._serialized_start = 50945 + _COUNTWORKERSREQUEST._serialized_end = 51032 + _COUNTWORKERSRESPONSE._serialized_start = 51034 + _COUNTWORKERSRESPONSE._serialized_end = 51071 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51074 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51215 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51217 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51249 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51252 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51395 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51397 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51431 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51434 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52611 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52613 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52722 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52725 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52953 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52956 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53272 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53274 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53360 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53362 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53478 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53480 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53589 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53592 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53722 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53725 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54574 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54524 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54574 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54576 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54647 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54650 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54820 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54823 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55134 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55137 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55298 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55301 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55562 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55564 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55679 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55682 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55821 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55823 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55889 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55892 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56129 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56131 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56203 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56206 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56455 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56458 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56607 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56609 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56649 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56652 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56797 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56799 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56835 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56837 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56925 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56927 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56960 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56963 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57119 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57121 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57167 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57170 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57322 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57324 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57366 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57368 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57463 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57465 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57504 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57507 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57664 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57667 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57899 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 700698135..677d468c0 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 700698135fec798742dc280aa867f9db99a222fc +Subproject commit 677d468c090f2c4657edd2cf436576eabe8236af From d4022f6a38930a9a4ce27c0dabd78323e1c2841e Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 19:25:22 -0700 Subject: [PATCH 828/831] Pinned Core with the execution fields on their original numbers. The previous shape was never released, so the five channel requests and both `linked_to` fields reuse the numbers `workflow_execution` and the old `linked_to` had, with nothing reserved. Names and types are unchanged. --- temporalio/api/notification/v1/message_pb2.py | 16 +- .../v1/request_response_pb2.py | 968 +++++++++--------- temporalio/bridge/sdk-core | 2 +- 3 files changed, 493 insertions(+), 493 deletions(-) diff --git a/temporalio/api/notification/v1/message_pb2.py b/temporalio/api/notification/v1/message_pb2.py index c7c5fa51c..cdcdb467d 100644 --- a/temporalio/api/notification/v1/message_pb2.py +++ b/temporalio/api/notification/v1/message_pb2.py @@ -22,7 +22,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x9c\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01J\x04\x08\x05\x10\x06"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' + b'\n*temporal/api/notification/v1/message.proto\x12\x1ctemporal.api.notification.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a$temporal/api/common/v1/message.proto"\x96\x02\n\x0cNotification\x12\x0f\n\x07\x63hannel\x18\x01 \x01(\t\x12\x10\n\x08position\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x03\x12J\n\x08metadata\x18\x04 \x03(\x0b\x32\x38.temporal.api.notification.v1.Notification.MetadataEntry\x12\x34\n\tlinked_to\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution\x1aP\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"\xe1\x01\n\x0f\x43hannelListener\x12\x13\n\x0blistener_id\x18\x01 \x01(\t\x12\x42\n\x08workflow\x18\x02 \x01(\x0b\x32..temporal.api.notification.v1.WorkflowListenerH\x00\x12\x34\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.CallbackH\x00\x12\x33\n\x0fregistered_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\n\x08listener"7\n\x10WorkflowListener\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\t*b\n\x0b\x43hannelKind\x12\x1c\n\x18\x43HANNEL_KIND_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43HANNEL_KIND_INDEPENDENT\x10\x01\x12\x17\n\x13\x43HANNEL_KIND_LINKED\x10\x02\x42\xa7\x01\n\x1fio.temporal.api.notification.v1B\x0cMessageProtoP\x01Z/go.temporal.io/api/notification/v1;notification\xaa\x02\x1eTemporalio.Api.Notification.V1\xea\x02!Temporalio::Api::Notification::V1b\x06proto3' ) _CHANNELKIND = DESCRIPTOR.enum_types_by_name["ChannelKind"] @@ -84,14 +84,14 @@ DESCRIPTOR._serialized_options = b"\n\037io.temporal.api.notification.v1B\014MessageProtoP\001Z/go.temporal.io/api/notification/v1;notification\252\002\036Temporalio.Api.Notification.V1\352\002!Temporalio::Api::Notification::V1" _NOTIFICATION_METADATAENTRY._options = None _NOTIFICATION_METADATAENTRY._serialized_options = b"8\001" - _CHANNELKIND._serialized_start = 719 - _CHANNELKIND._serialized_end = 817 + _CHANNELKIND._serialized_start = 713 + _CHANNELKIND._serialized_end = 811 _NOTIFICATION._serialized_start = 148 - _NOTIFICATION._serialized_end = 432 + _NOTIFICATION._serialized_end = 426 _NOTIFICATION_METADATAENTRY._serialized_start = 346 _NOTIFICATION_METADATAENTRY._serialized_end = 426 - _CHANNELLISTENER._serialized_start = 435 - _CHANNELLISTENER._serialized_end = 660 - _WORKFLOWLISTENER._serialized_start = 662 - _WORKFLOWLISTENER._serialized_end = 717 + _CHANNELLISTENER._serialized_start = 429 + _CHANNELLISTENER._serialized_end = 654 + _WORKFLOWLISTENER._serialized_start = 656 + _WORKFLOWLISTENER._serialized_end = 711 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index b77db53a7..7e7280fba 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -137,7 +137,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe1\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xee\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xbd\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06R\x12workflow_execution"#\n!UnregisterChannelListenerResponse"\xe3\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x07 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x06\x10\x07R\x12workflow_execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"\x8c\x01\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x04 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x03\x10\x04R\x12workflow_execution"\xa4\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.ExecutionJ\x04\x08\x05\x10\x06"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc7\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xd4\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xa3\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"#\n!UnregisterChannelListenerResponse"\xc9\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"r\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x03 \x01(\x0b\x32!.temporal.api.common.v1.Execution"\x9e\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4445,501 +4445,501 @@ _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16067 - _NOTIFYCHANNELRESPONSE._serialized_start = 16069 - _NOTIFYCHANNELRESPONSE._serialized_end = 16116 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16119 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16357 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16359 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16413 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16416 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16605 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16607 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16642 - _POLLCHANNELREQUEST._serialized_start = 16645 - _POLLCHANNELREQUEST._serialized_end = 16872 - _POLLCHANNELRESPONSE._serialized_start = 16874 - _POLLCHANNELRESPONSE._serialized_end = 16962 - _DESCRIBECHANNELREQUEST._serialized_start = 16965 - _DESCRIBECHANNELREQUEST._serialized_end = 17105 - _DESCRIBECHANNELRESPONSE._serialized_start = 17108 - _DESCRIBECHANNELRESPONSE._serialized_end = 17400 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17403 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18742 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18745 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18903 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18906 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19355 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19357 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19405 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19408 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19695 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19697 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19733 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19735 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19857 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19859 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19892 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19895 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20224 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20227 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20357 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20360 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20754 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20757 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20889 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20891 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21000 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21002 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21128 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21130 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21247 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21250 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21384 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21386 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21495 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21497 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21623 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21625 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21691 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21694 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21931 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21933 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21961 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21964 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22165 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22081 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22165 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22168 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22529 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22531 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22566 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22568 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22678 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22680 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22710 - _SHUTDOWNWORKERREQUEST._serialized_start = 22713 - _SHUTDOWNWORKERREQUEST._serialized_end = 22996 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22998 - _SHUTDOWNWORKERRESPONSE._serialized_end = 23022 - _QUERYWORKFLOWREQUEST._serialized_start = 23025 - _QUERYWORKFLOWREQUEST._serialized_end = 23258 - _QUERYWORKFLOWRESPONSE._serialized_start = 23261 - _QUERYWORKFLOWRESPONSE._serialized_end = 23446 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23448 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23563 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23566 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24313 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24316 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24844 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24847 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25851 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25633 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25749 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25751 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25851 - _GETCLUSTERINFOREQUEST._serialized_start = 25853 - _GETCLUSTERINFOREQUEST._serialized_end = 25876 - _GETCLUSTERINFORESPONSE._serialized_start = 25879 - _GETCLUSTERINFORESPONSE._serialized_end = 26344 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26289 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26344 - _GETSYSTEMINFOREQUEST._serialized_start = 26346 - _GETSYSTEMINFOREQUEST._serialized_end = 26368 - _GETSYSTEMINFORESPONSE._serialized_start = 26371 - _GETSYSTEMINFORESPONSE._serialized_end = 26948 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26512 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26948 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26950 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27059 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27062 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27285 - _CREATESCHEDULEREQUEST._serialized_start = 27288 - _CREATESCHEDULEREQUEST._serialized_end = 27620 - _CREATESCHEDULERESPONSE._serialized_start = 27622 - _CREATESCHEDULERESPONSE._serialized_end = 27670 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27672 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27737 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27740 - _DESCRIBESCHEDULERESPONSE._serialized_end = 28011 - _UPDATESCHEDULEREQUEST._serialized_start = 28014 - _UPDATESCHEDULEREQUEST._serialized_end = 28306 - _UPDATESCHEDULERESPONSE._serialized_start = 28308 - _UPDATESCHEDULERESPONSE._serialized_end = 28332 - _PATCHSCHEDULEREQUEST._serialized_start = 28335 - _PATCHSCHEDULEREQUEST._serialized_end = 28491 - _PATCHSCHEDULERESPONSE._serialized_start = 28493 - _PATCHSCHEDULERESPONSE._serialized_end = 28516 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28519 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28687 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28689 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28772 - _DELETESCHEDULEREQUEST._serialized_start = 28774 - _DELETESCHEDULEREQUEST._serialized_end = 28855 - _DELETESCHEDULERESPONSE._serialized_start = 28857 - _DELETESCHEDULERESPONSE._serialized_end = 28881 - _LISTSCHEDULESREQUEST._serialized_start = 28883 - _LISTSCHEDULESREQUEST._serialized_end = 28991 - _LISTSCHEDULESRESPONSE._serialized_start = 28993 - _LISTSCHEDULESRESPONSE._serialized_end = 29105 - _COUNTSCHEDULESREQUEST._serialized_start = 29107 - _COUNTSCHEDULESREQUEST._serialized_end = 29164 - _COUNTSCHEDULESRESPONSE._serialized_start = 29167 - _COUNTSCHEDULESRESPONSE._serialized_end = 29386 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29389 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30035 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29836 + _NOTIFYCHANNELREQUEST._serialized_end = 16041 + _NOTIFYCHANNELRESPONSE._serialized_start = 16043 + _NOTIFYCHANNELRESPONSE._serialized_end = 16090 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16093 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16305 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16307 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16361 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16364 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16527 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16529 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16564 + _POLLCHANNELREQUEST._serialized_start = 16567 + _POLLCHANNELREQUEST._serialized_end = 16768 + _POLLCHANNELRESPONSE._serialized_start = 16770 + _POLLCHANNELRESPONSE._serialized_end = 16858 + _DESCRIBECHANNELREQUEST._serialized_start = 16860 + _DESCRIBECHANNELREQUEST._serialized_end = 16974 + _DESCRIBECHANNELRESPONSE._serialized_start = 16977 + _DESCRIBECHANNELRESPONSE._serialized_end = 17263 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17266 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18605 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18608 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18766 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18769 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19218 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19220 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19268 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19271 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19558 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19560 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19596 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19598 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19720 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19722 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19755 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19758 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20087 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20090 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20220 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20223 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20617 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20620 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20752 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20754 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20863 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20865 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20991 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20993 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21110 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21113 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21247 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21249 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21358 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21360 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21486 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21488 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21554 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21557 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21794 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21796 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21824 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21827 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22028 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 21944 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22028 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22031 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22392 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22394 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22429 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22431 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22541 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22543 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22573 + _SHUTDOWNWORKERREQUEST._serialized_start = 22576 + _SHUTDOWNWORKERREQUEST._serialized_end = 22859 + _SHUTDOWNWORKERRESPONSE._serialized_start = 22861 + _SHUTDOWNWORKERRESPONSE._serialized_end = 22885 + _QUERYWORKFLOWREQUEST._serialized_start = 22888 + _QUERYWORKFLOWREQUEST._serialized_end = 23121 + _QUERYWORKFLOWRESPONSE._serialized_start = 23124 + _QUERYWORKFLOWRESPONSE._serialized_end = 23309 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23311 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23426 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23429 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24176 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24179 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24707 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24710 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25714 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25394 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25494 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25496 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25612 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25614 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25714 + _GETCLUSTERINFOREQUEST._serialized_start = 25716 + _GETCLUSTERINFOREQUEST._serialized_end = 25739 + _GETCLUSTERINFORESPONSE._serialized_start = 25742 + _GETCLUSTERINFORESPONSE._serialized_end = 26207 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26152 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26207 + _GETSYSTEMINFOREQUEST._serialized_start = 26209 + _GETSYSTEMINFOREQUEST._serialized_end = 26231 + _GETSYSTEMINFORESPONSE._serialized_start = 26234 + _GETSYSTEMINFORESPONSE._serialized_end = 26811 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26375 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26811 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26813 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26922 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26925 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27148 + _CREATESCHEDULEREQUEST._serialized_start = 27151 + _CREATESCHEDULEREQUEST._serialized_end = 27483 + _CREATESCHEDULERESPONSE._serialized_start = 27485 + _CREATESCHEDULERESPONSE._serialized_end = 27533 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27535 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27600 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27603 + _DESCRIBESCHEDULERESPONSE._serialized_end = 27874 + _UPDATESCHEDULEREQUEST._serialized_start = 27877 + _UPDATESCHEDULEREQUEST._serialized_end = 28169 + _UPDATESCHEDULERESPONSE._serialized_start = 28171 + _UPDATESCHEDULERESPONSE._serialized_end = 28195 + _PATCHSCHEDULEREQUEST._serialized_start = 28198 + _PATCHSCHEDULEREQUEST._serialized_end = 28354 + _PATCHSCHEDULERESPONSE._serialized_start = 28356 + _PATCHSCHEDULERESPONSE._serialized_end = 28379 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28382 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28550 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28552 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28635 + _DELETESCHEDULEREQUEST._serialized_start = 28637 + _DELETESCHEDULEREQUEST._serialized_end = 28718 + _DELETESCHEDULERESPONSE._serialized_start = 28720 + _DELETESCHEDULERESPONSE._serialized_end = 28744 + _LISTSCHEDULESREQUEST._serialized_start = 28746 + _LISTSCHEDULESREQUEST._serialized_end = 28854 + _LISTSCHEDULESRESPONSE._serialized_start = 28856 + _LISTSCHEDULESRESPONSE._serialized_end = 28968 + _COUNTSCHEDULESREQUEST._serialized_start = 28970 + _COUNTSCHEDULESREQUEST._serialized_end = 29027 + _COUNTSCHEDULESRESPONSE._serialized_start = 29030 + _COUNTSCHEDULESRESPONSE._serialized_end = 29249 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29252 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29898 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29699 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29947 + 29810 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29949 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30022 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30037 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30101 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30103 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30198 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30200 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30316 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30319 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32036 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31371 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29812 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29885 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29900 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29964 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29966 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30061 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30063 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30179 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30182 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31899 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31234 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31484 + 31347 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31487 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31350 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31616 + 31479 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31618 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31481 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31682 + 31545 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31684 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31790 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31792 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31902 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31904 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31966 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31968 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32023 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32039 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32291 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32293 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32365 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32368 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32617 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32620 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32776 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32778 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32892 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32895 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33156 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33159 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33418 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33421 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34787 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34789 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34818 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34820 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34916 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34918 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34946 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34948 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35014 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35017 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35489 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35491 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35582 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35584 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35705 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35708 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35893 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35896 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36115 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36118 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36534 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36537 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36891 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36894 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37061 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37063 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37098 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37101 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37321 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37323 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37355 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37358 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37730 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37524 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37730 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37733 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38065 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37859 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38065 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38068 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38404 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38407 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38726 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38728 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38828 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38830 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38939 - _PAUSEACTIVITYREQUEST._serialized_start = 38942 - _PAUSEACTIVITYREQUEST._serialized_end = 39141 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39144 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39327 - _PAUSEACTIVITYRESPONSE._serialized_start = 39329 - _PAUSEACTIVITYRESPONSE._serialized_end = 39352 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39354 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39386 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39389 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39669 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39672 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39945 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39947 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39972 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39974 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40008 - _RESETACTIVITYREQUEST._serialized_start = 40011 - _RESETACTIVITYREQUEST._serialized_end = 40318 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40321 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40611 - _RESETACTIVITYRESPONSE._serialized_start = 40613 - _RESETACTIVITYRESPONSE._serialized_end = 40636 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40638 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40670 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40673 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40957 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40960 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41137 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41139 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41245 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41247 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41344 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41347 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41541 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41544 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42196 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41805 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42196 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25531 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25631 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42198 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42275 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42278 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42418 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42420 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42528 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42530 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42649 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42652 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42857 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42860 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43045 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43048 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43277 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43280 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43471 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43474 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43723 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43726 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43950 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43952 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44065 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44067 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44123 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44125 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44218 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44221 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44892 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44396 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44892 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44895 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45135 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45137 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45176 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45179 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45379 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45381 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45420 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45422 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45515 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45517 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45549 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45552 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46068 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46070 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46122 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46125 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46625 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45945 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46068 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46627 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46681 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46684 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47102 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47017 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31547 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31653 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31655 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31765 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31767 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31829 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31831 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31886 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31902 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32154 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32156 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32228 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32231 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32480 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32483 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32639 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32641 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32755 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32758 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33019 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33022 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33281 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33284 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34650 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34652 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34681 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34683 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34779 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34781 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34809 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34811 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34877 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34880 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35352 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35354 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35445 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35447 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35568 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35571 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35756 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35759 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35978 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35981 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36397 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36400 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36754 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36757 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36924 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36926 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36961 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36964 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37184 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37186 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37218 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37221 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37593 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37387 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37593 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37596 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37928 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37722 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37928 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37931 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38267 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38270 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38589 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38591 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38691 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38693 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38802 + _PAUSEACTIVITYREQUEST._serialized_start = 38805 + _PAUSEACTIVITYREQUEST._serialized_end = 39004 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39007 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39190 + _PAUSEACTIVITYRESPONSE._serialized_start = 39192 + _PAUSEACTIVITYRESPONSE._serialized_end = 39215 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39217 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39249 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39252 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39532 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39535 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39808 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39810 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 39835 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39837 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39871 + _RESETACTIVITYREQUEST._serialized_start = 39874 + _RESETACTIVITYREQUEST._serialized_end = 40181 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40184 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40474 + _RESETACTIVITYRESPONSE._serialized_start = 40476 + _RESETACTIVITYRESPONSE._serialized_end = 40499 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40501 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40533 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40536 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40820 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40823 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41000 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41002 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41108 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41110 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41207 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41210 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41404 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41407 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42059 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41668 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42059 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25394 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25494 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42061 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42138 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42141 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42281 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42283 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42391 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42393 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42512 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42515 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42720 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42723 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42908 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42911 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43140 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43143 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43334 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43337 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43586 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43589 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43813 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43815 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43928 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43930 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43986 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43988 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44081 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44084 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44755 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44259 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44755 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44758 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44998 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45000 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45039 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45042 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45242 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45244 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45283 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45285 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45378 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45380 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45412 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45415 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45931 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45808 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45931 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45933 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45985 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45988 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46488 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45808 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45931 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46490 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46544 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46547 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46965 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46880 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 47102 + 46965 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47104 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47214 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47217 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47406 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47408 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47507 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47509 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47578 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47580 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47687 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47689 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47802 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47805 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48032 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 48035 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48215 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48217 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48312 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48314 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48379 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48381 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48462 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48464 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48527 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48529 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48557 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48559 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48629 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48631 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48735 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48738 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48944 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48946 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48992 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48995 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49150 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49152 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49183 - _LISTWORKERSREQUEST._serialized_start = 49186 - _LISTWORKERSREQUEST._serialized_end = 49316 - _LISTWORKERSRESPONSE._serialized_start = 49319 - _LISTWORKERSRESPONSE._serialized_end = 49484 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49487 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50212 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50054 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50145 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46967 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47077 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47080 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47269 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47271 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47370 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47372 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47441 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47443 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47550 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47552 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47665 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47668 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47895 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 47898 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48078 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48080 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48175 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48177 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48242 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48244 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48325 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48327 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48390 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48392 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48420 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48422 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48492 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48494 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48598 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48601 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48807 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48809 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48855 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48858 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49013 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49015 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49046 + _LISTWORKERSREQUEST._serialized_start = 49049 + _LISTWORKERSREQUEST._serialized_end = 49179 + _LISTWORKERSRESPONSE._serialized_start = 49182 + _LISTWORKERSRESPONSE._serialized_end = 49347 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49350 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50075 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49917 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50008 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50147 + 50010 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50212 + 50075 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50214 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50305 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50308 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50466 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50468 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50553 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50556 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50822 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50824 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50924 - _DESCRIBEWORKERREQUEST._serialized_start = 50926 - _DESCRIBEWORKERREQUEST._serialized_end = 50997 - _DESCRIBEWORKERRESPONSE._serialized_start = 50999 - _DESCRIBEWORKERRESPONSE._serialized_end = 51080 - _COUNTWORKERSREQUEST._serialized_start = 51082 - _COUNTWORKERSREQUEST._serialized_end = 51169 - _COUNTWORKERSRESPONSE._serialized_start = 51171 - _COUNTWORKERSRESPONSE._serialized_end = 51208 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51211 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51352 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51354 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51386 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51389 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51532 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51534 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51568 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51571 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52748 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52750 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52859 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52862 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53090 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53093 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53409 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53411 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53497 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53499 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53615 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53617 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53726 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53729 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53859 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53862 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54711 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54661 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54711 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54713 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54784 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54787 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54957 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54960 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55271 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55274 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55435 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55438 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55699 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55701 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55816 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55819 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55958 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55960 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56026 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56029 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56266 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56268 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56340 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56343 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56592 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21843 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21931 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56595 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56744 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56746 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56786 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56789 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56934 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56936 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56972 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56974 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57062 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57064 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57097 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57100 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57256 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57258 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57304 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57307 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57459 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57461 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57503 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57505 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57600 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57602 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57641 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57644 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57801 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57804 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58036 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50077 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50168 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50171 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50329 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50331 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50416 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50419 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50685 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50687 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50787 + _DESCRIBEWORKERREQUEST._serialized_start = 50789 + _DESCRIBEWORKERREQUEST._serialized_end = 50860 + _DESCRIBEWORKERRESPONSE._serialized_start = 50862 + _DESCRIBEWORKERRESPONSE._serialized_end = 50943 + _COUNTWORKERSREQUEST._serialized_start = 50945 + _COUNTWORKERSREQUEST._serialized_end = 51032 + _COUNTWORKERSRESPONSE._serialized_start = 51034 + _COUNTWORKERSRESPONSE._serialized_end = 51071 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51074 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51215 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51217 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51249 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51252 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51395 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51397 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51431 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51434 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52611 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52613 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52722 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52725 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52953 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52956 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53272 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53274 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53360 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53362 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53478 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53480 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53589 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53592 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53722 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53725 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54574 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54524 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54574 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54576 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54647 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54650 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54820 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54823 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55134 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55137 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55298 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55301 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55562 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55564 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55679 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55682 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55821 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55823 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55889 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55892 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56129 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56131 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56203 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56206 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56455 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56458 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56607 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56609 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56649 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56652 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56797 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56799 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56835 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56837 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56925 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56927 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56960 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56963 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57119 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57121 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57167 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57170 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57322 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57324 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57366 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57368 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57463 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57465 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57504 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57507 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57664 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57667 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57899 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index 7a0d774b5..fbc064b8b 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit 7a0d774b5dab911a90497b840e6574dd14a48f13 +Subproject commit fbc064b8b7bf5b0a30b6b18ad94a3d026e14c93d From 38aa61789d3b7c820bc84c5eb38dccdc7990a36d Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 19:29:58 -0700 Subject: [PATCH 829/831] Pinned the delivery Core with the execution fields on their original numbers. The core-3 head carries the renumbered api: the five channel requests and both `linked_to` fields sit on the numbers the workflow fields had, with nothing reserved. Names and types are unchanged. --- .../v1/request_response_pb2.py | 1165 +++++++++-------- temporalio/bridge/sdk-core | 2 +- 2 files changed, 585 insertions(+), 582 deletions(-) diff --git a/temporalio/api/workflowservice/v1/request_response_pb2.py b/temporalio/api/workflowservice/v1/request_response_pb2.py index 7e7280fba..82132d6f7 100644 --- a/temporalio/api/workflowservice/v1/request_response_pb2.py +++ b/temporalio/api/workflowservice/v1/request_response_pb2.py @@ -90,6 +90,9 @@ from temporalio.api.nexus.v1 import ( message_pb2 as temporal_dot_api_dot_nexus_dot_v1_dot_message__pb2, ) +from temporalio.api.nexusoperation.v1 import ( + message_pb2 as temporal_dot_api_dot_nexusoperation_dot_v1_dot_message__pb2, +) from temporalio.api.notification.v1 import ( message_pb2 as temporal_dot_api_dot_notification_dot_v1_dot_message__pb2, ) @@ -137,7 +140,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xbe\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\x8f\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc7\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xd4\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xa3\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"#\n!UnregisterChannelListenerResponse"\xc9\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"r\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x03 \x01(\x0b\x32!.temporal.api.common.v1.Execution"\x9e\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd1\x06\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\xb7\x02\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x42\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' + b'\n6temporal/api/workflowservice/v1/request_response.proto\x12\x1ftemporal.api.workflowservice.v1\x1a+temporal/api/enums/v1/batch_operation.proto\x1a"temporal/api/enums/v1/common.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a%temporal/api/enums/v1/namespace.proto\x1a(temporal/api/enums/v1/failed_cause.proto\x1a!temporal/api/enums/v1/query.proto\x1a!temporal/api/enums/v1/reset.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a&temporal/api/enums/v1/deployment.proto\x1a"temporal/api/enums/v1/update.proto\x1a)temporal/api/enums/v1/time_skipping.proto\x1a$temporal/api/enums/v1/activity.proto\x1a!temporal/api/enums/v1/nexus.proto\x1a&temporal/api/activity/v1/message.proto\x1a$temporal/api/common/v1/message.proto\x1a$temporal/api/stream/v1/message.proto\x1a*temporal/api/notification/v1/message.proto\x1a%temporal/api/history/v1/message.proto\x1a&temporal/api/workflow/v1/message.proto\x1a%temporal/api/command/v1/message.proto\x1a$temporal/api/compute/v1/config.proto\x1a(temporal/api/deployment/v1/message.proto\x1a%temporal/api/failure/v1/message.proto\x1a$temporal/api/filter/v1/message.proto\x1a&temporal/api/protocol/v1/message.proto\x1a\'temporal/api/namespace/v1/message.proto\x1a#temporal/api/query/v1/message.proto\x1a)temporal/api/replication/v1/message.proto\x1a#temporal/api/rules/v1/message.proto\x1a\'temporal/api/sdk/v1/worker_config.proto\x1a&temporal/api/schedule/v1/message.proto\x1a\'temporal/api/taskqueue/v1/message.proto\x1a$temporal/api/update/v1/message.proto\x1a%temporal/api/version/v1/message.proto\x1a#temporal/api/batch/v1/message.proto\x1a\x30temporal/api/sdk/v1/task_complete_metadata.proto\x1a\'temporal/api/sdk/v1/user_metadata.proto\x1a#temporal/api/nexus/v1/message.proto\x1a,temporal/api/nexusoperation/v1/message.proto\x1a$temporal/api/worker/v1/message.proto\x1a\x1egoogle/protobuf/duration.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x88\x05\n\x18RegisterNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x13\n\x0bowner_email\x18\x03 \x01(\t\x12\x46\n#workflow_execution_retention_period\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12G\n\x08\x63lusters\x18\x05 \x03(\x0b\x32\x35.temporal.api.replication.v1.ClusterReplicationConfig\x12\x1b\n\x13\x61\x63tive_cluster_name\x18\x06 \x01(\t\x12Q\n\x04\x64\x61ta\x18\x07 \x03(\x0b\x32\x43.temporal.api.workflowservice.v1.RegisterNamespaceRequest.DataEntry\x12\x16\n\x0esecurity_token\x18\x08 \x01(\t\x12\x1b\n\x13is_global_namespace\x18\t \x01(\x08\x12\x44\n\x16history_archival_state\x18\n \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1c\n\x14history_archival_uri\x18\x0b \x01(\t\x12G\n\x19visibility_archival_state\x18\x0c \x01(\x0e\x32$.temporal.api.enums.v1.ArchivalState\x12\x1f\n\x17visibility_archival_uri\x18\r \x01(\t\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x1b\n\x19RegisterNamespaceResponse"\x89\x01\n\x15ListNamespacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\x12\x44\n\x10namespace_filter\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceFilter"\x81\x01\n\x16ListNamespacesResponse\x12N\n\nnamespaces\x18\x01 \x03(\x0b\x32:.temporal.api.workflowservice.v1.DescribeNamespaceResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"S\n\x18\x44\x65scribeNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x18\n\x10weak_consistency\x18\x03 \x01(\x08"\x81\x04\n\x19\x44\x65scribeNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08\x12\x45\n\x10\x66\x61ilover_history\x18\x06 \x03(\x0b\x32+.temporal.api.replication.v1.FailoverStatus\x12J\n\x12poller_group_infos\x18\x07 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x08 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xcf\x02\n\x16UpdateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x43\n\x0bupdate_info\x18\x02 \x01(\x0b\x32..temporal.api.namespace.v1.UpdateNamespaceInfo\x12:\n\x06\x63onfig\x18\x03 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x04 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x16\n\x0esecurity_token\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65lete_bad_binary\x18\x06 \x01(\t\x12\x19\n\x11promote_namespace\x18\x07 \x01(\x08"\xa3\x02\n\x17UpdateNamespaceResponse\x12@\n\x0enamespace_info\x18\x01 \x01(\x0b\x32(.temporal.api.namespace.v1.NamespaceInfo\x12:\n\x06\x63onfig\x18\x02 \x01(\x0b\x32*.temporal.api.namespace.v1.NamespaceConfig\x12S\n\x12replication_config\x18\x03 \x01(\x0b\x32\x37.temporal.api.replication.v1.NamespaceReplicationConfig\x12\x18\n\x10\x66\x61ilover_version\x18\x04 \x01(\x03\x12\x1b\n\x13is_global_namespace\x18\x05 \x01(\x08"F\n\x19\x44\x65precateNamespaceRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x16\n\x0esecurity_token\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65precateNamespaceResponse"\xd1\x0c\n\x1dStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x39\n\x0cretry_policy\x18\x0c \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\r \x01(\t\x12*\n\x04memo\x18\x0e \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x1f\n\x17request_eager_execution\x18\x11 \x01(\x08\x12;\n\x11\x63ontinued_failure\x18\x12 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12@\n\x16last_completion_result\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12>\n\x14\x63ompletion_callbacks\x18\x15 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12H\n\x13on_conflict_options\x18\x1a \x01(\x0b\x32+.temporal.api.workflow.v1.OnConflictOptions\x12\x32\n\x08priority\x18\x1b \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\\\n\x1f\x65\x61ger_worker_deployment_options\x18\x1c \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12H\n\x14time_skipping_config\x18\x1d \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfig"\xaa\x02\n\x1eStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12\x0f\n\x07started\x18\x03 \x01(\x08\x12>\n\x06status\x18\x05 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowExecutionStatus\x12[\n\x13\x65\x61ger_workflow_task\x18\x02 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xaa\x02\n"GetWorkflowExecutionHistoryRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c\x12\x16\n\x0ewait_new_event\x18\x05 \x01(\x08\x12P\n\x19history_event_filter_type\x18\x06 \x01(\x0e\x32-.temporal.api.enums.v1.HistoryEventFilterType\x12\x15\n\rskip_archival\x18\x07 \x01(\x08"\xba\x01\n#GetWorkflowExecutionHistoryResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x35\n\x0braw_history\x18\x02 \x03(\x0b\x32 .temporal.api.common.v1.DataBlob\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x10\n\x08\x61rchived\x18\x04 \x01(\x08"\xb0\x01\n)GetWorkflowExecutionHistoryReverseRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x19\n\x11maximum_page_size\x18\x03 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x04 \x01(\x0c"x\n*GetWorkflowExecutionHistoryReverseResponse\x12\x31\n\x07history\x18\x01 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\xb8\x03\n\x1cPollWorkflowTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x04 \x01(\tB\x02\x18\x01\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x81\t\n\x1dPollWorkflowTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12!\n\x19previous_started_event_id\x18\x04 \x01(\x03\x12\x18\n\x10started_event_id\x18\x05 \x01(\x03\x12\x0f\n\x07\x61ttempt\x18\x06 \x01(\x05\x12\x1a\n\x12\x62\x61\x63klog_count_hint\x18\x07 \x01(\x03\x12\x31\n\x07history\x18\x08 \x01(\x0b\x32 .temporal.api.history.v1.History\x12\x17\n\x0fnext_page_token\x18\t \x01(\x0c\x12\x33\n\x05query\x18\n \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x1dworkflow_execution_task_queue\x18\x0b \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x32\n\x0escheduled_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\\\n\x07queries\x18\x0e \x03(\x0b\x32K.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry\x12\x33\n\x08messages\x18\x0f \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12Q\n\x17poller_scaling_decision\x18\x10 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x11 \x01(\t\x12J\n\x12poller_group_infos\x18\x12 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x13 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo\x12:\n\rstream_slices\x18\x14 \x03(\x0b\x32#.temporal.api.stream.v1.StreamSlice\x1aT\n\x0cQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery:\x02\x38\x01J\x04\x08\x15\x10\x16"\xba\n\n#RespondWorkflowTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x32\n\x08\x63ommands\x18\x02 \x03(\x0b\x32 .temporal.api.command.v1.Command\x12\x10\n\x08identity\x18\x03 \x01(\t\x12O\n\x11sticky_attributes\x18\x04 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.StickyExecutionAttributes\x12 \n\x18return_new_workflow_task\x18\x05 \x01(\x08\x12&\n\x1e\x66orce_create_new_workflow_task\x18\x06 \x01(\x08\x12\x1b\n\x0f\x62inary_checksum\x18\x07 \x01(\tB\x02\x18\x01\x12m\n\rquery_results\x18\x08 \x03(\x0b\x32V.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.QueryResultsEntry\x12\x11\n\tnamespace\x18\t \x01(\t\x12\x13\n\x0bresource_id\x18\x12 \x01(\t\x12L\n\x14worker_version_stamp\x18\n \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12\x33\n\x08messages\x18\x0b \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12H\n\x0csdk_metadata\x18\x0c \x01(\x0b\x32\x32.temporal.api.sdk.v1.WorkflowTaskCompletedMetadata\x12\x43\n\x11metering_metadata\x18\r \x01(\x0b\x32(.temporal.api.common.v1.MeteringMetadata\x12g\n\x0c\x63\x61pabilities\x18\x0e \x01(\x0b\x32Q.temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest.Capabilities\x12>\n\ndeployment\x18\x0f \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12\x46\n\x13versioning_behavior\x18\x10 \x01(\x0e\x32).temporal.api.enums.v1.VersioningBehavior\x12O\n\x12\x64\x65ployment_options\x18\x11 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x1b\n\x13worker_instance_key\x18\x13 \x01(\t\x12!\n\x19worker_control_task_queue\x18\x14 \x01(\t\x12\x13\n\x0bpage_number\x18\x15 \x01(\x05\x12\x19\n\x11intermediate_page\x18\x16 \x01(\x08\x1a_\n\x11QueryResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\x05value\x18\x02 \x01(\x0b\x32*.temporal.api.query.v1.WorkflowQueryResult:\x02\x38\x01\x1a\x45\n\x0c\x43\x61pabilities\x12\x35\n-discard_speculative_workflow_task_with_events\x18\x01 \x01(\x08"\xf5\x01\n$RespondWorkflowTaskCompletedResponse\x12U\n\rworkflow_task\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse\x12V\n\x0e\x61\x63tivity_tasks\x18\x02 \x03(\x0b\x32>.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse\x12\x1e\n\x16reset_history_event_id\x18\x03 \x01(\x03"\x8d\x04\n RespondWorkflowTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12=\n\x05\x63\x61use\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x1b\n\x0f\x62inary_checksum\x18\x05 \x01(\tB\x02\x18\x01\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x0b \x01(\t\x12\x33\n\x08messages\x18\x07 \x03(\x0b\x32!.temporal.api.protocol.v1.Message\x12\x46\n\x0eworker_version\x18\x08 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\t \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\n \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"#\n!RespondWorkflowTaskFailedResponse"\xe6\x03\n\x1cPollActivityTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\n \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12!\n\x19worker_control_task_queue\x18\t \x01(\t\x12I\n\x13task_queue_metadata\x18\x04 \x01(\x0b\x32,.temporal.api.taskqueue.v1.TaskQueueMetadata\x12Z\n\x1bworker_version_capabilities\x18\x05 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptionsJ\x04\x08\x07\x10\x08R\x10worker_heartbeat"\x9d\t\n\x1dPollActivityTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x1a\n\x12workflow_namespace\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x45\n\x12workflow_execution\x18\x04 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x13\n\x0b\x61\x63tivity_id\x18\x06 \x01(\t\x12.\n\x06header\x18\x07 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12/\n\x05input\x18\x08 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12;\n\x11heartbeat_details\x18\t \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x32\n\x0escheduled_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x1e\x63urrent_attempt_scheduled_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cstarted_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07\x61ttempt\x18\r \x01(\x05\x12<\n\x19schedule_to_close_timeout\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\x0f \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\x10 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x11 \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12Q\n\x17poller_scaling_decision\x18\x12 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x32\n\x08priority\x18\x13 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12\x17\n\x0f\x61\x63tivity_run_id\x18\x14 \x01(\t\x12J\n\x12poller_group_infos\x18\x15 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x16 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa5\x01\n"RecordActivityTaskHeartbeatRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x05 \x01(\t"p\n#RecordActivityTaskHeartbeatResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xcf\x01\n&RecordActivityTaskHeartbeatByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"t\n\'RecordActivityTaskHeartbeatByIdResponse\x12\x18\n\x10\x63\x61ncel_requested\x18\x01 \x01(\x08\x12\x17\n\x0f\x61\x63tivity_paused\x18\x02 \x01(\x08\x12\x16\n\x0e\x61\x63tivity_reset\x18\x03 \x01(\x08"\xfe\x02\n#RespondActivityTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x30\n\x06result\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"&\n$RespondActivityTaskCompletedResponse"\xcf\x01\n\'RespondActivityTaskCompletedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x30\n\x06result\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"*\n(RespondActivityTaskCompletedByIdResponse"\xfd\x03\n RespondActivityTaskFailedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x66\x61ilure\x18\x02 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12@\n\x16last_heartbeat_details\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x46\n\x0eworker_version\x18\x06 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x07 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x08 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12=\n\x05\x63\x61use\x18\n \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"W\n!RespondActivityTaskFailedResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xce\x02\n$RespondActivityTaskFailedByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x10\n\x08identity\x18\x06 \x01(\t\x12@\n\x16last_heartbeat_details\x18\x07 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12=\n\x05\x63\x61use\x18\t \x01(\x0e\x32..temporal.api.enums.v1.ActivityTaskFailedCause"[\n%RespondActivityTaskFailedByIdResponse\x12\x32\n\x08\x66\x61ilures\x18\x01 \x03(\x0b\x32 .temporal.api.failure.v1.Failure"\xfe\x02\n"RespondActivityTaskCanceledRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12\x31\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x11\n\tnamespace\x18\x04 \x01(\t\x12\x13\n\x0bresource_id\x18\x08 \x01(\t\x12\x46\n\x0eworker_version\x18\x05 \x01(\x0b\x32*.temporal.api.common.v1.WorkerVersionStampB\x02\x18\x01\x12>\n\ndeployment\x18\x06 \x01(\x0b\x32&.temporal.api.deployment.v1.DeploymentB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions"%\n#RespondActivityTaskCanceledResponse"\xa0\x02\n&RespondActivityTaskCanceledByIdRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x06 \x01(\t\x12O\n\x12\x64\x65ployment_options\x18\x07 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x13\n\x0bresource_id\x18\x08 \x01(\t")\n\'RespondActivityTaskCanceledByIdResponse"\x84\x02\n%RequestCancelWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"(\n&RequestCancelWorkflowExecutionResponse"\xde\x02\n\x1eSignalWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x13\n\x0bsignal_name\x18\x03 \x01(\t\x12/\n\x05input\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x13\n\x07\x63ontrol\x18\x07 \x01(\tB\x02\x18\x01\x12.\n\x06header\x18\x08 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12+\n\x05links\x18\n \x03(\x0b\x32\x1c.temporal.api.common.v1.LinkJ\x04\x08\t\x10\n"M\n\x1fSignalWorkflowExecutionResponse\x12*\n\x04link\x18\x01 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc7\x01\n\x14NotifyChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12@\n\x0cnotification\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"/\n\x15NotifyChannelResponse\x12\x16\n\x0elistener_count\x18\x01 \x01(\x05"\xd4\x01\n\x1eRegisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x32\n\x08\x63\x61llback\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Callback\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution"6\n\x1fRegisterChannelListenerResponse\x12\x13\n\x0blistener_id\x18\x01 \x01(\t"\xa3\x01\n UnregisterChannelListenerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x13\n\x0blistener_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x34\n\texecution\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"#\n!UnregisterChannelListenerResponse"\xc9\x01\n\x12PollChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x15\n\rafter_counter\x18\x03 \x01(\x03\x12\'\n\x04wait\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x19\n\x11max_notifications\x18\x05 \x01(\x05\x12\x34\n\texecution\x18\x06 \x01(\x0b\x32!.temporal.api.common.v1.Execution"X\n\x13PollChannelResponse\x12\x41\n\rnotifications\x18\x01 \x03(\x0b\x32*.temporal.api.notification.v1.Notification"r\n\x16\x44\x65scribeChannelRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\t\x12\x34\n\texecution\x18\x03 \x01(\x0b\x32!.temporal.api.common.v1.Execution"\x9e\x02\n\x17\x44\x65scribeChannelResponse\x12@\n\tlisteners\x18\x01 \x03(\x0b\x32-.temporal.api.notification.v1.ChannelListener\x12:\n\x06latest\x18\x02 \x01(\x0b\x32*.temporal.api.notification.v1.Notification\x12\x16\n\x0eretained_count\x18\x03 \x01(\x05\x12\x37\n\x04kind\x18\x04 \x01(\x0e\x32).temporal.api.notification.v1.ChannelKind\x12\x34\n\tlinked_to\x18\x05 \x01(\x0b\x32!.temporal.api.common.v1.Execution"\xbb\n\n\'SignalWithStartWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12;\n\rworkflow_type\x18\x03 \x01(\x0b\x32$.temporal.api.common.v1.WorkflowType\x12\x38\n\ntask_queue\x18\x04 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12/\n\x05input\x18\x05 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12=\n\x1aworkflow_execution_timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x37\n\x14workflow_run_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\x15workflow_task_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x10\n\x08identity\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12N\n\x18workflow_id_reuse_policy\x18\x0b \x01(\x0e\x32,.temporal.api.enums.v1.WorkflowIdReusePolicy\x12T\n\x1bworkflow_id_conflict_policy\x18\x16 \x01(\x0e\x32/.temporal.api.enums.v1.WorkflowIdConflictPolicy\x12\x13\n\x0bsignal_name\x18\x0c \x01(\t\x12\x36\n\x0csignal_input\x18\r \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x13\n\x07\x63ontrol\x18\x0e \x01(\tB\x02\x18\x01\x12\x39\n\x0cretry_policy\x18\x0f \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12\x15\n\rcron_schedule\x18\x10 \x01(\t\x12*\n\x04memo\x18\x11 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x12 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x13 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x37\n\x14workflow_start_delay\x18\x14 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x38\n\ruser_metadata\x18\x17 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12+\n\x05links\x18\x18 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12I\n\x13versioning_override\x18\x19 \x01(\x0b\x32,.temporal.api.workflow.v1.VersioningOverride\x12\x32\n\x08priority\x18\x1a \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12H\n\x14time_skipping_config\x18\x1b \x01(\x0b\x32*.temporal.api.common.v1.TimeSkippingConfigJ\x04\x08\x15\x10\x16"\x9e\x01\n(SignalWithStartWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x04 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12\x31\n\x0bsignal_link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xc1\x03\n\x1dResetWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12%\n\x1dworkflow_task_finish_event_id\x18\x04 \x01(\x03\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12G\n\x12reset_reapply_type\x18\x06 \x01(\x0e\x32\'.temporal.api.enums.v1.ResetReapplyTypeB\x02\x18\x01\x12S\n\x1breset_reapply_exclude_types\x18\x07 \x03(\x0e\x32..temporal.api.enums.v1.ResetReapplyExcludeType\x12K\n\x15post_reset_operations\x18\x08 \x03(\x0b\x32,.temporal.api.workflow.v1.PostResetOperation\x12\x10\n\x08identity\x18\t \x01(\t"0\n\x1eResetWorkflowExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t"\x9f\x02\n!TerminateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x31\n\x07\x64\x65tails\x18\x04 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x1e\n\x16\x66irst_execution_run_id\x18\x06 \x01(\t\x12+\n\x05links\x18\x07 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link"$\n"TerminateWorkflowExecutionResponse"z\n\x1e\x44\x65leteWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"!\n\x1f\x44\x65leteWorkflowExecutionResponse"\xc9\x02\n!ListOpenWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x42\t\n\x07\x66ilters"\x82\x01\n"ListOpenWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8a\x03\n#ListClosedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x42\n\x11start_time_filter\x18\x04 \x01(\x0b\x32\'.temporal.api.filter.v1.StartTimeFilter\x12K\n\x10\x65xecution_filter\x18\x05 \x01(\x0b\x32/.temporal.api.filter.v1.WorkflowExecutionFilterH\x00\x12\x41\n\x0btype_filter\x18\x06 \x01(\x0b\x32*.temporal.api.filter.v1.WorkflowTypeFilterH\x00\x12=\n\rstatus_filter\x18\x07 \x01(\x0b\x32$.temporal.api.filter.v1.StatusFilterH\x00\x42\t\n\x07\x66ilters"\x84\x01\n$ListClosedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dListWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eListWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"u\n%ListArchivedWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x86\x01\n&ListArchivedWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"m\n\x1dScanWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"~\n\x1eScanWorkflowExecutionsResponse\x12\x43\n\nexecutions\x18\x01 \x03(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountWorkflowExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountWorkflowExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountWorkflowExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x1c\n\x1aGetSearchAttributesRequest"\xc9\x01\n\x1bGetSearchAttributesResponse\x12T\n\x04keys\x18\x01 \x03(\x0b\x32\x46.temporal.api.workflowservice.v1.GetSearchAttributesResponse.KeysEntry\x1aT\n\tKeysEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0e\x32\'.temporal.api.enums.v1.IndexedValueType:\x02\x38\x01"\xe9\x02\n RespondQueryTaskCompletedRequest\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12>\n\x0e\x63ompleted_type\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.QueryResultType\x12\x36\n\x0cquery_result\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x11\n\tnamespace\x18\x06 \x01(\t\x12\x31\n\x07\x66\x61ilure\x18\x07 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12=\n\x05\x63\x61use\x18\x08 \x01(\x0e\x32..temporal.api.enums.v1.WorkflowTaskFailedCause\x12\x17\n\x0fpoller_group_id\x18\t \x01(\tJ\x04\x08\x05\x10\x06"#\n!RespondQueryTaskCompletedResponse"n\n\x1bResetStickyTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\x1e\n\x1cResetStickyTaskQueueResponse"\x9b\x02\n\x15ShutdownWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11sticky_task_queue\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x05 \x01(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x1b\n\x13worker_instance_key\x18\x06 \x01(\t\x12\x12\n\ntask_queue\x18\x07 \x01(\t\x12>\n\x10task_queue_types\x18\x08 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueType"\x18\n\x16ShutdownWorkerResponse"\xe9\x01\n\x14QueryWorkflowRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x33\n\x05query\x18\x03 \x01(\x0b\x32$.temporal.api.query.v1.WorkflowQuery\x12K\n\x16query_reject_condition\x18\x04 \x01(\x0e\x32+.temporal.api.enums.v1.QueryRejectCondition"\xb9\x01\n\x15QueryWorkflowResponse\x12\x36\n\x0cquery_result\x18\x01 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12<\n\x0equery_rejected\x18\x02 \x01(\x0b\x32$.temporal.api.query.v1.QueryRejected\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"s\n DescribeWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution"\xeb\x05\n!DescribeWorkflowExecutionResponse\x12K\n\x10\x65xecution_config\x18\x01 \x01(\x0b\x32\x31.temporal.api.workflow.v1.WorkflowExecutionConfig\x12P\n\x17workflow_execution_info\x18\x02 \x01(\x0b\x32/.temporal.api.workflow.v1.WorkflowExecutionInfo\x12I\n\x12pending_activities\x18\x03 \x03(\x0b\x32-.temporal.api.workflow.v1.PendingActivityInfo\x12M\n\x10pending_children\x18\x04 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingChildExecutionInfo\x12P\n\x15pending_workflow_task\x18\x05 \x01(\x0b\x32\x31.temporal.api.workflow.v1.PendingWorkflowTaskInfo\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.workflow.v1.CallbackInfo\x12U\n\x18pending_nexus_operations\x18\x07 \x03(\x0b\x32\x33.temporal.api.workflow.v1.PendingNexusOperationInfo\x12W\n\x16workflow_extended_info\x18\x08 \x01(\x0b\x32\x37.temporal.api.workflow.v1.WorkflowExecutionExtendedInfo\x12P\n\x15\x63hannel_subscriptions\x18\t \x03(\x0b\x32\x31.temporal.api.workflow.v1.ChannelSubscriptionInfo"\x90\x04\n\x18\x44\x65scribeTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12=\n\x0ftask_queue_type\x18\x03 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x14\n\x0creport_stats\x18\x08 \x01(\x08\x12\x15\n\rreport_config\x18\x0b \x01(\x08\x12%\n\x19include_task_queue_status\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x42\n\x08\x61pi_mode\x18\x05 \x01(\x0e\x32,.temporal.api.enums.v1.DescribeTaskQueueModeB\x02\x18\x01\x12J\n\x08versions\x18\x06 \x01(\x0b\x32\x34.temporal.api.taskqueue.v1.TaskQueueVersionSelectionB\x02\x18\x01\x12\x42\n\x10task_queue_types\x18\x07 \x03(\x0e\x32$.temporal.api.enums.v1.TaskQueueTypeB\x02\x18\x01\x12\x1a\n\x0ereport_pollers\x18\t \x01(\x08\x42\x02\x18\x01\x12$\n\x18report_task_reachability\x18\n \x01(\x08\x42\x02\x18\x01"\xec\x07\n\x19\x44\x65scribeTaskQueueResponse\x12\x36\n\x07pollers\x18\x01 \x03(\x0b\x32%.temporal.api.taskqueue.v1.PollerInfo\x12\x38\n\x05stats\x18\x05 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12q\n\x15stats_by_priority_key\x18\x08 \x03(\x0b\x32R.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.StatsByPriorityKeyEntry\x12K\n\x0fversioning_info\x18\x04 \x01(\x0b\x32\x32.temporal.api.taskqueue.v1.TaskQueueVersioningInfo\x12:\n\x06\x63onfig\x18\x06 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig\x12k\n\x14\x65\x66\x66\x65\x63tive_rate_limit\x18\x07 \x01(\x0b\x32M.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.EffectiveRateLimit\x12I\n\x11task_queue_status\x18\x02 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueStatusB\x02\x18\x01\x12g\n\rversions_info\x18\x03 \x03(\x0b\x32L.temporal.api.workflowservice.v1.DescribeTaskQueueResponse.VersionsInfoEntryB\x02\x18\x01\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01\x1at\n\x12\x45\x66\x66\x65\x63tiveRateLimit\x12\x1b\n\x13requests_per_second\x18\x01 \x01(\x02\x12\x41\n\x11rate_limit_source\x18\x02 \x01(\x0e\x32&.temporal.api.enums.v1.RateLimitSource\x1a\x64\n\x11VersionsInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12>\n\x05value\x18\x02 \x01(\x0b\x32/.temporal.api.taskqueue.v1.TaskQueueVersionInfo:\x02\x38\x01"\x17\n\x15GetClusterInfoRequest"\xd1\x03\n\x16GetClusterInfoResponse\x12h\n\x11supported_clients\x18\x01 \x03(\x0b\x32M.temporal.api.workflowservice.v1.GetClusterInfoResponse.SupportedClientsEntry\x12\x16\n\x0eserver_version\x18\x02 \x01(\t\x12\x12\n\ncluster_id\x18\x03 \x01(\t\x12:\n\x0cversion_info\x18\x04 \x01(\x0b\x32$.temporal.api.version.v1.VersionInfo\x12\x14\n\x0c\x63luster_name\x18\x05 \x01(\t\x12\x1b\n\x13history_shard_count\x18\x06 \x01(\x05\x12\x19\n\x11persistence_store\x18\x07 \x01(\t\x12\x18\n\x10visibility_store\x18\x08 \x01(\t\x12 \n\x18initial_failover_version\x18\t \x01(\x03\x12"\n\x1a\x66\x61ilover_version_increment\x18\n \x01(\x03\x1a\x37\n\x15SupportedClientsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\x16\n\x14GetSystemInfoRequest"\xc1\x04\n\x15GetSystemInfoResponse\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12Y\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\x43.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities\x1a\xb4\x03\n\x0c\x43\x61pabilities\x12\x1f\n\x17signal_and_query_header\x18\x01 \x01(\x08\x12&\n\x1einternal_error_differentiation\x18\x02 \x01(\x08\x12*\n"activity_failure_include_heartbeat\x18\x03 \x01(\x08\x12\x1a\n\x12supports_schedules\x18\x04 \x01(\x08\x12"\n\x1a\x65ncoded_failure_attributes\x18\x05 \x01(\x08\x12!\n\x19\x62uild_id_based_versioning\x18\x06 \x01(\x08\x12\x13\n\x0bupsert_memo\x18\x07 \x01(\x08\x12\x1c\n\x14\x65\x61ger_workflow_start\x18\x08 \x01(\x08\x12\x14\n\x0csdk_metadata\x18\t \x01(\x08\x12\'\n\x1f\x63ount_group_by_execution_status\x18\n \x01(\x08\x12\r\n\x05nexus\x18\x0b \x01(\x08\x12!\n\x19server_scaled_deployments\x18\x0c \x01(\x08\x12(\n server_scaled_provider_cloud_run\x18\r \x01(\x08"m\n\x1eListTaskQueuePartitionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x02 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue"\xdf\x01\n\x1fListTaskQueuePartitionsResponse\x12]\n\x1e\x61\x63tivity_task_queue_partitions\x18\x01 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata\x12]\n\x1eworkflow_task_queue_partitions\x18\x02 \x03(\x0b\x32\x35.temporal.api.taskqueue.v1.TaskQueuePartitionMetadata"\xcc\x02\n\x15\x43reateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12>\n\rinitial_patch\x18\x04 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12*\n\x04memo\x18\x07 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x08 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes"0\n\x16\x43reateScheduleResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"A\n\x17\x44\x65scribeScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t"\x8f\x02\n\x18\x44\x65scribeScheduleResponse\x12\x34\n\x08schedule\x18\x01 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x34\n\x04info\x18\x02 \x01(\x0b\x32&.temporal.api.schedule.v1.ScheduleInfo\x12*\n\x04memo\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo\x12\x43\n\x11search_attributes\x18\x04 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c"\xa4\x02\n\x15UpdateScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x34\n\x08schedule\x18\x03 \x01(\x0b\x32".temporal.api.schedule.v1.Schedule\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x43\n\x11search_attributes\x18\x07 \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12*\n\x04memo\x18\x08 \x01(\x0b\x32\x1c.temporal.api.common.v1.Memo"\x18\n\x16UpdateScheduleResponse"\x9c\x01\n\x14PatchScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x36\n\x05patch\x18\x03 \x01(\x0b\x32\'.temporal.api.schedule.v1.SchedulePatch\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\x17\n\x15PatchScheduleResponse"\xa8\x01\n ListScheduleMatchingTimesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12.\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"S\n!ListScheduleMatchingTimesResponse\x12.\n\nstart_time\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.Timestamp"Q\n\x15\x44\x65leteScheduleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bschedule_id\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t"\x18\n\x16\x44\x65leteScheduleResponse"l\n\x14ListSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x19\n\x11maximum_page_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"p\n\x15ListSchedulesResponse\x12>\n\tschedules\x18\x01 \x03(\x0b\x32+.temporal.api.schedule.v1.ScheduleListEntry\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"9\n\x15\x43ountSchedulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xdb\x01\n\x16\x43ountSchedulesResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12X\n\x06groups\x18\x02 \x03(\x0b\x32H.temporal.api.workflowservice.v1.CountSchedulesResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x86\x05\n\'UpdateWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12-\n#add_new_build_id_in_new_default_set\x18\x03 \x01(\tH\x00\x12\x87\x01\n\x1b\x61\x64\x64_new_compatible_build_id\x18\x04 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.AddNewCompatibleVersionH\x00\x12!\n\x17promote_set_by_build_id\x18\x05 \x01(\tH\x00\x12%\n\x1bpromote_build_id_within_set\x18\x06 \x01(\tH\x00\x12h\n\nmerge_sets\x18\x07 \x01(\x0b\x32R.temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest.MergeSetsH\x00\x1ao\n\x17\x41\x64\x64NewCompatibleVersion\x12\x14\n\x0cnew_build_id\x18\x01 \x01(\t\x12$\n\x1c\x65xisting_compatible_build_id\x18\x02 \x01(\t\x12\x18\n\x10make_set_default\x18\x03 \x01(\x08\x1aI\n\tMergeSets\x12\x1c\n\x14primary_set_build_id\x18\x01 \x01(\t\x12\x1e\n\x16secondary_set_build_id\x18\x02 \x01(\tB\x0b\n\toperation"@\n(UpdateWorkerBuildIdCompatibilityResponseJ\x04\x08\x01\x10\x02R\x0eversion_set_id"_\n$GetWorkerBuildIdCompatibilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x10\n\x08max_sets\x18\x03 \x01(\x05"t\n%GetWorkerBuildIdCompatibilityResponse\x12K\n\x12major_version_sets\x18\x01 \x03(\x0b\x32/.temporal.api.taskqueue.v1.CompatibleVersionSet"\xb5\r\n"UpdateWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c\x12\x81\x01\n\x16insert_assignment_rule\x18\x04 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.InsertBuildIdAssignmentRuleH\x00\x12\x83\x01\n\x17replace_assignment_rule\x18\x05 \x01(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceBuildIdAssignmentRuleH\x00\x12\x81\x01\n\x16\x64\x65lete_assignment_rule\x18\x06 \x01(\x0b\x32_.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteBuildIdAssignmentRuleH\x00\x12\x8c\x01\n\x1c\x61\x64\x64_compatible_redirect_rule\x18\x07 \x01(\x0b\x32\x64.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.AddCompatibleBuildIdRedirectRuleH\x00\x12\x94\x01\n replace_compatible_redirect_rule\x18\x08 \x01(\x0b\x32h.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.ReplaceCompatibleBuildIdRedirectRuleH\x00\x12\x92\x01\n\x1f\x64\x65lete_compatible_redirect_rule\x18\t \x01(\x0b\x32g.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.DeleteCompatibleBuildIdRedirectRuleH\x00\x12l\n\x0f\x63ommit_build_id\x18\n \x01(\x0b\x32Q.temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest.CommitBuildIdH\x00\x1aq\n\x1bInsertBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x1a\x81\x01\n\x1cReplaceBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12>\n\x04rule\x18\x02 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.BuildIdAssignmentRule\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x1a@\n\x1b\x44\x65leteBuildIdAssignmentRule\x12\x12\n\nrule_index\x18\x01 \x01(\x05\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x1aj\n AddCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1an\n$ReplaceCompatibleBuildIdRedirectRule\x12\x46\n\x04rule\x18\x01 \x01(\x0b\x32\x38.temporal.api.taskqueue.v1.CompatibleBuildIdRedirectRule\x1a>\n#DeleteCompatibleBuildIdRedirectRule\x12\x17\n\x0fsource_build_id\x18\x01 \x01(\t\x1a\x37\n\rCommitBuildId\x12\x17\n\x0ftarget_build_id\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x42\x0b\n\toperation"\xfc\x01\n#UpdateWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"H\n\x1fGetWorkerVersioningRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\ntask_queue\x18\x02 \x01(\t"\xf9\x01\n GetWorkerVersioningRulesResponse\x12U\n\x10\x61ssignment_rules\x18\x01 \x03(\x0b\x32;.temporal.api.taskqueue.v1.TimestampedBuildIdAssignmentRule\x12\x66\n\x19\x63ompatible_redirect_rules\x18\x02 \x03(\x0b\x32\x43.temporal.api.taskqueue.v1.TimestampedCompatibleBuildIdRedirectRule\x12\x16\n\x0e\x63onflict_token\x18\x03 \x01(\x0c"\x9c\x01\n GetWorkerTaskReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tbuild_ids\x18\x02 \x03(\t\x12\x13\n\x0btask_queues\x18\x03 \x03(\t\x12=\n\x0creachability\x18\x04 \x01(\x0e\x32\'.temporal.api.enums.v1.TaskReachability"r\n!GetWorkerTaskReachabilityResponse\x12M\n\x15\x62uild_id_reachability\x18\x01 \x03(\x0b\x32..temporal.api.taskqueue.v1.BuildIdReachability"\x85\x02\n\x1eUpdateWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x1e\n\x16\x66irst_execution_run_id\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy\x12\x30\n\x07request\x18\x05 \x01(\x0b\x32\x1f.temporal.api.update.v1.Request"\x83\x02\n\x1fUpdateWorkflowExecutionResponse\x12\x35\n\nupdate_ref\x18\x01 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x30\n\x07outcome\x18\x02 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x03 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12*\n\x04link\x18\x04 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xd6\n\n\x1aStartBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x18\n\x10visibility_query\x18\x02 \x01(\t\x12\x0e\n\x06job_id\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x41\n\nexecutions\x18\x05 \x03(\x0b\x32).temporal.api.common.v1.WorkflowExecutionB\x02\x18\x01\x12<\n\x11target_executions\x18\x16 \x03(\x0b\x32!.temporal.api.common.v1.Execution\x12!\n\x19max_operations_per_second\x18\x06 \x01(\x02\x12Q\n\x15termination_operation\x18\n \x01(\x0b\x32\x30.temporal.api.batch.v1.BatchOperationTerminationH\x00\x12G\n\x10signal_operation\x18\x0b \x01(\x0b\x32+.temporal.api.batch.v1.BatchOperationSignalH\x00\x12S\n\x16\x63\x61ncellation_operation\x18\x0c \x01(\x0b\x32\x31.temporal.api.batch.v1.BatchOperationCancellationH\x00\x12K\n\x12\x64\x65letion_operation\x18\r \x01(\x0b\x32-.temporal.api.batch.v1.BatchOperationDeletionH\x00\x12\x45\n\x0freset_operation\x18\x0e \x01(\x0b\x32*.temporal.api.batch.v1.BatchOperationResetH\x00\x12p\n!update_workflow_options_operation\x18\x0f \x01(\x0b\x32\x43.temporal.api.batch.v1.BatchOperationUpdateWorkflowExecutionOptionsH\x00\x12^\n\x1cunpause_activities_operation\x18\x10 \x01(\x0b\x32\x36.temporal.api.batch.v1.BatchOperationUnpauseActivitiesH\x00\x12Z\n\x1areset_activities_operation\x18\x11 \x01(\x0b\x32\x34.temporal.api.batch.v1.BatchOperationResetActivitiesH\x00\x12g\n!update_activity_options_operation\x18\x12 \x01(\x0b\x32:.temporal.api.batch.v1.BatchOperationUpdateActivityOptionsH\x00\x12\\\n\x1b\x63\x61ncel_activities_operation\x18\x13 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationCancelActivitiesH\x00\x12\x62\n\x1eterminate_activities_operation\x18\x14 \x01(\x0b\x32\x38.temporal.api.batch.v1.BatchOperationTerminateActivitiesH\x00\x12\\\n\x1b\x64\x65lete_activities_operation\x18\x15 \x01(\x0b\x32\x35.temporal.api.batch.v1.BatchOperationDeleteActivitiesH\x00\x42\x0b\n\toperation"\x1d\n\x1bStartBatchOperationResponse"`\n\x19StopBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t"\x1c\n\x1aStopBatchOperationResponse"B\n\x1d\x44\x65scribeBatchOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0e\n\x06job_id\x18\x02 \x01(\t"\xd8\x03\n\x1e\x44\x65scribeBatchOperationResponse\x12\x41\n\x0eoperation_type\x18\x01 \x01(\x0e\x32).temporal.api.enums.v1.BatchOperationType\x12\x0e\n\x06job_id\x18\x02 \x01(\t\x12\x39\n\x05state\x18\x03 \x01(\x0e\x32*.temporal.api.enums.v1.BatchOperationState\x12.\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nclose_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15total_operation_count\x18\x06 \x01(\x03\x12 \n\x18\x63omplete_operation_count\x18\x07 \x01(\x03\x12\x1f\n\x17\x66\x61ilure_operation_count\x18\x08 \x01(\x03\x12\x10\n\x08identity\x18\t \x01(\t\x12\x0e\n\x06reason\x18\n \x01(\t\x12\r\n\x05query\x18\x0b \x01(\t\x12\x35\n\nexecutions\x18\x0c \x03(\x0b\x32!.temporal.api.common.v1.Execution"[\n\x1aListBatchOperationsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"y\n\x1bListBatchOperationsResponse\x12\x41\n\x0eoperation_info\x18\x01 \x03(\x0b\x32).temporal.api.batch.v1.BatchOperationInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xb9\x01\n"PollWorkflowExecutionUpdateRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\nupdate_ref\x18\x02 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x37\n\x0bwait_policy\x18\x04 \x01(\x0b\x32".temporal.api.update.v1.WaitPolicy"\xdb\x01\n#PollWorkflowExecutionUpdateResponse\x12\x30\n\x07outcome\x18\x01 \x01(\x0b\x32\x1f.temporal.api.update.v1.Outcome\x12K\n\x05stage\x18\x02 \x01(\x0e\x32<.temporal.api.enums.v1.UpdateWorkflowExecutionLifecycleStage\x12\x35\n\nupdate_ref\x18\x03 \x01(\x0b\x32!.temporal.api.update.v1.UpdateRef"\xa0\x03\n\x19PollNexusTaskQueueRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x38\n\ntask_queue\x18\x03 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12\x17\n\x0fpoller_group_id\x18\t \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x08 \x01(\t\x12Z\n\x1bworker_version_capabilities\x18\x04 \x01(\x0b\x32\x31.temporal.api.common.v1.WorkerVersionCapabilitiesB\x02\x18\x01\x12O\n\x12\x64\x65ployment_options\x18\x06 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentOptions\x12\x41\n\x10worker_heartbeat\x18\x07 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat"\xe2\x02\n\x1aPollNexusTaskQueueResponse\x12\x12\n\ntask_token\x18\x01 \x01(\x0c\x12/\n\x07request\x18\x02 \x01(\x0b\x32\x1e.temporal.api.nexus.v1.Request\x12Q\n\x17poller_scaling_decision\x18\x03 \x01(\x0b\x32\x30.temporal.api.taskqueue.v1.PollerScalingDecision\x12\x17\n\x0fpoller_group_id\x18\x04 \x01(\t\x12J\n\x12poller_group_infos\x18\x05 \x03(\x0b\x32*.temporal.api.taskqueue.v1.PollerGroupInfoB\x02\x18\x01\x12G\n\x12poller_groups_info\x18\x06 \x01(\x0b\x32+.temporal.api.taskqueue.v1.PollerGroupsInfo"\xa7\x01\n RespondNexusTaskCompletedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x31\n\x08response\x18\x04 \x01(\x0b\x32\x1f.temporal.api.nexus.v1.Response\x12\x17\n\x0fpoller_group_id\x18\x05 \x01(\t"#\n!RespondNexusTaskCompletedResponse"\xdc\x01\n\x1dRespondNexusTaskFailedRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_token\x18\x03 \x01(\x0c\x12\x36\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.temporal.api.nexus.v1.HandlerErrorB\x02\x18\x01\x12\x31\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.Failure\x12\x17\n\x0fpoller_group_id\x18\x06 \x01(\t" \n\x1eRespondNexusTaskFailedResponse"\xf4\x02\n\x1c\x45xecuteMultiOperationRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12[\n\noperations\x18\x02 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationRequest.Operation\x12\x13\n\x0bresource_id\x18\x03 \x01(\t\x1a\xce\x01\n\tOperation\x12X\n\x0estart_workflow\x18\x01 \x01(\x0b\x32>.temporal.api.workflowservice.v1.StartWorkflowExecutionRequestH\x00\x12Z\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32?.temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequestH\x00\x42\x0b\n\toperation"\xcc\x02\n\x1d\x45xecuteMultiOperationResponse\x12Z\n\tresponses\x18\x01 \x03(\x0b\x32G.temporal.api.workflowservice.v1.ExecuteMultiOperationResponse.Response\x1a\xce\x01\n\x08Response\x12Y\n\x0estart_workflow\x18\x01 \x01(\x0b\x32?.temporal.api.workflowservice.v1.StartWorkflowExecutionResponseH\x00\x12[\n\x0fupdate_workflow\x18\x02 \x01(\x0b\x32@.temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponseH\x00\x42\n\n\x08response"\xd0\x02\n\x1cUpdateActivityOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x04 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x0c\n\x02id\x18\x06 \x01(\tH\x00\x12\x0e\n\x04type\x18\x07 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\t \x01(\x08H\x00\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x42\n\n\x08\x61\x63tivity"\xbf\x02\n%UpdateActivityExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x43\n\x10\x61\x63tivity_options\x18\x06 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions\x12/\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x18\n\x10restore_original\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t"d\n\x1dUpdateActivityOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"m\n&UpdateActivityExecutionOptionsResponse\x12\x43\n\x10\x61\x63tivity_options\x18\x01 \x01(\x0b\x32).temporal.api.activity.v1.ActivityOptions"\xc7\x01\n\x14PauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x07 \x01(\tB\n\n\x08\x61\x63tivity"\xb7\x01\n\x1dPauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t\x12\x13\n\x0bresource_id\x18\x07 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t"\x17\n\x15PauseActivityResponse" \n\x1ePauseActivityExecutionResponse"\x98\x02\n\x16UnpauseActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x15\n\x0bunpause_all\x18\x06 \x01(\x08H\x00\x12\x16\n\x0ereset_attempts\x18\x07 \x01(\x08\x12\x17\n\x0freset_heartbeat\x18\x08 \x01(\x08\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\n\x08\x61\x63tivity"\x91\x02\n\x1fUnpauseActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x08 \x01(\t\x12)\n\x06jitter\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x13\n\x0bresource_id\x18\n \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\tJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0ereset_attemptsR\x0freset_heartbeat"\x19\n\x17UnpauseActivityResponse""\n UnpauseActivityExecutionResponse"\xb3\x02\n\x14ResetActivityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x0e\n\x04type\x18\x05 \x01(\tH\x00\x12\x13\n\tmatch_all\x18\n \x01(\x08H\x00\x12\x17\n\x0freset_heartbeat\x18\x06 \x01(\x08\x12\x13\n\x0bkeep_paused\x18\x07 \x01(\x08\x12)\n\x06jitter\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\t \x01(\x08\x42\n\n\x08\x61\x63tivity"\xa2\x02\n\x1dResetActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x03 \x01(\t\x12\x0e\n\x06run_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0bkeep_paused\x18\x06 \x01(\x08\x12)\n\x06jitter\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12 \n\x18restore_original_options\x18\x08 \x01(\x08\x12\x13\n\x0bresource_id\x18\t \x01(\t\x12\x12\n\nrequest_id\x18\n \x01(\t\x12\x17\n\x0freset_heartbeat\x18\x0b \x01(\x08"\x17\n\x15ResetActivityResponse" \n\x1eResetActivityExecutionResponse"\x9c\x02\n%UpdateWorkflowExecutionOptionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12V\n\x1aworkflow_execution_options\x18\x03 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_mask\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x10\n\x08identity\x18\x05 \x01(\t"\xb1\x01\n&UpdateWorkflowExecutionOptionsResponse\x12V\n\x1aworkflow_execution_options\x18\x01 \x01(\x0b\x32\x32.temporal.api.workflow.v1.WorkflowExecutionOptions\x12/\n\x0bupdate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x19\x44\x65scribeDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"a\n\x1a\x44\x65scribeDeploymentResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xc2\x01\n&DescribeWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x1f\n\x17report_task_queue_stats\x18\x04 \x01(\x08"\x8c\x05\n\'DescribeWorkerDeploymentVersionResponse\x12_\n\x1eworker_deployment_version_info\x18\x01 \x01(\x0b\x32\x37.temporal.api.deployment.v1.WorkerDeploymentVersionInfo\x12v\n\x13version_task_queues\x18\x02 \x03(\x0b\x32Y.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue\x1a\x87\x03\n\x10VersionTaskQueue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x04type\x18\x02 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12\x38\n\x05stats\x18\x03 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats\x12\x90\x01\n\x15stats_by_priority_key\x18\x04 \x03(\x0b\x32q.temporal.api.workflowservice.v1.DescribeWorkerDeploymentVersionResponse.VersionTaskQueue.StatsByPriorityKeyEntry\x1a\x64\n\x17StatsByPriorityKeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\x38\n\x05value\x18\x02 \x01(\x0b\x32).temporal.api.taskqueue.v1.TaskQueueStats:\x02\x38\x01"M\n\x1f\x44\x65scribeWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t"\x8c\x01\n DescribeWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12P\n\x16worker_deployment_info\x18\x02 \x01(\x0b\x32\x30.temporal.api.deployment.v1.WorkerDeploymentInfo"l\n\x16ListDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\x13\n\x0bseries_name\x18\x04 \x01(\t"w\n\x17ListDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12\x43\n\x0b\x64\x65ployments\x18\x02 \x03(\x0b\x32..temporal.api.deployment.v1.DeploymentListInfo"\xcd\x01\n\x1bSetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment\x12\x10\n\x08identity\x18\x03 \x01(\t\x12M\n\x0fupdate_metadata\x18\x04 \x01(\x0b\x32\x34.temporal.api.deployment.v1.UpdateDeploymentMetadata"\xb9\x01\n\x1cSetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12L\n\x18previous_deployment_info\x18\x02 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"\xe5\x01\n(SetWorkerDeploymentCurrentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x07 \x01(\t\x12\x16\n\x0e\x63onflict_token\x18\x04 \x01(\x0c\x12\x10\n\x08identity\x18\x05 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x06 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\t \x01(\x08"\xbf\x01\n)SetWorkerDeploymentCurrentVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x03 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01"\xf9\x01\n(SetWorkerDeploymentRampingVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x13\n\x07version\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08\x62uild_id\x18\x08 \x01(\t\x12\x12\n\npercentage\x18\x04 \x01(\x02\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\t\x12"\n\x1aignore_missing_task_queues\x18\x07 \x01(\x08\x12\x18\n\x10\x61llow_no_pollers\x18\n \x01(\x08"\xe0\x01\n)SetWorkerDeploymentRampingVersionResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12\x1c\n\x10previous_version\x18\x02 \x01(\tB\x02\x18\x01\x12\\\n\x1bprevious_deployment_version\x18\x04 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersionB\x02\x18\x01\x12\x1f\n\x13previous_percentage\x18\x03 \x01(\x02\x42\x02\x18\x01"q\n\x1d\x43reateWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"8\n\x1e\x43reateWorkerDeploymentResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c"]\n\x1cListWorkerDeploymentsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c"\x9f\x05\n\x1dListWorkerDeploymentsResponse\x12\x17\n\x0fnext_page_token\x18\x01 \x01(\x0c\x12r\n\x12worker_deployments\x18\x02 \x03(\x0b\x32V.temporal.api.workflowservice.v1.ListWorkerDeploymentsResponse.WorkerDeploymentSummary\x1a\xf0\x03\n\x17WorkerDeploymentSummary\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x0b\x63reate_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x0erouting_config\x18\x03 \x01(\x0b\x32).temporal.api.deployment.v1.RoutingConfig\x12o\n\x16latest_version_summary\x18\x04 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17\x63urrent_version_summary\x18\x05 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary\x12p\n\x17ramping_version_summary\x18\x06 \x01(\x0b\x32O.temporal.api.deployment.v1.WorkerDeploymentInfo.WorkerDeploymentVersionSummary"\xf0\x01\n$CreateWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12>\n\x0e\x63ompute_config\x18\x04 \x01(\x0b\x32&.temporal.api.compute.v1.ComputeConfig\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t"\'\n%CreateWorkerDeploymentVersionResponse"\xc8\x01\n$DeleteWorkerDeploymentVersionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x15\n\rskip_drainage\x18\x03 \x01(\x08\x12\x10\n\x08identity\x18\x04 \x01(\t"\'\n%DeleteWorkerDeploymentVersionResponse"]\n\x1d\x44\x65leteWorkerDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x10\n\x08identity\x18\x03 \x01(\t" \n\x1e\x44\x65leteWorkerDeploymentResponse"\x84\x04\n1UpdateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x99\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32r.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"4\n2UpdateWorkerDeploymentVersionComputeConfigResponse"\xf4\x03\n3ValidateWorkerDeploymentVersionComputeConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12O\n\x12\x64\x65ployment_version\x18\x02 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12\x9b\x01\n\x1d\x63ompute_config_scaling_groups\x18\x06 \x03(\x0b\x32t.temporal.api.workflowservice.v1.ValidateWorkerDeploymentVersionComputeConfigRequest.ComputeConfigScalingGroupsEntry\x12,\n$remove_compute_config_scaling_groups\x18\x07 \x03(\t\x12\x10\n\x08identity\x18\x03 \x01(\t\x1a{\n\x1f\x43omputeConfigScalingGroupsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12G\n\x05value\x18\x02 \x01(\x0b\x32\x38.temporal.api.compute.v1.ComputeConfigScalingGroupUpdate:\x02\x38\x01"6\n4ValidateWorkerDeploymentVersionComputeConfigResponse"\xa2\x03\n,UpdateWorkerDeploymentVersionMetadataRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x07version\x18\x02 \x01(\tB\x02\x18\x01\x12O\n\x12\x64\x65ployment_version\x18\x05 \x01(\x0b\x32\x33.temporal.api.deployment.v1.WorkerDeploymentVersion\x12x\n\x0eupsert_entries\x18\x03 \x03(\x0b\x32`.temporal.api.workflowservice.v1.UpdateWorkerDeploymentVersionMetadataRequest.UpsertEntriesEntry\x12\x16\n\x0eremove_entries\x18\x04 \x03(\t\x12\x10\n\x08identity\x18\x06 \x01(\t\x1aU\n\x12UpsertEntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload:\x02\x38\x01"n\n-UpdateWorkerDeploymentVersionMetadataResponse\x12=\n\x08metadata\x18\x01 \x01(\x0b\x32+.temporal.api.deployment.v1.VersionMetadata"\xbd\x01\n!SetWorkerDeploymentManagerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65ployment_name\x18\x02 \x01(\t\x12\x1a\n\x10manager_identity\x18\x03 \x01(\tH\x00\x12\x0e\n\x04self\x18\x04 \x01(\x08H\x00\x12\x16\n\x0e\x63onflict_token\x18\x05 \x01(\x0c\x12\x10\n\x08identity\x18\x06 \x01(\tB\x16\n\x14new_manager_identity"c\n"SetWorkerDeploymentManagerResponse\x12\x16\n\x0e\x63onflict_token\x18\x01 \x01(\x0c\x12%\n\x19previous_manager_identity\x18\x02 \x01(\tB\x02\x18\x01"E\n\x1bGetCurrentDeploymentRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bseries_name\x18\x02 \x01(\t"k\n\x1cGetCurrentDeploymentResponse\x12K\n\x17\x63urrent_deployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo"q\n GetDeploymentReachabilityRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12:\n\ndeployment\x18\x02 \x01(\x0b\x32&.temporal.api.deployment.v1.Deployment"\xe3\x01\n!GetDeploymentReachabilityResponse\x12\x43\n\x0f\x64\x65ployment_info\x18\x01 \x01(\x0b\x32*.temporal.api.deployment.v1.DeploymentInfo\x12\x43\n\x0creachability\x18\x02 \x01(\x0e\x32-.temporal.api.enums.v1.DeploymentReachability\x12\x34\n\x10last_update_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xb4\x01\n\x19\x43reateWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x35\n\x04spec\x18\x02 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpec\x12\x12\n\nforce_scan\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x12\x10\n\x08identity\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t"_\n\x1a\x43reateWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x0e\n\x06job_id\x18\x02 \x01(\t"A\n\x1b\x44\x65scribeWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"Q\n\x1c\x44\x65scribeWorkflowRuleResponse\x12\x31\n\x04rule\x18\x01 \x01(\x0b\x32#.temporal.api.rules.v1.WorkflowRule"?\n\x19\x44\x65leteWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x0f\n\x07rule_id\x18\x02 \x01(\t"\x1c\n\x1a\x44\x65leteWorkflowRuleResponse"F\n\x18ListWorkflowRulesRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"h\n\x19ListWorkflowRulesResponse\x12\x32\n\x05rules\x18\x01 \x03(\x0b\x32#.temporal.api.rules.v1.WorkflowRule\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xce\x01\n\x1aTriggerWorkflowRuleRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12<\n\texecution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x0c\n\x02id\x18\x04 \x01(\tH\x00\x12\x37\n\x04spec\x18\x05 \x01(\x0b\x32\'.temporal.api.rules.v1.WorkflowRuleSpecH\x00\x12\x10\n\x08identity\x18\x03 \x01(\tB\x06\n\x04rule".\n\x1bTriggerWorkflowRuleResponse\x12\x0f\n\x07\x61pplied\x18\x01 \x01(\x08"\x9b\x01\n\x1cRecordWorkerHeartbeatRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x41\n\x10worker_heartbeat\x18\x03 \x03(\x0b\x32\'.temporal.api.worker.v1.WorkerHeartbeat\x12\x13\n\x0bresource_id\x18\x04 \x01(\t"\x1f\n\x1dRecordWorkerHeartbeatResponse"\x82\x01\n\x12ListWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x05 \x01(\x08"\xa5\x01\n\x13ListWorkersResponse\x12<\n\x0cworkers_info\x18\x01 \x03(\x0b\x32".temporal.api.worker.v1.WorkerInfoB\x02\x18\x01\x12\x37\n\x07workers\x18\x03 \x03(\x0b\x32&.temporal.api.worker.v1.WorkerListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\xd5\x05\n\x1cUpdateTaskQueueConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\ntask_queue\x18\x03 \x01(\t\x12=\n\x0ftask_queue_type\x18\x04 \x01(\x0e\x32$.temporal.api.enums.v1.TaskQueueType\x12n\n\x17update_queue_rate_limit\x18\x05 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12}\n&update_fairness_key_rate_limit_default\x18\x06 \x01(\x0b\x32M.temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.RateLimitUpdate\x12\x84\x01\n\x1dset_fairness_weight_overrides\x18\x07 \x03(\x0b\x32].temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest.SetFairnessWeightOverridesEntry\x12\'\n\x1funset_fairness_weight_overrides\x18\x08 \x03(\t\x1a[\n\x0fRateLimitUpdate\x12\x38\n\nrate_limit\x18\x01 \x01(\x0b\x32$.temporal.api.taskqueue.v1.RateLimit\x12\x0e\n\x06reason\x18\x02 \x01(\t\x1a\x41\n\x1fSetFairnessWeightOverridesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x02:\x02\x38\x01"[\n\x1dUpdateTaskQueueConfigResponse\x12:\n\x06\x63onfig\x18\x01 \x01(\x0b\x32*.temporal.api.taskqueue.v1.TaskQueueConfig"\x9e\x01\n\x18\x46\x65tchWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"U\n\x19\x46\x65tchWorkerConfigResponse\x12\x38\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig"\x8a\x02\n\x19UpdateWorkerConfigRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x38\n\rworker_config\x18\x04 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfig\x12/\n\x0bupdate_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\x12\x38\n\x08selector\x18\x06 \x01(\x0b\x32&.temporal.api.common.v1.WorkerSelector\x12\x13\n\x0bresource_id\x18\x07 \x01(\t"d\n\x1aUpdateWorkerConfigResponse\x12:\n\rworker_config\x18\x01 \x01(\x0b\x32!.temporal.api.sdk.v1.WorkerConfigH\x00\x42\n\n\x08response"G\n\x15\x44\x65scribeWorkerRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x1b\n\x13worker_instance_key\x18\x02 \x01(\t"Q\n\x16\x44\x65scribeWorkerResponse\x12\x37\n\x0bworker_info\x18\x01 \x01(\x0b\x32".temporal.api.worker.v1.WorkerInfo"W\n\x13\x43ountWorkersRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t\x12\x1e\n\x16include_system_workers\x18\x03 \x01(\x08"%\n\x14\x43ountWorkersResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03"\x8d\x01\n\x1dPauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t" \n\x1ePauseWorkflowExecutionResponse"\x8f\x01\n\x1fUnpauseWorkflowExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0bworkflow_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x0e\n\x06reason\x18\x05 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t""\n UnpauseWorkflowExecutionResponse"\x99\t\n\x1dStartActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x04 \x01(\t\x12;\n\ractivity_type\x18\x05 \x01(\x0b\x32$.temporal.api.common.v1.ActivityType\x12\x38\n\ntask_queue\x18\x06 \x01(\x0b\x32$.temporal.api.taskqueue.v1.TaskQueue\x12<\n\x19schedule_to_close_timeout\x18\x07 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x34\n\x11heartbeat_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x0cretry_policy\x18\x0b \x01(\x0b\x32#.temporal.api.common.v1.RetryPolicy\x12/\n\x05input\x18\x0c \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x45\n\x0fid_reuse_policy\x18\r \x01(\x0e\x32,.temporal.api.enums.v1.ActivityIdReusePolicy\x12K\n\x12id_conflict_policy\x18\x0e \x01(\x0e\x32/.temporal.api.enums.v1.ActivityIdConflictPolicy\x12\x43\n\x11search_attributes\x18\x0f \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12.\n\x06header\x18\x10 \x01(\x0b\x32\x1e.temporal.api.common.v1.Header\x12\x38\n\ruser_metadata\x18\x11 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12\x32\n\x08priority\x18\x12 \x01(\x0b\x32 .temporal.api.common.v1.Priority\x12>\n\x14\x63ompletion_callbacks\x18\x13 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x14 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x12\x46\n\x13on_conflict_options\x18\x15 \x01(\x0b\x32).temporal.api.common.v1.OnConflictOptions\x12.\n\x0bstart_delay\x18\x16 \x01(\x0b\x32\x19.google.protobuf.Duration"m\n\x1eStartActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08\x12*\n\x04link\x18\x03 \x01(\x0b\x32\x1c.temporal.api.common.v1.Link"\xe4\x01\n DescribeActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12!\n\x19include_heartbeat_details\x18\x07 \x01(\x08\x12\x1c\n\x14include_last_failure\x18\x08 \x01(\x08"\xbc\x02\n!DescribeActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12=\n\x04info\x18\x02 \x01(\x0b\x32/.temporal.api.activity.v1.ActivityExecutionInfo\x12/\n\x05input\x18\x03 \x01(\x0b\x32 .temporal.api.common.v1.Payloads\x12\x43\n\x07outcome\x18\x04 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome\x12\x17\n\x0flong_poll_token\x18\x05 \x01(\x0c\x12\x39\n\tcallbacks\x18\x06 \x03(\x0b\x32&.temporal.api.activity.v1.CallbackInfo"V\n\x1cPollActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"t\n\x1dPollActivityExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x43\n\x07outcome\x18\x02 \x01(\x0b\x32\x32.temporal.api.activity.v1.ActivityExecutionOutcome"m\n\x1dListActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x82\x01\n\x1eListActivityExecutionsResponse\x12G\n\nexecutions\x18\x01 \x03(\x0b\x32\x33.temporal.api.activity.v1.ActivityExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"\x8e\x08\n#StartNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x10\n\x08identity\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x12\x14\n\x0coperation_id\x18\x04 \x01(\t\x12\x10\n\x08\x65ndpoint\x18\x05 \x01(\t\x12\x0f\n\x07service\x18\x06 \x01(\t\x12\x11\n\toperation\x18\x07 \x01(\t\x12<\n\x19schedule_to_close_timeout\x18\x08 \x01(\x0b\x32\x19.google.protobuf.Duration\x12<\n\x19schedule_to_start_timeout\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x39\n\x16start_to_close_timeout\x18\n \x01(\x0b\x32\x19.google.protobuf.Duration\x12.\n\x05input\x18\x0b \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12K\n\x0fid_reuse_policy\x18\x0c \x01(\x0e\x32\x32.temporal.api.enums.v1.NexusOperationIdReusePolicy\x12Q\n\x12id_conflict_policy\x18\r \x01(\x0e\x32\x35.temporal.api.enums.v1.NexusOperationIdConflictPolicy\x12N\n\x13on_conflict_options\x18\x11 \x01(\x0b\x32\x31.temporal.api.nexusoperation.v1.OnConflictOptions\x12\x43\n\x11search_attributes\x18\x0e \x01(\x0b\x32(.temporal.api.common.v1.SearchAttributes\x12k\n\x0cnexus_header\x18\x0f \x03(\x0b\x32U.temporal.api.workflowservice.v1.StartNexusOperationExecutionRequest.NexusHeaderEntry\x12\x38\n\ruser_metadata\x18\x10 \x01(\x0b\x32!.temporal.api.sdk.v1.UserMetadata\x12>\n\x14\x63ompletion_callbacks\x18\x12 \x03(\x0b\x32 .temporal.api.common.v1.Callback\x12+\n\x05links\x18\x13 \x03(\x0b\x32\x1c.temporal.api.common.v1.Link\x1a\x32\n\x10NexusHeaderEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"G\n$StartNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x0f\n\x07started\x18\x02 \x01(\x08"\xaa\x01\n&DescribeNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x15\n\rinclude_input\x18\x04 \x01(\x08\x12\x17\n\x0finclude_outcome\x18\x05 \x01(\x08\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c"\x83\x03\n\'DescribeNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12@\n\x04info\x18\x02 \x01(\x0b\x32\x32.temporal.api.nexus.v1.NexusOperationExecutionInfo\x12.\n\x05input\x18\x03 \x01(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x12\x17\n\x0flong_poll_token\x18\x06 \x01(\x0c\x12J\n\x14\x63ompletion_callbacks\x18\x07 \x03(\x0b\x32,.temporal.api.nexusoperation.v1.CallbackInfoB\t\n\x07outcome"\xa1\x01\n"PollNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x42\n\nwait_stage\x18\x04 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage"\x85\x02\n#PollNexusOperationExecutionResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\t\x12\x42\n\nwait_stage\x18\x02 \x01(\x0e\x32..temporal.api.enums.v1.NexusOperationWaitStage\x12\x17\n\x0foperation_token\x18\x03 \x01(\t\x12\x31\n\x06result\x18\x04 \x01(\x0b\x32\x1f.temporal.api.common.v1.PayloadH\x00\x12\x33\n\x07\x66\x61ilure\x18\x05 \x01(\x0b\x32 .temporal.api.failure.v1.FailureH\x00\x42\t\n\x07outcome"s\n#ListNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\x0c\x12\r\n\x05query\x18\x04 \x01(\t"\x8b\x01\n$ListNexusOperationExecutionsResponse\x12J\n\noperations\x18\x01 \x03(\x0b\x32\x36.temporal.api.nexus.v1.NexusOperationExecutionListInfo\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c"B\n\x1e\x43ountActivityExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xed\x01\n\x1f\x43ountActivityExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x61\n\x06groups\x18\x02 \x03(\x0b\x32Q.temporal.api.workflowservice.v1.CountActivityExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"H\n$CountNexusOperationExecutionsRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\r\n\x05query\x18\x02 \x01(\t"\xf9\x01\n%CountNexusOperationExecutionsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12g\n\x06groups\x18\x02 \x03(\x0b\x32W.temporal.api.workflowservice.v1.CountNexusOperationExecutionsResponse.AggregationGroup\x1aX\n\x10\x41ggregationGroup\x12\x35\n\x0cgroup_values\x18\x01 \x03(\x0b\x32\x1f.temporal.api.common.v1.Payload\x12\r\n\x05\x63ount\x18\x02 \x01(\x03"\x95\x01\n%RequestCancelActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"(\n&RequestCancelActivityExecutionResponse"\x91\x01\n!TerminateActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"$\n"TerminateActivityExecutionResponse"X\n\x1e\x44\x65leteActivityExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tivity_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"!\n\x1f\x44\x65leteActivityExecutionResponse"\x9c\x01\n+RequestCancelNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t".\n,RequestCancelNexusOperationExecutionResponse"\x98\x01\n\'TerminateNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t\x12\x10\n\x08identity\x18\x04 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\x12\x0e\n\x06reason\x18\x06 \x01(\t"*\n(TerminateNexusOperationExecutionResponse"_\n$DeleteNexusOperationExecutionRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x14\n\x0coperation_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\t"\'\n%DeleteNexusOperationExecutionResponse"\x9d\x01\n(PollWorkflowExecutionTimeSkippingRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x45\n\x12workflow_execution\x18\x02 \x01(\x0b\x32).temporal.api.common.v1.WorkflowExecution\x12\x17\n\x0f\x66\x61st_forward_id\x18\x03 \x01(\t"\xe8\x01\n)PollWorkflowExecutionTimeSkippingResponse\x12T\n\x1b\x66\x61st_forward_polling_result\x18\x01 \x01(\x0e\x32/.temporal.api.enums.v1.FastForwardPollingResult\x12\x15\n\rfailed_reason\x18\x02 \x01(\t\x12N\n\x11\x66\x61st_forward_info\x18\x03 \x01(\x0b\x32\x33.temporal.api.common.v1.TimeSkippingFastForwardInfoB\xbe\x01\n"io.temporal.api.workflowservice.v1B\x14RequestResponseProtoP\x01Z5go.temporal.io/api/workflowservice/v1;workflowservice\xaa\x02!Temporalio.Api.WorkflowService.V1\xea\x02$Temporalio::Api::WorkflowService::V1b\x06proto3' ) @@ -4348,598 +4351,598 @@ _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_options = b"8\001" _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._options = None _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_options = b"8\001" - _REGISTERNAMESPACEREQUEST._serialized_start = 1728 - _REGISTERNAMESPACEREQUEST._serialized_end = 2376 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2333 - _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2376 - _REGISTERNAMESPACERESPONSE._serialized_start = 2378 - _REGISTERNAMESPACERESPONSE._serialized_end = 2405 - _LISTNAMESPACESREQUEST._serialized_start = 2408 - _LISTNAMESPACESREQUEST._serialized_end = 2545 - _LISTNAMESPACESRESPONSE._serialized_start = 2548 - _LISTNAMESPACESRESPONSE._serialized_end = 2677 - _DESCRIBENAMESPACEREQUEST._serialized_start = 2679 - _DESCRIBENAMESPACEREQUEST._serialized_end = 2762 - _DESCRIBENAMESPACERESPONSE._serialized_start = 2765 - _DESCRIBENAMESPACERESPONSE._serialized_end = 3278 - _UPDATENAMESPACEREQUEST._serialized_start = 3281 - _UPDATENAMESPACEREQUEST._serialized_end = 3616 - _UPDATENAMESPACERESPONSE._serialized_start = 3619 - _UPDATENAMESPACERESPONSE._serialized_end = 3910 - _DEPRECATENAMESPACEREQUEST._serialized_start = 3912 - _DEPRECATENAMESPACEREQUEST._serialized_end = 3982 - _DEPRECATENAMESPACERESPONSE._serialized_start = 3984 - _DEPRECATENAMESPACERESPONSE._serialized_end = 4012 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4015 - _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5632 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5635 - _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5933 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5936 - _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6234 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6237 - _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6423 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6426 - _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6602 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6604 - _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6724 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6727 - _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7167 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7170 - _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8323 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8233 - _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8317 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8326 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9498 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9593 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9595 - _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9664 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9667 - _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9912 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9915 - _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10440 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10442 - _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10477 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10480 - _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 10966 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 10969 - _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12150 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12153 - _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12318 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12320 - _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12432 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12435 - _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12642 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12644 - _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12760 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12763 - _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13145 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13147 - _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13185 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13188 - _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13395 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13397 - _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13439 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13442 - _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13888 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13890 - _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 13977 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 13980 - _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14251 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14253 - _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14344 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14347 - _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14729 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14731 - _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14768 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14771 - _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15059 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15061 - _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15102 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15105 - _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15365 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15367 - _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15407 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15410 - _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15760 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15762 - _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 15839 - _NOTIFYCHANNELREQUEST._serialized_start = 15842 - _NOTIFYCHANNELREQUEST._serialized_end = 16041 - _NOTIFYCHANNELRESPONSE._serialized_start = 16043 - _NOTIFYCHANNELRESPONSE._serialized_end = 16090 - _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16093 - _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16305 - _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16307 - _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16361 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16364 - _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16527 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16529 - _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16564 - _POLLCHANNELREQUEST._serialized_start = 16567 - _POLLCHANNELREQUEST._serialized_end = 16768 - _POLLCHANNELRESPONSE._serialized_start = 16770 - _POLLCHANNELRESPONSE._serialized_end = 16858 - _DESCRIBECHANNELREQUEST._serialized_start = 16860 - _DESCRIBECHANNELREQUEST._serialized_end = 16974 - _DESCRIBECHANNELRESPONSE._serialized_start = 16977 - _DESCRIBECHANNELRESPONSE._serialized_end = 17263 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17266 - _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18605 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18608 - _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18766 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18769 - _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19218 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19220 - _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19268 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19271 - _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19558 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19560 - _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19596 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19598 - _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19720 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19722 - _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19755 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19758 - _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20087 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20090 - _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20220 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20223 - _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20617 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20620 - _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20752 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20754 - _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 20863 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20865 - _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20991 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20993 - _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21110 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21113 - _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21247 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21249 - _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21358 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21360 - _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21486 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21488 - _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21554 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21557 - _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21794 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 - _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 - _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21796 - _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21824 - _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21827 - _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22028 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 21944 - _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22028 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22031 - _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22392 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22394 - _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22429 - _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22431 - _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22541 - _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22543 - _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22573 - _SHUTDOWNWORKERREQUEST._serialized_start = 22576 - _SHUTDOWNWORKERREQUEST._serialized_end = 22859 - _SHUTDOWNWORKERRESPONSE._serialized_start = 22861 - _SHUTDOWNWORKERRESPONSE._serialized_end = 22885 - _QUERYWORKFLOWREQUEST._serialized_start = 22888 - _QUERYWORKFLOWREQUEST._serialized_end = 23121 - _QUERYWORKFLOWRESPONSE._serialized_start = 23124 - _QUERYWORKFLOWRESPONSE._serialized_end = 23309 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23311 - _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23426 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23429 - _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24176 - _DESCRIBETASKQUEUEREQUEST._serialized_start = 24179 - _DESCRIBETASKQUEUEREQUEST._serialized_end = 24707 - _DESCRIBETASKQUEUERESPONSE._serialized_start = 24710 - _DESCRIBETASKQUEUERESPONSE._serialized_end = 25714 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25394 - _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25494 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25496 - _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25612 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25614 - _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25714 - _GETCLUSTERINFOREQUEST._serialized_start = 25716 - _GETCLUSTERINFOREQUEST._serialized_end = 25739 - _GETCLUSTERINFORESPONSE._serialized_start = 25742 - _GETCLUSTERINFORESPONSE._serialized_end = 26207 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26152 - _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26207 - _GETSYSTEMINFOREQUEST._serialized_start = 26209 - _GETSYSTEMINFOREQUEST._serialized_end = 26231 - _GETSYSTEMINFORESPONSE._serialized_start = 26234 - _GETSYSTEMINFORESPONSE._serialized_end = 26811 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26375 - _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26811 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26813 - _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 26922 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 26925 - _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27148 - _CREATESCHEDULEREQUEST._serialized_start = 27151 - _CREATESCHEDULEREQUEST._serialized_end = 27483 - _CREATESCHEDULERESPONSE._serialized_start = 27485 - _CREATESCHEDULERESPONSE._serialized_end = 27533 - _DESCRIBESCHEDULEREQUEST._serialized_start = 27535 - _DESCRIBESCHEDULEREQUEST._serialized_end = 27600 - _DESCRIBESCHEDULERESPONSE._serialized_start = 27603 - _DESCRIBESCHEDULERESPONSE._serialized_end = 27874 - _UPDATESCHEDULEREQUEST._serialized_start = 27877 - _UPDATESCHEDULEREQUEST._serialized_end = 28169 - _UPDATESCHEDULERESPONSE._serialized_start = 28171 - _UPDATESCHEDULERESPONSE._serialized_end = 28195 - _PATCHSCHEDULEREQUEST._serialized_start = 28198 - _PATCHSCHEDULEREQUEST._serialized_end = 28354 - _PATCHSCHEDULERESPONSE._serialized_start = 28356 - _PATCHSCHEDULERESPONSE._serialized_end = 28379 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28382 - _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28550 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28552 - _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28635 - _DELETESCHEDULEREQUEST._serialized_start = 28637 - _DELETESCHEDULEREQUEST._serialized_end = 28718 - _DELETESCHEDULERESPONSE._serialized_start = 28720 - _DELETESCHEDULERESPONSE._serialized_end = 28744 - _LISTSCHEDULESREQUEST._serialized_start = 28746 - _LISTSCHEDULESREQUEST._serialized_end = 28854 - _LISTSCHEDULESRESPONSE._serialized_start = 28856 - _LISTSCHEDULESRESPONSE._serialized_end = 28968 - _COUNTSCHEDULESREQUEST._serialized_start = 28970 - _COUNTSCHEDULESREQUEST._serialized_end = 29027 - _COUNTSCHEDULESRESPONSE._serialized_start = 29030 - _COUNTSCHEDULESRESPONSE._serialized_end = 29249 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 - _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29252 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 29898 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29699 + _REGISTERNAMESPACEREQUEST._serialized_start = 1774 + _REGISTERNAMESPACEREQUEST._serialized_end = 2422 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_start = 2379 + _REGISTERNAMESPACEREQUEST_DATAENTRY._serialized_end = 2422 + _REGISTERNAMESPACERESPONSE._serialized_start = 2424 + _REGISTERNAMESPACERESPONSE._serialized_end = 2451 + _LISTNAMESPACESREQUEST._serialized_start = 2454 + _LISTNAMESPACESREQUEST._serialized_end = 2591 + _LISTNAMESPACESRESPONSE._serialized_start = 2594 + _LISTNAMESPACESRESPONSE._serialized_end = 2723 + _DESCRIBENAMESPACEREQUEST._serialized_start = 2725 + _DESCRIBENAMESPACEREQUEST._serialized_end = 2808 + _DESCRIBENAMESPACERESPONSE._serialized_start = 2811 + _DESCRIBENAMESPACERESPONSE._serialized_end = 3324 + _UPDATENAMESPACEREQUEST._serialized_start = 3327 + _UPDATENAMESPACEREQUEST._serialized_end = 3662 + _UPDATENAMESPACERESPONSE._serialized_start = 3665 + _UPDATENAMESPACERESPONSE._serialized_end = 3956 + _DEPRECATENAMESPACEREQUEST._serialized_start = 3958 + _DEPRECATENAMESPACEREQUEST._serialized_end = 4028 + _DEPRECATENAMESPACERESPONSE._serialized_start = 4030 + _DEPRECATENAMESPACERESPONSE._serialized_end = 4058 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_start = 4061 + _STARTWORKFLOWEXECUTIONREQUEST._serialized_end = 5678 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 5681 + _STARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 5979 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_start = 5982 + _GETWORKFLOWEXECUTIONHISTORYREQUEST._serialized_end = 6280 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_start = 6283 + _GETWORKFLOWEXECUTIONHISTORYRESPONSE._serialized_end = 6469 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_start = 6472 + _GETWORKFLOWEXECUTIONHISTORYREVERSEREQUEST._serialized_end = 6648 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_start = 6650 + _GETWORKFLOWEXECUTIONHISTORYREVERSERESPONSE._serialized_end = 6770 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_start = 6773 + _POLLWORKFLOWTASKQUEUEREQUEST._serialized_end = 7213 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_start = 7216 + _POLLWORKFLOWTASKQUEUERESPONSE._serialized_end = 8369 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_start = 8279 + _POLLWORKFLOWTASKQUEUERESPONSE_QUERIESENTRY._serialized_end = 8363 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_start = 8372 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_start = 9544 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_QUERYRESULTSENTRY._serialized_end = 9639 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_start = 9641 + _RESPONDWORKFLOWTASKCOMPLETEDREQUEST_CAPABILITIES._serialized_end = 9710 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_start = 9713 + _RESPONDWORKFLOWTASKCOMPLETEDRESPONSE._serialized_end = 9958 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_start = 9961 + _RESPONDWORKFLOWTASKFAILEDREQUEST._serialized_end = 10486 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_start = 10488 + _RESPONDWORKFLOWTASKFAILEDRESPONSE._serialized_end = 10523 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_start = 10526 + _POLLACTIVITYTASKQUEUEREQUEST._serialized_end = 11012 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_start = 11015 + _POLLACTIVITYTASKQUEUERESPONSE._serialized_end = 12196 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_start = 12199 + _RECORDACTIVITYTASKHEARTBEATREQUEST._serialized_end = 12364 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_start = 12366 + _RECORDACTIVITYTASKHEARTBEATRESPONSE._serialized_end = 12478 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_start = 12481 + _RECORDACTIVITYTASKHEARTBEATBYIDREQUEST._serialized_end = 12688 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_start = 12690 + _RECORDACTIVITYTASKHEARTBEATBYIDRESPONSE._serialized_end = 12806 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_start = 12809 + _RESPONDACTIVITYTASKCOMPLETEDREQUEST._serialized_end = 13191 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_start = 13193 + _RESPONDACTIVITYTASKCOMPLETEDRESPONSE._serialized_end = 13231 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_start = 13234 + _RESPONDACTIVITYTASKCOMPLETEDBYIDREQUEST._serialized_end = 13441 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_start = 13443 + _RESPONDACTIVITYTASKCOMPLETEDBYIDRESPONSE._serialized_end = 13485 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_start = 13488 + _RESPONDACTIVITYTASKFAILEDREQUEST._serialized_end = 13997 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_start = 13999 + _RESPONDACTIVITYTASKFAILEDRESPONSE._serialized_end = 14086 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_start = 14089 + _RESPONDACTIVITYTASKFAILEDBYIDREQUEST._serialized_end = 14423 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_start = 14425 + _RESPONDACTIVITYTASKFAILEDBYIDRESPONSE._serialized_end = 14516 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_start = 14519 + _RESPONDACTIVITYTASKCANCELEDREQUEST._serialized_end = 14901 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_start = 14903 + _RESPONDACTIVITYTASKCANCELEDRESPONSE._serialized_end = 14940 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_start = 14943 + _RESPONDACTIVITYTASKCANCELEDBYIDREQUEST._serialized_end = 15231 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_start = 15233 + _RESPONDACTIVITYTASKCANCELEDBYIDRESPONSE._serialized_end = 15274 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_start = 15277 + _REQUESTCANCELWORKFLOWEXECUTIONREQUEST._serialized_end = 15537 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_start = 15539 + _REQUESTCANCELWORKFLOWEXECUTIONRESPONSE._serialized_end = 15579 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_start = 15582 + _SIGNALWORKFLOWEXECUTIONREQUEST._serialized_end = 15932 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_start = 15934 + _SIGNALWORKFLOWEXECUTIONRESPONSE._serialized_end = 16011 + _NOTIFYCHANNELREQUEST._serialized_start = 16014 + _NOTIFYCHANNELREQUEST._serialized_end = 16213 + _NOTIFYCHANNELRESPONSE._serialized_start = 16215 + _NOTIFYCHANNELRESPONSE._serialized_end = 16262 + _REGISTERCHANNELLISTENERREQUEST._serialized_start = 16265 + _REGISTERCHANNELLISTENERREQUEST._serialized_end = 16477 + _REGISTERCHANNELLISTENERRESPONSE._serialized_start = 16479 + _REGISTERCHANNELLISTENERRESPONSE._serialized_end = 16533 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_start = 16536 + _UNREGISTERCHANNELLISTENERREQUEST._serialized_end = 16699 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_start = 16701 + _UNREGISTERCHANNELLISTENERRESPONSE._serialized_end = 16736 + _POLLCHANNELREQUEST._serialized_start = 16739 + _POLLCHANNELREQUEST._serialized_end = 16940 + _POLLCHANNELRESPONSE._serialized_start = 16942 + _POLLCHANNELRESPONSE._serialized_end = 17030 + _DESCRIBECHANNELREQUEST._serialized_start = 17032 + _DESCRIBECHANNELREQUEST._serialized_end = 17146 + _DESCRIBECHANNELRESPONSE._serialized_start = 17149 + _DESCRIBECHANNELRESPONSE._serialized_end = 17435 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_start = 17438 + _SIGNALWITHSTARTWORKFLOWEXECUTIONREQUEST._serialized_end = 18777 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_start = 18780 + _SIGNALWITHSTARTWORKFLOWEXECUTIONRESPONSE._serialized_end = 18938 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_start = 18941 + _RESETWORKFLOWEXECUTIONREQUEST._serialized_end = 19390 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_start = 19392 + _RESETWORKFLOWEXECUTIONRESPONSE._serialized_end = 19440 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_start = 19443 + _TERMINATEWORKFLOWEXECUTIONREQUEST._serialized_end = 19730 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19732 + _TERMINATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19768 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_start = 19770 + _DELETEWORKFLOWEXECUTIONREQUEST._serialized_end = 19892 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_start = 19894 + _DELETEWORKFLOWEXECUTIONRESPONSE._serialized_end = 19927 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_start = 19930 + _LISTOPENWORKFLOWEXECUTIONSREQUEST._serialized_end = 20259 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20262 + _LISTOPENWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20392 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 20395 + _LISTCLOSEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 20789 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 20792 + _LISTCLOSEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 20924 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_start = 20926 + _LISTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21035 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21037 + _LISTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21163 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_start = 21165 + _LISTARCHIVEDWORKFLOWEXECUTIONSREQUEST._serialized_end = 21282 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21285 + _LISTARCHIVEDWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21419 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_start = 21421 + _SCANWORKFLOWEXECUTIONSREQUEST._serialized_end = 21530 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21532 + _SCANWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21658 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_start = 21660 + _COUNTWORKFLOWEXECUTIONSREQUEST._serialized_end = 21726 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_start = 21729 + _COUNTWORKFLOWEXECUTIONSRESPONSE._serialized_end = 21966 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21878 + _COUNTWORKFLOWEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21966 + _GETSEARCHATTRIBUTESREQUEST._serialized_start = 21968 + _GETSEARCHATTRIBUTESREQUEST._serialized_end = 21996 + _GETSEARCHATTRIBUTESRESPONSE._serialized_start = 21999 + _GETSEARCHATTRIBUTESRESPONSE._serialized_end = 22200 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_start = 22116 + _GETSEARCHATTRIBUTESRESPONSE_KEYSENTRY._serialized_end = 22200 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_start = 22203 + _RESPONDQUERYTASKCOMPLETEDREQUEST._serialized_end = 22564 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_start = 22566 + _RESPONDQUERYTASKCOMPLETEDRESPONSE._serialized_end = 22601 + _RESETSTICKYTASKQUEUEREQUEST._serialized_start = 22603 + _RESETSTICKYTASKQUEUEREQUEST._serialized_end = 22713 + _RESETSTICKYTASKQUEUERESPONSE._serialized_start = 22715 + _RESETSTICKYTASKQUEUERESPONSE._serialized_end = 22745 + _SHUTDOWNWORKERREQUEST._serialized_start = 22748 + _SHUTDOWNWORKERREQUEST._serialized_end = 23031 + _SHUTDOWNWORKERRESPONSE._serialized_start = 23033 + _SHUTDOWNWORKERRESPONSE._serialized_end = 23057 + _QUERYWORKFLOWREQUEST._serialized_start = 23060 + _QUERYWORKFLOWREQUEST._serialized_end = 23293 + _QUERYWORKFLOWRESPONSE._serialized_start = 23296 + _QUERYWORKFLOWRESPONSE._serialized_end = 23481 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_start = 23483 + _DESCRIBEWORKFLOWEXECUTIONREQUEST._serialized_end = 23598 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_start = 23601 + _DESCRIBEWORKFLOWEXECUTIONRESPONSE._serialized_end = 24348 + _DESCRIBETASKQUEUEREQUEST._serialized_start = 24351 + _DESCRIBETASKQUEUEREQUEST._serialized_end = 24879 + _DESCRIBETASKQUEUERESPONSE._serialized_start = 24882 + _DESCRIBETASKQUEUERESPONSE._serialized_end = 25886 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_start = 25566 + _DESCRIBETASKQUEUERESPONSE_STATSBYPRIORITYKEYENTRY._serialized_end = 25666 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_start = 25668 + _DESCRIBETASKQUEUERESPONSE_EFFECTIVERATELIMIT._serialized_end = 25784 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_start = 25786 + _DESCRIBETASKQUEUERESPONSE_VERSIONSINFOENTRY._serialized_end = 25886 + _GETCLUSTERINFOREQUEST._serialized_start = 25888 + _GETCLUSTERINFOREQUEST._serialized_end = 25911 + _GETCLUSTERINFORESPONSE._serialized_start = 25914 + _GETCLUSTERINFORESPONSE._serialized_end = 26379 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_start = 26324 + _GETCLUSTERINFORESPONSE_SUPPORTEDCLIENTSENTRY._serialized_end = 26379 + _GETSYSTEMINFOREQUEST._serialized_start = 26381 + _GETSYSTEMINFOREQUEST._serialized_end = 26403 + _GETSYSTEMINFORESPONSE._serialized_start = 26406 + _GETSYSTEMINFORESPONSE._serialized_end = 26983 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_start = 26547 + _GETSYSTEMINFORESPONSE_CAPABILITIES._serialized_end = 26983 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_start = 26985 + _LISTTASKQUEUEPARTITIONSREQUEST._serialized_end = 27094 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_start = 27097 + _LISTTASKQUEUEPARTITIONSRESPONSE._serialized_end = 27320 + _CREATESCHEDULEREQUEST._serialized_start = 27323 + _CREATESCHEDULEREQUEST._serialized_end = 27655 + _CREATESCHEDULERESPONSE._serialized_start = 27657 + _CREATESCHEDULERESPONSE._serialized_end = 27705 + _DESCRIBESCHEDULEREQUEST._serialized_start = 27707 + _DESCRIBESCHEDULEREQUEST._serialized_end = 27772 + _DESCRIBESCHEDULERESPONSE._serialized_start = 27775 + _DESCRIBESCHEDULERESPONSE._serialized_end = 28046 + _UPDATESCHEDULEREQUEST._serialized_start = 28049 + _UPDATESCHEDULEREQUEST._serialized_end = 28341 + _UPDATESCHEDULERESPONSE._serialized_start = 28343 + _UPDATESCHEDULERESPONSE._serialized_end = 28367 + _PATCHSCHEDULEREQUEST._serialized_start = 28370 + _PATCHSCHEDULEREQUEST._serialized_end = 28526 + _PATCHSCHEDULERESPONSE._serialized_start = 28528 + _PATCHSCHEDULERESPONSE._serialized_end = 28551 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_start = 28554 + _LISTSCHEDULEMATCHINGTIMESREQUEST._serialized_end = 28722 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_start = 28724 + _LISTSCHEDULEMATCHINGTIMESRESPONSE._serialized_end = 28807 + _DELETESCHEDULEREQUEST._serialized_start = 28809 + _DELETESCHEDULEREQUEST._serialized_end = 28890 + _DELETESCHEDULERESPONSE._serialized_start = 28892 + _DELETESCHEDULERESPONSE._serialized_end = 28916 + _LISTSCHEDULESREQUEST._serialized_start = 28918 + _LISTSCHEDULESREQUEST._serialized_end = 29026 + _LISTSCHEDULESRESPONSE._serialized_start = 29028 + _LISTSCHEDULESRESPONSE._serialized_end = 29140 + _COUNTSCHEDULESREQUEST._serialized_start = 29142 + _COUNTSCHEDULESREQUEST._serialized_end = 29199 + _COUNTSCHEDULESRESPONSE._serialized_start = 29202 + _COUNTSCHEDULESRESPONSE._serialized_end = 29421 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_start = 21878 + _COUNTSCHEDULESRESPONSE_AGGREGATIONGROUP._serialized_end = 21966 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29424 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30070 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_start = 29871 _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_ADDNEWCOMPATIBLEVERSION._serialized_end = ( - 29810 + 29982 ) - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29812 - _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 29885 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 29900 - _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 29964 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 29966 - _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30061 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30063 - _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30179 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30182 - _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 31899 - _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31234 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_start = 29984 + _UPDATEWORKERBUILDIDCOMPATIBILITYREQUEST_MERGESETS._serialized_end = 30057 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30072 + _UPDATEWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30136 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_start = 30138 + _GETWORKERBUILDIDCOMPATIBILITYREQUEST._serialized_end = 30233 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_start = 30235 + _GETWORKERBUILDIDCOMPATIBILITYRESPONSE._serialized_end = 30351 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_start = 30354 + _UPDATEWORKERVERSIONINGRULESREQUEST._serialized_end = 32071 + _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_start = 31406 _UPDATEWORKERVERSIONINGRULESREQUEST_INSERTBUILDIDASSIGNMENTRULE._serialized_end = ( - 31347 + 31519 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31350 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_start = 31522 _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31479 + 31651 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31481 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_start = 31653 _UPDATEWORKERVERSIONINGRULESREQUEST_DELETEBUILDIDASSIGNMENTRULE._serialized_end = ( - 31545 + 31717 ) - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31547 - _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31653 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31655 - _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31765 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31767 - _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31829 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 31831 - _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 31886 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 31902 - _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32154 - _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32156 - _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32228 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32231 - _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32480 - _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32483 - _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32639 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32641 - _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32755 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32758 - _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33019 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33022 - _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33281 - _STARTBATCHOPERATIONREQUEST._serialized_start = 33284 - _STARTBATCHOPERATIONREQUEST._serialized_end = 34650 - _STARTBATCHOPERATIONRESPONSE._serialized_start = 34652 - _STARTBATCHOPERATIONRESPONSE._serialized_end = 34681 - _STOPBATCHOPERATIONREQUEST._serialized_start = 34683 - _STOPBATCHOPERATIONREQUEST._serialized_end = 34779 - _STOPBATCHOPERATIONRESPONSE._serialized_start = 34781 - _STOPBATCHOPERATIONRESPONSE._serialized_end = 34809 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34811 - _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 34877 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 34880 - _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35352 - _LISTBATCHOPERATIONSREQUEST._serialized_start = 35354 - _LISTBATCHOPERATIONSREQUEST._serialized_end = 35445 - _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35447 - _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35568 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35571 - _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35756 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35759 - _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 35978 - _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 35981 - _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36397 - _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36400 - _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36754 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36757 - _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 36924 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 36926 - _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 36961 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 36964 - _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37184 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37186 - _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37218 - _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37221 - _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37593 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37387 - _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37593 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37596 - _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 37928 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37722 - _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 37928 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 37931 - _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38267 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38270 - _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38589 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38591 - _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38691 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38693 - _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38802 - _PAUSEACTIVITYREQUEST._serialized_start = 38805 - _PAUSEACTIVITYREQUEST._serialized_end = 39004 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39007 - _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39190 - _PAUSEACTIVITYRESPONSE._serialized_start = 39192 - _PAUSEACTIVITYRESPONSE._serialized_end = 39215 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39217 - _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39249 - _UNPAUSEACTIVITYREQUEST._serialized_start = 39252 - _UNPAUSEACTIVITYREQUEST._serialized_end = 39532 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39535 - _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39808 - _UNPAUSEACTIVITYRESPONSE._serialized_start = 39810 - _UNPAUSEACTIVITYRESPONSE._serialized_end = 39835 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39837 - _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39871 - _RESETACTIVITYREQUEST._serialized_start = 39874 - _RESETACTIVITYREQUEST._serialized_end = 40181 - _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40184 - _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40474 - _RESETACTIVITYRESPONSE._serialized_start = 40476 - _RESETACTIVITYRESPONSE._serialized_end = 40499 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40501 - _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40533 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40536 - _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40820 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40823 - _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41000 - _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41002 - _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41108 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41110 - _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41207 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41210 - _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41404 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41407 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42059 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41668 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42059 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25394 - _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25494 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42061 - _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42138 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42141 - _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42281 - _LISTDEPLOYMENTSREQUEST._serialized_start = 42283 - _LISTDEPLOYMENTSREQUEST._serialized_end = 42391 - _LISTDEPLOYMENTSRESPONSE._serialized_start = 42393 - _LISTDEPLOYMENTSRESPONSE._serialized_end = 42512 - _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42515 - _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42720 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42723 - _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 42908 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 42911 - _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43140 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43143 - _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43334 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43337 - _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43586 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43589 - _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43813 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43815 - _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 43928 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 43930 - _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 43986 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 43988 - _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44081 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44084 - _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44755 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44259 - _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44755 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44758 - _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 44998 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45000 - _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45039 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45042 - _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45242 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45244 - _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45283 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45285 - _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45378 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45380 - _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45412 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45415 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 45931 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45808 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45931 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 45933 - _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 45985 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45988 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46488 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45808 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 45931 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46490 - _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46544 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46547 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 46965 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 46880 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31719 + _UPDATEWORKERVERSIONINGRULESREQUEST_ADDCOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31825 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31827 + _UPDATEWORKERVERSIONINGRULESREQUEST_REPLACECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 31937 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_start = 31939 + _UPDATEWORKERVERSIONINGRULESREQUEST_DELETECOMPATIBLEBUILDIDREDIRECTRULE._serialized_end = 32001 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_start = 32003 + _UPDATEWORKERVERSIONINGRULESREQUEST_COMMITBUILDID._serialized_end = 32058 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_start = 32074 + _UPDATEWORKERVERSIONINGRULESRESPONSE._serialized_end = 32326 + _GETWORKERVERSIONINGRULESREQUEST._serialized_start = 32328 + _GETWORKERVERSIONINGRULESREQUEST._serialized_end = 32400 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_start = 32403 + _GETWORKERVERSIONINGRULESRESPONSE._serialized_end = 32652 + _GETWORKERTASKREACHABILITYREQUEST._serialized_start = 32655 + _GETWORKERTASKREACHABILITYREQUEST._serialized_end = 32811 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_start = 32813 + _GETWORKERTASKREACHABILITYRESPONSE._serialized_end = 32927 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_start = 32930 + _UPDATEWORKFLOWEXECUTIONREQUEST._serialized_end = 33191 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_start = 33194 + _UPDATEWORKFLOWEXECUTIONRESPONSE._serialized_end = 33453 + _STARTBATCHOPERATIONREQUEST._serialized_start = 33456 + _STARTBATCHOPERATIONREQUEST._serialized_end = 34822 + _STARTBATCHOPERATIONRESPONSE._serialized_start = 34824 + _STARTBATCHOPERATIONRESPONSE._serialized_end = 34853 + _STOPBATCHOPERATIONREQUEST._serialized_start = 34855 + _STOPBATCHOPERATIONREQUEST._serialized_end = 34951 + _STOPBATCHOPERATIONRESPONSE._serialized_start = 34953 + _STOPBATCHOPERATIONRESPONSE._serialized_end = 34981 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_start = 34983 + _DESCRIBEBATCHOPERATIONREQUEST._serialized_end = 35049 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_start = 35052 + _DESCRIBEBATCHOPERATIONRESPONSE._serialized_end = 35524 + _LISTBATCHOPERATIONSREQUEST._serialized_start = 35526 + _LISTBATCHOPERATIONSREQUEST._serialized_end = 35617 + _LISTBATCHOPERATIONSRESPONSE._serialized_start = 35619 + _LISTBATCHOPERATIONSRESPONSE._serialized_end = 35740 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_start = 35743 + _POLLWORKFLOWEXECUTIONUPDATEREQUEST._serialized_end = 35928 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_start = 35931 + _POLLWORKFLOWEXECUTIONUPDATERESPONSE._serialized_end = 36150 + _POLLNEXUSTASKQUEUEREQUEST._serialized_start = 36153 + _POLLNEXUSTASKQUEUEREQUEST._serialized_end = 36569 + _POLLNEXUSTASKQUEUERESPONSE._serialized_start = 36572 + _POLLNEXUSTASKQUEUERESPONSE._serialized_end = 36926 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_start = 36929 + _RESPONDNEXUSTASKCOMPLETEDREQUEST._serialized_end = 37096 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_start = 37098 + _RESPONDNEXUSTASKCOMPLETEDRESPONSE._serialized_end = 37133 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_start = 37136 + _RESPONDNEXUSTASKFAILEDREQUEST._serialized_end = 37356 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_start = 37358 + _RESPONDNEXUSTASKFAILEDRESPONSE._serialized_end = 37390 + _EXECUTEMULTIOPERATIONREQUEST._serialized_start = 37393 + _EXECUTEMULTIOPERATIONREQUEST._serialized_end = 37765 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_start = 37559 + _EXECUTEMULTIOPERATIONREQUEST_OPERATION._serialized_end = 37765 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_start = 37768 + _EXECUTEMULTIOPERATIONRESPONSE._serialized_end = 38100 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_start = 37894 + _EXECUTEMULTIOPERATIONRESPONSE_RESPONSE._serialized_end = 38100 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_start = 38103 + _UPDATEACTIVITYOPTIONSREQUEST._serialized_end = 38439 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_start = 38442 + _UPDATEACTIVITYEXECUTIONOPTIONSREQUEST._serialized_end = 38761 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_start = 38763 + _UPDATEACTIVITYOPTIONSRESPONSE._serialized_end = 38863 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_start = 38865 + _UPDATEACTIVITYEXECUTIONOPTIONSRESPONSE._serialized_end = 38974 + _PAUSEACTIVITYREQUEST._serialized_start = 38977 + _PAUSEACTIVITYREQUEST._serialized_end = 39176 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39179 + _PAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39362 + _PAUSEACTIVITYRESPONSE._serialized_start = 39364 + _PAUSEACTIVITYRESPONSE._serialized_end = 39387 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 39389 + _PAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 39421 + _UNPAUSEACTIVITYREQUEST._serialized_start = 39424 + _UNPAUSEACTIVITYREQUEST._serialized_end = 39704 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_start = 39707 + _UNPAUSEACTIVITYEXECUTIONREQUEST._serialized_end = 39980 + _UNPAUSEACTIVITYRESPONSE._serialized_start = 39982 + _UNPAUSEACTIVITYRESPONSE._serialized_end = 40007 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_start = 40009 + _UNPAUSEACTIVITYEXECUTIONRESPONSE._serialized_end = 40043 + _RESETACTIVITYREQUEST._serialized_start = 40046 + _RESETACTIVITYREQUEST._serialized_end = 40353 + _RESETACTIVITYEXECUTIONREQUEST._serialized_start = 40356 + _RESETACTIVITYEXECUTIONREQUEST._serialized_end = 40646 + _RESETACTIVITYRESPONSE._serialized_start = 40648 + _RESETACTIVITYRESPONSE._serialized_end = 40671 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_start = 40673 + _RESETACTIVITYEXECUTIONRESPONSE._serialized_end = 40705 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_start = 40708 + _UPDATEWORKFLOWEXECUTIONOPTIONSREQUEST._serialized_end = 40992 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_start = 40995 + _UPDATEWORKFLOWEXECUTIONOPTIONSRESPONSE._serialized_end = 41172 + _DESCRIBEDEPLOYMENTREQUEST._serialized_start = 41174 + _DESCRIBEDEPLOYMENTREQUEST._serialized_end = 41280 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_start = 41282 + _DESCRIBEDEPLOYMENTRESPONSE._serialized_end = 41379 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 41382 + _DESCRIBEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 41576 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 41579 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 42231 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_start = 41840 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE._serialized_end = 42231 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_start = 25566 + _DESCRIBEWORKERDEPLOYMENTVERSIONRESPONSE_VERSIONTASKQUEUE_STATSBYPRIORITYKEYENTRY._serialized_end = 25666 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_start = 42233 + _DESCRIBEWORKERDEPLOYMENTREQUEST._serialized_end = 42310 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_start = 42313 + _DESCRIBEWORKERDEPLOYMENTRESPONSE._serialized_end = 42453 + _LISTDEPLOYMENTSREQUEST._serialized_start = 42455 + _LISTDEPLOYMENTSREQUEST._serialized_end = 42563 + _LISTDEPLOYMENTSRESPONSE._serialized_start = 42565 + _LISTDEPLOYMENTSRESPONSE._serialized_end = 42684 + _SETCURRENTDEPLOYMENTREQUEST._serialized_start = 42687 + _SETCURRENTDEPLOYMENTREQUEST._serialized_end = 42892 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_start = 42895 + _SETCURRENTDEPLOYMENTRESPONSE._serialized_end = 43080 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_start = 43083 + _SETWORKERDEPLOYMENTCURRENTVERSIONREQUEST._serialized_end = 43312 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_start = 43315 + _SETWORKERDEPLOYMENTCURRENTVERSIONRESPONSE._serialized_end = 43506 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_start = 43509 + _SETWORKERDEPLOYMENTRAMPINGVERSIONREQUEST._serialized_end = 43758 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_start = 43761 + _SETWORKERDEPLOYMENTRAMPINGVERSIONRESPONSE._serialized_end = 43985 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_start = 43987 + _CREATEWORKERDEPLOYMENTREQUEST._serialized_end = 44100 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_start = 44102 + _CREATEWORKERDEPLOYMENTRESPONSE._serialized_end = 44158 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_start = 44160 + _LISTWORKERDEPLOYMENTSREQUEST._serialized_end = 44253 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_start = 44256 + _LISTWORKERDEPLOYMENTSRESPONSE._serialized_end = 44927 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_start = 44431 + _LISTWORKERDEPLOYMENTSRESPONSE_WORKERDEPLOYMENTSUMMARY._serialized_end = 44927 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 44930 + _CREATEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45170 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45172 + _CREATEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45211 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_start = 45214 + _DELETEWORKERDEPLOYMENTVERSIONREQUEST._serialized_end = 45414 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_start = 45416 + _DELETEWORKERDEPLOYMENTVERSIONRESPONSE._serialized_end = 45455 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_start = 45457 + _DELETEWORKERDEPLOYMENTREQUEST._serialized_end = 45550 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_start = 45552 + _DELETEWORKERDEPLOYMENTRESPONSE._serialized_end = 45584 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 45587 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46103 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45980 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46103 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46105 + _UPDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46157 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_start = 46160 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST._serialized_end = 46660 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_start = 45980 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGREQUEST_COMPUTECONFIGSCALINGGROUPSENTRY._serialized_end = 46103 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_start = 46662 + _VALIDATEWORKERDEPLOYMENTVERSIONCOMPUTECONFIGRESPONSE._serialized_end = 46716 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_start = 46719 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST._serialized_end = 47137 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_start = 47052 _UPDATEWORKERDEPLOYMENTVERSIONMETADATAREQUEST_UPSERTENTRIESENTRY._serialized_end = ( - 46965 + 47137 ) - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 46967 - _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47077 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47080 - _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47269 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47271 - _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47370 - _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47372 - _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47441 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47443 - _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47550 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47552 - _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47665 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47668 - _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 47895 - _CREATEWORKFLOWRULEREQUEST._serialized_start = 47898 - _CREATEWORKFLOWRULEREQUEST._serialized_end = 48078 - _CREATEWORKFLOWRULERESPONSE._serialized_start = 48080 - _CREATEWORKFLOWRULERESPONSE._serialized_end = 48175 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48177 - _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48242 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48244 - _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48325 - _DELETEWORKFLOWRULEREQUEST._serialized_start = 48327 - _DELETEWORKFLOWRULEREQUEST._serialized_end = 48390 - _DELETEWORKFLOWRULERESPONSE._serialized_start = 48392 - _DELETEWORKFLOWRULERESPONSE._serialized_end = 48420 - _LISTWORKFLOWRULESREQUEST._serialized_start = 48422 - _LISTWORKFLOWRULESREQUEST._serialized_end = 48492 - _LISTWORKFLOWRULESRESPONSE._serialized_start = 48494 - _LISTWORKFLOWRULESRESPONSE._serialized_end = 48598 - _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48601 - _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48807 - _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48809 - _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 48855 - _RECORDWORKERHEARTBEATREQUEST._serialized_start = 48858 - _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49013 - _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49015 - _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49046 - _LISTWORKERSREQUEST._serialized_start = 49049 - _LISTWORKERSREQUEST._serialized_end = 49179 - _LISTWORKERSRESPONSE._serialized_start = 49182 - _LISTWORKERSRESPONSE._serialized_end = 49347 - _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49350 - _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50075 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 49917 - _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50008 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_start = 47139 + _UPDATEWORKERDEPLOYMENTVERSIONMETADATARESPONSE._serialized_end = 47249 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_start = 47252 + _SETWORKERDEPLOYMENTMANAGERREQUEST._serialized_end = 47441 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_start = 47443 + _SETWORKERDEPLOYMENTMANAGERRESPONSE._serialized_end = 47542 + _GETCURRENTDEPLOYMENTREQUEST._serialized_start = 47544 + _GETCURRENTDEPLOYMENTREQUEST._serialized_end = 47613 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_start = 47615 + _GETCURRENTDEPLOYMENTRESPONSE._serialized_end = 47722 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_start = 47724 + _GETDEPLOYMENTREACHABILITYREQUEST._serialized_end = 47837 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_start = 47840 + _GETDEPLOYMENTREACHABILITYRESPONSE._serialized_end = 48067 + _CREATEWORKFLOWRULEREQUEST._serialized_start = 48070 + _CREATEWORKFLOWRULEREQUEST._serialized_end = 48250 + _CREATEWORKFLOWRULERESPONSE._serialized_start = 48252 + _CREATEWORKFLOWRULERESPONSE._serialized_end = 48347 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_start = 48349 + _DESCRIBEWORKFLOWRULEREQUEST._serialized_end = 48414 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_start = 48416 + _DESCRIBEWORKFLOWRULERESPONSE._serialized_end = 48497 + _DELETEWORKFLOWRULEREQUEST._serialized_start = 48499 + _DELETEWORKFLOWRULEREQUEST._serialized_end = 48562 + _DELETEWORKFLOWRULERESPONSE._serialized_start = 48564 + _DELETEWORKFLOWRULERESPONSE._serialized_end = 48592 + _LISTWORKFLOWRULESREQUEST._serialized_start = 48594 + _LISTWORKFLOWRULESREQUEST._serialized_end = 48664 + _LISTWORKFLOWRULESRESPONSE._serialized_start = 48666 + _LISTWORKFLOWRULESRESPONSE._serialized_end = 48770 + _TRIGGERWORKFLOWRULEREQUEST._serialized_start = 48773 + _TRIGGERWORKFLOWRULEREQUEST._serialized_end = 48979 + _TRIGGERWORKFLOWRULERESPONSE._serialized_start = 48981 + _TRIGGERWORKFLOWRULERESPONSE._serialized_end = 49027 + _RECORDWORKERHEARTBEATREQUEST._serialized_start = 49030 + _RECORDWORKERHEARTBEATREQUEST._serialized_end = 49185 + _RECORDWORKERHEARTBEATRESPONSE._serialized_start = 49187 + _RECORDWORKERHEARTBEATRESPONSE._serialized_end = 49218 + _LISTWORKERSREQUEST._serialized_start = 49221 + _LISTWORKERSREQUEST._serialized_end = 49351 + _LISTWORKERSRESPONSE._serialized_start = 49354 + _LISTWORKERSRESPONSE._serialized_end = 49519 + _UPDATETASKQUEUECONFIGREQUEST._serialized_start = 49522 + _UPDATETASKQUEUECONFIGREQUEST._serialized_end = 50247 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_start = 50089 + _UPDATETASKQUEUECONFIGREQUEST_RATELIMITUPDATE._serialized_end = 50180 _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_start = ( - 50010 + 50182 ) _UPDATETASKQUEUECONFIGREQUEST_SETFAIRNESSWEIGHTOVERRIDESENTRY._serialized_end = ( - 50075 + 50247 ) - _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50077 - _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50168 - _FETCHWORKERCONFIGREQUEST._serialized_start = 50171 - _FETCHWORKERCONFIGREQUEST._serialized_end = 50329 - _FETCHWORKERCONFIGRESPONSE._serialized_start = 50331 - _FETCHWORKERCONFIGRESPONSE._serialized_end = 50416 - _UPDATEWORKERCONFIGREQUEST._serialized_start = 50419 - _UPDATEWORKERCONFIGREQUEST._serialized_end = 50685 - _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50687 - _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50787 - _DESCRIBEWORKERREQUEST._serialized_start = 50789 - _DESCRIBEWORKERREQUEST._serialized_end = 50860 - _DESCRIBEWORKERRESPONSE._serialized_start = 50862 - _DESCRIBEWORKERRESPONSE._serialized_end = 50943 - _COUNTWORKERSREQUEST._serialized_start = 50945 - _COUNTWORKERSREQUEST._serialized_end = 51032 - _COUNTWORKERSRESPONSE._serialized_start = 51034 - _COUNTWORKERSRESPONSE._serialized_end = 51071 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51074 - _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51215 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51217 - _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51249 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51252 - _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51395 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51397 - _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51431 - _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51434 - _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52611 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52613 - _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52722 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52725 - _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 52953 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 52956 - _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53272 - _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53274 - _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53360 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53362 - _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53478 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53480 - _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53589 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53592 - _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53722 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53725 - _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54574 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54524 - _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54574 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54576 - _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 54647 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 54650 - _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54820 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54823 - _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55134 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55137 - _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55298 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55301 - _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55562 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 55564 - _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 55679 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 55682 - _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 55821 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 55823 - _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 55889 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 55892 - _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56129 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 - _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56131 - _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56203 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56206 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56455 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21706 - _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21794 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56458 - _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 56607 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 56609 - _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 56649 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 56652 - _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 56797 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 56799 - _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 56835 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 56837 - _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 56925 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 56927 - _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 56960 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 56963 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57119 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57121 - _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57167 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57170 - _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57322 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57324 - _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57366 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57368 - _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57463 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57465 - _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57504 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57507 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 57664 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 57667 - _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 57899 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_start = 50249 + _UPDATETASKQUEUECONFIGRESPONSE._serialized_end = 50340 + _FETCHWORKERCONFIGREQUEST._serialized_start = 50343 + _FETCHWORKERCONFIGREQUEST._serialized_end = 50501 + _FETCHWORKERCONFIGRESPONSE._serialized_start = 50503 + _FETCHWORKERCONFIGRESPONSE._serialized_end = 50588 + _UPDATEWORKERCONFIGREQUEST._serialized_start = 50591 + _UPDATEWORKERCONFIGREQUEST._serialized_end = 50857 + _UPDATEWORKERCONFIGRESPONSE._serialized_start = 50859 + _UPDATEWORKERCONFIGRESPONSE._serialized_end = 50959 + _DESCRIBEWORKERREQUEST._serialized_start = 50961 + _DESCRIBEWORKERREQUEST._serialized_end = 51032 + _DESCRIBEWORKERRESPONSE._serialized_start = 51034 + _DESCRIBEWORKERRESPONSE._serialized_end = 51115 + _COUNTWORKERSREQUEST._serialized_start = 51117 + _COUNTWORKERSREQUEST._serialized_end = 51204 + _COUNTWORKERSRESPONSE._serialized_start = 51206 + _COUNTWORKERSRESPONSE._serialized_end = 51243 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51246 + _PAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51387 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51389 + _PAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51421 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_start = 51424 + _UNPAUSEWORKFLOWEXECUTIONREQUEST._serialized_end = 51567 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_start = 51569 + _UNPAUSEWORKFLOWEXECUTIONRESPONSE._serialized_end = 51603 + _STARTACTIVITYEXECUTIONREQUEST._serialized_start = 51606 + _STARTACTIVITYEXECUTIONREQUEST._serialized_end = 52783 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_start = 52785 + _STARTACTIVITYEXECUTIONRESPONSE._serialized_end = 52894 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_start = 52897 + _DESCRIBEACTIVITYEXECUTIONREQUEST._serialized_end = 53125 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_start = 53128 + _DESCRIBEACTIVITYEXECUTIONRESPONSE._serialized_end = 53444 + _POLLACTIVITYEXECUTIONREQUEST._serialized_start = 53446 + _POLLACTIVITYEXECUTIONREQUEST._serialized_end = 53532 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_start = 53534 + _POLLACTIVITYEXECUTIONRESPONSE._serialized_end = 53650 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_start = 53652 + _LISTACTIVITYEXECUTIONSREQUEST._serialized_end = 53761 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_start = 53764 + _LISTACTIVITYEXECUTIONSRESPONSE._serialized_end = 53894 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 53897 + _STARTNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 54935 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_start = 54885 + _STARTNEXUSOPERATIONEXECUTIONREQUEST_NEXUSHEADERENTRY._serialized_end = 54935 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 54937 + _STARTNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55008 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55011 + _DESCRIBENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55181 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55184 + _DESCRIBENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55571 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 55574 + _POLLNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 55735 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 55738 + _POLLNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 55999 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56001 + _LISTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56116 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56119 + _LISTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56258 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_start = 56260 + _COUNTACTIVITYEXECUTIONSREQUEST._serialized_end = 56326 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_start = 56329 + _COUNTACTIVITYEXECUTIONSRESPONSE._serialized_end = 56566 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21878 + _COUNTACTIVITYEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21966 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_start = 56568 + _COUNTNEXUSOPERATIONEXECUTIONSREQUEST._serialized_end = 56640 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_start = 56643 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE._serialized_end = 56892 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_start = 21878 + _COUNTNEXUSOPERATIONEXECUTIONSRESPONSE_AGGREGATIONGROUP._serialized_end = 21966 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_start = 56895 + _REQUESTCANCELACTIVITYEXECUTIONREQUEST._serialized_end = 57044 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_start = 57046 + _REQUESTCANCELACTIVITYEXECUTIONRESPONSE._serialized_end = 57086 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_start = 57089 + _TERMINATEACTIVITYEXECUTIONREQUEST._serialized_end = 57234 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_start = 57236 + _TERMINATEACTIVITYEXECUTIONRESPONSE._serialized_end = 57272 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_start = 57274 + _DELETEACTIVITYEXECUTIONREQUEST._serialized_end = 57362 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_start = 57364 + _DELETEACTIVITYEXECUTIONRESPONSE._serialized_end = 57397 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57400 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57556 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57558 + _REQUESTCANCELNEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57604 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57607 + _TERMINATENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57759 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57761 + _TERMINATENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57803 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_start = 57805 + _DELETENEXUSOPERATIONEXECUTIONREQUEST._serialized_end = 57900 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_start = 57902 + _DELETENEXUSOPERATIONEXECUTIONRESPONSE._serialized_end = 57941 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_start = 57944 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGREQUEST._serialized_end = 58101 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_start = 58104 + _POLLWORKFLOWEXECUTIONTIMESKIPPINGRESPONSE._serialized_end = 58336 # @@protoc_insertion_point(module_scope) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index fbc064b8b..700510d36 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit fbc064b8b7bf5b0a30b6b18ad94a3d026e14c93d +Subproject commit 700510d36d73b9a50c4fb223b8f88295737ad5ae From 0ddd6a208eb847543a3839ff6ec070a72da8f4f4 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Fri, 2 Oct 2026 19:44:03 -0700 Subject: [PATCH 830/831] Pinned Core at the union head with the execution fields on their original numbers. The previous shape was never released, so the fields keep the numbers the workflow fields had and nothing is reserved. --- temporalio/bridge/sdk-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temporalio/bridge/sdk-core b/temporalio/bridge/sdk-core index c017e35c5..08716165c 160000 --- a/temporalio/bridge/sdk-core +++ b/temporalio/bridge/sdk-core @@ -1 +1 @@ -Subproject commit c017e35c59f344cc3d9a91cdbc6df825e36539a5 +Subproject commit 08716165cb663e914373f0c65b3eba435f496356 From 0a95052f65f5744dbb31db71eef5a1fcbdbba4d2 Mon Sep 17 00:00:00 2001 From: Mohammad Dashti Date: Sat, 3 Oct 2026 05:47:43 -0700 Subject: [PATCH 831/831] Took the Nexus endpoint by name in the streams example. NexusStreams resolves the endpoint by name through the client, so the id the docs asked for failed the lookup. The docs also give --http as a full URL. --- examples/streams/run.py | 11 ++++++----- streams_demo/README.md | 10 +++++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/examples/streams/run.py b/examples/streams/run.py index a2820b7f1..ab21af954 100644 --- a/examples/streams/run.py +++ b/examples/streams/run.py @@ -3,14 +3,15 @@ python -m examples.streams.run workflow_streams python -m examples.streams.run redis --redis redis://127.0.0.1:6379 python -m examples.streams.run native --address 127.0.0.1:7333 - python -m examples.streams.run nexus --endpoint + python -m examples.streams.run nexus --endpoint streams-e2e \ + --http http://127.0.0.1:7243 The Nexus mode needs an endpoint that routes to the handler worker's task -queue, and the flag takes the endpoint's id, not its name:: +queue. The flag takes the endpoint's name, which the front resolves to its id +through the client, and ``--http`` is the server's HTTP address as a full URL:: temporal operator nexus endpoint create --name streams-e2e \ --target-task-queue streams-handlers-e2e - temporal operator nexus endpoint get --name streams-e2e -o json | jq -r .id The provider is registered once, on the client, and that is the only provider-specific line here. The workers inherit it, the Activity reaches its @@ -42,7 +43,7 @@ async def main() -> None: parser.add_argument( "--endpoint", default="", - help="nexus endpoint id, not its name; see streams_demo/README.md", + help="nexus endpoint name; see streams_demo/README.md", ) parser.add_argument("--http", default="http://127.0.0.1:7243") parser.add_argument( @@ -61,7 +62,7 @@ async def main() -> None: # Checked before any provider exists, so a missing flag is a usage error # rather than a traceback with a provider left open. if args.provider == "nexus" and not args.endpoint: - parser.error("nexus needs --endpoint ") + parser.error("nexus needs --endpoint ") store = args.behind if args.provider == "nexus" else args.provider provider = _setup.make_provider(store, args) diff --git a/streams_demo/README.md b/streams_demo/README.md index b21e98212..58faec26f 100644 --- a/streams_demo/README.md +++ b/streams_demo/README.md @@ -51,22 +51,22 @@ provider it is configured with. Workers still configure a storage provider, because workflow reads and writes ride the Workflow Task. ```python -front = NexusStreams(endpoint=endpoint_id) +front = NexusStreams(endpoint="streams-e2e") stream = front.get_stream_handle(client, workflow_id) producer = stream.producer(topic="inputs", producer_id="model", attempt=1) ``` -The endpoint has to exist and route to the handler worker's task queue, and -the provider takes its id rather than its name: +The endpoint has to exist and route to the handler worker's task queue. The +provider takes its name and resolves it to the id through the client: ```sh temporal operator nexus endpoint create --name streams-e2e \ --target-task-queue streams-handlers-e2e -temporal operator nexus endpoint get --name streams-e2e -o json | jq -r .id ``` See `tests/streams/test_nexus_provider.py` for the handler worker, and -`examples/streams/run.py nexus --endpoint ` for the whole loop behind it. +`examples/streams/run.py nexus --endpoint streams-e2e --http http://:` +for the whole loop behind it. The conformance suite runs the same expectations on every provider: `pytest tests/streams/` (memory and Workflow Streams on the test server), plus